From 68247cd7fc3b899527fc9512f68db8446cea3941 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=89tienne=20Mollier?= Date: Tue, 29 Nov 2022 21:55:48 +0100 Subject: [PATCH] Import python-pysam_0.20.0+ds.orig.tar.xz [dgit import orig python-pysam_0.20.0+ds.orig.tar.xz] --- .travis.disabled.yml | 114 + AUTHORS | 43 + COPYING | 21 + Containerfile | 13 + INSTALL | 102 + MANIFEST.in | 54 + NEWS | 850 + README.rst | 53 + bcftools/HMM.c | 509 + bcftools/HMM.c.pysam.c | 511 + bcftools/HMM.h | 138 + bcftools/LICENSE | 773 + bcftools/README | 27 + bcftools/abuf.c | 802 + bcftools/abuf.c.pysam.c | 804 + bcftools/abuf.h | 78 + bcftools/bam2bcf.c | 1232 + bcftools/bam2bcf.c.pysam.c | 1234 + bcftools/bam2bcf.h | 171 + bcftools/bam2bcf_indel.c | 947 + bcftools/bam2bcf_indel.c.pysam.c | 949 + bcftools/bam_sample.c | 398 + bcftools/bam_sample.c.pysam.c | 400 + bcftools/bam_sample.h | 50 + bcftools/bcftools.h | 143 + bcftools/bcftools.pysam.c | 83 + bcftools/bcftools.pysam.h | 74 + bcftools/bin.c | 106 + bcftools/bin.c.pysam.c | 108 + bcftools/bin.h | 65 + bcftools/call.h | 149 + bcftools/ccall.c | 338 + bcftools/ccall.c.pysam.c | 340 + bcftools/cols.c | 109 + bcftools/cols.c.pysam.c | 111 + bcftools/cols.h | 51 + bcftools/consensus.c | 1173 + bcftools/consensus.c.pysam.c | 1175 + bcftools/convert.c | 1709 + bcftools/convert.c.pysam.c | 1711 + bcftools/convert.h | 47 + bcftools/csq.c | 4395 + bcftools/csq.c.pysam.c | 4397 + bcftools/dbuf.h | 71 + bcftools/dist.c | 124 + bcftools/dist.c.pysam.c | 126 + bcftools/dist.h | 98 + bcftools/em.c | 259 + bcftools/em.c.pysam.c | 261 + bcftools/extsort.c | 250 + bcftools/extsort.c.pysam.c | 252 + bcftools/extsort.h | 56 + bcftools/filter.c | 3671 + bcftools/filter.c.pysam.c | 3673 + bcftools/filter.h | 64 + bcftools/gvcf.c | 227 + bcftools/gvcf.c.pysam.c | 229 + bcftools/gvcf.h | 41 + bcftools/hclust.c | 401 + bcftools/hclust.c.pysam.c | 403 + bcftools/hclust.h | 77 + bcftools/hex.h | 95 + bcftools/khash_str2str.h | 106 + bcftools/kheap.h | 174 + bcftools/kmin.c | 209 + bcftools/kmin.c.pysam.c | 211 + bcftools/kmin.h | 46 + bcftools/main.c | 310 + bcftools/main.c.pysam.c | 312 + bcftools/mcall.c | 1685 + bcftools/mcall.c.pysam.c | 1687 + bcftools/mpileup.c | 1558 + bcftools/mpileup.c.pysam.c | 1560 + bcftools/mw.h | 1944 + bcftools/ploidy.c | 268 + bcftools/ploidy.c.pysam.c | 270 + bcftools/ploidy.h | 129 + bcftools/prob1.c | 524 + bcftools/prob1.c.pysam.c | 526 + bcftools/prob1.h | 93 + bcftools/rbuf.h | 261 + bcftools/regidx.c | 650 + bcftools/regidx.c.pysam.c | 652 + bcftools/regidx.h | 222 + bcftools/reheader.c | 764 + bcftools/reheader.c.pysam.c | 766 + bcftools/smpl_ilist.c | 170 + bcftools/smpl_ilist.c.pysam.c | 172 + bcftools/smpl_ilist.h | 53 + bcftools/str_finder.c | 270 + bcftools/str_finder.c.pysam.c | 272 + bcftools/str_finder.h | 64 + bcftools/tabix.c | 131 + bcftools/tabix.c.pysam.c | 133 + bcftools/tsv2vcf.c | 135 + bcftools/tsv2vcf.c.pysam.c | 137 + bcftools/tsv2vcf.h | 86 + bcftools/utlist.h | 761 + bcftools/variantkey.h | 583 + bcftools/vcfannotate.c | 3524 + bcftools/vcfannotate.c.pysam.c | 3526 + bcftools/vcfbuf.c | 562 + bcftools/vcfbuf.c.pysam.c | 564 + bcftools/vcfbuf.h | 122 + bcftools/vcfcall.c | 1179 + bcftools/vcfcall.c.pysam.c | 1181 + bcftools/vcfcnv.c | 1438 + bcftools/vcfcnv.c.pysam.c | 1440 + bcftools/vcfconcat.c | 1062 + bcftools/vcfconcat.c.pysam.c | 1064 + bcftools/vcfconvert.c | 1677 + bcftools/vcfconvert.c.pysam.c | 1679 + bcftools/vcffilter.c | 722 + bcftools/vcffilter.c.pysam.c | 724 + bcftools/vcfgtcheck.c | 1277 + bcftools/vcfgtcheck.c.pysam.c | 1279 + bcftools/vcfhead.c | 133 + bcftools/vcfhead.c.pysam.c | 135 + bcftools/vcfindex.c | 334 + bcftools/vcfindex.c.pysam.c | 336 + bcftools/vcfisec.c | 652 + bcftools/vcfisec.c.pysam.c | 654 + bcftools/vcfmerge.c | 3330 + bcftools/vcfmerge.c.pysam.c | 3332 + bcftools/vcfnorm.c | 2295 + bcftools/vcfnorm.c.pysam.c | 2297 + bcftools/vcfplugin.c | 822 + bcftools/vcfplugin.c.pysam.c | 824 + bcftools/vcfquery.c | 447 + bcftools/vcfquery.c.pysam.c | 449 + bcftools/vcfroh.c | 1301 + bcftools/vcfroh.c.pysam.c | 1303 + bcftools/vcfsom.c | 718 + bcftools/vcfsom.c.pysam.c | 720 + bcftools/vcfsort.c | 443 + bcftools/vcfsort.c.pysam.c | 445 + bcftools/vcfstats.c | 1915 + bcftools/vcfstats.c.pysam.c | 1917 + bcftools/vcfview.c | 801 + bcftools/vcfview.c.pysam.c | 803 + bcftools/vcmp.c | 155 + bcftools/vcmp.c.pysam.c | 157 + bcftools/vcmp.h | 63 + bcftools/version.c | 109 + bcftools/version.c.pysam.c | 111 + bcftools/version.sh | 36 + cy_build.py | 90 + devtools/buildwheels.sh | 73 + devtools/conda-recipe/build.sh | 8 + devtools/conda-recipe/meta.yaml | 29 + devtools/import.py | 262 + devtools/install-CGAT-tools.sh | 282 + devtools/run_tests_travis.sh | 126 + doc/Makefile | 96 + doc/api.rst | 230 + doc/benchmarking.rst | 70 + doc/conf.py | 228 + doc/developer.rst | 80 + doc/faq.rst | 278 + doc/glossary.rst | 144 + doc/index.rst | 84 + doc/installation.rst | 108 + doc/make.bat | 112 + doc/release.rst | 841 + doc/usage.rst | 423 + import/pysam.c | 83 + import/pysam.h | 74 + .../BuildRead.pyx | 24 + .../PysamTestModule_link_pre_489/__init__.py | 3 + linker_tests/link_pre_489/cy_build.py | 86 + linker_tests/link_pre_489/setup.py | 28 + .../link_pre_489/tests/test_module.py | 15 + .../BuildRead.pyx | 24 + .../__init__.py | 3 + linker_tests/link_with_rpath/setup.py | 36 + .../link_with_rpath/tests/test_module.py | 15 + .../BuildRead.pyx | 24 + .../__init__.py | 3 + linker_tests/link_without_rpath/setup.py | 35 + .../link_without_rpath/tests/test_module.py | 15 + pysam/Pileup.py | 282 + pysam/VCF.py.obsolete | 1087 + pysam/__init__.py | 100 + pysam/alternatives.py.obsolete | 82 + pysam/bcftools.py | 29 + pysam/cbcftools_util.h | 6 + pysam/csamtools_util.h | 6 + pysam/htslib_util.c | 159 + pysam/htslib_util.h | 97 + pysam/include/__init__.py | 0 pysam/libcalignedsegment.pxd | 102 + pysam/libcalignedsegment.pyi | 222 + pysam/libcalignedsegment.pyx | 3409 + pysam/libcalignmentfile.pxd | 152 + pysam/libcalignmentfile.pyi | 237 + pysam/libcalignmentfile.pyx | 2988 + pysam/libcbcf.pxd | 143 + pysam/libcbcf.pyi | 369 + pysam/libcbcf.pyx | 4544 + pysam/libcbcftools.pxd | 8 + pysam/libcbcftools.pyi | 1 + pysam/libcbcftools.pyx | 2 + pysam/libcbgzf.pyi | 40 + pysam/libcbgzf.pyx | 238 + pysam/libcfaidx.pxd | 80 + pysam/libcfaidx.pyi | 68 + pysam/libcfaidx.pyx | 674 + pysam/libchtslib.pxd | 2693 + pysam/libchtslib.pyi | 115 + pysam/libchtslib.pyx | 723 + pysam/libcsamfile.pxd | 45 + pysam/libcsamfile.pyi | 5 + pysam/libcsamfile.pyx | 43 + pysam/libcsamtools.pxd | 8 + pysam/libcsamtools.pyi | 1 + pysam/libcsamtools.pyx | 2 + pysam/libctabix.pxd | 127 + pysam/libctabix.pyi | 103 + pysam/libctabix.pyx | 1302 + pysam/libctabixproxies.pxd | 65 + pysam/libctabixproxies.pyi | 62 + pysam/libctabixproxies.pyx | 836 + pysam/libcutils.pxd | 34 + pysam/libcutils.pyi | 28 + pysam/libcutils.pyx | 457 + pysam/libcvcf.pxd | 2 + pysam/libcvcf.pyi | 0 pysam/libcvcf.pyx | 1203 + pysam/py.typed | 0 pysam/pysam_stream.h | 13 + pysam/pysam_util.c | 36 + pysam/pysam_util.h | 5 + pysam/samtools.py | 55 + pysam/utils.py | 111 + pysam/version.h | 5 + pysam/version.py | 6 + pysam/version.pyi | 4 + requirements.txt | 1 + samtools/LICENSE | 33 + samtools/README | 126 + samtools/amplicon_stats.c | 1754 + samtools/amplicon_stats.c.pysam.c | 1756 + samtools/bam.c | 267 + samtools/bam.c.pysam.c | 269 + samtools/bam.h | 39 + samtools/bam2depth.c | 973 + samtools/bam2depth.c.pysam.c | 975 + samtools/bam_addrprg.c | 499 + samtools/bam_addrprg.c.pysam.c | 501 + samtools/bam_ampliconclip.c | 1078 + samtools/bam_ampliconclip.c.pysam.c | 1080 + samtools/bam_ampliconclip.h | 54 + samtools/bam_aux.c | 61 + samtools/bam_aux.c.pysam.c | 63 + samtools/bam_cat.c | 587 + samtools/bam_cat.c.pysam.c | 589 + samtools/bam_color.c | 173 + samtools/bam_color.c.pysam.c | 175 + samtools/bam_consensus.c | 1712 + samtools/bam_consensus.c.pysam.c | 1714 + samtools/bam_fastq.c | 885 + samtools/bam_fastq.c.pysam.c | 887 + samtools/bam_flags.c | 86 + samtools/bam_flags.c.pysam.c | 88 + samtools/bam_import.c | 503 + samtools/bam_import.c.pysam.c | 505 + samtools/bam_index.c | 280 + samtools/bam_index.c.pysam.c | 282 + samtools/bam_lpileup.c | 225 + samtools/bam_lpileup.c.pysam.c | 227 + samtools/bam_lpileup.h | 57 + samtools/bam_markdup.c | 2280 + samtools/bam_markdup.c.pysam.c | 2282 + samtools/bam_mate.c | 507 + samtools/bam_mate.c.pysam.c | 509 + samtools/bam_md.c | 418 + samtools/bam_md.c.pysam.c | 420 + samtools/bam_plbuf.c | 69 + samtools/bam_plbuf.c.pysam.c | 71 + samtools/bam_plbuf.h | 62 + samtools/bam_plcmd.c | 1189 + samtools/bam_plcmd.c.pysam.c | 1191 + samtools/bam_quickcheck.c | 190 + samtools/bam_quickcheck.c.pysam.c | 192 + samtools/bam_reheader.c | 629 + samtools/bam_reheader.c.pysam.c | 631 + samtools/bam_rmdup.c | 325 + samtools/bam_rmdup.c.pysam.c | 327 + samtools/bam_rmdupse.c | 230 + samtools/bam_rmdupse.c.pysam.c | 232 + samtools/bam_samples.c | 433 + samtools/bam_samples.c.pysam.c | 435 + samtools/bam_sort.c | 3263 + samtools/bam_sort.c.pysam.c | 3265 + samtools/bam_split.c | 611 + samtools/bam_split.c.pysam.c | 613 + samtools/bam_stat.c | 346 + samtools/bam_stat.c.pysam.c | 348 + samtools/bamshuf.c | 635 + samtools/bamshuf.c.pysam.c | 637 + samtools/bamtk.c | 301 + samtools/bamtk.c.pysam.c | 304 + samtools/bedcov.c | 298 + samtools/bedcov.c.pysam.c | 300 + samtools/bedidx.c | 637 + samtools/bedidx.c.pysam.c | 639 + samtools/bedidx.h | 45 + samtools/consensus_pileup.c | 595 + samtools/consensus_pileup.c.pysam.c | 597 + samtools/consensus_pileup.h | 79 + samtools/coverage.c | 683 + samtools/coverage.c.pysam.c | 685 + samtools/cut_target.c | 257 + samtools/cut_target.c.pysam.c | 259 + samtools/dict.c | 229 + samtools/dict.c.pysam.c | 231 + samtools/faidx.c | 415 + samtools/faidx.c.pysam.c | 417 + samtools/lz4/LICENSE | 24 + samtools/lz4/lz4.c | 1478 + samtools/lz4/lz4.c.pysam.c | 1480 + samtools/lz4/lz4.h | 463 + samtools/padding.c | 623 + samtools/padding.c.pysam.c | 625 + samtools/phase.c | 823 + samtools/phase.c.pysam.c | 825 + samtools/reference.c | 598 + samtools/reference.c.pysam.c | 600 + samtools/sam_opts.c | 194 + samtools/sam_opts.c.pysam.c | 196 + samtools/sam_opts.h | 104 + samtools/sam_utils.c | 151 + samtools/sam_utils.c.pysam.c | 153 + samtools/sam_view.c | 1596 + samtools/sam_view.c.pysam.c | 1598 + samtools/sample.c | 134 + samtools/sample.c.pysam.c | 136 + samtools/sample.h | 41 + samtools/samtools.h | 62 + samtools/samtools.pysam.c | 83 + samtools/samtools.pysam.h | 74 + samtools/splaysort.h | 200 + samtools/stats.c | 2578 + samtools/stats.c.pysam.c | 2580 + samtools/stats_isize.c | 239 + samtools/stats_isize.c.pysam.c | 241 + samtools/stats_isize.h | 83 + samtools/tmp_file.c | 438 + samtools/tmp_file.c.pysam.c | 440 + samtools/tmp_file.h | 124 + samtools/version.sh | 36 + setup.cfg | 43 + setup.py | 631 + tests/00README.txt | 23 + tests/AlignedSegment_bench.py | 30 + tests/AlignedSegment_test.py | 1766 + tests/AlignmentFileFetchTestUtils.py | 87 + tests/AlignmentFileFetch_bench.py | 97 + tests/AlignmentFileHeader_test.py | 328 + tests/AlignmentFilePileup_bench.py | 145 + tests/AlignmentFilePileup_test.py | 405 + tests/AlignmentFile_bench.py | 60 + tests/AlignmentFile_test.py | 2431 + tests/PileupTestUtils.py | 161 + tests/StreamFiledescriptors_test.py | 93 + tests/TestUtils.py | 294 + tests/VariantFileFetchTestUtils.py | 67 + tests/VariantFile_bench.py | 57 + tests/VariantFile_test.py | 703 + tests/VariantRecord_test.py | 95 + tests/_compile_test.pyx | 29 + tests/_compile_test.pyxbld | 8 + tests/_cython_flagstat.pyx | 18 + tests/_cython_flagstat.pyxbld | 8 + tests/cbcf_data/Makefile | 25 + tests/cbcf_data/example_empty.vcf | 0 tests/cbcf_data/example_vcf40.vcf | 24 + tests/cbcf_data/example_vcf42.vcf | 24 + tests/cbcf_data/example_vcf42_only_header.vcf | 19 + tests/cbcf_data/example_vcf42_withcontigs.vcf | 27 + tests/cbcf_data/example_vcf43.vcf | 24 + tests/cbcf_data/example_vcf43_with_utf8.vcf | 27 + tests/cbcf_data/gnomad.vcf | 200 + tests/cbcf_data/gnomad_fixed.vcf | 200 + tests/cbcf_data/missing_genotypes.vcf | 6 + tests/compile_test.py | 54 + tests/faidx_bench.py | 71 + tests/faidx_test.py | 344 + tests/linking_test.py | 92 + .../pysam_data/0example_no_seq_in_header.bam | Bin 0 -> 953 bytes .../0example_no_seq_in_header_null_bytes.bam | Bin 0 -> 954 bytes tests/pysam_data/MM-chebi.sam | 2 + tests/pysam_data/MM-double.sam | 3 + tests/pysam_data/MM-multi.sam | 7 + tests/pysam_data/MM-orient.sam | 6 + tests/pysam_data/Makefile | 113 + tests/pysam_data/ex1.bed | 2 + tests/pysam_data/ex1.fa | 56 + tests/pysam_data/ex1.sam.gz | Bin 0 -> 109698 bytes tests/pysam_data/ex1.vcf.gz | Bin 0 -> 16982 bytes tests/pysam_data/ex1.vcf.gz.tbi | Bin 0 -> 5636 bytes tests/pysam_data/ex10.sam | 16 + tests/pysam_data/ex3.sam | 13 + tests/pysam_data/ex4.sam | 9 + tests/pysam_data/ex5.sam | 5 + tests/pysam_data/ex6.sam | 5 + tests/pysam_data/ex7.sam.donottest | 2 + tests/pysam_data/ex8.sam | 3 + tests/pysam_data/ex9_fail.sam | 1022 + tests/pysam_data/ex9_nofail.sam | 1021 + tests/pysam_data/ex_spliced.sam | 297 + tests/pysam_data/example_aligned_pairs.sam | 81 + tests/pysam_data/example_btag.sam | 6 + tests/pysam_data/example_dash_in_chr.sam | 7 + tests/pysam_data/example_empty_header.sam | 321 + .../pysam_data/example_empty_with_header.sam | 1 + .../pysam_data/example_reverse_complement.sam | 28 + .../example_unmapped_reads_no_sq.sam | 3 + tests/pysam_data/faidx_empty_seq.fq | 40 + tests/pysam_data/faidx_ex1.fa | 6540 + tests/pysam_data/faidx_ex1.fq | 13080 ++ tests/pysam_data/issue100.sam | 27 + tests/pysam_data/rg_with_tab.sam | 3273 + tests/pysam_data/softclip.sam | 6 + tests/pysam_data/tag_bug.sam | 16 + tests/pysam_data/test.gtf | 10 + tests/pysam_data/test.gtf.gz | Bin 0 -> 311 bytes tests/pysam_data/test_mapped_unmapped.sam | 28 + tests/pysam_data/test_query_position.sam | 9 + tests/pysam_data/test_unaligned.sam | 6 + tests/refactoring.pl | 60 + tests/refactoring.txt | 198 + tests/samtools_test.py | 425 + tests/tabix_bench.py | 180 + tests/tabix_data/Makefile | 40 + tests/tabix_data/empty.bed.gz | Bin 0 -> 28 bytes tests/tabix_data/example.bed | 164 + tests/tabix_data/example.gff2.gz | Bin 0 -> 238 bytes tests/tabix_data/example.gff3.gz | Bin 0 -> 3067 bytes tests/tabix_data/example.gtf.gz | Bin 0 -> 3778 bytes tests/tabix_data/example.gtf.gz.tbi | Bin 0 -> 196 bytes tests/tabix_data/example.sam.gz | Bin 0 -> 398 bytes tests/tabix_data/example.vcf.gz | Bin 0 -> 328 bytes tests/tabix_data/example.vcf40 | 23 + tests/tabix_data/example_0v23.bed.gz | Bin 0 -> 819 bytes tests/tabix_data/example_0v23.bed.gz.tbi | Bin 0 -> 244 bytes tests/tabix_data/example_0v23.vcf.gz | Bin 0 -> 328 bytes tests/tabix_data/example_0v23.vcf.gz.tbi | Bin 0 -> 155 bytes tests/tabix_data/example_0v26.bed.gz | Bin 0 -> 819 bytes tests/tabix_data/example_0v26.bed.gz.tbi | Bin 0 -> 244 bytes tests/tabix_data/example_0v26.vcf.gz | Bin 0 -> 328 bytes tests/tabix_data/example_0v26.vcf.gz.tbi | Bin 0 -> 155 bytes tests/tabix_data/example_badcomments.bed.gz | Bin 0 -> 879 bytes tests/tabix_data/example_badcomments.gtf.gz | Bin 0 -> 3825 bytes tests/tabix_data/example_badcomments.sam.gz | Bin 0 -> 398 bytes tests/tabix_data/example_badcomments.vcf.gz | Bin 0 -> 753 bytes tests/tabix_data/example_comments.bed.gz | Bin 0 -> 849 bytes tests/tabix_data/example_comments.gtf.gz | Bin 0 -> 3792 bytes tests/tabix_data/example_comments.sam.gz | Bin 0 -> 398 bytes tests/tabix_data/example_comments.vcf.gz | Bin 0 -> 753 bytes tests/tabix_data/example_large.bed | 100000 +++++++++++++++ tests/tabix_data/example_large.bed.gz | Bin 0 -> 459587 bytes tests/tabix_data/example_unicode.vcf | 23 + tests/tabix_data/fivecolumns.bed | 4 + tests/tabix_data/gtf_toofew_fields.gtf.gz | Bin 0 -> 400 bytes tests/tabix_data/gtf_toomany_fields.gtf.gz | Bin 0 -> 400 bytes tests/tabix_data/gtf_wrong_fields.gtf.gz | Bin 0 -> 400 bytes tests/tabix_data/vcf/10.vcf | 84 + tests/tabix_data/vcf/11.vcf | 216 + tests/tabix_data/vcf/12.vcf | 1000 + tests/tabix_data/vcf/13.vcf | 220 + tests/tabix_data/vcf/15.vcf | 317 + tests/tabix_data/vcf/16.vcf | 369 + tests/tabix_data/vcf/18.vcf | 1000 + tests/tabix_data/vcf/2.vcf | 334 + tests/tabix_data/vcf/20.vcf | 307 + tests/tabix_data/vcf/21.vcf | 310 + tests/tabix_data/vcf/22.vcf | 1000 + tests/tabix_data/vcf/23.vcf | 419 + tests/tabix_data/vcf/24.vcf | 724 + tests/tabix_data/vcf/3.vcf | 1000 + tests/tabix_data/vcf/4.vcf | 318 + tests/tabix_data/vcf/5.vcf | 1000 + tests/tabix_data/vcf/6.vcf | 278 + tests/tabix_data/vcf/7.vcf | 317 + tests/tabix_data/vcf/8.vcf | 84 + tests/tabix_data/vcf/9.vcf | 1000 + tests/tabix_data/vcf/README.txt | 11 + tests/tabix_data/vcf/issue85.vcf | 26 + tests/tabix_data/vcf/vcf_v42.vcf | 25 + tests/tabix_test.py | 1245 + tests/tabixproxies_test.py | 398 + tests/test_samtools_python.py | 50 + 493 files changed, 346916 insertions(+) create mode 100644 .travis.disabled.yml create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 Containerfile create mode 100644 INSTALL create mode 100644 MANIFEST.in create mode 100644 NEWS create mode 100644 README.rst create mode 100644 bcftools/HMM.c create mode 100644 bcftools/HMM.c.pysam.c create mode 100644 bcftools/HMM.h create mode 100644 bcftools/LICENSE create mode 100644 bcftools/README create mode 100644 bcftools/abuf.c create mode 100644 bcftools/abuf.c.pysam.c create mode 100644 bcftools/abuf.h create mode 100644 bcftools/bam2bcf.c create mode 100644 bcftools/bam2bcf.c.pysam.c create mode 100644 bcftools/bam2bcf.h create mode 100644 bcftools/bam2bcf_indel.c create mode 100644 bcftools/bam2bcf_indel.c.pysam.c create mode 100644 bcftools/bam_sample.c create mode 100644 bcftools/bam_sample.c.pysam.c create mode 100644 bcftools/bam_sample.h create mode 100644 bcftools/bcftools.h create mode 100644 bcftools/bcftools.pysam.c create mode 100644 bcftools/bcftools.pysam.h create mode 100644 bcftools/bin.c create mode 100644 bcftools/bin.c.pysam.c create mode 100644 bcftools/bin.h create mode 100644 bcftools/call.h create mode 100644 bcftools/ccall.c create mode 100644 bcftools/ccall.c.pysam.c create mode 100644 bcftools/cols.c create mode 100644 bcftools/cols.c.pysam.c create mode 100644 bcftools/cols.h create mode 100644 bcftools/consensus.c create mode 100644 bcftools/consensus.c.pysam.c create mode 100644 bcftools/convert.c create mode 100644 bcftools/convert.c.pysam.c create mode 100644 bcftools/convert.h create mode 100644 bcftools/csq.c create mode 100644 bcftools/csq.c.pysam.c create mode 100644 bcftools/dbuf.h create mode 100644 bcftools/dist.c create mode 100644 bcftools/dist.c.pysam.c create mode 100644 bcftools/dist.h create mode 100644 bcftools/em.c create mode 100644 bcftools/em.c.pysam.c create mode 100644 bcftools/extsort.c create mode 100644 bcftools/extsort.c.pysam.c create mode 100644 bcftools/extsort.h create mode 100644 bcftools/filter.c create mode 100644 bcftools/filter.c.pysam.c create mode 100644 bcftools/filter.h create mode 100644 bcftools/gvcf.c create mode 100644 bcftools/gvcf.c.pysam.c create mode 100644 bcftools/gvcf.h create mode 100644 bcftools/hclust.c create mode 100644 bcftools/hclust.c.pysam.c create mode 100644 bcftools/hclust.h create mode 100644 bcftools/hex.h create mode 100644 bcftools/khash_str2str.h create mode 100644 bcftools/kheap.h create mode 100644 bcftools/kmin.c create mode 100644 bcftools/kmin.c.pysam.c create mode 100644 bcftools/kmin.h create mode 100644 bcftools/main.c create mode 100644 bcftools/main.c.pysam.c create mode 100644 bcftools/mcall.c create mode 100644 bcftools/mcall.c.pysam.c create mode 100644 bcftools/mpileup.c create mode 100644 bcftools/mpileup.c.pysam.c create mode 100644 bcftools/mw.h create mode 100644 bcftools/ploidy.c create mode 100644 bcftools/ploidy.c.pysam.c create mode 100644 bcftools/ploidy.h create mode 100644 bcftools/prob1.c create mode 100644 bcftools/prob1.c.pysam.c create mode 100644 bcftools/prob1.h create mode 100644 bcftools/rbuf.h create mode 100644 bcftools/regidx.c create mode 100644 bcftools/regidx.c.pysam.c create mode 100644 bcftools/regidx.h create mode 100644 bcftools/reheader.c create mode 100644 bcftools/reheader.c.pysam.c create mode 100644 bcftools/smpl_ilist.c create mode 100644 bcftools/smpl_ilist.c.pysam.c create mode 100644 bcftools/smpl_ilist.h create mode 100644 bcftools/str_finder.c create mode 100644 bcftools/str_finder.c.pysam.c create mode 100644 bcftools/str_finder.h create mode 100644 bcftools/tabix.c create mode 100644 bcftools/tabix.c.pysam.c create mode 100644 bcftools/tsv2vcf.c create mode 100644 bcftools/tsv2vcf.c.pysam.c create mode 100644 bcftools/tsv2vcf.h create mode 100644 bcftools/utlist.h create mode 100644 bcftools/variantkey.h create mode 100644 bcftools/vcfannotate.c create mode 100644 bcftools/vcfannotate.c.pysam.c create mode 100644 bcftools/vcfbuf.c create mode 100644 bcftools/vcfbuf.c.pysam.c create mode 100644 bcftools/vcfbuf.h create mode 100644 bcftools/vcfcall.c create mode 100644 bcftools/vcfcall.c.pysam.c create mode 100644 bcftools/vcfcnv.c create mode 100644 bcftools/vcfcnv.c.pysam.c create mode 100644 bcftools/vcfconcat.c create mode 100644 bcftools/vcfconcat.c.pysam.c create mode 100644 bcftools/vcfconvert.c create mode 100644 bcftools/vcfconvert.c.pysam.c create mode 100644 bcftools/vcffilter.c create mode 100644 bcftools/vcffilter.c.pysam.c create mode 100644 bcftools/vcfgtcheck.c create mode 100644 bcftools/vcfgtcheck.c.pysam.c create mode 100644 bcftools/vcfhead.c create mode 100644 bcftools/vcfhead.c.pysam.c create mode 100644 bcftools/vcfindex.c create mode 100644 bcftools/vcfindex.c.pysam.c create mode 100644 bcftools/vcfisec.c create mode 100644 bcftools/vcfisec.c.pysam.c create mode 100644 bcftools/vcfmerge.c create mode 100644 bcftools/vcfmerge.c.pysam.c create mode 100644 bcftools/vcfnorm.c create mode 100644 bcftools/vcfnorm.c.pysam.c create mode 100644 bcftools/vcfplugin.c create mode 100644 bcftools/vcfplugin.c.pysam.c create mode 100644 bcftools/vcfquery.c create mode 100644 bcftools/vcfquery.c.pysam.c create mode 100644 bcftools/vcfroh.c create mode 100644 bcftools/vcfroh.c.pysam.c create mode 100644 bcftools/vcfsom.c create mode 100644 bcftools/vcfsom.c.pysam.c create mode 100644 bcftools/vcfsort.c create mode 100644 bcftools/vcfsort.c.pysam.c create mode 100644 bcftools/vcfstats.c create mode 100644 bcftools/vcfstats.c.pysam.c create mode 100644 bcftools/vcfview.c create mode 100644 bcftools/vcfview.c.pysam.c create mode 100644 bcftools/vcmp.c create mode 100644 bcftools/vcmp.c.pysam.c create mode 100644 bcftools/vcmp.h create mode 100644 bcftools/version.c create mode 100644 bcftools/version.c.pysam.c create mode 100755 bcftools/version.sh create mode 100644 cy_build.py create mode 100755 devtools/buildwheels.sh create mode 100644 devtools/conda-recipe/build.sh create mode 100644 devtools/conda-recipe/meta.yaml create mode 100644 devtools/import.py create mode 100755 devtools/install-CGAT-tools.sh create mode 100755 devtools/run_tests_travis.sh create mode 100644 doc/Makefile create mode 100644 doc/api.rst create mode 100644 doc/benchmarking.rst create mode 100644 doc/conf.py create mode 100644 doc/developer.rst create mode 100644 doc/faq.rst create mode 100644 doc/glossary.rst create mode 100644 doc/index.rst create mode 100644 doc/installation.rst create mode 100644 doc/make.bat create mode 100644 doc/release.rst create mode 100644 doc/usage.rst create mode 100644 import/pysam.c create mode 100644 import/pysam.h create mode 100644 linker_tests/link_pre_489/PysamTestModule_link_pre_489/BuildRead.pyx create mode 100644 linker_tests/link_pre_489/PysamTestModule_link_pre_489/__init__.py create mode 100644 linker_tests/link_pre_489/cy_build.py create mode 100644 linker_tests/link_pre_489/setup.py create mode 100644 linker_tests/link_pre_489/tests/test_module.py create mode 100644 linker_tests/link_with_rpath/PysamTestModule_link_with_rpath/BuildRead.pyx create mode 100644 linker_tests/link_with_rpath/PysamTestModule_link_with_rpath/__init__.py create mode 100644 linker_tests/link_with_rpath/setup.py create mode 100644 linker_tests/link_with_rpath/tests/test_module.py create mode 100644 linker_tests/link_without_rpath/PysamTestModule_link_without_rpath/BuildRead.pyx create mode 100644 linker_tests/link_without_rpath/PysamTestModule_link_without_rpath/__init__.py create mode 100644 linker_tests/link_without_rpath/setup.py create mode 100644 linker_tests/link_without_rpath/tests/test_module.py create mode 100644 pysam/Pileup.py create mode 100644 pysam/VCF.py.obsolete create mode 100644 pysam/__init__.py create mode 100644 pysam/alternatives.py.obsolete create mode 100644 pysam/bcftools.py create mode 100644 pysam/cbcftools_util.h create mode 100644 pysam/csamtools_util.h create mode 100644 pysam/htslib_util.c create mode 100644 pysam/htslib_util.h create mode 100644 pysam/include/__init__.py create mode 100644 pysam/libcalignedsegment.pxd create mode 100644 pysam/libcalignedsegment.pyi create mode 100644 pysam/libcalignedsegment.pyx create mode 100644 pysam/libcalignmentfile.pxd create mode 100644 pysam/libcalignmentfile.pyi create mode 100644 pysam/libcalignmentfile.pyx create mode 100644 pysam/libcbcf.pxd create mode 100644 pysam/libcbcf.pyi create mode 100644 pysam/libcbcf.pyx create mode 100644 pysam/libcbcftools.pxd create mode 100644 pysam/libcbcftools.pyi create mode 100644 pysam/libcbcftools.pyx create mode 100644 pysam/libcbgzf.pyi create mode 100644 pysam/libcbgzf.pyx create mode 100644 pysam/libcfaidx.pxd create mode 100644 pysam/libcfaidx.pyi create mode 100644 pysam/libcfaidx.pyx create mode 100644 pysam/libchtslib.pxd create mode 100644 pysam/libchtslib.pyi create mode 100644 pysam/libchtslib.pyx create mode 100644 pysam/libcsamfile.pxd create mode 100644 pysam/libcsamfile.pyi create mode 100644 pysam/libcsamfile.pyx create mode 100644 pysam/libcsamtools.pxd create mode 100644 pysam/libcsamtools.pyi create mode 100644 pysam/libcsamtools.pyx create mode 100644 pysam/libctabix.pxd create mode 100644 pysam/libctabix.pyi create mode 100644 pysam/libctabix.pyx create mode 100644 pysam/libctabixproxies.pxd create mode 100644 pysam/libctabixproxies.pyi create mode 100644 pysam/libctabixproxies.pyx create mode 100644 pysam/libcutils.pxd create mode 100644 pysam/libcutils.pyi create mode 100644 pysam/libcutils.pyx create mode 100644 pysam/libcvcf.pxd create mode 100644 pysam/libcvcf.pyi create mode 100644 pysam/libcvcf.pyx create mode 100644 pysam/py.typed create mode 100644 pysam/pysam_stream.h create mode 100644 pysam/pysam_util.c create mode 100644 pysam/pysam_util.h create mode 100644 pysam/samtools.py create mode 100644 pysam/utils.py create mode 100644 pysam/version.h create mode 100644 pysam/version.py create mode 100644 pysam/version.pyi create mode 100644 requirements.txt create mode 100644 samtools/LICENSE create mode 100644 samtools/README create mode 100644 samtools/amplicon_stats.c create mode 100644 samtools/amplicon_stats.c.pysam.c create mode 100644 samtools/bam.c create mode 100644 samtools/bam.c.pysam.c create mode 100644 samtools/bam.h create mode 100644 samtools/bam2depth.c create mode 100644 samtools/bam2depth.c.pysam.c create mode 100644 samtools/bam_addrprg.c create mode 100644 samtools/bam_addrprg.c.pysam.c create mode 100644 samtools/bam_ampliconclip.c create mode 100644 samtools/bam_ampliconclip.c.pysam.c create mode 100644 samtools/bam_ampliconclip.h create mode 100644 samtools/bam_aux.c create mode 100644 samtools/bam_aux.c.pysam.c create mode 100644 samtools/bam_cat.c create mode 100644 samtools/bam_cat.c.pysam.c create mode 100644 samtools/bam_color.c create mode 100644 samtools/bam_color.c.pysam.c create mode 100644 samtools/bam_consensus.c create mode 100644 samtools/bam_consensus.c.pysam.c create mode 100644 samtools/bam_fastq.c create mode 100644 samtools/bam_fastq.c.pysam.c create mode 100644 samtools/bam_flags.c create mode 100644 samtools/bam_flags.c.pysam.c create mode 100644 samtools/bam_import.c create mode 100644 samtools/bam_import.c.pysam.c create mode 100644 samtools/bam_index.c create mode 100644 samtools/bam_index.c.pysam.c create mode 100644 samtools/bam_lpileup.c create mode 100644 samtools/bam_lpileup.c.pysam.c create mode 100644 samtools/bam_lpileup.h create mode 100644 samtools/bam_markdup.c create mode 100644 samtools/bam_markdup.c.pysam.c create mode 100644 samtools/bam_mate.c create mode 100644 samtools/bam_mate.c.pysam.c create mode 100644 samtools/bam_md.c create mode 100644 samtools/bam_md.c.pysam.c create mode 100644 samtools/bam_plbuf.c create mode 100644 samtools/bam_plbuf.c.pysam.c create mode 100644 samtools/bam_plbuf.h create mode 100644 samtools/bam_plcmd.c create mode 100644 samtools/bam_plcmd.c.pysam.c create mode 100644 samtools/bam_quickcheck.c create mode 100644 samtools/bam_quickcheck.c.pysam.c create mode 100644 samtools/bam_reheader.c create mode 100644 samtools/bam_reheader.c.pysam.c create mode 100644 samtools/bam_rmdup.c create mode 100644 samtools/bam_rmdup.c.pysam.c create mode 100644 samtools/bam_rmdupse.c create mode 100644 samtools/bam_rmdupse.c.pysam.c create mode 100644 samtools/bam_samples.c create mode 100644 samtools/bam_samples.c.pysam.c create mode 100644 samtools/bam_sort.c create mode 100644 samtools/bam_sort.c.pysam.c create mode 100644 samtools/bam_split.c create mode 100644 samtools/bam_split.c.pysam.c create mode 100644 samtools/bam_stat.c create mode 100644 samtools/bam_stat.c.pysam.c create mode 100644 samtools/bamshuf.c create mode 100644 samtools/bamshuf.c.pysam.c create mode 100644 samtools/bamtk.c create mode 100644 samtools/bamtk.c.pysam.c create mode 100644 samtools/bedcov.c create mode 100644 samtools/bedcov.c.pysam.c create mode 100644 samtools/bedidx.c create mode 100644 samtools/bedidx.c.pysam.c create mode 100644 samtools/bedidx.h create mode 100644 samtools/consensus_pileup.c create mode 100644 samtools/consensus_pileup.c.pysam.c create mode 100644 samtools/consensus_pileup.h create mode 100644 samtools/coverage.c create mode 100644 samtools/coverage.c.pysam.c create mode 100644 samtools/cut_target.c create mode 100644 samtools/cut_target.c.pysam.c create mode 100644 samtools/dict.c create mode 100644 samtools/dict.c.pysam.c create mode 100644 samtools/faidx.c create mode 100644 samtools/faidx.c.pysam.c create mode 100644 samtools/lz4/LICENSE create mode 100644 samtools/lz4/lz4.c create mode 100644 samtools/lz4/lz4.c.pysam.c create mode 100644 samtools/lz4/lz4.h create mode 100644 samtools/padding.c create mode 100644 samtools/padding.c.pysam.c create mode 100644 samtools/phase.c create mode 100644 samtools/phase.c.pysam.c create mode 100644 samtools/reference.c create mode 100644 samtools/reference.c.pysam.c create mode 100644 samtools/sam_opts.c create mode 100644 samtools/sam_opts.c.pysam.c create mode 100644 samtools/sam_opts.h create mode 100644 samtools/sam_utils.c create mode 100644 samtools/sam_utils.c.pysam.c create mode 100644 samtools/sam_view.c create mode 100644 samtools/sam_view.c.pysam.c create mode 100644 samtools/sample.c create mode 100644 samtools/sample.c.pysam.c create mode 100644 samtools/sample.h create mode 100644 samtools/samtools.h create mode 100644 samtools/samtools.pysam.c create mode 100644 samtools/samtools.pysam.h create mode 100644 samtools/splaysort.h create mode 100644 samtools/stats.c create mode 100644 samtools/stats.c.pysam.c create mode 100644 samtools/stats_isize.c create mode 100644 samtools/stats_isize.c.pysam.c create mode 100644 samtools/stats_isize.h create mode 100644 samtools/tmp_file.c create mode 100644 samtools/tmp_file.c.pysam.c create mode 100644 samtools/tmp_file.h create mode 100755 samtools/version.sh create mode 100644 setup.cfg create mode 100644 setup.py create mode 100644 tests/00README.txt create mode 100644 tests/AlignedSegment_bench.py create mode 100644 tests/AlignedSegment_test.py create mode 100644 tests/AlignmentFileFetchTestUtils.py create mode 100644 tests/AlignmentFileFetch_bench.py create mode 100644 tests/AlignmentFileHeader_test.py create mode 100644 tests/AlignmentFilePileup_bench.py create mode 100644 tests/AlignmentFilePileup_test.py create mode 100644 tests/AlignmentFile_bench.py create mode 100644 tests/AlignmentFile_test.py create mode 100644 tests/PileupTestUtils.py create mode 100644 tests/StreamFiledescriptors_test.py create mode 100644 tests/TestUtils.py create mode 100644 tests/VariantFileFetchTestUtils.py create mode 100644 tests/VariantFile_bench.py create mode 100644 tests/VariantFile_test.py create mode 100644 tests/VariantRecord_test.py create mode 100644 tests/_compile_test.pyx create mode 100644 tests/_compile_test.pyxbld create mode 100644 tests/_cython_flagstat.pyx create mode 100644 tests/_cython_flagstat.pyxbld create mode 100644 tests/cbcf_data/Makefile create mode 100644 tests/cbcf_data/example_empty.vcf create mode 100644 tests/cbcf_data/example_vcf40.vcf create mode 100644 tests/cbcf_data/example_vcf42.vcf create mode 100644 tests/cbcf_data/example_vcf42_only_header.vcf create mode 100644 tests/cbcf_data/example_vcf42_withcontigs.vcf create mode 100644 tests/cbcf_data/example_vcf43.vcf create mode 100644 tests/cbcf_data/example_vcf43_with_utf8.vcf create mode 100644 tests/cbcf_data/gnomad.vcf create mode 100644 tests/cbcf_data/gnomad_fixed.vcf create mode 100644 tests/cbcf_data/missing_genotypes.vcf create mode 100644 tests/compile_test.py create mode 100644 tests/faidx_bench.py create mode 100644 tests/faidx_test.py create mode 100644 tests/linking_test.py create mode 100644 tests/pysam_data/0example_no_seq_in_header.bam create mode 100644 tests/pysam_data/0example_no_seq_in_header_null_bytes.bam create mode 100644 tests/pysam_data/MM-chebi.sam create mode 100644 tests/pysam_data/MM-double.sam create mode 100644 tests/pysam_data/MM-multi.sam create mode 100644 tests/pysam_data/MM-orient.sam create mode 100644 tests/pysam_data/Makefile create mode 100644 tests/pysam_data/ex1.bed create mode 100644 tests/pysam_data/ex1.fa create mode 100644 tests/pysam_data/ex1.sam.gz create mode 100644 tests/pysam_data/ex1.vcf.gz create mode 100644 tests/pysam_data/ex1.vcf.gz.tbi create mode 100644 tests/pysam_data/ex10.sam create mode 100644 tests/pysam_data/ex3.sam create mode 100644 tests/pysam_data/ex4.sam create mode 100644 tests/pysam_data/ex5.sam create mode 100644 tests/pysam_data/ex6.sam create mode 100644 tests/pysam_data/ex7.sam.donottest create mode 100644 tests/pysam_data/ex8.sam create mode 100644 tests/pysam_data/ex9_fail.sam create mode 100644 tests/pysam_data/ex9_nofail.sam create mode 100644 tests/pysam_data/ex_spliced.sam create mode 100644 tests/pysam_data/example_aligned_pairs.sam create mode 100644 tests/pysam_data/example_btag.sam create mode 100644 tests/pysam_data/example_dash_in_chr.sam create mode 100644 tests/pysam_data/example_empty_header.sam create mode 100644 tests/pysam_data/example_empty_with_header.sam create mode 100644 tests/pysam_data/example_reverse_complement.sam create mode 100644 tests/pysam_data/example_unmapped_reads_no_sq.sam create mode 100644 tests/pysam_data/faidx_empty_seq.fq create mode 100644 tests/pysam_data/faidx_ex1.fa create mode 100644 tests/pysam_data/faidx_ex1.fq create mode 100644 tests/pysam_data/issue100.sam create mode 100644 tests/pysam_data/rg_with_tab.sam create mode 100644 tests/pysam_data/softclip.sam create mode 100644 tests/pysam_data/tag_bug.sam create mode 100644 tests/pysam_data/test.gtf create mode 100644 tests/pysam_data/test.gtf.gz create mode 100644 tests/pysam_data/test_mapped_unmapped.sam create mode 100644 tests/pysam_data/test_query_position.sam create mode 100644 tests/pysam_data/test_unaligned.sam create mode 100644 tests/refactoring.pl create mode 100644 tests/refactoring.txt create mode 100644 tests/samtools_test.py create mode 100644 tests/tabix_bench.py create mode 100644 tests/tabix_data/Makefile create mode 100644 tests/tabix_data/empty.bed.gz create mode 100644 tests/tabix_data/example.bed create mode 100644 tests/tabix_data/example.gff2.gz create mode 100644 tests/tabix_data/example.gff3.gz create mode 100644 tests/tabix_data/example.gtf.gz create mode 100644 tests/tabix_data/example.gtf.gz.tbi create mode 100644 tests/tabix_data/example.sam.gz create mode 100644 tests/tabix_data/example.vcf.gz create mode 100644 tests/tabix_data/example.vcf40 create mode 100644 tests/tabix_data/example_0v23.bed.gz create mode 100644 tests/tabix_data/example_0v23.bed.gz.tbi create mode 100644 tests/tabix_data/example_0v23.vcf.gz create mode 100644 tests/tabix_data/example_0v23.vcf.gz.tbi create mode 100644 tests/tabix_data/example_0v26.bed.gz create mode 100644 tests/tabix_data/example_0v26.bed.gz.tbi create mode 100644 tests/tabix_data/example_0v26.vcf.gz create mode 100644 tests/tabix_data/example_0v26.vcf.gz.tbi create mode 100644 tests/tabix_data/example_badcomments.bed.gz create mode 100644 tests/tabix_data/example_badcomments.gtf.gz create mode 100644 tests/tabix_data/example_badcomments.sam.gz create mode 100644 tests/tabix_data/example_badcomments.vcf.gz create mode 100644 tests/tabix_data/example_comments.bed.gz create mode 100644 tests/tabix_data/example_comments.gtf.gz create mode 100644 tests/tabix_data/example_comments.sam.gz create mode 100644 tests/tabix_data/example_comments.vcf.gz create mode 100644 tests/tabix_data/example_large.bed create mode 100644 tests/tabix_data/example_large.bed.gz create mode 100644 tests/tabix_data/example_unicode.vcf create mode 100644 tests/tabix_data/fivecolumns.bed create mode 100644 tests/tabix_data/gtf_toofew_fields.gtf.gz create mode 100644 tests/tabix_data/gtf_toomany_fields.gtf.gz create mode 100644 tests/tabix_data/gtf_wrong_fields.gtf.gz create mode 100644 tests/tabix_data/vcf/10.vcf create mode 100644 tests/tabix_data/vcf/11.vcf create mode 100644 tests/tabix_data/vcf/12.vcf create mode 100644 tests/tabix_data/vcf/13.vcf create mode 100644 tests/tabix_data/vcf/15.vcf create mode 100644 tests/tabix_data/vcf/16.vcf create mode 100644 tests/tabix_data/vcf/18.vcf create mode 100644 tests/tabix_data/vcf/2.vcf create mode 100644 tests/tabix_data/vcf/20.vcf create mode 100644 tests/tabix_data/vcf/21.vcf create mode 100644 tests/tabix_data/vcf/22.vcf create mode 100644 tests/tabix_data/vcf/23.vcf create mode 100644 tests/tabix_data/vcf/24.vcf create mode 100644 tests/tabix_data/vcf/3.vcf create mode 100644 tests/tabix_data/vcf/4.vcf create mode 100644 tests/tabix_data/vcf/5.vcf create mode 100644 tests/tabix_data/vcf/6.vcf create mode 100644 tests/tabix_data/vcf/7.vcf create mode 100644 tests/tabix_data/vcf/8.vcf create mode 100644 tests/tabix_data/vcf/9.vcf create mode 100644 tests/tabix_data/vcf/README.txt create mode 100644 tests/tabix_data/vcf/issue85.vcf create mode 100644 tests/tabix_data/vcf/vcf_v42.vcf create mode 100644 tests/tabix_test.py create mode 100644 tests/tabixproxies_test.py create mode 100644 tests/test_samtools_python.py diff --git a/.travis.disabled.yml b/.travis.disabled.yml new file mode 100644 index 0000000..5b7bcc8 --- /dev/null +++ b/.travis.disabled.yml @@ -0,0 +1,114 @@ +os: + - linux + - osx + +language: c + +stages: + - test + - name: deploy + if: tag IS present + +env: + matrix: + - CONDA_PY=2.7 + - CONDA_PY=3.6 + - CONDA_PY=3.7 + - CONDA_PY=3.8 + global: + - PYSAM_LINKING_TEST=1 + - TWINE_USERNAME=grepall + - secure: bTbky3Un19NAl62lix8bMLmBv9IGNhFkRXlZH+B253nYub7jwQwPQKum3ct9ea+XHJT5//uM0B8WAF6eyugpNkPQ7+S7SEH5BJuCt30nv6qvGhSO2AffZKeHEDnfW2kqGrivn87TqeomlSBlO742CD/V0wOIUwkTT9tutd+E7FU= + +_cibw_common: &cibw_common + addons: {} + install: + - python3 -m pip install cibuildwheel>=1.1.0 twine + script: + - set -e + - cibuildwheel --output-dir dist + - twine check dist/* + - twine upload --skip-existing dist/* + +_cibw_linux: &cibw_linux + stage: deploy + os: linux + language: python + python: '3.5' + services: + - docker + <<: *cibw_common + +_cibw_linux_aarch64: &cibw_linux_aarch64 + stage: deploy + os: linux + arch: arm64 + language: python + python: '3.9' + services: + - docker + <<: *cibw_common + +matrix: + include: + - stage: deploy + os: linux + language: python + python: '3.5' + addons: + apt: + packages: + - gcc + - g++ + - libcurl4-openssl-dev # for libcurl support in sdist + - libssl-dev # for s3 support in sdist + install: + - python3 -m pip install Cython twine + script: + - set -e + - python3 setup.py build_ext --inplace + - python3 setup.py sdist + - twine check dist/* + - twine upload --skip-existing dist/* + - <<: *cibw_linux + env: + - CIBW_BUILD="*_x86_64" + - CIBW_BEFORE_BUILD="yum install -y zlib-devel bzip2-devel xz-devel && python -m pip install -r requirements.txt" + - CIBW_ENVIRONMENT='HTSLIB_CONFIGURE_OPTIONS="--disable-libcurl"' + - CIBW_REPAIR_WHEEL_COMMAND_LINUX='auditwheel repair -L . -w {dest_dir} {wheel}' + - CIBW_TEST_COMMAND='python -c "import pysam"' + - <<: *cibw_linux + env: + - CIBW_BUILD="*_i686" + - CIBW_BEFORE_BUILD="yum install -y zlib-devel bzip2-devel xz-devel && python -m pip install -r requirements.txt" + - CIBW_ENVIRONMENT='HTSLIB_CONFIGURE_OPTIONS="--disable-libcurl"' + - CIBW_REPAIR_WHEEL_COMMAND_LINUX='auditwheel repair -L . -w {dest_dir} {wheel}' + - CIBW_TEST_COMMAND='python -c "import pysam"' + - <<: *cibw_linux_aarch64 + env: + - CIBW_BUILD="*_aarch64" + - CIBW_BEFORE_BUILD="yum install -y zlib-devel bzip2-devel xz-devel && python -m pip install -r requirements.txt" + - CIBW_ENVIRONMENT='HTSLIB_CONFIGURE_OPTIONS="--disable-libcurl"' + - CIBW_REPAIR_WHEEL_COMMAND_LINUX='auditwheel repair -L . -w {dest_dir} {wheel}' + - CIBW_TEST_COMMAND='python -c "import pysam"' + - stage: deploy + os: osx + language: generic + env: + - CIBW_BEFORE_BUILD="python -m pip install -r requirements.txt" + - CIBW_ENVIRONMENT='HTSLIB_CONFIGURE_OPTIONS="--disable-libcurl"' + - CIBW_TEST_COMMAND='python -c "import pysam"' + <<: *cibw_common + +addons: + apt: + packages: + - gcc + - g++ + +script: + - ./devtools/run_tests_travis.sh + +notifications: + email: + - andreas.heger@gmail.com diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..4e9c5eb --- /dev/null +++ b/AUTHORS @@ -0,0 +1,43 @@ +Many people have contributed to pysam. The list of github contributors +is the best place to get a full list of authors and their contributions. +The list and summary below is a out-of-date and represents the earlier +stages of the project. + +List of contributors: + +Andreas Heger, Tildon Grant Belgard, Florian Finkernagel, Leo +Goodstadt, Martin Goodson all contributed code to pysam. + +John Marshall has been looking after pysam and its community for +several years, as well as making many code contributions and improving +the engineering of pysam. + +Kevin B. Jacobs implemented a Cython wrapper for the VCF/BCF +reader/writer in htslib. + +Gerton Lunter provided a validating VCF parser. + +Marcel Martin implemented python 3 compatibility. +Ben Schiller contributed a Windows compatible clone. + +The sources in the directory samtools are from the samtools project: +http://samtools.sourceforge.net/. All of these are available under the +MIT licence. The attributions for this code are as follows: + +Heng Li from the Sanger Institute wrote most of the initial source code +of SAMtools and various converters. + +Bob Handsaker from the Broad Institute is a major contributor to the +SAM/BAM specification. He designed and implemented the BGZF format, the +underlying indexable compression format for the BAM format. BGZF does +not support arithmetic between file offsets. + +Jue Ruan for the Beijing Genome Institute designed and implemented the +RAZF format, an alternative indexable compression format. RAZF supports +arithmetic between file offsets, at the cost of increased index file +size and the full compatibility with gzip. RAZF is optional and only +used in `faidx' for indexing RAZF compressed fasta files. + +Colin Hercus updated novo2sam.pl to support gapped alignment by +novoalign. + diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..82fa2f4 --- /dev/null +++ b/COPYING @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2008-2009 Genome Research Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Containerfile b/Containerfile new file mode 100644 index 0000000..633f07e --- /dev/null +++ b/Containerfile @@ -0,0 +1,13 @@ +FROM ubi8:latest + +RUN yum update \ + && yum install -y python3-pip python3-devel pigz \ + && cd /usr/local/bin \ + && ln -s /usr/bin/python3 python \ + && pip3 --no-cache-dir install --upgrade pip \ + && yum clean all \ + && echo "system packages installed" + +RUN python -m pip install pysam + +WORKDIR /opt/ diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..5016dcc --- /dev/null +++ b/INSTALL @@ -0,0 +1,102 @@ +An online version of the installation instructions can be found here: +http://pysam.readthedocs.io/en/latest/installation.html + +================ +Installing pysam +================ + +Pysam can be installed through conda_, pypi_ and from the repository. +The recommended way to install pysam is through conda/bioconda. + +Conda installation +================== + +To install pysam in your current conda_ environment, type:: + + conda config --add channels r + conda config --add channels bioconda + conda install pysam + +This will install pysam from the bioconda_ channel and automatically +makes sure that dependencies are installed. Also, compilation flags +will be set automatically, which will potentially save a lot of +trouble on OS X. + +Pypi installation +================= + +Pysam provides a python interface to the functionality contained +within the htslib_ C library. There are two ways that these two +can be combined, ``builtin`` and ``external``. + +Builtin +------- + +The typical installation will be through pypi_:: + + pip install pysam + +This will compile the ``builtin`` htslib source code within pysam. + +htslib_ can be configured at compilation to turn on additional +features such support using encrypted configurations, enable plugins, +and more. See the htslib_ project for more information on these. + +Pysam will attempt to configure htslib_ to turn on some advanced +features. If these fail, for example due to missing library +dependencies (`libcurl`, `libcrypto`), it will fall back to +conservative defaults. + +Options can be passed to the configure script explicitly by +setting the environment variable `HTSLIB_CONFIGURE_OPTIONS`. +For example:: + + export HTSLIB_CONFIGURE_OPTIONS=--enable-plugins + pip install pysam + +External +-------- + +pysam can be combined with an externally installed htslib_ +library. This is a good way to avoid duplication of libraries. To link +against an externally installed library, set the environment variables +`HTSLIB_LIBRARY_DIR` and `HTSLIB_INCLUDE_DIR` before installing:: + + export HTSLIB_LIBRARY_DIR=/usr/local/lib + export HTSLIB_INCLUDE_DIR=/usr/local/include + pip install pysam + +Note that the location of the file :file:`libhts.so` needs to be known +to the linker once you run pysam, for example by setting the +environment-varirable `LD_LIBRARY_PATH`. + +Note that generally the pysam and htslib version need to be compatible. See +the release notes for more information. + +Installation from repository +============================ + +pysam depends on cython_ to provide the connectivity to the htslib_ C +library. The installation of the source tarball (:file:`.tar.gz`) +contains pre-built C-files and cython needs not be present +during installation. However, when installing from the repository, +cython needs to be installed beforehand. + +To install from repository, type:: + + python setup.py install + +For compilation options, see the section on Pypi installation above. + +Requirements +============ + +Depending on the installation method, requirements for building pysam differ. + +When installing through conda_, dependencies will be resolved by the +package manager. The pip_ installation and installation from source +require a C compiler and its standard libraries as well as all +requirements for building htslib. Htslib requirements are listed in +the htslib/INSTALL file. + +Installing from the repository will require cython_ to be installed. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..25e9a1a --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,54 @@ +# +# Use .add_data_files and .add_data_dir methods in a appropriate +# setup.py files to include non-python files such as documentation, +# data, etc files to distribution. Avoid using MANIFEST.in for that. +# +include MANIFEST.in +include COPYING +include NEWS +include INSTALL +include KNOWN_BUGS +include THANKS +include cy_build.py +include requirements.txt +include pysam/libc*.pxd +include pysam/libc*.pyx +include pysam/libc*.c +include pysam/*.c +include pysam/*.h +exclude pysam/config.py + +include win32/*.[ch] + +# exclude tests from pypi tar-ball - they +# require additional data +prune tests/ + +# samtools +include samtools/LICENSE samtools/README samtools/lz4/LICENSE +recursive-include samtools *.[ch] +include samtools/version.sh +exclude samtools/*config*.h + +# bcftools +include bcftools/LICENSE bcftools/README +include bcftools/*.[ch] +include bcftools/version.sh +exclude bcftools/*config*.h + +# htslib +include htslib/LICENSE htslib/README +recursive-include htslib *.[ch] +exclude htslib/*config*.h + +include htslib/configure.ac htslib/m4/*.m4 htslib/*.in +include htslib/configure htslib/version.sh +include htslib/Makefile htslib/*.mk +exclude htslib/config.mk htslib/htscodecs.mk + +include cy_build.py +include requirements.txt + +# documentation +include doc/*.py doc/*.rst +include doc/Makefile doc/make.bat diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..a0078cb --- /dev/null +++ b/NEWS @@ -0,0 +1,850 @@ +An online version of the installation instructions can be found here: +http://pysam.readthedocs.io/en/latest/release.html + +============= +Release notes +============= + +Release 0.20.0 +============== + +This release wraps htslib/bcftools version 1.16 and samtools version 1.16.1. + +* [#1113] Full compatibility with setuptools v62.1.0's build directory name changes +* [#1121] Build-time symbol check portability improved +* [#1122] Fix setting sample genotype using .alleles property +* [#1128] Fix test suite failure when using a libdeflate-enabled samtools + +Many additional type hints have been provided by the community, +thanks! + +Release 0.19.1 +============== + +This release wraps htslib/samtools/bcftools version 1.15.1. + +* [#1104] add an add_samples() method to quickly add multiple samples + to VCF. + +Release 0.19.0 +============== + +This release wraps htslib/samtools/bcftools version 1.15. + +* [#1085] Improve getopt()/getopt_long() resetting when running samtools/bcftools commands + +* [#1078] Support BAM_CPAD in get_aligned_pairs + +* [#1063] Run flake8 and fix some linting issues + +* [#1088] Add AlignedSegment is_mapped/mate_is_mapped/is_forward/mate_is_forward properties + +* Write an absent AlignedSegment.qual as all-bytes-0xff + +* Fix BGZFile.read() behaviour near or at EOF + +* First API for the htslib modified bases interface + +Release 0.18.0 +============== + +This release wraps htslib/samtools/bcftools version 1.14. + +* [#1048] and [#1060], clarify documentation of index statistics with CRAM files +* Prevent "retval may be used uninitialised" warning. +* Add new "samples" subcommand to pysam/samtools.py +* Introduce TupleProxyIterator iterator object class + +Release 0.17.0 +============== + +This release wraps htslib/samtools/bcftools version 1.13. Corresponding +to new samtools commands, `pysam.samtools` now has additional functions +`ampliconclip`, `ampliconstats`, `fqimport`, and `version`. + +Bugs fixed: + +* [#447] The maximum QNAME length is fully restored to 254 +* [#506, #958, #1000] Don't crash the Python interpreter on ``pysam.bcftools.*()`` errors +* [#603] count_coverage: ignore reads that have no SEQ field +* [#928] Fix ``pysam.bcftools.mpileup()`` segmentation fault +* [#983] Add win32/\*.[ch] to MANIFEST.in +* [#994] Raise exception in ``get_tid()`` if header could not be parsed +* [#995] Choose TBI/CSI in ``tabix_index()`` via both min_shift and csi +* [#996] ``AlignmentFile.fetch()`` now works with large chromosomes longer than 2\ :sup:`29` bases +* [#1019] Fix Sphinx documentation generation by avoiding Python 2 ``ur'string'`` syntax +* [#1035] Improved handling of file iteration errors +* [#1038] ``tabix_index()`` no longer leaks file descriptors +* [#1040] ``print(aligned_segment)`` now prints the correct TLEN value + (it also now prints RNAME/RNEXT more clearly and prints POS/PNEXT 1-based) +* *setup.py* longer uses ``setup(use_2to3)`` for compatibility with setuptools >= v58.0.0 + +New facilities: + +* [PR #963] Additional VCF classes are exposed to pysam programmers +* [#998, PR #1001] Add ``get/set_encoding_error_handler()`` to control UTF-8 conversion +* [PR #1012] Running ``python setup.py sdist`` now automatically runs cythonize +* Running tests with ``pytest`` now automatically runs ``make`` to generate test data + +Documentation improvements: + +* [#726] Clarify get_forward_sequence/get_forward_qualities documentation +* [#865] Improved example +* [#968] ``get_index_statstics`` parameters +* [#986] Clarify ``VariantFile.fetch`` start/stop region parameters are 0-based and half-open. +* [#990] Corrected ``PileupColumn.get_query_sequences`` documentation +* [#999] Fix documentation for ``AlignmentFile.get_reference_length()`` +* [#1002] Document the default min_base_quality for ``pileup()`` + + +Release 0.16.0 +============== + +This release wraps htslib/bcftools version 1.10.2 and samtools version +1.10. The following bugs reported against pysam are fixed due to this: + +* [#447] Writing out QNAME longer than 251 characters corrupts BAM +* [#640, #734, #843] Setting VariantRecord pos or stop raises error +* [#738, #919] FastxFile truncates concatenated plain gzip compressed files + +Additional bugfixes: + +* [#840] Pileup doesn't work on python3 when `index_filename` is used +* [#886] FastqProxy raises ValueError when instantiated from python +* [#904] VariantFile.fetch() throws ValueError on files with no records +* [#909] Fix incorrect quoting in VariantFile contig records +* [#915, #916] Implement pileup() for unindexed files and/or SAM files + +Backwards incompatible changes: + +* The `samtools import` command was removed in samtools 1.10, so pysam + no longer exports a `samimport` function. Use `pysam.view()` instead. + + +Release 0.15.4 +============== + +Bugfix release. Principal reason for release is to update cython +version in order to fix pip install pysam with python 3.8. + +* [#879] Fix add_meta function in libcbcf.pyx, so meta-information + lines in header added with this function have double-quoting rules + in accordance to rules specified in VCF4.2 and VCF4.3 specifications +* [#863] Force arg to bytes to support non-ASCII encoding +* [#875] Bump minimum Cython version +* [#868] Prevent segfault on Python 2.7 AlignedSegment.compare(other=None) +* [#867] Fix wheel building on TravisCI +* [#863] Force arg to bytes to support non-ASCII encoding +* [#799] disambiguate interpretation of bcf_read return code +* [#841] Fix silent truncation of FASTQ with bad q strings +* [#846] Prevent segmentation fault on ID, when handling malformed records +* [#829] Run configure with the correct CC/CFLAGS/LDFLAGS env vars + +Release 0.15.3 +============== + +Bugfix release. + +* [#824] allow reading of UTF-8 encoded text in VCF/BCF files. +* [#780] close all filehandles before opening new ones in pysam_dispatch +* [#773] do not cache VariantRecord.id to avoid memory leak +* [#781] default of multiple_iterators=True is changed to False for + CRAM files. +* [#825] fix collections.abc import +* [#825] use bcf_hdr_format instead of bcf_hdr_fmt_text, fix memcpy + bug when setting FORMAT fields. +* [#804] Use HTSlib's kstring_t, which reallocates and enlarges its + memory as needed, rather than a fixed-size char buffer. +* [#814] Build wheels and upload them to PyPI +* [#755] Allow passing flags and arguments to index methods +* [#763] Strip \0 in header check +* [#761] Test Tabix index contents, not the compression + +Release 0.15.2 +============== + +Bugfix release. + +* [#746] catch pileup itorator out-of-scope segfaults +* [#747] fix faixd fetch with region +* [#748] increase max_pos to (1<<31)-1 +* [#645] Add missing macOS stub files in `MANIFEST.in`, @SoapZA +* [#737] Fix bug in get_aligned_pairs, @bkohrn + +Release 0.15.1 +============== + +Bugfix release. + +* [#716] raise ValueError if tid is out of range when writing +* [#697] release version using cython 0.28.5 for python 3.7 + compatibility + +Release 0.15.0 +============== + +This release wraps htslib (and friends) version 1.9. + +* [#673] permit dash in chromosome name of region string +* [#656] Support `text` when opening a SAM file for writing +* [#658] return None in get_forward_sequence if sequence not in record +* [#683] allow lower case bases in MD tags +* Ensure that = and X CIGAR ops are treated the same as M + +Release 0.14.1 +============== + +This is mostly a bugfix release, though bcftools has now also been +upgraded to 1.7.0. + +* [#621] Add a warning to count_coverage when an alignment has an + empty QUAL field +* [#635] Speed-up of AlignedSegment.find_intro() +* treat border case of all bases in pileup column below quality score +* [#634] Fix access to pileup reference_sequence + +Release 0.14.0 +============== + +This release wraps htslib/samtools versions 1.7.0. + +* SAM/BAM/CRAM headers are now managed by a separate AlignmentHeader + class. +* AlignmentFile.header.as_dict() returns an ordered dictionary. +* Use "stop" instead of "end" to ensure consistency to + VariantFile. The end designations have been kept for backwards + compatibility. + +* [#611] and [#293] CRAM repeated fetch now works, each iterator + reloads index if multiple_iterators=True +* [#608] pysam now wraps htslib 1.7 and samtools 1.7. +* [#580] reference_name and next_reference_name can now be set to "*" + (will be converted to None to indicate an unmapped location) +* [#302] providing no coordinate to count_coverage will not count from + start/end of contig. +* [#325] @SQ records will be automatically added to header if they are + absent from text section of header. +* [#529] add get_forward_sequence() and get_forward_qualities() + methods +* [#577] add from_string() and to_dict()/from_dict() methods to + AlignedSegment. Rename tostring() to to_string() throughout for + consistency +* [#589] return None from build_alignment_sequence if no MD tag is set +* [#528] add PileupColumn.__len__ method + +Backwards incompatible changes: + +* AlignmentFile.header now returns an AlignmentHeader object. Use + AlignmentFile.header.to_dict() to get the dictionary as + previously. Most dictionary accessor methods (keys(), values(), + __getitem__, ...) have been implemented to ensure some level of + backwards compatibility when only reading. + + The rationale for this change is to have consistency between + AlignmentFile and VariantFile. + +* AlignmentFile and FastaFile now raise IOError instead of OSError + +Medium term we plan to have a 1.0 release. The pysam +interface has grown over the years and the API is cluttered with +deprecated names (Samfile, getrname(), gettid(), ...). To work towards +this, the next release (0.15.0) will yield DeprecationWarnings +for any parts of the API that are considered obsolete and will not be +in 1.0. Once 1.0 has been reached, we will use semantic versioning. + +Release 0.13.0 +=============== + +This release wraps htslib/samtools/bcftools versions 1.6.0 and +contains a series of bugfixes. + +* [#544] reading header from remote TabixFiles now works. +* [#531] add missing tag types H and A. A python float will now be + added as 'f' type instead of 'd' type. +* [#543] use FastaFile instead of Fastafile in pileup. +* [#546] set is_modified flag in setAttribute so updated attributes + are output. +* [#537] allow tabix index files to be created in a custom location. +* [#530] add get_index_statistics() method + +Release 0.12.0.1 +================ + +Bugfix release to solve compilation issue due to missinge +bcftools/config.h file. + +Release 0.12.0 +============== + +This release wraps htslib/samtools/bcftools versions 1.5.0 and +contains a series of bugfixes. + +* [#473] A new FastxRecord class that can be instantiated from class and + modified in-place. Replaces PersistentFastqProxy. +* [#521] In AligmentFile, Simplify file detection logic and allow remote index files + * Removed attempts to guess data and index file names; this is magic left + to htslib. + * Removed file existence check prior to opening files with htslib + * Better error checking after opening files that raise the appropriate + error (IOError for when errno is set, ValueError otherwise for backward + compatibility). + * Report IO errors when loading an index by name. + * Allow remote indices (tested using S3 signed URLs). + * Document filepath_index and make it an alias for index_filename. + * Added a require_index parameter to AlignmentFile +* [#526] handle unset ref when creating new records +* [#513] fix bcf_translate to skip deleted FORMAT fields to avoid + segfaults +* [#516] expose IO errors via IOError exceptions +* [#487] add tabix line_skip, remove 'pileup' preset +* add FastxRecord, replaces PersistentFastqProxy (still present for + backwards compatibility) +* [#496] upgrade to htslib/samtools/bcftools versions 1.5 +* add start/stop to AlignmentFile.fetch() to be consistent with + VariantFile.fetch(). "end" is kept for backwards compatibility. +* [#512] add get_index_statistics() method to AlignmentFile. + +Upcoming changes: + +In the next release we are plannig to separate the header information +from AlignmentFile into a separate class AlignmentHeader. This layout +is similar to VariantFile/VariantHeader. With this change we will +ensure that an AlignedSegment record will be linked to a header so +that chromosome names can be automatically translated from the numeric +representation. As a consequence, the way new AlignedSegment records +are created will need to change as the constructor requires a header:: + + header = pysam.AlignmentHeader( + reference_names=["chr1", "chr2"], + reference_lengths=[1000, 1000]) + + read = pysam.AlignedSegment(header) + +This will affect all code that instantiates AlignedSegment objects +directly. We have not yet merged to allow users to provide feed-back. +The pull-request is here: https://github.com/pysam-developers/pysam/pull/518 +Please comment on github. + +Release 0.11.2.2 +================ + +Bugfix release to address two issues: + +* Changes in 0.11.2.1 broke the GTF/GFF3 parser. Corrected and + more tests have been added. +* [#479] Correct VariantRecord edge cases described in issue + +Release 0.11.2.1 +================ + +Release to fix release tar-ball containing 0.11.1 pre-compiled +C-files. + +Release 0.11.2 +============== + +This release wraps htslib/samtools/bcfools versions 1.4.1 in response +to a security fix in these libraries. Additionally the following +issues have been fixed: + +* [#452] add GFF3 support for tabix parsers +* [#461] Multiple fixes related to VariantRecordInfo and handling of INFO/END +* [#447] limit query name to 251 characters (only partially addresses issue) + +VariantFile and related object fixes + +* Restore VariantFile.\_\_dealloc\_\_ +* Correct handling of bcf_str_missing in bcf_array_to_object and + bcf_object_to_array +* Added update() and pop() methods to some dict-like proxy objects +* scalar INFO entries could not be set again after being deleted +* VariantRecordInfo.__delitem__ now allows unset flags to be deleted without + raising a KeyError +* Multiple other fixes for VariantRecordInfo methods +* INFO/END is now accessible only via VariantRecord.stop and + VariantRecord.rlen. Even if present behind the scenes, it is no longer + accessible via VariantRecordInfo. +* Add argument to issue a warning instead of an exception if input appears + to be truncated + +Other features and fixes: + +* Make AlignmentFile \_\_dealloc\_\_ and close more + stringent +* Add argument AlignmentFile to issue a warning instead of an + exception if input appears to be truncated + +Release 0.11.1 +============== + +Bugfix release + +* [#440] add deprecated 'always' option to infer_query_length for backwards compatibility. + +Release 0.11.0 +============== + +This release wraps the latest versions of htslib/samtools/bcftools and +implements a few bugfixes. + +* [#413] Wrap HTSlib/Samtools/BCFtools 1.4 +* [#422] Fix missing pysam.sort.usage() message +* [#411] Fix BGZfile initialization bug +* [#412] Add seek support for BGZFile +* [#395] Make BGZfile iterable +* [#433] Correct getQueryEnd +* [#419] Export SAM enums such as pysam.CMATCH +* [#415] Fix access by tid in AlignmentFile.fetch() +* [#405] Writing SAM now outputs a header by default. +* [#332] split infer_query_length(always) into infer_query_length and infer_read_length + +Release 0.10.0 +============== + +This release implements further functionality in the VariantFile API +and includes several bugfixes: + +* treat special case -c option in samtools view outputs to stdout even + if -o given, fixes #315 +* permit reading BAM files with CSI index, closes #370 +* raise Error if query name exceeds maximum length, fixes #373 +* new method to compute hash value for AlignedSegment +* AlignmentFile, VariantFile and TabixFile all inherit from HTSFile +* Avoid segfault by detecting out of range reference_id and + next_reference in AlignedSegment.tostring +* Issue #355: Implement streams using file descriptors for VariantFile +* upgrade to htslib 1.3.2 +* fix compilation with musl libc +* Issue #316, #360: Rename all Cython modules to have lib as a prefix +* Issue #332, hardclipped bases in cigar included by + pysam.AlignedSegment.infer_query_length() +* Added support for Python 3.6 filename encoding protocol +* Issue #371, fix incorrect parsing of scalar INFO and FORMAT fields in VariantRecord +* Issue #331, fix failure in VariantFile.reset() method +* Issue #314, add VariantHeader.new_record(), VariantFile.new_record() and + VariantRecord.copy() methods to create new VariantRecord objects +* Added VariantRecordFilter.add() method to allow setting new VariantRecord filters +* Preliminary (potentially unsafe) support for removing and altering header metadata +* Many minor fixes and improvements to VariantFile and related objects + +Please note that all internal cython extensions now have a lib prefix +to facilitate linking against pysam extension modules. Any user cython +extensions using cimport to import pysam definitions will need +changes, for example:: + + cimport pysam.csamtools + +will become:: + + cimport pysam.libcsamtools + +Release 0.9.1 +============= + +This is a bugfix release addressing some installation problems +in pysam 0.9.0, in particular: + +* patch included htslib to work with older libcurl versions, fixes #262. +* do not require cython for python 3 install, fixes #260 +* FastaFile does not accept filepath_index any more, see #270 +* add AlignedSegment.get_cigar_stats method. +* py3 bugfix in VariantFile.subset_samples, fixes #272 +* add missing sysconfig import, fixes #278 +* do not redirect stdout, but instead write to a separately + created file. This should resolve issues when pysam is used + in notebooks or other environments that redirect stdout. +* wrap htslib-1.3.1, samtools-1.3.1 and bcftools-1.3.1 +* use bgzf throughout instead of gzip +* allow specifying a fasta reference for CRAM file when opening + for both read and write, fixes #280 + +Release 0.9.0 +============= + +Overview +-------- + +The 0.9.0 release upgrades htslib to htslib 1.3 and numerous other +enhancements and bugfixes. See below for a detailed list. + +`Htslib 1.3 `_ +comes with additional capabilities for remote file access which depend +on the presence of optional system libraries. As a consequence, the +installation script :file:`setup.py` has become more complex. For an +overview, see :ref:`installation`. We have tested installation on +linux and OS X, but could not capture all variations. It is possible +that a 0.9.1 release might follow soon addressing installation issues. + +The :py:class:`~.pysam.VariantFile` class provides access to +:term:`vcf` and :term:`bcf` formatted files. The class is certainly +usable and interface is reaching completion, but the API and the +functionality is subject to change. + +Detailed release notes +---------------------- + +* upgrade to htslib 1.3 +* python 3 compatibility tested throughout. +* added a first set of bcftools commands in the pysam.bcftools + submodule. +* samtools commands are now in the pysam.samtools module. For + backwards compatibility they are still imported into the pysam + namespace. +* samtools/bcftools return stdout as a single (byte) string. As output + can be binary (VCF.gz, BAM) this is necessary to ensure py2/py3 + compatibility. To replicate the previous behaviour in py2.7, use:: + + pysam.samtools.view(self.filename).splitlines(True) + +* get_tags() returns the tag type as a character, not an integer (#214) +* TabixFile now raises ValueError on indices created by tabix <1.0 (#206) +* improve OSX installation and develop mode +* FastxIterator now handles empty sequences (#204) +* TabixFile.isremote is not TabixFile.is_remote in line with AlignmentFile +* AlignmentFile.count() has extra optional argument read_callback +* setup.py has been changed to: + * install a single builtin htslib library. Previously, each pysam + module contained its own version. This reduces compilation time + and code bloat. + * run configure for the builtin htslib library in order to detect + optional libraries such as libcurl. Configure behaviour can be + controlled by setting the environment variable + HTSLIB_CONFIGURE_OPTIONS. +* get_reference_sequence() now returns the reference sequence and not + something looking like it. This bug had effects on + get_aligned_pairs(with_seq=True), see #225. If you have relied on on + get_aligned_pairs(with_seq=True) in pysam-0.8.4, please check your + results. +* improved autodetection of file formats in AlignmentFile and VariantFile. + +Release 0.8.4 +============= + +This release contains numerous bugfixes and a first implementation of +a pythonic interface to VCF/BCF files. Note that this code is still +incomplete and preliminary, but does offer a nearly complete immutable +Pythonic interface to VCF/BCF metadata and data with reading and +writing capability. + +Potential isses when upgrading from v0.8.3: + +* binary tags are now returned as python arrays + +* renamed several methods for pep8 compatibility, old names still retained for + backwards compatibility, but should be considered deprecated. + * gettid() is now get_tid() + * getrname() is now get_reference_name() + * parseRegion() is now parse_region() + +* some methods have changed for pep8 compatibility without the old + names being present: + * fromQualityString() is now qualitystring_to_array() + * toQualityString() is now qualities_to_qualitystring() + +* faidx now returns strings and not binary strings in py3. + +* The cython components have been broken up into smaller files with + more specific content. This will affect users using the cython + interfaces. + +Edited list of commit log changes: + +* fixes AlignmentFile.check_index to return True +* add RG/PM header tag - closes #179 +* add with_seq option to get_aligned_pairs +* use char * inside reconsituteReferenceSequence +* add soft clipping for get_reference_sequence +* add get_reference_sequence +* queryEnd now computes length from cigar string if no sequence present, closes #176 +* tolerate missing space at end of gtf files, closes #162 +* do not raise Error when receiving output on stderr +* add docu about fetching without index, closes #170 +* FastaFile and FastxFile now return strings in python3, closes #173 +* py3 compat: relative -> absolute imports. +* add reference_name and next_reference_name attributes to AlignedSegment +* add function signatures to cvcf cython. Added note about other VCF code. +* add context manager functions to FastaFile +* add reference_name and next_reference_name attributes to AlignedSegment +* PileupColumn also gets a reference_name attribute. +* add context manager functions to FastaFile +* TabixFile.header for remote files raises AttributeError, fixes #157 +* add context manager interface to TabixFile, closes #165 +* change ctypedef enum to typedef enum for cython 0.23 +* add function signatures to cvcf cython, also added note about other VCF code +* remove exception for custom upper-case header record tags. +* rename VALID_HEADER_FIELDS to KNOWN_HEADER_FIELDS +* fix header record tag parsing for custom tags. +* use cython.str in count_coverage, fixes #141 +* avoid maketrans (issues with python3) +* refactoring: AlignedSegment now in separate module +* do not execute remote tests if URL not available +* fix the unmapped count, incl reads with no SQ group +* add raw output to tags +* added write access for binary tags +* bugfix in call to resize +* implemented writing of binary tags from arrays +* implemented convert_binary_tag to use arrays +* add special cases for reads that are unmapped or whose mates are unmapped. +* rename TabProxies to ctabixproxies +* remove underscores from utility functions +* move utility methods into cutils +* remove callback argument to fetch - closes #128 +* avoid calling close in dealloc +* add unit tests for File object opening +* change AlignmentFile.open to filepath_or_object +* implement copy.copy, close #65 +* add chaching of array attributes in AlignedSegment, closes #121 +* add export of Fastafile +* remove superfluous pysam_dispatch +* use persist option in FastqFile +* get_tag: expose tag type if requested with `with_value_type` +* fix to allow reading vcf record info via tabix-based vcf reader +* add pFastqProxy and pFastqFile objects to make it possible to work with multiple fastq records per file handle, unlike FastqProxy/FastqFile. +* release GIL around htslib IO operations +* More work on read/write support, API improvements +* add `phased` property on `VariantRecordSample` +* add mutable properties to VariantRecord +* BCF fixes and start of read/write support +* VariantHeaderRecord objects now act like mappings for attributes. +* add VariantHeader.alts dict from alt ID->Record. +* Bug fix to strong representation of structured header records. +* VariantHeader is now mutable + + +Release 0.8.3 +============= + +* samtools command now accept the "catch_stdout" option. + +* get_aligned_pairs now works for soft-clipped reads. + +* query_position is now None when a PileupRead is not aligned + to a particular position. + +* AlignedSegments are now comparable and hashable. + +Release 0.8.2.1 +=============== + +* Installation bugfix release. + +Release 0.8.2 +============= + +* Pysam now wraps htslib 1.2.1 and samtools version 1.2. + +* Added CRAM file support to pysam. + +* New alignment info interface. + * opt() and setTag are deprecated, use get_tag() and set_tag() + instead. + * added has_tag() + * tags is deprecated, use get_tags() and set_tags() instead. + +* FastqFile is now FastxFile to reflect that the latter permits + iteration over both fastq- and fasta-formatted files. + +* A Cython wrapper for htslib VCF/BCF reader/writer. The wrapper + provides a nearly complete Pythonic interface to VCF/BCF metadata + with reading and writing capability. However, the interface is still + incomplete and preliminary and lacks capability to mutate the + resulting data. + +Release 0.8.1 +============= + +* Pysam now wraps htslib and samtools versions 1.1. + +* Bugfixes, most notable: + * issue #43: uncompressed BAM output + * issue #42: skip tests requiring network if none available + * issue #19: multiple iterators can now be made to work on the same tabix file + * issue #24: All strings returned from/passed to the pysam API are now unicode in python 3 + * issue #5: type guessing for lists of integers fixed + +* API changes for consistency. The old API is still present, + but deprecated. + In particular: + + * Tabixfile -> TabixFile + * Fastafile -> FastaFile + * Fastqfile -> FastqFile + * Samfile -> AlignmentFile + * AlignedRead -> AlignedSegment + * qname -> query_name + * tid -> reference_id + * pos -> reference_start + * mapq -> mapping_quality + * rnext -> next_reference_id + * pnext -> next_reference_start + * cigar -> cigartuples + * cigarstring -> cigarstring + * tlen -> template_length + * seq -> query_sequence + * qual -> query_qualities, now returns array + * qqual -> query_alignment_qualities, now returns array + * tags -> tags + * alen -> reference_length, reference is always "alignment", so removed + * aend -> reference_end + * rlen -> query_length + * query -> query_alignment_sequence + * qstart -> query_alignment_start + * qend -> query_alignment_end + * qlen -> query_alignment_length + * mrnm -> next_reference_id + * mpos -> next_reference_start + * rname -> reference_id + * isize -> template_length + * blocks -> get_blocks() + * aligned_pairs -> get_aligned_pairs() + * inferred_length -> infer_query_length() + * positions -> get_reference_positions() + * overlap() -> get_overlap() + + * All strings are now passed to or received from the pysam API + as strings, no more bytes. + +Other changes: + * AlignmentFile.fetch(reopen) option is now multiple_iterators. The + default changed to not reopen a file unless requested by the user. + * FastaFile.getReferenceLength is now FastaFile.get_reference_length + +Backwards incompatible changes + +* Empty cigarstring now returns None (instead of '') +* Empty cigar now returns None (instead of []) +* When using the extension classes in cython modules, AlignedRead + needs to be substituted with AlignedSegment. +* fancy_str() has been removed +* qual, qqual now return arrays + +Release 0.8.0 +============= + +* Disabled features + * IteratorColumn.setMask() disabled as htslib does not implement + this functionality? + +* Not implemented yet: + * reading SAM files without header + +Tabix files between version 0.7.8 and 0.8.0 are +not compatible and need to be re-indexed. + +While version 0.7.8 and 0.8.0 should be mostly +compatible, there are some notable exceptions: + +* tabix iterators will fail if there are comments + in the middle or the end of a file. + +* tabix raises always ValueError for invalid intervals. + Previously, different types of errors were raised + (KeyError, IndexError, ValueError) depending on + the type of invalid intervals (missing chromosome, + out-of-range, malformatted interval). + + +Release 0.7.8 +============= + +* added AlignedRead.setTag method +* added AlignedRead.blocks +* unsetting CIGAR strings is now possible +* empty CIGAR string returns empty list +* added reopen flag to Samfile.fetch() +* various bugfixes + +Release 0.7.7 +============= + +* added Fastafile.references, .nreferences and .lengths +* tabix_iterator now uses kseq.h for python 2.7 + +Release 0.7.6 +============= + +* added inferred_length property +* issue 122: MACOSX getline missing, now it works? +* seq and qual can be set None +* added Fastqfile + +Release 0.7.5 +============= + +* switch to samtools 0.1.19 +* issue 122: MACOSX getline missing +* issue 130: clean up tempfiles +* various other bugfixes + +Release 0.7.4 +============= + +* further bugfixes to setup.py and package layout + +Release 0.7.3 +============= + +* further bugfixes to setup.py +* upgraded distribute_setup.py to 0.6.34 + +Release 0.7.2 +============= + +* bugfix in installer - failed when cython not present +* changed installation locations of shared libraries + +Release 0.7.1 +============= + +* bugfix: missing PP tag PG records in header +* added pre-built .c files to distribution + +Release 0.7 +=========== + +* switch to tabix 0.2.6 +* added cigarstring field +* python3 compatibility +* added B tag handling +* added check_sq and check_header options to Samfile.__init__ +* added lazy GTF parsing to tabix +* reworked support for VCF format parsing +* bugfixes + +Release 0.6 +=========== + +* switch to samtools 0.1.18 +* various bugfixes +* removed references to deprecated 'samtools pileup' functionality +* AlignedRead.tags now returns an empty list if there are no tags. +* added pnext, rnext and tlen + +Release 0.5 +=========== + +* switch to samtools 0.1.16 and tabix 0.2.5 +* improved tabix parsing, added vcf support +* re-organized code to permit linking against pysam +* various bugfixes +* added Samfile.positions and Samfile.overlap + +Release 0.4 +=========== + +* switch to samtools 0.1.12a and tabix 0.2.3 +* added snp and indel calling. +* switch from pyrex to cython +* changed handling of samtools stderr +* various bugfixes +* added Samfile.count and Samfile.mate +* deprecated AlignedRead.rname, added AlignedRead.tid + +Release 0.3 +=========== + +* switch to samtools 0.1.8 +* added support for tabix files +* numerous bugfixes including +* permit simultaneous iterators on the same file +* working access to remote files diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..9a66049 --- /dev/null +++ b/README.rst @@ -0,0 +1,53 @@ +===== +Pysam +===== + +|build-status| |docs| + +Pysam is a python module for reading and manipulating files in the +SAM/BAM format. The SAM/BAM format is a way to store efficiently large +numbers of alignments (`Li 2009`_), such as those routinely created by +next-generation sequencing methods. + +Pysam is a lightweight wrapper of the samtools_ C-API. Pysam also +includes an interface for tabix_. + +If you are using the conda packaging manager (e.g. miniconda or anaconda), +you can install pysam from the `bioconda channel `_:: + + conda config --add channels defaults + conda config --add channels conda-forge + conda config --add channels bioconda + conda install pysam + +Installation through bioconda is the recommended way to install pysam +as it resolves non-python dependencies and uses pre-configured +compilation options. Especially for OS X this will potentially save a +lot of trouble. + +The current version of pysam wraps 3rd-party code from htslib-1.16, samtools-1.16.1, and bcftools-1.16. + +Pysam is available through `pypi +`_. To install, type:: + + pip install pysam + +Pysam documentation is available +`here `_ + +Questions and comments are very welcome and should be sent to the +`pysam user group `_ + +.. _samtools: http://samtools.sourceforge.net/ +.. _tabix: http://samtools.sourceforge.net/tabix.shtml +.. _Li 2009: http://www.ncbi.nlm.nih.gov/pubmed/19505943 + +.. |build-status| image:: https://travis-ci.org/pysam-developers/pysam.svg + :alt: build status + :scale: 100% + :target: https://travis-ci.org/pysam-developers/pysam + +.. |docs| image:: https://readthedocs.org/projects/pysam/badge/?version=latest + :alt: Documentation Status + :scale: 100% + :target: https://pysam.readthedocs.org/en/latest/?badge=latest diff --git a/bcftools/HMM.c b/bcftools/HMM.c new file mode 100644 index 0000000..c2d302f --- /dev/null +++ b/bcftools/HMM.c @@ -0,0 +1,509 @@ +/* The MIT License + + Copyright (c) 2014-2017 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include "HMM.h" + +typedef struct +{ + int nstates; // number of hmm's states + uint32_t snap_at_pos; // snapshot at this position, 0 when inactive + double *vit_prob; // viterbi probabilities, NULL for uniform probs + double *fwd_prob; // transition probabilities + double *bwd_prob; // transition probabilities +} +snapshot_t; + +struct _hmm_t +{ + int nstates; // number of states + + double *vprob, *vprob_tmp; // viterbi probs [nstates] + uint8_t *vpath; // viterbi path [nstates*nvpath] + double *bwd, *bwd_tmp; // bwd probs [nstates] + double *fwd; // fwd probs [nstates*(nfwd+1)] + int nvpath, nfwd; + + int ntprob_arr; // number of pre-calculated tprob matrices + double *curr_tprob, *tmp; // Temporary arrays; curr_tprob is short lived, valid only for + // one site (that is, one step of Viterbi algorithm) + double *tprob_arr; // Array of transition matrices, precalculated to ntprob_arr + // positions. The first matrix is the initial tprob matrix + // set by hmm_init() or hmm_set_tprob() + set_tprob_f set_tprob; // Optional user function to set / modify transition probabilities + // at each site (one step of Viterbi algorithm) + void *set_tprob_data; + snapshot_t init, state; // Initial and current state probs. Set state from snapshot if prev_snap_pos!=0 or from init otherwise + snapshot_t *snapshot; // snapshot->snap_at_pos .. request a snapshot at this position + // hmm->state.snap_at_pos .. the current state comes from snapshot made at this position +}; + +uint8_t *hmm_get_viterbi_path(hmm_t *hmm) { return hmm->vpath; } +double *hmm_get_tprob(hmm_t *hmm) { return hmm->tprob_arr; } +int hmm_get_nstates(hmm_t *hmm) { return hmm->nstates; } +double *hmm_get_fwd_bwd_prob(hmm_t *hmm) { return hmm->fwd; } + +static inline void multiply_matrix(int n, double *a, double *b, double *dst, double *tmp) +{ + double *out = dst; + if ( a==dst || b==dst ) + out = tmp; + + int i,j,k; + for (i=0; iinit.snap_at_pos = hmm->state.snap_at_pos = 0; + + if ( !hmm->init.vit_prob ) + hmm->init.vit_prob = (double*) malloc(sizeof(double)*hmm->nstates); + if ( !hmm->init.fwd_prob ) + hmm->init.fwd_prob = (double*) malloc(sizeof(double)*hmm->nstates); + if ( !hmm->init.bwd_prob ) + hmm->init.bwd_prob = (double*) malloc(sizeof(double)*hmm->nstates); + + if ( !hmm->state.vit_prob ) + hmm->state.vit_prob = (double*) malloc(sizeof(double)*hmm->nstates); + if ( !hmm->state.fwd_prob ) + hmm->state.fwd_prob = (double*) malloc(sizeof(double)*hmm->nstates); + if ( !hmm->state.bwd_prob ) + hmm->state.bwd_prob = (double*) malloc(sizeof(double)*hmm->nstates); + + int i; + if ( probs ) + { + memcpy(hmm->init.vit_prob,probs,sizeof(double)*hmm->nstates); + double sum = 0; + for (i=0; instates; i++) sum += hmm->init.vit_prob[i]; + for (i=0; instates; i++) hmm->init.vit_prob[i] /= sum; + } + else + for (i=0; instates; i++) hmm->init.vit_prob[i] = 1./hmm->nstates; + + memcpy(hmm->init.fwd_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); // these remain unchanged + memcpy(hmm->init.bwd_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.vit_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); // can be changed by snapshotting + memcpy(hmm->state.fwd_prob,hmm->init.fwd_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.bwd_prob,hmm->init.bwd_prob,sizeof(double)*hmm->nstates); +} +hmm_t *hmm_init(int nstates, double *tprob, int ntprob) +{ + hmm_t *hmm = (hmm_t*) calloc(1,sizeof(hmm_t)); + hmm->nstates = nstates; + hmm->curr_tprob = (double*) malloc(sizeof(double)*nstates*nstates); + hmm->tmp = (double*) malloc(sizeof(double)*nstates*nstates); + hmm_set_tprob(hmm, tprob, ntprob); + hmm_init_states(hmm, NULL); + return hmm; +} + +void *hmm_snapshot(hmm_t *hmm, void *_snapshot, uint32_t pos) +{ + snapshot_t *snapshot = (snapshot_t*) _snapshot; + if ( snapshot && snapshot->nstates!=hmm->nstates ) + { + free(snapshot); + snapshot = NULL; + } + if ( !snapshot ) + { + // Allocate the snapshot as a single memory block so that it can be + // free()-ed by the user. So make sure the arrays are aligned.. + size_t str_size = sizeof(snapshot_t); + size_t dbl_size = sizeof(double); + size_t pad_size = (dbl_size - str_size % dbl_size) % dbl_size; + uint8_t *mem = (uint8_t*) malloc(str_size + pad_size + dbl_size*2*hmm->nstates); + snapshot = (snapshot_t*) mem; + snapshot->nstates = hmm->nstates; + snapshot->vit_prob = (double*) (mem + str_size + pad_size); + snapshot->fwd_prob = snapshot->vit_prob + hmm->nstates; + } + snapshot->snap_at_pos = pos; + hmm->snapshot = snapshot; + return snapshot; +} +void hmm_restore(hmm_t *hmm, void *_snapshot) +{ + snapshot_t *snapshot = (snapshot_t*) _snapshot; + if ( !snapshot || !snapshot->snap_at_pos ) + { + hmm->state.snap_at_pos = 0; + memcpy(hmm->state.vit_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.fwd_prob,hmm->init.fwd_prob,sizeof(double)*hmm->nstates); + } + else + { + hmm->state.snap_at_pos = snapshot->snap_at_pos; + memcpy(hmm->state.vit_prob,snapshot->vit_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.fwd_prob,snapshot->fwd_prob,sizeof(double)*hmm->nstates); + } +} +void hmm_reset(hmm_t *hmm, void *_snapshot) +{ + snapshot_t *snapshot = (snapshot_t*) _snapshot; + if ( snapshot ) snapshot->snap_at_pos = 0; + hmm->state.snap_at_pos = 0; + memcpy(hmm->state.vit_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.fwd_prob,hmm->init.fwd_prob,sizeof(double)*hmm->nstates); +} + +void hmm_set_tprob(hmm_t *hmm, double *tprob, int ntprob) +{ + hmm->ntprob_arr = ntprob; + if ( ntprob<=0 ) ntprob = 1; + + if ( !hmm->tprob_arr ) + hmm->tprob_arr = (double*) malloc(sizeof(double)*hmm->nstates*hmm->nstates*ntprob); + + memcpy(hmm->tprob_arr,tprob,sizeof(double)*hmm->nstates*hmm->nstates); + + int i; + for (i=1; instates, hmm->tprob_arr, hmm->tprob_arr+(i-1)*hmm->nstates*hmm->nstates, hmm->tprob_arr+i*hmm->nstates*hmm->nstates, hmm->tmp); +} + +void hmm_set_tprob_func(hmm_t *hmm, set_tprob_f set_tprob, void *data) +{ + hmm->set_tprob = set_tprob; + hmm->set_tprob_data = data; +} + +static void _set_tprob(hmm_t *hmm, int pos_diff) +{ + assert( pos_diff>=0 ); + + int i, n; + + n = hmm->ntprob_arr ? pos_diff % hmm->ntprob_arr : 0; // n-th precalculated matrix + memcpy(hmm->curr_tprob, hmm->tprob_arr+n*hmm->nstates*hmm->nstates, sizeof(*hmm->curr_tprob)*hmm->nstates*hmm->nstates); + + if ( hmm->ntprob_arr > 0 ) + { + n = pos_diff / hmm->ntprob_arr; // number of full blocks to jump + for (i=0; instates, hmm->tprob_arr+(hmm->ntprob_arr-1)*hmm->nstates*hmm->nstates, hmm->curr_tprob, hmm->curr_tprob, hmm->tmp); + } +} + +void hmm_run_viterbi(hmm_t *hmm, int n, double *eprobs, uint32_t *sites) +{ + // Init arrays when run for the first time + if ( hmm->nvpath < n ) + { + hmm->nvpath = n; + hmm->vpath = (uint8_t*) realloc(hmm->vpath, sizeof(uint8_t)*hmm->nvpath*hmm->nstates); + } + if ( !hmm->vprob ) + { + hmm->vprob = (double*) malloc(sizeof(double)*hmm->nstates); + hmm->vprob_tmp = (double*) malloc(sizeof(double)*hmm->nstates); + } + + // Init all states with equal likelihood + int i,j, nstates = hmm->nstates; + memcpy(hmm->vprob, hmm->state.vit_prob, sizeof(*hmm->state.vit_prob)*nstates); + uint32_t prev_pos = hmm->state.snap_at_pos ? hmm->state.snap_at_pos : sites[0]; + + // Run Viterbi + for (i=0; ivpath[i*nstates]; + double *eprob = &eprobs[i*nstates]; + + int pos_diff = sites[i] == prev_pos ? 0 : sites[i] - prev_pos - 1; + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, prev_pos, sites[i], hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[i]; + + double vnorm = 0; + for (j=0; jvprob[k] * MAT(hmm->curr_tprob,hmm->nstates,j,k); + if ( vmax < pval ) { vmax = pval; k_vmax = k; } + } + vpath[j] = k_vmax; + hmm->vprob_tmp[j] = vmax * eprob[j]; + vnorm += hmm->vprob_tmp[j]; + } + for (j=0; jvprob_tmp[j] /= vnorm; + double *tmp = hmm->vprob; hmm->vprob = hmm->vprob_tmp; hmm->vprob_tmp = tmp; + + if ( hmm->snapshot && sites[i]==hmm->snapshot->snap_at_pos ) + memcpy(hmm->snapshot->vit_prob, hmm->vprob, sizeof(*hmm->vprob)*nstates); + } + + // Find the most likely state + int iptr = 0; + for (i=1; ivprob[iptr] < hmm->vprob[i] ) iptr = i; + + // Trace back the Viterbi path, we are reusing vpath for storing the states (vpath[i*nstates]) + for (i=n-1; i>=0; i--) + { + assert( iptrvpath[i*nstates + iptr]vpath[i*nstates + iptr]; + hmm->vpath[i*nstates] = iptr; // reusing the array for different purpose here + } +} + +void hmm_run_fwd_bwd(hmm_t *hmm, int n, double *eprobs, uint32_t *sites) +{ + // Init arrays when run for the first time + if ( hmm->nfwd < n ) + { + hmm->nfwd = n; + hmm->fwd = (double*) realloc(hmm->fwd, sizeof(double)*(hmm->nfwd+1)*hmm->nstates); + } + if ( !hmm->bwd ) + { + hmm->bwd = (double*) malloc(sizeof(double)*hmm->nstates); + hmm->bwd_tmp = (double*) malloc(sizeof(double)*hmm->nstates); + } + + + int i,j,k, nstates = hmm->nstates; + memcpy(hmm->fwd, hmm->state.fwd_prob, sizeof(*hmm->state.fwd_prob)*nstates); + memcpy(hmm->bwd, hmm->state.bwd_prob, sizeof(*hmm->state.bwd_prob)*nstates); + uint32_t prev_pos = hmm->state.snap_at_pos ? hmm->state.snap_at_pos : sites[0]; + + // Run fwd + for (i=0; ifwd[i*nstates]; + double *fwd = &hmm->fwd[(i+1)*nstates]; + double *eprob = &eprobs[i*nstates]; + + int pos_diff = sites[i] == prev_pos ? 0 : sites[i] - prev_pos - 1; + + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, prev_pos, sites[i], hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[i]; + + double norm = 0; + for (j=0; jcurr_tprob,hmm->nstates,j,k); + fwd[j] = pval * eprob[j]; + norm += fwd[j]; + } + for (j=0; jsnapshot && sites[i]==hmm->snapshot->snap_at_pos ) + memcpy(hmm->snapshot->fwd_prob, fwd, sizeof(*fwd)*nstates); + } + + // Run bwd + double *bwd = hmm->bwd, *bwd_tmp = hmm->bwd_tmp; + prev_pos = sites[n-1]; + for (i=0; ifwd[(n-i)*nstates]; + double *eprob = &eprobs[(n-i-1)*nstates]; + + int pos_diff = sites[n-i-1] == prev_pos ? 0 : prev_pos - sites[n-i-1] - 1; + + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, sites[n-i-1], prev_pos, hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[n-i-1]; + + double bwd_norm = 0; + for (j=0; jcurr_tprob,hmm->nstates,k,j); + bwd_tmp[j] = pval; + bwd_norm += pval; + } + double norm = 0; + for (j=0; jnfwd < n ) + { + hmm->nfwd = n; + hmm->fwd = (double*) realloc(hmm->fwd, sizeof(double)*(hmm->nfwd+1)*hmm->nstates); + } + if ( !hmm->bwd ) + { + hmm->bwd = (double*) malloc(sizeof(double)*hmm->nstates); + hmm->bwd_tmp = (double*) malloc(sizeof(double)*hmm->nstates); + } + + // Init all states with equal likelihood + int i,j,k, nstates = hmm->nstates; + memcpy(hmm->fwd, hmm->state.fwd_prob, sizeof(*hmm->state.fwd_prob)*nstates); + memcpy(hmm->bwd, hmm->state.bwd_prob, sizeof(*hmm->state.bwd_prob)*nstates); + uint32_t prev_pos = hmm->state.snap_at_pos ? hmm->state.snap_at_pos : sites[0]; + + // New transition matrix: temporary values + double *tmp_xi = (double*) calloc(nstates*nstates,sizeof(double)); + double *tmp_gamma = (double*) calloc(nstates,sizeof(double)); + double *fwd_bwd = (double*) malloc(sizeof(double)*nstates); + + // Run fwd + for (i=0; ifwd[i*nstates]; + double *fwd = &hmm->fwd[(i+1)*nstates]; + double *eprob = &eprobs[i*nstates]; + + int pos_diff = sites[i] == prev_pos ? 0 : sites[i] - prev_pos - 1; + + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, prev_pos, sites[i], hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[i]; + + double norm = 0; + for (j=0; jcurr_tprob,hmm->nstates,j,k); + fwd[j] = pval * eprob[j]; + norm += fwd[j]; + } + for (j=0; jbwd, *bwd_tmp = hmm->bwd_tmp; + prev_pos = sites[n-1]; + for (i=0; ifwd[(n-i)*nstates]; + double *eprob = &eprobs[(n-i-1)*nstates]; + + int pos_diff = sites[n-i-1] == prev_pos ? 0 : prev_pos - sites[n-i-1] - 1; + + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, sites[n-i-1], prev_pos, hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[n-i-1]; + + double bwd_norm = 0; + for (j=0; jcurr_tprob,hmm->nstates,k,j); + bwd_tmp[j] = pval; + bwd_norm += pval; + } + double norm = 0; + for (j=0; jtprob_arr,hmm->nstates,k,j)*eprob[k] / norm; + } + } + + for (j=0; jcurr_tprob,nstates,k,j) = MAT(tmp_xi,nstates,k,j) / tmp_gamma[j]; + norm += MAT(hmm->curr_tprob,nstates,k,j); + } + for (k=0; kcurr_tprob,nstates,k,j) /= norm; + } + free(tmp_gamma); + free(tmp_xi); + free(fwd_bwd); + return hmm->curr_tprob; +} + +void hmm_destroy(hmm_t *hmm) +{ + free(hmm->init.vit_prob); + free(hmm->init.fwd_prob); + free(hmm->init.bwd_prob); + free(hmm->state.vit_prob); + free(hmm->state.fwd_prob); + free(hmm->state.bwd_prob); + free(hmm->vprob); + free(hmm->vprob_tmp); + free(hmm->vpath); + free(hmm->curr_tprob); + free(hmm->tmp); + free(hmm->tprob_arr); + free(hmm->fwd); + free(hmm->bwd); + free(hmm->bwd_tmp); + free(hmm); +} + diff --git a/bcftools/HMM.c.pysam.c b/bcftools/HMM.c.pysam.c new file mode 100644 index 0000000..d039367 --- /dev/null +++ b/bcftools/HMM.c.pysam.c @@ -0,0 +1,511 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2014-2017 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include "HMM.h" + +typedef struct +{ + int nstates; // number of hmm's states + uint32_t snap_at_pos; // snapshot at this position, 0 when inactive + double *vit_prob; // viterbi probabilities, NULL for uniform probs + double *fwd_prob; // transition probabilities + double *bwd_prob; // transition probabilities +} +snapshot_t; + +struct _hmm_t +{ + int nstates; // number of states + + double *vprob, *vprob_tmp; // viterbi probs [nstates] + uint8_t *vpath; // viterbi path [nstates*nvpath] + double *bwd, *bwd_tmp; // bwd probs [nstates] + double *fwd; // fwd probs [nstates*(nfwd+1)] + int nvpath, nfwd; + + int ntprob_arr; // number of pre-calculated tprob matrices + double *curr_tprob, *tmp; // Temporary arrays; curr_tprob is short lived, valid only for + // one site (that is, one step of Viterbi algorithm) + double *tprob_arr; // Array of transition matrices, precalculated to ntprob_arr + // positions. The first matrix is the initial tprob matrix + // set by hmm_init() or hmm_set_tprob() + set_tprob_f set_tprob; // Optional user function to set / modify transition probabilities + // at each site (one step of Viterbi algorithm) + void *set_tprob_data; + snapshot_t init, state; // Initial and current state probs. Set state from snapshot if prev_snap_pos!=0 or from init otherwise + snapshot_t *snapshot; // snapshot->snap_at_pos .. request a snapshot at this position + // hmm->state.snap_at_pos .. the current state comes from snapshot made at this position +}; + +uint8_t *hmm_get_viterbi_path(hmm_t *hmm) { return hmm->vpath; } +double *hmm_get_tprob(hmm_t *hmm) { return hmm->tprob_arr; } +int hmm_get_nstates(hmm_t *hmm) { return hmm->nstates; } +double *hmm_get_fwd_bwd_prob(hmm_t *hmm) { return hmm->fwd; } + +static inline void multiply_matrix(int n, double *a, double *b, double *dst, double *tmp) +{ + double *out = dst; + if ( a==dst || b==dst ) + out = tmp; + + int i,j,k; + for (i=0; iinit.snap_at_pos = hmm->state.snap_at_pos = 0; + + if ( !hmm->init.vit_prob ) + hmm->init.vit_prob = (double*) malloc(sizeof(double)*hmm->nstates); + if ( !hmm->init.fwd_prob ) + hmm->init.fwd_prob = (double*) malloc(sizeof(double)*hmm->nstates); + if ( !hmm->init.bwd_prob ) + hmm->init.bwd_prob = (double*) malloc(sizeof(double)*hmm->nstates); + + if ( !hmm->state.vit_prob ) + hmm->state.vit_prob = (double*) malloc(sizeof(double)*hmm->nstates); + if ( !hmm->state.fwd_prob ) + hmm->state.fwd_prob = (double*) malloc(sizeof(double)*hmm->nstates); + if ( !hmm->state.bwd_prob ) + hmm->state.bwd_prob = (double*) malloc(sizeof(double)*hmm->nstates); + + int i; + if ( probs ) + { + memcpy(hmm->init.vit_prob,probs,sizeof(double)*hmm->nstates); + double sum = 0; + for (i=0; instates; i++) sum += hmm->init.vit_prob[i]; + for (i=0; instates; i++) hmm->init.vit_prob[i] /= sum; + } + else + for (i=0; instates; i++) hmm->init.vit_prob[i] = 1./hmm->nstates; + + memcpy(hmm->init.fwd_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); // these remain unchanged + memcpy(hmm->init.bwd_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.vit_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); // can be changed by snapshotting + memcpy(hmm->state.fwd_prob,hmm->init.fwd_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.bwd_prob,hmm->init.bwd_prob,sizeof(double)*hmm->nstates); +} +hmm_t *hmm_init(int nstates, double *tprob, int ntprob) +{ + hmm_t *hmm = (hmm_t*) calloc(1,sizeof(hmm_t)); + hmm->nstates = nstates; + hmm->curr_tprob = (double*) malloc(sizeof(double)*nstates*nstates); + hmm->tmp = (double*) malloc(sizeof(double)*nstates*nstates); + hmm_set_tprob(hmm, tprob, ntprob); + hmm_init_states(hmm, NULL); + return hmm; +} + +void *hmm_snapshot(hmm_t *hmm, void *_snapshot, uint32_t pos) +{ + snapshot_t *snapshot = (snapshot_t*) _snapshot; + if ( snapshot && snapshot->nstates!=hmm->nstates ) + { + free(snapshot); + snapshot = NULL; + } + if ( !snapshot ) + { + // Allocate the snapshot as a single memory block so that it can be + // free()-ed by the user. So make sure the arrays are aligned.. + size_t str_size = sizeof(snapshot_t); + size_t dbl_size = sizeof(double); + size_t pad_size = (dbl_size - str_size % dbl_size) % dbl_size; + uint8_t *mem = (uint8_t*) malloc(str_size + pad_size + dbl_size*2*hmm->nstates); + snapshot = (snapshot_t*) mem; + snapshot->nstates = hmm->nstates; + snapshot->vit_prob = (double*) (mem + str_size + pad_size); + snapshot->fwd_prob = snapshot->vit_prob + hmm->nstates; + } + snapshot->snap_at_pos = pos; + hmm->snapshot = snapshot; + return snapshot; +} +void hmm_restore(hmm_t *hmm, void *_snapshot) +{ + snapshot_t *snapshot = (snapshot_t*) _snapshot; + if ( !snapshot || !snapshot->snap_at_pos ) + { + hmm->state.snap_at_pos = 0; + memcpy(hmm->state.vit_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.fwd_prob,hmm->init.fwd_prob,sizeof(double)*hmm->nstates); + } + else + { + hmm->state.snap_at_pos = snapshot->snap_at_pos; + memcpy(hmm->state.vit_prob,snapshot->vit_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.fwd_prob,snapshot->fwd_prob,sizeof(double)*hmm->nstates); + } +} +void hmm_reset(hmm_t *hmm, void *_snapshot) +{ + snapshot_t *snapshot = (snapshot_t*) _snapshot; + if ( snapshot ) snapshot->snap_at_pos = 0; + hmm->state.snap_at_pos = 0; + memcpy(hmm->state.vit_prob,hmm->init.vit_prob,sizeof(double)*hmm->nstates); + memcpy(hmm->state.fwd_prob,hmm->init.fwd_prob,sizeof(double)*hmm->nstates); +} + +void hmm_set_tprob(hmm_t *hmm, double *tprob, int ntprob) +{ + hmm->ntprob_arr = ntprob; + if ( ntprob<=0 ) ntprob = 1; + + if ( !hmm->tprob_arr ) + hmm->tprob_arr = (double*) malloc(sizeof(double)*hmm->nstates*hmm->nstates*ntprob); + + memcpy(hmm->tprob_arr,tprob,sizeof(double)*hmm->nstates*hmm->nstates); + + int i; + for (i=1; instates, hmm->tprob_arr, hmm->tprob_arr+(i-1)*hmm->nstates*hmm->nstates, hmm->tprob_arr+i*hmm->nstates*hmm->nstates, hmm->tmp); +} + +void hmm_set_tprob_func(hmm_t *hmm, set_tprob_f set_tprob, void *data) +{ + hmm->set_tprob = set_tprob; + hmm->set_tprob_data = data; +} + +static void _set_tprob(hmm_t *hmm, int pos_diff) +{ + assert( pos_diff>=0 ); + + int i, n; + + n = hmm->ntprob_arr ? pos_diff % hmm->ntprob_arr : 0; // n-th precalculated matrix + memcpy(hmm->curr_tprob, hmm->tprob_arr+n*hmm->nstates*hmm->nstates, sizeof(*hmm->curr_tprob)*hmm->nstates*hmm->nstates); + + if ( hmm->ntprob_arr > 0 ) + { + n = pos_diff / hmm->ntprob_arr; // number of full blocks to jump + for (i=0; instates, hmm->tprob_arr+(hmm->ntprob_arr-1)*hmm->nstates*hmm->nstates, hmm->curr_tprob, hmm->curr_tprob, hmm->tmp); + } +} + +void hmm_run_viterbi(hmm_t *hmm, int n, double *eprobs, uint32_t *sites) +{ + // Init arrays when run for the first time + if ( hmm->nvpath < n ) + { + hmm->nvpath = n; + hmm->vpath = (uint8_t*) realloc(hmm->vpath, sizeof(uint8_t)*hmm->nvpath*hmm->nstates); + } + if ( !hmm->vprob ) + { + hmm->vprob = (double*) malloc(sizeof(double)*hmm->nstates); + hmm->vprob_tmp = (double*) malloc(sizeof(double)*hmm->nstates); + } + + // Init all states with equal likelihood + int i,j, nstates = hmm->nstates; + memcpy(hmm->vprob, hmm->state.vit_prob, sizeof(*hmm->state.vit_prob)*nstates); + uint32_t prev_pos = hmm->state.snap_at_pos ? hmm->state.snap_at_pos : sites[0]; + + // Run Viterbi + for (i=0; ivpath[i*nstates]; + double *eprob = &eprobs[i*nstates]; + + int pos_diff = sites[i] == prev_pos ? 0 : sites[i] - prev_pos - 1; + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, prev_pos, sites[i], hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[i]; + + double vnorm = 0; + for (j=0; jvprob[k] * MAT(hmm->curr_tprob,hmm->nstates,j,k); + if ( vmax < pval ) { vmax = pval; k_vmax = k; } + } + vpath[j] = k_vmax; + hmm->vprob_tmp[j] = vmax * eprob[j]; + vnorm += hmm->vprob_tmp[j]; + } + for (j=0; jvprob_tmp[j] /= vnorm; + double *tmp = hmm->vprob; hmm->vprob = hmm->vprob_tmp; hmm->vprob_tmp = tmp; + + if ( hmm->snapshot && sites[i]==hmm->snapshot->snap_at_pos ) + memcpy(hmm->snapshot->vit_prob, hmm->vprob, sizeof(*hmm->vprob)*nstates); + } + + // Find the most likely state + int iptr = 0; + for (i=1; ivprob[iptr] < hmm->vprob[i] ) iptr = i; + + // Trace back the Viterbi path, we are reusing vpath for storing the states (vpath[i*nstates]) + for (i=n-1; i>=0; i--) + { + assert( iptrvpath[i*nstates + iptr]vpath[i*nstates + iptr]; + hmm->vpath[i*nstates] = iptr; // reusing the array for different purpose here + } +} + +void hmm_run_fwd_bwd(hmm_t *hmm, int n, double *eprobs, uint32_t *sites) +{ + // Init arrays when run for the first time + if ( hmm->nfwd < n ) + { + hmm->nfwd = n; + hmm->fwd = (double*) realloc(hmm->fwd, sizeof(double)*(hmm->nfwd+1)*hmm->nstates); + } + if ( !hmm->bwd ) + { + hmm->bwd = (double*) malloc(sizeof(double)*hmm->nstates); + hmm->bwd_tmp = (double*) malloc(sizeof(double)*hmm->nstates); + } + + + int i,j,k, nstates = hmm->nstates; + memcpy(hmm->fwd, hmm->state.fwd_prob, sizeof(*hmm->state.fwd_prob)*nstates); + memcpy(hmm->bwd, hmm->state.bwd_prob, sizeof(*hmm->state.bwd_prob)*nstates); + uint32_t prev_pos = hmm->state.snap_at_pos ? hmm->state.snap_at_pos : sites[0]; + + // Run fwd + for (i=0; ifwd[i*nstates]; + double *fwd = &hmm->fwd[(i+1)*nstates]; + double *eprob = &eprobs[i*nstates]; + + int pos_diff = sites[i] == prev_pos ? 0 : sites[i] - prev_pos - 1; + + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, prev_pos, sites[i], hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[i]; + + double norm = 0; + for (j=0; jcurr_tprob,hmm->nstates,j,k); + fwd[j] = pval * eprob[j]; + norm += fwd[j]; + } + for (j=0; jsnapshot && sites[i]==hmm->snapshot->snap_at_pos ) + memcpy(hmm->snapshot->fwd_prob, fwd, sizeof(*fwd)*nstates); + } + + // Run bwd + double *bwd = hmm->bwd, *bwd_tmp = hmm->bwd_tmp; + prev_pos = sites[n-1]; + for (i=0; ifwd[(n-i)*nstates]; + double *eprob = &eprobs[(n-i-1)*nstates]; + + int pos_diff = sites[n-i-1] == prev_pos ? 0 : prev_pos - sites[n-i-1] - 1; + + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, sites[n-i-1], prev_pos, hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[n-i-1]; + + double bwd_norm = 0; + for (j=0; jcurr_tprob,hmm->nstates,k,j); + bwd_tmp[j] = pval; + bwd_norm += pval; + } + double norm = 0; + for (j=0; jnfwd < n ) + { + hmm->nfwd = n; + hmm->fwd = (double*) realloc(hmm->fwd, sizeof(double)*(hmm->nfwd+1)*hmm->nstates); + } + if ( !hmm->bwd ) + { + hmm->bwd = (double*) malloc(sizeof(double)*hmm->nstates); + hmm->bwd_tmp = (double*) malloc(sizeof(double)*hmm->nstates); + } + + // Init all states with equal likelihood + int i,j,k, nstates = hmm->nstates; + memcpy(hmm->fwd, hmm->state.fwd_prob, sizeof(*hmm->state.fwd_prob)*nstates); + memcpy(hmm->bwd, hmm->state.bwd_prob, sizeof(*hmm->state.bwd_prob)*nstates); + uint32_t prev_pos = hmm->state.snap_at_pos ? hmm->state.snap_at_pos : sites[0]; + + // New transition matrix: temporary values + double *tmp_xi = (double*) calloc(nstates*nstates,sizeof(double)); + double *tmp_gamma = (double*) calloc(nstates,sizeof(double)); + double *fwd_bwd = (double*) malloc(sizeof(double)*nstates); + + // Run fwd + for (i=0; ifwd[i*nstates]; + double *fwd = &hmm->fwd[(i+1)*nstates]; + double *eprob = &eprobs[i*nstates]; + + int pos_diff = sites[i] == prev_pos ? 0 : sites[i] - prev_pos - 1; + + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, prev_pos, sites[i], hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[i]; + + double norm = 0; + for (j=0; jcurr_tprob,hmm->nstates,j,k); + fwd[j] = pval * eprob[j]; + norm += fwd[j]; + } + for (j=0; jbwd, *bwd_tmp = hmm->bwd_tmp; + prev_pos = sites[n-1]; + for (i=0; ifwd[(n-i)*nstates]; + double *eprob = &eprobs[(n-i-1)*nstates]; + + int pos_diff = sites[n-i-1] == prev_pos ? 0 : prev_pos - sites[n-i-1] - 1; + + _set_tprob(hmm, pos_diff); + if ( hmm->set_tprob ) hmm->set_tprob(hmm, sites[n-i-1], prev_pos, hmm->set_tprob_data, hmm->curr_tprob); + prev_pos = sites[n-i-1]; + + double bwd_norm = 0; + for (j=0; jcurr_tprob,hmm->nstates,k,j); + bwd_tmp[j] = pval; + bwd_norm += pval; + } + double norm = 0; + for (j=0; jtprob_arr,hmm->nstates,k,j)*eprob[k] / norm; + } + } + + for (j=0; jcurr_tprob,nstates,k,j) = MAT(tmp_xi,nstates,k,j) / tmp_gamma[j]; + norm += MAT(hmm->curr_tprob,nstates,k,j); + } + for (k=0; kcurr_tprob,nstates,k,j) /= norm; + } + free(tmp_gamma); + free(tmp_xi); + free(fwd_bwd); + return hmm->curr_tprob; +} + +void hmm_destroy(hmm_t *hmm) +{ + free(hmm->init.vit_prob); + free(hmm->init.fwd_prob); + free(hmm->init.bwd_prob); + free(hmm->state.vit_prob); + free(hmm->state.fwd_prob); + free(hmm->state.bwd_prob); + free(hmm->vprob); + free(hmm->vprob_tmp); + free(hmm->vpath); + free(hmm->curr_tprob); + free(hmm->tmp); + free(hmm->tprob_arr); + free(hmm->fwd); + free(hmm->bwd); + free(hmm->bwd_tmp); + free(hmm); +} + diff --git a/bcftools/HMM.h b/bcftools/HMM.h new file mode 100644 index 0000000..3a6cab3 --- /dev/null +++ b/bcftools/HMM.h @@ -0,0 +1,138 @@ +/* The MIT License + + Copyright (c) 2014-2016 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#ifndef __HMM_H__ +#define __HMM_H__ + +#define MAT(matrix,ndim,i,j) (matrix)[(ndim)*(i)+(j)] // P(i|j), that is, transition j->i + +typedef struct _hmm_t hmm_t; + +typedef void (*set_tprob_f) (hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob); + +/** + * hmm_init() - initialize HMM + * @nstates: number of states + * @tprob: transition probabilities matrix (nstates x nstates), for elements ordering + * see the MAT macro above. + * @ntprob: number of precalculated tprob matrices or 0 for constant probs, independent + * of distance + */ +hmm_t *hmm_init(int nstates, double *tprob, int ntprob); +void hmm_set_tprob(hmm_t *hmm, double *tprob, int ntprob); + +#define HMM_VIT 1 +#define HMM_FWD 2 +#define HMM_BWD 4 + +/** + * hmm_init_states() - initial state probabilities + * @probs: initial state probabilities or NULL to reset to default + * + * If uncalled, all states are initialized with the same likelihood + */ +void hmm_init_states(hmm_t *hmm, double *probs); + +/** + * hmm_snapshot() - take the model's snapshot, intended for sliding HMM + * @snapshot: NULL or snapshot returned by previous hmm_snapshot() call, must be free()-ed by the caller + * @pos: take the snapshot at this position + * + * If both restore() and snapshot() are needed, restore() must be called first. + */ +void *hmm_snapshot(hmm_t *hmm, void *snapshot, uint32_t pos); + +/** + * hmm_restore() - restore model's snapshot, intended for sliding HMM + * @snapshot: snapshot returned by hmm_snapshot() call or NULL to reset + * @isite: take the snapshot at i-th step + * + * If both restore() and snapshot() are needed, restore() must be called first. + */ +void hmm_restore(hmm_t *hmm, void *snapshot); +void hmm_reset(hmm_t *hmm, void *snapshot); + +/** + * hmm_get_tprob() - return the array of transition matrices, precalculated + * to ntprob positions. The first matrix is the initial tprob matrix + * set by hmm_init() or hmm_set_tprob() + */ +double *hmm_get_tprob(hmm_t *hmm); +int hmm_get_nstates(hmm_t *hmm); + +/** + * hmm_set_tprob_func() - custom setter of transition probabilities + */ +void hmm_set_tprob_func(hmm_t *hmm, set_tprob_f set_tprob, void *data); + +/** + * hmm_run_viterbi() - run Viterbi algorithm + * @nsites: number of sites + * @eprob: emission probabilities for each site and state (nsites x nstates) + * @sites: list of positions + * + * When done, hmm->vpath[] contains the calculated Viterbi path. The states + * are indexed starting from 0, a state at i-th site can be accessed as + * vpath[nstates*i]. + */ +void hmm_run_viterbi(hmm_t *hmm, int nsites, double *eprob, uint32_t *sites); + +/** + * hmm_get_viterbi_path() - the viterbi path: state at ith site is the + * (nstates*isite)-th element + */ +uint8_t *hmm_get_viterbi_path(hmm_t *hmm); + +/** + * hmm_run_fwd_bwd() - run the forward-backward algorithm + * @nsites: number of sites + * @eprob: emission probabilities for each site and state (nsites x nstates) + * @sites: list of positions + */ +void hmm_run_fwd_bwd(hmm_t *hmm, int nsites, double *eprob, uint32_t *sites); + +/** + * hmm_get_fwd_bwd_prob() - the probability of i-th state at j-th site can + * be accessed as fwd_bwd[j*nstates+i]. + */ +double *hmm_get_fwd_bwd_prob(hmm_t *hmm); + +/** + * hmm_run_baum_welch() - run one iteration of Baum-Welch algorithm + * @nsites: number of sites + * @eprob: emission probabilities for each site and state (nsites x nstates) + * @sites: list of positions + * + * Same as hmm_run_fwd_bwd, in addition a pointer to a matrix with the new + * transition probabilities is returned. In this verison, emission + * probabilities are not updated. + */ +double *hmm_run_baum_welch(hmm_t *hmm, int nsites, double *eprob, uint32_t *sites); + +void hmm_destroy(hmm_t *hmm); + +#endif + diff --git a/bcftools/LICENSE b/bcftools/LICENSE new file mode 100644 index 0000000..f223b09 --- /dev/null +++ b/bcftools/LICENSE @@ -0,0 +1,773 @@ +This software is available to you under a choice of one of two licenses. You +may chose to be licensed under the terms of the MIT/Expat license or the GNU +General Public License (GPL), both included below. If compiled with the GNU +Scientific Library (which is optional and disabled by default as explained in +the INSTALL document), the use of this software is governed by the GPL license. + + +----------------------------------------------------------------------------- + +The MIT/Expat License + +Copyright (C) 2012-2021 Genome Research Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +[The use of a range of years within a copyright notice in this distribution +should be interpreted as being equivalent to a list of years including the +first and last year specified and all consecutive years between them. + +For example, a copyright notice that reads "Copyright (C) 2005, 2007-2009, +2011-2012" should be interpreted as being identical to a notice that reads +"Copyright (C) 2005, 2007, 2008, 2009, 2011, 2012" and a copyright notice +that reads "Copyright (C) 2005-2012" should be interpreted as being identical +to a notice that reads "Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012".] + + +----------------------------------------------------------------------------- + + +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + +----------------------------------------------------------------------------- + +LICENSE FOR VariantKey (https://github.com/Genomicsplc/variantkey) + +The MIT License + +Copyright (c) 2017-2018 GENOMICS plc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +----------------------------------------------------------------------------- + +LICENSE for utlist.h + +Copyright (c) 2007-2014, Troy D. Hanson http://troydhanson.github.com/uthash/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/bcftools/README b/bcftools/README new file mode 100644 index 0000000..fff0cb7 --- /dev/null +++ b/bcftools/README @@ -0,0 +1,27 @@ +BCFtools implements utilities for variant calling (in conjunction with +SAMtools) and manipulating VCF and BCF files. The program is intended +to replace the Perl-based tools from vcftools. + +See INSTALL for building and installation instructions. + +Please cite this paper when using BCFtools for your publications: + +Twelve years of SAMtools and BCFtools +Petr Danecek, James K Bonfield, Jennifer Liddle, John Marshall, Valeriu Ohan, Martin O Pollard, Andrew Whitwham, Thomas Keane, Shane A McCarthy, Robert M Davies, Heng Li +GigaScience, Volume 10, Issue 2, February 2021, giab008, https://doi.org/10.1093/gigascience/giab008 + +@article{10.1093/gigascience/giab008, + author = {Danecek, Petr and Bonfield, James K and Liddle, Jennifer and Marshall, John and Ohan, Valeriu and Pollard, Martin O and Whitwham, Andrew and Keane, Thomas and McCarthy, Shane A and Davies, Robert M and Li, Heng}, + title = "{Twelve years of SAMtools and BCFtools}", + journal = {GigaScience}, + volume = {10}, + number = {2}, + year = {2021}, + month = {02}, + abstract = "{SAMtools and BCFtools are widely used programs for processing and analysing high-throughput sequencing data. They include tools for file format conversion and manipulation, sorting, querying, statistics, variant calling, and effect analysis amongst other methods.The first version appeared online 12 years ago and has been maintained and further developed ever since, with many new features and improvements added over the years. The SAMtools and BCFtools packages represent a unique collection of tools that have been used in numerous other software projects and countless genomic pipelines.Both SAMtools and BCFtools are freely available on GitHub under the permissive MIT licence, free for both non-commercial and commercial use. Both packages have been installed \\>1 million times via Bioconda. The source code and documentation are available from https://www.htslib.org.}", + issn = {2047-217X}, + doi = {10.1093/gigascience/giab008}, + url = {https://doi.org/10.1093/gigascience/giab008}, + note = {giab008}, + eprint = {https://academic.oup.com/gigascience/article-pdf/10/2/giab008/36332246/giab008.pdf}, +} diff --git a/bcftools/abuf.c b/bcftools/abuf.c new file mode 100644 index 0000000..78682d6 --- /dev/null +++ b/bcftools/abuf.c @@ -0,0 +1,802 @@ +/* The MIT License + + Copyright (c) 2021-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include "bcftools.h" +#include "abuf.h" +#include "rbuf.h" + +typedef enum +{ + M_FIRST, M_SUM +} +merge_rule_t; + +typedef struct +{ + kstring_t ref, alt; + int ial; // the index of the original ALT allele, 1-based + int beg, end; // 0-based inclusive offsets to ref,alt +} +atom_t; + +typedef struct +{ + bcf1_t *rec; + int nori, nout; // number of ALTs in the input, and VCF rows on output + uint8_t *tbl; // nori columns, nout rows; indicates allele contribution to output rows, see "The atomization works as follows" below + uint8_t *overlaps; // is the star allele needed for this variant? + atom_t **atoms; + int matoms, mtbl, moverlaps; + char *info_tag; +} +split_t; + +struct _abuf_t +{ + abuf_opt_t mode; + split_t split; + atom_t *atoms; + int natoms, matoms; + const bcf_hdr_t *hdr; + bcf_hdr_t *out_hdr; + bcf1_t **vcf; // dimensions stored in rbuf + rbuf_t rbuf; + + kstring_t tmps; + void *tmp, *tmp2; + int32_t *gt, *tmpi; + int ngt, mgt, ntmpi, mtmpi, mtmp, mtmp2; + int star_allele; +}; + +abuf_t *abuf_init(const bcf_hdr_t *hdr, abuf_opt_t mode) +{ + if ( mode!=SPLIT ) error("todo\n"); + abuf_t *buf = (abuf_t*) calloc(1,sizeof(abuf_t)); + buf->hdr = hdr; + buf->out_hdr = (bcf_hdr_t*) hdr; + buf->mode = mode; + buf->star_allele = 1; + rbuf_init(&buf->rbuf, 0); + return buf; +} + +void abuf_destroy(abuf_t *buf) +{ + int i; + for (i=0; imatoms; i++) + { + free(buf->atoms[i].ref.s); + free(buf->atoms[i].alt.s); + } + free(buf->atoms); + free(buf->split.atoms); + free(buf->split.overlaps); + free(buf->split.tbl); + for (i=0; irbuf.m; i++) + if ( buf->vcf[i] ) bcf_destroy(buf->vcf[i]); + free(buf->vcf); + free(buf->gt); + free(buf->tmpi); + free(buf->tmp); + free(buf->tmp2); + free(buf->tmps.s); + free(buf); +} + +void abuf_set(abuf_t *buf, abuf_opt_t key, void *value) +{ + if ( key==BCF_HDR ) { buf->out_hdr = *((bcf_hdr_t**)value); return; } + if ( key==INFO_TAG ) + { + buf->split.info_tag = *((char**)value); + bcf_hdr_printf(buf->out_hdr,"##INFO=",buf->split.info_tag); + return; + } + if ( key==STAR_ALLELE ) { buf->star_allele = *((int*)value); return; } +} + +/* + Split alleles into primitivs, e.g. + CC>TT becomes C>T,C>T + GCGT>GTGA becomes C>T,T>A + + There is no sequence alignment, just trimming and hungry matching + from left side. +*/ +static void _atomize_allele(abuf_t *buf, bcf1_t *rec, int ial) +{ + // Trim identical sequence from right + char *ref = rec->d.allele[0]; + char *alt = rec->d.allele[ial]; + int rlen = strlen(ref); + int alen = strlen(alt); + while ( rlen>1 && alen>1 && ref[rlen-1]==alt[alen-1] ) rlen--, alen--; + int Mlen = rlen > alen ? rlen : alen; + + atom_t *atom = NULL; + int i; + for (i=0; ialt); + if ( refb!='-' ) { kputc(refb, &atom->ref); atom->end++; } + } + else + { + buf->natoms++; + hts_expand0(atom_t,buf->natoms,buf->matoms,buf->atoms); + atom = &buf->atoms[buf->natoms-1]; + atom->ref.l = 0; + atom->alt.l = 0; + kputc(refb, &atom->ref); + kputc(altb, &atom->alt); + atom->beg = atom->end = i; + atom->ial = ial; + } + continue; + } + if ( i+1>=rlen || i+1>=alen ) // is the next base a deletion? + { + buf->natoms++; + hts_expand0(atom_t,buf->natoms,buf->matoms,buf->atoms); + atom = &buf->atoms[buf->natoms-1]; + atom->ref.l = 0; + atom->alt.l = 0; + kputc(refb, &atom->ref); + kputc(altb, &atom->alt); + atom->beg = atom->end = i; + atom->ial = ial; + } + } +} +static int _atoms_inconsistent(const atom_t *a, const atom_t *b) +{ + if ( a->beg < b->beg ) return -1; + if ( a->beg > b->beg ) return 1; + int rcmp = strcasecmp(a->ref.s,b->ref.s); + if ( rcmp ) return rcmp; + return strcasecmp(a->alt.s,b->alt.s); +} +/* + For reproducibility of tests on different platforms, we need to guarantee the same order of identical + atoms originating from different source ALTs. Even though they are consistent, different values can be + picked for VCF annotations as currently the values from the one that comes first are used. +*/ +static int _cmp_atoms(const void *aptr, const void *bptr) +{ + const atom_t *a = (const atom_t*) aptr; + const atom_t *b = (const atom_t*) bptr; + int rcmp = _atoms_inconsistent(a,b); + if ( rcmp ) return rcmp; + if ( a->ial < b->ial ) return -1; + if ( a->ial > b->ial ) return 1; + return 0; +} +static void _split_table_init(abuf_t *buf, bcf1_t *rec, int natoms) +{ + buf->split.rec = rec; + buf->split.nori = rec->n_allele - 1; + buf->split.nout = 0; + hts_expand(uint8_t,buf->split.nori*natoms,buf->split.mtbl,buf->split.tbl); + hts_expand(atom_t*,natoms,buf->split.matoms,buf->split.atoms); + hts_expand(uint8_t,natoms,buf->split.moverlaps,buf->split.overlaps); + memset(buf->split.overlaps,0,sizeof(*buf->split.overlaps)*natoms); +} +static void _split_table_new(abuf_t *buf, atom_t *atom) +{ + int i, iout = buf->split.nout++; + buf->split.atoms[iout] = atom; + uint8_t *ptr = buf->split.tbl + iout*buf->split.nori; + for (i=0; isplit.nori; i++) ptr[i] = 0; + ptr[atom->ial-1] = 1; +} +static void _split_table_overlap(abuf_t *buf, int iout, atom_t *atom) +{ + uint8_t *ptr = buf->split.tbl + iout*buf->split.nori; + ptr[atom->ial-1] = _atoms_inconsistent(atom,buf->split.atoms[iout]) ? 2 : 1; + buf->split.overlaps[iout] = 1; +} +#if 0 +static void _split_table_print(abuf_t *buf) +{ + int i,j; + for (i=0; isplit.nout; i++) + { + atom_t *atom = buf->split.atoms[i]; + uint8_t *ptr = buf->split.tbl + i*buf->split.nori; + fprintf(stderr,"%d\t%s\t%s",(int)buf->split.rec->pos+1+atom->beg,atom->ref.s,atom->alt.s); + for (j=0; jsplit.nori; j++) fprintf(stderr,"\t%d",(int)ptr[j]); + fprintf(stderr,"\n"); + } +} +static void _split_table_print_atoms(abuf_t *buf) +{ + int i; + for (i=0; inatoms; i++) + { + atom_t *atom = &buf->atoms[i]; + fprintf(stderr,"atom%d %p: ialt=%d %s>%s %d-%d\n",i,atom,atom->ial,atom->ref.s,atom->alt.s,atom->beg,atom->end); + } +} +#endif +static inline uint8_t _has_star_allele(abuf_t *buf, int iout) +{ + if ( !buf->star_allele ) return 0; + return buf->split.overlaps[iout]; +} +static inline int _split_table_get_ial(abuf_t *buf, int irow, int ial) +{ + if ( !ial ) return ial; + return buf->split.tbl[irow*buf->split.nori + ial - 1]; +} +static void _split_table_set_chrom_qual(abuf_t *buf) +{ + int iout,j; + bcf1_t *rec = buf->split.rec; + for (iout=0; ioutsplit.nout; iout++) + { + rbuf_expand0(&buf->rbuf, bcf1_t*, buf->rbuf.n+1, buf->vcf); + j = rbuf_append(&buf->rbuf); + if ( !buf->vcf[j] ) buf->vcf[j] = bcf_init1(); + bcf1_t *out = buf->vcf[j]; + bcf_clear1(out); + + atom_t *atom = buf->split.atoms[iout]; + out->rid = rec->rid; + out->pos = rec->pos + atom->beg; + bcf_update_id(buf->out_hdr, out, rec->d.id); + + const char *als[3]; + als[0] = atom->ref.s; + als[1] = atom->alt.s; + als[2] = "*"; + int nals = _has_star_allele(buf,iout) ? 3 : 2; + bcf_update_alleles(buf->out_hdr, out, als, nals); + + if ( bcf_float_is_missing(rec->qual) ) + bcf_float_set_missing(out->qual); + else + out->qual = rec->qual; + + bcf_update_filter(buf->out_hdr, out, rec->d.flt, rec->d.n_flt); + } +} +int copy_string_field(char *src, int isrc, int src_len, kstring_t *dst, int idst); +static void _split_table_set_info(abuf_t *buf, bcf_info_t *info, merge_rule_t mode) +{ + const char *tag = bcf_hdr_int2id(buf->hdr,BCF_DT_ID,info->key); + int type = bcf_hdr_id2type(buf->hdr,BCF_HL_INFO,info->key); + int len = bcf_hdr_id2length(buf->hdr,BCF_HL_INFO,info->key); + if ( len==BCF_VL_G ) return; // todo: Number=G INFO tags + if ( type==BCF_HT_LONG ) return; // todo: 64bit integers + + bcf1_t *rec = buf->split.rec; + int mtmp = ( type==BCF_HT_INT || type==BCF_HT_REAL ) ? buf->mtmp/4 : buf->mtmp; + int nval = bcf_get_info_values(buf->hdr,rec,tag,&buf->tmp,&mtmp,type); + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) buf->mtmp = mtmp*4; + + // Check for incorrect number of values. Note this check does not consider all values missing + // and will remove annotations that don't pass. + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) + { + if ( (len==BCF_VL_A && nval != rec->n_allele - 1) || (len==BCF_VL_R && nval != rec->n_allele) ) return; + } + + if ( buf->mtmp2 < buf->mtmp ) + { + buf->tmp2 = realloc(buf->tmp2, buf->mtmp); + if ( !buf->tmp2 ) error("Failed to alloc %d bytes\n", buf->mtmp); + buf->mtmp2 = buf->mtmp; + } + + const int num_size = 4; + assert( num_size==sizeof(int32_t) && num_size==sizeof(float) ); + int32_t missing = bcf_int32_missing; + void *missing_ptr = (void*)&missing; + if ( type==BCF_HT_REAL ) bcf_float_set_missing(*((float*)missing_ptr)); + int32_t vector_end = bcf_int32_vector_end; + void *vector_end_ptr = (void*)&vector_end; + if ( type==BCF_HT_REAL ) bcf_float_set_vector_end(*((float*)vector_end_ptr)); + + int iout,i; + for (iout=0; ioutsplit.nout; iout++) + { + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,iout)]; + int star_allele = _has_star_allele(buf,iout); + int ret = 0; + if ( len==BCF_VL_FIXED || len==BCF_VL_VAR ) + ret = bcf_update_info(buf->out_hdr, out, tag, type==BCF_HT_FLAG ? NULL : buf->tmp, nval, type); + else if ( len==BCF_VL_A && type!=BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial - 1; + assert( ioritmp+num_size*iori,num_size) ) + memcpy(buf->tmp2,missing_ptr,num_size); + else + memcpy(buf->tmp2,buf->tmp+num_size*iori,num_size); + if ( star_allele ) + memcpy(buf->tmp2+num_size,missing_ptr,num_size); + ret = bcf_update_info(buf->out_hdr, out, tag, buf->tmp2, 1 + star_allele, type); + } + else if ( len==BCF_VL_A && type==BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial - 1; + kstring_t dst; + dst.l = 0; dst.m = buf->mtmp2; dst.s = (char*)buf->tmp2; + kputc('.',&dst); + if ( star_allele ) kputs(",.",&dst); + copy_string_field(buf->tmp, iori, nval, &dst, 0); + if ( star_allele ) copy_string_field(".", 0, 1, &dst, 1); + buf->mtmp2 = dst.m; + buf->tmp2 = dst.s; + ret = bcf_update_info(buf->out_hdr, out, tag, buf->tmp2, dst.l, type); + } + else if ( len==BCF_VL_R && type!=BCF_HT_STR ) + { + memcpy(buf->tmp2,buf->tmp,num_size); // REF contributes to all records + int iori = buf->split.atoms[iout]->ial; + assert( iorisplit.nori ); + if ( !memcmp(vector_end_ptr,buf->tmp+num_size*iori,num_size) ) + memcpy(buf->tmp2+num_size,missing_ptr,num_size); + else + memcpy(buf->tmp2+num_size,buf->tmp+num_size*iori,num_size); + if ( type==BCF_HT_INT && mode==M_SUM ) + { + uint8_t *tbl = buf->split.tbl + iout*buf->split.nori; + for (i=iori; isplit.nori; i++) + { + if ( tbl[i]==1 ) ((int32_t*)buf->tmp2)[1] += ((int32_t*)buf->tmp)[i+1]; + } + } + if ( star_allele ) + memcpy(buf->tmp2+2*num_size,missing_ptr,num_size); + ret = bcf_update_info(buf->out_hdr, out, tag, buf->tmp2, 2 + star_allele, type); + } + else if ( len==BCF_VL_R && type==BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial - 1; + kstring_t dst; + dst.l = 0; dst.m = buf->mtmp2; dst.s = (char*)buf->tmp2; + kputs(".,.",&dst); + if ( star_allele ) kputs(",.",&dst); + copy_string_field(buf->tmp, 0, nval, &dst, 0); + copy_string_field(buf->tmp, iori+1, nval, &dst, 1); + if ( star_allele ) copy_string_field(".", 0, 1, &dst, 2); + buf->mtmp2 = dst.m; + buf->tmp2 = dst.s; + ret = bcf_update_info(buf->out_hdr, out, tag, buf->tmp2, dst.l, type); + } + if ( ret!=0 ) error("An error occurred while updating INFO/%s\n",tag); + } +} +static void _split_table_set_history(abuf_t *buf) +{ + int i,j; + bcf1_t *rec = buf->split.rec; + buf->tmps.l = 0; + ksprintf(&buf->tmps,"%s|%"PRIhts_pos"|%s|",bcf_seqname(buf->hdr,rec),rec->pos+1,rec->d.allele[0]); + for (i=1; in_allele; i++) + { + kputs(rec->d.allele[i],&buf->tmps); + if ( i+1n_allele ) kputc(',',&buf->tmps); + else kputc(',',&buf->tmps); + } + int len = buf->tmps.l; + buf->tmps.s[buf->tmps.l-1] = '|'; + + for (i=0; isplit.nout; i++) + { + buf->tmps.l = len; + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,i)]; + uint8_t *ptr = buf->split.tbl + i*buf->split.nori; + for (j=0; jsplit.nori; j++) + { + if ( ptr[j]!=1 ) continue; + kputw(j+1,&buf->tmps); + kputc(',',&buf->tmps); + } + buf->tmps.s[--buf->tmps.l] = 0; + if ( (bcf_update_info_string(buf->out_hdr, out, buf->split.info_tag, buf->tmps.s))!=0 ) + error("An error occurred while updating INFO/%s\n",buf->split.info_tag); + } +} +static void _split_table_set_gt(abuf_t *buf) +{ + int nsmpl = bcf_hdr_nsamples(buf->hdr); + if ( !nsmpl ) return; + + bcf1_t *rec = buf->split.rec; + buf->ngt = bcf_get_genotypes(buf->hdr, rec, &buf->gt, &buf->mgt); + if ( buf->ngt<=0 ) return; + else + hts_expand(int32_t,buf->ngt,buf->mtmpi,buf->tmpi); + + int iout,i,j; + for (iout=0; ioutsplit.nout; iout++) + { + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,iout)]; + int star_allele = _has_star_allele(buf,iout); + int max_ploidy = buf->ngt/nsmpl; + int32_t *src = buf->gt, *dst = buf->tmpi; + for (i=0; i=rec->n_allele ) + error("Out-of-bounds genotypes at %s:%"PRIhts_pos"\n",bcf_seqname(buf->hdr,rec),rec->pos+1); + int ial = _split_table_get_ial(buf,iout,iori); + if ( ial==2 && !star_allele ) + { + dst[j] = bcf_gt_missing; + if ( bcf_gt_is_phased(src[j]) ) dst[j] |= 1; + } + else + dst[j] = bcf_gt_is_phased(src[j]) ? bcf_gt_phased(ial) : bcf_gt_unphased(ial); + } + src += max_ploidy; + dst += max_ploidy; + } + bcf_update_genotypes(buf->out_hdr,out,buf->tmpi,buf->ngt); + } +} +static void _split_table_set_format(abuf_t *buf, bcf_fmt_t *fmt, merge_rule_t mode) +{ + int nsmpl = bcf_hdr_nsamples(buf->hdr); + if ( !nsmpl ) return; + + const char *tag = bcf_hdr_int2id(buf->hdr,BCF_DT_ID,fmt->id); + if ( tag[0]=='G' && tag[1]=='T' && !tag[2] ) // FORMAT/GT + { + _split_table_set_gt(buf); + return; + } + + int type = bcf_hdr_id2type(buf->hdr,BCF_HL_FMT,fmt->id); + int len = bcf_hdr_id2length(buf->hdr,BCF_HL_FMT,fmt->id); + if ( type==BCF_HT_STR && len==BCF_VL_G ) return; // possible todo: Number=G for strings + if ( type==BCF_HT_LONG ) return; // todo: 64bit integers + + const int num_size = 4; + assert( num_size==sizeof(int32_t) && num_size==sizeof(float) ); + int32_t missing = bcf_int32_missing; + void *missing_ptr = (void*)&missing; + if ( type==BCF_HT_REAL ) bcf_float_set_missing(*((float*)missing_ptr)); + int32_t vector_end = bcf_int32_vector_end; + void *vector_end_ptr = (void*)&vector_end; + if ( type==BCF_HT_REAL ) bcf_float_set_vector_end(*((float*)vector_end_ptr)); + + bcf1_t *rec = buf->split.rec; + int mtmp = ( type==BCF_HT_INT || type==BCF_HT_REAL ) ? buf->mtmp/num_size : buf->mtmp; // number of items + int nval = bcf_get_format_values(buf->hdr,rec,tag,&buf->tmp,&mtmp,type); + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) buf->mtmp = mtmp*num_size; // number of bytes + + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) + { + if ( len==BCF_VL_G && nval!=nsmpl*rec->n_allele && nval!=nsmpl*rec->n_allele*(rec->n_allele+1)/2 ) return; // not haploid nor diploid + + // Check for incorrect number of values. Note this check does not consider all values missing + // and will remove annotations that don't pass. + if ( (len==BCF_VL_A && nval != nsmpl*(rec->n_allele - 1)) || (len==BCF_VL_R && nval != nsmpl*rec->n_allele) ) return; + } + + // Increase buffer size to accommodate star allele + int nval1 = nval / nsmpl; + mtmp = buf->mtmp; + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) + { + if ( (len==BCF_VL_A || len==BCF_VL_R) && mtmp < num_size*nsmpl*(nval1+1) ) mtmp = num_size*nsmpl*(nval1+1); // +1 for the possibility of the star allele + else if ( len==BCF_VL_G && mtmp < num_size*nsmpl*(nval1+3) ) mtmp = num_size*nsmpl*(nval1+3); + } + else if ( type==BCF_HT_STR ) + { + if ( (len==BCF_VL_A || len==BCF_VL_R) && mtmp < nsmpl*(nval1+2) ) mtmp = nsmpl*(nval1+2); // +2 for the possibility of the star allele, ",." + else if ( len==BCF_VL_G && mtmp < nsmpl*(nval1+6) ) mtmp = nsmpl*(nval1+6); + } + + if ( buf->mtmp2 < mtmp ) + { + buf->tmp2 = realloc(buf->tmp2, mtmp); + if ( !buf->tmp2 ) error("Failed to alloc %d bytes\n", mtmp); + buf->mtmp2 = mtmp; + } + + int iout, i, j; + for (iout=0; ioutsplit.nout; iout++) + { + int star_allele = _has_star_allele(buf,iout); + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,iout)]; + int ret = 0; + if ( len==BCF_VL_FIXED || len==BCF_VL_VAR ) + ret = bcf_update_format(buf->out_hdr, out, tag, buf->tmp, nval, type); + else if ( len==BCF_VL_A && type!=BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial - 1; + assert( ioritmp + nval1*num_size*i; + void *dst = buf->tmp2 + num_size*i*(star_allele+1); + if ( !memcmp(vector_end_ptr,src+iori*num_size,num_size) ) + memcpy(dst,missing_ptr,num_size); + else + memcpy(dst,src+iori*num_size,num_size); + if ( star_allele ) + memcpy(dst+num_size,missing_ptr,num_size); + } + ret = bcf_update_format(buf->out_hdr, out, tag, buf->tmp2, nsmpl*(star_allele+1), type); + } + else if ( (len==BCF_VL_A || len==BCF_VL_R) && type==BCF_HT_STR ) + { + int ioff = len==BCF_VL_R ? 1 : 0; + int iori = buf->split.atoms[iout]->ial - 1; + int nval1_dst = star_allele ? nval1 + 2 : nval1; + memset(buf->tmp2,0,nval1_dst*nsmpl); + for (i=0; itmp2 + nval1_dst*i; + kputc_('.',&dst); + if ( star_allele ) kputsn_(",.",2,&dst); + if ( len==BCF_VL_R ) + { + kputsn_(",.",2,&dst); + copy_string_field(buf->tmp+nval1*i, 0, nval1, &dst, 0); + } + copy_string_field(buf->tmp+nval1*i, iori+ioff, nval1, &dst, 0+ioff); + if ( star_allele ) copy_string_field(".", 0, 1, &dst, 1+ioff); + } + ret = bcf_update_format(buf->out_hdr, out, tag, buf->tmp2, nval1_dst*nsmpl, type); + } + else if ( len==BCF_VL_R && type!=BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial; + assert( iori<=nval ); + for (i=0; itmp + nval1*num_size*i; + void *dst = buf->tmp2 + num_size*i*(star_allele+2); + memcpy(dst,src,num_size); + memcpy(dst+num_size,src+iori*num_size,num_size); + if ( type==BCF_HT_INT && mode==M_SUM ) + { + uint8_t *tbl = buf->split.tbl + iout*buf->split.nori; + for (j=iori; jsplit.nori; j++) + if ( tbl[j]==1 ) ((int32_t*)dst)[1] += ((int32_t*)src)[j+1]; + } + if ( star_allele ) + memcpy(dst+num_size*2,missing_ptr,num_size); + } + ret = bcf_update_format(buf->out_hdr, out, tag, buf->tmp2, nsmpl*(star_allele+2), type); + } + else if ( len==BCF_VL_G && type!=BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial; + int i01 = bcf_alleles2gt(0,iori); + int i11 = bcf_alleles2gt(iori,iori); + assert( ioritmp + i*nval1; \ + type_t *dst = (type_t*)buf->tmp2 + i*3*(1+star_allele); \ + int n=0; /* determine ploidy of this genotype */ \ + while ( ntmp + i*nval1; \ + memcpy(dst++,src,sizeof(type)); \ + int nmiss = 0, nend = 0; \ + if ( n==rec->n_allele ) /* haploid */ \ + { \ + memcpy(dst++,src+iori,sizeof(type)); \ + if ( star_allele ) { nmiss = 1; nend = 3; } \ + else nend = 1; \ + } \ + else if ( n==nval1 ) \ + { \ + memcpy(dst++,src+i01,sizeof(type)); \ + memcpy(dst++,src+i11,sizeof(type)); \ + if ( star_allele ) nmiss = 3; \ + } \ + else if ( n==1 && is_missing ) \ + { \ + if ( star_allele ) nend = 5; \ + else nend = 2; \ + } \ + else \ + error("Incorrect number of values at %s:%"PRIhts_pos" .. tag=FORMAT/%s Number=G nAlleles=%d nValues=%d, %d-th sample\n", \ + bcf_seqname(buf->hdr,rec),rec->pos+1,tag,rec->n_allele,n,i+1); \ + for (j=0; jout_hdr, out, tag, buf->tmp2, 3*(1+star_allele)*nsmpl, type); + } + if ( ret!=0 ) error("An error occurred while updating FORMAT/%s\n",tag); + } +} +static inline int _is_acgtn(char *seq) +{ + while ( *seq ) + { + char c = toupper(*seq); + if ( c!='A' && c!='C' && c!='G' && c!='T' && c!='N' ) return 0; + seq++; + } + return 1; +} +/* + The atomization works as follows: + - Atomize each alternate allele separately by leaving out sequence identical to the reference. No + alignment is performed, just greedy trimming of the end, then from left. This operation returns + a list of atoms (atom_t) which carry fragments of REF,ALT and their positions as 0-based offsets + to the original REF allele + - Sort atoms by POS, REF and ALT. Each unique atom (POS+REF+ALT) forms a new VCF record, each + with a single ALT. + - For each new VCF record determine how to translate the original allele index (iori) to this new + record: + - 1: the original allele matches the atom + - 0: the original allele does not overlap this atom or the overlapping part matches the REF + allele + - 2 (or equivalently "."): there is a mismatch between the original allele and the atom + The mapping is encoded in a table with columns corresponding to the original ALTs and rows + to the new POS+ALTs (atoms). The table is initialized to 0, then we set 1's for matching + atoms and 2's for overlapping mismatching atoms. + + Note that different ALT alleles can result in the same atom (the same output line) and this code + does not know how to reconcile possibly conflicting VCF annotations. This could be improved + and merge logic provided, similarly to `merge -l`. For example, the allelic depths (AD) should + be summed for the same atomized output allele. However, this level of complexity is not addressed + in this initial draft. Higher priority for now is to provide the inverse "join" operation. + + Update 2021-04-09: + Tags QS,AD are now automatically incremented as they should be, for both INFO and FORMAT. + Note that the code will fail on missing values (todo) and it needs to be generalized and + made customizable. +*/ +void _abuf_split(abuf_t *buf, bcf1_t *rec) +{ + int i,j; + if ( rec->n_allele < 2 ) + { + rbuf_expand0(&buf->rbuf, bcf1_t*, buf->rbuf.n+1, buf->vcf); + int j = rbuf_append(&buf->rbuf); + if ( buf->vcf[j] ) bcf_destroy(buf->vcf[j]); + buf->vcf[j] = bcf_dup(rec); + return; + } + for (i=0; in_allele; i++) + { + if ( _is_acgtn(rec->d.allele[i]) ) continue; + rbuf_expand0(&buf->rbuf, bcf1_t*, buf->rbuf.n+1, buf->vcf); + int j = rbuf_append(&buf->rbuf); + if ( buf->vcf[j] ) bcf_destroy(buf->vcf[j]); + buf->vcf[j] = bcf_dup(rec); + return; + } + + buf->natoms = 0; + for (i=1; in_allele; i++) _atomize_allele(buf,rec,i); + qsort(buf->atoms,buf->natoms,sizeof(*buf->atoms),_cmp_atoms); + _split_table_init(buf,rec,buf->natoms); + for (i=0; inatoms; i++) + { + if ( i && !_atoms_inconsistent(&buf->atoms[i-1],&buf->atoms[i]) ) continue; + _split_table_new(buf, &buf->atoms[i]); // add a new unique output atom + } + for (i=0; inatoms; i++) + { + // Looping over sorted list of all atoms with possible duplicates from different source ALT alleles + atom_t *atom = &buf->atoms[i]; + for (j=0; jsplit.nout; j++) + { + atom_t *out = buf->split.atoms[j]; + if ( atom == out ) continue; // table already set to 1 + if ( atom->beg > out->end ) continue; // cannot overlap this output atom + if ( atom->end < out->beg ) break; // this atom is ahead of all subsequent output records + _split_table_overlap(buf, j, atom); + } + } + assert( !buf->rbuf.n ); // all records should be flushed first in the SPLIT mode + + // Create the output records, transferring all annotations: + // CHROM-QUAL + _split_table_set_chrom_qual(buf); + + // INFO + for (i=0; in_info; i++) + { + // this implementation of merging rules is temporary: generalize and made customizable through the API + merge_rule_t mode = M_FIRST; + const char *tag = bcf_hdr_int2id(buf->hdr,BCF_DT_ID,rec->d.info[i].key); + if ( !strcmp(tag,"QS") || !strcmp(tag,"AD") ) mode = M_SUM; + + _split_table_set_info(buf, &rec->d.info[i], mode); + } + + // Set INFO tag showing the original record + if ( buf->split.info_tag ) + _split_table_set_history(buf); + + // FORMAT + for (i=0; in_fmt; i++) + { + // this implementation of merging rules is temporary: generalize and made customizable through the API + merge_rule_t mode = M_FIRST; + const char *tag = bcf_hdr_int2id(buf->hdr,BCF_DT_ID,rec->d.fmt[i].id); + if ( !strcmp(tag,"QS") || !strcmp(tag,"AD") ) mode = M_SUM; + + _split_table_set_format(buf, &rec->d.fmt[i], mode); + } + + // Check that at least one FORMAT field was added, if not, the number of samples must be set manually + for (i=0; isplit.nout; i++) + { + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,i)]; + if ( !out->n_sample ) out->n_sample = rec->n_sample; + } +} + +void abuf_push(abuf_t *buf, bcf1_t *rec) +{ + bcf_unpack(rec, BCF_UN_ALL); + if ( buf->mode==SPLIT ) _abuf_split(buf,rec); +} + +bcf1_t *abuf_flush(abuf_t *buf, int flush_all) +{ + int i; + + if ( buf->rbuf.n==0 ) return NULL; + if ( flush_all ) goto ret; + +ret: + i = rbuf_shift(&buf->rbuf); + return buf->vcf[i]; +} + diff --git a/bcftools/abuf.c.pysam.c b/bcftools/abuf.c.pysam.c new file mode 100644 index 0000000..d85a54c --- /dev/null +++ b/bcftools/abuf.c.pysam.c @@ -0,0 +1,804 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2021-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include "bcftools.h" +#include "abuf.h" +#include "rbuf.h" + +typedef enum +{ + M_FIRST, M_SUM +} +merge_rule_t; + +typedef struct +{ + kstring_t ref, alt; + int ial; // the index of the original ALT allele, 1-based + int beg, end; // 0-based inclusive offsets to ref,alt +} +atom_t; + +typedef struct +{ + bcf1_t *rec; + int nori, nout; // number of ALTs in the input, and VCF rows on output + uint8_t *tbl; // nori columns, nout rows; indicates allele contribution to output rows, see "The atomization works as follows" below + uint8_t *overlaps; // is the star allele needed for this variant? + atom_t **atoms; + int matoms, mtbl, moverlaps; + char *info_tag; +} +split_t; + +struct _abuf_t +{ + abuf_opt_t mode; + split_t split; + atom_t *atoms; + int natoms, matoms; + const bcf_hdr_t *hdr; + bcf_hdr_t *out_hdr; + bcf1_t **vcf; // dimensions stored in rbuf + rbuf_t rbuf; + + kstring_t tmps; + void *tmp, *tmp2; + int32_t *gt, *tmpi; + int ngt, mgt, ntmpi, mtmpi, mtmp, mtmp2; + int star_allele; +}; + +abuf_t *abuf_init(const bcf_hdr_t *hdr, abuf_opt_t mode) +{ + if ( mode!=SPLIT ) error("todo\n"); + abuf_t *buf = (abuf_t*) calloc(1,sizeof(abuf_t)); + buf->hdr = hdr; + buf->out_hdr = (bcf_hdr_t*) hdr; + buf->mode = mode; + buf->star_allele = 1; + rbuf_init(&buf->rbuf, 0); + return buf; +} + +void abuf_destroy(abuf_t *buf) +{ + int i; + for (i=0; imatoms; i++) + { + free(buf->atoms[i].ref.s); + free(buf->atoms[i].alt.s); + } + free(buf->atoms); + free(buf->split.atoms); + free(buf->split.overlaps); + free(buf->split.tbl); + for (i=0; irbuf.m; i++) + if ( buf->vcf[i] ) bcf_destroy(buf->vcf[i]); + free(buf->vcf); + free(buf->gt); + free(buf->tmpi); + free(buf->tmp); + free(buf->tmp2); + free(buf->tmps.s); + free(buf); +} + +void abuf_set(abuf_t *buf, abuf_opt_t key, void *value) +{ + if ( key==BCF_HDR ) { buf->out_hdr = *((bcf_hdr_t**)value); return; } + if ( key==INFO_TAG ) + { + buf->split.info_tag = *((char**)value); + bcf_hdr_printf(buf->out_hdr,"##INFO=",buf->split.info_tag); + return; + } + if ( key==STAR_ALLELE ) { buf->star_allele = *((int*)value); return; } +} + +/* + Split alleles into primitivs, e.g. + CC>TT becomes C>T,C>T + GCGT>GTGA becomes C>T,T>A + + There is no sequence alignment, just trimming and hungry matching + from left side. +*/ +static void _atomize_allele(abuf_t *buf, bcf1_t *rec, int ial) +{ + // Trim identical sequence from right + char *ref = rec->d.allele[0]; + char *alt = rec->d.allele[ial]; + int rlen = strlen(ref); + int alen = strlen(alt); + while ( rlen>1 && alen>1 && ref[rlen-1]==alt[alen-1] ) rlen--, alen--; + int Mlen = rlen > alen ? rlen : alen; + + atom_t *atom = NULL; + int i; + for (i=0; ialt); + if ( refb!='-' ) { kputc(refb, &atom->ref); atom->end++; } + } + else + { + buf->natoms++; + hts_expand0(atom_t,buf->natoms,buf->matoms,buf->atoms); + atom = &buf->atoms[buf->natoms-1]; + atom->ref.l = 0; + atom->alt.l = 0; + kputc(refb, &atom->ref); + kputc(altb, &atom->alt); + atom->beg = atom->end = i; + atom->ial = ial; + } + continue; + } + if ( i+1>=rlen || i+1>=alen ) // is the next base a deletion? + { + buf->natoms++; + hts_expand0(atom_t,buf->natoms,buf->matoms,buf->atoms); + atom = &buf->atoms[buf->natoms-1]; + atom->ref.l = 0; + atom->alt.l = 0; + kputc(refb, &atom->ref); + kputc(altb, &atom->alt); + atom->beg = atom->end = i; + atom->ial = ial; + } + } +} +static int _atoms_inconsistent(const atom_t *a, const atom_t *b) +{ + if ( a->beg < b->beg ) return -1; + if ( a->beg > b->beg ) return 1; + int rcmp = strcasecmp(a->ref.s,b->ref.s); + if ( rcmp ) return rcmp; + return strcasecmp(a->alt.s,b->alt.s); +} +/* + For reproducibility of tests on different platforms, we need to guarantee the same order of identical + atoms originating from different source ALTs. Even though they are consistent, different values can be + picked for VCF annotations as currently the values from the one that comes first are used. +*/ +static int _cmp_atoms(const void *aptr, const void *bptr) +{ + const atom_t *a = (const atom_t*) aptr; + const atom_t *b = (const atom_t*) bptr; + int rcmp = _atoms_inconsistent(a,b); + if ( rcmp ) return rcmp; + if ( a->ial < b->ial ) return -1; + if ( a->ial > b->ial ) return 1; + return 0; +} +static void _split_table_init(abuf_t *buf, bcf1_t *rec, int natoms) +{ + buf->split.rec = rec; + buf->split.nori = rec->n_allele - 1; + buf->split.nout = 0; + hts_expand(uint8_t,buf->split.nori*natoms,buf->split.mtbl,buf->split.tbl); + hts_expand(atom_t*,natoms,buf->split.matoms,buf->split.atoms); + hts_expand(uint8_t,natoms,buf->split.moverlaps,buf->split.overlaps); + memset(buf->split.overlaps,0,sizeof(*buf->split.overlaps)*natoms); +} +static void _split_table_new(abuf_t *buf, atom_t *atom) +{ + int i, iout = buf->split.nout++; + buf->split.atoms[iout] = atom; + uint8_t *ptr = buf->split.tbl + iout*buf->split.nori; + for (i=0; isplit.nori; i++) ptr[i] = 0; + ptr[atom->ial-1] = 1; +} +static void _split_table_overlap(abuf_t *buf, int iout, atom_t *atom) +{ + uint8_t *ptr = buf->split.tbl + iout*buf->split.nori; + ptr[atom->ial-1] = _atoms_inconsistent(atom,buf->split.atoms[iout]) ? 2 : 1; + buf->split.overlaps[iout] = 1; +} +#if 0 +static void _split_table_print(abuf_t *buf) +{ + int i,j; + for (i=0; isplit.nout; i++) + { + atom_t *atom = buf->split.atoms[i]; + uint8_t *ptr = buf->split.tbl + i*buf->split.nori; + fprintf(bcftools_stderr,"%d\t%s\t%s",(int)buf->split.rec->pos+1+atom->beg,atom->ref.s,atom->alt.s); + for (j=0; jsplit.nori; j++) fprintf(bcftools_stderr,"\t%d",(int)ptr[j]); + fprintf(bcftools_stderr,"\n"); + } +} +static void _split_table_print_atoms(abuf_t *buf) +{ + int i; + for (i=0; inatoms; i++) + { + atom_t *atom = &buf->atoms[i]; + fprintf(bcftools_stderr,"atom%d %p: ialt=%d %s>%s %d-%d\n",i,atom,atom->ial,atom->ref.s,atom->alt.s,atom->beg,atom->end); + } +} +#endif +static inline uint8_t _has_star_allele(abuf_t *buf, int iout) +{ + if ( !buf->star_allele ) return 0; + return buf->split.overlaps[iout]; +} +static inline int _split_table_get_ial(abuf_t *buf, int irow, int ial) +{ + if ( !ial ) return ial; + return buf->split.tbl[irow*buf->split.nori + ial - 1]; +} +static void _split_table_set_chrom_qual(abuf_t *buf) +{ + int iout,j; + bcf1_t *rec = buf->split.rec; + for (iout=0; ioutsplit.nout; iout++) + { + rbuf_expand0(&buf->rbuf, bcf1_t*, buf->rbuf.n+1, buf->vcf); + j = rbuf_append(&buf->rbuf); + if ( !buf->vcf[j] ) buf->vcf[j] = bcf_init1(); + bcf1_t *out = buf->vcf[j]; + bcf_clear1(out); + + atom_t *atom = buf->split.atoms[iout]; + out->rid = rec->rid; + out->pos = rec->pos + atom->beg; + bcf_update_id(buf->out_hdr, out, rec->d.id); + + const char *als[3]; + als[0] = atom->ref.s; + als[1] = atom->alt.s; + als[2] = "*"; + int nals = _has_star_allele(buf,iout) ? 3 : 2; + bcf_update_alleles(buf->out_hdr, out, als, nals); + + if ( bcf_float_is_missing(rec->qual) ) + bcf_float_set_missing(out->qual); + else + out->qual = rec->qual; + + bcf_update_filter(buf->out_hdr, out, rec->d.flt, rec->d.n_flt); + } +} +int copy_string_field(char *src, int isrc, int src_len, kstring_t *dst, int idst); +static void _split_table_set_info(abuf_t *buf, bcf_info_t *info, merge_rule_t mode) +{ + const char *tag = bcf_hdr_int2id(buf->hdr,BCF_DT_ID,info->key); + int type = bcf_hdr_id2type(buf->hdr,BCF_HL_INFO,info->key); + int len = bcf_hdr_id2length(buf->hdr,BCF_HL_INFO,info->key); + if ( len==BCF_VL_G ) return; // todo: Number=G INFO tags + if ( type==BCF_HT_LONG ) return; // todo: 64bit integers + + bcf1_t *rec = buf->split.rec; + int mtmp = ( type==BCF_HT_INT || type==BCF_HT_REAL ) ? buf->mtmp/4 : buf->mtmp; + int nval = bcf_get_info_values(buf->hdr,rec,tag,&buf->tmp,&mtmp,type); + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) buf->mtmp = mtmp*4; + + // Check for incorrect number of values. Note this check does not consider all values missing + // and will remove annotations that don't pass. + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) + { + if ( (len==BCF_VL_A && nval != rec->n_allele - 1) || (len==BCF_VL_R && nval != rec->n_allele) ) return; + } + + if ( buf->mtmp2 < buf->mtmp ) + { + buf->tmp2 = realloc(buf->tmp2, buf->mtmp); + if ( !buf->tmp2 ) error("Failed to alloc %d bytes\n", buf->mtmp); + buf->mtmp2 = buf->mtmp; + } + + const int num_size = 4; + assert( num_size==sizeof(int32_t) && num_size==sizeof(float) ); + int32_t missing = bcf_int32_missing; + void *missing_ptr = (void*)&missing; + if ( type==BCF_HT_REAL ) bcf_float_set_missing(*((float*)missing_ptr)); + int32_t vector_end = bcf_int32_vector_end; + void *vector_end_ptr = (void*)&vector_end; + if ( type==BCF_HT_REAL ) bcf_float_set_vector_end(*((float*)vector_end_ptr)); + + int iout,i; + for (iout=0; ioutsplit.nout; iout++) + { + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,iout)]; + int star_allele = _has_star_allele(buf,iout); + int ret = 0; + if ( len==BCF_VL_FIXED || len==BCF_VL_VAR ) + ret = bcf_update_info(buf->out_hdr, out, tag, type==BCF_HT_FLAG ? NULL : buf->tmp, nval, type); + else if ( len==BCF_VL_A && type!=BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial - 1; + assert( ioritmp+num_size*iori,num_size) ) + memcpy(buf->tmp2,missing_ptr,num_size); + else + memcpy(buf->tmp2,buf->tmp+num_size*iori,num_size); + if ( star_allele ) + memcpy(buf->tmp2+num_size,missing_ptr,num_size); + ret = bcf_update_info(buf->out_hdr, out, tag, buf->tmp2, 1 + star_allele, type); + } + else if ( len==BCF_VL_A && type==BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial - 1; + kstring_t dst; + dst.l = 0; dst.m = buf->mtmp2; dst.s = (char*)buf->tmp2; + kputc('.',&dst); + if ( star_allele ) kputs(",.",&dst); + copy_string_field(buf->tmp, iori, nval, &dst, 0); + if ( star_allele ) copy_string_field(".", 0, 1, &dst, 1); + buf->mtmp2 = dst.m; + buf->tmp2 = dst.s; + ret = bcf_update_info(buf->out_hdr, out, tag, buf->tmp2, dst.l, type); + } + else if ( len==BCF_VL_R && type!=BCF_HT_STR ) + { + memcpy(buf->tmp2,buf->tmp,num_size); // REF contributes to all records + int iori = buf->split.atoms[iout]->ial; + assert( iorisplit.nori ); + if ( !memcmp(vector_end_ptr,buf->tmp+num_size*iori,num_size) ) + memcpy(buf->tmp2+num_size,missing_ptr,num_size); + else + memcpy(buf->tmp2+num_size,buf->tmp+num_size*iori,num_size); + if ( type==BCF_HT_INT && mode==M_SUM ) + { + uint8_t *tbl = buf->split.tbl + iout*buf->split.nori; + for (i=iori; isplit.nori; i++) + { + if ( tbl[i]==1 ) ((int32_t*)buf->tmp2)[1] += ((int32_t*)buf->tmp)[i+1]; + } + } + if ( star_allele ) + memcpy(buf->tmp2+2*num_size,missing_ptr,num_size); + ret = bcf_update_info(buf->out_hdr, out, tag, buf->tmp2, 2 + star_allele, type); + } + else if ( len==BCF_VL_R && type==BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial - 1; + kstring_t dst; + dst.l = 0; dst.m = buf->mtmp2; dst.s = (char*)buf->tmp2; + kputs(".,.",&dst); + if ( star_allele ) kputs(",.",&dst); + copy_string_field(buf->tmp, 0, nval, &dst, 0); + copy_string_field(buf->tmp, iori+1, nval, &dst, 1); + if ( star_allele ) copy_string_field(".", 0, 1, &dst, 2); + buf->mtmp2 = dst.m; + buf->tmp2 = dst.s; + ret = bcf_update_info(buf->out_hdr, out, tag, buf->tmp2, dst.l, type); + } + if ( ret!=0 ) error("An error occurred while updating INFO/%s\n",tag); + } +} +static void _split_table_set_history(abuf_t *buf) +{ + int i,j; + bcf1_t *rec = buf->split.rec; + buf->tmps.l = 0; + ksprintf(&buf->tmps,"%s|%"PRIhts_pos"|%s|",bcf_seqname(buf->hdr,rec),rec->pos+1,rec->d.allele[0]); + for (i=1; in_allele; i++) + { + kputs(rec->d.allele[i],&buf->tmps); + if ( i+1n_allele ) kputc(',',&buf->tmps); + else kputc(',',&buf->tmps); + } + int len = buf->tmps.l; + buf->tmps.s[buf->tmps.l-1] = '|'; + + for (i=0; isplit.nout; i++) + { + buf->tmps.l = len; + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,i)]; + uint8_t *ptr = buf->split.tbl + i*buf->split.nori; + for (j=0; jsplit.nori; j++) + { + if ( ptr[j]!=1 ) continue; + kputw(j+1,&buf->tmps); + kputc(',',&buf->tmps); + } + buf->tmps.s[--buf->tmps.l] = 0; + if ( (bcf_update_info_string(buf->out_hdr, out, buf->split.info_tag, buf->tmps.s))!=0 ) + error("An error occurred while updating INFO/%s\n",buf->split.info_tag); + } +} +static void _split_table_set_gt(abuf_t *buf) +{ + int nsmpl = bcf_hdr_nsamples(buf->hdr); + if ( !nsmpl ) return; + + bcf1_t *rec = buf->split.rec; + buf->ngt = bcf_get_genotypes(buf->hdr, rec, &buf->gt, &buf->mgt); + if ( buf->ngt<=0 ) return; + else + hts_expand(int32_t,buf->ngt,buf->mtmpi,buf->tmpi); + + int iout,i,j; + for (iout=0; ioutsplit.nout; iout++) + { + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,iout)]; + int star_allele = _has_star_allele(buf,iout); + int max_ploidy = buf->ngt/nsmpl; + int32_t *src = buf->gt, *dst = buf->tmpi; + for (i=0; i=rec->n_allele ) + error("Out-of-bounds genotypes at %s:%"PRIhts_pos"\n",bcf_seqname(buf->hdr,rec),rec->pos+1); + int ial = _split_table_get_ial(buf,iout,iori); + if ( ial==2 && !star_allele ) + { + dst[j] = bcf_gt_missing; + if ( bcf_gt_is_phased(src[j]) ) dst[j] |= 1; + } + else + dst[j] = bcf_gt_is_phased(src[j]) ? bcf_gt_phased(ial) : bcf_gt_unphased(ial); + } + src += max_ploidy; + dst += max_ploidy; + } + bcf_update_genotypes(buf->out_hdr,out,buf->tmpi,buf->ngt); + } +} +static void _split_table_set_format(abuf_t *buf, bcf_fmt_t *fmt, merge_rule_t mode) +{ + int nsmpl = bcf_hdr_nsamples(buf->hdr); + if ( !nsmpl ) return; + + const char *tag = bcf_hdr_int2id(buf->hdr,BCF_DT_ID,fmt->id); + if ( tag[0]=='G' && tag[1]=='T' && !tag[2] ) // FORMAT/GT + { + _split_table_set_gt(buf); + return; + } + + int type = bcf_hdr_id2type(buf->hdr,BCF_HL_FMT,fmt->id); + int len = bcf_hdr_id2length(buf->hdr,BCF_HL_FMT,fmt->id); + if ( type==BCF_HT_STR && len==BCF_VL_G ) return; // possible todo: Number=G for strings + if ( type==BCF_HT_LONG ) return; // todo: 64bit integers + + const int num_size = 4; + assert( num_size==sizeof(int32_t) && num_size==sizeof(float) ); + int32_t missing = bcf_int32_missing; + void *missing_ptr = (void*)&missing; + if ( type==BCF_HT_REAL ) bcf_float_set_missing(*((float*)missing_ptr)); + int32_t vector_end = bcf_int32_vector_end; + void *vector_end_ptr = (void*)&vector_end; + if ( type==BCF_HT_REAL ) bcf_float_set_vector_end(*((float*)vector_end_ptr)); + + bcf1_t *rec = buf->split.rec; + int mtmp = ( type==BCF_HT_INT || type==BCF_HT_REAL ) ? buf->mtmp/num_size : buf->mtmp; // number of items + int nval = bcf_get_format_values(buf->hdr,rec,tag,&buf->tmp,&mtmp,type); + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) buf->mtmp = mtmp*num_size; // number of bytes + + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) + { + if ( len==BCF_VL_G && nval!=nsmpl*rec->n_allele && nval!=nsmpl*rec->n_allele*(rec->n_allele+1)/2 ) return; // not haploid nor diploid + + // Check for incorrect number of values. Note this check does not consider all values missing + // and will remove annotations that don't pass. + if ( (len==BCF_VL_A && nval != nsmpl*(rec->n_allele - 1)) || (len==BCF_VL_R && nval != nsmpl*rec->n_allele) ) return; + } + + // Increase buffer size to accommodate star allele + int nval1 = nval / nsmpl; + mtmp = buf->mtmp; + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) + { + if ( (len==BCF_VL_A || len==BCF_VL_R) && mtmp < num_size*nsmpl*(nval1+1) ) mtmp = num_size*nsmpl*(nval1+1); // +1 for the possibility of the star allele + else if ( len==BCF_VL_G && mtmp < num_size*nsmpl*(nval1+3) ) mtmp = num_size*nsmpl*(nval1+3); + } + else if ( type==BCF_HT_STR ) + { + if ( (len==BCF_VL_A || len==BCF_VL_R) && mtmp < nsmpl*(nval1+2) ) mtmp = nsmpl*(nval1+2); // +2 for the possibility of the star allele, ",." + else if ( len==BCF_VL_G && mtmp < nsmpl*(nval1+6) ) mtmp = nsmpl*(nval1+6); + } + + if ( buf->mtmp2 < mtmp ) + { + buf->tmp2 = realloc(buf->tmp2, mtmp); + if ( !buf->tmp2 ) error("Failed to alloc %d bytes\n", mtmp); + buf->mtmp2 = mtmp; + } + + int iout, i, j; + for (iout=0; ioutsplit.nout; iout++) + { + int star_allele = _has_star_allele(buf,iout); + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,iout)]; + int ret = 0; + if ( len==BCF_VL_FIXED || len==BCF_VL_VAR ) + ret = bcf_update_format(buf->out_hdr, out, tag, buf->tmp, nval, type); + else if ( len==BCF_VL_A && type!=BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial - 1; + assert( ioritmp + nval1*num_size*i; + void *dst = buf->tmp2 + num_size*i*(star_allele+1); + if ( !memcmp(vector_end_ptr,src+iori*num_size,num_size) ) + memcpy(dst,missing_ptr,num_size); + else + memcpy(dst,src+iori*num_size,num_size); + if ( star_allele ) + memcpy(dst+num_size,missing_ptr,num_size); + } + ret = bcf_update_format(buf->out_hdr, out, tag, buf->tmp2, nsmpl*(star_allele+1), type); + } + else if ( (len==BCF_VL_A || len==BCF_VL_R) && type==BCF_HT_STR ) + { + int ioff = len==BCF_VL_R ? 1 : 0; + int iori = buf->split.atoms[iout]->ial - 1; + int nval1_dst = star_allele ? nval1 + 2 : nval1; + memset(buf->tmp2,0,nval1_dst*nsmpl); + for (i=0; itmp2 + nval1_dst*i; + kputc_('.',&dst); + if ( star_allele ) kputsn_(",.",2,&dst); + if ( len==BCF_VL_R ) + { + kputsn_(",.",2,&dst); + copy_string_field(buf->tmp+nval1*i, 0, nval1, &dst, 0); + } + copy_string_field(buf->tmp+nval1*i, iori+ioff, nval1, &dst, 0+ioff); + if ( star_allele ) copy_string_field(".", 0, 1, &dst, 1+ioff); + } + ret = bcf_update_format(buf->out_hdr, out, tag, buf->tmp2, nval1_dst*nsmpl, type); + } + else if ( len==BCF_VL_R && type!=BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial; + assert( iori<=nval ); + for (i=0; itmp + nval1*num_size*i; + void *dst = buf->tmp2 + num_size*i*(star_allele+2); + memcpy(dst,src,num_size); + memcpy(dst+num_size,src+iori*num_size,num_size); + if ( type==BCF_HT_INT && mode==M_SUM ) + { + uint8_t *tbl = buf->split.tbl + iout*buf->split.nori; + for (j=iori; jsplit.nori; j++) + if ( tbl[j]==1 ) ((int32_t*)dst)[1] += ((int32_t*)src)[j+1]; + } + if ( star_allele ) + memcpy(dst+num_size*2,missing_ptr,num_size); + } + ret = bcf_update_format(buf->out_hdr, out, tag, buf->tmp2, nsmpl*(star_allele+2), type); + } + else if ( len==BCF_VL_G && type!=BCF_HT_STR ) + { + int iori = buf->split.atoms[iout]->ial; + int i01 = bcf_alleles2gt(0,iori); + int i11 = bcf_alleles2gt(iori,iori); + assert( ioritmp + i*nval1; \ + type_t *dst = (type_t*)buf->tmp2 + i*3*(1+star_allele); \ + int n=0; /* determine ploidy of this genotype */ \ + while ( ntmp + i*nval1; \ + memcpy(dst++,src,sizeof(type)); \ + int nmiss = 0, nend = 0; \ + if ( n==rec->n_allele ) /* haploid */ \ + { \ + memcpy(dst++,src+iori,sizeof(type)); \ + if ( star_allele ) { nmiss = 1; nend = 3; } \ + else nend = 1; \ + } \ + else if ( n==nval1 ) \ + { \ + memcpy(dst++,src+i01,sizeof(type)); \ + memcpy(dst++,src+i11,sizeof(type)); \ + if ( star_allele ) nmiss = 3; \ + } \ + else if ( n==1 && is_missing ) \ + { \ + if ( star_allele ) nend = 5; \ + else nend = 2; \ + } \ + else \ + error("Incorrect number of values at %s:%"PRIhts_pos" .. tag=FORMAT/%s Number=G nAlleles=%d nValues=%d, %d-th sample\n", \ + bcf_seqname(buf->hdr,rec),rec->pos+1,tag,rec->n_allele,n,i+1); \ + for (j=0; jout_hdr, out, tag, buf->tmp2, 3*(1+star_allele)*nsmpl, type); + } + if ( ret!=0 ) error("An error occurred while updating FORMAT/%s\n",tag); + } +} +static inline int _is_acgtn(char *seq) +{ + while ( *seq ) + { + char c = toupper(*seq); + if ( c!='A' && c!='C' && c!='G' && c!='T' && c!='N' ) return 0; + seq++; + } + return 1; +} +/* + The atomization works as follows: + - Atomize each alternate allele separately by leaving out sequence identical to the reference. No + alignment is performed, just greedy trimming of the end, then from left. This operation returns + a list of atoms (atom_t) which carry fragments of REF,ALT and their positions as 0-based offsets + to the original REF allele + - Sort atoms by POS, REF and ALT. Each unique atom (POS+REF+ALT) forms a new VCF record, each + with a single ALT. + - For each new VCF record determine how to translate the original allele index (iori) to this new + record: + - 1: the original allele matches the atom + - 0: the original allele does not overlap this atom or the overlapping part matches the REF + allele + - 2 (or equivalently "."): there is a mismatch between the original allele and the atom + The mapping is encoded in a table with columns corresponding to the original ALTs and rows + to the new POS+ALTs (atoms). The table is initialized to 0, then we set 1's for matching + atoms and 2's for overlapping mismatching atoms. + + Note that different ALT alleles can result in the same atom (the same output line) and this code + does not know how to reconcile possibly conflicting VCF annotations. This could be improved + and merge logic provided, similarly to `merge -l`. For example, the allelic depths (AD) should + be summed for the same atomized output allele. However, this level of complexity is not addressed + in this initial draft. Higher priority for now is to provide the inverse "join" operation. + + Update 2021-04-09: + Tags QS,AD are now automatically incremented as they should be, for both INFO and FORMAT. + Note that the code will fail on missing values (todo) and it needs to be generalized and + made customizable. +*/ +void _abuf_split(abuf_t *buf, bcf1_t *rec) +{ + int i,j; + if ( rec->n_allele < 2 ) + { + rbuf_expand0(&buf->rbuf, bcf1_t*, buf->rbuf.n+1, buf->vcf); + int j = rbuf_append(&buf->rbuf); + if ( buf->vcf[j] ) bcf_destroy(buf->vcf[j]); + buf->vcf[j] = bcf_dup(rec); + return; + } + for (i=0; in_allele; i++) + { + if ( _is_acgtn(rec->d.allele[i]) ) continue; + rbuf_expand0(&buf->rbuf, bcf1_t*, buf->rbuf.n+1, buf->vcf); + int j = rbuf_append(&buf->rbuf); + if ( buf->vcf[j] ) bcf_destroy(buf->vcf[j]); + buf->vcf[j] = bcf_dup(rec); + return; + } + + buf->natoms = 0; + for (i=1; in_allele; i++) _atomize_allele(buf,rec,i); + qsort(buf->atoms,buf->natoms,sizeof(*buf->atoms),_cmp_atoms); + _split_table_init(buf,rec,buf->natoms); + for (i=0; inatoms; i++) + { + if ( i && !_atoms_inconsistent(&buf->atoms[i-1],&buf->atoms[i]) ) continue; + _split_table_new(buf, &buf->atoms[i]); // add a new unique output atom + } + for (i=0; inatoms; i++) + { + // Looping over sorted list of all atoms with possible duplicates from different source ALT alleles + atom_t *atom = &buf->atoms[i]; + for (j=0; jsplit.nout; j++) + { + atom_t *out = buf->split.atoms[j]; + if ( atom == out ) continue; // table already set to 1 + if ( atom->beg > out->end ) continue; // cannot overlap this output atom + if ( atom->end < out->beg ) break; // this atom is ahead of all subsequent output records + _split_table_overlap(buf, j, atom); + } + } + assert( !buf->rbuf.n ); // all records should be flushed first in the SPLIT mode + + // Create the output records, transferring all annotations: + // CHROM-QUAL + _split_table_set_chrom_qual(buf); + + // INFO + for (i=0; in_info; i++) + { + // this implementation of merging rules is temporary: generalize and made customizable through the API + merge_rule_t mode = M_FIRST; + const char *tag = bcf_hdr_int2id(buf->hdr,BCF_DT_ID,rec->d.info[i].key); + if ( !strcmp(tag,"QS") || !strcmp(tag,"AD") ) mode = M_SUM; + + _split_table_set_info(buf, &rec->d.info[i], mode); + } + + // Set INFO tag showing the original record + if ( buf->split.info_tag ) + _split_table_set_history(buf); + + // FORMAT + for (i=0; in_fmt; i++) + { + // this implementation of merging rules is temporary: generalize and made customizable through the API + merge_rule_t mode = M_FIRST; + const char *tag = bcf_hdr_int2id(buf->hdr,BCF_DT_ID,rec->d.fmt[i].id); + if ( !strcmp(tag,"QS") || !strcmp(tag,"AD") ) mode = M_SUM; + + _split_table_set_format(buf, &rec->d.fmt[i], mode); + } + + // Check that at least one FORMAT field was added, if not, the number of samples must be set manually + for (i=0; isplit.nout; i++) + { + bcf1_t *out = buf->vcf[rbuf_kth(&buf->rbuf,i)]; + if ( !out->n_sample ) out->n_sample = rec->n_sample; + } +} + +void abuf_push(abuf_t *buf, bcf1_t *rec) +{ + bcf_unpack(rec, BCF_UN_ALL); + if ( buf->mode==SPLIT ) _abuf_split(buf,rec); +} + +bcf1_t *abuf_flush(abuf_t *buf, int flush_all) +{ + int i; + + if ( buf->rbuf.n==0 ) return NULL; + if ( flush_all ) goto ret; + +ret: + i = rbuf_shift(&buf->rbuf); + return buf->vcf[i]; +} + diff --git a/bcftools/abuf.h b/bcftools/abuf.h new file mode 100644 index 0000000..5fc1e00 --- /dev/null +++ b/bcftools/abuf.h @@ -0,0 +1,78 @@ +/* The MIT License + + Copyright (c) 2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +/* + Atomize/deatomize complex variants +*/ + +#ifndef __ABUF_H__ +#define __ABUF_H__ + +#include + +typedef struct _abuf_t abuf_t; + +// Modes of operation +typedef enum +{ + NONE, + + // mode of operation, to be passed to abuf_init + SPLIT, + JOIN, + + BCF_HDR, // should the records be annotated, a writable bcf header is required + INFO_TAG, // set BCF_HDR first + STAR_ALLELE // 1: use STAR allele (the default), 0: set overlaps to missing +} +abuf_opt_t; + +#define abuf_set_opt(buf,type,key,value) { type tmp = value; abuf_set(buf, key, (void*)&tmp); } +void abuf_set(abuf_t *buf, abuf_opt_t key, void *value); + +/* + * abuf_init() - init buffer + * @win: number of sites (>0) or bp (<0) + */ +abuf_t *abuf_init(const bcf_hdr_t *hdr, abuf_opt_t mode); +void abuf_destroy(abuf_t *buf); + +/* + * abuf_push() - Push a new site for analysis + */ +void abuf_push(abuf_t *buf, bcf1_t *rec); + +/* + * abuf_flush() - Return next buffered record + * @flush_all: Set to 1 if no more overlapping records are coming (e.g. end of chromosome or end of file), + * the buffer can be emptied. + * return: The next atomized/deatomized VCF record or NULL if no record is ready. The returned + * structure will be cleaned by abuf. + */ +bcf1_t *abuf_flush(abuf_t *buf, int flush_all); + +#endif + diff --git a/bcftools/bam2bcf.c b/bcftools/bam2bcf.c new file mode 100644 index 0000000..d373e99 --- /dev/null +++ b/bcftools/bam2bcf.c @@ -0,0 +1,1232 @@ +/* bam2bcf.c -- variant calling. + + Copyright (C) 2010-2012 Broad Institute. + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "bam2bcf.h" + +extern void ks_introsort_uint32_t(size_t n, uint32_t a[]); + +#define CALL_DEFTHETA 0.83 +#define DEF_MAPQ 20 + +#define CAP_DIST 25 + +bcf_callaux_t *bcf_call_init(double theta, int min_baseQ, int max_baseQ, + int delta_baseQ) +{ + bcf_callaux_t *bca; + if (theta <= 0.) theta = CALL_DEFTHETA; + bca = (bcf_callaux_t*) calloc(1, sizeof(bcf_callaux_t)); + bca->capQ = 60; + bca->openQ = 40; bca->extQ = 20; bca->tandemQ = 100; + bca->min_baseQ = min_baseQ; + bca->max_baseQ = max_baseQ; + bca->delta_baseQ = delta_baseQ; + bca->e = errmod_init(1. - theta); + bca->min_frac = 0.002; + bca->min_support = 1; + bca->per_sample_flt = 0; + bca->npos = 100; + bca->ref_pos = (int*) malloc(bca->npos*sizeof(int)); + bca->alt_pos = (int*) malloc(bca->npos*sizeof(int)); + bca->iref_pos= (int*) malloc(bca->npos*sizeof(int)); + bca->ialt_pos= (int*) malloc(bca->npos*sizeof(int)); + bca->nqual = 60; + bca->ref_mq = (int*) malloc(bca->nqual*sizeof(int)); + bca->alt_mq = (int*) malloc(bca->nqual*sizeof(int)); + bca->iref_mq = (int*) malloc(bca->nqual*sizeof(int)); + bca->ialt_mq = (int*) malloc(bca->nqual*sizeof(int)); + bca->ref_bq = (int*) malloc(bca->nqual*sizeof(int)); + bca->alt_bq = (int*) malloc(bca->nqual*sizeof(int)); + bca->fwd_mqs = (int*) malloc(bca->nqual*sizeof(int)); + bca->rev_mqs = (int*) malloc(bca->nqual*sizeof(int)); + return bca; +} + +void bcf_call_destroy(bcf_callaux_t *bca) +{ + if (bca == 0) return; + errmod_destroy(bca->e); + if (bca->npos) { + free(bca->ref_pos); free(bca->alt_pos); + free(bca->iref_pos); free(bca->ialt_pos); + bca->npos = 0; + } + free(bca->ref_mq); free(bca->alt_mq); + free(bca->iref_mq); free(bca->ialt_mq); + free(bca->ref_bq); free(bca->alt_bq); + free(bca->fwd_mqs); free(bca->rev_mqs); + bca->nqual = 0; + free(bca->bases); free(bca->inscns); free(bca); +} + +static int get_aux_nm(bam1_t *rec, int32_t qpos, int is_ref) +{ + uint8_t *nm_tag = bam_aux_get(rec, "NM"); + if ( !nm_tag ) return -1; + int64_t nm = bam_aux2i(nm_tag); + + // Count indels as single events, not as the number of inserted/deleted + // bases (which is what NM does). Add soft clips as mismatches. + int i; + for (i=0; i < rec->core.n_cigar; i++) + { + int val = bam_get_cigar(rec)[i] & BAM_CIGAR_MASK; + if ( val==BAM_CSOFT_CLIP ) + { + nm += bam_get_cigar(rec)[i] >> BAM_CIGAR_SHIFT; + } + else if ( val==BAM_CINS || val==BAM_CDEL ) + { + val = bam_get_cigar(rec)[i] >> BAM_CIGAR_SHIFT; + if ( val > 1 ) nm -= val - 1; + } + } + + // Take into account MNPs, 2% of de novo SNVs appear within 20bp of another de novo SNV + // http://www.genome.org/cgi/doi/10.1101/gr.239756.118 + nm -= is_ref ? 1 : 2; + + if ( nm < 0 ) nm = 0; + if ( nm >= B2B_N_NM ) nm = B2B_N_NM - 1; + + return nm; +} + +// position in the sequence with respect to the aligned part of the read +static int get_position(const bam_pileup1_t *p, int *len, + int *sc_len, int *sc_dist) { + int i, j, edist = p->qpos + 1; + int sc_left = 0, sc_right = 0; + int sc_left_dist = -1, sc_right_dist = -1; + + // left end + for (i = 0; i < p->b->core.n_cigar; i++) { + int cig = bam_get_cigar(p->b)[i] & BAM_CIGAR_MASK; + if (cig == BAM_CHARD_CLIP) + continue; + else if (cig == BAM_CSOFT_CLIP) + sc_left += bam_get_cigar(p->b)[i] >> BAM_CIGAR_SHIFT; + else + break; + } + if (sc_left) + sc_left_dist = p->qpos+1 - sc_left; + edist -= sc_left; + + // right end + for (j = p->b->core.n_cigar-1; j >= i; j--) { + int cig = bam_get_cigar(p->b)[j] & BAM_CIGAR_MASK; + if (cig == BAM_CHARD_CLIP) + continue; + else if (cig == BAM_CSOFT_CLIP) + sc_right += bam_get_cigar(p->b)[j] >> BAM_CIGAR_SHIFT; + else + break; + } + if (sc_right) + sc_right_dist = p->b->core.l_qseq - sc_right - p->qpos; + + // Distance to nearest soft-clips and length of that clip. + if (sc_left_dist >= 0) { + if (sc_right_dist < 0 || sc_left_dist < sc_right_dist) { + *sc_len = sc_left; + *sc_dist = sc_left_dist; + } + } else if (sc_right_dist >= 0) { + *sc_len = sc_right; + *sc_dist = sc_right_dist; + } else { + *sc_len = 0; + *sc_dist = 0; + } + + *len = p->b->core.l_qseq - sc_left - sc_right; + return edist; +} + +void bcf_callaux_clean(bcf_callaux_t *bca, bcf_call_t *call) +{ + memset(bca->ref_pos,0,sizeof(int)*bca->npos); + memset(bca->alt_pos,0,sizeof(int)*bca->npos); + memset(bca->iref_pos,0,sizeof(int)*bca->npos); + memset(bca->ialt_pos,0,sizeof(int)*bca->npos); + memset(bca->ref_mq,0,sizeof(int)*bca->nqual); + memset(bca->alt_mq,0,sizeof(int)*bca->nqual); + memset(bca->iref_mq,0,sizeof(int)*bca->nqual); + memset(bca->ialt_mq,0,sizeof(int)*bca->nqual); + memset(bca->ref_bq,0,sizeof(int)*bca->nqual); + memset(bca->alt_bq,0,sizeof(int)*bca->nqual); + memset(bca->fwd_mqs,0,sizeof(int)*bca->nqual); + memset(bca->rev_mqs,0,sizeof(int)*bca->nqual); + if ( call->ADF ) memset(call->ADF,0,sizeof(int32_t)*(call->n+1)*B2B_MAX_ALLELES); + if ( call->ADR ) memset(call->ADR,0,sizeof(int32_t)*(call->n+1)*B2B_MAX_ALLELES); + if ( call->SCR ) memset(call->SCR,0,sizeof(*call->SCR)*(call->n+1)); + if ( call->SCR ) memset(call->SCR,0,sizeof(*call->SCR)*(call->n+1)); + if ( bca->fmt_flag&B2B_FMT_NMBZ ) + { + memset(call->ref_nm,0,sizeof(*call->ref_nm)*(call->n+1)*B2B_N_NM); + memset(call->alt_nm,0,sizeof(*call->alt_nm)*(call->n+1)*B2B_N_NM); + } + else + { + memset(call->ref_nm,0,sizeof(*call->ref_nm)*B2B_N_NM); + memset(call->alt_nm,0,sizeof(*call->alt_nm)*B2B_N_NM); + } + memset(call->QS,0,sizeof(*call->QS)*call->n*B2B_MAX_ALLELES); + memset(bca->ref_scl, 0, 100*sizeof(int)); + memset(bca->alt_scl, 0, 100*sizeof(int)); + memset(bca->iref_scl, 0, 100*sizeof(int)); + memset(bca->ialt_scl, 0, 100*sizeof(int)); +} + +/* + Notes: + - Called from bam_plcmd.c by mpileup. Amongst other things, sets the bcf_callret1_t.QS frequencies + which are carried over via bcf_call_combine and bcf_call2bcf to the output BCF as the INFO/QS and FMT/QS annotations. + Later it's used for multiallelic calling by `call -m`, `call -mG` and `+trio-dnm`. + - ref_base is the 4-bit representation of the reference base. It is negative if we are looking at an indel. + */ +/* + * This function is called once for each sample. + * _n is number of pilesups pl contributing reads to this sample + * pl is pointer to array of _n pileups (one pileup per read) + * ref_base is the 4-bit representation of the reference base. It is negative if we are looking at an indel. + * bca is the settings to perform calls across all samples + * r is the returned value of the call + */ +int bcf_call_glfgen(int _n, const bam_pileup1_t *pl, int ref_base, bcf_callaux_t *bca, bcf_callret1_t *r) +{ + int i, n, ref4, is_indel, ori_depth = 0; + + // clean from previous run + r->ori_depth = 0; + r->mq0 = 0; + memset(r->anno,0,sizeof(double)*16); + memset(r->p,0,sizeof(float)*25); + r->SCR = 0; + + if (ref_base >= 0) { + ref4 = seq_nt16_int[ref_base]; + is_indel = 0; + } else ref4 = 4, is_indel = 1; + if (_n == 0) return -1; + // enlarge the bases array if necessary + if (bca->max_bases < _n) { + bca->max_bases = _n; + kroundup32(bca->max_bases); + bca->bases = (uint16_t*)realloc(bca->bases, 2 * bca->max_bases); + } + + // fill the bases array + double nqual_over_60 = bca->nqual / 60.0; + int ADR_ref_missed[4] = {0}; + int ADF_ref_missed[4] = {0}; + for (i = n = 0; i < _n; ++i) { + const bam_pileup1_t *p = pl + i; + int q, b, mapQ, baseQ, is_diff, min_dist, seqQ; + if ( bca->fmt_flag&(B2B_INFO_SCR|B2B_FMT_SCR) && PLP_HAS_SOFT_CLIP(p->cd.i) ) r->SCR++; + if (p->is_refskip || (p->b->core.flag&BAM_FUNMAP)) continue; + if (p->is_del && !is_indel) continue; + ++ori_depth; + if (is_indel) + { + b = p->aux>>16&0x3f; + seqQ = q = (p->aux & 0xff); // mp2 + builtin indel-bias + if (q < bca->min_baseQ) + { + if (!p->indel && b < 4) + { + if (bam_is_rev(p->b)) + ADR_ref_missed[b]++; + else + ADF_ref_missed[b]++; + } + continue; + } + if (p->indel == 0 && (q < _n/2 || _n > 20)) { + // high quality indel calls without p->indel set aren't + // particularly indicative of being a good REF match either, + // at least not in low coverage. So require solid coverage + // before we start utilising such quals. + b = 0; + q = (int)bam_get_qual(p->b)[p->qpos]; + seqQ = (3*seqQ + 2*q)/8; + } + if (_n > 20 && seqQ > 40) seqQ = 40; + baseQ = p->aux>>8&0xff; + + is_diff = (b != 0); + } + else + { + b = bam_seqi(bam_get_seq(p->b), p->qpos); // base + b = seq_nt16_int[b? b : ref_base]; // b is the 2-bit base + + // Lowest of this and neighbour quality values + uint8_t *qual = bam_get_qual(p->b); + q = qual[p->qpos]; + if (p->qpos > 0 && + q > qual[p->qpos-1]+bca->delta_baseQ) + q = qual[p->qpos-1]+bca->delta_baseQ; + if (p->qpos+1 < p->b->core.l_qseq && + q > qual[p->qpos+1]+bca->delta_baseQ) + q = qual[p->qpos+1]+bca->delta_baseQ; + + if (q < bca->min_baseQ) continue; + if (q > bca->max_baseQ) q = bca->max_baseQ; + baseQ = q; + seqQ = 99; + is_diff = (ref4 < 4 && b == ref4)? 0 : 1; + } + mapQ = p->b->core.qual < 255? p->b->core.qual : DEF_MAPQ; // special case for mapQ==255 + if ( !mapQ ) r->mq0++; + if (q > seqQ) q = seqQ; + mapQ = mapQ < bca->capQ? mapQ : bca->capQ; + if (q > mapQ) q = mapQ; + if (q > 63) q = 63; + if (q < 4) q = 4; // MQ=0 reads count as BQ=4 + bca->bases[n++] = q<<5 | (int)bam_is_rev(p->b)<<4 | b; + // collect annotations + if (b < 4) + { + r->QS[b] += q; + if ( r->ADF ) + { + if ( bam_is_rev(p->b) ) + r->ADR[b]++; + else + r->ADF[b]++; + } + } + ++r->anno[0<<2|is_diff<<1|bam_is_rev(p->b)]; + min_dist = p->b->core.l_qseq - 1 - p->qpos; + if (min_dist > p->qpos) min_dist = p->qpos; + if (min_dist > CAP_DIST) min_dist = CAP_DIST; + r->anno[1<<2|is_diff<<1|0] += baseQ; + r->anno[1<<2|is_diff<<1|1] += baseQ * baseQ; + r->anno[2<<2|is_diff<<1|0] += mapQ; + r->anno[2<<2|is_diff<<1|1] += mapQ * mapQ; + r->anno[3<<2|is_diff<<1|0] += min_dist; + r->anno[3<<2|is_diff<<1|1] += min_dist * min_dist; + + // collect for bias tests + if ( baseQ > 59 ) baseQ = 59; + if ( mapQ > 59 ) mapQ = 59; + int len, epos = 0, sc_len = 0, sc_dist = 0; + if ( bca->fmt_flag & (B2B_INFO_RPB|B2B_INFO_VDB|B2B_INFO_SCB) ) + { + int pos = get_position(p, &len, &sc_len, &sc_dist); + epos = (double)pos/(len+1) * bca->npos; + + if (sc_len) { + sc_len = 15.0*sc_len / sc_dist; + if (sc_len > 99) sc_len = 99; + } + } + int imq = mapQ * nqual_over_60; + int ibq = baseQ * nqual_over_60; + int inm = get_aux_nm(p->b,p->qpos,is_diff?0:1); + + if ( bam_is_rev(p->b) ) + bca->rev_mqs[imq]++; + else + bca->fwd_mqs[imq]++; + + if ( !is_diff ) + { + bca->ref_pos[epos]++; + bca->ref_bq[ibq]++; + bca->ref_mq[imq]++; + bca->ref_scl[sc_len]++; + if ( inm>=0 ) + { + bca->ref_nm[inm]++; + if ( r->ref_nm ) r->ref_nm[inm]++; + } + } + else + { + bca->alt_pos[epos]++; + bca->alt_bq[ibq]++; + bca->alt_mq[imq]++; + bca->alt_scl[sc_len]++; + if ( inm>=0 ) + { + bca->alt_nm[inm]++; + if ( r->alt_nm ) r->alt_nm[inm]++; + } + } + } + + // Compensate for AD not being counted on low quality REF indel matches. + if ( r->ADF && bca->ambig_reads==B2B_INC_AD0 ) + { + for (i=0; i<4; i++) + { + r->ADR[0] += ADR_ref_missed[i]; + r->ADF[0] += ADF_ref_missed[i]; + } + } + else if ( r->ADF && bca->ambig_reads==B2B_INC_AD ) + { + int dp = 0, dp_ambig = 0; + for (i=0; i<4; i++) dp += r->ADR[i]; + for (i=0; i<4; i++) dp_ambig += ADR_ref_missed[i]; + if ( dp ) + for (i=0; i<4; i++) r->ADR[i] += lroundf((float)dp_ambig * r->ADR[i]/dp); + dp = 0, dp_ambig = 0; + for (i=0; i<4; i++) dp += r->ADF[i]; + for (i=0; i<4; i++) dp_ambig += ADF_ref_missed[i]; + if ( dp ) + for (i=0; i<4; i++) r->ADF[i] += lroundf((float)dp_ambig * r->ADF[i]/dp); + } + + r->ori_depth = ori_depth; + // glfgen + errmod_cal(bca->e, n, 5, bca->bases, r->p); // calculate PL of each genotype + return n; +} + + +/* + * calc_vdb() - returns value between zero (most biased) and one (no bias) + * on success, or HUGE_VAL when VDB cannot be calculated because + * of insufficient depth (<2x) + * + * Variant Distance Bias tests if the variant bases are positioned within the + * reads with sufficient randomness. Unlike other tests, it looks only at + * variant reads and therefore gives different kind of information than Read + * Position Bias for instance. VDB was developed for detecting artefacts in + * RNA-seq calls where reads from spliced transcripts span splice site + * boundaries. The current implementation differs somewhat from the original + * version described in supplementary material of PMID:22524474, but the idea + * remains the same. (Here the random variable tested is the average distance + * from the averaged position, not the average pairwise distance.) + * + * For coverage of 2x, the calculation is exact but is approximated for the + * rest. The result is most accurate between 4-200x. For 3x or >200x, the + * reported values are slightly more favourable than those of a true random + * distribution. + */ +double calc_vdb(int *pos, int npos) +{ + // Note well: the parameters were obtained by fitting to simulated data of + // 100bp reads. This assumes rescaling to 100bp in bcf_call_glfgen(). + const int readlen = 100; + assert( npos==readlen ); + + #define nparam 15 + const float param[nparam][3] = { {3,0.079,18}, {4,0.09,19.8}, {5,0.1,20.5}, {6,0.11,21.5}, + {7,0.125,21.6}, {8,0.135,22}, {9,0.14,22.2}, {10,0.153,22.3}, {15,0.19,22.8}, + {20,0.22,23.2}, {30,0.26,23.4}, {40,0.29,23.5}, {50,0.35,23.65}, {100,0.5,23.7}, + {200,0.7,23.7} }; + + int i, dp = 0; + float mean_pos = 0, mean_diff = 0; + for (i=0; i=200 ) + i = nparam; // shortcut for big depths + else + { + for (i=0; i=dp ) break; + } + float pshift, pscale; + if ( i==nparam ) + { + // the depth is too high, go with 200x + pscale = param[nparam-1][1]; + pshift = param[nparam-1][2]; + } + else if ( i>0 && param[i][0]!=dp ) + { + // linear interpolation of parameters + pscale = (param[i-1][1] + param[i][1])*0.5; + pshift = (param[i-1][2] + param[i][2])*0.5; + } + else + { + pscale = param[i][1]; + pshift = param[i][2]; + } + return 0.5*kf_erfc(-(mean_diff-pshift)*pscale); +} + +double calc_chisq_bias(int *a, int *b, int n) +{ + int na = 0, nb = 0, i, ndf = n; + for (i=0; i= 2 && m >= 2); + + return (n < 8 && m < 8 && U < 50) + ? mw[n-2][m-2][U] + : mann_whitney_1947_(n,m,U); +} + +double mann_whitney_1947_cdf(int n, int m, int U) +{ + int i; + double sum = 0; + for (i=0; i<=U; i++) + sum += mann_whitney_1947(n,m,i); + return sum; +} + +double calc_mwu_bias_cdf(int *a, int *b, int n) +{ + int na = 0, nb = 0, i; + double U = 0; + //double ties = 0; + for (i=0; i=8 && nb>=8 and reasonable if na<8 or nb<8 + if ( na>=8 || nb>=8 ) + { + double mean = ((double)na*nb)*0.5; + // Correction for ties: + // double N = na+nb; + // double var2 = (N*N-1)*N-ties; + // if ( var2==0 ) return 1.0; + // var2 *= ((double)na*nb)/N/(N-1)/12.0; + // No correction for ties: + double var2 = ((double)na*nb)*(na+nb+1)/12.0; + double z = (U_min - mean)/sqrt(2*var2); // z is N(0,1) + return 2.0 - kf_erfc(z); // which is 1 + erf(z) + } + + // Exact calculation + double pval = 2*mann_whitney_1947_cdf(na,nb,U_min); + return pval>1 ? 1 : pval; +} + +double calc_mwu_bias(int *a, int *b, int n, int left) +{ + int na = 0, nb = 0, i; + double U = 0; + // double ties = 0; + for (i=0; i mean) return 1; // for MQB which is asymmetrical + if ( na==2 || nb==2 ) + { + // Linear approximation + return U>mean ? (2.0*mean-U)/mean : U/mean; + } + // Correction for ties: + // double N = na+nb; + // double var2 = (N*N-1)*N-ties; + // if ( var2==0 ) return 1.0; + // var2 *= ((double)na*nb)/N/(N-1)/12.0; + // No correction for ties: + double var2 = ((double)na*nb)*(na+nb+1)/12.0; + if ( na>=8 || nb>=8 ) + { + // Normal approximation, very good for na>=8 && nb>=8 and reasonable if na<8 or nb<8 + return exp(-0.5*(U-mean)*(U-mean)/var2); + } + + // Exact calculation + return mann_whitney_1947(na,nb,U) * sqrt(2*M_PI*var2); +} + +// A Z-score version of the above function. +// +// See "Normal approximation and tie correction" at +// https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test +// +// The Z score is the number of standard deviations above or below the mean +// with 0 being equality of the two distributions and +ve/-ve from there. +// +// This is a more robust score to filter on. +double calc_mwu_biasZ(int *a, int *b, int n, int left_only, int do_Z) { + int i; + int64_t t; + + // Optimisation + for (i = 0; i < n; i++) + if (b[i]) + break; + int b_empty = (i == n); + + // Count equal (e), less-than (l) and greater-than (g) permutations. + int e = 0, l = 0, na = 0, nb = 0; + if (b_empty) { + for (t = 0, i = n-1; i >= 0; i--) { + na += a[i]; + t += (a[i]*a[i]-1)*a[i]; // adjustment score for ties + } + } else { + for (t = 0, i = n-1; i >= 0; i--) { + // Combinations of a[i] and b[j] for i==j + e += a[i]*b[i]; + + // nb is running total of b[i+1]..b[n-1]. + // Therefore a[i]*nb is the number of combinations of a[i] and b[j] + // for all i < j. + l += a[i]*nb; // a= 0 ? 0.5 : -0.5)) / sd; // gatk method? + return (U - m) / sqrt(var2); + } + + // Else U score, which can be asymmetric for some data types. + if (left_only && U > m) + return HUGE_VAL; // one-sided, +ve bias is OK, -ve is not. + + if (na >= 8 || nb >= 8) { + // Normal approximation, very good for na>=8 && nb>=8 and + // reasonable if na<8 or nb<8 + return exp(-0.5*(U-m)*(U-m)/var2); + } + + // Exact calculation + if (na==1 || nb == 1) + return mann_whitney_1947_(na, nb, U) * sqrt(2*M_PI*var2); + else + return mann_whitney_1947(na, nb, U) * sqrt(2*M_PI*var2); +} + +static inline double logsumexp2(double a, double b) +{ + if ( a>b ) + return log(1 + exp(b-a)) + a; + else + return log(1 + exp(a-b)) + b; +} + +void calc_SegBias(const bcf_callret1_t *bcr, bcf_call_t *call) +{ + call->seg_bias = HUGE_VAL; + if ( !bcr ) return; + + int nr = call->anno[2] + call->anno[3]; // number of observed non-reference reads + if ( !nr ) return; + + int avg_dp = (call->anno[0] + call->anno[1] + nr) / call->n; // average depth + double M = floor((double)nr / avg_dp + 0.5); // an approximate number of variants samples in the population + if ( M>call->n ) M = call->n; // clamp M at the number of samples + else if ( M==0 ) M = 1; + double f = M / 2. / call->n; // allele frequency + double p = (double) nr / call->n; // number of variant reads per sample expected if variant not real (poisson) + double q = (double) nr / M; // number of variant reads per sample expected if variant is real (poisson) + double sum = 0; + const double log2 = log(2.0); + + // fprintf(stderr,"M=%.1f p=%e q=%e f=%f dp=%d\n",M,p,q,f,avg_dp); + int i; + for (i=0; in; i++) + { + int oi = bcr[i].anno[2] + bcr[i].anno[3]; // observed number of non-ref reads + double tmp; + if ( oi ) + { + // tmp = log(f) + oi*log(q/p) - q + log(2*(1-f) + f*pow(2,oi)*exp(-q)) + p; // this can under/overflow + tmp = logsumexp2(log(2*(1-f)), log(f) + oi*log2 - q); + tmp += log(f) + oi*log(q/p) - q + p; + } + else + tmp = log(2*f*(1-f)*exp(-q) + f*f*exp(-2*q) + (1-f)*(1-f)) + p; + sum += tmp; + // fprintf(stderr,"oi=%d %e\n", oi,tmp); + } + call->seg_bias = sum; +} + +/** + * bcf_call_combine() - sets the PL array and VDB, RPB annotations, finds the top two alleles + * @n: number of samples + * @calls: each sample's calls + * @bca: auxiliary data structure for holding temporary values + * @ref_base: the reference base + * @call: filled with the annotations + * + * Combines calls across the various samples being studied + * 1. For each allele at each base across all samples the quality is summed so + * you end up with a set of quality sums for each allele present 2. The quality + * sums are sorted. + * 3. Using the sorted quality sums we now create the allele ordering array + * A\subN. This is done by doing the following: + * a) If the reference allele is known it always comes first, otherwise N + * comes first. + * b) Then the rest of the alleles are output in descending order of quality + * sum (which we already know the qsum array was sorted). Any allelles with + * qsum 0 will be excluded. + * 4. Using the allele ordering array we create the genotype ordering array. + * In the worst case with an unknown reference this will be: A0/A0 A1/A0 A1/A1 + * A2/A0 A2/A1 A2/A2 A3/A0 A3/A1 A3/A2 A3/A3 A4/A0 A4/A1 A4/A2 A4/A3 A4/A4 + * 5. The genotype ordering array is then used to extract data from the error + * model 5*5 matrix and is used to produce a Phread likelihood array for each + * sample. + */ +int bcf_call_combine(int n, const bcf_callret1_t *calls, bcf_callaux_t *bca, int ref_base /*4-bit*/, bcf_call_t *call) +{ + int ref4, i, j; + float qsum[B2B_MAX_ALLELES] = {0,0,0,0,0}; + if (ref_base >= 0) { + call->ori_ref = ref4 = seq_nt16_int[ref_base]; + if (ref4 > 4) ref4 = 4; + } else call->ori_ref = -1, ref4 = 0; + + // calculate qsum, this is done by summing normalized qsum across all samples, + // to account for differences in coverage + for (i = 0; i < n; ++i) + { + float sum = 0; + for (j = 0; j < 4; ++j) sum += calls[i].QS[j]; + if ( sum ) + for (j = 0; j < 4; j++) qsum[j] += (float)calls[i].QS[j] / sum; + } + + // sort qsum in ascending order (insertion sort) + float *ptr[5], *tmp; + for (i=0; i<5; i++) ptr[i] = &qsum[i]; + for (i=1; i<4; i++) + for (j=i; j>0 && *ptr[j] < *ptr[j-1]; j--) + tmp = ptr[j], ptr[j] = ptr[j-1], ptr[j-1] = tmp; + + // Set the reference allele and alternative allele(s) + for (i=0; i<5; i++) call->a[i] = -1; + for (i=0; iqsum[i] = 0; + call->unseen = -1; + call->a[0] = ref4; + for (i=3, j=1; i>=0; i--) // i: alleles sorted by QS; j, a[j]: output allele ordering + { + int ipos = ptr[i] - qsum; // position in sorted qsum array + if ( ipos==ref4 ) + call->qsum[0] = qsum[ipos]; // REF's qsum + else + { + if ( !qsum[ipos] ) break; // qsum is 0, this and consequent alleles are not seen in the pileup + call->qsum[j] = qsum[ipos]; + call->a[j++] = ipos; + } + } + if (ref_base >= 0) + { + // for SNPs, find the "unseen" base + if (((ref4 < 4 && j < 4) || (ref4 == 4 && j < 5)) && i >= 0) + call->unseen = j, call->a[j++] = ptr[i] - qsum; + call->n_alleles = j; + } + else + { + call->n_alleles = j; + if (call->n_alleles == 1) return -1; // no reliable supporting read. stop doing anything + } + int has_alt = (call->n_alleles==2 && call->unseen!=-1) ? 0 : 1; + /* + * Set the phread likelihood array (call->PL) This array is 15 entries long + * for each sample because that is size of an upper or lower triangle of a + * worst case 5x5 matrix of possible genotypes. This worst case matrix will + * occur when all 4 possible alleles are present and the reference allele + * is unknown. The sides of the matrix will correspond to the reference + * allele (if known) followed by the alleles present in descending order of + * quality sum + */ + { + int x, g[15], z; + double sum_min = 0.; + x = call->n_alleles * (call->n_alleles + 1) / 2; + // get the possible genotypes + // this is done by creating an ordered list of locations g for call (allele a, allele b) in the genotype likelihood matrix + for (i = z = 0; i < call->n_alleles; ++i) { + for (j = 0; j <= i; ++j) { + g[z++] = call->a[j] * 5 + call->a[i]; + } + } + // for each sample calculate the PL + for (i = 0; i < n; ++i) + { + int32_t *PL = call->PL + x * i; + const bcf_callret1_t *r = calls + i; + float min = FLT_MAX; + for (j = 0; j < x; ++j) { + if (min > r->p[g[j]]) min = r->p[g[j]]; + } + sum_min += min; + for (j = 0; j < x; ++j) { + int y; + y = (int)(r->p[g[j]] - min + .499); + if (y > 255) y = 255; + PL[j] = y; + } + } + if ( call->DP4 ) + { + for (i=0; iDP4[4*i] = calls[i].anno[0]; + call->DP4[4*i+1] = calls[i].anno[1]; + call->DP4[4*i+2] = calls[i].anno[2]; + call->DP4[4*i+3] = calls[i].anno[3]; + } + } + if ( call->SCR ) + { + for (i=0; iSCR[0] += calls[i].SCR; + call->SCR[1+i] = calls[i].SCR; + } + } + if ( call->ADF ) + { + assert( call->n_alleles<=B2B_MAX_ALLELES ); // this is always true for SNPs and so far for indels as well + + // reorder ADR,ADF to match the allele ordering at this site + int32_t tmp[B2B_MAX_ALLELES]; + int32_t *adr = call->ADR + B2B_MAX_ALLELES, *adr_out = call->ADR + B2B_MAX_ALLELES; + int32_t *adf = call->ADF + B2B_MAX_ALLELES, *adf_out = call->ADF + B2B_MAX_ALLELES; + int32_t *adr_tot = call->ADR; // the first bin stores total counts per site + int32_t *adf_tot = call->ADF; + for (i=0; in_alleles; j++) + { + tmp[j] = adr[ call->a[j] ]; + adr_tot[j] += tmp[j]; + } + for (j=0; jn_alleles; j++) adr_out[j] = tmp[j]; + for (j=0; jn_alleles; j++) + { + tmp[j] = adf[ call->a[j] ]; + adf_tot[j] += tmp[j]; + } + for (j=0; jn_alleles; j++) adf_out[j] = tmp[j]; + adf_out += call->n_alleles; + adr_out += call->n_alleles; + adr += B2B_MAX_ALLELES; + adf += B2B_MAX_ALLELES; + } + } + if ( bca->fmt_flag & B2B_FMT_QS ) + { + assert( call->n_alleles<=B2B_MAX_ALLELES ); // this is always true for SNPs and so far for indels as well + + // reorder QS to match the allele ordering at this site + int32_t tmp[B2B_MAX_ALLELES]; + int32_t *qs = call->QS, *qs_out = call->QS; + for (i=0; in_alleles; j++) tmp[j] = qs[ call->a[j] ]; + for (j=0; jn_alleles; j++) qs_out[j] = tmp[j] < BCF_MAX_BT_INT32 ? tmp[j] : BCF_MAX_BT_INT32; + qs_out += call->n_alleles; + qs += B2B_MAX_ALLELES; + } + } + +// if (ref_base < 0) fprintf(stderr, "%d,%d,%f,%d\n", call->n_alleles, x, sum_min, call->unseen); + call->shift = (int)(sum_min + .499); + } + // combine annotations + memset(call->anno, 0, 16 * sizeof(double)); + call->ori_depth = 0; + call->depth = 0; + call->mq0 = 0; + for (i = 0; i < n; ++i) { + call->depth += calls[i].anno[0] + calls[i].anno[1] + calls[i].anno[2] + calls[i].anno[3]; + call->ori_depth += calls[i].ori_depth; + call->mq0 += calls[i].mq0; + for (j = 0; j < 16; ++j) call->anno[j] += calls[i].anno[j]; + } + + // No need to calculate MWU tests when there is no ALT allele, this should speed up things slightly + if ( !has_alt ) return 0; + + calc_SegBias(calls, call); + + // calc_chisq_bias("XPOS", call->bcf_hdr->id[BCF_DT_CTG][call->tid].key, call->pos, bca->ref_pos, bca->alt_pos, bca->npos); + // calc_chisq_bias("XMQ", call->bcf_hdr->id[BCF_DT_CTG][call->tid].key, call->pos, bca->ref_mq, bca->alt_mq, bca->nqual); + // calc_chisq_bias("XBQ", call->bcf_hdr->id[BCF_DT_CTG][call->tid].key, call->pos, bca->ref_bq, bca->alt_bq, bca->nqual); + + if (bca->fmt_flag & B2B_INFO_ZSCORE) { + // U z-normalised as +/- number of standard deviations from mean. + if (call->ori_ref < 0) { // indel + if (bca->fmt_flag & B2B_INFO_RPB) + call->mwu_pos = calc_mwu_biasZ(bca->iref_pos, bca->ialt_pos, + bca->npos, 0, 1); + call->mwu_mq = calc_mwu_biasZ(bca->iref_mq, bca->ialt_mq, + bca->nqual,1,1); + if ( bca->fmt_flag & B2B_INFO_SCB ) + call->mwu_sc = calc_mwu_biasZ(bca->iref_scl, bca->ialt_scl, + 100, 0,1); + } else { + if (bca->fmt_flag & B2B_INFO_RPB) + call->mwu_pos = calc_mwu_biasZ(bca->ref_pos, bca->alt_pos, + bca->npos, 0, 1); + call->mwu_mq = calc_mwu_biasZ(bca->ref_mq, bca->alt_mq, + bca->nqual,1,1); + call->mwu_bq = calc_mwu_biasZ(bca->ref_bq, bca->alt_bq, + bca->nqual,0,1); + call->mwu_mqs = calc_mwu_biasZ(bca->fwd_mqs, bca->rev_mqs, + bca->nqual,0,1); + if ( bca->fmt_flag & B2B_INFO_SCB ) + call->mwu_sc = calc_mwu_biasZ(bca->ref_scl, bca->alt_scl, + 100, 0,1); + } + call->mwu_nm[0] = calc_mwu_biasZ(bca->ref_nm, bca->alt_nm, B2B_N_NM,0,1); + if ( bca->fmt_flag & B2B_FMT_NMBZ ) + { + for (i=0; imwu_nm[i+1] = val!=HUGE_VAL ? val : 0; + } + } + } else { + // Old method; U as probability between 0 and 1 + if ( bca->fmt_flag & B2B_INFO_RPB ) + call->mwu_pos = calc_mwu_biasZ(bca->ref_pos, bca->alt_pos, + bca->npos, 0, 0); + call->mwu_mq = calc_mwu_biasZ(bca->ref_mq, bca->alt_mq, + bca->nqual, 1, 0); + call->mwu_bq = calc_mwu_biasZ(bca->ref_bq, bca->alt_bq, + bca->nqual, 0, 0); + call->mwu_mqs = calc_mwu_biasZ(bca->fwd_mqs, bca->rev_mqs, + bca->nqual, 0, 0); + } + +#if CDF_MWU_TESTS + // CDF version of MWU tests is not calculated by default + if ( bca->fmt_flag & B2B_INFO_RPB ) + call->mwu_pos_cdf = calc_mwu_bias_cdf(bca->ref_pos, bca->alt_pos, bca->npos); + call->mwu_mq_cdf = calc_mwu_bias_cdf(bca->ref_mq, bca->alt_mq, bca->nqual); + call->mwu_bq_cdf = calc_mwu_bias_cdf(bca->ref_bq, bca->alt_bq, bca->nqual); + call->mwu_mqs_cdf = calc_mwu_bias_cdf(bca->fwd_mqs, bca->rev_mqs, bca->nqual); +#endif + + if ( bca->fmt_flag & B2B_INFO_VDB ) + call->vdb = calc_vdb(bca->alt_pos, bca->npos); + + return 0; +} + +int bcf_call2bcf(bcf_call_t *bc, bcf1_t *rec, bcf_callret1_t *bcr, int fmt_flag, const bcf_callaux_t *bca, const char *ref) +{ + extern double kt_fisher_exact(int n11, int n12, int n21, int n22, double *_left, double *_right, double *two); + int i, j, nals = 1, has_alt = 0; + + bcf_hdr_t *hdr = bc->bcf_hdr; + rec->rid = bc->tid; + rec->pos = bc->pos; + rec->qual = 0; + + bc->tmp.l = 0; + if (bc->ori_ref < 0) // indel + { + // REF + kputc(ref[bc->pos], &bc->tmp); + for (j = 0; j < bca->indelreg; ++j) kputc(ref[bc->pos+1+j], &bc->tmp); + + // ALT + for (i=1; i<4; i++) + { + if (bc->a[i] < 0) break; + kputc(',', &bc->tmp); kputc(ref[bc->pos], &bc->tmp); + + if (bca->indel_types[bc->a[i]] < 0) { // deletion + for (j = -bca->indel_types[bc->a[i]]; j < bca->indelreg; ++j) + kputc(ref[bc->pos+1+j], &bc->tmp); + } else { // insertion; cannot be a reference unless a bug + char *inscns = &bca->inscns[bc->a[i] * bca->maxins]; + for (j = 0; j < bca->indel_types[bc->a[i]]; ++j) + kputc("ACGTN"[(int)inscns[j]], &bc->tmp); + for (j = 0; j < bca->indelreg; ++j) kputc(ref[bc->pos+1+j], &bc->tmp); + } + nals++; + has_alt = 1; + } + } + else // SNP + { + kputc("ACGTN"[bc->ori_ref], &bc->tmp); + for (i=1; i<5; i++) + { + if (bc->a[i] < 0) break; + kputc(',', &bc->tmp); + if ( bc->unseen==i ) kputs("<*>", &bc->tmp); + else + { + kputc("ACGT"[bc->a[i]], &bc->tmp); + has_alt = 1; + } + nals++; + } + } + bcf_update_alleles_str(hdr, rec, bc->tmp.s); + + bc->tmp.l = 0; + + // INFO + if (bc->ori_ref < 0) + { + bcf_update_info_flag(hdr, rec, "INDEL", NULL, 1); + bcf_update_info_int32(hdr, rec, "IDV", &bca->max_support, 1); + bcf_update_info_float(hdr, rec, "IMF", &bca->max_frac, 1); + } + bcf_update_info_int32(hdr, rec, "DP", &bc->ori_depth, 1); + if ( fmt_flag&B2B_INFO_ADF ) + bcf_update_info_int32(hdr, rec, "ADF", bc->ADF, rec->n_allele); + if ( fmt_flag&B2B_INFO_ADR ) + bcf_update_info_int32(hdr, rec, "ADR", bc->ADR, rec->n_allele); + if ( fmt_flag&(B2B_INFO_AD|B2B_INFO_DPR) ) + { + for (i=0; in_allele; i++) bc->ADF[i] += bc->ADR[i]; + if ( fmt_flag&B2B_INFO_AD ) + bcf_update_info_int32(hdr, rec, "AD", bc->ADF, rec->n_allele); + if ( fmt_flag&B2B_INFO_DPR ) + bcf_update_info_int32(hdr, rec, "DPR", bc->ADF, rec->n_allele); + } + if ( fmt_flag&B2B_INFO_SCR ) + bcf_update_info_int32(hdr, rec, "SCR", bc->SCR, 1); + + float tmpf[16]; + for (i=0; i<16; i++) tmpf[i] = bc->anno[i]; + bcf_update_info_float(hdr, rec, "I16", tmpf, 16); + bcf_update_info_float(hdr, rec, "QS", bc->qsum, nals); + + if ( has_alt ) + { + if ( bc->vdb != HUGE_VAL ) bcf_update_info_float(hdr, rec, "VDB", &bc->vdb, 1); + if ( bc->seg_bias != HUGE_VAL ) bcf_update_info_float(hdr, rec, "SGB", &bc->seg_bias, 1); + + if (bca->fmt_flag & B2B_INFO_ZSCORE) { + if ( bc->mwu_pos != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "RPBZ", &bc->mwu_pos, 1); + if ( bc->mwu_mq != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "MQBZ", &bc->mwu_mq, 1); + if ( bc->mwu_mqs != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "MQSBZ", &bc->mwu_mqs, 1); + if ( bc->mwu_bq != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "BQBZ", &bc->mwu_bq, 1); + if ( bc->mwu_nm[0] != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "NMBZ", bc->mwu_nm, 1); + if ( bc->mwu_sc != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "SCBZ", &bc->mwu_sc, 1); + } else { + if ( bc->mwu_pos != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "RPB", &bc->mwu_pos, 1); + if ( bc->mwu_mq != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "MQB", &bc->mwu_mq, 1); + if ( bc->mwu_mqs != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "MQSB", &bc->mwu_mqs, 1); + if ( bc->mwu_bq != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "BQB", &bc->mwu_bq, 1); + } + + if ( bc->strand_bias != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "FS", &bc->strand_bias, 1); + +#if CDF_MWU_TESTS + if ( bc->mwu_pos_cdf != HUGE_VAL ) bcf_update_info_float(hdr, rec, "RPB2", &bc->mwu_pos_cdf, 1); + if ( bc->mwu_mq_cdf != HUGE_VAL ) bcf_update_info_float(hdr, rec, "MQB2", &bc->mwu_mq_cdf, 1); + if ( bc->mwu_mqs_cdf != HUGE_VAL ) bcf_update_info_float(hdr, rec, "MQSB2", &bc->mwu_mqs_cdf, 1); + if ( bc->mwu_bq_cdf != HUGE_VAL ) bcf_update_info_float(hdr, rec, "BQB2", &bc->mwu_bq_cdf, 1); +#endif + } + + tmpf[0] = bc->ori_depth ? (float)bc->mq0/bc->ori_depth : 0; + bcf_update_info_float(hdr, rec, "MQ0F", tmpf, 1); + + // FORMAT + rec->n_sample = bc->n; + bcf_update_format_int32(hdr, rec, "PL", bc->PL, nals*(nals+1)/2 * rec->n_sample); + if ( fmt_flag&B2B_FMT_DP ) + { + int32_t *ptr = (int32_t*) bc->fmt_arr; + for (i=0; in; i++) + ptr[i] = bc->DP4[4*i] + bc->DP4[4*i+1] + bc->DP4[4*i+2] + bc->DP4[4*i+3]; + bcf_update_format_int32(hdr, rec, "DP", bc->fmt_arr, rec->n_sample); + } + if ( fmt_flag&B2B_FMT_DV ) + { + int32_t *ptr = (int32_t*) bc->fmt_arr; + for (i=0; in; i++) + ptr[i] = bc->DP4[4*i+2] + bc->DP4[4*i+3]; + bcf_update_format_int32(hdr, rec, "DV", bc->fmt_arr, rec->n_sample); + } + if ( fmt_flag&B2B_FMT_SP ) + { + int32_t *ptr = (int32_t*) bc->fmt_arr; + for (i=0; in; i++) + { + int fwd_ref = bc->DP4[4*i], rev_ref = bc->DP4[4*i+1], fwd_alt = bc->DP4[4*i+2], rev_alt = bc->DP4[4*i+3]; + if ( fwd_ref+rev_ref<2 || fwd_alt+rev_alt<2 || fwd_ref+fwd_alt<2 || rev_ref+rev_alt<2 ) + ptr[i] = 0; + else + { + double left, right, two; + kt_fisher_exact(fwd_ref, rev_ref, fwd_alt, rev_alt, &left, &right, &two); + int32_t x = (int)(-4.343 * log(two) + .499); + if (x > 255) x = 255; + ptr[i] = x; + } + } + bcf_update_format_int32(hdr, rec, "SP", bc->fmt_arr, rec->n_sample); + } + if ( fmt_flag&B2B_FMT_DP4 ) + bcf_update_format_int32(hdr, rec, "DP4", bc->DP4, rec->n_sample*4); + if ( fmt_flag&B2B_FMT_ADF ) + bcf_update_format_int32(hdr, rec, "ADF", bc->ADF+B2B_MAX_ALLELES, rec->n_sample*rec->n_allele); + if ( fmt_flag&B2B_FMT_ADR ) + bcf_update_format_int32(hdr, rec, "ADR", bc->ADR+B2B_MAX_ALLELES, rec->n_sample*rec->n_allele); + if ( fmt_flag&(B2B_FMT_AD|B2B_FMT_DPR) ) + { + for (i=0; in_sample*rec->n_allele; i++) bc->ADF[B2B_MAX_ALLELES+i] += bc->ADR[B2B_MAX_ALLELES+i]; + if ( fmt_flag&B2B_FMT_AD ) + bcf_update_format_int32(hdr, rec, "AD", bc->ADF+B2B_MAX_ALLELES, rec->n_sample*rec->n_allele); + if ( fmt_flag&B2B_FMT_DPR ) + bcf_update_format_int32(hdr, rec, "DPR", bc->ADF+B2B_MAX_ALLELES, rec->n_sample*rec->n_allele); + } + if ( fmt_flag&B2B_FMT_SCR ) + bcf_update_format_int32(hdr, rec, "SCR", bc->SCR+1, rec->n_sample); + if ( fmt_flag&B2B_FMT_QS ) + bcf_update_format_int32(hdr, rec, "QS", bc->QS, rec->n_sample*rec->n_allele); + + if ( has_alt ) + { + if ( fmt_flag&B2B_FMT_NMBZ ) + bcf_update_format_float(hdr, rec, "NMBZ", bc->mwu_nm+1, rec->n_sample); + } + + return 0; +} diff --git a/bcftools/bam2bcf.c.pysam.c b/bcftools/bam2bcf.c.pysam.c new file mode 100644 index 0000000..24c4270 --- /dev/null +++ b/bcftools/bam2bcf.c.pysam.c @@ -0,0 +1,1234 @@ +#include "bcftools.pysam.h" + +/* bam2bcf.c -- variant calling. + + Copyright (C) 2010-2012 Broad Institute. + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "bam2bcf.h" + +extern void ks_introsort_uint32_t(size_t n, uint32_t a[]); + +#define CALL_DEFTHETA 0.83 +#define DEF_MAPQ 20 + +#define CAP_DIST 25 + +bcf_callaux_t *bcf_call_init(double theta, int min_baseQ, int max_baseQ, + int delta_baseQ) +{ + bcf_callaux_t *bca; + if (theta <= 0.) theta = CALL_DEFTHETA; + bca = (bcf_callaux_t*) calloc(1, sizeof(bcf_callaux_t)); + bca->capQ = 60; + bca->openQ = 40; bca->extQ = 20; bca->tandemQ = 100; + bca->min_baseQ = min_baseQ; + bca->max_baseQ = max_baseQ; + bca->delta_baseQ = delta_baseQ; + bca->e = errmod_init(1. - theta); + bca->min_frac = 0.002; + bca->min_support = 1; + bca->per_sample_flt = 0; + bca->npos = 100; + bca->ref_pos = (int*) malloc(bca->npos*sizeof(int)); + bca->alt_pos = (int*) malloc(bca->npos*sizeof(int)); + bca->iref_pos= (int*) malloc(bca->npos*sizeof(int)); + bca->ialt_pos= (int*) malloc(bca->npos*sizeof(int)); + bca->nqual = 60; + bca->ref_mq = (int*) malloc(bca->nqual*sizeof(int)); + bca->alt_mq = (int*) malloc(bca->nqual*sizeof(int)); + bca->iref_mq = (int*) malloc(bca->nqual*sizeof(int)); + bca->ialt_mq = (int*) malloc(bca->nqual*sizeof(int)); + bca->ref_bq = (int*) malloc(bca->nqual*sizeof(int)); + bca->alt_bq = (int*) malloc(bca->nqual*sizeof(int)); + bca->fwd_mqs = (int*) malloc(bca->nqual*sizeof(int)); + bca->rev_mqs = (int*) malloc(bca->nqual*sizeof(int)); + return bca; +} + +void bcf_call_destroy(bcf_callaux_t *bca) +{ + if (bca == 0) return; + errmod_destroy(bca->e); + if (bca->npos) { + free(bca->ref_pos); free(bca->alt_pos); + free(bca->iref_pos); free(bca->ialt_pos); + bca->npos = 0; + } + free(bca->ref_mq); free(bca->alt_mq); + free(bca->iref_mq); free(bca->ialt_mq); + free(bca->ref_bq); free(bca->alt_bq); + free(bca->fwd_mqs); free(bca->rev_mqs); + bca->nqual = 0; + free(bca->bases); free(bca->inscns); free(bca); +} + +static int get_aux_nm(bam1_t *rec, int32_t qpos, int is_ref) +{ + uint8_t *nm_tag = bam_aux_get(rec, "NM"); + if ( !nm_tag ) return -1; + int64_t nm = bam_aux2i(nm_tag); + + // Count indels as single events, not as the number of inserted/deleted + // bases (which is what NM does). Add soft clips as mismatches. + int i; + for (i=0; i < rec->core.n_cigar; i++) + { + int val = bam_get_cigar(rec)[i] & BAM_CIGAR_MASK; + if ( val==BAM_CSOFT_CLIP ) + { + nm += bam_get_cigar(rec)[i] >> BAM_CIGAR_SHIFT; + } + else if ( val==BAM_CINS || val==BAM_CDEL ) + { + val = bam_get_cigar(rec)[i] >> BAM_CIGAR_SHIFT; + if ( val > 1 ) nm -= val - 1; + } + } + + // Take into account MNPs, 2% of de novo SNVs appear within 20bp of another de novo SNV + // http://www.genome.org/cgi/doi/10.1101/gr.239756.118 + nm -= is_ref ? 1 : 2; + + if ( nm < 0 ) nm = 0; + if ( nm >= B2B_N_NM ) nm = B2B_N_NM - 1; + + return nm; +} + +// position in the sequence with respect to the aligned part of the read +static int get_position(const bam_pileup1_t *p, int *len, + int *sc_len, int *sc_dist) { + int i, j, edist = p->qpos + 1; + int sc_left = 0, sc_right = 0; + int sc_left_dist = -1, sc_right_dist = -1; + + // left end + for (i = 0; i < p->b->core.n_cigar; i++) { + int cig = bam_get_cigar(p->b)[i] & BAM_CIGAR_MASK; + if (cig == BAM_CHARD_CLIP) + continue; + else if (cig == BAM_CSOFT_CLIP) + sc_left += bam_get_cigar(p->b)[i] >> BAM_CIGAR_SHIFT; + else + break; + } + if (sc_left) + sc_left_dist = p->qpos+1 - sc_left; + edist -= sc_left; + + // right end + for (j = p->b->core.n_cigar-1; j >= i; j--) { + int cig = bam_get_cigar(p->b)[j] & BAM_CIGAR_MASK; + if (cig == BAM_CHARD_CLIP) + continue; + else if (cig == BAM_CSOFT_CLIP) + sc_right += bam_get_cigar(p->b)[j] >> BAM_CIGAR_SHIFT; + else + break; + } + if (sc_right) + sc_right_dist = p->b->core.l_qseq - sc_right - p->qpos; + + // Distance to nearest soft-clips and length of that clip. + if (sc_left_dist >= 0) { + if (sc_right_dist < 0 || sc_left_dist < sc_right_dist) { + *sc_len = sc_left; + *sc_dist = sc_left_dist; + } + } else if (sc_right_dist >= 0) { + *sc_len = sc_right; + *sc_dist = sc_right_dist; + } else { + *sc_len = 0; + *sc_dist = 0; + } + + *len = p->b->core.l_qseq - sc_left - sc_right; + return edist; +} + +void bcf_callaux_clean(bcf_callaux_t *bca, bcf_call_t *call) +{ + memset(bca->ref_pos,0,sizeof(int)*bca->npos); + memset(bca->alt_pos,0,sizeof(int)*bca->npos); + memset(bca->iref_pos,0,sizeof(int)*bca->npos); + memset(bca->ialt_pos,0,sizeof(int)*bca->npos); + memset(bca->ref_mq,0,sizeof(int)*bca->nqual); + memset(bca->alt_mq,0,sizeof(int)*bca->nqual); + memset(bca->iref_mq,0,sizeof(int)*bca->nqual); + memset(bca->ialt_mq,0,sizeof(int)*bca->nqual); + memset(bca->ref_bq,0,sizeof(int)*bca->nqual); + memset(bca->alt_bq,0,sizeof(int)*bca->nqual); + memset(bca->fwd_mqs,0,sizeof(int)*bca->nqual); + memset(bca->rev_mqs,0,sizeof(int)*bca->nqual); + if ( call->ADF ) memset(call->ADF,0,sizeof(int32_t)*(call->n+1)*B2B_MAX_ALLELES); + if ( call->ADR ) memset(call->ADR,0,sizeof(int32_t)*(call->n+1)*B2B_MAX_ALLELES); + if ( call->SCR ) memset(call->SCR,0,sizeof(*call->SCR)*(call->n+1)); + if ( call->SCR ) memset(call->SCR,0,sizeof(*call->SCR)*(call->n+1)); + if ( bca->fmt_flag&B2B_FMT_NMBZ ) + { + memset(call->ref_nm,0,sizeof(*call->ref_nm)*(call->n+1)*B2B_N_NM); + memset(call->alt_nm,0,sizeof(*call->alt_nm)*(call->n+1)*B2B_N_NM); + } + else + { + memset(call->ref_nm,0,sizeof(*call->ref_nm)*B2B_N_NM); + memset(call->alt_nm,0,sizeof(*call->alt_nm)*B2B_N_NM); + } + memset(call->QS,0,sizeof(*call->QS)*call->n*B2B_MAX_ALLELES); + memset(bca->ref_scl, 0, 100*sizeof(int)); + memset(bca->alt_scl, 0, 100*sizeof(int)); + memset(bca->iref_scl, 0, 100*sizeof(int)); + memset(bca->ialt_scl, 0, 100*sizeof(int)); +} + +/* + Notes: + - Called from bam_plcmd.c by mpileup. Amongst other things, sets the bcf_callret1_t.QS frequencies + which are carried over via bcf_call_combine and bcf_call2bcf to the output BCF as the INFO/QS and FMT/QS annotations. + Later it's used for multiallelic calling by `call -m`, `call -mG` and `+trio-dnm`. + - ref_base is the 4-bit representation of the reference base. It is negative if we are looking at an indel. + */ +/* + * This function is called once for each sample. + * _n is number of pilesups pl contributing reads to this sample + * pl is pointer to array of _n pileups (one pileup per read) + * ref_base is the 4-bit representation of the reference base. It is negative if we are looking at an indel. + * bca is the settings to perform calls across all samples + * r is the returned value of the call + */ +int bcf_call_glfgen(int _n, const bam_pileup1_t *pl, int ref_base, bcf_callaux_t *bca, bcf_callret1_t *r) +{ + int i, n, ref4, is_indel, ori_depth = 0; + + // clean from previous run + r->ori_depth = 0; + r->mq0 = 0; + memset(r->anno,0,sizeof(double)*16); + memset(r->p,0,sizeof(float)*25); + r->SCR = 0; + + if (ref_base >= 0) { + ref4 = seq_nt16_int[ref_base]; + is_indel = 0; + } else ref4 = 4, is_indel = 1; + if (_n == 0) return -1; + // enlarge the bases array if necessary + if (bca->max_bases < _n) { + bca->max_bases = _n; + kroundup32(bca->max_bases); + bca->bases = (uint16_t*)realloc(bca->bases, 2 * bca->max_bases); + } + + // fill the bases array + double nqual_over_60 = bca->nqual / 60.0; + int ADR_ref_missed[4] = {0}; + int ADF_ref_missed[4] = {0}; + for (i = n = 0; i < _n; ++i) { + const bam_pileup1_t *p = pl + i; + int q, b, mapQ, baseQ, is_diff, min_dist, seqQ; + if ( bca->fmt_flag&(B2B_INFO_SCR|B2B_FMT_SCR) && PLP_HAS_SOFT_CLIP(p->cd.i) ) r->SCR++; + if (p->is_refskip || (p->b->core.flag&BAM_FUNMAP)) continue; + if (p->is_del && !is_indel) continue; + ++ori_depth; + if (is_indel) + { + b = p->aux>>16&0x3f; + seqQ = q = (p->aux & 0xff); // mp2 + builtin indel-bias + if (q < bca->min_baseQ) + { + if (!p->indel && b < 4) + { + if (bam_is_rev(p->b)) + ADR_ref_missed[b]++; + else + ADF_ref_missed[b]++; + } + continue; + } + if (p->indel == 0 && (q < _n/2 || _n > 20)) { + // high quality indel calls without p->indel set aren't + // particularly indicative of being a good REF match either, + // at least not in low coverage. So require solid coverage + // before we start utilising such quals. + b = 0; + q = (int)bam_get_qual(p->b)[p->qpos]; + seqQ = (3*seqQ + 2*q)/8; + } + if (_n > 20 && seqQ > 40) seqQ = 40; + baseQ = p->aux>>8&0xff; + + is_diff = (b != 0); + } + else + { + b = bam_seqi(bam_get_seq(p->b), p->qpos); // base + b = seq_nt16_int[b? b : ref_base]; // b is the 2-bit base + + // Lowest of this and neighbour quality values + uint8_t *qual = bam_get_qual(p->b); + q = qual[p->qpos]; + if (p->qpos > 0 && + q > qual[p->qpos-1]+bca->delta_baseQ) + q = qual[p->qpos-1]+bca->delta_baseQ; + if (p->qpos+1 < p->b->core.l_qseq && + q > qual[p->qpos+1]+bca->delta_baseQ) + q = qual[p->qpos+1]+bca->delta_baseQ; + + if (q < bca->min_baseQ) continue; + if (q > bca->max_baseQ) q = bca->max_baseQ; + baseQ = q; + seqQ = 99; + is_diff = (ref4 < 4 && b == ref4)? 0 : 1; + } + mapQ = p->b->core.qual < 255? p->b->core.qual : DEF_MAPQ; // special case for mapQ==255 + if ( !mapQ ) r->mq0++; + if (q > seqQ) q = seqQ; + mapQ = mapQ < bca->capQ? mapQ : bca->capQ; + if (q > mapQ) q = mapQ; + if (q > 63) q = 63; + if (q < 4) q = 4; // MQ=0 reads count as BQ=4 + bca->bases[n++] = q<<5 | (int)bam_is_rev(p->b)<<4 | b; + // collect annotations + if (b < 4) + { + r->QS[b] += q; + if ( r->ADF ) + { + if ( bam_is_rev(p->b) ) + r->ADR[b]++; + else + r->ADF[b]++; + } + } + ++r->anno[0<<2|is_diff<<1|bam_is_rev(p->b)]; + min_dist = p->b->core.l_qseq - 1 - p->qpos; + if (min_dist > p->qpos) min_dist = p->qpos; + if (min_dist > CAP_DIST) min_dist = CAP_DIST; + r->anno[1<<2|is_diff<<1|0] += baseQ; + r->anno[1<<2|is_diff<<1|1] += baseQ * baseQ; + r->anno[2<<2|is_diff<<1|0] += mapQ; + r->anno[2<<2|is_diff<<1|1] += mapQ * mapQ; + r->anno[3<<2|is_diff<<1|0] += min_dist; + r->anno[3<<2|is_diff<<1|1] += min_dist * min_dist; + + // collect for bias tests + if ( baseQ > 59 ) baseQ = 59; + if ( mapQ > 59 ) mapQ = 59; + int len, epos = 0, sc_len = 0, sc_dist = 0; + if ( bca->fmt_flag & (B2B_INFO_RPB|B2B_INFO_VDB|B2B_INFO_SCB) ) + { + int pos = get_position(p, &len, &sc_len, &sc_dist); + epos = (double)pos/(len+1) * bca->npos; + + if (sc_len) { + sc_len = 15.0*sc_len / sc_dist; + if (sc_len > 99) sc_len = 99; + } + } + int imq = mapQ * nqual_over_60; + int ibq = baseQ * nqual_over_60; + int inm = get_aux_nm(p->b,p->qpos,is_diff?0:1); + + if ( bam_is_rev(p->b) ) + bca->rev_mqs[imq]++; + else + bca->fwd_mqs[imq]++; + + if ( !is_diff ) + { + bca->ref_pos[epos]++; + bca->ref_bq[ibq]++; + bca->ref_mq[imq]++; + bca->ref_scl[sc_len]++; + if ( inm>=0 ) + { + bca->ref_nm[inm]++; + if ( r->ref_nm ) r->ref_nm[inm]++; + } + } + else + { + bca->alt_pos[epos]++; + bca->alt_bq[ibq]++; + bca->alt_mq[imq]++; + bca->alt_scl[sc_len]++; + if ( inm>=0 ) + { + bca->alt_nm[inm]++; + if ( r->alt_nm ) r->alt_nm[inm]++; + } + } + } + + // Compensate for AD not being counted on low quality REF indel matches. + if ( r->ADF && bca->ambig_reads==B2B_INC_AD0 ) + { + for (i=0; i<4; i++) + { + r->ADR[0] += ADR_ref_missed[i]; + r->ADF[0] += ADF_ref_missed[i]; + } + } + else if ( r->ADF && bca->ambig_reads==B2B_INC_AD ) + { + int dp = 0, dp_ambig = 0; + for (i=0; i<4; i++) dp += r->ADR[i]; + for (i=0; i<4; i++) dp_ambig += ADR_ref_missed[i]; + if ( dp ) + for (i=0; i<4; i++) r->ADR[i] += lroundf((float)dp_ambig * r->ADR[i]/dp); + dp = 0, dp_ambig = 0; + for (i=0; i<4; i++) dp += r->ADF[i]; + for (i=0; i<4; i++) dp_ambig += ADF_ref_missed[i]; + if ( dp ) + for (i=0; i<4; i++) r->ADF[i] += lroundf((float)dp_ambig * r->ADF[i]/dp); + } + + r->ori_depth = ori_depth; + // glfgen + errmod_cal(bca->e, n, 5, bca->bases, r->p); // calculate PL of each genotype + return n; +} + + +/* + * calc_vdb() - returns value between zero (most biased) and one (no bias) + * on success, or HUGE_VAL when VDB cannot be calculated because + * of insufficient depth (<2x) + * + * Variant Distance Bias tests if the variant bases are positioned within the + * reads with sufficient randomness. Unlike other tests, it looks only at + * variant reads and therefore gives different kind of information than Read + * Position Bias for instance. VDB was developed for detecting artefacts in + * RNA-seq calls where reads from spliced transcripts span splice site + * boundaries. The current implementation differs somewhat from the original + * version described in supplementary material of PMID:22524474, but the idea + * remains the same. (Here the random variable tested is the average distance + * from the averaged position, not the average pairwise distance.) + * + * For coverage of 2x, the calculation is exact but is approximated for the + * rest. The result is most accurate between 4-200x. For 3x or >200x, the + * reported values are slightly more favourable than those of a true random + * distribution. + */ +double calc_vdb(int *pos, int npos) +{ + // Note well: the parameters were obtained by fitting to simulated data of + // 100bp reads. This assumes rescaling to 100bp in bcf_call_glfgen(). + const int readlen = 100; + assert( npos==readlen ); + + #define nparam 15 + const float param[nparam][3] = { {3,0.079,18}, {4,0.09,19.8}, {5,0.1,20.5}, {6,0.11,21.5}, + {7,0.125,21.6}, {8,0.135,22}, {9,0.14,22.2}, {10,0.153,22.3}, {15,0.19,22.8}, + {20,0.22,23.2}, {30,0.26,23.4}, {40,0.29,23.5}, {50,0.35,23.65}, {100,0.5,23.7}, + {200,0.7,23.7} }; + + int i, dp = 0; + float mean_pos = 0, mean_diff = 0; + for (i=0; i=200 ) + i = nparam; // shortcut for big depths + else + { + for (i=0; i=dp ) break; + } + float pshift, pscale; + if ( i==nparam ) + { + // the depth is too high, go with 200x + pscale = param[nparam-1][1]; + pshift = param[nparam-1][2]; + } + else if ( i>0 && param[i][0]!=dp ) + { + // linear interpolation of parameters + pscale = (param[i-1][1] + param[i][1])*0.5; + pshift = (param[i-1][2] + param[i][2])*0.5; + } + else + { + pscale = param[i][1]; + pshift = param[i][2]; + } + return 0.5*kf_erfc(-(mean_diff-pshift)*pscale); +} + +double calc_chisq_bias(int *a, int *b, int n) +{ + int na = 0, nb = 0, i, ndf = n; + for (i=0; i= 2 && m >= 2); + + return (n < 8 && m < 8 && U < 50) + ? mw[n-2][m-2][U] + : mann_whitney_1947_(n,m,U); +} + +double mann_whitney_1947_cdf(int n, int m, int U) +{ + int i; + double sum = 0; + for (i=0; i<=U; i++) + sum += mann_whitney_1947(n,m,i); + return sum; +} + +double calc_mwu_bias_cdf(int *a, int *b, int n) +{ + int na = 0, nb = 0, i; + double U = 0; + //double ties = 0; + for (i=0; i=8 && nb>=8 and reasonable if na<8 or nb<8 + if ( na>=8 || nb>=8 ) + { + double mean = ((double)na*nb)*0.5; + // Correction for ties: + // double N = na+nb; + // double var2 = (N*N-1)*N-ties; + // if ( var2==0 ) return 1.0; + // var2 *= ((double)na*nb)/N/(N-1)/12.0; + // No correction for ties: + double var2 = ((double)na*nb)*(na+nb+1)/12.0; + double z = (U_min - mean)/sqrt(2*var2); // z is N(0,1) + return 2.0 - kf_erfc(z); // which is 1 + erf(z) + } + + // Exact calculation + double pval = 2*mann_whitney_1947_cdf(na,nb,U_min); + return pval>1 ? 1 : pval; +} + +double calc_mwu_bias(int *a, int *b, int n, int left) +{ + int na = 0, nb = 0, i; + double U = 0; + // double ties = 0; + for (i=0; i mean) return 1; // for MQB which is asymmetrical + if ( na==2 || nb==2 ) + { + // Linear approximation + return U>mean ? (2.0*mean-U)/mean : U/mean; + } + // Correction for ties: + // double N = na+nb; + // double var2 = (N*N-1)*N-ties; + // if ( var2==0 ) return 1.0; + // var2 *= ((double)na*nb)/N/(N-1)/12.0; + // No correction for ties: + double var2 = ((double)na*nb)*(na+nb+1)/12.0; + if ( na>=8 || nb>=8 ) + { + // Normal approximation, very good for na>=8 && nb>=8 and reasonable if na<8 or nb<8 + return exp(-0.5*(U-mean)*(U-mean)/var2); + } + + // Exact calculation + return mann_whitney_1947(na,nb,U) * sqrt(2*M_PI*var2); +} + +// A Z-score version of the above function. +// +// See "Normal approximation and tie correction" at +// https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test +// +// The Z score is the number of standard deviations above or below the mean +// with 0 being equality of the two distributions and +ve/-ve from there. +// +// This is a more robust score to filter on. +double calc_mwu_biasZ(int *a, int *b, int n, int left_only, int do_Z) { + int i; + int64_t t; + + // Optimisation + for (i = 0; i < n; i++) + if (b[i]) + break; + int b_empty = (i == n); + + // Count equal (e), less-than (l) and greater-than (g) permutations. + int e = 0, l = 0, na = 0, nb = 0; + if (b_empty) { + for (t = 0, i = n-1; i >= 0; i--) { + na += a[i]; + t += (a[i]*a[i]-1)*a[i]; // adjustment score for ties + } + } else { + for (t = 0, i = n-1; i >= 0; i--) { + // Combinations of a[i] and b[j] for i==j + e += a[i]*b[i]; + + // nb is running total of b[i+1]..b[n-1]. + // Therefore a[i]*nb is the number of combinations of a[i] and b[j] + // for all i < j. + l += a[i]*nb; // a= 0 ? 0.5 : -0.5)) / sd; // gatk method? + return (U - m) / sqrt(var2); + } + + // Else U score, which can be asymmetric for some data types. + if (left_only && U > m) + return HUGE_VAL; // one-sided, +ve bias is OK, -ve is not. + + if (na >= 8 || nb >= 8) { + // Normal approximation, very good for na>=8 && nb>=8 and + // reasonable if na<8 or nb<8 + return exp(-0.5*(U-m)*(U-m)/var2); + } + + // Exact calculation + if (na==1 || nb == 1) + return mann_whitney_1947_(na, nb, U) * sqrt(2*M_PI*var2); + else + return mann_whitney_1947(na, nb, U) * sqrt(2*M_PI*var2); +} + +static inline double logsumexp2(double a, double b) +{ + if ( a>b ) + return log(1 + exp(b-a)) + a; + else + return log(1 + exp(a-b)) + b; +} + +void calc_SegBias(const bcf_callret1_t *bcr, bcf_call_t *call) +{ + call->seg_bias = HUGE_VAL; + if ( !bcr ) return; + + int nr = call->anno[2] + call->anno[3]; // number of observed non-reference reads + if ( !nr ) return; + + int avg_dp = (call->anno[0] + call->anno[1] + nr) / call->n; // average depth + double M = floor((double)nr / avg_dp + 0.5); // an approximate number of variants samples in the population + if ( M>call->n ) M = call->n; // clamp M at the number of samples + else if ( M==0 ) M = 1; + double f = M / 2. / call->n; // allele frequency + double p = (double) nr / call->n; // number of variant reads per sample expected if variant not real (poisson) + double q = (double) nr / M; // number of variant reads per sample expected if variant is real (poisson) + double sum = 0; + const double log2 = log(2.0); + + // fprintf(bcftools_stderr,"M=%.1f p=%e q=%e f=%f dp=%d\n",M,p,q,f,avg_dp); + int i; + for (i=0; in; i++) + { + int oi = bcr[i].anno[2] + bcr[i].anno[3]; // observed number of non-ref reads + double tmp; + if ( oi ) + { + // tmp = log(f) + oi*log(q/p) - q + log(2*(1-f) + f*pow(2,oi)*exp(-q)) + p; // this can under/overflow + tmp = logsumexp2(log(2*(1-f)), log(f) + oi*log2 - q); + tmp += log(f) + oi*log(q/p) - q + p; + } + else + tmp = log(2*f*(1-f)*exp(-q) + f*f*exp(-2*q) + (1-f)*(1-f)) + p; + sum += tmp; + // fprintf(bcftools_stderr,"oi=%d %e\n", oi,tmp); + } + call->seg_bias = sum; +} + +/** + * bcf_call_combine() - sets the PL array and VDB, RPB annotations, finds the top two alleles + * @n: number of samples + * @calls: each sample's calls + * @bca: auxiliary data structure for holding temporary values + * @ref_base: the reference base + * @call: filled with the annotations + * + * Combines calls across the various samples being studied + * 1. For each allele at each base across all samples the quality is summed so + * you end up with a set of quality sums for each allele present 2. The quality + * sums are sorted. + * 3. Using the sorted quality sums we now create the allele ordering array + * A\subN. This is done by doing the following: + * a) If the reference allele is known it always comes first, otherwise N + * comes first. + * b) Then the rest of the alleles are output in descending order of quality + * sum (which we already know the qsum array was sorted). Any allelles with + * qsum 0 will be excluded. + * 4. Using the allele ordering array we create the genotype ordering array. + * In the worst case with an unknown reference this will be: A0/A0 A1/A0 A1/A1 + * A2/A0 A2/A1 A2/A2 A3/A0 A3/A1 A3/A2 A3/A3 A4/A0 A4/A1 A4/A2 A4/A3 A4/A4 + * 5. The genotype ordering array is then used to extract data from the error + * model 5*5 matrix and is used to produce a Phread likelihood array for each + * sample. + */ +int bcf_call_combine(int n, const bcf_callret1_t *calls, bcf_callaux_t *bca, int ref_base /*4-bit*/, bcf_call_t *call) +{ + int ref4, i, j; + float qsum[B2B_MAX_ALLELES] = {0,0,0,0,0}; + if (ref_base >= 0) { + call->ori_ref = ref4 = seq_nt16_int[ref_base]; + if (ref4 > 4) ref4 = 4; + } else call->ori_ref = -1, ref4 = 0; + + // calculate qsum, this is done by summing normalized qsum across all samples, + // to account for differences in coverage + for (i = 0; i < n; ++i) + { + float sum = 0; + for (j = 0; j < 4; ++j) sum += calls[i].QS[j]; + if ( sum ) + for (j = 0; j < 4; j++) qsum[j] += (float)calls[i].QS[j] / sum; + } + + // sort qsum in ascending order (insertion sort) + float *ptr[5], *tmp; + for (i=0; i<5; i++) ptr[i] = &qsum[i]; + for (i=1; i<4; i++) + for (j=i; j>0 && *ptr[j] < *ptr[j-1]; j--) + tmp = ptr[j], ptr[j] = ptr[j-1], ptr[j-1] = tmp; + + // Set the reference allele and alternative allele(s) + for (i=0; i<5; i++) call->a[i] = -1; + for (i=0; iqsum[i] = 0; + call->unseen = -1; + call->a[0] = ref4; + for (i=3, j=1; i>=0; i--) // i: alleles sorted by QS; j, a[j]: output allele ordering + { + int ipos = ptr[i] - qsum; // position in sorted qsum array + if ( ipos==ref4 ) + call->qsum[0] = qsum[ipos]; // REF's qsum + else + { + if ( !qsum[ipos] ) break; // qsum is 0, this and consequent alleles are not seen in the pileup + call->qsum[j] = qsum[ipos]; + call->a[j++] = ipos; + } + } + if (ref_base >= 0) + { + // for SNPs, find the "unseen" base + if (((ref4 < 4 && j < 4) || (ref4 == 4 && j < 5)) && i >= 0) + call->unseen = j, call->a[j++] = ptr[i] - qsum; + call->n_alleles = j; + } + else + { + call->n_alleles = j; + if (call->n_alleles == 1) return -1; // no reliable supporting read. stop doing anything + } + int has_alt = (call->n_alleles==2 && call->unseen!=-1) ? 0 : 1; + /* + * Set the phread likelihood array (call->PL) This array is 15 entries long + * for each sample because that is size of an upper or lower triangle of a + * worst case 5x5 matrix of possible genotypes. This worst case matrix will + * occur when all 4 possible alleles are present and the reference allele + * is unknown. The sides of the matrix will correspond to the reference + * allele (if known) followed by the alleles present in descending order of + * quality sum + */ + { + int x, g[15], z; + double sum_min = 0.; + x = call->n_alleles * (call->n_alleles + 1) / 2; + // get the possible genotypes + // this is done by creating an ordered list of locations g for call (allele a, allele b) in the genotype likelihood matrix + for (i = z = 0; i < call->n_alleles; ++i) { + for (j = 0; j <= i; ++j) { + g[z++] = call->a[j] * 5 + call->a[i]; + } + } + // for each sample calculate the PL + for (i = 0; i < n; ++i) + { + int32_t *PL = call->PL + x * i; + const bcf_callret1_t *r = calls + i; + float min = FLT_MAX; + for (j = 0; j < x; ++j) { + if (min > r->p[g[j]]) min = r->p[g[j]]; + } + sum_min += min; + for (j = 0; j < x; ++j) { + int y; + y = (int)(r->p[g[j]] - min + .499); + if (y > 255) y = 255; + PL[j] = y; + } + } + if ( call->DP4 ) + { + for (i=0; iDP4[4*i] = calls[i].anno[0]; + call->DP4[4*i+1] = calls[i].anno[1]; + call->DP4[4*i+2] = calls[i].anno[2]; + call->DP4[4*i+3] = calls[i].anno[3]; + } + } + if ( call->SCR ) + { + for (i=0; iSCR[0] += calls[i].SCR; + call->SCR[1+i] = calls[i].SCR; + } + } + if ( call->ADF ) + { + assert( call->n_alleles<=B2B_MAX_ALLELES ); // this is always true for SNPs and so far for indels as well + + // reorder ADR,ADF to match the allele ordering at this site + int32_t tmp[B2B_MAX_ALLELES]; + int32_t *adr = call->ADR + B2B_MAX_ALLELES, *adr_out = call->ADR + B2B_MAX_ALLELES; + int32_t *adf = call->ADF + B2B_MAX_ALLELES, *adf_out = call->ADF + B2B_MAX_ALLELES; + int32_t *adr_tot = call->ADR; // the first bin stores total counts per site + int32_t *adf_tot = call->ADF; + for (i=0; in_alleles; j++) + { + tmp[j] = adr[ call->a[j] ]; + adr_tot[j] += tmp[j]; + } + for (j=0; jn_alleles; j++) adr_out[j] = tmp[j]; + for (j=0; jn_alleles; j++) + { + tmp[j] = adf[ call->a[j] ]; + adf_tot[j] += tmp[j]; + } + for (j=0; jn_alleles; j++) adf_out[j] = tmp[j]; + adf_out += call->n_alleles; + adr_out += call->n_alleles; + adr += B2B_MAX_ALLELES; + adf += B2B_MAX_ALLELES; + } + } + if ( bca->fmt_flag & B2B_FMT_QS ) + { + assert( call->n_alleles<=B2B_MAX_ALLELES ); // this is always true for SNPs and so far for indels as well + + // reorder QS to match the allele ordering at this site + int32_t tmp[B2B_MAX_ALLELES]; + int32_t *qs = call->QS, *qs_out = call->QS; + for (i=0; in_alleles; j++) tmp[j] = qs[ call->a[j] ]; + for (j=0; jn_alleles; j++) qs_out[j] = tmp[j] < BCF_MAX_BT_INT32 ? tmp[j] : BCF_MAX_BT_INT32; + qs_out += call->n_alleles; + qs += B2B_MAX_ALLELES; + } + } + +// if (ref_base < 0) fprintf(bcftools_stderr, "%d,%d,%f,%d\n", call->n_alleles, x, sum_min, call->unseen); + call->shift = (int)(sum_min + .499); + } + // combine annotations + memset(call->anno, 0, 16 * sizeof(double)); + call->ori_depth = 0; + call->depth = 0; + call->mq0 = 0; + for (i = 0; i < n; ++i) { + call->depth += calls[i].anno[0] + calls[i].anno[1] + calls[i].anno[2] + calls[i].anno[3]; + call->ori_depth += calls[i].ori_depth; + call->mq0 += calls[i].mq0; + for (j = 0; j < 16; ++j) call->anno[j] += calls[i].anno[j]; + } + + // No need to calculate MWU tests when there is no ALT allele, this should speed up things slightly + if ( !has_alt ) return 0; + + calc_SegBias(calls, call); + + // calc_chisq_bias("XPOS", call->bcf_hdr->id[BCF_DT_CTG][call->tid].key, call->pos, bca->ref_pos, bca->alt_pos, bca->npos); + // calc_chisq_bias("XMQ", call->bcf_hdr->id[BCF_DT_CTG][call->tid].key, call->pos, bca->ref_mq, bca->alt_mq, bca->nqual); + // calc_chisq_bias("XBQ", call->bcf_hdr->id[BCF_DT_CTG][call->tid].key, call->pos, bca->ref_bq, bca->alt_bq, bca->nqual); + + if (bca->fmt_flag & B2B_INFO_ZSCORE) { + // U z-normalised as +/- number of standard deviations from mean. + if (call->ori_ref < 0) { // indel + if (bca->fmt_flag & B2B_INFO_RPB) + call->mwu_pos = calc_mwu_biasZ(bca->iref_pos, bca->ialt_pos, + bca->npos, 0, 1); + call->mwu_mq = calc_mwu_biasZ(bca->iref_mq, bca->ialt_mq, + bca->nqual,1,1); + if ( bca->fmt_flag & B2B_INFO_SCB ) + call->mwu_sc = calc_mwu_biasZ(bca->iref_scl, bca->ialt_scl, + 100, 0,1); + } else { + if (bca->fmt_flag & B2B_INFO_RPB) + call->mwu_pos = calc_mwu_biasZ(bca->ref_pos, bca->alt_pos, + bca->npos, 0, 1); + call->mwu_mq = calc_mwu_biasZ(bca->ref_mq, bca->alt_mq, + bca->nqual,1,1); + call->mwu_bq = calc_mwu_biasZ(bca->ref_bq, bca->alt_bq, + bca->nqual,0,1); + call->mwu_mqs = calc_mwu_biasZ(bca->fwd_mqs, bca->rev_mqs, + bca->nqual,0,1); + if ( bca->fmt_flag & B2B_INFO_SCB ) + call->mwu_sc = calc_mwu_biasZ(bca->ref_scl, bca->alt_scl, + 100, 0,1); + } + call->mwu_nm[0] = calc_mwu_biasZ(bca->ref_nm, bca->alt_nm, B2B_N_NM,0,1); + if ( bca->fmt_flag & B2B_FMT_NMBZ ) + { + for (i=0; imwu_nm[i+1] = val!=HUGE_VAL ? val : 0; + } + } + } else { + // Old method; U as probability between 0 and 1 + if ( bca->fmt_flag & B2B_INFO_RPB ) + call->mwu_pos = calc_mwu_biasZ(bca->ref_pos, bca->alt_pos, + bca->npos, 0, 0); + call->mwu_mq = calc_mwu_biasZ(bca->ref_mq, bca->alt_mq, + bca->nqual, 1, 0); + call->mwu_bq = calc_mwu_biasZ(bca->ref_bq, bca->alt_bq, + bca->nqual, 0, 0); + call->mwu_mqs = calc_mwu_biasZ(bca->fwd_mqs, bca->rev_mqs, + bca->nqual, 0, 0); + } + +#if CDF_MWU_TESTS + // CDF version of MWU tests is not calculated by default + if ( bca->fmt_flag & B2B_INFO_RPB ) + call->mwu_pos_cdf = calc_mwu_bias_cdf(bca->ref_pos, bca->alt_pos, bca->npos); + call->mwu_mq_cdf = calc_mwu_bias_cdf(bca->ref_mq, bca->alt_mq, bca->nqual); + call->mwu_bq_cdf = calc_mwu_bias_cdf(bca->ref_bq, bca->alt_bq, bca->nqual); + call->mwu_mqs_cdf = calc_mwu_bias_cdf(bca->fwd_mqs, bca->rev_mqs, bca->nqual); +#endif + + if ( bca->fmt_flag & B2B_INFO_VDB ) + call->vdb = calc_vdb(bca->alt_pos, bca->npos); + + return 0; +} + +int bcf_call2bcf(bcf_call_t *bc, bcf1_t *rec, bcf_callret1_t *bcr, int fmt_flag, const bcf_callaux_t *bca, const char *ref) +{ + extern double kt_fisher_exact(int n11, int n12, int n21, int n22, double *_left, double *_right, double *two); + int i, j, nals = 1, has_alt = 0; + + bcf_hdr_t *hdr = bc->bcf_hdr; + rec->rid = bc->tid; + rec->pos = bc->pos; + rec->qual = 0; + + bc->tmp.l = 0; + if (bc->ori_ref < 0) // indel + { + // REF + kputc(ref[bc->pos], &bc->tmp); + for (j = 0; j < bca->indelreg; ++j) kputc(ref[bc->pos+1+j], &bc->tmp); + + // ALT + for (i=1; i<4; i++) + { + if (bc->a[i] < 0) break; + kputc(',', &bc->tmp); kputc(ref[bc->pos], &bc->tmp); + + if (bca->indel_types[bc->a[i]] < 0) { // deletion + for (j = -bca->indel_types[bc->a[i]]; j < bca->indelreg; ++j) + kputc(ref[bc->pos+1+j], &bc->tmp); + } else { // insertion; cannot be a reference unless a bug + char *inscns = &bca->inscns[bc->a[i] * bca->maxins]; + for (j = 0; j < bca->indel_types[bc->a[i]]; ++j) + kputc("ACGTN"[(int)inscns[j]], &bc->tmp); + for (j = 0; j < bca->indelreg; ++j) kputc(ref[bc->pos+1+j], &bc->tmp); + } + nals++; + has_alt = 1; + } + } + else // SNP + { + kputc("ACGTN"[bc->ori_ref], &bc->tmp); + for (i=1; i<5; i++) + { + if (bc->a[i] < 0) break; + kputc(',', &bc->tmp); + if ( bc->unseen==i ) kputs("<*>", &bc->tmp); + else + { + kputc("ACGT"[bc->a[i]], &bc->tmp); + has_alt = 1; + } + nals++; + } + } + bcf_update_alleles_str(hdr, rec, bc->tmp.s); + + bc->tmp.l = 0; + + // INFO + if (bc->ori_ref < 0) + { + bcf_update_info_flag(hdr, rec, "INDEL", NULL, 1); + bcf_update_info_int32(hdr, rec, "IDV", &bca->max_support, 1); + bcf_update_info_float(hdr, rec, "IMF", &bca->max_frac, 1); + } + bcf_update_info_int32(hdr, rec, "DP", &bc->ori_depth, 1); + if ( fmt_flag&B2B_INFO_ADF ) + bcf_update_info_int32(hdr, rec, "ADF", bc->ADF, rec->n_allele); + if ( fmt_flag&B2B_INFO_ADR ) + bcf_update_info_int32(hdr, rec, "ADR", bc->ADR, rec->n_allele); + if ( fmt_flag&(B2B_INFO_AD|B2B_INFO_DPR) ) + { + for (i=0; in_allele; i++) bc->ADF[i] += bc->ADR[i]; + if ( fmt_flag&B2B_INFO_AD ) + bcf_update_info_int32(hdr, rec, "AD", bc->ADF, rec->n_allele); + if ( fmt_flag&B2B_INFO_DPR ) + bcf_update_info_int32(hdr, rec, "DPR", bc->ADF, rec->n_allele); + } + if ( fmt_flag&B2B_INFO_SCR ) + bcf_update_info_int32(hdr, rec, "SCR", bc->SCR, 1); + + float tmpf[16]; + for (i=0; i<16; i++) tmpf[i] = bc->anno[i]; + bcf_update_info_float(hdr, rec, "I16", tmpf, 16); + bcf_update_info_float(hdr, rec, "QS", bc->qsum, nals); + + if ( has_alt ) + { + if ( bc->vdb != HUGE_VAL ) bcf_update_info_float(hdr, rec, "VDB", &bc->vdb, 1); + if ( bc->seg_bias != HUGE_VAL ) bcf_update_info_float(hdr, rec, "SGB", &bc->seg_bias, 1); + + if (bca->fmt_flag & B2B_INFO_ZSCORE) { + if ( bc->mwu_pos != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "RPBZ", &bc->mwu_pos, 1); + if ( bc->mwu_mq != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "MQBZ", &bc->mwu_mq, 1); + if ( bc->mwu_mqs != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "MQSBZ", &bc->mwu_mqs, 1); + if ( bc->mwu_bq != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "BQBZ", &bc->mwu_bq, 1); + if ( bc->mwu_nm[0] != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "NMBZ", bc->mwu_nm, 1); + if ( bc->mwu_sc != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "SCBZ", &bc->mwu_sc, 1); + } else { + if ( bc->mwu_pos != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "RPB", &bc->mwu_pos, 1); + if ( bc->mwu_mq != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "MQB", &bc->mwu_mq, 1); + if ( bc->mwu_mqs != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "MQSB", &bc->mwu_mqs, 1); + if ( bc->mwu_bq != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "BQB", &bc->mwu_bq, 1); + } + + if ( bc->strand_bias != HUGE_VAL ) + bcf_update_info_float(hdr, rec, "FS", &bc->strand_bias, 1); + +#if CDF_MWU_TESTS + if ( bc->mwu_pos_cdf != HUGE_VAL ) bcf_update_info_float(hdr, rec, "RPB2", &bc->mwu_pos_cdf, 1); + if ( bc->mwu_mq_cdf != HUGE_VAL ) bcf_update_info_float(hdr, rec, "MQB2", &bc->mwu_mq_cdf, 1); + if ( bc->mwu_mqs_cdf != HUGE_VAL ) bcf_update_info_float(hdr, rec, "MQSB2", &bc->mwu_mqs_cdf, 1); + if ( bc->mwu_bq_cdf != HUGE_VAL ) bcf_update_info_float(hdr, rec, "BQB2", &bc->mwu_bq_cdf, 1); +#endif + } + + tmpf[0] = bc->ori_depth ? (float)bc->mq0/bc->ori_depth : 0; + bcf_update_info_float(hdr, rec, "MQ0F", tmpf, 1); + + // FORMAT + rec->n_sample = bc->n; + bcf_update_format_int32(hdr, rec, "PL", bc->PL, nals*(nals+1)/2 * rec->n_sample); + if ( fmt_flag&B2B_FMT_DP ) + { + int32_t *ptr = (int32_t*) bc->fmt_arr; + for (i=0; in; i++) + ptr[i] = bc->DP4[4*i] + bc->DP4[4*i+1] + bc->DP4[4*i+2] + bc->DP4[4*i+3]; + bcf_update_format_int32(hdr, rec, "DP", bc->fmt_arr, rec->n_sample); + } + if ( fmt_flag&B2B_FMT_DV ) + { + int32_t *ptr = (int32_t*) bc->fmt_arr; + for (i=0; in; i++) + ptr[i] = bc->DP4[4*i+2] + bc->DP4[4*i+3]; + bcf_update_format_int32(hdr, rec, "DV", bc->fmt_arr, rec->n_sample); + } + if ( fmt_flag&B2B_FMT_SP ) + { + int32_t *ptr = (int32_t*) bc->fmt_arr; + for (i=0; in; i++) + { + int fwd_ref = bc->DP4[4*i], rev_ref = bc->DP4[4*i+1], fwd_alt = bc->DP4[4*i+2], rev_alt = bc->DP4[4*i+3]; + if ( fwd_ref+rev_ref<2 || fwd_alt+rev_alt<2 || fwd_ref+fwd_alt<2 || rev_ref+rev_alt<2 ) + ptr[i] = 0; + else + { + double left, right, two; + kt_fisher_exact(fwd_ref, rev_ref, fwd_alt, rev_alt, &left, &right, &two); + int32_t x = (int)(-4.343 * log(two) + .499); + if (x > 255) x = 255; + ptr[i] = x; + } + } + bcf_update_format_int32(hdr, rec, "SP", bc->fmt_arr, rec->n_sample); + } + if ( fmt_flag&B2B_FMT_DP4 ) + bcf_update_format_int32(hdr, rec, "DP4", bc->DP4, rec->n_sample*4); + if ( fmt_flag&B2B_FMT_ADF ) + bcf_update_format_int32(hdr, rec, "ADF", bc->ADF+B2B_MAX_ALLELES, rec->n_sample*rec->n_allele); + if ( fmt_flag&B2B_FMT_ADR ) + bcf_update_format_int32(hdr, rec, "ADR", bc->ADR+B2B_MAX_ALLELES, rec->n_sample*rec->n_allele); + if ( fmt_flag&(B2B_FMT_AD|B2B_FMT_DPR) ) + { + for (i=0; in_sample*rec->n_allele; i++) bc->ADF[B2B_MAX_ALLELES+i] += bc->ADR[B2B_MAX_ALLELES+i]; + if ( fmt_flag&B2B_FMT_AD ) + bcf_update_format_int32(hdr, rec, "AD", bc->ADF+B2B_MAX_ALLELES, rec->n_sample*rec->n_allele); + if ( fmt_flag&B2B_FMT_DPR ) + bcf_update_format_int32(hdr, rec, "DPR", bc->ADF+B2B_MAX_ALLELES, rec->n_sample*rec->n_allele); + } + if ( fmt_flag&B2B_FMT_SCR ) + bcf_update_format_int32(hdr, rec, "SCR", bc->SCR+1, rec->n_sample); + if ( fmt_flag&B2B_FMT_QS ) + bcf_update_format_int32(hdr, rec, "QS", bc->QS, rec->n_sample*rec->n_allele); + + if ( has_alt ) + { + if ( fmt_flag&B2B_FMT_NMBZ ) + bcf_update_format_float(hdr, rec, "NMBZ", bc->mwu_nm+1, rec->n_sample); + } + + return 0; +} diff --git a/bcftools/bam2bcf.h b/bcftools/bam2bcf.h new file mode 100644 index 0000000..c256b26 --- /dev/null +++ b/bcftools/bam2bcf.h @@ -0,0 +1,171 @@ +/* bam2bcf.h -- variant calling. + + Copyright (C) 2010-2012 Broad Institute. + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef BAM2BCF_H +#define BAM2BCF_H + +#include +#include +#include + +/** + * A simplified version of Mann-Whitney U-test is calculated + * by default (no CDF) because it is faster and seems to work + * better in machine learning filtering. When enabled by setting + * CDF_MWU_TESTS, additional annotations will appear on mpileup's + * output (RPB2 in addition to RPB, etc.). + */ +#ifndef CDF_MWU_TESTS +#define CDF_MWU_TESTS 0 +#endif + +#define B2B_INDEL_NULL 10000 + +#define B2B_FMT_DP (1<<0) +#define B2B_FMT_SP (1<<1) +#define B2B_FMT_DV (1<<2) +#define B2B_FMT_DP4 (1<<3) +#define B2B_FMT_DPR (1<<4) +#define B2B_INFO_DPR (1<<5) +#define B2B_FMT_AD (1<<6) +#define B2B_FMT_ADF (1<<7) +#define B2B_FMT_ADR (1<<8) +#define B2B_INFO_AD (1<<9) +#define B2B_INFO_ADF (1<<10) +#define B2B_INFO_ADR (1<<11) +#define B2B_INFO_SCR (1<<12) +#define B2B_FMT_SCR (1<<13) +#define B2B_INFO_VDB (1<<14) +#define B2B_INFO_RPB (1<<15) +#define B2B_FMT_QS (1<<16) +#define B2B_INFO_SCB (1<<17) +#define B2B_FMT_NMBZ (1<<18) // per-sample NMBZ +#define B2B_INFO_ZSCORE (1<<30) // MWU as-is or Z-normalised + +#define B2B_MAX_ALLELES 5 +#define B2B_N_NM 32 // number of NMBZ bins, i.e. max number of mismatches + + +#define B2B_DROP 0 +#define B2B_INC_AD 1 +#define B2B_INC_AD0 2 + +#define PLP_HAS_SOFT_CLIP(i) ((i)&1) +#define PLP_HAS_INDEL(i) ((i)&2) +#define PLP_SAMPLE_ID(i) ((i)>>2) + +#define PLP_SET_SOFT_CLIP(i) ((i)|=1) +#define PLP_SET_INDEL(i) ((i)|=2) +#define PLP_SET_SAMPLE_ID(i,n) ((i)|=(n)<<2) + +typedef struct __bcf_callaux_t { + int fmt_flag, ambig_reads; + int capQ, min_baseQ, max_baseQ, delta_baseQ; + int openQ, extQ, tandemQ; // for indels + uint32_t min_support, max_support; // for collecting indel candidates + double min_frac; // for collecting indel candidates + float max_frac; // for collecting indel candidates + int per_sample_flt; // indel filtering strategy + int *ref_pos, *alt_pos, npos, *ref_mq, *alt_mq, *ref_bq, *alt_bq, *fwd_mqs, *rev_mqs, nqual; // for bias tests + int *iref_pos, *ialt_pos, *iref_mq, *ialt_mq; // for indels + int ref_scl[100], alt_scl[100]; // soft-clip length bias; SNP + int iref_scl[100], ialt_scl[100]; // soft-clip length bias; INDEL + // for internal uses + int max_bases; + int indel_types[4]; // indel lengths + int indel_win_size; + int maxins, indelreg; + int read_len; + char *inscns; + uint16_t *bases; // 5bit: unused, 6:quality, 1:is_rev, 4:2-bit base or indel allele (index to bcf_callaux_t.indel_types) + errmod_t *e; + void *rghash; + float indel_bias; // adjusts indel score threshold; lower => call more. + int32_t *ref_nm, *alt_nm; // pointers to bcf_call_t.{ref_nm,alt_nm} +} bcf_callaux_t; + +// per-sample values +typedef struct { + uint32_t ori_depth; // ori_depth = anno[0..3] but before --min-BQ is applied + unsigned int mq0; + int32_t *ADF, *ADR, SCR, *QS; // FMT/QS + int32_t *ref_nm, *alt_nm; + // The fields are: + // depth fwd .. ref (0) and non-ref (2) + // depth rev .. ref (1) and non-ref (3) + // baseQ .. ref (4) and non-ref (6) + // baseQ^2 .. ref (5) and non-ref (7) + // mapQ .. ref (8) and non-ref (10) + // mapQ^2 .. ref (9) and non-ref (11) + // minDist .. ref (12) and non-ref (14) + // minDist^2 .. ref (13) and non-ref (15) + // Note that this probably needs a more thorough fix: int types in + // bcf_call_t do overflow with high-coverage data, such as exomes, and + // BCFv2 supports only floats which may not suffice. + double anno[16]; + float p[25]; // phred-scaled likelihood of each genotype +} bcf_callret1_t; + +// values for all samples +typedef struct { + int tid, pos; + bcf_hdr_t *bcf_hdr; + int a[5]; // alleles: ref, alt, alt2, alt3 + float qsum[B2B_MAX_ALLELES]; // INFO/QS tag + int n, n_alleles, shift, ori_ref, unseen; + int n_supp; // number of supporting non-reference reads + double anno[16]; + unsigned int depth, ori_depth, mq0; + int32_t *PL, *DP4, *ADR, *ADF, *SCR, *QS, *ref_nm, *alt_nm; + uint8_t *fmt_arr; + float vdb; // variant distance bias + float mwu_pos, mwu_mq, mwu_bq, mwu_mqs, mwu_sc, *mwu_nm; +#if CDF_MWU_TESTS + float mwu_pos_cdf, mwu_mq_cdf, mwu_bq_cdf, mwu_mqs_cdf; +#endif + float seg_bias; + float strand_bias; // phred-scaled fisher-exact test + kstring_t tmp; +} bcf_call_t; + +#ifdef __cplusplus +extern "C" { +#endif + + bcf_callaux_t *bcf_call_init(double theta, int min_baseQ, int max_baseQ, + int delta_baseQ); + void bcf_call_destroy(bcf_callaux_t *bca); + int bcf_call_glfgen(int _n, const bam_pileup1_t *pl, int ref_base, bcf_callaux_t *bca, bcf_callret1_t *r); + int bcf_call_combine(int n, const bcf_callret1_t *calls, bcf_callaux_t *bca, int ref_base /*4-bit*/, bcf_call_t *call); + int bcf_call2bcf(bcf_call_t *bc, bcf1_t *b, bcf_callret1_t *bcr, int fmt_flag, + const bcf_callaux_t *bca, const char *ref); + int bcf_call_gap_prep(int n, int *n_plp, bam_pileup1_t **plp, int pos, bcf_callaux_t *bca, const char *ref); + void bcf_callaux_clean(bcf_callaux_t *bca, bcf_call_t *call); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bcftools/bam2bcf_indel.c b/bcftools/bam2bcf_indel.c new file mode 100644 index 0000000..108d505 --- /dev/null +++ b/bcftools/bam2bcf_indel.c @@ -0,0 +1,947 @@ +/* bam2bcf_indel.c -- indel caller. + + Copyright (C) 2010, 2011 Broad Institute. + Copyright (C) 2012-2014,2016-2017, 2021 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include "bam2bcf.h" +#include "str_finder.h" + +#include +KSORT_INIT_GENERIC(uint32_t) + +#define MINUS_CONST 0x10000000 + +#define MAX_TYPES 64 + +// Take a reference position tpos and convert to a query position (returned). +// This uses the CIGAR string plus alignment c->pos to do the mapping. +// +// *_tpos is returned as tpos if query overlaps tpos, but for deletions +// it'll be either the start (is_left) or end (!is_left) ref position. +static int tpos2qpos(const bam1_core_t *c, const uint32_t *cigar, int32_t tpos, int is_left, int32_t *_tpos) +{ + // x = pos in ref, y = pos in query seq + int k, x = c->pos, y = 0, last_y = 0; + *_tpos = c->pos; + for (k = 0; k < c->n_cigar; ++k) { + int op = cigar[k] & BAM_CIGAR_MASK; + int l = cigar[k] >> BAM_CIGAR_SHIFT; + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + if (c->pos > tpos) return y; + if (x + l > tpos) { + *_tpos = tpos; + return y + (tpos - x); + } + x += l; y += l; + last_y = y; + } else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) y += l; + else if (op == BAM_CDEL || op == BAM_CREF_SKIP) { + if (x + l > tpos) { + *_tpos = is_left? x : x + l; + return y; + } + x += l; + } + } + *_tpos = x; + return last_y; +} + +// FIXME: check if the inserted sequence is consistent with the homopolymer run +// l is the relative gap length and l_run is the length of the homopolymer on the reference +static inline int est_seqQ(const bcf_callaux_t *bca, int l, int l_run) +{ + int q, qh; + q = bca->openQ + bca->extQ * (abs(l) - 1); + qh = l_run >= 3? (int)(bca->tandemQ * (double)abs(l) / l_run + .499) : 1000; + return q < qh? q : qh; +} + +static inline int est_indelreg(int pos, const char *ref, int l, char *ins4) +{ + int i, j, max = 0, max_i = pos, score = 0; + l = abs(l); + for (i = pos + 1, j = 0; ref[i]; ++i, ++j) { + if (ins4) score += (toupper(ref[i]) != "ACGTN"[(int)ins4[j%l]])? -10 : 1; + else score += (toupper(ref[i]) != toupper(ref[pos+1+j%l]))? -10 : 1; + if (score < 0) break; + if (max < score) max = score, max_i = i; + } + return max_i - pos; +} + +// Identify spft-clip length, position in seq, and clipped seq len +static inline void get_pos(const bcf_callaux_t *bca, bam_pileup1_t *p, + int *sc_len_r, int *slen_r, int *epos_r, int *end) { + bam1_t *b = p->b; + int sc_len = 0, sc_dist = -1, at_left = 1; + int epos = p->qpos, slen = b->core.l_qseq; + int k; + uint32_t *cigar = bam_get_cigar(b); + *end = -1; + for (k = 0; k < b->core.n_cigar; k++) { + int op = bam_cigar_op(cigar[k]); + if (op == BAM_CSOFT_CLIP) { + slen -= bam_cigar_oplen(cigar[k]); + if (at_left) { + // left end + sc_len += bam_cigar_oplen(cigar[k]); + epos -= sc_len; // don't count SC in seq pos + sc_dist = epos; + *end = 0; + } else { + // right end + int srlen = bam_cigar_oplen(cigar[k]); + int rd = b->core.l_qseq - srlen - p->qpos; + if (sc_dist < 0 || sc_dist > rd) { + // closer to right end than left + // FIXME: compensate for indel length too? + sc_dist = rd; + sc_len = srlen; + *end = 1; + } + } + } else if (op != BAM_CHARD_CLIP) { + at_left = 0; + } + } + + if (p->indel > 0 && slen - (epos+p->indel) < epos) + epos += p->indel-1; // end of insertion, if near end of seq + + // slen is now length of sequence minus soft-clips and + // epos is position of indel in seq minus left-clip. + *epos_r = (double)epos / (slen+1) * bca->npos; + + if (sc_len) { + // scale importance of clip by distance to closest end + *sc_len_r = 15.0*sc_len / (sc_dist+1); + if (*sc_len_r > 99) *sc_len_r = 99; + } else { + *sc_len_r = 0; + } + + *slen_r = slen; +} + +// Part of bcf_call_gap_prep. +// +// Scans the pileup to identify all the different sizes of indels +// present. +// +// Returns types and fills out n_types_r, max_rd_len_r and ref_type_r, +// or NULL on error. +static int *bcf_cgp_find_types(int n, int *n_plp, bam_pileup1_t **plp, + int pos, bcf_callaux_t *bca, const char *ref, + int *max_rd_len_r, int *n_types_r, + int *ref_type_r, int *N_r) { + int i, j, t, s, N, m, max_rd_len, n_types; + int n_alt = 0, n_tot = 0, indel_support_ok = 0; + uint32_t *aux; + int *types; + + // N is the total number of reads + for (s = N = 0; s < n; ++s) + N += n_plp[s]; + + bca->max_support = bca->max_frac = 0; + aux = (uint32_t*) calloc(N + 1, 4); + if (!aux) + return NULL; + + m = max_rd_len = 0; + aux[m++] = MINUS_CONST; // zero indel is always a type (REF) + + // Fill out aux[] array with all the non-zero indel sizes. + // Also tally number with indels (n_alt) and total (n_tot). + for (s = 0; s < n; ++s) { + int na = 0, nt = 0; + for (i = 0; i < n_plp[s]; ++i) { + const bam_pileup1_t *p = plp[s] + i; + ++nt; + if (p->indel != 0) { + ++na; + aux[m++] = MINUS_CONST + p->indel; + } + + // FIXME: cache me in pileup struct. + j = bam_cigar2qlen(p->b->core.n_cigar, bam_get_cigar(p->b)); + if (j > max_rd_len) max_rd_len = j; + } + double frac = (double)na/nt; + if ( !indel_support_ok && na >= bca->min_support + && frac >= bca->min_frac ) + indel_support_ok = 1; + if ( na > bca->max_support && frac > 0 ) + bca->max_support = na, bca->max_frac = frac; + + n_alt += na; + n_tot += nt; + } + + // Sort aux[] and dedup + ks_introsort(uint32_t, m, aux); + for (i = 1, n_types = 1; i < m; ++i) + if (aux[i] != aux[i-1]) ++n_types; + + // Taking totals makes it hard to call rare indels (IMF filter) + if ( !bca->per_sample_flt ) + indel_support_ok = ( (double)n_alt / n_tot < bca->min_frac + || n_alt < bca->min_support ) + ? 0 : 1; + if ( n_types == 1 || !indel_support_ok ) { // then skip + free(aux); + return NULL; + } + + // Bail out if we have far too many types of indel + if (n_types >= MAX_TYPES) { + free(aux); + // TODO revisit how/whether to control printing this warning + if (hts_verbose >= 2) + fprintf(stderr, "[%s] excessive INDEL alleles at position %d. " + "Skip the position.\n", __func__, pos + 1); + return NULL; + } + + // To prevent long stretches of N's to be mistaken for indels + // (sometimes thousands of bases), check the number of N's in the + // sequence and skip places where half or more reference bases are Ns. + int nN=0, i_end = pos + (2*bca->indel_win_size < max_rd_len + ?2*bca->indel_win_size : max_rd_len); + for (i=pos; i(i-pos) ) { + free(aux); + return NULL; + } + + // Finally fill out the types[] array detailing the size of insertion + // or deletion. + types = (int*)calloc(n_types, sizeof(int)); + if (!types) { + free(aux); + return NULL; + } + t = 0; + types[t++] = aux[0] - MINUS_CONST; + for (i = 1; i < m; ++i) + if (aux[i] != aux[i-1]) + types[t++] = aux[i] - MINUS_CONST; + free(aux); + + // Find reference type; types[?] == 0) + for (t = 0; t < n_types; ++t) + if (types[t] == 0) break; + + *ref_type_r = t; + *n_types_r = n_types; + *max_rd_len_r = max_rd_len; + *N_r = N; + + return types; +} + +// Part of bcf_call_gap_prep. +// +// Construct per-sample consensus. +// +// Returns an array of consensus seqs, +// or NULL on failure. +static char **bcf_cgp_ref_sample(int n, int *n_plp, bam_pileup1_t **plp, + int pos, bcf_callaux_t *bca, const char *ref, + int left, int right) { + int i, k, s, L = right - left + 1, max_i, max2_i; + char **ref_sample; // returned + uint32_t *cns = NULL, max, max2; + char *ref0 = NULL, *r; + ref_sample = (char**) calloc(n, sizeof(char*)); + cns = (uint32_t*) calloc(L, 4); + ref0 = (char*) calloc(L, 1); + if (!ref_sample || !cns || !ref0) { + n = 0; + goto err; + } + + // Convert ref ASCII to 0-15. + for (i = 0; i < right - left; ++i) + ref0[i] = seq_nt16_table[(int)ref[i+left]]; + + // NB: one consensus per sample 'n', not per indel type. + // FIXME: consider fixing this. We should compute alignments vs + // types, not vs samples? Or types/sample combined? + for (s = 0; s < n; ++s) { + r = ref_sample[s] = (char*) calloc(L, 1); + if (!r) { + n = s-1; + goto err; + } + + memset(cns, 0, sizeof(int) * L); + + // collect ref and non-ref counts in cns + for (i = 0; i < n_plp[s]; ++i) { + bam_pileup1_t *p = plp[s] + i; + bam1_t *b = p->b; + uint32_t *cigar = bam_get_cigar(b); + uint8_t *seq = bam_get_seq(b); + int x = b->core.pos, y = 0; + + // TODO: pileup exposes pileup_ind, but we also need e.g. + // pileup_len to know how much of the current CIGAR op-len + // we've used (or have remaining). If we had that, we + // could start at p->qpos without having to scan through + // the entire CIGAR string until we find it. + // + // Without it about all we could do is have a side channel + // to cache the last known coords. Messy, so punt for now. + // This is no longer the bottle neck until we get to 1000s of + // CIGAR ops. + + for (k = 0; k < b->core.n_cigar; ++k) { + int op = cigar[k]&0xf; + int j, l = cigar[k]>>4; + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + if (x + l >= left) { + j = left - x > 0 ? left - x : 0; + int j_end = right - x < l ? right - x : l; + for (; j < j_end; j++) + // Append to cns. Note this is ref coords, + // so insertions aren't in cns and deletions + // will have lower coverage. + + // FIXME: want true consensus (with ins) per + // type, so we can independently compare each + // seq to each consensus and see which it + // matches best, so we get proper GT analysis. + cns[x+j-left] += + (bam_seqi(seq, y+j) == ref0[x+j-left]) + ? 1 // REF + : (1<<16); // ALT + } + x += l; y += l; + } else if (op == BAM_CDEL || op == BAM_CREF_SKIP) { + x += l; + } else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) { + y += l; + } + + if (x > right) + break; + } + } + + // Determine a sample specific reference. + for (i = 0; i < right - left; ++i) + r[i] = ref0[i]; + + // Find deepest and 2nd deepest ALT region (max & max2). + max = max2 = 0; max_i = max2_i = -1; + for (i = 0; i < right - left; ++i) { + if (cns[i]>>16 >= max>>16) + max2 = max, max2_i = max_i, max = cns[i], max_i = i; + else if (cns[i]>>16 >= max2>>16) + max2 = cns[i], max2_i = i; + } + + // Masks mismatches present in at least 70% of the reads with 'N'. + // This code is nREF/(nREF+n_ALT) >= 70% for deepest region. + // The effect is that at least 30% of bases differing to REF will + // use "N" in consensus, so we don't penalise ALT or REF when + // aligning against it. (A poor man IUPAC code) + // + // Why is it only done in two loci at most? + if ((double)(max&0xffff) / ((max&0xffff) + (max>>16)) >= 0.7) + max_i = -1; + if ((double)(max2&0xffff) / ((max2&0xffff) + (max2>>16)) >= 0.7) + max2_i = -1; + if (max_i >= 0) r[max_i] = 15; + if (max2_i >= 0) r[max2_i] = 15; + + //for (i = 0; i < right - left; ++i) + // fputc("=ACMGRSVTWYHKDBN"[(int)r[i]], stderr); + //fputc('\n', stderr); + } + + free(ref0); + free(cns); + + return ref_sample; + + err: + free(ref0); + free(cns); + if (ref_sample) { + for (s = 0; s < n; s++) + free(ref_sample[s]); + free(ref_sample); + } + + return NULL; +} + +// The length of the homopolymer run around the current position +static int bcf_cgp_l_run(const char *ref, int pos) { + int i, l_run; + + int c = seq_nt16_table[(int)ref[pos + 1]]; + if (c == 15) { + l_run = 1; + } else { + for (i = pos + 2; ref[i]; ++i) + if (seq_nt16_table[(int)ref[i]] != c) break; + l_run = i; + for (i = pos; i >= 0; --i) + if (seq_nt16_table[(int)ref[i]] != c) break; + l_run -= i + 1; + } + + return l_run; +} + + +// Compute the consensus for this sample 's', minus indels which +// get added later. +static char *bcf_cgp_calc_cons(int n, int *n_plp, bam_pileup1_t **plp, + int pos, int *types, int n_types, + int max_ins, int s) { + int i, j, t, k; + int *inscns_aux = (int*)calloc(5 * n_types * max_ins, sizeof(int)); + if (!inscns_aux) + return NULL; + + // Count the number of occurrences of each base at each position for + // each type of insertion. + for (t = 0; t < n_types; ++t) { + if (types[t] > 0) { + for (s = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i) { + bam_pileup1_t *p = plp[s] + i; + if (p->indel == types[t]) { + uint8_t *seq = bam_get_seq(p->b); + for (k = 1; k <= p->indel; ++k) { + int c = seq_nt16_int[bam_seqi(seq, p->qpos + k)]; + assert(c<5); + ++inscns_aux[(t*max_ins+(k-1))*5 + c]; + } + } + } + } + } + } + + // Use the majority rule to construct the consensus + char *inscns = (char *)calloc(n_types * max_ins, 1); + for (t = 0; t < n_types; ++t) { + for (j = 0; j < types[t]; ++j) { + int max = 0, max_k = -1, *ia = &inscns_aux[(t*max_ins+j)*5]; + for (k = 0; k < 5; ++k) + if (ia[k] > max) + max = ia[k], max_k = k; + inscns[t*max_ins + j] = max ? max_k : 4; + if (max_k == 4) { + // discard insertions which contain N's + types[t] = 0; + break; + } + } + } + free(inscns_aux); + + return inscns; +} + +#ifndef MIN +# define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +// Part of bcf_call_gap_prep. +// +// Realign using BAQ to get an alignment score of a single read vs +// a haplotype consensus. +// +// Fills out score +// Returns 0 on success, +// <0 on error +static int bcf_cgp_align_score(bam_pileup1_t *p, bcf_callaux_t *bca, + int type, uint8_t *ref2, uint8_t *query, + int r_start, int r_end, int long_read, + int tbeg, int tend, + int left, int right, + int qbeg, int qend, + int qpos, int max_deletion, + int *score) { + // Illumina + probaln_par_t apf = { 1e-4, 1e-2, 10 }; + + // Parameters that work better on PacBio CCS 15k. + // We should consider querying the header and RG PU field. + // See also htslib/realn.c:sam_prob_realn() + if (long_read) { + apf.d = 1e-3; + apf.e = 1e-1; + } + + type = abs(type); + apf.bw = type + 3; + int l, sc; + const uint8_t *qual = bam_get_qual(p->b), *bq; + uint8_t *qq; + + // Get segment of quality, either ZQ tag or if absent QUAL. + if (!(qq = (uint8_t*) calloc(qend - qbeg, 1))) + return -1; + bq = (uint8_t*)bam_aux_get(p->b, "ZQ"); + if (bq) ++bq; // skip type + for (l = qbeg; l < qend; ++l) { + int qval = bq? qual[l] + (bq[l] - 64) : qual[l]; + if (qval > 30) + qval = 30; + if (qval < 7) + qval = 7; + qq[l - qbeg] = qval; + } + + // The bottom 8 bits are length-normalised score while + // the top bits are unnormalised. + sc = probaln_glocal(ref2 + tbeg - left, tend - tbeg + type, + query, qend - qbeg, qq, &apf, 0, 0); + if (sc < 0) { + *score = 0xffffff; + free(qq); + return 0; + } + + // used for adjusting indelQ below + l = (int)(100. * sc / (qend - qbeg) + .499) * bca->indel_bias; + *score = sc<<8 | MIN(255, l); + + rep_ele *reps, *elt, *tmp; + uint8_t *seg = ref2 + tbeg - left; + int seg_len = tend - tbeg + type; + + // Note: although seg moves (tbeg varies), ref2 is reused many times + // so we could factor out some find_STR calls. However it's not the + // bottleneck for now. + + // FIXME: need to make this work on IUPAC. + reps = find_STR((char *)seg, seg_len, 0); + int iscore = 0; + + // Identify STRs in ref covering the indel up to + // (or close to) the end of the sequence. + // Those having an indel and right at the sequence + // end do not confirm the total length of indel + // size. Specifically a *lack* of indel at the + // end, where we know indels occur in other + // sequences, is a possible reference bias. + // + // This is emphasised further if the sequence ends with + // soft clipping. + DL_FOREACH_SAFE(reps, elt, tmp) { + if (elt->start <= qpos && elt->end >= qpos) { + iscore += (elt->end-elt->start) / elt->rep_len; // c + if (elt->start+tbeg <= r_start || + elt->end+tbeg >= r_end) + iscore += 2*(elt->end-elt->start); + } + + DL_DELETE(reps, elt); + free(elt); + } + + // Apply STR score to existing indelQ + l = (*score&0xff)*.8 + iscore*2; + *score = (*score & ~0xff) | MIN(255, l); + + free(qq); + + return 0; +} + +// Part of bcf_call_gap_prep. +// +// Returns n_alt on success +// -1 on failure +static int bcf_cgp_compute_indelQ(int n, int *n_plp, bam_pileup1_t **plp, + bcf_callaux_t *bca, char *inscns, + int l_run, int max_ins, + int ref_type, int *types, int n_types, + int *score) { + // FIXME: n_types has a maximum; no need to alloc - use a #define? + int sc[MAX_TYPES], sumq[MAX_TYPES], s, i, j, t, K, n_alt, tmp; + memset(sumq, 0, n_types * sizeof(int)); + for (s = K = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i, ++K) { + bam_pileup1_t *p = plp[s] + i; + int *sct = &score[K*n_types], seqQ, indelQ; + for (t = 0; t < n_types; ++t) sc[t] = sct[t]<<6 | t; + for (t = 1; t < n_types; ++t) // insertion sort + for (j = t; j > 0 && sc[j] < sc[j-1]; --j) + tmp = sc[j], sc[j] = sc[j-1], sc[j-1] = tmp; + + /* errmod_cal() assumes that if the call is wrong, the + * likelihoods of other events are equal. This is about + * right for substitutions, but is not desired for + * indels. To reuse errmod_cal(), I have to make + * compromise for multi-allelic indels. + */ + if ((sc[0]&0x3f) == ref_type) { + indelQ = (sc[1]>>14) - (sc[0]>>14); + seqQ = est_seqQ(bca, types[sc[1]&0x3f], l_run); + } else { + for (t = 0; t < n_types; ++t) // look for the reference type + if ((sc[t]&0x3f) == ref_type) break; + indelQ = (sc[t]>>14) - (sc[0]>>14); + seqQ = est_seqQ(bca, types[sc[0]&0x3f], l_run); + } + tmp = sc[0]>>6 & 0xff; + // reduce indelQ + indelQ = tmp > 111? 0 : (int)((1. - tmp/111.) * indelQ + .499); + + // Doesn't really help accuracy, but permits -h to take + // affect still. + if (indelQ > seqQ) indelQ = seqQ; + if (indelQ > 255) indelQ = 255; + if (seqQ > 255) seqQ = 255; + p->aux = (sc[0]&0x3f)<<16 | seqQ<<8 | indelQ; // use 22 bits in total + sumq[sc[0]&0x3f] += indelQ < seqQ? indelQ : seqQ; + // fprintf(stderr, "pos=%d read=%d:%d name=%s call=%d indelQ=%d seqQ=%d\n", pos, s, i, bam1_qname(p->b), types[sc[0]&0x3f], indelQ, seqQ); + } + } + // determine bca->indel_types[] and bca->inscns + bca->maxins = max_ins; + bca->inscns = (char*) realloc(bca->inscns, bca->maxins * 4); + if (bca->maxins && !bca->inscns) + return -1; + for (t = 0; t < n_types; ++t) + sumq[t] = sumq[t]<<6 | t; + for (t = 1; t < n_types; ++t) // insertion sort + for (j = t; j > 0 && sumq[j] > sumq[j-1]; --j) + tmp = sumq[j], sumq[j] = sumq[j-1], sumq[j-1] = tmp; + for (t = 0; t < n_types; ++t) // look for the reference type + if ((sumq[t]&0x3f) == ref_type) break; + if (t) { // then move the reference type to the first + tmp = sumq[t]; + for (; t > 0; --t) sumq[t] = sumq[t-1]; + sumq[0] = tmp; + } + for (t = 0; t < 4; ++t) bca->indel_types[t] = B2B_INDEL_NULL; + for (t = 0; t < 4 && t < n_types; ++t) { + bca->indel_types[t] = types[sumq[t]&0x3f]; + if (bca->maxins) + memcpy(&bca->inscns[t * bca->maxins], + &inscns[(sumq[t]&0x3f) * max_ins], bca->maxins); + } + // update p->aux + for (s = n_alt = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i) { + bam_pileup1_t *p = plp[s] + i; + int x = types[p->aux>>16&0x3f]; + for (j = 0; j < 4; ++j) + if (x == bca->indel_types[j]) break; + p->aux = j<<16 | (j == 4? 0 : (p->aux&0xffff)); + if ((p->aux>>16&0x3f) > 0) ++n_alt; + //fprintf(stderr, "X pos=%d read=%d:%d name=%s call=%d type=%d seqQ=%d indelQ=%d\n", pos, s, i, bam_get_qname(p->b), (p->aux>>16)&0x3f, bca->indel_types[(p->aux>>16)&0x3f], (p->aux>>8)&0xff, p->aux&0xff); + } + } + + return n_alt; +} + +/* +FIXME: with high number of samples, do we handle IMF correctly? Is it +fraction of indels across entire data set, or just fraction for this +specific sample? Needs to check bca->per_sample_flt (--per-sample-mF) opt. + */ + +/* + notes: + - n .. number of samples + - the routine sets bam_pileup1_t.aux of each read as follows: + - 6: unused + - 6: the call; index to bcf_callaux_t.indel_types .. (aux>>16)&0x3f + - 8: estimated sequence quality .. (aux>>8)&0xff + - 8: indel quality .. aux&0xff + */ +int bcf_call_gap_prep(int n, int *n_plp, bam_pileup1_t **plp, int pos, + bcf_callaux_t *bca, const char *ref) +{ + if (ref == 0 || bca == 0) return -1; + + int i, s, j, k, t, n_types, *types, max_rd_len, left, right, max_ins; + int *score, max_ref2; + int N, K, l_run, ref_type, n_alt; + char *inscns = 0, *ref2, *query, **ref_sample; + + // determine if there is a gap + for (s = N = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i) + if (plp[s][i].indel != 0) break; + if (i < n_plp[s]) break; + } + if (s == n) + // there is no indel at this position. + return -1; + + // find out how many types of indels are present + types = bcf_cgp_find_types(n, n_plp, plp, pos, bca, ref, + &max_rd_len, &n_types, &ref_type, &N); + if (!types) + return -1; + + + // calculate left and right boundary + left = pos > bca->indel_win_size ? pos - bca->indel_win_size : 0; + right = pos + bca->indel_win_size; + if (types[0] < 0) right -= types[0]; + + // in case the alignments stand out the reference + for (i = pos; i < right; ++i) + if (ref[i] == 0) break; + right = i; + + + /* The following call fixes a long-existing flaw in the INDEL + * calling model: the interference of nearby SNPs. However, it also + * reduces the power because sometimes, substitutions caused by + * indels are not distinguishable from true mutations. Multiple + * sequence realignment helps to increase the power. + * + * Masks mismatches present in at least 70% of the reads with 'N'. + */ + ref_sample = bcf_cgp_ref_sample(n, n_plp, plp, pos, bca, ref, left, right); + + // The length of the homopolymer run around the current position + l_run = bcf_cgp_l_run(ref, pos); + + // construct the consensus sequence (minus indels, which are added later) + max_ins = types[n_types - 1]; // max_ins is at least 0 + if (max_ins > 0) { + inscns = bcf_cgp_calc_cons(n, n_plp, plp, pos, + types, n_types, max_ins, s); + if (!inscns) + return -1; + } + + // compute the likelihood given each type of indel for each read + max_ref2 = right - left + 2 + 2 * (max_ins > -types[0]? max_ins : -types[0]); + ref2 = (char*) calloc(max_ref2, 1); + query = (char*) calloc(right - left + max_rd_len + max_ins + 2, 1); + score = (int*) calloc(N * n_types, sizeof(int)); + bca->indelreg = 0; + double nqual_over_60 = bca->nqual / 60.0; + + for (t = 0; t < n_types; ++t) { + int l, ir; + + // compute indelreg + if (types[t] == 0) + ir = 0; + else if (types[t] > 0) + ir = est_indelreg(pos, ref, types[t], &inscns[t*max_ins]); + else + ir = est_indelreg(pos, ref, -types[t], 0); + + if (ir > bca->indelreg) + bca->indelreg = ir; + + // Identify max deletion length + int max_deletion = 0; + for (s = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i, ++K) { + bam_pileup1_t *p = plp[s] + i; + if (max_deletion < -p->indel) + max_deletion = -p->indel; + } + } + + // Realignment score, computed via BAQ + for (s = K = 0; s < n; ++s) { + // Construct ref2 from ref_sample, inscns and indels. + // This is now the true sample consensus (possibly prepended + // and appended with reference if sample data doesn't span + // the full length). + for (k = 0, j = left; j <= pos; ++j) + ref2[k++] = seq_nt16_int[(int)ref_sample[s][j-left]]; + + if (types[t] <= 0) + j += -types[t]; + else + for (l = 0; l < types[t]; ++l) + ref2[k++] = inscns[t*max_ins + l]; + + for (; j < right && ref[j]; ++j) + ref2[k++] = seq_nt16_int[(int)ref_sample[s][j-left]]; + for (; k < max_ref2; ++k) + ref2[k] = 4; + + if (right > j) + right = j; + + // align each read to ref2 + for (i = 0; i < n_plp[s]; ++i, ++K) { + bam_pileup1_t *p = plp[s] + i; + + // Some basic ref vs alt stats. + int imq = p->b->core.qual > 59 ? 59 : p->b->core.qual; + imq *= nqual_over_60; + + int sc_len, slen, epos, sc_end; + + // Only need to gather stats on one type, as it's + // identical calculation for all the subsequent ones + // and we're sharing the same stats array + if (t == 0) { + // Gather stats for INFO field to aid filtering. + // mq and sc_len not very helpful for filtering, but could + // help in assigning a better QUAL value. + // + // Pos is slightly useful. + // Base qual can be useful, but need qual prior to BAQ? + // May need to cache orig quals in aux tag so we can fetch + // them even after mpileup step. + get_pos(bca, p, &sc_len, &slen, &epos, &sc_end); + + assert(imq >= 0 && imq < bca->nqual); + assert(epos >= 0 && epos < bca->npos); + assert(sc_len >= 0 && sc_len < 100); + if (p->indel) { + bca->ialt_mq[imq]++; + bca->ialt_scl[sc_len]++; + bca->ialt_pos[epos]++; + } else { + bca->iref_mq[imq]++; + bca->iref_scl[sc_len]++; + bca->iref_pos[epos]++; + } + } + + int qbeg, qpos, qend, tbeg, tend, kk; + uint8_t *seq = bam_get_seq(p->b); + uint32_t *cigar = bam_get_cigar(p->b); + if (p->b->core.flag & BAM_FUNMAP) continue; + + // FIXME: the following loop should be better moved outside; + // nonetheless, realignment should be much slower anyway. + for (kk = 0; kk < p->b->core.n_cigar; ++kk) + if ((cigar[kk]&BAM_CIGAR_MASK) == BAM_CREF_SKIP) + break; + if (kk < p->b->core.n_cigar) + continue; + + // determine the start and end of sequences for alignment + // FIXME: loops over CIGAR multiple times + int left2 = left, right2 = right; + if (p->b->core.l_qseq > 1000) { + // long read data needs less context. It also tends to + // have many more candidate indels to investigate so + // speed here matters more. + if (pos - left >= bca->indel_win_size) + left2 += bca->indel_win_size/2; + if (right-pos >= bca->indel_win_size) + right2 -= bca->indel_win_size/2; + } + + int r_start = p->b->core.pos; + int r_end = bam_cigar2rlen(p->b->core.n_cigar, + bam_get_cigar(p->b)) + -1 + r_start; + + qbeg = tpos2qpos(&p->b->core, bam_get_cigar(p->b), left2, + 0, &tbeg); + qpos = tpos2qpos(&p->b->core, bam_get_cigar(p->b), pos, + 0, &tend) - qbeg; + qend = tpos2qpos(&p->b->core, bam_get_cigar(p->b), right2, + 1, &tend); + + if (types[t] < 0) { + int l = -types[t]; + tbeg = tbeg - l > left? tbeg - l : left; + } + + // write the query sequence + for (l = qbeg; l < qend; ++l) + query[l - qbeg] = seq_nt16_int[bam_seqi(seq, l)]; + + // A fudge for now. Consider checking SAM header for + // RG platform field. + int long_read = p->b->core.l_qseq > 1000; + + // do realignment; this is the bottleneck + if (tend > tbeg) { + if (bcf_cgp_align_score(p, bca, types[t], + (uint8_t *)ref2 + left2-left, + (uint8_t *)query, + r_start, r_end, long_read, + tbeg, tend, left2, right2, + qbeg, qend, qpos, max_deletion, + &score[K*n_types + t]) < 0) { + score[K*n_types + t] = 0xffffff; + return -1; + } + } else { + // place holder large cost for reads that cover the + // region entirely within a deletion (thus tend < tbeg). + score[K*n_types + t] = 0xffffff; + } +#if 0 + for (l = 0; l < tend - tbeg + abs(types[t]); ++l) + fputc("ACGTN"[(int)ref2[tbeg-left+l]], stderr); + fputc('\n', stderr); + for (l = 0; l < qend - qbeg; ++l) + fputc("ACGTN"[(int)query[l]], stderr); + fputc('\n', stderr); + fprintf(stderr, "pos=%d type=%d read=%d:%d name=%s " + "qbeg=%d tbeg=%d score=%d\n", + pos, types[t], s, i, bam_get_qname(p->b), + qbeg, tbeg, sc); +#endif + } + } + } + + // compute indelQ + n_alt = bcf_cgp_compute_indelQ(n, n_plp, plp, bca, inscns, l_run, max_ins, + ref_type, types, n_types, score); + + // free + free(ref2); + free(query); + free(score); + + for (i = 0; i < n; ++i) + free(ref_sample[i]); + + free(ref_sample); + free(types); free(inscns); + + return n_alt > 0? 0 : -1; +} diff --git a/bcftools/bam2bcf_indel.c.pysam.c b/bcftools/bam2bcf_indel.c.pysam.c new file mode 100644 index 0000000..c2287de --- /dev/null +++ b/bcftools/bam2bcf_indel.c.pysam.c @@ -0,0 +1,949 @@ +#include "bcftools.pysam.h" + +/* bam2bcf_indel.c -- indel caller. + + Copyright (C) 2010, 2011 Broad Institute. + Copyright (C) 2012-2014,2016-2017, 2021 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include "bam2bcf.h" +#include "str_finder.h" + +#include +KSORT_INIT_GENERIC(uint32_t) + +#define MINUS_CONST 0x10000000 + +#define MAX_TYPES 64 + +// Take a reference position tpos and convert to a query position (returned). +// This uses the CIGAR string plus alignment c->pos to do the mapping. +// +// *_tpos is returned as tpos if query overlaps tpos, but for deletions +// it'll be either the start (is_left) or end (!is_left) ref position. +static int tpos2qpos(const bam1_core_t *c, const uint32_t *cigar, int32_t tpos, int is_left, int32_t *_tpos) +{ + // x = pos in ref, y = pos in query seq + int k, x = c->pos, y = 0, last_y = 0; + *_tpos = c->pos; + for (k = 0; k < c->n_cigar; ++k) { + int op = cigar[k] & BAM_CIGAR_MASK; + int l = cigar[k] >> BAM_CIGAR_SHIFT; + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + if (c->pos > tpos) return y; + if (x + l > tpos) { + *_tpos = tpos; + return y + (tpos - x); + } + x += l; y += l; + last_y = y; + } else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) y += l; + else if (op == BAM_CDEL || op == BAM_CREF_SKIP) { + if (x + l > tpos) { + *_tpos = is_left? x : x + l; + return y; + } + x += l; + } + } + *_tpos = x; + return last_y; +} + +// FIXME: check if the inserted sequence is consistent with the homopolymer run +// l is the relative gap length and l_run is the length of the homopolymer on the reference +static inline int est_seqQ(const bcf_callaux_t *bca, int l, int l_run) +{ + int q, qh; + q = bca->openQ + bca->extQ * (abs(l) - 1); + qh = l_run >= 3? (int)(bca->tandemQ * (double)abs(l) / l_run + .499) : 1000; + return q < qh? q : qh; +} + +static inline int est_indelreg(int pos, const char *ref, int l, char *ins4) +{ + int i, j, max = 0, max_i = pos, score = 0; + l = abs(l); + for (i = pos + 1, j = 0; ref[i]; ++i, ++j) { + if (ins4) score += (toupper(ref[i]) != "ACGTN"[(int)ins4[j%l]])? -10 : 1; + else score += (toupper(ref[i]) != toupper(ref[pos+1+j%l]))? -10 : 1; + if (score < 0) break; + if (max < score) max = score, max_i = i; + } + return max_i - pos; +} + +// Identify spft-clip length, position in seq, and clipped seq len +static inline void get_pos(const bcf_callaux_t *bca, bam_pileup1_t *p, + int *sc_len_r, int *slen_r, int *epos_r, int *end) { + bam1_t *b = p->b; + int sc_len = 0, sc_dist = -1, at_left = 1; + int epos = p->qpos, slen = b->core.l_qseq; + int k; + uint32_t *cigar = bam_get_cigar(b); + *end = -1; + for (k = 0; k < b->core.n_cigar; k++) { + int op = bam_cigar_op(cigar[k]); + if (op == BAM_CSOFT_CLIP) { + slen -= bam_cigar_oplen(cigar[k]); + if (at_left) { + // left end + sc_len += bam_cigar_oplen(cigar[k]); + epos -= sc_len; // don't count SC in seq pos + sc_dist = epos; + *end = 0; + } else { + // right end + int srlen = bam_cigar_oplen(cigar[k]); + int rd = b->core.l_qseq - srlen - p->qpos; + if (sc_dist < 0 || sc_dist > rd) { + // closer to right end than left + // FIXME: compensate for indel length too? + sc_dist = rd; + sc_len = srlen; + *end = 1; + } + } + } else if (op != BAM_CHARD_CLIP) { + at_left = 0; + } + } + + if (p->indel > 0 && slen - (epos+p->indel) < epos) + epos += p->indel-1; // end of insertion, if near end of seq + + // slen is now length of sequence minus soft-clips and + // epos is position of indel in seq minus left-clip. + *epos_r = (double)epos / (slen+1) * bca->npos; + + if (sc_len) { + // scale importance of clip by distance to closest end + *sc_len_r = 15.0*sc_len / (sc_dist+1); + if (*sc_len_r > 99) *sc_len_r = 99; + } else { + *sc_len_r = 0; + } + + *slen_r = slen; +} + +// Part of bcf_call_gap_prep. +// +// Scans the pileup to identify all the different sizes of indels +// present. +// +// Returns types and fills out n_types_r, max_rd_len_r and ref_type_r, +// or NULL on error. +static int *bcf_cgp_find_types(int n, int *n_plp, bam_pileup1_t **plp, + int pos, bcf_callaux_t *bca, const char *ref, + int *max_rd_len_r, int *n_types_r, + int *ref_type_r, int *N_r) { + int i, j, t, s, N, m, max_rd_len, n_types; + int n_alt = 0, n_tot = 0, indel_support_ok = 0; + uint32_t *aux; + int *types; + + // N is the total number of reads + for (s = N = 0; s < n; ++s) + N += n_plp[s]; + + bca->max_support = bca->max_frac = 0; + aux = (uint32_t*) calloc(N + 1, 4); + if (!aux) + return NULL; + + m = max_rd_len = 0; + aux[m++] = MINUS_CONST; // zero indel is always a type (REF) + + // Fill out aux[] array with all the non-zero indel sizes. + // Also tally number with indels (n_alt) and total (n_tot). + for (s = 0; s < n; ++s) { + int na = 0, nt = 0; + for (i = 0; i < n_plp[s]; ++i) { + const bam_pileup1_t *p = plp[s] + i; + ++nt; + if (p->indel != 0) { + ++na; + aux[m++] = MINUS_CONST + p->indel; + } + + // FIXME: cache me in pileup struct. + j = bam_cigar2qlen(p->b->core.n_cigar, bam_get_cigar(p->b)); + if (j > max_rd_len) max_rd_len = j; + } + double frac = (double)na/nt; + if ( !indel_support_ok && na >= bca->min_support + && frac >= bca->min_frac ) + indel_support_ok = 1; + if ( na > bca->max_support && frac > 0 ) + bca->max_support = na, bca->max_frac = frac; + + n_alt += na; + n_tot += nt; + } + + // Sort aux[] and dedup + ks_introsort(uint32_t, m, aux); + for (i = 1, n_types = 1; i < m; ++i) + if (aux[i] != aux[i-1]) ++n_types; + + // Taking totals makes it hard to call rare indels (IMF filter) + if ( !bca->per_sample_flt ) + indel_support_ok = ( (double)n_alt / n_tot < bca->min_frac + || n_alt < bca->min_support ) + ? 0 : 1; + if ( n_types == 1 || !indel_support_ok ) { // then skip + free(aux); + return NULL; + } + + // Bail out if we have far too many types of indel + if (n_types >= MAX_TYPES) { + free(aux); + // TODO revisit how/whether to control printing this warning + if (hts_verbose >= 2) + fprintf(bcftools_stderr, "[%s] excessive INDEL alleles at position %d. " + "Skip the position.\n", __func__, pos + 1); + return NULL; + } + + // To prevent long stretches of N's to be mistaken for indels + // (sometimes thousands of bases), check the number of N's in the + // sequence and skip places where half or more reference bases are Ns. + int nN=0, i_end = pos + (2*bca->indel_win_size < max_rd_len + ?2*bca->indel_win_size : max_rd_len); + for (i=pos; i(i-pos) ) { + free(aux); + return NULL; + } + + // Finally fill out the types[] array detailing the size of insertion + // or deletion. + types = (int*)calloc(n_types, sizeof(int)); + if (!types) { + free(aux); + return NULL; + } + t = 0; + types[t++] = aux[0] - MINUS_CONST; + for (i = 1; i < m; ++i) + if (aux[i] != aux[i-1]) + types[t++] = aux[i] - MINUS_CONST; + free(aux); + + // Find reference type; types[?] == 0) + for (t = 0; t < n_types; ++t) + if (types[t] == 0) break; + + *ref_type_r = t; + *n_types_r = n_types; + *max_rd_len_r = max_rd_len; + *N_r = N; + + return types; +} + +// Part of bcf_call_gap_prep. +// +// Construct per-sample consensus. +// +// Returns an array of consensus seqs, +// or NULL on failure. +static char **bcf_cgp_ref_sample(int n, int *n_plp, bam_pileup1_t **plp, + int pos, bcf_callaux_t *bca, const char *ref, + int left, int right) { + int i, k, s, L = right - left + 1, max_i, max2_i; + char **ref_sample; // returned + uint32_t *cns = NULL, max, max2; + char *ref0 = NULL, *r; + ref_sample = (char**) calloc(n, sizeof(char*)); + cns = (uint32_t*) calloc(L, 4); + ref0 = (char*) calloc(L, 1); + if (!ref_sample || !cns || !ref0) { + n = 0; + goto err; + } + + // Convert ref ASCII to 0-15. + for (i = 0; i < right - left; ++i) + ref0[i] = seq_nt16_table[(int)ref[i+left]]; + + // NB: one consensus per sample 'n', not per indel type. + // FIXME: consider fixing this. We should compute alignments vs + // types, not vs samples? Or types/sample combined? + for (s = 0; s < n; ++s) { + r = ref_sample[s] = (char*) calloc(L, 1); + if (!r) { + n = s-1; + goto err; + } + + memset(cns, 0, sizeof(int) * L); + + // collect ref and non-ref counts in cns + for (i = 0; i < n_plp[s]; ++i) { + bam_pileup1_t *p = plp[s] + i; + bam1_t *b = p->b; + uint32_t *cigar = bam_get_cigar(b); + uint8_t *seq = bam_get_seq(b); + int x = b->core.pos, y = 0; + + // TODO: pileup exposes pileup_ind, but we also need e.g. + // pileup_len to know how much of the current CIGAR op-len + // we've used (or have remaining). If we had that, we + // could start at p->qpos without having to scan through + // the entire CIGAR string until we find it. + // + // Without it about all we could do is have a side channel + // to cache the last known coords. Messy, so punt for now. + // This is no longer the bottle neck until we get to 1000s of + // CIGAR ops. + + for (k = 0; k < b->core.n_cigar; ++k) { + int op = cigar[k]&0xf; + int j, l = cigar[k]>>4; + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + if (x + l >= left) { + j = left - x > 0 ? left - x : 0; + int j_end = right - x < l ? right - x : l; + for (; j < j_end; j++) + // Append to cns. Note this is ref coords, + // so insertions aren't in cns and deletions + // will have lower coverage. + + // FIXME: want true consensus (with ins) per + // type, so we can independently compare each + // seq to each consensus and see which it + // matches best, so we get proper GT analysis. + cns[x+j-left] += + (bam_seqi(seq, y+j) == ref0[x+j-left]) + ? 1 // REF + : (1<<16); // ALT + } + x += l; y += l; + } else if (op == BAM_CDEL || op == BAM_CREF_SKIP) { + x += l; + } else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) { + y += l; + } + + if (x > right) + break; + } + } + + // Determine a sample specific reference. + for (i = 0; i < right - left; ++i) + r[i] = ref0[i]; + + // Find deepest and 2nd deepest ALT region (max & max2). + max = max2 = 0; max_i = max2_i = -1; + for (i = 0; i < right - left; ++i) { + if (cns[i]>>16 >= max>>16) + max2 = max, max2_i = max_i, max = cns[i], max_i = i; + else if (cns[i]>>16 >= max2>>16) + max2 = cns[i], max2_i = i; + } + + // Masks mismatches present in at least 70% of the reads with 'N'. + // This code is nREF/(nREF+n_ALT) >= 70% for deepest region. + // The effect is that at least 30% of bases differing to REF will + // use "N" in consensus, so we don't penalise ALT or REF when + // aligning against it. (A poor man IUPAC code) + // + // Why is it only done in two loci at most? + if ((double)(max&0xffff) / ((max&0xffff) + (max>>16)) >= 0.7) + max_i = -1; + if ((double)(max2&0xffff) / ((max2&0xffff) + (max2>>16)) >= 0.7) + max2_i = -1; + if (max_i >= 0) r[max_i] = 15; + if (max2_i >= 0) r[max2_i] = 15; + + //for (i = 0; i < right - left; ++i) + // fputc("=ACMGRSVTWYHKDBN"[(int)r[i]], bcftools_stderr); + //fputc('\n', bcftools_stderr); + } + + free(ref0); + free(cns); + + return ref_sample; + + err: + free(ref0); + free(cns); + if (ref_sample) { + for (s = 0; s < n; s++) + free(ref_sample[s]); + free(ref_sample); + } + + return NULL; +} + +// The length of the homopolymer run around the current position +static int bcf_cgp_l_run(const char *ref, int pos) { + int i, l_run; + + int c = seq_nt16_table[(int)ref[pos + 1]]; + if (c == 15) { + l_run = 1; + } else { + for (i = pos + 2; ref[i]; ++i) + if (seq_nt16_table[(int)ref[i]] != c) break; + l_run = i; + for (i = pos; i >= 0; --i) + if (seq_nt16_table[(int)ref[i]] != c) break; + l_run -= i + 1; + } + + return l_run; +} + + +// Compute the consensus for this sample 's', minus indels which +// get added later. +static char *bcf_cgp_calc_cons(int n, int *n_plp, bam_pileup1_t **plp, + int pos, int *types, int n_types, + int max_ins, int s) { + int i, j, t, k; + int *inscns_aux = (int*)calloc(5 * n_types * max_ins, sizeof(int)); + if (!inscns_aux) + return NULL; + + // Count the number of occurrences of each base at each position for + // each type of insertion. + for (t = 0; t < n_types; ++t) { + if (types[t] > 0) { + for (s = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i) { + bam_pileup1_t *p = plp[s] + i; + if (p->indel == types[t]) { + uint8_t *seq = bam_get_seq(p->b); + for (k = 1; k <= p->indel; ++k) { + int c = seq_nt16_int[bam_seqi(seq, p->qpos + k)]; + assert(c<5); + ++inscns_aux[(t*max_ins+(k-1))*5 + c]; + } + } + } + } + } + } + + // Use the majority rule to construct the consensus + char *inscns = (char *)calloc(n_types * max_ins, 1); + for (t = 0; t < n_types; ++t) { + for (j = 0; j < types[t]; ++j) { + int max = 0, max_k = -1, *ia = &inscns_aux[(t*max_ins+j)*5]; + for (k = 0; k < 5; ++k) + if (ia[k] > max) + max = ia[k], max_k = k; + inscns[t*max_ins + j] = max ? max_k : 4; + if (max_k == 4) { + // discard insertions which contain N's + types[t] = 0; + break; + } + } + } + free(inscns_aux); + + return inscns; +} + +#ifndef MIN +# define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +// Part of bcf_call_gap_prep. +// +// Realign using BAQ to get an alignment score of a single read vs +// a haplotype consensus. +// +// Fills out score +// Returns 0 on success, +// <0 on error +static int bcf_cgp_align_score(bam_pileup1_t *p, bcf_callaux_t *bca, + int type, uint8_t *ref2, uint8_t *query, + int r_start, int r_end, int long_read, + int tbeg, int tend, + int left, int right, + int qbeg, int qend, + int qpos, int max_deletion, + int *score) { + // Illumina + probaln_par_t apf = { 1e-4, 1e-2, 10 }; + + // Parameters that work better on PacBio CCS 15k. + // We should consider querying the header and RG PU field. + // See also htslib/realn.c:sam_prob_realn() + if (long_read) { + apf.d = 1e-3; + apf.e = 1e-1; + } + + type = abs(type); + apf.bw = type + 3; + int l, sc; + const uint8_t *qual = bam_get_qual(p->b), *bq; + uint8_t *qq; + + // Get segment of quality, either ZQ tag or if absent QUAL. + if (!(qq = (uint8_t*) calloc(qend - qbeg, 1))) + return -1; + bq = (uint8_t*)bam_aux_get(p->b, "ZQ"); + if (bq) ++bq; // skip type + for (l = qbeg; l < qend; ++l) { + int qval = bq? qual[l] + (bq[l] - 64) : qual[l]; + if (qval > 30) + qval = 30; + if (qval < 7) + qval = 7; + qq[l - qbeg] = qval; + } + + // The bottom 8 bits are length-normalised score while + // the top bits are unnormalised. + sc = probaln_glocal(ref2 + tbeg - left, tend - tbeg + type, + query, qend - qbeg, qq, &apf, 0, 0); + if (sc < 0) { + *score = 0xffffff; + free(qq); + return 0; + } + + // used for adjusting indelQ below + l = (int)(100. * sc / (qend - qbeg) + .499) * bca->indel_bias; + *score = sc<<8 | MIN(255, l); + + rep_ele *reps, *elt, *tmp; + uint8_t *seg = ref2 + tbeg - left; + int seg_len = tend - tbeg + type; + + // Note: although seg moves (tbeg varies), ref2 is reused many times + // so we could factor out some find_STR calls. However it's not the + // bottleneck for now. + + // FIXME: need to make this work on IUPAC. + reps = find_STR((char *)seg, seg_len, 0); + int iscore = 0; + + // Identify STRs in ref covering the indel up to + // (or close to) the end of the sequence. + // Those having an indel and right at the sequence + // end do not confirm the total length of indel + // size. Specifically a *lack* of indel at the + // end, where we know indels occur in other + // sequences, is a possible reference bias. + // + // This is emphasised further if the sequence ends with + // soft clipping. + DL_FOREACH_SAFE(reps, elt, tmp) { + if (elt->start <= qpos && elt->end >= qpos) { + iscore += (elt->end-elt->start) / elt->rep_len; // c + if (elt->start+tbeg <= r_start || + elt->end+tbeg >= r_end) + iscore += 2*(elt->end-elt->start); + } + + DL_DELETE(reps, elt); + free(elt); + } + + // Apply STR score to existing indelQ + l = (*score&0xff)*.8 + iscore*2; + *score = (*score & ~0xff) | MIN(255, l); + + free(qq); + + return 0; +} + +// Part of bcf_call_gap_prep. +// +// Returns n_alt on success +// -1 on failure +static int bcf_cgp_compute_indelQ(int n, int *n_plp, bam_pileup1_t **plp, + bcf_callaux_t *bca, char *inscns, + int l_run, int max_ins, + int ref_type, int *types, int n_types, + int *score) { + // FIXME: n_types has a maximum; no need to alloc - use a #define? + int sc[MAX_TYPES], sumq[MAX_TYPES], s, i, j, t, K, n_alt, tmp; + memset(sumq, 0, n_types * sizeof(int)); + for (s = K = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i, ++K) { + bam_pileup1_t *p = plp[s] + i; + int *sct = &score[K*n_types], seqQ, indelQ; + for (t = 0; t < n_types; ++t) sc[t] = sct[t]<<6 | t; + for (t = 1; t < n_types; ++t) // insertion sort + for (j = t; j > 0 && sc[j] < sc[j-1]; --j) + tmp = sc[j], sc[j] = sc[j-1], sc[j-1] = tmp; + + /* errmod_cal() assumes that if the call is wrong, the + * likelihoods of other events are equal. This is about + * right for substitutions, but is not desired for + * indels. To reuse errmod_cal(), I have to make + * compromise for multi-allelic indels. + */ + if ((sc[0]&0x3f) == ref_type) { + indelQ = (sc[1]>>14) - (sc[0]>>14); + seqQ = est_seqQ(bca, types[sc[1]&0x3f], l_run); + } else { + for (t = 0; t < n_types; ++t) // look for the reference type + if ((sc[t]&0x3f) == ref_type) break; + indelQ = (sc[t]>>14) - (sc[0]>>14); + seqQ = est_seqQ(bca, types[sc[0]&0x3f], l_run); + } + tmp = sc[0]>>6 & 0xff; + // reduce indelQ + indelQ = tmp > 111? 0 : (int)((1. - tmp/111.) * indelQ + .499); + + // Doesn't really help accuracy, but permits -h to take + // affect still. + if (indelQ > seqQ) indelQ = seqQ; + if (indelQ > 255) indelQ = 255; + if (seqQ > 255) seqQ = 255; + p->aux = (sc[0]&0x3f)<<16 | seqQ<<8 | indelQ; // use 22 bits in total + sumq[sc[0]&0x3f] += indelQ < seqQ? indelQ : seqQ; + // fprintf(bcftools_stderr, "pos=%d read=%d:%d name=%s call=%d indelQ=%d seqQ=%d\n", pos, s, i, bam1_qname(p->b), types[sc[0]&0x3f], indelQ, seqQ); + } + } + // determine bca->indel_types[] and bca->inscns + bca->maxins = max_ins; + bca->inscns = (char*) realloc(bca->inscns, bca->maxins * 4); + if (bca->maxins && !bca->inscns) + return -1; + for (t = 0; t < n_types; ++t) + sumq[t] = sumq[t]<<6 | t; + for (t = 1; t < n_types; ++t) // insertion sort + for (j = t; j > 0 && sumq[j] > sumq[j-1]; --j) + tmp = sumq[j], sumq[j] = sumq[j-1], sumq[j-1] = tmp; + for (t = 0; t < n_types; ++t) // look for the reference type + if ((sumq[t]&0x3f) == ref_type) break; + if (t) { // then move the reference type to the first + tmp = sumq[t]; + for (; t > 0; --t) sumq[t] = sumq[t-1]; + sumq[0] = tmp; + } + for (t = 0; t < 4; ++t) bca->indel_types[t] = B2B_INDEL_NULL; + for (t = 0; t < 4 && t < n_types; ++t) { + bca->indel_types[t] = types[sumq[t]&0x3f]; + if (bca->maxins) + memcpy(&bca->inscns[t * bca->maxins], + &inscns[(sumq[t]&0x3f) * max_ins], bca->maxins); + } + // update p->aux + for (s = n_alt = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i) { + bam_pileup1_t *p = plp[s] + i; + int x = types[p->aux>>16&0x3f]; + for (j = 0; j < 4; ++j) + if (x == bca->indel_types[j]) break; + p->aux = j<<16 | (j == 4? 0 : (p->aux&0xffff)); + if ((p->aux>>16&0x3f) > 0) ++n_alt; + //fprintf(bcftools_stderr, "X pos=%d read=%d:%d name=%s call=%d type=%d seqQ=%d indelQ=%d\n", pos, s, i, bam_get_qname(p->b), (p->aux>>16)&0x3f, bca->indel_types[(p->aux>>16)&0x3f], (p->aux>>8)&0xff, p->aux&0xff); + } + } + + return n_alt; +} + +/* +FIXME: with high number of samples, do we handle IMF correctly? Is it +fraction of indels across entire data set, or just fraction for this +specific sample? Needs to check bca->per_sample_flt (--per-sample-mF) opt. + */ + +/* + notes: + - n .. number of samples + - the routine sets bam_pileup1_t.aux of each read as follows: + - 6: unused + - 6: the call; index to bcf_callaux_t.indel_types .. (aux>>16)&0x3f + - 8: estimated sequence quality .. (aux>>8)&0xff + - 8: indel quality .. aux&0xff + */ +int bcf_call_gap_prep(int n, int *n_plp, bam_pileup1_t **plp, int pos, + bcf_callaux_t *bca, const char *ref) +{ + if (ref == 0 || bca == 0) return -1; + + int i, s, j, k, t, n_types, *types, max_rd_len, left, right, max_ins; + int *score, max_ref2; + int N, K, l_run, ref_type, n_alt; + char *inscns = 0, *ref2, *query, **ref_sample; + + // determine if there is a gap + for (s = N = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i) + if (plp[s][i].indel != 0) break; + if (i < n_plp[s]) break; + } + if (s == n) + // there is no indel at this position. + return -1; + + // find out how many types of indels are present + types = bcf_cgp_find_types(n, n_plp, plp, pos, bca, ref, + &max_rd_len, &n_types, &ref_type, &N); + if (!types) + return -1; + + + // calculate left and right boundary + left = pos > bca->indel_win_size ? pos - bca->indel_win_size : 0; + right = pos + bca->indel_win_size; + if (types[0] < 0) right -= types[0]; + + // in case the alignments stand out the reference + for (i = pos; i < right; ++i) + if (ref[i] == 0) break; + right = i; + + + /* The following call fixes a long-existing flaw in the INDEL + * calling model: the interference of nearby SNPs. However, it also + * reduces the power because sometimes, substitutions caused by + * indels are not distinguishable from true mutations. Multiple + * sequence realignment helps to increase the power. + * + * Masks mismatches present in at least 70% of the reads with 'N'. + */ + ref_sample = bcf_cgp_ref_sample(n, n_plp, plp, pos, bca, ref, left, right); + + // The length of the homopolymer run around the current position + l_run = bcf_cgp_l_run(ref, pos); + + // construct the consensus sequence (minus indels, which are added later) + max_ins = types[n_types - 1]; // max_ins is at least 0 + if (max_ins > 0) { + inscns = bcf_cgp_calc_cons(n, n_plp, plp, pos, + types, n_types, max_ins, s); + if (!inscns) + return -1; + } + + // compute the likelihood given each type of indel for each read + max_ref2 = right - left + 2 + 2 * (max_ins > -types[0]? max_ins : -types[0]); + ref2 = (char*) calloc(max_ref2, 1); + query = (char*) calloc(right - left + max_rd_len + max_ins + 2, 1); + score = (int*) calloc(N * n_types, sizeof(int)); + bca->indelreg = 0; + double nqual_over_60 = bca->nqual / 60.0; + + for (t = 0; t < n_types; ++t) { + int l, ir; + + // compute indelreg + if (types[t] == 0) + ir = 0; + else if (types[t] > 0) + ir = est_indelreg(pos, ref, types[t], &inscns[t*max_ins]); + else + ir = est_indelreg(pos, ref, -types[t], 0); + + if (ir > bca->indelreg) + bca->indelreg = ir; + + // Identify max deletion length + int max_deletion = 0; + for (s = 0; s < n; ++s) { + for (i = 0; i < n_plp[s]; ++i, ++K) { + bam_pileup1_t *p = plp[s] + i; + if (max_deletion < -p->indel) + max_deletion = -p->indel; + } + } + + // Realignment score, computed via BAQ + for (s = K = 0; s < n; ++s) { + // Construct ref2 from ref_sample, inscns and indels. + // This is now the true sample consensus (possibly prepended + // and appended with reference if sample data doesn't span + // the full length). + for (k = 0, j = left; j <= pos; ++j) + ref2[k++] = seq_nt16_int[(int)ref_sample[s][j-left]]; + + if (types[t] <= 0) + j += -types[t]; + else + for (l = 0; l < types[t]; ++l) + ref2[k++] = inscns[t*max_ins + l]; + + for (; j < right && ref[j]; ++j) + ref2[k++] = seq_nt16_int[(int)ref_sample[s][j-left]]; + for (; k < max_ref2; ++k) + ref2[k] = 4; + + if (right > j) + right = j; + + // align each read to ref2 + for (i = 0; i < n_plp[s]; ++i, ++K) { + bam_pileup1_t *p = plp[s] + i; + + // Some basic ref vs alt stats. + int imq = p->b->core.qual > 59 ? 59 : p->b->core.qual; + imq *= nqual_over_60; + + int sc_len, slen, epos, sc_end; + + // Only need to gather stats on one type, as it's + // identical calculation for all the subsequent ones + // and we're sharing the same stats array + if (t == 0) { + // Gather stats for INFO field to aid filtering. + // mq and sc_len not very helpful for filtering, but could + // help in assigning a better QUAL value. + // + // Pos is slightly useful. + // Base qual can be useful, but need qual prior to BAQ? + // May need to cache orig quals in aux tag so we can fetch + // them even after mpileup step. + get_pos(bca, p, &sc_len, &slen, &epos, &sc_end); + + assert(imq >= 0 && imq < bca->nqual); + assert(epos >= 0 && epos < bca->npos); + assert(sc_len >= 0 && sc_len < 100); + if (p->indel) { + bca->ialt_mq[imq]++; + bca->ialt_scl[sc_len]++; + bca->ialt_pos[epos]++; + } else { + bca->iref_mq[imq]++; + bca->iref_scl[sc_len]++; + bca->iref_pos[epos]++; + } + } + + int qbeg, qpos, qend, tbeg, tend, kk; + uint8_t *seq = bam_get_seq(p->b); + uint32_t *cigar = bam_get_cigar(p->b); + if (p->b->core.flag & BAM_FUNMAP) continue; + + // FIXME: the following loop should be better moved outside; + // nonetheless, realignment should be much slower anyway. + for (kk = 0; kk < p->b->core.n_cigar; ++kk) + if ((cigar[kk]&BAM_CIGAR_MASK) == BAM_CREF_SKIP) + break; + if (kk < p->b->core.n_cigar) + continue; + + // determine the start and end of sequences for alignment + // FIXME: loops over CIGAR multiple times + int left2 = left, right2 = right; + if (p->b->core.l_qseq > 1000) { + // long read data needs less context. It also tends to + // have many more candidate indels to investigate so + // speed here matters more. + if (pos - left >= bca->indel_win_size) + left2 += bca->indel_win_size/2; + if (right-pos >= bca->indel_win_size) + right2 -= bca->indel_win_size/2; + } + + int r_start = p->b->core.pos; + int r_end = bam_cigar2rlen(p->b->core.n_cigar, + bam_get_cigar(p->b)) + -1 + r_start; + + qbeg = tpos2qpos(&p->b->core, bam_get_cigar(p->b), left2, + 0, &tbeg); + qpos = tpos2qpos(&p->b->core, bam_get_cigar(p->b), pos, + 0, &tend) - qbeg; + qend = tpos2qpos(&p->b->core, bam_get_cigar(p->b), right2, + 1, &tend); + + if (types[t] < 0) { + int l = -types[t]; + tbeg = tbeg - l > left? tbeg - l : left; + } + + // write the query sequence + for (l = qbeg; l < qend; ++l) + query[l - qbeg] = seq_nt16_int[bam_seqi(seq, l)]; + + // A fudge for now. Consider checking SAM header for + // RG platform field. + int long_read = p->b->core.l_qseq > 1000; + + // do realignment; this is the bottleneck + if (tend > tbeg) { + if (bcf_cgp_align_score(p, bca, types[t], + (uint8_t *)ref2 + left2-left, + (uint8_t *)query, + r_start, r_end, long_read, + tbeg, tend, left2, right2, + qbeg, qend, qpos, max_deletion, + &score[K*n_types + t]) < 0) { + score[K*n_types + t] = 0xffffff; + return -1; + } + } else { + // place holder large cost for reads that cover the + // region entirely within a deletion (thus tend < tbeg). + score[K*n_types + t] = 0xffffff; + } +#if 0 + for (l = 0; l < tend - tbeg + abs(types[t]); ++l) + fputc("ACGTN"[(int)ref2[tbeg-left+l]], bcftools_stderr); + fputc('\n', bcftools_stderr); + for (l = 0; l < qend - qbeg; ++l) + fputc("ACGTN"[(int)query[l]], bcftools_stderr); + fputc('\n', bcftools_stderr); + fprintf(bcftools_stderr, "pos=%d type=%d read=%d:%d name=%s " + "qbeg=%d tbeg=%d score=%d\n", + pos, types[t], s, i, bam_get_qname(p->b), + qbeg, tbeg, sc); +#endif + } + } + } + + // compute indelQ + n_alt = bcf_cgp_compute_indelQ(n, n_plp, plp, bca, inscns, l_run, max_ins, + ref_type, types, n_types, score); + + // free + free(ref2); + free(query); + free(score); + + for (i = 0; i < n; ++i) + free(ref_sample[i]); + + free(ref_sample); + free(types); free(inscns); + + return n_alt > 0? 0 : -1; +} diff --git a/bcftools/bam_sample.c b/bcftools/bam_sample.c new file mode 100644 index 0000000..d8c10b8 --- /dev/null +++ b/bcftools/bam_sample.c @@ -0,0 +1,398 @@ +/* bam_sample.c -- group data by sample. + + Copyright (C) 2010, 2011 Broad Institute. + Copyright (C) 2013, 2016-2022 Genome Research Ltd. + + Author: Heng Li , Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include "bam_sample.h" +#include "bcftools.h" + + +typedef struct +{ + char *fname; + void *rg2idx; // hash: read group name to BCF output sample index. Maintained by bsmpl_add_readgroup + int default_idx; // default BCF output sample index, set only when all readgroups are treated as one sample +} +file_t; + +struct _bam_smpl_t +{ + kstring_t tmp; + file_t *files; + int ignore_rg, nsmpl, nfiles; + char **smpl; // list of BCF output sample names. Maintained by bsmpl_add_readgroup + void *sample_list; // hash: BAM input sample name to BCF output sample name. This is the -s/-S list + int sample_logic; // the -s/-S logic, 1: include, 0: exclude + void *rg_list; // hash: BAM/rg_id to sample name or */rg_id for global ids. This is the -G list + int rg_logic; // the -G logic, 1: include, 0: exclude + void *name2idx; // hash: BCF output sample name to BCF output sample index. Maintained by bsmpl_add_readgroup +}; + +bam_smpl_t *bam_smpl_init(void) +{ + bam_smpl_t *bsmpl; + bsmpl = (bam_smpl_t*) calloc(1, sizeof(bam_smpl_t)); + bsmpl->name2idx = khash_str2int_init(); + return bsmpl; +} + +void bam_smpl_destroy(bam_smpl_t *bsmpl) +{ + if ( !bsmpl ) return; + if ( bsmpl->name2idx ) khash_str2int_destroy_free(bsmpl->name2idx); + if ( bsmpl->sample_list ) khash_str2str_destroy_free_all(bsmpl->sample_list); + if ( bsmpl->rg_list ) khash_str2str_destroy_free_all(bsmpl->rg_list); + int i; + for (i=0; infiles; i++) + { + file_t *file = &bsmpl->files[i]; + if ( file->rg2idx ) khash_str2int_destroy_free(file->rg2idx); + free(file->fname); + } + free(bsmpl->smpl); + free(bsmpl->files); + free(bsmpl->tmp.s); + free(bsmpl); +} + +void bam_smpl_ignore_readgroups(bam_smpl_t* bsmpl) +{ + bsmpl->ignore_rg = 1; +} + +static void bsmpl_add_readgroup(bam_smpl_t *bsmpl, file_t *file, const char *rg_id, const char *smpl_name) +{ + int ismpl = -1; + if ( smpl_name ) + { + if ( khash_str2int_get(bsmpl->name2idx,smpl_name,&ismpl) < 0 ) + { + // new sample + bsmpl->nsmpl++; + bsmpl->smpl = (char**) realloc(bsmpl->smpl,sizeof(char*)*bsmpl->nsmpl); + bsmpl->smpl[bsmpl->nsmpl-1] = strdup(smpl_name); + ismpl = khash_str2int_inc(bsmpl->name2idx,bsmpl->smpl[bsmpl->nsmpl-1]); + } + } + if ( !strcmp("*",rg_id) ) + { + // all read groups in the bam treated as the same sample + file->default_idx = ismpl; + return; + } + if ( !file->rg2idx ) file->rg2idx = khash_str2int_init(); + if ( khash_str2int_has_key(file->rg2idx,rg_id) ) return; // duplicate @RG:ID + khash_str2int_set(file->rg2idx, strdup(rg_id), ismpl); +} +static int bsmpl_keep_readgroup(bam_smpl_t *bsmpl, file_t *file, const char *rg_id, const char **smpl_name) +{ + char *rg_smpl = khash_str2str_get(bsmpl->rg_list,rg_id); // unique read group present in one bam only + if ( !rg_smpl ) + { + // read group specific to this bam + bsmpl->tmp.l = 0; + ksprintf(&bsmpl->tmp,"%s\t%s",rg_id,file->fname); + rg_smpl = khash_str2str_get(bsmpl->rg_list,bsmpl->tmp.s); + } + if ( !rg_smpl ) + { + // any read group in this file? + bsmpl->tmp.l = 0; + ksprintf(&bsmpl->tmp,"*\t%s",file->fname); + rg_smpl = khash_str2str_get(bsmpl->rg_list,bsmpl->tmp.s); + } + if ( !rg_smpl && bsmpl->rg_logic ) return 0; + if ( rg_smpl && !bsmpl->rg_logic ) return 0; + + if ( rg_smpl && rg_smpl[0]!='\t' ) *smpl_name = rg_smpl; // rename the sample + return 1; +} + +/* + The logic of this function is a bit complicated because we want to work + also with broken bams containing read groups that are not listed in the + header. The desired behavior is as follows: + - when -G is given, read groups which are not listed in the header must + be given explicitly using the "?" symbol in -G. + Otherwise: + - if the bam has no header, all reads in the file are assigned to a + single sample named after the file + - if there is at least one sample defined in the header, reads with no + read group id or with a read group id not listed in the header are + assigned to the first sample encountered in the header +*/ +int bam_smpl_add_bam(bam_smpl_t *bsmpl, char *bam_hdr, const char *fname) +{ + bsmpl->nfiles++; + bsmpl->files = (file_t*) realloc(bsmpl->files,bsmpl->nfiles*sizeof(file_t)); + file_t *file = &bsmpl->files[bsmpl->nfiles-1]; + memset(file,0,sizeof(file_t)); + file->fname = strdup(fname); + file->default_idx = -1; + + if ( bsmpl->ignore_rg || !bam_hdr ) + { + // The option --ignore-RG is set or there is no BAM header: use the file name as the sample name + bsmpl_add_readgroup(bsmpl,file,"*",file->fname); + return bsmpl->nfiles-1; + } + + void *bam_smpls = khash_str2int_init(); + int first_smpl = -1, nskipped = 0; + const char *p = bam_hdr, *q, *r; + while (p != NULL && (q = strstr(p, "@RG")) != 0) + { + char *eol = strchr(q + 3, '\n'); + if (q > bam_hdr && *(q - 1) != '\n') { // @RG must be at start of line + p = eol; + continue; + } + p = q + 3; + if ((q = strstr(p, "\tID:")) != 0) q += 4; + if ((r = strstr(p, "\tSM:")) != 0) r += 4; + if (r && q) + { + char *u, *v; + int ioq, ior; + for (u = (char*)q; *u && *u != '\t' && *u != '\n'; ++u); + for (v = (char*)r; *v && *v != '\t' && *v != '\n'; ++v); + ioq = *u; ior = *v; *u = *v = '\0'; + + // q now points to a null terminated read group id + // r points to a null terminated sample name + if ( !strcmp("*",q) || !strcmp("?",q) ) + error("Error: the read group IDs \"*\" and \"?\" have a special meaning in the mpileup code. Please fix the code or the bam: %s\n", fname); + + int accept_rg = 1; + if ( bsmpl->sample_list ) + { + // restrict samples based on the -s/-S options + char *name = khash_str2str_get(bsmpl->sample_list,r); + if ( bsmpl->sample_logic==0 ) + accept_rg = name ? 0 : 1; + else if ( !name ) + accept_rg = 0; + else + r = name; + } + if ( accept_rg && bsmpl->rg_list ) + { + // restrict readgroups based on the -G option, possibly renaming the sample + accept_rg = bsmpl_keep_readgroup(bsmpl,file,q,&r); + } + if ( accept_rg ) + bsmpl_add_readgroup(bsmpl,file,q,r); + else + { + bsmpl_add_readgroup(bsmpl,file,q,NULL); // ignore this RG but note that it was seen in the header + nskipped++; + } + + if ( first_smpl<0 ) + khash_str2int_get(bsmpl->name2idx,r,&first_smpl); + if ( !khash_str2int_has_key(bam_smpls,r) ) + khash_str2int_inc(bam_smpls,strdup(r)); + + *u = ioq; *v = ior; + } + else + break; + p = eol; + } + int nsmpls = khash_str2int_size(bam_smpls); + khash_str2int_destroy_free(bam_smpls); + + const char *smpl_name = NULL; + int accept_null_rg = 1; + if ( bsmpl->rg_list && !bsmpl_keep_readgroup(bsmpl,file,"?",&smpl_name) ) accept_null_rg = 0; + if ( bsmpl->sample_list && first_smpl==-1 ) accept_null_rg = 0; + + if ( !accept_null_rg && first_smpl==-1 ) + { + // no suitable read group is available in this bam: ignore the whole file. + free(file->fname); + if ( file->rg2idx ) khash_str2int_destroy_free(file->rg2idx); + bsmpl->nfiles--; + return -1; + } + if ( !accept_null_rg ) return bsmpl->nfiles-1; + if ( nsmpls==1 && !nskipped ) + { + file->default_idx = first_smpl; + return bsmpl->nfiles-1; + } + if ( !smpl_name ) smpl_name = first_smpl==-1 ? file->fname : bsmpl->smpl[first_smpl]; + + bsmpl_add_readgroup(bsmpl,file,"?",smpl_name); + return bsmpl->nfiles-1; +} + +const char **bam_smpl_get_samples(bam_smpl_t *bsmpl, int *nsmpl) +{ + *nsmpl = bsmpl->nsmpl; + return (const char**)bsmpl->smpl; +} + +int bam_smpl_get_sample_id(bam_smpl_t *bsmpl, int bam_id, bam1_t *bam_rec) +{ + file_t *file = &bsmpl->files[bam_id]; + if ( file->default_idx >= 0 ) return file->default_idx; + + char *aux_rg = (char*) bam_aux_get(bam_rec, "RG"); + aux_rg = aux_rg ? aux_rg+1 : "?"; + + int rg_id; + if ( khash_str2int_get(file->rg2idx, aux_rg, &rg_id)==0 ) return rg_id; + if ( khash_str2int_get(file->rg2idx, "?", &rg_id)==0 ) return rg_id; + return -1; +} + +int bam_smpl_add_samples(bam_smpl_t *bsmpl, char *list, int is_file) +{ + if ( list[0]!='^' ) bsmpl->sample_logic = 1; + else list++; + + int i, nsamples = 0; + char **samples = hts_readlist(list, is_file, &nsamples); + if ( !samples || !nsamples ) return 0; + + kstring_t ori = {0,0,0}; + kstring_t ren = {0,0,0}; + + bsmpl->sample_list = khash_str2str_init(); + for (i=0; isample_list,strdup(ori.s),strdup(ren.l?ren.s:ori.s)); + free(samples[i]); + } + free(samples); + free(ori.s); + free(ren.s); + return nsamples; +} + +int bam_smpl_add_readgroups(bam_smpl_t *bsmpl, char *list, int is_file) +{ + if ( list[0]!='^' ) bsmpl->rg_logic = 1; + else list++; + + int i, nrows = 0; + char **rows = hts_readlist(list, is_file, &nrows); + if ( !rows || !nrows ) return 0; + + kstring_t fld1 = {0,0,0}; + kstring_t fld2 = {0,0,0}; + kstring_t fld3 = {0,0,0}; + + bsmpl->rg_list = khash_str2str_init(); + for (i=0; irg_list,fld1.s); + if ( !value ) + khash_str2str_set(bsmpl->rg_list,strdup(fld1.s),strdup(fld2.l?fld2.s:"\t")); + else if ( strcmp(value,fld2.l?fld2.s:"\t") ) + error("Error: The read group \"%s\" was assigned to two different samples: \"%s\" and \"%s\"\n", fld1.s,value,fld2.l?fld2.s:"\t"); + free(rows[i]); + } + free(rows); + free(fld1.s); + free(fld2.s); + free(fld3.s); + return nrows; +} + + diff --git a/bcftools/bam_sample.c.pysam.c b/bcftools/bam_sample.c.pysam.c new file mode 100644 index 0000000..9384470 --- /dev/null +++ b/bcftools/bam_sample.c.pysam.c @@ -0,0 +1,400 @@ +#include "bcftools.pysam.h" + +/* bam_sample.c -- group data by sample. + + Copyright (C) 2010, 2011 Broad Institute. + Copyright (C) 2013, 2016-2022 Genome Research Ltd. + + Author: Heng Li , Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include "bam_sample.h" +#include "bcftools.h" + + +typedef struct +{ + char *fname; + void *rg2idx; // hash: read group name to BCF output sample index. Maintained by bsmpl_add_readgroup + int default_idx; // default BCF output sample index, set only when all readgroups are treated as one sample +} +file_t; + +struct _bam_smpl_t +{ + kstring_t tmp; + file_t *files; + int ignore_rg, nsmpl, nfiles; + char **smpl; // list of BCF output sample names. Maintained by bsmpl_add_readgroup + void *sample_list; // hash: BAM input sample name to BCF output sample name. This is the -s/-S list + int sample_logic; // the -s/-S logic, 1: include, 0: exclude + void *rg_list; // hash: BAM/rg_id to sample name or */rg_id for global ids. This is the -G list + int rg_logic; // the -G logic, 1: include, 0: exclude + void *name2idx; // hash: BCF output sample name to BCF output sample index. Maintained by bsmpl_add_readgroup +}; + +bam_smpl_t *bam_smpl_init(void) +{ + bam_smpl_t *bsmpl; + bsmpl = (bam_smpl_t*) calloc(1, sizeof(bam_smpl_t)); + bsmpl->name2idx = khash_str2int_init(); + return bsmpl; +} + +void bam_smpl_destroy(bam_smpl_t *bsmpl) +{ + if ( !bsmpl ) return; + if ( bsmpl->name2idx ) khash_str2int_destroy_free(bsmpl->name2idx); + if ( bsmpl->sample_list ) khash_str2str_destroy_free_all(bsmpl->sample_list); + if ( bsmpl->rg_list ) khash_str2str_destroy_free_all(bsmpl->rg_list); + int i; + for (i=0; infiles; i++) + { + file_t *file = &bsmpl->files[i]; + if ( file->rg2idx ) khash_str2int_destroy_free(file->rg2idx); + free(file->fname); + } + free(bsmpl->smpl); + free(bsmpl->files); + free(bsmpl->tmp.s); + free(bsmpl); +} + +void bam_smpl_ignore_readgroups(bam_smpl_t* bsmpl) +{ + bsmpl->ignore_rg = 1; +} + +static void bsmpl_add_readgroup(bam_smpl_t *bsmpl, file_t *file, const char *rg_id, const char *smpl_name) +{ + int ismpl = -1; + if ( smpl_name ) + { + if ( khash_str2int_get(bsmpl->name2idx,smpl_name,&ismpl) < 0 ) + { + // new sample + bsmpl->nsmpl++; + bsmpl->smpl = (char**) realloc(bsmpl->smpl,sizeof(char*)*bsmpl->nsmpl); + bsmpl->smpl[bsmpl->nsmpl-1] = strdup(smpl_name); + ismpl = khash_str2int_inc(bsmpl->name2idx,bsmpl->smpl[bsmpl->nsmpl-1]); + } + } + if ( !strcmp("*",rg_id) ) + { + // all read groups in the bam treated as the same sample + file->default_idx = ismpl; + return; + } + if ( !file->rg2idx ) file->rg2idx = khash_str2int_init(); + if ( khash_str2int_has_key(file->rg2idx,rg_id) ) return; // duplicate @RG:ID + khash_str2int_set(file->rg2idx, strdup(rg_id), ismpl); +} +static int bsmpl_keep_readgroup(bam_smpl_t *bsmpl, file_t *file, const char *rg_id, const char **smpl_name) +{ + char *rg_smpl = khash_str2str_get(bsmpl->rg_list,rg_id); // unique read group present in one bam only + if ( !rg_smpl ) + { + // read group specific to this bam + bsmpl->tmp.l = 0; + ksprintf(&bsmpl->tmp,"%s\t%s",rg_id,file->fname); + rg_smpl = khash_str2str_get(bsmpl->rg_list,bsmpl->tmp.s); + } + if ( !rg_smpl ) + { + // any read group in this file? + bsmpl->tmp.l = 0; + ksprintf(&bsmpl->tmp,"*\t%s",file->fname); + rg_smpl = khash_str2str_get(bsmpl->rg_list,bsmpl->tmp.s); + } + if ( !rg_smpl && bsmpl->rg_logic ) return 0; + if ( rg_smpl && !bsmpl->rg_logic ) return 0; + + if ( rg_smpl && rg_smpl[0]!='\t' ) *smpl_name = rg_smpl; // rename the sample + return 1; +} + +/* + The logic of this function is a bit complicated because we want to work + also with broken bams containing read groups that are not listed in the + header. The desired behavior is as follows: + - when -G is given, read groups which are not listed in the header must + be given explicitly using the "?" symbol in -G. + Otherwise: + - if the bam has no header, all reads in the file are assigned to a + single sample named after the file + - if there is at least one sample defined in the header, reads with no + read group id or with a read group id not listed in the header are + assigned to the first sample encountered in the header +*/ +int bam_smpl_add_bam(bam_smpl_t *bsmpl, char *bam_hdr, const char *fname) +{ + bsmpl->nfiles++; + bsmpl->files = (file_t*) realloc(bsmpl->files,bsmpl->nfiles*sizeof(file_t)); + file_t *file = &bsmpl->files[bsmpl->nfiles-1]; + memset(file,0,sizeof(file_t)); + file->fname = strdup(fname); + file->default_idx = -1; + + if ( bsmpl->ignore_rg || !bam_hdr ) + { + // The option --ignore-RG is set or there is no BAM header: use the file name as the sample name + bsmpl_add_readgroup(bsmpl,file,"*",file->fname); + return bsmpl->nfiles-1; + } + + void *bam_smpls = khash_str2int_init(); + int first_smpl = -1, nskipped = 0; + const char *p = bam_hdr, *q, *r; + while (p != NULL && (q = strstr(p, "@RG")) != 0) + { + char *eol = strchr(q + 3, '\n'); + if (q > bam_hdr && *(q - 1) != '\n') { // @RG must be at start of line + p = eol; + continue; + } + p = q + 3; + if ((q = strstr(p, "\tID:")) != 0) q += 4; + if ((r = strstr(p, "\tSM:")) != 0) r += 4; + if (r && q) + { + char *u, *v; + int ioq, ior; + for (u = (char*)q; *u && *u != '\t' && *u != '\n'; ++u); + for (v = (char*)r; *v && *v != '\t' && *v != '\n'; ++v); + ioq = *u; ior = *v; *u = *v = '\0'; + + // q now points to a null terminated read group id + // r points to a null terminated sample name + if ( !strcmp("*",q) || !strcmp("?",q) ) + error("Error: the read group IDs \"*\" and \"?\" have a special meaning in the mpileup code. Please fix the code or the bam: %s\n", fname); + + int accept_rg = 1; + if ( bsmpl->sample_list ) + { + // restrict samples based on the -s/-S options + char *name = khash_str2str_get(bsmpl->sample_list,r); + if ( bsmpl->sample_logic==0 ) + accept_rg = name ? 0 : 1; + else if ( !name ) + accept_rg = 0; + else + r = name; + } + if ( accept_rg && bsmpl->rg_list ) + { + // restrict readgroups based on the -G option, possibly renaming the sample + accept_rg = bsmpl_keep_readgroup(bsmpl,file,q,&r); + } + if ( accept_rg ) + bsmpl_add_readgroup(bsmpl,file,q,r); + else + { + bsmpl_add_readgroup(bsmpl,file,q,NULL); // ignore this RG but note that it was seen in the header + nskipped++; + } + + if ( first_smpl<0 ) + khash_str2int_get(bsmpl->name2idx,r,&first_smpl); + if ( !khash_str2int_has_key(bam_smpls,r) ) + khash_str2int_inc(bam_smpls,strdup(r)); + + *u = ioq; *v = ior; + } + else + break; + p = eol; + } + int nsmpls = khash_str2int_size(bam_smpls); + khash_str2int_destroy_free(bam_smpls); + + const char *smpl_name = NULL; + int accept_null_rg = 1; + if ( bsmpl->rg_list && !bsmpl_keep_readgroup(bsmpl,file,"?",&smpl_name) ) accept_null_rg = 0; + if ( bsmpl->sample_list && first_smpl==-1 ) accept_null_rg = 0; + + if ( !accept_null_rg && first_smpl==-1 ) + { + // no suitable read group is available in this bam: ignore the whole file. + free(file->fname); + if ( file->rg2idx ) khash_str2int_destroy_free(file->rg2idx); + bsmpl->nfiles--; + return -1; + } + if ( !accept_null_rg ) return bsmpl->nfiles-1; + if ( nsmpls==1 && !nskipped ) + { + file->default_idx = first_smpl; + return bsmpl->nfiles-1; + } + if ( !smpl_name ) smpl_name = first_smpl==-1 ? file->fname : bsmpl->smpl[first_smpl]; + + bsmpl_add_readgroup(bsmpl,file,"?",smpl_name); + return bsmpl->nfiles-1; +} + +const char **bam_smpl_get_samples(bam_smpl_t *bsmpl, int *nsmpl) +{ + *nsmpl = bsmpl->nsmpl; + return (const char**)bsmpl->smpl; +} + +int bam_smpl_get_sample_id(bam_smpl_t *bsmpl, int bam_id, bam1_t *bam_rec) +{ + file_t *file = &bsmpl->files[bam_id]; + if ( file->default_idx >= 0 ) return file->default_idx; + + char *aux_rg = (char*) bam_aux_get(bam_rec, "RG"); + aux_rg = aux_rg ? aux_rg+1 : "?"; + + int rg_id; + if ( khash_str2int_get(file->rg2idx, aux_rg, &rg_id)==0 ) return rg_id; + if ( khash_str2int_get(file->rg2idx, "?", &rg_id)==0 ) return rg_id; + return -1; +} + +int bam_smpl_add_samples(bam_smpl_t *bsmpl, char *list, int is_file) +{ + if ( list[0]!='^' ) bsmpl->sample_logic = 1; + else list++; + + int i, nsamples = 0; + char **samples = hts_readlist(list, is_file, &nsamples); + if ( !samples || !nsamples ) return 0; + + kstring_t ori = {0,0,0}; + kstring_t ren = {0,0,0}; + + bsmpl->sample_list = khash_str2str_init(); + for (i=0; isample_list,strdup(ori.s),strdup(ren.l?ren.s:ori.s)); + free(samples[i]); + } + free(samples); + free(ori.s); + free(ren.s); + return nsamples; +} + +int bam_smpl_add_readgroups(bam_smpl_t *bsmpl, char *list, int is_file) +{ + if ( list[0]!='^' ) bsmpl->rg_logic = 1; + else list++; + + int i, nrows = 0; + char **rows = hts_readlist(list, is_file, &nrows); + if ( !rows || !nrows ) return 0; + + kstring_t fld1 = {0,0,0}; + kstring_t fld2 = {0,0,0}; + kstring_t fld3 = {0,0,0}; + + bsmpl->rg_list = khash_str2str_init(); + for (i=0; irg_list,fld1.s); + if ( !value ) + khash_str2str_set(bsmpl->rg_list,strdup(fld1.s),strdup(fld2.l?fld2.s:"\t")); + else if ( strcmp(value,fld2.l?fld2.s:"\t") ) + error("Error: The read group \"%s\" was assigned to two different samples: \"%s\" and \"%s\"\n", fld1.s,value,fld2.l?fld2.s:"\t"); + free(rows[i]); + } + free(rows); + free(fld1.s); + free(fld2.s); + free(fld3.s); + return nrows; +} + + diff --git a/bcftools/bam_sample.h b/bcftools/bam_sample.h new file mode 100644 index 0000000..5cbcc39 --- /dev/null +++ b/bcftools/bam_sample.h @@ -0,0 +1,50 @@ +/* bam_sample.h -- group data by sample. + + Copyright (C) 2010 Broad Institute. + Copyright (C) 2016 Genome Research Ltd. + + Author: Heng Li , Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef BAM_SAMPLE_H +#define BAM_SAMPLE_H + +#include + +typedef struct _bam_smpl_t bam_smpl_t; + +bam_smpl_t *bam_smpl_init(void); + +int bam_smpl_add_samples(bam_smpl_t *bsmpl, char *list, int is_file); +int bam_smpl_add_readgroups(bam_smpl_t *bsmpl, char *list, int is_file); +void bam_smpl_ignore_readgroups(bam_smpl_t* bsmpl); + +// The above should be called only before bams are added. Returns the BAM id +// to be passed to bam_smpl_get_sample_id() later. It is safe to assume +// sequential numbering, starting from 0. +// +int bam_smpl_add_bam(bam_smpl_t *bsmpl, char *bam_hdr, const char *fname); + +const char **bam_smpl_get_samples(bam_smpl_t *bsmpl, int *nsmpl); +int bam_smpl_get_sample_id(bam_smpl_t *bsmpl, int bam_id, bam1_t *bam_rec); + +void bam_smpl_destroy(bam_smpl_t *bsmpl); + +#endif diff --git a/bcftools/bcftools.h b/bcftools/bcftools.h new file mode 100644 index 0000000..a915802 --- /dev/null +++ b/bcftools/bcftools.h @@ -0,0 +1,143 @@ +/* bcftools.h -- utility function declarations. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#ifndef BCFTOOLS_H +#define BCFTOOLS_H + +#include +#include +#include +#include +#include + +#define FT_TAB_TEXT 0 // custom tab-delimited text file +#define FT_GZ 1 +#define FT_VCF 2 +#define FT_VCF_GZ (FT_GZ|FT_VCF) +#define FT_BCF (1<<2) +#define FT_BCF_GZ (FT_GZ|FT_BCF) +#define FT_STDIN (1<<3) + +char *bcftools_version(void); + +/// Report an error and exit -1 +void error(const char *format, ...) HTS_NORETURN HTS_FORMAT(HTS_PRINTF_FMT, 1, 2); + +/// Report an error and exit -1. If errno != 0, appends strerror(errno). +// Note: unlike error() above, the message should not end with "\n" as a +// newline will be added by the function. +void error_errno(const char *format, ...) HTS_NORETURN HTS_FORMAT(HTS_PRINTF_FMT, 1, 2); + +void bcf_hdr_append_version(bcf_hdr_t *hdr, int argc, char **argv, const char *cmd); +const char *hts_bcf_wmode(int file_type); +const char *hts_bcf_wmode2(int file_type, const char *fname); +void set_wmode(char dst[8], int file_type, const char *fname, int compression_level); // clevel: 0-9 with or zb type, -1 unset +char *init_tmp_prefix(const char *prefix); +int read_AF(bcf_sr_regions_t *tgt, bcf1_t *line, double *alt_freq); +int parse_overlap_option(const char *arg); + +void *smalloc(size_t size); // safe malloc + +static inline int iupac2bitmask(char iupac) +{ + const int A = 1; + const int C = 2; + const int G = 4; + const int T = 8; + if ( iupac >= 97 ) iupac -= 32; + if ( iupac == 'A' ) return A; + if ( iupac == 'C' ) return C; + if ( iupac == 'G' ) return G; + if ( iupac == 'T' ) return T; + if ( iupac == 'M' ) return A|C; + if ( iupac == 'R' ) return A|G; + if ( iupac == 'W' ) return A|T; + if ( iupac == 'S' ) return C|G; + if ( iupac == 'Y' ) return C|T; + if ( iupac == 'K' ) return G|T; + if ( iupac == 'V' ) return A|C|G; + if ( iupac == 'H' ) return A|C|T; + if ( iupac == 'D' ) return A|G|T; + if ( iupac == 'B' ) return C|G|T; + if ( iupac == 'N' ) return A|C|G|T; + return -1; +} +static inline char bitmask2iupac(int bitmask) +{ + const char iupac[16] = {'.','A','C','M','G','R','S','V','T','W','Y','H','K','D','B','N'}; + if ( bitmask <= 0 || bitmask > 15 ) return 0; + return iupac[bitmask]; +} + +static inline int iupac_consistent(char iupac, char nt) +{ + static const char iupac_mask[90] = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,14,2, + 13,0,0,4,11,0,0,12,0,3,15,0,0,0,5,6,8,0,7,9,0,10 + }; + if ( iupac > 89 ) return 0; + if ( nt > 90 ) nt -= 32; // lowercase + if ( nt=='A' ) nt = 1; + else if ( nt=='C' ) nt = 2; + else if ( nt=='G' ) nt = 4; + else if ( nt=='T' ) nt = 8; + return iupac_mask[(int)iupac] & nt ? 1 : 0; +} + +static inline char nt_to_upper(char nt) +{ + if ( nt < 97 ) return nt; + return nt - 32; +} + +static inline double phred_score(double prob) +{ + if ( prob==0 ) return 99; + prob = -4.3429*log(prob); + return prob>99 ? 99 : prob; +} + +static const uint64_t bcf_double_missing = 0x7ff0000000000001; +static const uint64_t bcf_double_vector_end = 0x7ff0000000000002; +static inline void bcf_double_set(double *ptr, uint64_t value) +{ + union { uint64_t i; double d; } u; + u.i = value; + *ptr = u.d; +} +static inline int bcf_double_test(double d, uint64_t value) +{ + union { uint64_t i; double d; } u; + u.d = d; + return u.i==value ? 1 : 0; +} +#define bcf_double_set_vector_end(x) bcf_double_set(&(x),bcf_double_vector_end) +#define bcf_double_set_missing(x) bcf_double_set(&(x),bcf_double_missing) +#define bcf_double_is_vector_end(x) bcf_double_test((x),bcf_double_vector_end) +#define bcf_double_is_missing(x) bcf_double_test((x),bcf_double_missing) +#define bcf_double_is_missing_or_vector_end(x) (bcf_double_test((x),bcf_double_missing) || bcf_double_test((x),bcf_double_vector_end)) + +#endif diff --git a/bcftools/bcftools.pysam.c b/bcftools/bcftools.pysam.c new file mode 100644 index 0000000..e7f620a --- /dev/null +++ b/bcftools/bcftools.pysam.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include + +#include "bcftools.pysam.h" + +FILE * bcftools_stderr = NULL; +FILE * bcftools_stdout = NULL; +const char * bcftools_stdout_fn = NULL; + + +FILE * bcftools_set_stderr(int fd) +{ + if (bcftools_stderr != NULL) + fclose(bcftools_stderr); + bcftools_stderr = fdopen(fd, "w"); + return bcftools_stderr; +} + +void bcftools_close_stderr(void) +{ + fclose(bcftools_stderr); + bcftools_stderr = NULL; +} + +FILE * bcftools_set_stdout(int fd) +{ + if (bcftools_stdout != NULL) + fclose(bcftools_stdout); + bcftools_stdout = fdopen(fd, "w"); + if (bcftools_stdout == NULL) + { + fprintf(bcftools_stderr, "could not set stdout to fd %i", fd); + } + return bcftools_stdout; +} + +void bcftools_set_stdout_fn(const char *fn) +{ + bcftools_stdout_fn = fn; +} + +void bcftools_close_stdout(void) +{ + fclose(bcftools_stdout); + bcftools_stdout = NULL; +} + +int bcftools_puts(const char *s) +{ + if (fputs(s, bcftools_stdout) == EOF) return EOF; + return putc('\n', bcftools_stdout); +} + + +static jmp_buf bcftools_jmpbuf; +static int bcftools_status = 0; + +int bcftools_dispatch(int argc, char *argv[]) +{ + /* Reset getopt()/getopt_long() processing. */ +#if defined __GLIBC__ + optind = 0; +#elif defined _OPTRESET || defined _OPTRESET_DECLARED + optreset = optind = 1; +#else + optind = 1; +#endif + + if (setjmp(bcftools_jmpbuf) == 0) + return bcftools_main(argc, argv); + else + return bcftools_status; +} + +void bcftools_exit(int status) +{ + bcftools_status = status; + longjmp(bcftools_jmpbuf, 1); +} diff --git a/bcftools/bcftools.pysam.h b/bcftools/bcftools.pysam.h new file mode 100644 index 0000000..e6717bb --- /dev/null +++ b/bcftools/bcftools.pysam.h @@ -0,0 +1,74 @@ +#ifndef bcftools_PYSAM_H +#define bcftools_PYSAM_H + +#include + +#ifndef __has_attribute +#define __has_attribute(attribute) 0 +#endif +#ifndef PYSAM_NORETURN +#if __has_attribute(__noreturn__) || __GNUC__ >= 3 +#define PYSAM_NORETURN __attribute__((__noreturn__)) +#else +#define PYSAM_NORETURN +#endif +#endif + +extern FILE * bcftools_stderr; + +extern FILE * bcftools_stdout; + +extern const char * bcftools_stdout_fn; + +/*! set pysam standard error to point to file descriptor + + Setting the stderr will close the previous stderr. + */ +FILE * bcftools_set_stderr(int fd); + +/*! set pysam standard output to point to file descriptor + + Setting the stdout will close the previous stdout. + */ +FILE * bcftools_set_stdout(int fd); + +/*! set pysam standard output to point to filename + + */ +void bcftools_set_stdout_fn(const char * fn); + +/*! close pysam standard error and set to NULL + + */ +void bcftools_close_stderr(void); + +/*! close pysam standard output and set to NULL + + */ +void bcftools_close_stdout(void); + +int bcftools_puts(const char *s); + +int bcftools_dispatch(int argc, char *argv[]); + +void PYSAM_NORETURN bcftools_exit(int status); + +extern int bcftools_main(int argc, char *argv[]); + +/* Define these only in samtools/bcftools C source, not Cython code. */ +#if !(defined CYTHON_ABI || defined CYTHON_HEX_VERSION) + +/*! Several non-static function names are used in both samtools and bcftools. + Both libcsamtools.so and libcbcftools.so are loaded simultaneously, leading + to collisions and wrong functions being called. #define these names so the + actual symbol names include distinct prefixes to avoid collisions. + */ +#define main_consensus bcftools_main_consensus +#define main_reheader bcftools_main_reheader +#define bam_smpl_init bcftools_bam_smpl_init +#define bam_smpl_destroy bcftools_bam_smpl_destroy +#define read_file_list bcftools_read_file_list + +#endif + +#endif diff --git a/bcftools/bin.c b/bcftools/bin.c new file mode 100644 index 0000000..645012e --- /dev/null +++ b/bcftools/bin.c @@ -0,0 +1,106 @@ +/* The MIT License + + Copyright (c) 2016-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include "bcftools.h" +#include "bin.h" + +struct _bin_t +{ + float *bins; + int nbins; +}; + +bin_t *bin_init(const char *list_def, float min, float max) +{ + bin_t *bin = (bin_t*) calloc(1,sizeof(bin_t)); + + // a comma indicates a list, otherwise a file + int is_file = strchr(list_def,',') ? 0 : 1; + int i, nlist; + char **list = hts_readlist(list_def, is_file, &nlist); + if ( !list ) error("Error: failed to read %s\n",list_def); + bin->nbins = nlist; + bin->bins = (float*) malloc(sizeof(float)*nlist); + for (i=0; ibins[i] = strtod(list[i],&tmp); + if ( *tmp ) error("Could not parse %s: %s\n", list_def, list[i]); + if ( min!=max && (bin->bins[i]bins[i]>max) ) + error("Expected values from the interval [%f,%f], found %s\n", min, max, list[i]); + free(list[i]); + } + free(list); + + if ( min!=max ) + { + // make sure we've got both boundaries: min,max. + assert( nlist>1 ); + float max_err = (bin->bins[1] - bin->bins[0])*1e-6; + if ( fabs(bin->bins[0] - min) > max_err ) + { + bin->bins = (float*) realloc(bin->bins, (++bin->nbins)*sizeof(float)); + memmove(bin->bins+1, bin->bins, sizeof(float)*(bin->nbins-1)); + bin->bins[0] = min; + } + if ( fabs(bin->bins[bin->nbins-1] - max) > max_err ) + { + bin->bins = (float*) realloc(bin->bins, (++bin->nbins)*sizeof(float)); + bin->bins[bin->nbins-1] = max; + } + } + return bin; +} + +void bin_destroy(bin_t *bin) +{ + free(bin->bins); + free(bin); +} + +int bin_get_size(bin_t *bin) { return bin->nbins; } + +float bin_get_value(bin_t *bin, int idx) { return bin->bins[idx]; } + +int bin_get_idx(bin_t *bin, float value) +{ + if ( bin->bins[bin->nbins-1] < value ) return bin->nbins-1; + + // Binary search in half-closed,half-open intervals [) + int imin = 0, imax = bin->nbins - 2; + while ( iminbins[i] ) imax = i - 1; + else if ( value > bin->bins[i] ) imin = i + 1; + else return i; + } + if ( bin->bins[imax] <= value ) return imax; + return imin - 1; +} + diff --git a/bcftools/bin.c.pysam.c b/bcftools/bin.c.pysam.c new file mode 100644 index 0000000..683d69c --- /dev/null +++ b/bcftools/bin.c.pysam.c @@ -0,0 +1,108 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2016-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include "bcftools.h" +#include "bin.h" + +struct _bin_t +{ + float *bins; + int nbins; +}; + +bin_t *bin_init(const char *list_def, float min, float max) +{ + bin_t *bin = (bin_t*) calloc(1,sizeof(bin_t)); + + // a comma indicates a list, otherwise a file + int is_file = strchr(list_def,',') ? 0 : 1; + int i, nlist; + char **list = hts_readlist(list_def, is_file, &nlist); + if ( !list ) error("Error: failed to read %s\n",list_def); + bin->nbins = nlist; + bin->bins = (float*) malloc(sizeof(float)*nlist); + for (i=0; ibins[i] = strtod(list[i],&tmp); + if ( *tmp ) error("Could not parse %s: %s\n", list_def, list[i]); + if ( min!=max && (bin->bins[i]bins[i]>max) ) + error("Expected values from the interval [%f,%f], found %s\n", min, max, list[i]); + free(list[i]); + } + free(list); + + if ( min!=max ) + { + // make sure we've got both boundaries: min,max. + assert( nlist>1 ); + float max_err = (bin->bins[1] - bin->bins[0])*1e-6; + if ( fabs(bin->bins[0] - min) > max_err ) + { + bin->bins = (float*) realloc(bin->bins, (++bin->nbins)*sizeof(float)); + memmove(bin->bins+1, bin->bins, sizeof(float)*(bin->nbins-1)); + bin->bins[0] = min; + } + if ( fabs(bin->bins[bin->nbins-1] - max) > max_err ) + { + bin->bins = (float*) realloc(bin->bins, (++bin->nbins)*sizeof(float)); + bin->bins[bin->nbins-1] = max; + } + } + return bin; +} + +void bin_destroy(bin_t *bin) +{ + free(bin->bins); + free(bin); +} + +int bin_get_size(bin_t *bin) { return bin->nbins; } + +float bin_get_value(bin_t *bin, int idx) { return bin->bins[idx]; } + +int bin_get_idx(bin_t *bin, float value) +{ + if ( bin->bins[bin->nbins-1] < value ) return bin->nbins-1; + + // Binary search in half-closed,half-open intervals [) + int imin = 0, imax = bin->nbins - 2; + while ( iminbins[i] ) imax = i - 1; + else if ( value > bin->bins[i] ) imin = i + 1; + else return i; + } + if ( bin->bins[imax] <= value ) return imax; + return imin - 1; +} + diff --git a/bcftools/bin.h b/bcftools/bin.h new file mode 100644 index 0000000..ab9e5b1 --- /dev/null +++ b/bcftools/bin.h @@ -0,0 +1,65 @@ +/* The MIT License + + Copyright (c) 2016 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +/* + Simple binning of float values into predefined bins +*/ + +#ifndef __BIN_H__ +#define __BIN_H__ + +#include + +typedef struct _bin_t bin_t; + +/* + * bin_init() - init bins + * @list: list of half-open intervals [). If the list does not contain commas, + * it is interpreted as a file name. + * @min,max: extreme values. This is for user convenience so that well-known + * extremes can be left out from the list. Ignored if min=max + */ +bin_t *bin_init(const char *list, float min, float max); +void bin_destroy(bin_t *bin); + +/* + * bin_get_size() - number of boundaries, subtract 1 to get the number of bins + */ +int bin_get_size(bin_t *bin); + +/* + bin_get_idx() - find the bin index which corresponds to the value (binary search) + Returns the bin index 0 <= idx <= size-2 or -1,size-1 for out of range values. + */ +int bin_get_idx(bin_t *bin, float value); + +/* + bin_get_value() - get the i-th boundary value, i=0,..,size-1 + */ +float bin_get_value(bin_t *bin, int ith); + +#endif + diff --git a/bcftools/call.h b/bcftools/call.h new file mode 100644 index 0000000..16bf0b6 --- /dev/null +++ b/bcftools/call.h @@ -0,0 +1,149 @@ +/* call.h -- variant calling declarations. + + Copyright (C) 2013-2015, 2019-2020 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#ifndef __CALL_H__ +#define __CALL_H__ + +#include +#include +#include "vcmp.h" + +#define CALL_KEEPALT 1 +#define CALL_VARONLY (1<<1) +#define CALL_CONSTR_TRIO (1<<2) +#define CALL_CONSTR_ALLELES (1<<3) +// +#define CALL_FMT_PV4 (1<<5) +#define CALL_FMT_GQ (1<<6) +#define CALL_FMT_GP (1<<7) + +#define FATHER 0 +#define MOTHER 1 +#define CHILD 2 +typedef struct +{ + char *name; + int sample[3]; // father, mother, child + int type; // see FTYPE_* definitions in mcall.c +} +family_t; + +// For the single-sample and grouped -G calling +typedef struct +{ + double ref_lk, max_lk, lk_sum; + float *qsum; // QS(quality sum) values + int nqsum; + uint32_t *smpl, nsmpl; + uint32_t nals, als; +} +smpl_grp_t; + +// For the `-C alleles -i` constrained calling +typedef struct +{ + uint32_t n:31, used:1; + char **allele; +} +tgt_als_t; + +typedef struct _ccall_t ccall_t; +typedef struct +{ + // mcall only + int npdg; + int *als_map, nals_map; // mapping from full set of alleles to trimmed set of alleles (old -> new) + int *pl_map, npl_map; // same as above for PLs, but reverse (new -> old) + char **als; // array to hold the trimmed set of alleles to appear on output + int nals; // size of the als array + int als_new, nals_new; // bitmask with final alleles and their number + family_t *fams; // list of families and samples for trio calling + int nfams, mfams; + int ntrio[5][5]; // possible trio genotype combinations and their counts; first idx: + uint16_t *trio[5][5]; // family type, second index: allele count (2-4, first two are unused) + double *GLs; + float *GPs; // FORMAT/GP: posterior probabilities + int32_t *GQs, *ADs; // FORMAT/GQ: genotype qualities; AD: allelic depth for -G + int32_t *itmp; // temporary int array, used for new PLs with CALL_CONSTR_ALLELES + int n_itmp, nGPs, nADs; + vcmp_t *vcmp; + double trio_Pm_SNPs, trio_Pm_del, trio_Pm_ins; // P(mendelian) for trio calling, see mcall_call_trio_genotypes() + int32_t *ugts, *cgts; // unconstraind and constrained GTs + uint32_t output_tags; + char *prior_AN, *prior_AC; // reference panel AF tags (AF=AC/AN) + tgt_als_t *tgt_als; // for CALL_CONSTR_ALLELES + char *sample_groups; // for single-sample or grouped calling with -G + char *sample_groups_tag; // for -G [AD|QS:] + smpl_grp_t *smpl_grp; + int nsmpl_grp; + + // ccall only + double indel_frac, min_perm_p, min_lrt; + double prior_type, pref; + int ngrp1_samples, n_perm; + char *prior_file; + ccall_t *cdat; + + // shared + bcf_srs_t *srs; // BCF synced readers holding target alleles for CALL_CONSTR_ALLELES + bcf1_t *rec; + bcf_hdr_t *hdr; + uint32_t flag; // One or more of the CALL_* flags defined above + uint8_t *ploidy, all_diploid, unseen; + + double pl2p[256]; // PL to 10^(-PL/10) table + int32_t *PLs; // VCF PL likelihoods (rw) + int nPLs, mPLs, nac; + int32_t *gts, *ac; // GTs and AC (w) + double *pdg; // PLs converted to P(D|G) + float *anno16; int n16; // see anno[16] in bam2bcf.h + double theta; // prior +} +call_t; + +void error(const char *format, ...); + +/* + * call() - return -1 value on critical error; -2 to skip the site; or the number of non-reference + * alleles on success. + */ +int mcall(call_t *call, bcf1_t *rec); // multiallic and rare-variant calling model +int ccall(call_t *call, bcf1_t *rec); // the default consensus calling model +int qcall(call_t *call, bcf1_t *rec); // QCall output + +void mcall_init(call_t *call); +void ccall_init(call_t *call); +void qcall_init(call_t *call); + +void mcall_destroy(call_t *call); +void ccall_destroy(call_t *call); +void qcall_destroy(call_t *call); + +void call_init_pl2p(call_t *call); +uint32_t *call_trio_prep(int is_x, int is_son); + +void init_allele_trimming_maps(call_t *call, int nals_ori, int als_out); +void mcall_trim_and_update_numberR(call_t *call, bcf1_t *rec, int nals_ori, int nals_new); + +#endif diff --git a/bcftools/ccall.c b/bcftools/ccall.c new file mode 100644 index 0000000..6bf987b --- /dev/null +++ b/bcftools/ccall.c @@ -0,0 +1,338 @@ +/* ccall.c -- consensus variant calling. + + Copyright (C) 2013-2014 Genome Research Ltd. + Portions copyright (C) 2010 Broad Institute. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include "call.h" +#include "kmin.h" +#include "prob1.h" + +// Most of the original -c calling was moved to bcftools as it was +// and its data structures were wrapped into the ccal_t to make it +// functional quickly. This is not the desired state. +struct _ccall_t +{ + bcf_p1aux_t *p1; +}; + +void ccall_init(call_t *call) +{ + call->cdat = (ccall_t*) calloc(1,sizeof(ccall_t)); + call_init_pl2p(call); + call->cdat->p1 = bcf_p1_init(bcf_hdr_nsamples(call->hdr), call->ploidy); + call->gts = (int*) calloc(bcf_hdr_nsamples(call->hdr)*2,sizeof(int)); // assuming at most diploid everywhere + call->nals_map = 5; + call->als_map = (int*) malloc(sizeof(int)*call->nals_map); + + bcf_hdr_append(call->hdr,"##FORMAT="); + if ( call->output_tags & CALL_FMT_GQ ) + { + bcf_hdr_append(call->hdr,"##FORMAT="); + call->GQs = (int32_t*) malloc(sizeof(int32_t)*bcf_hdr_nsamples(call->hdr)); + } + if ( call->output_tags & CALL_FMT_GP ) + error("Sorry, -f GP is not supported with -c\n"); + bcf_hdr_append(call->hdr,"##INFO="); + // Todo: groups not migrated to 'bcftools call' yet + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO=\n"); + bcf_hdr_append(call->hdr,"##INFO=\n"); + bcf_hdr_append(call->hdr,"##INFO=\n"); + bcf_hdr_append(call->hdr,"##INFO=\n"); + bcf_hdr_append(call->hdr,"##INFO=\n"); + // bcf_hdr_append(call->hdr,); + // bcf_hdr_append(call->hdr,); + bcf_hdr_append(call->hdr,"##INFO="); + + return; +} +void ccall_destroy(call_t *call) +{ + free(call->itmp); + free(call->als_map); + free(call->gts); + free(call->anno16); + free(call->PLs); + free(call->GQs); + free(call->pdg); + bcf_p1_destroy(call->cdat->p1); + free(call->cdat); + return; +} + +// Inits P(D|G): convert PLs from log space, only two alleles (three PLs) are used. +// NB: The original samtools calling code uses pdgs in reverse order (AA comes +// first, RR last), while the -m calling model uses the canonical order. +static void set_pdg3(double *pl2p, int *PLs, double *pdg, int n_smpl, int n_gt) +{ + int i; + for (i=0; ip[0] = a->p[1] = a->p[2] = a->p[3] = 1.; + for (i=0; i<4; i++) a->d[i] = anno[i]; + a->depth = anno[0] + anno[1] + anno[2] + anno[3]; + a->is_tested = (anno[0] + anno[1] > 0 && anno[2] + anno[3] > 0); + if (a->depth == 0) return -1; + a->mq = (int)(sqrt((anno[9] + anno[11]) / a->depth) + .499); + kt_fisher_exact(anno[0], anno[1], anno[2], anno[3], &left, &right, &a->p[0]); + for (i = 1; i < 4; ++i) + a->p[i] = ttest(anno[0] + anno[1], anno[2] + anno[3], anno+4*i); + return 0; +} + +int test16(float *anno16, anno16_t *a) +{ + a->p[0] = a->p[1] = a->p[2] = a->p[3] = 1.; + a->d[0] = a->d[1] = a->d[2] = a->d[3] = 0.; + a->mq = a->depth = a->is_tested = 0; + return test16_core(anno16, a); +} +static int update_bcf1(call_t *call, bcf1_t *rec, const bcf_p1rst_t *pr, double em[10]) +{ + int has_I16, is_var; + float fq, r; + anno16_t a; + float tmpf[4], tmpi; + + bcf_get_info_float(call->hdr, rec, "I16", &call->anno16, &call->n16); + + has_I16 = test16(call->anno16, &a) >= 0? 1 : 0; + + // print EM + if (em[0] >= 0) + { + tmpf[0] = 1 - em[0]; + bcf_update_info_float(call->hdr, rec, "AF1", tmpf, 1); + } + if (em[4] >= 0 && em[4] <= 0.05) + { + tmpf[0] = em[3]; tmpf[1] = em[2]; tmpf[2] = em[1]; tmpf[3] = em[4]; + bcf_update_info_float(call->hdr, rec, "G3", tmpf, 3); + bcf_update_info_float(call->hdr, rec, "HWE", &tmpf[3], 1); + } + if (em[5] >= 0 && em[6] >= 0) + { + tmpf[0] = 1 - em[5]; tmpf[1] = 1 - em[6]; + bcf_update_info_float(call->hdr, rec, "AF2", tmpf, 2); + } + if (em[7] >= 0) + { + tmpf[0] = em[7]; + bcf_update_info_float(call->hdr, rec, "LRT", tmpf, 1); + } + if (em[8] >= 0) + { + tmpf[0] = em[8]; + bcf_update_info_float(call->hdr, rec, "LRT2", tmpf, 1); + } + + bcf_p1aux_t *p1 = call->cdat->p1; + if (p1->cons_llr > 0) + { + tmpi = p1->cons_llr; + bcf_update_info_int32(call->hdr, rec, "CLR", &tmpi, 1); + // todo: trio calling with -c + if (p1->cons_gt > 0) + { + char tmp[4]; + tmp[0] = p1->cons_gt&0xff; tmp[1] = p1->cons_gt>>8&0xff; tmp[2] = p1->cons_gt>>16&0xff; tmp[3] = 0; + bcf_update_info_string(call->hdr, rec, "UGT", tmp); + tmp[0] = p1->cons_gt>>32&0xff; tmp[1] = p1->cons_gt>>40&0xff; tmp[2] = p1->cons_gt>>48&0xff; + bcf_update_info_string(call->hdr, rec, "CGT", tmp); + } + } + is_var = (pr->p_ref < call->pref); + r = is_var? pr->p_ref : pr->p_var; + + bcf_update_info_int32(call->hdr, rec, "AC1", &pr->ac, 1); + int32_t dp[4]; dp[0] = call->anno16[0]; dp[1] = call->anno16[1]; dp[2] = call->anno16[2]; dp[3] = call->anno16[3]; + bcf_update_info_int32(call->hdr, rec, "DP4", dp, 4); + bcf_update_info_int32(call->hdr, rec, "MQ", &a.mq, 1); + + fq = pr->p_ref_folded < 0.5? -4.343 * log(pr->p_ref_folded) : 4.343 * log(pr->p_var_folded); + if (fq < -999) fq = -999; + if (fq > 999) fq = 999; + bcf_update_info_float(call->hdr, rec, "FQ", &fq, 1); + + assert( pr->cmp[0]<0 ); + // todo + // if (pr->cmp[0] >= 0.) { // two sample groups + // int i, q[3]; + // for (i = 1; i < 3; ++i) { + // double x = pr->cmp[i] + pr->cmp[0]/2.; + // q[i] = x == 0? 255 : (int)(-4.343 * log(x) + .499); + // if (q[i] > 255) q[i] = 255; + // } + // if (pr->perm_rank >= 0) ksprintf(&s, "PR=%d;", pr->perm_rank); + // + // ksprintf(&s, "PCHI2=%.3g;PC2=%d,%d;", q[1], q[2], pr->p_chi2); + // } + + if (has_I16 && a.is_tested) + { + int i; + for (i=0; i<4; i++) tmpf[i] = a.p[i]; + bcf_update_info_float(call->hdr, rec, "PV4", tmpf, 4); + } + bcf_update_info_int32(call->hdr, rec, "I16", NULL, 0); // remove I16 tag + bcf_update_info_int32(call->hdr, rec, "QS", NULL, 0); // remove QS tag + + rec->qual = r < 1e-100? 999 : -4.343 * log(r); + if (rec->qual > 999) rec->qual = 999; + + // Remove unused alleles + int nals_ori = rec->n_allele, nals = !is_var && !(call->flag & CALL_KEEPALT) ? 1 : pr->rank0 < 2? 2 : pr->rank0+1; + if ( call->flag & CALL_KEEPALT && call->unseen==nals-1 ) nals--; + + if ( nalsn_allele ) + { + bcf_update_alleles(call->hdr, rec, (const char**)rec->d.allele, nals); + + // Update PLs + int npls_src = call->nPLs / rec->n_sample, npls_dst = nals*(nals+1)/2; + int *pls_src = call->PLs - npls_src, *pls_dst = call->PLs - npls_dst; + int isample, i; + for (isample = 0; isample < rec->n_sample; isample++) + { + pls_src += npls_src; + pls_dst += npls_dst; + if ( !call->ploidy || call->ploidy[isample]==2 ) + { + for (i=0; ihdr, rec, "PL", call->PLs, npls_dst*rec->n_sample); + } + + // Call genotypes + int i; + for (i=0; in_sample; i++) + { + int x = ( is_var || call->output_tags & CALL_FMT_GQ ) ? bcf_p1_call_gt(p1, pr->f_exp, i, is_var) : 2; + int gt = x&3; + if ( !call->ploidy || call->ploidy[i]==2 ) + { + if ( gt==1 ) + { + call->gts[2*i] = bcf_gt_unphased(0); + call->gts[2*i+1] = bcf_gt_unphased(1); + } + else if ( gt==0 ) + { + call->gts[2*i] = bcf_gt_unphased(1); + call->gts[2*i+1] = bcf_gt_unphased(1); + } + else + { + call->gts[2*i] = bcf_gt_unphased(0); + call->gts[2*i+1] = bcf_gt_unphased(0); + } + if ( call->output_tags & CALL_FMT_GQ ) call->GQs[i] = x>>2; + } + else + { + if ( gt==0 ) call->gts[2*i] = bcf_gt_unphased(1); + else call->gts[2*i] = bcf_gt_unphased(0); + call->gts[2*i+1] = bcf_int32_vector_end; + if ( call->output_tags & CALL_FMT_GQ ) call->GQs[i] = bcf_int32_missing; + } + } + bcf_update_genotypes(call->hdr, rec, call->gts, rec->n_sample*2); + if ( call->output_tags & CALL_FMT_GQ ) + bcf_update_format_int32(call->hdr, rec, "GQ", call->GQs, rec->n_sample); + + // trim Number=R tags + int out_als = 0; + for (i=0; ihdr); + + // Get the genotype likelihoods + int nals = rec->n_allele; + call->nPLs = bcf_get_format_int32(call->hdr, rec, "PL", &call->PLs, &call->mPLs); + if ( call->nPLs!=nsmpl*nals*(nals+1)/2 && call->nPLs!=nsmpl*nals ) // diploid+haploid or haploid only + error("Wrong number of PL fields? nals=%d npl=%d\n", nals,call->nPLs); + + // Convert PLs to probabilities, only first two alleles are considered + int ngts = nals*(nals+1)/2; + hts_expand(double, 3*nsmpl, call->npdg, call->pdg); + set_pdg3(call->pl2p, call->PLs, call->pdg, nsmpl, ngts); + + double em[10] = {-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.}; + int ret = bcf_em1(call, rec, call->ngrp1_samples, 0x1ff, em); + + bcf_p1rst_t pr; + int do_contrast = (em[7] >= 0 && em[7] < call->min_lrt) ? 1 : 0; + ret = bcf_p1_cal(call, rec, do_contrast, call->cdat->p1, &pr); + if (pr.p_ref >= call->pref && (call->flag & CALL_VARONLY)) return 0; + if (ret >= 0) ret = update_bcf1(call, rec, &pr, em); + return ret; +} + diff --git a/bcftools/ccall.c.pysam.c b/bcftools/ccall.c.pysam.c new file mode 100644 index 0000000..eb7c615 --- /dev/null +++ b/bcftools/ccall.c.pysam.c @@ -0,0 +1,340 @@ +#include "bcftools.pysam.h" + +/* ccall.c -- consensus variant calling. + + Copyright (C) 2013-2014 Genome Research Ltd. + Portions copyright (C) 2010 Broad Institute. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include "call.h" +#include "kmin.h" +#include "prob1.h" + +// Most of the original -c calling was moved to bcftools as it was +// and its data structures were wrapped into the ccal_t to make it +// functional quickly. This is not the desired state. +struct _ccall_t +{ + bcf_p1aux_t *p1; +}; + +void ccall_init(call_t *call) +{ + call->cdat = (ccall_t*) calloc(1,sizeof(ccall_t)); + call_init_pl2p(call); + call->cdat->p1 = bcf_p1_init(bcf_hdr_nsamples(call->hdr), call->ploidy); + call->gts = (int*) calloc(bcf_hdr_nsamples(call->hdr)*2,sizeof(int)); // assuming at most diploid everywhere + call->nals_map = 5; + call->als_map = (int*) malloc(sizeof(int)*call->nals_map); + + bcf_hdr_append(call->hdr,"##FORMAT="); + if ( call->output_tags & CALL_FMT_GQ ) + { + bcf_hdr_append(call->hdr,"##FORMAT="); + call->GQs = (int32_t*) malloc(sizeof(int32_t)*bcf_hdr_nsamples(call->hdr)); + } + if ( call->output_tags & CALL_FMT_GP ) + error("Sorry, -f GP is not supported with -c\n"); + bcf_hdr_append(call->hdr,"##INFO="); + // Todo: groups not migrated to 'bcftools call' yet + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO=\n"); + bcf_hdr_append(call->hdr,"##INFO=\n"); + bcf_hdr_append(call->hdr,"##INFO=\n"); + bcf_hdr_append(call->hdr,"##INFO=\n"); + bcf_hdr_append(call->hdr,"##INFO=\n"); + // bcf_hdr_append(call->hdr,); + // bcf_hdr_append(call->hdr,); + bcf_hdr_append(call->hdr,"##INFO="); + + return; +} +void ccall_destroy(call_t *call) +{ + free(call->itmp); + free(call->als_map); + free(call->gts); + free(call->anno16); + free(call->PLs); + free(call->GQs); + free(call->pdg); + bcf_p1_destroy(call->cdat->p1); + free(call->cdat); + return; +} + +// Inits P(D|G): convert PLs from log space, only two alleles (three PLs) are used. +// NB: The original samtools calling code uses pdgs in reverse order (AA comes +// first, RR last), while the -m calling model uses the canonical order. +static void set_pdg3(double *pl2p, int *PLs, double *pdg, int n_smpl, int n_gt) +{ + int i; + for (i=0; ip[0] = a->p[1] = a->p[2] = a->p[3] = 1.; + for (i=0; i<4; i++) a->d[i] = anno[i]; + a->depth = anno[0] + anno[1] + anno[2] + anno[3]; + a->is_tested = (anno[0] + anno[1] > 0 && anno[2] + anno[3] > 0); + if (a->depth == 0) return -1; + a->mq = (int)(sqrt((anno[9] + anno[11]) / a->depth) + .499); + kt_fisher_exact(anno[0], anno[1], anno[2], anno[3], &left, &right, &a->p[0]); + for (i = 1; i < 4; ++i) + a->p[i] = ttest(anno[0] + anno[1], anno[2] + anno[3], anno+4*i); + return 0; +} + +int test16(float *anno16, anno16_t *a) +{ + a->p[0] = a->p[1] = a->p[2] = a->p[3] = 1.; + a->d[0] = a->d[1] = a->d[2] = a->d[3] = 0.; + a->mq = a->depth = a->is_tested = 0; + return test16_core(anno16, a); +} +static int update_bcf1(call_t *call, bcf1_t *rec, const bcf_p1rst_t *pr, double em[10]) +{ + int has_I16, is_var; + float fq, r; + anno16_t a; + float tmpf[4], tmpi; + + bcf_get_info_float(call->hdr, rec, "I16", &call->anno16, &call->n16); + + has_I16 = test16(call->anno16, &a) >= 0? 1 : 0; + + // print EM + if (em[0] >= 0) + { + tmpf[0] = 1 - em[0]; + bcf_update_info_float(call->hdr, rec, "AF1", tmpf, 1); + } + if (em[4] >= 0 && em[4] <= 0.05) + { + tmpf[0] = em[3]; tmpf[1] = em[2]; tmpf[2] = em[1]; tmpf[3] = em[4]; + bcf_update_info_float(call->hdr, rec, "G3", tmpf, 3); + bcf_update_info_float(call->hdr, rec, "HWE", &tmpf[3], 1); + } + if (em[5] >= 0 && em[6] >= 0) + { + tmpf[0] = 1 - em[5]; tmpf[1] = 1 - em[6]; + bcf_update_info_float(call->hdr, rec, "AF2", tmpf, 2); + } + if (em[7] >= 0) + { + tmpf[0] = em[7]; + bcf_update_info_float(call->hdr, rec, "LRT", tmpf, 1); + } + if (em[8] >= 0) + { + tmpf[0] = em[8]; + bcf_update_info_float(call->hdr, rec, "LRT2", tmpf, 1); + } + + bcf_p1aux_t *p1 = call->cdat->p1; + if (p1->cons_llr > 0) + { + tmpi = p1->cons_llr; + bcf_update_info_int32(call->hdr, rec, "CLR", &tmpi, 1); + // todo: trio calling with -c + if (p1->cons_gt > 0) + { + char tmp[4]; + tmp[0] = p1->cons_gt&0xff; tmp[1] = p1->cons_gt>>8&0xff; tmp[2] = p1->cons_gt>>16&0xff; tmp[3] = 0; + bcf_update_info_string(call->hdr, rec, "UGT", tmp); + tmp[0] = p1->cons_gt>>32&0xff; tmp[1] = p1->cons_gt>>40&0xff; tmp[2] = p1->cons_gt>>48&0xff; + bcf_update_info_string(call->hdr, rec, "CGT", tmp); + } + } + is_var = (pr->p_ref < call->pref); + r = is_var? pr->p_ref : pr->p_var; + + bcf_update_info_int32(call->hdr, rec, "AC1", &pr->ac, 1); + int32_t dp[4]; dp[0] = call->anno16[0]; dp[1] = call->anno16[1]; dp[2] = call->anno16[2]; dp[3] = call->anno16[3]; + bcf_update_info_int32(call->hdr, rec, "DP4", dp, 4); + bcf_update_info_int32(call->hdr, rec, "MQ", &a.mq, 1); + + fq = pr->p_ref_folded < 0.5? -4.343 * log(pr->p_ref_folded) : 4.343 * log(pr->p_var_folded); + if (fq < -999) fq = -999; + if (fq > 999) fq = 999; + bcf_update_info_float(call->hdr, rec, "FQ", &fq, 1); + + assert( pr->cmp[0]<0 ); + // todo + // if (pr->cmp[0] >= 0.) { // two sample groups + // int i, q[3]; + // for (i = 1; i < 3; ++i) { + // double x = pr->cmp[i] + pr->cmp[0]/2.; + // q[i] = x == 0? 255 : (int)(-4.343 * log(x) + .499); + // if (q[i] > 255) q[i] = 255; + // } + // if (pr->perm_rank >= 0) ksprintf(&s, "PR=%d;", pr->perm_rank); + // + // ksprintf(&s, "PCHI2=%.3g;PC2=%d,%d;", q[1], q[2], pr->p_chi2); + // } + + if (has_I16 && a.is_tested) + { + int i; + for (i=0; i<4; i++) tmpf[i] = a.p[i]; + bcf_update_info_float(call->hdr, rec, "PV4", tmpf, 4); + } + bcf_update_info_int32(call->hdr, rec, "I16", NULL, 0); // remove I16 tag + bcf_update_info_int32(call->hdr, rec, "QS", NULL, 0); // remove QS tag + + rec->qual = r < 1e-100? 999 : -4.343 * log(r); + if (rec->qual > 999) rec->qual = 999; + + // Remove unused alleles + int nals_ori = rec->n_allele, nals = !is_var && !(call->flag & CALL_KEEPALT) ? 1 : pr->rank0 < 2? 2 : pr->rank0+1; + if ( call->flag & CALL_KEEPALT && call->unseen==nals-1 ) nals--; + + if ( nalsn_allele ) + { + bcf_update_alleles(call->hdr, rec, (const char**)rec->d.allele, nals); + + // Update PLs + int npls_src = call->nPLs / rec->n_sample, npls_dst = nals*(nals+1)/2; + int *pls_src = call->PLs - npls_src, *pls_dst = call->PLs - npls_dst; + int isample, i; + for (isample = 0; isample < rec->n_sample; isample++) + { + pls_src += npls_src; + pls_dst += npls_dst; + if ( !call->ploidy || call->ploidy[isample]==2 ) + { + for (i=0; ihdr, rec, "PL", call->PLs, npls_dst*rec->n_sample); + } + + // Call genotypes + int i; + for (i=0; in_sample; i++) + { + int x = ( is_var || call->output_tags & CALL_FMT_GQ ) ? bcf_p1_call_gt(p1, pr->f_exp, i, is_var) : 2; + int gt = x&3; + if ( !call->ploidy || call->ploidy[i]==2 ) + { + if ( gt==1 ) + { + call->gts[2*i] = bcf_gt_unphased(0); + call->gts[2*i+1] = bcf_gt_unphased(1); + } + else if ( gt==0 ) + { + call->gts[2*i] = bcf_gt_unphased(1); + call->gts[2*i+1] = bcf_gt_unphased(1); + } + else + { + call->gts[2*i] = bcf_gt_unphased(0); + call->gts[2*i+1] = bcf_gt_unphased(0); + } + if ( call->output_tags & CALL_FMT_GQ ) call->GQs[i] = x>>2; + } + else + { + if ( gt==0 ) call->gts[2*i] = bcf_gt_unphased(1); + else call->gts[2*i] = bcf_gt_unphased(0); + call->gts[2*i+1] = bcf_int32_vector_end; + if ( call->output_tags & CALL_FMT_GQ ) call->GQs[i] = bcf_int32_missing; + } + } + bcf_update_genotypes(call->hdr, rec, call->gts, rec->n_sample*2); + if ( call->output_tags & CALL_FMT_GQ ) + bcf_update_format_int32(call->hdr, rec, "GQ", call->GQs, rec->n_sample); + + // trim Number=R tags + int out_als = 0; + for (i=0; ihdr); + + // Get the genotype likelihoods + int nals = rec->n_allele; + call->nPLs = bcf_get_format_int32(call->hdr, rec, "PL", &call->PLs, &call->mPLs); + if ( call->nPLs!=nsmpl*nals*(nals+1)/2 && call->nPLs!=nsmpl*nals ) // diploid+haploid or haploid only + error("Wrong number of PL fields? nals=%d npl=%d\n", nals,call->nPLs); + + // Convert PLs to probabilities, only first two alleles are considered + int ngts = nals*(nals+1)/2; + hts_expand(double, 3*nsmpl, call->npdg, call->pdg); + set_pdg3(call->pl2p, call->PLs, call->pdg, nsmpl, ngts); + + double em[10] = {-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.,-1.}; + int ret = bcf_em1(call, rec, call->ngrp1_samples, 0x1ff, em); + + bcf_p1rst_t pr; + int do_contrast = (em[7] >= 0 && em[7] < call->min_lrt) ? 1 : 0; + ret = bcf_p1_cal(call, rec, do_contrast, call->cdat->p1, &pr); + if (pr.p_ref >= call->pref && (call->flag & CALL_VARONLY)) return 0; + if (ret >= 0) ret = update_bcf1(call, rec, &pr, em); + return ret; +} + diff --git a/bcftools/cols.c b/bcftools/cols.c new file mode 100644 index 0000000..30ca365 --- /dev/null +++ b/bcftools/cols.c @@ -0,0 +1,109 @@ +/* + Copyright (C) 2019 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include +#include "cols.h" + +cols_t *cols_split(const char *line, cols_t *cols, char delim) +{ + if ( !cols ) cols = (cols_t*) calloc(1,sizeof(cols_t)); + if ( cols->rmme ) free(cols->rmme); + cols->n = 0; + cols->rmme = strdup(line); + char *ss = cols->rmme; + while (1) + { + char *se = ss; + while ( *se && *se!=delim ) se++; + char tmp = *se; + *se = 0; + cols->n++; + if ( cols->n > cols->m ) + { + cols->m += 10; + cols->off = (char**) realloc(cols->off, sizeof(*cols->off)*cols->m); + } + cols->off[ cols->n - 1 ] = ss; + if ( !tmp ) break; + ss = se + 1; + } + return cols; +} + +void cols_append(cols_t *cols, char *str) +{ + if ( cols->rmme ) + { + size_t str_len = strlen(str); + size_t lst_len = strlen(cols->off[ cols->n - 1 ]); + size_t tot_len = 2 + str_len + lst_len + (cols->off[ cols->n - 1 ] - cols->rmme); + + cols_t *tmp_cols = (cols_t*)calloc(1,sizeof(cols_t)); + tmp_cols->rmme = (char*) calloc(tot_len,1); + tmp_cols->off = (char**) calloc(cols->n+1,sizeof(*tmp_cols->off)); + + char *ptr = tmp_cols->rmme; + int i; + for (i=0; in; i++) + { + size_t len = strlen(cols->off[i]); + memcpy(ptr, cols->off[i], len); + tmp_cols->off[i] = ptr; + ptr += len + 1; + } + memcpy(ptr, str, str_len); + tmp_cols->off[i] = ptr; + + free(cols->off); + free(cols->rmme); + cols->rmme = tmp_cols->rmme; + cols->off = tmp_cols->off; + cols->n = cols->n+1; + cols->m = cols->n; + free(tmp_cols); + return; + } + cols->n++; + if ( cols->n > cols->m ) + { + cols->m++; + cols->off = (char**) realloc(cols->off,sizeof(*cols->off)*cols->m); + } + cols->off[cols->n-1] = str; +} +void cols_clear(cols_t *cols) +{ + if ( !cols ) return; + free(cols->rmme); + free(cols->off); + cols->rmme = NULL; + cols->off = NULL; +} +void cols_destroy(cols_t *cols) +{ + if ( !cols ) return; + cols_clear(cols); + free(cols); +} + diff --git a/bcftools/cols.c.pysam.c b/bcftools/cols.c.pysam.c new file mode 100644 index 0000000..b8309cc --- /dev/null +++ b/bcftools/cols.c.pysam.c @@ -0,0 +1,111 @@ +#include "bcftools.pysam.h" + +/* + Copyright (C) 2019 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include +#include "cols.h" + +cols_t *cols_split(const char *line, cols_t *cols, char delim) +{ + if ( !cols ) cols = (cols_t*) calloc(1,sizeof(cols_t)); + if ( cols->rmme ) free(cols->rmme); + cols->n = 0; + cols->rmme = strdup(line); + char *ss = cols->rmme; + while (1) + { + char *se = ss; + while ( *se && *se!=delim ) se++; + char tmp = *se; + *se = 0; + cols->n++; + if ( cols->n > cols->m ) + { + cols->m += 10; + cols->off = (char**) realloc(cols->off, sizeof(*cols->off)*cols->m); + } + cols->off[ cols->n - 1 ] = ss; + if ( !tmp ) break; + ss = se + 1; + } + return cols; +} + +void cols_append(cols_t *cols, char *str) +{ + if ( cols->rmme ) + { + size_t str_len = strlen(str); + size_t lst_len = strlen(cols->off[ cols->n - 1 ]); + size_t tot_len = 2 + str_len + lst_len + (cols->off[ cols->n - 1 ] - cols->rmme); + + cols_t *tmp_cols = (cols_t*)calloc(1,sizeof(cols_t)); + tmp_cols->rmme = (char*) calloc(tot_len,1); + tmp_cols->off = (char**) calloc(cols->n+1,sizeof(*tmp_cols->off)); + + char *ptr = tmp_cols->rmme; + int i; + for (i=0; in; i++) + { + size_t len = strlen(cols->off[i]); + memcpy(ptr, cols->off[i], len); + tmp_cols->off[i] = ptr; + ptr += len + 1; + } + memcpy(ptr, str, str_len); + tmp_cols->off[i] = ptr; + + free(cols->off); + free(cols->rmme); + cols->rmme = tmp_cols->rmme; + cols->off = tmp_cols->off; + cols->n = cols->n+1; + cols->m = cols->n; + free(tmp_cols); + return; + } + cols->n++; + if ( cols->n > cols->m ) + { + cols->m++; + cols->off = (char**) realloc(cols->off,sizeof(*cols->off)*cols->m); + } + cols->off[cols->n-1] = str; +} +void cols_clear(cols_t *cols) +{ + if ( !cols ) return; + free(cols->rmme); + free(cols->off); + cols->rmme = NULL; + cols->off = NULL; +} +void cols_destroy(cols_t *cols) +{ + if ( !cols ) return; + cols_clear(cols); + free(cols); +} + diff --git a/bcftools/cols.h b/bcftools/cols.h new file mode 100644 index 0000000..577f2d1 --- /dev/null +++ b/bcftools/cols.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2019 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#ifndef __COLS_H__ +#define __COLS_H__ + +#include + +typedef struct +{ + int n,m; + char **off, *rmme; +} +cols_t; + +/* + cols_split() can be called repeatedly to split new strings, memory is allocated + and deallocated automatically +*/ +cols_t *cols_split(const char *line, cols_t *cols, char delim); + +/* + Although cols_append() can be combined with cols_split(), it is much slower and + the string must exist throughout the life of cols unless initialized with cols_split(). +*/ +void cols_append(cols_t *cols, char *str); +void cols_clear(cols_t *cols); +void cols_destroy(cols_t *cols); + +#endif diff --git a/bcftools/consensus.c b/bcftools/consensus.c new file mode 100644 index 0000000..84ae905 --- /dev/null +++ b/bcftools/consensus.c @@ -0,0 +1,1173 @@ +/* The MIT License + + Copyright (c) 2014-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "regidx.h" +#include "bcftools.h" +#include "rbuf.h" +#include "filter.h" + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +#define PICK_REF 1 +#define PICK_ALT 2 +#define PICK_LONG 4 +#define PICK_SHORT 8 +#define PICK_IUPAC 16 + +#define TO_UPPER 0 +#define TO_LOWER 1 + +typedef struct +{ + int num; // number of ungapped blocks in this chain + int *block_lengths; // length of the ungapped blocks in this chain + int *ref_gaps; // length of the gaps on the reference sequence between blocks + int *alt_gaps; // length of the gaps on the alternative sequence between blocks + int ori_pos; + int ref_last_block_ori; // start position on the reference sequence of the following ungapped block (0-based) + int alt_last_block_ori; // start position on the alternative sequence of the following ungapped block (0-based) +} +chain_t; + +#define MASK_LC 1 +#define MASK_UC 2 +#define MASK_SKIP(x) (((x)->with!=MASK_LC && (x)->with!=MASK_UC) ? 1 : 0) +typedef struct +{ + char *fname, with; + regidx_t *idx; + regitr_t *itr; +} +mask_t; + +typedef struct +{ + kstring_t fa_buf; // buffered reference sequence + int fa_ori_pos; // start position of the fa_buffer (wrt original sequence) + int fa_frz_pos; // protected position to avoid conflicting variants (last pos for SNPs/ins) + int fa_mod_off; // position difference of fa_frz_pos in the ori and modified sequence (ins positive) + int fa_frz_mod; // the fa_buf offset of the protected fa_frz_pos position, includes the modified sequence + int fa_end_pos; // region's end position in the original sequence + int fa_length; // region's length in the original sequence (in case end_pos not provided in the FASTA header) + int fa_case; // output upper case or lower case: TO_UPPER|TO_LOWER + int fa_src_pos; // last genomic coordinate read from the input fasta (0-based) + char prev_base; // this is only to validate the REF allele in the VCF - the modified fa_buf cannot be used for inserts following deletions, see 600#issuecomment-383186778 + int prev_base_pos; // the position of prev_base + int prev_is_insert; + + rbuf_t vcf_rbuf; + bcf1_t **vcf_buf; + int nvcf_buf, rid; + char *chr, *chr_prefix; + + mask_t *mask; + int nmask; + + int chain_id; // chain_id, to provide a unique ID to each chain in the chain output + chain_t *chain; // chain structure to store the sequence of ungapped blocks between the ref and alt sequences + // Note that the chain is re-initialised for each chromosome/seq_region + + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + + bcf_srs_t *files; + bcf_hdr_t *hdr; + FILE *fp_out; + FILE *fp_chain; + char **argv; + int argc, output_iupac, haplotype, allele, isample, napplied; + uint8_t *iupac_bitmask; + int miupac_bitmask; + char *fname, *ref_fname, *sample, *output_fname, *mask_fname, *chain_fname, missing_allele, absent_allele; + char mark_del, mark_ins, mark_snv; +} +args_t; + +static void destroy_chain(chain_t *chain) +{ + if ( !chain ) return; + free(chain->ref_gaps); + free(chain->alt_gaps); + free(chain->block_lengths); + free(chain); +} +static chain_t* init_chain(chain_t *chain, int ref_ori_pos) +{ + if ( chain ) destroy_chain(chain); + chain = (chain_t*) calloc(1,sizeof(chain_t)); + chain->num = 0; + chain->block_lengths = NULL; + chain->ref_gaps = NULL; + chain->alt_gaps = NULL; + chain->ori_pos = ref_ori_pos; + chain->ref_last_block_ori = ref_ori_pos; + chain->alt_last_block_ori = ref_ori_pos; + return chain; +} + +static void print_chain(args_t *args) +{ + /* + Example chain format (see: https://genome.ucsc.edu/goldenPath/help/chain.html): + chain 1 500 + 480 500 1 501 + 480 501 1 + 12 3 1 + 1 0 3 + 484 + + chain line is: + - chain + - score (sum of the length of ungapped block in this case) + - ref_seqname (from the fasta header, parsed by htslib) + - ref_seqlength (from the fasta header) + - ref_strand (+ or -; always + for bcf-consensus) + - ref_start (as defined in the fasta header) + - ref_end (as defined in the fasta header) + - alt_seqname (same as ref_seqname as bcf-consensus only considers SNPs and indels) + - alt_seqlength (adjusted to match the length of the alt sequence) + - alt_strand (+ or -; always + for bcf-consensus) + - alt_start (same as ref_start, as no edits are recorded/applied before that position) + - alt_end (adjusted to match the length of the alt sequence) + - chain_num (just an auto-increment id) + + the other (sorted) lines are: + - length of the ungapped alignment block + - gap on the ref sequence between this and the next block (all but the last line) + - gap on the alt sequence between this and the next block (all but the last line) + */ + chain_t *chain = args->chain; + int n = chain->num; + int ref_end_pos = args->fa_length + chain->ori_pos; + int last_block_size = ref_end_pos - chain->ref_last_block_ori; + int alt_end_pos = chain->alt_last_block_ori + last_block_size; + int score = 0; + for (n=0; nnum; n++) { + score += chain->block_lengths[n]; + } + score += last_block_size; + fprintf(args->fp_chain, "chain %d %s %d + %d %d %s %d + %d %d %d\n", score, args->chr, ref_end_pos, chain->ori_pos, ref_end_pos, args->chr, alt_end_pos, chain->ori_pos, alt_end_pos, ++args->chain_id); + for (n=0; nnum; n++) { + fprintf(args->fp_chain, "%d %d %d\n", chain->block_lengths[n], chain->ref_gaps[n], chain->alt_gaps[n]); + } + fprintf(args->fp_chain, "%d\n\n", last_block_size); +} + +static void push_chain_gap(chain_t *chain, int ref_start, int ref_len, int alt_start, int alt_len) +{ + // fprintf(stderr, "push_chain_gap(chain=%p, ref_start=%d, ref_len=%d, alt_start=%d, alt_len=%d)\n", chain, ref_start, ref_len, alt_start, alt_len); + int num = chain->num; + + if (num && ref_start <= chain->ref_last_block_ori) { + // In case this variant is back-to-back with the previous one + chain->ref_last_block_ori = ref_start + ref_len; + chain->alt_last_block_ori = alt_start + alt_len; + chain->ref_gaps[num-1] += ref_len; + chain->alt_gaps[num-1] += alt_len; + + } else { + // Extend the ungapped blocks, store the gap length + chain->block_lengths = (int*) realloc(chain->block_lengths, (num + 1) * sizeof(int)); + chain->ref_gaps = (int*) realloc(chain->ref_gaps, (num + 1) * sizeof(int)); + chain->alt_gaps = (int*) realloc(chain->alt_gaps, (num + 1) * sizeof(int)); + chain->block_lengths[num] = ref_start - chain->ref_last_block_ori; + chain->ref_gaps[num] = ref_len; + chain->alt_gaps[num] = alt_len; + // Update the start positions of the next block + chain->ref_last_block_ori = ref_start + ref_len; + chain->alt_last_block_ori = alt_start + alt_len; + // Increment the number of ungapped blocks + chain->num++; + } +} + +static void init_data(args_t *args) +{ + args->files = bcf_sr_init(); + args->files->require_index = 1; + if ( !bcf_sr_add_reader(args->files,args->fname) ) error("Failed to read from %s: %s\n", !strcmp("-",args->fname)?"standard input":args->fname, bcf_sr_strerror(args->files->errnum)); + args->hdr = args->files->readers[0].header; + args->isample = -1; + if ( args->sample ) + { + args->isample = bcf_hdr_id2int(args->hdr,BCF_DT_SAMPLE,args->sample); + if ( args->isample<0 ) error("No such sample: %s\n", args->sample); + } + if ( (args->haplotype || args->allele) && args->isample<0 ) + { + if ( bcf_hdr_nsamples(args->hdr) > 1 ) error("The --sample option is expected with --haplotype\n"); + args->isample = 0; + } + int i; + for (i=0; inmask; i++) + { + mask_t *mask = &args->mask[i]; + mask->idx = regidx_init(mask->fname,NULL,NULL,0,NULL); + if ( !mask->idx ) error("Failed to initialize mask regions\n"); + mask->itr = regitr_init(mask->idx); + } + // In case we want to store the chains + if ( args->chain_fname ) + { + args->fp_chain = fopen(args->chain_fname,"w"); + if ( ! args->fp_chain ) error("Failed to create %s: %s\n", args->chain_fname, strerror(errno)); + args->chain_id = 0; + } + rbuf_init(&args->vcf_rbuf, 100); + args->vcf_buf = (bcf1_t**) calloc(args->vcf_rbuf.m, sizeof(bcf1_t*)); + if ( args->output_fname ) { + args->fp_out = fopen(args->output_fname,"w"); + if ( ! args->fp_out ) error("Failed to create %s: %s\n", args->output_fname, strerror(errno)); + } + else args->fp_out = stdout; + if ( args->isample<0 ) fprintf(stderr,"Note: the --sample option not given, applying all records regardless of the genotype\n"); + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + args->rid = -1; +} +static void add_mask(args_t *args, char *fname) +{ + args->nmask++; + args->mask = (mask_t*)realloc(args->mask,args->nmask*sizeof(*args->mask)); + mask_t *mask = &args->mask[args->nmask-1]; + mask->fname = fname; + mask->with = 'N'; +} +static void add_mask_with(args_t *args, char *with) +{ + if ( !args->nmask ) error("The --mask-with option must follow --mask\n"); + mask_t *mask = &args->mask[args->nmask-1]; + if ( !strcasecmp(with,"uc") ) mask->with = MASK_UC; + else if ( !strcasecmp(with,"lc") ) mask->with = MASK_LC; + else if ( strlen(with)!=1 ) error("Expected \"lc\", \"uc\", or a single character with the --mask-with option\n"); + else mask->with = *with; +} +static void destroy_data(args_t *args) +{ + free(args->iupac_bitmask); + if (args->filter) filter_destroy(args->filter); + bcf_sr_destroy(args->files); + int i; + for (i=0; ivcf_rbuf.m; i++) + if ( args->vcf_buf[i] ) bcf_destroy1(args->vcf_buf[i]); + free(args->vcf_buf); + free(args->fa_buf.s); + free(args->chr); + for (i=0; inmask; i++) + { + mask_t *mask = &args->mask[i]; + regidx_destroy(mask->idx); + regitr_destroy(mask->itr); + } + free(args->mask); + if ( args->chain_fname ) + if ( fclose(args->fp_chain) ) error("Close failed: %s\n", args->chain_fname); + if ( fclose(args->fp_out) ) error("Close failed: %s\n", args->output_fname); + destroy_chain(args->chain); +} + +static void init_region(args_t *args, char *line) +{ + char *ss, *se = line; + while ( *se && !isspace(*se) && *se!=':' ) se++; + int from = 0, to = 0; + char tmp = 0, *tmp_ptr = NULL; + if ( *se ) + { + tmp = *se; *se = 0; tmp_ptr = se; + ss = ++se; + from = strtol(ss,&se,10); + if ( ss==se || !*se || *se!='-' ) from = 0; + else + { + from--; + ss = ++se; + to = strtol(ss,&se,10); + if ( ss==se || (*se && !isspace(*se)) ) { from = 0; to = 0; } + else to--; + } + } + free(args->chr); + args->chr = strdup(line); + args->rid = bcf_hdr_name2id(args->hdr,line); + if ( args->rid<0 ) fprintf(stderr,"Warning: Sequence \"%s\" not in %s\n", line,args->fname); + args->prev_base_pos = -1; + args->fa_buf.l = 0; + args->fa_length = 0; + args->fa_end_pos = to; + args->fa_ori_pos = from; + args->fa_src_pos = from; + args->fa_mod_off = 0; + args->fa_frz_pos = -1; + args->fa_frz_mod = -1; + args->fa_case = -1; + args->vcf_rbuf.n = 0; + bcf_sr_seek(args->files,line,args->fa_ori_pos); + if ( tmp_ptr ) *tmp_ptr = tmp; + fprintf(args->fp_out,">%s%s\n",args->chr_prefix?args->chr_prefix:"",line); + if ( args->chain_fname ) + args->chain = init_chain(args->chain, args->fa_ori_pos); +} + +static bcf1_t **next_vcf_line(args_t *args) +{ + if ( args->vcf_rbuf.n ) + { + int i = rbuf_shift(&args->vcf_rbuf); + return &args->vcf_buf[i]; + } + while ( bcf_sr_next_line(args->files) ) + { + if ( args->filter ) + { + int is_ok = filter_test(args->filter, bcf_sr_get_line(args->files,0), NULL); + if ( args->filter_logic & FLT_EXCLUDE ) is_ok = is_ok ? 0 : 1; + if ( !is_ok ) continue; + } + return &args->files->readers[0].buffer[0]; + } + return NULL; +} +static void unread_vcf_line(args_t *args, bcf1_t **rec_ptr) +{ + bcf1_t *rec = *rec_ptr; + if ( args->vcf_rbuf.n >= args->vcf_rbuf.m ) + error("FIXME: too many overlapping records near %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + + // Insert the new record in the buffer. The line would be overwritten in + // the next bcf_sr_next_line call, therefore we need to swap it with an + // unused one + int i = rbuf_append(&args->vcf_rbuf); + if ( !args->vcf_buf[i] ) args->vcf_buf[i] = bcf_init1(); + bcf1_t *tmp = rec; *rec_ptr = args->vcf_buf[i]; args->vcf_buf[i] = tmp; +} +static void flush_fa_buffer(args_t *args, int len) +{ + if ( !args->fa_buf.l ) return; + int nwr = 0; + while ( nwr + 60 <= args->fa_buf.l ) + { + if ( fwrite(args->fa_buf.s+nwr,1,60,args->fp_out) != 60 ) error("Could not write: %s\n", args->output_fname); + if ( fwrite("\n",1,1,args->fp_out) != 1 ) error("Could not write: %s\n", args->output_fname); + nwr += 60; + } + if ( nwr ) + args->fa_ori_pos += nwr; + + args->fa_frz_mod -= nwr; + + if ( len ) + { + // not finished on this chr yet and the buffer cannot be emptied completely + if ( nwr && nwr < args->fa_buf.l ) + memmove(args->fa_buf.s,args->fa_buf.s+nwr,args->fa_buf.l-nwr); + args->fa_buf.l -= nwr; + return; + } + + // empty the whole buffer + if ( nwr == args->fa_buf.l ) { args->fa_buf.l = 0; return; } + + if ( fwrite(args->fa_buf.s+nwr,1,args->fa_buf.l - nwr,args->fp_out) != args->fa_buf.l - nwr ) error("Could not write: %s\n", args->output_fname); + if ( fwrite("\n",1,1,args->fp_out) != 1 ) error("Could not write: %s\n", args->output_fname); + + args->fa_ori_pos += args->fa_buf.l - nwr - args->fa_mod_off; + args->fa_mod_off = 0; + args->fa_buf.l = 0; +} +static void apply_absent(args_t *args, hts_pos_t pos) +{ + if ( !args->fa_buf.l || pos <= args->fa_frz_pos + 1 || pos <= args->fa_ori_pos ) return; + + int ie = pos && pos - args->fa_ori_pos + args->fa_mod_off < args->fa_buf.l ? pos - args->fa_ori_pos + args->fa_mod_off : args->fa_buf.l; + int ib = args->fa_frz_mod < 0 ? 0 : args->fa_frz_mod; + int i; + for (i=ib; ifa_buf.s[i] = args->absent_allele; +} +static void freeze_ref(args_t *args, bcf1_t *rec) +{ + if ( args->fa_frz_pos >= rec->pos + rec->rlen - 1 ) return; + args->fa_frz_pos = rec->pos + rec->rlen - 1; + args->fa_frz_mod = rec->pos - args->fa_ori_pos + args->fa_mod_off + rec->rlen; +} +static char *mark_del(char *ref, int rlen, char *alt, int mark) +{ + char *out = malloc(rlen+1); + int i; + if ( alt ) + { + int nalt = strlen(alt); + for (i=0; i + { + int nref = strlen(ref); + for (i=0; iabsent_allele ) apply_absent(args, rec->pos); + if ( rec->n_allele==1 && !args->missing_allele && !args->absent_allele ) { return; } + + int i,j; + if ( args->mask ) + { + char *chr = (char*)bcf_hdr_id2name(args->hdr,args->rid); + int start = rec->pos; + int end = rec->pos + rec->rlen - 1; + for (i=0; inmask; i++) + { + mask_t *mask = &args->mask[i]; + if ( MASK_SKIP(mask) && regidx_overlap(mask->idx, chr,start,end,NULL) ) return; + } + } + + int ialt = 1; // the alternate allele + if ( args->isample >= 0 ) + { + bcf_unpack(rec, BCF_UN_FMT); + bcf_fmt_t *fmt = bcf_get_fmt(args->hdr, rec, "GT"); + if ( !fmt ) return; + + if ( fmt->type!=BCF_BT_INT8 ) + error("Todo: GT field represented with BCF_BT_INT8, too many alleles at %s:%"PRId64"?\n",bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + uint8_t *ptr = fmt->p + fmt->size*args->isample; + + enum { use_hap, use_iupac, pick_one } action = use_hap; + if ( args->allele==PICK_IUPAC ) + { + if ( !args->haplotype ) action = use_iupac; + if ( !bcf_gt_is_phased(ptr[0]) && !bcf_gt_is_phased(ptr[fmt->n-1]) ) action = use_iupac; + } + else if ( args->output_iupac ) action = use_iupac; + else if ( !args->haplotype ) action = pick_one; + + if ( action==use_hap ) + { + if ( args->haplotype > fmt->n ) + { + if ( bcf_gt_is_missing(ptr[fmt->n-1]) || bcf_gt_is_missing(ptr[0]) ) + { + if ( !args->missing_allele ) return; + ialt = -1; + } + else + { + if ( !warned_haplotype ) + { + fprintf(stderr, "Can't apply %d-th haplotype at %s:%"PRId64". (This warning is printed only once.)\n", args->haplotype,bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + warned_haplotype = 1; + } + return; + } + } + else + { + ialt = (int8_t)ptr[args->haplotype-1]; + if ( bcf_gt_is_missing(ialt) || ialt==bcf_int8_vector_end ) + { + if ( !args->missing_allele ) return; + ialt = -1; + } + else + ialt = bcf_gt_allele(ialt); + } + } + else if ( action==use_iupac ) + { + ialt = -1; + int is_missing = 0, alen = 0, mlen = 0, fallback_alt = -1; + for (i=0; in; i++) + { + if ( bcf_gt_is_missing(ptr[i]) ) { is_missing = 1; continue; } + if ( ptr[i]==(uint8_t)bcf_int8_vector_end ) break; + int jalt = bcf_gt_allele(ptr[i]); + if ( jalt >= rec->n_allele ) error("Invalid VCF, too few ALT alleles at %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + if ( fallback_alt <= 0 ) fallback_alt = jalt; + + int l = strlen(rec->d.allele[jalt]); + for (j=0; jd.allele[jalt][j]) < 0 ) break; + if ( j mlen ) + { + hts_expand(uint8_t,l,args->miupac_bitmask,args->iupac_bitmask); + for (j=mlen; jiupac_bitmask[j] = 0; + mlen = l; + } + if ( jalt>0 && l>alen ) + { + alen = l; + ialt = jalt; + } + for (j=0; jiupac_bitmask[j] |= iupac2bitmask(rec->d.allele[jalt][j]); + } + if ( alen > 0 ) + for (j=0; jd.allele[ialt][j] = bitmask2iupac(args->iupac_bitmask[j]); + else if ( fallback_alt >= 0 ) + ialt = fallback_alt; + else if ( is_missing && !args->missing_allele ) return; + } + else + { + int is_hom = 1; + for (i=0; in; i++) + { + if ( bcf_gt_is_missing(ptr[i]) ) + { + if ( !args->missing_allele ) return; // ignore missing or half-missing genotypes + ialt = -1; + break; + } + if ( ptr[i]==(uint8_t)bcf_int8_vector_end ) break; + ialt = bcf_gt_allele(ptr[i]); + if ( i>0 && ialt!=bcf_gt_allele(ptr[i-1]) ) { is_hom = 0; break; } + } + if ( !is_hom ) + { + int prev_len = 0, jalt; + for (i=0; in; i++) + { + if ( ptr[i]==(uint8_t)bcf_int8_vector_end ) break; + jalt = bcf_gt_allele(ptr[i]); + if ( rec->n_allele <= jalt ) error("Broken VCF, too few alts at %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + if ( args->allele & (PICK_LONG|PICK_SHORT) ) + { + int len = jalt==0 ? rec->rlen : strlen(rec->d.allele[jalt]); + if ( i==0 ) ialt = jalt, prev_len = len; + else if ( len == prev_len ) + { + if ( args->allele & PICK_REF && jalt==0 ) ialt = jalt, prev_len = len; + else if ( args->allele & PICK_ALT && ialt==0 ) ialt = jalt, prev_len = len; + } + else if ( args->allele & PICK_LONG && len > prev_len ) ialt = jalt, prev_len = len; + else if ( args->allele & PICK_SHORT && len < prev_len ) ialt = jalt, prev_len = len; + } + else + { + if ( args->allele & PICK_REF && jalt==0 ) ialt = jalt; + else if ( args->allele & PICK_ALT && ialt==0 ) ialt = jalt; + } + } + } + } + if ( !ialt ) + { + // ref allele + if ( args->absent_allele ) freeze_ref(args,rec); + return; + } + if ( rec->n_allele <= ialt ) error("Broken VCF, too few alts at %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + } + else if ( args->output_iupac && rec->n_allele>1 ) + { + int ialt, alen = 0, mlen = 0; + for (i=0; in_allele; i++) + { + int l = strlen(rec->d.allele[i]); + for (j=0; jd.allele[i][j]) < 0 ) break; + if ( j mlen ) + { + hts_expand(uint8_t,l,args->miupac_bitmask,args->iupac_bitmask); + for (j=mlen; jiupac_bitmask[j] = 0; + mlen = l; + } + if ( i>0 && l>alen ) + { + alen = l; + ialt = i; + } + for (j=0; jiupac_bitmask[j] |= iupac2bitmask(rec->d.allele[i][j]); + } + if ( alen > 0 ) + for (j=0; jd.allele[ialt][j] = bitmask2iupac(args->iupac_bitmask[j]); + else + ialt = 1; + } + + if ( rec->n_allele==1 && ialt!=-1 ) + { + // non-missing reference + if ( args->absent_allele ) freeze_ref(args,rec); + return; + } + if ( ialt==-1 ) + { + char alleles[4]; + alleles[0] = rec->d.allele[0][0]; + alleles[1] = ','; + alleles[2] = args->missing_allele; + alleles[3] = 0; + bcf_update_alleles_str(args->hdr, rec, alleles); + ialt = 1; + } + + // For some variant types POS+REF refer to the base *before* the event; in such case set trim_beg + int trim_beg = 0; + int var_type = bcf_get_variant_type(rec,ialt); + int var_len = rec->d.var[ialt].n; + if ( var_type & VCF_INDEL ) + { + // normally indel starts one base after, but not if the first base of the fa reference is deleted + if ( rec->d.allele[0][0] == rec->d.allele[ialt][0] ) + trim_beg = 1; + else + trim_beg = 0; + } + else if ( (var_type & VCF_OTHER) && !strcasecmp(rec->d.allele[ialt],"") ) + { + trim_beg = 1; + var_len = 1 - rec->rlen; + } + else if ( (var_type & VCF_OTHER) && !strncasecmp(rec->d.allele[ialt],"pos <= args->fa_frz_pos ) + { + // Can be still OK iff this is an insertion (and which does not follow another insertion, see #888). + // This still may not be enough for more complicated cases with multiple duplicate positions + // and other types in between. In such case let the user normalize the VCF and remove duplicates. + + int overlap = 0; + if ( rec->pos < args->fa_frz_pos || !trim_beg || var_len==0 || args->prev_is_insert ) overlap = 1; + + if ( overlap ) + { + fprintf(stderr,"The site %s:%"PRId64" overlaps with another variant, skipping...\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + return; + } + + } + + char *alt_allele = rec->d.allele[ialt]; + int rmme_alt = 0; + + int len_diff = 0, alen = 0; + int idx = rec->pos - args->fa_ori_pos + args->fa_mod_off; + if ( idx<0 ) + { + fprintf(stderr,"Warning: ignoring overlapping variant starting at %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + return; + } + if ( rec->rlen > args->fa_buf.l - idx ) + { + rec->rlen = args->fa_buf.l - idx; + if ( alt_allele[0]!='<' ) + { + alen = strlen(alt_allele); + if ( alen > rec->rlen ) + { + fprintf(stderr,"Warning: trimming variant \"%s\" starting at %s:%"PRId64"\n", alt_allele,bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + alt_allele[rec->rlen] = 0; + } + } + } + if ( idx>=args->fa_buf.l ) + error("FIXME: %s:%"PRId64" .. idx=%d, ori_pos=%d, len=%"PRIu64", off=%d\n",bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1,idx,args->fa_ori_pos,(uint64_t)args->fa_buf.l,args->fa_mod_off); + + // sanity check the reference base + if ( alt_allele[0]=='<' ) + { + // TODO: symbolic deletions probably need more work above with PICK_SHORT|PICK_LONG + + if ( strcasecmp(alt_allele,"") && strcasecmp(alt_allele,"<*>") && strcasecmp(alt_allele,"") ) + error("Symbolic alleles other than , <*> or are currently not supported, e.g. \"%s\" at %s:%"PRId64".\n" + "Please use filtering expressions to exclude such sites, for example by running with: -e 'ALT~\"<.*>\"'\n", + alt_allele,bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + if ( !strcasecmp(alt_allele,"") ) + { + static int multibase_ref_del_warned = 0; + if ( rec->d.allele[0][1]!=0 && !multibase_ref_del_warned ) + { + fprintf(stderr, + "Warning: one REF base is expected with , assuming the actual deletion starts at POS+1 at %s:%"PRId64".\n" + " (This warning is printed only once.)\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + multibase_ref_del_warned = 1; + } + if ( args->mark_del ) // insert dashes instead of delete sequence + { + alt_allele = mark_del(rec->d.allele[0], rec->rlen, NULL, args->mark_del); + alen = rec->rlen; + len_diff = 0; + rmme_alt = 1; + } + else + { + len_diff = 1-rec->rlen; + alt_allele = rec->d.allele[0]; // according to VCF spec, the first REF base must precede the event + alen = 1; + } + } + else + { + // <*> or .. gVCF, evidence for the reference allele throughout the whole block + freeze_ref(args,rec); + return; + } + } + else if ( strncasecmp(rec->d.allele[0],args->fa_buf.s+idx,rec->rlen) ) + { + // This is hacky, handle a special case: if SNP or an insert follows a deletion (AAC>A, C>CAA), + // the reference base in fa_buf is lost and the check fails. We do not keep a buffer + // with the original sequence as it should not be necessary, we should encounter max + // one base overlap + + int fail = 1; + if ( args->prev_base_pos==rec->pos && toupper(rec->d.allele[0][0])==toupper(args->prev_base) ) + { + if ( rec->rlen==1 ) fail = 0; + else if ( !strncasecmp(rec->d.allele[0]+1,args->fa_buf.s+idx+1,rec->rlen-1) ) fail = 0; + } + + if ( fail ) + { + char tmp = 0; + if ( args->fa_buf.l - idx > rec->rlen ) + { + tmp = args->fa_buf.s[idx+rec->rlen]; + args->fa_buf.s[idx+rec->rlen] = 0; + } + error( + "The fasta sequence does not match the REF allele at %s:%"PRId64":\n" + " REF .vcf: [%s]\n" + " ALT .vcf: [%s]\n" + " REF .fa : [%s]%c%s\n", + bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1, rec->d.allele[0], alt_allele, args->fa_buf.s+idx, + tmp?tmp:' ',tmp?args->fa_buf.s+idx+rec->rlen+1:"" + ); + } + alen = strlen(alt_allele); + len_diff = alen - rec->rlen; + + if ( args->mark_del && len_diff<0 ) + { + alt_allele = mark_del(rec->d.allele[0], rec->rlen, alt_allele, args->mark_del); + alen = rec->rlen; + len_diff = 0; + rmme_alt = 1; + } + } + else + { + alen = strlen(alt_allele); + len_diff = alen - rec->rlen; + + if ( args->mark_del && len_diff<0 ) + { + alt_allele = mark_del(rec->d.allele[0], rec->rlen, alt_allele, args->mark_del); + alen = rec->rlen; + len_diff = 0; + rmme_alt = 1; + } + } + + args->fa_case = toupper(args->fa_buf.s[idx])==args->fa_buf.s[idx] ? TO_UPPER : TO_LOWER; + if ( args->fa_case==TO_UPPER ) + for (i=0; imark_ins && len_diff>0 ) + mark_ins(rec->d.allele[0], alt_allele, args->mark_ins); + if ( args->mark_snv ) + mark_snv(rec->d.allele[0], alt_allele, args->mark_snv); + + if ( len_diff <= 0 ) + { + // deletion or same size event + assert( args->fa_buf.l >= idx+rec->rlen ); + args->prev_base = args->fa_buf.s[idx+rec->rlen-1]; + args->prev_base_pos = rec->pos + rec->rlen - 1; + args->prev_is_insert = 0; + args->fa_frz_mod = idx + alen; + + for (i=trim_beg; ifa_buf.s[idx+i] = alt_allele[i]; + + if ( len_diff ) + memmove(args->fa_buf.s+idx+alen,args->fa_buf.s+idx+rec->rlen,args->fa_buf.l-idx-rec->rlen); + } + else + { + args->prev_is_insert = 1; + args->prev_base_pos = rec->pos; + + // insertion + ks_resize(&args->fa_buf, args->fa_buf.l + len_diff); + memmove(args->fa_buf.s + idx + rec->rlen + len_diff, args->fa_buf.s + idx + rec->rlen, args->fa_buf.l - idx - rec->rlen); + + // This can get tricky, make sure the bases unchanged by the insertion do not overwrite preceeding variants. + // For example, here we want to get TAA: + // POS REF ALT + // 1 C T + // 1 C CAA + int ibeg = 0; + while ( ibegd.allele[0][ibeg]==alt_allele[ibeg] && rec->pos + ibeg <= args->prev_base_pos ) ibeg++; + for (i=ibeg; ifa_buf.s[idx+i] = alt_allele[i]; + + args->fa_frz_mod = idx + alen - ibeg + 1; + } + if (args->chain && len_diff != 0) + { + // If first nucleotide of both REF and ALT are the same... (indels typically include the nucleotide before the variant) + if ( strncasecmp(rec->d.allele[0],alt_allele,1) == 0) + { + // ...extend the block by 1 bp: start is 1 bp further and alleles are 1 bp shorter + push_chain_gap(args->chain, rec->pos + 1, rec->rlen - 1, rec->pos + 1 + args->fa_mod_off, alen - 1); + } + else + { + // otherwise, just the coordinates of the variant as given + push_chain_gap(args->chain, rec->pos, rec->rlen, rec->pos + args->fa_mod_off, alen); + } + } + args->fa_buf.l += len_diff; + args->fa_mod_off += len_diff; + args->fa_frz_pos = rec->pos + rec->rlen - 1; + args->napplied++; + if ( rmme_alt ) free(alt_allele); +} + + +static void mask_region(args_t *args, char *seq, int len) +{ + int start = args->fa_src_pos - len; + int end = args->fa_src_pos; + int i; + + for (i=0; inmask; i++) + { + mask_t *mask = &args->mask[i]; + if ( !regidx_overlap(mask->idx, args->chr,start,end, mask->itr) ) continue; + + int idx_start, idx_end, j; + while ( regitr_overlap(mask->itr) ) + { + idx_start = mask->itr->beg - start; + idx_end = mask->itr->end - start; + if ( idx_start < 0 ) idx_start = 0; + if ( idx_end >= len ) idx_end = len - 1; + if ( mask->with==MASK_UC ) + for (j=idx_start; j<=idx_end; j++) seq[j] = toupper(seq[j]); + else if ( mask->with==MASK_LC ) + for (j=idx_start; j<=idx_end; j++) seq[j] = tolower(seq[j]); + else + for (j=idx_start; j<=idx_end; j++) seq[j] = mask->with; + } + } +} + +static void consensus(args_t *args) +{ + BGZF *fasta = bgzf_open(args->ref_fname, "r"); + if ( !fasta ) error("Error reading %s\n", args->ref_fname); + kstring_t str = {0,0,0}; + while ( bgzf_getline(fasta, '\n', &str) > 0 ) + { + if ( str.s[0]=='>' ) + { + // new sequence encountered + if ( args->chain ) print_chain(args); + + // apply all cached variants and variants that might have been missed because of short fasta (see test/consensus.9.*) + bcf1_t **rec_ptr = NULL; + while ( args->rid>=0 && (rec_ptr = next_vcf_line(args)) ) + { + bcf1_t *rec = *rec_ptr; + if ( rec->rid!=args->rid || ( args->fa_end_pos && rec->pos > args->fa_end_pos ) ) break; + apply_variant(args, rec); + } + if ( args->absent_allele ) + { + int pos = 0; + if ( args->vcf_rbuf.n && args->vcf_buf[args->vcf_rbuf.f]->rid==args->rid ) + pos = args->vcf_buf[args->vcf_rbuf.f]->pos; + apply_absent(args, pos); + } + flush_fa_buffer(args, 0); + init_region(args, str.s+1); + continue; + } + args->fa_length += str.l; + args->fa_src_pos += str.l; + + // determine if uppercase or lowercase is used in this fasta file + if ( args->fa_case==-1 ) args->fa_case = toupper(str.s[0])==str.s[0] ? 1 : 0; + + if ( args->mask ) mask_region(args, str.s, str.l); + kputs(str.s, &args->fa_buf); + + bcf1_t **rec_ptr = NULL; + while ( args->rid>=0 && (rec_ptr = next_vcf_line(args)) ) + { + bcf1_t *rec = *rec_ptr; + + // still the same chr and the same region? if not, fasta buf can be flushed + if ( rec->rid!=args->rid || ( args->fa_end_pos && rec->pos > args->fa_end_pos ) ) + { + // save the vcf record until next time and flush + unread_vcf_line(args, rec_ptr); + rec_ptr = NULL; + break; + } + + // is the vcf record well beyond cached fasta buffer? if yes, the buf can be flushed + if ( args->fa_ori_pos + args->fa_buf.l - args->fa_mod_off <= rec->pos ) + { + unread_vcf_line(args, rec_ptr); + rec_ptr = NULL; + break; + } + + // is the cached fasta buffer full enough? if not, read more fasta, no flushing + if ( args->fa_ori_pos + args->fa_buf.l - args->fa_mod_off < rec->pos + rec->rlen ) + { + unread_vcf_line(args, rec_ptr); + break; + } + apply_variant(args, rec); + } + if ( !rec_ptr ) + { + if ( args->absent_allele ) apply_absent(args, args->fa_ori_pos - args->fa_mod_off + args->fa_buf.l); + flush_fa_buffer(args, 60); + } + } + bcf1_t **rec_ptr = NULL; + while ( args->rid>=0 && (rec_ptr = next_vcf_line(args)) ) + { + bcf1_t *rec = *rec_ptr; + if ( rec->rid!=args->rid ) break; + if ( args->fa_end_pos && rec->pos > args->fa_end_pos ) break; + if ( args->fa_ori_pos + args->fa_buf.l - args->fa_mod_off <= rec->pos ) break; + apply_variant(args, rec); + } + if (args->chain) print_chain(args); + if ( args->absent_allele ) apply_absent(args, HTS_POS_MAX); + flush_fa_buffer(args, 0); + bgzf_close(fasta); + free(str.s); + fprintf(stderr,"Applied %d variants\n", args->napplied); +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Create consensus sequence by applying VCF variants to a reference fasta\n"); + fprintf(stderr, " file. By default, the program will apply all ALT variants. Using the\n"); + fprintf(stderr, " --sample (and, optionally, --haplotype) option will apply genotype\n"); + fprintf(stderr, " (or haplotype) calls from FORMAT/GT. The program ignores allelic depth\n"); + fprintf(stderr, " information, such as INFO/AD or FORMAT/AD.\n"); + fprintf(stderr, "Usage: bcftools consensus [OPTIONS] \n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -c, --chain FILE write a chain file for liftover\n"); + fprintf(stderr, " -a, --absent CHAR replace positions absent from VCF with CHAR\n"); + fprintf(stderr, " -e, --exclude EXPR exclude sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " -f, --fasta-ref FILE reference sequence in fasta format\n"); + fprintf(stderr, " -H, --haplotype WHICH choose which allele to use from the FORMAT/GT field, note\n"); + fprintf(stderr, " the codes are case-insensitive:\n"); + fprintf(stderr, " 1: first allele from GT, regardless of phasing\n"); + fprintf(stderr, " 2: second allele from GT, regardless of phasing\n"); + fprintf(stderr, " R: REF allele in het genotypes\n"); + fprintf(stderr, " A: ALT allele\n"); + fprintf(stderr, " I: IUPAC code for all genotypes\n"); + fprintf(stderr, " LR,LA: longer allele and REF/ALT if equal length\n"); + fprintf(stderr, " SR,SA: shorter allele and REF/ALT if equal length\n"); + fprintf(stderr, " 1pIu,2pIu: first/second allele for phased and IUPAC code for unphased GTs\n"); + fprintf(stderr, " -i, --include EXPR select sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " -I, --iupac-codes output variants in the form of IUPAC ambiguity codes\n"); + fprintf(stderr, " --mark-del CHAR instead of removing sequence, insert CHAR for deletions\n"); + fprintf(stderr, " --mark-ins uc|lc highlight insertions in uppercase (uc) or lowercase (lc), leaving the rest as is\n"); + fprintf(stderr, " --mark-snv uc|lc highlight substitutions in uppercase (uc) or lowercase (lc), leaving the rest as is\n"); + fprintf(stderr, " -m, --mask FILE replace regions according to the next --mask-with option. The default is --mask-with N\n"); + fprintf(stderr, " --mask-with CHAR|uc|lc replace with CHAR (skips overlapping variants); change to uppercase (uc) or lowercase (lc)\n"); + fprintf(stderr, " -M, --missing CHAR output CHAR instead of skipping a missing genotype \"./.\"\n"); + fprintf(stderr, " -o, --output FILE write output to a file [standard output]\n"); + fprintf(stderr, " -p, --prefix STRING prefix to add to output sequence names\n"); + fprintf(stderr, " -s, --sample NAME apply variants of the given sample\n"); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, " # Get the consensus for one region. The fasta header lines are then expected\n"); + fprintf(stderr, " # in the form \">chr:from-to\".\n"); + fprintf(stderr, " samtools faidx ref.fa 8:11870-11890 | bcftools consensus in.vcf.gz > out.fa\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # See also http://samtools.github.io/bcftools/howtos/consensus-sequence.html\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_consensus(int argc, char *argv[]) +{ + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + + static struct option loptions[] = + { + {"mark-del",required_argument,NULL,1}, + {"mark-ins",required_argument,NULL,2}, + {"mark-snv",required_argument,NULL,3}, + {"mask-with",1,0,4}, + {"exclude",required_argument,NULL,'e'}, + {"include",required_argument,NULL,'i'}, + {"sample",1,0,'s'}, + {"iupac-codes",0,0,'I'}, + {"haplotype",1,0,'H'}, + {"output",1,0,'o'}, + {"fasta-ref",1,0,'f'}, + {"mask",1,0,'m'}, + {"missing",1,0,'M'}, + {"absent",1,0,'a'}, + {"chain",1,0,'c'}, + {"prefix",required_argument,0,'p'}, + {0,0,0,0} + }; + int c; + while ((c = getopt_long(argc, argv, "h?s:1Ii:e:H:f:o:m:c:M:p:a:",loptions,NULL)) >= 0) + { + switch (c) + { + case 1 : args->mark_del = optarg[0]; break; + case 2 : + if ( !strcasecmp(optarg,"uc") ) args->mark_ins = 'u'; + else if ( !strcasecmp(optarg,"lc") ) args->mark_ins = 'l'; + else error("The argument is not recognised: --mark-ins %s\n",optarg); + break; + case 3 : + if ( !strcasecmp(optarg,"uc") ) args->mark_snv = 'u'; + else if ( !strcasecmp(optarg,"lc") ) args->mark_snv = 'l'; + else error("The argument is not recognised: --mark-snv %s\n",optarg); + break; + case 'p': args->chr_prefix = optarg; break; + case 's': args->sample = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'I': args->output_iupac = 1; break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'f': args->ref_fname = optarg; break; + case 'm': add_mask(args,optarg); break; + case 4 : add_mask_with(args,optarg); break; + case 'a': + args->absent_allele = optarg[0]; + if ( optarg[1]!=0 ) error("Expected single character with -a, got \"%s\"\n", optarg); + break; + case 'M': + args->missing_allele = optarg[0]; + if ( optarg[1]!=0 ) error("Expected single character with -M, got \"%s\"\n", optarg); + break; + case 'c': args->chain_fname = optarg; break; + case 'H': + if ( !strcasecmp(optarg,"R") ) args->allele |= PICK_REF; + else if ( !strcasecmp(optarg,"A") ) args->allele |= PICK_ALT; + else if ( !strcasecmp(optarg,"L") ) args->allele |= PICK_LONG|PICK_REF; + else if ( !strcasecmp(optarg,"S") ) args->allele |= PICK_SHORT|PICK_REF; + else if ( !strcasecmp(optarg,"LR") ) args->allele |= PICK_LONG|PICK_REF; + else if ( !strcasecmp(optarg,"LA") ) args->allele |= PICK_LONG|PICK_ALT; + else if ( !strcasecmp(optarg,"SR") ) args->allele |= PICK_SHORT|PICK_REF; + else if ( !strcasecmp(optarg,"SA") ) args->allele |= PICK_SHORT|PICK_ALT; + else if ( !strcasecmp(optarg,"I") ) args->allele |= PICK_IUPAC; + else if ( !strcasecmp(optarg,"1pIu") ) args->allele |= PICK_IUPAC, args->haplotype = 1; + else if ( !strcasecmp(optarg,"2pIu") ) args->allele |= PICK_IUPAC, args->haplotype = 2; + else + { + char *tmp; + args->haplotype = strtol(optarg, &tmp, 10); + if ( tmp==optarg || *tmp ) error("Error: Could not parse --haplotype %s, expected numeric argument\n", optarg); + if ( args->haplotype <=0 ) error("Error: Expected positive integer with --haplotype\n"); + } + break; + default: usage(args); break; + } + } + if ( optind>=argc ) usage(args); + args->fname = argv[optind]; + + if ( !args->ref_fname && !isatty(fileno((FILE *)stdin)) ) args->ref_fname = "-"; + if ( !args->ref_fname ) usage(args); + + init_data(args); + consensus(args); + destroy_data(args); + free(args); + + return 0; +} + + diff --git a/bcftools/consensus.c.pysam.c b/bcftools/consensus.c.pysam.c new file mode 100644 index 0000000..4af9c18 --- /dev/null +++ b/bcftools/consensus.c.pysam.c @@ -0,0 +1,1175 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2014-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "regidx.h" +#include "bcftools.h" +#include "rbuf.h" +#include "filter.h" + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +#define PICK_REF 1 +#define PICK_ALT 2 +#define PICK_LONG 4 +#define PICK_SHORT 8 +#define PICK_IUPAC 16 + +#define TO_UPPER 0 +#define TO_LOWER 1 + +typedef struct +{ + int num; // number of ungapped blocks in this chain + int *block_lengths; // length of the ungapped blocks in this chain + int *ref_gaps; // length of the gaps on the reference sequence between blocks + int *alt_gaps; // length of the gaps on the alternative sequence between blocks + int ori_pos; + int ref_last_block_ori; // start position on the reference sequence of the following ungapped block (0-based) + int alt_last_block_ori; // start position on the alternative sequence of the following ungapped block (0-based) +} +chain_t; + +#define MASK_LC 1 +#define MASK_UC 2 +#define MASK_SKIP(x) (((x)->with!=MASK_LC && (x)->with!=MASK_UC) ? 1 : 0) +typedef struct +{ + char *fname, with; + regidx_t *idx; + regitr_t *itr; +} +mask_t; + +typedef struct +{ + kstring_t fa_buf; // buffered reference sequence + int fa_ori_pos; // start position of the fa_buffer (wrt original sequence) + int fa_frz_pos; // protected position to avoid conflicting variants (last pos for SNPs/ins) + int fa_mod_off; // position difference of fa_frz_pos in the ori and modified sequence (ins positive) + int fa_frz_mod; // the fa_buf offset of the protected fa_frz_pos position, includes the modified sequence + int fa_end_pos; // region's end position in the original sequence + int fa_length; // region's length in the original sequence (in case end_pos not provided in the FASTA header) + int fa_case; // output upper case or lower case: TO_UPPER|TO_LOWER + int fa_src_pos; // last genomic coordinate read from the input fasta (0-based) + char prev_base; // this is only to validate the REF allele in the VCF - the modified fa_buf cannot be used for inserts following deletions, see 600#issuecomment-383186778 + int prev_base_pos; // the position of prev_base + int prev_is_insert; + + rbuf_t vcf_rbuf; + bcf1_t **vcf_buf; + int nvcf_buf, rid; + char *chr, *chr_prefix; + + mask_t *mask; + int nmask; + + int chain_id; // chain_id, to provide a unique ID to each chain in the chain output + chain_t *chain; // chain structure to store the sequence of ungapped blocks between the ref and alt sequences + // Note that the chain is re-initialised for each chromosome/seq_region + + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + + bcf_srs_t *files; + bcf_hdr_t *hdr; + FILE *fp_out; + FILE *fp_chain; + char **argv; + int argc, output_iupac, haplotype, allele, isample, napplied; + uint8_t *iupac_bitmask; + int miupac_bitmask; + char *fname, *ref_fname, *sample, *output_fname, *mask_fname, *chain_fname, missing_allele, absent_allele; + char mark_del, mark_ins, mark_snv; +} +args_t; + +static void destroy_chain(chain_t *chain) +{ + if ( !chain ) return; + free(chain->ref_gaps); + free(chain->alt_gaps); + free(chain->block_lengths); + free(chain); +} +static chain_t* init_chain(chain_t *chain, int ref_ori_pos) +{ + if ( chain ) destroy_chain(chain); + chain = (chain_t*) calloc(1,sizeof(chain_t)); + chain->num = 0; + chain->block_lengths = NULL; + chain->ref_gaps = NULL; + chain->alt_gaps = NULL; + chain->ori_pos = ref_ori_pos; + chain->ref_last_block_ori = ref_ori_pos; + chain->alt_last_block_ori = ref_ori_pos; + return chain; +} + +static void print_chain(args_t *args) +{ + /* + Example chain format (see: https://genome.ucsc.edu/goldenPath/help/chain.html): + chain 1 500 + 480 500 1 501 + 480 501 1 + 12 3 1 + 1 0 3 + 484 + + chain line is: + - chain + - score (sum of the length of ungapped block in this case) + - ref_seqname (from the fasta header, parsed by htslib) + - ref_seqlength (from the fasta header) + - ref_strand (+ or -; always + for bcf-consensus) + - ref_start (as defined in the fasta header) + - ref_end (as defined in the fasta header) + - alt_seqname (same as ref_seqname as bcf-consensus only considers SNPs and indels) + - alt_seqlength (adjusted to match the length of the alt sequence) + - alt_strand (+ or -; always + for bcf-consensus) + - alt_start (same as ref_start, as no edits are recorded/applied before that position) + - alt_end (adjusted to match the length of the alt sequence) + - chain_num (just an auto-increment id) + + the other (sorted) lines are: + - length of the ungapped alignment block + - gap on the ref sequence between this and the next block (all but the last line) + - gap on the alt sequence between this and the next block (all but the last line) + */ + chain_t *chain = args->chain; + int n = chain->num; + int ref_end_pos = args->fa_length + chain->ori_pos; + int last_block_size = ref_end_pos - chain->ref_last_block_ori; + int alt_end_pos = chain->alt_last_block_ori + last_block_size; + int score = 0; + for (n=0; nnum; n++) { + score += chain->block_lengths[n]; + } + score += last_block_size; + fprintf(args->fp_chain, "chain %d %s %d + %d %d %s %d + %d %d %d\n", score, args->chr, ref_end_pos, chain->ori_pos, ref_end_pos, args->chr, alt_end_pos, chain->ori_pos, alt_end_pos, ++args->chain_id); + for (n=0; nnum; n++) { + fprintf(args->fp_chain, "%d %d %d\n", chain->block_lengths[n], chain->ref_gaps[n], chain->alt_gaps[n]); + } + fprintf(args->fp_chain, "%d\n\n", last_block_size); +} + +static void push_chain_gap(chain_t *chain, int ref_start, int ref_len, int alt_start, int alt_len) +{ + // fprintf(bcftools_stderr, "push_chain_gap(chain=%p, ref_start=%d, ref_len=%d, alt_start=%d, alt_len=%d)\n", chain, ref_start, ref_len, alt_start, alt_len); + int num = chain->num; + + if (num && ref_start <= chain->ref_last_block_ori) { + // In case this variant is back-to-back with the previous one + chain->ref_last_block_ori = ref_start + ref_len; + chain->alt_last_block_ori = alt_start + alt_len; + chain->ref_gaps[num-1] += ref_len; + chain->alt_gaps[num-1] += alt_len; + + } else { + // Extend the ungapped blocks, store the gap length + chain->block_lengths = (int*) realloc(chain->block_lengths, (num + 1) * sizeof(int)); + chain->ref_gaps = (int*) realloc(chain->ref_gaps, (num + 1) * sizeof(int)); + chain->alt_gaps = (int*) realloc(chain->alt_gaps, (num + 1) * sizeof(int)); + chain->block_lengths[num] = ref_start - chain->ref_last_block_ori; + chain->ref_gaps[num] = ref_len; + chain->alt_gaps[num] = alt_len; + // Update the start positions of the next block + chain->ref_last_block_ori = ref_start + ref_len; + chain->alt_last_block_ori = alt_start + alt_len; + // Increment the number of ungapped blocks + chain->num++; + } +} + +static void init_data(args_t *args) +{ + args->files = bcf_sr_init(); + args->files->require_index = 1; + if ( !bcf_sr_add_reader(args->files,args->fname) ) error("Failed to read from %s: %s\n", !strcmp("-",args->fname)?"standard input":args->fname, bcf_sr_strerror(args->files->errnum)); + args->hdr = args->files->readers[0].header; + args->isample = -1; + if ( args->sample ) + { + args->isample = bcf_hdr_id2int(args->hdr,BCF_DT_SAMPLE,args->sample); + if ( args->isample<0 ) error("No such sample: %s\n", args->sample); + } + if ( (args->haplotype || args->allele) && args->isample<0 ) + { + if ( bcf_hdr_nsamples(args->hdr) > 1 ) error("The --sample option is expected with --haplotype\n"); + args->isample = 0; + } + int i; + for (i=0; inmask; i++) + { + mask_t *mask = &args->mask[i]; + mask->idx = regidx_init(mask->fname,NULL,NULL,0,NULL); + if ( !mask->idx ) error("Failed to initialize mask regions\n"); + mask->itr = regitr_init(mask->idx); + } + // In case we want to store the chains + if ( args->chain_fname ) + { + args->fp_chain = fopen(args->chain_fname,"w"); + if ( ! args->fp_chain ) error("Failed to create %s: %s\n", args->chain_fname, strerror(errno)); + args->chain_id = 0; + } + rbuf_init(&args->vcf_rbuf, 100); + args->vcf_buf = (bcf1_t**) calloc(args->vcf_rbuf.m, sizeof(bcf1_t*)); + if ( args->output_fname ) { + args->fp_out = fopen(args->output_fname,"w"); + if ( ! args->fp_out ) error("Failed to create %s: %s\n", args->output_fname, strerror(errno)); + } + else args->fp_out = bcftools_stdout; + if ( args->isample<0 ) fprintf(bcftools_stderr,"Note: the --sample option not given, applying all records regardless of the genotype\n"); + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + args->rid = -1; +} +static void add_mask(args_t *args, char *fname) +{ + args->nmask++; + args->mask = (mask_t*)realloc(args->mask,args->nmask*sizeof(*args->mask)); + mask_t *mask = &args->mask[args->nmask-1]; + mask->fname = fname; + mask->with = 'N'; +} +static void add_mask_with(args_t *args, char *with) +{ + if ( !args->nmask ) error("The --mask-with option must follow --mask\n"); + mask_t *mask = &args->mask[args->nmask-1]; + if ( !strcasecmp(with,"uc") ) mask->with = MASK_UC; + else if ( !strcasecmp(with,"lc") ) mask->with = MASK_LC; + else if ( strlen(with)!=1 ) error("Expected \"lc\", \"uc\", or a single character with the --mask-with option\n"); + else mask->with = *with; +} +static void destroy_data(args_t *args) +{ + free(args->iupac_bitmask); + if (args->filter) filter_destroy(args->filter); + bcf_sr_destroy(args->files); + int i; + for (i=0; ivcf_rbuf.m; i++) + if ( args->vcf_buf[i] ) bcf_destroy1(args->vcf_buf[i]); + free(args->vcf_buf); + free(args->fa_buf.s); + free(args->chr); + for (i=0; inmask; i++) + { + mask_t *mask = &args->mask[i]; + regidx_destroy(mask->idx); + regitr_destroy(mask->itr); + } + free(args->mask); + if ( args->chain_fname ) + if ( fclose(args->fp_chain) ) error("Close failed: %s\n", args->chain_fname); + if ( fclose(args->fp_out) ) error("Close failed: %s\n", args->output_fname); + destroy_chain(args->chain); +} + +static void init_region(args_t *args, char *line) +{ + char *ss, *se = line; + while ( *se && !isspace(*se) && *se!=':' ) se++; + int from = 0, to = 0; + char tmp = 0, *tmp_ptr = NULL; + if ( *se ) + { + tmp = *se; *se = 0; tmp_ptr = se; + ss = ++se; + from = strtol(ss,&se,10); + if ( ss==se || !*se || *se!='-' ) from = 0; + else + { + from--; + ss = ++se; + to = strtol(ss,&se,10); + if ( ss==se || (*se && !isspace(*se)) ) { from = 0; to = 0; } + else to--; + } + } + free(args->chr); + args->chr = strdup(line); + args->rid = bcf_hdr_name2id(args->hdr,line); + if ( args->rid<0 ) fprintf(bcftools_stderr,"Warning: Sequence \"%s\" not in %s\n", line,args->fname); + args->prev_base_pos = -1; + args->fa_buf.l = 0; + args->fa_length = 0; + args->fa_end_pos = to; + args->fa_ori_pos = from; + args->fa_src_pos = from; + args->fa_mod_off = 0; + args->fa_frz_pos = -1; + args->fa_frz_mod = -1; + args->fa_case = -1; + args->vcf_rbuf.n = 0; + bcf_sr_seek(args->files,line,args->fa_ori_pos); + if ( tmp_ptr ) *tmp_ptr = tmp; + fprintf(args->fp_out,">%s%s\n",args->chr_prefix?args->chr_prefix:"",line); + if ( args->chain_fname ) + args->chain = init_chain(args->chain, args->fa_ori_pos); +} + +static bcf1_t **next_vcf_line(args_t *args) +{ + if ( args->vcf_rbuf.n ) + { + int i = rbuf_shift(&args->vcf_rbuf); + return &args->vcf_buf[i]; + } + while ( bcf_sr_next_line(args->files) ) + { + if ( args->filter ) + { + int is_ok = filter_test(args->filter, bcf_sr_get_line(args->files,0), NULL); + if ( args->filter_logic & FLT_EXCLUDE ) is_ok = is_ok ? 0 : 1; + if ( !is_ok ) continue; + } + return &args->files->readers[0].buffer[0]; + } + return NULL; +} +static void unread_vcf_line(args_t *args, bcf1_t **rec_ptr) +{ + bcf1_t *rec = *rec_ptr; + if ( args->vcf_rbuf.n >= args->vcf_rbuf.m ) + error("FIXME: too many overlapping records near %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + + // Insert the new record in the buffer. The line would be overwritten in + // the next bcf_sr_next_line call, therefore we need to swap it with an + // unused one + int i = rbuf_append(&args->vcf_rbuf); + if ( !args->vcf_buf[i] ) args->vcf_buf[i] = bcf_init1(); + bcf1_t *tmp = rec; *rec_ptr = args->vcf_buf[i]; args->vcf_buf[i] = tmp; +} +static void flush_fa_buffer(args_t *args, int len) +{ + if ( !args->fa_buf.l ) return; + int nwr = 0; + while ( nwr + 60 <= args->fa_buf.l ) + { + if ( fwrite(args->fa_buf.s+nwr,1,60,args->fp_out) != 60 ) error("Could not write: %s\n", args->output_fname); + if ( fwrite("\n",1,1,args->fp_out) != 1 ) error("Could not write: %s\n", args->output_fname); + nwr += 60; + } + if ( nwr ) + args->fa_ori_pos += nwr; + + args->fa_frz_mod -= nwr; + + if ( len ) + { + // not finished on this chr yet and the buffer cannot be emptied completely + if ( nwr && nwr < args->fa_buf.l ) + memmove(args->fa_buf.s,args->fa_buf.s+nwr,args->fa_buf.l-nwr); + args->fa_buf.l -= nwr; + return; + } + + // empty the whole buffer + if ( nwr == args->fa_buf.l ) { args->fa_buf.l = 0; return; } + + if ( fwrite(args->fa_buf.s+nwr,1,args->fa_buf.l - nwr,args->fp_out) != args->fa_buf.l - nwr ) error("Could not write: %s\n", args->output_fname); + if ( fwrite("\n",1,1,args->fp_out) != 1 ) error("Could not write: %s\n", args->output_fname); + + args->fa_ori_pos += args->fa_buf.l - nwr - args->fa_mod_off; + args->fa_mod_off = 0; + args->fa_buf.l = 0; +} +static void apply_absent(args_t *args, hts_pos_t pos) +{ + if ( !args->fa_buf.l || pos <= args->fa_frz_pos + 1 || pos <= args->fa_ori_pos ) return; + + int ie = pos && pos - args->fa_ori_pos + args->fa_mod_off < args->fa_buf.l ? pos - args->fa_ori_pos + args->fa_mod_off : args->fa_buf.l; + int ib = args->fa_frz_mod < 0 ? 0 : args->fa_frz_mod; + int i; + for (i=ib; ifa_buf.s[i] = args->absent_allele; +} +static void freeze_ref(args_t *args, bcf1_t *rec) +{ + if ( args->fa_frz_pos >= rec->pos + rec->rlen - 1 ) return; + args->fa_frz_pos = rec->pos + rec->rlen - 1; + args->fa_frz_mod = rec->pos - args->fa_ori_pos + args->fa_mod_off + rec->rlen; +} +static char *mark_del(char *ref, int rlen, char *alt, int mark) +{ + char *out = malloc(rlen+1); + int i; + if ( alt ) + { + int nalt = strlen(alt); + for (i=0; i + { + int nref = strlen(ref); + for (i=0; iabsent_allele ) apply_absent(args, rec->pos); + if ( rec->n_allele==1 && !args->missing_allele && !args->absent_allele ) { return; } + + int i,j; + if ( args->mask ) + { + char *chr = (char*)bcf_hdr_id2name(args->hdr,args->rid); + int start = rec->pos; + int end = rec->pos + rec->rlen - 1; + for (i=0; inmask; i++) + { + mask_t *mask = &args->mask[i]; + if ( MASK_SKIP(mask) && regidx_overlap(mask->idx, chr,start,end,NULL) ) return; + } + } + + int ialt = 1; // the alternate allele + if ( args->isample >= 0 ) + { + bcf_unpack(rec, BCF_UN_FMT); + bcf_fmt_t *fmt = bcf_get_fmt(args->hdr, rec, "GT"); + if ( !fmt ) return; + + if ( fmt->type!=BCF_BT_INT8 ) + error("Todo: GT field represented with BCF_BT_INT8, too many alleles at %s:%"PRId64"?\n",bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + uint8_t *ptr = fmt->p + fmt->size*args->isample; + + enum { use_hap, use_iupac, pick_one } action = use_hap; + if ( args->allele==PICK_IUPAC ) + { + if ( !args->haplotype ) action = use_iupac; + if ( !bcf_gt_is_phased(ptr[0]) && !bcf_gt_is_phased(ptr[fmt->n-1]) ) action = use_iupac; + } + else if ( args->output_iupac ) action = use_iupac; + else if ( !args->haplotype ) action = pick_one; + + if ( action==use_hap ) + { + if ( args->haplotype > fmt->n ) + { + if ( bcf_gt_is_missing(ptr[fmt->n-1]) || bcf_gt_is_missing(ptr[0]) ) + { + if ( !args->missing_allele ) return; + ialt = -1; + } + else + { + if ( !warned_haplotype ) + { + fprintf(bcftools_stderr, "Can't apply %d-th haplotype at %s:%"PRId64". (This warning is printed only once.)\n", args->haplotype,bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + warned_haplotype = 1; + } + return; + } + } + else + { + ialt = (int8_t)ptr[args->haplotype-1]; + if ( bcf_gt_is_missing(ialt) || ialt==bcf_int8_vector_end ) + { + if ( !args->missing_allele ) return; + ialt = -1; + } + else + ialt = bcf_gt_allele(ialt); + } + } + else if ( action==use_iupac ) + { + ialt = -1; + int is_missing = 0, alen = 0, mlen = 0, fallback_alt = -1; + for (i=0; in; i++) + { + if ( bcf_gt_is_missing(ptr[i]) ) { is_missing = 1; continue; } + if ( ptr[i]==(uint8_t)bcf_int8_vector_end ) break; + int jalt = bcf_gt_allele(ptr[i]); + if ( jalt >= rec->n_allele ) error("Invalid VCF, too few ALT alleles at %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + if ( fallback_alt <= 0 ) fallback_alt = jalt; + + int l = strlen(rec->d.allele[jalt]); + for (j=0; jd.allele[jalt][j]) < 0 ) break; + if ( j mlen ) + { + hts_expand(uint8_t,l,args->miupac_bitmask,args->iupac_bitmask); + for (j=mlen; jiupac_bitmask[j] = 0; + mlen = l; + } + if ( jalt>0 && l>alen ) + { + alen = l; + ialt = jalt; + } + for (j=0; jiupac_bitmask[j] |= iupac2bitmask(rec->d.allele[jalt][j]); + } + if ( alen > 0 ) + for (j=0; jd.allele[ialt][j] = bitmask2iupac(args->iupac_bitmask[j]); + else if ( fallback_alt >= 0 ) + ialt = fallback_alt; + else if ( is_missing && !args->missing_allele ) return; + } + else + { + int is_hom = 1; + for (i=0; in; i++) + { + if ( bcf_gt_is_missing(ptr[i]) ) + { + if ( !args->missing_allele ) return; // ignore missing or half-missing genotypes + ialt = -1; + break; + } + if ( ptr[i]==(uint8_t)bcf_int8_vector_end ) break; + ialt = bcf_gt_allele(ptr[i]); + if ( i>0 && ialt!=bcf_gt_allele(ptr[i-1]) ) { is_hom = 0; break; } + } + if ( !is_hom ) + { + int prev_len = 0, jalt; + for (i=0; in; i++) + { + if ( ptr[i]==(uint8_t)bcf_int8_vector_end ) break; + jalt = bcf_gt_allele(ptr[i]); + if ( rec->n_allele <= jalt ) error("Broken VCF, too few alts at %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + if ( args->allele & (PICK_LONG|PICK_SHORT) ) + { + int len = jalt==0 ? rec->rlen : strlen(rec->d.allele[jalt]); + if ( i==0 ) ialt = jalt, prev_len = len; + else if ( len == prev_len ) + { + if ( args->allele & PICK_REF && jalt==0 ) ialt = jalt, prev_len = len; + else if ( args->allele & PICK_ALT && ialt==0 ) ialt = jalt, prev_len = len; + } + else if ( args->allele & PICK_LONG && len > prev_len ) ialt = jalt, prev_len = len; + else if ( args->allele & PICK_SHORT && len < prev_len ) ialt = jalt, prev_len = len; + } + else + { + if ( args->allele & PICK_REF && jalt==0 ) ialt = jalt; + else if ( args->allele & PICK_ALT && ialt==0 ) ialt = jalt; + } + } + } + } + if ( !ialt ) + { + // ref allele + if ( args->absent_allele ) freeze_ref(args,rec); + return; + } + if ( rec->n_allele <= ialt ) error("Broken VCF, too few alts at %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + } + else if ( args->output_iupac && rec->n_allele>1 ) + { + int ialt, alen = 0, mlen = 0; + for (i=0; in_allele; i++) + { + int l = strlen(rec->d.allele[i]); + for (j=0; jd.allele[i][j]) < 0 ) break; + if ( j mlen ) + { + hts_expand(uint8_t,l,args->miupac_bitmask,args->iupac_bitmask); + for (j=mlen; jiupac_bitmask[j] = 0; + mlen = l; + } + if ( i>0 && l>alen ) + { + alen = l; + ialt = i; + } + for (j=0; jiupac_bitmask[j] |= iupac2bitmask(rec->d.allele[i][j]); + } + if ( alen > 0 ) + for (j=0; jd.allele[ialt][j] = bitmask2iupac(args->iupac_bitmask[j]); + else + ialt = 1; + } + + if ( rec->n_allele==1 && ialt!=-1 ) + { + // non-missing reference + if ( args->absent_allele ) freeze_ref(args,rec); + return; + } + if ( ialt==-1 ) + { + char alleles[4]; + alleles[0] = rec->d.allele[0][0]; + alleles[1] = ','; + alleles[2] = args->missing_allele; + alleles[3] = 0; + bcf_update_alleles_str(args->hdr, rec, alleles); + ialt = 1; + } + + // For some variant types POS+REF refer to the base *before* the event; in such case set trim_beg + int trim_beg = 0; + int var_type = bcf_get_variant_type(rec,ialt); + int var_len = rec->d.var[ialt].n; + if ( var_type & VCF_INDEL ) + { + // normally indel starts one base after, but not if the first base of the fa reference is deleted + if ( rec->d.allele[0][0] == rec->d.allele[ialt][0] ) + trim_beg = 1; + else + trim_beg = 0; + } + else if ( (var_type & VCF_OTHER) && !strcasecmp(rec->d.allele[ialt],"") ) + { + trim_beg = 1; + var_len = 1 - rec->rlen; + } + else if ( (var_type & VCF_OTHER) && !strncasecmp(rec->d.allele[ialt],"pos <= args->fa_frz_pos ) + { + // Can be still OK iff this is an insertion (and which does not follow another insertion, see #888). + // This still may not be enough for more complicated cases with multiple duplicate positions + // and other types in between. In such case let the user normalize the VCF and remove duplicates. + + int overlap = 0; + if ( rec->pos < args->fa_frz_pos || !trim_beg || var_len==0 || args->prev_is_insert ) overlap = 1; + + if ( overlap ) + { + fprintf(bcftools_stderr,"The site %s:%"PRId64" overlaps with another variant, skipping...\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + return; + } + + } + + char *alt_allele = rec->d.allele[ialt]; + int rmme_alt = 0; + + int len_diff = 0, alen = 0; + int idx = rec->pos - args->fa_ori_pos + args->fa_mod_off; + if ( idx<0 ) + { + fprintf(bcftools_stderr,"Warning: ignoring overlapping variant starting at %s:%"PRId64"\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + return; + } + if ( rec->rlen > args->fa_buf.l - idx ) + { + rec->rlen = args->fa_buf.l - idx; + if ( alt_allele[0]!='<' ) + { + alen = strlen(alt_allele); + if ( alen > rec->rlen ) + { + fprintf(bcftools_stderr,"Warning: trimming variant \"%s\" starting at %s:%"PRId64"\n", alt_allele,bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + alt_allele[rec->rlen] = 0; + } + } + } + if ( idx>=args->fa_buf.l ) + error("FIXME: %s:%"PRId64" .. idx=%d, ori_pos=%d, len=%"PRIu64", off=%d\n",bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1,idx,args->fa_ori_pos,(uint64_t)args->fa_buf.l,args->fa_mod_off); + + // sanity check the reference base + if ( alt_allele[0]=='<' ) + { + // TODO: symbolic deletions probably need more work above with PICK_SHORT|PICK_LONG + + if ( strcasecmp(alt_allele,"") && strcasecmp(alt_allele,"<*>") && strcasecmp(alt_allele,"") ) + error("Symbolic alleles other than , <*> or are currently not supported, e.g. \"%s\" at %s:%"PRId64".\n" + "Please use filtering expressions to exclude such sites, for example by running with: -e 'ALT~\"<.*>\"'\n", + alt_allele,bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + if ( !strcasecmp(alt_allele,"") ) + { + static int multibase_ref_del_warned = 0; + if ( rec->d.allele[0][1]!=0 && !multibase_ref_del_warned ) + { + fprintf(bcftools_stderr, + "Warning: one REF base is expected with , assuming the actual deletion starts at POS+1 at %s:%"PRId64".\n" + " (This warning is printed only once.)\n", bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + multibase_ref_del_warned = 1; + } + if ( args->mark_del ) // insert dashes instead of delete sequence + { + alt_allele = mark_del(rec->d.allele[0], rec->rlen, NULL, args->mark_del); + alen = rec->rlen; + len_diff = 0; + rmme_alt = 1; + } + else + { + len_diff = 1-rec->rlen; + alt_allele = rec->d.allele[0]; // according to VCF spec, the first REF base must precede the event + alen = 1; + } + } + else + { + // <*> or .. gVCF, evidence for the reference allele throughout the whole block + freeze_ref(args,rec); + return; + } + } + else if ( strncasecmp(rec->d.allele[0],args->fa_buf.s+idx,rec->rlen) ) + { + // This is hacky, handle a special case: if SNP or an insert follows a deletion (AAC>A, C>CAA), + // the reference base in fa_buf is lost and the check fails. We do not keep a buffer + // with the original sequence as it should not be necessary, we should encounter max + // one base overlap + + int fail = 1; + if ( args->prev_base_pos==rec->pos && toupper(rec->d.allele[0][0])==toupper(args->prev_base) ) + { + if ( rec->rlen==1 ) fail = 0; + else if ( !strncasecmp(rec->d.allele[0]+1,args->fa_buf.s+idx+1,rec->rlen-1) ) fail = 0; + } + + if ( fail ) + { + char tmp = 0; + if ( args->fa_buf.l - idx > rec->rlen ) + { + tmp = args->fa_buf.s[idx+rec->rlen]; + args->fa_buf.s[idx+rec->rlen] = 0; + } + error( + "The fasta sequence does not match the REF allele at %s:%"PRId64":\n" + " REF .vcf: [%s]\n" + " ALT .vcf: [%s]\n" + " REF .fa : [%s]%c%s\n", + bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1, rec->d.allele[0], alt_allele, args->fa_buf.s+idx, + tmp?tmp:' ',tmp?args->fa_buf.s+idx+rec->rlen+1:"" + ); + } + alen = strlen(alt_allele); + len_diff = alen - rec->rlen; + + if ( args->mark_del && len_diff<0 ) + { + alt_allele = mark_del(rec->d.allele[0], rec->rlen, alt_allele, args->mark_del); + alen = rec->rlen; + len_diff = 0; + rmme_alt = 1; + } + } + else + { + alen = strlen(alt_allele); + len_diff = alen - rec->rlen; + + if ( args->mark_del && len_diff<0 ) + { + alt_allele = mark_del(rec->d.allele[0], rec->rlen, alt_allele, args->mark_del); + alen = rec->rlen; + len_diff = 0; + rmme_alt = 1; + } + } + + args->fa_case = toupper(args->fa_buf.s[idx])==args->fa_buf.s[idx] ? TO_UPPER : TO_LOWER; + if ( args->fa_case==TO_UPPER ) + for (i=0; imark_ins && len_diff>0 ) + mark_ins(rec->d.allele[0], alt_allele, args->mark_ins); + if ( args->mark_snv ) + mark_snv(rec->d.allele[0], alt_allele, args->mark_snv); + + if ( len_diff <= 0 ) + { + // deletion or same size event + assert( args->fa_buf.l >= idx+rec->rlen ); + args->prev_base = args->fa_buf.s[idx+rec->rlen-1]; + args->prev_base_pos = rec->pos + rec->rlen - 1; + args->prev_is_insert = 0; + args->fa_frz_mod = idx + alen; + + for (i=trim_beg; ifa_buf.s[idx+i] = alt_allele[i]; + + if ( len_diff ) + memmove(args->fa_buf.s+idx+alen,args->fa_buf.s+idx+rec->rlen,args->fa_buf.l-idx-rec->rlen); + } + else + { + args->prev_is_insert = 1; + args->prev_base_pos = rec->pos; + + // insertion + ks_resize(&args->fa_buf, args->fa_buf.l + len_diff); + memmove(args->fa_buf.s + idx + rec->rlen + len_diff, args->fa_buf.s + idx + rec->rlen, args->fa_buf.l - idx - rec->rlen); + + // This can get tricky, make sure the bases unchanged by the insertion do not overwrite preceeding variants. + // For example, here we want to get TAA: + // POS REF ALT + // 1 C T + // 1 C CAA + int ibeg = 0; + while ( ibegd.allele[0][ibeg]==alt_allele[ibeg] && rec->pos + ibeg <= args->prev_base_pos ) ibeg++; + for (i=ibeg; ifa_buf.s[idx+i] = alt_allele[i]; + + args->fa_frz_mod = idx + alen - ibeg + 1; + } + if (args->chain && len_diff != 0) + { + // If first nucleotide of both REF and ALT are the same... (indels typically include the nucleotide before the variant) + if ( strncasecmp(rec->d.allele[0],alt_allele,1) == 0) + { + // ...extend the block by 1 bp: start is 1 bp further and alleles are 1 bp shorter + push_chain_gap(args->chain, rec->pos + 1, rec->rlen - 1, rec->pos + 1 + args->fa_mod_off, alen - 1); + } + else + { + // otherwise, just the coordinates of the variant as given + push_chain_gap(args->chain, rec->pos, rec->rlen, rec->pos + args->fa_mod_off, alen); + } + } + args->fa_buf.l += len_diff; + args->fa_mod_off += len_diff; + args->fa_frz_pos = rec->pos + rec->rlen - 1; + args->napplied++; + if ( rmme_alt ) free(alt_allele); +} + + +static void mask_region(args_t *args, char *seq, int len) +{ + int start = args->fa_src_pos - len; + int end = args->fa_src_pos; + int i; + + for (i=0; inmask; i++) + { + mask_t *mask = &args->mask[i]; + if ( !regidx_overlap(mask->idx, args->chr,start,end, mask->itr) ) continue; + + int idx_start, idx_end, j; + while ( regitr_overlap(mask->itr) ) + { + idx_start = mask->itr->beg - start; + idx_end = mask->itr->end - start; + if ( idx_start < 0 ) idx_start = 0; + if ( idx_end >= len ) idx_end = len - 1; + if ( mask->with==MASK_UC ) + for (j=idx_start; j<=idx_end; j++) seq[j] = toupper(seq[j]); + else if ( mask->with==MASK_LC ) + for (j=idx_start; j<=idx_end; j++) seq[j] = tolower(seq[j]); + else + for (j=idx_start; j<=idx_end; j++) seq[j] = mask->with; + } + } +} + +static void consensus(args_t *args) +{ + BGZF *fasta = bgzf_open(args->ref_fname, "r"); + if ( !fasta ) error("Error reading %s\n", args->ref_fname); + kstring_t str = {0,0,0}; + while ( bgzf_getline(fasta, '\n', &str) > 0 ) + { + if ( str.s[0]=='>' ) + { + // new sequence encountered + if ( args->chain ) print_chain(args); + + // apply all cached variants and variants that might have been missed because of short fasta (see test/consensus.9.*) + bcf1_t **rec_ptr = NULL; + while ( args->rid>=0 && (rec_ptr = next_vcf_line(args)) ) + { + bcf1_t *rec = *rec_ptr; + if ( rec->rid!=args->rid || ( args->fa_end_pos && rec->pos > args->fa_end_pos ) ) break; + apply_variant(args, rec); + } + if ( args->absent_allele ) + { + int pos = 0; + if ( args->vcf_rbuf.n && args->vcf_buf[args->vcf_rbuf.f]->rid==args->rid ) + pos = args->vcf_buf[args->vcf_rbuf.f]->pos; + apply_absent(args, pos); + } + flush_fa_buffer(args, 0); + init_region(args, str.s+1); + continue; + } + args->fa_length += str.l; + args->fa_src_pos += str.l; + + // determine if uppercase or lowercase is used in this fasta file + if ( args->fa_case==-1 ) args->fa_case = toupper(str.s[0])==str.s[0] ? 1 : 0; + + if ( args->mask ) mask_region(args, str.s, str.l); + kputs(str.s, &args->fa_buf); + + bcf1_t **rec_ptr = NULL; + while ( args->rid>=0 && (rec_ptr = next_vcf_line(args)) ) + { + bcf1_t *rec = *rec_ptr; + + // still the same chr and the same region? if not, fasta buf can be flushed + if ( rec->rid!=args->rid || ( args->fa_end_pos && rec->pos > args->fa_end_pos ) ) + { + // save the vcf record until next time and flush + unread_vcf_line(args, rec_ptr); + rec_ptr = NULL; + break; + } + + // is the vcf record well beyond cached fasta buffer? if yes, the buf can be flushed + if ( args->fa_ori_pos + args->fa_buf.l - args->fa_mod_off <= rec->pos ) + { + unread_vcf_line(args, rec_ptr); + rec_ptr = NULL; + break; + } + + // is the cached fasta buffer full enough? if not, read more fasta, no flushing + if ( args->fa_ori_pos + args->fa_buf.l - args->fa_mod_off < rec->pos + rec->rlen ) + { + unread_vcf_line(args, rec_ptr); + break; + } + apply_variant(args, rec); + } + if ( !rec_ptr ) + { + if ( args->absent_allele ) apply_absent(args, args->fa_ori_pos - args->fa_mod_off + args->fa_buf.l); + flush_fa_buffer(args, 60); + } + } + bcf1_t **rec_ptr = NULL; + while ( args->rid>=0 && (rec_ptr = next_vcf_line(args)) ) + { + bcf1_t *rec = *rec_ptr; + if ( rec->rid!=args->rid ) break; + if ( args->fa_end_pos && rec->pos > args->fa_end_pos ) break; + if ( args->fa_ori_pos + args->fa_buf.l - args->fa_mod_off <= rec->pos ) break; + apply_variant(args, rec); + } + if (args->chain) print_chain(args); + if ( args->absent_allele ) apply_absent(args, HTS_POS_MAX); + flush_fa_buffer(args, 0); + bgzf_close(fasta); + free(str.s); + fprintf(bcftools_stderr,"Applied %d variants\n", args->napplied); +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Create consensus sequence by applying VCF variants to a reference fasta\n"); + fprintf(bcftools_stderr, " file. By default, the program will apply all ALT variants. Using the\n"); + fprintf(bcftools_stderr, " --sample (and, optionally, --haplotype) option will apply genotype\n"); + fprintf(bcftools_stderr, " (or haplotype) calls from FORMAT/GT. The program ignores allelic depth\n"); + fprintf(bcftools_stderr, " information, such as INFO/AD or FORMAT/AD.\n"); + fprintf(bcftools_stderr, "Usage: bcftools consensus [OPTIONS] \n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -c, --chain FILE write a chain file for liftover\n"); + fprintf(bcftools_stderr, " -a, --absent CHAR replace positions absent from VCF with CHAR\n"); + fprintf(bcftools_stderr, " -e, --exclude EXPR exclude sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " -f, --fasta-ref FILE reference sequence in fasta format\n"); + fprintf(bcftools_stderr, " -H, --haplotype WHICH choose which allele to use from the FORMAT/GT field, note\n"); + fprintf(bcftools_stderr, " the codes are case-insensitive:\n"); + fprintf(bcftools_stderr, " 1: first allele from GT, regardless of phasing\n"); + fprintf(bcftools_stderr, " 2: second allele from GT, regardless of phasing\n"); + fprintf(bcftools_stderr, " R: REF allele in het genotypes\n"); + fprintf(bcftools_stderr, " A: ALT allele\n"); + fprintf(bcftools_stderr, " I: IUPAC code for all genotypes\n"); + fprintf(bcftools_stderr, " LR,LA: longer allele and REF/ALT if equal length\n"); + fprintf(bcftools_stderr, " SR,SA: shorter allele and REF/ALT if equal length\n"); + fprintf(bcftools_stderr, " 1pIu,2pIu: first/second allele for phased and IUPAC code for unphased GTs\n"); + fprintf(bcftools_stderr, " -i, --include EXPR select sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " -I, --iupac-codes output variants in the form of IUPAC ambiguity codes\n"); + fprintf(bcftools_stderr, " --mark-del CHAR instead of removing sequence, insert CHAR for deletions\n"); + fprintf(bcftools_stderr, " --mark-ins uc|lc highlight insertions in uppercase (uc) or lowercase (lc), leaving the rest as is\n"); + fprintf(bcftools_stderr, " --mark-snv uc|lc highlight substitutions in uppercase (uc) or lowercase (lc), leaving the rest as is\n"); + fprintf(bcftools_stderr, " -m, --mask FILE replace regions according to the next --mask-with option. The default is --mask-with N\n"); + fprintf(bcftools_stderr, " --mask-with CHAR|uc|lc replace with CHAR (skips overlapping variants); change to uppercase (uc) or lowercase (lc)\n"); + fprintf(bcftools_stderr, " -M, --missing CHAR output CHAR instead of skipping a missing genotype \"./.\"\n"); + fprintf(bcftools_stderr, " -o, --output FILE write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -p, --prefix STRING prefix to add to output sequence names\n"); + fprintf(bcftools_stderr, " -s, --sample NAME apply variants of the given sample\n"); + fprintf(bcftools_stderr, "Examples:\n"); + fprintf(bcftools_stderr, " # Get the consensus for one region. The fasta header lines are then expected\n"); + fprintf(bcftools_stderr, " # in the form \">chr:from-to\".\n"); + fprintf(bcftools_stderr, " samtools faidx ref.fa 8:11870-11890 | bcftools consensus in.vcf.gz > out.fa\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # See also http://samtools.github.io/bcftools/howtos/consensus-sequence.html\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_consensus(int argc, char *argv[]) +{ + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + + static struct option loptions[] = + { + {"mark-del",required_argument,NULL,1}, + {"mark-ins",required_argument,NULL,2}, + {"mark-snv",required_argument,NULL,3}, + {"mask-with",1,0,4}, + {"exclude",required_argument,NULL,'e'}, + {"include",required_argument,NULL,'i'}, + {"sample",1,0,'s'}, + {"iupac-codes",0,0,'I'}, + {"haplotype",1,0,'H'}, + {"output",1,0,'o'}, + {"fasta-ref",1,0,'f'}, + {"mask",1,0,'m'}, + {"missing",1,0,'M'}, + {"absent",1,0,'a'}, + {"chain",1,0,'c'}, + {"prefix",required_argument,0,'p'}, + {0,0,0,0} + }; + int c; + while ((c = getopt_long(argc, argv, "h?s:1Ii:e:H:f:o:m:c:M:p:a:",loptions,NULL)) >= 0) + { + switch (c) + { + case 1 : args->mark_del = optarg[0]; break; + case 2 : + if ( !strcasecmp(optarg,"uc") ) args->mark_ins = 'u'; + else if ( !strcasecmp(optarg,"lc") ) args->mark_ins = 'l'; + else error("The argument is not recognised: --mark-ins %s\n",optarg); + break; + case 3 : + if ( !strcasecmp(optarg,"uc") ) args->mark_snv = 'u'; + else if ( !strcasecmp(optarg,"lc") ) args->mark_snv = 'l'; + else error("The argument is not recognised: --mark-snv %s\n",optarg); + break; + case 'p': args->chr_prefix = optarg; break; + case 's': args->sample = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'I': args->output_iupac = 1; break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'f': args->ref_fname = optarg; break; + case 'm': add_mask(args,optarg); break; + case 4 : add_mask_with(args,optarg); break; + case 'a': + args->absent_allele = optarg[0]; + if ( optarg[1]!=0 ) error("Expected single character with -a, got \"%s\"\n", optarg); + break; + case 'M': + args->missing_allele = optarg[0]; + if ( optarg[1]!=0 ) error("Expected single character with -M, got \"%s\"\n", optarg); + break; + case 'c': args->chain_fname = optarg; break; + case 'H': + if ( !strcasecmp(optarg,"R") ) args->allele |= PICK_REF; + else if ( !strcasecmp(optarg,"A") ) args->allele |= PICK_ALT; + else if ( !strcasecmp(optarg,"L") ) args->allele |= PICK_LONG|PICK_REF; + else if ( !strcasecmp(optarg,"S") ) args->allele |= PICK_SHORT|PICK_REF; + else if ( !strcasecmp(optarg,"LR") ) args->allele |= PICK_LONG|PICK_REF; + else if ( !strcasecmp(optarg,"LA") ) args->allele |= PICK_LONG|PICK_ALT; + else if ( !strcasecmp(optarg,"SR") ) args->allele |= PICK_SHORT|PICK_REF; + else if ( !strcasecmp(optarg,"SA") ) args->allele |= PICK_SHORT|PICK_ALT; + else if ( !strcasecmp(optarg,"I") ) args->allele |= PICK_IUPAC; + else if ( !strcasecmp(optarg,"1pIu") ) args->allele |= PICK_IUPAC, args->haplotype = 1; + else if ( !strcasecmp(optarg,"2pIu") ) args->allele |= PICK_IUPAC, args->haplotype = 2; + else + { + char *tmp; + args->haplotype = strtol(optarg, &tmp, 10); + if ( tmp==optarg || *tmp ) error("Error: Could not parse --haplotype %s, expected numeric argument\n", optarg); + if ( args->haplotype <=0 ) error("Error: Expected positive integer with --haplotype\n"); + } + break; + default: usage(args); break; + } + } + if ( optind>=argc ) usage(args); + args->fname = argv[optind]; + + if ( !args->ref_fname && !isatty(fileno((FILE *)stdin)) ) args->ref_fname = "-"; + if ( !args->ref_fname ) usage(args); + + init_data(args); + consensus(args); + destroy_data(args); + free(args); + + return 0; +} + + diff --git a/bcftools/convert.c b/bcftools/convert.c new file mode 100644 index 0000000..5317cb8 --- /dev/null +++ b/bcftools/convert.c @@ -0,0 +1,1709 @@ +/* convert.c -- functions for converting between VCF/BCF and related formats. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define __STDC_FORMAT_MACROS +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "variantkey.h" +#include "convert.h" +#include "filter.h" + +#define T_CHROM 1 +#define T_POS 2 +#define T_ID 3 +#define T_REF 4 +#define T_ALT 5 +#define T_QUAL 6 +#define T_FILTER 7 +#define T_INFO 8 +#define T_FORMAT 9 +#define T_SAMPLE 10 +#define T_SEP 11 +#define T_IS_TS 12 +#define T_TYPE 13 +#define T_MASK 14 +#define T_GT 15 +#define T_TGT 16 +#define T_LINE 17 +#define T_CHROM_POS_ID 18 // not publicly advertised +#define T_GT_TO_PROB3 19 // not publicly advertised +#define T_PL_TO_PROB3 20 // not publicly advertised +#define T_GP_TO_PROB3 21 // not publicly advertised +#define T_FIRST_ALT 22 // not publicly advertised +#define T_IUPAC_GT 23 +#define T_GT_TO_HAP 24 // not publicly advertised +#define T_GT_TO_HAP2 25 // not publicly advertised +#define T_TBCSQ 26 +#define T_END 27 +#define T_POS0 28 +#define T_END0 29 +#define T_RSX 30 // RSID HEX +#define T_VKX 31 // VARIANTKEY HEX +#define T_PBINOM 32 +#define T_NPASS 33 + +typedef struct _fmt_t +{ + int type, id, is_gt_field, ready, subscript; + char *key; + bcf_fmt_t *fmt; + void *usr; // user data (optional) + void (*handler)(convert_t *, bcf1_t *, struct _fmt_t *, int, kstring_t *); + void (*destroy)(void*); // clean user data (optional) +} +fmt_t; + +struct _convert_t +{ + fmt_t *fmt; + int nfmt, mfmt; + int nsamples, *samples; + bcf_hdr_t *header; + int max_unpack; + char *format_str; + bcf_srs_t *readers; // required only for %MASK + int nreaders; + void *dat; + int ndat; + char *undef_info_tag; + void *used_tags_hash; + char **used_tags_list; + int nused_tags; + int allow_undef_tags; + uint8_t **subset_samples; +}; + +typedef struct +{ + kstring_t hap1,hap2; + char **str; + int n, m; +} +bcsq_t; + +static void process_chrom(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputs(convert->header->id[BCF_DT_CTG][line->rid].key, str); } +static void process_pos(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputw(line->pos+1, str); } +static void process_pos0(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputw(line->pos, str); } +static void process_end(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputw(line->pos+line->rlen, str); } +static void process_end0(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputw(line->pos+line->rlen-1, str); } +static void process_id(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputs(line->d.id, str); } +static void process_ref(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputs(line->d.allele[0], str); } +static void process_alt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i; + if ( line->n_allele==1 ) + { + kputc('.', str); + return; + } + if ( fmt->subscript>=0 ) + { + if ( line->n_allele > fmt->subscript+1 ) + kputs(line->d.allele[fmt->subscript+1], str); + else + kputc('.', str); + return; + } + for (i=1; in_allele; i++) + { + if ( i>1 ) kputc(',', str); + kputs(line->d.allele[i], str); + } +} +static void process_first_alt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( line->n_allele==1 ) + kputc('.', str); + else + kputs(line->d.allele[1], str); +} +static void process_qual(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( bcf_float_is_missing(line->qual) ) kputc('.', str); + else kputd(line->qual, str); +} +static void process_filter(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i; + if ( line->d.n_flt ) + { + for (i=0; id.n_flt; i++) + { + if (i) kputc(';', str); + kputs(convert->header->id[BCF_DT_ID][line->d.flt[i]].key, str); + } + } + else kputc('.', str); +} +static inline int32_t bcf_array_ivalue(void *bcf_array, int type, int idx) +{ + if ( type==BCF_BT_INT8 ) + { + int8_t val = ((int8_t*)bcf_array)[idx]; + if ( val==bcf_int8_missing ) return bcf_int32_missing; + if ( val==bcf_int8_vector_end ) return bcf_int32_vector_end; + return val; + } + if ( type==BCF_BT_INT16 ) + { + int16_t val = ((int16_t*)bcf_array)[idx]; + if ( val==bcf_int16_missing ) return bcf_int32_missing; + if ( val==bcf_int16_vector_end ) return bcf_int32_vector_end; + return val; + } + return ((int32_t*)bcf_array)[idx]; +} +static inline void _copy_field(char *src, uint32_t len, int idx, kstring_t *str) +{ + int n = 0, ibeg = 0; + while ( src[ibeg] && ibegibeg ) + kputsn(src+ibeg, iend-ibeg, str); + else + kputc('.', str); +} +static void process_info(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i; + if ( !fmt->key ) // the whole INFO column + { + int first = 1; + for (i=0; in_info; i++) + { + bcf_info_t *inf = &line->d.info[i]; + if ( !inf->vptr ) continue; + if ( !first ) kputc(';', str); + first = 0; + if ( inf->key >= convert->header->n[BCF_DT_ID] ) continue; + kputs(convert->header->id[BCF_DT_ID][inf->key].key, str); + if ( inf->len <= 0 ) continue; + kputc('=', str); + if ( inf->len == 1 ) + { + switch (inf->type) + { + case BCF_BT_INT8: if ( inf->v1.i==bcf_int8_missing ) kputc('.', str); else kputw(inf->v1.i, str); break; + case BCF_BT_INT16: if ( inf->v1.i==bcf_int16_missing ) kputc('.', str); else kputw(inf->v1.i, str); break; + case BCF_BT_INT32: if ( inf->v1.i==bcf_int32_missing ) kputc('.', str); else kputw(inf->v1.i, str); break; + case BCF_BT_FLOAT: if ( bcf_float_is_missing(inf->v1.f) ) kputc('.', str); else kputd(inf->v1.f, str); break; + case BCF_BT_CHAR: kputc(inf->v1.i, str); break; + default: error("Unexpected type %d", inf->type); break; + } + } + else bcf_fmt_array(str, inf->len, inf->type, inf->vptr); + } + if ( first ) kputc('.', str); + return; + } + + if ( fmt->id<0 ) + { + kputc('.', str); + return; + } + + for (i=0; in_info; i++) + if ( line->d.info[i].key == fmt->id ) break; + + // output "." if the tag is not present + if ( i==line->n_info ) + { + kputc('.', str); + return; + } + + bcf_info_t *info = &line->d.info[i]; + + // if this is a flag, output 1 + if ( info->len <=0 ) + { + kputc('1', str); + return; + } + + if ( info->len == 1 ) + { + switch (info->type) + { + case BCF_BT_INT8: if ( info->v1.i==bcf_int8_missing ) kputc('.', str); else kputw(info->v1.i, str); break; + case BCF_BT_INT16: if ( info->v1.i==bcf_int16_missing ) kputc('.', str); else kputw(info->v1.i, str); break; + case BCF_BT_INT32: if ( info->v1.i==bcf_int32_missing ) kputc('.', str); else kputw(info->v1.i, str); break; + case BCF_BT_FLOAT: if ( bcf_float_is_missing(info->v1.f) ) kputc('.', str); else kputd(info->v1.f, str); break; + case BCF_BT_CHAR: kputc(info->v1.i, str); break; + default: fprintf(stderr,"todo: type %d\n", info->type); exit(1); break; + } + } + else if ( fmt->subscript >=0 ) + { + if ( info->len <= fmt->subscript ) + { + kputc('.', str); + return; + } + #define BRANCH(type_t, is_missing, is_vector_end, kprint) { \ + type_t val = ((type_t *) info->vptr)[fmt->subscript]; \ + if ( is_missing || is_vector_end ) kputc('.',str); \ + else kprint; \ + } + switch (info->type) + { + case BCF_BT_INT8: BRANCH(int8_t, val==bcf_int8_missing, val==bcf_int8_vector_end, kputw(val, str)); break; + case BCF_BT_INT16: BRANCH(int16_t, val==bcf_int16_missing, val==bcf_int16_vector_end, kputw(val, str)); break; + case BCF_BT_INT32: BRANCH(int32_t, val==bcf_int32_missing, val==bcf_int32_vector_end, kputw(val, str)); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), kputd(val, str)); break; + case BCF_BT_CHAR: _copy_field((char*)info->vptr, info->vptr_len, fmt->subscript, str); break; + default: fprintf(stderr,"todo: type %d\n", info->type); exit(1); break; + } + #undef BRANCH + } + else + bcf_fmt_array(str, info->len, info->type, info->vptr); +} +static void init_format(convert_t *convert, bcf1_t *line, fmt_t *fmt) +{ + fmt->id = bcf_hdr_id2int(convert->header, BCF_DT_ID, fmt->key); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,fmt->id) ) fmt->id = -1; + fmt->fmt = NULL; + if ( fmt->id >= 0 ) + { + int i; + for (i=0; i<(int)line->n_fmt; i++) + if ( line->d.fmt[i].id==fmt->id ) { fmt->fmt = &line->d.fmt[i]; break; } + } + else if ( !convert->allow_undef_tags ) + error("Error: no such tag defined in the VCF header: FORMAT/%s\n", fmt->key); + + fmt->ready = 1; +} +static void process_complete_format(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( convert->nsamples ) + { + int i,j; + if ( line->n_fmt) + { + int gt_i = -1; + bcf_fmt_t *fmt = line->d.fmt; + int first = 1; + for (i=0; i<(int)line->n_fmt; i++) + { + if ( !fmt[i].p || fmt[i].id<0 ) continue; + if ( !first ) kputc(':', str); + first = 0; + kputs(convert->header->id[BCF_DT_ID][fmt[i].id].key, str); + if ( strcmp(convert->header->id[BCF_DT_ID][fmt[i].id].key, "GT") == 0) gt_i = i; + } + if ( first ) kputc('.', str); + for (j=0; jnsamples; j++) + { + kputc('\t', str); + first = 1; + for (i=0; i<(int)line->n_fmt; i++) + { + bcf_fmt_t *f = &fmt[i]; + if ( !f->p ) continue; + if ( !first ) kputc(':', str); + first = 0; + if (gt_i == i) + bcf_format_gt(f,convert->samples[j],str); + else + bcf_fmt_array(str, f->n, f->type, f->p + convert->samples[j] * f->size); + } + if ( first ) kputc('.', str); + } + } + else + for (j=0; j<=line->n_sample; j++) + kputs("\t.", str); + } + else + kputc('.',str); +} +static void process_format(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + init_format(convert, line, fmt); + + if ( fmt->fmt==NULL ) + { + kputc('.', str); + return; + } + else if ( fmt->subscript >=0 ) + { + if ( fmt->fmt->n <= fmt->subscript ) + { + kputc('.', str); + return; + } + if ( fmt->fmt->type == BCF_BT_FLOAT ) + { + float *ptr = (float*)(fmt->fmt->p + isample*fmt->fmt->size); + if ( bcf_float_is_missing(ptr[fmt->subscript]) || bcf_float_is_vector_end(ptr[fmt->subscript]) ) + kputc('.', str); + else + kputd(ptr[fmt->subscript], str); + } + else if ( fmt->fmt->type != BCF_BT_CHAR ) + { + int32_t ival = bcf_array_ivalue(fmt->fmt->p+isample*fmt->fmt->size,fmt->fmt->type,fmt->subscript); + if ( ival==bcf_int32_missing || ival==bcf_int32_vector_end ) + kputc('.', str); + else + kputw(ival, str); + } + else if ( fmt->fmt->type == BCF_BT_CHAR ) + _copy_field((char*)(fmt->fmt->p + isample*fmt->fmt->size), fmt->fmt->size, fmt->subscript, str); + else error("TODO: %s:%d .. fmt->type=%d\n", __FILE__,__LINE__, fmt->fmt->type); + } + else + bcf_fmt_array(str, fmt->fmt->n, fmt->fmt->type, fmt->fmt->p + isample*fmt->fmt->size); +} +static void process_gt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + init_format(convert, line, fmt); + + if ( fmt->fmt==NULL ) + { + kputc('.', str); + return; + } + bcf_format_gt(fmt->fmt, isample, str); +} +static void process_tgt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + init_format(convert, line, fmt); + + if ( fmt->fmt==NULL ) + { + kputc('.', str); + return; + } + + assert( fmt->fmt->type==BCF_BT_INT8 ); + + int l; + int8_t *x = (int8_t*)(fmt->fmt->p + isample*fmt->fmt->size); // FIXME: does not work with n_alt >= 64 + for (l = 0; l < fmt->fmt->n && x[l] != bcf_int8_vector_end; ++l) + { + if (l) kputc("/|"[x[l]&1], str); + if (x[l]>>1) + { + int ial = (x[l]>>1) - 1; + kputs(line->d.allele[ial], str); + } + else + kputc('.', str); + } + if (l == 0) kputc('.', str); +} +static void destroy_tbcsq(void *usr) +{ + if ( !usr ) return; + bcsq_t *csq = (bcsq_t*) usr; + free(csq->hap1.s); + free(csq->hap2.s); + if ( csq->n ) + free(csq->str[0]); + free(csq->str); + free(csq); +} +static void process_tbcsq(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + { + init_format(convert, line, fmt); + + bcsq_t *csq; + if ( fmt->usr ) + { + csq = (bcsq_t*) fmt->usr; + if ( csq->n ) + free(csq->str[0]); + csq->n = 0; + } + else + csq = (bcsq_t*) calloc(1,sizeof(bcsq_t)); + fmt->usr = csq; + + int i=0, len = 0; + char *tmp = NULL; + if ( bcf_get_info_string(convert->header,line,fmt->key,&tmp,&len)<0 ) + { + csq->n = 0; + return; + } + do + { + csq->n++; + hts_expand(char*, csq->n, csq->m, csq->str); + csq->str[ csq->n-1 ] = tmp + i; + while ( iusr; + + if ( fmt->fmt==NULL || !csq->n ) return; + + csq->hap1.l = 0; + csq->hap2.l = 0; + + int mask = fmt->subscript==0 ? 3 : 1; // merge both haplotypes if subscript==0 + + #define BRANCH(type_t, nbits) { \ + type_t *x = (type_t*)(fmt->fmt->p + isample*fmt->fmt->size); \ + int i,j; \ + if ( fmt->subscript<=0 || fmt->subscript==1 ) \ + { \ + for (j=0; j < fmt->fmt->n; j++) \ + { \ + type_t val = x[j]; \ + if ( !val ) continue; \ + for (i=0; istr[(j*30+i)/2], &csq->hap1); kputc_(',', &csq->hap1); } \ + } \ + } \ + if ( fmt->subscript<0 || fmt->subscript==2 ) \ + { \ + for (j=0; j < fmt->fmt->n; j++) \ + { \ + type_t val = x[j]; \ + if ( !val ) continue; \ + for (i=1; istr[(j*30+i)/2], &csq->hap2); kputc_(',', &csq->hap2); } \ + } \ + } \ + } + switch (fmt->fmt->type) + { + case BCF_BT_INT8: BRANCH(uint8_t, 8); break; + case BCF_BT_INT16: BRANCH(uint16_t,16); break; + case BCF_BT_INT32: BRANCH(uint32_t,30); break; // 2 bytes unused to account for the reserved BCF values + default: error("Unexpected type: %d\n", fmt->fmt->type); exit(1); break; + } + #undef BRANCH + + if ( !csq->hap1.l && !csq->hap2.l ) return; + + if ( csq->hap1.l ) csq->hap1.s[--csq->hap1.l] = 0; + if ( csq->hap2.l ) csq->hap2.s[--csq->hap2.l] = 0; + + if ( fmt->subscript<0 ) + { + kputs(csq->hap1.l?csq->hap1.s:".", str); + kputc_('\t', str); + kputs(csq->hap2.l?csq->hap2.s:".", str); + } + else if ( fmt->subscript<2 ) + kputs(csq->hap1.l?csq->hap1.s:".", str); + else + kputs(csq->hap2.l?csq->hap2.s:".", str); +} +static void init_format_iupac(convert_t *convert, bcf1_t *line, fmt_t *fmt) +{ + init_format(convert, line, fmt); + if ( fmt->fmt==NULL ) return; + + // Init mapping between alleles and IUPAC table + hts_expand(uint8_t, line->n_allele, convert->ndat, convert->dat); + int8_t *dat = (int8_t*)convert->dat; + int i; + for (i=0; in_allele; i++) + { + if ( line->d.allele[i][1] ) dat[i] = -1; + else + { + switch (line->d.allele[i][0]) + { + case 'A': dat[i] = 0; break; + case 'C': dat[i] = 1; break; + case 'G': dat[i] = 2; break; + case 'T': dat[i] = 3; break; + case 'a': dat[i] = 0; break; + case 'c': dat[i] = 1; break; + case 'g': dat[i] = 2; break; + case 't': dat[i] = 3; break; + default: dat[i] = -1; + } + } + } +} +static void process_iupac_gt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + init_format_iupac(convert, line, fmt); + + if ( fmt->fmt==NULL ) + { + kputc('.', str); + return; + } + + assert( fmt->fmt->type==BCF_BT_INT8 ); + + static const char iupac[4][4] = { {'A','M','R','W'},{'M','C','S','Y'},{'R','S','G','K'},{'W','Y','K','T'} }; + int8_t *dat = (int8_t*)convert->dat; + + int8_t *x = (int8_t*)(fmt->fmt->p + isample*fmt->fmt->size); // FIXME: does not work with n_alt >= 64 + int l = 0; + while ( lfmt->n && x[l]!=bcf_int8_vector_end && x[l]!=bcf_int8_missing ) l++; + + if ( l==2 ) + { + // diploid + int ia = (x[0]>>1) - 1, ib = (x[1]>>1) - 1; + if ( ia>=0 && ian_allele && ib>=0 && ibn_allele && dat[ia]>=0 && dat[ib]>=0 ) + { + kputc(iupac[dat[ia]][dat[ib]], str); + return; + } + } + for (l = 0; l < fmt->fmt->n && x[l] != bcf_int8_vector_end; ++l) + { + if (l) kputc("/|"[x[l]&1], str); + if (x[l]>>1) + { + int ial = (x[l]>>1) - 1; + kputs(line->d.allele[ial], str); + } + else + kputc('.', str); + } + if (l == 0) kputc('.', str); +} +static void process_sample(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + kputs(convert->header->samples[isample], str); +} +static void process_sep(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { if (fmt->key) kputs(fmt->key, str); } +static void process_is_ts(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int is_ts = 0; + if ( bcf_get_variant_types(line) & (VCF_SNP|VCF_MNP) ) + is_ts = abs(bcf_acgt2int(*line->d.allele[0])-bcf_acgt2int(*line->d.allele[1])) == 2 ? 1 : 0; + kputc(is_ts ? '1' : '0', str); +} +static void process_type(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int line_type = bcf_get_variant_types(line); + int i = 0; + if ( line_type == VCF_REF ) { kputs("REF", str); i++; } + if ( line_type & VCF_SNP ) { if (i) kputc(',',str); kputs("SNP", str); i++; } + if ( line_type & VCF_MNP ) { if (i) kputc(',',str); kputs("MNP", str); i++; } + if ( line_type & VCF_INDEL ) { if (i) kputc(',',str); kputs("INDEL", str); i++; } + if ( line_type & VCF_OTHER ) { if (i) kputc(',',str); kputs("OTHER", str); i++; } + if ( line_type & VCF_BND ) { if (i) kputc(',',str); kputs("BND", str); i++; } + if ( line_type & VCF_OVERLAP ) { if (i) kputc(',',str); kputs("OVERLAP", str); i++; } +} +static void process_line(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + vcf_format1(convert->header, line, str); +} +static void process_chrom_pos_id(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( line->d.id[0]!='.' || line->d.id[1] ) + { + // ID is present + kputs(line->d.id, str); + } + else + { + // use CHROM:POS instead of ID + kputs(convert->header->id[BCF_DT_CTG][line->rid].key, str); + kputc(':', str); + kputw(line->pos+1, str); + } +} +static void process_gt_to_prob3(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int m,n,i; + + m = convert->ndat / sizeof(int32_t); + n = bcf_get_genotypes(convert->header,line,&convert->dat,&m); + convert->ndat = m * sizeof(int32_t); + + if ( n<=0 ) + { + // Throw an error or silently proceed? + // + // for (i=0; insamples; i++) kputs(" 0.33 0.33 0.33", str); + // return; + + error("Error parsing GT tag at %s:%"PRId64"\n", bcf_seqname(convert->header,line),(int64_t) line->pos+1); + } + + n /= convert->nsamples; + for (i=0; insamples; i++) + { + int32_t *ptr = (int32_t*)convert->dat + i*n; + int j; + for (j=0; jndat / sizeof(int32_t); + n = bcf_get_format_int32(convert->header,line,"PL",&convert->dat,&m); + convert->ndat = m * sizeof(int32_t); + + if ( n<=0 ) + { + // Throw an error or silently proceed? + // + // for (i=0; insamples; i++) kputs(" 0.33 0.33 0.33", str); + // return; + + error("Error parsing PL tag at %s:%"PRId64"\n", bcf_seqname(convert->header,line),(int64_t) line->pos+1); + } + + n /= convert->nsamples; + for (i=0; insamples; i++) + { + int32_t *ptr = (int32_t*)convert->dat + i*n; + int j; + float sum = 0; + for (j=0; jn_allele ) + { + // haploid + kputc(' ',str); + ksprintf(str,"%f",pow(10,-0.1*ptr[0])/sum); + kputs(" 0 ", str); + ksprintf(str,"%f",pow(10,-0.1*ptr[1])/sum); + } + else + { + // diploid + kputc(' ',str); + ksprintf(str,"%f",pow(10,-0.1*ptr[0])/sum); + kputc(' ',str); + ksprintf(str,"%f",pow(10,-0.1*ptr[1])/sum); + kputc(' ',str); + ksprintf(str,"%f",pow(10,-0.1*ptr[2])/sum); + } + } +} +static void process_gp_to_prob3(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int m,n,i; + + m = convert->ndat / sizeof(float); + n = bcf_get_format_float(convert->header,line,"GP",&convert->dat,&m); + convert->ndat = m * sizeof(float); + + if ( n<=0 ) + { + // Throw an error or silently proceed? + // + // for (i=0; insamples; i++) kputs(" 0.33 0.33 0.33", str); + // return; + + error("Error parsing GP tag at %s:%"PRId64"\n", bcf_seqname(convert->header,line),(int64_t) line->pos+1); + } + + n /= convert->nsamples; + for (i=0; insamples; i++) + { + float *ptr = (float*)convert->dat + i*n; + int j; + for (j=0; j1 ) error("[%s:%"PRId64":%f] GP value outside range [0,1]; bcftools convert expects the VCF4.3+ spec for the GP field encoding genotype posterior probabilities", bcf_seqname(convert->header,line),(int64_t) line->pos+1,ptr[j]); + } + if ( j==line->n_allele ) + ksprintf(str," %f %f %f",ptr[0],0.,ptr[1]); // haploid + else + ksprintf(str," %f %f %f",ptr[0],ptr[1],ptr[2]); // diploid + } +} + +static void process_gt_to_hap(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + // https://mathgen.stats.ox.ac.uk/impute/impute_v2.html#-known_haps_g + + // File containing known haplotypes for the study cohort. The format + // is the same as the output format from IMPUTE2's -phase option: + // five header columns (as in the -g file) followed by two columns + // (haplotypes) per individual. Allowed values in the haplotype + // columns are 0, 1, and ?. + + // If your study dataset is fully phased, you can replace the -g file + // with a -known_haps_g file. This will cause IMPUTE2 to perform + // haploid imputation, although it will still report diploid imputation + // probabilities in the main output file. If any genotypes are missing, + // they can be marked as '? ?' (two question marks separated by one + // space) in the input file. (The program does not allow just one + // allele from a diploid genotype to be missing.) If the reference + // panels are also phased, IMPUTE2 will perform a single, fast + // imputation step rather than its standard MCMC module this is how + // the program imputes into pre-phased GWAS haplotypes. + + // The -known_haps_g file can also be used to specify study + // genotypes that are "partially" phased, in the sense that some + // genotypes are phased relative to a fixed reference point while + // others are not. We anticipate that this will be most useful when + // trying to phase resequencing data onto a scaffold of known + // haplotypes. To mark a known genotype as unphased, place an + // asterisk immediately after each allele, with no space between + // the allele (0/1) and the asterisk (*); e.g., "0* 1*" for a + // heterozygous genotype of unknown phase. + + int i, gt_id = bcf_hdr_id2int(convert->header, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,gt_id) ) + error("FORMAT/GT tag not present at %s:%"PRId64"\n", bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( !(line->unpacked & BCF_UN_FMT) ) bcf_unpack(line, BCF_UN_FMT); + bcf_fmt_t *fmt_gt = NULL; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==gt_id ) { fmt_gt = &line->d.fmt[i]; break; } + if ( !fmt_gt ) + error("FORMAT/GT tag not present at %s:%"PRId64"\n", bcf_seqname(convert->header, line),(int64_t) line->pos+1); + + // Alloc all memory in advance to avoid kput routines. The biggest allowed allele index is 99 + if ( line->n_allele > 100 ) + error("Too many alleles (%d) at %s:%"PRId64"\n", line->n_allele, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( ks_resize(str, str->l+convert->nsamples*8) != 0 ) + error("Could not alloc %" PRIu64 " bytes\n", (uint64_t)(str->l + convert->nsamples*8)); + + if ( fmt_gt->type!=BCF_BT_INT8 ) // todo: use BRANCH_INT if the VCF is valid + error("Uh, too many alleles (%d) or redundant BCF representation at %s:%"PRId64"\n", line->n_allele, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( fmt_gt->n!=1 && fmt_gt->n!=2 ) + error("Uh, ploidy of %d not supported, see %s:%"PRId64"\n", fmt_gt->n, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + + int8_t *ptr = ((int8_t*) fmt_gt->p) - fmt_gt->n; + for (i=0; insamples; i++) + { + ptr += fmt_gt->n; + if ( fmt_gt->n==1 ) // haploid genotypes + { + if ( ptr[0]==2 ) /* 0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else if ( ptr[0]==bcf_int8_missing ) /* . */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( ptr[0]==4 ) /* 1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else + { + kputw(bcf_gt_allele(ptr[0]),str); str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + } + else if ( ptr[0]==2 ) + { + if ( ptr[1]==3 ) /* 0|0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==5 ) /* 0|1 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) /* 0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==2 ) /* 0/0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==4 ) /* 0/1 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_missing(ptr[1]) ) /* 0/. */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_phased(ptr[1]) ) /* 0|x */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = ' '; + } + else /* 0/x */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + } + else if ( ptr[0]==4 ) + { + if ( ptr[1]==3 ) /* 1|0 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==5 ) /* 1|1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) /* 1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==2 ) /* 1/0 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==4 ) /* 1/1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_missing(ptr[1]) ) /* 1/. */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_phased(ptr[1]) ) /* 1|x */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = ' '; + } + else /* 1/x */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + } + else if ( bcf_gt_is_missing(ptr[0]) ) + { + if ( ptr[1]==bcf_int8_vector_end ) + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + } + else if ( ptr[1]==bcf_int8_vector_end ) + { + /* use REF for something else than first ALT */ + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else + { + kputw(bcf_gt_allele(ptr[0]),str); + if ( bcf_gt_is_phased(ptr[1]) ) str->s[str->l++] = '*'; + str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + if ( bcf_gt_is_phased(ptr[1]) ) str->s[str->l++] = '*'; + str->s[str->l++] = ' '; + } + } + str->s[--str->l] = 0; // delete the last space +} +static void process_gt_to_hap2(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + // same as process_gt_to_hap but converts haploid genotypes into diploid + + int i, gt_id = bcf_hdr_id2int(convert->header, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,gt_id) ) + error("FORMAT/GT tag not present at %s:%"PRId64"\n", bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( !(line->unpacked & BCF_UN_FMT) ) bcf_unpack(line, BCF_UN_FMT); + bcf_fmt_t *fmt_gt = NULL; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==gt_id ) { fmt_gt = &line->d.fmt[i]; break; } + if ( !fmt_gt ) + error("FORMAT/GT tag not present at %s:%"PRId64"\n", bcf_seqname(convert->header, line),(int64_t) line->pos+1); + + // Alloc all memory in advance to avoid kput routines. The biggest allowed allele index is 99 + if ( line->n_allele > 100 ) + error("Too many alleles (%d) at %s:%"PRId64"\n", line->n_allele, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( ks_resize(str, str->l+convert->nsamples*8) != 0 ) + error("Could not alloc %" PRIu64 " bytes\n", (uint64_t)(str->l + convert->nsamples*8)); + + if ( fmt_gt->type!=BCF_BT_INT8 ) // todo: use BRANCH_INT if the VCF is valid + error("Uh, too many alleles (%d) or redundant BCF representation at %s:%"PRId64"\n", line->n_allele, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + + int8_t *ptr = ((int8_t*) fmt_gt->p) - fmt_gt->n; + for (i=0; insamples; i++) + { + ptr += fmt_gt->n; + if ( ptr[0]==2 ) + { + if ( ptr[1]==3 ) /* 0|0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==5 ) /* 0|1 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) /* 0 -> 0|0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==2 ) /* 0/0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==4 ) /* 0/1 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_missing(ptr[1]) ) /* 0/. */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_phased(ptr[1]) ) /* 0|x */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = ' '; + } + else /* 0/x */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + } + else if ( ptr[0]==4 ) + { + if ( ptr[1]==3 ) /* 1|0 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==5 ) /* 1|1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) /* 1 -> 1|1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==2 ) /* 1/0 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==4 ) /* 1/1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_missing(ptr[1]) ) /* 1/. */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_phased(ptr[1]) ) /* 1|x */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = ' '; + } + else /* 1/x */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + } + else if ( bcf_gt_is_missing(ptr[0]) ) + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) + { + /* use REF for something else than first ALT */ + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else + { + kputw(bcf_gt_allele(ptr[0]),str); + if ( bcf_gt_is_phased(ptr[1]) ) str->s[str->l++] = '*'; + str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + if ( bcf_gt_is_phased(ptr[1]) ) str->s[str->l++] = '*'; + str->s[str->l++] = ' '; + } + } + str->s[--str->l] = 0; // delete the last space +} + +static void process_rsid_hex(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + char *ptr = line->d.id; + ptr += 2; // remove 'rs' + ksprintf(str, "%08" PRIx32 "", (uint32_t)strtoul(ptr, NULL, 10)); +} + +static void process_variantkey_hex(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + uint64_t vk = variantkey( + convert->header->id[BCF_DT_CTG][line->rid].key, + strlen(convert->header->id[BCF_DT_CTG][line->rid].key), + line->pos, + line->d.allele[0], + strlen(line->d.allele[0]), + line->d.allele[1], + strlen(line->d.allele[1])); + ksprintf(str, "%016" PRIx64 "", vk); +} + +static void process_npass(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i, nsmpl = 0; + filter_t *flt = (filter_t*) fmt->usr; + const uint8_t *smpl; + filter_test(flt,line,&smpl); + for (i=0; insamples; i++) + if ( smpl[i] ) nsmpl++; + kputd(nsmpl, str); +} +static void destroy_npass(void *usr) +{ + filter_destroy((filter_t*)usr); +} + +static void process_pbinom(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i; + if ( !fmt->ready ) + { + fmt->fmt = NULL; // AD + fmt->usr = NULL; // GT + + for (i=0; i<(int)line->n_fmt; i++) + if ( line->d.fmt[i].id==fmt->id ) { fmt->fmt = &line->d.fmt[i]; break; } + + // Check that the first field is GT + int gt_id = bcf_hdr_id2int(convert->header, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(convert->header, BCF_HL_FMT, fmt->id) ) error("Error: FORMAT/GT is not defined in the header\n"); + for (i=0; i<(int)line->n_fmt; i++) + if ( line->d.fmt[i].id==gt_id ) { fmt->usr = &line->d.fmt[i]; break; } // it should always be first according to VCF spec, but... + + if ( fmt->usr && line->d.fmt[i].type!=BCF_BT_INT8 ) // skip sites with many alleles + fmt->usr = NULL; + + fmt->ready = 1; + } + bcf_fmt_t *gt_fmt = (bcf_fmt_t*) fmt->usr; + if ( !fmt->fmt || !gt_fmt || gt_fmt->n!=2 ) goto invalid; + + int n[2] = {0,0}; + int8_t *gt = (int8_t*)(gt_fmt->p + isample*gt_fmt->size); + for (i=0; i<2; i++) + { + if ( bcf_gt_is_missing(gt[i]) || gt[i] == bcf_int8_vector_end ) goto invalid; + int al = bcf_gt_allele(gt[i]); + if ( al > line->n_allele || al >= fmt->fmt->n ) goto invalid; + + #define BRANCH(type_t, missing, vector_end) { \ + type_t val = ((type_t *) fmt->fmt->p)[al + isample*fmt->fmt->n]; \ + if ( val==missing || val==vector_end ) goto invalid; \ + else n[i] = val; \ + } + switch (fmt->fmt->type) + { + case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_missing, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_missing, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_missing, bcf_int32_vector_end); break; + default: goto invalid; break; + } + #undef BRANCH + } + + if ( n[0]==n[1] ) kputc(n[0]==0 ? '.':'0', str); + else + { + double pval = n[0] < n[1] ? kf_betai(n[1], n[0] + 1, 0.5) : kf_betai(n[0], n[1] + 1, 0.5); + pval *= 2; + if ( pval>=1 ) pval = 0; // this can happen, machine precision error, eg. kf_betai(1,0,0.5) + else + pval = -4.34294481903*log(pval); + kputd(pval, str); + } + return; + +invalid: + kputc('.', str); +} + +static void _used_tags_add(convert_t *convert, int type, char *key) +{ + kstring_t str = {0,0,0}; + ksprintf(&str,"%s/%s",type==T_INFO?"INFO":"FORMAT",key); + khash_str2int_inc(convert->used_tags_hash,str.s); + convert->nused_tags++; + convert->used_tags_list = (char**)realloc(convert->used_tags_list,sizeof(*convert->used_tags_list)*convert->nused_tags); + convert->used_tags_list[convert->nused_tags-1] = str.s; +} + + +#define _SET_NON_FORMAT_TAGS(function,key,...) \ + if ( !strcmp("CHROM",key) ) { function(__VA_ARGS__, T_CHROM); } \ + else if ( !strcmp("POS",key) ) { function(__VA_ARGS__, T_POS); } \ + else if ( !strcmp("POS0",key) ) { function(__VA_ARGS__, T_POS0); } \ + else if ( !strcmp("END",key) ) { function(__VA_ARGS__, T_END); } \ + else if ( !strcmp("END0",key) ) { function(__VA_ARGS__, T_END0); } \ + else if ( !strcmp("ID",key) ) { function(__VA_ARGS__, T_ID); } \ + else if ( !strcmp("REF",key) ) { function(__VA_ARGS__, T_REF); } \ + else if ( !strcmp("FIRST_ALT",key) ) { function(__VA_ARGS__, T_FIRST_ALT); } \ + else if ( !strcmp("QUAL",key) ) { function(__VA_ARGS__, T_QUAL); } \ + else if ( !strcmp("TYPE",key) ) { function(__VA_ARGS__, T_TYPE); } \ + else if ( !strcmp("FILTER",key) ) { function(__VA_ARGS__, T_FILTER); } \ + else if ( !strcmp("IS_TS",key) ) { function(__VA_ARGS__, T_IS_TS); } \ + else if ( !strcmp("MASK",key) ) { function(__VA_ARGS__, T_MASK); } \ + else if ( !strcmp("LINE",key) ) { function(__VA_ARGS__, T_LINE); } + +static void set_type(fmt_t *fmt, int type) { fmt->type = type; } +static fmt_t *register_tag(convert_t *convert, char *key, int is_gtf, int type) +{ + convert->nfmt++; + if ( convert->nfmt > convert->mfmt ) + { + convert->mfmt += 10; + convert->fmt = (fmt_t*) realloc(convert->fmt, convert->mfmt*sizeof(fmt_t)); + } + fmt_t *fmt = &convert->fmt[ convert->nfmt-1 ]; + fmt->type = type; + fmt->key = key ? strdup(key) : NULL; + fmt->is_gt_field = is_gtf; + fmt->subscript = -1; + fmt->usr = NULL; + fmt->destroy = NULL; + + // Allow non-format tags, such as CHROM, INFO, etc., to appear amongst the format tags. + if ( key ) + { + int id = bcf_hdr_id2int(convert->header, BCF_DT_ID, key); + if ( fmt->type==T_FORMAT && !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,id) ) + { + _SET_NON_FORMAT_TAGS(set_type,key,fmt) + else if ( !strcmp("ALT",key) ) { fmt->type = T_ALT; } + else if ( !strcmp("_CHROM_POS_ID",key) ) { fmt->type = T_CHROM_POS_ID; } + else if ( !strcmp("RSX",key) ) { fmt->type = T_RSX; } + else if ( !strcmp("VKX",key) ) { fmt->type = T_VKX; } + else if ( id>=0 && bcf_hdr_idinfo_exists(convert->header,BCF_HL_INFO,id) ) + { + fmt->type = T_INFO; + _used_tags_add(convert,T_INFO,key); + } + } + else if ( fmt->type==T_PBINOM ) + { + fmt->id = bcf_hdr_id2int(convert->header, BCF_DT_ID, fmt->key); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT, fmt->id) ) error("No such FORMAT tag defined in the header: %s\n", fmt->key); + _used_tags_add(convert,T_FORMAT,key); + } + else if ( fmt->type==T_NPASS ) + { + filter_t *flt = filter_init(convert->header,key); + convert->max_unpack |= filter_max_unpack(flt); + fmt->usr = (void*) flt; + } + } + + switch (fmt->type) + { + case T_FIRST_ALT: fmt->handler = &process_first_alt; break; + case T_CHROM_POS_ID: fmt->handler = &process_chrom_pos_id; break; + case T_GT_TO_PROB3: fmt->handler = &process_gt_to_prob3; break; + case T_PL_TO_PROB3: fmt->handler = &process_pl_to_prob3; break; + case T_GP_TO_PROB3: fmt->handler = &process_gp_to_prob3; break; + case T_CHROM: fmt->handler = &process_chrom; break; + case T_POS: fmt->handler = &process_pos; break; + case T_POS0: fmt->handler = &process_pos0; break; + case T_END: fmt->handler = &process_end; convert->max_unpack |= BCF_UN_INFO; break; + case T_END0: fmt->handler = &process_end0; convert->max_unpack |= BCF_UN_INFO; break; + case T_ID: fmt->handler = &process_id; break; + case T_REF: fmt->handler = &process_ref; break; + case T_ALT: fmt->handler = &process_alt; break; + case T_QUAL: fmt->handler = &process_qual; break; + case T_FILTER: fmt->handler = &process_filter; convert->max_unpack |= BCF_UN_FLT; break; + case T_INFO: fmt->handler = &process_info; convert->max_unpack |= BCF_UN_INFO; break; + case T_FORMAT: fmt->handler = fmt->key ? &process_format : &process_complete_format; convert->max_unpack |= BCF_UN_FMT; break; + case T_SAMPLE: fmt->handler = &process_sample; break; + case T_SEP: fmt->handler = &process_sep; break; + case T_IS_TS: fmt->handler = &process_is_ts; break; + case T_TYPE: fmt->handler = &process_type; break; + case T_MASK: fmt->handler = NULL; break; + case T_GT: fmt->handler = &process_gt; convert->max_unpack |= BCF_UN_FMT; break; + case T_TGT: fmt->handler = &process_tgt; convert->max_unpack |= BCF_UN_FMT; break; + case T_IUPAC_GT: fmt->handler = &process_iupac_gt; convert->max_unpack |= BCF_UN_FMT; break; + case T_GT_TO_HAP: fmt->handler = &process_gt_to_hap; convert->max_unpack |= BCF_UN_FMT; break; + case T_GT_TO_HAP2: fmt->handler = &process_gt_to_hap2; convert->max_unpack |= BCF_UN_FMT; break; + case T_TBCSQ: fmt->handler = &process_tbcsq; fmt->destroy = &destroy_tbcsq; convert->max_unpack |= BCF_UN_FMT; break; + case T_LINE: fmt->handler = &process_line; convert->max_unpack |= BCF_UN_FMT; break; + case T_RSX: fmt->handler = &process_rsid_hex; break; + case T_VKX: fmt->handler = &process_variantkey_hex; break; + case T_PBINOM: fmt->handler = &process_pbinom; convert->max_unpack |= BCF_UN_FMT; break; + case T_NPASS: fmt->handler = &process_npass; fmt->destroy = &destroy_npass; break; + default: error("TODO: handler for type %d\n", fmt->type); + } + if ( key && fmt->type==T_INFO ) + { + fmt->id = bcf_hdr_id2int(convert->header, BCF_DT_ID, key); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_INFO,fmt->id) ) + { + fmt->id = -1; + convert->undef_info_tag = strdup(key); + } + } + return fmt; +} + +static int parse_subscript(char **p) +{ + char *q = *p; + if ( *q!='{' ) return -1; + q++; + while ( *q && *q!='}' && isdigit(*q) ) q++; + if ( *q!='}' ) return -1; + int idx = atoi((*p)+1); + *p = q+1; + return idx; +} + +static char *parse_tag(convert_t *convert, char *p, int is_gtf) +{ + char *q = ++p; + while ( *q && (isalnum(*q) || *q=='_' || *q=='.') ) q++; + kstring_t str = {0,0,0}; + if ( q-p==0 ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p, &str); + if ( is_gtf ) + { + if ( !strcmp(str.s, "SAMPLE") ) register_tag(convert, "SAMPLE", is_gtf, T_SAMPLE); + else if ( !strcmp(str.s, "GT") ) register_tag(convert, "GT", is_gtf, T_GT); + else if ( !strcmp(str.s, "TGT") ) register_tag(convert, "GT", is_gtf, T_TGT); + else if ( !strcmp(str.s, "TBCSQ") ) + { + fmt_t *fmt = register_tag(convert, "BCSQ", is_gtf, T_TBCSQ); + fmt->subscript = parse_subscript(&q); + if ( fmt->subscript==-1 ) + { + if ( !strncmp(q,"{*}",3) ) { fmt->subscript = 0; q += 3; } + } + else fmt->subscript++; + } + else if ( !strcmp(str.s, "IUPACGT") ) register_tag(convert, "GT", is_gtf, T_IUPAC_GT); + else if ( !strcmp(str.s, "INFO") ) + { + if ( *q!='/' ) + { + int id = bcf_hdr_id2int(convert->header, BCF_DT_ID, str.s); + if ( bcf_hdr_idinfo_exists(convert->header,BCF_HL_INFO,id) ) + error("Could not parse format string \"%s\". Did you mean %%INFO/%s?\n", convert->format_str,str.s); + else + error("Could not parse format string: %s\n", convert->format_str); + } + p = ++q; + str.l = 0; + while ( *q && (isalnum(*q) || *q=='_' || *q=='.') ) q++; + if ( q-p==0 ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p, &str); + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_INFO); + fmt->subscript = parse_subscript(&q); + _used_tags_add(convert,T_INFO,str.s); + } + else if ( !strcmp(str.s,"PBINOM") ) + { + if ( *q!='(' ) error("Could not parse the expression: %s\n", convert->format_str); + p = ++q; + str.l = 0; + while ( *q && *q!=')' ) q++; + if ( q-p==0 ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p, &str); + register_tag(convert, str.s, is_gtf, T_PBINOM); + q++; + } + else if ( !strcmp(str.s,"N_PASS") ) + error("N_PASS() must be placed outside the square brackets\n"); + else + { + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_FORMAT); + fmt->subscript = parse_subscript(&q); + } + } + else + { + _SET_NON_FORMAT_TAGS(register_tag, str.s, convert, str.s, is_gtf) + else if ( !strcmp(str.s, "ALT") ) + { + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_ALT); + fmt->subscript = parse_subscript(&q); + } + else if ( !strcmp(str.s, "_CHROM_POS_ID") ) register_tag(convert, str.s, is_gtf, T_CHROM_POS_ID); + else if ( !strcmp(str.s, "_GT_TO_PROB3") ) register_tag(convert, str.s, is_gtf, T_GT_TO_PROB3); + else if ( !strcmp(str.s, "_PL_TO_PROB3") ) register_tag(convert, str.s, is_gtf, T_PL_TO_PROB3); + else if ( !strcmp(str.s, "_GP_TO_PROB3") ) register_tag(convert, str.s, is_gtf, T_GP_TO_PROB3); + else if ( !strcmp(str.s, "_GT_TO_HAP") ) register_tag(convert, str.s, is_gtf, T_GT_TO_HAP); + else if ( !strcmp(str.s, "_GT_TO_HAP2") ) register_tag(convert, str.s, is_gtf, T_GT_TO_HAP2); + else if ( !strcmp(str.s, "RSX") ) register_tag(convert, str.s, is_gtf, T_RSX); + else if ( !strcmp(str.s, "VKX") ) register_tag(convert, str.s, is_gtf, T_VKX); + else if ( !strcmp(str.s,"PBINOM") ) error("Error: PBINOM() is currently supported only with FORMAT tags. (todo)\n"); + else if ( !strcmp(str.s, "INFO") ) + { + if ( *q=='/' ) + { + p = ++q; + str.l = 0; + while ( *q && (isalnum(*q) || *q=='_' || *q=='.') ) q++; + if ( q-p==0 ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p, &str); + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_INFO); + fmt->subscript = parse_subscript(&q); + _used_tags_add(convert,T_INFO,str.s); + } + else + register_tag(convert, NULL, is_gtf, T_INFO); // the whole INFO + } + else if ( !strcmp(str.s, "FORMAT") ) + register_tag(convert, NULL, 0, T_FORMAT); + else if ( !strcmp(str.s,"N_PASS") ) + { + if ( *q!='(' ) error("Could not parse the expression: %s\n", convert->format_str); + p = ++q; + str.l = 0; + int nopen = 1; + while ( *q && nopen ) + { + if ( *q=='(' ) nopen++; + else if ( *q==')' ) nopen--; + q++; + } + if ( q-p==0 || nopen ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p-1, &str); + register_tag(convert, str.s, is_gtf, T_NPASS); + } + else + { + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_INFO); + fmt->subscript = parse_subscript(&q); + _used_tags_add(convert,T_INFO,str.s); + } + } + free(str.s); + return q; +} + +static char *parse_sep(convert_t *convert, char *p, int is_gtf) +{ + char *q = p; + kstring_t str = {0,0,0}; + while ( *q && *q!='[' && *q!=']' && *q!='%' ) + { + if ( *q=='\\' ) + { + q++; + if ( *q=='n' ) kputc('\n', &str); + else if ( *q=='t' ) kputc('\t', &str); + else kputc(*q, &str); + } + else kputc(*q, &str); + q++; + } + if ( !str.l ) error("Could not parse format string: %s\n", convert->format_str); + register_tag(convert, str.s, is_gtf, T_SEP); + free(str.s); + return q; +} + +convert_t *convert_init(bcf_hdr_t *hdr, int *samples, int nsamples, const char *format_str) +{ + convert_t *convert = (convert_t*) calloc(1,sizeof(convert_t)); + convert->header = hdr; + convert->format_str = strdup(format_str); + convert->max_unpack = BCF_UN_STR; + convert->used_tags_hash = khash_str2int_init(); + + int i, is_gtf = 0; + char *p = convert->format_str; + while ( *p ) + { + //fprintf(stderr,"<%s>\n", p); + switch (*p) + { + case '[': is_gtf = 1; p++; break; + case ']': is_gtf = 0; register_tag(convert, NULL, 0, T_SEP); p++; break; + case '%': p = parse_tag(convert, p, is_gtf); break; + default: p = parse_sep(convert, p, is_gtf); break; + } + } + if ( is_gtf ) + error("Could not parse the format string, missing the square bracket \"]\": %s\n", convert->format_str); + + if ( nsamples ) + { + convert->nsamples = nsamples; + convert->samples = (int*) malloc(sizeof(int)*nsamples); + for (i=0; insamples; i++) convert->samples[i] = samples[i]; + } + else + { + convert->nsamples = bcf_hdr_nsamples(convert->header); + convert->samples = (int*) malloc(sizeof(int)*convert->nsamples); + for (i=0; insamples; i++) convert->samples[i] = i; + } + return convert; +} + +void convert_destroy(convert_t *convert) +{ + int i; + for (i=0; infmt; i++) + { + if ( convert->fmt[i].destroy ) convert->fmt[i].destroy(convert->fmt[i].usr); + free(convert->fmt[i].key); + } + if ( convert->nused_tags ) + { + for (i=0; inused_tags; i++) free(convert->used_tags_list[i]); + free(convert->used_tags_list); + } + khash_str2int_destroy(convert->used_tags_hash); + free(convert->fmt); + free(convert->undef_info_tag); + free(convert->dat); + free(convert->samples); + free(convert->format_str); + free(convert); +} + + +int convert_header(convert_t *convert, kstring_t *str) +{ + int i, icol = 0, l_ori = str->l; + bcf_hdr_t *hdr = convert->header; + + // Supress the header output if LINE is present + for (i=0; infmt; i++) + if ( convert->fmt[i].type == T_LINE ) break; + if ( i!=convert->nfmt ) + return str->l - l_ori; + + kputs("# ", str); + for (i=0; infmt; i++) + { + // Genotype fields + if ( convert->fmt[i].is_gt_field ) + { + int j = i, js, k; + while ( convert->fmt[j].is_gt_field ) j++; + for (js=0; jsnsamples; js++) + { + int ks = convert->samples[js]; + for (k=i; kfmt[k].type == T_SEP ) + { + if ( convert->fmt[k].key ) kputs(convert->fmt[k].key, str); + } + else if ( convert->fmt[k].type == T_SAMPLE ) + ksprintf(str, "[%d]%s", ++icol, convert->fmt[k].key); + else + ksprintf(str, "[%d]%s:%s", ++icol, hdr->samples[ks], convert->fmt[k].key); + } + } + i = j-1; + continue; + } + // Fixed fields + if ( convert->fmt[i].type == T_SEP ) + { + if ( convert->fmt[i].key ) kputs(convert->fmt[i].key, str); + continue; + } + ksprintf(str, "[%d]%s", ++icol, convert->fmt[i].key); + } + return str->l - l_ori; +} + +int convert_line(convert_t *convert, bcf1_t *line, kstring_t *str) +{ + if ( !convert->allow_undef_tags && convert->undef_info_tag ) + { + kstring_t msg = {0,0,0}; + ksprintf(&msg,"Error: no such tag defined in the VCF header: INFO/%s", convert->undef_info_tag); + + int hdr_id = bcf_hdr_id2int(convert->header,BCF_DT_ID,convert->undef_info_tag); + if ( hdr_id>=0 && bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,hdr_id) ) + ksprintf(&msg,". FORMAT fields must be enclosed in square brackets, e.g. \"[ %%%s]\"", convert->undef_info_tag); + error("%s\n", msg.s); + } + + int l_ori = str->l; + bcf_unpack(line, convert->max_unpack); + + int i, ir; + str->l = 0; + for (i=0; infmt; i++) + { + // Genotype fields. + if ( convert->fmt[i].is_gt_field ) + { + int j = i, js, k; + while ( jnfmt && convert->fmt[j].is_gt_field ) + { + convert->fmt[j].ready = 0; + j++; + } + for (js=0; jsnsamples; js++) + { + // Skip samples when filtering was requested + int ks = convert->samples[js]; + if ( convert->subset_samples && *convert->subset_samples && !(*convert->subset_samples)[ks] ) continue; + + // Here comes a hack designed for TBCSQ. When running on large files, + // such as 1000GP, there are too many empty fields in the output and + // it's very very slow. Therefore in case the handler does not add + // anything to the string, we trim all genotype fields enclosed in square + // brackets here. This may be changed in future, time will show... + size_t l_start = str->l; + + for (k=i; kfmt[k].type == T_MASK ) + { + for (ir=0; irnreaders; ir++) + kputc(bcf_sr_has_line(convert->readers,ir)?'1':'0', str); + } + else if ( convert->fmt[k].handler ) + { + size_t l = str->l; + convert->fmt[k].handler(convert, line, &convert->fmt[k], ks, str); + if ( l==str->l ) { str->l = l_start; break; } // only TBCSQ does this + } + } + } + i = j-1; + continue; + } + // Fixed fields + if ( convert->fmt[i].type == T_MASK ) + { + for (ir=0; irnreaders; ir++) + kputc(bcf_sr_has_line(convert->readers,ir)?'1':'0', str); + } + else if ( convert->fmt[i].handler ) + convert->fmt[i].handler(convert, line, &convert->fmt[i], -1, str); + + } + return str->l - l_ori; +} + +int convert_set_option(convert_t *convert, enum convert_option opt, ...) +{ + int ret = 0; + va_list args; + + va_start(args, opt); + switch (opt) + { + case allow_undef_tags: + convert->allow_undef_tags = va_arg(args, int); + break; + case subset_samples: + convert->subset_samples = va_arg(args, uint8_t**); + break; + default: + ret = -1; + } + va_end(args); + return ret; +} + +int convert_max_unpack(convert_t *convert) +{ + return convert->max_unpack; +} + +int convert_is_tag_used(convert_t *convert, char *tag) +{ + return khash_str2int_has_key(convert->used_tags_hash, tag); +} +const char **convert_list_used_tags(convert_t *convert, int *ntags) +{ + *ntags = convert->nused_tags; + return (const char **)convert->used_tags_list; +} + diff --git a/bcftools/convert.c.pysam.c b/bcftools/convert.c.pysam.c new file mode 100644 index 0000000..6b9e851 --- /dev/null +++ b/bcftools/convert.c.pysam.c @@ -0,0 +1,1711 @@ +#include "bcftools.pysam.h" + +/* convert.c -- functions for converting between VCF/BCF and related formats. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define __STDC_FORMAT_MACROS +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "variantkey.h" +#include "convert.h" +#include "filter.h" + +#define T_CHROM 1 +#define T_POS 2 +#define T_ID 3 +#define T_REF 4 +#define T_ALT 5 +#define T_QUAL 6 +#define T_FILTER 7 +#define T_INFO 8 +#define T_FORMAT 9 +#define T_SAMPLE 10 +#define T_SEP 11 +#define T_IS_TS 12 +#define T_TYPE 13 +#define T_MASK 14 +#define T_GT 15 +#define T_TGT 16 +#define T_LINE 17 +#define T_CHROM_POS_ID 18 // not publicly advertised +#define T_GT_TO_PROB3 19 // not publicly advertised +#define T_PL_TO_PROB3 20 // not publicly advertised +#define T_GP_TO_PROB3 21 // not publicly advertised +#define T_FIRST_ALT 22 // not publicly advertised +#define T_IUPAC_GT 23 +#define T_GT_TO_HAP 24 // not publicly advertised +#define T_GT_TO_HAP2 25 // not publicly advertised +#define T_TBCSQ 26 +#define T_END 27 +#define T_POS0 28 +#define T_END0 29 +#define T_RSX 30 // RSID HEX +#define T_VKX 31 // VARIANTKEY HEX +#define T_PBINOM 32 +#define T_NPASS 33 + +typedef struct _fmt_t +{ + int type, id, is_gt_field, ready, subscript; + char *key; + bcf_fmt_t *fmt; + void *usr; // user data (optional) + void (*handler)(convert_t *, bcf1_t *, struct _fmt_t *, int, kstring_t *); + void (*destroy)(void*); // clean user data (optional) +} +fmt_t; + +struct _convert_t +{ + fmt_t *fmt; + int nfmt, mfmt; + int nsamples, *samples; + bcf_hdr_t *header; + int max_unpack; + char *format_str; + bcf_srs_t *readers; // required only for %MASK + int nreaders; + void *dat; + int ndat; + char *undef_info_tag; + void *used_tags_hash; + char **used_tags_list; + int nused_tags; + int allow_undef_tags; + uint8_t **subset_samples; +}; + +typedef struct +{ + kstring_t hap1,hap2; + char **str; + int n, m; +} +bcsq_t; + +static void process_chrom(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputs(convert->header->id[BCF_DT_CTG][line->rid].key, str); } +static void process_pos(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputw(line->pos+1, str); } +static void process_pos0(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputw(line->pos, str); } +static void process_end(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputw(line->pos+line->rlen, str); } +static void process_end0(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputw(line->pos+line->rlen-1, str); } +static void process_id(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputs(line->d.id, str); } +static void process_ref(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { kputs(line->d.allele[0], str); } +static void process_alt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i; + if ( line->n_allele==1 ) + { + kputc('.', str); + return; + } + if ( fmt->subscript>=0 ) + { + if ( line->n_allele > fmt->subscript+1 ) + kputs(line->d.allele[fmt->subscript+1], str); + else + kputc('.', str); + return; + } + for (i=1; in_allele; i++) + { + if ( i>1 ) kputc(',', str); + kputs(line->d.allele[i], str); + } +} +static void process_first_alt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( line->n_allele==1 ) + kputc('.', str); + else + kputs(line->d.allele[1], str); +} +static void process_qual(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( bcf_float_is_missing(line->qual) ) kputc('.', str); + else kputd(line->qual, str); +} +static void process_filter(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i; + if ( line->d.n_flt ) + { + for (i=0; id.n_flt; i++) + { + if (i) kputc(';', str); + kputs(convert->header->id[BCF_DT_ID][line->d.flt[i]].key, str); + } + } + else kputc('.', str); +} +static inline int32_t bcf_array_ivalue(void *bcf_array, int type, int idx) +{ + if ( type==BCF_BT_INT8 ) + { + int8_t val = ((int8_t*)bcf_array)[idx]; + if ( val==bcf_int8_missing ) return bcf_int32_missing; + if ( val==bcf_int8_vector_end ) return bcf_int32_vector_end; + return val; + } + if ( type==BCF_BT_INT16 ) + { + int16_t val = ((int16_t*)bcf_array)[idx]; + if ( val==bcf_int16_missing ) return bcf_int32_missing; + if ( val==bcf_int16_vector_end ) return bcf_int32_vector_end; + return val; + } + return ((int32_t*)bcf_array)[idx]; +} +static inline void _copy_field(char *src, uint32_t len, int idx, kstring_t *str) +{ + int n = 0, ibeg = 0; + while ( src[ibeg] && ibegibeg ) + kputsn(src+ibeg, iend-ibeg, str); + else + kputc('.', str); +} +static void process_info(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i; + if ( !fmt->key ) // the whole INFO column + { + int first = 1; + for (i=0; in_info; i++) + { + bcf_info_t *inf = &line->d.info[i]; + if ( !inf->vptr ) continue; + if ( !first ) kputc(';', str); + first = 0; + if ( inf->key >= convert->header->n[BCF_DT_ID] ) continue; + kputs(convert->header->id[BCF_DT_ID][inf->key].key, str); + if ( inf->len <= 0 ) continue; + kputc('=', str); + if ( inf->len == 1 ) + { + switch (inf->type) + { + case BCF_BT_INT8: if ( inf->v1.i==bcf_int8_missing ) kputc('.', str); else kputw(inf->v1.i, str); break; + case BCF_BT_INT16: if ( inf->v1.i==bcf_int16_missing ) kputc('.', str); else kputw(inf->v1.i, str); break; + case BCF_BT_INT32: if ( inf->v1.i==bcf_int32_missing ) kputc('.', str); else kputw(inf->v1.i, str); break; + case BCF_BT_FLOAT: if ( bcf_float_is_missing(inf->v1.f) ) kputc('.', str); else kputd(inf->v1.f, str); break; + case BCF_BT_CHAR: kputc(inf->v1.i, str); break; + default: error("Unexpected type %d", inf->type); break; + } + } + else bcf_fmt_array(str, inf->len, inf->type, inf->vptr); + } + if ( first ) kputc('.', str); + return; + } + + if ( fmt->id<0 ) + { + kputc('.', str); + return; + } + + for (i=0; in_info; i++) + if ( line->d.info[i].key == fmt->id ) break; + + // output "." if the tag is not present + if ( i==line->n_info ) + { + kputc('.', str); + return; + } + + bcf_info_t *info = &line->d.info[i]; + + // if this is a flag, output 1 + if ( info->len <=0 ) + { + kputc('1', str); + return; + } + + if ( info->len == 1 ) + { + switch (info->type) + { + case BCF_BT_INT8: if ( info->v1.i==bcf_int8_missing ) kputc('.', str); else kputw(info->v1.i, str); break; + case BCF_BT_INT16: if ( info->v1.i==bcf_int16_missing ) kputc('.', str); else kputw(info->v1.i, str); break; + case BCF_BT_INT32: if ( info->v1.i==bcf_int32_missing ) kputc('.', str); else kputw(info->v1.i, str); break; + case BCF_BT_FLOAT: if ( bcf_float_is_missing(info->v1.f) ) kputc('.', str); else kputd(info->v1.f, str); break; + case BCF_BT_CHAR: kputc(info->v1.i, str); break; + default: fprintf(bcftools_stderr,"todo: type %d\n", info->type); bcftools_exit(1); break; + } + } + else if ( fmt->subscript >=0 ) + { + if ( info->len <= fmt->subscript ) + { + kputc('.', str); + return; + } + #define BRANCH(type_t, is_missing, is_vector_end, kprint) { \ + type_t val = ((type_t *) info->vptr)[fmt->subscript]; \ + if ( is_missing || is_vector_end ) kputc('.',str); \ + else kprint; \ + } + switch (info->type) + { + case BCF_BT_INT8: BRANCH(int8_t, val==bcf_int8_missing, val==bcf_int8_vector_end, kputw(val, str)); break; + case BCF_BT_INT16: BRANCH(int16_t, val==bcf_int16_missing, val==bcf_int16_vector_end, kputw(val, str)); break; + case BCF_BT_INT32: BRANCH(int32_t, val==bcf_int32_missing, val==bcf_int32_vector_end, kputw(val, str)); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(val), bcf_float_is_vector_end(val), kputd(val, str)); break; + case BCF_BT_CHAR: _copy_field((char*)info->vptr, info->vptr_len, fmt->subscript, str); break; + default: fprintf(bcftools_stderr,"todo: type %d\n", info->type); bcftools_exit(1); break; + } + #undef BRANCH + } + else + bcf_fmt_array(str, info->len, info->type, info->vptr); +} +static void init_format(convert_t *convert, bcf1_t *line, fmt_t *fmt) +{ + fmt->id = bcf_hdr_id2int(convert->header, BCF_DT_ID, fmt->key); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,fmt->id) ) fmt->id = -1; + fmt->fmt = NULL; + if ( fmt->id >= 0 ) + { + int i; + for (i=0; i<(int)line->n_fmt; i++) + if ( line->d.fmt[i].id==fmt->id ) { fmt->fmt = &line->d.fmt[i]; break; } + } + else if ( !convert->allow_undef_tags ) + error("Error: no such tag defined in the VCF header: FORMAT/%s\n", fmt->key); + + fmt->ready = 1; +} +static void process_complete_format(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( convert->nsamples ) + { + int i,j; + if ( line->n_fmt) + { + int gt_i = -1; + bcf_fmt_t *fmt = line->d.fmt; + int first = 1; + for (i=0; i<(int)line->n_fmt; i++) + { + if ( !fmt[i].p || fmt[i].id<0 ) continue; + if ( !first ) kputc(':', str); + first = 0; + kputs(convert->header->id[BCF_DT_ID][fmt[i].id].key, str); + if ( strcmp(convert->header->id[BCF_DT_ID][fmt[i].id].key, "GT") == 0) gt_i = i; + } + if ( first ) kputc('.', str); + for (j=0; jnsamples; j++) + { + kputc('\t', str); + first = 1; + for (i=0; i<(int)line->n_fmt; i++) + { + bcf_fmt_t *f = &fmt[i]; + if ( !f->p ) continue; + if ( !first ) kputc(':', str); + first = 0; + if (gt_i == i) + bcf_format_gt(f,convert->samples[j],str); + else + bcf_fmt_array(str, f->n, f->type, f->p + convert->samples[j] * f->size); + } + if ( first ) kputc('.', str); + } + } + else + for (j=0; j<=line->n_sample; j++) + kputs("\t.", str); + } + else + kputc('.',str); +} +static void process_format(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + init_format(convert, line, fmt); + + if ( fmt->fmt==NULL ) + { + kputc('.', str); + return; + } + else if ( fmt->subscript >=0 ) + { + if ( fmt->fmt->n <= fmt->subscript ) + { + kputc('.', str); + return; + } + if ( fmt->fmt->type == BCF_BT_FLOAT ) + { + float *ptr = (float*)(fmt->fmt->p + isample*fmt->fmt->size); + if ( bcf_float_is_missing(ptr[fmt->subscript]) || bcf_float_is_vector_end(ptr[fmt->subscript]) ) + kputc('.', str); + else + kputd(ptr[fmt->subscript], str); + } + else if ( fmt->fmt->type != BCF_BT_CHAR ) + { + int32_t ival = bcf_array_ivalue(fmt->fmt->p+isample*fmt->fmt->size,fmt->fmt->type,fmt->subscript); + if ( ival==bcf_int32_missing || ival==bcf_int32_vector_end ) + kputc('.', str); + else + kputw(ival, str); + } + else if ( fmt->fmt->type == BCF_BT_CHAR ) + _copy_field((char*)(fmt->fmt->p + isample*fmt->fmt->size), fmt->fmt->size, fmt->subscript, str); + else error("TODO: %s:%d .. fmt->type=%d\n", __FILE__,__LINE__, fmt->fmt->type); + } + else + bcf_fmt_array(str, fmt->fmt->n, fmt->fmt->type, fmt->fmt->p + isample*fmt->fmt->size); +} +static void process_gt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + init_format(convert, line, fmt); + + if ( fmt->fmt==NULL ) + { + kputc('.', str); + return; + } + bcf_format_gt(fmt->fmt, isample, str); +} +static void process_tgt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + init_format(convert, line, fmt); + + if ( fmt->fmt==NULL ) + { + kputc('.', str); + return; + } + + assert( fmt->fmt->type==BCF_BT_INT8 ); + + int l; + int8_t *x = (int8_t*)(fmt->fmt->p + isample*fmt->fmt->size); // FIXME: does not work with n_alt >= 64 + for (l = 0; l < fmt->fmt->n && x[l] != bcf_int8_vector_end; ++l) + { + if (l) kputc("/|"[x[l]&1], str); + if (x[l]>>1) + { + int ial = (x[l]>>1) - 1; + kputs(line->d.allele[ial], str); + } + else + kputc('.', str); + } + if (l == 0) kputc('.', str); +} +static void destroy_tbcsq(void *usr) +{ + if ( !usr ) return; + bcsq_t *csq = (bcsq_t*) usr; + free(csq->hap1.s); + free(csq->hap2.s); + if ( csq->n ) + free(csq->str[0]); + free(csq->str); + free(csq); +} +static void process_tbcsq(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + { + init_format(convert, line, fmt); + + bcsq_t *csq; + if ( fmt->usr ) + { + csq = (bcsq_t*) fmt->usr; + if ( csq->n ) + free(csq->str[0]); + csq->n = 0; + } + else + csq = (bcsq_t*) calloc(1,sizeof(bcsq_t)); + fmt->usr = csq; + + int i=0, len = 0; + char *tmp = NULL; + if ( bcf_get_info_string(convert->header,line,fmt->key,&tmp,&len)<0 ) + { + csq->n = 0; + return; + } + do + { + csq->n++; + hts_expand(char*, csq->n, csq->m, csq->str); + csq->str[ csq->n-1 ] = tmp + i; + while ( iusr; + + if ( fmt->fmt==NULL || !csq->n ) return; + + csq->hap1.l = 0; + csq->hap2.l = 0; + + int mask = fmt->subscript==0 ? 3 : 1; // merge both haplotypes if subscript==0 + + #define BRANCH(type_t, nbits) { \ + type_t *x = (type_t*)(fmt->fmt->p + isample*fmt->fmt->size); \ + int i,j; \ + if ( fmt->subscript<=0 || fmt->subscript==1 ) \ + { \ + for (j=0; j < fmt->fmt->n; j++) \ + { \ + type_t val = x[j]; \ + if ( !val ) continue; \ + for (i=0; istr[(j*30+i)/2], &csq->hap1); kputc_(',', &csq->hap1); } \ + } \ + } \ + if ( fmt->subscript<0 || fmt->subscript==2 ) \ + { \ + for (j=0; j < fmt->fmt->n; j++) \ + { \ + type_t val = x[j]; \ + if ( !val ) continue; \ + for (i=1; istr[(j*30+i)/2], &csq->hap2); kputc_(',', &csq->hap2); } \ + } \ + } \ + } + switch (fmt->fmt->type) + { + case BCF_BT_INT8: BRANCH(uint8_t, 8); break; + case BCF_BT_INT16: BRANCH(uint16_t,16); break; + case BCF_BT_INT32: BRANCH(uint32_t,30); break; // 2 bytes unused to account for the reserved BCF values + default: error("Unexpected type: %d\n", fmt->fmt->type); bcftools_exit(1); break; + } + #undef BRANCH + + if ( !csq->hap1.l && !csq->hap2.l ) return; + + if ( csq->hap1.l ) csq->hap1.s[--csq->hap1.l] = 0; + if ( csq->hap2.l ) csq->hap2.s[--csq->hap2.l] = 0; + + if ( fmt->subscript<0 ) + { + kputs(csq->hap1.l?csq->hap1.s:".", str); + kputc_('\t', str); + kputs(csq->hap2.l?csq->hap2.s:".", str); + } + else if ( fmt->subscript<2 ) + kputs(csq->hap1.l?csq->hap1.s:".", str); + else + kputs(csq->hap2.l?csq->hap2.s:".", str); +} +static void init_format_iupac(convert_t *convert, bcf1_t *line, fmt_t *fmt) +{ + init_format(convert, line, fmt); + if ( fmt->fmt==NULL ) return; + + // Init mapping between alleles and IUPAC table + hts_expand(uint8_t, line->n_allele, convert->ndat, convert->dat); + int8_t *dat = (int8_t*)convert->dat; + int i; + for (i=0; in_allele; i++) + { + if ( line->d.allele[i][1] ) dat[i] = -1; + else + { + switch (line->d.allele[i][0]) + { + case 'A': dat[i] = 0; break; + case 'C': dat[i] = 1; break; + case 'G': dat[i] = 2; break; + case 'T': dat[i] = 3; break; + case 'a': dat[i] = 0; break; + case 'c': dat[i] = 1; break; + case 'g': dat[i] = 2; break; + case 't': dat[i] = 3; break; + default: dat[i] = -1; + } + } + } +} +static void process_iupac_gt(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( !fmt->ready ) + init_format_iupac(convert, line, fmt); + + if ( fmt->fmt==NULL ) + { + kputc('.', str); + return; + } + + assert( fmt->fmt->type==BCF_BT_INT8 ); + + static const char iupac[4][4] = { {'A','M','R','W'},{'M','C','S','Y'},{'R','S','G','K'},{'W','Y','K','T'} }; + int8_t *dat = (int8_t*)convert->dat; + + int8_t *x = (int8_t*)(fmt->fmt->p + isample*fmt->fmt->size); // FIXME: does not work with n_alt >= 64 + int l = 0; + while ( lfmt->n && x[l]!=bcf_int8_vector_end && x[l]!=bcf_int8_missing ) l++; + + if ( l==2 ) + { + // diploid + int ia = (x[0]>>1) - 1, ib = (x[1]>>1) - 1; + if ( ia>=0 && ian_allele && ib>=0 && ibn_allele && dat[ia]>=0 && dat[ib]>=0 ) + { + kputc(iupac[dat[ia]][dat[ib]], str); + return; + } + } + for (l = 0; l < fmt->fmt->n && x[l] != bcf_int8_vector_end; ++l) + { + if (l) kputc("/|"[x[l]&1], str); + if (x[l]>>1) + { + int ial = (x[l]>>1) - 1; + kputs(line->d.allele[ial], str); + } + else + kputc('.', str); + } + if (l == 0) kputc('.', str); +} +static void process_sample(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + kputs(convert->header->samples[isample], str); +} +static void process_sep(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) { if (fmt->key) kputs(fmt->key, str); } +static void process_is_ts(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int is_ts = 0; + if ( bcf_get_variant_types(line) & (VCF_SNP|VCF_MNP) ) + is_ts = abs(bcf_acgt2int(*line->d.allele[0])-bcf_acgt2int(*line->d.allele[1])) == 2 ? 1 : 0; + kputc(is_ts ? '1' : '0', str); +} +static void process_type(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int line_type = bcf_get_variant_types(line); + int i = 0; + if ( line_type == VCF_REF ) { kputs("REF", str); i++; } + if ( line_type & VCF_SNP ) { if (i) kputc(',',str); kputs("SNP", str); i++; } + if ( line_type & VCF_MNP ) { if (i) kputc(',',str); kputs("MNP", str); i++; } + if ( line_type & VCF_INDEL ) { if (i) kputc(',',str); kputs("INDEL", str); i++; } + if ( line_type & VCF_OTHER ) { if (i) kputc(',',str); kputs("OTHER", str); i++; } + if ( line_type & VCF_BND ) { if (i) kputc(',',str); kputs("BND", str); i++; } + if ( line_type & VCF_OVERLAP ) { if (i) kputc(',',str); kputs("OVERLAP", str); i++; } +} +static void process_line(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + vcf_format1(convert->header, line, str); +} +static void process_chrom_pos_id(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + if ( line->d.id[0]!='.' || line->d.id[1] ) + { + // ID is present + kputs(line->d.id, str); + } + else + { + // use CHROM:POS instead of ID + kputs(convert->header->id[BCF_DT_CTG][line->rid].key, str); + kputc(':', str); + kputw(line->pos+1, str); + } +} +static void process_gt_to_prob3(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int m,n,i; + + m = convert->ndat / sizeof(int32_t); + n = bcf_get_genotypes(convert->header,line,&convert->dat,&m); + convert->ndat = m * sizeof(int32_t); + + if ( n<=0 ) + { + // Throw an error or silently proceed? + // + // for (i=0; insamples; i++) kputs(" 0.33 0.33 0.33", str); + // return; + + error("Error parsing GT tag at %s:%"PRId64"\n", bcf_seqname(convert->header,line),(int64_t) line->pos+1); + } + + n /= convert->nsamples; + for (i=0; insamples; i++) + { + int32_t *ptr = (int32_t*)convert->dat + i*n; + int j; + for (j=0; jndat / sizeof(int32_t); + n = bcf_get_format_int32(convert->header,line,"PL",&convert->dat,&m); + convert->ndat = m * sizeof(int32_t); + + if ( n<=0 ) + { + // Throw an error or silently proceed? + // + // for (i=0; insamples; i++) kputs(" 0.33 0.33 0.33", str); + // return; + + error("Error parsing PL tag at %s:%"PRId64"\n", bcf_seqname(convert->header,line),(int64_t) line->pos+1); + } + + n /= convert->nsamples; + for (i=0; insamples; i++) + { + int32_t *ptr = (int32_t*)convert->dat + i*n; + int j; + float sum = 0; + for (j=0; jn_allele ) + { + // haploid + kputc(' ',str); + ksprintf(str,"%f",pow(10,-0.1*ptr[0])/sum); + kputs(" 0 ", str); + ksprintf(str,"%f",pow(10,-0.1*ptr[1])/sum); + } + else + { + // diploid + kputc(' ',str); + ksprintf(str,"%f",pow(10,-0.1*ptr[0])/sum); + kputc(' ',str); + ksprintf(str,"%f",pow(10,-0.1*ptr[1])/sum); + kputc(' ',str); + ksprintf(str,"%f",pow(10,-0.1*ptr[2])/sum); + } + } +} +static void process_gp_to_prob3(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int m,n,i; + + m = convert->ndat / sizeof(float); + n = bcf_get_format_float(convert->header,line,"GP",&convert->dat,&m); + convert->ndat = m * sizeof(float); + + if ( n<=0 ) + { + // Throw an error or silently proceed? + // + // for (i=0; insamples; i++) kputs(" 0.33 0.33 0.33", str); + // return; + + error("Error parsing GP tag at %s:%"PRId64"\n", bcf_seqname(convert->header,line),(int64_t) line->pos+1); + } + + n /= convert->nsamples; + for (i=0; insamples; i++) + { + float *ptr = (float*)convert->dat + i*n; + int j; + for (j=0; j1 ) error("[%s:%"PRId64":%f] GP value outside range [0,1]; bcftools convert expects the VCF4.3+ spec for the GP field encoding genotype posterior probabilities", bcf_seqname(convert->header,line),(int64_t) line->pos+1,ptr[j]); + } + if ( j==line->n_allele ) + ksprintf(str," %f %f %f",ptr[0],0.,ptr[1]); // haploid + else + ksprintf(str," %f %f %f",ptr[0],ptr[1],ptr[2]); // diploid + } +} + +static void process_gt_to_hap(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + // https://mathgen.stats.ox.ac.uk/impute/impute_v2.html#-known_haps_g + + // File containing known haplotypes for the study cohort. The format + // is the same as the output format from IMPUTE2's -phase option: + // five header columns (as in the -g file) followed by two columns + // (haplotypes) per individual. Allowed values in the haplotype + // columns are 0, 1, and ?. + + // If your study dataset is fully phased, you can replace the -g file + // with a -known_haps_g file. This will cause IMPUTE2 to perform + // haploid imputation, although it will still report diploid imputation + // probabilities in the main output file. If any genotypes are missing, + // they can be marked as '? ?' (two question marks separated by one + // space) in the input file. (The program does not allow just one + // allele from a diploid genotype to be missing.) If the reference + // panels are also phased, IMPUTE2 will perform a single, fast + // imputation step rather than its standard MCMC module this is how + // the program imputes into pre-phased GWAS haplotypes. + + // The -known_haps_g file can also be used to specify study + // genotypes that are "partially" phased, in the sense that some + // genotypes are phased relative to a fixed reference point while + // others are not. We anticipate that this will be most useful when + // trying to phase resequencing data onto a scaffold of known + // haplotypes. To mark a known genotype as unphased, place an + // asterisk immediately after each allele, with no space between + // the allele (0/1) and the asterisk (*); e.g., "0* 1*" for a + // heterozygous genotype of unknown phase. + + int i, gt_id = bcf_hdr_id2int(convert->header, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,gt_id) ) + error("FORMAT/GT tag not present at %s:%"PRId64"\n", bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( !(line->unpacked & BCF_UN_FMT) ) bcf_unpack(line, BCF_UN_FMT); + bcf_fmt_t *fmt_gt = NULL; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==gt_id ) { fmt_gt = &line->d.fmt[i]; break; } + if ( !fmt_gt ) + error("FORMAT/GT tag not present at %s:%"PRId64"\n", bcf_seqname(convert->header, line),(int64_t) line->pos+1); + + // Alloc all memory in advance to avoid kput routines. The biggest allowed allele index is 99 + if ( line->n_allele > 100 ) + error("Too many alleles (%d) at %s:%"PRId64"\n", line->n_allele, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( ks_resize(str, str->l+convert->nsamples*8) != 0 ) + error("Could not alloc %" PRIu64 " bytes\n", (uint64_t)(str->l + convert->nsamples*8)); + + if ( fmt_gt->type!=BCF_BT_INT8 ) // todo: use BRANCH_INT if the VCF is valid + error("Uh, too many alleles (%d) or redundant BCF representation at %s:%"PRId64"\n", line->n_allele, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( fmt_gt->n!=1 && fmt_gt->n!=2 ) + error("Uh, ploidy of %d not supported, see %s:%"PRId64"\n", fmt_gt->n, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + + int8_t *ptr = ((int8_t*) fmt_gt->p) - fmt_gt->n; + for (i=0; insamples; i++) + { + ptr += fmt_gt->n; + if ( fmt_gt->n==1 ) // haploid genotypes + { + if ( ptr[0]==2 ) /* 0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else if ( ptr[0]==bcf_int8_missing ) /* . */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( ptr[0]==4 ) /* 1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else + { + kputw(bcf_gt_allele(ptr[0]),str); str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + } + else if ( ptr[0]==2 ) + { + if ( ptr[1]==3 ) /* 0|0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==5 ) /* 0|1 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) /* 0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==2 ) /* 0/0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==4 ) /* 0/1 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_missing(ptr[1]) ) /* 0/. */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_phased(ptr[1]) ) /* 0|x */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = ' '; + } + else /* 0/x */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + } + else if ( ptr[0]==4 ) + { + if ( ptr[1]==3 ) /* 1|0 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==5 ) /* 1|1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) /* 1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==2 ) /* 1/0 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==4 ) /* 1/1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_missing(ptr[1]) ) /* 1/. */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_phased(ptr[1]) ) /* 1|x */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = ' '; + } + else /* 1/x */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + } + else if ( bcf_gt_is_missing(ptr[0]) ) + { + if ( ptr[1]==bcf_int8_vector_end ) + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + } + else if ( ptr[1]==bcf_int8_vector_end ) + { + /* use REF for something else than first ALT */ + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '-'; str->s[str->l++] = ' '; + } + else + { + kputw(bcf_gt_allele(ptr[0]),str); + if ( bcf_gt_is_phased(ptr[1]) ) str->s[str->l++] = '*'; + str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + if ( bcf_gt_is_phased(ptr[1]) ) str->s[str->l++] = '*'; + str->s[str->l++] = ' '; + } + } + str->s[--str->l] = 0; // delete the last space +} +static void process_gt_to_hap2(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + // same as process_gt_to_hap but converts haploid genotypes into diploid + + int i, gt_id = bcf_hdr_id2int(convert->header, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,gt_id) ) + error("FORMAT/GT tag not present at %s:%"PRId64"\n", bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( !(line->unpacked & BCF_UN_FMT) ) bcf_unpack(line, BCF_UN_FMT); + bcf_fmt_t *fmt_gt = NULL; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==gt_id ) { fmt_gt = &line->d.fmt[i]; break; } + if ( !fmt_gt ) + error("FORMAT/GT tag not present at %s:%"PRId64"\n", bcf_seqname(convert->header, line),(int64_t) line->pos+1); + + // Alloc all memory in advance to avoid kput routines. The biggest allowed allele index is 99 + if ( line->n_allele > 100 ) + error("Too many alleles (%d) at %s:%"PRId64"\n", line->n_allele, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + if ( ks_resize(str, str->l+convert->nsamples*8) != 0 ) + error("Could not alloc %" PRIu64 " bytes\n", (uint64_t)(str->l + convert->nsamples*8)); + + if ( fmt_gt->type!=BCF_BT_INT8 ) // todo: use BRANCH_INT if the VCF is valid + error("Uh, too many alleles (%d) or redundant BCF representation at %s:%"PRId64"\n", line->n_allele, bcf_seqname(convert->header, line),(int64_t) line->pos+1); + + int8_t *ptr = ((int8_t*) fmt_gt->p) - fmt_gt->n; + for (i=0; insamples; i++) + { + ptr += fmt_gt->n; + if ( ptr[0]==2 ) + { + if ( ptr[1]==3 ) /* 0|0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==5 ) /* 0|1 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) /* 0 -> 0|0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==2 ) /* 0/0 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==4 ) /* 0/1 */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_missing(ptr[1]) ) /* 0/. */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_phased(ptr[1]) ) /* 0|x */ + { + str->s[str->l++] = '0'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = ' '; + } + else /* 0/x */ + { + str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + } + else if ( ptr[0]==4 ) + { + if ( ptr[1]==3 ) /* 1|0 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==5 ) /* 1|1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) /* 1 -> 1|1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==2 ) /* 1/0 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==4 ) /* 1/1 */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_missing(ptr[1]) ) /* 1/. */ + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( bcf_gt_is_phased(ptr[1]) ) /* 1|x */ + { + str->s[str->l++] = '1'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = ' '; + } + else /* 1/x */ + { + str->s[str->l++] = '1'; str->s[str->l++] = '*'; str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + str->s[str->l++] = '*'; str->s[str->l++] = ' '; + } + } + else if ( bcf_gt_is_missing(ptr[0]) ) + { + str->s[str->l++] = '?'; str->s[str->l++] = ' '; str->s[str->l++] = '?'; str->s[str->l++] = ' '; + } + else if ( ptr[1]==bcf_int8_vector_end ) + { + /* use REF for something else than first ALT */ + str->s[str->l++] = '0'; str->s[str->l++] = ' '; str->s[str->l++] = '0'; str->s[str->l++] = ' '; + } + else + { + kputw(bcf_gt_allele(ptr[0]),str); + if ( bcf_gt_is_phased(ptr[1]) ) str->s[str->l++] = '*'; + str->s[str->l++] = ' '; + kputw(bcf_gt_allele(ptr[1]),str); + if ( bcf_gt_is_phased(ptr[1]) ) str->s[str->l++] = '*'; + str->s[str->l++] = ' '; + } + } + str->s[--str->l] = 0; // delete the last space +} + +static void process_rsid_hex(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + char *ptr = line->d.id; + ptr += 2; // remove 'rs' + ksprintf(str, "%08" PRIx32 "", (uint32_t)strtoul(ptr, NULL, 10)); +} + +static void process_variantkey_hex(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + uint64_t vk = variantkey( + convert->header->id[BCF_DT_CTG][line->rid].key, + strlen(convert->header->id[BCF_DT_CTG][line->rid].key), + line->pos, + line->d.allele[0], + strlen(line->d.allele[0]), + line->d.allele[1], + strlen(line->d.allele[1])); + ksprintf(str, "%016" PRIx64 "", vk); +} + +static void process_npass(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i, nsmpl = 0; + filter_t *flt = (filter_t*) fmt->usr; + const uint8_t *smpl; + filter_test(flt,line,&smpl); + for (i=0; insamples; i++) + if ( smpl[i] ) nsmpl++; + kputd(nsmpl, str); +} +static void destroy_npass(void *usr) +{ + filter_destroy((filter_t*)usr); +} + +static void process_pbinom(convert_t *convert, bcf1_t *line, fmt_t *fmt, int isample, kstring_t *str) +{ + int i; + if ( !fmt->ready ) + { + fmt->fmt = NULL; // AD + fmt->usr = NULL; // GT + + for (i=0; i<(int)line->n_fmt; i++) + if ( line->d.fmt[i].id==fmt->id ) { fmt->fmt = &line->d.fmt[i]; break; } + + // Check that the first field is GT + int gt_id = bcf_hdr_id2int(convert->header, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(convert->header, BCF_HL_FMT, fmt->id) ) error("Error: FORMAT/GT is not defined in the header\n"); + for (i=0; i<(int)line->n_fmt; i++) + if ( line->d.fmt[i].id==gt_id ) { fmt->usr = &line->d.fmt[i]; break; } // it should always be first according to VCF spec, but... + + if ( fmt->usr && line->d.fmt[i].type!=BCF_BT_INT8 ) // skip sites with many alleles + fmt->usr = NULL; + + fmt->ready = 1; + } + bcf_fmt_t *gt_fmt = (bcf_fmt_t*) fmt->usr; + if ( !fmt->fmt || !gt_fmt || gt_fmt->n!=2 ) goto invalid; + + int n[2] = {0,0}; + int8_t *gt = (int8_t*)(gt_fmt->p + isample*gt_fmt->size); + for (i=0; i<2; i++) + { + if ( bcf_gt_is_missing(gt[i]) || gt[i] == bcf_int8_vector_end ) goto invalid; + int al = bcf_gt_allele(gt[i]); + if ( al > line->n_allele || al >= fmt->fmt->n ) goto invalid; + + #define BRANCH(type_t, missing, vector_end) { \ + type_t val = ((type_t *) fmt->fmt->p)[al + isample*fmt->fmt->n]; \ + if ( val==missing || val==vector_end ) goto invalid; \ + else n[i] = val; \ + } + switch (fmt->fmt->type) + { + case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_missing, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_missing, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_missing, bcf_int32_vector_end); break; + default: goto invalid; break; + } + #undef BRANCH + } + + if ( n[0]==n[1] ) kputc(n[0]==0 ? '.':'0', str); + else + { + double pval = n[0] < n[1] ? kf_betai(n[1], n[0] + 1, 0.5) : kf_betai(n[0], n[1] + 1, 0.5); + pval *= 2; + if ( pval>=1 ) pval = 0; // this can happen, machine precision error, eg. kf_betai(1,0,0.5) + else + pval = -4.34294481903*log(pval); + kputd(pval, str); + } + return; + +invalid: + kputc('.', str); +} + +static void _used_tags_add(convert_t *convert, int type, char *key) +{ + kstring_t str = {0,0,0}; + ksprintf(&str,"%s/%s",type==T_INFO?"INFO":"FORMAT",key); + khash_str2int_inc(convert->used_tags_hash,str.s); + convert->nused_tags++; + convert->used_tags_list = (char**)realloc(convert->used_tags_list,sizeof(*convert->used_tags_list)*convert->nused_tags); + convert->used_tags_list[convert->nused_tags-1] = str.s; +} + + +#define _SET_NON_FORMAT_TAGS(function,key,...) \ + if ( !strcmp("CHROM",key) ) { function(__VA_ARGS__, T_CHROM); } \ + else if ( !strcmp("POS",key) ) { function(__VA_ARGS__, T_POS); } \ + else if ( !strcmp("POS0",key) ) { function(__VA_ARGS__, T_POS0); } \ + else if ( !strcmp("END",key) ) { function(__VA_ARGS__, T_END); } \ + else if ( !strcmp("END0",key) ) { function(__VA_ARGS__, T_END0); } \ + else if ( !strcmp("ID",key) ) { function(__VA_ARGS__, T_ID); } \ + else if ( !strcmp("REF",key) ) { function(__VA_ARGS__, T_REF); } \ + else if ( !strcmp("FIRST_ALT",key) ) { function(__VA_ARGS__, T_FIRST_ALT); } \ + else if ( !strcmp("QUAL",key) ) { function(__VA_ARGS__, T_QUAL); } \ + else if ( !strcmp("TYPE",key) ) { function(__VA_ARGS__, T_TYPE); } \ + else if ( !strcmp("FILTER",key) ) { function(__VA_ARGS__, T_FILTER); } \ + else if ( !strcmp("IS_TS",key) ) { function(__VA_ARGS__, T_IS_TS); } \ + else if ( !strcmp("MASK",key) ) { function(__VA_ARGS__, T_MASK); } \ + else if ( !strcmp("LINE",key) ) { function(__VA_ARGS__, T_LINE); } + +static void set_type(fmt_t *fmt, int type) { fmt->type = type; } +static fmt_t *register_tag(convert_t *convert, char *key, int is_gtf, int type) +{ + convert->nfmt++; + if ( convert->nfmt > convert->mfmt ) + { + convert->mfmt += 10; + convert->fmt = (fmt_t*) realloc(convert->fmt, convert->mfmt*sizeof(fmt_t)); + } + fmt_t *fmt = &convert->fmt[ convert->nfmt-1 ]; + fmt->type = type; + fmt->key = key ? strdup(key) : NULL; + fmt->is_gt_field = is_gtf; + fmt->subscript = -1; + fmt->usr = NULL; + fmt->destroy = NULL; + + // Allow non-format tags, such as CHROM, INFO, etc., to appear amongst the format tags. + if ( key ) + { + int id = bcf_hdr_id2int(convert->header, BCF_DT_ID, key); + if ( fmt->type==T_FORMAT && !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,id) ) + { + _SET_NON_FORMAT_TAGS(set_type,key,fmt) + else if ( !strcmp("ALT",key) ) { fmt->type = T_ALT; } + else if ( !strcmp("_CHROM_POS_ID",key) ) { fmt->type = T_CHROM_POS_ID; } + else if ( !strcmp("RSX",key) ) { fmt->type = T_RSX; } + else if ( !strcmp("VKX",key) ) { fmt->type = T_VKX; } + else if ( id>=0 && bcf_hdr_idinfo_exists(convert->header,BCF_HL_INFO,id) ) + { + fmt->type = T_INFO; + _used_tags_add(convert,T_INFO,key); + } + } + else if ( fmt->type==T_PBINOM ) + { + fmt->id = bcf_hdr_id2int(convert->header, BCF_DT_ID, fmt->key); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT, fmt->id) ) error("No such FORMAT tag defined in the header: %s\n", fmt->key); + _used_tags_add(convert,T_FORMAT,key); + } + else if ( fmt->type==T_NPASS ) + { + filter_t *flt = filter_init(convert->header,key); + convert->max_unpack |= filter_max_unpack(flt); + fmt->usr = (void*) flt; + } + } + + switch (fmt->type) + { + case T_FIRST_ALT: fmt->handler = &process_first_alt; break; + case T_CHROM_POS_ID: fmt->handler = &process_chrom_pos_id; break; + case T_GT_TO_PROB3: fmt->handler = &process_gt_to_prob3; break; + case T_PL_TO_PROB3: fmt->handler = &process_pl_to_prob3; break; + case T_GP_TO_PROB3: fmt->handler = &process_gp_to_prob3; break; + case T_CHROM: fmt->handler = &process_chrom; break; + case T_POS: fmt->handler = &process_pos; break; + case T_POS0: fmt->handler = &process_pos0; break; + case T_END: fmt->handler = &process_end; convert->max_unpack |= BCF_UN_INFO; break; + case T_END0: fmt->handler = &process_end0; convert->max_unpack |= BCF_UN_INFO; break; + case T_ID: fmt->handler = &process_id; break; + case T_REF: fmt->handler = &process_ref; break; + case T_ALT: fmt->handler = &process_alt; break; + case T_QUAL: fmt->handler = &process_qual; break; + case T_FILTER: fmt->handler = &process_filter; convert->max_unpack |= BCF_UN_FLT; break; + case T_INFO: fmt->handler = &process_info; convert->max_unpack |= BCF_UN_INFO; break; + case T_FORMAT: fmt->handler = fmt->key ? &process_format : &process_complete_format; convert->max_unpack |= BCF_UN_FMT; break; + case T_SAMPLE: fmt->handler = &process_sample; break; + case T_SEP: fmt->handler = &process_sep; break; + case T_IS_TS: fmt->handler = &process_is_ts; break; + case T_TYPE: fmt->handler = &process_type; break; + case T_MASK: fmt->handler = NULL; break; + case T_GT: fmt->handler = &process_gt; convert->max_unpack |= BCF_UN_FMT; break; + case T_TGT: fmt->handler = &process_tgt; convert->max_unpack |= BCF_UN_FMT; break; + case T_IUPAC_GT: fmt->handler = &process_iupac_gt; convert->max_unpack |= BCF_UN_FMT; break; + case T_GT_TO_HAP: fmt->handler = &process_gt_to_hap; convert->max_unpack |= BCF_UN_FMT; break; + case T_GT_TO_HAP2: fmt->handler = &process_gt_to_hap2; convert->max_unpack |= BCF_UN_FMT; break; + case T_TBCSQ: fmt->handler = &process_tbcsq; fmt->destroy = &destroy_tbcsq; convert->max_unpack |= BCF_UN_FMT; break; + case T_LINE: fmt->handler = &process_line; convert->max_unpack |= BCF_UN_FMT; break; + case T_RSX: fmt->handler = &process_rsid_hex; break; + case T_VKX: fmt->handler = &process_variantkey_hex; break; + case T_PBINOM: fmt->handler = &process_pbinom; convert->max_unpack |= BCF_UN_FMT; break; + case T_NPASS: fmt->handler = &process_npass; fmt->destroy = &destroy_npass; break; + default: error("TODO: handler for type %d\n", fmt->type); + } + if ( key && fmt->type==T_INFO ) + { + fmt->id = bcf_hdr_id2int(convert->header, BCF_DT_ID, key); + if ( !bcf_hdr_idinfo_exists(convert->header,BCF_HL_INFO,fmt->id) ) + { + fmt->id = -1; + convert->undef_info_tag = strdup(key); + } + } + return fmt; +} + +static int parse_subscript(char **p) +{ + char *q = *p; + if ( *q!='{' ) return -1; + q++; + while ( *q && *q!='}' && isdigit(*q) ) q++; + if ( *q!='}' ) return -1; + int idx = atoi((*p)+1); + *p = q+1; + return idx; +} + +static char *parse_tag(convert_t *convert, char *p, int is_gtf) +{ + char *q = ++p; + while ( *q && (isalnum(*q) || *q=='_' || *q=='.') ) q++; + kstring_t str = {0,0,0}; + if ( q-p==0 ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p, &str); + if ( is_gtf ) + { + if ( !strcmp(str.s, "SAMPLE") ) register_tag(convert, "SAMPLE", is_gtf, T_SAMPLE); + else if ( !strcmp(str.s, "GT") ) register_tag(convert, "GT", is_gtf, T_GT); + else if ( !strcmp(str.s, "TGT") ) register_tag(convert, "GT", is_gtf, T_TGT); + else if ( !strcmp(str.s, "TBCSQ") ) + { + fmt_t *fmt = register_tag(convert, "BCSQ", is_gtf, T_TBCSQ); + fmt->subscript = parse_subscript(&q); + if ( fmt->subscript==-1 ) + { + if ( !strncmp(q,"{*}",3) ) { fmt->subscript = 0; q += 3; } + } + else fmt->subscript++; + } + else if ( !strcmp(str.s, "IUPACGT") ) register_tag(convert, "GT", is_gtf, T_IUPAC_GT); + else if ( !strcmp(str.s, "INFO") ) + { + if ( *q!='/' ) + { + int id = bcf_hdr_id2int(convert->header, BCF_DT_ID, str.s); + if ( bcf_hdr_idinfo_exists(convert->header,BCF_HL_INFO,id) ) + error("Could not parse format string \"%s\". Did you mean %%INFO/%s?\n", convert->format_str,str.s); + else + error("Could not parse format string: %s\n", convert->format_str); + } + p = ++q; + str.l = 0; + while ( *q && (isalnum(*q) || *q=='_' || *q=='.') ) q++; + if ( q-p==0 ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p, &str); + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_INFO); + fmt->subscript = parse_subscript(&q); + _used_tags_add(convert,T_INFO,str.s); + } + else if ( !strcmp(str.s,"PBINOM") ) + { + if ( *q!='(' ) error("Could not parse the expression: %s\n", convert->format_str); + p = ++q; + str.l = 0; + while ( *q && *q!=')' ) q++; + if ( q-p==0 ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p, &str); + register_tag(convert, str.s, is_gtf, T_PBINOM); + q++; + } + else if ( !strcmp(str.s,"N_PASS") ) + error("N_PASS() must be placed outside the square brackets\n"); + else + { + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_FORMAT); + fmt->subscript = parse_subscript(&q); + } + } + else + { + _SET_NON_FORMAT_TAGS(register_tag, str.s, convert, str.s, is_gtf) + else if ( !strcmp(str.s, "ALT") ) + { + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_ALT); + fmt->subscript = parse_subscript(&q); + } + else if ( !strcmp(str.s, "_CHROM_POS_ID") ) register_tag(convert, str.s, is_gtf, T_CHROM_POS_ID); + else if ( !strcmp(str.s, "_GT_TO_PROB3") ) register_tag(convert, str.s, is_gtf, T_GT_TO_PROB3); + else if ( !strcmp(str.s, "_PL_TO_PROB3") ) register_tag(convert, str.s, is_gtf, T_PL_TO_PROB3); + else if ( !strcmp(str.s, "_GP_TO_PROB3") ) register_tag(convert, str.s, is_gtf, T_GP_TO_PROB3); + else if ( !strcmp(str.s, "_GT_TO_HAP") ) register_tag(convert, str.s, is_gtf, T_GT_TO_HAP); + else if ( !strcmp(str.s, "_GT_TO_HAP2") ) register_tag(convert, str.s, is_gtf, T_GT_TO_HAP2); + else if ( !strcmp(str.s, "RSX") ) register_tag(convert, str.s, is_gtf, T_RSX); + else if ( !strcmp(str.s, "VKX") ) register_tag(convert, str.s, is_gtf, T_VKX); + else if ( !strcmp(str.s,"PBINOM") ) error("Error: PBINOM() is currently supported only with FORMAT tags. (todo)\n"); + else if ( !strcmp(str.s, "INFO") ) + { + if ( *q=='/' ) + { + p = ++q; + str.l = 0; + while ( *q && (isalnum(*q) || *q=='_' || *q=='.') ) q++; + if ( q-p==0 ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p, &str); + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_INFO); + fmt->subscript = parse_subscript(&q); + _used_tags_add(convert,T_INFO,str.s); + } + else + register_tag(convert, NULL, is_gtf, T_INFO); // the whole INFO + } + else if ( !strcmp(str.s, "FORMAT") ) + register_tag(convert, NULL, 0, T_FORMAT); + else if ( !strcmp(str.s,"N_PASS") ) + { + if ( *q!='(' ) error("Could not parse the expression: %s\n", convert->format_str); + p = ++q; + str.l = 0; + int nopen = 1; + while ( *q && nopen ) + { + if ( *q=='(' ) nopen++; + else if ( *q==')' ) nopen--; + q++; + } + if ( q-p==0 || nopen ) error("Could not parse format string: %s\n", convert->format_str); + kputsn(p, q-p-1, &str); + register_tag(convert, str.s, is_gtf, T_NPASS); + } + else + { + fmt_t *fmt = register_tag(convert, str.s, is_gtf, T_INFO); + fmt->subscript = parse_subscript(&q); + _used_tags_add(convert,T_INFO,str.s); + } + } + free(str.s); + return q; +} + +static char *parse_sep(convert_t *convert, char *p, int is_gtf) +{ + char *q = p; + kstring_t str = {0,0,0}; + while ( *q && *q!='[' && *q!=']' && *q!='%' ) + { + if ( *q=='\\' ) + { + q++; + if ( *q=='n' ) kputc('\n', &str); + else if ( *q=='t' ) kputc('\t', &str); + else kputc(*q, &str); + } + else kputc(*q, &str); + q++; + } + if ( !str.l ) error("Could not parse format string: %s\n", convert->format_str); + register_tag(convert, str.s, is_gtf, T_SEP); + free(str.s); + return q; +} + +convert_t *convert_init(bcf_hdr_t *hdr, int *samples, int nsamples, const char *format_str) +{ + convert_t *convert = (convert_t*) calloc(1,sizeof(convert_t)); + convert->header = hdr; + convert->format_str = strdup(format_str); + convert->max_unpack = BCF_UN_STR; + convert->used_tags_hash = khash_str2int_init(); + + int i, is_gtf = 0; + char *p = convert->format_str; + while ( *p ) + { + //fprintf(bcftools_stderr,"<%s>\n", p); + switch (*p) + { + case '[': is_gtf = 1; p++; break; + case ']': is_gtf = 0; register_tag(convert, NULL, 0, T_SEP); p++; break; + case '%': p = parse_tag(convert, p, is_gtf); break; + default: p = parse_sep(convert, p, is_gtf); break; + } + } + if ( is_gtf ) + error("Could not parse the format string, missing the square bracket \"]\": %s\n", convert->format_str); + + if ( nsamples ) + { + convert->nsamples = nsamples; + convert->samples = (int*) malloc(sizeof(int)*nsamples); + for (i=0; insamples; i++) convert->samples[i] = samples[i]; + } + else + { + convert->nsamples = bcf_hdr_nsamples(convert->header); + convert->samples = (int*) malloc(sizeof(int)*convert->nsamples); + for (i=0; insamples; i++) convert->samples[i] = i; + } + return convert; +} + +void convert_destroy(convert_t *convert) +{ + int i; + for (i=0; infmt; i++) + { + if ( convert->fmt[i].destroy ) convert->fmt[i].destroy(convert->fmt[i].usr); + free(convert->fmt[i].key); + } + if ( convert->nused_tags ) + { + for (i=0; inused_tags; i++) free(convert->used_tags_list[i]); + free(convert->used_tags_list); + } + khash_str2int_destroy(convert->used_tags_hash); + free(convert->fmt); + free(convert->undef_info_tag); + free(convert->dat); + free(convert->samples); + free(convert->format_str); + free(convert); +} + + +int convert_header(convert_t *convert, kstring_t *str) +{ + int i, icol = 0, l_ori = str->l; + bcf_hdr_t *hdr = convert->header; + + // Supress the header output if LINE is present + for (i=0; infmt; i++) + if ( convert->fmt[i].type == T_LINE ) break; + if ( i!=convert->nfmt ) + return str->l - l_ori; + + kputs("# ", str); + for (i=0; infmt; i++) + { + // Genotype fields + if ( convert->fmt[i].is_gt_field ) + { + int j = i, js, k; + while ( convert->fmt[j].is_gt_field ) j++; + for (js=0; jsnsamples; js++) + { + int ks = convert->samples[js]; + for (k=i; kfmt[k].type == T_SEP ) + { + if ( convert->fmt[k].key ) kputs(convert->fmt[k].key, str); + } + else if ( convert->fmt[k].type == T_SAMPLE ) + ksprintf(str, "[%d]%s", ++icol, convert->fmt[k].key); + else + ksprintf(str, "[%d]%s:%s", ++icol, hdr->samples[ks], convert->fmt[k].key); + } + } + i = j-1; + continue; + } + // Fixed fields + if ( convert->fmt[i].type == T_SEP ) + { + if ( convert->fmt[i].key ) kputs(convert->fmt[i].key, str); + continue; + } + ksprintf(str, "[%d]%s", ++icol, convert->fmt[i].key); + } + return str->l - l_ori; +} + +int convert_line(convert_t *convert, bcf1_t *line, kstring_t *str) +{ + if ( !convert->allow_undef_tags && convert->undef_info_tag ) + { + kstring_t msg = {0,0,0}; + ksprintf(&msg,"Error: no such tag defined in the VCF header: INFO/%s", convert->undef_info_tag); + + int hdr_id = bcf_hdr_id2int(convert->header,BCF_DT_ID,convert->undef_info_tag); + if ( hdr_id>=0 && bcf_hdr_idinfo_exists(convert->header,BCF_HL_FMT,hdr_id) ) + ksprintf(&msg,". FORMAT fields must be enclosed in square brackets, e.g. \"[ %%%s]\"", convert->undef_info_tag); + error("%s\n", msg.s); + } + + int l_ori = str->l; + bcf_unpack(line, convert->max_unpack); + + int i, ir; + str->l = 0; + for (i=0; infmt; i++) + { + // Genotype fields. + if ( convert->fmt[i].is_gt_field ) + { + int j = i, js, k; + while ( jnfmt && convert->fmt[j].is_gt_field ) + { + convert->fmt[j].ready = 0; + j++; + } + for (js=0; jsnsamples; js++) + { + // Skip samples when filtering was requested + int ks = convert->samples[js]; + if ( convert->subset_samples && *convert->subset_samples && !(*convert->subset_samples)[ks] ) continue; + + // Here comes a hack designed for TBCSQ. When running on large files, + // such as 1000GP, there are too many empty fields in the output and + // it's very very slow. Therefore in case the handler does not add + // anything to the string, we trim all genotype fields enclosed in square + // brackets here. This may be changed in future, time will show... + size_t l_start = str->l; + + for (k=i; kfmt[k].type == T_MASK ) + { + for (ir=0; irnreaders; ir++) + kputc(bcf_sr_has_line(convert->readers,ir)?'1':'0', str); + } + else if ( convert->fmt[k].handler ) + { + size_t l = str->l; + convert->fmt[k].handler(convert, line, &convert->fmt[k], ks, str); + if ( l==str->l ) { str->l = l_start; break; } // only TBCSQ does this + } + } + } + i = j-1; + continue; + } + // Fixed fields + if ( convert->fmt[i].type == T_MASK ) + { + for (ir=0; irnreaders; ir++) + kputc(bcf_sr_has_line(convert->readers,ir)?'1':'0', str); + } + else if ( convert->fmt[i].handler ) + convert->fmt[i].handler(convert, line, &convert->fmt[i], -1, str); + + } + return str->l - l_ori; +} + +int convert_set_option(convert_t *convert, enum convert_option opt, ...) +{ + int ret = 0; + va_list args; + + va_start(args, opt); + switch (opt) + { + case allow_undef_tags: + convert->allow_undef_tags = va_arg(args, int); + break; + case subset_samples: + convert->subset_samples = va_arg(args, uint8_t**); + break; + default: + ret = -1; + } + va_end(args); + return ret; +} + +int convert_max_unpack(convert_t *convert) +{ + return convert->max_unpack; +} + +int convert_is_tag_used(convert_t *convert, char *tag) +{ + return khash_str2int_has_key(convert->used_tags_hash, tag); +} +const char **convert_list_used_tags(convert_t *convert, int *ntags) +{ + *ntags = convert->nused_tags; + return (const char **)convert->used_tags_list; +} + diff --git a/bcftools/convert.h b/bcftools/convert.h new file mode 100644 index 0000000..5bbbc2c --- /dev/null +++ b/bcftools/convert.h @@ -0,0 +1,47 @@ +/* convert.h -- functions for converting between VCF/BCF and related formats. + + Copyright (C) 2014-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#ifndef __CONVERT_H__ +#define __CONVERT_H__ + +#include + +typedef struct _convert_t convert_t; +enum convert_option +{ + allow_undef_tags, + subset_samples, +}; + +convert_t *convert_init(bcf_hdr_t *hdr, int *samples, int nsamples, const char *str); +void convert_destroy(convert_t *convert); +int convert_set_option(convert_t *convert, enum convert_option opt, ...); +int convert_header(convert_t *convert, kstring_t *str); +int convert_line(convert_t *convert, bcf1_t *rec, kstring_t *str); +int convert_max_unpack(convert_t *convert); +int convert_is_tag_used(convert_t *convert, char *tag); +const char **convert_list_used_tags(convert_t *convert, int *ntags); + +#endif + diff --git a/bcftools/csq.c b/bcftools/csq.c new file mode 100644 index 0000000..de0d7a9 --- /dev/null +++ b/bcftools/csq.c @@ -0,0 +1,4395 @@ +/* The MIT License + + Copyright (c) 2016-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ +/* + Things that would be nice to have + - dynamic N_REF_PAD + - for stop-lost events (also in frameshifts) report the number of truncated aa's + - memory could be greatly reduced by indexing gff (but it is quite compact already) + - deletions that go beyond transcript boundaries are not checked at sequence level + - alloc tscript->ref in hap_finalize, introduce fa_off_beg:16,fa_off_end:16 + - see test/csq/ENST00000573314/insertion-overlap.vcf #1476288882 + + Read about transcript types here + http://vega.sanger.ac.uk/info/about/gene_and_transcript_types.html + http://www.ensembl.org/info/genome/variation/predicted_data.html + http://www.gencodegenes.org/gencode_biotypes.html + + List of supported biotypes + antisense + IG_C_gene + IG_D_gene + IG_J_gene + IG_LV_gene + IG_V_gene + lincRNA + macro_lncRNA + miRNA + misc_RNA + Mt_rRNA + Mt_tRNA + polymorphic_pseudogene + processed_transcript + protein_coding + ribozyme + rRNA + sRNA + scRNA + scaRNA + sense_intronic + sense_overlapping + snRNA + snoRNA + TR_C_gene + TR_D_gene + TR_J_gene + TR_V_gene + + The gff parsing logic + We collect features such by combining gff lines A,B,C as follows: + A .. gene line with a supported biotype + A.ID=~/^gene:/ + + B .. transcript line referencing A with supported biotype + B.ID=~/^transcript:/ && B.Parent=~/^gene:A.ID/ + + C .. corresponding CDS, exon, and UTR lines: + C[3] in {"CDS","exon","three_prime_UTR","five_prime_UTR"} && C.Parent=~/^transcript:B.ID/ + + For coding biotypes ("protein_coding" or "polymorphic_pseudogene") the + complete chain link C -> B -> A is required. For the rest, link B -> A suffices. + + + The supported consequence types, sorted by impact: + splice_acceptor_variant .. end region of an intron changed (2bp at the 3' end of an intron) + splice_donor_variant .. start region of an intron changed (2bp at the 5' end of an intron) + stop_gained .. DNA sequence variant resulting in a stop codon + frameshift_variant .. number of inserted/deleted bases not a multiple of three, disrupted translational frame + stop_lost .. elongated transcript, stop codon changed + start_lost .. the first codon changed + inframe_altering .. combination of indels leading to unchanged reading frame and length + inframe_insertion .. inserted coding sequence, unchanged reading frame + inframe_deletion .. deleted coding sequence, unchanged reading frame + missense_variant .. amino acid (aa) change, unchanged length + splice_region_variant .. change within 1-3 bases of the exon or 3-8 bases of the intron + synonymous_variant .. DNA sequence variant resulting in no amino acid change + stop_retained_variant .. different stop codon + start_retained_variant .. start codon retained by indel realignment + non_coding_variant .. variant in non-coding sequence, such as RNA gene + 5_prime_UTR_variant + 3_prime_UTR_variant + intron_variant .. reported only if none of the above + intergenic_variant .. reported only if none of the above + + + The annotation algorithm. + The algorithm checks if the variant falls in a region of a supported type. The + search is performed in the following order, until a match is found: + 1. idx_cds(gf_cds_t) - lookup CDS by position, create haplotypes, call consequences + 2. idx_utr(gf_utr_t) - check UTR hits + 3. idx_exon(gf_exon_t) - check for splice variants + 4. idx_tscript(tscript_t) - check for intronic variants, RNAs, etc. + + These regidx indexes are created by parsing a gff3 file as follows: + 1. create the array "ftr" of all UTR, CDS, exons. This will be + processed later and pruned based on transcript types we want to keep. + In the same go, create the hash "id2tr" of transcripts to keep + (based on biotype) which maps from transcript_id to a transcript. At + the same time also build the hash "gid2gene" which maps from gene_id to + gf_gene_t pointer. + + 2. build "idx_cds", "idx_tscript", "idx_utr" and "idx_exon" indexes. + Use only features from "ftr" which are present in "id2tr". + + 3. clean data that won't be needed anymore: ftr, id2tr, gid2gene. + + Data structures. + idx_cds, idx_utr, idx_exon, idx_tscript: + as described above, regidx structures for fast lookup of exons/transcripts + overlapping a region, the payload is a pointer to tscript.cds +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "regidx.h" +#include "kheap.h" +#include "smpl_ilist.h" +#include "rbuf.h" + +#ifndef __FUNCTION__ +# define __FUNCTION__ __func__ +#endif + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +// Definition of splice_region, splice_acceptor and splice_donor +#define N_SPLICE_DONOR 2 +#define N_SPLICE_REGION_EXON 3 +#define N_SPLICE_REGION_INTRON 8 + +#define N_REF_PAD 10 // number of bases to avoid boundary effects + +#define STRAND_REV 0 +#define STRAND_FWD 1 + +#define TRIM_NONE 0 +#define TRIM_5PRIME 1 +#define TRIM_3PRIME 2 + +// How to treat phased/unphased genotypes +#define PHASE_REQUIRE 0 // --phase r +#define PHASE_MERGE 1 // --phase m +#define PHASE_AS_IS 2 // --phase a +#define PHASE_SKIP 3 // --phase s +#define PHASE_NON_REF 4 // --phase R +#define PHASE_DROP_GT 5 // --samples - + +// Node types in the haplotype tree +#define HAP_CDS 0 +#define HAP_ROOT 1 +#define HAP_SSS 2 // start/stop/splice + +#define CSQ_PRINTED_UPSTREAM (1<<0) +#define CSQ_SYNONYMOUS_VARIANT (1<<1) +#define CSQ_MISSENSE_VARIANT (1<<2) +#define CSQ_STOP_LOST (1<<3) +#define CSQ_STOP_GAINED (1<<4) +#define CSQ_INFRAME_DELETION (1<<5) +#define CSQ_INFRAME_INSERTION (1<<6) +#define CSQ_FRAMESHIFT_VARIANT (1<<7) +#define CSQ_SPLICE_ACCEPTOR (1<<8) +#define CSQ_SPLICE_DONOR (1<<9) +#define CSQ_START_LOST (1<<10) +#define CSQ_SPLICE_REGION (1<<11) +#define CSQ_STOP_RETAINED (1<<12) +#define CSQ_UTR5 (1<<13) +#define CSQ_UTR3 (1<<14) +#define CSQ_NON_CODING (1<<15) +#define CSQ_INTRON (1<<16) +//#define CSQ_INTERGENIC (1<<17) +#define CSQ_INFRAME_ALTERING (1<<18) +#define CSQ_UPSTREAM_STOP (1<<19) // adds * in front of the csq string +#define CSQ_INCOMPLETE_CDS (1<<20) // to remove START/STOP in incomplete CDS, see ENSG00000173376/synon.vcf +#define CSQ_CODING_SEQUENCE (1<<21) // cannot tell exactly what it is, but it does affect the coding sequence +#define CSQ_ELONGATION (1<<22) // symbolic insertion +#define CSQ_START_RETAINED (1<<23) + +// Haplotype-aware consequences, printed in one vcf record only, the rest has a reference @12345 +#define CSQ_COMPOUND (CSQ_SYNONYMOUS_VARIANT|CSQ_MISSENSE_VARIANT|CSQ_STOP_LOST|CSQ_STOP_GAINED| \ + CSQ_INFRAME_DELETION|CSQ_INFRAME_INSERTION|CSQ_FRAMESHIFT_VARIANT| \ + CSQ_START_LOST|CSQ_STOP_RETAINED|CSQ_INFRAME_ALTERING|CSQ_INCOMPLETE_CDS| \ + CSQ_UPSTREAM_STOP|CSQ_START_RETAINED) +#define CSQ_START_STOP (CSQ_STOP_LOST|CSQ_STOP_GAINED|CSQ_STOP_RETAINED|CSQ_START_LOST|CSQ_START_RETAINED) + +#define CSQ_PRN_STRAND(csq) ((csq)&CSQ_COMPOUND && !((csq)&(CSQ_SPLICE_ACCEPTOR|CSQ_SPLICE_DONOR|CSQ_SPLICE_REGION))) +#define CSQ_PRN_TSCRIPT (~(CSQ_INTRON|CSQ_NON_CODING)) +#define CSQ_PRN_BIOTYPE CSQ_NON_CODING + +// see kput_vcsq() +const char *csq_strings[] = +{ + NULL, + "synonymous", + "missense", + "stop_lost", + "stop_gained", + "inframe_deletion", + "inframe_insertion", + "frameshift", + "splice_acceptor", + "splice_donor", + "start_lost", + "splice_region", + "stop_retained", + "5_prime_utr", + "3_prime_utr", + "non_coding", + "intron", + "intergenic", + "inframe_altering", + NULL, + NULL, + "coding_sequence", + "feature_elongation", + "start_retained" +}; + + +// GFF line types +#define GFF_TSCRIPT_LINE 1 +#define GFF_GENE_LINE 2 + + +/* + Genomic features, for fast lookup by position to overlapping features +*/ +#define GF_coding_bit 6 +#define GF_is_coding(x) ((x) & (1<5I|121ACG>A+124TA>T" + + vrec_t + single VCF record and csq tied to this record. (Haplotype can have multiple + consequences in several VCF records. Each record can have multiple consequences + from multiple haplotypes.) + + csq_t + a top-level consequence tied to a haplotype + + vbuf_t + pos2vbuf + VCF records with the same position clustered together for a fast lookup via pos2vbuf +*/ +typedef struct _vbuf_t vbuf_t; +typedef struct _vcsq_t vcsq_t; +struct _vcsq_t +{ + uint32_t strand:1, + type:31; // one of CSQ_* types + uint32_t trid; + uint32_t vcf_ial; + uint32_t biotype; // one of GF_* types + char *gene; // gene name + bcf1_t *ref; // if type&CSQ_PRINTED_UPSTREAM, ref consequence "@1234" + kstring_t vstr; // variant string, eg 5TY>5I|121ACG>A+124TA>T +}; +typedef struct +{ + bcf1_t *line; + uint32_t *fmt_bm; // bitmask of sample consequences with first/second haplotype interleaved + uint32_t nfmt:4, // the bitmask size (the number of integers per sample) + nvcsq:28, mvcsq; + vcsq_t *vcsq; // there can be multiple consequences for a single VCF record +} +vrec_t; +typedef struct +{ + uint32_t pos; + vrec_t *vrec; // vcf line that this csq is tied to; needed when printing haplotypes (hap_stage_vcf) + int idx; // 0-based index of the csq at the VCF line, for FMT/BCSQ + vcsq_t type; +} +csq_t; +struct _vbuf_t +{ + vrec_t **vrec; // buffer of VCF lines with the same position + int n, m; + uint32_t keep_until; // the maximum transcript end position +}; +KHASH_MAP_INIT_INT(pos2vbuf, vbuf_t*) + + +/* + Structures related to haplotype-aware consequences in coding regions + + hap_node_t + node of a haplotype tree. Each transcript has one tree + + tscript_t + despite its general name, it is intended for coding transcripts only + + hap_t + hstack_t + for traversal of the haplotype tree and braking combined + consequences into independent parts +*/ +typedef struct _hap_node_t hap_node_t; +struct _hap_node_t +{ + char *seq; // cds segment [parent_node,this_node) + char *var; // variant "ref>alt" + uint32_t type:2, // HAP_ROOT or HAP_CDS + csq:30; // this node's consequence + int dlen; // alt minus ref length: <0 del, >0 ins, 0 substitution + uint32_t rbeg; // variant's VCF position (0-based, inclusive) + int32_t rlen; // variant's rlen; alen=rlen+dlen; fake for non CDS types + uint32_t sbeg; // variant's position on the spliced reference transcript (0-based, inclusive, N_REF_PAD not included) + uint32_t icds; // which exon does this node's variant overlaps + hap_node_t **child, *prev; // children haplotypes and previous coding node + int nchild, mchild; + bcf1_t *cur_rec, *rec; // current VCF record and node's VCF record + int vcf_ial; // which VCF allele generated this node + uint32_t nend; // number of haplotypes ending in this node + int *cur_child, mcur_child; // mapping from the allele to the currently active child + csq_t *csq_list; // list of haplotype's consequences, broken by position (each corresponds to a VCF record) + int ncsq_list, mcsq_list; +}; +struct _tscript_t +{ + uint32_t id; // transcript id + uint32_t beg,end; // transcript's beg and end coordinate (ref strand, 0-based, inclusive) + uint32_t strand:1, // STRAND_REV or STRAND_FWD + ncds:31, // number of exons + mcds; + gf_cds_t **cds; // ordered list of exons + char *ref; // reference sequence, padded with N_REF_PAD bases on both ends + char *sref; // spliced reference sequence, padded with N_REF_PAD bases on both ends + hap_node_t *root; // root of the haplotype tree + hap_node_t **hap; // pointer to haplotype leaves, two for each sample + int nhap, nsref; // number of haplotypes and length of sref, including 2*N_REF_PAD + uint32_t trim:2, // complete, 5' or 3' trimmed, see TRIM_* types + type:30; // one of GF_* types + gf_gene_t *gene; +}; +static inline int cmp_tscript(tscript_t **a, tscript_t **b) +{ + return ( (*a)->end < (*b)->end ) ? 1 : 0; +} +KHEAP_INIT(trhp, tscript_t*, cmp_tscript) +typedef khp_trhp_t tr_heap_t; +typedef struct +{ + hap_node_t *node; // current node + int ichild; // current child in the active node + int dlen; // total dlen, from the root to the active node + size_t slen; // total sequence length, from the root to the active node +} +hstack_t; +typedef struct +{ + int mstack; + hstack_t *stack; + tscript_t *tr; // tr->ref: spliced transcript on ref strand + kstring_t sseq; // spliced haplotype sequence on ref strand + kstring_t tseq; // the variable part of translated haplotype transcript, coding strand + kstring_t tref; // the variable part of translated reference transcript, coding strand + uint32_t sbeg; // stack's sbeg, for cases first node's type is HAP_SSS + int upstream_stop; +} +hap_t; + + +/* + Helper structures, only for initialization + + ftr_t + temporary list of all exons, CDS, UTRs +*/ +KHASH_MAP_INIT_INT(int2tscript, tscript_t*) +KHASH_MAP_INIT_INT(int2gene, gf_gene_t*) +typedef struct +{ + int type; // GF_CDS, GF_EXON, GF_5UTR, GF_3UTR + uint32_t beg; + uint32_t end; + uint32_t trid; + uint32_t strand:1; // STRAND_REV,STRAND_FWD + uint32_t phase:2; // 0, 1, 2, or 3 for unknown + uint32_t iseq:29; +} +ftr_t; +/* + Mapping from GFF ID string (such as ENST00000450305 or Zm00001d027230_P001) + to integer id. To keep the memory requirements low, the original version + relied on IDs in the form of a string prefix and a numerical id. However, + it turns out that this assumption is not valid for some ensembl GFFs, see + for example Zea_mays.AGPv4.36.gff3.gz + */ +typedef struct +{ + void *str2id; // khash_str2int + int nstr, mstr; + char **str; // numeric id to string +} +id_tbl_t; +typedef struct +{ + // all exons, CDS, UTRs + ftr_t *ftr; + int nftr, mftr; + + // mapping from gene id to gf_gene_t + kh_int2gene_t *gid2gene; + + // mapping from transcript id to tscript, for quick CDS anchoring + kh_int2tscript_t *id2tr; + + // sequences + void *seq2int; // str2int hash + char **seq; + int nseq, mseq; + + // ignored biotypes + void *ignored_biotypes; + + id_tbl_t gene_ids; // temporary table for mapping between gene id (eg. Zm00001d027245) and a numeric idx +} +aux_t; + +typedef struct _args_t +{ + // the main regidx lookups, from chr:beg-end to overlapping features and + // index iterator + regidx_t *idx_cds, *idx_utr, *idx_exon, *idx_tscript; + regitr_t *itr; + + // temporary structures, deleted after initializtion + aux_t init; + + // text tab-delimited output (out) or vcf/bcf output (out_fh) + FILE *out; + htsFile *out_fh; + + // vcf + bcf_srs_t *sr; + bcf_hdr_t *hdr; + int hdr_nsmpl; // actual number of samples in the vcf, for bcf_update_format_values() + + // include or exclude sites which match the filters + filter_t *filter; + char *filter_str; + int filter_logic; // FLT_INCLUDE or FLT_EXCLUDE + + // samples to process + int sample_is_file; + char *sample_list; + smpl_ilist_t *smpl; + + char *outdir, **argv, *fa_fname, *gff_fname, *output_fname; + char *bcsq_tag; + int argc, output_type, clevel; + int phase, verbosity, local_csq, record_cmd_line; + int ncsq2_max, nfmt_bcsq; // maximum number of csq per site that can be accessed from FORMAT/BCSQ (*2 and 1 bit skipped to avoid BCF missing values) + int ncsq2_small_warned; + int brief_predictions; + + int rid; // current chromosome + tr_heap_t *active_tr; // heap of active transcripts for quick flushing + hap_t *hap; // transcript haplotype recursion + vbuf_t **vcf_buf; // buffered VCF lines to annotate with CSQ and flush + rbuf_t vcf_rbuf; // round buffer indexes to vcf_buf + kh_pos2vbuf_t *pos2vbuf; // fast lookup of buffered lines by position + tscript_t **rm_tr; // buffer of transcripts to clean + int nrm_tr, mrm_tr; + csq_t *csq_buf; // pool of csq not managed by hap_node_t, i.e. non-CDS csqs + int ncsq_buf, mcsq_buf; + id_tbl_t tscript_ids; // mapping between transcript id (eg. Zm00001d027245_T001) and a numeric idx + int force; // force run under various conditions. Currently only to skip out-of-phase transcripts + int n_threads; // extra compression/decompression threads + + faidx_t *fai; + kstring_t str, str2; + int32_t *gt_arr, mgt_arr; +} +args_t; + +// AAA, AAC, ... +const char *gencode = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSS*CWCLFLF"; +const uint8_t nt4[] = +{ + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,0,4,1, 4,4,4,2, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 3,4,4,4, 4,4,4,4, 4,4,4,4, + 4,0,4,1, 4,4,4,2, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 3 +}; +const uint8_t cnt4[] = +{ + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,3,4,2, 4,4,4,1, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 0,4,4,4, 4,4,4,4, 4,4,4,4, + 4,3,4,2, 4,4,4,1, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 0 +}; +#define dna2aa(x) gencode[ nt4[(uint8_t)(x)[0]]<<4 | nt4[(uint8_t)(x)[1]]<<2 | nt4[(uint8_t)(x)[2]] ] +#define cdna2aa(x) gencode[ cnt4[(uint8_t)(x)[2]]<<4 | cnt4[(uint8_t)(x)[1]]<<2 | cnt4[(uint8_t)(x)[0]] ] + +static const char *gf_strings_noncoding[] = +{ + "MT_rRNA", "MT_tRNA", "lincRNA", "miRNA", "misc_RNA", "rRNA", "snRNA", "snoRNA", "processed_transcript", + "antisense", "macro_lncRNA", "ribozyme", "sRNA", "scRNA", "scaRNA", "sense_intronic", "sense_overlapping", + "pseudogene", "processed_pseudogene", "artifact", "IG_pseudogene", "IG_C_pseudogene", "IG_J_pseudogene", + "IG_V_pseudogene", "TR_V_pseudogene", "TR_J_pseudogene", "MT_tRNA_pseudogene", "misc_RNA_pseudogene", + "miRNA_pseudogene", "ribozyme", "retained_intron", "retrotransposed", "Trna_pseudogene", "transcribed_processed_pseudogene", + "transcribed_unprocessed_pseudogene", "transcribed_unitary_pseudogene", "translated_unprocessed_pseudogene", + "translated_processed_pseudogene", "known_ncRNA", "unitary_pseudogene", "unprocessed_pseudogene", + "LRG_gene", "3_prime_overlapping_ncRNA", "disrupted_domain", "vaultRNA", "bidirectional_promoter_lncRNA", "ambiguous_orf" +}; +static const char *gf_strings_coding[] = { "protein_coding", "polymorphic_pseudogene", "IG_C", "IG_D", "IG_J", "IG_LV", "IG_V", "TR_C", "TR_D", "TR_J", "TR_V", "NMD", "non_stop_decay"}; +static const char *gf_strings_special[] = { "CDS", "exon", "3_prime_UTR", "5_prime_UTR" }; + +const char *gf_type2gff_string(int type) +{ + if ( !GF_is_coding(type) ) + { + if ( type < (1<init; + char c = chr_end[1]; + chr_end[1] = 0; + int iseq; + if ( khash_str2int_get(aux->seq2int, chr_beg, &iseq)!=0 ) + { + // check for possible mismatch in chromosome naming convention such as chrX vs X + char *new_chr = NULL; + if ( faidx_has_seq(args->fai,chr_beg) ) + new_chr = strdup(chr_beg); // valid chr name, the same in gff and faidx + else + { + int len = strlen(chr_beg); + if ( !strncmp("chr",chr_beg,3) && len>3 ) + new_chr = strdup(chr_beg+3); // gff has the prefix, faidx does not + else + { + new_chr = malloc(len+4); // gff does not have the prefix, faidx has + memcpy(new_chr,"chr",3); + memcpy(new_chr+3,chr_beg,len); + new_chr[len+3] = 0; + } + if ( !faidx_has_seq(args->fai,new_chr) ) // modification did not help, this sequence is not in fai + { + static int unkwn_chr_warned = 0; + if ( !unkwn_chr_warned && args->verbosity>0 ) + fprintf(stderr,"Warning: GFF chromosome \"%s\" not part of the reference genome\n",chr_beg); + unkwn_chr_warned = 1; + free(new_chr); + new_chr = strdup(chr_beg); // use the original sequence name + } + } + if ( khash_str2int_get(aux->seq2int, new_chr, &iseq)!=0 ) + { + hts_expand(char*, aux->nseq+1, aux->mseq, aux->seq); + aux->seq[aux->nseq] = new_chr; + iseq = khash_str2int_inc(aux->seq2int, aux->seq[aux->nseq]); + aux->nseq++; + assert( aux->nseq < 1<<29 ); // see gf_gene_t.iseq and ftr_t.iseq + } + else + free(new_chr); + } + chr_end[1] = c; + return iseq; +} +static inline char *gff_skip(const char *line, char *ss) +{ + while ( *ss && *ss!='\t' ) ss++; + if ( !*ss ) error("[%s:%d %s] Could not parse the line: %s\n",__FILE__,__LINE__,__FUNCTION__,line); + return ss+1; +} +static inline void gff_parse_chr(const char *line, char **chr_beg, char **chr_end) +{ + char *se = (char*) line; + while ( *se && *se!='\t' ) se++; + if ( !*se ) error("[%s:%d %s] Could not parse the line: %s\n",__FILE__,__LINE__,__FUNCTION__,line); + *chr_beg = (char*) line; + *chr_end = se-1; +} +static inline char *gff_parse_beg_end(const char *line, char *ss, uint32_t *beg, uint32_t *end) +{ + char *se = ss; + *beg = strtol(ss, &se, 10) - 1; + if ( ss==se ) error("[%s:%d %s] Could not parse the line:\n\t%s\n\t%s\n",__FILE__,__LINE__,__FUNCTION__,line,ss); + ss = se+1; + *end = strtol(ss, &se, 10) - 1; + if ( ss==se ) error("[%s:%d %s] Could not parse the line: %s\n",__FILE__,__LINE__,__FUNCTION__,line); + return se+1; +} +static void gff_id_init(id_tbl_t *tbl) +{ + memset(tbl, 0, sizeof(*tbl)); + tbl->str2id = khash_str2int_init(); +} +static void gff_id_destroy(id_tbl_t *tbl) +{ + khash_str2int_destroy_free(tbl->str2id); + free(tbl->str); +} +static inline uint32_t gff_id_parse(id_tbl_t *tbl, const char *line, const char *needle, char *ss) +{ + ss = strstr(ss,needle); // e.g. "ID=transcript:" + if ( !ss ) error("[%s:%d %s] Could not parse the line, \"%s\" not present: %s\n",__FILE__,__LINE__,__FUNCTION__,needle,line); + ss += strlen(needle); + + char *se = ss; + while ( *se && *se!=';' && !isspace(*se) ) se++; + char tmp = *se; + *se = 0; + + int id; + if ( khash_str2int_get(tbl->str2id, ss, &id) < 0 ) + { + id = tbl->nstr++; + hts_expand(char*, tbl->nstr, tbl->mstr, tbl->str); + tbl->str[id] = strdup(ss); + khash_str2int_set(tbl->str2id, tbl->str[id], id); + } + *se = tmp; + + return id; +} +static inline int gff_parse_type(char *line) +{ + line = strstr(line,"ID="); + if ( !line ) return -1; + line += 3; + if ( !strncmp(line,"transcript:",11) ) return GFF_TSCRIPT_LINE; + else if ( !strncmp(line,"gene:",5) ) return GFF_GENE_LINE; + return -1; +} +static inline int gff_parse_biotype(char *_line) +{ + char *line = strstr(_line,"biotype="); + if ( !line ) return -1; + + line += 8; + switch (*line) + { + case 'p': + if ( !strncmp(line,"protein_coding",14) ) return GF_PROTEIN_CODING; + else if ( !strncmp(line,"pseudogene",10) ) return GF_PSEUDOGENE; + else if ( !strncmp(line,"processed_transcript",20) ) return GF_PROCESSED_TRANSCRIPT; + else if ( !strncmp(line,"processed_pseudogene",20) ) return GF_PROCESSED_PSEUDOGENE; + else if ( !strncmp(line,"polymorphic_pseudogene",22) ) return GF_POLYMORPHIC_PSEUDOGENE; + break; + case 'a': + if ( !strncmp(line,"artifact",8) ) return GF_ARTIFACT; + else if ( !strncmp(line,"antisense",9) ) return GF_ANTISENSE; + else if ( !strncmp(line,"ambiguous_orf",13) ) return GF_AMBIGUOUS_ORF; + break; + case 'I': + if ( !strncmp(line,"IG_C_gene",9) ) return GF_IG_C; + else if ( !strncmp(line,"IG_D_gene",9) ) return GF_IG_D; + else if ( !strncmp(line,"IG_J_gene",9) ) return GF_IG_J; + else if ( !strncmp(line,"IG_LV_gene",10) ) return GF_IG_LV; + else if ( !strncmp(line,"IG_V_gene",9) ) return GF_IG_V; + else if ( !strncmp(line,"IG_pseudogene",13) ) return GF_IG_PSEUDOGENE; + else if ( !strncmp(line,"IG_C_pseudogene",15) ) return GF_IG_C_PSEUDOGENE; + else if ( !strncmp(line,"IG_J_pseudogene",15) ) return GF_IG_J_PSEUDOGENE; + else if ( !strncmp(line,"IG_V_pseudogene",15) ) return GF_IG_V_PSEUDOGENE; + break; + case 'T': + if ( !strncmp(line,"TR_C_gene",9) ) return GF_TR_C; + else if ( !strncmp(line,"TR_D_gene",9) ) return GF_TR_D; + else if ( !strncmp(line,"TR_J_gene",9) ) return GF_TR_J; + else if ( !strncmp(line,"TR_V_gene",9) ) return GF_TR_V; + else if ( !strncmp(line,"TR_V_pseudogene",15) ) return GF_TR_V_PSEUDOGENE; + else if ( !strncmp(line,"TR_J_pseudogene",15) ) return GF_TR_J_PSEUDOGENE; + break; + case 'M': + if ( !strncmp(line,"Mt_tRNA_pseudogene",18) ) return GF_MT_tRNA_PSEUDOGENE; + else if ( !strncmp(line,"Mt_tRNA",7) ) return GF_MT_tRNA; + else if ( !strncmp(line,"Mt_rRNA",7) ) return GF_MT_tRNA; + break; + case 'l': + if ( !strncmp(line,"lincRNA",7) ) return GF_lincRNA; + break; + case 'm': + if ( !strncmp(line,"macro_lncRNA",12) ) return GF_macro_lncRNA; + else if ( !strncmp(line,"misc_RNA_pseudogene",19) ) return GF_misc_RNA_PSEUDOGENE; + else if ( !strncmp(line,"miRNA_pseudogene",16) ) return GF_miRNA_PSEUDOGENE; + else if ( !strncmp(line,"miRNA",5) ) return GF_miRNA; + else if ( !strncmp(line,"misc_RNA",8) ) return GF_MISC_RNA; + break; + case 'r': + if ( !strncmp(line,"rRNA",4) ) return GF_rRNA; + else if ( !strncmp(line,"ribozyme",8) ) return GF_RIBOZYME; + else if ( !strncmp(line,"retained_intron",15) ) return GF_RETAINED_INTRON; + else if ( !strncmp(line,"retrotransposed",15) ) return GF_RETROTRANSPOSED; + break; + case 's': + if ( !strncmp(line,"snRNA",5) ) return GF_snRNA; + else if ( !strncmp(line,"sRNA",4) ) return GF_sRNA; + else if ( !strncmp(line,"scRNA",5) ) return GF_scRNA; + else if ( !strncmp(line,"scaRNA",6) ) return GF_scaRNA; + else if ( !strncmp(line,"snoRNA",6) ) return GF_snoRNA; + else if ( !strncmp(line,"sense_intronic",14) ) return GF_SENSE_INTRONIC; + else if ( !strncmp(line,"sense_overlapping",17) ) return GF_SENSE_OVERLAPPING; + break; + case 't': + if ( !strncmp(line,"tRNA_pseudogene",15) ) return GF_tRNA_PSEUDOGENE; + else if ( !strncmp(line,"transcribed_processed_pseudogene",32) ) return GF_TRANSCRIBED_PROCESSED_PSEUDOGENE; + else if ( !strncmp(line,"transcribed_unprocessed_pseudogene",34) ) return GF_TRANSCRIBED_UNPROCESSED_PSEUDOGENE; + else if ( !strncmp(line,"transcribed_unitary_pseudogene",30) ) return GF_TRANSCRIBED_UNITARY_PSEUDOGENE; + else if ( !strncmp(line,"translated_unprocessed_pseudogene",33) ) return GF_TRANSLATED_UNPROCESSED_PSEUDOGENE; + else if ( !strncmp(line,"translated_processed_pseudogene",31) ) return GF_TRANSLATED_PROCESSED_PSEUDOGENE; + break; + case 'n': + if ( !strncmp(line,"nonsense_mediated_decay",23) ) return GF_NMD; + else if ( !strncmp(line,"non_stop_decay",14) ) return GF_NON_STOP_DECAY; + break; + case 'k': + if ( !strncmp(line,"known_ncrna",11) ) return GF_KNOWN_NCRNA; + break; + case 'u': + if ( !strncmp(line,"unitary_pseudogene",18) ) return GF_UNITARY_PSEUDOGENE; + else if ( !strncmp(line,"unprocessed_pseudogene",22) ) return GF_UNPROCESSED_PSEUDOGENE; + break; + case 'L': + if ( !strncmp(line,"LRG_gene",8) ) return GF_LRG_GENE; + break; + case '3': + if ( !strncmp(line,"3prime_overlapping_ncRNA",24) ) return GF_3PRIME_OVERLAPPING_ncRNA; + break; + case 'd': + if ( !strncmp(line,"disrupted_domain",16) ) return GF_DISRUPTED_DOMAIN; + break; + case 'v': + if ( !strncmp(line,"vaultRNA",8) ) return GF_vaultRNA; + break; + case 'b': + if ( !strncmp(line,"bidirectional_promoter_lncRNA",29) ) return GF_BIDIRECTIONAL_PROMOTER_lncRNA; + break; + } + return 0; +} +static inline int gff_ignored_biotype(args_t *args, char *ss) +{ + ss = strstr(ss,"biotype="); + if ( !ss ) return 0; + + ss += 8; + char *se = ss, tmp; + while ( *se && *se!=';' ) se++; + tmp = *se; + *se = 0; + + char *key = ss; + int n = 0; + if ( khash_str2int_get(args->init.ignored_biotypes, ss, &n)!=0 ) key = strdup(ss); + khash_str2int_set(args->init.ignored_biotypes, key, n+1); + + *se = tmp; + return 1; +} +gf_gene_t *gene_init(aux_t *aux, uint32_t gene_id) +{ + khint_t k = kh_get(int2gene, aux->gid2gene, (int)gene_id); + gf_gene_t *gene = (k == kh_end(aux->gid2gene)) ? NULL : kh_val(aux->gid2gene, k); + if ( !gene ) + { + gene = (gf_gene_t*) calloc(1,sizeof(gf_gene_t)); + int ret; + k = kh_put(int2gene, aux->gid2gene, (int)gene_id, &ret); + kh_val(aux->gid2gene,k) = gene; + } + return gene; +} +void gff_parse_transcript(args_t *args, const char *line, char *ss, ftr_t *ftr) +{ + aux_t *aux = &args->init; + int biotype = gff_parse_biotype(ss); + if ( biotype <= 0 ) + { + if ( !gff_ignored_biotype(args, ss) && args->verbosity > 0 ) fprintf(stderr,"ignored transcript: %s\n",line); + return; + } + + // create a mapping from transcript_id to gene_id + uint32_t trid = gff_id_parse(&args->tscript_ids, line, "ID=transcript:", ss); + uint32_t gene_id = gff_id_parse(&args->init.gene_ids, line, "Parent=gene:", ss); + + tscript_t *tr = (tscript_t*) calloc(1,sizeof(tscript_t)); + tr->id = trid; + tr->strand = ftr->strand; + tr->gene = gene_init(aux, gene_id); + tr->type = biotype; + tr->beg = ftr->beg; + tr->end = ftr->end; + + khint_t k; + int ret; + k = kh_put(int2tscript, aux->id2tr, (int)trid, &ret); + kh_val(aux->id2tr,k) = tr; +} +void gff_parse_gene(args_t *args, const char *line, char *ss, char *chr_beg, char *chr_end, ftr_t *ftr) +{ + int biotype = gff_parse_biotype(ss); + if ( biotype <= 0 ) + { + if ( !gff_ignored_biotype(args, ss) && args->verbosity > 0 ) fprintf(stderr,"ignored gene: %s\n",line); + return; + } + + aux_t *aux = &args->init; + + // substring search for "ID=gene:ENSG00000437963" + uint32_t gene_id = gff_id_parse(&aux->gene_ids, line, "ID=gene:", ss); + gf_gene_t *gene = gene_init(aux, gene_id); + assert( !gene->name ); // the gene_id should be unique + + gene->iseq = feature_set_seq(args, chr_beg,chr_end); + + // substring search for "Name=OR4F5" + ss = strstr(chr_end+2,"Name="); + if ( ss ) + { + ss += 5; + char *se = ss; + while ( *se && *se!=';' && !isspace(*se) ) se++; + gene->name = (char*) malloc(se-ss+1); + memcpy(gene->name,ss,se-ss); + gene->name[se-ss] = 0; + } + else + gene->name = strdup(aux->gene_ids.str[gene_id]); // Name= field is not present, use the gene ID instead +} +int gff_parse(args_t *args, char *line, ftr_t *ftr) +{ + // - skip empty lines and commented lines + // - columns + // 1. chr + // 2. + // 3. CDS, transcript, gene, ... + // 4-5. beg,end + // 6. + // 7. strand + // 8. phase + // 9. Parent=transcript:ENST(\d+);ID=... etc + + char *ss = line; + if ( !*ss ) return -1; // skip blank lines + if ( *ss=='#' ) return -1; // skip comments + + char *chr_beg, *chr_end; + gff_parse_chr(line, &chr_beg, &chr_end); + ss = gff_skip(line, chr_end + 2); + + // 3. column: is this a CDS, transcript, gene, etc. + if ( !strncmp("exon\t",ss,5) ) { ftr->type = GF_EXON; ss += 5; } + else if ( !strncmp("CDS\t",ss,4) ) { ftr->type = GF_CDS; ss += 4; } + else if ( !strncmp("three_prime_UTR\t",ss,16) ) { ftr->type = GF_UTR3; ss += 16; } + else if ( !strncmp("five_prime_UTR\t",ss,15) ) { ftr->type = GF_UTR5; ss += 15; } + else + { + ss = gff_skip(line, ss); + ss = gff_parse_beg_end(line, ss, &ftr->beg,&ftr->end); + ss = gff_skip(line, ss); + int type = gff_parse_type(ss); + if ( type!=GFF_TSCRIPT_LINE && type!=GFF_GENE_LINE ) + { + // we ignore these, debug print to see new types: + ss = strstr(ss,"ID="); + if ( !ss ) return -1; // no ID, ignore the line + if ( !strncmp("chromosome",ss+3,10) ) return -1; + if ( !strncmp("supercontig",ss+3,11) ) return -1; + if ( args->verbosity > 0 ) fprintf(stderr,"ignored: %s\n", line); + return -1; + } + + // 7. column: strand + if ( *ss == '+' ) ftr->strand = STRAND_FWD; + else if ( *ss == '-' ) ftr->strand = STRAND_REV; + else error("Unknown strand: %c .. %s\n", *ss,ss); + + if ( type==GFF_TSCRIPT_LINE ) + gff_parse_transcript(args, line, ss, ftr); + else + gff_parse_gene(args, line, ss, chr_beg, chr_end, ftr); + + return -1; + } + ss = gff_parse_beg_end(line, ss, &ftr->beg,&ftr->end); + ss = gff_skip(line, ss); + + // 7. column: strand + if ( *ss == '+' ) ftr->strand = STRAND_FWD; + else if ( *ss == '-' ) ftr->strand = STRAND_REV; + else { if ( args->verbosity > 0 ) fprintf(stderr,"Skipping unknown strand: %c\n", *ss); return -1; } + ss += 2; + + // 8. column: phase (codon offset) + if ( *ss == '0' ) ftr->phase = 0; + else if ( *ss == '1' ) ftr->phase = 1; + else if ( *ss == '2' ) ftr->phase = 2; + else if ( *ss == '.' ) ftr->phase = CDS_PHASE_UNKN; // exons and even CDS in some GFFs do not have phase + else { if ( args->verbosity > 0 ) fprintf(stderr,"Skipping unknown phase: %c, %s\n", *ss, line); return -1; } + ss += 2; + + // substring search for "Parent=transcript:ENST00000437963" + ftr->trid = gff_id_parse(&args->tscript_ids, line, "Parent=transcript:", ss); + ftr->iseq = feature_set_seq(args, chr_beg,chr_end); + return 0; +} + +static int cmp_cds_ptr(const void *a, const void *b) +{ + // comparison function for qsort of transcripts's CDS + if ( (*((gf_cds_t**)a))->beg < (*((gf_cds_t**)b))->beg ) return -1; + if ( (*((gf_cds_t**)a))->beg > (*((gf_cds_t**)b))->beg ) return 1; + return 0; +} + +static inline void chr_beg_end(aux_t *aux, int iseq, char **chr_beg, char **chr_end) +{ + *chr_beg = *chr_end = aux->seq[iseq]; + while ( (*chr_end)[1] ) (*chr_end)++; +} +tscript_t *tscript_init(aux_t *aux, uint32_t trid) +{ + khint_t k = kh_get(int2tscript, aux->id2tr, (int)trid); + tscript_t *tr = (k == kh_end(aux->id2tr)) ? NULL : kh_val(aux->id2tr, k); + assert( tr ); + return tr; +} +void register_cds(args_t *args, ftr_t *ftr) +{ + // Make the CDS searchable via idx_cds. Note we do not malloc tr->cds just yet. + // ftr is the result of parsing a gff CDS line + aux_t *aux = &args->init; + + tscript_t *tr = tscript_init(aux, ftr->trid); + if ( tr->strand != ftr->strand ) error("Conflicting strand in transcript %"PRIu32" .. %d vs %d\n",ftr->trid,tr->strand,ftr->strand); + + gf_cds_t *cds = (gf_cds_t*) malloc(sizeof(gf_cds_t)); + cds->tr = tr; + cds->beg = ftr->beg; + cds->len = ftr->end - ftr->beg + 1; + cds->icds = 0; // to keep valgrind on mac happy + cds->phase = ftr->phase; + + hts_expand(gf_cds_t*,tr->ncds+1,tr->mcds,tr->cds); + tr->cds[tr->ncds++] = cds; +} +void register_utr(args_t *args, ftr_t *ftr) +{ + aux_t *aux = &args->init; + gf_utr_t *utr = (gf_utr_t*) malloc(sizeof(gf_utr_t)); + utr->which = ftr->type==GF_UTR3 ? prime3 : prime5; + utr->beg = ftr->beg; + utr->end = ftr->end; + utr->tr = tscript_init(aux, ftr->trid); + + char *chr_beg, *chr_end; + chr_beg_end(&args->init, utr->tr->gene->iseq, &chr_beg, &chr_end); + regidx_push(args->idx_utr, chr_beg,chr_end, utr->beg,utr->end, &utr); +} +void register_exon(args_t *args, ftr_t *ftr) +{ + aux_t *aux = &args->init; + gf_exon_t *exon = (gf_exon_t*) malloc(sizeof(gf_exon_t)); + exon->beg = ftr->beg; + exon->end = ftr->end; + exon->tr = tscript_init(aux, ftr->trid); + + char *chr_beg, *chr_end; + chr_beg_end(&args->init, exon->tr->gene->iseq, &chr_beg, &chr_end); + regidx_push(args->idx_exon, chr_beg,chr_end, exon->beg - N_SPLICE_REGION_INTRON, exon->end + N_SPLICE_REGION_INTRON, &exon); +} + +void tscript_init_cds(args_t *args) +{ + aux_t *aux = &args->init; + + // Sort CDS in all transcripts, set offsets, check their phase, length, create index (idx_cds) + khint_t k; + int warn_phase_unkn = 0; + for (k=0; kid2tr); k++) + { + if ( !kh_exist(aux->id2tr, k) ) continue; + tscript_t *tr = (tscript_t*) kh_val(aux->id2tr, k); + + // position-to-tscript lookup + char *chr_beg, *chr_end; + chr_beg_end(aux, tr->gene->iseq, &chr_beg, &chr_end); + regidx_push(args->idx_tscript, chr_beg, chr_end, tr->beg, tr->end, &tr); + + if ( !tr->ncds ) continue; // transcript with no CDS + + // sort CDs + qsort(tr->cds, tr->ncds, sizeof(gf_cds_t*), cmp_cds_ptr); + + // trim non-coding start + int i, len = 0; + if ( tr->strand==STRAND_FWD ) + { + if ( tr->cds[0]->phase != CDS_PHASE_UNKN ) + { + if ( tr->cds[0]->phase ) tr->trim |= TRIM_5PRIME; + tr->cds[0]->beg += tr->cds[0]->phase; + tr->cds[0]->len -= tr->cds[0]->phase; + tr->cds[0]->phase = 0; + } + + // sanity check phase; the phase number in gff tells us how many bases to skip in this + // feature to reach the first base of the next codon + int tscript_ok = 1; + for (i=0; incds; i++) + { + if ( tr->cds[i]->phase == CDS_PHASE_UNKN ) + { + warn_phase_unkn = 1; + len += tr->cds[i]->len; + continue; + } + int phase = tr->cds[i]->phase ? 3 - tr->cds[i]->phase : 0; + if ( phase!=len%3 ) + { + if ( args->force ) + { + if ( args->verbosity > 0 ) + fprintf(stderr,"Warning: the GFF has inconsistent phase column in transcript %s, skipping. CDS pos=%d: phase!=len%%3 (phase=%d, len=%d)\n", + args->tscript_ids.str[tr->id],tr->cds[i]->beg+1,phase,len); + tscript_ok = 0; + break; + } + error("Error: GFF3 assumption failed for transcript %s, CDS=%d: phase!=len%%3 (phase=%d, len=%d). Use the --force option to proceed anyway (at your own risk).\n", + args->tscript_ids.str[tr->id],tr->cds[i]->beg+1,phase,len); + } + len += tr->cds[i]->len; + } + if ( !tscript_ok ) continue; // skip this transcript + } + else + { + if ( tr->cds[tr->ncds-1]->phase != CDS_PHASE_UNKN ) + { + // Check that the phase is not bigger than CDS length. Curiously, this can really happen, + // see Mus_musculus.GRCm38.85.gff3.gz, transcript:ENSMUST00000163141 + // todo: the same for the fwd strand + i = tr->ncds - 1; + int phase = tr->cds[i]->phase; + if ( phase ) tr->trim |= TRIM_5PRIME; + while ( i>=0 && phase > tr->cds[i]->len ) + { + phase -= tr->cds[i]->len; + tr->cds[i]->phase = 0; + tr->cds[i]->len = 0; + i--; + } + tr->cds[i]->len -= tr->cds[i]->phase; + tr->cds[i]->phase = 0; + } + + // sanity check phase + int tscript_ok = 1; + for (i=tr->ncds-1; i>=0; i--) + { + if ( tr->cds[i]->phase == CDS_PHASE_UNKN ) + { + warn_phase_unkn = 1; + len += tr->cds[i]->len; + continue; + } + int phase = tr->cds[i]->phase ? 3 - tr->cds[i]->phase : 0; + if ( phase!=len%3) + { + if ( args->force ) + { + if ( args->verbosity > 0 ) + fprintf(stderr,"Warning: the GFF has inconsistent phase column in transcript %s, skipping. CDS pos=%d: phase!=len%%3 (phase=%d, len=%d)\n", + args->tscript_ids.str[tr->id],tr->cds[i]->beg+1,phase,len); + tscript_ok = 0; + break; + } + error("Error: GFF3 assumption failed for transcript %s, CDS=%d: phase!=len%%3 (phase=%d, len=%d). Use the --force option to proceed anyway (at your own risk).\n", + args->tscript_ids.str[tr->id],tr->cds[i]->beg+1,phase,len); + } + len += tr->cds[i]->len; + } + if ( !tscript_ok ) continue; // skip this transcript + } + + // set len. At the same check that CDS within a transcript do not overlap + len = 0; + for (i=0; incds; i++) + { + tr->cds[i]->icds = i; + len += tr->cds[i]->len; + if ( !i ) continue; + + gf_cds_t *a = tr->cds[i-1]; + gf_cds_t *b = tr->cds[i]; + if ( a->beg + a->len - 1 >= b->beg ) + { + if ( args->force ) + { + fprintf(stderr,"Warning: GFF contains overlapping CDS %s: %"PRIu32"-%"PRIu32" and %"PRIu32"-%"PRIu32".\n", + args->tscript_ids.str[tr->id], a->beg+1,a->beg+a->len, b->beg+1,b->beg+b->len); + } + else + error("Error: CDS overlap in the transcript %s: %"PRIu32"-%"PRIu32" and %"PRIu32"-%"PRIu32", is this intended (e.g. ribosomal slippage)?\n" + " Use the --force option to override (at your own risk).\n", + args->tscript_ids.str[tr->id], a->beg+1,a->beg+a->len, b->beg+1,b->beg+b->len); + } + } + if ( len%3 != 0 ) + { + // There are 13k transcripts with incomplete 3' CDS. See for example ENST00000524289 + // http://sep2015.archive.ensembl.org/Homo_sapiens/Transcript/Sequence_cDNA?db=core;g=ENSG00000155868;r=5:157138846-157159019;t=ENST00000524289 + // Also, the incomplete CDS can be too short (1 or 2bp), so it is not enough to trim the last one. + + tr->trim |= TRIM_3PRIME; + if ( tr->strand==STRAND_FWD ) + { + i = tr->ncds - 1; + while ( i>=0 && len%3 ) + { + int dlen = tr->cds[i]->len >= len%3 ? len%3 : tr->cds[i]->len; + tr->cds[i]->len -= dlen; + len -= dlen; + i--; + } + } + else + { + i = 0; + while ( incds && len%3 ) + { + int dlen = tr->cds[i]->len >= len%3 ? len%3 : tr->cds[i]->len; + tr->cds[i]->len -= dlen; + tr->cds[i]->beg += dlen; + len -= dlen; + i++; + } + } + } + + // set CDS offsets and insert into regidx + len=0; + for (i=0; incds; i++) + { + tr->cds[i]->pos = len; + len += tr->cds[i]->len; + regidx_push(args->idx_cds, chr_beg,chr_end, tr->cds[i]->beg,tr->cds[i]->beg+tr->cds[i]->len-1, &tr->cds[i]); + } + } + if ( warn_phase_unkn && args->verbosity > 0 ) + fprintf(stderr,"Warning: encountered CDS with phase column unset, could not verify reading frame\n"); +} + +void regidx_free_gf(void *payload) { free(*((gf_cds_t**)payload)); } +void regidx_free_tscript(void *payload) { tscript_t *tr = *((tscript_t**)payload); free(tr->cds); free(tr); } + +void init_gff(args_t *args) +{ + aux_t *aux = &args->init; + aux->seq2int = khash_str2int_init(); // chrom's numeric id + aux->gid2gene = kh_init(int2gene); // gene id to gf_gene_t, for idx_gene + aux->id2tr = kh_init(int2tscript); // transcript id to tscript_t + args->idx_tscript = regidx_init(NULL, NULL, regidx_free_tscript, sizeof(tscript_t*), NULL); + aux->ignored_biotypes = khash_str2int_init(); + gff_id_init(&aux->gene_ids); + gff_id_init(&args->tscript_ids); + + // parse gff + kstring_t str = {0,0,0}; + htsFile *fp = hts_open(args->gff_fname,"r"); + if ( !fp ) error("Failed to read %s\n", args->gff_fname); + while ( hts_getline(fp, KS_SEP_LINE, &str) > 0 ) + { + hts_expand(ftr_t, aux->nftr+1, aux->mftr, aux->ftr); + int ret = gff_parse(args, str.s, aux->ftr + aux->nftr); + if ( !ret ) aux->nftr++; + } + free(str.s); + if ( hts_close(fp)!=0 ) error("Close failed: %s\n", args->gff_fname); + + + // process gff information: connect CDS and exons to transcripts + args->idx_cds = regidx_init(NULL, NULL, regidx_free_gf, sizeof(gf_cds_t*), NULL); + args->idx_utr = regidx_init(NULL, NULL, regidx_free_gf, sizeof(gf_utr_t*), NULL); + args->idx_exon = regidx_init(NULL, NULL, regidx_free_gf, sizeof(gf_exon_t*), NULL); + args->itr = regitr_init(NULL); + + int i; + for (i=0; inftr; i++) + { + ftr_t *ftr = &aux->ftr[i]; + + // check whether to keep this feature: is there a mapping trid -> gene_id -> gene? + khint_t k = kh_get(int2tscript, aux->id2tr, (int)ftr->trid); + if ( k==kh_end(aux->id2tr) ) continue; // no such transcript + + tscript_t *tr = kh_val(aux->id2tr,k); + if ( !tr->gene->name ) + { + // not a supported biotype (e.g. gene:pseudogene, transcript:processed_transcript) + regidx_free_tscript(&tr); + kh_del(int2tscript, aux->id2tr,k); + continue; + } + + // populate regidx by category: + // ftr->type .. GF_CDS, GF_EXON, GF_UTR3, GF_UTR5 + // gene->type .. GF_PROTEIN_CODING, GF_MT_rRNA, GF_IG_C, ... + if ( ftr->type==GF_CDS ) register_cds(args, ftr); + else if ( ftr->type==GF_EXON ) register_exon(args, ftr); + else if ( ftr->type==GF_UTR5 ) register_utr(args, ftr); + else if ( ftr->type==GF_UTR3 ) register_utr(args, ftr); + else + error("something: %s\t%d\t%d\t%s\t%s\n", aux->seq[ftr->iseq],ftr->beg+1,ftr->end+1,args->tscript_ids.str[ftr->trid],gf_type2gff_string(ftr->type)); + } + tscript_init_cds(args); + + if ( args->verbosity > 0 ) + { + fprintf(stderr,"Indexed %d transcripts, %d exons, %d CDSs, %d UTRs\n", + regidx_nregs(args->idx_tscript), + regidx_nregs(args->idx_exon), + regidx_nregs(args->idx_cds), + regidx_nregs(args->idx_utr)); + } + + free(aux->ftr); + khash_str2int_destroy_free(aux->seq2int); + // keeping only to destroy the genes at the end: kh_destroy(int2gene,aux->gid2gene); + kh_destroy(int2tscript,aux->id2tr); + free(aux->seq); + gff_id_destroy(&aux->gene_ids); + + if ( args->verbosity > 0 && khash_str2int_size(aux->ignored_biotypes) ) + { + khash_t(str2int) *ign = (khash_t(str2int)*)aux->ignored_biotypes; + fprintf(stderr,"Ignored the following biotypes:\n"); + for (i = kh_begin(ign); i < kh_end(ign); i++) + { + if ( !kh_exist(ign,i)) continue; + const char *biotype = kh_key(ign,i); + if ( !strcmp(biotype,"TCE") ) biotype = "TCE (\"To be Experimentally Confirmed\")"; + fprintf(stderr,"\t%dx\t.. %s\n", kh_value(ign,i), biotype); + } + } + khash_str2int_destroy_free(aux->ignored_biotypes); +} + +static inline int ncsq2_to_nfmt(int ncsq2) +{ + return 1 + (ncsq2 - 1) / 30; +} +static inline void icsq2_to_bit(int icsq2, int *ival, int *ibit) +{ + *ival = icsq2 / 30; + *ibit = icsq2 % 30; +} + +void init_data(args_t *args) +{ + args->nfmt_bcsq = ncsq2_to_nfmt(args->ncsq2_max); + + args->fai = fai_load(args->fa_fname); + if ( !args->fai ) error("Failed to load the fai index: %s\n", args->fa_fname); + + if ( args->verbosity > 0 ) fprintf(stderr,"Parsing %s ...\n", args->gff_fname); + init_gff(args); + + args->rid = -1; + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + + args->pos2vbuf = kh_init(pos2vbuf); + args->active_tr = khp_init(trhp); + args->hap = (hap_t*) calloc(1,sizeof(hap_t)); + + // init samples + if ( !bcf_hdr_nsamples(args->hdr) ) args->phase = PHASE_DROP_GT; + if ( args->sample_list && !strcmp("-",args->sample_list) ) + { + // ignore all samples + if ( args->output_type==FT_TAB_TEXT ) + { + // significant speedup for plain VCFs + if (bcf_hdr_set_samples(args->hdr,NULL,0) < 0) + error_errno("[%s] Couldn't build sample filter", __func__); + } + args->phase = PHASE_DROP_GT; + } + else + args->smpl = smpl_ilist_init(args->hdr, args->sample_list, args->sample_is_file, SMPL_STRICT); + args->hdr_nsmpl = args->phase==PHASE_DROP_GT ? 0 : bcf_hdr_nsamples(args->hdr); + + if ( args->output_type==FT_TAB_TEXT ) + { + args->out = args->output_fname ? fopen(args->output_fname,"w") : stdout; + if ( !args->out ) error("Failed to write to %s: %s\n", !strcmp("-",args->output_fname)?"standard output":args->output_fname,strerror(errno)); + + fprintf(args->out,"# This file was produced by: bcftools +csq(%s+htslib-%s)\n", bcftools_version(),hts_version()); + fprintf(args->out,"# The command line was:\tbcftools +%s", args->argv[0]); + int i; + for (i=1; iargc; i++) + fprintf(args->out," %s",args->argv[i]); + fprintf(args->out,"\n"); + fprintf(args->out,"# LOG\t[2]Message\n"); + fprintf(args->out,"# CSQ"); i = 1; + fprintf(args->out,"\t[%d]Sample", ++i); + fprintf(args->out,"\t[%d]Haplotype", ++i); + fprintf(args->out,"\t[%d]Chromosome", ++i); + fprintf(args->out,"\t[%d]Position", ++i); + fprintf(args->out,"\t[%d]Consequence", ++i); + fprintf(args->out,"\n"); + } + else + { + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("[%s] Error: cannot write to %s: %s\n", __func__,args->output_fname? args->output_fname : "standard output", strerror(errno)); + if ( args->n_threads > 0) + hts_set_opt(args->out_fh, HTS_OPT_THREAD_POOL, args->sr->p); + if ( args->record_cmd_line ) bcf_hdr_append_version(args->hdr,args->argc,args->argv,"bcftools/csq"); + bcf_hdr_printf(args->hdr,"##INFO=",args->bcsq_tag, args->local_csq ? "Local" : "Haplotype-aware"); + if ( args->hdr_nsmpl ) + bcf_hdr_printf(args->hdr,"##FORMAT=",args->bcsq_tag); + if ( bcf_hdr_write(args->out_fh, args->hdr)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname?args->output_fname:"standard output"); + } + if ( args->verbosity > 0 ) fprintf(stderr,"Calling...\n"); +} + +void destroy_data(args_t *args) +{ + if ( args->ncsq2_small_warned ) + fprintf(stderr, + "Note: Some samples had too many consequences to be represented in %d bytes. If you need to record them all,\n" + " the limit can be increased by running with `--ncsq %d`.\n",ncsq2_to_nfmt(args->ncsq2_max)/8,1+args->ncsq2_small_warned/2); + + regidx_destroy(args->idx_cds); + regidx_destroy(args->idx_utr); + regidx_destroy(args->idx_exon); + regidx_destroy(args->idx_tscript); + regitr_destroy(args->itr); + + khint_t k,i,j; + for (k=0; kinit.gid2gene); k++) + { + if ( !kh_exist(args->init.gid2gene, k) ) continue; + gf_gene_t *gene = (gf_gene_t*) kh_val(args->init.gid2gene, k); + free(gene->name); + free(gene); + } + kh_destroy(int2gene,args->init.gid2gene); + + if ( args->filter ) + filter_destroy(args->filter); + + khp_destroy(trhp,args->active_tr); + kh_destroy(pos2vbuf,args->pos2vbuf); + if ( args->smpl ) smpl_ilist_destroy(args->smpl); + int ret; + if ( args->out_fh ) + ret = hts_close(args->out_fh); + else + ret = fclose(args->out); + if ( ret ) error("Error: close failed .. %s\n", args->output_fname?args->output_fname:"stdout"); + for (i=0; ivcf_rbuf.m; i++) + { + vbuf_t *vbuf = args->vcf_buf[i]; + if ( !vbuf ) continue; + for (j=0; jm; j++) + { + if ( !vbuf->vrec[j] ) continue; + if ( vbuf->vrec[j]->line ) bcf_destroy(vbuf->vrec[j]->line); + free(vbuf->vrec[j]->fmt_bm); + free(vbuf->vrec[j]->vcsq); + free(vbuf->vrec[j]); + } + free(vbuf->vrec); + free(vbuf); + } + free(args->vcf_buf); + free(args->rm_tr); + free(args->csq_buf); + free(args->hap->stack); + free(args->hap->sseq.s); + free(args->hap->tseq.s); + free(args->hap->tref.s); + free(args->hap); + fai_destroy(args->fai); + free(args->gt_arr); + free(args->str.s); + free(args->str2.s); + gff_id_destroy(&args->tscript_ids); +} + +/* + The splice_* functions are for consquences around splice sites: start,stop,splice_* + */ +#define SPLICE_VAR_REF 0 // ref: ACGT>ACGT, csq not applicable, skip completely +#define SPLICE_OUTSIDE 1 // splice acceptor or similar; csq set and is done, does not overlap the region +#define SPLICE_INSIDE 2 // overlaps coding region; csq can be set but coding prediction is needed +#define SPLICE_OVERLAP 3 // indel overlaps region boundary, csq set but could not determine csq +typedef struct +{ + tscript_t *tr; + struct { + int32_t pos, rlen, alen, ial; + char *ref, *alt; + bcf1_t *rec; + } vcf; + uint16_t check_acceptor:1, // check distance from exon start (fwd) or end (rev) + check_start:1, // this is the first coding exon (relative to transcript orientation), check first (fwd) or last (rev) codon + check_stop:1, // this is the last coding exon (relative to transcript orientation), check last (fwd) or first (rev) codon + check_donor:1, // as with check_acceptor + check_region_beg:1, // do/don't check for splices at this end, eg. in the first or last exon + check_region_end:1, // + check_utr:1, // check splice sites (acceptor/donor/region_*) only if not in utr + set_refalt:1; // set kref,kalt, if set, check also for synonymous events + uint32_t csq; + int tbeg, tend; // number of trimmed bases from beg and end of ref,alt allele + uint32_t ref_beg, // ref coordinates with spurious bases removed, ACC>AC can become AC>A or CC>C, whichever gives + ref_end; // a more conservative csq (the first and last base in kref.s) + kstring_t kref, kalt; // trimmed alleles, set only with SPLICE_OLAP +} +splice_t; +void splice_init(splice_t *splice, bcf1_t *rec) +{ + memset(splice,0,sizeof(*splice)); + splice->vcf.rec = rec; + splice->vcf.pos = rec->pos; + splice->vcf.rlen = rec->rlen; + splice->vcf.ref = rec->d.allele[0]; + splice->csq = 0; +} +static inline void splice_build_hap(splice_t *splice, uint32_t beg, int len) +{ + // len>0 .. beg is the first base, del filled from right + // len<0 .. beg is the last base, del filled from left + + int rlen, alen, rbeg, abeg; // first base to include (ref coordinates) + if ( len<0 ) + { + rlen = alen = -len; + rbeg = beg - rlen + 1; + int dlen = splice->vcf.alen - splice->vcf.rlen; + if ( dlen<0 && beg < splice->ref_end ) // incomplete del, beg is in the middle + dlen += splice->ref_end - beg; + abeg = rbeg + dlen; + } + else + { + rbeg = abeg = beg; + rlen = alen = len; + // check for incomplete del as above?? + } + +#define XDBG 0 +#if XDBG +fprintf(stderr,"build_hap: rbeg=%d + %d abeg=%d \n",rbeg,rlen,abeg); +#endif + splice->kref.l = 0; + splice->kalt.l = 0; + + // add the part before vcf.ref, in the vcf.ref and after vcf.ref + int roff; // how many vcf.ref bases already used + if ( rbeg < splice->vcf.pos ) + { + assert( splice->tr->beg <= rbeg ); // this can be extended thanks to N_REF_PAD + kputsn(splice->tr->ref + N_REF_PAD + rbeg - splice->tr->beg, splice->vcf.pos - rbeg, &splice->kref); + roff = 0; + } + else + roff = rbeg - splice->vcf.pos; +#if XDBG +fprintf(stderr,"r1: %s roff=%d\n",splice->kref.s,roff); +#endif + + if ( roff < splice->vcf.rlen && splice->kref.l < rlen ) + { + int len = splice->vcf.rlen - roff; // len still available in vcf.ref + if ( len > rlen - splice->kref.l ) len = rlen - splice->kref.l; // how much of ref allele is still needed + kputsn(splice->vcf.ref + roff, len, &splice->kref); + } +#if XDBG +fprintf(stderr,"r2: %s\n",splice->kref.s); +#endif + + uint32_t end = splice->vcf.pos + splice->vcf.rlen; // position just after the ref allele + if ( splice->kref.l < rlen ) + { + if ( end + rlen - splice->kref.l - 1 > splice->tr->end ) // trim, the requested sequence is too long (could be extended, see N_REF_PAD) + rlen -= end + rlen - splice->kref.l - 1 - splice->tr->end; + if ( splice->kref.l < rlen ) + kputsn(splice->tr->ref + N_REF_PAD + end - splice->tr->beg, rlen - splice->kref.l, &splice->kref); + } +#if XDBG +fprintf(stderr,"r3: %s\n",splice->kref.s); +#endif + + + int aoff; + if ( abeg < splice->vcf.pos ) + { + assert( splice->tr->beg <= abeg ); + kputsn(splice->tr->ref + N_REF_PAD + abeg - splice->tr->beg, splice->vcf.pos - abeg, &splice->kalt); + aoff = 0; + } + else + aoff = abeg - splice->vcf.pos; +#if XDBG +fprintf(stderr,"a1: %s aoff=%d\n",splice->kalt.s,aoff); +#endif + + if ( aoff < splice->vcf.alen && splice->kalt.l < alen ) + { + int len = splice->vcf.alen - aoff; // len still available in vcf.alt + if ( len > alen - splice->kalt.l ) len = alen - splice->kalt.l; // how much of alt allele is still needed + kputsn(splice->vcf.alt + aoff, len, &splice->kalt); + aoff -= len; + } + if ( aoff < 0 ) aoff = 0; + else aoff--; +#if XDBG +fprintf(stderr,"a2: %s aoff=%d\n",splice->kalt.s,aoff); +#endif + + end = splice->vcf.pos + splice->vcf.rlen; // position just after the ref allele + if ( splice->kalt.l < alen ) + { + if ( end + alen + aoff - splice->kalt.l - 1 > splice->tr->end ) // trim, the requested sequence is too long + alen -= end + alen + aoff - splice->kalt.l - 1 - splice->tr->end; + if ( alen > 0 && alen > splice->kalt.l ) + kputsn(splice->tr->ref + aoff + N_REF_PAD + end - splice->tr->beg, alen - splice->kalt.l, &splice->kalt); + } +#if XDBG +fprintf(stderr,"a3: %s\n",splice->kalt.s); +fprintf(stderr," [%s]\n [%s]\n\n",splice->kref.s,splice->kalt.s); +#endif +} +void csq_stage(args_t *args, csq_t *csq, bcf1_t *rec); +static inline int csq_stage_utr(args_t *args, regitr_t *itr, bcf1_t *rec, uint32_t trid, uint32_t type, int ial) +{ + while ( regitr_overlap(itr) ) + { + gf_utr_t *utr = regitr_payload(itr, gf_utr_t*); + tscript_t *tr = utr->tr; + if ( tr->id != trid ) continue; + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.type = (utr->which==prime5 ? CSQ_UTR5 : CSQ_UTR3) | type; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = ial; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + return csq.type.type; + } + return 0; +} +static inline void csq_stage_splice(args_t *args, bcf1_t *rec, tscript_t *tr, uint32_t type, int ial) +{ +#if XDBG +fprintf(stderr,"csq_stage_splice %d: type=%d\n",rec->pos+1,type); +#endif + if ( !type ) return; + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.type = type; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = ial; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); +} +static inline int splice_csq_ins(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + // coordinates that matter for consequences, eg AC>ACG trimmed to C>CG, 1bp + // before and after the inserted bases + if ( splice->tbeg || splice->vcf.ref[0]!=splice->vcf.alt[0] ) + { + splice->ref_beg = splice->vcf.pos + splice->tbeg - 1; + splice->ref_end = splice->vcf.pos + splice->vcf.rlen - splice->tend; + } + else + { + if ( splice->tend ) splice->tend--; + splice->ref_beg = splice->vcf.pos; + splice->ref_end = splice->vcf.pos + splice->vcf.rlen - splice->tend; + } +#if XDBG +fprintf(stderr,"ins: %s>%s .. ex=%d,%d beg,end=%d,%d tbeg,tend=%d,%d check_utr=%d start,stop,beg,end=%d,%d,%d,%d\n", splice->vcf.ref,splice->vcf.alt,ex_beg,ex_end,splice->ref_beg,splice->ref_end,splice->tbeg,splice->tend,splice->check_utr,splice->check_start,splice->check_stop,splice->check_region_beg,splice->check_region_end); +#endif + + int ret; + if ( splice->ref_beg >= ex_end ) // fully outside, beyond the exon + { + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,splice->ref_beg+1,splice->ref_beg+1, itr) ) // adjacent utr + { + ret = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + if ( ret!=0 ) + { + regitr_destroy(itr); + return SPLICE_OUTSIDE; // overlaps utr + } + } + regitr_destroy(itr); + } + if ( !splice->check_region_end ) return SPLICE_OUTSIDE; + char *ref = NULL, *alt = NULL; + if ( splice->set_refalt ) // seq identity is checked only when tr->ref is available + { + splice_build_hap(splice, ex_end+1, N_SPLICE_REGION_INTRON); + ref = splice->kref.s, alt = splice->kalt.s; + } + if ( splice->ref_beg < ex_end + N_SPLICE_REGION_INTRON && splice->ref_end > ex_end + N_SPLICE_DONOR ) + { + splice->csq |= CSQ_SPLICE_REGION; + if ( ref && !strncmp(ref,alt,N_SPLICE_REGION_INTRON) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + if ( splice->ref_beg < ex_end + N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + if ( ref && !strncmp(ref,alt,N_SPLICE_DONOR) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_OUTSIDE; + } + if ( splice->ref_end < ex_beg || (splice->ref_end == ex_beg && !splice->check_region_beg) ) // fully outside, before the exon + { + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,splice->ref_end-1,splice->ref_end-1, itr) ) // adjacent utr + { + ret = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + if ( ret!=0 ) + { + regitr_destroy(itr); + return SPLICE_OUTSIDE; // overlaps utr + } + } + regitr_destroy(itr); + } + if ( !splice->check_region_beg ) return SPLICE_OUTSIDE; + char *ref = NULL, *alt = NULL; + if ( splice->set_refalt ) // seq identity is checked only when tr->ref is available + { + splice_build_hap(splice, ex_beg - N_SPLICE_REGION_INTRON, N_SPLICE_REGION_INTRON); + ref = splice->kref.s, alt = splice->kalt.s; + } + if ( splice->ref_end > ex_beg - N_SPLICE_REGION_INTRON && splice->ref_beg < ex_beg - N_SPLICE_DONOR ) + { + splice->csq |= CSQ_SPLICE_REGION; + if ( ref && !strncmp(ref,alt,N_SPLICE_REGION_INTRON) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + if ( splice->ref_end > ex_beg - N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + if ( ref && !strncmp(ref+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,alt+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,N_SPLICE_DONOR) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_OUTSIDE; + } + // overlaps the exon or inside the exon + // possible todo: find better alignment for frameshifting variants? + if ( splice->ref_beg <= ex_beg + 2 ) // in the first 3bp + { + if ( splice->check_region_beg ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_FWD ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->ref_end > ex_end - 2 ) + { + if ( splice->check_region_end ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_REV ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->set_refalt ) + { + // Make sure the variant will not end up left aligned to avoid overlapping vcf records + // splice_build_hap(splice, splice->ref_beg, splice->vcf.alen - splice->tend - splice->tbeg + 1); + // splice->vcf.rlen -= splice->tbeg + splice->tend - 1; + // if ( splice->kref.l > splice->vcf.rlen ) { splice->kref.l = splice->vcf.rlen; splice->kref.s[splice->kref.l] = 0; } + if ( splice->ref_beg < splice->vcf.pos ) // this must have been caused by too much trimming from right + { + int dlen = splice->vcf.pos - splice->ref_beg; + assert( dlen==1 ); + splice->tbeg += dlen; + if ( splice->tbeg + splice->tend == splice->vcf.rlen ) splice->tend -= dlen; + splice->ref_beg = splice->vcf.pos; + } + if ( splice->ref_end==ex_beg ) splice->tend--; // prevent zero-length ref allele + splice_build_hap(splice, splice->ref_beg, splice->vcf.alen - splice->tend - splice->tbeg + 1); + splice->vcf.rlen -= splice->tbeg + splice->tend - 1; + if ( splice->kref.l > splice->vcf.rlen ) { splice->kref.l = splice->vcf.rlen; splice->kref.s[splice->kref.l] = 0; } + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_INSIDE; +} + +int shifted_del_synonymous(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + static int small_ref_padding_warned = 0; + tscript_t *tr = splice->tr; + + // We know the VCF record overlaps the exon, but does it overlap the start codon? + if ( tr->strand==STRAND_REV && splice->vcf.pos + splice->vcf.rlen + 2 <= ex_end ) return 0; + if ( tr->strand==STRAND_FWD && splice->vcf.pos >= ex_beg + 3 ) return 0; + +#if XDBG + fprintf(stderr,"shifted_del_synonymous: %d-%d %s\n",ex_beg,ex_end, tr->strand==STRAND_FWD?"fwd":"rev"); + fprintf(stderr," %d .. %s > %s\n",splice->vcf.pos+1,splice->vcf.ref,splice->vcf.alt); +#endif + + // is there enough ref sequence for the extension? All coordinates are 0-based + int ref_len = strlen(splice->vcf.ref); + int alt_len = strlen(splice->vcf.alt); + assert( ref_len > alt_len ); + int ndel = ref_len - alt_len; + + if ( tr->strand==STRAND_REV ) + { + int32_t vcf_ref_end = splice->vcf.pos + ref_len - 1; // end pos of the VCF REF allele + int32_t tr_ref_end = splice->tr->end + N_REF_PAD; // the end pos of accessible cached ref seq + if ( vcf_ref_end + ndel > tr_ref_end ) + { + if ( !small_ref_padding_warned ) + { + fprintf(stderr,"Warning: Could not verify synonymous start/stop at %s:%d due to small N_REF_PAD. (Improve me?)\n",bcf_seqname(args->hdr,splice->vcf.rec),splice->vcf.pos+1); + small_ref_padding_warned = 1; + } + return 0; + } + + char *ptr_vcf = splice->vcf.ref + alt_len; // the first deleted base in the VCF REF allele + char *ptr_ref = splice->tr->ref + N_REF_PAD + (vcf_ref_end + 1 - splice->tr->beg); // the first ref base after the ndel bases deleted +#if XDBG + fprintf(stderr,"vcf: %s\nref: %s\n",ptr_vcf,ptr_ref); +#endif + int i = 0; + while ( ptr_vcf[i] && ptr_vcf[i]==ptr_ref[i] ) i++; + if ( ptr_vcf[i] ) return 0; // the deleted sequence cannot be replaced + } + else + { + // STRAND_FWD + int32_t vcf_block_beg = splice->vcf.pos + ref_len - 2*ndel; // the position of the first base of the ref block that could potentially replace the deletion + if ( vcf_block_beg < 0 ) return 0; + +#if XDBG + fprintf(stderr,"vcf_block_beg: %d\n",vcf_block_beg+1); +#endif + + if ( N_REF_PAD + vcf_block_beg < ex_beg ) + { + if ( !small_ref_padding_warned ) + { + fprintf(stderr,"Warning: Could not verify synonymous start/stop at %s:%d due to small N_REF_PAD. (Improve me?)\n",bcf_seqname(args->hdr,splice->vcf.rec),splice->vcf.pos+1); + small_ref_padding_warned = 1; + } + return 0; + } + + char *ptr_vcf = splice->vcf.ref + alt_len; // the first deleted base in the VCF REF allele + char *ptr_ref = splice->tr->ref + N_REF_PAD + vcf_block_beg - splice->tr->beg; // the replacement ref block +#if XDBG + fprintf(stderr,"vcf: %s\nref: %s\n",ptr_vcf,ptr_ref); +#endif + + int i = 0; + while ( ptr_vcf[i] && ptr_vcf[i]==ptr_ref[i] ) i++; + if ( ptr_vcf[i] ) return 0; // the deleted sequence cannot be replaced + } + + return 1; +} + +static inline int splice_csq_del(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + if ( splice->check_start ) + { + // check for synonymous start + // test/csq/ENST00000375992/incorrect-synon-del-not-start-lost.txt + // test/csq/ENST00000368801.2/start-lost.txt + // test/csq/ENST00000318249.2/synonymous-start-lost.txt + int is_synonymous = shifted_del_synonymous(args, splice, ex_beg, ex_end); + if ( is_synonymous ) + { + splice->csq |= CSQ_START_RETAINED; + return SPLICE_OVERLAP; + } + } + + // coordinates that matter for consequences, eg AC>ACG trimmed to C>CG + splice->ref_beg = splice->vcf.pos + splice->tbeg - 1; // 1b before the deleted base + splice->ref_end = splice->vcf.pos + splice->vcf.rlen - splice->tend - 1; // the last deleted base + +#if XDBG +fprintf(stderr,"splice_csq_del: %s>%s .. ex=%d,%d beg,end=%d,%d tbeg,tend=%d,%d check_utr=%d start,stop,beg,end=%d,%d,%d,%d\n", splice->vcf.ref,splice->vcf.alt,ex_beg,ex_end,splice->ref_beg,splice->ref_end,splice->tbeg,splice->tend,splice->check_utr,splice->check_start,splice->check_stop,splice->check_region_beg,splice->check_region_end); +#endif + + if ( splice->ref_beg + 1 < ex_beg ) // the part before the exon; ref_beg is off by -1 + { + if ( splice->check_region_beg ) + { + int csq = 0; + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,splice->ref_beg,ex_beg-1, itr) ) // adjacent utr + csq = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + regitr_destroy(itr); + } + if ( !csq ) + { + char *ref = NULL, *alt = NULL; + if ( splice->set_refalt ) // seq identity is checked only when tr->ref is available + { + // filling from the left does not work for ENST00000341065/frame3.vcf + // CAG.GTGGCCAG CAG.GTGGCCAG + // CA-.--GGCCAG vs CAG.---GCCAG + // splice_build_hap(splice, ex_beg-1, -N_SPLICE_REGION_INTRON); + // + // filling from the right: + splice_build_hap(splice, ex_beg - N_SPLICE_REGION_INTRON, N_SPLICE_REGION_INTRON); + ref = splice->kref.s, alt = splice->kalt.s; + } + if ( splice->ref_end >= ex_beg - N_SPLICE_REGION_INTRON && splice->ref_beg < ex_beg - N_SPLICE_DONOR ) + { + splice->csq |= CSQ_SPLICE_REGION; + if ( ref && alt && !strncmp(ref,alt,N_SPLICE_REGION_INTRON) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + if ( splice->ref_end >= ex_beg - N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + if ( ref && alt && !strncmp(ref+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,alt+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,N_SPLICE_DONOR) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + } + } + if ( splice->ref_end >= ex_beg ) + { + splice->tbeg = splice->ref_beg - splice->vcf.pos + 1; + splice->ref_beg = ex_beg - 1; + if ( splice->tbeg + splice->tend == splice->vcf.alen ) + { + // the deletion overlaps ex_beg and cannot be easily realigned to the right + if ( !splice->tend ) + { + splice->csq |= CSQ_CODING_SEQUENCE; + return SPLICE_OVERLAP; + } + splice->tend--; + } + } + } + if ( ex_end < splice->ref_end ) // the part after the exon + { + if ( splice->check_region_end ) + { + int csq = 0; + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,ex_end+1,splice->ref_end, itr) ) // adjacent utr + csq = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + regitr_destroy(itr); + } + if ( !csq ) + { + char *ref = NULL, *alt = NULL; + if ( splice->set_refalt ) // seq identity is checked only when tr->ref is available + { + splice_build_hap(splice, ex_end+1, N_SPLICE_REGION_INTRON); // ref,alt positioned at the first intron base + ref = splice->kref.s, alt = splice->kalt.s; + } + if ( splice->ref_beg < ex_end + N_SPLICE_REGION_INTRON && splice->ref_end > ex_end + N_SPLICE_DONOR ) + { + splice->csq |= CSQ_SPLICE_REGION; + if ( ref && alt && !strncmp(ref,alt,N_SPLICE_REGION_INTRON) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + if ( splice->ref_beg < ex_end + N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + if ( ref && alt && !strncmp(ref+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,alt+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,N_SPLICE_DONOR) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + } + } + if ( splice->ref_beg < ex_end ) + { + splice->tend = splice->vcf.rlen - (splice->ref_end - splice->vcf.pos + 1); + splice->ref_end = ex_end; + } + } + if ( splice->ref_end < ex_beg || splice->ref_beg >= ex_end ) + { + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_OUTSIDE; + } + if ( splice->ref_beg < ex_beg + 2 ) // ref_beg is off by -1 + { + if ( splice->check_region_beg ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_FWD ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->ref_end > ex_end - 3 ) + { + if ( splice->check_region_end ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_REV ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->set_refalt ) + { + if ( splice->tbeg>0 ) splice->tbeg--; //why is this? + if ( splice->vcf.rlen > splice->tbeg + splice->tend && splice->vcf.alen > splice->tbeg + splice->tend ) + { + splice->vcf.rlen -= splice->tbeg + splice->tend; + splice->vcf.alen -= splice->tbeg + splice->tend; + } + splice->kref.l = 0; kputsn(splice->vcf.ref + splice->tbeg, splice->vcf.rlen, &splice->kref); + splice->kalt.l = 0; kputsn(splice->vcf.alt + splice->tbeg, splice->vcf.alen, &splice->kalt); + if ( (splice->ref_beg+1 < ex_beg && splice->ref_end >= ex_beg) || (splice->ref_beg+1 < ex_end && splice->ref_end >= ex_end) ) // ouch, ugly ENST00000409523/long-overlapping-del.vcf + { + splice->csq |= (splice->ref_end - splice->ref_beg)%3 ? CSQ_FRAMESHIFT_VARIANT : CSQ_INFRAME_DELETION; + return SPLICE_OVERLAP; + } + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_INSIDE; +} + +static inline int splice_csq_mnp(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + // not a real variant, can be ignored: eg ACGT>ACGT + if ( splice->tbeg + splice->tend == splice->vcf.rlen ) return SPLICE_VAR_REF; + + splice->ref_beg = splice->vcf.pos + splice->tbeg; + splice->ref_end = splice->vcf.pos + splice->vcf.rlen - splice->tend - 1; + +#if XDBG +fprintf(stderr,"mnp: %s>%s .. ex=%d,%d beg,end=%d,%d tbeg,tend=%d,%d check_utr=%d start,stop,beg,end=%d,%d,%d,%d\n", splice->vcf.ref,splice->vcf.alt,ex_beg,ex_end,splice->ref_beg,splice->ref_end,splice->tbeg,splice->tend,splice->check_utr,splice->check_start,splice->check_stop,splice->check_region_beg,splice->check_region_end); +#endif + + if ( splice->ref_beg < ex_beg ) // the part before the exon + { + if ( splice->check_region_beg ) + { + int csq = 0; + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,splice->ref_beg,ex_beg-1, itr) ) // adjacent utr + csq = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + regitr_destroy(itr); + } + if ( !csq ) + { + if ( splice->ref_end >= ex_beg - N_SPLICE_REGION_INTRON && splice->ref_beg < ex_beg - N_SPLICE_DONOR ) + splice->csq |= CSQ_SPLICE_REGION; + if ( splice->ref_end >= ex_beg - N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + } + } + } + if ( splice->ref_end >= ex_beg ) + { + splice->tbeg = splice->ref_beg - splice->vcf.pos; + splice->ref_beg = ex_beg; + } + } + if ( ex_end < splice->ref_end ) // the part after the exon + { + if ( splice->check_region_end ) + { + int csq = 0; + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,ex_end+1,splice->ref_end, itr) ) // adjacent utr + csq = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + regitr_destroy(itr); + } + if ( !csq ) + { + if ( splice->ref_beg <= ex_end + N_SPLICE_REGION_INTRON && splice->ref_end > ex_end + N_SPLICE_DONOR ) + splice->csq |= CSQ_SPLICE_REGION; + if ( splice->ref_beg <= ex_end + N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + } + } + } + if ( splice->ref_beg <= ex_end ) + { + splice->tend = splice->vcf.rlen - (splice->ref_end - splice->vcf.pos + 1); + splice->ref_end = ex_end; + } + } + if ( splice->ref_end < ex_beg || splice->ref_beg > ex_end ) + { + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_OUTSIDE; + } + + if ( splice->ref_beg < ex_beg + 3 ) + { + if ( splice->check_region_beg ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_FWD ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->ref_end > ex_end - 3 ) + { + if ( splice->check_region_end ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_REV ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->set_refalt ) + { + splice->vcf.rlen -= splice->tbeg + splice->tend; + splice->kref.l = 0; kputsn(splice->vcf.ref + splice->tbeg, splice->vcf.rlen, &splice->kref); + splice->kalt.l = 0; kputsn(splice->vcf.alt + splice->tbeg, splice->vcf.rlen, &splice->kalt); + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_INSIDE; +} +static inline int splice_csq(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + splice->vcf.alen = strlen(splice->vcf.alt); + + int rlen1 = splice->vcf.rlen - 1, alen1 = splice->vcf.alen - 1, i = 0; + splice->tbeg = 0, splice->tend = 0; + + // trim from the right, then from the left + while ( i<=rlen1 && i<=alen1 ) + { + if ( splice->vcf.ref[rlen1-i] != splice->vcf.alt[alen1-i] ) break; + i++; + } + splice->tend = i; + rlen1 -= i, alen1 -= i, i = 0; + while ( i<=rlen1 && i<=alen1 ) + { + if ( splice->vcf.ref[i] != splice->vcf.alt[i] ) break; + i++; + } + splice->tbeg = i; + + // The mnp, ins and del code was split into near-identical functions for clarity and debugging; + // possible todo: generalize once stable + if ( splice->vcf.rlen==splice->vcf.alen ) return splice_csq_mnp(args, splice, ex_beg, ex_end); + if ( splice->vcf.rlen < splice->vcf.alen ) return splice_csq_ins(args, splice, ex_beg, ex_end); + if ( splice->vcf.rlen > splice->vcf.alen ) return splice_csq_del(args, splice, ex_beg, ex_end); + + return 0; +} + + +// return value: 0 added, 1 overlapping variant, 2 silent discard (intronic,alt=ref) +int hap_init(args_t *args, hap_node_t *parent, hap_node_t *child, gf_cds_t *cds, bcf1_t *rec, int ial) +{ + int i; + kstring_t str = {0,0,0}; + tscript_t *tr = cds->tr; + child->icds = cds->icds; // index of cds in the tscript's list of exons + child->vcf_ial = ial; + + splice_t splice; + splice_init(&splice, rec); + splice.tr = tr; + splice.vcf.ial = ial; + splice.vcf.alt = rec->d.allele[ial]; + splice.check_acceptor = splice.check_donor = splice.set_refalt = splice.check_utr = 1; + if ( !(tr->trim & TRIM_5PRIME) ) + { + if ( tr->strand==STRAND_FWD ) { if ( child->icds==0 ) splice.check_start = 1; } + else { if ( child->icds==tr->ncds-1 ) splice.check_start = 1; } + } + if ( !(tr->trim & TRIM_3PRIME) ) + { + if ( tr->strand==STRAND_FWD ) { if ( child->icds==tr->ncds-1 ) splice.check_stop = 1; } + else { if ( child->icds==0 ) splice.check_stop = 1; } + } + if ( splice.check_start ) // do not check starts in incomplete CDS, defined as not starting with M + { + if ( tr->strand==STRAND_FWD ) { if ( dna2aa(tr->ref+N_REF_PAD+cds->beg-tr->beg) != 'M' ) splice.check_start = 0; } + else { if ( cdna2aa(tr->ref+N_REF_PAD+cds->beg-tr->beg+cds->len-3) != 'M' ) splice.check_start = 0; } + } + if ( child->icds!=0 ) splice.check_region_beg = 1; + if ( child->icds!=tr->ncds-1 ) splice.check_region_end = 1; + +#if XDBG +fprintf(stderr,"\nhap_init: %d [%s][%s] check start:%d,stop:%d\n",splice.vcf.pos+1,splice.vcf.ref,splice.vcf.alt,splice.check_start,splice.check_stop); +#endif + int ret = splice_csq(args, &splice, cds->beg, cds->beg + cds->len - 1); +#if XDBG +fprintf(stderr,"cds splice_csq: %d [%s][%s] .. beg,end=%d %d, ret=%d, csq=%d\n\n",splice.vcf.pos+1,splice.kref.s,splice.kalt.s,splice.ref_beg+1,splice.ref_end+1,ret,splice.csq); +#endif + + if ( ret==SPLICE_VAR_REF ) return 2; // not a variant, eg REF=CA ALT=CA + if ( ret==SPLICE_OUTSIDE || ret==SPLICE_OVERLAP || splice.csq==CSQ_START_LOST ) // not a coding csq + { + free(splice.kref.s); + free(splice.kalt.s); + + if ( !splice.csq ) return 2; // fully intronic, no csq + + // splice_region/acceptor/donor + child->seq = NULL; + child->sbeg = 0; + child->rbeg = rec->pos; + child->rlen = 0; + child->dlen = 0; + kputs(rec->d.allele[0],&str); + kputc('>',&str); + kputs(rec->d.allele[ial],&str); + child->var = str.s; + child->type = HAP_SSS; + child->csq = splice.csq; + child->rec = rec; + return 0; + } + if ( splice.csq & CSQ_SYNONYMOUS_VARIANT ) splice.csq &= ~CSQ_SYNONYMOUS_VARIANT; // synonymous&splice,frame could become synonymous&frame,splice + + int dbeg = 0; + if ( splice.ref_beg < cds->beg ) + { + // The vcf record overlaps the exon boundary, but the variant itself + // should fit inside since we are here. This will need more work. + // #1475227917 + dbeg = cds->beg - splice.ref_beg; + splice.kref.l -= dbeg; + splice.ref_beg = cds->beg; + assert( dbeg <= splice.kalt.l ); + } + + assert( parent->type!=HAP_SSS ); + if ( parent->type==HAP_CDS ) + { + i = parent->icds; + if ( i!=cds->icds ) + { + // the variant is on a new exon, finish up the previous + int len = tr->cds[i]->len - parent->rbeg - parent->rlen + tr->cds[i]->beg; + if ( len > 0 ) + kputsn_(tr->ref + N_REF_PAD + parent->rbeg + parent->rlen - tr->beg, len, &str); + } + + // append any skipped non-variant exons + while ( ++i < cds->icds ) + kputsn_(tr->ref + N_REF_PAD + tr->cds[i]->beg - tr->beg, tr->cds[i]->len, &str); + + if ( parent->icds==child->icds ) + { + int len = splice.ref_beg - parent->rbeg - parent->rlen; + if ( len < 0 ) // overlapping variants + { + free(str.s); + free(splice.kref.s); + free(splice.kalt.s); + return 1; + } + kputsn_(tr->ref + N_REF_PAD + parent->rbeg + parent->rlen - tr->beg, len, &str); + } + else + kputsn_(tr->ref + N_REF_PAD + cds->beg - tr->beg, splice.ref_beg - cds->beg, &str); + } + kputs(splice.kalt.s + dbeg, &str); + + child->seq = str.s; + child->sbeg = cds->pos + (splice.ref_beg - cds->beg); + child->rbeg = splice.ref_beg; + child->rlen = splice.kref.l; + child->type = HAP_CDS; + child->prev = parent; + child->rec = rec; + child->csq = splice.csq; + + // set vlen and the "ref>alt" string + { + int rlen = strlen(rec->d.allele[0]); + int alen = strlen(rec->d.allele[ial]); + child->dlen = alen - rlen; + child->var = (char*) malloc(rlen+alen+2); + memcpy(child->var,rec->d.allele[0],rlen); + child->var[rlen] = '>'; + memcpy(child->var+rlen+1,rec->d.allele[ial],alen); + child->var[rlen+alen+1] = 0; + } + + // yuck, the whole CDS is modified/deleted, not ready for this, todo. + if ( child->rbeg + child->rlen > cds->beg + cds->len ) + { + child->type = HAP_SSS; + if ( !child->csq ) child->csq |= CSQ_CODING_SEQUENCE; // hack, specifically for ENST00000390520/deletion-overlap.vcf + } + + + free(splice.kref.s); + free(splice.kalt.s); + return 0; +} +void hap_destroy(hap_node_t *hap) +{ + int i; + for (i=0; inchild; i++) + if ( hap->child[i] ) hap_destroy(hap->child[i]); + for (i=0; imcsq_list; i++) free(hap->csq_list[i].type.vstr.s); + free(hap->csq_list); + free(hap->child); + free(hap->cur_child); + free(hap->seq); + free(hap->var); + free(hap); +} + + +/* + ref: spliced reference and its length (ref.l) + seq: part of the spliced query transcript on the reference strand to translate, its + length (seq.l) and the total length of the complete transcript (seq.m) + sbeg: seq offset within the spliced query transcript + rbeg: seq offset within ref, 0-based + rend: last base of seq within ref, plus one. If seq does not contain indels, it is rend=rbeg+seq->l + strand: coding strand - 0:rev, 1:fwd + tseq: translated sequence (aa) + fill: frameshift, fill until the end (strand=fwd) or from the start (strand=rev) + */ +void cds_translate(kstring_t *_ref, kstring_t *_seq, uint32_t sbeg, uint32_t rbeg, uint32_t rend, int strand, kstring_t *tseq, int fill) +{ +#if XDBG +fprintf(stderr,"\ntranslate: %d %d %d fill=%d seq.l=%d\n",sbeg,rbeg,rend,fill,(int)_seq->l); +#endif + char tmp[3], *codon, *end; + int i, len, npad; + + kstring_t ref = *_ref; + kstring_t seq = *_seq; + + tseq->l = 0; + if ( !seq.l ) + { + kputc('?', tseq); + return; + } + +#define DBG 0 +#if DBG + fprintf(stderr,"translate: sbeg,rbeg,rend=%d %d %d fill=%d seq.l=%d\n",sbeg,rbeg,rend,fill,(int)_seq->l); + fprintf(stderr," ref: l=%d %s\n", (int)ref.l,ref.s); + fprintf(stderr," seq: l=%d m=%d ", (int)seq.l,(int)seq.m); + for (i=0; i1 + fprintf(stderr," npad: %d\n",npad); +#endif + assert( npad<=rbeg ); + + for (i=0; i1 + fprintf(stderr,"\t i=%d\n", i); +#endif + if ( i==3 ) + { + kputc_(dna2aa(tmp), tseq); +#if DBG>1 + fprintf(stderr,"[1]%c%c%c\n",tmp[0],tmp[1],tmp[2]); +#endif + codon = seq.s + 3 - npad; // next codon + end = codon + len - 1 - (len % 3); // last position of a valid codon + while ( codon < end ) + { + kputc_(dna2aa(codon), tseq); +#if DBG>1 + fprintf(stderr,"[2]%c%c%c\n",codon[0],codon[1],codon[2]); +#endif + codon += 3; + } + end = seq.s + seq.l - 1; + for (i=0; codon+i<=end; i++) tmp[i] = codon[i]; + } + + // right padding + codon = ref.s + rend + N_REF_PAD; + if ( i>0 ) + { +#if DBG>1 + if(i==1)fprintf(stderr,"[3]%c\n",tmp[0]); + if(i==2)fprintf(stderr,"[3]%c%c\n",tmp[0],tmp[1]); +#endif + for (; i<3; i++) + { + tmp[i] = *codon; + codon++; + } + kputc_(dna2aa(tmp), tseq); +#if DBG>1 + fprintf(stderr,"[4]%c%c%c\n",tmp[0],tmp[1],tmp[2]); +#endif + } + if ( fill!=0 ) + { + end = ref.s + ref.l - N_REF_PAD; + while ( codon+3 <= end ) + { + kputc_(dna2aa(codon), tseq); +#if DBG>1 + fprintf(stderr,"[5]%c%c%c\t%c\n",codon[0],codon[1],codon[2],dna2aa(codon)); +#endif + codon += 3; + } + } + } + else // STRAND_REV + { + // right padding - number of bases to take from ref + npad = (seq.m - (sbeg + seq.l)) % 3; +#if DBG>1 + fprintf(stderr," npad: %d\n",npad); +#endif + if ( !(npad>=0 && sbeg+seq.l+npad<=seq.m) ) fprintf(stderr,"sbeg=%d seq.l=%d seq.m=%d npad=%d\n",sbeg,(int)seq.l,(int)seq.m,npad); + assert( npad>=0 && sbeg+seq.l+npad<=seq.m ); // todo: first codon on the rev strand + + if ( npad==2 ) + { + tmp[1] = ref.s[rend+N_REF_PAD]; + tmp[2] = ref.s[rend+N_REF_PAD+1]; + i = 0; + } + else if ( npad==1 ) + { + tmp[2] = ref.s[rend+N_REF_PAD]; + i = 1; + } + else + i = 2; + + end = seq.s + seq.l; + for (; i>=0 && end>seq.s; i--) tmp[i] = *(--end); +#if DBG>1 + fprintf(stderr,"\t i=%d\n", i); + if(i==1)fprintf(stderr,"[0] %c\n",tmp[2]); + if(i==0)fprintf(stderr,"[0] %c%c\n",tmp[1],tmp[2]); +#endif + if ( i==-1 ) + { +#if DBG>1 + fprintf(stderr,"[1]%c%c%c\t%c\n",tmp[0],tmp[1],tmp[2], cdna2aa(tmp)); +#endif + kputc_(cdna2aa(tmp), tseq); + codon = end - 3; + while ( codon >= seq.s ) + { + kputc_(cdna2aa(codon), tseq); +#if DBG>1 + fprintf(stderr,"[2]%c%c%c\t%c\n",codon[0],codon[1],codon[2], cdna2aa(codon)); +#endif + codon -= 3; + } + if ( seq.s-codon==2 ) + { + tmp[2] = seq.s[0]; + i = 1; + } + else if ( seq.s-codon==1 ) + { + tmp[1] = seq.s[0]; + tmp[2] = seq.s[1]; + i = 0; + } + else + i = -1; +#if DBG>1 + if(i==1)fprintf(stderr,"[3] %c\n",tmp[2]); + if(i==0)fprintf(stderr,"[3] %c%c\n",tmp[1],tmp[2]); +#endif + } + // left padding + end = ref.s + N_REF_PAD + rbeg; + if ( i>=0 ) + { + for (; i>=0 && end>=ref.s; i--) tmp[i] = *(--end); + kputc_(cdna2aa(tmp), tseq); +#if DBG>1 + fprintf(stderr,"[4]%c%c%c\t%c\n",tmp[0],tmp[1],tmp[2],cdna2aa(tmp)); +#endif + } + if ( fill!=0 ) + { + codon = end - 3; + while ( codon >= ref.s + N_REF_PAD ) + { + kputc_(cdna2aa(codon), tseq); +#if DBG>1 + fprintf(stderr,"[5]%c%c%c\t%c\n",codon[0],codon[1],codon[2],cdna2aa(codon)); +#endif + codon -= 3; + } + } + } + kputc_(0,tseq); tseq->l--; +#if DBG + fprintf(stderr," tseq: %s\n", tseq->s); +#endif +} + +void tscript_splice_ref(tscript_t *tr) +{ + int i, len = 0; + for (i=0; incds; i++) + len += tr->cds[i]->len; + + tr->nsref = len + 2*N_REF_PAD; + tr->sref = (char*) malloc(len + 1 + 2*N_REF_PAD); + len = 0; + + memcpy(tr->sref, tr->ref + tr->cds[0]->beg - tr->beg, N_REF_PAD); + len += N_REF_PAD; + + for (i=0; incds; i++) + { + memcpy(tr->sref + len, tr->ref + N_REF_PAD + tr->cds[i]->beg - tr->beg, tr->cds[i]->len); + len += tr->cds[i]->len; + } + memcpy(tr->sref + len, tr->ref + N_REF_PAD + tr->cds[tr->ncds-1]->beg - tr->beg, N_REF_PAD); + len += N_REF_PAD; + + tr->sref[len] = 0; +} + +// returns: 0 if consequence was added, 1 if it already exists or could not be added +int csq_push(args_t *args, csq_t *csq, bcf1_t *rec) +{ +#if XDBG +fprintf(stderr,"csq_push: %d .. %d\n",rec->pos+1,csq->type.type); +#endif + khint_t k = kh_get(pos2vbuf, args->pos2vbuf, (int)csq->pos); + vbuf_t *vbuf = (k == kh_end(args->pos2vbuf)) ? NULL : kh_val(args->pos2vbuf, k); + if ( !vbuf ) error("This should not happen. %s:%d %s\n",bcf_seqname(args->hdr,rec),csq->pos+1,csq->type.vstr.s); + + int i; + for (i=0; in; i++) + if ( vbuf->vrec[i]->line==rec ) break; + if ( i==vbuf->n ) error("This should not happen.. %s:%d %s\n", bcf_seqname(args->hdr,rec),csq->pos+1,csq->type.vstr.s); + vrec_t *vrec = vbuf->vrec[i]; + + // if the variant overlaps donor/acceptor and also splice region, report only donor/acceptor + if ( csq->type.type & CSQ_SPLICE_REGION && csq->type.type & (CSQ_SPLICE_DONOR|CSQ_SPLICE_ACCEPTOR) ) + csq->type.type &= ~CSQ_SPLICE_REGION; + + if ( csq->type.type & CSQ_PRINTED_UPSTREAM ) + { + for (i=0; invcsq; i++) + { + // Same as below, to avoid records like + // 3630 .. @3632,stop_lost|AL627309.1|ENST00000423372|protein_coding|- + // 3632 .. stop_lost|AL627309.1|ENST00000423372|protein_coding|-|260*>260G|3630T>A+3632A>C + if ( csq->type.type&CSQ_START_STOP && vrec->vcsq[i].type&CSQ_START_STOP ) + { + vrec->vcsq[i] = csq->type; + goto exit_duplicate; + } + if ( !(vrec->vcsq[i].type & CSQ_PRINTED_UPSTREAM) ) continue; + if ( csq->type.ref != vrec->vcsq[i].ref ) continue; + goto exit_duplicate; + } + } + else if ( csq->type.type & CSQ_COMPOUND ) + { + for (i=0; invcsq; i++) + { + if ( csq->type.trid != vrec->vcsq[i].trid && (csq->type.type|vrec->vcsq[i].type)&CSQ_PRN_TSCRIPT ) continue; + if ( csq->type.biotype != vrec->vcsq[i].biotype ) continue; + if ( csq->type.gene != vrec->vcsq[i].gene ) continue; + if ( csq->type.vcf_ial != vrec->vcsq[i].vcf_ial ) continue; + if ( (csq->type.type&CSQ_UPSTREAM_STOP)^(vrec->vcsq[i].type&CSQ_UPSTREAM_STOP) ) continue; // both must or mustn't have upstream_stop + if ( csq->type.vstr.s || vrec->vcsq[i].vstr.s ) + { + // This is a bit hacky, but we want a simpler and more predictable output. The splice_csq() function + // can trigger stop/start events based on indel overlap, then another stop/start event can be triggered + // from add_csq() or test_cds_local() based on sequence comparison, and on output we could find two + // consequences: + // stop_lost|AL627309.1|ENST00000423372|protein_coding|- + // stop_lost&inframe_insertion|AL627309.1|ENST00000423372|protein_coding|-|260*>260CL|3630T>TAAA + if ( !csq->type.vstr.s || !vrec->vcsq[i].vstr.s ) + { + if ( csq->type.type&CSQ_START_STOP && vrec->vcsq[i].type&CSQ_START_STOP ) + { + vrec->vcsq[i].type |= csq->type.type; + + // remove stop_lost&synonymous if stop_retained set + if ( vrec->vcsq[i].type&CSQ_STOP_RETAINED ) + vrec->vcsq[i].type &= ~(CSQ_STOP_LOST|CSQ_SYNONYMOUS_VARIANT); + + if ( !vrec->vcsq[i].vstr.s ) vrec->vcsq[i].vstr = csq->type.vstr; + goto exit_duplicate; + } + continue; + } + if ( strcmp(csq->type.vstr.s,vrec->vcsq[i].vstr.s) ) continue; + } + vrec->vcsq[i].type |= csq->type.type; + goto exit_duplicate; + } + } + else + { + for (i=0; invcsq; i++) + { + if ( csq->type.trid != vrec->vcsq[i].trid && (csq->type.type|vrec->vcsq[i].type)&CSQ_PRN_TSCRIPT) continue; + if ( csq->type.biotype != vrec->vcsq[i].biotype ) continue; + if ( !(vrec->vcsq[i].type & CSQ_COMPOUND) ) + { + vrec->vcsq[i].type |= csq->type.type; + goto exit_duplicate; + } + if ( vrec->vcsq[i].type==(vrec->vcsq[i].type|csq->type.type) ) goto exit_duplicate; + } + } + // no such csq yet in this vcf record + csq->vrec = vrec; + csq->idx = vrec->nvcsq++; + hts_expand0(vcsq_t, vrec->nvcsq, vrec->mvcsq, vrec->vcsq); + vrec->vcsq[i] = csq->type; + return 0; + +exit_duplicate: + csq->vrec = vrec; + csq->idx = i; + return 1; +} + +// soff .. position of the variant within the trimmed query transcript +// sbeg .. position of the variant within the query transcript +// rbeg .. position on the reference transcript (if there are no indels, then rbeg=send) +// rpos .. VCF position +#define node2soff(i) (hap->stack[i].slen - (hap->stack[i].node->rlen + hap->stack[i].node->dlen)) +#define node2sbeg(i) (hap->sbeg + node2soff(i)) +#define node2send(i) (hap->sbeg + hap->stack[i].slen) +#define node2rbeg(i) (hap->stack[i].node->sbeg) +#define node2rend(i) (hap->stack[i].node->sbeg + hap->stack[i].node->rlen) +#define node2rpos(i) (hap->stack[i].node->rec->pos) + +void kput_vcsq(args_t *args, vcsq_t *csq, kstring_t *str) +{ + // Remove start/stop from incomplete CDS, but only if there is another + // consequence as something must be reported + if ( csq->type & CSQ_INCOMPLETE_CDS && (csq->type & ~(CSQ_START_STOP|CSQ_INCOMPLETE_CDS|CSQ_UPSTREAM_STOP)) ) csq->type &= ~(CSQ_START_STOP|CSQ_INCOMPLETE_CDS); + + // Remove missense from start/stops + if ( csq->type & CSQ_START_STOP && csq->type & CSQ_MISSENSE_VARIANT ) csq->type &= ~CSQ_MISSENSE_VARIANT; + + if ( csq->type & CSQ_PRINTED_UPSTREAM && csq->ref ) + { + kputc_('@',str); + kputw(csq->ref->pos+1, str); + return; + } + if ( csq->type & CSQ_UPSTREAM_STOP ) + kputc_('*',str); + + int i, n = sizeof(csq_strings)/sizeof(char*); + for (i=1; itype&(1<type&(1<gene ) kputs(csq->gene , str); + + kputc_('|', str); + if ( csq->type & CSQ_PRN_TSCRIPT ) kputs(args->tscript_ids.str[csq->trid], str); + + kputc_('|', str); + kputs(gf_type2gff_string(csq->biotype), str); + + if ( CSQ_PRN_STRAND(csq->type) || csq->vstr.l ) + kputs(csq->strand==STRAND_FWD ? "|+" : "|-", str); + + if ( csq->vstr.l ) + kputs(csq->vstr.s, str); +} + +void kprint_aa_prediction(args_t *args, int beg, kstring_t *aa, kstring_t *str) +{ + if ( !args->brief_predictions || (int)aa->l - args->brief_predictions < 3 ) + kputs(aa->s, str); + else + { + int i, len = aa->l; + if ( aa->s[len-1]=='*' ) len--; + for (i=0; ibrief_predictions; i++) kputc(aa->s[i], str); + kputs("..", str); + kputw(beg+len, str); + } +} + +void hap_add_csq(args_t *args, hap_t *hap, hap_node_t *node, int tlen, int ibeg, int iend, int dlen, int indel) +{ + int i; + tscript_t *tr = hap->tr; + int ref_node = tr->strand==STRAND_FWD ? ibeg : iend; + int icsq = node->ncsq_list++; + hts_expand0(csq_t,node->ncsq_list,node->mcsq_list,node->csq_list); + csq_t *csq = &node->csq_list[icsq]; + csq->pos = hap->stack[ref_node].node->rec->pos; + csq->type.trid = tr->id; + csq->type.vcf_ial = node->vcf_ial; + csq->type.gene = tr->gene->name; + csq->type.strand = tr->strand; + csq->type.biotype = tr->type; + + // only now we see the translated sequence and can determine if the stop/start changes are real + int rm_csq = 0; + csq->type.type = 0; + for (i=ibeg; i<=iend; i++) + csq->type.type |= hap->stack[i].node->csq & CSQ_COMPOUND; + if ( dlen==0 && indel ) csq->type.type |= CSQ_INFRAME_ALTERING; + + int has_upstream_stop = hap->upstream_stop; + if ( hap->stack[ibeg].node->type != HAP_SSS ) + { + // check for truncating stops + for (i=0; itref.l; i++) + if ( hap->tref.s[i]=='*' ) break; + if ( i!=hap->tref.l ) + { + hap->tref.l = i+1; + hap->tref.s[i+1] = 0; + } + for (i=0; itseq.l; i++) + if ( hap->tseq.s[i]=='*' ) break; + if ( i!=hap->tseq.l ) + { + hap->tseq.l = i+1; + hap->tseq.s[i+1] = 0; + hap->upstream_stop = 1; + } + if ( csq->type.type & CSQ_STOP_LOST ) + { + if ( hap->tref.s[hap->tref.l-1]=='*' && hap->tref.s[hap->tref.l-1] == hap->tseq.s[hap->tseq.l-1] ) + { + rm_csq |= CSQ_STOP_LOST; + csq->type.type |= CSQ_STOP_RETAINED; + } + else if ( hap->tref.s[hap->tref.l-1]!='*' ) + { + // This is CDS 3' incomplete ENSG00000173376/synon.vcf, can also be missense + // We observe in real data a change to a stop, ENST00000528237/retained-stop-incomplete-cds.vcf + if ( hap->tseq.s[hap->tseq.l-1] == '*' ) + { + rm_csq |= CSQ_STOP_GAINED; + csq->type.type |= CSQ_STOP_RETAINED; + } + else + csq->type.type |= CSQ_INCOMPLETE_CDS; + } + } + if ( csq->type.type & CSQ_START_LOST && hap->tref.s[0]!='M' ) + { + rm_csq |= CSQ_START_LOST; + csq->type.type &= ~CSQ_START_LOST; + } + if ( dlen!=0 ) + { + if ( dlen%3 ) + csq->type.type |= CSQ_FRAMESHIFT_VARIANT; + else if ( dlen<0 ) + csq->type.type |= CSQ_INFRAME_DELETION; + else + csq->type.type |= CSQ_INFRAME_INSERTION; + if ( hap->tref.s[hap->tref.l-1]!='*' && hap->tseq.s[hap->tseq.l-1]=='*' ) + csq->type.type |= CSQ_STOP_GAINED; + } + else + { + for (i=0; itref.l; i++) + if ( hap->tref.s[i] != hap->tseq.s[i] ) break; + if ( i==hap->tref.l ) + csq->type.type |= CSQ_SYNONYMOUS_VARIANT; + else if ( hap->tref.s[i] == '*' ) + csq->type.type |= CSQ_STOP_LOST; + else if ( hap->tseq.s[i] == '*' ) + csq->type.type |= CSQ_STOP_GAINED; + else + csq->type.type |= CSQ_MISSENSE_VARIANT; + } + } + // Check if compound inframe variants are real inframes, or if the stop codon occurs before the frameshift can be restored + if ( ibeg!=iend && (csq->type.type & (CSQ_INFRAME_DELETION|CSQ_INFRAME_INSERTION|CSQ_INFRAME_ALTERING)) && hap->tseq.s[hap->tseq.l-1]=='*' ) + { + rm_csq |= CSQ_INFRAME_DELETION | CSQ_INFRAME_INSERTION | CSQ_INFRAME_ALTERING; + csq->type.type |= CSQ_FRAMESHIFT_VARIANT | CSQ_STOP_GAINED; + } + if ( has_upstream_stop ) csq->type.type |= CSQ_UPSTREAM_STOP; + csq->type.type &= ~rm_csq; + + if ( hap->stack[ibeg].node->type == HAP_SSS ) + { + node->csq_list[icsq].type.type |= hap->stack[ibeg].node->csq & ~rm_csq; + node->csq_list[icsq].type.ref = hap->stack[ibeg].node->rec; + node->csq_list[icsq].type.biotype = tr->type; + csq_push(args, node->csq_list+icsq, hap->stack[ibeg].node->rec); + return; + } + + kstring_t str = node->csq_list[icsq].type.vstr; + str.l = 0; + + // create the aa variant string + int aa_rbeg = tr->strand==STRAND_FWD ? node2rbeg(ibeg)/3+1 : (hap->tr->nsref - 2*N_REF_PAD - node2rend(iend))/3+1; + int aa_sbeg = tr->strand==STRAND_FWD ? node2sbeg(ibeg)/3+1 : (tlen - node2send(iend))/3+1; + kputc_('|', &str); + kputw(aa_rbeg, &str); + kprint_aa_prediction(args,aa_rbeg,&hap->tref,&str); + if ( !(csq->type.type & CSQ_SYNONYMOUS_VARIANT) ) + { + kputc_('>', &str); + kputw(aa_sbeg, &str); + kprint_aa_prediction(args,aa_sbeg,&hap->tseq,&str); + } + kputc_('|', &str); + + // create the dna variant string and, in case of combined variants, + // insert silent CSQ_PRINTED_UPSTREAM variants + for (i=ibeg; i<=iend; i++) + { + if ( i>ibeg ) kputc_('+', &str); + kputw(node2rpos(i)+1, &str); + kputs(hap->stack[i].node->var, &str); + } + node->csq_list[icsq].type.vstr = str; + csq_push(args, node->csq_list+icsq, hap->stack[ref_node].node->rec); + + for (i=ibeg; i<=iend; i++) + { + // csq are printed at one position only for combined variants, the rest is + // silent and references the first + if ( hap->stack[i].node->csq & ~CSQ_COMPOUND ) + { + node->ncsq_list++; + hts_expand0(csq_t,node->ncsq_list,node->mcsq_list,node->csq_list); + csq_t *tmp_csq = &node->csq_list[node->ncsq_list - 1]; + tmp_csq->pos = hap->stack[i].node->rec->pos; + tmp_csq->type.trid = tr->id; + //??tmp_csq->type.vcf_ial = node->vcf_ial; .. this should not be needed for non-compound variants + tmp_csq->type.gene = tr->gene->name; + tmp_csq->type.strand = tr->strand; + tmp_csq->type.type = hap->stack[i].node->csq & ~CSQ_COMPOUND & ~rm_csq; + tmp_csq->type.biotype = tr->type; + tmp_csq->type.vstr.l = 0; + kputs(str.s,&tmp_csq->type.vstr); + csq_push(args, tmp_csq, hap->stack[i].node->rec); + } + if ( i!=ref_node && (node->csq_list[icsq].type.type & CSQ_COMPOUND || !(hap->stack[i].node->csq & ~CSQ_COMPOUND)) ) + { + node->ncsq_list++; + hts_expand0(csq_t,node->ncsq_list,node->mcsq_list,node->csq_list); + csq_t *tmp_csq = &node->csq_list[node->ncsq_list - 1]; + tmp_csq->pos = hap->stack[i].node->rec->pos; + tmp_csq->type.trid = tr->id; + //??tmp_csq->type.vcf_ial = node->vcf_ial; .. this should not be needed for non-compound variants + tmp_csq->type.gene = tr->gene->name; + tmp_csq->type.strand = tr->strand; + tmp_csq->type.type = CSQ_PRINTED_UPSTREAM | hap->stack[i].node->csq; + tmp_csq->type.biotype = tr->type; + tmp_csq->type.ref = hap->stack[ref_node].node->rec; + tmp_csq->type.vstr.l = 0; + csq_push(args, tmp_csq, hap->stack[i].node->rec); + } + } +} + + +void hap_finalize(args_t *args, hap_t *hap) +{ + tscript_t *tr = hap->tr; + if ( !tr->sref ) + tscript_splice_ref(tr); + + kstring_t sref; + sref.s = tr->sref; + sref.l = tr->nsref; + sref.m = sref.l; + + int istack = 0; + hts_expand(hstack_t,1,hap->mstack,hap->stack); + + hap->sseq.l = 0; + hap->tseq.l = 0; + hap->stack[0].node = tr->root; + hap->stack[0].ichild = -1; + hap->stack[0].slen = 0; + hap->stack[0].dlen = 0; + + while ( istack>=0 ) + { + hstack_t *stack = &hap->stack[istack]; + hap_node_t *node = hap->stack[istack].node; + while ( ++hap->stack[istack].ichild < node->nchild ) + { + if ( node->child[stack->ichild] ) break; + } + if ( stack->ichild == node->nchild ) { istack--; continue; } + + node = node->child[stack->ichild]; + + istack++; + hts_expand(hstack_t,istack+1,hap->mstack,hap->stack); + stack = &hap->stack[istack-1]; + + hap->stack[istack].node = node; + hap->stack[istack].ichild = -1; + + hap->sseq.l = stack->slen; + if ( node->type==HAP_CDS ) kputs(node->seq, &hap->sseq); + hap->stack[istack].slen = hap->sseq.l; + hap->stack[istack].dlen = hap->stack[istack-1].dlen + node->dlen; + + if ( !node->nend ) continue; // not a leaf node + + // The spliced sequence has been built for the current haplotype and stored + // in hap->sseq. Now we break it and output as independent parts + + kstring_t sseq; + sseq.m = sref.m - 2*N_REF_PAD + hap->stack[istack].dlen; // total length of the spliced query transcript + hap->upstream_stop = 0; + + int i = 1, dlen = 0, ibeg, indel = 0; + hap->sbeg = hap->stack[i].node->sbeg; + assert( hap->stack[istack].node->type != HAP_SSS ); + if ( tr->strand==STRAND_FWD ) + { + i = 0, ibeg = -1; + while ( ++i <= istack ) + { + assert( hap->stack[i].node->type != HAP_SSS ); + + dlen += hap->stack[i].node->dlen; + if ( hap->stack[i].node->dlen ) indel = 1; + + // This condition extends compound variants. + if ( istack[i].node->dlen > 0 ) icur += hap->stack[i].node->dlen; + else if ( hap->stack[i].node->dlen < 0 ) icur++; + if ( icur/3 == inext/3 ) // in the same codon, can't be flushed yet + { + if ( ibeg==-1 ) ibeg = i; + continue; + } + } + if ( ibeg<0 ) ibeg = i; + + int ioff = node2soff(ibeg); + int icur = node2sbeg(ibeg); + int rbeg = node2rbeg(ibeg); + int rend = node2rend(i); + int fill = dlen%3; + + // alt + if ( hap->sseq.l ) + { + sseq.l = hap->stack[i].slen - ioff; + sseq.s = hap->sseq.s + ioff; + } + else // splice site overlap, see #1475227917 + sseq.l = fill = 0; + cds_translate(&sref, &sseq, icur,rbeg,rend, tr->strand, &hap->tseq, fill); + + // ref + sseq.l = node2rend(i) - rbeg; + sseq.s = sref.s + N_REF_PAD + rbeg; + sseq.m = sref.m - 2*N_REF_PAD; + cds_translate(&sref, &sseq, rbeg,rbeg,rend, tr->strand, &hap->tref, fill); + sseq.m = sref.m - 2*N_REF_PAD + hap->stack[istack].dlen; + + hap_add_csq(args,hap,node,0, ibeg,i,dlen,indel); + ibeg = -1; + dlen = 0; + indel = 0; + } + } + else + { + i = istack + 1, ibeg = -1; + while ( --i > 0 ) + { + assert ( hap->stack[i].node->type != HAP_SSS ); + dlen += hap->stack[i].node->dlen; + if ( hap->stack[i].node->dlen ) indel = 1; + if ( i>1 ) + { + if ( dlen%3 ) + { + if ( ibeg==-1 ) ibeg = i; + continue; + } + // the last base of the current variant vs the first base of the next + // variant: are they in the same codon? (reverse strand) + int icur = sseq.m - 1 - node2sbeg(i); + int inext = sseq.m - 1 - node2sbeg(i-1); + if ( hap->stack[i].node->dlen > 0 ) icur += hap->stack[i].node->dlen - 1; + else if ( hap->stack[i].node->dlen < 0 ) icur -= hap->stack[i].node->dlen; + if ( hap->stack[i-1].node->dlen > 0 ) inext -= hap->stack[i-1].node->dlen; + if ( icur/3 == inext/3 ) + { + if ( ibeg==-1 ) ibeg = i; + continue; + } + } + if ( ibeg<0 ) ibeg = i; + int ioff = node2soff(i); + int icur = node2sbeg(i); + int rbeg = node2rbeg(i); + int rend = node2rend(ibeg); + int fill = dlen%3; + + // alt + if ( hap->sseq.l ) + { + sseq.l = hap->stack[ibeg].slen - ioff; + sseq.s = hap->sseq.s + ioff; + } + else // splice site overlap, see #1475227917 + sseq.l = fill = 0; + cds_translate(&sref, &sseq, icur,rbeg,rend, tr->strand, &hap->tseq, fill); + + // ref + sseq.l = node2rend(ibeg) - rbeg; + sseq.s = sref.s + N_REF_PAD + rbeg; + sseq.m = sref.m - 2*N_REF_PAD; + cds_translate(&sref, &sseq, rbeg,rbeg,rend, tr->strand, &hap->tref, fill); + sseq.m = sref.m - 2*N_REF_PAD + hap->stack[istack].dlen; + + hap_add_csq(args,hap,node,sseq.m, i,ibeg,dlen,indel); + ibeg = -1; + dlen = 0; + indel = 0; + } + } + } +} + +static inline void csq_print_text(args_t *args, csq_t *csq, int ismpl, int ihap) +{ + if ( csq->type.type & CSQ_PRINTED_UPSTREAM ) return; + + char *smpl = ismpl >= 0 ? args->hdr->samples[ismpl] : "-"; + const char *chr = bcf_hdr_id2name(args->hdr,args->rid); + + fprintf(args->out,"CSQ\t%s\t", smpl); + if ( ihap>0 ) + fprintf(args->out,"%d", ihap); + else + fprintf(args->out,"-"); + + args->str.l = 0; + kput_vcsq(args, &csq->type, &args->str); + fprintf(args->out,"\t%s\t%d\t%s\n",chr,csq->pos+1,args->str.s); +} +static inline void hap_print_text(args_t *args, tscript_t *tr, int ismpl, int ihap, hap_node_t *node) +{ + if ( !node || !node->ncsq_list ) return; + + char *smpl = ismpl >= 0 ? args->hdr->samples[ismpl] : "-"; + const char *chr = bcf_hdr_id2name(args->hdr,args->rid); + + int i; + for (i=0; incsq_list; i++) + { + csq_t *csq = node->csq_list + i; + if ( csq->type.type & CSQ_PRINTED_UPSTREAM ) continue; + assert( csq->type.vstr.l ); + + fprintf(args->out,"CSQ\t%s\t", smpl); + if ( ihap>0 ) + fprintf(args->out,"%d", ihap); + else + fprintf(args->out,"-"); + + args->str.l = 0; + kput_vcsq(args, &csq->type, &args->str); + fprintf(args->out,"\t%s\t%d\t%s\n",chr,csq->pos+1,args->str.s); + } +} + +static inline void hap_stage_vcf(args_t *args, tscript_t *tr, int ismpl, int ihap, hap_node_t *node) +{ + if ( !node || !node->ncsq_list || ismpl<0 ) return; + + int i; + for (i=0; incsq_list; i++) + { + csq_t *csq = node->csq_list + i; + vrec_t *vrec = csq->vrec; + int icsq2 = 2*csq->idx + ihap; + if ( icsq2 >= args->ncsq2_max ) // more than ncsq2_max consequences, so can't fit it in FMT + { + if ( args->verbosity && (!args->ncsq2_small_warned || args->verbosity > 1) ) + { + fprintf(stderr, + "Warning: Too many consequences for sample %s at %s:%"PRId64", keeping the first %d and skipping the rest.\n", + args->hdr->samples[ismpl],bcf_hdr_id2name(args->hdr,args->rid),(int64_t) vrec->line->pos+1,csq->idx); + if ( !args->ncsq2_small_warned ) + fprintf(stderr," The limit can be increased by setting the --ncsq parameter. This warning is printed only once.\n"); + } + if ( args->ncsq2_small_warned < icsq2 ) args->ncsq2_small_warned = icsq2; + break; + } + int ival, ibit; + icsq2_to_bit(icsq2, &ival,&ibit); + if ( vrec->nfmt < 1 + ival ) vrec->nfmt = 1 + ival; + vrec->fmt_bm[ismpl*args->nfmt_bcsq + ival] |= 1 << ibit; + } +} + +void hap_flush(args_t *args, uint32_t pos) +{ + int i,j; + tr_heap_t *heap = args->active_tr; + while ( heap->ndat && heap->dat[0]->end<=pos ) + { + tscript_t *tr = heap->dat[0]; + khp_delete(trhp, heap); + args->hap->tr = tr; + if ( tr->root && tr->root->nchild ) // normal, non-localized calling + { + hap_finalize(args, args->hap); + + if ( args->output_type==FT_TAB_TEXT ) // plain text output, not a vcf + { + if ( args->phase==PHASE_DROP_GT ) + hap_print_text(args, tr, -1,0, tr->hap[0]); + else + { + for (i=0; ismpl->n; i++) + { + for (j=0; j<2; j++) + hap_print_text(args, tr, args->smpl->idx[i],j+1, tr->hap[i*2+j]); + } + } + } + else if ( args->phase!=PHASE_DROP_GT ) + { + for (i=0; ismpl->n; i++) + { + for (j=0; j<2; j++) + hap_stage_vcf(args, tr, args->smpl->idx[i],j, tr->hap[i*2+j]); + } + } + } + + // mark the transcript for deletion. Cannot delete it immediately because + // by-position VCF output will need them when flushed by vcf_buf_push + args->nrm_tr++; + hts_expand(tscript_t*,args->nrm_tr,args->mrm_tr,args->rm_tr); + args->rm_tr[args->nrm_tr-1] = tr; + } +} + +#define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } + +vbuf_t *vbuf_push(args_t *args, bcf1_t **rec_ptr) +{ + int i; + + assert(rec_ptr); + bcf1_t *rec = *rec_ptr; + + // check for duplicate records + i = args->vcf_rbuf.n ? rbuf_last(&args->vcf_rbuf) : -1; + if ( i<0 || args->vcf_buf[i]->vrec[0]->line->pos!=rec->pos ) + { + // vcf record with a new pos + rbuf_expand0(&args->vcf_rbuf, vbuf_t*, args->vcf_rbuf.n+1, args->vcf_buf); + i = rbuf_append(&args->vcf_rbuf); + if ( !args->vcf_buf[i] ) args->vcf_buf[i] = (vbuf_t*) calloc(1,sizeof(vbuf_t)); + args->vcf_buf[i]->n = 0; + args->vcf_buf[i]->keep_until = 0; + } + vbuf_t *vbuf = args->vcf_buf[i]; + vbuf->n++; + hts_expand0(vrec_t*, vbuf->n, vbuf->m, vbuf->vrec); + if ( !vbuf->vrec[vbuf->n - 1] ) + vbuf->vrec[vbuf->n - 1] = (vrec_t*) calloc(1,sizeof(vrec_t)); + + vrec_t *vrec = vbuf->vrec[vbuf->n - 1]; + if ( args->phase!=PHASE_DROP_GT && args->smpl->n ) + { + if ( !vrec->fmt_bm ) vrec->fmt_bm = (uint32_t*) calloc(args->hdr_nsmpl,sizeof(*vrec->fmt_bm) * args->nfmt_bcsq); + else memset(vrec->fmt_bm,0,args->hdr_nsmpl*sizeof(*vrec->fmt_bm) * args->nfmt_bcsq); + } + if ( !vrec->line ) vrec->line = bcf_init1(); + SWAP(bcf1_t*, (*rec_ptr), vrec->line); + + int ret; + khint_t k = kh_put(pos2vbuf, args->pos2vbuf, (int)rec->pos, &ret); + kh_val(args->pos2vbuf,k) = vbuf; + + return vbuf; +} + +void vbuf_flush(args_t *args, uint32_t pos) +{ + int i,j; + while ( args->vcf_rbuf.n ) + { + vbuf_t *vbuf; + if ( !args->local_csq && args->active_tr->ndat ) + { + // check if the first active transcript starts beyond the first buffered VCF record, + // cannot output buffered VCF lines (args.vbuf) until the active transcripts are gone + vbuf = args->vcf_buf[ args->vcf_rbuf.f ]; + if ( vbuf->keep_until > pos ) break; + assert( vbuf->n ); + } + + i = rbuf_shift(&args->vcf_rbuf); + assert( i>=0 ); + vbuf = args->vcf_buf[i]; + int pos = vbuf->n ? vbuf->vrec[0]->line->pos : -1; + for (i=0; in; i++) + { + vrec_t *vrec = vbuf->vrec[i]; + if ( !args->out_fh ) // not a VCF output + { + vrec->nvcsq = 0; + continue; + } + if ( !vrec->nvcsq ) + { + if ( bcf_write(args->out_fh, args->hdr, vrec->line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname?args->output_fname:"standard output"); + int save_pos = vrec->line->pos; + bcf_empty(vrec->line); + vrec->line->pos = save_pos; // this is necessary for compound variants + continue; + } + + args->str.l = 0; + kput_vcsq(args, &vrec->vcsq[0], &args->str); + for (j=1; jnvcsq; j++) + { + kputc_(',', &args->str); + kput_vcsq(args, &vrec->vcsq[j], &args->str); + } + bcf_update_info_string(args->hdr, vrec->line, args->bcsq_tag, args->str.s); + if ( args->hdr_nsmpl ) + { + if ( vrec->nfmt < args->nfmt_bcsq ) + for (j=1; jhdr_nsmpl; j++) + memmove(&vrec->fmt_bm[j*vrec->nfmt], &vrec->fmt_bm[j*args->nfmt_bcsq], vrec->nfmt*sizeof(*vrec->fmt_bm)); + bcf_update_format_int32(args->hdr, vrec->line, args->bcsq_tag, vrec->fmt_bm, args->hdr_nsmpl*vrec->nfmt); + } + vrec->nvcsq = 0; + if ( bcf_write(args->out_fh, args->hdr, vrec->line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname?args->output_fname:"standard output"); + int save_pos = vrec->line->pos; + bcf_empty(vrec->line); + vrec->line->pos = save_pos; + } + if ( pos!=-1 ) + { + khint_t k = kh_get(pos2vbuf, args->pos2vbuf, pos); + if ( k != kh_end(args->pos2vbuf) ) kh_del(pos2vbuf, args->pos2vbuf, k); + } + vbuf->n = 0; + } + if ( args->active_tr->ndat ) return; + + for (i=0; inrm_tr; i++) + { + tscript_t *tr = args->rm_tr[i]; + if ( tr->root ) hap_destroy(tr->root); + tr->root = NULL; + free(tr->hap); + free(tr->ref); + free(tr->sref); + } + args->nrm_tr = 0; + args->ncsq_buf = 0; +} + +void tscript_init_ref(args_t *args, tscript_t *tr, const char *chr) +{ + int i, len; + int pad_beg = tr->beg >= N_REF_PAD ? N_REF_PAD : tr->beg; + + tr->ref = faidx_fetch_seq(args->fai, chr, tr->beg - pad_beg, tr->end + N_REF_PAD, &len); + if ( !tr->ref ) + error("faidx_fetch_seq failed %s:%d-%d\n", chr,tr->beg+1,tr->end+1); + + int pad_end = len - (tr->end - tr->beg + 1 + pad_beg); + if ( pad_beg + pad_end != 2*N_REF_PAD ) + { + char *ref = (char*) malloc(tr->end - tr->beg + 1 + 2*N_REF_PAD + 1); + for (i=0; i < N_REF_PAD - pad_beg; i++) ref[i] = 'N'; + memcpy(ref+i, tr->ref, len); + len += i; + for (i=0; i < N_REF_PAD - pad_end; i++) ref[i+len] = 'N'; + ref[i+len] = 0; + free(tr->ref); + tr->ref = ref; + } +} + +static void sanity_check_ref(args_t *args, tscript_t *tr, bcf1_t *rec) +{ + int vbeg = 0; + int rbeg = rec->pos - tr->beg + N_REF_PAD; + if ( rbeg < 0 ) { vbeg += abs(rbeg); rbeg = 0; } + char *ref = tr->ref + rbeg; + char *vcf = rec->d.allele[0] + vbeg; + assert( vcf - rec->d.allele[0] < strlen(rec->d.allele[0]) && ref - tr->ref < tr->end - tr->beg + 2*N_REF_PAD ); + int i = 0; + while ( ref[i] && vcf[i] ) + { + if ( ref[i]!=vcf[i] && toupper(ref[i])!=toupper(vcf[i]) ) + error("Error: the fasta reference does not match the VCF REF allele at %s:%"PRId64" .. fasta=%c vcf=%c\n", + bcf_seqname(args->hdr,rec),(int64_t) rec->pos+vbeg+1,ref[i],vcf[i]); + i++; + } +} + +int test_cds_local(args_t *args, bcf1_t *rec) +{ + int i,j, ret = 0; + const char *chr = bcf_seqname(args->hdr,rec); + // note that the off-by-one extension of rlen is deliberate to account for insertions + if ( !regidx_overlap(args->idx_cds,chr,rec->pos,rec->pos+rec->rlen, args->itr) ) return 0; + + // structures to fake the normal test_cds machinery + hap_node_t root, node; + root.type = HAP_ROOT; + kstring_t *tref = &args->hap->tref, *tseq = &args->hap->tseq; + + while ( regitr_overlap(args->itr) ) + { + gf_cds_t *cds = regitr_payload(args->itr,gf_cds_t*); + tscript_t *tr = cds->tr; + if ( !GF_is_coding(tr->type) ) continue; + ret = 1; + + if ( !tr->ref ) + { + tscript_init_ref(args, tr, chr); + tscript_splice_ref(tr); + khp_insert(trhp, args->active_tr, &tr); // only to clean the reference afterwards + } + + sanity_check_ref(args, tr, rec); + + kstring_t sref; + sref.s = tr->sref; + sref.l = tr->nsref; + sref.m = sref.l; + + for (i=1; in_allele; i++) + { + if ( rec->d.allele[i][0]=='<' || rec->d.allele[i][0]=='*' ) { continue; } + if ( hap_init(args, &root, &node, cds, rec, i)!=0 ) continue; + + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = i; + csq.type.gene = tr->gene->name; + + int csq_type = node.csq; + + // code repetition: it would be nice to reuse the code from hap_add_csq, needs refactoring though + if ( node.type == HAP_SSS ) + { + csq.type.type = csq_type; + csq_stage(args, &csq, rec); + } + else + { + kstring_t sseq; + sseq.m = sref.m - 2*N_REF_PAD + node.dlen; + sseq.s = node.seq; + int alen = sseq.l = strlen(sseq.s); + int fill = node.dlen%3 && alen ? 1 : 0; // see #1475227917 + cds_translate(&sref, &sseq, node.sbeg,node.sbeg,node.sbeg+node.rlen, tr->strand, tseq, fill); + + sseq.m = sref.m - 2*N_REF_PAD; + sseq.s = sref.s + N_REF_PAD + node.sbeg; + sseq.l = node.rlen; + cds_translate(&sref, &sseq, node.sbeg,node.sbeg,node.sbeg+node.rlen, tr->strand, tref, fill); + + // check for truncating stops + for (j=0; jl; j++) + if ( tref->s[j]=='*' ) break; + if ( j!=tref->l ) + { + tref->l = j+1; + tref->s[j+1] = 0; + } + for (j=0; jl; j++) + if ( tseq->s[j]=='*' ) break; + if ( j!=tseq->l ) + { + tseq->l = j+1; + tseq->s[j+1] = 0; + } + if ( csq_type & CSQ_STOP_LOST ) + { + if ( tref->s[tref->l-1]=='*' && tref->s[tref->l-1] == tseq->s[tseq->l-1] ) + { + csq_type &= ~CSQ_STOP_LOST; + csq_type |= CSQ_STOP_RETAINED; + } + else if (tref->s[tref->l-1]!='*' ) + { + // This is CDS 3' incomplete ENSG00000173376/synon.vcf, can also be missense + // We observe in real data a change to a stop, ENST00000528237/retained-stop-incomplete-cds.vcf + if ( tseq->s[tseq->l-1] == '*' ) + { + csq_type &= ~CSQ_STOP_GAINED; + csq_type |= CSQ_STOP_RETAINED; + } + else + csq_type |= CSQ_INCOMPLETE_CDS; + } + } + if ( csq_type & CSQ_START_LOST && tref->s[0]!='M' ) + csq_type &= ~CSQ_START_LOST; + if ( node.dlen!=0 ) + { + if ( node.dlen%3 ) + csq_type |= CSQ_FRAMESHIFT_VARIANT; + else if ( node.dlen<0 ) + csq_type |= CSQ_INFRAME_DELETION; + else + csq_type |= CSQ_INFRAME_INSERTION; + if ( tref->s[tref->l-1]!='*' && tseq->s[tseq->l-1]=='*' ) + csq_type |= CSQ_STOP_GAINED; + } + else + { + for (j=0; jl; j++) + if ( tref->s[j] != tseq->s[j] ) break; + if ( j==tref->l ) + csq_type |= CSQ_SYNONYMOUS_VARIANT; + else if ( tref->s[j] == '*' ) + csq_type |= CSQ_STOP_LOST; + else if ( tseq->s[j] == '*' ) + csq_type |= CSQ_STOP_GAINED; + else + csq_type |= CSQ_MISSENSE_VARIANT; + } + if ( csq_type & CSQ_COMPOUND ) + { + // create the aa variant string + kstring_t str = {0,0,0}; + int aa_rbeg = tr->strand==STRAND_FWD ? node.sbeg/3+1 : (tr->nsref - 2*N_REF_PAD - node.sbeg - node.rlen)/3+1; + int aa_sbeg = tr->strand==STRAND_FWD ? node.sbeg/3+1 : (tr->nsref - 2*N_REF_PAD + node.dlen - node.sbeg - alen)/3+1; + kputc_('|', &str); + kputw(aa_rbeg, &str); + kprint_aa_prediction(args,aa_rbeg,tref,&str); + if ( !(csq_type & CSQ_SYNONYMOUS_VARIANT) ) + { + kputc_('>', &str); + kputw(aa_sbeg, &str); + kprint_aa_prediction(args,aa_sbeg,tseq,&str); + } + kputc_('|', &str); + kputw(rec->pos+1, &str); + kputs(node.var, &str); + csq.type.vstr = str; + csq.type.type = csq_type & CSQ_COMPOUND; + csq_stage(args, &csq, rec); + + // all this only to clean vstr when vrec is flushed + if ( !tr->root ) + tr->root = (hap_node_t*) calloc(1,sizeof(hap_node_t)); + tr->root->ncsq_list++; + hts_expand0(csq_t,tr->root->ncsq_list,tr->root->mcsq_list,tr->root->csq_list); + csq_t *rm_csq = tr->root->csq_list + tr->root->ncsq_list - 1; + rm_csq->type.vstr = str; + } + if ( csq_type & ~CSQ_COMPOUND ) + { + csq.type.type = csq_type & ~CSQ_COMPOUND; + csq.type.vstr.l = 0; + csq_stage(args, &csq, rec); + } + } + free(node.seq); + free(node.var); + } + } + return ret; +} + +int test_cds(args_t *args, bcf1_t *rec, vbuf_t *vbuf) +{ + static int overlaps_warned = 0, multiploid_warned = 0; + + int i, ret = 0, hap_ret; + const char *chr = bcf_seqname(args->hdr,rec); + // note that the off-by-one extension of rlen is deliberate to account for insertions + if ( !regidx_overlap(args->idx_cds,chr,rec->pos,rec->pos+rec->rlen, args->itr) ) return 0; + while ( regitr_overlap(args->itr) ) + { + gf_cds_t *cds = regitr_payload(args->itr,gf_cds_t*); + tscript_t *tr = cds->tr; + if ( !GF_is_coding(tr->type) ) continue; + if ( vbuf->keep_until < tr->end ) vbuf->keep_until = tr->end; + ret = 1; + if ( !tr->root ) + { + // initialize the transcript and its haplotype tree, fetch the reference sequence + tscript_init_ref(args, tr, chr); + + tr->root = (hap_node_t*) calloc(1,sizeof(hap_node_t)); + tr->nhap = args->phase==PHASE_DROP_GT ? 1 : 2*args->smpl->n; // maximum ploidy = diploid + tr->hap = (hap_node_t**) malloc(tr->nhap*sizeof(hap_node_t*)); + for (i=0; inhap; i++) tr->hap[i] = NULL; + tr->root->nend = tr->nhap; + tr->root->type = HAP_ROOT; + + khp_insert(trhp, args->active_tr, &tr); + } + + sanity_check_ref(args, tr, rec); + + if ( args->phase==PHASE_DROP_GT ) + { + if ( rec->d.allele[1][0]=='<' || rec->d.allele[1][0]=='*' ) { continue; } + hap_node_t *parent = tr->hap[0] ? tr->hap[0] : tr->root; + hap_node_t *child = (hap_node_t*)calloc(1,sizeof(hap_node_t)); + hap_ret = hap_init(args, parent, child, cds, rec, 1); + if ( hap_ret!=0 ) + { + // overlapping or intron variant, cannot apply + if ( hap_ret==1 ) + { + if ( args->verbosity && (!overlaps_warned || args->verbosity > 1) ) + { + fprintf(stderr, + "Warning: Skipping overlapping variants at %s:%"PRId64"\t%s>%s.\n", + chr,(int64_t) rec->pos+1,rec->d.allele[0],rec->d.allele[1]); + if ( !overlaps_warned ) + fprintf(stderr," This message is printed only once, the verbosity can be increased with `--verbose 2`\n"); + overlaps_warned = 1; + } + if ( args->out ) + fprintf(args->out,"LOG\tWarning: Skipping overlapping variants at %s:%"PRId64"\t%s>%s\n", chr,(int64_t) rec->pos+1,rec->d.allele[0],rec->d.allele[1]); + } + else ret = 1; // prevent reporting as intron in test_tscript + hap_destroy(child); + continue; + } + if ( child->type==HAP_SSS ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = 1; + csq.type.gene = tr->gene->name; + csq.type.type = child->csq; + csq_stage(args, &csq, rec); + hap_destroy(child); + ret = 1; + continue; + } + parent->nend--; + parent->nchild = 1; + parent->mchild = 1; + parent->child = (hap_node_t**) malloc(sizeof(hap_node_t*)); + parent->child[0] = child; + tr->hap[0] = child; + tr->hap[0]->nend = 1; + continue; + } + + // apply the VCF variants and extend the haplotype tree + int j, ismpl, ihap, ngts = bcf_get_genotypes(args->hdr, rec, &args->gt_arr, &args->mgt_arr); + ngts /= bcf_hdr_nsamples(args->hdr); + if ( ngts!=1 && ngts!=2 ) + { + if ( args->verbosity && (!multiploid_warned || args->verbosity > 1) ) + { + fprintf(stderr, + "Warning: Skipping site with non-diploid/non-haploid genotypes at %s:%"PRId64"\t%s>%s.\n", + chr,(int64_t) rec->pos+1,rec->d.allele[0],rec->d.allele[1]); + if ( !multiploid_warned ) + fprintf(stderr," This message is printed only once, the verbosity can be increased with `--verbose 2`\n"); + multiploid_warned = 1; + } + if ( args->out ) + fprintf(args->out,"LOG\tWarning: Skipping site with non-diploid/non-haploid genotypes at %s:%"PRId64"\t%s>%s\n", chr,(int64_t) rec->pos+1,rec->d.allele[0],rec->d.allele[1]); + continue; + } + for (ismpl=0; ismplsmpl->n; ismpl++) + { + int32_t *gt = args->gt_arr + args->smpl->idx[ismpl]*ngts; + if ( gt[0]==bcf_gt_missing ) continue; + + if ( ngts>1 && gt[1]!=bcf_gt_missing && gt[1]!=bcf_int32_vector_end && bcf_gt_allele(gt[0])!=bcf_gt_allele(gt[1]) ) + { + if ( args->phase==PHASE_MERGE ) + { + if ( !bcf_gt_allele(gt[0]) ) gt[0] = gt[1]; + } + if ( !bcf_gt_is_phased(gt[0]) && !bcf_gt_is_phased(gt[1]) ) + { + if ( args->phase==PHASE_REQUIRE ) + error("Unphased heterozygous genotype at %s:%"PRId64", sample %s. See the --phase option.\n", chr,(int64_t) rec->pos+1,args->hdr->samples[args->smpl->idx[ismpl]]); + if ( args->phase==PHASE_SKIP ) + continue; + if ( args->phase==PHASE_NON_REF ) + { + if ( !bcf_gt_allele(gt[0]) ) gt[0] = gt[1]; + else if ( !bcf_gt_allele(gt[1]) ) gt[1] = gt[0]; + } + } + } + + for (ihap=0; ihapn_allele ); + if ( rec->d.allele[ial][0]=='<' || rec->d.allele[ial][0]=='*' ) { continue; } + + hap_node_t *parent = tr->hap[i] ? tr->hap[i] : tr->root; + if ( parent->cur_rec==rec && parent->cur_child[ial]>=0 ) + { + // this haplotype has been seen in another sample + tr->hap[i] = parent->child[ parent->cur_child[ial] ]; + tr->hap[i]->nend++; + parent->nend--; + continue; + } + + hap_node_t *child = (hap_node_t*)calloc(1,sizeof(hap_node_t)); + hap_ret = hap_init(args, parent, child, cds, rec, ial); + if ( hap_ret!=0 ) + { + // overlapping or intron variant, cannot apply + if ( hap_ret==1 ) + { + if ( args->verbosity && (!overlaps_warned || args->verbosity > 1) ) + { + fprintf(stderr, + "Warning: Skipping overlapping variants at %s:%"PRId64", sample %s\t%s>%s.\n", + chr,(int64_t) rec->pos+1,args->hdr->samples[args->smpl->idx[ismpl]],rec->d.allele[0],rec->d.allele[ial]); + if ( !overlaps_warned ) + fprintf(stderr," This message is printed only once, the verbosity can be increased with `--verbose 2`\n"); + overlaps_warned = 1; + } + if ( args->out ) + fprintf(args->out,"LOG\tWarning: Skipping overlapping variants at %s:%"PRId64", sample %s\t%s>%s\n", + chr,(int64_t) rec->pos+1,args->hdr->samples[args->smpl->idx[ismpl]],rec->d.allele[0],rec->d.allele[ial]); + } + hap_destroy(child); + continue; + } + if ( child->type==HAP_SSS ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = ial; + csq.type.gene = tr->gene->name; + csq.type.type = child->csq; + csq_stage(args, &csq, rec); + hap_destroy(child); + continue; + } + if ( parent->cur_rec!=rec ) + { + hts_expand(int,rec->n_allele,parent->mcur_child,parent->cur_child); + for (j=0; jn_allele; j++) parent->cur_child[j] = -1; + parent->cur_rec = rec; + } + + j = parent->nchild++; + hts_expand0(hap_node_t*,parent->nchild,parent->mchild,parent->child); + parent->cur_child[ial] = j; + parent->child[j] = child; + tr->hap[i] = child; + tr->hap[i]->nend++; + parent->nend--; + } + } + } + return ret; +} + +void csq_stage(args_t *args, csq_t *csq, bcf1_t *rec) +{ + // known issues: tab output leads to unsorted output. This is because + // coding haplotypes are printed in one go and buffering is not used + // with tab output. VCF output is OK though. + if ( csq_push(args, csq, rec)!=0 && args->phase==PHASE_DROP_GT ) return; // the consequence already exists + + int i,j,ngt = 0; + if ( args->phase!=PHASE_DROP_GT ) + { + ngt = bcf_get_genotypes(args->hdr, rec, &args->gt_arr, &args->mgt_arr); + if ( ngt>0 ) ngt /= bcf_hdr_nsamples(args->hdr); + } + if ( ngt<=0 ) + { + if ( args->output_type==FT_TAB_TEXT ) + csq_print_text(args, csq, -1,0); + return; + } + assert( ngt<=2 ); + + if ( args->output_type==FT_TAB_TEXT ) + { + for (i=0; ismpl->n; i++) + { + int32_t *gt = args->gt_arr + args->smpl->idx[i]*ngt; + for (j=0; jtype.vcf_ial ) continue; + csq_print_text(args, csq, args->smpl->idx[i],j+1); + } + } + return; + } + + vrec_t *vrec = csq->vrec; + for (i=0; ismpl->n; i++) + { + int32_t *gt = args->gt_arr + args->smpl->idx[i]*ngt; + for (j=0; jtype.vcf_ial ) continue; + + int icsq2 = 2*csq->idx + j; + if ( icsq2 >= args->ncsq2_max ) // more than ncsq_max consequences, so can't fit it in FMT + { + int ismpl = args->smpl->idx[i]; + if ( args->verbosity && (!args->ncsq2_small_warned || args->verbosity > 1) ) + { + fprintf(stderr, + "Warning: Too many consequences for sample %s at %s:%"PRId64", keeping the first %d and skipping the rest.\n", + args->hdr->samples[ismpl],bcf_hdr_id2name(args->hdr,args->rid),(int64_t) vrec->line->pos+1,icsq2+1); + if ( !args->ncsq2_small_warned ) + fprintf(stderr," The limit can be increased by setting the --ncsq parameter. This warning is printed only once.\n"); + args->ncsq2_small_warned = 1; + } + if ( args->ncsq2_small_warned < icsq2 ) args->ncsq2_small_warned = icsq2; + break; + } + int ival, ibit; + icsq2_to_bit(icsq2, &ival,&ibit); + if ( vrec->nfmt < 1 + ival ) vrec->nfmt = 1 + ival; + vrec->fmt_bm[i*args->nfmt_bcsq + ival] |= 1 << ibit; + } + } +} +int test_utr(args_t *args, bcf1_t *rec) +{ + const char *chr = bcf_seqname(args->hdr,rec); + // note that the off-by-one extension of rlen is deliberate to account for insertions + if ( !regidx_overlap(args->idx_utr,chr,rec->pos,rec->pos+rec->rlen, args->itr) ) return 0; + + splice_t splice; + splice_init(&splice, rec); + + int i, ret = 0; + while ( regitr_overlap(args->itr) ) + { + gf_utr_t *utr = regitr_payload(args->itr, gf_utr_t*); + tscript_t *tr = splice.tr = utr->tr; + for (i=1; in_allele; i++) + { + if ( rec->d.allele[i][0]=='<' || rec->d.allele[i][0]=='*' ) { continue; } + splice.vcf.alt = rec->d.allele[i]; + splice.csq = 0; + int splice_ret = splice_csq(args, &splice, utr->beg, utr->end); + if ( splice_ret!=SPLICE_INSIDE && splice_ret!=SPLICE_OVERLAP ) continue; + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.type = utr->which==prime5 ? CSQ_UTR5 : CSQ_UTR3; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = i; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + ret = 1; + } + } + assert(!splice.kref.s); + assert(!splice.kalt.s); + return ret; +} +int test_splice(args_t *args, bcf1_t *rec) +{ + const char *chr = bcf_seqname(args->hdr,rec); + if ( !regidx_overlap(args->idx_exon,chr,rec->pos,rec->pos + rec->rlen, args->itr) ) return 0; + + splice_t splice; + splice_init(&splice, rec); + splice.check_acceptor = splice.check_donor = 1; + + int i, ret = 0; + while ( regitr_overlap(args->itr) ) + { + gf_exon_t *exon = regitr_payload(args->itr, gf_exon_t*); + splice.tr = exon->tr; + if ( !splice.tr->ncds ) continue; // not a coding transcript, no interest in splice sites + + splice.check_region_beg = splice.tr->beg==exon->beg ? 0 : 1; + splice.check_region_end = splice.tr->end==exon->end ? 0 : 1; + + for (i=1; in_allele; i++) + { + if ( rec->d.allele[1][0]=='<' || rec->d.allele[1][0]=='*' ) { continue; } + splice.vcf.alt = rec->d.allele[i]; + splice.csq = 0; + splice_csq(args, &splice, exon->beg, exon->end); + if ( splice.csq ) ret = 1; + } + } + free(splice.kref.s); + free(splice.kalt.s); + return ret; +} +int test_tscript(args_t *args, bcf1_t *rec) +{ + const char *chr = bcf_seqname(args->hdr,rec); + if ( !regidx_overlap(args->idx_tscript,chr,rec->pos,rec->pos+rec->rlen, args->itr) ) return 0; + + splice_t splice; + splice_init(&splice, rec); + + int i, ret = 0; + while ( regitr_overlap(args->itr) ) + { + tscript_t *tr = splice.tr = regitr_payload(args->itr, tscript_t*); + for (i=1; in_allele; i++) + { + if ( rec->d.allele[i][0]=='<' || rec->d.allele[i][0]=='*' ) { continue; } + splice.vcf.alt = rec->d.allele[i]; + splice.csq = 0; + int splice_ret = splice_csq(args, &splice, tr->beg, tr->end); + if ( splice_ret!=SPLICE_INSIDE && splice_ret!=SPLICE_OVERLAP ) continue; // SPLICE_OUTSIDE or SPLICE_REF + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.type = GF_is_coding(tr->type) ? CSQ_INTRON : CSQ_NON_CODING; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + ret = 1; + } + } + assert(!splice.kref.s); + assert(!splice.kalt.s); + return ret; +} + +void test_symbolic_alt(args_t *args, bcf1_t *rec) +{ + static int warned = 0; + if ( args->verbosity && (!warned && args->verbosity > 0) ) + { + fprintf(stderr,"Warning: The support for symbolic ALT insertions is experimental.\n"); + warned = 1; + } + + const char *chr = bcf_seqname(args->hdr,rec); + + // only insertions atm + int beg = rec->pos + 1; + int end = beg; + int csq_class = CSQ_ELONGATION; + + int hit = 0; + if ( regidx_overlap(args->idx_cds,chr,beg,end, args->itr) ) + { + while ( regitr_overlap(args->itr) ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + gf_cds_t *cds = regitr_payload(args->itr,gf_cds_t*); + tscript_t *tr = cds->tr; + csq.type.type = (GF_is_coding(tr->type) ? CSQ_CODING_SEQUENCE : CSQ_NON_CODING) | csq_class; + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + hit = 1; + } + } + if ( regidx_overlap(args->idx_utr,chr,beg,end, args->itr) ) + { + while ( regitr_overlap(args->itr) ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + gf_utr_t *utr = regitr_payload(args->itr, gf_utr_t*); + tscript_t *tr = utr->tr; + csq.type.type = (utr->which==prime5 ? CSQ_UTR5 : CSQ_UTR3) | csq_class; + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + hit = 1; + } + } + if ( regidx_overlap(args->idx_exon,chr,beg,end, args->itr) ) + { + splice_t splice; + splice_init(&splice, rec); + splice.check_acceptor = splice.check_donor = 1; + + while ( regitr_overlap(args->itr) ) + { + gf_exon_t *exon = regitr_payload(args->itr, gf_exon_t*); + splice.tr = exon->tr; + if ( !splice.tr->ncds ) continue; // not a coding transcript, no interest in splice sites + splice.check_region_beg = splice.tr->beg==exon->beg ? 0 : 1; + splice.check_region_end = splice.tr->end==exon->end ? 0 : 1; + splice.vcf.alt = rec->d.allele[1]; + splice.csq = csq_class; + splice_csq(args, &splice, exon->beg, exon->end); + if ( splice.csq ) hit = 1; + } + } + if ( !hit && regidx_overlap(args->idx_tscript,chr,beg,end, args->itr) ) + { + splice_t splice; + splice_init(&splice, rec); + + while ( regitr_overlap(args->itr) ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + tscript_t *tr = splice.tr = regitr_payload(args->itr, tscript_t*); + splice.vcf.alt = rec->d.allele[1]; + splice.csq = csq_class; + int splice_ret = splice_csq(args, &splice, tr->beg, tr->end); + if ( splice_ret!=SPLICE_INSIDE && splice_ret!=SPLICE_OVERLAP ) continue; // SPLICE_OUTSIDE or SPLICE_REF + csq.type.type = (GF_is_coding(tr->type) ? CSQ_INTRON : CSQ_NON_CODING) | csq_class; + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + } + } +} + +void debug_print_buffers(args_t *args, int pos) +{ + int i,j; + fprintf(stderr,"debug_print_buffers at %d\n", pos); + fprintf(stderr,"vbufs:\n"); + for (i=0; ivcf_rbuf.n; i++) + { + int k = rbuf_kth(&args->vcf_rbuf, i); + vbuf_t *vbuf = args->vcf_buf[k]; + + fprintf(stderr,"\tvbuf %d:\n", i); + for (j=0; jn; j++) + { + vrec_t *vrec = vbuf->vrec[j]; + fprintf(stderr,"\t\t%"PRId64" .. nvcsq=%d\n", (int64_t) vrec->line->pos+1, vrec->nvcsq); + } + } + fprintf(stderr,"pos2vbuf:"); + khint_t k; + for (k = 0; k < kh_end(args->pos2vbuf); ++k) + if (kh_exist(args->pos2vbuf, k)) fprintf(stderr," %d",1+(int)kh_key(args->pos2vbuf, k)); + fprintf(stderr,"\n"); + fprintf(stderr,"active_tr: %d\n", args->active_tr->ndat); +} + +static void process(args_t *args, bcf1_t **rec_ptr) +{ + if ( !rec_ptr ) + { + hap_flush(args, REGIDX_MAX); + vbuf_flush(args, REGIDX_MAX); + return; + } + + bcf1_t *rec = *rec_ptr; + static int32_t prev_rid = -1, prev_pos = -1; + if ( prev_rid!=rec->rid ) + { + prev_rid = rec->rid; + prev_pos = rec->pos; + + // Common error is to use different naming conventions in the fasta and the VCF (e.g. X vs chrX). + // Perform a simple sanity check (that does not catch much), the chromosome must be present in the + // reference file + if ( !faidx_has_seq(args->fai,bcf_seqname(args->hdr,rec)) ) + error("Error: the chromosome \"%s\" is not present in %s\n",bcf_seqname(args->hdr,rec),args->fa_fname); + } + if ( prev_pos > rec->pos ) + error("Error: The file is not sorted, %s:%d comes before %s:%"PRId64"\n",bcf_seqname(args->hdr,rec),prev_pos+1,bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + + int call_csq = 1; + if ( rec->n_allele < 2 ) call_csq = 0; // no alternate allele + else if ( rec->n_allele==2 && (rec->d.allele[1][0]=='*' || rec->d.allele[1][1]=='*') ) call_csq = 0; // gVCF, not an alt allele + else if ( rec->d.allele[1][0]=='<' ) + { + if ( strncmp("d.allele[1], 4) ) call_csq = 0; // only is supported at the moment + } + if ( call_csq && args->filter ) + { + call_csq = filter_test(args->filter, rec, NULL); + if ( args->filter_logic==FLT_EXCLUDE ) call_csq = call_csq ? 0 : 1; + } + if ( !call_csq ) + { + if ( !args->out_fh ) return; // not a VCF output + vbuf_push(args, rec_ptr); + hap_flush(args, rec->pos-1); + vbuf_flush(args, rec->pos-1); + return; + } + + if ( args->rid != rec->rid ) + { + hap_flush(args, REGIDX_MAX); + vbuf_flush(args, REGIDX_MAX); + } + args->rid = rec->rid; + vbuf_t *vbuf = vbuf_push(args, rec_ptr); + + if ( rec->d.allele[1][0]!='<' ) + { + int hit = args->local_csq ? test_cds_local(args, rec) : test_cds(args, rec, vbuf); + hit += test_utr(args, rec); + hit += test_splice(args, rec); + if ( !hit ) test_tscript(args, rec); + } + else + test_symbolic_alt(args, rec); + + if ( rec->pos > 0 ) + { + hap_flush(args, rec->pos-1); + vbuf_flush(args, rec->pos-1); + } + + return; +} + +static const char *usage(void) +{ + return + "\n" + "About: Haplotype-aware consequence caller.\n" + "Usage: bcftools csq [OPTIONS] in.vcf\n" + "\n" + "Required options:\n" + " -f, --fasta-ref FILE Reference file in fasta format\n" + " -g, --gff-annot FILE GFF3 annotation file\n" + "\n" + "CSQ options:\n" + " -B, --trim-protein-seq INT Abbreviate protein-changing predictions to max INT aminoacids\n" + " -c, --custom-tag STRING Use this tag instead of the default BCSQ\n" + " -l, --local-csq Localized predictions, consider only one VCF record at a time\n" + " -n, --ncsq INT Maximum number of per-haplotype consequences to consider for each site [15]\n" + " -p, --phase a|m|r|R|s How to handle unphased heterozygous genotypes: [r]\n" + " a: take GTs as is, create haplotypes regardless of phase (0/1 -> 0|1)\n" + " m: merge *all* GTs into a single haplotype (0/1 -> 1, 1/2 -> 1)\n" + " r: require phased GTs, throw an error on unphased het GTs\n" + " R: create non-reference haplotypes if possible (0/1 -> 1|1, 1/2 -> 1|2)\n" + " s: skip unphased hets\n" + "Options:\n" + " -e, --exclude EXPR Exclude sites for which the expression is true\n" + " --force Run even if some sanity checks fail\n" + " -i, --include EXPR Select sites for which the expression is true\n" + " --no-version Do not append version and command line to the header\n" + " -o, --output FILE Write output to a file [standard output]\n" + " -O, --output-type b|u|z|v|t[0-9] b: compressed BCF, u: uncompressed BCF, z: compressed VCF\n" + " v: uncompressed VCF, t: plain tab-delimited text output, 0-9: compression level [v]\n" + " -r, --regions REGION Restrict to comma-separated list of regions\n" + " -R, --regions-file FILE Restrict to regions listed in a file\n" + " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n" + " -s, --samples -|LIST Samples to include or \"-\" to apply all variants and ignore samples\n" + " -S, --samples-file FILE Samples to include\n" + " -t, --targets REGION Similar to -r but streams rather than index-jumps\n" + " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n" + " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n" + " --threads INT Use multithreading with worker threads [0]\n" + " -v, --verbose INT Verbosity level 0-2 [1]\n" + "\n" + "Example:\n" + " bcftools csq -f hs37d5.fa -g Homo_sapiens.GRCh37.82.gff3.gz in.vcf\n" + "\n" + " # GFF3 annotation files can be downloaded from Ensembl. e.g. for human:\n" + " ftp://ftp.ensembl.org/pub/current_gff3/homo_sapiens/\n" + " ftp://ftp.ensembl.org/pub/grch37/release-84/gff3/homo_sapiens/\n" + "\n"; +} + +int main_csq(int argc, char *argv[]) +{ + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->output_type = FT_VCF; + args->bcsq_tag = "BCSQ"; + args->ncsq2_max = 2*(16-1); // 1 bit is reserved for BCF missing values + args->verbosity = 1; + args->record_cmd_line = 1; + args->clevel = -1; + + static struct option loptions[] = + { + {"force",0,0,1}, + {"threads",required_argument,NULL,2}, + {"help",0,0,'h'}, + {"ncsq",1,0,'n'}, + {"brief-predictions",no_argument,0,'b'}, + {"trim-protein-seq",required_argument,0,'B'}, + {"custom-tag",1,0,'c'}, + {"local-csq",0,0,'l'}, + {"gff-annot",1,0,'g'}, + {"fasta-ref",1,0,'f'}, + {"include",1,0,'i'}, + {"exclude",1,0,'e'}, + {"output",1,0,'o'}, + {"output-type",1,NULL,'O'}, + {"phase",1,0,'p'}, + {"quiet",0,0,'q'}, + {"verbose",1,0,'v'}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,4}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,5}, + {"no-version",no_argument,NULL,3}, + {0,0,0,0} + }; + int c, targets_is_file = 0, regions_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + char *targets_list = NULL, *regions_list = NULL, *tmp; + while ((c = getopt_long(argc, argv, "?hr:R:t:T:i:e:f:o:O:g:s:S:p:qc:ln:bB:v:",loptions,NULL)) >= 0) + { + switch (c) + { + case 1 : args->force = 1; break; + case 2 : + args->n_threads = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --threads %s\n", optarg); + break; + case 3 : args->record_cmd_line = 0; break; + case 'b': + args->brief_predictions = 1; + fprintf(stderr,"Warning: the -b option will be removed in future versions. Please use -B 1 instead.\n"); + break; + case 'B': + args->brief_predictions = strtol(optarg,&tmp,10); + if ( *tmp || args->brief_predictions<1 ) error("Could not parse argument: --trim-protein-seq %s\n", optarg); + break; + case 'l': args->local_csq = 1; break; + case 'c': args->bcsq_tag = optarg; break; + case 'q': error("Error: the -q option has been deprecated, use -v, --verbose instead.\n"); break; + case 'v': + args->verbosity = atoi(optarg); + if ( args->verbosity<0 || args->verbosity>2 ) error("Error: expected integer 0-2 with -v, --verbose\n"); + break; + case 'p': + switch (optarg[0]) + { + case 'a': args->phase = PHASE_AS_IS; break; + case 'm': args->phase = PHASE_MERGE; break; + case 'r': args->phase = PHASE_REQUIRE; break; + case 'R': args->phase = PHASE_NON_REF; break; + case 's': args->phase = PHASE_SKIP; break; + default: error("The -p code \"%s\" not recognised\n", optarg); + } + break; + case 'f': args->fa_fname = optarg; break; + case 'g': args->gff_fname = optarg; break; + case 'n': + args->ncsq2_max = 2 * atoi(optarg); + if ( args->ncsq2_max <= 0 ) error("Expected positive integer with -n, got %s\n", optarg); + break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 't': args->output_type = FT_TAB_TEXT; break; + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --output-type %s\n", optarg+1); + } + break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'r': regions_list = optarg; break; + case 'R': regions_list = optarg; regions_is_file = 1; break; + case 's': args->sample_list = optarg; break; + case 'S': args->sample_list = optarg; args->sample_is_file = 1; break; + case 't': targets_list = optarg; break; + case 'T': targets_list = optarg; targets_is_file = 1; break; + case 4 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 5 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 'h': + case '?': error("%s",usage()); + default: error("The option not recognised: %s\n\n", optarg); break; + } + } + char *fname = NULL; + if ( optind==argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else error("%s", usage()); + } + else fname = argv[optind]; + if ( argc - optind>1 ) error("%s", usage()); + if ( !args->fa_fname ) error("Missing the --fa-ref option\n"); + if ( !args->gff_fname ) error("Missing the --gff option\n"); + args->sr = bcf_sr_init(); + if ( targets_list ) + { + bcf_sr_set_opt(args->sr,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->sr, targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", targets_list); + } + if ( regions_list ) + { + bcf_sr_set_opt(args->sr,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->sr, regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", regions_list); + } + if ( bcf_sr_set_threads(args->sr, args->n_threads)<0 ) error("Failed to create %d extra threads\n", args->n_threads); + if ( !bcf_sr_add_reader(args->sr, fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->sr->errnum)); + args->hdr = bcf_sr_get_header(args->sr,0); + + init_data(args); + while ( bcf_sr_next_line(args->sr) ) + { + process(args, &args->sr->readers[0].buffer[0]); + } + process(args,NULL); + + destroy_data(args); + bcf_sr_destroy(args->sr); + free(args); + return 0; +} + diff --git a/bcftools/csq.c.pysam.c b/bcftools/csq.c.pysam.c new file mode 100644 index 0000000..e4abf4b --- /dev/null +++ b/bcftools/csq.c.pysam.c @@ -0,0 +1,4397 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2016-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ +/* + Things that would be nice to have + - dynamic N_REF_PAD + - for stop-lost events (also in frameshifts) report the number of truncated aa's + - memory could be greatly reduced by indexing gff (but it is quite compact already) + - deletions that go beyond transcript boundaries are not checked at sequence level + - alloc tscript->ref in hap_finalize, introduce fa_off_beg:16,fa_off_end:16 + - see test/csq/ENST00000573314/insertion-overlap.vcf #1476288882 + + Read about transcript types here + http://vega.sanger.ac.uk/info/about/gene_and_transcript_types.html + http://www.ensembl.org/info/genome/variation/predicted_data.html + http://www.gencodegenes.org/gencode_biotypes.html + + List of supported biotypes + antisense + IG_C_gene + IG_D_gene + IG_J_gene + IG_LV_gene + IG_V_gene + lincRNA + macro_lncRNA + miRNA + misc_RNA + Mt_rRNA + Mt_tRNA + polymorphic_pseudogene + processed_transcript + protein_coding + ribozyme + rRNA + sRNA + scRNA + scaRNA + sense_intronic + sense_overlapping + snRNA + snoRNA + TR_C_gene + TR_D_gene + TR_J_gene + TR_V_gene + + The gff parsing logic + We collect features such by combining gff lines A,B,C as follows: + A .. gene line with a supported biotype + A.ID=~/^gene:/ + + B .. transcript line referencing A with supported biotype + B.ID=~/^transcript:/ && B.Parent=~/^gene:A.ID/ + + C .. corresponding CDS, exon, and UTR lines: + C[3] in {"CDS","exon","three_prime_UTR","five_prime_UTR"} && C.Parent=~/^transcript:B.ID/ + + For coding biotypes ("protein_coding" or "polymorphic_pseudogene") the + complete chain link C -> B -> A is required. For the rest, link B -> A suffices. + + + The supported consequence types, sorted by impact: + splice_acceptor_variant .. end region of an intron changed (2bp at the 3' end of an intron) + splice_donor_variant .. start region of an intron changed (2bp at the 5' end of an intron) + stop_gained .. DNA sequence variant resulting in a stop codon + frameshift_variant .. number of inserted/deleted bases not a multiple of three, disrupted translational frame + stop_lost .. elongated transcript, stop codon changed + start_lost .. the first codon changed + inframe_altering .. combination of indels leading to unchanged reading frame and length + inframe_insertion .. inserted coding sequence, unchanged reading frame + inframe_deletion .. deleted coding sequence, unchanged reading frame + missense_variant .. amino acid (aa) change, unchanged length + splice_region_variant .. change within 1-3 bases of the exon or 3-8 bases of the intron + synonymous_variant .. DNA sequence variant resulting in no amino acid change + stop_retained_variant .. different stop codon + start_retained_variant .. start codon retained by indel realignment + non_coding_variant .. variant in non-coding sequence, such as RNA gene + 5_prime_UTR_variant + 3_prime_UTR_variant + intron_variant .. reported only if none of the above + intergenic_variant .. reported only if none of the above + + + The annotation algorithm. + The algorithm checks if the variant falls in a region of a supported type. The + search is performed in the following order, until a match is found: + 1. idx_cds(gf_cds_t) - lookup CDS by position, create haplotypes, call consequences + 2. idx_utr(gf_utr_t) - check UTR hits + 3. idx_exon(gf_exon_t) - check for splice variants + 4. idx_tscript(tscript_t) - check for intronic variants, RNAs, etc. + + These regidx indexes are created by parsing a gff3 file as follows: + 1. create the array "ftr" of all UTR, CDS, exons. This will be + processed later and pruned based on transcript types we want to keep. + In the same go, create the hash "id2tr" of transcripts to keep + (based on biotype) which maps from transcript_id to a transcript. At + the same time also build the hash "gid2gene" which maps from gene_id to + gf_gene_t pointer. + + 2. build "idx_cds", "idx_tscript", "idx_utr" and "idx_exon" indexes. + Use only features from "ftr" which are present in "id2tr". + + 3. clean data that won't be needed anymore: ftr, id2tr, gid2gene. + + Data structures. + idx_cds, idx_utr, idx_exon, idx_tscript: + as described above, regidx structures for fast lookup of exons/transcripts + overlapping a region, the payload is a pointer to tscript.cds +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "regidx.h" +#include "kheap.h" +#include "smpl_ilist.h" +#include "rbuf.h" + +#ifndef __FUNCTION__ +# define __FUNCTION__ __func__ +#endif + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +// Definition of splice_region, splice_acceptor and splice_donor +#define N_SPLICE_DONOR 2 +#define N_SPLICE_REGION_EXON 3 +#define N_SPLICE_REGION_INTRON 8 + +#define N_REF_PAD 10 // number of bases to avoid boundary effects + +#define STRAND_REV 0 +#define STRAND_FWD 1 + +#define TRIM_NONE 0 +#define TRIM_5PRIME 1 +#define TRIM_3PRIME 2 + +// How to treat phased/unphased genotypes +#define PHASE_REQUIRE 0 // --phase r +#define PHASE_MERGE 1 // --phase m +#define PHASE_AS_IS 2 // --phase a +#define PHASE_SKIP 3 // --phase s +#define PHASE_NON_REF 4 // --phase R +#define PHASE_DROP_GT 5 // --samples - + +// Node types in the haplotype tree +#define HAP_CDS 0 +#define HAP_ROOT 1 +#define HAP_SSS 2 // start/stop/splice + +#define CSQ_PRINTED_UPSTREAM (1<<0) +#define CSQ_SYNONYMOUS_VARIANT (1<<1) +#define CSQ_MISSENSE_VARIANT (1<<2) +#define CSQ_STOP_LOST (1<<3) +#define CSQ_STOP_GAINED (1<<4) +#define CSQ_INFRAME_DELETION (1<<5) +#define CSQ_INFRAME_INSERTION (1<<6) +#define CSQ_FRAMESHIFT_VARIANT (1<<7) +#define CSQ_SPLICE_ACCEPTOR (1<<8) +#define CSQ_SPLICE_DONOR (1<<9) +#define CSQ_START_LOST (1<<10) +#define CSQ_SPLICE_REGION (1<<11) +#define CSQ_STOP_RETAINED (1<<12) +#define CSQ_UTR5 (1<<13) +#define CSQ_UTR3 (1<<14) +#define CSQ_NON_CODING (1<<15) +#define CSQ_INTRON (1<<16) +//#define CSQ_INTERGENIC (1<<17) +#define CSQ_INFRAME_ALTERING (1<<18) +#define CSQ_UPSTREAM_STOP (1<<19) // adds * in front of the csq string +#define CSQ_INCOMPLETE_CDS (1<<20) // to remove START/STOP in incomplete CDS, see ENSG00000173376/synon.vcf +#define CSQ_CODING_SEQUENCE (1<<21) // cannot tell exactly what it is, but it does affect the coding sequence +#define CSQ_ELONGATION (1<<22) // symbolic insertion +#define CSQ_START_RETAINED (1<<23) + +// Haplotype-aware consequences, printed in one vcf record only, the rest has a reference @12345 +#define CSQ_COMPOUND (CSQ_SYNONYMOUS_VARIANT|CSQ_MISSENSE_VARIANT|CSQ_STOP_LOST|CSQ_STOP_GAINED| \ + CSQ_INFRAME_DELETION|CSQ_INFRAME_INSERTION|CSQ_FRAMESHIFT_VARIANT| \ + CSQ_START_LOST|CSQ_STOP_RETAINED|CSQ_INFRAME_ALTERING|CSQ_INCOMPLETE_CDS| \ + CSQ_UPSTREAM_STOP|CSQ_START_RETAINED) +#define CSQ_START_STOP (CSQ_STOP_LOST|CSQ_STOP_GAINED|CSQ_STOP_RETAINED|CSQ_START_LOST|CSQ_START_RETAINED) + +#define CSQ_PRN_STRAND(csq) ((csq)&CSQ_COMPOUND && !((csq)&(CSQ_SPLICE_ACCEPTOR|CSQ_SPLICE_DONOR|CSQ_SPLICE_REGION))) +#define CSQ_PRN_TSCRIPT (~(CSQ_INTRON|CSQ_NON_CODING)) +#define CSQ_PRN_BIOTYPE CSQ_NON_CODING + +// see kput_vcsq() +const char *csq_strings[] = +{ + NULL, + "synonymous", + "missense", + "stop_lost", + "stop_gained", + "inframe_deletion", + "inframe_insertion", + "frameshift", + "splice_acceptor", + "splice_donor", + "start_lost", + "splice_region", + "stop_retained", + "5_prime_utr", + "3_prime_utr", + "non_coding", + "intron", + "intergenic", + "inframe_altering", + NULL, + NULL, + "coding_sequence", + "feature_elongation", + "start_retained" +}; + + +// GFF line types +#define GFF_TSCRIPT_LINE 1 +#define GFF_GENE_LINE 2 + + +/* + Genomic features, for fast lookup by position to overlapping features +*/ +#define GF_coding_bit 6 +#define GF_is_coding(x) ((x) & (1<5I|121ACG>A+124TA>T" + + vrec_t + single VCF record and csq tied to this record. (Haplotype can have multiple + consequences in several VCF records. Each record can have multiple consequences + from multiple haplotypes.) + + csq_t + a top-level consequence tied to a haplotype + + vbuf_t + pos2vbuf + VCF records with the same position clustered together for a fast lookup via pos2vbuf +*/ +typedef struct _vbuf_t vbuf_t; +typedef struct _vcsq_t vcsq_t; +struct _vcsq_t +{ + uint32_t strand:1, + type:31; // one of CSQ_* types + uint32_t trid; + uint32_t vcf_ial; + uint32_t biotype; // one of GF_* types + char *gene; // gene name + bcf1_t *ref; // if type&CSQ_PRINTED_UPSTREAM, ref consequence "@1234" + kstring_t vstr; // variant string, eg 5TY>5I|121ACG>A+124TA>T +}; +typedef struct +{ + bcf1_t *line; + uint32_t *fmt_bm; // bitmask of sample consequences with first/second haplotype interleaved + uint32_t nfmt:4, // the bitmask size (the number of integers per sample) + nvcsq:28, mvcsq; + vcsq_t *vcsq; // there can be multiple consequences for a single VCF record +} +vrec_t; +typedef struct +{ + uint32_t pos; + vrec_t *vrec; // vcf line that this csq is tied to; needed when printing haplotypes (hap_stage_vcf) + int idx; // 0-based index of the csq at the VCF line, for FMT/BCSQ + vcsq_t type; +} +csq_t; +struct _vbuf_t +{ + vrec_t **vrec; // buffer of VCF lines with the same position + int n, m; + uint32_t keep_until; // the maximum transcript end position +}; +KHASH_MAP_INIT_INT(pos2vbuf, vbuf_t*) + + +/* + Structures related to haplotype-aware consequences in coding regions + + hap_node_t + node of a haplotype tree. Each transcript has one tree + + tscript_t + despite its general name, it is intended for coding transcripts only + + hap_t + hstack_t + for traversal of the haplotype tree and braking combined + consequences into independent parts +*/ +typedef struct _hap_node_t hap_node_t; +struct _hap_node_t +{ + char *seq; // cds segment [parent_node,this_node) + char *var; // variant "ref>alt" + uint32_t type:2, // HAP_ROOT or HAP_CDS + csq:30; // this node's consequence + int dlen; // alt minus ref length: <0 del, >0 ins, 0 substitution + uint32_t rbeg; // variant's VCF position (0-based, inclusive) + int32_t rlen; // variant's rlen; alen=rlen+dlen; fake for non CDS types + uint32_t sbeg; // variant's position on the spliced reference transcript (0-based, inclusive, N_REF_PAD not included) + uint32_t icds; // which exon does this node's variant overlaps + hap_node_t **child, *prev; // children haplotypes and previous coding node + int nchild, mchild; + bcf1_t *cur_rec, *rec; // current VCF record and node's VCF record + int vcf_ial; // which VCF allele generated this node + uint32_t nend; // number of haplotypes ending in this node + int *cur_child, mcur_child; // mapping from the allele to the currently active child + csq_t *csq_list; // list of haplotype's consequences, broken by position (each corresponds to a VCF record) + int ncsq_list, mcsq_list; +}; +struct _tscript_t +{ + uint32_t id; // transcript id + uint32_t beg,end; // transcript's beg and end coordinate (ref strand, 0-based, inclusive) + uint32_t strand:1, // STRAND_REV or STRAND_FWD + ncds:31, // number of exons + mcds; + gf_cds_t **cds; // ordered list of exons + char *ref; // reference sequence, padded with N_REF_PAD bases on both ends + char *sref; // spliced reference sequence, padded with N_REF_PAD bases on both ends + hap_node_t *root; // root of the haplotype tree + hap_node_t **hap; // pointer to haplotype leaves, two for each sample + int nhap, nsref; // number of haplotypes and length of sref, including 2*N_REF_PAD + uint32_t trim:2, // complete, 5' or 3' trimmed, see TRIM_* types + type:30; // one of GF_* types + gf_gene_t *gene; +}; +static inline int cmp_tscript(tscript_t **a, tscript_t **b) +{ + return ( (*a)->end < (*b)->end ) ? 1 : 0; +} +KHEAP_INIT(trhp, tscript_t*, cmp_tscript) +typedef khp_trhp_t tr_heap_t; +typedef struct +{ + hap_node_t *node; // current node + int ichild; // current child in the active node + int dlen; // total dlen, from the root to the active node + size_t slen; // total sequence length, from the root to the active node +} +hstack_t; +typedef struct +{ + int mstack; + hstack_t *stack; + tscript_t *tr; // tr->ref: spliced transcript on ref strand + kstring_t sseq; // spliced haplotype sequence on ref strand + kstring_t tseq; // the variable part of translated haplotype transcript, coding strand + kstring_t tref; // the variable part of translated reference transcript, coding strand + uint32_t sbeg; // stack's sbeg, for cases first node's type is HAP_SSS + int upstream_stop; +} +hap_t; + + +/* + Helper structures, only for initialization + + ftr_t + temporary list of all exons, CDS, UTRs +*/ +KHASH_MAP_INIT_INT(int2tscript, tscript_t*) +KHASH_MAP_INIT_INT(int2gene, gf_gene_t*) +typedef struct +{ + int type; // GF_CDS, GF_EXON, GF_5UTR, GF_3UTR + uint32_t beg; + uint32_t end; + uint32_t trid; + uint32_t strand:1; // STRAND_REV,STRAND_FWD + uint32_t phase:2; // 0, 1, 2, or 3 for unknown + uint32_t iseq:29; +} +ftr_t; +/* + Mapping from GFF ID string (such as ENST00000450305 or Zm00001d027230_P001) + to integer id. To keep the memory requirements low, the original version + relied on IDs in the form of a string prefix and a numerical id. However, + it turns out that this assumption is not valid for some ensembl GFFs, see + for example Zea_mays.AGPv4.36.gff3.gz + */ +typedef struct +{ + void *str2id; // khash_str2int + int nstr, mstr; + char **str; // numeric id to string +} +id_tbl_t; +typedef struct +{ + // all exons, CDS, UTRs + ftr_t *ftr; + int nftr, mftr; + + // mapping from gene id to gf_gene_t + kh_int2gene_t *gid2gene; + + // mapping from transcript id to tscript, for quick CDS anchoring + kh_int2tscript_t *id2tr; + + // sequences + void *seq2int; // str2int hash + char **seq; + int nseq, mseq; + + // ignored biotypes + void *ignored_biotypes; + + id_tbl_t gene_ids; // temporary table for mapping between gene id (eg. Zm00001d027245) and a numeric idx +} +aux_t; + +typedef struct _args_t +{ + // the main regidx lookups, from chr:beg-end to overlapping features and + // index iterator + regidx_t *idx_cds, *idx_utr, *idx_exon, *idx_tscript; + regitr_t *itr; + + // temporary structures, deleted after initializtion + aux_t init; + + // text tab-delimited output (out) or vcf/bcf output (out_fh) + FILE *out; + htsFile *out_fh; + + // vcf + bcf_srs_t *sr; + bcf_hdr_t *hdr; + int hdr_nsmpl; // actual number of samples in the vcf, for bcf_update_format_values() + + // include or exclude sites which match the filters + filter_t *filter; + char *filter_str; + int filter_logic; // FLT_INCLUDE or FLT_EXCLUDE + + // samples to process + int sample_is_file; + char *sample_list; + smpl_ilist_t *smpl; + + char *outdir, **argv, *fa_fname, *gff_fname, *output_fname; + char *bcsq_tag; + int argc, output_type, clevel; + int phase, verbosity, local_csq, record_cmd_line; + int ncsq2_max, nfmt_bcsq; // maximum number of csq per site that can be accessed from FORMAT/BCSQ (*2 and 1 bit skipped to avoid BCF missing values) + int ncsq2_small_warned; + int brief_predictions; + + int rid; // current chromosome + tr_heap_t *active_tr; // heap of active transcripts for quick flushing + hap_t *hap; // transcript haplotype recursion + vbuf_t **vcf_buf; // buffered VCF lines to annotate with CSQ and flush + rbuf_t vcf_rbuf; // round buffer indexes to vcf_buf + kh_pos2vbuf_t *pos2vbuf; // fast lookup of buffered lines by position + tscript_t **rm_tr; // buffer of transcripts to clean + int nrm_tr, mrm_tr; + csq_t *csq_buf; // pool of csq not managed by hap_node_t, i.e. non-CDS csqs + int ncsq_buf, mcsq_buf; + id_tbl_t tscript_ids; // mapping between transcript id (eg. Zm00001d027245_T001) and a numeric idx + int force; // force run under various conditions. Currently only to skip out-of-phase transcripts + int n_threads; // extra compression/decompression threads + + faidx_t *fai; + kstring_t str, str2; + int32_t *gt_arr, mgt_arr; +} +args_t; + +// AAA, AAC, ... +const char *gencode = "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSS*CWCLFLF"; +const uint8_t nt4[] = +{ + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,0,4,1, 4,4,4,2, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 3,4,4,4, 4,4,4,4, 4,4,4,4, + 4,0,4,1, 4,4,4,2, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 3 +}; +const uint8_t cnt4[] = +{ + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + 4,3,4,2, 4,4,4,1, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 0,4,4,4, 4,4,4,4, 4,4,4,4, + 4,3,4,2, 4,4,4,1, 4,4,4,4, 4,4,4,4, + 4,4,4,4, 0 +}; +#define dna2aa(x) gencode[ nt4[(uint8_t)(x)[0]]<<4 | nt4[(uint8_t)(x)[1]]<<2 | nt4[(uint8_t)(x)[2]] ] +#define cdna2aa(x) gencode[ cnt4[(uint8_t)(x)[2]]<<4 | cnt4[(uint8_t)(x)[1]]<<2 | cnt4[(uint8_t)(x)[0]] ] + +static const char *gf_strings_noncoding[] = +{ + "MT_rRNA", "MT_tRNA", "lincRNA", "miRNA", "misc_RNA", "rRNA", "snRNA", "snoRNA", "processed_transcript", + "antisense", "macro_lncRNA", "ribozyme", "sRNA", "scRNA", "scaRNA", "sense_intronic", "sense_overlapping", + "pseudogene", "processed_pseudogene", "artifact", "IG_pseudogene", "IG_C_pseudogene", "IG_J_pseudogene", + "IG_V_pseudogene", "TR_V_pseudogene", "TR_J_pseudogene", "MT_tRNA_pseudogene", "misc_RNA_pseudogene", + "miRNA_pseudogene", "ribozyme", "retained_intron", "retrotransposed", "Trna_pseudogene", "transcribed_processed_pseudogene", + "transcribed_unprocessed_pseudogene", "transcribed_unitary_pseudogene", "translated_unprocessed_pseudogene", + "translated_processed_pseudogene", "known_ncRNA", "unitary_pseudogene", "unprocessed_pseudogene", + "LRG_gene", "3_prime_overlapping_ncRNA", "disrupted_domain", "vaultRNA", "bidirectional_promoter_lncRNA", "ambiguous_orf" +}; +static const char *gf_strings_coding[] = { "protein_coding", "polymorphic_pseudogene", "IG_C", "IG_D", "IG_J", "IG_LV", "IG_V", "TR_C", "TR_D", "TR_J", "TR_V", "NMD", "non_stop_decay"}; +static const char *gf_strings_special[] = { "CDS", "exon", "3_prime_UTR", "5_prime_UTR" }; + +const char *gf_type2gff_string(int type) +{ + if ( !GF_is_coding(type) ) + { + if ( type < (1<init; + char c = chr_end[1]; + chr_end[1] = 0; + int iseq; + if ( khash_str2int_get(aux->seq2int, chr_beg, &iseq)!=0 ) + { + // check for possible mismatch in chromosome naming convention such as chrX vs X + char *new_chr = NULL; + if ( faidx_has_seq(args->fai,chr_beg) ) + new_chr = strdup(chr_beg); // valid chr name, the same in gff and faidx + else + { + int len = strlen(chr_beg); + if ( !strncmp("chr",chr_beg,3) && len>3 ) + new_chr = strdup(chr_beg+3); // gff has the prefix, faidx does not + else + { + new_chr = malloc(len+4); // gff does not have the prefix, faidx has + memcpy(new_chr,"chr",3); + memcpy(new_chr+3,chr_beg,len); + new_chr[len+3] = 0; + } + if ( !faidx_has_seq(args->fai,new_chr) ) // modification did not help, this sequence is not in fai + { + static int unkwn_chr_warned = 0; + if ( !unkwn_chr_warned && args->verbosity>0 ) + fprintf(bcftools_stderr,"Warning: GFF chromosome \"%s\" not part of the reference genome\n",chr_beg); + unkwn_chr_warned = 1; + free(new_chr); + new_chr = strdup(chr_beg); // use the original sequence name + } + } + if ( khash_str2int_get(aux->seq2int, new_chr, &iseq)!=0 ) + { + hts_expand(char*, aux->nseq+1, aux->mseq, aux->seq); + aux->seq[aux->nseq] = new_chr; + iseq = khash_str2int_inc(aux->seq2int, aux->seq[aux->nseq]); + aux->nseq++; + assert( aux->nseq < 1<<29 ); // see gf_gene_t.iseq and ftr_t.iseq + } + else + free(new_chr); + } + chr_end[1] = c; + return iseq; +} +static inline char *gff_skip(const char *line, char *ss) +{ + while ( *ss && *ss!='\t' ) ss++; + if ( !*ss ) error("[%s:%d %s] Could not parse the line: %s\n",__FILE__,__LINE__,__FUNCTION__,line); + return ss+1; +} +static inline void gff_parse_chr(const char *line, char **chr_beg, char **chr_end) +{ + char *se = (char*) line; + while ( *se && *se!='\t' ) se++; + if ( !*se ) error("[%s:%d %s] Could not parse the line: %s\n",__FILE__,__LINE__,__FUNCTION__,line); + *chr_beg = (char*) line; + *chr_end = se-1; +} +static inline char *gff_parse_beg_end(const char *line, char *ss, uint32_t *beg, uint32_t *end) +{ + char *se = ss; + *beg = strtol(ss, &se, 10) - 1; + if ( ss==se ) error("[%s:%d %s] Could not parse the line:\n\t%s\n\t%s\n",__FILE__,__LINE__,__FUNCTION__,line,ss); + ss = se+1; + *end = strtol(ss, &se, 10) - 1; + if ( ss==se ) error("[%s:%d %s] Could not parse the line: %s\n",__FILE__,__LINE__,__FUNCTION__,line); + return se+1; +} +static void gff_id_init(id_tbl_t *tbl) +{ + memset(tbl, 0, sizeof(*tbl)); + tbl->str2id = khash_str2int_init(); +} +static void gff_id_destroy(id_tbl_t *tbl) +{ + khash_str2int_destroy_free(tbl->str2id); + free(tbl->str); +} +static inline uint32_t gff_id_parse(id_tbl_t *tbl, const char *line, const char *needle, char *ss) +{ + ss = strstr(ss,needle); // e.g. "ID=transcript:" + if ( !ss ) error("[%s:%d %s] Could not parse the line, \"%s\" not present: %s\n",__FILE__,__LINE__,__FUNCTION__,needle,line); + ss += strlen(needle); + + char *se = ss; + while ( *se && *se!=';' && !isspace(*se) ) se++; + char tmp = *se; + *se = 0; + + int id; + if ( khash_str2int_get(tbl->str2id, ss, &id) < 0 ) + { + id = tbl->nstr++; + hts_expand(char*, tbl->nstr, tbl->mstr, tbl->str); + tbl->str[id] = strdup(ss); + khash_str2int_set(tbl->str2id, tbl->str[id], id); + } + *se = tmp; + + return id; +} +static inline int gff_parse_type(char *line) +{ + line = strstr(line,"ID="); + if ( !line ) return -1; + line += 3; + if ( !strncmp(line,"transcript:",11) ) return GFF_TSCRIPT_LINE; + else if ( !strncmp(line,"gene:",5) ) return GFF_GENE_LINE; + return -1; +} +static inline int gff_parse_biotype(char *_line) +{ + char *line = strstr(_line,"biotype="); + if ( !line ) return -1; + + line += 8; + switch (*line) + { + case 'p': + if ( !strncmp(line,"protein_coding",14) ) return GF_PROTEIN_CODING; + else if ( !strncmp(line,"pseudogene",10) ) return GF_PSEUDOGENE; + else if ( !strncmp(line,"processed_transcript",20) ) return GF_PROCESSED_TRANSCRIPT; + else if ( !strncmp(line,"processed_pseudogene",20) ) return GF_PROCESSED_PSEUDOGENE; + else if ( !strncmp(line,"polymorphic_pseudogene",22) ) return GF_POLYMORPHIC_PSEUDOGENE; + break; + case 'a': + if ( !strncmp(line,"artifact",8) ) return GF_ARTIFACT; + else if ( !strncmp(line,"antisense",9) ) return GF_ANTISENSE; + else if ( !strncmp(line,"ambiguous_orf",13) ) return GF_AMBIGUOUS_ORF; + break; + case 'I': + if ( !strncmp(line,"IG_C_gene",9) ) return GF_IG_C; + else if ( !strncmp(line,"IG_D_gene",9) ) return GF_IG_D; + else if ( !strncmp(line,"IG_J_gene",9) ) return GF_IG_J; + else if ( !strncmp(line,"IG_LV_gene",10) ) return GF_IG_LV; + else if ( !strncmp(line,"IG_V_gene",9) ) return GF_IG_V; + else if ( !strncmp(line,"IG_pseudogene",13) ) return GF_IG_PSEUDOGENE; + else if ( !strncmp(line,"IG_C_pseudogene",15) ) return GF_IG_C_PSEUDOGENE; + else if ( !strncmp(line,"IG_J_pseudogene",15) ) return GF_IG_J_PSEUDOGENE; + else if ( !strncmp(line,"IG_V_pseudogene",15) ) return GF_IG_V_PSEUDOGENE; + break; + case 'T': + if ( !strncmp(line,"TR_C_gene",9) ) return GF_TR_C; + else if ( !strncmp(line,"TR_D_gene",9) ) return GF_TR_D; + else if ( !strncmp(line,"TR_J_gene",9) ) return GF_TR_J; + else if ( !strncmp(line,"TR_V_gene",9) ) return GF_TR_V; + else if ( !strncmp(line,"TR_V_pseudogene",15) ) return GF_TR_V_PSEUDOGENE; + else if ( !strncmp(line,"TR_J_pseudogene",15) ) return GF_TR_J_PSEUDOGENE; + break; + case 'M': + if ( !strncmp(line,"Mt_tRNA_pseudogene",18) ) return GF_MT_tRNA_PSEUDOGENE; + else if ( !strncmp(line,"Mt_tRNA",7) ) return GF_MT_tRNA; + else if ( !strncmp(line,"Mt_rRNA",7) ) return GF_MT_tRNA; + break; + case 'l': + if ( !strncmp(line,"lincRNA",7) ) return GF_lincRNA; + break; + case 'm': + if ( !strncmp(line,"macro_lncRNA",12) ) return GF_macro_lncRNA; + else if ( !strncmp(line,"misc_RNA_pseudogene",19) ) return GF_misc_RNA_PSEUDOGENE; + else if ( !strncmp(line,"miRNA_pseudogene",16) ) return GF_miRNA_PSEUDOGENE; + else if ( !strncmp(line,"miRNA",5) ) return GF_miRNA; + else if ( !strncmp(line,"misc_RNA",8) ) return GF_MISC_RNA; + break; + case 'r': + if ( !strncmp(line,"rRNA",4) ) return GF_rRNA; + else if ( !strncmp(line,"ribozyme",8) ) return GF_RIBOZYME; + else if ( !strncmp(line,"retained_intron",15) ) return GF_RETAINED_INTRON; + else if ( !strncmp(line,"retrotransposed",15) ) return GF_RETROTRANSPOSED; + break; + case 's': + if ( !strncmp(line,"snRNA",5) ) return GF_snRNA; + else if ( !strncmp(line,"sRNA",4) ) return GF_sRNA; + else if ( !strncmp(line,"scRNA",5) ) return GF_scRNA; + else if ( !strncmp(line,"scaRNA",6) ) return GF_scaRNA; + else if ( !strncmp(line,"snoRNA",6) ) return GF_snoRNA; + else if ( !strncmp(line,"sense_intronic",14) ) return GF_SENSE_INTRONIC; + else if ( !strncmp(line,"sense_overlapping",17) ) return GF_SENSE_OVERLAPPING; + break; + case 't': + if ( !strncmp(line,"tRNA_pseudogene",15) ) return GF_tRNA_PSEUDOGENE; + else if ( !strncmp(line,"transcribed_processed_pseudogene",32) ) return GF_TRANSCRIBED_PROCESSED_PSEUDOGENE; + else if ( !strncmp(line,"transcribed_unprocessed_pseudogene",34) ) return GF_TRANSCRIBED_UNPROCESSED_PSEUDOGENE; + else if ( !strncmp(line,"transcribed_unitary_pseudogene",30) ) return GF_TRANSCRIBED_UNITARY_PSEUDOGENE; + else if ( !strncmp(line,"translated_unprocessed_pseudogene",33) ) return GF_TRANSLATED_UNPROCESSED_PSEUDOGENE; + else if ( !strncmp(line,"translated_processed_pseudogene",31) ) return GF_TRANSLATED_PROCESSED_PSEUDOGENE; + break; + case 'n': + if ( !strncmp(line,"nonsense_mediated_decay",23) ) return GF_NMD; + else if ( !strncmp(line,"non_stop_decay",14) ) return GF_NON_STOP_DECAY; + break; + case 'k': + if ( !strncmp(line,"known_ncrna",11) ) return GF_KNOWN_NCRNA; + break; + case 'u': + if ( !strncmp(line,"unitary_pseudogene",18) ) return GF_UNITARY_PSEUDOGENE; + else if ( !strncmp(line,"unprocessed_pseudogene",22) ) return GF_UNPROCESSED_PSEUDOGENE; + break; + case 'L': + if ( !strncmp(line,"LRG_gene",8) ) return GF_LRG_GENE; + break; + case '3': + if ( !strncmp(line,"3prime_overlapping_ncRNA",24) ) return GF_3PRIME_OVERLAPPING_ncRNA; + break; + case 'd': + if ( !strncmp(line,"disrupted_domain",16) ) return GF_DISRUPTED_DOMAIN; + break; + case 'v': + if ( !strncmp(line,"vaultRNA",8) ) return GF_vaultRNA; + break; + case 'b': + if ( !strncmp(line,"bidirectional_promoter_lncRNA",29) ) return GF_BIDIRECTIONAL_PROMOTER_lncRNA; + break; + } + return 0; +} +static inline int gff_ignored_biotype(args_t *args, char *ss) +{ + ss = strstr(ss,"biotype="); + if ( !ss ) return 0; + + ss += 8; + char *se = ss, tmp; + while ( *se && *se!=';' ) se++; + tmp = *se; + *se = 0; + + char *key = ss; + int n = 0; + if ( khash_str2int_get(args->init.ignored_biotypes, ss, &n)!=0 ) key = strdup(ss); + khash_str2int_set(args->init.ignored_biotypes, key, n+1); + + *se = tmp; + return 1; +} +gf_gene_t *gene_init(aux_t *aux, uint32_t gene_id) +{ + khint_t k = kh_get(int2gene, aux->gid2gene, (int)gene_id); + gf_gene_t *gene = (k == kh_end(aux->gid2gene)) ? NULL : kh_val(aux->gid2gene, k); + if ( !gene ) + { + gene = (gf_gene_t*) calloc(1,sizeof(gf_gene_t)); + int ret; + k = kh_put(int2gene, aux->gid2gene, (int)gene_id, &ret); + kh_val(aux->gid2gene,k) = gene; + } + return gene; +} +void gff_parse_transcript(args_t *args, const char *line, char *ss, ftr_t *ftr) +{ + aux_t *aux = &args->init; + int biotype = gff_parse_biotype(ss); + if ( biotype <= 0 ) + { + if ( !gff_ignored_biotype(args, ss) && args->verbosity > 0 ) fprintf(bcftools_stderr,"ignored transcript: %s\n",line); + return; + } + + // create a mapping from transcript_id to gene_id + uint32_t trid = gff_id_parse(&args->tscript_ids, line, "ID=transcript:", ss); + uint32_t gene_id = gff_id_parse(&args->init.gene_ids, line, "Parent=gene:", ss); + + tscript_t *tr = (tscript_t*) calloc(1,sizeof(tscript_t)); + tr->id = trid; + tr->strand = ftr->strand; + tr->gene = gene_init(aux, gene_id); + tr->type = biotype; + tr->beg = ftr->beg; + tr->end = ftr->end; + + khint_t k; + int ret; + k = kh_put(int2tscript, aux->id2tr, (int)trid, &ret); + kh_val(aux->id2tr,k) = tr; +} +void gff_parse_gene(args_t *args, const char *line, char *ss, char *chr_beg, char *chr_end, ftr_t *ftr) +{ + int biotype = gff_parse_biotype(ss); + if ( biotype <= 0 ) + { + if ( !gff_ignored_biotype(args, ss) && args->verbosity > 0 ) fprintf(bcftools_stderr,"ignored gene: %s\n",line); + return; + } + + aux_t *aux = &args->init; + + // substring search for "ID=gene:ENSG00000437963" + uint32_t gene_id = gff_id_parse(&aux->gene_ids, line, "ID=gene:", ss); + gf_gene_t *gene = gene_init(aux, gene_id); + assert( !gene->name ); // the gene_id should be unique + + gene->iseq = feature_set_seq(args, chr_beg,chr_end); + + // substring search for "Name=OR4F5" + ss = strstr(chr_end+2,"Name="); + if ( ss ) + { + ss += 5; + char *se = ss; + while ( *se && *se!=';' && !isspace(*se) ) se++; + gene->name = (char*) malloc(se-ss+1); + memcpy(gene->name,ss,se-ss); + gene->name[se-ss] = 0; + } + else + gene->name = strdup(aux->gene_ids.str[gene_id]); // Name= field is not present, use the gene ID instead +} +int gff_parse(args_t *args, char *line, ftr_t *ftr) +{ + // - skip empty lines and commented lines + // - columns + // 1. chr + // 2. + // 3. CDS, transcript, gene, ... + // 4-5. beg,end + // 6. + // 7. strand + // 8. phase + // 9. Parent=transcript:ENST(\d+);ID=... etc + + char *ss = line; + if ( !*ss ) return -1; // skip blank lines + if ( *ss=='#' ) return -1; // skip comments + + char *chr_beg, *chr_end; + gff_parse_chr(line, &chr_beg, &chr_end); + ss = gff_skip(line, chr_end + 2); + + // 3. column: is this a CDS, transcript, gene, etc. + if ( !strncmp("exon\t",ss,5) ) { ftr->type = GF_EXON; ss += 5; } + else if ( !strncmp("CDS\t",ss,4) ) { ftr->type = GF_CDS; ss += 4; } + else if ( !strncmp("three_prime_UTR\t",ss,16) ) { ftr->type = GF_UTR3; ss += 16; } + else if ( !strncmp("five_prime_UTR\t",ss,15) ) { ftr->type = GF_UTR5; ss += 15; } + else + { + ss = gff_skip(line, ss); + ss = gff_parse_beg_end(line, ss, &ftr->beg,&ftr->end); + ss = gff_skip(line, ss); + int type = gff_parse_type(ss); + if ( type!=GFF_TSCRIPT_LINE && type!=GFF_GENE_LINE ) + { + // we ignore these, debug print to see new types: + ss = strstr(ss,"ID="); + if ( !ss ) return -1; // no ID, ignore the line + if ( !strncmp("chromosome",ss+3,10) ) return -1; + if ( !strncmp("supercontig",ss+3,11) ) return -1; + if ( args->verbosity > 0 ) fprintf(bcftools_stderr,"ignored: %s\n", line); + return -1; + } + + // 7. column: strand + if ( *ss == '+' ) ftr->strand = STRAND_FWD; + else if ( *ss == '-' ) ftr->strand = STRAND_REV; + else error("Unknown strand: %c .. %s\n", *ss,ss); + + if ( type==GFF_TSCRIPT_LINE ) + gff_parse_transcript(args, line, ss, ftr); + else + gff_parse_gene(args, line, ss, chr_beg, chr_end, ftr); + + return -1; + } + ss = gff_parse_beg_end(line, ss, &ftr->beg,&ftr->end); + ss = gff_skip(line, ss); + + // 7. column: strand + if ( *ss == '+' ) ftr->strand = STRAND_FWD; + else if ( *ss == '-' ) ftr->strand = STRAND_REV; + else { if ( args->verbosity > 0 ) fprintf(bcftools_stderr,"Skipping unknown strand: %c\n", *ss); return -1; } + ss += 2; + + // 8. column: phase (codon offset) + if ( *ss == '0' ) ftr->phase = 0; + else if ( *ss == '1' ) ftr->phase = 1; + else if ( *ss == '2' ) ftr->phase = 2; + else if ( *ss == '.' ) ftr->phase = CDS_PHASE_UNKN; // exons and even CDS in some GFFs do not have phase + else { if ( args->verbosity > 0 ) fprintf(bcftools_stderr,"Skipping unknown phase: %c, %s\n", *ss, line); return -1; } + ss += 2; + + // substring search for "Parent=transcript:ENST00000437963" + ftr->trid = gff_id_parse(&args->tscript_ids, line, "Parent=transcript:", ss); + ftr->iseq = feature_set_seq(args, chr_beg,chr_end); + return 0; +} + +static int cmp_cds_ptr(const void *a, const void *b) +{ + // comparison function for qsort of transcripts's CDS + if ( (*((gf_cds_t**)a))->beg < (*((gf_cds_t**)b))->beg ) return -1; + if ( (*((gf_cds_t**)a))->beg > (*((gf_cds_t**)b))->beg ) return 1; + return 0; +} + +static inline void chr_beg_end(aux_t *aux, int iseq, char **chr_beg, char **chr_end) +{ + *chr_beg = *chr_end = aux->seq[iseq]; + while ( (*chr_end)[1] ) (*chr_end)++; +} +tscript_t *tscript_init(aux_t *aux, uint32_t trid) +{ + khint_t k = kh_get(int2tscript, aux->id2tr, (int)trid); + tscript_t *tr = (k == kh_end(aux->id2tr)) ? NULL : kh_val(aux->id2tr, k); + assert( tr ); + return tr; +} +void register_cds(args_t *args, ftr_t *ftr) +{ + // Make the CDS searchable via idx_cds. Note we do not malloc tr->cds just yet. + // ftr is the result of parsing a gff CDS line + aux_t *aux = &args->init; + + tscript_t *tr = tscript_init(aux, ftr->trid); + if ( tr->strand != ftr->strand ) error("Conflicting strand in transcript %"PRIu32" .. %d vs %d\n",ftr->trid,tr->strand,ftr->strand); + + gf_cds_t *cds = (gf_cds_t*) malloc(sizeof(gf_cds_t)); + cds->tr = tr; + cds->beg = ftr->beg; + cds->len = ftr->end - ftr->beg + 1; + cds->icds = 0; // to keep valgrind on mac happy + cds->phase = ftr->phase; + + hts_expand(gf_cds_t*,tr->ncds+1,tr->mcds,tr->cds); + tr->cds[tr->ncds++] = cds; +} +void register_utr(args_t *args, ftr_t *ftr) +{ + aux_t *aux = &args->init; + gf_utr_t *utr = (gf_utr_t*) malloc(sizeof(gf_utr_t)); + utr->which = ftr->type==GF_UTR3 ? prime3 : prime5; + utr->beg = ftr->beg; + utr->end = ftr->end; + utr->tr = tscript_init(aux, ftr->trid); + + char *chr_beg, *chr_end; + chr_beg_end(&args->init, utr->tr->gene->iseq, &chr_beg, &chr_end); + regidx_push(args->idx_utr, chr_beg,chr_end, utr->beg,utr->end, &utr); +} +void register_exon(args_t *args, ftr_t *ftr) +{ + aux_t *aux = &args->init; + gf_exon_t *exon = (gf_exon_t*) malloc(sizeof(gf_exon_t)); + exon->beg = ftr->beg; + exon->end = ftr->end; + exon->tr = tscript_init(aux, ftr->trid); + + char *chr_beg, *chr_end; + chr_beg_end(&args->init, exon->tr->gene->iseq, &chr_beg, &chr_end); + regidx_push(args->idx_exon, chr_beg,chr_end, exon->beg - N_SPLICE_REGION_INTRON, exon->end + N_SPLICE_REGION_INTRON, &exon); +} + +void tscript_init_cds(args_t *args) +{ + aux_t *aux = &args->init; + + // Sort CDS in all transcripts, set offsets, check their phase, length, create index (idx_cds) + khint_t k; + int warn_phase_unkn = 0; + for (k=0; kid2tr); k++) + { + if ( !kh_exist(aux->id2tr, k) ) continue; + tscript_t *tr = (tscript_t*) kh_val(aux->id2tr, k); + + // position-to-tscript lookup + char *chr_beg, *chr_end; + chr_beg_end(aux, tr->gene->iseq, &chr_beg, &chr_end); + regidx_push(args->idx_tscript, chr_beg, chr_end, tr->beg, tr->end, &tr); + + if ( !tr->ncds ) continue; // transcript with no CDS + + // sort CDs + qsort(tr->cds, tr->ncds, sizeof(gf_cds_t*), cmp_cds_ptr); + + // trim non-coding start + int i, len = 0; + if ( tr->strand==STRAND_FWD ) + { + if ( tr->cds[0]->phase != CDS_PHASE_UNKN ) + { + if ( tr->cds[0]->phase ) tr->trim |= TRIM_5PRIME; + tr->cds[0]->beg += tr->cds[0]->phase; + tr->cds[0]->len -= tr->cds[0]->phase; + tr->cds[0]->phase = 0; + } + + // sanity check phase; the phase number in gff tells us how many bases to skip in this + // feature to reach the first base of the next codon + int tscript_ok = 1; + for (i=0; incds; i++) + { + if ( tr->cds[i]->phase == CDS_PHASE_UNKN ) + { + warn_phase_unkn = 1; + len += tr->cds[i]->len; + continue; + } + int phase = tr->cds[i]->phase ? 3 - tr->cds[i]->phase : 0; + if ( phase!=len%3 ) + { + if ( args->force ) + { + if ( args->verbosity > 0 ) + fprintf(bcftools_stderr,"Warning: the GFF has inconsistent phase column in transcript %s, skipping. CDS pos=%d: phase!=len%%3 (phase=%d, len=%d)\n", + args->tscript_ids.str[tr->id],tr->cds[i]->beg+1,phase,len); + tscript_ok = 0; + break; + } + error("Error: GFF3 assumption failed for transcript %s, CDS=%d: phase!=len%%3 (phase=%d, len=%d). Use the --force option to proceed anyway (at your own risk).\n", + args->tscript_ids.str[tr->id],tr->cds[i]->beg+1,phase,len); + } + len += tr->cds[i]->len; + } + if ( !tscript_ok ) continue; // skip this transcript + } + else + { + if ( tr->cds[tr->ncds-1]->phase != CDS_PHASE_UNKN ) + { + // Check that the phase is not bigger than CDS length. Curiously, this can really happen, + // see Mus_musculus.GRCm38.85.gff3.gz, transcript:ENSMUST00000163141 + // todo: the same for the fwd strand + i = tr->ncds - 1; + int phase = tr->cds[i]->phase; + if ( phase ) tr->trim |= TRIM_5PRIME; + while ( i>=0 && phase > tr->cds[i]->len ) + { + phase -= tr->cds[i]->len; + tr->cds[i]->phase = 0; + tr->cds[i]->len = 0; + i--; + } + tr->cds[i]->len -= tr->cds[i]->phase; + tr->cds[i]->phase = 0; + } + + // sanity check phase + int tscript_ok = 1; + for (i=tr->ncds-1; i>=0; i--) + { + if ( tr->cds[i]->phase == CDS_PHASE_UNKN ) + { + warn_phase_unkn = 1; + len += tr->cds[i]->len; + continue; + } + int phase = tr->cds[i]->phase ? 3 - tr->cds[i]->phase : 0; + if ( phase!=len%3) + { + if ( args->force ) + { + if ( args->verbosity > 0 ) + fprintf(bcftools_stderr,"Warning: the GFF has inconsistent phase column in transcript %s, skipping. CDS pos=%d: phase!=len%%3 (phase=%d, len=%d)\n", + args->tscript_ids.str[tr->id],tr->cds[i]->beg+1,phase,len); + tscript_ok = 0; + break; + } + error("Error: GFF3 assumption failed for transcript %s, CDS=%d: phase!=len%%3 (phase=%d, len=%d). Use the --force option to proceed anyway (at your own risk).\n", + args->tscript_ids.str[tr->id],tr->cds[i]->beg+1,phase,len); + } + len += tr->cds[i]->len; + } + if ( !tscript_ok ) continue; // skip this transcript + } + + // set len. At the same check that CDS within a transcript do not overlap + len = 0; + for (i=0; incds; i++) + { + tr->cds[i]->icds = i; + len += tr->cds[i]->len; + if ( !i ) continue; + + gf_cds_t *a = tr->cds[i-1]; + gf_cds_t *b = tr->cds[i]; + if ( a->beg + a->len - 1 >= b->beg ) + { + if ( args->force ) + { + fprintf(bcftools_stderr,"Warning: GFF contains overlapping CDS %s: %"PRIu32"-%"PRIu32" and %"PRIu32"-%"PRIu32".\n", + args->tscript_ids.str[tr->id], a->beg+1,a->beg+a->len, b->beg+1,b->beg+b->len); + } + else + error("Error: CDS overlap in the transcript %s: %"PRIu32"-%"PRIu32" and %"PRIu32"-%"PRIu32", is this intended (e.g. ribosomal slippage)?\n" + " Use the --force option to override (at your own risk).\n", + args->tscript_ids.str[tr->id], a->beg+1,a->beg+a->len, b->beg+1,b->beg+b->len); + } + } + if ( len%3 != 0 ) + { + // There are 13k transcripts with incomplete 3' CDS. See for example ENST00000524289 + // http://sep2015.archive.ensembl.org/Homo_sapiens/Transcript/Sequence_cDNA?db=core;g=ENSG00000155868;r=5:157138846-157159019;t=ENST00000524289 + // Also, the incomplete CDS can be too short (1 or 2bp), so it is not enough to trim the last one. + + tr->trim |= TRIM_3PRIME; + if ( tr->strand==STRAND_FWD ) + { + i = tr->ncds - 1; + while ( i>=0 && len%3 ) + { + int dlen = tr->cds[i]->len >= len%3 ? len%3 : tr->cds[i]->len; + tr->cds[i]->len -= dlen; + len -= dlen; + i--; + } + } + else + { + i = 0; + while ( incds && len%3 ) + { + int dlen = tr->cds[i]->len >= len%3 ? len%3 : tr->cds[i]->len; + tr->cds[i]->len -= dlen; + tr->cds[i]->beg += dlen; + len -= dlen; + i++; + } + } + } + + // set CDS offsets and insert into regidx + len=0; + for (i=0; incds; i++) + { + tr->cds[i]->pos = len; + len += tr->cds[i]->len; + regidx_push(args->idx_cds, chr_beg,chr_end, tr->cds[i]->beg,tr->cds[i]->beg+tr->cds[i]->len-1, &tr->cds[i]); + } + } + if ( warn_phase_unkn && args->verbosity > 0 ) + fprintf(bcftools_stderr,"Warning: encountered CDS with phase column unset, could not verify reading frame\n"); +} + +void regidx_free_gf(void *payload) { free(*((gf_cds_t**)payload)); } +void regidx_free_tscript(void *payload) { tscript_t *tr = *((tscript_t**)payload); free(tr->cds); free(tr); } + +void init_gff(args_t *args) +{ + aux_t *aux = &args->init; + aux->seq2int = khash_str2int_init(); // chrom's numeric id + aux->gid2gene = kh_init(int2gene); // gene id to gf_gene_t, for idx_gene + aux->id2tr = kh_init(int2tscript); // transcript id to tscript_t + args->idx_tscript = regidx_init(NULL, NULL, regidx_free_tscript, sizeof(tscript_t*), NULL); + aux->ignored_biotypes = khash_str2int_init(); + gff_id_init(&aux->gene_ids); + gff_id_init(&args->tscript_ids); + + // parse gff + kstring_t str = {0,0,0}; + htsFile *fp = hts_open(args->gff_fname,"r"); + if ( !fp ) error("Failed to read %s\n", args->gff_fname); + while ( hts_getline(fp, KS_SEP_LINE, &str) > 0 ) + { + hts_expand(ftr_t, aux->nftr+1, aux->mftr, aux->ftr); + int ret = gff_parse(args, str.s, aux->ftr + aux->nftr); + if ( !ret ) aux->nftr++; + } + free(str.s); + if ( hts_close(fp)!=0 ) error("Close failed: %s\n", args->gff_fname); + + + // process gff information: connect CDS and exons to transcripts + args->idx_cds = regidx_init(NULL, NULL, regidx_free_gf, sizeof(gf_cds_t*), NULL); + args->idx_utr = regidx_init(NULL, NULL, regidx_free_gf, sizeof(gf_utr_t*), NULL); + args->idx_exon = regidx_init(NULL, NULL, regidx_free_gf, sizeof(gf_exon_t*), NULL); + args->itr = regitr_init(NULL); + + int i; + for (i=0; inftr; i++) + { + ftr_t *ftr = &aux->ftr[i]; + + // check whether to keep this feature: is there a mapping trid -> gene_id -> gene? + khint_t k = kh_get(int2tscript, aux->id2tr, (int)ftr->trid); + if ( k==kh_end(aux->id2tr) ) continue; // no such transcript + + tscript_t *tr = kh_val(aux->id2tr,k); + if ( !tr->gene->name ) + { + // not a supported biotype (e.g. gene:pseudogene, transcript:processed_transcript) + regidx_free_tscript(&tr); + kh_del(int2tscript, aux->id2tr,k); + continue; + } + + // populate regidx by category: + // ftr->type .. GF_CDS, GF_EXON, GF_UTR3, GF_UTR5 + // gene->type .. GF_PROTEIN_CODING, GF_MT_rRNA, GF_IG_C, ... + if ( ftr->type==GF_CDS ) register_cds(args, ftr); + else if ( ftr->type==GF_EXON ) register_exon(args, ftr); + else if ( ftr->type==GF_UTR5 ) register_utr(args, ftr); + else if ( ftr->type==GF_UTR3 ) register_utr(args, ftr); + else + error("something: %s\t%d\t%d\t%s\t%s\n", aux->seq[ftr->iseq],ftr->beg+1,ftr->end+1,args->tscript_ids.str[ftr->trid],gf_type2gff_string(ftr->type)); + } + tscript_init_cds(args); + + if ( args->verbosity > 0 ) + { + fprintf(bcftools_stderr,"Indexed %d transcripts, %d exons, %d CDSs, %d UTRs\n", + regidx_nregs(args->idx_tscript), + regidx_nregs(args->idx_exon), + regidx_nregs(args->idx_cds), + regidx_nregs(args->idx_utr)); + } + + free(aux->ftr); + khash_str2int_destroy_free(aux->seq2int); + // keeping only to destroy the genes at the end: kh_destroy(int2gene,aux->gid2gene); + kh_destroy(int2tscript,aux->id2tr); + free(aux->seq); + gff_id_destroy(&aux->gene_ids); + + if ( args->verbosity > 0 && khash_str2int_size(aux->ignored_biotypes) ) + { + khash_t(str2int) *ign = (khash_t(str2int)*)aux->ignored_biotypes; + fprintf(bcftools_stderr,"Ignored the following biotypes:\n"); + for (i = kh_begin(ign); i < kh_end(ign); i++) + { + if ( !kh_exist(ign,i)) continue; + const char *biotype = kh_key(ign,i); + if ( !strcmp(biotype,"TCE") ) biotype = "TCE (\"To be Experimentally Confirmed\")"; + fprintf(bcftools_stderr,"\t%dx\t.. %s\n", kh_value(ign,i), biotype); + } + } + khash_str2int_destroy_free(aux->ignored_biotypes); +} + +static inline int ncsq2_to_nfmt(int ncsq2) +{ + return 1 + (ncsq2 - 1) / 30; +} +static inline void icsq2_to_bit(int icsq2, int *ival, int *ibit) +{ + *ival = icsq2 / 30; + *ibit = icsq2 % 30; +} + +void init_data(args_t *args) +{ + args->nfmt_bcsq = ncsq2_to_nfmt(args->ncsq2_max); + + args->fai = fai_load(args->fa_fname); + if ( !args->fai ) error("Failed to load the fai index: %s\n", args->fa_fname); + + if ( args->verbosity > 0 ) fprintf(bcftools_stderr,"Parsing %s ...\n", args->gff_fname); + init_gff(args); + + args->rid = -1; + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + + args->pos2vbuf = kh_init(pos2vbuf); + args->active_tr = khp_init(trhp); + args->hap = (hap_t*) calloc(1,sizeof(hap_t)); + + // init samples + if ( !bcf_hdr_nsamples(args->hdr) ) args->phase = PHASE_DROP_GT; + if ( args->sample_list && !strcmp("-",args->sample_list) ) + { + // ignore all samples + if ( args->output_type==FT_TAB_TEXT ) + { + // significant speedup for plain VCFs + if (bcf_hdr_set_samples(args->hdr,NULL,0) < 0) + error_errno("[%s] Couldn't build sample filter", __func__); + } + args->phase = PHASE_DROP_GT; + } + else + args->smpl = smpl_ilist_init(args->hdr, args->sample_list, args->sample_is_file, SMPL_STRICT); + args->hdr_nsmpl = args->phase==PHASE_DROP_GT ? 0 : bcf_hdr_nsamples(args->hdr); + + if ( args->output_type==FT_TAB_TEXT ) + { + args->out = args->output_fname ? fopen(args->output_fname,"w") : bcftools_stdout; + if ( !args->out ) error("Failed to write to %s: %s\n", !strcmp("-",args->output_fname)?"standard output":args->output_fname,strerror(errno)); + + fprintf(args->out,"# This file was produced by: bcftools +csq(%s+htslib-%s)\n", bcftools_version(),hts_version()); + fprintf(args->out,"# The command line was:\tbcftools +%s", args->argv[0]); + int i; + for (i=1; iargc; i++) + fprintf(args->out," %s",args->argv[i]); + fprintf(args->out,"\n"); + fprintf(args->out,"# LOG\t[2]Message\n"); + fprintf(args->out,"# CSQ"); i = 1; + fprintf(args->out,"\t[%d]Sample", ++i); + fprintf(args->out,"\t[%d]Haplotype", ++i); + fprintf(args->out,"\t[%d]Chromosome", ++i); + fprintf(args->out,"\t[%d]Position", ++i); + fprintf(args->out,"\t[%d]Consequence", ++i); + fprintf(args->out,"\n"); + } + else + { + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("[%s] Error: cannot write to %s: %s\n", __func__,args->output_fname? args->output_fname : "standard output", strerror(errno)); + if ( args->n_threads > 0) + hts_set_opt(args->out_fh, HTS_OPT_THREAD_POOL, args->sr->p); + if ( args->record_cmd_line ) bcf_hdr_append_version(args->hdr,args->argc,args->argv,"bcftools/csq"); + bcf_hdr_printf(args->hdr,"##INFO=",args->bcsq_tag, args->local_csq ? "Local" : "Haplotype-aware"); + if ( args->hdr_nsmpl ) + bcf_hdr_printf(args->hdr,"##FORMAT=",args->bcsq_tag); + if ( bcf_hdr_write(args->out_fh, args->hdr)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname?args->output_fname:"standard output"); + } + if ( args->verbosity > 0 ) fprintf(bcftools_stderr,"Calling...\n"); +} + +void destroy_data(args_t *args) +{ + if ( args->ncsq2_small_warned ) + fprintf(bcftools_stderr, + "Note: Some samples had too many consequences to be represented in %d bytes. If you need to record them all,\n" + " the limit can be increased by running with `--ncsq %d`.\n",ncsq2_to_nfmt(args->ncsq2_max)/8,1+args->ncsq2_small_warned/2); + + regidx_destroy(args->idx_cds); + regidx_destroy(args->idx_utr); + regidx_destroy(args->idx_exon); + regidx_destroy(args->idx_tscript); + regitr_destroy(args->itr); + + khint_t k,i,j; + for (k=0; kinit.gid2gene); k++) + { + if ( !kh_exist(args->init.gid2gene, k) ) continue; + gf_gene_t *gene = (gf_gene_t*) kh_val(args->init.gid2gene, k); + free(gene->name); + free(gene); + } + kh_destroy(int2gene,args->init.gid2gene); + + if ( args->filter ) + filter_destroy(args->filter); + + khp_destroy(trhp,args->active_tr); + kh_destroy(pos2vbuf,args->pos2vbuf); + if ( args->smpl ) smpl_ilist_destroy(args->smpl); + int ret; + if ( args->out_fh ) + ret = hts_close(args->out_fh); + else + ret = fclose(args->out); + if ( ret ) error("Error: close failed .. %s\n", args->output_fname?args->output_fname:"bcftools_stdout"); + for (i=0; ivcf_rbuf.m; i++) + { + vbuf_t *vbuf = args->vcf_buf[i]; + if ( !vbuf ) continue; + for (j=0; jm; j++) + { + if ( !vbuf->vrec[j] ) continue; + if ( vbuf->vrec[j]->line ) bcf_destroy(vbuf->vrec[j]->line); + free(vbuf->vrec[j]->fmt_bm); + free(vbuf->vrec[j]->vcsq); + free(vbuf->vrec[j]); + } + free(vbuf->vrec); + free(vbuf); + } + free(args->vcf_buf); + free(args->rm_tr); + free(args->csq_buf); + free(args->hap->stack); + free(args->hap->sseq.s); + free(args->hap->tseq.s); + free(args->hap->tref.s); + free(args->hap); + fai_destroy(args->fai); + free(args->gt_arr); + free(args->str.s); + free(args->str2.s); + gff_id_destroy(&args->tscript_ids); +} + +/* + The splice_* functions are for consquences around splice sites: start,stop,splice_* + */ +#define SPLICE_VAR_REF 0 // ref: ACGT>ACGT, csq not applicable, skip completely +#define SPLICE_OUTSIDE 1 // splice acceptor or similar; csq set and is done, does not overlap the region +#define SPLICE_INSIDE 2 // overlaps coding region; csq can be set but coding prediction is needed +#define SPLICE_OVERLAP 3 // indel overlaps region boundary, csq set but could not determine csq +typedef struct +{ + tscript_t *tr; + struct { + int32_t pos, rlen, alen, ial; + char *ref, *alt; + bcf1_t *rec; + } vcf; + uint16_t check_acceptor:1, // check distance from exon start (fwd) or end (rev) + check_start:1, // this is the first coding exon (relative to transcript orientation), check first (fwd) or last (rev) codon + check_stop:1, // this is the last coding exon (relative to transcript orientation), check last (fwd) or first (rev) codon + check_donor:1, // as with check_acceptor + check_region_beg:1, // do/don't check for splices at this end, eg. in the first or last exon + check_region_end:1, // + check_utr:1, // check splice sites (acceptor/donor/region_*) only if not in utr + set_refalt:1; // set kref,kalt, if set, check also for synonymous events + uint32_t csq; + int tbeg, tend; // number of trimmed bases from beg and end of ref,alt allele + uint32_t ref_beg, // ref coordinates with spurious bases removed, ACC>AC can become AC>A or CC>C, whichever gives + ref_end; // a more conservative csq (the first and last base in kref.s) + kstring_t kref, kalt; // trimmed alleles, set only with SPLICE_OLAP +} +splice_t; +void splice_init(splice_t *splice, bcf1_t *rec) +{ + memset(splice,0,sizeof(*splice)); + splice->vcf.rec = rec; + splice->vcf.pos = rec->pos; + splice->vcf.rlen = rec->rlen; + splice->vcf.ref = rec->d.allele[0]; + splice->csq = 0; +} +static inline void splice_build_hap(splice_t *splice, uint32_t beg, int len) +{ + // len>0 .. beg is the first base, del filled from right + // len<0 .. beg is the last base, del filled from left + + int rlen, alen, rbeg, abeg; // first base to include (ref coordinates) + if ( len<0 ) + { + rlen = alen = -len; + rbeg = beg - rlen + 1; + int dlen = splice->vcf.alen - splice->vcf.rlen; + if ( dlen<0 && beg < splice->ref_end ) // incomplete del, beg is in the middle + dlen += splice->ref_end - beg; + abeg = rbeg + dlen; + } + else + { + rbeg = abeg = beg; + rlen = alen = len; + // check for incomplete del as above?? + } + +#define XDBG 0 +#if XDBG +fprintf(bcftools_stderr,"build_hap: rbeg=%d + %d abeg=%d \n",rbeg,rlen,abeg); +#endif + splice->kref.l = 0; + splice->kalt.l = 0; + + // add the part before vcf.ref, in the vcf.ref and after vcf.ref + int roff; // how many vcf.ref bases already used + if ( rbeg < splice->vcf.pos ) + { + assert( splice->tr->beg <= rbeg ); // this can be extended thanks to N_REF_PAD + kputsn(splice->tr->ref + N_REF_PAD + rbeg - splice->tr->beg, splice->vcf.pos - rbeg, &splice->kref); + roff = 0; + } + else + roff = rbeg - splice->vcf.pos; +#if XDBG +fprintf(bcftools_stderr,"r1: %s roff=%d\n",splice->kref.s,roff); +#endif + + if ( roff < splice->vcf.rlen && splice->kref.l < rlen ) + { + int len = splice->vcf.rlen - roff; // len still available in vcf.ref + if ( len > rlen - splice->kref.l ) len = rlen - splice->kref.l; // how much of ref allele is still needed + kputsn(splice->vcf.ref + roff, len, &splice->kref); + } +#if XDBG +fprintf(bcftools_stderr,"r2: %s\n",splice->kref.s); +#endif + + uint32_t end = splice->vcf.pos + splice->vcf.rlen; // position just after the ref allele + if ( splice->kref.l < rlen ) + { + if ( end + rlen - splice->kref.l - 1 > splice->tr->end ) // trim, the requested sequence is too long (could be extended, see N_REF_PAD) + rlen -= end + rlen - splice->kref.l - 1 - splice->tr->end; + if ( splice->kref.l < rlen ) + kputsn(splice->tr->ref + N_REF_PAD + end - splice->tr->beg, rlen - splice->kref.l, &splice->kref); + } +#if XDBG +fprintf(bcftools_stderr,"r3: %s\n",splice->kref.s); +#endif + + + int aoff; + if ( abeg < splice->vcf.pos ) + { + assert( splice->tr->beg <= abeg ); + kputsn(splice->tr->ref + N_REF_PAD + abeg - splice->tr->beg, splice->vcf.pos - abeg, &splice->kalt); + aoff = 0; + } + else + aoff = abeg - splice->vcf.pos; +#if XDBG +fprintf(bcftools_stderr,"a1: %s aoff=%d\n",splice->kalt.s,aoff); +#endif + + if ( aoff < splice->vcf.alen && splice->kalt.l < alen ) + { + int len = splice->vcf.alen - aoff; // len still available in vcf.alt + if ( len > alen - splice->kalt.l ) len = alen - splice->kalt.l; // how much of alt allele is still needed + kputsn(splice->vcf.alt + aoff, len, &splice->kalt); + aoff -= len; + } + if ( aoff < 0 ) aoff = 0; + else aoff--; +#if XDBG +fprintf(bcftools_stderr,"a2: %s aoff=%d\n",splice->kalt.s,aoff); +#endif + + end = splice->vcf.pos + splice->vcf.rlen; // position just after the ref allele + if ( splice->kalt.l < alen ) + { + if ( end + alen + aoff - splice->kalt.l - 1 > splice->tr->end ) // trim, the requested sequence is too long + alen -= end + alen + aoff - splice->kalt.l - 1 - splice->tr->end; + if ( alen > 0 && alen > splice->kalt.l ) + kputsn(splice->tr->ref + aoff + N_REF_PAD + end - splice->tr->beg, alen - splice->kalt.l, &splice->kalt); + } +#if XDBG +fprintf(bcftools_stderr,"a3: %s\n",splice->kalt.s); +fprintf(bcftools_stderr," [%s]\n [%s]\n\n",splice->kref.s,splice->kalt.s); +#endif +} +void csq_stage(args_t *args, csq_t *csq, bcf1_t *rec); +static inline int csq_stage_utr(args_t *args, regitr_t *itr, bcf1_t *rec, uint32_t trid, uint32_t type, int ial) +{ + while ( regitr_overlap(itr) ) + { + gf_utr_t *utr = regitr_payload(itr, gf_utr_t*); + tscript_t *tr = utr->tr; + if ( tr->id != trid ) continue; + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.type = (utr->which==prime5 ? CSQ_UTR5 : CSQ_UTR3) | type; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = ial; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + return csq.type.type; + } + return 0; +} +static inline void csq_stage_splice(args_t *args, bcf1_t *rec, tscript_t *tr, uint32_t type, int ial) +{ +#if XDBG +fprintf(bcftools_stderr,"csq_stage_splice %d: type=%d\n",rec->pos+1,type); +#endif + if ( !type ) return; + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.type = type; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = ial; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); +} +static inline int splice_csq_ins(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + // coordinates that matter for consequences, eg AC>ACG trimmed to C>CG, 1bp + // before and after the inserted bases + if ( splice->tbeg || splice->vcf.ref[0]!=splice->vcf.alt[0] ) + { + splice->ref_beg = splice->vcf.pos + splice->tbeg - 1; + splice->ref_end = splice->vcf.pos + splice->vcf.rlen - splice->tend; + } + else + { + if ( splice->tend ) splice->tend--; + splice->ref_beg = splice->vcf.pos; + splice->ref_end = splice->vcf.pos + splice->vcf.rlen - splice->tend; + } +#if XDBG +fprintf(bcftools_stderr,"ins: %s>%s .. ex=%d,%d beg,end=%d,%d tbeg,tend=%d,%d check_utr=%d start,stop,beg,end=%d,%d,%d,%d\n", splice->vcf.ref,splice->vcf.alt,ex_beg,ex_end,splice->ref_beg,splice->ref_end,splice->tbeg,splice->tend,splice->check_utr,splice->check_start,splice->check_stop,splice->check_region_beg,splice->check_region_end); +#endif + + int ret; + if ( splice->ref_beg >= ex_end ) // fully outside, beyond the exon + { + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,splice->ref_beg+1,splice->ref_beg+1, itr) ) // adjacent utr + { + ret = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + if ( ret!=0 ) + { + regitr_destroy(itr); + return SPLICE_OUTSIDE; // overlaps utr + } + } + regitr_destroy(itr); + } + if ( !splice->check_region_end ) return SPLICE_OUTSIDE; + char *ref = NULL, *alt = NULL; + if ( splice->set_refalt ) // seq identity is checked only when tr->ref is available + { + splice_build_hap(splice, ex_end+1, N_SPLICE_REGION_INTRON); + ref = splice->kref.s, alt = splice->kalt.s; + } + if ( splice->ref_beg < ex_end + N_SPLICE_REGION_INTRON && splice->ref_end > ex_end + N_SPLICE_DONOR ) + { + splice->csq |= CSQ_SPLICE_REGION; + if ( ref && !strncmp(ref,alt,N_SPLICE_REGION_INTRON) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + if ( splice->ref_beg < ex_end + N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + if ( ref && !strncmp(ref,alt,N_SPLICE_DONOR) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_OUTSIDE; + } + if ( splice->ref_end < ex_beg || (splice->ref_end == ex_beg && !splice->check_region_beg) ) // fully outside, before the exon + { + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,splice->ref_end-1,splice->ref_end-1, itr) ) // adjacent utr + { + ret = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + if ( ret!=0 ) + { + regitr_destroy(itr); + return SPLICE_OUTSIDE; // overlaps utr + } + } + regitr_destroy(itr); + } + if ( !splice->check_region_beg ) return SPLICE_OUTSIDE; + char *ref = NULL, *alt = NULL; + if ( splice->set_refalt ) // seq identity is checked only when tr->ref is available + { + splice_build_hap(splice, ex_beg - N_SPLICE_REGION_INTRON, N_SPLICE_REGION_INTRON); + ref = splice->kref.s, alt = splice->kalt.s; + } + if ( splice->ref_end > ex_beg - N_SPLICE_REGION_INTRON && splice->ref_beg < ex_beg - N_SPLICE_DONOR ) + { + splice->csq |= CSQ_SPLICE_REGION; + if ( ref && !strncmp(ref,alt,N_SPLICE_REGION_INTRON) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + if ( splice->ref_end > ex_beg - N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + if ( ref && !strncmp(ref+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,alt+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,N_SPLICE_DONOR) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_OUTSIDE; + } + // overlaps the exon or inside the exon + // possible todo: find better alignment for frameshifting variants? + if ( splice->ref_beg <= ex_beg + 2 ) // in the first 3bp + { + if ( splice->check_region_beg ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_FWD ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->ref_end > ex_end - 2 ) + { + if ( splice->check_region_end ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_REV ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->set_refalt ) + { + // Make sure the variant will not end up left aligned to avoid overlapping vcf records + // splice_build_hap(splice, splice->ref_beg, splice->vcf.alen - splice->tend - splice->tbeg + 1); + // splice->vcf.rlen -= splice->tbeg + splice->tend - 1; + // if ( splice->kref.l > splice->vcf.rlen ) { splice->kref.l = splice->vcf.rlen; splice->kref.s[splice->kref.l] = 0; } + if ( splice->ref_beg < splice->vcf.pos ) // this must have been caused by too much trimming from right + { + int dlen = splice->vcf.pos - splice->ref_beg; + assert( dlen==1 ); + splice->tbeg += dlen; + if ( splice->tbeg + splice->tend == splice->vcf.rlen ) splice->tend -= dlen; + splice->ref_beg = splice->vcf.pos; + } + if ( splice->ref_end==ex_beg ) splice->tend--; // prevent zero-length ref allele + splice_build_hap(splice, splice->ref_beg, splice->vcf.alen - splice->tend - splice->tbeg + 1); + splice->vcf.rlen -= splice->tbeg + splice->tend - 1; + if ( splice->kref.l > splice->vcf.rlen ) { splice->kref.l = splice->vcf.rlen; splice->kref.s[splice->kref.l] = 0; } + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_INSIDE; +} + +int shifted_del_synonymous(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + static int small_ref_padding_warned = 0; + tscript_t *tr = splice->tr; + + // We know the VCF record overlaps the exon, but does it overlap the start codon? + if ( tr->strand==STRAND_REV && splice->vcf.pos + splice->vcf.rlen + 2 <= ex_end ) return 0; + if ( tr->strand==STRAND_FWD && splice->vcf.pos >= ex_beg + 3 ) return 0; + +#if XDBG + fprintf(bcftools_stderr,"shifted_del_synonymous: %d-%d %s\n",ex_beg,ex_end, tr->strand==STRAND_FWD?"fwd":"rev"); + fprintf(bcftools_stderr," %d .. %s > %s\n",splice->vcf.pos+1,splice->vcf.ref,splice->vcf.alt); +#endif + + // is there enough ref sequence for the extension? All coordinates are 0-based + int ref_len = strlen(splice->vcf.ref); + int alt_len = strlen(splice->vcf.alt); + assert( ref_len > alt_len ); + int ndel = ref_len - alt_len; + + if ( tr->strand==STRAND_REV ) + { + int32_t vcf_ref_end = splice->vcf.pos + ref_len - 1; // end pos of the VCF REF allele + int32_t tr_ref_end = splice->tr->end + N_REF_PAD; // the end pos of accessible cached ref seq + if ( vcf_ref_end + ndel > tr_ref_end ) + { + if ( !small_ref_padding_warned ) + { + fprintf(bcftools_stderr,"Warning: Could not verify synonymous start/stop at %s:%d due to small N_REF_PAD. (Improve me?)\n",bcf_seqname(args->hdr,splice->vcf.rec),splice->vcf.pos+1); + small_ref_padding_warned = 1; + } + return 0; + } + + char *ptr_vcf = splice->vcf.ref + alt_len; // the first deleted base in the VCF REF allele + char *ptr_ref = splice->tr->ref + N_REF_PAD + (vcf_ref_end + 1 - splice->tr->beg); // the first ref base after the ndel bases deleted +#if XDBG + fprintf(bcftools_stderr,"vcf: %s\nref: %s\n",ptr_vcf,ptr_ref); +#endif + int i = 0; + while ( ptr_vcf[i] && ptr_vcf[i]==ptr_ref[i] ) i++; + if ( ptr_vcf[i] ) return 0; // the deleted sequence cannot be replaced + } + else + { + // STRAND_FWD + int32_t vcf_block_beg = splice->vcf.pos + ref_len - 2*ndel; // the position of the first base of the ref block that could potentially replace the deletion + if ( vcf_block_beg < 0 ) return 0; + +#if XDBG + fprintf(bcftools_stderr,"vcf_block_beg: %d\n",vcf_block_beg+1); +#endif + + if ( N_REF_PAD + vcf_block_beg < ex_beg ) + { + if ( !small_ref_padding_warned ) + { + fprintf(bcftools_stderr,"Warning: Could not verify synonymous start/stop at %s:%d due to small N_REF_PAD. (Improve me?)\n",bcf_seqname(args->hdr,splice->vcf.rec),splice->vcf.pos+1); + small_ref_padding_warned = 1; + } + return 0; + } + + char *ptr_vcf = splice->vcf.ref + alt_len; // the first deleted base in the VCF REF allele + char *ptr_ref = splice->tr->ref + N_REF_PAD + vcf_block_beg - splice->tr->beg; // the replacement ref block +#if XDBG + fprintf(bcftools_stderr,"vcf: %s\nref: %s\n",ptr_vcf,ptr_ref); +#endif + + int i = 0; + while ( ptr_vcf[i] && ptr_vcf[i]==ptr_ref[i] ) i++; + if ( ptr_vcf[i] ) return 0; // the deleted sequence cannot be replaced + } + + return 1; +} + +static inline int splice_csq_del(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + if ( splice->check_start ) + { + // check for synonymous start + // test/csq/ENST00000375992/incorrect-synon-del-not-start-lost.txt + // test/csq/ENST00000368801.2/start-lost.txt + // test/csq/ENST00000318249.2/synonymous-start-lost.txt + int is_synonymous = shifted_del_synonymous(args, splice, ex_beg, ex_end); + if ( is_synonymous ) + { + splice->csq |= CSQ_START_RETAINED; + return SPLICE_OVERLAP; + } + } + + // coordinates that matter for consequences, eg AC>ACG trimmed to C>CG + splice->ref_beg = splice->vcf.pos + splice->tbeg - 1; // 1b before the deleted base + splice->ref_end = splice->vcf.pos + splice->vcf.rlen - splice->tend - 1; // the last deleted base + +#if XDBG +fprintf(bcftools_stderr,"splice_csq_del: %s>%s .. ex=%d,%d beg,end=%d,%d tbeg,tend=%d,%d check_utr=%d start,stop,beg,end=%d,%d,%d,%d\n", splice->vcf.ref,splice->vcf.alt,ex_beg,ex_end,splice->ref_beg,splice->ref_end,splice->tbeg,splice->tend,splice->check_utr,splice->check_start,splice->check_stop,splice->check_region_beg,splice->check_region_end); +#endif + + if ( splice->ref_beg + 1 < ex_beg ) // the part before the exon; ref_beg is off by -1 + { + if ( splice->check_region_beg ) + { + int csq = 0; + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,splice->ref_beg,ex_beg-1, itr) ) // adjacent utr + csq = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + regitr_destroy(itr); + } + if ( !csq ) + { + char *ref = NULL, *alt = NULL; + if ( splice->set_refalt ) // seq identity is checked only when tr->ref is available + { + // filling from the left does not work for ENST00000341065/frame3.vcf + // CAG.GTGGCCAG CAG.GTGGCCAG + // CA-.--GGCCAG vs CAG.---GCCAG + // splice_build_hap(splice, ex_beg-1, -N_SPLICE_REGION_INTRON); + // + // filling from the right: + splice_build_hap(splice, ex_beg - N_SPLICE_REGION_INTRON, N_SPLICE_REGION_INTRON); + ref = splice->kref.s, alt = splice->kalt.s; + } + if ( splice->ref_end >= ex_beg - N_SPLICE_REGION_INTRON && splice->ref_beg < ex_beg - N_SPLICE_DONOR ) + { + splice->csq |= CSQ_SPLICE_REGION; + if ( ref && alt && !strncmp(ref,alt,N_SPLICE_REGION_INTRON) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + if ( splice->ref_end >= ex_beg - N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + if ( ref && alt && !strncmp(ref+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,alt+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,N_SPLICE_DONOR) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + } + } + if ( splice->ref_end >= ex_beg ) + { + splice->tbeg = splice->ref_beg - splice->vcf.pos + 1; + splice->ref_beg = ex_beg - 1; + if ( splice->tbeg + splice->tend == splice->vcf.alen ) + { + // the deletion overlaps ex_beg and cannot be easily realigned to the right + if ( !splice->tend ) + { + splice->csq |= CSQ_CODING_SEQUENCE; + return SPLICE_OVERLAP; + } + splice->tend--; + } + } + } + if ( ex_end < splice->ref_end ) // the part after the exon + { + if ( splice->check_region_end ) + { + int csq = 0; + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,ex_end+1,splice->ref_end, itr) ) // adjacent utr + csq = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + regitr_destroy(itr); + } + if ( !csq ) + { + char *ref = NULL, *alt = NULL; + if ( splice->set_refalt ) // seq identity is checked only when tr->ref is available + { + splice_build_hap(splice, ex_end+1, N_SPLICE_REGION_INTRON); // ref,alt positioned at the first intron base + ref = splice->kref.s, alt = splice->kalt.s; + } + if ( splice->ref_beg < ex_end + N_SPLICE_REGION_INTRON && splice->ref_end > ex_end + N_SPLICE_DONOR ) + { + splice->csq |= CSQ_SPLICE_REGION; + if ( ref && alt && !strncmp(ref,alt,N_SPLICE_REGION_INTRON) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + if ( splice->ref_beg < ex_end + N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + if ( ref && alt && !strncmp(ref+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,alt+N_SPLICE_REGION_INTRON-N_SPLICE_DONOR,N_SPLICE_DONOR) ) splice->csq |= CSQ_SYNONYMOUS_VARIANT; + } + } + } + if ( splice->ref_beg < ex_end ) + { + splice->tend = splice->vcf.rlen - (splice->ref_end - splice->vcf.pos + 1); + splice->ref_end = ex_end; + } + } + if ( splice->ref_end < ex_beg || splice->ref_beg >= ex_end ) + { + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_OUTSIDE; + } + if ( splice->ref_beg < ex_beg + 2 ) // ref_beg is off by -1 + { + if ( splice->check_region_beg ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_FWD ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->ref_end > ex_end - 3 ) + { + if ( splice->check_region_end ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_REV ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->set_refalt ) + { + if ( splice->tbeg>0 ) splice->tbeg--; //why is this? + if ( splice->vcf.rlen > splice->tbeg + splice->tend && splice->vcf.alen > splice->tbeg + splice->tend ) + { + splice->vcf.rlen -= splice->tbeg + splice->tend; + splice->vcf.alen -= splice->tbeg + splice->tend; + } + splice->kref.l = 0; kputsn(splice->vcf.ref + splice->tbeg, splice->vcf.rlen, &splice->kref); + splice->kalt.l = 0; kputsn(splice->vcf.alt + splice->tbeg, splice->vcf.alen, &splice->kalt); + if ( (splice->ref_beg+1 < ex_beg && splice->ref_end >= ex_beg) || (splice->ref_beg+1 < ex_end && splice->ref_end >= ex_end) ) // ouch, ugly ENST00000409523/long-overlapping-del.vcf + { + splice->csq |= (splice->ref_end - splice->ref_beg)%3 ? CSQ_FRAMESHIFT_VARIANT : CSQ_INFRAME_DELETION; + return SPLICE_OVERLAP; + } + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_INSIDE; +} + +static inline int splice_csq_mnp(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + // not a real variant, can be ignored: eg ACGT>ACGT + if ( splice->tbeg + splice->tend == splice->vcf.rlen ) return SPLICE_VAR_REF; + + splice->ref_beg = splice->vcf.pos + splice->tbeg; + splice->ref_end = splice->vcf.pos + splice->vcf.rlen - splice->tend - 1; + +#if XDBG +fprintf(bcftools_stderr,"mnp: %s>%s .. ex=%d,%d beg,end=%d,%d tbeg,tend=%d,%d check_utr=%d start,stop,beg,end=%d,%d,%d,%d\n", splice->vcf.ref,splice->vcf.alt,ex_beg,ex_end,splice->ref_beg,splice->ref_end,splice->tbeg,splice->tend,splice->check_utr,splice->check_start,splice->check_stop,splice->check_region_beg,splice->check_region_end); +#endif + + if ( splice->ref_beg < ex_beg ) // the part before the exon + { + if ( splice->check_region_beg ) + { + int csq = 0; + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,splice->ref_beg,ex_beg-1, itr) ) // adjacent utr + csq = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + regitr_destroy(itr); + } + if ( !csq ) + { + if ( splice->ref_end >= ex_beg - N_SPLICE_REGION_INTRON && splice->ref_beg < ex_beg - N_SPLICE_DONOR ) + splice->csq |= CSQ_SPLICE_REGION; + if ( splice->ref_end >= ex_beg - N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + } + } + } + if ( splice->ref_end >= ex_beg ) + { + splice->tbeg = splice->ref_beg - splice->vcf.pos; + splice->ref_beg = ex_beg; + } + } + if ( ex_end < splice->ref_end ) // the part after the exon + { + if ( splice->check_region_end ) + { + int csq = 0; + if ( splice->check_utr ) + { + regitr_t *itr = regitr_init(NULL); + const char *chr = bcf_seqname(args->hdr,splice->vcf.rec); + if ( regidx_overlap(args->idx_utr,chr,ex_end+1,splice->ref_end, itr) ) // adjacent utr + csq = csq_stage_utr(args, itr, splice->vcf.rec, splice->tr->id, splice->csq, splice->vcf.ial); + regitr_destroy(itr); + } + if ( !csq ) + { + if ( splice->ref_beg <= ex_end + N_SPLICE_REGION_INTRON && splice->ref_end > ex_end + N_SPLICE_DONOR ) + splice->csq |= CSQ_SPLICE_REGION; + if ( splice->ref_beg <= ex_end + N_SPLICE_DONOR ) + { + if ( splice->check_donor && splice->tr->strand==STRAND_FWD ) splice->csq |= CSQ_SPLICE_DONOR; + if ( splice->check_acceptor && splice->tr->strand==STRAND_REV ) splice->csq |= CSQ_SPLICE_ACCEPTOR; + } + } + } + if ( splice->ref_beg <= ex_end ) + { + splice->tend = splice->vcf.rlen - (splice->ref_end - splice->vcf.pos + 1); + splice->ref_end = ex_end; + } + } + if ( splice->ref_end < ex_beg || splice->ref_beg > ex_end ) + { + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_OUTSIDE; + } + + if ( splice->ref_beg < ex_beg + 3 ) + { + if ( splice->check_region_beg ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_FWD ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->ref_end > ex_end - 3 ) + { + if ( splice->check_region_end ) splice->csq |= CSQ_SPLICE_REGION; + if ( splice->tr->strand==STRAND_REV ) { if ( splice->check_start ) splice->csq |= CSQ_START_LOST; } + else { if ( splice->check_stop ) splice->csq |= CSQ_STOP_LOST; } + } + if ( splice->set_refalt ) + { + splice->vcf.rlen -= splice->tbeg + splice->tend; + splice->kref.l = 0; kputsn(splice->vcf.ref + splice->tbeg, splice->vcf.rlen, &splice->kref); + splice->kalt.l = 0; kputsn(splice->vcf.alt + splice->tbeg, splice->vcf.rlen, &splice->kalt); + } + csq_stage_splice(args, splice->vcf.rec, splice->tr, splice->csq, splice->vcf.ial); + return SPLICE_INSIDE; +} +static inline int splice_csq(args_t *args, splice_t *splice, uint32_t ex_beg, uint32_t ex_end) +{ + splice->vcf.alen = strlen(splice->vcf.alt); + + int rlen1 = splice->vcf.rlen - 1, alen1 = splice->vcf.alen - 1, i = 0; + splice->tbeg = 0, splice->tend = 0; + + // trim from the right, then from the left + while ( i<=rlen1 && i<=alen1 ) + { + if ( splice->vcf.ref[rlen1-i] != splice->vcf.alt[alen1-i] ) break; + i++; + } + splice->tend = i; + rlen1 -= i, alen1 -= i, i = 0; + while ( i<=rlen1 && i<=alen1 ) + { + if ( splice->vcf.ref[i] != splice->vcf.alt[i] ) break; + i++; + } + splice->tbeg = i; + + // The mnp, ins and del code was split into near-identical functions for clarity and debugging; + // possible todo: generalize once stable + if ( splice->vcf.rlen==splice->vcf.alen ) return splice_csq_mnp(args, splice, ex_beg, ex_end); + if ( splice->vcf.rlen < splice->vcf.alen ) return splice_csq_ins(args, splice, ex_beg, ex_end); + if ( splice->vcf.rlen > splice->vcf.alen ) return splice_csq_del(args, splice, ex_beg, ex_end); + + return 0; +} + + +// return value: 0 added, 1 overlapping variant, 2 silent discard (intronic,alt=ref) +int hap_init(args_t *args, hap_node_t *parent, hap_node_t *child, gf_cds_t *cds, bcf1_t *rec, int ial) +{ + int i; + kstring_t str = {0,0,0}; + tscript_t *tr = cds->tr; + child->icds = cds->icds; // index of cds in the tscript's list of exons + child->vcf_ial = ial; + + splice_t splice; + splice_init(&splice, rec); + splice.tr = tr; + splice.vcf.ial = ial; + splice.vcf.alt = rec->d.allele[ial]; + splice.check_acceptor = splice.check_donor = splice.set_refalt = splice.check_utr = 1; + if ( !(tr->trim & TRIM_5PRIME) ) + { + if ( tr->strand==STRAND_FWD ) { if ( child->icds==0 ) splice.check_start = 1; } + else { if ( child->icds==tr->ncds-1 ) splice.check_start = 1; } + } + if ( !(tr->trim & TRIM_3PRIME) ) + { + if ( tr->strand==STRAND_FWD ) { if ( child->icds==tr->ncds-1 ) splice.check_stop = 1; } + else { if ( child->icds==0 ) splice.check_stop = 1; } + } + if ( splice.check_start ) // do not check starts in incomplete CDS, defined as not starting with M + { + if ( tr->strand==STRAND_FWD ) { if ( dna2aa(tr->ref+N_REF_PAD+cds->beg-tr->beg) != 'M' ) splice.check_start = 0; } + else { if ( cdna2aa(tr->ref+N_REF_PAD+cds->beg-tr->beg+cds->len-3) != 'M' ) splice.check_start = 0; } + } + if ( child->icds!=0 ) splice.check_region_beg = 1; + if ( child->icds!=tr->ncds-1 ) splice.check_region_end = 1; + +#if XDBG +fprintf(bcftools_stderr,"\nhap_init: %d [%s][%s] check start:%d,stop:%d\n",splice.vcf.pos+1,splice.vcf.ref,splice.vcf.alt,splice.check_start,splice.check_stop); +#endif + int ret = splice_csq(args, &splice, cds->beg, cds->beg + cds->len - 1); +#if XDBG +fprintf(bcftools_stderr,"cds splice_csq: %d [%s][%s] .. beg,end=%d %d, ret=%d, csq=%d\n\n",splice.vcf.pos+1,splice.kref.s,splice.kalt.s,splice.ref_beg+1,splice.ref_end+1,ret,splice.csq); +#endif + + if ( ret==SPLICE_VAR_REF ) return 2; // not a variant, eg REF=CA ALT=CA + if ( ret==SPLICE_OUTSIDE || ret==SPLICE_OVERLAP || splice.csq==CSQ_START_LOST ) // not a coding csq + { + free(splice.kref.s); + free(splice.kalt.s); + + if ( !splice.csq ) return 2; // fully intronic, no csq + + // splice_region/acceptor/donor + child->seq = NULL; + child->sbeg = 0; + child->rbeg = rec->pos; + child->rlen = 0; + child->dlen = 0; + kputs(rec->d.allele[0],&str); + kputc('>',&str); + kputs(rec->d.allele[ial],&str); + child->var = str.s; + child->type = HAP_SSS; + child->csq = splice.csq; + child->rec = rec; + return 0; + } + if ( splice.csq & CSQ_SYNONYMOUS_VARIANT ) splice.csq &= ~CSQ_SYNONYMOUS_VARIANT; // synonymous&splice,frame could become synonymous&frame,splice + + int dbeg = 0; + if ( splice.ref_beg < cds->beg ) + { + // The vcf record overlaps the exon boundary, but the variant itself + // should fit inside since we are here. This will need more work. + // #1475227917 + dbeg = cds->beg - splice.ref_beg; + splice.kref.l -= dbeg; + splice.ref_beg = cds->beg; + assert( dbeg <= splice.kalt.l ); + } + + assert( parent->type!=HAP_SSS ); + if ( parent->type==HAP_CDS ) + { + i = parent->icds; + if ( i!=cds->icds ) + { + // the variant is on a new exon, finish up the previous + int len = tr->cds[i]->len - parent->rbeg - parent->rlen + tr->cds[i]->beg; + if ( len > 0 ) + kputsn_(tr->ref + N_REF_PAD + parent->rbeg + parent->rlen - tr->beg, len, &str); + } + + // append any skipped non-variant exons + while ( ++i < cds->icds ) + kputsn_(tr->ref + N_REF_PAD + tr->cds[i]->beg - tr->beg, tr->cds[i]->len, &str); + + if ( parent->icds==child->icds ) + { + int len = splice.ref_beg - parent->rbeg - parent->rlen; + if ( len < 0 ) // overlapping variants + { + free(str.s); + free(splice.kref.s); + free(splice.kalt.s); + return 1; + } + kputsn_(tr->ref + N_REF_PAD + parent->rbeg + parent->rlen - tr->beg, len, &str); + } + else + kputsn_(tr->ref + N_REF_PAD + cds->beg - tr->beg, splice.ref_beg - cds->beg, &str); + } + kputs(splice.kalt.s + dbeg, &str); + + child->seq = str.s; + child->sbeg = cds->pos + (splice.ref_beg - cds->beg); + child->rbeg = splice.ref_beg; + child->rlen = splice.kref.l; + child->type = HAP_CDS; + child->prev = parent; + child->rec = rec; + child->csq = splice.csq; + + // set vlen and the "ref>alt" string + { + int rlen = strlen(rec->d.allele[0]); + int alen = strlen(rec->d.allele[ial]); + child->dlen = alen - rlen; + child->var = (char*) malloc(rlen+alen+2); + memcpy(child->var,rec->d.allele[0],rlen); + child->var[rlen] = '>'; + memcpy(child->var+rlen+1,rec->d.allele[ial],alen); + child->var[rlen+alen+1] = 0; + } + + // yuck, the whole CDS is modified/deleted, not ready for this, todo. + if ( child->rbeg + child->rlen > cds->beg + cds->len ) + { + child->type = HAP_SSS; + if ( !child->csq ) child->csq |= CSQ_CODING_SEQUENCE; // hack, specifically for ENST00000390520/deletion-overlap.vcf + } + + + free(splice.kref.s); + free(splice.kalt.s); + return 0; +} +void hap_destroy(hap_node_t *hap) +{ + int i; + for (i=0; inchild; i++) + if ( hap->child[i] ) hap_destroy(hap->child[i]); + for (i=0; imcsq_list; i++) free(hap->csq_list[i].type.vstr.s); + free(hap->csq_list); + free(hap->child); + free(hap->cur_child); + free(hap->seq); + free(hap->var); + free(hap); +} + + +/* + ref: spliced reference and its length (ref.l) + seq: part of the spliced query transcript on the reference strand to translate, its + length (seq.l) and the total length of the complete transcript (seq.m) + sbeg: seq offset within the spliced query transcript + rbeg: seq offset within ref, 0-based + rend: last base of seq within ref, plus one. If seq does not contain indels, it is rend=rbeg+seq->l + strand: coding strand - 0:rev, 1:fwd + tseq: translated sequence (aa) + fill: frameshift, fill until the end (strand=fwd) or from the start (strand=rev) + */ +void cds_translate(kstring_t *_ref, kstring_t *_seq, uint32_t sbeg, uint32_t rbeg, uint32_t rend, int strand, kstring_t *tseq, int fill) +{ +#if XDBG +fprintf(bcftools_stderr,"\ntranslate: %d %d %d fill=%d seq.l=%d\n",sbeg,rbeg,rend,fill,(int)_seq->l); +#endif + char tmp[3], *codon, *end; + int i, len, npad; + + kstring_t ref = *_ref; + kstring_t seq = *_seq; + + tseq->l = 0; + if ( !seq.l ) + { + kputc('?', tseq); + return; + } + +#define DBG 0 +#if DBG + fprintf(bcftools_stderr,"translate: sbeg,rbeg,rend=%d %d %d fill=%d seq.l=%d\n",sbeg,rbeg,rend,fill,(int)_seq->l); + fprintf(bcftools_stderr," ref: l=%d %s\n", (int)ref.l,ref.s); + fprintf(bcftools_stderr," seq: l=%d m=%d ", (int)seq.l,(int)seq.m); + for (i=0; i1 + fprintf(bcftools_stderr," npad: %d\n",npad); +#endif + assert( npad<=rbeg ); + + for (i=0; i1 + fprintf(bcftools_stderr,"\t i=%d\n", i); +#endif + if ( i==3 ) + { + kputc_(dna2aa(tmp), tseq); +#if DBG>1 + fprintf(bcftools_stderr,"[1]%c%c%c\n",tmp[0],tmp[1],tmp[2]); +#endif + codon = seq.s + 3 - npad; // next codon + end = codon + len - 1 - (len % 3); // last position of a valid codon + while ( codon < end ) + { + kputc_(dna2aa(codon), tseq); +#if DBG>1 + fprintf(bcftools_stderr,"[2]%c%c%c\n",codon[0],codon[1],codon[2]); +#endif + codon += 3; + } + end = seq.s + seq.l - 1; + for (i=0; codon+i<=end; i++) tmp[i] = codon[i]; + } + + // right padding + codon = ref.s + rend + N_REF_PAD; + if ( i>0 ) + { +#if DBG>1 + if(i==1)fprintf(bcftools_stderr,"[3]%c\n",tmp[0]); + if(i==2)fprintf(bcftools_stderr,"[3]%c%c\n",tmp[0],tmp[1]); +#endif + for (; i<3; i++) + { + tmp[i] = *codon; + codon++; + } + kputc_(dna2aa(tmp), tseq); +#if DBG>1 + fprintf(bcftools_stderr,"[4]%c%c%c\n",tmp[0],tmp[1],tmp[2]); +#endif + } + if ( fill!=0 ) + { + end = ref.s + ref.l - N_REF_PAD; + while ( codon+3 <= end ) + { + kputc_(dna2aa(codon), tseq); +#if DBG>1 + fprintf(bcftools_stderr,"[5]%c%c%c\t%c\n",codon[0],codon[1],codon[2],dna2aa(codon)); +#endif + codon += 3; + } + } + } + else // STRAND_REV + { + // right padding - number of bases to take from ref + npad = (seq.m - (sbeg + seq.l)) % 3; +#if DBG>1 + fprintf(bcftools_stderr," npad: %d\n",npad); +#endif + if ( !(npad>=0 && sbeg+seq.l+npad<=seq.m) ) fprintf(bcftools_stderr,"sbeg=%d seq.l=%d seq.m=%d npad=%d\n",sbeg,(int)seq.l,(int)seq.m,npad); + assert( npad>=0 && sbeg+seq.l+npad<=seq.m ); // todo: first codon on the rev strand + + if ( npad==2 ) + { + tmp[1] = ref.s[rend+N_REF_PAD]; + tmp[2] = ref.s[rend+N_REF_PAD+1]; + i = 0; + } + else if ( npad==1 ) + { + tmp[2] = ref.s[rend+N_REF_PAD]; + i = 1; + } + else + i = 2; + + end = seq.s + seq.l; + for (; i>=0 && end>seq.s; i--) tmp[i] = *(--end); +#if DBG>1 + fprintf(bcftools_stderr,"\t i=%d\n", i); + if(i==1)fprintf(bcftools_stderr,"[0] %c\n",tmp[2]); + if(i==0)fprintf(bcftools_stderr,"[0] %c%c\n",tmp[1],tmp[2]); +#endif + if ( i==-1 ) + { +#if DBG>1 + fprintf(bcftools_stderr,"[1]%c%c%c\t%c\n",tmp[0],tmp[1],tmp[2], cdna2aa(tmp)); +#endif + kputc_(cdna2aa(tmp), tseq); + codon = end - 3; + while ( codon >= seq.s ) + { + kputc_(cdna2aa(codon), tseq); +#if DBG>1 + fprintf(bcftools_stderr,"[2]%c%c%c\t%c\n",codon[0],codon[1],codon[2], cdna2aa(codon)); +#endif + codon -= 3; + } + if ( seq.s-codon==2 ) + { + tmp[2] = seq.s[0]; + i = 1; + } + else if ( seq.s-codon==1 ) + { + tmp[1] = seq.s[0]; + tmp[2] = seq.s[1]; + i = 0; + } + else + i = -1; +#if DBG>1 + if(i==1)fprintf(bcftools_stderr,"[3] %c\n",tmp[2]); + if(i==0)fprintf(bcftools_stderr,"[3] %c%c\n",tmp[1],tmp[2]); +#endif + } + // left padding + end = ref.s + N_REF_PAD + rbeg; + if ( i>=0 ) + { + for (; i>=0 && end>=ref.s; i--) tmp[i] = *(--end); + kputc_(cdna2aa(tmp), tseq); +#if DBG>1 + fprintf(bcftools_stderr,"[4]%c%c%c\t%c\n",tmp[0],tmp[1],tmp[2],cdna2aa(tmp)); +#endif + } + if ( fill!=0 ) + { + codon = end - 3; + while ( codon >= ref.s + N_REF_PAD ) + { + kputc_(cdna2aa(codon), tseq); +#if DBG>1 + fprintf(bcftools_stderr,"[5]%c%c%c\t%c\n",codon[0],codon[1],codon[2],cdna2aa(codon)); +#endif + codon -= 3; + } + } + } + kputc_(0,tseq); tseq->l--; +#if DBG + fprintf(bcftools_stderr," tseq: %s\n", tseq->s); +#endif +} + +void tscript_splice_ref(tscript_t *tr) +{ + int i, len = 0; + for (i=0; incds; i++) + len += tr->cds[i]->len; + + tr->nsref = len + 2*N_REF_PAD; + tr->sref = (char*) malloc(len + 1 + 2*N_REF_PAD); + len = 0; + + memcpy(tr->sref, tr->ref + tr->cds[0]->beg - tr->beg, N_REF_PAD); + len += N_REF_PAD; + + for (i=0; incds; i++) + { + memcpy(tr->sref + len, tr->ref + N_REF_PAD + tr->cds[i]->beg - tr->beg, tr->cds[i]->len); + len += tr->cds[i]->len; + } + memcpy(tr->sref + len, tr->ref + N_REF_PAD + tr->cds[tr->ncds-1]->beg - tr->beg, N_REF_PAD); + len += N_REF_PAD; + + tr->sref[len] = 0; +} + +// returns: 0 if consequence was added, 1 if it already exists or could not be added +int csq_push(args_t *args, csq_t *csq, bcf1_t *rec) +{ +#if XDBG +fprintf(bcftools_stderr,"csq_push: %d .. %d\n",rec->pos+1,csq->type.type); +#endif + khint_t k = kh_get(pos2vbuf, args->pos2vbuf, (int)csq->pos); + vbuf_t *vbuf = (k == kh_end(args->pos2vbuf)) ? NULL : kh_val(args->pos2vbuf, k); + if ( !vbuf ) error("This should not happen. %s:%d %s\n",bcf_seqname(args->hdr,rec),csq->pos+1,csq->type.vstr.s); + + int i; + for (i=0; in; i++) + if ( vbuf->vrec[i]->line==rec ) break; + if ( i==vbuf->n ) error("This should not happen.. %s:%d %s\n", bcf_seqname(args->hdr,rec),csq->pos+1,csq->type.vstr.s); + vrec_t *vrec = vbuf->vrec[i]; + + // if the variant overlaps donor/acceptor and also splice region, report only donor/acceptor + if ( csq->type.type & CSQ_SPLICE_REGION && csq->type.type & (CSQ_SPLICE_DONOR|CSQ_SPLICE_ACCEPTOR) ) + csq->type.type &= ~CSQ_SPLICE_REGION; + + if ( csq->type.type & CSQ_PRINTED_UPSTREAM ) + { + for (i=0; invcsq; i++) + { + // Same as below, to avoid records like + // 3630 .. @3632,stop_lost|AL627309.1|ENST00000423372|protein_coding|- + // 3632 .. stop_lost|AL627309.1|ENST00000423372|protein_coding|-|260*>260G|3630T>A+3632A>C + if ( csq->type.type&CSQ_START_STOP && vrec->vcsq[i].type&CSQ_START_STOP ) + { + vrec->vcsq[i] = csq->type; + goto exit_duplicate; + } + if ( !(vrec->vcsq[i].type & CSQ_PRINTED_UPSTREAM) ) continue; + if ( csq->type.ref != vrec->vcsq[i].ref ) continue; + goto exit_duplicate; + } + } + else if ( csq->type.type & CSQ_COMPOUND ) + { + for (i=0; invcsq; i++) + { + if ( csq->type.trid != vrec->vcsq[i].trid && (csq->type.type|vrec->vcsq[i].type)&CSQ_PRN_TSCRIPT ) continue; + if ( csq->type.biotype != vrec->vcsq[i].biotype ) continue; + if ( csq->type.gene != vrec->vcsq[i].gene ) continue; + if ( csq->type.vcf_ial != vrec->vcsq[i].vcf_ial ) continue; + if ( (csq->type.type&CSQ_UPSTREAM_STOP)^(vrec->vcsq[i].type&CSQ_UPSTREAM_STOP) ) continue; // both must or mustn't have upstream_stop + if ( csq->type.vstr.s || vrec->vcsq[i].vstr.s ) + { + // This is a bit hacky, but we want a simpler and more predictable output. The splice_csq() function + // can trigger stop/start events based on indel overlap, then another stop/start event can be triggered + // from add_csq() or test_cds_local() based on sequence comparison, and on output we could find two + // consequences: + // stop_lost|AL627309.1|ENST00000423372|protein_coding|- + // stop_lost&inframe_insertion|AL627309.1|ENST00000423372|protein_coding|-|260*>260CL|3630T>TAAA + if ( !csq->type.vstr.s || !vrec->vcsq[i].vstr.s ) + { + if ( csq->type.type&CSQ_START_STOP && vrec->vcsq[i].type&CSQ_START_STOP ) + { + vrec->vcsq[i].type |= csq->type.type; + + // remove stop_lost&synonymous if stop_retained set + if ( vrec->vcsq[i].type&CSQ_STOP_RETAINED ) + vrec->vcsq[i].type &= ~(CSQ_STOP_LOST|CSQ_SYNONYMOUS_VARIANT); + + if ( !vrec->vcsq[i].vstr.s ) vrec->vcsq[i].vstr = csq->type.vstr; + goto exit_duplicate; + } + continue; + } + if ( strcmp(csq->type.vstr.s,vrec->vcsq[i].vstr.s) ) continue; + } + vrec->vcsq[i].type |= csq->type.type; + goto exit_duplicate; + } + } + else + { + for (i=0; invcsq; i++) + { + if ( csq->type.trid != vrec->vcsq[i].trid && (csq->type.type|vrec->vcsq[i].type)&CSQ_PRN_TSCRIPT) continue; + if ( csq->type.biotype != vrec->vcsq[i].biotype ) continue; + if ( !(vrec->vcsq[i].type & CSQ_COMPOUND) ) + { + vrec->vcsq[i].type |= csq->type.type; + goto exit_duplicate; + } + if ( vrec->vcsq[i].type==(vrec->vcsq[i].type|csq->type.type) ) goto exit_duplicate; + } + } + // no such csq yet in this vcf record + csq->vrec = vrec; + csq->idx = vrec->nvcsq++; + hts_expand0(vcsq_t, vrec->nvcsq, vrec->mvcsq, vrec->vcsq); + vrec->vcsq[i] = csq->type; + return 0; + +exit_duplicate: + csq->vrec = vrec; + csq->idx = i; + return 1; +} + +// soff .. position of the variant within the trimmed query transcript +// sbeg .. position of the variant within the query transcript +// rbeg .. position on the reference transcript (if there are no indels, then rbeg=send) +// rpos .. VCF position +#define node2soff(i) (hap->stack[i].slen - (hap->stack[i].node->rlen + hap->stack[i].node->dlen)) +#define node2sbeg(i) (hap->sbeg + node2soff(i)) +#define node2send(i) (hap->sbeg + hap->stack[i].slen) +#define node2rbeg(i) (hap->stack[i].node->sbeg) +#define node2rend(i) (hap->stack[i].node->sbeg + hap->stack[i].node->rlen) +#define node2rpos(i) (hap->stack[i].node->rec->pos) + +void kput_vcsq(args_t *args, vcsq_t *csq, kstring_t *str) +{ + // Remove start/stop from incomplete CDS, but only if there is another + // consequence as something must be reported + if ( csq->type & CSQ_INCOMPLETE_CDS && (csq->type & ~(CSQ_START_STOP|CSQ_INCOMPLETE_CDS|CSQ_UPSTREAM_STOP)) ) csq->type &= ~(CSQ_START_STOP|CSQ_INCOMPLETE_CDS); + + // Remove missense from start/stops + if ( csq->type & CSQ_START_STOP && csq->type & CSQ_MISSENSE_VARIANT ) csq->type &= ~CSQ_MISSENSE_VARIANT; + + if ( csq->type & CSQ_PRINTED_UPSTREAM && csq->ref ) + { + kputc_('@',str); + kputw(csq->ref->pos+1, str); + return; + } + if ( csq->type & CSQ_UPSTREAM_STOP ) + kputc_('*',str); + + int i, n = sizeof(csq_strings)/sizeof(char*); + for (i=1; itype&(1<type&(1<gene ) kputs(csq->gene , str); + + kputc_('|', str); + if ( csq->type & CSQ_PRN_TSCRIPT ) kputs(args->tscript_ids.str[csq->trid], str); + + kputc_('|', str); + kputs(gf_type2gff_string(csq->biotype), str); + + if ( CSQ_PRN_STRAND(csq->type) || csq->vstr.l ) + kputs(csq->strand==STRAND_FWD ? "|+" : "|-", str); + + if ( csq->vstr.l ) + kputs(csq->vstr.s, str); +} + +void kprint_aa_prediction(args_t *args, int beg, kstring_t *aa, kstring_t *str) +{ + if ( !args->brief_predictions || (int)aa->l - args->brief_predictions < 3 ) + kputs(aa->s, str); + else + { + int i, len = aa->l; + if ( aa->s[len-1]=='*' ) len--; + for (i=0; ibrief_predictions; i++) kputc(aa->s[i], str); + kputs("..", str); + kputw(beg+len, str); + } +} + +void hap_add_csq(args_t *args, hap_t *hap, hap_node_t *node, int tlen, int ibeg, int iend, int dlen, int indel) +{ + int i; + tscript_t *tr = hap->tr; + int ref_node = tr->strand==STRAND_FWD ? ibeg : iend; + int icsq = node->ncsq_list++; + hts_expand0(csq_t,node->ncsq_list,node->mcsq_list,node->csq_list); + csq_t *csq = &node->csq_list[icsq]; + csq->pos = hap->stack[ref_node].node->rec->pos; + csq->type.trid = tr->id; + csq->type.vcf_ial = node->vcf_ial; + csq->type.gene = tr->gene->name; + csq->type.strand = tr->strand; + csq->type.biotype = tr->type; + + // only now we see the translated sequence and can determine if the stop/start changes are real + int rm_csq = 0; + csq->type.type = 0; + for (i=ibeg; i<=iend; i++) + csq->type.type |= hap->stack[i].node->csq & CSQ_COMPOUND; + if ( dlen==0 && indel ) csq->type.type |= CSQ_INFRAME_ALTERING; + + int has_upstream_stop = hap->upstream_stop; + if ( hap->stack[ibeg].node->type != HAP_SSS ) + { + // check for truncating stops + for (i=0; itref.l; i++) + if ( hap->tref.s[i]=='*' ) break; + if ( i!=hap->tref.l ) + { + hap->tref.l = i+1; + hap->tref.s[i+1] = 0; + } + for (i=0; itseq.l; i++) + if ( hap->tseq.s[i]=='*' ) break; + if ( i!=hap->tseq.l ) + { + hap->tseq.l = i+1; + hap->tseq.s[i+1] = 0; + hap->upstream_stop = 1; + } + if ( csq->type.type & CSQ_STOP_LOST ) + { + if ( hap->tref.s[hap->tref.l-1]=='*' && hap->tref.s[hap->tref.l-1] == hap->tseq.s[hap->tseq.l-1] ) + { + rm_csq |= CSQ_STOP_LOST; + csq->type.type |= CSQ_STOP_RETAINED; + } + else if ( hap->tref.s[hap->tref.l-1]!='*' ) + { + // This is CDS 3' incomplete ENSG00000173376/synon.vcf, can also be missense + // We observe in real data a change to a stop, ENST00000528237/retained-stop-incomplete-cds.vcf + if ( hap->tseq.s[hap->tseq.l-1] == '*' ) + { + rm_csq |= CSQ_STOP_GAINED; + csq->type.type |= CSQ_STOP_RETAINED; + } + else + csq->type.type |= CSQ_INCOMPLETE_CDS; + } + } + if ( csq->type.type & CSQ_START_LOST && hap->tref.s[0]!='M' ) + { + rm_csq |= CSQ_START_LOST; + csq->type.type &= ~CSQ_START_LOST; + } + if ( dlen!=0 ) + { + if ( dlen%3 ) + csq->type.type |= CSQ_FRAMESHIFT_VARIANT; + else if ( dlen<0 ) + csq->type.type |= CSQ_INFRAME_DELETION; + else + csq->type.type |= CSQ_INFRAME_INSERTION; + if ( hap->tref.s[hap->tref.l-1]!='*' && hap->tseq.s[hap->tseq.l-1]=='*' ) + csq->type.type |= CSQ_STOP_GAINED; + } + else + { + for (i=0; itref.l; i++) + if ( hap->tref.s[i] != hap->tseq.s[i] ) break; + if ( i==hap->tref.l ) + csq->type.type |= CSQ_SYNONYMOUS_VARIANT; + else if ( hap->tref.s[i] == '*' ) + csq->type.type |= CSQ_STOP_LOST; + else if ( hap->tseq.s[i] == '*' ) + csq->type.type |= CSQ_STOP_GAINED; + else + csq->type.type |= CSQ_MISSENSE_VARIANT; + } + } + // Check if compound inframe variants are real inframes, or if the stop codon occurs before the frameshift can be restored + if ( ibeg!=iend && (csq->type.type & (CSQ_INFRAME_DELETION|CSQ_INFRAME_INSERTION|CSQ_INFRAME_ALTERING)) && hap->tseq.s[hap->tseq.l-1]=='*' ) + { + rm_csq |= CSQ_INFRAME_DELETION | CSQ_INFRAME_INSERTION | CSQ_INFRAME_ALTERING; + csq->type.type |= CSQ_FRAMESHIFT_VARIANT | CSQ_STOP_GAINED; + } + if ( has_upstream_stop ) csq->type.type |= CSQ_UPSTREAM_STOP; + csq->type.type &= ~rm_csq; + + if ( hap->stack[ibeg].node->type == HAP_SSS ) + { + node->csq_list[icsq].type.type |= hap->stack[ibeg].node->csq & ~rm_csq; + node->csq_list[icsq].type.ref = hap->stack[ibeg].node->rec; + node->csq_list[icsq].type.biotype = tr->type; + csq_push(args, node->csq_list+icsq, hap->stack[ibeg].node->rec); + return; + } + + kstring_t str = node->csq_list[icsq].type.vstr; + str.l = 0; + + // create the aa variant string + int aa_rbeg = tr->strand==STRAND_FWD ? node2rbeg(ibeg)/3+1 : (hap->tr->nsref - 2*N_REF_PAD - node2rend(iend))/3+1; + int aa_sbeg = tr->strand==STRAND_FWD ? node2sbeg(ibeg)/3+1 : (tlen - node2send(iend))/3+1; + kputc_('|', &str); + kputw(aa_rbeg, &str); + kprint_aa_prediction(args,aa_rbeg,&hap->tref,&str); + if ( !(csq->type.type & CSQ_SYNONYMOUS_VARIANT) ) + { + kputc_('>', &str); + kputw(aa_sbeg, &str); + kprint_aa_prediction(args,aa_sbeg,&hap->tseq,&str); + } + kputc_('|', &str); + + // create the dna variant string and, in case of combined variants, + // insert silent CSQ_PRINTED_UPSTREAM variants + for (i=ibeg; i<=iend; i++) + { + if ( i>ibeg ) kputc_('+', &str); + kputw(node2rpos(i)+1, &str); + kputs(hap->stack[i].node->var, &str); + } + node->csq_list[icsq].type.vstr = str; + csq_push(args, node->csq_list+icsq, hap->stack[ref_node].node->rec); + + for (i=ibeg; i<=iend; i++) + { + // csq are printed at one position only for combined variants, the rest is + // silent and references the first + if ( hap->stack[i].node->csq & ~CSQ_COMPOUND ) + { + node->ncsq_list++; + hts_expand0(csq_t,node->ncsq_list,node->mcsq_list,node->csq_list); + csq_t *tmp_csq = &node->csq_list[node->ncsq_list - 1]; + tmp_csq->pos = hap->stack[i].node->rec->pos; + tmp_csq->type.trid = tr->id; + //??tmp_csq->type.vcf_ial = node->vcf_ial; .. this should not be needed for non-compound variants + tmp_csq->type.gene = tr->gene->name; + tmp_csq->type.strand = tr->strand; + tmp_csq->type.type = hap->stack[i].node->csq & ~CSQ_COMPOUND & ~rm_csq; + tmp_csq->type.biotype = tr->type; + tmp_csq->type.vstr.l = 0; + kputs(str.s,&tmp_csq->type.vstr); + csq_push(args, tmp_csq, hap->stack[i].node->rec); + } + if ( i!=ref_node && (node->csq_list[icsq].type.type & CSQ_COMPOUND || !(hap->stack[i].node->csq & ~CSQ_COMPOUND)) ) + { + node->ncsq_list++; + hts_expand0(csq_t,node->ncsq_list,node->mcsq_list,node->csq_list); + csq_t *tmp_csq = &node->csq_list[node->ncsq_list - 1]; + tmp_csq->pos = hap->stack[i].node->rec->pos; + tmp_csq->type.trid = tr->id; + //??tmp_csq->type.vcf_ial = node->vcf_ial; .. this should not be needed for non-compound variants + tmp_csq->type.gene = tr->gene->name; + tmp_csq->type.strand = tr->strand; + tmp_csq->type.type = CSQ_PRINTED_UPSTREAM | hap->stack[i].node->csq; + tmp_csq->type.biotype = tr->type; + tmp_csq->type.ref = hap->stack[ref_node].node->rec; + tmp_csq->type.vstr.l = 0; + csq_push(args, tmp_csq, hap->stack[i].node->rec); + } + } +} + + +void hap_finalize(args_t *args, hap_t *hap) +{ + tscript_t *tr = hap->tr; + if ( !tr->sref ) + tscript_splice_ref(tr); + + kstring_t sref; + sref.s = tr->sref; + sref.l = tr->nsref; + sref.m = sref.l; + + int istack = 0; + hts_expand(hstack_t,1,hap->mstack,hap->stack); + + hap->sseq.l = 0; + hap->tseq.l = 0; + hap->stack[0].node = tr->root; + hap->stack[0].ichild = -1; + hap->stack[0].slen = 0; + hap->stack[0].dlen = 0; + + while ( istack>=0 ) + { + hstack_t *stack = &hap->stack[istack]; + hap_node_t *node = hap->stack[istack].node; + while ( ++hap->stack[istack].ichild < node->nchild ) + { + if ( node->child[stack->ichild] ) break; + } + if ( stack->ichild == node->nchild ) { istack--; continue; } + + node = node->child[stack->ichild]; + + istack++; + hts_expand(hstack_t,istack+1,hap->mstack,hap->stack); + stack = &hap->stack[istack-1]; + + hap->stack[istack].node = node; + hap->stack[istack].ichild = -1; + + hap->sseq.l = stack->slen; + if ( node->type==HAP_CDS ) kputs(node->seq, &hap->sseq); + hap->stack[istack].slen = hap->sseq.l; + hap->stack[istack].dlen = hap->stack[istack-1].dlen + node->dlen; + + if ( !node->nend ) continue; // not a leaf node + + // The spliced sequence has been built for the current haplotype and stored + // in hap->sseq. Now we break it and output as independent parts + + kstring_t sseq; + sseq.m = sref.m - 2*N_REF_PAD + hap->stack[istack].dlen; // total length of the spliced query transcript + hap->upstream_stop = 0; + + int i = 1, dlen = 0, ibeg, indel = 0; + hap->sbeg = hap->stack[i].node->sbeg; + assert( hap->stack[istack].node->type != HAP_SSS ); + if ( tr->strand==STRAND_FWD ) + { + i = 0, ibeg = -1; + while ( ++i <= istack ) + { + assert( hap->stack[i].node->type != HAP_SSS ); + + dlen += hap->stack[i].node->dlen; + if ( hap->stack[i].node->dlen ) indel = 1; + + // This condition extends compound variants. + if ( istack[i].node->dlen > 0 ) icur += hap->stack[i].node->dlen; + else if ( hap->stack[i].node->dlen < 0 ) icur++; + if ( icur/3 == inext/3 ) // in the same codon, can't be flushed yet + { + if ( ibeg==-1 ) ibeg = i; + continue; + } + } + if ( ibeg<0 ) ibeg = i; + + int ioff = node2soff(ibeg); + int icur = node2sbeg(ibeg); + int rbeg = node2rbeg(ibeg); + int rend = node2rend(i); + int fill = dlen%3; + + // alt + if ( hap->sseq.l ) + { + sseq.l = hap->stack[i].slen - ioff; + sseq.s = hap->sseq.s + ioff; + } + else // splice site overlap, see #1475227917 + sseq.l = fill = 0; + cds_translate(&sref, &sseq, icur,rbeg,rend, tr->strand, &hap->tseq, fill); + + // ref + sseq.l = node2rend(i) - rbeg; + sseq.s = sref.s + N_REF_PAD + rbeg; + sseq.m = sref.m - 2*N_REF_PAD; + cds_translate(&sref, &sseq, rbeg,rbeg,rend, tr->strand, &hap->tref, fill); + sseq.m = sref.m - 2*N_REF_PAD + hap->stack[istack].dlen; + + hap_add_csq(args,hap,node,0, ibeg,i,dlen,indel); + ibeg = -1; + dlen = 0; + indel = 0; + } + } + else + { + i = istack + 1, ibeg = -1; + while ( --i > 0 ) + { + assert ( hap->stack[i].node->type != HAP_SSS ); + dlen += hap->stack[i].node->dlen; + if ( hap->stack[i].node->dlen ) indel = 1; + if ( i>1 ) + { + if ( dlen%3 ) + { + if ( ibeg==-1 ) ibeg = i; + continue; + } + // the last base of the current variant vs the first base of the next + // variant: are they in the same codon? (reverse strand) + int icur = sseq.m - 1 - node2sbeg(i); + int inext = sseq.m - 1 - node2sbeg(i-1); + if ( hap->stack[i].node->dlen > 0 ) icur += hap->stack[i].node->dlen - 1; + else if ( hap->stack[i].node->dlen < 0 ) icur -= hap->stack[i].node->dlen; + if ( hap->stack[i-1].node->dlen > 0 ) inext -= hap->stack[i-1].node->dlen; + if ( icur/3 == inext/3 ) + { + if ( ibeg==-1 ) ibeg = i; + continue; + } + } + if ( ibeg<0 ) ibeg = i; + int ioff = node2soff(i); + int icur = node2sbeg(i); + int rbeg = node2rbeg(i); + int rend = node2rend(ibeg); + int fill = dlen%3; + + // alt + if ( hap->sseq.l ) + { + sseq.l = hap->stack[ibeg].slen - ioff; + sseq.s = hap->sseq.s + ioff; + } + else // splice site overlap, see #1475227917 + sseq.l = fill = 0; + cds_translate(&sref, &sseq, icur,rbeg,rend, tr->strand, &hap->tseq, fill); + + // ref + sseq.l = node2rend(ibeg) - rbeg; + sseq.s = sref.s + N_REF_PAD + rbeg; + sseq.m = sref.m - 2*N_REF_PAD; + cds_translate(&sref, &sseq, rbeg,rbeg,rend, tr->strand, &hap->tref, fill); + sseq.m = sref.m - 2*N_REF_PAD + hap->stack[istack].dlen; + + hap_add_csq(args,hap,node,sseq.m, i,ibeg,dlen,indel); + ibeg = -1; + dlen = 0; + indel = 0; + } + } + } +} + +static inline void csq_print_text(args_t *args, csq_t *csq, int ismpl, int ihap) +{ + if ( csq->type.type & CSQ_PRINTED_UPSTREAM ) return; + + char *smpl = ismpl >= 0 ? args->hdr->samples[ismpl] : "-"; + const char *chr = bcf_hdr_id2name(args->hdr,args->rid); + + fprintf(args->out,"CSQ\t%s\t", smpl); + if ( ihap>0 ) + fprintf(args->out,"%d", ihap); + else + fprintf(args->out,"-"); + + args->str.l = 0; + kput_vcsq(args, &csq->type, &args->str); + fprintf(args->out,"\t%s\t%d\t%s\n",chr,csq->pos+1,args->str.s); +} +static inline void hap_print_text(args_t *args, tscript_t *tr, int ismpl, int ihap, hap_node_t *node) +{ + if ( !node || !node->ncsq_list ) return; + + char *smpl = ismpl >= 0 ? args->hdr->samples[ismpl] : "-"; + const char *chr = bcf_hdr_id2name(args->hdr,args->rid); + + int i; + for (i=0; incsq_list; i++) + { + csq_t *csq = node->csq_list + i; + if ( csq->type.type & CSQ_PRINTED_UPSTREAM ) continue; + assert( csq->type.vstr.l ); + + fprintf(args->out,"CSQ\t%s\t", smpl); + if ( ihap>0 ) + fprintf(args->out,"%d", ihap); + else + fprintf(args->out,"-"); + + args->str.l = 0; + kput_vcsq(args, &csq->type, &args->str); + fprintf(args->out,"\t%s\t%d\t%s\n",chr,csq->pos+1,args->str.s); + } +} + +static inline void hap_stage_vcf(args_t *args, tscript_t *tr, int ismpl, int ihap, hap_node_t *node) +{ + if ( !node || !node->ncsq_list || ismpl<0 ) return; + + int i; + for (i=0; incsq_list; i++) + { + csq_t *csq = node->csq_list + i; + vrec_t *vrec = csq->vrec; + int icsq2 = 2*csq->idx + ihap; + if ( icsq2 >= args->ncsq2_max ) // more than ncsq2_max consequences, so can't fit it in FMT + { + if ( args->verbosity && (!args->ncsq2_small_warned || args->verbosity > 1) ) + { + fprintf(bcftools_stderr, + "Warning: Too many consequences for sample %s at %s:%"PRId64", keeping the first %d and skipping the rest.\n", + args->hdr->samples[ismpl],bcf_hdr_id2name(args->hdr,args->rid),(int64_t) vrec->line->pos+1,csq->idx); + if ( !args->ncsq2_small_warned ) + fprintf(bcftools_stderr," The limit can be increased by setting the --ncsq parameter. This warning is printed only once.\n"); + } + if ( args->ncsq2_small_warned < icsq2 ) args->ncsq2_small_warned = icsq2; + break; + } + int ival, ibit; + icsq2_to_bit(icsq2, &ival,&ibit); + if ( vrec->nfmt < 1 + ival ) vrec->nfmt = 1 + ival; + vrec->fmt_bm[ismpl*args->nfmt_bcsq + ival] |= 1 << ibit; + } +} + +void hap_flush(args_t *args, uint32_t pos) +{ + int i,j; + tr_heap_t *heap = args->active_tr; + while ( heap->ndat && heap->dat[0]->end<=pos ) + { + tscript_t *tr = heap->dat[0]; + khp_delete(trhp, heap); + args->hap->tr = tr; + if ( tr->root && tr->root->nchild ) // normal, non-localized calling + { + hap_finalize(args, args->hap); + + if ( args->output_type==FT_TAB_TEXT ) // plain text output, not a vcf + { + if ( args->phase==PHASE_DROP_GT ) + hap_print_text(args, tr, -1,0, tr->hap[0]); + else + { + for (i=0; ismpl->n; i++) + { + for (j=0; j<2; j++) + hap_print_text(args, tr, args->smpl->idx[i],j+1, tr->hap[i*2+j]); + } + } + } + else if ( args->phase!=PHASE_DROP_GT ) + { + for (i=0; ismpl->n; i++) + { + for (j=0; j<2; j++) + hap_stage_vcf(args, tr, args->smpl->idx[i],j, tr->hap[i*2+j]); + } + } + } + + // mark the transcript for deletion. Cannot delete it immediately because + // by-position VCF output will need them when flushed by vcf_buf_push + args->nrm_tr++; + hts_expand(tscript_t*,args->nrm_tr,args->mrm_tr,args->rm_tr); + args->rm_tr[args->nrm_tr-1] = tr; + } +} + +#define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } + +vbuf_t *vbuf_push(args_t *args, bcf1_t **rec_ptr) +{ + int i; + + assert(rec_ptr); + bcf1_t *rec = *rec_ptr; + + // check for duplicate records + i = args->vcf_rbuf.n ? rbuf_last(&args->vcf_rbuf) : -1; + if ( i<0 || args->vcf_buf[i]->vrec[0]->line->pos!=rec->pos ) + { + // vcf record with a new pos + rbuf_expand0(&args->vcf_rbuf, vbuf_t*, args->vcf_rbuf.n+1, args->vcf_buf); + i = rbuf_append(&args->vcf_rbuf); + if ( !args->vcf_buf[i] ) args->vcf_buf[i] = (vbuf_t*) calloc(1,sizeof(vbuf_t)); + args->vcf_buf[i]->n = 0; + args->vcf_buf[i]->keep_until = 0; + } + vbuf_t *vbuf = args->vcf_buf[i]; + vbuf->n++; + hts_expand0(vrec_t*, vbuf->n, vbuf->m, vbuf->vrec); + if ( !vbuf->vrec[vbuf->n - 1] ) + vbuf->vrec[vbuf->n - 1] = (vrec_t*) calloc(1,sizeof(vrec_t)); + + vrec_t *vrec = vbuf->vrec[vbuf->n - 1]; + if ( args->phase!=PHASE_DROP_GT && args->smpl->n ) + { + if ( !vrec->fmt_bm ) vrec->fmt_bm = (uint32_t*) calloc(args->hdr_nsmpl,sizeof(*vrec->fmt_bm) * args->nfmt_bcsq); + else memset(vrec->fmt_bm,0,args->hdr_nsmpl*sizeof(*vrec->fmt_bm) * args->nfmt_bcsq); + } + if ( !vrec->line ) vrec->line = bcf_init1(); + SWAP(bcf1_t*, (*rec_ptr), vrec->line); + + int ret; + khint_t k = kh_put(pos2vbuf, args->pos2vbuf, (int)rec->pos, &ret); + kh_val(args->pos2vbuf,k) = vbuf; + + return vbuf; +} + +void vbuf_flush(args_t *args, uint32_t pos) +{ + int i,j; + while ( args->vcf_rbuf.n ) + { + vbuf_t *vbuf; + if ( !args->local_csq && args->active_tr->ndat ) + { + // check if the first active transcript starts beyond the first buffered VCF record, + // cannot output buffered VCF lines (args.vbuf) until the active transcripts are gone + vbuf = args->vcf_buf[ args->vcf_rbuf.f ]; + if ( vbuf->keep_until > pos ) break; + assert( vbuf->n ); + } + + i = rbuf_shift(&args->vcf_rbuf); + assert( i>=0 ); + vbuf = args->vcf_buf[i]; + int pos = vbuf->n ? vbuf->vrec[0]->line->pos : -1; + for (i=0; in; i++) + { + vrec_t *vrec = vbuf->vrec[i]; + if ( !args->out_fh ) // not a VCF output + { + vrec->nvcsq = 0; + continue; + } + if ( !vrec->nvcsq ) + { + if ( bcf_write(args->out_fh, args->hdr, vrec->line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname?args->output_fname:"standard output"); + int save_pos = vrec->line->pos; + bcf_empty(vrec->line); + vrec->line->pos = save_pos; // this is necessary for compound variants + continue; + } + + args->str.l = 0; + kput_vcsq(args, &vrec->vcsq[0], &args->str); + for (j=1; jnvcsq; j++) + { + kputc_(',', &args->str); + kput_vcsq(args, &vrec->vcsq[j], &args->str); + } + bcf_update_info_string(args->hdr, vrec->line, args->bcsq_tag, args->str.s); + if ( args->hdr_nsmpl ) + { + if ( vrec->nfmt < args->nfmt_bcsq ) + for (j=1; jhdr_nsmpl; j++) + memmove(&vrec->fmt_bm[j*vrec->nfmt], &vrec->fmt_bm[j*args->nfmt_bcsq], vrec->nfmt*sizeof(*vrec->fmt_bm)); + bcf_update_format_int32(args->hdr, vrec->line, args->bcsq_tag, vrec->fmt_bm, args->hdr_nsmpl*vrec->nfmt); + } + vrec->nvcsq = 0; + if ( bcf_write(args->out_fh, args->hdr, vrec->line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname?args->output_fname:"standard output"); + int save_pos = vrec->line->pos; + bcf_empty(vrec->line); + vrec->line->pos = save_pos; + } + if ( pos!=-1 ) + { + khint_t k = kh_get(pos2vbuf, args->pos2vbuf, pos); + if ( k != kh_end(args->pos2vbuf) ) kh_del(pos2vbuf, args->pos2vbuf, k); + } + vbuf->n = 0; + } + if ( args->active_tr->ndat ) return; + + for (i=0; inrm_tr; i++) + { + tscript_t *tr = args->rm_tr[i]; + if ( tr->root ) hap_destroy(tr->root); + tr->root = NULL; + free(tr->hap); + free(tr->ref); + free(tr->sref); + } + args->nrm_tr = 0; + args->ncsq_buf = 0; +} + +void tscript_init_ref(args_t *args, tscript_t *tr, const char *chr) +{ + int i, len; + int pad_beg = tr->beg >= N_REF_PAD ? N_REF_PAD : tr->beg; + + tr->ref = faidx_fetch_seq(args->fai, chr, tr->beg - pad_beg, tr->end + N_REF_PAD, &len); + if ( !tr->ref ) + error("faidx_fetch_seq failed %s:%d-%d\n", chr,tr->beg+1,tr->end+1); + + int pad_end = len - (tr->end - tr->beg + 1 + pad_beg); + if ( pad_beg + pad_end != 2*N_REF_PAD ) + { + char *ref = (char*) malloc(tr->end - tr->beg + 1 + 2*N_REF_PAD + 1); + for (i=0; i < N_REF_PAD - pad_beg; i++) ref[i] = 'N'; + memcpy(ref+i, tr->ref, len); + len += i; + for (i=0; i < N_REF_PAD - pad_end; i++) ref[i+len] = 'N'; + ref[i+len] = 0; + free(tr->ref); + tr->ref = ref; + } +} + +static void sanity_check_ref(args_t *args, tscript_t *tr, bcf1_t *rec) +{ + int vbeg = 0; + int rbeg = rec->pos - tr->beg + N_REF_PAD; + if ( rbeg < 0 ) { vbeg += abs(rbeg); rbeg = 0; } + char *ref = tr->ref + rbeg; + char *vcf = rec->d.allele[0] + vbeg; + assert( vcf - rec->d.allele[0] < strlen(rec->d.allele[0]) && ref - tr->ref < tr->end - tr->beg + 2*N_REF_PAD ); + int i = 0; + while ( ref[i] && vcf[i] ) + { + if ( ref[i]!=vcf[i] && toupper(ref[i])!=toupper(vcf[i]) ) + error("Error: the fasta reference does not match the VCF REF allele at %s:%"PRId64" .. fasta=%c vcf=%c\n", + bcf_seqname(args->hdr,rec),(int64_t) rec->pos+vbeg+1,ref[i],vcf[i]); + i++; + } +} + +int test_cds_local(args_t *args, bcf1_t *rec) +{ + int i,j, ret = 0; + const char *chr = bcf_seqname(args->hdr,rec); + // note that the off-by-one extension of rlen is deliberate to account for insertions + if ( !regidx_overlap(args->idx_cds,chr,rec->pos,rec->pos+rec->rlen, args->itr) ) return 0; + + // structures to fake the normal test_cds machinery + hap_node_t root, node; + root.type = HAP_ROOT; + kstring_t *tref = &args->hap->tref, *tseq = &args->hap->tseq; + + while ( regitr_overlap(args->itr) ) + { + gf_cds_t *cds = regitr_payload(args->itr,gf_cds_t*); + tscript_t *tr = cds->tr; + if ( !GF_is_coding(tr->type) ) continue; + ret = 1; + + if ( !tr->ref ) + { + tscript_init_ref(args, tr, chr); + tscript_splice_ref(tr); + khp_insert(trhp, args->active_tr, &tr); // only to clean the reference afterwards + } + + sanity_check_ref(args, tr, rec); + + kstring_t sref; + sref.s = tr->sref; + sref.l = tr->nsref; + sref.m = sref.l; + + for (i=1; in_allele; i++) + { + if ( rec->d.allele[i][0]=='<' || rec->d.allele[i][0]=='*' ) { continue; } + if ( hap_init(args, &root, &node, cds, rec, i)!=0 ) continue; + + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = i; + csq.type.gene = tr->gene->name; + + int csq_type = node.csq; + + // code repetition: it would be nice to reuse the code from hap_add_csq, needs refactoring though + if ( node.type == HAP_SSS ) + { + csq.type.type = csq_type; + csq_stage(args, &csq, rec); + } + else + { + kstring_t sseq; + sseq.m = sref.m - 2*N_REF_PAD + node.dlen; + sseq.s = node.seq; + int alen = sseq.l = strlen(sseq.s); + int fill = node.dlen%3 && alen ? 1 : 0; // see #1475227917 + cds_translate(&sref, &sseq, node.sbeg,node.sbeg,node.sbeg+node.rlen, tr->strand, tseq, fill); + + sseq.m = sref.m - 2*N_REF_PAD; + sseq.s = sref.s + N_REF_PAD + node.sbeg; + sseq.l = node.rlen; + cds_translate(&sref, &sseq, node.sbeg,node.sbeg,node.sbeg+node.rlen, tr->strand, tref, fill); + + // check for truncating stops + for (j=0; jl; j++) + if ( tref->s[j]=='*' ) break; + if ( j!=tref->l ) + { + tref->l = j+1; + tref->s[j+1] = 0; + } + for (j=0; jl; j++) + if ( tseq->s[j]=='*' ) break; + if ( j!=tseq->l ) + { + tseq->l = j+1; + tseq->s[j+1] = 0; + } + if ( csq_type & CSQ_STOP_LOST ) + { + if ( tref->s[tref->l-1]=='*' && tref->s[tref->l-1] == tseq->s[tseq->l-1] ) + { + csq_type &= ~CSQ_STOP_LOST; + csq_type |= CSQ_STOP_RETAINED; + } + else if (tref->s[tref->l-1]!='*' ) + { + // This is CDS 3' incomplete ENSG00000173376/synon.vcf, can also be missense + // We observe in real data a change to a stop, ENST00000528237/retained-stop-incomplete-cds.vcf + if ( tseq->s[tseq->l-1] == '*' ) + { + csq_type &= ~CSQ_STOP_GAINED; + csq_type |= CSQ_STOP_RETAINED; + } + else + csq_type |= CSQ_INCOMPLETE_CDS; + } + } + if ( csq_type & CSQ_START_LOST && tref->s[0]!='M' ) + csq_type &= ~CSQ_START_LOST; + if ( node.dlen!=0 ) + { + if ( node.dlen%3 ) + csq_type |= CSQ_FRAMESHIFT_VARIANT; + else if ( node.dlen<0 ) + csq_type |= CSQ_INFRAME_DELETION; + else + csq_type |= CSQ_INFRAME_INSERTION; + if ( tref->s[tref->l-1]!='*' && tseq->s[tseq->l-1]=='*' ) + csq_type |= CSQ_STOP_GAINED; + } + else + { + for (j=0; jl; j++) + if ( tref->s[j] != tseq->s[j] ) break; + if ( j==tref->l ) + csq_type |= CSQ_SYNONYMOUS_VARIANT; + else if ( tref->s[j] == '*' ) + csq_type |= CSQ_STOP_LOST; + else if ( tseq->s[j] == '*' ) + csq_type |= CSQ_STOP_GAINED; + else + csq_type |= CSQ_MISSENSE_VARIANT; + } + if ( csq_type & CSQ_COMPOUND ) + { + // create the aa variant string + kstring_t str = {0,0,0}; + int aa_rbeg = tr->strand==STRAND_FWD ? node.sbeg/3+1 : (tr->nsref - 2*N_REF_PAD - node.sbeg - node.rlen)/3+1; + int aa_sbeg = tr->strand==STRAND_FWD ? node.sbeg/3+1 : (tr->nsref - 2*N_REF_PAD + node.dlen - node.sbeg - alen)/3+1; + kputc_('|', &str); + kputw(aa_rbeg, &str); + kprint_aa_prediction(args,aa_rbeg,tref,&str); + if ( !(csq_type & CSQ_SYNONYMOUS_VARIANT) ) + { + kputc_('>', &str); + kputw(aa_sbeg, &str); + kprint_aa_prediction(args,aa_sbeg,tseq,&str); + } + kputc_('|', &str); + kputw(rec->pos+1, &str); + kputs(node.var, &str); + csq.type.vstr = str; + csq.type.type = csq_type & CSQ_COMPOUND; + csq_stage(args, &csq, rec); + + // all this only to clean vstr when vrec is flushed + if ( !tr->root ) + tr->root = (hap_node_t*) calloc(1,sizeof(hap_node_t)); + tr->root->ncsq_list++; + hts_expand0(csq_t,tr->root->ncsq_list,tr->root->mcsq_list,tr->root->csq_list); + csq_t *rm_csq = tr->root->csq_list + tr->root->ncsq_list - 1; + rm_csq->type.vstr = str; + } + if ( csq_type & ~CSQ_COMPOUND ) + { + csq.type.type = csq_type & ~CSQ_COMPOUND; + csq.type.vstr.l = 0; + csq_stage(args, &csq, rec); + } + } + free(node.seq); + free(node.var); + } + } + return ret; +} + +int test_cds(args_t *args, bcf1_t *rec, vbuf_t *vbuf) +{ + static int overlaps_warned = 0, multiploid_warned = 0; + + int i, ret = 0, hap_ret; + const char *chr = bcf_seqname(args->hdr,rec); + // note that the off-by-one extension of rlen is deliberate to account for insertions + if ( !regidx_overlap(args->idx_cds,chr,rec->pos,rec->pos+rec->rlen, args->itr) ) return 0; + while ( regitr_overlap(args->itr) ) + { + gf_cds_t *cds = regitr_payload(args->itr,gf_cds_t*); + tscript_t *tr = cds->tr; + if ( !GF_is_coding(tr->type) ) continue; + if ( vbuf->keep_until < tr->end ) vbuf->keep_until = tr->end; + ret = 1; + if ( !tr->root ) + { + // initialize the transcript and its haplotype tree, fetch the reference sequence + tscript_init_ref(args, tr, chr); + + tr->root = (hap_node_t*) calloc(1,sizeof(hap_node_t)); + tr->nhap = args->phase==PHASE_DROP_GT ? 1 : 2*args->smpl->n; // maximum ploidy = diploid + tr->hap = (hap_node_t**) malloc(tr->nhap*sizeof(hap_node_t*)); + for (i=0; inhap; i++) tr->hap[i] = NULL; + tr->root->nend = tr->nhap; + tr->root->type = HAP_ROOT; + + khp_insert(trhp, args->active_tr, &tr); + } + + sanity_check_ref(args, tr, rec); + + if ( args->phase==PHASE_DROP_GT ) + { + if ( rec->d.allele[1][0]=='<' || rec->d.allele[1][0]=='*' ) { continue; } + hap_node_t *parent = tr->hap[0] ? tr->hap[0] : tr->root; + hap_node_t *child = (hap_node_t*)calloc(1,sizeof(hap_node_t)); + hap_ret = hap_init(args, parent, child, cds, rec, 1); + if ( hap_ret!=0 ) + { + // overlapping or intron variant, cannot apply + if ( hap_ret==1 ) + { + if ( args->verbosity && (!overlaps_warned || args->verbosity > 1) ) + { + fprintf(bcftools_stderr, + "Warning: Skipping overlapping variants at %s:%"PRId64"\t%s>%s.\n", + chr,(int64_t) rec->pos+1,rec->d.allele[0],rec->d.allele[1]); + if ( !overlaps_warned ) + fprintf(bcftools_stderr," This message is printed only once, the verbosity can be increased with `--verbose 2`\n"); + overlaps_warned = 1; + } + if ( args->out ) + fprintf(args->out,"LOG\tWarning: Skipping overlapping variants at %s:%"PRId64"\t%s>%s\n", chr,(int64_t) rec->pos+1,rec->d.allele[0],rec->d.allele[1]); + } + else ret = 1; // prevent reporting as intron in test_tscript + hap_destroy(child); + continue; + } + if ( child->type==HAP_SSS ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = 1; + csq.type.gene = tr->gene->name; + csq.type.type = child->csq; + csq_stage(args, &csq, rec); + hap_destroy(child); + ret = 1; + continue; + } + parent->nend--; + parent->nchild = 1; + parent->mchild = 1; + parent->child = (hap_node_t**) malloc(sizeof(hap_node_t*)); + parent->child[0] = child; + tr->hap[0] = child; + tr->hap[0]->nend = 1; + continue; + } + + // apply the VCF variants and extend the haplotype tree + int j, ismpl, ihap, ngts = bcf_get_genotypes(args->hdr, rec, &args->gt_arr, &args->mgt_arr); + ngts /= bcf_hdr_nsamples(args->hdr); + if ( ngts!=1 && ngts!=2 ) + { + if ( args->verbosity && (!multiploid_warned || args->verbosity > 1) ) + { + fprintf(bcftools_stderr, + "Warning: Skipping site with non-diploid/non-haploid genotypes at %s:%"PRId64"\t%s>%s.\n", + chr,(int64_t) rec->pos+1,rec->d.allele[0],rec->d.allele[1]); + if ( !multiploid_warned ) + fprintf(bcftools_stderr," This message is printed only once, the verbosity can be increased with `--verbose 2`\n"); + multiploid_warned = 1; + } + if ( args->out ) + fprintf(args->out,"LOG\tWarning: Skipping site with non-diploid/non-haploid genotypes at %s:%"PRId64"\t%s>%s\n", chr,(int64_t) rec->pos+1,rec->d.allele[0],rec->d.allele[1]); + continue; + } + for (ismpl=0; ismplsmpl->n; ismpl++) + { + int32_t *gt = args->gt_arr + args->smpl->idx[ismpl]*ngts; + if ( gt[0]==bcf_gt_missing ) continue; + + if ( ngts>1 && gt[1]!=bcf_gt_missing && gt[1]!=bcf_int32_vector_end && bcf_gt_allele(gt[0])!=bcf_gt_allele(gt[1]) ) + { + if ( args->phase==PHASE_MERGE ) + { + if ( !bcf_gt_allele(gt[0]) ) gt[0] = gt[1]; + } + if ( !bcf_gt_is_phased(gt[0]) && !bcf_gt_is_phased(gt[1]) ) + { + if ( args->phase==PHASE_REQUIRE ) + error("Unphased heterozygous genotype at %s:%"PRId64", sample %s. See the --phase option.\n", chr,(int64_t) rec->pos+1,args->hdr->samples[args->smpl->idx[ismpl]]); + if ( args->phase==PHASE_SKIP ) + continue; + if ( args->phase==PHASE_NON_REF ) + { + if ( !bcf_gt_allele(gt[0]) ) gt[0] = gt[1]; + else if ( !bcf_gt_allele(gt[1]) ) gt[1] = gt[0]; + } + } + } + + for (ihap=0; ihapn_allele ); + if ( rec->d.allele[ial][0]=='<' || rec->d.allele[ial][0]=='*' ) { continue; } + + hap_node_t *parent = tr->hap[i] ? tr->hap[i] : tr->root; + if ( parent->cur_rec==rec && parent->cur_child[ial]>=0 ) + { + // this haplotype has been seen in another sample + tr->hap[i] = parent->child[ parent->cur_child[ial] ]; + tr->hap[i]->nend++; + parent->nend--; + continue; + } + + hap_node_t *child = (hap_node_t*)calloc(1,sizeof(hap_node_t)); + hap_ret = hap_init(args, parent, child, cds, rec, ial); + if ( hap_ret!=0 ) + { + // overlapping or intron variant, cannot apply + if ( hap_ret==1 ) + { + if ( args->verbosity && (!overlaps_warned || args->verbosity > 1) ) + { + fprintf(bcftools_stderr, + "Warning: Skipping overlapping variants at %s:%"PRId64", sample %s\t%s>%s.\n", + chr,(int64_t) rec->pos+1,args->hdr->samples[args->smpl->idx[ismpl]],rec->d.allele[0],rec->d.allele[ial]); + if ( !overlaps_warned ) + fprintf(bcftools_stderr," This message is printed only once, the verbosity can be increased with `--verbose 2`\n"); + overlaps_warned = 1; + } + if ( args->out ) + fprintf(args->out,"LOG\tWarning: Skipping overlapping variants at %s:%"PRId64", sample %s\t%s>%s\n", + chr,(int64_t) rec->pos+1,args->hdr->samples[args->smpl->idx[ismpl]],rec->d.allele[0],rec->d.allele[ial]); + } + hap_destroy(child); + continue; + } + if ( child->type==HAP_SSS ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = ial; + csq.type.gene = tr->gene->name; + csq.type.type = child->csq; + csq_stage(args, &csq, rec); + hap_destroy(child); + continue; + } + if ( parent->cur_rec!=rec ) + { + hts_expand(int,rec->n_allele,parent->mcur_child,parent->cur_child); + for (j=0; jn_allele; j++) parent->cur_child[j] = -1; + parent->cur_rec = rec; + } + + j = parent->nchild++; + hts_expand0(hap_node_t*,parent->nchild,parent->mchild,parent->child); + parent->cur_child[ial] = j; + parent->child[j] = child; + tr->hap[i] = child; + tr->hap[i]->nend++; + parent->nend--; + } + } + } + return ret; +} + +void csq_stage(args_t *args, csq_t *csq, bcf1_t *rec) +{ + // known issues: tab output leads to unsorted output. This is because + // coding haplotypes are printed in one go and buffering is not used + // with tab output. VCF output is OK though. + if ( csq_push(args, csq, rec)!=0 && args->phase==PHASE_DROP_GT ) return; // the consequence already exists + + int i,j,ngt = 0; + if ( args->phase!=PHASE_DROP_GT ) + { + ngt = bcf_get_genotypes(args->hdr, rec, &args->gt_arr, &args->mgt_arr); + if ( ngt>0 ) ngt /= bcf_hdr_nsamples(args->hdr); + } + if ( ngt<=0 ) + { + if ( args->output_type==FT_TAB_TEXT ) + csq_print_text(args, csq, -1,0); + return; + } + assert( ngt<=2 ); + + if ( args->output_type==FT_TAB_TEXT ) + { + for (i=0; ismpl->n; i++) + { + int32_t *gt = args->gt_arr + args->smpl->idx[i]*ngt; + for (j=0; jtype.vcf_ial ) continue; + csq_print_text(args, csq, args->smpl->idx[i],j+1); + } + } + return; + } + + vrec_t *vrec = csq->vrec; + for (i=0; ismpl->n; i++) + { + int32_t *gt = args->gt_arr + args->smpl->idx[i]*ngt; + for (j=0; jtype.vcf_ial ) continue; + + int icsq2 = 2*csq->idx + j; + if ( icsq2 >= args->ncsq2_max ) // more than ncsq_max consequences, so can't fit it in FMT + { + int ismpl = args->smpl->idx[i]; + if ( args->verbosity && (!args->ncsq2_small_warned || args->verbosity > 1) ) + { + fprintf(bcftools_stderr, + "Warning: Too many consequences for sample %s at %s:%"PRId64", keeping the first %d and skipping the rest.\n", + args->hdr->samples[ismpl],bcf_hdr_id2name(args->hdr,args->rid),(int64_t) vrec->line->pos+1,icsq2+1); + if ( !args->ncsq2_small_warned ) + fprintf(bcftools_stderr," The limit can be increased by setting the --ncsq parameter. This warning is printed only once.\n"); + args->ncsq2_small_warned = 1; + } + if ( args->ncsq2_small_warned < icsq2 ) args->ncsq2_small_warned = icsq2; + break; + } + int ival, ibit; + icsq2_to_bit(icsq2, &ival,&ibit); + if ( vrec->nfmt < 1 + ival ) vrec->nfmt = 1 + ival; + vrec->fmt_bm[i*args->nfmt_bcsq + ival] |= 1 << ibit; + } + } +} +int test_utr(args_t *args, bcf1_t *rec) +{ + const char *chr = bcf_seqname(args->hdr,rec); + // note that the off-by-one extension of rlen is deliberate to account for insertions + if ( !regidx_overlap(args->idx_utr,chr,rec->pos,rec->pos+rec->rlen, args->itr) ) return 0; + + splice_t splice; + splice_init(&splice, rec); + + int i, ret = 0; + while ( regitr_overlap(args->itr) ) + { + gf_utr_t *utr = regitr_payload(args->itr, gf_utr_t*); + tscript_t *tr = splice.tr = utr->tr; + for (i=1; in_allele; i++) + { + if ( rec->d.allele[i][0]=='<' || rec->d.allele[i][0]=='*' ) { continue; } + splice.vcf.alt = rec->d.allele[i]; + splice.csq = 0; + int splice_ret = splice_csq(args, &splice, utr->beg, utr->end); + if ( splice_ret!=SPLICE_INSIDE && splice_ret!=SPLICE_OVERLAP ) continue; + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.type = utr->which==prime5 ? CSQ_UTR5 : CSQ_UTR3; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.vcf_ial = i; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + ret = 1; + } + } + assert(!splice.kref.s); + assert(!splice.kalt.s); + return ret; +} +int test_splice(args_t *args, bcf1_t *rec) +{ + const char *chr = bcf_seqname(args->hdr,rec); + if ( !regidx_overlap(args->idx_exon,chr,rec->pos,rec->pos + rec->rlen, args->itr) ) return 0; + + splice_t splice; + splice_init(&splice, rec); + splice.check_acceptor = splice.check_donor = 1; + + int i, ret = 0; + while ( regitr_overlap(args->itr) ) + { + gf_exon_t *exon = regitr_payload(args->itr, gf_exon_t*); + splice.tr = exon->tr; + if ( !splice.tr->ncds ) continue; // not a coding transcript, no interest in splice sites + + splice.check_region_beg = splice.tr->beg==exon->beg ? 0 : 1; + splice.check_region_end = splice.tr->end==exon->end ? 0 : 1; + + for (i=1; in_allele; i++) + { + if ( rec->d.allele[1][0]=='<' || rec->d.allele[1][0]=='*' ) { continue; } + splice.vcf.alt = rec->d.allele[i]; + splice.csq = 0; + splice_csq(args, &splice, exon->beg, exon->end); + if ( splice.csq ) ret = 1; + } + } + free(splice.kref.s); + free(splice.kalt.s); + return ret; +} +int test_tscript(args_t *args, bcf1_t *rec) +{ + const char *chr = bcf_seqname(args->hdr,rec); + if ( !regidx_overlap(args->idx_tscript,chr,rec->pos,rec->pos+rec->rlen, args->itr) ) return 0; + + splice_t splice; + splice_init(&splice, rec); + + int i, ret = 0; + while ( regitr_overlap(args->itr) ) + { + tscript_t *tr = splice.tr = regitr_payload(args->itr, tscript_t*); + for (i=1; in_allele; i++) + { + if ( rec->d.allele[i][0]=='<' || rec->d.allele[i][0]=='*' ) { continue; } + splice.vcf.alt = rec->d.allele[i]; + splice.csq = 0; + int splice_ret = splice_csq(args, &splice, tr->beg, tr->end); + if ( splice_ret!=SPLICE_INSIDE && splice_ret!=SPLICE_OVERLAP ) continue; // SPLICE_OUTSIDE or SPLICE_REF + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + csq.pos = rec->pos; + csq.type.type = GF_is_coding(tr->type) ? CSQ_INTRON : CSQ_NON_CODING; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + ret = 1; + } + } + assert(!splice.kref.s); + assert(!splice.kalt.s); + return ret; +} + +void test_symbolic_alt(args_t *args, bcf1_t *rec) +{ + static int warned = 0; + if ( args->verbosity && (!warned && args->verbosity > 0) ) + { + fprintf(bcftools_stderr,"Warning: The support for symbolic ALT insertions is experimental.\n"); + warned = 1; + } + + const char *chr = bcf_seqname(args->hdr,rec); + + // only insertions atm + int beg = rec->pos + 1; + int end = beg; + int csq_class = CSQ_ELONGATION; + + int hit = 0; + if ( regidx_overlap(args->idx_cds,chr,beg,end, args->itr) ) + { + while ( regitr_overlap(args->itr) ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + gf_cds_t *cds = regitr_payload(args->itr,gf_cds_t*); + tscript_t *tr = cds->tr; + csq.type.type = (GF_is_coding(tr->type) ? CSQ_CODING_SEQUENCE : CSQ_NON_CODING) | csq_class; + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + hit = 1; + } + } + if ( regidx_overlap(args->idx_utr,chr,beg,end, args->itr) ) + { + while ( regitr_overlap(args->itr) ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + gf_utr_t *utr = regitr_payload(args->itr, gf_utr_t*); + tscript_t *tr = utr->tr; + csq.type.type = (utr->which==prime5 ? CSQ_UTR5 : CSQ_UTR3) | csq_class; + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + hit = 1; + } + } + if ( regidx_overlap(args->idx_exon,chr,beg,end, args->itr) ) + { + splice_t splice; + splice_init(&splice, rec); + splice.check_acceptor = splice.check_donor = 1; + + while ( regitr_overlap(args->itr) ) + { + gf_exon_t *exon = regitr_payload(args->itr, gf_exon_t*); + splice.tr = exon->tr; + if ( !splice.tr->ncds ) continue; // not a coding transcript, no interest in splice sites + splice.check_region_beg = splice.tr->beg==exon->beg ? 0 : 1; + splice.check_region_end = splice.tr->end==exon->end ? 0 : 1; + splice.vcf.alt = rec->d.allele[1]; + splice.csq = csq_class; + splice_csq(args, &splice, exon->beg, exon->end); + if ( splice.csq ) hit = 1; + } + } + if ( !hit && regidx_overlap(args->idx_tscript,chr,beg,end, args->itr) ) + { + splice_t splice; + splice_init(&splice, rec); + + while ( regitr_overlap(args->itr) ) + { + csq_t csq; + memset(&csq, 0, sizeof(csq_t)); + tscript_t *tr = splice.tr = regitr_payload(args->itr, tscript_t*); + splice.vcf.alt = rec->d.allele[1]; + splice.csq = csq_class; + int splice_ret = splice_csq(args, &splice, tr->beg, tr->end); + if ( splice_ret!=SPLICE_INSIDE && splice_ret!=SPLICE_OVERLAP ) continue; // SPLICE_OUTSIDE or SPLICE_REF + csq.type.type = (GF_is_coding(tr->type) ? CSQ_INTRON : CSQ_NON_CODING) | csq_class; + csq.pos = rec->pos; + csq.type.biotype = tr->type; + csq.type.strand = tr->strand; + csq.type.trid = tr->id; + csq.type.gene = tr->gene->name; + csq_stage(args, &csq, rec); + } + } +} + +void debug_print_buffers(args_t *args, int pos) +{ + int i,j; + fprintf(bcftools_stderr,"debug_print_buffers at %d\n", pos); + fprintf(bcftools_stderr,"vbufs:\n"); + for (i=0; ivcf_rbuf.n; i++) + { + int k = rbuf_kth(&args->vcf_rbuf, i); + vbuf_t *vbuf = args->vcf_buf[k]; + + fprintf(bcftools_stderr,"\tvbuf %d:\n", i); + for (j=0; jn; j++) + { + vrec_t *vrec = vbuf->vrec[j]; + fprintf(bcftools_stderr,"\t\t%"PRId64" .. nvcsq=%d\n", (int64_t) vrec->line->pos+1, vrec->nvcsq); + } + } + fprintf(bcftools_stderr,"pos2vbuf:"); + khint_t k; + for (k = 0; k < kh_end(args->pos2vbuf); ++k) + if (kh_exist(args->pos2vbuf, k)) fprintf(bcftools_stderr," %d",1+(int)kh_key(args->pos2vbuf, k)); + fprintf(bcftools_stderr,"\n"); + fprintf(bcftools_stderr,"active_tr: %d\n", args->active_tr->ndat); +} + +static void process(args_t *args, bcf1_t **rec_ptr) +{ + if ( !rec_ptr ) + { + hap_flush(args, REGIDX_MAX); + vbuf_flush(args, REGIDX_MAX); + return; + } + + bcf1_t *rec = *rec_ptr; + static int32_t prev_rid = -1, prev_pos = -1; + if ( prev_rid!=rec->rid ) + { + prev_rid = rec->rid; + prev_pos = rec->pos; + + // Common error is to use different naming conventions in the fasta and the VCF (e.g. X vs chrX). + // Perform a simple sanity check (that does not catch much), the chromosome must be present in the + // reference file + if ( !faidx_has_seq(args->fai,bcf_seqname(args->hdr,rec)) ) + error("Error: the chromosome \"%s\" is not present in %s\n",bcf_seqname(args->hdr,rec),args->fa_fname); + } + if ( prev_pos > rec->pos ) + error("Error: The file is not sorted, %s:%d comes before %s:%"PRId64"\n",bcf_seqname(args->hdr,rec),prev_pos+1,bcf_seqname(args->hdr,rec),(int64_t) rec->pos+1); + + int call_csq = 1; + if ( rec->n_allele < 2 ) call_csq = 0; // no alternate allele + else if ( rec->n_allele==2 && (rec->d.allele[1][0]=='*' || rec->d.allele[1][1]=='*') ) call_csq = 0; // gVCF, not an alt allele + else if ( rec->d.allele[1][0]=='<' ) + { + if ( strncmp("d.allele[1], 4) ) call_csq = 0; // only is supported at the moment + } + if ( call_csq && args->filter ) + { + call_csq = filter_test(args->filter, rec, NULL); + if ( args->filter_logic==FLT_EXCLUDE ) call_csq = call_csq ? 0 : 1; + } + if ( !call_csq ) + { + if ( !args->out_fh ) return; // not a VCF output + vbuf_push(args, rec_ptr); + hap_flush(args, rec->pos-1); + vbuf_flush(args, rec->pos-1); + return; + } + + if ( args->rid != rec->rid ) + { + hap_flush(args, REGIDX_MAX); + vbuf_flush(args, REGIDX_MAX); + } + args->rid = rec->rid; + vbuf_t *vbuf = vbuf_push(args, rec_ptr); + + if ( rec->d.allele[1][0]!='<' ) + { + int hit = args->local_csq ? test_cds_local(args, rec) : test_cds(args, rec, vbuf); + hit += test_utr(args, rec); + hit += test_splice(args, rec); + if ( !hit ) test_tscript(args, rec); + } + else + test_symbolic_alt(args, rec); + + if ( rec->pos > 0 ) + { + hap_flush(args, rec->pos-1); + vbuf_flush(args, rec->pos-1); + } + + return; +} + +static const char *usage(void) +{ + return + "\n" + "About: Haplotype-aware consequence caller.\n" + "Usage: bcftools csq [OPTIONS] in.vcf\n" + "\n" + "Required options:\n" + " -f, --fasta-ref FILE Reference file in fasta format\n" + " -g, --gff-annot FILE GFF3 annotation file\n" + "\n" + "CSQ options:\n" + " -B, --trim-protein-seq INT Abbreviate protein-changing predictions to max INT aminoacids\n" + " -c, --custom-tag STRING Use this tag instead of the default BCSQ\n" + " -l, --local-csq Localized predictions, consider only one VCF record at a time\n" + " -n, --ncsq INT Maximum number of per-haplotype consequences to consider for each site [15]\n" + " -p, --phase a|m|r|R|s How to handle unphased heterozygous genotypes: [r]\n" + " a: take GTs as is, create haplotypes regardless of phase (0/1 -> 0|1)\n" + " m: merge *all* GTs into a single haplotype (0/1 -> 1, 1/2 -> 1)\n" + " r: require phased GTs, throw an error on unphased het GTs\n" + " R: create non-reference haplotypes if possible (0/1 -> 1|1, 1/2 -> 1|2)\n" + " s: skip unphased hets\n" + "Options:\n" + " -e, --exclude EXPR Exclude sites for which the expression is true\n" + " --force Run even if some sanity checks fail\n" + " -i, --include EXPR Select sites for which the expression is true\n" + " --no-version Do not append version and command line to the header\n" + " -o, --output FILE Write output to a file [standard output]\n" + " -O, --output-type b|u|z|v|t[0-9] b: compressed BCF, u: uncompressed BCF, z: compressed VCF\n" + " v: uncompressed VCF, t: plain tab-delimited text output, 0-9: compression level [v]\n" + " -r, --regions REGION Restrict to comma-separated list of regions\n" + " -R, --regions-file FILE Restrict to regions listed in a file\n" + " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n" + " -s, --samples -|LIST Samples to include or \"-\" to apply all variants and ignore samples\n" + " -S, --samples-file FILE Samples to include\n" + " -t, --targets REGION Similar to -r but streams rather than index-jumps\n" + " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n" + " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n" + " --threads INT Use multithreading with worker threads [0]\n" + " -v, --verbose INT Verbosity level 0-2 [1]\n" + "\n" + "Example:\n" + " bcftools csq -f hs37d5.fa -g Homo_sapiens.GRCh37.82.gff3.gz in.vcf\n" + "\n" + " # GFF3 annotation files can be downloaded from Ensembl. e.g. for human:\n" + " ftp://ftp.ensembl.org/pub/current_gff3/homo_sapiens/\n" + " ftp://ftp.ensembl.org/pub/grch37/release-84/gff3/homo_sapiens/\n" + "\n"; +} + +int main_csq(int argc, char *argv[]) +{ + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->output_type = FT_VCF; + args->bcsq_tag = "BCSQ"; + args->ncsq2_max = 2*(16-1); // 1 bit is reserved for BCF missing values + args->verbosity = 1; + args->record_cmd_line = 1; + args->clevel = -1; + + static struct option loptions[] = + { + {"force",0,0,1}, + {"threads",required_argument,NULL,2}, + {"help",0,0,'h'}, + {"ncsq",1,0,'n'}, + {"brief-predictions",no_argument,0,'b'}, + {"trim-protein-seq",required_argument,0,'B'}, + {"custom-tag",1,0,'c'}, + {"local-csq",0,0,'l'}, + {"gff-annot",1,0,'g'}, + {"fasta-ref",1,0,'f'}, + {"include",1,0,'i'}, + {"exclude",1,0,'e'}, + {"output",1,0,'o'}, + {"output-type",1,NULL,'O'}, + {"phase",1,0,'p'}, + {"quiet",0,0,'q'}, + {"verbose",1,0,'v'}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,4}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,5}, + {"no-version",no_argument,NULL,3}, + {0,0,0,0} + }; + int c, targets_is_file = 0, regions_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + char *targets_list = NULL, *regions_list = NULL, *tmp; + while ((c = getopt_long(argc, argv, "?hr:R:t:T:i:e:f:o:O:g:s:S:p:qc:ln:bB:v:",loptions,NULL)) >= 0) + { + switch (c) + { + case 1 : args->force = 1; break; + case 2 : + args->n_threads = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --threads %s\n", optarg); + break; + case 3 : args->record_cmd_line = 0; break; + case 'b': + args->brief_predictions = 1; + fprintf(bcftools_stderr,"Warning: the -b option will be removed in future versions. Please use -B 1 instead.\n"); + break; + case 'B': + args->brief_predictions = strtol(optarg,&tmp,10); + if ( *tmp || args->brief_predictions<1 ) error("Could not parse argument: --trim-protein-seq %s\n", optarg); + break; + case 'l': args->local_csq = 1; break; + case 'c': args->bcsq_tag = optarg; break; + case 'q': error("Error: the -q option has been deprecated, use -v, --verbose instead.\n"); break; + case 'v': + args->verbosity = atoi(optarg); + if ( args->verbosity<0 || args->verbosity>2 ) error("Error: expected integer 0-2 with -v, --verbose\n"); + break; + case 'p': + switch (optarg[0]) + { + case 'a': args->phase = PHASE_AS_IS; break; + case 'm': args->phase = PHASE_MERGE; break; + case 'r': args->phase = PHASE_REQUIRE; break; + case 'R': args->phase = PHASE_NON_REF; break; + case 's': args->phase = PHASE_SKIP; break; + default: error("The -p code \"%s\" not recognised\n", optarg); + } + break; + case 'f': args->fa_fname = optarg; break; + case 'g': args->gff_fname = optarg; break; + case 'n': + args->ncsq2_max = 2 * atoi(optarg); + if ( args->ncsq2_max <= 0 ) error("Expected positive integer with -n, got %s\n", optarg); + break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 't': args->output_type = FT_TAB_TEXT; break; + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --output-type %s\n", optarg+1); + } + break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'r': regions_list = optarg; break; + case 'R': regions_list = optarg; regions_is_file = 1; break; + case 's': args->sample_list = optarg; break; + case 'S': args->sample_list = optarg; args->sample_is_file = 1; break; + case 't': targets_list = optarg; break; + case 'T': targets_list = optarg; targets_is_file = 1; break; + case 4 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 5 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 'h': + case '?': error("%s",usage()); + default: error("The option not recognised: %s\n\n", optarg); break; + } + } + char *fname = NULL; + if ( optind==argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else error("%s", usage()); + } + else fname = argv[optind]; + if ( argc - optind>1 ) error("%s", usage()); + if ( !args->fa_fname ) error("Missing the --fa-ref option\n"); + if ( !args->gff_fname ) error("Missing the --gff option\n"); + args->sr = bcf_sr_init(); + if ( targets_list ) + { + bcf_sr_set_opt(args->sr,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->sr, targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", targets_list); + } + if ( regions_list ) + { + bcf_sr_set_opt(args->sr,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->sr, regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", regions_list); + } + if ( bcf_sr_set_threads(args->sr, args->n_threads)<0 ) error("Failed to create %d extra threads\n", args->n_threads); + if ( !bcf_sr_add_reader(args->sr, fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->sr->errnum)); + args->hdr = bcf_sr_get_header(args->sr,0); + + init_data(args); + while ( bcf_sr_next_line(args->sr) ) + { + process(args, &args->sr->readers[0].buffer[0]); + } + process(args,NULL); + + destroy_data(args); + bcf_sr_destroy(args->sr); + free(args); + return 0; +} + diff --git a/bcftools/dbuf.h b/bcftools/dbuf.h new file mode 100644 index 0000000..80b5958 --- /dev/null +++ b/bcftools/dbuf.h @@ -0,0 +1,71 @@ +/* The MIT License + + Copyright (c) 2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +/* + Simple data buffer +*/ + +#ifndef __DBUF_H__ +#define __DBUF_H__ + +#include + +typedef struct +{ + size_t n,m; + void **dat; +} +dbuf_t; + +static inline dbuf_t *dbuf_push(dbuf_t *buf, void *ptr) +{ + if ( !buf ) buf = calloc(1,sizeof(dbuf_t)); + buf->n++; + hts_expand(void*,buf->n,buf->m,buf->dat); + buf->dat[buf->n-1] = ptr; + return buf; +} + +static inline void *dbuf_ith(dbuf_t *buf, int i) +{ + return buf->dat[i]; +} + +static inline size_t dbuf_n(dbuf_t *buf) +{ + return buf->n; +} + +static inline void dbuf_destroy_free(dbuf_t *buf) +{ + int i; + for (i=0; in; i++) free(buf->dat[i]); + free(buf->dat); + free(buf); +} + +#endif + diff --git a/bcftools/dist.c b/bcftools/dist.c new file mode 100644 index 0000000..094fc73 --- /dev/null +++ b/bcftools/dist.c @@ -0,0 +1,124 @@ +/* The MIT License + + Copyright (c) 2016-2020 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include "dist.h" + +extern void error(const char *format, ...); + +struct _dist_t +{ + uint64_t *bins, nvalues; + int nbins; + int npow; // the number of orders of magnitude to represent exactly + int nexact; // pow(10,npow) + int nlevel; +}; + +dist_t *dist_init(int npow) +{ + dist_t *dist = (dist_t*) calloc(1,sizeof(dist_t)); + dist->npow = npow; + dist->nexact = pow(10,npow); + dist->nlevel = dist->nexact - pow(10,npow-1); + return dist; +} + +void dist_destroy(dist_t *dist) +{ + if ( !dist ) return; + free(dist->bins); + free(dist); +} + +int dist_nbins(dist_t *dist) +{ + return dist->nbins; +} + +int dist_nvalues(dist_t *dist) +{ + return dist->nvalues; +} + +uint32_t dist_insert(dist_t *dist, uint32_t value) +{ + int ibin; + + if ( value <= dist->nexact ) + ibin = value; + else + { + int npow = (int) log10(value); + int level = npow - dist->npow + 1; + uint32_t step = pow(10, level); + ibin = dist->nexact + dist->nlevel*(level-1) + (value - pow(10,npow)) / step; + } + + if ( ibin >= dist->nbins ) + { + dist->bins = (uint64_t*) realloc(dist->bins, sizeof(*dist->bins)*(ibin+1)); + memset(dist->bins + dist->nbins, 0, (ibin+1 - dist->nbins)*sizeof(*dist->bins)); + dist->nbins = ibin+1; + } + dist->bins[ibin]++; + dist->nvalues++; + return ibin; +} +uint32_t dist_insert_n(dist_t *dist, uint32_t value, uint32_t cnt) +{ + if ( !cnt ) return 0; + int ibin = dist_insert(dist, value); + dist->bins[ibin] += cnt - 1; + dist->nvalues += cnt; + return ibin; +} + +uint64_t dist_get(dist_t *dist, uint32_t idx, uint32_t *beg, uint32_t *end) +{ + if ( idx < dist->nexact ) + { + if ( beg ) *beg = idx; + if ( end ) *end = idx + 1; + } + else + { + int level = (idx - dist->nexact) / dist->nlevel + 1; + int bin = idx - dist->nexact - dist->nlevel*(level-1); + + uint32_t step = pow(10, level); + uint32_t value = pow(10, level + dist->npow - 1) + step*bin; + + if ( beg ) *beg = value; + if ( end ) *end = value + step; + } + return dist->bins[idx]; +} + diff --git a/bcftools/dist.c.pysam.c b/bcftools/dist.c.pysam.c new file mode 100644 index 0000000..f3f0915 --- /dev/null +++ b/bcftools/dist.c.pysam.c @@ -0,0 +1,126 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2016-2020 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include "dist.h" + +extern void error(const char *format, ...); + +struct _dist_t +{ + uint64_t *bins, nvalues; + int nbins; + int npow; // the number of orders of magnitude to represent exactly + int nexact; // pow(10,npow) + int nlevel; +}; + +dist_t *dist_init(int npow) +{ + dist_t *dist = (dist_t*) calloc(1,sizeof(dist_t)); + dist->npow = npow; + dist->nexact = pow(10,npow); + dist->nlevel = dist->nexact - pow(10,npow-1); + return dist; +} + +void dist_destroy(dist_t *dist) +{ + if ( !dist ) return; + free(dist->bins); + free(dist); +} + +int dist_nbins(dist_t *dist) +{ + return dist->nbins; +} + +int dist_nvalues(dist_t *dist) +{ + return dist->nvalues; +} + +uint32_t dist_insert(dist_t *dist, uint32_t value) +{ + int ibin; + + if ( value <= dist->nexact ) + ibin = value; + else + { + int npow = (int) log10(value); + int level = npow - dist->npow + 1; + uint32_t step = pow(10, level); + ibin = dist->nexact + dist->nlevel*(level-1) + (value - pow(10,npow)) / step; + } + + if ( ibin >= dist->nbins ) + { + dist->bins = (uint64_t*) realloc(dist->bins, sizeof(*dist->bins)*(ibin+1)); + memset(dist->bins + dist->nbins, 0, (ibin+1 - dist->nbins)*sizeof(*dist->bins)); + dist->nbins = ibin+1; + } + dist->bins[ibin]++; + dist->nvalues++; + return ibin; +} +uint32_t dist_insert_n(dist_t *dist, uint32_t value, uint32_t cnt) +{ + if ( !cnt ) return 0; + int ibin = dist_insert(dist, value); + dist->bins[ibin] += cnt - 1; + dist->nvalues += cnt; + return ibin; +} + +uint64_t dist_get(dist_t *dist, uint32_t idx, uint32_t *beg, uint32_t *end) +{ + if ( idx < dist->nexact ) + { + if ( beg ) *beg = idx; + if ( end ) *end = idx + 1; + } + else + { + int level = (idx - dist->nexact) / dist->nlevel + 1; + int bin = idx - dist->nexact - dist->nlevel*(level-1); + + uint32_t step = pow(10, level); + uint32_t value = pow(10, level + dist->npow - 1) + step*bin; + + if ( beg ) *beg = value; + if ( end ) *end = value + step; + } + return dist->bins[idx]; +} + diff --git a/bcftools/dist.h b/bcftools/dist.h new file mode 100644 index 0000000..5c9c571 --- /dev/null +++ b/bcftools/dist.h @@ -0,0 +1,98 @@ +/* The MIT License + + Copyright (c) 2016-2020 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ +/* + Logarithmic binning + + Example of usage: + + // Initialize, make the binning exact up to 10^4, then add a log-step + dist_t *dist = dist_init(4); + + // Insert values + int i; + for (i=0; i<1e6; i++) + dist_insert(dist, i); + + // Number of bins used + int n = dist_n(dist); + + // Now print the distribution + uint32_t beg, end; + for (i=0; i +#include + +typedef struct _dist_t dist_t; + +/* + * dist_init() - init bins + */ +dist_t *dist_init(int npow); +void dist_destroy(dist_t *dist); + +/* + dist_nbins() - get the number of bins + */ +int dist_nbins(dist_t *dist); + +/* + dist_nvalues() - get the total number of values inserted + */ +int dist_nvalues(dist_t *dist); + +/* + dist_insert() - insert new value + dist_insert_n() - insert new value n times + */ +uint32_t dist_insert(dist_t *dist, uint32_t value); +uint32_t dist_insert_n(dist_t *dist, uint32_t value, uint32_t cnt); + +/* + dist_get() + @idx: from the interval [0,dist_n-1] + @beg,end: [beg,end) + */ +uint64_t dist_get(dist_t *dist, uint32_t idx, uint32_t *beg, uint32_t *end); + +#endif + diff --git a/bcftools/em.c b/bcftools/em.c new file mode 100644 index 0000000..baa3490 --- /dev/null +++ b/bcftools/em.c @@ -0,0 +1,259 @@ +/* em.c -- mathematical functions. + + Copyright (C) 2010, 2011 Broad Institute. + Portions copyright (C) 2013-2014 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include "kmin.h" +#include "call.h" + +#define ITER_MAX 50 +#define ITER_TRY 10 +#define EPS 1e-5 + +extern double kf_gammaq(double, double); + +/* + Generic routines + */ + +// estimate site allele frequency in a very naive and inaccurate way +static double est_freq(int n, const double *pdg) +{ + int i, gcnt[3], tmp1; + // get a rough estimate of the genotype frequency + gcnt[0] = gcnt[1] = gcnt[2] = 0; + for (i = 0; i < n; ++i) { + const double *p = pdg + i * 3; + if (p[0] != 1. || p[1] != 1. || p[2] != 1.) { + int which = p[0] > p[1]? 0 : 1; + which = p[which] > p[2]? which : 2; + ++gcnt[which]; + } + } + tmp1 = gcnt[0] + gcnt[1] + gcnt[2]; + return (tmp1 == 0)? -1.0 : (.5 * gcnt[1] + gcnt[2]) / tmp1; +} + +/* + Single-locus EM + */ + +typedef struct { + int beg, end; + const double *pdg; +} minaux1_t; + +static double prob1(double f, void *data) +{ + minaux1_t *a = (minaux1_t*)data; + double p = 1., l = 0., f3[3]; + int i; +// printf("brent %lg\n", f); + if (f < 0 || f > 1) return 1e300; + f3[0] = (1.-f)*(1.-f); f3[1] = 2.*f*(1.-f); f3[2] = f*f; + for (i = a->beg; i < a->end; ++i) { + const double *pdg = a->pdg + i * 3; + p *= pdg[0] * f3[0] + pdg[1] * f3[1] + pdg[2] * f3[2]; + if (p < 1e-200) l -= log(p), p = 1.; + } + return l - log(p); +} + +// one EM iteration for allele frequency estimate +static double freq_iter(double *f, const double *_pdg, int beg, int end) +{ + double f0 = *f, f3[3], err; + int i; +// printf("em %lg\n", *f); + f3[0] = (1.-f0)*(1.-f0); f3[1] = 2.*f0*(1.-f0); f3[2] = f0*f0; + for (i = beg, f0 = 0.; i < end; ++i) { + const double *pdg = _pdg + i * 3; + f0 += (pdg[1] * f3[1] + 2. * pdg[2] * f3[2]) + / (pdg[0] * f3[0] + pdg[1] * f3[1] + pdg[2] * f3[2]); + } + f0 /= (end - beg) * 2; + err = fabs(f0 - *f); + *f = f0; + return err; +} + +/* The following function combines EM and Brent's method. When the signal from + * the data is strong, EM is faster but sometimes, EM may converge very slowly. + * When this happens, we switch to Brent's method. The idea is learned from + * Rasmus Nielsen. + */ +static double freqml(double f0, int beg, int end, const double *pdg) +{ + int i; + double f; + for (i = 0, f = f0; i < ITER_TRY; ++i) + if (freq_iter(&f, pdg, beg, end) < EPS) break; + if (i == ITER_TRY) { // haven't converged yet; try Brent's method + minaux1_t a; + a.beg = beg; a.end = end; a.pdg = pdg; + kmin_brent(prob1, f0 == f? .5*f0 : f0, f, (void*)&a, EPS, &f); + } + return f; +} + +// one EM iteration for genotype frequency estimate +static double g3_iter(double g[3], const double *_pdg, int beg, int end) +{ + double err, gg[3]; + int i; + gg[0] = gg[1] = gg[2] = 0.; +// printf("%lg,%lg,%lg\n", g[0], g[1], g[2]); + for (i = beg; i < end; ++i) { + double sum, tmp[3]; + const double *pdg = _pdg + i * 3; + tmp[0] = pdg[0] * g[0]; tmp[1] = pdg[1] * g[1]; tmp[2] = pdg[2] * g[2]; + sum = (tmp[0] + tmp[1] + tmp[2]) * (end - beg); + gg[0] += tmp[0] / sum; gg[1] += tmp[1] / sum; gg[2] += tmp[2] / sum; + } + err = fabs(gg[0] - g[0]) > fabs(gg[1] - g[1])? fabs(gg[0] - g[0]) : fabs(gg[1] - g[1]); + err = err > fabs(gg[2] - g[2])? err : fabs(gg[2] - g[2]); + g[0] = gg[0]; g[1] = gg[1]; g[2] = gg[2]; + return err; +} + +// perform likelihood ratio test +static double lk_ratio_test(int n, int n1, const double *pdg, double f3[3][3]) +{ + double r; + int i; + for (i = 0, r = 1.; i < n1; ++i) { + const double *p = pdg + i * 3; + r *= (p[0] * f3[1][0] + p[1] * f3[1][1] + p[2] * f3[1][2]) + / (p[0] * f3[0][0] + p[1] * f3[0][1] + p[2] * f3[0][2]); + } + for (; i < n; ++i) { + const double *p = pdg + i * 3; + r *= (p[0] * f3[2][0] + p[1] * f3[2][1] + p[2] * f3[2][2]) + / (p[0] * f3[0][0] + p[1] * f3[0][1] + p[2] * f3[0][2]); + } + return r; +} + +// x[0]: ref frequency +// x[1..3]: alt-alt, alt-ref, ref-ref frequenc +// x[4]: HWE P-value +// x[5..6]: group1 freq, group2 freq +// x[7]: 1-degree P-value +// x[8]: 2-degree P-value +int bcf_em1(call_t *call, const bcf1_t *rec, int n1, int flag, double x[10]) +{ + double *pdg; + int i, n; //, n2; + if (rec->n_allele < 2) return -1; // one allele only + // initialization + if (n1 < 0 || n1 > rec->n_sample) n1 = 0; + if (flag & 1<<7) flag |= 7<<5; // compute group freq if LRT is required + if (flag & 0xf<<1) flag |= 0xf<<1; + n = rec->n_sample; //n2 = n - n1; + pdg = call->pdg; + if (pdg == 0) return -1; + for (i = 0; i < 10; ++i) x[i] = -1.; // set to negative + { + if ((x[0] = est_freq(n, pdg)) < 0.) return -1; // no data + x[0] = freqml(x[0], 0, n, pdg); + } + if (flag & (0xf<<1|3<<8)) { // estimate the genotype frequency and test HWE + double *g = x + 1, f3[3], r; + f3[0] = g[0] = (1 - x[0]) * (1 - x[0]); + f3[1] = g[1] = 2 * x[0] * (1 - x[0]); + f3[2] = g[2] = x[0] * x[0]; + for (i = 0; i < ITER_MAX; ++i) + if (g3_iter(g, pdg, 0, n) < EPS) break; + // Hardy-Weinberg equilibrium (HWE) + for (i = 0, r = 1.; i < n; ++i) { + double *p = pdg + i * 3; + r *= (p[0] * g[0] + p[1] * g[1] + p[2] * g[2]) / (p[0] * f3[0] + p[1] * f3[1] + p[2] * f3[2]); + } + x[4] = kf_gammaq(.5, log(r)); + } + if ((flag & 7<<5) && n1 > 0 && n1 < n) { // group frequency + x[5] = freqml(x[0], 0, n1, pdg); + x[6] = freqml(x[0], n1, n, pdg); + } + if ((flag & 1<<7) && n1 > 0 && n1 < n) { // 1-degree P-value + double f[3], f3[3][3], tmp; + f[0] = x[0]; f[1] = x[5]; f[2] = x[6]; + for (i = 0; i < 3; ++i) + f3[i][0] = (1-f[i])*(1-f[i]), f3[i][1] = 2*f[i]*(1-f[i]), f3[i][2] = f[i]*f[i]; + tmp = log(lk_ratio_test(n, n1, pdg, f3)); + if (tmp < 0) tmp = 0; + x[7] = kf_gammaq(.5, tmp); + } + if ((flag & 3<<8) && n1 > 0 && n1 < n) { // 2-degree P-value + double g[3][3], tmp; + for (i = 0; i < 3; ++i) memcpy(g[i], x + 1, 3 * sizeof(double)); + for (i = 0; i < ITER_MAX; ++i) + if (g3_iter(g[1], pdg, 0, n1) < EPS) break; + for (i = 0; i < ITER_MAX; ++i) + if (g3_iter(g[2], pdg, n1, n) < EPS) break; + tmp = log(lk_ratio_test(n, n1, pdg, g)); + if (tmp < 0) tmp = 0; + x[8] = kf_gammaq(1., tmp); + } + return 0; +} + +/* + Two-locus EM (LD) + */ + +#define _G1(h, k) ((h>>1&1) + (k>>1&1)) +#define _G2(h, k) ((h&1) + (k&1)) + +#if 0 +// 0: the previous site; 1: the current site +static int pair_freq_iter(int n, double *pdg[2], double f[4]) +{ + double ff[4]; + int i, k, h; +// printf("%lf,%lf,%lf,%lf\n", f[0], f[1], f[2], f[3]); + memset(ff, 0, 4 * sizeof(double)); + for (i = 0; i < n; ++i) { + double *p[2], sum, tmp; + p[0] = pdg[0] + i * 3; p[1] = pdg[1] + i * 3; + for (k = 0, sum = 0.; k < 4; ++k) + for (h = 0; h < 4; ++h) + sum += f[k] * f[h] * p[0][_G1(k,h)] * p[1][_G2(k,h)]; + for (k = 0; k < 4; ++k) { + tmp = f[0] * (p[0][_G1(0,k)] * p[1][_G2(0,k)] + p[0][_G1(k,0)] * p[1][_G2(k,0)]) + + f[1] * (p[0][_G1(1,k)] * p[1][_G2(1,k)] + p[0][_G1(k,1)] * p[1][_G2(k,1)]) + + f[2] * (p[0][_G1(2,k)] * p[1][_G2(2,k)] + p[0][_G1(k,2)] * p[1][_G2(k,2)]) + + f[3] * (p[0][_G1(3,k)] * p[1][_G2(3,k)] + p[0][_G1(k,3)] * p[1][_G2(k,3)]); + ff[k] += f[k] * tmp / sum; + } + } + for (k = 0; k < 4; ++k) f[k] = ff[k] / (2 * n); + return 0; +} +#endif + + diff --git a/bcftools/em.c.pysam.c b/bcftools/em.c.pysam.c new file mode 100644 index 0000000..37a3dea --- /dev/null +++ b/bcftools/em.c.pysam.c @@ -0,0 +1,261 @@ +#include "bcftools.pysam.h" + +/* em.c -- mathematical functions. + + Copyright (C) 2010, 2011 Broad Institute. + Portions copyright (C) 2013-2014 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include "kmin.h" +#include "call.h" + +#define ITER_MAX 50 +#define ITER_TRY 10 +#define EPS 1e-5 + +extern double kf_gammaq(double, double); + +/* + Generic routines + */ + +// estimate site allele frequency in a very naive and inaccurate way +static double est_freq(int n, const double *pdg) +{ + int i, gcnt[3], tmp1; + // get a rough estimate of the genotype frequency + gcnt[0] = gcnt[1] = gcnt[2] = 0; + for (i = 0; i < n; ++i) { + const double *p = pdg + i * 3; + if (p[0] != 1. || p[1] != 1. || p[2] != 1.) { + int which = p[0] > p[1]? 0 : 1; + which = p[which] > p[2]? which : 2; + ++gcnt[which]; + } + } + tmp1 = gcnt[0] + gcnt[1] + gcnt[2]; + return (tmp1 == 0)? -1.0 : (.5 * gcnt[1] + gcnt[2]) / tmp1; +} + +/* + Single-locus EM + */ + +typedef struct { + int beg, end; + const double *pdg; +} minaux1_t; + +static double prob1(double f, void *data) +{ + minaux1_t *a = (minaux1_t*)data; + double p = 1., l = 0., f3[3]; + int i; +// fprintf(bcftools_stdout, "brent %lg\n", f); + if (f < 0 || f > 1) return 1e300; + f3[0] = (1.-f)*(1.-f); f3[1] = 2.*f*(1.-f); f3[2] = f*f; + for (i = a->beg; i < a->end; ++i) { + const double *pdg = a->pdg + i * 3; + p *= pdg[0] * f3[0] + pdg[1] * f3[1] + pdg[2] * f3[2]; + if (p < 1e-200) l -= log(p), p = 1.; + } + return l - log(p); +} + +// one EM iteration for allele frequency estimate +static double freq_iter(double *f, const double *_pdg, int beg, int end) +{ + double f0 = *f, f3[3], err; + int i; +// fprintf(bcftools_stdout, "em %lg\n", *f); + f3[0] = (1.-f0)*(1.-f0); f3[1] = 2.*f0*(1.-f0); f3[2] = f0*f0; + for (i = beg, f0 = 0.; i < end; ++i) { + const double *pdg = _pdg + i * 3; + f0 += (pdg[1] * f3[1] + 2. * pdg[2] * f3[2]) + / (pdg[0] * f3[0] + pdg[1] * f3[1] + pdg[2] * f3[2]); + } + f0 /= (end - beg) * 2; + err = fabs(f0 - *f); + *f = f0; + return err; +} + +/* The following function combines EM and Brent's method. When the signal from + * the data is strong, EM is faster but sometimes, EM may converge very slowly. + * When this happens, we switch to Brent's method. The idea is learned from + * Rasmus Nielsen. + */ +static double freqml(double f0, int beg, int end, const double *pdg) +{ + int i; + double f; + for (i = 0, f = f0; i < ITER_TRY; ++i) + if (freq_iter(&f, pdg, beg, end) < EPS) break; + if (i == ITER_TRY) { // haven't converged yet; try Brent's method + minaux1_t a; + a.beg = beg; a.end = end; a.pdg = pdg; + kmin_brent(prob1, f0 == f? .5*f0 : f0, f, (void*)&a, EPS, &f); + } + return f; +} + +// one EM iteration for genotype frequency estimate +static double g3_iter(double g[3], const double *_pdg, int beg, int end) +{ + double err, gg[3]; + int i; + gg[0] = gg[1] = gg[2] = 0.; +// fprintf(bcftools_stdout, "%lg,%lg,%lg\n", g[0], g[1], g[2]); + for (i = beg; i < end; ++i) { + double sum, tmp[3]; + const double *pdg = _pdg + i * 3; + tmp[0] = pdg[0] * g[0]; tmp[1] = pdg[1] * g[1]; tmp[2] = pdg[2] * g[2]; + sum = (tmp[0] + tmp[1] + tmp[2]) * (end - beg); + gg[0] += tmp[0] / sum; gg[1] += tmp[1] / sum; gg[2] += tmp[2] / sum; + } + err = fabs(gg[0] - g[0]) > fabs(gg[1] - g[1])? fabs(gg[0] - g[0]) : fabs(gg[1] - g[1]); + err = err > fabs(gg[2] - g[2])? err : fabs(gg[2] - g[2]); + g[0] = gg[0]; g[1] = gg[1]; g[2] = gg[2]; + return err; +} + +// perform likelihood ratio test +static double lk_ratio_test(int n, int n1, const double *pdg, double f3[3][3]) +{ + double r; + int i; + for (i = 0, r = 1.; i < n1; ++i) { + const double *p = pdg + i * 3; + r *= (p[0] * f3[1][0] + p[1] * f3[1][1] + p[2] * f3[1][2]) + / (p[0] * f3[0][0] + p[1] * f3[0][1] + p[2] * f3[0][2]); + } + for (; i < n; ++i) { + const double *p = pdg + i * 3; + r *= (p[0] * f3[2][0] + p[1] * f3[2][1] + p[2] * f3[2][2]) + / (p[0] * f3[0][0] + p[1] * f3[0][1] + p[2] * f3[0][2]); + } + return r; +} + +// x[0]: ref frequency +// x[1..3]: alt-alt, alt-ref, ref-ref frequenc +// x[4]: HWE P-value +// x[5..6]: group1 freq, group2 freq +// x[7]: 1-degree P-value +// x[8]: 2-degree P-value +int bcf_em1(call_t *call, const bcf1_t *rec, int n1, int flag, double x[10]) +{ + double *pdg; + int i, n; //, n2; + if (rec->n_allele < 2) return -1; // one allele only + // initialization + if (n1 < 0 || n1 > rec->n_sample) n1 = 0; + if (flag & 1<<7) flag |= 7<<5; // compute group freq if LRT is required + if (flag & 0xf<<1) flag |= 0xf<<1; + n = rec->n_sample; //n2 = n - n1; + pdg = call->pdg; + if (pdg == 0) return -1; + for (i = 0; i < 10; ++i) x[i] = -1.; // set to negative + { + if ((x[0] = est_freq(n, pdg)) < 0.) return -1; // no data + x[0] = freqml(x[0], 0, n, pdg); + } + if (flag & (0xf<<1|3<<8)) { // estimate the genotype frequency and test HWE + double *g = x + 1, f3[3], r; + f3[0] = g[0] = (1 - x[0]) * (1 - x[0]); + f3[1] = g[1] = 2 * x[0] * (1 - x[0]); + f3[2] = g[2] = x[0] * x[0]; + for (i = 0; i < ITER_MAX; ++i) + if (g3_iter(g, pdg, 0, n) < EPS) break; + // Hardy-Weinberg equilibrium (HWE) + for (i = 0, r = 1.; i < n; ++i) { + double *p = pdg + i * 3; + r *= (p[0] * g[0] + p[1] * g[1] + p[2] * g[2]) / (p[0] * f3[0] + p[1] * f3[1] + p[2] * f3[2]); + } + x[4] = kf_gammaq(.5, log(r)); + } + if ((flag & 7<<5) && n1 > 0 && n1 < n) { // group frequency + x[5] = freqml(x[0], 0, n1, pdg); + x[6] = freqml(x[0], n1, n, pdg); + } + if ((flag & 1<<7) && n1 > 0 && n1 < n) { // 1-degree P-value + double f[3], f3[3][3], tmp; + f[0] = x[0]; f[1] = x[5]; f[2] = x[6]; + for (i = 0; i < 3; ++i) + f3[i][0] = (1-f[i])*(1-f[i]), f3[i][1] = 2*f[i]*(1-f[i]), f3[i][2] = f[i]*f[i]; + tmp = log(lk_ratio_test(n, n1, pdg, f3)); + if (tmp < 0) tmp = 0; + x[7] = kf_gammaq(.5, tmp); + } + if ((flag & 3<<8) && n1 > 0 && n1 < n) { // 2-degree P-value + double g[3][3], tmp; + for (i = 0; i < 3; ++i) memcpy(g[i], x + 1, 3 * sizeof(double)); + for (i = 0; i < ITER_MAX; ++i) + if (g3_iter(g[1], pdg, 0, n1) < EPS) break; + for (i = 0; i < ITER_MAX; ++i) + if (g3_iter(g[2], pdg, n1, n) < EPS) break; + tmp = log(lk_ratio_test(n, n1, pdg, g)); + if (tmp < 0) tmp = 0; + x[8] = kf_gammaq(1., tmp); + } + return 0; +} + +/* + Two-locus EM (LD) + */ + +#define _G1(h, k) ((h>>1&1) + (k>>1&1)) +#define _G2(h, k) ((h&1) + (k&1)) + +#if 0 +// 0: the previous site; 1: the current site +static int pair_freq_iter(int n, double *pdg[2], double f[4]) +{ + double ff[4]; + int i, k, h; +// fprintf(bcftools_stdout, "%lf,%lf,%lf,%lf\n", f[0], f[1], f[2], f[3]); + memset(ff, 0, 4 * sizeof(double)); + for (i = 0; i < n; ++i) { + double *p[2], sum, tmp; + p[0] = pdg[0] + i * 3; p[1] = pdg[1] + i * 3; + for (k = 0, sum = 0.; k < 4; ++k) + for (h = 0; h < 4; ++h) + sum += f[k] * f[h] * p[0][_G1(k,h)] * p[1][_G2(k,h)]; + for (k = 0; k < 4; ++k) { + tmp = f[0] * (p[0][_G1(0,k)] * p[1][_G2(0,k)] + p[0][_G1(k,0)] * p[1][_G2(k,0)]) + + f[1] * (p[0][_G1(1,k)] * p[1][_G2(1,k)] + p[0][_G1(k,1)] * p[1][_G2(k,1)]) + + f[2] * (p[0][_G1(2,k)] * p[1][_G2(2,k)] + p[0][_G1(k,2)] * p[1][_G2(k,2)]) + + f[3] * (p[0][_G1(3,k)] * p[1][_G2(3,k)] + p[0][_G1(k,3)] * p[1][_G2(k,3)]); + ff[k] += f[k] * tmp / sum; + } + } + for (k = 0; k < 4; ++k) f[k] = ff[k] / (2 * n); + return 0; +} +#endif + + diff --git a/bcftools/extsort.c b/bcftools/extsort.c new file mode 100644 index 0000000..014e03b --- /dev/null +++ b/bcftools/extsort.c @@ -0,0 +1,250 @@ +/* ext-sort.h -- sort on disk + + Copyright (C) 2020-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include // for unlink() +#include // for chmod() +#include +#include +#ifdef _WIN32 +#include +#endif +#include "bcftools.h" +#include "extsort.h" +#include "kheap.h" + +typedef struct +{ + extsort_t *es; // this is to get access to extsort_cmp_f from kheap + int fd; + char *fname; + void *dat; +} +blk_t; + +static inline int blk_is_smaller(blk_t **aptr, blk_t **bptr); +KHEAP_INIT(blk, blk_t*, blk_is_smaller) /* defines khp_blk_t */ + +struct _extsort_t +{ + size_t dat_size, mem, max_mem; + char *tmp_prefix; + extsort_cmp_f cmp; + + size_t nbuf, mbuf, nblk; + blk_t **blk; + void **buf, *tmp_dat; + khp_blk_t *bhp; +}; + +static inline int blk_is_smaller(blk_t **aptr, blk_t **bptr) +{ + blk_t *a = *aptr; + blk_t *b = *bptr; + int ret = a->es->cmp(&a->dat,&b->dat); + if ( ret < 0 ) return 1; + return 0; +} + +size_t parse_mem_string(const char *str); + +void extsort_set(extsort_t *es, extsort_opt_t key, void *value) +{ + if ( key==DAT_SIZE ) { es->dat_size = *((size_t*)value); return; } + if ( key==MAX_MEM ) + { + es->max_mem = parse_mem_string(*((const char**)value)); + if ( es->max_mem <=0 ) error("Could not parse the memory string, expected positive number: %s\n",*((const char**)value)); + return; + } + if ( key==TMP_PREFIX ) { es->tmp_prefix = init_tmp_prefix(*((const char**)value)); return; } + if ( key==FUNC_CMP ) { es->cmp = *((extsort_cmp_f*)value); return; } +} + +extsort_t *extsort_alloc(void) +{ + extsort_t *es = (extsort_t*) calloc(1,sizeof(*es)); + es->max_mem = 100e6; + return es; +} +void extsort_init(extsort_t *es) +{ + assert( es->cmp ); + assert( es->dat_size ); + if ( !es->tmp_prefix ) es->tmp_prefix = init_tmp_prefix(NULL); + es->tmp_dat = malloc(es->dat_size); +} + +void extsort_destroy(extsort_t *es) +{ + int i; + for (i=0; inblk; i++) + { + blk_t *blk = es->blk[i]; + if ( blk->fd!=-1 ) +#ifdef _WIN32 + _close(blk->fd); +#else + close(blk->fd); +#endif + free(blk->fname); + free(blk->dat); + free(blk); + } + free(es->tmp_dat); + free(es->tmp_prefix); + free(es->blk); + khp_destroy(blk, es->bhp); + free(es); +} + +static void _buf_flush(extsort_t *es) +{ + int i; + if ( !es->nbuf ) return; + + qsort(es->buf, es->nbuf, sizeof(void*), es->cmp); + + es->nblk++; + es->blk = (blk_t**) realloc(es->blk, sizeof(blk_t*)*es->nblk); + es->blk[es->nblk-1] = (blk_t*) calloc(1,sizeof(blk_t)); + blk_t *blk = es->blk[es->nblk-1]; + blk->es = es; + blk->dat = malloc(es->dat_size); + blk->fname = strdup(es->tmp_prefix); + #ifdef _WIN32 + for (i=0; i<100000; i++) + { + memcpy(blk->fname,es->tmp_prefix,strlen(es->tmp_prefix)); + mktemp(blk->fname); + blk->fd = _open(blk->fname, O_RDWR|O_CREAT|O_EXCL|O_BINARY|O_TEMPORARY, 0600); + if ( blk->fd==-1 ) + { + if ( errno==EEXIST ) continue; + error("Error: failed to open a temporary file %s\n",blk->fname); + } + break; + } + if ( !blk->fd ) error("Error: failed to create a unique temporary file name from %s\n",es->tmp_prefix); + if ( _chmod(blk->fname, S_IRUSR|S_IWUSR)!=0 ) error("Error: failed to set permissions of the temporary file %s\n",blk->fname); + #else + if ( (blk->fd = mkstemp(blk->fname))==-1 ) + error("Error: failed to open a temporary file %s\n",blk->fname); + if ( fchmod(blk->fd,S_IRUSR|S_IWUSR)!=0 ) error("Error: failed to set permissions of the temporary file %s\n",blk->fname); + unlink(blk->fname); // should auto delete when closed on linux, the descriptor remains open + #endif + + for (i=0; inbuf; i++) + { + #ifdef _WIN32 + if ( _write(blk->fd, es->buf[i], es->dat_size)!=es->dat_size ) error("Error: failed to write %zu bytes to the temporary file %s\n",es->dat_size,blk->fname); + #else + if ( write(blk->fd, es->buf[i], es->dat_size)!=es->dat_size ) error("Error: failed to write %zu bytes to the temporary file %s\n",es->dat_size,blk->fname); + #endif + free(es->buf[i]); + } +#ifdef _WIN32 + if ( _lseek(blk->fd,0,SEEK_SET)!=0 ) error("Error: failed to lseek() to the start of the temporary file %s\n", blk->fname); +#else + if ( lseek(blk->fd,0,SEEK_SET)!=0 ) error("Error: failed to lseek() to the start of the temporary file %s\n", blk->fname); +#endif + + es->nbuf = 0; + es->mem = 0; +} + +void extsort_push(extsort_t *es, void *dat) +{ + int delta = sizeof(void*) + es->dat_size; + if ( es->nbuf && es->mem + delta > es->max_mem ) _buf_flush(es); + es->nbuf++; + es->mem += delta; + hts_expand(void*, es->nbuf, es->mbuf, es->buf); + es->buf[es->nbuf-1] = dat; +} + +// return number of elements read +static ssize_t _blk_read(extsort_t *es, blk_t *blk) +{ + ssize_t ret = 0; + if ( blk->fd==-1 ) return ret; +#ifdef _WIN32 + ret = _read(blk->fd, blk->dat, es->dat_size); +#else + ret = read(blk->fd, blk->dat, es->dat_size); +#endif + if ( ret < 0 ) error("Error: failed to read from the temporary file %s\n", blk->fname); + if ( ret == 0 ) + { +#ifdef _WIN32 + if ( _close(blk->fd)!=0 ) error("Error: failed to close the temporary file %s\n", blk->fname); +#else + if ( close(blk->fd)!=0 ) error("Error: failed to close the temporary file %s\n", blk->fname); +#endif + blk->fd = -1; + return ret; + } + if ( ret < es->dat_size ) error("Error: failed to read %zu bytes from the temporary file %s\n",es->dat_size,blk->fname); + return ret; +} + +void extsort_sort(extsort_t *es) +{ + _buf_flush(es); + free(es->buf); + es->buf = NULL; + es->bhp = khp_init(blk); + + // open all blocks, read one record from each, create a heap + int i; + for (i=0; inblk; i++) + { + blk_t *blk = es->blk[i]; +#ifdef _WIN32 + if ( _lseek(blk->fd,0,SEEK_SET)!=0 ) error("Error: failed to lseek() to the start of the temporary file %s\n", blk->fname); +#else + if ( lseek(blk->fd,0,SEEK_SET)!=0 ) error("Error: failed to lseek() to the start of the temporary file %s\n", blk->fname); +#endif + int ret = _blk_read(es, blk); + if ( ret ) khp_insert(blk, es->bhp, &blk); + } +} + +void *extsort_shift(extsort_t *es) +{ + if ( !es->bhp->ndat ) return NULL; + blk_t *blk = es->bhp->dat[0]; + + // swap the pointer which keeps the location of user data so that it is not overwritten by the next read + void *tmp = es->tmp_dat; es->tmp_dat = blk->dat; blk->dat = tmp; + khp_delete(blk, es->bhp); + + int ret = _blk_read(es, blk); + if ( ret ) khp_insert(blk, es->bhp, &blk); + + return es->tmp_dat; +} + diff --git a/bcftools/extsort.c.pysam.c b/bcftools/extsort.c.pysam.c new file mode 100644 index 0000000..1b410a7 --- /dev/null +++ b/bcftools/extsort.c.pysam.c @@ -0,0 +1,252 @@ +#include "bcftools.pysam.h" + +/* ext-sort.h -- sort on disk + + Copyright (C) 2020-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include // for unlink() +#include // for chmod() +#include +#include +#ifdef _WIN32 +#include +#endif +#include "bcftools.h" +#include "extsort.h" +#include "kheap.h" + +typedef struct +{ + extsort_t *es; // this is to get access to extsort_cmp_f from kheap + int fd; + char *fname; + void *dat; +} +blk_t; + +static inline int blk_is_smaller(blk_t **aptr, blk_t **bptr); +KHEAP_INIT(blk, blk_t*, blk_is_smaller) /* defines khp_blk_t */ + +struct _extsort_t +{ + size_t dat_size, mem, max_mem; + char *tmp_prefix; + extsort_cmp_f cmp; + + size_t nbuf, mbuf, nblk; + blk_t **blk; + void **buf, *tmp_dat; + khp_blk_t *bhp; +}; + +static inline int blk_is_smaller(blk_t **aptr, blk_t **bptr) +{ + blk_t *a = *aptr; + blk_t *b = *bptr; + int ret = a->es->cmp(&a->dat,&b->dat); + if ( ret < 0 ) return 1; + return 0; +} + +size_t parse_mem_string(const char *str); + +void extsort_set(extsort_t *es, extsort_opt_t key, void *value) +{ + if ( key==DAT_SIZE ) { es->dat_size = *((size_t*)value); return; } + if ( key==MAX_MEM ) + { + es->max_mem = parse_mem_string(*((const char**)value)); + if ( es->max_mem <=0 ) error("Could not parse the memory string, expected positive number: %s\n",*((const char**)value)); + return; + } + if ( key==TMP_PREFIX ) { es->tmp_prefix = init_tmp_prefix(*((const char**)value)); return; } + if ( key==FUNC_CMP ) { es->cmp = *((extsort_cmp_f*)value); return; } +} + +extsort_t *extsort_alloc(void) +{ + extsort_t *es = (extsort_t*) calloc(1,sizeof(*es)); + es->max_mem = 100e6; + return es; +} +void extsort_init(extsort_t *es) +{ + assert( es->cmp ); + assert( es->dat_size ); + if ( !es->tmp_prefix ) es->tmp_prefix = init_tmp_prefix(NULL); + es->tmp_dat = malloc(es->dat_size); +} + +void extsort_destroy(extsort_t *es) +{ + int i; + for (i=0; inblk; i++) + { + blk_t *blk = es->blk[i]; + if ( blk->fd!=-1 ) +#ifdef _WIN32 + _close(blk->fd); +#else + close(blk->fd); +#endif + free(blk->fname); + free(blk->dat); + free(blk); + } + free(es->tmp_dat); + free(es->tmp_prefix); + free(es->blk); + khp_destroy(blk, es->bhp); + free(es); +} + +static void _buf_flush(extsort_t *es) +{ + int i; + if ( !es->nbuf ) return; + + qsort(es->buf, es->nbuf, sizeof(void*), es->cmp); + + es->nblk++; + es->blk = (blk_t**) realloc(es->blk, sizeof(blk_t*)*es->nblk); + es->blk[es->nblk-1] = (blk_t*) calloc(1,sizeof(blk_t)); + blk_t *blk = es->blk[es->nblk-1]; + blk->es = es; + blk->dat = malloc(es->dat_size); + blk->fname = strdup(es->tmp_prefix); + #ifdef _WIN32 + for (i=0; i<100000; i++) + { + memcpy(blk->fname,es->tmp_prefix,strlen(es->tmp_prefix)); + mktemp(blk->fname); + blk->fd = _open(blk->fname, O_RDWR|O_CREAT|O_EXCL|O_BINARY|O_TEMPORARY, 0600); + if ( blk->fd==-1 ) + { + if ( errno==EEXIST ) continue; + error("Error: failed to open a temporary file %s\n",blk->fname); + } + break; + } + if ( !blk->fd ) error("Error: failed to create a unique temporary file name from %s\n",es->tmp_prefix); + if ( _chmod(blk->fname, S_IRUSR|S_IWUSR)!=0 ) error("Error: failed to set permissions of the temporary file %s\n",blk->fname); + #else + if ( (blk->fd = mkstemp(blk->fname))==-1 ) + error("Error: failed to open a temporary file %s\n",blk->fname); + if ( fchmod(blk->fd,S_IRUSR|S_IWUSR)!=0 ) error("Error: failed to set permissions of the temporary file %s\n",blk->fname); + unlink(blk->fname); // should auto delete when closed on linux, the descriptor remains open + #endif + + for (i=0; inbuf; i++) + { + #ifdef _WIN32 + if ( _write(blk->fd, es->buf[i], es->dat_size)!=es->dat_size ) error("Error: failed to write %zu bytes to the temporary file %s\n",es->dat_size,blk->fname); + #else + if ( write(blk->fd, es->buf[i], es->dat_size)!=es->dat_size ) error("Error: failed to write %zu bytes to the temporary file %s\n",es->dat_size,blk->fname); + #endif + free(es->buf[i]); + } +#ifdef _WIN32 + if ( _lseek(blk->fd,0,SEEK_SET)!=0 ) error("Error: failed to lseek() to the start of the temporary file %s\n", blk->fname); +#else + if ( lseek(blk->fd,0,SEEK_SET)!=0 ) error("Error: failed to lseek() to the start of the temporary file %s\n", blk->fname); +#endif + + es->nbuf = 0; + es->mem = 0; +} + +void extsort_push(extsort_t *es, void *dat) +{ + int delta = sizeof(void*) + es->dat_size; + if ( es->nbuf && es->mem + delta > es->max_mem ) _buf_flush(es); + es->nbuf++; + es->mem += delta; + hts_expand(void*, es->nbuf, es->mbuf, es->buf); + es->buf[es->nbuf-1] = dat; +} + +// return number of elements read +static ssize_t _blk_read(extsort_t *es, blk_t *blk) +{ + ssize_t ret = 0; + if ( blk->fd==-1 ) return ret; +#ifdef _WIN32 + ret = _read(blk->fd, blk->dat, es->dat_size); +#else + ret = read(blk->fd, blk->dat, es->dat_size); +#endif + if ( ret < 0 ) error("Error: failed to read from the temporary file %s\n", blk->fname); + if ( ret == 0 ) + { +#ifdef _WIN32 + if ( _close(blk->fd)!=0 ) error("Error: failed to close the temporary file %s\n", blk->fname); +#else + if ( close(blk->fd)!=0 ) error("Error: failed to close the temporary file %s\n", blk->fname); +#endif + blk->fd = -1; + return ret; + } + if ( ret < es->dat_size ) error("Error: failed to read %zu bytes from the temporary file %s\n",es->dat_size,blk->fname); + return ret; +} + +void extsort_sort(extsort_t *es) +{ + _buf_flush(es); + free(es->buf); + es->buf = NULL; + es->bhp = khp_init(blk); + + // open all blocks, read one record from each, create a heap + int i; + for (i=0; inblk; i++) + { + blk_t *blk = es->blk[i]; +#ifdef _WIN32 + if ( _lseek(blk->fd,0,SEEK_SET)!=0 ) error("Error: failed to lseek() to the start of the temporary file %s\n", blk->fname); +#else + if ( lseek(blk->fd,0,SEEK_SET)!=0 ) error("Error: failed to lseek() to the start of the temporary file %s\n", blk->fname); +#endif + int ret = _blk_read(es, blk); + if ( ret ) khp_insert(blk, es->bhp, &blk); + } +} + +void *extsort_shift(extsort_t *es) +{ + if ( !es->bhp->ndat ) return NULL; + blk_t *blk = es->bhp->dat[0]; + + // swap the pointer which keeps the location of user data so that it is not overwritten by the next read + void *tmp = es->tmp_dat; es->tmp_dat = blk->dat; blk->dat = tmp; + khp_delete(blk, es->bhp); + + int ret = _blk_read(es, blk); + if ( ret ) khp_insert(blk, es->bhp, &blk); + + return es->tmp_dat; +} + diff --git a/bcftools/extsort.h b/bcftools/extsort.h new file mode 100644 index 0000000..ba6282e --- /dev/null +++ b/bcftools/extsort.h @@ -0,0 +1,56 @@ +/* ext-sort.h -- sort on disk + + Copyright (C) 2020 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#ifndef __EXTSORT_H__ +#define __EXTSORT_H__ + +//todo: return status to all functions + +typedef struct _extsort_t extsort_t; + +typedef int (*extsort_cmp_f) (const void *aptr, const void *bptr); + +// Modes of operation +typedef enum +{ + DAT_SIZE, // size_t .. assuming constant size records for now + TMP_PREFIX, // const char* .. prefix of temporary files, XXXXXX will be appended + MAX_MEM, // const char* .. maximum memory to use, e.g. 100MB + FUNC_CMP, // extsort_cmp_f .. sort function +} +extsort_opt_t; + +#define extsort_set_opt(es,type,key,value) { type tmp = value; extsort_set(es, key, (void*)&tmp); } + +extsort_t *extsort_alloc(void); +void extsort_set(extsort_t *es, extsort_opt_t key, void *value); +void extsort_init(extsort_t *es); +void extsort_push(extsort_t *es, void *dat); // dat will be freed by extsort later +void extsort_sort(extsort_t *es); +void *extsort_shift(extsort_t *es); +void extsort_destroy(extsort_t *es); + +#endif diff --git a/bcftools/filter.c b/bcftools/filter.c new file mode 100644 index 0000000..d545608 --- /dev/null +++ b/bcftools/filter.c @@ -0,0 +1,3671 @@ +/* filter.c -- filter expressions. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif +#include +#include +#include +#include +#include +#include "config.h" +#include "filter.h" +#include "bcftools.h" + +#if ENABLE_PERL_FILTERS +# define filter_t perl_filter_t +# include +# include +# undef filter_t +# define my_perl perl + +static int filter_ninit = 0; +#endif + + +#ifndef __FUNCTION__ +# define __FUNCTION__ __func__ +#endif + +typedef struct _token_t +{ + // read-only values, same for all VCF lines + int tok_type; // one of the TOK_* keys below + int nargs; // with TOK_PERLSUB the first argument is the name of the subroutine + char *key; // set only for string constants, otherwise NULL + char *tag; // for debugging and printout only, VCF tag name + double threshold; // filtering threshold + int is_constant; // the threshold is set + int hdr_id, tag_type; // BCF header lookup ID and one of BCF_HL_* types + int idx; // 0-based index to VCF vectors, + // -2: list (e.g. [0,1,2] or [1..3] or [1..] or any field[*], which is equivalent to [0..]) + int *idxs; // set indexes to 0 to exclude, to 1 to include, and last element negative if unlimited; used by VCF retrievers only + int nidxs, nuidxs; // size of idxs array and the number of elements set to 1 + uint8_t *usmpl; // bitmask of used samples as set by idx, set for FORMAT fields, NULL otherwise + int nsamples; // number of samples for format fields, 0 for info and other fields + void (*setter)(filter_t *, bcf1_t *, struct _token_t *); + int (*func)(filter_t *, bcf1_t *, struct _token_t *rtok, struct _token_t **stack, int nstack); + void (*comparator)(struct _token_t *, struct _token_t *, struct _token_t *rtok, bcf1_t *); + void *hash; // test presence of str value in the hash via comparator + regex_t *regex; // precompiled regex for string comparison + + // modified on filter evaluation at each VCF line + double *values; + kstring_t str_value; + int is_str, is_missing; // is_missing is set only for constants, variables are controled via nvalues + int pass_site; // -1 not applicable, 0 fails, >0 pass + uint8_t *pass_samples; // status of individual samples + int nvalues, mvalues; // number of used values: n=0 for missing values, n=1 for scalars, for strings n=str_value.l + int nval1; // number of per-sample fields or string length +} +token_t; + +struct _filter_t +{ + bcf_hdr_t *hdr; + char *str; + int nfilters; + token_t *filters, **flt_stack; // filtering input tokens (in RPN) and evaluation stack + int32_t *tmpi; + float *tmpf; + kstring_t tmps; + int max_unpack, mtmpi, mtmpf, nsamples; +#if ENABLE_PERL_FILTERS + PerlInterpreter *perl; +#endif +}; + + +#define TOK_VAL 0 +#define TOK_LFT 1 // ( +#define TOK_RGT 2 // ) +#define TOK_LE 3 // less or equal +#define TOK_LT 4 // less than +#define TOK_EQ 5 // equal +#define TOK_BT 6 // bigger than +#define TOK_BE 7 // bigger or equal +#define TOK_NE 8 // not equal +#define TOK_OR 9 // | +#define TOK_AND 10 // & +#define TOK_ADD 11 // + +#define TOK_SUB 12 // - +#define TOK_MULT 13 // * +#define TOK_DIV 14 // / +#define TOK_MAX 15 +#define TOK_MIN 16 +#define TOK_AVG 17 +#define TOK_AND_VEC 18 // && (operator applied in samples) +#define TOK_OR_VEC 19 // || (operator applied in samples) +#define TOK_LIKE 20 // ~ regular expression +#define TOK_NLIKE 21 // !~ regular expression +#define TOK_SUM 22 +#define TOK_ABS 23 +#define TOK_LEN 24 +#define TOK_FUNC 25 +#define TOK_CNT 26 +#define TOK_PERLSUB 27 +#define TOK_BINOM 28 +#define TOK_PHRED 29 +#define TOK_MEDIAN 30 +#define TOK_STDEV 31 +#define TOK_sMAX 32 +#define TOK_sMIN 33 +#define TOK_sAVG 34 +#define TOK_sMEDIAN 35 +#define TOK_sSTDEV 36 +#define TOK_sSUM 37 +#define TOK_IN 38 // contains, e.g. FILTER~"A" +#define TOK_NOT_IN 39 // does not contain, e.g. FILTER!~"A" +#define TOK_MODULO 40 // % + +// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 +// ( ) [ < = > ] ! | & + - * / M m a A O ~ ^ S . l f c p b P i s % +static int op_prec[] = {0,1,1,5,5,5,5,5,5,2,3, 6, 6, 7, 7, 8, 8, 8, 3, 2, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7 }; +#define TOKEN_STRING "x()[<=>]!|&+-*/MmaAO~^S.lfcpis" // this is only for debugging, not maintained diligently + +static void cmp_vector_strings(token_t *atok, token_t *btok, token_t *rtok); + +// Return negative values if it is a function with variable number of arguments +static int filters_next_token(char **str, int *len) +{ + char *tmp = *str; + while ( *tmp && isspace(*tmp) ) tmp++; + *str = tmp; + *len = 0; + + // test for doubles: d.ddde[+-]dd + if ( isdigit(*str[0]) || *str[0]=='.' ) // strtod would eat +/- + { + double HTS_UNUSED v = strtod(*str, &tmp); + if ( *str!=tmp && (!tmp[0] || !isalnum(tmp[0])) ) + { + *len = tmp - (*str); + return TOK_VAL; + } + tmp = *str; + } + + if ( !strncasecmp(tmp,"SMPL_MAX(",9) ) { (*str) += 8; return TOK_sMAX; } + if ( !strncasecmp(tmp,"SMPL_MIN(",9) ) { (*str) += 8; return TOK_sMIN; } + if ( !strncasecmp(tmp,"SMPL_MEAN(",10) ) { (*str) += 9; return TOK_sAVG; } + if ( !strncasecmp(tmp,"SMPL_MEDIAN(",12) ) { (*str) += 11; return TOK_sMEDIAN; } + if ( !strncasecmp(tmp,"SMPL_AVG(",9) ) { (*str) += 8; return TOK_sAVG; } + if ( !strncasecmp(tmp,"SMPL_STDEV(",11) ) { (*str) += 10; return TOK_sSTDEV; } + if ( !strncasecmp(tmp,"SMPL_SUM(",9) ) { (*str) += 8; return TOK_sSUM; } + if ( !strncasecmp(tmp,"sMAX(",5) ) { (*str) += 4; return TOK_sMAX; } + if ( !strncasecmp(tmp,"sMIN(",5) ) { (*str) += 4; return TOK_sMIN; } + if ( !strncasecmp(tmp,"sMEAN(",6) ) { (*str) += 5; return TOK_sAVG; } + if ( !strncasecmp(tmp,"sMEDIAN(",8) ) { (*str) += 7; return TOK_sMEDIAN; } + if ( !strncasecmp(tmp,"sAVG(",5) ) { (*str) += 4; return TOK_sAVG; } + if ( !strncasecmp(tmp,"sSTDEV(",7) ) { (*str) += 6; return TOK_sSTDEV; } + if ( !strncasecmp(tmp,"sSUM(",5) ) { (*str) += 4; return TOK_sSUM; } + if ( !strncasecmp(tmp,"MAX(",4) ) { (*str) += 3; return TOK_MAX; } + if ( !strncasecmp(tmp,"MIN(",4) ) { (*str) += 3; return TOK_MIN; } + if ( !strncasecmp(tmp,"MEAN(",5) ) { (*str) += 4; return TOK_AVG; } + if ( !strncasecmp(tmp,"MEDIAN(",7) ) { (*str) += 6; return TOK_MEDIAN; } + if ( !strncasecmp(tmp,"AVG(",4) ) { (*str) += 3; return TOK_AVG; } + if ( !strncasecmp(tmp,"STDEV(",6) ) { (*str) += 5; return TOK_STDEV; } + if ( !strncasecmp(tmp,"SUM(",4) ) { (*str) += 3; return TOK_SUM; } + if ( !strncasecmp(tmp,"ABS(",4) ) { (*str) += 3; return TOK_ABS; } + if ( !strncasecmp(tmp,"COUNT(",4) ) { (*str) += 5; return TOK_CNT; } + if ( !strncasecmp(tmp,"STRLEN(",7) ) { (*str) += 6; return TOK_LEN; } + if ( !strncasecmp(tmp,"BINOM(",6) ) { (*str) += 5; return -TOK_BINOM; } + if ( !strncasecmp(tmp,"PHRED(",6) ) { (*str) += 5; return TOK_PHRED; } + if ( !strncasecmp(tmp,"%MAX(",5) ) { (*str) += 4; return TOK_MAX; } // for backward compatibility + if ( !strncasecmp(tmp,"%MIN(",5) ) { (*str) += 4; return TOK_MIN; } // for backward compatibility + if ( !strncasecmp(tmp,"%AVG(",5) ) { (*str) += 4; return TOK_AVG; } // for backward compatibility + if ( !strncasecmp(tmp,"%SUM(",5) ) { (*str) += 4; return TOK_SUM; } // for backward compatibility + if ( !strncasecmp(tmp,"INFO/",5) ) tmp += 5; + if ( !strncasecmp(tmp,"FORMAT/",7) ) tmp += 7; + if ( !strncasecmp(tmp,"FMT/",4) ) tmp += 4; + if ( !strncasecmp(tmp,"PERL.",5) ) { (*str) += 5; return -TOK_PERLSUB; } + if ( !strncasecmp(tmp,"N_PASS(",7) ) { *len = 6; (*str) += 6; return -TOK_FUNC; } + if ( !strncasecmp(tmp,"F_PASS(",7) ) { *len = 6; (*str) += 6; return -TOK_FUNC; } + if ( !strncasecmp(tmp,"%ILEN",5) ) { *len = 5; return TOK_VAL; } // to be able to distinguish between INFO/ILEN and on-the-fly ILEN + + if ( tmp[0]=='@' ) // file name + { + while ( *tmp && !isspace(*tmp) && *tmp!='=' && *tmp!='!' ) tmp++; + *len = tmp - (*str); + return TOK_VAL; + } + + int square_brackets = 0; + while ( tmp[0] ) + { + if ( !square_brackets ) + { + if ( tmp[0]=='"' ) break; + if ( tmp[0]=='\'' ) break; + if ( isspace(tmp[0]) ) break; + if ( tmp[0]=='<' ) break; + if ( tmp[0]=='>' ) break; + if ( tmp[0]=='=' ) break; + if ( tmp[0]=='!' ) break; + if ( tmp[0]=='&' ) break; + if ( tmp[0]=='|' ) break; + if ( tmp[0]=='(' ) break; + if ( tmp[0]==')' ) break; + if ( tmp[0]=='+' ) break; + if ( tmp[0]=='*' ) break; + if ( tmp[0]=='-' ) break; + if ( tmp[0]=='/' ) break; + if ( tmp[0]=='~' ) break; + if ( tmp[0]=='%' ) break; + } + if ( tmp[0]==']' ) { if (square_brackets) tmp++; break; } + if ( tmp[0]=='[' ) square_brackets++; + tmp++; + } + if ( tmp > *str ) + { + *len = tmp - (*str); + return TOK_VAL; + } + if ( tmp[0]=='"' || tmp[0]=='\'' ) + { + int quote = tmp[0]; + tmp++; + while ( *tmp && tmp[0]!=quote ) tmp++; + if ( !*tmp ) return -1; // missing quotes + *len = tmp - (*str) + 1; + return TOK_VAL; + } + if ( tmp[0]=='!' ) + { + if ( tmp[1]=='=' ) { (*str) += 2; return TOK_NE; } + if ( tmp[1]=='~' ) { (*str) += 2; return TOK_NLIKE; } + } + if ( tmp[0]=='<' ) + { + if ( tmp[1]=='=' ) { (*str) += 2; return TOK_LE; } + (*str) += 1; return TOK_LT; + } + if ( tmp[0]=='>' ) + { + if ( tmp[1]=='=' ) { (*str) += 2; return TOK_BE; } + (*str) += 1; return TOK_BT; + } + if ( tmp[0]=='=' ) + { + if ( tmp[1]=='=' ) { (*str) += 2; return TOK_EQ; } + (*str) += 1; return TOK_EQ; + } + if ( tmp[0]=='(' ) { (*str) += 1; return TOK_LFT; } + if ( tmp[0]==')' ) { (*str) += 1; return TOK_RGT; } + if ( tmp[0]=='&' && tmp[1]=='&' ) { (*str) += 2; return TOK_AND_VEC; } + if ( tmp[0]=='|' && tmp[1]=='|' ) { (*str) += 2; return TOK_OR_VEC; } + if ( tmp[0]=='&' ) { (*str) += 1; return TOK_AND; } + if ( tmp[0]=='|' ) { (*str) += 1; return TOK_OR; } + if ( tmp[0]=='+' ) { (*str) += 1; return TOK_ADD; } + if ( tmp[0]=='-' ) { (*str) += 1; return TOK_SUB; } + if ( tmp[0]=='*' ) { (*str) += 1; return TOK_MULT; } + if ( tmp[0]=='/' ) { (*str) += 1; return TOK_DIV; } + if ( tmp[0]=='~' ) { (*str) += 1; return TOK_LIKE; } + if ( tmp[0]=='%' ) { (*str) += 1; return TOK_MODULO; } + + *len = tmp - (*str); + return TOK_VAL; +} + + +/* + Simple path expansion, expands ~/, ~user, $var. The result must be freed by the caller. + + Based on jkb's staden code with some adjustments. + https://sourceforge.net/p/staden/code/HEAD/tree/staden/trunk/src/Misc/getfile.c#l123 +*/ +char *expand_path(char *path) +{ + kstring_t str = {0,0,0}; + + if ( path[0] == '~' ) + { + if ( !path[1] || path[1] == '/' ) + { +#ifdef _WIN32 + kputs(getenv("HOMEDRIVE"), &str); + kputs(getenv("HOMEPATH"), &str); +#else + // ~ or ~/path + kputs(getenv("HOME"), &str); + if ( path[1] ) kputs(path+1, &str); +#endif + } +#ifndef _WIN32 + else + { + // user name: ~pd3/path + char *end = path; + while ( *end && *end!='/' ) end++; + kputsn(path+1, end-path-1, &str); + struct passwd *pwentry = getpwnam(str.s); + str.l = 0; + + if ( !pwentry ) kputsn(path, end-path, &str); + else kputs(pwentry->pw_dir, &str); + kputs(end, &str); + } +#endif + return ks_release(&str); + } + if ( path[0] == '$' ) + { + char *var = getenv(path+1); + if ( var ) { + kputs(var, &str); + return ks_release(&str); + } + } + + return strdup(path); +} + +static void filters_set_qual(filter_t *flt, bcf1_t *line, token_t *tok) +{ + float *ptr = &line->qual; + if ( bcf_float_is_missing(*ptr) ) + bcf_double_set_missing(tok->values[0]); + else + tok->values[0] = (double)line->qual; + tok->nvalues = 1; +} +static void filters_set_type(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->values[0] = bcf_get_variant_types(line); + if ( !tok->values[0] ) tok->values[0] = 1; // mistake in htslib: VCF_* should start with 1 + else tok->values[0] = ((int)tok->values[0]) << 1; + tok->nvalues = 1; +} +static void filters_set_info(filter_t *flt, bcf1_t *line, token_t *tok) +{ + assert( tok->hdr_id >=0 ); + int i; + for (i=0; in_info; i++) + if ( line->d.info[i].key == tok->hdr_id ) break; + + if ( i==line->n_info ) + tok->nvalues = tok->str_value.l = 0; + else if ( line->d.info[i].type==BCF_BT_CHAR ) + { + int n = line->d.info[i].len; + if ( n >= tok->str_value.m ) + { + tok->str_value.m = n + 1; + tok->str_value.s = (char*) realloc(tok->str_value.s, tok->str_value.m); + if ( !tok->str_value.s ) error("Failed to alloc %d bytes\n", (int)tok->str_value.m); + } + memcpy(tok->str_value.s, line->d.info[i].vptr, n); + tok->str_value.s[n] = 0; + tok->nvalues = tok->str_value.l = n; + } + else if ( line->d.info[i].type==BCF_BT_FLOAT ) + { + if ( bcf_float_is_missing(line->d.info[i].v1.f) ) tok->nvalues = 0; + else + { + tok->values[0] = line->d.info[i].v1.f; + tok->nvalues = 1; + } + tok->str_value.l = 0; + } + else + { + tok->str_value.l = 0; + if ( line->d.info[i].type==BCF_BT_INT8 && line->d.info[i].v1.i==bcf_int8_missing ) tok->nvalues = 0; + else if ( line->d.info[i].type==BCF_BT_INT16 && line->d.info[i].v1.i==bcf_int16_missing ) tok->nvalues = 0; + else if ( line->d.info[i].type==BCF_BT_INT32 && line->d.info[i].v1.i==bcf_int32_missing ) tok->nvalues = 0; + else + { + tok->values[0] = line->d.info[i].v1.i; + tok->nvalues = 1; + } + } +} +static void filters_cmp_bit_and(token_t *atok, token_t *btok, token_t *rtok, bcf1_t *line) +{ + int a = (int)(atok->nvalues?atok->values[0]:atok->threshold); + int b = (int)(btok->nvalues?btok->values[0]:btok->threshold); + if ( rtok->tok_type==TOK_LIKE ) + rtok->pass_site = a&b ? 1 : 0; + else + rtok->pass_site = a&b ? 0 : 1; +} +static void filters_cmp_filter(token_t *atok, token_t *btok, token_t *rtok, bcf1_t *line) +{ + // the btok values contain FILTER ids obtained by parsing the user expression + int i,j; + if ( rtok->tok_type==TOK_NOT_IN ) // fail if the query expression is a subset of the VCF FILTER + { + if ( !btok->nvalues ) // the query expression is ".", pass everything unless the VCF is also "." + { + if ( line->d.n_flt ) rtok->pass_site = 1; + return; + } + if ( !line->d.n_flt ) // no filters at this VCF line and the query expression has a value + { + rtok->pass_site = 1; + return; + } + for (j=0; jnvalues; j++) // some query expression value must be absent from VCF in order to pass + { + for (i=0; id.n_flt; i++) + if ( btok->values[j]==line->d.flt[i] ) break; + if ( i==line->d.n_flt ) break; // the query is not in the VCF + } + if ( j!=btok->nvalues ) rtok->pass_site = 1; + return; + } + else if ( rtok->tok_type==TOK_IN ) + { + if ( !btok->nvalues ) // the query expression is ".", fail everything unless the VCF is also "." + { + if ( !line->d.n_flt ) rtok->pass_site = 1; + return; + } + if ( !line->d.n_flt ) return; // no filters at this VCF line and the query expression has a value + for (j=0; jnvalues; j++) // all of the query values must be present in the VCF in order to pass + { + for (i=0; id.n_flt; i++) + if ( btok->values[j]==line->d.flt[i] ) break; + if ( i==line->d.n_flt ) break; // the query is not in the VCF + } + if ( j==btok->nvalues ) rtok->pass_site = 1; + return; + } + else if ( rtok->tok_type==TOK_NE ) // require anything but exact match + { + if ( btok->nvalues != line->d.n_flt ) + { + rtok->pass_site = 1; + return; + } + if ( !btok->nvalues ) return; + for (j=0; jnvalues; j++) // some of the query values must be absent from the VCF in order to pass + { + for (i=0; id.n_flt; i++) + if ( btok->values[j]==line->d.flt[i] ) break; + if ( i==line->d.n_flt ) break; // the query is not in the VCF + } + if ( j!=btok->nvalues ) rtok->pass_site = 1; + return; + } + else if ( rtok->tok_type==TOK_EQ ) // require exact match + { + if ( btok->nvalues != line->d.n_flt ) return; + if ( !btok->nvalues ) + { + rtok->pass_site = 1; + return; + } + for (j=0; jnvalues; j++) // all of the query values must be present in the VCF in order to pass + { + for (i=0; id.n_flt; i++) + if ( btok->values[j]==line->d.flt[i] ) break; + if ( i==line->d.n_flt ) break; // the query is not in the VCF + } + if ( j==btok->nvalues ) rtok->pass_site = 1; + return; + } + else + error("Only ==, !=, ~, and !~ operators are supported for FILTER\n"); + return; +} +static void filters_cmp_id(token_t *atok, token_t *btok, token_t *rtok, bcf1_t *line) +{ + if ( btok->hash ) + { + token_t *tmp = atok; atok = btok; btok = tmp; + } + if ( atok->hash ) + { + if ( rtok->tok_type!=TOK_EQ && rtok->tok_type!=TOK_NE ) + error("Only == and != operators are supported for strings read from a file\n"); + + int ret = khash_str2int_has_key(atok->hash, line->d.id); + if ( rtok->tok_type==TOK_NE ) ret = ret ? 0 : 1; + rtok->pass_site = ret; + return; + } + + if ( !btok->str_value.l ) error("Error occurred while evaluating the expression\n"); + + if ( rtok->tok_type==TOK_EQ ) + rtok->pass_site = strcmp(btok->str_value.s,line->d.id) ? 0 : 1; + else if ( rtok->tok_type==TOK_NE ) + rtok->pass_site = strcmp(btok->str_value.s,line->d.id) ? 1 : 0; + else + { + if ( rtok->tok_type!=TOK_LIKE && rtok->tok_type!=TOK_NLIKE ) + error("Only the following operators are supported for querying ID: ==, !=, ~, !~; the operator type %d is not supported (%p %p)\n", + rtok->tok_type,atok->regex,btok->regex); + + regex_t *regex = atok->regex ? atok->regex : (btok->regex ? btok->regex : NULL); + if ( !regex ) error("fixme: regex initialization failed\n"); + rtok->pass_site = regexec(regex,line->d.id, 0,NULL,0) ? 0 : 1; + if ( rtok->tok_type==TOK_NLIKE ) rtok->pass_site = rtok->pass_site ? 0 : 1; + } +} + +/** + * bcf_get_info_value() - get single INFO value, int64_t or double + * @line: BCF line + * @info_id: tag ID, as returned by bcf_hdr_id2int + * @ivec: 0-based index to retrieve, -1 when single value is expected + * @vptr: pointer to memory location of sufficient size to accomodate + * info_id's type + * + * The returned value is -1 if tag is not present, 0 if present but + * values is missing or ivec is out of range, and 1 on success. + */ +static int bcf_get_info_value(bcf1_t *line, int info_id, int ivec, void *value) +{ + int j; + for (j=0; jn_info; j++) + if ( line->d.info[j].key == info_id ) break; + if ( j==line->n_info ) return -1; + + bcf_info_t *info = &line->d.info[j]; + if ( info->len == 1 ) + { + if ( info->type==BCF_BT_FLOAT ) *((double*)value) = info->v1.f; + else if ( info->type==BCF_BT_INT8 || info->type==BCF_BT_INT16 || info->type==BCF_BT_INT32 ) *((int64_t*)value) = info->v1.i; + return 1; + } + + if ( ivec<0 ) ivec = 0; + + #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ + type_t *p = (type_t *) info->vptr; \ + for (j=0; jlen; j++) \ + { \ + if ( is_vector_end ) return 0; \ + } \ + if ( is_missing ) return 0; \ + *((out_type_t*)value) = p[j]; \ + return 1; \ + } + switch (info->type) { + case BCF_BT_INT8: BRANCH(int8_t, p[j]==bcf_int8_missing, p[j]==bcf_int8_vector_end, int64_t); break; + case BCF_BT_INT16: BRANCH(int16_t, p[j]==bcf_int16_missing, p[j]==bcf_int16_vector_end, int64_t); break; + case BCF_BT_INT32: BRANCH(int32_t, p[j]==bcf_int32_missing, p[j]==bcf_int32_vector_end, int64_t); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(p[j]), bcf_float_is_vector_end(p[j]), double); break; + default: fprintf(stderr,"todo: type %d\n", info->type); exit(1); break; + } + #undef BRANCH + return -1; // this shouldn't happen +} + +static void filters_set_chrom(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->str_value.l = 0; + kputs(bcf_seqname(flt->hdr,line), &tok->str_value); + tok->nvalues = tok->str_value.l; + tok->is_str = 1; +} + +static void filters_set_pos(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->values[0] = line->pos+1; + tok->nvalues = 1; +} + +static void filters_set_info_int(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( tok->idx==-2 ) + { + tok->nvalues = bcf_get_info_int32(flt->hdr,line,tok->tag,&flt->tmpi,&flt->mtmpi); + if ( tok->nvalues<=0 ) tok->nvalues = 0; + else + { + hts_expand(double,tok->nvalues,tok->mvalues,tok->values); + int i, j = 0, end = tok->idxs[tok->nidxs-1] < 0 ? tok->nvalues - 1 : tok->nidxs - 1; + if ( end >= tok->nvalues ) end = tok->nvalues - 1; + for (i=0; i<=end; i++) + if ( i>=tok->nidxs || tok->idxs[i] ) tok->values[j++] = flt->tmpi[i]; + tok->nvalues = j; + } + } + else + { + int64_t value = 0; + if ( bcf_get_info_value(line,tok->hdr_id,tok->idx,&value) <= 0 ) + tok->nvalues = 0; + else + { + tok->values[0] = value; + tok->nvalues = 1; + } + } +} + +static void filters_set_info_float(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( tok->idx==-2 ) + { + tok->nvalues = bcf_get_info_float(flt->hdr,line,tok->tag,&flt->tmpf,&flt->mtmpf); + if ( tok->nvalues<=0 ) tok->nvalues = 0; + else + { + hts_expand(double,tok->nvalues,tok->mvalues,tok->values); + int i, j = 0, end = tok->idxs[tok->nidxs-1] < 0 ? tok->nvalues - 1 : tok->nidxs - 1; + if ( end >= tok->nvalues ) end = tok->nvalues - 1; + for (i=0; i<=end; i++) + if ( i>=tok->nidxs || tok->idxs[i] ) + { + if ( bcf_float_is_missing(flt->tmpf[i]) ) bcf_double_set_missing(tok->values[j]); + else tok->values[j] = flt->tmpf[i]; + j++; + } + tok->nvalues = j; + } + } + else + { + double value; + if ( bcf_get_info_value(line,tok->hdr_id,tok->idx,&value) <= 0 ) + tok->nvalues = 0; + else + { + tok->values[0] = value; + tok->nvalues = 1; + } + } +} + +static void filters_set_info_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + int32_t m = tok->str_value.m; + int n = bcf_get_info_string(flt->hdr,line,tok->tag,&tok->str_value.s,&m); + tok->str_value.m = m; + if ( n<0 ) { tok->nvalues = tok->str_value.l = 0; return; } + + if ( tok->idx>=0 ) + { + // get ith field (i=tok->idx) + int i = 0; + char *ss = tok->str_value.s, *se = tok->str_value.s + n; + while ( ssidx ) + { + if ( *ss==',' ) i++; + ss++; + } + if ( ss==se || i!=tok->idx ) { tok->nvalues = tok->str_value.l = 0; return; } + se = ss; + while ( se - tok->str_value.s < n && *se!=',' ) se++; + if ( ss==tok->str_value.s ) *se = 0; + else + { + memmove(tok->str_value.s, ss, se-ss); + tok->str_value.s[se-ss] = 0; + } + tok->str_value.l = se - ss; + } + else if ( tok->idx==-2 && tok->idxs[0]==-1 ) // keep all values, TAG[*] + tok->str_value.l = n; + else if ( tok->idx==-2 ) + { + flt->tmps.l = 0; + ks_resize(&flt->tmps, n); + int i, iend = tok->idxs[tok->nidxs-1] < 0 ? n - 1 : tok->nidxs - 1; + if ( iend >= n ) iend = n - 1; + char *beg = tok->str_value.s, *dst = flt->tmps.s; + for (i=0; i<=iend; i++) + { + char *end = beg; + while ( *end && *end!=',' ) end++; + if ( i>=tok->nidxs || tok->idxs[i] ) + { + memcpy(dst, beg, end - beg); + dst += end - beg; + dst[0] = ','; + dst++; + } + beg = end+1; + } + dst[0] = 0; + tok->str_value.l = dst - flt->tmps.s; + + #define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } + SWAP(char *, flt->tmps.s, tok->str_value.s); + SWAP(size_t, flt->tmps.m, tok->str_value.m); + } + tok->nvalues = tok->str_value.l; +} + +static void filters_set_info_flag(filter_t *flt, bcf1_t *line, token_t *tok) +{ + int j; + for (j=0; jn_info; j++) + if ( line->d.info[j].key == tok->hdr_id ) break; + tok->values[0] = j==line->n_info ? 0 : 1; + tok->nvalues = 1; +} + +static void filters_set_format_int(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( line->n_sample != tok->nsamples ) + error("Incorrect number of FORMAT fields at %s:%"PRId64" .. %s, %d vs %d\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,tok->tag,line->n_sample,tok->nsamples); + + int nvals; + if ( (nvals=bcf_get_format_int32(flt->hdr,line,tok->tag,&flt->tmpi,&flt->mtmpi))<0 ) + { + tok->nvalues = 0; + return; + } + int i, nsrc1 = nvals / tok->nsamples; + tok->nval1 = tok->idx >= 0 ? 1 : (tok->nuidxs ? tok->nuidxs : nsrc1); + tok->nvalues = tok->nval1*tok->nsamples; + hts_expand(double, tok->nvalues, tok->mvalues, tok->values); + + if ( tok->idx >= 0 ) // scalar or vector index + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + int32_t *ptr = flt->tmpi + i*nsrc1; + if ( tok->idx>=nsrc1 || ptr[tok->idx]==bcf_int32_missing ) + bcf_double_set_missing(tok->values[i]); + else if ( ptr[tok->idx]==bcf_int32_vector_end ) + bcf_double_set_vector_end(tok->values[i]); + else + tok->values[i] = ptr[tok->idx]; + } + } + else + { + int kend = tok->idxs[tok->nidxs-1] < 0 ? tok->nval1 : tok->nidxs; + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + int32_t *src = flt->tmpi + i*nsrc1; + double *dst = tok->values + i*tok->nval1; + int k, j = 0; + for (k=0; knidxs && !tok->idxs[k] ) continue; + if ( src[k]==bcf_int32_missing ) + bcf_double_set_missing(dst[j]); + else if ( src[k]==bcf_int32_vector_end ) + bcf_double_set_vector_end(dst[j]); + else + dst[j] = src[k]; + j++; + } + if ( j==0 ) + { + bcf_double_set_missing(dst[j]); + j++; + } + while (j < tok->nval1) + { + bcf_double_set_vector_end(dst[j]); + j++; + } + } + } +} +static void filters_set_format_float(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( line->n_sample != tok->nsamples ) + error("Incorrect number of FORMAT fields at %s:%"PRId64" .. %s, %d vs %d\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,tok->tag,line->n_sample,tok->nsamples); + + int nvals; + if ( (nvals=bcf_get_format_float(flt->hdr,line,tok->tag,&flt->tmpf,&flt->mtmpf))<0 ) + { + tok->nvalues = 0; + return; + } + int i, nsrc1 = nvals / tok->nsamples; + tok->nval1 = tok->idx >= 0 ? 1 : (tok->nuidxs ? tok->nuidxs : nsrc1); + tok->nvalues = tok->nval1*tok->nsamples; + hts_expand(double, tok->nvalues, tok->mvalues, tok->values); + + if ( tok->idx >= 0 ) // scalar or vector index + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + float *ptr = flt->tmpf + i*nsrc1; + if ( tok->idx>=nsrc1 || bcf_float_is_missing(ptr[tok->idx]) ) + bcf_double_set_missing(tok->values[i]); + else if ( bcf_float_is_vector_end(ptr[tok->idx]) ) + bcf_double_set_vector_end(tok->values[i]); + else + tok->values[i] = ptr[tok->idx]; + } + } + else + { + int kend = tok->idxs[tok->nidxs-1] < 0 ? tok->nval1 : tok->nidxs; + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + float *src = flt->tmpf + i*nsrc1; + double *dst = tok->values + i*tok->nval1; + int k, j = 0; + for (k=0; knidxs && !tok->idxs[k] ) continue; + if ( bcf_float_is_missing(src[k]) ) + bcf_double_set_missing(dst[j]); + else if ( bcf_float_is_vector_end(src[k]) ) + bcf_double_set_vector_end(dst[j]); + else + dst[j] = src[k]; + j++; + } + if ( j==0 ) + { + bcf_double_set_missing(dst[j]); + j++; + } + while (j < tok->nval1) + { + bcf_double_set_vector_end(dst[j]); + j++; + } + } + } +} +static void filters_set_format_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( line->n_sample != tok->nsamples ) + error("Incorrect number of FORMAT fields at %s:%"PRId64" .. %s, %d vs %d\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,tok->tag,line->n_sample,tok->nsamples); + + int i, ndim = tok->str_value.m; + int nstr = bcf_get_format_char(flt->hdr, line, tok->tag, &tok->str_value.s, &ndim); + tok->str_value.m = ndim; + tok->str_value.l = tok->nvalues = 0; + + if ( nstr<0 ) return; + + tok->nvalues = tok->str_value.l = nstr; + tok->nval1 = nstr / tok->nsamples; + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + char *src = tok->str_value.s + i*tok->nval1, *dst = src; + int ibeg = 0, idx = 0; + while ( ibeg < tok->nval1 ) + { + int iend = ibeg; + while ( iend < tok->nval1 && src[iend] && src[iend]!=',' ) iend++; + + int keep = 0; + if ( tok->idx >= 0 ) + { + if ( tok->idx==idx ) keep = 1; + } + else if ( idx < tok->nidxs ) + { + if ( tok->idxs[idx] != 0 ) keep = 1; + } + else if ( tok->idxs[tok->nidxs-1] < 0 ) + keep = 1; + + if ( keep ) + { + if ( ibeg!=0 ) memmove(dst, src+ibeg, iend-ibeg+1); + dst += iend - ibeg + 1; + if ( tok->idx>=0 ) break; + } + if ( !src[iend] ) break; + ibeg = iend + 1; + idx++; + } + if ( dst==src ) { dst[0] = '.'; dst+=2; } + if ( dst - src < tok->nval1 ) memset(dst-1, 0, tok->nval1 - (dst - src)); + } +} +static void _filters_set_genotype(filter_t *flt, bcf1_t *line, token_t *tok, int type) +{ + bcf_fmt_t *fmt = bcf_get_fmt(flt->hdr, line, "GT"); + if ( !fmt ) + { + tok->nvalues = tok->str_value.l = 0; + return; + } + + int i,j, nsmpl = bcf_hdr_nsamples(flt->hdr), nvals1 = type==2 ? 3 : 4; + if ( tok->str_value.m <= nvals1*nsmpl ) + { + tok->str_value.m = nvals1*nsmpl + 1; + tok->str_value.s = (char*)realloc(tok->str_value.s, tok->str_value.m); + } + +#define BRANCH_INT(type_t,vector_end) \ + { \ + for (i=0; in_sample; i++) \ + { \ + type_t *ptr = (type_t*) (fmt->p + i*fmt->size); \ + int is_het = 0, has_ref = 0, missing = 0; \ + for (j=0; jn; j++) \ + { \ + if ( ptr[j]==vector_end ) break; /* smaller ploidy */ \ + if ( bcf_gt_is_missing(ptr[j]) ) { missing=1; break; } /* missing allele */ \ + int ial = ptr[j]; \ + if ( bcf_gt_allele(ial)==0 ) has_ref = 1; \ + if ( j>0 ) \ + { \ + int jal = ptr[j-1]; \ + if ( bcf_gt_allele(ial)!=bcf_gt_allele(jal) ) is_het = 1; \ + } \ + } \ + char *dst = &tok->str_value.s[nvals1*i]; \ + if ( type==4 ) \ + { \ + if ( !j || missing ) dst[0]='m', dst[1]='i', dst[2]='s', dst[3] = 0; /* mis, missing genotype */ \ + else if ( !has_ref ) dst[0]='a', dst[1]='l', dst[2]='t', dst[3] = 0; /* alt, no ref, must have alt allele */ \ + else if ( !is_het ) dst[0]='r', dst[1]='e', dst[2]='f', dst[3] = 0; /* ref, must be ref-only, no alt alelle */ \ + else dst[0]='a', dst[1]='l', dst[2]='t', dst[3] = 0; /* alt, is het, has alt allele */ \ + } \ + else if ( !j || missing ) dst[0]='.', dst[1]=0; /* ., missing genotype */ \ + else if ( type==3 ) \ + { \ + if ( j==1 ) dst[0]='h', dst[1]='a', dst[2]='p', dst[3] = 0; /* hap, haploid */ \ + else if ( !is_het ) dst[0]='h', dst[1]='o', dst[2]='m', dst[3] = 0; /* hom */ \ + else dst[0]='h', dst[1]='e', dst[2]='t', dst[3] = 0; /* het */ \ + } \ + else \ + { \ + if ( j==1 ) \ + { \ + if ( has_ref ) dst[0]='r', dst[1]=0; /* r, haploid */ \ + else dst[0]='a', dst[1]=0; /* a, haploid */ \ + } \ + else if ( !is_het ) \ + { \ + if ( has_ref ) dst[0]='r', dst[1]='r', dst[2] = 0; /* rr */ \ + else dst[0]='a', dst[1]='a', dst[2] = 0; /* aa */ \ + } \ + else \ + { \ + if ( has_ref ) dst[0]='r', dst[1]='a', dst[2] = 0; /* ra */ \ + else dst[0]='a', dst[1]='A', dst[2] = 0; /* aA */ \ + } \ + } \ + } \ + } + switch (fmt->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_vector_end); break; + default: error("The GT type is not lineognised: %d at %s:%"PRId64"\n",fmt->type, bcf_seqname(flt->hdr,line),(int64_t) line->pos+1); break; + } +#undef BRANCH_INT + assert( tok->nsamples == nsmpl ); + tok->nvalues = tok->str_value.l = nvals1*nsmpl; + tok->str_value.s[tok->str_value.l] = 0; + tok->nval1 = nvals1; +} +static void filters_set_genotype2(filter_t *flt, bcf1_t *line, token_t *tok) { _filters_set_genotype(flt, line, tok, 2); } +static void filters_set_genotype3(filter_t *flt, bcf1_t *line, token_t *tok) { _filters_set_genotype(flt, line, tok, 3); } +static void filters_set_genotype4(filter_t *flt, bcf1_t *line, token_t *tok) { _filters_set_genotype(flt, line, tok, 4); } + +static void filters_set_genotype_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + bcf_fmt_t *fmt = bcf_get_fmt(flt->hdr, line, "GT"); + if ( !fmt ) + { + tok->nvalues = 0; + return; + } + int i, blen = 4, nsmpl = line->n_sample; + +gt_length_too_big: + tok->str_value.l = 0; + for (i=0; istr_value.l; + bcf_format_gt(fmt, i, &tok->str_value); + kputc_(0, &tok->str_value); + if ( tok->str_value.l - plen > blen ) + { + // too many alternate alleles or ploidy is too large, the genotype does not fit + // three characters ("0/0" vs "10/10"). + blen *= 2; + goto gt_length_too_big; + } + + plen = tok->str_value.l - plen; + while ( plen < blen ) + { + kputc_(0, &tok->str_value); + plen++; + } + } + assert( tok->nsamples == nsmpl ); + tok->nvalues = tok->str_value.l; + tok->nval1 = blen; +} +static void filters_set_ilen(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->nvalues = line->n_allele - 1; + hts_expand(double,tok->nvalues,tok->mvalues,tok->values); + + int i, rlen = strlen(line->d.allele[0]); + for (i=1; in_allele; i++) + { + int alen = strlen(line->d.allele[i]); + if ( rlen==alen ) bcf_double_set_missing(tok->values[i-1]); + else tok->values[i-1] = alen - rlen; + } +} +static void filters_set_ref_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->str_value.l = 0; + kputs(line->d.allele[0], &tok->str_value); + tok->nvalues = tok->str_value.l; +} +static void filters_set_alt_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->str_value.l = 0; + if ( tok->idx>=0 ) + { + if ( line->n_allele > tok->idx + 1 ) + kputs(line->d.allele[tok->idx + 1], &tok->str_value); + else + kputc('.', &tok->str_value); + } + else if ( tok->idx==-2 ) + { + int i, end = tok->nuidxs ? tok->nuidxs : line->n_allele - 1; + if ( end >= line->n_allele - 1 ) end = line->n_allele - 2; + for (i=0; i<=end; i++) + if ( i>=tok->nidxs || tok->idxs[i] ) + { + if ( tok->str_value.l ) kputc(',', &tok->str_value); + kputs(line->d.allele[i+1], &tok->str_value); + } + } + else if ( line->n_allele>1 ) + { + kputs(line->d.allele[1], &tok->str_value); + int i; + for (i=2; in_allele; i++) + { + kputc(',', &tok->str_value); + kputs(line->d.allele[i], &tok->str_value); + } + } + else if ( line->n_allele==1 ) + kputc('.', &tok->str_value); + tok->nvalues = tok->str_value.l; +} +static void filters_set_nmissing(filter_t *flt, bcf1_t *line, token_t *tok) +{ + bcf_unpack(line, BCF_UN_FMT); + if ( !line->n_sample ) + { + tok->nvalues = 1; + tok->values[0] = 0; + return; + } + + int i,igt = bcf_hdr_id2int(flt->hdr, BCF_DT_ID, "GT"); + bcf_fmt_t *fmt = NULL; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==igt ) { fmt = &line->d.fmt[i]; break; } + if ( !fmt ) + { + tok->nvalues = 0; + return; + } + + int j,nmissing = 0; + #define BRANCH(type_t, is_vector_end) { \ + for (i=0; in_sample; i++) \ + { \ + type_t *ptr = (type_t *) (fmt->p + i*fmt->size); \ + for (j=0; jn; j++) \ + { \ + if ( ptr[j]==is_vector_end ) break; \ + if ( ptr[j]==bcf_gt_missing ) { nmissing++; break; } \ + } \ + } \ + } + switch (fmt->type) { + case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; + default: fprintf(stderr,"todo: type %d\n", fmt->type); exit(1); break; + } + #undef BRANCH + tok->nvalues = 1; + tok->values[0] = tok->tag[0]=='N' ? nmissing : (double)nmissing / line->n_sample; +} +static int func_npass(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + if ( nstack==0 ) error("Error parsing the expression\n"); + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) error("The function %s works with FORMAT fields\n", rtok->tag); + assert(tok->usmpl); + + int i, npass = 0; + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + if ( tok->pass_samples[i] ) npass++; + } + hts_expand(double,1,rtok->mvalues,rtok->values); + rtok->nsamples = 0; + rtok->nvalues = 1; + rtok->values[0] = rtok->tag[0]=='N' ? npass : (line->n_sample ? 1.0*npass/line->n_sample : 0); + + return 1; +} +static void filters_set_nalt(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->nvalues = 1; + tok->values[0] = line->n_allele - 1; +} +static void filters_set_ac(filter_t *flt, bcf1_t *line, token_t *tok) +{ + hts_expand(int32_t, line->n_allele, flt->mtmpi, flt->tmpi); + if ( !bcf_calc_ac(flt->hdr, line, flt->tmpi, BCF_UN_INFO|BCF_UN_FMT) ) + { + tok->nvalues = 0; + return; + } + int i, an = flt->tmpi[0]; + for (i=1; in_allele; i++) an += flt->tmpi[i]; + if ( !an ) + { + tok->nvalues = 0; + return; + } + flt->tmpi[0] = an; // for filters_set_[mac|af|maf] + if ( tok->idx>=0 ) + { + tok->nvalues = 1; + tok->values[0] = tok->idx+1n_allele ? flt->tmpi[tok->idx+1] : 0; + } + else if ( line->n_allele==1 ) // no ALT + { + tok->nvalues = 1; + tok->values[0] = 0; + } + else + { + hts_expand(double,line->n_allele,tok->mvalues,tok->values); + for (i=1; in_allele; i++) + tok->values[i-1] = flt->tmpi[i]; + tok->nvalues = line->n_allele - 1; + } +} +static void filters_set_an(filter_t *flt, bcf1_t *line, token_t *tok) +{ + filters_set_ac(flt,line,tok); + tok->values[0] = tok->nvalues ? flt->tmpi[0] : 0; + tok->nvalues = 1; +} +static void filters_set_mac(filter_t *flt, bcf1_t *line, token_t *tok) +{ + filters_set_ac(flt,line,tok); + if ( !tok->nvalues ) return; + int i, an = flt->tmpi[0]; + for (i=0; invalues; i++) + if ( tok->values[i] > an*0.5 ) tok->values[i] = an - tok->values[i]; +} +static void filters_set_af(filter_t *flt, bcf1_t *line, token_t *tok) +{ + filters_set_ac(flt,line,tok); + if ( !tok->nvalues ) return; + int i, an = flt->tmpi[0]; + for (i=0; invalues; i++) + tok->values[i] /= (double)an; +} +static void filters_set_maf(filter_t *flt, bcf1_t *line, token_t *tok) +{ + filters_set_ac(flt,line,tok); + if ( !tok->nvalues ) return; + int i, an = flt->tmpi[0]; + for (i=0; invalues; i++) + { + tok->values[i] /= (double)an; + if ( tok->values[i] > 0.5 ) tok->values[i] = 1 - tok->values[i]; + } +} + +static int func_max(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + double *ptr, val = -HUGE_VAL; + int i,j, has_value = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + if ( val < ptr[j] ) val = ptr[j]; + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) continue; + has_value = 1; + if ( val < tok->values[i] ) val = tok->values[i]; + } + } + if ( has_value ) + { + rtok->values[0] = val; + rtok->nvalues = has_value; + } + return 1; +} +static int func_smpl_max(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_max(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, has_value; + double val, *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + val = -HUGE_VAL; + has_value = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + if ( val < ptr[j] ) val = ptr[j]; + } + if ( has_value ) rtok->values[i] = val; + else bcf_double_set_missing(rtok->values[i]); + } + return 1; +} +static int func_min(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + double *ptr, val = HUGE_VAL; + int i,j, has_value = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + if ( val > ptr[j] ) val = ptr[j]; + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) continue; + has_value = 1; + if ( val > tok->values[i] ) val = tok->values[i]; + } + } + if ( has_value ) + { + rtok->values[0] = val; + rtok->nvalues = has_value; + } + return 1; +} +static int func_smpl_min(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_min(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, has_value; + double val, *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + val = HUGE_VAL; + has_value = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + if ( val > ptr[j] ) val = ptr[j]; + } + if ( has_value ) rtok->values[i] = val; + else bcf_double_set_missing(rtok->values[i]); + } + return 1; +} +static int func_avg(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + double *ptr, val = 0; + int i,j, n = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + val += ptr[j]; + n++; + } + } + } + else + { + for (i=0; invalues; i++) + if ( !bcf_double_is_missing_or_vector_end(tok->values[i]) ) { val += tok->values[i]; n++; } + } + if ( n ) + { + rtok->values[0] = val / n; + rtok->nvalues = 1; + } + return 1; +} +static int func_smpl_avg(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_avg(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, n; + double val, *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + val = 0; + n = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( !bcf_double_is_missing_or_vector_end(ptr[j]) ) { val += ptr[j]; n++; } + } + if ( n ) rtok->values[i] = val / n; + else bcf_double_set_missing(rtok->values[i]); + } + return 1; +} +static int compare_doubles(const void *lhs, const void *rhs) +{ + double arg1 = *(const double*) lhs; + double arg2 = *(const double*) rhs; + if (arg1 < arg2) return -1; + if (arg1 > arg2) return 1; + return 0; +} +static int func_median(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + // sweep through all tok->values and while excluding all missing values reuse the very same array + int i,j,k = 0, n = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) { k += tok->nval1; continue; } + for (j=0; jnval1; k++,j++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[k]) ) continue; + if ( n < k ) tok->values[n] = tok->values[k]; + n++; + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) continue; + if ( n < i ) tok->values[n] = tok->values[i]; + n++; + } + } + if ( !n ) return 1; + if ( n==1 ) rtok->values[0] = tok->values[0]; + else + { + qsort(tok->values, n, sizeof(double), compare_doubles); + rtok->values[0] = n % 2 ? tok->values[n/2] : (tok->values[n/2-1] + tok->values[n/2]) * 0.5; + } + rtok->nvalues = 1; + return 1; +} +static int func_smpl_median(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_avg(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, n; + double *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + n = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + if ( n < j ) ptr[n] = ptr[j]; + n++; + } + if ( n==0 ) + bcf_double_set_missing(rtok->values[i]); + else if ( n==1 ) + rtok->values[i] = ptr[0]; + else + { + qsort(ptr, n, sizeof(double), compare_doubles); + rtok->values[i] = n % 2 ? ptr[n/2] : (ptr[n/2-1] + ptr[n/2]) * 0.5; + } + } + return 1; +} +static int func_stddev(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + // sweep through all tok->values and while excluding all missing values reuse the very same array + int i,j,k = 0, n = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) { k += tok->nval1; continue; } + for (j=0; jnval1; k++,j++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[k]) ) continue; + if ( n < k ) tok->values[n] = tok->values[k]; + n++; + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) continue; + if ( n < i ) tok->values[n] = tok->values[i]; + n++; + } + } + if ( !n ) return 1; + if ( n==1 ) rtok->values[0] = 0; + else + { + double sdev = 0, avg = 0; + for (i=0; ivalues[i]; + avg /= n; + for (i=0; ivalues[i] - avg) * (tok->values[i] - avg); + rtok->values[0] = sqrt(sdev/n); + } + rtok->nvalues = 1; + return 1; +} +static int func_smpl_stddev(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_avg(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, n; + double *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + n = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + if ( n < j ) ptr[n] = ptr[j]; + n++; + } + if ( n==0 ) + bcf_double_set_missing(rtok->values[i]); + else if ( n==1 ) + rtok->values[i] = 0; + else + { + double sdev = 0, avg = 0; + for (j=0; jvalues[i] = sqrt(sdev/n); + } + } + return 1; +} +static int func_sum(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + rtok->nvalues = 0; + token_t *tok = stack[nstack - 1]; + if ( !tok->nvalues ) return 1; + double *ptr, val = 0; + int i,j, n = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + val += ptr[j]; + n++; + } + } + } + else + { + for (i=0; invalues; i++) + if ( !bcf_double_is_missing_or_vector_end(tok->values[i]) ) { val += tok->values[i]; n++; } + } + if ( n ) + { + rtok->values[0] = val; + rtok->nvalues = 1; + } + return 1; +} +static int func_smpl_sum(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_avg(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, has_value; + double val, *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + val = 0; + has_value = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + val += ptr[j]; + } + if ( has_value ) rtok->values[i] = val; + else bcf_double_set_missing(rtok->values[i]); + } + return 1; +} +static int func_abs(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( tok->is_str ) error("ABS() can be applied only on numeric values\n"); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nvalues; + rtok->nval1 = tok->nval1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + if ( tok->usmpl ) + { + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + } + if ( !tok->nvalues ) return 1; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + int i,j,k = 0; + if ( tok->usmpl ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) { k+= tok->nval1; continue; } + for (j=0; jnval1; k++,j++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[k]) ) bcf_double_set_missing(rtok->values[k]); + else rtok->values[k] = fabs(tok->values[k]); + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( tok->usmpl && !tok->usmpl[i] ) continue; + if ( bcf_double_is_missing(tok->values[i]) ) bcf_double_set_missing(rtok->values[i]); + else if ( !bcf_double_is_vector_end(tok->values[i]) ) rtok->values[i] = fabs(tok->values[i]); + } + } + return 1; +} +static int func_count(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + int i,j, cnt = 0; + if ( tok->tag && tok->nsamples ) + { + // raw number of values in a FMT tag, e.g. COUNT(FMT/TAG) + if ( tok->is_str ) error("todo: Type=String for COUNT on FORMAT fields?\n"); + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + double *ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + if ( !bcf_double_is_missing_or_vector_end(ptr[j]) ) cnt++; + } + } + else if ( tok->nsamples ) + { + // number of samples that pass a processed FMT tag + for (i=0; insamples; i++) + if ( tok->pass_samples[i] ) cnt++; + } + else if ( tok->is_str ) + { + if ( tok->str_value.l ) cnt = 1; + for (i=0; istr_value.l; i++) if ( tok->str_value.s[i]==',' ) cnt++; + } + else + cnt = tok->nvalues; + + rtok->nvalues = 1; + rtok->values[0] = cnt; + return 1; +} +static int func_strlen(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = rtok->str_value.l = 0; + if ( !tok->str_value.l ) return 1; + + if ( tok->idx==-2 ) + { + int i = 0; + char *ss = tok->str_value.s; + while ( *ss ) + { + char *se = ss; + while ( *se && *se!=',' ) se++; + hts_expand(double, i+1, rtok->mvalues, rtok->values); + if ( !*se ) rtok->values[i] = strlen(ss); + else + { + *se = 0; + rtok->values[i] = strlen(ss); + *se = ','; + } + ss = *se ? se + 1 : se; + i++; + } + rtok->nvalues = i; + } + else + { + if ( !tok->str_value.s[1] && tok->str_value.s[0]=='.' ) + rtok->values[0] = 0; + else + rtok->values[0] = strlen(tok->str_value.s); + rtok->nvalues = 1; + } + return 1; +} +static inline double calc_binom(int na, int nb) +{ + if ( na==0 && nb==0 ) return -1; + if ( na==nb ) return 1; + + // kfunc.h implements kf_betai, which is the regularized beta function P(X<=k/N;p) = I_{1-p}(N-k,k+1) + + double pval = na < nb ? kf_betai(nb, na + 1, 0.5) : kf_betai(na, nb + 1, 0.5); + pval *= 2; + if ( pval>1 ) pval = 1; // this can happen, machine precision error, eg. kf_betai(1,0,0.5) + + return pval; +} +static int func_binom(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + int i, istack = nstack - rtok->nargs; + + if ( rtok->nargs!=2 && rtok->nargs!=1 ) error("Error: binom() takes one or two arguments\n"); + assert( istack>=0 ); + + // The expected mean is 0.5. Should we support also prob!=0.5? + // + // double prob = 0.5; + // if ( nstack==3 ) + // { + // // three parameters, the first one must be a scalar: binom(0.25,AD[0],AD[1]) + // if ( !stack[istack]->is_constant ) + // error("The first argument of binom() must be a numeric constant if three parameters are given\n"); + // prob = stack[istack]->threshold; + // istack++; + // } + // else if ( nstack==2 && stack[istack]->is_constant ) + // { + // // two parameters, the first can be a scalar: binom(0.25,AD) or binom(AD[0],AD[1]) + // prob = stack[istack]->threshold; + // istack++; + // } + + token_t *tok = stack[istack]; + if ( tok->nsamples ) + { + // working with a FORMAT tag + rtok->nval1 = 1; + rtok->nvalues = tok->nsamples; + rtok->nsamples = tok->nsamples; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + + if ( istack+1==nstack ) + { + // determine the index from the GT field: binom(AD) + int ngt = bcf_get_genotypes(flt->hdr, line, &flt->tmpi, &flt->mtmpi); + int max_ploidy = ngt/line->n_sample; + if ( ngt <= 0 || max_ploidy < 2 ) // GT not present or not diploid, cannot set + { + for (i=0; insamples; i++) + if ( rtok->usmpl[i] ) bcf_double_set_missing(rtok->values[i]); + return rtok->nargs; + } + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + int32_t *ptr = flt->tmpi + i*max_ploidy; + if ( bcf_gt_is_missing(ptr[0]) || bcf_gt_is_missing(ptr[1]) || ptr[1]==bcf_int32_vector_end ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + int idx1 = bcf_gt_allele(ptr[0]); + int idx2 = bcf_gt_allele(ptr[1]); + if ( idx1>=line->n_allele ) error("Incorrect allele index at %s:%"PRId64", sample %s\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,flt->hdr->samples[i]); + if ( idx2>=line->n_allele ) error("Incorrect allele index at %s:%"PRId64", sample %s\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,flt->hdr->samples[i]); + double *vals = tok->values + tok->nval1*i; + if ( bcf_double_is_missing_or_vector_end(vals[idx1]) || bcf_double_is_missing_or_vector_end(vals[idx2]) ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + rtok->values[i] = calc_binom(vals[idx1],vals[idx2]); + if ( rtok->values[i] < 0 ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + } + } + else + { + // the fields given explicitly: binom(AD[:0],AD[:1]) + token_t *tok2 = stack[istack+1]; + if ( tok->nval1!=1 || tok2->nval1!=1 ) + error("Expected one value per binom() argument, found %d and %d at %s:%"PRId64"\n",tok->nval1,tok2->nval1, bcf_seqname(flt->hdr,line),(int64_t) line->pos+1); + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + double *ptr1 = tok->values + tok->nval1*i; + double *ptr2 = tok2->values + tok2->nval1*i; + if ( bcf_double_is_missing_or_vector_end(ptr1[0]) || bcf_double_is_missing_or_vector_end(ptr2[0]) ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + rtok->values[i] = calc_binom(ptr1[0],ptr2[0]); + if ( rtok->values[i] < 0 ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + } + } + } + else + { + // working with an INFO tag + rtok->nvalues = 1; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + + double *ptr1 = NULL, *ptr2 = NULL; + if ( istack+1==nstack ) + { + // only one tag, expecting two values: binom(INFO/AD) + if ( tok->nvalues==2 ) + { + ptr1 = &tok->values[0]; + ptr2 = &tok->values[1]; + } + } + else + { + // two tags, expecting one value in each: binom(INFO/AD[0],INFO/AD[1]) + token_t *tok2 = stack[istack+1]; + if ( tok->nvalues==1 && tok2->nvalues==1 ) + { + ptr1 = &tok->values[0]; + ptr2 = &tok2->values[0]; + } + } + if ( !ptr1 || !ptr2 || bcf_double_is_missing_or_vector_end(ptr1[0]) || bcf_double_is_missing_or_vector_end(ptr2[0]) ) + bcf_double_set_missing(rtok->values[0]); + else + { + rtok->values[0] = calc_binom(ptr1[0],ptr2[0]); + if ( rtok->values[0] < 0 ) + bcf_double_set_missing(rtok->values[0]); + } + } + return rtok->nargs; +} +static int func_phred(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( tok->is_str ) error("PHRED() can be applied only on numeric values\n"); + + rtok->nsamples = tok->nsamples; + rtok->nval1 = tok->nval1; + memcpy(rtok->pass_samples, tok->pass_samples, rtok->nsamples*sizeof(*rtok->pass_samples)); + assert(tok->usmpl); + if ( !rtok->usmpl ) + { + rtok->usmpl = (uint8_t*) malloc(tok->nsamples*sizeof(*rtok->usmpl)); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples*sizeof(*rtok->usmpl)); + } + rtok->nvalues = tok->nvalues; + if ( !tok->nvalues ) return 1; + + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + int i,j,k = 0; + if ( tok->usmpl ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) { k+= tok->nval1; continue; } + for (j=0; jnval1; k++,j++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[k]) ) bcf_double_set_missing(rtok->values[k]); + else rtok->values[k] = -4.34294481903*log(tok->values[k]); + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) bcf_double_set_missing(rtok->values[i]); + else rtok->values[i] = -4.34294481903*log(tok->values[i]); + } + } + return 1; +} +inline static void tok_init_values(token_t *atok, token_t *btok, token_t *rtok) +{ + token_t *tok; + if ( (atok->nsamples || btok->nsamples) && (!atok->nsamples || !btok->nsamples) ) + tok = atok->nsamples ? atok : btok; + else + tok = atok->nvalues > btok->nvalues ? atok : btok; + rtok->nvalues = tok->nvalues; + rtok->nval1 = tok->nval1; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); +} +inline static void tok_init_samples(token_t *atok, token_t *btok, token_t *rtok) +{ + if ( (atok->nsamples || btok->nsamples) && !rtok->nsamples ) + { + rtok->nsamples = atok->nsamples ? atok->nsamples : btok->nsamples; + rtok->usmpl = (uint8_t*) calloc(rtok->nsamples,1); + int i; + for (i=0; insamples; i++) rtok->usmpl[i] |= atok->usmpl[i]; + for (i=0; insamples; i++) rtok->usmpl[i] |= btok->usmpl[i]; + } + if (rtok->nsamples) + memset(rtok->pass_samples, 0, rtok->nsamples); +} + +#define VECTOR_ARITHMETICS(atok,btok,_rtok,AOP,TYPE) \ +{ \ + token_t *rtok = _rtok; \ + int i, has_values = 0; \ + if ( atok->nvalues && btok->nvalues ) \ + { \ + tok_init_values(atok, btok, rtok); \ + tok_init_samples(atok, btok, rtok); \ + if ( (atok->nsamples && btok->nsamples) || (!atok->nsamples && !btok->nsamples)) \ + { \ + assert( atok->nsamples==btok->nsamples ); \ + for (i=0; invalues; i++) \ + { \ + if ( bcf_double_is_missing_or_vector_end(atok->values[i]) || bcf_double_is_missing_or_vector_end(btok->values[i]) ) \ + { \ + bcf_double_set_missing(rtok->values[i]); \ + continue; \ + } \ + has_values = 1; \ + rtok->values[i] = TYPE atok->values[i] AOP TYPE btok->values[i]; \ + } \ + } \ + else if ( atok->nsamples ) \ + { \ + assert( btok->nvalues==1 ); \ + if ( !bcf_double_is_missing_or_vector_end(btok->values[0]) ) \ + { \ + for (i=0; invalues; i++) \ + { \ + if ( bcf_double_is_missing_or_vector_end(atok->values[i]) ) \ + { \ + bcf_double_set_missing(rtok->values[i]); \ + continue; \ + } \ + has_values = 1; \ + rtok->values[i] = TYPE atok->values[i] AOP TYPE btok->values[0]; \ + } \ + } \ + } \ + else \ + { \ + assert( atok->nvalues==1 ); \ + if ( !bcf_double_is_missing_or_vector_end(atok->values[0]) ) \ + { \ + for (i=0; invalues; i++) \ + { \ + if ( bcf_double_is_missing_or_vector_end(btok->values[i]) ) \ + { \ + bcf_double_set_missing(rtok->values[i]); \ + continue; \ + } \ + has_values = 1; \ + rtok->values[i] = TYPE atok->values[0] AOP TYPE btok->values[i]; \ + } \ + } \ + } \ + } \ + if ( !has_values ) rtok->nvalues = 0; \ +} + +static int vector_logic_or(filter_t *filter, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + if ( nstack < 2 ) error("Error occurred while processing the filter \"%s\"\n", filter->str); + + token_t *atok = stack[nstack-2]; + token_t *btok = stack[nstack-1]; + tok_init_samples(atok, btok, rtok); + + if ( !atok->pass_site && !btok->pass_site ) return 2; + + rtok->pass_site = 1; + if ( !atok->nsamples && !btok->nsamples ) return 2; + + int i; + if ( rtok->tok_type==TOK_OR_VEC ) // ||, select all samples if one is true + { + if ( (!atok->nsamples && !atok->pass_site) || (!btok->nsamples && !btok->pass_site) ) + { + // These two conditions are to ensure the following does not set all samples + // at sites with QUAL<=30: + // QUAL>30 || FMT/GQ>30 + + token_t *tok = atok->nsamples ? atok : btok; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = tok->pass_samples[i]; + } + } + else + { + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = 1; + } + } + return 2; + } + + // |, only select samples which are actually true + + if ( !atok->nsamples || !btok->nsamples ) + { + token_t *tok = atok->nsamples ? atok : btok; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = tok->pass_samples[i]; + } + return 2; + } + + assert( atok->nsamples==btok->nsamples ); + + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = atok->pass_samples[i] | btok->pass_samples[i]; + } + return 2; +} +static int vector_logic_and(filter_t *filter, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + if ( nstack < 2 ) error("Error occurred while processing the filter \"%s\". (nstack=%d)\n", filter->str,nstack); + + token_t *atok = stack[nstack-2]; + token_t *btok = stack[nstack-1]; + tok_init_samples(atok, btok, rtok); + + if ( !atok->pass_site || !btok->pass_site ) return 2; + if ( !atok->nsamples && !btok->nsamples ) { rtok->pass_site = 1; return 2; } + + int i; + if ( !atok->nsamples || !btok->nsamples ) + { + token_t *tok = atok->nsamples ? atok : btok; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = tok->pass_samples[i]; + } + rtok->pass_site = 1; + return 2; + } + + assert( atok->nsamples==btok->nsamples ); + if ( rtok->tok_type==TOK_AND_VEC ) // &&, can be true in different samples + { + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = atok->pass_samples[i] | btok->pass_samples[i]; + } + rtok->pass_site = 1; + } + else // &, must be true within one sample + { + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = atok->pass_samples[i] & btok->pass_samples[i]; + if ( rtok->pass_samples[i] ) rtok->pass_site = 1; + } + } + return 2; +} + +#define CMP_VECTORS(atok,btok,_rtok,CMP_OP,missing_logic) \ +{ \ + token_t *rtok = _rtok; \ + int i, j, k; \ + tok_init_samples(atok, btok, rtok); \ + if ( !atok->nsamples && !btok->nsamples ) \ + { \ + if ( !atok->nvalues && !btok->nvalues ) { rtok->pass_site = missing_logic[2]; } \ + else if ( !atok->nvalues || !btok->nvalues ) \ + { \ + token_t *tok = atok->nvalues ? atok : btok; \ + for (j=0; jnvalues; j++) \ + { \ + if ( bcf_double_is_missing_or_vector_end(tok->values[j]) ) \ + { \ + if ( missing_logic[2] ) { rtok->pass_site = 1; break; } \ + } \ + else if ( missing_logic[1] ) { rtok->pass_site = 1; break; } \ + } \ + } \ + else \ + { \ + for (i=0; invalues; i++) \ + { \ + int amiss = bcf_double_is_missing_or_vector_end(atok->values[i]) ? 1 : 0; \ + for (j=0; jnvalues; j++) \ + { \ + int nmiss = amiss + (bcf_double_is_missing_or_vector_end(btok->values[j]) ? 1 : 0); \ + if ( nmiss ) \ + { \ + if ( missing_logic[nmiss] ) { rtok->pass_site = 1; i = atok->nvalues; break; } \ + } \ + else if ( atok->values[i] > 16777216 || btok->values[j] > 16777216 ) /* Ugly, see #871 */ \ + { \ + if ( atok->values[i] CMP_OP btok->values[j] ) { rtok->pass_site = 1; i = atok->nvalues; break; } \ + } \ + else if ( (float)atok->values[i] CMP_OP (float)btok->values[j] ) { rtok->pass_site = 1; i = atok->nvalues; break; } \ + } \ + } \ + } \ + } \ + else \ + { \ + if ( !atok->nvalues && !btok->nvalues ) \ + { \ + if ( missing_logic[2] ) \ + { \ + for (i=0; insamples; i++) \ + if ( rtok->usmpl[i] ) { rtok->pass_samples[i] = missing_logic[2]; rtok->pass_site = 1; } \ + } \ + } \ + else if ( !atok->nvalues || !btok->nvalues ) \ + { \ + token_t *tok = atok->nvalues ? atok : btok; \ + if ( !tok->nsamples ) \ + { \ + int miss = 0; \ + for (j=0; jnvalues; j++) \ + miss |= bcf_double_is_missing_or_vector_end(tok->values[j]) ? 1 : 0; \ + if ( missing_logic[++miss] ) \ + { \ + for (i=0; insamples; i++) \ + if ( rtok->usmpl[i] ) { rtok->pass_samples[i] = missing_logic[miss]; rtok->pass_site = 1; } \ + } \ + } \ + else \ + for (i=0; insamples; i++) \ + { \ + if ( !rtok->usmpl[i] ) continue; \ + double *ptr = tok->values + i*tok->nval1; \ + int miss = 0; \ + for (j=0; jnval1; j++) \ + miss |= bcf_double_is_missing_or_vector_end(ptr[j]) ? 1 : 0; \ + if ( missing_logic[++miss] ) { rtok->pass_samples[i] = missing_logic[miss]; rtok->pass_site = 1; } \ + } \ + } \ + else if ( atok->nsamples && btok->nsamples ) \ + { \ + if ( atok->nval1!=btok->nval1 ) error("Incompatible number of per-sample values in comparison: %d vs %d\n",atok->nval1,btok->nval1); \ + if ( atok->nsamples!=btok->nsamples ) error("Incompatible number samples in comparison: %d vs %d\n",atok->nsamples,btok->nsamples); \ + for (i=0; insamples; i++) \ + { \ + if ( !atok->usmpl[i] || !btok->usmpl[i] ) { rtok->usmpl[i] = 0; continue; } \ + double *aptr = atok->values + i*atok->nval1; \ + double *bptr = btok->values + i*btok->nval1; \ + for (j=0; jnval1; j++) \ + { \ + int nmiss = bcf_double_is_missing_or_vector_end(aptr[j]) ? 1 : 0; \ + if ( nmiss && !missing_logic[0] ) continue; /* any is missing => result is false */ \ + nmiss += (bcf_double_is_missing_or_vector_end(bptr[j]) ? 1 : 0); \ + if ( nmiss ) \ + { \ + if ( missing_logic[nmiss] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; break; } \ + } \ + else if ( aptr[j] > 16777216 || bptr[j] > 16777216 ) /* Ugly, see #871 */ \ + { \ + if ( aptr[j] CMP_OP bptr[j] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; break; } \ + } \ + else if ( (float)aptr[j] CMP_OP (float)bptr[j] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; break; } \ + } \ + } \ + } \ + else if ( atok->nsamples )\ + { \ + for (i=0; insamples; i++) \ + { \ + if ( !rtok->usmpl[i] ) continue; \ + double *aptr = atok->values + i*atok->nval1; \ + double *bptr = btok->values + i*btok->nval1; \ + for (j=0; jnval1; j++) \ + { \ + int miss = bcf_double_is_missing_or_vector_end(aptr[j]) ? 1 : 0; \ + if ( miss && !missing_logic[0] ) continue; /* any is missing => result is false */ \ + for (k=0; knvalues; k++) \ + { \ + int nmiss = miss + (bcf_double_is_missing_or_vector_end(bptr[k]) ? 1 : 0); \ + if ( nmiss ) \ + { \ + if ( missing_logic[nmiss] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = atok->nval1; break; } \ + } \ + else if ( aptr[j] > 16777216 || bptr[k] > 16777216 ) /* Ugly, see #871 */ \ + { \ + if ( aptr[j] CMP_OP bptr[k] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = atok->nval1; break; } \ + } \ + else if ( (float)aptr[j] CMP_OP (float)bptr[k] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = atok->nval1; break; } \ + } \ + } \ + } \ + } \ + else /* btok->nsamples */ \ + { \ + for (i=0; insamples; i++) \ + { \ + if ( !rtok->usmpl[i] ) continue; \ + double *aptr = atok->values + i*atok->nval1; \ + double *bptr = btok->values + i*btok->nval1; \ + for (j=0; jnval1; j++) \ + { \ + int miss = bcf_double_is_missing_or_vector_end(bptr[j]) ? 1 : 0; \ + if ( miss && !missing_logic[0] ) continue; /* any is missing => result is false */ \ + for (k=0; knvalues; k++) \ + { \ + int nmiss = miss + (bcf_double_is_missing_or_vector_end(aptr[k]) ? 1 : 0); \ + if ( nmiss ) \ + { \ + if ( missing_logic[nmiss] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = btok->nval1; break; } \ + } \ + else if ( bptr[j] > 16777216 || aptr[k] > 16777216 ) /* Ugly, see #871 */ \ + { \ + if ( aptr[k] CMP_OP bptr[j] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = btok->nval1; break; } \ + } \ + else if ( (float)aptr[k] CMP_OP (float)bptr[j] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = btok->nval1; break; } \ + } \ + } \ + } \ + } \ + } \ +} +static int _regex_vector_strings(regex_t *regex, char *str, size_t len, int logic, int *missing_logic) +{ + char *end = str + len; + while ( str < end && *str ) + { + char *mid = str; + while ( mid < end && *mid && *mid!=',' ) mid++; + int miss = mid - str == 1 && str[0]=='.' ? 1 : 0; + if ( miss && missing_logic[miss] ) return 1; + char tmp = *mid; *mid = 0; + int match = regexec(regex, str, 0,NULL,0) ? 0 : 1; + *mid = tmp; + if ( logic==TOK_NLIKE ) match = match ? 0 : 1; + if ( match ) return 1; + if ( !*mid ) break; + str = mid + 1; + } + return 0; +} +static inline int _has_missing_string(char *beg) +{ + while ( *beg ) + { + char *end = beg; + while ( *end && *end!=',' ) end++; + if ( end-beg==1 && beg[0]=='.' ) return 1; + if ( !*end ) break; + beg = end + 1; + } + return 0; +} + +// Compare two strings with multiple fields, for example "A,B,.,C"=="X,Y,A". +// Returns 1 if any field matches, otherwise returns 0 +static inline int _match_vector_strings(char *abeg, size_t alen, char *bstr, size_t blen, int logic, int *missing_logic) +{ + char *aend = abeg + alen; + char *bend = bstr + blen; + while ( abeg < aend && *abeg ) + { + char *amid = abeg; + while ( amid < aend && *amid && *amid!=',' ) amid++; + int miss = amid - abeg == 1 && abeg[0]=='.' ? 1 : 0; + char *bbeg = bstr; + while ( bbeg < bend && *bbeg ) + { + char *bmid = bbeg; + while ( bmid < bend && *bmid && *bmid!=',' ) bmid++; + int nmiss = miss + (bmid - bbeg == 1 && bbeg[0]=='.' ? 1 : 0); + if ( nmiss ) + { + if ( missing_logic[nmiss] ) return 1; + } + else + { + int match = amid-abeg==bmid-bbeg && !strncmp(abeg,bbeg,amid-abeg) ? 1 : 0; + if ( logic==TOK_NE ) match = match==1 ? 0 : 1; + if ( match ) return 1; + } + if ( !*bmid ) break; + bbeg = bmid + 1; + } + if ( !*amid ) break; + abeg = amid + 1; + } + return 0; +} +static void cmp_vector_strings(token_t *atok, token_t *btok, token_t *rtok) +{ + tok_init_samples(atok, btok, rtok); + + int i, logic = rtok->tok_type; // TOK_EQ, TOK_NE, TOK_LIKE, TOK_NLIKE + regex_t *regex = atok->regex ? atok->regex : (btok->regex ? btok->regex : NULL); + + assert( atok->nvalues==atok->str_value.l && btok->nvalues==btok->str_value.l ); + assert( !atok->nsamples || !btok->nsamples ); + assert( (!regex && (logic==TOK_EQ || logic==TOK_NE)) || (regex && (logic==TOK_LIKE || logic==TOK_NLIKE)) ); + + int missing_logic[] = {0,0,0}; + if ( logic==TOK_EQ || logic==TOK_LIKE ) missing_logic[0] = missing_logic[2] = 1; + else if ( logic==TOK_NE || logic==TOK_NLIKE ) missing_logic[0] = missing_logic[1] = 1; + + if ( !atok->nsamples && !btok->nsamples ) + { + if ( !atok->nvalues && !btok->nvalues ) { rtok->pass_site = missing_logic[2]; return; } + if ( !atok->nvalues || !btok->nvalues ) + { + int miss = _has_missing_string(atok->nvalues ? atok->str_value.s : btok->str_value.s); + if ( missing_logic[miss+1] ) rtok->pass_site = 1; + return; + } + if ( !regex ) + rtok->pass_site = _match_vector_strings(atok->str_value.s, atok->str_value.l, btok->str_value.s, btok->str_value.l, logic, missing_logic); + else + { + token_t *tok = atok->regex ? btok : atok; + rtok->pass_site = _regex_vector_strings(regex, tok->str_value.s, tok->str_value.l, logic, missing_logic); + } + return; + } + + // The case of (!atok->nsamples || !btok->nsamples) + + if ( !atok->nvalues && !btok->nvalues ) + { + if ( missing_logic[2] ) + { + for (i=0; insamples; i++) + if ( rtok->usmpl[i] ) { rtok->pass_samples[i] = missing_logic[2]; rtok->pass_site = 1; } + } + return; + } + if ( !atok->nvalues || !btok->nvalues ) + { + token_t *tok = atok->nvalues ? atok : btok; + if ( !tok->nsamples ) + { + int miss = _has_missing_string(tok->str_value.s); + if ( !missing_logic[miss+1] ) return; + for (i=0; insamples; i++) + if ( rtok->usmpl[i] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; } + } + else + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + int miss = _has_missing_string(tok->str_value.s + i*tok->nval1); + if ( missing_logic[miss+1] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; } + } + return; + } + + // The case of (!atok->nsamples || !btok->nsamples) && (atok->nvalues && btok->nvalues) + token_t *xtok = atok->nsamples ? atok : btok; + token_t *ytok = atok->nsamples ? btok : atok; + assert( regex==ytok->regex ); + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + int match; + if ( regex ) + match = _regex_vector_strings(regex, xtok->str_value.s + i*xtok->nval1, xtok->nval1, logic, missing_logic); + else + match = _match_vector_strings(xtok->str_value.s + i*xtok->nval1, xtok->nval1, ytok->str_value.s, ytok->str_value.l, logic, missing_logic); + if ( match ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; } + } +} + +static int parse_idxs(char *tag_idx, int **idxs, int *nidxs, int *idx) +{ + // TAG[], TAG[*] .. any field; sets idx=-2, idxs[0]=-1 + if ( *tag_idx==0 || !strcmp("*", tag_idx) ) + { + *idxs = (int*) malloc(sizeof(int)); + (*idxs)[0] = -1; + *nidxs = 1; + *idx = -2; + return 0; + } + + // TAG[integer] .. one field; idx positive + char *end, *beg = tag_idx; + *idx = strtol(tag_idx, &end, 10); + if ( *idx >= 0 && *end==0 ) return 0; + + // TAG[0,1] or TAG[0-2] or [1-] etc; idx=-2, idxs[...]=0,0,1,1,.. + int i, ibeg = -1; + while ( *beg ) + { + int num = strtol(beg, &end, 10); + if ( end[0]==',' ) beg = end + 1; + else if ( end[0]==0 ) beg = end; + else if ( end[0]=='-' ) { beg = end + 1; ibeg = num; continue; } + else return -1; + if ( num >= *nidxs ) + { + *idxs = (int*) realloc(*idxs, sizeof(int)*(num+1)); + memset(*idxs + *nidxs, 0, sizeof(int)*(num - *nidxs + 1)); + *nidxs = num + 1; + } + if ( ibeg>=0 ) + { + for (i=ibeg; i<=num; i++) (*idxs)[i] = 1; + ibeg = -1; + } + (*idxs)[num] = 1; + } + if ( ibeg >=0 ) + { + if ( ibeg >= *nidxs ) + { + *idxs = (int*) realloc(*idxs, sizeof(int)*(ibeg+1)); + memset(*idxs + *nidxs, 0, sizeof(int)*(ibeg - *nidxs + 1)); + *nidxs = ibeg + 1; + } + (*idxs)[ibeg] = -1; + } + *idx = -2; + return 0; +} + +static void parse_tag_idx(bcf_hdr_t *hdr, int is_fmt, char *tag, char *tag_idx, token_t *tok) // tag_idx points just after "TAG[" +{ + int i, len = strlen(tag_idx); + if ( tag_idx[len-1] == ']' ) tag_idx[len-1] = 0; + char *ori = strdup(tag_idx); + + assert( !tok->idxs && !tok->usmpl ); + int *idxs1 = NULL, nidxs1 = 0, idx1 = 0; + int *idxs2 = NULL, nidxs2 = 0, idx2 = 0; + + int set_samples = 0; + char *colon = strrchr(tag_idx, ':'); + if ( tag_idx[0]=='@' ) // file list with sample names + { + if ( !is_fmt ) error("Could not parse \"%s\". (Not a FORMAT tag yet a sample list provided.)\n", ori); + char *fname = expand_path(tag_idx+1); +#ifdef _WIN32 + if (fname && strlen(fname) > 2 && fname[1] == ':') // Deal with Windows paths, such as 'C:\..' + colon = strrchr(fname+2, ':'); +#endif + int nsmpl; + char **list = hts_readlist(fname, 1, &nsmpl); + if ( !list && colon ) + { + if ( parse_idxs(colon+1, &idxs2, &nidxs2, &idx2) != 0 ) error("Could not parse the index: %s\n", ori); + tok->idxs = idxs2; + tok->nidxs = nidxs2; + tok->idx = idx2; + colon = strrchr(fname, ':'); + *colon = 0; + list = hts_readlist(fname, 1, &nsmpl); + } + if ( !list ) error("Could not read: %s\n", fname); + free(fname); + tok->nsamples = bcf_hdr_nsamples(hdr); + tok->usmpl = (uint8_t*) calloc(tok->nsamples,1); + for (i=0; iusmpl[ismpl] = 1; + } + free(list); + if ( !colon ) + { + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + tok->idx = -2; + } + } + else if ( colon ) + { + if ( !is_fmt ) error("Could not parse the index \"%s\". (Not a FORMAT tag yet sample index implied.)\n", ori); + *colon = 0; + if ( parse_idxs(tag_idx, &idxs1, &nidxs1, &idx1) != 0 ) error("Could not parse the index: %s\n", ori); + if ( parse_idxs(colon+1, &idxs2, &nidxs2, &idx2) != 0 ) error("Could not parse the index: %s\n", ori); + tok->idxs = idxs2; + tok->nidxs = nidxs2; + tok->idx = idx2; + set_samples = 1; + } + else + { + if ( parse_idxs(tag_idx, &idxs1, &nidxs1, &idx1) != 0 ) error("Could not parse the index: %s\n", ori); + if ( is_fmt ) + { + if ( nidxs1==1 && idxs1[0]==-1 ) + { + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + tok->idx = -2; + } + else if ( bcf_hdr_id2number(hdr,BCF_HL_FMT,tok->hdr_id)!=1 ) + error("The FORMAT tag %s can have multiple subfields, run as %s[sample:subfield]\n", tag,tag); + else + tok->idx = 0; + set_samples = 1; + } + else + { + tok->idxs = idxs1; + tok->nidxs = nidxs1; + tok->idx = idx1; + } + } + + if ( set_samples ) + { + tok->nsamples = bcf_hdr_nsamples(hdr); + tok->usmpl = (uint8_t*) calloc(tok->nsamples,1); + if ( idx1>=0 ) + { + if ( idx1 >= bcf_hdr_nsamples(hdr) ) error("The sample index is too large: %s\n", ori); + tok->usmpl[idx1] = 1; + } + else if ( idx1==-2 ) + { + for (i=0; i= bcf_hdr_nsamples(hdr) ) error("The sample index is too large: %s\n", ori); + tok->usmpl[i] = 1; + } + if ( nidxs1 && idxs1[nidxs1-1]==-1 ) // open range, such as "7-" + { + for (; insamples; i++) tok->usmpl[i] = 1; + } + } + else error("todo: %s:%d .. %d\n", __FILE__,__LINE__, idx2); + free(idxs1); + } + free(ori); + + if ( tok->nidxs && tok->idxs[tok->nidxs-1]!=-1 ) + { + for (i=0; inidxs; i++) if ( tok->idxs[i] ) tok->nuidxs++; + } +} +static int max_ac_an_unpack(bcf_hdr_t *hdr) +{ + int hdr_id = bcf_hdr_id2int(hdr,BCF_DT_ID,"AC"); + if ( hdr_id<0 ) return BCF_UN_FMT; + if ( !bcf_hdr_idinfo_exists(hdr,BCF_HL_INFO,hdr_id) ) return BCF_UN_FMT; + + hdr_id = bcf_hdr_id2int(hdr,BCF_DT_ID,"AN"); + if ( hdr_id<0 ) return BCF_UN_FMT; + if ( !bcf_hdr_idinfo_exists(hdr,BCF_HL_INFO,hdr_id) ) return BCF_UN_FMT; + + return BCF_UN_INFO; +} +static int filters_init1(filter_t *filter, char *str, int len, token_t *tok) +{ + tok->tag_type = -1; + tok->tok_type = TOK_VAL; + tok->hdr_id = -1; + tok->pass_site = -1; + tok->idx = 0; + + // is this a string constant? + if ( str[0]=='"' || str[0]=='\'' ) + { + int quote = str[0]; + if ( str[len-1] != quote ) error("TODO: [%s]\n", filter->str); + tok->key = (char*) calloc(len-1,sizeof(char)); + hts_expand(double,1,tok->mvalues,tok->values); + tok->values[0] = len-2; + memcpy(tok->key,str+1,len-2); + tok->key[len-2] = 0; + tok->is_str = 1; + tok->nvalues = len-2; + if ( !strcmp(".",tok->key) ) tok->is_missing = 1; + return 0; + } + + // is it a file? + if ( str[0]=='@' ) + { + tok->tag = (char*) calloc(len+1,sizeof(char)); + memcpy(tok->tag,str,len); + tok->tag[len] = 0; + char *fname = expand_path(tok->tag+1); + int i, n; + char **list = hts_readlist(fname, 1, &n); + if ( !list ) error("Could not read: %s\n", fname); + free(fname); + tok->hash = khash_str2int_init(); + for (i=0; ihash,list[i]) ) + khash_str2int_inc(tok->hash,list[i]); + else + free(list[i]); + } + free(list); + return 0; + } + + int is_fmt = -1; + if ( !strncasecmp(str,"FMT/",4) ) { str += 4; len -= 4; is_fmt = 1; } + else if ( !strncasecmp(str,"FORMAT/",7) ) { str += 7; len -= 7; is_fmt = 1; } + else + { + if ( !strncasecmp(str,"INFO/",5) ) { is_fmt = 0; str += 5; len -= 5; } + else if ( !strncasecmp(str,"QUAL",len) || !strncmp(str,"%QUAL",len) /* for backward compatibility */ ) + { + tok->setter = filters_set_qual; + tok->tag = strdup("QUAL"); + return 0; + } + else if ( !strncasecmp(str,"TYPE",len) || !strncmp(str,"%TYPE",len) /* for backward compatibility */ ) + { + tok->setter = filters_set_type; + tok->tag = strdup("TYPE"); + return 0; + } + else if ( !strncasecmp(str,"FILTER",len) || !strncmp(str,"%FILTER",len) /* for backward compatibility */ ) + { + tok->comparator = filters_cmp_filter; + tok->tag = strdup("FILTER"); + filter->max_unpack |= BCF_UN_FLT; + tok->tag_type = BCF_HL_FLT; + return 0; + } + else if ( !strncasecmp(str,"ID",len) || !strncasecmp(str,"%ID",len) /* for backward compatibility */ ) + { + tok->comparator = filters_cmp_id; + tok->tag = strdup("ID"); + return 0; + } + else if ( !strncasecmp(str,"CHROM",len) ) + { + tok->setter = &filters_set_chrom; + tok->tag = strdup("CHROM"); + return 0; + } + else if ( !strncasecmp(str,"POS",len) ) + { + tok->setter = &filters_set_pos; + tok->tag = strdup("POS"); + return 0; + } + else if ( !strncasecmp(str,"REF",len) ) + { + tok->setter = &filters_set_ref_string; + tok->is_str = 1; + tok->tag = strdup("REF"); + return 0; + } + else if ( !strncasecmp(str,"ALT",len) ) + { + tok->setter = &filters_set_alt_string; + tok->is_str = 1; + tok->tag = strdup("ALT"); + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + tok->idx = -2; + return 0; + } + else if ( !strncasecmp(str,"N_ALT",len) ) + { + tok->setter = &filters_set_nalt; + tok->tag = strdup("N_ALT"); + return 0; + } + else if ( !strncasecmp(str,"N_SAMPLES",len) ) + { + tok->tok_type = TOK_VAL; + tok->threshold = bcf_hdr_nsamples(filter->hdr); + tok->is_constant = 1; + return 0; + } + else if ( !strncasecmp(str,"N_MISSING",len) ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->setter = &filters_set_nmissing; + tok->tag = strdup("N_MISSING"); + return 0; + } + else if ( !strncasecmp(str,"F_MISSING",len) ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->setter = &filters_set_nmissing; + tok->tag = strdup("F_MISSING"); + return 0; + } + } + + // does it have array subscript? + int is_array = 0; + kstring_t tmp = {0,0,0}; + kputsn(str, len, &tmp); + if ( tmp.s[tmp.l-1] == ']' ) + { + int i; + for (i=0; ihdr_id = bcf_hdr_id2int(filter->hdr,BCF_DT_ID,tmp.s); + if ( is_fmt==-1 ) + { + if ( tok->hdr_id >=0 ) + { + int is_info = bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_INFO,tok->hdr_id) ? 1 : 0; + is_fmt = bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_FMT,tok->hdr_id) ? 1 : 0; + if ( is_info && is_fmt ) + error("Error: ambiguous filtering expression, both INFO/%s and FORMAT/%s are defined in the VCF header.\n" , tmp.s,tmp.s); + } + if ( is_fmt==-1 ) is_fmt = 0; + } + if ( is_array ) + parse_tag_idx(filter->hdr, is_fmt, tmp.s, tmp.s+is_array, tok); + else if ( is_fmt && !tok->nsamples ) + { + int i; + tok->nsamples = bcf_hdr_nsamples(filter->hdr); + tok->usmpl = (uint8_t*) malloc(tok->nsamples); + for (i=0; insamples; i++) tok->usmpl[i] = 1; + } + + tok->tag_type = is_fmt ? BCF_HL_FMT : BCF_HL_INFO; + if ( is_fmt ) filter->max_unpack |= BCF_UN_FMT; + if ( tok->hdr_id>=0 ) + { + if ( is_fmt && !strcmp("GT",tmp.s) ) + { + tok->setter = &filters_set_genotype_string; tok->is_str = 1; + } + else if ( is_fmt ) + { + if ( !bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_FMT,tok->hdr_id) ) + error("No such FORMAT field: %s\n", tmp.s); + if ( bcf_hdr_id2number(filter->hdr,BCF_HL_FMT,tok->hdr_id)!=1 && !is_array ) + { + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + tok->idx = -2; + } + switch ( bcf_hdr_id2type(filter->hdr,BCF_HL_FMT,tok->hdr_id) ) + { + case BCF_HT_INT: tok->setter = &filters_set_format_int; break; + case BCF_HT_REAL: tok->setter = &filters_set_format_float; break; + case BCF_HT_STR: tok->setter = &filters_set_format_string; tok->is_str = 1; break; + default: error("[%s:%d %s] FIXME\n", __FILE__,__LINE__,__FUNCTION__); + } + } + else if ( !bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_INFO,tok->hdr_id) ) + error("No such INFO field: %s\n", tmp.s); + else + { + if ( bcf_hdr_id2type(filter->hdr,BCF_HL_INFO,tok->hdr_id) == BCF_HT_FLAG ) + tok->setter = filters_set_info_flag; + else + { + if ( bcf_hdr_id2type(filter->hdr,BCF_HL_INFO,tok->hdr_id) == BCF_HT_STR ) tok->is_str = 1; + if ( bcf_hdr_id2number(filter->hdr,BCF_HL_INFO,tok->hdr_id)==1 ) + tok->setter = filters_set_info; + else + { + switch ( bcf_hdr_id2type(filter->hdr,BCF_HL_INFO,tok->hdr_id) ) + { + case BCF_HT_INT: tok->setter = &filters_set_info_int; break; + case BCF_HT_REAL: tok->setter = &filters_set_info_float; break; + case BCF_HT_STR: tok->setter = &filters_set_info_string; tok->is_str = 1; break; + default: error("[%s:%d %s] FIXME\n", __FILE__,__LINE__,__FUNCTION__); + } + if (!is_array) + { + tok->idx = -2; + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + } + } + } + filter->max_unpack |= BCF_UN_INFO; + } + tok->tag = strdup(tmp.s); + if ( tmp.s ) free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"ALT") ) + { + tok->setter = &filters_set_alt_string; + tok->is_str = 1; + tok->tag = strdup(tmp.s); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"AN") ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->setter = &filters_set_an; + tok->tag = strdup("AN"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"AC") ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->setter = &filters_set_ac; + tok->tag = strdup("AC"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"MAC") ) + { + filter->max_unpack |= max_ac_an_unpack(filter->hdr); + tok->setter = &filters_set_mac; + tok->tag = strdup("MAC"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"AF") ) + { + filter->max_unpack |= max_ac_an_unpack(filter->hdr); + tok->setter = &filters_set_af; + tok->tag = strdup("AF"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"MAF") ) + { + filter->max_unpack |= max_ac_an_unpack(filter->hdr); + tok->setter = &filters_set_maf; + tok->tag = strdup("MAF"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"ILEN") || !strcasecmp(tmp.s,"%ILEN") ) + { + filter->max_unpack |= BCF_UN_STR; + tok->setter = &filters_set_ilen; + tok->tag = strdup("ILEN"); + free(tmp.s); + return 0; + } + + // is it a value? Here we parse as integer/float separately and use strtof + // rather than strtod, because the more accurate double representation + // would invalidate floating point comparisons like QUAL=59.2, obtained via + // htslib/vcf parser. + // Update: use strtod() and force floats only in comparisons + char *end; + tok->threshold = strtol(tmp.s, &end, 10); // integer? + if ( end - tmp.s != strlen(tmp.s) ) + { + errno = 0; + tok->threshold = strtod(tmp.s, &end); // float? + if ( errno!=0 || end!=tmp.s+len ) error("[%s:%d %s] Error: the tag \"%s\" is not defined in the VCF header\n", __FILE__,__LINE__,__FUNCTION__,tmp.s); + } + tok->is_constant = 1; + + if ( tmp.s ) free(tmp.s); + return 0; +} + + +static void filter_debug_print(token_t *toks, token_t **tok_ptrs, int ntoks) +{ + int i; + for (i=0; itok_type==TOK_VAL ) + { + if ( tok->key ) + fprintf(stderr,"%s", tok->key); + else if ( tok->tag ) + fprintf(stderr,"%s", tok->tag); + else + fprintf(stderr,"%e", tok->threshold); + } + else + fprintf(stderr,"%c", TOKEN_STRING[tok->tok_type]); + if ( tok->setter ) fprintf(stderr,"\t[setter %p]", tok->setter); + fprintf(stderr,"\n"); + } +} + +static void str_to_lower(char *str) +{ + while ( *str ) { *str = tolower(*str); str++; } +} +static int perl_exec(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ +#if ENABLE_PERL_FILTERS + + PerlInterpreter *perl = flt->perl; + if ( !perl ) error("Error: perl expression without a perl script name\n"); + + dSP; + ENTER; + SAVETMPS; + + PUSHMARK(SP); + int i,j, istack = nstack - rtok->nargs; + for (i=istack+1; iis_str ) + XPUSHs(sv_2mortal(newSVpvn(tok->str_value.s,tok->str_value.l))); + else if ( tok->nvalues==1 ) + XPUSHs(sv_2mortal(newSVnv(tok->values[0]))); + else if ( tok->nvalues>1 ) + { + AV *av = newAV(); + for (j=0; jnvalues; j++) av_push(av, newSVnv(tok->values[j])); + SV *rv = newRV_inc((SV*)av); + XPUSHs(rv); + } + else + { + bcf_double_set_missing(tok->values[0]); + XPUSHs(sv_2mortal(newSVnv(tok->values[0]))); + } + } + PUTBACK; + + // A possible future todo: provide a means to select samples and indexes, + // expressions like this don't work yet + // perl.filter(FMT/AD)[1:0] + + int nret = call_pv(stack[istack]->str_value.s, G_ARRAY); + + SPAGAIN; + + rtok->nvalues = nret; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + for (i=nret; i>0; i--) + { + rtok->values[i-1] = (double) POPn; + if ( isnan(rtok->values[i-1]) ) bcf_double_set_missing(rtok->values[i-1]); + } + + PUTBACK; + FREETMPS; + LEAVE; + +#else + error("\nPerl filtering requires running `configure --enable-perl-filters` at compile time.\n\n"); +#endif + return rtok->nargs; +} +static void perl_init(filter_t *filter, char **str) +{ + char *beg = *str; + while ( *beg && isspace(*beg) ) beg++; + if ( !*beg ) return; + if ( strncasecmp("perl:", beg, 5) ) return; +#if ENABLE_PERL_FILTERS + beg += 5; + char *end = beg; + while ( *end && *end!=';' ) end++; // for now not escaping semicolons + *str = end+1; + + if ( ++filter_ninit == 1 ) + { + // must be executed only once, even for multiple filters; first time here + int argc = 0; + char **argv = NULL; + char **env = NULL; + PERL_SYS_INIT3(&argc, &argv, &env); + } + + filter->perl = perl_alloc(); + PerlInterpreter *perl = filter->perl; + + if ( !perl ) error("perl_alloc failed\n"); + perl_construct(perl); + + // name of the perl script to run + char *rmme = (char*) calloc(end - beg + 1,1); + memcpy(rmme, beg, end - beg); + char *argv[] = { "", "" }; + argv[1] = expand_path(rmme); + free(rmme); + + PL_origalen = 1; // don't allow $0 change + int ret = perl_parse(filter->perl, NULL, 2, argv, NULL); + PL_exit_flags |= PERL_EXIT_DESTRUCT_END; + if ( ret ) error("Failed to parse: %s\n", argv[1]); + free(argv[1]); + + perl_run(perl); +#else + error("\nPerl filtering requires running `configure --enable-perl-filters` at compile time.\n\n"); +#endif +} +static void perl_destroy(filter_t *filter) +{ +#if ENABLE_PERL_FILTERS + if ( !filter->perl ) return; + + PerlInterpreter *perl = filter->perl; + perl_destruct(perl); + perl_free(perl); + if ( --filter_ninit <= 0 ) + { + // similarly to PERL_SYS_INIT3, can must be executed only once? todo: test + PERL_SYS_TERM(); + } +#endif +} + + +// Parse filter expression and convert to reverse polish notation. Dijkstra's shunting-yard algorithm +filter_t *filter_init(bcf_hdr_t *hdr, const char *str) +{ + filter_t *filter = (filter_t *) calloc(1,sizeof(filter_t)); + filter->str = strdup(str); + filter->hdr = hdr; + filter->max_unpack |= BCF_UN_STR; + + int nops = 0, mops = 0; // operators stack + int nout = 0, mout = 0; // filter tokens, RPN + token_t *out = NULL; + token_t *ops = NULL; + char *tmp = filter->str; + perl_init(filter, &tmp); + + int last_op = -1; + while ( *tmp ) + { + int len, ret; + ret = filters_next_token(&tmp, &len); + if ( ret==-1 ) error("Missing quotes in: %s\n", str); + + // fprintf(stderr,"token=[%c] .. [%s] %d\n", TOKEN_STRING[ret], tmp, len); + // int i; for (i=0; i0 && ops[nops-1].tok_type!=TOK_LFT ) + { + nout++; + hts_expand0(token_t, nout, mout, out); + out[nout-1] = ops[nops-1]; + memset(&ops[nops-1],0,sizeof(token_t)); + nops--; + } + if ( nops<=0 ) error("Could not parse: %s\n", str); + memset(&ops[nops-1],0,sizeof(token_t)); + nops--; + } + else if ( ret!=TOK_VAL ) // one of the operators + { + // detect unary minus: replace -value with -1*(value) + if ( ret==TOK_SUB && last_op!=TOK_VAL && last_op!=TOK_RGT ) + { + nout++; + hts_expand0(token_t, nout, mout, out); + token_t *tok = &out[nout-1]; + tok->tok_type = TOK_VAL; + tok->hdr_id = -1; + tok->pass_site = -1; + tok->threshold = -1.0; + tok->is_constant = 1; + ret = TOK_MULT; + } + else if ( ret == -TOK_FUNC ) + { + // this is different from TOK_PERLSUB,TOK_BINOM in that the expression inside the + // brackets gets evaluated as normal expression + nops++; + hts_expand0(token_t, nops, mops, ops); + token_t *tok = &ops[nops-1]; + tok->tok_type = -ret; + tok->hdr_id = -1; + tok->pass_site = -1; + tok->threshold = -1.0; + if ( !strncasecmp(tmp-len,"N_PASS",6) ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->func = func_npass; + tok->tag = strdup("N_PASS"); + } + else if ( !strncasecmp(tmp-len,"F_PASS",6) ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->func = func_npass; + tok->tag = strdup("F_PASS"); + } + else error("The function \"%s\" is not supported\n", tmp-len); + continue; + } + else if ( ret < 0 ) // variable number of arguments: TOK_PERLSUB,TOK_BINOM + { + ret = -ret; + + tmp += len; + char *beg = tmp; + kstring_t rmme = {0,0,0}; + int i, margs, nargs = 0; + + if ( ret == TOK_PERLSUB ) + { + while ( *beg && ((isalnum(*beg) && !ispunct(*beg)) || *beg=='_') ) beg++; + if ( *beg!='(' ) error("Could not parse the expression: %s\n", str); + + // the subroutine name + kputc('"', &rmme); + kputsn(tmp, beg-tmp, &rmme); + kputc('"', &rmme); + nout++; + hts_expand0(token_t, nout, mout, out); + filters_init1(filter, rmme.s, rmme.l, &out[nout-1]); + nargs++; + } + char *end = beg; + while ( *end && *end!=')' ) end++; + if ( !*end ) error("Could not parse the expression: %s\n", str); + + // subroutine arguments + rmme.l = 0; + kputsn(beg+1, end-beg-1, &rmme); + char **rmme_list = hts_readlist(rmme.s, 0, &margs); + for (i=0; itok_type = ret; + tok->nargs = nargs; + tok->hdr_id = -1; + tok->pass_site = -1; + tok->threshold = -1.0; + + tmp = end + 1; + continue; + } + else + { + while ( nops>0 && op_prec[ret] < op_prec[ops[nops-1].tok_type] ) + { + nout++; + hts_expand0(token_t, nout, mout, out); + out[nout-1] = ops[nops-1]; + memset(&ops[nops-1],0,sizeof(token_t)); + nops--; + } + } + nops++; + hts_expand0(token_t, nops, mops, ops); + ops[nops-1].tok_type = ret; + } + else if ( !len ) + { + if ( *tmp && !isspace(*tmp) ) error("Could not parse the expression: [%s]\n", str); + break; // all tokens read + } + else // annotation name or filtering value + { + nout++; + hts_expand0(token_t, nout, mout, out); + if ( tmp[len-1]==',' ) + filters_init1(filter, tmp, len-1, &out[nout-1]); + else + filters_init1(filter, tmp, len, &out[nout-1]); + tmp += len; + } + last_op = ret; + } + while ( nops>0 ) + { + if ( ops[nops-1].tok_type==TOK_LFT || ops[nops-1].tok_type==TOK_RGT ) error("Could not parse the expression: [%s]\n", filter->str); + nout++; + hts_expand0(token_t, nout, mout, out); + out[nout-1] = ops[nops-1]; + memset(&ops[nops-1],0,sizeof(token_t)); + nops--; + } + + // In the special cases of TYPE and FILTER the BCF header IDs are yet unknown. Walk through the + // list of operators and convert the strings (e.g. "PASS") to BCF ids. The string value token must be + // just before or after the FILTER token and they must be followed with a comparison operator. + // At this point we also initialize regex expressions which, in RPN, must preceed the LIKE/NLIKE operator. + // Additionally, treat "." as missing value rather than a string in numeric equalities; that + // @file is only used with ID; etc. + // This code is fragile: improve me. + static int comma_separator_warned = 0; + int i; + for (i=0; istr); + + if ( out[i].hash ) + { + int j = out[i+1].tok_type==TOK_VAL ? i+1 : i-1; + if ( out[j].comparator!=filters_cmp_id ) + error("Error: could not parse the expression. Note that the \"@file_name\" syntax can be currently used with ID column only.\n"); + } + if ( out[i].tok_type==TOK_OR || out[i].tok_type==TOK_OR_VEC ) + out[i].func = vector_logic_or; + if ( out[i].tok_type==TOK_AND || out[i].tok_type==TOK_AND_VEC ) + out[i].func = vector_logic_and; + if ( out[i].tok_type==TOK_EQ || out[i].tok_type==TOK_NE ) + { + // Look for j="." and k numeric type + int j = i-1, k = i-2; + if ( !out[j].is_str ) { k = i-1, j = i-2; } + if ( out[j].is_str && out[j].key && !strcmp(".",out[j].key) ) + { + int set_missing = 0; + if ( out[k].hdr_id>0 ) + { + int type = bcf_hdr_id2type(filter->hdr,out[k].tag_type,out[k].hdr_id); + if ( type==BCF_HT_INT ) set_missing = 1; + else if ( type==BCF_HT_REAL ) set_missing = 1; + } + else if ( !strcmp("QUAL",out[k].tag) ) set_missing = 1; + if ( set_missing ) { out[j].is_str = 0; out[j].is_missing = 1; bcf_double_set_missing(out[j].values[0]); } + } + } + if ( out[i].tok_type==TOK_LIKE || out[i].tok_type==TOK_NLIKE ) + { + int j = i-1; + if ( !out[j].key ) + error("Could not parse the expression, wrong value for regex operator: %s\n", filter->str); + out[j].regex = (regex_t *) malloc(sizeof(regex_t)); + int cflags = REG_NOSUB; + int len = strlen(out[j].key); + if ( len>2 && out[j].key[len-1]=='i' && out[j].key[len-2]=='/' && out[j].key[len-3]!='\\' ) + { + out[j].key[len-2] = 0; + cflags |= REG_ICASE; + } + if ( regcomp(out[j].regex, out[j].key, cflags) ) + error("Could not compile the regex expression \"%s\": %s\n", out[j].key,filter->str); + } + if ( out[i].is_str && out[i].tok_type==TOK_VAL && out[i].key && strchr(out[i].key,',') ) + { + int print_note = 0; + if ( out[i+1].tok_type==TOK_EQ || (out[i+1].is_str && out[i+2].tok_type==TOK_EQ) ) print_note = 1; + else if ( out[i+1].tok_type==TOK_NE || (out[i+1].is_str && out[i+2].tok_type==TOK_NE) ) print_note = 1; + if ( print_note && !comma_separator_warned ) + { + comma_separator_warned = 1; + fprintf(stderr, + "Warning: comma is interpreted as a separator and OR logic is used in string comparisons.\n" + " (Search the manual for \"Comma in strings\" to learn more.)\n"); + } + } + if ( out[i].tok_type!=TOK_VAL ) continue; + if ( !out[i].tag ) continue; + if ( out[i].setter==filters_set_type ) + { + if ( i+1==nout ) error("Could not parse the expression: %s\n", filter->str); + int itok, ival; + if ( out[i+1].tok_type==TOK_EQ || out[i+1].tok_type==TOK_NE ) ival = i - 1, itok = i + 1; + else if ( out[i+1].tok_type==TOK_LIKE || out[i+1].tok_type==TOK_NLIKE ) ival = i - 1, itok = i + 1; + else if ( out[i+2].tok_type==TOK_EQ || out[i+2].tok_type==TOK_NE ) itok = i + 2, ival = i + 1; + else if ( out[i+2].tok_type==TOK_LIKE || out[i+2].tok_type==TOK_NLIKE ) itok = i + 2, ival = i + 1; + else error("[%s:%d %s] Could not parse the expression: %s\n", __FILE__,__LINE__,__FUNCTION__, filter->str); + if ( !strcasecmp(out[ival].key,"snp") || !strcasecmp(out[ival].key,"snps") ) { out[ival].threshold = VCF_SNP<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"indel") || !strcasecmp(out[ival].key,"indels") ) { out[ival].threshold = VCF_INDEL<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"mnp") || !strcasecmp(out[ival].key,"mnps") ) { out[ival].threshold = VCF_MNP<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"other") ) { out[ival].threshold = VCF_OTHER<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"bnd") ) { out[ival].threshold = VCF_BND<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"overlap") ) { out[ival].threshold = VCF_OVERLAP<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"ref") ) { out[ival].threshold = 1; out[ival].is_str = 0; } + else error("The type \"%s\" not recognised: %s\n", out[ival].key, filter->str); + out[ival].is_constant = 1; + if ( out[itok].tok_type==TOK_LIKE || out[itok].tok_type==TOK_NLIKE ) out[itok].comparator = filters_cmp_bit_and; + out[ival].tag = out[ival].key; out[ival].key = NULL; + i = itok; + continue; + } + if ( !strcmp(out[i].tag,"GT") ) + { + if ( i+1==nout ) error("Could not parse the expression: %s\n", filter->str); + int ival; + if ( out[i+1].tok_type==TOK_EQ || out[i+1].tok_type==TOK_NE ) ival = i - 1; + else if ( out[i+1].tok_type==TOK_LIKE || out[i+1].tok_type==TOK_NLIKE ) ival = i - 1; + else if ( out[i+2].tok_type==TOK_EQ || out[i+2].tok_type==TOK_NE ) ival = i + 1; + else if ( out[i+2].tok_type==TOK_LIKE || out[i+2].tok_type==TOK_NLIKE ) ival = i + 1; + else error("[%s:%d %s] Could not parse the expression: %s\n", __FILE__,__LINE__,__FUNCTION__, filter->str); + + if ( !out[ival].key ) error("Comparison between samples is not supported, sorry!\n"); + + // assign correct setters and unify expressions, eg ar->ra, HOM->hom, etc + if ( !strcasecmp(out[ival].key,"hom") ) { out[i].setter = filters_set_genotype3; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"het") ) { out[i].setter = filters_set_genotype3; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"hap") ) { out[i].setter = filters_set_genotype3; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"mis") ) { out[i].setter = filters_set_genotype4; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"ref") ) { out[i].setter = filters_set_genotype4; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"alt") ) { out[i].setter = filters_set_genotype4; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"rr") ) { out[i].setter = filters_set_genotype2; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"ra") || !strcasecmp(out[ival].key,"ar") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='r'; out[ival].key[1]='a'; } // ra + else if ( !strcmp(out[ival].key,"aA") || !strcmp(out[ival].key,"Aa") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='a'; out[ival].key[1]='A'; } // aA + else if ( !strcasecmp(out[ival].key,"aa") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='a'; out[ival].key[1]='a'; } // aa + else if ( !strcasecmp(out[ival].key,"a") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='a'; out[ival].key[1]=0; } // a + else if ( !strcasecmp(out[ival].key,"r") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='r'; out[ival].key[1]=0; } // r + continue; + } + if ( out[i].tag_type==BCF_HL_FLT ) + { + if ( i+1==nout ) error("Could not parse the expression: %s\n", filter->str); + int itok = i, ival; + if ( out[i+1].tok_type==TOK_EQ || out[i+1].tok_type==TOK_NE ) ival = i - 1; + else if ( out[i+1].tok_type==TOK_LIKE ) out[i+1].tok_type = TOK_IN, ival = i - 1; + else if ( out[i+1].tok_type==TOK_NLIKE ) out[i+1].tok_type = TOK_NOT_IN, ival = i - 1; + else if ( out[i+2].tok_type==TOK_EQ || out[i+2].tok_type==TOK_NE ) ival = ++i; + else if ( out[i+2].tok_type==TOK_LIKE ) out[i+2].tok_type = TOK_IN, ival = ++i; + else if ( out[i+2].tok_type==TOK_NLIKE ) out[i+2].tok_type = TOK_NOT_IN, ival = ++i; + else error("[%s:%d %s] Could not parse the expression: %s\n", __FILE__,__LINE__,__FUNCTION__, filter->str); + if ( out[ival].tok_type!=TOK_VAL || !out[ival].key ) + error("[%s:%d %s] Could not parse the expression, an unquoted string value perhaps? %s\n", __FILE__,__LINE__,__FUNCTION__, filter->str); + token_t *tok = &out[ival]; + char *bp = tok->key; + tok->nvalues = 0; + int has_missing = 0; + while ( *bp ) + { + char tmp, *ep = bp; + while ( *ep && *ep!=';' ) ep++; + tmp = *ep; + *ep = 0; + if ( !strcmp(".",bp) ) has_missing = 1; + else + { + tok->nvalues++; + hts_expand(double,tok->nvalues,tok->mvalues,tok->values); + int id = bcf_hdr_id2int(filter->hdr, BCF_DT_ID, bp); + if ( !bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_FLT,id) ) + error("The filter \"%s\" not present in the VCF header\n", bp); + tok->values[tok->nvalues-1] = id; + } + *ep = tmp; + if ( !tmp ) break; + bp = ep + 1; + } + if ( has_missing && tok->nvalues ) error("The FILTER expression cannot contain missing value AND filters: \"%s\" (%d)\n",tok->key,tok->nvalues); + out[ival].tag = tok->key; + tok->key = NULL; + out[itok].hdr_id = tok->hdr_id; + continue; + } + } + filter->nsamples = filter->max_unpack&BCF_UN_FMT ? bcf_hdr_nsamples(filter->hdr) : 0; + for (i=0; insamples ) + { + out[i].pass_samples = (uint8_t*)malloc(filter->nsamples); + int j; + for (j=0; jnsamples; j++) out[i].pass_samples[j] = 0; + } + } + + if (0) filter_debug_print(out, NULL, nout); + + if ( mops ) free(ops); + filter->filters = out; + filter->nfilters = nout; + filter->flt_stack = (token_t **)malloc(sizeof(token_t*)*nout); + return filter; +} + +void filter_destroy(filter_t *filter) +{ + perl_destroy(filter); + int i; + for (i=0; infilters; i++) + { + if ( filter->filters[i].key ) free(filter->filters[i].key); + free(filter->filters[i].str_value.s); + free(filter->filters[i].tag); + free(filter->filters[i].idxs); + free(filter->filters[i].usmpl); + free(filter->filters[i].values); + free(filter->filters[i].pass_samples); + if (filter->filters[i].hash) khash_str2int_destroy_free(filter->filters[i].hash); + if (filter->filters[i].regex) + { + regfree(filter->filters[i].regex); + free(filter->filters[i].regex); + } + } + free(filter->filters); + free(filter->flt_stack); + free(filter->str); + free(filter->tmpi); + free(filter->tmpf); + free(filter->tmps.s); + free(filter); +} + +int filter_test(filter_t *filter, bcf1_t *line, const uint8_t **samples) +{ + bcf_unpack(line, filter->max_unpack); + + int i, nstack = 0; + for (i=0; infilters; i++) + { + filter->filters[i].pass_site = 0; + if ( filter->filters[i].tok_type == TOK_VAL ) + { + if ( filter->filters[i].setter ) // variable, query the VCF line + filter->filters[i].setter(filter, line, &filter->filters[i]); + else if ( filter->filters[i].key ) // string constant + { + filter->filters[i].str_value.l = 0; + kputs(filter->filters[i].key, &filter->filters[i].str_value); + filter->filters[i].nvalues = filter->filters[i].str_value.l; + } + else if ( filter->filters[i].is_constant ) // numeric constant + { + filter->filters[i].values[0] = filter->filters[i].threshold; + filter->filters[i].nvalues = 1; + } + filter->flt_stack[nstack++] = &filter->filters[i]; + continue; + } + else if ( filter->filters[i].func ) + { + int nargs = filter->filters[i].func(filter, line, &filter->filters[i], filter->flt_stack, nstack); + filter->flt_stack[nstack-nargs] = &filter->filters[i]; + if ( --nargs > 0 ) nstack -= nargs; + continue; + } + if ( nstack<2 ) + error("Error occurred while processing the filter \"%s\" (1:%d)\n", filter->str,nstack); // too few values left on the stack + + int is_str = filter->flt_stack[nstack-1]->is_str + filter->flt_stack[nstack-2]->is_str; + + if ( filter->filters[i].tok_type == TOK_ADD ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],+,(double)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + else if ( filter->filters[i].tok_type == TOK_SUB ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],-,(double)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + else if ( filter->filters[i].tok_type == TOK_MULT ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],*,(double)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + else if ( filter->filters[i].tok_type == TOK_DIV ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],/,(double)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + else if ( filter->filters[i].tok_type == TOK_MODULO ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],%,(int)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + + // ideally, these comparators would become func, but this would require more work in init1() + if ( filter->filters[i].comparator ) + { + filter->filters[i].comparator(filter->flt_stack[nstack-1],filter->flt_stack[nstack-2],&filter->filters[i],line); + } + else if ( filter->flt_stack[nstack-1]->comparator ) + { + filter->flt_stack[nstack-1]->comparator(filter->flt_stack[nstack-1],filter->flt_stack[nstack-2],&filter->filters[i],line); + } + else if ( filter->flt_stack[nstack-2]->comparator ) + { + filter->flt_stack[nstack-2]->comparator(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],line); + } + else if ( is_str==2 ) + { + cmp_vector_strings(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i]); + } + else + { + if ( is_str==1 ) error("Error: cannot use arithmetic operators to compare strings and numbers\n"); + + // Determine what to do with one [1] or both [2] sides missing. The first field [0] gives [1]|[2] + int missing_logic[] = {0,0,0}; + if ( filter->filters[i].tok_type == TOK_EQ ) { missing_logic[0] = missing_logic[2] = 1; } + if ( filter->filters[i].tok_type == TOK_NE ) { missing_logic[0] = missing_logic[1] = 1; } + + if ( filter->filters[i].tok_type == TOK_EQ ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],==,missing_logic) + else if ( filter->filters[i].tok_type == TOK_NE ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],!=,missing_logic) + else if ( filter->filters[i].tok_type == TOK_LE ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],<=,missing_logic) + else if ( filter->filters[i].tok_type == TOK_LT ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],<,missing_logic) + else if ( filter->filters[i].tok_type == TOK_BT ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],>,missing_logic) + else if ( filter->filters[i].tok_type == TOK_BE ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],>=,missing_logic) + else + error("todo: %s:%d .. type=%d\n", __FILE__,__LINE__,filter->filters[i].tok_type); + } + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + } + if ( nstack>1 ) error("Error occurred while processing the filter \"%s\" (2:%d)\n", filter->str,nstack); // too few values left on the stack + if ( samples ) + { + *samples = filter->max_unpack&BCF_UN_FMT ? filter->flt_stack[0]->pass_samples : NULL; + if ( *samples && !filter->flt_stack[0]->nsamples ) + { + for (i=0; insamples; i++) + filter->flt_stack[0]->pass_samples[i] = filter->flt_stack[0]->pass_site; + } + } + return filter->flt_stack[0]->pass_site; +} + +int filter_max_unpack(filter_t *flt) +{ + return flt->max_unpack; +} + +const double *filter_get_doubles(filter_t *filter, int *nval, int *nval1) +{ + token_t *tok = filter->flt_stack[0]; + if ( tok->nvalues ) + { + *nval = tok->nvalues; + *nval1 = tok->nval1; + } + else + { + if ( !tok->values ) error("fixme in filter_get_doubles(): %s\n", filter->str); + *nval = 1; + *nval1 = 1; + tok->values[0] = filter->flt_stack[0]->pass_site; + } + return tok->values; +} + +void filter_set_samples(filter_t *filter, const uint8_t *samples) +{ + int i,j; + for (i=0; infilters; i++) + { + if ( !filter->filters[i].nsamples ) continue; + for (j=0; jfilters[i].nsamples; j++) filter->filters[i].usmpl[j] = samples[j]; + } +} + diff --git a/bcftools/filter.c.pysam.c b/bcftools/filter.c.pysam.c new file mode 100644 index 0000000..d15586c --- /dev/null +++ b/bcftools/filter.c.pysam.c @@ -0,0 +1,3673 @@ +#include "bcftools.pysam.h" + +/* filter.c -- filter expressions. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#endif +#include +#include +#include +#include +#include +#include "config.h" +#include "filter.h" +#include "bcftools.h" + +#if ENABLE_PERL_FILTERS +# define filter_t perl_filter_t +# include +# include +# undef filter_t +# define my_perl perl + +static int filter_ninit = 0; +#endif + + +#ifndef __FUNCTION__ +# define __FUNCTION__ __func__ +#endif + +typedef struct _token_t +{ + // read-only values, same for all VCF lines + int tok_type; // one of the TOK_* keys below + int nargs; // with TOK_PERLSUB the first argument is the name of the subroutine + char *key; // set only for string constants, otherwise NULL + char *tag; // for debugging and printout only, VCF tag name + double threshold; // filtering threshold + int is_constant; // the threshold is set + int hdr_id, tag_type; // BCF header lookup ID and one of BCF_HL_* types + int idx; // 0-based index to VCF vectors, + // -2: list (e.g. [0,1,2] or [1..3] or [1..] or any field[*], which is equivalent to [0..]) + int *idxs; // set indexes to 0 to exclude, to 1 to include, and last element negative if unlimited; used by VCF retrievers only + int nidxs, nuidxs; // size of idxs array and the number of elements set to 1 + uint8_t *usmpl; // bitmask of used samples as set by idx, set for FORMAT fields, NULL otherwise + int nsamples; // number of samples for format fields, 0 for info and other fields + void (*setter)(filter_t *, bcf1_t *, struct _token_t *); + int (*func)(filter_t *, bcf1_t *, struct _token_t *rtok, struct _token_t **stack, int nstack); + void (*comparator)(struct _token_t *, struct _token_t *, struct _token_t *rtok, bcf1_t *); + void *hash; // test presence of str value in the hash via comparator + regex_t *regex; // precompiled regex for string comparison + + // modified on filter evaluation at each VCF line + double *values; + kstring_t str_value; + int is_str, is_missing; // is_missing is set only for constants, variables are controled via nvalues + int pass_site; // -1 not applicable, 0 fails, >0 pass + uint8_t *pass_samples; // status of individual samples + int nvalues, mvalues; // number of used values: n=0 for missing values, n=1 for scalars, for strings n=str_value.l + int nval1; // number of per-sample fields or string length +} +token_t; + +struct _filter_t +{ + bcf_hdr_t *hdr; + char *str; + int nfilters; + token_t *filters, **flt_stack; // filtering input tokens (in RPN) and evaluation stack + int32_t *tmpi; + float *tmpf; + kstring_t tmps; + int max_unpack, mtmpi, mtmpf, nsamples; +#if ENABLE_PERL_FILTERS + PerlInterpreter *perl; +#endif +}; + + +#define TOK_VAL 0 +#define TOK_LFT 1 // ( +#define TOK_RGT 2 // ) +#define TOK_LE 3 // less or equal +#define TOK_LT 4 // less than +#define TOK_EQ 5 // equal +#define TOK_BT 6 // bigger than +#define TOK_BE 7 // bigger or equal +#define TOK_NE 8 // not equal +#define TOK_OR 9 // | +#define TOK_AND 10 // & +#define TOK_ADD 11 // + +#define TOK_SUB 12 // - +#define TOK_MULT 13 // * +#define TOK_DIV 14 // / +#define TOK_MAX 15 +#define TOK_MIN 16 +#define TOK_AVG 17 +#define TOK_AND_VEC 18 // && (operator applied in samples) +#define TOK_OR_VEC 19 // || (operator applied in samples) +#define TOK_LIKE 20 // ~ regular expression +#define TOK_NLIKE 21 // !~ regular expression +#define TOK_SUM 22 +#define TOK_ABS 23 +#define TOK_LEN 24 +#define TOK_FUNC 25 +#define TOK_CNT 26 +#define TOK_PERLSUB 27 +#define TOK_BINOM 28 +#define TOK_PHRED 29 +#define TOK_MEDIAN 30 +#define TOK_STDEV 31 +#define TOK_sMAX 32 +#define TOK_sMIN 33 +#define TOK_sAVG 34 +#define TOK_sMEDIAN 35 +#define TOK_sSTDEV 36 +#define TOK_sSUM 37 +#define TOK_IN 38 // contains, e.g. FILTER~"A" +#define TOK_NOT_IN 39 // does not contain, e.g. FILTER!~"A" +#define TOK_MODULO 40 // % + +// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 +// ( ) [ < = > ] ! | & + - * / M m a A O ~ ^ S . l f c p b P i s % +static int op_prec[] = {0,1,1,5,5,5,5,5,5,2,3, 6, 6, 7, 7, 8, 8, 8, 3, 2, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7 }; +#define TOKEN_STRING "x()[<=>]!|&+-*/MmaAO~^S.lfcpis" // this is only for debugging, not maintained diligently + +static void cmp_vector_strings(token_t *atok, token_t *btok, token_t *rtok); + +// Return negative values if it is a function with variable number of arguments +static int filters_next_token(char **str, int *len) +{ + char *tmp = *str; + while ( *tmp && isspace(*tmp) ) tmp++; + *str = tmp; + *len = 0; + + // test for doubles: d.ddde[+-]dd + if ( isdigit(*str[0]) || *str[0]=='.' ) // strtod would eat +/- + { + double HTS_UNUSED v = strtod(*str, &tmp); + if ( *str!=tmp && (!tmp[0] || !isalnum(tmp[0])) ) + { + *len = tmp - (*str); + return TOK_VAL; + } + tmp = *str; + } + + if ( !strncasecmp(tmp,"SMPL_MAX(",9) ) { (*str) += 8; return TOK_sMAX; } + if ( !strncasecmp(tmp,"SMPL_MIN(",9) ) { (*str) += 8; return TOK_sMIN; } + if ( !strncasecmp(tmp,"SMPL_MEAN(",10) ) { (*str) += 9; return TOK_sAVG; } + if ( !strncasecmp(tmp,"SMPL_MEDIAN(",12) ) { (*str) += 11; return TOK_sMEDIAN; } + if ( !strncasecmp(tmp,"SMPL_AVG(",9) ) { (*str) += 8; return TOK_sAVG; } + if ( !strncasecmp(tmp,"SMPL_STDEV(",11) ) { (*str) += 10; return TOK_sSTDEV; } + if ( !strncasecmp(tmp,"SMPL_SUM(",9) ) { (*str) += 8; return TOK_sSUM; } + if ( !strncasecmp(tmp,"sMAX(",5) ) { (*str) += 4; return TOK_sMAX; } + if ( !strncasecmp(tmp,"sMIN(",5) ) { (*str) += 4; return TOK_sMIN; } + if ( !strncasecmp(tmp,"sMEAN(",6) ) { (*str) += 5; return TOK_sAVG; } + if ( !strncasecmp(tmp,"sMEDIAN(",8) ) { (*str) += 7; return TOK_sMEDIAN; } + if ( !strncasecmp(tmp,"sAVG(",5) ) { (*str) += 4; return TOK_sAVG; } + if ( !strncasecmp(tmp,"sSTDEV(",7) ) { (*str) += 6; return TOK_sSTDEV; } + if ( !strncasecmp(tmp,"sSUM(",5) ) { (*str) += 4; return TOK_sSUM; } + if ( !strncasecmp(tmp,"MAX(",4) ) { (*str) += 3; return TOK_MAX; } + if ( !strncasecmp(tmp,"MIN(",4) ) { (*str) += 3; return TOK_MIN; } + if ( !strncasecmp(tmp,"MEAN(",5) ) { (*str) += 4; return TOK_AVG; } + if ( !strncasecmp(tmp,"MEDIAN(",7) ) { (*str) += 6; return TOK_MEDIAN; } + if ( !strncasecmp(tmp,"AVG(",4) ) { (*str) += 3; return TOK_AVG; } + if ( !strncasecmp(tmp,"STDEV(",6) ) { (*str) += 5; return TOK_STDEV; } + if ( !strncasecmp(tmp,"SUM(",4) ) { (*str) += 3; return TOK_SUM; } + if ( !strncasecmp(tmp,"ABS(",4) ) { (*str) += 3; return TOK_ABS; } + if ( !strncasecmp(tmp,"COUNT(",4) ) { (*str) += 5; return TOK_CNT; } + if ( !strncasecmp(tmp,"STRLEN(",7) ) { (*str) += 6; return TOK_LEN; } + if ( !strncasecmp(tmp,"BINOM(",6) ) { (*str) += 5; return -TOK_BINOM; } + if ( !strncasecmp(tmp,"PHRED(",6) ) { (*str) += 5; return TOK_PHRED; } + if ( !strncasecmp(tmp,"%MAX(",5) ) { (*str) += 4; return TOK_MAX; } // for backward compatibility + if ( !strncasecmp(tmp,"%MIN(",5) ) { (*str) += 4; return TOK_MIN; } // for backward compatibility + if ( !strncasecmp(tmp,"%AVG(",5) ) { (*str) += 4; return TOK_AVG; } // for backward compatibility + if ( !strncasecmp(tmp,"%SUM(",5) ) { (*str) += 4; return TOK_SUM; } // for backward compatibility + if ( !strncasecmp(tmp,"INFO/",5) ) tmp += 5; + if ( !strncasecmp(tmp,"FORMAT/",7) ) tmp += 7; + if ( !strncasecmp(tmp,"FMT/",4) ) tmp += 4; + if ( !strncasecmp(tmp,"PERL.",5) ) { (*str) += 5; return -TOK_PERLSUB; } + if ( !strncasecmp(tmp,"N_PASS(",7) ) { *len = 6; (*str) += 6; return -TOK_FUNC; } + if ( !strncasecmp(tmp,"F_PASS(",7) ) { *len = 6; (*str) += 6; return -TOK_FUNC; } + if ( !strncasecmp(tmp,"%ILEN",5) ) { *len = 5; return TOK_VAL; } // to be able to distinguish between INFO/ILEN and on-the-fly ILEN + + if ( tmp[0]=='@' ) // file name + { + while ( *tmp && !isspace(*tmp) && *tmp!='=' && *tmp!='!' ) tmp++; + *len = tmp - (*str); + return TOK_VAL; + } + + int square_brackets = 0; + while ( tmp[0] ) + { + if ( !square_brackets ) + { + if ( tmp[0]=='"' ) break; + if ( tmp[0]=='\'' ) break; + if ( isspace(tmp[0]) ) break; + if ( tmp[0]=='<' ) break; + if ( tmp[0]=='>' ) break; + if ( tmp[0]=='=' ) break; + if ( tmp[0]=='!' ) break; + if ( tmp[0]=='&' ) break; + if ( tmp[0]=='|' ) break; + if ( tmp[0]=='(' ) break; + if ( tmp[0]==')' ) break; + if ( tmp[0]=='+' ) break; + if ( tmp[0]=='*' ) break; + if ( tmp[0]=='-' ) break; + if ( tmp[0]=='/' ) break; + if ( tmp[0]=='~' ) break; + if ( tmp[0]=='%' ) break; + } + if ( tmp[0]==']' ) { if (square_brackets) tmp++; break; } + if ( tmp[0]=='[' ) square_brackets++; + tmp++; + } + if ( tmp > *str ) + { + *len = tmp - (*str); + return TOK_VAL; + } + if ( tmp[0]=='"' || tmp[0]=='\'' ) + { + int quote = tmp[0]; + tmp++; + while ( *tmp && tmp[0]!=quote ) tmp++; + if ( !*tmp ) return -1; // missing quotes + *len = tmp - (*str) + 1; + return TOK_VAL; + } + if ( tmp[0]=='!' ) + { + if ( tmp[1]=='=' ) { (*str) += 2; return TOK_NE; } + if ( tmp[1]=='~' ) { (*str) += 2; return TOK_NLIKE; } + } + if ( tmp[0]=='<' ) + { + if ( tmp[1]=='=' ) { (*str) += 2; return TOK_LE; } + (*str) += 1; return TOK_LT; + } + if ( tmp[0]=='>' ) + { + if ( tmp[1]=='=' ) { (*str) += 2; return TOK_BE; } + (*str) += 1; return TOK_BT; + } + if ( tmp[0]=='=' ) + { + if ( tmp[1]=='=' ) { (*str) += 2; return TOK_EQ; } + (*str) += 1; return TOK_EQ; + } + if ( tmp[0]=='(' ) { (*str) += 1; return TOK_LFT; } + if ( tmp[0]==')' ) { (*str) += 1; return TOK_RGT; } + if ( tmp[0]=='&' && tmp[1]=='&' ) { (*str) += 2; return TOK_AND_VEC; } + if ( tmp[0]=='|' && tmp[1]=='|' ) { (*str) += 2; return TOK_OR_VEC; } + if ( tmp[0]=='&' ) { (*str) += 1; return TOK_AND; } + if ( tmp[0]=='|' ) { (*str) += 1; return TOK_OR; } + if ( tmp[0]=='+' ) { (*str) += 1; return TOK_ADD; } + if ( tmp[0]=='-' ) { (*str) += 1; return TOK_SUB; } + if ( tmp[0]=='*' ) { (*str) += 1; return TOK_MULT; } + if ( tmp[0]=='/' ) { (*str) += 1; return TOK_DIV; } + if ( tmp[0]=='~' ) { (*str) += 1; return TOK_LIKE; } + if ( tmp[0]=='%' ) { (*str) += 1; return TOK_MODULO; } + + *len = tmp - (*str); + return TOK_VAL; +} + + +/* + Simple path expansion, expands ~/, ~user, $var. The result must be freed by the caller. + + Based on jkb's staden code with some adjustments. + https://sourceforge.net/p/staden/code/HEAD/tree/staden/trunk/src/Misc/getfile.c#l123 +*/ +char *expand_path(char *path) +{ + kstring_t str = {0,0,0}; + + if ( path[0] == '~' ) + { + if ( !path[1] || path[1] == '/' ) + { +#ifdef _WIN32 + kputs(getenv("HOMEDRIVE"), &str); + kputs(getenv("HOMEPATH"), &str); +#else + // ~ or ~/path + kputs(getenv("HOME"), &str); + if ( path[1] ) kputs(path+1, &str); +#endif + } +#ifndef _WIN32 + else + { + // user name: ~pd3/path + char *end = path; + while ( *end && *end!='/' ) end++; + kputsn(path+1, end-path-1, &str); + struct passwd *pwentry = getpwnam(str.s); + str.l = 0; + + if ( !pwentry ) kputsn(path, end-path, &str); + else kputs(pwentry->pw_dir, &str); + kputs(end, &str); + } +#endif + return ks_release(&str); + } + if ( path[0] == '$' ) + { + char *var = getenv(path+1); + if ( var ) { + kputs(var, &str); + return ks_release(&str); + } + } + + return strdup(path); +} + +static void filters_set_qual(filter_t *flt, bcf1_t *line, token_t *tok) +{ + float *ptr = &line->qual; + if ( bcf_float_is_missing(*ptr) ) + bcf_double_set_missing(tok->values[0]); + else + tok->values[0] = (double)line->qual; + tok->nvalues = 1; +} +static void filters_set_type(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->values[0] = bcf_get_variant_types(line); + if ( !tok->values[0] ) tok->values[0] = 1; // mistake in htslib: VCF_* should start with 1 + else tok->values[0] = ((int)tok->values[0]) << 1; + tok->nvalues = 1; +} +static void filters_set_info(filter_t *flt, bcf1_t *line, token_t *tok) +{ + assert( tok->hdr_id >=0 ); + int i; + for (i=0; in_info; i++) + if ( line->d.info[i].key == tok->hdr_id ) break; + + if ( i==line->n_info ) + tok->nvalues = tok->str_value.l = 0; + else if ( line->d.info[i].type==BCF_BT_CHAR ) + { + int n = line->d.info[i].len; + if ( n >= tok->str_value.m ) + { + tok->str_value.m = n + 1; + tok->str_value.s = (char*) realloc(tok->str_value.s, tok->str_value.m); + if ( !tok->str_value.s ) error("Failed to alloc %d bytes\n", (int)tok->str_value.m); + } + memcpy(tok->str_value.s, line->d.info[i].vptr, n); + tok->str_value.s[n] = 0; + tok->nvalues = tok->str_value.l = n; + } + else if ( line->d.info[i].type==BCF_BT_FLOAT ) + { + if ( bcf_float_is_missing(line->d.info[i].v1.f) ) tok->nvalues = 0; + else + { + tok->values[0] = line->d.info[i].v1.f; + tok->nvalues = 1; + } + tok->str_value.l = 0; + } + else + { + tok->str_value.l = 0; + if ( line->d.info[i].type==BCF_BT_INT8 && line->d.info[i].v1.i==bcf_int8_missing ) tok->nvalues = 0; + else if ( line->d.info[i].type==BCF_BT_INT16 && line->d.info[i].v1.i==bcf_int16_missing ) tok->nvalues = 0; + else if ( line->d.info[i].type==BCF_BT_INT32 && line->d.info[i].v1.i==bcf_int32_missing ) tok->nvalues = 0; + else + { + tok->values[0] = line->d.info[i].v1.i; + tok->nvalues = 1; + } + } +} +static void filters_cmp_bit_and(token_t *atok, token_t *btok, token_t *rtok, bcf1_t *line) +{ + int a = (int)(atok->nvalues?atok->values[0]:atok->threshold); + int b = (int)(btok->nvalues?btok->values[0]:btok->threshold); + if ( rtok->tok_type==TOK_LIKE ) + rtok->pass_site = a&b ? 1 : 0; + else + rtok->pass_site = a&b ? 0 : 1; +} +static void filters_cmp_filter(token_t *atok, token_t *btok, token_t *rtok, bcf1_t *line) +{ + // the btok values contain FILTER ids obtained by parsing the user expression + int i,j; + if ( rtok->tok_type==TOK_NOT_IN ) // fail if the query expression is a subset of the VCF FILTER + { + if ( !btok->nvalues ) // the query expression is ".", pass everything unless the VCF is also "." + { + if ( line->d.n_flt ) rtok->pass_site = 1; + return; + } + if ( !line->d.n_flt ) // no filters at this VCF line and the query expression has a value + { + rtok->pass_site = 1; + return; + } + for (j=0; jnvalues; j++) // some query expression value must be absent from VCF in order to pass + { + for (i=0; id.n_flt; i++) + if ( btok->values[j]==line->d.flt[i] ) break; + if ( i==line->d.n_flt ) break; // the query is not in the VCF + } + if ( j!=btok->nvalues ) rtok->pass_site = 1; + return; + } + else if ( rtok->tok_type==TOK_IN ) + { + if ( !btok->nvalues ) // the query expression is ".", fail everything unless the VCF is also "." + { + if ( !line->d.n_flt ) rtok->pass_site = 1; + return; + } + if ( !line->d.n_flt ) return; // no filters at this VCF line and the query expression has a value + for (j=0; jnvalues; j++) // all of the query values must be present in the VCF in order to pass + { + for (i=0; id.n_flt; i++) + if ( btok->values[j]==line->d.flt[i] ) break; + if ( i==line->d.n_flt ) break; // the query is not in the VCF + } + if ( j==btok->nvalues ) rtok->pass_site = 1; + return; + } + else if ( rtok->tok_type==TOK_NE ) // require anything but exact match + { + if ( btok->nvalues != line->d.n_flt ) + { + rtok->pass_site = 1; + return; + } + if ( !btok->nvalues ) return; + for (j=0; jnvalues; j++) // some of the query values must be absent from the VCF in order to pass + { + for (i=0; id.n_flt; i++) + if ( btok->values[j]==line->d.flt[i] ) break; + if ( i==line->d.n_flt ) break; // the query is not in the VCF + } + if ( j!=btok->nvalues ) rtok->pass_site = 1; + return; + } + else if ( rtok->tok_type==TOK_EQ ) // require exact match + { + if ( btok->nvalues != line->d.n_flt ) return; + if ( !btok->nvalues ) + { + rtok->pass_site = 1; + return; + } + for (j=0; jnvalues; j++) // all of the query values must be present in the VCF in order to pass + { + for (i=0; id.n_flt; i++) + if ( btok->values[j]==line->d.flt[i] ) break; + if ( i==line->d.n_flt ) break; // the query is not in the VCF + } + if ( j==btok->nvalues ) rtok->pass_site = 1; + return; + } + else + error("Only ==, !=, ~, and !~ operators are supported for FILTER\n"); + return; +} +static void filters_cmp_id(token_t *atok, token_t *btok, token_t *rtok, bcf1_t *line) +{ + if ( btok->hash ) + { + token_t *tmp = atok; atok = btok; btok = tmp; + } + if ( atok->hash ) + { + if ( rtok->tok_type!=TOK_EQ && rtok->tok_type!=TOK_NE ) + error("Only == and != operators are supported for strings read from a file\n"); + + int ret = khash_str2int_has_key(atok->hash, line->d.id); + if ( rtok->tok_type==TOK_NE ) ret = ret ? 0 : 1; + rtok->pass_site = ret; + return; + } + + if ( !btok->str_value.l ) error("Error occurred while evaluating the expression\n"); + + if ( rtok->tok_type==TOK_EQ ) + rtok->pass_site = strcmp(btok->str_value.s,line->d.id) ? 0 : 1; + else if ( rtok->tok_type==TOK_NE ) + rtok->pass_site = strcmp(btok->str_value.s,line->d.id) ? 1 : 0; + else + { + if ( rtok->tok_type!=TOK_LIKE && rtok->tok_type!=TOK_NLIKE ) + error("Only the following operators are supported for querying ID: ==, !=, ~, !~; the operator type %d is not supported (%p %p)\n", + rtok->tok_type,atok->regex,btok->regex); + + regex_t *regex = atok->regex ? atok->regex : (btok->regex ? btok->regex : NULL); + if ( !regex ) error("fixme: regex initialization failed\n"); + rtok->pass_site = regexec(regex,line->d.id, 0,NULL,0) ? 0 : 1; + if ( rtok->tok_type==TOK_NLIKE ) rtok->pass_site = rtok->pass_site ? 0 : 1; + } +} + +/** + * bcf_get_info_value() - get single INFO value, int64_t or double + * @line: BCF line + * @info_id: tag ID, as returned by bcf_hdr_id2int + * @ivec: 0-based index to retrieve, -1 when single value is expected + * @vptr: pointer to memory location of sufficient size to accomodate + * info_id's type + * + * The returned value is -1 if tag is not present, 0 if present but + * values is missing or ivec is out of range, and 1 on success. + */ +static int bcf_get_info_value(bcf1_t *line, int info_id, int ivec, void *value) +{ + int j; + for (j=0; jn_info; j++) + if ( line->d.info[j].key == info_id ) break; + if ( j==line->n_info ) return -1; + + bcf_info_t *info = &line->d.info[j]; + if ( info->len == 1 ) + { + if ( info->type==BCF_BT_FLOAT ) *((double*)value) = info->v1.f; + else if ( info->type==BCF_BT_INT8 || info->type==BCF_BT_INT16 || info->type==BCF_BT_INT32 ) *((int64_t*)value) = info->v1.i; + return 1; + } + + if ( ivec<0 ) ivec = 0; + + #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ + type_t *p = (type_t *) info->vptr; \ + for (j=0; jlen; j++) \ + { \ + if ( is_vector_end ) return 0; \ + } \ + if ( is_missing ) return 0; \ + *((out_type_t*)value) = p[j]; \ + return 1; \ + } + switch (info->type) { + case BCF_BT_INT8: BRANCH(int8_t, p[j]==bcf_int8_missing, p[j]==bcf_int8_vector_end, int64_t); break; + case BCF_BT_INT16: BRANCH(int16_t, p[j]==bcf_int16_missing, p[j]==bcf_int16_vector_end, int64_t); break; + case BCF_BT_INT32: BRANCH(int32_t, p[j]==bcf_int32_missing, p[j]==bcf_int32_vector_end, int64_t); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(p[j]), bcf_float_is_vector_end(p[j]), double); break; + default: fprintf(bcftools_stderr,"todo: type %d\n", info->type); bcftools_exit(1); break; + } + #undef BRANCH + return -1; // this shouldn't happen +} + +static void filters_set_chrom(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->str_value.l = 0; + kputs(bcf_seqname(flt->hdr,line), &tok->str_value); + tok->nvalues = tok->str_value.l; + tok->is_str = 1; +} + +static void filters_set_pos(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->values[0] = line->pos+1; + tok->nvalues = 1; +} + +static void filters_set_info_int(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( tok->idx==-2 ) + { + tok->nvalues = bcf_get_info_int32(flt->hdr,line,tok->tag,&flt->tmpi,&flt->mtmpi); + if ( tok->nvalues<=0 ) tok->nvalues = 0; + else + { + hts_expand(double,tok->nvalues,tok->mvalues,tok->values); + int i, j = 0, end = tok->idxs[tok->nidxs-1] < 0 ? tok->nvalues - 1 : tok->nidxs - 1; + if ( end >= tok->nvalues ) end = tok->nvalues - 1; + for (i=0; i<=end; i++) + if ( i>=tok->nidxs || tok->idxs[i] ) tok->values[j++] = flt->tmpi[i]; + tok->nvalues = j; + } + } + else + { + int64_t value = 0; + if ( bcf_get_info_value(line,tok->hdr_id,tok->idx,&value) <= 0 ) + tok->nvalues = 0; + else + { + tok->values[0] = value; + tok->nvalues = 1; + } + } +} + +static void filters_set_info_float(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( tok->idx==-2 ) + { + tok->nvalues = bcf_get_info_float(flt->hdr,line,tok->tag,&flt->tmpf,&flt->mtmpf); + if ( tok->nvalues<=0 ) tok->nvalues = 0; + else + { + hts_expand(double,tok->nvalues,tok->mvalues,tok->values); + int i, j = 0, end = tok->idxs[tok->nidxs-1] < 0 ? tok->nvalues - 1 : tok->nidxs - 1; + if ( end >= tok->nvalues ) end = tok->nvalues - 1; + for (i=0; i<=end; i++) + if ( i>=tok->nidxs || tok->idxs[i] ) + { + if ( bcf_float_is_missing(flt->tmpf[i]) ) bcf_double_set_missing(tok->values[j]); + else tok->values[j] = flt->tmpf[i]; + j++; + } + tok->nvalues = j; + } + } + else + { + double value; + if ( bcf_get_info_value(line,tok->hdr_id,tok->idx,&value) <= 0 ) + tok->nvalues = 0; + else + { + tok->values[0] = value; + tok->nvalues = 1; + } + } +} + +static void filters_set_info_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + int32_t m = tok->str_value.m; + int n = bcf_get_info_string(flt->hdr,line,tok->tag,&tok->str_value.s,&m); + tok->str_value.m = m; + if ( n<0 ) { tok->nvalues = tok->str_value.l = 0; return; } + + if ( tok->idx>=0 ) + { + // get ith field (i=tok->idx) + int i = 0; + char *ss = tok->str_value.s, *se = tok->str_value.s + n; + while ( ssidx ) + { + if ( *ss==',' ) i++; + ss++; + } + if ( ss==se || i!=tok->idx ) { tok->nvalues = tok->str_value.l = 0; return; } + se = ss; + while ( se - tok->str_value.s < n && *se!=',' ) se++; + if ( ss==tok->str_value.s ) *se = 0; + else + { + memmove(tok->str_value.s, ss, se-ss); + tok->str_value.s[se-ss] = 0; + } + tok->str_value.l = se - ss; + } + else if ( tok->idx==-2 && tok->idxs[0]==-1 ) // keep all values, TAG[*] + tok->str_value.l = n; + else if ( tok->idx==-2 ) + { + flt->tmps.l = 0; + ks_resize(&flt->tmps, n); + int i, iend = tok->idxs[tok->nidxs-1] < 0 ? n - 1 : tok->nidxs - 1; + if ( iend >= n ) iend = n - 1; + char *beg = tok->str_value.s, *dst = flt->tmps.s; + for (i=0; i<=iend; i++) + { + char *end = beg; + while ( *end && *end!=',' ) end++; + if ( i>=tok->nidxs || tok->idxs[i] ) + { + memcpy(dst, beg, end - beg); + dst += end - beg; + dst[0] = ','; + dst++; + } + beg = end+1; + } + dst[0] = 0; + tok->str_value.l = dst - flt->tmps.s; + + #define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } + SWAP(char *, flt->tmps.s, tok->str_value.s); + SWAP(size_t, flt->tmps.m, tok->str_value.m); + } + tok->nvalues = tok->str_value.l; +} + +static void filters_set_info_flag(filter_t *flt, bcf1_t *line, token_t *tok) +{ + int j; + for (j=0; jn_info; j++) + if ( line->d.info[j].key == tok->hdr_id ) break; + tok->values[0] = j==line->n_info ? 0 : 1; + tok->nvalues = 1; +} + +static void filters_set_format_int(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( line->n_sample != tok->nsamples ) + error("Incorrect number of FORMAT fields at %s:%"PRId64" .. %s, %d vs %d\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,tok->tag,line->n_sample,tok->nsamples); + + int nvals; + if ( (nvals=bcf_get_format_int32(flt->hdr,line,tok->tag,&flt->tmpi,&flt->mtmpi))<0 ) + { + tok->nvalues = 0; + return; + } + int i, nsrc1 = nvals / tok->nsamples; + tok->nval1 = tok->idx >= 0 ? 1 : (tok->nuidxs ? tok->nuidxs : nsrc1); + tok->nvalues = tok->nval1*tok->nsamples; + hts_expand(double, tok->nvalues, tok->mvalues, tok->values); + + if ( tok->idx >= 0 ) // scalar or vector index + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + int32_t *ptr = flt->tmpi + i*nsrc1; + if ( tok->idx>=nsrc1 || ptr[tok->idx]==bcf_int32_missing ) + bcf_double_set_missing(tok->values[i]); + else if ( ptr[tok->idx]==bcf_int32_vector_end ) + bcf_double_set_vector_end(tok->values[i]); + else + tok->values[i] = ptr[tok->idx]; + } + } + else + { + int kend = tok->idxs[tok->nidxs-1] < 0 ? tok->nval1 : tok->nidxs; + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + int32_t *src = flt->tmpi + i*nsrc1; + double *dst = tok->values + i*tok->nval1; + int k, j = 0; + for (k=0; knidxs && !tok->idxs[k] ) continue; + if ( src[k]==bcf_int32_missing ) + bcf_double_set_missing(dst[j]); + else if ( src[k]==bcf_int32_vector_end ) + bcf_double_set_vector_end(dst[j]); + else + dst[j] = src[k]; + j++; + } + if ( j==0 ) + { + bcf_double_set_missing(dst[j]); + j++; + } + while (j < tok->nval1) + { + bcf_double_set_vector_end(dst[j]); + j++; + } + } + } +} +static void filters_set_format_float(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( line->n_sample != tok->nsamples ) + error("Incorrect number of FORMAT fields at %s:%"PRId64" .. %s, %d vs %d\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,tok->tag,line->n_sample,tok->nsamples); + + int nvals; + if ( (nvals=bcf_get_format_float(flt->hdr,line,tok->tag,&flt->tmpf,&flt->mtmpf))<0 ) + { + tok->nvalues = 0; + return; + } + int i, nsrc1 = nvals / tok->nsamples; + tok->nval1 = tok->idx >= 0 ? 1 : (tok->nuidxs ? tok->nuidxs : nsrc1); + tok->nvalues = tok->nval1*tok->nsamples; + hts_expand(double, tok->nvalues, tok->mvalues, tok->values); + + if ( tok->idx >= 0 ) // scalar or vector index + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + float *ptr = flt->tmpf + i*nsrc1; + if ( tok->idx>=nsrc1 || bcf_float_is_missing(ptr[tok->idx]) ) + bcf_double_set_missing(tok->values[i]); + else if ( bcf_float_is_vector_end(ptr[tok->idx]) ) + bcf_double_set_vector_end(tok->values[i]); + else + tok->values[i] = ptr[tok->idx]; + } + } + else + { + int kend = tok->idxs[tok->nidxs-1] < 0 ? tok->nval1 : tok->nidxs; + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + float *src = flt->tmpf + i*nsrc1; + double *dst = tok->values + i*tok->nval1; + int k, j = 0; + for (k=0; knidxs && !tok->idxs[k] ) continue; + if ( bcf_float_is_missing(src[k]) ) + bcf_double_set_missing(dst[j]); + else if ( bcf_float_is_vector_end(src[k]) ) + bcf_double_set_vector_end(dst[j]); + else + dst[j] = src[k]; + j++; + } + if ( j==0 ) + { + bcf_double_set_missing(dst[j]); + j++; + } + while (j < tok->nval1) + { + bcf_double_set_vector_end(dst[j]); + j++; + } + } + } +} +static void filters_set_format_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + if ( line->n_sample != tok->nsamples ) + error("Incorrect number of FORMAT fields at %s:%"PRId64" .. %s, %d vs %d\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,tok->tag,line->n_sample,tok->nsamples); + + int i, ndim = tok->str_value.m; + int nstr = bcf_get_format_char(flt->hdr, line, tok->tag, &tok->str_value.s, &ndim); + tok->str_value.m = ndim; + tok->str_value.l = tok->nvalues = 0; + + if ( nstr<0 ) return; + + tok->nvalues = tok->str_value.l = nstr; + tok->nval1 = nstr / tok->nsamples; + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + char *src = tok->str_value.s + i*tok->nval1, *dst = src; + int ibeg = 0, idx = 0; + while ( ibeg < tok->nval1 ) + { + int iend = ibeg; + while ( iend < tok->nval1 && src[iend] && src[iend]!=',' ) iend++; + + int keep = 0; + if ( tok->idx >= 0 ) + { + if ( tok->idx==idx ) keep = 1; + } + else if ( idx < tok->nidxs ) + { + if ( tok->idxs[idx] != 0 ) keep = 1; + } + else if ( tok->idxs[tok->nidxs-1] < 0 ) + keep = 1; + + if ( keep ) + { + if ( ibeg!=0 ) memmove(dst, src+ibeg, iend-ibeg+1); + dst += iend - ibeg + 1; + if ( tok->idx>=0 ) break; + } + if ( !src[iend] ) break; + ibeg = iend + 1; + idx++; + } + if ( dst==src ) { dst[0] = '.'; dst+=2; } + if ( dst - src < tok->nval1 ) memset(dst-1, 0, tok->nval1 - (dst - src)); + } +} +static void _filters_set_genotype(filter_t *flt, bcf1_t *line, token_t *tok, int type) +{ + bcf_fmt_t *fmt = bcf_get_fmt(flt->hdr, line, "GT"); + if ( !fmt ) + { + tok->nvalues = tok->str_value.l = 0; + return; + } + + int i,j, nsmpl = bcf_hdr_nsamples(flt->hdr), nvals1 = type==2 ? 3 : 4; + if ( tok->str_value.m <= nvals1*nsmpl ) + { + tok->str_value.m = nvals1*nsmpl + 1; + tok->str_value.s = (char*)realloc(tok->str_value.s, tok->str_value.m); + } + +#define BRANCH_INT(type_t,vector_end) \ + { \ + for (i=0; in_sample; i++) \ + { \ + type_t *ptr = (type_t*) (fmt->p + i*fmt->size); \ + int is_het = 0, has_ref = 0, missing = 0; \ + for (j=0; jn; j++) \ + { \ + if ( ptr[j]==vector_end ) break; /* smaller ploidy */ \ + if ( bcf_gt_is_missing(ptr[j]) ) { missing=1; break; } /* missing allele */ \ + int ial = ptr[j]; \ + if ( bcf_gt_allele(ial)==0 ) has_ref = 1; \ + if ( j>0 ) \ + { \ + int jal = ptr[j-1]; \ + if ( bcf_gt_allele(ial)!=bcf_gt_allele(jal) ) is_het = 1; \ + } \ + } \ + char *dst = &tok->str_value.s[nvals1*i]; \ + if ( type==4 ) \ + { \ + if ( !j || missing ) dst[0]='m', dst[1]='i', dst[2]='s', dst[3] = 0; /* mis, missing genotype */ \ + else if ( !has_ref ) dst[0]='a', dst[1]='l', dst[2]='t', dst[3] = 0; /* alt, no ref, must have alt allele */ \ + else if ( !is_het ) dst[0]='r', dst[1]='e', dst[2]='f', dst[3] = 0; /* ref, must be ref-only, no alt alelle */ \ + else dst[0]='a', dst[1]='l', dst[2]='t', dst[3] = 0; /* alt, is het, has alt allele */ \ + } \ + else if ( !j || missing ) dst[0]='.', dst[1]=0; /* ., missing genotype */ \ + else if ( type==3 ) \ + { \ + if ( j==1 ) dst[0]='h', dst[1]='a', dst[2]='p', dst[3] = 0; /* hap, haploid */ \ + else if ( !is_het ) dst[0]='h', dst[1]='o', dst[2]='m', dst[3] = 0; /* hom */ \ + else dst[0]='h', dst[1]='e', dst[2]='t', dst[3] = 0; /* het */ \ + } \ + else \ + { \ + if ( j==1 ) \ + { \ + if ( has_ref ) dst[0]='r', dst[1]=0; /* r, haploid */ \ + else dst[0]='a', dst[1]=0; /* a, haploid */ \ + } \ + else if ( !is_het ) \ + { \ + if ( has_ref ) dst[0]='r', dst[1]='r', dst[2] = 0; /* rr */ \ + else dst[0]='a', dst[1]='a', dst[2] = 0; /* aa */ \ + } \ + else \ + { \ + if ( has_ref ) dst[0]='r', dst[1]='a', dst[2] = 0; /* ra */ \ + else dst[0]='a', dst[1]='A', dst[2] = 0; /* aA */ \ + } \ + } \ + } \ + } + switch (fmt->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_vector_end); break; + default: error("The GT type is not lineognised: %d at %s:%"PRId64"\n",fmt->type, bcf_seqname(flt->hdr,line),(int64_t) line->pos+1); break; + } +#undef BRANCH_INT + assert( tok->nsamples == nsmpl ); + tok->nvalues = tok->str_value.l = nvals1*nsmpl; + tok->str_value.s[tok->str_value.l] = 0; + tok->nval1 = nvals1; +} +static void filters_set_genotype2(filter_t *flt, bcf1_t *line, token_t *tok) { _filters_set_genotype(flt, line, tok, 2); } +static void filters_set_genotype3(filter_t *flt, bcf1_t *line, token_t *tok) { _filters_set_genotype(flt, line, tok, 3); } +static void filters_set_genotype4(filter_t *flt, bcf1_t *line, token_t *tok) { _filters_set_genotype(flt, line, tok, 4); } + +static void filters_set_genotype_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + bcf_fmt_t *fmt = bcf_get_fmt(flt->hdr, line, "GT"); + if ( !fmt ) + { + tok->nvalues = 0; + return; + } + int i, blen = 4, nsmpl = line->n_sample; + +gt_length_too_big: + tok->str_value.l = 0; + for (i=0; istr_value.l; + bcf_format_gt(fmt, i, &tok->str_value); + kputc_(0, &tok->str_value); + if ( tok->str_value.l - plen > blen ) + { + // too many alternate alleles or ploidy is too large, the genotype does not fit + // three characters ("0/0" vs "10/10"). + blen *= 2; + goto gt_length_too_big; + } + + plen = tok->str_value.l - plen; + while ( plen < blen ) + { + kputc_(0, &tok->str_value); + plen++; + } + } + assert( tok->nsamples == nsmpl ); + tok->nvalues = tok->str_value.l; + tok->nval1 = blen; +} +static void filters_set_ilen(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->nvalues = line->n_allele - 1; + hts_expand(double,tok->nvalues,tok->mvalues,tok->values); + + int i, rlen = strlen(line->d.allele[0]); + for (i=1; in_allele; i++) + { + int alen = strlen(line->d.allele[i]); + if ( rlen==alen ) bcf_double_set_missing(tok->values[i-1]); + else tok->values[i-1] = alen - rlen; + } +} +static void filters_set_ref_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->str_value.l = 0; + kputs(line->d.allele[0], &tok->str_value); + tok->nvalues = tok->str_value.l; +} +static void filters_set_alt_string(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->str_value.l = 0; + if ( tok->idx>=0 ) + { + if ( line->n_allele > tok->idx + 1 ) + kputs(line->d.allele[tok->idx + 1], &tok->str_value); + else + kputc('.', &tok->str_value); + } + else if ( tok->idx==-2 ) + { + int i, end = tok->nuidxs ? tok->nuidxs : line->n_allele - 1; + if ( end >= line->n_allele - 1 ) end = line->n_allele - 2; + for (i=0; i<=end; i++) + if ( i>=tok->nidxs || tok->idxs[i] ) + { + if ( tok->str_value.l ) kputc(',', &tok->str_value); + kputs(line->d.allele[i+1], &tok->str_value); + } + } + else if ( line->n_allele>1 ) + { + kputs(line->d.allele[1], &tok->str_value); + int i; + for (i=2; in_allele; i++) + { + kputc(',', &tok->str_value); + kputs(line->d.allele[i], &tok->str_value); + } + } + else if ( line->n_allele==1 ) + kputc('.', &tok->str_value); + tok->nvalues = tok->str_value.l; +} +static void filters_set_nmissing(filter_t *flt, bcf1_t *line, token_t *tok) +{ + bcf_unpack(line, BCF_UN_FMT); + if ( !line->n_sample ) + { + tok->nvalues = 1; + tok->values[0] = 0; + return; + } + + int i,igt = bcf_hdr_id2int(flt->hdr, BCF_DT_ID, "GT"); + bcf_fmt_t *fmt = NULL; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==igt ) { fmt = &line->d.fmt[i]; break; } + if ( !fmt ) + { + tok->nvalues = 0; + return; + } + + int j,nmissing = 0; + #define BRANCH(type_t, is_vector_end) { \ + for (i=0; in_sample; i++) \ + { \ + type_t *ptr = (type_t *) (fmt->p + i*fmt->size); \ + for (j=0; jn; j++) \ + { \ + if ( ptr[j]==is_vector_end ) break; \ + if ( ptr[j]==bcf_gt_missing ) { nmissing++; break; } \ + } \ + } \ + } + switch (fmt->type) { + case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; + default: fprintf(bcftools_stderr,"todo: type %d\n", fmt->type); bcftools_exit(1); break; + } + #undef BRANCH + tok->nvalues = 1; + tok->values[0] = tok->tag[0]=='N' ? nmissing : (double)nmissing / line->n_sample; +} +static int func_npass(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + if ( nstack==0 ) error("Error parsing the expression\n"); + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) error("The function %s works with FORMAT fields\n", rtok->tag); + assert(tok->usmpl); + + int i, npass = 0; + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + if ( tok->pass_samples[i] ) npass++; + } + hts_expand(double,1,rtok->mvalues,rtok->values); + rtok->nsamples = 0; + rtok->nvalues = 1; + rtok->values[0] = rtok->tag[0]=='N' ? npass : (line->n_sample ? 1.0*npass/line->n_sample : 0); + + return 1; +} +static void filters_set_nalt(filter_t *flt, bcf1_t *line, token_t *tok) +{ + tok->nvalues = 1; + tok->values[0] = line->n_allele - 1; +} +static void filters_set_ac(filter_t *flt, bcf1_t *line, token_t *tok) +{ + hts_expand(int32_t, line->n_allele, flt->mtmpi, flt->tmpi); + if ( !bcf_calc_ac(flt->hdr, line, flt->tmpi, BCF_UN_INFO|BCF_UN_FMT) ) + { + tok->nvalues = 0; + return; + } + int i, an = flt->tmpi[0]; + for (i=1; in_allele; i++) an += flt->tmpi[i]; + if ( !an ) + { + tok->nvalues = 0; + return; + } + flt->tmpi[0] = an; // for filters_set_[mac|af|maf] + if ( tok->idx>=0 ) + { + tok->nvalues = 1; + tok->values[0] = tok->idx+1n_allele ? flt->tmpi[tok->idx+1] : 0; + } + else if ( line->n_allele==1 ) // no ALT + { + tok->nvalues = 1; + tok->values[0] = 0; + } + else + { + hts_expand(double,line->n_allele,tok->mvalues,tok->values); + for (i=1; in_allele; i++) + tok->values[i-1] = flt->tmpi[i]; + tok->nvalues = line->n_allele - 1; + } +} +static void filters_set_an(filter_t *flt, bcf1_t *line, token_t *tok) +{ + filters_set_ac(flt,line,tok); + tok->values[0] = tok->nvalues ? flt->tmpi[0] : 0; + tok->nvalues = 1; +} +static void filters_set_mac(filter_t *flt, bcf1_t *line, token_t *tok) +{ + filters_set_ac(flt,line,tok); + if ( !tok->nvalues ) return; + int i, an = flt->tmpi[0]; + for (i=0; invalues; i++) + if ( tok->values[i] > an*0.5 ) tok->values[i] = an - tok->values[i]; +} +static void filters_set_af(filter_t *flt, bcf1_t *line, token_t *tok) +{ + filters_set_ac(flt,line,tok); + if ( !tok->nvalues ) return; + int i, an = flt->tmpi[0]; + for (i=0; invalues; i++) + tok->values[i] /= (double)an; +} +static void filters_set_maf(filter_t *flt, bcf1_t *line, token_t *tok) +{ + filters_set_ac(flt,line,tok); + if ( !tok->nvalues ) return; + int i, an = flt->tmpi[0]; + for (i=0; invalues; i++) + { + tok->values[i] /= (double)an; + if ( tok->values[i] > 0.5 ) tok->values[i] = 1 - tok->values[i]; + } +} + +static int func_max(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + double *ptr, val = -HUGE_VAL; + int i,j, has_value = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + if ( val < ptr[j] ) val = ptr[j]; + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) continue; + has_value = 1; + if ( val < tok->values[i] ) val = tok->values[i]; + } + } + if ( has_value ) + { + rtok->values[0] = val; + rtok->nvalues = has_value; + } + return 1; +} +static int func_smpl_max(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_max(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, has_value; + double val, *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + val = -HUGE_VAL; + has_value = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + if ( val < ptr[j] ) val = ptr[j]; + } + if ( has_value ) rtok->values[i] = val; + else bcf_double_set_missing(rtok->values[i]); + } + return 1; +} +static int func_min(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + double *ptr, val = HUGE_VAL; + int i,j, has_value = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + if ( val > ptr[j] ) val = ptr[j]; + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) continue; + has_value = 1; + if ( val > tok->values[i] ) val = tok->values[i]; + } + } + if ( has_value ) + { + rtok->values[0] = val; + rtok->nvalues = has_value; + } + return 1; +} +static int func_smpl_min(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_min(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, has_value; + double val, *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + val = HUGE_VAL; + has_value = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + if ( val > ptr[j] ) val = ptr[j]; + } + if ( has_value ) rtok->values[i] = val; + else bcf_double_set_missing(rtok->values[i]); + } + return 1; +} +static int func_avg(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + double *ptr, val = 0; + int i,j, n = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + val += ptr[j]; + n++; + } + } + } + else + { + for (i=0; invalues; i++) + if ( !bcf_double_is_missing_or_vector_end(tok->values[i]) ) { val += tok->values[i]; n++; } + } + if ( n ) + { + rtok->values[0] = val / n; + rtok->nvalues = 1; + } + return 1; +} +static int func_smpl_avg(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_avg(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, n; + double val, *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + val = 0; + n = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( !bcf_double_is_missing_or_vector_end(ptr[j]) ) { val += ptr[j]; n++; } + } + if ( n ) rtok->values[i] = val / n; + else bcf_double_set_missing(rtok->values[i]); + } + return 1; +} +static int compare_doubles(const void *lhs, const void *rhs) +{ + double arg1 = *(const double*) lhs; + double arg2 = *(const double*) rhs; + if (arg1 < arg2) return -1; + if (arg1 > arg2) return 1; + return 0; +} +static int func_median(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + // sweep through all tok->values and while excluding all missing values reuse the very same array + int i,j,k = 0, n = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) { k += tok->nval1; continue; } + for (j=0; jnval1; k++,j++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[k]) ) continue; + if ( n < k ) tok->values[n] = tok->values[k]; + n++; + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) continue; + if ( n < i ) tok->values[n] = tok->values[i]; + n++; + } + } + if ( !n ) return 1; + if ( n==1 ) rtok->values[0] = tok->values[0]; + else + { + qsort(tok->values, n, sizeof(double), compare_doubles); + rtok->values[0] = n % 2 ? tok->values[n/2] : (tok->values[n/2-1] + tok->values[n/2]) * 0.5; + } + rtok->nvalues = 1; + return 1; +} +static int func_smpl_median(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_avg(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, n; + double *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + n = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + if ( n < j ) ptr[n] = ptr[j]; + n++; + } + if ( n==0 ) + bcf_double_set_missing(rtok->values[i]); + else if ( n==1 ) + rtok->values[i] = ptr[0]; + else + { + qsort(ptr, n, sizeof(double), compare_doubles); + rtok->values[i] = n % 2 ? ptr[n/2] : (ptr[n/2-1] + ptr[n/2]) * 0.5; + } + } + return 1; +} +static int func_stddev(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = 0; + if ( !tok->nvalues ) return 1; + // sweep through all tok->values and while excluding all missing values reuse the very same array + int i,j,k = 0, n = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) { k += tok->nval1; continue; } + for (j=0; jnval1; k++,j++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[k]) ) continue; + if ( n < k ) tok->values[n] = tok->values[k]; + n++; + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) continue; + if ( n < i ) tok->values[n] = tok->values[i]; + n++; + } + } + if ( !n ) return 1; + if ( n==1 ) rtok->values[0] = 0; + else + { + double sdev = 0, avg = 0; + for (i=0; ivalues[i]; + avg /= n; + for (i=0; ivalues[i] - avg) * (tok->values[i] - avg); + rtok->values[0] = sqrt(sdev/n); + } + rtok->nvalues = 1; + return 1; +} +static int func_smpl_stddev(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_avg(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, n; + double *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + n = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + if ( n < j ) ptr[n] = ptr[j]; + n++; + } + if ( n==0 ) + bcf_double_set_missing(rtok->values[i]); + else if ( n==1 ) + rtok->values[i] = 0; + else + { + double sdev = 0, avg = 0; + for (j=0; jvalues[i] = sqrt(sdev/n); + } + } + return 1; +} +static int func_sum(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + rtok->nvalues = 0; + token_t *tok = stack[nstack - 1]; + if ( !tok->nvalues ) return 1; + double *ptr, val = 0; + int i,j, n = 0; + if ( tok->nsamples ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + val += ptr[j]; + n++; + } + } + } + else + { + for (i=0; invalues; i++) + if ( !bcf_double_is_missing_or_vector_end(tok->values[i]) ) { val += tok->values[i]; n++; } + } + if ( n ) + { + rtok->values[0] = val; + rtok->nvalues = 1; + } + return 1; +} +static int func_smpl_sum(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( !tok->nsamples ) return func_avg(flt,line,rtok,stack,nstack); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nsamples; + rtok->nval1 = 1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + int i, j, has_value; + double val, *ptr; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + val = 0; + has_value = 0; + ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + { + if ( bcf_double_is_missing_or_vector_end(ptr[j]) ) continue; + has_value = 1; + val += ptr[j]; + } + if ( has_value ) rtok->values[i] = val; + else bcf_double_set_missing(rtok->values[i]); + } + return 1; +} +static int func_abs(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( tok->is_str ) error("ABS() can be applied only on numeric values\n"); + rtok->nsamples = tok->nsamples; + rtok->nvalues = tok->nvalues; + rtok->nval1 = tok->nval1; + hts_expand(double,rtok->nvalues,rtok->mvalues,rtok->values); + if ( tok->usmpl ) + { + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + } + if ( !tok->nvalues ) return 1; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + int i,j,k = 0; + if ( tok->usmpl ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) { k+= tok->nval1; continue; } + for (j=0; jnval1; k++,j++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[k]) ) bcf_double_set_missing(rtok->values[k]); + else rtok->values[k] = fabs(tok->values[k]); + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( tok->usmpl && !tok->usmpl[i] ) continue; + if ( bcf_double_is_missing(tok->values[i]) ) bcf_double_set_missing(rtok->values[i]); + else if ( !bcf_double_is_vector_end(tok->values[i]) ) rtok->values[i] = fabs(tok->values[i]); + } + } + return 1; +} +static int func_count(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + int i,j, cnt = 0; + if ( tok->tag && tok->nsamples ) + { + // raw number of values in a FMT tag, e.g. COUNT(FMT/TAG) + if ( tok->is_str ) error("todo: Type=String for COUNT on FORMAT fields?\n"); + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) continue; + double *ptr = tok->values + i*tok->nval1; + for (j=0; jnval1; j++) + if ( !bcf_double_is_missing_or_vector_end(ptr[j]) ) cnt++; + } + } + else if ( tok->nsamples ) + { + // number of samples that pass a processed FMT tag + for (i=0; insamples; i++) + if ( tok->pass_samples[i] ) cnt++; + } + else if ( tok->is_str ) + { + if ( tok->str_value.l ) cnt = 1; + for (i=0; istr_value.l; i++) if ( tok->str_value.s[i]==',' ) cnt++; + } + else + cnt = tok->nvalues; + + rtok->nvalues = 1; + rtok->values[0] = cnt; + return 1; +} +static int func_strlen(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + rtok->nvalues = rtok->str_value.l = 0; + if ( !tok->str_value.l ) return 1; + + if ( tok->idx==-2 ) + { + int i = 0; + char *ss = tok->str_value.s; + while ( *ss ) + { + char *se = ss; + while ( *se && *se!=',' ) se++; + hts_expand(double, i+1, rtok->mvalues, rtok->values); + if ( !*se ) rtok->values[i] = strlen(ss); + else + { + *se = 0; + rtok->values[i] = strlen(ss); + *se = ','; + } + ss = *se ? se + 1 : se; + i++; + } + rtok->nvalues = i; + } + else + { + if ( !tok->str_value.s[1] && tok->str_value.s[0]=='.' ) + rtok->values[0] = 0; + else + rtok->values[0] = strlen(tok->str_value.s); + rtok->nvalues = 1; + } + return 1; +} +static inline double calc_binom(int na, int nb) +{ + if ( na==0 && nb==0 ) return -1; + if ( na==nb ) return 1; + + // kfunc.h implements kf_betai, which is the regularized beta function P(X<=k/N;p) = I_{1-p}(N-k,k+1) + + double pval = na < nb ? kf_betai(nb, na + 1, 0.5) : kf_betai(na, nb + 1, 0.5); + pval *= 2; + if ( pval>1 ) pval = 1; // this can happen, machine precision error, eg. kf_betai(1,0,0.5) + + return pval; +} +static int func_binom(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + int i, istack = nstack - rtok->nargs; + + if ( rtok->nargs!=2 && rtok->nargs!=1 ) error("Error: binom() takes one or two arguments\n"); + assert( istack>=0 ); + + // The expected mean is 0.5. Should we support also prob!=0.5? + // + // double prob = 0.5; + // if ( nstack==3 ) + // { + // // three parameters, the first one must be a scalar: binom(0.25,AD[0],AD[1]) + // if ( !stack[istack]->is_constant ) + // error("The first argument of binom() must be a numeric constant if three parameters are given\n"); + // prob = stack[istack]->threshold; + // istack++; + // } + // else if ( nstack==2 && stack[istack]->is_constant ) + // { + // // two parameters, the first can be a scalar: binom(0.25,AD) or binom(AD[0],AD[1]) + // prob = stack[istack]->threshold; + // istack++; + // } + + token_t *tok = stack[istack]; + if ( tok->nsamples ) + { + // working with a FORMAT tag + rtok->nval1 = 1; + rtok->nvalues = tok->nsamples; + rtok->nsamples = tok->nsamples; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + assert(tok->usmpl); + if ( !rtok->usmpl ) rtok->usmpl = (uint8_t*) malloc(tok->nsamples); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples); + + if ( istack+1==nstack ) + { + // determine the index from the GT field: binom(AD) + int ngt = bcf_get_genotypes(flt->hdr, line, &flt->tmpi, &flt->mtmpi); + int max_ploidy = ngt/line->n_sample; + if ( ngt <= 0 || max_ploidy < 2 ) // GT not present or not diploid, cannot set + { + for (i=0; insamples; i++) + if ( rtok->usmpl[i] ) bcf_double_set_missing(rtok->values[i]); + return rtok->nargs; + } + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + int32_t *ptr = flt->tmpi + i*max_ploidy; + if ( bcf_gt_is_missing(ptr[0]) || bcf_gt_is_missing(ptr[1]) || ptr[1]==bcf_int32_vector_end ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + int idx1 = bcf_gt_allele(ptr[0]); + int idx2 = bcf_gt_allele(ptr[1]); + if ( idx1>=line->n_allele ) error("Incorrect allele index at %s:%"PRId64", sample %s\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,flt->hdr->samples[i]); + if ( idx2>=line->n_allele ) error("Incorrect allele index at %s:%"PRId64", sample %s\n", bcf_seqname(flt->hdr,line),(int64_t) line->pos+1,flt->hdr->samples[i]); + double *vals = tok->values + tok->nval1*i; + if ( bcf_double_is_missing_or_vector_end(vals[idx1]) || bcf_double_is_missing_or_vector_end(vals[idx2]) ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + rtok->values[i] = calc_binom(vals[idx1],vals[idx2]); + if ( rtok->values[i] < 0 ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + } + } + else + { + // the fields given explicitly: binom(AD[:0],AD[:1]) + token_t *tok2 = stack[istack+1]; + if ( tok->nval1!=1 || tok2->nval1!=1 ) + error("Expected one value per binom() argument, found %d and %d at %s:%"PRId64"\n",tok->nval1,tok2->nval1, bcf_seqname(flt->hdr,line),(int64_t) line->pos+1); + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + double *ptr1 = tok->values + tok->nval1*i; + double *ptr2 = tok2->values + tok2->nval1*i; + if ( bcf_double_is_missing_or_vector_end(ptr1[0]) || bcf_double_is_missing_or_vector_end(ptr2[0]) ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + rtok->values[i] = calc_binom(ptr1[0],ptr2[0]); + if ( rtok->values[i] < 0 ) + { + bcf_double_set_missing(rtok->values[i]); + continue; + } + } + } + } + else + { + // working with an INFO tag + rtok->nvalues = 1; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + + double *ptr1 = NULL, *ptr2 = NULL; + if ( istack+1==nstack ) + { + // only one tag, expecting two values: binom(INFO/AD) + if ( tok->nvalues==2 ) + { + ptr1 = &tok->values[0]; + ptr2 = &tok->values[1]; + } + } + else + { + // two tags, expecting one value in each: binom(INFO/AD[0],INFO/AD[1]) + token_t *tok2 = stack[istack+1]; + if ( tok->nvalues==1 && tok2->nvalues==1 ) + { + ptr1 = &tok->values[0]; + ptr2 = &tok2->values[0]; + } + } + if ( !ptr1 || !ptr2 || bcf_double_is_missing_or_vector_end(ptr1[0]) || bcf_double_is_missing_or_vector_end(ptr2[0]) ) + bcf_double_set_missing(rtok->values[0]); + else + { + rtok->values[0] = calc_binom(ptr1[0],ptr2[0]); + if ( rtok->values[0] < 0 ) + bcf_double_set_missing(rtok->values[0]); + } + } + return rtok->nargs; +} +static int func_phred(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + token_t *tok = stack[nstack - 1]; + if ( tok->is_str ) error("PHRED() can be applied only on numeric values\n"); + + rtok->nsamples = tok->nsamples; + rtok->nval1 = tok->nval1; + memcpy(rtok->pass_samples, tok->pass_samples, rtok->nsamples*sizeof(*rtok->pass_samples)); + assert(tok->usmpl); + if ( !rtok->usmpl ) + { + rtok->usmpl = (uint8_t*) malloc(tok->nsamples*sizeof(*rtok->usmpl)); + memcpy(rtok->usmpl, tok->usmpl, tok->nsamples*sizeof(*rtok->usmpl)); + } + rtok->nvalues = tok->nvalues; + if ( !tok->nvalues ) return 1; + + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + int i,j,k = 0; + if ( tok->usmpl ) + { + for (i=0; insamples; i++) + { + if ( !tok->usmpl[i] ) { k+= tok->nval1; continue; } + for (j=0; jnval1; k++,j++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[k]) ) bcf_double_set_missing(rtok->values[k]); + else rtok->values[k] = -4.34294481903*log(tok->values[k]); + } + } + } + else + { + for (i=0; invalues; i++) + { + if ( bcf_double_is_missing_or_vector_end(tok->values[i]) ) bcf_double_set_missing(rtok->values[i]); + else rtok->values[i] = -4.34294481903*log(tok->values[i]); + } + } + return 1; +} +inline static void tok_init_values(token_t *atok, token_t *btok, token_t *rtok) +{ + token_t *tok; + if ( (atok->nsamples || btok->nsamples) && (!atok->nsamples || !btok->nsamples) ) + tok = atok->nsamples ? atok : btok; + else + tok = atok->nvalues > btok->nvalues ? atok : btok; + rtok->nvalues = tok->nvalues; + rtok->nval1 = tok->nval1; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); +} +inline static void tok_init_samples(token_t *atok, token_t *btok, token_t *rtok) +{ + if ( (atok->nsamples || btok->nsamples) && !rtok->nsamples ) + { + rtok->nsamples = atok->nsamples ? atok->nsamples : btok->nsamples; + rtok->usmpl = (uint8_t*) calloc(rtok->nsamples,1); + int i; + for (i=0; insamples; i++) rtok->usmpl[i] |= atok->usmpl[i]; + for (i=0; insamples; i++) rtok->usmpl[i] |= btok->usmpl[i]; + } + if (rtok->nsamples) + memset(rtok->pass_samples, 0, rtok->nsamples); +} + +#define VECTOR_ARITHMETICS(atok,btok,_rtok,AOP,TYPE) \ +{ \ + token_t *rtok = _rtok; \ + int i, has_values = 0; \ + if ( atok->nvalues && btok->nvalues ) \ + { \ + tok_init_values(atok, btok, rtok); \ + tok_init_samples(atok, btok, rtok); \ + if ( (atok->nsamples && btok->nsamples) || (!atok->nsamples && !btok->nsamples)) \ + { \ + assert( atok->nsamples==btok->nsamples ); \ + for (i=0; invalues; i++) \ + { \ + if ( bcf_double_is_missing_or_vector_end(atok->values[i]) || bcf_double_is_missing_or_vector_end(btok->values[i]) ) \ + { \ + bcf_double_set_missing(rtok->values[i]); \ + continue; \ + } \ + has_values = 1; \ + rtok->values[i] = TYPE atok->values[i] AOP TYPE btok->values[i]; \ + } \ + } \ + else if ( atok->nsamples ) \ + { \ + assert( btok->nvalues==1 ); \ + if ( !bcf_double_is_missing_or_vector_end(btok->values[0]) ) \ + { \ + for (i=0; invalues; i++) \ + { \ + if ( bcf_double_is_missing_or_vector_end(atok->values[i]) ) \ + { \ + bcf_double_set_missing(rtok->values[i]); \ + continue; \ + } \ + has_values = 1; \ + rtok->values[i] = TYPE atok->values[i] AOP TYPE btok->values[0]; \ + } \ + } \ + } \ + else \ + { \ + assert( atok->nvalues==1 ); \ + if ( !bcf_double_is_missing_or_vector_end(atok->values[0]) ) \ + { \ + for (i=0; invalues; i++) \ + { \ + if ( bcf_double_is_missing_or_vector_end(btok->values[i]) ) \ + { \ + bcf_double_set_missing(rtok->values[i]); \ + continue; \ + } \ + has_values = 1; \ + rtok->values[i] = TYPE atok->values[0] AOP TYPE btok->values[i]; \ + } \ + } \ + } \ + } \ + if ( !has_values ) rtok->nvalues = 0; \ +} + +static int vector_logic_or(filter_t *filter, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + if ( nstack < 2 ) error("Error occurred while processing the filter \"%s\"\n", filter->str); + + token_t *atok = stack[nstack-2]; + token_t *btok = stack[nstack-1]; + tok_init_samples(atok, btok, rtok); + + if ( !atok->pass_site && !btok->pass_site ) return 2; + + rtok->pass_site = 1; + if ( !atok->nsamples && !btok->nsamples ) return 2; + + int i; + if ( rtok->tok_type==TOK_OR_VEC ) // ||, select all samples if one is true + { + if ( (!atok->nsamples && !atok->pass_site) || (!btok->nsamples && !btok->pass_site) ) + { + // These two conditions are to ensure the following does not set all samples + // at sites with QUAL<=30: + // QUAL>30 || FMT/GQ>30 + + token_t *tok = atok->nsamples ? atok : btok; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = tok->pass_samples[i]; + } + } + else + { + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = 1; + } + } + return 2; + } + + // |, only select samples which are actually true + + if ( !atok->nsamples || !btok->nsamples ) + { + token_t *tok = atok->nsamples ? atok : btok; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = tok->pass_samples[i]; + } + return 2; + } + + assert( atok->nsamples==btok->nsamples ); + + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = atok->pass_samples[i] | btok->pass_samples[i]; + } + return 2; +} +static int vector_logic_and(filter_t *filter, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ + if ( nstack < 2 ) error("Error occurred while processing the filter \"%s\". (nstack=%d)\n", filter->str,nstack); + + token_t *atok = stack[nstack-2]; + token_t *btok = stack[nstack-1]; + tok_init_samples(atok, btok, rtok); + + if ( !atok->pass_site || !btok->pass_site ) return 2; + if ( !atok->nsamples && !btok->nsamples ) { rtok->pass_site = 1; return 2; } + + int i; + if ( !atok->nsamples || !btok->nsamples ) + { + token_t *tok = atok->nsamples ? atok : btok; + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = tok->pass_samples[i]; + } + rtok->pass_site = 1; + return 2; + } + + assert( atok->nsamples==btok->nsamples ); + if ( rtok->tok_type==TOK_AND_VEC ) // &&, can be true in different samples + { + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = atok->pass_samples[i] | btok->pass_samples[i]; + } + rtok->pass_site = 1; + } + else // &, must be true within one sample + { + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + rtok->pass_samples[i] = atok->pass_samples[i] & btok->pass_samples[i]; + if ( rtok->pass_samples[i] ) rtok->pass_site = 1; + } + } + return 2; +} + +#define CMP_VECTORS(atok,btok,_rtok,CMP_OP,missing_logic) \ +{ \ + token_t *rtok = _rtok; \ + int i, j, k; \ + tok_init_samples(atok, btok, rtok); \ + if ( !atok->nsamples && !btok->nsamples ) \ + { \ + if ( !atok->nvalues && !btok->nvalues ) { rtok->pass_site = missing_logic[2]; } \ + else if ( !atok->nvalues || !btok->nvalues ) \ + { \ + token_t *tok = atok->nvalues ? atok : btok; \ + for (j=0; jnvalues; j++) \ + { \ + if ( bcf_double_is_missing_or_vector_end(tok->values[j]) ) \ + { \ + if ( missing_logic[2] ) { rtok->pass_site = 1; break; } \ + } \ + else if ( missing_logic[1] ) { rtok->pass_site = 1; break; } \ + } \ + } \ + else \ + { \ + for (i=0; invalues; i++) \ + { \ + int amiss = bcf_double_is_missing_or_vector_end(atok->values[i]) ? 1 : 0; \ + for (j=0; jnvalues; j++) \ + { \ + int nmiss = amiss + (bcf_double_is_missing_or_vector_end(btok->values[j]) ? 1 : 0); \ + if ( nmiss ) \ + { \ + if ( missing_logic[nmiss] ) { rtok->pass_site = 1; i = atok->nvalues; break; } \ + } \ + else if ( atok->values[i] > 16777216 || btok->values[j] > 16777216 ) /* Ugly, see #871 */ \ + { \ + if ( atok->values[i] CMP_OP btok->values[j] ) { rtok->pass_site = 1; i = atok->nvalues; break; } \ + } \ + else if ( (float)atok->values[i] CMP_OP (float)btok->values[j] ) { rtok->pass_site = 1; i = atok->nvalues; break; } \ + } \ + } \ + } \ + } \ + else \ + { \ + if ( !atok->nvalues && !btok->nvalues ) \ + { \ + if ( missing_logic[2] ) \ + { \ + for (i=0; insamples; i++) \ + if ( rtok->usmpl[i] ) { rtok->pass_samples[i] = missing_logic[2]; rtok->pass_site = 1; } \ + } \ + } \ + else if ( !atok->nvalues || !btok->nvalues ) \ + { \ + token_t *tok = atok->nvalues ? atok : btok; \ + if ( !tok->nsamples ) \ + { \ + int miss = 0; \ + for (j=0; jnvalues; j++) \ + miss |= bcf_double_is_missing_or_vector_end(tok->values[j]) ? 1 : 0; \ + if ( missing_logic[++miss] ) \ + { \ + for (i=0; insamples; i++) \ + if ( rtok->usmpl[i] ) { rtok->pass_samples[i] = missing_logic[miss]; rtok->pass_site = 1; } \ + } \ + } \ + else \ + for (i=0; insamples; i++) \ + { \ + if ( !rtok->usmpl[i] ) continue; \ + double *ptr = tok->values + i*tok->nval1; \ + int miss = 0; \ + for (j=0; jnval1; j++) \ + miss |= bcf_double_is_missing_or_vector_end(ptr[j]) ? 1 : 0; \ + if ( missing_logic[++miss] ) { rtok->pass_samples[i] = missing_logic[miss]; rtok->pass_site = 1; } \ + } \ + } \ + else if ( atok->nsamples && btok->nsamples ) \ + { \ + if ( atok->nval1!=btok->nval1 ) error("Incompatible number of per-sample values in comparison: %d vs %d\n",atok->nval1,btok->nval1); \ + if ( atok->nsamples!=btok->nsamples ) error("Incompatible number samples in comparison: %d vs %d\n",atok->nsamples,btok->nsamples); \ + for (i=0; insamples; i++) \ + { \ + if ( !atok->usmpl[i] || !btok->usmpl[i] ) { rtok->usmpl[i] = 0; continue; } \ + double *aptr = atok->values + i*atok->nval1; \ + double *bptr = btok->values + i*btok->nval1; \ + for (j=0; jnval1; j++) \ + { \ + int nmiss = bcf_double_is_missing_or_vector_end(aptr[j]) ? 1 : 0; \ + if ( nmiss && !missing_logic[0] ) continue; /* any is missing => result is false */ \ + nmiss += (bcf_double_is_missing_or_vector_end(bptr[j]) ? 1 : 0); \ + if ( nmiss ) \ + { \ + if ( missing_logic[nmiss] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; break; } \ + } \ + else if ( aptr[j] > 16777216 || bptr[j] > 16777216 ) /* Ugly, see #871 */ \ + { \ + if ( aptr[j] CMP_OP bptr[j] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; break; } \ + } \ + else if ( (float)aptr[j] CMP_OP (float)bptr[j] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; break; } \ + } \ + } \ + } \ + else if ( atok->nsamples )\ + { \ + for (i=0; insamples; i++) \ + { \ + if ( !rtok->usmpl[i] ) continue; \ + double *aptr = atok->values + i*atok->nval1; \ + double *bptr = btok->values + i*btok->nval1; \ + for (j=0; jnval1; j++) \ + { \ + int miss = bcf_double_is_missing_or_vector_end(aptr[j]) ? 1 : 0; \ + if ( miss && !missing_logic[0] ) continue; /* any is missing => result is false */ \ + for (k=0; knvalues; k++) \ + { \ + int nmiss = miss + (bcf_double_is_missing_or_vector_end(bptr[k]) ? 1 : 0); \ + if ( nmiss ) \ + { \ + if ( missing_logic[nmiss] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = atok->nval1; break; } \ + } \ + else if ( aptr[j] > 16777216 || bptr[k] > 16777216 ) /* Ugly, see #871 */ \ + { \ + if ( aptr[j] CMP_OP bptr[k] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = atok->nval1; break; } \ + } \ + else if ( (float)aptr[j] CMP_OP (float)bptr[k] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = atok->nval1; break; } \ + } \ + } \ + } \ + } \ + else /* btok->nsamples */ \ + { \ + for (i=0; insamples; i++) \ + { \ + if ( !rtok->usmpl[i] ) continue; \ + double *aptr = atok->values + i*atok->nval1; \ + double *bptr = btok->values + i*btok->nval1; \ + for (j=0; jnval1; j++) \ + { \ + int miss = bcf_double_is_missing_or_vector_end(bptr[j]) ? 1 : 0; \ + if ( miss && !missing_logic[0] ) continue; /* any is missing => result is false */ \ + for (k=0; knvalues; k++) \ + { \ + int nmiss = miss + (bcf_double_is_missing_or_vector_end(aptr[k]) ? 1 : 0); \ + if ( nmiss ) \ + { \ + if ( missing_logic[nmiss] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = btok->nval1; break; } \ + } \ + else if ( bptr[j] > 16777216 || aptr[k] > 16777216 ) /* Ugly, see #871 */ \ + { \ + if ( aptr[k] CMP_OP bptr[j] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = btok->nval1; break; } \ + } \ + else if ( (float)aptr[k] CMP_OP (float)bptr[j] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; j = btok->nval1; break; } \ + } \ + } \ + } \ + } \ + } \ +} +static int _regex_vector_strings(regex_t *regex, char *str, size_t len, int logic, int *missing_logic) +{ + char *end = str + len; + while ( str < end && *str ) + { + char *mid = str; + while ( mid < end && *mid && *mid!=',' ) mid++; + int miss = mid - str == 1 && str[0]=='.' ? 1 : 0; + if ( miss && missing_logic[miss] ) return 1; + char tmp = *mid; *mid = 0; + int match = regexec(regex, str, 0,NULL,0) ? 0 : 1; + *mid = tmp; + if ( logic==TOK_NLIKE ) match = match ? 0 : 1; + if ( match ) return 1; + if ( !*mid ) break; + str = mid + 1; + } + return 0; +} +static inline int _has_missing_string(char *beg) +{ + while ( *beg ) + { + char *end = beg; + while ( *end && *end!=',' ) end++; + if ( end-beg==1 && beg[0]=='.' ) return 1; + if ( !*end ) break; + beg = end + 1; + } + return 0; +} + +// Compare two strings with multiple fields, for example "A,B,.,C"=="X,Y,A". +// Returns 1 if any field matches, otherwise returns 0 +static inline int _match_vector_strings(char *abeg, size_t alen, char *bstr, size_t blen, int logic, int *missing_logic) +{ + char *aend = abeg + alen; + char *bend = bstr + blen; + while ( abeg < aend && *abeg ) + { + char *amid = abeg; + while ( amid < aend && *amid && *amid!=',' ) amid++; + int miss = amid - abeg == 1 && abeg[0]=='.' ? 1 : 0; + char *bbeg = bstr; + while ( bbeg < bend && *bbeg ) + { + char *bmid = bbeg; + while ( bmid < bend && *bmid && *bmid!=',' ) bmid++; + int nmiss = miss + (bmid - bbeg == 1 && bbeg[0]=='.' ? 1 : 0); + if ( nmiss ) + { + if ( missing_logic[nmiss] ) return 1; + } + else + { + int match = amid-abeg==bmid-bbeg && !strncmp(abeg,bbeg,amid-abeg) ? 1 : 0; + if ( logic==TOK_NE ) match = match==1 ? 0 : 1; + if ( match ) return 1; + } + if ( !*bmid ) break; + bbeg = bmid + 1; + } + if ( !*amid ) break; + abeg = amid + 1; + } + return 0; +} +static void cmp_vector_strings(token_t *atok, token_t *btok, token_t *rtok) +{ + tok_init_samples(atok, btok, rtok); + + int i, logic = rtok->tok_type; // TOK_EQ, TOK_NE, TOK_LIKE, TOK_NLIKE + regex_t *regex = atok->regex ? atok->regex : (btok->regex ? btok->regex : NULL); + + assert( atok->nvalues==atok->str_value.l && btok->nvalues==btok->str_value.l ); + assert( !atok->nsamples || !btok->nsamples ); + assert( (!regex && (logic==TOK_EQ || logic==TOK_NE)) || (regex && (logic==TOK_LIKE || logic==TOK_NLIKE)) ); + + int missing_logic[] = {0,0,0}; + if ( logic==TOK_EQ || logic==TOK_LIKE ) missing_logic[0] = missing_logic[2] = 1; + else if ( logic==TOK_NE || logic==TOK_NLIKE ) missing_logic[0] = missing_logic[1] = 1; + + if ( !atok->nsamples && !btok->nsamples ) + { + if ( !atok->nvalues && !btok->nvalues ) { rtok->pass_site = missing_logic[2]; return; } + if ( !atok->nvalues || !btok->nvalues ) + { + int miss = _has_missing_string(atok->nvalues ? atok->str_value.s : btok->str_value.s); + if ( missing_logic[miss+1] ) rtok->pass_site = 1; + return; + } + if ( !regex ) + rtok->pass_site = _match_vector_strings(atok->str_value.s, atok->str_value.l, btok->str_value.s, btok->str_value.l, logic, missing_logic); + else + { + token_t *tok = atok->regex ? btok : atok; + rtok->pass_site = _regex_vector_strings(regex, tok->str_value.s, tok->str_value.l, logic, missing_logic); + } + return; + } + + // The case of (!atok->nsamples || !btok->nsamples) + + if ( !atok->nvalues && !btok->nvalues ) + { + if ( missing_logic[2] ) + { + for (i=0; insamples; i++) + if ( rtok->usmpl[i] ) { rtok->pass_samples[i] = missing_logic[2]; rtok->pass_site = 1; } + } + return; + } + if ( !atok->nvalues || !btok->nvalues ) + { + token_t *tok = atok->nvalues ? atok : btok; + if ( !tok->nsamples ) + { + int miss = _has_missing_string(tok->str_value.s); + if ( !missing_logic[miss+1] ) return; + for (i=0; insamples; i++) + if ( rtok->usmpl[i] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; } + } + else + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + int miss = _has_missing_string(tok->str_value.s + i*tok->nval1); + if ( missing_logic[miss+1] ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; } + } + return; + } + + // The case of (!atok->nsamples || !btok->nsamples) && (atok->nvalues && btok->nvalues) + token_t *xtok = atok->nsamples ? atok : btok; + token_t *ytok = atok->nsamples ? btok : atok; + assert( regex==ytok->regex ); + for (i=0; insamples; i++) + { + if ( !rtok->usmpl[i] ) continue; + int match; + if ( regex ) + match = _regex_vector_strings(regex, xtok->str_value.s + i*xtok->nval1, xtok->nval1, logic, missing_logic); + else + match = _match_vector_strings(xtok->str_value.s + i*xtok->nval1, xtok->nval1, ytok->str_value.s, ytok->str_value.l, logic, missing_logic); + if ( match ) { rtok->pass_samples[i] = 1; rtok->pass_site = 1; } + } +} + +static int parse_idxs(char *tag_idx, int **idxs, int *nidxs, int *idx) +{ + // TAG[], TAG[*] .. any field; sets idx=-2, idxs[0]=-1 + if ( *tag_idx==0 || !strcmp("*", tag_idx) ) + { + *idxs = (int*) malloc(sizeof(int)); + (*idxs)[0] = -1; + *nidxs = 1; + *idx = -2; + return 0; + } + + // TAG[integer] .. one field; idx positive + char *end, *beg = tag_idx; + *idx = strtol(tag_idx, &end, 10); + if ( *idx >= 0 && *end==0 ) return 0; + + // TAG[0,1] or TAG[0-2] or [1-] etc; idx=-2, idxs[...]=0,0,1,1,.. + int i, ibeg = -1; + while ( *beg ) + { + int num = strtol(beg, &end, 10); + if ( end[0]==',' ) beg = end + 1; + else if ( end[0]==0 ) beg = end; + else if ( end[0]=='-' ) { beg = end + 1; ibeg = num; continue; } + else return -1; + if ( num >= *nidxs ) + { + *idxs = (int*) realloc(*idxs, sizeof(int)*(num+1)); + memset(*idxs + *nidxs, 0, sizeof(int)*(num - *nidxs + 1)); + *nidxs = num + 1; + } + if ( ibeg>=0 ) + { + for (i=ibeg; i<=num; i++) (*idxs)[i] = 1; + ibeg = -1; + } + (*idxs)[num] = 1; + } + if ( ibeg >=0 ) + { + if ( ibeg >= *nidxs ) + { + *idxs = (int*) realloc(*idxs, sizeof(int)*(ibeg+1)); + memset(*idxs + *nidxs, 0, sizeof(int)*(ibeg - *nidxs + 1)); + *nidxs = ibeg + 1; + } + (*idxs)[ibeg] = -1; + } + *idx = -2; + return 0; +} + +static void parse_tag_idx(bcf_hdr_t *hdr, int is_fmt, char *tag, char *tag_idx, token_t *tok) // tag_idx points just after "TAG[" +{ + int i, len = strlen(tag_idx); + if ( tag_idx[len-1] == ']' ) tag_idx[len-1] = 0; + char *ori = strdup(tag_idx); + + assert( !tok->idxs && !tok->usmpl ); + int *idxs1 = NULL, nidxs1 = 0, idx1 = 0; + int *idxs2 = NULL, nidxs2 = 0, idx2 = 0; + + int set_samples = 0; + char *colon = strrchr(tag_idx, ':'); + if ( tag_idx[0]=='@' ) // file list with sample names + { + if ( !is_fmt ) error("Could not parse \"%s\". (Not a FORMAT tag yet a sample list provided.)\n", ori); + char *fname = expand_path(tag_idx+1); +#ifdef _WIN32 + if (fname && strlen(fname) > 2 && fname[1] == ':') // Deal with Windows paths, such as 'C:\..' + colon = strrchr(fname+2, ':'); +#endif + int nsmpl; + char **list = hts_readlist(fname, 1, &nsmpl); + if ( !list && colon ) + { + if ( parse_idxs(colon+1, &idxs2, &nidxs2, &idx2) != 0 ) error("Could not parse the index: %s\n", ori); + tok->idxs = idxs2; + tok->nidxs = nidxs2; + tok->idx = idx2; + colon = strrchr(fname, ':'); + *colon = 0; + list = hts_readlist(fname, 1, &nsmpl); + } + if ( !list ) error("Could not read: %s\n", fname); + free(fname); + tok->nsamples = bcf_hdr_nsamples(hdr); + tok->usmpl = (uint8_t*) calloc(tok->nsamples,1); + for (i=0; iusmpl[ismpl] = 1; + } + free(list); + if ( !colon ) + { + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + tok->idx = -2; + } + } + else if ( colon ) + { + if ( !is_fmt ) error("Could not parse the index \"%s\". (Not a FORMAT tag yet sample index implied.)\n", ori); + *colon = 0; + if ( parse_idxs(tag_idx, &idxs1, &nidxs1, &idx1) != 0 ) error("Could not parse the index: %s\n", ori); + if ( parse_idxs(colon+1, &idxs2, &nidxs2, &idx2) != 0 ) error("Could not parse the index: %s\n", ori); + tok->idxs = idxs2; + tok->nidxs = nidxs2; + tok->idx = idx2; + set_samples = 1; + } + else + { + if ( parse_idxs(tag_idx, &idxs1, &nidxs1, &idx1) != 0 ) error("Could not parse the index: %s\n", ori); + if ( is_fmt ) + { + if ( nidxs1==1 && idxs1[0]==-1 ) + { + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + tok->idx = -2; + } + else if ( bcf_hdr_id2number(hdr,BCF_HL_FMT,tok->hdr_id)!=1 ) + error("The FORMAT tag %s can have multiple subfields, run as %s[sample:subfield]\n", tag,tag); + else + tok->idx = 0; + set_samples = 1; + } + else + { + tok->idxs = idxs1; + tok->nidxs = nidxs1; + tok->idx = idx1; + } + } + + if ( set_samples ) + { + tok->nsamples = bcf_hdr_nsamples(hdr); + tok->usmpl = (uint8_t*) calloc(tok->nsamples,1); + if ( idx1>=0 ) + { + if ( idx1 >= bcf_hdr_nsamples(hdr) ) error("The sample index is too large: %s\n", ori); + tok->usmpl[idx1] = 1; + } + else if ( idx1==-2 ) + { + for (i=0; i= bcf_hdr_nsamples(hdr) ) error("The sample index is too large: %s\n", ori); + tok->usmpl[i] = 1; + } + if ( nidxs1 && idxs1[nidxs1-1]==-1 ) // open range, such as "7-" + { + for (; insamples; i++) tok->usmpl[i] = 1; + } + } + else error("todo: %s:%d .. %d\n", __FILE__,__LINE__, idx2); + free(idxs1); + } + free(ori); + + if ( tok->nidxs && tok->idxs[tok->nidxs-1]!=-1 ) + { + for (i=0; inidxs; i++) if ( tok->idxs[i] ) tok->nuidxs++; + } +} +static int max_ac_an_unpack(bcf_hdr_t *hdr) +{ + int hdr_id = bcf_hdr_id2int(hdr,BCF_DT_ID,"AC"); + if ( hdr_id<0 ) return BCF_UN_FMT; + if ( !bcf_hdr_idinfo_exists(hdr,BCF_HL_INFO,hdr_id) ) return BCF_UN_FMT; + + hdr_id = bcf_hdr_id2int(hdr,BCF_DT_ID,"AN"); + if ( hdr_id<0 ) return BCF_UN_FMT; + if ( !bcf_hdr_idinfo_exists(hdr,BCF_HL_INFO,hdr_id) ) return BCF_UN_FMT; + + return BCF_UN_INFO; +} +static int filters_init1(filter_t *filter, char *str, int len, token_t *tok) +{ + tok->tag_type = -1; + tok->tok_type = TOK_VAL; + tok->hdr_id = -1; + tok->pass_site = -1; + tok->idx = 0; + + // is this a string constant? + if ( str[0]=='"' || str[0]=='\'' ) + { + int quote = str[0]; + if ( str[len-1] != quote ) error("TODO: [%s]\n", filter->str); + tok->key = (char*) calloc(len-1,sizeof(char)); + hts_expand(double,1,tok->mvalues,tok->values); + tok->values[0] = len-2; + memcpy(tok->key,str+1,len-2); + tok->key[len-2] = 0; + tok->is_str = 1; + tok->nvalues = len-2; + if ( !strcmp(".",tok->key) ) tok->is_missing = 1; + return 0; + } + + // is it a file? + if ( str[0]=='@' ) + { + tok->tag = (char*) calloc(len+1,sizeof(char)); + memcpy(tok->tag,str,len); + tok->tag[len] = 0; + char *fname = expand_path(tok->tag+1); + int i, n; + char **list = hts_readlist(fname, 1, &n); + if ( !list ) error("Could not read: %s\n", fname); + free(fname); + tok->hash = khash_str2int_init(); + for (i=0; ihash,list[i]) ) + khash_str2int_inc(tok->hash,list[i]); + else + free(list[i]); + } + free(list); + return 0; + } + + int is_fmt = -1; + if ( !strncasecmp(str,"FMT/",4) ) { str += 4; len -= 4; is_fmt = 1; } + else if ( !strncasecmp(str,"FORMAT/",7) ) { str += 7; len -= 7; is_fmt = 1; } + else + { + if ( !strncasecmp(str,"INFO/",5) ) { is_fmt = 0; str += 5; len -= 5; } + else if ( !strncasecmp(str,"QUAL",len) || !strncmp(str,"%QUAL",len) /* for backward compatibility */ ) + { + tok->setter = filters_set_qual; + tok->tag = strdup("QUAL"); + return 0; + } + else if ( !strncasecmp(str,"TYPE",len) || !strncmp(str,"%TYPE",len) /* for backward compatibility */ ) + { + tok->setter = filters_set_type; + tok->tag = strdup("TYPE"); + return 0; + } + else if ( !strncasecmp(str,"FILTER",len) || !strncmp(str,"%FILTER",len) /* for backward compatibility */ ) + { + tok->comparator = filters_cmp_filter; + tok->tag = strdup("FILTER"); + filter->max_unpack |= BCF_UN_FLT; + tok->tag_type = BCF_HL_FLT; + return 0; + } + else if ( !strncasecmp(str,"ID",len) || !strncasecmp(str,"%ID",len) /* for backward compatibility */ ) + { + tok->comparator = filters_cmp_id; + tok->tag = strdup("ID"); + return 0; + } + else if ( !strncasecmp(str,"CHROM",len) ) + { + tok->setter = &filters_set_chrom; + tok->tag = strdup("CHROM"); + return 0; + } + else if ( !strncasecmp(str,"POS",len) ) + { + tok->setter = &filters_set_pos; + tok->tag = strdup("POS"); + return 0; + } + else if ( !strncasecmp(str,"REF",len) ) + { + tok->setter = &filters_set_ref_string; + tok->is_str = 1; + tok->tag = strdup("REF"); + return 0; + } + else if ( !strncasecmp(str,"ALT",len) ) + { + tok->setter = &filters_set_alt_string; + tok->is_str = 1; + tok->tag = strdup("ALT"); + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + tok->idx = -2; + return 0; + } + else if ( !strncasecmp(str,"N_ALT",len) ) + { + tok->setter = &filters_set_nalt; + tok->tag = strdup("N_ALT"); + return 0; + } + else if ( !strncasecmp(str,"N_SAMPLES",len) ) + { + tok->tok_type = TOK_VAL; + tok->threshold = bcf_hdr_nsamples(filter->hdr); + tok->is_constant = 1; + return 0; + } + else if ( !strncasecmp(str,"N_MISSING",len) ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->setter = &filters_set_nmissing; + tok->tag = strdup("N_MISSING"); + return 0; + } + else if ( !strncasecmp(str,"F_MISSING",len) ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->setter = &filters_set_nmissing; + tok->tag = strdup("F_MISSING"); + return 0; + } + } + + // does it have array subscript? + int is_array = 0; + kstring_t tmp = {0,0,0}; + kputsn(str, len, &tmp); + if ( tmp.s[tmp.l-1] == ']' ) + { + int i; + for (i=0; ihdr_id = bcf_hdr_id2int(filter->hdr,BCF_DT_ID,tmp.s); + if ( is_fmt==-1 ) + { + if ( tok->hdr_id >=0 ) + { + int is_info = bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_INFO,tok->hdr_id) ? 1 : 0; + is_fmt = bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_FMT,tok->hdr_id) ? 1 : 0; + if ( is_info && is_fmt ) + error("Error: ambiguous filtering expression, both INFO/%s and FORMAT/%s are defined in the VCF header.\n" , tmp.s,tmp.s); + } + if ( is_fmt==-1 ) is_fmt = 0; + } + if ( is_array ) + parse_tag_idx(filter->hdr, is_fmt, tmp.s, tmp.s+is_array, tok); + else if ( is_fmt && !tok->nsamples ) + { + int i; + tok->nsamples = bcf_hdr_nsamples(filter->hdr); + tok->usmpl = (uint8_t*) malloc(tok->nsamples); + for (i=0; insamples; i++) tok->usmpl[i] = 1; + } + + tok->tag_type = is_fmt ? BCF_HL_FMT : BCF_HL_INFO; + if ( is_fmt ) filter->max_unpack |= BCF_UN_FMT; + if ( tok->hdr_id>=0 ) + { + if ( is_fmt && !strcmp("GT",tmp.s) ) + { + tok->setter = &filters_set_genotype_string; tok->is_str = 1; + } + else if ( is_fmt ) + { + if ( !bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_FMT,tok->hdr_id) ) + error("No such FORMAT field: %s\n", tmp.s); + if ( bcf_hdr_id2number(filter->hdr,BCF_HL_FMT,tok->hdr_id)!=1 && !is_array ) + { + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + tok->idx = -2; + } + switch ( bcf_hdr_id2type(filter->hdr,BCF_HL_FMT,tok->hdr_id) ) + { + case BCF_HT_INT: tok->setter = &filters_set_format_int; break; + case BCF_HT_REAL: tok->setter = &filters_set_format_float; break; + case BCF_HT_STR: tok->setter = &filters_set_format_string; tok->is_str = 1; break; + default: error("[%s:%d %s] FIXME\n", __FILE__,__LINE__,__FUNCTION__); + } + } + else if ( !bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_INFO,tok->hdr_id) ) + error("No such INFO field: %s\n", tmp.s); + else + { + if ( bcf_hdr_id2type(filter->hdr,BCF_HL_INFO,tok->hdr_id) == BCF_HT_FLAG ) + tok->setter = filters_set_info_flag; + else + { + if ( bcf_hdr_id2type(filter->hdr,BCF_HL_INFO,tok->hdr_id) == BCF_HT_STR ) tok->is_str = 1; + if ( bcf_hdr_id2number(filter->hdr,BCF_HL_INFO,tok->hdr_id)==1 ) + tok->setter = filters_set_info; + else + { + switch ( bcf_hdr_id2type(filter->hdr,BCF_HL_INFO,tok->hdr_id) ) + { + case BCF_HT_INT: tok->setter = &filters_set_info_int; break; + case BCF_HT_REAL: tok->setter = &filters_set_info_float; break; + case BCF_HT_STR: tok->setter = &filters_set_info_string; tok->is_str = 1; break; + default: error("[%s:%d %s] FIXME\n", __FILE__,__LINE__,__FUNCTION__); + } + if (!is_array) + { + tok->idx = -2; + tok->idxs = (int*) malloc(sizeof(int)); + tok->idxs[0] = -1; + tok->nidxs = 1; + } + } + } + filter->max_unpack |= BCF_UN_INFO; + } + tok->tag = strdup(tmp.s); + if ( tmp.s ) free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"ALT") ) + { + tok->setter = &filters_set_alt_string; + tok->is_str = 1; + tok->tag = strdup(tmp.s); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"AN") ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->setter = &filters_set_an; + tok->tag = strdup("AN"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"AC") ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->setter = &filters_set_ac; + tok->tag = strdup("AC"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"MAC") ) + { + filter->max_unpack |= max_ac_an_unpack(filter->hdr); + tok->setter = &filters_set_mac; + tok->tag = strdup("MAC"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"AF") ) + { + filter->max_unpack |= max_ac_an_unpack(filter->hdr); + tok->setter = &filters_set_af; + tok->tag = strdup("AF"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"MAF") ) + { + filter->max_unpack |= max_ac_an_unpack(filter->hdr); + tok->setter = &filters_set_maf; + tok->tag = strdup("MAF"); + free(tmp.s); + return 0; + } + else if ( !strcasecmp(tmp.s,"ILEN") || !strcasecmp(tmp.s,"%ILEN") ) + { + filter->max_unpack |= BCF_UN_STR; + tok->setter = &filters_set_ilen; + tok->tag = strdup("ILEN"); + free(tmp.s); + return 0; + } + + // is it a value? Here we parse as integer/float separately and use strtof + // rather than strtod, because the more accurate double representation + // would invalidate floating point comparisons like QUAL=59.2, obtained via + // htslib/vcf parser. + // Update: use strtod() and force floats only in comparisons + char *end; + tok->threshold = strtol(tmp.s, &end, 10); // integer? + if ( end - tmp.s != strlen(tmp.s) ) + { + errno = 0; + tok->threshold = strtod(tmp.s, &end); // float? + if ( errno!=0 || end!=tmp.s+len ) error("[%s:%d %s] Error: the tag \"%s\" is not defined in the VCF header\n", __FILE__,__LINE__,__FUNCTION__,tmp.s); + } + tok->is_constant = 1; + + if ( tmp.s ) free(tmp.s); + return 0; +} + + +static void filter_debug_print(token_t *toks, token_t **tok_ptrs, int ntoks) +{ + int i; + for (i=0; itok_type==TOK_VAL ) + { + if ( tok->key ) + fprintf(bcftools_stderr,"%s", tok->key); + else if ( tok->tag ) + fprintf(bcftools_stderr,"%s", tok->tag); + else + fprintf(bcftools_stderr,"%e", tok->threshold); + } + else + fprintf(bcftools_stderr,"%c", TOKEN_STRING[tok->tok_type]); + if ( tok->setter ) fprintf(bcftools_stderr,"\t[setter %p]", tok->setter); + fprintf(bcftools_stderr,"\n"); + } +} + +static void str_to_lower(char *str) +{ + while ( *str ) { *str = tolower(*str); str++; } +} +static int perl_exec(filter_t *flt, bcf1_t *line, token_t *rtok, token_t **stack, int nstack) +{ +#if ENABLE_PERL_FILTERS + + PerlInterpreter *perl = flt->perl; + if ( !perl ) error("Error: perl expression without a perl script name\n"); + + dSP; + ENTER; + SAVETMPS; + + PUSHMARK(SP); + int i,j, istack = nstack - rtok->nargs; + for (i=istack+1; iis_str ) + XPUSHs(sv_2mortal(newSVpvn(tok->str_value.s,tok->str_value.l))); + else if ( tok->nvalues==1 ) + XPUSHs(sv_2mortal(newSVnv(tok->values[0]))); + else if ( tok->nvalues>1 ) + { + AV *av = newAV(); + for (j=0; jnvalues; j++) av_push(av, newSVnv(tok->values[j])); + SV *rv = newRV_inc((SV*)av); + XPUSHs(rv); + } + else + { + bcf_double_set_missing(tok->values[0]); + XPUSHs(sv_2mortal(newSVnv(tok->values[0]))); + } + } + PUTBACK; + + // A possible future todo: provide a means to select samples and indexes, + // expressions like this don't work yet + // perl.filter(FMT/AD)[1:0] + + int nret = call_pv(stack[istack]->str_value.s, G_ARRAY); + + SPAGAIN; + + rtok->nvalues = nret; + hts_expand(double, rtok->nvalues, rtok->mvalues, rtok->values); + for (i=nret; i>0; i--) + { + rtok->values[i-1] = (double) POPn; + if ( isnan(rtok->values[i-1]) ) bcf_double_set_missing(rtok->values[i-1]); + } + + PUTBACK; + FREETMPS; + LEAVE; + +#else + error("\nPerl filtering requires running `configure --enable-perl-filters` at compile time.\n\n"); +#endif + return rtok->nargs; +} +static void perl_init(filter_t *filter, char **str) +{ + char *beg = *str; + while ( *beg && isspace(*beg) ) beg++; + if ( !*beg ) return; + if ( strncasecmp("perl:", beg, 5) ) return; +#if ENABLE_PERL_FILTERS + beg += 5; + char *end = beg; + while ( *end && *end!=';' ) end++; // for now not escaping semicolons + *str = end+1; + + if ( ++filter_ninit == 1 ) + { + // must be executed only once, even for multiple filters; first time here + int argc = 0; + char **argv = NULL; + char **env = NULL; + PERL_SYS_INIT3(&argc, &argv, &env); + } + + filter->perl = perl_alloc(); + PerlInterpreter *perl = filter->perl; + + if ( !perl ) error("perl_alloc failed\n"); + perl_construct(perl); + + // name of the perl script to run + char *rmme = (char*) calloc(end - beg + 1,1); + memcpy(rmme, beg, end - beg); + char *argv[] = { "", "" }; + argv[1] = expand_path(rmme); + free(rmme); + + PL_origalen = 1; // don't allow $0 change + int ret = perl_parse(filter->perl, NULL, 2, argv, NULL); + PL_exit_flags |= PERL_EXIT_DESTRUCT_END; + if ( ret ) error("Failed to parse: %s\n", argv[1]); + free(argv[1]); + + perl_run(perl); +#else + error("\nPerl filtering requires running `configure --enable-perl-filters` at compile time.\n\n"); +#endif +} +static void perl_destroy(filter_t *filter) +{ +#if ENABLE_PERL_FILTERS + if ( !filter->perl ) return; + + PerlInterpreter *perl = filter->perl; + perl_destruct(perl); + perl_free(perl); + if ( --filter_ninit <= 0 ) + { + // similarly to PERL_SYS_INIT3, can must be executed only once? todo: test + PERL_SYS_TERM(); + } +#endif +} + + +// Parse filter expression and convert to reverse polish notation. Dijkstra's shunting-yard algorithm +filter_t *filter_init(bcf_hdr_t *hdr, const char *str) +{ + filter_t *filter = (filter_t *) calloc(1,sizeof(filter_t)); + filter->str = strdup(str); + filter->hdr = hdr; + filter->max_unpack |= BCF_UN_STR; + + int nops = 0, mops = 0; // operators stack + int nout = 0, mout = 0; // filter tokens, RPN + token_t *out = NULL; + token_t *ops = NULL; + char *tmp = filter->str; + perl_init(filter, &tmp); + + int last_op = -1; + while ( *tmp ) + { + int len, ret; + ret = filters_next_token(&tmp, &len); + if ( ret==-1 ) error("Missing quotes in: %s\n", str); + + // fprintf(bcftools_stderr,"token=[%c] .. [%s] %d\n", TOKEN_STRING[ret], tmp, len); + // int i; for (i=0; i0 && ops[nops-1].tok_type!=TOK_LFT ) + { + nout++; + hts_expand0(token_t, nout, mout, out); + out[nout-1] = ops[nops-1]; + memset(&ops[nops-1],0,sizeof(token_t)); + nops--; + } + if ( nops<=0 ) error("Could not parse: %s\n", str); + memset(&ops[nops-1],0,sizeof(token_t)); + nops--; + } + else if ( ret!=TOK_VAL ) // one of the operators + { + // detect unary minus: replace -value with -1*(value) + if ( ret==TOK_SUB && last_op!=TOK_VAL && last_op!=TOK_RGT ) + { + nout++; + hts_expand0(token_t, nout, mout, out); + token_t *tok = &out[nout-1]; + tok->tok_type = TOK_VAL; + tok->hdr_id = -1; + tok->pass_site = -1; + tok->threshold = -1.0; + tok->is_constant = 1; + ret = TOK_MULT; + } + else if ( ret == -TOK_FUNC ) + { + // this is different from TOK_PERLSUB,TOK_BINOM in that the expression inside the + // brackets gets evaluated as normal expression + nops++; + hts_expand0(token_t, nops, mops, ops); + token_t *tok = &ops[nops-1]; + tok->tok_type = -ret; + tok->hdr_id = -1; + tok->pass_site = -1; + tok->threshold = -1.0; + if ( !strncasecmp(tmp-len,"N_PASS",6) ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->func = func_npass; + tok->tag = strdup("N_PASS"); + } + else if ( !strncasecmp(tmp-len,"F_PASS",6) ) + { + filter->max_unpack |= BCF_UN_FMT; + tok->func = func_npass; + tok->tag = strdup("F_PASS"); + } + else error("The function \"%s\" is not supported\n", tmp-len); + continue; + } + else if ( ret < 0 ) // variable number of arguments: TOK_PERLSUB,TOK_BINOM + { + ret = -ret; + + tmp += len; + char *beg = tmp; + kstring_t rmme = {0,0,0}; + int i, margs, nargs = 0; + + if ( ret == TOK_PERLSUB ) + { + while ( *beg && ((isalnum(*beg) && !ispunct(*beg)) || *beg=='_') ) beg++; + if ( *beg!='(' ) error("Could not parse the expression: %s\n", str); + + // the subroutine name + kputc('"', &rmme); + kputsn(tmp, beg-tmp, &rmme); + kputc('"', &rmme); + nout++; + hts_expand0(token_t, nout, mout, out); + filters_init1(filter, rmme.s, rmme.l, &out[nout-1]); + nargs++; + } + char *end = beg; + while ( *end && *end!=')' ) end++; + if ( !*end ) error("Could not parse the expression: %s\n", str); + + // subroutine arguments + rmme.l = 0; + kputsn(beg+1, end-beg-1, &rmme); + char **rmme_list = hts_readlist(rmme.s, 0, &margs); + for (i=0; itok_type = ret; + tok->nargs = nargs; + tok->hdr_id = -1; + tok->pass_site = -1; + tok->threshold = -1.0; + + tmp = end + 1; + continue; + } + else + { + while ( nops>0 && op_prec[ret] < op_prec[ops[nops-1].tok_type] ) + { + nout++; + hts_expand0(token_t, nout, mout, out); + out[nout-1] = ops[nops-1]; + memset(&ops[nops-1],0,sizeof(token_t)); + nops--; + } + } + nops++; + hts_expand0(token_t, nops, mops, ops); + ops[nops-1].tok_type = ret; + } + else if ( !len ) + { + if ( *tmp && !isspace(*tmp) ) error("Could not parse the expression: [%s]\n", str); + break; // all tokens read + } + else // annotation name or filtering value + { + nout++; + hts_expand0(token_t, nout, mout, out); + if ( tmp[len-1]==',' ) + filters_init1(filter, tmp, len-1, &out[nout-1]); + else + filters_init1(filter, tmp, len, &out[nout-1]); + tmp += len; + } + last_op = ret; + } + while ( nops>0 ) + { + if ( ops[nops-1].tok_type==TOK_LFT || ops[nops-1].tok_type==TOK_RGT ) error("Could not parse the expression: [%s]\n", filter->str); + nout++; + hts_expand0(token_t, nout, mout, out); + out[nout-1] = ops[nops-1]; + memset(&ops[nops-1],0,sizeof(token_t)); + nops--; + } + + // In the special cases of TYPE and FILTER the BCF header IDs are yet unknown. Walk through the + // list of operators and convert the strings (e.g. "PASS") to BCF ids. The string value token must be + // just before or after the FILTER token and they must be followed with a comparison operator. + // At this point we also initialize regex expressions which, in RPN, must preceed the LIKE/NLIKE operator. + // Additionally, treat "." as missing value rather than a string in numeric equalities; that + // @file is only used with ID; etc. + // This code is fragile: improve me. + static int comma_separator_warned = 0; + int i; + for (i=0; istr); + + if ( out[i].hash ) + { + int j = out[i+1].tok_type==TOK_VAL ? i+1 : i-1; + if ( out[j].comparator!=filters_cmp_id ) + error("Error: could not parse the expression. Note that the \"@file_name\" syntax can be currently used with ID column only.\n"); + } + if ( out[i].tok_type==TOK_OR || out[i].tok_type==TOK_OR_VEC ) + out[i].func = vector_logic_or; + if ( out[i].tok_type==TOK_AND || out[i].tok_type==TOK_AND_VEC ) + out[i].func = vector_logic_and; + if ( out[i].tok_type==TOK_EQ || out[i].tok_type==TOK_NE ) + { + // Look for j="." and k numeric type + int j = i-1, k = i-2; + if ( !out[j].is_str ) { k = i-1, j = i-2; } + if ( out[j].is_str && out[j].key && !strcmp(".",out[j].key) ) + { + int set_missing = 0; + if ( out[k].hdr_id>0 ) + { + int type = bcf_hdr_id2type(filter->hdr,out[k].tag_type,out[k].hdr_id); + if ( type==BCF_HT_INT ) set_missing = 1; + else if ( type==BCF_HT_REAL ) set_missing = 1; + } + else if ( !strcmp("QUAL",out[k].tag) ) set_missing = 1; + if ( set_missing ) { out[j].is_str = 0; out[j].is_missing = 1; bcf_double_set_missing(out[j].values[0]); } + } + } + if ( out[i].tok_type==TOK_LIKE || out[i].tok_type==TOK_NLIKE ) + { + int j = i-1; + if ( !out[j].key ) + error("Could not parse the expression, wrong value for regex operator: %s\n", filter->str); + out[j].regex = (regex_t *) malloc(sizeof(regex_t)); + int cflags = REG_NOSUB; + int len = strlen(out[j].key); + if ( len>2 && out[j].key[len-1]=='i' && out[j].key[len-2]=='/' && out[j].key[len-3]!='\\' ) + { + out[j].key[len-2] = 0; + cflags |= REG_ICASE; + } + if ( regcomp(out[j].regex, out[j].key, cflags) ) + error("Could not compile the regex expression \"%s\": %s\n", out[j].key,filter->str); + } + if ( out[i].is_str && out[i].tok_type==TOK_VAL && out[i].key && strchr(out[i].key,',') ) + { + int print_note = 0; + if ( out[i+1].tok_type==TOK_EQ || (out[i+1].is_str && out[i+2].tok_type==TOK_EQ) ) print_note = 1; + else if ( out[i+1].tok_type==TOK_NE || (out[i+1].is_str && out[i+2].tok_type==TOK_NE) ) print_note = 1; + if ( print_note && !comma_separator_warned ) + { + comma_separator_warned = 1; + fprintf(bcftools_stderr, + "Warning: comma is interpreted as a separator and OR logic is used in string comparisons.\n" + " (Search the manual for \"Comma in strings\" to learn more.)\n"); + } + } + if ( out[i].tok_type!=TOK_VAL ) continue; + if ( !out[i].tag ) continue; + if ( out[i].setter==filters_set_type ) + { + if ( i+1==nout ) error("Could not parse the expression: %s\n", filter->str); + int itok, ival; + if ( out[i+1].tok_type==TOK_EQ || out[i+1].tok_type==TOK_NE ) ival = i - 1, itok = i + 1; + else if ( out[i+1].tok_type==TOK_LIKE || out[i+1].tok_type==TOK_NLIKE ) ival = i - 1, itok = i + 1; + else if ( out[i+2].tok_type==TOK_EQ || out[i+2].tok_type==TOK_NE ) itok = i + 2, ival = i + 1; + else if ( out[i+2].tok_type==TOK_LIKE || out[i+2].tok_type==TOK_NLIKE ) itok = i + 2, ival = i + 1; + else error("[%s:%d %s] Could not parse the expression: %s\n", __FILE__,__LINE__,__FUNCTION__, filter->str); + if ( !strcasecmp(out[ival].key,"snp") || !strcasecmp(out[ival].key,"snps") ) { out[ival].threshold = VCF_SNP<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"indel") || !strcasecmp(out[ival].key,"indels") ) { out[ival].threshold = VCF_INDEL<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"mnp") || !strcasecmp(out[ival].key,"mnps") ) { out[ival].threshold = VCF_MNP<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"other") ) { out[ival].threshold = VCF_OTHER<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"bnd") ) { out[ival].threshold = VCF_BND<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"overlap") ) { out[ival].threshold = VCF_OVERLAP<<1; out[ival].is_str = 0; } + else if ( !strcasecmp(out[ival].key,"ref") ) { out[ival].threshold = 1; out[ival].is_str = 0; } + else error("The type \"%s\" not recognised: %s\n", out[ival].key, filter->str); + out[ival].is_constant = 1; + if ( out[itok].tok_type==TOK_LIKE || out[itok].tok_type==TOK_NLIKE ) out[itok].comparator = filters_cmp_bit_and; + out[ival].tag = out[ival].key; out[ival].key = NULL; + i = itok; + continue; + } + if ( !strcmp(out[i].tag,"GT") ) + { + if ( i+1==nout ) error("Could not parse the expression: %s\n", filter->str); + int ival; + if ( out[i+1].tok_type==TOK_EQ || out[i+1].tok_type==TOK_NE ) ival = i - 1; + else if ( out[i+1].tok_type==TOK_LIKE || out[i+1].tok_type==TOK_NLIKE ) ival = i - 1; + else if ( out[i+2].tok_type==TOK_EQ || out[i+2].tok_type==TOK_NE ) ival = i + 1; + else if ( out[i+2].tok_type==TOK_LIKE || out[i+2].tok_type==TOK_NLIKE ) ival = i + 1; + else error("[%s:%d %s] Could not parse the expression: %s\n", __FILE__,__LINE__,__FUNCTION__, filter->str); + + if ( !out[ival].key ) error("Comparison between samples is not supported, sorry!\n"); + + // assign correct setters and unify expressions, eg ar->ra, HOM->hom, etc + if ( !strcasecmp(out[ival].key,"hom") ) { out[i].setter = filters_set_genotype3; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"het") ) { out[i].setter = filters_set_genotype3; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"hap") ) { out[i].setter = filters_set_genotype3; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"mis") ) { out[i].setter = filters_set_genotype4; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"ref") ) { out[i].setter = filters_set_genotype4; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"alt") ) { out[i].setter = filters_set_genotype4; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"rr") ) { out[i].setter = filters_set_genotype2; str_to_lower(out[ival].key); } + else if ( !strcasecmp(out[ival].key,"ra") || !strcasecmp(out[ival].key,"ar") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='r'; out[ival].key[1]='a'; } // ra + else if ( !strcmp(out[ival].key,"aA") || !strcmp(out[ival].key,"Aa") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='a'; out[ival].key[1]='A'; } // aA + else if ( !strcasecmp(out[ival].key,"aa") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='a'; out[ival].key[1]='a'; } // aa + else if ( !strcasecmp(out[ival].key,"a") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='a'; out[ival].key[1]=0; } // a + else if ( !strcasecmp(out[ival].key,"r") ) { out[i].setter = filters_set_genotype2; out[ival].key[0]='r'; out[ival].key[1]=0; } // r + continue; + } + if ( out[i].tag_type==BCF_HL_FLT ) + { + if ( i+1==nout ) error("Could not parse the expression: %s\n", filter->str); + int itok = i, ival; + if ( out[i+1].tok_type==TOK_EQ || out[i+1].tok_type==TOK_NE ) ival = i - 1; + else if ( out[i+1].tok_type==TOK_LIKE ) out[i+1].tok_type = TOK_IN, ival = i - 1; + else if ( out[i+1].tok_type==TOK_NLIKE ) out[i+1].tok_type = TOK_NOT_IN, ival = i - 1; + else if ( out[i+2].tok_type==TOK_EQ || out[i+2].tok_type==TOK_NE ) ival = ++i; + else if ( out[i+2].tok_type==TOK_LIKE ) out[i+2].tok_type = TOK_IN, ival = ++i; + else if ( out[i+2].tok_type==TOK_NLIKE ) out[i+2].tok_type = TOK_NOT_IN, ival = ++i; + else error("[%s:%d %s] Could not parse the expression: %s\n", __FILE__,__LINE__,__FUNCTION__, filter->str); + if ( out[ival].tok_type!=TOK_VAL || !out[ival].key ) + error("[%s:%d %s] Could not parse the expression, an unquoted string value perhaps? %s\n", __FILE__,__LINE__,__FUNCTION__, filter->str); + token_t *tok = &out[ival]; + char *bp = tok->key; + tok->nvalues = 0; + int has_missing = 0; + while ( *bp ) + { + char tmp, *ep = bp; + while ( *ep && *ep!=';' ) ep++; + tmp = *ep; + *ep = 0; + if ( !strcmp(".",bp) ) has_missing = 1; + else + { + tok->nvalues++; + hts_expand(double,tok->nvalues,tok->mvalues,tok->values); + int id = bcf_hdr_id2int(filter->hdr, BCF_DT_ID, bp); + if ( !bcf_hdr_idinfo_exists(filter->hdr,BCF_HL_FLT,id) ) + error("The filter \"%s\" not present in the VCF header\n", bp); + tok->values[tok->nvalues-1] = id; + } + *ep = tmp; + if ( !tmp ) break; + bp = ep + 1; + } + if ( has_missing && tok->nvalues ) error("The FILTER expression cannot contain missing value AND filters: \"%s\" (%d)\n",tok->key,tok->nvalues); + out[ival].tag = tok->key; + tok->key = NULL; + out[itok].hdr_id = tok->hdr_id; + continue; + } + } + filter->nsamples = filter->max_unpack&BCF_UN_FMT ? bcf_hdr_nsamples(filter->hdr) : 0; + for (i=0; insamples ) + { + out[i].pass_samples = (uint8_t*)malloc(filter->nsamples); + int j; + for (j=0; jnsamples; j++) out[i].pass_samples[j] = 0; + } + } + + if (0) filter_debug_print(out, NULL, nout); + + if ( mops ) free(ops); + filter->filters = out; + filter->nfilters = nout; + filter->flt_stack = (token_t **)malloc(sizeof(token_t*)*nout); + return filter; +} + +void filter_destroy(filter_t *filter) +{ + perl_destroy(filter); + int i; + for (i=0; infilters; i++) + { + if ( filter->filters[i].key ) free(filter->filters[i].key); + free(filter->filters[i].str_value.s); + free(filter->filters[i].tag); + free(filter->filters[i].idxs); + free(filter->filters[i].usmpl); + free(filter->filters[i].values); + free(filter->filters[i].pass_samples); + if (filter->filters[i].hash) khash_str2int_destroy_free(filter->filters[i].hash); + if (filter->filters[i].regex) + { + regfree(filter->filters[i].regex); + free(filter->filters[i].regex); + } + } + free(filter->filters); + free(filter->flt_stack); + free(filter->str); + free(filter->tmpi); + free(filter->tmpf); + free(filter->tmps.s); + free(filter); +} + +int filter_test(filter_t *filter, bcf1_t *line, const uint8_t **samples) +{ + bcf_unpack(line, filter->max_unpack); + + int i, nstack = 0; + for (i=0; infilters; i++) + { + filter->filters[i].pass_site = 0; + if ( filter->filters[i].tok_type == TOK_VAL ) + { + if ( filter->filters[i].setter ) // variable, query the VCF line + filter->filters[i].setter(filter, line, &filter->filters[i]); + else if ( filter->filters[i].key ) // string constant + { + filter->filters[i].str_value.l = 0; + kputs(filter->filters[i].key, &filter->filters[i].str_value); + filter->filters[i].nvalues = filter->filters[i].str_value.l; + } + else if ( filter->filters[i].is_constant ) // numeric constant + { + filter->filters[i].values[0] = filter->filters[i].threshold; + filter->filters[i].nvalues = 1; + } + filter->flt_stack[nstack++] = &filter->filters[i]; + continue; + } + else if ( filter->filters[i].func ) + { + int nargs = filter->filters[i].func(filter, line, &filter->filters[i], filter->flt_stack, nstack); + filter->flt_stack[nstack-nargs] = &filter->filters[i]; + if ( --nargs > 0 ) nstack -= nargs; + continue; + } + if ( nstack<2 ) + error("Error occurred while processing the filter \"%s\" (1:%d)\n", filter->str,nstack); // too few values left on the stack + + int is_str = filter->flt_stack[nstack-1]->is_str + filter->flt_stack[nstack-2]->is_str; + + if ( filter->filters[i].tok_type == TOK_ADD ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],+,(double)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + else if ( filter->filters[i].tok_type == TOK_SUB ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],-,(double)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + else if ( filter->filters[i].tok_type == TOK_MULT ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],*,(double)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + else if ( filter->filters[i].tok_type == TOK_DIV ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],/,(double)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + else if ( filter->filters[i].tok_type == TOK_MODULO ) + { + VECTOR_ARITHMETICS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],%,(int)); + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + continue; + } + + // ideally, these comparators would become func, but this would require more work in init1() + if ( filter->filters[i].comparator ) + { + filter->filters[i].comparator(filter->flt_stack[nstack-1],filter->flt_stack[nstack-2],&filter->filters[i],line); + } + else if ( filter->flt_stack[nstack-1]->comparator ) + { + filter->flt_stack[nstack-1]->comparator(filter->flt_stack[nstack-1],filter->flt_stack[nstack-2],&filter->filters[i],line); + } + else if ( filter->flt_stack[nstack-2]->comparator ) + { + filter->flt_stack[nstack-2]->comparator(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],line); + } + else if ( is_str==2 ) + { + cmp_vector_strings(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i]); + } + else + { + if ( is_str==1 ) error("Error: cannot use arithmetic operators to compare strings and numbers\n"); + + // Determine what to do with one [1] or both [2] sides missing. The first field [0] gives [1]|[2] + int missing_logic[] = {0,0,0}; + if ( filter->filters[i].tok_type == TOK_EQ ) { missing_logic[0] = missing_logic[2] = 1; } + if ( filter->filters[i].tok_type == TOK_NE ) { missing_logic[0] = missing_logic[1] = 1; } + + if ( filter->filters[i].tok_type == TOK_EQ ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],==,missing_logic) + else if ( filter->filters[i].tok_type == TOK_NE ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],!=,missing_logic) + else if ( filter->filters[i].tok_type == TOK_LE ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],<=,missing_logic) + else if ( filter->filters[i].tok_type == TOK_LT ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],<,missing_logic) + else if ( filter->filters[i].tok_type == TOK_BT ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],>,missing_logic) + else if ( filter->filters[i].tok_type == TOK_BE ) + CMP_VECTORS(filter->flt_stack[nstack-2],filter->flt_stack[nstack-1],&filter->filters[i],>=,missing_logic) + else + error("todo: %s:%d .. type=%d\n", __FILE__,__LINE__,filter->filters[i].tok_type); + } + filter->flt_stack[nstack-2] = &filter->filters[i]; + nstack--; + } + if ( nstack>1 ) error("Error occurred while processing the filter \"%s\" (2:%d)\n", filter->str,nstack); // too few values left on the stack + if ( samples ) + { + *samples = filter->max_unpack&BCF_UN_FMT ? filter->flt_stack[0]->pass_samples : NULL; + if ( *samples && !filter->flt_stack[0]->nsamples ) + { + for (i=0; insamples; i++) + filter->flt_stack[0]->pass_samples[i] = filter->flt_stack[0]->pass_site; + } + } + return filter->flt_stack[0]->pass_site; +} + +int filter_max_unpack(filter_t *flt) +{ + return flt->max_unpack; +} + +const double *filter_get_doubles(filter_t *filter, int *nval, int *nval1) +{ + token_t *tok = filter->flt_stack[0]; + if ( tok->nvalues ) + { + *nval = tok->nvalues; + *nval1 = tok->nval1; + } + else + { + if ( !tok->values ) error("fixme in filter_get_doubles(): %s\n", filter->str); + *nval = 1; + *nval1 = 1; + tok->values[0] = filter->flt_stack[0]->pass_site; + } + return tok->values; +} + +void filter_set_samples(filter_t *filter, const uint8_t *samples) +{ + int i,j; + for (i=0; infilters; i++) + { + if ( !filter->filters[i].nsamples ) continue; + for (j=0; jfilters[i].nsamples; j++) filter->filters[i].usmpl[j] = samples[j]; + } +} + diff --git a/bcftools/filter.h b/bcftools/filter.h new file mode 100644 index 0000000..243e3b6 --- /dev/null +++ b/bcftools/filter.h @@ -0,0 +1,64 @@ +/* filter.h -- filter expressions. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#ifndef __FILTER_H__ +#define __FILTER_H__ + +#include + +typedef struct _filter_t filter_t; + +/** + * @hdr: BCF header file + * @str: see the bcftools filter command help for description + */ +filter_t *filter_init(bcf_hdr_t *hdr, const char *str); + +void filter_destroy(filter_t *filter); + +/** + * filter_test() - test whether the BCF record passes the test + * @samples: if not NULL, a pointer to an array with samples statuses is + * stored in the location referenced by @samples. The pointer + * will be set to NULL if the FORMAT fields were not queried. + * Returns 1 if the expression is true and 0 if false. + */ +int filter_test(filter_t *filter, bcf1_t *rec, const uint8_t **samples); + +/** + * filter_set_samples() - restrict filtering expression to samples. + * Call after filter_init(). + * @samples: use samples set to 1, ignore samples set 0 + */ +void filter_set_samples(filter_t *filter, const uint8_t *samples); + +/** + * filter_get_doubles() - return a pointer to values from the last filter_test() evaluation + */ +const double *filter_get_doubles(filter_t *filter, int *nval, int *nval1); + +void filter_expression_info(FILE *fp); +int filter_max_unpack(filter_t *filter); + +#endif diff --git a/bcftools/gvcf.c b/bcftools/gvcf.c new file mode 100644 index 0000000..c7b2e77 --- /dev/null +++ b/bcftools/gvcf.c @@ -0,0 +1,227 @@ +/* gvcf.c -- support for gVCF files. + + Copyright (C) 2014-2015 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include "gvcf.h" +#include "bcftools.h" + +struct _gvcf_t +{ + int *dp_range, ndp_range; // per-sample DP ranges + int prev_range; // 0 if not in a block + int32_t *dp, mdp, *pl, mpl, npl; + int32_t *tmp, mtmp, *gts, ngts,mgts, nqsum,mqsum; + float *qsum; + int32_t rid, start, end, min_dp; + kstring_t als; + bcf1_t *line; +}; + +void gvcf_update_header(gvcf_t *gvcf, bcf_hdr_t *hdr) +{ + bcf_hdr_append(hdr,"##INFO="); + bcf_hdr_append(hdr,"##INFO="); +} + +gvcf_t *gvcf_init(const char *dp_ranges) +{ + gvcf_t *gvcf = (gvcf_t*) calloc(1,sizeof(gvcf_t)); + gvcf->line = bcf_init(); + + int n = 1; + const char *ss = dp_ranges; + while ( *ss ) + { + if ( *ss==',' ) n++; + ss++; + } + gvcf->ndp_range = n; + gvcf->dp_range = (int*) malloc(sizeof(int)*gvcf->ndp_range); + + n = 0; + ss = dp_ranges; + while ( *ss ) + { + char *se = (char*) ss; + gvcf->dp_range[n++] = strtol(ss,&se,10); + if ( se==ss ) return NULL; + if ( *se==',' && se[1] ) { ss = se+1; continue; } + else if ( !*se ) break; + return NULL; + } + return gvcf; +} + +void gvcf_destroy(gvcf_t *gvcf) +{ + free(gvcf->dp_range); + free(gvcf->dp); + free(gvcf->pl); + free(gvcf->tmp); + free(gvcf->qsum); + free(gvcf->gts); + free(gvcf->als.s); + if ( gvcf->line ) bcf_destroy(gvcf->line); + free(gvcf); +} + +bcf1_t *gvcf_write(gvcf_t *gvcf, htsFile *fh, bcf_hdr_t *hdr, bcf1_t *rec, int is_ref) +{ + int i, ret, nsmpl = bcf_hdr_nsamples(hdr); + int can_collapse = is_ref ? 1 : 0; + int32_t dp_range = 0, min_dp = 0; + + // No record and nothing to flush? + if ( !rec && !gvcf->prev_range ) return NULL; + + // Flush gVCF block if there are no more records, chr changed, a gap + // encountered, or other conditions not met (block broken by a non-ref or DP too low). + int needs_flush = can_collapse ? 0 : 1; + + + // Can the record be included in a gVCF block? That is, is this a ref-only site? + if ( rec && can_collapse ) + { + bcf_unpack(rec, BCF_UN_ALL); + + // per-sample depth + ret = bcf_get_format_int32(hdr, rec, "DP", &gvcf->tmp, &gvcf->mtmp); + if ( ret==nsmpl ) + { + min_dp = gvcf->tmp[0]; + for (i=1; i gvcf->tmp[i] ) min_dp = gvcf->tmp[i]; + + for (i=0; indp_range; i++) + if ( min_dp < gvcf->dp_range[i] ) break; + + dp_range = i; + if ( !dp_range ) + { + // leave the record unchanged, DP is too small. Alternatively, return NULL here + // to skip these sites + needs_flush = 1; + can_collapse = 0; + } + } + else + needs_flush = 1; // DP field not present + } + + if ( gvcf->prev_range && gvcf->prev_range!=dp_range ) needs_flush = 1; + if ( !rec || gvcf->rid!=rec->rid || rec->pos > gvcf->end+1 ) needs_flush = 1; + + // If prev_range is set, something can be flushed + if ( gvcf->prev_range && needs_flush ) + { + // mpileup can output two records with the same position, SNP and + // indel. Make sure the end position does not include the non-variant + // SNP position just before the indel. + if ( rec && rec->rid==gvcf->rid && rec->pos==gvcf->end ) gvcf->end--; + + gvcf->end++; // from 0-based to 1-based coordinate + + bcf_clear1(gvcf->line); + gvcf->line->rid = gvcf->rid; + gvcf->line->pos = gvcf->start; + gvcf->line->rlen = gvcf->end - gvcf->start; + bcf_update_alleles_str(hdr, gvcf->line, gvcf->als.s); + if ( gvcf->start+1 < gvcf->end ) // create gVCF record only if it spans at least two sites + bcf_update_info_int32(hdr, gvcf->line, "END", &gvcf->end, 1); + bcf_update_info_int32(hdr, gvcf->line, "MinDP", &gvcf->min_dp, 1); + if ( gvcf->nqsum>0 ) + bcf_update_info_float(hdr, gvcf->line, "QS", gvcf->qsum, gvcf->nqsum); + if ( gvcf->ngts ) + bcf_update_genotypes(hdr,gvcf->line,gvcf->gts,gvcf->ngts); + if ( gvcf->npl>0 ) + bcf_update_format_int32(hdr, gvcf->line, "PL", gvcf->pl, gvcf->npl); + bcf_update_format_int32(hdr, gvcf->line, "DP", gvcf->dp, nsmpl); + if ( bcf_write1(fh, hdr, gvcf->line)!=0 ) error("[%s] Error: failed to write the record\n", __func__); + gvcf->prev_range = 0; + gvcf->rid = -1; + gvcf->npl = 0; + gvcf->nqsum = 0; + gvcf->ngts = 0; + + if ( !rec ) return NULL; // just flushing the buffer, this was last record + } + + if ( can_collapse ) + { + if ( !gvcf->prev_range ) + { + hts_expand(int32_t,nsmpl,gvcf->mdp,gvcf->dp); + memcpy(gvcf->dp,gvcf->tmp,nsmpl*sizeof(int32_t)); // tmp still contains DP from rec + gvcf->npl = bcf_get_format_int32(hdr, rec, "PL", &gvcf->pl, &gvcf->mpl); + + gvcf->nqsum = bcf_get_info_float(hdr,rec,"QS",&gvcf->qsum,&gvcf->mqsum); + gvcf->ngts = bcf_get_genotypes(hdr,rec,&gvcf->gts,&gvcf->mgts); + + gvcf->rid = rec->rid; + gvcf->start = rec->pos; + gvcf->als.l = 0; + kputs(rec->d.allele[0],&gvcf->als); + for (i=1; in_allele; i++) + { + kputc(',',&gvcf->als); + kputs(rec->d.allele[i],&gvcf->als); + } + gvcf->min_dp = min_dp; + } + else + { + if ( gvcf->min_dp > min_dp ) gvcf->min_dp = min_dp; + for (i=0; idp[i] > gvcf->tmp[i] ) gvcf->dp[i] = gvcf->tmp[i]; + ret = bcf_get_format_int32(hdr, rec, "PL", &gvcf->tmp, &gvcf->mtmp); + if ( ret>=0 ) + { + if ( ret!=nsmpl*3 ) error("Unexpected number of PL fields\n"); + for (i=0; ipl[3*i+1] > gvcf->tmp[3*i+1] ) + { + gvcf->pl[3*i+1] = gvcf->tmp[3*i+1]; + gvcf->pl[3*i+2] = gvcf->tmp[3*i+2]; + } + else if ( gvcf->pl[3*i+1]==gvcf->tmp[3*i+1] && gvcf->pl[3*i+2] > gvcf->tmp[3*i+2] ) + gvcf->pl[3*i+2] = gvcf->tmp[3*i+2]; + } + } + else + gvcf->npl = 0; + } + gvcf->prev_range = dp_range; + if ( bcf_get_info_int32(hdr,rec,"END",&gvcf->tmp,&gvcf->mtmp)==1 ) + gvcf->end = gvcf->tmp[0] - 1; // from 1-based to 0-based + else + gvcf->end = rec->pos; + return NULL; + } + + if ( is_ref && min_dp ) + bcf_update_info_int32(hdr, rec, "MinDP", &min_dp, 1); + + return rec; +} + diff --git a/bcftools/gvcf.c.pysam.c b/bcftools/gvcf.c.pysam.c new file mode 100644 index 0000000..bd881f4 --- /dev/null +++ b/bcftools/gvcf.c.pysam.c @@ -0,0 +1,229 @@ +#include "bcftools.pysam.h" + +/* gvcf.c -- support for gVCF files. + + Copyright (C) 2014-2015 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include "gvcf.h" +#include "bcftools.h" + +struct _gvcf_t +{ + int *dp_range, ndp_range; // per-sample DP ranges + int prev_range; // 0 if not in a block + int32_t *dp, mdp, *pl, mpl, npl; + int32_t *tmp, mtmp, *gts, ngts,mgts, nqsum,mqsum; + float *qsum; + int32_t rid, start, end, min_dp; + kstring_t als; + bcf1_t *line; +}; + +void gvcf_update_header(gvcf_t *gvcf, bcf_hdr_t *hdr) +{ + bcf_hdr_append(hdr,"##INFO="); + bcf_hdr_append(hdr,"##INFO="); +} + +gvcf_t *gvcf_init(const char *dp_ranges) +{ + gvcf_t *gvcf = (gvcf_t*) calloc(1,sizeof(gvcf_t)); + gvcf->line = bcf_init(); + + int n = 1; + const char *ss = dp_ranges; + while ( *ss ) + { + if ( *ss==',' ) n++; + ss++; + } + gvcf->ndp_range = n; + gvcf->dp_range = (int*) malloc(sizeof(int)*gvcf->ndp_range); + + n = 0; + ss = dp_ranges; + while ( *ss ) + { + char *se = (char*) ss; + gvcf->dp_range[n++] = strtol(ss,&se,10); + if ( se==ss ) return NULL; + if ( *se==',' && se[1] ) { ss = se+1; continue; } + else if ( !*se ) break; + return NULL; + } + return gvcf; +} + +void gvcf_destroy(gvcf_t *gvcf) +{ + free(gvcf->dp_range); + free(gvcf->dp); + free(gvcf->pl); + free(gvcf->tmp); + free(gvcf->qsum); + free(gvcf->gts); + free(gvcf->als.s); + if ( gvcf->line ) bcf_destroy(gvcf->line); + free(gvcf); +} + +bcf1_t *gvcf_write(gvcf_t *gvcf, htsFile *fh, bcf_hdr_t *hdr, bcf1_t *rec, int is_ref) +{ + int i, ret, nsmpl = bcf_hdr_nsamples(hdr); + int can_collapse = is_ref ? 1 : 0; + int32_t dp_range = 0, min_dp = 0; + + // No record and nothing to flush? + if ( !rec && !gvcf->prev_range ) return NULL; + + // Flush gVCF block if there are no more records, chr changed, a gap + // encountered, or other conditions not met (block broken by a non-ref or DP too low). + int needs_flush = can_collapse ? 0 : 1; + + + // Can the record be included in a gVCF block? That is, is this a ref-only site? + if ( rec && can_collapse ) + { + bcf_unpack(rec, BCF_UN_ALL); + + // per-sample depth + ret = bcf_get_format_int32(hdr, rec, "DP", &gvcf->tmp, &gvcf->mtmp); + if ( ret==nsmpl ) + { + min_dp = gvcf->tmp[0]; + for (i=1; i gvcf->tmp[i] ) min_dp = gvcf->tmp[i]; + + for (i=0; indp_range; i++) + if ( min_dp < gvcf->dp_range[i] ) break; + + dp_range = i; + if ( !dp_range ) + { + // leave the record unchanged, DP is too small. Alternatively, return NULL here + // to skip these sites + needs_flush = 1; + can_collapse = 0; + } + } + else + needs_flush = 1; // DP field not present + } + + if ( gvcf->prev_range && gvcf->prev_range!=dp_range ) needs_flush = 1; + if ( !rec || gvcf->rid!=rec->rid || rec->pos > gvcf->end+1 ) needs_flush = 1; + + // If prev_range is set, something can be flushed + if ( gvcf->prev_range && needs_flush ) + { + // mpileup can output two records with the same position, SNP and + // indel. Make sure the end position does not include the non-variant + // SNP position just before the indel. + if ( rec && rec->rid==gvcf->rid && rec->pos==gvcf->end ) gvcf->end--; + + gvcf->end++; // from 0-based to 1-based coordinate + + bcf_clear1(gvcf->line); + gvcf->line->rid = gvcf->rid; + gvcf->line->pos = gvcf->start; + gvcf->line->rlen = gvcf->end - gvcf->start; + bcf_update_alleles_str(hdr, gvcf->line, gvcf->als.s); + if ( gvcf->start+1 < gvcf->end ) // create gVCF record only if it spans at least two sites + bcf_update_info_int32(hdr, gvcf->line, "END", &gvcf->end, 1); + bcf_update_info_int32(hdr, gvcf->line, "MinDP", &gvcf->min_dp, 1); + if ( gvcf->nqsum>0 ) + bcf_update_info_float(hdr, gvcf->line, "QS", gvcf->qsum, gvcf->nqsum); + if ( gvcf->ngts ) + bcf_update_genotypes(hdr,gvcf->line,gvcf->gts,gvcf->ngts); + if ( gvcf->npl>0 ) + bcf_update_format_int32(hdr, gvcf->line, "PL", gvcf->pl, gvcf->npl); + bcf_update_format_int32(hdr, gvcf->line, "DP", gvcf->dp, nsmpl); + if ( bcf_write1(fh, hdr, gvcf->line)!=0 ) error("[%s] Error: failed to write the record\n", __func__); + gvcf->prev_range = 0; + gvcf->rid = -1; + gvcf->npl = 0; + gvcf->nqsum = 0; + gvcf->ngts = 0; + + if ( !rec ) return NULL; // just flushing the buffer, this was last record + } + + if ( can_collapse ) + { + if ( !gvcf->prev_range ) + { + hts_expand(int32_t,nsmpl,gvcf->mdp,gvcf->dp); + memcpy(gvcf->dp,gvcf->tmp,nsmpl*sizeof(int32_t)); // tmp still contains DP from rec + gvcf->npl = bcf_get_format_int32(hdr, rec, "PL", &gvcf->pl, &gvcf->mpl); + + gvcf->nqsum = bcf_get_info_float(hdr,rec,"QS",&gvcf->qsum,&gvcf->mqsum); + gvcf->ngts = bcf_get_genotypes(hdr,rec,&gvcf->gts,&gvcf->mgts); + + gvcf->rid = rec->rid; + gvcf->start = rec->pos; + gvcf->als.l = 0; + kputs(rec->d.allele[0],&gvcf->als); + for (i=1; in_allele; i++) + { + kputc(',',&gvcf->als); + kputs(rec->d.allele[i],&gvcf->als); + } + gvcf->min_dp = min_dp; + } + else + { + if ( gvcf->min_dp > min_dp ) gvcf->min_dp = min_dp; + for (i=0; idp[i] > gvcf->tmp[i] ) gvcf->dp[i] = gvcf->tmp[i]; + ret = bcf_get_format_int32(hdr, rec, "PL", &gvcf->tmp, &gvcf->mtmp); + if ( ret>=0 ) + { + if ( ret!=nsmpl*3 ) error("Unexpected number of PL fields\n"); + for (i=0; ipl[3*i+1] > gvcf->tmp[3*i+1] ) + { + gvcf->pl[3*i+1] = gvcf->tmp[3*i+1]; + gvcf->pl[3*i+2] = gvcf->tmp[3*i+2]; + } + else if ( gvcf->pl[3*i+1]==gvcf->tmp[3*i+1] && gvcf->pl[3*i+2] > gvcf->tmp[3*i+2] ) + gvcf->pl[3*i+2] = gvcf->tmp[3*i+2]; + } + } + else + gvcf->npl = 0; + } + gvcf->prev_range = dp_range; + if ( bcf_get_info_int32(hdr,rec,"END",&gvcf->tmp,&gvcf->mtmp)==1 ) + gvcf->end = gvcf->tmp[0] - 1; // from 1-based to 0-based + else + gvcf->end = rec->pos; + return NULL; + } + + if ( is_ref && min_dp ) + bcf_update_info_int32(hdr, rec, "MinDP", &min_dp, 1); + + return rec; +} + diff --git a/bcftools/gvcf.h b/bcftools/gvcf.h new file mode 100644 index 0000000..784e1f6 --- /dev/null +++ b/bcftools/gvcf.h @@ -0,0 +1,41 @@ +/* gvcf.[ch] - Helper functions for gVCF support + + The MIT License + + Copyright (c) 2015 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#ifndef __GVCF_H__ +#define __GVCF_H__ + +#include "bcftools.h" + +typedef struct _gvcf_t gvcf_t; + +gvcf_t *gvcf_init(const char *dp_ranges); +void gvcf_update_header(gvcf_t *gvcf, bcf_hdr_t *hdr); +bcf1_t *gvcf_write(gvcf_t *gvcf, htsFile *fh, bcf_hdr_t *hdr, bcf1_t *rec, int is_ref); +void gvcf_destroy(gvcf_t *gvcf); + +#endif diff --git a/bcftools/hclust.c b/bcftools/hclust.c new file mode 100644 index 0000000..945c70e --- /dev/null +++ b/bcftools/hclust.c @@ -0,0 +1,401 @@ +/* The MIT License + + Copyright (c) 2016 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include "bcftools.h" +#include "hclust.h" + +typedef struct _node_t +{ + struct _node_t *akid, *bkid, *next, *prev, *parent; + int id, idx; // id: unique node id; idx: current index to pdist + float value; // max pairwise dist of elements within the node +} +node_t; + +struct _hclust_t +{ + int ndat, nclust; // ndat: number of elements (pdist matrix size); nclust: current number of clusters + float *pdist; // pairwise cluster distances, diagonal matrix accessed via the PDIST macro + node_t *first, *last; // clusters are maintained in a double-linked list + node_t **rmme; // convenience array to remove all allocated nodes at the end + int nrmme; + kstring_t str; // (for debugging) pointer to str.s is returned by create_dot() + char **dbg; // (for debugging) created by create_list() via set_threshold() and returned by explain() + int ndbg, mdbg; +}; + +node_t *append_node(hclust_t *clust, int idx) +{ + node_t *node = (node_t*) calloc(1,sizeof(node_t)); + + clust->nclust++; + node->id = clust->nrmme; + node->idx = idx; + if ( !clust->first ) + { + clust->first = node; + clust->last = node; + } + else + { + node->prev = clust->last; + clust->last->next = node; + clust->last = node; + } + + if ( clust->nrmme >= clust->ndat*2 ) error("hclust fixme: %d vs %d\n",clust->nrmme,clust->ndat); + clust->rmme[clust->nrmme++] = node; + + return node; +} +void remove_node(hclust_t *clust, node_t *node) +{ + if ( node==clust->first ) clust->first = node->next; + if ( node==clust->last ) clust->last = node->prev; + if ( node->next ) node->next->prev = node->prev; + if ( node->prev ) node->prev->next = node->next; + clust->nclust--; +} + +#if DEBUG +void hclust_debug(hclust_t *clust) +{ + int i; + fprintf(stderr,"nrmme=%d nclust=%d\n", clust->nrmme,clust->nclust); + for (i=0; inrmme; i++) + { + node_t *node = clust->rmme[i]; + int akid = node->akid ? node->akid->id : -1; + int bkid = node->bkid ? node->bkid->id : -1; + int akidx = node->akid ? node->akid->idx : -1; + int bkidx = node->bkid ? node->bkid->idx : -1; + fprintf(stderr,"\t%d\t%d\t%f\t%d %d\t%d %d\n",node->id,node->idx,node->value,akid,bkid,akidx,bkidx); + } + + int j; + for (i=1; indat; i++) + { + int active = 0; + node_t *node = clust->first; + while (node) + { + if ( node->idx==i ) { active=1; break; } + node = node->next; + } + fprintf(stderr,"%2d%c ",i,active?'*':' '); + for (j=0; jpdist,i,j)==9 ) + fprintf(stderr," ----- "); + else + fprintf(stderr," %f", PDIST(clust->pdist,i,j)); + } + fprintf(stderr,"\n"); + } + for (j=0; jndat-1; j++) fprintf(stderr," %6d ",j); fprintf(stderr,"\n"); +} +#endif + +hclust_t *hclust_init(int n, float *pdist) +{ + hclust_t *clust = (hclust_t*) calloc(1,sizeof(hclust_t)); + clust->ndat = n; + clust->pdist = pdist; + clust->rmme = (node_t**) calloc(n*2,sizeof(node_t*)); + + // init clusters + int i; + for (i=0; indat; i++) append_node(clust,i); + + // build the tree + while ( clust->nclust>1 ) + { + // find two clusters with minimum distance + float min_value = HUGE_VAL; + node_t *iclust = clust->first->next; + node_t *min_iclust = NULL, *min_jclust = NULL; + while ( iclust ) + { + node_t *jclust = clust->first; + while ( jclust!=iclust ) + { + float value = PDIST(clust->pdist,iclust->idx,jclust->idx); + if ( value < min_value ) + { + min_value = value; + min_iclust = iclust; + min_jclust = jclust; + } + jclust = jclust->next; + } + iclust = iclust->next; + } + assert( min_iclust && min_jclust ); // pdist contains inf or nan, fix the caller + remove_node(clust,min_iclust); + remove_node(clust,min_jclust); + + // update the pairwise distances. We keep the matrix and as we are moving up the + // tree, we use fewer columns/rows as the number of clusters decreases: we reuse + // i-th and leave j-th unused. Inter-cluster distance is defined as maximum distance + // between pairwise distances of elements within the cluster. + iclust = clust->first; + while ( iclust ) + { + if ( PDIST(clust->pdist,iclust->idx,min_iclust->idx) < PDIST(clust->pdist,iclust->idx,min_jclust->idx) ) + PDIST(clust->pdist,iclust->idx,min_iclust->idx) = PDIST(clust->pdist,iclust->idx,min_jclust->idx); + iclust = iclust->next; + } + + node_t *node = append_node(clust,min_iclust->idx); + node->akid = min_iclust; + node->bkid = min_jclust; + node->value = min_value; + node->akid->parent = node; + node->bkid->parent = node; + } + + return clust; +} +void hclust_destroy(hclust_t *clust) +{ + int i; + for (i=0; inrmme; i++) free(clust->rmme[i]); + free(clust->rmme); + free(clust->dbg); + free(clust->str.s); + free(clust); +} + +char *hclust_create_dot(hclust_t *clust, char **labels, float th) +{ + clust->str.l = 0; + ksprintf(&clust->str,"digraph myGraph {"); + + int i; + for (i=0; inrmme; i++) + { + node_t *node = clust->rmme[i]; + if ( node->value ) + ksprintf(&clust->str,"\"%d\" [label=\"%f\"];", node->id,node->value); + else + ksprintf(&clust->str,"\"%d\" [label=\"%s\"];", node->id,labels[node->idx]); + } + for (i=0; inrmme; i++) + { + node_t *node = clust->rmme[i]; + if ( node->akid ) + { + if ( node->value >= th && node->akid && node->akid->value < th ) + ksprintf(&clust->str,"\"%d\" -> \"%d\" [color=\"#D43F3A\" penwidth=3];", node->id,node->akid->id); + else + ksprintf(&clust->str,"\"%d\" -> \"%d\";", node->id,node->akid->id); + } + + if ( node->bkid ) + { + if ( node->value >= th && node->bkid && node->bkid->value < th ) + ksprintf(&clust->str,"\"%d\" -> \"%d\" [color=\"#D43F3A\" penwidth=3];", node->id,node->bkid->id); + else + ksprintf(&clust->str,"\"%d\" -> \"%d\";", node->id,node->bkid->id); + } + } + ksprintf(&clust->str,"};"); + return clust->str.s; +} +char **hclust_explain(hclust_t *clust, int *nlines) +{ + clust->ndbg = 0; + char *beg = clust->str.s; + while ( *beg ) + { + char *end = beg; + while ( *end && *end!='\n' ) end++; + clust->ndbg++; + hts_expand(char*,clust->ndbg,clust->mdbg,clust->dbg); + clust->dbg[clust->ndbg-1] = beg; + if ( !*end ) break; + *end = 0; + beg = end + 1; + } + + *nlines = clust->ndbg; + return clust->dbg; +} + +cluster_t *append_cluster(node_t *node, cluster_t *cluster, int *nclust, node_t **stack) +{ + (*nclust)++; + cluster = (cluster_t*) realloc(cluster,sizeof(cluster_t)*(*nclust)); + cluster_t *clust = &cluster[*nclust-1]; + clust->nmemb = 0; + clust->memb = NULL; + clust->dist = node->value; + + int nstack = 1; + stack[0] = node; + + while ( nstack ) + { + node_t *node = stack[--nstack]; + node_t *akid = node->akid; + node_t *bkid = node->bkid; + if ( node->akid ) + { + stack[nstack++] = akid; + stack[nstack++] = bkid; + } + else + { + clust->nmemb++; + clust->memb = (int*) realloc(clust->memb,sizeof(int)*clust->nmemb); + clust->memb[clust->nmemb-1] = node->id; + } + } + return cluster; +} + +int cmp_nodes(const void *a, const void *b) +{ + const node_t *an = *((const node_t**) a); + const node_t *bn = *((const node_t**) b); + if ( an->value < bn->value ) return -1; + if ( an->value > bn->value ) return 1; + return 0; +} + +float calc_dev(node_t **dat, int n) +{ + float avg = 0, dev = 0; + int i; + for (i=0; ivalue; + avg /= n; + for (i=0; ivalue - avg)*(dat[i]->value - avg); + return sqrt(dev/n); +} + +/* + Heuristics to determine clustering cutoff: sort nodes by distance and + split into two groups by minimizing the standard deviation. + This works best when two elements from a single different sample are + included in the mix. + - min_inter_dist .. smaller values are always considered identical + - max_intra_dist .. larger values are always considered different + */ +float hclust_set_threshold(hclust_t *clust, float min_inter_dist, float max_intra_dist) +{ + node_t **dat = clust->rmme + clust->ndat; + int i, ndat = clust->nrmme - clust->ndat; + + qsort(dat, ndat, sizeof(dat), cmp_nodes); + + clust->str.l = 0; + float th, min_dev = HUGE_VAL; + int imin = -1; + for (i=0; i0 ) dev += calc_dev(dat,i); + if ( i+1value; + ksprintf(&clust->str,"DEV\t%f\t%f\n",th,dev); + if ( min_dev > dev && th >= min_inter_dist ) { min_dev = dev; imin = i; } + } + if ( max_intra_dist > 0 ) + th = max_intra_dist; // use fixed cutoff, the above was only for debugging output + else + { + // dynamic cutoff + max_intra_dist = fabs(max_intra_dist); + th = imin==-1 ? max_intra_dist : dat[imin]->value; + if ( th > max_intra_dist ) th = max_intra_dist; + } + ksprintf(&clust->str,"TH\t%f\n", th); + ksprintf(&clust->str,"MAX_DIST\t%f\n", dat[ndat-1]->value); + ksprintf(&clust->str,"MIN_INTER\t%f\n", min_inter_dist); + ksprintf(&clust->str,"MAX_INTRA\t%f\n", max_intra_dist); + return th; +} + +cluster_t *hclust_create_list(hclust_t *clust, float min_inter_dist, float *max_intra_dist, int *nclust) +{ + float cutoff = *max_intra_dist = hclust_set_threshold(clust, min_inter_dist, *max_intra_dist); + + node_t **stack = (node_t**) malloc(sizeof(node_t*)*clust->ndat); + node_t **tmp = (node_t**) malloc(sizeof(node_t*)*clust->ndat); + stack[0] = clust->first; + int nstack = 1; + + cluster_t *cluster = NULL; + int ncluster = 0; + + if ( stack[0]->value < cutoff ) + { + // all values are within the limits - create a single cluster + cluster = append_cluster(stack[0], cluster, &ncluster, tmp); + nstack = 0; + } + + while ( nstack ) + { + node_t *node = stack[--nstack]; + node_t *akid = node->akid; + node_t *bkid = node->bkid; + if ( !akid ) + { + cluster = append_cluster(node, cluster, &ncluster, tmp); + continue; + } + + if ( node->value >= cutoff && akid->value < cutoff ) + cluster = append_cluster(akid, cluster, &ncluster, tmp); + else + stack[nstack++] = akid; + + if ( node->value >= cutoff && bkid->value < cutoff ) + cluster = append_cluster(bkid, cluster, &ncluster, tmp); + else + stack[nstack++] = bkid; + } + + free(tmp); + free(stack); + + *nclust = ncluster; + return cluster; +} + +void hclust_destroy_list(cluster_t *clust, int nclust) +{ + int i; + for (i=0; i + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include "bcftools.h" +#include "hclust.h" + +typedef struct _node_t +{ + struct _node_t *akid, *bkid, *next, *prev, *parent; + int id, idx; // id: unique node id; idx: current index to pdist + float value; // max pairwise dist of elements within the node +} +node_t; + +struct _hclust_t +{ + int ndat, nclust; // ndat: number of elements (pdist matrix size); nclust: current number of clusters + float *pdist; // pairwise cluster distances, diagonal matrix accessed via the PDIST macro + node_t *first, *last; // clusters are maintained in a double-linked list + node_t **rmme; // convenience array to remove all allocated nodes at the end + int nrmme; + kstring_t str; // (for debugging) pointer to str.s is returned by create_dot() + char **dbg; // (for debugging) created by create_list() via set_threshold() and returned by explain() + int ndbg, mdbg; +}; + +node_t *append_node(hclust_t *clust, int idx) +{ + node_t *node = (node_t*) calloc(1,sizeof(node_t)); + + clust->nclust++; + node->id = clust->nrmme; + node->idx = idx; + if ( !clust->first ) + { + clust->first = node; + clust->last = node; + } + else + { + node->prev = clust->last; + clust->last->next = node; + clust->last = node; + } + + if ( clust->nrmme >= clust->ndat*2 ) error("hclust fixme: %d vs %d\n",clust->nrmme,clust->ndat); + clust->rmme[clust->nrmme++] = node; + + return node; +} +void remove_node(hclust_t *clust, node_t *node) +{ + if ( node==clust->first ) clust->first = node->next; + if ( node==clust->last ) clust->last = node->prev; + if ( node->next ) node->next->prev = node->prev; + if ( node->prev ) node->prev->next = node->next; + clust->nclust--; +} + +#if DEBUG +void hclust_debug(hclust_t *clust) +{ + int i; + fprintf(bcftools_stderr,"nrmme=%d nclust=%d\n", clust->nrmme,clust->nclust); + for (i=0; inrmme; i++) + { + node_t *node = clust->rmme[i]; + int akid = node->akid ? node->akid->id : -1; + int bkid = node->bkid ? node->bkid->id : -1; + int akidx = node->akid ? node->akid->idx : -1; + int bkidx = node->bkid ? node->bkid->idx : -1; + fprintf(bcftools_stderr,"\t%d\t%d\t%f\t%d %d\t%d %d\n",node->id,node->idx,node->value,akid,bkid,akidx,bkidx); + } + + int j; + for (i=1; indat; i++) + { + int active = 0; + node_t *node = clust->first; + while (node) + { + if ( node->idx==i ) { active=1; break; } + node = node->next; + } + fprintf(bcftools_stderr,"%2d%c ",i,active?'*':' '); + for (j=0; jpdist,i,j)==9 ) + fprintf(bcftools_stderr," ----- "); + else + fprintf(bcftools_stderr," %f", PDIST(clust->pdist,i,j)); + } + fprintf(bcftools_stderr,"\n"); + } + for (j=0; jndat-1; j++) fprintf(bcftools_stderr," %6d ",j); fprintf(bcftools_stderr,"\n"); +} +#endif + +hclust_t *hclust_init(int n, float *pdist) +{ + hclust_t *clust = (hclust_t*) calloc(1,sizeof(hclust_t)); + clust->ndat = n; + clust->pdist = pdist; + clust->rmme = (node_t**) calloc(n*2,sizeof(node_t*)); + + // init clusters + int i; + for (i=0; indat; i++) append_node(clust,i); + + // build the tree + while ( clust->nclust>1 ) + { + // find two clusters with minimum distance + float min_value = HUGE_VAL; + node_t *iclust = clust->first->next; + node_t *min_iclust = NULL, *min_jclust = NULL; + while ( iclust ) + { + node_t *jclust = clust->first; + while ( jclust!=iclust ) + { + float value = PDIST(clust->pdist,iclust->idx,jclust->idx); + if ( value < min_value ) + { + min_value = value; + min_iclust = iclust; + min_jclust = jclust; + } + jclust = jclust->next; + } + iclust = iclust->next; + } + assert( min_iclust && min_jclust ); // pdist contains inf or nan, fix the caller + remove_node(clust,min_iclust); + remove_node(clust,min_jclust); + + // update the pairwise distances. We keep the matrix and as we are moving up the + // tree, we use fewer columns/rows as the number of clusters decreases: we reuse + // i-th and leave j-th unused. Inter-cluster distance is defined as maximum distance + // between pairwise distances of elements within the cluster. + iclust = clust->first; + while ( iclust ) + { + if ( PDIST(clust->pdist,iclust->idx,min_iclust->idx) < PDIST(clust->pdist,iclust->idx,min_jclust->idx) ) + PDIST(clust->pdist,iclust->idx,min_iclust->idx) = PDIST(clust->pdist,iclust->idx,min_jclust->idx); + iclust = iclust->next; + } + + node_t *node = append_node(clust,min_iclust->idx); + node->akid = min_iclust; + node->bkid = min_jclust; + node->value = min_value; + node->akid->parent = node; + node->bkid->parent = node; + } + + return clust; +} +void hclust_destroy(hclust_t *clust) +{ + int i; + for (i=0; inrmme; i++) free(clust->rmme[i]); + free(clust->rmme); + free(clust->dbg); + free(clust->str.s); + free(clust); +} + +char *hclust_create_dot(hclust_t *clust, char **labels, float th) +{ + clust->str.l = 0; + ksprintf(&clust->str,"digraph myGraph {"); + + int i; + for (i=0; inrmme; i++) + { + node_t *node = clust->rmme[i]; + if ( node->value ) + ksprintf(&clust->str,"\"%d\" [label=\"%f\"];", node->id,node->value); + else + ksprintf(&clust->str,"\"%d\" [label=\"%s\"];", node->id,labels[node->idx]); + } + for (i=0; inrmme; i++) + { + node_t *node = clust->rmme[i]; + if ( node->akid ) + { + if ( node->value >= th && node->akid && node->akid->value < th ) + ksprintf(&clust->str,"\"%d\" -> \"%d\" [color=\"#D43F3A\" penwidth=3];", node->id,node->akid->id); + else + ksprintf(&clust->str,"\"%d\" -> \"%d\";", node->id,node->akid->id); + } + + if ( node->bkid ) + { + if ( node->value >= th && node->bkid && node->bkid->value < th ) + ksprintf(&clust->str,"\"%d\" -> \"%d\" [color=\"#D43F3A\" penwidth=3];", node->id,node->bkid->id); + else + ksprintf(&clust->str,"\"%d\" -> \"%d\";", node->id,node->bkid->id); + } + } + ksprintf(&clust->str,"};"); + return clust->str.s; +} +char **hclust_explain(hclust_t *clust, int *nlines) +{ + clust->ndbg = 0; + char *beg = clust->str.s; + while ( *beg ) + { + char *end = beg; + while ( *end && *end!='\n' ) end++; + clust->ndbg++; + hts_expand(char*,clust->ndbg,clust->mdbg,clust->dbg); + clust->dbg[clust->ndbg-1] = beg; + if ( !*end ) break; + *end = 0; + beg = end + 1; + } + + *nlines = clust->ndbg; + return clust->dbg; +} + +cluster_t *append_cluster(node_t *node, cluster_t *cluster, int *nclust, node_t **stack) +{ + (*nclust)++; + cluster = (cluster_t*) realloc(cluster,sizeof(cluster_t)*(*nclust)); + cluster_t *clust = &cluster[*nclust-1]; + clust->nmemb = 0; + clust->memb = NULL; + clust->dist = node->value; + + int nstack = 1; + stack[0] = node; + + while ( nstack ) + { + node_t *node = stack[--nstack]; + node_t *akid = node->akid; + node_t *bkid = node->bkid; + if ( node->akid ) + { + stack[nstack++] = akid; + stack[nstack++] = bkid; + } + else + { + clust->nmemb++; + clust->memb = (int*) realloc(clust->memb,sizeof(int)*clust->nmemb); + clust->memb[clust->nmemb-1] = node->id; + } + } + return cluster; +} + +int cmp_nodes(const void *a, const void *b) +{ + const node_t *an = *((const node_t**) a); + const node_t *bn = *((const node_t**) b); + if ( an->value < bn->value ) return -1; + if ( an->value > bn->value ) return 1; + return 0; +} + +float calc_dev(node_t **dat, int n) +{ + float avg = 0, dev = 0; + int i; + for (i=0; ivalue; + avg /= n; + for (i=0; ivalue - avg)*(dat[i]->value - avg); + return sqrt(dev/n); +} + +/* + Heuristics to determine clustering cutoff: sort nodes by distance and + split into two groups by minimizing the standard deviation. + This works best when two elements from a single different sample are + included in the mix. + - min_inter_dist .. smaller values are always considered identical + - max_intra_dist .. larger values are always considered different + */ +float hclust_set_threshold(hclust_t *clust, float min_inter_dist, float max_intra_dist) +{ + node_t **dat = clust->rmme + clust->ndat; + int i, ndat = clust->nrmme - clust->ndat; + + qsort(dat, ndat, sizeof(dat), cmp_nodes); + + clust->str.l = 0; + float th, min_dev = HUGE_VAL; + int imin = -1; + for (i=0; i0 ) dev += calc_dev(dat,i); + if ( i+1value; + ksprintf(&clust->str,"DEV\t%f\t%f\n",th,dev); + if ( min_dev > dev && th >= min_inter_dist ) { min_dev = dev; imin = i; } + } + if ( max_intra_dist > 0 ) + th = max_intra_dist; // use fixed cutoff, the above was only for debugging output + else + { + // dynamic cutoff + max_intra_dist = fabs(max_intra_dist); + th = imin==-1 ? max_intra_dist : dat[imin]->value; + if ( th > max_intra_dist ) th = max_intra_dist; + } + ksprintf(&clust->str,"TH\t%f\n", th); + ksprintf(&clust->str,"MAX_DIST\t%f\n", dat[ndat-1]->value); + ksprintf(&clust->str,"MIN_INTER\t%f\n", min_inter_dist); + ksprintf(&clust->str,"MAX_INTRA\t%f\n", max_intra_dist); + return th; +} + +cluster_t *hclust_create_list(hclust_t *clust, float min_inter_dist, float *max_intra_dist, int *nclust) +{ + float cutoff = *max_intra_dist = hclust_set_threshold(clust, min_inter_dist, *max_intra_dist); + + node_t **stack = (node_t**) malloc(sizeof(node_t*)*clust->ndat); + node_t **tmp = (node_t**) malloc(sizeof(node_t*)*clust->ndat); + stack[0] = clust->first; + int nstack = 1; + + cluster_t *cluster = NULL; + int ncluster = 0; + + if ( stack[0]->value < cutoff ) + { + // all values are within the limits - create a single cluster + cluster = append_cluster(stack[0], cluster, &ncluster, tmp); + nstack = 0; + } + + while ( nstack ) + { + node_t *node = stack[--nstack]; + node_t *akid = node->akid; + node_t *bkid = node->bkid; + if ( !akid ) + { + cluster = append_cluster(node, cluster, &ncluster, tmp); + continue; + } + + if ( node->value >= cutoff && akid->value < cutoff ) + cluster = append_cluster(akid, cluster, &ncluster, tmp); + else + stack[nstack++] = akid; + + if ( node->value >= cutoff && bkid->value < cutoff ) + cluster = append_cluster(bkid, cluster, &ncluster, tmp); + else + stack[nstack++] = bkid; + } + + free(tmp); + free(stack); + + *nclust = ncluster; + return cluster; +} + +void hclust_destroy_list(cluster_t *clust, int nclust) +{ + int i; + for (i=0; i + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +/* + Simple hierarchical clustering +*/ + +#ifndef __HCLUST_H__ +#define __HCLUST_H__ + +#include + +typedef struct _hclust_t hclust_t; + +typedef struct +{ + float dist; + int nmemb, *memb; +} +cluster_t; + +#define PDIST(mat,a,b) (mat)[((a)>(b)?((a)*((a)-1)/2+(b)):((b)*((b)-1)/2+(a)))] + +/* + * hclust_init() - init and run clustering + * @n: number of elements + * @pdist: pairwise distances. The array will be modified by hclust and + * must exist until hclust_destroy() is called + */ +hclust_t *hclust_init(int n, float *pdist); +void hclust_destroy(hclust_t *clust); + +/* + * hclust_create_list() - returns a list of clusters + * @min_inter_dist: minimum inter-cluster distance. If smaller, elements are considered + * homogenous, belonging to the same cluster. + * @max_intra_dist: maximum intra-cluster distance allowed. If smaller than 0, + * the threshold can be heuristically lowered, otherwise considered + * a fixed cutoff. The pointer will be filled to the cutoff actually used. + */ +cluster_t *hclust_create_list(hclust_t *clust, float min_inter_dist, float *max_intra_dist, int *nclust); +void hclust_destroy_list(cluster_t *clust, int nclust); + +/* + * Access debugging data used in the decision making process. Note that this + * must be called immediately after hclust_create_list because other calls, + * such as hclust_create_dot(), invalidate the temporary data structures. + */ +char **hclust_explain(hclust_t *clust, int *nlines); + +char *hclust_create_dot(hclust_t *clust, char **labels, float th); + +#endif + diff --git a/bcftools/hex.h b/bcftools/hex.h new file mode 100644 index 0000000..d915b28 --- /dev/null +++ b/bcftools/hex.h @@ -0,0 +1,95 @@ +// VariantKey +// +// hex.h +// +// @category Libraries +// @author Nicola Asuni +// @copyright 2017-2018 GENOMICS plc +// @license MIT (see LICENSE) +// @link https://github.com/genomicsplc/variantkey +// +// LICENSE +// +// Copyright (c) 2017-2018 GENOMICS plc +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/** + * @file hex.h + * @brief Utility functions to manipulate strings. + * + * Collection of utility functions to manipulate strings. + */ + +#ifndef ASTRING_H +#define ASTRING_H + +#include +#include + +/** @brief Returns uint64_t hexadecimal string (16 characters). + * + * @param n Number to parse + * @param str String buffer to be returned (it must be sized 17 bytes at least). + * + * @return Upon successful return, these function returns the number of characters processed + * (excluding the null byte used to end output to strings). + * If the buffer size is not sufficient, then the return value is the number of characters required for + * buffer string, including the terminating null byte. + */ +static inline size_t hex_uint64_t(uint64_t n, char *str) +{ + return sprintf(str, "%016" PRIx64, n); +} + +/** @brief Parses a 16 chars hexadecimal string and returns the code. + * + * @param s Hexadecimal string to parse (it must contain 16 hexadecimal characters). + * + * @return uint64_t unsigned integer number. + */ +static inline uint64_t parse_hex_uint64_t(const char *s) +{ + uint64_t v = 0; + uint8_t b; + size_t i; + for (i = 0; i < 16; i++) + { + b = s[i]; + if (b >= 'a') + { + b -= ('a' - 10); // a-f + } + else + { + if (b >= 'A') + { + b -= ('A' - 10); // A-F + } + else + { + b -= '0'; // 0-9 + } + } + v = ((v << 4) | b); + } + return v; +} + +#endif // ASTRING_H diff --git a/bcftools/khash_str2str.h b/bcftools/khash_str2str.h new file mode 100644 index 0000000..4a5bd12 --- /dev/null +++ b/bcftools/khash_str2str.h @@ -0,0 +1,106 @@ +/* khash_str2str.h -- C-string to C-string hash table. + + Copyright (C) 2014,2016 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef KHASH_STR2STR_H +#define KHASH_STR2STR_H + +#include + +KHASH_MAP_INIT_STR(str2str, const char*) + +/* + * Wrappers for khash dictionaries used by mpileup. + */ + +static inline void *khash_str2str_init(void) +{ + return kh_init(str2str); +} + +/* + * Destroy the hash structure, but not the keys + */ +static inline void khash_str2str_destroy(void *_hash) +{ + khash_t(str2str) *hash = (khash_t(str2str)*)_hash; + if (hash) kh_destroy(str2str, hash); // Note that strings are not freed. +} + +/* + * Destroys both the hash structure and the keys + */ +static inline void khash_str2str_destroy_free(void *_hash) +{ + khash_t(str2str) *hash = (khash_t(str2str)*)_hash; + khint_t k; + if (hash == 0) return; + for (k = 0; k < kh_end(hash); ++k) + if (kh_exist(hash, k)) free((char*)kh_key(hash, k)); + kh_destroy(str2str, hash); +} + +/* + * Destroys the hash structure, the keys and the values + */ +static inline void khash_str2str_destroy_free_all(void *_hash) +{ + khash_t(str2str) *hash = (khash_t(str2str)*)_hash; + khint_t k; + if (hash == 0) return; + for (k = 0; k < kh_end(hash); ++k) + if (kh_exist(hash, k)) + { + free((char*)kh_key(hash, k)); + free((char*)kh_val(hash, k)); + } + kh_destroy(str2str, hash); +} + +/* + * Returns value if key exists or NULL if not + */ +static inline char *khash_str2str_get(void *_hash, const char *str) +{ + khash_t(str2str) *hash = (khash_t(str2str)*)_hash; + khint_t k = kh_get(str2str, hash, str); + if ( k == kh_end(hash) ) return NULL; + return (char*)kh_val(hash, k); +} + +/* + * Set a new key,value pair. On success returns the bin index, on + * error -1 is returned. + */ +static inline int khash_str2str_set(void *_hash, const char *str, const char *value) +{ + khint_t k; + int ret; + khash_t(str2str) *hash = (khash_t(str2str)*)_hash; + if ( !hash ) return -1; + k = kh_put(str2str, hash, str, &ret); + kh_val(hash,k) = value; + return k; +} + +#endif diff --git a/bcftools/kheap.h b/bcftools/kheap.h new file mode 100644 index 0000000..cb5dda4 --- /dev/null +++ b/bcftools/kheap.h @@ -0,0 +1,174 @@ +/* The MIT License + + Copyright (C) 2016 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ +/* + Usage example: + + #include "kheap.h" + + // First we prepare the user data to store, in this example it is a + // struct with a single element "key", and a comparator function + // "is_smaller". In this example the comparator defines a min heap (as + // opposed to a max heap). + typedef struct + { + uint32_t key; + } + data_t; + static inline int is_smaller(data_t *a, data_t *b) + { + return a->key < b->key ? 1 : 0; + } + data_t data[3] = { {3}, {2}, {1} }; + + + // Heap declaration, "mh" is an arbitrary string. The typedef is not + // required, it is just a convenience shortcut so that we can use + // "heap_t" instead of the generic "khp_mh_t" automatically created by + // the KHEAP_INIT macro. + KHEAP_INIT(mh, data_t, is_smaller) + typedef khp_mh_t heap_t; + + // Initialize the heap, insert the test data, then retrieve them back, + // sorted. Multiple heaps with the same name "mh" can be created and + // used simultaneously, as long as they all use the same data type + // "data_t". + heap_t *heap = khp_init(mh); + + // When inserting a new element, the heap stores a copy of the memory + // area pointed to by the third argument. + for (int i=0; i<3; i++) + khp_insert(mh, heap, &data[i]); + + while (heap->ndat) + { + printf("%d\n", heap->dat[0].pos); + khp_delete(mh, heap); + } + + // Clean up + khp_destroy(mh, heap); + +*/ + +#ifndef __KHEAP_H__ +#define __KHEAP_H__ + +#include + +#ifndef kroundup32 +#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) +#endif + +#ifndef kh_inline +#ifdef _MSC_VER +#define kh_inline __inline +#else +#define kh_inline inline +#endif +#endif /* kh_inline */ + +#ifndef klib_unused +#if (defined __clang__ && __clang_major__ >= 3) || (defined __GNUC__ && __GNUC__ >= 3) +#define klib_unused __attribute__ ((__unused__)) +#else +#define klib_unused +#endif +#endif /* klib_unused */ + + +#define __KHEAP_TYPE(name, kheap_t) \ + typedef struct { \ + int ndat, mdat; \ + kheap_t *dat; \ + kheap_t tmp; \ + } khp_##name##_t; + +#define khp_parent(i) (((i)-1)/2) +#define khp_lchild(i) (2*(i)+1) +#define khp_rchild(i) (2*(i)+2) +#define khp_swap(hp,i,j) { \ + ((hp)->tmp) = ((hp)->dat[i]); \ + ((hp)->dat[i]) = ((hp)->dat[j]); \ + ((hp)->dat[j]) = ((hp)->tmp); \ + } + +#define __KHEAP_IMPL(name, SCOPE, kheap_t, __cmp) \ + SCOPE khp_##name##_t *khp_init_##name(void) \ + { \ + return (khp_##name##_t*)calloc(1, sizeof(khp_##name##_t)); \ + } \ + SCOPE void khp_destroy_##name(khp_##name##_t *heap) \ + { \ + if (heap) free(heap->dat); \ + free(heap); \ + } \ + SCOPE int khp_insert_##name(khp_##name##_t *heap, kheap_t *dat) \ + { \ + heap->ndat++; \ + if ( heap->ndat > heap->mdat ) \ + { \ + heap->mdat = heap->ndat; \ + kroundup32(heap->mdat); \ + heap->dat = (kheap_t*)realloc(heap->dat, heap->mdat*sizeof(kheap_t)); \ + memset(heap->dat + heap->ndat, 0, (heap->mdat - heap->ndat)*sizeof(kheap_t)); \ + } \ + int i = heap->ndat - 1; \ + while ( i && __cmp(dat,&heap->dat[khp_parent(i)]) ) \ + { \ + heap->dat[i] = heap->dat[khp_parent(i)]; \ + i = khp_parent(i); \ + } \ + heap->dat[i] = *dat; \ + return i; \ + } \ + SCOPE void khp_heapify_##name(khp_##name##_t *heap, int i) \ + { \ +/*todo: loop instead of a recursive function? */ \ + int extreme = khp_lchild(i) < heap->ndat && __cmp(&heap->dat[khp_lchild(i)],&heap->dat[i]) ? khp_lchild(i) : i; \ + if ( khp_rchild(i) < heap->ndat && __cmp(&heap->dat[khp_rchild(i)],&heap->dat[extreme]) ) extreme = khp_rchild(i); \ + if ( extreme != i ) \ + { \ + khp_swap(heap,i,extreme); \ + khp_heapify_##name(heap,extreme); \ + } \ + } \ + SCOPE void khp_delete_##name(khp_##name##_t *heap) \ + { \ + if ( !heap || !heap->ndat ) return; \ + heap->dat[0] = heap->dat[--heap->ndat]; \ + khp_heapify_##name(heap, 0); \ + } \ + +#define KHEAP_INIT(name, kheap_t, __cmp) \ + __KHEAP_TYPE(name, kheap_t) \ + __KHEAP_IMPL(name, static kh_inline klib_unused, kheap_t, __cmp) + +#define khp_init(name) khp_init_##name() +#define khp_destroy(name, heap) khp_destroy_##name(heap) +#define khp_insert(name, heap, dat) khp_insert_##name(heap, dat) +#define khp_delete(name, heap) khp_delete_##name(heap) + +#endif diff --git a/bcftools/kmin.c b/bcftools/kmin.c new file mode 100644 index 0000000..5b8193b --- /dev/null +++ b/bcftools/kmin.c @@ -0,0 +1,209 @@ +/* The MIT License + + Copyright (c) 2008, 2010 by Attractive Chaos + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* Hooke-Jeeves algorithm for nonlinear minimization + + Based on the pseudocodes by Bell and Pike (CACM 9(9):684-685), and + the revision by Tomlin and Smith (CACM 12(11):637-638). Both of the + papers are comments on Kaupe's Algorithm 178 "Direct Search" (ACM + 6(6):313-314). The original algorithm was designed by Hooke and + Jeeves (ACM 8:212-229). This program is further revised according to + Johnson's implementation at Netlib (opt/hooke.c). + + Hooke-Jeeves algorithm is very simple and it works quite well on a + few examples. However, it might fail to converge due to its heuristic + nature. A possible improvement, as is suggested by Johnson, may be to + choose a small r at the beginning to quickly approach to the minimum + and a large r at later step to hit the minimum. + */ + +#include +#include +#include +#include "kmin.h" + +static double __kmin_hj_aux(kmin_f func, int n, double *x1, void *data, double fx1, double *dx, int *n_calls) +{ + int k, j = *n_calls; + double ftmp; + for (k = 0; k != n; ++k) { + x1[k] += dx[k]; + ftmp = func(n, x1, data); ++j; + if (ftmp < fx1) fx1 = ftmp; + else { /* search the opposite direction */ + dx[k] = 0.0 - dx[k]; + x1[k] += dx[k] + dx[k]; + ftmp = func(n, x1, data); ++j; + if (ftmp < fx1) fx1 = ftmp; + else x1[k] -= dx[k]; /* back to the original x[k] */ + } + } + *n_calls = j; + return fx1; /* here: fx1=f(n,x1) */ +} + +double kmin_hj(kmin_f func, int n, double *x, void *data, double r, double eps, int max_calls) +{ + double fx, fx1, *x1, *dx, radius; + int k, n_calls = 0; + x1 = (double*)calloc(n, sizeof(double)); + dx = (double*)calloc(n, sizeof(double)); + for (k = 0; k != n; ++k) { /* initial directions, based on MGJ */ + dx[k] = fabs(x[k]) * r; + if (dx[k] == 0) dx[k] = r; + } + radius = r; + fx1 = fx = func(n, x, data); ++n_calls; + for (;;) { + memcpy(x1, x, n * sizeof(double)); /* x1 = x */ + fx1 = __kmin_hj_aux(func, n, x1, data, fx, dx, &n_calls); + while (fx1 < fx) { + for (k = 0; k != n; ++k) { + double t = x[k]; + dx[k] = x1[k] > x[k]? fabs(dx[k]) : 0.0 - fabs(dx[k]); + x[k] = x1[k]; + x1[k] = x1[k] + x1[k] - t; + } + fx = fx1; + if (n_calls >= max_calls) break; + fx1 = func(n, x1, data); ++n_calls; + fx1 = __kmin_hj_aux(func, n, x1, data, fx1, dx, &n_calls); + if (fx1 >= fx) break; + for (k = 0; k != n; ++k) + if (fabs(x1[k] - x[k]) > .5 * fabs(dx[k])) break; + if (k == n) break; + } + if (radius >= eps) { + if (n_calls >= max_calls) break; + radius *= r; + for (k = 0; k != n; ++k) dx[k] *= r; + } else break; /* converge */ + } + free(x1); free(dx); + return fx1; +} + +// I copied this function somewhere several years ago with some of my modifications, but I forgot the source. +double kmin_brent(kmin1_f func, double a, double b, void *data, double tol, double *xmin) +{ + double bound, u, r, q, fu, tmp, fa, fb, fc, c; + const double gold1 = 1.6180339887; + const double gold2 = 0.3819660113; + const double tiny = 1e-20; + const int max_iter = 100; + + double e, d, w, v, mid, tol1, tol2, p, eold, fv, fw; + int iter; + + fa = func(a, data); fb = func(b, data); + if (fb > fa) { // swap, such that f(a) > f(b) + tmp = a; a = b; b = tmp; + tmp = fa; fa = fb; fb = tmp; + } + c = b + gold1 * (b - a), fc = func(c, data); // golden section extrapolation + while (fb > fc) { + bound = b + 100.0 * (c - b); // the farthest point where we want to go + r = (b - a) * (fb - fc); + q = (b - c) * (fb - fa); + if (fabs(q - r) < tiny) { // avoid 0 denominator + tmp = q > r? tiny : 0.0 - tiny; + } else tmp = q - r; + u = b - ((b - c) * q - (b - a) * r) / (2.0 * tmp); // u is the parabolic extrapolation point + if ((b > u && u > c) || (b < u && u < c)) { // u lies between b and c + fu = func(u, data); + if (fu < fc) { // (b,u,c) bracket the minimum + a = b; b = u; fa = fb; fb = fu; + break; + } else if (fu > fb) { // (a,b,u) bracket the minimum + c = u; fc = fu; + break; + } + u = c + gold1 * (c - b); fu = func(u, data); // golden section extrapolation + } else if ((c > u && u > bound) || (c < u && u < bound)) { // u lies between c and bound + fu = func(u, data); + if (fu < fc) { // fb > fc > fu + b = c; c = u; u = c + gold1 * (c - b); + fb = fc; fc = fu; fu = func(u, data); + } else { // (b,c,u) bracket the minimum + a = b; b = c; c = u; + fa = fb; fb = fc; fc = fu; + break; + } + } else if ((u > bound && bound > c) || (u < bound && bound < c)) { // u goes beyond the bound + u = bound; fu = func(u, data); + } else { // u goes the other way around, use golden section extrapolation + u = c + gold1 * (c - b); fu = func(u, data); + } + a = b; b = c; c = u; + fa = fb; fb = fc; fc = fu; + } + if (a > c) u = a, a = c, c = u; // swap + + // now, afb and fb tol1) { + // related to parabolic interpolation + r = (b - w) * (fb - fv); + q = (b - v) * (fb - fw); + p = (b - v) * q - (b - w) * r; + q = 2.0 * (q - r); + if (q > 0.0) p = 0.0 - p; + else q = 0.0 - q; + eold = e; e = d; + if (fabs(p) >= fabs(0.5 * q * eold) || p <= q * (a - b) || p >= q * (c - b)) { + d = gold2 * (e = (b >= mid ? a - b : c - b)); + } else { + d = p / q; u = b + d; // actual parabolic interpolation happens here + if (u - a < tol2 || c - u < tol2) + d = (mid > b)? tol1 : 0.0 - tol1; + } + } else d = gold2 * (e = (b >= mid ? a - b : c - b)); // golden section interpolation + u = fabs(d) >= tol1 ? b + d : b + (d > 0.0? tol1 : -tol1); + fu = func(u, data); + if (fu <= fb) { // u is the minimum point so far + if (u >= b) a = b; + else c = b; + v = w; w = b; b = u; fv = fw; fw = fb; fb = fu; + } else { // adjust (a,c) and (u,v,w) + if (u < b) a = u; + else c = u; + if (fu <= fw || w == b) { + v = w; w = u; + fv = fw; fw = fu; + } else if (fu <= fv || v == b || v == w) { + v = u; fv = fu; + } + } + } + *xmin = b; + return fb; +} diff --git a/bcftools/kmin.c.pysam.c b/bcftools/kmin.c.pysam.c new file mode 100644 index 0000000..f0ccb98 --- /dev/null +++ b/bcftools/kmin.c.pysam.c @@ -0,0 +1,211 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2008, 2010 by Attractive Chaos + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* Hooke-Jeeves algorithm for nonlinear minimization + + Based on the pseudocodes by Bell and Pike (CACM 9(9):684-685), and + the revision by Tomlin and Smith (CACM 12(11):637-638). Both of the + papers are comments on Kaupe's Algorithm 178 "Direct Search" (ACM + 6(6):313-314). The original algorithm was designed by Hooke and + Jeeves (ACM 8:212-229). This program is further revised according to + Johnson's implementation at Netlib (opt/hooke.c). + + Hooke-Jeeves algorithm is very simple and it works quite well on a + few examples. However, it might fail to converge due to its heuristic + nature. A possible improvement, as is suggested by Johnson, may be to + choose a small r at the beginning to quickly approach to the minimum + and a large r at later step to hit the minimum. + */ + +#include +#include +#include +#include "kmin.h" + +static double __kmin_hj_aux(kmin_f func, int n, double *x1, void *data, double fx1, double *dx, int *n_calls) +{ + int k, j = *n_calls; + double ftmp; + for (k = 0; k != n; ++k) { + x1[k] += dx[k]; + ftmp = func(n, x1, data); ++j; + if (ftmp < fx1) fx1 = ftmp; + else { /* search the opposite direction */ + dx[k] = 0.0 - dx[k]; + x1[k] += dx[k] + dx[k]; + ftmp = func(n, x1, data); ++j; + if (ftmp < fx1) fx1 = ftmp; + else x1[k] -= dx[k]; /* back to the original x[k] */ + } + } + *n_calls = j; + return fx1; /* here: fx1=f(n,x1) */ +} + +double kmin_hj(kmin_f func, int n, double *x, void *data, double r, double eps, int max_calls) +{ + double fx, fx1, *x1, *dx, radius; + int k, n_calls = 0; + x1 = (double*)calloc(n, sizeof(double)); + dx = (double*)calloc(n, sizeof(double)); + for (k = 0; k != n; ++k) { /* initial directions, based on MGJ */ + dx[k] = fabs(x[k]) * r; + if (dx[k] == 0) dx[k] = r; + } + radius = r; + fx1 = fx = func(n, x, data); ++n_calls; + for (;;) { + memcpy(x1, x, n * sizeof(double)); /* x1 = x */ + fx1 = __kmin_hj_aux(func, n, x1, data, fx, dx, &n_calls); + while (fx1 < fx) { + for (k = 0; k != n; ++k) { + double t = x[k]; + dx[k] = x1[k] > x[k]? fabs(dx[k]) : 0.0 - fabs(dx[k]); + x[k] = x1[k]; + x1[k] = x1[k] + x1[k] - t; + } + fx = fx1; + if (n_calls >= max_calls) break; + fx1 = func(n, x1, data); ++n_calls; + fx1 = __kmin_hj_aux(func, n, x1, data, fx1, dx, &n_calls); + if (fx1 >= fx) break; + for (k = 0; k != n; ++k) + if (fabs(x1[k] - x[k]) > .5 * fabs(dx[k])) break; + if (k == n) break; + } + if (radius >= eps) { + if (n_calls >= max_calls) break; + radius *= r; + for (k = 0; k != n; ++k) dx[k] *= r; + } else break; /* converge */ + } + free(x1); free(dx); + return fx1; +} + +// I copied this function somewhere several years ago with some of my modifications, but I forgot the source. +double kmin_brent(kmin1_f func, double a, double b, void *data, double tol, double *xmin) +{ + double bound, u, r, q, fu, tmp, fa, fb, fc, c; + const double gold1 = 1.6180339887; + const double gold2 = 0.3819660113; + const double tiny = 1e-20; + const int max_iter = 100; + + double e, d, w, v, mid, tol1, tol2, p, eold, fv, fw; + int iter; + + fa = func(a, data); fb = func(b, data); + if (fb > fa) { // swap, such that f(a) > f(b) + tmp = a; a = b; b = tmp; + tmp = fa; fa = fb; fb = tmp; + } + c = b + gold1 * (b - a), fc = func(c, data); // golden section extrapolation + while (fb > fc) { + bound = b + 100.0 * (c - b); // the farthest point where we want to go + r = (b - a) * (fb - fc); + q = (b - c) * (fb - fa); + if (fabs(q - r) < tiny) { // avoid 0 denominator + tmp = q > r? tiny : 0.0 - tiny; + } else tmp = q - r; + u = b - ((b - c) * q - (b - a) * r) / (2.0 * tmp); // u is the parabolic extrapolation point + if ((b > u && u > c) || (b < u && u < c)) { // u lies between b and c + fu = func(u, data); + if (fu < fc) { // (b,u,c) bracket the minimum + a = b; b = u; fa = fb; fb = fu; + break; + } else if (fu > fb) { // (a,b,u) bracket the minimum + c = u; fc = fu; + break; + } + u = c + gold1 * (c - b); fu = func(u, data); // golden section extrapolation + } else if ((c > u && u > bound) || (c < u && u < bound)) { // u lies between c and bound + fu = func(u, data); + if (fu < fc) { // fb > fc > fu + b = c; c = u; u = c + gold1 * (c - b); + fb = fc; fc = fu; fu = func(u, data); + } else { // (b,c,u) bracket the minimum + a = b; b = c; c = u; + fa = fb; fb = fc; fc = fu; + break; + } + } else if ((u > bound && bound > c) || (u < bound && bound < c)) { // u goes beyond the bound + u = bound; fu = func(u, data); + } else { // u goes the other way around, use golden section extrapolation + u = c + gold1 * (c - b); fu = func(u, data); + } + a = b; b = c; c = u; + fa = fb; fb = fc; fc = fu; + } + if (a > c) u = a, a = c, c = u; // swap + + // now, afb and fb tol1) { + // related to parabolic interpolation + r = (b - w) * (fb - fv); + q = (b - v) * (fb - fw); + p = (b - v) * q - (b - w) * r; + q = 2.0 * (q - r); + if (q > 0.0) p = 0.0 - p; + else q = 0.0 - q; + eold = e; e = d; + if (fabs(p) >= fabs(0.5 * q * eold) || p <= q * (a - b) || p >= q * (c - b)) { + d = gold2 * (e = (b >= mid ? a - b : c - b)); + } else { + d = p / q; u = b + d; // actual parabolic interpolation happens here + if (u - a < tol2 || c - u < tol2) + d = (mid > b)? tol1 : 0.0 - tol1; + } + } else d = gold2 * (e = (b >= mid ? a - b : c - b)); // golden section interpolation + u = fabs(d) >= tol1 ? b + d : b + (d > 0.0? tol1 : -tol1); + fu = func(u, data); + if (fu <= fb) { // u is the minimum point so far + if (u >= b) a = b; + else c = b; + v = w; w = b; b = u; fv = fw; fw = fb; fb = fu; + } else { // adjust (a,c) and (u,v,w) + if (u < b) a = u; + else c = u; + if (fu <= fw || w == b) { + v = w; w = u; + fv = fw; fw = fu; + } else if (fu <= fv || v == b || v == w) { + v = u; fv = fu; + } + } + } + *xmin = b; + return fb; +} diff --git a/bcftools/kmin.h b/bcftools/kmin.h new file mode 100644 index 0000000..6feba45 --- /dev/null +++ b/bcftools/kmin.h @@ -0,0 +1,46 @@ +/* + Copyright (c) 2008, 2010 by Attractive Chaos + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef KMIN_H +#define KMIN_H + +#define KMIN_RADIUS 0.5 +#define KMIN_EPS 1e-7 +#define KMIN_MAXCALL 50000 + +typedef double (*kmin_f)(int, double*, void*); +typedef double (*kmin1_f)(double, void*); + +#ifdef __cplusplus +extern "C" { +#endif + + double kmin_hj(kmin_f func, int n, double *x, void *data, double r, double eps, int max_calls); + double kmin_brent(kmin1_f func, double a, double b, void *data, double tol, double *xmin); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bcftools/main.c b/bcftools/main.c new file mode 100644 index 0000000..3a0d557 --- /dev/null +++ b/bcftools/main.c @@ -0,0 +1,310 @@ +/* main.c -- main bcftools command front-end. + + Copyright (C) 2012-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include "version.h" +#include "bcftools.h" + +int main_tabix(int argc, char *argv[]); +int main_vcfindex(int argc, char *argv[]); +int main_vcfstats(int argc, char *argv[]); +int main_vcfisec(int argc, char *argv[]); +int main_vcfmerge(int argc, char *argv[]); +int main_vcfquery(int argc, char *argv[]); +int main_vcffilter(int argc, char *argv[]); +int main_vcfsom(int argc, char *argv[]); +int main_vcfnorm(int argc, char *argv[]); +int main_vcfgtcheck(int argc, char *argv[]); +int main_vcfview(int argc, char *argv[]); +int main_vcfhead(int argc, char *argv[]); +int main_vcfcall(int argc, char *argv[]); +int main_vcfannotate(int argc, char *argv[]); +int main_vcfroh(int argc, char *argv[]); +int main_vcfconcat(int argc, char *argv[]); +int main_reheader(int argc, char *argv[]); +int main_vcfconvert(int argc, char *argv[]); +int main_vcfcnv(int argc, char *argv[]); +#if USE_GPL +int main_polysomy(int argc, char *argv[]); +#endif +#ifdef ENABLE_BCF_PLUGINS +int main_plugin(int argc, char *argv[]); +int count_plugins(void); +#endif +int main_consensus(int argc, char *argv[]); +int main_csq(int argc, char *argv[]); +int main_mpileup(int argc, char *argv[]); +int main_sort(int argc, char *argv[]); + +typedef struct +{ + int (*func)(int, char*[]); + const char *alias, *help; +} +cmd_t; + +static cmd_t cmds[] = +{ + { .func = NULL, + .alias = "Indexing", + .help = NULL + }, + { .func = main_vcfindex, + .alias = "index", + .help = "index VCF/BCF files" + }, + { .func = main_tabix, + .alias = "tabix", + .help = "-tabix for BGZF'd BED, GFF, SAM, VCF and more" // do not advertise; only keep here for testing + }, + + { .func = NULL, + .alias = "VCF/BCF manipulation", + .help = NULL + }, + + { .func = main_vcfannotate, + .alias = "annotate", + .help = "annotate and edit VCF/BCF files", + }, + { .func = main_vcfconcat, + .alias = "concat", + .help = "concatenate VCF/BCF files from the same set of samples" + }, + { .func = main_vcfconvert, + .alias = "convert", + .help = "convert VCF/BCF files to different formats and back" + }, + { .func = main_vcfhead, + .alias = "head", + .help = "view VCF/BCF file headers" + }, + { .func = main_vcfisec, + .alias = "isec", + .help = "intersections of VCF/BCF files" + }, + { .func = main_vcfmerge, + .alias = "merge", + .help = "merge VCF/BCF files files from non-overlapping sample sets" + }, + { .func = main_vcfnorm, + .alias = "norm", + .help = "left-align and normalize indels" + }, +#ifdef ENABLE_BCF_PLUGINS + { .func = main_plugin, + .alias = "plugin", + .help = "user-defined plugins" + }, +#endif + { .func = main_vcfquery, + .alias = "query", + .help = "transform VCF/BCF into user-defined formats" + }, + { .func = main_reheader, + .alias = "reheader", + .help = "modify VCF/BCF header, change sample names" + }, + { .func = main_sort, + .alias = "sort", + .help = "sort VCF/BCF file" + }, + { .func = main_vcfview, + .alias = "view", + .help = "VCF/BCF conversion, view, subset and filter VCF/BCF files" + }, + + { .func = NULL, + .alias = "VCF/BCF analysis", + .help = NULL + }, + + { .func = main_vcfcall, + .alias = "call", + .help = "SNP/indel calling" + }, + { .func = main_consensus, + .alias = "consensus", + .help = "create consensus sequence by applying VCF variants" + }, + { .func = main_vcfcnv, + .alias = "cnv", + .help = "HMM CNV calling" + }, + { .func = main_csq, + .alias = "csq", + .help = "call variation consequences" + }, + { .func = main_vcffilter, + .alias = "filter", + .help = "filter VCF/BCF files using fixed thresholds" + }, + { .func = main_vcfgtcheck, + .alias = "gtcheck", + .help = "check sample concordance, detect sample swaps and contamination" + }, + { .func = main_mpileup, + .alias = "mpileup", + .help = "multi-way pileup producing genotype likelihoods" + }, +#if USE_GPL + { .func = main_polysomy, + .alias = "polysomy", + .help = "detect number of chromosomal copies", + }, +#endif + { .func = main_vcfroh, + .alias = "roh", + .help = "identify runs of autozygosity (HMM)", + }, + { .func = main_vcfstats, + .alias = "stats", + .help = "produce VCF/BCF stats" + }, + + { .func = main_vcfsom, + .alias = "som", + .help = "-filter using Self-Organized Maps (experimental)" // do not advertise + + }, + { .func = NULL, + .alias = NULL, + .help = NULL + } +}; + +char *bcftools_version(void) +{ + return BCFTOOLS_VERSION; +} + +static void usage(FILE *fp) +{ + fprintf(fp, "\n"); + fprintf(fp, "Program: bcftools (Tools for variant calling and manipulating VCFs and BCFs)\n"); +#if USE_GPL + fprintf(fp, "License: GNU GPLv3+, due to use of the GNU Scientific Library\n"); +#endif + fprintf(fp, "Version: %s (using htslib %s)\n", bcftools_version(), hts_version()); + fprintf(fp, "\n"); + fprintf(fp, "Usage: bcftools [--version|--version-only] [--help] \n"); + fprintf(fp, "\n"); + fprintf(fp, "Commands:\n"); + + int i = 0; + const char *sep = NULL; + while (cmds[i].alias) + { + if ( !cmds[i].func ) sep = cmds[i].alias; + if ( sep ) + { + fprintf(fp, "\n -- %s\n", sep); + sep = NULL; + } + if ( cmds[i].func && cmds[i].help[0]!='-' ) fprintf(fp, " %-12s %s\n", cmds[i].alias, cmds[i].help); + i++; + } +#if ENABLE_BCF_PLUGINS + fprintf(fp,"\n -- Plugins (collection of programs for calling, file manipulation & analysis)\n"); + int nplugins = count_plugins(); + if ( nplugins ) + fprintf(fp," %d plugins available, run \"bcftools plugin -lv\" to see a complete list\n", nplugins); + else + fprintf(fp," 0 plugins available, run \"bcftools plugin -l\" for help\n"); +#endif + fprintf(fp,"\n"); + fprintf(fp, + " Most commands accept VCF, bgzipped VCF, and BCF with the file type detected\n" + " automatically even when streaming from a pipe. Indexed VCF and BCF will work\n" + " in all situations. Un-indexed VCF and BCF and streams will work in most but\n" + " not all situations.\n"); + fprintf(fp,"\n"); +} + +// This is a tricky one, but on Windows the filename wildcard expansion is done by +// the application and not by the shell, as traditionally it never had a "shell". +// Even now, DOS and Powershell do not do this expansion (but bash does). +// +// This means that Mingw/Msys implements code before main() that takes e.g. "*" and +// expands it up to a list of matching filenames. This in turn breaks things like +// specifying "*" as a region (all the unmapped reads). We take a hard line here - +// filename expansion is the task of the shell, not our application! +#ifdef _WIN32 +int _CRT_glob = 0; +#endif + +int main(int argc, char *argv[]) +{ + if (argc < 2) { usage(stderr); return 1; } + + if (strcmp(argv[1], "version") == 0 || strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-v") == 0) { + printf("bcftools %s\nUsing htslib %s\nCopyright (C) 2022 Genome Research Ltd.\n", bcftools_version(), hts_version()); +#if USE_GPL + printf("License GPLv3+: GNU GPL version 3 or later \n"); +#else + printf("License Expat: The MIT/Expat license\n"); +#endif + printf("This is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n"); + return 0; + } + else if (strcmp(argv[1], "--version-only") == 0) { + printf("%s+htslib-%s\n", bcftools_version(), hts_version()); + return 0; + } + else if (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) { + if (argc == 2) { usage(stdout); return 0; } + // Otherwise change "bcftools help COMMAND [...]" to "bcftools COMMAND"; + // main_xyz() functions by convention display the subcommand's usage + // when invoked without any arguments. + argv++; + argc = 2; + } + else if ( argv[1][0]=='+' ) + { + // "bcftools plugin name" can be run as "bcftools +name" + argv[1]++; + argv[0] = "plugin"; + argv--; + argc++; + } + + int i = 0; + while (cmds[i].alias) + { + if (cmds[i].func && strcmp(argv[1],cmds[i].alias)==0) + { + return cmds[i].func(argc-1,argv+1); + } + i++; + } + fprintf(stderr, "[E::%s] unrecognized command '%s'\n", __func__, argv[1]); + return 1; +} + diff --git a/bcftools/main.c.pysam.c b/bcftools/main.c.pysam.c new file mode 100644 index 0000000..535813c --- /dev/null +++ b/bcftools/main.c.pysam.c @@ -0,0 +1,312 @@ +#include "bcftools.pysam.h" + +/* main.c -- main bcftools command front-end. + + Copyright (C) 2012-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include "version.h" +#include "bcftools.h" + +int main_tabix(int argc, char *argv[]); +int main_vcfindex(int argc, char *argv[]); +int main_vcfstats(int argc, char *argv[]); +int main_vcfisec(int argc, char *argv[]); +int main_vcfmerge(int argc, char *argv[]); +int main_vcfquery(int argc, char *argv[]); +int main_vcffilter(int argc, char *argv[]); +int main_vcfsom(int argc, char *argv[]); +int main_vcfnorm(int argc, char *argv[]); +int main_vcfgtcheck(int argc, char *argv[]); +int main_vcfview(int argc, char *argv[]); +int main_vcfhead(int argc, char *argv[]); +int main_vcfcall(int argc, char *argv[]); +int main_vcfannotate(int argc, char *argv[]); +int main_vcfroh(int argc, char *argv[]); +int main_vcfconcat(int argc, char *argv[]); +int main_reheader(int argc, char *argv[]); +int main_vcfconvert(int argc, char *argv[]); +int main_vcfcnv(int argc, char *argv[]); +#if USE_GPL +int main_polysomy(int argc, char *argv[]); +#endif +#ifdef ENABLE_BCF_PLUGINS +int main_plugin(int argc, char *argv[]); +int count_plugins(void); +#endif +int main_consensus(int argc, char *argv[]); +int main_csq(int argc, char *argv[]); +int main_mpileup(int argc, char *argv[]); +int main_sort(int argc, char *argv[]); + +typedef struct +{ + int (*func)(int, char*[]); + const char *alias, *help; +} +cmd_t; + +static cmd_t cmds[] = +{ + { .func = NULL, + .alias = "Indexing", + .help = NULL + }, + { .func = main_vcfindex, + .alias = "index", + .help = "index VCF/BCF files" + }, + { .func = main_tabix, + .alias = "tabix", + .help = "-tabix for BGZF'd BED, GFF, SAM, VCF and more" // do not advertise; only keep here for testing + }, + + { .func = NULL, + .alias = "VCF/BCF manipulation", + .help = NULL + }, + + { .func = main_vcfannotate, + .alias = "annotate", + .help = "annotate and edit VCF/BCF files", + }, + { .func = main_vcfconcat, + .alias = "concat", + .help = "concatenate VCF/BCF files from the same set of samples" + }, + { .func = main_vcfconvert, + .alias = "convert", + .help = "convert VCF/BCF files to different formats and back" + }, + { .func = main_vcfhead, + .alias = "head", + .help = "view VCF/BCF file headers" + }, + { .func = main_vcfisec, + .alias = "isec", + .help = "intersections of VCF/BCF files" + }, + { .func = main_vcfmerge, + .alias = "merge", + .help = "merge VCF/BCF files files from non-overlapping sample sets" + }, + { .func = main_vcfnorm, + .alias = "norm", + .help = "left-align and normalize indels" + }, +#ifdef ENABLE_BCF_PLUGINS + { .func = main_plugin, + .alias = "plugin", + .help = "user-defined plugins" + }, +#endif + { .func = main_vcfquery, + .alias = "query", + .help = "transform VCF/BCF into user-defined formats" + }, + { .func = main_reheader, + .alias = "reheader", + .help = "modify VCF/BCF header, change sample names" + }, + { .func = main_sort, + .alias = "sort", + .help = "sort VCF/BCF file" + }, + { .func = main_vcfview, + .alias = "view", + .help = "VCF/BCF conversion, view, subset and filter VCF/BCF files" + }, + + { .func = NULL, + .alias = "VCF/BCF analysis", + .help = NULL + }, + + { .func = main_vcfcall, + .alias = "call", + .help = "SNP/indel calling" + }, + { .func = main_consensus, + .alias = "consensus", + .help = "create consensus sequence by applying VCF variants" + }, + { .func = main_vcfcnv, + .alias = "cnv", + .help = "HMM CNV calling" + }, + { .func = main_csq, + .alias = "csq", + .help = "call variation consequences" + }, + { .func = main_vcffilter, + .alias = "filter", + .help = "filter VCF/BCF files using fixed thresholds" + }, + { .func = main_vcfgtcheck, + .alias = "gtcheck", + .help = "check sample concordance, detect sample swaps and contamination" + }, + { .func = main_mpileup, + .alias = "mpileup", + .help = "multi-way pileup producing genotype likelihoods" + }, +#if USE_GPL + { .func = main_polysomy, + .alias = "polysomy", + .help = "detect number of chromosomal copies", + }, +#endif + { .func = main_vcfroh, + .alias = "roh", + .help = "identify runs of autozygosity (HMM)", + }, + { .func = main_vcfstats, + .alias = "stats", + .help = "produce VCF/BCF stats" + }, + + { .func = main_vcfsom, + .alias = "som", + .help = "-filter using Self-Organized Maps (experimental)" // do not advertise + + }, + { .func = NULL, + .alias = NULL, + .help = NULL + } +}; + +char *bcftools_version(void) +{ + return BCFTOOLS_VERSION; +} + +static void usage(FILE *fp) +{ + fprintf(fp, "\n"); + fprintf(fp, "Program: bcftools (Tools for variant calling and manipulating VCFs and BCFs)\n"); +#if USE_GPL + fprintf(fp, "License: GNU GPLv3+, due to use of the GNU Scientific Library\n"); +#endif + fprintf(fp, "Version: %s (using htslib %s)\n", bcftools_version(), hts_version()); + fprintf(fp, "\n"); + fprintf(fp, "Usage: bcftools [--version|--version-only] [--help] \n"); + fprintf(fp, "\n"); + fprintf(fp, "Commands:\n"); + + int i = 0; + const char *sep = NULL; + while (cmds[i].alias) + { + if ( !cmds[i].func ) sep = cmds[i].alias; + if ( sep ) + { + fprintf(fp, "\n -- %s\n", sep); + sep = NULL; + } + if ( cmds[i].func && cmds[i].help[0]!='-' ) fprintf(fp, " %-12s %s\n", cmds[i].alias, cmds[i].help); + i++; + } +#if ENABLE_BCF_PLUGINS + fprintf(fp,"\n -- Plugins (collection of programs for calling, file manipulation & analysis)\n"); + int nplugins = count_plugins(); + if ( nplugins ) + fprintf(fp," %d plugins available, run \"bcftools plugin -lv\" to see a complete list\n", nplugins); + else + fprintf(fp," 0 plugins available, run \"bcftools plugin -l\" for help\n"); +#endif + fprintf(fp,"\n"); + fprintf(fp, + " Most commands accept VCF, bgzipped VCF, and BCF with the file type detected\n" + " automatically even when streaming from a pipe. Indexed VCF and BCF will work\n" + " in all situations. Un-indexed VCF and BCF and streams will work in most but\n" + " not all situations.\n"); + fprintf(fp,"\n"); +} + +// This is a tricky one, but on Windows the filename wildcard expansion is done by +// the application and not by the shell, as traditionally it never had a "shell". +// Even now, DOS and Powershell do not do this expansion (but bash does). +// +// This means that Mingw/Msys implements code before main() that takes e.g. "*" and +// expands it up to a list of matching filenames. This in turn breaks things like +// specifying "*" as a region (all the unmapped reads). We take a hard line here - +// filename expansion is the task of the shell, not our application! +#ifdef _WIN32 +int _CRT_glob = 0; +#endif + +int bcftools_main(int argc, char *argv[]) +{ + if (argc < 2) { usage(bcftools_stderr); return 1; } + + if (strcmp(argv[1], "version") == 0 || strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-v") == 0) { + fprintf(bcftools_stdout, "bcftools %s\nUsing htslib %s\nCopyright (C) 2022 Genome Research Ltd.\n", bcftools_version(), hts_version()); +#if USE_GPL + fprintf(bcftools_stdout, "License GPLv3+: GNU GPL version 3 or later \n"); +#else + fprintf(bcftools_stdout, "License Expat: The MIT/Expat license\n"); +#endif + fprintf(bcftools_stdout, "This is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n"); + return 0; + } + else if (strcmp(argv[1], "--version-only") == 0) { + fprintf(bcftools_stdout, "%s+htslib-%s\n", bcftools_version(), hts_version()); + return 0; + } + else if (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) { + if (argc == 2) { usage(bcftools_stdout); return 0; } + // Otherwise change "bcftools help COMMAND [...]" to "bcftools COMMAND"; + // main_xyz() functions by convention display the subcommand's usage + // when invoked without any arguments. + argv++; + argc = 2; + } + else if ( argv[1][0]=='+' ) + { + // "bcftools plugin name" can be run as "bcftools +name" + argv[1]++; + argv[0] = "plugin"; + argv--; + argc++; + } + + int i = 0; + while (cmds[i].alias) + { + if (cmds[i].func && strcmp(argv[1],cmds[i].alias)==0) + { + return cmds[i].func(argc-1,argv+1); + } + i++; + } + fprintf(bcftools_stderr, "[E::%s] unrecognized command '%s'\n", __func__, argv[1]); + return 1; +} + diff --git a/bcftools/mcall.c b/bcftools/mcall.c new file mode 100644 index 0000000..5761896 --- /dev/null +++ b/bcftools/mcall.c @@ -0,0 +1,1685 @@ +/* mcall.c -- multiallelic and rare variant calling. + + Copyright (C) 2012-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include "call.h" +#include "prob1.h" + +// Using priors for GTs does not seem to be mathematically justified. Although +// it seems effective in removing false calls, it also flips a significant +// proportion of HET genotypes. Better is to filter by FORMAT/GQ using +// `bcftools filter`. +#define USE_PRIOR_FOR_GTS 0 + +// Go with uniform PLs for samples with no coverage. If unset, missing +// genotypes is reported instead. +#define FLAT_PDG_FOR_MISSING 0 + +int test16(float *anno16, anno16_t *a); + +void qcall_init(call_t *call) { return; } +void qcall_destroy(call_t *call) { return; } +int qcall(call_t *call, bcf1_t *rec) +{ + // QCall format: + // chromosome, position, reference allele, depth, mapping quality, 0, .. + error("TODO: qcall output\n"); + return 0; +} + +void call_init_pl2p(call_t *call) +{ + int i; + for (i=0; i<256; i++) + call->pl2p[i] = pow(10., -i/10.); +} + +// Macros for accessing call->trio and call->ntrio +#define FTYPE_222 0 // family type: all diploid +#define FTYPE_121 1 // chrX, the child is a boy +#define FTYPE_122 2 // chrX, a girl +#define FTYPE_101 3 // chrY, boy +#define FTYPE_100 4 // chrY, girl + +#define GT_SKIP 0xf // empty genotype (chrY in females) + +#define IS_POW2(x) (!((x) & ((x) - 1))) // zero is permitted +#define IS_HOM(x) IS_POW2(x) + +// Pkij = P(k|i,j) tells how likely it is to be a het if the parents +// are homs etc. The consistency of i,j,k has been already checked. +// Parameters are alleles and ploidy of father, mother, kid +// Returns 2/Pkij. +int calc_Pkij(int fals, int mals, int kals, int fpl, int mpl, int kpl) +{ + int als = fals|mals|kals; + if ( IS_HOM(als) ) return 2; // all are the same: child must be a HOM, P=1 + + if ( fpl==1 ) + { + if ( kpl==1 ) // chr X, the child is a boy, the copy is inherited from the mother + { + if ( IS_HOM(mals) ) return 2; // 0 11 -> P(1) = 1 + return 4; // 0 01 -> P(0) = P(1) = 1/2 + } + // chr X, the child is a girl + if ( IS_HOM(mals) ) return 2; // 0 11 -> P(01) = 1 + return 4; // 0 01 -> P(00) = P(01) = 1/2 + } + + if ( IS_HOM(fals) && IS_HOM(mals) ) return 2; // 00 11 01, the child must be a HET, P=1 + if ( !IS_HOM(fals) && !IS_HOM(mals) ) + { + if ( IS_HOM(kals) ) return 8; // 01 01 00 or 01 01 11, P(k=HOM) = 1/4 + return 4; // 01 01 01, P(k=HET) = 1/2 + } + return 4; // 00 01, P(k=HET) = P(k=HOM) = 1/2 +} + +// Initialize ntrio and trio: ntrio lists the number of possible +// genotypes given combination of haploid/diploid genomes and the +// number of alleles. trio lists allowed genotype combinations: +// 4bit: 2/Pkij, 4: father, 4: mother, 4: child +// See also mcall_call_trio_genotypes() +// +static void mcall_init_trios(call_t *call) +{ + if ( call->prior_AN ) + { + int id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,call->prior_AN); + if ( id==-1 ) error("No such tag \"%s\"\n", call->prior_AN); + if ( !bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,id) ) error("No such FORMAT tag \"%s\"\n", call->prior_AN); + id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,call->prior_AC); + if ( id==-1 ) error("No such tag \"%s\"\n", call->prior_AC); + if ( !bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,id) ) error("No such FORMAT tag \"%s\"\n", call->prior_AC); + } + + // 23, 138, 478 possible diploid trio genotypes with 2, 3, 4 alleles + call->ntrio[FTYPE_222][2] = 15; call->ntrio[FTYPE_222][3] = 78; call->ntrio[FTYPE_222][4] = 250; + call->ntrio[FTYPE_121][2] = 8; call->ntrio[FTYPE_121][3] = 27; call->ntrio[FTYPE_121][4] = 64; + call->ntrio[FTYPE_122][2] = 8; call->ntrio[FTYPE_122][3] = 27; call->ntrio[FTYPE_122][4] = 64; + call->ntrio[FTYPE_101][2] = 2; call->ntrio[FTYPE_101][3] = 3; call->ntrio[FTYPE_101][4] = 4; + call->ntrio[FTYPE_100][2] = 2; call->ntrio[FTYPE_100][3] = 3; call->ntrio[FTYPE_100][4] = 4; + + int nals, itype; + for (itype=0; itype<=4; itype++) + { + for (nals=2; nals<=4; nals++) + call->trio[itype][nals] = (uint16_t*) malloc(sizeof(uint16_t)*call->ntrio[itype][nals]); + } + + // max 10 possible diploid genotypes + int gts[10]; + for (nals=2; nals<=4; nals++) + { + int i,j,k, n = 0, ngts = 0; + for (i=0; itrio[FTYPE_222][nals][n++] = Pkij<<12 | i<<8 | j<<4 | k; // father, mother, child + } + assert( n==call->ntrio[FTYPE_222][nals] ); + + // 121: chrX, boy + n = 0; + for (i=0; itrio[FTYPE_121][nals][n++] = Pkij<<12 | i<<8 | j<<4 | k; + } + assert( n==call->ntrio[FTYPE_121][nals] ); + + // 122: chrX, girl + n = 0; + for (i=0; itrio[FTYPE_122][nals][n++] = Pkij<<12 | i<<8 | j<<4 | k; + } + assert( n==call->ntrio[FTYPE_122][nals] ); + + // 101: chrY, boy + n = 0; + for (i=0; itrio[FTYPE_101][nals][n++] = 1<<12 | i<<8 | GT_SKIP<<4 | k; + } + assert( n==call->ntrio[FTYPE_101][nals] ); + + // 100: chrY, girl + n = 0; + for (i=0; itrio[FTYPE_100][nals][n++] = 1<<12 | i<<8 | GT_SKIP<<4 | GT_SKIP; + } + assert( n==call->ntrio[FTYPE_100][nals] ); + + } + call->GLs = (double*) calloc(bcf_hdr_nsamples(call->hdr)*10,sizeof(double)); + + int i, j; + for (i=0; infams; i++) + { + family_t *fam = &call->fams[i]; + int ploidy[3]; + for (j=0; j<3; j++) + ploidy[j] = call->ploidy[fam->sample[j]]; + + if ( ploidy[FATHER]==2 ) // not X, not Y + { + if ( ploidy[MOTHER]!=2 || ploidy[CHILD]!=2 ) + error("Incorrect ploidy: %d %d %d\n", ploidy[FATHER],ploidy[MOTHER],ploidy[CHILD]); + fam->type = FTYPE_222; + continue; + } + if ( ploidy[FATHER]!=1 || ploidy[MOTHER]==1 ) + error("Incorrect ploidy: %d %d %d\n", ploidy[FATHER],ploidy[MOTHER],ploidy[CHILD]); + if ( ploidy[MOTHER]==2 ) // X + { + if ( ploidy[CHILD]==0 ) + error("Incorrect ploidy: %d %d %d\n", ploidy[FATHER],ploidy[MOTHER],ploidy[CHILD]); + fam->type = ploidy[CHILD]==2 ? FTYPE_122 : FTYPE_121; // a girl or a boy + } + else // Y + { + if ( ploidy[CHILD]==2 ) + error("Incorrect ploidy: %d %d %d\n", ploidy[FATHER],ploidy[MOTHER],ploidy[CHILD]); + fam->type = ploidy[CHILD]==0 ? FTYPE_100 : FTYPE_101; // a girl or a boy + } + } +} +static void mcall_destroy_trios(call_t *call) +{ + int i, j; + for (i=2; i<=4; i++) + for (j=0; j<=4; j++) + free(call->trio[j][i]); +} + +static void init_sample_groups(call_t *call) +{ + int i, nsmpl = bcf_hdr_nsamples(call->hdr); + if ( !call->sample_groups ) + { + // standard pooled calling, all samples in the same group + call->nsmpl_grp = 1; + call->smpl_grp = (smpl_grp_t*)calloc(1,sizeof(*call->smpl_grp)); + call->smpl_grp[0].nsmpl = nsmpl; + call->smpl_grp[0].smpl = (uint32_t*)calloc(call->smpl_grp[0].nsmpl,sizeof(uint32_t)); + for (i=0; ismpl_grp[0].smpl[i] = i; + return; + } + + if ( call->sample_groups_tag ) + { + // Is the tag defined in the header? + int tag_id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,call->sample_groups_tag); + if ( tag_id==-1 ) error("No such tag \"%s\"\n",call->sample_groups_tag); + if ( !bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,tag_id) ) error("No such FORMAT tag \"%s\"\n", call->sample_groups_tag); + } + else + { + int tag_id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,"QS"); + if ( tag_id >= 0 && bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,tag_id) ) call->sample_groups_tag = "QS"; + else + { + tag_id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,"AD"); + if ( tag_id >= 0 && bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,tag_id) ) call->sample_groups_tag = "AD"; + else error("Error: neither \"AD\" nor \"QS\" FORMAT tag exists and no alternative given with -G\n"); + } + } + + // Read samples/groups + if ( !strcmp("-",call->sample_groups) ) + { + // single-sample calling, each sample creates its own group + call->nsmpl_grp = nsmpl; + call->smpl_grp = (smpl_grp_t*)calloc(nsmpl,sizeof(*call->smpl_grp)); + for (i=0; ismpl_grp[i].nsmpl = 1; + call->smpl_grp[i].smpl = (uint32_t*)calloc(call->smpl_grp[i].nsmpl,sizeof(uint32_t)); + call->smpl_grp[i].smpl[0] = i; + } + } + else + { + int nlines; + char **lines = hts_readlist(call->sample_groups, 1, &nlines); + if ( !lines ) error("Could not read the file: %s\n", call->sample_groups); + + uint32_t *smpl2grp = (uint32_t*)calloc(nsmpl,sizeof(uint32_t)); + uint32_t *grp2n = (uint32_t*)calloc(nsmpl,sizeof(uint32_t)); + void *grp2idx = khash_str2int_init(); + + call->nsmpl_grp = 0; + for (i=0; isample_groups,lines[i]); + char *tmp = ptr; + while ( *ptr && isspace(*ptr) ) ptr++; + if ( !*ptr ) error("Could not parse the line in %s, expected a sample name followed by tab and a population name: %s\n",call->sample_groups,lines[i]); + *tmp = 0; + int ismpl = bcf_hdr_id2int(call->hdr, BCF_DT_SAMPLE, lines[i]); + if ( ismpl<0 ) continue; + if ( smpl2grp[ismpl] ) error("Error: the sample \"%s\" is listed twice in %s\n", lines[i],call->sample_groups); + if ( !khash_str2int_has_key(grp2idx,ptr+1) ) + { + khash_str2int_set(grp2idx, ptr+1, call->nsmpl_grp); + call->nsmpl_grp++; + } + int igrp = -1; + if ( khash_str2int_get(grp2idx, ptr+1, &igrp)!=0 ) + error("This should not happen, fixme: %s\n",ptr+1); + grp2n[igrp]++; + smpl2grp[ismpl] = igrp+1; // +1 to distinguish unlisted samples + } + khash_str2int_destroy(grp2idx); + if ( !call->nsmpl_grp ) error("Could not parse the file, no matching samples found: %s\n", call->sample_groups); + + call->smpl_grp = (smpl_grp_t*)calloc(call->nsmpl_grp,sizeof(*call->smpl_grp)); + for (i=0; ihdr->samples[i],call->sample_groups); + int igrp = smpl2grp[i] - 1; + if ( !call->smpl_grp[igrp].nsmpl ) + call->smpl_grp[igrp].smpl = (uint32_t*)calloc(grp2n[igrp],sizeof(uint32_t)); + call->smpl_grp[igrp].smpl[call->smpl_grp[igrp].nsmpl] = i; + call->smpl_grp[igrp].nsmpl++; + } + free(smpl2grp); + free(grp2n); + for (i=0; insmpl_grp; i++) + { + free(call->smpl_grp[i].qsum); + free(call->smpl_grp[i].smpl); + } + free(call->smpl_grp); +} + +void mcall_init(call_t *call) +{ + init_sample_groups(call); + call_init_pl2p(call); + + call->nals_map = 5; + call->als_map = (int*) malloc(sizeof(int)*call->nals_map); + call->npl_map = 5*(5+1)/2; // will be expanded later if necessary + call->pl_map = (int*) malloc(sizeof(int)*call->npl_map); + call->gts = (int32_t*) calloc(bcf_hdr_nsamples(call->hdr)*2,sizeof(int32_t)); // assuming at most diploid everywhere + + if ( call->flag & CALL_CONSTR_TRIO ) + { + call->cgts = (int32_t*) calloc(bcf_hdr_nsamples(call->hdr),sizeof(int32_t)); + call->ugts = (int32_t*) calloc(bcf_hdr_nsamples(call->hdr),sizeof(int32_t)); + mcall_init_trios(call); + bcf_hdr_append(call->hdr,"##FORMAT="); + bcf_hdr_append(call->hdr,"##FORMAT="); + } + if ( call->flag & CALL_CONSTR_ALLELES ) call->vcmp = vcmp_init(); + + bcf_hdr_append(call->hdr,"##FORMAT="); + if ( call->output_tags & CALL_FMT_GQ ) + bcf_hdr_append(call->hdr,"##FORMAT="); + if ( call->output_tags & CALL_FMT_GP ) + bcf_hdr_append(call->hdr,"##FORMAT="); + if ( call->output_tags & (CALL_FMT_GQ|CALL_FMT_GP) ) + call->GQs = (int32_t*) malloc(sizeof(int32_t)*bcf_hdr_nsamples(call->hdr)); + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO="); + if ( call->output_tags & CALL_FMT_PV4 ) + bcf_hdr_append(call->hdr,"##INFO=\n"); + + // init the prior + if ( call->theta>0 ) + { + int i, n = 0; + if ( !call->ploidy ) n = 2*bcf_hdr_nsamples(call->hdr); // all are diploid + else + { + for (i=0; ihdr); i++) + n += call->ploidy[i]; + } + // Watterson factor, here aM_1 = aM_2 = 1 + double aM = 1; + for (i=2; itheta *= aM; + if ( call->theta >= 1 ) + { + fprintf(stderr,"The prior is too big (theta*aM=%.2f), going with 0.99\n", call->theta); + call->theta = 0.99; + } + call->theta = log(call->theta); + } +} + +void mcall_destroy(call_t *call) +{ + destroy_sample_groups(call); + if (call->vcmp) vcmp_destroy(call->vcmp); + free(call->itmp); + mcall_destroy_trios(call); + free(call->GPs); + free(call->ADs); + free(call->GLs); + free(call->GQs); + free(call->anno16); + free(call->PLs); + free(call->als_map); + free(call->pl_map); + free(call->gts); free(call->cgts); free(call->ugts); + free(call->pdg); + free(call->als); + free(call->ac); + return; +} + + +// Inits P(D|G): convert PLs from log space and normalize. In case of zero +// depth, missing PLs are all zero. In this case, pdg's are set to 0 +// so that the corresponding genotypes can be set as missing and the +// qual calculation is not affected. +// Missing values are replaced by generic likelihoods when X (unseen allele) is +// present. +// NB: While the -m callig model uses the pdgs in canonical order, +// the original samtools -c calling code uses pdgs in reverse order (AA comes +// first, RR last). +// NB: Ploidy is not taken into account here, which is incorrect. +void set_pdg(double *pl2p, int *PLs, double *pdg, int n_smpl, int n_gt, int unseen) +{ + int i, j, nals; + + // find out the number of alleles, expecting diploid genotype likelihoods + bcf_gt2alleles(n_gt-1, &i, &nals); + assert( i==nals ); + nals++; + + for (i=0; i new(j) + for (i=0; ials_map[i] = nout++; + else call->als_map[i] = -1; + } + + if ( !call->pl_map ) return; + + // pl_map: new(k) -> old(l) + int k = 0, l = 0; + for (i=0; ipl_map[k++] = l; + l++; + } + } +} + +/** log(exp(a)+exp(b)) */ +static inline double logsumexp2(double a, double b) +{ + if ( a>b ) + return log(1 + exp(b-a)) + a; + else + return log(1 + exp(a-b)) + b; +} + +// Macro to set the most likely alleles +#define UPDATE_MAX_LKs(als,sum) { \ + if ( max_lknsmpl; + int ngts = nals*(nals+1)/2; + + // Single allele + for (ia=0; iapdg + grp->smpl[ismpl]*ngts + iaa; + if ( *pdg ) { lk_tot += log(*pdg); lk_tot_set = 1; } + } + if ( ia==0 ) ref_lk = lk_tot; // likelihood of 0/0 for all samples + else lk_tot += call->theta; // the prior + UPDATE_MAX_LKs(1<0 && lk_tot_set); + } + + // Two alleles + if ( nals>1 ) + { + for (ia=0; iaqsum[ia]==0 ) continue; + int iaa = (ia+1)*(ia+2)/2-1; + for (ib=0; ibqsum[ib]==0 ) continue; + double lk_tot = 0; + int lk_tot_set = 0; + double fa = grp->qsum[ia]/(grp->qsum[ia] + grp->qsum[ib]); + double fb = grp->qsum[ib]/(grp->qsum[ia] + grp->qsum[ib]); + double fa2 = fa*fa; + double fb2 = fb*fb; + double fab = 2*fa*fb; + int is, ibb = (ib+1)*(ib+2)/2-1, iab = iaa - ia + ib; + for (is=0; issmpl[is]; + double *pdg = call->pdg + ismpl*ngts; + double val = 0; + if ( !call->ploidy || call->ploidy[ismpl]==2 ) + val = fa2*pdg[iaa] + fb2*pdg[ibb] + fab*pdg[iab]; + else if ( call->ploidy && call->ploidy[ismpl]==1 ) + val = fa*pdg[iaa] + fb*pdg[ibb]; + if ( val ) { lk_tot += log(val); lk_tot_set = 1; } + } + if ( ia!=0 ) lk_tot += call->theta; // the prior + if ( ib!=0 ) lk_tot += call->theta; + UPDATE_MAX_LKs(1<2 ) + { + for (ia=0; iaqsum[ia]==0 ) continue; + int iaa = (ia+1)*(ia+2)/2-1; + for (ib=0; ibqsum[ib]==0 ) continue; + int ibb = (ib+1)*(ib+2)/2-1; + int iab = iaa - ia + ib; + for (ic=0; icqsum[ic]==0 ) continue; + double lk_tot = 0; + int lk_tot_set = 0; + + double fa = grp->qsum[ia]/(grp->qsum[ia] + grp->qsum[ib] + grp->qsum[ic]); + double fb = grp->qsum[ib]/(grp->qsum[ia] + grp->qsum[ib] + grp->qsum[ic]); + double fc = grp->qsum[ic]/(grp->qsum[ia] + grp->qsum[ib] + grp->qsum[ic]); + double fa2 = fa*fa; + double fb2 = fb*fb; + double fc2 = fc*fc; + double fab = 2*fa*fb, fac = 2*fa*fc, fbc = 2*fb*fc; + int is, icc = (ic+1)*(ic+2)/2-1; + int iac = iaa - ia + ic, ibc = ibb - ib + ic; + for (is=0; issmpl[is]; + double *pdg = call->pdg + ismpl*ngts; + double val = 0; + if ( !call->ploidy || call->ploidy[ismpl]==2 ) + val = fa2*pdg[iaa] + fb2*pdg[ibb] + fc2*pdg[icc] + fab*pdg[iab] + fac*pdg[iac] + fbc*pdg[ibc]; + else if ( call->ploidy && call->ploidy[ismpl]==1 ) + val = fa*pdg[iaa] + fb*pdg[ibb] + fc*pdg[icc]; + if ( val ) { lk_tot += log(val); lk_tot_set = 1; } + } + if ( ia!=0 ) lk_tot += call->theta; // the prior + if ( ib!=0 ) lk_tot += call->theta; // the prior + if ( ic!=0 ) lk_tot += call->theta; // the prior + UPDATE_MAX_LKs(1<max_lk = max_lk; + grp->ref_lk = ref_lk; + grp->lk_sum = lk_sum; + grp->als = max_als; + grp->nals = n; + + return n; +} + +// Sets GT=0/0 or GT=. if PL=0,0,0 +static void mcall_set_ref_genotypes(call_t *call, int nals_ori) +{ + int i; + int ngts = nals_ori*(nals_ori+1)/2; // need this to distinguish between GT=0/0 vs GT=. + int nsmpl = bcf_hdr_nsamples(call->hdr); + + for (i=0; iac[i] = 0; // nals_new<=nals_ori, never mind setting extra 0's + + // Set all genotypes to 0/0 or 0 + int *gts = call->gts; + double *pdg = call->pdg; + int isample; + for (isample = 0; isample < nsmpl; isample++) + { + int ploidy = call->ploidy ? call->ploidy[isample] : 2; + for (i=0; iac[0] += ploidy; + } + gts += 2; + pdg += ngts; + } +} + +static void mcall_call_genotypes(call_t *call, int nals_ori, smpl_grp_t *grp) +{ + int ia, ib, i; + int ngts_ori = nals_ori*(nals_ori+1)/2; + int ngts_new = call->nals_new*(call->nals_new+1)/2; + int nsmpl = grp->nsmpl; + + #if USE_PRIOR_FOR_GTS + float prior = exp(call->theta); + #endif + + int is; + for (is = 0; is < nsmpl; is++) + { + int ismpl = grp->smpl[is]; + double *pdg = call->pdg + ismpl*ngts_ori; + float *gps = call->GPs + ismpl*ngts_new; + int *gts = call->gts + ismpl*2; + + int ploidy = call->ploidy ? call->ploidy[ismpl] : 2; + assert( ploidy>=0 && ploidy<=2 ); + + if ( !ploidy ) + { + gts[0] = bcf_gt_missing; + gts[1] = bcf_int32_vector_end; + gps[0] = -1; + continue; + } + + #if !FLAT_PDG_FOR_MISSING + // Skip samples with zero depth, they have all pdg's equal to 0 + for (i=0; ials & 1<qsum[ia]*grp->qsum[ia] : pdg[iaa]*grp->qsum[ia]; + #if USE_PRIOR_FOR_GTS + if ( ia!=0 ) lk *= prior; + #endif + int igt = ploidy==2 ? bcf_alleles2gt(call->als_map[ia],call->als_map[ia]) : call->als_map[ia]; + gps[igt] = lk; + if ( best_lk < lk ) + { + best_lk = lk; + gts[0] = bcf_gt_unphased(call->als_map[ia]); + } + } + if ( ploidy==2 ) + { + gts[1] = gts[0]; + for (ia=0; iaals & 1<als & 1<qsum[ia]*grp->qsum[ib]; + #if USE_PRIOR_FOR_GTS + if ( ia!=0 ) lk *= prior; + if ( ib!=0 ) lk *= prior; + #endif + int igt = bcf_alleles2gt(call->als_map[ia],call->als_map[ib]); + gps[igt] = lk; + if ( best_lk < lk ) + { + best_lk = lk; + gts[0] = bcf_gt_unphased(call->als_map[ib]); + gts[1] = bcf_gt_unphased(call->als_map[ia]); + } + } + } + } + else + gts[1] = bcf_int32_vector_end; + + call->ac[ bcf_gt_allele(gts[0]) ]++; + if ( gts[1]!=bcf_int32_vector_end ) call->ac[ bcf_gt_allele(gts[1]) ]++; + } + if ( !(call->output_tags & (CALL_FMT_GQ|CALL_FMT_GP)) ) return; + double max, sum; + for (is=0; issmpl[is]; + float *gps = call->GPs + ismpl*ngts_new; + + int nmax; + if ( call->ploidy ) + { + if ( call->ploidy[ismpl]==2 ) nmax = ngts_new; + else if ( call->ploidy[ismpl]==1 ) nmax = grp->nals; + else nmax = 0; + } + else nmax = ngts_new; + + max = gps[0]; + if ( max<0 || nmax==0 ) + { + // no call + if ( call->output_tags & CALL_FMT_GP ) + { + for (i=0; iGQs[ismpl] = 0; + continue; + } + sum = gps[0]; + for (i=1; iGQs[ismpl] = max<=INT8_MAX ? max : INT8_MAX; + if ( call->output_tags & CALL_FMT_GP ) + { + assert( max ); + for (i=0; ihdr); + int ngts = nals*(nals+1)/2; + int nout_gts = nals_new*(nals_new+1)/2; + double *gls = call->GLs - nout_gts; + double *pdg = call->pdg - ngts; + + // Calculate individuals' genotype likelihoods P(X=i) + int isample; + for (isample = 0; isample < nsmpl; isample++) + { + int ploidy = call->ploidy ? call->ploidy[isample] : 2; + int32_t *gts = call->ugts + isample; + + gls += nout_gts; + pdg += ngts; + + // Skip samples with all pdg's equal to 1. These have zero depth. + for (i=0; ismpl_grp.grp[call->smpl_grp.smpl2grp[isample]]; + double sum_lk = 0; + double best_lk = 0; + for (ia=0; iaals_map[ia],call->als_map[ia]); + double lk = ploidy==2 ? pdg[iaa]*grp->qsum[ia]*grp->qsum[ia] : pdg[iaa]*grp->qsum[ia]; + sum_lk += lk; + gls[idx] = lk; + if ( best_lk < lk ) + { + best_lk = lk; + gts[0] = bcf_alleles2gt(call->als_map[ia],call->als_map[ia]); + } + } + if ( ploidy==2 ) + { + for (ia=0; iaals_map[ia],call->als_map[ib]); + double lk = 2*pdg[iab]*grp->qsum[ia]*grp->qsum[ib]; + sum_lk += lk; + gls[idx] = lk; + if ( best_lk < lk ) + { + best_lk = lk; + gts[0] = bcf_alleles2gt(call->als_map[ib],call->als_map[ia]); + } + } + } + } + for (i=0; itrio_Pm_ins<0 && call->trio_Pm_del<0 ) trio_Pm = call->trio_Pm_SNPs; // the same Pm for indels and SNPs requested + else + { + int ret = bcf_get_variant_types(rec); + if ( !(ret & VCF_INDEL) ) trio_Pm = call->trio_Pm_SNPs; + else + { + if ( call->trio_Pm_ins<0 ) // dynamic calculation, trio_Pm_del holds the scaling factor + { + trio_Pm = rec->d.var[1].n<0 ? -21.9313 - 0.2856*rec->d.var[1].n : -22.8689 + 0.2994*rec->d.var[1].n; + trio_Pm = 1 - call->trio_Pm_del * exp(trio_Pm); + } + else // snps and indels set explicitly + { + trio_Pm = rec->d.var[1].n<0 ? call->trio_Pm_del : call->trio_Pm_ins; + } + } + } + + // Calculate constrained likelihoods and determine genotypes + int ifm; + for (ifm=0; ifmnfams; ifm++) + { + family_t *fam = &call->fams[ifm]; + int ntrio = call->ntrio[fam->type][nals_new]; + uint16_t *trio = call->trio[fam->type][nals_new]; + + // Unconstrained likelihood + int uc_itr = 0; + double uc_lk = 0; + for (i=0; i<3; i++) // for father, mother, child + { + int ismpl = fam->sample[i]; + double *gl = call->GLs + nout_gts*ismpl; + if ( gl[0]==1 ) continue; + int j, jmax = 0; + double max = gl[0]; + for (j=1; jsample[i]; + double *gl = call->GLs + nout_gts*ismpl; + if ( gl[0]==1 ) continue; + int igt = trio[itr]>>((2-i)*4) & 0xf; + assert( !call->ploidy || call->ploidy[ismpl]>0 ); + if ( igt==GT_SKIP ) continue; + lk += gl[igt]; + npresent++; + // fprintf(stderr," %e", gl[igt]); + } + // fprintf(stderr,"\t\t"); + double Pkij = npresent==3 ? (double)2/(trio[itr]>>12) : 1; // with missing genotypes Pkij's are different + lk += log(1 - trio_Pm * (1 - Pkij)); + // fprintf(stderr,"%d%d%d\t%e\t%.2f\n", trio[itr]>>8&0xf,trio[itr]>>4&0xf,trio[itr]&0xf, lk, Pkij); + if ( c_lk < lk ) { c_lk = lk; c_itr = trio[itr]; } + if ( uc_itr==trio[itr] ) uc_is_mendelian = 1; + } + + if ( !uc_is_mendelian ) + { + uc_lk += log(1 - trio_Pm); + // fprintf(stderr,"c_lk=%e uc_lk=%e c_itr=%d%d%d uc_itr=%d%d%d\n", c_lk,uc_lk,c_itr>>8&0xf,c_itr>>4&0xf,c_itr&0xf,uc_itr>>8&0xf,uc_itr>>4&0xf,uc_itr&0xf); + if ( c_lk < uc_lk ) { c_lk = uc_lk; c_itr = uc_itr; } + } + // fprintf(stderr,"best_lk=%e best_itr=%d%d%d uc_itr=%d%d%d\n", c_lk,c_itr>>8&0xf,c_itr>>4&0xf,c_itr&0xf,uc_itr>>8&0xf,uc_itr>>4&0xf,uc_itr&0xf); + + // Set genotypes for father, mother, child and calculate genotype qualities + for (i=0; i<3; i++) + { + // GT + int ismpl = fam->sample[i]; + int igt = c_itr>>((2-i)*4) & 0xf; + double *gl = call->GLs + nout_gts*ismpl; + int32_t *gts = call->cgts + ismpl; + if ( gl[0]==1 || igt==GT_SKIP ) // zero depth, set missing genotypes + { + gts[0] = -1; + // bcf_float_set_missing(call->GQs[ismpl]); + continue; + } + gts[0] = igt; + + #if 0 + // todo: Genotype Qualities + // + // GQ: for each family member i sum over all genotypes j,k keeping igt fixed + double lk_sum = 0; + for (itr=0; itr>((2-i)*4) & 0xf) ) continue; + double lk = 0; + int j; + for (j=0; j<3; j++) + { + int jsmpl = fam->sample[j]; + double *gl = call->GLs + ngts*jsmpl; + if ( gl[0]==1 ) continue; + int jgt = trio[itr]>>((2-j)*4) & 0xf; + if ( jgt==GT_SKIP ) continue; + lk += gl[jgt]; + } + double Pkij = (double)2/(trio[itr]>>12); + lk += log(1 - trio_Pm * (1 - Pkij)); + lk_sum = logsumexp2(lk_sum, lk); + } + if ( !uc_is_mendelian && (best_itr>>((2-i)*4)&0xf)==(uc_itr>>((2-i)*4)&0xf) ) lk_sum = logsumexp2(lk_sum,uc_lk); + call->GQs[ismpl] = -4.3429*(best_lk - lk_sum); + #endif + } + } + + for (i=0; i<4; i++) call->ac[i] = 0; + call->nhets = 0; + call->ndiploid = 0; + + // Test if CGT,UGT are needed + int ucgts_needed = 0; + int32_t *cgts = call->cgts - 1; + int32_t *ugts = call->ugts - 1; + int32_t *gts = call->gts - 2; + for (isample = 0; isample < nsmpl; isample++) + { + int ploidy = call->ploidy ? call->ploidy[isample] : 2; + cgts++; + ugts++; + gts += 2; + if ( ugts[0]==-1 ) + { + gts[0] = bcf_gt_missing; + gts[1] = ploidy==2 ? bcf_gt_missing : bcf_int32_vector_end; + continue; + } + int a,b; + if ( cgts[0]!=ugts[0] ) + { + bcf_gt2alleles(cgts[0], &a, &b); + gts[0] = bcf_gt_unphased(a); + gts[1] = ploidy==1 ? bcf_int32_vector_end : bcf_gt_unphased(b); + } + else + { + bcf_gt2alleles(ugts[0], &a, &b); + gts[0] = bcf_gt_unphased(a); + gts[1] = ploidy==1 ? bcf_int32_vector_end : bcf_gt_unphased(b); + } + if ( cgts[0]!=ugts[0] ) ucgts_needed = 1; + call->ac[a]++; + if ( ploidy==2 ) + { + call->ac[b]++; + call->ndiploid++; + if ( a!=b ) call->nhets++; + } + } + if ( ucgts_needed ) + { + // Some GTs are different + bcf_update_format_int32(call->hdr,rec,"UGT",call->ugts,nsmpl); + bcf_update_format_int32(call->hdr,rec,"CGT",call->cgts,nsmpl); + } +} +#endif + +static void mcall_trim_and_update_PLs(call_t *call, bcf1_t *rec, int nals_ori, int nals_new) +{ + int npls_src = nals_ori*(nals_ori+1)/2; + int npls_dst = nals_new*(nals_new+1)/2; // number of PL values in diploid samples, ori and new + if ( call->all_diploid && npls_src == npls_dst ) return; + + int *pls_src = call->PLs, *pls_dst = call->PLs; + + int nsmpl = bcf_hdr_nsamples(call->hdr); + int isample, ia; + for (isample = 0; isample < nsmpl; isample++) + { + int ploidy = call->ploidy ? call->ploidy[isample] : 2; + if ( ploidy==2 ) + { + for (ia=0; iapl_map[ia] ]; + } + else if ( ploidy==1 ) + { + for (ia=0; iapl_map[isrc] ]; + } + if ( ia1 in mcall() + } + pls_src += npls_src; + pls_dst += npls_dst; + } + bcf_update_format_int32(call->hdr, rec, "PL", call->PLs, npls_dst*nsmpl); +} + +void mcall_trim_and_update_numberR(call_t *call, bcf1_t *rec, int nals_ori, int nals_new) +{ + if ( nals_ori==nals_new ) return; + + int i,j, nret, size = sizeof(float); + + void *tmp_ori = call->itmp, *tmp_new = call->PLs; // reusing PLs storage which is not used at this point + int ntmp_ori = call->n_itmp, ntmp_new = call->mPLs; + + // INFO fields + for (i=0; in_info; i++) + { + bcf_info_t *info = &rec->d.info[i]; + int vlen = bcf_hdr_id2length(call->hdr,BCF_HL_INFO,info->key); + if ( vlen!=BCF_VL_R ) continue; // not a Number=R tag + + int type = bcf_hdr_id2type(call->hdr,BCF_HL_INFO,info->key); + const char *key = bcf_hdr_int2id(call->hdr,BCF_DT_ID,info->key); + nret = bcf_get_info_values(call->hdr, rec, key, &tmp_ori, &ntmp_ori, type); + if ( nret<=0 ) continue; + + if ( nals_new==1 ) + bcf_update_info_int32(call->hdr, rec, key, tmp_ori, 1); // has to be the REF, the order could not change + else + { + for (j=0; jals_map[j]; + if ( k==-1 ) continue; // to be dropped + memcpy((char *)tmp_new+size*k, (char *)tmp_ori+size*j, size); + } + bcf_update_info_int32(call->hdr, rec, key, tmp_new, nals_new); + } + } + + // FORMAT fields + for (i=0; in_fmt; i++) + { + bcf_fmt_t *fmt = &rec->d.fmt[i]; + int vlen = bcf_hdr_id2length(call->hdr,BCF_HL_FMT,fmt->id); + if ( vlen!=BCF_VL_R ) continue; // not a Number=R tag + + int type = bcf_hdr_id2type(call->hdr,BCF_HL_FMT,fmt->id); + const char *key = bcf_hdr_int2id(call->hdr,BCF_DT_ID,fmt->id); + nret = bcf_get_format_values(call->hdr, rec, key, &tmp_ori, &ntmp_ori, type); + if (nret<=0) continue; + int nsmpl = bcf_hdr_nsamples(call->hdr); + + assert( nret==nals_ori*nsmpl ); + + for (j=0; jals_map[k]; + if ( l==-1 ) continue; // to be dropped + memcpy(ptr_dst+size*l, ptr_src+size*k, size); + } + } + bcf_update_format_int32(call->hdr, rec, key, tmp_new, nals_new*nsmpl); + } + + call->PLs = (int32_t*) tmp_new; + call->mPLs = ntmp_new; + call->itmp = (int32_t*) tmp_ori; + call->n_itmp = ntmp_ori; +} + + +// NB: in this function we temporarily use calls->als_map for a different +// purpose to store mapping from new (target) alleles to original alleles. +// +static int mcall_constrain_alleles(call_t *call, bcf1_t *rec, int *unseen) +{ + assert( call->tgt_als->n ); + if ( call->tgt_als->n>5 ) error("Maximum accepted number of alleles is 5, got %d\n", call->tgt_als->n); + hts_expand(char*,call->tgt_als->n+1,call->nals,call->als); + + int has_new = 0; + + int i, j, nals = 1; + for (i=1; inals_map; i++) call->als_map[i] = -1; + + if ( vcmp_set_ref(call->vcmp, rec->d.allele[0], call->tgt_als->allele[0]) < 0 ) + error("The reference alleles are not compatible at %s:%d .. %s vs %s\n", call->hdr->id[BCF_DT_CTG][rec->rid].key,rec->pos+1,call->tgt_als->allele[0],rec->d.allele[0]); + + // create mapping from new to old alleles + call->als[0] = call->tgt_als->allele[0]; + call->als_map[0] = 0; + + for (i=1; itgt_als->n; i++) + { + call->als[nals] = call->tgt_als->allele[i]; + j = vcmp_find_allele(call->vcmp, rec->d.allele+1, rec->n_allele - 1, call->tgt_als->allele[i]); + + // if ( j+1==*unseen ) + // { + // fprintf(stderr,"Fixme? Cannot constrain to %d-th allele (%s); j=%d,unseen=%d. VCF=",i,call->tgt_als->allele[i],j,*unseen); + // int k; + // for (k=0; kn_allele; k++) fprintf(stderr,"%s%s",k==0?"":",",rec->d.allele[k]); + // fprintf(stderr,"\tTAB="); + // for (k=0; ktgt_als->n; k++) fprintf(stderr,"%s%s",k==0?"":",",call->tgt_als->allele[k]); + // fprintf(stderr,"\n"); + // return -1; + // } + + if ( j>=0 ) + { + // existing allele + call->als_map[nals] = j+1; + } + else + { + // There is a new allele in targets which is not present in VCF. + // We use the X allele to estimate PLs. Note that X may not be + // present at multiallelic indels sites. In that case we use the + // last allele anyway, because the least likely allele comes last + // in mpileup's ALT output. + call->als_map[nals] = (*unseen)>=0 ? *unseen : rec->n_allele - 1; + has_new = 1; + } + nals++; + } + if ( *unseen ) + { + call->als_map[nals] = *unseen; + call->als[nals] = rec->d.allele[*unseen]; + nals++; + } + + if ( !has_new && nals==rec->n_allele ) return 0; + bcf_update_alleles(call->hdr, rec, (const char**)call->als, nals); + + // create mapping from new PL to old PL + int k = 0; + for (i=0; ials_map[i], b = call->als_map[j]; + call->pl_map[k++] = a>b ? a*(a+1)/2 + b : b*(b+1)/2 + a; + } + } + + // update PL + call->nPLs = bcf_get_format_int32(call->hdr, rec, "PL", &call->PLs, &call->mPLs); + int nsmpl = bcf_hdr_nsamples(call->hdr); + int npls_ori = call->nPLs / nsmpl; + int npls_new = k; + hts_expand(int32_t,npls_new*nsmpl,call->n_itmp,call->itmp); + int *ori_pl = call->PLs, *new_pl = call->itmp; + for (i=0; ipl_map[k]]; + if ( new_pl[k]==bcf_int32_missing && *unseen>=0 ) + { + // missing value, and there is an unseen allele: identify the + // alleles and use the lk of either AX or XX + int k_ori = call->pl_map[k], ia, ib; + bcf_gt2alleles(k_ori, &ia, &ib); + k_ori = bcf_alleles2gt(ia,*unseen); + if ( ori_pl[k_ori]==bcf_int32_missing ) k_ori = bcf_alleles2gt(ib,*unseen); + if ( ori_pl[k_ori]==bcf_int32_missing ) k_ori = bcf_alleles2gt(*unseen,*unseen); + new_pl[k] = ori_pl[k_ori]; + } + if ( !k && new_pl[k]==bcf_int32_vector_end ) new_pl[k]=bcf_int32_missing; + } + ori_pl += npls_ori; + new_pl += npls_new; + } + bcf_update_format_int32(call->hdr, rec, "PL", call->itmp, npls_new*nsmpl); + + // update QS, use temporarily call->GPs to store the values + int nqs = bcf_get_info_float(call->hdr, rec, "QS", &call->smpl_grp[0].qsum, &call->smpl_grp[0].nqsum); + hts_expand(float,nals,call->nGPs,call->GPs); + for (i=0; iGPs[i] = call->als_map[i]smpl_grp[0].qsum[call->als_map[i]] : 0; + bcf_update_info_float(call->hdr, rec, "QS", call->GPs, nals); + + // update any Number=R tags + void *tmp_ori = call->itmp, *tmp_new = call->PLs; // reusing PLs storage which is not used at this point + int ntmp_ori = call->n_itmp, ntmp_new = call->mPLs; + for (i=0; in_fmt; i++) + { + bcf_fmt_t *fmt = &rec->d.fmt[i]; + int vlen = bcf_hdr_id2length(call->hdr,BCF_HL_FMT,fmt->id); + if ( vlen!=BCF_VL_R ) continue; // not a Number=R tag + + // NB:works only for BCF_HT_INT and BCF_HT_REAL + int type = bcf_hdr_id2type(call->hdr,BCF_HL_FMT,fmt->id); + assert( type==BCF_HT_INT || type==BCF_HT_REAL ); + assert( sizeof(float)==sizeof(int32_t) ); + + const char *key = bcf_hdr_int2id(call->hdr,BCF_DT_ID,fmt->id); + int nret = bcf_get_format_values(call->hdr, rec, key, &tmp_ori, &ntmp_ori, type); + if (nret<=0) continue; + int nsmpl = bcf_hdr_nsamples(call->hdr); + int size1 = sizeof(float); + hts_expand(float, nsmpl * nals, ntmp_new, tmp_new); + for (j=0; jn; + uint8_t *ptr_new = (uint8_t *) tmp_new + j*nals*size1; + for (k=0; kals_map[k]; + memcpy(dst,src,size1); + } + } + nret = bcf_update_format(call->hdr, rec, key, tmp_new, nsmpl*nals, type); + assert( nret==0 ); + } + call->PLs = (int32_t*) tmp_new; + call->mPLs = ntmp_new; + call->itmp = (int32_t*) tmp_ori; + call->n_itmp = ntmp_ori; + + if ( *unseen ) *unseen = nals-1; + return 0; +} + + +/** + * This function implements the multiallelic calling model. It has two major parts: + * 1) determine the most likely set of alleles and calculate the quality of ref/non-ref site + * 2) determine and set the genotypes + * In various places in between, the BCF record gets updated. + */ +int mcall(call_t *call, bcf1_t *rec) +{ + int i,j, unseen = call->unseen; + + // Force alleles when calling genotypes given alleles was requested + if ( call->flag & CALL_CONSTR_ALLELES && mcall_constrain_alleles(call, rec, &unseen)!=0 ) return -2; + + int nsmpl = bcf_hdr_nsamples(call->hdr); + int nals_ori = rec->n_allele; + hts_expand(int,nals_ori,call->nac,call->ac); + hts_expand(int,nals_ori,call->nals_map,call->als_map); + hts_expand(int,nals_ori*(nals_ori+1)/2,call->npl_map,call->pl_map); + + // Get the genotype likelihoods + call->nPLs = bcf_get_format_int32(call->hdr, rec, "PL", &call->PLs, &call->mPLs); + if ( call->nPLs!=nsmpl*nals_ori*(nals_ori+1)/2 && call->nPLs!=nsmpl*nals_ori ) // a mixture of diploid and haploid or haploid only + error("Wrong number of PL fields? nals=%d npl=%d\n", nals_ori,call->nPLs); + + // Convert PLs to probabilities + int ngts_ori = nals_ori*(nals_ori+1)/2; + hts_expand(double, call->nPLs, call->npdg, call->pdg); + set_pdg(call->pl2p, call->PLs, call->pdg, nsmpl, ngts_ori, unseen); + + // Get sum of qualities, serves as an AF estimate, f_x = QS/N in Eq. 1 in call-m math notes. + if ( call->nsmpl_grp == 1 ) + { + int nqs = bcf_get_info_float(call->hdr, rec, "QS", &call->smpl_grp[0].qsum, &call->smpl_grp[0].nqsum); + if ( nqs<=0 ) error("The QS annotation not present at %s:%d\n", bcf_seqname(call->hdr,rec),rec->pos+1); + if ( nqs < nals_ori ) + { + // Some of the listed alleles do not have the corresponding QS field. This is + // typically ref-only site with <*> in ALT. + hts_expand(float,nals_ori,call->smpl_grp[0].nqsum,call->smpl_grp[0].qsum); + for (i=nqs; ismpl_grp[0].qsum[i] = 0; + } + } + else + { + for (j=0; jnsmpl_grp; j++) + { + hts_expand(float,nals_ori,call->smpl_grp[j].nqsum,call->smpl_grp[j].qsum); + memset(call->smpl_grp[j].qsum, 0, sizeof(float)*nals_ori); + } + + // Use FORMAT/AD or FORMAT/QS + int nad = bcf_get_format_int32(call->hdr, rec, call->sample_groups_tag, &call->ADs, &call->nADs); + if ( nad<1 ) error("Error: FORMAT/%s is required with the -G option, mpileup must be run with \"-a AD\" or \"-a QS\"\n",call->sample_groups_tag); + nad /= bcf_hdr_nsamples(call->hdr); + for (i=0; insmpl_grp; i++) + { + int is; + smpl_grp_t *grp = &call->smpl_grp[i]; + hts_expand(float,nals_ori,grp->nqsum,grp->qsum); + for (j=0; jqsum[j] = 0; + for (is=0; isnsmpl; is++) + { + int ismpl = grp->smpl[is]; + int32_t *ptr = call->ADs + ismpl*nad; + float sum = 0; + for (j=0; jqsum[j] += ptr[j]/sum; + } + } + } + } + } + + // If available, take into account reference panel AFs + if ( call->prior_AN && bcf_get_info_int32(call->hdr, rec, call->prior_AN ,&call->ac, &call->nac)==1 ) + { + int an = call->ac[0]; // number of alleles total, procede only if not zero; reuse call->ac + if ( an > 0 && bcf_get_info_int32(call->hdr, rec, call->prior_AC ,&call->ac, &call->nac)==nals_ori-1 ) // number of ALT alleles + { + int ac0 = an; // this will become the number of REFs + for (i=0; iac[i]==bcf_int32_vector_end ) break; + if ( call->ac[i]==bcf_int32_missing ) continue; + ac0 -= call->ac[i]; + + // here an*0.5 is the number of samples in the populatio and ac*0.5 is the AF weighted by the number of samples + for (j=0; jnsmpl_grp; j++) + call->smpl_grp[j].qsum[i+1] = (call->smpl_grp[j].qsum[i+1] + 0.5*call->ac[i]) / (call->smpl_grp[j].nsmpl + 0.5*an); + } + if ( ac0<0 ) error("Incorrect %s,%s values at %s:%d\n", call->prior_AN,call->prior_AC,bcf_seqname(call->hdr,rec),rec->pos+1); + for (j=0; jnsmpl_grp; j++) + call->smpl_grp[j].qsum[0] = (call->smpl_grp[j].qsum[0] + 0.5*ac0) / (call->smpl_grp[j].nsmpl + 0.5*an); + } + } + + // normalize so that QS sums to 1 for each group + for (j=0; jnsmpl_grp; j++) + { + float sum = 0; + for (i=0; ismpl_grp[j].qsum[i]; + if ( sum ) for (i=0; ismpl_grp[j].qsum[i] /= sum; + } + + bcf_update_info_int32(call->hdr, rec, "QS", NULL, 0); // remove QS tag + + if ( nals_ori > 8*sizeof(call->als_new) ) + { + fprintf(stderr,"Too many alleles at %s:%"PRId64", skipping.\n", bcf_seqname(call->hdr,rec),(int64_t) rec->pos+1); + return 0; + } + + // For each group find the best combination of alleles + call->als_new = 0; + double ref_lk = -HUGE_VAL, lk_sum = -HUGE_VAL, max_qual = -HUGE_VAL; + for (j=0; jnsmpl_grp; j++) + { + smpl_grp_t *grp = &call->smpl_grp[j]; + mcall_find_best_alleles(call, nals_ori, grp); + call->als_new |= grp->als; + if ( grp->max_lk==-HUGE_VAL ) continue; + double qual = -4.343*(grp->ref_lk - logsumexp2(grp->lk_sum,grp->ref_lk)); + if ( max_qual < qual ) + { + max_qual = qual; + lk_sum = grp->lk_sum; + ref_lk = grp->ref_lk; + } + } + + // Make sure the REF allele is always present + if ( !(call->als_new&1) ) call->als_new |= 1; + + int is_variant = call->als_new==1 ? 0 : 1; + if ( call->flag & CALL_VARONLY && !is_variant ) return 0; + + call->nals_new = 0; + for (i=0; i0 && i==unseen ) continue; + if ( call->flag & CALL_KEEPALT ) call->als_new |= 1<als_new & (1<nals_new++; + } + + init_allele_trimming_maps(call,nals_ori,call->als_new); + + int nAC = 0; + if ( call->als_new==1 ) // only REF allele on output + { + mcall_set_ref_genotypes(call,nals_ori); + bcf_update_format_int32(call->hdr, rec, "PL", NULL, 0); // remove PL, useless now + } + else if ( !is_variant ) + { + mcall_set_ref_genotypes(call,nals_ori); // running with -A, prevent mcall_call_genotypes from putting some ALT back + mcall_trim_and_update_PLs(call, rec, nals_ori, call->nals_new); + } + else + { + // The most likely set of alleles includes non-reference allele (or was enforced), call genotypes. + // Note that it is a valid outcome if the called genotypes exclude some of the ALTs. + int ngts_new = call->nals_new*(call->nals_new+1)/2; + hts_expand(float,ngts_new*nsmpl,call->nGPs,call->GPs); + for (i=0; inals_new; i++) call->ac[i] = 0; + + if ( call->flag & CALL_CONSTR_TRIO && call->nals_new>4 ) + { + fprintf(stderr,"Too many alleles at %s:%"PRId64", skipping.\n", bcf_seqname(call->hdr,rec),(int64_t) rec->pos+1); + return 0; + } + if ( call->output_tags & (CALL_FMT_GQ|CALL_FMT_GP) ) + { + memset(call->GPs,0,nsmpl*ngts_new*sizeof(*call->GPs)); + memset(call->GQs,0,nsmpl*sizeof(*call->GQs)); + } + for (i=0; insmpl_grp; i++) + { + if ( call->flag & CALL_CONSTR_TRIO ) + error("todo: constrained trio calling temporarily disabled\n"); //mcall_call_trio_genotypes(call,rec,nals,&call->smpl_grp[i]); + else + mcall_call_genotypes(call,nals_ori,&call->smpl_grp[i]); + } + + // Skip the site if all samples are 0/0. This can happen occasionally. + for (i=1; inals_new; i++) nAC += call->ac[i]; + if ( !nAC && call->flag & CALL_VARONLY ) return 0; + + if ( call->output_tags & CALL_FMT_GP ) + bcf_update_format_float(call->hdr, rec, "GP", call->GPs, nsmpl*ngts_new); + if ( call->output_tags & CALL_FMT_GQ ) + bcf_update_format_int32(call->hdr, rec, "GQ", call->GQs, nsmpl); + + mcall_trim_and_update_PLs(call,rec,nals_ori,call->nals_new); + } + if ( nals_ori!=call->nals_new ) + mcall_trim_and_update_numberR(call,rec,nals_ori,call->nals_new); + + // Set QUAL + if ( nAC ) + { + // Quality of a variant site. fabs() to avoid negative zeros in VCF output when CALL_KEEPALT is set + rec->qual = max_qual; + } + else + { + // Set the quality of a REF site + if ( lk_sum!=-HUGE_VAL ) // no support from (high quality) reads, so QUAL=1-prior + rec->qual = -4.343*(lk_sum - logsumexp2(lk_sum,ref_lk)); + else if ( call->ac[0] ) + rec->qual = call->theta ? -4.343*call->theta : 0; + else + bcf_float_set_missing(rec->qual); + } + + // AC, AN + if ( call->nals_new>1 ) bcf_update_info_int32(call->hdr, rec, "AC", call->ac+1, call->nals_new-1); + nAC += call->ac[0]; + bcf_update_info_int32(call->hdr, rec, "AN", &nAC, 1); + + // Remove unused alleles + hts_expand(char*,call->nals_new,call->nals,call->als); + for (i=0; ials_map[i]>=0 ) call->als[call->als_map[i]] = rec->d.allele[i]; + bcf_update_alleles(call->hdr, rec, (const char**)call->als, call->nals_new); + bcf_update_genotypes(call->hdr, rec, call->gts, nsmpl*2); + + // DP4 and PV4 tags + if ( bcf_get_info_float(call->hdr, rec, "I16", &call->anno16, &call->n16)==16 ) + { + int32_t dp[4]; dp[0] = call->anno16[0]; dp[1] = call->anno16[1]; dp[2] = call->anno16[2]; dp[3] = call->anno16[3]; + bcf_update_info_int32(call->hdr, rec, "DP4", dp, 4); + + int32_t mq = (call->anno16[8]+call->anno16[10])/(call->anno16[0]+call->anno16[1]+call->anno16[2]+call->anno16[3]); + bcf_update_info_int32(call->hdr, rec, "MQ", &mq, 1); + + if ( call->output_tags & CALL_FMT_PV4 ) + { + anno16_t a; + float tmpf[4]; + int is_tested = test16(call->anno16, &a) >= 0 && a.is_tested ? 1 : 0; + if ( is_tested ) + { + for (i=0; i<4; i++) tmpf[i] = a.p[i]; + bcf_update_info_float(call->hdr, rec, "PV4", tmpf, 4); + } + } + } + + bcf_update_info_int32(call->hdr, rec, "I16", NULL, 0); // remove I16 tag + + return call->nals_new; +} + diff --git a/bcftools/mcall.c.pysam.c b/bcftools/mcall.c.pysam.c new file mode 100644 index 0000000..ea57344 --- /dev/null +++ b/bcftools/mcall.c.pysam.c @@ -0,0 +1,1687 @@ +#include "bcftools.pysam.h" + +/* mcall.c -- multiallelic and rare variant calling. + + Copyright (C) 2012-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include "call.h" +#include "prob1.h" + +// Using priors for GTs does not seem to be mathematically justified. Although +// it seems effective in removing false calls, it also flips a significant +// proportion of HET genotypes. Better is to filter by FORMAT/GQ using +// `bcftools filter`. +#define USE_PRIOR_FOR_GTS 0 + +// Go with uniform PLs for samples with no coverage. If unset, missing +// genotypes is reported instead. +#define FLAT_PDG_FOR_MISSING 0 + +int test16(float *anno16, anno16_t *a); + +void qcall_init(call_t *call) { return; } +void qcall_destroy(call_t *call) { return; } +int qcall(call_t *call, bcf1_t *rec) +{ + // QCall format: + // chromosome, position, reference allele, depth, mapping quality, 0, .. + error("TODO: qcall output\n"); + return 0; +} + +void call_init_pl2p(call_t *call) +{ + int i; + for (i=0; i<256; i++) + call->pl2p[i] = pow(10., -i/10.); +} + +// Macros for accessing call->trio and call->ntrio +#define FTYPE_222 0 // family type: all diploid +#define FTYPE_121 1 // chrX, the child is a boy +#define FTYPE_122 2 // chrX, a girl +#define FTYPE_101 3 // chrY, boy +#define FTYPE_100 4 // chrY, girl + +#define GT_SKIP 0xf // empty genotype (chrY in females) + +#define IS_POW2(x) (!((x) & ((x) - 1))) // zero is permitted +#define IS_HOM(x) IS_POW2(x) + +// Pkij = P(k|i,j) tells how likely it is to be a het if the parents +// are homs etc. The consistency of i,j,k has been already checked. +// Parameters are alleles and ploidy of father, mother, kid +// Returns 2/Pkij. +int calc_Pkij(int fals, int mals, int kals, int fpl, int mpl, int kpl) +{ + int als = fals|mals|kals; + if ( IS_HOM(als) ) return 2; // all are the same: child must be a HOM, P=1 + + if ( fpl==1 ) + { + if ( kpl==1 ) // chr X, the child is a boy, the copy is inherited from the mother + { + if ( IS_HOM(mals) ) return 2; // 0 11 -> P(1) = 1 + return 4; // 0 01 -> P(0) = P(1) = 1/2 + } + // chr X, the child is a girl + if ( IS_HOM(mals) ) return 2; // 0 11 -> P(01) = 1 + return 4; // 0 01 -> P(00) = P(01) = 1/2 + } + + if ( IS_HOM(fals) && IS_HOM(mals) ) return 2; // 00 11 01, the child must be a HET, P=1 + if ( !IS_HOM(fals) && !IS_HOM(mals) ) + { + if ( IS_HOM(kals) ) return 8; // 01 01 00 or 01 01 11, P(k=HOM) = 1/4 + return 4; // 01 01 01, P(k=HET) = 1/2 + } + return 4; // 00 01, P(k=HET) = P(k=HOM) = 1/2 +} + +// Initialize ntrio and trio: ntrio lists the number of possible +// genotypes given combination of haploid/diploid genomes and the +// number of alleles. trio lists allowed genotype combinations: +// 4bit: 2/Pkij, 4: father, 4: mother, 4: child +// See also mcall_call_trio_genotypes() +// +static void mcall_init_trios(call_t *call) +{ + if ( call->prior_AN ) + { + int id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,call->prior_AN); + if ( id==-1 ) error("No such tag \"%s\"\n", call->prior_AN); + if ( !bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,id) ) error("No such FORMAT tag \"%s\"\n", call->prior_AN); + id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,call->prior_AC); + if ( id==-1 ) error("No such tag \"%s\"\n", call->prior_AC); + if ( !bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,id) ) error("No such FORMAT tag \"%s\"\n", call->prior_AC); + } + + // 23, 138, 478 possible diploid trio genotypes with 2, 3, 4 alleles + call->ntrio[FTYPE_222][2] = 15; call->ntrio[FTYPE_222][3] = 78; call->ntrio[FTYPE_222][4] = 250; + call->ntrio[FTYPE_121][2] = 8; call->ntrio[FTYPE_121][3] = 27; call->ntrio[FTYPE_121][4] = 64; + call->ntrio[FTYPE_122][2] = 8; call->ntrio[FTYPE_122][3] = 27; call->ntrio[FTYPE_122][4] = 64; + call->ntrio[FTYPE_101][2] = 2; call->ntrio[FTYPE_101][3] = 3; call->ntrio[FTYPE_101][4] = 4; + call->ntrio[FTYPE_100][2] = 2; call->ntrio[FTYPE_100][3] = 3; call->ntrio[FTYPE_100][4] = 4; + + int nals, itype; + for (itype=0; itype<=4; itype++) + { + for (nals=2; nals<=4; nals++) + call->trio[itype][nals] = (uint16_t*) malloc(sizeof(uint16_t)*call->ntrio[itype][nals]); + } + + // max 10 possible diploid genotypes + int gts[10]; + for (nals=2; nals<=4; nals++) + { + int i,j,k, n = 0, ngts = 0; + for (i=0; itrio[FTYPE_222][nals][n++] = Pkij<<12 | i<<8 | j<<4 | k; // father, mother, child + } + assert( n==call->ntrio[FTYPE_222][nals] ); + + // 121: chrX, boy + n = 0; + for (i=0; itrio[FTYPE_121][nals][n++] = Pkij<<12 | i<<8 | j<<4 | k; + } + assert( n==call->ntrio[FTYPE_121][nals] ); + + // 122: chrX, girl + n = 0; + for (i=0; itrio[FTYPE_122][nals][n++] = Pkij<<12 | i<<8 | j<<4 | k; + } + assert( n==call->ntrio[FTYPE_122][nals] ); + + // 101: chrY, boy + n = 0; + for (i=0; itrio[FTYPE_101][nals][n++] = 1<<12 | i<<8 | GT_SKIP<<4 | k; + } + assert( n==call->ntrio[FTYPE_101][nals] ); + + // 100: chrY, girl + n = 0; + for (i=0; itrio[FTYPE_100][nals][n++] = 1<<12 | i<<8 | GT_SKIP<<4 | GT_SKIP; + } + assert( n==call->ntrio[FTYPE_100][nals] ); + + } + call->GLs = (double*) calloc(bcf_hdr_nsamples(call->hdr)*10,sizeof(double)); + + int i, j; + for (i=0; infams; i++) + { + family_t *fam = &call->fams[i]; + int ploidy[3]; + for (j=0; j<3; j++) + ploidy[j] = call->ploidy[fam->sample[j]]; + + if ( ploidy[FATHER]==2 ) // not X, not Y + { + if ( ploidy[MOTHER]!=2 || ploidy[CHILD]!=2 ) + error("Incorrect ploidy: %d %d %d\n", ploidy[FATHER],ploidy[MOTHER],ploidy[CHILD]); + fam->type = FTYPE_222; + continue; + } + if ( ploidy[FATHER]!=1 || ploidy[MOTHER]==1 ) + error("Incorrect ploidy: %d %d %d\n", ploidy[FATHER],ploidy[MOTHER],ploidy[CHILD]); + if ( ploidy[MOTHER]==2 ) // X + { + if ( ploidy[CHILD]==0 ) + error("Incorrect ploidy: %d %d %d\n", ploidy[FATHER],ploidy[MOTHER],ploidy[CHILD]); + fam->type = ploidy[CHILD]==2 ? FTYPE_122 : FTYPE_121; // a girl or a boy + } + else // Y + { + if ( ploidy[CHILD]==2 ) + error("Incorrect ploidy: %d %d %d\n", ploidy[FATHER],ploidy[MOTHER],ploidy[CHILD]); + fam->type = ploidy[CHILD]==0 ? FTYPE_100 : FTYPE_101; // a girl or a boy + } + } +} +static void mcall_destroy_trios(call_t *call) +{ + int i, j; + for (i=2; i<=4; i++) + for (j=0; j<=4; j++) + free(call->trio[j][i]); +} + +static void init_sample_groups(call_t *call) +{ + int i, nsmpl = bcf_hdr_nsamples(call->hdr); + if ( !call->sample_groups ) + { + // standard pooled calling, all samples in the same group + call->nsmpl_grp = 1; + call->smpl_grp = (smpl_grp_t*)calloc(1,sizeof(*call->smpl_grp)); + call->smpl_grp[0].nsmpl = nsmpl; + call->smpl_grp[0].smpl = (uint32_t*)calloc(call->smpl_grp[0].nsmpl,sizeof(uint32_t)); + for (i=0; ismpl_grp[0].smpl[i] = i; + return; + } + + if ( call->sample_groups_tag ) + { + // Is the tag defined in the header? + int tag_id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,call->sample_groups_tag); + if ( tag_id==-1 ) error("No such tag \"%s\"\n",call->sample_groups_tag); + if ( !bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,tag_id) ) error("No such FORMAT tag \"%s\"\n", call->sample_groups_tag); + } + else + { + int tag_id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,"QS"); + if ( tag_id >= 0 && bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,tag_id) ) call->sample_groups_tag = "QS"; + else + { + tag_id = bcf_hdr_id2int(call->hdr,BCF_DT_ID,"AD"); + if ( tag_id >= 0 && bcf_hdr_idinfo_exists(call->hdr,BCF_HL_FMT,tag_id) ) call->sample_groups_tag = "AD"; + else error("Error: neither \"AD\" nor \"QS\" FORMAT tag exists and no alternative given with -G\n"); + } + } + + // Read samples/groups + if ( !strcmp("-",call->sample_groups) ) + { + // single-sample calling, each sample creates its own group + call->nsmpl_grp = nsmpl; + call->smpl_grp = (smpl_grp_t*)calloc(nsmpl,sizeof(*call->smpl_grp)); + for (i=0; ismpl_grp[i].nsmpl = 1; + call->smpl_grp[i].smpl = (uint32_t*)calloc(call->smpl_grp[i].nsmpl,sizeof(uint32_t)); + call->smpl_grp[i].smpl[0] = i; + } + } + else + { + int nlines; + char **lines = hts_readlist(call->sample_groups, 1, &nlines); + if ( !lines ) error("Could not read the file: %s\n", call->sample_groups); + + uint32_t *smpl2grp = (uint32_t*)calloc(nsmpl,sizeof(uint32_t)); + uint32_t *grp2n = (uint32_t*)calloc(nsmpl,sizeof(uint32_t)); + void *grp2idx = khash_str2int_init(); + + call->nsmpl_grp = 0; + for (i=0; isample_groups,lines[i]); + char *tmp = ptr; + while ( *ptr && isspace(*ptr) ) ptr++; + if ( !*ptr ) error("Could not parse the line in %s, expected a sample name followed by tab and a population name: %s\n",call->sample_groups,lines[i]); + *tmp = 0; + int ismpl = bcf_hdr_id2int(call->hdr, BCF_DT_SAMPLE, lines[i]); + if ( ismpl<0 ) continue; + if ( smpl2grp[ismpl] ) error("Error: the sample \"%s\" is listed twice in %s\n", lines[i],call->sample_groups); + if ( !khash_str2int_has_key(grp2idx,ptr+1) ) + { + khash_str2int_set(grp2idx, ptr+1, call->nsmpl_grp); + call->nsmpl_grp++; + } + int igrp = -1; + if ( khash_str2int_get(grp2idx, ptr+1, &igrp)!=0 ) + error("This should not happen, fixme: %s\n",ptr+1); + grp2n[igrp]++; + smpl2grp[ismpl] = igrp+1; // +1 to distinguish unlisted samples + } + khash_str2int_destroy(grp2idx); + if ( !call->nsmpl_grp ) error("Could not parse the file, no matching samples found: %s\n", call->sample_groups); + + call->smpl_grp = (smpl_grp_t*)calloc(call->nsmpl_grp,sizeof(*call->smpl_grp)); + for (i=0; ihdr->samples[i],call->sample_groups); + int igrp = smpl2grp[i] - 1; + if ( !call->smpl_grp[igrp].nsmpl ) + call->smpl_grp[igrp].smpl = (uint32_t*)calloc(grp2n[igrp],sizeof(uint32_t)); + call->smpl_grp[igrp].smpl[call->smpl_grp[igrp].nsmpl] = i; + call->smpl_grp[igrp].nsmpl++; + } + free(smpl2grp); + free(grp2n); + for (i=0; insmpl_grp; i++) + { + free(call->smpl_grp[i].qsum); + free(call->smpl_grp[i].smpl); + } + free(call->smpl_grp); +} + +void mcall_init(call_t *call) +{ + init_sample_groups(call); + call_init_pl2p(call); + + call->nals_map = 5; + call->als_map = (int*) malloc(sizeof(int)*call->nals_map); + call->npl_map = 5*(5+1)/2; // will be expanded later if necessary + call->pl_map = (int*) malloc(sizeof(int)*call->npl_map); + call->gts = (int32_t*) calloc(bcf_hdr_nsamples(call->hdr)*2,sizeof(int32_t)); // assuming at most diploid everywhere + + if ( call->flag & CALL_CONSTR_TRIO ) + { + call->cgts = (int32_t*) calloc(bcf_hdr_nsamples(call->hdr),sizeof(int32_t)); + call->ugts = (int32_t*) calloc(bcf_hdr_nsamples(call->hdr),sizeof(int32_t)); + mcall_init_trios(call); + bcf_hdr_append(call->hdr,"##FORMAT="); + bcf_hdr_append(call->hdr,"##FORMAT="); + } + if ( call->flag & CALL_CONSTR_ALLELES ) call->vcmp = vcmp_init(); + + bcf_hdr_append(call->hdr,"##FORMAT="); + if ( call->output_tags & CALL_FMT_GQ ) + bcf_hdr_append(call->hdr,"##FORMAT="); + if ( call->output_tags & CALL_FMT_GP ) + bcf_hdr_append(call->hdr,"##FORMAT="); + if ( call->output_tags & (CALL_FMT_GQ|CALL_FMT_GP) ) + call->GQs = (int32_t*) malloc(sizeof(int32_t)*bcf_hdr_nsamples(call->hdr)); + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO="); + bcf_hdr_append(call->hdr,"##INFO="); + if ( call->output_tags & CALL_FMT_PV4 ) + bcf_hdr_append(call->hdr,"##INFO=\n"); + + // init the prior + if ( call->theta>0 ) + { + int i, n = 0; + if ( !call->ploidy ) n = 2*bcf_hdr_nsamples(call->hdr); // all are diploid + else + { + for (i=0; ihdr); i++) + n += call->ploidy[i]; + } + // Watterson factor, here aM_1 = aM_2 = 1 + double aM = 1; + for (i=2; itheta *= aM; + if ( call->theta >= 1 ) + { + fprintf(bcftools_stderr,"The prior is too big (theta*aM=%.2f), going with 0.99\n", call->theta); + call->theta = 0.99; + } + call->theta = log(call->theta); + } +} + +void mcall_destroy(call_t *call) +{ + destroy_sample_groups(call); + if (call->vcmp) vcmp_destroy(call->vcmp); + free(call->itmp); + mcall_destroy_trios(call); + free(call->GPs); + free(call->ADs); + free(call->GLs); + free(call->GQs); + free(call->anno16); + free(call->PLs); + free(call->als_map); + free(call->pl_map); + free(call->gts); free(call->cgts); free(call->ugts); + free(call->pdg); + free(call->als); + free(call->ac); + return; +} + + +// Inits P(D|G): convert PLs from log space and normalize. In case of zero +// depth, missing PLs are all zero. In this case, pdg's are set to 0 +// so that the corresponding genotypes can be set as missing and the +// qual calculation is not affected. +// Missing values are replaced by generic likelihoods when X (unseen allele) is +// present. +// NB: While the -m callig model uses the pdgs in canonical order, +// the original samtools -c calling code uses pdgs in reverse order (AA comes +// first, RR last). +// NB: Ploidy is not taken into account here, which is incorrect. +void set_pdg(double *pl2p, int *PLs, double *pdg, int n_smpl, int n_gt, int unseen) +{ + int i, j, nals; + + // find out the number of alleles, expecting diploid genotype likelihoods + bcf_gt2alleles(n_gt-1, &i, &nals); + assert( i==nals ); + nals++; + + for (i=0; i new(j) + for (i=0; ials_map[i] = nout++; + else call->als_map[i] = -1; + } + + if ( !call->pl_map ) return; + + // pl_map: new(k) -> old(l) + int k = 0, l = 0; + for (i=0; ipl_map[k++] = l; + l++; + } + } +} + +/** log(exp(a)+exp(b)) */ +static inline double logsumexp2(double a, double b) +{ + if ( a>b ) + return log(1 + exp(b-a)) + a; + else + return log(1 + exp(a-b)) + b; +} + +// Macro to set the most likely alleles +#define UPDATE_MAX_LKs(als,sum) { \ + if ( max_lknsmpl; + int ngts = nals*(nals+1)/2; + + // Single allele + for (ia=0; iapdg + grp->smpl[ismpl]*ngts + iaa; + if ( *pdg ) { lk_tot += log(*pdg); lk_tot_set = 1; } + } + if ( ia==0 ) ref_lk = lk_tot; // likelihood of 0/0 for all samples + else lk_tot += call->theta; // the prior + UPDATE_MAX_LKs(1<0 && lk_tot_set); + } + + // Two alleles + if ( nals>1 ) + { + for (ia=0; iaqsum[ia]==0 ) continue; + int iaa = (ia+1)*(ia+2)/2-1; + for (ib=0; ibqsum[ib]==0 ) continue; + double lk_tot = 0; + int lk_tot_set = 0; + double fa = grp->qsum[ia]/(grp->qsum[ia] + grp->qsum[ib]); + double fb = grp->qsum[ib]/(grp->qsum[ia] + grp->qsum[ib]); + double fa2 = fa*fa; + double fb2 = fb*fb; + double fab = 2*fa*fb; + int is, ibb = (ib+1)*(ib+2)/2-1, iab = iaa - ia + ib; + for (is=0; issmpl[is]; + double *pdg = call->pdg + ismpl*ngts; + double val = 0; + if ( !call->ploidy || call->ploidy[ismpl]==2 ) + val = fa2*pdg[iaa] + fb2*pdg[ibb] + fab*pdg[iab]; + else if ( call->ploidy && call->ploidy[ismpl]==1 ) + val = fa*pdg[iaa] + fb*pdg[ibb]; + if ( val ) { lk_tot += log(val); lk_tot_set = 1; } + } + if ( ia!=0 ) lk_tot += call->theta; // the prior + if ( ib!=0 ) lk_tot += call->theta; + UPDATE_MAX_LKs(1<2 ) + { + for (ia=0; iaqsum[ia]==0 ) continue; + int iaa = (ia+1)*(ia+2)/2-1; + for (ib=0; ibqsum[ib]==0 ) continue; + int ibb = (ib+1)*(ib+2)/2-1; + int iab = iaa - ia + ib; + for (ic=0; icqsum[ic]==0 ) continue; + double lk_tot = 0; + int lk_tot_set = 0; + + double fa = grp->qsum[ia]/(grp->qsum[ia] + grp->qsum[ib] + grp->qsum[ic]); + double fb = grp->qsum[ib]/(grp->qsum[ia] + grp->qsum[ib] + grp->qsum[ic]); + double fc = grp->qsum[ic]/(grp->qsum[ia] + grp->qsum[ib] + grp->qsum[ic]); + double fa2 = fa*fa; + double fb2 = fb*fb; + double fc2 = fc*fc; + double fab = 2*fa*fb, fac = 2*fa*fc, fbc = 2*fb*fc; + int is, icc = (ic+1)*(ic+2)/2-1; + int iac = iaa - ia + ic, ibc = ibb - ib + ic; + for (is=0; issmpl[is]; + double *pdg = call->pdg + ismpl*ngts; + double val = 0; + if ( !call->ploidy || call->ploidy[ismpl]==2 ) + val = fa2*pdg[iaa] + fb2*pdg[ibb] + fc2*pdg[icc] + fab*pdg[iab] + fac*pdg[iac] + fbc*pdg[ibc]; + else if ( call->ploidy && call->ploidy[ismpl]==1 ) + val = fa*pdg[iaa] + fb*pdg[ibb] + fc*pdg[icc]; + if ( val ) { lk_tot += log(val); lk_tot_set = 1; } + } + if ( ia!=0 ) lk_tot += call->theta; // the prior + if ( ib!=0 ) lk_tot += call->theta; // the prior + if ( ic!=0 ) lk_tot += call->theta; // the prior + UPDATE_MAX_LKs(1<max_lk = max_lk; + grp->ref_lk = ref_lk; + grp->lk_sum = lk_sum; + grp->als = max_als; + grp->nals = n; + + return n; +} + +// Sets GT=0/0 or GT=. if PL=0,0,0 +static void mcall_set_ref_genotypes(call_t *call, int nals_ori) +{ + int i; + int ngts = nals_ori*(nals_ori+1)/2; // need this to distinguish between GT=0/0 vs GT=. + int nsmpl = bcf_hdr_nsamples(call->hdr); + + for (i=0; iac[i] = 0; // nals_new<=nals_ori, never mind setting extra 0's + + // Set all genotypes to 0/0 or 0 + int *gts = call->gts; + double *pdg = call->pdg; + int isample; + for (isample = 0; isample < nsmpl; isample++) + { + int ploidy = call->ploidy ? call->ploidy[isample] : 2; + for (i=0; iac[0] += ploidy; + } + gts += 2; + pdg += ngts; + } +} + +static void mcall_call_genotypes(call_t *call, int nals_ori, smpl_grp_t *grp) +{ + int ia, ib, i; + int ngts_ori = nals_ori*(nals_ori+1)/2; + int ngts_new = call->nals_new*(call->nals_new+1)/2; + int nsmpl = grp->nsmpl; + + #if USE_PRIOR_FOR_GTS + float prior = exp(call->theta); + #endif + + int is; + for (is = 0; is < nsmpl; is++) + { + int ismpl = grp->smpl[is]; + double *pdg = call->pdg + ismpl*ngts_ori; + float *gps = call->GPs + ismpl*ngts_new; + int *gts = call->gts + ismpl*2; + + int ploidy = call->ploidy ? call->ploidy[ismpl] : 2; + assert( ploidy>=0 && ploidy<=2 ); + + if ( !ploidy ) + { + gts[0] = bcf_gt_missing; + gts[1] = bcf_int32_vector_end; + gps[0] = -1; + continue; + } + + #if !FLAT_PDG_FOR_MISSING + // Skip samples with zero depth, they have all pdg's equal to 0 + for (i=0; ials & 1<qsum[ia]*grp->qsum[ia] : pdg[iaa]*grp->qsum[ia]; + #if USE_PRIOR_FOR_GTS + if ( ia!=0 ) lk *= prior; + #endif + int igt = ploidy==2 ? bcf_alleles2gt(call->als_map[ia],call->als_map[ia]) : call->als_map[ia]; + gps[igt] = lk; + if ( best_lk < lk ) + { + best_lk = lk; + gts[0] = bcf_gt_unphased(call->als_map[ia]); + } + } + if ( ploidy==2 ) + { + gts[1] = gts[0]; + for (ia=0; iaals & 1<als & 1<qsum[ia]*grp->qsum[ib]; + #if USE_PRIOR_FOR_GTS + if ( ia!=0 ) lk *= prior; + if ( ib!=0 ) lk *= prior; + #endif + int igt = bcf_alleles2gt(call->als_map[ia],call->als_map[ib]); + gps[igt] = lk; + if ( best_lk < lk ) + { + best_lk = lk; + gts[0] = bcf_gt_unphased(call->als_map[ib]); + gts[1] = bcf_gt_unphased(call->als_map[ia]); + } + } + } + } + else + gts[1] = bcf_int32_vector_end; + + call->ac[ bcf_gt_allele(gts[0]) ]++; + if ( gts[1]!=bcf_int32_vector_end ) call->ac[ bcf_gt_allele(gts[1]) ]++; + } + if ( !(call->output_tags & (CALL_FMT_GQ|CALL_FMT_GP)) ) return; + double max, sum; + for (is=0; issmpl[is]; + float *gps = call->GPs + ismpl*ngts_new; + + int nmax; + if ( call->ploidy ) + { + if ( call->ploidy[ismpl]==2 ) nmax = ngts_new; + else if ( call->ploidy[ismpl]==1 ) nmax = grp->nals; + else nmax = 0; + } + else nmax = ngts_new; + + max = gps[0]; + if ( max<0 || nmax==0 ) + { + // no call + if ( call->output_tags & CALL_FMT_GP ) + { + for (i=0; iGQs[ismpl] = 0; + continue; + } + sum = gps[0]; + for (i=1; iGQs[ismpl] = max<=INT8_MAX ? max : INT8_MAX; + if ( call->output_tags & CALL_FMT_GP ) + { + assert( max ); + for (i=0; ihdr); + int ngts = nals*(nals+1)/2; + int nout_gts = nals_new*(nals_new+1)/2; + double *gls = call->GLs - nout_gts; + double *pdg = call->pdg - ngts; + + // Calculate individuals' genotype likelihoods P(X=i) + int isample; + for (isample = 0; isample < nsmpl; isample++) + { + int ploidy = call->ploidy ? call->ploidy[isample] : 2; + int32_t *gts = call->ugts + isample; + + gls += nout_gts; + pdg += ngts; + + // Skip samples with all pdg's equal to 1. These have zero depth. + for (i=0; ismpl_grp.grp[call->smpl_grp.smpl2grp[isample]]; + double sum_lk = 0; + double best_lk = 0; + for (ia=0; iaals_map[ia],call->als_map[ia]); + double lk = ploidy==2 ? pdg[iaa]*grp->qsum[ia]*grp->qsum[ia] : pdg[iaa]*grp->qsum[ia]; + sum_lk += lk; + gls[idx] = lk; + if ( best_lk < lk ) + { + best_lk = lk; + gts[0] = bcf_alleles2gt(call->als_map[ia],call->als_map[ia]); + } + } + if ( ploidy==2 ) + { + for (ia=0; iaals_map[ia],call->als_map[ib]); + double lk = 2*pdg[iab]*grp->qsum[ia]*grp->qsum[ib]; + sum_lk += lk; + gls[idx] = lk; + if ( best_lk < lk ) + { + best_lk = lk; + gts[0] = bcf_alleles2gt(call->als_map[ib],call->als_map[ia]); + } + } + } + } + for (i=0; itrio_Pm_ins<0 && call->trio_Pm_del<0 ) trio_Pm = call->trio_Pm_SNPs; // the same Pm for indels and SNPs requested + else + { + int ret = bcf_get_variant_types(rec); + if ( !(ret & VCF_INDEL) ) trio_Pm = call->trio_Pm_SNPs; + else + { + if ( call->trio_Pm_ins<0 ) // dynamic calculation, trio_Pm_del holds the scaling factor + { + trio_Pm = rec->d.var[1].n<0 ? -21.9313 - 0.2856*rec->d.var[1].n : -22.8689 + 0.2994*rec->d.var[1].n; + trio_Pm = 1 - call->trio_Pm_del * exp(trio_Pm); + } + else // snps and indels set explicitly + { + trio_Pm = rec->d.var[1].n<0 ? call->trio_Pm_del : call->trio_Pm_ins; + } + } + } + + // Calculate constrained likelihoods and determine genotypes + int ifm; + for (ifm=0; ifmnfams; ifm++) + { + family_t *fam = &call->fams[ifm]; + int ntrio = call->ntrio[fam->type][nals_new]; + uint16_t *trio = call->trio[fam->type][nals_new]; + + // Unconstrained likelihood + int uc_itr = 0; + double uc_lk = 0; + for (i=0; i<3; i++) // for father, mother, child + { + int ismpl = fam->sample[i]; + double *gl = call->GLs + nout_gts*ismpl; + if ( gl[0]==1 ) continue; + int j, jmax = 0; + double max = gl[0]; + for (j=1; jsample[i]; + double *gl = call->GLs + nout_gts*ismpl; + if ( gl[0]==1 ) continue; + int igt = trio[itr]>>((2-i)*4) & 0xf; + assert( !call->ploidy || call->ploidy[ismpl]>0 ); + if ( igt==GT_SKIP ) continue; + lk += gl[igt]; + npresent++; + // fprintf(bcftools_stderr," %e", gl[igt]); + } + // fprintf(bcftools_stderr,"\t\t"); + double Pkij = npresent==3 ? (double)2/(trio[itr]>>12) : 1; // with missing genotypes Pkij's are different + lk += log(1 - trio_Pm * (1 - Pkij)); + // fprintf(bcftools_stderr,"%d%d%d\t%e\t%.2f\n", trio[itr]>>8&0xf,trio[itr]>>4&0xf,trio[itr]&0xf, lk, Pkij); + if ( c_lk < lk ) { c_lk = lk; c_itr = trio[itr]; } + if ( uc_itr==trio[itr] ) uc_is_mendelian = 1; + } + + if ( !uc_is_mendelian ) + { + uc_lk += log(1 - trio_Pm); + // fprintf(bcftools_stderr,"c_lk=%e uc_lk=%e c_itr=%d%d%d uc_itr=%d%d%d\n", c_lk,uc_lk,c_itr>>8&0xf,c_itr>>4&0xf,c_itr&0xf,uc_itr>>8&0xf,uc_itr>>4&0xf,uc_itr&0xf); + if ( c_lk < uc_lk ) { c_lk = uc_lk; c_itr = uc_itr; } + } + // fprintf(bcftools_stderr,"best_lk=%e best_itr=%d%d%d uc_itr=%d%d%d\n", c_lk,c_itr>>8&0xf,c_itr>>4&0xf,c_itr&0xf,uc_itr>>8&0xf,uc_itr>>4&0xf,uc_itr&0xf); + + // Set genotypes for father, mother, child and calculate genotype qualities + for (i=0; i<3; i++) + { + // GT + int ismpl = fam->sample[i]; + int igt = c_itr>>((2-i)*4) & 0xf; + double *gl = call->GLs + nout_gts*ismpl; + int32_t *gts = call->cgts + ismpl; + if ( gl[0]==1 || igt==GT_SKIP ) // zero depth, set missing genotypes + { + gts[0] = -1; + // bcf_float_set_missing(call->GQs[ismpl]); + continue; + } + gts[0] = igt; + + #if 0 + // todo: Genotype Qualities + // + // GQ: for each family member i sum over all genotypes j,k keeping igt fixed + double lk_sum = 0; + for (itr=0; itr>((2-i)*4) & 0xf) ) continue; + double lk = 0; + int j; + for (j=0; j<3; j++) + { + int jsmpl = fam->sample[j]; + double *gl = call->GLs + ngts*jsmpl; + if ( gl[0]==1 ) continue; + int jgt = trio[itr]>>((2-j)*4) & 0xf; + if ( jgt==GT_SKIP ) continue; + lk += gl[jgt]; + } + double Pkij = (double)2/(trio[itr]>>12); + lk += log(1 - trio_Pm * (1 - Pkij)); + lk_sum = logsumexp2(lk_sum, lk); + } + if ( !uc_is_mendelian && (best_itr>>((2-i)*4)&0xf)==(uc_itr>>((2-i)*4)&0xf) ) lk_sum = logsumexp2(lk_sum,uc_lk); + call->GQs[ismpl] = -4.3429*(best_lk - lk_sum); + #endif + } + } + + for (i=0; i<4; i++) call->ac[i] = 0; + call->nhets = 0; + call->ndiploid = 0; + + // Test if CGT,UGT are needed + int ucgts_needed = 0; + int32_t *cgts = call->cgts - 1; + int32_t *ugts = call->ugts - 1; + int32_t *gts = call->gts - 2; + for (isample = 0; isample < nsmpl; isample++) + { + int ploidy = call->ploidy ? call->ploidy[isample] : 2; + cgts++; + ugts++; + gts += 2; + if ( ugts[0]==-1 ) + { + gts[0] = bcf_gt_missing; + gts[1] = ploidy==2 ? bcf_gt_missing : bcf_int32_vector_end; + continue; + } + int a,b; + if ( cgts[0]!=ugts[0] ) + { + bcf_gt2alleles(cgts[0], &a, &b); + gts[0] = bcf_gt_unphased(a); + gts[1] = ploidy==1 ? bcf_int32_vector_end : bcf_gt_unphased(b); + } + else + { + bcf_gt2alleles(ugts[0], &a, &b); + gts[0] = bcf_gt_unphased(a); + gts[1] = ploidy==1 ? bcf_int32_vector_end : bcf_gt_unphased(b); + } + if ( cgts[0]!=ugts[0] ) ucgts_needed = 1; + call->ac[a]++; + if ( ploidy==2 ) + { + call->ac[b]++; + call->ndiploid++; + if ( a!=b ) call->nhets++; + } + } + if ( ucgts_needed ) + { + // Some GTs are different + bcf_update_format_int32(call->hdr,rec,"UGT",call->ugts,nsmpl); + bcf_update_format_int32(call->hdr,rec,"CGT",call->cgts,nsmpl); + } +} +#endif + +static void mcall_trim_and_update_PLs(call_t *call, bcf1_t *rec, int nals_ori, int nals_new) +{ + int npls_src = nals_ori*(nals_ori+1)/2; + int npls_dst = nals_new*(nals_new+1)/2; // number of PL values in diploid samples, ori and new + if ( call->all_diploid && npls_src == npls_dst ) return; + + int *pls_src = call->PLs, *pls_dst = call->PLs; + + int nsmpl = bcf_hdr_nsamples(call->hdr); + int isample, ia; + for (isample = 0; isample < nsmpl; isample++) + { + int ploidy = call->ploidy ? call->ploidy[isample] : 2; + if ( ploidy==2 ) + { + for (ia=0; iapl_map[ia] ]; + } + else if ( ploidy==1 ) + { + for (ia=0; iapl_map[isrc] ]; + } + if ( ia1 in mcall() + } + pls_src += npls_src; + pls_dst += npls_dst; + } + bcf_update_format_int32(call->hdr, rec, "PL", call->PLs, npls_dst*nsmpl); +} + +void mcall_trim_and_update_numberR(call_t *call, bcf1_t *rec, int nals_ori, int nals_new) +{ + if ( nals_ori==nals_new ) return; + + int i,j, nret, size = sizeof(float); + + void *tmp_ori = call->itmp, *tmp_new = call->PLs; // reusing PLs storage which is not used at this point + int ntmp_ori = call->n_itmp, ntmp_new = call->mPLs; + + // INFO fields + for (i=0; in_info; i++) + { + bcf_info_t *info = &rec->d.info[i]; + int vlen = bcf_hdr_id2length(call->hdr,BCF_HL_INFO,info->key); + if ( vlen!=BCF_VL_R ) continue; // not a Number=R tag + + int type = bcf_hdr_id2type(call->hdr,BCF_HL_INFO,info->key); + const char *key = bcf_hdr_int2id(call->hdr,BCF_DT_ID,info->key); + nret = bcf_get_info_values(call->hdr, rec, key, &tmp_ori, &ntmp_ori, type); + if ( nret<=0 ) continue; + + if ( nals_new==1 ) + bcf_update_info_int32(call->hdr, rec, key, tmp_ori, 1); // has to be the REF, the order could not change + else + { + for (j=0; jals_map[j]; + if ( k==-1 ) continue; // to be dropped + memcpy((char *)tmp_new+size*k, (char *)tmp_ori+size*j, size); + } + bcf_update_info_int32(call->hdr, rec, key, tmp_new, nals_new); + } + } + + // FORMAT fields + for (i=0; in_fmt; i++) + { + bcf_fmt_t *fmt = &rec->d.fmt[i]; + int vlen = bcf_hdr_id2length(call->hdr,BCF_HL_FMT,fmt->id); + if ( vlen!=BCF_VL_R ) continue; // not a Number=R tag + + int type = bcf_hdr_id2type(call->hdr,BCF_HL_FMT,fmt->id); + const char *key = bcf_hdr_int2id(call->hdr,BCF_DT_ID,fmt->id); + nret = bcf_get_format_values(call->hdr, rec, key, &tmp_ori, &ntmp_ori, type); + if (nret<=0) continue; + int nsmpl = bcf_hdr_nsamples(call->hdr); + + assert( nret==nals_ori*nsmpl ); + + for (j=0; jals_map[k]; + if ( l==-1 ) continue; // to be dropped + memcpy(ptr_dst+size*l, ptr_src+size*k, size); + } + } + bcf_update_format_int32(call->hdr, rec, key, tmp_new, nals_new*nsmpl); + } + + call->PLs = (int32_t*) tmp_new; + call->mPLs = ntmp_new; + call->itmp = (int32_t*) tmp_ori; + call->n_itmp = ntmp_ori; +} + + +// NB: in this function we temporarily use calls->als_map for a different +// purpose to store mapping from new (target) alleles to original alleles. +// +static int mcall_constrain_alleles(call_t *call, bcf1_t *rec, int *unseen) +{ + assert( call->tgt_als->n ); + if ( call->tgt_als->n>5 ) error("Maximum accepted number of alleles is 5, got %d\n", call->tgt_als->n); + hts_expand(char*,call->tgt_als->n+1,call->nals,call->als); + + int has_new = 0; + + int i, j, nals = 1; + for (i=1; inals_map; i++) call->als_map[i] = -1; + + if ( vcmp_set_ref(call->vcmp, rec->d.allele[0], call->tgt_als->allele[0]) < 0 ) + error("The reference alleles are not compatible at %s:%d .. %s vs %s\n", call->hdr->id[BCF_DT_CTG][rec->rid].key,rec->pos+1,call->tgt_als->allele[0],rec->d.allele[0]); + + // create mapping from new to old alleles + call->als[0] = call->tgt_als->allele[0]; + call->als_map[0] = 0; + + for (i=1; itgt_als->n; i++) + { + call->als[nals] = call->tgt_als->allele[i]; + j = vcmp_find_allele(call->vcmp, rec->d.allele+1, rec->n_allele - 1, call->tgt_als->allele[i]); + + // if ( j+1==*unseen ) + // { + // fprintf(bcftools_stderr,"Fixme? Cannot constrain to %d-th allele (%s); j=%d,unseen=%d. VCF=",i,call->tgt_als->allele[i],j,*unseen); + // int k; + // for (k=0; kn_allele; k++) fprintf(bcftools_stderr,"%s%s",k==0?"":",",rec->d.allele[k]); + // fprintf(bcftools_stderr,"\tTAB="); + // for (k=0; ktgt_als->n; k++) fprintf(bcftools_stderr,"%s%s",k==0?"":",",call->tgt_als->allele[k]); + // fprintf(bcftools_stderr,"\n"); + // return -1; + // } + + if ( j>=0 ) + { + // existing allele + call->als_map[nals] = j+1; + } + else + { + // There is a new allele in targets which is not present in VCF. + // We use the X allele to estimate PLs. Note that X may not be + // present at multiallelic indels sites. In that case we use the + // last allele anyway, because the least likely allele comes last + // in mpileup's ALT output. + call->als_map[nals] = (*unseen)>=0 ? *unseen : rec->n_allele - 1; + has_new = 1; + } + nals++; + } + if ( *unseen ) + { + call->als_map[nals] = *unseen; + call->als[nals] = rec->d.allele[*unseen]; + nals++; + } + + if ( !has_new && nals==rec->n_allele ) return 0; + bcf_update_alleles(call->hdr, rec, (const char**)call->als, nals); + + // create mapping from new PL to old PL + int k = 0; + for (i=0; ials_map[i], b = call->als_map[j]; + call->pl_map[k++] = a>b ? a*(a+1)/2 + b : b*(b+1)/2 + a; + } + } + + // update PL + call->nPLs = bcf_get_format_int32(call->hdr, rec, "PL", &call->PLs, &call->mPLs); + int nsmpl = bcf_hdr_nsamples(call->hdr); + int npls_ori = call->nPLs / nsmpl; + int npls_new = k; + hts_expand(int32_t,npls_new*nsmpl,call->n_itmp,call->itmp); + int *ori_pl = call->PLs, *new_pl = call->itmp; + for (i=0; ipl_map[k]]; + if ( new_pl[k]==bcf_int32_missing && *unseen>=0 ) + { + // missing value, and there is an unseen allele: identify the + // alleles and use the lk of either AX or XX + int k_ori = call->pl_map[k], ia, ib; + bcf_gt2alleles(k_ori, &ia, &ib); + k_ori = bcf_alleles2gt(ia,*unseen); + if ( ori_pl[k_ori]==bcf_int32_missing ) k_ori = bcf_alleles2gt(ib,*unseen); + if ( ori_pl[k_ori]==bcf_int32_missing ) k_ori = bcf_alleles2gt(*unseen,*unseen); + new_pl[k] = ori_pl[k_ori]; + } + if ( !k && new_pl[k]==bcf_int32_vector_end ) new_pl[k]=bcf_int32_missing; + } + ori_pl += npls_ori; + new_pl += npls_new; + } + bcf_update_format_int32(call->hdr, rec, "PL", call->itmp, npls_new*nsmpl); + + // update QS, use temporarily call->GPs to store the values + int nqs = bcf_get_info_float(call->hdr, rec, "QS", &call->smpl_grp[0].qsum, &call->smpl_grp[0].nqsum); + hts_expand(float,nals,call->nGPs,call->GPs); + for (i=0; iGPs[i] = call->als_map[i]smpl_grp[0].qsum[call->als_map[i]] : 0; + bcf_update_info_float(call->hdr, rec, "QS", call->GPs, nals); + + // update any Number=R tags + void *tmp_ori = call->itmp, *tmp_new = call->PLs; // reusing PLs storage which is not used at this point + int ntmp_ori = call->n_itmp, ntmp_new = call->mPLs; + for (i=0; in_fmt; i++) + { + bcf_fmt_t *fmt = &rec->d.fmt[i]; + int vlen = bcf_hdr_id2length(call->hdr,BCF_HL_FMT,fmt->id); + if ( vlen!=BCF_VL_R ) continue; // not a Number=R tag + + // NB:works only for BCF_HT_INT and BCF_HT_REAL + int type = bcf_hdr_id2type(call->hdr,BCF_HL_FMT,fmt->id); + assert( type==BCF_HT_INT || type==BCF_HT_REAL ); + assert( sizeof(float)==sizeof(int32_t) ); + + const char *key = bcf_hdr_int2id(call->hdr,BCF_DT_ID,fmt->id); + int nret = bcf_get_format_values(call->hdr, rec, key, &tmp_ori, &ntmp_ori, type); + if (nret<=0) continue; + int nsmpl = bcf_hdr_nsamples(call->hdr); + int size1 = sizeof(float); + hts_expand(float, nsmpl * nals, ntmp_new, tmp_new); + for (j=0; jn; + uint8_t *ptr_new = (uint8_t *) tmp_new + j*nals*size1; + for (k=0; kals_map[k]; + memcpy(dst,src,size1); + } + } + nret = bcf_update_format(call->hdr, rec, key, tmp_new, nsmpl*nals, type); + assert( nret==0 ); + } + call->PLs = (int32_t*) tmp_new; + call->mPLs = ntmp_new; + call->itmp = (int32_t*) tmp_ori; + call->n_itmp = ntmp_ori; + + if ( *unseen ) *unseen = nals-1; + return 0; +} + + +/** + * This function implements the multiallelic calling model. It has two major parts: + * 1) determine the most likely set of alleles and calculate the quality of ref/non-ref site + * 2) determine and set the genotypes + * In various places in between, the BCF record gets updated. + */ +int mcall(call_t *call, bcf1_t *rec) +{ + int i,j, unseen = call->unseen; + + // Force alleles when calling genotypes given alleles was requested + if ( call->flag & CALL_CONSTR_ALLELES && mcall_constrain_alleles(call, rec, &unseen)!=0 ) return -2; + + int nsmpl = bcf_hdr_nsamples(call->hdr); + int nals_ori = rec->n_allele; + hts_expand(int,nals_ori,call->nac,call->ac); + hts_expand(int,nals_ori,call->nals_map,call->als_map); + hts_expand(int,nals_ori*(nals_ori+1)/2,call->npl_map,call->pl_map); + + // Get the genotype likelihoods + call->nPLs = bcf_get_format_int32(call->hdr, rec, "PL", &call->PLs, &call->mPLs); + if ( call->nPLs!=nsmpl*nals_ori*(nals_ori+1)/2 && call->nPLs!=nsmpl*nals_ori ) // a mixture of diploid and haploid or haploid only + error("Wrong number of PL fields? nals=%d npl=%d\n", nals_ori,call->nPLs); + + // Convert PLs to probabilities + int ngts_ori = nals_ori*(nals_ori+1)/2; + hts_expand(double, call->nPLs, call->npdg, call->pdg); + set_pdg(call->pl2p, call->PLs, call->pdg, nsmpl, ngts_ori, unseen); + + // Get sum of qualities, serves as an AF estimate, f_x = QS/N in Eq. 1 in call-m math notes. + if ( call->nsmpl_grp == 1 ) + { + int nqs = bcf_get_info_float(call->hdr, rec, "QS", &call->smpl_grp[0].qsum, &call->smpl_grp[0].nqsum); + if ( nqs<=0 ) error("The QS annotation not present at %s:%d\n", bcf_seqname(call->hdr,rec),rec->pos+1); + if ( nqs < nals_ori ) + { + // Some of the listed alleles do not have the corresponding QS field. This is + // typically ref-only site with <*> in ALT. + hts_expand(float,nals_ori,call->smpl_grp[0].nqsum,call->smpl_grp[0].qsum); + for (i=nqs; ismpl_grp[0].qsum[i] = 0; + } + } + else + { + for (j=0; jnsmpl_grp; j++) + { + hts_expand(float,nals_ori,call->smpl_grp[j].nqsum,call->smpl_grp[j].qsum); + memset(call->smpl_grp[j].qsum, 0, sizeof(float)*nals_ori); + } + + // Use FORMAT/AD or FORMAT/QS + int nad = bcf_get_format_int32(call->hdr, rec, call->sample_groups_tag, &call->ADs, &call->nADs); + if ( nad<1 ) error("Error: FORMAT/%s is required with the -G option, mpileup must be run with \"-a AD\" or \"-a QS\"\n",call->sample_groups_tag); + nad /= bcf_hdr_nsamples(call->hdr); + for (i=0; insmpl_grp; i++) + { + int is; + smpl_grp_t *grp = &call->smpl_grp[i]; + hts_expand(float,nals_ori,grp->nqsum,grp->qsum); + for (j=0; jqsum[j] = 0; + for (is=0; isnsmpl; is++) + { + int ismpl = grp->smpl[is]; + int32_t *ptr = call->ADs + ismpl*nad; + float sum = 0; + for (j=0; jqsum[j] += ptr[j]/sum; + } + } + } + } + } + + // If available, take into account reference panel AFs + if ( call->prior_AN && bcf_get_info_int32(call->hdr, rec, call->prior_AN ,&call->ac, &call->nac)==1 ) + { + int an = call->ac[0]; // number of alleles total, procede only if not zero; reuse call->ac + if ( an > 0 && bcf_get_info_int32(call->hdr, rec, call->prior_AC ,&call->ac, &call->nac)==nals_ori-1 ) // number of ALT alleles + { + int ac0 = an; // this will become the number of REFs + for (i=0; iac[i]==bcf_int32_vector_end ) break; + if ( call->ac[i]==bcf_int32_missing ) continue; + ac0 -= call->ac[i]; + + // here an*0.5 is the number of samples in the populatio and ac*0.5 is the AF weighted by the number of samples + for (j=0; jnsmpl_grp; j++) + call->smpl_grp[j].qsum[i+1] = (call->smpl_grp[j].qsum[i+1] + 0.5*call->ac[i]) / (call->smpl_grp[j].nsmpl + 0.5*an); + } + if ( ac0<0 ) error("Incorrect %s,%s values at %s:%d\n", call->prior_AN,call->prior_AC,bcf_seqname(call->hdr,rec),rec->pos+1); + for (j=0; jnsmpl_grp; j++) + call->smpl_grp[j].qsum[0] = (call->smpl_grp[j].qsum[0] + 0.5*ac0) / (call->smpl_grp[j].nsmpl + 0.5*an); + } + } + + // normalize so that QS sums to 1 for each group + for (j=0; jnsmpl_grp; j++) + { + float sum = 0; + for (i=0; ismpl_grp[j].qsum[i]; + if ( sum ) for (i=0; ismpl_grp[j].qsum[i] /= sum; + } + + bcf_update_info_int32(call->hdr, rec, "QS", NULL, 0); // remove QS tag + + if ( nals_ori > 8*sizeof(call->als_new) ) + { + fprintf(bcftools_stderr,"Too many alleles at %s:%"PRId64", skipping.\n", bcf_seqname(call->hdr,rec),(int64_t) rec->pos+1); + return 0; + } + + // For each group find the best combination of alleles + call->als_new = 0; + double ref_lk = -HUGE_VAL, lk_sum = -HUGE_VAL, max_qual = -HUGE_VAL; + for (j=0; jnsmpl_grp; j++) + { + smpl_grp_t *grp = &call->smpl_grp[j]; + mcall_find_best_alleles(call, nals_ori, grp); + call->als_new |= grp->als; + if ( grp->max_lk==-HUGE_VAL ) continue; + double qual = -4.343*(grp->ref_lk - logsumexp2(grp->lk_sum,grp->ref_lk)); + if ( max_qual < qual ) + { + max_qual = qual; + lk_sum = grp->lk_sum; + ref_lk = grp->ref_lk; + } + } + + // Make sure the REF allele is always present + if ( !(call->als_new&1) ) call->als_new |= 1; + + int is_variant = call->als_new==1 ? 0 : 1; + if ( call->flag & CALL_VARONLY && !is_variant ) return 0; + + call->nals_new = 0; + for (i=0; i0 && i==unseen ) continue; + if ( call->flag & CALL_KEEPALT ) call->als_new |= 1<als_new & (1<nals_new++; + } + + init_allele_trimming_maps(call,nals_ori,call->als_new); + + int nAC = 0; + if ( call->als_new==1 ) // only REF allele on output + { + mcall_set_ref_genotypes(call,nals_ori); + bcf_update_format_int32(call->hdr, rec, "PL", NULL, 0); // remove PL, useless now + } + else if ( !is_variant ) + { + mcall_set_ref_genotypes(call,nals_ori); // running with -A, prevent mcall_call_genotypes from putting some ALT back + mcall_trim_and_update_PLs(call, rec, nals_ori, call->nals_new); + } + else + { + // The most likely set of alleles includes non-reference allele (or was enforced), call genotypes. + // Note that it is a valid outcome if the called genotypes exclude some of the ALTs. + int ngts_new = call->nals_new*(call->nals_new+1)/2; + hts_expand(float,ngts_new*nsmpl,call->nGPs,call->GPs); + for (i=0; inals_new; i++) call->ac[i] = 0; + + if ( call->flag & CALL_CONSTR_TRIO && call->nals_new>4 ) + { + fprintf(bcftools_stderr,"Too many alleles at %s:%"PRId64", skipping.\n", bcf_seqname(call->hdr,rec),(int64_t) rec->pos+1); + return 0; + } + if ( call->output_tags & (CALL_FMT_GQ|CALL_FMT_GP) ) + { + memset(call->GPs,0,nsmpl*ngts_new*sizeof(*call->GPs)); + memset(call->GQs,0,nsmpl*sizeof(*call->GQs)); + } + for (i=0; insmpl_grp; i++) + { + if ( call->flag & CALL_CONSTR_TRIO ) + error("todo: constrained trio calling temporarily disabled\n"); //mcall_call_trio_genotypes(call,rec,nals,&call->smpl_grp[i]); + else + mcall_call_genotypes(call,nals_ori,&call->smpl_grp[i]); + } + + // Skip the site if all samples are 0/0. This can happen occasionally. + for (i=1; inals_new; i++) nAC += call->ac[i]; + if ( !nAC && call->flag & CALL_VARONLY ) return 0; + + if ( call->output_tags & CALL_FMT_GP ) + bcf_update_format_float(call->hdr, rec, "GP", call->GPs, nsmpl*ngts_new); + if ( call->output_tags & CALL_FMT_GQ ) + bcf_update_format_int32(call->hdr, rec, "GQ", call->GQs, nsmpl); + + mcall_trim_and_update_PLs(call,rec,nals_ori,call->nals_new); + } + if ( nals_ori!=call->nals_new ) + mcall_trim_and_update_numberR(call,rec,nals_ori,call->nals_new); + + // Set QUAL + if ( nAC ) + { + // Quality of a variant site. fabs() to avoid negative zeros in VCF output when CALL_KEEPALT is set + rec->qual = max_qual; + } + else + { + // Set the quality of a REF site + if ( lk_sum!=-HUGE_VAL ) // no support from (high quality) reads, so QUAL=1-prior + rec->qual = -4.343*(lk_sum - logsumexp2(lk_sum,ref_lk)); + else if ( call->ac[0] ) + rec->qual = call->theta ? -4.343*call->theta : 0; + else + bcf_float_set_missing(rec->qual); + } + + // AC, AN + if ( call->nals_new>1 ) bcf_update_info_int32(call->hdr, rec, "AC", call->ac+1, call->nals_new-1); + nAC += call->ac[0]; + bcf_update_info_int32(call->hdr, rec, "AN", &nAC, 1); + + // Remove unused alleles + hts_expand(char*,call->nals_new,call->nals,call->als); + for (i=0; ials_map[i]>=0 ) call->als[call->als_map[i]] = rec->d.allele[i]; + bcf_update_alleles(call->hdr, rec, (const char**)call->als, call->nals_new); + bcf_update_genotypes(call->hdr, rec, call->gts, nsmpl*2); + + // DP4 and PV4 tags + if ( bcf_get_info_float(call->hdr, rec, "I16", &call->anno16, &call->n16)==16 ) + { + int32_t dp[4]; dp[0] = call->anno16[0]; dp[1] = call->anno16[1]; dp[2] = call->anno16[2]; dp[3] = call->anno16[3]; + bcf_update_info_int32(call->hdr, rec, "DP4", dp, 4); + + int32_t mq = (call->anno16[8]+call->anno16[10])/(call->anno16[0]+call->anno16[1]+call->anno16[2]+call->anno16[3]); + bcf_update_info_int32(call->hdr, rec, "MQ", &mq, 1); + + if ( call->output_tags & CALL_FMT_PV4 ) + { + anno16_t a; + float tmpf[4]; + int is_tested = test16(call->anno16, &a) >= 0 && a.is_tested ? 1 : 0; + if ( is_tested ) + { + for (i=0; i<4; i++) tmpf[i] = a.p[i]; + bcf_update_info_float(call->hdr, rec, "PV4", tmpf, 4); + } + } + } + + bcf_update_info_int32(call->hdr, rec, "I16", NULL, 0); // remove I16 tag + + return call->nals_new; +} + diff --git a/bcftools/mpileup.c b/bcftools/mpileup.c new file mode 100644 index 0000000..fc4f4b1 --- /dev/null +++ b/bcftools/mpileup.c @@ -0,0 +1,1558 @@ +/* mpileup.c -- mpileup subcommand. Previously bam_plcmd.c from samtools + + Copyright (C) 2008-2022 Genome Research Ltd. + Portions copyright (C) 2009-2012 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "regidx.h" +#include "bcftools.h" +#include "bam2bcf.h" +#include "bam_sample.h" +#include "gvcf.h" + +#define MPLP_BCF 1 +#define MPLP_VCF (1<<1) +#define MPLP_NO_COMP (1<<2) +#define MPLP_NO_ORPHAN (1<<3) +#define MPLP_REALN (1<<4) +#define MPLP_NO_INDEL (1<<5) +#define MPLP_REDO_BAQ (1<<6) +#define MPLP_ILLUMINA13 (1<<7) +#define MPLP_IGNORE_RG (1<<8) +#define MPLP_PRINT_POS (1<<9) +#define MPLP_PRINT_MAPQ (1<<10) +#define MPLP_PER_SAMPLE (1<<11) +#define MPLP_SMART_OVERLAPS (1<<12) +#define MPLP_REALN_PARTIAL (1<<13) + +typedef struct _mplp_aux_t mplp_aux_t; +typedef struct _mplp_pileup_t mplp_pileup_t; + +// Data shared by all bam files +typedef struct { + int min_mq, flag, min_baseQ, max_baseQ, delta_baseQ, capQ_thres, max_depth, + max_indel_depth, max_read_len, fmt_flag, ambig_reads; + int rflag_skip_any_unset, rflag_skip_all_unset, rflag_skip_any_set, rflag_skip_all_set, output_type; + int openQ, extQ, tandemQ, min_support, indel_win_size; // for indels + double min_frac; // for indels + double indel_bias; + char *reg_fname, *pl_list, *fai_fname, *output_fname; + int reg_is_file, record_cmd_line, n_threads, clevel; + faidx_t *fai; + regidx_t *bed, *reg; // bed: skipping regions, reg: index-jump to regions + regitr_t *bed_itr, *reg_itr; + int bed_logic; // 1: include region, 0: exclude region + gvcf_t *gvcf; + + // auxiliary structures for calling + bcf_callaux_t *bca; + bcf_callret1_t *bcr; + bcf_call_t bc; + bam_mplp_t iter; + mplp_aux_t **mplp_data; + int nfiles; + char **files; + mplp_pileup_t *gplp; + int *n_plp; + const bam_pileup1_t **plp; + bam_smpl_t *bsmpl; + kstring_t buf; + bcf1_t *bcf_rec; + htsFile *bcf_fp; + bcf_hdr_t *bcf_hdr; + int argc; + char **argv; +} mplp_conf_t; + +typedef struct { + char *ref[2]; + int ref_id[2]; + int ref_len[2]; +} mplp_ref_t; + +#define MPLP_REF_INIT {{NULL,NULL},{-1,-1},{0,0}} + +// Data specific to each bam file +struct _mplp_aux_t { + samFile *fp; + hts_itr_t *iter; + bam_hdr_t *h; + mplp_ref_t *ref; + const mplp_conf_t *conf; + int bam_id; + hts_idx_t *idx; // maintained only with more than one -r regions +}; + +// Data passed to htslib/mpileup +struct _mplp_pileup_t { + int n; + int *n_plp, *m_plp; + bam_pileup1_t **plp; +}; + +static int mplp_get_ref(mplp_aux_t *ma, int tid, char **ref, int *ref_len) { + mplp_ref_t *r = ma->ref; + + //printf("get ref %d {%d/%p, %d/%p}\n", tid, r->ref_id[0], r->ref[0], r->ref_id[1], r->ref[1]); + + if (!r || !ma->conf->fai) { + *ref = NULL; + return 0; + } + + // Do we need to reference count this so multiple mplp_aux_t can + // track which references are in use? + // For now we just cache the last two. Sufficient? + if (tid == r->ref_id[0]) { + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; + } + if (tid == r->ref_id[1]) { + // Last, swap over + int tmp; + tmp = r->ref_id[0]; r->ref_id[0] = r->ref_id[1]; r->ref_id[1] = tmp; + tmp = r->ref_len[0]; r->ref_len[0] = r->ref_len[1]; r->ref_len[1] = tmp; + + char *tc; + tc = r->ref[0]; r->ref[0] = r->ref[1]; r->ref[1] = tc; + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; + } + + // New, so migrate to old and load new + free(r->ref[1]); + r->ref[1] = r->ref[0]; + r->ref_id[1] = r->ref_id[0]; + r->ref_len[1] = r->ref_len[0]; + + r->ref_id[0] = tid; + r->ref[0] = faidx_fetch_seq(ma->conf->fai, + ma->h->target_name[r->ref_id[0]], + 0, + INT_MAX, + &r->ref_len[0]); + + if (!r->ref[0]) { + r->ref[0] = NULL; + r->ref_id[0] = -1; + r->ref_len[0] = 0; + *ref = NULL; + return 0; + } + + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; +} + +static int mplp_func(void *data, bam1_t *b) +{ + char *ref; + mplp_aux_t *ma = (mplp_aux_t*)data; + int ret, ref_len; + while (1) + { + int has_ref; + ret = ma->iter? sam_itr_next(ma->fp, ma->iter, b) : sam_read1(ma->fp, ma->h, b); + if (ret < 0) break; + // The 'B' cigar operation is not part of the specification, considering as obsolete. + // bam_remove_B(b); + if (b->core.tid < 0 || (b->core.flag&BAM_FUNMAP)) continue; // exclude unmapped reads + if (ma->conf->rflag_skip_any_unset && (ma->conf->rflag_skip_any_unset&b->core.flag)!=ma->conf->rflag_skip_any_unset) continue; + if (ma->conf->rflag_skip_all_set && (ma->conf->rflag_skip_all_set&b->core.flag)==ma->conf->rflag_skip_all_set) continue; + if (ma->conf->rflag_skip_all_unset && !(ma->conf->rflag_skip_all_unset&b->core.flag)) continue; + if (ma->conf->rflag_skip_any_set && ma->conf->rflag_skip_any_set&b->core.flag) continue; + if (ma->conf->bed) + { + // test overlap + regitr_t *itr = ma->conf->bed_itr; + int beg = b->core.pos, end = bam_endpos(b)-1; + int overlap = regidx_overlap(ma->conf->bed, ma->h->target_name[b->core.tid],beg,end, itr); + if ( !ma->conf->bed_logic && !overlap ) + { + // exclude only reads which are fully contained in the region + while ( regitr_overlap(itr) ) + { + if ( beg < itr->beg ) { overlap = 1; break; } + if ( end > itr->end ) { overlap = 1; break; } + } + } + if ( !overlap ) continue; + } + if ( bam_smpl_get_sample_id(ma->conf->bsmpl,ma->bam_id,b)<0 ) continue; + if (ma->conf->flag & MPLP_ILLUMINA13) { + int i; + uint8_t *qual = bam_get_qual(b); + for (i = 0; i < b->core.l_qseq; ++i) + qual[i] = qual[i] > 31? qual[i] - 31 : 0; + } + + if (ma->conf->fai && b->core.tid >= 0) { + has_ref = mplp_get_ref(ma, b->core.tid, &ref, &ref_len); + if (has_ref && ref_len <= b->core.pos) { // exclude reads outside of the reference sequence + fprintf(stderr,"[%s] Skipping because %"PRId64" is outside of %d [ref:%d]\n", + __func__, (int64_t) b->core.pos, ref_len, b->core.tid); + continue; + } + } else { + has_ref = 0; + } + + // Allow sufficient room for bam_aux_append of ZQ tag without + // a realloc and consequent breakage of pileup's cached pointers. + if (has_ref && (ma->conf->flag &MPLP_REALN) && !bam_aux_get(b, "ZQ")) { + // Doing sam_prob_realn later is problematic as it adds to + // the tag list (ZQ or BQ), which causes a realloc of b->data. + // This happens after pileup has built a hash table on the + // read name. It's a deficiency in pileup IMO. + + // We could implement a new sam_prob_realn that returns ZQ + // somewhere else and cache it ourselves (pileup clientdata), + // but for now we simply use a workaround. + // + // We create a fake tag of the correct length, which we remove + // just prior calling sam_prob_realn so we can guarantee there is + // room. (We can't just make room now as bam_copy1 removes it + // again). + if (b->core.l_qseq > 500) { + uint8_t *ZQ = malloc((uint32_t)b->core.l_qseq+1); + memset(ZQ, '@', b->core.l_qseq); + ZQ[b->core.l_qseq] = 0; + bam_aux_append(b, "_Q", 'Z', b->core.l_qseq+1, ZQ); + free(ZQ); + } else { + static uint8_t ZQ[501] = + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"; + ZQ[b->core.l_qseq] = 0; + bam_aux_append(b, "_Q", 'Z', b->core.l_qseq+1, ZQ); + ZQ[b->core.l_qseq] = '@'; + } + } + + if (has_ref && ma->conf->capQ_thres > 10) { + int q = sam_cap_mapq(b, ref, ref_len, ma->conf->capQ_thres); + if (q < 0) continue; // skip + else if (b->core.qual > q) b->core.qual = q; + } + if (b->core.qual < ma->conf->min_mq) continue; + else if ((ma->conf->flag&MPLP_NO_ORPHAN) && (b->core.flag&BAM_FPAIRED) && !(b->core.flag&BAM_FPROPER_PAIR)) continue; + + return ret; + }; + return ret; +} + +// Called once per new bam added to the pileup. +// We cache sample information here so we don't have to keep recomputing this +// on each and every pileup column. If FMT/SCR annotation is requested, a flag +// is set to indicate the presence of a soft clip. +// +// Cd is an arbitrary block of data we can write into, which ends up in +// the pileup structures. We stash the sample ID there: +// has_soft_clip .. cd->i & 1 +// sample_id .. cd->i >> 1 +static int pileup_constructor(void *data, const bam1_t *b, bam_pileup_cd *cd) +{ + mplp_aux_t *ma = (mplp_aux_t *)data; + int n = bam_smpl_get_sample_id(ma->conf->bsmpl, ma->bam_id, (bam1_t *)b); + cd->i = 0; + PLP_SET_SAMPLE_ID(cd->i, n); + // Whether read has a soft-clip is used in mplp_realn's heuristics. + // TODO: consider whether clip length is beneficial to use? + int i; + for (i=0; icore.n_cigar; i++) { + int cig = bam_get_cigar(b)[i] & BAM_CIGAR_MASK; + if (cig == BAM_CSOFT_CLIP) { + PLP_SET_SOFT_CLIP(cd->i); + break; + } + } + + if (ma->conf->flag & MPLP_REALN) { + int i; + // int tot_ins = 0; + // int p = 0; + uint32_t *cigar = bam_get_cigar(b); + for (i=0; icore.n_cigar; i++) { + int cig = cigar[i] & BAM_CIGAR_MASK; + // if (bam_cigar_type(cig) & 2) + // p += cigar[i] >> BAM_CIGAR_SHIFT; + if (cig == BAM_CINS || cig == BAM_CDEL || cig == BAM_CREF_SKIP) { + // tot_ins += cigar[i] >> BAM_CIGAR_SHIFT; + // Possible further optimsation, check tot_ins==1 later + // (and remove break) so we can detect single bp indels. + // We may want to focus BAQ on more complex regions only. + PLP_SET_INDEL(cd->i); + break; + } + + // TODO: proper p->cd struct and have cd->i as a size rather + // than a flag. + + // Then aggregate together the sizes and if just 1 size for all + // reads or 2 sizes for approx 50/50 split in all reads, then + // treat this as a well-aligned variant and don't run BAQ. + } + } + + return 0; +} + +static void group_smpl(mplp_pileup_t *m, bam_smpl_t *bsmpl, int n, int *n_plp, const bam_pileup1_t **plp) +{ + int i, j; + memset(m->n_plp, 0, m->n * sizeof(int)); + for (i = 0; i < n; ++i) // iterate over all bams + { + for (j = 0; j < n_plp[i]; ++j) // iterate over all reads available at this position + { + const bam_pileup1_t *p = plp[i] + j; + int id = PLP_SAMPLE_ID(p->cd.i); + if (m->n_plp[id] == m->m_plp[id]) + { + m->m_plp[id] = m->m_plp[id]? m->m_plp[id]<<1 : 8; + m->plp[id] = (bam_pileup1_t*) realloc(m->plp[id], sizeof(bam_pileup1_t) * m->m_plp[id]); + } + m->plp[id][m->n_plp[id]++] = *p; + } + } +} + +static void flush_bcf_records(mplp_conf_t *conf, htsFile *fp, bcf_hdr_t *hdr, bcf1_t *rec) +{ + if ( !conf->gvcf ) + { + if ( rec && bcf_write1(fp, hdr, rec)!=0 ) error("[%s] Error: failed to write the record to %s\n", __func__,conf->output_fname?conf->output_fname:"standard output"); + return; + } + + if ( !rec ) + { + gvcf_write(conf->gvcf, fp, hdr, NULL, 0); + return; + } + + int is_ref = 0; + if ( rec->n_allele==1 ) is_ref = 1; + else if ( rec->n_allele==2 ) + { + // second allele is mpileup's X, not a variant + if ( rec->d.allele[1][0]=='<' && rec->d.allele[1][1]=='*' && rec->d.allele[1][2]=='>' ) is_ref = 1; + } + rec = gvcf_write(conf->gvcf, fp, hdr, rec, is_ref); + if ( rec && bcf_write1(fp,hdr,rec)!=0 ) error("[%s] Error: failed to write the record to %s\n", __func__,conf->output_fname?conf->output_fname:"standard output"); +} + +/* + * Loops for an indel at this position. + * + * Only reads that overlap an indel loci get realigned. This considerably + * reduces the cost of running BAQ while keeping the main benefits. + * + * TODO: also consider only realigning reads that don't span the indel + * by more than a certain amount either-side. Ie focus BAQ only on reads + * ending adjacent to the indel, where the alignment is most likely to + * be wrong. (2nd TODO: do this based on sequence context; STRs bad, unique + * data good.) + * + * NB: this may sadly realign after we've already used the data. Hmm... + */ +static void mplp_realn(int n, int *n_plp, const bam_pileup1_t **plp, + int flag, int max_read_len, + char *ref, int ref_len, int pos) { + int i, j, has_indel = 0, has_clip = 0, nt = 0; + int min_indel = INT_MAX, max_indel = INT_MIN; + + // Is an indel present. + // NB: don't bother even checking if very long as almost guaranteed + // to have indel (and likely soft-clips too). + for (i = 0; i < n; i++) { // iterate over bams + nt += n_plp[i]; + for (j = 0; j < n_plp[i]; j++) { // iterate over reads + bam_pileup1_t *p = (bam_pileup1_t *)plp[i] + j; + has_indel += (PLP_HAS_INDEL(p->cd.i) || p->indel) ? 1 : 0; + // Has_clip is almost always true for very long reads + // (eg PacBio CCS), but these rarely matter as the clip + // is likely a long way from this indel. + has_clip += (PLP_HAS_SOFT_CLIP(p->cd.i)) ? 1 : 0; + if (max_indel < p->indel) + max_indel = p->indel; + if (min_indel > p->indel) + min_indel = p->indel; + } + } + + if (flag & MPLP_REALN_PARTIAL) { + if (has_indel == 0 || + (has_clip < 0.2*nt && max_indel == min_indel && + (has_indel < 0.1*nt /*|| has_indel > 0.9*nt*/ || has_indel == 1))) + return; + } + + // Realign + for (i = 0; i < n; i++) { // iterate over bams + for (j = 0; j < n_plp[i]; j++) { // iterate over reads + const bam_pileup1_t *p = plp[i] + j; + bam1_t *b = p->b; + + // Avoid doing multiple times. + // + // Note we cannot modify p->cd.i here with a PLP_SET macro + // because the cd item is held by mpileup in an lbnode_t + // struct and copied over to the pileup struct for each + // iteration, essentially making p->cd.i read only. + // + // We could use our own structure (p->cd.p), allocated during + // the constructor, but for simplicity we play dirty and + // abuse an unused flag bit instead. + if (b->core.flag & 32768) + continue; + b->core.flag |= 32768; + + if (b->core.l_qseq > max_read_len) + continue; + + // Check p->cigar_ind and see what cigar elements are before + // and after. How close is this location to the end of the + // read? Only realign if we don't span by more than X bases. + // + // Again, best only done on deeper data as BAQ helps + // disproportionately more on shallow data sets. + // + // This rescues some of the false negatives that are caused by + // systematic reduction in quality due to sample vs ref alignment. + +// At deep coverage we skip realigning more reads as we have sufficient depth. +// This rescues for false negatives. At shallow depth we pay for this with +// more FP so are more stringent on spanning size. +#define REALN_DIST (40+10*(nt<40)+10*(nt<20)) + uint32_t *cig = bam_get_cigar(b); + int ncig = b->core.n_cigar; + + // Don't realign reads where indel is in middle? + // On long read data we don't care about soft-clips at the ends. + // For short read data, we always calc BAQ on these as they're + // a common source of false positives. + if ((flag & MPLP_REALN_PARTIAL) && nt > 15 && ncig > 1) { + // Left & right cigar op match. + int lr = b->core.l_qseq > 500; + int lm = 0, rm = 0, k; + for (k = 0; k < ncig; k++) { + int cop = bam_cigar_op(cig[k]); + if (lr && (cop == BAM_CHARD_CLIP || cop == BAM_CSOFT_CLIP)) + continue; + + if (cop == BAM_CMATCH || cop == BAM_CDIFF || + cop == BAM_CEQUAL) + lm += bam_cigar_oplen(cig[k]); + else + break; + } + + for (k = ncig-1; k >= 0; k--) { + int cop = bam_cigar_op(cig[k]); + if (lr && (cop == BAM_CHARD_CLIP || cop == BAM_CSOFT_CLIP)) + continue; + + if (cop == BAM_CMATCH || cop == BAM_CDIFF || + cop == BAM_CEQUAL) + rm += bam_cigar_oplen(cig[k]); + else + break; + } + + if (lm >= REALN_DIST*4 && rm >= REALN_DIST*4) + continue; + + if (lm >= REALN_DIST && rm >= REALN_DIST && + has_clip < (0.15+0.05*(nt>20))*nt) + continue; + } + + if (b->core.l_qseq > 500) { + // don't do BAQ on long-read data if it's going to + // cause us to have a large band-with and costly in CPU + int rl = bam_cigar2rlen(b->core.n_cigar, bam_get_cigar(b)); + if (abs(rl - b->core.l_qseq) * b->core.l_qseq >= 500000) + continue; + } + + // Fudge: make room for ZQ tag. + uint8_t *_Q = bam_aux_get(b, "_Q"); + if (_Q) bam_aux_del(b, _Q); + sam_prob_realn(b, ref, ref_len, (flag & MPLP_REDO_BAQ) ? 7 : 3); + } + } + + return; +} + +static int mpileup_reg(mplp_conf_t *conf, uint32_t beg, uint32_t end) +{ + bam_hdr_t *hdr = conf->mplp_data[0]->h; // header of first file in input list + + int ret, i, tid, pos, ref_len; + char *ref; + + while ( (ret=bam_mplp_auto(conf->iter, &tid, &pos, conf->n_plp, conf->plp)) > 0) + { + if ( posend ) continue; + if ( conf->bed && tid >= 0 ) + { + int overlap = regidx_overlap(conf->bed, hdr->target_name[tid], pos, pos, NULL); + if ( !conf->bed_logic ) overlap = overlap ? 0 : 1; + if ( !overlap ) continue; + } + int has_ref = mplp_get_ref(conf->mplp_data[0], tid, &ref, &ref_len); + if (has_ref && (conf->flag & MPLP_REALN)) + mplp_realn(conf->nfiles, conf->n_plp, conf->plp, conf->flag, + conf->max_read_len, ref, ref_len, pos); + + int total_depth, _ref0, ref16; + for (i = total_depth = 0; i < conf->nfiles; ++i) total_depth += conf->n_plp[i]; + group_smpl(conf->gplp, conf->bsmpl, conf->nfiles, conf->n_plp, conf->plp); + _ref0 = (ref && pos < ref_len)? ref[pos] : 'N'; + ref16 = seq_nt16_table[_ref0]; + bcf_callaux_clean(conf->bca, &conf->bc); + for (i = 0; i < conf->gplp->n; ++i) + bcf_call_glfgen(conf->gplp->n_plp[i], conf->gplp->plp[i], ref16, conf->bca, conf->bcr + i); + conf->bc.tid = tid; conf->bc.pos = pos; + bcf_call_combine(conf->gplp->n, conf->bcr, conf->bca, ref16, &conf->bc); + bcf_clear1(conf->bcf_rec); + bcf_call2bcf(&conf->bc, conf->bcf_rec, conf->bcr, conf->fmt_flag, + conf->bca, 0); + flush_bcf_records(conf, conf->bcf_fp, conf->bcf_hdr, conf->bcf_rec); + + // call indels; todo: subsampling with total_depth>max_indel_depth instead of ignoring? + // check me: rghash in bcf_call_gap_prep() should have no effect, reads mplp_func already excludes them + if (!(conf->flag&MPLP_NO_INDEL) && total_depth < conf->max_indel_depth + && (bcf_callaux_clean(conf->bca, &conf->bc), + bcf_call_gap_prep(conf->gplp->n, conf->gplp->n_plp, conf->gplp->plp, pos, conf->bca, ref) >= 0)) + { + for (i = 0; i < conf->gplp->n; ++i) + bcf_call_glfgen(conf->gplp->n_plp[i], conf->gplp->plp[i], -1, conf->bca, conf->bcr + i); + if (bcf_call_combine(conf->gplp->n, conf->bcr, conf->bca, -1, &conf->bc) >= 0) + { + bcf_clear1(conf->bcf_rec); + bcf_call2bcf(&conf->bc, conf->bcf_rec, conf->bcr, conf->fmt_flag, conf->bca, ref); + flush_bcf_records(conf, conf->bcf_fp, conf->bcf_hdr, conf->bcf_rec); + } + } + } + return 0; +} + +static int mpileup(mplp_conf_t *conf) +{ + if (conf->nfiles == 0) { + fprintf(stderr,"[%s] no input file/data given\n", __func__); + exit(EXIT_FAILURE); + } + + mplp_ref_t mp_ref = MPLP_REF_INIT; + conf->gplp = (mplp_pileup_t *) calloc(1,sizeof(mplp_pileup_t)); + conf->mplp_data = (mplp_aux_t**) calloc(conf->nfiles, sizeof(mplp_aux_t*)); + conf->plp = (const bam_pileup1_t**) calloc(conf->nfiles, sizeof(bam_pileup1_t*)); + conf->n_plp = (int*) calloc(conf->nfiles, sizeof(int)); + + // Allow to run mpileup on multiple regions in one go. This comes at cost: the bai index + // must be kept in the memory for the whole time which can be a problem with many bams. + // Therefore if none or only one region is requested, we initialize the bam iterator as + // before and free the index. Only when multiple regions are queried, we keep the index. + int nregs = 0; + if ( conf->reg_fname ) + { + if ( conf->reg_is_file ) + { + conf->reg = regidx_init(conf->reg_fname,NULL,NULL,0,NULL); + if ( !conf->reg ) { + fprintf(stderr,"Could not parse the regions: %s\n", conf->reg_fname); + exit(EXIT_FAILURE); + } + } + else + { + conf->reg = regidx_init(NULL,regidx_parse_reg,NULL,sizeof(char*),NULL); + if ( regidx_insert_list(conf->reg,conf->reg_fname,',') !=0 ) { + fprintf(stderr,"Could not parse the regions: %s\n", conf->reg_fname); + exit(EXIT_FAILURE); + } + } + nregs = regidx_nregs(conf->reg); + conf->reg_itr = regitr_init(conf->reg); + regitr_loop(conf->reg_itr); // region iterator now positioned at the first region + } + + // read the header of each file in the list and initialize data + // beware: mpileup has always assumed that tid's are consistent in the headers, add sanity check at least! + bam_hdr_t *hdr = NULL; // header of first file in input list + int i; + for (i = 0; i < conf->nfiles; ++i) { + bam_hdr_t *h_tmp; + conf->mplp_data[i] = (mplp_aux_t*) calloc(1, sizeof(mplp_aux_t)); + conf->mplp_data[i]->fp = sam_open(conf->files[i], "rb"); + if ( !conf->mplp_data[i]->fp ) + { + fprintf(stderr, "[%s] failed to open %s: %s\n", __func__, conf->files[i], strerror(errno)); + exit(EXIT_FAILURE); + } + if (hts_set_opt(conf->mplp_data[i]->fp, CRAM_OPT_DECODE_MD, 1)) { + fprintf(stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + exit(EXIT_FAILURE); + } + if (conf->fai_fname && hts_set_fai_filename(conf->mplp_data[i]->fp, conf->fai_fname) != 0) { + fprintf(stderr, "[%s] failed to process %s: %s\n", + __func__, conf->fai_fname, strerror(errno)); + exit(EXIT_FAILURE); + } + conf->mplp_data[i]->conf = conf; + conf->mplp_data[i]->ref = &mp_ref; + h_tmp = sam_hdr_read(conf->mplp_data[i]->fp); + if ( !h_tmp ) { + fprintf(stderr,"[%s] fail to read the header of %s\n", __func__, conf->files[i]); + exit(EXIT_FAILURE); + } + conf->mplp_data[i]->h = i ? hdr : h_tmp; // for j==0, "h" has not been set yet + conf->mplp_data[i]->bam_id = bam_smpl_add_bam(conf->bsmpl,h_tmp->text,conf->files[i]); + if ( conf->mplp_data[i]->bam_id<0 ) + { + // no usable readgroups in this bam, it can be skipped + sam_close(conf->mplp_data[i]->fp); + free(conf->mplp_data[i]); + bam_hdr_destroy(h_tmp); + free(conf->files[i]); + if ( i+1nfiles ) memmove(&conf->files[i],&conf->files[i+1],sizeof(*conf->files)*(conf->nfiles-i-1)); + conf->nfiles--; + i--; + continue; + } + if (conf->reg) { + hts_idx_t *idx = sam_index_load(conf->mplp_data[i]->fp, conf->files[i]); + if (idx == NULL) { + fprintf(stderr, "[%s] fail to load index for %s\n", __func__, conf->files[i]); + exit(EXIT_FAILURE); + } + conf->buf.l = 0; + ksprintf(&conf->buf,"%s:%u-%u",conf->reg_itr->seq,conf->reg_itr->beg+1,conf->reg_itr->end+1); + conf->mplp_data[i]->iter = sam_itr_querys(idx, conf->mplp_data[i]->h, conf->buf.s); + if ( !conf->mplp_data[i]->iter ) + { + conf->mplp_data[i]->iter = sam_itr_querys(idx, conf->mplp_data[i]->h, conf->reg_itr->seq); + if ( conf->mplp_data[i]->iter ) { + fprintf(stderr,"[E::%s] fail to parse region '%s'\n", __func__, conf->buf.s); + exit(EXIT_FAILURE); + } + fprintf(stderr,"[E::%s] the sequence \"%s\" not found: %s\n",__func__,conf->reg_itr->seq,conf->files[i]); + exit(EXIT_FAILURE); + } + if ( nregs==1 ) // no need to keep the index in memory + hts_idx_destroy(idx); + else + conf->mplp_data[i]->idx = idx; + } + + if ( !hdr ) hdr = h_tmp; /* save the header of first file in list */ + else { + // FIXME: check consistency between h and h_tmp + bam_hdr_destroy(h_tmp); + + // we store only the first file's header; it's (alleged to be) + // compatible with the i-th file's target_name lookup needs + conf->mplp_data[i]->h = hdr; + } + } + if ( !hdr ) { + fprintf(stderr, "[%s] failed to find a file header with usable read groups\n", __func__); + exit(EXIT_FAILURE); + } + // allocate data storage proportionate to number of samples being studied sm->n + bam_smpl_get_samples(conf->bsmpl, &conf->gplp->n); + conf->gplp->n_plp = (int*) calloc(conf->gplp->n, sizeof(int)); + conf->gplp->m_plp = (int*) calloc(conf->gplp->n, sizeof(int)); + conf->gplp->plp = (bam_pileup1_t**) calloc(conf->gplp->n, sizeof(bam_pileup1_t*)); + + fprintf(stderr, "[%s] %d samples in %d input files\n", __func__, conf->gplp->n, conf->nfiles); + // write the VCF header + char wmode[8]; + set_wmode(wmode,conf->output_type,conf->output_fname,conf->clevel); + conf->bcf_fp = hts_open(conf->output_fname ? conf->output_fname : "-", wmode); + if (conf->bcf_fp == NULL) { + fprintf(stderr, "[%s] failed to write to %s: %s\n", __func__, conf->output_fname? conf->output_fname : "standard output", strerror(errno)); + exit(EXIT_FAILURE); + } + if ( conf->n_threads ) hts_set_threads(conf->bcf_fp, conf->n_threads); + + // BCF header creation + conf->bcf_hdr = bcf_hdr_init("w"); + conf->buf.l = 0; + + if (conf->record_cmd_line) + { + ksprintf(&conf->buf, "##bcftoolsVersion=%s+htslib-%s\n",bcftools_version(),hts_version()); + bcf_hdr_append(conf->bcf_hdr, conf->buf.s); + + conf->buf.l = 0; + ksprintf(&conf->buf, "##bcftoolsCommand=mpileup"); + for (i=1; iargc; i++) ksprintf(&conf->buf, " %s", conf->argv[i]); + kputc('\n', &conf->buf); + bcf_hdr_append(conf->bcf_hdr, conf->buf.s); + } + + if (conf->fai_fname) + { + conf->buf.l = 0; + ksprintf(&conf->buf, "##reference=file://%s\n", conf->fai_fname); + bcf_hdr_append(conf->bcf_hdr, conf->buf.s); + } + + // Translate BAM @SQ tags to BCF ##contig tags + // todo: use/write new BAM header manipulation routines, fill also UR, M5 + for (i=0; in_targets; i++) + { + conf->buf.l = 0; + ksprintf(&conf->buf, "##contig=", hdr->target_name[i], hdr->target_len[i]); + bcf_hdr_append(conf->bcf_hdr, conf->buf.s); + } + conf->buf.l = 0; + + bcf_hdr_append(conf->bcf_hdr,"##ALT="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_INFO_VDB ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + + if (conf->fmt_flag & B2B_INFO_ZSCORE) { + if ( conf->fmt_flag&B2B_INFO_RPB ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_FMT_NMBZ ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_INFO_SCB ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + } else { + if ( conf->fmt_flag&B2B_INFO_RPB ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + } + + bcf_hdr_append(conf->bcf_hdr,"##INFO="); +#if CDF_MWU_TESTS + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); +#endif + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_DP ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_DV ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_DPR ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_INFO_DPR ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_FMT_DP4 ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_SP ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_AD ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_ADF ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_ADR ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_QS ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_INFO_AD ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_INFO_ADF ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_INFO_SCR ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_FMT_SCR ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_INFO_ADR ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->gvcf ) + gvcf_update_header(conf->gvcf, conf->bcf_hdr); + + int nsmpl; + const char **smpl = bam_smpl_get_samples(conf->bsmpl, &nsmpl); + for (i=0; ibcf_hdr, smpl[i]); + if ( bcf_hdr_write(conf->bcf_fp, conf->bcf_hdr)!=0 ) error("[%s] Error: failed to write the header to %s\n",__func__,conf->output_fname?conf->output_fname:"standard output"); + + conf->bca = bcf_call_init(-1., conf->min_baseQ, conf->max_baseQ, + conf->delta_baseQ); + conf->bcr = (bcf_callret1_t*) calloc(nsmpl, sizeof(bcf_callret1_t)); + conf->bca->openQ = conf->openQ, conf->bca->extQ = conf->extQ, conf->bca->tandemQ = conf->tandemQ; + conf->bca->indel_bias = conf->indel_bias; + conf->bca->min_frac = conf->min_frac; + conf->bca->min_support = conf->min_support; + conf->bca->per_sample_flt = conf->flag & MPLP_PER_SAMPLE; + conf->bca->fmt_flag = conf->fmt_flag; + conf->bca->ambig_reads = conf->ambig_reads; + conf->bca->indel_win_size = conf->indel_win_size; + + conf->bc.bcf_hdr = conf->bcf_hdr; + conf->bc.n = nsmpl; + conf->bc.PL = (int32_t*) malloc(15 * nsmpl * sizeof(*conf->bc.PL)); + conf->bc.QS = (int32_t*) malloc(nsmpl*sizeof(*conf->bc.QS)*B2B_MAX_ALLELES); + for (i=0; ibcr[i].QS = conf->bc.QS + i*B2B_MAX_ALLELES; + if (conf->fmt_flag) + { + assert( sizeof(float)==sizeof(int32_t) ); + conf->bc.DP4 = (int32_t*) malloc(nsmpl * sizeof(int32_t) * 4); + conf->bc.fmt_arr = (uint8_t*) malloc(nsmpl * sizeof(float)); // all fmt_flag fields, float and int32 + if ( conf->fmt_flag&(B2B_INFO_DPR|B2B_FMT_DPR|B2B_INFO_AD|B2B_INFO_ADF|B2B_INFO_ADR|B2B_FMT_AD|B2B_FMT_ADF|B2B_FMT_ADR) ) + { + // first B2B_MAX_ALLELES fields for total numbers, the rest per-sample + conf->bc.ADR = (int32_t*) malloc((nsmpl+1)*B2B_MAX_ALLELES*sizeof(int32_t)); + conf->bc.ADF = (int32_t*) malloc((nsmpl+1)*B2B_MAX_ALLELES*sizeof(int32_t)); + for (i=0; ibcr[i].ADR = conf->bc.ADR + (i+1)*B2B_MAX_ALLELES; + conf->bcr[i].ADF = conf->bc.ADF + (i+1)*B2B_MAX_ALLELES; + } + } + if ( conf->fmt_flag&(B2B_INFO_SCR|B2B_FMT_SCR) ) + conf->bc.SCR = (int32_t*) malloc((nsmpl+1)*sizeof(*conf->bc.SCR)); + } + int nnmbz = (conf->fmt_flag&B2B_FMT_NMBZ) ? nsmpl + 1 : 1; + conf->bc.ref_nm = (int32_t*) malloc(sizeof(*conf->bc.ref_nm) * nnmbz * B2B_N_NM); + conf->bc.alt_nm = (int32_t*) malloc(sizeof(*conf->bc.alt_nm) * nnmbz * B2B_N_NM); + conf->bc.mwu_nm = (float*) malloc((nsmpl+1)*sizeof(*conf->bc.mwu_nm)); + conf->bca->ref_nm = conf->bc.ref_nm; // this is just to make the arrays available in bcf_call_glfgen() + conf->bca->alt_nm = conf->bc.alt_nm; + if ( conf->fmt_flag&B2B_FMT_NMBZ ) + { + for (i=0; ibcr[i].ref_nm = conf->bc.ref_nm + (i+1)*B2B_N_NM; + for (i=0; ibcr[i].alt_nm = conf->bc.alt_nm + (i+1)*B2B_N_NM; + } + + // init mpileup + conf->iter = bam_mplp_init(conf->nfiles, mplp_func, (void**)conf->mplp_data); + if ( conf->flag & MPLP_SMART_OVERLAPS ) bam_mplp_init_overlaps(conf->iter); + fprintf(stderr, "[%s] maximum number of reads per input file set to -d %d\n", __func__, conf->max_depth); + if ( (double)conf->max_depth * conf->nfiles > 1<<20) + fprintf(stderr, "Warning: Potential memory hog, up to %.0fM reads in the pileup!\n", (double)conf->max_depth*conf->nfiles); + if ( (double)conf->max_depth * conf->nfiles / nsmpl < 250 ) + fprintf(stderr, "Note: The maximum per-sample depth with -d %d is %.1fx\n", conf->max_depth,(double)conf->max_depth * conf->nfiles / nsmpl); + bam_mplp_set_maxcnt(conf->iter, conf->max_depth); + conf->max_indel_depth = conf->max_indel_depth * nsmpl; + conf->bcf_rec = bcf_init1(); + bam_mplp_constructor(conf->iter, pileup_constructor); + + // Run mpileup for multiple regions + if ( nregs ) + { + int ireg = 0; + do + { + // first region is already positioned + if ( ireg++ > 0 ) + { + conf->buf.l = 0; + ksprintf(&conf->buf,"%s:%u-%u",conf->reg_itr->seq,conf->reg_itr->beg+1,conf->reg_itr->end+1); + + for (i=0; infiles; i++) + { + hts_itr_destroy(conf->mplp_data[i]->iter); + conf->mplp_data[i]->iter = sam_itr_querys(conf->mplp_data[i]->idx, conf->mplp_data[i]->h, conf->buf.s); + if ( !conf->mplp_data[i]->iter ) + { + conf->mplp_data[i]->iter = sam_itr_querys(conf->mplp_data[i]->idx, conf->mplp_data[i]->h, conf->reg_itr->seq); + if ( conf->mplp_data[i]->iter ) { + fprintf(stderr,"[E::%s] fail to parse region '%s'\n", __func__, conf->buf.s); + exit(EXIT_FAILURE); + } + fprintf(stderr,"[E::%s] the sequence \"%s\" not found: %s\n",__func__,conf->reg_itr->seq,conf->files[i]); + exit(EXIT_FAILURE); + } + bam_mplp_reset(conf->iter); + } + } + mpileup_reg(conf,conf->reg_itr->beg,conf->reg_itr->end); + } + while ( regitr_loop(conf->reg_itr) ); + } + else + mpileup_reg(conf,0,UINT32_MAX); + + flush_bcf_records(conf, conf->bcf_fp, conf->bcf_hdr, NULL); + + // clean up + free(conf->bc.tmp.s); + bcf_destroy1(conf->bcf_rec); + if (conf->bcf_fp) + { + if ( hts_close(conf->bcf_fp)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,conf->output_fname); + bcf_hdr_destroy(conf->bcf_hdr); + bcf_call_destroy(conf->bca); + free(conf->bc.PL); + free(conf->bc.DP4); + free(conf->bc.ADR); + free(conf->bc.ADF); + free(conf->bc.SCR); + free(conf->bc.QS); + free(conf->bc.ref_nm); + free(conf->bc.alt_nm); + free(conf->bc.fmt_arr); + free(conf->bc.mwu_nm); + free(conf->bcr); + } + if ( conf->gvcf ) gvcf_destroy(conf->gvcf); + free(conf->buf.s); + for (i = 0; i < conf->gplp->n; ++i) free(conf->gplp->plp[i]); + free(conf->gplp->plp); free(conf->gplp->n_plp); free(conf->gplp->m_plp); free(conf->gplp); + bam_mplp_destroy(conf->iter); + bam_hdr_destroy(hdr); + for (i = 0; i < conf->nfiles; ++i) { + if ( nregs>1 ) hts_idx_destroy(conf->mplp_data[i]->idx); + sam_close(conf->mplp_data[i]->fp); + if ( conf->mplp_data[i]->iter) hts_itr_destroy(conf->mplp_data[i]->iter); + free(conf->mplp_data[i]); + } + if ( conf->reg_itr ) regitr_destroy(conf->reg_itr); + free(conf->mplp_data); free(conf->plp); free(conf->n_plp); + free(mp_ref.ref[0]); + free(mp_ref.ref[1]); + return 0; +} + +static int is_url(const char *s) +{ + static const char uri_scheme_chars[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+.-"; + return s[strspn(s, uri_scheme_chars)] == ':'; +} + +#define MAX_PATH_LEN 1024 +int read_file_list(const char *file_list,int *n,char **argv[]) +{ + char buf[MAX_PATH_LEN]; + int len, nfiles = 0; + char **files = NULL; + struct stat sb; + + *n = 0; + *argv = NULL; + + FILE *fh = fopen(file_list,"r"); + if ( !fh ) + { + fprintf(stderr,"%s: %s\n", file_list,strerror(errno)); + return 1; + } + + files = (char**) calloc(nfiles,sizeof(char*)); + nfiles = 0; + while ( fgets(buf,MAX_PATH_LEN,fh) ) + { + // allow empty lines and trailing spaces + len = strlen(buf); + while ( len>0 && isspace(buf[len-1]) ) len--; + if ( !len ) continue; + + // check sanity of the file list + buf[len] = 0; + if (! (is_url(buf) || stat(buf, &sb) == 0)) + { + // no such file, check if it is safe to print its name + int i, safe_to_print = 1; + for (i=0; irflag_skip_all_set); + char *tmp_skip_any_unset = bam_flag2str(mplp->rflag_skip_any_unset); + char *tmp_skip_all_unset = bam_flag2str(mplp->rflag_skip_all_unset); + char *tmp_skip_any_set = bam_flag2str(mplp->rflag_skip_any_set); + + // Display usage information, formatted for the standard 80 columns. + // (The unusual string formatting here aids the readability of this + // source code in 80 columns, to the extent that's possible.) + + fprintf(fp, + "\n" + "Usage: bcftools mpileup [options] in1.bam [in2.bam [...]]\n" + "\n" + "Input options:\n" + " -6, --illumina1.3+ Quality is in the Illumina-1.3+ encoding\n" + " -A, --count-orphans Do not discard anomalous read pairs\n" + " -b, --bam-list FILE List of input BAM filenames, one per line\n" + " -B, --no-BAQ Disable BAQ (per-Base Alignment Quality)\n" + " -C, --adjust-MQ INT Adjust mapping quality [0]\n" + " -D, --full-BAQ Apply BAQ everywhere, not just in problematic regions\n" + " -d, --max-depth INT Max raw per-file depth; avoids excessive memory usage [%d]\n", mplp->max_depth); + fprintf(fp, + " -E, --redo-BAQ Recalculate BAQ on the fly, ignore existing BQs\n" + " -f, --fasta-ref FILE Faidx indexed reference sequence file\n" + " --no-reference Do not require fasta reference file\n" + " -G, --read-groups FILE Select or exclude read groups listed in the file\n" + " -q, --min-MQ INT Skip alignments with mapQ smaller than INT [%d]\n", mplp->min_mq); + fprintf(fp, + " -Q, --min-BQ INT Skip bases with baseQ/BAQ smaller than INT [%d]\n", mplp->min_baseQ); + fprintf(fp, + " --max-BQ INT Limit baseQ/BAQ to no more than INT [%d]\n", mplp->max_baseQ); + fprintf(fp, + " --delta-BQ INT Use neighbour_qual + INT if less than qual [%d]\n", mplp->delta_baseQ); + fprintf(fp, + " -r, --regions REG[,...] Comma separated list of regions in which pileup is generated\n" + " -R, --regions-file FILE Restrict to regions listed in a file\n" + " --ignore-RG Ignore RG tags (one BAM = one sample)\n" + " --ls, --skip-all-set STR|INT Skip reads with all of the bits set []\n"); + fprintf(fp, + " --ns, --skip-any-set STR|INT Skip reads with any of the bits set [%s]\n", tmp_skip_any_set); + fprintf(fp, + " --lu, --skip-all-unset STR|INT Skip reads with all of the bits unset []\n" + " --nu, --skip-any-unset STR|INT Skip reads with any of the bits unset []\n"); + fprintf(fp, + " -s, --samples LIST Comma separated list of samples to include\n" + " -S, --samples-file FILE File of samples to include\n" + " -t, --targets REG[,...] Similar to -r but streams rather than index-jumps\n" + " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n" + " -x, --ignore-overlaps Disable read-pair overlap detection\n" + " --seed INT Random number seed used for sampling deep regions [0]\n" + "\n" + "Output options:\n" + " -a, --annotate LIST Optional tags to output; '\\?' to list available tags []\n" + " -g, --gvcf INT[,...] Group non-variant sites into gVCF blocks according\n" + " To minimum per-sample DP\n" + " --no-version Do not append version and command line to the header\n" + " -o, --output FILE Write output to FILE [standard output]\n" + " -O, --output-type TYPE 'b' compressed BCF; 'u' uncompressed BCF;\n" + " 'z' compressed VCF; 'v' uncompressed VCF; 0-9 compression level [v]\n" + " -U, --mwu-u Use older probability scale for Mann-Whitney U test\n" + " --threads INT Use multithreading with INT worker threads [0]\n" + "\n" + "SNP/INDEL genotype likelihoods options:\n" + " -X, --config STR Specify platform specific profiles (see below)\n" + " -e, --ext-prob INT Phred-scaled gap extension seq error probability [%d]\n", mplp->extQ); + fprintf(fp, + " -F, --gap-frac FLOAT Minimum fraction of gapped reads [%g]\n", mplp->min_frac); + fprintf(fp, + " -h, --tandem-qual INT Coefficient for homopolymer errors [%d]\n", mplp->tandemQ); + fprintf(fp, + " -I, --skip-indels Do not perform indel calling\n" + " -L, --max-idepth INT Maximum per-file depth for INDEL calling [%d]\n", mplp->max_indel_depth); + fprintf(fp, + " -m, --min-ireads INT Minimum number gapped reads for indel candidates [%d]\n", mplp->min_support); + fprintf(fp, + " -M, --max-read-len INT Maximum length of read to pass to BAQ algorithm [%d]\n", mplp->max_read_len); + fprintf(fp, + " -o, --open-prob INT Phred-scaled gap open seq error probability [%d]\n", mplp->openQ); + fprintf(fp, + " -p, --per-sample-mF Apply -m and -F per-sample for increased sensitivity\n" + " -P, --platforms STR Comma separated list of platforms for indels [all]\n" + " --ar, --ambig-reads STR What to do with ambiguous indel reads: drop,incAD,incAD0 [drop]\n"); + fprintf(fp, + " --indel-bias FLOAT Raise to favour recall over precision [%.2f]\n", mplp->indel_bias); + fprintf(fp, + " --indel-size INT Approximate maximum indel size considered [%d]\n", mplp->indel_win_size); + fprintf(fp,"\n"); + fprintf(fp, + "Configuration profiles activated with -X, --config:\n" + " 1.12: -Q13 -h100 -m1 -F0.002\n" + " illumina: [ default values ]\n" + " ont: -B -Q5 --max-BQ 30 -I [also try eg |bcftools call -P0.01]\n" + " pacbio-ccs: -D -Q5 --max-BQ 50 -F0.1 -o25 -e1 --delta-BQ 10 -M99999\n" + "\n" + "Notes: Assuming diploid individuals.\n" + "\n" + "Example:\n" + " # See also http://samtools.github.io/bcftools/howtos/variant-calling.html\n" + " bcftools mpileup -Ou -f reference.fa alignments.bam | bcftools call -mv -Ob -o calls.bcf\n" + "\n"); + + free(tmp_skip_all_set); + free(tmp_skip_any_unset); + free(tmp_skip_all_unset); + free(tmp_skip_any_set); +} + +int main_mpileup(int argc, char *argv[]) +{ + int c; + const char *file_list = NULL; + char **fn = NULL; + int nfiles = 0, use_orphan = 0, noref = 0; + mplp_conf_t mplp; + memset(&mplp, 0, sizeof(mplp_conf_t)); + mplp.min_baseQ = 1; + mplp.max_baseQ = 60; + mplp.delta_baseQ = 30; + mplp.capQ_thres = 0; + mplp.max_depth = 250; mplp.max_indel_depth = 250; + mplp.openQ = 40; mplp.extQ = 20; mplp.tandemQ = 500; + mplp.min_frac = 0.05; mplp.indel_bias = 1.0; mplp.min_support = 2; + mplp.flag = MPLP_NO_ORPHAN | MPLP_REALN | MPLP_REALN_PARTIAL + | MPLP_SMART_OVERLAPS; + mplp.argc = argc; mplp.argv = argv; + mplp.rflag_skip_any_set = BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP; + mplp.output_fname = NULL; + mplp.output_type = FT_VCF; + mplp.record_cmd_line = 1; + mplp.n_threads = 0; + mplp.bsmpl = bam_smpl_init(); + // the default to be changed in future, see also parse_format_flag() + mplp.fmt_flag = B2B_INFO_VDB|B2B_INFO_RPB|B2B_INFO_SCB|B2B_INFO_ZSCORE; + mplp.max_read_len = 500; + mplp.ambig_reads = B2B_DROP; + mplp.indel_win_size = 110; + mplp.clevel = -1; + hts_srand48(0); + + static const struct option lopts[] = + { + {"nu", required_argument, NULL, 16}, + {"lu", required_argument, NULL, 17}, + {"rf", required_argument, NULL, 17}, // old --rf, --incl-flags = --lu, --skip-all-unset + {"ns", required_argument, NULL, 18}, + {"ff", required_argument, NULL, 18}, // old --ff, --excl-flags = --ns, --skip-any-set + {"ls", required_argument, NULL, 19}, + {"skip-any-unset", required_argument, NULL, 16}, + {"skip-all-unset", required_argument, NULL, 17}, + {"skip-any-set", required_argument, NULL, 18}, + {"skip-all-set", required_argument, NULL, 19}, + {"output", required_argument, NULL, 3}, + {"open-prob", required_argument, NULL, 4}, + {"ignore-RG", no_argument, NULL, 5}, + {"ignore-rg", no_argument, NULL, 5}, + {"gvcf", required_argument, NULL, 'g'}, + {"no-reference", no_argument, NULL, 7}, + {"no-version", no_argument, NULL, 8}, + {"threads",required_argument,NULL,9}, + {"illumina1.3+", no_argument, NULL, '6'}, + {"count-orphans", no_argument, NULL, 'A'}, + {"bam-list", required_argument, NULL, 'b'}, + {"no-BAQ", no_argument, NULL, 'B'}, + {"no-baq", no_argument, NULL, 'B'}, + {"full-BAQ", no_argument, NULL, 'D'}, + {"full-baq", no_argument, NULL, 'D'}, + {"adjust-MQ", required_argument, NULL, 'C'}, + {"adjust-mq", required_argument, NULL, 'C'}, + {"max-depth", required_argument, NULL, 'd'}, + {"redo-BAQ", no_argument, NULL, 'E'}, + {"redo-baq", no_argument, NULL, 'E'}, + {"fasta-ref", required_argument, NULL, 'f'}, + {"read-groups", required_argument, NULL, 'G'}, + {"region", required_argument, NULL, 'r'}, + {"regions", required_argument, NULL, 'r'}, + {"regions-file", required_argument, NULL, 'R'}, + {"targets", required_argument, NULL, 't'}, + {"targets-file", required_argument, NULL, 'T'}, + {"min-MQ", required_argument, NULL, 'q'}, + {"min-mq", required_argument, NULL, 'q'}, + {"min-BQ", required_argument, NULL, 'Q'}, + {"min-bq", required_argument, NULL, 'Q'}, + {"max-bq", required_argument, NULL, 11}, + {"max-BQ", required_argument, NULL, 11}, + {"delta-BQ", required_argument, NULL, 12}, + {"ignore-overlaps", no_argument, NULL, 'x'}, + {"output-type", required_argument, NULL, 'O'}, + {"samples", required_argument, NULL, 's'}, + {"samples-file", required_argument, NULL, 'S'}, + {"annotate", required_argument, NULL, 'a'}, + {"ext-prob", required_argument, NULL, 'e'}, + {"gap-frac", required_argument, NULL, 'F'}, + {"indel-bias", required_argument, NULL, 10}, + {"indel-size", required_argument, NULL, 15}, + {"tandem-qual", required_argument, NULL, 'h'}, + {"skip-indels", no_argument, NULL, 'I'}, + {"max-idepth", required_argument, NULL, 'L'}, + {"min-ireads", required_argument, NULL, 'm'}, + {"per-sample-mF", no_argument, NULL, 'p'}, + {"per-sample-mf", no_argument, NULL, 'p'}, + {"platforms", required_argument, NULL, 'P'}, + {"max-read-len", required_argument, NULL, 'M'}, + {"config", required_argument, NULL, 'X'}, + {"mwu-u", no_argument, NULL, 'U'}, + {"seed", required_argument, NULL, 13}, + {"ambig-reads", required_argument, NULL, 14}, + {"ar", required_argument, NULL, 14}, + {NULL, 0, NULL, 0} + }; + while ((c = getopt_long(argc, argv, "Ag:f:r:R:q:Q:C:BDd:L:b:P:po:e:h:Im:F:EG:6O:xa:s:S:t:T:M:X:U",lopts,NULL)) >= 0) { + switch (c) { + case 'x': mplp.flag &= ~MPLP_SMART_OVERLAPS; break; + case 16 : + mplp.rflag_skip_any_unset = bam_str2flag(optarg); + if ( mplp.rflag_skip_any_unset <0 ) { fprintf(stderr,"Could not parse --nf %s\n", optarg); return 1; } + break; + case 17 : + mplp.rflag_skip_all_unset = bam_str2flag(optarg); + if ( mplp.rflag_skip_all_unset<0 ) { fprintf(stderr,"Could not parse --if %s\n", optarg); return 1; } + break; + case 18 : + mplp.rflag_skip_any_set = bam_str2flag(optarg); + if ( mplp.rflag_skip_any_set <0 ) { fprintf(stderr,"Could not parse --ef %s\n", optarg); return 1; } + break; + case 19 : + mplp.rflag_skip_all_set = bam_str2flag(optarg); + if ( mplp.rflag_skip_all_set <0 ) { fprintf(stderr,"Could not parse --df %s\n", optarg); return 1; } + break; + case 3 : mplp.output_fname = optarg; break; + case 4 : mplp.openQ = atoi(optarg); break; + case 5 : bam_smpl_ignore_readgroups(mplp.bsmpl); break; + case 'g': + mplp.gvcf = gvcf_init(optarg); + if ( !mplp.gvcf ) error("Could not parse: --gvcf %s\n", optarg); + break; + case 'f': + mplp.fai = fai_load(optarg); + if (mplp.fai == NULL) return 1; + mplp.fai_fname = optarg; + break; + case 7 : noref = 1; break; + case 8 : mplp.record_cmd_line = 0; break; + case 9 : mplp.n_threads = strtol(optarg, 0, 0); break; + case 'd': mplp.max_depth = atoi(optarg); break; + case 'r': mplp.reg_fname = strdup(optarg); break; + case 'R': mplp.reg_fname = strdup(optarg); mplp.reg_is_file = 1; break; + case 't': + // In the original version the whole BAM was streamed which is inefficient + // with few BED intervals and big BAMs. Todo: devise a heuristic to determine + // best strategy, that is streaming or jumping. + if ( optarg[0]=='^' ) optarg++; + else mplp.bed_logic = 1; + mplp.bed = regidx_init(NULL,regidx_parse_reg,NULL,0,NULL); + mplp.bed_itr = regitr_init(mplp.bed); + if ( regidx_insert_list(mplp.bed,optarg,',') !=0 ) + { + fprintf(stderr,"Could not parse the targets: %s\n", optarg); + exit(EXIT_FAILURE); + } + break; + case 'T': + if ( optarg[0]=='^' ) optarg++; + else mplp.bed_logic = 1; + mplp.bed = regidx_init(optarg,NULL,NULL,0,NULL); + if (!mplp.bed) { fprintf(stderr, "bcftools mpileup: Could not read file \"%s\"", optarg); return 1; } + break; + case 'P': mplp.pl_list = strdup(optarg); break; + case 'p': mplp.flag |= MPLP_PER_SAMPLE; break; + case 'B': mplp.flag &= ~MPLP_REALN; break; + case 'D': mplp.flag &= ~MPLP_REALN_PARTIAL; break; + case 'I': mplp.flag |= MPLP_NO_INDEL; break; + case 'E': mplp.flag |= MPLP_REDO_BAQ; break; + case '6': mplp.flag |= MPLP_ILLUMINA13; break; + case 's': if ( bam_smpl_add_samples(mplp.bsmpl,optarg,0)<0 ) error("Could not read samples: %s\n",optarg); break; + case 'S': if ( bam_smpl_add_samples(mplp.bsmpl,optarg,1)<0 ) error("Could not read samples: %s\n",optarg); break; + case 'O': + switch (optarg[0]) { + case 'b': mplp.output_type = FT_BCF_GZ; break; + case 'u': mplp.output_type = FT_BCF; break; + case 'z': mplp.output_type = FT_VCF_GZ; break; + case 'v': mplp.output_type = FT_VCF; break; + default: + { + char *tmp; + mplp.clevel = strtol(optarg,&tmp,10); + if ( *tmp || mplp.clevel<0 || mplp.clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + char *tmp; + mplp.clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || mplp.clevel<0 || mplp.clevel>9 ) error("Could not parse argument: --output-type %s\n", optarg+1); + } + break; + case 'C': mplp.capQ_thres = atoi(optarg); break; + case 'q': mplp.min_mq = atoi(optarg); break; + case 'Q': mplp.min_baseQ = atoi(optarg); break; + case 11: mplp.max_baseQ = atoi(optarg); break; + case 12: mplp.delta_baseQ = atoi(optarg); break; + case 'b': file_list = optarg; break; + case 'o': { + char *end; + long value = strtol(optarg, &end, 10); + // Distinguish between -o INT and -o FILE (a bit of a hack!) + if (*end == '\0') mplp.openQ = value; + else mplp.output_fname = optarg; + } + break; + case 'e': mplp.extQ = atoi(optarg); break; + case 'h': mplp.tandemQ = atoi(optarg); break; + case 10: // --indel-bias (inverted so higher => more indels called) + if (atof(optarg) < 1e-2) + mplp.indel_bias = 1/1e2; + else + mplp.indel_bias = 1/atof(optarg); + break; + case 15: { + char *tmp; + mplp.indel_win_size = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --indel-size %s\n", optarg); + if ( mplp.indel_win_size < 110 ) + { + mplp.indel_win_size = 110; + fprintf(stderr,"Warning: running with --indel-size %d, the requested value is too small\n",mplp.indel_win_size); + } + } + break; + case 'A': use_orphan = 1; break; + case 'F': mplp.min_frac = atof(optarg); break; + case 'm': mplp.min_support = atoi(optarg); break; + case 'L': mplp.max_indel_depth = atoi(optarg); break; + case 'G': bam_smpl_add_readgroups(mplp.bsmpl, optarg, 1); break; + case 'a': + if (optarg[0]=='?') { + list_annotations(stderr); + return 1; + } + mplp.fmt_flag |= parse_format_flag(optarg); + break; + case 'M': mplp.max_read_len = atoi(optarg); break; + case 'U': mplp.fmt_flag &= ~B2B_INFO_ZSCORE; break; + case 'X': + if (strcasecmp(optarg, "pacbio-ccs") == 0) { + mplp.min_frac = 0.1; + mplp.min_baseQ = 5; + mplp.max_baseQ = 50; + mplp.delta_baseQ = 10; + mplp.openQ = 25; + mplp.extQ = 1; + mplp.flag |= MPLP_REALN_PARTIAL; + mplp.max_read_len = 99999; + } else if (strcasecmp(optarg, "ont") == 0) { + fprintf(stderr, "For ONT it may be beneficial to also run bcftools call with " + "a higher -P, eg -P0.01 or -P 0.1\n"); + mplp.min_baseQ = 5; + mplp.max_baseQ = 30; + mplp.flag &= ~MPLP_REALN; + mplp.flag |= MPLP_NO_INDEL; + } else if (strcasecmp(optarg, "1.12") == 0) { + // 1.12 and earlier + mplp.min_frac = 0.002; + mplp.min_support = 1; + mplp.min_baseQ = 13; + mplp.tandemQ = 100; + mplp.flag &= ~MPLP_REALN_PARTIAL; + mplp.flag |= MPLP_REALN; + } else if (strcasecmp(optarg, "illumina") == 0) { + mplp.flag |= MPLP_REALN_PARTIAL; + } else { + fprintf(stderr, "Unknown configuration name '%s'\n" + "Please choose from 1.12, illumina, pacbio-ccs or ont\n", + optarg); + return 1; + } + break; + case 13: hts_srand48(atoi(optarg)); break; + case 14: + if ( !strcasecmp(optarg,"drop") ) mplp.ambig_reads = B2B_DROP; + else if ( !strcasecmp(optarg,"incAD") ) mplp.ambig_reads = B2B_INC_AD; + else if ( !strcasecmp(optarg,"incAD0") ) mplp.ambig_reads = B2B_INC_AD0; + else error("The option to --ambig-reads not recognised: %s\n",optarg); + break; + default: + fprintf(stderr,"Invalid option: '%c'\n", c); + return 1; + } + } + + if ( mplp.gvcf && !(mplp.fmt_flag&B2B_FMT_DP) ) + { + fprintf(stderr,"[warning] The -a DP option is required with --gvcf, switching on.\n"); + mplp.fmt_flag |= B2B_FMT_DP; + } + if ( mplp.flag&(MPLP_BCF|MPLP_VCF|MPLP_NO_COMP) ) + { + if ( mplp.flag&MPLP_VCF ) + { + if ( mplp.flag&MPLP_NO_COMP ) mplp.output_type = FT_VCF; + else mplp.output_type = FT_VCF_GZ; + } + else if ( mplp.flag&MPLP_BCF ) + { + if ( mplp.flag&MPLP_NO_COMP ) mplp.output_type = FT_BCF; + else mplp.output_type = FT_BCF_GZ; + } + } + if ( !(mplp.flag&MPLP_REALN) && mplp.flag&MPLP_REDO_BAQ ) + { + fprintf(stderr,"Error: The -B option cannot be combined with -E\n"); + return 1; + } + if (use_orphan) mplp.flag &= ~MPLP_NO_ORPHAN; + if (argc == 1) + { + print_usage(stderr, &mplp); + return 1; + } + if (!mplp.fai && !noref) { + fprintf(stderr,"Error: mpileup requires the --fasta-ref option by default; use --no-reference to run without a fasta reference\n"); + return 1; + } + int ret,i; + if (file_list) + { + if ( read_file_list(file_list,&nfiles,&fn) ) return 1; + mplp.files = fn; + mplp.nfiles = nfiles; + } + else + { + mplp.nfiles = argc - optind; + mplp.files = (char**) malloc(mplp.nfiles*sizeof(char*)); + for (i=0; i + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "regidx.h" +#include "bcftools.h" +#include "bam2bcf.h" +#include "bam_sample.h" +#include "gvcf.h" + +#define MPLP_BCF 1 +#define MPLP_VCF (1<<1) +#define MPLP_NO_COMP (1<<2) +#define MPLP_NO_ORPHAN (1<<3) +#define MPLP_REALN (1<<4) +#define MPLP_NO_INDEL (1<<5) +#define MPLP_REDO_BAQ (1<<6) +#define MPLP_ILLUMINA13 (1<<7) +#define MPLP_IGNORE_RG (1<<8) +#define MPLP_PRINT_POS (1<<9) +#define MPLP_PRINT_MAPQ (1<<10) +#define MPLP_PER_SAMPLE (1<<11) +#define MPLP_SMART_OVERLAPS (1<<12) +#define MPLP_REALN_PARTIAL (1<<13) + +typedef struct _mplp_aux_t mplp_aux_t; +typedef struct _mplp_pileup_t mplp_pileup_t; + +// Data shared by all bam files +typedef struct { + int min_mq, flag, min_baseQ, max_baseQ, delta_baseQ, capQ_thres, max_depth, + max_indel_depth, max_read_len, fmt_flag, ambig_reads; + int rflag_skip_any_unset, rflag_skip_all_unset, rflag_skip_any_set, rflag_skip_all_set, output_type; + int openQ, extQ, tandemQ, min_support, indel_win_size; // for indels + double min_frac; // for indels + double indel_bias; + char *reg_fname, *pl_list, *fai_fname, *output_fname; + int reg_is_file, record_cmd_line, n_threads, clevel; + faidx_t *fai; + regidx_t *bed, *reg; // bed: skipping regions, reg: index-jump to regions + regitr_t *bed_itr, *reg_itr; + int bed_logic; // 1: include region, 0: exclude region + gvcf_t *gvcf; + + // auxiliary structures for calling + bcf_callaux_t *bca; + bcf_callret1_t *bcr; + bcf_call_t bc; + bam_mplp_t iter; + mplp_aux_t **mplp_data; + int nfiles; + char **files; + mplp_pileup_t *gplp; + int *n_plp; + const bam_pileup1_t **plp; + bam_smpl_t *bsmpl; + kstring_t buf; + bcf1_t *bcf_rec; + htsFile *bcf_fp; + bcf_hdr_t *bcf_hdr; + int argc; + char **argv; +} mplp_conf_t; + +typedef struct { + char *ref[2]; + int ref_id[2]; + int ref_len[2]; +} mplp_ref_t; + +#define MPLP_REF_INIT {{NULL,NULL},{-1,-1},{0,0}} + +// Data specific to each bam file +struct _mplp_aux_t { + samFile *fp; + hts_itr_t *iter; + bam_hdr_t *h; + mplp_ref_t *ref; + const mplp_conf_t *conf; + int bam_id; + hts_idx_t *idx; // maintained only with more than one -r regions +}; + +// Data passed to htslib/mpileup +struct _mplp_pileup_t { + int n; + int *n_plp, *m_plp; + bam_pileup1_t **plp; +}; + +static int mplp_get_ref(mplp_aux_t *ma, int tid, char **ref, int *ref_len) { + mplp_ref_t *r = ma->ref; + + //printf("get ref %d {%d/%p, %d/%p}\n", tid, r->ref_id[0], r->ref[0], r->ref_id[1], r->ref[1]); + + if (!r || !ma->conf->fai) { + *ref = NULL; + return 0; + } + + // Do we need to reference count this so multiple mplp_aux_t can + // track which references are in use? + // For now we just cache the last two. Sufficient? + if (tid == r->ref_id[0]) { + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; + } + if (tid == r->ref_id[1]) { + // Last, swap over + int tmp; + tmp = r->ref_id[0]; r->ref_id[0] = r->ref_id[1]; r->ref_id[1] = tmp; + tmp = r->ref_len[0]; r->ref_len[0] = r->ref_len[1]; r->ref_len[1] = tmp; + + char *tc; + tc = r->ref[0]; r->ref[0] = r->ref[1]; r->ref[1] = tc; + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; + } + + // New, so migrate to old and load new + free(r->ref[1]); + r->ref[1] = r->ref[0]; + r->ref_id[1] = r->ref_id[0]; + r->ref_len[1] = r->ref_len[0]; + + r->ref_id[0] = tid; + r->ref[0] = faidx_fetch_seq(ma->conf->fai, + ma->h->target_name[r->ref_id[0]], + 0, + INT_MAX, + &r->ref_len[0]); + + if (!r->ref[0]) { + r->ref[0] = NULL; + r->ref_id[0] = -1; + r->ref_len[0] = 0; + *ref = NULL; + return 0; + } + + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; +} + +static int mplp_func(void *data, bam1_t *b) +{ + char *ref; + mplp_aux_t *ma = (mplp_aux_t*)data; + int ret, ref_len; + while (1) + { + int has_ref; + ret = ma->iter? sam_itr_next(ma->fp, ma->iter, b) : sam_read1(ma->fp, ma->h, b); + if (ret < 0) break; + // The 'B' cigar operation is not part of the specification, considering as obsolete. + // bam_remove_B(b); + if (b->core.tid < 0 || (b->core.flag&BAM_FUNMAP)) continue; // exclude unmapped reads + if (ma->conf->rflag_skip_any_unset && (ma->conf->rflag_skip_any_unset&b->core.flag)!=ma->conf->rflag_skip_any_unset) continue; + if (ma->conf->rflag_skip_all_set && (ma->conf->rflag_skip_all_set&b->core.flag)==ma->conf->rflag_skip_all_set) continue; + if (ma->conf->rflag_skip_all_unset && !(ma->conf->rflag_skip_all_unset&b->core.flag)) continue; + if (ma->conf->rflag_skip_any_set && ma->conf->rflag_skip_any_set&b->core.flag) continue; + if (ma->conf->bed) + { + // test overlap + regitr_t *itr = ma->conf->bed_itr; + int beg = b->core.pos, end = bam_endpos(b)-1; + int overlap = regidx_overlap(ma->conf->bed, ma->h->target_name[b->core.tid],beg,end, itr); + if ( !ma->conf->bed_logic && !overlap ) + { + // exclude only reads which are fully contained in the region + while ( regitr_overlap(itr) ) + { + if ( beg < itr->beg ) { overlap = 1; break; } + if ( end > itr->end ) { overlap = 1; break; } + } + } + if ( !overlap ) continue; + } + if ( bam_smpl_get_sample_id(ma->conf->bsmpl,ma->bam_id,b)<0 ) continue; + if (ma->conf->flag & MPLP_ILLUMINA13) { + int i; + uint8_t *qual = bam_get_qual(b); + for (i = 0; i < b->core.l_qseq; ++i) + qual[i] = qual[i] > 31? qual[i] - 31 : 0; + } + + if (ma->conf->fai && b->core.tid >= 0) { + has_ref = mplp_get_ref(ma, b->core.tid, &ref, &ref_len); + if (has_ref && ref_len <= b->core.pos) { // exclude reads outside of the reference sequence + fprintf(bcftools_stderr,"[%s] Skipping because %"PRId64" is outside of %d [ref:%d]\n", + __func__, (int64_t) b->core.pos, ref_len, b->core.tid); + continue; + } + } else { + has_ref = 0; + } + + // Allow sufficient room for bam_aux_append of ZQ tag without + // a realloc and consequent breakage of pileup's cached pointers. + if (has_ref && (ma->conf->flag &MPLP_REALN) && !bam_aux_get(b, "ZQ")) { + // Doing sam_prob_realn later is problematic as it adds to + // the tag list (ZQ or BQ), which causes a realloc of b->data. + // This happens after pileup has built a hash table on the + // read name. It's a deficiency in pileup IMO. + + // We could implement a new sam_prob_realn that returns ZQ + // somewhere else and cache it ourselves (pileup clientdata), + // but for now we simply use a workaround. + // + // We create a fake tag of the correct length, which we remove + // just prior calling sam_prob_realn so we can guarantee there is + // room. (We can't just make room now as bam_copy1 removes it + // again). + if (b->core.l_qseq > 500) { + uint8_t *ZQ = malloc((uint32_t)b->core.l_qseq+1); + memset(ZQ, '@', b->core.l_qseq); + ZQ[b->core.l_qseq] = 0; + bam_aux_append(b, "_Q", 'Z', b->core.l_qseq+1, ZQ); + free(ZQ); + } else { + static uint8_t ZQ[501] = + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"; + ZQ[b->core.l_qseq] = 0; + bam_aux_append(b, "_Q", 'Z', b->core.l_qseq+1, ZQ); + ZQ[b->core.l_qseq] = '@'; + } + } + + if (has_ref && ma->conf->capQ_thres > 10) { + int q = sam_cap_mapq(b, ref, ref_len, ma->conf->capQ_thres); + if (q < 0) continue; // skip + else if (b->core.qual > q) b->core.qual = q; + } + if (b->core.qual < ma->conf->min_mq) continue; + else if ((ma->conf->flag&MPLP_NO_ORPHAN) && (b->core.flag&BAM_FPAIRED) && !(b->core.flag&BAM_FPROPER_PAIR)) continue; + + return ret; + }; + return ret; +} + +// Called once per new bam added to the pileup. +// We cache sample information here so we don't have to keep recomputing this +// on each and every pileup column. If FMT/SCR annotation is requested, a flag +// is set to indicate the presence of a soft clip. +// +// Cd is an arbitrary block of data we can write into, which ends up in +// the pileup structures. We stash the sample ID there: +// has_soft_clip .. cd->i & 1 +// sample_id .. cd->i >> 1 +static int pileup_constructor(void *data, const bam1_t *b, bam_pileup_cd *cd) +{ + mplp_aux_t *ma = (mplp_aux_t *)data; + int n = bam_smpl_get_sample_id(ma->conf->bsmpl, ma->bam_id, (bam1_t *)b); + cd->i = 0; + PLP_SET_SAMPLE_ID(cd->i, n); + // Whether read has a soft-clip is used in mplp_realn's heuristics. + // TODO: consider whether clip length is beneficial to use? + int i; + for (i=0; icore.n_cigar; i++) { + int cig = bam_get_cigar(b)[i] & BAM_CIGAR_MASK; + if (cig == BAM_CSOFT_CLIP) { + PLP_SET_SOFT_CLIP(cd->i); + break; + } + } + + if (ma->conf->flag & MPLP_REALN) { + int i; + // int tot_ins = 0; + // int p = 0; + uint32_t *cigar = bam_get_cigar(b); + for (i=0; icore.n_cigar; i++) { + int cig = cigar[i] & BAM_CIGAR_MASK; + // if (bam_cigar_type(cig) & 2) + // p += cigar[i] >> BAM_CIGAR_SHIFT; + if (cig == BAM_CINS || cig == BAM_CDEL || cig == BAM_CREF_SKIP) { + // tot_ins += cigar[i] >> BAM_CIGAR_SHIFT; + // Possible further optimsation, check tot_ins==1 later + // (and remove break) so we can detect single bp indels. + // We may want to focus BAQ on more complex regions only. + PLP_SET_INDEL(cd->i); + break; + } + + // TODO: proper p->cd struct and have cd->i as a size rather + // than a flag. + + // Then aggregate together the sizes and if just 1 size for all + // reads or 2 sizes for approx 50/50 split in all reads, then + // treat this as a well-aligned variant and don't run BAQ. + } + } + + return 0; +} + +static void group_smpl(mplp_pileup_t *m, bam_smpl_t *bsmpl, int n, int *n_plp, const bam_pileup1_t **plp) +{ + int i, j; + memset(m->n_plp, 0, m->n * sizeof(int)); + for (i = 0; i < n; ++i) // iterate over all bams + { + for (j = 0; j < n_plp[i]; ++j) // iterate over all reads available at this position + { + const bam_pileup1_t *p = plp[i] + j; + int id = PLP_SAMPLE_ID(p->cd.i); + if (m->n_plp[id] == m->m_plp[id]) + { + m->m_plp[id] = m->m_plp[id]? m->m_plp[id]<<1 : 8; + m->plp[id] = (bam_pileup1_t*) realloc(m->plp[id], sizeof(bam_pileup1_t) * m->m_plp[id]); + } + m->plp[id][m->n_plp[id]++] = *p; + } + } +} + +static void flush_bcf_records(mplp_conf_t *conf, htsFile *fp, bcf_hdr_t *hdr, bcf1_t *rec) +{ + if ( !conf->gvcf ) + { + if ( rec && bcf_write1(fp, hdr, rec)!=0 ) error("[%s] Error: failed to write the record to %s\n", __func__,conf->output_fname?conf->output_fname:"standard output"); + return; + } + + if ( !rec ) + { + gvcf_write(conf->gvcf, fp, hdr, NULL, 0); + return; + } + + int is_ref = 0; + if ( rec->n_allele==1 ) is_ref = 1; + else if ( rec->n_allele==2 ) + { + // second allele is mpileup's X, not a variant + if ( rec->d.allele[1][0]=='<' && rec->d.allele[1][1]=='*' && rec->d.allele[1][2]=='>' ) is_ref = 1; + } + rec = gvcf_write(conf->gvcf, fp, hdr, rec, is_ref); + if ( rec && bcf_write1(fp,hdr,rec)!=0 ) error("[%s] Error: failed to write the record to %s\n", __func__,conf->output_fname?conf->output_fname:"standard output"); +} + +/* + * Loops for an indel at this position. + * + * Only reads that overlap an indel loci get realigned. This considerably + * reduces the cost of running BAQ while keeping the main benefits. + * + * TODO: also consider only realigning reads that don't span the indel + * by more than a certain amount either-side. Ie focus BAQ only on reads + * ending adjacent to the indel, where the alignment is most likely to + * be wrong. (2nd TODO: do this based on sequence context; STRs bad, unique + * data good.) + * + * NB: this may sadly realign after we've already used the data. Hmm... + */ +static void mplp_realn(int n, int *n_plp, const bam_pileup1_t **plp, + int flag, int max_read_len, + char *ref, int ref_len, int pos) { + int i, j, has_indel = 0, has_clip = 0, nt = 0; + int min_indel = INT_MAX, max_indel = INT_MIN; + + // Is an indel present. + // NB: don't bother even checking if very long as almost guaranteed + // to have indel (and likely soft-clips too). + for (i = 0; i < n; i++) { // iterate over bams + nt += n_plp[i]; + for (j = 0; j < n_plp[i]; j++) { // iterate over reads + bam_pileup1_t *p = (bam_pileup1_t *)plp[i] + j; + has_indel += (PLP_HAS_INDEL(p->cd.i) || p->indel) ? 1 : 0; + // Has_clip is almost always true for very long reads + // (eg PacBio CCS), but these rarely matter as the clip + // is likely a long way from this indel. + has_clip += (PLP_HAS_SOFT_CLIP(p->cd.i)) ? 1 : 0; + if (max_indel < p->indel) + max_indel = p->indel; + if (min_indel > p->indel) + min_indel = p->indel; + } + } + + if (flag & MPLP_REALN_PARTIAL) { + if (has_indel == 0 || + (has_clip < 0.2*nt && max_indel == min_indel && + (has_indel < 0.1*nt /*|| has_indel > 0.9*nt*/ || has_indel == 1))) + return; + } + + // Realign + for (i = 0; i < n; i++) { // iterate over bams + for (j = 0; j < n_plp[i]; j++) { // iterate over reads + const bam_pileup1_t *p = plp[i] + j; + bam1_t *b = p->b; + + // Avoid doing multiple times. + // + // Note we cannot modify p->cd.i here with a PLP_SET macro + // because the cd item is held by mpileup in an lbnode_t + // struct and copied over to the pileup struct for each + // iteration, essentially making p->cd.i read only. + // + // We could use our own structure (p->cd.p), allocated during + // the constructor, but for simplicity we play dirty and + // abuse an unused flag bit instead. + if (b->core.flag & 32768) + continue; + b->core.flag |= 32768; + + if (b->core.l_qseq > max_read_len) + continue; + + // Check p->cigar_ind and see what cigar elements are before + // and after. How close is this location to the end of the + // read? Only realign if we don't span by more than X bases. + // + // Again, best only done on deeper data as BAQ helps + // disproportionately more on shallow data sets. + // + // This rescues some of the false negatives that are caused by + // systematic reduction in quality due to sample vs ref alignment. + +// At deep coverage we skip realigning more reads as we have sufficient depth. +// This rescues for false negatives. At shallow depth we pay for this with +// more FP so are more stringent on spanning size. +#define REALN_DIST (40+10*(nt<40)+10*(nt<20)) + uint32_t *cig = bam_get_cigar(b); + int ncig = b->core.n_cigar; + + // Don't realign reads where indel is in middle? + // On long read data we don't care about soft-clips at the ends. + // For short read data, we always calc BAQ on these as they're + // a common source of false positives. + if ((flag & MPLP_REALN_PARTIAL) && nt > 15 && ncig > 1) { + // Left & right cigar op match. + int lr = b->core.l_qseq > 500; + int lm = 0, rm = 0, k; + for (k = 0; k < ncig; k++) { + int cop = bam_cigar_op(cig[k]); + if (lr && (cop == BAM_CHARD_CLIP || cop == BAM_CSOFT_CLIP)) + continue; + + if (cop == BAM_CMATCH || cop == BAM_CDIFF || + cop == BAM_CEQUAL) + lm += bam_cigar_oplen(cig[k]); + else + break; + } + + for (k = ncig-1; k >= 0; k--) { + int cop = bam_cigar_op(cig[k]); + if (lr && (cop == BAM_CHARD_CLIP || cop == BAM_CSOFT_CLIP)) + continue; + + if (cop == BAM_CMATCH || cop == BAM_CDIFF || + cop == BAM_CEQUAL) + rm += bam_cigar_oplen(cig[k]); + else + break; + } + + if (lm >= REALN_DIST*4 && rm >= REALN_DIST*4) + continue; + + if (lm >= REALN_DIST && rm >= REALN_DIST && + has_clip < (0.15+0.05*(nt>20))*nt) + continue; + } + + if (b->core.l_qseq > 500) { + // don't do BAQ on long-read data if it's going to + // cause us to have a large band-with and costly in CPU + int rl = bam_cigar2rlen(b->core.n_cigar, bam_get_cigar(b)); + if (abs(rl - b->core.l_qseq) * b->core.l_qseq >= 500000) + continue; + } + + // Fudge: make room for ZQ tag. + uint8_t *_Q = bam_aux_get(b, "_Q"); + if (_Q) bam_aux_del(b, _Q); + sam_prob_realn(b, ref, ref_len, (flag & MPLP_REDO_BAQ) ? 7 : 3); + } + } + + return; +} + +static int mpileup_reg(mplp_conf_t *conf, uint32_t beg, uint32_t end) +{ + bam_hdr_t *hdr = conf->mplp_data[0]->h; // header of first file in input list + + int ret, i, tid, pos, ref_len; + char *ref; + + while ( (ret=bam_mplp_auto(conf->iter, &tid, &pos, conf->n_plp, conf->plp)) > 0) + { + if ( posend ) continue; + if ( conf->bed && tid >= 0 ) + { + int overlap = regidx_overlap(conf->bed, hdr->target_name[tid], pos, pos, NULL); + if ( !conf->bed_logic ) overlap = overlap ? 0 : 1; + if ( !overlap ) continue; + } + int has_ref = mplp_get_ref(conf->mplp_data[0], tid, &ref, &ref_len); + if (has_ref && (conf->flag & MPLP_REALN)) + mplp_realn(conf->nfiles, conf->n_plp, conf->plp, conf->flag, + conf->max_read_len, ref, ref_len, pos); + + int total_depth, _ref0, ref16; + for (i = total_depth = 0; i < conf->nfiles; ++i) total_depth += conf->n_plp[i]; + group_smpl(conf->gplp, conf->bsmpl, conf->nfiles, conf->n_plp, conf->plp); + _ref0 = (ref && pos < ref_len)? ref[pos] : 'N'; + ref16 = seq_nt16_table[_ref0]; + bcf_callaux_clean(conf->bca, &conf->bc); + for (i = 0; i < conf->gplp->n; ++i) + bcf_call_glfgen(conf->gplp->n_plp[i], conf->gplp->plp[i], ref16, conf->bca, conf->bcr + i); + conf->bc.tid = tid; conf->bc.pos = pos; + bcf_call_combine(conf->gplp->n, conf->bcr, conf->bca, ref16, &conf->bc); + bcf_clear1(conf->bcf_rec); + bcf_call2bcf(&conf->bc, conf->bcf_rec, conf->bcr, conf->fmt_flag, + conf->bca, 0); + flush_bcf_records(conf, conf->bcf_fp, conf->bcf_hdr, conf->bcf_rec); + + // call indels; todo: subsampling with total_depth>max_indel_depth instead of ignoring? + // check me: rghash in bcf_call_gap_prep() should have no effect, reads mplp_func already excludes them + if (!(conf->flag&MPLP_NO_INDEL) && total_depth < conf->max_indel_depth + && (bcf_callaux_clean(conf->bca, &conf->bc), + bcf_call_gap_prep(conf->gplp->n, conf->gplp->n_plp, conf->gplp->plp, pos, conf->bca, ref) >= 0)) + { + for (i = 0; i < conf->gplp->n; ++i) + bcf_call_glfgen(conf->gplp->n_plp[i], conf->gplp->plp[i], -1, conf->bca, conf->bcr + i); + if (bcf_call_combine(conf->gplp->n, conf->bcr, conf->bca, -1, &conf->bc) >= 0) + { + bcf_clear1(conf->bcf_rec); + bcf_call2bcf(&conf->bc, conf->bcf_rec, conf->bcr, conf->fmt_flag, conf->bca, ref); + flush_bcf_records(conf, conf->bcf_fp, conf->bcf_hdr, conf->bcf_rec); + } + } + } + return 0; +} + +static int mpileup(mplp_conf_t *conf) +{ + if (conf->nfiles == 0) { + fprintf(bcftools_stderr,"[%s] no input file/data given\n", __func__); + bcftools_exit(EXIT_FAILURE); + } + + mplp_ref_t mp_ref = MPLP_REF_INIT; + conf->gplp = (mplp_pileup_t *) calloc(1,sizeof(mplp_pileup_t)); + conf->mplp_data = (mplp_aux_t**) calloc(conf->nfiles, sizeof(mplp_aux_t*)); + conf->plp = (const bam_pileup1_t**) calloc(conf->nfiles, sizeof(bam_pileup1_t*)); + conf->n_plp = (int*) calloc(conf->nfiles, sizeof(int)); + + // Allow to run mpileup on multiple regions in one go. This comes at cost: the bai index + // must be kept in the memory for the whole time which can be a problem with many bams. + // Therefore if none or only one region is requested, we initialize the bam iterator as + // before and free the index. Only when multiple regions are queried, we keep the index. + int nregs = 0; + if ( conf->reg_fname ) + { + if ( conf->reg_is_file ) + { + conf->reg = regidx_init(conf->reg_fname,NULL,NULL,0,NULL); + if ( !conf->reg ) { + fprintf(bcftools_stderr,"Could not parse the regions: %s\n", conf->reg_fname); + bcftools_exit(EXIT_FAILURE); + } + } + else + { + conf->reg = regidx_init(NULL,regidx_parse_reg,NULL,sizeof(char*),NULL); + if ( regidx_insert_list(conf->reg,conf->reg_fname,',') !=0 ) { + fprintf(bcftools_stderr,"Could not parse the regions: %s\n", conf->reg_fname); + bcftools_exit(EXIT_FAILURE); + } + } + nregs = regidx_nregs(conf->reg); + conf->reg_itr = regitr_init(conf->reg); + regitr_loop(conf->reg_itr); // region iterator now positioned at the first region + } + + // read the header of each file in the list and initialize data + // beware: mpileup has always assumed that tid's are consistent in the headers, add sanity check at least! + bam_hdr_t *hdr = NULL; // header of first file in input list + int i; + for (i = 0; i < conf->nfiles; ++i) { + bam_hdr_t *h_tmp; + conf->mplp_data[i] = (mplp_aux_t*) calloc(1, sizeof(mplp_aux_t)); + conf->mplp_data[i]->fp = sam_open(conf->files[i], "rb"); + if ( !conf->mplp_data[i]->fp ) + { + fprintf(bcftools_stderr, "[%s] failed to open %s: %s\n", __func__, conf->files[i], strerror(errno)); + bcftools_exit(EXIT_FAILURE); + } + if (hts_set_opt(conf->mplp_data[i]->fp, CRAM_OPT_DECODE_MD, 1)) { + fprintf(bcftools_stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + bcftools_exit(EXIT_FAILURE); + } + if (conf->fai_fname && hts_set_fai_filename(conf->mplp_data[i]->fp, conf->fai_fname) != 0) { + fprintf(bcftools_stderr, "[%s] failed to process %s: %s\n", + __func__, conf->fai_fname, strerror(errno)); + bcftools_exit(EXIT_FAILURE); + } + conf->mplp_data[i]->conf = conf; + conf->mplp_data[i]->ref = &mp_ref; + h_tmp = sam_hdr_read(conf->mplp_data[i]->fp); + if ( !h_tmp ) { + fprintf(bcftools_stderr,"[%s] fail to read the header of %s\n", __func__, conf->files[i]); + bcftools_exit(EXIT_FAILURE); + } + conf->mplp_data[i]->h = i ? hdr : h_tmp; // for j==0, "h" has not been set yet + conf->mplp_data[i]->bam_id = bam_smpl_add_bam(conf->bsmpl,h_tmp->text,conf->files[i]); + if ( conf->mplp_data[i]->bam_id<0 ) + { + // no usable readgroups in this bam, it can be skipped + sam_close(conf->mplp_data[i]->fp); + free(conf->mplp_data[i]); + bam_hdr_destroy(h_tmp); + free(conf->files[i]); + if ( i+1nfiles ) memmove(&conf->files[i],&conf->files[i+1],sizeof(*conf->files)*(conf->nfiles-i-1)); + conf->nfiles--; + i--; + continue; + } + if (conf->reg) { + hts_idx_t *idx = sam_index_load(conf->mplp_data[i]->fp, conf->files[i]); + if (idx == NULL) { + fprintf(bcftools_stderr, "[%s] fail to load index for %s\n", __func__, conf->files[i]); + bcftools_exit(EXIT_FAILURE); + } + conf->buf.l = 0; + ksprintf(&conf->buf,"%s:%u-%u",conf->reg_itr->seq,conf->reg_itr->beg+1,conf->reg_itr->end+1); + conf->mplp_data[i]->iter = sam_itr_querys(idx, conf->mplp_data[i]->h, conf->buf.s); + if ( !conf->mplp_data[i]->iter ) + { + conf->mplp_data[i]->iter = sam_itr_querys(idx, conf->mplp_data[i]->h, conf->reg_itr->seq); + if ( conf->mplp_data[i]->iter ) { + fprintf(bcftools_stderr,"[E::%s] fail to parse region '%s'\n", __func__, conf->buf.s); + bcftools_exit(EXIT_FAILURE); + } + fprintf(bcftools_stderr,"[E::%s] the sequence \"%s\" not found: %s\n",__func__,conf->reg_itr->seq,conf->files[i]); + bcftools_exit(EXIT_FAILURE); + } + if ( nregs==1 ) // no need to keep the index in memory + hts_idx_destroy(idx); + else + conf->mplp_data[i]->idx = idx; + } + + if ( !hdr ) hdr = h_tmp; /* save the header of first file in list */ + else { + // FIXME: check consistency between h and h_tmp + bam_hdr_destroy(h_tmp); + + // we store only the first file's header; it's (alleged to be) + // compatible with the i-th file's target_name lookup needs + conf->mplp_data[i]->h = hdr; + } + } + if ( !hdr ) { + fprintf(bcftools_stderr, "[%s] failed to find a file header with usable read groups\n", __func__); + bcftools_exit(EXIT_FAILURE); + } + // allocate data storage proportionate to number of samples being studied sm->n + bam_smpl_get_samples(conf->bsmpl, &conf->gplp->n); + conf->gplp->n_plp = (int*) calloc(conf->gplp->n, sizeof(int)); + conf->gplp->m_plp = (int*) calloc(conf->gplp->n, sizeof(int)); + conf->gplp->plp = (bam_pileup1_t**) calloc(conf->gplp->n, sizeof(bam_pileup1_t*)); + + fprintf(bcftools_stderr, "[%s] %d samples in %d input files\n", __func__, conf->gplp->n, conf->nfiles); + // write the VCF header + char wmode[8]; + set_wmode(wmode,conf->output_type,conf->output_fname,conf->clevel); + conf->bcf_fp = hts_open(conf->output_fname ? conf->output_fname : "-", wmode); + if (conf->bcf_fp == NULL) { + fprintf(bcftools_stderr, "[%s] failed to write to %s: %s\n", __func__, conf->output_fname? conf->output_fname : "standard output", strerror(errno)); + bcftools_exit(EXIT_FAILURE); + } + if ( conf->n_threads ) hts_set_threads(conf->bcf_fp, conf->n_threads); + + // BCF header creation + conf->bcf_hdr = bcf_hdr_init("w"); + conf->buf.l = 0; + + if (conf->record_cmd_line) + { + ksprintf(&conf->buf, "##bcftoolsVersion=%s+htslib-%s\n",bcftools_version(),hts_version()); + bcf_hdr_append(conf->bcf_hdr, conf->buf.s); + + conf->buf.l = 0; + ksprintf(&conf->buf, "##bcftoolsCommand=mpileup"); + for (i=1; iargc; i++) ksprintf(&conf->buf, " %s", conf->argv[i]); + kputc('\n', &conf->buf); + bcf_hdr_append(conf->bcf_hdr, conf->buf.s); + } + + if (conf->fai_fname) + { + conf->buf.l = 0; + ksprintf(&conf->buf, "##reference=file://%s\n", conf->fai_fname); + bcf_hdr_append(conf->bcf_hdr, conf->buf.s); + } + + // Translate BAM @SQ tags to BCF ##contig tags + // todo: use/write new BAM header manipulation routines, fill also UR, M5 + for (i=0; in_targets; i++) + { + conf->buf.l = 0; + ksprintf(&conf->buf, "##contig=", hdr->target_name[i], hdr->target_len[i]); + bcf_hdr_append(conf->bcf_hdr, conf->buf.s); + } + conf->buf.l = 0; + + bcf_hdr_append(conf->bcf_hdr,"##ALT="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_INFO_VDB ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + + if (conf->fmt_flag & B2B_INFO_ZSCORE) { + if ( conf->fmt_flag&B2B_INFO_RPB ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_FMT_NMBZ ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_INFO_SCB ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + } else { + if ( conf->fmt_flag&B2B_INFO_RPB ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + } + + bcf_hdr_append(conf->bcf_hdr,"##INFO="); +#if CDF_MWU_TESTS + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); +#endif + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_DP ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_DV ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_DPR ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_INFO_DPR ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_FMT_DP4 ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_SP ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_AD ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_ADF ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_ADR ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_FMT_QS ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_INFO_AD ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_INFO_ADF ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_INFO_SCR ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->fmt_flag&B2B_FMT_SCR ) + bcf_hdr_append(conf->bcf_hdr,"##FORMAT="); + if ( conf->fmt_flag&B2B_INFO_ADR ) + bcf_hdr_append(conf->bcf_hdr,"##INFO="); + if ( conf->gvcf ) + gvcf_update_header(conf->gvcf, conf->bcf_hdr); + + int nsmpl; + const char **smpl = bam_smpl_get_samples(conf->bsmpl, &nsmpl); + for (i=0; ibcf_hdr, smpl[i]); + if ( bcf_hdr_write(conf->bcf_fp, conf->bcf_hdr)!=0 ) error("[%s] Error: failed to write the header to %s\n",__func__,conf->output_fname?conf->output_fname:"standard output"); + + conf->bca = bcf_call_init(-1., conf->min_baseQ, conf->max_baseQ, + conf->delta_baseQ); + conf->bcr = (bcf_callret1_t*) calloc(nsmpl, sizeof(bcf_callret1_t)); + conf->bca->openQ = conf->openQ, conf->bca->extQ = conf->extQ, conf->bca->tandemQ = conf->tandemQ; + conf->bca->indel_bias = conf->indel_bias; + conf->bca->min_frac = conf->min_frac; + conf->bca->min_support = conf->min_support; + conf->bca->per_sample_flt = conf->flag & MPLP_PER_SAMPLE; + conf->bca->fmt_flag = conf->fmt_flag; + conf->bca->ambig_reads = conf->ambig_reads; + conf->bca->indel_win_size = conf->indel_win_size; + + conf->bc.bcf_hdr = conf->bcf_hdr; + conf->bc.n = nsmpl; + conf->bc.PL = (int32_t*) malloc(15 * nsmpl * sizeof(*conf->bc.PL)); + conf->bc.QS = (int32_t*) malloc(nsmpl*sizeof(*conf->bc.QS)*B2B_MAX_ALLELES); + for (i=0; ibcr[i].QS = conf->bc.QS + i*B2B_MAX_ALLELES; + if (conf->fmt_flag) + { + assert( sizeof(float)==sizeof(int32_t) ); + conf->bc.DP4 = (int32_t*) malloc(nsmpl * sizeof(int32_t) * 4); + conf->bc.fmt_arr = (uint8_t*) malloc(nsmpl * sizeof(float)); // all fmt_flag fields, float and int32 + if ( conf->fmt_flag&(B2B_INFO_DPR|B2B_FMT_DPR|B2B_INFO_AD|B2B_INFO_ADF|B2B_INFO_ADR|B2B_FMT_AD|B2B_FMT_ADF|B2B_FMT_ADR) ) + { + // first B2B_MAX_ALLELES fields for total numbers, the rest per-sample + conf->bc.ADR = (int32_t*) malloc((nsmpl+1)*B2B_MAX_ALLELES*sizeof(int32_t)); + conf->bc.ADF = (int32_t*) malloc((nsmpl+1)*B2B_MAX_ALLELES*sizeof(int32_t)); + for (i=0; ibcr[i].ADR = conf->bc.ADR + (i+1)*B2B_MAX_ALLELES; + conf->bcr[i].ADF = conf->bc.ADF + (i+1)*B2B_MAX_ALLELES; + } + } + if ( conf->fmt_flag&(B2B_INFO_SCR|B2B_FMT_SCR) ) + conf->bc.SCR = (int32_t*) malloc((nsmpl+1)*sizeof(*conf->bc.SCR)); + } + int nnmbz = (conf->fmt_flag&B2B_FMT_NMBZ) ? nsmpl + 1 : 1; + conf->bc.ref_nm = (int32_t*) malloc(sizeof(*conf->bc.ref_nm) * nnmbz * B2B_N_NM); + conf->bc.alt_nm = (int32_t*) malloc(sizeof(*conf->bc.alt_nm) * nnmbz * B2B_N_NM); + conf->bc.mwu_nm = (float*) malloc((nsmpl+1)*sizeof(*conf->bc.mwu_nm)); + conf->bca->ref_nm = conf->bc.ref_nm; // this is just to make the arrays available in bcf_call_glfgen() + conf->bca->alt_nm = conf->bc.alt_nm; + if ( conf->fmt_flag&B2B_FMT_NMBZ ) + { + for (i=0; ibcr[i].ref_nm = conf->bc.ref_nm + (i+1)*B2B_N_NM; + for (i=0; ibcr[i].alt_nm = conf->bc.alt_nm + (i+1)*B2B_N_NM; + } + + // init mpileup + conf->iter = bam_mplp_init(conf->nfiles, mplp_func, (void**)conf->mplp_data); + if ( conf->flag & MPLP_SMART_OVERLAPS ) bam_mplp_init_overlaps(conf->iter); + fprintf(bcftools_stderr, "[%s] maximum number of reads per input file set to -d %d\n", __func__, conf->max_depth); + if ( (double)conf->max_depth * conf->nfiles > 1<<20) + fprintf(bcftools_stderr, "Warning: Potential memory hog, up to %.0fM reads in the pileup!\n", (double)conf->max_depth*conf->nfiles); + if ( (double)conf->max_depth * conf->nfiles / nsmpl < 250 ) + fprintf(bcftools_stderr, "Note: The maximum per-sample depth with -d %d is %.1fx\n", conf->max_depth,(double)conf->max_depth * conf->nfiles / nsmpl); + bam_mplp_set_maxcnt(conf->iter, conf->max_depth); + conf->max_indel_depth = conf->max_indel_depth * nsmpl; + conf->bcf_rec = bcf_init1(); + bam_mplp_constructor(conf->iter, pileup_constructor); + + // Run mpileup for multiple regions + if ( nregs ) + { + int ireg = 0; + do + { + // first region is already positioned + if ( ireg++ > 0 ) + { + conf->buf.l = 0; + ksprintf(&conf->buf,"%s:%u-%u",conf->reg_itr->seq,conf->reg_itr->beg+1,conf->reg_itr->end+1); + + for (i=0; infiles; i++) + { + hts_itr_destroy(conf->mplp_data[i]->iter); + conf->mplp_data[i]->iter = sam_itr_querys(conf->mplp_data[i]->idx, conf->mplp_data[i]->h, conf->buf.s); + if ( !conf->mplp_data[i]->iter ) + { + conf->mplp_data[i]->iter = sam_itr_querys(conf->mplp_data[i]->idx, conf->mplp_data[i]->h, conf->reg_itr->seq); + if ( conf->mplp_data[i]->iter ) { + fprintf(bcftools_stderr,"[E::%s] fail to parse region '%s'\n", __func__, conf->buf.s); + bcftools_exit(EXIT_FAILURE); + } + fprintf(bcftools_stderr,"[E::%s] the sequence \"%s\" not found: %s\n",__func__,conf->reg_itr->seq,conf->files[i]); + bcftools_exit(EXIT_FAILURE); + } + bam_mplp_reset(conf->iter); + } + } + mpileup_reg(conf,conf->reg_itr->beg,conf->reg_itr->end); + } + while ( regitr_loop(conf->reg_itr) ); + } + else + mpileup_reg(conf,0,UINT32_MAX); + + flush_bcf_records(conf, conf->bcf_fp, conf->bcf_hdr, NULL); + + // clean up + free(conf->bc.tmp.s); + bcf_destroy1(conf->bcf_rec); + if (conf->bcf_fp) + { + if ( hts_close(conf->bcf_fp)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,conf->output_fname); + bcf_hdr_destroy(conf->bcf_hdr); + bcf_call_destroy(conf->bca); + free(conf->bc.PL); + free(conf->bc.DP4); + free(conf->bc.ADR); + free(conf->bc.ADF); + free(conf->bc.SCR); + free(conf->bc.QS); + free(conf->bc.ref_nm); + free(conf->bc.alt_nm); + free(conf->bc.fmt_arr); + free(conf->bc.mwu_nm); + free(conf->bcr); + } + if ( conf->gvcf ) gvcf_destroy(conf->gvcf); + free(conf->buf.s); + for (i = 0; i < conf->gplp->n; ++i) free(conf->gplp->plp[i]); + free(conf->gplp->plp); free(conf->gplp->n_plp); free(conf->gplp->m_plp); free(conf->gplp); + bam_mplp_destroy(conf->iter); + bam_hdr_destroy(hdr); + for (i = 0; i < conf->nfiles; ++i) { + if ( nregs>1 ) hts_idx_destroy(conf->mplp_data[i]->idx); + sam_close(conf->mplp_data[i]->fp); + if ( conf->mplp_data[i]->iter) hts_itr_destroy(conf->mplp_data[i]->iter); + free(conf->mplp_data[i]); + } + if ( conf->reg_itr ) regitr_destroy(conf->reg_itr); + free(conf->mplp_data); free(conf->plp); free(conf->n_plp); + free(mp_ref.ref[0]); + free(mp_ref.ref[1]); + return 0; +} + +static int is_url(const char *s) +{ + static const char uri_scheme_chars[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+.-"; + return s[strspn(s, uri_scheme_chars)] == ':'; +} + +#define MAX_PATH_LEN 1024 +int read_file_list(const char *file_list,int *n,char **argv[]) +{ + char buf[MAX_PATH_LEN]; + int len, nfiles = 0; + char **files = NULL; + struct stat sb; + + *n = 0; + *argv = NULL; + + FILE *fh = fopen(file_list,"r"); + if ( !fh ) + { + fprintf(bcftools_stderr,"%s: %s\n", file_list,strerror(errno)); + return 1; + } + + files = (char**) calloc(nfiles,sizeof(char*)); + nfiles = 0; + while ( fgets(buf,MAX_PATH_LEN,fh) ) + { + // allow empty lines and trailing spaces + len = strlen(buf); + while ( len>0 && isspace(buf[len-1]) ) len--; + if ( !len ) continue; + + // check sanity of the file list + buf[len] = 0; + if (! (is_url(buf) || stat(buf, &sb) == 0)) + { + // no such file, check if it is safe to print its name + int i, safe_to_print = 1; + for (i=0; irflag_skip_all_set); + char *tmp_skip_any_unset = bam_flag2str(mplp->rflag_skip_any_unset); + char *tmp_skip_all_unset = bam_flag2str(mplp->rflag_skip_all_unset); + char *tmp_skip_any_set = bam_flag2str(mplp->rflag_skip_any_set); + + // Display usage information, formatted for the standard 80 columns. + // (The unusual string formatting here aids the readability of this + // source code in 80 columns, to the extent that's possible.) + + fprintf(fp, + "\n" + "Usage: bcftools mpileup [options] in1.bam [in2.bam [...]]\n" + "\n" + "Input options:\n" + " -6, --illumina1.3+ Quality is in the Illumina-1.3+ encoding\n" + " -A, --count-orphans Do not discard anomalous read pairs\n" + " -b, --bam-list FILE List of input BAM filenames, one per line\n" + " -B, --no-BAQ Disable BAQ (per-Base Alignment Quality)\n" + " -C, --adjust-MQ INT Adjust mapping quality [0]\n" + " -D, --full-BAQ Apply BAQ everywhere, not just in problematic regions\n" + " -d, --max-depth INT Max raw per-file depth; avoids excessive memory usage [%d]\n", mplp->max_depth); + fprintf(fp, + " -E, --redo-BAQ Recalculate BAQ on the fly, ignore existing BQs\n" + " -f, --fasta-ref FILE Faidx indexed reference sequence file\n" + " --no-reference Do not require fasta reference file\n" + " -G, --read-groups FILE Select or exclude read groups listed in the file\n" + " -q, --min-MQ INT Skip alignments with mapQ smaller than INT [%d]\n", mplp->min_mq); + fprintf(fp, + " -Q, --min-BQ INT Skip bases with baseQ/BAQ smaller than INT [%d]\n", mplp->min_baseQ); + fprintf(fp, + " --max-BQ INT Limit baseQ/BAQ to no more than INT [%d]\n", mplp->max_baseQ); + fprintf(fp, + " --delta-BQ INT Use neighbour_qual + INT if less than qual [%d]\n", mplp->delta_baseQ); + fprintf(fp, + " -r, --regions REG[,...] Comma separated list of regions in which pileup is generated\n" + " -R, --regions-file FILE Restrict to regions listed in a file\n" + " --ignore-RG Ignore RG tags (one BAM = one sample)\n" + " --ls, --skip-all-set STR|INT Skip reads with all of the bits set []\n"); + fprintf(fp, + " --ns, --skip-any-set STR|INT Skip reads with any of the bits set [%s]\n", tmp_skip_any_set); + fprintf(fp, + " --lu, --skip-all-unset STR|INT Skip reads with all of the bits unset []\n" + " --nu, --skip-any-unset STR|INT Skip reads with any of the bits unset []\n"); + fprintf(fp, + " -s, --samples LIST Comma separated list of samples to include\n" + " -S, --samples-file FILE File of samples to include\n" + " -t, --targets REG[,...] Similar to -r but streams rather than index-jumps\n" + " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n" + " -x, --ignore-overlaps Disable read-pair overlap detection\n" + " --seed INT Random number seed used for sampling deep regions [0]\n" + "\n" + "Output options:\n" + " -a, --annotate LIST Optional tags to output; '\\?' to list available tags []\n" + " -g, --gvcf INT[,...] Group non-variant sites into gVCF blocks according\n" + " To minimum per-sample DP\n" + " --no-version Do not append version and command line to the header\n" + " -o, --output FILE Write output to FILE [standard output]\n" + " -O, --output-type TYPE 'b' compressed BCF; 'u' uncompressed BCF;\n" + " 'z' compressed VCF; 'v' uncompressed VCF; 0-9 compression level [v]\n" + " -U, --mwu-u Use older probability scale for Mann-Whitney U test\n" + " --threads INT Use multithreading with INT worker threads [0]\n" + "\n" + "SNP/INDEL genotype likelihoods options:\n" + " -X, --config STR Specify platform specific profiles (see below)\n" + " -e, --ext-prob INT Phred-scaled gap extension seq error probability [%d]\n", mplp->extQ); + fprintf(fp, + " -F, --gap-frac FLOAT Minimum fraction of gapped reads [%g]\n", mplp->min_frac); + fprintf(fp, + " -h, --tandem-qual INT Coefficient for homopolymer errors [%d]\n", mplp->tandemQ); + fprintf(fp, + " -I, --skip-indels Do not perform indel calling\n" + " -L, --max-idepth INT Maximum per-file depth for INDEL calling [%d]\n", mplp->max_indel_depth); + fprintf(fp, + " -m, --min-ireads INT Minimum number gapped reads for indel candidates [%d]\n", mplp->min_support); + fprintf(fp, + " -M, --max-read-len INT Maximum length of read to pass to BAQ algorithm [%d]\n", mplp->max_read_len); + fprintf(fp, + " -o, --open-prob INT Phred-scaled gap open seq error probability [%d]\n", mplp->openQ); + fprintf(fp, + " -p, --per-sample-mF Apply -m and -F per-sample for increased sensitivity\n" + " -P, --platforms STR Comma separated list of platforms for indels [all]\n" + " --ar, --ambig-reads STR What to do with ambiguous indel reads: drop,incAD,incAD0 [drop]\n"); + fprintf(fp, + " --indel-bias FLOAT Raise to favour recall over precision [%.2f]\n", mplp->indel_bias); + fprintf(fp, + " --indel-size INT Approximate maximum indel size considered [%d]\n", mplp->indel_win_size); + fprintf(fp,"\n"); + fprintf(fp, + "Configuration profiles activated with -X, --config:\n" + " 1.12: -Q13 -h100 -m1 -F0.002\n" + " illumina: [ default values ]\n" + " ont: -B -Q5 --max-BQ 30 -I [also try eg |bcftools call -P0.01]\n" + " pacbio-ccs: -D -Q5 --max-BQ 50 -F0.1 -o25 -e1 --delta-BQ 10 -M99999\n" + "\n" + "Notes: Assuming diploid individuals.\n" + "\n" + "Example:\n" + " # See also http://samtools.github.io/bcftools/howtos/variant-calling.html\n" + " bcftools mpileup -Ou -f reference.fa alignments.bam | bcftools call -mv -Ob -o calls.bcf\n" + "\n"); + + free(tmp_skip_all_set); + free(tmp_skip_any_unset); + free(tmp_skip_all_unset); + free(tmp_skip_any_set); +} + +int main_mpileup(int argc, char *argv[]) +{ + int c; + const char *file_list = NULL; + char **fn = NULL; + int nfiles = 0, use_orphan = 0, noref = 0; + mplp_conf_t mplp; + memset(&mplp, 0, sizeof(mplp_conf_t)); + mplp.min_baseQ = 1; + mplp.max_baseQ = 60; + mplp.delta_baseQ = 30; + mplp.capQ_thres = 0; + mplp.max_depth = 250; mplp.max_indel_depth = 250; + mplp.openQ = 40; mplp.extQ = 20; mplp.tandemQ = 500; + mplp.min_frac = 0.05; mplp.indel_bias = 1.0; mplp.min_support = 2; + mplp.flag = MPLP_NO_ORPHAN | MPLP_REALN | MPLP_REALN_PARTIAL + | MPLP_SMART_OVERLAPS; + mplp.argc = argc; mplp.argv = argv; + mplp.rflag_skip_any_set = BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP; + mplp.output_fname = NULL; + mplp.output_type = FT_VCF; + mplp.record_cmd_line = 1; + mplp.n_threads = 0; + mplp.bsmpl = bam_smpl_init(); + // the default to be changed in future, see also parse_format_flag() + mplp.fmt_flag = B2B_INFO_VDB|B2B_INFO_RPB|B2B_INFO_SCB|B2B_INFO_ZSCORE; + mplp.max_read_len = 500; + mplp.ambig_reads = B2B_DROP; + mplp.indel_win_size = 110; + mplp.clevel = -1; + hts_srand48(0); + + static const struct option lopts[] = + { + {"nu", required_argument, NULL, 16}, + {"lu", required_argument, NULL, 17}, + {"rf", required_argument, NULL, 17}, // old --rf, --incl-flags = --lu, --skip-all-unset + {"ns", required_argument, NULL, 18}, + {"ff", required_argument, NULL, 18}, // old --ff, --excl-flags = --ns, --skip-any-set + {"ls", required_argument, NULL, 19}, + {"skip-any-unset", required_argument, NULL, 16}, + {"skip-all-unset", required_argument, NULL, 17}, + {"skip-any-set", required_argument, NULL, 18}, + {"skip-all-set", required_argument, NULL, 19}, + {"output", required_argument, NULL, 3}, + {"open-prob", required_argument, NULL, 4}, + {"ignore-RG", no_argument, NULL, 5}, + {"ignore-rg", no_argument, NULL, 5}, + {"gvcf", required_argument, NULL, 'g'}, + {"no-reference", no_argument, NULL, 7}, + {"no-version", no_argument, NULL, 8}, + {"threads",required_argument,NULL,9}, + {"illumina1.3+", no_argument, NULL, '6'}, + {"count-orphans", no_argument, NULL, 'A'}, + {"bam-list", required_argument, NULL, 'b'}, + {"no-BAQ", no_argument, NULL, 'B'}, + {"no-baq", no_argument, NULL, 'B'}, + {"full-BAQ", no_argument, NULL, 'D'}, + {"full-baq", no_argument, NULL, 'D'}, + {"adjust-MQ", required_argument, NULL, 'C'}, + {"adjust-mq", required_argument, NULL, 'C'}, + {"max-depth", required_argument, NULL, 'd'}, + {"redo-BAQ", no_argument, NULL, 'E'}, + {"redo-baq", no_argument, NULL, 'E'}, + {"fasta-ref", required_argument, NULL, 'f'}, + {"read-groups", required_argument, NULL, 'G'}, + {"region", required_argument, NULL, 'r'}, + {"regions", required_argument, NULL, 'r'}, + {"regions-file", required_argument, NULL, 'R'}, + {"targets", required_argument, NULL, 't'}, + {"targets-file", required_argument, NULL, 'T'}, + {"min-MQ", required_argument, NULL, 'q'}, + {"min-mq", required_argument, NULL, 'q'}, + {"min-BQ", required_argument, NULL, 'Q'}, + {"min-bq", required_argument, NULL, 'Q'}, + {"max-bq", required_argument, NULL, 11}, + {"max-BQ", required_argument, NULL, 11}, + {"delta-BQ", required_argument, NULL, 12}, + {"ignore-overlaps", no_argument, NULL, 'x'}, + {"output-type", required_argument, NULL, 'O'}, + {"samples", required_argument, NULL, 's'}, + {"samples-file", required_argument, NULL, 'S'}, + {"annotate", required_argument, NULL, 'a'}, + {"ext-prob", required_argument, NULL, 'e'}, + {"gap-frac", required_argument, NULL, 'F'}, + {"indel-bias", required_argument, NULL, 10}, + {"indel-size", required_argument, NULL, 15}, + {"tandem-qual", required_argument, NULL, 'h'}, + {"skip-indels", no_argument, NULL, 'I'}, + {"max-idepth", required_argument, NULL, 'L'}, + {"min-ireads", required_argument, NULL, 'm'}, + {"per-sample-mF", no_argument, NULL, 'p'}, + {"per-sample-mf", no_argument, NULL, 'p'}, + {"platforms", required_argument, NULL, 'P'}, + {"max-read-len", required_argument, NULL, 'M'}, + {"config", required_argument, NULL, 'X'}, + {"mwu-u", no_argument, NULL, 'U'}, + {"seed", required_argument, NULL, 13}, + {"ambig-reads", required_argument, NULL, 14}, + {"ar", required_argument, NULL, 14}, + {NULL, 0, NULL, 0} + }; + while ((c = getopt_long(argc, argv, "Ag:f:r:R:q:Q:C:BDd:L:b:P:po:e:h:Im:F:EG:6O:xa:s:S:t:T:M:X:U",lopts,NULL)) >= 0) { + switch (c) { + case 'x': mplp.flag &= ~MPLP_SMART_OVERLAPS; break; + case 16 : + mplp.rflag_skip_any_unset = bam_str2flag(optarg); + if ( mplp.rflag_skip_any_unset <0 ) { fprintf(bcftools_stderr,"Could not parse --nf %s\n", optarg); return 1; } + break; + case 17 : + mplp.rflag_skip_all_unset = bam_str2flag(optarg); + if ( mplp.rflag_skip_all_unset<0 ) { fprintf(bcftools_stderr,"Could not parse --if %s\n", optarg); return 1; } + break; + case 18 : + mplp.rflag_skip_any_set = bam_str2flag(optarg); + if ( mplp.rflag_skip_any_set <0 ) { fprintf(bcftools_stderr,"Could not parse --ef %s\n", optarg); return 1; } + break; + case 19 : + mplp.rflag_skip_all_set = bam_str2flag(optarg); + if ( mplp.rflag_skip_all_set <0 ) { fprintf(bcftools_stderr,"Could not parse --df %s\n", optarg); return 1; } + break; + case 3 : mplp.output_fname = optarg; break; + case 4 : mplp.openQ = atoi(optarg); break; + case 5 : bam_smpl_ignore_readgroups(mplp.bsmpl); break; + case 'g': + mplp.gvcf = gvcf_init(optarg); + if ( !mplp.gvcf ) error("Could not parse: --gvcf %s\n", optarg); + break; + case 'f': + mplp.fai = fai_load(optarg); + if (mplp.fai == NULL) return 1; + mplp.fai_fname = optarg; + break; + case 7 : noref = 1; break; + case 8 : mplp.record_cmd_line = 0; break; + case 9 : mplp.n_threads = strtol(optarg, 0, 0); break; + case 'd': mplp.max_depth = atoi(optarg); break; + case 'r': mplp.reg_fname = strdup(optarg); break; + case 'R': mplp.reg_fname = strdup(optarg); mplp.reg_is_file = 1; break; + case 't': + // In the original version the whole BAM was streamed which is inefficient + // with few BED intervals and big BAMs. Todo: devise a heuristic to determine + // best strategy, that is streaming or jumping. + if ( optarg[0]=='^' ) optarg++; + else mplp.bed_logic = 1; + mplp.bed = regidx_init(NULL,regidx_parse_reg,NULL,0,NULL); + mplp.bed_itr = regitr_init(mplp.bed); + if ( regidx_insert_list(mplp.bed,optarg,',') !=0 ) + { + fprintf(bcftools_stderr,"Could not parse the targets: %s\n", optarg); + bcftools_exit(EXIT_FAILURE); + } + break; + case 'T': + if ( optarg[0]=='^' ) optarg++; + else mplp.bed_logic = 1; + mplp.bed = regidx_init(optarg,NULL,NULL,0,NULL); + if (!mplp.bed) { fprintf(bcftools_stderr, "bcftools mpileup: Could not read file \"%s\"", optarg); return 1; } + break; + case 'P': mplp.pl_list = strdup(optarg); break; + case 'p': mplp.flag |= MPLP_PER_SAMPLE; break; + case 'B': mplp.flag &= ~MPLP_REALN; break; + case 'D': mplp.flag &= ~MPLP_REALN_PARTIAL; break; + case 'I': mplp.flag |= MPLP_NO_INDEL; break; + case 'E': mplp.flag |= MPLP_REDO_BAQ; break; + case '6': mplp.flag |= MPLP_ILLUMINA13; break; + case 's': if ( bam_smpl_add_samples(mplp.bsmpl,optarg,0)<0 ) error("Could not read samples: %s\n",optarg); break; + case 'S': if ( bam_smpl_add_samples(mplp.bsmpl,optarg,1)<0 ) error("Could not read samples: %s\n",optarg); break; + case 'O': + switch (optarg[0]) { + case 'b': mplp.output_type = FT_BCF_GZ; break; + case 'u': mplp.output_type = FT_BCF; break; + case 'z': mplp.output_type = FT_VCF_GZ; break; + case 'v': mplp.output_type = FT_VCF; break; + default: + { + char *tmp; + mplp.clevel = strtol(optarg,&tmp,10); + if ( *tmp || mplp.clevel<0 || mplp.clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + char *tmp; + mplp.clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || mplp.clevel<0 || mplp.clevel>9 ) error("Could not parse argument: --output-type %s\n", optarg+1); + } + break; + case 'C': mplp.capQ_thres = atoi(optarg); break; + case 'q': mplp.min_mq = atoi(optarg); break; + case 'Q': mplp.min_baseQ = atoi(optarg); break; + case 11: mplp.max_baseQ = atoi(optarg); break; + case 12: mplp.delta_baseQ = atoi(optarg); break; + case 'b': file_list = optarg; break; + case 'o': { + char *end; + long value = strtol(optarg, &end, 10); + // Distinguish between -o INT and -o FILE (a bit of a hack!) + if (*end == '\0') mplp.openQ = value; + else mplp.output_fname = optarg; + } + break; + case 'e': mplp.extQ = atoi(optarg); break; + case 'h': mplp.tandemQ = atoi(optarg); break; + case 10: // --indel-bias (inverted so higher => more indels called) + if (atof(optarg) < 1e-2) + mplp.indel_bias = 1/1e2; + else + mplp.indel_bias = 1/atof(optarg); + break; + case 15: { + char *tmp; + mplp.indel_win_size = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --indel-size %s\n", optarg); + if ( mplp.indel_win_size < 110 ) + { + mplp.indel_win_size = 110; + fprintf(bcftools_stderr,"Warning: running with --indel-size %d, the requested value is too small\n",mplp.indel_win_size); + } + } + break; + case 'A': use_orphan = 1; break; + case 'F': mplp.min_frac = atof(optarg); break; + case 'm': mplp.min_support = atoi(optarg); break; + case 'L': mplp.max_indel_depth = atoi(optarg); break; + case 'G': bam_smpl_add_readgroups(mplp.bsmpl, optarg, 1); break; + case 'a': + if (optarg[0]=='?') { + list_annotations(bcftools_stderr); + return 1; + } + mplp.fmt_flag |= parse_format_flag(optarg); + break; + case 'M': mplp.max_read_len = atoi(optarg); break; + case 'U': mplp.fmt_flag &= ~B2B_INFO_ZSCORE; break; + case 'X': + if (strcasecmp(optarg, "pacbio-ccs") == 0) { + mplp.min_frac = 0.1; + mplp.min_baseQ = 5; + mplp.max_baseQ = 50; + mplp.delta_baseQ = 10; + mplp.openQ = 25; + mplp.extQ = 1; + mplp.flag |= MPLP_REALN_PARTIAL; + mplp.max_read_len = 99999; + } else if (strcasecmp(optarg, "ont") == 0) { + fprintf(bcftools_stderr, "For ONT it may be beneficial to also run bcftools call with " + "a higher -P, eg -P0.01 or -P 0.1\n"); + mplp.min_baseQ = 5; + mplp.max_baseQ = 30; + mplp.flag &= ~MPLP_REALN; + mplp.flag |= MPLP_NO_INDEL; + } else if (strcasecmp(optarg, "1.12") == 0) { + // 1.12 and earlier + mplp.min_frac = 0.002; + mplp.min_support = 1; + mplp.min_baseQ = 13; + mplp.tandemQ = 100; + mplp.flag &= ~MPLP_REALN_PARTIAL; + mplp.flag |= MPLP_REALN; + } else if (strcasecmp(optarg, "illumina") == 0) { + mplp.flag |= MPLP_REALN_PARTIAL; + } else { + fprintf(bcftools_stderr, "Unknown configuration name '%s'\n" + "Please choose from 1.12, illumina, pacbio-ccs or ont\n", + optarg); + return 1; + } + break; + case 13: hts_srand48(atoi(optarg)); break; + case 14: + if ( !strcasecmp(optarg,"drop") ) mplp.ambig_reads = B2B_DROP; + else if ( !strcasecmp(optarg,"incAD") ) mplp.ambig_reads = B2B_INC_AD; + else if ( !strcasecmp(optarg,"incAD0") ) mplp.ambig_reads = B2B_INC_AD0; + else error("The option to --ambig-reads not recognised: %s\n",optarg); + break; + default: + fprintf(bcftools_stderr,"Invalid option: '%c'\n", c); + return 1; + } + } + + if ( mplp.gvcf && !(mplp.fmt_flag&B2B_FMT_DP) ) + { + fprintf(bcftools_stderr,"[warning] The -a DP option is required with --gvcf, switching on.\n"); + mplp.fmt_flag |= B2B_FMT_DP; + } + if ( mplp.flag&(MPLP_BCF|MPLP_VCF|MPLP_NO_COMP) ) + { + if ( mplp.flag&MPLP_VCF ) + { + if ( mplp.flag&MPLP_NO_COMP ) mplp.output_type = FT_VCF; + else mplp.output_type = FT_VCF_GZ; + } + else if ( mplp.flag&MPLP_BCF ) + { + if ( mplp.flag&MPLP_NO_COMP ) mplp.output_type = FT_BCF; + else mplp.output_type = FT_BCF_GZ; + } + } + if ( !(mplp.flag&MPLP_REALN) && mplp.flag&MPLP_REDO_BAQ ) + { + fprintf(bcftools_stderr,"Error: The -B option cannot be combined with -E\n"); + return 1; + } + if (use_orphan) mplp.flag &= ~MPLP_NO_ORPHAN; + if (argc == 1) + { + print_usage(bcftools_stderr, &mplp); + return 1; + } + if (!mplp.fai && !noref) { + fprintf(bcftools_stderr,"Error: mpileup requires the --fasta-ref option by default; use --no-reference to run without a fasta reference\n"); + return 1; + } + int ret,i; + if (file_list) + { + if ( read_file_list(file_list,&nfiles,&fn) ) return 1; + mplp.files = fn; + mplp.nfiles = nfiles; + } + else + { + mplp.nfiles = argc - optind; + mplp.files = (char**) malloc(mplp.nfiles*sizeof(char*)); + for (i=0; i + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +// Code to build this table is below +#ifdef BUILD_MW +#include + +double mann_whitney_1947(int n, int m, int U) +{ + if (U<0) return 0; + if (n==0||m==0) return U==0 ? 1 : 0; + return (double)n/(n+m)*mann_whitney_1947(n-1,m,U-m) + (double)m/(n+m)*mann_whitney_1947(n,m-1,U); +} + +int main(void) { + int i, j, k; + printf("static double mw[6][6][50] = // [2-7][2-7][0-49]\n{\n"); + for (i = 2; i < 8; i++) { + printf(" {\n"); + for (j = 2; j < 8; j++) { + printf(" {\n"); + for (k = 0; k < 50; k++) { + printf(" %.17f,\n", mann_whitney_1947(i,j,k)); + } + printf(" },\n"); + } + printf(" },\n"); + } + printf("};\n"); + return 0; +} +#endif + +static double mw[6][6][50] = // [2-7][2-7][0-49] +{ + { + { + 0.16666666666666666, + 0.16666666666666666, + 0.33333333333333331, + 0.16666666666666666, + 0.16666666666666666, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.09999999999999999, + 0.09999999999999999, + 0.19999999999999998, + 0.20000000000000001, + 0.20000000000000001, + 0.10000000000000001, + 0.10000000000000001, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.06666666666666665, + 0.06666666666666665, + 0.13333333333333330, + 0.13333333333333333, + 0.20000000000000001, + 0.13333333333333333, + 0.13333333333333333, + 0.06666666666666667, + 0.06666666666666667, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.04761904761904761, + 0.04761904761904761, + 0.09523809523809522, + 0.09523809523809523, + 0.14285714285714288, + 0.14285714285714285, + 0.14285714285714285, + 0.09523809523809523, + 0.09523809523809523, + 0.04761904761904762, + 0.04761904761904762, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.03571428571428571, + 0.03571428571428571, + 0.07142857142857141, + 0.07142857142857142, + 0.10714285714285715, + 0.10714285714285714, + 0.14285714285714285, + 0.10714285714285715, + 0.10714285714285715, + 0.07142857142857144, + 0.07142857142857142, + 0.03571428571428571, + 0.03571428571428571, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.02777777777777777, + 0.02777777777777777, + 0.05555555555555555, + 0.05555555555555555, + 0.08333333333333334, + 0.08333333333333333, + 0.11111111111111110, + 0.11111111111111113, + 0.11111111111111113, + 0.08333333333333334, + 0.08333333333333334, + 0.05555555555555556, + 0.05555555555555555, + 0.02777777777777778, + 0.02777777777777778, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + }, + { + { + 0.10000000000000001, + 0.10000000000000001, + 0.20000000000000001, + 0.20000000000000001, + 0.19999999999999998, + 0.09999999999999999, + 0.09999999999999999, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.05000000000000000, + 0.05000000000000000, + 0.10000000000000001, + 0.14999999999999999, + 0.14999999999999999, + 0.14999999999999999, + 0.14999999999999999, + 0.10000000000000001, + 0.05000000000000000, + 0.05000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.02857142857142857, + 0.02857142857142857, + 0.05714285714285714, + 0.08571428571428570, + 0.11428571428571427, + 0.11428571428571427, + 0.14285714285714282, + 0.11428571428571428, + 0.11428571428571428, + 0.08571428571428572, + 0.05714285714285714, + 0.02857142857142857, + 0.02857142857142857, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.01785714285714286, + 0.01785714285714286, + 0.03571428571428571, + 0.05357142857142856, + 0.07142857142857142, + 0.08928571428571427, + 0.10714285714285711, + 0.10714285714285712, + 0.10714285714285714, + 0.10714285714285715, + 0.08928571428571427, + 0.07142857142857142, + 0.05357142857142857, + 0.03571428571428571, + 0.01785714285714286, + 0.01785714285714286, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.01190476190476190, + 0.01190476190476190, + 0.02380952380952381, + 0.03571428571428571, + 0.04761904761904762, + 0.05952380952380951, + 0.08333333333333330, + 0.08333333333333331, + 0.09523809523809523, + 0.09523809523809523, + 0.09523809523809523, + 0.08333333333333333, + 0.08333333333333333, + 0.05952380952380952, + 0.04761904761904762, + 0.03571428571428571, + 0.02380952380952381, + 0.01190476190476190, + 0.01190476190476190, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00833333333333333, + 0.00833333333333333, + 0.01666666666666666, + 0.02499999999999999, + 0.03333333333333333, + 0.04166666666666666, + 0.05833333333333331, + 0.06666666666666665, + 0.07499999999999998, + 0.08333333333333331, + 0.08333333333333331, + 0.08333333333333333, + 0.08333333333333333, + 0.07500000000000000, + 0.06666666666666667, + 0.05833333333333333, + 0.04166666666666666, + 0.03333333333333333, + 0.02500000000000000, + 0.01666666666666667, + 0.00833333333333333, + 0.00833333333333333, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + }, + { + { + 0.06666666666666667, + 0.06666666666666667, + 0.13333333333333333, + 0.13333333333333333, + 0.20000000000000001, + 0.13333333333333333, + 0.13333333333333330, + 0.06666666666666665, + 0.06666666666666665, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.02857142857142857, + 0.02857142857142857, + 0.05714285714285714, + 0.08571428571428572, + 0.11428571428571428, + 0.11428571428571428, + 0.14285714285714282, + 0.11428571428571427, + 0.11428571428571427, + 0.08571428571428570, + 0.05714285714285714, + 0.02857142857142857, + 0.02857142857142857, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.01428571428571429, + 0.01428571428571429, + 0.02857142857142857, + 0.04285714285714286, + 0.07142857142857142, + 0.07142857142857142, + 0.09999999999999998, + 0.09999999999999998, + 0.11428571428571427, + 0.09999999999999998, + 0.09999999999999998, + 0.07142857142857142, + 0.07142857142857142, + 0.04285714285714286, + 0.02857142857142857, + 0.01428571428571429, + 0.01428571428571429, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00793650793650794, + 0.00793650793650794, + 0.01587301587301587, + 0.02380952380952381, + 0.03968253968253968, + 0.04761904761904762, + 0.06349206349206349, + 0.07142857142857142, + 0.08730158730158730, + 0.08730158730158730, + 0.09523809523809522, + 0.08730158730158728, + 0.08730158730158730, + 0.07142857142857142, + 0.06349206349206349, + 0.04761904761904761, + 0.03968253968253968, + 0.02380952380952381, + 0.01587301587301587, + 0.00793650793650794, + 0.00793650793650794, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00476190476190476, + 0.00476190476190476, + 0.00952380952380952, + 0.01428571428571429, + 0.02380952380952381, + 0.02857142857142857, + 0.04285714285714286, + 0.04761904761904762, + 0.06190476190476190, + 0.06666666666666665, + 0.07619047619047617, + 0.07619047619047617, + 0.08571428571428569, + 0.07619047619047617, + 0.07619047619047620, + 0.06666666666666667, + 0.06190476190476191, + 0.04761904761904762, + 0.04285714285714286, + 0.02857142857142857, + 0.02380952380952381, + 0.01428571428571429, + 0.00952380952380952, + 0.00476190476190476, + 0.00476190476190476, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00303030303030303, + 0.00303030303030303, + 0.00606060606060606, + 0.00909090909090909, + 0.01515151515151515, + 0.01818181818181818, + 0.02727272727272727, + 0.03333333333333333, + 0.04242424242424242, + 0.04848484848484847, + 0.05757575757575756, + 0.06060606060606059, + 0.06969696969696967, + 0.06969696969696967, + 0.07272727272727272, + 0.06969696969696969, + 0.06969696969696970, + 0.06060606060606059, + 0.05757575757575757, + 0.04848484848484848, + 0.04242424242424242, + 0.03333333333333333, + 0.02727272727272727, + 0.01818181818181818, + 0.01515151515151515, + 0.00909090909090909, + 0.00606060606060606, + 0.00303030303030303, + 0.00303030303030303, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + }, + { + { + 0.04761904761904762, + 0.04761904761904762, + 0.09523809523809523, + 0.09523809523809523, + 0.14285714285714285, + 0.14285714285714285, + 0.14285714285714288, + 0.09523809523809523, + 0.09523809523809522, + 0.04761904761904761, + 0.04761904761904761, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.01785714285714286, + 0.01785714285714286, + 0.03571428571428571, + 0.05357142857142857, + 0.07142857142857142, + 0.08928571428571427, + 0.10714285714285715, + 0.10714285714285714, + 0.10714285714285712, + 0.10714285714285711, + 0.08928571428571427, + 0.07142857142857142, + 0.05357142857142856, + 0.03571428571428571, + 0.01785714285714286, + 0.01785714285714286, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00793650793650794, + 0.00793650793650794, + 0.01587301587301587, + 0.02380952380952381, + 0.03968253968253968, + 0.04761904761904761, + 0.06349206349206349, + 0.07142857142857142, + 0.08730158730158730, + 0.08730158730158728, + 0.09523809523809522, + 0.08730158730158730, + 0.08730158730158730, + 0.07142857142857142, + 0.06349206349206349, + 0.04761904761904762, + 0.03968253968253968, + 0.02380952380952381, + 0.01587301587301587, + 0.00793650793650794, + 0.00793650793650794, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00396825396825397, + 0.00396825396825397, + 0.00793650793650794, + 0.01190476190476190, + 0.01984126984126984, + 0.02777777777777777, + 0.03571428571428571, + 0.04365079365079365, + 0.05555555555555555, + 0.06349206349206349, + 0.07142857142857142, + 0.07539682539682539, + 0.07936507936507936, + 0.07936507936507936, + 0.07539682539682539, + 0.07142857142857142, + 0.06349206349206349, + 0.05555555555555555, + 0.04365079365079365, + 0.03571428571428571, + 0.02777777777777777, + 0.01984126984126984, + 0.01190476190476190, + 0.00793650793650794, + 0.00396825396825397, + 0.00396825396825397, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00216450216450216, + 0.00216450216450216, + 0.00432900432900433, + 0.00649350649350649, + 0.01082251082251082, + 0.01515151515151515, + 0.02164502164502164, + 0.02597402597402597, + 0.03463203463203463, + 0.04112554112554112, + 0.04978354978354978, + 0.05411255411255411, + 0.06277056277056275, + 0.06493506493506493, + 0.06926406926406925, + 0.06926406926406925, + 0.06926406926406925, + 0.06493506493506492, + 0.06277056277056275, + 0.05411255411255410, + 0.04978354978354978, + 0.04112554112554112, + 0.03463203463203463, + 0.02597402597402597, + 0.02164502164502164, + 0.01515151515151515, + 0.01082251082251082, + 0.00649350649350649, + 0.00432900432900433, + 0.00216450216450216, + 0.00216450216450216, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00126262626262626, + 0.00126262626262626, + 0.00252525252525253, + 0.00378787878787879, + 0.00631313131313131, + 0.00883838383838384, + 0.01262626262626262, + 0.01641414141414141, + 0.02146464646464646, + 0.02651515151515151, + 0.03282828282828283, + 0.03787878787878787, + 0.04419191919191919, + 0.04924242424242424, + 0.05429292929292929, + 0.05808080808080808, + 0.06060606060606059, + 0.06186868686868686, + 0.06186868686868686, + 0.06060606060606059, + 0.05808080808080807, + 0.05429292929292930, + 0.04924242424242424, + 0.04419191919191920, + 0.03787878787878787, + 0.03282828282828282, + 0.02651515151515152, + 0.02146464646464646, + 0.01641414141414142, + 0.01262626262626263, + 0.00883838383838384, + 0.00631313131313131, + 0.00378787878787879, + 0.00252525252525253, + 0.00126262626262626, + 0.00126262626262626, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + }, + { + { + 0.03571428571428571, + 0.03571428571428571, + 0.07142857142857142, + 0.07142857142857144, + 0.10714285714285715, + 0.10714285714285715, + 0.14285714285714285, + 0.10714285714285714, + 0.10714285714285715, + 0.07142857142857142, + 0.07142857142857141, + 0.03571428571428571, + 0.03571428571428571, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.01190476190476190, + 0.01190476190476190, + 0.02380952380952381, + 0.03571428571428571, + 0.04761904761904762, + 0.05952380952380952, + 0.08333333333333333, + 0.08333333333333333, + 0.09523809523809523, + 0.09523809523809523, + 0.09523809523809523, + 0.08333333333333331, + 0.08333333333333330, + 0.05952380952380951, + 0.04761904761904762, + 0.03571428571428571, + 0.02380952380952381, + 0.01190476190476190, + 0.01190476190476190, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00476190476190476, + 0.00476190476190476, + 0.00952380952380952, + 0.01428571428571429, + 0.02380952380952381, + 0.02857142857142857, + 0.04285714285714286, + 0.04761904761904762, + 0.06190476190476191, + 0.06666666666666667, + 0.07619047619047620, + 0.07619047619047617, + 0.08571428571428569, + 0.07619047619047617, + 0.07619047619047617, + 0.06666666666666665, + 0.06190476190476190, + 0.04761904761904762, + 0.04285714285714286, + 0.02857142857142857, + 0.02380952380952381, + 0.01428571428571429, + 0.00952380952380952, + 0.00476190476190476, + 0.00476190476190476, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00216450216450216, + 0.00216450216450216, + 0.00432900432900433, + 0.00649350649350649, + 0.01082251082251082, + 0.01515151515151515, + 0.02164502164502164, + 0.02597402597402597, + 0.03463203463203463, + 0.04112554112554112, + 0.04978354978354978, + 0.05411255411255410, + 0.06277056277056275, + 0.06493506493506492, + 0.06926406926406925, + 0.06926406926406925, + 0.06926406926406925, + 0.06493506493506493, + 0.06277056277056275, + 0.05411255411255411, + 0.04978354978354978, + 0.04112554112554112, + 0.03463203463203463, + 0.02597402597402597, + 0.02164502164502164, + 0.01515151515151515, + 0.01082251082251082, + 0.00649350649350649, + 0.00432900432900433, + 0.00216450216450216, + 0.00216450216450216, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00108225108225108, + 0.00108225108225108, + 0.00216450216450216, + 0.00324675324675325, + 0.00541125541125541, + 0.00757575757575758, + 0.01190476190476190, + 0.01406926406926407, + 0.01948051948051948, + 0.02380952380952381, + 0.03030303030303030, + 0.03463203463203463, + 0.04220779220779219, + 0.04545454545454544, + 0.05194805194805194, + 0.05519480519480519, + 0.05952380952380951, + 0.05952380952380952, + 0.06277056277056275, + 0.05952380952380952, + 0.05952380952380951, + 0.05519480519480519, + 0.05194805194805194, + 0.04545454545454544, + 0.04220779220779219, + 0.03463203463203463, + 0.03030303030303030, + 0.02380952380952381, + 0.01948051948051948, + 0.01406926406926407, + 0.01190476190476190, + 0.00757575757575758, + 0.00541125541125541, + 0.00324675324675325, + 0.00216450216450216, + 0.00108225108225108, + 0.00108225108225108, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00058275058275058, + 0.00058275058275058, + 0.00116550116550117, + 0.00174825174825175, + 0.00291375291375291, + 0.00407925407925408, + 0.00641025641025641, + 0.00815850815850816, + 0.01107226107226107, + 0.01398601398601398, + 0.01806526806526806, + 0.02156177156177156, + 0.02680652680652679, + 0.03030303030303030, + 0.03554778554778554, + 0.03962703962703962, + 0.04428904428904428, + 0.04720279720279720, + 0.05128205128205127, + 0.05244755244755244, + 0.05477855477855477, + 0.05477855477855477, + 0.05477855477855477, + 0.05244755244755243, + 0.05128205128205127, + 0.04720279720279720, + 0.04428904428904428, + 0.03962703962703962, + 0.03554778554778555, + 0.03030303030303030, + 0.02680652680652681, + 0.02156177156177156, + 0.01806526806526806, + 0.01398601398601399, + 0.01107226107226107, + 0.00815850815850816, + 0.00641025641025641, + 0.00407925407925408, + 0.00291375291375291, + 0.00174825174825175, + 0.00116550116550117, + 0.00058275058275058, + 0.00058275058275058, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + }, + { + { + 0.02777777777777778, + 0.02777777777777778, + 0.05555555555555555, + 0.05555555555555556, + 0.08333333333333334, + 0.08333333333333334, + 0.11111111111111113, + 0.11111111111111113, + 0.11111111111111110, + 0.08333333333333333, + 0.08333333333333334, + 0.05555555555555555, + 0.05555555555555555, + 0.02777777777777777, + 0.02777777777777777, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00833333333333333, + 0.00833333333333333, + 0.01666666666666667, + 0.02500000000000000, + 0.03333333333333333, + 0.04166666666666666, + 0.05833333333333333, + 0.06666666666666667, + 0.07500000000000000, + 0.08333333333333333, + 0.08333333333333333, + 0.08333333333333331, + 0.08333333333333331, + 0.07499999999999998, + 0.06666666666666665, + 0.05833333333333331, + 0.04166666666666666, + 0.03333333333333333, + 0.02499999999999999, + 0.01666666666666666, + 0.00833333333333333, + 0.00833333333333333, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00303030303030303, + 0.00303030303030303, + 0.00606060606060606, + 0.00909090909090909, + 0.01515151515151515, + 0.01818181818181818, + 0.02727272727272727, + 0.03333333333333333, + 0.04242424242424242, + 0.04848484848484848, + 0.05757575757575757, + 0.06060606060606059, + 0.06969696969696970, + 0.06969696969696969, + 0.07272727272727272, + 0.06969696969696967, + 0.06969696969696967, + 0.06060606060606059, + 0.05757575757575756, + 0.04848484848484847, + 0.04242424242424242, + 0.03333333333333333, + 0.02727272727272727, + 0.01818181818181818, + 0.01515151515151515, + 0.00909090909090909, + 0.00606060606060606, + 0.00303030303030303, + 0.00303030303030303, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00126262626262626, + 0.00126262626262626, + 0.00252525252525253, + 0.00378787878787879, + 0.00631313131313131, + 0.00883838383838384, + 0.01262626262626263, + 0.01641414141414142, + 0.02146464646464646, + 0.02651515151515152, + 0.03282828282828282, + 0.03787878787878787, + 0.04419191919191920, + 0.04924242424242424, + 0.05429292929292930, + 0.05808080808080807, + 0.06060606060606059, + 0.06186868686868686, + 0.06186868686868686, + 0.06060606060606059, + 0.05808080808080808, + 0.05429292929292929, + 0.04924242424242424, + 0.04419191919191919, + 0.03787878787878787, + 0.03282828282828283, + 0.02651515151515151, + 0.02146464646464646, + 0.01641414141414141, + 0.01262626262626262, + 0.00883838383838384, + 0.00631313131313131, + 0.00378787878787879, + 0.00252525252525253, + 0.00126262626262626, + 0.00126262626262626, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00058275058275058, + 0.00058275058275058, + 0.00116550116550117, + 0.00174825174825175, + 0.00291375291375291, + 0.00407925407925408, + 0.00641025641025641, + 0.00815850815850816, + 0.01107226107226107, + 0.01398601398601399, + 0.01806526806526806, + 0.02156177156177156, + 0.02680652680652681, + 0.03030303030303030, + 0.03554778554778555, + 0.03962703962703962, + 0.04428904428904428, + 0.04720279720279720, + 0.05128205128205127, + 0.05244755244755243, + 0.05477855477855477, + 0.05477855477855477, + 0.05477855477855477, + 0.05244755244755244, + 0.05128205128205127, + 0.04720279720279720, + 0.04428904428904428, + 0.03962703962703962, + 0.03554778554778554, + 0.03030303030303030, + 0.02680652680652679, + 0.02156177156177156, + 0.01806526806526806, + 0.01398601398601398, + 0.01107226107226107, + 0.00815850815850816, + 0.00641025641025641, + 0.00407925407925408, + 0.00291375291375291, + 0.00174825174825175, + 0.00116550116550117, + 0.00058275058275058, + 0.00058275058275058, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + }, + { + 0.00029137529137529, + 0.00029137529137529, + 0.00058275058275058, + 0.00087412587412587, + 0.00145687645687646, + 0.00203962703962704, + 0.00320512820512821, + 0.00437062937062937, + 0.00582750582750583, + 0.00757575757575758, + 0.00990675990675991, + 0.01223776223776224, + 0.01544289044289044, + 0.01835664335664336, + 0.02185314685314686, + 0.02534965034965035, + 0.02913752913752913, + 0.03263403263403263, + 0.03642191142191141, + 0.03962703962703962, + 0.04254079254079253, + 0.04516317016317015, + 0.04720279720279719, + 0.04836829836829836, + 0.04924242424242423, + 0.04924242424242423, + 0.04836829836829836, + 0.04720279720279719, + 0.04516317016317015, + 0.04254079254079253, + 0.03962703962703962, + 0.03642191142191141, + 0.03263403263403263, + 0.02913752913752913, + 0.02534965034965035, + 0.02185314685314686, + 0.01835664335664336, + 0.01544289044289044, + 0.01223776223776224, + 0.00990675990675991, + 0.00757575757575758, + 0.00582750582750583, + 0.00437062937062937, + 0.00320512820512821, + 0.00203962703962704, + 0.00145687645687646, + 0.00087412587412587, + 0.00058275058275058, + 0.00029137529137529, + 0.00029137529137529, + }, + }, +}; diff --git a/bcftools/ploidy.c b/bcftools/ploidy.c new file mode 100644 index 0000000..550ba87 --- /dev/null +++ b/bcftools/ploidy.c @@ -0,0 +1,268 @@ +/* + Copyright (C) 2014-2016 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include +#include "bcftools.h" +#include "ploidy.h" + +struct _ploidy_t +{ + int nsex, msex; // number of genders, m:number of allocated elements in id2sex array + int dflt, min, max; // ploidy: default, min and max (only explicitly listed) + int *sex2dflt; + regidx_t *idx; + regitr_t *itr; + void *sex2id; + char **id2sex; + kstring_t tmp_str; +}; + +typedef struct +{ + int sex, ploidy; +} +sex_ploidy_t; + + +regidx_t *ploidy_regions(ploidy_t *ploidy) +{ + return ploidy->idx; +} + +int ploidy_parse(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + int i, ret; + ploidy_t *ploidy = (ploidy_t*) usr; + void *sex2id = ploidy->sex2id; + + // Check for special case of default ploidy "* * * " + int default_ploidy_def = 0; + + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( ss[0]=='*' && (!ss[1] || isspace(ss[1])) ) + default_ploidy_def = 1; // definition of default ploidy, chr="*" + else + { + // Fill CHR,FROM,TO + ret = regidx_parse_tab(line,chr_beg,chr_end,beg,end,NULL,NULL); + if ( ret!=0 ) return ret; + } + + // Skip the fields already parsed by regidx_parse_tab + ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + for (i=0; i<3; i++) + { + while ( *ss && !isspace(*ss) ) ss++; + if ( !*ss ) return -2; // wrong number of fields + while ( *ss && isspace(*ss) ) ss++; + } + if ( !*ss ) return -2; + + // Parse the payload + char *se = ss; + while ( *se && !isspace(*se) ) se++; + if ( !*se || se==ss ) error("Could not parse: %s\n", line); + ploidy->tmp_str.l = 0; + kputsn(ss,se-ss,&ploidy->tmp_str); + + sex_ploidy_t *sp = (sex_ploidy_t*) payload; + if ( khash_str2int_get(sex2id, ploidy->tmp_str.s, &sp->sex) != 0 ) + { + ploidy->nsex++; + hts_expand0(char*,ploidy->nsex,ploidy->msex,ploidy->id2sex); + ploidy->id2sex[ploidy->nsex-1] = strdup(ploidy->tmp_str.s); + sp->sex = khash_str2int_inc(ploidy->sex2id, ploidy->id2sex[ploidy->nsex-1]); + ploidy->sex2dflt = (int*) realloc(ploidy->sex2dflt,sizeof(int)*ploidy->nsex); + ploidy->sex2dflt[ploidy->nsex-1] = -1; + } + + ss = se; + while ( *se && isspace(*se) ) se++; + if ( !*se ) error("Could not parse: %s\n", line); + sp->ploidy = strtol(ss,&se,10); + if ( ss==se ) error("Could not parse: %s\n", line); + if ( ploidy->min<0 || sp->ploidy < ploidy->min ) ploidy->min = sp->ploidy; + if ( ploidy->max<0 || sp->ploidy > ploidy->max ) ploidy->max = sp->ploidy; + + // Special case, chr="*" stands for a default value + if ( default_ploidy_def ) + { + ploidy->sex2dflt[ploidy->nsex-1] = sp->ploidy; + return -1; + } + + return 0; +} + +static void _set_defaults(ploidy_t *ploidy, int dflt) +{ + int i; + if ( khash_str2int_get(ploidy->sex2id, "*", &i) == 0 ) dflt = ploidy->sex2dflt[i]; + for (i=0; insex; i++) + if ( ploidy->sex2dflt[i]==-1 ) ploidy->sex2dflt[i] = dflt; + + ploidy->dflt = dflt; + if ( ploidy->min<0 || dflt < ploidy->min ) ploidy->min = dflt; + if ( ploidy->max<0 || dflt > ploidy->max ) ploidy->max = dflt; +} + +ploidy_t *ploidy_init(const char *fname, int dflt) +{ + ploidy_t *pld = (ploidy_t*) calloc(1,sizeof(ploidy_t)); + if ( !pld ) return NULL; + + pld->min = pld->max = -1; + pld->sex2id = khash_str2int_init(); + pld->idx = regidx_init(fname,ploidy_parse,NULL,sizeof(sex_ploidy_t),pld); + if ( !pld->idx ) + { + ploidy_destroy(pld); + return NULL; + } + pld->itr = regitr_init(pld->idx); + _set_defaults(pld,dflt); + return pld; +} + +ploidy_t *ploidy_init_string(const char *str, int dflt) +{ + ploidy_t *pld = (ploidy_t*) calloc(1,sizeof(ploidy_t)); + if ( !pld ) return NULL; + + pld->min = pld->max = -1; + pld->sex2id = khash_str2int_init(); + pld->idx = regidx_init(NULL,ploidy_parse,NULL,sizeof(sex_ploidy_t),pld); + pld->itr = regitr_init(pld->idx); + + kstring_t tmp = {0,0,0}; + const char *ss = str; + while ( *ss ) + { + while ( *ss && isspace(*ss) ) ss++; + const char *se = ss; + while ( *se && *se!='\r' && *se!='\n' ) se++; + tmp.l = 0; + kputsn(ss, se-ss, &tmp); + regidx_insert(pld->idx,tmp.s); + while ( *se && isspace(*se) ) se++; + ss = se; + } + free(tmp.s); + + _set_defaults(pld,dflt); + return pld; +} + +void ploidy_destroy(ploidy_t *ploidy) +{ + if ( ploidy->sex2id ) khash_str2int_destroy_free(ploidy->sex2id); + if ( ploidy->itr ) regitr_destroy(ploidy->itr); + if ( ploidy->idx ) regidx_destroy(ploidy->idx); + free(ploidy->id2sex); + free(ploidy->tmp_str.s); + free(ploidy->sex2dflt); + free(ploidy); +} + +int ploidy_query(ploidy_t *ploidy, char *seq, int pos, int *sex2ploidy, int *min, int *max) +{ + int i, ret = regidx_overlap(ploidy->idx, seq,pos,pos, ploidy->itr); + + if ( !sex2ploidy && !min && !max ) return ret; + + if ( !ret ) + { + // no overlap + if ( min ) *min = ploidy->dflt; + if ( max ) *max = ploidy->dflt; + if ( sex2ploidy ) + for (i=0; insex; i++) sex2ploidy[i] = ploidy->sex2dflt[i]; + return 0; + } + + int _min = INT_MAX, _max = -1; + if ( sex2ploidy ) for (i=0; insex; i++) sex2ploidy[i] = ploidy->dflt; + + while ( regitr_overlap(ploidy->itr) ) + { + int sex = regitr_payload(ploidy->itr,sex_ploidy_t).sex; + int pld = regitr_payload(ploidy->itr,sex_ploidy_t).ploidy; + if ( pld!=ploidy->dflt ) + { + if ( sex2ploidy ) sex2ploidy[ sex ] = pld; + if ( _min > pld ) _min = pld; + if ( _max < pld ) _max = pld; + } + } + if ( _max==-1 ) _max = _min = ploidy->dflt; + if ( max ) *max = _max; + if ( min ) *min = _min; + + return 1; +} + +int ploidy_nsex(ploidy_t *ploidy) +{ + return ploidy->nsex; +} + +char *ploidy_id2sex(ploidy_t *ploidy, int id) +{ + if ( id<0 || id>=ploidy->nsex ) return NULL; + return ploidy->id2sex[id]; +} + +int ploidy_sex2id(ploidy_t *ploidy, char *sex) +{ + int id; + if ( khash_str2int_get(ploidy->sex2id,sex,&id)!=0 ) return -1; + return id; +} + +int ploidy_add_sex(ploidy_t *ploidy, const char *sex) +{ + int id; + if ( khash_str2int_get(ploidy->sex2id, sex, &id)==0 ) return id; + ploidy->nsex++; + hts_expand0(char*,ploidy->nsex,ploidy->msex,ploidy->id2sex); + ploidy->id2sex[ploidy->nsex-1] = strdup(sex); + ploidy->sex2dflt = (int*) realloc(ploidy->sex2dflt,sizeof(int)*ploidy->nsex); + ploidy->sex2dflt[ploidy->nsex-1] = ploidy->dflt; + return khash_str2int_inc(ploidy->sex2id, ploidy->id2sex[ploidy->nsex-1]); +} + +int ploidy_max(ploidy_t *ploidy) +{ + return ploidy->dflt > ploidy->max ? ploidy->dflt : ploidy->max; +} + +int ploidy_min(ploidy_t *ploidy) +{ + return ploidy->dflt < ploidy->min ? ploidy->dflt : ploidy->min; +} + diff --git a/bcftools/ploidy.c.pysam.c b/bcftools/ploidy.c.pysam.c new file mode 100644 index 0000000..aee0c56 --- /dev/null +++ b/bcftools/ploidy.c.pysam.c @@ -0,0 +1,270 @@ +#include "bcftools.pysam.h" + +/* + Copyright (C) 2014-2016 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include +#include "bcftools.h" +#include "ploidy.h" + +struct _ploidy_t +{ + int nsex, msex; // number of genders, m:number of allocated elements in id2sex array + int dflt, min, max; // ploidy: default, min and max (only explicitly listed) + int *sex2dflt; + regidx_t *idx; + regitr_t *itr; + void *sex2id; + char **id2sex; + kstring_t tmp_str; +}; + +typedef struct +{ + int sex, ploidy; +} +sex_ploidy_t; + + +regidx_t *ploidy_regions(ploidy_t *ploidy) +{ + return ploidy->idx; +} + +int ploidy_parse(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + int i, ret; + ploidy_t *ploidy = (ploidy_t*) usr; + void *sex2id = ploidy->sex2id; + + // Check for special case of default ploidy "* * * " + int default_ploidy_def = 0; + + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( ss[0]=='*' && (!ss[1] || isspace(ss[1])) ) + default_ploidy_def = 1; // definition of default ploidy, chr="*" + else + { + // Fill CHR,FROM,TO + ret = regidx_parse_tab(line,chr_beg,chr_end,beg,end,NULL,NULL); + if ( ret!=0 ) return ret; + } + + // Skip the fields already parsed by regidx_parse_tab + ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + for (i=0; i<3; i++) + { + while ( *ss && !isspace(*ss) ) ss++; + if ( !*ss ) return -2; // wrong number of fields + while ( *ss && isspace(*ss) ) ss++; + } + if ( !*ss ) return -2; + + // Parse the payload + char *se = ss; + while ( *se && !isspace(*se) ) se++; + if ( !*se || se==ss ) error("Could not parse: %s\n", line); + ploidy->tmp_str.l = 0; + kputsn(ss,se-ss,&ploidy->tmp_str); + + sex_ploidy_t *sp = (sex_ploidy_t*) payload; + if ( khash_str2int_get(sex2id, ploidy->tmp_str.s, &sp->sex) != 0 ) + { + ploidy->nsex++; + hts_expand0(char*,ploidy->nsex,ploidy->msex,ploidy->id2sex); + ploidy->id2sex[ploidy->nsex-1] = strdup(ploidy->tmp_str.s); + sp->sex = khash_str2int_inc(ploidy->sex2id, ploidy->id2sex[ploidy->nsex-1]); + ploidy->sex2dflt = (int*) realloc(ploidy->sex2dflt,sizeof(int)*ploidy->nsex); + ploidy->sex2dflt[ploidy->nsex-1] = -1; + } + + ss = se; + while ( *se && isspace(*se) ) se++; + if ( !*se ) error("Could not parse: %s\n", line); + sp->ploidy = strtol(ss,&se,10); + if ( ss==se ) error("Could not parse: %s\n", line); + if ( ploidy->min<0 || sp->ploidy < ploidy->min ) ploidy->min = sp->ploidy; + if ( ploidy->max<0 || sp->ploidy > ploidy->max ) ploidy->max = sp->ploidy; + + // Special case, chr="*" stands for a default value + if ( default_ploidy_def ) + { + ploidy->sex2dflt[ploidy->nsex-1] = sp->ploidy; + return -1; + } + + return 0; +} + +static void _set_defaults(ploidy_t *ploidy, int dflt) +{ + int i; + if ( khash_str2int_get(ploidy->sex2id, "*", &i) == 0 ) dflt = ploidy->sex2dflt[i]; + for (i=0; insex; i++) + if ( ploidy->sex2dflt[i]==-1 ) ploidy->sex2dflt[i] = dflt; + + ploidy->dflt = dflt; + if ( ploidy->min<0 || dflt < ploidy->min ) ploidy->min = dflt; + if ( ploidy->max<0 || dflt > ploidy->max ) ploidy->max = dflt; +} + +ploidy_t *ploidy_init(const char *fname, int dflt) +{ + ploidy_t *pld = (ploidy_t*) calloc(1,sizeof(ploidy_t)); + if ( !pld ) return NULL; + + pld->min = pld->max = -1; + pld->sex2id = khash_str2int_init(); + pld->idx = regidx_init(fname,ploidy_parse,NULL,sizeof(sex_ploidy_t),pld); + if ( !pld->idx ) + { + ploidy_destroy(pld); + return NULL; + } + pld->itr = regitr_init(pld->idx); + _set_defaults(pld,dflt); + return pld; +} + +ploidy_t *ploidy_init_string(const char *str, int dflt) +{ + ploidy_t *pld = (ploidy_t*) calloc(1,sizeof(ploidy_t)); + if ( !pld ) return NULL; + + pld->min = pld->max = -1; + pld->sex2id = khash_str2int_init(); + pld->idx = regidx_init(NULL,ploidy_parse,NULL,sizeof(sex_ploidy_t),pld); + pld->itr = regitr_init(pld->idx); + + kstring_t tmp = {0,0,0}; + const char *ss = str; + while ( *ss ) + { + while ( *ss && isspace(*ss) ) ss++; + const char *se = ss; + while ( *se && *se!='\r' && *se!='\n' ) se++; + tmp.l = 0; + kputsn(ss, se-ss, &tmp); + regidx_insert(pld->idx,tmp.s); + while ( *se && isspace(*se) ) se++; + ss = se; + } + free(tmp.s); + + _set_defaults(pld,dflt); + return pld; +} + +void ploidy_destroy(ploidy_t *ploidy) +{ + if ( ploidy->sex2id ) khash_str2int_destroy_free(ploidy->sex2id); + if ( ploidy->itr ) regitr_destroy(ploidy->itr); + if ( ploidy->idx ) regidx_destroy(ploidy->idx); + free(ploidy->id2sex); + free(ploidy->tmp_str.s); + free(ploidy->sex2dflt); + free(ploidy); +} + +int ploidy_query(ploidy_t *ploidy, char *seq, int pos, int *sex2ploidy, int *min, int *max) +{ + int i, ret = regidx_overlap(ploidy->idx, seq,pos,pos, ploidy->itr); + + if ( !sex2ploidy && !min && !max ) return ret; + + if ( !ret ) + { + // no overlap + if ( min ) *min = ploidy->dflt; + if ( max ) *max = ploidy->dflt; + if ( sex2ploidy ) + for (i=0; insex; i++) sex2ploidy[i] = ploidy->sex2dflt[i]; + return 0; + } + + int _min = INT_MAX, _max = -1; + if ( sex2ploidy ) for (i=0; insex; i++) sex2ploidy[i] = ploidy->dflt; + + while ( regitr_overlap(ploidy->itr) ) + { + int sex = regitr_payload(ploidy->itr,sex_ploidy_t).sex; + int pld = regitr_payload(ploidy->itr,sex_ploidy_t).ploidy; + if ( pld!=ploidy->dflt ) + { + if ( sex2ploidy ) sex2ploidy[ sex ] = pld; + if ( _min > pld ) _min = pld; + if ( _max < pld ) _max = pld; + } + } + if ( _max==-1 ) _max = _min = ploidy->dflt; + if ( max ) *max = _max; + if ( min ) *min = _min; + + return 1; +} + +int ploidy_nsex(ploidy_t *ploidy) +{ + return ploidy->nsex; +} + +char *ploidy_id2sex(ploidy_t *ploidy, int id) +{ + if ( id<0 || id>=ploidy->nsex ) return NULL; + return ploidy->id2sex[id]; +} + +int ploidy_sex2id(ploidy_t *ploidy, char *sex) +{ + int id; + if ( khash_str2int_get(ploidy->sex2id,sex,&id)!=0 ) return -1; + return id; +} + +int ploidy_add_sex(ploidy_t *ploidy, const char *sex) +{ + int id; + if ( khash_str2int_get(ploidy->sex2id, sex, &id)==0 ) return id; + ploidy->nsex++; + hts_expand0(char*,ploidy->nsex,ploidy->msex,ploidy->id2sex); + ploidy->id2sex[ploidy->nsex-1] = strdup(sex); + ploidy->sex2dflt = (int*) realloc(ploidy->sex2dflt,sizeof(int)*ploidy->nsex); + ploidy->sex2dflt[ploidy->nsex-1] = ploidy->dflt; + return khash_str2int_inc(ploidy->sex2id, ploidy->id2sex[ploidy->nsex-1]); +} + +int ploidy_max(ploidy_t *ploidy) +{ + return ploidy->dflt > ploidy->max ? ploidy->dflt : ploidy->max; +} + +int ploidy_min(ploidy_t *ploidy) +{ + return ploidy->dflt < ploidy->min ? ploidy->dflt : ploidy->min; +} + diff --git a/bcftools/ploidy.h b/bcftools/ploidy.h new file mode 100644 index 0000000..7697c65 --- /dev/null +++ b/bcftools/ploidy.h @@ -0,0 +1,129 @@ +/* + Copyright (C) 2014-2015 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* + Lookup from region and sex to ploidy. + + Example of usage: + + int default_ploidy = 2; + ploidy_t *pld = ploidy_init(fname, default_ploidy); + + int nsex = ploidy_nsex(pld); + int *sex2ploidy = malloc(sizeof(int)*nsex); + + ploidy_query(pld, "X",60000, sex2ploidy, NULL, NULL); + for (i=0; i + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include "prob1.h" + +#define MC_MAX_EM_ITER 16 +#define MC_EM_EPS 1e-5 +#define MC_DEF_INDEL 0.15 + +void bcf_p1_indel_prior(bcf_p1aux_t *ma, double x) +{ + int i; + for (i = 0; i < ma->M; ++i) + ma->phi_indel[i] = ma->phi[i] * x; + ma->phi_indel[ma->M] = 1. - ma->phi[ma->M] * x; +} + +static void init_prior(int type, double theta, int M, double *phi) +{ + int i; + if (type == MC_PTYPE_COND2) { + for (i = 0; i <= M; ++i) + phi[i] = 2. * (i + 1) / (M + 1) / (M + 2); + } else if (type == MC_PTYPE_FLAT) { + for (i = 0; i <= M; ++i) + phi[i] = 1. / (M + 1); + } else { + double sum; + for (i = 0, sum = 0.; i < M; ++i) + sum += (phi[i] = theta / (M - i)); + phi[M] = 1. - sum; + } +} + +void bcf_p1_init_prior(bcf_p1aux_t *ma, int type, double theta) +{ + init_prior(type, theta, ma->M, ma->phi); + bcf_p1_indel_prior(ma, MC_DEF_INDEL); +} + +void bcf_p1_init_subprior(bcf_p1aux_t *ma, int type, double theta) +{ + if (ma->n1 <= 0 || ma->n1 >= ma->M) return; + init_prior(type, theta, 2*ma->n1, ma->phi1); + init_prior(type, theta, 2*(ma->n - ma->n1), ma->phi2); +} + + +/* Initialise a bcf_p1aux_t */ +bcf_p1aux_t *bcf_p1_init(int n_smpl, uint8_t *ploidy) +{ + bcf_p1aux_t *ma; + int i; + ma = (bcf_p1aux_t*) calloc(1, sizeof(bcf_p1aux_t)); + ma->n1 = -1; + ma->n = n_smpl; + ma->M = 2 * n_smpl; + if (ploidy) { + ma->ploidy = (uint8_t*) malloc(n_smpl); + memcpy(ma->ploidy, ploidy, n_smpl); + for (i = 0, ma->M = 0; i < n_smpl; ++i) ma->M += ploidy[i]; + if (ma->M == 2 * n_smpl) { + free(ma->ploidy); + ma->ploidy = 0; + } + } + ma->q2p = (double*) calloc(256, sizeof(double)); + ma->pdg = (double*) calloc(3 * ma->n, sizeof(double)); + ma->phi = (double*) calloc(ma->M + 1, sizeof(double)); + ma->phi_indel = (double*) calloc(ma->M + 1, sizeof(double)); + ma->phi1 = (double*) calloc(ma->M + 1, sizeof(double)); + ma->phi2 = (double*) calloc(ma->M + 1, sizeof(double)); + ma->z = (double*) calloc(ma->M + 1, sizeof(double)); + ma->zswap = (double*) calloc(ma->M + 1, sizeof(double)); + ma->z1 = (double*) calloc(ma->M + 1, sizeof(double)); // actually we do not need this large + ma->z2 = (double*) calloc(ma->M + 1, sizeof(double)); + ma->afs = (double*) calloc(ma->M + 1, sizeof(double)); + ma->afs1 = (double*) calloc(ma->M + 1, sizeof(double)); + ma->lf = (double*) calloc(ma->M + 1, sizeof(double)); + for (i = 0; i < 256; ++i) + ma->q2p[i] = pow(10., -i / 10.); + for (i = 0; i <= ma->M; ++i) ma->lf[i] = lgamma(i + 1); + bcf_p1_init_prior(ma, MC_PTYPE_FULL, 1e-3); // the simplest prior + return ma; +} + +int bcf_p1_get_M(bcf_p1aux_t *b) { return b->M; } + +int bcf_p1_set_n1(bcf_p1aux_t *b, int n1) +{ + if (n1 == 0 || n1 >= b->n) return -1; + if (b->M != b->n * 2) { + fprintf(stderr, "[%s] unable to set `n1' when there are haploid samples.\n", __func__); + return -1; + } + b->n1 = n1; + return 0; +} + +void bcf_p1_destroy(bcf_p1aux_t *ma) +{ + if (ma) { + int k; + free(ma->lf); + if (ma->hg && ma->n1 > 0) { + for (k = 0; k <= 2*ma->n1; ++k) free(ma->hg[k]); + free(ma->hg); + } + free(ma->ploidy); free(ma->q2p); free(ma->pdg); + free(ma->phi); free(ma->phi_indel); free(ma->phi1); free(ma->phi2); + free(ma->z); free(ma->zswap); free(ma->z1); free(ma->z2); + free(ma->afs); free(ma->afs1); + free(ma); + } +} + +extern double kf_gammap(double s, double z); +int test16(bcf1_t *b, anno16_t *a); + +/* Calculate P(D|g) */ +static int cal_pdg(const bcf1_t *b, bcf_p1aux_t *ma) +{ + int i, j; + long p_a[16], *p=p_a, tmp; + if (b->n_allele > 16) + p = (long*) malloc(b->n_allele * sizeof(long)); + memset(p, 0, sizeof(long) * b->n_allele); + + // Set P(D|g) for each sample and sum phread likelihoods across all samples to create lk + for (j = 0; j < ma->n; ++j) { + // Fetch the PL array for the sample + const int *pi = ma->PL + j * ma->PL_len; + // Fetch the P(D|g) array for the sample + double *pdg = ma->pdg + j * 3; + pdg[0] = ma->q2p[pi[2]]; pdg[1] = ma->q2p[pi[1]]; pdg[2] = ma->q2p[pi[0]]; + for (i = 0; i < b->n_allele; ++i) + p[i] += (int)pi[(i+1)*(i+2)/2-1]; + } + for (i = 0; i < b->n_allele; ++i) p[i] = p[i]<<4 | i; + for (i = 1; i < b->n_allele; ++i) // insertion sort + for (j = i; j > 0 && p[j] < p[j-1]; --j) + tmp = p[j], p[j] = p[j-1], p[j-1] = tmp; + for (i = b->n_allele - 1; i >= 0; --i) + if ((p[i]&0xf) == 0) break; + if (p != p_a) + free(p); + return i; +} + + +/* f0 is freq of the ref allele */ +int bcf_p1_call_gt(const bcf_p1aux_t *ma, double f0, int k, int is_var) +{ + double sum, g[3]; + double max, f3[3], *pdg = ma->pdg + k * 3; + int q, i, max_i, ploidy; + /* determine ploidy */ + ploidy = ma->ploidy? ma->ploidy[k] : 2; + if (ploidy == 2) { + /* given allele frequency we can determine how many of each + * genotype we have by HWE p=1-q PP=p^2 PQ&QP=2*p*q QQ=q^2 */ + f3[0] = (1.-f0)*(1.-f0); f3[1] = 2.*f0*(1.-f0); f3[2] = f0*f0; + } else { + f3[0] = 1. - f0; f3[1] = 0; f3[2] = f0; + } + for (i = 0, sum = 0.; i < 3; ++i) + sum += (g[i] = pdg[i] * f3[i]); + /* normalise g and then determine max */ + for (i = 0, max = -1., max_i = 0; i < 3; ++i) { + g[i] /= sum; + if (g[i] > max) max = g[i], max_i = i; + } + if ( !is_var ) { max_i = 2; max = g[2]; } // force 0/0 genotype if the site is non-variant + max = 1. - max; + if (max < 1e-308) max = 1e-308; + q = (int)(-4.343 * log(max) + .499); + if (q > 99) q = 99; + return q<<2|max_i; +} + +// If likelihoods fall below this they get squashed to 0 +#define TINY 1e-20 +static void mc_cal_y_core(bcf_p1aux_t *ma, int beg) +{ + double *z[2], *tmp, *pdg; + int _j, last_min, last_max; + assert(beg == 0 || ma->M == ma->n*2); + z[0] = ma->z; + z[1] = ma->zswap; + pdg = ma->pdg; + memset(z[0], 0, sizeof(double) * (ma->M + 1)); + memset(z[1], 0, sizeof(double) * (ma->M + 1)); + z[0][0] = 1.; + last_min = last_max = 0; + ma->t = 0.; + if (ma->M == ma->n * 2) { + int M = 0; + for (_j = beg; _j < ma->n; ++_j) { + int k, j = _j - beg, _min = last_min, _max = last_max, M0; + double p[3], sum; + M0 = M; M += 2; + // Fetch P(D|g) for this sample + pdg = ma->pdg + _j * 3; + p[0] = pdg[0]; p[1] = 2. * pdg[1]; p[2] = pdg[2]; + for (; _min < _max && z[0][_min] < TINY; ++_min) z[0][_min] = z[1][_min] = 0.; + for (; _max > _min && z[0][_max] < TINY; --_max) z[0][_max] = z[1][_max] = 0.; + _max += 2; + if (_min == 0) k = 0, z[1][k] = (M0-k+1) * (M0-k+2) * p[0] * z[0][k]; + if (_min <= 1) k = 1, z[1][k] = (M0-k+1) * (M0-k+2) * p[0] * z[0][k] + k*(M0-k+2) * p[1] * z[0][k-1]; + for (k = _min < 2? 2 : _min; k <= _max; ++k) + z[1][k] = (M0-k+1)*(M0-k+2) * p[0] * z[0][k] + k*(M0-k+2) * p[1] * z[0][k-1] + k*(k-1)* p[2] * z[0][k-2]; + for (k = _min, sum = 0.; k <= _max; ++k) sum += z[1][k]; + ma->t += log(sum / (M * (M - 1.))); + for (k = _min; k <= _max; ++k) z[1][k] /= sum; + if (_min >= 1) z[1][_min-1] = 0.; + if (_min >= 2) z[1][_min-2] = 0.; + // If we are not on the last sample + if (j < ma->n - 1) z[1][_max+1] = z[1][_max+2] = 0.; + if (_j == ma->n1 - 1) { // set pop1; ma->n1==-1 when unset + ma->t1 = ma->t; + memcpy(ma->z1, z[1], sizeof(double) * (ma->n1 * 2 + 1)); + } + tmp = z[0]; z[0] = z[1]; z[1] = tmp; + last_min = _min; last_max = _max; + } + //for (_j = 0; _j < last_min; ++_j) z[0][_j] = 0.; // TODO: are these necessary? + //for (_j = last_max + 1; _j < ma->M; ++_j) z[0][_j] = 0.; + } else { // this block is very similar to the block above; these two might be merged in future + int j, M = 0; + for (j = 0; j < ma->n; ++j) { + int k, M0, _min = last_min, _max = last_max; + double p[3], sum; + // Fetch P(D|g) for this sample + pdg = ma->pdg + j * 3; + for (; _min < _max && z[0][_min] < TINY; ++_min) z[0][_min] = z[1][_min] = 0.; + for (; _max > _min && z[0][_max] < TINY; --_max) z[0][_max] = z[1][_max] = 0.; + M0 = M; + M += ma->ploidy[j]; + if (ma->ploidy[j] == 1) { + p[0] = pdg[0]; p[1] = pdg[2]; + _max++; + if (_min == 0) k = 0, z[1][k] = (M0+1-k) * p[0] * z[0][k]; + for (k = _min < 1? 1 : _min; k <= _max; ++k) + z[1][k] = (M0+1-k) * p[0] * z[0][k] + k * p[1] * z[0][k-1]; + for (k = _min, sum = 0.; k <= _max; ++k) sum += z[1][k]; + ma->t += log(sum / M); + for (k = _min; k <= _max; ++k) z[1][k] /= sum; + if (_min >= 1) z[1][_min-1] = 0.; + // If we are not on the last sample + if (j < ma->n - 1) z[1][_max+1] = 0.; + } else if (ma->ploidy[j] == 2) { + p[0] = pdg[0]; p[1] = 2 * pdg[1]; p[2] = pdg[2]; + _max += 2; + if (_min == 0) k = 0, z[1][k] = (M0-k+1) * (M0-k+2) * p[0] * z[0][k]; + if (_min <= 1) k = 1, z[1][k] = (M0-k+1) * (M0-k+2) * p[0] * z[0][k] + k*(M0-k+2) * p[1] * z[0][k-1]; + for (k = _min < 2? 2 : _min; k <= _max; ++k) + z[1][k] = (M0-k+1)*(M0-k+2) * p[0] * z[0][k] + k*(M0-k+2) * p[1] * z[0][k-1] + k*(k-1)* p[2] * z[0][k-2]; + for (k = _min, sum = 0.; k <= _max; ++k) sum += z[1][k]; + ma->t += log(sum / (M * (M - 1.))); + for (k = _min; k <= _max; ++k) z[1][k] /= sum; + if (_min >= 1) z[1][_min-1] = 0.; + if (_min >= 2) z[1][_min-2] = 0.; + // If we are not on the last sample + if (j < ma->n - 1) z[1][_max+1] = z[1][_max+2] = 0.; + } + tmp = z[0]; z[0] = z[1]; z[1] = tmp; + last_min = _min; last_max = _max; + } + } + if (z[0] != ma->z) memcpy(ma->z, z[0], sizeof(double) * (ma->M + 1)); +} + +static void mc_cal_y(bcf_p1aux_t *ma) +{ + if (ma->n1 > 0 && ma->n1 < ma->n && ma->M == ma->n * 2) { // NB: ma->n1 is ineffective when there are haploid samples + int k; + long double x; + memset(ma->z1, 0, sizeof(double) * (2 * ma->n1 + 1)); + memset(ma->z2, 0, sizeof(double) * (2 * (ma->n - ma->n1) + 1)); + ma->t1 = ma->t2 = 0.; + mc_cal_y_core(ma, ma->n1); + ma->t2 = ma->t; + memcpy(ma->z2, ma->z, sizeof(double) * (2 * (ma->n - ma->n1) + 1)); + mc_cal_y_core(ma, 0); + // rescale z + x = expl(ma->t - (ma->t1 + ma->t2)); + for (k = 0; k <= ma->M; ++k) ma->z[k] *= x; + } else mc_cal_y_core(ma, 0); +} + +#define CONTRAST_TINY 1e-30 + +extern double kf_gammaq(double s, double z); // incomplete gamma function for chi^2 test + +static inline double chi2_test(int a, int b, int c, int d) +{ + double x, z; + x = (double)(a+b) * (c+d) * (b+d) * (a+c); + if (x == 0.) return 1; + z = a * d - b * c; + return kf_gammaq(.5, .5 * z * z * (a+b+c+d) / x); +} + +// chi2=(a+b+c+d)(ad-bc)^2/[(a+b)(c+d)(a+c)(b+d)] +static inline double contrast2_aux(const bcf_p1aux_t *p1, double sum, int k1, int k2, double x[3]) +{ + double p = p1->phi[k1+k2] * p1->z1[k1] * p1->z2[k2] / sum * p1->hg[k1][k2]; + int n1 = p1->n1, n2 = p1->n - p1->n1; + if (p < CONTRAST_TINY) return -1; + if (.5*k1/n1 < .5*k2/n2) x[1] += p; + else if (.5*k1/n1 > .5*k2/n2) x[2] += p; + else x[0] += p; + return p * chi2_test(k1, k2, (n1<<1) - k1, (n2<<1) - k2); +} + +static double contrast2(bcf_p1aux_t *p1, double ret[3]) +{ + int k, k1, k2, k10, k20, n1, n2; + double sum; + // get n1 and n2 + n1 = p1->n1; n2 = p1->n - p1->n1; + if (n1 <= 0 || n2 <= 0) return 0.; + if (p1->hg == 0) { // initialize the hypergeometric distribution + /* NB: the hg matrix may take a lot of memory when there are many samples. There is a way + to avoid precomputing this matrix, but it is slower and quite intricate. The following + computation in this block can be accelerated with a similar strategy, but perhaps this + is not a serious concern for now. */ + double tmp = lgamma(2*(n1+n2)+1) - (lgamma(2*n1+1) + lgamma(2*n2+1)); + p1->hg = (double**) calloc(2*n1+1, sizeof(double*)); + for (k1 = 0; k1 <= 2*n1; ++k1) { + p1->hg[k1] = (double*)calloc(2*n2+1, sizeof(double)); + for (k2 = 0; k2 <= 2*n2; ++k2) + p1->hg[k1][k2] = exp(lgamma(k1+k2+1) + lgamma(p1->M-k1-k2+1) - (lgamma(k1+1) + lgamma(k2+1) + lgamma(2*n1-k1+1) + lgamma(2*n2-k2+1) + tmp)); + } + } + { // compute + long double suml = 0; + for (k = 0; k <= p1->M; ++k) suml += p1->phi[k] * p1->z[k]; + sum = suml; + } + { // get the max k1 and k2 + double max; + int max_k; + for (k = 0, max = 0, max_k = -1; k <= 2*n1; ++k) { + double x = p1->phi1[k] * p1->z1[k]; + if (x > max) max = x, max_k = k; + } + k10 = max_k; + for (k = 0, max = 0, max_k = -1; k <= 2*n2; ++k) { + double x = p1->phi2[k] * p1->z2[k]; + if (x > max) max = x, max_k = k; + } + k20 = max_k; + } + { // We can do the following with one nested loop, but that is an O(N^2) thing. The following code block is much faster for large N. + double x[3], y; + long double z = 0., L[2]; + x[0] = x[1] = x[2] = 0; L[0] = L[1] = 0; + for (k1 = k10; k1 >= 0; --k1) { + for (k2 = k20; k2 >= 0; --k2) { + if ((y = contrast2_aux(p1, sum, k1, k2, x)) < 0) break; + else z += y; + } + for (k2 = k20 + 1; k2 <= 2*n2; ++k2) { + if ((y = contrast2_aux(p1, sum, k1, k2, x)) < 0) break; + else z += y; + } + } + ret[0] = x[0]; ret[1] = x[1]; ret[2] = x[2]; + x[0] = x[1] = x[2] = 0; + for (k1 = k10 + 1; k1 <= 2*n1; ++k1) { + for (k2 = k20; k2 >= 0; --k2) { + if ((y = contrast2_aux(p1, sum, k1, k2, x)) < 0) break; + else z += y; + } + for (k2 = k20 + 1; k2 <= 2*n2; ++k2) { + if ((y = contrast2_aux(p1, sum, k1, k2, x)) < 0) break; + else z += y; + } + } + ret[0] += x[0]; ret[1] += x[1]; ret[2] += x[2]; + if (ret[0] + ret[1] + ret[2] < 0.95) { // in case of bad things happened + ret[0] = ret[1] = ret[2] = 0; L[0] = L[1] = 0; + for (k1 = 0, z = 0.; k1 <= 2*n1; ++k1) + for (k2 = 0; k2 <= 2*n2; ++k2) + if ((y = contrast2_aux(p1, sum, k1, k2, ret)) >= 0) z += y; + if (ret[0] + ret[1] + ret[2] < 0.95) // It seems that this may be caused by floating point errors. I do not really understand why... + z = 1.0, ret[0] = ret[1] = ret[2] = 1./3; + } + return (double)z; + } +} + +static double mc_cal_afs(bcf_p1aux_t *ma, double *p_ref_folded, double *p_var_folded) +{ + int k; + long double sum = 0., sum2; + double *phi = ma->is_indel? ma->phi_indel : ma->phi; + memset(ma->afs1, 0, sizeof(double) * (ma->M + 1)); + mc_cal_y(ma); + // compute AFS + // MP15: is this using equation 20 from doi:10.1093/bioinformatics/btr509? + for (k = 0, sum = 0.; k <= ma->M; ++k) + sum += (long double)phi[k] * ma->z[k]; + for (k = 0; k <= ma->M; ++k) { + ma->afs1[k] = phi[k] * ma->z[k] / sum; + if (isnan(ma->afs1[k]) || isinf(ma->afs1[k])) return -1.; + } + // compute folded variant probability + for (k = 0, sum = 0.; k <= ma->M; ++k) + sum += (long double)(phi[k] + phi[ma->M - k]) / 2. * ma->z[k]; + for (k = 1, sum2 = 0.; k < ma->M; ++k) + sum2 += (long double)(phi[k] + phi[ma->M - k]) / 2. * ma->z[k]; + *p_var_folded = sum2 / sum; + *p_ref_folded = (phi[k] + phi[ma->M - k]) / 2. * (ma->z[ma->M] + ma->z[0]) / sum; + // the expected frequency + for (k = 0, sum = 0.; k <= ma->M; ++k) { + ma->afs[k] += ma->afs1[k]; + sum += k * ma->afs1[k]; + } + return sum / ma->M; +} + +int bcf_p1_cal(call_t *call, bcf1_t *b, int do_contrast, bcf_p1aux_t *ma, bcf_p1rst_t *rst) +{ + int i, k; + long double sum = 0.; + ma->is_indel = bcf_is_snp(b) ? 0 : 1; + rst->perm_rank = -1; + + ma->PL = call->PLs; + ma->PL_len = call->nPLs / b->n_sample; + if (b->n_allele < 2) return -1; // FIXME: find a better solution + + rst->rank0 = cal_pdg(b, ma); + rst->f_exp = mc_cal_afs(ma, &rst->p_ref_folded, &rst->p_var_folded); + rst->p_ref = ma->afs1[ma->M]; + for (k = 0, sum = 0.; k < ma->M; ++k) + sum += ma->afs1[k]; + rst->p_var = (double)sum; + { // compute the allele count + double max = -1; + rst->ac = -1; + for (k = 0; k <= ma->M; ++k) + if (max < ma->z[k]) max = ma->z[k], rst->ac = k; + rst->ac = ma->M - rst->ac; + } + // calculate f_flat and f_em + for (k = 0, sum = 0.; k <= ma->M; ++k) + sum += (long double)ma->z[k]; + rst->f_flat = 0.; + for (k = 0; k <= ma->M; ++k) { + double p = ma->z[k] / sum; + rst->f_flat += k * p; + } + rst->f_flat /= ma->M; + { // estimate equal-tail credible interval (95% level) + int l, h; + double p; + for (i = 0, p = 0.; i <= ma->M; ++i) + if (p + ma->afs1[i] > 0.025) break; + else p += ma->afs1[i]; + l = i; + for (i = ma->M, p = 0.; i >= 0; --i) + if (p + ma->afs1[i] > 0.025) break; + else p += ma->afs1[i]; + h = i; + rst->cil = (double)(ma->M - h) / ma->M; rst->cih = (double)(ma->M - l) / ma->M; + } + if (ma->n1 > 0) { // compute LRT + double max0, max1, max2; + for (k = 0, max0 = -1; k <= ma->M; ++k) + if (max0 < ma->z[k]) max0 = ma->z[k]; + for (k = 0, max1 = -1; k <= ma->n1 * 2; ++k) + if (max1 < ma->z1[k]) max1 = ma->z1[k]; + for (k = 0, max2 = -1; k <= ma->M - ma->n1 * 2; ++k) + if (max2 < ma->z2[k]) max2 = ma->z2[k]; + rst->lrt = log(max1 * max2 / max0); + rst->lrt = rst->lrt < 0? 1 : kf_gammaq(.5, rst->lrt); + } else rst->lrt = -1.0; + rst->cmp[0] = rst->cmp[1] = rst->cmp[2] = rst->p_chi2 = -1.0; + if (do_contrast && rst->p_var > 0.5) // skip contrast2() if the locus is a strong non-variant + rst->p_chi2 = contrast2(ma, rst->cmp); + return 0; +} + +void bcf_p1_dump_afs(bcf_p1aux_t *ma) +{ + int k; + fprintf(stderr, "[afs]"); + for (k = 0; k <= ma->M; ++k) + fprintf(stderr, " %d:%.3lf", k, ma->afs[ma->M - k]); + fprintf(stderr, "\n"); + memset(ma->afs, 0, sizeof(double) * (ma->M + 1)); +} diff --git a/bcftools/prob1.c.pysam.c b/bcftools/prob1.c.pysam.c new file mode 100644 index 0000000..822d0c2 --- /dev/null +++ b/bcftools/prob1.c.pysam.c @@ -0,0 +1,526 @@ +#include "bcftools.pysam.h" + +/* prob1.c -- mathematical utility functions. + + Copyright (C) 2010, 2011 Broad Institute. + Copyright (C) 2012, 2013-2014, 2017 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include "prob1.h" + +#define MC_MAX_EM_ITER 16 +#define MC_EM_EPS 1e-5 +#define MC_DEF_INDEL 0.15 + +void bcf_p1_indel_prior(bcf_p1aux_t *ma, double x) +{ + int i; + for (i = 0; i < ma->M; ++i) + ma->phi_indel[i] = ma->phi[i] * x; + ma->phi_indel[ma->M] = 1. - ma->phi[ma->M] * x; +} + +static void init_prior(int type, double theta, int M, double *phi) +{ + int i; + if (type == MC_PTYPE_COND2) { + for (i = 0; i <= M; ++i) + phi[i] = 2. * (i + 1) / (M + 1) / (M + 2); + } else if (type == MC_PTYPE_FLAT) { + for (i = 0; i <= M; ++i) + phi[i] = 1. / (M + 1); + } else { + double sum; + for (i = 0, sum = 0.; i < M; ++i) + sum += (phi[i] = theta / (M - i)); + phi[M] = 1. - sum; + } +} + +void bcf_p1_init_prior(bcf_p1aux_t *ma, int type, double theta) +{ + init_prior(type, theta, ma->M, ma->phi); + bcf_p1_indel_prior(ma, MC_DEF_INDEL); +} + +void bcf_p1_init_subprior(bcf_p1aux_t *ma, int type, double theta) +{ + if (ma->n1 <= 0 || ma->n1 >= ma->M) return; + init_prior(type, theta, 2*ma->n1, ma->phi1); + init_prior(type, theta, 2*(ma->n - ma->n1), ma->phi2); +} + + +/* Initialise a bcf_p1aux_t */ +bcf_p1aux_t *bcf_p1_init(int n_smpl, uint8_t *ploidy) +{ + bcf_p1aux_t *ma; + int i; + ma = (bcf_p1aux_t*) calloc(1, sizeof(bcf_p1aux_t)); + ma->n1 = -1; + ma->n = n_smpl; + ma->M = 2 * n_smpl; + if (ploidy) { + ma->ploidy = (uint8_t*) malloc(n_smpl); + memcpy(ma->ploidy, ploidy, n_smpl); + for (i = 0, ma->M = 0; i < n_smpl; ++i) ma->M += ploidy[i]; + if (ma->M == 2 * n_smpl) { + free(ma->ploidy); + ma->ploidy = 0; + } + } + ma->q2p = (double*) calloc(256, sizeof(double)); + ma->pdg = (double*) calloc(3 * ma->n, sizeof(double)); + ma->phi = (double*) calloc(ma->M + 1, sizeof(double)); + ma->phi_indel = (double*) calloc(ma->M + 1, sizeof(double)); + ma->phi1 = (double*) calloc(ma->M + 1, sizeof(double)); + ma->phi2 = (double*) calloc(ma->M + 1, sizeof(double)); + ma->z = (double*) calloc(ma->M + 1, sizeof(double)); + ma->zswap = (double*) calloc(ma->M + 1, sizeof(double)); + ma->z1 = (double*) calloc(ma->M + 1, sizeof(double)); // actually we do not need this large + ma->z2 = (double*) calloc(ma->M + 1, sizeof(double)); + ma->afs = (double*) calloc(ma->M + 1, sizeof(double)); + ma->afs1 = (double*) calloc(ma->M + 1, sizeof(double)); + ma->lf = (double*) calloc(ma->M + 1, sizeof(double)); + for (i = 0; i < 256; ++i) + ma->q2p[i] = pow(10., -i / 10.); + for (i = 0; i <= ma->M; ++i) ma->lf[i] = lgamma(i + 1); + bcf_p1_init_prior(ma, MC_PTYPE_FULL, 1e-3); // the simplest prior + return ma; +} + +int bcf_p1_get_M(bcf_p1aux_t *b) { return b->M; } + +int bcf_p1_set_n1(bcf_p1aux_t *b, int n1) +{ + if (n1 == 0 || n1 >= b->n) return -1; + if (b->M != b->n * 2) { + fprintf(bcftools_stderr, "[%s] unable to set `n1' when there are haploid samples.\n", __func__); + return -1; + } + b->n1 = n1; + return 0; +} + +void bcf_p1_destroy(bcf_p1aux_t *ma) +{ + if (ma) { + int k; + free(ma->lf); + if (ma->hg && ma->n1 > 0) { + for (k = 0; k <= 2*ma->n1; ++k) free(ma->hg[k]); + free(ma->hg); + } + free(ma->ploidy); free(ma->q2p); free(ma->pdg); + free(ma->phi); free(ma->phi_indel); free(ma->phi1); free(ma->phi2); + free(ma->z); free(ma->zswap); free(ma->z1); free(ma->z2); + free(ma->afs); free(ma->afs1); + free(ma); + } +} + +extern double kf_gammap(double s, double z); +int test16(bcf1_t *b, anno16_t *a); + +/* Calculate P(D|g) */ +static int cal_pdg(const bcf1_t *b, bcf_p1aux_t *ma) +{ + int i, j; + long p_a[16], *p=p_a, tmp; + if (b->n_allele > 16) + p = (long*) malloc(b->n_allele * sizeof(long)); + memset(p, 0, sizeof(long) * b->n_allele); + + // Set P(D|g) for each sample and sum phread likelihoods across all samples to create lk + for (j = 0; j < ma->n; ++j) { + // Fetch the PL array for the sample + const int *pi = ma->PL + j * ma->PL_len; + // Fetch the P(D|g) array for the sample + double *pdg = ma->pdg + j * 3; + pdg[0] = ma->q2p[pi[2]]; pdg[1] = ma->q2p[pi[1]]; pdg[2] = ma->q2p[pi[0]]; + for (i = 0; i < b->n_allele; ++i) + p[i] += (int)pi[(i+1)*(i+2)/2-1]; + } + for (i = 0; i < b->n_allele; ++i) p[i] = p[i]<<4 | i; + for (i = 1; i < b->n_allele; ++i) // insertion sort + for (j = i; j > 0 && p[j] < p[j-1]; --j) + tmp = p[j], p[j] = p[j-1], p[j-1] = tmp; + for (i = b->n_allele - 1; i >= 0; --i) + if ((p[i]&0xf) == 0) break; + if (p != p_a) + free(p); + return i; +} + + +/* f0 is freq of the ref allele */ +int bcf_p1_call_gt(const bcf_p1aux_t *ma, double f0, int k, int is_var) +{ + double sum, g[3]; + double max, f3[3], *pdg = ma->pdg + k * 3; + int q, i, max_i, ploidy; + /* determine ploidy */ + ploidy = ma->ploidy? ma->ploidy[k] : 2; + if (ploidy == 2) { + /* given allele frequency we can determine how many of each + * genotype we have by HWE p=1-q PP=p^2 PQ&QP=2*p*q QQ=q^2 */ + f3[0] = (1.-f0)*(1.-f0); f3[1] = 2.*f0*(1.-f0); f3[2] = f0*f0; + } else { + f3[0] = 1. - f0; f3[1] = 0; f3[2] = f0; + } + for (i = 0, sum = 0.; i < 3; ++i) + sum += (g[i] = pdg[i] * f3[i]); + /* normalise g and then determine max */ + for (i = 0, max = -1., max_i = 0; i < 3; ++i) { + g[i] /= sum; + if (g[i] > max) max = g[i], max_i = i; + } + if ( !is_var ) { max_i = 2; max = g[2]; } // force 0/0 genotype if the site is non-variant + max = 1. - max; + if (max < 1e-308) max = 1e-308; + q = (int)(-4.343 * log(max) + .499); + if (q > 99) q = 99; + return q<<2|max_i; +} + +// If likelihoods fall below this they get squashed to 0 +#define TINY 1e-20 +static void mc_cal_y_core(bcf_p1aux_t *ma, int beg) +{ + double *z[2], *tmp, *pdg; + int _j, last_min, last_max; + assert(beg == 0 || ma->M == ma->n*2); + z[0] = ma->z; + z[1] = ma->zswap; + pdg = ma->pdg; + memset(z[0], 0, sizeof(double) * (ma->M + 1)); + memset(z[1], 0, sizeof(double) * (ma->M + 1)); + z[0][0] = 1.; + last_min = last_max = 0; + ma->t = 0.; + if (ma->M == ma->n * 2) { + int M = 0; + for (_j = beg; _j < ma->n; ++_j) { + int k, j = _j - beg, _min = last_min, _max = last_max, M0; + double p[3], sum; + M0 = M; M += 2; + // Fetch P(D|g) for this sample + pdg = ma->pdg + _j * 3; + p[0] = pdg[0]; p[1] = 2. * pdg[1]; p[2] = pdg[2]; + for (; _min < _max && z[0][_min] < TINY; ++_min) z[0][_min] = z[1][_min] = 0.; + for (; _max > _min && z[0][_max] < TINY; --_max) z[0][_max] = z[1][_max] = 0.; + _max += 2; + if (_min == 0) k = 0, z[1][k] = (M0-k+1) * (M0-k+2) * p[0] * z[0][k]; + if (_min <= 1) k = 1, z[1][k] = (M0-k+1) * (M0-k+2) * p[0] * z[0][k] + k*(M0-k+2) * p[1] * z[0][k-1]; + for (k = _min < 2? 2 : _min; k <= _max; ++k) + z[1][k] = (M0-k+1)*(M0-k+2) * p[0] * z[0][k] + k*(M0-k+2) * p[1] * z[0][k-1] + k*(k-1)* p[2] * z[0][k-2]; + for (k = _min, sum = 0.; k <= _max; ++k) sum += z[1][k]; + ma->t += log(sum / (M * (M - 1.))); + for (k = _min; k <= _max; ++k) z[1][k] /= sum; + if (_min >= 1) z[1][_min-1] = 0.; + if (_min >= 2) z[1][_min-2] = 0.; + // If we are not on the last sample + if (j < ma->n - 1) z[1][_max+1] = z[1][_max+2] = 0.; + if (_j == ma->n1 - 1) { // set pop1; ma->n1==-1 when unset + ma->t1 = ma->t; + memcpy(ma->z1, z[1], sizeof(double) * (ma->n1 * 2 + 1)); + } + tmp = z[0]; z[0] = z[1]; z[1] = tmp; + last_min = _min; last_max = _max; + } + //for (_j = 0; _j < last_min; ++_j) z[0][_j] = 0.; // TODO: are these necessary? + //for (_j = last_max + 1; _j < ma->M; ++_j) z[0][_j] = 0.; + } else { // this block is very similar to the block above; these two might be merged in future + int j, M = 0; + for (j = 0; j < ma->n; ++j) { + int k, M0, _min = last_min, _max = last_max; + double p[3], sum; + // Fetch P(D|g) for this sample + pdg = ma->pdg + j * 3; + for (; _min < _max && z[0][_min] < TINY; ++_min) z[0][_min] = z[1][_min] = 0.; + for (; _max > _min && z[0][_max] < TINY; --_max) z[0][_max] = z[1][_max] = 0.; + M0 = M; + M += ma->ploidy[j]; + if (ma->ploidy[j] == 1) { + p[0] = pdg[0]; p[1] = pdg[2]; + _max++; + if (_min == 0) k = 0, z[1][k] = (M0+1-k) * p[0] * z[0][k]; + for (k = _min < 1? 1 : _min; k <= _max; ++k) + z[1][k] = (M0+1-k) * p[0] * z[0][k] + k * p[1] * z[0][k-1]; + for (k = _min, sum = 0.; k <= _max; ++k) sum += z[1][k]; + ma->t += log(sum / M); + for (k = _min; k <= _max; ++k) z[1][k] /= sum; + if (_min >= 1) z[1][_min-1] = 0.; + // If we are not on the last sample + if (j < ma->n - 1) z[1][_max+1] = 0.; + } else if (ma->ploidy[j] == 2) { + p[0] = pdg[0]; p[1] = 2 * pdg[1]; p[2] = pdg[2]; + _max += 2; + if (_min == 0) k = 0, z[1][k] = (M0-k+1) * (M0-k+2) * p[0] * z[0][k]; + if (_min <= 1) k = 1, z[1][k] = (M0-k+1) * (M0-k+2) * p[0] * z[0][k] + k*(M0-k+2) * p[1] * z[0][k-1]; + for (k = _min < 2? 2 : _min; k <= _max; ++k) + z[1][k] = (M0-k+1)*(M0-k+2) * p[0] * z[0][k] + k*(M0-k+2) * p[1] * z[0][k-1] + k*(k-1)* p[2] * z[0][k-2]; + for (k = _min, sum = 0.; k <= _max; ++k) sum += z[1][k]; + ma->t += log(sum / (M * (M - 1.))); + for (k = _min; k <= _max; ++k) z[1][k] /= sum; + if (_min >= 1) z[1][_min-1] = 0.; + if (_min >= 2) z[1][_min-2] = 0.; + // If we are not on the last sample + if (j < ma->n - 1) z[1][_max+1] = z[1][_max+2] = 0.; + } + tmp = z[0]; z[0] = z[1]; z[1] = tmp; + last_min = _min; last_max = _max; + } + } + if (z[0] != ma->z) memcpy(ma->z, z[0], sizeof(double) * (ma->M + 1)); +} + +static void mc_cal_y(bcf_p1aux_t *ma) +{ + if (ma->n1 > 0 && ma->n1 < ma->n && ma->M == ma->n * 2) { // NB: ma->n1 is ineffective when there are haploid samples + int k; + long double x; + memset(ma->z1, 0, sizeof(double) * (2 * ma->n1 + 1)); + memset(ma->z2, 0, sizeof(double) * (2 * (ma->n - ma->n1) + 1)); + ma->t1 = ma->t2 = 0.; + mc_cal_y_core(ma, ma->n1); + ma->t2 = ma->t; + memcpy(ma->z2, ma->z, sizeof(double) * (2 * (ma->n - ma->n1) + 1)); + mc_cal_y_core(ma, 0); + // rescale z + x = expl(ma->t - (ma->t1 + ma->t2)); + for (k = 0; k <= ma->M; ++k) ma->z[k] *= x; + } else mc_cal_y_core(ma, 0); +} + +#define CONTRAST_TINY 1e-30 + +extern double kf_gammaq(double s, double z); // incomplete gamma function for chi^2 test + +static inline double chi2_test(int a, int b, int c, int d) +{ + double x, z; + x = (double)(a+b) * (c+d) * (b+d) * (a+c); + if (x == 0.) return 1; + z = a * d - b * c; + return kf_gammaq(.5, .5 * z * z * (a+b+c+d) / x); +} + +// chi2=(a+b+c+d)(ad-bc)^2/[(a+b)(c+d)(a+c)(b+d)] +static inline double contrast2_aux(const bcf_p1aux_t *p1, double sum, int k1, int k2, double x[3]) +{ + double p = p1->phi[k1+k2] * p1->z1[k1] * p1->z2[k2] / sum * p1->hg[k1][k2]; + int n1 = p1->n1, n2 = p1->n - p1->n1; + if (p < CONTRAST_TINY) return -1; + if (.5*k1/n1 < .5*k2/n2) x[1] += p; + else if (.5*k1/n1 > .5*k2/n2) x[2] += p; + else x[0] += p; + return p * chi2_test(k1, k2, (n1<<1) - k1, (n2<<1) - k2); +} + +static double contrast2(bcf_p1aux_t *p1, double ret[3]) +{ + int k, k1, k2, k10, k20, n1, n2; + double sum; + // get n1 and n2 + n1 = p1->n1; n2 = p1->n - p1->n1; + if (n1 <= 0 || n2 <= 0) return 0.; + if (p1->hg == 0) { // initialize the hypergeometric distribution + /* NB: the hg matrix may take a lot of memory when there are many samples. There is a way + to avoid precomputing this matrix, but it is slower and quite intricate. The following + computation in this block can be accelerated with a similar strategy, but perhaps this + is not a serious concern for now. */ + double tmp = lgamma(2*(n1+n2)+1) - (lgamma(2*n1+1) + lgamma(2*n2+1)); + p1->hg = (double**) calloc(2*n1+1, sizeof(double*)); + for (k1 = 0; k1 <= 2*n1; ++k1) { + p1->hg[k1] = (double*)calloc(2*n2+1, sizeof(double)); + for (k2 = 0; k2 <= 2*n2; ++k2) + p1->hg[k1][k2] = exp(lgamma(k1+k2+1) + lgamma(p1->M-k1-k2+1) - (lgamma(k1+1) + lgamma(k2+1) + lgamma(2*n1-k1+1) + lgamma(2*n2-k2+1) + tmp)); + } + } + { // compute + long double suml = 0; + for (k = 0; k <= p1->M; ++k) suml += p1->phi[k] * p1->z[k]; + sum = suml; + } + { // get the max k1 and k2 + double max; + int max_k; + for (k = 0, max = 0, max_k = -1; k <= 2*n1; ++k) { + double x = p1->phi1[k] * p1->z1[k]; + if (x > max) max = x, max_k = k; + } + k10 = max_k; + for (k = 0, max = 0, max_k = -1; k <= 2*n2; ++k) { + double x = p1->phi2[k] * p1->z2[k]; + if (x > max) max = x, max_k = k; + } + k20 = max_k; + } + { // We can do the following with one nested loop, but that is an O(N^2) thing. The following code block is much faster for large N. + double x[3], y; + long double z = 0., L[2]; + x[0] = x[1] = x[2] = 0; L[0] = L[1] = 0; + for (k1 = k10; k1 >= 0; --k1) { + for (k2 = k20; k2 >= 0; --k2) { + if ((y = contrast2_aux(p1, sum, k1, k2, x)) < 0) break; + else z += y; + } + for (k2 = k20 + 1; k2 <= 2*n2; ++k2) { + if ((y = contrast2_aux(p1, sum, k1, k2, x)) < 0) break; + else z += y; + } + } + ret[0] = x[0]; ret[1] = x[1]; ret[2] = x[2]; + x[0] = x[1] = x[2] = 0; + for (k1 = k10 + 1; k1 <= 2*n1; ++k1) { + for (k2 = k20; k2 >= 0; --k2) { + if ((y = contrast2_aux(p1, sum, k1, k2, x)) < 0) break; + else z += y; + } + for (k2 = k20 + 1; k2 <= 2*n2; ++k2) { + if ((y = contrast2_aux(p1, sum, k1, k2, x)) < 0) break; + else z += y; + } + } + ret[0] += x[0]; ret[1] += x[1]; ret[2] += x[2]; + if (ret[0] + ret[1] + ret[2] < 0.95) { // in case of bad things happened + ret[0] = ret[1] = ret[2] = 0; L[0] = L[1] = 0; + for (k1 = 0, z = 0.; k1 <= 2*n1; ++k1) + for (k2 = 0; k2 <= 2*n2; ++k2) + if ((y = contrast2_aux(p1, sum, k1, k2, ret)) >= 0) z += y; + if (ret[0] + ret[1] + ret[2] < 0.95) // It seems that this may be caused by floating point errors. I do not really understand why... + z = 1.0, ret[0] = ret[1] = ret[2] = 1./3; + } + return (double)z; + } +} + +static double mc_cal_afs(bcf_p1aux_t *ma, double *p_ref_folded, double *p_var_folded) +{ + int k; + long double sum = 0., sum2; + double *phi = ma->is_indel? ma->phi_indel : ma->phi; + memset(ma->afs1, 0, sizeof(double) * (ma->M + 1)); + mc_cal_y(ma); + // compute AFS + // MP15: is this using equation 20 from doi:10.1093/bioinformatics/btr509? + for (k = 0, sum = 0.; k <= ma->M; ++k) + sum += (long double)phi[k] * ma->z[k]; + for (k = 0; k <= ma->M; ++k) { + ma->afs1[k] = phi[k] * ma->z[k] / sum; + if (isnan(ma->afs1[k]) || isinf(ma->afs1[k])) return -1.; + } + // compute folded variant probability + for (k = 0, sum = 0.; k <= ma->M; ++k) + sum += (long double)(phi[k] + phi[ma->M - k]) / 2. * ma->z[k]; + for (k = 1, sum2 = 0.; k < ma->M; ++k) + sum2 += (long double)(phi[k] + phi[ma->M - k]) / 2. * ma->z[k]; + *p_var_folded = sum2 / sum; + *p_ref_folded = (phi[k] + phi[ma->M - k]) / 2. * (ma->z[ma->M] + ma->z[0]) / sum; + // the expected frequency + for (k = 0, sum = 0.; k <= ma->M; ++k) { + ma->afs[k] += ma->afs1[k]; + sum += k * ma->afs1[k]; + } + return sum / ma->M; +} + +int bcf_p1_cal(call_t *call, bcf1_t *b, int do_contrast, bcf_p1aux_t *ma, bcf_p1rst_t *rst) +{ + int i, k; + long double sum = 0.; + ma->is_indel = bcf_is_snp(b) ? 0 : 1; + rst->perm_rank = -1; + + ma->PL = call->PLs; + ma->PL_len = call->nPLs / b->n_sample; + if (b->n_allele < 2) return -1; // FIXME: find a better solution + + rst->rank0 = cal_pdg(b, ma); + rst->f_exp = mc_cal_afs(ma, &rst->p_ref_folded, &rst->p_var_folded); + rst->p_ref = ma->afs1[ma->M]; + for (k = 0, sum = 0.; k < ma->M; ++k) + sum += ma->afs1[k]; + rst->p_var = (double)sum; + { // compute the allele count + double max = -1; + rst->ac = -1; + for (k = 0; k <= ma->M; ++k) + if (max < ma->z[k]) max = ma->z[k], rst->ac = k; + rst->ac = ma->M - rst->ac; + } + // calculate f_flat and f_em + for (k = 0, sum = 0.; k <= ma->M; ++k) + sum += (long double)ma->z[k]; + rst->f_flat = 0.; + for (k = 0; k <= ma->M; ++k) { + double p = ma->z[k] / sum; + rst->f_flat += k * p; + } + rst->f_flat /= ma->M; + { // estimate equal-tail credible interval (95% level) + int l, h; + double p; + for (i = 0, p = 0.; i <= ma->M; ++i) + if (p + ma->afs1[i] > 0.025) break; + else p += ma->afs1[i]; + l = i; + for (i = ma->M, p = 0.; i >= 0; --i) + if (p + ma->afs1[i] > 0.025) break; + else p += ma->afs1[i]; + h = i; + rst->cil = (double)(ma->M - h) / ma->M; rst->cih = (double)(ma->M - l) / ma->M; + } + if (ma->n1 > 0) { // compute LRT + double max0, max1, max2; + for (k = 0, max0 = -1; k <= ma->M; ++k) + if (max0 < ma->z[k]) max0 = ma->z[k]; + for (k = 0, max1 = -1; k <= ma->n1 * 2; ++k) + if (max1 < ma->z1[k]) max1 = ma->z1[k]; + for (k = 0, max2 = -1; k <= ma->M - ma->n1 * 2; ++k) + if (max2 < ma->z2[k]) max2 = ma->z2[k]; + rst->lrt = log(max1 * max2 / max0); + rst->lrt = rst->lrt < 0? 1 : kf_gammaq(.5, rst->lrt); + } else rst->lrt = -1.0; + rst->cmp[0] = rst->cmp[1] = rst->cmp[2] = rst->p_chi2 = -1.0; + if (do_contrast && rst->p_var > 0.5) // skip contrast2() if the locus is a strong non-variant + rst->p_chi2 = contrast2(ma, rst->cmp); + return 0; +} + +void bcf_p1_dump_afs(bcf_p1aux_t *ma) +{ + int k; + fprintf(bcftools_stderr, "[afs]"); + for (k = 0; k <= ma->M; ++k) + fprintf(bcftools_stderr, " %d:%.3lf", k, ma->afs[ma->M - k]); + fprintf(bcftools_stderr, "\n"); + memset(ma->afs, 0, sizeof(double) * (ma->M + 1)); +} diff --git a/bcftools/prob1.h b/bcftools/prob1.h new file mode 100644 index 0000000..a562265 --- /dev/null +++ b/bcftools/prob1.h @@ -0,0 +1,93 @@ +/* prob1.h -- mathematical utility functions. + + Copyright (C) 2010, 2011 Broad Institute. + Copyright (C) 2012, 2013-2014 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#ifndef BCF_PROB1_H +#define BCF_PROB1_H + +#include +#include "call.h" + +typedef struct { + int n; // Number of samples + int M; // Total number of chromosomes across all samples (n*2 if all samples are diploid) + int n1; + int is_indel; + uint8_t *ploidy; // haploid or diploid ONLY + double *q2p, *pdg; // q2p maps from phread scaled to real likelihood, pdg -> P(D|g) + double *phi; // Probability of seeing k reference alleles + double *phi_indel; + double *z, *zswap; // aux for afs + double *z1, *z2, *phi1, *phi2; // only calculated when n1 is set + double **hg; // hypergeometric distribution + double *lf; // log factorial + double t, t1, t2; + double *afs, *afs1; // afs: accumulative allele frequency spectrum (AFS); afs1: site posterior distribution + const int *PL; // point to PL + int PL_len; + int cons_llr; // pair and trio calling + int64_t cons_gt; +} bcf_p1aux_t; + +typedef struct { + int rank0, perm_rank; // NB: perm_rank is always set to -1 by bcf_p1_cal() + int ac; // ML alternative allele count + double f_exp, f_flat, p_ref_folded, p_ref, p_var_folded, p_var; + double cil, cih; + double cmp[3], p_chi2, lrt; // used by contrast2() +} bcf_p1rst_t; + +typedef struct { + double p[4]; + double edb, mqb, bqb; // end distance bias, mapQ bias, baseQ bias + int mq, depth, is_tested, d[4]; +} anno16_t; + +#define MC_PTYPE_FULL 1 +#define MC_PTYPE_COND2 2 +#define MC_PTYPE_FLAT 3 + +#ifdef __cplusplus +extern "C" { +#endif + + bcf_p1aux_t *bcf_p1_init(int n_smpl, uint8_t *ploidy); + void bcf_p1_init_prior(bcf_p1aux_t *ma, int type, double theta); + void bcf_p1_init_subprior(bcf_p1aux_t *ma, int type, double theta); + void bcf_p1_destroy(bcf_p1aux_t *ma); + void bcf_p1_set_ploidy(bcf1_t *b, bcf_p1aux_t *ma); + int bcf_p1_cal(call_t *call, bcf1_t *b, int do_contrast, bcf_p1aux_t *ma, bcf_p1rst_t *rst); + int bcf_p1_call_gt(const bcf_p1aux_t *ma, double f0, int k, int is_var); + void bcf_p1_dump_afs(bcf_p1aux_t *ma); + int bcf_p1_read_prior(bcf_p1aux_t *ma, const char *fn); + int bcf_p1_set_n1(bcf_p1aux_t *b, int n1); + void bcf_p1_set_folded(bcf_p1aux_t *p1a); // only effective when set_n1() is not called + + int bcf_em1(call_t *call, const bcf1_t *b, int n1, int flag, double x[10]); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bcftools/rbuf.h b/bcftools/rbuf.h new file mode 100644 index 0000000..ef2e206 --- /dev/null +++ b/bcftools/rbuf.h @@ -0,0 +1,261 @@ +/* rbuf.h -- round buffers. + + Copyright (C) 2013-2014, 2017 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#ifndef __RBUF_H__ +#define __RBUF_H__ + +#include + +typedef struct +{ + int m,n,f; // m: allocated size, n: number of elements in the buffer, f: first element +} +rbuf_t; + +/** + * rbuf_init() - initialize round buffer + * @rbuf: the rbuf_t holder + * @size: the maximum number of elements + * + */ +static inline void rbuf_init(rbuf_t *rbuf, int size) +{ + rbuf->m = size; rbuf->n = rbuf->f = 0; +} +/** + * rbuf_kth() - get index of the k-th element of the round buffer + * @rbuf: the rbuf_t holder + * @k: 0-based index. If negative, return k-th element from the end, 1-based + */ +static inline int rbuf_kth(rbuf_t *rbuf, int k) +{ + if ( k >= rbuf->n ) return -1; + if ( k < 0 ) + { + k = rbuf->n + k; + if ( k < 0 ) return -1; + } + int i = k + rbuf->f; + if ( i >= rbuf->m ) i -= rbuf->m; + return i; +} +/** + * rbuf_last() - get index of the last element of the round buffer + * @rbuf: the rbuf_t holder + */ +#define rbuf_last(rbuf) rbuf_kth(rbuf, -1) + +/** + * rbuf_l2ridx() - get 0-based rbuf index which corresponds to i-th linear index + * @rbuf: the rbuf_t holder + * @idx: 0-based linear index + * + * Returns 0-based circular index or -1 if out of bounds + */ +static inline int rbuf_l2ridx(rbuf_t *rbuf, int idx) +{ + if ( idx < 0 || idx >= rbuf->n ) return -1; + if ( idx >= rbuf->f ) + { + int i = idx - rbuf->f; + if ( i >= rbuf->n ) return -1; + return i; + } + int i = rbuf->m - rbuf->f + idx; + if ( i >= rbuf->n ) return -1; + return i; +} + +/** + * rbuf_next() - get index of the next element in the round buffer + * @rbuf: the rbuf_t holder + * @i: pointer to the last rbuf index. Set to -1 before the first call. + * + * Sets i to the next position in the buffer. The return value indicates if + * the position points to a valid element (1) or if there are no more elements + * after *i (0). When the end is reached, *i is set to the first element in the + * buffer. + */ +static inline int rbuf_next(rbuf_t *rbuf, int *i) +{ + if ( !rbuf->n ) return 0; + if ( *i==-1 ) { *i = rbuf->f; return 1; } + int n = (rbuf->f <= *i) ? *i - rbuf->f + 1 : *i + rbuf->m - rbuf->f + 1; + if ( ++(*i) >= rbuf->m ) *i = 0; + if ( n < rbuf->n ) return 1; + *i = rbuf->f; + return 0; +} +/** + * rbuf_prev() - get index of the previous element in the round buffer + * @rbuf: the rbuf_t holder + * @i: pointer to the last rbuf index. Set to -1 before the first call. + * + * Sets i to the previous position in the buffer. The return value indicates if + * the position points to a valid element (1) or if there are no more elements + * before *i (0). + */ +static inline int rbuf_prev(rbuf_t *rbuf, int *i) +{ + if ( !rbuf->n || *i==rbuf->f ) return 0; + if ( *i==-1 ) + { + *i = rbuf_last(rbuf); + return 1; + } + if ( --(*i) < 0 ) *i = rbuf->m - 1; + return 1; +} +/** + * rbuf_prepend() - register new element at the start of the round buffer + * @rbuf: the rbuf_t holder + * + * Returns index of the newly inserted element. + */ +static inline int rbuf_prepend(rbuf_t *rbuf) +{ + if ( rbuf->n < rbuf->m ) rbuf->n++; + + rbuf->f = rbuf->f > 0 ? rbuf->f - 1 : rbuf->m - 1; + return rbuf->f; +} +/** + * rbuf_append() - register new element at the end of the round buffer + * @rbuf: the rbuf_t holder + * + * Returns index of the newly inserted element. + */ +static inline int rbuf_append(rbuf_t *rbuf) +{ + if ( rbuf->n < rbuf->m ) + { + rbuf->n++; + int i = rbuf->f + rbuf->n; + return i <= rbuf->m ? i - 1 : i - rbuf->m - 1; + } + + rbuf->f++; + if ( rbuf->f >= rbuf->m ) + { + rbuf->f = 0; + return rbuf->m - 1; + } + return rbuf->f - 1; +} +/** + * rbuf_shift() - removes first element from the buffer + * @rbuf: the rbuf_t holder + * + * Returns index of the removed element. + */ +static inline int rbuf_shift(rbuf_t *rbuf) +{ + if ( !rbuf->n ) return -1; + int ret = rbuf->f; + rbuf->f++; + if ( rbuf->f >= rbuf->m ) rbuf->f = 0; + rbuf->n--; + return ret; +} +/** + * rbuf_shift_n() - removes first n elements from the buffer + * @rbuf: the rbuf_t holder + * @n: number of elements to remove + */ +static inline void rbuf_shift_n(rbuf_t *rbuf, int n) +{ + if ( n >= rbuf->n ) + { + rbuf->n = rbuf->f = 0; + return; + } + rbuf->n -= n; + rbuf->f += n; + if ( rbuf->f >= rbuf->m ) rbuf->f -= rbuf->m; +} + +/** + * rbuf_expand0() - expand round buffer and set the newly allocated elements to 0 + * @rbuf: the rbuf holder + * @type_t: data type + * @n: requested number of elements + * @data: data array to be realloced + * + * Note: The new array is linearized and leaves the rbuf.f offset untouched, + * thus the size of the new buffer is determined by the current position. + */ +#define rbuf_expand0(rbuf,type_t,n,data) \ +{ \ + if ( n > (rbuf)->m ) \ + { \ + int m = n + (rbuf)->f; \ + m--, m|=m>>1, m|=m>>2, m|=m>>4, m|=m>>8, m|=m>>16, m++; /* kroundup32 */ \ + data = (type_t*) realloc(data, sizeof(type_t)*m); \ + type_t *ptr = data; \ + memset(ptr+(rbuf)->m,0,sizeof(type_t)*(m-(rbuf)->m)); \ + if ( (rbuf)->f ) \ + { \ + memcpy(ptr+(rbuf)->m,ptr,sizeof(type_t)*(rbuf)->f); \ + memset(ptr,0,sizeof(type_t)*(rbuf)->f); \ + } \ + (rbuf)->m = m; \ + } \ +} + +/** + * rbuf_remove_kth() - remove k-th rbuf element (0-based) and memmove the data block + * @rbuf: the rbuf holder + * @type_t: data type + * @k: k-th element to remove + * @data: data array to be modified + */ +#define rbuf_remove_kth(rbuf, type_t, kth, data) \ +{ \ + int k = rbuf_kth(rbuf, kth); \ + if ( k < (rbuf)->f ) /* shrink from back */ \ + { \ + int l = rbuf_kth(rbuf, -1); \ + if ( k < l ) \ + { \ + type_t tmp = (data)[k]; \ + memmove(data+k, data+k+1, (l - k)*sizeof(type_t)); \ + (data)[l] = tmp; \ + } \ + (rbuf)->n--; \ + } \ + else /* shrink from front */ \ + { \ + if ( k > (rbuf)->f ) \ + { \ + type_t tmp = (data)[k]; \ + memmove(&data[(rbuf)->f+1], &data[(rbuf)->f], (k - (rbuf)->f)*sizeof(type_t)); \ + (data)[(rbuf)->f] = tmp; \ + } \ + (rbuf)->f++; \ + (rbuf)->n--; \ + if ( (rbuf)->f == (rbuf)->m ) (rbuf)->f = 0; \ + } \ +} + +#endif diff --git a/bcftools/regidx.c b/bcftools/regidx.c new file mode 100644 index 0000000..cdaf7ea --- /dev/null +++ b/bcftools/regidx.c @@ -0,0 +1,650 @@ +/* + Copyright (C) 2014-2018 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include +#include +#include +#include "regidx.h" + +#define MAX_COOR_0 REGIDX_MAX // CSI and hts_itr_query limit, 0-based + +#define iBIN(x) ((x)>>13) + +typedef struct +{ + uint32_t beg, end; +} +reg_t; + +typedef struct +{ + uint32_t pos, ireg; // y-coordinate and a pointer to reglist.reg and reglist.dat +} +pos_t; + +typedef struct _reglist_t reglist_t; + +typedef struct +{ + uint32_t beg, end, ireg; // query coordinates and the active region + regidx_t *ridx; + reglist_t *list; + int active; +} +_itr_t; + +// List of regions for one chromosome. +struct _reglist_t +{ + uint32_t *idx, nidx; // index to list.reg+1 + uint32_t nreg, mreg; // n:used, m:allocated + reg_t *reg; // regions + void *dat; // payload data + char *seq; // sequence name + int unsorted; + +}; + +// Container of all sequences +struct _regidx_t +{ + int nseq, mseq; // n:used, m:alloced + reglist_t *seq; // regions for each sequence + void *seq2regs; // hash for fast lookup from chr name to regions + char **seq_names; + regidx_free_f free; // function to free any data allocated by regidx_parse_f + regidx_parse_f parse; // parse one input line + void *usr; // user data to pass to regidx_parse_f + int payload_size; + void *payload; // temporary payload data set by regidx_parse_f (sequence is not known beforehand) + kstring_t str; +}; + +int regidx_seq_nregs(regidx_t *idx, const char *seq) +{ + int iseq; + if ( khash_str2int_get(idx->seq2regs, seq, &iseq)!=0 ) return 0; // no such sequence + return idx->seq[iseq].nreg; +} + +int regidx_nregs(regidx_t *idx) +{ + int i, nreg = 0; + for (i=0; inseq; i++) nreg += idx->seq[i].nreg; + return nreg; +} + +char **regidx_seq_names(regidx_t *idx, int *n) +{ + *n = idx->nseq; + return idx->seq_names; +} + +int regidx_insert_list(regidx_t *idx, char *line, char delim) +{ + kstring_t tmp = {0,0,0}; + char *ss = line; + while ( *ss ) + { + char *se = ss; + while ( *se && *se!=delim ) se++; + tmp.l = 0; + kputsn(ss, se-ss, &tmp); + if ( regidx_insert(idx,tmp.s) < 0 ) + { + free(tmp.s); + return -1; + } + if ( !*se ) break; + ss = se+1; + } + free(tmp.s); + return 0; +} + +static inline int cmp_regs(reg_t *a, reg_t *b) +{ + if ( a->beg < b->beg ) return -1; + if ( a->beg > b->beg ) return 1; + if ( a->end < b->end ) return 1; // longer intervals come first + if ( a->end > b->end ) return -1; + return 0; +} +static int cmp_reg_ptrs(const void *a, const void *b) +{ + return cmp_regs((reg_t*)a,(reg_t*)b); +} +static int cmp_reg_ptrs2(const void *a, const void *b) +{ + return cmp_regs(*((reg_t**)a),*((reg_t**)b)); +} + +inline int regidx_push(regidx_t *idx, char *chr_beg, char *chr_end, uint32_t beg, uint32_t end, void *payload) +{ + if ( beg > MAX_COOR_0 ) beg = MAX_COOR_0; + if ( end > MAX_COOR_0 ) end = MAX_COOR_0; + + int rid; + idx->str.l = 0; + kputsn(chr_beg, chr_end-chr_beg+1, &idx->str); + if ( khash_str2int_get(idx->seq2regs, idx->str.s, &rid)!=0 ) + { + // new chromosome + idx->nseq++; + int m_prev = idx->mseq; + hts_expand0(reglist_t,idx->nseq,idx->mseq,idx->seq); + hts_expand0(char*,idx->nseq,m_prev,idx->seq_names); + idx->seq_names[idx->nseq-1] = strdup(idx->str.s); + rid = khash_str2int_inc(idx->seq2regs, idx->seq_names[idx->nseq-1]); + } + + reglist_t *list = &idx->seq[rid]; + list->seq = idx->seq_names[rid]; + list->nreg++; + int mreg = list->mreg; + hts_expand(reg_t,list->nreg,list->mreg,list->reg); + list->reg[list->nreg-1].beg = beg; + list->reg[list->nreg-1].end = end; + if ( idx->payload_size ) + { + if ( mreg != list->mreg ) list->dat = realloc(list->dat,idx->payload_size*list->mreg); + memcpy((char *)list->dat + idx->payload_size*(list->nreg-1), payload, idx->payload_size); + } + if ( !list->unsorted && list->nreg>1 && cmp_regs(&list->reg[list->nreg-2],&list->reg[list->nreg-1])>0 ) list->unsorted = 1; + return 0; +} + +int regidx_insert(regidx_t *idx, char *line) +{ + if ( !line ) return 0; + char *chr_from, *chr_to; + uint32_t beg,end; + int ret = idx->parse(line,&chr_from,&chr_to,&beg,&end,idx->payload,idx->usr); + if ( ret==-2 ) return -1; // error + if ( ret==-1 ) return 0; // skip the line + regidx_push(idx, chr_from,chr_to,beg,end,idx->payload); + return 0; +} + +regidx_t *regidx_init_string(const char *str, regidx_parse_f parser, regidx_free_f free_f, size_t payload_size, void *usr_dat) +{ + regidx_t *idx = (regidx_t*) calloc(1,sizeof(regidx_t)); + if ( !idx ) return NULL; + + idx->free = free_f; + idx->parse = parser ? parser : regidx_parse_tab; + idx->usr = usr_dat; + idx->seq2regs = khash_str2int_init(); + idx->payload_size = payload_size; + if ( payload_size ) idx->payload = malloc(payload_size); + + kstring_t tmp = {0,0,0}; + const char *ss = str; + while ( *ss ) + { + while ( *ss && isspace(*ss) ) ss++; + const char *se = ss; + while ( *se && *se!='\r' && *se!='\n' ) se++; + tmp.l = 0; + kputsn(ss, se-ss, &tmp); + regidx_insert(idx,tmp.s); + while ( *se && isspace(*se) ) se++; + ss = se; + } + free(tmp.s); + return idx; +} + +regidx_t *regidx_init(const char *fname, regidx_parse_f parser, regidx_free_f free_f, size_t payload_size, void *usr_dat) +{ + if ( !parser ) + { + if ( !fname ) parser = regidx_parse_tab; + else + { + int len = strlen(fname); + if ( len>=7 && !strcasecmp(".bed.gz",fname+len-7) ) + parser = regidx_parse_bed; + else if ( len>=8 && !strcasecmp(".bed.bgz",fname+len-8) ) + parser = regidx_parse_bed; + else if ( len>=4 && !strcasecmp(".bed",fname+len-4) ) + parser = regidx_parse_bed; + else if ( len>=4 && !strcasecmp(".vcf",fname+len-4) ) + parser = regidx_parse_vcf; + else if ( len>=7 && !strcasecmp(".vcf.gz",fname+len-7) ) + parser = regidx_parse_vcf; + else + parser = regidx_parse_tab; + } + } + + regidx_t *idx = (regidx_t*) calloc(1,sizeof(regidx_t)); + idx->free = free_f; + idx->parse = parser; + idx->usr = usr_dat; + idx->seq2regs = khash_str2int_init(); + idx->payload_size = payload_size; + if ( payload_size ) idx->payload = malloc(payload_size); + + if ( !fname ) return idx; + + kstring_t str = {0,0,0}; + + htsFile *fp = hts_open(fname,"r"); + if ( !fp ) goto error; + + while ( hts_getline(fp, KS_SEP_LINE, &str) > 0 ) + { + if ( regidx_insert(idx, str.s) ) goto error; + } + + free(str.s); + if ( hts_close(fp)!=0 ) + { + fprintf(stderr,"[%s] Error: close failed .. %s\n", __func__,fname); + goto error; + } + return idx; + +error: + free(str.s); + if ( fp ) hts_close(fp); + regidx_destroy(idx); + return NULL; +} + +void regidx_destroy(regidx_t *idx) +{ + int i, j; + for (i=0; inseq; i++) + { + reglist_t *list = &idx->seq[i]; + if ( idx->free ) + { + for (j=0; jnreg; j++) + idx->free((char *)list->dat + idx->payload_size*j); + } + free(list->dat); + free(list->reg); + free(list->idx); + } + free(idx->seq_names); + free(idx->seq); + free(idx->str.s); + free(idx->payload); + khash_str2int_destroy_free(idx->seq2regs); + free(idx); +} + +int _reglist_build_index(regidx_t *regidx, reglist_t *list) +{ + int i; + if ( list->unsorted ) + { + if ( !regidx->payload_size ) + qsort(list->reg,list->nreg,sizeof(reg_t),cmp_reg_ptrs); + else + { + reg_t **ptr = (reg_t**) malloc(sizeof(reg_t*)*list->nreg); + for (i=0; inreg; i++) ptr[i] = list->reg + i; + qsort(ptr,list->nreg,sizeof(*ptr),cmp_reg_ptrs2); + + void *tmp_dat = malloc(regidx->payload_size*list->nreg); + for (i=0; inreg; i++) + { + size_t iori = ptr[i] - list->reg; + memcpy((char *)tmp_dat+i*regidx->payload_size, + (char *)list->dat+iori*regidx->payload_size, + regidx->payload_size); + } + free(list->dat); + list->dat = tmp_dat; + + reg_t *tmp_reg = (reg_t*) malloc(sizeof(reg_t)*list->nreg); + for (i=0; inreg; i++) + { + size_t iori = ptr[i] - list->reg; + tmp_reg[i] = list->reg[iori]; + } + free(ptr); + free(list->reg); + list->reg = tmp_reg; + list->mreg = list->nreg; + } + list->unsorted = 0; + } + + list->nidx = 0; + int j,k, midx = 0; + for (j=0; jnreg; j++) + { + int ibeg = iBIN(list->reg[j].beg); + int iend = iBIN(list->reg[j].end); + if ( midx <= iend ) + { + int old_midx = midx; + midx = iend + 1; + kroundup32(midx); + list->idx = (uint32_t*) realloc(list->idx, midx*sizeof(uint32_t)); + memset(list->idx+old_midx, 0, sizeof(uint32_t)*(midx-old_midx)); + } + if ( ibeg==iend ) + { + if ( !list->idx[ibeg] ) list->idx[ibeg] = j + 1; + } + else + { + for (k=ibeg; k<=iend; k++) + if ( !list->idx[k] ) list->idx[k] = j + 1; + } + if ( list->nidx < iend+1 ) list->nidx = iend+1; + } + + return 0; +} + +int regidx_overlap(regidx_t *regidx, const char *chr, uint32_t beg, uint32_t end, regitr_t *regitr) +{ + if ( regitr ) regitr->seq = NULL; + + int iseq, ireg; + if ( khash_str2int_get(regidx->seq2regs, chr, &iseq)!=0 ) return 0; // no such sequence + + reglist_t *list = ®idx->seq[iseq]; + if ( !list->nreg ) return 0; + + if ( list->nreg==1 ) + { + if ( beg > list->reg[0].end ) return 0; + if ( end < list->reg[0].beg ) return 0; + ireg = 0; + } + else + { + if ( !list->idx ) + _reglist_build_index(regidx,list); + + int ibeg = iBIN(beg); + if ( ibeg >= list->nidx ) return 0; // beg is too big + + // find a matching region + uint32_t i = list->idx[ibeg]; + if ( !i ) + { + int iend = iBIN(end); + if ( iend > list->nidx ) iend = list->nidx; + for (i=ibeg; i<=iend; i++) + if ( list->idx[i] ) break; + if ( i>iend ) return 0; + i = list->idx[i]; + } + for (ireg=i-1; iregnreg; ireg++) + { + if ( list->reg[ireg].beg > end ) return 0; // no match, past the query region + if ( list->reg[ireg].end >= beg && list->reg[ireg].beg <= end ) break; // found + } + + if ( ireg >= list->nreg ) return 0; // no match + } + + if ( !regitr ) return 1; // match, but no more info to save + + // may need to iterate over the matching regions later + _itr_t *itr = (_itr_t*)regitr->itr; + itr->ridx = regidx; + itr->list = list; + itr->beg = beg; + itr->end = end; + itr->ireg = ireg; + itr->active = 0; + + regitr->seq = list->seq; + regitr->beg = list->reg[ireg].beg; + regitr->end = list->reg[ireg].end; + if ( regidx->payload_size ) + regitr->payload = (char *)list->dat + regidx->payload_size*ireg; + + return 1; +} + +int regidx_parse_bed(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) return -1; // skip blank lines + if ( *ss=='#' ) return -1; // skip comments + + char *se = ss; + while ( *se && !isspace(*se) ) se++; + + *chr_beg = ss; + *chr_end = se-1; + + if ( !*se ) + { + // just the chromosome name + *beg = 0; + *end = MAX_COOR_0; + return 0; + } + + ss = se+1; + *beg = strtod(ss, &se); + if ( ss==se ) { fprintf(stderr,"Could not parse bed line: %s\n", line); return -2; } + + ss = se+1; + *end = strtod(ss, &se) - 1; + if ( ss==se ) { fprintf(stderr,"Could not parse bed line: %s\n", line); return -2; } + + return 0; +} + +int regidx_parse_tab(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) return -1; // skip blank lines + if ( *ss=='#' ) return -1; // skip comments + + char *se = ss; + while ( *se && !isspace(*se) ) se++; + + *chr_beg = ss; + *chr_end = se-1; + + if ( !*se ) + { + // just the chromosome name + *beg = 0; + *end = MAX_COOR_0; + return 0; + } + + ss = se+1; + *beg = strtod(ss, &se); + if ( ss==se ) { fprintf(stderr,"Could not parse tab line: %s\n", line); return -2; } + if ( *beg==0 ) { fprintf(stderr,"Could not parse tab line, expected 1-based coordinate: %s\n", line); return -2; } + (*beg)--; + + if ( !se[0] || !se[1] ) + *end = *beg; + else + { + ss = se+1; + *end = strtod(ss, &se); + if ( ss==se || (*se && !isspace(*se)) ) *end = *beg; + else if ( *end==0 ) { fprintf(stderr,"Could not parse tab line, expected 1-based coordinate: %s\n", line); return -2; } + else (*end)--; + } + return 0; +} + +int regidx_parse_vcf(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + int ret = regidx_parse_tab(line, chr_beg, chr_end, beg, end, payload, usr); + if ( !ret ) *end = *beg; + return ret; +} + +int regidx_parse_reg(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) return -1; // skip blank lines + if ( *ss=='#' ) return -1; // skip comments + + char *se = ss; + while ( *se && *se!=':' ) se++; + + *chr_beg = ss; + *chr_end = se-1; + + if ( !*se ) + { + *beg = 0; + *end = MAX_COOR_0; + return 0; + } + + ss = se+1; + *beg = strtod(ss, &se); + if ( ss==se ) { fprintf(stderr,"Could not parse reg line: %s\n", line); return -2; } + if ( *beg==0 ) { fprintf(stderr,"Could not parse reg line, expected 1-based coordinate: %s\n", line); return -2; } + (*beg)--; + + if ( !se[0] || !se[1] ) + *end = se[0]=='-' ? MAX_COOR_0 : *beg; + else + { + ss = se+1; + *end = strtod(ss, &se); + if ( ss==se ) *end = *beg; + else if ( *end==0 ) { fprintf(stderr,"Could not parse reg line, expected 1-based coordinate: %s\n", line); return -2; } + else (*end)--; + } + return 0; +} + +regitr_t *regitr_init(regidx_t *regidx) +{ + regitr_t *regitr = (regitr_t*) calloc(1,sizeof(regitr_t)); + regitr->itr = (_itr_t*) calloc(1,sizeof(_itr_t)); + _itr_t *itr = (_itr_t*) regitr->itr; + itr->ridx = regidx; + itr->list = NULL; + return regitr; +} + +void regitr_reset(regidx_t *regidx, regitr_t *regitr) +{ + _itr_t *itr = (_itr_t*) regitr->itr; + memset(itr,0,sizeof(_itr_t)); + itr->ridx = regidx; +} + +void regitr_destroy(regitr_t *regitr) +{ + free(regitr->itr); + free(regitr); +} + +int regitr_overlap(regitr_t *regitr) +{ + if ( !regitr->seq ) return 0; + + _itr_t *itr = (_itr_t*) regitr->itr; + if ( !itr->active ) + { + // is this the first call after regidx_overlap? + itr->active = 1; + itr->ireg++; + return 1; + } + + reglist_t *list = itr->list; + + int i; + for (i=itr->ireg; inreg; i++) + { + if ( list->reg[i].beg > itr->end ) return 0; // no match, past the query region + if ( list->reg[i].end >= itr->beg && list->reg[i].beg <= itr->end ) break; // found + } + + if ( i >= list->nreg ) return 0; // no match + + itr->ireg = i + 1; + regitr->seq = list->seq; + regitr->beg = list->reg[i].beg; + regitr->end = list->reg[i].end; + if ( itr->ridx->payload_size ) + regitr->payload = (char *)list->dat + itr->ridx->payload_size*i; + + return 1; +} + +int regitr_loop(regitr_t *regitr) +{ + _itr_t *itr = (_itr_t*) regitr->itr; + regidx_t *regidx = itr->ridx; + + if ( !itr->list ) // first time here + { + itr->list = regidx->seq; + itr->ireg = 0; + } + + size_t iseq = itr->list - regidx->seq; + if ( iseq >= regidx->nseq ) return 0; + + if ( itr->ireg >= itr->list->nreg ) + { + iseq++; + if ( iseq >= regidx->nseq ) return 0; // no more sequences, done + itr->ireg = 0; + itr->list = ®idx->seq[iseq]; + } + + regitr->seq = itr->list->seq; + regitr->beg = itr->list->reg[itr->ireg].beg; + regitr->end = itr->list->reg[itr->ireg].end; + if ( regidx->payload_size ) + regitr->payload = (char *)itr->list->dat + regidx->payload_size*itr->ireg; + itr->ireg++; + + return 1; +} + + +void regitr_copy(regitr_t *dst, regitr_t *src) +{ + _itr_t *dst_itr = (_itr_t*) dst->itr; + _itr_t *src_itr = (_itr_t*) src->itr; + *dst_itr = *src_itr; + *dst = *src; + dst->itr = dst_itr; +} + + diff --git a/bcftools/regidx.c.pysam.c b/bcftools/regidx.c.pysam.c new file mode 100644 index 0000000..4eb96e8 --- /dev/null +++ b/bcftools/regidx.c.pysam.c @@ -0,0 +1,652 @@ +#include "bcftools.pysam.h" + +/* + Copyright (C) 2014-2018 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include +#include +#include +#include "regidx.h" + +#define MAX_COOR_0 REGIDX_MAX // CSI and hts_itr_query limit, 0-based + +#define iBIN(x) ((x)>>13) + +typedef struct +{ + uint32_t beg, end; +} +reg_t; + +typedef struct +{ + uint32_t pos, ireg; // y-coordinate and a pointer to reglist.reg and reglist.dat +} +pos_t; + +typedef struct _reglist_t reglist_t; + +typedef struct +{ + uint32_t beg, end, ireg; // query coordinates and the active region + regidx_t *ridx; + reglist_t *list; + int active; +} +_itr_t; + +// List of regions for one chromosome. +struct _reglist_t +{ + uint32_t *idx, nidx; // index to list.reg+1 + uint32_t nreg, mreg; // n:used, m:allocated + reg_t *reg; // regions + void *dat; // payload data + char *seq; // sequence name + int unsorted; + +}; + +// Container of all sequences +struct _regidx_t +{ + int nseq, mseq; // n:used, m:alloced + reglist_t *seq; // regions for each sequence + void *seq2regs; // hash for fast lookup from chr name to regions + char **seq_names; + regidx_free_f free; // function to free any data allocated by regidx_parse_f + regidx_parse_f parse; // parse one input line + void *usr; // user data to pass to regidx_parse_f + int payload_size; + void *payload; // temporary payload data set by regidx_parse_f (sequence is not known beforehand) + kstring_t str; +}; + +int regidx_seq_nregs(regidx_t *idx, const char *seq) +{ + int iseq; + if ( khash_str2int_get(idx->seq2regs, seq, &iseq)!=0 ) return 0; // no such sequence + return idx->seq[iseq].nreg; +} + +int regidx_nregs(regidx_t *idx) +{ + int i, nreg = 0; + for (i=0; inseq; i++) nreg += idx->seq[i].nreg; + return nreg; +} + +char **regidx_seq_names(regidx_t *idx, int *n) +{ + *n = idx->nseq; + return idx->seq_names; +} + +int regidx_insert_list(regidx_t *idx, char *line, char delim) +{ + kstring_t tmp = {0,0,0}; + char *ss = line; + while ( *ss ) + { + char *se = ss; + while ( *se && *se!=delim ) se++; + tmp.l = 0; + kputsn(ss, se-ss, &tmp); + if ( regidx_insert(idx,tmp.s) < 0 ) + { + free(tmp.s); + return -1; + } + if ( !*se ) break; + ss = se+1; + } + free(tmp.s); + return 0; +} + +static inline int cmp_regs(reg_t *a, reg_t *b) +{ + if ( a->beg < b->beg ) return -1; + if ( a->beg > b->beg ) return 1; + if ( a->end < b->end ) return 1; // longer intervals come first + if ( a->end > b->end ) return -1; + return 0; +} +static int cmp_reg_ptrs(const void *a, const void *b) +{ + return cmp_regs((reg_t*)a,(reg_t*)b); +} +static int cmp_reg_ptrs2(const void *a, const void *b) +{ + return cmp_regs(*((reg_t**)a),*((reg_t**)b)); +} + +inline int regidx_push(regidx_t *idx, char *chr_beg, char *chr_end, uint32_t beg, uint32_t end, void *payload) +{ + if ( beg > MAX_COOR_0 ) beg = MAX_COOR_0; + if ( end > MAX_COOR_0 ) end = MAX_COOR_0; + + int rid; + idx->str.l = 0; + kputsn(chr_beg, chr_end-chr_beg+1, &idx->str); + if ( khash_str2int_get(idx->seq2regs, idx->str.s, &rid)!=0 ) + { + // new chromosome + idx->nseq++; + int m_prev = idx->mseq; + hts_expand0(reglist_t,idx->nseq,idx->mseq,idx->seq); + hts_expand0(char*,idx->nseq,m_prev,idx->seq_names); + idx->seq_names[idx->nseq-1] = strdup(idx->str.s); + rid = khash_str2int_inc(idx->seq2regs, idx->seq_names[idx->nseq-1]); + } + + reglist_t *list = &idx->seq[rid]; + list->seq = idx->seq_names[rid]; + list->nreg++; + int mreg = list->mreg; + hts_expand(reg_t,list->nreg,list->mreg,list->reg); + list->reg[list->nreg-1].beg = beg; + list->reg[list->nreg-1].end = end; + if ( idx->payload_size ) + { + if ( mreg != list->mreg ) list->dat = realloc(list->dat,idx->payload_size*list->mreg); + memcpy((char *)list->dat + idx->payload_size*(list->nreg-1), payload, idx->payload_size); + } + if ( !list->unsorted && list->nreg>1 && cmp_regs(&list->reg[list->nreg-2],&list->reg[list->nreg-1])>0 ) list->unsorted = 1; + return 0; +} + +int regidx_insert(regidx_t *idx, char *line) +{ + if ( !line ) return 0; + char *chr_from, *chr_to; + uint32_t beg,end; + int ret = idx->parse(line,&chr_from,&chr_to,&beg,&end,idx->payload,idx->usr); + if ( ret==-2 ) return -1; // error + if ( ret==-1 ) return 0; // skip the line + regidx_push(idx, chr_from,chr_to,beg,end,idx->payload); + return 0; +} + +regidx_t *regidx_init_string(const char *str, regidx_parse_f parser, regidx_free_f free_f, size_t payload_size, void *usr_dat) +{ + regidx_t *idx = (regidx_t*) calloc(1,sizeof(regidx_t)); + if ( !idx ) return NULL; + + idx->free = free_f; + idx->parse = parser ? parser : regidx_parse_tab; + idx->usr = usr_dat; + idx->seq2regs = khash_str2int_init(); + idx->payload_size = payload_size; + if ( payload_size ) idx->payload = malloc(payload_size); + + kstring_t tmp = {0,0,0}; + const char *ss = str; + while ( *ss ) + { + while ( *ss && isspace(*ss) ) ss++; + const char *se = ss; + while ( *se && *se!='\r' && *se!='\n' ) se++; + tmp.l = 0; + kputsn(ss, se-ss, &tmp); + regidx_insert(idx,tmp.s); + while ( *se && isspace(*se) ) se++; + ss = se; + } + free(tmp.s); + return idx; +} + +regidx_t *regidx_init(const char *fname, regidx_parse_f parser, regidx_free_f free_f, size_t payload_size, void *usr_dat) +{ + if ( !parser ) + { + if ( !fname ) parser = regidx_parse_tab; + else + { + int len = strlen(fname); + if ( len>=7 && !strcasecmp(".bed.gz",fname+len-7) ) + parser = regidx_parse_bed; + else if ( len>=8 && !strcasecmp(".bed.bgz",fname+len-8) ) + parser = regidx_parse_bed; + else if ( len>=4 && !strcasecmp(".bed",fname+len-4) ) + parser = regidx_parse_bed; + else if ( len>=4 && !strcasecmp(".vcf",fname+len-4) ) + parser = regidx_parse_vcf; + else if ( len>=7 && !strcasecmp(".vcf.gz",fname+len-7) ) + parser = regidx_parse_vcf; + else + parser = regidx_parse_tab; + } + } + + regidx_t *idx = (regidx_t*) calloc(1,sizeof(regidx_t)); + idx->free = free_f; + idx->parse = parser; + idx->usr = usr_dat; + idx->seq2regs = khash_str2int_init(); + idx->payload_size = payload_size; + if ( payload_size ) idx->payload = malloc(payload_size); + + if ( !fname ) return idx; + + kstring_t str = {0,0,0}; + + htsFile *fp = hts_open(fname,"r"); + if ( !fp ) goto error; + + while ( hts_getline(fp, KS_SEP_LINE, &str) > 0 ) + { + if ( regidx_insert(idx, str.s) ) goto error; + } + + free(str.s); + if ( hts_close(fp)!=0 ) + { + fprintf(bcftools_stderr,"[%s] Error: close failed .. %s\n", __func__,fname); + goto error; + } + return idx; + +error: + free(str.s); + if ( fp ) hts_close(fp); + regidx_destroy(idx); + return NULL; +} + +void regidx_destroy(regidx_t *idx) +{ + int i, j; + for (i=0; inseq; i++) + { + reglist_t *list = &idx->seq[i]; + if ( idx->free ) + { + for (j=0; jnreg; j++) + idx->free((char *)list->dat + idx->payload_size*j); + } + free(list->dat); + free(list->reg); + free(list->idx); + } + free(idx->seq_names); + free(idx->seq); + free(idx->str.s); + free(idx->payload); + khash_str2int_destroy_free(idx->seq2regs); + free(idx); +} + +int _reglist_build_index(regidx_t *regidx, reglist_t *list) +{ + int i; + if ( list->unsorted ) + { + if ( !regidx->payload_size ) + qsort(list->reg,list->nreg,sizeof(reg_t),cmp_reg_ptrs); + else + { + reg_t **ptr = (reg_t**) malloc(sizeof(reg_t*)*list->nreg); + for (i=0; inreg; i++) ptr[i] = list->reg + i; + qsort(ptr,list->nreg,sizeof(*ptr),cmp_reg_ptrs2); + + void *tmp_dat = malloc(regidx->payload_size*list->nreg); + for (i=0; inreg; i++) + { + size_t iori = ptr[i] - list->reg; + memcpy((char *)tmp_dat+i*regidx->payload_size, + (char *)list->dat+iori*regidx->payload_size, + regidx->payload_size); + } + free(list->dat); + list->dat = tmp_dat; + + reg_t *tmp_reg = (reg_t*) malloc(sizeof(reg_t)*list->nreg); + for (i=0; inreg; i++) + { + size_t iori = ptr[i] - list->reg; + tmp_reg[i] = list->reg[iori]; + } + free(ptr); + free(list->reg); + list->reg = tmp_reg; + list->mreg = list->nreg; + } + list->unsorted = 0; + } + + list->nidx = 0; + int j,k, midx = 0; + for (j=0; jnreg; j++) + { + int ibeg = iBIN(list->reg[j].beg); + int iend = iBIN(list->reg[j].end); + if ( midx <= iend ) + { + int old_midx = midx; + midx = iend + 1; + kroundup32(midx); + list->idx = (uint32_t*) realloc(list->idx, midx*sizeof(uint32_t)); + memset(list->idx+old_midx, 0, sizeof(uint32_t)*(midx-old_midx)); + } + if ( ibeg==iend ) + { + if ( !list->idx[ibeg] ) list->idx[ibeg] = j + 1; + } + else + { + for (k=ibeg; k<=iend; k++) + if ( !list->idx[k] ) list->idx[k] = j + 1; + } + if ( list->nidx < iend+1 ) list->nidx = iend+1; + } + + return 0; +} + +int regidx_overlap(regidx_t *regidx, const char *chr, uint32_t beg, uint32_t end, regitr_t *regitr) +{ + if ( regitr ) regitr->seq = NULL; + + int iseq, ireg; + if ( khash_str2int_get(regidx->seq2regs, chr, &iseq)!=0 ) return 0; // no such sequence + + reglist_t *list = ®idx->seq[iseq]; + if ( !list->nreg ) return 0; + + if ( list->nreg==1 ) + { + if ( beg > list->reg[0].end ) return 0; + if ( end < list->reg[0].beg ) return 0; + ireg = 0; + } + else + { + if ( !list->idx ) + _reglist_build_index(regidx,list); + + int ibeg = iBIN(beg); + if ( ibeg >= list->nidx ) return 0; // beg is too big + + // find a matching region + uint32_t i = list->idx[ibeg]; + if ( !i ) + { + int iend = iBIN(end); + if ( iend > list->nidx ) iend = list->nidx; + for (i=ibeg; i<=iend; i++) + if ( list->idx[i] ) break; + if ( i>iend ) return 0; + i = list->idx[i]; + } + for (ireg=i-1; iregnreg; ireg++) + { + if ( list->reg[ireg].beg > end ) return 0; // no match, past the query region + if ( list->reg[ireg].end >= beg && list->reg[ireg].beg <= end ) break; // found + } + + if ( ireg >= list->nreg ) return 0; // no match + } + + if ( !regitr ) return 1; // match, but no more info to save + + // may need to iterate over the matching regions later + _itr_t *itr = (_itr_t*)regitr->itr; + itr->ridx = regidx; + itr->list = list; + itr->beg = beg; + itr->end = end; + itr->ireg = ireg; + itr->active = 0; + + regitr->seq = list->seq; + regitr->beg = list->reg[ireg].beg; + regitr->end = list->reg[ireg].end; + if ( regidx->payload_size ) + regitr->payload = (char *)list->dat + regidx->payload_size*ireg; + + return 1; +} + +int regidx_parse_bed(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) return -1; // skip blank lines + if ( *ss=='#' ) return -1; // skip comments + + char *se = ss; + while ( *se && !isspace(*se) ) se++; + + *chr_beg = ss; + *chr_end = se-1; + + if ( !*se ) + { + // just the chromosome name + *beg = 0; + *end = MAX_COOR_0; + return 0; + } + + ss = se+1; + *beg = strtod(ss, &se); + if ( ss==se ) { fprintf(bcftools_stderr,"Could not parse bed line: %s\n", line); return -2; } + + ss = se+1; + *end = strtod(ss, &se) - 1; + if ( ss==se ) { fprintf(bcftools_stderr,"Could not parse bed line: %s\n", line); return -2; } + + return 0; +} + +int regidx_parse_tab(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) return -1; // skip blank lines + if ( *ss=='#' ) return -1; // skip comments + + char *se = ss; + while ( *se && !isspace(*se) ) se++; + + *chr_beg = ss; + *chr_end = se-1; + + if ( !*se ) + { + // just the chromosome name + *beg = 0; + *end = MAX_COOR_0; + return 0; + } + + ss = se+1; + *beg = strtod(ss, &se); + if ( ss==se ) { fprintf(bcftools_stderr,"Could not parse tab line: %s\n", line); return -2; } + if ( *beg==0 ) { fprintf(bcftools_stderr,"Could not parse tab line, expected 1-based coordinate: %s\n", line); return -2; } + (*beg)--; + + if ( !se[0] || !se[1] ) + *end = *beg; + else + { + ss = se+1; + *end = strtod(ss, &se); + if ( ss==se || (*se && !isspace(*se)) ) *end = *beg; + else if ( *end==0 ) { fprintf(bcftools_stderr,"Could not parse tab line, expected 1-based coordinate: %s\n", line); return -2; } + else (*end)--; + } + return 0; +} + +int regidx_parse_vcf(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + int ret = regidx_parse_tab(line, chr_beg, chr_end, beg, end, payload, usr); + if ( !ret ) *end = *beg; + return ret; +} + +int regidx_parse_reg(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) return -1; // skip blank lines + if ( *ss=='#' ) return -1; // skip comments + + char *se = ss; + while ( *se && *se!=':' ) se++; + + *chr_beg = ss; + *chr_end = se-1; + + if ( !*se ) + { + *beg = 0; + *end = MAX_COOR_0; + return 0; + } + + ss = se+1; + *beg = strtod(ss, &se); + if ( ss==se ) { fprintf(bcftools_stderr,"Could not parse reg line: %s\n", line); return -2; } + if ( *beg==0 ) { fprintf(bcftools_stderr,"Could not parse reg line, expected 1-based coordinate: %s\n", line); return -2; } + (*beg)--; + + if ( !se[0] || !se[1] ) + *end = se[0]=='-' ? MAX_COOR_0 : *beg; + else + { + ss = se+1; + *end = strtod(ss, &se); + if ( ss==se ) *end = *beg; + else if ( *end==0 ) { fprintf(bcftools_stderr,"Could not parse reg line, expected 1-based coordinate: %s\n", line); return -2; } + else (*end)--; + } + return 0; +} + +regitr_t *regitr_init(regidx_t *regidx) +{ + regitr_t *regitr = (regitr_t*) calloc(1,sizeof(regitr_t)); + regitr->itr = (_itr_t*) calloc(1,sizeof(_itr_t)); + _itr_t *itr = (_itr_t*) regitr->itr; + itr->ridx = regidx; + itr->list = NULL; + return regitr; +} + +void regitr_reset(regidx_t *regidx, regitr_t *regitr) +{ + _itr_t *itr = (_itr_t*) regitr->itr; + memset(itr,0,sizeof(_itr_t)); + itr->ridx = regidx; +} + +void regitr_destroy(regitr_t *regitr) +{ + free(regitr->itr); + free(regitr); +} + +int regitr_overlap(regitr_t *regitr) +{ + if ( !regitr->seq ) return 0; + + _itr_t *itr = (_itr_t*) regitr->itr; + if ( !itr->active ) + { + // is this the first call after regidx_overlap? + itr->active = 1; + itr->ireg++; + return 1; + } + + reglist_t *list = itr->list; + + int i; + for (i=itr->ireg; inreg; i++) + { + if ( list->reg[i].beg > itr->end ) return 0; // no match, past the query region + if ( list->reg[i].end >= itr->beg && list->reg[i].beg <= itr->end ) break; // found + } + + if ( i >= list->nreg ) return 0; // no match + + itr->ireg = i + 1; + regitr->seq = list->seq; + regitr->beg = list->reg[i].beg; + regitr->end = list->reg[i].end; + if ( itr->ridx->payload_size ) + regitr->payload = (char *)list->dat + itr->ridx->payload_size*i; + + return 1; +} + +int regitr_loop(regitr_t *regitr) +{ + _itr_t *itr = (_itr_t*) regitr->itr; + regidx_t *regidx = itr->ridx; + + if ( !itr->list ) // first time here + { + itr->list = regidx->seq; + itr->ireg = 0; + } + + size_t iseq = itr->list - regidx->seq; + if ( iseq >= regidx->nseq ) return 0; + + if ( itr->ireg >= itr->list->nreg ) + { + iseq++; + if ( iseq >= regidx->nseq ) return 0; // no more sequences, done + itr->ireg = 0; + itr->list = ®idx->seq[iseq]; + } + + regitr->seq = itr->list->seq; + regitr->beg = itr->list->reg[itr->ireg].beg; + regitr->end = itr->list->reg[itr->ireg].end; + if ( regidx->payload_size ) + regitr->payload = (char *)itr->list->dat + regidx->payload_size*itr->ireg; + itr->ireg++; + + return 1; +} + + +void regitr_copy(regitr_t *dst, regitr_t *src) +{ + _itr_t *dst_itr = (_itr_t*) dst->itr; + _itr_t *src_itr = (_itr_t*) src->itr; + *dst_itr = *src_itr; + *dst = *src; + dst->itr = dst_itr; +} + + diff --git a/bcftools/regidx.h b/bcftools/regidx.h new file mode 100644 index 0000000..c40bbd8 --- /dev/null +++ b/bcftools/regidx.h @@ -0,0 +1,222 @@ +/* + Copyright (C) 2014-2016, 2018 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* + Region indexing with an optional payload. + + Example of usage: + + // Init the parser and print regions. In this example the payload is a + // pointer to a string. For the description of parse_custom and + // free_custom functions, see regidx_parse_f and regidx_free_f below, + // and for working example see test/test-regidx.c. + regidx_t *idx = regidx_init(in_fname,parse_custom,free_custom,sizeof(char*),NULL); + + // Query overlap with chr:beg-end (beg,end are 1-based coordinates) + regitr_t *itr = regitr_init(idx); + if ( regidx_overlap(idx, chr,beg-1,end-1, itr) ) printf("There is an overlap!\n"); + + while ( regitr_overlap(itr) ) + { + printf("[%d,%d] overlaps with [%d,%d], payload=%s\n", beg,end, + itr->beg+1, itr->end+1, regitr_payload(itr,char*)); + } + + regidx_destroy(idx); + regitr_destroy(itr); + + + Another example, loop over all regions: + + regidx_t *idx = regidx_init(in_fname,NULL,NULL,0,NULL); + regitr_t *itr = regitr_init(idx); + + while ( regitr_loop(itr) ) + printf("chr=%s beg=%d end=%d\n", itr->seq, itr->beg+1, itr->end+1); + + regidx_destroy(idx); + regitr_destroy(itr); +*/ + +#ifndef __REGIDX_H__ +#define __REGIDX_H__ + +#include +#include + +/* Avoid conflicts with HTSlib's regidx_* functions. */ +#define regidx_destroy bcftools_regidx_destroy +#define regidx_init bcftools_regidx_init +#define regidx_init_string bcftools_regidx_init_string +#define regidx_insert bcftools_regidx_insert +#define regidx_insert_list bcftools_regidx_insert_list +#define regidx_nregs bcftools_regidx_nregs +#define regidx_overlap bcftools_regidx_overlap +#define regidx_parse_bed bcftools_regidx_parse_bed +#define regidx_parse_reg bcftools_regidx_parse_reg +#define regidx_parse_tab bcftools_regidx_parse_tab +#define regidx_parse_vcf bcftools_regidx_parse_vcf +#define regidx_push bcftools_regidx_push +#define regidx_seq_names bcftools_regidx_seq_names +#define regidx_seq_nregs bcftools_regidx_seq_nregs +#define regitr_copy bcftools_regitr_copy +#define regitr_destroy bcftools_regitr_destroy +#define regitr_init bcftools_regitr_init +#define regitr_loop bcftools_regitr_loop +#define regitr_overlap bcftools_regitr_overlap +#define regitr_reset bcftools_regitr_reset + +#ifdef __cplusplus +extern "C" { +#endif + +#define REGIDX_MAX 2147483646 // maximum regidx coordinate (0-based) + +typedef struct _regidx_t regidx_t; +typedef struct +{ + uint32_t beg,end; + void *payload; + char *seq; + void *itr; +} +regitr_t; + +#define regitr_payload(itr,type_t) (*((type_t*)(itr)->payload)) + +/* + * regidx_parse_f - Function to parse one input line, such as regidx_parse_bed + * or regidx_parse_tab below. The function is expected to set `chr_from` and + * `chr_to` to point to first and last character of chromosome name and set + * coordinates `beg` and `end` (0-based, inclusive). If regidx_init() was + * called with non-zero payload_size, the `payload` points to a memory + * location of the payload_size and `usr` is the data passed to regidx_init(). + * Any memory allocated by the function will be freed by regidx_free_f called + * by regidx_destroy(). + * + * Return value: 0 on success, -1 to skip a record, -2 on fatal error. + */ +typedef int (*regidx_parse_f)(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr); +typedef void (*regidx_free_f)(void *payload); + +/* + * A note about the parsers: + * - leading spaces are ignored + * - lines starting with "#" are ignored + */ +int regidx_parse_bed(const char*,char**,char**,uint32_t*,uint32_t*,void*,void*); // CHROM or whitespace-sepatated CHROM,FROM,TO (0-based,right-open) +int regidx_parse_tab(const char*,char**,char**,uint32_t*,uint32_t*,void*,void*); // CHROM or whitespace-separated CHROM,POS (1-based, inclusive) +int regidx_parse_reg(const char*,char**,char**,uint32_t*,uint32_t*,void*,void*); // CHROM, CHROM:POS, CHROM:FROM-TO, CHROM:FROM- (1-based, inclusive) +int regidx_parse_vcf(const char*,char**,char**,uint32_t*,uint32_t*,void*,void*); + +/* + * regidx_init() - creates new index + * regidx_init_string() - creates new index, from a string rather than from a file + * + * @param fname: input file name or NULL if regions will be added one-by-one via regidx_insert() + * @param parsef: regidx_parse_bed, regidx_parse_tab or see description of regidx_parse_f. If NULL, + * the format will be autodected, currently either regidx_parse_tab (the default) or + * regidx_parse_bed (file must be named 'bed' or 'bed.gz') will be used. Note that + * the exact autodetection algorithm will change. + * @param freef: NULL or see description of regidx_parse_f + * @param payload_size: 0 with regidx_parse_bed, regidx_parse_tab or see regidx_parse_f + * @param usr: optional user data passed to regidx_parse_f + * + * Returns index on success or NULL on error. + */ +regidx_t *regidx_init(const char *fname, regidx_parse_f parsef, regidx_free_f freef, size_t payload_size, void *usr); +regidx_t *regidx_init_string(const char *string, regidx_parse_f parsef, regidx_free_f freef, size_t payload_size, void *usr); + +/* + * regidx_destroy() - free memory allocated by regidx_init + */ +void regidx_destroy(regidx_t *idx); + +/* + * regidx_overlap() - check overlap of the location chr:from-to with regions + * @param beg,end: 0-based start, end coordinate (inclusive) + * @param itr: pointer to iterator, can be NULL if regidx_loop not needed + * + * Returns 0 if there is no overlap or 1 if overlap is found. The overlapping + * regions can be iterated as shown in the example above. + */ +int regidx_overlap(regidx_t *idx, const char *chr, uint32_t beg, uint32_t end, regitr_t *itr); + +/* + * regidx_insert() - add a new region. + * regidx_insert_list() - add new regions from a list + * regidx_push() - low level insertion of a new region + * + * Returns 0 on success or -1 on error. + */ +int regidx_insert(regidx_t *idx, char *line); +int regidx_insert_list(regidx_t *idx, char *line, char delim); +int regidx_push(regidx_t *idx, char *chr_beg, char *chr_end, uint32_t beg, uint32_t end, void *payload); + +/* + * regidx_seq_names() - return list of all sequence names + */ +char **regidx_seq_names(regidx_t *idx, int *n); + +/* + * regidx_seq_nregs() - number of regions + * regidx_nregs() - total number of regions + */ +int regidx_seq_nregs(regidx_t *idx, const char *seq); +int regidx_nregs(regidx_t *idx); + +/* + * regitr_init() - initialize an iterator. The idx parameter is required only + * with regitr_loop. If only regitr_overlap is called, NULL + * can be given. + * + * regitr_reset() - initialize an iterator for a repeated regitr_loop cycle. + * Not required with regitr_overlap. + */ +regitr_t *regitr_init(regidx_t *idx); +void regitr_destroy(regitr_t *itr); +void regitr_reset(regidx_t *idx, regitr_t *itr); + +/* + * regitr_overlap() - next overlapping region + * Returns 0 when done or 1 when itr is set to next region + */ +int regitr_overlap(regitr_t *itr); + +/* + * regitr_loop() - loop over all regions + * Returns 0 when done or 1 when itr is set to next region + */ +int regitr_loop(regitr_t *itr); + +/* + * regitr_copy() - create a copy of an iterator for a repeated iteration with regitr_loop + */ +void regitr_copy(regitr_t *dst, regitr_t *src); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/bcftools/reheader.c b/bcftools/reheader.c new file mode 100644 index 0000000..4458f27 --- /dev/null +++ b/bcftools/reheader.c @@ -0,0 +1,764 @@ +/* reheader.c -- reheader subcommand. + + Copyright (C) 2014-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include +#include // for hts_get_bgzfp() +#include +#include +#include +#include +#include "bcftools.h" +#include "khash_str2str.h" + +typedef struct _args_t +{ + char **argv, *fname, *samples_fname, *header_fname, *output_fname; + char *fai_fname, *rm_tmpfile, *tmp_prefix; + htsFile *fp; + htsFormat type; + htsThreadPool *threads; + int argc, n_threads; +} +args_t; + +static inline int is_escaped(const char *min, const char *str) +{ + int n = 0; + while ( --str>=min && *str=='\\' ) n++; + return n%2; +} +static char *copy_and_update_contig_line(faidx_t *fai, char *line, void *chr_seen, kstring_t *dst) +{ + kstring_t key = {0,0,0}, val = {0,0,0}, tmp = {0,0,0}; + char *chr_name = NULL, *p, *q = line + 9; // skip ##contig= + char *end = q; + int nopen = 1, chr_len = 0; + while ( *end && *end!='\n' ) end++; + while ( *q && *q!='\n' && nopen>0 ) + { + p = ++q; + while ( *q && (*q==' ' || *q=='\t') ) { p++; q++; } + // ^[A-Za-z_][0-9A-Za-z_.]*$ + if (p==q && *q && (isalpha(*q) || *q=='_')) + { + q++; + while ( *q && (isalnum(*q) || *q=='_' || *q=='.') ) q++; + } + int n = q-p; + int m = 0; + while ( *q && (*q==' ' || *q=='\t') ) { q++; m++; } + if ( *q!='=' || !n ) + { + char *x = q; + while ( *x && *x!='\n' ) x++; + *x = '\0'; + error("Could not parse the line: %s [%s][%s]\n", line,p,q); + } + key.l = 0; + kputsn(p,q-p-m,&key); + p = ++q; + while ( *q && (*q==' ' || *q=='\t') ) { p++; q++; } + int quoted = *p=='"' ? 1 : 0; + if ( quoted ) p++, q++; + while ( *q && *q != '\n' ) + { + if ( quoted ) { if ( *q=='"' && !is_escaped(p,q) ) break; } + else + { + if ( *q=='<' ) nopen++; + if ( *q=='>' ) nopen--; + if ( !nopen ) break; + if ( *q==',' && nopen==1 ) break; + } + q++; + } + char *r = q; + while ( r > p && r[-1] == ' ' ) r--; + val.l = 0; + kputsn(p,r-p,&val); + if ( quoted && *q=='"' ) q++; + if ( *q=='>' ) { nopen--; q++; } + if ( !strcmp("length",key.s) ) continue; + if ( !strcmp("ID",key.s) ) + { + if ( khash_str2int_has_key(chr_seen,val.s) ) continue; + chr_len = faidx_seq_len(fai, val.s); + if ( chr_len==-1 ) + { + free(val.s); free(key.s); free(tmp.s); + return end; // the sequence is not in fai, remove + } + chr_name = strdup(val.s); + khash_str2int_inc(chr_seen, chr_name); + continue; + } + kputc(',',&tmp); + kputs(key.s,&tmp); + kputc('=',&tmp); + if ( quoted ) kputc('"',&tmp); + kputs(val.s,&tmp); + if ( quoted ) kputc('"',&tmp); + } + if ( !chr_name ) return end; + ksprintf(dst,"##contig=",chr_name,chr_len,tmp.l ? tmp.s : ""); + free(key.s); free(val.s); free(tmp.s); + return q; +} +char *init_tmp_prefix(const char *tmp_prefix) +{ + kstring_t prefix = {0,0,0}; + if ( tmp_prefix ) + { + ksprintf(&prefix,"%sXXXXXX",tmp_prefix); + return prefix.s; + } + + char *tmpdir = getenv("TMPDIR"); + if ( tmpdir ) + kputs(tmpdir, &prefix); + else + { + #ifdef _WIN32 + char tmp_path[MAX_PATH]; + int ret = GetTempPath(MAX_PATH, tmp_path); + if (!ret || ret > MAX_PATH) + error("Could not get the path to the temporary folder\n"); + kputs(tmp_path, &prefix); + #else + kputs("/tmp", &prefix); + #endif + } + kputs("/bcftools.XXXXXX", &prefix); + return prefix.s; +} +static void update_from_fai(args_t *args) +{ + if ( !strcmp("-",args->fname) ) + error("Cannot use the --fai option when reading from standard input.\n"); + + faidx_t *fai = fai_load3(args->fai_fname,args->fai_fname,NULL,FAI_FASTA); + if ( !fai ) error("Could not parse %s\n", args->fai_fname); + args->rm_tmpfile = init_tmp_prefix(args->tmp_prefix); + int fd = mkstemp(args->rm_tmpfile); + if ( fd<0 ) error("Could not open a temporary file for writing: %s\n", args->rm_tmpfile); + + // get a template header: either from the original VCF or from --header + char *ori_hdr_fname = args->header_fname ? args->header_fname : args->fname; + htsFile *fp = hts_open(ori_hdr_fname,"r"); + if ( !fp ) error("Failed to open: %s\n", ori_hdr_fname); + bcf_hdr_t *hdr = bcf_hdr_read(fp); + if ( !hdr ) error("Failed to read the header: %s\n", ori_hdr_fname); + hts_close(fp); // no need to check the return status here + + // put the header in a text buffer + kstring_t hdr_txt_ori = {0,0,0}, hdr_txt_new = {0,0,0}; + bcf_hdr_format(hdr, 0, &hdr_txt_ori); + bcf_hdr_destroy(hdr); + + // update the existing contig lines and remove lines not present in the fai file + void *chr_seen = khash_str2int_init(); + char *tmp, *beg = hdr_txt_ori.s; + while ( beg && *beg ) + { + tmp = strstr(beg, "\n##contig=<"); + if ( !tmp ) break; + kputsn(beg, tmp-beg+1, &hdr_txt_new); + size_t l_prev = hdr_txt_new.l; + beg = copy_and_update_contig_line(fai,tmp+1,chr_seen, &hdr_txt_new); + if ( l_prev==hdr_txt_new.l ) hdr_txt_new.l--; // nothing was added, remove the newline + } + if ( !beg || !(tmp=strstr(beg,"\n#CHROM")) ) error("Failed to parse the header, #CHROM not found\n"); + kputsn(beg, tmp-beg+1, &hdr_txt_new); + + // add any new contig lines + int i, n = faidx_nseq(fai); + for (i=0; i\n",faidx_iseq(fai,i),faidx_seq_len(fai,faidx_iseq(fai,i))); + } + kputs(tmp+1,&hdr_txt_new); + + if ( write(fd, hdr_txt_new.s, hdr_txt_new.l)!=hdr_txt_new.l ) error("Failed to write %zu bytes to %s\n", hdr_txt_new.l,args->rm_tmpfile); + if ( close(fd)!=0 ) error("Failed to close %s\n", args->rm_tmpfile); + args->header_fname = args->rm_tmpfile; + + free(hdr_txt_ori.s); + free(hdr_txt_new.s); + fai_destroy(fai); + khash_str2int_destroy_free(chr_seen); +} + +static void read_header_file(char *fname, kstring_t *hdr) +{ + kstring_t tmp = {0,0,0}; + hdr->l = 0; + + htsFile *fp = hts_open(fname, "r"); + if ( !fp ) error("Could not read: %s\n", fname); + while ( hts_getline(fp, KS_SEP_LINE, &tmp) > 0 ) + { + kputsn(tmp.s,tmp.l,hdr); + kputc('\n',hdr); + } + if ( hts_close(fp) ) error("Close failed: %s\n", fname); + free(tmp.s); + + while ( hdr->l>0 && isspace(hdr->s[hdr->l-1]) ) hdr->l--; // remove trailing newlines + kputc('\n',hdr); +} + +static int set_sample_pairs(char **samples, int nsamples, kstring_t *hdr, int idx) +{ + int i, j, n; + kstring_t key = {0,0,0}; + kstring_t val = {0,0,0}; + + // Are these samples "old-name new-name" pairs? + void *hash = khash_str2str_init(); + for (i=0; il>0 && isspace(hdr->s[hdr->l-1]) ) hdr->l--; // remove trailing newlines + hdr->s[hdr->l] = 0; + + kstring_t tmp = {0,0,0}; + i = j = n = 0; // i:traverse the #CHROM line 1 by 1; j:points to the last column + while ( hdr->s[idx+i] ) + { + if ( hdr->s[idx+i]=='\t' ) + { + hdr->s[idx+i] = 0; + + if ( ++n>9 ) + { + char *new_name = khash_str2str_get(hash,hdr->s+idx+j); + kputs(new_name ? new_name : hdr->s+idx+j, &tmp); + } + else + kputs(hdr->s+idx+j, &tmp); + + kputc('\t',&tmp); + + j = ++i; + continue; + } + i++; + } + char *new_name = khash_str2str_get(hash,hdr->s+idx+j); + kputs(new_name ? new_name : hdr->s+idx+j, &tmp); + + khash_str2str_destroy_free_all(hash); + + hdr->l = idx; + kputs(tmp.s, hdr); + kputc('\n', hdr); + free(tmp.s); + + return 1; +} + +static void set_samples(char **samples, int nsamples, kstring_t *hdr) +{ + // Find the beginning of the #CHROM line + int i = hdr->l - 2, ncols = 0; + while ( i>=0 && hdr->s[i]!='\n' ) + { + if ( hdr->s[i]=='\t' ) ncols++; + i--; + } + if ( i<0 || strncmp(hdr->s+i+1,"#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT",45) ) + { + if ( i>0 && !strncmp(hdr->s+i+1,"#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO",38) ) + error("Error: missing FORMAT fields, cowardly refusing to add samples\n"); + + error("Could not parse the header: %s\n", hdr->s); + } + + // Are the samples "old-sample new-sample" pairs? + if ( set_sample_pairs(samples,nsamples,hdr, i+1) ) return; + + // Replace all samples + if ( ncols!=nsamples+8 ) + fprintf(stderr, "Warning: different number of samples: %d vs %d\n", nsamples,ncols-8); + + ncols = 0; + while ( ncols!=9 ) + { + i++; + if ( hdr->s[i]=='\t' ) ncols++; + } + hdr->l = i; + + for (i=0; ifp); + if ( !fp || bgzf_read_block(fp) != 0 || !fp->block_length ) + error("Failed to read %s: %s\n", args->fname, strerror(errno)); + + kstring_t hdr = {0,0,0}; + char *buffer = (char*) fp->uncompressed_block; + + // Read the header and find the position of the data block + if ( buffer[0]!='#' ) error("Could not parse the header, expected '#', found '%c'\n", buffer[0]); + + int skip_until = 1; // end of the header in the current uncompressed block + while (1) + { + if ( buffer[skip_until]=='\n' ) + { + skip_until++; + if ( skip_until>=fp->block_length ) + { + kputsn(buffer,skip_until,&hdr); + if ( bgzf_read_block(fp) != 0 ) error("Error reading %s\n", args->fname); + if ( !fp->block_length ) break; + skip_until = 0; + } + // The header has finished + if ( buffer[skip_until]!='#' ) + { + kputsn(buffer,skip_until,&hdr); + break; + } + } + skip_until++; + if ( skip_until>=fp->block_length ) + { + kputsn(buffer,fp->block_length,&hdr); + if ( bgzf_read_block(fp) != 0 ) error("Error reading %s\n", args->fname); + if ( !fp->block_length ) break; + skip_until = 0; + } + } + + int nsamples = 0; + char **samples = NULL; + if ( args->samples_fname ) + { + samples = hts_readlines(args->samples_fname, &nsamples); + if ( !samples || !nsamples ) error("Error reading the --samples file \"%s\"\n", args->samples_fname); + } + if ( args->header_fname ) + { + free(hdr.s); hdr.s = NULL; hdr.l = hdr.m = 0; + read_header_file(args->header_fname, &hdr); + } + if ( samples ) + { + set_samples(samples, nsamples, &hdr); + int i; + for (i=0; ioutput_fname ? args->output_fname : "-","w");; + if ( bgzf_write(bgzf_out, hdr.s, hdr.l) < 0 ) error("Can't write BGZF header (code %d)\n", bgzf_out->errcode); + free(hdr.s); + + // Output all remainig data read with the header block + if ( fp->block_length - skip_until > 0 ) + { + if ( bgzf_write(bgzf_out, buffer+skip_until, fp->block_length-skip_until)<0 ) error("Error: %d\n",fp->errcode); + } + if ( bgzf_flush(bgzf_out)<0 ) error("Error: %d\n",bgzf_out->errcode); + + // Stream the rest of the file without as it is, without decompressing + ssize_t nread; + const size_t page_size = 32768; + char *buf = (char*) malloc(page_size); + while (1) + { + nread = bgzf_raw_read(fp, buf, page_size); + if ( nread<=0 ) break; + + int count = bgzf_raw_write(bgzf_out, buf, nread); + if (count != nread) error("Write failed, wrote %d instead of %d bytes.\n", count,(int)nread); + } + if (bgzf_close(bgzf_out) < 0) error("Error closing %s: %d\n",args->output_fname ? args->output_fname : "-",bgzf_out->errcode); + if (hts_close(args->fp)) error("Error closing %s: %d\n",args->fname,fp->errcode); + free(buf); +} +static void reheader_vcf(args_t *args) +{ + kstring_t hdr = {0,0,0}; + htsFile *fp = args->fp; + while ( hts_getline(fp, KS_SEP_LINE, &fp->line) >=0 ) + { + kputc('\n',&fp->line); // hts_getline eats the newline character + if ( fp->line.s[0]!='#' ) break; + kputsn(fp->line.s,fp->line.l,&hdr); + } + + int nsamples = 0; + char **samples = NULL; + if ( args->samples_fname ) + { + samples = hts_readlines(args->samples_fname, &nsamples); + if ( !samples || !nsamples ) error("Error reading the --samples file \"%s\"\n", args->samples_fname); + } + if ( args->header_fname ) + { + free(hdr.s); hdr.s = NULL; hdr.l = hdr.m = 0; + read_header_file(args->header_fname, &hdr); + } + if ( samples ) + { + set_samples(samples, nsamples, &hdr); + int i; + for (i=0; ioutput_fname ? open(args->output_fname, O_WRONLY|O_CREAT|O_TRUNC, 0666) : STDOUT_FILENO; + if ( out==-1 ) error("%s: %s\n", args->output_fname,strerror(errno)); + if ( write(out, hdr.s, hdr.l)!=hdr.l ) error("Failed to write %"PRIu64" bytes\n", (uint64_t)hdr.l); + free(hdr.s); + if ( fp->line.l ) + { + if ( write(out, fp->line.s, fp->line.l)!=fp->line.l ) error("Failed to write %"PRIu64" bytes\n", (uint64_t)fp->line.l); + } + while ( hts_getline(fp, KS_SEP_LINE, &fp->line) >=0 ) // uncompressed file implies small size, we don't worry about speed + { + kputc('\n',&fp->line); + if ( write(out, fp->line.s, fp->line.l)!=fp->line.l ) error("Failed to write %"PRIu64" bytes\n", (uint64_t)fp->line.l); + } + if ( hts_close(fp)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fname); + if ( close(out)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); +} + +static bcf_hdr_t *strip_header(bcf_hdr_t *src, bcf_hdr_t *dst) +{ + bcf_hrec_t *src_hrec, *dst_hrec, *tmp; + bcf_hdr_t *out = bcf_hdr_init("r"); + int i; + for (i=0; inhrec; i++) + { + // first insert lines which do not code BCF ids, their order does not matter + dst_hrec = dst->hrec[i]; + if ( dst_hrec->type==BCF_HL_FLT || dst_hrec->type==BCF_HL_INFO || dst_hrec->type==BCF_HL_FMT || dst_hrec->type== BCF_HL_CTG ) continue; + bcf_hdr_add_hrec(out, bcf_hrec_dup(dst_hrec)); + } + for (i=0; inhrec; i++) + { + // now transfer header lines which define BCF ids + src_hrec = src->hrec[i]; + + if ( src_hrec->type==BCF_HL_FLT || src_hrec->type==BCF_HL_INFO || src_hrec->type==BCF_HL_FMT || src_hrec->type== BCF_HL_CTG ) + { + int j = bcf_hrec_find_key(src_hrec, "ID"); + dst_hrec = bcf_hdr_get_hrec(dst, src_hrec->type, "ID", src_hrec->vals[j], NULL); + if ( !dst_hrec ) continue; + + tmp = bcf_hrec_dup(dst_hrec); + + j = bcf_hrec_find_key(src_hrec, "IDX"); + if ( j>=0 ) + { + j = atoi(src_hrec->vals[j]); + if (hrec_add_idx(tmp, j) < 0) + error_errno("[%s] Failed to add IDX header", __func__); + } + bcf_hdr_add_hrec(out, tmp); + } + } + if (bcf_hdr_sync(out) < 0) + error_errno("[%s] Failed to update header", __func__); + for (i=0; inhrec; i++) + { + // finally add new structured fields + dst_hrec = dst->hrec[i]; + if ( dst_hrec->type==BCF_HL_FLT || dst_hrec->type==BCF_HL_INFO || dst_hrec->type==BCF_HL_FMT || dst_hrec->type== BCF_HL_CTG ) + { + int j = bcf_hrec_find_key(dst_hrec, "ID"); + tmp = bcf_hdr_get_hrec(out, dst_hrec->type, "ID", dst_hrec->vals[j], NULL); + if ( !tmp ) + bcf_hdr_add_hrec(out, bcf_hrec_dup(dst_hrec)); + } + } + for (i=0; in[BCF_DT_SAMPLE]; i++) bcf_hdr_add_sample(out, dst->samples[i]); + bcf_hdr_destroy(dst); + return out; +} + +static void reheader_bcf(args_t *args, int is_compressed) +{ + htsFile *fp = args->fp; + + if ( args->n_threads > 0 ) + { + args->threads = (htsThreadPool *) calloc(1, sizeof(htsThreadPool)); + if ( !args->threads ) error("Could not allocate memory\n"); + if ( !(args->threads->pool = hts_tpool_init(args->n_threads)) ) error("Could not initialize threading\n"); + hts_set_thread_pool(fp, args->threads); + } + + bcf_hdr_t *hdr = bcf_hdr_read(fp); if ( !hdr ) error("Failed to read the header: %s\n", args->fname); + kstring_t htxt = {0,0,0}; + bcf_hdr_format(hdr, 1, &htxt); + + int i, nsamples = 0; + char **samples = NULL; + if ( args->samples_fname ) + { + samples = hts_readlines(args->samples_fname, &nsamples); + if ( !samples || !nsamples ) error("Error reading the --samples file \"%s\"\n", args->samples_fname); + } + if ( args->header_fname ) + { + free(htxt.s); htxt.s = NULL; htxt.l = htxt.m = 0; + read_header_file(args->header_fname, &htxt); + } + if ( samples ) + { + set_samples(samples, nsamples, &htxt); + for (i=0; iheader_fname ) hdr_out = strip_header(hdr, hdr_out); + + // write the header and the body + htsFile *fp_out = hts_open(args->output_fname ? args->output_fname : "-",is_compressed ? "wb" : "wbu"); + if ( !fp_out ) error("%s: %s\n", args->output_fname ? args->output_fname : "-", strerror(errno)); + if ( args->threads ) + hts_set_thread_pool(fp_out, args->threads); + if ( bcf_hdr_write(fp_out, hdr_out)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname ? args->output_fname : "standard output"); + + bcf1_t *rec = bcf_init(); + while ( bcf_read(fp, hdr, rec)==0 ) + { + // sanity checking, this slows things down. Make it optional? + bcf_unpack(rec, BCF_UN_ALL); + if ( rec->rid >= hdr_out->n[BCF_DT_CTG] || strcmp(bcf_hdr_int2id(hdr,BCF_DT_CTG,rec->rid),bcf_hdr_int2id(hdr_out,BCF_DT_CTG,rec->rid)) ) + error("The CHROM is not defined: \"%s\"\n", bcf_hdr_int2id(hdr,BCF_DT_CTG,rec->rid)); + + for (i=0; id.n_flt; i++) + { + int id = rec->d.flt[i]; + if ( id >= hdr_out->n[BCF_DT_ID] ) break; + if ( !bcf_hdr_idinfo_exists(hdr_out,BCF_HL_FLT,id) ) break; + if ( strcmp(hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key) ) + error("FIXME: Broken FILTER ids: %s vs %s\n", hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key); + } + if ( i!=rec->d.n_flt ) + error("The FILTER is not defined: \"%s\"\n", bcf_hdr_int2id(hdr,BCF_DT_ID,rec->d.flt[i])); + + for (i=0; in_info; i++) + { + int id = rec->d.info[i].key; + if ( id >= hdr_out->n[BCF_DT_ID] ) break; + if ( !hdr_out->id[BCF_DT_ID][id].key ) break; + if ( !bcf_hdr_idinfo_exists(hdr_out,BCF_HL_INFO,id) ) break; + if ( strcmp(hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key) ) + error("FIXME: Broken INFO ids: %s vs %s\n", hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key); + } + if ( i!=rec->n_info ) + error("The INFO tag is not defined: \"%s\"\n", bcf_hdr_int2id(hdr,BCF_DT_ID,rec->d.info[i].key)); + + for (i=0; in_fmt; i++) + { + int id = rec->d.fmt[i].id; + if ( id >= hdr_out->n[BCF_DT_ID] ) break; + if ( !hdr_out->id[BCF_DT_ID][id].key ) break; + if ( !bcf_hdr_idinfo_exists(hdr_out,BCF_HL_FMT,id) ) break; + if ( strcmp(hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key) ) + error("FIXME: Broken FORMAT ids: %s vs %s\n", hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key); + } + if ( i!=rec->n_fmt ) + error("The FORMAT tag is not defined: \"%s\"\n", bcf_hdr_int2id(hdr,BCF_DT_ID,rec->d.fmt[i].id)); + + if ( bcf_write(fp_out,hdr_out,rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname ? args->output_fname : "standard output"); + } + bcf_destroy(rec); + + free(htxt.s); + if ( hts_close(fp_out)!=0 ) error("[%s] Error: failed to close the file %s\n",__func__,args->output_fname ? args->output_fname : "standard output"); + if ( hts_close(fp)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fname); + bcf_hdr_destroy(hdr_out); + bcf_hdr_destroy(hdr); + if ( args->threads ) + { + hts_tpool_destroy(args->threads->pool); + free(args->threads); + } +} + + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Modify header of VCF/BCF files, change sample names.\n"); + fprintf(stderr, "Usage: bcftools reheader [OPTIONS] \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -f, --fai FILE update sequences and their lengths from the .fai file\n"); + fprintf(stderr, " -h, --header FILE new header\n"); + fprintf(stderr, " -o, --output FILE write output to a file [standard output]\n"); + fprintf(stderr, " -s, --samples FILE new sample names\n"); +#ifdef _WIN32 + fprintf(stderr, " -T, --temp-prefix PATH template for temporary file name [/bcftools.XXXXXX]\n"); +#else + fprintf(stderr, " -T, --temp-prefix PATH template for temporary file name [/tmp/bcftools.XXXXXX]\n"); +#endif + fprintf(stderr, " --threads INT use multithreading with worker threads (BCF only) [0]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Example:\n"); + fprintf(stderr, " # Write out the header to be modified\n"); + fprintf(stderr, " bcftools view -h old.bcf > header.txt\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # Edit the header using your favorite text editor\n"); + fprintf(stderr, " vi header.txt\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # Reheader the file\n"); + fprintf(stderr, " bcftools reheader -h header.txt -o new.bcf old.bcf\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_reheader(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + + static struct option loptions[] = + { + {"temp-prefix",1,0,'T'}, + {"fai",1,0,'f'}, + {"output",1,0,'o'}, + {"header",1,0,'h'}, + {"samples",1,0,'s'}, + {"threads",1,NULL,1}, + {0,0,0,0} + }; + while ((c = getopt_long(argc, argv, "s:h:o:f:T:",loptions,NULL)) >= 0) + { + switch (c) + { + case 1 : args->n_threads = strtol(optarg, 0, 0); break; + case 'T': args->tmp_prefix = optarg; break; + case 'f': args->fai_fname = optarg; break; + case 'o': args->output_fname = optarg; break; + case 's': args->samples_fname = optarg; break; + case 'h': args->header_fname = optarg; break; + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args->fname = "-"; // reading from stdin + else usage(args); + } + else args->fname = argv[optind]; + + if ( args->fai_fname ) update_from_fai(args); + if ( !args->samples_fname && !args->header_fname ) usage(args); + if ( !args->fname ) usage(args); + + args->fp = hts_open(args->fname,"r"); + if ( !args->fp ) error("Failed to read from %s\n", !strcmp("-",args->fname)?"standard input":args->fname); + args->type = *hts_get_format(args->fp); + + if ( args->type.format==vcf ) + { + if ( args->type.compression==bgzf ) + reheader_vcf_gz(args); + else if ( args->type.compression==no_compression ) + reheader_vcf(args); + else if ( args->type.compression==gzip ) + error("Error: cannot reheader gzip-compressed files, first convert with `bcftools view --output-type` to a supported format\n"); + else + error("Error: the compression type of \"%s\" is not recognised/supported\n", args->fname); + } + else + reheader_bcf(args, args->type.compression==bgzf || args->type.compression==gzip); + + if ( args->rm_tmpfile ) + { + unlink(args->rm_tmpfile); + free(args->rm_tmpfile); + } + free(args); + return 0; +} diff --git a/bcftools/reheader.c.pysam.c b/bcftools/reheader.c.pysam.c new file mode 100644 index 0000000..a069870 --- /dev/null +++ b/bcftools/reheader.c.pysam.c @@ -0,0 +1,766 @@ +#include "bcftools.pysam.h" + +/* reheader.c -- reheader subcommand. + + Copyright (C) 2014-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include +#include // for hts_get_bgzfp() +#include +#include +#include +#include +#include "bcftools.h" +#include "khash_str2str.h" + +typedef struct _args_t +{ + char **argv, *fname, *samples_fname, *header_fname, *output_fname; + char *fai_fname, *rm_tmpfile, *tmp_prefix; + htsFile *fp; + htsFormat type; + htsThreadPool *threads; + int argc, n_threads; +} +args_t; + +static inline int is_escaped(const char *min, const char *str) +{ + int n = 0; + while ( --str>=min && *str=='\\' ) n++; + return n%2; +} +static char *copy_and_update_contig_line(faidx_t *fai, char *line, void *chr_seen, kstring_t *dst) +{ + kstring_t key = {0,0,0}, val = {0,0,0}, tmp = {0,0,0}; + char *chr_name = NULL, *p, *q = line + 9; // skip ##contig= + char *end = q; + int nopen = 1, chr_len = 0; + while ( *end && *end!='\n' ) end++; + while ( *q && *q!='\n' && nopen>0 ) + { + p = ++q; + while ( *q && (*q==' ' || *q=='\t') ) { p++; q++; } + // ^[A-Za-z_][0-9A-Za-z_.]*$ + if (p==q && *q && (isalpha(*q) || *q=='_')) + { + q++; + while ( *q && (isalnum(*q) || *q=='_' || *q=='.') ) q++; + } + int n = q-p; + int m = 0; + while ( *q && (*q==' ' || *q=='\t') ) { q++; m++; } + if ( *q!='=' || !n ) + { + char *x = q; + while ( *x && *x!='\n' ) x++; + *x = '\0'; + error("Could not parse the line: %s [%s][%s]\n", line,p,q); + } + key.l = 0; + kputsn(p,q-p-m,&key); + p = ++q; + while ( *q && (*q==' ' || *q=='\t') ) { p++; q++; } + int quoted = *p=='"' ? 1 : 0; + if ( quoted ) p++, q++; + while ( *q && *q != '\n' ) + { + if ( quoted ) { if ( *q=='"' && !is_escaped(p,q) ) break; } + else + { + if ( *q=='<' ) nopen++; + if ( *q=='>' ) nopen--; + if ( !nopen ) break; + if ( *q==',' && nopen==1 ) break; + } + q++; + } + char *r = q; + while ( r > p && r[-1] == ' ' ) r--; + val.l = 0; + kputsn(p,r-p,&val); + if ( quoted && *q=='"' ) q++; + if ( *q=='>' ) { nopen--; q++; } + if ( !strcmp("length",key.s) ) continue; + if ( !strcmp("ID",key.s) ) + { + if ( khash_str2int_has_key(chr_seen,val.s) ) continue; + chr_len = faidx_seq_len(fai, val.s); + if ( chr_len==-1 ) + { + free(val.s); free(key.s); free(tmp.s); + return end; // the sequence is not in fai, remove + } + chr_name = strdup(val.s); + khash_str2int_inc(chr_seen, chr_name); + continue; + } + kputc(',',&tmp); + kputs(key.s,&tmp); + kputc('=',&tmp); + if ( quoted ) kputc('"',&tmp); + kputs(val.s,&tmp); + if ( quoted ) kputc('"',&tmp); + } + if ( !chr_name ) return end; + ksprintf(dst,"##contig=",chr_name,chr_len,tmp.l ? tmp.s : ""); + free(key.s); free(val.s); free(tmp.s); + return q; +} +char *init_tmp_prefix(const char *tmp_prefix) +{ + kstring_t prefix = {0,0,0}; + if ( tmp_prefix ) + { + ksprintf(&prefix,"%sXXXXXX",tmp_prefix); + return prefix.s; + } + + char *tmpdir = getenv("TMPDIR"); + if ( tmpdir ) + kputs(tmpdir, &prefix); + else + { + #ifdef _WIN32 + char tmp_path[MAX_PATH]; + int ret = GetTempPath(MAX_PATH, tmp_path); + if (!ret || ret > MAX_PATH) + error("Could not get the path to the temporary folder\n"); + kputs(tmp_path, &prefix); + #else + kputs("/tmp", &prefix); + #endif + } + kputs("/bcftools.XXXXXX", &prefix); + return prefix.s; +} +static void update_from_fai(args_t *args) +{ + if ( !strcmp("-",args->fname) ) + error("Cannot use the --fai option when reading from standard input.\n"); + + faidx_t *fai = fai_load3(args->fai_fname,args->fai_fname,NULL,FAI_FASTA); + if ( !fai ) error("Could not parse %s\n", args->fai_fname); + args->rm_tmpfile = init_tmp_prefix(args->tmp_prefix); + int fd = mkstemp(args->rm_tmpfile); + if ( fd<0 ) error("Could not open a temporary file for writing: %s\n", args->rm_tmpfile); + + // get a template header: either from the original VCF or from --header + char *ori_hdr_fname = args->header_fname ? args->header_fname : args->fname; + htsFile *fp = hts_open(ori_hdr_fname,"r"); + if ( !fp ) error("Failed to open: %s\n", ori_hdr_fname); + bcf_hdr_t *hdr = bcf_hdr_read(fp); + if ( !hdr ) error("Failed to read the header: %s\n", ori_hdr_fname); + hts_close(fp); // no need to check the return status here + + // put the header in a text buffer + kstring_t hdr_txt_ori = {0,0,0}, hdr_txt_new = {0,0,0}; + bcf_hdr_format(hdr, 0, &hdr_txt_ori); + bcf_hdr_destroy(hdr); + + // update the existing contig lines and remove lines not present in the fai file + void *chr_seen = khash_str2int_init(); + char *tmp, *beg = hdr_txt_ori.s; + while ( beg && *beg ) + { + tmp = strstr(beg, "\n##contig=<"); + if ( !tmp ) break; + kputsn(beg, tmp-beg+1, &hdr_txt_new); + size_t l_prev = hdr_txt_new.l; + beg = copy_and_update_contig_line(fai,tmp+1,chr_seen, &hdr_txt_new); + if ( l_prev==hdr_txt_new.l ) hdr_txt_new.l--; // nothing was added, remove the newline + } + if ( !beg || !(tmp=strstr(beg,"\n#CHROM")) ) error("Failed to parse the header, #CHROM not found\n"); + kputsn(beg, tmp-beg+1, &hdr_txt_new); + + // add any new contig lines + int i, n = faidx_nseq(fai); + for (i=0; i\n",faidx_iseq(fai,i),faidx_seq_len(fai,faidx_iseq(fai,i))); + } + kputs(tmp+1,&hdr_txt_new); + + if ( write(fd, hdr_txt_new.s, hdr_txt_new.l)!=hdr_txt_new.l ) error("Failed to write %zu bytes to %s\n", hdr_txt_new.l,args->rm_tmpfile); + if ( close(fd)!=0 ) error("Failed to close %s\n", args->rm_tmpfile); + args->header_fname = args->rm_tmpfile; + + free(hdr_txt_ori.s); + free(hdr_txt_new.s); + fai_destroy(fai); + khash_str2int_destroy_free(chr_seen); +} + +static void read_header_file(char *fname, kstring_t *hdr) +{ + kstring_t tmp = {0,0,0}; + hdr->l = 0; + + htsFile *fp = hts_open(fname, "r"); + if ( !fp ) error("Could not read: %s\n", fname); + while ( hts_getline(fp, KS_SEP_LINE, &tmp) > 0 ) + { + kputsn(tmp.s,tmp.l,hdr); + kputc('\n',hdr); + } + if ( hts_close(fp) ) error("Close failed: %s\n", fname); + free(tmp.s); + + while ( hdr->l>0 && isspace(hdr->s[hdr->l-1]) ) hdr->l--; // remove trailing newlines + kputc('\n',hdr); +} + +static int set_sample_pairs(char **samples, int nsamples, kstring_t *hdr, int idx) +{ + int i, j, n; + kstring_t key = {0,0,0}; + kstring_t val = {0,0,0}; + + // Are these samples "old-name new-name" pairs? + void *hash = khash_str2str_init(); + for (i=0; il>0 && isspace(hdr->s[hdr->l-1]) ) hdr->l--; // remove trailing newlines + hdr->s[hdr->l] = 0; + + kstring_t tmp = {0,0,0}; + i = j = n = 0; // i:traverse the #CHROM line 1 by 1; j:points to the last column + while ( hdr->s[idx+i] ) + { + if ( hdr->s[idx+i]=='\t' ) + { + hdr->s[idx+i] = 0; + + if ( ++n>9 ) + { + char *new_name = khash_str2str_get(hash,hdr->s+idx+j); + kputs(new_name ? new_name : hdr->s+idx+j, &tmp); + } + else + kputs(hdr->s+idx+j, &tmp); + + kputc('\t',&tmp); + + j = ++i; + continue; + } + i++; + } + char *new_name = khash_str2str_get(hash,hdr->s+idx+j); + kputs(new_name ? new_name : hdr->s+idx+j, &tmp); + + khash_str2str_destroy_free_all(hash); + + hdr->l = idx; + kputs(tmp.s, hdr); + kputc('\n', hdr); + free(tmp.s); + + return 1; +} + +static void set_samples(char **samples, int nsamples, kstring_t *hdr) +{ + // Find the beginning of the #CHROM line + int i = hdr->l - 2, ncols = 0; + while ( i>=0 && hdr->s[i]!='\n' ) + { + if ( hdr->s[i]=='\t' ) ncols++; + i--; + } + if ( i<0 || strncmp(hdr->s+i+1,"#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT",45) ) + { + if ( i>0 && !strncmp(hdr->s+i+1,"#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO",38) ) + error("Error: missing FORMAT fields, cowardly refusing to add samples\n"); + + error("Could not parse the header: %s\n", hdr->s); + } + + // Are the samples "old-sample new-sample" pairs? + if ( set_sample_pairs(samples,nsamples,hdr, i+1) ) return; + + // Replace all samples + if ( ncols!=nsamples+8 ) + fprintf(bcftools_stderr, "Warning: different number of samples: %d vs %d\n", nsamples,ncols-8); + + ncols = 0; + while ( ncols!=9 ) + { + i++; + if ( hdr->s[i]=='\t' ) ncols++; + } + hdr->l = i; + + for (i=0; ifp); + if ( !fp || bgzf_read_block(fp) != 0 || !fp->block_length ) + error("Failed to read %s: %s\n", args->fname, strerror(errno)); + + kstring_t hdr = {0,0,0}; + char *buffer = (char*) fp->uncompressed_block; + + // Read the header and find the position of the data block + if ( buffer[0]!='#' ) error("Could not parse the header, expected '#', found '%c'\n", buffer[0]); + + int skip_until = 1; // end of the header in the current uncompressed block + while (1) + { + if ( buffer[skip_until]=='\n' ) + { + skip_until++; + if ( skip_until>=fp->block_length ) + { + kputsn(buffer,skip_until,&hdr); + if ( bgzf_read_block(fp) != 0 ) error("Error reading %s\n", args->fname); + if ( !fp->block_length ) break; + skip_until = 0; + } + // The header has finished + if ( buffer[skip_until]!='#' ) + { + kputsn(buffer,skip_until,&hdr); + break; + } + } + skip_until++; + if ( skip_until>=fp->block_length ) + { + kputsn(buffer,fp->block_length,&hdr); + if ( bgzf_read_block(fp) != 0 ) error("Error reading %s\n", args->fname); + if ( !fp->block_length ) break; + skip_until = 0; + } + } + + int nsamples = 0; + char **samples = NULL; + if ( args->samples_fname ) + { + samples = hts_readlines(args->samples_fname, &nsamples); + if ( !samples || !nsamples ) error("Error reading the --samples file \"%s\"\n", args->samples_fname); + } + if ( args->header_fname ) + { + free(hdr.s); hdr.s = NULL; hdr.l = hdr.m = 0; + read_header_file(args->header_fname, &hdr); + } + if ( samples ) + { + set_samples(samples, nsamples, &hdr); + int i; + for (i=0; ioutput_fname ? args->output_fname : "-","w");; + if ( bgzf_write(bgzf_out, hdr.s, hdr.l) < 0 ) error("Can't write BGZF header (code %d)\n", bgzf_out->errcode); + free(hdr.s); + + // Output all remainig data read with the header block + if ( fp->block_length - skip_until > 0 ) + { + if ( bgzf_write(bgzf_out, buffer+skip_until, fp->block_length-skip_until)<0 ) error("Error: %d\n",fp->errcode); + } + if ( bgzf_flush(bgzf_out)<0 ) error("Error: %d\n",bgzf_out->errcode); + + // Stream the rest of the file without as it is, without decompressing + ssize_t nread; + const size_t page_size = 32768; + char *buf = (char*) malloc(page_size); + while (1) + { + nread = bgzf_raw_read(fp, buf, page_size); + if ( nread<=0 ) break; + + int count = bgzf_raw_write(bgzf_out, buf, nread); + if (count != nread) error("Write failed, wrote %d instead of %d bytes.\n", count,(int)nread); + } + if (bgzf_close(bgzf_out) < 0) error("Error closing %s: %d\n",args->output_fname ? args->output_fname : "-",bgzf_out->errcode); + if (hts_close(args->fp)) error("Error closing %s: %d\n",args->fname,fp->errcode); + free(buf); +} +static void reheader_vcf(args_t *args) +{ + kstring_t hdr = {0,0,0}; + htsFile *fp = args->fp; + while ( hts_getline(fp, KS_SEP_LINE, &fp->line) >=0 ) + { + kputc('\n',&fp->line); // hts_getline eats the newline character + if ( fp->line.s[0]!='#' ) break; + kputsn(fp->line.s,fp->line.l,&hdr); + } + + int nsamples = 0; + char **samples = NULL; + if ( args->samples_fname ) + { + samples = hts_readlines(args->samples_fname, &nsamples); + if ( !samples || !nsamples ) error("Error reading the --samples file \"%s\"\n", args->samples_fname); + } + if ( args->header_fname ) + { + free(hdr.s); hdr.s = NULL; hdr.l = hdr.m = 0; + read_header_file(args->header_fname, &hdr); + } + if ( samples ) + { + set_samples(samples, nsamples, &hdr); + int i; + for (i=0; ioutput_fname ? open(args->output_fname, O_WRONLY|O_CREAT|O_TRUNC, 0666) : STDOUT_FILENO; + if ( out==-1 ) error("%s: %s\n", args->output_fname,strerror(errno)); + if ( write(out, hdr.s, hdr.l)!=hdr.l ) error("Failed to write %"PRIu64" bytes\n", (uint64_t)hdr.l); + free(hdr.s); + if ( fp->line.l ) + { + if ( write(out, fp->line.s, fp->line.l)!=fp->line.l ) error("Failed to write %"PRIu64" bytes\n", (uint64_t)fp->line.l); + } + while ( hts_getline(fp, KS_SEP_LINE, &fp->line) >=0 ) // uncompressed file implies small size, we don't worry about speed + { + kputc('\n',&fp->line); + if ( write(out, fp->line.s, fp->line.l)!=fp->line.l ) error("Failed to write %"PRIu64" bytes\n", (uint64_t)fp->line.l); + } + if ( hts_close(fp)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fname); + if ( close(out)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); +} + +static bcf_hdr_t *strip_header(bcf_hdr_t *src, bcf_hdr_t *dst) +{ + bcf_hrec_t *src_hrec, *dst_hrec, *tmp; + bcf_hdr_t *out = bcf_hdr_init("r"); + int i; + for (i=0; inhrec; i++) + { + // first insert lines which do not code BCF ids, their order does not matter + dst_hrec = dst->hrec[i]; + if ( dst_hrec->type==BCF_HL_FLT || dst_hrec->type==BCF_HL_INFO || dst_hrec->type==BCF_HL_FMT || dst_hrec->type== BCF_HL_CTG ) continue; + bcf_hdr_add_hrec(out, bcf_hrec_dup(dst_hrec)); + } + for (i=0; inhrec; i++) + { + // now transfer header lines which define BCF ids + src_hrec = src->hrec[i]; + + if ( src_hrec->type==BCF_HL_FLT || src_hrec->type==BCF_HL_INFO || src_hrec->type==BCF_HL_FMT || src_hrec->type== BCF_HL_CTG ) + { + int j = bcf_hrec_find_key(src_hrec, "ID"); + dst_hrec = bcf_hdr_get_hrec(dst, src_hrec->type, "ID", src_hrec->vals[j], NULL); + if ( !dst_hrec ) continue; + + tmp = bcf_hrec_dup(dst_hrec); + + j = bcf_hrec_find_key(src_hrec, "IDX"); + if ( j>=0 ) + { + j = atoi(src_hrec->vals[j]); + if (hrec_add_idx(tmp, j) < 0) + error_errno("[%s] Failed to add IDX header", __func__); + } + bcf_hdr_add_hrec(out, tmp); + } + } + if (bcf_hdr_sync(out) < 0) + error_errno("[%s] Failed to update header", __func__); + for (i=0; inhrec; i++) + { + // finally add new structured fields + dst_hrec = dst->hrec[i]; + if ( dst_hrec->type==BCF_HL_FLT || dst_hrec->type==BCF_HL_INFO || dst_hrec->type==BCF_HL_FMT || dst_hrec->type== BCF_HL_CTG ) + { + int j = bcf_hrec_find_key(dst_hrec, "ID"); + tmp = bcf_hdr_get_hrec(out, dst_hrec->type, "ID", dst_hrec->vals[j], NULL); + if ( !tmp ) + bcf_hdr_add_hrec(out, bcf_hrec_dup(dst_hrec)); + } + } + for (i=0; in[BCF_DT_SAMPLE]; i++) bcf_hdr_add_sample(out, dst->samples[i]); + bcf_hdr_destroy(dst); + return out; +} + +static void reheader_bcf(args_t *args, int is_compressed) +{ + htsFile *fp = args->fp; + + if ( args->n_threads > 0 ) + { + args->threads = (htsThreadPool *) calloc(1, sizeof(htsThreadPool)); + if ( !args->threads ) error("Could not allocate memory\n"); + if ( !(args->threads->pool = hts_tpool_init(args->n_threads)) ) error("Could not initialize threading\n"); + hts_set_thread_pool(fp, args->threads); + } + + bcf_hdr_t *hdr = bcf_hdr_read(fp); if ( !hdr ) error("Failed to read the header: %s\n", args->fname); + kstring_t htxt = {0,0,0}; + bcf_hdr_format(hdr, 1, &htxt); + + int i, nsamples = 0; + char **samples = NULL; + if ( args->samples_fname ) + { + samples = hts_readlines(args->samples_fname, &nsamples); + if ( !samples || !nsamples ) error("Error reading the --samples file \"%s\"\n", args->samples_fname); + } + if ( args->header_fname ) + { + free(htxt.s); htxt.s = NULL; htxt.l = htxt.m = 0; + read_header_file(args->header_fname, &htxt); + } + if ( samples ) + { + set_samples(samples, nsamples, &htxt); + for (i=0; iheader_fname ) hdr_out = strip_header(hdr, hdr_out); + + // write the header and the body + htsFile *fp_out = hts_open(args->output_fname ? args->output_fname : "-",is_compressed ? "wb" : "wbu"); + if ( !fp_out ) error("%s: %s\n", args->output_fname ? args->output_fname : "-", strerror(errno)); + if ( args->threads ) + hts_set_thread_pool(fp_out, args->threads); + if ( bcf_hdr_write(fp_out, hdr_out)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname ? args->output_fname : "standard output"); + + bcf1_t *rec = bcf_init(); + while ( bcf_read(fp, hdr, rec)==0 ) + { + // sanity checking, this slows things down. Make it optional? + bcf_unpack(rec, BCF_UN_ALL); + if ( rec->rid >= hdr_out->n[BCF_DT_CTG] || strcmp(bcf_hdr_int2id(hdr,BCF_DT_CTG,rec->rid),bcf_hdr_int2id(hdr_out,BCF_DT_CTG,rec->rid)) ) + error("The CHROM is not defined: \"%s\"\n", bcf_hdr_int2id(hdr,BCF_DT_CTG,rec->rid)); + + for (i=0; id.n_flt; i++) + { + int id = rec->d.flt[i]; + if ( id >= hdr_out->n[BCF_DT_ID] ) break; + if ( !bcf_hdr_idinfo_exists(hdr_out,BCF_HL_FLT,id) ) break; + if ( strcmp(hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key) ) + error("FIXME: Broken FILTER ids: %s vs %s\n", hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key); + } + if ( i!=rec->d.n_flt ) + error("The FILTER is not defined: \"%s\"\n", bcf_hdr_int2id(hdr,BCF_DT_ID,rec->d.flt[i])); + + for (i=0; in_info; i++) + { + int id = rec->d.info[i].key; + if ( id >= hdr_out->n[BCF_DT_ID] ) break; + if ( !hdr_out->id[BCF_DT_ID][id].key ) break; + if ( !bcf_hdr_idinfo_exists(hdr_out,BCF_HL_INFO,id) ) break; + if ( strcmp(hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key) ) + error("FIXME: Broken INFO ids: %s vs %s\n", hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key); + } + if ( i!=rec->n_info ) + error("The INFO tag is not defined: \"%s\"\n", bcf_hdr_int2id(hdr,BCF_DT_ID,rec->d.info[i].key)); + + for (i=0; in_fmt; i++) + { + int id = rec->d.fmt[i].id; + if ( id >= hdr_out->n[BCF_DT_ID] ) break; + if ( !hdr_out->id[BCF_DT_ID][id].key ) break; + if ( !bcf_hdr_idinfo_exists(hdr_out,BCF_HL_FMT,id) ) break; + if ( strcmp(hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key) ) + error("FIXME: Broken FORMAT ids: %s vs %s\n", hdr->id[BCF_DT_ID][id].key,hdr_out->id[BCF_DT_ID][id].key); + } + if ( i!=rec->n_fmt ) + error("The FORMAT tag is not defined: \"%s\"\n", bcf_hdr_int2id(hdr,BCF_DT_ID,rec->d.fmt[i].id)); + + if ( bcf_write(fp_out,hdr_out,rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname ? args->output_fname : "standard output"); + } + bcf_destroy(rec); + + free(htxt.s); + if ( hts_close(fp_out)!=0 ) error("[%s] Error: failed to close the file %s\n",__func__,args->output_fname ? args->output_fname : "standard output"); + if ( hts_close(fp)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fname); + bcf_hdr_destroy(hdr_out); + bcf_hdr_destroy(hdr); + if ( args->threads ) + { + hts_tpool_destroy(args->threads->pool); + free(args->threads); + } +} + + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Modify header of VCF/BCF files, change sample names.\n"); + fprintf(bcftools_stderr, "Usage: bcftools reheader [OPTIONS] \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -f, --fai FILE update sequences and their lengths from the .fai file\n"); + fprintf(bcftools_stderr, " -h, --header FILE new header\n"); + fprintf(bcftools_stderr, " -o, --output FILE write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -s, --samples FILE new sample names\n"); +#ifdef _WIN32 + fprintf(bcftools_stderr, " -T, --temp-prefix PATH template for temporary file name [/bcftools.XXXXXX]\n"); +#else + fprintf(bcftools_stderr, " -T, --temp-prefix PATH template for temporary file name [/tmp/bcftools.XXXXXX]\n"); +#endif + fprintf(bcftools_stderr, " --threads INT use multithreading with worker threads (BCF only) [0]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Example:\n"); + fprintf(bcftools_stderr, " # Write out the header to be modified\n"); + fprintf(bcftools_stderr, " bcftools view -h old.bcf > header.txt\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # Edit the header using your favorite text editor\n"); + fprintf(bcftools_stderr, " vi header.txt\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # Reheader the file\n"); + fprintf(bcftools_stderr, " bcftools reheader -h header.txt -o new.bcf old.bcf\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_reheader(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + + static struct option loptions[] = + { + {"temp-prefix",1,0,'T'}, + {"fai",1,0,'f'}, + {"output",1,0,'o'}, + {"header",1,0,'h'}, + {"samples",1,0,'s'}, + {"threads",1,NULL,1}, + {0,0,0,0} + }; + while ((c = getopt_long(argc, argv, "s:h:o:f:T:",loptions,NULL)) >= 0) + { + switch (c) + { + case 1 : args->n_threads = strtol(optarg, 0, 0); break; + case 'T': args->tmp_prefix = optarg; break; + case 'f': args->fai_fname = optarg; break; + case 'o': args->output_fname = optarg; break; + case 's': args->samples_fname = optarg; break; + case 'h': args->header_fname = optarg; break; + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args->fname = "-"; // reading from stdin + else usage(args); + } + else args->fname = argv[optind]; + + if ( args->fai_fname ) update_from_fai(args); + if ( !args->samples_fname && !args->header_fname ) usage(args); + if ( !args->fname ) usage(args); + + args->fp = hts_open(args->fname,"r"); + if ( !args->fp ) error("Failed to read from %s\n", !strcmp("-",args->fname)?"standard input":args->fname); + args->type = *hts_get_format(args->fp); + + if ( args->type.format==vcf ) + { + if ( args->type.compression==bgzf ) + reheader_vcf_gz(args); + else if ( args->type.compression==no_compression ) + reheader_vcf(args); + else if ( args->type.compression==gzip ) + error("Error: cannot reheader gzip-compressed files, first convert with `bcftools view --output-type` to a supported format\n"); + else + error("Error: the compression type of \"%s\" is not recognised/supported\n", args->fname); + } + else + reheader_bcf(args, args->type.compression==bgzf || args->type.compression==gzip); + + if ( args->rm_tmpfile ) + { + unlink(args->rm_tmpfile); + free(args->rm_tmpfile); + } + free(args); + return 0; +} diff --git a/bcftools/smpl_ilist.c b/bcftools/smpl_ilist.c new file mode 100644 index 0000000..e3fbacc --- /dev/null +++ b/bcftools/smpl_ilist.c @@ -0,0 +1,170 @@ +/* + Copyright (C) 2016-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include "bcftools.h" +#include "smpl_ilist.h" + +void smpl_ilist_destroy(smpl_ilist_t *smpl) +{ + int i; + if ( smpl->pair ) + { + for (i=0; in; i++) free(smpl->pair[i]); + free(smpl->pair); + } + free(smpl->idx); + free(smpl); +} + +static inline int is_space_or_escaped(const char *min, const char *str) +{ + if ( !isspace(*str) ) return 0; + int n = 0; + while ( --str>=min && *str=='\\' ) n++; + return n%2 ? 0 : 1; +} +smpl_ilist_t *smpl_ilist_init(bcf_hdr_t *hdr, char *sample_list, int is_file, int flags) +{ + smpl_ilist_t *smpl = (smpl_ilist_t*) calloc(1,sizeof(smpl_ilist_t)); + + int i; + if ( !sample_list ) + { + smpl->n = bcf_hdr_nsamples(hdr); + smpl->idx = (int*) malloc(sizeof(int)*smpl->n); + for (i=0; in; i++) smpl->idx[i] = i; + return smpl; + } + + int negate = sample_list[0]=='^' ? 1 : 0; + int nlist; + char **list = hts_readlist(negate?sample_list+1:sample_list, is_file, &nlist); + if ( !list ) error("Could not parse %s\n", sample_list); + + if ( negate && (flags&SMPL_REORDER) ) flags &= ~SMPL_REORDER; + + // preserve the VCF order unless flags&SMPL_REORDER is set + int j = 0; + int *tmp = (int*)calloc(bcf_hdr_nsamples(hdr),sizeof(int)); + char **pair = NULL; + for (i=0; in++; + } + + if ( flags & SMPL_REORDER ) + { + smpl->idx = tmp; + for (i=0; in = bcf_hdr_nsamples(hdr) - smpl->n; + smpl->idx = (int*) malloc(sizeof(int)*smpl->n); + + j = 0; + if ( !negate ) + { + if ( pair ) smpl->pair = (char**) calloc(smpl->n,sizeof(char*)); + for (i=0; iidx[j] = i; + if ( pair && pair[i] ) smpl->pair[j] = pair[i]; + j++; + } + } + else + { + for (i=0; iidx[j++] = i; + } + + free(tmp); + free(pair); + for (i=0; in = bcf_hdr_nsamples(hdr_a); + smpl->idx = (int*) malloc(sizeof(int)*smpl->n); + for (i=0; in; i++) + { + const char *name = bcf_hdr_int2id(hdr_a, BCF_DT_SAMPLE, i); + smpl->idx[i] = bcf_hdr_id2int(hdr_b, BCF_DT_SAMPLE, name); + if ( flags&SMPL_STRICT && smpl->idx[i]<0 ) + error("The sample %s is not present in the second file\n", name); + } + return smpl; +} + diff --git a/bcftools/smpl_ilist.c.pysam.c b/bcftools/smpl_ilist.c.pysam.c new file mode 100644 index 0000000..68ed527 --- /dev/null +++ b/bcftools/smpl_ilist.c.pysam.c @@ -0,0 +1,172 @@ +#include "bcftools.pysam.h" + +/* + Copyright (C) 2016-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include "bcftools.h" +#include "smpl_ilist.h" + +void smpl_ilist_destroy(smpl_ilist_t *smpl) +{ + int i; + if ( smpl->pair ) + { + for (i=0; in; i++) free(smpl->pair[i]); + free(smpl->pair); + } + free(smpl->idx); + free(smpl); +} + +static inline int is_space_or_escaped(const char *min, const char *str) +{ + if ( !isspace(*str) ) return 0; + int n = 0; + while ( --str>=min && *str=='\\' ) n++; + return n%2 ? 0 : 1; +} +smpl_ilist_t *smpl_ilist_init(bcf_hdr_t *hdr, char *sample_list, int is_file, int flags) +{ + smpl_ilist_t *smpl = (smpl_ilist_t*) calloc(1,sizeof(smpl_ilist_t)); + + int i; + if ( !sample_list ) + { + smpl->n = bcf_hdr_nsamples(hdr); + smpl->idx = (int*) malloc(sizeof(int)*smpl->n); + for (i=0; in; i++) smpl->idx[i] = i; + return smpl; + } + + int negate = sample_list[0]=='^' ? 1 : 0; + int nlist; + char **list = hts_readlist(negate?sample_list+1:sample_list, is_file, &nlist); + if ( !list ) error("Could not parse %s\n", sample_list); + + if ( negate && (flags&SMPL_REORDER) ) flags &= ~SMPL_REORDER; + + // preserve the VCF order unless flags&SMPL_REORDER is set + int j = 0; + int *tmp = (int*)calloc(bcf_hdr_nsamples(hdr),sizeof(int)); + char **pair = NULL; + for (i=0; in++; + } + + if ( flags & SMPL_REORDER ) + { + smpl->idx = tmp; + for (i=0; in = bcf_hdr_nsamples(hdr) - smpl->n; + smpl->idx = (int*) malloc(sizeof(int)*smpl->n); + + j = 0; + if ( !negate ) + { + if ( pair ) smpl->pair = (char**) calloc(smpl->n,sizeof(char*)); + for (i=0; iidx[j] = i; + if ( pair && pair[i] ) smpl->pair[j] = pair[i]; + j++; + } + } + else + { + for (i=0; iidx[j++] = i; + } + + free(tmp); + free(pair); + for (i=0; in = bcf_hdr_nsamples(hdr_a); + smpl->idx = (int*) malloc(sizeof(int)*smpl->n); + for (i=0; in; i++) + { + const char *name = bcf_hdr_int2id(hdr_a, BCF_DT_SAMPLE, i); + smpl->idx[i] = bcf_hdr_id2int(hdr_b, BCF_DT_SAMPLE, name); + if ( flags&SMPL_STRICT && smpl->idx[i]<0 ) + error("The sample %s is not present in the second file\n", name); + } + return smpl; +} + diff --git a/bcftools/smpl_ilist.h b/bcftools/smpl_ilist.h new file mode 100644 index 0000000..79292c3 --- /dev/null +++ b/bcftools/smpl_ilist.h @@ -0,0 +1,53 @@ +/* + Copyright (C) 2016-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ +/* + Parse --samples and --samples-file +*/ + +#ifndef __SMPL_ILIST_H__ +#define __SMPL_ILIST_H__ + +#include + +#define SMPL_NONE 0 // flexible error recovery +#define SMPL_STRICT 1 // samples must exist +#define SMPL_SINGLE 2 // single sample expected +#define SMPL_PAIR1 4 // two samples expected, the first is from the bcf hdr +#define SMPL_PAIR2 8 // two samples expected, the second is from the bcf hdr +#define SMPL_VERBOSE 16 // print warnings +#define SMPL_REORDER 32 // reorder samples as asked, sample_list[i] points to the VCF header index + +typedef struct +{ + char **pair; // the other sample in the pair + int *idx; // index to bcf_hdr_t.samples; the first (SMPL_SINGLE|SMPL_PAIR1) or second sample (SMPL_PAIR2) + int n; +} +smpl_ilist_t; + +smpl_ilist_t *smpl_ilist_init(bcf_hdr_t *hdr, char *sample_list, int is_file, int flags); +smpl_ilist_t *smpl_ilist_map(bcf_hdr_t *hdr_a, bcf_hdr_t *hdr_b, int flags); +void smpl_ilist_destroy(smpl_ilist_t *smpl); + +#endif diff --git a/bcftools/str_finder.c b/bcftools/str_finder.c new file mode 100644 index 0000000..800cbfe --- /dev/null +++ b/bcftools/str_finder.c @@ -0,0 +1,270 @@ +/* str_finder.c -- Short Tandem Repeat finder. + Originally from Crumble (https://github.com/jkbonfield/crumble) + + Copyright (C) 2015-2016, 2021 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include + +#include "str_finder.h" +#include "utlist.h" + +#define MAX(a,b) ((a)>(b)?(a):(b)) +#define MIN(a,b) ((a)<(b)?(a):(b)) + +typedef unsigned char uc; + +static void add_rep(rep_ele **list, char *cons, int clen, int pos, int rlen, + int lower_only, unsigned int w) { + rep_ele *el, *tmp, *prev; + char *cp1, *cp2, *cp_end; + int i; + + // Already handled this in previous overlap? + if (*list) { + tmp = DL_TAIL(*list); + if (tmp->start <= pos-rlen*2+1 && tmp->end >= pos) + return; + } + + // Find current and last occurence of repeated word. + + cp2 = &cons[pos+1]; + // If unpadded, this is quicker: cp1 = &cons[pos+1-rlen]; + + for (cp1 = &cons[pos], i = 1; i < rlen; cp1--) // compensate for pads + if (*cp1 == '*') + continue; + else + i++; + while (*cp1 == '*') + cp1--; + + + // Scan ahead to see how much further it goes. + cp_end = &cons[clen]; + while (cp2 < cp_end) { + if (*cp1 != *cp2) + break; + + w<<=2; + w|=*cp2; + cp1++; + cp2++; + } + + if (!(el = malloc(sizeof(*el)))) + return; + + el->end = pos + cp2-&cons[pos+1]; + el->rep_len = rlen; + pos++; + while (rlen--) { + while (cons[--pos] == '*'); + while (cons[--pos] == '*'); + } + //pos++; + while (pos > 1 && cons[pos-1] == '*') pos--; + el->start = pos; + + // Check it meets the lower-case only criteria + if (lower_only) { + int lc = 0; + for (i = el->start; i <= el->end; i++) { + if (islower(cons[i])) { + lc = 1; + break; + } + } + + if (!lc) { + free(el); + return; + } + } + + // Remove any older items on the list that are entirely contained within el + if (*list) { + tmp = DL_TAIL(*list); + do { + prev = tmp->prev; + if (tmp->end < el->start) + break; + + if (tmp->start >= el->start) { + DL_DELETE(*list, tmp); + free(tmp); + } + + if (tmp == DL_HEAD(*list)) + break; + tmp = prev; + } while (*list); + } + + DL_APPEND(*list, el); + + return; +} + +/* + * Finds repeated homopolymers up to 8-mers. + * Note this assumes cons is 0-3, so N of 4 may rarely give false hits. + * + * Returns a list of rep_ele structs holding the start,end tuples of repeats; + * NULL on failure. + */ +rep_ele *find_STR(char *cons, int len, int lower_only) { + int i, j; + uint32_t w = 0; + rep_ele *reps = NULL; + + for (i = j = 0; i < len && j < 15; i++) { + if (cons[i] == '*') continue; + + w <<= 2; + w |= cons[i]; + //printf("%3d %c w=%08x\n", i, cons[i], w); + if (j>= 1 && (w&0x0003) == ((w>> 2)&0x0003)) + add_rep(&reps, cons, len, i, 1, lower_only, w); + if (j>= 3 && (w&0x000f) == ((w>> 4)&0x000f)) + add_rep(&reps, cons, len, i, 2, lower_only, w); + if (j>= 5 && (w&0x003f) == ((w>> 6)&0x003f)) + add_rep(&reps, cons, len, i, 3, lower_only, w); + if (j>= 7 && (w&0x00ff) == ((w>> 8)&0x00ff)) + add_rep(&reps, cons, len, i, 4, lower_only, w); + if (j>= 9 && (w&0x03ff) == ((w>>10)&0x03ff)) + add_rep(&reps, cons, len, i, 5, lower_only, w); + if (j>=11 && (w&0x0fff) == ((w>>12)&0x0fff)) + add_rep(&reps, cons, len, i, 6, lower_only, w); + if (j>=13 && (w&0x3fff) == ((w>>14)&0x3fff)) + add_rep(&reps, cons, len, i, 7, lower_only, w); + + j++; + } + + for (; i < len; i++) { + if (cons[i] == '*') continue; + + w <<= 2; + w |= cons[i]; + //printf("%3d %c w=%08x\n", i, cons[i], w); + if ((w&0xffff) == ((w>>16)&0xffff)) + add_rep(&reps, cons, len, i, 8, lower_only, w); + else if ((w&0x3fff) == ((w>>14)&0x3fff)) + add_rep(&reps, cons, len, i, 7, lower_only, w); + else if ((w&0x0fff) == ((w>>12)&0x0fff)) + add_rep(&reps, cons, len, i, 6, lower_only, w); + else if ((w&0x03ff) == ((w>>10)&0x03ff)) + add_rep(&reps, cons, len, i, 5, lower_only, w); + else if ((w&0x00ff) == ((w>> 8)&0x00ff)) + add_rep(&reps, cons, len, i, 4, lower_only, w); + else if ((w&0x003f) == ((w>> 6)&0x003f)) + add_rep(&reps, cons, len, i, 3, lower_only, w); + else if ((w&0x000f) == ((w>> 4)&0x000f)) + add_rep(&reps, cons, len, i, 2, lower_only, w); + else if ((w&0x0003) == ((w>> 2)&0x0003)) + add_rep(&reps, cons, len, i, 1, lower_only, w); + } + + return reps; +} + +/* ----------------------------------------------------------------------------- + * Computes repeat regions in the consensus and then provides a bit mask + * indicating the extend of the STRs. + * + * The purpose of this is to identify where a read needs to span the entire + * region in order to validate how many copies of a repeat word are present. + * This only really has a major impact when indels are involved. + * + * For example, given this multiple alignment: + * + * S1 GATCGGACGAGAG + * S2 GATCGGACGAGAGAGAGAGAGT + * S3 GATCGGACGAGAGAGAGAG**TCGGAC + * S4 GGACGAGAGAGAGAGAGTCGGAC + * S5 CGAGAGAGAGAG**TCGGAC + * S6 AGAGAGAGTCGGAC + * + * We have subseq of GAGAGAGAGAG** vs GAGAGAGAGAGAG. The first and last + * (S1 and S6) sequences do not span and so we do not know which allele they + * match. Specifically as the pad is at the right hand end, the alignment of + * S6 gives incorrect weight to the consensus as it is stating AG when it + * may actually be ** at that point. + * + * By identifying the repeats we can soft clip as follows: + * + * S1 GATCGGACgagag + * S2 GATCGGACGAGAGAGAGAGAGT + * S3 GATCGGACGAGAGAGAGAG**TCGGAC + * S4 GGACGAGAGAGAGAGAGTCGGAC + * S5 CGAGAGAGAGAG**TCGGAC + * S6 agagagagTCGGAC + * + * Returns an array of STR vs no-STR values. + * 0 => non repetitive. + * 1+ => repeat with consecutive bit-number for repeat size. + * + * Eg: AGGGGAGGAGAAGAC + * 1111 1111 + * 2222222 + * 444444 + * => 011331137754440 + */ +char *cons_mark_STR(char *cons, int len, int lower_only) { + rep_ele *reps, *elt, *tmp; + char *str; + + str = calloc(1, len); + reps = find_STR(cons, len, lower_only); + + DL_FOREACH_SAFE(reps, elt, tmp) { + int i, v = 0; + + //printf("%2d .. %2d %.*s\n", elt->start, elt->end, + // elt->end - elt->start+1, &cons[elt->start]); + + // What is there? + for (i = MAX(elt->start-1,0); i <= MIN(elt->end+1,len-1); i++) + v |= str[i]; + + for (i = 0; i < 8; i++) { + if (!(v&(1<start; i <= elt->end; i++) + str[i] |= v; + + DL_DELETE(reps, elt); + free(elt); + } + + return str; +} diff --git a/bcftools/str_finder.c.pysam.c b/bcftools/str_finder.c.pysam.c new file mode 100644 index 0000000..296c867 --- /dev/null +++ b/bcftools/str_finder.c.pysam.c @@ -0,0 +1,272 @@ +#include "bcftools.pysam.h" + +/* str_finder.c -- Short Tandem Repeat finder. + Originally from Crumble (https://github.com/jkbonfield/crumble) + + Copyright (C) 2015-2016, 2021 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include + +#include "str_finder.h" +#include "utlist.h" + +#define MAX(a,b) ((a)>(b)?(a):(b)) +#define MIN(a,b) ((a)<(b)?(a):(b)) + +typedef unsigned char uc; + +static void add_rep(rep_ele **list, char *cons, int clen, int pos, int rlen, + int lower_only, unsigned int w) { + rep_ele *el, *tmp, *prev; + char *cp1, *cp2, *cp_end; + int i; + + // Already handled this in previous overlap? + if (*list) { + tmp = DL_TAIL(*list); + if (tmp->start <= pos-rlen*2+1 && tmp->end >= pos) + return; + } + + // Find current and last occurence of repeated word. + + cp2 = &cons[pos+1]; + // If unpadded, this is quicker: cp1 = &cons[pos+1-rlen]; + + for (cp1 = &cons[pos], i = 1; i < rlen; cp1--) // compensate for pads + if (*cp1 == '*') + continue; + else + i++; + while (*cp1 == '*') + cp1--; + + + // Scan ahead to see how much further it goes. + cp_end = &cons[clen]; + while (cp2 < cp_end) { + if (*cp1 != *cp2) + break; + + w<<=2; + w|=*cp2; + cp1++; + cp2++; + } + + if (!(el = malloc(sizeof(*el)))) + return; + + el->end = pos + cp2-&cons[pos+1]; + el->rep_len = rlen; + pos++; + while (rlen--) { + while (cons[--pos] == '*'); + while (cons[--pos] == '*'); + } + //pos++; + while (pos > 1 && cons[pos-1] == '*') pos--; + el->start = pos; + + // Check it meets the lower-case only criteria + if (lower_only) { + int lc = 0; + for (i = el->start; i <= el->end; i++) { + if (islower(cons[i])) { + lc = 1; + break; + } + } + + if (!lc) { + free(el); + return; + } + } + + // Remove any older items on the list that are entirely contained within el + if (*list) { + tmp = DL_TAIL(*list); + do { + prev = tmp->prev; + if (tmp->end < el->start) + break; + + if (tmp->start >= el->start) { + DL_DELETE(*list, tmp); + free(tmp); + } + + if (tmp == DL_HEAD(*list)) + break; + tmp = prev; + } while (*list); + } + + DL_APPEND(*list, el); + + return; +} + +/* + * Finds repeated homopolymers up to 8-mers. + * Note this assumes cons is 0-3, so N of 4 may rarely give false hits. + * + * Returns a list of rep_ele structs holding the start,end tuples of repeats; + * NULL on failure. + */ +rep_ele *find_STR(char *cons, int len, int lower_only) { + int i, j; + uint32_t w = 0; + rep_ele *reps = NULL; + + for (i = j = 0; i < len && j < 15; i++) { + if (cons[i] == '*') continue; + + w <<= 2; + w |= cons[i]; + //printf("%3d %c w=%08x\n", i, cons[i], w); + if (j>= 1 && (w&0x0003) == ((w>> 2)&0x0003)) + add_rep(&reps, cons, len, i, 1, lower_only, w); + if (j>= 3 && (w&0x000f) == ((w>> 4)&0x000f)) + add_rep(&reps, cons, len, i, 2, lower_only, w); + if (j>= 5 && (w&0x003f) == ((w>> 6)&0x003f)) + add_rep(&reps, cons, len, i, 3, lower_only, w); + if (j>= 7 && (w&0x00ff) == ((w>> 8)&0x00ff)) + add_rep(&reps, cons, len, i, 4, lower_only, w); + if (j>= 9 && (w&0x03ff) == ((w>>10)&0x03ff)) + add_rep(&reps, cons, len, i, 5, lower_only, w); + if (j>=11 && (w&0x0fff) == ((w>>12)&0x0fff)) + add_rep(&reps, cons, len, i, 6, lower_only, w); + if (j>=13 && (w&0x3fff) == ((w>>14)&0x3fff)) + add_rep(&reps, cons, len, i, 7, lower_only, w); + + j++; + } + + for (; i < len; i++) { + if (cons[i] == '*') continue; + + w <<= 2; + w |= cons[i]; + //printf("%3d %c w=%08x\n", i, cons[i], w); + if ((w&0xffff) == ((w>>16)&0xffff)) + add_rep(&reps, cons, len, i, 8, lower_only, w); + else if ((w&0x3fff) == ((w>>14)&0x3fff)) + add_rep(&reps, cons, len, i, 7, lower_only, w); + else if ((w&0x0fff) == ((w>>12)&0x0fff)) + add_rep(&reps, cons, len, i, 6, lower_only, w); + else if ((w&0x03ff) == ((w>>10)&0x03ff)) + add_rep(&reps, cons, len, i, 5, lower_only, w); + else if ((w&0x00ff) == ((w>> 8)&0x00ff)) + add_rep(&reps, cons, len, i, 4, lower_only, w); + else if ((w&0x003f) == ((w>> 6)&0x003f)) + add_rep(&reps, cons, len, i, 3, lower_only, w); + else if ((w&0x000f) == ((w>> 4)&0x000f)) + add_rep(&reps, cons, len, i, 2, lower_only, w); + else if ((w&0x0003) == ((w>> 2)&0x0003)) + add_rep(&reps, cons, len, i, 1, lower_only, w); + } + + return reps; +} + +/* ----------------------------------------------------------------------------- + * Computes repeat regions in the consensus and then provides a bit mask + * indicating the extend of the STRs. + * + * The purpose of this is to identify where a read needs to span the entire + * region in order to validate how many copies of a repeat word are present. + * This only really has a major impact when indels are involved. + * + * For example, given this multiple alignment: + * + * S1 GATCGGACGAGAG + * S2 GATCGGACGAGAGAGAGAGAGT + * S3 GATCGGACGAGAGAGAGAG**TCGGAC + * S4 GGACGAGAGAGAGAGAGTCGGAC + * S5 CGAGAGAGAGAG**TCGGAC + * S6 AGAGAGAGTCGGAC + * + * We have subseq of GAGAGAGAGAG** vs GAGAGAGAGAGAG. The first and last + * (S1 and S6) sequences do not span and so we do not know which allele they + * match. Specifically as the pad is at the right hand end, the alignment of + * S6 gives incorrect weight to the consensus as it is stating AG when it + * may actually be ** at that point. + * + * By identifying the repeats we can soft clip as follows: + * + * S1 GATCGGACgagag + * S2 GATCGGACGAGAGAGAGAGAGT + * S3 GATCGGACGAGAGAGAGAG**TCGGAC + * S4 GGACGAGAGAGAGAGAGTCGGAC + * S5 CGAGAGAGAGAG**TCGGAC + * S6 agagagagTCGGAC + * + * Returns an array of STR vs no-STR values. + * 0 => non repetitive. + * 1+ => repeat with consecutive bit-number for repeat size. + * + * Eg: AGGGGAGGAGAAGAC + * 1111 1111 + * 2222222 + * 444444 + * => 011331137754440 + */ +char *cons_mark_STR(char *cons, int len, int lower_only) { + rep_ele *reps, *elt, *tmp; + char *str; + + str = calloc(1, len); + reps = find_STR(cons, len, lower_only); + + DL_FOREACH_SAFE(reps, elt, tmp) { + int i, v = 0; + + //printf("%2d .. %2d %.*s\n", elt->start, elt->end, + // elt->end - elt->start+1, &cons[elt->start]); + + // What is there? + for (i = MAX(elt->start-1,0); i <= MIN(elt->end+1,len-1); i++) + v |= str[i]; + + for (i = 0; i < 8; i++) { + if (!(v&(1<start; i <= elt->end; i++) + str[i] |= v; + + DL_DELETE(reps, elt); + free(elt); + } + + return str; +} diff --git a/bcftools/str_finder.h b/bcftools/str_finder.h new file mode 100644 index 0000000..242f59e --- /dev/null +++ b/bcftools/str_finder.h @@ -0,0 +1,64 @@ +/* str_finder.c -- Short Tandem Repeat finder. + Originally from Crumble (https://github.com/jkbonfield/crumble) + + Copyright (C) 2015-2016, 2021 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef _STR_FINDER_H_ +#define _STR_FINDER_H_ + +#include "utlist.h" + +typedef struct rep_ele { + int start, end, rep_len; + struct rep_ele *prev; + struct rep_ele *next; +} rep_ele; + +/* + * Finds repeated homopolymers up to 8-mers. + * + * If lower_only is true then it only adds STRs for regions that + * contain at least one lower-case base. This can be used as a marker + * for looking for specific types of repeats. + * (One use for this is to only mark STRs that overlap a heterozygous + * indel region.) + * + * Returns a list of rep_ele structs holding the start,end tuples of repeats; + * NULL on failure. + */ +rep_ele *find_STR(char *cons, int len, int lower_only); + +/* + * Returns an array of STR vs no-STR values. + * 0 => non repetitive. + * 1+ => repeat with consecutive bit-number for repeat size. + * + * Eg: AGGGGAGGAGAAGAC + * 1111 1111 + * 2222222 + * 444444 + * => 011331137754440 + */ +char *cons_mark_STR(char *cons, int len, int lower_only); + +#endif /* _STR_FINDER_H_ */ diff --git a/bcftools/tabix.c b/bcftools/tabix.c new file mode 100644 index 0000000..639d954 --- /dev/null +++ b/bcftools/tabix.c @@ -0,0 +1,131 @@ +/* tabix.c -- tabix subcommand. + + Copyright (C) 2012 Broad Institute. + Copyright (C) 2013, 2016 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include + +int main_tabix(int argc, char *argv[]) +{ + int c, min_shift = -1, is_force = 0, is_all = 0, detect = 1; + tbx_conf_t conf = tbx_conf_gff; + while ((c = getopt(argc, argv, "0fap:s:b:e:S:c:m:")) >= 0) + if (c == '0') conf.preset |= TBX_UCSC; + else if (c == 'f') is_force = 1; + else if (c == 'a') is_all = 1; + else if (c == 'm') min_shift = atoi(optarg); + else if (c == 's') conf.sc = atoi(optarg); + else if (c == 'b') conf.bc = atoi(optarg); + else if (c == 'e') conf.ec = atoi(optarg); + else if (c == 'c') conf.meta_char = *optarg; + else if (c == 'S') conf.line_skip = atoi(optarg); + else if (c == 'p') { + if (strcmp(optarg, "gff") == 0) conf = tbx_conf_gff; + else if (strcmp(optarg, "bed") == 0) conf = tbx_conf_bed; + else if (strcmp(optarg, "sam") == 0) conf = tbx_conf_sam; + else if (strcmp(optarg, "vcf") == 0) conf = tbx_conf_vcf; + else { + fprintf(stderr, "The type '%s' not recognised\n", optarg); + return 1; + detect = 0; + } + + } + if (optind == argc) { + fprintf(stderr, "\nUsage: bcftools tabix [options] [reg1 [...]]\n\n"); + fprintf(stderr, "Options: -p STR preset: gff, bed, sam or vcf [gff]\n"); + fprintf(stderr, " -s INT column number for sequence names (suppressed by -p) [1]\n"); + fprintf(stderr, " -b INT column number for region start [4]\n"); + fprintf(stderr, " -e INT column number for region end (if no end, set INT to -b) [5]\n"); + fprintf(stderr, " -0 specify coordinates are zero-based\n"); + fprintf(stderr, " -S INT skip first INT lines [0]\n"); + fprintf(stderr, " -c CHAR skip lines starting with CHAR [null]\n"); + fprintf(stderr, " -a print all records\n"); + fprintf(stderr, " -f force to overwrite existing index\n"); + fprintf(stderr, " -m INT set the minimal interval size to 1<= 0) puts(s.s); + bgzf_close(fp); + free(s.s); + } else if (optind + 2 > argc) { // create index + if ( detect ) + { + // auto-detect file type by file name + int l = strlen(argv[optind]); + if (l>=7 && strcasecmp(argv[optind]+l-7, ".gff.gz") == 0) conf = tbx_conf_gff; + else if (l>=7 && strcasecmp(argv[optind]+l-7, ".bed.gz") == 0) conf = tbx_conf_bed; + else if (l>=7 && strcasecmp(argv[optind]+l-7, ".sam.gz") == 0) conf = tbx_conf_sam; + else if (l>=7 && strcasecmp(argv[optind]+l-7, ".vcf.gz") == 0) conf = tbx_conf_vcf; + } + + if (!is_force) { + char *fn; + FILE *fp; + fn = (char*)malloc(strlen(argv[optind]) + 5); + strcat(strcpy(fn, argv[optind]), min_shift <= 0? ".tbi" : ".csi"); + if ((fp = fopen(fn, "rb")) != 0) { + fclose(fp); + free(fn); + fprintf(stderr, "[E::%s] the index file exists; use option '-f' to overwrite\n", __func__); + return 1; + } + free(fn); + } + if ( tbx_index_build(argv[optind], min_shift, &conf) ) + { + fprintf(stderr,"tbx_index_build failed: Is the file bgzip-compressed? Was wrong -p [type] option used?\n"); + return 1; + } + } else { // read with random access + tbx_t *tbx; + BGZF *fp; + kstring_t s; + int i; + if ((tbx = tbx_index_load(argv[optind])) == 0) return 1; + if ((fp = bgzf_open(argv[optind], "r")) == 0) return 1; + s.s = 0; s.l = s.m = 0; + for (i = optind + 1; i < argc; ++i) { + hts_itr_t *itr; + if ((itr = tbx_itr_querys(tbx, argv[i])) == 0) continue; + while (tbx_bgzf_itr_next(fp, tbx, itr, &s) >= 0) puts(s.s); + tbx_itr_destroy(itr); + } + free(s.s); + bgzf_close(fp); + tbx_destroy(tbx); + } + return 0; +} diff --git a/bcftools/tabix.c.pysam.c b/bcftools/tabix.c.pysam.c new file mode 100644 index 0000000..4e51eaa --- /dev/null +++ b/bcftools/tabix.c.pysam.c @@ -0,0 +1,133 @@ +#include "bcftools.pysam.h" + +/* tabix.c -- tabix subcommand. + + Copyright (C) 2012 Broad Institute. + Copyright (C) 2013, 2016 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include + +int main_tabix(int argc, char *argv[]) +{ + int c, min_shift = -1, is_force = 0, is_all = 0, detect = 1; + tbx_conf_t conf = tbx_conf_gff; + while ((c = getopt(argc, argv, "0fap:s:b:e:S:c:m:")) >= 0) + if (c == '0') conf.preset |= TBX_UCSC; + else if (c == 'f') is_force = 1; + else if (c == 'a') is_all = 1; + else if (c == 'm') min_shift = atoi(optarg); + else if (c == 's') conf.sc = atoi(optarg); + else if (c == 'b') conf.bc = atoi(optarg); + else if (c == 'e') conf.ec = atoi(optarg); + else if (c == 'c') conf.meta_char = *optarg; + else if (c == 'S') conf.line_skip = atoi(optarg); + else if (c == 'p') { + if (strcmp(optarg, "gff") == 0) conf = tbx_conf_gff; + else if (strcmp(optarg, "bed") == 0) conf = tbx_conf_bed; + else if (strcmp(optarg, "sam") == 0) conf = tbx_conf_sam; + else if (strcmp(optarg, "vcf") == 0) conf = tbx_conf_vcf; + else { + fprintf(bcftools_stderr, "The type '%s' not recognised\n", optarg); + return 1; + detect = 0; + } + + } + if (optind == argc) { + fprintf(bcftools_stderr, "\nUsage: bcftools tabix [options] [reg1 [...]]\n\n"); + fprintf(bcftools_stderr, "Options: -p STR preset: gff, bed, sam or vcf [gff]\n"); + fprintf(bcftools_stderr, " -s INT column number for sequence names (suppressed by -p) [1]\n"); + fprintf(bcftools_stderr, " -b INT column number for region start [4]\n"); + fprintf(bcftools_stderr, " -e INT column number for region end (if no end, set INT to -b) [5]\n"); + fprintf(bcftools_stderr, " -0 specify coordinates are zero-based\n"); + fprintf(bcftools_stderr, " -S INT skip first INT lines [0]\n"); + fprintf(bcftools_stderr, " -c CHAR skip lines starting with CHAR [null]\n"); + fprintf(bcftools_stderr, " -a print all records\n"); + fprintf(bcftools_stderr, " -f force to overwrite existing index\n"); + fprintf(bcftools_stderr, " -m INT set the minimal interval size to 1<= 0) bcftools_puts(s.s); + bgzf_close(fp); + free(s.s); + } else if (optind + 2 > argc) { // create index + if ( detect ) + { + // auto-detect file type by file name + int l = strlen(argv[optind]); + if (l>=7 && strcasecmp(argv[optind]+l-7, ".gff.gz") == 0) conf = tbx_conf_gff; + else if (l>=7 && strcasecmp(argv[optind]+l-7, ".bed.gz") == 0) conf = tbx_conf_bed; + else if (l>=7 && strcasecmp(argv[optind]+l-7, ".sam.gz") == 0) conf = tbx_conf_sam; + else if (l>=7 && strcasecmp(argv[optind]+l-7, ".vcf.gz") == 0) conf = tbx_conf_vcf; + } + + if (!is_force) { + char *fn; + FILE *fp; + fn = (char*)malloc(strlen(argv[optind]) + 5); + strcat(strcpy(fn, argv[optind]), min_shift <= 0? ".tbi" : ".csi"); + if ((fp = fopen(fn, "rb")) != 0) { + fclose(fp); + free(fn); + fprintf(bcftools_stderr, "[E::%s] the index file exists; use option '-f' to overwrite\n", __func__); + return 1; + } + free(fn); + } + if ( tbx_index_build(argv[optind], min_shift, &conf) ) + { + fprintf(bcftools_stderr,"tbx_index_build failed: Is the file bgzip-compressed? Was wrong -p [type] option used?\n"); + return 1; + } + } else { // read with random access + tbx_t *tbx; + BGZF *fp; + kstring_t s; + int i; + if ((tbx = tbx_index_load(argv[optind])) == 0) return 1; + if ((fp = bgzf_open(argv[optind], "r")) == 0) return 1; + s.s = 0; s.l = s.m = 0; + for (i = optind + 1; i < argc; ++i) { + hts_itr_t *itr; + if ((itr = tbx_itr_querys(tbx, argv[i])) == 0) continue; + while (tbx_bgzf_itr_next(fp, tbx, itr, &s) >= 0) bcftools_puts(s.s); + tbx_itr_destroy(itr); + } + free(s.s); + bgzf_close(fp); + tbx_destroy(tbx); + } + return 0; +} diff --git a/bcftools/tsv2vcf.c b/bcftools/tsv2vcf.c new file mode 100644 index 0000000..596e75a --- /dev/null +++ b/bcftools/tsv2vcf.c @@ -0,0 +1,135 @@ +/* tsv2vcf.c -- convert from whitespace-separated fields to VCF + + Copyright (C) 2014-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include "tsv2vcf.h" + +tsv_t *tsv_init(const char *str) +{ + tsv_t *tsv = (tsv_t *) calloc(1,sizeof(tsv_t)); + kstring_t tmp = {0,0,0}; + const char *ss = str, *se = ss; + tsv->ncols = 0; + while ( *ss ) + { + if ( *se && *se!=',' ) { se++; continue; } + tsv->ncols++; + tsv->cols = (tsv_col_t*) realloc(tsv->cols,sizeof(tsv_col_t)*tsv->ncols); + tsv->cols[tsv->ncols-1].name = NULL; + tsv->cols[tsv->ncols-1].setter = NULL; + tmp.l = 0; + kputsn(ss, se-ss, &tmp); + if ( strcasecmp("-",tmp.s) ) + tsv->cols[tsv->ncols-1].name = strdup(tmp.s); + if ( !*se ) break; + ss = ++se; + } + free(tmp.s); + return tsv; +} + +void tsv_destroy(tsv_t *tsv) +{ + int i; + for (i=0; incols; i++) free(tsv->cols[i].name); + free(tsv->cols); + free(tsv); +} + +int tsv_register(tsv_t *tsv, const char *id, tsv_setter_t setter, void *usr) +{ + int i; + for (i=0; incols; i++) + { + if ( !tsv->cols[i].name || strcasecmp(tsv->cols[i].name,id) ) continue; + tsv->cols[i].setter = setter; + tsv->cols[i].usr = usr; + return 0; + } + return -1; +} + +int tsv_parse(tsv_t *tsv, bcf1_t *rec, char *str) +{ + int status = 0; + tsv->icol = 0; + tsv->ss = tsv->se = str; + while ( *tsv->ss && tsv->icol < tsv->ncols ) + { + while ( *tsv->se && !isspace(*tsv->se) ) tsv->se++; + if ( tsv->cols[tsv->icol].setter ) + { + int ret = tsv->cols[tsv->icol].setter(tsv,rec,tsv->cols[tsv->icol].usr); + if ( ret<0 ) return -1; + status++; + } + while ( *tsv->se && isspace(*tsv->se) ) tsv->se++; + tsv->ss = tsv->se; + tsv->icol++; + } + return status ? 0 : -1; +} + +int tsv_setter_chrom(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + char tmp = *tsv->se; + *tsv->se = 0; + rec->rid = bcf_hdr_name2id((bcf_hdr_t*)usr, tsv->ss); + *tsv->se = tmp; + return rec->rid==-1 ? -1 : 0; +} + +int tsv_setter_pos(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + char *endptr; + rec->pos = strtol(tsv->ss, &endptr, 10) - 1; + if ( tsv->ss==endptr ) return -1; + return 0; +} + +int tsv_setter_id(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + char tmp = *tsv->se; + *tsv->se = 0; + bcf_update_id((bcf_hdr_t*)usr, rec, tsv->ss); + *tsv->se = tmp; + return 0; +} + +int tsv_setter_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + bcf_hdr_t *hdr = (bcf_hdr_t*)usr; + char *sb = tsv->ss; + while ( *sb && !isspace(*sb) ) sb++; + if ( !*sb ) return -1; + char tmp = *sb; + *sb = ','; + bcf_update_alleles_str(hdr, rec, tsv->ss); + *sb = tmp; + return 0; +} + + diff --git a/bcftools/tsv2vcf.c.pysam.c b/bcftools/tsv2vcf.c.pysam.c new file mode 100644 index 0000000..8c62157 --- /dev/null +++ b/bcftools/tsv2vcf.c.pysam.c @@ -0,0 +1,137 @@ +#include "bcftools.pysam.h" + +/* tsv2vcf.c -- convert from whitespace-separated fields to VCF + + Copyright (C) 2014-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include "tsv2vcf.h" + +tsv_t *tsv_init(const char *str) +{ + tsv_t *tsv = (tsv_t *) calloc(1,sizeof(tsv_t)); + kstring_t tmp = {0,0,0}; + const char *ss = str, *se = ss; + tsv->ncols = 0; + while ( *ss ) + { + if ( *se && *se!=',' ) { se++; continue; } + tsv->ncols++; + tsv->cols = (tsv_col_t*) realloc(tsv->cols,sizeof(tsv_col_t)*tsv->ncols); + tsv->cols[tsv->ncols-1].name = NULL; + tsv->cols[tsv->ncols-1].setter = NULL; + tmp.l = 0; + kputsn(ss, se-ss, &tmp); + if ( strcasecmp("-",tmp.s) ) + tsv->cols[tsv->ncols-1].name = strdup(tmp.s); + if ( !*se ) break; + ss = ++se; + } + free(tmp.s); + return tsv; +} + +void tsv_destroy(tsv_t *tsv) +{ + int i; + for (i=0; incols; i++) free(tsv->cols[i].name); + free(tsv->cols); + free(tsv); +} + +int tsv_register(tsv_t *tsv, const char *id, tsv_setter_t setter, void *usr) +{ + int i; + for (i=0; incols; i++) + { + if ( !tsv->cols[i].name || strcasecmp(tsv->cols[i].name,id) ) continue; + tsv->cols[i].setter = setter; + tsv->cols[i].usr = usr; + return 0; + } + return -1; +} + +int tsv_parse(tsv_t *tsv, bcf1_t *rec, char *str) +{ + int status = 0; + tsv->icol = 0; + tsv->ss = tsv->se = str; + while ( *tsv->ss && tsv->icol < tsv->ncols ) + { + while ( *tsv->se && !isspace(*tsv->se) ) tsv->se++; + if ( tsv->cols[tsv->icol].setter ) + { + int ret = tsv->cols[tsv->icol].setter(tsv,rec,tsv->cols[tsv->icol].usr); + if ( ret<0 ) return -1; + status++; + } + while ( *tsv->se && isspace(*tsv->se) ) tsv->se++; + tsv->ss = tsv->se; + tsv->icol++; + } + return status ? 0 : -1; +} + +int tsv_setter_chrom(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + char tmp = *tsv->se; + *tsv->se = 0; + rec->rid = bcf_hdr_name2id((bcf_hdr_t*)usr, tsv->ss); + *tsv->se = tmp; + return rec->rid==-1 ? -1 : 0; +} + +int tsv_setter_pos(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + char *endptr; + rec->pos = strtol(tsv->ss, &endptr, 10) - 1; + if ( tsv->ss==endptr ) return -1; + return 0; +} + +int tsv_setter_id(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + char tmp = *tsv->se; + *tsv->se = 0; + bcf_update_id((bcf_hdr_t*)usr, rec, tsv->ss); + *tsv->se = tmp; + return 0; +} + +int tsv_setter_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + bcf_hdr_t *hdr = (bcf_hdr_t*)usr; + char *sb = tsv->ss; + while ( *sb && !isspace(*sb) ) sb++; + if ( !*sb ) return -1; + char tmp = *sb; + *sb = ','; + bcf_update_alleles_str(hdr, rec, tsv->ss); + *sb = tmp; + return 0; +} + + diff --git a/bcftools/tsv2vcf.h b/bcftools/tsv2vcf.h new file mode 100644 index 0000000..68757d4 --- /dev/null +++ b/bcftools/tsv2vcf.h @@ -0,0 +1,86 @@ +/* tsv2vcf.h -- convert from whitespace-separated fields to VCF + + Copyright (C) 2014-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef __TSV2VCF_H__ +#define __TSV2VCF_H__ + +#include + +typedef struct _tsv_t tsv_t; +typedef int (*tsv_setter_t)(tsv_t *, bcf1_t *, void *); + +typedef struct +{ + char *name; + tsv_setter_t setter; + void *usr; +} +tsv_col_t; + +struct _tsv_t +{ + int ncols, icol; + tsv_col_t *cols; + char *se, *ss; +}; + +tsv_t *tsv_init(const char *str); +void tsv_destroy(tsv_t *tsv); +int tsv_register(tsv_t *tsv, const char *id, tsv_setter_t setter, void *usr); + +/** + * tsv_parse() - parse tsv line and fill VCF record + * Returns 0 on success or -1 on parse error + */ +int tsv_parse(tsv_t *tsv, bcf1_t *rec, char *str); + +/** + * tstv_next() - position ss,se to next field; first pass with ss=se=str + * Returns 0 on success, or -1 if no more fields + */ +static inline int tsv_next(tsv_t *tsv) +{ + if ( !*tsv->se ) return -1; + if ( tsv->ss==tsv->se ) + { + while ( *tsv->se && !isspace(*tsv->se) ) tsv->se++; + return 0; + } + while ( *tsv->se && isspace(*tsv->se) ) tsv->se++; + tsv->ss = tsv->se; + while ( *tsv->se && !isspace(*tsv->se) ) tsv->se++; + return 0; +} + +/** + * The setters return 0 on success or negative value if the line is to be skipped. + */ +int tsv_setter_chrom(tsv_t *tsv, bcf1_t *rec, void *usr); +int tsv_setter_pos(tsv_t *tsv, bcf1_t *rec, void *usr); +int tsv_setter_id(tsv_t *tsv, bcf1_t *rec, void *usr); +int tsv_setter_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr); // usr must point to bcf_hdr_t + +#endif + diff --git a/bcftools/utlist.h b/bcftools/utlist.h new file mode 100644 index 0000000..28cf8a3 --- /dev/null +++ b/bcftools/utlist.h @@ -0,0 +1,761 @@ +/* +Copyright (c) 2007-2014, Troy D. Hanson http://troydhanson.github.com/uthash/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef UTLIST_H +#define UTLIST_H + +#define UTLIST_VERSION 1.9.9 + +#include + +/* + * This file contains macros to manipulate singly and doubly-linked lists. + * + * 1. LL_ macros: singly-linked lists. + * 2. DL_ macros: doubly-linked lists. + * 3. CDL_ macros: circular doubly-linked lists. + * + * To use singly-linked lists, your structure must have a "next" pointer. + * To use doubly-linked lists, your structure must "prev" and "next" pointers. + * Either way, the pointer to the head of the list must be initialized to NULL. + * + * ----------------.EXAMPLE ------------------------- + * struct item { + * int id; + * struct item *prev, *next; + * } + * + * struct item *list = NULL: + * + * int main() { + * struct item *item; + * ... allocate and populate item ... + * DL_APPEND(list, item); + * } + * -------------------------------------------------- + * + * For doubly-linked lists, the append and delete macros are O(1) + * For singly-linked lists, append and delete are O(n) but prepend is O(1) + * The sort macro is O(n log(n)) for all types of single/double/circular lists. + */ + +/* These macros use decltype or the earlier __typeof GNU extension. + As decltype is only available in newer compilers (VS2010 or gcc 4.3+ + when compiling c++ code), this code uses whatever method is needed + or, for VS2008 where neither is available, uses casting workarounds. */ +#ifdef _MSC_VER /* MS compiler */ +#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ +#define LDECLTYPE(x) decltype(x) +#else /* VS2008 or older (or VS2010 in C mode) */ +#define NO_DECLTYPE +#define LDECLTYPE(x) char* +#endif +#elif defined(__ICCARM__) +#define NO_DECLTYPE +#define LDECLTYPE(x) char* +#else /* GNU, Sun and other compilers */ +#define LDECLTYPE(x) __typeof(x) +#endif + +/* for VS2008 we use some workarounds to get around the lack of decltype, + * namely, we always reassign our tmp variable to the list head if we need + * to dereference its prev/next pointers, and save/restore the real head.*/ +#ifdef NO_DECLTYPE +#define _SV(elt,list) _tmp = (char*)(list); {char **_alias = (char**)&(list); *_alias = (elt); } +#define _NEXT(elt,list,next) ((char*)((list)->next)) +#define _NEXTASGN(elt,list,to,next) { char **_alias = (char**)&((list)->next); *_alias=(char*)(to); } +/* #define _PREV(elt,list,prev) ((char*)((list)->prev)) */ +#define _PREVASGN(elt,list,to,prev) { char **_alias = (char**)&((list)->prev); *_alias=(char*)(to); } +#define _RS(list) { char **_alias = (char**)&(list); *_alias=_tmp; } +#define _CASTASGN(a,b) { char **_alias = (char**)&(a); *_alias=(char*)(b); } +#else +#define _SV(elt,list) +#define _NEXT(elt,list,next) ((elt)->next) +#define _NEXTASGN(elt,list,to,next) ((elt)->next)=(to) +/* #define _PREV(elt,list,prev) ((elt)->prev) */ +#define _PREVASGN(elt,list,to,prev) ((elt)->prev)=(to) +#define _RS(list) +#define _CASTASGN(a,b) (a)=(b) +#endif + +/****************************************************************************** + * The sort macro is an adaptation of Simon Tatham's O(n log(n)) mergesort * + * Unwieldy variable names used here to avoid shadowing passed-in variables. * + *****************************************************************************/ +#define LL_SORT(list, cmp) \ + LL_SORT2(list, cmp, next) + +#define LL_SORT2(list, cmp, next) \ +do { \ + LDECLTYPE(list) _ls_p; \ + LDECLTYPE(list) _ls_q; \ + LDECLTYPE(list) _ls_e; \ + LDECLTYPE(list) _ls_tail; \ + int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ + if (list) { \ + _ls_insize = 1; \ + _ls_looping = 1; \ + while (_ls_looping) { \ + _CASTASGN(_ls_p,list); \ + list = NULL; \ + _ls_tail = NULL; \ + _ls_nmerges = 0; \ + while (_ls_p) { \ + _ls_nmerges++; \ + _ls_q = _ls_p; \ + _ls_psize = 0; \ + for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ + _ls_psize++; \ + _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list,next); _RS(list); \ + if (!_ls_q) break; \ + } \ + _ls_qsize = _ls_insize; \ + while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ + if (_ls_psize == 0) { \ + _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = \ + _NEXT(_ls_q,list,next); _RS(list); _ls_qsize--; \ + } else if (_ls_qsize == 0 || !_ls_q) { \ + _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = \ + _NEXT(_ls_p,list,next); _RS(list); _ls_psize--; \ + } else if (cmp(_ls_p,_ls_q) <= 0) { \ + _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = \ + _NEXT(_ls_p,list,next); _RS(list); _ls_psize--; \ + } else { \ + _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = \ + _NEXT(_ls_q,list,next); _RS(list); _ls_qsize--; \ + } \ + if (_ls_tail) { \ + _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,_ls_e,next); _RS(list); \ + } else { \ + _CASTASGN(list,_ls_e); \ + } \ + _ls_tail = _ls_e; \ + } \ + _ls_p = _ls_q; \ + } \ + if (_ls_tail) { \ + _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,NULL,next); _RS(list); \ + } \ + if (_ls_nmerges <= 1) { \ + _ls_looping=0; \ + } \ + _ls_insize *= 2; \ + } \ + } \ +} while (0) + + +#define DL_SORT(list, cmp) \ + DL_SORT2(list, cmp, prev, next) + +#define DL_SORT2(list, cmp, prev, next) \ +do { \ + LDECLTYPE(list) _ls_p; \ + LDECLTYPE(list) _ls_q; \ + LDECLTYPE(list) _ls_e; \ + LDECLTYPE(list) _ls_tail; \ + int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ + if (list) { \ + _ls_insize = 1; \ + _ls_looping = 1; \ + while (_ls_looping) { \ + _CASTASGN(_ls_p,list); \ + list = NULL; \ + _ls_tail = NULL; \ + _ls_nmerges = 0; \ + while (_ls_p) { \ + _ls_nmerges++; \ + _ls_q = _ls_p; \ + _ls_psize = 0; \ + for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ + _ls_psize++; \ + _SV(_ls_q,list); _ls_q = _NEXT(_ls_q,list,next); _RS(list); \ + if (!_ls_q) break; \ + } \ + _ls_qsize = _ls_insize; \ + while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ + if (_ls_psize == 0) { \ + _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = \ + _NEXT(_ls_q,list,next); _RS(list); _ls_qsize--; \ + } else if (_ls_qsize == 0 || !_ls_q) { \ + _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = \ + _NEXT(_ls_p,list,next); _RS(list); _ls_psize--; \ + } else if (cmp(_ls_p,_ls_q) <= 0) { \ + _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = \ + _NEXT(_ls_p,list,next); _RS(list); _ls_psize--; \ + } else { \ + _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = \ + _NEXT(_ls_q,list,next); _RS(list); _ls_qsize--; \ + } \ + if (_ls_tail) { \ + _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,_ls_e,next); _RS(list); \ + } else { \ + _CASTASGN(list,_ls_e); \ + } \ + _SV(_ls_e,list); _PREVASGN(_ls_e,list,_ls_tail,prev); _RS(list); \ + _ls_tail = _ls_e; \ + } \ + _ls_p = _ls_q; \ + } \ + _CASTASGN(list->prev, _ls_tail); \ + _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,NULL,next); _RS(list); \ + if (_ls_nmerges <= 1) { \ + _ls_looping=0; \ + } \ + _ls_insize *= 2; \ + } \ + } \ +} while (0) + + +#define DL_HEAD(list) (list) +#define DL_TAIL(list) ((list) ? (list)->prev : NULL) + +#define CDL_SORT(list, cmp) \ + CDL_SORT2(list, cmp, prev, next) + +#define CDL_SORT2(list, cmp, prev, next) \ +do { \ + LDECLTYPE(list) _ls_p; \ + LDECLTYPE(list) _ls_q; \ + LDECLTYPE(list) _ls_e; \ + LDECLTYPE(list) _ls_tail; \ + LDECLTYPE(list) _ls_oldhead; \ + LDECLTYPE(list) _tmp; \ + int _ls_insize, _ls_nmerges, _ls_psize, _ls_qsize, _ls_i, _ls_looping; \ + if (list) { \ + _ls_insize = 1; \ + _ls_looping = 1; \ + while (_ls_looping) { \ + _CASTASGN(_ls_p,list); \ + _CASTASGN(_ls_oldhead,list); \ + list = NULL; \ + _ls_tail = NULL; \ + _ls_nmerges = 0; \ + while (_ls_p) { \ + _ls_nmerges++; \ + _ls_q = _ls_p; \ + _ls_psize = 0; \ + for (_ls_i = 0; _ls_i < _ls_insize; _ls_i++) { \ + _ls_psize++; \ + _SV(_ls_q,list); \ + if (_NEXT(_ls_q,list,next) == _ls_oldhead) { \ + _ls_q = NULL; \ + } else { \ + _ls_q = _NEXT(_ls_q,list,next); \ + } \ + _RS(list); \ + if (!_ls_q) break; \ + } \ + _ls_qsize = _ls_insize; \ + while (_ls_psize > 0 || (_ls_qsize > 0 && _ls_q)) { \ + if (_ls_psize == 0) { \ + _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = \ + _NEXT(_ls_q,list,next); _RS(list); _ls_qsize--; \ + if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \ + } else if (_ls_qsize == 0 || !_ls_q) { \ + _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = \ + _NEXT(_ls_p,list,next); _RS(list); _ls_psize--; \ + if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \ + } else if (cmp(_ls_p,_ls_q) <= 0) { \ + _ls_e = _ls_p; _SV(_ls_p,list); _ls_p = \ + _NEXT(_ls_p,list,next); _RS(list); _ls_psize--; \ + if (_ls_p == _ls_oldhead) { _ls_p = NULL; } \ + } else { \ + _ls_e = _ls_q; _SV(_ls_q,list); _ls_q = \ + _NEXT(_ls_q,list,next); _RS(list); _ls_qsize--; \ + if (_ls_q == _ls_oldhead) { _ls_q = NULL; } \ + } \ + if (_ls_tail) { \ + _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,_ls_e,next); _RS(list); \ + } else { \ + _CASTASGN(list,_ls_e); \ + } \ + _SV(_ls_e,list); _PREVASGN(_ls_e,list,_ls_tail,prev); _RS(list); \ + _ls_tail = _ls_e; \ + } \ + _ls_p = _ls_q; \ + } \ + _CASTASGN(list->prev,_ls_tail); \ + _CASTASGN(_tmp,list); \ + _SV(_ls_tail,list); _NEXTASGN(_ls_tail,list,_tmp,next); _RS(list); \ + if (_ls_nmerges <= 1) { \ + _ls_looping=0; \ + } \ + _ls_insize *= 2; \ + } \ + } \ +} while (0) + +/****************************************************************************** + * singly linked list macros (non-circular) * + *****************************************************************************/ +#define LL_PREPEND(head,add) \ + LL_PREPEND2(head,add,next) + +#define LL_PREPEND2(head,add,next) \ +do { \ + (add)->next = head; \ + head = add; \ +} while (0) + +#define LL_CONCAT(head1,head2) \ + LL_CONCAT2(head1,head2,next) + +#define LL_CONCAT2(head1,head2,next) \ +do { \ + LDECLTYPE(head1) _tmp; \ + if (head1) { \ + _tmp = head1; \ + while (_tmp->next) { _tmp = _tmp->next; } \ + _tmp->next=(head2); \ + } else { \ + (head1)=(head2); \ + } \ +} while (0) + +#define LL_APPEND(head,add) \ + LL_APPEND2(head,add,next) + +#define LL_APPEND2(head,add,next) \ +do { \ + LDECLTYPE(head) _tmp; \ + (add)->next=NULL; \ + if (head) { \ + _tmp = head; \ + while (_tmp->next) { _tmp = _tmp->next; } \ + _tmp->next=(add); \ + } else { \ + (head)=(add); \ + } \ +} while (0) + +#define LL_DELETE(head,del) \ + LL_DELETE2(head,del,next) + +#define LL_DELETE2(head,del,next) \ +do { \ + LDECLTYPE(head) _tmp; \ + if ((head) == (del)) { \ + (head)=(head)->next; \ + } else { \ + _tmp = head; \ + while (_tmp->next && (_tmp->next != (del))) { \ + _tmp = _tmp->next; \ + } \ + if (_tmp->next) { \ + _tmp->next = ((del)->next); \ + } \ + } \ +} while (0) + +/* Here are VS2008 replacements for LL_APPEND and LL_DELETE */ +#define LL_APPEND_VS2008(head,add) \ + LL_APPEND2_VS2008(head,add,next) + +#define LL_APPEND2_VS2008(head,add,next) \ +do { \ + if (head) { \ + (add)->next = head; /* use add->next as a temp variable */ \ + while ((add)->next->next) { (add)->next = (add)->next->next; } \ + (add)->next->next=(add); \ + } else { \ + (head)=(add); \ + } \ + (add)->next=NULL; \ +} while (0) + +#define LL_DELETE_VS2008(head,del) \ + LL_DELETE2_VS2008(head,del,next) + +#define LL_DELETE2_VS2008(head,del,next) \ +do { \ + if ((head) == (del)) { \ + (head)=(head)->next; \ + } else { \ + char *_tmp = (char*)(head); \ + while ((head)->next && ((head)->next != (del))) { \ + head = (head)->next; \ + } \ + if ((head)->next) { \ + (head)->next = ((del)->next); \ + } \ + { \ + char **_head_alias = (char**)&(head); \ + *_head_alias = _tmp; \ + } \ + } \ +} while (0) +#ifdef NO_DECLTYPE +#undef LL_APPEND +#define LL_APPEND LL_APPEND_VS2008 +#undef LL_DELETE +#define LL_DELETE LL_DELETE_VS2008 +#undef LL_DELETE2 +#define LL_DELETE2 LL_DELETE2_VS2008 +#undef LL_APPEND2 +#define LL_APPEND2 LL_APPEND2_VS2008 +#undef LL_CONCAT /* no LL_CONCAT_VS2008 */ +#undef DL_CONCAT /* no DL_CONCAT_VS2008 */ +#endif +/* end VS2008 replacements */ + +#define LL_COUNT(head,el,counter) \ + LL_COUNT2(head,el,counter,next) \ + +#define LL_COUNT2(head,el,counter,next) \ +{ \ + counter = 0; \ + LL_FOREACH2(head,el,next){ ++counter; } \ +} + +#define LL_FOREACH(head,el) \ + LL_FOREACH2(head,el,next) + +#define LL_FOREACH2(head,el,next) \ + for(el=head;el;el=(el)->next) + +#define LL_FOREACH_SAFE(head,el,tmp) \ + LL_FOREACH_SAFE2(head,el,tmp,next) + +#define LL_FOREACH_SAFE2(head,el,tmp,next) \ + for((el)=(head);(el) && (tmp = (el)->next, 1); (el) = tmp) + +#define LL_SEARCH_SCALAR(head,out,field,val) \ + LL_SEARCH_SCALAR2(head,out,field,val,next) + +#define LL_SEARCH_SCALAR2(head,out,field,val,next) \ +do { \ + LL_FOREACH2(head,out,next) { \ + if ((out)->field == (val)) break; \ + } \ +} while(0) + +#define LL_SEARCH(head,out,elt,cmp) \ + LL_SEARCH2(head,out,elt,cmp,next) + +#define LL_SEARCH2(head,out,elt,cmp,next) \ +do { \ + LL_FOREACH2(head,out,next) { \ + if ((cmp(out,elt))==0) break; \ + } \ +} while(0) + +#define LL_REPLACE_ELEM(head, el, add) \ +do { \ + LDECLTYPE(head) _tmp; \ + assert(head != NULL); \ + assert(el != NULL); \ + assert(add != NULL); \ + (add)->next = (el)->next; \ + if ((head) == (el)) { \ + (head) = (add); \ + } else { \ + _tmp = head; \ + while (_tmp->next && (_tmp->next != (el))) { \ + _tmp = _tmp->next; \ + } \ + if (_tmp->next) { \ + _tmp->next = (add); \ + } \ + } \ +} while (0) + +#define LL_PREPEND_ELEM(head, el, add) \ +do { \ + LDECLTYPE(head) _tmp; \ + assert(head != NULL); \ + assert(el != NULL); \ + assert(add != NULL); \ + (add)->next = (el); \ + if ((head) == (el)) { \ + (head) = (add); \ + } else { \ + _tmp = head; \ + while (_tmp->next && (_tmp->next != (el))) { \ + _tmp = _tmp->next; \ + } \ + if (_tmp->next) { \ + _tmp->next = (add); \ + } \ + } \ +} while (0) \ + + +/****************************************************************************** + * doubly linked list macros (non-circular) * + *****************************************************************************/ +#define DL_PREPEND(head,add) \ + DL_PREPEND2(head,add,prev,next) + +#define DL_PREPEND2(head,add,prev,next) \ +do { \ + (add)->next = head; \ + if (head) { \ + (add)->prev = (head)->prev; \ + (head)->prev = (add); \ + } else { \ + (add)->prev = (add); \ + } \ + (head) = (add); \ +} while (0) + +#define DL_APPEND(head,add) \ + DL_APPEND2(head,add,prev,next) + +#define DL_APPEND2(head,add,prev,next) \ +do { \ + if (head) { \ + (add)->prev = (head)->prev; \ + (head)->prev->next = (add); \ + (head)->prev = (add); \ + (add)->next = NULL; \ + } else { \ + (head)=(add); \ + (head)->prev = (head); \ + (head)->next = NULL; \ + } \ +} while (0) + +#define DL_CONCAT(head1,head2) \ + DL_CONCAT2(head1,head2,prev,next) + +#define DL_CONCAT2(head1,head2,prev,next) \ +do { \ + LDECLTYPE(head1) _tmp; \ + if (head2) { \ + if (head1) { \ + _tmp = (head2)->prev; \ + (head2)->prev = (head1)->prev; \ + (head1)->prev->next = (head2); \ + (head1)->prev = _tmp; \ + } else { \ + (head1)=(head2); \ + } \ + } \ +} while (0) + +#define DL_DELETE(head,del) \ + DL_DELETE2(head,del,prev,next) + +#define DL_DELETE2(head,del,prev,next) \ +do { \ + assert((del)->prev != NULL); \ + if ((del)->prev == (del)) { \ + (head)=NULL; \ + } else if ((del)==(head)) { \ + (del)->next->prev = (del)->prev; \ + (head) = (del)->next; \ + } else { \ + (del)->prev->next = (del)->next; \ + if ((del)->next) { \ + (del)->next->prev = (del)->prev; \ + } else { \ + (head)->prev = (del)->prev; \ + } \ + } \ +} while (0) + +#define DL_COUNT(head,el,counter) \ + DL_COUNT2(head,el,counter,next) \ + +#define DL_COUNT2(head,el,counter,next) \ +{ \ + counter = 0; \ + DL_FOREACH2(head,el,next){ ++counter; } \ +} + +#define DL_FOREACH(head,el) \ + DL_FOREACH2(head,el,next) + +#define DL_FOREACH2(head,el,next) \ + for(el=head;el;el=(el)->next) + +/* this version is safe for deleting the elements during iteration */ +#define DL_FOREACH_SAFE(head,el,tmp) \ + DL_FOREACH_SAFE2(head,el,tmp,next) + +#define DL_FOREACH_SAFE2(head,el,tmp,next) \ + for((el)=(head);(el) && (tmp = (el)->next, 1); (el) = tmp) + +/* these are identical to their singly-linked list counterparts */ +#define DL_SEARCH_SCALAR LL_SEARCH_SCALAR +#define DL_SEARCH LL_SEARCH +#define DL_SEARCH_SCALAR2 LL_SEARCH_SCALAR2 +#define DL_SEARCH2 LL_SEARCH2 + +#define DL_REPLACE_ELEM(head, el, add) \ +do { \ + assert(head != NULL); \ + assert(el != NULL); \ + assert(add != NULL); \ + if ((head) == (el)) { \ + (head) = (add); \ + (add)->next = (el)->next; \ + if ((el)->next == NULL) { \ + (add)->prev = (add); \ + } else { \ + (add)->prev = (el)->prev; \ + (add)->next->prev = (add); \ + } \ + } else { \ + (add)->next = (el)->next; \ + (add)->prev = (el)->prev; \ + (add)->prev->next = (add); \ + if ((el)->next == NULL) { \ + (head)->prev = (add); \ + } else { \ + (add)->next->prev = (add); \ + } \ + } \ +} while (0) + +#define DL_PREPEND_ELEM(head, el, add) \ +do { \ + assert(head != NULL); \ + assert(el != NULL); \ + assert(add != NULL); \ + (add)->next = (el); \ + (add)->prev = (el)->prev; \ + (el)->prev = (add); \ + if ((head) == (el)) { \ + (head) = (add); \ + } else { \ + (add)->prev->next = (add); \ + } \ +} while (0) \ + + +/****************************************************************************** + * circular doubly linked list macros * + *****************************************************************************/ +#define CDL_PREPEND(head,add) \ + CDL_PREPEND2(head,add,prev,next) + +#define CDL_PREPEND2(head,add,prev,next) \ +do { \ + if (head) { \ + (add)->prev = (head)->prev; \ + (add)->next = (head); \ + (head)->prev = (add); \ + (add)->prev->next = (add); \ + } else { \ + (add)->prev = (add); \ + (add)->next = (add); \ + } \ +(head)=(add); \ +} while (0) + +#define CDL_DELETE(head,del) \ + CDL_DELETE2(head,del,prev,next) + +#define CDL_DELETE2(head,del,prev,next) \ +do { \ + if ( ((head)==(del)) && ((head)->next == (head))) { \ + (head) = 0L; \ + } else { \ + (del)->next->prev = (del)->prev; \ + (del)->prev->next = (del)->next; \ + if ((del) == (head)) (head)=(del)->next; \ + } \ +} while (0) + +#define CDL_COUNT(head,el,counter) \ + CDL_COUNT2(head,el,counter,next) \ + +#define CDL_COUNT2(head, el, counter,next) \ +{ \ + counter = 0; \ + CDL_FOREACH2(head,el,next){ ++counter; } \ +} + +#define CDL_FOREACH(head,el) \ + CDL_FOREACH2(head,el,next) + +#define CDL_FOREACH2(head,el,next) \ + for(el=head;el;el=((el)->next==head ? 0L : (el)->next)) + +#define CDL_FOREACH_SAFE(head,el,tmp1,tmp2) \ + CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) + +#define CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) \ + for((el)=(head), ((tmp1)=(head)?((head)->prev):NULL); \ + (el) && ((tmp2)=(el)->next, 1); \ + ((el) = (((el)==(tmp1)) ? 0L : (tmp2)))) + +#define CDL_SEARCH_SCALAR(head,out,field,val) \ + CDL_SEARCH_SCALAR2(head,out,field,val,next) + +#define CDL_SEARCH_SCALAR2(head,out,field,val,next) \ +do { \ + CDL_FOREACH2(head,out,next) { \ + if ((out)->field == (val)) break; \ + } \ +} while(0) + +#define CDL_SEARCH(head,out,elt,cmp) \ + CDL_SEARCH2(head,out,elt,cmp,next) + +#define CDL_SEARCH2(head,out,elt,cmp,next) \ +do { \ + CDL_FOREACH2(head,out,next) { \ + if ((cmp(out,elt))==0) break; \ + } \ +} while(0) + +#define CDL_REPLACE_ELEM(head, el, add) \ +do { \ + assert(head != NULL); \ + assert(el != NULL); \ + assert(add != NULL); \ + if ((el)->next == (el)) { \ + (add)->next = (add); \ + (add)->prev = (add); \ + (head) = (add); \ + } else { \ + (add)->next = (el)->next; \ + (add)->prev = (el)->prev; \ + (add)->next->prev = (add); \ + (add)->prev->next = (add); \ + if ((head) == (el)) { \ + (head) = (add); \ + } \ + } \ +} while (0) + +#define CDL_PREPEND_ELEM(head, el, add) \ +do { \ + assert(head != NULL); \ + assert(el != NULL); \ + assert(add != NULL); \ + (add)->next = (el); \ + (add)->prev = (el)->prev; \ + (el)->prev = (add); \ + (add)->prev->next = (add); \ + if ((head) == (el)) { \ + (head) = (add); \ + } \ +} while (0) \ + +#endif /* UTLIST_H */ + diff --git a/bcftools/variantkey.h b/bcftools/variantkey.h new file mode 100644 index 0000000..ccd4d8d --- /dev/null +++ b/bcftools/variantkey.h @@ -0,0 +1,583 @@ +// VariantKey +// +// variantkey.h +// +// @category Libraries +// @author Nicola Asuni +// @copyright 2017-2018 GENOMICS plc +// @license MIT (see LICENSE) +// @link https://github.com/genomicsplc/variantkey +// +// LICENSE +// +// Copyright (c) 2017-2018 GENOMICS plc +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/** + * @file variantkey.h + * @brief VariantKey main functions. + * + * The functions provided here allows to generate and process a 64 bit Unsigned Integer Keys for Human Genetic Variants. + * The VariantKey is sortable for chromosome and position, + * and it is also fully reversible for variants with up to 11 bases between Reference and Alternate alleles. + * It can be used to sort, search and match variant-based data easily and very quickly. + */ + +#ifndef VARIANTKEY_H +#define VARIANTKEY_H + +#include +#include +#include +#include "hex.h" + +#define VKMASK_CHROM 0xF800000000000000 //!< VariantKey binary mask for CHROM [ 11111000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 ] +#define VKMASK_POS 0x07FFFFFF80000000 //!< VariantKey binary mask for POS [ 00000111 11111111 11111111 11111111 10000000 00000000 00000000 00000000 ] +#define VKMASK_CHROMPOS 0xFFFFFFFF80000000 //!< VariantKey binary mask for CHROM+POS [ 11111111 11111111 11111111 11111111 10000000 00000000 00000000 00000000 ] +#define VKMASK_REFALT 0x000000007FFFFFFF //!< VariantKey binary mask for REF+ALT [ 00000000 00000000 00000000 00000000 01111111 11111111 11111111 11111111 ] +#define VKSHIFT_CHROM 59 //!< CHROM LSB position from the VariantKey LSB +#define VKSHIFT_POS 31 //!< POS LSB position from the VariantKey LSB + +/** + * VariantKey struct. + * Contains the numerically encoded VariantKey components (CHROM, POS, REF+ALT). + */ +typedef struct variantkey_t +{ + uint8_t chrom; //!< Chromosome encoded number (only the LSB 5 bit are used) + uint32_t pos; //!< Reference position, with the first base having position 0 (only the LSB 28 bit are used) + uint32_t refalt; //!< Code for Reference and Alternate allele (only the LSB 31 bits are used) +} variantkey_t; + +/** + * Struct containing the minimum and maximum VariantKey values for range searches. + */ +typedef struct vkrange_t +{ + uint64_t min; //!< Minimum VariantKey value for any given REF+ALT encoding + uint64_t max; //!< Maximum VariantKey value for any given REF+ALT encoding +} vkrange_t; + +/** @brief Returns chromosome numerical encoding. + * + * @param chrom Chromosome. An identifier from the reference genome, no white-space permitted. + * @param size Length of the chrom string, excluding the terminating null byte. + * + * @return CHROM code + */ +static inline uint8_t encode_chrom(const char *chrom, size_t size) +{ + // X > 23 ; Y > 24 ; M > 25 + static const uint8_t onecharmap[] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* M X Y */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,23,24, 0, 0, 0, 0, 0, 0, + /* m x y */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,23,24, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + // remove "chr" prefix + if ((size > 3) + && ((chrom[0] == 'c') || (chrom[0] == 'C')) + && ((chrom[1] == 'h') || (chrom[1] == 'H')) + && ((chrom[2] == 'r') || (chrom[2] == 'R'))) + { + chrom += 3; + size -= 3; + } + if (size == 0) + { + return 0; + } + if ((chrom[0] <= '9') && (chrom[0] >= '0')) // Number + { + size_t i; + uint8_t v = (chrom[0] - '0'); + for (i = 1; i < size; i++) + { + if ((chrom[i] > '9') || (chrom[i] < '0')) + { + return 0; // NA + } + v = ((v * 10) + (chrom[i] - '0')); + } + return v; + } + if ((size == 1) || ((size == 2) && ((chrom[1] == 'T') || (chrom[1] == 't')))) + { + return onecharmap[((uint8_t)chrom[0])]; + } + return 0; // NA +} + +/** @brief Decode the chromosome numerical code. + * + * @param code CHROM code. + * @param chrom CHROM string buffer to be returned. Its size should be enough to contain the results (max 4 bytes). + * + * @return If successful, the total number of characters written is returned, + * excluding the null-character appended at the end of the string, + * otherwise a negative number is returned in case of failure. + */ +static inline size_t decode_chrom(uint8_t code, char *chrom) +{ + if ((code < 1) || (code > 25)) + { + return sprintf(chrom, "NA"); + } + if (code < 23) + { + return sprintf(chrom, "%" PRIu8, code); + } + static const char *map[] = {"X", "Y", "MT"}; + return sprintf(chrom, "%s", map[(code - 23)]); +} + +static inline uint32_t encode_base(const uint8_t c) +{ + /* + Encode base: + A > 0 + C > 1 + G > 2 + T > 3 + */ + static const uint32_t map[] = + { + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + /*A C G T*/ + 4,0,4,1,4,4,4,2,4,4,4,4,4,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4,4, + /*a c g t*/ + 4,0,4,1,4,4,4,2,4,4,4,4,4,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + }; + return map[c]; +} + +static inline int encode_allele(uint32_t *h, uint8_t *bitpos, const char *str, size_t size) +{ + uint32_t v; + while (size--) + { + v = encode_base(*str++); + if (v > 3) + { + return -1; + } + *bitpos -= 2; + *h |= (v << *bitpos); + } + return 0; +} + +static inline uint32_t encode_refalt_rev(const char *ref, size_t sizeref, const char *alt, size_t sizealt) +{ + //[******** ******** ******** ******** *RRRRAAA A1122334 45566778 8990011*] + uint32_t h = 0; + h |= ((uint32_t)(sizeref) << 27); // RRRR: length of (REF - 1) + h |= ((uint32_t)(sizealt) << 23); // AAAA: length of (ALT - 1) + uint8_t bitpos = 23; + if ((encode_allele(&h, &bitpos, ref, sizeref) < 0) || (encode_allele(&h, &bitpos, alt, sizealt) < 0)) + { + return 0; // error code + } + return h; +} + +// Mix two 32 bit hash numbers using a MurmurHash3-like algorithm +static inline uint32_t muxhash(uint32_t k, uint32_t h) +{ + k *= 0xcc9e2d51; + k = (k >> 17) | (k << 15); + k *= 0x1b873593; + h ^= k; + h = (h >> 19) | (h << 13); + return ((h * 5) + 0xe6546b64); +} + +static inline uint32_t encode_packchar(int c) +{ + if (c < 'A') + { + return 27; + } + if (c >= 'a') + { + return (uint32_t)(c - 'a' + 1); + } + return (uint32_t)(c - 'A' + 1); +} + +// pack blocks of 6 characters in 32 bit (6 x 5 bit + 2 spare bit) [ 01111122 22233333 44444555 55666660 ] +static inline uint32_t pack_chars_tail(const char *str, size_t size) +{ + uint32_t h = 0; + const char *pos = (str + size - 1); + switch (size) + { + case 5: + h ^= encode_packchar(*pos--) << (1 + (5 * 1)); + // fall through + case 4: + h ^= encode_packchar(*pos--) << (1 + (5 * 2)); + // fall through + case 3: + h ^= encode_packchar(*pos--) << (1 + (5 * 3)); + // fall through + case 2: + h ^= encode_packchar(*pos--) << (1 + (5 * 4)); + // fall through + case 1: + h ^= encode_packchar(*pos) << (1 + (5 * 5)); + } + return h; +} + +static inline uint32_t pack_chars(const char *str) +{ + const char *pos = (str + 5); + return ((encode_packchar(*pos) << 1) + ^ (encode_packchar(*(pos-1)) << (1 + (5 * 1))) + ^ (encode_packchar(*(pos-2)) << (1 + (5 * 2))) + ^ (encode_packchar(*(pos-3)) << (1 + (5 * 3))) + ^ (encode_packchar(*(pos-4)) << (1 + (5 * 4))) + ^ (encode_packchar(*(pos-5)) << (1 + (5 * 5)))); +} + +// Return a 32 bit hash of a nucleotide string +static inline uint32_t hash32(const char *str, size_t size) +{ + uint32_t h = 0; + size_t len = 6; + while (size >= len) + { + h = muxhash(pack_chars(str), h); + str += len; + size -= len; + } + if (size > 0) + { + h = muxhash(pack_chars_tail(str, size), h); + } + return h; +} + +static inline uint32_t encode_refalt_hash(const char *ref, size_t sizeref, const char *alt, size_t sizealt) +{ + // 0x3 is the separator character between REF and ALT [00000000 00000000 00000000 00000011] + uint32_t h = muxhash(hash32(alt, sizealt), muxhash(0x3, hash32(ref, sizeref))); + // MurmurHash3 finalization mix - force all bits of a hash block to avalanche + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; + return ((h >> 1) | 0x1); // 0x1 is the set bit to indicate HASH mode [00000000 00000000 00000000 00000001] +} + +/** @brief Returns reference+alternate numerical encoding. + * + * @param ref Reference allele. String containing a sequence of nucleotide letters. + * The value in the pos field refers to the position of the first nucleotide in the String. + * Characters must be A-Z, a-z or * + * @param sizeref Length of the ref string, excluding the terminating null byte. + * @param alt Alternate non-reference allele string. + * Characters must be A-Z, a-z or * + * @param sizealt Length of the alt string, excluding the terminating null byte. + * + * @return REF+ALT code + */ +static inline uint32_t encode_refalt(const char *ref, size_t sizeref, const char *alt, size_t sizealt) +{ + if ((sizeref + sizealt) <= 11) + { + uint32_t h = encode_refalt_rev(ref, sizeref, alt, sizealt); + if (h != 0) + { + return h; + } + } + return encode_refalt_hash(ref, sizeref, alt, sizealt); +} + +static inline char decode_base(uint32_t code, int bitpos) +{ + static const char base[4] = {'A', 'C', 'G', 'T'}; + return base[((code >> bitpos) & 0x3)]; // 0x3 is the 2 bit mask [00000011] +} + +static inline size_t decode_refalt_rev(uint32_t code, char *ref, size_t *sizeref, char *alt, size_t *sizealt) +{ + *sizeref = (size_t)((code & 0x78000000) >> 27); // [01111000 00000000 00000000 00000000] + *sizealt = (size_t)((code & 0x07800000) >> 23); // [00000111 10000000 00000000 00000000] + switch (*sizeref) + { + case 10: + ref[9] = decode_base(code, (3 + (2 * 0))); + // fall through + case 9: + ref[8] = decode_base(code, (3 + (2 * 1))); + // fall through + case 8: + ref[7] = decode_base(code, (3 + (2 * 2))); + // fall through + case 7: + ref[6] = decode_base(code, (3 + (2 * 3))); + // fall through + case 6: + ref[5] = decode_base(code, (3 + (2 * 4))); + // fall through + case 5: + ref[4] = decode_base(code, (3 + (2 * 5))); + // fall through + case 4: + ref[3] = decode_base(code, (3 + (2 * 6))); + // fall through + case 3: + ref[2] = decode_base(code, (3 + (2 * 7))); + // fall through + case 2: + ref[1] = decode_base(code, (3 + (2 * 8))); + // fall through + case 1: + ref[0] = decode_base(code, (3 + (2 * 9))); + } + ref[*sizeref] = 0; + uint8_t bitpos = (23 - ((*sizeref) << 1)); + switch (*sizealt) + { + case 10: + alt[9] = decode_base(code, bitpos - (2 * 10)); + // fall through + case 9: + alt[8] = decode_base(code, bitpos - (2 * 9)); + // fall through + case 8: + alt[7] = decode_base(code, bitpos - (2 * 8)); + // fall through + case 7: + alt[6] = decode_base(code, bitpos - (2 * 7)); + // fall through + case 6: + alt[5] = decode_base(code, bitpos - (2 * 6)); + // fall through + case 5: + alt[4] = decode_base(code, bitpos - (2 * 5)); + // fall through + case 4: + alt[3] = decode_base(code, bitpos - (2 * 4)); + // fall through + case 3: + alt[2] = decode_base(code, bitpos - (2 * 3)); + // fall through + case 2: + alt[1] = decode_base(code, bitpos - (2 * 2)); + // fall through + case 1: + alt[0] = decode_base(code, bitpos - (2 * 1)); + } + alt[*sizealt] = 0; + return (*sizeref + *sizealt); +} + +/** @brief Decode the 32 bit REF+ALT code if reversible (if it has 11 or less bases in total and only contains ACGT letters). + * + * @param code REF+ALT code + * @param ref REF string buffer to be returned. + * @param sizeref Pointer to the size of the ref buffer, excluding the terminating null byte. + * This will contain the final ref size. + * @param alt ALT string buffer to be returned. + * @param sizealt Pointer to the size of the alt buffer, excluding the terminating null byte. + * This will contain the final alt size. + * + * @return If the code is reversible, then the total number of characters of REF+ALT is returned. + * Otherwise 0 is returned. + */ +static inline size_t decode_refalt(uint32_t code, char *ref, size_t *sizeref, char *alt, size_t *sizealt) +{ + if (code & 0x1) // check last bit + { + return 0; // non-reversible encoding + } + return decode_refalt_rev(code, ref, sizeref, alt, sizealt); +} + +/** @brief Returns a 64 bit variant key based on the pre-encoded CHROM, POS (0-based) and REF+ALT. + * + * @param chrom Encoded Chromosome (see encode_chrom). + * @param pos Position. The reference position, with the first base having position 0. + * @param refalt Encoded Reference + Alternate (see encode_refalt). + * + * @return VariantKey 64 bit code. + */ +static inline uint64_t encode_variantkey(uint8_t chrom, uint32_t pos, uint32_t refalt) +{ + return (((uint64_t)chrom << VKSHIFT_CHROM) | ((uint64_t)pos << VKSHIFT_POS) | (uint64_t)refalt); +} + +/** @brief Extract the CHROM code from VariantKey. + * + * @param vk VariantKey code. + * + * @return CHROM code. + */ +static inline uint8_t extract_variantkey_chrom(uint64_t vk) +{ + return (uint8_t)((vk & VKMASK_CHROM) >> VKSHIFT_CHROM); +} + +/** @brief Extract the POS code from VariantKey. + * + * @param vk VariantKey code. + * + * @return POS. + */ +static inline uint32_t extract_variantkey_pos(uint64_t vk) +{ + return (uint32_t)((vk & VKMASK_POS) >> VKSHIFT_POS); +} + +/** @brief Extract the REF+ALT code from VariantKey. + * + * @param vk VariantKey code. + * + * @return REF+ALT code. + */ +static inline uint32_t extract_variantkey_refalt(uint64_t vk) +{ + return (uint32_t)(vk & VKMASK_REFALT); +} + +/** @brief Decode a VariantKey code and returns the components as variantkey_t structure. + * + * @param code VariantKey code. + * @param vk Decoded variantkey structure. + */ +static inline void decode_variantkey(uint64_t code, variantkey_t *vk) +{ + vk->chrom = extract_variantkey_chrom(code); + vk->pos = extract_variantkey_pos(code); + vk->refalt = extract_variantkey_refalt(code); +} + +/** @brief Returns a 64 bit variant key based on CHROM, POS (0-based), REF, ALT. + * + * @param chrom Chromosome. An identifier from the reference genome, no white-space or leading zeros permitted. + * @param sizechrom Length of the chrom string, excluding the terminating null byte. + * @param pos Position. The reference position, with the first base having position 0. + * @param ref Reference allele. String containing a sequence of nucleotide letters. + * The value in the pos field refers to the position of the first nucleotide in the String. + * Characters must be A-Z, a-z or * + * @param sizeref Length of the ref string, excluding the terminating null byte. + * @param alt Alternate non-reference allele string. + * Characters must be A-Z, a-z or * + * @param sizealt Length of the alt string, excluding the terminating null byte. + * + * @return VariantKey 64 bit code. + */ +static inline uint64_t variantkey(const char *chrom, size_t sizechrom, uint32_t pos, const char *ref, size_t sizeref, const char *alt, size_t sizealt) +{ + return encode_variantkey(encode_chrom(chrom, sizechrom), pos, encode_refalt(ref, sizeref, alt, sizealt)); +} + +/** @brief Returns minimum and maximum VariantKeys for range searches. + * + * @param chrom Chromosome encoded number. + * @param pos_min Start reference position, with the first base having position 0. + * @param pos_max End reference position, with the first base having position 0. + * @param range VariantKey range values. + */ +static inline void variantkey_range(uint8_t chrom, uint32_t pos_min, uint32_t pos_max, vkrange_t *range) +{ + uint64_t c = ((uint64_t)chrom << VKSHIFT_CHROM); + range->min = (c | ((uint64_t)pos_min << VKSHIFT_POS)); + range->max = (c | ((uint64_t)pos_max << VKSHIFT_POS) | VKMASK_REFALT); +} + +static inline int8_t compare_uint64_t(uint64_t a, uint64_t b) +{ + return (a < b) ? -1 : (a > b); +} + +/** @brief Compares two VariantKeys by chromosome only. + * + * @param vka The first VariantKey to be compared. + * @param vkb The second VariantKey to be compared. + * + * @return -1 if the first chromosome is smaller than the second, 0 if they are equal and 1 if the first is greater than the second. + */ +static inline int8_t compare_variantkey_chrom(uint64_t vka, uint64_t vkb) +{ + return compare_uint64_t((vka >> VKSHIFT_CHROM), (vkb >> VKSHIFT_CHROM)); +} + +/** @brief Compares two VariantKeys by chromosome and position. + * + * @param vka The first VariantKey to be compared. + * @param vkb The second VariantKey to be compared. + * + * @return -1 if the first CHROM+POS is smaller than the second, 0 if they are equal and 1 if the first is greater than the second. + */ +static inline int8_t compare_variantkey_chrom_pos(uint64_t vka, uint64_t vkb) +{ + return compare_uint64_t((vka >> VKSHIFT_POS), (vkb >> VKSHIFT_POS)); +} + +/** @brief Returns VariantKey hexadecimal string (16 characters). + * + * The string represent a 64 bit number or: + * - 5 bit for CHROM + * - 28 bit for POS + * - 31 bit for REF+ALT + * + * @param vk VariantKey code. + * @param str String buffer to be returned (it must be sized 17 bytes at least). + * + * @return Upon successful return, these function returns the number of characters processed + * (excluding the null byte used to end output to strings). + * If the buffer size is not sufficient, then the return value is the number of characters required for + * buffer string, including the terminating null byte. + */ +static inline size_t variantkey_hex(uint64_t vk, char *str) +{ + return hex_uint64_t(vk, str); +} + +/** @brief Parses a VariantKey hexadecimal string and returns the code. + * + * @param vs VariantKey hexadecimal string (it must contain 16 hexadecimal characters). + * + * @return A VariantKey code. + */ +static inline uint64_t parse_variantkey_hex(const char *vs) +{ + return parse_hex_uint64_t(vs); +} + +#endif // VARIANTKEY_H diff --git a/bcftools/vcfannotate.c b/bcftools/vcfannotate.c new file mode 100644 index 0000000..d33fd90 --- /dev/null +++ b/bcftools/vcfannotate.c @@ -0,0 +1,3524 @@ +/* vcfannotate.c -- Annotate and edit VCF/BCF files. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "vcmp.h" +#include "filter.h" +#include "convert.h" +#include "smpl_ilist.h" +#include "regidx.h" +#include "dbuf.h" + +struct _args_t; + +typedef struct _rm_tag_t +{ + char *key; + int hdr_id; + void (*handler)(struct _args_t *, bcf1_t *, struct _rm_tag_t *); +} +rm_tag_t; + +typedef struct +{ + char **cols; + int ncols, mcols; + char **als; + int nals, mals; + kstring_t line; + int rid, start, end; +} +annot_line_t; + +#define REPLACE_MISSING (1<<0) // -c +TAG .. replace only missing values +#define REPLACE_ALL (1<<1) // -c TAG .. replace both missing and existing values +#define REPLACE_NON_MISSING (1<<2) // -c -TAG .. replace only if tgt is not missing +#define SET_OR_APPEND (1<<3) // -c =TAG .. set new value if missing or non-existent, append otherwise +#define MATCH_VALUE (1<<4) // -c ~ID .. do not set, just match the value +#define CARRY_OVER_MISSING (1<<5) // -c .TAG .. carry over source missing values as well +#define MM_FIRST 0 // if multiple annotation lines overlap a VCF record, use the first, discarding the rest +#define MM_APPEND 1 // append, possibly multiple times +#define MM_UNIQUE 2 // append, only unique values +#define MM_SUM 3 +#define MM_AVG 4 +#define MM_MIN 5 +#define MM_MAX 6 +#define MM_APPEND_MISSING 7 // missing values will be transferred as well +typedef struct _annot_col_t +{ + int icol, replace, number; // number: one of BCF_VL_* types + char *hdr_key_src, *hdr_key_dst; + // The setters return 0 on successful update of the bcf record, negative value (bcf_update_* return status) on errors, + // or 1 on (repeated partial updates) concluded with a src=NULL call + int (*setter)(struct _args_t *, bcf1_t *dst, struct _annot_col_t *, void *src); // the last is the annotation line, either src bcf1_t or annot_line_t + int (*getter)(struct _args_t *, bcf1_t *src, struct _annot_col_t *, void **ptr, int *mptr); + int merge_method; // one of the MM_* defines + khash_t(str2int) *mm_str_hash; // lookup table to ensure uniqueness of added string values + kstring_t mm_kstr; + size_t + mm_dbl_nalloc, // the allocated size --merge-logic values array + mm_dbl_nused, // the number of used elements in the mm_dbl array + mm_dbl_ndat; // the number of merged rows (for calculating the average) + double + *mm_dbl; + void *ptr; + int mptr, done; +} +annot_col_t; + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +#define MARK_LISTED 1 +#define MARK_UNLISTED 2 + +typedef struct _args_t +{ + bcf_srs_t *files; + bcf_hdr_t *hdr, *hdr_out, *tgts_hdr; + htsFile *out_fh; + int output_type, n_threads, clevel; + bcf_sr_regions_t *tgts; + + regidx_t *tgt_idx; // keep everything in memory only with .tab annotation file and -c BEG,END columns + regitr_t *tgt_itr; + int tgt_is_bed; + + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + int keep_sites; + + rm_tag_t *rm; // tags scheduled for removal + int nrm; + int flt_keep_pass; // when all filters removed, reset to PASS + + vcmp_t *vcmp; // for matching annotation and VCF lines by allele + annot_line_t *alines; // buffered annotation lines + annot_line_t *aline_missing; + uint32_t *srt_alines; // sorted indexes (iALT<<16 || iAline) + int nalines, malines, nsrt_alines, msrt_alines; + int ref_idx, alt_idx, chr_idx, beg_idx, end_idx; // -1 if not present + annot_col_t *cols; // column indexes and setters + int ncols; + int match_id; // set iff `-c ~ID` given, -1 otherwise + int match_end; // set iff `-c ~INFO/END` is given, -1 otherwise + + char *set_ids_fmt; + convert_t *set_ids; + int set_ids_replace; + + int nsmpl_annot; + int *sample_map, nsample_map, sample_is_file; // map[idst] -> isrc + uint8_t *src_smpl_pld, *dst_smpl_pld; // for Number=G format fields + int mtmpi, mtmpf, mtmps; + int mtmpi2, mtmpf2, mtmps2; + int mtmpi3, mtmpf3, mtmps3; + int32_t *tmpi, *tmpi2, *tmpi3; + float *tmpf, *tmpf2, *tmpf3; + char *tmps, *tmps2, **tmpp, **tmpp2; + kstring_t tmpks; + + char **argv, *output_fname, *targets_fname, *regions_list, *header_fname; + char *remove_annots, *columns, *rename_chrs, *rename_annots, *sample_names, *mark_sites; + char **rename_annots_map; + char *min_overlap_str; + float min_overlap_ann, min_overlap_vcf; + int rename_annots_nmap; + kstring_t merge_method_str; + int argc, drop_header, record_cmd_line, tgts_is_vcf, mark_sites_logic, force, single_overlaps; + int columns_is_file, has_append_mode, pair_logic; + dbuf_t *header_lines; +} +args_t; + +char *msprintf(const char *fmt, ...); + +int parse_with_payload(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + args_t *args = (args_t*) usr; + int ret = args->tgt_is_bed ? regidx_parse_bed(line, chr_beg, chr_end, beg, end, NULL, NULL) : regidx_parse_tab(line, chr_beg, chr_end, beg, end, NULL, NULL); + if ( ret<0 ) return ret; + *((char **)payload) = strdup(line); + return 0; +} +void free_payload(void *payload) +{ + char *str = *((char**)payload); + free(str); +} + +void remove_id(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + bcf_update_id(args->hdr,line,NULL); +} +void remove_filter(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + if ( tag->key && tag->hdr_id<0 ) + { + error("Error: Cannot proceed, not even with the --force option, bad things could happen.\n" + " Note that \"bcftools annotate -x FILTER\" can be used to remove ALL filters.\n" + " Even better, use \"bcftools view -h\" and \"bcftools reheader\" to fix the header!\n" + ); + } + if ( !tag->key ) bcf_update_filter(args->hdr, line, NULL, args->flt_keep_pass); + else bcf_remove_filter(args->hdr, line, tag->hdr_id, args->flt_keep_pass); +} +void remove_qual(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + bcf_float_set_missing(line->qual); +} +void remove_info(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + // remove all INFO fields + if ( !(line->unpacked & BCF_UN_INFO) ) bcf_unpack(line, BCF_UN_INFO); + + int i; + for (i=0; in_info; i++) + { + bcf_info_t *inf = &line->d.info[i]; + if ( !strcmp("END",bcf_hdr_int2id(args->hdr,BCF_DT_ID,inf->key)) ) + line->rlen = line->n_allele ? strlen(line->d.allele[0]) : 0; + if ( inf->vptr_free ) + { + free(inf->vptr - inf->vptr_off); + inf->vptr_free = 0; + } + line->d.shared_dirty |= BCF1_DIRTY_INF; + inf->vptr = NULL; + inf->vptr_off = inf->vptr_len = 0; + } +} +void remove_info_tag(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + bcf_update_info(args->hdr, line, tag->key, NULL, 0, BCF_HT_INT); // the type does not matter with n=0 +} +void remove_format_tag(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + bcf_update_format(args->hdr, line, tag->key, NULL, 0, BCF_HT_INT); // the type does not matter with n=0 +} +void remove_format(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + // remove all FORMAT fields except GT + if ( !(line->unpacked & BCF_UN_FMT) ) bcf_unpack(line, BCF_UN_FMT); + + int i; + for (i=0; in_fmt; i++) + { + bcf_fmt_t *fmt = &line->d.fmt[i]; + const char *key = bcf_hdr_int2id(args->hdr,BCF_DT_ID,fmt->id); + if ( key[0]=='G' && key[1]=='T' && !key[2] ) continue; + + if ( fmt->p_free ) + { + free(fmt->p - fmt->p_off); + fmt->p_free = 0; + } + line->d.indiv_dirty = 1; + fmt->p = NULL; + } +} + +#include "htslib/khash.h" +KHASH_MAP_INIT_STR(vdict, bcf_idinfo_t) +typedef khash_t(vdict) vdict_t; + +static void remove_hdr_lines(bcf_hdr_t *hdr, int type) +{ + int i = 0, nrm = 0; + while ( inhrec ) + { + if ( hdr->hrec[i]->type!=type ) { i++; continue; } + bcf_hrec_t *hrec = hdr->hrec[i]; + if ( type==BCF_HL_FMT || type==BCF_HL_INFO || type==BCF_HL_FMT || type== BCF_HL_CTG ) + { + // everything except FORMAT/GT + int id = bcf_hrec_find_key(hrec, "ID"); + if ( id>=0 ) + { + if ( type==BCF_HL_FMT && !strcmp(hrec->vals[id],"GT") ) { i++; continue; } + vdict_t *d = type==BCF_HL_CTG ? (vdict_t*)hdr->dict[BCF_DT_CTG] : (vdict_t*)hdr->dict[BCF_DT_ID]; + khint_t k = kh_get(vdict, d, hdr->hrec[i]->vals[id]); + kh_val(d, k).hrec[type==BCF_HL_CTG?0:type] = NULL; + kh_val(d, k).info[type] |= 0xf; + } + } + nrm++; + hdr->nhrec--; + if ( i < hdr->nhrec ) + memmove(&hdr->hrec[i],&hdr->hrec[i+1],(hdr->nhrec-i)*sizeof(bcf_hrec_t*)); + bcf_hrec_destroy(hrec); + } + if ( nrm ) { + if (bcf_hdr_sync(hdr) < 0) + error_errno("[%s] Failed to update header", __func__); + } +} + +static void init_remove_annots(args_t *args) +{ + int keep_info = 0, keep_fmt = 0, keep_flt = 0; + void *keep = khash_str2int_init(); + kstring_t str = {0,0,0}; + char *ss = args->remove_annots; + + int i, ntags, needs_info = 0; + if ( args->set_ids ) + { + const char **tags = convert_list_used_tags(args->set_ids,&ntags); + for (i=0; inrm++; + args->rm = (rm_tag_t*) realloc(args->rm,sizeof(rm_tag_t)*args->nrm); + rm_tag_t *tag = &args->rm[args->nrm-1]; + tag->key = NULL; + + int type = BCF_HL_GEN; + if ( !strncasecmp("INFO/",ss,5) ) { type = BCF_HL_INFO; ss += 5; } + else if ( !strncasecmp("INF/",ss,4) ) { type = BCF_HL_INFO; ss += 4; } + else if ( !strncasecmp("FORMAT/",ss,7) ) { type = BCF_HL_FMT; ss += 7; } + else if ( !strncasecmp("FMT/",ss,4) ) { type = BCF_HL_FMT; ss += 4; } + else if ( !strncasecmp("FILTER/",ss,7) ) { type = BCF_HL_FLT; ss += 7; } + else if ( !strncasecmp("^INFO/",ss,6) ) { type = BCF_HL_INFO; ss += 6; keep_info = 1; } + else if ( !strncasecmp("^INF/",ss,5) ) { type = BCF_HL_INFO; ss += 5; keep_info = 1; } + else if ( !strncasecmp("^FORMAT/",ss,8) ) { type = BCF_HL_FMT; ss += 8; keep_fmt = 1; } + else if ( !strncasecmp("^FMT/",ss,5) ) { type = BCF_HL_FMT; ss += 5; keep_fmt = 1; } + else if ( !strncasecmp("^FILTER/",ss,8) ) { type = BCF_HL_FLT; ss += 8; keep_flt = 1; } + + char *se = ss; + while ( *se && *se!=',' ) se++; + str.l = 0; + kputsn(ss, se-ss, &str); + + if ( type==BCF_HL_FLT ) + { + if ( !keep_flt ) + { + args->flt_keep_pass = 1; + tag->handler = remove_filter; + tag->key = strdup(str.s); + tag->hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, tag->key); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FLT,tag->hdr_id) ) + { + if ( args->keep_sites ) + error("Error: The filter \"%s\" is not defined in the header, cannot use the -k option\n", str.s); + else + fprintf(stderr,"Warning: The filter \"%s\" is not defined in the header\n", str.s); + } + else if ( !args->keep_sites ) bcf_hdr_remove(args->hdr_out,BCF_HL_FLT,tag->key); + } + else + { + int value, ret = khash_str2int_get(keep, str.s, &value); + if ( ret==-1 ) khash_str2int_set(keep, strdup(str.s),1<nrm--; + } + } + else if ( type!=BCF_HL_GEN ) + { + int id = bcf_hdr_id2int(args->hdr,BCF_DT_ID,str.s); + if ( !bcf_hdr_idinfo_exists(args->hdr,type,id) ) + { + if ( args->keep_sites ) + error("Error: The tag \"%s\" is not defined in the header, cannot use the -k option\n", str.s); + else + fprintf(stderr,"Warning: The tag \"%s\" not defined in the header\n", str.s); + + tag->key = strdup(str.s); + if ( type==BCF_HL_INFO ) + { + tag->handler = remove_info_tag; + if ( needs_info ) error("Error: `--remove INFO/%s` is executed first, cannot combine with `--set-id %s`\n",tag->key,args->set_ids_fmt); + } + else if ( type==BCF_HL_FMT ) tag->handler = remove_format_tag; + } + else if ( (type==BCF_HL_FMT && keep_fmt) || (type==BCF_HL_INFO && keep_info) ) + { + int value, ret = khash_str2int_get(keep, str.s, &value); + if ( ret==-1 ) khash_str2int_set(keep, strdup(str.s),1<nrm--; + } + else + { + tag->key = strdup(str.s); + if ( type==BCF_HL_INFO ) + { + tag->handler = remove_info_tag; + if ( needs_info ) error("Error: `--remove INFO/%s` is executed first, cannot combine with `--set-id %s`\n",tag->key,args->set_ids_fmt); + } + else if ( type==BCF_HL_FMT ) tag->handler = remove_format_tag; + if ( !args->keep_sites ) bcf_hdr_remove(args->hdr_out,type,tag->key); + } + } + else if ( !strcasecmp("ID",str.s) ) tag->handler = remove_id; + else if ( !strcasecmp("FILTER",str.s) ) + { + tag->handler = remove_filter; + if ( !args->keep_sites ) remove_hdr_lines(args->hdr_out,BCF_HL_FLT); + } + else if ( !strcasecmp("QUAL",str.s) ) tag->handler = remove_qual; + else if ( !strcasecmp("INFO",str.s) ) + { + if ( needs_info ) error("Error: `--remove INFO` is executed first, cannot combine with `--set-id %s`\n",args->set_ids_fmt); + tag->handler = remove_info; + if ( !args->keep_sites ) remove_hdr_lines(args->hdr_out,BCF_HL_INFO); + } + else if ( !strcasecmp("FMT",str.s) || !strcasecmp("FORMAT",str.s) ) + { + tag->handler = remove_format; + if ( !args->keep_sites ) remove_hdr_lines(args->hdr_out,BCF_HL_FMT); + } + else if ( str.l ) + { + int id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, str.s); + if ( bcf_hdr_idinfo_exists(args->hdr,BCF_HL_INFO,id) ) error("Error: did you mean INFO/%s?\n",str.s); + if ( bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,id) ) error("Error: did you mean FORMAT/%s?\n",str.s); + + if ( !args->keep_sites ) + { + if ( str.s[0]=='#' && str.s[1]=='#' ) + bcf_hdr_remove(args->hdr_out,BCF_HL_GEN,str.s+2); + else + bcf_hdr_remove(args->hdr_out,BCF_HL_STR,str.s); + } + args->nrm--; + } + + ss = *se ? se+1 : se; + } + free(str.s); + if ( keep_flt || keep_info || keep_fmt ) + { + int j; + for (j=0; jhdr->nhrec; j++) + { + bcf_hrec_t *hrec = args->hdr->hrec[j]; + if ( hrec->type!=BCF_HL_FLT && hrec->type!=BCF_HL_INFO && hrec->type!=BCF_HL_FMT ) continue; + if ( !keep_flt && hrec->type==BCF_HL_FLT ) continue; + if ( !keep_info && hrec->type==BCF_HL_INFO ) continue; + if ( !keep_fmt && hrec->type==BCF_HL_FMT ) continue; + int k = bcf_hrec_find_key(hrec,"ID"); + assert( k>=0 ); // this should always be true for valid VCFs + int value, ret = khash_str2int_get(keep,hrec->vals[k],&value); + if ( ret==0 && value>>hrec->type ) // keep + { + if ( hrec->type==BCF_HL_FLT && !strcmp("PASS",hrec->vals[k]) ) args->flt_keep_pass = 1; + continue; + } + args->nrm++; + args->rm = (rm_tag_t*) realloc(args->rm,sizeof(rm_tag_t)*args->nrm); + rm_tag_t *tag = &args->rm[args->nrm-1]; + if ( hrec->type==BCF_HL_INFO ) tag->handler = remove_info_tag; + else if ( hrec->type==BCF_HL_FMT ) tag->handler = remove_format_tag; + else + { + tag->handler = remove_filter; + tag->hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, hrec->vals[k]); + } + tag->key = strdup(hrec->vals[k]); + if ( !args->keep_sites ) bcf_hdr_remove(args->hdr_out,hrec->type,tag->key); + } + } + khash_str2int_destroy_free(keep); + if ( !args->nrm ) error("No matching tag in -x %s\n", args->remove_annots); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); +} +static void init_header_lines(args_t *args) +{ + if ( args->header_fname ) + { + htsFile *file = hts_open(args->header_fname, "rb"); + if ( !file ) error("Error reading %s\n", args->header_fname); + kstring_t str = {0,0,0}; + while ( hts_getline(file, KS_SEP_LINE, &str) > 0 ) + { + if ( bcf_hdr_append(args->hdr_out,str.s) ) error("Could not parse %s: %s\n", args->header_fname, str.s); + bcf_hdr_append(args->hdr,str.s); // the input file may not have the header line if run with -h (and nothing else) + } + if ( hts_close(file)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->header_fname); + free(str.s); + } + if ( args->header_lines ) + { + int i, n = dbuf_n(args->header_lines); + for (i=0; iheader_lines,i); + if ( bcf_hdr_append(args->hdr_out,line) ) error("Could not parse the header line: %s\n", line); + bcf_hdr_append(args->hdr,line); // the input file may not have the header line if run with -H (and nothing else) + } + dbuf_destroy_free(args->header_lines); + args->header_lines = NULL; + } + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update output header", __func__); + if (bcf_hdr_sync(args->hdr) < 0) + error_errno("[%s] Failed to update input header", __func__); +} +static int vcf_getter_info_str2str(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr) +{ + return bcf_get_info_string(args->tgts_hdr,rec,col->hdr_key_src,ptr,mptr); +} +static int vcf_getter_id2str(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr) +{ + char *str = *((char**)ptr); + int len = strlen(rec->d.id); + if ( len >= *mptr ) str = realloc(str, len+1); + strcpy(str, rec->d.id); + *((char**)ptr) = str; + *mptr = len+1; + return len; +} +static int vcf_getter_filter2str(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr) +{ + kstring_t str; + str.s = *((char**)ptr); + str.m = *mptr; + str.l = 0; + + int i; + if ( rec->d.n_flt ) + { + for (i=0; id.n_flt; i++) + { + if (i) kputc(';', &str); + kputs(bcf_hdr_int2id(args->tgts_hdr,BCF_DT_ID,rec->d.flt[i]), &str); + } + } + else kputc('.', &str); + + *((char**)ptr) = str.s; + *mptr = str.m; + return str.l; +} +static int setter_filter(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with FILTER (yet?)\n"); + + // note: so far this works only with one filter, not a list of filters + annot_line_t *tab = (annot_line_t*) data; + if ( tab->cols[col->icol][0]=='.' && !tab->cols[col->icol][1] ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_update_filter(args->hdr_out,line,NULL,0); + return 0; + } + hts_expand(int,1,args->mtmpi,args->tmpi); + args->tmpi[0] = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, tab->cols[col->icol]); + if ( args->tmpi[0]<0 ) error("The FILTER \"%s\" is not defined in the header, was the -h option provided?\n", tab->cols[col->icol]); + if ( col->replace & SET_OR_APPEND ) return bcf_add_filter(args->hdr_out,line,args->tmpi[0]); + if ( !(col->replace & REPLACE_MISSING) ) + { + bcf_update_filter(args->hdr_out,line,NULL,0); + return bcf_update_filter(args->hdr_out,line,args->tmpi,1); + } + + // only update missing FILTER + if ( !(line->unpacked & BCF_UN_FLT) ) bcf_unpack(line, BCF_UN_FLT); + if ( !line->d.n_flt ) + return bcf_update_filter(args->hdr_out,line,args->tmpi,1); + + return 0; +} +static int vcf_setter_filter(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + int i, ret = 0; + bcf1_t *rec = (bcf1_t*) data; + if ( !(rec->unpacked & BCF_UN_FLT) ) bcf_unpack(rec, BCF_UN_FLT); + if ( !(line->unpacked & BCF_UN_FLT) ) bcf_unpack(line, BCF_UN_FLT); + if ( !rec->d.n_flt ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_update_filter(args->hdr_out,line,NULL,0); + return 0; + } + if ( col->replace & (SET_OR_APPEND|REPLACE_MISSING) ) + { + if ( (col->replace & REPLACE_MISSING) && line->d.n_flt ) return 0; // only update missing FILTER + for (i=0; id.n_flt; i++) + { + const char *flt = bcf_hdr_int2id(args->files->readers[1].header, BCF_DT_ID, rec->d.flt[i]); + if ( bcf_add_filter(args->hdr_out,line,bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, flt)) < 0 ) ret = -1; + } + return ret; + } + hts_expand(int,rec->d.n_flt,args->mtmpi,args->tmpi); + for (i=0; id.n_flt; i++) + { + const char *flt = bcf_hdr_int2id(args->files->readers[1].header, BCF_DT_ID, rec->d.flt[i]); + args->tmpi[i] = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, flt); + } + bcf_update_filter(args->hdr_out,line,NULL,0); + return bcf_update_filter(args->hdr_out,line,args->tmpi,rec->d.n_flt); +} +static int setter_pos(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + annot_line_t *tab = (annot_line_t*) data; + if ( tab->cols[col->icol] && tab->cols[col->icol][0]=='.' && !tab->cols[col->icol][1] ) return 0; // don't replace with "." + char *tmp; + int pos = strtol(tab->cols[col->icol], &tmp, 10); + if ( tmp==tab->cols[col->icol] ) + error("Could not parse ~POS at %s:%"PRId64" .. [%s]\n",bcf_seqname(args->hdr,line),(int64_t)line->pos+1,tab->cols[col->icol]); + line->pos = pos - 1; + return 0; +} +static int setter_id(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with ID (yet?)\n"); + if ( col->replace & MATCH_VALUE ) return 0; + + // possible cases: + // IN ANNOT OUT ACHIEVED_BY + // x y x -c +ID + // x y y -c ID + // x y x,y -c =ID + // x . x -c +ID, ID + // x . . -x ID + // . y y -c +ID, -c ID + // + annot_line_t *tab = (annot_line_t*) data; + if ( tab->cols[col->icol] && tab->cols[col->icol][0]=='.' && !tab->cols[col->icol][1] ) return 0; // don't replace with "." + if ( col->replace & SET_OR_APPEND ) return bcf_add_id(args->hdr_out,line,tab->cols[col->icol]); + if ( !(col->replace & REPLACE_MISSING) ) return bcf_update_id(args->hdr_out,line,tab->cols[col->icol]); + + // running with +ID, only update missing ids + if ( !line->d.id || (line->d.id[0]=='.' && !line->d.id[1]) ) + return bcf_update_id(args->hdr_out,line,tab->cols[col->icol]); + return 0; +} +static int vcf_setter_id(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( col->replace & MATCH_VALUE ) return 0; + + bcf1_t *rec = (bcf1_t*) data; + + char *id; + if ( col->getter ) + { + int nret = col->getter(args,rec,col,&col->ptr,&col->mptr); + id = (char*) col->ptr; + if ( nret<=0 || (nret==1 && *id=='.') ) return 0; // don't replace with "." + } + else + { + if ( rec->d.id && rec->d.id[0]=='.' && !rec->d.id[1] ) return 0; // don't replace with "." + id = rec->d.id; + } + if ( col->replace & SET_OR_APPEND ) return bcf_add_id(args->hdr_out,line,id); + if ( !(col->replace & REPLACE_MISSING) ) return bcf_update_id(args->hdr_out,line,id); + + // running with +ID, only update missing ids + if ( !line->d.id || (line->d.id[0]=='.' && !line->d.id[1]) ) + return bcf_update_id(args->hdr_out,line,id); + return 0; +} +static int vcf_setter_ref(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + if ( !strcmp(rec->d.allele[0],line->d.allele[0]) ) return 0; // no update necessary + const char **als = (const char**) malloc(sizeof(char*)*line->n_allele); + als[0] = rec->d.allele[0]; + int i; + for (i=1; in_allele; i++) als[i] = line->d.allele[i]; + int ret = bcf_update_alleles(args->hdr_out, line, als, line->n_allele); + free(als); + return ret; +} +static int vcf_setter_alt(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int i; + if ( line->n_allele>1 && (col->replace & REPLACE_MISSING) ) return 0; + if ( rec->n_allele==line->n_allele ) + { + for (i=1; in_allele; i++) if ( strcmp(rec->d.allele[i],line->d.allele[i]) ) break; + if ( i==rec->n_allele ) return 0; // no update necessary + } + const char **als = (const char**) malloc(sizeof(char*)*rec->n_allele); + als[0] = line->d.allele[0]; + for (i=1; in_allele; i++) als[i] = rec->d.allele[i]; + int ret = bcf_update_alleles(args->hdr_out, line, als, rec->n_allele); + free(als); + return ret; +} +static int setter_qual(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with QUAL (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + char *str = tab->cols[col->icol]; + if ( str[0]=='.' && str[1]==0 ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_float_set_missing(line->qual); + return 0; + } + if ( (col->replace & REPLACE_MISSING) && !bcf_float_is_missing(line->qual) ) return 0; + + line->qual = strtod(str, &str); + if ( str == tab->cols[col->icol] ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + return 0; +} +static int vcf_setter_qual(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + if ( bcf_float_is_missing(rec->qual) ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_float_set_missing(line->qual); + return 0; + } + if ( (col->replace & REPLACE_MISSING) && !bcf_float_is_missing(line->qual) ) return 0; + line->qual = rec->qual; + return 0; +} +static int setter_info_flag(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with INFO type=Flag (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + char *str = tab->cols[col->icol]; + if ( str[0]=='.' && str[1]==0 ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_update_info_flag(args->hdr_out,line,col->hdr_key_dst,NULL,0); + return 0; + } + + if ( str[0]=='1' && str[1]==0 ) return bcf_update_info_flag(args->hdr_out,line,col->hdr_key_dst,NULL,1); + if ( str[0]=='0' && str[1]==0 ) return bcf_update_info_flag(args->hdr_out,line,col->hdr_key_dst,NULL,0); + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + return -1; +} +static int vcf_setter_info_flag(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int flag = bcf_get_info_flag(args->files->readers[1].header,rec,col->hdr_key_src,NULL,NULL); + bcf_update_info_flag(args->hdr_out,line,col->hdr_key_dst,NULL,flag); + return 0; +} +static int setter_ARinfo_int32(args_t *args, bcf1_t *line, annot_col_t *col, int nals, char **als, int ntmpi) +{ + if ( col->number==BCF_VL_A && ntmpi!=nals-1 && (ntmpi!=1 || args->tmpi[0]!=bcf_int32_missing || args->tmpi[1]!=bcf_int32_vector_end) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", ntmpi,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + else if ( col->number==BCF_VL_R && ntmpi!=nals && (ntmpi!=1 || args->tmpi[0]!=bcf_int32_missing || args->tmpi[1]!=bcf_int32_vector_end) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", ntmpi,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + int *map = vcmp_map_ARvalues(args->vcmp,ndst,nals,als,line->n_allele,line->d.allele); + if ( !map ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + // fill in any missing values in the target VCF (or all, if not present) + int ntmpi2 = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpi2, &args->mtmpi2); + if ( ntmpi2 < ndst ) hts_expand(int32_t,ndst,args->mtmpi2,args->tmpi2); + + int i; + for (i=0; itmpi2[i] = bcf_int32_missing; + continue; + } + if ( ntmpi2==ndst && (col->replace & REPLACE_MISSING) + && args->tmpi2[i]!=bcf_int32_missing + && args->tmpi2[i]!=bcf_int32_vector_end ) continue; + + args->tmpi2[i] = args->tmpi[ map[i] ]; + } + return bcf_update_info_int32(args->hdr_out,line,col->hdr_key_dst,args->tmpi2,ndst); +} +static int setter_info_int(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + annot_line_t *tab = (annot_line_t*) data; + + // This is a bit hacky, only to reuse existing code with minimal changes: + // -c =TAG will now behave as -l TAG:APPEND for integers + if ( col->replace & SET_OR_APPEND ) col->merge_method=MM_APPEND; + + if ( !tab ) + { + if ( col->merge_method!=MM_SUM && col->merge_method!=MM_AVG && + col->merge_method!=MM_MIN && col->merge_method!=MM_MAX && + col->merge_method!=MM_APPEND && + col->merge_method!=MM_APPEND_MISSING ) + error("Error: at the moment only the sum,avg,min,max,append,append-missing options are supported with --merge-logic for INFO type=Integer\n"); + } + + int i,ntmpi = 0; + if ( (col->replace & SET_OR_APPEND) && !col->mm_dbl_nused ) + { + ntmpi = bcf_get_info_int32(args->hdr, line, col->hdr_key_dst, &args->tmpi, &args->mtmpi); + if ( ntmpi>0 && (args->tmpi[0]!=bcf_int32_missing || (col->replace & CARRY_OVER_MISSING)) ) + { + col->mm_dbl_nused = col->mm_dbl_ndat = ntmpi; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; imm_dbl[i] = args->tmpi[i]; + col->mm_dbl_ndat = 1; + } + ntmpi = 0; + } + if ( tab ) // has data, not flushing yet + { + char *str = tab->cols[col->icol], *end = str; + if ( str[0]=='.' && str[1]==0 && col->merge_method!=MM_APPEND_MISSING && !(col->replace & CARRY_OVER_MISSING) ) return 1; + + while ( *end ) + { + ntmpi++; + hts_expand(int32_t,ntmpi,args->mtmpi,args->tmpi); + if ( str[0]=='.' && (str[1]==0 || str[1]==',') ) + { + if ( col->merge_method==MM_APPEND_MISSING || (col->replace & CARRY_OVER_MISSING) ) + args->tmpi[ntmpi-1] = bcf_int32_missing; + else + ntmpi--; + if ( str[1]==0 ) end = str+1; + str += 2; + } + else + { + args->tmpi[ntmpi-1] = strtol(str, &end, 10); + if ( end==str ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + str = end+1; + } + } + if ( col->merge_method!=MM_FIRST ) + { + if ( !col->mm_dbl_nused ) + { + col->mm_dbl_nused = ntmpi; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; imm_dbl[i] = args->tmpi[i]; + } + else + { + if ( col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING ) + { + int nori = col->mm_dbl_nused; + col->mm_dbl_nused += ntmpi; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; imm_dbl[i+nori] = args->tmpi[i]; + } + else + { + if ( ntmpi!=col->mm_dbl_nused ) error("Error: cannot merge fields of unequal length\n"); + if ( col->merge_method==MM_SUM || col->merge_method==MM_AVG ) + for (i=0; imm_dbl[i] += args->tmpi[i]; + else if ( col->merge_method==MM_MIN ) + for (i=0; imm_dbl[i] > args->tmpi[i] ) col->mm_dbl[i] = args->tmpi[i]; } + else if ( col->merge_method==MM_MAX ) + for (i=0; imm_dbl[i] < args->tmpi[i] ) col->mm_dbl[i] = args->tmpi[i]; } + } + } + col->mm_dbl_ndat++; + return 1; + } + } + else if ( col->merge_method==MM_SUM || col->merge_method==MM_MIN || col->merge_method==MM_MAX || col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING ) + { + ntmpi = col->mm_dbl_nused; + hts_expand(int32_t,ntmpi,args->mtmpi,args->tmpi); + for (i=0; itmpi[i] = col->mm_dbl[i]; + col->mm_dbl_nused = col->mm_dbl_ndat = 0; + } + else if ( col->merge_method==MM_AVG ) + { + ntmpi = col->mm_dbl_nused; + hts_expand(int32_t,ntmpi,args->mtmpi,args->tmpi); + for (i=0; itmpi[i] = col->mm_dbl[i]/col->mm_dbl_ndat; + col->mm_dbl_nused = col->mm_dbl_ndat = 0; + } + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_int32(args,line,col,tab->nals,tab->als,ntmpi); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_int32(args->hdr, line, col->hdr_key_dst, &args->tmpi2, &args->mtmpi2); + if ( ret>0 && args->tmpi2[0]!=bcf_int32_missing ) return 0; + } + return bcf_update_info_int32(args->hdr_out,line,col->hdr_key_dst,args->tmpi,ntmpi); +} +static int vcf_setter_info_int(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int ntmpi = bcf_get_info_int32(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmpi,&args->mtmpi); + if ( ntmpi < 0 ) return 0; // nothing to add + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_int32(args,line,col,rec->n_allele,rec->d.allele,ntmpi); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_int32(args->hdr, line, col->hdr_key_dst, &args->tmpi2, &args->mtmpi2); + if ( ret>0 && args->tmpi2[0]!=bcf_int32_missing ) return 0; + } + + return bcf_update_info_int32(args->hdr_out,line,col->hdr_key_dst,args->tmpi,ntmpi); +} +static int setter_ARinfo_real(args_t *args, bcf1_t *line, annot_col_t *col, int nals, char **als, int ntmpf) +{ + if ( col->number==BCF_VL_A && ntmpf!=nals-1 && (ntmpf!=1 || !bcf_float_is_missing(args->tmpf[0]) || !bcf_float_is_vector_end(args->tmpf[0])) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", ntmpf,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + else if ( col->number==BCF_VL_R && ntmpf!=nals && (ntmpf!=1 || !bcf_float_is_missing(args->tmpf[0]) || !bcf_float_is_vector_end(args->tmpf[0])) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", ntmpf,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + int *map = vcmp_map_ARvalues(args->vcmp,ndst,nals,als,line->n_allele,line->d.allele); + if ( !map ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + // fill in any missing values in the target VCF (or all, if not present) + int ntmpf2 = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpf2, &args->mtmpf2); + if ( ntmpf2 < ndst ) hts_expand(float,ndst,args->mtmpf2,args->tmpf2); + + int i; + for (i=0; itmpf2[i]); + continue; + } + if ( ntmpf2==ndst && (col->replace & REPLACE_MISSING) + && !bcf_float_is_missing(args->tmpf2[i]) + && !bcf_float_is_vector_end(args->tmpf2[i]) ) continue; + + args->tmpf2[i] = args->tmpf[ map[i] ]; + } + return bcf_update_info_float(args->hdr_out,line,col->hdr_key_dst,args->tmpf2,ndst); +} +static int setter_info_real(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + annot_line_t *tab = (annot_line_t*) data; + + // This is a bit hacky, only to reuse existing code with minimal changes: + // -c =TAG will now behave as -l TAG:APPEND for floats + if ( col->replace & SET_OR_APPEND ) col->merge_method=MM_APPEND; + + if ( !tab ) + { + if ( col->merge_method!=MM_SUM && col->merge_method!=MM_AVG && + col->merge_method!=MM_MIN && col->merge_method!=MM_MAX && + col->merge_method!=MM_APPEND && + col->merge_method!=MM_APPEND_MISSING ) + error("Error: at the moment only the sum,avg,min,max,append,append-missing options are supported with --merge-logic for INFO type=Float\n"); + } + + int i,ntmpf = 0; + if ( (col->replace & SET_OR_APPEND) && !col->mm_dbl_nused ) + { + ntmpf = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpf, &args->mtmpf); + if ( ntmpf>0 && (!bcf_float_is_missing(args->tmpf[0]) || (col->replace & CARRY_OVER_MISSING)) ) + { + col->mm_dbl_nused = ntmpf; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; itmpf[i]) ) + bcf_double_set_missing(col->mm_dbl[i]); + else + col->mm_dbl[i] = args->tmpf[i]; + col->mm_dbl_ndat = 1; + } + ntmpf = 0; + } + if ( tab ) // data row, not just flushing + { + char *str = tab->cols[col->icol], *end = str; + if ( str[0]=='.' && str[1]==0 && col->merge_method!=MM_APPEND_MISSING && !(col->replace & CARRY_OVER_MISSING) ) return 1; + + while ( *end ) + { + ntmpf++; + hts_expand(float,ntmpf,args->mtmpf,args->tmpf); + if ( str[0]=='.' && (str[1]==0 || str[1]==',') ) + { + if ( col->merge_method==MM_APPEND_MISSING || (col->replace & CARRY_OVER_MISSING) ) + bcf_float_set_missing(args->tmpf[ntmpf-1]); + else + ntmpf--; + if ( str[1]==0 ) end = str+1; + str += 2; + } + else + { + args->tmpf[ntmpf-1] = strtod(str, &end); + if ( end==str ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + str = end+1; + } + } + if ( col->merge_method!=MM_FIRST ) + { + if ( !col->mm_dbl_nused ) + { + col->mm_dbl_nused = ntmpf; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; itmpf[i]) ) + bcf_double_set_missing(col->mm_dbl[i]); + else + col->mm_dbl[i] = args->tmpf[i]; + } + } + else + { + if ( col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING ) + { + int nori = col->mm_dbl_nused; + col->mm_dbl_nused += ntmpf; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; itmpf[i]) ) + bcf_double_set_missing(col->mm_dbl[i+nori]); + else + col->mm_dbl[i+nori] = args->tmpf[i]; + } + } + else + { + if ( ntmpf!=col->mm_dbl_nused ) error("Error: cannot merge fields of unequal length\n"); + if ( col->merge_method==MM_SUM || col->merge_method==MM_AVG ) + for (i=0; imm_dbl[i] += args->tmpf[i]; + else if ( col->merge_method==MM_MIN ) + for (i=0; imm_dbl[i] > args->tmpf[i] ) col->mm_dbl[i] = args->tmpf[i]; } + else if ( col->merge_method==MM_MAX ) + for (i=0; imm_dbl[i] < args->tmpf[i] ) col->mm_dbl[i] = args->tmpf[i]; } + } + } + col->mm_dbl_ndat++; + return 1; + } + } + else if ( col->merge_method==MM_SUM || col->merge_method==MM_MIN || col->merge_method==MM_MAX || col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING ) + { + ntmpf = col->mm_dbl_nused; + hts_expand(int32_t,ntmpf,args->mtmpf,args->tmpf); + for (i=0; imm_dbl[i]) ) + bcf_float_set_missing(args->tmpf[i]); + else + args->tmpf[i] = col->mm_dbl[i]; + } + col->mm_dbl_nused = col->mm_dbl_ndat = 0; + } + else if ( col->merge_method==MM_AVG ) + { + ntmpf = col->mm_dbl_nused; + hts_expand(int32_t,ntmpf,args->mtmpf,args->tmpf); + for (i=0; itmpf[i] = col->mm_dbl[i]/col->mm_dbl_ndat; + col->mm_dbl_nused = col->mm_dbl_ndat = 0; + } + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_real(args,line,col,tab->nals,tab->als,ntmpf); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpf2, &args->mtmpf2); + if ( ret>0 && !bcf_float_is_missing(args->tmpf2[0]) ) return 0; + } + + return bcf_update_info_float(args->hdr_out,line,col->hdr_key_dst,args->tmpf,ntmpf); +} +static int vcf_setter_info_real(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int ntmpf = bcf_get_info_float(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmpf,&args->mtmpf); + if ( ntmpf < 0 ) return 0; // nothing to add + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_real(args,line,col,rec->n_allele,rec->d.allele,ntmpf); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpf2, &args->mtmpf2); + if ( ret>0 && !bcf_float_is_missing(args->tmpf2[0]) ) return 0; + } + + return bcf_update_info_float(args->hdr_out,line,col->hdr_key_dst,args->tmpf,ntmpf); +} +int copy_string_field(char *src, int isrc, int src_len, kstring_t *dst, int idst); // see vcfmerge.c +static int setter_ARinfo_string(args_t *args, bcf1_t *line, annot_col_t *col, int nals, char **als) +{ + assert( col->merge_method==MM_FIRST ); + + int nsrc = 1, lsrc = 0; + while ( args->tmps[lsrc] ) + { + if ( args->tmps[lsrc]==',' ) nsrc++; + lsrc++; + } + if ( col->number==BCF_VL_A && nsrc!=nals-1 && (nsrc!=1 || args->tmps[0]!='.' || args->tmps[1]!=0 ) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", nsrc,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + else if ( col->number==BCF_VL_R && nsrc!=nals && (nsrc!=1 || args->tmps[0]!='.' || args->tmps[1]!=0 ) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", nsrc,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + int *map = vcmp_map_ARvalues(args->vcmp,ndst,nals,als,line->n_allele,line->d.allele); + if ( !map ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + // fill in any missing values in the target VCF (or all, if not present) + int i, empty = 0, nstr, mstr = args->tmpks.m; + nstr = bcf_get_info_string(args->hdr, line, col->hdr_key_dst, &args->tmpks.s, &mstr); + args->tmpks.m = mstr; + if ( nstr<0 || (nstr==1 && args->tmpks.s[0]=='.' && args->tmpks.s[1]==0) ) + { + empty = 0; + args->tmpks.l = 0; + kputc('.',&args->tmpks); + for (i=1; itmpks); + } + else args->tmpks.l = nstr; + for (i=0; itmpks,i); + continue; + } + if ( col->replace & REPLACE_MISSING ) + { + // Do not replace filled values. The field must be looked up again because + // of realloc in copy_string_field + int n = 0; + char *str = args->tmpks.s; + while ( *str && ntmps,map[i],lsrc,&args->tmpks,i); + if ( ret!=0 ) error("[%s:%d %s] Failed to copy a string field\n", __FILE__,__LINE__,__func__); + } + return bcf_update_info_string(args->hdr_out,line,col->hdr_key_dst,args->tmpks.s); +} +void khash_str2int_clear_free(void *_hash) +{ + khash_t(str2int) *hash = (khash_t(str2int)*)_hash; + khint_t k; + if (hash == 0) return; + for (k = 0; k < kh_end(hash); ++k) + if (kh_exist(hash, k)) free((char*)kh_key(hash, k)); + kh_clear(str2int, hash); +} +static int setter_info_str(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( (col->replace & REPLACE_MISSING) && col->number!=BCF_VL_A && col->number!=BCF_VL_R ) + { + int ret = bcf_get_info_string(args->hdr, line, col->hdr_key_dst, &args->tmps2, &args->mtmps2); + if ( ret>0 && (args->tmps2[0]!='.' || args->tmps2[1]!=0) ) return 0; + } + + // This is a bit hacky, only to reuse existing code with minimal changes: + // -c =TAG will now behave as -l TAG:unique for strings + if ( col->replace & SET_OR_APPEND ) col->merge_method=MM_UNIQUE; + + annot_line_t *tab = (annot_line_t*) data; + + int len = 0; + if ( tab ) + { + len = strlen(tab->cols[col->icol]); + if ( !len ) return 0; + if ( len==1 && tab->cols[col->icol][0]=='.' && col->merge_method!=MM_APPEND_MISSING && !(col->replace & CARRY_OVER_MISSING) ) return 1; + } + + if ( col->merge_method!=MM_FIRST ) + { + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + error("Error: the --merge-logic option cannot be used with INFO tags Type=String,Number={A,R,G}\n"); + + if ( data ) + { + assert( col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING || col->merge_method==MM_UNIQUE ); + if ( col->merge_method==MM_UNIQUE ) + { + if ( !col->mm_str_hash ) col->mm_str_hash = (khash_t(str2int)*)khash_str2int_init(); + if ( khash_str2int_has_key(col->mm_str_hash, tab->cols[col->icol]) ) return 1; + khash_str2int_inc(col->mm_str_hash, strdup(tab->cols[col->icol])); + } + + if ( (col->replace & SET_OR_APPEND) && !col->mm_kstr.l ) + { + int m = col->mm_kstr.m; + int n = bcf_get_info_string(args->hdr, line, col->hdr_key_dst, &col->mm_kstr.s, &m); + col->mm_kstr.m = m; + if ( n>0 && ((col->replace & CARRY_OVER_MISSING) || col->mm_kstr.s[0]!='.' || col->mm_kstr.s[1]) ) col->mm_kstr.l = n; + } + + if ( col->mm_kstr.l ) kputc(',',&col->mm_kstr); + kputs(tab->cols[col->icol], &col->mm_kstr); + return 1; + } + + if ( col->mm_kstr.l ) + { + hts_expand(char,col->mm_kstr.l+1,args->mtmps,args->tmps); + memcpy(args->tmps,col->mm_kstr.s,col->mm_kstr.l+1); + } + else + return 0; + + // flush the line + if ( col->merge_method==MM_UNIQUE ) + khash_str2int_clear_free(col->mm_str_hash); + col->mm_kstr.l = 0; + } + else + { + assert(tab); + hts_expand(char,len+1,args->mtmps,args->tmps); + memcpy(args->tmps,tab->cols[col->icol],len+1); + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_string(args,line,col,tab->nals,tab->als); + } + + return bcf_update_info_string(args->hdr_out,line,col->hdr_key_dst,args->tmps); +} +static int vcf_setter_info_str(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + + if ( col->getter ) + col->getter(args,rec,col,(void**)&args->tmps, &args->mtmps); + else + { + int ntmps = bcf_get_info_string(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmps,&args->mtmps); + if ( ntmps < 0 ) return 0; // nothing to add + } + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_string(args,line,col,rec->n_allele,rec->d.allele); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_string(args->hdr, line, col->hdr_key_dst, &args->tmps2, &args->mtmps2); + if ( ret>0 && (args->tmps2[0]!='.' || args->tmps2[1]!=0) ) return 0; + } + + return bcf_update_info_string(args->hdr_out,line,col->hdr_key_dst,args->tmps); +} +static int genotypes_to_string(args_t *args, int nsrc1, int32_t *src, int nsmpl_dst, kstring_t *str) +{ + int i, isrc, idst; + int blen = nsrc1 > 1 ? nsrc1 + 1 : 1; // typically the genotypes take three bytes 0/1, no 0-termination is needed + +gt_length_too_big: + str->l = 0; + for (idst=0; idstsample_map ? args->sample_map[idst] : idst; + if ( isrc==-1 ) + { + kputc_('.', str); + for (i=1; i < blen; i++) kputc_(0, str); + continue; + } + + size_t plen = str->l; + int32_t *ptr = src + isrc*nsrc1; + for (i=0; il - plen > blen ) + { + // too many alternate alleles or ploidy is too large, the genotype does not fit + // three characters ("0/0" vs "10/10"). + blen *= 2; + goto gt_length_too_big; + } + plen = str->l - plen; + while ( plen < blen ) + { + kputc_(0, str); + plen++; + } + } + return 0; +} +static int vcf_setter_format_gt(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int nsrc = bcf_get_genotypes(args->files->readers[1].header,rec,&args->tmpi,&args->mtmpi); + if ( nsrc==-3 ) return 0; // the tag is not present + if ( nsrc<=0 ) return 1; // error + + // Genotypes are internally represented as integers. This is a complication when + // adding as a different Type=String field, such as FMT/newGT:=GT + if ( strcmp(col->hdr_key_src,col->hdr_key_dst) ) + { + int nsmpl_dst = bcf_hdr_nsamples(args->hdr_out); + int nsmpl_src = bcf_hdr_nsamples(args->files->readers[1].header); + genotypes_to_string(args,nsrc/nsmpl_src,args->tmpi,nsmpl_dst,&args->tmpks); + return bcf_update_format_char(args->hdr_out,line,col->hdr_key_dst,args->tmpks.s,args->tmpks.l); + } + + if ( !args->sample_map ) + return bcf_update_genotypes(args->hdr_out,line,args->tmpi,nsrc); + + int i, j, ndst = bcf_get_genotypes(args->hdr,line,&args->tmpi2,&args->mtmpi2); + if ( ndst > 0 ) ndst /= bcf_hdr_nsamples(args->hdr_out); + nsrc /= bcf_hdr_nsamples(args->files->readers[1].header); + if ( ndst<=0 ) // field not present in dst file + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; + hts_expand(int32_t, nsrc*bcf_hdr_nsamples(args->hdr_out), args->mtmpi2, args->tmpi2); + for (i=0; ihdr_out); i++) + { + int32_t *dst = args->tmpi2 + nsrc*i; + if ( args->sample_map[i]==-1 ) + { + dst[0] = bcf_gt_missing; + for (j=1; jtmpi + nsrc*args->sample_map[i]; + for (j=0; jhdr_out,line,args->tmpi2,nsrc*bcf_hdr_nsamples(args->hdr_out)); + } + else if ( ndst >= nsrc ) + { + for (i=0; ihdr_out); i++) + { + if ( args->sample_map[i]==-1 ) continue; + int32_t *src = args->tmpi + nsrc*args->sample_map[i]; + int32_t *dst = args->tmpi2 + ndst*i; + if ( (col->replace & REPLACE_NON_MISSING) && bcf_gt_is_missing(dst[0]) ) continue; + if ( (col->replace & REPLACE_MISSING) && !bcf_gt_is_missing(dst[0]) ) continue; + for (j=0; jhdr_out,line,args->tmpi2,ndst*bcf_hdr_nsamples(args->hdr_out)); + } + else // ndst < nsrc + { + hts_expand(int32_t, nsrc*bcf_hdr_nsamples(args->hdr_out), args->mtmpi3, args->tmpi3); + for (i=0; ihdr_out); i++) + { + int32_t *ori = args->tmpi2 + ndst*i; + int32_t *dst = args->tmpi3 + nsrc*i; + int keep_ori = 0; + if ( args->sample_map[i]==-1 ) keep_ori = 1; + else if ( (col->replace & REPLACE_NON_MISSING) && bcf_gt_is_missing(ori[0]) ) keep_ori = 1; + else if ( (col->replace & REPLACE_MISSING) && !bcf_gt_is_missing(ori[0]) ) keep_ori = 1; + if ( keep_ori ) + { + for (j=0; jtmpi + nsrc*args->sample_map[i]; + for (j=0; jhdr_out,line,args->tmpi3,nsrc*bcf_hdr_nsamples(args->hdr_out)); + } +} +static int count_vals(annot_line_t *tab, int icol_beg, int icol_end) +{ + int i, nmax = 1; + for (i=icol_beg; icols[i], *end = str; + if ( str[0]=='.' && !str[1] ) + { + // missing value + if ( !nmax ) nmax = 1; + continue; + } + int n = 1; + while ( *end ) + { + if ( *end==',' ) n++; + end++; + } + if ( nmaxsample_map ) + return bcf_update_format_int32(args->hdr_out,line,col->hdr_key_dst,vals,nvals*args->nsmpl_annot); + + int i, j, ndst = bcf_get_format_int32(args->hdr,line,col->hdr_key_dst,&args->tmpi2,&args->mtmpi2); + if ( ndst > 0 ) ndst /= bcf_hdr_nsamples(args->hdr_out); + if ( ndst<=0 ) + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; // overwrite only if present + hts_expand(int32_t, nvals*bcf_hdr_nsamples(args->hdr_out), args->mtmpi2, args->tmpi2); + for (i=0; ihdr_out); i++) + { + int32_t *dst = args->tmpi2 + nvals*i; + if ( args->sample_map[i]==-1 ) + { + dst[0] = bcf_int32_missing; + for (j=1; jsample_map[i]; + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpi2,nvals*bcf_hdr_nsamples(args->hdr_out)); + } + else if ( ndst >= nvals ) + { + for (i=0; ihdr_out); i++) + { + if ( args->sample_map[i]==-1 ) continue; + int32_t *src = vals + nvals*args->sample_map[i]; + int32_t *dst = args->tmpi2 + ndst*i; + // possible cases: + // in annot out + // x y x TAG,-TAG,=TAG .. REPLACE_ALL, REPLACE_NON_MISSING, SET_OR_APPEND + // x y y +TAG .. REPLACE_MISSING + // . y . =TAG .. SET_OR_APPEND + // . y y TAG,+TAG,-TAG .. REPLACE_ALL, REPLACE_MISSING, REPLACE_NON_MISSING + // x . x TAG,+TAG .. REPLACE_ALL, REPLACE_MISSING + // x . . -TAG .. REPLACE_NON_MISSING + if ( col->replace & REPLACE_NON_MISSING ) { if ( dst[0]==bcf_int32_missing ) continue; } + else if ( col->replace & REPLACE_MISSING ) { if ( dst[0]!=bcf_int32_missing ) continue; } + else if ( col->replace & REPLACE_ALL ) { if ( src[0]==bcf_int32_missing ) continue; } + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpi2,ndst*bcf_hdr_nsamples(args->hdr_out)); + } + else // ndst < nvals + { + hts_expand(int32_t, nvals*bcf_hdr_nsamples(args->hdr_out), args->mtmpi3, args->tmpi3); + for (i=0; ihdr_out); i++) + { + int32_t *ann = vals + nvals*args->sample_map[i]; + int32_t *ori = args->tmpi2 + ndst*i; // ori vcf line + int32_t *dst = args->tmpi3 + nvals*i; // expanded buffer + int use_new_ann = 1; + if ( args->sample_map[i]==-1 ) use_new_ann = 0; + else if ( col->replace & REPLACE_NON_MISSING ) { if ( ori[0]==bcf_int32_missing ) use_new_ann = 0; } + else if ( col->replace & REPLACE_MISSING ) { if ( ori[0]!=bcf_int32_missing ) use_new_ann = 0; } + else if ( col->replace & REPLACE_ALL ) { if ( ann[0]==bcf_int32_missing ) use_new_ann = 0; } + if ( !use_new_ann ) + { + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpi3,nvals*bcf_hdr_nsamples(args->hdr_out)); + } +} +static int core_setter_format_real(args_t *args, bcf1_t *line, annot_col_t *col, float *vals, int nvals) +{ + if ( !args->sample_map ) + return bcf_update_format_float(args->hdr_out,line,col->hdr_key_dst,vals,nvals*args->nsmpl_annot); + + int i, j, ndst = bcf_get_format_float(args->hdr,line,col->hdr_key_dst,&args->tmpf2,&args->mtmpf2); + if ( ndst > 0 ) ndst /= bcf_hdr_nsamples(args->hdr_out); + if ( ndst<=0 ) + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; // overwrite only if present + hts_expand(float, nvals*bcf_hdr_nsamples(args->hdr_out), args->mtmpf2, args->tmpf2); + for (i=0; ihdr_out); i++) + { + float *dst = args->tmpf2 + nvals*i; + if ( args->sample_map[i]==-1 ) + { + bcf_float_set_missing(dst[0]); + for (j=1; jsample_map[i]; + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpf2,nvals*bcf_hdr_nsamples(args->hdr_out)); + } + else if ( ndst >= nvals ) + { + for (i=0; ihdr_out); i++) + { + if ( args->sample_map[i]==-1 ) continue; + float *src = vals + nvals*args->sample_map[i]; + float *dst = args->tmpf2 + ndst*i; + if ( col->replace & REPLACE_NON_MISSING ) { if ( bcf_float_is_missing(dst[0]) ) continue; } + else if ( col->replace & REPLACE_MISSING ) { if ( !bcf_float_is_missing(dst[0]) ) continue; } + else if ( col->replace & REPLACE_ALL ) { if ( bcf_float_is_missing(src[0]) ) continue; } + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpf2,ndst*bcf_hdr_nsamples(args->hdr_out)); + } + else // ndst < nvals + { + hts_expand(float, nvals*bcf_hdr_nsamples(args->hdr_out), args->mtmpf3, args->tmpf3); + for (i=0; ihdr_out); i++) + { + float *ann = vals + nvals*args->sample_map[i]; + float *ori = args->tmpf2 + ndst*i; // ori vcf line + float *dst = args->tmpf3 + nvals*i; // expanded buffer + int use_new_ann = 1; + if ( args->sample_map[i]==-1 ) use_new_ann = 0; + else if ( col->replace & REPLACE_NON_MISSING ) { if ( bcf_float_is_missing(ori[0]) ) use_new_ann = 0; } + else if ( col->replace & REPLACE_MISSING ) { if ( !bcf_float_is_missing(ori[0]) ) use_new_ann = 0; } + else if ( col->replace & REPLACE_ALL ) { if ( bcf_float_is_missing(ann[0]) ) use_new_ann = 0; } + if ( !use_new_ann ) + { + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpf3,nvals*bcf_hdr_nsamples(args->hdr_out)); + } +} +static int core_setter_format_str(args_t *args, bcf1_t *line, annot_col_t *col, char **vals) +{ + if ( !args->sample_map ) + return bcf_update_format_string(args->hdr_out,line,col->hdr_key_dst,(const char**)vals,args->nsmpl_annot); + + int i; + args->tmpp2[0] = args->tmps2; + int ret = bcf_get_format_string(args->hdr,line,col->hdr_key_dst,&args->tmpp2,&args->mtmps2); + args->tmps2 = args->tmpp2[0]; // tmps2 might be realloced + + int nsmpl = bcf_hdr_nsamples(args->hdr_out); + if ( ret<=0 ) // not present in dst + { + hts_expand(char,bcf_hdr_nsamples(args->hdr_out)*2,args->mtmps2,args->tmps2); + char *tmp = args->tmps2; + for (i=0; itmpp2[i] = tmp; + tmp += 2; + } + } + for (i=0; isample_map[i]==-1 ) continue; + char **src = vals + args->sample_map[i]; + char **dst = args->tmpp2 + i; + + if ( col->replace & REPLACE_NON_MISSING ) { if ( (*dst)[0]=='.' && (*dst)[1]==0 ) continue; } + else if ( col->replace & REPLACE_MISSING ) { if ( (*dst)[0]!='.' || (*dst)[1]!=0 ) continue; } + else if ( col->replace & REPLACE_ALL ) { if ( (*src)[0]=='.' && (*src)[1]==0 ) continue; } + *dst = *src; + } + return bcf_update_format_string(args->hdr_out,line,col->hdr_key_dst,(const char**)args->tmpp2,nsmpl); +} +static int setter_format_int(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with FORMAT tags (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + if ( col->icol+args->nsmpl_annot > tab->ncols ) + error("Incorrect number of values for %s at %s:%"PRId64"\n",col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + int nvals = count_vals(tab,col->icol,col->icol+args->nsmpl_annot); + hts_expand(int32_t,nvals*args->nsmpl_annot,args->mtmpi,args->tmpi); + + int icol = col->icol, ismpl; + for (ismpl=0; ismplnsmpl_annot; ismpl++) + { + int32_t *ptr = args->tmpi + ismpl*nvals; + int ival = 0; + + char *str = tab->cols[icol]; + while ( *str ) + { + if ( str[0]=='.' && (!str[1] || str[1]==',') ) // missing value + { + ptr[ival++] = bcf_int32_missing; + str += str[1] ? 2 : 1; + continue; + } + + char *end = str; + ptr[ival] = strtol(str, &end, 10); + if ( end==str ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + + ival++; + str = *end ? end+1 : end; + } + while ( ivaltmpi,nvals); +} +static int setter_format_real(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with FORMAT tags (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + if ( col->icol+args->nsmpl_annot > tab->ncols ) + error("Incorrect number of values for %s at %s:%"PRId64"\n",col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + int nvals = count_vals(tab,col->icol,col->icol+args->nsmpl_annot); + hts_expand(float,nvals*args->nsmpl_annot,args->mtmpf,args->tmpf); + + int icol = col->icol, ismpl; + for (ismpl=0; ismplnsmpl_annot; ismpl++) + { + float *ptr = args->tmpf + ismpl*nvals; + int ival = 0; + + char *str = tab->cols[icol]; + while ( *str ) + { + if ( str[0]=='.' && (!str[1] || str[1]==',') ) // missing value + { + bcf_float_set_missing(ptr[ival]); + ival++; + str += str[1] ? 2 : 1; + continue; + } + + char *end = str; + ptr[ival] = strtod(str, &end); + if ( end==str ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + + ival++; + str = *end ? end+1 : end; + } + while ( ivaltmpf,nvals); +} +static int setter_format_str(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with FORMAT tags (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + if ( col->icol+args->nsmpl_annot > tab->ncols ) + error("Incorrect number of values for %s at %s:%"PRId64"\n",col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ismpl; + for (ismpl=0; ismplnsmpl_annot; ismpl++) + args->tmpp[ismpl] = tab->cols[col->icol + ismpl]; + + return core_setter_format_str(args,line,col,args->tmpp); +} +static int determine_ploidy(int nals, int *vals, int nvals1, uint8_t *smpl, int nsmpl) +{ + int i, j, ndip = nals*(nals+1)/2, max_ploidy = 0; + for (i=0; ifiles->readers[1].header,rec,col->hdr_key_src,&args->tmpi,&args->mtmpi); + if ( nsrc==-3 ) return 0; // the tag is not present + if ( nsrc<=0 ) return 1; // error + int nsmpl_src = bcf_hdr_nsamples(args->files->readers[1].header); + int nsrc1 = nsrc / nsmpl_src; + if ( col->number!=BCF_VL_G && col->number!=BCF_VL_R && col->number!=BCF_VL_A ) + return core_setter_format_int(args,line,col,args->tmpi,nsrc1); + + // create mapping from src to dst genotypes, haploid and diploid version + int nmap_hap = col->number==BCF_VL_G || col->number==BCF_VL_R ? rec->n_allele : rec->n_allele - 1; + int *map_hap = vcmp_map_ARvalues(args->vcmp,nmap_hap,line->n_allele,line->d.allele,rec->n_allele,rec->d.allele); + if ( !map_hap ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int i, j; + if ( rec->n_allele==line->n_allele ) + { + // alleles unchanged? + for (i=0; in_allele; i++) if ( map_hap[i]!=i ) break; + if ( i==rec->n_allele ) + return core_setter_format_int(args,line,col,args->tmpi,nsrc1); + } + + int nsmpl_dst = rec->n_sample; + int ndst = bcf_get_format_int32(args->hdr,line,col->hdr_key_dst,&args->tmpi2,&args->mtmpi2); + int ndst1 = ndst / nsmpl_dst; + if ( ndst <= 0 ) + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; // overwrite only if present + if ( col->number==BCF_VL_G ) + ndst1 = line->n_allele*(line->n_allele+1)/2; + else + ndst1 = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + hts_expand(int, ndst1*nsmpl_dst, args->mtmpi2, args->tmpi2); + for (i=0; itmpi2 + i*ndst1; + for (j=0; jnumber==BCF_VL_G ) + { + map_dip = vcmp_map_dipGvalues(args->vcmp, &nmap_dip); + if ( !args->src_smpl_pld ) + { + args->src_smpl_pld = (uint8_t*) malloc(nsmpl_src); + args->dst_smpl_pld = (uint8_t*) malloc(nsmpl_dst); + } + int pld_src = determine_ploidy(rec->n_allele, args->tmpi, nsrc1, args->src_smpl_pld, nsmpl_src); + if ( pld_src<0 ) + error("Unexpected number of %s values (%d) for %d alleles at %s:%"PRId64"\n", col->hdr_key_src,-pld_src, rec->n_allele, bcf_seqname(bcf_sr_get_header(args->files,1),rec),(int64_t) rec->pos+1); + int pld_dst = determine_ploidy(line->n_allele, args->tmpi2, ndst1, args->dst_smpl_pld, nsmpl_dst); + if ( pld_dst<0 ) + error("Unexpected number of %s values (%d) for %d alleles at %s:%"PRId64"\n", col->hdr_key_src,-pld_dst, line->n_allele, bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst1_new = pld_dst==1 ? line->n_allele : line->n_allele*(line->n_allele+1)/2; + if ( ndst1_new != ndst1 ) + { + if ( ndst1 ) error("todo: %s ndst1!=ndst .. %d %d at %s:%"PRId64"\n",col->hdr_key_src,ndst1_new,ndst1,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + ndst1 = ndst1_new; + hts_expand(int32_t, ndst1*nsmpl_dst, args->mtmpi2, args->tmpi2); + } + } + else if ( !ndst1 ) + { + ndst1 = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + hts_expand(int32_t, ndst1*nsmpl_dst, args->mtmpi2, args->tmpi2); + } + + for (i=0; isample_map ? args->sample_map[i] : i; + int32_t *ptr_src = args->tmpi + i*nsrc1; + int32_t *ptr_dst = args->tmpi2 + ii*ndst1; + + if ( col->number==BCF_VL_G ) + { + if ( args->src_smpl_pld[ii] > 0 && args->dst_smpl_pld[i] > 0 && args->src_smpl_pld[ii]!=args->dst_smpl_pld[i] ) + error("Sample ploidy differs at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( !args->dst_smpl_pld[i] ) + for (j=0; jnumber!=BCF_VL_G || args->src_smpl_pld[i]==1 ) + { + for (j=0; j=0 ) ptr_dst[k] = ptr_src[j]; + } + if ( col->number==BCF_VL_G ) + for (j=line->n_allele; j=0 ) ptr_dst[k] = ptr_src[j]; + } + } + } + return bcf_update_format_int32(args->hdr_out,line,col->hdr_key_dst,args->tmpi2,nsmpl_dst*ndst1); +} +static int vcf_setter_format_real(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int nsrc = bcf_get_format_float(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmpf,&args->mtmpf); + if ( nsrc==-3 ) return 0; // the tag is not present + if ( nsrc<=0 ) return 1; // error + int nsmpl_src = bcf_hdr_nsamples(args->files->readers[1].header); + int nsrc1 = nsrc / nsmpl_src; + if ( col->number!=BCF_VL_G && col->number!=BCF_VL_R && col->number!=BCF_VL_A ) + return core_setter_format_real(args,line,col,args->tmpf,nsrc1); + + // create mapping from src to dst genotypes, haploid and diploid version + int nmap_hap = col->number==BCF_VL_G || col->number==BCF_VL_R ? rec->n_allele : rec->n_allele - 1; + int *map_hap = vcmp_map_ARvalues(args->vcmp,nmap_hap,line->n_allele,line->d.allele,rec->n_allele,rec->d.allele); + if ( !map_hap ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int i, j; + if ( rec->n_allele==line->n_allele ) + { + // alleles unchanged? + for (i=0; in_allele; i++) if ( map_hap[i]!=i ) break; + if ( i==rec->n_allele ) + return core_setter_format_real(args,line,col,args->tmpf,nsrc1); + } + + int nsmpl_dst = rec->n_sample; + int ndst = bcf_get_format_float(args->hdr,line,col->hdr_key_dst,&args->tmpf2,&args->mtmpf2); + int ndst1 = ndst / nsmpl_dst; + if ( ndst <= 0 ) + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; // overwrite only if present + if ( col->number==BCF_VL_G ) + ndst1 = line->n_allele*(line->n_allele+1)/2; + else + ndst1 = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + hts_expand(float, ndst1*nsmpl_dst, args->mtmpf2, args->tmpf2); + for (i=0; itmpf2 + i*ndst1; + for (j=0; jnumber==BCF_VL_G ) + { + map_dip = vcmp_map_dipGvalues(args->vcmp, &nmap_dip); + if ( !args->src_smpl_pld ) + { + args->src_smpl_pld = (uint8_t*) malloc(nsmpl_src); + args->dst_smpl_pld = (uint8_t*) malloc(nsmpl_dst); + } + int pld_src = determine_ploidy(rec->n_allele, args->tmpi, nsrc1, args->src_smpl_pld, nsmpl_src); + if ( pld_src<0 ) + error("Unexpected number of %s values (%d) for %d alleles at %s:%"PRId64"\n", col->hdr_key_src,-pld_src, rec->n_allele, bcf_seqname(bcf_sr_get_header(args->files,1),rec),(int64_t) rec->pos+1); + int pld_dst = determine_ploidy(line->n_allele, args->tmpi2, ndst1, args->dst_smpl_pld, nsmpl_dst); + if ( pld_dst<0 ) + error("Unexpected number of %s values (%d) for %d alleles at %s:%"PRId64"\n", col->hdr_key_src,-pld_dst, line->n_allele, bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst1_new = pld_dst==1 ? line->n_allele : line->n_allele*(line->n_allele+1)/2; + if ( ndst1_new != ndst1 ) + { + if ( ndst1 ) error("todo: %s ndst1!=ndst .. %d %d at %s:%"PRId64"\n",col->hdr_key_src,ndst1_new,ndst1,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + ndst1 = ndst1_new; + hts_expand(float, ndst1*nsmpl_dst, args->mtmpf2, args->tmpf2); + } + } + else if ( !ndst1 ) + { + ndst1 = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + hts_expand(float, ndst1*nsmpl_dst, args->mtmpf2, args->tmpf2); + } + + for (i=0; isample_map ? args->sample_map[i] : i; + float *ptr_src = args->tmpf + i*nsrc1; + float *ptr_dst = args->tmpf2 + ii*ndst1; + + if ( col->number==BCF_VL_G ) + { + if ( args->src_smpl_pld[ii] > 0 && args->dst_smpl_pld[i] > 0 && args->src_smpl_pld[ii]!=args->dst_smpl_pld[i] ) + error("Sample ploidy differs at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( !args->dst_smpl_pld[i] ) + for (j=0; jnumber!=BCF_VL_G || args->src_smpl_pld[i]==1 ) + { + for (j=0; j=0 ) + { + if ( bcf_float_is_missing(ptr_src[j]) ) bcf_float_set_missing(ptr_dst[k]); + else if ( bcf_float_is_vector_end(ptr_src[j]) ) bcf_float_set_vector_end(ptr_dst[k]); + else ptr_dst[k] = ptr_src[j]; + } + } + if ( col->number==BCF_VL_G ) + for (j=line->n_allele; j=0 ) + { + if ( bcf_float_is_missing(ptr_src[j]) ) bcf_float_set_missing(ptr_dst[k]); + else if ( bcf_float_is_vector_end(ptr_src[j]) ) bcf_float_set_vector_end(ptr_dst[k]); + else ptr_dst[k] = ptr_src[j]; + } + } + } + } + return bcf_update_format_float(args->hdr_out,line,col->hdr_key_dst,args->tmpf2,nsmpl_dst*ndst1); +} + +static int vcf_setter_format_str(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + args->tmpp[0] = args->tmps; + int ret = bcf_get_format_string(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmpp,&args->mtmps); + args->tmps = args->tmpp[0]; // tmps might be realloced + if ( ret==-3 ) return 0; // the tag is not present + if ( ret<=0 ) return 1; // error + if ( strcmp("GT",col->hdr_key_dst) ) + return core_setter_format_str(args,line,col,args->tmpp); + + // Genotypes are internally represented as integers. This is a complication for FMT/GT:=oldGT + // First determine the maximum number of alleles per-sample ndst1 + int nsmpl_src = bcf_hdr_nsamples(args->files->readers[1].header); + int nsmpl_dst = bcf_hdr_nsamples(args->hdr_out); + int isrc,idst, ndst1 = 0, nsrc1 = ret / nsmpl_src; + char *ptr = args->tmps, *ptr_end = ptr + ret; + while ( ptr < ptr_end ) + { + char *smpl_end = ptr + nsrc1; + int n = 1; + while ( ptr < smpl_end ) + { + if ( *ptr=='/' || *ptr=='|' ) n++; + ptr++; + } + if ( ndst1 < n ) ndst1 = n; + } + assert( ndst1 ); + + int ndst = ndst1*nsmpl_dst; + hts_expand(int32_t,ndst,args->mtmpi,args->tmpi); + hts_expand(char,ret+1,args->mtmps,args->tmps); args->tmps[ret] = 0; // the FORMAT string may not be 0-terminated + for (idst=0; idsttmpi + idst*ndst1; + isrc = args->sample_map ? args->sample_map[idst] : idst; + if ( isrc==-1 ) + { + dst[0] = bcf_gt_missing; + for (i=1; itmps + isrc*nsrc1, *tmp; + char *keep_ptr = beg+nsrc1, keep = *keep_ptr; *keep_ptr = 0; + while ( *beg ) + { + char *end = beg; + while ( *end && *end!='/' && *end!='|' ) end++; + if ( *beg=='.' && end-beg==1 ) dst[i] = bcf_gt_missing; + else + { + if ( *end=='|' ) is_phased = 1; + dst[i] = strtol(beg, &tmp, 10); + if ( tmp!=end ) + error("Could not parse the %s field at %s:%"PRId64" in %s\n", col->hdr_key_src,bcf_seqname(args->files->readers[1].header,rec),(int64_t) rec->pos+1,args->targets_fname); + if ( dst[i] >= line->n_allele ) + error("The source allele index is bigger than the number of destination alleles at %s:%"PRId64"\n", bcf_seqname(args->files->readers[1].header,rec),(int64_t) rec->pos+1); + dst[i] = is_phased ? bcf_gt_phased(dst[i]) : bcf_gt_unphased(dst[i]); + } + beg = *end ? end+1 : end; + i++; + } + *keep_ptr = keep; + for (; ihdr_out,line,args->tmpi,ndst); +} +static int init_sample_map(args_t *args, bcf_hdr_t *src, bcf_hdr_t *dst) +{ + int i; + if ( !args->sample_names ) + { + args->nsmpl_annot = bcf_hdr_nsamples(dst); + + // tab annotation file, expecting that all samples are present: sample map not needed + if ( !src ) return 0; + + int nmatch = 0; + for (i=0; isamples[i]); + if ( id!=-1 ) nmatch++; + } + if ( !nmatch ) return -1; // No matching samples found in the source and the destination file + + args->nsample_map = bcf_hdr_nsamples(dst); + args->sample_map = (int*) malloc(sizeof(int)*args->nsample_map); + for (i=0; insample_map; i++) + { + int id = bcf_hdr_id2int(src, BCF_DT_SAMPLE, dst->samples[i]); + args->sample_map[i] = id; // idst -> isrc, -1 if not present + } + return 1; + } + + args->nsample_map = bcf_hdr_nsamples(dst); + args->sample_map = (int*) malloc(sizeof(int)*args->nsample_map); + for (i=0; insample_map; i++) args->sample_map[i] = -1; + + int flags = !src ? SMPL_STRICT|SMPL_SINGLE : SMPL_STRICT|SMPL_SINGLE|SMPL_PAIR2; // is vcf vs tab annotation file + smpl_ilist_t *ilist = smpl_ilist_init(dst, args->sample_names, args->sample_is_file, flags); // gives mapping dst->src + if ( !ilist || !ilist->n ) error("Could not parse the samples: %s\n", args->sample_names); + args->nsmpl_annot = ilist->n; + int need_sample_map = args->nsmpl_annot==bcf_hdr_nsamples(dst) ? 0 : 1; + for (i=0; insmpl_annot; i++) + { + int idst = ilist->idx[i]; + const char *src_name = ilist->pair && ilist->pair[i] ? ilist->pair[i] : bcf_hdr_int2id(dst, BCF_DT_SAMPLE, idst); + int isrc = i; + if ( src ) // the annotation file is a VCF, not a tab-delimited file + { + isrc = bcf_hdr_id2int(src, BCF_DT_SAMPLE, src_name); + if ( isrc==-1 ) error("Sample \"%s\" not found in the annotation file\n", src_name); + } + if ( isrc!=idst ) need_sample_map = 1; + args->sample_map[idst] = isrc; + } + smpl_ilist_destroy(ilist); + return need_sample_map; +} +static char *columns_complement(char *columns, void **skip_info, void **skip_fmt) +{ + kstring_t str = {0,0,0}; + char *ss = columns, *se = ss; + while ( *ss ) + { + if ( *se && *se!=',' ) { se++; continue; } + if ( *ss!='^' ) + { + if ( str.l ) kputc(',',&str); + kputsn(ss, se-ss, &str); + if ( !*se ) break; + ss = ++se; + continue; + } + + if ( !strncasecmp("^INFO/",ss,6) ) + { + if ( !*skip_info ) + { + *skip_info = khash_str2int_init(); + if ( str.l ) kputc(',',&str); + kputs("INFO",&str); + } + char tmp = *se; *se = 0; + khash_str2int_inc(*skip_info, strdup(ss+6)); + *se = tmp; + } + else if ( !strncasecmp("^FORMAT/",ss,8) || !strncasecmp("^FMT/",ss,5) ) + { + int n = !strncasecmp("^FMT/",ss,5) ? 5 : 8; + if ( !*skip_fmt ) + { + *skip_fmt = khash_str2int_init(); + if ( str.l ) kputc(',',&str); + kputs("FORMAT",&str); + } + char tmp = *se; *se = 0; + khash_str2int_inc(*skip_fmt, strdup(ss+n)); + *se = tmp; + } + else + { + if ( !*skip_info ) + { + *skip_info = khash_str2int_init(); + if ( str.l ) kputc(',',&str); + kputs("INFO",&str); + } + char tmp = *se; *se = 0; + khash_str2int_inc(*skip_info, strdup(ss+1)); + *se = tmp; + } + + if ( !*se ) break; + ss = ++se; + } + free(columns); + return str.s; +} +static void bcf_hrec_format_rename(bcf_hrec_t *hrec, char *tag, kstring_t *str) +{ + int j, nout = 0; + ksprintf(str, "##%s=<", hrec->key); + for (j=0; jnkeys; j++) + { + if ( !strcmp("IDX",hrec->keys[j]) ) continue; + if ( nout ) kputc(',',str); + if ( !strcmp("ID", hrec->keys[j]) ) + ksprintf(str,"%s=%s", hrec->keys[j], tag); + else + ksprintf(str,"%s=%s", hrec->keys[j], hrec->vals[j]); + nout++; + } + ksprintf(str,">\n"); +} +static char *set_replace_mode(char *ss, int *replace) +{ + int mode = 0; + while (*ss) + { + if ( *ss=='+' ) mode |= REPLACE_MISSING; + else if ( *ss=='-' ) mode |= REPLACE_NON_MISSING; + else if ( *ss=='=' ) mode |= SET_OR_APPEND; + else if ( *ss=='.' ) mode |= CARRY_OVER_MISSING; + else break; + ss++; + } + if ( !mode ) mode = REPLACE_ALL; +// is exactly one bit set? +// if ( mode && !(mode && ((mode & mode-1) == 0)) ) + *replace = mode; + return ss; +} +static void rename_annots_push(args_t *args, char *src, char *dst); +static void init_columns(args_t *args) +{ + int need_sample_map = 0; + int sample_map_ok = init_sample_map(args, args->tgts_is_vcf?args->files->readers[1].header:NULL, args->hdr); + + kstring_t tmp = {0,0,0}; + if ( args->columns_is_file ) + { + int i,n; + char **str = hts_readlist(args->columns, args->columns_is_file, &n); + if ( !str ) error("Could not parse %s\n", args->columns); + for (i=0; imerge_method_str.l ) kputc(',',&args->merge_method_str); + kputs(str[i],&args->merge_method_str); + kputc(':',&args->merge_method_str); + kputs(ptr,&args->merge_method_str); + } + } + if ( tmp.l ) kputc(',',&tmp); + kputs(str[i],&tmp); + free(str[i]); + } + free(str); + free(args->columns); + args->columns = tmp.s; + tmp.l = tmp.m = 0; + tmp.s = NULL; + } + + void *skip_fmt = NULL, *skip_info = NULL; + if ( args->tgts_is_vcf ) + args->columns = columns_complement(args->columns, &skip_info, &skip_fmt); + + kstring_t str = {0,0,0}; + char *ss = args->columns, *se = ss; + args->ncols = 0; + int icol = -1, has_fmt_str = 0; + while ( *ss ) + { + char *ptr; + if ( *se && *se!=',' ) { se++; continue; } + int replace; + ss = set_replace_mode(ss, &replace); + icol++; + str.l = 0; + kputsn(ss, se-ss, &str); + if ( !str.s[0] || !strcasecmp("-",str.s) ) ; + else if ( !strcasecmp("CHROM",str.s) ) args->chr_idx = icol; + else if ( !strcasecmp("POS",str.s) ) args->beg_idx = icol; + else if ( !strcasecmp("FROM",str.s) || !strcasecmp("BEG",str.s) ) args->beg_idx = icol; + else if ( !strcasecmp("TO",str.s) || !strcasecmp("END",str.s) ) args->end_idx = icol; + else if ( !strcasecmp("REF",str.s) ) + { + if ( args->tgts_is_vcf ) + { + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->setter = vcf_setter_ref; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + } + else args->ref_idx = icol; + } + else if ( !strcasecmp("ALT",str.s) ) + { + if ( args->tgts_is_vcf ) + { + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->setter = vcf_setter_alt; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + col->replace = replace; + if ( args->pair_logic==-1 ) bcf_sr_set_opt(args->files,BCF_SR_PAIR_LOGIC,BCF_SR_PAIR_BOTH_REF); + } + else args->alt_idx = icol; + } + else if ( !strcasecmp("ID",str.s) || !strcasecmp("~ID",str.s) ) + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -ID feature has not been implemented yet.\n"); + if ( str.s[0]=='~' ) replace = MATCH_VALUE; + if ( args->tgts_is_vcf && (replace & MATCH_VALUE) ) error("todo: -c ~ID with -a VCF?\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = args->tgts_is_vcf ? vcf_setter_id : setter_id; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + if ( replace & MATCH_VALUE ) args->match_id = icol; + } + else if ( !strcasecmp("~INFO/END",str.s) && !args->tgts_is_vcf ) + { + replace = MATCH_VALUE; + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = NULL; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + args->match_end = icol; + } + else if ( !strcasecmp("~POS",str.s) && !args->tgts_is_vcf ) + { + if ( args->tgts_is_vcf ) error("Error: cannot use ~POS, position can be replaced only from a tab-delimited file\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = setter_pos; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + args->match_end = icol; + } + else if ( !strncasecmp("ID:=",str.s,4) ) // transfer a tag from INFO to ID column + { + if ( !args->tgts_is_vcf ) error("The annotation source must be a VCF for \"%s\"\n",str.s); + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -ID feature has not been implemented yet.\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = vcf_setter_id; + col->getter = vcf_getter_info_str2str; + str.s[2] = 0; + col->hdr_key_dst = strdup(str.s); + col->hdr_key_src = strncasecmp("INFO/",str.s+4,5) ? strdup(str.s+4) : strdup(str.s+4+5); + int hdr_id = bcf_hdr_id2int(args->tgts_hdr, BCF_DT_ID,col->hdr_key_src); + if ( !bcf_hdr_idinfo_exists(args->tgts_hdr,BCF_HL_INFO,hdr_id) ) + error("The INFO tag \"%s\" is not defined in %s\n", col->hdr_key_src, args->targets_fname); + if ( bcf_hdr_id2type(args->tgts_hdr,BCF_HL_INFO,hdr_id)!=BCF_HT_STR ) + error("Only Type=String tags can be used to annotate the ID column\n"); + } + else if ( (ptr=strstr(str.s,":=")) && !args->targets_fname ) + { + *ptr = 0; + rename_annots_push(args,ptr+2,str.s); + *ptr = ':'; + } + else if ( !strcasecmp("FILTER",str.s) ) + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -FILTER feature has not been implemented yet.\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = args->tgts_is_vcf ? vcf_setter_filter : setter_filter; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + if ( args->tgts_is_vcf ) + { + bcf_hdr_t *tgts_hdr = args->files->readers[1].header; + int j; + for (j=0; jnhrec; j++) + { + bcf_hrec_t *hrec = tgts_hdr->hrec[j]; + if ( hrec->type!=BCF_HL_FLT ) continue; + int k = bcf_hrec_find_key(hrec,"ID"); + if ( k<0 ) error("[%s] Failed to parse the header, the ID attribute not found", __func__); + tmp.l = 0; + bcf_hrec_format(hrec, &tmp); + bcf_hdr_append(args->hdr_out, tmp.s); + } + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + } + } + else if ( !strcasecmp("QUAL",str.s) ) + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -QUAL feature has not been implemented yet.\n"); + if ( replace & SET_OR_APPEND ) error("Apologies, the =QUAL feature has not been implemented yet.\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = args->tgts_is_vcf ? vcf_setter_qual : setter_qual; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + } + else if ( args->tgts_is_vcf && !strcasecmp("INFO",str.s) ) // All INFO fields + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -INFO/TAG feature has not been implemented yet.\n"); + if ( replace & SET_OR_APPEND ) error("Apologies, the =INFO feature has not been implemented yet.\n"); + bcf_hdr_t *tgts_hdr = args->files->readers[1].header; + int j; + for (j=0; jnhrec; j++) + { + bcf_hrec_t *hrec = tgts_hdr->hrec[j]; + if ( hrec->type!=BCF_HL_INFO ) continue; + int k = bcf_hrec_find_key(hrec,"ID"); + assert( k>=0 ); // this should always be true for valid VCFs + if ( skip_info && khash_str2int_has_key(skip_info,hrec->vals[k]) ) continue; + tmp.l = 0; + bcf_hrec_format(hrec, &tmp); + bcf_hdr_append(args->hdr_out, tmp.s); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + int hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, hrec->vals[k]); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = -1; + col->replace = replace; + col->hdr_key_src = strdup(hrec->vals[k]); + col->hdr_key_dst = strdup(hrec->vals[k]); + col->number = bcf_hdr_id2length(args->hdr_out,BCF_HL_INFO,hdr_id); + switch ( bcf_hdr_id2type(args->hdr_out,BCF_HL_INFO,hdr_id) ) + { + case BCF_HT_FLAG: col->setter = vcf_setter_info_flag; break; + case BCF_HT_INT: col->setter = vcf_setter_info_int; break; + case BCF_HT_REAL: col->setter = vcf_setter_info_real; break; + case BCF_HT_STR: col->setter = vcf_setter_info_str; break; + default: error("The type of %s not recognised (%d)\n", str.s,bcf_hdr_id2type(args->hdr_out,BCF_HL_INFO,hdr_id)); + } + } + } + else if ( args->tgts_is_vcf && (!strcasecmp("FORMAT",str.s) || !strcasecmp("FMT",str.s)) ) // All FORMAT fields + { + bcf_hdr_t *tgts_hdr = args->files->readers[1].header; + need_sample_map = 1; + int j; + for (j=0; jnhrec; j++) + { + bcf_hrec_t *hrec = tgts_hdr->hrec[j]; + if ( hrec->type!=BCF_HL_FMT) continue; + int k = bcf_hrec_find_key(hrec,"ID"); + assert( k>=0 ); // this should always be true for valid VCFs + if ( skip_fmt && khash_str2int_has_key(skip_fmt,hrec->vals[k]) ) continue; + tmp.l = 0; + bcf_hrec_format(hrec, &tmp); + bcf_hdr_append(args->hdr_out, tmp.s); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + int hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, hrec->vals[k]); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = -1; + col->replace = replace; + col->hdr_key_src = strdup(hrec->vals[k]); + col->hdr_key_dst = strdup(hrec->vals[k]); + if ( !strcasecmp("GT",col->hdr_key_src) ) + { + if ( !args->tgts_is_vcf ) error("The FORMAT/GT field can be currently populated only from a VCF\n"); + col->setter = vcf_setter_format_gt; + } + else + switch ( bcf_hdr_id2type(args->hdr_out,BCF_HL_FMT,hdr_id) ) + { + case BCF_HT_INT: col->setter = vcf_setter_format_int; break; + case BCF_HT_REAL: col->setter = vcf_setter_format_real; break; + case BCF_HT_STR: col->setter = vcf_setter_format_str; has_fmt_str = 1; break; + default: error("The type of %s not recognised (%d)\n", str.s,bcf_hdr_id2type(args->hdr_out,BCF_HL_FMT,hdr_id)); + } + hdr_id = bcf_hdr_id2int(tgts_hdr, BCF_DT_ID, hrec->vals[k]); + col->number = bcf_hdr_id2length(tgts_hdr,BCF_HL_FMT,hdr_id); + } + } + else if ( !strncasecmp("FORMAT/",str.s, 7) || !strncasecmp("FMT/",str.s,4) ) + { + char *key_dst = str.s + (!strncasecmp("FMT/",str.s,4) ? 4 : 7); + char *key_src = strstr(key_dst,":="); + if ( key_src ) + { + *key_src = 0; + key_src += 2; + if ( !strncasecmp("FORMAT/",key_src,7) ) key_src += 7; + else if ( !strncasecmp("FMT/",key_src,4) ) key_src += 4; + } + else + key_src = key_dst; + need_sample_map = 1; + if ( args->tgts_is_vcf ) + { + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->files->readers[1].header, BCF_HL_FMT, "ID", key_src, NULL); + if ( !hrec ) error("No such annotation \"%s\" in %s\n", key_src,args->targets_fname); + tmp.l = 0; + bcf_hrec_format_rename(hrec, key_dst, &tmp); + bcf_hdr_append(args->hdr_out, tmp.s); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + } + int hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, key_dst); + if ( !bcf_hdr_idinfo_exists(args->hdr_out,BCF_HL_FMT,hdr_id) ) + error("The FORMAT tag \"%s\" is not defined in %s, was the -h option provided?\n", str.s, args->targets_fname); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + if ( !args->tgts_is_vcf ) + { + col->icol = icol; + icol += args->nsmpl_annot - 1; + } + else + col->icol = -1; + col->replace = replace; + col->hdr_key_src = strdup(key_src); + col->hdr_key_dst = strdup(key_dst); + if ( !strcasecmp("GT",key_src) ) + { + if ( !args->tgts_is_vcf ) error("The FORMAT/GT field can be currently populated only from a VCF\n"); + col->setter = vcf_setter_format_gt; + } + else + switch ( bcf_hdr_id2type(args->hdr_out,BCF_HL_FMT,hdr_id) ) + { + case BCF_HT_INT: col->setter = args->tgts_is_vcf ? vcf_setter_format_int : setter_format_int; break; + case BCF_HT_REAL: col->setter = args->tgts_is_vcf ? vcf_setter_format_real : setter_format_real; break; + case BCF_HT_STR: col->setter = args->tgts_is_vcf ? vcf_setter_format_str : setter_format_str; has_fmt_str = 1; break; + default: error("The type of %s not recognised (%d)\n", str.s,bcf_hdr_id2type(args->hdr_out,BCF_HL_FMT,hdr_id)); + } + if ( args->tgts_is_vcf ) + { + bcf_hdr_t *tgts_hdr = args->files->readers[1].header; + hdr_id = bcf_hdr_id2int(tgts_hdr, BCF_DT_ID, col->hdr_key_src); + col->number = bcf_hdr_id2length(tgts_hdr,BCF_HL_FMT,hdr_id); + } + } + else + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -INFO/TAG feature has not been implemented yet.\n"); + if ( replace & SET_OR_APPEND ) + { + if ( args->tgts_is_vcf ) + error("Error: the =INFO/TAG feature is currently supported only with TAB annotation files and has limitations\n" + " (the annotation type is modified to \"Number=.\" and allele ordering is disregarded)\n"); + fprintf(stderr,"Warning: the =INFO/TAG feature modifies the annotation to \"Number=.\" and disregards allele ordering\n"); + } + int explicit_src_info = 0; + int explicit_dst_info = 0; + char *key_dst; + if ( !strncasecmp("INFO/",str.s,5) ) + { + key_dst = str.s + 5; + explicit_dst_info = 1; + } + else if ( !strcasecmp("~INFO/END",str.s) ) + { + key_dst = str.s + 6; + explicit_dst_info = 1; + } + else + key_dst = str.s; + char *key_src = strstr(key_dst,":="); + if ( key_src ) + { + *key_src = 0; + key_src += 2; + if ( !strncasecmp("INFO/",key_src,5) ) + { + key_src += 5; + explicit_src_info = 1; + } + else if ( !strncasecmp("FMT/",key_src,4) || !strncasecmp("FORMAT/",key_src,5) ) + { + key_src[-2] = ':'; + error("Did you mean \"FMT/%s\" rather than \"%s\"?\n",str.s,str.s); + } + } + else + key_src = key_dst; + + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->hdr_key_src = strdup(key_src); + col->hdr_key_dst = strdup(key_dst); + + int hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, key_dst); + if ( !bcf_hdr_idinfo_exists(args->hdr_out,BCF_HL_INFO,hdr_id) ) + { + if ( args->tgts_is_vcf ) // reading annotations from a VCF, add a new header line + { + if ( !strcasecmp("ID",key_src) && !explicit_src_info ) + { + // transferring ID column into a new INFO tag + tmp.l = 0; + ksprintf(&tmp,"##INFO=",key_dst); + } + else if ( !strcasecmp("FILTER",key_src) && !explicit_src_info ) + { + // transferring FILTER column into a new INFO tag + tmp.l = 0; + ksprintf(&tmp,"##INFO=",key_dst); + } + else + { + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->files->readers[1].header, BCF_HL_INFO, "ID", key_src, NULL); + if ( !hrec ) + { + if ( explicit_dst_info+explicit_src_info==0 && bcf_hdr_get_hrec(args->files->readers[1].header, BCF_HL_FMT, "ID", key_src, NULL) ) + error("Did you mean \"FMT/%s\" rather than \"%s\"?\n",str.s,str.s); + char *ptr = strchr(key_src,'='); + if ( ptr ) + { + *ptr = 0; tmp.l = 0; ksprintf(&tmp,"%s:=%s",key_src,ptr+1); *ptr = '='; + error("The INFO tag \"%s\" is not defined, is this what you want \"%s\" ?\n",key_src,tmp.s); + } + error("The INFO tag \"%s\" is not defined in %s, was the -h option provided?\n", key_src,args->files->readers[1].fname); + } + tmp.l = 0; + bcf_hrec_format_rename(hrec, key_dst, &tmp); + } + bcf_hdr_append(args->hdr_out, tmp.s); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, key_dst); + } + else + error("The INFO tag \"%s\" is not defined in %s, was the -h option provided?\n", key_dst, args->targets_fname); + assert( bcf_hdr_idinfo_exists(args->hdr_out,BCF_HL_INFO,hdr_id) ); + } + if ( args->tgts_is_vcf ) + { + if ( !strcasecmp("ID",key_src) && !explicit_src_info ) col->getter = vcf_getter_id2str; + else if ( !strcasecmp("FILTER",key_src) && !explicit_src_info ) col->getter = vcf_getter_filter2str; + } + col->number = bcf_hdr_id2length(args->hdr_out,BCF_HL_INFO,hdr_id); + switch ( bcf_hdr_id2type(args->hdr_out,BCF_HL_INFO,hdr_id) ) + { + case BCF_HT_FLAG: col->setter = args->tgts_is_vcf ? vcf_setter_info_flag : setter_info_flag; break; + case BCF_HT_INT: col->setter = args->tgts_is_vcf ? vcf_setter_info_int : setter_info_int; break; + case BCF_HT_REAL: col->setter = args->tgts_is_vcf ? vcf_setter_info_real : setter_info_real; break; + case BCF_HT_STR: col->setter = args->tgts_is_vcf ? vcf_setter_info_str : setter_info_str; break; + default: error("The type of %s not recognised (%d)\n", str.s,bcf_hdr_id2type(args->hdr_out,BCF_HL_INFO,hdr_id)); + } + if ( replace & SET_OR_APPEND ) // change to Number=. + { + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->hdr_out, BCF_HL_INFO, "ID", key_dst, NULL); + if ( !hrec ) error("Uh, could not find the new tag \"%s\" in the header\n", key_dst); + hrec = bcf_hrec_dup(hrec); + int j = bcf_hrec_find_key(hrec, "Number"); + if ( j<0 ) error("Uh, could not find the entry Number in the header record of %s\n",key_dst); + free(hrec->vals[j]); + hrec->vals[j] = strdup("."); + bcf_hdr_remove(args->hdr_out,BCF_HL_INFO, key_dst); + bcf_hdr_add_hrec(args->hdr_out, hrec); + } + } + if ( !*se ) break; + ss = ++se; + } + free(str.s); + free(tmp.s); + free(args->columns); + if ( skip_info ) khash_str2int_destroy_free(skip_info); + if ( skip_fmt ) khash_str2int_destroy_free(skip_fmt); + if ( has_fmt_str ) + { + int n = bcf_hdr_nsamples(args->hdr_out); + if ( args->tgts_is_vcf && nfiles->readers[1].header) ) n = bcf_hdr_nsamples(args->files->readers[1].header); + args->tmpp = (char**)malloc(sizeof(char*)*n); + args->tmpp2 = (char**)malloc(sizeof(char*)*n); + } + if ( !need_sample_map ) + { + free(args->sample_map); + args->sample_map = NULL; + } + else if ( sample_map_ok<0 ) + error("No matching samples in source and destination file?\n"); +} +static void init_merge_method(args_t *args) +{ + int i; + for (i=0; incols; i++) + { + args->cols[i].merge_method = MM_FIRST; + args->cols[i].mm_str_hash = NULL; + args->cols[i].mm_dbl = NULL; + args->cols[i].mm_dbl_nalloc = args->cols[i].mm_dbl_nused = args->cols[i].mm_dbl_ndat = 0; + memset(&args->cols[i].mm_kstr, 0, sizeof(args->cols[i].mm_kstr)); + } + if ( !args->merge_method_str.l ) return; + if ( args->tgts_is_vcf ) error("Error: the --merge-logic is intended for use with BED or TAB-delimited files only.\n"); + if ( !args->tgt_idx && !args->tgts ) error("Error: BEG,END (or FROM,TO) columns or REF,ALT columns are expected with the --merge-logic option.\n"); + char *sb = args->merge_method_str.s; + while ( *sb ) + { + char *se = sb; + while ( *se && *se!=',' ) se++; + args->tmpks.l = 0; + kputsn(sb, se-sb, &args->tmpks); + kputc(0, &args->tmpks); + char *mm_type_str = args->tmpks.s + args->tmpks.l; + while ( *mm_type_str!=':' && mm_type_str > args->tmpks.s ) mm_type_str--; + if ( *mm_type_str!=':' ) + error("Error: could not parse the argument to --merge-logic: %s\n", args->merge_method_str.s); + *mm_type_str = 0; + mm_type_str++; + int mm_type = MM_FIRST; + if ( !strcasecmp("unique",mm_type_str) ) mm_type = MM_UNIQUE; + else if ( !strcasecmp("first",mm_type_str) ) mm_type = MM_FIRST; + else if ( !strcasecmp("append",mm_type_str) ) mm_type = MM_APPEND; + else if ( !strcasecmp("append-missing",mm_type_str) ) + { + mm_type = MM_APPEND_MISSING; + if ( args->ref_idx!=-1 ) args->has_append_mode = 1; + } + else if ( !strcasecmp("sum",mm_type_str) ) mm_type = MM_SUM; + else if ( !strcasecmp("avg",mm_type_str) ) mm_type = MM_AVG; + else if ( !strcasecmp("min",mm_type_str) ) mm_type = MM_MIN; + else if ( !strcasecmp("max",mm_type_str) ) mm_type = MM_MAX; + else error("Error: could not parse --merge-logic %s, the logic \"%s\" is not recognised\n", args->merge_method_str.s,mm_type_str); + for (i=0; incols; i++) + { + if ( strcmp(args->cols[i].hdr_key_dst,args->tmpks.s) ) continue; + if ( (mm_type==MM_APPEND || mm_type==MM_APPEND_MISSING) && args->cols[i].number!=BCF_VL_VAR ) + error("Error: --merge-logic append can be requested only for tags of variable length (Number=.)\n"); + args->cols[i].merge_method = mm_type; + break; + } + if ( i==args->ncols ) error("No such tag in the destination file: %s\n", args->tmpks.s); + sb = *se ? se + 1 : se; + } + if ( args->has_append_mode ) + { + // create a missing line to insert missing values when VCF ALT finds no match in the annotation file + args->aline_missing = (annot_line_t*)calloc(1,sizeof(*args->aline_missing)); + int ncol = 0; + for (i=0; incols; i++) + if ( ncol < args->cols[i].icol + 1 ) ncol = args->cols[i].icol + 1; + if ( ncol < args->ref_idx + 1 ) ncol = args->ref_idx + 1; + args->aline_missing->mcols = ncol; + args->aline_missing->ncols = ncol; + args->aline_missing->cols = (char**) malloc(ncol*sizeof(char*)); + for (i=0; ialine_missing->cols[i] = strdup("."); + } +} + +static void rename_chrs(args_t *args, char *fname) +{ + int n, i; + char **map = hts_readlist(fname, 1, &n); + if ( !map ) error("Could not read: %s\n", fname); + for (i=0; ihdr_out, map[i]); + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->hdr_out, BCF_HL_CTG, "ID", map[i], NULL); + if ( !hrec ) continue; // the sequence not present + int j = bcf_hrec_find_key(hrec, "ID"); + assert( j>=0 ); + free(hrec->vals[j]); + ss++; + while ( *ss && isspace(*ss) ) ss++; + char *se = ss; + while ( *se && !isspace(*se) ) se++; + *se = 0; + hrec->vals[j] = strdup(ss); + args->hdr_out->id[BCF_DT_CTG][rid].key = hrec->vals[j]; + } + for (i=0; ihdr_out, BCF_DT_ID, ori_tag); + if ( id<0 ) return 1; + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->hdr_out, type, "ID", ori_tag, NULL); + if ( !hrec ) return 1; // the ID attribute not present + int j = bcf_hrec_find_key(hrec, "ID"); + assert( j>=0 ); + free(hrec->vals[j]); + char *ptr = new_tag; + while ( *ptr && !isspace(*ptr) ) ptr++; + *ptr = 0; + hrec->vals[j] = strdup(new_tag); + args->hdr_out->id[BCF_DT_ID][id].key = hrec->vals[j]; + return 0; +} +static void rename_annots(args_t *args) +{ + int i; + if ( args->rename_annots ) + { + args->rename_annots_map = hts_readlist(args->rename_annots, 1, &args->rename_annots_nmap); + if ( !args->rename_annots_map ) error("Could not read: %s\n", args->rename_annots); + } + for (i=0; irename_annots_nmap; i++) + { + char *ptr = args->rename_annots_map[i]; + while ( *ptr && !isspace(*ptr) ) ptr++; + if ( !*ptr ) error("Could not parse: %s\n", args->rename_annots_map[i]); + char *rmme = ptr; + *ptr = 0; + ptr++; + while ( *ptr && isspace(*ptr) ) ptr++; + if ( !*ptr ) { *rmme = ' '; error("Could not parse: %s\n", args->rename_annots_map[i]); } + if ( rename_annots_core(args, args->rename_annots_map[i], ptr) < 0 ) + error("Could not parse \"%s %s\", expected INFO, FORMAT, or FILTER prefix\n",args->rename_annots_map[i],ptr); + } +} +static void rename_annots_push(args_t *args, char *src, char *dst) +{ + args->rename_annots_nmap++; + args->rename_annots_map = (char**)realloc(args->rename_annots_map,sizeof(*args->rename_annots_map)*args->rename_annots_nmap); + kstring_t str = {0,0,0}; + ksprintf(&str,"%s %s",src,dst); + args->rename_annots_map[ args->rename_annots_nmap - 1 ] = str.s; +} + +static void init_data(args_t *args) +{ + args->hdr = args->files->readers[0].header; + args->hdr_out = bcf_hdr_dup(args->hdr); + + if ( args->set_ids_fmt ) + { + if ( args->set_ids_fmt[0]=='+' ) { args->set_ids_replace = 0; args->set_ids_fmt++; } + args->set_ids = convert_init(args->hdr_out, NULL, 0, args->set_ids_fmt); + } + if ( args->remove_annots ) init_remove_annots(args); + if ( args->header_fname || args->header_lines ) init_header_lines(args); + if ( args->targets_fname && args->tgts_is_vcf ) + { + // reading annots from a VCF + if ( !bcf_sr_add_reader(args->files, args->targets_fname) ) + error("Failed to open %s: %s\n", args->targets_fname,bcf_sr_strerror(args->files->errnum)); + args->tgts_hdr = args->files->readers[1].header; + } + if ( args->columns ) init_columns(args); + if ( args->targets_fname && !args->tgts_is_vcf ) + { + if ( !args->columns ) error("The -c option not given\n"); + if ( args->chr_idx==-1 ) error("The -c CHROM option not given\n"); + if ( args->beg_idx==-1 ) error("The -c POS option not given\n"); + if ( args->single_overlaps && args->merge_method_str.l ) error("The options --merge-logic and --single-overlaps cannot be combined\n"); + if ( args->end_idx==-1 || (args->single_overlaps && !args->merge_method_str.l) ) + { + args->end_idx = -args->beg_idx - 1; + args->tgts = bcf_sr_regions_init(args->targets_fname,1,args->chr_idx,args->beg_idx,args->end_idx); + if ( !args->tgts ) error("Could not initialize the annotation file: %s\n", args->targets_fname); + if ( !args->tgts->tbx ) error("Expected tabix-indexed annotation file: %s\n", args->targets_fname); + } + else + { + if ( args->ref_idx!=-1 ) error("Error: the REF columns will be ignored when BEG,END (or FROM,TO) is present. Replace END (or TO) with \"-\".\n"); + int len = strlen(args->targets_fname); + if ( len>=7 && !strcasecmp(".bed.gz",args->targets_fname+len-7) ) args->tgt_is_bed = 1; + else if ( len>=8 && !strcasecmp(".bed.bgz",args->targets_fname+len-8) ) args->tgt_is_bed = 1; + else if ( len>=4 && !strcasecmp(".bed",args->targets_fname+len-4) ) args->tgt_is_bed = 1; + args->tgt_idx = regidx_init(args->targets_fname,parse_with_payload,free_payload,sizeof(char*),args); + if ( !args->tgt_idx ) error("Failed to parse: %s\n", args->targets_fname); + args->tgt_itr = regitr_init(args->tgt_idx); + args->nalines++; + hts_expand0(annot_line_t,args->nalines,args->malines,args->alines); + } + if ( args->min_overlap_str ) + { + char *tmp = args->min_overlap_str; + if ( args->min_overlap_str[0] != ':' ) + { + args->min_overlap_ann = strtod(args->min_overlap_str,&tmp); + if ( args->min_overlap_ann < 0 || args->min_overlap_ann > 1 || (*tmp && *tmp!=':') ) + error("Could not parse \"--min-overlap %s\", expected value(s) between 0-1\n", args->min_overlap_str); + } + if ( *tmp && *tmp==':' ) + { + args->min_overlap_vcf = strtod(tmp+1,&tmp); + if ( args->min_overlap_vcf < 0 || args->min_overlap_vcf > 1 || *tmp ) + error("Could not parse \"--min-overlap %s\", expected value(s) between 0-1\n", args->min_overlap_str); + } + } + } + init_merge_method(args); + args->vcmp = vcmp_init(); + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + + if ( args->mark_sites ) + { + if ( !args->targets_fname ) error("The -a option not given\n"); + bcf_hdr_printf(args->hdr_out,"##INFO=", + args->mark_sites,args->mark_sites_logic==MARK_LISTED?"":"not ",args->mark_sites); + } + + if (args->record_cmd_line) bcf_hdr_append_version(args->hdr_out, args->argc, args->argv, "bcftools_annotate"); + if ( !args->drop_header ) + { + if ( args->rename_chrs ) rename_chrs(args, args->rename_chrs); + if ( args->rename_annots || args->rename_annots_map ) rename_annots(args); + + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("[%s] Error: cannot write to \"%s\": %s\n", __func__,args->output_fname, strerror(errno)); + if ( args->n_threads ) + hts_set_opt(args->out_fh, HTS_OPT_THREAD_POOL, args->files->p); + if ( bcf_hdr_write(args->out_fh, args->hdr_out)!=0 ) error("[%s] Error: failed to write the header to %s\n", __func__,args->output_fname); + } +} + +static void destroy_data(args_t *args) +{ + int i; + for (i=0; inrm; i++) free(args->rm[i].key); + free(args->rm); + if ( args->hdr_out ) bcf_hdr_destroy(args->hdr_out); + if (args->vcmp) vcmp_destroy(args->vcmp); + for (i=0; incols; i++) + { + free(args->cols[i].hdr_key_src); + free(args->cols[i].hdr_key_dst); + free(args->cols[i].mm_kstr.s); + if ( args->cols[i].mm_str_hash ) khash_str2int_destroy_free(args->cols[i].mm_str_hash); + free(args->cols[i].mm_dbl); + free(args->cols[i].ptr); + } + free(args->cols); + if ( args->aline_missing ) + { + for (i=0; ialine_missing->ncols; i++) free(args->aline_missing->cols[i]); + free(args->aline_missing->cols); + free(args->aline_missing); + } + for (i=0; imalines; i++) + { + free(args->alines[i].cols); + free(args->alines[i].als); + free(args->alines[i].line.s); + } + free(args->alines); + free(args->srt_alines); + if ( args->tgt_idx ) + { + regidx_destroy(args->tgt_idx); + regitr_destroy(args->tgt_itr); + } + if ( args->rename_annots_map ) + { + for (i=0; irename_annots_nmap; i++) free(args->rename_annots_map[i]); + free(args->rename_annots_map); + } + if ( args->tgts ) bcf_sr_regions_destroy(args->tgts); + free(args->tmpks.s); + free(args->tmpi); + free(args->tmpf); + free(args->tmps); + free(args->tmpp); + free(args->tmpi2); + free(args->tmpf2); + free(args->tmps2); + free(args->tmpp2); + free(args->tmpi3); + free(args->tmpf3); + free(args->src_smpl_pld); + free(args->dst_smpl_pld); + if ( args->set_ids ) + convert_destroy(args->set_ids); + if ( args->filter ) + filter_destroy(args->filter); + if (args->out_fh) hts_close(args->out_fh); + free(args->sample_map); + free(args->merge_method_str.s); +} + +static void parse_annot_line(args_t *args, char *str, annot_line_t *tmp) +{ + tmp->line.l = 0; + kputs(str, &tmp->line); + char *s = tmp->line.s; + tmp->ncols = 1; + hts_expand(char*,tmp->ncols,tmp->mcols,tmp->cols); + tmp->cols[0] = s; + while ( *s ) + { + if ( *s=='\t' ) + { + tmp->ncols++; + hts_expand(char*,tmp->ncols,tmp->mcols,tmp->cols); + tmp->cols[tmp->ncols-1] = s+1; + *s = 0; + } + s++; + } + if ( args->ref_idx != -1 ) + { + if ( args->ref_idx >= tmp->ncols ) + error("Could not parse the line, expected %d+ columns, found %d:\n\t%s\n",args->ref_idx+1,tmp->ncols,str); + if ( args->alt_idx >= tmp->ncols ) + error("Could not parse the line, expected %d+ columns, found %d:\n\t%s\n",args->alt_idx+1,tmp->ncols,str); + tmp->nals = 2; + hts_expand(char*,tmp->nals,tmp->mals,tmp->als); + tmp->als[0] = tmp->cols[args->ref_idx]; + tmp->als[1] = s = tmp->cols[args->alt_idx]; + while ( *s ) + { + if ( *s==',' ) + { + tmp->nals++; + hts_expand(char*,tmp->nals,tmp->mals,tmp->als); + tmp->als[tmp->nals-1] = s+1; + *s = 0; + } + s++; + } + } +} +static void buffer_annot_lines(args_t *args, bcf1_t *line, int start_pos, int end_pos) +{ + if ( args->nalines && args->alines[0].rid != line->rid ) args->nalines = 0; + + int i = 0; + while ( inalines ) + { + if ( line->pos > args->alines[i].end ) + { + args->nalines--; + if ( args->nalines && inalines ) + { + annot_line_t tmp = args->alines[i]; + memmove(&args->alines[i],&args->alines[i+1],(args->nalines-i)*sizeof(annot_line_t)); + args->alines[args->nalines] = tmp; + } + } + else i++; + } + if ( args->ref_idx==-1 && args->nalines ) return; + + while ( !bcf_sr_regions_overlap(args->tgts, bcf_seqname(args->hdr,line), start_pos,end_pos) ) + { + if ( args->nalines + 1 == 0xffff ) break; // likely a symbolic allele, don't let the buffer overflow + args->nalines++; + hts_expand0(annot_line_t,args->nalines,args->malines,args->alines); + annot_line_t *tmp = &args->alines[args->nalines-1]; + tmp->rid = line->rid; + tmp->start = args->tgts->start; + tmp->end = args->tgts->end; + parse_annot_line(args, args->tgts->line.s, tmp); + if ( args->ref_idx != -1 ) + { + int iseq = args->tgts->iseq; + if ( bcf_sr_regions_next(args->tgts)<0 || args->tgts->iseq!=iseq ) break; + } + else break; + } +} + +// search string in semicolon separated strings (xx vs aa;bb) +static int str_match(char *needle, char *haystack) +{ + int len = strlen(needle); + char *ptr = haystack; + while ( *ptr && (ptr=strstr(ptr,needle)) ) + { + if ( ptr[len]!=0 && ptr[len]!=';' ) ptr++; // a prefix, not a match + else if ( ptr==haystack || ptr[-1]==';' ) return 1; // a match + ptr++; // a suffix, not a match + } + return 0; +} +// search common string in semicolon separated strings (xx;yy;zz vs aa;bb) +static int strstr_match(char *a, char *b) +{ + char *beg = a; + while ( *beg ) + { + char *end = beg; + while ( *end && *end!=';' ) end++; + char tmp = *end; + if ( *end==';' ) *end = 0; + int ret = str_match(beg,b); + *end = tmp; + if ( ret || !*end ) return ret; + beg = end + 1; + } + return 0; +} +static void annotate(args_t *args, bcf1_t *line) +{ + int i, j; + for (i=0; inrm; i++) + args->rm[i].handler(args, line, &args->rm[i]); + + int has_overlap = 0; + if ( args->tgt_idx ) + { + for (j=0; jncols; j++) args->cols[j].done = 0; + if ( regidx_overlap(args->tgt_idx, bcf_seqname(args->hdr,line),line->pos,line->pos+line->rlen-1, args->tgt_itr) ) + { + while ( regitr_overlap(args->tgt_itr) ) + { + annot_line_t *tmp = &args->alines[0]; + tmp->rid = line->rid; + tmp->start = args->tgt_itr->beg; + tmp->end = args->tgt_itr->end; + + // Check min overlap + int len_ann = tmp->end - tmp->start + 1; + int len_vcf = line->rlen; + int isec = (tmp->end < line->pos+line->rlen-1 ? tmp->end : line->pos+line->rlen-1) - (tmp->start > line->pos ? tmp->start : line->pos) + 1; + assert( isec > 0 ); + if ( args->min_overlap_ann && args->min_overlap_ann > (float)isec/len_ann ) continue; + if ( args->min_overlap_vcf && args->min_overlap_vcf > (float)isec/len_vcf ) continue; + + parse_annot_line(args, regitr_payload(args->tgt_itr,char*), tmp); + for (j=0; jncols; j++) + { + if ( args->cols[j].done==1 ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],tmp); + if ( ret < 0 ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( ret==0 ) + args->cols[j].done = 1; + } + } + has_overlap = 1; + } + for (j=0; jncols; j++) + { + if ( args->cols[j].done==1 || args->cols[j].merge_method == MM_FIRST ) continue; + if ( !args->cols[j].setter ) continue; + if ( args->cols[j].setter(args,line,&args->cols[j],NULL) < 0 ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + } + } + else if ( args->tgts ) + { + // Buffer annotation lines. When multiple ALT alleles are present in the annotation file, at least one + // must match some of the VCF alleles. If the append-missing mode is set (and REF+ALT is requested), the + // buffered lines will annotate the VCF respecting the order in ALT and when no matching line is found + // for an ALT, missing value is appended instead. + int end_pos = line->pos + line->rlen - 1; + buffer_annot_lines(args, line, line->pos, end_pos); + + args->nsrt_alines = 0; + hts_expand(uint32_t,args->nalines,args->msrt_alines,args->srt_alines); + if ( args->nalines >= 0xffff || line->n_allele >= 0xffff ) + error("Error: too many alleles or annotation lines in the buffer at %s:%"PRId64" (todo:skip?)\n",bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + kstring_t match_end = {0,0,0}; + if ( args->match_end>=0 && bcf_get_info_int32(args->hdr,line,"END",&args->tmpi,&args->mtmpi)==1 ) + kputw(args->tmpi[0],&match_end); + + // Find matching lines + for (i=0; inalines; i++) + { + if ( line->pos > args->alines[i].end || end_pos < args->alines[i].start ) continue; + if ( args->ref_idx != -1 ) // REF+ALT matching requested + { + if ( line->pos!=args->alines[i].start || vcmp_set_ref(args->vcmp, line->d.allele[0], args->alines[i].als[0]) < 0 ) continue; // refs are not compatible + for (j=1; jalines[i].nals; j++) + { + int ialt; + if ( line->n_allele==1 && args->alines[i].als[j][0]=='.' && args->alines[i].als[j][1]==0 ) // match: no ALT allele in VCF and annot file has "." + ialt = 0; + else + { + ialt = vcmp_find_allele(args->vcmp, line->d.allele+1, line->n_allele - 1, args->alines[i].als[j]); + if ( ialt < 0 ) continue; + ialt++; + } + if ( args->match_id>=0 && !strstr_match(line->d.id,args->alines[i].cols[args->match_id]) ) continue; + if ( args->match_end>=0 && match_end.l && strcmp(match_end.s,args->alines[i].cols[args->match_end]) ) continue; + args->srt_alines[args->nsrt_alines++] = (ialt<<16) | i; + has_overlap = 1; + break; + } + } + else // overlap, REF+ALT matching not requested + { + args->srt_alines[args->nsrt_alines++] = (0xffff<<16) | i; + has_overlap = 1; + } + } + + free(match_end.s); + + // Sort lines if needed + if ( args->has_append_mode ) + { + // insertion sort by VCF ALT index (top bits) and alines index (low bits) + uint32_t tmp; + for (i=1; insrt_alines; i++) + for (j=i; j>0 && args->srt_alines[j] < args->srt_alines[j-1]; j--) + tmp = args->srt_alines[j], args->srt_alines[j] = args->srt_alines[j-1], args->srt_alines[j-1] = tmp; + } + // Annotate + for (j=0; jncols; j++) args->cols[j].done = 0; + int ialt_exp = 1; + for (i=0; insrt_alines; i++) + { + int ialt = args->srt_alines[i] >> 16; + int ilin = args->srt_alines[i] & 0xffff; + if ( args->has_append_mode ) + { + if ( ialt_exp > ialt ) continue; // multiple annotation lines for the same position + if ( ialt_exp < ialt ) + { + // REF+ALT matching requested, append-missing mode: insert "." if no annotation line was found for the ALT + while ( ialt_exp++ < ialt ) + { + for (j=0; jncols; j++) + { + if ( args->cols[j].merge_method != MM_APPEND_MISSING ) continue; + if ( args->cols[j].done==1 ) continue; + if ( !args->cols[j].setter ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],args->aline_missing); + if ( ret < 0 ) + error("fixme: Could not set missing %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( ret==0 ) + args->cols[j].done = 1; + } + } + } + } + for (j=0; jncols; j++) + { + if ( args->cols[j].done==1 ) continue; + if ( !args->cols[j].setter ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],&args->alines[ilin]); + if ( ret < 0 ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( ret==0 ) + args->cols[j].done = 1; + } + ialt_exp = ialt + 1; + } + if ( args->nsrt_alines ) + { + // In the append-missing mode fill missing values to all trailing ALTs, but only if at least one + // record was found. Otherwise leave the row will be left without annotation. + if ( args->has_append_mode && ialt_exp < line->n_allele ) + { + while ( ialt_exp++ < line->n_allele ) + { + for (j=0; jncols; j++) + { + if ( args->cols[j].merge_method != MM_APPEND_MISSING ) continue; + if ( args->cols[j].done==1 ) continue; + if ( !args->cols[j].setter ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],args->aline_missing); + if ( ret < 0 ) + error("fixme: Could not set missing %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( ret==0 ) + args->cols[j].done = 1; + } + } + } + // Flush + for (j=0; jncols; j++) + { + if ( args->cols[j].done==1 || args->cols[j].merge_method == MM_FIRST ) continue; + if ( !args->cols[j].setter ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],NULL); + if ( ret < 0 ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + } + } + } + else if ( args->files->nreaders == 2 ) + { + if ( bcf_sr_has_line(args->files,1) ) + { + bcf1_t *aline = bcf_sr_get_line(args->files,1); + for (j=0; jncols; j++) + { + if ( !args->cols[j].setter ) continue; + if ( args->cols[j].setter(args,line,&args->cols[j],aline) ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + } + + has_overlap = 1; + } + } + if ( args->set_ids ) + { + args->tmpks.l = 0; + convert_line(args->set_ids, line, &args->tmpks); + if ( args->tmpks.l ) + { + int replace = 0; + if ( args->set_ids_replace ) replace = 1; + else if ( !line->d.id || (line->d.id[0]=='.' && !line->d.id[1]) ) replace = 1; + if ( replace ) + bcf_update_id(args->hdr_out,line,args->tmpks.s); + } + } + + if ( args->mark_sites ) + { + // ideally, we'd like to be far more general than this in future, see https://github.com/samtools/bcftools/issues/87 + if ( args->mark_sites_logic==MARK_LISTED ) + bcf_update_info_flag(args->hdr_out,line,args->mark_sites,NULL,has_overlap?1:0); + else + bcf_update_info_flag(args->hdr_out,line,args->mark_sites,NULL,has_overlap?0:1); + } +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Annotate and edit VCF/BCF files.\n"); + fprintf(stderr, "Usage: bcftools annotate [options] VCF\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -a, --annotations FILE VCF file or tabix-indexed FILE with annotations: CHR\\tPOS[\\tVALUE]+\n"); + fprintf(stderr, " -c, --columns LIST List of columns in the annotation file, e.g. CHROM,POS,REF,ALT,-,INFO/TAG. See man page for details\n"); + fprintf(stderr, " -C, --columns-file FILE Read -c columns from FILE, one name per row, with optional --merge-logic TYPE: NAME[ TYPE]\n"); + fprintf(stderr, " -e, --exclude EXPR Exclude sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " --force Continue despite parsing error (at your own risk!)\n"); + fprintf(stderr, " -H, --header-line STR Header line which should be appended to the VCF header, can be given multiple times\n"); + fprintf(stderr, " -h, --header-lines FILE Lines which should be appended to the VCF header\n"); + fprintf(stderr, " -I, --set-id [+]FORMAT Set ID column using a `bcftools query`-like expression, see man page for details\n"); + fprintf(stderr, " -i, --include EXPR Select sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " -k, --keep-sites Leave -i/-e sites unchanged instead of discarding them\n"); + fprintf(stderr, " -l, --merge-logic TAG:TYPE Merge logic for multiple overlapping regions (see man page for details), EXPERIMENTAL\n"); + fprintf(stderr, " -m, --mark-sites [+-]TAG Add INFO/TAG flag to sites which are (\"+\") or are not (\"-\") listed in the -a file\n"); + fprintf(stderr, " --min-overlap ANN:VCF Required overlap as a fraction of variant in the -a file (ANN), the VCF (:VCF), or reciprocal (ANN:VCF)\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " --pair-logic STR Matching records by , see man page for details [some]\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in FILE\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " --rename-annots FILE Rename annotations: TYPE/old\\tnew, where TYPE is one of FILTER,INFO,FORMAT\n"); + fprintf(stderr, " --rename-chrs FILE Rename sequences according to the mapping: old\\tnew\n"); + fprintf(stderr, " -s, --samples [^]LIST Comma separated list of samples to annotate (or exclude with \"^\" prefix)\n"); + fprintf(stderr, " -S, --samples-file [^]FILE File of samples to annotate (or exclude with \"^\" prefix)\n"); + fprintf(stderr, " --single-overlaps Keep memory low by avoiding complexities arising from handling multiple overlapping intervals\n"); + fprintf(stderr, " -x, --remove LIST List of annotations (e.g. ID,INFO/DP,FORMAT/DP,FILTER) to remove (or keep with \"^\" prefix). See man page for details\n"); + fprintf(stderr, " --threads INT Number of extra output compression threads [0]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, " http://samtools.github.io/bcftools/howtos/annotate.html\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfannotate(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->ref_idx = args->alt_idx = args->chr_idx = args->beg_idx = args->end_idx = -1; + args->set_ids_replace = 1; + args->match_id = -1; + args->match_end = -1; + args->clevel = -1; + args->pair_logic = -1; + int regions_is_file = 0; + int regions_overlap = 1; + + static struct option loptions[] = + { + {"keep-sites",no_argument,NULL,'k'}, + {"mark-sites",required_argument,NULL,'m'}, + {"set-id",required_argument,NULL,'I'}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"annotations",required_argument,NULL,'a'}, + {"merge-logic",required_argument,NULL,'l'}, + {"collapse",required_argument,NULL,2}, + {"pair-logic",required_argument,NULL,2}, + {"include",required_argument,NULL,'i'}, + {"exclude",required_argument,NULL,'e'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"remove",required_argument,NULL,'x'}, + {"columns-file",required_argument,NULL,'C'}, + {"columns",required_argument,NULL,'c'}, + {"rename-annots",required_argument,NULL,11}, + {"rename-chrs",required_argument,NULL,1}, + {"header-lines",required_argument,NULL,'h'}, + {"header-line",required_argument,NULL,'H'}, + {"samples",required_argument,NULL,'s'}, + {"samples-file",required_argument,NULL,'S'}, + {"single-overlaps",no_argument,NULL,10}, + {"min-overlap",required_argument,NULL,12}, + {"no-version",no_argument,NULL,8}, + {"force",no_argument,NULL,'f'}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "h:H:?o:O:r:R:a:x:c:C:i:e:S:s:I:m:kl:f",loptions,NULL)) >= 0) + { + switch (c) { + case 'f': args->force = 1; break; + case 'k': args->keep_sites = 1; break; + case 'm': + args->mark_sites_logic = MARK_LISTED; + if ( optarg[0]=='+' ) args->mark_sites = optarg+1; + else if ( optarg[0]=='-' ) { args->mark_sites = optarg+1; args->mark_sites_logic = MARK_UNLISTED; } + else args->mark_sites = optarg; + break; + case 'l': + if ( args->merge_method_str.l ) kputc(',',&args->merge_method_str); + kputs(optarg,&args->merge_method_str); + break; + case 'I': args->set_ids_fmt = optarg; break; + case 's': args->sample_names = optarg; break; + case 'S': args->sample_names = optarg; args->sample_is_file = 1; break; + case 'c': args->columns = strdup(optarg); break; + case 'C': args->columns = strdup(optarg); args->columns_is_file = 1; break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'x': args->remove_annots = optarg; break; + case 'a': args->targets_fname = optarg; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 'h': args->header_fname = optarg; break; + case 'H': args->header_lines = dbuf_push(args->header_lines,strdup(optarg)); break; + case 1 : args->rename_chrs = optarg; break; + case 2 : + if ( !strcmp(optarg,"snps") ) args->pair_logic |= BCF_SR_PAIR_SNP_REF; + else if ( !strcmp(optarg,"indels") ) args->pair_logic |= BCF_SR_PAIR_INDEL_REF; + else if ( !strcmp(optarg,"both") ) args->pair_logic |= BCF_SR_PAIR_BOTH_REF; + else if ( !strcmp(optarg,"any") ) args->pair_logic |= BCF_SR_PAIR_ANY; + else if ( !strcmp(optarg,"all") ) args->pair_logic |= BCF_SR_PAIR_ANY; + else if ( !strcmp(optarg,"some") ) args->pair_logic |= BCF_SR_PAIR_SOME; + else if ( !strcmp(optarg,"none") ) args->pair_logic = BCF_SR_PAIR_EXACT; + else if ( !strcmp(optarg,"exact") ) args->pair_logic = BCF_SR_PAIR_EXACT; + else error("The --pair-logic string \"%s\" not recognised.\n", optarg); + break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 10 : args->single_overlaps = 1; break; + case 11 : args->rename_annots = optarg; break; + case 12 : args->min_overlap_str = optarg; break; + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(args); + } + else fname = argv[optind]; + + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_fname ) + { + htsFile *fp = hts_open(args->targets_fname,"r"); + if ( !fp ) error("Failed to open %s\n", args->targets_fname); + htsFormat type = *hts_get_format(fp); + hts_close(fp); + + if ( type.format==vcf || type.format==bcf ) + { + args->tgts_is_vcf = 1; + args->files->require_index = 1; + bcf_sr_set_opt(args->files,BCF_SR_PAIR_LOGIC,args->pair_logic>=0 ? args->pair_logic : BCF_SR_PAIR_SOME); + if ( args->min_overlap_str ) error("The --min-overlap option cannot be used when annotating from a VCF\n"); + } + } + if ( args->min_overlap_str && args->single_overlaps ) error("The options --single-overlaps and --min-overlap cannot be combined\n"); + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + static int line_errcode_warned = 0; + init_data(args); + while ( bcf_sr_next_line(args->files) ) + { + if ( !bcf_sr_has_line(args->files,0) ) continue; + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( line->errcode ) + { + if ( !args->force ) + error("Encountered an error, cannot proceed. Please check the error output above.\n" + "If feeling adventurous, use the --force option. (At your own risk!)\n"); + else if ( !line_errcode_warned ) + { + fprintf(stderr, + "Warning: Encountered an error, proceeding only because --force was given.\n" + " Note that this can result in a segfault or a silent corruption of the output file!\n"); + line_errcode_warned = 1; + line->errcode = 0; + } + } + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) + { + if ( args->keep_sites && bcf_write1(args->out_fh, args->hdr_out, line)!=0 ) error("[%s] Error: failed to write to %s\n", __func__,args->output_fname); + continue; + } + } + annotate(args, line); + if ( bcf_write1(args->out_fh, args->hdr_out, line)!=0 ) error("[%s] Error: failed to write to %s\n", __func__,args->output_fname); + } + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} diff --git a/bcftools/vcfannotate.c.pysam.c b/bcftools/vcfannotate.c.pysam.c new file mode 100644 index 0000000..e45c305 --- /dev/null +++ b/bcftools/vcfannotate.c.pysam.c @@ -0,0 +1,3526 @@ +#include "bcftools.pysam.h" + +/* vcfannotate.c -- Annotate and edit VCF/BCF files. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "vcmp.h" +#include "filter.h" +#include "convert.h" +#include "smpl_ilist.h" +#include "regidx.h" +#include "dbuf.h" + +struct _args_t; + +typedef struct _rm_tag_t +{ + char *key; + int hdr_id; + void (*handler)(struct _args_t *, bcf1_t *, struct _rm_tag_t *); +} +rm_tag_t; + +typedef struct +{ + char **cols; + int ncols, mcols; + char **als; + int nals, mals; + kstring_t line; + int rid, start, end; +} +annot_line_t; + +#define REPLACE_MISSING (1<<0) // -c +TAG .. replace only missing values +#define REPLACE_ALL (1<<1) // -c TAG .. replace both missing and existing values +#define REPLACE_NON_MISSING (1<<2) // -c -TAG .. replace only if tgt is not missing +#define SET_OR_APPEND (1<<3) // -c =TAG .. set new value if missing or non-existent, append otherwise +#define MATCH_VALUE (1<<4) // -c ~ID .. do not set, just match the value +#define CARRY_OVER_MISSING (1<<5) // -c .TAG .. carry over source missing values as well +#define MM_FIRST 0 // if multiple annotation lines overlap a VCF record, use the first, discarding the rest +#define MM_APPEND 1 // append, possibly multiple times +#define MM_UNIQUE 2 // append, only unique values +#define MM_SUM 3 +#define MM_AVG 4 +#define MM_MIN 5 +#define MM_MAX 6 +#define MM_APPEND_MISSING 7 // missing values will be transferred as well +typedef struct _annot_col_t +{ + int icol, replace, number; // number: one of BCF_VL_* types + char *hdr_key_src, *hdr_key_dst; + // The setters return 0 on successful update of the bcf record, negative value (bcf_update_* return status) on errors, + // or 1 on (repeated partial updates) concluded with a src=NULL call + int (*setter)(struct _args_t *, bcf1_t *dst, struct _annot_col_t *, void *src); // the last is the annotation line, either src bcf1_t or annot_line_t + int (*getter)(struct _args_t *, bcf1_t *src, struct _annot_col_t *, void **ptr, int *mptr); + int merge_method; // one of the MM_* defines + khash_t(str2int) *mm_str_hash; // lookup table to ensure uniqueness of added string values + kstring_t mm_kstr; + size_t + mm_dbl_nalloc, // the allocated size --merge-logic values array + mm_dbl_nused, // the number of used elements in the mm_dbl array + mm_dbl_ndat; // the number of merged rows (for calculating the average) + double + *mm_dbl; + void *ptr; + int mptr, done; +} +annot_col_t; + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +#define MARK_LISTED 1 +#define MARK_UNLISTED 2 + +typedef struct _args_t +{ + bcf_srs_t *files; + bcf_hdr_t *hdr, *hdr_out, *tgts_hdr; + htsFile *out_fh; + int output_type, n_threads, clevel; + bcf_sr_regions_t *tgts; + + regidx_t *tgt_idx; // keep everything in memory only with .tab annotation file and -c BEG,END columns + regitr_t *tgt_itr; + int tgt_is_bed; + + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + int keep_sites; + + rm_tag_t *rm; // tags scheduled for removal + int nrm; + int flt_keep_pass; // when all filters removed, reset to PASS + + vcmp_t *vcmp; // for matching annotation and VCF lines by allele + annot_line_t *alines; // buffered annotation lines + annot_line_t *aline_missing; + uint32_t *srt_alines; // sorted indexes (iALT<<16 || iAline) + int nalines, malines, nsrt_alines, msrt_alines; + int ref_idx, alt_idx, chr_idx, beg_idx, end_idx; // -1 if not present + annot_col_t *cols; // column indexes and setters + int ncols; + int match_id; // set iff `-c ~ID` given, -1 otherwise + int match_end; // set iff `-c ~INFO/END` is given, -1 otherwise + + char *set_ids_fmt; + convert_t *set_ids; + int set_ids_replace; + + int nsmpl_annot; + int *sample_map, nsample_map, sample_is_file; // map[idst] -> isrc + uint8_t *src_smpl_pld, *dst_smpl_pld; // for Number=G format fields + int mtmpi, mtmpf, mtmps; + int mtmpi2, mtmpf2, mtmps2; + int mtmpi3, mtmpf3, mtmps3; + int32_t *tmpi, *tmpi2, *tmpi3; + float *tmpf, *tmpf2, *tmpf3; + char *tmps, *tmps2, **tmpp, **tmpp2; + kstring_t tmpks; + + char **argv, *output_fname, *targets_fname, *regions_list, *header_fname; + char *remove_annots, *columns, *rename_chrs, *rename_annots, *sample_names, *mark_sites; + char **rename_annots_map; + char *min_overlap_str; + float min_overlap_ann, min_overlap_vcf; + int rename_annots_nmap; + kstring_t merge_method_str; + int argc, drop_header, record_cmd_line, tgts_is_vcf, mark_sites_logic, force, single_overlaps; + int columns_is_file, has_append_mode, pair_logic; + dbuf_t *header_lines; +} +args_t; + +char *msprintf(const char *fmt, ...); + +int parse_with_payload(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + args_t *args = (args_t*) usr; + int ret = args->tgt_is_bed ? regidx_parse_bed(line, chr_beg, chr_end, beg, end, NULL, NULL) : regidx_parse_tab(line, chr_beg, chr_end, beg, end, NULL, NULL); + if ( ret<0 ) return ret; + *((char **)payload) = strdup(line); + return 0; +} +void free_payload(void *payload) +{ + char *str = *((char**)payload); + free(str); +} + +void remove_id(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + bcf_update_id(args->hdr,line,NULL); +} +void remove_filter(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + if ( tag->key && tag->hdr_id<0 ) + { + error("Error: Cannot proceed, not even with the --force option, bad things could happen.\n" + " Note that \"bcftools annotate -x FILTER\" can be used to remove ALL filters.\n" + " Even better, use \"bcftools view -h\" and \"bcftools reheader\" to fix the header!\n" + ); + } + if ( !tag->key ) bcf_update_filter(args->hdr, line, NULL, args->flt_keep_pass); + else bcf_remove_filter(args->hdr, line, tag->hdr_id, args->flt_keep_pass); +} +void remove_qual(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + bcf_float_set_missing(line->qual); +} +void remove_info(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + // remove all INFO fields + if ( !(line->unpacked & BCF_UN_INFO) ) bcf_unpack(line, BCF_UN_INFO); + + int i; + for (i=0; in_info; i++) + { + bcf_info_t *inf = &line->d.info[i]; + if ( !strcmp("END",bcf_hdr_int2id(args->hdr,BCF_DT_ID,inf->key)) ) + line->rlen = line->n_allele ? strlen(line->d.allele[0]) : 0; + if ( inf->vptr_free ) + { + free(inf->vptr - inf->vptr_off); + inf->vptr_free = 0; + } + line->d.shared_dirty |= BCF1_DIRTY_INF; + inf->vptr = NULL; + inf->vptr_off = inf->vptr_len = 0; + } +} +void remove_info_tag(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + bcf_update_info(args->hdr, line, tag->key, NULL, 0, BCF_HT_INT); // the type does not matter with n=0 +} +void remove_format_tag(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + bcf_update_format(args->hdr, line, tag->key, NULL, 0, BCF_HT_INT); // the type does not matter with n=0 +} +void remove_format(args_t *args, bcf1_t *line, rm_tag_t *tag) +{ + // remove all FORMAT fields except GT + if ( !(line->unpacked & BCF_UN_FMT) ) bcf_unpack(line, BCF_UN_FMT); + + int i; + for (i=0; in_fmt; i++) + { + bcf_fmt_t *fmt = &line->d.fmt[i]; + const char *key = bcf_hdr_int2id(args->hdr,BCF_DT_ID,fmt->id); + if ( key[0]=='G' && key[1]=='T' && !key[2] ) continue; + + if ( fmt->p_free ) + { + free(fmt->p - fmt->p_off); + fmt->p_free = 0; + } + line->d.indiv_dirty = 1; + fmt->p = NULL; + } +} + +#include "htslib/khash.h" +KHASH_MAP_INIT_STR(vdict, bcf_idinfo_t) +typedef khash_t(vdict) vdict_t; + +static void remove_hdr_lines(bcf_hdr_t *hdr, int type) +{ + int i = 0, nrm = 0; + while ( inhrec ) + { + if ( hdr->hrec[i]->type!=type ) { i++; continue; } + bcf_hrec_t *hrec = hdr->hrec[i]; + if ( type==BCF_HL_FMT || type==BCF_HL_INFO || type==BCF_HL_FMT || type== BCF_HL_CTG ) + { + // everything except FORMAT/GT + int id = bcf_hrec_find_key(hrec, "ID"); + if ( id>=0 ) + { + if ( type==BCF_HL_FMT && !strcmp(hrec->vals[id],"GT") ) { i++; continue; } + vdict_t *d = type==BCF_HL_CTG ? (vdict_t*)hdr->dict[BCF_DT_CTG] : (vdict_t*)hdr->dict[BCF_DT_ID]; + khint_t k = kh_get(vdict, d, hdr->hrec[i]->vals[id]); + kh_val(d, k).hrec[type==BCF_HL_CTG?0:type] = NULL; + kh_val(d, k).info[type] |= 0xf; + } + } + nrm++; + hdr->nhrec--; + if ( i < hdr->nhrec ) + memmove(&hdr->hrec[i],&hdr->hrec[i+1],(hdr->nhrec-i)*sizeof(bcf_hrec_t*)); + bcf_hrec_destroy(hrec); + } + if ( nrm ) { + if (bcf_hdr_sync(hdr) < 0) + error_errno("[%s] Failed to update header", __func__); + } +} + +static void init_remove_annots(args_t *args) +{ + int keep_info = 0, keep_fmt = 0, keep_flt = 0; + void *keep = khash_str2int_init(); + kstring_t str = {0,0,0}; + char *ss = args->remove_annots; + + int i, ntags, needs_info = 0; + if ( args->set_ids ) + { + const char **tags = convert_list_used_tags(args->set_ids,&ntags); + for (i=0; inrm++; + args->rm = (rm_tag_t*) realloc(args->rm,sizeof(rm_tag_t)*args->nrm); + rm_tag_t *tag = &args->rm[args->nrm-1]; + tag->key = NULL; + + int type = BCF_HL_GEN; + if ( !strncasecmp("INFO/",ss,5) ) { type = BCF_HL_INFO; ss += 5; } + else if ( !strncasecmp("INF/",ss,4) ) { type = BCF_HL_INFO; ss += 4; } + else if ( !strncasecmp("FORMAT/",ss,7) ) { type = BCF_HL_FMT; ss += 7; } + else if ( !strncasecmp("FMT/",ss,4) ) { type = BCF_HL_FMT; ss += 4; } + else if ( !strncasecmp("FILTER/",ss,7) ) { type = BCF_HL_FLT; ss += 7; } + else if ( !strncasecmp("^INFO/",ss,6) ) { type = BCF_HL_INFO; ss += 6; keep_info = 1; } + else if ( !strncasecmp("^INF/",ss,5) ) { type = BCF_HL_INFO; ss += 5; keep_info = 1; } + else if ( !strncasecmp("^FORMAT/",ss,8) ) { type = BCF_HL_FMT; ss += 8; keep_fmt = 1; } + else if ( !strncasecmp("^FMT/",ss,5) ) { type = BCF_HL_FMT; ss += 5; keep_fmt = 1; } + else if ( !strncasecmp("^FILTER/",ss,8) ) { type = BCF_HL_FLT; ss += 8; keep_flt = 1; } + + char *se = ss; + while ( *se && *se!=',' ) se++; + str.l = 0; + kputsn(ss, se-ss, &str); + + if ( type==BCF_HL_FLT ) + { + if ( !keep_flt ) + { + args->flt_keep_pass = 1; + tag->handler = remove_filter; + tag->key = strdup(str.s); + tag->hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, tag->key); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FLT,tag->hdr_id) ) + { + if ( args->keep_sites ) + error("Error: The filter \"%s\" is not defined in the header, cannot use the -k option\n", str.s); + else + fprintf(bcftools_stderr,"Warning: The filter \"%s\" is not defined in the header\n", str.s); + } + else if ( !args->keep_sites ) bcf_hdr_remove(args->hdr_out,BCF_HL_FLT,tag->key); + } + else + { + int value, ret = khash_str2int_get(keep, str.s, &value); + if ( ret==-1 ) khash_str2int_set(keep, strdup(str.s),1<nrm--; + } + } + else if ( type!=BCF_HL_GEN ) + { + int id = bcf_hdr_id2int(args->hdr,BCF_DT_ID,str.s); + if ( !bcf_hdr_idinfo_exists(args->hdr,type,id) ) + { + if ( args->keep_sites ) + error("Error: The tag \"%s\" is not defined in the header, cannot use the -k option\n", str.s); + else + fprintf(bcftools_stderr,"Warning: The tag \"%s\" not defined in the header\n", str.s); + + tag->key = strdup(str.s); + if ( type==BCF_HL_INFO ) + { + tag->handler = remove_info_tag; + if ( needs_info ) error("Error: `--remove INFO/%s` is executed first, cannot combine with `--set-id %s`\n",tag->key,args->set_ids_fmt); + } + else if ( type==BCF_HL_FMT ) tag->handler = remove_format_tag; + } + else if ( (type==BCF_HL_FMT && keep_fmt) || (type==BCF_HL_INFO && keep_info) ) + { + int value, ret = khash_str2int_get(keep, str.s, &value); + if ( ret==-1 ) khash_str2int_set(keep, strdup(str.s),1<nrm--; + } + else + { + tag->key = strdup(str.s); + if ( type==BCF_HL_INFO ) + { + tag->handler = remove_info_tag; + if ( needs_info ) error("Error: `--remove INFO/%s` is executed first, cannot combine with `--set-id %s`\n",tag->key,args->set_ids_fmt); + } + else if ( type==BCF_HL_FMT ) tag->handler = remove_format_tag; + if ( !args->keep_sites ) bcf_hdr_remove(args->hdr_out,type,tag->key); + } + } + else if ( !strcasecmp("ID",str.s) ) tag->handler = remove_id; + else if ( !strcasecmp("FILTER",str.s) ) + { + tag->handler = remove_filter; + if ( !args->keep_sites ) remove_hdr_lines(args->hdr_out,BCF_HL_FLT); + } + else if ( !strcasecmp("QUAL",str.s) ) tag->handler = remove_qual; + else if ( !strcasecmp("INFO",str.s) ) + { + if ( needs_info ) error("Error: `--remove INFO` is executed first, cannot combine with `--set-id %s`\n",args->set_ids_fmt); + tag->handler = remove_info; + if ( !args->keep_sites ) remove_hdr_lines(args->hdr_out,BCF_HL_INFO); + } + else if ( !strcasecmp("FMT",str.s) || !strcasecmp("FORMAT",str.s) ) + { + tag->handler = remove_format; + if ( !args->keep_sites ) remove_hdr_lines(args->hdr_out,BCF_HL_FMT); + } + else if ( str.l ) + { + int id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, str.s); + if ( bcf_hdr_idinfo_exists(args->hdr,BCF_HL_INFO,id) ) error("Error: did you mean INFO/%s?\n",str.s); + if ( bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,id) ) error("Error: did you mean FORMAT/%s?\n",str.s); + + if ( !args->keep_sites ) + { + if ( str.s[0]=='#' && str.s[1]=='#' ) + bcf_hdr_remove(args->hdr_out,BCF_HL_GEN,str.s+2); + else + bcf_hdr_remove(args->hdr_out,BCF_HL_STR,str.s); + } + args->nrm--; + } + + ss = *se ? se+1 : se; + } + free(str.s); + if ( keep_flt || keep_info || keep_fmt ) + { + int j; + for (j=0; jhdr->nhrec; j++) + { + bcf_hrec_t *hrec = args->hdr->hrec[j]; + if ( hrec->type!=BCF_HL_FLT && hrec->type!=BCF_HL_INFO && hrec->type!=BCF_HL_FMT ) continue; + if ( !keep_flt && hrec->type==BCF_HL_FLT ) continue; + if ( !keep_info && hrec->type==BCF_HL_INFO ) continue; + if ( !keep_fmt && hrec->type==BCF_HL_FMT ) continue; + int k = bcf_hrec_find_key(hrec,"ID"); + assert( k>=0 ); // this should always be true for valid VCFs + int value, ret = khash_str2int_get(keep,hrec->vals[k],&value); + if ( ret==0 && value>>hrec->type ) // keep + { + if ( hrec->type==BCF_HL_FLT && !strcmp("PASS",hrec->vals[k]) ) args->flt_keep_pass = 1; + continue; + } + args->nrm++; + args->rm = (rm_tag_t*) realloc(args->rm,sizeof(rm_tag_t)*args->nrm); + rm_tag_t *tag = &args->rm[args->nrm-1]; + if ( hrec->type==BCF_HL_INFO ) tag->handler = remove_info_tag; + else if ( hrec->type==BCF_HL_FMT ) tag->handler = remove_format_tag; + else + { + tag->handler = remove_filter; + tag->hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, hrec->vals[k]); + } + tag->key = strdup(hrec->vals[k]); + if ( !args->keep_sites ) bcf_hdr_remove(args->hdr_out,hrec->type,tag->key); + } + } + khash_str2int_destroy_free(keep); + if ( !args->nrm ) error("No matching tag in -x %s\n", args->remove_annots); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); +} +static void init_header_lines(args_t *args) +{ + if ( args->header_fname ) + { + htsFile *file = hts_open(args->header_fname, "rb"); + if ( !file ) error("Error reading %s\n", args->header_fname); + kstring_t str = {0,0,0}; + while ( hts_getline(file, KS_SEP_LINE, &str) > 0 ) + { + if ( bcf_hdr_append(args->hdr_out,str.s) ) error("Could not parse %s: %s\n", args->header_fname, str.s); + bcf_hdr_append(args->hdr,str.s); // the input file may not have the header line if run with -h (and nothing else) + } + if ( hts_close(file)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->header_fname); + free(str.s); + } + if ( args->header_lines ) + { + int i, n = dbuf_n(args->header_lines); + for (i=0; iheader_lines,i); + if ( bcf_hdr_append(args->hdr_out,line) ) error("Could not parse the header line: %s\n", line); + bcf_hdr_append(args->hdr,line); // the input file may not have the header line if run with -H (and nothing else) + } + dbuf_destroy_free(args->header_lines); + args->header_lines = NULL; + } + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update output header", __func__); + if (bcf_hdr_sync(args->hdr) < 0) + error_errno("[%s] Failed to update input header", __func__); +} +static int vcf_getter_info_str2str(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr) +{ + return bcf_get_info_string(args->tgts_hdr,rec,col->hdr_key_src,ptr,mptr); +} +static int vcf_getter_id2str(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr) +{ + char *str = *((char**)ptr); + int len = strlen(rec->d.id); + if ( len >= *mptr ) str = realloc(str, len+1); + strcpy(str, rec->d.id); + *((char**)ptr) = str; + *mptr = len+1; + return len; +} +static int vcf_getter_filter2str(args_t *args, bcf1_t *rec, annot_col_t *col, void **ptr, int *mptr) +{ + kstring_t str; + str.s = *((char**)ptr); + str.m = *mptr; + str.l = 0; + + int i; + if ( rec->d.n_flt ) + { + for (i=0; id.n_flt; i++) + { + if (i) kputc(';', &str); + kputs(bcf_hdr_int2id(args->tgts_hdr,BCF_DT_ID,rec->d.flt[i]), &str); + } + } + else kputc('.', &str); + + *((char**)ptr) = str.s; + *mptr = str.m; + return str.l; +} +static int setter_filter(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with FILTER (yet?)\n"); + + // note: so far this works only with one filter, not a list of filters + annot_line_t *tab = (annot_line_t*) data; + if ( tab->cols[col->icol][0]=='.' && !tab->cols[col->icol][1] ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_update_filter(args->hdr_out,line,NULL,0); + return 0; + } + hts_expand(int,1,args->mtmpi,args->tmpi); + args->tmpi[0] = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, tab->cols[col->icol]); + if ( args->tmpi[0]<0 ) error("The FILTER \"%s\" is not defined in the header, was the -h option provided?\n", tab->cols[col->icol]); + if ( col->replace & SET_OR_APPEND ) return bcf_add_filter(args->hdr_out,line,args->tmpi[0]); + if ( !(col->replace & REPLACE_MISSING) ) + { + bcf_update_filter(args->hdr_out,line,NULL,0); + return bcf_update_filter(args->hdr_out,line,args->tmpi,1); + } + + // only update missing FILTER + if ( !(line->unpacked & BCF_UN_FLT) ) bcf_unpack(line, BCF_UN_FLT); + if ( !line->d.n_flt ) + return bcf_update_filter(args->hdr_out,line,args->tmpi,1); + + return 0; +} +static int vcf_setter_filter(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + int i, ret = 0; + bcf1_t *rec = (bcf1_t*) data; + if ( !(rec->unpacked & BCF_UN_FLT) ) bcf_unpack(rec, BCF_UN_FLT); + if ( !(line->unpacked & BCF_UN_FLT) ) bcf_unpack(line, BCF_UN_FLT); + if ( !rec->d.n_flt ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_update_filter(args->hdr_out,line,NULL,0); + return 0; + } + if ( col->replace & (SET_OR_APPEND|REPLACE_MISSING) ) + { + if ( (col->replace & REPLACE_MISSING) && line->d.n_flt ) return 0; // only update missing FILTER + for (i=0; id.n_flt; i++) + { + const char *flt = bcf_hdr_int2id(args->files->readers[1].header, BCF_DT_ID, rec->d.flt[i]); + if ( bcf_add_filter(args->hdr_out,line,bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, flt)) < 0 ) ret = -1; + } + return ret; + } + hts_expand(int,rec->d.n_flt,args->mtmpi,args->tmpi); + for (i=0; id.n_flt; i++) + { + const char *flt = bcf_hdr_int2id(args->files->readers[1].header, BCF_DT_ID, rec->d.flt[i]); + args->tmpi[i] = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, flt); + } + bcf_update_filter(args->hdr_out,line,NULL,0); + return bcf_update_filter(args->hdr_out,line,args->tmpi,rec->d.n_flt); +} +static int setter_pos(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + annot_line_t *tab = (annot_line_t*) data; + if ( tab->cols[col->icol] && tab->cols[col->icol][0]=='.' && !tab->cols[col->icol][1] ) return 0; // don't replace with "." + char *tmp; + int pos = strtol(tab->cols[col->icol], &tmp, 10); + if ( tmp==tab->cols[col->icol] ) + error("Could not parse ~POS at %s:%"PRId64" .. [%s]\n",bcf_seqname(args->hdr,line),(int64_t)line->pos+1,tab->cols[col->icol]); + line->pos = pos - 1; + return 0; +} +static int setter_id(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with ID (yet?)\n"); + if ( col->replace & MATCH_VALUE ) return 0; + + // possible cases: + // IN ANNOT OUT ACHIEVED_BY + // x y x -c +ID + // x y y -c ID + // x y x,y -c =ID + // x . x -c +ID, ID + // x . . -x ID + // . y y -c +ID, -c ID + // + annot_line_t *tab = (annot_line_t*) data; + if ( tab->cols[col->icol] && tab->cols[col->icol][0]=='.' && !tab->cols[col->icol][1] ) return 0; // don't replace with "." + if ( col->replace & SET_OR_APPEND ) return bcf_add_id(args->hdr_out,line,tab->cols[col->icol]); + if ( !(col->replace & REPLACE_MISSING) ) return bcf_update_id(args->hdr_out,line,tab->cols[col->icol]); + + // running with +ID, only update missing ids + if ( !line->d.id || (line->d.id[0]=='.' && !line->d.id[1]) ) + return bcf_update_id(args->hdr_out,line,tab->cols[col->icol]); + return 0; +} +static int vcf_setter_id(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( col->replace & MATCH_VALUE ) return 0; + + bcf1_t *rec = (bcf1_t*) data; + + char *id; + if ( col->getter ) + { + int nret = col->getter(args,rec,col,&col->ptr,&col->mptr); + id = (char*) col->ptr; + if ( nret<=0 || (nret==1 && *id=='.') ) return 0; // don't replace with "." + } + else + { + if ( rec->d.id && rec->d.id[0]=='.' && !rec->d.id[1] ) return 0; // don't replace with "." + id = rec->d.id; + } + if ( col->replace & SET_OR_APPEND ) return bcf_add_id(args->hdr_out,line,id); + if ( !(col->replace & REPLACE_MISSING) ) return bcf_update_id(args->hdr_out,line,id); + + // running with +ID, only update missing ids + if ( !line->d.id || (line->d.id[0]=='.' && !line->d.id[1]) ) + return bcf_update_id(args->hdr_out,line,id); + return 0; +} +static int vcf_setter_ref(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + if ( !strcmp(rec->d.allele[0],line->d.allele[0]) ) return 0; // no update necessary + const char **als = (const char**) malloc(sizeof(char*)*line->n_allele); + als[0] = rec->d.allele[0]; + int i; + for (i=1; in_allele; i++) als[i] = line->d.allele[i]; + int ret = bcf_update_alleles(args->hdr_out, line, als, line->n_allele); + free(als); + return ret; +} +static int vcf_setter_alt(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int i; + if ( line->n_allele>1 && (col->replace & REPLACE_MISSING) ) return 0; + if ( rec->n_allele==line->n_allele ) + { + for (i=1; in_allele; i++) if ( strcmp(rec->d.allele[i],line->d.allele[i]) ) break; + if ( i==rec->n_allele ) return 0; // no update necessary + } + const char **als = (const char**) malloc(sizeof(char*)*rec->n_allele); + als[0] = line->d.allele[0]; + for (i=1; in_allele; i++) als[i] = rec->d.allele[i]; + int ret = bcf_update_alleles(args->hdr_out, line, als, rec->n_allele); + free(als); + return ret; +} +static int setter_qual(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with QUAL (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + char *str = tab->cols[col->icol]; + if ( str[0]=='.' && str[1]==0 ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_float_set_missing(line->qual); + return 0; + } + if ( (col->replace & REPLACE_MISSING) && !bcf_float_is_missing(line->qual) ) return 0; + + line->qual = strtod(str, &str); + if ( str == tab->cols[col->icol] ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + return 0; +} +static int vcf_setter_qual(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + if ( bcf_float_is_missing(rec->qual) ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_float_set_missing(line->qual); + return 0; + } + if ( (col->replace & REPLACE_MISSING) && !bcf_float_is_missing(line->qual) ) return 0; + line->qual = rec->qual; + return 0; +} +static int setter_info_flag(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with INFO type=Flag (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + char *str = tab->cols[col->icol]; + if ( str[0]=='.' && str[1]==0 ) // don't overwrite with a missing value unless asked + { + if ( (col->replace & CARRY_OVER_MISSING) && (col->replace & (REPLACE_ALL|REPLACE_NON_MISSING)) ) bcf_update_info_flag(args->hdr_out,line,col->hdr_key_dst,NULL,0); + return 0; + } + + if ( str[0]=='1' && str[1]==0 ) return bcf_update_info_flag(args->hdr_out,line,col->hdr_key_dst,NULL,1); + if ( str[0]=='0' && str[1]==0 ) return bcf_update_info_flag(args->hdr_out,line,col->hdr_key_dst,NULL,0); + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + return -1; +} +static int vcf_setter_info_flag(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int flag = bcf_get_info_flag(args->files->readers[1].header,rec,col->hdr_key_src,NULL,NULL); + bcf_update_info_flag(args->hdr_out,line,col->hdr_key_dst,NULL,flag); + return 0; +} +static int setter_ARinfo_int32(args_t *args, bcf1_t *line, annot_col_t *col, int nals, char **als, int ntmpi) +{ + if ( col->number==BCF_VL_A && ntmpi!=nals-1 && (ntmpi!=1 || args->tmpi[0]!=bcf_int32_missing || args->tmpi[1]!=bcf_int32_vector_end) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", ntmpi,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + else if ( col->number==BCF_VL_R && ntmpi!=nals && (ntmpi!=1 || args->tmpi[0]!=bcf_int32_missing || args->tmpi[1]!=bcf_int32_vector_end) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", ntmpi,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + int *map = vcmp_map_ARvalues(args->vcmp,ndst,nals,als,line->n_allele,line->d.allele); + if ( !map ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + // fill in any missing values in the target VCF (or all, if not present) + int ntmpi2 = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpi2, &args->mtmpi2); + if ( ntmpi2 < ndst ) hts_expand(int32_t,ndst,args->mtmpi2,args->tmpi2); + + int i; + for (i=0; itmpi2[i] = bcf_int32_missing; + continue; + } + if ( ntmpi2==ndst && (col->replace & REPLACE_MISSING) + && args->tmpi2[i]!=bcf_int32_missing + && args->tmpi2[i]!=bcf_int32_vector_end ) continue; + + args->tmpi2[i] = args->tmpi[ map[i] ]; + } + return bcf_update_info_int32(args->hdr_out,line,col->hdr_key_dst,args->tmpi2,ndst); +} +static int setter_info_int(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + annot_line_t *tab = (annot_line_t*) data; + + // This is a bit hacky, only to reuse existing code with minimal changes: + // -c =TAG will now behave as -l TAG:APPEND for integers + if ( col->replace & SET_OR_APPEND ) col->merge_method=MM_APPEND; + + if ( !tab ) + { + if ( col->merge_method!=MM_SUM && col->merge_method!=MM_AVG && + col->merge_method!=MM_MIN && col->merge_method!=MM_MAX && + col->merge_method!=MM_APPEND && + col->merge_method!=MM_APPEND_MISSING ) + error("Error: at the moment only the sum,avg,min,max,append,append-missing options are supported with --merge-logic for INFO type=Integer\n"); + } + + int i,ntmpi = 0; + if ( (col->replace & SET_OR_APPEND) && !col->mm_dbl_nused ) + { + ntmpi = bcf_get_info_int32(args->hdr, line, col->hdr_key_dst, &args->tmpi, &args->mtmpi); + if ( ntmpi>0 && (args->tmpi[0]!=bcf_int32_missing || (col->replace & CARRY_OVER_MISSING)) ) + { + col->mm_dbl_nused = col->mm_dbl_ndat = ntmpi; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; imm_dbl[i] = args->tmpi[i]; + col->mm_dbl_ndat = 1; + } + ntmpi = 0; + } + if ( tab ) // has data, not flushing yet + { + char *str = tab->cols[col->icol], *end = str; + if ( str[0]=='.' && str[1]==0 && col->merge_method!=MM_APPEND_MISSING && !(col->replace & CARRY_OVER_MISSING) ) return 1; + + while ( *end ) + { + ntmpi++; + hts_expand(int32_t,ntmpi,args->mtmpi,args->tmpi); + if ( str[0]=='.' && (str[1]==0 || str[1]==',') ) + { + if ( col->merge_method==MM_APPEND_MISSING || (col->replace & CARRY_OVER_MISSING) ) + args->tmpi[ntmpi-1] = bcf_int32_missing; + else + ntmpi--; + if ( str[1]==0 ) end = str+1; + str += 2; + } + else + { + args->tmpi[ntmpi-1] = strtol(str, &end, 10); + if ( end==str ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + str = end+1; + } + } + if ( col->merge_method!=MM_FIRST ) + { + if ( !col->mm_dbl_nused ) + { + col->mm_dbl_nused = ntmpi; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; imm_dbl[i] = args->tmpi[i]; + } + else + { + if ( col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING ) + { + int nori = col->mm_dbl_nused; + col->mm_dbl_nused += ntmpi; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; imm_dbl[i+nori] = args->tmpi[i]; + } + else + { + if ( ntmpi!=col->mm_dbl_nused ) error("Error: cannot merge fields of unequal length\n"); + if ( col->merge_method==MM_SUM || col->merge_method==MM_AVG ) + for (i=0; imm_dbl[i] += args->tmpi[i]; + else if ( col->merge_method==MM_MIN ) + for (i=0; imm_dbl[i] > args->tmpi[i] ) col->mm_dbl[i] = args->tmpi[i]; } + else if ( col->merge_method==MM_MAX ) + for (i=0; imm_dbl[i] < args->tmpi[i] ) col->mm_dbl[i] = args->tmpi[i]; } + } + } + col->mm_dbl_ndat++; + return 1; + } + } + else if ( col->merge_method==MM_SUM || col->merge_method==MM_MIN || col->merge_method==MM_MAX || col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING ) + { + ntmpi = col->mm_dbl_nused; + hts_expand(int32_t,ntmpi,args->mtmpi,args->tmpi); + for (i=0; itmpi[i] = col->mm_dbl[i]; + col->mm_dbl_nused = col->mm_dbl_ndat = 0; + } + else if ( col->merge_method==MM_AVG ) + { + ntmpi = col->mm_dbl_nused; + hts_expand(int32_t,ntmpi,args->mtmpi,args->tmpi); + for (i=0; itmpi[i] = col->mm_dbl[i]/col->mm_dbl_ndat; + col->mm_dbl_nused = col->mm_dbl_ndat = 0; + } + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_int32(args,line,col,tab->nals,tab->als,ntmpi); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_int32(args->hdr, line, col->hdr_key_dst, &args->tmpi2, &args->mtmpi2); + if ( ret>0 && args->tmpi2[0]!=bcf_int32_missing ) return 0; + } + return bcf_update_info_int32(args->hdr_out,line,col->hdr_key_dst,args->tmpi,ntmpi); +} +static int vcf_setter_info_int(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int ntmpi = bcf_get_info_int32(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmpi,&args->mtmpi); + if ( ntmpi < 0 ) return 0; // nothing to add + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_int32(args,line,col,rec->n_allele,rec->d.allele,ntmpi); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_int32(args->hdr, line, col->hdr_key_dst, &args->tmpi2, &args->mtmpi2); + if ( ret>0 && args->tmpi2[0]!=bcf_int32_missing ) return 0; + } + + return bcf_update_info_int32(args->hdr_out,line,col->hdr_key_dst,args->tmpi,ntmpi); +} +static int setter_ARinfo_real(args_t *args, bcf1_t *line, annot_col_t *col, int nals, char **als, int ntmpf) +{ + if ( col->number==BCF_VL_A && ntmpf!=nals-1 && (ntmpf!=1 || !bcf_float_is_missing(args->tmpf[0]) || !bcf_float_is_vector_end(args->tmpf[0])) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", ntmpf,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + else if ( col->number==BCF_VL_R && ntmpf!=nals && (ntmpf!=1 || !bcf_float_is_missing(args->tmpf[0]) || !bcf_float_is_vector_end(args->tmpf[0])) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", ntmpf,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + int *map = vcmp_map_ARvalues(args->vcmp,ndst,nals,als,line->n_allele,line->d.allele); + if ( !map ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + // fill in any missing values in the target VCF (or all, if not present) + int ntmpf2 = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpf2, &args->mtmpf2); + if ( ntmpf2 < ndst ) hts_expand(float,ndst,args->mtmpf2,args->tmpf2); + + int i; + for (i=0; itmpf2[i]); + continue; + } + if ( ntmpf2==ndst && (col->replace & REPLACE_MISSING) + && !bcf_float_is_missing(args->tmpf2[i]) + && !bcf_float_is_vector_end(args->tmpf2[i]) ) continue; + + args->tmpf2[i] = args->tmpf[ map[i] ]; + } + return bcf_update_info_float(args->hdr_out,line,col->hdr_key_dst,args->tmpf2,ndst); +} +static int setter_info_real(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + annot_line_t *tab = (annot_line_t*) data; + + // This is a bit hacky, only to reuse existing code with minimal changes: + // -c =TAG will now behave as -l TAG:APPEND for floats + if ( col->replace & SET_OR_APPEND ) col->merge_method=MM_APPEND; + + if ( !tab ) + { + if ( col->merge_method!=MM_SUM && col->merge_method!=MM_AVG && + col->merge_method!=MM_MIN && col->merge_method!=MM_MAX && + col->merge_method!=MM_APPEND && + col->merge_method!=MM_APPEND_MISSING ) + error("Error: at the moment only the sum,avg,min,max,append,append-missing options are supported with --merge-logic for INFO type=Float\n"); + } + + int i,ntmpf = 0; + if ( (col->replace & SET_OR_APPEND) && !col->mm_dbl_nused ) + { + ntmpf = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpf, &args->mtmpf); + if ( ntmpf>0 && (!bcf_float_is_missing(args->tmpf[0]) || (col->replace & CARRY_OVER_MISSING)) ) + { + col->mm_dbl_nused = ntmpf; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; itmpf[i]) ) + bcf_double_set_missing(col->mm_dbl[i]); + else + col->mm_dbl[i] = args->tmpf[i]; + col->mm_dbl_ndat = 1; + } + ntmpf = 0; + } + if ( tab ) // data row, not just flushing + { + char *str = tab->cols[col->icol], *end = str; + if ( str[0]=='.' && str[1]==0 && col->merge_method!=MM_APPEND_MISSING && !(col->replace & CARRY_OVER_MISSING) ) return 1; + + while ( *end ) + { + ntmpf++; + hts_expand(float,ntmpf,args->mtmpf,args->tmpf); + if ( str[0]=='.' && (str[1]==0 || str[1]==',') ) + { + if ( col->merge_method==MM_APPEND_MISSING || (col->replace & CARRY_OVER_MISSING) ) + bcf_float_set_missing(args->tmpf[ntmpf-1]); + else + ntmpf--; + if ( str[1]==0 ) end = str+1; + str += 2; + } + else + { + args->tmpf[ntmpf-1] = strtod(str, &end); + if ( end==str ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + str = end+1; + } + } + if ( col->merge_method!=MM_FIRST ) + { + if ( !col->mm_dbl_nused ) + { + col->mm_dbl_nused = ntmpf; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; itmpf[i]) ) + bcf_double_set_missing(col->mm_dbl[i]); + else + col->mm_dbl[i] = args->tmpf[i]; + } + } + else + { + if ( col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING ) + { + int nori = col->mm_dbl_nused; + col->mm_dbl_nused += ntmpf; + hts_expand(double,col->mm_dbl_nused,col->mm_dbl_nalloc,col->mm_dbl); + for (i=0; itmpf[i]) ) + bcf_double_set_missing(col->mm_dbl[i+nori]); + else + col->mm_dbl[i+nori] = args->tmpf[i]; + } + } + else + { + if ( ntmpf!=col->mm_dbl_nused ) error("Error: cannot merge fields of unequal length\n"); + if ( col->merge_method==MM_SUM || col->merge_method==MM_AVG ) + for (i=0; imm_dbl[i] += args->tmpf[i]; + else if ( col->merge_method==MM_MIN ) + for (i=0; imm_dbl[i] > args->tmpf[i] ) col->mm_dbl[i] = args->tmpf[i]; } + else if ( col->merge_method==MM_MAX ) + for (i=0; imm_dbl[i] < args->tmpf[i] ) col->mm_dbl[i] = args->tmpf[i]; } + } + } + col->mm_dbl_ndat++; + return 1; + } + } + else if ( col->merge_method==MM_SUM || col->merge_method==MM_MIN || col->merge_method==MM_MAX || col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING ) + { + ntmpf = col->mm_dbl_nused; + hts_expand(int32_t,ntmpf,args->mtmpf,args->tmpf); + for (i=0; imm_dbl[i]) ) + bcf_float_set_missing(args->tmpf[i]); + else + args->tmpf[i] = col->mm_dbl[i]; + } + col->mm_dbl_nused = col->mm_dbl_ndat = 0; + } + else if ( col->merge_method==MM_AVG ) + { + ntmpf = col->mm_dbl_nused; + hts_expand(int32_t,ntmpf,args->mtmpf,args->tmpf); + for (i=0; itmpf[i] = col->mm_dbl[i]/col->mm_dbl_ndat; + col->mm_dbl_nused = col->mm_dbl_ndat = 0; + } + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_real(args,line,col,tab->nals,tab->als,ntmpf); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpf2, &args->mtmpf2); + if ( ret>0 && !bcf_float_is_missing(args->tmpf2[0]) ) return 0; + } + + return bcf_update_info_float(args->hdr_out,line,col->hdr_key_dst,args->tmpf,ntmpf); +} +static int vcf_setter_info_real(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int ntmpf = bcf_get_info_float(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmpf,&args->mtmpf); + if ( ntmpf < 0 ) return 0; // nothing to add + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_real(args,line,col,rec->n_allele,rec->d.allele,ntmpf); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_float(args->hdr, line, col->hdr_key_dst, &args->tmpf2, &args->mtmpf2); + if ( ret>0 && !bcf_float_is_missing(args->tmpf2[0]) ) return 0; + } + + return bcf_update_info_float(args->hdr_out,line,col->hdr_key_dst,args->tmpf,ntmpf); +} +int copy_string_field(char *src, int isrc, int src_len, kstring_t *dst, int idst); // see vcfmerge.c +static int setter_ARinfo_string(args_t *args, bcf1_t *line, annot_col_t *col, int nals, char **als) +{ + assert( col->merge_method==MM_FIRST ); + + int nsrc = 1, lsrc = 0; + while ( args->tmps[lsrc] ) + { + if ( args->tmps[lsrc]==',' ) nsrc++; + lsrc++; + } + if ( col->number==BCF_VL_A && nsrc!=nals-1 && (nsrc!=1 || args->tmps[0]!='.' || args->tmps[1]!=0 ) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", nsrc,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + else if ( col->number==BCF_VL_R && nsrc!=nals && (nsrc!=1 || args->tmps[0]!='.' || args->tmps[1]!=0 ) ) + error("Incorrect number of values (%d) for the %s tag at %s:%"PRId64"\n", nsrc,col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + int *map = vcmp_map_ARvalues(args->vcmp,ndst,nals,als,line->n_allele,line->d.allele); + if ( !map ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + // fill in any missing values in the target VCF (or all, if not present) + int i, empty = 0, nstr, mstr = args->tmpks.m; + nstr = bcf_get_info_string(args->hdr, line, col->hdr_key_dst, &args->tmpks.s, &mstr); + args->tmpks.m = mstr; + if ( nstr<0 || (nstr==1 && args->tmpks.s[0]=='.' && args->tmpks.s[1]==0) ) + { + empty = 0; + args->tmpks.l = 0; + kputc('.',&args->tmpks); + for (i=1; itmpks); + } + else args->tmpks.l = nstr; + for (i=0; itmpks,i); + continue; + } + if ( col->replace & REPLACE_MISSING ) + { + // Do not replace filled values. The field must be looked up again because + // of realloc in copy_string_field + int n = 0; + char *str = args->tmpks.s; + while ( *str && ntmps,map[i],lsrc,&args->tmpks,i); + if ( ret!=0 ) error("[%s:%d %s] Failed to copy a string field\n", __FILE__,__LINE__,__func__); + } + return bcf_update_info_string(args->hdr_out,line,col->hdr_key_dst,args->tmpks.s); +} +void khash_str2int_clear_free(void *_hash) +{ + khash_t(str2int) *hash = (khash_t(str2int)*)_hash; + khint_t k; + if (hash == 0) return; + for (k = 0; k < kh_end(hash); ++k) + if (kh_exist(hash, k)) free((char*)kh_key(hash, k)); + kh_clear(str2int, hash); +} +static int setter_info_str(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( (col->replace & REPLACE_MISSING) && col->number!=BCF_VL_A && col->number!=BCF_VL_R ) + { + int ret = bcf_get_info_string(args->hdr, line, col->hdr_key_dst, &args->tmps2, &args->mtmps2); + if ( ret>0 && (args->tmps2[0]!='.' || args->tmps2[1]!=0) ) return 0; + } + + // This is a bit hacky, only to reuse existing code with minimal changes: + // -c =TAG will now behave as -l TAG:unique for strings + if ( col->replace & SET_OR_APPEND ) col->merge_method=MM_UNIQUE; + + annot_line_t *tab = (annot_line_t*) data; + + int len = 0; + if ( tab ) + { + len = strlen(tab->cols[col->icol]); + if ( !len ) return 0; + if ( len==1 && tab->cols[col->icol][0]=='.' && col->merge_method!=MM_APPEND_MISSING && !(col->replace & CARRY_OVER_MISSING) ) return 1; + } + + if ( col->merge_method!=MM_FIRST ) + { + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + error("Error: the --merge-logic option cannot be used with INFO tags Type=String,Number={A,R,G}\n"); + + if ( data ) + { + assert( col->merge_method==MM_APPEND || col->merge_method==MM_APPEND_MISSING || col->merge_method==MM_UNIQUE ); + if ( col->merge_method==MM_UNIQUE ) + { + if ( !col->mm_str_hash ) col->mm_str_hash = (khash_t(str2int)*)khash_str2int_init(); + if ( khash_str2int_has_key(col->mm_str_hash, tab->cols[col->icol]) ) return 1; + khash_str2int_inc(col->mm_str_hash, strdup(tab->cols[col->icol])); + } + + if ( (col->replace & SET_OR_APPEND) && !col->mm_kstr.l ) + { + int m = col->mm_kstr.m; + int n = bcf_get_info_string(args->hdr, line, col->hdr_key_dst, &col->mm_kstr.s, &m); + col->mm_kstr.m = m; + if ( n>0 && ((col->replace & CARRY_OVER_MISSING) || col->mm_kstr.s[0]!='.' || col->mm_kstr.s[1]) ) col->mm_kstr.l = n; + } + + if ( col->mm_kstr.l ) kputc(',',&col->mm_kstr); + kputs(tab->cols[col->icol], &col->mm_kstr); + return 1; + } + + if ( col->mm_kstr.l ) + { + hts_expand(char,col->mm_kstr.l+1,args->mtmps,args->tmps); + memcpy(args->tmps,col->mm_kstr.s,col->mm_kstr.l+1); + } + else + return 0; + + // flush the line + if ( col->merge_method==MM_UNIQUE ) + khash_str2int_clear_free(col->mm_str_hash); + col->mm_kstr.l = 0; + } + else + { + assert(tab); + hts_expand(char,len+1,args->mtmps,args->tmps); + memcpy(args->tmps,tab->cols[col->icol],len+1); + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_string(args,line,col,tab->nals,tab->als); + } + + return bcf_update_info_string(args->hdr_out,line,col->hdr_key_dst,args->tmps); +} +static int vcf_setter_info_str(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + + if ( col->getter ) + col->getter(args,rec,col,(void**)&args->tmps, &args->mtmps); + else + { + int ntmps = bcf_get_info_string(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmps,&args->mtmps); + if ( ntmps < 0 ) return 0; // nothing to add + } + + if ( col->number==BCF_VL_A || col->number==BCF_VL_R ) + return setter_ARinfo_string(args,line,col,rec->n_allele,rec->d.allele); + + if ( col->replace & REPLACE_MISSING ) + { + int ret = bcf_get_info_string(args->hdr, line, col->hdr_key_dst, &args->tmps2, &args->mtmps2); + if ( ret>0 && (args->tmps2[0]!='.' || args->tmps2[1]!=0) ) return 0; + } + + return bcf_update_info_string(args->hdr_out,line,col->hdr_key_dst,args->tmps); +} +static int genotypes_to_string(args_t *args, int nsrc1, int32_t *src, int nsmpl_dst, kstring_t *str) +{ + int i, isrc, idst; + int blen = nsrc1 > 1 ? nsrc1 + 1 : 1; // typically the genotypes take three bytes 0/1, no 0-termination is needed + +gt_length_too_big: + str->l = 0; + for (idst=0; idstsample_map ? args->sample_map[idst] : idst; + if ( isrc==-1 ) + { + kputc_('.', str); + for (i=1; i < blen; i++) kputc_(0, str); + continue; + } + + size_t plen = str->l; + int32_t *ptr = src + isrc*nsrc1; + for (i=0; il - plen > blen ) + { + // too many alternate alleles or ploidy is too large, the genotype does not fit + // three characters ("0/0" vs "10/10"). + blen *= 2; + goto gt_length_too_big; + } + plen = str->l - plen; + while ( plen < blen ) + { + kputc_(0, str); + plen++; + } + } + return 0; +} +static int vcf_setter_format_gt(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int nsrc = bcf_get_genotypes(args->files->readers[1].header,rec,&args->tmpi,&args->mtmpi); + if ( nsrc==-3 ) return 0; // the tag is not present + if ( nsrc<=0 ) return 1; // error + + // Genotypes are internally represented as integers. This is a complication when + // adding as a different Type=String field, such as FMT/newGT:=GT + if ( strcmp(col->hdr_key_src,col->hdr_key_dst) ) + { + int nsmpl_dst = bcf_hdr_nsamples(args->hdr_out); + int nsmpl_src = bcf_hdr_nsamples(args->files->readers[1].header); + genotypes_to_string(args,nsrc/nsmpl_src,args->tmpi,nsmpl_dst,&args->tmpks); + return bcf_update_format_char(args->hdr_out,line,col->hdr_key_dst,args->tmpks.s,args->tmpks.l); + } + + if ( !args->sample_map ) + return bcf_update_genotypes(args->hdr_out,line,args->tmpi,nsrc); + + int i, j, ndst = bcf_get_genotypes(args->hdr,line,&args->tmpi2,&args->mtmpi2); + if ( ndst > 0 ) ndst /= bcf_hdr_nsamples(args->hdr_out); + nsrc /= bcf_hdr_nsamples(args->files->readers[1].header); + if ( ndst<=0 ) // field not present in dst file + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; + hts_expand(int32_t, nsrc*bcf_hdr_nsamples(args->hdr_out), args->mtmpi2, args->tmpi2); + for (i=0; ihdr_out); i++) + { + int32_t *dst = args->tmpi2 + nsrc*i; + if ( args->sample_map[i]==-1 ) + { + dst[0] = bcf_gt_missing; + for (j=1; jtmpi + nsrc*args->sample_map[i]; + for (j=0; jhdr_out,line,args->tmpi2,nsrc*bcf_hdr_nsamples(args->hdr_out)); + } + else if ( ndst >= nsrc ) + { + for (i=0; ihdr_out); i++) + { + if ( args->sample_map[i]==-1 ) continue; + int32_t *src = args->tmpi + nsrc*args->sample_map[i]; + int32_t *dst = args->tmpi2 + ndst*i; + if ( (col->replace & REPLACE_NON_MISSING) && bcf_gt_is_missing(dst[0]) ) continue; + if ( (col->replace & REPLACE_MISSING) && !bcf_gt_is_missing(dst[0]) ) continue; + for (j=0; jhdr_out,line,args->tmpi2,ndst*bcf_hdr_nsamples(args->hdr_out)); + } + else // ndst < nsrc + { + hts_expand(int32_t, nsrc*bcf_hdr_nsamples(args->hdr_out), args->mtmpi3, args->tmpi3); + for (i=0; ihdr_out); i++) + { + int32_t *ori = args->tmpi2 + ndst*i; + int32_t *dst = args->tmpi3 + nsrc*i; + int keep_ori = 0; + if ( args->sample_map[i]==-1 ) keep_ori = 1; + else if ( (col->replace & REPLACE_NON_MISSING) && bcf_gt_is_missing(ori[0]) ) keep_ori = 1; + else if ( (col->replace & REPLACE_MISSING) && !bcf_gt_is_missing(ori[0]) ) keep_ori = 1; + if ( keep_ori ) + { + for (j=0; jtmpi + nsrc*args->sample_map[i]; + for (j=0; jhdr_out,line,args->tmpi3,nsrc*bcf_hdr_nsamples(args->hdr_out)); + } +} +static int count_vals(annot_line_t *tab, int icol_beg, int icol_end) +{ + int i, nmax = 1; + for (i=icol_beg; icols[i], *end = str; + if ( str[0]=='.' && !str[1] ) + { + // missing value + if ( !nmax ) nmax = 1; + continue; + } + int n = 1; + while ( *end ) + { + if ( *end==',' ) n++; + end++; + } + if ( nmaxsample_map ) + return bcf_update_format_int32(args->hdr_out,line,col->hdr_key_dst,vals,nvals*args->nsmpl_annot); + + int i, j, ndst = bcf_get_format_int32(args->hdr,line,col->hdr_key_dst,&args->tmpi2,&args->mtmpi2); + if ( ndst > 0 ) ndst /= bcf_hdr_nsamples(args->hdr_out); + if ( ndst<=0 ) + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; // overwrite only if present + hts_expand(int32_t, nvals*bcf_hdr_nsamples(args->hdr_out), args->mtmpi2, args->tmpi2); + for (i=0; ihdr_out); i++) + { + int32_t *dst = args->tmpi2 + nvals*i; + if ( args->sample_map[i]==-1 ) + { + dst[0] = bcf_int32_missing; + for (j=1; jsample_map[i]; + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpi2,nvals*bcf_hdr_nsamples(args->hdr_out)); + } + else if ( ndst >= nvals ) + { + for (i=0; ihdr_out); i++) + { + if ( args->sample_map[i]==-1 ) continue; + int32_t *src = vals + nvals*args->sample_map[i]; + int32_t *dst = args->tmpi2 + ndst*i; + // possible cases: + // in annot out + // x y x TAG,-TAG,=TAG .. REPLACE_ALL, REPLACE_NON_MISSING, SET_OR_APPEND + // x y y +TAG .. REPLACE_MISSING + // . y . =TAG .. SET_OR_APPEND + // . y y TAG,+TAG,-TAG .. REPLACE_ALL, REPLACE_MISSING, REPLACE_NON_MISSING + // x . x TAG,+TAG .. REPLACE_ALL, REPLACE_MISSING + // x . . -TAG .. REPLACE_NON_MISSING + if ( col->replace & REPLACE_NON_MISSING ) { if ( dst[0]==bcf_int32_missing ) continue; } + else if ( col->replace & REPLACE_MISSING ) { if ( dst[0]!=bcf_int32_missing ) continue; } + else if ( col->replace & REPLACE_ALL ) { if ( src[0]==bcf_int32_missing ) continue; } + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpi2,ndst*bcf_hdr_nsamples(args->hdr_out)); + } + else // ndst < nvals + { + hts_expand(int32_t, nvals*bcf_hdr_nsamples(args->hdr_out), args->mtmpi3, args->tmpi3); + for (i=0; ihdr_out); i++) + { + int32_t *ann = vals + nvals*args->sample_map[i]; + int32_t *ori = args->tmpi2 + ndst*i; // ori vcf line + int32_t *dst = args->tmpi3 + nvals*i; // expanded buffer + int use_new_ann = 1; + if ( args->sample_map[i]==-1 ) use_new_ann = 0; + else if ( col->replace & REPLACE_NON_MISSING ) { if ( ori[0]==bcf_int32_missing ) use_new_ann = 0; } + else if ( col->replace & REPLACE_MISSING ) { if ( ori[0]!=bcf_int32_missing ) use_new_ann = 0; } + else if ( col->replace & REPLACE_ALL ) { if ( ann[0]==bcf_int32_missing ) use_new_ann = 0; } + if ( !use_new_ann ) + { + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpi3,nvals*bcf_hdr_nsamples(args->hdr_out)); + } +} +static int core_setter_format_real(args_t *args, bcf1_t *line, annot_col_t *col, float *vals, int nvals) +{ + if ( !args->sample_map ) + return bcf_update_format_float(args->hdr_out,line,col->hdr_key_dst,vals,nvals*args->nsmpl_annot); + + int i, j, ndst = bcf_get_format_float(args->hdr,line,col->hdr_key_dst,&args->tmpf2,&args->mtmpf2); + if ( ndst > 0 ) ndst /= bcf_hdr_nsamples(args->hdr_out); + if ( ndst<=0 ) + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; // overwrite only if present + hts_expand(float, nvals*bcf_hdr_nsamples(args->hdr_out), args->mtmpf2, args->tmpf2); + for (i=0; ihdr_out); i++) + { + float *dst = args->tmpf2 + nvals*i; + if ( args->sample_map[i]==-1 ) + { + bcf_float_set_missing(dst[0]); + for (j=1; jsample_map[i]; + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpf2,nvals*bcf_hdr_nsamples(args->hdr_out)); + } + else if ( ndst >= nvals ) + { + for (i=0; ihdr_out); i++) + { + if ( args->sample_map[i]==-1 ) continue; + float *src = vals + nvals*args->sample_map[i]; + float *dst = args->tmpf2 + ndst*i; + if ( col->replace & REPLACE_NON_MISSING ) { if ( bcf_float_is_missing(dst[0]) ) continue; } + else if ( col->replace & REPLACE_MISSING ) { if ( !bcf_float_is_missing(dst[0]) ) continue; } + else if ( col->replace & REPLACE_ALL ) { if ( bcf_float_is_missing(src[0]) ) continue; } + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpf2,ndst*bcf_hdr_nsamples(args->hdr_out)); + } + else // ndst < nvals + { + hts_expand(float, nvals*bcf_hdr_nsamples(args->hdr_out), args->mtmpf3, args->tmpf3); + for (i=0; ihdr_out); i++) + { + float *ann = vals + nvals*args->sample_map[i]; + float *ori = args->tmpf2 + ndst*i; // ori vcf line + float *dst = args->tmpf3 + nvals*i; // expanded buffer + int use_new_ann = 1; + if ( args->sample_map[i]==-1 ) use_new_ann = 0; + else if ( col->replace & REPLACE_NON_MISSING ) { if ( bcf_float_is_missing(ori[0]) ) use_new_ann = 0; } + else if ( col->replace & REPLACE_MISSING ) { if ( !bcf_float_is_missing(ori[0]) ) use_new_ann = 0; } + else if ( col->replace & REPLACE_ALL ) { if ( bcf_float_is_missing(ann[0]) ) use_new_ann = 0; } + if ( !use_new_ann ) + { + for (j=0; jhdr_out,line,col->hdr_key_dst,args->tmpf3,nvals*bcf_hdr_nsamples(args->hdr_out)); + } +} +static int core_setter_format_str(args_t *args, bcf1_t *line, annot_col_t *col, char **vals) +{ + if ( !args->sample_map ) + return bcf_update_format_string(args->hdr_out,line,col->hdr_key_dst,(const char**)vals,args->nsmpl_annot); + + int i; + args->tmpp2[0] = args->tmps2; + int ret = bcf_get_format_string(args->hdr,line,col->hdr_key_dst,&args->tmpp2,&args->mtmps2); + args->tmps2 = args->tmpp2[0]; // tmps2 might be realloced + + int nsmpl = bcf_hdr_nsamples(args->hdr_out); + if ( ret<=0 ) // not present in dst + { + hts_expand(char,bcf_hdr_nsamples(args->hdr_out)*2,args->mtmps2,args->tmps2); + char *tmp = args->tmps2; + for (i=0; itmpp2[i] = tmp; + tmp += 2; + } + } + for (i=0; isample_map[i]==-1 ) continue; + char **src = vals + args->sample_map[i]; + char **dst = args->tmpp2 + i; + + if ( col->replace & REPLACE_NON_MISSING ) { if ( (*dst)[0]=='.' && (*dst)[1]==0 ) continue; } + else if ( col->replace & REPLACE_MISSING ) { if ( (*dst)[0]!='.' || (*dst)[1]!=0 ) continue; } + else if ( col->replace & REPLACE_ALL ) { if ( (*src)[0]=='.' && (*src)[1]==0 ) continue; } + *dst = *src; + } + return bcf_update_format_string(args->hdr_out,line,col->hdr_key_dst,(const char**)args->tmpp2,nsmpl); +} +static int setter_format_int(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with FORMAT tags (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + if ( col->icol+args->nsmpl_annot > tab->ncols ) + error("Incorrect number of values for %s at %s:%"PRId64"\n",col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + int nvals = count_vals(tab,col->icol,col->icol+args->nsmpl_annot); + hts_expand(int32_t,nvals*args->nsmpl_annot,args->mtmpi,args->tmpi); + + int icol = col->icol, ismpl; + for (ismpl=0; ismplnsmpl_annot; ismpl++) + { + int32_t *ptr = args->tmpi + ismpl*nvals; + int ival = 0; + + char *str = tab->cols[icol]; + while ( *str ) + { + if ( str[0]=='.' && (!str[1] || str[1]==',') ) // missing value + { + ptr[ival++] = bcf_int32_missing; + str += str[1] ? 2 : 1; + continue; + } + + char *end = str; + ptr[ival] = strtol(str, &end, 10); + if ( end==str ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + + ival++; + str = *end ? end+1 : end; + } + while ( ivaltmpi,nvals); +} +static int setter_format_real(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with FORMAT tags (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + if ( col->icol+args->nsmpl_annot > tab->ncols ) + error("Incorrect number of values for %s at %s:%"PRId64"\n",col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + int nvals = count_vals(tab,col->icol,col->icol+args->nsmpl_annot); + hts_expand(float,nvals*args->nsmpl_annot,args->mtmpf,args->tmpf); + + int icol = col->icol, ismpl; + for (ismpl=0; ismplnsmpl_annot; ismpl++) + { + float *ptr = args->tmpf + ismpl*nvals; + int ival = 0; + + char *str = tab->cols[icol]; + while ( *str ) + { + if ( str[0]=='.' && (!str[1] || str[1]==',') ) // missing value + { + bcf_float_set_missing(ptr[ival]); + ival++; + str += str[1] ? 2 : 1; + continue; + } + + char *end = str; + ptr[ival] = strtod(str, &end); + if ( end==str ) + error("Could not parse %s at %s:%"PRId64" .. [%s]\n", col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1,tab->cols[col->icol]); + + ival++; + str = *end ? end+1 : end; + } + while ( ivaltmpf,nvals); +} +static int setter_format_str(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + if ( !data ) error("Error: the --merge-logic option cannot be used with FORMAT tags (yet?)\n"); + + annot_line_t *tab = (annot_line_t*) data; + if ( col->icol+args->nsmpl_annot > tab->ncols ) + error("Incorrect number of values for %s at %s:%"PRId64"\n",col->hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ismpl; + for (ismpl=0; ismplnsmpl_annot; ismpl++) + args->tmpp[ismpl] = tab->cols[col->icol + ismpl]; + + return core_setter_format_str(args,line,col,args->tmpp); +} +static int determine_ploidy(int nals, int *vals, int nvals1, uint8_t *smpl, int nsmpl) +{ + int i, j, ndip = nals*(nals+1)/2, max_ploidy = 0; + for (i=0; ifiles->readers[1].header,rec,col->hdr_key_src,&args->tmpi,&args->mtmpi); + if ( nsrc==-3 ) return 0; // the tag is not present + if ( nsrc<=0 ) return 1; // error + int nsmpl_src = bcf_hdr_nsamples(args->files->readers[1].header); + int nsrc1 = nsrc / nsmpl_src; + if ( col->number!=BCF_VL_G && col->number!=BCF_VL_R && col->number!=BCF_VL_A ) + return core_setter_format_int(args,line,col,args->tmpi,nsrc1); + + // create mapping from src to dst genotypes, haploid and diploid version + int nmap_hap = col->number==BCF_VL_G || col->number==BCF_VL_R ? rec->n_allele : rec->n_allele - 1; + int *map_hap = vcmp_map_ARvalues(args->vcmp,nmap_hap,line->n_allele,line->d.allele,rec->n_allele,rec->d.allele); + if ( !map_hap ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int i, j; + if ( rec->n_allele==line->n_allele ) + { + // alleles unchanged? + for (i=0; in_allele; i++) if ( map_hap[i]!=i ) break; + if ( i==rec->n_allele ) + return core_setter_format_int(args,line,col,args->tmpi,nsrc1); + } + + int nsmpl_dst = rec->n_sample; + int ndst = bcf_get_format_int32(args->hdr,line,col->hdr_key_dst,&args->tmpi2,&args->mtmpi2); + int ndst1 = ndst / nsmpl_dst; + if ( ndst <= 0 ) + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; // overwrite only if present + if ( col->number==BCF_VL_G ) + ndst1 = line->n_allele*(line->n_allele+1)/2; + else + ndst1 = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + hts_expand(int, ndst1*nsmpl_dst, args->mtmpi2, args->tmpi2); + for (i=0; itmpi2 + i*ndst1; + for (j=0; jnumber==BCF_VL_G ) + { + map_dip = vcmp_map_dipGvalues(args->vcmp, &nmap_dip); + if ( !args->src_smpl_pld ) + { + args->src_smpl_pld = (uint8_t*) malloc(nsmpl_src); + args->dst_smpl_pld = (uint8_t*) malloc(nsmpl_dst); + } + int pld_src = determine_ploidy(rec->n_allele, args->tmpi, nsrc1, args->src_smpl_pld, nsmpl_src); + if ( pld_src<0 ) + error("Unexpected number of %s values (%d) for %d alleles at %s:%"PRId64"\n", col->hdr_key_src,-pld_src, rec->n_allele, bcf_seqname(bcf_sr_get_header(args->files,1),rec),(int64_t) rec->pos+1); + int pld_dst = determine_ploidy(line->n_allele, args->tmpi2, ndst1, args->dst_smpl_pld, nsmpl_dst); + if ( pld_dst<0 ) + error("Unexpected number of %s values (%d) for %d alleles at %s:%"PRId64"\n", col->hdr_key_src,-pld_dst, line->n_allele, bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst1_new = pld_dst==1 ? line->n_allele : line->n_allele*(line->n_allele+1)/2; + if ( ndst1_new != ndst1 ) + { + if ( ndst1 ) error("todo: %s ndst1!=ndst .. %d %d at %s:%"PRId64"\n",col->hdr_key_src,ndst1_new,ndst1,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + ndst1 = ndst1_new; + hts_expand(int32_t, ndst1*nsmpl_dst, args->mtmpi2, args->tmpi2); + } + } + else if ( !ndst1 ) + { + ndst1 = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + hts_expand(int32_t, ndst1*nsmpl_dst, args->mtmpi2, args->tmpi2); + } + + for (i=0; isample_map ? args->sample_map[i] : i; + int32_t *ptr_src = args->tmpi + i*nsrc1; + int32_t *ptr_dst = args->tmpi2 + ii*ndst1; + + if ( col->number==BCF_VL_G ) + { + if ( args->src_smpl_pld[ii] > 0 && args->dst_smpl_pld[i] > 0 && args->src_smpl_pld[ii]!=args->dst_smpl_pld[i] ) + error("Sample ploidy differs at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( !args->dst_smpl_pld[i] ) + for (j=0; jnumber!=BCF_VL_G || args->src_smpl_pld[i]==1 ) + { + for (j=0; j=0 ) ptr_dst[k] = ptr_src[j]; + } + if ( col->number==BCF_VL_G ) + for (j=line->n_allele; j=0 ) ptr_dst[k] = ptr_src[j]; + } + } + } + return bcf_update_format_int32(args->hdr_out,line,col->hdr_key_dst,args->tmpi2,nsmpl_dst*ndst1); +} +static int vcf_setter_format_real(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + int nsrc = bcf_get_format_float(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmpf,&args->mtmpf); + if ( nsrc==-3 ) return 0; // the tag is not present + if ( nsrc<=0 ) return 1; // error + int nsmpl_src = bcf_hdr_nsamples(args->files->readers[1].header); + int nsrc1 = nsrc / nsmpl_src; + if ( col->number!=BCF_VL_G && col->number!=BCF_VL_R && col->number!=BCF_VL_A ) + return core_setter_format_real(args,line,col,args->tmpf,nsrc1); + + // create mapping from src to dst genotypes, haploid and diploid version + int nmap_hap = col->number==BCF_VL_G || col->number==BCF_VL_R ? rec->n_allele : rec->n_allele - 1; + int *map_hap = vcmp_map_ARvalues(args->vcmp,nmap_hap,line->n_allele,line->d.allele,rec->n_allele,rec->d.allele); + if ( !map_hap ) error("REF alleles not compatible at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int i, j; + if ( rec->n_allele==line->n_allele ) + { + // alleles unchanged? + for (i=0; in_allele; i++) if ( map_hap[i]!=i ) break; + if ( i==rec->n_allele ) + return core_setter_format_real(args,line,col,args->tmpf,nsrc1); + } + + int nsmpl_dst = rec->n_sample; + int ndst = bcf_get_format_float(args->hdr,line,col->hdr_key_dst,&args->tmpf2,&args->mtmpf2); + int ndst1 = ndst / nsmpl_dst; + if ( ndst <= 0 ) + { + if ( col->replace & REPLACE_NON_MISSING ) return 0; // overwrite only if present + if ( col->number==BCF_VL_G ) + ndst1 = line->n_allele*(line->n_allele+1)/2; + else + ndst1 = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + hts_expand(float, ndst1*nsmpl_dst, args->mtmpf2, args->tmpf2); + for (i=0; itmpf2 + i*ndst1; + for (j=0; jnumber==BCF_VL_G ) + { + map_dip = vcmp_map_dipGvalues(args->vcmp, &nmap_dip); + if ( !args->src_smpl_pld ) + { + args->src_smpl_pld = (uint8_t*) malloc(nsmpl_src); + args->dst_smpl_pld = (uint8_t*) malloc(nsmpl_dst); + } + int pld_src = determine_ploidy(rec->n_allele, args->tmpi, nsrc1, args->src_smpl_pld, nsmpl_src); + if ( pld_src<0 ) + error("Unexpected number of %s values (%d) for %d alleles at %s:%"PRId64"\n", col->hdr_key_src,-pld_src, rec->n_allele, bcf_seqname(bcf_sr_get_header(args->files,1),rec),(int64_t) rec->pos+1); + int pld_dst = determine_ploidy(line->n_allele, args->tmpi2, ndst1, args->dst_smpl_pld, nsmpl_dst); + if ( pld_dst<0 ) + error("Unexpected number of %s values (%d) for %d alleles at %s:%"PRId64"\n", col->hdr_key_src,-pld_dst, line->n_allele, bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + int ndst1_new = pld_dst==1 ? line->n_allele : line->n_allele*(line->n_allele+1)/2; + if ( ndst1_new != ndst1 ) + { + if ( ndst1 ) error("todo: %s ndst1!=ndst .. %d %d at %s:%"PRId64"\n",col->hdr_key_src,ndst1_new,ndst1,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + ndst1 = ndst1_new; + hts_expand(float, ndst1*nsmpl_dst, args->mtmpf2, args->tmpf2); + } + } + else if ( !ndst1 ) + { + ndst1 = col->number==BCF_VL_A ? line->n_allele - 1 : line->n_allele; + hts_expand(float, ndst1*nsmpl_dst, args->mtmpf2, args->tmpf2); + } + + for (i=0; isample_map ? args->sample_map[i] : i; + float *ptr_src = args->tmpf + i*nsrc1; + float *ptr_dst = args->tmpf2 + ii*ndst1; + + if ( col->number==BCF_VL_G ) + { + if ( args->src_smpl_pld[ii] > 0 && args->dst_smpl_pld[i] > 0 && args->src_smpl_pld[ii]!=args->dst_smpl_pld[i] ) + error("Sample ploidy differs at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( !args->dst_smpl_pld[i] ) + for (j=0; jnumber!=BCF_VL_G || args->src_smpl_pld[i]==1 ) + { + for (j=0; j=0 ) + { + if ( bcf_float_is_missing(ptr_src[j]) ) bcf_float_set_missing(ptr_dst[k]); + else if ( bcf_float_is_vector_end(ptr_src[j]) ) bcf_float_set_vector_end(ptr_dst[k]); + else ptr_dst[k] = ptr_src[j]; + } + } + if ( col->number==BCF_VL_G ) + for (j=line->n_allele; j=0 ) + { + if ( bcf_float_is_missing(ptr_src[j]) ) bcf_float_set_missing(ptr_dst[k]); + else if ( bcf_float_is_vector_end(ptr_src[j]) ) bcf_float_set_vector_end(ptr_dst[k]); + else ptr_dst[k] = ptr_src[j]; + } + } + } + } + return bcf_update_format_float(args->hdr_out,line,col->hdr_key_dst,args->tmpf2,nsmpl_dst*ndst1); +} + +static int vcf_setter_format_str(args_t *args, bcf1_t *line, annot_col_t *col, void *data) +{ + bcf1_t *rec = (bcf1_t*) data; + args->tmpp[0] = args->tmps; + int ret = bcf_get_format_string(args->files->readers[1].header,rec,col->hdr_key_src,&args->tmpp,&args->mtmps); + args->tmps = args->tmpp[0]; // tmps might be realloced + if ( ret==-3 ) return 0; // the tag is not present + if ( ret<=0 ) return 1; // error + if ( strcmp("GT",col->hdr_key_dst) ) + return core_setter_format_str(args,line,col,args->tmpp); + + // Genotypes are internally represented as integers. This is a complication for FMT/GT:=oldGT + // First determine the maximum number of alleles per-sample ndst1 + int nsmpl_src = bcf_hdr_nsamples(args->files->readers[1].header); + int nsmpl_dst = bcf_hdr_nsamples(args->hdr_out); + int isrc,idst, ndst1 = 0, nsrc1 = ret / nsmpl_src; + char *ptr = args->tmps, *ptr_end = ptr + ret; + while ( ptr < ptr_end ) + { + char *smpl_end = ptr + nsrc1; + int n = 1; + while ( ptr < smpl_end ) + { + if ( *ptr=='/' || *ptr=='|' ) n++; + ptr++; + } + if ( ndst1 < n ) ndst1 = n; + } + assert( ndst1 ); + + int ndst = ndst1*nsmpl_dst; + hts_expand(int32_t,ndst,args->mtmpi,args->tmpi); + hts_expand(char,ret+1,args->mtmps,args->tmps); args->tmps[ret] = 0; // the FORMAT string may not be 0-terminated + for (idst=0; idsttmpi + idst*ndst1; + isrc = args->sample_map ? args->sample_map[idst] : idst; + if ( isrc==-1 ) + { + dst[0] = bcf_gt_missing; + for (i=1; itmps + isrc*nsrc1, *tmp; + char *keep_ptr = beg+nsrc1, keep = *keep_ptr; *keep_ptr = 0; + while ( *beg ) + { + char *end = beg; + while ( *end && *end!='/' && *end!='|' ) end++; + if ( *beg=='.' && end-beg==1 ) dst[i] = bcf_gt_missing; + else + { + if ( *end=='|' ) is_phased = 1; + dst[i] = strtol(beg, &tmp, 10); + if ( tmp!=end ) + error("Could not parse the %s field at %s:%"PRId64" in %s\n", col->hdr_key_src,bcf_seqname(args->files->readers[1].header,rec),(int64_t) rec->pos+1,args->targets_fname); + if ( dst[i] >= line->n_allele ) + error("The source allele index is bigger than the number of destination alleles at %s:%"PRId64"\n", bcf_seqname(args->files->readers[1].header,rec),(int64_t) rec->pos+1); + dst[i] = is_phased ? bcf_gt_phased(dst[i]) : bcf_gt_unphased(dst[i]); + } + beg = *end ? end+1 : end; + i++; + } + *keep_ptr = keep; + for (; ihdr_out,line,args->tmpi,ndst); +} +static int init_sample_map(args_t *args, bcf_hdr_t *src, bcf_hdr_t *dst) +{ + int i; + if ( !args->sample_names ) + { + args->nsmpl_annot = bcf_hdr_nsamples(dst); + + // tab annotation file, expecting that all samples are present: sample map not needed + if ( !src ) return 0; + + int nmatch = 0; + for (i=0; isamples[i]); + if ( id!=-1 ) nmatch++; + } + if ( !nmatch ) return -1; // No matching samples found in the source and the destination file + + args->nsample_map = bcf_hdr_nsamples(dst); + args->sample_map = (int*) malloc(sizeof(int)*args->nsample_map); + for (i=0; insample_map; i++) + { + int id = bcf_hdr_id2int(src, BCF_DT_SAMPLE, dst->samples[i]); + args->sample_map[i] = id; // idst -> isrc, -1 if not present + } + return 1; + } + + args->nsample_map = bcf_hdr_nsamples(dst); + args->sample_map = (int*) malloc(sizeof(int)*args->nsample_map); + for (i=0; insample_map; i++) args->sample_map[i] = -1; + + int flags = !src ? SMPL_STRICT|SMPL_SINGLE : SMPL_STRICT|SMPL_SINGLE|SMPL_PAIR2; // is vcf vs tab annotation file + smpl_ilist_t *ilist = smpl_ilist_init(dst, args->sample_names, args->sample_is_file, flags); // gives mapping dst->src + if ( !ilist || !ilist->n ) error("Could not parse the samples: %s\n", args->sample_names); + args->nsmpl_annot = ilist->n; + int need_sample_map = args->nsmpl_annot==bcf_hdr_nsamples(dst) ? 0 : 1; + for (i=0; insmpl_annot; i++) + { + int idst = ilist->idx[i]; + const char *src_name = ilist->pair && ilist->pair[i] ? ilist->pair[i] : bcf_hdr_int2id(dst, BCF_DT_SAMPLE, idst); + int isrc = i; + if ( src ) // the annotation file is a VCF, not a tab-delimited file + { + isrc = bcf_hdr_id2int(src, BCF_DT_SAMPLE, src_name); + if ( isrc==-1 ) error("Sample \"%s\" not found in the annotation file\n", src_name); + } + if ( isrc!=idst ) need_sample_map = 1; + args->sample_map[idst] = isrc; + } + smpl_ilist_destroy(ilist); + return need_sample_map; +} +static char *columns_complement(char *columns, void **skip_info, void **skip_fmt) +{ + kstring_t str = {0,0,0}; + char *ss = columns, *se = ss; + while ( *ss ) + { + if ( *se && *se!=',' ) { se++; continue; } + if ( *ss!='^' ) + { + if ( str.l ) kputc(',',&str); + kputsn(ss, se-ss, &str); + if ( !*se ) break; + ss = ++se; + continue; + } + + if ( !strncasecmp("^INFO/",ss,6) ) + { + if ( !*skip_info ) + { + *skip_info = khash_str2int_init(); + if ( str.l ) kputc(',',&str); + kputs("INFO",&str); + } + char tmp = *se; *se = 0; + khash_str2int_inc(*skip_info, strdup(ss+6)); + *se = tmp; + } + else if ( !strncasecmp("^FORMAT/",ss,8) || !strncasecmp("^FMT/",ss,5) ) + { + int n = !strncasecmp("^FMT/",ss,5) ? 5 : 8; + if ( !*skip_fmt ) + { + *skip_fmt = khash_str2int_init(); + if ( str.l ) kputc(',',&str); + kputs("FORMAT",&str); + } + char tmp = *se; *se = 0; + khash_str2int_inc(*skip_fmt, strdup(ss+n)); + *se = tmp; + } + else + { + if ( !*skip_info ) + { + *skip_info = khash_str2int_init(); + if ( str.l ) kputc(',',&str); + kputs("INFO",&str); + } + char tmp = *se; *se = 0; + khash_str2int_inc(*skip_info, strdup(ss+1)); + *se = tmp; + } + + if ( !*se ) break; + ss = ++se; + } + free(columns); + return str.s; +} +static void bcf_hrec_format_rename(bcf_hrec_t *hrec, char *tag, kstring_t *str) +{ + int j, nout = 0; + ksprintf(str, "##%s=<", hrec->key); + for (j=0; jnkeys; j++) + { + if ( !strcmp("IDX",hrec->keys[j]) ) continue; + if ( nout ) kputc(',',str); + if ( !strcmp("ID", hrec->keys[j]) ) + ksprintf(str,"%s=%s", hrec->keys[j], tag); + else + ksprintf(str,"%s=%s", hrec->keys[j], hrec->vals[j]); + nout++; + } + ksprintf(str,">\n"); +} +static char *set_replace_mode(char *ss, int *replace) +{ + int mode = 0; + while (*ss) + { + if ( *ss=='+' ) mode |= REPLACE_MISSING; + else if ( *ss=='-' ) mode |= REPLACE_NON_MISSING; + else if ( *ss=='=' ) mode |= SET_OR_APPEND; + else if ( *ss=='.' ) mode |= CARRY_OVER_MISSING; + else break; + ss++; + } + if ( !mode ) mode = REPLACE_ALL; +// is exactly one bit set? +// if ( mode && !(mode && ((mode & mode-1) == 0)) ) + *replace = mode; + return ss; +} +static void rename_annots_push(args_t *args, char *src, char *dst); +static void init_columns(args_t *args) +{ + int need_sample_map = 0; + int sample_map_ok = init_sample_map(args, args->tgts_is_vcf?args->files->readers[1].header:NULL, args->hdr); + + kstring_t tmp = {0,0,0}; + if ( args->columns_is_file ) + { + int i,n; + char **str = hts_readlist(args->columns, args->columns_is_file, &n); + if ( !str ) error("Could not parse %s\n", args->columns); + for (i=0; imerge_method_str.l ) kputc(',',&args->merge_method_str); + kputs(str[i],&args->merge_method_str); + kputc(':',&args->merge_method_str); + kputs(ptr,&args->merge_method_str); + } + } + if ( tmp.l ) kputc(',',&tmp); + kputs(str[i],&tmp); + free(str[i]); + } + free(str); + free(args->columns); + args->columns = tmp.s; + tmp.l = tmp.m = 0; + tmp.s = NULL; + } + + void *skip_fmt = NULL, *skip_info = NULL; + if ( args->tgts_is_vcf ) + args->columns = columns_complement(args->columns, &skip_info, &skip_fmt); + + kstring_t str = {0,0,0}; + char *ss = args->columns, *se = ss; + args->ncols = 0; + int icol = -1, has_fmt_str = 0; + while ( *ss ) + { + char *ptr; + if ( *se && *se!=',' ) { se++; continue; } + int replace; + ss = set_replace_mode(ss, &replace); + icol++; + str.l = 0; + kputsn(ss, se-ss, &str); + if ( !str.s[0] || !strcasecmp("-",str.s) ) ; + else if ( !strcasecmp("CHROM",str.s) ) args->chr_idx = icol; + else if ( !strcasecmp("POS",str.s) ) args->beg_idx = icol; + else if ( !strcasecmp("FROM",str.s) || !strcasecmp("BEG",str.s) ) args->beg_idx = icol; + else if ( !strcasecmp("TO",str.s) || !strcasecmp("END",str.s) ) args->end_idx = icol; + else if ( !strcasecmp("REF",str.s) ) + { + if ( args->tgts_is_vcf ) + { + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->setter = vcf_setter_ref; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + } + else args->ref_idx = icol; + } + else if ( !strcasecmp("ALT",str.s) ) + { + if ( args->tgts_is_vcf ) + { + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->setter = vcf_setter_alt; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + col->replace = replace; + if ( args->pair_logic==-1 ) bcf_sr_set_opt(args->files,BCF_SR_PAIR_LOGIC,BCF_SR_PAIR_BOTH_REF); + } + else args->alt_idx = icol; + } + else if ( !strcasecmp("ID",str.s) || !strcasecmp("~ID",str.s) ) + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -ID feature has not been implemented yet.\n"); + if ( str.s[0]=='~' ) replace = MATCH_VALUE; + if ( args->tgts_is_vcf && (replace & MATCH_VALUE) ) error("todo: -c ~ID with -a VCF?\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = args->tgts_is_vcf ? vcf_setter_id : setter_id; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + if ( replace & MATCH_VALUE ) args->match_id = icol; + } + else if ( !strcasecmp("~INFO/END",str.s) && !args->tgts_is_vcf ) + { + replace = MATCH_VALUE; + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = NULL; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + args->match_end = icol; + } + else if ( !strcasecmp("~POS",str.s) && !args->tgts_is_vcf ) + { + if ( args->tgts_is_vcf ) error("Error: cannot use ~POS, position can be replaced only from a tab-delimited file\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = setter_pos; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + args->match_end = icol; + } + else if ( !strncasecmp("ID:=",str.s,4) ) // transfer a tag from INFO to ID column + { + if ( !args->tgts_is_vcf ) error("The annotation source must be a VCF for \"%s\"\n",str.s); + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -ID feature has not been implemented yet.\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = vcf_setter_id; + col->getter = vcf_getter_info_str2str; + str.s[2] = 0; + col->hdr_key_dst = strdup(str.s); + col->hdr_key_src = strncasecmp("INFO/",str.s+4,5) ? strdup(str.s+4) : strdup(str.s+4+5); + int hdr_id = bcf_hdr_id2int(args->tgts_hdr, BCF_DT_ID,col->hdr_key_src); + if ( !bcf_hdr_idinfo_exists(args->tgts_hdr,BCF_HL_INFO,hdr_id) ) + error("The INFO tag \"%s\" is not defined in %s\n", col->hdr_key_src, args->targets_fname); + if ( bcf_hdr_id2type(args->tgts_hdr,BCF_HL_INFO,hdr_id)!=BCF_HT_STR ) + error("Only Type=String tags can be used to annotate the ID column\n"); + } + else if ( (ptr=strstr(str.s,":=")) && !args->targets_fname ) + { + *ptr = 0; + rename_annots_push(args,ptr+2,str.s); + *ptr = ':'; + } + else if ( !strcasecmp("FILTER",str.s) ) + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -FILTER feature has not been implemented yet.\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = args->tgts_is_vcf ? vcf_setter_filter : setter_filter; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + if ( args->tgts_is_vcf ) + { + bcf_hdr_t *tgts_hdr = args->files->readers[1].header; + int j; + for (j=0; jnhrec; j++) + { + bcf_hrec_t *hrec = tgts_hdr->hrec[j]; + if ( hrec->type!=BCF_HL_FLT ) continue; + int k = bcf_hrec_find_key(hrec,"ID"); + if ( k<0 ) error("[%s] Failed to parse the header, the ID attribute not found", __func__); + tmp.l = 0; + bcf_hrec_format(hrec, &tmp); + bcf_hdr_append(args->hdr_out, tmp.s); + } + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + } + } + else if ( !strcasecmp("QUAL",str.s) ) + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -QUAL feature has not been implemented yet.\n"); + if ( replace & SET_OR_APPEND ) error("Apologies, the =QUAL feature has not been implemented yet.\n"); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->setter = args->tgts_is_vcf ? vcf_setter_qual : setter_qual; + col->hdr_key_src = strdup(str.s); + col->hdr_key_dst = strdup(str.s); + } + else if ( args->tgts_is_vcf && !strcasecmp("INFO",str.s) ) // All INFO fields + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -INFO/TAG feature has not been implemented yet.\n"); + if ( replace & SET_OR_APPEND ) error("Apologies, the =INFO feature has not been implemented yet.\n"); + bcf_hdr_t *tgts_hdr = args->files->readers[1].header; + int j; + for (j=0; jnhrec; j++) + { + bcf_hrec_t *hrec = tgts_hdr->hrec[j]; + if ( hrec->type!=BCF_HL_INFO ) continue; + int k = bcf_hrec_find_key(hrec,"ID"); + assert( k>=0 ); // this should always be true for valid VCFs + if ( skip_info && khash_str2int_has_key(skip_info,hrec->vals[k]) ) continue; + tmp.l = 0; + bcf_hrec_format(hrec, &tmp); + bcf_hdr_append(args->hdr_out, tmp.s); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + int hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, hrec->vals[k]); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = -1; + col->replace = replace; + col->hdr_key_src = strdup(hrec->vals[k]); + col->hdr_key_dst = strdup(hrec->vals[k]); + col->number = bcf_hdr_id2length(args->hdr_out,BCF_HL_INFO,hdr_id); + switch ( bcf_hdr_id2type(args->hdr_out,BCF_HL_INFO,hdr_id) ) + { + case BCF_HT_FLAG: col->setter = vcf_setter_info_flag; break; + case BCF_HT_INT: col->setter = vcf_setter_info_int; break; + case BCF_HT_REAL: col->setter = vcf_setter_info_real; break; + case BCF_HT_STR: col->setter = vcf_setter_info_str; break; + default: error("The type of %s not recognised (%d)\n", str.s,bcf_hdr_id2type(args->hdr_out,BCF_HL_INFO,hdr_id)); + } + } + } + else if ( args->tgts_is_vcf && (!strcasecmp("FORMAT",str.s) || !strcasecmp("FMT",str.s)) ) // All FORMAT fields + { + bcf_hdr_t *tgts_hdr = args->files->readers[1].header; + need_sample_map = 1; + int j; + for (j=0; jnhrec; j++) + { + bcf_hrec_t *hrec = tgts_hdr->hrec[j]; + if ( hrec->type!=BCF_HL_FMT) continue; + int k = bcf_hrec_find_key(hrec,"ID"); + assert( k>=0 ); // this should always be true for valid VCFs + if ( skip_fmt && khash_str2int_has_key(skip_fmt,hrec->vals[k]) ) continue; + tmp.l = 0; + bcf_hrec_format(hrec, &tmp); + bcf_hdr_append(args->hdr_out, tmp.s); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + int hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, hrec->vals[k]); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = -1; + col->replace = replace; + col->hdr_key_src = strdup(hrec->vals[k]); + col->hdr_key_dst = strdup(hrec->vals[k]); + if ( !strcasecmp("GT",col->hdr_key_src) ) + { + if ( !args->tgts_is_vcf ) error("The FORMAT/GT field can be currently populated only from a VCF\n"); + col->setter = vcf_setter_format_gt; + } + else + switch ( bcf_hdr_id2type(args->hdr_out,BCF_HL_FMT,hdr_id) ) + { + case BCF_HT_INT: col->setter = vcf_setter_format_int; break; + case BCF_HT_REAL: col->setter = vcf_setter_format_real; break; + case BCF_HT_STR: col->setter = vcf_setter_format_str; has_fmt_str = 1; break; + default: error("The type of %s not recognised (%d)\n", str.s,bcf_hdr_id2type(args->hdr_out,BCF_HL_FMT,hdr_id)); + } + hdr_id = bcf_hdr_id2int(tgts_hdr, BCF_DT_ID, hrec->vals[k]); + col->number = bcf_hdr_id2length(tgts_hdr,BCF_HL_FMT,hdr_id); + } + } + else if ( !strncasecmp("FORMAT/",str.s, 7) || !strncasecmp("FMT/",str.s,4) ) + { + char *key_dst = str.s + (!strncasecmp("FMT/",str.s,4) ? 4 : 7); + char *key_src = strstr(key_dst,":="); + if ( key_src ) + { + *key_src = 0; + key_src += 2; + if ( !strncasecmp("FORMAT/",key_src,7) ) key_src += 7; + else if ( !strncasecmp("FMT/",key_src,4) ) key_src += 4; + } + else + key_src = key_dst; + need_sample_map = 1; + if ( args->tgts_is_vcf ) + { + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->files->readers[1].header, BCF_HL_FMT, "ID", key_src, NULL); + if ( !hrec ) error("No such annotation \"%s\" in %s\n", key_src,args->targets_fname); + tmp.l = 0; + bcf_hrec_format_rename(hrec, key_dst, &tmp); + bcf_hdr_append(args->hdr_out, tmp.s); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + } + int hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, key_dst); + if ( !bcf_hdr_idinfo_exists(args->hdr_out,BCF_HL_FMT,hdr_id) ) + error("The FORMAT tag \"%s\" is not defined in %s, was the -h option provided?\n", str.s, args->targets_fname); + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + if ( !args->tgts_is_vcf ) + { + col->icol = icol; + icol += args->nsmpl_annot - 1; + } + else + col->icol = -1; + col->replace = replace; + col->hdr_key_src = strdup(key_src); + col->hdr_key_dst = strdup(key_dst); + if ( !strcasecmp("GT",key_src) ) + { + if ( !args->tgts_is_vcf ) error("The FORMAT/GT field can be currently populated only from a VCF\n"); + col->setter = vcf_setter_format_gt; + } + else + switch ( bcf_hdr_id2type(args->hdr_out,BCF_HL_FMT,hdr_id) ) + { + case BCF_HT_INT: col->setter = args->tgts_is_vcf ? vcf_setter_format_int : setter_format_int; break; + case BCF_HT_REAL: col->setter = args->tgts_is_vcf ? vcf_setter_format_real : setter_format_real; break; + case BCF_HT_STR: col->setter = args->tgts_is_vcf ? vcf_setter_format_str : setter_format_str; has_fmt_str = 1; break; + default: error("The type of %s not recognised (%d)\n", str.s,bcf_hdr_id2type(args->hdr_out,BCF_HL_FMT,hdr_id)); + } + if ( args->tgts_is_vcf ) + { + bcf_hdr_t *tgts_hdr = args->files->readers[1].header; + hdr_id = bcf_hdr_id2int(tgts_hdr, BCF_DT_ID, col->hdr_key_src); + col->number = bcf_hdr_id2length(tgts_hdr,BCF_HL_FMT,hdr_id); + } + } + else + { + if ( replace & REPLACE_NON_MISSING ) error("Apologies, the -INFO/TAG feature has not been implemented yet.\n"); + if ( replace & SET_OR_APPEND ) + { + if ( args->tgts_is_vcf ) + error("Error: the =INFO/TAG feature is currently supported only with TAB annotation files and has limitations\n" + " (the annotation type is modified to \"Number=.\" and allele ordering is disregarded)\n"); + fprintf(bcftools_stderr,"Warning: the =INFO/TAG feature modifies the annotation to \"Number=.\" and disregards allele ordering\n"); + } + int explicit_src_info = 0; + int explicit_dst_info = 0; + char *key_dst; + if ( !strncasecmp("INFO/",str.s,5) ) + { + key_dst = str.s + 5; + explicit_dst_info = 1; + } + else if ( !strcasecmp("~INFO/END",str.s) ) + { + key_dst = str.s + 6; + explicit_dst_info = 1; + } + else + key_dst = str.s; + char *key_src = strstr(key_dst,":="); + if ( key_src ) + { + *key_src = 0; + key_src += 2; + if ( !strncasecmp("INFO/",key_src,5) ) + { + key_src += 5; + explicit_src_info = 1; + } + else if ( !strncasecmp("FMT/",key_src,4) || !strncasecmp("FORMAT/",key_src,5) ) + { + key_src[-2] = ':'; + error("Did you mean \"FMT/%s\" rather than \"%s\"?\n",str.s,str.s); + } + } + else + key_src = key_dst; + + args->ncols++; args->cols = (annot_col_t*) realloc(args->cols,sizeof(annot_col_t)*args->ncols); + annot_col_t *col = &args->cols[args->ncols-1]; + memset(col,0,sizeof(*col)); + col->icol = icol; + col->replace = replace; + col->hdr_key_src = strdup(key_src); + col->hdr_key_dst = strdup(key_dst); + + int hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, key_dst); + if ( !bcf_hdr_idinfo_exists(args->hdr_out,BCF_HL_INFO,hdr_id) ) + { + if ( args->tgts_is_vcf ) // reading annotations from a VCF, add a new header line + { + if ( !strcasecmp("ID",key_src) && !explicit_src_info ) + { + // transferring ID column into a new INFO tag + tmp.l = 0; + ksprintf(&tmp,"##INFO=",key_dst); + } + else if ( !strcasecmp("FILTER",key_src) && !explicit_src_info ) + { + // transferring FILTER column into a new INFO tag + tmp.l = 0; + ksprintf(&tmp,"##INFO=",key_dst); + } + else + { + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->files->readers[1].header, BCF_HL_INFO, "ID", key_src, NULL); + if ( !hrec ) + { + if ( explicit_dst_info+explicit_src_info==0 && bcf_hdr_get_hrec(args->files->readers[1].header, BCF_HL_FMT, "ID", key_src, NULL) ) + error("Did you mean \"FMT/%s\" rather than \"%s\"?\n",str.s,str.s); + char *ptr = strchr(key_src,'='); + if ( ptr ) + { + *ptr = 0; tmp.l = 0; ksprintf(&tmp,"%s:=%s",key_src,ptr+1); *ptr = '='; + error("The INFO tag \"%s\" is not defined, is this what you want \"%s\" ?\n",key_src,tmp.s); + } + error("The INFO tag \"%s\" is not defined in %s, was the -h option provided?\n", key_src,args->files->readers[1].fname); + } + tmp.l = 0; + bcf_hrec_format_rename(hrec, key_dst, &tmp); + } + bcf_hdr_append(args->hdr_out, tmp.s); + if (bcf_hdr_sync(args->hdr_out) < 0) + error_errno("[%s] Failed to update header", __func__); + hdr_id = bcf_hdr_id2int(args->hdr_out, BCF_DT_ID, key_dst); + } + else + error("The INFO tag \"%s\" is not defined in %s, was the -h option provided?\n", key_dst, args->targets_fname); + assert( bcf_hdr_idinfo_exists(args->hdr_out,BCF_HL_INFO,hdr_id) ); + } + if ( args->tgts_is_vcf ) + { + if ( !strcasecmp("ID",key_src) && !explicit_src_info ) col->getter = vcf_getter_id2str; + else if ( !strcasecmp("FILTER",key_src) && !explicit_src_info ) col->getter = vcf_getter_filter2str; + } + col->number = bcf_hdr_id2length(args->hdr_out,BCF_HL_INFO,hdr_id); + switch ( bcf_hdr_id2type(args->hdr_out,BCF_HL_INFO,hdr_id) ) + { + case BCF_HT_FLAG: col->setter = args->tgts_is_vcf ? vcf_setter_info_flag : setter_info_flag; break; + case BCF_HT_INT: col->setter = args->tgts_is_vcf ? vcf_setter_info_int : setter_info_int; break; + case BCF_HT_REAL: col->setter = args->tgts_is_vcf ? vcf_setter_info_real : setter_info_real; break; + case BCF_HT_STR: col->setter = args->tgts_is_vcf ? vcf_setter_info_str : setter_info_str; break; + default: error("The type of %s not recognised (%d)\n", str.s,bcf_hdr_id2type(args->hdr_out,BCF_HL_INFO,hdr_id)); + } + if ( replace & SET_OR_APPEND ) // change to Number=. + { + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->hdr_out, BCF_HL_INFO, "ID", key_dst, NULL); + if ( !hrec ) error("Uh, could not find the new tag \"%s\" in the header\n", key_dst); + hrec = bcf_hrec_dup(hrec); + int j = bcf_hrec_find_key(hrec, "Number"); + if ( j<0 ) error("Uh, could not find the entry Number in the header record of %s\n",key_dst); + free(hrec->vals[j]); + hrec->vals[j] = strdup("."); + bcf_hdr_remove(args->hdr_out,BCF_HL_INFO, key_dst); + bcf_hdr_add_hrec(args->hdr_out, hrec); + } + } + if ( !*se ) break; + ss = ++se; + } + free(str.s); + free(tmp.s); + free(args->columns); + if ( skip_info ) khash_str2int_destroy_free(skip_info); + if ( skip_fmt ) khash_str2int_destroy_free(skip_fmt); + if ( has_fmt_str ) + { + int n = bcf_hdr_nsamples(args->hdr_out); + if ( args->tgts_is_vcf && nfiles->readers[1].header) ) n = bcf_hdr_nsamples(args->files->readers[1].header); + args->tmpp = (char**)malloc(sizeof(char*)*n); + args->tmpp2 = (char**)malloc(sizeof(char*)*n); + } + if ( !need_sample_map ) + { + free(args->sample_map); + args->sample_map = NULL; + } + else if ( sample_map_ok<0 ) + error("No matching samples in source and destination file?\n"); +} +static void init_merge_method(args_t *args) +{ + int i; + for (i=0; incols; i++) + { + args->cols[i].merge_method = MM_FIRST; + args->cols[i].mm_str_hash = NULL; + args->cols[i].mm_dbl = NULL; + args->cols[i].mm_dbl_nalloc = args->cols[i].mm_dbl_nused = args->cols[i].mm_dbl_ndat = 0; + memset(&args->cols[i].mm_kstr, 0, sizeof(args->cols[i].mm_kstr)); + } + if ( !args->merge_method_str.l ) return; + if ( args->tgts_is_vcf ) error("Error: the --merge-logic is intended for use with BED or TAB-delimited files only.\n"); + if ( !args->tgt_idx && !args->tgts ) error("Error: BEG,END (or FROM,TO) columns or REF,ALT columns are expected with the --merge-logic option.\n"); + char *sb = args->merge_method_str.s; + while ( *sb ) + { + char *se = sb; + while ( *se && *se!=',' ) se++; + args->tmpks.l = 0; + kputsn(sb, se-sb, &args->tmpks); + kputc(0, &args->tmpks); + char *mm_type_str = args->tmpks.s + args->tmpks.l; + while ( *mm_type_str!=':' && mm_type_str > args->tmpks.s ) mm_type_str--; + if ( *mm_type_str!=':' ) + error("Error: could not parse the argument to --merge-logic: %s\n", args->merge_method_str.s); + *mm_type_str = 0; + mm_type_str++; + int mm_type = MM_FIRST; + if ( !strcasecmp("unique",mm_type_str) ) mm_type = MM_UNIQUE; + else if ( !strcasecmp("first",mm_type_str) ) mm_type = MM_FIRST; + else if ( !strcasecmp("append",mm_type_str) ) mm_type = MM_APPEND; + else if ( !strcasecmp("append-missing",mm_type_str) ) + { + mm_type = MM_APPEND_MISSING; + if ( args->ref_idx!=-1 ) args->has_append_mode = 1; + } + else if ( !strcasecmp("sum",mm_type_str) ) mm_type = MM_SUM; + else if ( !strcasecmp("avg",mm_type_str) ) mm_type = MM_AVG; + else if ( !strcasecmp("min",mm_type_str) ) mm_type = MM_MIN; + else if ( !strcasecmp("max",mm_type_str) ) mm_type = MM_MAX; + else error("Error: could not parse --merge-logic %s, the logic \"%s\" is not recognised\n", args->merge_method_str.s,mm_type_str); + for (i=0; incols; i++) + { + if ( strcmp(args->cols[i].hdr_key_dst,args->tmpks.s) ) continue; + if ( (mm_type==MM_APPEND || mm_type==MM_APPEND_MISSING) && args->cols[i].number!=BCF_VL_VAR ) + error("Error: --merge-logic append can be requested only for tags of variable length (Number=.)\n"); + args->cols[i].merge_method = mm_type; + break; + } + if ( i==args->ncols ) error("No such tag in the destination file: %s\n", args->tmpks.s); + sb = *se ? se + 1 : se; + } + if ( args->has_append_mode ) + { + // create a missing line to insert missing values when VCF ALT finds no match in the annotation file + args->aline_missing = (annot_line_t*)calloc(1,sizeof(*args->aline_missing)); + int ncol = 0; + for (i=0; incols; i++) + if ( ncol < args->cols[i].icol + 1 ) ncol = args->cols[i].icol + 1; + if ( ncol < args->ref_idx + 1 ) ncol = args->ref_idx + 1; + args->aline_missing->mcols = ncol; + args->aline_missing->ncols = ncol; + args->aline_missing->cols = (char**) malloc(ncol*sizeof(char*)); + for (i=0; ialine_missing->cols[i] = strdup("."); + } +} + +static void rename_chrs(args_t *args, char *fname) +{ + int n, i; + char **map = hts_readlist(fname, 1, &n); + if ( !map ) error("Could not read: %s\n", fname); + for (i=0; ihdr_out, map[i]); + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->hdr_out, BCF_HL_CTG, "ID", map[i], NULL); + if ( !hrec ) continue; // the sequence not present + int j = bcf_hrec_find_key(hrec, "ID"); + assert( j>=0 ); + free(hrec->vals[j]); + ss++; + while ( *ss && isspace(*ss) ) ss++; + char *se = ss; + while ( *se && !isspace(*se) ) se++; + *se = 0; + hrec->vals[j] = strdup(ss); + args->hdr_out->id[BCF_DT_CTG][rid].key = hrec->vals[j]; + } + for (i=0; ihdr_out, BCF_DT_ID, ori_tag); + if ( id<0 ) return 1; + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->hdr_out, type, "ID", ori_tag, NULL); + if ( !hrec ) return 1; // the ID attribute not present + int j = bcf_hrec_find_key(hrec, "ID"); + assert( j>=0 ); + free(hrec->vals[j]); + char *ptr = new_tag; + while ( *ptr && !isspace(*ptr) ) ptr++; + *ptr = 0; + hrec->vals[j] = strdup(new_tag); + args->hdr_out->id[BCF_DT_ID][id].key = hrec->vals[j]; + return 0; +} +static void rename_annots(args_t *args) +{ + int i; + if ( args->rename_annots ) + { + args->rename_annots_map = hts_readlist(args->rename_annots, 1, &args->rename_annots_nmap); + if ( !args->rename_annots_map ) error("Could not read: %s\n", args->rename_annots); + } + for (i=0; irename_annots_nmap; i++) + { + char *ptr = args->rename_annots_map[i]; + while ( *ptr && !isspace(*ptr) ) ptr++; + if ( !*ptr ) error("Could not parse: %s\n", args->rename_annots_map[i]); + char *rmme = ptr; + *ptr = 0; + ptr++; + while ( *ptr && isspace(*ptr) ) ptr++; + if ( !*ptr ) { *rmme = ' '; error("Could not parse: %s\n", args->rename_annots_map[i]); } + if ( rename_annots_core(args, args->rename_annots_map[i], ptr) < 0 ) + error("Could not parse \"%s %s\", expected INFO, FORMAT, or FILTER prefix\n",args->rename_annots_map[i],ptr); + } +} +static void rename_annots_push(args_t *args, char *src, char *dst) +{ + args->rename_annots_nmap++; + args->rename_annots_map = (char**)realloc(args->rename_annots_map,sizeof(*args->rename_annots_map)*args->rename_annots_nmap); + kstring_t str = {0,0,0}; + ksprintf(&str,"%s %s",src,dst); + args->rename_annots_map[ args->rename_annots_nmap - 1 ] = str.s; +} + +static void init_data(args_t *args) +{ + args->hdr = args->files->readers[0].header; + args->hdr_out = bcf_hdr_dup(args->hdr); + + if ( args->set_ids_fmt ) + { + if ( args->set_ids_fmt[0]=='+' ) { args->set_ids_replace = 0; args->set_ids_fmt++; } + args->set_ids = convert_init(args->hdr_out, NULL, 0, args->set_ids_fmt); + } + if ( args->remove_annots ) init_remove_annots(args); + if ( args->header_fname || args->header_lines ) init_header_lines(args); + if ( args->targets_fname && args->tgts_is_vcf ) + { + // reading annots from a VCF + if ( !bcf_sr_add_reader(args->files, args->targets_fname) ) + error("Failed to open %s: %s\n", args->targets_fname,bcf_sr_strerror(args->files->errnum)); + args->tgts_hdr = args->files->readers[1].header; + } + if ( args->columns ) init_columns(args); + if ( args->targets_fname && !args->tgts_is_vcf ) + { + if ( !args->columns ) error("The -c option not given\n"); + if ( args->chr_idx==-1 ) error("The -c CHROM option not given\n"); + if ( args->beg_idx==-1 ) error("The -c POS option not given\n"); + if ( args->single_overlaps && args->merge_method_str.l ) error("The options --merge-logic and --single-overlaps cannot be combined\n"); + if ( args->end_idx==-1 || (args->single_overlaps && !args->merge_method_str.l) ) + { + args->end_idx = -args->beg_idx - 1; + args->tgts = bcf_sr_regions_init(args->targets_fname,1,args->chr_idx,args->beg_idx,args->end_idx); + if ( !args->tgts ) error("Could not initialize the annotation file: %s\n", args->targets_fname); + if ( !args->tgts->tbx ) error("Expected tabix-indexed annotation file: %s\n", args->targets_fname); + } + else + { + if ( args->ref_idx!=-1 ) error("Error: the REF columns will be ignored when BEG,END (or FROM,TO) is present. Replace END (or TO) with \"-\".\n"); + int len = strlen(args->targets_fname); + if ( len>=7 && !strcasecmp(".bed.gz",args->targets_fname+len-7) ) args->tgt_is_bed = 1; + else if ( len>=8 && !strcasecmp(".bed.bgz",args->targets_fname+len-8) ) args->tgt_is_bed = 1; + else if ( len>=4 && !strcasecmp(".bed",args->targets_fname+len-4) ) args->tgt_is_bed = 1; + args->tgt_idx = regidx_init(args->targets_fname,parse_with_payload,free_payload,sizeof(char*),args); + if ( !args->tgt_idx ) error("Failed to parse: %s\n", args->targets_fname); + args->tgt_itr = regitr_init(args->tgt_idx); + args->nalines++; + hts_expand0(annot_line_t,args->nalines,args->malines,args->alines); + } + if ( args->min_overlap_str ) + { + char *tmp = args->min_overlap_str; + if ( args->min_overlap_str[0] != ':' ) + { + args->min_overlap_ann = strtod(args->min_overlap_str,&tmp); + if ( args->min_overlap_ann < 0 || args->min_overlap_ann > 1 || (*tmp && *tmp!=':') ) + error("Could not parse \"--min-overlap %s\", expected value(s) between 0-1\n", args->min_overlap_str); + } + if ( *tmp && *tmp==':' ) + { + args->min_overlap_vcf = strtod(tmp+1,&tmp); + if ( args->min_overlap_vcf < 0 || args->min_overlap_vcf > 1 || *tmp ) + error("Could not parse \"--min-overlap %s\", expected value(s) between 0-1\n", args->min_overlap_str); + } + } + } + init_merge_method(args); + args->vcmp = vcmp_init(); + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + + if ( args->mark_sites ) + { + if ( !args->targets_fname ) error("The -a option not given\n"); + bcf_hdr_printf(args->hdr_out,"##INFO=", + args->mark_sites,args->mark_sites_logic==MARK_LISTED?"":"not ",args->mark_sites); + } + + if (args->record_cmd_line) bcf_hdr_append_version(args->hdr_out, args->argc, args->argv, "bcftools_annotate"); + if ( !args->drop_header ) + { + if ( args->rename_chrs ) rename_chrs(args, args->rename_chrs); + if ( args->rename_annots || args->rename_annots_map ) rename_annots(args); + + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("[%s] Error: cannot write to \"%s\": %s\n", __func__,args->output_fname, strerror(errno)); + if ( args->n_threads ) + hts_set_opt(args->out_fh, HTS_OPT_THREAD_POOL, args->files->p); + if ( bcf_hdr_write(args->out_fh, args->hdr_out)!=0 ) error("[%s] Error: failed to write the header to %s\n", __func__,args->output_fname); + } +} + +static void destroy_data(args_t *args) +{ + int i; + for (i=0; inrm; i++) free(args->rm[i].key); + free(args->rm); + if ( args->hdr_out ) bcf_hdr_destroy(args->hdr_out); + if (args->vcmp) vcmp_destroy(args->vcmp); + for (i=0; incols; i++) + { + free(args->cols[i].hdr_key_src); + free(args->cols[i].hdr_key_dst); + free(args->cols[i].mm_kstr.s); + if ( args->cols[i].mm_str_hash ) khash_str2int_destroy_free(args->cols[i].mm_str_hash); + free(args->cols[i].mm_dbl); + free(args->cols[i].ptr); + } + free(args->cols); + if ( args->aline_missing ) + { + for (i=0; ialine_missing->ncols; i++) free(args->aline_missing->cols[i]); + free(args->aline_missing->cols); + free(args->aline_missing); + } + for (i=0; imalines; i++) + { + free(args->alines[i].cols); + free(args->alines[i].als); + free(args->alines[i].line.s); + } + free(args->alines); + free(args->srt_alines); + if ( args->tgt_idx ) + { + regidx_destroy(args->tgt_idx); + regitr_destroy(args->tgt_itr); + } + if ( args->rename_annots_map ) + { + for (i=0; irename_annots_nmap; i++) free(args->rename_annots_map[i]); + free(args->rename_annots_map); + } + if ( args->tgts ) bcf_sr_regions_destroy(args->tgts); + free(args->tmpks.s); + free(args->tmpi); + free(args->tmpf); + free(args->tmps); + free(args->tmpp); + free(args->tmpi2); + free(args->tmpf2); + free(args->tmps2); + free(args->tmpp2); + free(args->tmpi3); + free(args->tmpf3); + free(args->src_smpl_pld); + free(args->dst_smpl_pld); + if ( args->set_ids ) + convert_destroy(args->set_ids); + if ( args->filter ) + filter_destroy(args->filter); + if (args->out_fh) hts_close(args->out_fh); + free(args->sample_map); + free(args->merge_method_str.s); +} + +static void parse_annot_line(args_t *args, char *str, annot_line_t *tmp) +{ + tmp->line.l = 0; + kputs(str, &tmp->line); + char *s = tmp->line.s; + tmp->ncols = 1; + hts_expand(char*,tmp->ncols,tmp->mcols,tmp->cols); + tmp->cols[0] = s; + while ( *s ) + { + if ( *s=='\t' ) + { + tmp->ncols++; + hts_expand(char*,tmp->ncols,tmp->mcols,tmp->cols); + tmp->cols[tmp->ncols-1] = s+1; + *s = 0; + } + s++; + } + if ( args->ref_idx != -1 ) + { + if ( args->ref_idx >= tmp->ncols ) + error("Could not parse the line, expected %d+ columns, found %d:\n\t%s\n",args->ref_idx+1,tmp->ncols,str); + if ( args->alt_idx >= tmp->ncols ) + error("Could not parse the line, expected %d+ columns, found %d:\n\t%s\n",args->alt_idx+1,tmp->ncols,str); + tmp->nals = 2; + hts_expand(char*,tmp->nals,tmp->mals,tmp->als); + tmp->als[0] = tmp->cols[args->ref_idx]; + tmp->als[1] = s = tmp->cols[args->alt_idx]; + while ( *s ) + { + if ( *s==',' ) + { + tmp->nals++; + hts_expand(char*,tmp->nals,tmp->mals,tmp->als); + tmp->als[tmp->nals-1] = s+1; + *s = 0; + } + s++; + } + } +} +static void buffer_annot_lines(args_t *args, bcf1_t *line, int start_pos, int end_pos) +{ + if ( args->nalines && args->alines[0].rid != line->rid ) args->nalines = 0; + + int i = 0; + while ( inalines ) + { + if ( line->pos > args->alines[i].end ) + { + args->nalines--; + if ( args->nalines && inalines ) + { + annot_line_t tmp = args->alines[i]; + memmove(&args->alines[i],&args->alines[i+1],(args->nalines-i)*sizeof(annot_line_t)); + args->alines[args->nalines] = tmp; + } + } + else i++; + } + if ( args->ref_idx==-1 && args->nalines ) return; + + while ( !bcf_sr_regions_overlap(args->tgts, bcf_seqname(args->hdr,line), start_pos,end_pos) ) + { + if ( args->nalines + 1 == 0xffff ) break; // likely a symbolic allele, don't let the buffer overflow + args->nalines++; + hts_expand0(annot_line_t,args->nalines,args->malines,args->alines); + annot_line_t *tmp = &args->alines[args->nalines-1]; + tmp->rid = line->rid; + tmp->start = args->tgts->start; + tmp->end = args->tgts->end; + parse_annot_line(args, args->tgts->line.s, tmp); + if ( args->ref_idx != -1 ) + { + int iseq = args->tgts->iseq; + if ( bcf_sr_regions_next(args->tgts)<0 || args->tgts->iseq!=iseq ) break; + } + else break; + } +} + +// search string in semicolon separated strings (xx vs aa;bb) +static int str_match(char *needle, char *haystack) +{ + int len = strlen(needle); + char *ptr = haystack; + while ( *ptr && (ptr=strstr(ptr,needle)) ) + { + if ( ptr[len]!=0 && ptr[len]!=';' ) ptr++; // a prefix, not a match + else if ( ptr==haystack || ptr[-1]==';' ) return 1; // a match + ptr++; // a suffix, not a match + } + return 0; +} +// search common string in semicolon separated strings (xx;yy;zz vs aa;bb) +static int strstr_match(char *a, char *b) +{ + char *beg = a; + while ( *beg ) + { + char *end = beg; + while ( *end && *end!=';' ) end++; + char tmp = *end; + if ( *end==';' ) *end = 0; + int ret = str_match(beg,b); + *end = tmp; + if ( ret || !*end ) return ret; + beg = end + 1; + } + return 0; +} +static void annotate(args_t *args, bcf1_t *line) +{ + int i, j; + for (i=0; inrm; i++) + args->rm[i].handler(args, line, &args->rm[i]); + + int has_overlap = 0; + if ( args->tgt_idx ) + { + for (j=0; jncols; j++) args->cols[j].done = 0; + if ( regidx_overlap(args->tgt_idx, bcf_seqname(args->hdr,line),line->pos,line->pos+line->rlen-1, args->tgt_itr) ) + { + while ( regitr_overlap(args->tgt_itr) ) + { + annot_line_t *tmp = &args->alines[0]; + tmp->rid = line->rid; + tmp->start = args->tgt_itr->beg; + tmp->end = args->tgt_itr->end; + + // Check min overlap + int len_ann = tmp->end - tmp->start + 1; + int len_vcf = line->rlen; + int isec = (tmp->end < line->pos+line->rlen-1 ? tmp->end : line->pos+line->rlen-1) - (tmp->start > line->pos ? tmp->start : line->pos) + 1; + assert( isec > 0 ); + if ( args->min_overlap_ann && args->min_overlap_ann > (float)isec/len_ann ) continue; + if ( args->min_overlap_vcf && args->min_overlap_vcf > (float)isec/len_vcf ) continue; + + parse_annot_line(args, regitr_payload(args->tgt_itr,char*), tmp); + for (j=0; jncols; j++) + { + if ( args->cols[j].done==1 ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],tmp); + if ( ret < 0 ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( ret==0 ) + args->cols[j].done = 1; + } + } + has_overlap = 1; + } + for (j=0; jncols; j++) + { + if ( args->cols[j].done==1 || args->cols[j].merge_method == MM_FIRST ) continue; + if ( !args->cols[j].setter ) continue; + if ( args->cols[j].setter(args,line,&args->cols[j],NULL) < 0 ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + } + } + else if ( args->tgts ) + { + // Buffer annotation lines. When multiple ALT alleles are present in the annotation file, at least one + // must match some of the VCF alleles. If the append-missing mode is set (and REF+ALT is requested), the + // buffered lines will annotate the VCF respecting the order in ALT and when no matching line is found + // for an ALT, missing value is appended instead. + int end_pos = line->pos + line->rlen - 1; + buffer_annot_lines(args, line, line->pos, end_pos); + + args->nsrt_alines = 0; + hts_expand(uint32_t,args->nalines,args->msrt_alines,args->srt_alines); + if ( args->nalines >= 0xffff || line->n_allele >= 0xffff ) + error("Error: too many alleles or annotation lines in the buffer at %s:%"PRId64" (todo:skip?)\n",bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + + kstring_t match_end = {0,0,0}; + if ( args->match_end>=0 && bcf_get_info_int32(args->hdr,line,"END",&args->tmpi,&args->mtmpi)==1 ) + kputw(args->tmpi[0],&match_end); + + // Find matching lines + for (i=0; inalines; i++) + { + if ( line->pos > args->alines[i].end || end_pos < args->alines[i].start ) continue; + if ( args->ref_idx != -1 ) // REF+ALT matching requested + { + if ( line->pos!=args->alines[i].start || vcmp_set_ref(args->vcmp, line->d.allele[0], args->alines[i].als[0]) < 0 ) continue; // refs are not compatible + for (j=1; jalines[i].nals; j++) + { + int ialt; + if ( line->n_allele==1 && args->alines[i].als[j][0]=='.' && args->alines[i].als[j][1]==0 ) // match: no ALT allele in VCF and annot file has "." + ialt = 0; + else + { + ialt = vcmp_find_allele(args->vcmp, line->d.allele+1, line->n_allele - 1, args->alines[i].als[j]); + if ( ialt < 0 ) continue; + ialt++; + } + if ( args->match_id>=0 && !strstr_match(line->d.id,args->alines[i].cols[args->match_id]) ) continue; + if ( args->match_end>=0 && match_end.l && strcmp(match_end.s,args->alines[i].cols[args->match_end]) ) continue; + args->srt_alines[args->nsrt_alines++] = (ialt<<16) | i; + has_overlap = 1; + break; + } + } + else // overlap, REF+ALT matching not requested + { + args->srt_alines[args->nsrt_alines++] = (0xffff<<16) | i; + has_overlap = 1; + } + } + + free(match_end.s); + + // Sort lines if needed + if ( args->has_append_mode ) + { + // insertion sort by VCF ALT index (top bits) and alines index (low bits) + uint32_t tmp; + for (i=1; insrt_alines; i++) + for (j=i; j>0 && args->srt_alines[j] < args->srt_alines[j-1]; j--) + tmp = args->srt_alines[j], args->srt_alines[j] = args->srt_alines[j-1], args->srt_alines[j-1] = tmp; + } + // Annotate + for (j=0; jncols; j++) args->cols[j].done = 0; + int ialt_exp = 1; + for (i=0; insrt_alines; i++) + { + int ialt = args->srt_alines[i] >> 16; + int ilin = args->srt_alines[i] & 0xffff; + if ( args->has_append_mode ) + { + if ( ialt_exp > ialt ) continue; // multiple annotation lines for the same position + if ( ialt_exp < ialt ) + { + // REF+ALT matching requested, append-missing mode: insert "." if no annotation line was found for the ALT + while ( ialt_exp++ < ialt ) + { + for (j=0; jncols; j++) + { + if ( args->cols[j].merge_method != MM_APPEND_MISSING ) continue; + if ( args->cols[j].done==1 ) continue; + if ( !args->cols[j].setter ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],args->aline_missing); + if ( ret < 0 ) + error("fixme: Could not set missing %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( ret==0 ) + args->cols[j].done = 1; + } + } + } + } + for (j=0; jncols; j++) + { + if ( args->cols[j].done==1 ) continue; + if ( !args->cols[j].setter ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],&args->alines[ilin]); + if ( ret < 0 ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( ret==0 ) + args->cols[j].done = 1; + } + ialt_exp = ialt + 1; + } + if ( args->nsrt_alines ) + { + // In the append-missing mode fill missing values to all trailing ALTs, but only if at least one + // record was found. Otherwise leave the row will be left without annotation. + if ( args->has_append_mode && ialt_exp < line->n_allele ) + { + while ( ialt_exp++ < line->n_allele ) + { + for (j=0; jncols; j++) + { + if ( args->cols[j].merge_method != MM_APPEND_MISSING ) continue; + if ( args->cols[j].done==1 ) continue; + if ( !args->cols[j].setter ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],args->aline_missing); + if ( ret < 0 ) + error("fixme: Could not set missing %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + if ( ret==0 ) + args->cols[j].done = 1; + } + } + } + // Flush + for (j=0; jncols; j++) + { + if ( args->cols[j].done==1 || args->cols[j].merge_method == MM_FIRST ) continue; + if ( !args->cols[j].setter ) continue; + int ret = args->cols[j].setter(args,line,&args->cols[j],NULL); + if ( ret < 0 ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + } + } + } + else if ( args->files->nreaders == 2 ) + { + if ( bcf_sr_has_line(args->files,1) ) + { + bcf1_t *aline = bcf_sr_get_line(args->files,1); + for (j=0; jncols; j++) + { + if ( !args->cols[j].setter ) continue; + if ( args->cols[j].setter(args,line,&args->cols[j],aline) ) + error("fixme: Could not set %s at %s:%"PRId64"\n", args->cols[j].hdr_key_src,bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + } + + has_overlap = 1; + } + } + if ( args->set_ids ) + { + args->tmpks.l = 0; + convert_line(args->set_ids, line, &args->tmpks); + if ( args->tmpks.l ) + { + int replace = 0; + if ( args->set_ids_replace ) replace = 1; + else if ( !line->d.id || (line->d.id[0]=='.' && !line->d.id[1]) ) replace = 1; + if ( replace ) + bcf_update_id(args->hdr_out,line,args->tmpks.s); + } + } + + if ( args->mark_sites ) + { + // ideally, we'd like to be far more general than this in future, see https://github.com/samtools/bcftools/issues/87 + if ( args->mark_sites_logic==MARK_LISTED ) + bcf_update_info_flag(args->hdr_out,line,args->mark_sites,NULL,has_overlap?1:0); + else + bcf_update_info_flag(args->hdr_out,line,args->mark_sites,NULL,has_overlap?0:1); + } +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Annotate and edit VCF/BCF files.\n"); + fprintf(bcftools_stderr, "Usage: bcftools annotate [options] VCF\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -a, --annotations FILE VCF file or tabix-indexed FILE with annotations: CHR\\tPOS[\\tVALUE]+\n"); + fprintf(bcftools_stderr, " -c, --columns LIST List of columns in the annotation file, e.g. CHROM,POS,REF,ALT,-,INFO/TAG. See man page for details\n"); + fprintf(bcftools_stderr, " -C, --columns-file FILE Read -c columns from FILE, one name per row, with optional --merge-logic TYPE: NAME[ TYPE]\n"); + fprintf(bcftools_stderr, " -e, --exclude EXPR Exclude sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " --force Continue despite parsing error (at your own risk!)\n"); + fprintf(bcftools_stderr, " -H, --header-line STR Header line which should be appended to the VCF header, can be given multiple times\n"); + fprintf(bcftools_stderr, " -h, --header-lines FILE Lines which should be appended to the VCF header\n"); + fprintf(bcftools_stderr, " -I, --set-id [+]FORMAT Set ID column using a `bcftools query`-like expression, see man page for details\n"); + fprintf(bcftools_stderr, " -i, --include EXPR Select sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " -k, --keep-sites Leave -i/-e sites unchanged instead of discarding them\n"); + fprintf(bcftools_stderr, " -l, --merge-logic TAG:TYPE Merge logic for multiple overlapping regions (see man page for details), EXPERIMENTAL\n"); + fprintf(bcftools_stderr, " -m, --mark-sites [+-]TAG Add INFO/TAG flag to sites which are (\"+\") or are not (\"-\") listed in the -a file\n"); + fprintf(bcftools_stderr, " --min-overlap ANN:VCF Required overlap as a fraction of variant in the -a file (ANN), the VCF (:VCF), or reciprocal (ANN:VCF)\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " --pair-logic STR Matching records by , see man page for details [some]\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in FILE\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " --rename-annots FILE Rename annotations: TYPE/old\\tnew, where TYPE is one of FILTER,INFO,FORMAT\n"); + fprintf(bcftools_stderr, " --rename-chrs FILE Rename sequences according to the mapping: old\\tnew\n"); + fprintf(bcftools_stderr, " -s, --samples [^]LIST Comma separated list of samples to annotate (or exclude with \"^\" prefix)\n"); + fprintf(bcftools_stderr, " -S, --samples-file [^]FILE File of samples to annotate (or exclude with \"^\" prefix)\n"); + fprintf(bcftools_stderr, " --single-overlaps Keep memory low by avoiding complexities arising from handling multiple overlapping intervals\n"); + fprintf(bcftools_stderr, " -x, --remove LIST List of annotations (e.g. ID,INFO/DP,FORMAT/DP,FILTER) to remove (or keep with \"^\" prefix). See man page for details\n"); + fprintf(bcftools_stderr, " --threads INT Number of extra output compression threads [0]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Examples:\n"); + fprintf(bcftools_stderr, " http://samtools.github.io/bcftools/howtos/annotate.html\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfannotate(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->ref_idx = args->alt_idx = args->chr_idx = args->beg_idx = args->end_idx = -1; + args->set_ids_replace = 1; + args->match_id = -1; + args->match_end = -1; + args->clevel = -1; + args->pair_logic = -1; + int regions_is_file = 0; + int regions_overlap = 1; + + static struct option loptions[] = + { + {"keep-sites",no_argument,NULL,'k'}, + {"mark-sites",required_argument,NULL,'m'}, + {"set-id",required_argument,NULL,'I'}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"annotations",required_argument,NULL,'a'}, + {"merge-logic",required_argument,NULL,'l'}, + {"collapse",required_argument,NULL,2}, + {"pair-logic",required_argument,NULL,2}, + {"include",required_argument,NULL,'i'}, + {"exclude",required_argument,NULL,'e'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"remove",required_argument,NULL,'x'}, + {"columns-file",required_argument,NULL,'C'}, + {"columns",required_argument,NULL,'c'}, + {"rename-annots",required_argument,NULL,11}, + {"rename-chrs",required_argument,NULL,1}, + {"header-lines",required_argument,NULL,'h'}, + {"header-line",required_argument,NULL,'H'}, + {"samples",required_argument,NULL,'s'}, + {"samples-file",required_argument,NULL,'S'}, + {"single-overlaps",no_argument,NULL,10}, + {"min-overlap",required_argument,NULL,12}, + {"no-version",no_argument,NULL,8}, + {"force",no_argument,NULL,'f'}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "h:H:?o:O:r:R:a:x:c:C:i:e:S:s:I:m:kl:f",loptions,NULL)) >= 0) + { + switch (c) { + case 'f': args->force = 1; break; + case 'k': args->keep_sites = 1; break; + case 'm': + args->mark_sites_logic = MARK_LISTED; + if ( optarg[0]=='+' ) args->mark_sites = optarg+1; + else if ( optarg[0]=='-' ) { args->mark_sites = optarg+1; args->mark_sites_logic = MARK_UNLISTED; } + else args->mark_sites = optarg; + break; + case 'l': + if ( args->merge_method_str.l ) kputc(',',&args->merge_method_str); + kputs(optarg,&args->merge_method_str); + break; + case 'I': args->set_ids_fmt = optarg; break; + case 's': args->sample_names = optarg; break; + case 'S': args->sample_names = optarg; args->sample_is_file = 1; break; + case 'c': args->columns = strdup(optarg); break; + case 'C': args->columns = strdup(optarg); args->columns_is_file = 1; break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'x': args->remove_annots = optarg; break; + case 'a': args->targets_fname = optarg; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 'h': args->header_fname = optarg; break; + case 'H': args->header_lines = dbuf_push(args->header_lines,strdup(optarg)); break; + case 1 : args->rename_chrs = optarg; break; + case 2 : + if ( !strcmp(optarg,"snps") ) args->pair_logic |= BCF_SR_PAIR_SNP_REF; + else if ( !strcmp(optarg,"indels") ) args->pair_logic |= BCF_SR_PAIR_INDEL_REF; + else if ( !strcmp(optarg,"both") ) args->pair_logic |= BCF_SR_PAIR_BOTH_REF; + else if ( !strcmp(optarg,"any") ) args->pair_logic |= BCF_SR_PAIR_ANY; + else if ( !strcmp(optarg,"all") ) args->pair_logic |= BCF_SR_PAIR_ANY; + else if ( !strcmp(optarg,"some") ) args->pair_logic |= BCF_SR_PAIR_SOME; + else if ( !strcmp(optarg,"none") ) args->pair_logic = BCF_SR_PAIR_EXACT; + else if ( !strcmp(optarg,"exact") ) args->pair_logic = BCF_SR_PAIR_EXACT; + else error("The --pair-logic string \"%s\" not recognised.\n", optarg); + break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 10 : args->single_overlaps = 1; break; + case 11 : args->rename_annots = optarg; break; + case 12 : args->min_overlap_str = optarg; break; + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(args); + } + else fname = argv[optind]; + + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_fname ) + { + htsFile *fp = hts_open(args->targets_fname,"r"); + if ( !fp ) error("Failed to open %s\n", args->targets_fname); + htsFormat type = *hts_get_format(fp); + hts_close(fp); + + if ( type.format==vcf || type.format==bcf ) + { + args->tgts_is_vcf = 1; + args->files->require_index = 1; + bcf_sr_set_opt(args->files,BCF_SR_PAIR_LOGIC,args->pair_logic>=0 ? args->pair_logic : BCF_SR_PAIR_SOME); + if ( args->min_overlap_str ) error("The --min-overlap option cannot be used when annotating from a VCF\n"); + } + } + if ( args->min_overlap_str && args->single_overlaps ) error("The options --single-overlaps and --min-overlap cannot be combined\n"); + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + static int line_errcode_warned = 0; + init_data(args); + while ( bcf_sr_next_line(args->files) ) + { + if ( !bcf_sr_has_line(args->files,0) ) continue; + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( line->errcode ) + { + if ( !args->force ) + error("Encountered an error, cannot proceed. Please check the error output above.\n" + "If feeling adventurous, use the --force option. (At your own risk!)\n"); + else if ( !line_errcode_warned ) + { + fprintf(bcftools_stderr, + "Warning: Encountered an error, proceeding only because --force was given.\n" + " Note that this can result in a segfault or a silent corruption of the output file!\n"); + line_errcode_warned = 1; + line->errcode = 0; + } + } + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) + { + if ( args->keep_sites && bcf_write1(args->out_fh, args->hdr_out, line)!=0 ) error("[%s] Error: failed to write to %s\n", __func__,args->output_fname); + continue; + } + } + annotate(args, line); + if ( bcf_write1(args->out_fh, args->hdr_out, line)!=0 ) error("[%s] Error: failed to write to %s\n", __func__,args->output_fname); + } + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} diff --git a/bcftools/vcfbuf.c b/bcftools/vcfbuf.c new file mode 100644 index 0000000..9d60c49 --- /dev/null +++ b/bcftools/vcfbuf.c @@ -0,0 +1,562 @@ +/* The MIT License + + Copyright (c) 2016-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "vcfbuf.h" +#include "rbuf.h" + +typedef struct +{ + double max[VCFBUF_LD_N]; + int rand_missing, filter1; +} +ld_t; + +typedef struct +{ + bcf1_t *rec; + double af; + int af_set:1, filter:1, idx:30; +} +vcfrec_t; + +#define PRUNE_MODE_MAX_AF 1 +#define PRUNE_MODE_1ST 2 +#define PRUNE_MODE_RAND 3 +typedef struct +{ + int max_sites, mvrec, mac, mfarr, mode; + int *ac, *idx; + float *farr; + char *af_tag; + vcfrec_t **vrec; +} +prune_t; + +typedef struct +{ + int active; +} +rmdup_t; + +typedef struct +{ + int active, rid, end; +} +overlap_t; + +struct _vcfbuf_t +{ + int win, dummy; + bcf_hdr_t *hdr; + vcfrec_t *vcf; + rbuf_t rbuf; + ld_t ld; + prune_t prune; + overlap_t overlap; + rmdup_t rmdup; +}; + +vcfbuf_t *vcfbuf_init(bcf_hdr_t *hdr, int win) +{ + vcfbuf_t *buf = (vcfbuf_t*) calloc(1,sizeof(vcfbuf_t)); + buf->hdr = hdr; + buf->win = win; + buf->overlap.rid = -1; + int i; + for (i=0; ild.max[i] = HUGE_VAL; + rbuf_init(&buf->rbuf, 0); + return buf; +} + +void vcfbuf_destroy(vcfbuf_t *buf) +{ + int i; + for (i=0; irbuf.m; i++) + if ( buf->vcf[i].rec ) bcf_destroy(buf->vcf[i].rec); + free(buf->vcf); + free(buf->prune.farr); + free(buf->prune.vrec); + free(buf->prune.ac); + free(buf->prune.idx); + free(buf); +} + +void vcfbuf_set(vcfbuf_t *buf, vcfbuf_opt_t key, void *value) +{ + if ( key==LD_FILTER1 ) { buf->ld.filter1 = *((int*)value); return; } + if ( key==LD_RAND_MISSING ) { buf->ld.rand_missing = *((int*)value); return; } + if ( key==LD_MAX_R2 ) { buf->ld.max[VCFBUF_LD_IDX_R2] = *((double*)value); return; } + if ( key==LD_MAX_LD ) { buf->ld.max[VCFBUF_LD_IDX_LD] = *((double*)value); return; } + if ( key==LD_MAX_HD ) { buf->ld.max[VCFBUF_LD_IDX_HD] = *((double*)value); return; } + + if ( key==VCFBUF_DUMMY ) { buf->dummy = *((int*)value); return; } + if ( key==VCFBUF_NSITES ) + { + buf->prune.max_sites = *((int*)value); + if ( !buf->prune.mode ) buf->prune.mode = PRUNE_MODE_MAX_AF; + return; + } + if ( key==VCFBUF_AF_TAG ) { buf->prune.af_tag = *((char**)value); return; } + if ( key==VCFBUF_OVERLAP_WIN ) { buf->overlap.active = *((int*)value); return; } + if ( key==VCFBUF_RMDUP) { buf->rmdup.active = *((int*)value); return; } + + if ( key==VCFBUF_NSITES_MODE ) + { + char *mode = *((char**)value); + if ( !strcasecmp(mode,"maxAF") ) buf->prune.mode = PRUNE_MODE_MAX_AF; + else if ( !strcasecmp(mode,"1st") ) buf->prune.mode = PRUNE_MODE_1ST; + else if ( !strcasecmp(mode,"rand") ) buf->prune.mode = PRUNE_MODE_RAND; + else error("The mode \"%s\" is not recognised\n",mode); + return; + } +} + +int vcfbuf_nsites(vcfbuf_t *buf) +{ + return buf->rbuf.n; +} + +bcf1_t *vcfbuf_push(vcfbuf_t *buf, bcf1_t *rec) +{ + rbuf_expand0(&buf->rbuf, vcfrec_t, buf->rbuf.n+1, buf->vcf); + + int i = rbuf_append(&buf->rbuf); + if ( !buf->vcf[i].rec ) buf->vcf[i].rec = bcf_init1(); + + bcf1_t *ret = buf->vcf[i].rec; + buf->vcf[i].rec = rec; + buf->vcf[i].af_set = 0; + buf->vcf[i].filter = buf->ld.filter1; + buf->ld.filter1 = 0; + + return ret; +} + +bcf1_t *vcfbuf_peek(vcfbuf_t *buf, int idx) +{ + int i = rbuf_kth(&buf->rbuf, idx); + return i<0 ? NULL : buf->vcf[i].rec; +} + +bcf1_t *vcfbuf_remove(vcfbuf_t *buf, int idx) +{ + int i = rbuf_kth(&buf->rbuf, idx); + if ( i<0 ) return NULL; + bcf1_t *rec = buf->vcf[i].rec; + rbuf_remove_kth(&buf->rbuf, vcfrec_t, idx, buf->vcf); + return rec; +} + +static int cmpvrec(const void *_a, const void *_b) +{ + vcfrec_t *a = *((vcfrec_t**) _a); + vcfrec_t *b = *((vcfrec_t**) _b); + if ( a->af < b->af ) return -1; + if ( a->af == b->af ) return 0; + return 1; +} +static int cmpint_desc(const void *_a, const void *_b) +{ + int a = *((int*)_a); + int b = *((int*)_b); + if ( a < b ) return 1; + if ( a == b ) return 0; + return -1; +} + +static void _prune_sites(vcfbuf_t *buf, int flush_all) +{ + int nbuf = flush_all ? buf->rbuf.n : buf->rbuf.n - 1; + + int nprune = nbuf - buf->prune.max_sites; + int i,k,irec = 0; + if ( buf->prune.mode==PRUNE_MODE_1ST ) + { + int eoff = flush_all ? 1 : 2; + for (i=0; irbuf, vcfrec_t, buf->rbuf.n - eoff, buf->vcf); + return; + } + if ( buf->prune.mode==PRUNE_MODE_RAND ) + { + int eoff = flush_all ? 0 : 1; + for (i=0; irbuf.n - eoff) * hts_drand48(); + rbuf_remove_kth(&buf->rbuf, vcfrec_t, j, buf->vcf); + } + return; + } + + if ( nbuf > buf->prune.mvrec ) + { + buf->prune.idx = (int*) realloc(buf->prune.idx, nbuf*sizeof(int)); + buf->prune.vrec = (vcfrec_t**) realloc(buf->prune.vrec, nbuf*sizeof(vcfrec_t*)); + buf->prune.mvrec = nbuf; + } + + // set allele frequency and prepare buffer for sorting + for (i=-1; rbuf_next(&buf->rbuf,&i) && irecvcf[i].rec; + if ( line->n_allele > buf->prune.mac ) + { + buf->prune.ac = (int*) realloc(buf->prune.ac, line->n_allele*sizeof(*buf->prune.ac)); + buf->prune.mac = line->n_allele; + } + if ( !buf->vcf[i].af_set ) + { + buf->vcf[i].af = 0; + if ( buf->prune.af_tag ) + { + if ( bcf_get_info_float(buf->hdr,line,buf->prune.af_tag,&buf->prune.farr, &buf->prune.mfarr) > 0 ) buf->vcf[i].af = buf->prune.farr[0]; + } + else if ( bcf_calc_ac(buf->hdr, line, buf->prune.ac, BCF_UN_INFO|BCF_UN_FMT) ) + { + int ntot = buf->prune.ac[0], nalt = 0; + for (k=1; kn_allele; k++) nalt += buf->prune.ac[k]; + buf->vcf[i].af = ntot ? (float)nalt/ntot : 0; + } + buf->vcf[i].af_set = 1; + } + buf->vcf[i].idx = irec; + buf->prune.vrec[irec++] = &buf->vcf[i]; + } + + // sort by allele frequency, low AF will be removed preferentially + qsort(buf->prune.vrec, nbuf, sizeof(*buf->prune.vrec), cmpvrec); + + // sort the rbuf indexes to be pruned descendently so that j-th rbuf index + // is removed before i-th index if iprune.idx[i] = buf->prune.vrec[i]->idx; + + qsort(buf->prune.idx, nprune, sizeof(int), cmpint_desc); + + for (i=0; irbuf, vcfrec_t, buf->prune.idx[i], buf->vcf); +} + +static int _rmdup_can_flush(vcfbuf_t *buf, int flush_all) +{ + if ( flush_all ) return 1; + + if ( buf->rbuf.n==1 ) return 0; + + int k1 = rbuf_kth(&buf->rbuf, -1); + int k2 = rbuf_kth(&buf->rbuf, -2); + + vcfrec_t *rec1 = &buf->vcf[k1]; + vcfrec_t *rec2 = &buf->vcf[k2]; + + if ( rec1->rec->rid!=rec2->rec->rid ) return 1; + if ( rec1->rec->pos!=rec2->rec->pos ) return 1; + + return 0; +} + +static int _overlap_can_flush(vcfbuf_t *buf, int flush_all) +{ + if ( flush_all ) { buf->overlap.rid = -1; return 1; } + + int i = rbuf_last(&buf->rbuf); + vcfrec_t *last = &buf->vcf[i]; + if ( buf->overlap.rid != last->rec->rid ) buf->overlap.end = 0; + + int beg_pos = last->rec->pos; + int end_pos = last->rec->pos + last->rec->rlen - 1; + + // Assuming left-aligned indels. In case it is a deletion, the real variant + // starts one base after. If an insertion, the overlap with previous zero length. + int imin = last->rec->rlen; + for (i=0; irec->n_allele; i++) + { + char *ref = last->rec->d.allele[0]; + char *alt = last->rec->d.allele[i]; + if ( *alt == '<' ) continue; // ignore symbolic alleles + while ( *ref && *alt && nt_to_upper(*ref)==nt_to_upper(*alt) ) { ref++; alt++; } + if ( imin > ref - last->rec->d.allele[0] ) imin = ref - last->rec->d.allele[0]; + } + + if ( beg_pos <= buf->overlap.end ) + { + beg_pos += imin; + if ( beg_pos > end_pos ) end_pos = beg_pos; + } + + if ( buf->rbuf.n==1 ) + { + buf->overlap.rid = last->rec->rid; + buf->overlap.end = end_pos; + return 0; + } + if ( beg_pos <= buf->overlap.end ) + { + if ( buf->overlap.end < end_pos ) buf->overlap.end = end_pos; + return 0; + } + return 1; +} + +bcf1_t *vcfbuf_flush(vcfbuf_t *buf, int flush_all) +{ + int i,j; + + if ( buf->rbuf.n==0 ) return NULL; + if ( flush_all || buf->dummy ) goto ret; + + i = rbuf_kth(&buf->rbuf, 0); // first + j = rbuf_last(&buf->rbuf); // last + + if ( buf->vcf[i].rec->rid != buf->vcf[j].rec->rid ) goto ret; + if ( buf->overlap.active && _overlap_can_flush(buf, flush_all) ) goto ret; + if ( buf->rmdup.active && _rmdup_can_flush(buf, flush_all) ) goto ret; + + if ( buf->win > 0 ) + { + if ( buf->rbuf.n <= buf->win ) return NULL; + goto ret; + } + else if ( buf->win < 0 ) + { + if ( buf->vcf[i].rec->pos - buf->vcf[j].rec->pos > buf->win ) return NULL; + goto ret; + } + else + return NULL; + +ret: + if ( buf->prune.max_sites && buf->prune.max_sites < buf->rbuf.n ) _prune_sites(buf, flush_all); + + i = rbuf_shift(&buf->rbuf); + return buf->vcf[i].rec; +} + +static double _estimate_af(int8_t *ptr, int size, int nvals, int nsamples) +{ + int i,j, nref = 0, nalt = 0; + for (i=0; in_sample!=brec->n_sample ) error("Different number of samples: %d vs %d\n",arec->n_sample,brec->n_sample); + assert( arec->n_sample ); + + int i,j,igt = bcf_hdr_id2int(buf->hdr, BCF_DT_ID, "GT"); + bcf_unpack(arec, BCF_UN_FMT); + bcf_unpack(brec, BCF_UN_FMT); + bcf_fmt_t *afmt = NULL, *bfmt = NULL; + for (i=0; in_fmt; i++) + if ( arec->d.fmt[i].id==igt ) { afmt = &arec->d.fmt[i]; break; } + if ( !afmt ) return -1; // no GT tag + for (i=0; in_fmt; i++) + if ( brec->d.fmt[i].id==igt ) { bfmt = &brec->d.fmt[i]; break; } + if ( !bfmt ) return -1; // no GT tag + + if ( afmt->n==0 ) return -1; // empty?! + if ( bfmt->n==0 ) return -1; // empty?! + if ( afmt->type!=BCF_BT_INT8 ) error("TODO: the GT fmt_type is not int8!\n"); + if ( bfmt->type!=BCF_BT_INT8 ) error("TODO: the GT fmt_type is not int8!\n"); + + // Determine allele frequencies, this is to sample randomly missing genotypes + double aaf = 0, baf = 0; + if ( buf->ld.rand_missing ) + { + aaf = _estimate_af((int8_t*)afmt->p, afmt->size, afmt->n, arec->n_sample); + baf = _estimate_af((int8_t*)bfmt->p, bfmt->size, bfmt->n, brec->n_sample); + } + + // Calculate r2, lf, hd + double nhd[] = {0,0,0,0,0,0,0,0,0}; + double ab = 0, aa = 0, bb = 0, a = 0, b = 0; + int nab = 0, ndiff = 0; + int an_tot = 0, bn_tot = 0; + for (i=0; in_sample; i++) + { + int8_t *aptr = (int8_t*) (afmt->p + i*afmt->size); + int8_t *bptr = (int8_t*) (bfmt->p + i*bfmt->size); + int adsg = 0, bdsg = 0; // dosages (0,1,2) at sites (a,b) + int an = 0, bn = 0; // number of alleles at sites (a,b) + for (j=0; jn; j++) + { + if ( aptr[j]==bcf_int8_vector_end ) break; + if ( aptr[j]==bcf_gt_missing ) + { + if ( !buf->ld.rand_missing ) break; + if ( hts_drand48() >= aaf ) adsg += 1; + } + else if ( bcf_gt_allele(aptr[j]) ) adsg += 1; + an++; + } + for (j=0; jn; j++) + { + if ( bptr[j]==bcf_int8_vector_end ) break; + if ( bptr[j]==bcf_gt_missing ) + { + if ( !buf->ld.rand_missing ) break; + if ( hts_drand48() >= baf ) bdsg += 1; + } + else if ( bcf_gt_allele(bptr[j]) ) bdsg += 1; + bn++; + } + if ( an && bn ) + { + an_tot += an; + aa += adsg*adsg; + a += adsg; + + bn_tot += bn; + bb += bdsg*bdsg; + b += bdsg; + + if ( adsg!=bdsg ) ndiff++; + ab += adsg*bdsg; + nab++; + } + if ( an==2 && bn==2 ) // for now only diploid genotypes + { + assert( adsg<=2 && bdsg<=2 ); + nhd[ bdsg*3 + adsg ]++; + } + } + if ( !nab ) return -1; // no data in common for the two sites + + double pa = a/an_tot; + double pb = b/bn_tot; + double cor; + if ( !ndiff ) cor = 1; + else + { + if ( aa == a*a/nab || bb == b*b/nab ) // zero variance, add small noise + { + aa += 1e-4; + bb += 1e-4; + ab += 1e-4; + a += 1e-2; + b += 1e-2; + nab++; + } + cor = (ab - a*b/nab) / sqrt(aa - a*a/nab) / sqrt(bb - b*b/nab); + } + + ld->val[VCFBUF_LD_IDX_R2] = cor * cor; + + // Lewontin's normalization of D. Also we cap at 1 as the calculation + // can result in values bigger than 1 for high AFs. + ld->val[VCFBUF_LD_IDX_LD] = cor * sqrt(pa*(1-pa)*pb*(1-pb)); + double norm; + if ( ld->val[VCFBUF_LD_IDX_LD] < 0 ) + norm = -pa*pb > -(1-pa)*(1-pb) ? -pa*pb : -(1-pa)*(1-pb); + else + norm = pa*(1-pb) > (1-pa)*pb ? pa*(1-pb) : (1-pa)*pb; + if ( norm ) + ld->val[VCFBUF_LD_IDX_LD] = fabs(norm) > fabs(ld->val[VCFBUF_LD_IDX_LD]) ? ld->val[VCFBUF_LD_IDX_LD]/norm : 1; + if ( !ld->val[VCFBUF_LD_IDX_LD] ) + ld->val[VCFBUF_LD_IDX_LD] = fabs(ld->val[VCFBUF_LD_IDX_LD]); // avoid "-0" on output + + ld->val[VCFBUF_LD_IDX_HD] = + (nhd[0] + nhd[1]/2. + nhd[3]/2. + nhd[4]/4.)*(nhd[4]/4. + nhd[5]/2. + nhd[7]/2. + nhd[8]) + - (nhd[1]/2. + nhd[2] + nhd[4]/4. + nhd[5]/2.)*(nhd[3]/2. + nhd[4]/4. + nhd[6] + nhd[7]/2.); + ld->val[VCFBUF_LD_IDX_HD] /= nab; + ld->val[VCFBUF_LD_IDX_HD] /= nab+1; + + return 0; +} + +int vcfbuf_ld(vcfbuf_t *buf, bcf1_t *rec, vcfbuf_ld_t *ld) +{ + int ret = -1; + if ( !buf->rbuf.n ) return ret; + + int j, i = buf->rbuf.f; + + // Relying on vcfbuf being properly flushed - all sites in the buffer + // must come from the same chromosome + if ( buf->vcf[i].rec->rid != rec->rid ) return ret; + + vcfbuf_ld_t tmp; + for (j=0; jval[j] = -HUGE_VAL; + ld->rec[j] = NULL; + } + + for (i=-1; rbuf_next(&buf->rbuf,&i); ) + { + if ( buf->vcf[i].filter ) continue; + if ( _calc_r2_ld(buf, buf->vcf[i].rec, rec, &tmp) < 0 ) continue; // missing genotypes + + int done = 0; + for (j=0; jval[j] < tmp.val[j] ) + { + ld->val[j] = tmp.val[j]; + ld->rec[j] = buf->vcf[i].rec; + } + if ( buf->ld.max[j] < tmp.val[j] ) done = 1; + ret = 0; + } + if ( done ) return ret; + } + return ret; +} + + diff --git a/bcftools/vcfbuf.c.pysam.c b/bcftools/vcfbuf.c.pysam.c new file mode 100644 index 0000000..7b1c40e --- /dev/null +++ b/bcftools/vcfbuf.c.pysam.c @@ -0,0 +1,564 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2016-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "vcfbuf.h" +#include "rbuf.h" + +typedef struct +{ + double max[VCFBUF_LD_N]; + int rand_missing, filter1; +} +ld_t; + +typedef struct +{ + bcf1_t *rec; + double af; + int af_set:1, filter:1, idx:30; +} +vcfrec_t; + +#define PRUNE_MODE_MAX_AF 1 +#define PRUNE_MODE_1ST 2 +#define PRUNE_MODE_RAND 3 +typedef struct +{ + int max_sites, mvrec, mac, mfarr, mode; + int *ac, *idx; + float *farr; + char *af_tag; + vcfrec_t **vrec; +} +prune_t; + +typedef struct +{ + int active; +} +rmdup_t; + +typedef struct +{ + int active, rid, end; +} +overlap_t; + +struct _vcfbuf_t +{ + int win, dummy; + bcf_hdr_t *hdr; + vcfrec_t *vcf; + rbuf_t rbuf; + ld_t ld; + prune_t prune; + overlap_t overlap; + rmdup_t rmdup; +}; + +vcfbuf_t *vcfbuf_init(bcf_hdr_t *hdr, int win) +{ + vcfbuf_t *buf = (vcfbuf_t*) calloc(1,sizeof(vcfbuf_t)); + buf->hdr = hdr; + buf->win = win; + buf->overlap.rid = -1; + int i; + for (i=0; ild.max[i] = HUGE_VAL; + rbuf_init(&buf->rbuf, 0); + return buf; +} + +void vcfbuf_destroy(vcfbuf_t *buf) +{ + int i; + for (i=0; irbuf.m; i++) + if ( buf->vcf[i].rec ) bcf_destroy(buf->vcf[i].rec); + free(buf->vcf); + free(buf->prune.farr); + free(buf->prune.vrec); + free(buf->prune.ac); + free(buf->prune.idx); + free(buf); +} + +void vcfbuf_set(vcfbuf_t *buf, vcfbuf_opt_t key, void *value) +{ + if ( key==LD_FILTER1 ) { buf->ld.filter1 = *((int*)value); return; } + if ( key==LD_RAND_MISSING ) { buf->ld.rand_missing = *((int*)value); return; } + if ( key==LD_MAX_R2 ) { buf->ld.max[VCFBUF_LD_IDX_R2] = *((double*)value); return; } + if ( key==LD_MAX_LD ) { buf->ld.max[VCFBUF_LD_IDX_LD] = *((double*)value); return; } + if ( key==LD_MAX_HD ) { buf->ld.max[VCFBUF_LD_IDX_HD] = *((double*)value); return; } + + if ( key==VCFBUF_DUMMY ) { buf->dummy = *((int*)value); return; } + if ( key==VCFBUF_NSITES ) + { + buf->prune.max_sites = *((int*)value); + if ( !buf->prune.mode ) buf->prune.mode = PRUNE_MODE_MAX_AF; + return; + } + if ( key==VCFBUF_AF_TAG ) { buf->prune.af_tag = *((char**)value); return; } + if ( key==VCFBUF_OVERLAP_WIN ) { buf->overlap.active = *((int*)value); return; } + if ( key==VCFBUF_RMDUP) { buf->rmdup.active = *((int*)value); return; } + + if ( key==VCFBUF_NSITES_MODE ) + { + char *mode = *((char**)value); + if ( !strcasecmp(mode,"maxAF") ) buf->prune.mode = PRUNE_MODE_MAX_AF; + else if ( !strcasecmp(mode,"1st") ) buf->prune.mode = PRUNE_MODE_1ST; + else if ( !strcasecmp(mode,"rand") ) buf->prune.mode = PRUNE_MODE_RAND; + else error("The mode \"%s\" is not recognised\n",mode); + return; + } +} + +int vcfbuf_nsites(vcfbuf_t *buf) +{ + return buf->rbuf.n; +} + +bcf1_t *vcfbuf_push(vcfbuf_t *buf, bcf1_t *rec) +{ + rbuf_expand0(&buf->rbuf, vcfrec_t, buf->rbuf.n+1, buf->vcf); + + int i = rbuf_append(&buf->rbuf); + if ( !buf->vcf[i].rec ) buf->vcf[i].rec = bcf_init1(); + + bcf1_t *ret = buf->vcf[i].rec; + buf->vcf[i].rec = rec; + buf->vcf[i].af_set = 0; + buf->vcf[i].filter = buf->ld.filter1; + buf->ld.filter1 = 0; + + return ret; +} + +bcf1_t *vcfbuf_peek(vcfbuf_t *buf, int idx) +{ + int i = rbuf_kth(&buf->rbuf, idx); + return i<0 ? NULL : buf->vcf[i].rec; +} + +bcf1_t *vcfbuf_remove(vcfbuf_t *buf, int idx) +{ + int i = rbuf_kth(&buf->rbuf, idx); + if ( i<0 ) return NULL; + bcf1_t *rec = buf->vcf[i].rec; + rbuf_remove_kth(&buf->rbuf, vcfrec_t, idx, buf->vcf); + return rec; +} + +static int cmpvrec(const void *_a, const void *_b) +{ + vcfrec_t *a = *((vcfrec_t**) _a); + vcfrec_t *b = *((vcfrec_t**) _b); + if ( a->af < b->af ) return -1; + if ( a->af == b->af ) return 0; + return 1; +} +static int cmpint_desc(const void *_a, const void *_b) +{ + int a = *((int*)_a); + int b = *((int*)_b); + if ( a < b ) return 1; + if ( a == b ) return 0; + return -1; +} + +static void _prune_sites(vcfbuf_t *buf, int flush_all) +{ + int nbuf = flush_all ? buf->rbuf.n : buf->rbuf.n - 1; + + int nprune = nbuf - buf->prune.max_sites; + int i,k,irec = 0; + if ( buf->prune.mode==PRUNE_MODE_1ST ) + { + int eoff = flush_all ? 1 : 2; + for (i=0; irbuf, vcfrec_t, buf->rbuf.n - eoff, buf->vcf); + return; + } + if ( buf->prune.mode==PRUNE_MODE_RAND ) + { + int eoff = flush_all ? 0 : 1; + for (i=0; irbuf.n - eoff) * hts_drand48(); + rbuf_remove_kth(&buf->rbuf, vcfrec_t, j, buf->vcf); + } + return; + } + + if ( nbuf > buf->prune.mvrec ) + { + buf->prune.idx = (int*) realloc(buf->prune.idx, nbuf*sizeof(int)); + buf->prune.vrec = (vcfrec_t**) realloc(buf->prune.vrec, nbuf*sizeof(vcfrec_t*)); + buf->prune.mvrec = nbuf; + } + + // set allele frequency and prepare buffer for sorting + for (i=-1; rbuf_next(&buf->rbuf,&i) && irecvcf[i].rec; + if ( line->n_allele > buf->prune.mac ) + { + buf->prune.ac = (int*) realloc(buf->prune.ac, line->n_allele*sizeof(*buf->prune.ac)); + buf->prune.mac = line->n_allele; + } + if ( !buf->vcf[i].af_set ) + { + buf->vcf[i].af = 0; + if ( buf->prune.af_tag ) + { + if ( bcf_get_info_float(buf->hdr,line,buf->prune.af_tag,&buf->prune.farr, &buf->prune.mfarr) > 0 ) buf->vcf[i].af = buf->prune.farr[0]; + } + else if ( bcf_calc_ac(buf->hdr, line, buf->prune.ac, BCF_UN_INFO|BCF_UN_FMT) ) + { + int ntot = buf->prune.ac[0], nalt = 0; + for (k=1; kn_allele; k++) nalt += buf->prune.ac[k]; + buf->vcf[i].af = ntot ? (float)nalt/ntot : 0; + } + buf->vcf[i].af_set = 1; + } + buf->vcf[i].idx = irec; + buf->prune.vrec[irec++] = &buf->vcf[i]; + } + + // sort by allele frequency, low AF will be removed preferentially + qsort(buf->prune.vrec, nbuf, sizeof(*buf->prune.vrec), cmpvrec); + + // sort the rbuf indexes to be pruned descendently so that j-th rbuf index + // is removed before i-th index if iprune.idx[i] = buf->prune.vrec[i]->idx; + + qsort(buf->prune.idx, nprune, sizeof(int), cmpint_desc); + + for (i=0; irbuf, vcfrec_t, buf->prune.idx[i], buf->vcf); +} + +static int _rmdup_can_flush(vcfbuf_t *buf, int flush_all) +{ + if ( flush_all ) return 1; + + if ( buf->rbuf.n==1 ) return 0; + + int k1 = rbuf_kth(&buf->rbuf, -1); + int k2 = rbuf_kth(&buf->rbuf, -2); + + vcfrec_t *rec1 = &buf->vcf[k1]; + vcfrec_t *rec2 = &buf->vcf[k2]; + + if ( rec1->rec->rid!=rec2->rec->rid ) return 1; + if ( rec1->rec->pos!=rec2->rec->pos ) return 1; + + return 0; +} + +static int _overlap_can_flush(vcfbuf_t *buf, int flush_all) +{ + if ( flush_all ) { buf->overlap.rid = -1; return 1; } + + int i = rbuf_last(&buf->rbuf); + vcfrec_t *last = &buf->vcf[i]; + if ( buf->overlap.rid != last->rec->rid ) buf->overlap.end = 0; + + int beg_pos = last->rec->pos; + int end_pos = last->rec->pos + last->rec->rlen - 1; + + // Assuming left-aligned indels. In case it is a deletion, the real variant + // starts one base after. If an insertion, the overlap with previous zero length. + int imin = last->rec->rlen; + for (i=0; irec->n_allele; i++) + { + char *ref = last->rec->d.allele[0]; + char *alt = last->rec->d.allele[i]; + if ( *alt == '<' ) continue; // ignore symbolic alleles + while ( *ref && *alt && nt_to_upper(*ref)==nt_to_upper(*alt) ) { ref++; alt++; } + if ( imin > ref - last->rec->d.allele[0] ) imin = ref - last->rec->d.allele[0]; + } + + if ( beg_pos <= buf->overlap.end ) + { + beg_pos += imin; + if ( beg_pos > end_pos ) end_pos = beg_pos; + } + + if ( buf->rbuf.n==1 ) + { + buf->overlap.rid = last->rec->rid; + buf->overlap.end = end_pos; + return 0; + } + if ( beg_pos <= buf->overlap.end ) + { + if ( buf->overlap.end < end_pos ) buf->overlap.end = end_pos; + return 0; + } + return 1; +} + +bcf1_t *vcfbuf_flush(vcfbuf_t *buf, int flush_all) +{ + int i,j; + + if ( buf->rbuf.n==0 ) return NULL; + if ( flush_all || buf->dummy ) goto ret; + + i = rbuf_kth(&buf->rbuf, 0); // first + j = rbuf_last(&buf->rbuf); // last + + if ( buf->vcf[i].rec->rid != buf->vcf[j].rec->rid ) goto ret; + if ( buf->overlap.active && _overlap_can_flush(buf, flush_all) ) goto ret; + if ( buf->rmdup.active && _rmdup_can_flush(buf, flush_all) ) goto ret; + + if ( buf->win > 0 ) + { + if ( buf->rbuf.n <= buf->win ) return NULL; + goto ret; + } + else if ( buf->win < 0 ) + { + if ( buf->vcf[i].rec->pos - buf->vcf[j].rec->pos > buf->win ) return NULL; + goto ret; + } + else + return NULL; + +ret: + if ( buf->prune.max_sites && buf->prune.max_sites < buf->rbuf.n ) _prune_sites(buf, flush_all); + + i = rbuf_shift(&buf->rbuf); + return buf->vcf[i].rec; +} + +static double _estimate_af(int8_t *ptr, int size, int nvals, int nsamples) +{ + int i,j, nref = 0, nalt = 0; + for (i=0; in_sample!=brec->n_sample ) error("Different number of samples: %d vs %d\n",arec->n_sample,brec->n_sample); + assert( arec->n_sample ); + + int i,j,igt = bcf_hdr_id2int(buf->hdr, BCF_DT_ID, "GT"); + bcf_unpack(arec, BCF_UN_FMT); + bcf_unpack(brec, BCF_UN_FMT); + bcf_fmt_t *afmt = NULL, *bfmt = NULL; + for (i=0; in_fmt; i++) + if ( arec->d.fmt[i].id==igt ) { afmt = &arec->d.fmt[i]; break; } + if ( !afmt ) return -1; // no GT tag + for (i=0; in_fmt; i++) + if ( brec->d.fmt[i].id==igt ) { bfmt = &brec->d.fmt[i]; break; } + if ( !bfmt ) return -1; // no GT tag + + if ( afmt->n==0 ) return -1; // empty?! + if ( bfmt->n==0 ) return -1; // empty?! + if ( afmt->type!=BCF_BT_INT8 ) error("TODO: the GT fmt_type is not int8!\n"); + if ( bfmt->type!=BCF_BT_INT8 ) error("TODO: the GT fmt_type is not int8!\n"); + + // Determine allele frequencies, this is to sample randomly missing genotypes + double aaf = 0, baf = 0; + if ( buf->ld.rand_missing ) + { + aaf = _estimate_af((int8_t*)afmt->p, afmt->size, afmt->n, arec->n_sample); + baf = _estimate_af((int8_t*)bfmt->p, bfmt->size, bfmt->n, brec->n_sample); + } + + // Calculate r2, lf, hd + double nhd[] = {0,0,0,0,0,0,0,0,0}; + double ab = 0, aa = 0, bb = 0, a = 0, b = 0; + int nab = 0, ndiff = 0; + int an_tot = 0, bn_tot = 0; + for (i=0; in_sample; i++) + { + int8_t *aptr = (int8_t*) (afmt->p + i*afmt->size); + int8_t *bptr = (int8_t*) (bfmt->p + i*bfmt->size); + int adsg = 0, bdsg = 0; // dosages (0,1,2) at sites (a,b) + int an = 0, bn = 0; // number of alleles at sites (a,b) + for (j=0; jn; j++) + { + if ( aptr[j]==bcf_int8_vector_end ) break; + if ( aptr[j]==bcf_gt_missing ) + { + if ( !buf->ld.rand_missing ) break; + if ( hts_drand48() >= aaf ) adsg += 1; + } + else if ( bcf_gt_allele(aptr[j]) ) adsg += 1; + an++; + } + for (j=0; jn; j++) + { + if ( bptr[j]==bcf_int8_vector_end ) break; + if ( bptr[j]==bcf_gt_missing ) + { + if ( !buf->ld.rand_missing ) break; + if ( hts_drand48() >= baf ) bdsg += 1; + } + else if ( bcf_gt_allele(bptr[j]) ) bdsg += 1; + bn++; + } + if ( an && bn ) + { + an_tot += an; + aa += adsg*adsg; + a += adsg; + + bn_tot += bn; + bb += bdsg*bdsg; + b += bdsg; + + if ( adsg!=bdsg ) ndiff++; + ab += adsg*bdsg; + nab++; + } + if ( an==2 && bn==2 ) // for now only diploid genotypes + { + assert( adsg<=2 && bdsg<=2 ); + nhd[ bdsg*3 + adsg ]++; + } + } + if ( !nab ) return -1; // no data in common for the two sites + + double pa = a/an_tot; + double pb = b/bn_tot; + double cor; + if ( !ndiff ) cor = 1; + else + { + if ( aa == a*a/nab || bb == b*b/nab ) // zero variance, add small noise + { + aa += 1e-4; + bb += 1e-4; + ab += 1e-4; + a += 1e-2; + b += 1e-2; + nab++; + } + cor = (ab - a*b/nab) / sqrt(aa - a*a/nab) / sqrt(bb - b*b/nab); + } + + ld->val[VCFBUF_LD_IDX_R2] = cor * cor; + + // Lewontin's normalization of D. Also we cap at 1 as the calculation + // can result in values bigger than 1 for high AFs. + ld->val[VCFBUF_LD_IDX_LD] = cor * sqrt(pa*(1-pa)*pb*(1-pb)); + double norm; + if ( ld->val[VCFBUF_LD_IDX_LD] < 0 ) + norm = -pa*pb > -(1-pa)*(1-pb) ? -pa*pb : -(1-pa)*(1-pb); + else + norm = pa*(1-pb) > (1-pa)*pb ? pa*(1-pb) : (1-pa)*pb; + if ( norm ) + ld->val[VCFBUF_LD_IDX_LD] = fabs(norm) > fabs(ld->val[VCFBUF_LD_IDX_LD]) ? ld->val[VCFBUF_LD_IDX_LD]/norm : 1; + if ( !ld->val[VCFBUF_LD_IDX_LD] ) + ld->val[VCFBUF_LD_IDX_LD] = fabs(ld->val[VCFBUF_LD_IDX_LD]); // avoid "-0" on output + + ld->val[VCFBUF_LD_IDX_HD] = + (nhd[0] + nhd[1]/2. + nhd[3]/2. + nhd[4]/4.)*(nhd[4]/4. + nhd[5]/2. + nhd[7]/2. + nhd[8]) + - (nhd[1]/2. + nhd[2] + nhd[4]/4. + nhd[5]/2.)*(nhd[3]/2. + nhd[4]/4. + nhd[6] + nhd[7]/2.); + ld->val[VCFBUF_LD_IDX_HD] /= nab; + ld->val[VCFBUF_LD_IDX_HD] /= nab+1; + + return 0; +} + +int vcfbuf_ld(vcfbuf_t *buf, bcf1_t *rec, vcfbuf_ld_t *ld) +{ + int ret = -1; + if ( !buf->rbuf.n ) return ret; + + int j, i = buf->rbuf.f; + + // Relying on vcfbuf being properly flushed - all sites in the buffer + // must come from the same chromosome + if ( buf->vcf[i].rec->rid != rec->rid ) return ret; + + vcfbuf_ld_t tmp; + for (j=0; jval[j] = -HUGE_VAL; + ld->rec[j] = NULL; + } + + for (i=-1; rbuf_next(&buf->rbuf,&i); ) + { + if ( buf->vcf[i].filter ) continue; + if ( _calc_r2_ld(buf, buf->vcf[i].rec, rec, &tmp) < 0 ) continue; // missing genotypes + + int done = 0; + for (j=0; jval[j] < tmp.val[j] ) + { + ld->val[j] = tmp.val[j]; + ld->rec[j] = buf->vcf[i].rec; + } + if ( buf->ld.max[j] < tmp.val[j] ) done = 1; + ret = 0; + } + if ( done ) return ret; + } + return ret; +} + + diff --git a/bcftools/vcfbuf.h b/bcftools/vcfbuf.h new file mode 100644 index 0000000..878fd10 --- /dev/null +++ b/bcftools/vcfbuf.h @@ -0,0 +1,122 @@ +/* The MIT License + + Copyright (c) 2017-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +/* + Buffer VCF records and perform operations on the buffer +*/ + +#ifndef __VCFBUF_H__ +#define __VCFBUF_H__ + +#include + +typedef struct _vcfbuf_t vcfbuf_t; + +// Modes of operation +typedef enum +{ + VCFBUF_DUMMY, // the caller maintains the buffer via push/peek/flush, nothing is removed by vcfbuf + + VCFBUF_OVERLAP_WIN, // keep only overlapping variants in the window + VCFBUF_RMDUP, // remove duplicate sites (completely) + VCFBUF_NSITES, // leave at max this many sites in the window + VCFBUF_NSITES_MODE, // one of: maxAF (keep sites with max AF), 1st (sites that come first), rand (pick randomly) + VCFBUF_AF_TAG, // use this INFO tag with VCFBUF_NSITES + + // LD related options + LD_RAND_MISSING, // randomize rather than ignore missing genotypes + LD_FILTER1, // exclude the next record inserted by vcfbuf_push() from LD analysis + LD_MAX_R2, // If set, vcfbuf_ld() will stop at the first record that exceeds the R2, + LD_MAX_LD, // LD, or HD threshold. When multiple are set, the OR logic is applied + LD_MAX_HD, // +} +vcfbuf_opt_t; + +#define vcfbuf_set_opt(buf,type,key,value) { type tmp = value; vcfbuf_set(buf, key, (void*)&tmp); } +void vcfbuf_set(vcfbuf_t *buf, vcfbuf_opt_t key, void *value); + + +/* + * vcfbuf_init() - init buffer + * @win: number of sites (>0), bp (<0) + */ +vcfbuf_t *vcfbuf_init(bcf_hdr_t *hdr, int win); +void vcfbuf_destroy(vcfbuf_t *buf); + +/* + * vcfbuf_push() - push a new site for analysis + */ +bcf1_t *vcfbuf_push(vcfbuf_t *buf, bcf1_t *rec); + +/* + * vcfbuf_peek() - return pointer to i-th record in the buffer but do not remove it from the buffer + * @idx: 0-based index to buffered lines + */ +bcf1_t *vcfbuf_peek(vcfbuf_t *buf, int idx); + +/* + * vcfbuf_remove() - return pointer to i-th record in the buffer and remove it from the buffer + * @idx: 0-based index to buffered lines + */ +bcf1_t *vcfbuf_remove(vcfbuf_t *buf, int idx); + +/* + * vcfbuf_flush() - returns the next record or NULL, depending on the mode of operation and + * the content of the buffer + */ +bcf1_t *vcfbuf_flush(vcfbuf_t *buf, int flush_all); + +/* + * vcfbuf_nsites() - return the number of sites in the buffer + */ +int vcfbuf_nsites(vcfbuf_t *buf); + +/* + * vcfbuf_ld() - find records with maximum LD values or the values in first record that exceeds thresholds + * set by vcfbuf_set_opt(..,LD_MAX*,..) + * + * Returns 0 on success or -1 if no values were filled. + * + * @val: will be filled with the values + * .. correlation coefficient r-squared + * .. Lewontin's D' (PMID: 19433632) + * .. Ragsdale's \hat{D} (doi:10.1093/molbev/msz265) + * @rec: corresponding positions or NULL if the value(s) has not been set + */ +#define VCFBUF_LD_N 3 +#define VCFBUF_LD_IDX_R2 0 +#define VCFBUF_LD_IDX_LD 1 +#define VCFBUF_LD_IDX_HD 2 +typedef struct +{ + double val[VCFBUF_LD_N]; // r2, ld, hd + bcf1_t *rec[VCFBUF_LD_N]; // record with max r2, ld, hd +} +vcfbuf_ld_t; +int vcfbuf_ld(vcfbuf_t *buf, bcf1_t *rec, vcfbuf_ld_t *ld); + +#endif + diff --git a/bcftools/vcfcall.c b/bcftools/vcfcall.c new file mode 100644 index 0000000..4c9e88c --- /dev/null +++ b/bcftools/vcfcall.c @@ -0,0 +1,1179 @@ +/* vcfcall.c -- SNP/indel variant calling from VCF/BCF. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "call.h" +#include "prob1.h" +#include "ploidy.h" +#include "gvcf.h" +#include "regidx.h" +#include "vcfbuf.h" + +void error(const char *format, ...); + +#define CF_NO_GENO 1 +#define CF_INS_MISSED (1<<1) +#define CF_CCALL (1<<2) +// (1<<3) +// (1<<4) +// (1<<5) +#define CF_ACGT_ONLY (1<<6) +#define CF_QCALL (1<<7) +#define CF_ADJLD (1<<8) +#define CF_NO_INDEL (1<<9) +#define CF_ANNO_MAX (1<<10) +#define CF_MCALL (1<<11) +#define CF_PAIRCALL (1<<12) +#define CF_QCNT (1<<13) +#define CF_INDEL_ONLY (1<<14) + +typedef struct +{ + tgt_als_t *als; + int nmatch_als, ibuf; +} +rec_tgt_t; + +typedef struct +{ + int flag; // combination of CF_* flags above + int output_type, n_threads, record_cmd_line, clevel; + htsFile *bcf_in, *out_fh; + char *bcf_fname, *output_fname; + char **samples; // for subsampling and ploidy + int nsamples, *samples_map; // mapping from output sample names to original VCF + char *regions, *targets; // regions to process + int regions_is_file, targets_is_file, regions_overlap; + regidx_t *tgt_idx; + regitr_t *tgt_itr, *tgt_itr_prev, *tgt_itr_tmp; + vcfbuf_t *vcfbuf; + + char *samples_fname; + int samples_is_file; + int *sample2sex; // mapping for ploidy. If negative, interpreted as -1*ploidy + int *sex2ploidy, *sex2ploidy_prev, nsex; + ploidy_t *ploidy; + gvcf_t *gvcf; + + bcf1_t *missed_line; + call_t aux; // parameters and temporary data + kstring_t str; + + int argc; + char **argv; + + // int flag, prior_type, n1, n_sub, *sublist, n_perm; + // uint32_t *trio_aux; + // char *prior_file, **subsam; + // uint8_t *ploidy; + // double theta, pref, indel_frac, min_smpl_frac, min_lrt; + // Permutation tests + // int n_perm, *seeds; + // double min_perm_p; + // void *bed; +} +args_t; + +static char **add_sample(void *name2idx, char **lines, int *nlines, int *mlines, char *name, char sex, int *ith) +{ + int ret = khash_str2int_get(name2idx, name, ith); + if ( ret==0 ) return lines; + + hts_expand(char*,(*nlines+1),*mlines,lines); + int len = strlen(name); + lines[*nlines] = (char*) malloc(len+3); + memcpy(lines[*nlines],name,len); + lines[*nlines][len] = ' '; + lines[*nlines][len+1] = sex; + lines[*nlines][len+2] = 0; + *ith = *nlines; + (*nlines)++; + khash_str2int_set(name2idx, strdup(name), *ith); + return lines; +} + +typedef struct +{ + const char *alias, *about, *ploidy; +} +ploidy_predef_t; + +static ploidy_predef_t ploidy_predefs[] = +{ + { .alias = "GRCh37", + .about = "Human Genome reference assembly GRCh37 / hg19", + .ploidy = + "X 1 60000 M 1\n" + "X 2699521 154931043 M 1\n" + "Y 1 59373566 M 1\n" + "Y 1 59373566 F 0\n" + "MT 1 16569 M 1\n" + "MT 1 16569 F 1\n" + "chrX 1 60000 M 1\n" + "chrX 2699521 154931043 M 1\n" + "chrY 1 59373566 M 1\n" + "chrY 1 59373566 F 0\n" + "chrM 1 16569 M 1\n" + "chrM 1 16569 F 1\n" + "* * * M 2\n" + "* * * F 2\n" + }, + { .alias = "GRCh38", + .about = "Human Genome reference assembly GRCh38 / hg38", + .ploidy = + "X 1 9999 M 1\n" + "X 2781480 155701381 M 1\n" + "Y 1 57227415 M 1\n" + "Y 1 57227415 F 0\n" + "MT 1 16569 M 1\n" + "MT 1 16569 F 1\n" + "chrX 1 9999 M 1\n" + "chrX 2781480 155701381 M 1\n" + "chrY 1 57227415 M 1\n" + "chrY 1 57227415 F 0\n" + "chrM 1 16569 M 1\n" + "chrM 1 16569 F 1\n" + "* * * M 2\n" + "* * * F 2\n" + }, + { .alias = "X", + .about = "Treat male samples as haploid and female as diploid regardless of the chromosome name", + .ploidy = + "* * * M 1\n" + "* * * F 2\n" + }, + { .alias = "Y", + .about = "Treat male samples as haploid and female as no-copy, regardless of the chromosome name", + .ploidy = + "* * * M 1\n" + "* * * F 0\n" + }, + { .alias = "1", + .about = "Treat all samples as haploid", + .ploidy = + "* * * * 1\n" + }, + { .alias = "2", + .about = "Treat all samples as diploid", + .ploidy = + "* * * * 2\n" + }, + { + .alias = NULL, + .about = NULL, + .ploidy = NULL, + } +}; + +// only 5 columns are required and the first is ignored: +// ignored,sample,father(or 0),mother(or 0),sex(1=M,2=F) +static char **parse_ped_samples(call_t *call, char **vals, int nvals, int *nsmpl) +{ + int i, j, mlines = 0, nlines = 0; + kstring_t str = {0,0,0}, fam_str = {0,0,0}; + void *name2idx = khash_str2int_init(); + char **lines = NULL; + for (i=0; infams++; + hts_expand(family_t, call->nfams, call->mfams, call->fams); + family_t *fam = &call->fams[call->nfams-1]; + fam_str.l = 0; + ksprintf(&fam_str,"father=%s, mother=%s, child=%s", col_ends[1]+1,col_ends[2]+1,col_ends[0]+1); + fam->name = strdup(fam_str.s); + + if ( !khash_str2int_has_key(name2idx, col_ends[1]+1) ) + lines = add_sample(name2idx, lines, &nlines, &mlines, col_ends[1]+1, 'M', &fam->sample[FATHER]); + if ( !khash_str2int_has_key(name2idx, col_ends[2]+1) ) + lines = add_sample(name2idx, lines, &nlines, &mlines, col_ends[2]+1, 'F', &fam->sample[MOTHER]); + + khash_str2int_get(name2idx, col_ends[0]+1, &fam->sample[CHILD]); + khash_str2int_get(name2idx, col_ends[1]+1, &fam->sample[FATHER]); + khash_str2int_get(name2idx, col_ends[2]+1, &fam->sample[MOTHER]); + } + } + free(str.s); + free(fam_str.s); + khash_str2int_destroy_free(name2idx); + + if ( i!=nvals ) return NULL; // not a ped file + + *nsmpl = nlines; + return lines; +} + + +/* + * Reads sample names and their ploidy (optional) from a file. + * Alternatively, if no such file exists, the file name is interpreted + * as a comma-separated list of samples. When ploidy is not present, + * the default ploidy 2 is assumed. + */ +static void set_samples(args_t *args, const char *fn, int is_file) +{ + int i, nlines; + char **lines = hts_readlist(fn, is_file, &nlines); + if ( !lines ) error("Could not read the file: %s\n", fn); + + int nsmpls; + char **smpls = parse_ped_samples(&args->aux, lines, nlines, &nsmpls); + if ( smpls ) + { + for (i=0; isamples_map = (int*) malloc(sizeof(int)*bcf_hdr_nsamples(args->aux.hdr)); // for subsetting + args->sample2sex = (int*) malloc(sizeof(int)*bcf_hdr_nsamples(args->aux.hdr)); + int dflt_sex_id = ploidy_nsex(args->ploidy) - 1; + for (i=0; iaux.hdr); i++) args->sample2sex[i] = dflt_sex_id; + + int *old2new = (int*) malloc(sizeof(int)*bcf_hdr_nsamples(args->aux.hdr)); + for (i=0; iaux.hdr); i++) old2new[i] = -1; + + int nsmpl = 0, map_needed = 0; + for (i=0; iaux.hdr, BCF_DT_SAMPLE, ss); + if ( ismpl < 0 ) { fprintf(stderr,"Warning: No such sample in the VCF: %s\n",ss); continue; } + if ( old2new[ismpl] != -1 ) { fprintf(stderr,"Warning: The sample is listed multiple times: %s\n",ss); continue; } + + ss = se+(x != '\0'); + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) ss = "2"; // default ploidy + se = ss; + while ( *se && !isspace(*se) ) se++; + if ( se==ss ) { *xptr = x; error("Could not parse: \"%s\"\n", lines[i]); } + + if ( ss[1]==0 && (ss[0]=='0' || ss[0]=='1' || ss[0]=='2') ) + args->sample2sex[nsmpl] = -1*(ss[0]-'0'); + else + args->sample2sex[nsmpl] = ploidy_add_sex(args->ploidy, ss); + + if ( ismpl!=nsmpl ) map_needed = 1; + args->samples_map[nsmpl] = ismpl; + old2new[ismpl] = nsmpl; + nsmpl++; + } + + for (i=0; iaux.nfams; i++) + { + int j, nmiss = 0; + family_t *fam = &args->aux.fams[i]; + for (j=0; j<3; j++) + { + fam->sample[i] = old2new[fam->sample[i]]; + if ( fam->sample[i]<0 ) nmiss++; + } + assert( nmiss==0 || nmiss==3 ); + } + free(old2new); + + if ( !map_needed ) { free(args->samples_map); args->samples_map = NULL; } + + args->nsamples = nsmpl; + args->samples = lines; +} + +static void init_missed_line(args_t *args) +{ + int i; + for (i=0; iaux.hdr); i++) + { + args->aux.gts[i*2] = bcf_gt_missing; + args->aux.gts[i*2+1] = bcf_int32_vector_end; + } + args->missed_line = bcf_init1(); + bcf_update_genotypes(args->aux.hdr, args->missed_line, args->aux.gts, 2*bcf_hdr_nsamples(args->aux.hdr)); + bcf_float_set_missing(args->missed_line->qual); +} + +static int tgt_parse(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) { fprintf(stderr,"Could not parse the line: %s\n", line); return -2; } + if ( *ss=='#' ) return -1; // skip comments + + char *se = ss; + while ( *se && !isspace(*se) ) se++; + + *chr_beg = ss; + *chr_end = se-1; + + if ( !*se ) { fprintf(stderr,"Could not parse the line: %s\n", line); return -2; } + + ss = se+1; + *beg = strtod(ss, &se); + if ( ss==se ) { fprintf(stderr,"Could not parse tab line: %s\n", line); return -2; } + if ( *beg==0 ) { fprintf(stderr,"Could not parse tab line, expected 1-based coordinate: %s\n", line); return -2; } + (*beg)--; + *end = *beg; + + if ( !usr ) return 0; // allele information not required + + ss = se+1; + tgt_als_t *als = (tgt_als_t*)payload; + als->used = 0; + als->n = 0; + als->allele = NULL; + while ( *ss ) + { + se = ss; + while ( *se && *se!=',' ) se++; + als->n++; + als->allele = (char**)realloc(als->allele,als->n*sizeof(*als->allele)); + als->allele[als->n-1] = (char*)malloc(se-ss+1); + memcpy(als->allele[als->n-1],ss,se-ss); + als->allele[als->n-1][se-ss] = 0; + ss = se+1; + if ( !*se ) break; + } + return 0; +} +static void tgt_free(void *payload) +{ + tgt_als_t *als = (tgt_als_t*)payload; + int i; + for (i=0; in; i++) free(als->allele[i]); + free(als->allele); +} +static void tgt_flush_region(args_t *args, char *chr, uint32_t beg, uint32_t end) +{ + if ( !regidx_overlap(args->tgt_idx, chr,beg,end,args->tgt_itr_tmp) ) return; + while ( regitr_overlap(args->tgt_itr_tmp) ) + { + if ( args->tgt_itr_tmp->beg < beg ) continue; + + tgt_als_t *tgt_als = ®itr_payload(args->tgt_itr_tmp,tgt_als_t); + if ( tgt_als->used ) continue; + + args->missed_line->rid = bcf_hdr_name2id(args->aux.hdr,chr); + args->missed_line->pos = args->tgt_itr_tmp->beg; + bcf_unpack(args->missed_line,BCF_UN_ALL); + bcf_update_alleles(args->aux.hdr, args->missed_line, (const char**)tgt_als->allele, tgt_als->n); + tgt_als->used = 1; + if ( bcf_write1(args->out_fh, args->aux.hdr, args->missed_line)!=0 ) error("[%s] Error: failed to write to %s\n", __func__,args->output_fname); + } +} +static void tgt_flush(args_t *args, bcf1_t *rec) +{ + if ( rec ) + { + char *chr = (char*)bcf_seqname(args->aux.hdr,rec); + + if ( !args->tgt_itr_prev ) // first record + tgt_flush_region(args,chr,0,rec->pos-1); + + else if ( strcmp(chr,args->tgt_itr_prev->seq) ) // first record on a new chromosome + { + tgt_flush_region(args,args->tgt_itr_prev->seq,args->tgt_itr_prev->beg+1,REGIDX_MAX); + tgt_flush_region(args,chr,0,rec->pos-1); + } + else // another record on the same chromosome + tgt_flush_region(args,args->tgt_itr_prev->seq,args->tgt_itr_prev->beg,rec->pos-1); + } + else + { + // flush everything + if ( args->tgt_itr_prev ) + tgt_flush_region(args,args->tgt_itr_prev->seq,args->tgt_itr_prev->beg,REGIDX_MAX); + + int i, nchr = 0; + char **chr = regidx_seq_names(args->tgt_idx, &nchr); + for (i=0; i" is not present at indels sites and there are no other symbolic alleles than <*> + if ( als[1][0]=='<' ) return 0; + + int i; + for (i=0; ivcfbuf ) + { + while ( bcf_sr_next_line(args->aux.srs) ) + { + rec = args->aux.srs->readers[0].buffer[0]; + if ( args->aux.srs->errnum || rec->errcode ) error("Error: could not parse the input VCF\n"); + if ( args->tgt_idx ) + { + if ( !regidx_overlap(args->tgt_idx, bcf_seqname(args->aux.hdr,rec),rec->pos,rec->pos,args->tgt_itr) ) continue; + + // For backward compatibility: require the exact position, not an interval overlap + int pos_match = 0; + while ( regitr_overlap(args->tgt_itr) ) + { + if ( args->tgt_itr->beg != rec->pos ) continue; + pos_match = 1; + break; + } + if ( !pos_match ) continue; + } + if ( args->samples_map ) bcf_subset(args->aux.hdr, rec, args->nsamples, args->samples_map); + bcf_unpack(rec, BCF_UN_STR); + return rec; + } + return NULL; + } + + // If we are here,-C alleles was given and vcfbuf and tgt_idx are set + + // Fill the buffer with duplicate lines + int vcfbuf_full = 1; + int nbuf = vcfbuf_nsites(args->vcfbuf); + bcf1_t *rec0 = NULL, *recN = NULL; + if ( nbuf==0 ) vcfbuf_full = 0; + else if ( nbuf==1 ) + { + vcfbuf_full = 0; + rec0 = vcfbuf_peek(args->vcfbuf, 0); + } + else + { + rec0 = vcfbuf_peek(args->vcfbuf, 0); + recN = vcfbuf_peek(args->vcfbuf, nbuf-1); + if ( rec0->rid == recN->rid && rec0->pos == recN->pos ) vcfbuf_full = 0; + } + if ( !vcfbuf_full ) + { + while ( bcf_sr_next_line(args->aux.srs) ) + { + rec = args->aux.srs->readers[0].buffer[0]; + if ( args->aux.srs->errnum || rec->errcode ) error("Error: could not parse the input VCF\n"); + if ( !regidx_overlap(args->tgt_idx, bcf_seqname(args->aux.hdr,rec),rec->pos,rec->pos,args->tgt_itr) ) continue; + // as above: require the exact position, not an interval overlap + int exact_match = 0; + while ( regitr_overlap(args->tgt_itr) ) + { + if ( args->tgt_itr->beg != rec->pos ) continue; + exact_match = 1; + break; + } + if ( !exact_match ) continue; + + if ( args->samples_map ) bcf_subset(args->aux.hdr, rec, args->nsamples, args->samples_map); + bcf_unpack(rec, BCF_UN_STR); + if ( !rec0 ) rec0 = rec; + recN = rec; + args->aux.srs->readers[0].buffer[0] = vcfbuf_push(args->vcfbuf, rec); + if ( rec0->rid!=recN->rid || rec0->pos!=recN->pos ) break; + } + } + + nbuf = vcfbuf_nsites(args->vcfbuf); + int n, i,j; + for (n=nbuf; n>1; n--) + { + recN = vcfbuf_peek(args->vcfbuf, n-1); + if ( rec0->rid==recN->rid && rec0->pos==recN->pos ) break; + } + if ( n==0 ) + { + assert( !nbuf ); + return NULL; + } + + // Find the VCF and tab record with the best matching combination of alleles, prioritize + // records of the same type (snp vs indel) + rec_tgt_t rec_tgt; + memset(&rec_tgt,0,sizeof(rec_tgt)); + regidx_overlap(args->tgt_idx, bcf_seqname(args->aux.hdr,rec0),rec0->pos,rec0->pos,args->tgt_itr); + regitr_t *tmp_itr = regitr_init(args->tgt_idx); + regitr_copy(tmp_itr, args->tgt_itr); + for (i=0; ivcfbuf, i); + int rec_indel = is_indel(rec->n_allele, rec->d.allele) ? 1 : -1; + while ( regitr_overlap(tmp_itr) ) + { + if ( tmp_itr->beg != rec->pos ) continue; + tgt_als_t *als = ®itr_payload(tmp_itr,tgt_als_t); + if ( als->used ) continue; + int nmatch_als = 0; + vcmp_t *vcmp = vcmp_init(); + int ret = vcmp_set_ref(vcmp, rec->d.allele[0], als->allele[0]); + if ( ret==0 ) + { + nmatch_als++; + if ( rec->n_allele > 1 && als->n > 1 ) + { + for (j=1; jn; j++) + { + if ( vcmp_find_allele(vcmp, rec->d.allele+1, rec->n_allele-1, als->allele[j])>=0 ) nmatch_als++; + } + } + } + int als_indel = is_indel(als->n, als->allele) ? 1 : -1; + nmatch_als *= rec_indel*als_indel; + if ( nmatch_als > rec_tgt.nmatch_als || !rec_tgt.als ) + { + rec_tgt.nmatch_als = nmatch_als; + rec_tgt.als = als; + rec_tgt.ibuf = i; + } + vcmp_destroy(vcmp); + } + } + regitr_destroy(tmp_itr); + + args->aux.tgt_als = rec_tgt.als; + if ( rec_tgt.als ) rec_tgt.als->used = 1; + + rec = vcfbuf_remove(args->vcfbuf, rec_tgt.ibuf); + return rec; +} + +static void init_data(args_t *args) +{ + args->aux.srs = bcf_sr_init(); + + // Open files for input and output, initialize structures + if ( args->targets ) + { + args->tgt_idx = regidx_init(args->targets, tgt_parse, args->aux.flag&CALL_CONSTR_ALLELES ? tgt_free : (regidx_free_f) NULL, sizeof(tgt_als_t), args->aux.flag&CALL_CONSTR_ALLELES ? args : NULL); + args->tgt_itr = regitr_init(args->tgt_idx); + args->tgt_itr_tmp = regitr_init(args->tgt_idx); + } + + if ( args->regions ) + { + bcf_sr_set_opt(args->aux.srs,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->aux.srs, args->regions, args->regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions); + } + + if ( !bcf_sr_add_reader(args->aux.srs, args->bcf_fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",args->bcf_fname)?"standard input":args->bcf_fname,bcf_sr_strerror(args->aux.srs->errnum)); + args->aux.hdr = bcf_sr_get_header(args->aux.srs,0); + + int i; + if ( args->samples_fname ) + { + set_samples(args, args->samples_fname, args->samples_is_file); + if ( args->aux.flag&CALL_CONSTR_TRIO ) + { + if ( 3*args->aux.nfams!=args->nsamples ) error("Expected only trios in %s, sorry!\n", args->samples_fname); + fprintf(stderr,"Detected %d samples in %d trio families\n", args->nsamples,args->aux.nfams); + } + } + if ( args->ploidy ) + { + args->nsex = ploidy_nsex(args->ploidy); + args->sex2ploidy = (int*) calloc(args->nsex,sizeof(int)); + args->sex2ploidy_prev = (int*) calloc(args->nsex,sizeof(int)); + if ( !args->nsamples ) + { + args->nsamples = bcf_hdr_nsamples(args->aux.hdr); + args->sample2sex = (int*) malloc(sizeof(int)*args->nsamples); + for (i=0; insamples; i++) args->sample2sex[i] = args->nsex - 1; + } + } + if ( args->nsamples ) + { + args->aux.ploidy = (uint8_t*) malloc(args->nsamples); + for (i=0; insamples; i++) args->aux.ploidy[i] = ploidy_max(args->ploidy); + for (i=0; insex; i++) args->sex2ploidy_prev[i] = ploidy_max(args->ploidy); + for (i=0; insamples; i++) + if ( args->sample2sex[i] >= args->nsex ) args->sample2sex[i] = args->nsex - 1; + } + + if ( args->gvcf ) + { + int id = bcf_hdr_id2int(args->aux.hdr,BCF_DT_ID,"DP"); + if ( id<0 || !bcf_hdr_idinfo_exists(args->aux.hdr,BCF_HL_FMT,id) ) error("--gvcf output mode requires FORMAT/DP tag, which is not present in the input header\n"); + gvcf_update_header(args->gvcf, args->aux.hdr); + } + + if ( args->samples_map ) + { + args->aux.hdr = bcf_hdr_subset(bcf_sr_get_header(args->aux.srs,0), args->nsamples, args->samples, args->samples_map); + if ( !args->aux.hdr ) error("Error occurred while subsetting samples\n"); + for (i=0; insamples; i++) + if ( args->samples_map[i]<0 ) error("No such sample: %s\n", args->samples[i]); + if ( !bcf_hdr_nsamples(args->aux.hdr) ) error("No matching sample found\n"); + } + else + { + args->aux.hdr = bcf_hdr_dup(bcf_sr_get_header(args->aux.srs,0)); + if ( args->samples ) + { + for (i=0; insamples; i++) + if ( bcf_hdr_id2int(args->aux.hdr,BCF_DT_SAMPLE,args->samples[i])<0 ) + error("No such sample: %s\n", args->samples[i]); + } + } + + if ( args->aux.flag & CALL_CONSTR_ALLELES ) + args->vcfbuf = vcfbuf_init(args->aux.hdr, 0); + + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Error: cannot write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(args->out_fh, args->n_threads); + + if ( args->flag & CF_QCALL ) + return; + + if ( args->flag & CF_MCALL ) + mcall_init(&args->aux); + + if ( args->flag & CF_CCALL ) + ccall_init(&args->aux); + + bcf_hdr_remove(args->aux.hdr, BCF_HL_INFO, "QS"); + bcf_hdr_remove(args->aux.hdr, BCF_HL_INFO, "I16"); + + if (args->record_cmd_line) bcf_hdr_append_version(args->aux.hdr, args->argc, args->argv, "bcftools_call"); + if ( bcf_hdr_write(args->out_fh, args->aux.hdr)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname); + + if ( args->flag&CF_INS_MISSED ) init_missed_line(args); +} + +static void destroy_data(args_t *args) +{ + if ( args->vcfbuf ) vcfbuf_destroy(args->vcfbuf); + if ( args->tgt_idx ) + { + regidx_destroy(args->tgt_idx); + regitr_destroy(args->tgt_itr); + regitr_destroy(args->tgt_itr_tmp); + if ( args->tgt_itr_prev ) regitr_destroy(args->tgt_itr_prev); + } + if ( args->flag & CF_CCALL ) ccall_destroy(&args->aux); + else if ( args->flag & CF_MCALL ) mcall_destroy(&args->aux); + else if ( args->flag & CF_QCALL ) qcall_destroy(&args->aux); + int i; + if ( args->samples ) + { + for (i=0; insamples; i++) free(args->samples[i]); + } + if ( args->aux.fams ) + { + for (i=0; iaux.nfams; i++) free(args->aux.fams[i].name); + free(args->aux.fams); + } + if ( args->missed_line ) bcf_destroy(args->missed_line); + ploidy_destroy(args->ploidy); + free(args->sex2ploidy); + free(args->sex2ploidy_prev); + free(args->samples); + free(args->samples_map); + free(args->sample2sex); + free(args->aux.ploidy); + free(args->str.s); + if ( args->gvcf ) gvcf_destroy(args->gvcf); + bcf_hdr_destroy(args->aux.hdr); + if ( hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + bcf_sr_destroy(args->aux.srs); +} + +void parse_novel_rate(args_t *args, const char *str) +{ + if ( sscanf(str,"%le,%le,%le",&args->aux.trio_Pm_SNPs,&args->aux.trio_Pm_del,&args->aux.trio_Pm_ins)==3 ) // explicit for all + { + args->aux.trio_Pm_SNPs = 1 - args->aux.trio_Pm_SNPs; + args->aux.trio_Pm_del = 1 - args->aux.trio_Pm_del; + args->aux.trio_Pm_ins = 1 - args->aux.trio_Pm_ins; + } + else if ( sscanf(str,"%le,%le",&args->aux.trio_Pm_SNPs,&args->aux.trio_Pm_del)==2 ) // dynamic for indels + { + args->aux.trio_Pm_SNPs = 1 - args->aux.trio_Pm_SNPs; + args->aux.trio_Pm_ins = -1; // negative value for dynamic calculation + } + else if ( sscanf(str,"%le",&args->aux.trio_Pm_SNPs)==1 ) // same for all + { + args->aux.trio_Pm_SNPs = 1 - args->aux.trio_Pm_SNPs; + args->aux.trio_Pm_del = -1; + args->aux.trio_Pm_ins = -1; + } + else error("Could not parse --novel-rate %s\n", str); +} + +static void list_annotations(FILE *fp) +{ + fprintf(fp, + "\n" + "Optional INFO annotations available with -m (\"INFO/\" prefix is optional):\n" + " INFO/PV4 .. P-values for strand bias, baseQ bias, mapQ bias and tail distance bias (Number=4,Type=Float)\n" + "\n" + "Optional FORMAT annotations available with -m (\"FORMAT/\" prefix is optional):\n" + " FORMAT/GQ .. Phred-scaled genotype quality (Number=1,Type=Integer)\n" + " FORMAT/GP .. Phred-scaled genotype posterior probabilities (Number=G,Type=Float)\n" + "\n"); +} + +static int parse_output_tags(const char *str) +{ + int flag = 0; + const char *ss = str; + while ( *ss ) + { + const char *se = ss; + while ( *se && *se!=',' ) se++; + if ( !strncasecmp(ss,"GQ",se-ss) || !strncasecmp(ss,"FORMAT/GQ",se-ss) || !strncasecmp(ss,"FMT/GQ",se-ss) ) flag |= CALL_FMT_GQ; + else if ( !strncasecmp(ss,"GP",se-ss) || !strncasecmp(ss,"FORMAT/GP",se-ss) || !strncasecmp(ss,"FMT/GP",se-ss) ) flag |= CALL_FMT_GP; + else if ( !strncasecmp(ss,"PV4",se-ss) || !strncasecmp(ss,"INFO/PV4",se-ss) ) flag |= CALL_FMT_PV4; + else + { + fprintf(stderr,"Could not parse \"%s\"\n", str); + exit(1); + } + if ( !*se ) break; + ss = se + 1; + } + return flag; +} + +static void set_ploidy(args_t *args, bcf1_t *rec) +{ + ploidy_query(args->ploidy,(char*)bcf_seqname(args->aux.hdr,rec),rec->pos,args->sex2ploidy,NULL,NULL); + + int i; + for (i=0; insex; i++) + if ( args->sex2ploidy[i]!=args->sex2ploidy_prev[i] ) break; + + if ( i==args->nsex ) return; // ploidy same as previously + + for (i=0; insamples; i++) + { + if ( args->sample2sex[i]<0 ) + args->aux.ploidy[i] = -1*args->sample2sex[i]; + else + args->aux.ploidy[i] = args->sex2ploidy[args->sample2sex[i]]; + } + int *tmp = args->sex2ploidy; args->sex2ploidy = args->sex2ploidy_prev; args->sex2ploidy_prev = tmp; +} + +ploidy_t *init_ploidy(char *alias) +{ + const ploidy_predef_t *pld = ploidy_predefs; + + int detailed = 0, len = strlen(alias); + if ( alias[len-1]=='?' ) { detailed = 1; alias[len-1] = 0; } + + while ( pld->alias && strcasecmp(alias,pld->alias) ) pld++; + + if ( !pld->alias ) + { + fprintf(stderr,"\nPRE-DEFINED PLOIDY FILES\n\n"); + fprintf(stderr," * Columns are: CHROM,FROM,TO,SEX,PLOIDY\n"); + fprintf(stderr," * Coordinates are 1-based inclusive.\n"); + fprintf(stderr," * A '*' means any value not otherwise defined.\n\n"); + pld = ploidy_predefs; + while ( pld->alias ) + { + fprintf(stderr,"%s\n .. %s\n\n", pld->alias,pld->about); + if ( detailed ) + fprintf(stderr,"%s\n", pld->ploidy); + pld++; + } + fprintf(stderr,"Run as --ploidy (e.g. --ploidy GRCh37).\n"); + fprintf(stderr,"To see the detailed ploidy definition, append a question mark (e.g. --ploidy GRCh37?).\n"); + fprintf(stderr,"\n"); + exit(-1); + } + else if ( detailed ) + { + fprintf(stderr,"%s", pld->ploidy); + exit(-1); + } + return ploidy_init_string(pld->ploidy,2); +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: SNP/indel variant calling from VCF/BCF. To be used in conjunction with bcftools mpileup.\n"); + fprintf(stderr, " This command replaces the former \"bcftools view\" caller. Some of the original\n"); + fprintf(stderr, " functionality has been temporarily lost in the process of transition to htslib,\n"); + fprintf(stderr, " but will be added back on popular demand. The original calling model can be\n"); + fprintf(stderr, " invoked with the -c option.\n"); + fprintf(stderr, "Usage: bcftools call [options] \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "File format options:\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type b|u|z|v Output type: 'b' compressed BCF; 'u' uncompressed BCF; 'z' compressed VCF; 'v' uncompressed VCF [v]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " --ploidy ASSEMBLY[?] Predefined ploidy, 'list' to print available settings, append '?' for details [2]\n"); + fprintf(stderr, " --ploidy-file FILE Space/tab-delimited list of CHROM,FROM,TO,SEX,PLOIDY\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --samples LIST List of samples to include [all samples]\n"); + fprintf(stderr, " -S, --samples-file FILE PED file or a file with an optional column with sex (see man page for details) [all samples]\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --threads INT Use multithreading with INT worker threads [0]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Input/output options:\n"); + fprintf(stderr, " -A, --keep-alts Keep all possible alternate alleles at variant sites\n"); + fprintf(stderr, " -a, --annotate LIST Optional tags to output (lowercase allowed); '?' to list available tags\n"); + fprintf(stderr, " -F, --prior-freqs AN,AC Use prior allele frequencies, determined from these pre-filled tags\n"); + fprintf(stderr, " -G, --group-samples FILE|- Group samples by population (file with \"sample\\tgroup\") or \"-\" for single-sample calling.\n"); + fprintf(stderr, " This requires FORMAT/QS or other Number=R,Type=Integer tag such as FORMAT/AD\n"); + fprintf(stderr, " --group-samples-tag TAG The tag to use with -G, by default FORMAT/QS and FORMAT/AD are checked automatically\n"); + fprintf(stderr, " -g, --gvcf INT,[...] Group non-variant sites into gVCF blocks by minimum per-sample DP\n"); + fprintf(stderr, " -i, --insert-missed Output also sites missed by mpileup but present in -T\n"); + fprintf(stderr, " -M, --keep-masked-ref Keep sites with masked reference allele (REF=N)\n"); + fprintf(stderr, " -V, --skip-variants TYPE Skip indels/snps\n"); + fprintf(stderr, " -v, --variants-only Output variant sites only\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Consensus/variant calling options:\n"); + fprintf(stderr, " -c, --consensus-caller The original calling method (conflicts with -m)\n"); + fprintf(stderr, " -C, --constrain STR One of: alleles, trio (see manual)\n"); + fprintf(stderr, " -m, --multiallelic-caller Alternative model for multiallelic and rare-variant calling (conflicts with -c)\n"); + fprintf(stderr, " -n, --novel-rate FLOAT,[...] Likelihood of novel mutation for constrained trio calling, see man page for details [1e-8,1e-9,1e-9]\n"); + fprintf(stderr, " -p, --pval-threshold FLOAT Variant if P(ref|D)aux.min_lrt); + // fprintf(stderr, " -U INT number of permutations for association testing (effective with -1) [0]\n"); + // fprintf(stderr, " -X FLOAT only perform permutations for P(chi^2)aux.min_perm_p); + fprintf(stderr, "\n"); + exit(-1); +} + +int main_vcfcall(int argc, char *argv[]) +{ + char *ploidy_fname = NULL, *ploidy = NULL; + args_t args; + memset(&args, 0, sizeof(args_t)); + args.argc = argc; args.argv = argv; + args.aux.prior_type = -1; + args.aux.indel_frac = -1; + args.aux.theta = 1.1e-3; + args.aux.pref = 0.5; + args.aux.min_perm_p = 0.01; + args.aux.min_lrt = 1; + args.flag = CF_ACGT_ONLY; + args.output_fname = "-"; + args.output_type = FT_VCF; + args.n_threads = 0; + args.record_cmd_line = 1; + args.aux.trio_Pm_SNPs = 1 - 1e-8; + args.aux.trio_Pm_ins = args.aux.trio_Pm_del = 1 - 1e-9; + args.regions_overlap = 1; + args.clevel = -1; + + int c; + static struct option loptions[] = + { + {"help",no_argument,NULL,'h'}, + {"format-fields",required_argument,NULL,'f'}, + {"annotate",required_argument,NULL,'a'}, + {"prior-freqs",required_argument,NULL,'F'}, + {"gvcf",required_argument,NULL,'g'}, + {"group-samples",required_argument,NULL,'G'}, + {"group-samples-tag",required_argument,NULL,3}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,4}, + {"samples",required_argument,NULL,'s'}, + {"samples-file",required_argument,NULL,'S'}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"threads",required_argument,NULL,9}, + {"keep-alts",no_argument,NULL,'A'}, + {"insert-missed",no_argument,NULL,'i'}, + {"skip-Ns",no_argument,NULL,'N'}, // now the new default + {"keep-masked-refs",no_argument,NULL,'M'}, + {"skip-variants",required_argument,NULL,'V'}, + {"variants-only",no_argument,NULL,'v'}, + {"consensus-caller",no_argument,NULL,'c'}, + {"constrain",required_argument,NULL,'C'}, + {"multiallelic-caller",no_argument,NULL,'m'}, + {"pval-threshold",required_argument,NULL,'p'}, + {"prior",required_argument,NULL,'P'}, + {"novel-rate",required_argument,NULL,'n'}, + {"ploidy",required_argument,NULL,1}, + {"ploidy-file",required_argument,NULL,2}, + {"chromosome-X",no_argument,NULL,'X'}, + {"chromosome-Y",no_argument,NULL,'Y'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + + char *tmp = NULL; + while ((c = getopt_long(argc, argv, "h?o:O:r:R:s:S:t:T:ANMV:vcmp:C:n:P:f:a:ig:XYF:G:", loptions, NULL)) >= 0) + { + switch (c) + { + case 2 : ploidy_fname = optarg; break; + case 1 : ploidy = optarg; break; + case 'X': ploidy = "X"; fprintf(stderr,"Warning: -X will be deprecated, please use --ploidy instead.\n"); break; + case 'Y': ploidy = "Y"; fprintf(stderr,"Warning: -Y will be deprecated, please use --ploidy instead.\n"); break; + case 'G': args.aux.sample_groups = optarg; break; + case 3 : args.aux.sample_groups_tag = optarg; break; + case 'f': fprintf(stderr,"Warning: -f, --format-fields will be deprecated, please use -a, --annotate instead.\n"); + case 'a': + if (optarg[0]=='?') { list_annotations(stderr); return 1; } + args.aux.output_tags |= parse_output_tags(optarg); + break; + case 'M': args.flag &= ~CF_ACGT_ONLY; break; // keep sites where REF is N + case 'N': args.flag |= CF_ACGT_ONLY; break; // omit sites where first base in REF is N (the new default) + case 'A': args.aux.flag |= CALL_KEEPALT; break; + case 'c': args.flag |= CF_CCALL; break; // the original EM based calling method + case 'i': args.flag |= CF_INS_MISSED; break; + case 'v': args.aux.flag |= CALL_VARONLY; break; + case 'F': + args.aux.prior_AN = optarg; + args.aux.prior_AC = strchr(optarg,','); + if ( !args.aux.prior_AC ) error("Expected two tags with -F (e.g. AN,AC), got \"%s\"\n",optarg); + *args.aux.prior_AC = 0; + args.aux.prior_AC++; + break; + case 'g': + args.gvcf = gvcf_init(optarg); + if ( !args.gvcf ) error("Could not parse: --gvcf %s\n", optarg); + break; + case 'o': args.output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args.output_type = FT_BCF_GZ; break; + case 'u': args.output_type = FT_BCF; break; + case 'z': args.output_type = FT_VCF_GZ; break; + case 'v': args.output_type = FT_VCF; break; + default: + { + args.clevel = strtol(optarg,&tmp,10); + if ( *tmp || args.clevel<0 || args.clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args.clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args.clevel<0 || args.clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'C': + if ( !strcasecmp(optarg,"alleles") ) args.aux.flag |= CALL_CONSTR_ALLELES; + else if ( !strcasecmp(optarg,"trio") ) args.aux.flag |= CALL_CONSTR_TRIO; + else error("Unknown argument to -C: \"%s\"\n", optarg); + break; + case 'V': + if ( !strcasecmp(optarg,"snps") ) args.flag |= CF_INDEL_ONLY; + else if ( !strcasecmp(optarg,"indels") ) args.flag |= CF_NO_INDEL; + else error("Unknown skip category \"%s\" (-S argument must be \"snps\" or \"indels\")\n", optarg); + break; + case 'm': args.flag |= CF_MCALL; break; // multiallelic calling method + case 'p': + args.aux.pref = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: --pval-threshold %s\n", optarg); + break; + case 'P': args.aux.theta = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse, expected float argument: -P %s\n", optarg); + break; + case 'n': parse_novel_rate(&args,optarg); break; + case 'r': args.regions = optarg; break; + case 'R': args.regions = optarg; args.regions_is_file = 1; break; + case 't': args.targets = optarg; break; + case 'T': args.targets = optarg; args.targets_is_file = 1; break; + case 's': args.samples_fname = optarg; break; + case 'S': args.samples_fname = optarg; args.samples_is_file = 1; break; + case 9 : args.n_threads = strtol(optarg, 0, 0); break; + case 8 : args.record_cmd_line = 0; break; + case 4 : + args.regions_overlap = parse_overlap_option(optarg); + if ( args.regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + default: usage(&args); + } + } + // Sanity check options and initialize + if ( ploidy_fname ) args.ploidy = ploidy_init(ploidy_fname, 2); + else if ( ploidy ) args.ploidy = init_ploidy(ploidy); + + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args.bcf_fname = "-"; // reading from stdin + else usage(&args); + } + else args.bcf_fname = argv[optind++]; + + if ( !ploidy_fname && !ploidy ) + { + if ( !args.samples_is_file ) fprintf(stderr,"Note: none of --samples-file, --ploidy or --ploidy-file given, assuming all sites are diploid\n"); + args.ploidy = ploidy_init_string("* * * 0 0\n* * * 1 1\n* * * 2 2\n",2); + } + + if ( !args.ploidy ) error("Could not initialize ploidy\n"); + if ( (args.flag & CF_CCALL ? 1 : 0) + (args.flag & CF_MCALL ? 1 : 0) + (args.flag & CF_QCALL ? 1 : 0) > 1 ) error("Only one of -c or -m options can be given\n"); + if ( !(args.flag & CF_CCALL) && !(args.flag & CF_MCALL) && !(args.flag & CF_QCALL) ) error("Expected -c or -m option\n"); + if ( (args.flag & CF_CCALL ? 1: 0) && args.gvcf ) error("gvcf -g option not functional with -c calling mode yet\n"); + if ( args.aux.n_perm && args.aux.ngrp1_samples<=0 ) error("Expected -1 with -U\n"); // not sure about this, please fix + if ( args.aux.flag & CALL_CONSTR_ALLELES ) + { + if ( !args.targets ) error("Expected -t or -T with \"-C alleles\"\n"); + if ( !(args.flag & CF_MCALL) ) error("The \"-C alleles\" mode requires -m\n"); + } + if ( args.flag & CF_INS_MISSED && !(args.aux.flag&CALL_CONSTR_ALLELES) ) error("The -i option requires -C alleles\n"); + if ( args.aux.flag&CALL_VARONLY && args.gvcf ) error("The two options cannot be combined: --variants-only and --gvcf\n"); + if ( args.aux.sample_groups && !(args.flag & CF_MCALL) ) error("The -G feature is supported only with the -m calling mode\n"); + init_data(&args); + + bcf1_t *bcf_rec; + while ( (bcf_rec = next_line(&args)) ) + { + // Skip duplicate positions with all matching `-C alleles -T` used up + if ( args.aux.flag&CALL_CONSTR_ALLELES && !args.aux.tgt_als ) continue; + + // Skip unwanted sites + int i, is_indel = bcf_is_snp(bcf_rec) ? 0 : 1; + if ( (args.flag & CF_INDEL_ONLY) && !is_indel ) continue; + if ( (args.flag & CF_NO_INDEL) && is_indel ) continue; + if ( (args.flag & CF_ACGT_ONLY) && (bcf_rec->d.allele[0][0]=='N' || bcf_rec->d.allele[0][0]=='n') ) continue; // REF[0] is 'N' + + // Which allele is symbolic? All SNPs should have it, but not indels + args.aux.unseen = 0; + for (i=1; in_allele; i++) + { + if ( bcf_rec->d.allele[i][0]=='X' ) { args.aux.unseen = i; break; } // old X + if ( bcf_rec->d.allele[i][0]=='<' ) + { + if ( bcf_rec->d.allele[i][1]=='X' && bcf_rec->d.allele[i][2]=='>' ) { args.aux.unseen = i; break; } // old + if ( bcf_rec->d.allele[i][1]=='*' && bcf_rec->d.allele[i][2]=='>' ) { args.aux.unseen = i; break; } // new <*> + } + } + int is_ref = (bcf_rec->n_allele==1 || (bcf_rec->n_allele==2 && args.aux.unseen>0)) ? 1 : 0; + + if ( is_ref && args.aux.flag&CALL_VARONLY ) + continue; + + bcf_unpack(bcf_rec, BCF_UN_ALL); + if ( args.nsex ) set_ploidy(&args, bcf_rec); + + // Various output modes: QCall output (todo) + if ( args.flag & CF_QCALL ) + { + qcall(&args.aux, bcf_rec); + continue; + } + + if ( args.flag & CF_INS_MISSED ) + { + tgt_flush(&args,bcf_rec); + if ( !args.tgt_itr_prev ) args.tgt_itr_prev = regitr_init(args.tgt_idx); + regitr_copy(args.tgt_itr_prev, args.tgt_itr); + } + + // Calling modes which output VCFs + int ret; + if ( args.flag & CF_MCALL ) + ret = mcall(&args.aux, bcf_rec); + else + ret = ccall(&args.aux, bcf_rec); + if ( ret==-1 ) error("Something is wrong\n"); + else if ( ret==-2 ) continue; // skip the site + + // Normal output + if ( (args.aux.flag & CALL_VARONLY) && ret==0 && !args.gvcf ) continue; // not a variant + if ( args.gvcf ) + bcf_rec = gvcf_write(args.gvcf, args.out_fh, args.aux.hdr, bcf_rec, ret==1?1:0); + if ( bcf_rec && bcf_write1(args.out_fh, args.aux.hdr, bcf_rec)!=0 ) error("[%s] Error: failed to write to %s\n", __func__,args.output_fname); + } + if ( args.gvcf ) gvcf_write(args.gvcf, args.out_fh, args.aux.hdr, NULL, 0); + if ( args.flag & CF_INS_MISSED ) tgt_flush(&args,NULL); + destroy_data(&args); + return 0; +} + diff --git a/bcftools/vcfcall.c.pysam.c b/bcftools/vcfcall.c.pysam.c new file mode 100644 index 0000000..c715c53 --- /dev/null +++ b/bcftools/vcfcall.c.pysam.c @@ -0,0 +1,1181 @@ +#include "bcftools.pysam.h" + +/* vcfcall.c -- SNP/indel variant calling from VCF/BCF. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "call.h" +#include "prob1.h" +#include "ploidy.h" +#include "gvcf.h" +#include "regidx.h" +#include "vcfbuf.h" + +void error(const char *format, ...); + +#define CF_NO_GENO 1 +#define CF_INS_MISSED (1<<1) +#define CF_CCALL (1<<2) +// (1<<3) +// (1<<4) +// (1<<5) +#define CF_ACGT_ONLY (1<<6) +#define CF_QCALL (1<<7) +#define CF_ADJLD (1<<8) +#define CF_NO_INDEL (1<<9) +#define CF_ANNO_MAX (1<<10) +#define CF_MCALL (1<<11) +#define CF_PAIRCALL (1<<12) +#define CF_QCNT (1<<13) +#define CF_INDEL_ONLY (1<<14) + +typedef struct +{ + tgt_als_t *als; + int nmatch_als, ibuf; +} +rec_tgt_t; + +typedef struct +{ + int flag; // combination of CF_* flags above + int output_type, n_threads, record_cmd_line, clevel; + htsFile *bcf_in, *out_fh; + char *bcf_fname, *output_fname; + char **samples; // for subsampling and ploidy + int nsamples, *samples_map; // mapping from output sample names to original VCF + char *regions, *targets; // regions to process + int regions_is_file, targets_is_file, regions_overlap; + regidx_t *tgt_idx; + regitr_t *tgt_itr, *tgt_itr_prev, *tgt_itr_tmp; + vcfbuf_t *vcfbuf; + + char *samples_fname; + int samples_is_file; + int *sample2sex; // mapping for ploidy. If negative, interpreted as -1*ploidy + int *sex2ploidy, *sex2ploidy_prev, nsex; + ploidy_t *ploidy; + gvcf_t *gvcf; + + bcf1_t *missed_line; + call_t aux; // parameters and temporary data + kstring_t str; + + int argc; + char **argv; + + // int flag, prior_type, n1, n_sub, *sublist, n_perm; + // uint32_t *trio_aux; + // char *prior_file, **subsam; + // uint8_t *ploidy; + // double theta, pref, indel_frac, min_smpl_frac, min_lrt; + // Permutation tests + // int n_perm, *seeds; + // double min_perm_p; + // void *bed; +} +args_t; + +static char **add_sample(void *name2idx, char **lines, int *nlines, int *mlines, char *name, char sex, int *ith) +{ + int ret = khash_str2int_get(name2idx, name, ith); + if ( ret==0 ) return lines; + + hts_expand(char*,(*nlines+1),*mlines,lines); + int len = strlen(name); + lines[*nlines] = (char*) malloc(len+3); + memcpy(lines[*nlines],name,len); + lines[*nlines][len] = ' '; + lines[*nlines][len+1] = sex; + lines[*nlines][len+2] = 0; + *ith = *nlines; + (*nlines)++; + khash_str2int_set(name2idx, strdup(name), *ith); + return lines; +} + +typedef struct +{ + const char *alias, *about, *ploidy; +} +ploidy_predef_t; + +static ploidy_predef_t ploidy_predefs[] = +{ + { .alias = "GRCh37", + .about = "Human Genome reference assembly GRCh37 / hg19", + .ploidy = + "X 1 60000 M 1\n" + "X 2699521 154931043 M 1\n" + "Y 1 59373566 M 1\n" + "Y 1 59373566 F 0\n" + "MT 1 16569 M 1\n" + "MT 1 16569 F 1\n" + "chrX 1 60000 M 1\n" + "chrX 2699521 154931043 M 1\n" + "chrY 1 59373566 M 1\n" + "chrY 1 59373566 F 0\n" + "chrM 1 16569 M 1\n" + "chrM 1 16569 F 1\n" + "* * * M 2\n" + "* * * F 2\n" + }, + { .alias = "GRCh38", + .about = "Human Genome reference assembly GRCh38 / hg38", + .ploidy = + "X 1 9999 M 1\n" + "X 2781480 155701381 M 1\n" + "Y 1 57227415 M 1\n" + "Y 1 57227415 F 0\n" + "MT 1 16569 M 1\n" + "MT 1 16569 F 1\n" + "chrX 1 9999 M 1\n" + "chrX 2781480 155701381 M 1\n" + "chrY 1 57227415 M 1\n" + "chrY 1 57227415 F 0\n" + "chrM 1 16569 M 1\n" + "chrM 1 16569 F 1\n" + "* * * M 2\n" + "* * * F 2\n" + }, + { .alias = "X", + .about = "Treat male samples as haploid and female as diploid regardless of the chromosome name", + .ploidy = + "* * * M 1\n" + "* * * F 2\n" + }, + { .alias = "Y", + .about = "Treat male samples as haploid and female as no-copy, regardless of the chromosome name", + .ploidy = + "* * * M 1\n" + "* * * F 0\n" + }, + { .alias = "1", + .about = "Treat all samples as haploid", + .ploidy = + "* * * * 1\n" + }, + { .alias = "2", + .about = "Treat all samples as diploid", + .ploidy = + "* * * * 2\n" + }, + { + .alias = NULL, + .about = NULL, + .ploidy = NULL, + } +}; + +// only 5 columns are required and the first is ignored: +// ignored,sample,father(or 0),mother(or 0),sex(1=M,2=F) +static char **parse_ped_samples(call_t *call, char **vals, int nvals, int *nsmpl) +{ + int i, j, mlines = 0, nlines = 0; + kstring_t str = {0,0,0}, fam_str = {0,0,0}; + void *name2idx = khash_str2int_init(); + char **lines = NULL; + for (i=0; infams++; + hts_expand(family_t, call->nfams, call->mfams, call->fams); + family_t *fam = &call->fams[call->nfams-1]; + fam_str.l = 0; + ksprintf(&fam_str,"father=%s, mother=%s, child=%s", col_ends[1]+1,col_ends[2]+1,col_ends[0]+1); + fam->name = strdup(fam_str.s); + + if ( !khash_str2int_has_key(name2idx, col_ends[1]+1) ) + lines = add_sample(name2idx, lines, &nlines, &mlines, col_ends[1]+1, 'M', &fam->sample[FATHER]); + if ( !khash_str2int_has_key(name2idx, col_ends[2]+1) ) + lines = add_sample(name2idx, lines, &nlines, &mlines, col_ends[2]+1, 'F', &fam->sample[MOTHER]); + + khash_str2int_get(name2idx, col_ends[0]+1, &fam->sample[CHILD]); + khash_str2int_get(name2idx, col_ends[1]+1, &fam->sample[FATHER]); + khash_str2int_get(name2idx, col_ends[2]+1, &fam->sample[MOTHER]); + } + } + free(str.s); + free(fam_str.s); + khash_str2int_destroy_free(name2idx); + + if ( i!=nvals ) return NULL; // not a ped file + + *nsmpl = nlines; + return lines; +} + + +/* + * Reads sample names and their ploidy (optional) from a file. + * Alternatively, if no such file exists, the file name is interpreted + * as a comma-separated list of samples. When ploidy is not present, + * the default ploidy 2 is assumed. + */ +static void set_samples(args_t *args, const char *fn, int is_file) +{ + int i, nlines; + char **lines = hts_readlist(fn, is_file, &nlines); + if ( !lines ) error("Could not read the file: %s\n", fn); + + int nsmpls; + char **smpls = parse_ped_samples(&args->aux, lines, nlines, &nsmpls); + if ( smpls ) + { + for (i=0; isamples_map = (int*) malloc(sizeof(int)*bcf_hdr_nsamples(args->aux.hdr)); // for subsetting + args->sample2sex = (int*) malloc(sizeof(int)*bcf_hdr_nsamples(args->aux.hdr)); + int dflt_sex_id = ploidy_nsex(args->ploidy) - 1; + for (i=0; iaux.hdr); i++) args->sample2sex[i] = dflt_sex_id; + + int *old2new = (int*) malloc(sizeof(int)*bcf_hdr_nsamples(args->aux.hdr)); + for (i=0; iaux.hdr); i++) old2new[i] = -1; + + int nsmpl = 0, map_needed = 0; + for (i=0; iaux.hdr, BCF_DT_SAMPLE, ss); + if ( ismpl < 0 ) { fprintf(bcftools_stderr,"Warning: No such sample in the VCF: %s\n",ss); continue; } + if ( old2new[ismpl] != -1 ) { fprintf(bcftools_stderr,"Warning: The sample is listed multiple times: %s\n",ss); continue; } + + ss = se+(x != '\0'); + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) ss = "2"; // default ploidy + se = ss; + while ( *se && !isspace(*se) ) se++; + if ( se==ss ) { *xptr = x; error("Could not parse: \"%s\"\n", lines[i]); } + + if ( ss[1]==0 && (ss[0]=='0' || ss[0]=='1' || ss[0]=='2') ) + args->sample2sex[nsmpl] = -1*(ss[0]-'0'); + else + args->sample2sex[nsmpl] = ploidy_add_sex(args->ploidy, ss); + + if ( ismpl!=nsmpl ) map_needed = 1; + args->samples_map[nsmpl] = ismpl; + old2new[ismpl] = nsmpl; + nsmpl++; + } + + for (i=0; iaux.nfams; i++) + { + int j, nmiss = 0; + family_t *fam = &args->aux.fams[i]; + for (j=0; j<3; j++) + { + fam->sample[i] = old2new[fam->sample[i]]; + if ( fam->sample[i]<0 ) nmiss++; + } + assert( nmiss==0 || nmiss==3 ); + } + free(old2new); + + if ( !map_needed ) { free(args->samples_map); args->samples_map = NULL; } + + args->nsamples = nsmpl; + args->samples = lines; +} + +static void init_missed_line(args_t *args) +{ + int i; + for (i=0; iaux.hdr); i++) + { + args->aux.gts[i*2] = bcf_gt_missing; + args->aux.gts[i*2+1] = bcf_int32_vector_end; + } + args->missed_line = bcf_init1(); + bcf_update_genotypes(args->aux.hdr, args->missed_line, args->aux.gts, 2*bcf_hdr_nsamples(args->aux.hdr)); + bcf_float_set_missing(args->missed_line->qual); +} + +static int tgt_parse(const char *line, char **chr_beg, char **chr_end, uint32_t *beg, uint32_t *end, void *payload, void *usr) +{ + char *ss = (char*) line; + while ( *ss && isspace(*ss) ) ss++; + if ( !*ss ) { fprintf(bcftools_stderr,"Could not parse the line: %s\n", line); return -2; } + if ( *ss=='#' ) return -1; // skip comments + + char *se = ss; + while ( *se && !isspace(*se) ) se++; + + *chr_beg = ss; + *chr_end = se-1; + + if ( !*se ) { fprintf(bcftools_stderr,"Could not parse the line: %s\n", line); return -2; } + + ss = se+1; + *beg = strtod(ss, &se); + if ( ss==se ) { fprintf(bcftools_stderr,"Could not parse tab line: %s\n", line); return -2; } + if ( *beg==0 ) { fprintf(bcftools_stderr,"Could not parse tab line, expected 1-based coordinate: %s\n", line); return -2; } + (*beg)--; + *end = *beg; + + if ( !usr ) return 0; // allele information not required + + ss = se+1; + tgt_als_t *als = (tgt_als_t*)payload; + als->used = 0; + als->n = 0; + als->allele = NULL; + while ( *ss ) + { + se = ss; + while ( *se && *se!=',' ) se++; + als->n++; + als->allele = (char**)realloc(als->allele,als->n*sizeof(*als->allele)); + als->allele[als->n-1] = (char*)malloc(se-ss+1); + memcpy(als->allele[als->n-1],ss,se-ss); + als->allele[als->n-1][se-ss] = 0; + ss = se+1; + if ( !*se ) break; + } + return 0; +} +static void tgt_free(void *payload) +{ + tgt_als_t *als = (tgt_als_t*)payload; + int i; + for (i=0; in; i++) free(als->allele[i]); + free(als->allele); +} +static void tgt_flush_region(args_t *args, char *chr, uint32_t beg, uint32_t end) +{ + if ( !regidx_overlap(args->tgt_idx, chr,beg,end,args->tgt_itr_tmp) ) return; + while ( regitr_overlap(args->tgt_itr_tmp) ) + { + if ( args->tgt_itr_tmp->beg < beg ) continue; + + tgt_als_t *tgt_als = ®itr_payload(args->tgt_itr_tmp,tgt_als_t); + if ( tgt_als->used ) continue; + + args->missed_line->rid = bcf_hdr_name2id(args->aux.hdr,chr); + args->missed_line->pos = args->tgt_itr_tmp->beg; + bcf_unpack(args->missed_line,BCF_UN_ALL); + bcf_update_alleles(args->aux.hdr, args->missed_line, (const char**)tgt_als->allele, tgt_als->n); + tgt_als->used = 1; + if ( bcf_write1(args->out_fh, args->aux.hdr, args->missed_line)!=0 ) error("[%s] Error: failed to write to %s\n", __func__,args->output_fname); + } +} +static void tgt_flush(args_t *args, bcf1_t *rec) +{ + if ( rec ) + { + char *chr = (char*)bcf_seqname(args->aux.hdr,rec); + + if ( !args->tgt_itr_prev ) // first record + tgt_flush_region(args,chr,0,rec->pos-1); + + else if ( strcmp(chr,args->tgt_itr_prev->seq) ) // first record on a new chromosome + { + tgt_flush_region(args,args->tgt_itr_prev->seq,args->tgt_itr_prev->beg+1,REGIDX_MAX); + tgt_flush_region(args,chr,0,rec->pos-1); + } + else // another record on the same chromosome + tgt_flush_region(args,args->tgt_itr_prev->seq,args->tgt_itr_prev->beg,rec->pos-1); + } + else + { + // flush everything + if ( args->tgt_itr_prev ) + tgt_flush_region(args,args->tgt_itr_prev->seq,args->tgt_itr_prev->beg,REGIDX_MAX); + + int i, nchr = 0; + char **chr = regidx_seq_names(args->tgt_idx, &nchr); + for (i=0; i" is not present at indels sites and there are no other symbolic alleles than <*> + if ( als[1][0]=='<' ) return 0; + + int i; + for (i=0; ivcfbuf ) + { + while ( bcf_sr_next_line(args->aux.srs) ) + { + rec = args->aux.srs->readers[0].buffer[0]; + if ( args->aux.srs->errnum || rec->errcode ) error("Error: could not parse the input VCF\n"); + if ( args->tgt_idx ) + { + if ( !regidx_overlap(args->tgt_idx, bcf_seqname(args->aux.hdr,rec),rec->pos,rec->pos,args->tgt_itr) ) continue; + + // For backward compatibility: require the exact position, not an interval overlap + int pos_match = 0; + while ( regitr_overlap(args->tgt_itr) ) + { + if ( args->tgt_itr->beg != rec->pos ) continue; + pos_match = 1; + break; + } + if ( !pos_match ) continue; + } + if ( args->samples_map ) bcf_subset(args->aux.hdr, rec, args->nsamples, args->samples_map); + bcf_unpack(rec, BCF_UN_STR); + return rec; + } + return NULL; + } + + // If we are here,-C alleles was given and vcfbuf and tgt_idx are set + + // Fill the buffer with duplicate lines + int vcfbuf_full = 1; + int nbuf = vcfbuf_nsites(args->vcfbuf); + bcf1_t *rec0 = NULL, *recN = NULL; + if ( nbuf==0 ) vcfbuf_full = 0; + else if ( nbuf==1 ) + { + vcfbuf_full = 0; + rec0 = vcfbuf_peek(args->vcfbuf, 0); + } + else + { + rec0 = vcfbuf_peek(args->vcfbuf, 0); + recN = vcfbuf_peek(args->vcfbuf, nbuf-1); + if ( rec0->rid == recN->rid && rec0->pos == recN->pos ) vcfbuf_full = 0; + } + if ( !vcfbuf_full ) + { + while ( bcf_sr_next_line(args->aux.srs) ) + { + rec = args->aux.srs->readers[0].buffer[0]; + if ( args->aux.srs->errnum || rec->errcode ) error("Error: could not parse the input VCF\n"); + if ( !regidx_overlap(args->tgt_idx, bcf_seqname(args->aux.hdr,rec),rec->pos,rec->pos,args->tgt_itr) ) continue; + // as above: require the exact position, not an interval overlap + int exact_match = 0; + while ( regitr_overlap(args->tgt_itr) ) + { + if ( args->tgt_itr->beg != rec->pos ) continue; + exact_match = 1; + break; + } + if ( !exact_match ) continue; + + if ( args->samples_map ) bcf_subset(args->aux.hdr, rec, args->nsamples, args->samples_map); + bcf_unpack(rec, BCF_UN_STR); + if ( !rec0 ) rec0 = rec; + recN = rec; + args->aux.srs->readers[0].buffer[0] = vcfbuf_push(args->vcfbuf, rec); + if ( rec0->rid!=recN->rid || rec0->pos!=recN->pos ) break; + } + } + + nbuf = vcfbuf_nsites(args->vcfbuf); + int n, i,j; + for (n=nbuf; n>1; n--) + { + recN = vcfbuf_peek(args->vcfbuf, n-1); + if ( rec0->rid==recN->rid && rec0->pos==recN->pos ) break; + } + if ( n==0 ) + { + assert( !nbuf ); + return NULL; + } + + // Find the VCF and tab record with the best matching combination of alleles, prioritize + // records of the same type (snp vs indel) + rec_tgt_t rec_tgt; + memset(&rec_tgt,0,sizeof(rec_tgt)); + regidx_overlap(args->tgt_idx, bcf_seqname(args->aux.hdr,rec0),rec0->pos,rec0->pos,args->tgt_itr); + regitr_t *tmp_itr = regitr_init(args->tgt_idx); + regitr_copy(tmp_itr, args->tgt_itr); + for (i=0; ivcfbuf, i); + int rec_indel = is_indel(rec->n_allele, rec->d.allele) ? 1 : -1; + while ( regitr_overlap(tmp_itr) ) + { + if ( tmp_itr->beg != rec->pos ) continue; + tgt_als_t *als = ®itr_payload(tmp_itr,tgt_als_t); + if ( als->used ) continue; + int nmatch_als = 0; + vcmp_t *vcmp = vcmp_init(); + int ret = vcmp_set_ref(vcmp, rec->d.allele[0], als->allele[0]); + if ( ret==0 ) + { + nmatch_als++; + if ( rec->n_allele > 1 && als->n > 1 ) + { + for (j=1; jn; j++) + { + if ( vcmp_find_allele(vcmp, rec->d.allele+1, rec->n_allele-1, als->allele[j])>=0 ) nmatch_als++; + } + } + } + int als_indel = is_indel(als->n, als->allele) ? 1 : -1; + nmatch_als *= rec_indel*als_indel; + if ( nmatch_als > rec_tgt.nmatch_als || !rec_tgt.als ) + { + rec_tgt.nmatch_als = nmatch_als; + rec_tgt.als = als; + rec_tgt.ibuf = i; + } + vcmp_destroy(vcmp); + } + } + regitr_destroy(tmp_itr); + + args->aux.tgt_als = rec_tgt.als; + if ( rec_tgt.als ) rec_tgt.als->used = 1; + + rec = vcfbuf_remove(args->vcfbuf, rec_tgt.ibuf); + return rec; +} + +static void init_data(args_t *args) +{ + args->aux.srs = bcf_sr_init(); + + // Open files for input and output, initialize structures + if ( args->targets ) + { + args->tgt_idx = regidx_init(args->targets, tgt_parse, args->aux.flag&CALL_CONSTR_ALLELES ? tgt_free : (regidx_free_f) NULL, sizeof(tgt_als_t), args->aux.flag&CALL_CONSTR_ALLELES ? args : NULL); + args->tgt_itr = regitr_init(args->tgt_idx); + args->tgt_itr_tmp = regitr_init(args->tgt_idx); + } + + if ( args->regions ) + { + bcf_sr_set_opt(args->aux.srs,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->aux.srs, args->regions, args->regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions); + } + + if ( !bcf_sr_add_reader(args->aux.srs, args->bcf_fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",args->bcf_fname)?"standard input":args->bcf_fname,bcf_sr_strerror(args->aux.srs->errnum)); + args->aux.hdr = bcf_sr_get_header(args->aux.srs,0); + + int i; + if ( args->samples_fname ) + { + set_samples(args, args->samples_fname, args->samples_is_file); + if ( args->aux.flag&CALL_CONSTR_TRIO ) + { + if ( 3*args->aux.nfams!=args->nsamples ) error("Expected only trios in %s, sorry!\n", args->samples_fname); + fprintf(bcftools_stderr,"Detected %d samples in %d trio families\n", args->nsamples,args->aux.nfams); + } + } + if ( args->ploidy ) + { + args->nsex = ploidy_nsex(args->ploidy); + args->sex2ploidy = (int*) calloc(args->nsex,sizeof(int)); + args->sex2ploidy_prev = (int*) calloc(args->nsex,sizeof(int)); + if ( !args->nsamples ) + { + args->nsamples = bcf_hdr_nsamples(args->aux.hdr); + args->sample2sex = (int*) malloc(sizeof(int)*args->nsamples); + for (i=0; insamples; i++) args->sample2sex[i] = args->nsex - 1; + } + } + if ( args->nsamples ) + { + args->aux.ploidy = (uint8_t*) malloc(args->nsamples); + for (i=0; insamples; i++) args->aux.ploidy[i] = ploidy_max(args->ploidy); + for (i=0; insex; i++) args->sex2ploidy_prev[i] = ploidy_max(args->ploidy); + for (i=0; insamples; i++) + if ( args->sample2sex[i] >= args->nsex ) args->sample2sex[i] = args->nsex - 1; + } + + if ( args->gvcf ) + { + int id = bcf_hdr_id2int(args->aux.hdr,BCF_DT_ID,"DP"); + if ( id<0 || !bcf_hdr_idinfo_exists(args->aux.hdr,BCF_HL_FMT,id) ) error("--gvcf output mode requires FORMAT/DP tag, which is not present in the input header\n"); + gvcf_update_header(args->gvcf, args->aux.hdr); + } + + if ( args->samples_map ) + { + args->aux.hdr = bcf_hdr_subset(bcf_sr_get_header(args->aux.srs,0), args->nsamples, args->samples, args->samples_map); + if ( !args->aux.hdr ) error("Error occurred while subsetting samples\n"); + for (i=0; insamples; i++) + if ( args->samples_map[i]<0 ) error("No such sample: %s\n", args->samples[i]); + if ( !bcf_hdr_nsamples(args->aux.hdr) ) error("No matching sample found\n"); + } + else + { + args->aux.hdr = bcf_hdr_dup(bcf_sr_get_header(args->aux.srs,0)); + if ( args->samples ) + { + for (i=0; insamples; i++) + if ( bcf_hdr_id2int(args->aux.hdr,BCF_DT_SAMPLE,args->samples[i])<0 ) + error("No such sample: %s\n", args->samples[i]); + } + } + + if ( args->aux.flag & CALL_CONSTR_ALLELES ) + args->vcfbuf = vcfbuf_init(args->aux.hdr, 0); + + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Error: cannot write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(args->out_fh, args->n_threads); + + if ( args->flag & CF_QCALL ) + return; + + if ( args->flag & CF_MCALL ) + mcall_init(&args->aux); + + if ( args->flag & CF_CCALL ) + ccall_init(&args->aux); + + bcf_hdr_remove(args->aux.hdr, BCF_HL_INFO, "QS"); + bcf_hdr_remove(args->aux.hdr, BCF_HL_INFO, "I16"); + + if (args->record_cmd_line) bcf_hdr_append_version(args->aux.hdr, args->argc, args->argv, "bcftools_call"); + if ( bcf_hdr_write(args->out_fh, args->aux.hdr)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname); + + if ( args->flag&CF_INS_MISSED ) init_missed_line(args); +} + +static void destroy_data(args_t *args) +{ + if ( args->vcfbuf ) vcfbuf_destroy(args->vcfbuf); + if ( args->tgt_idx ) + { + regidx_destroy(args->tgt_idx); + regitr_destroy(args->tgt_itr); + regitr_destroy(args->tgt_itr_tmp); + if ( args->tgt_itr_prev ) regitr_destroy(args->tgt_itr_prev); + } + if ( args->flag & CF_CCALL ) ccall_destroy(&args->aux); + else if ( args->flag & CF_MCALL ) mcall_destroy(&args->aux); + else if ( args->flag & CF_QCALL ) qcall_destroy(&args->aux); + int i; + if ( args->samples ) + { + for (i=0; insamples; i++) free(args->samples[i]); + } + if ( args->aux.fams ) + { + for (i=0; iaux.nfams; i++) free(args->aux.fams[i].name); + free(args->aux.fams); + } + if ( args->missed_line ) bcf_destroy(args->missed_line); + ploidy_destroy(args->ploidy); + free(args->sex2ploidy); + free(args->sex2ploidy_prev); + free(args->samples); + free(args->samples_map); + free(args->sample2sex); + free(args->aux.ploidy); + free(args->str.s); + if ( args->gvcf ) gvcf_destroy(args->gvcf); + bcf_hdr_destroy(args->aux.hdr); + if ( hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + bcf_sr_destroy(args->aux.srs); +} + +void parse_novel_rate(args_t *args, const char *str) +{ + if ( sscanf(str,"%le,%le,%le",&args->aux.trio_Pm_SNPs,&args->aux.trio_Pm_del,&args->aux.trio_Pm_ins)==3 ) // explicit for all + { + args->aux.trio_Pm_SNPs = 1 - args->aux.trio_Pm_SNPs; + args->aux.trio_Pm_del = 1 - args->aux.trio_Pm_del; + args->aux.trio_Pm_ins = 1 - args->aux.trio_Pm_ins; + } + else if ( sscanf(str,"%le,%le",&args->aux.trio_Pm_SNPs,&args->aux.trio_Pm_del)==2 ) // dynamic for indels + { + args->aux.trio_Pm_SNPs = 1 - args->aux.trio_Pm_SNPs; + args->aux.trio_Pm_ins = -1; // negative value for dynamic calculation + } + else if ( sscanf(str,"%le",&args->aux.trio_Pm_SNPs)==1 ) // same for all + { + args->aux.trio_Pm_SNPs = 1 - args->aux.trio_Pm_SNPs; + args->aux.trio_Pm_del = -1; + args->aux.trio_Pm_ins = -1; + } + else error("Could not parse --novel-rate %s\n", str); +} + +static void list_annotations(FILE *fp) +{ + fprintf(fp, + "\n" + "Optional INFO annotations available with -m (\"INFO/\" prefix is optional):\n" + " INFO/PV4 .. P-values for strand bias, baseQ bias, mapQ bias and tail distance bias (Number=4,Type=Float)\n" + "\n" + "Optional FORMAT annotations available with -m (\"FORMAT/\" prefix is optional):\n" + " FORMAT/GQ .. Phred-scaled genotype quality (Number=1,Type=Integer)\n" + " FORMAT/GP .. Phred-scaled genotype posterior probabilities (Number=G,Type=Float)\n" + "\n"); +} + +static int parse_output_tags(const char *str) +{ + int flag = 0; + const char *ss = str; + while ( *ss ) + { + const char *se = ss; + while ( *se && *se!=',' ) se++; + if ( !strncasecmp(ss,"GQ",se-ss) || !strncasecmp(ss,"FORMAT/GQ",se-ss) || !strncasecmp(ss,"FMT/GQ",se-ss) ) flag |= CALL_FMT_GQ; + else if ( !strncasecmp(ss,"GP",se-ss) || !strncasecmp(ss,"FORMAT/GP",se-ss) || !strncasecmp(ss,"FMT/GP",se-ss) ) flag |= CALL_FMT_GP; + else if ( !strncasecmp(ss,"PV4",se-ss) || !strncasecmp(ss,"INFO/PV4",se-ss) ) flag |= CALL_FMT_PV4; + else + { + fprintf(bcftools_stderr,"Could not parse \"%s\"\n", str); + bcftools_exit(1); + } + if ( !*se ) break; + ss = se + 1; + } + return flag; +} + +static void set_ploidy(args_t *args, bcf1_t *rec) +{ + ploidy_query(args->ploidy,(char*)bcf_seqname(args->aux.hdr,rec),rec->pos,args->sex2ploidy,NULL,NULL); + + int i; + for (i=0; insex; i++) + if ( args->sex2ploidy[i]!=args->sex2ploidy_prev[i] ) break; + + if ( i==args->nsex ) return; // ploidy same as previously + + for (i=0; insamples; i++) + { + if ( args->sample2sex[i]<0 ) + args->aux.ploidy[i] = -1*args->sample2sex[i]; + else + args->aux.ploidy[i] = args->sex2ploidy[args->sample2sex[i]]; + } + int *tmp = args->sex2ploidy; args->sex2ploidy = args->sex2ploidy_prev; args->sex2ploidy_prev = tmp; +} + +ploidy_t *init_ploidy(char *alias) +{ + const ploidy_predef_t *pld = ploidy_predefs; + + int detailed = 0, len = strlen(alias); + if ( alias[len-1]=='?' ) { detailed = 1; alias[len-1] = 0; } + + while ( pld->alias && strcasecmp(alias,pld->alias) ) pld++; + + if ( !pld->alias ) + { + fprintf(bcftools_stderr,"\nPRE-DEFINED PLOIDY FILES\n\n"); + fprintf(bcftools_stderr," * Columns are: CHROM,FROM,TO,SEX,PLOIDY\n"); + fprintf(bcftools_stderr," * Coordinates are 1-based inclusive.\n"); + fprintf(bcftools_stderr," * A '*' means any value not otherwise defined.\n\n"); + pld = ploidy_predefs; + while ( pld->alias ) + { + fprintf(bcftools_stderr,"%s\n .. %s\n\n", pld->alias,pld->about); + if ( detailed ) + fprintf(bcftools_stderr,"%s\n", pld->ploidy); + pld++; + } + fprintf(bcftools_stderr,"Run as --ploidy (e.g. --ploidy GRCh37).\n"); + fprintf(bcftools_stderr,"To see the detailed ploidy definition, append a question mark (e.g. --ploidy GRCh37?).\n"); + fprintf(bcftools_stderr,"\n"); + bcftools_exit(-1); + } + else if ( detailed ) + { + fprintf(bcftools_stderr,"%s", pld->ploidy); + bcftools_exit(-1); + } + return ploidy_init_string(pld->ploidy,2); +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: SNP/indel variant calling from VCF/BCF. To be used in conjunction with bcftools mpileup.\n"); + fprintf(bcftools_stderr, " This command replaces the former \"bcftools view\" caller. Some of the original\n"); + fprintf(bcftools_stderr, " functionality has been temporarily lost in the process of transition to htslib,\n"); + fprintf(bcftools_stderr, " but will be added back on popular demand. The original calling model can be\n"); + fprintf(bcftools_stderr, " invoked with the -c option.\n"); + fprintf(bcftools_stderr, "Usage: bcftools call [options] \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "File format options:\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type b|u|z|v Output type: 'b' compressed BCF; 'u' uncompressed BCF; 'z' compressed VCF; 'v' uncompressed VCF [v]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " --ploidy ASSEMBLY[?] Predefined ploidy, 'list' to print available settings, append '?' for details [2]\n"); + fprintf(bcftools_stderr, " --ploidy-file FILE Space/tab-delimited list of CHROM,FROM,TO,SEX,PLOIDY\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --samples LIST List of samples to include [all samples]\n"); + fprintf(bcftools_stderr, " -S, --samples-file FILE PED file or a file with an optional column with sex (see man page for details) [all samples]\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with INT worker threads [0]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Input/output options:\n"); + fprintf(bcftools_stderr, " -A, --keep-alts Keep all possible alternate alleles at variant sites\n"); + fprintf(bcftools_stderr, " -a, --annotate LIST Optional tags to output (lowercase allowed); '?' to list available tags\n"); + fprintf(bcftools_stderr, " -F, --prior-freqs AN,AC Use prior allele frequencies, determined from these pre-filled tags\n"); + fprintf(bcftools_stderr, " -G, --group-samples FILE|- Group samples by population (file with \"sample\\tgroup\") or \"-\" for single-sample calling.\n"); + fprintf(bcftools_stderr, " This requires FORMAT/QS or other Number=R,Type=Integer tag such as FORMAT/AD\n"); + fprintf(bcftools_stderr, " --group-samples-tag TAG The tag to use with -G, by default FORMAT/QS and FORMAT/AD are checked automatically\n"); + fprintf(bcftools_stderr, " -g, --gvcf INT,[...] Group non-variant sites into gVCF blocks by minimum per-sample DP\n"); + fprintf(bcftools_stderr, " -i, --insert-missed Output also sites missed by mpileup but present in -T\n"); + fprintf(bcftools_stderr, " -M, --keep-masked-ref Keep sites with masked reference allele (REF=N)\n"); + fprintf(bcftools_stderr, " -V, --skip-variants TYPE Skip indels/snps\n"); + fprintf(bcftools_stderr, " -v, --variants-only Output variant sites only\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Consensus/variant calling options:\n"); + fprintf(bcftools_stderr, " -c, --consensus-caller The original calling method (conflicts with -m)\n"); + fprintf(bcftools_stderr, " -C, --constrain STR One of: alleles, trio (see manual)\n"); + fprintf(bcftools_stderr, " -m, --multiallelic-caller Alternative model for multiallelic and rare-variant calling (conflicts with -c)\n"); + fprintf(bcftools_stderr, " -n, --novel-rate FLOAT,[...] Likelihood of novel mutation for constrained trio calling, see man page for details [1e-8,1e-9,1e-9]\n"); + fprintf(bcftools_stderr, " -p, --pval-threshold FLOAT Variant if P(ref|D)aux.min_lrt); + // fprintf(bcftools_stderr, " -U INT number of permutations for association testing (effective with -1) [0]\n"); + // fprintf(bcftools_stderr, " -X FLOAT only perform permutations for P(chi^2)aux.min_perm_p); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(-1); +} + +int main_vcfcall(int argc, char *argv[]) +{ + char *ploidy_fname = NULL, *ploidy = NULL; + args_t args; + memset(&args, 0, sizeof(args_t)); + args.argc = argc; args.argv = argv; + args.aux.prior_type = -1; + args.aux.indel_frac = -1; + args.aux.theta = 1.1e-3; + args.aux.pref = 0.5; + args.aux.min_perm_p = 0.01; + args.aux.min_lrt = 1; + args.flag = CF_ACGT_ONLY; + args.output_fname = "-"; + args.output_type = FT_VCF; + args.n_threads = 0; + args.record_cmd_line = 1; + args.aux.trio_Pm_SNPs = 1 - 1e-8; + args.aux.trio_Pm_ins = args.aux.trio_Pm_del = 1 - 1e-9; + args.regions_overlap = 1; + args.clevel = -1; + + int c; + static struct option loptions[] = + { + {"help",no_argument,NULL,'h'}, + {"format-fields",required_argument,NULL,'f'}, + {"annotate",required_argument,NULL,'a'}, + {"prior-freqs",required_argument,NULL,'F'}, + {"gvcf",required_argument,NULL,'g'}, + {"group-samples",required_argument,NULL,'G'}, + {"group-samples-tag",required_argument,NULL,3}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,4}, + {"samples",required_argument,NULL,'s'}, + {"samples-file",required_argument,NULL,'S'}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"threads",required_argument,NULL,9}, + {"keep-alts",no_argument,NULL,'A'}, + {"insert-missed",no_argument,NULL,'i'}, + {"skip-Ns",no_argument,NULL,'N'}, // now the new default + {"keep-masked-refs",no_argument,NULL,'M'}, + {"skip-variants",required_argument,NULL,'V'}, + {"variants-only",no_argument,NULL,'v'}, + {"consensus-caller",no_argument,NULL,'c'}, + {"constrain",required_argument,NULL,'C'}, + {"multiallelic-caller",no_argument,NULL,'m'}, + {"pval-threshold",required_argument,NULL,'p'}, + {"prior",required_argument,NULL,'P'}, + {"novel-rate",required_argument,NULL,'n'}, + {"ploidy",required_argument,NULL,1}, + {"ploidy-file",required_argument,NULL,2}, + {"chromosome-X",no_argument,NULL,'X'}, + {"chromosome-Y",no_argument,NULL,'Y'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + + char *tmp = NULL; + while ((c = getopt_long(argc, argv, "h?o:O:r:R:s:S:t:T:ANMV:vcmp:C:n:P:f:a:ig:XYF:G:", loptions, NULL)) >= 0) + { + switch (c) + { + case 2 : ploidy_fname = optarg; break; + case 1 : ploidy = optarg; break; + case 'X': ploidy = "X"; fprintf(bcftools_stderr,"Warning: -X will be deprecated, please use --ploidy instead.\n"); break; + case 'Y': ploidy = "Y"; fprintf(bcftools_stderr,"Warning: -Y will be deprecated, please use --ploidy instead.\n"); break; + case 'G': args.aux.sample_groups = optarg; break; + case 3 : args.aux.sample_groups_tag = optarg; break; + case 'f': fprintf(bcftools_stderr,"Warning: -f, --format-fields will be deprecated, please use -a, --annotate instead.\n"); + case 'a': + if (optarg[0]=='?') { list_annotations(bcftools_stderr); return 1; } + args.aux.output_tags |= parse_output_tags(optarg); + break; + case 'M': args.flag &= ~CF_ACGT_ONLY; break; // keep sites where REF is N + case 'N': args.flag |= CF_ACGT_ONLY; break; // omit sites where first base in REF is N (the new default) + case 'A': args.aux.flag |= CALL_KEEPALT; break; + case 'c': args.flag |= CF_CCALL; break; // the original EM based calling method + case 'i': args.flag |= CF_INS_MISSED; break; + case 'v': args.aux.flag |= CALL_VARONLY; break; + case 'F': + args.aux.prior_AN = optarg; + args.aux.prior_AC = strchr(optarg,','); + if ( !args.aux.prior_AC ) error("Expected two tags with -F (e.g. AN,AC), got \"%s\"\n",optarg); + *args.aux.prior_AC = 0; + args.aux.prior_AC++; + break; + case 'g': + args.gvcf = gvcf_init(optarg); + if ( !args.gvcf ) error("Could not parse: --gvcf %s\n", optarg); + break; + case 'o': args.output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args.output_type = FT_BCF_GZ; break; + case 'u': args.output_type = FT_BCF; break; + case 'z': args.output_type = FT_VCF_GZ; break; + case 'v': args.output_type = FT_VCF; break; + default: + { + args.clevel = strtol(optarg,&tmp,10); + if ( *tmp || args.clevel<0 || args.clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args.clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args.clevel<0 || args.clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'C': + if ( !strcasecmp(optarg,"alleles") ) args.aux.flag |= CALL_CONSTR_ALLELES; + else if ( !strcasecmp(optarg,"trio") ) args.aux.flag |= CALL_CONSTR_TRIO; + else error("Unknown argument to -C: \"%s\"\n", optarg); + break; + case 'V': + if ( !strcasecmp(optarg,"snps") ) args.flag |= CF_INDEL_ONLY; + else if ( !strcasecmp(optarg,"indels") ) args.flag |= CF_NO_INDEL; + else error("Unknown skip category \"%s\" (-S argument must be \"snps\" or \"indels\")\n", optarg); + break; + case 'm': args.flag |= CF_MCALL; break; // multiallelic calling method + case 'p': + args.aux.pref = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: --pval-threshold %s\n", optarg); + break; + case 'P': args.aux.theta = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse, expected float argument: -P %s\n", optarg); + break; + case 'n': parse_novel_rate(&args,optarg); break; + case 'r': args.regions = optarg; break; + case 'R': args.regions = optarg; args.regions_is_file = 1; break; + case 't': args.targets = optarg; break; + case 'T': args.targets = optarg; args.targets_is_file = 1; break; + case 's': args.samples_fname = optarg; break; + case 'S': args.samples_fname = optarg; args.samples_is_file = 1; break; + case 9 : args.n_threads = strtol(optarg, 0, 0); break; + case 8 : args.record_cmd_line = 0; break; + case 4 : + args.regions_overlap = parse_overlap_option(optarg); + if ( args.regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + default: usage(&args); + } + } + // Sanity check options and initialize + if ( ploidy_fname ) args.ploidy = ploidy_init(ploidy_fname, 2); + else if ( ploidy ) args.ploidy = init_ploidy(ploidy); + + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args.bcf_fname = "-"; // reading from stdin + else usage(&args); + } + else args.bcf_fname = argv[optind++]; + + if ( !ploidy_fname && !ploidy ) + { + if ( !args.samples_is_file ) fprintf(bcftools_stderr,"Note: none of --samples-file, --ploidy or --ploidy-file given, assuming all sites are diploid\n"); + args.ploidy = ploidy_init_string("* * * 0 0\n* * * 1 1\n* * * 2 2\n",2); + } + + if ( !args.ploidy ) error("Could not initialize ploidy\n"); + if ( (args.flag & CF_CCALL ? 1 : 0) + (args.flag & CF_MCALL ? 1 : 0) + (args.flag & CF_QCALL ? 1 : 0) > 1 ) error("Only one of -c or -m options can be given\n"); + if ( !(args.flag & CF_CCALL) && !(args.flag & CF_MCALL) && !(args.flag & CF_QCALL) ) error("Expected -c or -m option\n"); + if ( (args.flag & CF_CCALL ? 1: 0) && args.gvcf ) error("gvcf -g option not functional with -c calling mode yet\n"); + if ( args.aux.n_perm && args.aux.ngrp1_samples<=0 ) error("Expected -1 with -U\n"); // not sure about this, please fix + if ( args.aux.flag & CALL_CONSTR_ALLELES ) + { + if ( !args.targets ) error("Expected -t or -T with \"-C alleles\"\n"); + if ( !(args.flag & CF_MCALL) ) error("The \"-C alleles\" mode requires -m\n"); + } + if ( args.flag & CF_INS_MISSED && !(args.aux.flag&CALL_CONSTR_ALLELES) ) error("The -i option requires -C alleles\n"); + if ( args.aux.flag&CALL_VARONLY && args.gvcf ) error("The two options cannot be combined: --variants-only and --gvcf\n"); + if ( args.aux.sample_groups && !(args.flag & CF_MCALL) ) error("The -G feature is supported only with the -m calling mode\n"); + init_data(&args); + + bcf1_t *bcf_rec; + while ( (bcf_rec = next_line(&args)) ) + { + // Skip duplicate positions with all matching `-C alleles -T` used up + if ( args.aux.flag&CALL_CONSTR_ALLELES && !args.aux.tgt_als ) continue; + + // Skip unwanted sites + int i, is_indel = bcf_is_snp(bcf_rec) ? 0 : 1; + if ( (args.flag & CF_INDEL_ONLY) && !is_indel ) continue; + if ( (args.flag & CF_NO_INDEL) && is_indel ) continue; + if ( (args.flag & CF_ACGT_ONLY) && (bcf_rec->d.allele[0][0]=='N' || bcf_rec->d.allele[0][0]=='n') ) continue; // REF[0] is 'N' + + // Which allele is symbolic? All SNPs should have it, but not indels + args.aux.unseen = 0; + for (i=1; in_allele; i++) + { + if ( bcf_rec->d.allele[i][0]=='X' ) { args.aux.unseen = i; break; } // old X + if ( bcf_rec->d.allele[i][0]=='<' ) + { + if ( bcf_rec->d.allele[i][1]=='X' && bcf_rec->d.allele[i][2]=='>' ) { args.aux.unseen = i; break; } // old + if ( bcf_rec->d.allele[i][1]=='*' && bcf_rec->d.allele[i][2]=='>' ) { args.aux.unseen = i; break; } // new <*> + } + } + int is_ref = (bcf_rec->n_allele==1 || (bcf_rec->n_allele==2 && args.aux.unseen>0)) ? 1 : 0; + + if ( is_ref && args.aux.flag&CALL_VARONLY ) + continue; + + bcf_unpack(bcf_rec, BCF_UN_ALL); + if ( args.nsex ) set_ploidy(&args, bcf_rec); + + // Various output modes: QCall output (todo) + if ( args.flag & CF_QCALL ) + { + qcall(&args.aux, bcf_rec); + continue; + } + + if ( args.flag & CF_INS_MISSED ) + { + tgt_flush(&args,bcf_rec); + if ( !args.tgt_itr_prev ) args.tgt_itr_prev = regitr_init(args.tgt_idx); + regitr_copy(args.tgt_itr_prev, args.tgt_itr); + } + + // Calling modes which output VCFs + int ret; + if ( args.flag & CF_MCALL ) + ret = mcall(&args.aux, bcf_rec); + else + ret = ccall(&args.aux, bcf_rec); + if ( ret==-1 ) error("Something is wrong\n"); + else if ( ret==-2 ) continue; // skip the site + + // Normal output + if ( (args.aux.flag & CALL_VARONLY) && ret==0 && !args.gvcf ) continue; // not a variant + if ( args.gvcf ) + bcf_rec = gvcf_write(args.gvcf, args.out_fh, args.aux.hdr, bcf_rec, ret==1?1:0); + if ( bcf_rec && bcf_write1(args.out_fh, args.aux.hdr, bcf_rec)!=0 ) error("[%s] Error: failed to write to %s\n", __func__,args.output_fname); + } + if ( args.gvcf ) gvcf_write(args.gvcf, args.out_fh, args.aux.hdr, NULL, 0); + if ( args.flag & CF_INS_MISSED ) tgt_flush(&args,NULL); + destroy_data(&args); + return 0; +} + diff --git a/bcftools/vcfcnv.c b/bcftools/vcfcnv.c new file mode 100644 index 0000000..0302261 --- /dev/null +++ b/bcftools/vcfcnv.c @@ -0,0 +1,1438 @@ +/* The MIT License + + Copyright (c) 2014-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +/* + Known issues: + - The --AF-file option behaves like --targets-file, sites not listed in the AFs + are skipped. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "HMM.h" +#include "rbuf.h" + +#define DBG0 0 + +#define N_STATES 4 +#define CN0 0 +#define CN1 1 +#define CN2 2 +#define CN3 3 + +typedef struct +{ + float mean, dev2, norm; +} +gauss_param_t; + +typedef struct +{ + char *name; + int idx; // VCF sample index + float *lrr,*baf, baf_dev2, baf_dev2_dflt, lrr_dev2; + float cell_frac, cell_frac_dflt; + gauss_param_t gauss_param[18]; + double pobs[N_STATES]; + FILE *dat_fh, *cn_fh, *summary_fh; + char *dat_fname, *cn_fname, *summary_fname; +} +sample_t; + +typedef struct _args_t +{ + bcf_srs_t *files; + bcf_hdr_t *hdr; + int prev_rid, ntot, nused; + sample_t query_sample, control_sample; + + int nstates; // number of states: N_STATES for one sample, N_STATES^2 for two samples + double lrr_bias, baf_bias; // LRR/BAF weights + double same_prob, ij_prob; // prior of both samples being the same and the transition probability P(i|j) + double err_prob; // constant probability of erroneous measurement + float *nonref_afs, nonref_af, nonref_af_dflt, fRR, fRA, fAA, *tmpf; + unsigned long int nRR, nRA, nAA; + int mtmpf; + + double *tprob, *tprob_arr; // array of transition matrices, precalculated up to ntprob_arr positions + double *iprobs; // states' initial probabilities + int ntprob_arr; + + hmm_t *hmm; + double *eprob; // emission probs [nstates*nsites,msites] + uint32_t *sites; // positions [nsites,msites] + int nsites, msites; + + double baum_welch_th, optimize_frac; + float plot_th; + FILE *summary_fh; + char **argv, *regions_list, *summary_fname, *output_dir; + char *targets_list, *af_fname; + int argc, verbose, lrr_smooth_win; +} +args_t; + +FILE *open_file(char **fname, const char *mode, const char *fmt, ...); + +static inline void hmm2cn_state(int nstates, int i, int *a, int *b) +{ + *a = i / N_STATES; + *b = i - (*a)*N_STATES; +} +static double *init_tprob_matrix(int ndim, double ij_prob, double same_prob) +{ + int i,j; + double *mat = (double*) malloc(sizeof(double)*ndim*ndim); + + assert( ndim==N_STATES || ndim==N_STATES*N_STATES); + + if ( ndim==N_STATES ) // one sample + { + double pii = 1 - ij_prob*(N_STATES-1); + if ( pii < ij_prob ) error("Error: -x set a bit too high, P(x|x) < P(x|y): %e vs %e\n", pii,ij_prob); + for (j=0; jdat_fh = open_file(&smpl->dat_fname,"w","%s/dat.%s.tab",dir,smpl->name); + if ( !smpl->dat_fh ) error("Error opening file: %s/dat.%s.tab\n",dir,smpl->name); + + smpl->cn_fh = open_file(&smpl->cn_fname,"w","%s/cn.%s.tab",dir,smpl->name); + if ( !smpl->cn_fh ) error("Error opening file: %s/cn.%s.tab\n",dir,smpl->name); + + smpl->summary_fh = open_file(&smpl->summary_fname,"w","%s/summary.%s.tab",dir,smpl->name); + if ( !smpl->summary_fh ) error("Error opening file: %s/summary.%s.tab\n",dir,smpl->name); + + fprintf(smpl->dat_fh,"# [1]Chromosome\t[2]Position\t[3]BAF\t[4]LRR\n"); + fprintf(smpl->cn_fh,"# [1]Chromosome\t[2]Position\t[3]CN\t[4]P(CN0)\t[5]P(CN1)\t[6]P(CN2)\t[7]P(CN3)\n"); + fprintf(smpl->summary_fh,"# RG, Regions [2]Chromosome\t[3]Start\t[4]End\t[5]Copy Number state\t[6]Quality\t[7]nSites\t[8]nHETs\n"); +} +static void close_sample_files(sample_t *smpl) +{ + if ( fclose(smpl->dat_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,smpl->dat_fname); + if ( fclose(smpl->cn_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,smpl->cn_fname); + if ( fclose(smpl->summary_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,smpl->summary_fname); +} + +static double norm_cdf(double mean, double dev); +static void init_data(args_t *args) +{ + args->prev_rid = -1; + args->hdr = args->files->readers[0].header; + + if ( !args->query_sample.name ) + { + if ( bcf_hdr_nsamples(args->hdr)>1 ) error("Multi-sample VCF, missing the -s option\n"); + args->query_sample.name = strdup(args->hdr->samples[0]); + } + else + if ( bcf_hdr_id2int(args->hdr,BCF_DT_SAMPLE,args->query_sample.name)<0 ) error("The sample \"%s\" not found\n", args->query_sample.name); + if ( !args->files->readers[0].file->is_bin ) + { + int ret; + kstring_t tmp = {0,0,0}; + if ( args->control_sample.name ) + { + ksprintf(&tmp, "%s,%s", args->query_sample.name,args->control_sample.name); + ret = bcf_hdr_set_samples(args->hdr, tmp.s, 0); + } + else + { + ret = bcf_hdr_set_samples(args->hdr, args->query_sample.name, 0); + tmp.s = args->query_sample.name; + } + if ( ret<0 ) error("Error parsing the list of samples: %s\n", tmp.s); + else if ( ret>0 ) error("The sample not found in the VCF: %s\n", ret==1 ? args->query_sample.name : args->control_sample.name); + + if ( args->control_sample.name ) free(tmp.s); + } + args->query_sample.idx = bcf_hdr_id2int(args->hdr,BCF_DT_SAMPLE,args->query_sample.name); + args->control_sample.idx = args->control_sample.name ? bcf_hdr_id2int(args->hdr,BCF_DT_SAMPLE,args->control_sample.name) : -1; + args->nstates = args->control_sample.name ? N_STATES*N_STATES : N_STATES; + args->tprob = init_tprob_matrix(args->nstates, args->ij_prob, args->same_prob); + args->iprobs = init_iprobs(args->nstates, args->same_prob); + args->hmm = hmm_init(args->nstates, args->tprob, 10000); + hmm_init_states(args->hmm, args->iprobs); + + args->summary_fh = stdout; + init_sample_files(&args->query_sample, args->output_dir); + if ( args->control_sample.name ) + { + init_sample_files(&args->control_sample, args->output_dir); + args->summary_fh = open_file(&args->summary_fname,"w","%s/summary.tab",args->output_dir); + } + else + args->summary_fh = NULL; // one sample only, no two-file summary + + + int i; + FILE *fh = args->summary_fh ? args->summary_fh : args->query_sample.summary_fh; + + fprintf(fh, "# This file was produced by: bcftools cnv(%s+htslib-%s)\n", bcftools_version(),hts_version()); + fprintf(fh, "# The command line was:\tbcftools %s", args->argv[0]); + for (i=1; iargc; i++) fprintf(fh, " %s",args->argv[i]); + if ( args->control_sample.name ) + fprintf(fh, "\n#\n" + "# RG, Regions\t[2]Chromosome\t[3]Start\t[4]End\t[5]Copy number:%s\t[6]Copy number:%s\t[7]Quality" + "\t[8]nSites in (5)\t[9]nHETs in (5)\t[10]nSites in (6)\t[11]nHETs in(6)\n", + args->query_sample.name,args->control_sample.name + ); + else + fprintf(fh, "\n#\n" + "# RG, Regions\t[2]Chromosome\t[3]Start\t[4]End\t[5]Copy number:%s\t[6]Quality\t[7]nSites\t[8]nHETs\n", + args->query_sample.name + ); + if ( args->optimize_frac ) + { + fprintf(args->query_sample.summary_fh, "# CF, cell fraction estimate\t[2]Chromosome\t[3]Start\t[4]End\t[5]Cell fraction\t[6]BAF deviation\n"); + if ( args->control_sample.name ) + { + fprintf(args->control_sample.summary_fh, "# CF, cell fraction estimate\t[2]Chromosome\t[3]Start\t[4]End\t[5]Cell fraction\t[6]BAF deviation\n"); + fprintf(args->summary_fh, "# CF, cell fraction estimate\t[2]Chromosome\t[3]Start\t[4]End\t" + "[5]Cell fraction:%s\t[6]Cell fraction:%s\t[7]BAF deviation:%s\t[8]BAF deviation:%s\n", + args->query_sample.name,args->control_sample.name, + args->query_sample.name,args->control_sample.name + ); + } + } +} + +char *msprintf(const char *fmt, ...); +static void py_plot_cnv(char *script, float th) +{ + if ( th>100 ) return; // create no plots + + char *cmd = msprintf("python %s -p %f", script, th); + int ret = system(cmd); + if ( ret) fprintf(stderr, "The command returned non-zero status %d: %s\n", ret, cmd); + free(cmd); +} + +static void plot_sample(args_t *args, sample_t *smpl) +{ + char *fname; + FILE *fp = open_file(&fname,"w","%s/plot.%s.py",args->output_dir,smpl->name); + fprintf(fp, + "import matplotlib as mpl\n" + "mpl.use('Agg')\n" + "import matplotlib.pyplot as plt\n" + "import csv\n" + "import numpy as np\n" + "csv.register_dialect('tab', delimiter='\\t', quoting=csv.QUOTE_NONE)\n" + "\n" + "dat = {}\n" + "with open('%s', 'r') as f:\n" + " reader = csv.reader(f, 'tab')\n" + " for row in reader:\n" + " chr = row[0]\n" + " if chr[0]=='#': continue\n" + " if chr not in dat: dat[chr] = []\n" + " dat[chr].append([int(row[1]), float(row[2]), float(row[3])])\n" + "\n" + "cnv = {}\n" + "with open('%s', 'r') as f:\n" + " reader = csv.reader(f, 'tab')\n" + " for row in reader:\n" + " chr = row[0]\n" + " if chr[0]=='#': continue\n" + " if chr not in cnv: cnv[chr] = []\n" + " row[2] = int(row[2]) + 0.5\n" + " row[1] = int(row[1])\n" + " cnv[chr].append(row[1:])\n" + "\n" + "for chr in dat:\n" + " fig,(ax1, ax2, ax3) = plt.subplots(3,1,figsize=(10,8),sharex=True)\n" + " ax1.plot([x[0] for x in dat[chr]],[x[2] for x in dat[chr]], '.', ms=3)\n" + " ax2.plot([x[0] for x in dat[chr]],[x[1] for x in dat[chr]], '.', ms=3)\n" + " cn_dat = cnv[chr]\n" + " xgrid = [float(x[0]) for x in cn_dat]\n" + " ygrid = np.linspace(0,5,6)\n" + " xgrid, ygrid = np.meshgrid(xgrid, ygrid)\n" + " heat = np.zeros_like(xgrid)\n" + " for x in range(len(heat[0])-1):\n" + " heat[0][x] = cn_dat[x][2]\n" + " heat[1][x] = cn_dat[x][3]\n" + " heat[2][x] = cn_dat[x][4]\n" + " heat[3][x] = cn_dat[x][5]\n" + " mesh = ax3.pcolormesh(xgrid, ygrid, heat, cmap='bwr_r', shading='auto', alpha=0)\n" + " mesh.set_clim(vmin=-1,vmax=1)\n" + " ax3.plot([x[0] for x in cn_dat],[x[1] for x in cn_dat],'.-',ms=3,color='black')\n" + " fig.suptitle('%s (chr '+chr+')')\n" + " ax1.set_title('Log-R intensities Ratio',fontsize=10)\n" + " ax2.set_title('B-Allele Frequency',fontsize=10)\n" + " ax3.set_title('Copy Number Variation',fontsize=10)\n" + " ax1.set_ylabel('LRR')\n" + " ax2.set_ylabel('BAF')\n" + " ax3.set_ylabel('CN')\n" + " ax3.set_xlabel('Coordinate (chrom '+chr+')',fontsize=10)\n" + " ax3.set_ylim(-0.1,4.1)\n" + " ax3.set_yticks([0.5,1.5,2.5,3.5])\n" + " ax3.set_yticklabels(['CN0','CN1','CN2','CN3'])\n" + " plt.subplots_adjust(left=0.08,right=0.95,bottom=0.08,top=0.92)\n" + " plt.savefig('%s/plot.%s.chr'+chr+'.png')\n" + " plt.close()\n" + "\n", + smpl->dat_fname,smpl->cn_fname,smpl->name,args->output_dir,smpl->name + ); + fclose(fp); + + py_plot_cnv(fname, args->plot_th); + free(fname); +} + +static void create_plots(args_t *args) +{ + close_sample_files(&args->query_sample); + if ( args->control_sample.name ) close_sample_files(&args->control_sample); + if ( args->summary_fh ) fclose(args->summary_fh); + + if ( !args->control_sample.name ) + { + plot_sample(args, &args->query_sample); + return; + } + + char *fname; + FILE *fp = open_file(&fname,"w","%s/plot.%s.%s.py",args->output_dir,args->control_sample.name,args->query_sample.name); + fprintf(fp, + "import matplotlib as mpl\n" + "mpl.use('Agg')\n" + "import matplotlib.pyplot as plt\n" + "import csv,argparse\n" + "import numpy as np\n" + "csv.register_dialect('tab', delimiter='\\t', quoting=csv.QUOTE_NONE)\n" + "\n" + "control_sample = '%s'\n" + "query_sample = '%s'\n" + "\n" + "parser = argparse.ArgumentParser()\n" + "parser.add_argument('-p', '--plot-threshold', type=float)\n" + "parser.add_argument('-c', '--chromosome')\n" + "args = parser.parse_args()\n" + "if args.plot_threshold==None: args.plot_threshold = 0\n" + "\n" + "def chroms_to_plot(th):\n" + " dat = {}\n" + " with open('%s/summary.tab', 'r') as f:\n" + " reader = csv.reader(f, 'tab')\n" + " for row in reader:\n" + " if row[0]!='RG': continue\n" + " chr = row[1]\n" + " start = row[2]\n" + " end = row[3]\n" + " qual = float(row[6])\n" + " if row[4]==row[5] and args.plot_threshold!=0: continue\n" + " if chr not in dat: dat[chr] = 0.0\n" + " if qual > dat[chr]: dat[chr] = qual\n" + " out = {}\n" + " for chr in dat:\n" + " if (chr not in dat) or dat[chr]0: diff.append([b[i-1][0],b[i-1][1],a[i-1][1]])\n" + " diff.append([b[i][0],b[i][1],a[i][1]])\n" + " elif len(diff):\n" + " diff.append([b[i][0],b[i][1],a[i][1]])\n" + " out.append(diff)\n" + " diff = []\n" + " if len(diff): out.append(diff)\n" + " return out\n" + "\n" + "for chr in sorted(plot_chroms.keys()):\n" + " control_dat = []\n" + " control_cnv = []\n" + " query_dat = []\n" + " query_cnv = []\n" + " read_dat('%s',control_dat,chr)\n" + " read_dat('%s',query_dat,chr)\n" + " read_cnv('%s',control_cnv,chr)\n" + " read_cnv('%s',query_cnv,chr)\n" + "\n" + " fig,(ax1,ax2,ax3,ax4,ax5,ax6) = plt.subplots(6,1,figsize=(10,8),sharex=True)\n" + " ax1.plot([x[0] for x in control_dat],[x[2] for x in control_dat], '.', ms=3,color='red')\n" + " ax2.plot([x[0] for x in control_dat],[x[1] for x in control_dat], '.', ms=3,color='red')\n" + " cn_dat = control_cnv\n" + " xgrid = [float(x[0]) for x in cn_dat]\n" + " ygrid = np.linspace(0,5,6)\n" + " xgrid, ygrid = np.meshgrid(xgrid, ygrid)\n" + " heat = np.zeros_like(xgrid)\n" + " for x in range(len(heat[0])-1):\n" + " heat[0][x] = cn_dat[x][2]\n" + " heat[1][x] = cn_dat[x][3]\n" + " heat[2][x] = cn_dat[x][4]\n" + " heat[3][x] = cn_dat[x][5]\n" + " mesh = ax3.pcolormesh(xgrid, ygrid, heat, cmap='bwr', shading='auto', alpha=0)\n" + " mesh.set_clim(vmin=-1,vmax=1)\n" + " ax3.plot([x[0] for x in cn_dat],[x[1] for x in cn_dat],'-',ms=3,color='black',lw=1.7)\n" + "\n" + " ax6.plot([x[0] for x in query_dat],[x[2] for x in query_dat], '.', ms=3)\n" + " ax5.plot([x[0] for x in query_dat],[x[1] for x in query_dat], '.', ms=3)\n" + " cn_dat = query_cnv\n" + " xgrid = [float(x[0]) for x in cn_dat]\n" + " ygrid = np.linspace(0,5,6)\n" + " xgrid, ygrid = np.meshgrid(xgrid, ygrid)\n" + " heat = np.zeros_like(xgrid)\n" + " for x in range(len(heat[0])-1):\n" + " heat[0][x] = cn_dat[x][2]\n" + " heat[1][x] = cn_dat[x][3]\n" + " heat[2][x] = cn_dat[x][4]\n" + " heat[3][x] = cn_dat[x][5]\n" + " mesh = ax4.pcolormesh(xgrid, ygrid, heat, cmap='bwr_r')\n" + " mesh.set_clim(vmin=-1,vmax=1)\n" + " ax4.plot([x[0] for x in cn_dat],[x[1] for x in cn_dat],'-',ms=3,color='black',lw=1.7)\n" + " ax3.annotate(control_sample, xy=(0.02,0.1), xycoords='axes fraction', color='red',fontsize=12, va='bottom',ha='left')\n" + " ax4.annotate(query_sample, xy=(0.02,0.9), xycoords='axes fraction', color='blue',fontsize=12, va='top',ha='left')\n" + "\n" + " diffs = find_diffs(control_cnv,query_cnv)\n" + " for diff in diffs:\n" + " ax3.plot([x[0] for x in diff],[x[1] for x in diff],'-',ms=3,color='blue',lw=1.7)\n" + " ax4.plot([x[0] for x in diff],[x[2] for x in diff],'-',ms=3,color='red',lw=1.7)\n" + "\n" + " fig.suptitle('chr '+chr+', '+control_sample+' vs '+query_sample)\n" + " ax1.tick_params(axis='both', labelsize=8)\n" + " ax2.tick_params(axis='both', labelsize=8)\n" + " ax3.tick_params(axis='both', labelsize=8)\n" + " ax4.tick_params(axis='both', labelsize=8)\n" + " ax5.tick_params(axis='both', labelsize=8)\n" + " ax6.tick_params(axis='both', labelsize=8)\n" + " ax6.set_xlabel('Coordinate (chrom '+chr+')',fontsize=8)\n" + " ax1.set_ylabel('LRR')\n" + " ax2.set_ylabel('BAF')\n" + " ax3.set_ylabel('CN')\n" + " ax6.set_ylabel('LRR')\n" + " ax5.set_ylabel('BAF')\n" + " ax4.set_ylabel('CN')\n" + " ax3.set_ylim(-0.1,4.1)\n" + " ax3.set_yticks([0.5,1.5,2.5,3.5])\n" + " ax3.set_yticklabels(['CN0','CN1','CN2','CN3'])\n" + " ax4.set_ylim(-0.1,4.1)\n" + " ax4.set_yticks([0.5,1.5,2.5,3.5])\n" + " ax4.set_yticklabels(['CN0','CN1','CN2','CN3'])\n" + " plt.subplots_adjust(left=0.08,right=0.95,bottom=0.08,top=0.92,hspace=0)\n" + " plt.savefig('%s/plot.%s.%s.chr'+chr+'.png')\n" + " plt.close()\n" + "\n", + args->control_sample.name,args->query_sample.name, + args->output_dir, + args->control_sample.dat_fname,args->query_sample.dat_fname, + args->control_sample.cn_fname,args->query_sample.cn_fname, + args->output_dir,args->control_sample.name,args->query_sample.name + ); + fclose(fp); + + py_plot_cnv(fname,args->plot_th); + free(fname); +} + +static void destroy_data(args_t *args) +{ + bcf_sr_destroy(args->files); + hmm_destroy(args->hmm); + free(args->tmpf); + free(args->sites); + free(args->eprob); + free(args->tprob); + free(args->iprobs); + free(args->summary_fname); + free(args->nonref_afs); + free(args->query_sample.baf); + free(args->query_sample.lrr); + free(args->control_sample.baf); + free(args->control_sample.lrr); + free(args->query_sample.name); + free(args->query_sample.dat_fname); + free(args->query_sample.cn_fname); + free(args->query_sample.summary_fname); + free(args->control_sample.dat_fname); + free(args->control_sample.cn_fname); + free(args->control_sample.summary_fname); +} + +static inline char copy_number_state(args_t *args, int istate, int ismpl) +{ + char code[] = "01234"; + if ( !args->control_sample.name ) return code[istate]; + int idx = ismpl ? istate - (istate/N_STATES)*N_STATES : istate/N_STATES; + return code[idx]; +} + +static double avg_ii_prob(int n, double *mat) +{ + int i; + double avg = 0; + for (i=0; igauss_param[0])) +#define GAUSS_CN1_PK_A(smpl) (&((smpl)->gauss_param[1])) +#define GAUSS_CN2_PK_RR(smpl) (&((smpl)->gauss_param[2])) +#define GAUSS_CN2_PK_RA(smpl) (&((smpl)->gauss_param[3])) +#define GAUSS_CN2_PK_AA(smpl) (&((smpl)->gauss_param[4])) +#define GAUSS_CN3_PK_RRR(smpl) (&((smpl)->gauss_param[5])) +#define GAUSS_CN3_PK_RRA(smpl) (&((smpl)->gauss_param[6])) +#define GAUSS_CN3_PK_RAA(smpl) (&((smpl)->gauss_param[7])) +#define GAUSS_CN3_PK_AAA(smpl) (&((smpl)->gauss_param[8])) + +static inline double norm_prob(double baf, gauss_param_t *param) +{ + return exp(-(baf-param->mean)*(baf-param->mean)*0.5/param->dev2) / param->norm / sqrt(2*M_PI*param->dev2); +} + +static int set_observed_prob(args_t *args, sample_t *smpl, int isite) +{ + float baf = smpl->baf[isite]; + float lrr = args->lrr_bias>0 ? smpl->lrr[isite] : 0; + + float fRR = args->fRR; + float fRA = args->fRA; + float fAA = args->fAA; + + if ( baf<0 ) + { + // no call: either some technical issue or the call could not be made because it is CN0 + int i; + smpl->pobs[CN0] = 0.5; + for (i=1; ipobs[i] = (1.0-smpl->pobs[CN0])/(N_STATES-1); + return 0; + } + + double cn1_baf = + norm_prob(baf,GAUSS_CN1_PK_R(smpl)) * (fRR + fRA*0.5) + + norm_prob(baf,GAUSS_CN1_PK_A(smpl)) * (fAA + fRA*0.5) ; + double cn2_baf = + norm_prob(baf,GAUSS_CN2_PK_RR(smpl)) * fRR + + norm_prob(baf,GAUSS_CN2_PK_RA(smpl)) * fRA + + norm_prob(baf,GAUSS_CN2_PK_AA(smpl)) * fAA; + double cn3_baf = + norm_prob(baf,GAUSS_CN3_PK_RRR(smpl)) * fRR + + norm_prob(baf,GAUSS_CN3_PK_RRA(smpl)) * fRA*0.5 + + norm_prob(baf,GAUSS_CN3_PK_RAA(smpl)) * fRA*0.5 + + norm_prob(baf,GAUSS_CN3_PK_AAA(smpl)) * fAA; + + double norm = cn1_baf + cn2_baf + cn3_baf; + cn1_baf /= norm; + cn2_baf /= norm; + cn3_baf /= norm; + + #if DBG0 + if ( args->verbose ) fprintf(stderr,"%f\t%f %f %f\n", baf,cn1_baf,cn2_baf,cn3_baf); + #endif + + double cn1_lrr = exp(-(lrr + 0.45)*(lrr + 0.45)/smpl->lrr_dev2); + double cn2_lrr = exp(-(lrr - 0.00)*(lrr - 0.00)/smpl->lrr_dev2); + double cn3_lrr = exp(-(lrr - 0.30)*(lrr - 0.30)/smpl->lrr_dev2); + + smpl->pobs[CN0] = 0; + smpl->pobs[CN1] = args->err_prob + (1 - args->baf_bias + args->baf_bias*cn1_baf)*(1 - args->lrr_bias + args->lrr_bias*cn1_lrr); + smpl->pobs[CN2] = args->err_prob + (1 - args->baf_bias + args->baf_bias*cn2_baf)*(1 - args->lrr_bias + args->lrr_bias*cn2_lrr); + smpl->pobs[CN3] = args->err_prob + (1 - args->baf_bias + args->baf_bias*cn3_baf)*(1 - args->lrr_bias + args->lrr_bias*cn3_lrr); + + return 0; +} + +static void set_emission_prob(args_t *args, int isite) +{ + double *eprob = &args->eprob[args->nstates*isite]; + int i; + for (i=0; iquery_sample.pobs[i]; +} + +static void set_emission_prob2(args_t *args, int isite) +{ + double *eprob = &args->eprob[args->nstates*isite]; + int i, j; + for (i=0; iquery_sample.pobs[i]*args->control_sample.pobs[j]; + } + } +} + +static void set_gauss_params(args_t *args, sample_t *smpl); +static double norm_cdf(double mean, double dev) +{ + double bot = 0, top = 1; + top = 1 - 0.5*erfc((top-mean)/(dev*sqrt(2))); + bot = 1 - 0.5*erfc((bot-mean)/(dev*sqrt(2))); + return top-bot; +} + +static void set_emission_probs(args_t *args) +{ + if ( !args->af_fname ) + { + args->fRR = 0.76; + args->fRA = 0.14; + args->fAA = 0.098; + } + + set_gauss_params(args, &args->query_sample); + if ( args->control_sample.name ) set_gauss_params(args, &args->control_sample); + + #if DBG0 + args->verbose = 1; + args->query_sample.baf[0] = 0; set_observed_prob(args,&args->query_sample,0); + args->query_sample.baf[0] = 1/3.; set_observed_prob(args,&args->query_sample,0); + args->query_sample.baf[0] = 1/2.; set_observed_prob(args,&args->query_sample,0); + args->query_sample.baf[0] = 2/3.; set_observed_prob(args,&args->query_sample,0); + args->query_sample.baf[0] = 1; set_observed_prob(args,&args->query_sample,0); + args->verbose = 0; + #endif + + int i; + for (i=0; insites; i++) + { + if ( args->af_fname ) + { + args->fRR = (1-args->nonref_afs[i])*(1-args->nonref_afs[i]); + args->fRA = 2*args->nonref_afs[i]*(1-args->nonref_afs[i]); + args->fAA = args->nonref_afs[i]*args->nonref_afs[i]; + } + set_observed_prob(args,&args->query_sample,i); + if ( args->control_sample.name ) + { + set_observed_prob(args,&args->control_sample,i); + set_emission_prob2(args,i); + } + else + set_emission_prob(args,i); + } +} + +static void smooth_data(float *dat, int ndat, int win) +{ + if ( win<=1 ) return; + + int i,j, k1 = win/2, k2 = win-k1; + rbuf_t rbuf; + rbuf_init(&rbuf,win); + float sum = 0, *buf = (float*)malloc(sizeof(float)*win); + for (i=0; i=k1 ) + { + j = rbuf_shift(&rbuf); + sum -= buf[j]; + } + if ( i+k2gauss_param[i].dev2 = smpl->baf_dev2; + + double dev = sqrt(smpl->baf_dev2); + + GAUSS_CN1_PK_R(smpl)->mean = 0; + GAUSS_CN1_PK_A(smpl)->mean = 1; + GAUSS_CN1_PK_R(smpl)->norm = norm_cdf(GAUSS_CN1_PK_R(smpl)->mean,dev); + GAUSS_CN1_PK_A(smpl)->norm = norm_cdf(GAUSS_CN1_PK_A(smpl)->mean,dev); + + GAUSS_CN2_PK_RR(smpl)->mean = 0; + GAUSS_CN2_PK_RA(smpl)->mean = 0.5; + GAUSS_CN2_PK_AA(smpl)->mean = 1; + GAUSS_CN2_PK_RR(smpl)->norm = norm_cdf(GAUSS_CN2_PK_RR(smpl)->mean,dev); + GAUSS_CN2_PK_RA(smpl)->norm = norm_cdf(GAUSS_CN2_PK_RA(smpl)->mean,dev); + GAUSS_CN2_PK_AA(smpl)->norm = norm_cdf(GAUSS_CN2_PK_AA(smpl)->mean,dev); + + GAUSS_CN3_PK_RRR(smpl)->mean = 0; + GAUSS_CN3_PK_RRA(smpl)->mean = 1.0/(2+smpl->cell_frac); + GAUSS_CN3_PK_RAA(smpl)->mean = (1.0+smpl->cell_frac)/(2+smpl->cell_frac); + GAUSS_CN3_PK_AAA(smpl)->mean = 1; + GAUSS_CN3_PK_RRR(smpl)->norm = norm_cdf(GAUSS_CN3_PK_RRR(smpl)->mean,dev); + GAUSS_CN3_PK_RRA(smpl)->norm = norm_cdf(GAUSS_CN3_PK_RRA(smpl)->mean,dev); + GAUSS_CN3_PK_RAA(smpl)->norm = norm_cdf(GAUSS_CN3_PK_RAA(smpl)->mean,dev); + GAUSS_CN3_PK_AAA(smpl)->norm = norm_cdf(GAUSS_CN3_PK_AAA(smpl)->mean,dev); +} + +static int update_sample_args(args_t *args, sample_t *smpl, int ismpl) +{ + hmm_t *hmm = args->hmm; + double *fwd = hmm_get_fwd_bwd_prob(hmm); + int nstates = hmm_get_nstates(hmm); + + // estimate the BAF mean and deviation for CN3 + double mean_cn3 = 0, norm_cn3 = 0; + double baf_dev2 = 0, baf_AA_dev2 = 0, norm_baf_AA_dev2 = 0; + + // experimental: smooth CN3 probs to bias toward bigger events, this lowers + // the FP rate when the data is noisy + hts_expand(float,args->nsites,args->mtmpf,args->tmpf); + int i, j, k = 0; + for (i=0; insites; i++) + { + float baf = smpl->baf[i]; + if ( baf>4/5.) continue; // skip AA genotypes + if ( baf>0.5 ) baf = 1 - baf; // the bands should be symmetric + if ( baf<1/5.) continue; // skip RR genotypes + + double prob_cn3 = 0, *probs = fwd + i*nstates; + if ( !args->control_sample.name ) + { + prob_cn3 = probs[CN3]; + } + else if ( ismpl==0 ) + { + // query sample: CN3 probability must be recovered from all states of the control sample + for (j=0; jtmpf[k++] = prob_cn3; + } + smooth_data(args->tmpf, k, 50); + k = 0; + for (i=0; insites; i++) + { + float baf = smpl->baf[i]; + if ( baf>4/5.) { baf_AA_dev2 += (1.0-baf)*(1.0-baf); norm_baf_AA_dev2++; continue; } // skip AA genotypes + if ( baf>0.5 ) baf = 1 - baf; // the bands should be symmetric + if ( baf<1/5.) continue; // skip RR genotypes + + double prob_cn3 = args->tmpf[k++]; + mean_cn3 += prob_cn3 * baf; + norm_cn3 += prob_cn3; + } + if ( !norm_cn3 ) + { + smpl->cell_frac = 1.0; + return 1; + } + mean_cn3 /= norm_cn3; + k = 0; + for (i=0; insites; i++) + { + float baf = smpl->baf[i]; + if ( baf>0.5 ) baf = 1 - baf; // the bands should be symmetric + if ( baf<1/5.) continue; // skip RR,AA genotypes + + double prob_cn3 = args->tmpf[k++]; + baf_dev2 += prob_cn3 * (baf - mean_cn3)*(baf - mean_cn3); + } + + /* + A noisy CN2 band is hard to distinguish from two CN3 bands which are + close to each other. Set a treshold on the minimum separation based + on the BAF deviation at p=0.95 + */ + baf_dev2 /= norm_cn3; + baf_AA_dev2 /= norm_baf_AA_dev2; + if ( baf_dev2 < baf_AA_dev2 ) baf_dev2 = baf_AA_dev2; + double max_mean_cn3 = 0.5 - sqrt(baf_dev2)*1.644854; // R: qnorm(0.95)=1.644854 + //fprintf(stderr,"dev=%f AA_dev=%f max_mean_cn3=%f mean_cn3=%f\n", baf_dev2,baf_AA_dev2,max_mean_cn3,mean_cn3); + assert( max_mean_cn3>0 ); + + double new_frac = 1./mean_cn3 - 2; + if ( mean_cn3 > max_mean_cn3 || new_frac < args->optimize_frac ) + { + // out of bounds, beyond our detection limits. Give up and say it converged + smpl->cell_frac = 1.0; + return 1; + } + if ( new_frac>1 ) new_frac = 1; + int converged = fabs(new_frac - smpl->cell_frac) < 1e-1 ? 1 : 0; + + // Update dev2, but stay within safe limits + if ( baf_dev2 > 3*smpl->baf_dev2_dflt ) baf_dev2 = 3*smpl->baf_dev2_dflt; + else if ( baf_dev2 < 0.5*smpl->baf_dev2_dflt ) baf_dev2 = 0.5*smpl->baf_dev2_dflt; + + smpl->cell_frac = new_frac; + smpl->baf_dev2 = baf_dev2; + + return converged; +} + +// Update parameters which depend on the estimated fraction of aberrant cells +// in CN3. Returns 0 if the current estimate did not need to be updated or 1 +// if there was a change. +static int update_args(args_t *args) +{ + int converged = update_sample_args(args, &args->query_sample, 0); + if ( args->control_sample.name ) + { + converged += update_sample_args(args, &args->control_sample, 1); + return converged==2 ? 0 : 1; + } + return converged ? 0 : 1; +} + +// for an approximate estimate of the number of het genotypes in a region +#define BAF_LIKELY_HET(val) (val)>0.25 && (val)<0.75 + +static void cnv_flush_viterbi(args_t *args) +{ + if ( !args->nsites ) return; + + // Set HMM transition matrix for the new chromsome again. This is for case + // Baum-Welch was used, which is experimental, largerly unsupported and not + // done by default. + hmm_t *hmm = args->hmm; + hmm_set_tprob(args->hmm, args->tprob, 10000); + + // Smooth LRR values to reduce noise + if ( args->lrr_bias > 0 ) + { + smooth_data(args->query_sample.lrr,args->nsites, args->lrr_smooth_win); + if ( args->control_sample.name ) smooth_data(args->control_sample.lrr,args->nsites, args->lrr_smooth_win); + } + + // Set the BAF peak likelihoods, such as P(RRR|CN3), taking account the + // estimated fraction of aberrant cells in the mixture. With the new chromosome, + // reset the fraction to the default value. + args->query_sample.cell_frac = args->query_sample.cell_frac_dflt; + args->control_sample.cell_frac = args->control_sample.cell_frac_dflt; + args->query_sample.baf_dev2 = args->query_sample.baf_dev2_dflt; + args->control_sample.baf_dev2 = args->control_sample.baf_dev2_dflt; + set_gauss_params(args, &args->query_sample); + if ( args->control_sample.name ) set_gauss_params(args, &args->control_sample); + + if ( args->optimize_frac ) + { + int niter = 0; + fprintf(stderr,"Attempting to estimate the fraction of aberrant cells (chr %s):\n", bcf_hdr_id2name(args->hdr,args->prev_rid)); + do + { + fprintf(stderr,"\t.. %f %f", args->query_sample.cell_frac,args->query_sample.baf_dev2); + if ( args->control_sample.name ) + fprintf(stderr,"\t.. %f %f", args->control_sample.cell_frac,args->control_sample.baf_dev2); + fprintf(stderr,"\n"); + set_emission_probs(args); + hmm_run_fwd_bwd(hmm, args->nsites, args->eprob, args->sites); + } + while ( update_args(args) && ++niter<20 ); + if ( niter>=20 ) + { + // no convergence + args->query_sample.cell_frac = args->query_sample.cell_frac_dflt; + args->control_sample.cell_frac = args->control_sample.cell_frac_dflt; + args->query_sample.baf_dev2 = args->query_sample.baf_dev2_dflt; + args->control_sample.baf_dev2 = args->control_sample.baf_dev2_dflt; + set_gauss_params(args, &args->query_sample); + if ( args->control_sample.name ) set_gauss_params(args, &args->control_sample); + } + + fprintf(stderr,"\t.. %f %f", args->query_sample.cell_frac,args->query_sample.baf_dev2); + if ( args->control_sample.name ) + fprintf(stderr,"\t.. %f %f", args->control_sample.cell_frac,args->control_sample.baf_dev2); + fprintf(stderr,"\n"); + + fprintf(args->query_sample.summary_fh,"CF\t%s\t%d\t%d\t%.2f\t%f\n", + bcf_hdr_id2name(args->hdr,args->prev_rid),args->sites[0]+1,args->sites[args->nsites-1]+1, + args->query_sample.cell_frac,sqrt(args->query_sample.baf_dev2)); + if ( args->control_sample.name ) + { + fprintf(args->control_sample.summary_fh,"CF\t%s\t%d\t%d\t%.2f\t%f\n", + bcf_hdr_id2name(args->hdr,args->prev_rid),args->sites[0]+1,args->sites[args->nsites-1]+1, + args->control_sample.cell_frac,sqrt(args->control_sample.baf_dev2)); + fprintf(args->summary_fh,"CF\t%s\t%d\t%d\t%.2f\t%.2f\t%f\t%f\n", + bcf_hdr_id2name(args->hdr,args->prev_rid),args->sites[0]+1,args->sites[args->nsites-1]+1, + args->query_sample.cell_frac, args->control_sample.cell_frac, + sqrt(args->query_sample.baf_dev2), sqrt(args->control_sample.baf_dev2)); + } + } + set_emission_probs(args); + + while ( args->baum_welch_th!=0 ) + { + int nstates = hmm_get_nstates(hmm); + double ori_ii = avg_ii_prob(nstates,hmm_get_tprob(hmm)); + hmm_run_baum_welch(hmm, args->nsites, args->eprob, args->sites); + double new_ii = avg_ii_prob(nstates,hmm_get_tprob(hmm)); + fprintf(stderr,"%e\t%e\t%e\n", ori_ii,new_ii,new_ii-ori_ii); + double *tprob = init_tprob_matrix(nstates, 1-new_ii, args->same_prob); + hmm_set_tprob(args->hmm, tprob, 10000); + double *tprob_arr = hmm_get_tprob(hmm); + free(tprob); + if ( fabs(new_ii - ori_ii) < args->baum_welch_th ) + { + int i,j; + for (i=0; insites, args->eprob, args->sites); + hmm_run_fwd_bwd(hmm, args->nsites, args->eprob, args->sites); + + + // Output the results + uint8_t *vpath = hmm_get_viterbi_path(hmm); + double qual = 0, *fwd = hmm_get_fwd_bwd_prob(hmm); + int i,j, isite, start_cn = vpath[0], start_pos = args->sites[0], istart_pos = 0; + int ctrl_ntot = 0, smpl_ntot = 0, ctrl_nhet = 0, smpl_nhet = 0; + for (isite=0; isitensites; isite++) + { + int state = vpath[args->nstates*isite]; + double *pval = fwd + isite*args->nstates; + + qual += pval[start_cn]; + + // output CN and fwd-bwd likelihood for each site + if ( args->query_sample.cn_fh ) + { + fprintf(args->query_sample.cn_fh, "%s\t%d\t%c", bcf_hdr_id2name(args->hdr,args->prev_rid), args->sites[isite]+1, copy_number_state(args,state,0)); + if ( !args->control_sample.cn_fh ) + for (i=0; instates; i++) fprintf(args->query_sample.cn_fh, "\t%f", pval[i]); + else + for (i=0; iquery_sample.cn_fh, "\t%f", sum); + } + fprintf(args->query_sample.cn_fh, "\n"); + if ( args->query_sample.baf[isite]>=0 ) // if non-missing + { + if ( BAF_LIKELY_HET(args->query_sample.baf[isite]) ) smpl_nhet++; + smpl_ntot++; + } + } + if ( args->control_sample.cn_fh ) + { + fprintf(args->control_sample.cn_fh, "%s\t%d\t%c", bcf_hdr_id2name(args->hdr,args->prev_rid), args->sites[isite]+1, copy_number_state(args,state,1)); + for (i=0; icontrol_sample.cn_fh, "\t%f", sum); + } + fprintf(args->control_sample.cn_fh, "\n"); + if ( args->control_sample.baf[isite]>=0 ) // if non-missing + { + if ( BAF_LIKELY_HET(args->control_sample.baf[isite]) ) ctrl_nhet++; + ctrl_ntot++; + } + } + + if ( start_cn != state ) + { + char start_cn_query = copy_number_state(args,start_cn,0); + qual = phred_score(1 - qual/(isite - istart_pos)); + fprintf(args->query_sample.summary_fh,"RG\t%s\t%d\t%d\t%c\t%.1f\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite],start_cn_query,qual,smpl_ntot,smpl_nhet); + + if ( args->control_sample.name ) + { + // regions 0-based, half-open + char start_cn_ctrl = copy_number_state(args,start_cn,1); + fprintf(args->control_sample.summary_fh,"RG\t%s\t%d\t%d\t%c\t%.1f\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite],start_cn_ctrl,qual,ctrl_ntot,ctrl_nhet); + fprintf(args->summary_fh,"RG\t%s\t%d\t%d\t%c\t%c\t%.1f\t%d\t%d\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite],start_cn_query,start_cn_ctrl,qual,smpl_ntot,smpl_nhet,ctrl_ntot,ctrl_nhet); + } + + istart_pos = isite; + start_pos = args->sites[isite]; + start_cn = state; + qual = 0; + smpl_ntot = smpl_nhet = ctrl_ntot = ctrl_nhet = 0; + } + } + qual = phred_score(1 - qual/(isite - istart_pos)); + char start_cn_query = copy_number_state(args,start_cn,0); + fprintf(args->query_sample.summary_fh,"RG\t%s\t%d\t%d\t%c\t%.1f\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite-1]+1,start_cn_query,qual,smpl_ntot,smpl_nhet); + if ( args->control_sample.name ) + { + char start_cn_ctrl = copy_number_state(args,start_cn,1); + fprintf(args->control_sample.summary_fh,"RG\t%s\t%d\t%d\t%c\t%.1f\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite-1]+1,start_cn_ctrl,qual,ctrl_ntot,ctrl_nhet); + fprintf(args->summary_fh,"RG\t%s\t%d\t%d\t%c\t%c\t%.1f\t%d\t%d\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite-1]+1,start_cn_query,start_cn_ctrl,qual,smpl_ntot,smpl_nhet,ctrl_ntot,ctrl_nhet); + } +} + +static int parse_lrr_baf(sample_t *smpl, bcf_fmt_t *baf_fmt, bcf_fmt_t *lrr_fmt, float *baf, float *lrr) +{ + *baf = ((float*)(baf_fmt->p + baf_fmt->size*smpl->idx))[0]; + if ( bcf_float_is_missing(*baf) || isnan(*baf) ) *baf = -0.1; // arbitrary negative value == missing value + + if ( lrr_fmt ) + { + *lrr = ((float*)(lrr_fmt->p + lrr_fmt->size*smpl->idx))[0]; + if ( bcf_float_is_missing(*lrr) || isnan(*lrr) ) { *lrr = 0; *baf = -0.1; } + } + else + *lrr = 0; + + return *baf<0 ? 0 : 1; +} + +static void cnv_next_line(args_t *args, bcf1_t *line) +{ + if ( !line ) + { + // Done, flush viterbi + cnv_flush_viterbi(args); + return; + } + + if ( line->rid!=args->prev_rid ) + { + // New chromosome + cnv_flush_viterbi(args); + args->prev_rid = line->rid; + args->nsites = 0; + args->nRR = args->nAA = args->nRA = 0; + } + + // Process line + args->ntot++; + + bcf_fmt_t *baf_fmt, *lrr_fmt = NULL; + if ( !(baf_fmt = bcf_get_fmt(args->hdr, line, "BAF")) ) return; + if ( args->lrr_bias>0 && !(lrr_fmt = bcf_get_fmt(args->hdr, line, "LRR")) ) return; + + float baf1,lrr1,baf2,lrr2; + int ret = 0; + ret += parse_lrr_baf(&args->query_sample, baf_fmt,lrr_fmt,&baf1,&lrr1); + ret += parse_lrr_baf(&args->control_sample,baf_fmt,lrr_fmt,&baf2,&lrr2); + if ( !ret ) return; + + // Realloc buffers needed to store observed data and used by viterbi and fwd-bwd + args->nsites++; + int m = args->msites; + hts_expand(uint32_t,args->nsites,args->msites,args->sites); + if ( args->msites!=m ) + { + args->eprob = (double*) realloc(args->eprob,sizeof(double)*args->msites*args->nstates); + if ( args->control_sample.name ) + { + args->control_sample.lrr = (float*) realloc(args->control_sample.lrr,sizeof(float)*args->msites); + args->control_sample.baf = (float*) realloc(args->control_sample.baf,sizeof(float)*args->msites); + } + args->query_sample.lrr = (float*) realloc(args->query_sample.lrr,sizeof(float)*args->msites); + args->query_sample.baf = (float*) realloc(args->query_sample.baf,sizeof(float)*args->msites); + if ( args->af_fname ) + args->nonref_afs = (float*) realloc(args->nonref_afs,sizeof(float)*args->msites); + } + args->sites[args->nsites-1] = line->pos; + args->query_sample.lrr[args->nsites-1] = lrr1; + args->query_sample.baf[args->nsites-1] = baf1; + if ( args->af_fname ) + { + double alt_freq; + args->nonref_afs[args->nsites-1] = read_AF(args->files->targets,line,&alt_freq)<0 ? args->nonref_af_dflt : alt_freq; + } + if ( args->control_sample.name ) + { + args->control_sample.lrr[args->nsites-1] = lrr2; + args->control_sample.baf[args->nsites-1] = baf2; + if ( baf2>=0 ) // skip missing values + fprintf(args->control_sample.dat_fh,"%s\t%"PRId64"\t%.3f\t%.3f\n",bcf_hdr_id2name(args->hdr,args->prev_rid), (int64_t) line->pos+1,baf2,lrr2); + } + if ( baf1>=0 ) // skip missing values + fprintf(args->query_sample.dat_fh,"%s\t%"PRId64"\t%.3f\t%.3f\n",bcf_hdr_id2name(args->hdr,args->prev_rid), (int64_t) line->pos+1,baf1,lrr1); + + if ( baf1>=0 ) + { + if ( baf1<1/5. ) args->nRR++; + else if ( baf1>4/5. ) args->nAA++; + else args->nRA++; + } + args->nused++; +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Copy number variation caller, requires Illumina's B-allele frequency (BAF) and Log R\n"); + fprintf(stderr, " Ratio intensity (LRR). The HMM considers the following copy number states: CN 2\n"); + fprintf(stderr, " (normal), 1 (single-copy loss), 0 (complete loss), 3 (single-copy gain)\n"); + fprintf(stderr, "Usage: bcftools cnv [OPTIONS] FILE.vcf\n"); + fprintf(stderr, "General Options:\n"); + fprintf(stderr, " -c, --control-sample STRING Optional control sample name to highlight differences\n"); + fprintf(stderr, " -f, --AF-file FILE Read allele frequencies from file (CHR\\tPOS\\tREF,ALT\\tAF)\n"); + fprintf(stderr, " -o, --output-dir PATH \n"); + fprintf(stderr, " -p, --plot-threshold FLOAT Plot aberrant chromosomes with quality at least FLOAT\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --query-sample STRING Query samply name\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, "HMM Options:\n"); + fprintf(stderr, " -a, --aberrant FLOAT[,FLOAT] Fraction of aberrant cells in query and control [1.0,1.0]\n"); + fprintf(stderr, " -b, --BAF-weight FLOAT Relative contribution from BAF [1]\n"); + fprintf(stderr, " -d, --BAF-dev FLOAT[,FLOAT] Expected BAF deviation in query and control [0.04,0.04]\n"); // experimental + fprintf(stderr, " -e, --err-prob FLOAT Uniform error probability [1e-4]\n"); + fprintf(stderr, " -k, --LRR-dev FLOAT[,FLOAT] Expected LRR deviation [0.2,0.2]\n"); // experimental + fprintf(stderr, " -l, --LRR-weight FLOAT Relative contribution from LRR [0.2]\n"); + fprintf(stderr, " -L, --LRR-smooth-win INT Window of LRR moving average smoothing [10]\n"); + fprintf(stderr, " -O, --optimize FLOAT Estimate fraction of aberrant cells down to FLOAT [1.0]\n"); + fprintf(stderr, " -P, --same-prob FLOA> Prior probability of -s/-c being the same [0.5]\n"); + fprintf(stderr, " -x, --xy-prob FLOAT P(x|y) transition probability [1e-9]\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfcnv(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->plot_th = 1e9; // by default plot none + args->nonref_af_dflt = 0.1; + args->lrr_smooth_win = 10; + + args->query_sample.cell_frac_dflt = 1; + args->control_sample.cell_frac_dflt = 1; + + // How much FORMAT/LRR and FORMAT/BAF matter + args->lrr_bias = 0.2; + args->baf_bias = 1.0; + args->err_prob = 1e-4; + + // Transition probability to a different state and the prior of both samples being the same + args->ij_prob = 1e-9; + args->same_prob = 0.5; + + // Squared std dev of BAF and LRR values (gaussian noise), estimated from real data (hets, one sample, one chr) + args->query_sample.baf_dev2_dflt = args->control_sample.baf_dev2_dflt = 0.04*0.04; // illumina: 0.03 + args->query_sample.lrr_dev2 = args->control_sample.lrr_dev2 = 0.2*0.2; //0.20*0.20; // illumina: 0.18 + + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"BAF-dev",1,0,'d'}, + {"LRR-dev",1,0,'k'}, + {"LRR-smooth-win",1,0,'L'}, + {"AF-file",1,0,'f'}, + {"baum-welch",1,0,'W'}, // hidden + {"optimize",1,0,'O'}, + {"aberrant",1,0,'a'}, + {"err-prob",1,0,'e'}, + {"BAF-weight",1,0,'b'}, + {"LRR-weight",1,0,'l'}, + {"same-prob",1,0,'P'}, + {"xy-prob",1,0,'x'}, + {"query-sample",1,0,'s'}, + {"control-sample",1,0,'c'}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,4}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"plot-threshold",1,0,'p'}, + {"output-dir",1,0,'o'}, + {0,0,0,0} + }; + char *tmp = NULL; + while ((c = getopt_long(argc, argv, "h?r:R:t:T:s:o:p:l:T:c:b:P:x:e:O:W:f:a:L:d:k:",loptions,NULL)) >= 0) { + switch (c) { + case 'L': + args->lrr_smooth_win = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse: --LRR-smooth-win %s\n", optarg); + break; + case 'f': args->af_fname = optarg; break; + case 'O': + args->optimize_frac = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -O %s\n", optarg); + break; + case 'd': + args->query_sample.baf_dev2_dflt = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',') error("Could not parse: -d %s\n", optarg); + args->control_sample.baf_dev2_dflt = strtod(tmp+1,&tmp); + if ( *tmp ) error("Could not parse: -d %s\n", optarg); + } + else + args->control_sample.baf_dev2_dflt = args->query_sample.baf_dev2_dflt; + args->query_sample.baf_dev2_dflt *= args->query_sample.baf_dev2_dflt; + args->control_sample.baf_dev2_dflt *= args->control_sample.baf_dev2_dflt; + break; + case 'k': + args->query_sample.lrr_dev2 = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',') error("Could not parse: -k %s\n", optarg); + args->control_sample.lrr_dev2 = strtod(tmp+1,&tmp); + if ( *tmp ) error("Could not parse: -d %s\n", optarg); + } + else + args->control_sample.lrr_dev2 = args->query_sample.lrr_dev2; + args->query_sample.lrr_dev2 *= args->query_sample.lrr_dev2; + args->control_sample.lrr_dev2 *= args->control_sample.lrr_dev2; + break; + case 'a': + args->query_sample.cell_frac_dflt = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',') error("Could not parse: -a %s\n", optarg); + args->control_sample.cell_frac_dflt = strtod(tmp+1,&tmp); + if ( *tmp ) error("Could not parse: -a %s\n", optarg); + } + break; + case 'W': + args->baum_welch_th = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -W %s\n", optarg); + break; + case 'e': + args->err_prob = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -e %s\n", optarg); + break; + case 'b': + args->baf_bias = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -b %s\n", optarg); + break; + case 'x': + args->ij_prob = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -x %s\n", optarg); + break; + case 'P': + args->same_prob = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -P %s\n", optarg); + break; + case 'l': + args->lrr_bias = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -l %s\n", optarg); + break; + case 'p': + args->plot_th = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -p %s\n", optarg); + break; + case 'o': args->output_dir = optarg; break; + case 's': args->query_sample.name = strdup(optarg); break; + case 'c': args->control_sample.name = optarg; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 4 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; + } + else fname = argv[optind]; + if ( !fname ) usage(args); + + if ( !args->output_dir ) error("Expected -o option\n"); + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( args->af_fname ) + { + if ( bcf_sr_set_targets(args->files, args->af_fname, 1, 3)<0 ) + error("Failed to read the targets: %s\n", args->af_fname); + } + if ( !bcf_sr_add_reader(args->files, fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + cnv_next_line(args, line); + } + cnv_next_line(args, NULL); + create_plots(args); + fprintf(stderr,"Number of lines: total/processed: %d/%d\n", args->ntot,args->nused); + destroy_data(args); + free(args); + return 0; +} + + diff --git a/bcftools/vcfcnv.c.pysam.c b/bcftools/vcfcnv.c.pysam.c new file mode 100644 index 0000000..fd2e3bb --- /dev/null +++ b/bcftools/vcfcnv.c.pysam.c @@ -0,0 +1,1440 @@ +#include "bcftools.pysam.h" + +/* The MIT License + + Copyright (c) 2014-2022 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +/* + Known issues: + - The --AF-file option behaves like --targets-file, sites not listed in the AFs + are skipped. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "HMM.h" +#include "rbuf.h" + +#define DBG0 0 + +#define N_STATES 4 +#define CN0 0 +#define CN1 1 +#define CN2 2 +#define CN3 3 + +typedef struct +{ + float mean, dev2, norm; +} +gauss_param_t; + +typedef struct +{ + char *name; + int idx; // VCF sample index + float *lrr,*baf, baf_dev2, baf_dev2_dflt, lrr_dev2; + float cell_frac, cell_frac_dflt; + gauss_param_t gauss_param[18]; + double pobs[N_STATES]; + FILE *dat_fh, *cn_fh, *summary_fh; + char *dat_fname, *cn_fname, *summary_fname; +} +sample_t; + +typedef struct _args_t +{ + bcf_srs_t *files; + bcf_hdr_t *hdr; + int prev_rid, ntot, nused; + sample_t query_sample, control_sample; + + int nstates; // number of states: N_STATES for one sample, N_STATES^2 for two samples + double lrr_bias, baf_bias; // LRR/BAF weights + double same_prob, ij_prob; // prior of both samples being the same and the transition probability P(i|j) + double err_prob; // constant probability of erroneous measurement + float *nonref_afs, nonref_af, nonref_af_dflt, fRR, fRA, fAA, *tmpf; + unsigned long int nRR, nRA, nAA; + int mtmpf; + + double *tprob, *tprob_arr; // array of transition matrices, precalculated up to ntprob_arr positions + double *iprobs; // states' initial probabilities + int ntprob_arr; + + hmm_t *hmm; + double *eprob; // emission probs [nstates*nsites,msites] + uint32_t *sites; // positions [nsites,msites] + int nsites, msites; + + double baum_welch_th, optimize_frac; + float plot_th; + FILE *summary_fh; + char **argv, *regions_list, *summary_fname, *output_dir; + char *targets_list, *af_fname; + int argc, verbose, lrr_smooth_win; +} +args_t; + +FILE *open_file(char **fname, const char *mode, const char *fmt, ...); + +static inline void hmm2cn_state(int nstates, int i, int *a, int *b) +{ + *a = i / N_STATES; + *b = i - (*a)*N_STATES; +} +static double *init_tprob_matrix(int ndim, double ij_prob, double same_prob) +{ + int i,j; + double *mat = (double*) malloc(sizeof(double)*ndim*ndim); + + assert( ndim==N_STATES || ndim==N_STATES*N_STATES); + + if ( ndim==N_STATES ) // one sample + { + double pii = 1 - ij_prob*(N_STATES-1); + if ( pii < ij_prob ) error("Error: -x set a bit too high, P(x|x) < P(x|y): %e vs %e\n", pii,ij_prob); + for (j=0; jdat_fh = open_file(&smpl->dat_fname,"w","%s/dat.%s.tab",dir,smpl->name); + if ( !smpl->dat_fh ) error("Error opening file: %s/dat.%s.tab\n",dir,smpl->name); + + smpl->cn_fh = open_file(&smpl->cn_fname,"w","%s/cn.%s.tab",dir,smpl->name); + if ( !smpl->cn_fh ) error("Error opening file: %s/cn.%s.tab\n",dir,smpl->name); + + smpl->summary_fh = open_file(&smpl->summary_fname,"w","%s/summary.%s.tab",dir,smpl->name); + if ( !smpl->summary_fh ) error("Error opening file: %s/summary.%s.tab\n",dir,smpl->name); + + fprintf(smpl->dat_fh,"# [1]Chromosome\t[2]Position\t[3]BAF\t[4]LRR\n"); + fprintf(smpl->cn_fh,"# [1]Chromosome\t[2]Position\t[3]CN\t[4]P(CN0)\t[5]P(CN1)\t[6]P(CN2)\t[7]P(CN3)\n"); + fprintf(smpl->summary_fh,"# RG, Regions [2]Chromosome\t[3]Start\t[4]End\t[5]Copy Number state\t[6]Quality\t[7]nSites\t[8]nHETs\n"); +} +static void close_sample_files(sample_t *smpl) +{ + if ( fclose(smpl->dat_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,smpl->dat_fname); + if ( fclose(smpl->cn_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,smpl->cn_fname); + if ( fclose(smpl->summary_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,smpl->summary_fname); +} + +static double norm_cdf(double mean, double dev); +static void init_data(args_t *args) +{ + args->prev_rid = -1; + args->hdr = args->files->readers[0].header; + + if ( !args->query_sample.name ) + { + if ( bcf_hdr_nsamples(args->hdr)>1 ) error("Multi-sample VCF, missing the -s option\n"); + args->query_sample.name = strdup(args->hdr->samples[0]); + } + else + if ( bcf_hdr_id2int(args->hdr,BCF_DT_SAMPLE,args->query_sample.name)<0 ) error("The sample \"%s\" not found\n", args->query_sample.name); + if ( !args->files->readers[0].file->is_bin ) + { + int ret; + kstring_t tmp = {0,0,0}; + if ( args->control_sample.name ) + { + ksprintf(&tmp, "%s,%s", args->query_sample.name,args->control_sample.name); + ret = bcf_hdr_set_samples(args->hdr, tmp.s, 0); + } + else + { + ret = bcf_hdr_set_samples(args->hdr, args->query_sample.name, 0); + tmp.s = args->query_sample.name; + } + if ( ret<0 ) error("Error parsing the list of samples: %s\n", tmp.s); + else if ( ret>0 ) error("The sample not found in the VCF: %s\n", ret==1 ? args->query_sample.name : args->control_sample.name); + + if ( args->control_sample.name ) free(tmp.s); + } + args->query_sample.idx = bcf_hdr_id2int(args->hdr,BCF_DT_SAMPLE,args->query_sample.name); + args->control_sample.idx = args->control_sample.name ? bcf_hdr_id2int(args->hdr,BCF_DT_SAMPLE,args->control_sample.name) : -1; + args->nstates = args->control_sample.name ? N_STATES*N_STATES : N_STATES; + args->tprob = init_tprob_matrix(args->nstates, args->ij_prob, args->same_prob); + args->iprobs = init_iprobs(args->nstates, args->same_prob); + args->hmm = hmm_init(args->nstates, args->tprob, 10000); + hmm_init_states(args->hmm, args->iprobs); + + args->summary_fh = bcftools_stdout; + init_sample_files(&args->query_sample, args->output_dir); + if ( args->control_sample.name ) + { + init_sample_files(&args->control_sample, args->output_dir); + args->summary_fh = open_file(&args->summary_fname,"w","%s/summary.tab",args->output_dir); + } + else + args->summary_fh = NULL; // one sample only, no two-file summary + + + int i; + FILE *fh = args->summary_fh ? args->summary_fh : args->query_sample.summary_fh; + + fprintf(fh, "# This file was produced by: bcftools cnv(%s+htslib-%s)\n", bcftools_version(),hts_version()); + fprintf(fh, "# The command line was:\tbcftools %s", args->argv[0]); + for (i=1; iargc; i++) fprintf(fh, " %s",args->argv[i]); + if ( args->control_sample.name ) + fprintf(fh, "\n#\n" + "# RG, Regions\t[2]Chromosome\t[3]Start\t[4]End\t[5]Copy number:%s\t[6]Copy number:%s\t[7]Quality" + "\t[8]nSites in (5)\t[9]nHETs in (5)\t[10]nSites in (6)\t[11]nHETs in(6)\n", + args->query_sample.name,args->control_sample.name + ); + else + fprintf(fh, "\n#\n" + "# RG, Regions\t[2]Chromosome\t[3]Start\t[4]End\t[5]Copy number:%s\t[6]Quality\t[7]nSites\t[8]nHETs\n", + args->query_sample.name + ); + if ( args->optimize_frac ) + { + fprintf(args->query_sample.summary_fh, "# CF, cell fraction estimate\t[2]Chromosome\t[3]Start\t[4]End\t[5]Cell fraction\t[6]BAF deviation\n"); + if ( args->control_sample.name ) + { + fprintf(args->control_sample.summary_fh, "# CF, cell fraction estimate\t[2]Chromosome\t[3]Start\t[4]End\t[5]Cell fraction\t[6]BAF deviation\n"); + fprintf(args->summary_fh, "# CF, cell fraction estimate\t[2]Chromosome\t[3]Start\t[4]End\t" + "[5]Cell fraction:%s\t[6]Cell fraction:%s\t[7]BAF deviation:%s\t[8]BAF deviation:%s\n", + args->query_sample.name,args->control_sample.name, + args->query_sample.name,args->control_sample.name + ); + } + } +} + +char *msprintf(const char *fmt, ...); +static void py_plot_cnv(char *script, float th) +{ + if ( th>100 ) return; // create no plots + + char *cmd = msprintf("python %s -p %f", script, th); + int ret = system(cmd); + if ( ret) fprintf(bcftools_stderr, "The command returned non-zero status %d: %s\n", ret, cmd); + free(cmd); +} + +static void plot_sample(args_t *args, sample_t *smpl) +{ + char *fname; + FILE *fp = open_file(&fname,"w","%s/plot.%s.py",args->output_dir,smpl->name); + fprintf(fp, + "import matplotlib as mpl\n" + "mpl.use('Agg')\n" + "import matplotlib.pyplot as plt\n" + "import csv\n" + "import numpy as np\n" + "csv.register_dialect('tab', delimiter='\\t', quoting=csv.QUOTE_NONE)\n" + "\n" + "dat = {}\n" + "with open('%s', 'r') as f:\n" + " reader = csv.reader(f, 'tab')\n" + " for row in reader:\n" + " chr = row[0]\n" + " if chr[0]=='#': continue\n" + " if chr not in dat: dat[chr] = []\n" + " dat[chr].append([int(row[1]), float(row[2]), float(row[3])])\n" + "\n" + "cnv = {}\n" + "with open('%s', 'r') as f:\n" + " reader = csv.reader(f, 'tab')\n" + " for row in reader:\n" + " chr = row[0]\n" + " if chr[0]=='#': continue\n" + " if chr not in cnv: cnv[chr] = []\n" + " row[2] = int(row[2]) + 0.5\n" + " row[1] = int(row[1])\n" + " cnv[chr].append(row[1:])\n" + "\n" + "for chr in dat:\n" + " fig,(ax1, ax2, ax3) = plt.subplots(3,1,figsize=(10,8),sharex=True)\n" + " ax1.plot([x[0] for x in dat[chr]],[x[2] for x in dat[chr]], '.', ms=3)\n" + " ax2.plot([x[0] for x in dat[chr]],[x[1] for x in dat[chr]], '.', ms=3)\n" + " cn_dat = cnv[chr]\n" + " xgrid = [float(x[0]) for x in cn_dat]\n" + " ygrid = np.linspace(0,5,6)\n" + " xgrid, ygrid = np.meshgrid(xgrid, ygrid)\n" + " heat = np.zeros_like(xgrid)\n" + " for x in range(len(heat[0])-1):\n" + " heat[0][x] = cn_dat[x][2]\n" + " heat[1][x] = cn_dat[x][3]\n" + " heat[2][x] = cn_dat[x][4]\n" + " heat[3][x] = cn_dat[x][5]\n" + " mesh = ax3.pcolormesh(xgrid, ygrid, heat, cmap='bwr_r', shading='auto', alpha=0)\n" + " mesh.set_clim(vmin=-1,vmax=1)\n" + " ax3.plot([x[0] for x in cn_dat],[x[1] for x in cn_dat],'.-',ms=3,color='black')\n" + " fig.suptitle('%s (chr '+chr+')')\n" + " ax1.set_title('Log-R intensities Ratio',fontsize=10)\n" + " ax2.set_title('B-Allele Frequency',fontsize=10)\n" + " ax3.set_title('Copy Number Variation',fontsize=10)\n" + " ax1.set_ylabel('LRR')\n" + " ax2.set_ylabel('BAF')\n" + " ax3.set_ylabel('CN')\n" + " ax3.set_xlabel('Coordinate (chrom '+chr+')',fontsize=10)\n" + " ax3.set_ylim(-0.1,4.1)\n" + " ax3.set_yticks([0.5,1.5,2.5,3.5])\n" + " ax3.set_yticklabels(['CN0','CN1','CN2','CN3'])\n" + " plt.subplots_adjust(left=0.08,right=0.95,bottom=0.08,top=0.92)\n" + " plt.savefig('%s/plot.%s.chr'+chr+'.png')\n" + " plt.close()\n" + "\n", + smpl->dat_fname,smpl->cn_fname,smpl->name,args->output_dir,smpl->name + ); + fclose(fp); + + py_plot_cnv(fname, args->plot_th); + free(fname); +} + +static void create_plots(args_t *args) +{ + close_sample_files(&args->query_sample); + if ( args->control_sample.name ) close_sample_files(&args->control_sample); + if ( args->summary_fh ) fclose(args->summary_fh); + + if ( !args->control_sample.name ) + { + plot_sample(args, &args->query_sample); + return; + } + + char *fname; + FILE *fp = open_file(&fname,"w","%s/plot.%s.%s.py",args->output_dir,args->control_sample.name,args->query_sample.name); + fprintf(fp, + "import matplotlib as mpl\n" + "mpl.use('Agg')\n" + "import matplotlib.pyplot as plt\n" + "import csv,argparse\n" + "import numpy as np\n" + "csv.register_dialect('tab', delimiter='\\t', quoting=csv.QUOTE_NONE)\n" + "\n" + "control_sample = '%s'\n" + "query_sample = '%s'\n" + "\n" + "parser = argparse.ArgumentParser()\n" + "parser.add_argument('-p', '--plot-threshold', type=float)\n" + "parser.add_argument('-c', '--chromosome')\n" + "args = parser.parse_args()\n" + "if args.plot_threshold==None: args.plot_threshold = 0\n" + "\n" + "def chroms_to_plot(th):\n" + " dat = {}\n" + " with open('%s/summary.tab', 'r') as f:\n" + " reader = csv.reader(f, 'tab')\n" + " for row in reader:\n" + " if row[0]!='RG': continue\n" + " chr = row[1]\n" + " start = row[2]\n" + " end = row[3]\n" + " qual = float(row[6])\n" + " if row[4]==row[5] and args.plot_threshold!=0: continue\n" + " if chr not in dat: dat[chr] = 0.0\n" + " if qual > dat[chr]: dat[chr] = qual\n" + " out = {}\n" + " for chr in dat:\n" + " if (chr not in dat) or dat[chr]0: diff.append([b[i-1][0],b[i-1][1],a[i-1][1]])\n" + " diff.append([b[i][0],b[i][1],a[i][1]])\n" + " elif len(diff):\n" + " diff.append([b[i][0],b[i][1],a[i][1]])\n" + " out.append(diff)\n" + " diff = []\n" + " if len(diff): out.append(diff)\n" + " return out\n" + "\n" + "for chr in sorted(plot_chroms.keys()):\n" + " control_dat = []\n" + " control_cnv = []\n" + " query_dat = []\n" + " query_cnv = []\n" + " read_dat('%s',control_dat,chr)\n" + " read_dat('%s',query_dat,chr)\n" + " read_cnv('%s',control_cnv,chr)\n" + " read_cnv('%s',query_cnv,chr)\n" + "\n" + " fig,(ax1,ax2,ax3,ax4,ax5,ax6) = plt.subplots(6,1,figsize=(10,8),sharex=True)\n" + " ax1.plot([x[0] for x in control_dat],[x[2] for x in control_dat], '.', ms=3,color='red')\n" + " ax2.plot([x[0] for x in control_dat],[x[1] for x in control_dat], '.', ms=3,color='red')\n" + " cn_dat = control_cnv\n" + " xgrid = [float(x[0]) for x in cn_dat]\n" + " ygrid = np.linspace(0,5,6)\n" + " xgrid, ygrid = np.meshgrid(xgrid, ygrid)\n" + " heat = np.zeros_like(xgrid)\n" + " for x in range(len(heat[0])-1):\n" + " heat[0][x] = cn_dat[x][2]\n" + " heat[1][x] = cn_dat[x][3]\n" + " heat[2][x] = cn_dat[x][4]\n" + " heat[3][x] = cn_dat[x][5]\n" + " mesh = ax3.pcolormesh(xgrid, ygrid, heat, cmap='bwr', shading='auto', alpha=0)\n" + " mesh.set_clim(vmin=-1,vmax=1)\n" + " ax3.plot([x[0] for x in cn_dat],[x[1] for x in cn_dat],'-',ms=3,color='black',lw=1.7)\n" + "\n" + " ax6.plot([x[0] for x in query_dat],[x[2] for x in query_dat], '.', ms=3)\n" + " ax5.plot([x[0] for x in query_dat],[x[1] for x in query_dat], '.', ms=3)\n" + " cn_dat = query_cnv\n" + " xgrid = [float(x[0]) for x in cn_dat]\n" + " ygrid = np.linspace(0,5,6)\n" + " xgrid, ygrid = np.meshgrid(xgrid, ygrid)\n" + " heat = np.zeros_like(xgrid)\n" + " for x in range(len(heat[0])-1):\n" + " heat[0][x] = cn_dat[x][2]\n" + " heat[1][x] = cn_dat[x][3]\n" + " heat[2][x] = cn_dat[x][4]\n" + " heat[3][x] = cn_dat[x][5]\n" + " mesh = ax4.pcolormesh(xgrid, ygrid, heat, cmap='bwr_r')\n" + " mesh.set_clim(vmin=-1,vmax=1)\n" + " ax4.plot([x[0] for x in cn_dat],[x[1] for x in cn_dat],'-',ms=3,color='black',lw=1.7)\n" + " ax3.annotate(control_sample, xy=(0.02,0.1), xycoords='axes fraction', color='red',fontsize=12, va='bottom',ha='left')\n" + " ax4.annotate(query_sample, xy=(0.02,0.9), xycoords='axes fraction', color='blue',fontsize=12, va='top',ha='left')\n" + "\n" + " diffs = find_diffs(control_cnv,query_cnv)\n" + " for diff in diffs:\n" + " ax3.plot([x[0] for x in diff],[x[1] for x in diff],'-',ms=3,color='blue',lw=1.7)\n" + " ax4.plot([x[0] for x in diff],[x[2] for x in diff],'-',ms=3,color='red',lw=1.7)\n" + "\n" + " fig.suptitle('chr '+chr+', '+control_sample+' vs '+query_sample)\n" + " ax1.tick_params(axis='both', labelsize=8)\n" + " ax2.tick_params(axis='both', labelsize=8)\n" + " ax3.tick_params(axis='both', labelsize=8)\n" + " ax4.tick_params(axis='both', labelsize=8)\n" + " ax5.tick_params(axis='both', labelsize=8)\n" + " ax6.tick_params(axis='both', labelsize=8)\n" + " ax6.set_xlabel('Coordinate (chrom '+chr+')',fontsize=8)\n" + " ax1.set_ylabel('LRR')\n" + " ax2.set_ylabel('BAF')\n" + " ax3.set_ylabel('CN')\n" + " ax6.set_ylabel('LRR')\n" + " ax5.set_ylabel('BAF')\n" + " ax4.set_ylabel('CN')\n" + " ax3.set_ylim(-0.1,4.1)\n" + " ax3.set_yticks([0.5,1.5,2.5,3.5])\n" + " ax3.set_yticklabels(['CN0','CN1','CN2','CN3'])\n" + " ax4.set_ylim(-0.1,4.1)\n" + " ax4.set_yticks([0.5,1.5,2.5,3.5])\n" + " ax4.set_yticklabels(['CN0','CN1','CN2','CN3'])\n" + " plt.subplots_adjust(left=0.08,right=0.95,bottom=0.08,top=0.92,hspace=0)\n" + " plt.savefig('%s/plot.%s.%s.chr'+chr+'.png')\n" + " plt.close()\n" + "\n", + args->control_sample.name,args->query_sample.name, + args->output_dir, + args->control_sample.dat_fname,args->query_sample.dat_fname, + args->control_sample.cn_fname,args->query_sample.cn_fname, + args->output_dir,args->control_sample.name,args->query_sample.name + ); + fclose(fp); + + py_plot_cnv(fname,args->plot_th); + free(fname); +} + +static void destroy_data(args_t *args) +{ + bcf_sr_destroy(args->files); + hmm_destroy(args->hmm); + free(args->tmpf); + free(args->sites); + free(args->eprob); + free(args->tprob); + free(args->iprobs); + free(args->summary_fname); + free(args->nonref_afs); + free(args->query_sample.baf); + free(args->query_sample.lrr); + free(args->control_sample.baf); + free(args->control_sample.lrr); + free(args->query_sample.name); + free(args->query_sample.dat_fname); + free(args->query_sample.cn_fname); + free(args->query_sample.summary_fname); + free(args->control_sample.dat_fname); + free(args->control_sample.cn_fname); + free(args->control_sample.summary_fname); +} + +static inline char copy_number_state(args_t *args, int istate, int ismpl) +{ + char code[] = "01234"; + if ( !args->control_sample.name ) return code[istate]; + int idx = ismpl ? istate - (istate/N_STATES)*N_STATES : istate/N_STATES; + return code[idx]; +} + +static double avg_ii_prob(int n, double *mat) +{ + int i; + double avg = 0; + for (i=0; igauss_param[0])) +#define GAUSS_CN1_PK_A(smpl) (&((smpl)->gauss_param[1])) +#define GAUSS_CN2_PK_RR(smpl) (&((smpl)->gauss_param[2])) +#define GAUSS_CN2_PK_RA(smpl) (&((smpl)->gauss_param[3])) +#define GAUSS_CN2_PK_AA(smpl) (&((smpl)->gauss_param[4])) +#define GAUSS_CN3_PK_RRR(smpl) (&((smpl)->gauss_param[5])) +#define GAUSS_CN3_PK_RRA(smpl) (&((smpl)->gauss_param[6])) +#define GAUSS_CN3_PK_RAA(smpl) (&((smpl)->gauss_param[7])) +#define GAUSS_CN3_PK_AAA(smpl) (&((smpl)->gauss_param[8])) + +static inline double norm_prob(double baf, gauss_param_t *param) +{ + return exp(-(baf-param->mean)*(baf-param->mean)*0.5/param->dev2) / param->norm / sqrt(2*M_PI*param->dev2); +} + +static int set_observed_prob(args_t *args, sample_t *smpl, int isite) +{ + float baf = smpl->baf[isite]; + float lrr = args->lrr_bias>0 ? smpl->lrr[isite] : 0; + + float fRR = args->fRR; + float fRA = args->fRA; + float fAA = args->fAA; + + if ( baf<0 ) + { + // no call: either some technical issue or the call could not be made because it is CN0 + int i; + smpl->pobs[CN0] = 0.5; + for (i=1; ipobs[i] = (1.0-smpl->pobs[CN0])/(N_STATES-1); + return 0; + } + + double cn1_baf = + norm_prob(baf,GAUSS_CN1_PK_R(smpl)) * (fRR + fRA*0.5) + + norm_prob(baf,GAUSS_CN1_PK_A(smpl)) * (fAA + fRA*0.5) ; + double cn2_baf = + norm_prob(baf,GAUSS_CN2_PK_RR(smpl)) * fRR + + norm_prob(baf,GAUSS_CN2_PK_RA(smpl)) * fRA + + norm_prob(baf,GAUSS_CN2_PK_AA(smpl)) * fAA; + double cn3_baf = + norm_prob(baf,GAUSS_CN3_PK_RRR(smpl)) * fRR + + norm_prob(baf,GAUSS_CN3_PK_RRA(smpl)) * fRA*0.5 + + norm_prob(baf,GAUSS_CN3_PK_RAA(smpl)) * fRA*0.5 + + norm_prob(baf,GAUSS_CN3_PK_AAA(smpl)) * fAA; + + double norm = cn1_baf + cn2_baf + cn3_baf; + cn1_baf /= norm; + cn2_baf /= norm; + cn3_baf /= norm; + + #if DBG0 + if ( args->verbose ) fprintf(bcftools_stderr,"%f\t%f %f %f\n", baf,cn1_baf,cn2_baf,cn3_baf); + #endif + + double cn1_lrr = exp(-(lrr + 0.45)*(lrr + 0.45)/smpl->lrr_dev2); + double cn2_lrr = exp(-(lrr - 0.00)*(lrr - 0.00)/smpl->lrr_dev2); + double cn3_lrr = exp(-(lrr - 0.30)*(lrr - 0.30)/smpl->lrr_dev2); + + smpl->pobs[CN0] = 0; + smpl->pobs[CN1] = args->err_prob + (1 - args->baf_bias + args->baf_bias*cn1_baf)*(1 - args->lrr_bias + args->lrr_bias*cn1_lrr); + smpl->pobs[CN2] = args->err_prob + (1 - args->baf_bias + args->baf_bias*cn2_baf)*(1 - args->lrr_bias + args->lrr_bias*cn2_lrr); + smpl->pobs[CN3] = args->err_prob + (1 - args->baf_bias + args->baf_bias*cn3_baf)*(1 - args->lrr_bias + args->lrr_bias*cn3_lrr); + + return 0; +} + +static void set_emission_prob(args_t *args, int isite) +{ + double *eprob = &args->eprob[args->nstates*isite]; + int i; + for (i=0; iquery_sample.pobs[i]; +} + +static void set_emission_prob2(args_t *args, int isite) +{ + double *eprob = &args->eprob[args->nstates*isite]; + int i, j; + for (i=0; iquery_sample.pobs[i]*args->control_sample.pobs[j]; + } + } +} + +static void set_gauss_params(args_t *args, sample_t *smpl); +static double norm_cdf(double mean, double dev) +{ + double bot = 0, top = 1; + top = 1 - 0.5*erfc((top-mean)/(dev*sqrt(2))); + bot = 1 - 0.5*erfc((bot-mean)/(dev*sqrt(2))); + return top-bot; +} + +static void set_emission_probs(args_t *args) +{ + if ( !args->af_fname ) + { + args->fRR = 0.76; + args->fRA = 0.14; + args->fAA = 0.098; + } + + set_gauss_params(args, &args->query_sample); + if ( args->control_sample.name ) set_gauss_params(args, &args->control_sample); + + #if DBG0 + args->verbose = 1; + args->query_sample.baf[0] = 0; set_observed_prob(args,&args->query_sample,0); + args->query_sample.baf[0] = 1/3.; set_observed_prob(args,&args->query_sample,0); + args->query_sample.baf[0] = 1/2.; set_observed_prob(args,&args->query_sample,0); + args->query_sample.baf[0] = 2/3.; set_observed_prob(args,&args->query_sample,0); + args->query_sample.baf[0] = 1; set_observed_prob(args,&args->query_sample,0); + args->verbose = 0; + #endif + + int i; + for (i=0; insites; i++) + { + if ( args->af_fname ) + { + args->fRR = (1-args->nonref_afs[i])*(1-args->nonref_afs[i]); + args->fRA = 2*args->nonref_afs[i]*(1-args->nonref_afs[i]); + args->fAA = args->nonref_afs[i]*args->nonref_afs[i]; + } + set_observed_prob(args,&args->query_sample,i); + if ( args->control_sample.name ) + { + set_observed_prob(args,&args->control_sample,i); + set_emission_prob2(args,i); + } + else + set_emission_prob(args,i); + } +} + +static void smooth_data(float *dat, int ndat, int win) +{ + if ( win<=1 ) return; + + int i,j, k1 = win/2, k2 = win-k1; + rbuf_t rbuf; + rbuf_init(&rbuf,win); + float sum = 0, *buf = (float*)malloc(sizeof(float)*win); + for (i=0; i=k1 ) + { + j = rbuf_shift(&rbuf); + sum -= buf[j]; + } + if ( i+k2gauss_param[i].dev2 = smpl->baf_dev2; + + double dev = sqrt(smpl->baf_dev2); + + GAUSS_CN1_PK_R(smpl)->mean = 0; + GAUSS_CN1_PK_A(smpl)->mean = 1; + GAUSS_CN1_PK_R(smpl)->norm = norm_cdf(GAUSS_CN1_PK_R(smpl)->mean,dev); + GAUSS_CN1_PK_A(smpl)->norm = norm_cdf(GAUSS_CN1_PK_A(smpl)->mean,dev); + + GAUSS_CN2_PK_RR(smpl)->mean = 0; + GAUSS_CN2_PK_RA(smpl)->mean = 0.5; + GAUSS_CN2_PK_AA(smpl)->mean = 1; + GAUSS_CN2_PK_RR(smpl)->norm = norm_cdf(GAUSS_CN2_PK_RR(smpl)->mean,dev); + GAUSS_CN2_PK_RA(smpl)->norm = norm_cdf(GAUSS_CN2_PK_RA(smpl)->mean,dev); + GAUSS_CN2_PK_AA(smpl)->norm = norm_cdf(GAUSS_CN2_PK_AA(smpl)->mean,dev); + + GAUSS_CN3_PK_RRR(smpl)->mean = 0; + GAUSS_CN3_PK_RRA(smpl)->mean = 1.0/(2+smpl->cell_frac); + GAUSS_CN3_PK_RAA(smpl)->mean = (1.0+smpl->cell_frac)/(2+smpl->cell_frac); + GAUSS_CN3_PK_AAA(smpl)->mean = 1; + GAUSS_CN3_PK_RRR(smpl)->norm = norm_cdf(GAUSS_CN3_PK_RRR(smpl)->mean,dev); + GAUSS_CN3_PK_RRA(smpl)->norm = norm_cdf(GAUSS_CN3_PK_RRA(smpl)->mean,dev); + GAUSS_CN3_PK_RAA(smpl)->norm = norm_cdf(GAUSS_CN3_PK_RAA(smpl)->mean,dev); + GAUSS_CN3_PK_AAA(smpl)->norm = norm_cdf(GAUSS_CN3_PK_AAA(smpl)->mean,dev); +} + +static int update_sample_args(args_t *args, sample_t *smpl, int ismpl) +{ + hmm_t *hmm = args->hmm; + double *fwd = hmm_get_fwd_bwd_prob(hmm); + int nstates = hmm_get_nstates(hmm); + + // estimate the BAF mean and deviation for CN3 + double mean_cn3 = 0, norm_cn3 = 0; + double baf_dev2 = 0, baf_AA_dev2 = 0, norm_baf_AA_dev2 = 0; + + // experimental: smooth CN3 probs to bias toward bigger events, this lowers + // the FP rate when the data is noisy + hts_expand(float,args->nsites,args->mtmpf,args->tmpf); + int i, j, k = 0; + for (i=0; insites; i++) + { + float baf = smpl->baf[i]; + if ( baf>4/5.) continue; // skip AA genotypes + if ( baf>0.5 ) baf = 1 - baf; // the bands should be symmetric + if ( baf<1/5.) continue; // skip RR genotypes + + double prob_cn3 = 0, *probs = fwd + i*nstates; + if ( !args->control_sample.name ) + { + prob_cn3 = probs[CN3]; + } + else if ( ismpl==0 ) + { + // query sample: CN3 probability must be recovered from all states of the control sample + for (j=0; jtmpf[k++] = prob_cn3; + } + smooth_data(args->tmpf, k, 50); + k = 0; + for (i=0; insites; i++) + { + float baf = smpl->baf[i]; + if ( baf>4/5.) { baf_AA_dev2 += (1.0-baf)*(1.0-baf); norm_baf_AA_dev2++; continue; } // skip AA genotypes + if ( baf>0.5 ) baf = 1 - baf; // the bands should be symmetric + if ( baf<1/5.) continue; // skip RR genotypes + + double prob_cn3 = args->tmpf[k++]; + mean_cn3 += prob_cn3 * baf; + norm_cn3 += prob_cn3; + } + if ( !norm_cn3 ) + { + smpl->cell_frac = 1.0; + return 1; + } + mean_cn3 /= norm_cn3; + k = 0; + for (i=0; insites; i++) + { + float baf = smpl->baf[i]; + if ( baf>0.5 ) baf = 1 - baf; // the bands should be symmetric + if ( baf<1/5.) continue; // skip RR,AA genotypes + + double prob_cn3 = args->tmpf[k++]; + baf_dev2 += prob_cn3 * (baf - mean_cn3)*(baf - mean_cn3); + } + + /* + A noisy CN2 band is hard to distinguish from two CN3 bands which are + close to each other. Set a treshold on the minimum separation based + on the BAF deviation at p=0.95 + */ + baf_dev2 /= norm_cn3; + baf_AA_dev2 /= norm_baf_AA_dev2; + if ( baf_dev2 < baf_AA_dev2 ) baf_dev2 = baf_AA_dev2; + double max_mean_cn3 = 0.5 - sqrt(baf_dev2)*1.644854; // R: qnorm(0.95)=1.644854 + //fprintf(bcftools_stderr,"dev=%f AA_dev=%f max_mean_cn3=%f mean_cn3=%f\n", baf_dev2,baf_AA_dev2,max_mean_cn3,mean_cn3); + assert( max_mean_cn3>0 ); + + double new_frac = 1./mean_cn3 - 2; + if ( mean_cn3 > max_mean_cn3 || new_frac < args->optimize_frac ) + { + // out of bounds, beyond our detection limits. Give up and say it converged + smpl->cell_frac = 1.0; + return 1; + } + if ( new_frac>1 ) new_frac = 1; + int converged = fabs(new_frac - smpl->cell_frac) < 1e-1 ? 1 : 0; + + // Update dev2, but stay within safe limits + if ( baf_dev2 > 3*smpl->baf_dev2_dflt ) baf_dev2 = 3*smpl->baf_dev2_dflt; + else if ( baf_dev2 < 0.5*smpl->baf_dev2_dflt ) baf_dev2 = 0.5*smpl->baf_dev2_dflt; + + smpl->cell_frac = new_frac; + smpl->baf_dev2 = baf_dev2; + + return converged; +} + +// Update parameters which depend on the estimated fraction of aberrant cells +// in CN3. Returns 0 if the current estimate did not need to be updated or 1 +// if there was a change. +static int update_args(args_t *args) +{ + int converged = update_sample_args(args, &args->query_sample, 0); + if ( args->control_sample.name ) + { + converged += update_sample_args(args, &args->control_sample, 1); + return converged==2 ? 0 : 1; + } + return converged ? 0 : 1; +} + +// for an approximate estimate of the number of het genotypes in a region +#define BAF_LIKELY_HET(val) (val)>0.25 && (val)<0.75 + +static void cnv_flush_viterbi(args_t *args) +{ + if ( !args->nsites ) return; + + // Set HMM transition matrix for the new chromsome again. This is for case + // Baum-Welch was used, which is experimental, largerly unsupported and not + // done by default. + hmm_t *hmm = args->hmm; + hmm_set_tprob(args->hmm, args->tprob, 10000); + + // Smooth LRR values to reduce noise + if ( args->lrr_bias > 0 ) + { + smooth_data(args->query_sample.lrr,args->nsites, args->lrr_smooth_win); + if ( args->control_sample.name ) smooth_data(args->control_sample.lrr,args->nsites, args->lrr_smooth_win); + } + + // Set the BAF peak likelihoods, such as P(RRR|CN3), taking account the + // estimated fraction of aberrant cells in the mixture. With the new chromosome, + // reset the fraction to the default value. + args->query_sample.cell_frac = args->query_sample.cell_frac_dflt; + args->control_sample.cell_frac = args->control_sample.cell_frac_dflt; + args->query_sample.baf_dev2 = args->query_sample.baf_dev2_dflt; + args->control_sample.baf_dev2 = args->control_sample.baf_dev2_dflt; + set_gauss_params(args, &args->query_sample); + if ( args->control_sample.name ) set_gauss_params(args, &args->control_sample); + + if ( args->optimize_frac ) + { + int niter = 0; + fprintf(bcftools_stderr,"Attempting to estimate the fraction of aberrant cells (chr %s):\n", bcf_hdr_id2name(args->hdr,args->prev_rid)); + do + { + fprintf(bcftools_stderr,"\t.. %f %f", args->query_sample.cell_frac,args->query_sample.baf_dev2); + if ( args->control_sample.name ) + fprintf(bcftools_stderr,"\t.. %f %f", args->control_sample.cell_frac,args->control_sample.baf_dev2); + fprintf(bcftools_stderr,"\n"); + set_emission_probs(args); + hmm_run_fwd_bwd(hmm, args->nsites, args->eprob, args->sites); + } + while ( update_args(args) && ++niter<20 ); + if ( niter>=20 ) + { + // no convergence + args->query_sample.cell_frac = args->query_sample.cell_frac_dflt; + args->control_sample.cell_frac = args->control_sample.cell_frac_dflt; + args->query_sample.baf_dev2 = args->query_sample.baf_dev2_dflt; + args->control_sample.baf_dev2 = args->control_sample.baf_dev2_dflt; + set_gauss_params(args, &args->query_sample); + if ( args->control_sample.name ) set_gauss_params(args, &args->control_sample); + } + + fprintf(bcftools_stderr,"\t.. %f %f", args->query_sample.cell_frac,args->query_sample.baf_dev2); + if ( args->control_sample.name ) + fprintf(bcftools_stderr,"\t.. %f %f", args->control_sample.cell_frac,args->control_sample.baf_dev2); + fprintf(bcftools_stderr,"\n"); + + fprintf(args->query_sample.summary_fh,"CF\t%s\t%d\t%d\t%.2f\t%f\n", + bcf_hdr_id2name(args->hdr,args->prev_rid),args->sites[0]+1,args->sites[args->nsites-1]+1, + args->query_sample.cell_frac,sqrt(args->query_sample.baf_dev2)); + if ( args->control_sample.name ) + { + fprintf(args->control_sample.summary_fh,"CF\t%s\t%d\t%d\t%.2f\t%f\n", + bcf_hdr_id2name(args->hdr,args->prev_rid),args->sites[0]+1,args->sites[args->nsites-1]+1, + args->control_sample.cell_frac,sqrt(args->control_sample.baf_dev2)); + fprintf(args->summary_fh,"CF\t%s\t%d\t%d\t%.2f\t%.2f\t%f\t%f\n", + bcf_hdr_id2name(args->hdr,args->prev_rid),args->sites[0]+1,args->sites[args->nsites-1]+1, + args->query_sample.cell_frac, args->control_sample.cell_frac, + sqrt(args->query_sample.baf_dev2), sqrt(args->control_sample.baf_dev2)); + } + } + set_emission_probs(args); + + while ( args->baum_welch_th!=0 ) + { + int nstates = hmm_get_nstates(hmm); + double ori_ii = avg_ii_prob(nstates,hmm_get_tprob(hmm)); + hmm_run_baum_welch(hmm, args->nsites, args->eprob, args->sites); + double new_ii = avg_ii_prob(nstates,hmm_get_tprob(hmm)); + fprintf(bcftools_stderr,"%e\t%e\t%e\n", ori_ii,new_ii,new_ii-ori_ii); + double *tprob = init_tprob_matrix(nstates, 1-new_ii, args->same_prob); + hmm_set_tprob(args->hmm, tprob, 10000); + double *tprob_arr = hmm_get_tprob(hmm); + free(tprob); + if ( fabs(new_ii - ori_ii) < args->baum_welch_th ) + { + int i,j; + for (i=0; insites, args->eprob, args->sites); + hmm_run_fwd_bwd(hmm, args->nsites, args->eprob, args->sites); + + + // Output the results + uint8_t *vpath = hmm_get_viterbi_path(hmm); + double qual = 0, *fwd = hmm_get_fwd_bwd_prob(hmm); + int i,j, isite, start_cn = vpath[0], start_pos = args->sites[0], istart_pos = 0; + int ctrl_ntot = 0, smpl_ntot = 0, ctrl_nhet = 0, smpl_nhet = 0; + for (isite=0; isitensites; isite++) + { + int state = vpath[args->nstates*isite]; + double *pval = fwd + isite*args->nstates; + + qual += pval[start_cn]; + + // output CN and fwd-bwd likelihood for each site + if ( args->query_sample.cn_fh ) + { + fprintf(args->query_sample.cn_fh, "%s\t%d\t%c", bcf_hdr_id2name(args->hdr,args->prev_rid), args->sites[isite]+1, copy_number_state(args,state,0)); + if ( !args->control_sample.cn_fh ) + for (i=0; instates; i++) fprintf(args->query_sample.cn_fh, "\t%f", pval[i]); + else + for (i=0; iquery_sample.cn_fh, "\t%f", sum); + } + fprintf(args->query_sample.cn_fh, "\n"); + if ( args->query_sample.baf[isite]>=0 ) // if non-missing + { + if ( BAF_LIKELY_HET(args->query_sample.baf[isite]) ) smpl_nhet++; + smpl_ntot++; + } + } + if ( args->control_sample.cn_fh ) + { + fprintf(args->control_sample.cn_fh, "%s\t%d\t%c", bcf_hdr_id2name(args->hdr,args->prev_rid), args->sites[isite]+1, copy_number_state(args,state,1)); + for (i=0; icontrol_sample.cn_fh, "\t%f", sum); + } + fprintf(args->control_sample.cn_fh, "\n"); + if ( args->control_sample.baf[isite]>=0 ) // if non-missing + { + if ( BAF_LIKELY_HET(args->control_sample.baf[isite]) ) ctrl_nhet++; + ctrl_ntot++; + } + } + + if ( start_cn != state ) + { + char start_cn_query = copy_number_state(args,start_cn,0); + qual = phred_score(1 - qual/(isite - istart_pos)); + fprintf(args->query_sample.summary_fh,"RG\t%s\t%d\t%d\t%c\t%.1f\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite],start_cn_query,qual,smpl_ntot,smpl_nhet); + + if ( args->control_sample.name ) + { + // regions 0-based, half-open + char start_cn_ctrl = copy_number_state(args,start_cn,1); + fprintf(args->control_sample.summary_fh,"RG\t%s\t%d\t%d\t%c\t%.1f\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite],start_cn_ctrl,qual,ctrl_ntot,ctrl_nhet); + fprintf(args->summary_fh,"RG\t%s\t%d\t%d\t%c\t%c\t%.1f\t%d\t%d\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite],start_cn_query,start_cn_ctrl,qual,smpl_ntot,smpl_nhet,ctrl_ntot,ctrl_nhet); + } + + istart_pos = isite; + start_pos = args->sites[isite]; + start_cn = state; + qual = 0; + smpl_ntot = smpl_nhet = ctrl_ntot = ctrl_nhet = 0; + } + } + qual = phred_score(1 - qual/(isite - istart_pos)); + char start_cn_query = copy_number_state(args,start_cn,0); + fprintf(args->query_sample.summary_fh,"RG\t%s\t%d\t%d\t%c\t%.1f\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite-1]+1,start_cn_query,qual,smpl_ntot,smpl_nhet); + if ( args->control_sample.name ) + { + char start_cn_ctrl = copy_number_state(args,start_cn,1); + fprintf(args->control_sample.summary_fh,"RG\t%s\t%d\t%d\t%c\t%.1f\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite-1]+1,start_cn_ctrl,qual,ctrl_ntot,ctrl_nhet); + fprintf(args->summary_fh,"RG\t%s\t%d\t%d\t%c\t%c\t%.1f\t%d\t%d\t%d\t%d\n", + bcf_hdr_id2name(args->hdr,args->prev_rid), start_pos+1, args->sites[isite-1]+1,start_cn_query,start_cn_ctrl,qual,smpl_ntot,smpl_nhet,ctrl_ntot,ctrl_nhet); + } +} + +static int parse_lrr_baf(sample_t *smpl, bcf_fmt_t *baf_fmt, bcf_fmt_t *lrr_fmt, float *baf, float *lrr) +{ + *baf = ((float*)(baf_fmt->p + baf_fmt->size*smpl->idx))[0]; + if ( bcf_float_is_missing(*baf) || isnan(*baf) ) *baf = -0.1; // arbitrary negative value == missing value + + if ( lrr_fmt ) + { + *lrr = ((float*)(lrr_fmt->p + lrr_fmt->size*smpl->idx))[0]; + if ( bcf_float_is_missing(*lrr) || isnan(*lrr) ) { *lrr = 0; *baf = -0.1; } + } + else + *lrr = 0; + + return *baf<0 ? 0 : 1; +} + +static void cnv_next_line(args_t *args, bcf1_t *line) +{ + if ( !line ) + { + // Done, flush viterbi + cnv_flush_viterbi(args); + return; + } + + if ( line->rid!=args->prev_rid ) + { + // New chromosome + cnv_flush_viterbi(args); + args->prev_rid = line->rid; + args->nsites = 0; + args->nRR = args->nAA = args->nRA = 0; + } + + // Process line + args->ntot++; + + bcf_fmt_t *baf_fmt, *lrr_fmt = NULL; + if ( !(baf_fmt = bcf_get_fmt(args->hdr, line, "BAF")) ) return; + if ( args->lrr_bias>0 && !(lrr_fmt = bcf_get_fmt(args->hdr, line, "LRR")) ) return; + + float baf1,lrr1,baf2,lrr2; + int ret = 0; + ret += parse_lrr_baf(&args->query_sample, baf_fmt,lrr_fmt,&baf1,&lrr1); + ret += parse_lrr_baf(&args->control_sample,baf_fmt,lrr_fmt,&baf2,&lrr2); + if ( !ret ) return; + + // Realloc buffers needed to store observed data and used by viterbi and fwd-bwd + args->nsites++; + int m = args->msites; + hts_expand(uint32_t,args->nsites,args->msites,args->sites); + if ( args->msites!=m ) + { + args->eprob = (double*) realloc(args->eprob,sizeof(double)*args->msites*args->nstates); + if ( args->control_sample.name ) + { + args->control_sample.lrr = (float*) realloc(args->control_sample.lrr,sizeof(float)*args->msites); + args->control_sample.baf = (float*) realloc(args->control_sample.baf,sizeof(float)*args->msites); + } + args->query_sample.lrr = (float*) realloc(args->query_sample.lrr,sizeof(float)*args->msites); + args->query_sample.baf = (float*) realloc(args->query_sample.baf,sizeof(float)*args->msites); + if ( args->af_fname ) + args->nonref_afs = (float*) realloc(args->nonref_afs,sizeof(float)*args->msites); + } + args->sites[args->nsites-1] = line->pos; + args->query_sample.lrr[args->nsites-1] = lrr1; + args->query_sample.baf[args->nsites-1] = baf1; + if ( args->af_fname ) + { + double alt_freq; + args->nonref_afs[args->nsites-1] = read_AF(args->files->targets,line,&alt_freq)<0 ? args->nonref_af_dflt : alt_freq; + } + if ( args->control_sample.name ) + { + args->control_sample.lrr[args->nsites-1] = lrr2; + args->control_sample.baf[args->nsites-1] = baf2; + if ( baf2>=0 ) // skip missing values + fprintf(args->control_sample.dat_fh,"%s\t%"PRId64"\t%.3f\t%.3f\n",bcf_hdr_id2name(args->hdr,args->prev_rid), (int64_t) line->pos+1,baf2,lrr2); + } + if ( baf1>=0 ) // skip missing values + fprintf(args->query_sample.dat_fh,"%s\t%"PRId64"\t%.3f\t%.3f\n",bcf_hdr_id2name(args->hdr,args->prev_rid), (int64_t) line->pos+1,baf1,lrr1); + + if ( baf1>=0 ) + { + if ( baf1<1/5. ) args->nRR++; + else if ( baf1>4/5. ) args->nAA++; + else args->nRA++; + } + args->nused++; +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Copy number variation caller, requires Illumina's B-allele frequency (BAF) and Log R\n"); + fprintf(bcftools_stderr, " Ratio intensity (LRR). The HMM considers the following copy number states: CN 2\n"); + fprintf(bcftools_stderr, " (normal), 1 (single-copy loss), 0 (complete loss), 3 (single-copy gain)\n"); + fprintf(bcftools_stderr, "Usage: bcftools cnv [OPTIONS] FILE.vcf\n"); + fprintf(bcftools_stderr, "General Options:\n"); + fprintf(bcftools_stderr, " -c, --control-sample STRING Optional control sample name to highlight differences\n"); + fprintf(bcftools_stderr, " -f, --AF-file FILE Read allele frequencies from file (CHR\\tPOS\\tREF,ALT\\tAF)\n"); + fprintf(bcftools_stderr, " -o, --output-dir PATH \n"); + fprintf(bcftools_stderr, " -p, --plot-threshold FLOAT Plot aberrant chromosomes with quality at least FLOAT\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --query-sample STRING Query samply name\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, "HMM Options:\n"); + fprintf(bcftools_stderr, " -a, --aberrant FLOAT[,FLOAT] Fraction of aberrant cells in query and control [1.0,1.0]\n"); + fprintf(bcftools_stderr, " -b, --BAF-weight FLOAT Relative contribution from BAF [1]\n"); + fprintf(bcftools_stderr, " -d, --BAF-dev FLOAT[,FLOAT] Expected BAF deviation in query and control [0.04,0.04]\n"); // experimental + fprintf(bcftools_stderr, " -e, --err-prob FLOAT Uniform error probability [1e-4]\n"); + fprintf(bcftools_stderr, " -k, --LRR-dev FLOAT[,FLOAT] Expected LRR deviation [0.2,0.2]\n"); // experimental + fprintf(bcftools_stderr, " -l, --LRR-weight FLOAT Relative contribution from LRR [0.2]\n"); + fprintf(bcftools_stderr, " -L, --LRR-smooth-win INT Window of LRR moving average smoothing [10]\n"); + fprintf(bcftools_stderr, " -O, --optimize FLOAT Estimate fraction of aberrant cells down to FLOAT [1.0]\n"); + fprintf(bcftools_stderr, " -P, --same-prob FLOA> Prior probability of -s/-c being the same [0.5]\n"); + fprintf(bcftools_stderr, " -x, --xy-prob FLOAT P(x|y) transition probability [1e-9]\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfcnv(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->plot_th = 1e9; // by default plot none + args->nonref_af_dflt = 0.1; + args->lrr_smooth_win = 10; + + args->query_sample.cell_frac_dflt = 1; + args->control_sample.cell_frac_dflt = 1; + + // How much FORMAT/LRR and FORMAT/BAF matter + args->lrr_bias = 0.2; + args->baf_bias = 1.0; + args->err_prob = 1e-4; + + // Transition probability to a different state and the prior of both samples being the same + args->ij_prob = 1e-9; + args->same_prob = 0.5; + + // Squared std dev of BAF and LRR values (gaussian noise), estimated from real data (hets, one sample, one chr) + args->query_sample.baf_dev2_dflt = args->control_sample.baf_dev2_dflt = 0.04*0.04; // illumina: 0.03 + args->query_sample.lrr_dev2 = args->control_sample.lrr_dev2 = 0.2*0.2; //0.20*0.20; // illumina: 0.18 + + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"BAF-dev",1,0,'d'}, + {"LRR-dev",1,0,'k'}, + {"LRR-smooth-win",1,0,'L'}, + {"AF-file",1,0,'f'}, + {"baum-welch",1,0,'W'}, // hidden + {"optimize",1,0,'O'}, + {"aberrant",1,0,'a'}, + {"err-prob",1,0,'e'}, + {"BAF-weight",1,0,'b'}, + {"LRR-weight",1,0,'l'}, + {"same-prob",1,0,'P'}, + {"xy-prob",1,0,'x'}, + {"query-sample",1,0,'s'}, + {"control-sample",1,0,'c'}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,4}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"plot-threshold",1,0,'p'}, + {"output-dir",1,0,'o'}, + {0,0,0,0} + }; + char *tmp = NULL; + while ((c = getopt_long(argc, argv, "h?r:R:t:T:s:o:p:l:T:c:b:P:x:e:O:W:f:a:L:d:k:",loptions,NULL)) >= 0) { + switch (c) { + case 'L': + args->lrr_smooth_win = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse: --LRR-smooth-win %s\n", optarg); + break; + case 'f': args->af_fname = optarg; break; + case 'O': + args->optimize_frac = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -O %s\n", optarg); + break; + case 'd': + args->query_sample.baf_dev2_dflt = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',') error("Could not parse: -d %s\n", optarg); + args->control_sample.baf_dev2_dflt = strtod(tmp+1,&tmp); + if ( *tmp ) error("Could not parse: -d %s\n", optarg); + } + else + args->control_sample.baf_dev2_dflt = args->query_sample.baf_dev2_dflt; + args->query_sample.baf_dev2_dflt *= args->query_sample.baf_dev2_dflt; + args->control_sample.baf_dev2_dflt *= args->control_sample.baf_dev2_dflt; + break; + case 'k': + args->query_sample.lrr_dev2 = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',') error("Could not parse: -k %s\n", optarg); + args->control_sample.lrr_dev2 = strtod(tmp+1,&tmp); + if ( *tmp ) error("Could not parse: -d %s\n", optarg); + } + else + args->control_sample.lrr_dev2 = args->query_sample.lrr_dev2; + args->query_sample.lrr_dev2 *= args->query_sample.lrr_dev2; + args->control_sample.lrr_dev2 *= args->control_sample.lrr_dev2; + break; + case 'a': + args->query_sample.cell_frac_dflt = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',') error("Could not parse: -a %s\n", optarg); + args->control_sample.cell_frac_dflt = strtod(tmp+1,&tmp); + if ( *tmp ) error("Could not parse: -a %s\n", optarg); + } + break; + case 'W': + args->baum_welch_th = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -W %s\n", optarg); + break; + case 'e': + args->err_prob = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -e %s\n", optarg); + break; + case 'b': + args->baf_bias = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -b %s\n", optarg); + break; + case 'x': + args->ij_prob = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -x %s\n", optarg); + break; + case 'P': + args->same_prob = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -P %s\n", optarg); + break; + case 'l': + args->lrr_bias = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -l %s\n", optarg); + break; + case 'p': + args->plot_th = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -p %s\n", optarg); + break; + case 'o': args->output_dir = optarg; break; + case 's': args->query_sample.name = strdup(optarg); break; + case 'c': args->control_sample.name = optarg; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 4 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; + } + else fname = argv[optind]; + if ( !fname ) usage(args); + + if ( !args->output_dir ) error("Expected -o option\n"); + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( args->af_fname ) + { + if ( bcf_sr_set_targets(args->files, args->af_fname, 1, 3)<0 ) + error("Failed to read the targets: %s\n", args->af_fname); + } + if ( !bcf_sr_add_reader(args->files, fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + cnv_next_line(args, line); + } + cnv_next_line(args, NULL); + create_plots(args); + fprintf(bcftools_stderr,"Number of lines: total/processed: %d/%d\n", args->ntot,args->nused); + destroy_data(args); + free(args); + return 0; +} + + diff --git a/bcftools/vcfconcat.c b/bcftools/vcfconcat.c new file mode 100644 index 0000000..0246b59 --- /dev/null +++ b/bcftools/vcfconcat.c @@ -0,0 +1,1062 @@ +/* vcfconcat.c -- Concatenate or combine VCF/BCF files. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // for hts_get_bgzfp() +#include +#include +#include "bcftools.h" + +typedef struct _args_t +{ + bcf_srs_t *files; + htsFile *out_fh; + int output_type, n_threads, record_cmd_line, clevel; + bcf_hdr_t *out_hdr; + int *seen_seq; + + // phasing + int *start_pos, start_tid, ifname; + int *swap_phase, nswap, *nmatch, *nmism; + bcf1_t **buf; + uint8_t *buf_mask; + int nbuf, mbuf, prev_chr, min_PQ, prev_pos_check; + int32_t *GTa, *GTb, mGTa, mGTb, *phase_qual, *phase_set; + + char **argv, *output_fname, *file_list, **fnames, *remove_dups, *regions_list; + int argc, nfnames, allow_overlaps, phased_concat, regions_is_file, regions_overlap; + int compact_PS, phase_set_changed, naive_concat, naive_concat_trust_headers; + int verbose, explicit_output_type, ligate_force, ligate_warn; + htsThreadPool *tpool; +} +args_t; + +static void init_data(args_t *args) +{ + bcf1_t *line = NULL; + + // With phased concat, the chunks overlap and come in the right order. To + // avoid opening all files at once, store start positions to recognise need + // for the next one. This way we can keep only two open chunks at once. + if ( args->phased_concat ) + { + args->start_pos = (int*) malloc(sizeof(int)*args->nfnames); + line = bcf_init(); + } + + if ( args->verbose ) fprintf(stderr,"Checking the headers and starting positions of %d files\n", args->nfnames); + kstring_t str = {0,0,0}; + int i, prev_chrid = -1; + for (i=0; infnames; i++) + { + htsFile *fp = hts_open(args->fnames[i], "r"); if ( !fp ) error("Failed to open: %s\n", args->fnames[i]); + bcf_hdr_t *hdr = bcf_hdr_read(fp); if ( !hdr ) error("Failed to parse header: %s\n", args->fnames[i]); + args->out_hdr = bcf_hdr_merge(args->out_hdr,hdr); + if ( bcf_hdr_nsamples(hdr) != bcf_hdr_nsamples(args->out_hdr) ) + error("Different number of samples in %s. Perhaps \"bcftools merge\" is what you are looking for?\n", args->fnames[i]); + + int j; + for (j=0; jout_hdr->samples[j],hdr->samples[j]) ) + error("Different sample names in %s. Perhaps \"bcftools merge\" is what you are looking for?\n", args->fnames[i]); + + if ( args->phased_concat ) + { + int ret = bcf_read(fp, hdr, line); + if ( ret!=0 ) args->start_pos[i] = -2; // empty file + else + { + int chrid = bcf_hdr_id2int(args->out_hdr,BCF_DT_CTG,bcf_seqname(hdr,line)); + args->start_pos[i] = chrid==prev_chrid ? line->pos : -1; + prev_chrid = chrid; + } + } + bcf_hdr_destroy(hdr); + if ( hts_close(fp)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fnames[i]); + } + free(str.s); + if ( line ) bcf_destroy(line); + + args->seen_seq = (int*) calloc(args->out_hdr->n[BCF_DT_CTG],sizeof(int)); + + if ( args->phased_concat ) + { + bcf_hdr_append(args->out_hdr,"##FORMAT="); + bcf_hdr_append(args->out_hdr,"##FORMAT="); + } + if (args->record_cmd_line) bcf_hdr_append_version(args->out_hdr, args->argc, args->argv, "bcftools_concat"); + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->allow_overlaps || args->phased_concat ) + { + args->files = bcf_sr_init(); + args->files->require_index = 1; + } + if ( args->n_threads ) + { + if ( args->files ) + { + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + args->tpool = args->files->p; + } + else + { + args->tpool = (htsThreadPool*) calloc(1, sizeof(htsThreadPool)); + if ( !args->tpool ) error("Failed to allocate memory\n"); + if ( !(args->tpool->pool = hts_tpool_init(args->n_threads)) ) error("Failed to initialize %d threads\n",args->n_threads); + } + hts_set_opt(args->out_fh, HTS_OPT_THREAD_POOL, args->tpool); + } + if ( bcf_hdr_write(args->out_fh, args->out_hdr)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname); + + if ( args->allow_overlaps ) + { + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, args->regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->remove_dups ) + { + if ( !strcmp(args->remove_dups,"snps") ) args->files->collapse |= COLLAPSE_SNPS; + else if ( !strcmp(args->remove_dups,"indels") ) args->files->collapse |= COLLAPSE_INDELS; + else if ( !strcmp(args->remove_dups,"both") ) args->files->collapse |= COLLAPSE_SNPS | COLLAPSE_INDELS; + else if ( !strcmp(args->remove_dups,"any") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(args->remove_dups,"all") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(args->remove_dups,"none") ) args->files->collapse = COLLAPSE_NONE; + else if ( !strcmp(args->remove_dups,"exact") ) args->files->collapse = COLLAPSE_NONE; + else error("The -D string \"%s\" not recognised.\n", args->remove_dups); + } + for (i=0; infnames; i++) + if ( !bcf_sr_add_reader(args->files,args->fnames[i]) ) error("Failed to open %s: %s\n", args->fnames[i],bcf_sr_strerror(args->files->errnum)); + } + else if ( args->phased_concat ) + { + // Remove empty files from the list + int nok = 0; + while (1) + { + while ( noknfnames && args->start_pos[nok]!=-2 ) nok++; + if ( nok==args->nfnames ) break; + + i = nok; + while ( infnames && args->start_pos[i]==-2 ) i++; + if ( i==args->nfnames ) break; + + int tmp = args->start_pos[nok]; args->start_pos[nok] = args->start_pos[i]; args->start_pos[i] = tmp; + char *str = args->fnames[nok]; args->fnames[nok] = args->fnames[i]; args->fnames[i] = str; + } + for (i=nok; infnames; i++) free(args->fnames[i]); + args->nfnames = nok; + + for (i=1; infnames; i++) + if ( args->start_pos[i-1]!=-1 && args->start_pos[i]!=-1 && args->start_pos[i]start_pos[i-1] ) + error("The files not in ascending order: %d in %s, %d in %s\n", args->start_pos[i-1]+1,args->fnames[i-1],args->start_pos[i]+1,args->fnames[i]); + + args->prev_chr = -1; + args->swap_phase = (int*) calloc(bcf_hdr_nsamples(args->out_hdr),sizeof(int)); + args->nmatch = (int*) calloc(bcf_hdr_nsamples(args->out_hdr),sizeof(int)); + args->nmism = (int*) calloc(bcf_hdr_nsamples(args->out_hdr),sizeof(int)); + args->phase_qual = (int32_t*) malloc(bcf_hdr_nsamples(args->out_hdr)*sizeof(int32_t)); + args->phase_set = (int32_t*) malloc(bcf_hdr_nsamples(args->out_hdr)*sizeof(int32_t)); + args->ifname = 0; + } +} + +static void destroy_data(args_t *args) +{ + int i; + if ( args->out_fh ) + { + if ( hts_close(args->out_fh)!=0 ) error("hts_close error\n"); + } + if ( args->tpool && !args->files ) + { + hts_tpool_destroy(args->tpool->pool); + free(args->tpool); + } + if ( args->files ) bcf_sr_destroy(args->files); + if ( args->out_hdr ) bcf_hdr_destroy(args->out_hdr); + free(args->seen_seq); + free(args->start_pos); + free(args->swap_phase); + for (i=0; imbuf; i++) bcf_destroy(args->buf[i]); + free(args->buf); + free(args->buf_mask); + free(args->GTa); + free(args->GTb); + free(args->nmatch); + free(args->nmism); + free(args->phase_qual); + free(args->phase_set); + for (i=0; infnames; i++) free(args->fnames[i]); + free(args->fnames); +} + +int vcf_write_line(htsFile *fp, kstring_t *line); + +#define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } +static void phase_update(args_t *args, bcf_hdr_t *hdr, bcf1_t *rec) +{ + int i, nGTs = bcf_get_genotypes(hdr, rec, &args->GTa, &args->mGTa); + if ( nGTs <= 0 ) return; // GT field is not present + for (i=0; iswap_phase[i] ) continue; + int *gt = &args->GTa[i*2]; + if ( bcf_gt_is_missing(gt[0]) || gt[1]==bcf_int32_vector_end ) continue; + if ( !bcf_gt_is_phased(gt[1]) ) continue; + SWAP(int, gt[0], gt[1]); + gt[1] |= 1; + } + bcf_update_genotypes(hdr,rec,args->GTa,nGTs); +} + +static void phased_flush(args_t *args) +{ + if ( !args->nbuf ) return; + + bcf_hdr_t *ahdr = args->files->readers[0].header; + bcf_hdr_t *bhdr = args->files->readers[1].header; + + int i, j, nsmpl = bcf_hdr_nsamples(args->out_hdr); + static int gt_absent_warned = 0; + for (i=0; inbuf; i+=2) + { + if ( args->buf_mask[i/2]!=3 ) continue; + + bcf1_t *arec = args->buf[i]; + bcf1_t *brec = args->buf[i+1]; + + int nGTs = bcf_get_genotypes(ahdr, arec, &args->GTa, &args->mGTa); + if ( nGTs < 0 ) + { + if ( !gt_absent_warned ) + { + fprintf(stderr,"GT is not present at %s:%"PRId64". (This warning is printed only once.)\n", bcf_seqname(ahdr,arec), (int64_t) arec->pos+1); + gt_absent_warned = 1; + } + continue; + } + if ( nGTs != 2*nsmpl ) continue; // not diploid + nGTs = bcf_get_genotypes(bhdr, brec, &args->GTb, &args->mGTb); + if ( nGTs < 0 ) + { + if ( !gt_absent_warned ) + { + fprintf(stderr,"GT is not present at %s:%"PRId64". (This warning is printed only once.)\n", bcf_seqname(bhdr,brec), (int64_t) brec->pos+1); + gt_absent_warned = 1; + } + continue; + } + if ( nGTs != 2*nsmpl ) continue; // not diploid + + for (j=0; jGTa[j*2]; + int *gtb = &args->GTb[j*2]; + if ( gta[1]==bcf_int32_vector_end || gtb[1]==bcf_int32_vector_end ) continue; + if ( bcf_gt_is_missing(gta[0]) || bcf_gt_is_missing(gta[1]) || bcf_gt_is_missing(gtb[0]) || bcf_gt_is_missing(gtb[1]) ) continue; + if ( !bcf_gt_is_phased(gta[1]) || !bcf_gt_is_phased(gtb[1]) ) continue; + if ( bcf_gt_allele(gta[0])==bcf_gt_allele(gta[1]) || bcf_gt_allele(gtb[0])==bcf_gt_allele(gtb[1]) ) continue; + if ( bcf_gt_allele(gta[0])==bcf_gt_allele(gtb[0]) && bcf_gt_allele(gta[1])==bcf_gt_allele(gtb[1]) ) + { + if ( args->swap_phase[j] ) args->nmism[j]++; else args->nmatch[j]++; + } + if ( bcf_gt_allele(gta[0])==bcf_gt_allele(gtb[1]) && bcf_gt_allele(gta[1])==bcf_gt_allele(gtb[0]) ) + { + if ( args->swap_phase[j] ) args->nmatch[j]++; else args->nmism[j]++; + } + } + } + for (i=0; inbuf/2; i+=2) + { + bcf1_t *rec; + bcf_hdr_t *hdr; + int mask = args->buf_mask[i/2]; + if ( mask & 1 ) { rec = args->buf[i]; hdr = args->files->readers[0].header; } + else { rec = args->buf[i+1]; hdr = args->files->readers[1].header; } + bcf_translate(args->out_hdr, hdr, rec); + if ( args->nswap && (mask&1) ) + phase_update(args, args->out_hdr, rec); + if ( !args->compact_PS || args->phase_set_changed ) + { + bcf_update_format_int32(args->out_hdr,rec,"PS",args->phase_set,nsmpl); + args->phase_set_changed = 0; + } + if ( bcf_write(args->out_fh, args->out_hdr, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + + if ( rec->pos < args->prev_pos_check ) error("FIXME, disorder: %s:%"PRId64" vs %d [1]\n", bcf_seqname(hdr,rec),(int64_t)rec->pos+1,args->prev_pos_check+1); + args->prev_pos_check = rec->pos; + } + args->nswap = 0; + for (j=0; jnmatch[j] >= args->nmism[j] ) + args->swap_phase[j] = 0; + else + { + args->swap_phase[j] = 1; + args->nswap++; + } + if ( args->nmatch[j] && args->nmism[j] ) + { + // Entropy-inspired quality. The factor 0.7 shifts and scales to (0,1) + double f = (double)args->nmatch[j]/(args->nmatch[j]+args->nmism[j]); + args->phase_qual[j] = 99*(0.7 + f*log(f) + (1-f)*log(1-f))/0.7; + } + else + args->phase_qual[j] = 99; + args->nmatch[j] = 0; + args->nmism[j] = 0; + } + int PQ_printed = 0; + for (; inbuf; i+=2) + { + bcf1_t *rec; + bcf_hdr_t *hdr; + int mask = args->buf_mask[i/2]; + if ( mask & 2 ) { rec = args->buf[i+1]; hdr = args->files->readers[1].header; } + else { rec = args->buf[i]; hdr = args->files->readers[0].header; } + bcf_translate(args->out_hdr, hdr, rec); + if ( !PQ_printed && mask==3 ) + { + bcf_update_format_int32(args->out_hdr,rec,"PQ",args->phase_qual,nsmpl); + PQ_printed = 1; + for (j=0; jphase_qual[j] < args->min_PQ ) + { + args->phase_set[j] = rec->pos+1; + args->phase_set_changed = 1; + } + else if ( args->compact_PS ) args->phase_set[j] = bcf_int32_missing; + } + if ( args->nswap ) + phase_update(args, args->out_hdr, rec); + if ( !args->compact_PS || args->phase_set_changed ) + { + bcf_update_format_int32(args->out_hdr,rec,"PS",args->phase_set,nsmpl); + args->phase_set_changed = 0; + } + if ( bcf_write(args->out_fh, args->out_hdr, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + + if ( rec->pos < args->prev_pos_check ) error("FIXME, disorder: %s:%"PRId64" vs %d [2]\n", bcf_seqname(hdr,rec),(int64_t)rec->pos+1,args->prev_pos_check+1); + args->prev_pos_check = rec->pos; + } + args->nbuf = 0; +} + +static void phased_push(args_t *args, bcf1_t *arec, bcf1_t *brec, int is_overlap) +{ + bcf_hdr_t *ahdr = arec ? bcf_sr_get_header(args->files,0) : NULL; + bcf_hdr_t *bhdr = brec ? bcf_sr_get_header(args->files,1) : NULL; + + if ( arec && arec->errcode ) + error("Parse error at %s:%"PRId64", cannot proceed: %s\n", bcf_seqname(ahdr,arec),(int64_t) arec->pos+1, args->files->readers[0].fname); + if ( brec && brec->errcode ) + error("Parse error at %s:%"PRId64", cannot proceed: %s\n", bcf_seqname(bhdr,brec),(int64_t) brec->pos+1, args->files->readers[1].fname); + + int i, nsmpl = bcf_hdr_nsamples(args->out_hdr); + int chr_id = arec ? bcf_hdr_name2id(args->out_hdr,bcf_seqname(ahdr,arec)) : bcf_hdr_name2id(args->out_hdr,bcf_seqname(bhdr,brec)); + if ( args->prev_chr<0 || args->prev_chr!=chr_id ) + { + if ( args->prev_chr>=0 ) phased_flush(args); + + for (i=0; iphase_set[i] = arec ? arec->pos+1 : brec->pos+1; + args->phase_set_changed = 1; + + if ( args->seen_seq[chr_id] ) error("The chromosome block %s is not contiguous\n", arec ? bcf_seqname(ahdr,arec) : bcf_seqname(bhdr,brec)); + args->seen_seq[chr_id] = 1; + args->prev_chr = chr_id; + args->prev_pos_check = -1; + } + + if ( !is_overlap ) + { + assert(arec); + + bcf_translate(args->out_hdr, ahdr, arec); + if ( args->nswap ) + phase_update(args, args->out_hdr, arec); + if ( !args->compact_PS || args->phase_set_changed ) + { + bcf_update_format_int32(args->out_hdr,arec,"PS",args->phase_set,nsmpl); + args->phase_set_changed = 0; + } + if ( bcf_write(args->out_fh, args->out_hdr, arec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + + if ( arec->pos < args->prev_pos_check ) + error("FIXME, disorder: %s:%"PRId64" in %s vs %d written [3]\n", bcf_seqname(ahdr,arec), (int64_t) arec->pos+1,args->files->readers[0].fname, args->prev_pos_check+1); + args->prev_pos_check = arec->pos; + return; + } + + int m = args->mbuf; + args->nbuf += 2; + hts_expand(bcf1_t*,args->nbuf,args->mbuf,args->buf); + if ( m < args->mbuf ) args->buf_mask = (uint8_t*)realloc(args->buf_mask,sizeof(*args->buf_mask)*args->mbuf); + for (i=m; imbuf; i++) + args->buf[i] = bcf_init1(); + + if ( arec ) SWAP(bcf1_t*, args->files->readers[0].buffer[0], args->buf[args->nbuf-2]); + if ( brec ) SWAP(bcf1_t*, args->files->readers[1].buffer[0], args->buf[args->nbuf-1]); + args->buf_mask[args->nbuf/2-1] = (arec?1:0) | (brec?2:0); +} + +static int _get_active_index(bcf_srs_t *sr) +{ + int i; + for (i=0; inreaders; i++) + if ( bcf_sr_has_line(sr,i) ) return i; + return -1; +} + +static void concat(args_t *args) +{ + static int site_drop_warned = 0; + int i; + if ( args->phased_concat ) // phased concat + { + // keep only two open files at a time + while ( args->ifname < args->nfnames ) + { + int new_file = 0; + while ( args->files->nreaders < 2 && args->ifname < args->nfnames ) + { + if ( !bcf_sr_add_reader(args->files,args->fnames[args->ifname]) ) error("Failed to open %s: %s\n", args->fnames[args->ifname],bcf_sr_strerror(args->files->errnum)); + new_file = 1; + + args->ifname++; + if ( args->start_pos[args->ifname-1]==-1 ) break; // new chromosome, start with only one file open + if ( args->ifname < args->nfnames && args->start_pos[args->ifname]==-1 ) break; // next file starts on a different chromosome + } + + // is there a line from the previous run? Seek the newly opened reader to that position + int seek_pos = -1; + int seek_chr = -1; + if ( bcf_sr_has_line(args->files,0) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + bcf_sr_seek(args->files, bcf_seqname(args->files->readers[0].header,line), line->pos); + seek_pos = line->pos; + seek_chr = bcf_hdr_name2id(args->out_hdr, bcf_seqname(args->files->readers[0].header,line)); + } + else if ( new_file ) + bcf_sr_seek(args->files,NULL,0); // set to start + + int nret, ir; + while ( (nret = bcf_sr_next_line(args->files)) ) + { + int is_overlap = args->files->nreaders==1 ? 0 : 1; + if ( !bcf_sr_has_line(args->files,0) ) // no input from the first reader + { + // We are assuming that there is a perfect overlap, sites which are not present in both files are dropped + if ( bcf_sr_region_done(args->files,0) ) + { + phased_flush(args); + bcf_sr_remove_reader(args->files, 0); + is_overlap = 0; + } + else if ( args->ligate_warn ) + { + if ( !site_drop_warned ) + { + ir = _get_active_index(args->files); + fprintf(stderr, + "Warning: Dropping the site %s:%"PRId64". The --ligate option is intended for VCFs with perfect\n" + " overlap, sites in overlapping regions present in one but missing in other are dropped.\n" + " This warning is printed only once.\n", + bcf_seqname(bcf_sr_get_header(args->files,ir),bcf_sr_get_line(args->files,ir)), (int64_t) bcf_sr_get_line(args->files,ir)->pos+1); + site_drop_warned = 1; + } + continue; + } + else if ( !args->ligate_force ) + { + ir = _get_active_index(args->files); + error("Error: The --ligate option is intended for VCFs with perfect overlap, the site %s:%"PRId64" breaks the assumption\n", + bcf_seqname(bcf_sr_get_header(args->files,ir),bcf_sr_get_line(args->files,ir)), (int64_t) bcf_sr_get_line(args->files,ir)->pos+1); + } + } + + // Get a line to learn about current position + ir = _get_active_index(args->files); + bcf1_t *line = bcf_sr_get_line(args->files,ir); + + // This can happen after bcf_sr_seek: indel may start before the coordinate which we seek to. + if ( seek_chr>=0 && seek_pos>line->pos && seek_chr==bcf_hdr_name2id(args->out_hdr, bcf_seqname(args->files->readers[ir].header,line)) ) continue; + seek_pos = seek_chr = -1; + + // Check if the position overlaps with the next, yet unopened, reader + int must_seek = 0; + while ( args->ifname < args->nfnames && args->start_pos[args->ifname]!=-1 && line->pos >= args->start_pos[args->ifname] ) + { + must_seek = 1; + if ( !bcf_sr_add_reader(args->files,args->fnames[args->ifname]) ) error("Failed to open %s: %s\n", args->fnames[args->ifname],bcf_sr_strerror(args->files->errnum)); + args->ifname++; + } + if ( must_seek ) + { + bcf_sr_seek(args->files, bcf_seqname(args->files->readers[ir].header,line), line->pos); + seek_pos = line->pos; + seek_chr = bcf_hdr_name2id(args->out_hdr, bcf_seqname(args->files->readers[ir].header,line)); + continue; + } + + // We are assuming that there is a perfect overlap, sites which are not present in both files are dropped + if ( args->files->nreaders>1 && !bcf_sr_has_line(args->files,1) && !bcf_sr_region_done(args->files,1) && !args->ligate_force ) + { + if ( args->ligate_warn && !site_drop_warned ) + { + ir = _get_active_index(args->files); + fprintf(stderr, + "Warning: Dropping the site %s:%"PRId64". The --ligate option is intended for VCFs with perfect\n" + " overlap, sites in overlapping regions present in one but missing in other are dropped.\n" + " This warning is printed only once.\n", + bcf_seqname(bcf_sr_get_header(args->files,ir),line), (int64_t) line->pos+1); + site_drop_warned = 1; + } + else if ( !args->ligate_warn ) + { + ir = _get_active_index(args->files); + error("Error: The --ligate option is intended for VCFs with perfect overlap, the site %s:%"PRId64" breaks the assumption\n", + bcf_seqname(bcf_sr_get_header(args->files,ir),bcf_sr_get_line(args->files,ir)), (int64_t) bcf_sr_get_line(args->files,ir)->pos+1); + } + continue; + } + + bcf1_t *line0 = bcf_sr_get_line(args->files,0); + bcf1_t *line1 = args->files->nreaders > 1 ? bcf_sr_get_line(args->files,1) : NULL; + phased_push(args, line0, line1, is_overlap); + } + + if ( args->files->nreaders ) + { + phased_flush(args); + while ( args->files->nreaders ) + bcf_sr_remove_reader(args->files, 0); + } + } + } + else if ( args->files ) // combining overlapping files, using synced reader + { + while ( bcf_sr_next_line(args->files) ) + { + for (i=0; ifiles->nreaders; i++) + { + bcf1_t *line = bcf_sr_get_line(args->files,i); + if ( !line ) continue; + bcf_translate(args->out_hdr, args->files->readers[i].header, line); + if ( bcf_write1(args->out_fh, args->out_hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + if ( args->remove_dups ) break; + } + } + } + else // concatenating + { + struct timeval t0, t1; + kstring_t tmp = {0,0,0}; + int prev_chr_id = -1, prev_pos; + bcf1_t *line = bcf_init(); + for (i=0; infnames; i++) + { + if ( args->verbose ) + { + fprintf(stderr,"Concatenating %s", args->fnames[i]); + gettimeofday(&t0, NULL); + } + htsFile *fp = hts_open(args->fnames[i], "r"); if ( !fp ) error("\nFailed to open: %s\n", args->fnames[i]); + if ( args->n_threads ) hts_set_opt(fp, HTS_OPT_THREAD_POOL, args->tpool); + bcf_hdr_t *hdr = bcf_hdr_read(fp); if ( !hdr ) error("\nFailed to parse header: %s\n", args->fnames[i]); + if ( !fp->is_bin && args->output_type&FT_VCF ) + { + line->max_unpack = BCF_UN_STR; + // if VCF is on both input and output, avoid VCF to BCF conversion + while ( hts_getline(fp, KS_SEP_LINE, &fp->line) >=0 ) + { + char *str = fp->line.s; + while ( *str && *str!='\t' ) str++; + tmp.l = 0; + kputsn(fp->line.s,str-fp->line.s,&tmp); + int chr_id = bcf_hdr_name2id(args->out_hdr, tmp.s); + if ( chr_id<0 ) error("\nThe sequence \"%s\" not defined in the header: %s\n(Quick workaround: index the file.)\n", tmp.s, args->fnames[i]); + if ( prev_chr_id!=chr_id ) + { + prev_pos = -1; + if ( args->seen_seq[chr_id] ) + error("\nThe chromosome block %s is not contiguous, consider running with -a.\n", tmp.s); + } + char *end; + int pos = strtol(str+1,&end,10) - 1; + if ( end==str+1 ) error("Could not parse line: %s\n", fp->line.s); + if ( prev_pos > pos ) + error("\nThe chromosome block %s is not sorted, consider running with -a.\n", tmp.s); + args->seen_seq[chr_id] = 1; + prev_chr_id = chr_id; + + if ( vcf_write_line(args->out_fh, &fp->line)!=0 ) error("\nFailed to write %"PRIu64" bytes\n", (uint64_t)fp->line.l); + } + } + else + { + // BCF conversion is required + line->max_unpack = 0; + while ( bcf_read(fp, hdr, line)==0 ) + { + bcf_translate(args->out_hdr, hdr, line); + + if ( prev_chr_id!=line->rid ) + { + prev_pos = -1; + if ( args->seen_seq[line->rid] ) + error("\nThe chromosome block %s is not contiguous, consider running with -a.\n", bcf_seqname(args->out_hdr, line)); + } + if ( prev_pos > line->pos ) + error("\nThe chromosome block %s is not sorted, consider running with -a.\n", bcf_seqname(args->out_hdr, line)); + args->seen_seq[line->rid] = 1; + prev_chr_id = line->rid; + + if ( bcf_write(args->out_fh, args->out_hdr, line)!=0 ) error("\nFailed to write\n"); + } + } + bcf_hdr_destroy(hdr); + hts_close(fp); + if ( args->verbose ) + { + gettimeofday(&t1, NULL); + double delta = (t1.tv_sec - t0.tv_sec) * 1e6 + (t1.tv_usec - t0.tv_usec); + fprintf(stderr,"\t%f seconds\n",delta/1e6); + } + } + bcf_destroy(line); + free(tmp.s); + } +} + +int print_vcf_gz_header(BGZF *fp, BGZF *bgzf_out, int print_header, kstring_t *tmp) +{ + char *buffer = (char*) fp->uncompressed_block; + + // Read the header and find the position of the data block + if ( buffer[0]!='#' ) error("Could not parse the header, expected '#', found '%c'\n", buffer[0]); + + int nskip = 1; // end of the header in the current uncompressed block + while (1) + { + if ( buffer[nskip]=='\n' ) + { + nskip++; + if ( nskip>=fp->block_length ) + { + kputsn(buffer,nskip,tmp); + if ( bgzf_read_block(fp) != 0 ) return -1; + if ( !fp->block_length ) break; + nskip = 0; + } + // The header has finished + if ( buffer[nskip]!='#' ) + { + kputsn(buffer,nskip,tmp); + break; + } + } + nskip++; + if ( nskip>=fp->block_length ) + { + kputsn(buffer,fp->block_length,tmp); + if ( bgzf_read_block(fp) != 0 ) return -1; + if ( !fp->block_length ) break; + nskip = 0; + } + } + if ( print_header ) + { + if ( bgzf_write(bgzf_out,tmp->s,tmp->l) != tmp->l ) error("Failed to write %"PRIu64" bytes\n", (uint64_t)tmp->l); + tmp->l = 0; + } + return nskip; +} + +static inline int unpackInt16(const uint8_t *buffer) +{ + return buffer[0] | buffer[1] << 8; +} +static int check_header(const uint8_t *header) +{ + if ( header[0] != 31 || header[1] != 139 || header[2] != 8 ) return -2; + return ((header[3] & 4) != 0 + && unpackInt16((uint8_t*)&header[10]) == 6 + && header[12] == 'B' && header[13] == 'C' + && unpackInt16((uint8_t*)&header[14]) == 2) ? 0 : -1; +} +static void _check_hrecs(const bcf_hdr_t *hdr0, const bcf_hdr_t *hdr, char *fname0, char *fname) +{ + int j; + for (j=0; jnhrec; j++) + { + bcf_hrec_t *hrec0 = hdr0->hrec[j]; + if ( hrec0->type!=BCF_HL_FLT && hrec0->type!=BCF_HL_INFO && hrec0->type!=BCF_HL_FMT && hrec0->type!=BCF_HL_CTG ) continue; // skip fiels w/o IDX + int itag = bcf_hrec_find_key(hrec0, "ID"); + bcf_hrec_t *hrec = bcf_hdr_get_hrec(hdr, hrec0->type, "ID", hrec0->vals[itag], NULL); + + char *type = NULL; + if ( hrec0->type==BCF_HL_FLT ) type = "FILTER"; + if ( hrec0->type==BCF_HL_INFO ) type = "INFO"; + if ( hrec0->type==BCF_HL_FMT ) type = "FORMAT"; + if ( hrec0->type==BCF_HL_CTG ) type = "contig"; + + if ( !hrec ) + error("Cannot use --naive, incompatible headers, the tag %s/%s not present in %s\n",type,hrec0->vals[itag],fname); + + int idx0 = bcf_hrec_find_key(hrec0, "IDX"); + int idx = bcf_hrec_find_key(hrec, "IDX"); + if ( idx0<0 || idx<0 ) + error("fixme: unexpected IDX<0 for %s/%s in %s or %s\n",type,hrec0->vals[itag],fname0,fname); + if ( strcmp(hrec0->vals[idx0],hrec->vals[idx]) ) + error("Cannot use --naive, use --naive-force instead: different order the tag %s/%s in %s vs %s\n",type,hrec0->vals[itag],fname0,fname); + } +} +static void naive_concat_check_headers(args_t *args) +{ + fprintf(stderr,"Checking the headers of %d files.\n",args->nfnames); + bcf_hdr_t *hdr0 = NULL; + int i,j; + for (i=0; infnames; i++) + { + htsFile *fp = hts_open(args->fnames[i], "r"); if ( !fp ) error("Failed to open: %s\n", args->fnames[i]); + bcf_hdr_t *hdr = bcf_hdr_read(fp); if ( !hdr ) error("Failed to parse header: %s\n", args->fnames[i]); + htsFormat type = *hts_get_format(fp); + hts_close(fp); + + if ( i==0 ) + { + hdr0 = hdr; + continue; + } + + // check the samples + if ( bcf_hdr_nsamples(hdr0)!=bcf_hdr_nsamples(hdr) ) + error("Cannot concatenate, different number of samples: %d vs %d in %s vs %s\n",bcf_hdr_nsamples(hdr0),bcf_hdr_nsamples(hdr),args->fnames[0],args->fnames[i]); + for (j=0; jsamples[j],hdr->samples[j]) ) + error("Cannot concatenate, different samples in %s vs %s\n",args->fnames[0],args->fnames[i]); + + // if BCF, check if tag IDs are consistent in the dictionary of strings + if ( type.compression!=bgzf ) + error("The --naive option works only for compressed BCFs or VCFs, sorry :-/\n"); + + _check_hrecs(hdr0,hdr,args->fnames[0],args->fnames[i]); + _check_hrecs(hdr,hdr0,args->fnames[i],args->fnames[0]); + + bcf_hdr_destroy(hdr); + } + if ( hdr0 ) bcf_hdr_destroy(hdr0); + fprintf(stderr,"Done, the headers are compatible.\n"); +} +static void naive_concat(args_t *args) +{ + if ( !args->naive_concat_trust_headers ) + naive_concat_check_headers(args); + + // only compressed BCF atm + BGZF *bgzf_out = bgzf_open(args->output_fname,"w");; + + htsFormat output_type; + output_type.format = (args->output_type & FT_VCF) ? vcf : bcf; + output_type.compression = (args->output_type & FT_GZ) ? bgzf : no_compression; + + struct timeval t0, t1; + const size_t page_size = BGZF_MAX_BLOCK_SIZE; + uint8_t *buf = (uint8_t*) malloc(page_size); + kstring_t tmp = {0,0,0}; + int i, file_types = 0; + for (i=0; infnames; i++) + { + if ( args->verbose ) + { + fprintf(stderr,"Concatenating %s", args->fnames[i]); + gettimeofday(&t0, NULL); + } + htsFile *hts_fp = hts_open(args->fnames[i],"r"); + if ( !hts_fp ) error("\nFailed to open: %s\n", args->fnames[i]); + htsFormat type = *hts_get_format(hts_fp); + + if ( type.compression!=bgzf ) + error("\nThe --naive option works only for compressed BCFs or VCFs\n"); + file_types |= type.format==vcf ? 1 : 2; + if ( file_types==3 ) + error("\nThe --naive option works only for compressed files of the same type, all BCFs or all VCFs\n"); + if ( args->explicit_output_type ) + { + if ( output_type.format!=type.format ) + error("\nThe --naive option works only for the output of the same type, all BCFs or all VCFs\n"); + if ( output_type.compression!=type.compression ) + error("\nThe --naive option works only for the output of the same compression type\n"); + } + + BGZF *fp = hts_get_bgzfp(hts_fp); + if ( !fp || bgzf_read_block(fp) != 0 || !fp->block_length ) + error("\nFailed to read %s: %s\n", args->fnames[i], strerror(errno)); + + int nskip; + if ( type.format==bcf ) + { + uint8_t magic[5]; + if ( bgzf_read(fp, magic, 5) != 5 ) error("\nFailed to read the BCF header in %s\n", args->fnames[i]); + if (strncmp((char*)magic, "BCF\2\2", 5) != 0) error("\nInvalid BCF magic string in %s\n", args->fnames[i]); + + if ( bgzf_read(fp, &tmp.l, 4) != 4 ) error("\nFailed to read the BCF header in %s\n", args->fnames[i]); + hts_expand(char,tmp.l,tmp.m,tmp.s); + if ( bgzf_read(fp, tmp.s, tmp.l) != tmp.l ) error("\nFailed to read the BCF header in %s\n", args->fnames[i]); + + // write only the first header + if ( i==0 ) + { + if ( bgzf_write(bgzf_out, "BCF\2\2", 5) !=5 ) error("\nFailed to write %d bytes to %s\n", 5,args->output_fname); + if ( bgzf_write(bgzf_out, &tmp.l, 4) !=4 ) error("\nFailed to write %d bytes to %s\n", 4,args->output_fname); + if ( bgzf_write(bgzf_out, tmp.s, tmp.l) != tmp.l) error("\nFailed to write %"PRId64" bytes to %s\n", (uint64_t)tmp.l,args->output_fname); + } + nskip = fp->block_offset; + } + else + { + nskip = print_vcf_gz_header(fp, bgzf_out, i==0?1:0, &tmp); + if ( nskip==-1 ) error("\nError reading %s\n", args->fnames[i]); + } + + // Output all non-header data that were read together with the header block + if ( fp->block_length - nskip > 0 ) + { + if ( bgzf_write(bgzf_out, (char *)fp->uncompressed_block+nskip, fp->block_length-nskip)<0 ) error("\nError: %d\n",fp->errcode); + } + if ( bgzf_flush(bgzf_out)<0 ) error("\nError: %d\n",bgzf_out->errcode); + + + // Stream the rest of the file as it is, without recompressing, but remove BGZF EOF blocks + // The final bgzf eof block will be added by bgzf_close. + ssize_t nread, nblock, nwr; + const int nheader = 18, neof = 28; + const uint8_t *eof = (uint8_t*) "\037\213\010\4\0\0\0\0\0\377\6\0\102\103\2\0\033\0\3\0\0\0\0\0\0\0\0\0"; + while (1) + { + nread = bgzf_raw_read(fp, buf, nheader); + if ( !nread ) break; + if ( nread != nheader || check_header(buf)!=0 ) error("\nCould not parse the header of a bgzf block: %s\n",args->fnames[i]); + nblock = unpackInt16(buf+16) + 1; + assert( nblock <= page_size && nblock >= nheader ); + nread += bgzf_raw_read(fp, buf+nheader, nblock - nheader); + if ( nread!=nblock ) error("\nCould not read %"PRId64" bytes: %s\n",(uint64_t)nblock,args->fnames[i]); + if ( nread==neof && !memcmp(buf,eof,neof) ) continue; + nwr = bgzf_raw_write(bgzf_out, buf, nread); + if ( nwr != nread ) error("\nWrite failed, wrote %"PRId64" instead of %d bytes.\n", (uint64_t)nwr,(int)nread); + } + if (hts_close(hts_fp)) error("\nClose failed: %s\n",args->fnames[i]); + if ( args->verbose ) + { + gettimeofday(&t1, NULL); + double delta = (t1.tv_sec - t0.tv_sec) * 1e6 + (t1.tv_usec - t0.tv_usec); + fprintf(stderr,"\t%f seconds\n",delta/1e6); + } + } + free(buf); + free(tmp.s); + if (bgzf_close(bgzf_out) < 0) error("Error: %d\n",bgzf_out->errcode); +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Concatenate or combine VCF/BCF files. All source files must have the same sample\n"); + fprintf(stderr, " columns appearing in the same order. The program can be used, for example, to\n"); + fprintf(stderr, " concatenate chromosome VCFs into one VCF, or combine a SNP VCF and an indel\n"); + fprintf(stderr, " VCF into one. The input files must be sorted by chr and position. The files\n"); + fprintf(stderr, " must be given in the correct order to produce sorted VCF on output unless\n"); + fprintf(stderr, " the -a, --allow-overlaps option is specified. With the --naive option, the files\n"); + fprintf(stderr, " are concatenated without being recompressed, which is very fast.\n"); + fprintf(stderr, "Usage: bcftools concat [options] [ [...]]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -a, --allow-overlaps First coordinate of the next file can precede last record of the current file.\n"); + fprintf(stderr, " -c, --compact-PS Do not output PS tag at each site, only at the start of a new phase set block.\n"); + fprintf(stderr, " -d, --rm-dups STRING Output duplicate records present in multiple files only once: \n"); + fprintf(stderr, " -D, --remove-duplicates Alias for -d exact\n"); + fprintf(stderr, " -f, --file-list FILE Read the list of files from a file.\n"); + fprintf(stderr, " -l, --ligate Ligate phased VCFs by matching phase at overlapping haplotypes\n"); + fprintf(stderr, " --ligate-force Ligate even non-overlapping chunks, keep all sites\n"); + fprintf(stderr, " --ligate-warn Drop sites in imperfect overlaps\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -n, --naive Concatenate files without recompression, a header check compatibility is performed\n"); + fprintf(stderr, " --naive-force Same as --naive, but header compatibility is not checked. Dangerous, use with caution.\n"); + fprintf(stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " -q, --min-PQ INT Break phase set if phasing quality is lower than [30]\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(stderr, " -v, --verbose 0|1 Set verbosity level [1]\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfconcat(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->min_PQ = 30; + args->verbose = 1; + args->clevel = -1; + + static struct option loptions[] = + { + {"verbose",required_argument,NULL,'v'}, + {"naive",no_argument,NULL,'n'}, + {"naive-force",no_argument,NULL,7}, + {"compact-PS",no_argument,NULL,'c'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,12}, + {"remove-duplicates",no_argument,NULL,'D'}, + {"rm-dups",required_argument,NULL,'d'}, + {"allow-overlaps",no_argument,NULL,'a'}, + {"ligate",no_argument,NULL,'l'}, + {"ligate-force",no_argument,NULL,10}, + {"ligate-warn",no_argument,NULL,11}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"file-list",required_argument,NULL,'f'}, + {"min-PQ",required_argument,NULL,'q'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "h:?o:O:f:alq:Dd:r:R:cnv:",loptions,NULL)) >= 0) + { + switch (c) { + case 'c': args->compact_PS = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; args->regions_is_file = 1; break; + case 'd': args->remove_dups = optarg; break; + case 'D': args->remove_dups = "exact"; break; + case 'q': + args->min_PQ = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --min-PQ %s\n", optarg); + break; + case 'n': args->naive_concat = 1; break; + case 'a': args->allow_overlaps = 1; break; + case 'l': args->phased_concat = 1; break; + case 'f': args->file_list = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'O': + args->explicit_output_type = 1; + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 10 : args->ligate_force = 1; break; + case 11 : args->ligate_warn = 1; break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 7 : args->naive_concat = 1; args->naive_concat_trust_headers = 1; break; + case 12 : + args->regions_overlap = parse_overlap_option(optarg); + if ( args->regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 'v': + args->verbose = strtol(optarg, 0, 0); + error("Error: currently only --verbose 0 or --verbose 1 is supported\n"); + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + while ( optindnfnames++; + args->fnames = (char **)realloc(args->fnames,sizeof(char*)*args->nfnames); + args->fnames[args->nfnames-1] = strdup(argv[optind]); + optind++; + } + if ( args->ligate_force && args->ligate_warn ) error("The options cannot be combined: --ligate-force and --ligate-warn\n"); + if ( args->allow_overlaps && args->phased_concat ) error("The options -a and -l should not be combined. Please run with -l only.\n"); + if ( args->compact_PS && !args->phased_concat ) error("The -c option is intended only with -l\n"); + if ( args->file_list ) + { + if ( args->nfnames ) error("Cannot combine -l with file names on command line.\n"); + args->fnames = hts_readlines(args->file_list, &args->nfnames); + if ( !args->fnames ) error("Could not read the file: %s\n", args->file_list); + } + if ( !args->nfnames ) usage(args); + if ( args->remove_dups && !args->allow_overlaps ) error("The -D option is supported only with -a\n"); + if ( args->regions_list && !args->allow_overlaps ) error("The -r/-R option is supported only with -a\n"); + if ( args->naive_concat ) + { + if ( args->allow_overlaps ) error("The option --naive cannot be combined with --allow-overlaps\n"); + if ( args->phased_concat ) error("The option --naive cannot be combined with --ligate\n"); + naive_concat(args); + destroy_data(args); + free(args); + return 0; + } + init_data(args); + concat(args); + destroy_data(args); + free(args); + return 0; +} diff --git a/bcftools/vcfconcat.c.pysam.c b/bcftools/vcfconcat.c.pysam.c new file mode 100644 index 0000000..e2cd43f --- /dev/null +++ b/bcftools/vcfconcat.c.pysam.c @@ -0,0 +1,1064 @@ +#include "bcftools.pysam.h" + +/* vcfconcat.c -- Concatenate or combine VCF/BCF files. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // for hts_get_bgzfp() +#include +#include +#include "bcftools.h" + +typedef struct _args_t +{ + bcf_srs_t *files; + htsFile *out_fh; + int output_type, n_threads, record_cmd_line, clevel; + bcf_hdr_t *out_hdr; + int *seen_seq; + + // phasing + int *start_pos, start_tid, ifname; + int *swap_phase, nswap, *nmatch, *nmism; + bcf1_t **buf; + uint8_t *buf_mask; + int nbuf, mbuf, prev_chr, min_PQ, prev_pos_check; + int32_t *GTa, *GTb, mGTa, mGTb, *phase_qual, *phase_set; + + char **argv, *output_fname, *file_list, **fnames, *remove_dups, *regions_list; + int argc, nfnames, allow_overlaps, phased_concat, regions_is_file, regions_overlap; + int compact_PS, phase_set_changed, naive_concat, naive_concat_trust_headers; + int verbose, explicit_output_type, ligate_force, ligate_warn; + htsThreadPool *tpool; +} +args_t; + +static void init_data(args_t *args) +{ + bcf1_t *line = NULL; + + // With phased concat, the chunks overlap and come in the right order. To + // avoid opening all files at once, store start positions to recognise need + // for the next one. This way we can keep only two open chunks at once. + if ( args->phased_concat ) + { + args->start_pos = (int*) malloc(sizeof(int)*args->nfnames); + line = bcf_init(); + } + + if ( args->verbose ) fprintf(bcftools_stderr,"Checking the headers and starting positions of %d files\n", args->nfnames); + kstring_t str = {0,0,0}; + int i, prev_chrid = -1; + for (i=0; infnames; i++) + { + htsFile *fp = hts_open(args->fnames[i], "r"); if ( !fp ) error("Failed to open: %s\n", args->fnames[i]); + bcf_hdr_t *hdr = bcf_hdr_read(fp); if ( !hdr ) error("Failed to parse header: %s\n", args->fnames[i]); + args->out_hdr = bcf_hdr_merge(args->out_hdr,hdr); + if ( bcf_hdr_nsamples(hdr) != bcf_hdr_nsamples(args->out_hdr) ) + error("Different number of samples in %s. Perhaps \"bcftools merge\" is what you are looking for?\n", args->fnames[i]); + + int j; + for (j=0; jout_hdr->samples[j],hdr->samples[j]) ) + error("Different sample names in %s. Perhaps \"bcftools merge\" is what you are looking for?\n", args->fnames[i]); + + if ( args->phased_concat ) + { + int ret = bcf_read(fp, hdr, line); + if ( ret!=0 ) args->start_pos[i] = -2; // empty file + else + { + int chrid = bcf_hdr_id2int(args->out_hdr,BCF_DT_CTG,bcf_seqname(hdr,line)); + args->start_pos[i] = chrid==prev_chrid ? line->pos : -1; + prev_chrid = chrid; + } + } + bcf_hdr_destroy(hdr); + if ( hts_close(fp)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fnames[i]); + } + free(str.s); + if ( line ) bcf_destroy(line); + + args->seen_seq = (int*) calloc(args->out_hdr->n[BCF_DT_CTG],sizeof(int)); + + if ( args->phased_concat ) + { + bcf_hdr_append(args->out_hdr,"##FORMAT="); + bcf_hdr_append(args->out_hdr,"##FORMAT="); + } + if (args->record_cmd_line) bcf_hdr_append_version(args->out_hdr, args->argc, args->argv, "bcftools_concat"); + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->allow_overlaps || args->phased_concat ) + { + args->files = bcf_sr_init(); + args->files->require_index = 1; + } + if ( args->n_threads ) + { + if ( args->files ) + { + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + args->tpool = args->files->p; + } + else + { + args->tpool = (htsThreadPool*) calloc(1, sizeof(htsThreadPool)); + if ( !args->tpool ) error("Failed to allocate memory\n"); + if ( !(args->tpool->pool = hts_tpool_init(args->n_threads)) ) error("Failed to initialize %d threads\n",args->n_threads); + } + hts_set_opt(args->out_fh, HTS_OPT_THREAD_POOL, args->tpool); + } + if ( bcf_hdr_write(args->out_fh, args->out_hdr)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname); + + if ( args->allow_overlaps ) + { + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, args->regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->remove_dups ) + { + if ( !strcmp(args->remove_dups,"snps") ) args->files->collapse |= COLLAPSE_SNPS; + else if ( !strcmp(args->remove_dups,"indels") ) args->files->collapse |= COLLAPSE_INDELS; + else if ( !strcmp(args->remove_dups,"both") ) args->files->collapse |= COLLAPSE_SNPS | COLLAPSE_INDELS; + else if ( !strcmp(args->remove_dups,"any") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(args->remove_dups,"all") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(args->remove_dups,"none") ) args->files->collapse = COLLAPSE_NONE; + else if ( !strcmp(args->remove_dups,"exact") ) args->files->collapse = COLLAPSE_NONE; + else error("The -D string \"%s\" not recognised.\n", args->remove_dups); + } + for (i=0; infnames; i++) + if ( !bcf_sr_add_reader(args->files,args->fnames[i]) ) error("Failed to open %s: %s\n", args->fnames[i],bcf_sr_strerror(args->files->errnum)); + } + else if ( args->phased_concat ) + { + // Remove empty files from the list + int nok = 0; + while (1) + { + while ( noknfnames && args->start_pos[nok]!=-2 ) nok++; + if ( nok==args->nfnames ) break; + + i = nok; + while ( infnames && args->start_pos[i]==-2 ) i++; + if ( i==args->nfnames ) break; + + int tmp = args->start_pos[nok]; args->start_pos[nok] = args->start_pos[i]; args->start_pos[i] = tmp; + char *str = args->fnames[nok]; args->fnames[nok] = args->fnames[i]; args->fnames[i] = str; + } + for (i=nok; infnames; i++) free(args->fnames[i]); + args->nfnames = nok; + + for (i=1; infnames; i++) + if ( args->start_pos[i-1]!=-1 && args->start_pos[i]!=-1 && args->start_pos[i]start_pos[i-1] ) + error("The files not in ascending order: %d in %s, %d in %s\n", args->start_pos[i-1]+1,args->fnames[i-1],args->start_pos[i]+1,args->fnames[i]); + + args->prev_chr = -1; + args->swap_phase = (int*) calloc(bcf_hdr_nsamples(args->out_hdr),sizeof(int)); + args->nmatch = (int*) calloc(bcf_hdr_nsamples(args->out_hdr),sizeof(int)); + args->nmism = (int*) calloc(bcf_hdr_nsamples(args->out_hdr),sizeof(int)); + args->phase_qual = (int32_t*) malloc(bcf_hdr_nsamples(args->out_hdr)*sizeof(int32_t)); + args->phase_set = (int32_t*) malloc(bcf_hdr_nsamples(args->out_hdr)*sizeof(int32_t)); + args->ifname = 0; + } +} + +static void destroy_data(args_t *args) +{ + int i; + if ( args->out_fh ) + { + if ( hts_close(args->out_fh)!=0 ) error("hts_close error\n"); + } + if ( args->tpool && !args->files ) + { + hts_tpool_destroy(args->tpool->pool); + free(args->tpool); + } + if ( args->files ) bcf_sr_destroy(args->files); + if ( args->out_hdr ) bcf_hdr_destroy(args->out_hdr); + free(args->seen_seq); + free(args->start_pos); + free(args->swap_phase); + for (i=0; imbuf; i++) bcf_destroy(args->buf[i]); + free(args->buf); + free(args->buf_mask); + free(args->GTa); + free(args->GTb); + free(args->nmatch); + free(args->nmism); + free(args->phase_qual); + free(args->phase_set); + for (i=0; infnames; i++) free(args->fnames[i]); + free(args->fnames); +} + +int vcf_write_line(htsFile *fp, kstring_t *line); + +#define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } +static void phase_update(args_t *args, bcf_hdr_t *hdr, bcf1_t *rec) +{ + int i, nGTs = bcf_get_genotypes(hdr, rec, &args->GTa, &args->mGTa); + if ( nGTs <= 0 ) return; // GT field is not present + for (i=0; iswap_phase[i] ) continue; + int *gt = &args->GTa[i*2]; + if ( bcf_gt_is_missing(gt[0]) || gt[1]==bcf_int32_vector_end ) continue; + if ( !bcf_gt_is_phased(gt[1]) ) continue; + SWAP(int, gt[0], gt[1]); + gt[1] |= 1; + } + bcf_update_genotypes(hdr,rec,args->GTa,nGTs); +} + +static void phased_flush(args_t *args) +{ + if ( !args->nbuf ) return; + + bcf_hdr_t *ahdr = args->files->readers[0].header; + bcf_hdr_t *bhdr = args->files->readers[1].header; + + int i, j, nsmpl = bcf_hdr_nsamples(args->out_hdr); + static int gt_absent_warned = 0; + for (i=0; inbuf; i+=2) + { + if ( args->buf_mask[i/2]!=3 ) continue; + + bcf1_t *arec = args->buf[i]; + bcf1_t *brec = args->buf[i+1]; + + int nGTs = bcf_get_genotypes(ahdr, arec, &args->GTa, &args->mGTa); + if ( nGTs < 0 ) + { + if ( !gt_absent_warned ) + { + fprintf(bcftools_stderr,"GT is not present at %s:%"PRId64". (This warning is printed only once.)\n", bcf_seqname(ahdr,arec), (int64_t) arec->pos+1); + gt_absent_warned = 1; + } + continue; + } + if ( nGTs != 2*nsmpl ) continue; // not diploid + nGTs = bcf_get_genotypes(bhdr, brec, &args->GTb, &args->mGTb); + if ( nGTs < 0 ) + { + if ( !gt_absent_warned ) + { + fprintf(bcftools_stderr,"GT is not present at %s:%"PRId64". (This warning is printed only once.)\n", bcf_seqname(bhdr,brec), (int64_t) brec->pos+1); + gt_absent_warned = 1; + } + continue; + } + if ( nGTs != 2*nsmpl ) continue; // not diploid + + for (j=0; jGTa[j*2]; + int *gtb = &args->GTb[j*2]; + if ( gta[1]==bcf_int32_vector_end || gtb[1]==bcf_int32_vector_end ) continue; + if ( bcf_gt_is_missing(gta[0]) || bcf_gt_is_missing(gta[1]) || bcf_gt_is_missing(gtb[0]) || bcf_gt_is_missing(gtb[1]) ) continue; + if ( !bcf_gt_is_phased(gta[1]) || !bcf_gt_is_phased(gtb[1]) ) continue; + if ( bcf_gt_allele(gta[0])==bcf_gt_allele(gta[1]) || bcf_gt_allele(gtb[0])==bcf_gt_allele(gtb[1]) ) continue; + if ( bcf_gt_allele(gta[0])==bcf_gt_allele(gtb[0]) && bcf_gt_allele(gta[1])==bcf_gt_allele(gtb[1]) ) + { + if ( args->swap_phase[j] ) args->nmism[j]++; else args->nmatch[j]++; + } + if ( bcf_gt_allele(gta[0])==bcf_gt_allele(gtb[1]) && bcf_gt_allele(gta[1])==bcf_gt_allele(gtb[0]) ) + { + if ( args->swap_phase[j] ) args->nmatch[j]++; else args->nmism[j]++; + } + } + } + for (i=0; inbuf/2; i+=2) + { + bcf1_t *rec; + bcf_hdr_t *hdr; + int mask = args->buf_mask[i/2]; + if ( mask & 1 ) { rec = args->buf[i]; hdr = args->files->readers[0].header; } + else { rec = args->buf[i+1]; hdr = args->files->readers[1].header; } + bcf_translate(args->out_hdr, hdr, rec); + if ( args->nswap && (mask&1) ) + phase_update(args, args->out_hdr, rec); + if ( !args->compact_PS || args->phase_set_changed ) + { + bcf_update_format_int32(args->out_hdr,rec,"PS",args->phase_set,nsmpl); + args->phase_set_changed = 0; + } + if ( bcf_write(args->out_fh, args->out_hdr, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + + if ( rec->pos < args->prev_pos_check ) error("FIXME, disorder: %s:%"PRId64" vs %d [1]\n", bcf_seqname(hdr,rec),(int64_t)rec->pos+1,args->prev_pos_check+1); + args->prev_pos_check = rec->pos; + } + args->nswap = 0; + for (j=0; jnmatch[j] >= args->nmism[j] ) + args->swap_phase[j] = 0; + else + { + args->swap_phase[j] = 1; + args->nswap++; + } + if ( args->nmatch[j] && args->nmism[j] ) + { + // Entropy-inspired quality. The factor 0.7 shifts and scales to (0,1) + double f = (double)args->nmatch[j]/(args->nmatch[j]+args->nmism[j]); + args->phase_qual[j] = 99*(0.7 + f*log(f) + (1-f)*log(1-f))/0.7; + } + else + args->phase_qual[j] = 99; + args->nmatch[j] = 0; + args->nmism[j] = 0; + } + int PQ_printed = 0; + for (; inbuf; i+=2) + { + bcf1_t *rec; + bcf_hdr_t *hdr; + int mask = args->buf_mask[i/2]; + if ( mask & 2 ) { rec = args->buf[i+1]; hdr = args->files->readers[1].header; } + else { rec = args->buf[i]; hdr = args->files->readers[0].header; } + bcf_translate(args->out_hdr, hdr, rec); + if ( !PQ_printed && mask==3 ) + { + bcf_update_format_int32(args->out_hdr,rec,"PQ",args->phase_qual,nsmpl); + PQ_printed = 1; + for (j=0; jphase_qual[j] < args->min_PQ ) + { + args->phase_set[j] = rec->pos+1; + args->phase_set_changed = 1; + } + else if ( args->compact_PS ) args->phase_set[j] = bcf_int32_missing; + } + if ( args->nswap ) + phase_update(args, args->out_hdr, rec); + if ( !args->compact_PS || args->phase_set_changed ) + { + bcf_update_format_int32(args->out_hdr,rec,"PS",args->phase_set,nsmpl); + args->phase_set_changed = 0; + } + if ( bcf_write(args->out_fh, args->out_hdr, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + + if ( rec->pos < args->prev_pos_check ) error("FIXME, disorder: %s:%"PRId64" vs %d [2]\n", bcf_seqname(hdr,rec),(int64_t)rec->pos+1,args->prev_pos_check+1); + args->prev_pos_check = rec->pos; + } + args->nbuf = 0; +} + +static void phased_push(args_t *args, bcf1_t *arec, bcf1_t *brec, int is_overlap) +{ + bcf_hdr_t *ahdr = arec ? bcf_sr_get_header(args->files,0) : NULL; + bcf_hdr_t *bhdr = brec ? bcf_sr_get_header(args->files,1) : NULL; + + if ( arec && arec->errcode ) + error("Parse error at %s:%"PRId64", cannot proceed: %s\n", bcf_seqname(ahdr,arec),(int64_t) arec->pos+1, args->files->readers[0].fname); + if ( brec && brec->errcode ) + error("Parse error at %s:%"PRId64", cannot proceed: %s\n", bcf_seqname(bhdr,brec),(int64_t) brec->pos+1, args->files->readers[1].fname); + + int i, nsmpl = bcf_hdr_nsamples(args->out_hdr); + int chr_id = arec ? bcf_hdr_name2id(args->out_hdr,bcf_seqname(ahdr,arec)) : bcf_hdr_name2id(args->out_hdr,bcf_seqname(bhdr,brec)); + if ( args->prev_chr<0 || args->prev_chr!=chr_id ) + { + if ( args->prev_chr>=0 ) phased_flush(args); + + for (i=0; iphase_set[i] = arec ? arec->pos+1 : brec->pos+1; + args->phase_set_changed = 1; + + if ( args->seen_seq[chr_id] ) error("The chromosome block %s is not contiguous\n", arec ? bcf_seqname(ahdr,arec) : bcf_seqname(bhdr,brec)); + args->seen_seq[chr_id] = 1; + args->prev_chr = chr_id; + args->prev_pos_check = -1; + } + + if ( !is_overlap ) + { + assert(arec); + + bcf_translate(args->out_hdr, ahdr, arec); + if ( args->nswap ) + phase_update(args, args->out_hdr, arec); + if ( !args->compact_PS || args->phase_set_changed ) + { + bcf_update_format_int32(args->out_hdr,arec,"PS",args->phase_set,nsmpl); + args->phase_set_changed = 0; + } + if ( bcf_write(args->out_fh, args->out_hdr, arec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + + if ( arec->pos < args->prev_pos_check ) + error("FIXME, disorder: %s:%"PRId64" in %s vs %d written [3]\n", bcf_seqname(ahdr,arec), (int64_t) arec->pos+1,args->files->readers[0].fname, args->prev_pos_check+1); + args->prev_pos_check = arec->pos; + return; + } + + int m = args->mbuf; + args->nbuf += 2; + hts_expand(bcf1_t*,args->nbuf,args->mbuf,args->buf); + if ( m < args->mbuf ) args->buf_mask = (uint8_t*)realloc(args->buf_mask,sizeof(*args->buf_mask)*args->mbuf); + for (i=m; imbuf; i++) + args->buf[i] = bcf_init1(); + + if ( arec ) SWAP(bcf1_t*, args->files->readers[0].buffer[0], args->buf[args->nbuf-2]); + if ( brec ) SWAP(bcf1_t*, args->files->readers[1].buffer[0], args->buf[args->nbuf-1]); + args->buf_mask[args->nbuf/2-1] = (arec?1:0) | (brec?2:0); +} + +static int _get_active_index(bcf_srs_t *sr) +{ + int i; + for (i=0; inreaders; i++) + if ( bcf_sr_has_line(sr,i) ) return i; + return -1; +} + +static void concat(args_t *args) +{ + static int site_drop_warned = 0; + int i; + if ( args->phased_concat ) // phased concat + { + // keep only two open files at a time + while ( args->ifname < args->nfnames ) + { + int new_file = 0; + while ( args->files->nreaders < 2 && args->ifname < args->nfnames ) + { + if ( !bcf_sr_add_reader(args->files,args->fnames[args->ifname]) ) error("Failed to open %s: %s\n", args->fnames[args->ifname],bcf_sr_strerror(args->files->errnum)); + new_file = 1; + + args->ifname++; + if ( args->start_pos[args->ifname-1]==-1 ) break; // new chromosome, start with only one file open + if ( args->ifname < args->nfnames && args->start_pos[args->ifname]==-1 ) break; // next file starts on a different chromosome + } + + // is there a line from the previous run? Seek the newly opened reader to that position + int seek_pos = -1; + int seek_chr = -1; + if ( bcf_sr_has_line(args->files,0) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + bcf_sr_seek(args->files, bcf_seqname(args->files->readers[0].header,line), line->pos); + seek_pos = line->pos; + seek_chr = bcf_hdr_name2id(args->out_hdr, bcf_seqname(args->files->readers[0].header,line)); + } + else if ( new_file ) + bcf_sr_seek(args->files,NULL,0); // set to start + + int nret, ir; + while ( (nret = bcf_sr_next_line(args->files)) ) + { + int is_overlap = args->files->nreaders==1 ? 0 : 1; + if ( !bcf_sr_has_line(args->files,0) ) // no input from the first reader + { + // We are assuming that there is a perfect overlap, sites which are not present in both files are dropped + if ( bcf_sr_region_done(args->files,0) ) + { + phased_flush(args); + bcf_sr_remove_reader(args->files, 0); + is_overlap = 0; + } + else if ( args->ligate_warn ) + { + if ( !site_drop_warned ) + { + ir = _get_active_index(args->files); + fprintf(bcftools_stderr, + "Warning: Dropping the site %s:%"PRId64". The --ligate option is intended for VCFs with perfect\n" + " overlap, sites in overlapping regions present in one but missing in other are dropped.\n" + " This warning is printed only once.\n", + bcf_seqname(bcf_sr_get_header(args->files,ir),bcf_sr_get_line(args->files,ir)), (int64_t) bcf_sr_get_line(args->files,ir)->pos+1); + site_drop_warned = 1; + } + continue; + } + else if ( !args->ligate_force ) + { + ir = _get_active_index(args->files); + error("Error: The --ligate option is intended for VCFs with perfect overlap, the site %s:%"PRId64" breaks the assumption\n", + bcf_seqname(bcf_sr_get_header(args->files,ir),bcf_sr_get_line(args->files,ir)), (int64_t) bcf_sr_get_line(args->files,ir)->pos+1); + } + } + + // Get a line to learn about current position + ir = _get_active_index(args->files); + bcf1_t *line = bcf_sr_get_line(args->files,ir); + + // This can happen after bcf_sr_seek: indel may start before the coordinate which we seek to. + if ( seek_chr>=0 && seek_pos>line->pos && seek_chr==bcf_hdr_name2id(args->out_hdr, bcf_seqname(args->files->readers[ir].header,line)) ) continue; + seek_pos = seek_chr = -1; + + // Check if the position overlaps with the next, yet unopened, reader + int must_seek = 0; + while ( args->ifname < args->nfnames && args->start_pos[args->ifname]!=-1 && line->pos >= args->start_pos[args->ifname] ) + { + must_seek = 1; + if ( !bcf_sr_add_reader(args->files,args->fnames[args->ifname]) ) error("Failed to open %s: %s\n", args->fnames[args->ifname],bcf_sr_strerror(args->files->errnum)); + args->ifname++; + } + if ( must_seek ) + { + bcf_sr_seek(args->files, bcf_seqname(args->files->readers[ir].header,line), line->pos); + seek_pos = line->pos; + seek_chr = bcf_hdr_name2id(args->out_hdr, bcf_seqname(args->files->readers[ir].header,line)); + continue; + } + + // We are assuming that there is a perfect overlap, sites which are not present in both files are dropped + if ( args->files->nreaders>1 && !bcf_sr_has_line(args->files,1) && !bcf_sr_region_done(args->files,1) && !args->ligate_force ) + { + if ( args->ligate_warn && !site_drop_warned ) + { + ir = _get_active_index(args->files); + fprintf(bcftools_stderr, + "Warning: Dropping the site %s:%"PRId64". The --ligate option is intended for VCFs with perfect\n" + " overlap, sites in overlapping regions present in one but missing in other are dropped.\n" + " This warning is printed only once.\n", + bcf_seqname(bcf_sr_get_header(args->files,ir),line), (int64_t) line->pos+1); + site_drop_warned = 1; + } + else if ( !args->ligate_warn ) + { + ir = _get_active_index(args->files); + error("Error: The --ligate option is intended for VCFs with perfect overlap, the site %s:%"PRId64" breaks the assumption\n", + bcf_seqname(bcf_sr_get_header(args->files,ir),bcf_sr_get_line(args->files,ir)), (int64_t) bcf_sr_get_line(args->files,ir)->pos+1); + } + continue; + } + + bcf1_t *line0 = bcf_sr_get_line(args->files,0); + bcf1_t *line1 = args->files->nreaders > 1 ? bcf_sr_get_line(args->files,1) : NULL; + phased_push(args, line0, line1, is_overlap); + } + + if ( args->files->nreaders ) + { + phased_flush(args); + while ( args->files->nreaders ) + bcf_sr_remove_reader(args->files, 0); + } + } + } + else if ( args->files ) // combining overlapping files, using synced reader + { + while ( bcf_sr_next_line(args->files) ) + { + for (i=0; ifiles->nreaders; i++) + { + bcf1_t *line = bcf_sr_get_line(args->files,i); + if ( !line ) continue; + bcf_translate(args->out_hdr, args->files->readers[i].header, line); + if ( bcf_write1(args->out_fh, args->out_hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + if ( args->remove_dups ) break; + } + } + } + else // concatenating + { + struct timeval t0, t1; + kstring_t tmp = {0,0,0}; + int prev_chr_id = -1, prev_pos; + bcf1_t *line = bcf_init(); + for (i=0; infnames; i++) + { + if ( args->verbose ) + { + fprintf(bcftools_stderr,"Concatenating %s", args->fnames[i]); + gettimeofday(&t0, NULL); + } + htsFile *fp = hts_open(args->fnames[i], "r"); if ( !fp ) error("\nFailed to open: %s\n", args->fnames[i]); + if ( args->n_threads ) hts_set_opt(fp, HTS_OPT_THREAD_POOL, args->tpool); + bcf_hdr_t *hdr = bcf_hdr_read(fp); if ( !hdr ) error("\nFailed to parse header: %s\n", args->fnames[i]); + if ( !fp->is_bin && args->output_type&FT_VCF ) + { + line->max_unpack = BCF_UN_STR; + // if VCF is on both input and output, avoid VCF to BCF conversion + while ( hts_getline(fp, KS_SEP_LINE, &fp->line) >=0 ) + { + char *str = fp->line.s; + while ( *str && *str!='\t' ) str++; + tmp.l = 0; + kputsn(fp->line.s,str-fp->line.s,&tmp); + int chr_id = bcf_hdr_name2id(args->out_hdr, tmp.s); + if ( chr_id<0 ) error("\nThe sequence \"%s\" not defined in the header: %s\n(Quick workaround: index the file.)\n", tmp.s, args->fnames[i]); + if ( prev_chr_id!=chr_id ) + { + prev_pos = -1; + if ( args->seen_seq[chr_id] ) + error("\nThe chromosome block %s is not contiguous, consider running with -a.\n", tmp.s); + } + char *end; + int pos = strtol(str+1,&end,10) - 1; + if ( end==str+1 ) error("Could not parse line: %s\n", fp->line.s); + if ( prev_pos > pos ) + error("\nThe chromosome block %s is not sorted, consider running with -a.\n", tmp.s); + args->seen_seq[chr_id] = 1; + prev_chr_id = chr_id; + + if ( vcf_write_line(args->out_fh, &fp->line)!=0 ) error("\nFailed to write %"PRIu64" bytes\n", (uint64_t)fp->line.l); + } + } + else + { + // BCF conversion is required + line->max_unpack = 0; + while ( bcf_read(fp, hdr, line)==0 ) + { + bcf_translate(args->out_hdr, hdr, line); + + if ( prev_chr_id!=line->rid ) + { + prev_pos = -1; + if ( args->seen_seq[line->rid] ) + error("\nThe chromosome block %s is not contiguous, consider running with -a.\n", bcf_seqname(args->out_hdr, line)); + } + if ( prev_pos > line->pos ) + error("\nThe chromosome block %s is not sorted, consider running with -a.\n", bcf_seqname(args->out_hdr, line)); + args->seen_seq[line->rid] = 1; + prev_chr_id = line->rid; + + if ( bcf_write(args->out_fh, args->out_hdr, line)!=0 ) error("\nFailed to write\n"); + } + } + bcf_hdr_destroy(hdr); + hts_close(fp); + if ( args->verbose ) + { + gettimeofday(&t1, NULL); + double delta = (t1.tv_sec - t0.tv_sec) * 1e6 + (t1.tv_usec - t0.tv_usec); + fprintf(bcftools_stderr,"\t%f seconds\n",delta/1e6); + } + } + bcf_destroy(line); + free(tmp.s); + } +} + +int print_vcf_gz_header(BGZF *fp, BGZF *bgzf_out, int print_header, kstring_t *tmp) +{ + char *buffer = (char*) fp->uncompressed_block; + + // Read the header and find the position of the data block + if ( buffer[0]!='#' ) error("Could not parse the header, expected '#', found '%c'\n", buffer[0]); + + int nskip = 1; // end of the header in the current uncompressed block + while (1) + { + if ( buffer[nskip]=='\n' ) + { + nskip++; + if ( nskip>=fp->block_length ) + { + kputsn(buffer,nskip,tmp); + if ( bgzf_read_block(fp) != 0 ) return -1; + if ( !fp->block_length ) break; + nskip = 0; + } + // The header has finished + if ( buffer[nskip]!='#' ) + { + kputsn(buffer,nskip,tmp); + break; + } + } + nskip++; + if ( nskip>=fp->block_length ) + { + kputsn(buffer,fp->block_length,tmp); + if ( bgzf_read_block(fp) != 0 ) return -1; + if ( !fp->block_length ) break; + nskip = 0; + } + } + if ( print_header ) + { + if ( bgzf_write(bgzf_out,tmp->s,tmp->l) != tmp->l ) error("Failed to write %"PRIu64" bytes\n", (uint64_t)tmp->l); + tmp->l = 0; + } + return nskip; +} + +static inline int unpackInt16(const uint8_t *buffer) +{ + return buffer[0] | buffer[1] << 8; +} +static int check_header(const uint8_t *header) +{ + if ( header[0] != 31 || header[1] != 139 || header[2] != 8 ) return -2; + return ((header[3] & 4) != 0 + && unpackInt16((uint8_t*)&header[10]) == 6 + && header[12] == 'B' && header[13] == 'C' + && unpackInt16((uint8_t*)&header[14]) == 2) ? 0 : -1; +} +static void _check_hrecs(const bcf_hdr_t *hdr0, const bcf_hdr_t *hdr, char *fname0, char *fname) +{ + int j; + for (j=0; jnhrec; j++) + { + bcf_hrec_t *hrec0 = hdr0->hrec[j]; + if ( hrec0->type!=BCF_HL_FLT && hrec0->type!=BCF_HL_INFO && hrec0->type!=BCF_HL_FMT && hrec0->type!=BCF_HL_CTG ) continue; // skip fiels w/o IDX + int itag = bcf_hrec_find_key(hrec0, "ID"); + bcf_hrec_t *hrec = bcf_hdr_get_hrec(hdr, hrec0->type, "ID", hrec0->vals[itag], NULL); + + char *type = NULL; + if ( hrec0->type==BCF_HL_FLT ) type = "FILTER"; + if ( hrec0->type==BCF_HL_INFO ) type = "INFO"; + if ( hrec0->type==BCF_HL_FMT ) type = "FORMAT"; + if ( hrec0->type==BCF_HL_CTG ) type = "contig"; + + if ( !hrec ) + error("Cannot use --naive, incompatible headers, the tag %s/%s not present in %s\n",type,hrec0->vals[itag],fname); + + int idx0 = bcf_hrec_find_key(hrec0, "IDX"); + int idx = bcf_hrec_find_key(hrec, "IDX"); + if ( idx0<0 || idx<0 ) + error("fixme: unexpected IDX<0 for %s/%s in %s or %s\n",type,hrec0->vals[itag],fname0,fname); + if ( strcmp(hrec0->vals[idx0],hrec->vals[idx]) ) + error("Cannot use --naive, use --naive-force instead: different order the tag %s/%s in %s vs %s\n",type,hrec0->vals[itag],fname0,fname); + } +} +static void naive_concat_check_headers(args_t *args) +{ + fprintf(bcftools_stderr,"Checking the headers of %d files.\n",args->nfnames); + bcf_hdr_t *hdr0 = NULL; + int i,j; + for (i=0; infnames; i++) + { + htsFile *fp = hts_open(args->fnames[i], "r"); if ( !fp ) error("Failed to open: %s\n", args->fnames[i]); + bcf_hdr_t *hdr = bcf_hdr_read(fp); if ( !hdr ) error("Failed to parse header: %s\n", args->fnames[i]); + htsFormat type = *hts_get_format(fp); + hts_close(fp); + + if ( i==0 ) + { + hdr0 = hdr; + continue; + } + + // check the samples + if ( bcf_hdr_nsamples(hdr0)!=bcf_hdr_nsamples(hdr) ) + error("Cannot concatenate, different number of samples: %d vs %d in %s vs %s\n",bcf_hdr_nsamples(hdr0),bcf_hdr_nsamples(hdr),args->fnames[0],args->fnames[i]); + for (j=0; jsamples[j],hdr->samples[j]) ) + error("Cannot concatenate, different samples in %s vs %s\n",args->fnames[0],args->fnames[i]); + + // if BCF, check if tag IDs are consistent in the dictionary of strings + if ( type.compression!=bgzf ) + error("The --naive option works only for compressed BCFs or VCFs, sorry :-/\n"); + + _check_hrecs(hdr0,hdr,args->fnames[0],args->fnames[i]); + _check_hrecs(hdr,hdr0,args->fnames[i],args->fnames[0]); + + bcf_hdr_destroy(hdr); + } + if ( hdr0 ) bcf_hdr_destroy(hdr0); + fprintf(bcftools_stderr,"Done, the headers are compatible.\n"); +} +static void naive_concat(args_t *args) +{ + if ( !args->naive_concat_trust_headers ) + naive_concat_check_headers(args); + + // only compressed BCF atm + BGZF *bgzf_out = bgzf_open(args->output_fname,"w");; + + htsFormat output_type; + output_type.format = (args->output_type & FT_VCF) ? vcf : bcf; + output_type.compression = (args->output_type & FT_GZ) ? bgzf : no_compression; + + struct timeval t0, t1; + const size_t page_size = BGZF_MAX_BLOCK_SIZE; + uint8_t *buf = (uint8_t*) malloc(page_size); + kstring_t tmp = {0,0,0}; + int i, file_types = 0; + for (i=0; infnames; i++) + { + if ( args->verbose ) + { + fprintf(bcftools_stderr,"Concatenating %s", args->fnames[i]); + gettimeofday(&t0, NULL); + } + htsFile *hts_fp = hts_open(args->fnames[i],"r"); + if ( !hts_fp ) error("\nFailed to open: %s\n", args->fnames[i]); + htsFormat type = *hts_get_format(hts_fp); + + if ( type.compression!=bgzf ) + error("\nThe --naive option works only for compressed BCFs or VCFs\n"); + file_types |= type.format==vcf ? 1 : 2; + if ( file_types==3 ) + error("\nThe --naive option works only for compressed files of the same type, all BCFs or all VCFs\n"); + if ( args->explicit_output_type ) + { + if ( output_type.format!=type.format ) + error("\nThe --naive option works only for the output of the same type, all BCFs or all VCFs\n"); + if ( output_type.compression!=type.compression ) + error("\nThe --naive option works only for the output of the same compression type\n"); + } + + BGZF *fp = hts_get_bgzfp(hts_fp); + if ( !fp || bgzf_read_block(fp) != 0 || !fp->block_length ) + error("\nFailed to read %s: %s\n", args->fnames[i], strerror(errno)); + + int nskip; + if ( type.format==bcf ) + { + uint8_t magic[5]; + if ( bgzf_read(fp, magic, 5) != 5 ) error("\nFailed to read the BCF header in %s\n", args->fnames[i]); + if (strncmp((char*)magic, "BCF\2\2", 5) != 0) error("\nInvalid BCF magic string in %s\n", args->fnames[i]); + + if ( bgzf_read(fp, &tmp.l, 4) != 4 ) error("\nFailed to read the BCF header in %s\n", args->fnames[i]); + hts_expand(char,tmp.l,tmp.m,tmp.s); + if ( bgzf_read(fp, tmp.s, tmp.l) != tmp.l ) error("\nFailed to read the BCF header in %s\n", args->fnames[i]); + + // write only the first header + if ( i==0 ) + { + if ( bgzf_write(bgzf_out, "BCF\2\2", 5) !=5 ) error("\nFailed to write %d bytes to %s\n", 5,args->output_fname); + if ( bgzf_write(bgzf_out, &tmp.l, 4) !=4 ) error("\nFailed to write %d bytes to %s\n", 4,args->output_fname); + if ( bgzf_write(bgzf_out, tmp.s, tmp.l) != tmp.l) error("\nFailed to write %"PRId64" bytes to %s\n", (uint64_t)tmp.l,args->output_fname); + } + nskip = fp->block_offset; + } + else + { + nskip = print_vcf_gz_header(fp, bgzf_out, i==0?1:0, &tmp); + if ( nskip==-1 ) error("\nError reading %s\n", args->fnames[i]); + } + + // Output all non-header data that were read together with the header block + if ( fp->block_length - nskip > 0 ) + { + if ( bgzf_write(bgzf_out, (char *)fp->uncompressed_block+nskip, fp->block_length-nskip)<0 ) error("\nError: %d\n",fp->errcode); + } + if ( bgzf_flush(bgzf_out)<0 ) error("\nError: %d\n",bgzf_out->errcode); + + + // Stream the rest of the file as it is, without recompressing, but remove BGZF EOF blocks + // The final bgzf eof block will be added by bgzf_close. + ssize_t nread, nblock, nwr; + const int nheader = 18, neof = 28; + const uint8_t *eof = (uint8_t*) "\037\213\010\4\0\0\0\0\0\377\6\0\102\103\2\0\033\0\3\0\0\0\0\0\0\0\0\0"; + while (1) + { + nread = bgzf_raw_read(fp, buf, nheader); + if ( !nread ) break; + if ( nread != nheader || check_header(buf)!=0 ) error("\nCould not parse the header of a bgzf block: %s\n",args->fnames[i]); + nblock = unpackInt16(buf+16) + 1; + assert( nblock <= page_size && nblock >= nheader ); + nread += bgzf_raw_read(fp, buf+nheader, nblock - nheader); + if ( nread!=nblock ) error("\nCould not read %"PRId64" bytes: %s\n",(uint64_t)nblock,args->fnames[i]); + if ( nread==neof && !memcmp(buf,eof,neof) ) continue; + nwr = bgzf_raw_write(bgzf_out, buf, nread); + if ( nwr != nread ) error("\nWrite failed, wrote %"PRId64" instead of %d bytes.\n", (uint64_t)nwr,(int)nread); + } + if (hts_close(hts_fp)) error("\nClose failed: %s\n",args->fnames[i]); + if ( args->verbose ) + { + gettimeofday(&t1, NULL); + double delta = (t1.tv_sec - t0.tv_sec) * 1e6 + (t1.tv_usec - t0.tv_usec); + fprintf(bcftools_stderr,"\t%f seconds\n",delta/1e6); + } + } + free(buf); + free(tmp.s); + if (bgzf_close(bgzf_out) < 0) error("Error: %d\n",bgzf_out->errcode); +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Concatenate or combine VCF/BCF files. All source files must have the same sample\n"); + fprintf(bcftools_stderr, " columns appearing in the same order. The program can be used, for example, to\n"); + fprintf(bcftools_stderr, " concatenate chromosome VCFs into one VCF, or combine a SNP VCF and an indel\n"); + fprintf(bcftools_stderr, " VCF into one. The input files must be sorted by chr and position. The files\n"); + fprintf(bcftools_stderr, " must be given in the correct order to produce sorted VCF on output unless\n"); + fprintf(bcftools_stderr, " the -a, --allow-overlaps option is specified. With the --naive option, the files\n"); + fprintf(bcftools_stderr, " are concatenated without being recompressed, which is very fast.\n"); + fprintf(bcftools_stderr, "Usage: bcftools concat [options] [ [...]]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -a, --allow-overlaps First coordinate of the next file can precede last record of the current file.\n"); + fprintf(bcftools_stderr, " -c, --compact-PS Do not output PS tag at each site, only at the start of a new phase set block.\n"); + fprintf(bcftools_stderr, " -d, --rm-dups STRING Output duplicate records present in multiple files only once: \n"); + fprintf(bcftools_stderr, " -D, --remove-duplicates Alias for -d exact\n"); + fprintf(bcftools_stderr, " -f, --file-list FILE Read the list of files from a file.\n"); + fprintf(bcftools_stderr, " -l, --ligate Ligate phased VCFs by matching phase at overlapping haplotypes\n"); + fprintf(bcftools_stderr, " --ligate-force Ligate even non-overlapping chunks, keep all sites\n"); + fprintf(bcftools_stderr, " --ligate-warn Drop sites in imperfect overlaps\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -n, --naive Concatenate files without recompression, a header check compatibility is performed\n"); + fprintf(bcftools_stderr, " --naive-force Same as --naive, but header compatibility is not checked. Dangerous, use with caution.\n"); + fprintf(bcftools_stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " -q, --min-PQ INT Break phase set if phasing quality is lower than [30]\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(bcftools_stderr, " -v, --verbose 0|1 Set verbosity level [1]\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfconcat(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->min_PQ = 30; + args->verbose = 1; + args->clevel = -1; + + static struct option loptions[] = + { + {"verbose",required_argument,NULL,'v'}, + {"naive",no_argument,NULL,'n'}, + {"naive-force",no_argument,NULL,7}, + {"compact-PS",no_argument,NULL,'c'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,12}, + {"remove-duplicates",no_argument,NULL,'D'}, + {"rm-dups",required_argument,NULL,'d'}, + {"allow-overlaps",no_argument,NULL,'a'}, + {"ligate",no_argument,NULL,'l'}, + {"ligate-force",no_argument,NULL,10}, + {"ligate-warn",no_argument,NULL,11}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"file-list",required_argument,NULL,'f'}, + {"min-PQ",required_argument,NULL,'q'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "h:?o:O:f:alq:Dd:r:R:cnv:",loptions,NULL)) >= 0) + { + switch (c) { + case 'c': args->compact_PS = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; args->regions_is_file = 1; break; + case 'd': args->remove_dups = optarg; break; + case 'D': args->remove_dups = "exact"; break; + case 'q': + args->min_PQ = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --min-PQ %s\n", optarg); + break; + case 'n': args->naive_concat = 1; break; + case 'a': args->allow_overlaps = 1; break; + case 'l': args->phased_concat = 1; break; + case 'f': args->file_list = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'O': + args->explicit_output_type = 1; + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 10 : args->ligate_force = 1; break; + case 11 : args->ligate_warn = 1; break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 7 : args->naive_concat = 1; args->naive_concat_trust_headers = 1; break; + case 12 : + args->regions_overlap = parse_overlap_option(optarg); + if ( args->regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 'v': + args->verbose = strtol(optarg, 0, 0); + error("Error: currently only --verbose 0 or --verbose 1 is supported\n"); + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + while ( optindnfnames++; + args->fnames = (char **)realloc(args->fnames,sizeof(char*)*args->nfnames); + args->fnames[args->nfnames-1] = strdup(argv[optind]); + optind++; + } + if ( args->ligate_force && args->ligate_warn ) error("The options cannot be combined: --ligate-force and --ligate-warn\n"); + if ( args->allow_overlaps && args->phased_concat ) error("The options -a and -l should not be combined. Please run with -l only.\n"); + if ( args->compact_PS && !args->phased_concat ) error("The -c option is intended only with -l\n"); + if ( args->file_list ) + { + if ( args->nfnames ) error("Cannot combine -l with file names on command line.\n"); + args->fnames = hts_readlines(args->file_list, &args->nfnames); + if ( !args->fnames ) error("Could not read the file: %s\n", args->file_list); + } + if ( !args->nfnames ) usage(args); + if ( args->remove_dups && !args->allow_overlaps ) error("The -D option is supported only with -a\n"); + if ( args->regions_list && !args->allow_overlaps ) error("The -r/-R option is supported only with -a\n"); + if ( args->naive_concat ) + { + if ( args->allow_overlaps ) error("The option --naive cannot be combined with --allow-overlaps\n"); + if ( args->phased_concat ) error("The option --naive cannot be combined with --ligate\n"); + naive_concat(args); + destroy_data(args); + free(args); + return 0; + } + init_data(args); + concat(args); + destroy_data(args); + free(args); + return 0; +} diff --git a/bcftools/vcfconvert.c b/bcftools/vcfconvert.c new file mode 100644 index 0000000..ce5ed99 --- /dev/null +++ b/bcftools/vcfconvert.c @@ -0,0 +1,1677 @@ +/* vcfconvert.c -- convert between VCF/BCF and related formats. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "convert.h" +#include "tsv2vcf.h" + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +typedef struct _args_t args_t; +struct _args_t +{ + faidx_t *ref; + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + convert_t *convert; + bcf_srs_t *files; + bcf_hdr_t *header; + void (*convert_func)(struct _args_t *); + struct { + int total, skipped, hom_rr, het_ra, hom_aa, het_aa, missing; + } n; + kstring_t str; + int32_t *gts; + float *flt; + int rev_als, output_vcf_ids, hap2dip, gen_3N6; + int nsamples, *samples, sample_is_file, targets_is_file, regions_is_file, output_type; + int regions_overlap, targets_overlap; + char **argv, *sample_list, *targets_list, *regions_list, *tag, *columns; + char *outfname, *infname, *ref_fname, *sex_fname; + int argc, n_threads, record_cmd_line, keep_duplicates, clevel; +}; + +static void destroy_data(args_t *args) +{ + if ( args->ref ) fai_destroy(args->ref); + if ( args->convert) convert_destroy(args->convert); + if ( args->filter ) filter_destroy(args->filter); + free(args->samples); + if ( args->files ) bcf_sr_destroy(args->files); +} + +static void open_vcf(args_t *args, const char *format_str) +{ + args->files = bcf_sr_init(); + if ( args->n_threads && bcf_sr_set_threads(args->files, args->n_threads)!=0 ) + error("Could not initialize --threads %d\n", args->n_threads); + + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, args->regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,args->targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, args->targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( !bcf_sr_add_reader(args->files, args->infname) ) + error("Failed to open %s: %s\n", args->infname,bcf_sr_strerror(args->files->errnum)); + + args->header = args->files->readers[0].header; + + if ( args->filter_str ) + args->filter = filter_init(args->header, args->filter_str); + + int i, nsamples = 0, *samples = NULL; + if ( args->sample_list && strcmp("-",args->sample_list) ) + { + for (i=0; ifiles->nreaders; i++) + { + int ret = bcf_hdr_set_samples(args->files->readers[i].header,args->sample_list,args->sample_is_file); + if ( ret<0 ) error("Error parsing the sample list\n"); + else if ( ret>0 ) error("Sample name mismatch: sample #%d not found in the header\n", ret); + } + + if ( args->sample_list[0]!='^' ) + { + // the sample ordering may be different if not negated + int n; + char **smpls = hts_readlist(args->sample_list, args->sample_is_file, &n); + if ( !smpls ) error("Could not parse %s\n", args->sample_list); + if ( n!=bcf_hdr_nsamples(args->files->readers[0].header) ) + error("The number of samples does not match, perhaps some are present multiple times?\n"); + nsamples = bcf_hdr_nsamples(args->files->readers[0].header); + samples = (int*) malloc(sizeof(int)*nsamples); + for (i=0; ifiles->readers[0].header, BCF_DT_SAMPLE,smpls[i]); + free(smpls[i]); + } + free(smpls); + } + } + if ( format_str ) args->convert = convert_init(args->header, samples, nsamples, format_str); + free(samples); +} + +// Try to set CHROM:POS_REF_ALT[_END]. Return 0 on success, -1 on error +static int _set_chrom_pos_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + + char tmp, *se = tsv->ss, *ss = tsv->ss; + while ( se < tsv->se && *se!=':' ) se++; + if ( *se!=':' ) return -1; + tmp = *se; *se = 0; + int rid = bcf_hdr_name2id(args->header,ss); + *se = tmp; + if ( rid<0 ) return -1; + + // POS + hts_pos_t pos = strtol(se+1,&ss,10); + if ( ss==se+1 ) return -1; + pos--; + + // REF,ALT + args->str.l = 0; + se = ++ss; + while ( se < tsv->se && *se!='_' ) se++; + if ( *se!='_' ) return -1; + kputsn(ss,se-ss,&args->str); + ss = ++se; + while ( se < tsv->se && *se!='_' && isspace(*tsv->se) ) se++; + if ( se < tsv->se && *se!='_' && isspace(*tsv->se) ) return -1; + kputc(',',&args->str); + kputsn(ss,se-ss,&args->str); + + // END - optional + if (*se && *se=='_') + { + long end = strtol(se+1,&ss,10); + if ( ss==se+1 ) return -1; + bcf_update_info_int32(args->header, rec, "END", &end, 1); + } + + rec->rid = rid; + rec->pos = pos; + bcf_update_alleles_str(args->header, rec, args->str.s); + + return 0; +} +static int tsv_setter_chrom_pos_ref_alt_or_chrom(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*)usr; + int ret = _set_chrom_pos_ref_alt(tsv,rec,usr); + if ( !ret ) return ret; + return tsv_setter_chrom(tsv,rec,args->header); +} +static int tsv_setter_chrom_pos_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + int ret = _set_chrom_pos_ref_alt(tsv,rec,usr); + if ( ret!=0 ) error("Could not parse the CHROM:POS_REF_ALT[_END] string: %s\n", tsv->ss); + return ret; +} +// This function must be called first, then tsv_setter_chrom_pos_ref_alt_id_or_die. +// One of them is expected to find the CHROM:POS_REF_ALT[_END] string, if not, die. +static int tsv_setter_chrom_pos_ref_alt_or_id(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*)usr; + if ( _set_chrom_pos_ref_alt(tsv,rec,usr)==0 ) return 0; + rec->pos = -1; // mark the record as unset + if ( !args->output_vcf_ids) return 0; + return tsv_setter_id(tsv,rec,usr); +} +static int tsv_setter_chrom_pos_ref_alt_id_or_die(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*)usr; + if ( rec->pos!=-1 ) + { + if ( !args->output_vcf_ids ) return 0; + return tsv_setter_id(tsv,rec,usr); + } + return tsv_setter_chrom_pos_ref_alt(tsv,rec,usr); +} +static int tsv_setter_verify_pos(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + char *se; + int pos = strtol(tsv->ss,&se,10); + if ( tsv->ss==se ) error("Could not parse POS: %s\n", tsv->ss); + if ( rec->pos != pos-1 ) error("POS mismatch: %s\n", tsv->ss); + return 0; +} +static int tsv_setter_verify_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + args->rev_als = 0; + char tmp = *tsv->se; *tsv->se = 0; + if ( strcmp(tsv->ss,rec->d.allele[0]) ) + { + if ( strcmp(tsv->ss,rec->d.allele[1]) ) { *tsv->se = tmp; error("REF/ALT mismatch: [%s][%s]\n", tsv->ss,rec->d.allele[1]); } + args->rev_als = 1; + } + *tsv->se = tmp; + while ( *tsv->se && isspace(*tsv->se) ) tsv->se++; + tsv->ss = tsv->se; + while ( *tsv->se && !isspace(*tsv->se) ) tsv->se++; + tmp = *tsv->se; *tsv->se = 0; + if ( !args->rev_als && strcmp(tsv->ss,rec->d.allele[1]) ) { *tsv->se = tmp; error("REF/ALT mismatch: [%s][%s]\n", tsv->ss,rec->d.allele[1]); } + else if ( args->rev_als && strcmp(tsv->ss,rec->d.allele[0]) ) { *tsv->se = tmp; error("REF/ALT mismatch: [%s][%s]\n", tsv->ss,rec->d.allele[0]); } + *tsv->se = tmp; + return 0; +} +static int tsv_setter_gt_gp(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + int i, nsamples = bcf_hdr_nsamples(args->header); + for (i=0; iss, &tsv->se); + if ( tsv->ss==tsv->se ) { fprintf(stderr,"Could not parse first value of %d-th sample\n", i+1); return -1; } + tsv->ss = tsv->se+1; + ab = strtod(tsv->ss, &tsv->se); + if ( tsv->ss==tsv->se ) { fprintf(stderr,"Could not parse second value of %d-th sample\n", i+1); return -1; } + tsv->ss = tsv->se+1; + bb = strtod(tsv->ss, &tsv->se); + if ( tsv->ss==tsv->se ) { fprintf(stderr,"Could not parse third value of %d-th sample\n", i+1); return -1; } + tsv->ss = tsv->se+1; + + if ( args->rev_als ) { float tmp = bb; bb = aa; aa = tmp; } + args->flt[3*i+0] = aa; + args->flt[3*i+1] = ab; + args->flt[3*i+2] = bb; + + if ( aa >= ab ) + { + if ( aa >= bb ) args->gts[2*i+0] = args->gts[2*i+1] = bcf_gt_unphased(0); + else args->gts[2*i+0] = args->gts[2*i+1] = bcf_gt_unphased(1); + } + else if ( ab >= bb ) + { + args->gts[2*i+0] = bcf_gt_unphased(0); + args->gts[2*i+1] = bcf_gt_unphased(1); + } + else args->gts[2*i+0] = args->gts[2*i+1] = bcf_gt_unphased(1); + } + if ( *tsv->se ) error("Could not parse: %s\n", tsv->ss); + if ( bcf_update_genotypes(args->header,rec,args->gts,nsamples*2) ) error("Could not update GT field\n"); + if ( bcf_update_format_float(args->header,rec,"GP",args->flt,nsamples*3) ) error("Could not update GP field\n"); + return 0; +} +static int tsv_setter_haps(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + int i, nsamples = bcf_hdr_nsamples(args->header); + + int32_t a0, a1; + if ( args->rev_als ) { a0 = bcf_gt_phased(1); a1 = bcf_gt_phased(0); } + else { a0 = bcf_gt_phased(0); a1 = bcf_gt_phased(1); } + + // up is short for "unphased" + int nup = 0; + for (i=0; iss + 4*i + nup; + int up = 0, all; + + for (all=0; all < 2; all++){ + // checking for premature ending + if ( !ss[0] || !ss[1] || !ss[2] || + (up && (!ss[3] || !ss[4]) ) ) + { + fprintf(stderr,"Wrong number of fields at %d-th sample ([%c][%c][%c]). ",i+1,ss[0],ss[1],ss[2]); + return -1; + } + + switch(ss[all*2+up]){ + case '0': + args->gts[2*i+all] = a0; + break; + case '1' : + args->gts[2*i+all] = a1; + break; + case '?' : + // there is no macro to express phased missing allele + args->gts[2*i+all] = bcf_gt_phased(-1); + break; + case '-' : + args->gts[2*i+all] = bcf_int32_vector_end; + break; + default : + fprintf(stderr,"Could not parse: [%c][%s]\n", ss[all*2+up],tsv->ss); + return -1; + } + if( ss[all*2+up+1]=='*' ) up = up + 1; + } + + if(up && up != 2) + { + fprintf(stderr,"Missing unphased marker '*': [%c][%s]", ss[2+up], tsv->ss); + return -1; + } + + // change alleles to unphased if the alleles are unphased + if ( up ) + { + args->gts[2*i] = bcf_gt_unphased(bcf_gt_allele(args->gts[2*i])); + args->gts[2*i+1] = bcf_gt_unphased(bcf_gt_allele(args->gts[2*i+1])); + } + nup = nup + up; + } + if ( tsv->ss[(nsamples-1)*4+3+nup] ) + { + fprintf(stderr,"nup: %d", nup); + fprintf(stderr,"Wrong number of fields (%d-th column = [%c]). ", nsamples*2,tsv->ss[(nsamples-1)*4+nup]); + return -1; + } + + if ( bcf_update_genotypes(args->header,rec,args->gts,nsamples*2) ) error("Could not update GT field\n"); + return 0; +} +static void gensample_to_vcf(args_t *args) +{ + /* + * Inpute: IMPUTE2 output (indentation changed here for clarity): + * + * 20:62116619_C_T 20:62116619 62116619 C T 0.969 0.031 0 ... + * --- 20:62116698_C_A 62116698 C A 1 0 0 ... + * + * Second column is expected in the form of CHROM:POS_REF_ALT. We use second + * column because the first can be empty ("--") when filling sites from reference + * panel. When the option --vcf-ids is given, the first column is used to set the + * VCF ID. + * + * Output: VCF with filled GT,GP + * + */ + kstring_t line = {0,0,0}; + + char *gen_fname = NULL, *sample_fname = NULL; + sample_fname = strchr(args->infname,','); + if ( !sample_fname ) + { + args->str.l = 0; + ksprintf(&args->str,"%s.gen.gz", args->infname); + gen_fname = strdup(args->str.s); + args->str.l = 0; + ksprintf(&args->str,"%s.samples", args->infname); + sample_fname = strdup(args->str.s); + } + else + { + *sample_fname = 0; + gen_fname = strdup(args->infname); + sample_fname = strdup(sample_fname+1); + } + htsFile *gen_fh = hts_open(gen_fname, "r"); + if ( !gen_fh ) error("Could not read: %s\n", gen_fname); + if ( hts_getline(gen_fh, KS_SEP_LINE, &line) <= 0 ) error("Empty file: %s\n", gen_fname); + + // Find out the chromosome name, depending on the format variant (--3N6 or plain) and the ordering + // of the columns (CHROM:POS_REF_ALT comes first or second) + args->str.l = 0; + char *sb = line.s, *se = line.s; + while ( *se && !isspace(*se) ) se++; + if ( !*se ) error("Could not determine CHROM in %s: %s\n", gen_fname,line.s); + if ( args->gen_3N6 ) // first column, just CHROM + kputsn(sb, se-sb, &args->str); + else // first or second column, part of CHROM:POS_REF_ALT + { + char *sc = strchr(sb,':'); + if ( !sc || sc > se ) + { + while ( *se && !isspace(*se) ) se++; + if ( !*se ) error("Could not determine CHROM in %s: %s\n", gen_fname,line.s); + sb = ++se; + sc = strchr(sb,':'); + if ( !sc ) error("Could not determine CHROM in %s: %s\n", gen_fname,line.s); + } + kputsn(sb, sc-sb, &args->str); + } + + // Initialize and print the VCF header, args->str.s contains the chr name + args->header = bcf_hdr_init("w"); + bcf_hdr_append(args->header, "##INFO="); + bcf_hdr_append(args->header, "##FORMAT="); + bcf_hdr_append(args->header, "##FORMAT="); + bcf_hdr_printf(args->header, "##contig=", args->str.s,0x7fffffff); // MAX_CSI_COOR + if (args->record_cmd_line) bcf_hdr_append_version(args->header, args->argc, args->argv, "bcftools_convert"); + + tsv_t *tsv; + if ( args->gen_3N6 ) + { + tsv = tsv_init("CHROM,CHROM_POS_REF_ALT,ID,POS,REF_ALT,GT_GP"); + tsv_register(tsv, "CHROM", tsv_setter_chrom, args->header); + } + else + tsv = tsv_init("CHROM_POS_REF_ALT,ID,POS,REF_ALT,GT_GP"); + tsv_register(tsv, "CHROM_POS_REF_ALT", tsv_setter_chrom_pos_ref_alt_or_id, args); + tsv_register(tsv, "ID", tsv_setter_chrom_pos_ref_alt_id_or_die, args); + tsv_register(tsv, "POS", tsv_setter_verify_pos, NULL); + tsv_register(tsv, "REF_ALT", tsv_setter_verify_ref_alt, args); + tsv_register(tsv, "GT_GP", tsv_setter_gt_gp, args); + + // Find out sample names + int i, nsamples; + char **samples = hts_readlist(sample_fname, 1, &nsamples); + if ( !samples ) error("Could not read %s\n", sample_fname); + for (i=2; iheader,samples[i]); + } + for (i=0; ioutput_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if ( bcf_hdr_write(out_fh,args->header)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->outfname); + bcf1_t *rec = bcf_init(); + + nsamples -= 2; + args->gts = (int32_t *) malloc(sizeof(int32_t)*nsamples*2); + args->flt = (float *) malloc(sizeof(float)*nsamples*3); + + do + { + bcf_clear(rec); + args->n.total++; + if ( !tsv_parse(tsv, rec, line.s) ) + { + if ( bcf_write(out_fh, args->header, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + } + else + error("Error occurred while parsing: %s\n", line.s); + } + while ( hts_getline(gen_fh, KS_SEP_LINE, &line)>0 ); + + if ( hts_close(out_fh) ) error("Close failed: %s\n", args->outfname); + if ( hts_close(gen_fh) ) error("Close failed: %s\n", gen_fname); + bcf_hdr_destroy(args->header); + bcf_destroy(rec); + free(sample_fname); + free(gen_fname); + free(args->str.s); + free(line.s); + free(args->gts); + free(args->flt); + tsv_destroy(tsv); + + fprintf(stderr,"Number of processed rows: \t%d\n", args->n.total); +} + +static void haplegendsample_to_vcf(args_t *args) +{ + /* + * Convert from IMPUTE2 hap/legend/sample output files to VCF + * + * hap: + * 0 1 0 1 + * legend: + * id position a0 a1 + * 1:186946386_G_T 186946386 G T + * sample: + * sample population group sex + * sample1 sample1 sample1 2 + * sample2 sample2 sample2 2 + * + * Output: VCF with filled GT + */ + kstring_t line = {0,0,0}; + + if ( args->output_vcf_ids ) + error( + "The option --haplegendsample2vcf cannot be combined with --vcf-ids. This is because the\n" + "ID column must be formatted as \"CHROM:POS_REF_ALT\" to check sanity of the operation\n"); + + char *hap_fname = NULL, *leg_fname = NULL, *sample_fname = NULL; + sample_fname = strchr(args->infname,','); + if ( !sample_fname ) + { + args->str.l = 0; + ksprintf(&args->str,"%s.hap.gz", args->infname); + hap_fname = strdup(args->str.s); + args->str.l = 0; + ksprintf(&args->str,"%s.samples", args->infname); + sample_fname = strdup(args->str.s); + args->str.l = 0; + ksprintf(&args->str,"%s.legend.gz", args->infname); + leg_fname = strdup(args->str.s); + } + else + { + char *ss = sample_fname, *se = strchr(ss+1,','); + if ( !se ) error("Could not parse hap/legend/sample file names: %s\n", args->infname); + *ss = 0; + *se = 0; + hap_fname = strdup(args->infname); + leg_fname = strdup(ss+1); + sample_fname = strdup(se+1); + } + htsFile *hap_fh = hts_open(hap_fname, "r"); + if ( !hap_fh ) error("Could not read: %s\n", hap_fname); + + htsFile *leg_fh = hts_open(leg_fname,"r"); + if ( !leg_fh ) error("Could not read: %s\n", leg_fname); + + // Eat up first legend line, then determine chromosome name + if ( hts_getline(leg_fh, KS_SEP_LINE, &line) <= 0 ) error("Empty file: %s\n", leg_fname); + if ( hts_getline(leg_fh, KS_SEP_LINE, &line) <= 0 ) error("Empty file: %s\n", leg_fname); + + // Find out the chromosome name, sample names, init and print the VCF header + args->str.l = 0; + char *se = strchr(line.s,':'); + if ( !se ) error("Expected CHROM:POS_REF_ALT in first column of %s\n", leg_fname); + kputsn(line.s, se-line.s, &args->str); + + tsv_t *leg_tsv = tsv_init("CHROM_POS_REF_ALT,POS,REF_ALT"); + tsv_register(leg_tsv, "CHROM_POS_REF_ALT", tsv_setter_chrom_pos_ref_alt, args); + tsv_register(leg_tsv, "POS", tsv_setter_verify_pos, NULL); + tsv_register(leg_tsv, "REF_ALT", tsv_setter_verify_ref_alt, args); + tsv_t *hap_tsv = tsv_init("HAPS"); + tsv_register(hap_tsv, "HAPS", tsv_setter_haps, args); + + args->header = bcf_hdr_init("w"); + bcf_hdr_append(args->header, "##INFO="); + bcf_hdr_append(args->header, "##FORMAT="); + bcf_hdr_printf(args->header, "##contig=", args->str.s,0x7fffffff); // MAX_CSI_COOR + if (args->record_cmd_line) bcf_hdr_append_version(args->header, args->argc, args->argv, "bcftools_convert"); + + int i, nrows, nsamples; + char **samples = hts_readlist(sample_fname, 1, &nrows); + if ( !samples ) error("Could not read %s\n", sample_fname); + nsamples = nrows - 1; + + // sample_fname should contain a header line, so need to ignore first row + // returned from hts_readlist (i=1, and not i=0) + for (i=1; iheader,samples[i]); + } + bcf_hdr_add_sample(args->header,NULL); + for (i=0; ioutput_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if ( bcf_hdr_write(out_fh,args->header)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->outfname); + bcf1_t *rec = bcf_init(); + + args->gts = (int32_t *) malloc(sizeof(int32_t)*nsamples*2); + + while (1) + { + bcf_clear(rec); + args->n.total++; + if ( tsv_parse(leg_tsv, rec, line.s) ) + error("Error occurred while parsing %s: %s\n", leg_fname,line.s); + + if ( hts_getline(hap_fh, KS_SEP_LINE, &line)<=0 ) + error("Different number of records in %s and %s?\n", leg_fname,hap_fname); + + if ( tsv_parse(hap_tsv, rec, line.s) ) + error("Error occurred while parsing %s: %s\n", hap_fname,line.s); + + if ( bcf_write(out_fh, args->header, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + + if ( hts_getline(leg_fh, KS_SEP_LINE, &line)<=0 ) + { + if ( hts_getline(hap_fh, KS_SEP_LINE, &line)>0 ) + error("Different number of records in %s and %s?\n", leg_fname,hap_fname); + break; + } + } + + if ( hts_close(out_fh) ) error("Close failed: %s\n", args->outfname); + if ( hts_close(hap_fh) ) error("Close failed: %s\n", hap_fname); + if ( hts_close(leg_fh) ) error("Close failed: %s\n", leg_fname); + bcf_hdr_destroy(args->header); + bcf_destroy(rec); + free(sample_fname); + free(hap_fname); + free(leg_fname); + free(args->str.s); + free(line.s); + free(args->gts); + tsv_destroy(hap_tsv); + tsv_destroy(leg_tsv); + + fprintf(stderr,"Number of processed rows: \t%d\n", args->n.total); +} + +static void hapsample_to_vcf(args_t *args) +{ + /* + * Input: SHAPEIT output + * + * 20:19995888_A_G rsid1 19995888 A G 0 0 0 0 ... + * 20 20:19995888_A_G 19995888 A G 0 0 0 0 ... + * + * First column is expected in the form of CHROM:POS_REF_ALT + * + * Output: VCF with filled GT + * + */ + kstring_t line = {0,0,0}; + + char *hap_fname = NULL, *sample_fname = NULL; + sample_fname = strchr(args->infname,','); + if ( !sample_fname ) + { + args->str.l = 0; + ksprintf(&args->str,"%s.hap.gz", args->infname); + hap_fname = strdup(args->str.s); + args->str.l = 0; + ksprintf(&args->str,"%s.samples", args->infname); + sample_fname = strdup(args->str.s); + } + else + { + *sample_fname = 0; + hap_fname = strdup(args->infname); + sample_fname = strdup(sample_fname+1); + } + htsFile *hap_fh = hts_open(hap_fname, "r"); + if ( !hap_fh ) error("Could not read: %s\n", hap_fname); + if ( hts_getline(hap_fh, KS_SEP_LINE, &line) <= 0 ) error("Empty file: %s\n", hap_fname); + + // Find out the chromosome name, it can be either in the first or second column + args->str.l = 0; + char *sb = line.s, *se = line.s; + while ( *se && !isspace(*se) ) se++; + if ( !*se ) error("Could not determine CHROM in %s: %s\n", hap_fname,line.s); + if ( !args->output_vcf_ids ) + { + // first column should be just CHROM, but the second must be CHROM:POS_REF_ALT, use that + sb = ++se; + while ( *se && !isspace(*se) ) se++; + if ( !*se ) error("Could not determine CHROM in %s: %s\n", hap_fname,line.s); + if ( !strchr(sb,':') ) + error("Could not determine CHROM in the second column of %s: %s\n", hap_fname,line.s); + } + // Parse CHROM:POS_REF_ALT + char *sc = strchr(sb,':'); + if ( !sc || sc > se ) + error("Could not determine CHROM in %s: %s\n", hap_fname,line.s); + kputsn(sb, sc-sb, &args->str); + + // Initialize and print the VCF header, args->str.s contains the chr name + args->header = bcf_hdr_init("w"); + bcf_hdr_append(args->header, "##INFO="); + bcf_hdr_append(args->header, "##FORMAT="); + bcf_hdr_printf(args->header, "##contig=", args->str.s,0x7fffffff); // MAX_CSI_COOR + if (args->record_cmd_line) bcf_hdr_append_version(args->header, args->argc, args->argv, "bcftools_convert"); + + tsv_t *tsv; + if ( args->output_vcf_ids ) + { + tsv = tsv_init("CHROM_POS_REF_ALT,ID,POS,REF_ALT,HAPS"); + tsv_register(tsv, "ID", tsv_setter_id, args); + } + else + { + tsv = tsv_init("CHROM,CHROM_POS_REF_ALT,POS,REF_ALT,HAPS"); + tsv_register(tsv, "CHROM", tsv_setter_chrom_pos_ref_alt_or_chrom, args); + } + tsv_register(tsv, "CHROM_POS_REF_ALT", tsv_setter_chrom_pos_ref_alt, args); + tsv_register(tsv, "POS", tsv_setter_verify_pos, NULL); + tsv_register(tsv, "REF_ALT", tsv_setter_verify_ref_alt, args); + tsv_register(tsv, "HAPS", tsv_setter_haps, args); + + int i, nsamples; + char **samples = hts_readlist(sample_fname, 1, &nsamples); + if ( !samples ) error("Could not read %s\n", sample_fname); + for (i=2; iheader,samples[i]); + } + bcf_hdr_add_sample(args->header,NULL); + for (i=0; ioutput_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if ( bcf_hdr_write(out_fh,args->header)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + bcf1_t *rec = bcf_init(); + + nsamples -= 2; + args->gts = (int32_t *) malloc(sizeof(int32_t)*nsamples*2); + + do + { + bcf_clear(rec); + args->n.total++; + if ( !tsv_parse(tsv, rec, line.s) ) + { + if ( bcf_write(out_fh, args->header, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + } + else + error("Error occurred while parsing: %s\n", line.s); + } + while ( hts_getline(hap_fh, KS_SEP_LINE, &line)>0 ); + + if ( hts_close(out_fh) ) error("Close failed: %s\n", args->outfname); + if ( hts_close(hap_fh) ) error("Close failed: %s\n", hap_fname); + bcf_hdr_destroy(args->header); + bcf_destroy(rec); + free(sample_fname); + free(hap_fname); + free(args->str.s); + free(line.s); + free(args->gts); + tsv_destroy(tsv); + + fprintf(stderr,"Number of processed rows: \t%d\n", args->n.total); +} + +char *init_sample2sex(bcf_hdr_t *hdr, char *sex_fname) +{ + int i, nlines; + char *sample2sex = (char*) calloc(bcf_hdr_nsamples(hdr),1); + char **lines = hts_readlist(sex_fname, 1, &nlines); + if ( !lines ) error("Could not read %s\n", sex_fname); + for (i=0; igen_3N6 ) + kputs("%CHROM ", &str); + + kputs("%CHROM:%POS\\_%REF\\_%FIRST_ALT ", &str); + + // insert rsid as second column if needed + if ( args->output_vcf_ids ) + kputs("%ID ", &str); + else + kputs("%CHROM:%POS\\_%REF\\_%FIRST_ALT ", &str); + + kputs("%POS %REF %FIRST_ALT", &str); + if ( !args->tag || !strcmp(args->tag,"GT") ) kputs("%_GT_TO_PROB3",&str); + else if ( !strcmp(args->tag,"PL") ) kputs("%_PL_TO_PROB3",&str); + else if ( !strcmp(args->tag,"GP") ) kputs("%_GP_TO_PROB3",&str); + else error("todo: --tag %s\n", args->tag); + kputs("\n", &str); + open_vcf(args,str.s); + + int ret, gen_compressed = 1, sample_compressed = 0; + char *gen_fname = NULL, *sample_fname = NULL; + str.l = 0; + kputs(args->outfname,&str); + int n_files = 0, i; + char **files = hts_readlist(str.s, 0, &n_files); + if ( n_files==1 ) + { + int l = str.l; + kputs(".samples",&str); + sample_fname = strdup(str.s); + str.l = l; + kputs(".gen.gz",&str); + gen_fname = strdup(str.s); + } + else if ( n_files==2 ) + { + if (strlen(files[0]) && strcmp(files[0],".")!=0) gen_fname = strdup(files[0]); + if (strlen(files[1]) && strcmp(files[1],".")!=0) sample_fname = strdup(files[1]); + } + else + { + error("Error parsing --gensample filenames: %s\n", args->outfname); + } + for (i=0; i3 && strcasecmp(".gz",sample_fname+strlen(sample_fname)-3)==0 ) sample_compressed = 0; + + if (gen_fname) fprintf(stderr, "Gen file: %s\n", gen_fname); + if (sample_fname) fprintf(stderr, "Sample file: %s\n", sample_fname); + + // write samples file + if (sample_fname) + { + char *sample2sex = NULL; + if ( args->sex_fname ) sample2sex = init_sample2sex(args->header,args->sex_fname); + + int i; + BGZF *sout = bgzf_open(sample_fname, sample_compressed ? "wg" : "wu"); + str.l = 0; + kputs(sample2sex ? "ID_1 ID_2 missing sex\n0 0 0 0\n" : "ID_1 ID_2 missing\n0 0 0\n", &str); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + for (i=0; iheader); i++) + { + str.l = 0; + if ( sample2sex ) + ksprintf(&str, "%s %s 0 %c\n", args->header->samples[i],args->header->samples[i],sample2sex[i]); + else + ksprintf(&str, "%s %s 0\n", args->header->samples[i],args->header->samples[i]); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + } + if ( bgzf_close(sout)!=0 ) error("Error closing %s: %s\n", sample_fname, strerror(errno)); + free(sample_fname); + free(sample2sex); + } + if (!gen_fname) { + if ( str.m ) free(str.s); + return; + } + + int prev_rid = -1, prev_pos = -1; + int no_alt = 0, non_biallelic = 0, filtered = 0, ndup = 0, nok = 0; + BGZF *gout = bgzf_open(gen_fname, gen_compressed ? "wg" : "wu"); + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) { filtered++; continue; } + } + + // ALT allele is required + if ( line->n_allele<2 ) { no_alt++; continue; } + + // biallelic required + if ( line->n_allele>2 ) { + if (!non_biallelic) + fprintf(stderr, "Warning: non-biallelic records are skipped. Consider splitting multi-allelic records into biallelic records using 'bcftools norm -m-'.\n"); + non_biallelic++; + continue; + } + + // skip duplicate lines, or otherwise shapeit complains + if ( !args->keep_duplicates && prev_rid==line->rid && prev_pos==line->pos ) { ndup++; continue; } + prev_rid = line->rid; + prev_pos = line->pos; + + str.l = 0; + convert_line(args->convert, line, &str); + if ( str.l ) + { + int ret = bgzf_write(gout, str.s, str.l); + if ( ret!= str.l ) error("Error writing %s: %s\n", gen_fname,strerror(errno)); + nok++; + } + } + fprintf(stderr, "%d records written, %d skipped: %d/%d/%d/%d no-ALT/non-biallelic/filtered/duplicated\n", + nok, no_alt+non_biallelic+filtered+ndup, no_alt, non_biallelic, filtered, ndup); + + if ( str.m ) free(str.s); + if ( bgzf_close(gout)!=0 ) error("Error closing %s: %s\n", gen_fname,strerror(errno)); + free(gen_fname); +} + +static void vcf_to_haplegendsample(args_t *args) +{ + kstring_t str = {0,0,0}; + if ( args->hap2dip ) + kputs("%_GT_TO_HAP2\n", &str); + else + kputs("%_GT_TO_HAP\n", &str); + open_vcf(args,str.s); + + int ret, hap_compressed = 1, legend_compressed = 1, sample_compressed = 0; + char *hap_fname = NULL, *legend_fname = NULL, *sample_fname = NULL; + str.l = 0; + kputs(args->outfname,&str); + int n_files = 0, i; + char **files = hts_readlist(str.s, 0, &n_files); + if ( n_files==1 ) + { + int l = str.l; + kputs(".samples",&str); + sample_fname = strdup(str.s); + str.l = l; + kputs(".legend.gz",&str); + legend_fname = strdup(str.s); + str.l = l; + kputs(".hap.gz",&str); + hap_fname = strdup(str.s); + } + else if ( n_files==3 ) + { + if (strlen(files[0]) && strcmp(files[0],".")!=0) hap_fname = strdup(files[0]); + if (strlen(files[1]) && strcmp(files[1],".")!=0) legend_fname = strdup(files[1]); + if (strlen(files[2]) && strcmp(files[2],".")!=0) sample_fname = strdup(files[2]); + } + else + { + error("Error parsing --hapslegendsample filenames: %s\n", args->outfname); + } + for (i=0; i3 && strcasecmp(".gz",sample_fname+strlen(sample_fname)-3)==0 ) sample_compressed = 0; + + if (hap_fname) fprintf(stderr, "Hap file: %s\n", hap_fname); + if (legend_fname) fprintf(stderr, "Legend file: %s\n", legend_fname); + if (sample_fname) fprintf(stderr, "Sample file: %s\n", sample_fname); + + // write samples file + if (sample_fname) + { + char *sample2sex = NULL; + if ( args->sex_fname ) sample2sex = init_sample2sex(args->header,args->sex_fname); + + int i; + BGZF *sout = bgzf_open(sample_fname, sample_compressed ? "wg" : "wu"); + str.l = 0; + kputs("sample population group sex\n", &str); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + for (i=0; iheader); i++) + { + str.l = 0; + ksprintf(&str, "%s %s %s %c\n", args->header->samples[i], args->header->samples[i], args->header->samples[i], sample2sex ? sample2sex[i] : '2'); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + } + if ( bgzf_close(sout)!=0 ) error("Error closing %s: %s\n", sample_fname, strerror(errno)); + free(sample_fname); + free(sample2sex); + } + if (!hap_fname && !legend_fname) { + if ( str.m ) free(str.s); + return; + } + + // open haps and legend outputs + BGZF *hout = hap_fname ? bgzf_open(hap_fname, hap_compressed ? "wg" : "wu") : NULL; + if ( hap_compressed && args->n_threads ) bgzf_thread_pool(hout, args->files->p->pool, args->files->p->qsize); + BGZF *lout = legend_fname ? bgzf_open(legend_fname, legend_compressed ? "wg" : "wu") : NULL; + if (legend_fname) { + str.l = 0; + kputs("id position a0 a1\n", &str); + ret = bgzf_write(lout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", legend_fname, strerror(errno)); + } + + int no_alt = 0, non_biallelic = 0, filtered = 0, nok = 0; + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) { filtered++; continue; } + } + + // ALT allele is required + if ( line->n_allele<2 ) { no_alt++; continue; } + // biallelic required + if ( line->n_allele>2 ) { + if (!non_biallelic) + fprintf(stderr, "Warning: non-biallelic records are skipped. Consider splitting multi-allelic records into biallelic records using 'bcftools norm -m-'.\n"); + non_biallelic++; + continue; + } + + str.l = 0; + convert_line(args->convert, line, &str); + if ( !str.l ) continue; + + // write haps file + if (hap_fname) { + ret = bgzf_write(hout, str.s, str.l); // write hap file + if ( ret != str.l ) error("Error writing %s: %s\n", hap_fname, strerror(errno)); + } + if (legend_fname) { + str.l = 0; + if ( args->output_vcf_ids && (line->d.id[0]!='.' || line->d.id[1]!=0) ) + ksprintf(&str, "%s %"PRId64" %s %s\n", line->d.id, (int64_t) line->pos+1, line->d.allele[0], line->d.allele[1]); + else + ksprintf(&str, "%s:%"PRId64"_%s_%s %"PRId64" %s %s\n", bcf_seqname(args->header, line), (int64_t) line->pos+1, line->d.allele[0], line->d.allele[1], (int64_t) line->pos+1, line->d.allele[0], line->d.allele[1]); + + // write legend file + ret = bgzf_write(lout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", legend_fname, strerror(errno)); + } + nok++; + } + fprintf(stderr, "%d records written, %d skipped: %d/%d/%d no-ALT/non-biallelic/filtered\n", nok,no_alt+non_biallelic+filtered, no_alt, non_biallelic, filtered); + if ( str.m ) free(str.s); + if ( hout && bgzf_close(hout)!=0 ) error("Error closing %s: %s\n", hap_fname, strerror(errno)); + if ( lout && bgzf_close(lout)!=0 ) error("Error closing %s: %s\n", legend_fname, strerror(errno)); + if (hap_fname) free(hap_fname); + if (legend_fname) free(legend_fname); +} + +static void vcf_to_hapsample(args_t *args) +{ + /* + * WTCCC style haplotypes file + * see https://mathgen.stats.ox.ac.uk/genetics_software/shapeit/shapeit.html#hapsample + * + * These are essentially the haplotypes from the impute2 format with some + * legend info tacked on to the first 5 columns + * + */ + kstring_t str = {0,0,0}; + + // print ID instead of CHROM:POS_REF_ALT1 + if ( args->output_vcf_ids ) + kputs("%CHROM:%POS\\_%REF\\_%FIRST_ALT %ID %POS %REF %FIRST_ALT ", &str); + else + kputs("%CHROM %CHROM:%POS\\_%REF\\_%FIRST_ALT %POS %REF %FIRST_ALT ", &str); + + if ( args->hap2dip ) + kputs("%_GT_TO_HAP2\n", &str); + else + kputs("%_GT_TO_HAP\n", &str); + open_vcf(args,str.s); + + int ret, hap_compressed = 1, sample_compressed = 0; + char *hap_fname = NULL, *sample_fname = NULL; + str.l = 0; + kputs(args->outfname,&str); + int n_files = 0, i; + char **files = hts_readlist(str.s, 0, &n_files); + if ( n_files==1 ) + { + int l = str.l; + kputs(".samples",&str); + sample_fname = strdup(str.s); + str.l = l; + kputs(".hap.gz",&str); + hap_fname = strdup(str.s); + } + else if ( n_files==2 ) + { + if (strlen(files[0]) && strcmp(files[0],".")!=0) hap_fname = strdup(files[0]); + if (strlen(files[1]) && strcmp(files[1],".")!=0) sample_fname = strdup(files[1]); + } + else + { + error("Error parsing --hapsample filenames: %s\n", args->outfname); + } + for (i=0; i3 && strcasecmp(".gz",sample_fname+strlen(sample_fname)-3)==0 ) sample_compressed = 0; + + if (hap_fname) fprintf(stderr, "Hap file: %s\n", hap_fname); + if (sample_fname) fprintf(stderr, "Sample file: %s\n", sample_fname); + + // write samples file + if (sample_fname) + { + char *sample2sex = NULL; + if ( args->sex_fname ) sample2sex = init_sample2sex(args->header,args->sex_fname); + + int i; + BGZF *sout = bgzf_open(sample_fname, sample_compressed ? "wg" : "wu"); + str.l = 0; + kputs(sample2sex ? "ID_1 ID_2 missing sex\n0 0 0 0\n" : "ID_1 ID_2 missing\n0 0 0\n", &str); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + for (i=0; iheader); i++) + { + str.l = 0; + if ( sample2sex ) + ksprintf(&str, "%s %s 0 %c\n", args->header->samples[i],args->header->samples[i],sample2sex[i]); + else + ksprintf(&str, "%s %s 0\n", args->header->samples[i],args->header->samples[i]); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + } + if ( bgzf_close(sout)!=0 ) error("Error closing %s: %s\n", sample_fname, strerror(errno)); + free(sample_fname); + free(sample2sex); + } + if (!hap_fname) { + if ( str.m ) free(str.s); + return; + } + + // open haps output + BGZF *hout = hap_fname ? bgzf_open(hap_fname, hap_compressed ? "wg" : "wu") : NULL; + if ( hap_compressed && args->n_threads ) bgzf_thread_pool(hout, args->files->p->pool, args->files->p->qsize); + + int no_alt = 0, non_biallelic = 0, filtered = 0, nok = 0; + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) { filtered++; continue; } + } + + // ALT allele is required + if ( line->n_allele<2 ) { no_alt++; continue; } + // biallelic required + if ( line->n_allele>2 ) { + if (!non_biallelic) + fprintf(stderr, "Warning: non-biallelic records are skipped. Consider splitting multi-allelic records into biallelic records using 'bcftools norm -m-'.\n"); + non_biallelic++; + continue; + } + + str.l = 0; + convert_line(args->convert, line, &str); + if ( !str.l ) continue; + + // write haps file + if (hap_fname) { + ret = bgzf_write(hout, str.s, str.l); // write hap file + if ( ret != str.l ) error("Error writing %s: %s\n", hap_fname, strerror(errno)); + } + nok++; + } + fprintf(stderr, "%d records written, %d skipped: %d/%d/%d no-ALT/non-biallelic/filtered\n", nok, no_alt+non_biallelic+filtered, no_alt, non_biallelic, filtered); + if ( str.m ) free(str.s); + if ( hout && bgzf_close(hout)!=0 ) error("Error closing %s: %s\n", hap_fname, strerror(errno)); + if (hap_fname) free(hap_fname); +} + +static void bcf_hdr_set_chrs(bcf_hdr_t *hdr, faidx_t *fai) +{ + int i, n = faidx_nseq(fai); + for (i=0; i", seq,len); + } +} +static inline int acgt_to_5(char base) +{ + if ( base=='A' ) return 0; + if ( base=='C' ) return 1; + if ( base=='G' ) return 2; + if ( base=='T' ) return 3; + return 4; +} +static inline int tsv_setter_aa1(args_t *args, char *ss, char *se, int alleles[], int *nals, int ref, int32_t *gts) +{ + if ( se - ss > 2 ) return -1; // currently only SNPs + + if ( ss[0]=='-' ) + { + // missing GT + gts[0] = bcf_gt_missing; + gts[1] = bcf_gt_missing; + args->n.missing++; + return 0; + } + if ( ss[0]=='I' ) return -2; // skip insertions/deletions for now + if ( ss[0]=='D' ) return -2; + + int a0 = acgt_to_5(toupper(ss[0])); + int a1 = ss[1] ? acgt_to_5(toupper(ss[1])) : a0; + if ( alleles[a0]<0 ) alleles[a0] = (*nals)++; + if ( alleles[a1]<0 ) alleles[a1] = (*nals)++; + + gts[0] = bcf_gt_unphased(alleles[a0]); + gts[1] = ss[1] ? bcf_gt_unphased(alleles[a1]) : bcf_int32_vector_end; + + if ( ref==a0 && ref==a1 ) args->n.hom_rr++; // hom ref: RR + else if ( ref==a0 ) args->n.het_ra++; // het: RA + else if ( ref==a1 ) args->n.het_ra++; // het: AR + else if ( a0==a1 ) args->n.hom_aa++; // hom-alt: AA + else args->n.het_aa++; // non-ref het: AA + + return 0; +} +static int tsv_setter_aa(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + + int len; + char *ref = faidx_fetch_seq(args->ref, (char*)bcf_hdr_id2name(args->header,rec->rid), rec->pos, rec->pos, &len); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", bcf_hdr_id2name(args->header,rec->rid),(int64_t) rec->pos+1); + + int nals = 1, alleles[5] = { -1, -1, -1, -1, -1 }; // a,c,g,t,n + ref[0] = toupper(ref[0]); + int iref = acgt_to_5(ref[0]); + alleles[iref] = 0; + + rec->n_sample = bcf_hdr_nsamples(args->header); + + int i, ret; + for (i=0; in_sample; i++) + { + if ( i>0 ) + { + ret = tsv_next(tsv); + if ( ret==-1 ) error("Too few columns for %d samples at %s:%"PRId64"\n", rec->n_sample,bcf_hdr_id2name(args->header,rec->rid),(int64_t) rec->pos+1); + } + ret = tsv_setter_aa1(args, tsv->ss, tsv->se, alleles, &nals, iref, args->gts+i*2); + if ( ret==-1 ) error("Error parsing the site %s:%"PRId64", expected two characters\n", bcf_hdr_id2name(args->header,rec->rid),(int64_t) rec->pos+1); + if ( ret==-2 ) + { + // something else than a SNP + free(ref); + return -1; + } + } + + args->str.l = 0; + kputc(ref[0], &args->str); + for (i=0; i<5; i++) + { + if ( alleles[i]>0 ) + { + kputc(',', &args->str); + kputc("ACGTN"[i], &args->str); + } + } + bcf_update_alleles_str(args->header, rec, args->str.s); + if ( bcf_update_genotypes(args->header,rec,args->gts,rec->n_sample*2) ) error("Could not update the GT field\n"); + + free(ref); + return 0; +} + +static void tsv_to_vcf(args_t *args) +{ + if ( !args->ref_fname ) error("--tsv2vcf requires the --fasta-ref option\n"); + if ( !args->sample_list ) error("--tsv2vcf requires the --samples option\n"); + + args->ref = fai_load(args->ref_fname); + if ( !args->ref ) error("Could not load the reference %s\n", args->ref_fname); + + args->header = bcf_hdr_init("w"); + bcf_hdr_set_chrs(args->header, args->ref); + bcf_hdr_append(args->header, "##FORMAT="); + if (args->record_cmd_line) bcf_hdr_append_version(args->header, args->argc, args->argv, "bcftools_convert"); + + int i, n; + char **smpls = hts_readlist(args->sample_list, args->sample_is_file, &n); + if ( !smpls ) error("Could not parse %s\n", args->sample_list); + for (i=0; iheader, smpls[i]); + free(smpls[i]); + } + free(smpls); + bcf_hdr_add_sample(args->header, NULL); + args->gts = (int32_t *) malloc(sizeof(int32_t)*n*2); + + char wmode[8]; + set_wmode(wmode,args->output_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if ( bcf_hdr_write(out_fh,args->header)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + + tsv_t *tsv = tsv_init(args->columns ? args->columns : "ID,CHROM,POS,AA"); + if ( tsv_register(tsv, "CHROM", tsv_setter_chrom, args->header) < 0 ) error("Expected CHROM column\n"); + if ( tsv_register(tsv, "POS", tsv_setter_pos, NULL) < 0 ) error("Expected POS column\n"); + if ( tsv_register(tsv, "ID", tsv_setter_id, args->header) < 0 && !args->columns ) error("Expected ID column\n"); + if ( tsv_register(tsv, "AA", tsv_setter_aa, args) < 0 ) error("Expected AA column\n"); + + bcf1_t *rec = bcf_init(); + bcf_float_set_missing(rec->qual); + + kstring_t line = {0,0,0}; + htsFile *in_fh = hts_open(args->infname, "r"); + if ( !in_fh ) error("Could not read: %s\n", args->infname); + while ( hts_getline(in_fh, KS_SEP_LINE, &line) > 0 ) + { + if ( line.s[0]=='#' ) continue; // skip comments + bcf_clear(rec); + + args->n.total++; + if ( !tsv_parse(tsv, rec, line.s) ) + { + if ( bcf_write(out_fh, args->header, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + } + else + args->n.skipped++; + } + if ( hts_close(in_fh) ) error("Close failed: %s\n", args->infname); + free(line.s); + + bcf_hdr_destroy(args->header); + if ( hts_close(out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->outfname); + tsv_destroy(tsv); + bcf_destroy(rec); + free(args->str.s); + free(args->gts); + + fprintf(stderr,"Rows total: \t%d\n", args->n.total); + fprintf(stderr,"Rows skipped: \t%d\n", args->n.skipped); + fprintf(stderr,"Missing GTs: \t%d\n", args->n.missing); + fprintf(stderr,"Hom RR: \t%d\n", args->n.hom_rr); + fprintf(stderr,"Het RA: \t%d\n", args->n.het_ra); + fprintf(stderr,"Hom AA: \t%d\n", args->n.hom_aa); + fprintf(stderr,"Het AA: \t%d\n", args->n.het_aa); +} + +static void vcf_to_vcf(args_t *args) +{ + open_vcf(args,NULL); + char wmode[8]; + set_wmode(wmode,args->output_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,0); + if ( bcf_hdr_write(out_fh,hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) continue; + } + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + } + if ( hts_close(out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->outfname); +} + +static void gvcf_to_vcf(args_t *args) +{ + if ( !args->ref_fname ) error("--gvcf2vcf requires the --fasta-ref option\n"); + + args->ref = fai_load(args->ref_fname); + if ( !args->ref ) error("Could not load the fai index for reference %s\n", args->ref_fname); + + open_vcf(args,NULL); + char wmode[8]; + set_wmode(wmode,args->output_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,0); + if (args->record_cmd_line) bcf_hdr_append_version(hdr, args->argc, args->argv, "bcftools_convert"); + if ( bcf_hdr_write(out_fh,hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + + int32_t *itmp = NULL, nitmp = 0; + + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) + { + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + continue; + } + } + + // check if alleles compatible with being a gVCF record + // ALT must be one of ., <*>, , + // check for INFO/END is below + int i, gallele = -1; + if (line->n_allele==1) + gallele = 0; // illumina/bcftools-call gvcf (if INFO/END present) + else if ( line->d.allele[1][0]=='<' ) + { + for (i=1; in_allele; i++) + { + if ( line->d.allele[i][1]=='*' && line->d.allele[i][2]=='>' && line->d.allele[i][3]=='\0' ) { gallele = i; break; } // mpileup/spec compliant gVCF + if ( line->d.allele[i][1]=='X' && line->d.allele[i][2]=='>' && line->d.allele[i][3]=='\0' ) { gallele = i; break; } // old mpileup gVCF + if ( strcmp(line->d.allele[i],"")==0 ) { gallele = i; break; } // GATK gVCF + } + } + + // no gVCF compatible alleles + if (gallele<0) + { + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + continue; + } + + int nend = bcf_get_info_int32(hdr,line,"END",&itmp,&nitmp); + if ( nend!=1 ) + { + // No INFO/END => not gVCF record + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + continue; + } + bcf_update_info_int32(hdr,line,"END",NULL,0); + int pos, len; + for (pos=line->pos; pospos = pos; + char *ref = faidx_fetch_seq(args->ref, (char*)bcf_hdr_id2name(hdr,line->rid), line->pos, line->pos, &len); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", bcf_hdr_id2name(hdr,line->rid),(int64_t) line->pos+1); + strncpy(line->d.allele[0],ref,len); + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + free(ref); + } + } + free(itmp); + if ( hts_close(out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->outfname); +} + +static void usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Converts VCF/BCF to other formats and back. See man page for file\n"); + fprintf(stderr, " formats details. When specifying output files explicitly instead\n"); + fprintf(stderr, " of with PREFIX, one can use '-' for stdout and '.' to suppress.\n"); + fprintf(stderr, "Usage: bcftools convert [OPTIONS] INPUT_FILE\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "VCF input options:\n"); + fprintf(stderr, " -e, --exclude EXPR Exclude sites for which the expression is true\n"); + fprintf(stderr, " -i, --include EXPR Select sites for which the expression is true\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --samples LIST List of samples to include\n"); + fprintf(stderr, " -S, --samples-file FILE File of samples to include\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "VCF output options:\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -o, --output FILE Output file name [stdout]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " --threads INT Use multithreading with INT worker threads [0]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "GEN/SAMPLE conversion (input/output from IMPUTE2):\n"); + fprintf(stderr, " -G, --gensample2vcf ... |,\n"); + fprintf(stderr, " -g, --gensample ... |,\n"); + fprintf(stderr, " --3N6 Use 3*N+6 column format instead of the old 3*N+5 column format\n"); + fprintf(stderr, " --tag STRING Tag to take values for .gen file: GT,PL,GL,GP [GT]\n"); + fprintf(stderr, " --chrom Output chromosome in first column instead of CHROM:POS_REF_ALT\n"); + fprintf(stderr, " --keep-duplicates Keep duplicate positions\n"); + fprintf(stderr, " --sex FILE Output sex column in the sample-file, input format is: Sample\\t[MF]\n"); + fprintf(stderr, " --vcf-ids Output VCF IDs in second column instead of CHROM:POS_REF_ALT\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "gVCF conversion:\n"); + fprintf(stderr, " --gvcf2vcf Expand gVCF reference blocks\n"); + fprintf(stderr, " -f, --fasta-ref FILE Reference sequence in fasta format\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "HAP/SAMPLE conversion (output from SHAPEIT):\n"); + fprintf(stderr, " --hapsample2vcf ... |,\n"); + fprintf(stderr, " --hapsample ... |,\n"); + fprintf(stderr, " --haploid2diploid Convert haploid genotypes to diploid homozygotes\n"); + fprintf(stderr, " --sex FILE Output sex column in the sample-file, input format is: Sample\\t[MF]\n"); + fprintf(stderr, " --vcf-ids Output VCF IDs instead of CHROM:POS_REF_ALT\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "HAP/LEGEND/SAMPLE conversion:\n"); + fprintf(stderr, " -H, --haplegendsample2vcf ... |,,\n"); + fprintf(stderr, " -h, --haplegendsample ... |,,\n"); + fprintf(stderr, " --haploid2diploid Convert haploid genotypes to diploid homozygotes\n"); + fprintf(stderr, " --sex FILE Output sex column in the sample-file, input format is: Sample\\t[MF]\n"); + fprintf(stderr, " --vcf-ids Output VCF IDs instead of CHROM:POS_REF_ALT\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "TSV conversion:\n"); + fprintf(stderr, " --tsv2vcf FILE\n"); + fprintf(stderr, " -c, --columns STRING Columns of the input tsv file [ID,CHROM,POS,AA]\n"); + fprintf(stderr, " -f, --fasta-ref FILE Reference sequence in fasta format\n"); + fprintf(stderr, " -s, --samples LIST List of sample names\n"); + fprintf(stderr, " -S, --samples-file FILE File of sample names\n"); + fprintf(stderr, "\n"); + // fprintf(stderr, "PLINK options:\n"); + // fprintf(stderr, " -p, --plink |,,|,,|,\n"); + // fprintf(stderr, " --tped make tped file instead\n"); + // fprintf(stderr, " --bin make binary bed/fam/bim files\n"); + // fprintf(stderr, "\n"); + // fprintf(stderr, "PBWT options:\n"); + // fprintf(stderr, " -b, --pbwt or ,,,\n"); + // fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfconvert(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->outfname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->regions_overlap = 1; + args->targets_overlap = 0; + args->clevel = -1; + + static struct option loptions[] = + { + {"include",required_argument,NULL,'i'}, + {"exclude",required_argument,NULL,'e'}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,13}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,14}, + {"samples",required_argument,NULL,'s'}, + {"samples-file",required_argument,NULL,'S'}, + {"sex",required_argument,NULL,11}, + {"gensample",required_argument,NULL,'g'}, + {"gensample2vcf",required_argument,NULL,'G'}, + {"tag",required_argument,NULL,1}, + {"chrom",no_argument,NULL,8}, + {"3N6",no_argument,NULL,15}, + {"tsv2vcf",required_argument,NULL,2}, + {"hapsample",required_argument,NULL,7}, + {"hapsample2vcf",required_argument,NULL,3}, + {"vcf-ids",no_argument,NULL,4}, + {"haploid2diploid",no_argument,NULL,5}, + {"gvcf2vcf",no_argument,NULL,6}, + {"haplegendsample",required_argument,NULL,'h'}, + {"haplegendsample2vcf",required_argument,NULL,'H'}, + {"columns",required_argument,NULL,'c'}, + {"fasta-ref",required_argument,NULL,'f'}, + {"no-version",no_argument,NULL,10}, + {"keep-duplicates",no_argument,NULL,12}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "?h:r:R:s:S:t:T:i:e:g:G:o:O:c:f:H:",loptions,NULL)) >= 0) { + switch (c) { + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; args->regions_is_file = 1; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; args->targets_is_file = 1; break; + case 's': args->sample_list = optarg; break; + case 'S': args->sample_list = optarg; args->sample_is_file = 1; break; + case 'g': args->convert_func = vcf_to_gensample; args->outfname = optarg; break; + case 'G': args->convert_func = gensample_to_vcf; args->infname = optarg; break; + case 1 : args->tag = optarg; break; + case 2 : args->convert_func = tsv_to_vcf; args->infname = optarg; break; + case 3 : args->convert_func = hapsample_to_vcf; args->infname = optarg; break; + case 4 : args->output_vcf_ids = 1; break; + case 5 : args->hap2dip = 1; break; + case 6 : args->convert_func = gvcf_to_vcf; break; + case 7 : args->convert_func = vcf_to_hapsample; args->outfname = optarg; break; + case 8 : error("The --chrom option has been deprecated, please use --3N6 instead\n"); break; + case 15 : args->gen_3N6 = 1; break; + case 'H': args->convert_func = haplegendsample_to_vcf; args->infname = optarg; break; + case 'f': args->ref_fname = optarg; break; + case 'c': args->columns = optarg; break; + case 'o': args->outfname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'h': args->convert_func = vcf_to_haplegendsample; args->outfname = optarg; break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 10 : args->record_cmd_line = 0; break; + case 11 : args->sex_fname = optarg; break; + case 12 : args->keep_duplicates = 1; break; + case 13 : + args->regions_overlap = parse_overlap_option(optarg); + if ( args->regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 14 : + args->targets_overlap = parse_overlap_option(optarg); + if ( args->targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( !args->infname ) + { + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args->infname = "-"; + } + else args->infname = argv[optind]; + } + if ( !args->infname ) usage(); + + if ( args->convert_func ) args->convert_func(args); + else vcf_to_vcf(args); + + destroy_data(args); + free(args); + return 0; +} diff --git a/bcftools/vcfconvert.c.pysam.c b/bcftools/vcfconvert.c.pysam.c new file mode 100644 index 0000000..f340171 --- /dev/null +++ b/bcftools/vcfconvert.c.pysam.c @@ -0,0 +1,1679 @@ +#include "bcftools.pysam.h" + +/* vcfconvert.c -- convert between VCF/BCF and related formats. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "convert.h" +#include "tsv2vcf.h" + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +typedef struct _args_t args_t; +struct _args_t +{ + faidx_t *ref; + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + convert_t *convert; + bcf_srs_t *files; + bcf_hdr_t *header; + void (*convert_func)(struct _args_t *); + struct { + int total, skipped, hom_rr, het_ra, hom_aa, het_aa, missing; + } n; + kstring_t str; + int32_t *gts; + float *flt; + int rev_als, output_vcf_ids, hap2dip, gen_3N6; + int nsamples, *samples, sample_is_file, targets_is_file, regions_is_file, output_type; + int regions_overlap, targets_overlap; + char **argv, *sample_list, *targets_list, *regions_list, *tag, *columns; + char *outfname, *infname, *ref_fname, *sex_fname; + int argc, n_threads, record_cmd_line, keep_duplicates, clevel; +}; + +static void destroy_data(args_t *args) +{ + if ( args->ref ) fai_destroy(args->ref); + if ( args->convert) convert_destroy(args->convert); + if ( args->filter ) filter_destroy(args->filter); + free(args->samples); + if ( args->files ) bcf_sr_destroy(args->files); +} + +static void open_vcf(args_t *args, const char *format_str) +{ + args->files = bcf_sr_init(); + if ( args->n_threads && bcf_sr_set_threads(args->files, args->n_threads)!=0 ) + error("Could not initialize --threads %d\n", args->n_threads); + + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, args->regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,args->targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, args->targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( !bcf_sr_add_reader(args->files, args->infname) ) + error("Failed to open %s: %s\n", args->infname,bcf_sr_strerror(args->files->errnum)); + + args->header = args->files->readers[0].header; + + if ( args->filter_str ) + args->filter = filter_init(args->header, args->filter_str); + + int i, nsamples = 0, *samples = NULL; + if ( args->sample_list && strcmp("-",args->sample_list) ) + { + for (i=0; ifiles->nreaders; i++) + { + int ret = bcf_hdr_set_samples(args->files->readers[i].header,args->sample_list,args->sample_is_file); + if ( ret<0 ) error("Error parsing the sample list\n"); + else if ( ret>0 ) error("Sample name mismatch: sample #%d not found in the header\n", ret); + } + + if ( args->sample_list[0]!='^' ) + { + // the sample ordering may be different if not negated + int n; + char **smpls = hts_readlist(args->sample_list, args->sample_is_file, &n); + if ( !smpls ) error("Could not parse %s\n", args->sample_list); + if ( n!=bcf_hdr_nsamples(args->files->readers[0].header) ) + error("The number of samples does not match, perhaps some are present multiple times?\n"); + nsamples = bcf_hdr_nsamples(args->files->readers[0].header); + samples = (int*) malloc(sizeof(int)*nsamples); + for (i=0; ifiles->readers[0].header, BCF_DT_SAMPLE,smpls[i]); + free(smpls[i]); + } + free(smpls); + } + } + if ( format_str ) args->convert = convert_init(args->header, samples, nsamples, format_str); + free(samples); +} + +// Try to set CHROM:POS_REF_ALT[_END]. Return 0 on success, -1 on error +static int _set_chrom_pos_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + + char tmp, *se = tsv->ss, *ss = tsv->ss; + while ( se < tsv->se && *se!=':' ) se++; + if ( *se!=':' ) return -1; + tmp = *se; *se = 0; + int rid = bcf_hdr_name2id(args->header,ss); + *se = tmp; + if ( rid<0 ) return -1; + + // POS + hts_pos_t pos = strtol(se+1,&ss,10); + if ( ss==se+1 ) return -1; + pos--; + + // REF,ALT + args->str.l = 0; + se = ++ss; + while ( se < tsv->se && *se!='_' ) se++; + if ( *se!='_' ) return -1; + kputsn(ss,se-ss,&args->str); + ss = ++se; + while ( se < tsv->se && *se!='_' && isspace(*tsv->se) ) se++; + if ( se < tsv->se && *se!='_' && isspace(*tsv->se) ) return -1; + kputc(',',&args->str); + kputsn(ss,se-ss,&args->str); + + // END - optional + if (*se && *se=='_') + { + long end = strtol(se+1,&ss,10); + if ( ss==se+1 ) return -1; + bcf_update_info_int32(args->header, rec, "END", &end, 1); + } + + rec->rid = rid; + rec->pos = pos; + bcf_update_alleles_str(args->header, rec, args->str.s); + + return 0; +} +static int tsv_setter_chrom_pos_ref_alt_or_chrom(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*)usr; + int ret = _set_chrom_pos_ref_alt(tsv,rec,usr); + if ( !ret ) return ret; + return tsv_setter_chrom(tsv,rec,args->header); +} +static int tsv_setter_chrom_pos_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + int ret = _set_chrom_pos_ref_alt(tsv,rec,usr); + if ( ret!=0 ) error("Could not parse the CHROM:POS_REF_ALT[_END] string: %s\n", tsv->ss); + return ret; +} +// This function must be called first, then tsv_setter_chrom_pos_ref_alt_id_or_die. +// One of them is expected to find the CHROM:POS_REF_ALT[_END] string, if not, die. +static int tsv_setter_chrom_pos_ref_alt_or_id(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*)usr; + if ( _set_chrom_pos_ref_alt(tsv,rec,usr)==0 ) return 0; + rec->pos = -1; // mark the record as unset + if ( !args->output_vcf_ids) return 0; + return tsv_setter_id(tsv,rec,usr); +} +static int tsv_setter_chrom_pos_ref_alt_id_or_die(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*)usr; + if ( rec->pos!=-1 ) + { + if ( !args->output_vcf_ids ) return 0; + return tsv_setter_id(tsv,rec,usr); + } + return tsv_setter_chrom_pos_ref_alt(tsv,rec,usr); +} +static int tsv_setter_verify_pos(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + char *se; + int pos = strtol(tsv->ss,&se,10); + if ( tsv->ss==se ) error("Could not parse POS: %s\n", tsv->ss); + if ( rec->pos != pos-1 ) error("POS mismatch: %s\n", tsv->ss); + return 0; +} +static int tsv_setter_verify_ref_alt(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + args->rev_als = 0; + char tmp = *tsv->se; *tsv->se = 0; + if ( strcmp(tsv->ss,rec->d.allele[0]) ) + { + if ( strcmp(tsv->ss,rec->d.allele[1]) ) { *tsv->se = tmp; error("REF/ALT mismatch: [%s][%s]\n", tsv->ss,rec->d.allele[1]); } + args->rev_als = 1; + } + *tsv->se = tmp; + while ( *tsv->se && isspace(*tsv->se) ) tsv->se++; + tsv->ss = tsv->se; + while ( *tsv->se && !isspace(*tsv->se) ) tsv->se++; + tmp = *tsv->se; *tsv->se = 0; + if ( !args->rev_als && strcmp(tsv->ss,rec->d.allele[1]) ) { *tsv->se = tmp; error("REF/ALT mismatch: [%s][%s]\n", tsv->ss,rec->d.allele[1]); } + else if ( args->rev_als && strcmp(tsv->ss,rec->d.allele[0]) ) { *tsv->se = tmp; error("REF/ALT mismatch: [%s][%s]\n", tsv->ss,rec->d.allele[0]); } + *tsv->se = tmp; + return 0; +} +static int tsv_setter_gt_gp(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + int i, nsamples = bcf_hdr_nsamples(args->header); + for (i=0; iss, &tsv->se); + if ( tsv->ss==tsv->se ) { fprintf(bcftools_stderr,"Could not parse first value of %d-th sample\n", i+1); return -1; } + tsv->ss = tsv->se+1; + ab = strtod(tsv->ss, &tsv->se); + if ( tsv->ss==tsv->se ) { fprintf(bcftools_stderr,"Could not parse second value of %d-th sample\n", i+1); return -1; } + tsv->ss = tsv->se+1; + bb = strtod(tsv->ss, &tsv->se); + if ( tsv->ss==tsv->se ) { fprintf(bcftools_stderr,"Could not parse third value of %d-th sample\n", i+1); return -1; } + tsv->ss = tsv->se+1; + + if ( args->rev_als ) { float tmp = bb; bb = aa; aa = tmp; } + args->flt[3*i+0] = aa; + args->flt[3*i+1] = ab; + args->flt[3*i+2] = bb; + + if ( aa >= ab ) + { + if ( aa >= bb ) args->gts[2*i+0] = args->gts[2*i+1] = bcf_gt_unphased(0); + else args->gts[2*i+0] = args->gts[2*i+1] = bcf_gt_unphased(1); + } + else if ( ab >= bb ) + { + args->gts[2*i+0] = bcf_gt_unphased(0); + args->gts[2*i+1] = bcf_gt_unphased(1); + } + else args->gts[2*i+0] = args->gts[2*i+1] = bcf_gt_unphased(1); + } + if ( *tsv->se ) error("Could not parse: %s\n", tsv->ss); + if ( bcf_update_genotypes(args->header,rec,args->gts,nsamples*2) ) error("Could not update GT field\n"); + if ( bcf_update_format_float(args->header,rec,"GP",args->flt,nsamples*3) ) error("Could not update GP field\n"); + return 0; +} +static int tsv_setter_haps(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + int i, nsamples = bcf_hdr_nsamples(args->header); + + int32_t a0, a1; + if ( args->rev_als ) { a0 = bcf_gt_phased(1); a1 = bcf_gt_phased(0); } + else { a0 = bcf_gt_phased(0); a1 = bcf_gt_phased(1); } + + // up is short for "unphased" + int nup = 0; + for (i=0; iss + 4*i + nup; + int up = 0, all; + + for (all=0; all < 2; all++){ + // checking for premature ending + if ( !ss[0] || !ss[1] || !ss[2] || + (up && (!ss[3] || !ss[4]) ) ) + { + fprintf(bcftools_stderr,"Wrong number of fields at %d-th sample ([%c][%c][%c]). ",i+1,ss[0],ss[1],ss[2]); + return -1; + } + + switch(ss[all*2+up]){ + case '0': + args->gts[2*i+all] = a0; + break; + case '1' : + args->gts[2*i+all] = a1; + break; + case '?' : + // there is no macro to express phased missing allele + args->gts[2*i+all] = bcf_gt_phased(-1); + break; + case '-' : + args->gts[2*i+all] = bcf_int32_vector_end; + break; + default : + fprintf(bcftools_stderr,"Could not parse: [%c][%s]\n", ss[all*2+up],tsv->ss); + return -1; + } + if( ss[all*2+up+1]=='*' ) up = up + 1; + } + + if(up && up != 2) + { + fprintf(bcftools_stderr,"Missing unphased marker '*': [%c][%s]", ss[2+up], tsv->ss); + return -1; + } + + // change alleles to unphased if the alleles are unphased + if ( up ) + { + args->gts[2*i] = bcf_gt_unphased(bcf_gt_allele(args->gts[2*i])); + args->gts[2*i+1] = bcf_gt_unphased(bcf_gt_allele(args->gts[2*i+1])); + } + nup = nup + up; + } + if ( tsv->ss[(nsamples-1)*4+3+nup] ) + { + fprintf(bcftools_stderr,"nup: %d", nup); + fprintf(bcftools_stderr,"Wrong number of fields (%d-th column = [%c]). ", nsamples*2,tsv->ss[(nsamples-1)*4+nup]); + return -1; + } + + if ( bcf_update_genotypes(args->header,rec,args->gts,nsamples*2) ) error("Could not update GT field\n"); + return 0; +} +static void gensample_to_vcf(args_t *args) +{ + /* + * Inpute: IMPUTE2 output (indentation changed here for clarity): + * + * 20:62116619_C_T 20:62116619 62116619 C T 0.969 0.031 0 ... + * --- 20:62116698_C_A 62116698 C A 1 0 0 ... + * + * Second column is expected in the form of CHROM:POS_REF_ALT. We use second + * column because the first can be empty ("--") when filling sites from reference + * panel. When the option --vcf-ids is given, the first column is used to set the + * VCF ID. + * + * Output: VCF with filled GT,GP + * + */ + kstring_t line = {0,0,0}; + + char *gen_fname = NULL, *sample_fname = NULL; + sample_fname = strchr(args->infname,','); + if ( !sample_fname ) + { + args->str.l = 0; + ksprintf(&args->str,"%s.gen.gz", args->infname); + gen_fname = strdup(args->str.s); + args->str.l = 0; + ksprintf(&args->str,"%s.samples", args->infname); + sample_fname = strdup(args->str.s); + } + else + { + *sample_fname = 0; + gen_fname = strdup(args->infname); + sample_fname = strdup(sample_fname+1); + } + htsFile *gen_fh = hts_open(gen_fname, "r"); + if ( !gen_fh ) error("Could not read: %s\n", gen_fname); + if ( hts_getline(gen_fh, KS_SEP_LINE, &line) <= 0 ) error("Empty file: %s\n", gen_fname); + + // Find out the chromosome name, depending on the format variant (--3N6 or plain) and the ordering + // of the columns (CHROM:POS_REF_ALT comes first or second) + args->str.l = 0; + char *sb = line.s, *se = line.s; + while ( *se && !isspace(*se) ) se++; + if ( !*se ) error("Could not determine CHROM in %s: %s\n", gen_fname,line.s); + if ( args->gen_3N6 ) // first column, just CHROM + kputsn(sb, se-sb, &args->str); + else // first or second column, part of CHROM:POS_REF_ALT + { + char *sc = strchr(sb,':'); + if ( !sc || sc > se ) + { + while ( *se && !isspace(*se) ) se++; + if ( !*se ) error("Could not determine CHROM in %s: %s\n", gen_fname,line.s); + sb = ++se; + sc = strchr(sb,':'); + if ( !sc ) error("Could not determine CHROM in %s: %s\n", gen_fname,line.s); + } + kputsn(sb, sc-sb, &args->str); + } + + // Initialize and print the VCF header, args->str.s contains the chr name + args->header = bcf_hdr_init("w"); + bcf_hdr_append(args->header, "##INFO="); + bcf_hdr_append(args->header, "##FORMAT="); + bcf_hdr_append(args->header, "##FORMAT="); + bcf_hdr_printf(args->header, "##contig=", args->str.s,0x7fffffff); // MAX_CSI_COOR + if (args->record_cmd_line) bcf_hdr_append_version(args->header, args->argc, args->argv, "bcftools_convert"); + + tsv_t *tsv; + if ( args->gen_3N6 ) + { + tsv = tsv_init("CHROM,CHROM_POS_REF_ALT,ID,POS,REF_ALT,GT_GP"); + tsv_register(tsv, "CHROM", tsv_setter_chrom, args->header); + } + else + tsv = tsv_init("CHROM_POS_REF_ALT,ID,POS,REF_ALT,GT_GP"); + tsv_register(tsv, "CHROM_POS_REF_ALT", tsv_setter_chrom_pos_ref_alt_or_id, args); + tsv_register(tsv, "ID", tsv_setter_chrom_pos_ref_alt_id_or_die, args); + tsv_register(tsv, "POS", tsv_setter_verify_pos, NULL); + tsv_register(tsv, "REF_ALT", tsv_setter_verify_ref_alt, args); + tsv_register(tsv, "GT_GP", tsv_setter_gt_gp, args); + + // Find out sample names + int i, nsamples; + char **samples = hts_readlist(sample_fname, 1, &nsamples); + if ( !samples ) error("Could not read %s\n", sample_fname); + for (i=2; iheader,samples[i]); + } + for (i=0; ioutput_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if ( bcf_hdr_write(out_fh,args->header)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->outfname); + bcf1_t *rec = bcf_init(); + + nsamples -= 2; + args->gts = (int32_t *) malloc(sizeof(int32_t)*nsamples*2); + args->flt = (float *) malloc(sizeof(float)*nsamples*3); + + do + { + bcf_clear(rec); + args->n.total++; + if ( !tsv_parse(tsv, rec, line.s) ) + { + if ( bcf_write(out_fh, args->header, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + } + else + error("Error occurred while parsing: %s\n", line.s); + } + while ( hts_getline(gen_fh, KS_SEP_LINE, &line)>0 ); + + if ( hts_close(out_fh) ) error("Close failed: %s\n", args->outfname); + if ( hts_close(gen_fh) ) error("Close failed: %s\n", gen_fname); + bcf_hdr_destroy(args->header); + bcf_destroy(rec); + free(sample_fname); + free(gen_fname); + free(args->str.s); + free(line.s); + free(args->gts); + free(args->flt); + tsv_destroy(tsv); + + fprintf(bcftools_stderr,"Number of processed rows: \t%d\n", args->n.total); +} + +static void haplegendsample_to_vcf(args_t *args) +{ + /* + * Convert from IMPUTE2 hap/legend/sample output files to VCF + * + * hap: + * 0 1 0 1 + * legend: + * id position a0 a1 + * 1:186946386_G_T 186946386 G T + * sample: + * sample population group sex + * sample1 sample1 sample1 2 + * sample2 sample2 sample2 2 + * + * Output: VCF with filled GT + */ + kstring_t line = {0,0,0}; + + if ( args->output_vcf_ids ) + error( + "The option --haplegendsample2vcf cannot be combined with --vcf-ids. This is because the\n" + "ID column must be formatted as \"CHROM:POS_REF_ALT\" to check sanity of the operation\n"); + + char *hap_fname = NULL, *leg_fname = NULL, *sample_fname = NULL; + sample_fname = strchr(args->infname,','); + if ( !sample_fname ) + { + args->str.l = 0; + ksprintf(&args->str,"%s.hap.gz", args->infname); + hap_fname = strdup(args->str.s); + args->str.l = 0; + ksprintf(&args->str,"%s.samples", args->infname); + sample_fname = strdup(args->str.s); + args->str.l = 0; + ksprintf(&args->str,"%s.legend.gz", args->infname); + leg_fname = strdup(args->str.s); + } + else + { + char *ss = sample_fname, *se = strchr(ss+1,','); + if ( !se ) error("Could not parse hap/legend/sample file names: %s\n", args->infname); + *ss = 0; + *se = 0; + hap_fname = strdup(args->infname); + leg_fname = strdup(ss+1); + sample_fname = strdup(se+1); + } + htsFile *hap_fh = hts_open(hap_fname, "r"); + if ( !hap_fh ) error("Could not read: %s\n", hap_fname); + + htsFile *leg_fh = hts_open(leg_fname,"r"); + if ( !leg_fh ) error("Could not read: %s\n", leg_fname); + + // Eat up first legend line, then determine chromosome name + if ( hts_getline(leg_fh, KS_SEP_LINE, &line) <= 0 ) error("Empty file: %s\n", leg_fname); + if ( hts_getline(leg_fh, KS_SEP_LINE, &line) <= 0 ) error("Empty file: %s\n", leg_fname); + + // Find out the chromosome name, sample names, init and print the VCF header + args->str.l = 0; + char *se = strchr(line.s,':'); + if ( !se ) error("Expected CHROM:POS_REF_ALT in first column of %s\n", leg_fname); + kputsn(line.s, se-line.s, &args->str); + + tsv_t *leg_tsv = tsv_init("CHROM_POS_REF_ALT,POS,REF_ALT"); + tsv_register(leg_tsv, "CHROM_POS_REF_ALT", tsv_setter_chrom_pos_ref_alt, args); + tsv_register(leg_tsv, "POS", tsv_setter_verify_pos, NULL); + tsv_register(leg_tsv, "REF_ALT", tsv_setter_verify_ref_alt, args); + tsv_t *hap_tsv = tsv_init("HAPS"); + tsv_register(hap_tsv, "HAPS", tsv_setter_haps, args); + + args->header = bcf_hdr_init("w"); + bcf_hdr_append(args->header, "##INFO="); + bcf_hdr_append(args->header, "##FORMAT="); + bcf_hdr_printf(args->header, "##contig=", args->str.s,0x7fffffff); // MAX_CSI_COOR + if (args->record_cmd_line) bcf_hdr_append_version(args->header, args->argc, args->argv, "bcftools_convert"); + + int i, nrows, nsamples; + char **samples = hts_readlist(sample_fname, 1, &nrows); + if ( !samples ) error("Could not read %s\n", sample_fname); + nsamples = nrows - 1; + + // sample_fname should contain a header line, so need to ignore first row + // returned from hts_readlist (i=1, and not i=0) + for (i=1; iheader,samples[i]); + } + bcf_hdr_add_sample(args->header,NULL); + for (i=0; ioutput_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if ( bcf_hdr_write(out_fh,args->header)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->outfname); + bcf1_t *rec = bcf_init(); + + args->gts = (int32_t *) malloc(sizeof(int32_t)*nsamples*2); + + while (1) + { + bcf_clear(rec); + args->n.total++; + if ( tsv_parse(leg_tsv, rec, line.s) ) + error("Error occurred while parsing %s: %s\n", leg_fname,line.s); + + if ( hts_getline(hap_fh, KS_SEP_LINE, &line)<=0 ) + error("Different number of records in %s and %s?\n", leg_fname,hap_fname); + + if ( tsv_parse(hap_tsv, rec, line.s) ) + error("Error occurred while parsing %s: %s\n", hap_fname,line.s); + + if ( bcf_write(out_fh, args->header, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + + if ( hts_getline(leg_fh, KS_SEP_LINE, &line)<=0 ) + { + if ( hts_getline(hap_fh, KS_SEP_LINE, &line)>0 ) + error("Different number of records in %s and %s?\n", leg_fname,hap_fname); + break; + } + } + + if ( hts_close(out_fh) ) error("Close failed: %s\n", args->outfname); + if ( hts_close(hap_fh) ) error("Close failed: %s\n", hap_fname); + if ( hts_close(leg_fh) ) error("Close failed: %s\n", leg_fname); + bcf_hdr_destroy(args->header); + bcf_destroy(rec); + free(sample_fname); + free(hap_fname); + free(leg_fname); + free(args->str.s); + free(line.s); + free(args->gts); + tsv_destroy(hap_tsv); + tsv_destroy(leg_tsv); + + fprintf(bcftools_stderr,"Number of processed rows: \t%d\n", args->n.total); +} + +static void hapsample_to_vcf(args_t *args) +{ + /* + * Input: SHAPEIT output + * + * 20:19995888_A_G rsid1 19995888 A G 0 0 0 0 ... + * 20 20:19995888_A_G 19995888 A G 0 0 0 0 ... + * + * First column is expected in the form of CHROM:POS_REF_ALT + * + * Output: VCF with filled GT + * + */ + kstring_t line = {0,0,0}; + + char *hap_fname = NULL, *sample_fname = NULL; + sample_fname = strchr(args->infname,','); + if ( !sample_fname ) + { + args->str.l = 0; + ksprintf(&args->str,"%s.hap.gz", args->infname); + hap_fname = strdup(args->str.s); + args->str.l = 0; + ksprintf(&args->str,"%s.samples", args->infname); + sample_fname = strdup(args->str.s); + } + else + { + *sample_fname = 0; + hap_fname = strdup(args->infname); + sample_fname = strdup(sample_fname+1); + } + htsFile *hap_fh = hts_open(hap_fname, "r"); + if ( !hap_fh ) error("Could not read: %s\n", hap_fname); + if ( hts_getline(hap_fh, KS_SEP_LINE, &line) <= 0 ) error("Empty file: %s\n", hap_fname); + + // Find out the chromosome name, it can be either in the first or second column + args->str.l = 0; + char *sb = line.s, *se = line.s; + while ( *se && !isspace(*se) ) se++; + if ( !*se ) error("Could not determine CHROM in %s: %s\n", hap_fname,line.s); + if ( !args->output_vcf_ids ) + { + // first column should be just CHROM, but the second must be CHROM:POS_REF_ALT, use that + sb = ++se; + while ( *se && !isspace(*se) ) se++; + if ( !*se ) error("Could not determine CHROM in %s: %s\n", hap_fname,line.s); + if ( !strchr(sb,':') ) + error("Could not determine CHROM in the second column of %s: %s\n", hap_fname,line.s); + } + // Parse CHROM:POS_REF_ALT + char *sc = strchr(sb,':'); + if ( !sc || sc > se ) + error("Could not determine CHROM in %s: %s\n", hap_fname,line.s); + kputsn(sb, sc-sb, &args->str); + + // Initialize and print the VCF header, args->str.s contains the chr name + args->header = bcf_hdr_init("w"); + bcf_hdr_append(args->header, "##INFO="); + bcf_hdr_append(args->header, "##FORMAT="); + bcf_hdr_printf(args->header, "##contig=", args->str.s,0x7fffffff); // MAX_CSI_COOR + if (args->record_cmd_line) bcf_hdr_append_version(args->header, args->argc, args->argv, "bcftools_convert"); + + tsv_t *tsv; + if ( args->output_vcf_ids ) + { + tsv = tsv_init("CHROM_POS_REF_ALT,ID,POS,REF_ALT,HAPS"); + tsv_register(tsv, "ID", tsv_setter_id, args); + } + else + { + tsv = tsv_init("CHROM,CHROM_POS_REF_ALT,POS,REF_ALT,HAPS"); + tsv_register(tsv, "CHROM", tsv_setter_chrom_pos_ref_alt_or_chrom, args); + } + tsv_register(tsv, "CHROM_POS_REF_ALT", tsv_setter_chrom_pos_ref_alt, args); + tsv_register(tsv, "POS", tsv_setter_verify_pos, NULL); + tsv_register(tsv, "REF_ALT", tsv_setter_verify_ref_alt, args); + tsv_register(tsv, "HAPS", tsv_setter_haps, args); + + int i, nsamples; + char **samples = hts_readlist(sample_fname, 1, &nsamples); + if ( !samples ) error("Could not read %s\n", sample_fname); + for (i=2; iheader,samples[i]); + } + bcf_hdr_add_sample(args->header,NULL); + for (i=0; ioutput_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if ( bcf_hdr_write(out_fh,args->header)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + bcf1_t *rec = bcf_init(); + + nsamples -= 2; + args->gts = (int32_t *) malloc(sizeof(int32_t)*nsamples*2); + + do + { + bcf_clear(rec); + args->n.total++; + if ( !tsv_parse(tsv, rec, line.s) ) + { + if ( bcf_write(out_fh, args->header, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + } + else + error("Error occurred while parsing: %s\n", line.s); + } + while ( hts_getline(hap_fh, KS_SEP_LINE, &line)>0 ); + + if ( hts_close(out_fh) ) error("Close failed: %s\n", args->outfname); + if ( hts_close(hap_fh) ) error("Close failed: %s\n", hap_fname); + bcf_hdr_destroy(args->header); + bcf_destroy(rec); + free(sample_fname); + free(hap_fname); + free(args->str.s); + free(line.s); + free(args->gts); + tsv_destroy(tsv); + + fprintf(bcftools_stderr,"Number of processed rows: \t%d\n", args->n.total); +} + +char *init_sample2sex(bcf_hdr_t *hdr, char *sex_fname) +{ + int i, nlines; + char *sample2sex = (char*) calloc(bcf_hdr_nsamples(hdr),1); + char **lines = hts_readlist(sex_fname, 1, &nlines); + if ( !lines ) error("Could not read %s\n", sex_fname); + for (i=0; igen_3N6 ) + kputs("%CHROM ", &str); + + kputs("%CHROM:%POS\\_%REF\\_%FIRST_ALT ", &str); + + // insert rsid as second column if needed + if ( args->output_vcf_ids ) + kputs("%ID ", &str); + else + kputs("%CHROM:%POS\\_%REF\\_%FIRST_ALT ", &str); + + kputs("%POS %REF %FIRST_ALT", &str); + if ( !args->tag || !strcmp(args->tag,"GT") ) kputs("%_GT_TO_PROB3",&str); + else if ( !strcmp(args->tag,"PL") ) kputs("%_PL_TO_PROB3",&str); + else if ( !strcmp(args->tag,"GP") ) kputs("%_GP_TO_PROB3",&str); + else error("todo: --tag %s\n", args->tag); + kputs("\n", &str); + open_vcf(args,str.s); + + int ret, gen_compressed = 1, sample_compressed = 0; + char *gen_fname = NULL, *sample_fname = NULL; + str.l = 0; + kputs(args->outfname,&str); + int n_files = 0, i; + char **files = hts_readlist(str.s, 0, &n_files); + if ( n_files==1 ) + { + int l = str.l; + kputs(".samples",&str); + sample_fname = strdup(str.s); + str.l = l; + kputs(".gen.gz",&str); + gen_fname = strdup(str.s); + } + else if ( n_files==2 ) + { + if (strlen(files[0]) && strcmp(files[0],".")!=0) gen_fname = strdup(files[0]); + if (strlen(files[1]) && strcmp(files[1],".")!=0) sample_fname = strdup(files[1]); + } + else + { + error("Error parsing --gensample filenames: %s\n", args->outfname); + } + for (i=0; i3 && strcasecmp(".gz",sample_fname+strlen(sample_fname)-3)==0 ) sample_compressed = 0; + + if (gen_fname) fprintf(bcftools_stderr, "Gen file: %s\n", gen_fname); + if (sample_fname) fprintf(bcftools_stderr, "Sample file: %s\n", sample_fname); + + // write samples file + if (sample_fname) + { + char *sample2sex = NULL; + if ( args->sex_fname ) sample2sex = init_sample2sex(args->header,args->sex_fname); + + int i; + BGZF *sout = bgzf_open(sample_fname, sample_compressed ? "wg" : "wu"); + str.l = 0; + kputs(sample2sex ? "ID_1 ID_2 missing sex\n0 0 0 0\n" : "ID_1 ID_2 missing\n0 0 0\n", &str); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + for (i=0; iheader); i++) + { + str.l = 0; + if ( sample2sex ) + ksprintf(&str, "%s %s 0 %c\n", args->header->samples[i],args->header->samples[i],sample2sex[i]); + else + ksprintf(&str, "%s %s 0\n", args->header->samples[i],args->header->samples[i]); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + } + if ( bgzf_close(sout)!=0 ) error("Error closing %s: %s\n", sample_fname, strerror(errno)); + free(sample_fname); + free(sample2sex); + } + if (!gen_fname) { + if ( str.m ) free(str.s); + return; + } + + int prev_rid = -1, prev_pos = -1; + int no_alt = 0, non_biallelic = 0, filtered = 0, ndup = 0, nok = 0; + BGZF *gout = bgzf_open(gen_fname, gen_compressed ? "wg" : "wu"); + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) { filtered++; continue; } + } + + // ALT allele is required + if ( line->n_allele<2 ) { no_alt++; continue; } + + // biallelic required + if ( line->n_allele>2 ) { + if (!non_biallelic) + fprintf(bcftools_stderr, "Warning: non-biallelic records are skipped. Consider splitting multi-allelic records into biallelic records using 'bcftools norm -m-'.\n"); + non_biallelic++; + continue; + } + + // skip duplicate lines, or otherwise shapeit complains + if ( !args->keep_duplicates && prev_rid==line->rid && prev_pos==line->pos ) { ndup++; continue; } + prev_rid = line->rid; + prev_pos = line->pos; + + str.l = 0; + convert_line(args->convert, line, &str); + if ( str.l ) + { + int ret = bgzf_write(gout, str.s, str.l); + if ( ret!= str.l ) error("Error writing %s: %s\n", gen_fname,strerror(errno)); + nok++; + } + } + fprintf(bcftools_stderr, "%d records written, %d skipped: %d/%d/%d/%d no-ALT/non-biallelic/filtered/duplicated\n", + nok, no_alt+non_biallelic+filtered+ndup, no_alt, non_biallelic, filtered, ndup); + + if ( str.m ) free(str.s); + if ( bgzf_close(gout)!=0 ) error("Error closing %s: %s\n", gen_fname,strerror(errno)); + free(gen_fname); +} + +static void vcf_to_haplegendsample(args_t *args) +{ + kstring_t str = {0,0,0}; + if ( args->hap2dip ) + kputs("%_GT_TO_HAP2\n", &str); + else + kputs("%_GT_TO_HAP\n", &str); + open_vcf(args,str.s); + + int ret, hap_compressed = 1, legend_compressed = 1, sample_compressed = 0; + char *hap_fname = NULL, *legend_fname = NULL, *sample_fname = NULL; + str.l = 0; + kputs(args->outfname,&str); + int n_files = 0, i; + char **files = hts_readlist(str.s, 0, &n_files); + if ( n_files==1 ) + { + int l = str.l; + kputs(".samples",&str); + sample_fname = strdup(str.s); + str.l = l; + kputs(".legend.gz",&str); + legend_fname = strdup(str.s); + str.l = l; + kputs(".hap.gz",&str); + hap_fname = strdup(str.s); + } + else if ( n_files==3 ) + { + if (strlen(files[0]) && strcmp(files[0],".")!=0) hap_fname = strdup(files[0]); + if (strlen(files[1]) && strcmp(files[1],".")!=0) legend_fname = strdup(files[1]); + if (strlen(files[2]) && strcmp(files[2],".")!=0) sample_fname = strdup(files[2]); + } + else + { + error("Error parsing --hapslegendsample filenames: %s\n", args->outfname); + } + for (i=0; i3 && strcasecmp(".gz",sample_fname+strlen(sample_fname)-3)==0 ) sample_compressed = 0; + + if (hap_fname) fprintf(bcftools_stderr, "Hap file: %s\n", hap_fname); + if (legend_fname) fprintf(bcftools_stderr, "Legend file: %s\n", legend_fname); + if (sample_fname) fprintf(bcftools_stderr, "Sample file: %s\n", sample_fname); + + // write samples file + if (sample_fname) + { + char *sample2sex = NULL; + if ( args->sex_fname ) sample2sex = init_sample2sex(args->header,args->sex_fname); + + int i; + BGZF *sout = bgzf_open(sample_fname, sample_compressed ? "wg" : "wu"); + str.l = 0; + kputs("sample population group sex\n", &str); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + for (i=0; iheader); i++) + { + str.l = 0; + ksprintf(&str, "%s %s %s %c\n", args->header->samples[i], args->header->samples[i], args->header->samples[i], sample2sex ? sample2sex[i] : '2'); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + } + if ( bgzf_close(sout)!=0 ) error("Error closing %s: %s\n", sample_fname, strerror(errno)); + free(sample_fname); + free(sample2sex); + } + if (!hap_fname && !legend_fname) { + if ( str.m ) free(str.s); + return; + } + + // open haps and legend outputs + BGZF *hout = hap_fname ? bgzf_open(hap_fname, hap_compressed ? "wg" : "wu") : NULL; + if ( hap_compressed && args->n_threads ) bgzf_thread_pool(hout, args->files->p->pool, args->files->p->qsize); + BGZF *lout = legend_fname ? bgzf_open(legend_fname, legend_compressed ? "wg" : "wu") : NULL; + if (legend_fname) { + str.l = 0; + kputs("id position a0 a1\n", &str); + ret = bgzf_write(lout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", legend_fname, strerror(errno)); + } + + int no_alt = 0, non_biallelic = 0, filtered = 0, nok = 0; + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) { filtered++; continue; } + } + + // ALT allele is required + if ( line->n_allele<2 ) { no_alt++; continue; } + // biallelic required + if ( line->n_allele>2 ) { + if (!non_biallelic) + fprintf(bcftools_stderr, "Warning: non-biallelic records are skipped. Consider splitting multi-allelic records into biallelic records using 'bcftools norm -m-'.\n"); + non_biallelic++; + continue; + } + + str.l = 0; + convert_line(args->convert, line, &str); + if ( !str.l ) continue; + + // write haps file + if (hap_fname) { + ret = bgzf_write(hout, str.s, str.l); // write hap file + if ( ret != str.l ) error("Error writing %s: %s\n", hap_fname, strerror(errno)); + } + if (legend_fname) { + str.l = 0; + if ( args->output_vcf_ids && (line->d.id[0]!='.' || line->d.id[1]!=0) ) + ksprintf(&str, "%s %"PRId64" %s %s\n", line->d.id, (int64_t) line->pos+1, line->d.allele[0], line->d.allele[1]); + else + ksprintf(&str, "%s:%"PRId64"_%s_%s %"PRId64" %s %s\n", bcf_seqname(args->header, line), (int64_t) line->pos+1, line->d.allele[0], line->d.allele[1], (int64_t) line->pos+1, line->d.allele[0], line->d.allele[1]); + + // write legend file + ret = bgzf_write(lout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", legend_fname, strerror(errno)); + } + nok++; + } + fprintf(bcftools_stderr, "%d records written, %d skipped: %d/%d/%d no-ALT/non-biallelic/filtered\n", nok,no_alt+non_biallelic+filtered, no_alt, non_biallelic, filtered); + if ( str.m ) free(str.s); + if ( hout && bgzf_close(hout)!=0 ) error("Error closing %s: %s\n", hap_fname, strerror(errno)); + if ( lout && bgzf_close(lout)!=0 ) error("Error closing %s: %s\n", legend_fname, strerror(errno)); + if (hap_fname) free(hap_fname); + if (legend_fname) free(legend_fname); +} + +static void vcf_to_hapsample(args_t *args) +{ + /* + * WTCCC style haplotypes file + * see https://mathgen.stats.ox.ac.uk/genetics_software/shapeit/shapeit.html#hapsample + * + * These are essentially the haplotypes from the impute2 format with some + * legend info tacked on to the first 5 columns + * + */ + kstring_t str = {0,0,0}; + + // print ID instead of CHROM:POS_REF_ALT1 + if ( args->output_vcf_ids ) + kputs("%CHROM:%POS\\_%REF\\_%FIRST_ALT %ID %POS %REF %FIRST_ALT ", &str); + else + kputs("%CHROM %CHROM:%POS\\_%REF\\_%FIRST_ALT %POS %REF %FIRST_ALT ", &str); + + if ( args->hap2dip ) + kputs("%_GT_TO_HAP2\n", &str); + else + kputs("%_GT_TO_HAP\n", &str); + open_vcf(args,str.s); + + int ret, hap_compressed = 1, sample_compressed = 0; + char *hap_fname = NULL, *sample_fname = NULL; + str.l = 0; + kputs(args->outfname,&str); + int n_files = 0, i; + char **files = hts_readlist(str.s, 0, &n_files); + if ( n_files==1 ) + { + int l = str.l; + kputs(".samples",&str); + sample_fname = strdup(str.s); + str.l = l; + kputs(".hap.gz",&str); + hap_fname = strdup(str.s); + } + else if ( n_files==2 ) + { + if (strlen(files[0]) && strcmp(files[0],".")!=0) hap_fname = strdup(files[0]); + if (strlen(files[1]) && strcmp(files[1],".")!=0) sample_fname = strdup(files[1]); + } + else + { + error("Error parsing --hapsample filenames: %s\n", args->outfname); + } + for (i=0; i3 && strcasecmp(".gz",sample_fname+strlen(sample_fname)-3)==0 ) sample_compressed = 0; + + if (hap_fname) fprintf(bcftools_stderr, "Hap file: %s\n", hap_fname); + if (sample_fname) fprintf(bcftools_stderr, "Sample file: %s\n", sample_fname); + + // write samples file + if (sample_fname) + { + char *sample2sex = NULL; + if ( args->sex_fname ) sample2sex = init_sample2sex(args->header,args->sex_fname); + + int i; + BGZF *sout = bgzf_open(sample_fname, sample_compressed ? "wg" : "wu"); + str.l = 0; + kputs(sample2sex ? "ID_1 ID_2 missing sex\n0 0 0 0\n" : "ID_1 ID_2 missing\n0 0 0\n", &str); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + for (i=0; iheader); i++) + { + str.l = 0; + if ( sample2sex ) + ksprintf(&str, "%s %s 0 %c\n", args->header->samples[i],args->header->samples[i],sample2sex[i]); + else + ksprintf(&str, "%s %s 0\n", args->header->samples[i],args->header->samples[i]); + ret = bgzf_write(sout, str.s, str.l); + if ( ret != str.l ) error("Error writing %s: %s\n", sample_fname, strerror(errno)); + } + if ( bgzf_close(sout)!=0 ) error("Error closing %s: %s\n", sample_fname, strerror(errno)); + free(sample_fname); + free(sample2sex); + } + if (!hap_fname) { + if ( str.m ) free(str.s); + return; + } + + // open haps output + BGZF *hout = hap_fname ? bgzf_open(hap_fname, hap_compressed ? "wg" : "wu") : NULL; + if ( hap_compressed && args->n_threads ) bgzf_thread_pool(hout, args->files->p->pool, args->files->p->qsize); + + int no_alt = 0, non_biallelic = 0, filtered = 0, nok = 0; + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) { filtered++; continue; } + } + + // ALT allele is required + if ( line->n_allele<2 ) { no_alt++; continue; } + // biallelic required + if ( line->n_allele>2 ) { + if (!non_biallelic) + fprintf(bcftools_stderr, "Warning: non-biallelic records are skipped. Consider splitting multi-allelic records into biallelic records using 'bcftools norm -m-'.\n"); + non_biallelic++; + continue; + } + + str.l = 0; + convert_line(args->convert, line, &str); + if ( !str.l ) continue; + + // write haps file + if (hap_fname) { + ret = bgzf_write(hout, str.s, str.l); // write hap file + if ( ret != str.l ) error("Error writing %s: %s\n", hap_fname, strerror(errno)); + } + nok++; + } + fprintf(bcftools_stderr, "%d records written, %d skipped: %d/%d/%d no-ALT/non-biallelic/filtered\n", nok, no_alt+non_biallelic+filtered, no_alt, non_biallelic, filtered); + if ( str.m ) free(str.s); + if ( hout && bgzf_close(hout)!=0 ) error("Error closing %s: %s\n", hap_fname, strerror(errno)); + if (hap_fname) free(hap_fname); +} + +static void bcf_hdr_set_chrs(bcf_hdr_t *hdr, faidx_t *fai) +{ + int i, n = faidx_nseq(fai); + for (i=0; i", seq,len); + } +} +static inline int acgt_to_5(char base) +{ + if ( base=='A' ) return 0; + if ( base=='C' ) return 1; + if ( base=='G' ) return 2; + if ( base=='T' ) return 3; + return 4; +} +static inline int tsv_setter_aa1(args_t *args, char *ss, char *se, int alleles[], int *nals, int ref, int32_t *gts) +{ + if ( se - ss > 2 ) return -1; // currently only SNPs + + if ( ss[0]=='-' ) + { + // missing GT + gts[0] = bcf_gt_missing; + gts[1] = bcf_gt_missing; + args->n.missing++; + return 0; + } + if ( ss[0]=='I' ) return -2; // skip insertions/deletions for now + if ( ss[0]=='D' ) return -2; + + int a0 = acgt_to_5(toupper(ss[0])); + int a1 = ss[1] ? acgt_to_5(toupper(ss[1])) : a0; + if ( alleles[a0]<0 ) alleles[a0] = (*nals)++; + if ( alleles[a1]<0 ) alleles[a1] = (*nals)++; + + gts[0] = bcf_gt_unphased(alleles[a0]); + gts[1] = ss[1] ? bcf_gt_unphased(alleles[a1]) : bcf_int32_vector_end; + + if ( ref==a0 && ref==a1 ) args->n.hom_rr++; // hom ref: RR + else if ( ref==a0 ) args->n.het_ra++; // het: RA + else if ( ref==a1 ) args->n.het_ra++; // het: AR + else if ( a0==a1 ) args->n.hom_aa++; // hom-alt: AA + else args->n.het_aa++; // non-ref het: AA + + return 0; +} +static int tsv_setter_aa(tsv_t *tsv, bcf1_t *rec, void *usr) +{ + args_t *args = (args_t*) usr; + + int len; + char *ref = faidx_fetch_seq(args->ref, (char*)bcf_hdr_id2name(args->header,rec->rid), rec->pos, rec->pos, &len); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", bcf_hdr_id2name(args->header,rec->rid),(int64_t) rec->pos+1); + + int nals = 1, alleles[5] = { -1, -1, -1, -1, -1 }; // a,c,g,t,n + ref[0] = toupper(ref[0]); + int iref = acgt_to_5(ref[0]); + alleles[iref] = 0; + + rec->n_sample = bcf_hdr_nsamples(args->header); + + int i, ret; + for (i=0; in_sample; i++) + { + if ( i>0 ) + { + ret = tsv_next(tsv); + if ( ret==-1 ) error("Too few columns for %d samples at %s:%"PRId64"\n", rec->n_sample,bcf_hdr_id2name(args->header,rec->rid),(int64_t) rec->pos+1); + } + ret = tsv_setter_aa1(args, tsv->ss, tsv->se, alleles, &nals, iref, args->gts+i*2); + if ( ret==-1 ) error("Error parsing the site %s:%"PRId64", expected two characters\n", bcf_hdr_id2name(args->header,rec->rid),(int64_t) rec->pos+1); + if ( ret==-2 ) + { + // something else than a SNP + free(ref); + return -1; + } + } + + args->str.l = 0; + kputc(ref[0], &args->str); + for (i=0; i<5; i++) + { + if ( alleles[i]>0 ) + { + kputc(',', &args->str); + kputc("ACGTN"[i], &args->str); + } + } + bcf_update_alleles_str(args->header, rec, args->str.s); + if ( bcf_update_genotypes(args->header,rec,args->gts,rec->n_sample*2) ) error("Could not update the GT field\n"); + + free(ref); + return 0; +} + +static void tsv_to_vcf(args_t *args) +{ + if ( !args->ref_fname ) error("--tsv2vcf requires the --fasta-ref option\n"); + if ( !args->sample_list ) error("--tsv2vcf requires the --samples option\n"); + + args->ref = fai_load(args->ref_fname); + if ( !args->ref ) error("Could not load the reference %s\n", args->ref_fname); + + args->header = bcf_hdr_init("w"); + bcf_hdr_set_chrs(args->header, args->ref); + bcf_hdr_append(args->header, "##FORMAT="); + if (args->record_cmd_line) bcf_hdr_append_version(args->header, args->argc, args->argv, "bcftools_convert"); + + int i, n; + char **smpls = hts_readlist(args->sample_list, args->sample_is_file, &n); + if ( !smpls ) error("Could not parse %s\n", args->sample_list); + for (i=0; iheader, smpls[i]); + free(smpls[i]); + } + free(smpls); + bcf_hdr_add_sample(args->header, NULL); + args->gts = (int32_t *) malloc(sizeof(int32_t)*n*2); + + char wmode[8]; + set_wmode(wmode,args->output_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if ( bcf_hdr_write(out_fh,args->header)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + + tsv_t *tsv = tsv_init(args->columns ? args->columns : "ID,CHROM,POS,AA"); + if ( tsv_register(tsv, "CHROM", tsv_setter_chrom, args->header) < 0 ) error("Expected CHROM column\n"); + if ( tsv_register(tsv, "POS", tsv_setter_pos, NULL) < 0 ) error("Expected POS column\n"); + if ( tsv_register(tsv, "ID", tsv_setter_id, args->header) < 0 && !args->columns ) error("Expected ID column\n"); + if ( tsv_register(tsv, "AA", tsv_setter_aa, args) < 0 ) error("Expected AA column\n"); + + bcf1_t *rec = bcf_init(); + bcf_float_set_missing(rec->qual); + + kstring_t line = {0,0,0}; + htsFile *in_fh = hts_open(args->infname, "r"); + if ( !in_fh ) error("Could not read: %s\n", args->infname); + while ( hts_getline(in_fh, KS_SEP_LINE, &line) > 0 ) + { + if ( line.s[0]=='#' ) continue; // skip comments + bcf_clear(rec); + + args->n.total++; + if ( !tsv_parse(tsv, rec, line.s) ) + { + if ( bcf_write(out_fh, args->header, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + } + else + args->n.skipped++; + } + if ( hts_close(in_fh) ) error("Close failed: %s\n", args->infname); + free(line.s); + + bcf_hdr_destroy(args->header); + if ( hts_close(out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->outfname); + tsv_destroy(tsv); + bcf_destroy(rec); + free(args->str.s); + free(args->gts); + + fprintf(bcftools_stderr,"Rows total: \t%d\n", args->n.total); + fprintf(bcftools_stderr,"Rows skipped: \t%d\n", args->n.skipped); + fprintf(bcftools_stderr,"Missing GTs: \t%d\n", args->n.missing); + fprintf(bcftools_stderr,"Hom RR: \t%d\n", args->n.hom_rr); + fprintf(bcftools_stderr,"Het RA: \t%d\n", args->n.het_ra); + fprintf(bcftools_stderr,"Hom AA: \t%d\n", args->n.hom_aa); + fprintf(bcftools_stderr,"Het AA: \t%d\n", args->n.het_aa); +} + +static void vcf_to_vcf(args_t *args) +{ + open_vcf(args,NULL); + char wmode[8]; + set_wmode(wmode,args->output_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,0); + if ( bcf_hdr_write(out_fh,hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) continue; + } + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + } + if ( hts_close(out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->outfname); +} + +static void gvcf_to_vcf(args_t *args) +{ + if ( !args->ref_fname ) error("--gvcf2vcf requires the --fasta-ref option\n"); + + args->ref = fai_load(args->ref_fname); + if ( !args->ref ) error("Could not load the fai index for reference %s\n", args->ref_fname); + + open_vcf(args,NULL); + char wmode[8]; + set_wmode(wmode,args->output_type,args->outfname,args->clevel); + htsFile *out_fh = hts_open(args->outfname ? args->outfname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->outfname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,0); + if (args->record_cmd_line) bcf_hdr_append_version(hdr, args->argc, args->argv, "bcftools_convert"); + if ( bcf_hdr_write(out_fh,hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + + int32_t *itmp = NULL, nitmp = 0; + + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) + { + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + continue; + } + } + + // check if alleles compatible with being a gVCF record + // ALT must be one of ., <*>, , + // check for INFO/END is below + int i, gallele = -1; + if (line->n_allele==1) + gallele = 0; // illumina/bcftools-call gvcf (if INFO/END present) + else if ( line->d.allele[1][0]=='<' ) + { + for (i=1; in_allele; i++) + { + if ( line->d.allele[i][1]=='*' && line->d.allele[i][2]=='>' && line->d.allele[i][3]=='\0' ) { gallele = i; break; } // mpileup/spec compliant gVCF + if ( line->d.allele[i][1]=='X' && line->d.allele[i][2]=='>' && line->d.allele[i][3]=='\0' ) { gallele = i; break; } // old mpileup gVCF + if ( strcmp(line->d.allele[i],"")==0 ) { gallele = i; break; } // GATK gVCF + } + } + + // no gVCF compatible alleles + if (gallele<0) + { + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + continue; + } + + int nend = bcf_get_info_int32(hdr,line,"END",&itmp,&nitmp); + if ( nend!=1 ) + { + // No INFO/END => not gVCF record + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + continue; + } + bcf_update_info_int32(hdr,line,"END",NULL,0); + int pos, len; + for (pos=line->pos; pospos = pos; + char *ref = faidx_fetch_seq(args->ref, (char*)bcf_hdr_id2name(hdr,line->rid), line->pos, line->pos, &len); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", bcf_hdr_id2name(hdr,line->rid),(int64_t) line->pos+1); + strncpy(line->d.allele[0],ref,len); + if ( bcf_write(out_fh,hdr,line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->outfname); + free(ref); + } + } + free(itmp); + if ( hts_close(out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->outfname); +} + +static void usage(void) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Converts VCF/BCF to other formats and back. See man page for file\n"); + fprintf(bcftools_stderr, " formats details. When specifying output files explicitly instead\n"); + fprintf(bcftools_stderr, " of with PREFIX, one can use '-' for bcftools_stdout and '.' to suppress.\n"); + fprintf(bcftools_stderr, "Usage: bcftools convert [OPTIONS] INPUT_FILE\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "VCF input options:\n"); + fprintf(bcftools_stderr, " -e, --exclude EXPR Exclude sites for which the expression is true\n"); + fprintf(bcftools_stderr, " -i, --include EXPR Select sites for which the expression is true\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --samples LIST List of samples to include\n"); + fprintf(bcftools_stderr, " -S, --samples-file FILE File of samples to include\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "VCF output options:\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -o, --output FILE Output file name [bcftools_stdout]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with INT worker threads [0]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "GEN/SAMPLE conversion (input/output from IMPUTE2):\n"); + fprintf(bcftools_stderr, " -G, --gensample2vcf ... |,\n"); + fprintf(bcftools_stderr, " -g, --gensample ... |,\n"); + fprintf(bcftools_stderr, " --3N6 Use 3*N+6 column format instead of the old 3*N+5 column format\n"); + fprintf(bcftools_stderr, " --tag STRING Tag to take values for .gen file: GT,PL,GL,GP [GT]\n"); + fprintf(bcftools_stderr, " --chrom Output chromosome in first column instead of CHROM:POS_REF_ALT\n"); + fprintf(bcftools_stderr, " --keep-duplicates Keep duplicate positions\n"); + fprintf(bcftools_stderr, " --sex FILE Output sex column in the sample-file, input format is: Sample\\t[MF]\n"); + fprintf(bcftools_stderr, " --vcf-ids Output VCF IDs in second column instead of CHROM:POS_REF_ALT\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "gVCF conversion:\n"); + fprintf(bcftools_stderr, " --gvcf2vcf Expand gVCF reference blocks\n"); + fprintf(bcftools_stderr, " -f, --fasta-ref FILE Reference sequence in fasta format\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "HAP/SAMPLE conversion (output from SHAPEIT):\n"); + fprintf(bcftools_stderr, " --hapsample2vcf ... |,\n"); + fprintf(bcftools_stderr, " --hapsample ... |,\n"); + fprintf(bcftools_stderr, " --haploid2diploid Convert haploid genotypes to diploid homozygotes\n"); + fprintf(bcftools_stderr, " --sex FILE Output sex column in the sample-file, input format is: Sample\\t[MF]\n"); + fprintf(bcftools_stderr, " --vcf-ids Output VCF IDs instead of CHROM:POS_REF_ALT\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "HAP/LEGEND/SAMPLE conversion:\n"); + fprintf(bcftools_stderr, " -H, --haplegendsample2vcf ... |,,\n"); + fprintf(bcftools_stderr, " -h, --haplegendsample ... |,,\n"); + fprintf(bcftools_stderr, " --haploid2diploid Convert haploid genotypes to diploid homozygotes\n"); + fprintf(bcftools_stderr, " --sex FILE Output sex column in the sample-file, input format is: Sample\\t[MF]\n"); + fprintf(bcftools_stderr, " --vcf-ids Output VCF IDs instead of CHROM:POS_REF_ALT\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "TSV conversion:\n"); + fprintf(bcftools_stderr, " --tsv2vcf FILE\n"); + fprintf(bcftools_stderr, " -c, --columns STRING Columns of the input tsv file [ID,CHROM,POS,AA]\n"); + fprintf(bcftools_stderr, " -f, --fasta-ref FILE Reference sequence in fasta format\n"); + fprintf(bcftools_stderr, " -s, --samples LIST List of sample names\n"); + fprintf(bcftools_stderr, " -S, --samples-file FILE File of sample names\n"); + fprintf(bcftools_stderr, "\n"); + // fprintf(bcftools_stderr, "PLINK options:\n"); + // fprintf(bcftools_stderr, " -p, --plink |,,|,,|,\n"); + // fprintf(bcftools_stderr, " --tped make tped file instead\n"); + // fprintf(bcftools_stderr, " --bin make binary bed/fam/bim files\n"); + // fprintf(bcftools_stderr, "\n"); + // fprintf(bcftools_stderr, "PBWT options:\n"); + // fprintf(bcftools_stderr, " -b, --pbwt or ,,,\n"); + // fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfconvert(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->outfname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->regions_overlap = 1; + args->targets_overlap = 0; + args->clevel = -1; + + static struct option loptions[] = + { + {"include",required_argument,NULL,'i'}, + {"exclude",required_argument,NULL,'e'}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,13}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,14}, + {"samples",required_argument,NULL,'s'}, + {"samples-file",required_argument,NULL,'S'}, + {"sex",required_argument,NULL,11}, + {"gensample",required_argument,NULL,'g'}, + {"gensample2vcf",required_argument,NULL,'G'}, + {"tag",required_argument,NULL,1}, + {"chrom",no_argument,NULL,8}, + {"3N6",no_argument,NULL,15}, + {"tsv2vcf",required_argument,NULL,2}, + {"hapsample",required_argument,NULL,7}, + {"hapsample2vcf",required_argument,NULL,3}, + {"vcf-ids",no_argument,NULL,4}, + {"haploid2diploid",no_argument,NULL,5}, + {"gvcf2vcf",no_argument,NULL,6}, + {"haplegendsample",required_argument,NULL,'h'}, + {"haplegendsample2vcf",required_argument,NULL,'H'}, + {"columns",required_argument,NULL,'c'}, + {"fasta-ref",required_argument,NULL,'f'}, + {"no-version",no_argument,NULL,10}, + {"keep-duplicates",no_argument,NULL,12}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "?h:r:R:s:S:t:T:i:e:g:G:o:O:c:f:H:",loptions,NULL)) >= 0) { + switch (c) { + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; args->regions_is_file = 1; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; args->targets_is_file = 1; break; + case 's': args->sample_list = optarg; break; + case 'S': args->sample_list = optarg; args->sample_is_file = 1; break; + case 'g': args->convert_func = vcf_to_gensample; args->outfname = optarg; break; + case 'G': args->convert_func = gensample_to_vcf; args->infname = optarg; break; + case 1 : args->tag = optarg; break; + case 2 : args->convert_func = tsv_to_vcf; args->infname = optarg; break; + case 3 : args->convert_func = hapsample_to_vcf; args->infname = optarg; break; + case 4 : args->output_vcf_ids = 1; break; + case 5 : args->hap2dip = 1; break; + case 6 : args->convert_func = gvcf_to_vcf; break; + case 7 : args->convert_func = vcf_to_hapsample; args->outfname = optarg; break; + case 8 : error("The --chrom option has been deprecated, please use --3N6 instead\n"); break; + case 15 : args->gen_3N6 = 1; break; + case 'H': args->convert_func = haplegendsample_to_vcf; args->infname = optarg; break; + case 'f': args->ref_fname = optarg; break; + case 'c': args->columns = optarg; break; + case 'o': args->outfname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'h': args->convert_func = vcf_to_haplegendsample; args->outfname = optarg; break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 10 : args->record_cmd_line = 0; break; + case 11 : args->sex_fname = optarg; break; + case 12 : args->keep_duplicates = 1; break; + case 13 : + args->regions_overlap = parse_overlap_option(optarg); + if ( args->regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 14 : + args->targets_overlap = parse_overlap_option(optarg); + if ( args->targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( !args->infname ) + { + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args->infname = "-"; + } + else args->infname = argv[optind]; + } + if ( !args->infname ) usage(); + + if ( args->convert_func ) args->convert_func(args); + else vcf_to_vcf(args); + + destroy_data(args); + free(args); + return 0; +} diff --git a/bcftools/vcffilter.c b/bcftools/vcffilter.c new file mode 100644 index 0000000..68d8672 --- /dev/null +++ b/bcftools/vcffilter.c @@ -0,0 +1,722 @@ +/* vcffilter.c -- Apply fixed-threshold filters. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "rbuf.h" +#include "regidx.h" + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +// FILTER columns annotation: replace or add to existing FILTERs; set FILTER to PASS at good sites? +#define ANNOT_ADD 1 +#define ANNOT_RESET 2 + +// Set genotypes of filtered samples +#define SET_GTS_MISSING 1 +#define SET_GTS_REF 2 + +typedef struct _args_t +{ + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + const uint8_t *smpl_pass; + int set_gts; + char *soft_filter; // drop failed sites or annotate FILTER column? + int annot_mode; // add to existing FILTER annotation or replace? Otherwise reset FILTER to PASS or leave as it is? + int flt_fail, flt_pass; // BCF ids of fail and pass filters + int snp_gap, snp_gap_type, indel_gap, IndelGap_id, SnpGap_id; + char *snp_gap_str; + int32_t ntmpi, *tmpi, ntmp_ac, *tmp_ac; + rbuf_t rbuf; + bcf1_t **rbuf_lines; + + bcf_srs_t *files; + bcf_hdr_t *hdr; + htsFile *out_fh; + int output_type, n_threads, clevel; + + char **argv, *output_fname, *targets_list, *regions_list, *mask_list; + int argc, record_cmd_line, mask_is_file, mask_overlap, mask_negate; + regidx_t *mask; +} +args_t; + +static void init_data(args_t *args) +{ + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(args->out_fh, args->n_threads); + + if ( args->mask_list ) + { + if ( args->mask_list[0]=='^' ) args->mask_negate = 1; + if ( args->mask_is_file ) + args->mask = regidx_init(args->mask_negate?args->mask_list+1:args->mask_list,NULL,NULL,0,NULL); + else + { + char *rmme = strdup(args->mask_negate?args->mask_list+1:args->mask_list), *tmp = rmme; + while ( *tmp ) + { + if ( *tmp==',' ) *tmp = '\n'; + tmp++; + } + args->mask = regidx_init_string(rmme, regidx_parse_reg, NULL, 0, NULL); + free(rmme); + } + if ( !args->mask ) + error("Could not initialize the mask: %s\n",args->mask_list); + } + + args->hdr = args->files->readers[0].header; + args->flt_pass = bcf_hdr_id2int(args->hdr,BCF_DT_ID,"PASS"); assert( !args->flt_pass ); // sanity check: required by BCF spec + + if ( args->soft_filter && (args->filter_logic || args->mask_list) ) + { + kstring_t flt_name = {0,0,0}; + if ( strcmp(args->soft_filter,"+") ) + kputs(args->soft_filter, &flt_name); + else + { + // Make up a filter name + int i = 0, id = -1; + do + { + ksprintf(&flt_name,"Filter%d", ++i); + id = bcf_hdr_id2int(args->hdr,BCF_DT_ID,flt_name.s); + } + while ( bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FLT,id) ); + } + + kstring_t tmp = {0,0,0}; + if ( args->filter_logic ) + { + // -i or -e: append FILTER line + ksprintf(&tmp,"Set if %s: ",args->filter_logic & FLT_INCLUDE ? "not true" : "true"); + + // escape quotes + char *t = args->filter_str; + while ( *t ) + { + if ( *t=='"' ) kputc('\\',&tmp); + kputc(*t,&tmp); + t++; + } + } + else if ( args->mask_list ) + ksprintf(&tmp,"Record masked by region"); + + int ret = bcf_hdr_printf(args->hdr, "##FILTER=", flt_name.s,tmp.s); + if ( ret!=0 ) + error("Failed to append header line: ##FILTER=\n", flt_name.s,tmp.s); + args->flt_fail = bcf_hdr_id2int(args->hdr,BCF_DT_ID,flt_name.s); assert( args->flt_fail>=0 ); + free(flt_name.s); + free(tmp.s); + } + + if ( args->snp_gap || args->indel_gap ) + { + if ( !args->filter_logic && args->soft_filter && strcmp(args->soft_filter,"+") ) + { + kstring_t tmp = {0,0,0}; + if ( args->snp_gap ) kputs("\"SnpGap\"", &tmp); + if ( args->indel_gap ) + { + if ( tmp.s ) kputs(" and ", &tmp); + kputs("\"IndelGap\"", &tmp); + } + if ( strncmp(tmp.s+1,args->soft_filter,tmp.l-2) ) + fprintf(stderr,"Warning: using %s filter name instead of \"%s\"\n", tmp.s,args->soft_filter); + free(tmp.s); + } + + rbuf_init(&args->rbuf, 64); + args->rbuf_lines = (bcf1_t**) calloc(args->rbuf.m, sizeof(bcf1_t*)); + if ( args->snp_gap ) + { + bcf_hdr_printf(args->hdr, "##FILTER=", args->snp_gap,args->snp_gap_str); + args->SnpGap_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "SnpGap"); + assert( args->SnpGap_id>=0 ); + } + if ( args->indel_gap ) + { + bcf_hdr_printf(args->hdr, "##FILTER=", args->indel_gap); + args->IndelGap_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "IndelGap"); + assert( args->IndelGap_id>=0 ); + } + } + + if (args->record_cmd_line) bcf_hdr_append_version(args->hdr, args->argc, args->argv, "bcftools_filter"); + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); +} + +static void destroy_data(args_t *args) +{ + if ( args->rbuf_lines ) + { + int i; + for (i=0; irbuf.m; i++) + if ( args->rbuf_lines[i] ) bcf_destroy1(args->rbuf_lines[i]); + free(args->rbuf_lines); + } + if ( args->filter ) + filter_destroy(args->filter); + free(args->tmpi); + free(args->tmp_ac); + if ( args->mask ) regidx_destroy(args->mask); +} + +static void flush_buffer(args_t *args, int n) +{ + int i, j; + for (i=0; irbuf); + bcf1_t *rec = args->rbuf_lines[k]; + + int pass = 1; + if ( !args->soft_filter ) + { + for (j=0; jd.n_flt; j++) + { + if ( args->indel_gap && rec->d.flt[j]==args->IndelGap_id ) { pass = 0; break; } + if ( args->snp_gap && rec->d.flt[j]==args->SnpGap_id ) { pass = 0; break; } + } + } + if ( pass && bcf_write1(args->out_fh, args->hdr, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } +} + +#define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } +static void buffered_filters(args_t *args, bcf1_t *line) +{ + /** + * The logic of SnpGap=3. The SNPs at positions 1 and 7 are filtered, + * positions 0 and 8 are not: + * 0123456789 + * ref .G.GT..G.. + * del .A.G-..A.. + * Here the positions 1 and 6 are filtered, 0 and 7 are not: + * 0123-456789 + * ref .G.G-..G.. + * ins .A.GT..A.. + * + * The logic of IndelGap=2. The second indel is filtered: + * 012345678901 + * ref .GT.GT..GT.. + * del .G-.G-..G-.. + * And similarly here, the second is filtered: + * 01 23 456 78 + * ref .A-.A-..A-.. + * ins .AT.AT..AT.. + */ + + // To avoid additional data structure, we abuse bcf1_t's var and var_type records. + const int SnpGap_set = 1 << (8*sizeof(int)/2); + const int IndelGap_set = 1 << (8*sizeof(int)/2-1); + const int IndelGap_flush = 1 << (8*sizeof(int)/2-2); + + int var_type = 0, i; + if ( line ) + { + // Still on the same chromosome? + int ilast = rbuf_last(&args->rbuf); + if ( ilast>=0 && line->rid != args->rbuf_lines[ilast]->rid ) + flush_buffer(args, args->rbuf.n); // new chromosome, flush everything + + rbuf_expand0(&args->rbuf,bcf1_t*,args->rbuf.n,args->rbuf_lines); + + // Insert the new record in the buffer. The line would be overwritten in + // the next bcf_sr_next_line call, therefore we need to swap it with an + // unused one + ilast = rbuf_append(&args->rbuf); + if ( !args->rbuf_lines[ilast] ) args->rbuf_lines[ilast] = bcf_init1(); + SWAP(bcf1_t*, args->files->readers[0].buffer[0], args->rbuf_lines[ilast]); + + var_type = bcf_get_variant_types(line); + + // Find out the size of an indel. The indel boundaries are based on REF + // (POS+1,POS+rlen-1). This is not entirely correct: mpileup likes to + // output REF=CAGAGAGAGA, ALT=CAGAGAGAGAGA where REF=C,ALT=CGA could be + // used. This filter is therefore more strict and may remove some valid + // SNPs. + // Set the REF allele's length to max deletion length or to 1 if a SNP or an insertion. + line->d.var[0].n = line->rlen; + } + + int k_flush = 1; + if ( args->indel_gap ) + { + k_flush = 0; + // Find indels which are too close to each other + int last_to = -1; + for (i=-1; rbuf_next(&args->rbuf,&i); ) + { + bcf1_t *rec = args->rbuf_lines[i]; + int rec_from = rec->pos; + if ( last_to!=-1 && last_to < rec_from ) break; + + k_flush++; + if ( !(rec->d.var_type & VCF_INDEL) ) continue; + + rec->d.var_type |= IndelGap_set; + last_to = args->indel_gap + rec->pos + rec->d.var[0].n - 1; + } + if ( i==args->rbuf.f && line && last_to!=-1 ) k_flush = 0; + if ( k_flush || !line ) + { + // Select the best indel from the cluster of k_flush indels + int k = 0, max_ac = -1, imax_ac = -1, max_qual = -1, imax_qual = -1; + for (i=-1; rbuf_next(&args->rbuf,&i) && krbuf_lines[i]; + if ( !(rec->d.var_type & IndelGap_set) ) continue; + hts_expand(int, rec->n_allele, args->ntmpi, args->tmpi); + int ret = bcf_calc_ac(args->hdr, rec, args->tmpi, BCF_UN_ALL); + if ( imax_ac==-1 || (ret && max_ac < args->tmpi[1]) ) { max_ac = args->tmpi[1]; imax_ac = i; } + if ( imax_qual==-1 || max_qual < rec->qual ) { max_qual = rec->qual; imax_qual = i; } + } + + // Filter all but the best indel (with the best QUAL, bigger AC, or take the first if neither QUAL nor AC are available) + k = 0; + for (i=-1; rbuf_next(&args->rbuf,&i) && krbuf_lines[i]; + if ( !(rec->d.var_type & IndelGap_set) ) continue; + rec->d.var_type |= IndelGap_flush; + + int do_filter = 0; + if ( max_qual>0 ) + { + if ( i!=imax_qual ) do_filter = 1; + } + else if ( i!=imax_ac ) do_filter = 1; + if ( do_filter ) bcf_add_filter(args->hdr, args->rbuf_lines[i], args->IndelGap_id); + } + } + } + + if ( !line ) + { + // Finished: flush everything + flush_buffer(args, args->rbuf.n); + return; + } + + int j_flush = 1; + if ( args->snp_gap ) + { + j_flush = 0; + int last_from = line->pos; + for (i=-1; rbuf_next(&args->rbuf,&i); ) + { + bcf1_t *rec = args->rbuf_lines[i]; + int rec_to = rec->pos + rec->d.var[0].n - 1; // last position affected by the variant + if ( rec_to + args->snp_gap < last_from ) + j_flush++; + else if ( (var_type & args->snp_gap_type) && (rec->d.var_type & VCF_SNP) && !(rec->d.var_type & SnpGap_set) ) + { + // this SNP has not been SnpGap-filtered yet + rec->d.var_type |= SnpGap_set; + bcf_add_filter(args->hdr, rec, args->SnpGap_id); + } + else if ( (var_type & VCF_SNP) && (rec->d.var_type & args->snp_gap_type) ) + { + // the line which we are adding is a SNP and needs to be filtered + line->d.var_type |= SnpGap_set; + bcf_add_filter(args->hdr, line, args->SnpGap_id); + break; + } + } + } + flush_buffer(args, j_flush < k_flush ? j_flush : k_flush); +} + +static void set_genotypes(args_t *args, bcf1_t *line, int pass_site) +{ + int i,j; + if ( !bcf_hdr_nsamples(args->hdr) ) return; + if ( args->smpl_pass ) + { + int npass = 0; + for (i=0; ihdr); i++) npass += args->smpl_pass[i]; + + // return if all samples pass + if ( npass==bcf_hdr_nsamples(args->hdr) && (args->filter_logic & FLT_INCLUDE) ) return; + if ( npass==0 && (args->filter_logic & FLT_EXCLUDE) ) return; + } + else if ( pass_site ) return; + + int an = 0, has_an = bcf_get_info_int32(args->hdr, line, "AN", &args->tmp_ac, &args->ntmp_ac); + if ( has_an==1 ) an = args->tmp_ac[0]; + else has_an = 0; + + int has_ac = bcf_get_info_int32(args->hdr, line, "AC", &args->tmp_ac, &args->ntmp_ac); + has_ac = has_ac==line->n_allele-1 ? 1 : 0; + + int new_gt = 0, ngts = bcf_get_format_int32(args->hdr, line, "GT", &args->tmpi, &args->ntmpi); + ngts /= bcf_hdr_nsamples(args->hdr); + if ( args->set_gts==SET_GTS_MISSING ) new_gt = bcf_gt_missing; + else if ( args->set_gts==SET_GTS_REF ) new_gt = bcf_gt_unphased(0); + else error("todo: set_gts=%d\n", args->set_gts); + for (i=0; ihdr); i++) + { + if ( args->smpl_pass ) + { + int pass = args->smpl_pass[i]; + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( pass ) continue; + } + int32_t *gts = args->tmpi + ngts*i; + for (j=0; jset_gts==SET_GTS_MISSING && !bcf_gt_is_missing(gts[j]) ) + { + int ial = bcf_gt_allele(gts[j]); + if ( has_ac && ial>0 && ial<=line->n_allele ) args->tmp_ac[ ial-1 ]--; + an--; + } + else if ( args->set_gts==SET_GTS_REF ) + { + int ial = bcf_gt_allele(gts[j]); + if ( bcf_gt_is_missing(gts[j]) ) an++; + else if ( has_ac && ial>0 && ial<=line->n_allele ) args->tmp_ac[ ial-1 ]--; + } + gts[j] = new_gt; + } + } + bcf_update_genotypes(args->hdr,line,args->tmpi,ngts*bcf_hdr_nsamples(args->hdr)); + if ( has_an ) bcf_update_info_int32(args->hdr,line,"AN",&an,1); + if ( has_ac ) bcf_update_info_int32(args->hdr,line,"AC",args->tmp_ac,line->n_allele-1); +} + +static void _set_variant_boundaries(bcf1_t *rec, hts_pos_t *beg, hts_pos_t *end) +{ + hts_pos_t off; + if ( rec->n_allele ) + { + off = rec->rlen; + bcf_unpack(rec, BCF_UN_STR); + int i; + for (i=1; in_allele; i++) + { + // Make symbolic alleles start at POS, although this is not strictly true for + // , where POS should be the position BEFORE the deletion/insertion. + // However, since arbitrary symbolic alleles can be defined by the user, we + // will simplify the interpretation of --targets-overlap and --region-overlap. + int j = 0; + char *ref = rec->d.allele[0]; + char *alt = rec->d.allele[i]; + while ( ref[j] && alt[j] && ref[j]==alt[j] ) j++; + if ( off > j ) off = j; + if ( !off ) break; + } + } + else + off = 0; + + *beg = rec->pos + off; + *end = rec->pos + rec->rlen - 1; +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Apply fixed-threshold filters.\n"); + fprintf(stderr, "Usage: bcftools filter [options] \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -e, --exclude EXPR Exclude sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " -g, --SnpGap INT[:TYPE] Filter SNPs within base pairs of an indel (the default) or any combination of indel,mnp,bnd,other,overlap\n"); + fprintf(stderr, " -G, --IndelGap INT Filter clusters of indels separated by or fewer base pairs allowing only one to pass\n"); + fprintf(stderr, " -i, --include EXPR Include only sites for which the expression is true (see man page for details\n"); + fprintf(stderr, " --mask [^]REGION Soft filter regions, \"^\" to negate\n"); + fprintf(stderr, " -M, --mask-file [^]FILE Soft filter regions listed in a file, \"^\" to negate\n"); + fprintf(stderr, " --mask-overlap 0|1|2 Mask if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -m, --mode [+x] \"+\": do not replace but add to existing FILTER; \"x\": reset filters at sites which pass\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --soft-filter STRING Annotate FILTER column with or unique filter name (\"Filter%%d\") made up by the program (\"+\")\n"); + fprintf(stderr, " -S, --set-GTs .|0 Set genotypes of failed samples to missing (.) or ref (0)\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcffilter(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->clevel = -1; + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + args->mask_overlap = 1; + + static struct option loptions[] = + { + {"set-GTs",required_argument,NULL,'S'}, + {"mode",required_argument,NULL,'m'}, + {"mask",required_argument,NULL,10}, + {"mask-file",required_argument,NULL,'M'}, + {"mask-overlap",required_argument,NULL,11}, + {"soft-filter",required_argument,NULL,'s'}, + {"exclude",required_argument,NULL,'e'}, + {"include",required_argument,NULL,'i'}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,4}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"SnpGap",required_argument,NULL,'g'}, + {"IndelGap",required_argument,NULL,'G'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "e:i:t:T:r:R:h?s:m:o:O:g:G:S:",loptions,NULL)) >= 0) { + switch (c) { + case 'g': + args->snp_gap = strtol(optarg,&tmp,10); + if ( *tmp && *tmp!=':' ) error("Could not parse argument: --SnpGap %s\n", optarg); + if ( *tmp==':' ) + { + args->snp_gap_str = tmp+1; + int i,n; + char **keys = hts_readlist(tmp+1,0,&n); + for(i=0; isnp_gap_type |= VCF_INDEL; + else if ( !strcasecmp(keys[i],"mnp") ) args->snp_gap_type |= VCF_MNP; + else if ( !strcasecmp(keys[i],"bnd") ) args->snp_gap_type |= VCF_BND; + else if ( !strcasecmp(keys[i],"other") ) args->snp_gap_type |= VCF_OTHER; + else if ( !strcasecmp(keys[i],"overlap") ) args->snp_gap_type |= VCF_OVERLAP; + else error("Could not parse \"%s\" in \"--SnpGap %s\"\n", keys[i], optarg); + free(keys[i]); + } + if ( n ) free(keys); + } + else + { + args->snp_gap_type = VCF_INDEL; + args->snp_gap_str = "indel"; + } + break; + case 'G': + args->indel_gap = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --IndelGap %s\n", optarg); + break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 's': args->soft_filter = optarg; break; + case 'm': + if ( strchr(optarg,'x') ) args->annot_mode |= ANNOT_RESET; + if ( strchr(optarg,'+') ) args->annot_mode |= ANNOT_ADD; + break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'S': + if ( !strcmp(".",optarg) ) args->set_gts = SET_GTS_MISSING; + else if ( !strcmp("0",optarg) ) args->set_gts = SET_GTS_REF; + else error("The argument to -S not recognised: %s\n", optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 4 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 10 : args->mask_list = optarg; break; + case 'M' : args->mask_list = optarg; args->mask_is_file = 1; break; + case 11 : + if ( !strcasecmp(optarg,"0") ) args->mask_overlap = 0; + else if ( !strcasecmp(optarg,"1") ) args->mask_overlap = 1; + else if ( !strcasecmp(optarg,"2") ) args->mask_overlap = 2; + else error("Could not parse: --mask-overlap %s\n",optarg); + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( args->filter_logic == (FLT_EXCLUDE|FLT_INCLUDE) ) error("Only one of -i or -e can be given.\n"); + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(args); + } + else fname = argv[optind]; + + if ( args->mask_list && !args->soft_filter ) error("The option --soft-filter is required with --mask and --mask-file options\n"); + + // read in the regions from the command line + if ( args->regions_list ) + { + args->files->require_index = 1; + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + else if ( optind+1 < argc ) + { + int i; + kstring_t tmp = {0,0,0}; + kputs(argv[optind+1],&tmp); + for (i=optind+2; ifiles->require_index = 1; + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, tmp.s, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + free(tmp.s); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list,targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + if ( bcf_hdr_write(args->out_fh, args->hdr)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname); + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files, 0); + int pass = 1; + if ( args->filter ) + { + pass = filter_test(args->filter, line, &args->smpl_pass); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + } + if ( args->mask ) + { + hts_pos_t beg, end; + if ( args->mask_overlap==0 ) beg = end = line->pos; + else if ( args->mask_overlap==1 ) beg = line->pos, end = line->pos + line->rlen - 1; + else _set_variant_boundaries(line,&beg,&end); + int mpass = regidx_overlap(args->mask,bcf_seqname(args->hdr,line),beg,end,NULL) ? 0 : 1; + if ( args->mask_negate ) mpass = mpass ? 0 : 1; + pass &= mpass; + } + if ( args->soft_filter || args->set_gts || pass ) + { + if ( pass ) + { + bcf_unpack(line,BCF_UN_FLT); + if ( args->annot_mode & ANNOT_RESET || !line->d.n_flt ) bcf_add_filter(args->hdr, line, args->flt_pass); + } + else if ( args->soft_filter ) + { + if ( (args->annot_mode & ANNOT_ADD) ) bcf_add_filter(args->hdr, line, args->flt_fail); + else bcf_update_filter(args->hdr, line, &args->flt_fail, 1); + } + if ( args->set_gts ) set_genotypes(args, line, pass); + if ( !args->rbuf_lines ) + { + if ( bcf_write1(args->out_fh, args->hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } + else + buffered_filters(args, line); + } + } + buffered_filters(args, NULL); + + if ( hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} diff --git a/bcftools/vcffilter.c.pysam.c b/bcftools/vcffilter.c.pysam.c new file mode 100644 index 0000000..f998083 --- /dev/null +++ b/bcftools/vcffilter.c.pysam.c @@ -0,0 +1,724 @@ +#include "bcftools.pysam.h" + +/* vcffilter.c -- Apply fixed-threshold filters. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "rbuf.h" +#include "regidx.h" + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +// FILTER columns annotation: replace or add to existing FILTERs; set FILTER to PASS at good sites? +#define ANNOT_ADD 1 +#define ANNOT_RESET 2 + +// Set genotypes of filtered samples +#define SET_GTS_MISSING 1 +#define SET_GTS_REF 2 + +typedef struct _args_t +{ + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + const uint8_t *smpl_pass; + int set_gts; + char *soft_filter; // drop failed sites or annotate FILTER column? + int annot_mode; // add to existing FILTER annotation or replace? Otherwise reset FILTER to PASS or leave as it is? + int flt_fail, flt_pass; // BCF ids of fail and pass filters + int snp_gap, snp_gap_type, indel_gap, IndelGap_id, SnpGap_id; + char *snp_gap_str; + int32_t ntmpi, *tmpi, ntmp_ac, *tmp_ac; + rbuf_t rbuf; + bcf1_t **rbuf_lines; + + bcf_srs_t *files; + bcf_hdr_t *hdr; + htsFile *out_fh; + int output_type, n_threads, clevel; + + char **argv, *output_fname, *targets_list, *regions_list, *mask_list; + int argc, record_cmd_line, mask_is_file, mask_overlap, mask_negate; + regidx_t *mask; +} +args_t; + +static void init_data(args_t *args) +{ + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(args->out_fh, args->n_threads); + + if ( args->mask_list ) + { + if ( args->mask_list[0]=='^' ) args->mask_negate = 1; + if ( args->mask_is_file ) + args->mask = regidx_init(args->mask_negate?args->mask_list+1:args->mask_list,NULL,NULL,0,NULL); + else + { + char *rmme = strdup(args->mask_negate?args->mask_list+1:args->mask_list), *tmp = rmme; + while ( *tmp ) + { + if ( *tmp==',' ) *tmp = '\n'; + tmp++; + } + args->mask = regidx_init_string(rmme, regidx_parse_reg, NULL, 0, NULL); + free(rmme); + } + if ( !args->mask ) + error("Could not initialize the mask: %s\n",args->mask_list); + } + + args->hdr = args->files->readers[0].header; + args->flt_pass = bcf_hdr_id2int(args->hdr,BCF_DT_ID,"PASS"); assert( !args->flt_pass ); // sanity check: required by BCF spec + + if ( args->soft_filter && (args->filter_logic || args->mask_list) ) + { + kstring_t flt_name = {0,0,0}; + if ( strcmp(args->soft_filter,"+") ) + kputs(args->soft_filter, &flt_name); + else + { + // Make up a filter name + int i = 0, id = -1; + do + { + ksprintf(&flt_name,"Filter%d", ++i); + id = bcf_hdr_id2int(args->hdr,BCF_DT_ID,flt_name.s); + } + while ( bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FLT,id) ); + } + + kstring_t tmp = {0,0,0}; + if ( args->filter_logic ) + { + // -i or -e: append FILTER line + ksprintf(&tmp,"Set if %s: ",args->filter_logic & FLT_INCLUDE ? "not true" : "true"); + + // escape quotes + char *t = args->filter_str; + while ( *t ) + { + if ( *t=='"' ) kputc('\\',&tmp); + kputc(*t,&tmp); + t++; + } + } + else if ( args->mask_list ) + ksprintf(&tmp,"Record masked by region"); + + int ret = bcf_hdr_printf(args->hdr, "##FILTER=", flt_name.s,tmp.s); + if ( ret!=0 ) + error("Failed to append header line: ##FILTER=\n", flt_name.s,tmp.s); + args->flt_fail = bcf_hdr_id2int(args->hdr,BCF_DT_ID,flt_name.s); assert( args->flt_fail>=0 ); + free(flt_name.s); + free(tmp.s); + } + + if ( args->snp_gap || args->indel_gap ) + { + if ( !args->filter_logic && args->soft_filter && strcmp(args->soft_filter,"+") ) + { + kstring_t tmp = {0,0,0}; + if ( args->snp_gap ) kputs("\"SnpGap\"", &tmp); + if ( args->indel_gap ) + { + if ( tmp.s ) kputs(" and ", &tmp); + kputs("\"IndelGap\"", &tmp); + } + if ( strncmp(tmp.s+1,args->soft_filter,tmp.l-2) ) + fprintf(bcftools_stderr,"Warning: using %s filter name instead of \"%s\"\n", tmp.s,args->soft_filter); + free(tmp.s); + } + + rbuf_init(&args->rbuf, 64); + args->rbuf_lines = (bcf1_t**) calloc(args->rbuf.m, sizeof(bcf1_t*)); + if ( args->snp_gap ) + { + bcf_hdr_printf(args->hdr, "##FILTER=", args->snp_gap,args->snp_gap_str); + args->SnpGap_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "SnpGap"); + assert( args->SnpGap_id>=0 ); + } + if ( args->indel_gap ) + { + bcf_hdr_printf(args->hdr, "##FILTER=", args->indel_gap); + args->IndelGap_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "IndelGap"); + assert( args->IndelGap_id>=0 ); + } + } + + if (args->record_cmd_line) bcf_hdr_append_version(args->hdr, args->argc, args->argv, "bcftools_filter"); + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); +} + +static void destroy_data(args_t *args) +{ + if ( args->rbuf_lines ) + { + int i; + for (i=0; irbuf.m; i++) + if ( args->rbuf_lines[i] ) bcf_destroy1(args->rbuf_lines[i]); + free(args->rbuf_lines); + } + if ( args->filter ) + filter_destroy(args->filter); + free(args->tmpi); + free(args->tmp_ac); + if ( args->mask ) regidx_destroy(args->mask); +} + +static void flush_buffer(args_t *args, int n) +{ + int i, j; + for (i=0; irbuf); + bcf1_t *rec = args->rbuf_lines[k]; + + int pass = 1; + if ( !args->soft_filter ) + { + for (j=0; jd.n_flt; j++) + { + if ( args->indel_gap && rec->d.flt[j]==args->IndelGap_id ) { pass = 0; break; } + if ( args->snp_gap && rec->d.flt[j]==args->SnpGap_id ) { pass = 0; break; } + } + } + if ( pass && bcf_write1(args->out_fh, args->hdr, rec)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } +} + +#define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } +static void buffered_filters(args_t *args, bcf1_t *line) +{ + /** + * The logic of SnpGap=3. The SNPs at positions 1 and 7 are filtered, + * positions 0 and 8 are not: + * 0123456789 + * ref .G.GT..G.. + * del .A.G-..A.. + * Here the positions 1 and 6 are filtered, 0 and 7 are not: + * 0123-456789 + * ref .G.G-..G.. + * ins .A.GT..A.. + * + * The logic of IndelGap=2. The second indel is filtered: + * 012345678901 + * ref .GT.GT..GT.. + * del .G-.G-..G-.. + * And similarly here, the second is filtered: + * 01 23 456 78 + * ref .A-.A-..A-.. + * ins .AT.AT..AT.. + */ + + // To avoid additional data structure, we abuse bcf1_t's var and var_type records. + const int SnpGap_set = 1 << (8*sizeof(int)/2); + const int IndelGap_set = 1 << (8*sizeof(int)/2-1); + const int IndelGap_flush = 1 << (8*sizeof(int)/2-2); + + int var_type = 0, i; + if ( line ) + { + // Still on the same chromosome? + int ilast = rbuf_last(&args->rbuf); + if ( ilast>=0 && line->rid != args->rbuf_lines[ilast]->rid ) + flush_buffer(args, args->rbuf.n); // new chromosome, flush everything + + rbuf_expand0(&args->rbuf,bcf1_t*,args->rbuf.n,args->rbuf_lines); + + // Insert the new record in the buffer. The line would be overwritten in + // the next bcf_sr_next_line call, therefore we need to swap it with an + // unused one + ilast = rbuf_append(&args->rbuf); + if ( !args->rbuf_lines[ilast] ) args->rbuf_lines[ilast] = bcf_init1(); + SWAP(bcf1_t*, args->files->readers[0].buffer[0], args->rbuf_lines[ilast]); + + var_type = bcf_get_variant_types(line); + + // Find out the size of an indel. The indel boundaries are based on REF + // (POS+1,POS+rlen-1). This is not entirely correct: mpileup likes to + // output REF=CAGAGAGAGA, ALT=CAGAGAGAGAGA where REF=C,ALT=CGA could be + // used. This filter is therefore more strict and may remove some valid + // SNPs. + // Set the REF allele's length to max deletion length or to 1 if a SNP or an insertion. + line->d.var[0].n = line->rlen; + } + + int k_flush = 1; + if ( args->indel_gap ) + { + k_flush = 0; + // Find indels which are too close to each other + int last_to = -1; + for (i=-1; rbuf_next(&args->rbuf,&i); ) + { + bcf1_t *rec = args->rbuf_lines[i]; + int rec_from = rec->pos; + if ( last_to!=-1 && last_to < rec_from ) break; + + k_flush++; + if ( !(rec->d.var_type & VCF_INDEL) ) continue; + + rec->d.var_type |= IndelGap_set; + last_to = args->indel_gap + rec->pos + rec->d.var[0].n - 1; + } + if ( i==args->rbuf.f && line && last_to!=-1 ) k_flush = 0; + if ( k_flush || !line ) + { + // Select the best indel from the cluster of k_flush indels + int k = 0, max_ac = -1, imax_ac = -1, max_qual = -1, imax_qual = -1; + for (i=-1; rbuf_next(&args->rbuf,&i) && krbuf_lines[i]; + if ( !(rec->d.var_type & IndelGap_set) ) continue; + hts_expand(int, rec->n_allele, args->ntmpi, args->tmpi); + int ret = bcf_calc_ac(args->hdr, rec, args->tmpi, BCF_UN_ALL); + if ( imax_ac==-1 || (ret && max_ac < args->tmpi[1]) ) { max_ac = args->tmpi[1]; imax_ac = i; } + if ( imax_qual==-1 || max_qual < rec->qual ) { max_qual = rec->qual; imax_qual = i; } + } + + // Filter all but the best indel (with the best QUAL, bigger AC, or take the first if neither QUAL nor AC are available) + k = 0; + for (i=-1; rbuf_next(&args->rbuf,&i) && krbuf_lines[i]; + if ( !(rec->d.var_type & IndelGap_set) ) continue; + rec->d.var_type |= IndelGap_flush; + + int do_filter = 0; + if ( max_qual>0 ) + { + if ( i!=imax_qual ) do_filter = 1; + } + else if ( i!=imax_ac ) do_filter = 1; + if ( do_filter ) bcf_add_filter(args->hdr, args->rbuf_lines[i], args->IndelGap_id); + } + } + } + + if ( !line ) + { + // Finished: flush everything + flush_buffer(args, args->rbuf.n); + return; + } + + int j_flush = 1; + if ( args->snp_gap ) + { + j_flush = 0; + int last_from = line->pos; + for (i=-1; rbuf_next(&args->rbuf,&i); ) + { + bcf1_t *rec = args->rbuf_lines[i]; + int rec_to = rec->pos + rec->d.var[0].n - 1; // last position affected by the variant + if ( rec_to + args->snp_gap < last_from ) + j_flush++; + else if ( (var_type & args->snp_gap_type) && (rec->d.var_type & VCF_SNP) && !(rec->d.var_type & SnpGap_set) ) + { + // this SNP has not been SnpGap-filtered yet + rec->d.var_type |= SnpGap_set; + bcf_add_filter(args->hdr, rec, args->SnpGap_id); + } + else if ( (var_type & VCF_SNP) && (rec->d.var_type & args->snp_gap_type) ) + { + // the line which we are adding is a SNP and needs to be filtered + line->d.var_type |= SnpGap_set; + bcf_add_filter(args->hdr, line, args->SnpGap_id); + break; + } + } + } + flush_buffer(args, j_flush < k_flush ? j_flush : k_flush); +} + +static void set_genotypes(args_t *args, bcf1_t *line, int pass_site) +{ + int i,j; + if ( !bcf_hdr_nsamples(args->hdr) ) return; + if ( args->smpl_pass ) + { + int npass = 0; + for (i=0; ihdr); i++) npass += args->smpl_pass[i]; + + // return if all samples pass + if ( npass==bcf_hdr_nsamples(args->hdr) && (args->filter_logic & FLT_INCLUDE) ) return; + if ( npass==0 && (args->filter_logic & FLT_EXCLUDE) ) return; + } + else if ( pass_site ) return; + + int an = 0, has_an = bcf_get_info_int32(args->hdr, line, "AN", &args->tmp_ac, &args->ntmp_ac); + if ( has_an==1 ) an = args->tmp_ac[0]; + else has_an = 0; + + int has_ac = bcf_get_info_int32(args->hdr, line, "AC", &args->tmp_ac, &args->ntmp_ac); + has_ac = has_ac==line->n_allele-1 ? 1 : 0; + + int new_gt = 0, ngts = bcf_get_format_int32(args->hdr, line, "GT", &args->tmpi, &args->ntmpi); + ngts /= bcf_hdr_nsamples(args->hdr); + if ( args->set_gts==SET_GTS_MISSING ) new_gt = bcf_gt_missing; + else if ( args->set_gts==SET_GTS_REF ) new_gt = bcf_gt_unphased(0); + else error("todo: set_gts=%d\n", args->set_gts); + for (i=0; ihdr); i++) + { + if ( args->smpl_pass ) + { + int pass = args->smpl_pass[i]; + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( pass ) continue; + } + int32_t *gts = args->tmpi + ngts*i; + for (j=0; jset_gts==SET_GTS_MISSING && !bcf_gt_is_missing(gts[j]) ) + { + int ial = bcf_gt_allele(gts[j]); + if ( has_ac && ial>0 && ial<=line->n_allele ) args->tmp_ac[ ial-1 ]--; + an--; + } + else if ( args->set_gts==SET_GTS_REF ) + { + int ial = bcf_gt_allele(gts[j]); + if ( bcf_gt_is_missing(gts[j]) ) an++; + else if ( has_ac && ial>0 && ial<=line->n_allele ) args->tmp_ac[ ial-1 ]--; + } + gts[j] = new_gt; + } + } + bcf_update_genotypes(args->hdr,line,args->tmpi,ngts*bcf_hdr_nsamples(args->hdr)); + if ( has_an ) bcf_update_info_int32(args->hdr,line,"AN",&an,1); + if ( has_ac ) bcf_update_info_int32(args->hdr,line,"AC",args->tmp_ac,line->n_allele-1); +} + +static void _set_variant_boundaries(bcf1_t *rec, hts_pos_t *beg, hts_pos_t *end) +{ + hts_pos_t off; + if ( rec->n_allele ) + { + off = rec->rlen; + bcf_unpack(rec, BCF_UN_STR); + int i; + for (i=1; in_allele; i++) + { + // Make symbolic alleles start at POS, although this is not strictly true for + // , where POS should be the position BEFORE the deletion/insertion. + // However, since arbitrary symbolic alleles can be defined by the user, we + // will simplify the interpretation of --targets-overlap and --region-overlap. + int j = 0; + char *ref = rec->d.allele[0]; + char *alt = rec->d.allele[i]; + while ( ref[j] && alt[j] && ref[j]==alt[j] ) j++; + if ( off > j ) off = j; + if ( !off ) break; + } + } + else + off = 0; + + *beg = rec->pos + off; + *end = rec->pos + rec->rlen - 1; +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Apply fixed-threshold filters.\n"); + fprintf(bcftools_stderr, "Usage: bcftools filter [options] \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -e, --exclude EXPR Exclude sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " -g, --SnpGap INT[:TYPE] Filter SNPs within base pairs of an indel (the default) or any combination of indel,mnp,bnd,other,overlap\n"); + fprintf(bcftools_stderr, " -G, --IndelGap INT Filter clusters of indels separated by or fewer base pairs allowing only one to pass\n"); + fprintf(bcftools_stderr, " -i, --include EXPR Include only sites for which the expression is true (see man page for details\n"); + fprintf(bcftools_stderr, " --mask [^]REGION Soft filter regions, \"^\" to negate\n"); + fprintf(bcftools_stderr, " -M, --mask-file [^]FILE Soft filter regions listed in a file, \"^\" to negate\n"); + fprintf(bcftools_stderr, " --mask-overlap 0|1|2 Mask if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -m, --mode [+x] \"+\": do not replace but add to existing FILTER; \"x\": reset filters at sites which pass\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --soft-filter STRING Annotate FILTER column with or unique filter name (\"Filter%%d\") made up by the program (\"+\")\n"); + fprintf(bcftools_stderr, " -S, --set-GTs .|0 Set genotypes of failed samples to missing (.) or ref (0)\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcffilter(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->clevel = -1; + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + args->mask_overlap = 1; + + static struct option loptions[] = + { + {"set-GTs",required_argument,NULL,'S'}, + {"mode",required_argument,NULL,'m'}, + {"mask",required_argument,NULL,10}, + {"mask-file",required_argument,NULL,'M'}, + {"mask-overlap",required_argument,NULL,11}, + {"soft-filter",required_argument,NULL,'s'}, + {"exclude",required_argument,NULL,'e'}, + {"include",required_argument,NULL,'i'}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,4}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"SnpGap",required_argument,NULL,'g'}, + {"IndelGap",required_argument,NULL,'G'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "e:i:t:T:r:R:h?s:m:o:O:g:G:S:",loptions,NULL)) >= 0) { + switch (c) { + case 'g': + args->snp_gap = strtol(optarg,&tmp,10); + if ( *tmp && *tmp!=':' ) error("Could not parse argument: --SnpGap %s\n", optarg); + if ( *tmp==':' ) + { + args->snp_gap_str = tmp+1; + int i,n; + char **keys = hts_readlist(tmp+1,0,&n); + for(i=0; isnp_gap_type |= VCF_INDEL; + else if ( !strcasecmp(keys[i],"mnp") ) args->snp_gap_type |= VCF_MNP; + else if ( !strcasecmp(keys[i],"bnd") ) args->snp_gap_type |= VCF_BND; + else if ( !strcasecmp(keys[i],"other") ) args->snp_gap_type |= VCF_OTHER; + else if ( !strcasecmp(keys[i],"overlap") ) args->snp_gap_type |= VCF_OVERLAP; + else error("Could not parse \"%s\" in \"--SnpGap %s\"\n", keys[i], optarg); + free(keys[i]); + } + if ( n ) free(keys); + } + else + { + args->snp_gap_type = VCF_INDEL; + args->snp_gap_str = "indel"; + } + break; + case 'G': + args->indel_gap = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --IndelGap %s\n", optarg); + break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 's': args->soft_filter = optarg; break; + case 'm': + if ( strchr(optarg,'x') ) args->annot_mode |= ANNOT_RESET; + if ( strchr(optarg,'+') ) args->annot_mode |= ANNOT_ADD; + break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'S': + if ( !strcmp(".",optarg) ) args->set_gts = SET_GTS_MISSING; + else if ( !strcmp("0",optarg) ) args->set_gts = SET_GTS_REF; + else error("The argument to -S not recognised: %s\n", optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 4 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 10 : args->mask_list = optarg; break; + case 'M' : args->mask_list = optarg; args->mask_is_file = 1; break; + case 11 : + if ( !strcasecmp(optarg,"0") ) args->mask_overlap = 0; + else if ( !strcasecmp(optarg,"1") ) args->mask_overlap = 1; + else if ( !strcasecmp(optarg,"2") ) args->mask_overlap = 2; + else error("Could not parse: --mask-overlap %s\n",optarg); + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( args->filter_logic == (FLT_EXCLUDE|FLT_INCLUDE) ) error("Only one of -i or -e can be given.\n"); + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(args); + } + else fname = argv[optind]; + + if ( args->mask_list && !args->soft_filter ) error("The option --soft-filter is required with --mask and --mask-file options\n"); + + // read in the regions from the command line + if ( args->regions_list ) + { + args->files->require_index = 1; + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + else if ( optind+1 < argc ) + { + int i; + kstring_t tmp = {0,0,0}; + kputs(argv[optind+1],&tmp); + for (i=optind+2; ifiles->require_index = 1; + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, tmp.s, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + free(tmp.s); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list,targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + if ( bcf_hdr_write(args->out_fh, args->hdr)!=0 ) error("[%s] Error: cannot write the header to %s\n", __func__,args->output_fname); + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files, 0); + int pass = 1; + if ( args->filter ) + { + pass = filter_test(args->filter, line, &args->smpl_pass); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + } + if ( args->mask ) + { + hts_pos_t beg, end; + if ( args->mask_overlap==0 ) beg = end = line->pos; + else if ( args->mask_overlap==1 ) beg = line->pos, end = line->pos + line->rlen - 1; + else _set_variant_boundaries(line,&beg,&end); + int mpass = regidx_overlap(args->mask,bcf_seqname(args->hdr,line),beg,end,NULL) ? 0 : 1; + if ( args->mask_negate ) mpass = mpass ? 0 : 1; + pass &= mpass; + } + if ( args->soft_filter || args->set_gts || pass ) + { + if ( pass ) + { + bcf_unpack(line,BCF_UN_FLT); + if ( args->annot_mode & ANNOT_RESET || !line->d.n_flt ) bcf_add_filter(args->hdr, line, args->flt_pass); + } + else if ( args->soft_filter ) + { + if ( (args->annot_mode & ANNOT_ADD) ) bcf_add_filter(args->hdr, line, args->flt_fail); + else bcf_update_filter(args->hdr, line, &args->flt_fail, 1); + } + if ( args->set_gts ) set_genotypes(args, line, pass); + if ( !args->rbuf_lines ) + { + if ( bcf_write1(args->out_fh, args->hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } + else + buffered_filters(args, line); + } + } + buffered_filters(args, NULL); + + if ( hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} diff --git a/bcftools/vcfgtcheck.c b/bcftools/vcfgtcheck.c new file mode 100644 index 0000000..f646e1f --- /dev/null +++ b/bcftools/vcfgtcheck.c @@ -0,0 +1,1277 @@ +/* vcfgtcheck.c -- Check sample identity. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "extsort.h" +//#include "hclust.h" + +typedef struct +{ + int iqry, igt; +} +pair_t; + +typedef struct +{ + bcf_srs_t *files; // first reader is the query VCF - single sample normally or multi-sample for cross-check + bcf_hdr_t *gt_hdr, *qry_hdr; // VCF with genotypes to compare against and the query VCF + char *cwd, **argv, *gt_samples, *qry_samples, *regions, *targets, *qry_fname, *gt_fname, *pair_samples; + int argc, gt_samples_is_file, qry_samples_is_file, regions_is_file, targets_is_file, pair_samples_is_file; + int regions_overlap, targets_overlap; + int qry_use_GT,gt_use_GT, nqry_smpl,ngt_smpl, *qry_smpl,*gt_smpl; + double *pdiff, *qry_prob, *gt_prob; + uint32_t *ndiff,*ncnt,ncmp, npairs; + int32_t *qry_arr,*gt_arr, nqry_arr,ngt_arr; + uint8_t *qry_dsg, *gt_dsg; + pair_t *pairs; + double *hwe_prob, dsg2prob[8][3], pl2prob[256]; + double min_inter_err, max_intra_err; + int all_sites, hom_only, ntop, cross_check, calc_hwe_prob, sort_by_hwe, dry_run, use_PLs; + FILE *fp; + unsigned int nskip_no_match, nskip_not_ba, nskip_mono, nskip_no_data, nskip_dip_GT, nskip_dip_PL; + + // for --distinctive-sites + double distinctive_sites; + kbitset_t *kbs_diff; + size_t diff_sites_size; + extsort_t *es; + char *es_tmp_prefix, *es_max_mem; +} +args_t; + +static void set_cwd(args_t *args) +{ + int i; + char *buf; + size_t nbuf = 500; + args->cwd = (char*) malloc(sizeof(char)*nbuf); + for (i=0; i<5; i++) + { + if ( (buf = getcwd(args->cwd, nbuf)) ) break; + nbuf *= 2; + args->cwd = (char*) realloc(args->cwd, sizeof(char)*nbuf); + } + assert(buf); +} +static void print_header(args_t *args, FILE *fp) +{ + fprintf(fp, "# This file was produced by bcftools (%s+htslib-%s), the command line was:\n", bcftools_version(), hts_version()); + fprintf(fp, "# \t bcftools %s ", args->argv[0]); + int i; + for (i=1; iargc; i++) + fprintf(fp, " %s",args->argv[i]); + fprintf(fp, "\n# and the working directory was:\n"); + fprintf(fp, "# \t %s\n#\n", args->cwd); +} + +static int cmp_int(const void *_a, const void *_b) +{ + int a = *((int*)_a); + int b = *((int*)_b); + if ( a < b ) return -1; + if ( a > b ) return 1; + return 0; +} +static int cmp_pair(const void *_a, const void *_b) +{ + pair_t *a = (pair_t*)_a; + pair_t *b = (pair_t*)_b; + if ( a->iqry < b->iqry ) return -1; + if ( a->iqry > b->iqry ) return 1; + if ( a->igt < b->igt ) return -1; + if ( a->igt > b->igt ) return 1; + return 0; +} + +typedef struct +{ + uint32_t ndiff,rid,pos,rand; // rand is to shuffle sites with the same ndiff from across all chromosoms + unsigned long kbs_dat[1]; +} +diff_sites_t; +#if DBG +static void diff_sites_debug_print(args_t *args, diff_sites_t *ds) +{ + int i; + memcpy(args->kbs_diff->b,ds->kbs_dat,args->kbs_diff->n*sizeof(unsigned long)); + fprintf(stderr,"%s:%d\t%d\t",bcf_hdr_id2name(args->qry_hdr,ds->rid),ds->pos+1,ds->ndiff); + for (i=0; inpairs; i++) fprintf(stderr,"%d",kbs_exists(args->kbs_diff,i)?1:0); + fprintf(stderr,"\n"); +} +#endif +static int diff_sites_cmp(const void *aptr, const void *bptr) +{ + diff_sites_t *a = *((diff_sites_t**)aptr); + diff_sites_t *b = *((diff_sites_t**)bptr); + if ( a->ndiff < b->ndiff ) return 1; // descending order + if ( a->ndiff > b->ndiff ) return -1; + if ( a->rand < b->rand ) return -1; + if ( a->rand > b->rand ) return 1; + return 0; +} +static void diff_sites_init(args_t *args) +{ + int nsites = args->distinctive_sites<=1 ? args->npairs*args->distinctive_sites : args->distinctive_sites; + if ( nsites<=0 ) error("The value for --distinctive-sites was set too low: %d\n",nsites); + if ( nsites > args->npairs ) + { + fprintf(stderr,"Warning: The value for --distinctive-sites is bigger than is the number of pairs, all discordant sites be printed.\n"); + nsites = args->npairs; + args->distinctive_sites = args->npairs + 1; + } + else + args->distinctive_sites = nsites; + args->kbs_diff = kbs_init(args->npairs); + size_t n = (args->npairs + KBS_ELTBITS-1) / KBS_ELTBITS; + assert( n==args->kbs_diff->n ); + args->diff_sites_size = sizeof(diff_sites_t) + (n-1)*sizeof(unsigned long); + args->es = extsort_alloc(); + extsort_set_opt(args->es,size_t,DAT_SIZE,args->diff_sites_size); + extsort_set_opt(args->es,const char*,TMP_PREFIX,args->es_tmp_prefix); + extsort_set_opt(args->es,const char*,MAX_MEM,args->es_max_mem); + extsort_set_opt(args->es,extsort_cmp_f,FUNC_CMP,diff_sites_cmp); + extsort_init(args->es); +} +static void diff_sites_destroy(args_t *args) +{ + kbs_destroy(args->kbs_diff); + extsort_destroy(args->es); +} +static inline void diff_sites_reset(args_t *args) +{ + kbs_clear(args->kbs_diff); +} +static inline void diff_sites_push(args_t *args, int ndiff, int rid, int pos) +{ + diff_sites_t *dat = (diff_sites_t*) malloc(args->diff_sites_size); + memset(dat,0,sizeof(*dat)); // for debugging: prevent warnings about uninitialized memory coming from struct padding (not needed after rand added) + dat->ndiff = ndiff; + dat->rid = rid; + dat->pos = pos; + dat->rand = hts_lrand48(); + memcpy(dat->kbs_dat,args->kbs_diff->b,args->kbs_diff->n*sizeof(unsigned long)); + extsort_push(args->es,dat); +} +static inline int diff_sites_shift(args_t *args, int *ndiff, int *rid, int *pos) +{ + diff_sites_t *dat = (diff_sites_t*) extsort_shift(args->es); + if ( !dat ) return 0; + *ndiff = dat->ndiff; + *rid = dat->rid; + *pos = dat->pos; + memcpy(args->kbs_diff->b,dat->kbs_dat,args->kbs_diff->n*sizeof(unsigned long)); + return 1; +} + +static void init_samples(char *list, int list_is_file, int **smpl, int *nsmpl, bcf_hdr_t *hdr, char *vcf_fname) +{ + int i; + if ( !strcmp(list,"-") ) + { + *nsmpl = bcf_hdr_nsamples(hdr); + *smpl = (int*) malloc(sizeof(**smpl)*(*nsmpl)); + for (i=0; i<*nsmpl; i++) (*smpl)[i] = i; + return; + } + + char **tmp = hts_readlist(list, list_is_file, nsmpl); + if ( !tmp || !*nsmpl ) error("Failed to parse %s\n", list); + *smpl = (int*) malloc(sizeof(**smpl)*(*nsmpl)); + for (i=0; i<*nsmpl; i++) + { + int idx = bcf_hdr_id2int(hdr, BCF_DT_SAMPLE, tmp[i]); + if ( idx<0 ) error("No such sample in %s: [%s]\n",vcf_fname,tmp[i]); + (*smpl)[i] = idx; + free(tmp[i]); + } + free(tmp); + qsort(*smpl,*nsmpl,sizeof(**smpl),cmp_int); + // check for duplicates + for (i=1; i<*nsmpl; i++) + if ( (*smpl)[i-1]==(*smpl)[i] ) + error("Error: the sample \"%s\" is listed twice in %s\n", hdr->samples[(*smpl)[i]],list); +} + +static void init_data(args_t *args) +{ + hts_srand48(0); + + args->files = bcf_sr_init(); + if ( args->regions ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions, args->regions_is_file)<0 ) error("Failed to read the regions: %s\n", args->regions); + } + if ( args->targets ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,args->targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets, args->targets_is_file, 0)<0 ) error("Failed to read the targets: %s\n", args->targets); + } + + if ( args->gt_fname ) bcf_sr_set_opt(args->files, BCF_SR_REQUIRE_IDX); + if ( !bcf_sr_add_reader(args->files,args->qry_fname) ) error("Failed to open %s: %s\n", args->qry_fname,bcf_sr_strerror(args->files->errnum)); + if ( args->gt_fname && !bcf_sr_add_reader(args->files, args->gt_fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",args->gt_fname)?"standard input":args->gt_fname,bcf_sr_strerror(args->files->errnum)); + + args->qry_hdr = bcf_sr_get_header(args->files,0); + if ( !bcf_hdr_nsamples(args->qry_hdr) ) error("No samples in %s?\n", args->qry_fname); + if ( args->gt_fname ) + { + args->gt_hdr = bcf_sr_get_header(args->files,1); + if ( !bcf_hdr_nsamples(args->gt_hdr) ) error("No samples in %s?\n", args->gt_fname); + } + + // Determine whether GT or PL will be used + if ( args->qry_use_GT==-1 ) // not set by -u, qry uses PL by default + { + if ( bcf_hdr_id2int(args->qry_hdr,BCF_DT_ID,"PL")>=0 ) + args->qry_use_GT = 0; + else if ( bcf_hdr_id2int(args->qry_hdr,BCF_DT_ID,"GT")>=0 ) + args->qry_use_GT = 1; + else + error("[E::%s] Neither PL nor GT tag is present in the header of %s\n", __func__, args->qry_fname); + } + else if ( args->qry_use_GT==1 ) + { + if ( bcf_hdr_id2int(args->qry_hdr,BCF_DT_ID,"GT")<0 ) + error("[E::%s] The GT tag is not present in the header of %s\n", __func__, args->qry_fname); + } + else if ( bcf_hdr_id2int(args->qry_hdr,BCF_DT_ID,"PL")<0 ) + error("[E::%s] The PL tag is not present in the header of %s\n", __func__, args->qry_fname); + + if ( args->gt_hdr ) + { + if ( args->gt_use_GT==-1 ) // not set by -u, gt uses GT by default + { + if ( bcf_hdr_id2int(args->gt_hdr,BCF_DT_ID,"GT")>=0 ) + args->gt_use_GT = 1; + else if ( bcf_hdr_id2int(args->gt_hdr,BCF_DT_ID,"PL")>=0 ) + args->gt_use_GT = 0; + else + error("[E::%s] Neither PL nor GT tag is present in the header of %s\n", __func__, args->gt_fname); + } + else if ( args->gt_use_GT==1 ) + { + if ( bcf_hdr_id2int(args->gt_hdr,BCF_DT_ID,"GT")<0 ) + error("[E::%s] The GT tag is not present in the header of %s\n", __func__, args->gt_fname); + } + else if ( bcf_hdr_id2int(args->gt_hdr,BCF_DT_ID,"PL")<0 ) + error("[E::%s] The PL tag is not present in the header of %s\n", __func__, args->gt_fname); + } + else + args->gt_use_GT = args->qry_use_GT; + + // Prepare samples + int i,j; + args->nqry_smpl = bcf_hdr_nsamples(args->qry_hdr); + if ( args->qry_samples ) + { + init_samples(args->qry_samples, args->qry_samples_is_file, &args->qry_smpl, &args->nqry_smpl, args->qry_hdr, args->qry_fname); + } + if ( args->gt_samples ) + { + init_samples(args->gt_samples, args->gt_samples_is_file, &args->gt_smpl, &args->ngt_smpl, + args->gt_hdr ? args->gt_hdr : args->qry_hdr, + args->gt_fname ? args->gt_fname : args->qry_fname); + } + else if ( args->pair_samples ) + { + int npairs; + char **tmp = hts_readlist(args->pair_samples, args->pair_samples_is_file, &npairs); + if ( !tmp || !npairs ) error("Failed to parse %s\n", args->pair_samples); + if ( !args->pair_samples_is_file && npairs%2 ) error("Expected even number of comma-delimited samples with -p\n"); + args->npairs = args->pair_samples_is_file ? npairs : npairs/2; + args->pairs = (pair_t*) calloc(args->npairs,sizeof(*args->pairs)); + if ( !args->pair_samples_is_file ) + { + for (i=0; inpairs; i++) + { + args->pairs[i].iqry = bcf_hdr_id2int(args->qry_hdr, BCF_DT_SAMPLE, tmp[2*i]); + args->pairs[i].igt = bcf_hdr_id2int(args->gt_hdr?args->gt_hdr:args->qry_hdr, BCF_DT_SAMPLE, tmp[2*i+1]); + if ( args->pairs[i].iqry < 0 ) error("No such sample in %s: [%s]\n",args->qry_fname,tmp[2*i]); + if ( args->pairs[i].igt < 0 ) error("No such sample in %s: [%s]\n",args->gt_fname?args->gt_fname:args->qry_fname,tmp[2*i+1]); + free(tmp[2*i]); + free(tmp[2*i+1]); + } + } + else + { + for (i=0; inpairs; i++) + { + char *ptr = tmp[i]; + while ( *ptr && !isspace(*ptr) ) ptr++; + if ( !*ptr ) error("Could not parse %s: %s\n",args->pair_samples,tmp[i]); + *ptr = 0; + args->pairs[i].iqry = bcf_hdr_id2int(args->qry_hdr, BCF_DT_SAMPLE, tmp[i]); + if ( args->pairs[i].iqry < 0 ) error("No such sample in %s: [%s]\n",args->qry_fname,tmp[i]); + ptr++; + while ( *ptr && isspace(*ptr) ) ptr++; + args->pairs[i].igt = bcf_hdr_id2int(args->gt_hdr?args->gt_hdr:args->qry_hdr, BCF_DT_SAMPLE, ptr); + if ( args->pairs[i].igt < 0 ) error("No such sample in %s: [%s]\n",args->gt_fname?args->gt_fname:args->qry_fname,ptr); + free(tmp[i]); + } + } + free(tmp); + qsort(args->pairs,args->npairs,sizeof(*args->pairs),cmp_pair); + } + else if ( args->gt_hdr ) + args->ngt_smpl = bcf_hdr_nsamples(args->gt_hdr); + if ( !args->ngt_smpl ) + { + args->ngt_smpl = args->nqry_smpl; + args->gt_smpl = args->qry_smpl; + args->cross_check = 1; + } + + // The data arrays + if ( !args->npairs ) args->npairs = args->cross_check ? args->nqry_smpl*(args->nqry_smpl+1)/2 : args->ngt_smpl*args->nqry_smpl; + if ( !args->pair_samples ) + { + args->qry_dsg = (uint8_t*) malloc(args->nqry_smpl); + args->gt_dsg = args->cross_check ? args->qry_dsg : (uint8_t*) malloc(args->ngt_smpl); + } + if ( args->use_PLs ) + { + args->pdiff = (double*) calloc(args->npairs,sizeof(*args->pdiff)); // log probability of pair samples being the same + args->qry_prob = (double*) malloc(3*args->nqry_smpl*sizeof(*args->qry_prob)); + args->gt_prob = args->cross_check ? args->qry_prob : (double*) malloc(3*args->ngt_smpl*sizeof(*args->gt_prob)); + + // dsg2prob: the first index is bitmask of 8 possible dsg combinations (only 1<<0,1<<2,1<<3 are set, accessing + // anything else indicated an error, this is just to reuse gt_to_dsg()); the second index are the corresponding + // probabilities of 0/0, 0/1, and 1/1 genotypes + for (i=0; i<8; i++) + for (j=0; j<3; j++) + args->dsg2prob[i][j] = HUGE_VAL; + args->dsg2prob[1][0] = -log(1-pow(10,-0.1*args->use_PLs)); + args->dsg2prob[1][1] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[1][2] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[2][0] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[2][1] = -log(1-pow(10,-0.1*args->use_PLs)); + args->dsg2prob[2][2] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[4][0] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[4][1] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[4][2] = -log(1-pow(10,-0.1*args->use_PLs)); + + // lookup table to avoid exponentiation + for (i=0; i<256; i++) args->pl2prob[i] = pow(10,-0.1*i); + } + else + args->ndiff = (uint32_t*) calloc(args->npairs,sizeof(*args->ndiff)); // number of differing genotypes for each pair of samples + args->ncnt = (uint32_t*) calloc(args->npairs,sizeof(*args->ncnt)); // number of comparisons performed (non-missing data) + if ( !args->ncnt ) error("Error: failed to allocate %.1f Mb\n", args->npairs*sizeof(*args->ncnt)/1e6); + if ( args->calc_hwe_prob ) + { + // prob of the observed sequence of matches given site AFs and HWE + args->hwe_prob = (double*) calloc(args->npairs,sizeof(*args->hwe_prob)); + if ( !args->hwe_prob ) error("Error: failed to allocate %.1f Mb. Run with --no-HWE-prob to save some memory.\n", args->npairs*sizeof(*args->hwe_prob)/1e6); + } + + if ( args->distinctive_sites ) diff_sites_init(args); + + args->fp = stdout; + print_header(args, args->fp); +} + +static void destroy_data(args_t *args) +{ + if ( args->gt_dsg!=args->qry_dsg ) free(args->gt_dsg); + free(args->qry_dsg); + if ( args->gt_prob!=args->qry_prob ) free(args->gt_prob); + free(args->qry_prob); + free(args->es_max_mem); + fclose(args->fp); + if ( args->distinctive_sites ) diff_sites_destroy(args); + free(args->hwe_prob); + free(args->cwd); + free(args->qry_arr); + if ( args->gt_hdr ) free(args->gt_arr); + free(args->pdiff); + free(args->ndiff); + free(args->ncnt); + free(args->qry_smpl); + if ( args->gt_smpl!=args->qry_smpl ) free(args->gt_smpl); + free(args->pairs); + bcf_sr_destroy(args->files); +} + +static inline uint8_t gt_to_dsg(int32_t *ptr) +{ + if ( bcf_gt_is_missing(ptr[0]) || bcf_gt_is_missing(ptr[1]) || ptr[1]==bcf_int32_vector_end ) return 0; + uint8_t dsg = (bcf_gt_allele(ptr[0])?1:0) + (bcf_gt_allele(ptr[1])?1:0); + return 1<dsg2prob[dsg][0]; + prob[1] = args->dsg2prob[dsg][1]; + prob[2] = args->dsg2prob[dsg][2]; + } + return dsg; +} +static inline uint8_t pl_to_prob(args_t *args, int32_t *ptr, double *prob) +{ + uint8_t dsg = pl_to_dsg(ptr); + if ( dsg ) + { + prob[0] = (ptr[0]>=0 && ptr[0]<255) ? args->pl2prob[ptr[0]] : args->pl2prob[255]; + prob[1] = (ptr[1]>=0 && ptr[1]<255) ? args->pl2prob[ptr[1]] : args->pl2prob[255]; + prob[2] = (ptr[2]>=0 && ptr[2]<255) ? args->pl2prob[ptr[2]] : args->pl2prob[255]; + double sum = prob[0] + prob[1] + prob[2]; + prob[0] /= sum; + prob[1] /= sum; + prob[2] /= sum; + prob[0] = -log(prob[0]); + prob[1] = -log(prob[1]); + prob[2] = -log(prob[2]); + } + return dsg; +} +static int set_data(args_t *args, bcf_hdr_t *hdr, bcf1_t *rec, int32_t **arr, int32_t *narr, int *narr1, int *use_GT) +{ + static int warn_dip_GT = 1; + static int warn_dip_PL = 1; + int i; + for (i=0; i<2; i++) + { + if ( *use_GT ) + { + int ret = bcf_get_genotypes(hdr,rec,arr,narr); + if ( ret < 0 ) + { + if ( !i ) { *use_GT = 0; continue; } + args->nskip_no_data++; + return -1; + } + if ( ret != 2*bcf_hdr_nsamples(hdr) ) + { + if ( warn_dip_GT ) + { + fprintf(stderr,"INFO: skipping %s:%"PRIhts_pos", only diploid FORMAT/GT fields supported. (This is printed only once.)\n", bcf_seqname(hdr,rec),rec->pos+1); + warn_dip_GT = 0; + } + args->nskip_dip_GT++; + return -1; + } + *narr1 = 2; + return 0; + } + + int ret = bcf_get_format_int32(hdr,rec,"PL",arr,narr); + if ( ret < 0 ) + { + if ( !i ) { *use_GT = 1; continue; } + args->nskip_no_data++; + return -1; + } + if ( ret != 3*bcf_hdr_nsamples(hdr) ) + { + if ( warn_dip_PL ) + { + fprintf(stderr,"INFO: skipping %s:%"PRIhts_pos", only diploid FORMAT/PL fields supported. (This is printed only once.)\n", bcf_seqname(hdr,rec),rec->pos+1); + warn_dip_PL = 0; + } + args->nskip_dip_PL++; + return -1; + } + *narr1 = 3; + return 0; + } + return -1; // should never reach +} +static void process_line(args_t *args) +{ + int i,j,k, nqry1, ngt1, ret; + + bcf1_t *gt_rec = NULL, *qry_rec = bcf_sr_get_line(args->files,0); // the query file + int qry_use_GT = args->qry_use_GT; + int gt_use_GT = args->gt_use_GT; + + ret = set_data(args, args->qry_hdr, qry_rec, &args->qry_arr, &args->nqry_arr, &nqry1, &qry_use_GT); + if ( ret<0 ) return; + + if ( args->gt_hdr ) + { + gt_rec = bcf_sr_get_line(args->files,1); + ret = set_data(args, args->gt_hdr, gt_rec, &args->gt_arr, &args->ngt_arr, &ngt1, >_use_GT); + if ( ret<0 ) return; + } + else + { + ngt1 = nqry1; + args->gt_arr = args->qry_arr; + } + + args->ncmp++; + + double af,hwe_dsg[8]; + if ( args->calc_hwe_prob ) + { + int ac[2]; + if ( args->gt_hdr ) + { + if ( bcf_calc_ac(args->gt_hdr, gt_rec, ac, BCF_UN_INFO|BCF_UN_FMT)!=1 ) error("todo: bcf_calc_ac() failed\n"); + } + else if ( bcf_calc_ac(args->qry_hdr, qry_rec, ac, BCF_UN_INFO|BCF_UN_FMT)!=1 ) error("todo: bcf_calc_ac() failed\n"); + + // hwe indexes correspond to the bitmask of eight dsg combinations to account for PL uncertainty + // for in the extreme case we can have uninformative PL=0,0,0. So the values are the minima of e.g. + // hwe[1,2,4] .. dsg=0,1,2 + // hwe[3] .. dsg=0 or 1 + // hwe[6] .. dsg=1 or 2 + + double hwe[3]; + const double min_af = 1e-5; // cap the AF in case we get unrealistic values + af = (double)ac[1]/(ac[0]+ac[1]); + hwe[0] = af>min_af ? -log(af*af) : -log(min_af*min_af); + hwe[1] = af>min_af && af<1-min_af ? -log(2*af*(1-af)) : -log(2*min_af*(1-min_af)); + hwe[2] = af<(1-min_af) ? -log((1-af)*(1-af)) : -log(min_af*min_af); + hwe_dsg[0] = 0; + for (i=1; i<8; i++) + { + hwe_dsg[i] = HUGE_VAL; + for (k=0; k<3; k++) + { + if ( ((1< hwe[k] ) hwe_dsg[i] = hwe[k]; + } + } + } + + // The sample pairs were given explicitly via -p/-P options + if ( args->pairs ) + { + if ( !args->use_PLs ) + { + int ndiff = 0; + if ( args->kbs_diff ) diff_sites_reset(args); + + for (i=0; inpairs; i++) + { + int32_t *ptr; + uint8_t qry_dsg, gt_dsg; + + ptr = args->gt_arr + args->pairs[i].igt*ngt1; + gt_dsg = gt_use_GT ? gt_to_dsg(ptr) : pl_to_dsg(ptr); + if ( !gt_dsg ) continue; // missing value + if ( args->hom_only && !(gt_dsg&5) ) continue; // not a hom + + ptr = args->qry_arr + args->pairs[i].iqry*nqry1; + qry_dsg = qry_use_GT ? gt_to_dsg(ptr) : pl_to_dsg(ptr); + if ( !qry_dsg ) continue; // missing value + + int match = qry_dsg & gt_dsg; + if ( !match ) + { + args->ndiff[i]++; + if ( args->kbs_diff ) { ndiff++; kbs_insert(args->kbs_diff, i); } + } + else if ( args->calc_hwe_prob ) args->hwe_prob[i] += hwe_dsg[match]; + args->ncnt[i]++; + } + + if ( ndiff ) diff_sites_push(args, ndiff, qry_rec->rid, qry_rec->pos); + } + else // use_PLs set + { + for (i=0; inpairs; i++) + { + int32_t *ptr; + double qry_prob[3], gt_prob[3]; + uint8_t qry_dsg, gt_dsg; + + ptr = args->gt_arr + args->pairs[i].igt*ngt1; + gt_dsg = gt_use_GT ? gt_to_prob(args,ptr,gt_prob) : pl_to_prob(args,ptr,gt_prob); + if ( !gt_dsg ) continue; // missing value + if ( args->hom_only && !(gt_dsg&5) ) continue; // not a hom + + ptr = args->qry_arr + args->pairs[i].iqry*nqry1; + qry_dsg = qry_use_GT ? gt_to_prob(args,ptr,qry_prob) : pl_to_prob(args,ptr,qry_prob); + if ( !qry_dsg ) continue; // missing value + + double min = qry_prob[0] + gt_prob[0]; + qry_prob[1] += gt_prob[1]; + if ( min > qry_prob[1] ) min = qry_prob[1]; + qry_prob[2] += gt_prob[2]; + if ( min > qry_prob[2] ) min = qry_prob[2]; + args->pdiff[i] += min; + + if ( args->calc_hwe_prob ) + { + int match = qry_dsg & gt_dsg; + args->hwe_prob[i] += hwe_dsg[match]; + } + args->ncnt[i]++; + } + } + return; + } + + int idx=0; + if ( !args->use_PLs ) + { + for (i=0; inqry_smpl; i++) + { + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + int32_t *ptr = args->qry_arr + nqry1*iqry; + args->qry_dsg[i] = qry_use_GT ? gt_to_dsg(ptr) : pl_to_dsg(ptr); + } + if ( !args->cross_check ) // in this case gt_dsg points to qry_dsg + { + for (i=0; ingt_smpl; i++) + { + int igt = args->gt_smpl ? args->gt_smpl[i] : i; + int32_t *ptr = args->gt_arr + ngt1*igt; + args->gt_dsg[i] = gt_use_GT ? gt_to_dsg(ptr) : pl_to_dsg(ptr); + if ( args->hom_only && !(args->gt_dsg[i]&5) ) args->gt_dsg[i] = 0; // not a hom, set to a missing value + } + } + for (i=0; inqry_smpl; i++) + { + int ngt = args->cross_check ? i : args->ngt_smpl; // two files or a sub-diagonal cross-check mode? + if ( !args->qry_dsg[i] ) { idx += ngt; continue; } // missing value + for (j=0; jgt_dsg[j] ) { idx++; continue; } // missing value + int match = args->qry_dsg[i] & args->gt_dsg[j]; + if ( !match ) args->ndiff[idx]++; + else if ( args->calc_hwe_prob ) args->hwe_prob[idx] += hwe_dsg[match]; + args->ncnt[idx]++; + idx++; + } + } + } + else // use_PLs set + { + for (i=0; inqry_smpl; i++) + { + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + int32_t *ptr = args->qry_arr + nqry1*iqry; + args->qry_dsg[i] = qry_use_GT ? gt_to_prob(args,ptr,args->qry_prob+i*3) : pl_to_prob(args,ptr,args->qry_prob+i*3); + } + if ( !args->cross_check ) // in this case gt_dsg points to qry_dsg + { + for (i=0; ingt_smpl; i++) + { + int igt = args->gt_smpl ? args->gt_smpl[i] : i; + int32_t *ptr = args->gt_arr + ngt1*igt; + args->gt_dsg[i] = gt_use_GT ? gt_to_prob(args,ptr,args->gt_prob+i*3) : pl_to_prob(args,ptr,args->gt_prob+i*3); + if ( args->hom_only && !(args->gt_dsg[i]&5) ) args->gt_dsg[i] = 0; // not a hom, set to a missing value + } + } + for (i=0; inqry_smpl; i++) + { + int ngt = args->cross_check ? i : args->ngt_smpl; // two files or a sub-diagonal cross-check mode? + if ( !args->qry_dsg[i] ) { idx += ngt; continue; } // missing value + for (j=0; jgt_dsg[j] ) { idx++; continue; } // missing value + + double min = args->qry_prob[i*3] + args->gt_prob[j*3]; + if ( min > args->qry_prob[i*3+1] + args->gt_prob[j*3+1] ) min = args->qry_prob[i*3+1] + args->gt_prob[j*3+1]; + if ( min > args->qry_prob[i*3+2] + args->gt_prob[j*3+2] ) min = args->qry_prob[i*3+2] + args->gt_prob[j*3+2]; + args->pdiff[idx] += min; + + if ( args->calc_hwe_prob ) + { + int match = args->qry_dsg[i] & args->gt_dsg[j]; + args->hwe_prob[idx] += hwe_dsg[match]; + } + args->ncnt[idx]++; + idx++; + } + } + } +} + + +typedef struct +{ + int ism, idx; + double val; +} +idbl_t; +static int cmp_idbl(const void *_a, const void *_b) +{ + idbl_t *a = (idbl_t*)_a; + idbl_t *b = (idbl_t*)_b; + if ( a->val < b->val ) return -1; + if ( a->val > b->val ) return 1; + return 0; +} +static void report_distinctive_sites(args_t *args) +{ + extsort_sort(args->es); + + fprintf(args->fp,"# DS, distinctive sites:\n"); + fprintf(args->fp,"# - chromosome\n"); + fprintf(args->fp,"# - position\n"); + fprintf(args->fp,"# - cumulative number of pairs distinguished by this block\n"); + fprintf(args->fp,"# - block id\n"); + fprintf(args->fp,"#DS\t[2]Chromosome\t[3]Position\t[4]Cumulative number of distinct pairs\t[5]Block id\n"); + + kbitset_t *kbs_blk = kbs_init(args->npairs); + kbitset_iter_t itr; + int i,ndiff,rid,pos,ndiff_tot = 0, iblock = 0; + int ndiff_min = args->distinctive_sites <= args->npairs ? args->distinctive_sites : args->npairs; + while ( diff_sites_shift(args,&ndiff,&rid,&pos) ) + { + int ndiff_new = 0, ndiff_dbg = 0; + kbs_start(&itr); + while ( (i=kbs_next(args->kbs_diff, &itr))>=0 ) + { + ndiff_dbg++; + if ( kbs_exists(kbs_blk,i) ) continue; // already set + kbs_insert(kbs_blk,i); + ndiff_new++; + } + if ( ndiff_dbg!=ndiff ) error("Corrupted data, fixme: %d vs %d\n",ndiff_dbg,ndiff); + if ( !ndiff_new ) continue; // no new pair distinguished by this site + ndiff_tot += ndiff_new; + fprintf(args->fp,"DS\t%s\t%d\t%d\t%d\n",bcf_hdr_id2name(args->qry_hdr,rid),pos+1,ndiff_tot,iblock); + if ( ndiff_tot < ndiff_min ) continue; // fewer than the requested number of pairs can be distinguished at this point + iblock++; + ndiff_tot = 0; + kbs_clear(kbs_blk); + } + kbs_destroy(kbs_blk); +} +static void report(args_t *args) +{ + fprintf(args->fp,"INFO\tsites-compared\t%u\n",args->ncmp); + fprintf(args->fp,"INFO\tsites-skipped-no-match\t%u\n",args->nskip_no_match); + fprintf(args->fp,"INFO\tsites-skipped-multiallelic\t%u\n",args->nskip_not_ba); + fprintf(args->fp,"INFO\tsites-skipped-monoallelic\t%u\n",args->nskip_mono); + fprintf(args->fp,"INFO\tsites-skipped-no-data\t%u\n",args->nskip_no_data); + fprintf(args->fp,"INFO\tsites-skipped-GT-not-diploid\t%u\n",args->nskip_dip_GT); + fprintf(args->fp,"INFO\tsites-skipped-PL-not-diploid\t%u\n",args->nskip_dip_PL); + fprintf(args->fp,"# DC, discordance:\n"); + fprintf(args->fp,"# - query sample\n"); + fprintf(args->fp,"# - genotyped sample\n"); + fprintf(args->fp,"# - discordance (number of mismatches; smaller is better)\n"); + fprintf(args->fp,"# - negative log of HWE probability at matching sites (rare genotypes mataches are more informative, bigger is better)\n"); + fprintf(args->fp,"# - number of sites compared (bigger is better)\n"); + fprintf(args->fp,"#DC\t[2]Query Sample\t[3]Genotyped Sample\t[4]Discordance\t[5]-log P(HWE)\t[6]Number of sites compared\n"); + + int trim = args->ntop; + if ( !args->pairs ) + { + if ( !args->ngt_smpl && args->nqry_smpl <= args->ntop ) trim = 0; + if ( args->ngt_smpl && args->ngt_smpl <= args->ntop ) trim = 0; + } + + if ( args->pairs ) + { + int i; + for (i=0; inpairs; i++) + { + int iqry = args->pairs[i].iqry; + int igt = args->pairs[i].igt; + if ( args->ndiff ) + { + fprintf(args->fp,"DC\t%s\t%s\t%u\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->ndiff[i], + args->calc_hwe_prob ? args->hwe_prob[i] : 0, + args->ncnt[i]); + } + else + { + fprintf(args->fp,"DC\t%s\t%s\t%e\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->pdiff[i], + args->calc_hwe_prob ? args->hwe_prob[i] : 0, + args->ncnt[i]); + } + } + } + else if ( !trim ) + { + int i,j,idx=0; + for (i=0; inqry_smpl; i++) + { + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + int ngt = args->cross_check ? i : args->ngt_smpl; + for (j=0; jgt_smpl ? args->gt_smpl[j] : j; + if ( args->ndiff ) + { + fprintf(args->fp,"DC\t%s\t%s\t%u\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->ndiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + else + { + fprintf(args->fp,"DC\t%s\t%s\t%e\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->pdiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + idx++; + } + } + } + else if ( !args->cross_check ) + { + idbl_t *arr = (idbl_t*)malloc(sizeof(*arr)*args->ngt_smpl); + int i,j; + for (i=0; inqry_smpl; i++) + { + int idx = i*args->ngt_smpl; + for (j=0; jngt_smpl; j++) + { + if ( args->sort_by_hwe ) + arr[j].val = -args->hwe_prob[idx]; + else if ( args->ndiff ) + arr[j].val = args->ncnt[idx] ? (double)args->ndiff[idx]/args->ncnt[idx] : 0; + else + arr[j].val = args->ncnt[idx] ? args->pdiff[idx]/args->ncnt[idx] : 0; + arr[j].ism = j; + arr[j].idx = idx; + idx++; + } + qsort(arr, args->ngt_smpl, sizeof(*arr), cmp_idbl); + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + for (j=0; jntop; j++) + { + int idx = arr[j].idx; + int igt = args->gt_smpl ? args->gt_smpl[arr[j].ism] : arr[j].ism; + if ( args->ndiff ) + { + fprintf(args->fp,"DC\t%s\t%s\t%u\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->ndiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + else + { + fprintf(args->fp,"DC\t%s\t%s\t%e\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->pdiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + } + } + free(arr); + } + else + { + int narr = args->nqry_smpl-1; + idbl_t *arr = (idbl_t*)malloc(sizeof(*arr)*narr); + int i,j,k,idx; + for (i=0; inqry_smpl; i++) + { + k = 0, idx = i*(i-1)/2; + for (j=0; jsort_by_hwe ) + arr[k].val = -args->hwe_prob[idx]; + else if ( args->ndiff ) + arr[k].val = args->ncnt[idx] ? (double)args->ndiff[idx]/args->ncnt[idx] : 0; + else + arr[k].val = args->ncnt[idx] ? args->pdiff[idx]/args->ncnt[idx] : 0; + arr[k].ism = j; + arr[k].idx = idx; + idx++; + k++; + } + for (; jsort_by_hwe ) + arr[k].val = -args->hwe_prob[idx]; + else if ( args->ndiff ) + arr[k].val = args->ncnt[idx] ? (double)args->ndiff[idx]/args->ncnt[idx] : 0; + else + arr[k].val = args->ncnt[idx] ? args->pdiff[idx]/args->ncnt[idx] : 0; + arr[k].ism = j + 1; + arr[k].idx = idx; + k++; + } + qsort(arr, narr, sizeof(*arr), cmp_idbl); + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + for (j=0; jntop; j++) + { + if ( i <= arr[j].ism ) continue; + int idx = arr[j].idx; + int igt = args->qry_smpl ? args->qry_smpl[arr[j].ism] : arr[j].ism; + if ( args->ndiff ) + { + fprintf(args->fp,"DC\t%s\t%s\t%u\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->qry_hdr->samples[igt], + args->ndiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + else + { + fprintf(args->fp,"DC\t%s\t%s\t%e\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->qry_hdr->samples[igt], + args->pdiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + } + } + free(arr); + } +} + +static int is_input_okay(args_t *args, int nmatch) +{ + int i; + const char *msg; + bcf_hdr_t *hdr; + bcf1_t *rec; + if ( args->gt_hdr && nmatch!=2 ) + { + if ( args->nskip_no_match++ ) return 0; + for (i=0; i<2; i++) + { + rec = bcf_sr_get_line(args->files,i); + if ( rec ) break; + } + hdr = bcf_sr_get_header(args->files,i); + fprintf(stderr,"INFO: skipping %s:%"PRIhts_pos", no record with matching POS+ALT. (This is printed only once.)\n", + bcf_seqname(hdr,rec),rec->pos+1); + return 0; + } + for (i=0; i<2; i++) + { + hdr = bcf_sr_get_header(args->files,i); + rec = bcf_sr_get_line(args->files,i); + if ( rec->n_allele>2 ) + { + if ( args->nskip_not_ba++ ) return 0; + msg = "not a biallelic site, run `bcftools norm -m -` first"; + goto not_okay; + } + if ( bcf_get_variant_types(rec)==VCF_REF ) + { + if ( args->nskip_mono++ ) return 0; + msg = "monoallelic site"; + goto not_okay; + } + if ( !args->gt_hdr ) break; + } + return 1; + +not_okay: + fprintf(stderr,"INFO: skipping %s:%"PRIhts_pos", %s. (This is printed only once.)\n", + bcf_seqname(hdr,rec),rec->pos+1,msg); + return 0; +} + +static void usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Check sample identity. With no -g BCF given, multi-sample cross-check is performed.\n"); + fprintf(stderr, "Usage: bcftools gtcheck [options] [-g ] \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + //fprintf(stderr, " -a, --all-sites Output comparison for all sites\n"); + //fprintf(stderr, " -c, --cluster MIN,MAX Min inter- and max intra-sample error [0.23,-0.3]\n"); + fprintf(stderr, " --distinctive-sites Find sites that can distinguish between at least NUM sample pairs.\n"); + fprintf(stderr, " NUM[,MEM[,TMP]] If the number is smaller or equal to 1, it is interpreted as the fraction of pairs.\n"); + fprintf(stderr, " The optional MEM string sets the maximum memory used for in-memory sorting [500M]\n"); +#ifdef _WIN32 + fprintf(stderr, " and TMP is a prefix of temporary files used by external sorting [/bcftools.XXXXXX]\n"); +#else + fprintf(stderr, " and TMP is a prefix of temporary files used by external sorting [/tmp/bcftools.XXXXXX]\n"); +#endif + fprintf(stderr, " --dry-run Stop after first record to estimate required time\n"); + fprintf(stderr, " -e, --error-probability INT Phred-scaled probability of genotyping error, 0 for faster but less accurate results [40]\n"); + fprintf(stderr, " -g, --genotypes FILE Genotypes to compare against\n"); + fprintf(stderr, " -H, --homs-only Homozygous genotypes only, useful with low coverage data (requires -g)\n"); + fprintf(stderr, " --n-matches INT Print only top INT matches for each sample (sorted by average score), 0 for unlimited.\n"); + fprintf(stderr, " Use negative value to sort by HWE probability rather than by discordance [0]\n"); + fprintf(stderr, " --no-HWE-prob Disable calculation of HWE probability\n"); + fprintf(stderr, " -p, --pairs LIST Comma-separated sample pairs to compare (qry,gt[,qry,gt..] with -g or qry,qry[,qry,qry..] w/o)\n"); + fprintf(stderr, " -P, --pairs-file FILE File with tab-delimited sample pairs to compare (qry,gt with -g or qry,qry w/o)\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --samples [qry|gt]:LIST List of query or -g samples, \"-\" to select all samples (by default all samples are compared)\n"); + fprintf(stderr, " -S, --samples-file [qry|gt]:FILE File with the query or -g samples to compare\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, " -u, --use TAG1[,TAG2] Which tag to use in the query file (TAG1) and the -g file (TAG2) [PL,GT]\n"); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, " # Check discordance of all samples from B against all sample in A\n"); + fprintf(stderr, " bcftools gtcheck -g A.bcf B.bcf\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # Limit comparisons to the fiven list of samples\n"); + fprintf(stderr, " bcftools gtcheck -s gt:a1,a2,a3 -s qry:b1,b2 -g A.bcf B.bcf\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # Compare only two pairs a1,b1 and a1,b2\n"); + fprintf(stderr, " bcftools gtcheck -p a1,b1,a1,b2 -g A.bcf B.bcf\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfgtcheck(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; set_cwd(args); + args->qry_use_GT = -1; + args->gt_use_GT = -1; + args->calc_hwe_prob = 1; + args->use_PLs = 40; + args->regions_overlap = 1; + args->targets_overlap = 0; + + // external sort for --distinctive-sites +#ifdef _WIN32 + args->es_tmp_prefix = NULL; +#else + args->es_tmp_prefix = "/tmp/bcftools-gtcheck"; +#endif + args->es_max_mem = strdup("500M"); + + // In simulated sample swaps the minimum error was 0.3 and maximum intra-sample error was 0.23 + // - min_inter: pairs with smaller err value will be considered identical + // - max_intra: pairs with err value bigger than abs(max_intra_err) will be considered + // different. If negative, the cutoff may be heuristically lowered + args->min_inter_err = 0.23; + args->max_intra_err = -0.3; + + static struct option loptions[] = + { + {"error-probability",1,0,'e'}, + {"use",1,0,'u'}, + {"cluster",1,0,'c'}, + {"GTs-only",1,0,'G'}, + {"all-sites",0,0,'a'}, + {"homs-only",0,0,'H'}, + {"help",0,0,'h'}, + {"genotypes",1,0,'g'}, + {"plot",1,0,'p'}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"n-matches",1,0,2}, + {"no-HWE-prob",0,0,3}, + {"target-sample",1,0,4}, + {"dry-run",0,0,5}, + {"distinctive-sites",1,0,6}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,7}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,8}, + {"pairs",1,0,'p'}, + {"pairs-file",1,0,'P'}, + {0,0,0,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "hg:p:s:S:p:P:Hr:R:at:T:G:c:u:e:",loptions,NULL)) >= 0) { + switch (c) { + case 'e': + args->use_PLs = strtol(optarg,&tmp,10); + if ( !tmp || *tmp ) error("Could not parse: --error-probability %s\n", optarg); + break; + case 'u': + { + int i,nlist; + char **list = hts_readlist(optarg, 0, &nlist); + if ( !list || nlist<=0 || nlist>2 ) error("Failed to parse --use %s\n", optarg); + if ( !strcasecmp("GT",list[0]) ) args->qry_use_GT = 1; + else if ( !strcasecmp("PL",list[0]) ) args->qry_use_GT = 0; + else error("Failed to parse --use %s; only GT and PL are supported\n", optarg); + if ( nlist==2 ) + { + if ( !strcasecmp("GT",list[1]) ) args->gt_use_GT = 1; + else if ( !strcasecmp("PL",list[1]) ) args->gt_use_GT = 0; + else error("Failed to parse --use %s; only GT and PL are supported\n", optarg); + } + else args->gt_use_GT = args->qry_use_GT; + for (i=0; intop = strtol(optarg,&tmp,10); + if ( !tmp || *tmp ) error("Could not parse: --n-matches %s\n", optarg); + if ( args->ntop < 0 ) + { + args->sort_by_hwe = 1; + args->ntop *= -1; + } + break; + case 3 : args->calc_hwe_prob = 0; break; + case 4 : error("The option -S, --target-sample has been deprecated\n"); break; + case 5 : args->dry_run = 1; break; + case 6 : + args->distinctive_sites = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',' ) error("Could not parse: --distinctive-sites %s\n", optarg); + tmp++; + free(args->es_max_mem); + args->es_max_mem = strdup(tmp); + while ( *tmp && *tmp!=',' ) tmp++; + if ( *tmp ) { *tmp = 0; args->es_tmp_prefix = tmp+1; } + } + args->use_PLs = 0; + break; + case 'c': + error("The -c option is to be implemented, please open an issue on github\n"); + args->min_inter_err = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',') error("Could not parse: -c %s\n", optarg); + args->max_intra_err = strtod(tmp+1,&tmp); + if ( *tmp ) error("Could not parse: -c %s\n", optarg); + } + break; + case 'G': error("The option -G, --GTs-only has been deprecated\n"); break; + case 'a': args->all_sites = 1; error("The -a option is to be implemented, please open an issue on github\n"); break; + case 'H': args->hom_only = 1; break; + case 'g': args->gt_fname = optarg; break; +// case 'p': args->plot = optarg; break; + case 's': + if ( !strncasecmp("gt:",optarg,3) ) args->gt_samples = optarg+3; + else if ( !strncasecmp("qry:",optarg,4) ) args->qry_samples = optarg+4; + else error("Which one? Query samples (qry:%s) or genotype samples (gt:%s)?\n",optarg,optarg); + break; + case 'S': + if ( !strncasecmp("gt:",optarg,3) ) args->gt_samples = optarg+3, args->gt_samples_is_file = 1; + else if ( !strncasecmp("qry:",optarg,4) ) args->qry_samples = optarg+4, args->qry_samples_is_file = 1; + else error("Which one? Query samples (qry:%s) or genotype samples (gt:%s)?\n",optarg,optarg); + break; + case 'p': args->pair_samples = optarg; break; + case 'P': args->pair_samples = optarg; args->pair_samples_is_file = 1; break; + case 'r': args->regions = optarg; break; + case 'R': args->regions = optarg; args->regions_is_file = 1; break; + case 't': args->targets = optarg; break; + case 'T': args->targets = optarg; args->targets_is_file = 1; break; + case 7 : + args->regions_overlap = parse_overlap_option(optarg); + if ( args->regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 8 : + args->targets_overlap = parse_overlap_option(optarg); + if ( args->targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( optind==argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args->qry_fname = "-"; // reading from stdin + else usage(); // no files given + } + else args->qry_fname = argv[optind]; + if ( argc>optind+1 ) error("Error: too many files given, run with -h for help\n"); // too many files given + if ( args->pair_samples ) + { + if ( args->gt_samples || args->qry_samples ) error("The -p/-P option cannot be combined with -s/-S\n"); + if ( args->ntop ) error("The --n-matches option cannot be combined with -p/-P\n"); + } + if ( args->distinctive_sites && !args->pair_samples ) error("The experimental option --distinctive-sites requires -p/-P\n"); + if ( args->hom_only && !args->gt_fname ) error("The option --homs-only requires --genotypes\n"); + if ( args->distinctive_sites && args->use_PLs ) error("The option --distinctive-sites cannot be combined with --error-probability\n"); + + init_data(args); + + int ret; + while ( (ret=bcf_sr_next_line(args->files)) ) + { + if ( !is_input_okay(args,ret) ) continue; + + // time one record to give the user an estimate with very big files + struct timeval t0, t1; + if ( !args->ncmp ) gettimeofday(&t0, NULL); + + process_line(args); + + if ( args->ncmp==1 ) + { + gettimeofday(&t1, NULL); + double delta = (t1.tv_sec - t0.tv_sec) * 1e6 + (t1.tv_usec - t0.tv_usec); + fprintf(stderr,"INFO:\tTime required to process one record .. %f seconds\n",delta/1e6); + fprintf(args->fp,"INFO\tTime required to process one record .. %f seconds\n",delta/1e6); + if ( args->dry_run ) break; + } + } + if ( !args->dry_run ) + { + report(args); + if ( args->distinctive_sites ) report_distinctive_sites(args); + } + + destroy_data(args); + free(args); + return 0; +} + diff --git a/bcftools/vcfgtcheck.c.pysam.c b/bcftools/vcfgtcheck.c.pysam.c new file mode 100644 index 0000000..e0a70ba --- /dev/null +++ b/bcftools/vcfgtcheck.c.pysam.c @@ -0,0 +1,1279 @@ +#include "bcftools.pysam.h" + +/* vcfgtcheck.c -- Check sample identity. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "extsort.h" +//#include "hclust.h" + +typedef struct +{ + int iqry, igt; +} +pair_t; + +typedef struct +{ + bcf_srs_t *files; // first reader is the query VCF - single sample normally or multi-sample for cross-check + bcf_hdr_t *gt_hdr, *qry_hdr; // VCF with genotypes to compare against and the query VCF + char *cwd, **argv, *gt_samples, *qry_samples, *regions, *targets, *qry_fname, *gt_fname, *pair_samples; + int argc, gt_samples_is_file, qry_samples_is_file, regions_is_file, targets_is_file, pair_samples_is_file; + int regions_overlap, targets_overlap; + int qry_use_GT,gt_use_GT, nqry_smpl,ngt_smpl, *qry_smpl,*gt_smpl; + double *pdiff, *qry_prob, *gt_prob; + uint32_t *ndiff,*ncnt,ncmp, npairs; + int32_t *qry_arr,*gt_arr, nqry_arr,ngt_arr; + uint8_t *qry_dsg, *gt_dsg; + pair_t *pairs; + double *hwe_prob, dsg2prob[8][3], pl2prob[256]; + double min_inter_err, max_intra_err; + int all_sites, hom_only, ntop, cross_check, calc_hwe_prob, sort_by_hwe, dry_run, use_PLs; + FILE *fp; + unsigned int nskip_no_match, nskip_not_ba, nskip_mono, nskip_no_data, nskip_dip_GT, nskip_dip_PL; + + // for --distinctive-sites + double distinctive_sites; + kbitset_t *kbs_diff; + size_t diff_sites_size; + extsort_t *es; + char *es_tmp_prefix, *es_max_mem; +} +args_t; + +static void set_cwd(args_t *args) +{ + int i; + char *buf; + size_t nbuf = 500; + args->cwd = (char*) malloc(sizeof(char)*nbuf); + for (i=0; i<5; i++) + { + if ( (buf = getcwd(args->cwd, nbuf)) ) break; + nbuf *= 2; + args->cwd = (char*) realloc(args->cwd, sizeof(char)*nbuf); + } + assert(buf); +} +static void print_header(args_t *args, FILE *fp) +{ + fprintf(fp, "# This file was produced by bcftools (%s+htslib-%s), the command line was:\n", bcftools_version(), hts_version()); + fprintf(fp, "# \t bcftools %s ", args->argv[0]); + int i; + for (i=1; iargc; i++) + fprintf(fp, " %s",args->argv[i]); + fprintf(fp, "\n# and the working directory was:\n"); + fprintf(fp, "# \t %s\n#\n", args->cwd); +} + +static int cmp_int(const void *_a, const void *_b) +{ + int a = *((int*)_a); + int b = *((int*)_b); + if ( a < b ) return -1; + if ( a > b ) return 1; + return 0; +} +static int cmp_pair(const void *_a, const void *_b) +{ + pair_t *a = (pair_t*)_a; + pair_t *b = (pair_t*)_b; + if ( a->iqry < b->iqry ) return -1; + if ( a->iqry > b->iqry ) return 1; + if ( a->igt < b->igt ) return -1; + if ( a->igt > b->igt ) return 1; + return 0; +} + +typedef struct +{ + uint32_t ndiff,rid,pos,rand; // rand is to shuffle sites with the same ndiff from across all chromosoms + unsigned long kbs_dat[1]; +} +diff_sites_t; +#if DBG +static void diff_sites_debug_print(args_t *args, diff_sites_t *ds) +{ + int i; + memcpy(args->kbs_diff->b,ds->kbs_dat,args->kbs_diff->n*sizeof(unsigned long)); + fprintf(bcftools_stderr,"%s:%d\t%d\t",bcf_hdr_id2name(args->qry_hdr,ds->rid),ds->pos+1,ds->ndiff); + for (i=0; inpairs; i++) fprintf(bcftools_stderr,"%d",kbs_exists(args->kbs_diff,i)?1:0); + fprintf(bcftools_stderr,"\n"); +} +#endif +static int diff_sites_cmp(const void *aptr, const void *bptr) +{ + diff_sites_t *a = *((diff_sites_t**)aptr); + diff_sites_t *b = *((diff_sites_t**)bptr); + if ( a->ndiff < b->ndiff ) return 1; // descending order + if ( a->ndiff > b->ndiff ) return -1; + if ( a->rand < b->rand ) return -1; + if ( a->rand > b->rand ) return 1; + return 0; +} +static void diff_sites_init(args_t *args) +{ + int nsites = args->distinctive_sites<=1 ? args->npairs*args->distinctive_sites : args->distinctive_sites; + if ( nsites<=0 ) error("The value for --distinctive-sites was set too low: %d\n",nsites); + if ( nsites > args->npairs ) + { + fprintf(bcftools_stderr,"Warning: The value for --distinctive-sites is bigger than is the number of pairs, all discordant sites be printed.\n"); + nsites = args->npairs; + args->distinctive_sites = args->npairs + 1; + } + else + args->distinctive_sites = nsites; + args->kbs_diff = kbs_init(args->npairs); + size_t n = (args->npairs + KBS_ELTBITS-1) / KBS_ELTBITS; + assert( n==args->kbs_diff->n ); + args->diff_sites_size = sizeof(diff_sites_t) + (n-1)*sizeof(unsigned long); + args->es = extsort_alloc(); + extsort_set_opt(args->es,size_t,DAT_SIZE,args->diff_sites_size); + extsort_set_opt(args->es,const char*,TMP_PREFIX,args->es_tmp_prefix); + extsort_set_opt(args->es,const char*,MAX_MEM,args->es_max_mem); + extsort_set_opt(args->es,extsort_cmp_f,FUNC_CMP,diff_sites_cmp); + extsort_init(args->es); +} +static void diff_sites_destroy(args_t *args) +{ + kbs_destroy(args->kbs_diff); + extsort_destroy(args->es); +} +static inline void diff_sites_reset(args_t *args) +{ + kbs_clear(args->kbs_diff); +} +static inline void diff_sites_push(args_t *args, int ndiff, int rid, int pos) +{ + diff_sites_t *dat = (diff_sites_t*) malloc(args->diff_sites_size); + memset(dat,0,sizeof(*dat)); // for debugging: prevent warnings about uninitialized memory coming from struct padding (not needed after rand added) + dat->ndiff = ndiff; + dat->rid = rid; + dat->pos = pos; + dat->rand = hts_lrand48(); + memcpy(dat->kbs_dat,args->kbs_diff->b,args->kbs_diff->n*sizeof(unsigned long)); + extsort_push(args->es,dat); +} +static inline int diff_sites_shift(args_t *args, int *ndiff, int *rid, int *pos) +{ + diff_sites_t *dat = (diff_sites_t*) extsort_shift(args->es); + if ( !dat ) return 0; + *ndiff = dat->ndiff; + *rid = dat->rid; + *pos = dat->pos; + memcpy(args->kbs_diff->b,dat->kbs_dat,args->kbs_diff->n*sizeof(unsigned long)); + return 1; +} + +static void init_samples(char *list, int list_is_file, int **smpl, int *nsmpl, bcf_hdr_t *hdr, char *vcf_fname) +{ + int i; + if ( !strcmp(list,"-") ) + { + *nsmpl = bcf_hdr_nsamples(hdr); + *smpl = (int*) malloc(sizeof(**smpl)*(*nsmpl)); + for (i=0; i<*nsmpl; i++) (*smpl)[i] = i; + return; + } + + char **tmp = hts_readlist(list, list_is_file, nsmpl); + if ( !tmp || !*nsmpl ) error("Failed to parse %s\n", list); + *smpl = (int*) malloc(sizeof(**smpl)*(*nsmpl)); + for (i=0; i<*nsmpl; i++) + { + int idx = bcf_hdr_id2int(hdr, BCF_DT_SAMPLE, tmp[i]); + if ( idx<0 ) error("No such sample in %s: [%s]\n",vcf_fname,tmp[i]); + (*smpl)[i] = idx; + free(tmp[i]); + } + free(tmp); + qsort(*smpl,*nsmpl,sizeof(**smpl),cmp_int); + // check for duplicates + for (i=1; i<*nsmpl; i++) + if ( (*smpl)[i-1]==(*smpl)[i] ) + error("Error: the sample \"%s\" is listed twice in %s\n", hdr->samples[(*smpl)[i]],list); +} + +static void init_data(args_t *args) +{ + hts_srand48(0); + + args->files = bcf_sr_init(); + if ( args->regions ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions, args->regions_is_file)<0 ) error("Failed to read the regions: %s\n", args->regions); + } + if ( args->targets ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,args->targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets, args->targets_is_file, 0)<0 ) error("Failed to read the targets: %s\n", args->targets); + } + + if ( args->gt_fname ) bcf_sr_set_opt(args->files, BCF_SR_REQUIRE_IDX); + if ( !bcf_sr_add_reader(args->files,args->qry_fname) ) error("Failed to open %s: %s\n", args->qry_fname,bcf_sr_strerror(args->files->errnum)); + if ( args->gt_fname && !bcf_sr_add_reader(args->files, args->gt_fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",args->gt_fname)?"standard input":args->gt_fname,bcf_sr_strerror(args->files->errnum)); + + args->qry_hdr = bcf_sr_get_header(args->files,0); + if ( !bcf_hdr_nsamples(args->qry_hdr) ) error("No samples in %s?\n", args->qry_fname); + if ( args->gt_fname ) + { + args->gt_hdr = bcf_sr_get_header(args->files,1); + if ( !bcf_hdr_nsamples(args->gt_hdr) ) error("No samples in %s?\n", args->gt_fname); + } + + // Determine whether GT or PL will be used + if ( args->qry_use_GT==-1 ) // not set by -u, qry uses PL by default + { + if ( bcf_hdr_id2int(args->qry_hdr,BCF_DT_ID,"PL")>=0 ) + args->qry_use_GT = 0; + else if ( bcf_hdr_id2int(args->qry_hdr,BCF_DT_ID,"GT")>=0 ) + args->qry_use_GT = 1; + else + error("[E::%s] Neither PL nor GT tag is present in the header of %s\n", __func__, args->qry_fname); + } + else if ( args->qry_use_GT==1 ) + { + if ( bcf_hdr_id2int(args->qry_hdr,BCF_DT_ID,"GT")<0 ) + error("[E::%s] The GT tag is not present in the header of %s\n", __func__, args->qry_fname); + } + else if ( bcf_hdr_id2int(args->qry_hdr,BCF_DT_ID,"PL")<0 ) + error("[E::%s] The PL tag is not present in the header of %s\n", __func__, args->qry_fname); + + if ( args->gt_hdr ) + { + if ( args->gt_use_GT==-1 ) // not set by -u, gt uses GT by default + { + if ( bcf_hdr_id2int(args->gt_hdr,BCF_DT_ID,"GT")>=0 ) + args->gt_use_GT = 1; + else if ( bcf_hdr_id2int(args->gt_hdr,BCF_DT_ID,"PL")>=0 ) + args->gt_use_GT = 0; + else + error("[E::%s] Neither PL nor GT tag is present in the header of %s\n", __func__, args->gt_fname); + } + else if ( args->gt_use_GT==1 ) + { + if ( bcf_hdr_id2int(args->gt_hdr,BCF_DT_ID,"GT")<0 ) + error("[E::%s] The GT tag is not present in the header of %s\n", __func__, args->gt_fname); + } + else if ( bcf_hdr_id2int(args->gt_hdr,BCF_DT_ID,"PL")<0 ) + error("[E::%s] The PL tag is not present in the header of %s\n", __func__, args->gt_fname); + } + else + args->gt_use_GT = args->qry_use_GT; + + // Prepare samples + int i,j; + args->nqry_smpl = bcf_hdr_nsamples(args->qry_hdr); + if ( args->qry_samples ) + { + init_samples(args->qry_samples, args->qry_samples_is_file, &args->qry_smpl, &args->nqry_smpl, args->qry_hdr, args->qry_fname); + } + if ( args->gt_samples ) + { + init_samples(args->gt_samples, args->gt_samples_is_file, &args->gt_smpl, &args->ngt_smpl, + args->gt_hdr ? args->gt_hdr : args->qry_hdr, + args->gt_fname ? args->gt_fname : args->qry_fname); + } + else if ( args->pair_samples ) + { + int npairs; + char **tmp = hts_readlist(args->pair_samples, args->pair_samples_is_file, &npairs); + if ( !tmp || !npairs ) error("Failed to parse %s\n", args->pair_samples); + if ( !args->pair_samples_is_file && npairs%2 ) error("Expected even number of comma-delimited samples with -p\n"); + args->npairs = args->pair_samples_is_file ? npairs : npairs/2; + args->pairs = (pair_t*) calloc(args->npairs,sizeof(*args->pairs)); + if ( !args->pair_samples_is_file ) + { + for (i=0; inpairs; i++) + { + args->pairs[i].iqry = bcf_hdr_id2int(args->qry_hdr, BCF_DT_SAMPLE, tmp[2*i]); + args->pairs[i].igt = bcf_hdr_id2int(args->gt_hdr?args->gt_hdr:args->qry_hdr, BCF_DT_SAMPLE, tmp[2*i+1]); + if ( args->pairs[i].iqry < 0 ) error("No such sample in %s: [%s]\n",args->qry_fname,tmp[2*i]); + if ( args->pairs[i].igt < 0 ) error("No such sample in %s: [%s]\n",args->gt_fname?args->gt_fname:args->qry_fname,tmp[2*i+1]); + free(tmp[2*i]); + free(tmp[2*i+1]); + } + } + else + { + for (i=0; inpairs; i++) + { + char *ptr = tmp[i]; + while ( *ptr && !isspace(*ptr) ) ptr++; + if ( !*ptr ) error("Could not parse %s: %s\n",args->pair_samples,tmp[i]); + *ptr = 0; + args->pairs[i].iqry = bcf_hdr_id2int(args->qry_hdr, BCF_DT_SAMPLE, tmp[i]); + if ( args->pairs[i].iqry < 0 ) error("No such sample in %s: [%s]\n",args->qry_fname,tmp[i]); + ptr++; + while ( *ptr && isspace(*ptr) ) ptr++; + args->pairs[i].igt = bcf_hdr_id2int(args->gt_hdr?args->gt_hdr:args->qry_hdr, BCF_DT_SAMPLE, ptr); + if ( args->pairs[i].igt < 0 ) error("No such sample in %s: [%s]\n",args->gt_fname?args->gt_fname:args->qry_fname,ptr); + free(tmp[i]); + } + } + free(tmp); + qsort(args->pairs,args->npairs,sizeof(*args->pairs),cmp_pair); + } + else if ( args->gt_hdr ) + args->ngt_smpl = bcf_hdr_nsamples(args->gt_hdr); + if ( !args->ngt_smpl ) + { + args->ngt_smpl = args->nqry_smpl; + args->gt_smpl = args->qry_smpl; + args->cross_check = 1; + } + + // The data arrays + if ( !args->npairs ) args->npairs = args->cross_check ? args->nqry_smpl*(args->nqry_smpl+1)/2 : args->ngt_smpl*args->nqry_smpl; + if ( !args->pair_samples ) + { + args->qry_dsg = (uint8_t*) malloc(args->nqry_smpl); + args->gt_dsg = args->cross_check ? args->qry_dsg : (uint8_t*) malloc(args->ngt_smpl); + } + if ( args->use_PLs ) + { + args->pdiff = (double*) calloc(args->npairs,sizeof(*args->pdiff)); // log probability of pair samples being the same + args->qry_prob = (double*) malloc(3*args->nqry_smpl*sizeof(*args->qry_prob)); + args->gt_prob = args->cross_check ? args->qry_prob : (double*) malloc(3*args->ngt_smpl*sizeof(*args->gt_prob)); + + // dsg2prob: the first index is bitmask of 8 possible dsg combinations (only 1<<0,1<<2,1<<3 are set, accessing + // anything else indicated an error, this is just to reuse gt_to_dsg()); the second index are the corresponding + // probabilities of 0/0, 0/1, and 1/1 genotypes + for (i=0; i<8; i++) + for (j=0; j<3; j++) + args->dsg2prob[i][j] = HUGE_VAL; + args->dsg2prob[1][0] = -log(1-pow(10,-0.1*args->use_PLs)); + args->dsg2prob[1][1] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[1][2] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[2][0] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[2][1] = -log(1-pow(10,-0.1*args->use_PLs)); + args->dsg2prob[2][2] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[4][0] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[4][1] = -log(0.5*pow(10,-0.1*args->use_PLs)); + args->dsg2prob[4][2] = -log(1-pow(10,-0.1*args->use_PLs)); + + // lookup table to avoid exponentiation + for (i=0; i<256; i++) args->pl2prob[i] = pow(10,-0.1*i); + } + else + args->ndiff = (uint32_t*) calloc(args->npairs,sizeof(*args->ndiff)); // number of differing genotypes for each pair of samples + args->ncnt = (uint32_t*) calloc(args->npairs,sizeof(*args->ncnt)); // number of comparisons performed (non-missing data) + if ( !args->ncnt ) error("Error: failed to allocate %.1f Mb\n", args->npairs*sizeof(*args->ncnt)/1e6); + if ( args->calc_hwe_prob ) + { + // prob of the observed sequence of matches given site AFs and HWE + args->hwe_prob = (double*) calloc(args->npairs,sizeof(*args->hwe_prob)); + if ( !args->hwe_prob ) error("Error: failed to allocate %.1f Mb. Run with --no-HWE-prob to save some memory.\n", args->npairs*sizeof(*args->hwe_prob)/1e6); + } + + if ( args->distinctive_sites ) diff_sites_init(args); + + args->fp = bcftools_stdout; + print_header(args, args->fp); +} + +static void destroy_data(args_t *args) +{ + if ( args->gt_dsg!=args->qry_dsg ) free(args->gt_dsg); + free(args->qry_dsg); + if ( args->gt_prob!=args->qry_prob ) free(args->gt_prob); + free(args->qry_prob); + free(args->es_max_mem); + fclose(args->fp); + if ( args->distinctive_sites ) diff_sites_destroy(args); + free(args->hwe_prob); + free(args->cwd); + free(args->qry_arr); + if ( args->gt_hdr ) free(args->gt_arr); + free(args->pdiff); + free(args->ndiff); + free(args->ncnt); + free(args->qry_smpl); + if ( args->gt_smpl!=args->qry_smpl ) free(args->gt_smpl); + free(args->pairs); + bcf_sr_destroy(args->files); +} + +static inline uint8_t gt_to_dsg(int32_t *ptr) +{ + if ( bcf_gt_is_missing(ptr[0]) || bcf_gt_is_missing(ptr[1]) || ptr[1]==bcf_int32_vector_end ) return 0; + uint8_t dsg = (bcf_gt_allele(ptr[0])?1:0) + (bcf_gt_allele(ptr[1])?1:0); + return 1<dsg2prob[dsg][0]; + prob[1] = args->dsg2prob[dsg][1]; + prob[2] = args->dsg2prob[dsg][2]; + } + return dsg; +} +static inline uint8_t pl_to_prob(args_t *args, int32_t *ptr, double *prob) +{ + uint8_t dsg = pl_to_dsg(ptr); + if ( dsg ) + { + prob[0] = (ptr[0]>=0 && ptr[0]<255) ? args->pl2prob[ptr[0]] : args->pl2prob[255]; + prob[1] = (ptr[1]>=0 && ptr[1]<255) ? args->pl2prob[ptr[1]] : args->pl2prob[255]; + prob[2] = (ptr[2]>=0 && ptr[2]<255) ? args->pl2prob[ptr[2]] : args->pl2prob[255]; + double sum = prob[0] + prob[1] + prob[2]; + prob[0] /= sum; + prob[1] /= sum; + prob[2] /= sum; + prob[0] = -log(prob[0]); + prob[1] = -log(prob[1]); + prob[2] = -log(prob[2]); + } + return dsg; +} +static int set_data(args_t *args, bcf_hdr_t *hdr, bcf1_t *rec, int32_t **arr, int32_t *narr, int *narr1, int *use_GT) +{ + static int warn_dip_GT = 1; + static int warn_dip_PL = 1; + int i; + for (i=0; i<2; i++) + { + if ( *use_GT ) + { + int ret = bcf_get_genotypes(hdr,rec,arr,narr); + if ( ret < 0 ) + { + if ( !i ) { *use_GT = 0; continue; } + args->nskip_no_data++; + return -1; + } + if ( ret != 2*bcf_hdr_nsamples(hdr) ) + { + if ( warn_dip_GT ) + { + fprintf(bcftools_stderr,"INFO: skipping %s:%"PRIhts_pos", only diploid FORMAT/GT fields supported. (This is printed only once.)\n", bcf_seqname(hdr,rec),rec->pos+1); + warn_dip_GT = 0; + } + args->nskip_dip_GT++; + return -1; + } + *narr1 = 2; + return 0; + } + + int ret = bcf_get_format_int32(hdr,rec,"PL",arr,narr); + if ( ret < 0 ) + { + if ( !i ) { *use_GT = 1; continue; } + args->nskip_no_data++; + return -1; + } + if ( ret != 3*bcf_hdr_nsamples(hdr) ) + { + if ( warn_dip_PL ) + { + fprintf(bcftools_stderr,"INFO: skipping %s:%"PRIhts_pos", only diploid FORMAT/PL fields supported. (This is printed only once.)\n", bcf_seqname(hdr,rec),rec->pos+1); + warn_dip_PL = 0; + } + args->nskip_dip_PL++; + return -1; + } + *narr1 = 3; + return 0; + } + return -1; // should never reach +} +static void process_line(args_t *args) +{ + int i,j,k, nqry1, ngt1, ret; + + bcf1_t *gt_rec = NULL, *qry_rec = bcf_sr_get_line(args->files,0); // the query file + int qry_use_GT = args->qry_use_GT; + int gt_use_GT = args->gt_use_GT; + + ret = set_data(args, args->qry_hdr, qry_rec, &args->qry_arr, &args->nqry_arr, &nqry1, &qry_use_GT); + if ( ret<0 ) return; + + if ( args->gt_hdr ) + { + gt_rec = bcf_sr_get_line(args->files,1); + ret = set_data(args, args->gt_hdr, gt_rec, &args->gt_arr, &args->ngt_arr, &ngt1, >_use_GT); + if ( ret<0 ) return; + } + else + { + ngt1 = nqry1; + args->gt_arr = args->qry_arr; + } + + args->ncmp++; + + double af,hwe_dsg[8]; + if ( args->calc_hwe_prob ) + { + int ac[2]; + if ( args->gt_hdr ) + { + if ( bcf_calc_ac(args->gt_hdr, gt_rec, ac, BCF_UN_INFO|BCF_UN_FMT)!=1 ) error("todo: bcf_calc_ac() failed\n"); + } + else if ( bcf_calc_ac(args->qry_hdr, qry_rec, ac, BCF_UN_INFO|BCF_UN_FMT)!=1 ) error("todo: bcf_calc_ac() failed\n"); + + // hwe indexes correspond to the bitmask of eight dsg combinations to account for PL uncertainty + // for in the extreme case we can have uninformative PL=0,0,0. So the values are the minima of e.g. + // hwe[1,2,4] .. dsg=0,1,2 + // hwe[3] .. dsg=0 or 1 + // hwe[6] .. dsg=1 or 2 + + double hwe[3]; + const double min_af = 1e-5; // cap the AF in case we get unrealistic values + af = (double)ac[1]/(ac[0]+ac[1]); + hwe[0] = af>min_af ? -log(af*af) : -log(min_af*min_af); + hwe[1] = af>min_af && af<1-min_af ? -log(2*af*(1-af)) : -log(2*min_af*(1-min_af)); + hwe[2] = af<(1-min_af) ? -log((1-af)*(1-af)) : -log(min_af*min_af); + hwe_dsg[0] = 0; + for (i=1; i<8; i++) + { + hwe_dsg[i] = HUGE_VAL; + for (k=0; k<3; k++) + { + if ( ((1< hwe[k] ) hwe_dsg[i] = hwe[k]; + } + } + } + + // The sample pairs were given explicitly via -p/-P options + if ( args->pairs ) + { + if ( !args->use_PLs ) + { + int ndiff = 0; + if ( args->kbs_diff ) diff_sites_reset(args); + + for (i=0; inpairs; i++) + { + int32_t *ptr; + uint8_t qry_dsg, gt_dsg; + + ptr = args->gt_arr + args->pairs[i].igt*ngt1; + gt_dsg = gt_use_GT ? gt_to_dsg(ptr) : pl_to_dsg(ptr); + if ( !gt_dsg ) continue; // missing value + if ( args->hom_only && !(gt_dsg&5) ) continue; // not a hom + + ptr = args->qry_arr + args->pairs[i].iqry*nqry1; + qry_dsg = qry_use_GT ? gt_to_dsg(ptr) : pl_to_dsg(ptr); + if ( !qry_dsg ) continue; // missing value + + int match = qry_dsg & gt_dsg; + if ( !match ) + { + args->ndiff[i]++; + if ( args->kbs_diff ) { ndiff++; kbs_insert(args->kbs_diff, i); } + } + else if ( args->calc_hwe_prob ) args->hwe_prob[i] += hwe_dsg[match]; + args->ncnt[i]++; + } + + if ( ndiff ) diff_sites_push(args, ndiff, qry_rec->rid, qry_rec->pos); + } + else // use_PLs set + { + for (i=0; inpairs; i++) + { + int32_t *ptr; + double qry_prob[3], gt_prob[3]; + uint8_t qry_dsg, gt_dsg; + + ptr = args->gt_arr + args->pairs[i].igt*ngt1; + gt_dsg = gt_use_GT ? gt_to_prob(args,ptr,gt_prob) : pl_to_prob(args,ptr,gt_prob); + if ( !gt_dsg ) continue; // missing value + if ( args->hom_only && !(gt_dsg&5) ) continue; // not a hom + + ptr = args->qry_arr + args->pairs[i].iqry*nqry1; + qry_dsg = qry_use_GT ? gt_to_prob(args,ptr,qry_prob) : pl_to_prob(args,ptr,qry_prob); + if ( !qry_dsg ) continue; // missing value + + double min = qry_prob[0] + gt_prob[0]; + qry_prob[1] += gt_prob[1]; + if ( min > qry_prob[1] ) min = qry_prob[1]; + qry_prob[2] += gt_prob[2]; + if ( min > qry_prob[2] ) min = qry_prob[2]; + args->pdiff[i] += min; + + if ( args->calc_hwe_prob ) + { + int match = qry_dsg & gt_dsg; + args->hwe_prob[i] += hwe_dsg[match]; + } + args->ncnt[i]++; + } + } + return; + } + + int idx=0; + if ( !args->use_PLs ) + { + for (i=0; inqry_smpl; i++) + { + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + int32_t *ptr = args->qry_arr + nqry1*iqry; + args->qry_dsg[i] = qry_use_GT ? gt_to_dsg(ptr) : pl_to_dsg(ptr); + } + if ( !args->cross_check ) // in this case gt_dsg points to qry_dsg + { + for (i=0; ingt_smpl; i++) + { + int igt = args->gt_smpl ? args->gt_smpl[i] : i; + int32_t *ptr = args->gt_arr + ngt1*igt; + args->gt_dsg[i] = gt_use_GT ? gt_to_dsg(ptr) : pl_to_dsg(ptr); + if ( args->hom_only && !(args->gt_dsg[i]&5) ) args->gt_dsg[i] = 0; // not a hom, set to a missing value + } + } + for (i=0; inqry_smpl; i++) + { + int ngt = args->cross_check ? i : args->ngt_smpl; // two files or a sub-diagonal cross-check mode? + if ( !args->qry_dsg[i] ) { idx += ngt; continue; } // missing value + for (j=0; jgt_dsg[j] ) { idx++; continue; } // missing value + int match = args->qry_dsg[i] & args->gt_dsg[j]; + if ( !match ) args->ndiff[idx]++; + else if ( args->calc_hwe_prob ) args->hwe_prob[idx] += hwe_dsg[match]; + args->ncnt[idx]++; + idx++; + } + } + } + else // use_PLs set + { + for (i=0; inqry_smpl; i++) + { + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + int32_t *ptr = args->qry_arr + nqry1*iqry; + args->qry_dsg[i] = qry_use_GT ? gt_to_prob(args,ptr,args->qry_prob+i*3) : pl_to_prob(args,ptr,args->qry_prob+i*3); + } + if ( !args->cross_check ) // in this case gt_dsg points to qry_dsg + { + for (i=0; ingt_smpl; i++) + { + int igt = args->gt_smpl ? args->gt_smpl[i] : i; + int32_t *ptr = args->gt_arr + ngt1*igt; + args->gt_dsg[i] = gt_use_GT ? gt_to_prob(args,ptr,args->gt_prob+i*3) : pl_to_prob(args,ptr,args->gt_prob+i*3); + if ( args->hom_only && !(args->gt_dsg[i]&5) ) args->gt_dsg[i] = 0; // not a hom, set to a missing value + } + } + for (i=0; inqry_smpl; i++) + { + int ngt = args->cross_check ? i : args->ngt_smpl; // two files or a sub-diagonal cross-check mode? + if ( !args->qry_dsg[i] ) { idx += ngt; continue; } // missing value + for (j=0; jgt_dsg[j] ) { idx++; continue; } // missing value + + double min = args->qry_prob[i*3] + args->gt_prob[j*3]; + if ( min > args->qry_prob[i*3+1] + args->gt_prob[j*3+1] ) min = args->qry_prob[i*3+1] + args->gt_prob[j*3+1]; + if ( min > args->qry_prob[i*3+2] + args->gt_prob[j*3+2] ) min = args->qry_prob[i*3+2] + args->gt_prob[j*3+2]; + args->pdiff[idx] += min; + + if ( args->calc_hwe_prob ) + { + int match = args->qry_dsg[i] & args->gt_dsg[j]; + args->hwe_prob[idx] += hwe_dsg[match]; + } + args->ncnt[idx]++; + idx++; + } + } + } +} + + +typedef struct +{ + int ism, idx; + double val; +} +idbl_t; +static int cmp_idbl(const void *_a, const void *_b) +{ + idbl_t *a = (idbl_t*)_a; + idbl_t *b = (idbl_t*)_b; + if ( a->val < b->val ) return -1; + if ( a->val > b->val ) return 1; + return 0; +} +static void report_distinctive_sites(args_t *args) +{ + extsort_sort(args->es); + + fprintf(args->fp,"# DS, distinctive sites:\n"); + fprintf(args->fp,"# - chromosome\n"); + fprintf(args->fp,"# - position\n"); + fprintf(args->fp,"# - cumulative number of pairs distinguished by this block\n"); + fprintf(args->fp,"# - block id\n"); + fprintf(args->fp,"#DS\t[2]Chromosome\t[3]Position\t[4]Cumulative number of distinct pairs\t[5]Block id\n"); + + kbitset_t *kbs_blk = kbs_init(args->npairs); + kbitset_iter_t itr; + int i,ndiff,rid,pos,ndiff_tot = 0, iblock = 0; + int ndiff_min = args->distinctive_sites <= args->npairs ? args->distinctive_sites : args->npairs; + while ( diff_sites_shift(args,&ndiff,&rid,&pos) ) + { + int ndiff_new = 0, ndiff_dbg = 0; + kbs_start(&itr); + while ( (i=kbs_next(args->kbs_diff, &itr))>=0 ) + { + ndiff_dbg++; + if ( kbs_exists(kbs_blk,i) ) continue; // already set + kbs_insert(kbs_blk,i); + ndiff_new++; + } + if ( ndiff_dbg!=ndiff ) error("Corrupted data, fixme: %d vs %d\n",ndiff_dbg,ndiff); + if ( !ndiff_new ) continue; // no new pair distinguished by this site + ndiff_tot += ndiff_new; + fprintf(args->fp,"DS\t%s\t%d\t%d\t%d\n",bcf_hdr_id2name(args->qry_hdr,rid),pos+1,ndiff_tot,iblock); + if ( ndiff_tot < ndiff_min ) continue; // fewer than the requested number of pairs can be distinguished at this point + iblock++; + ndiff_tot = 0; + kbs_clear(kbs_blk); + } + kbs_destroy(kbs_blk); +} +static void report(args_t *args) +{ + fprintf(args->fp,"INFO\tsites-compared\t%u\n",args->ncmp); + fprintf(args->fp,"INFO\tsites-skipped-no-match\t%u\n",args->nskip_no_match); + fprintf(args->fp,"INFO\tsites-skipped-multiallelic\t%u\n",args->nskip_not_ba); + fprintf(args->fp,"INFO\tsites-skipped-monoallelic\t%u\n",args->nskip_mono); + fprintf(args->fp,"INFO\tsites-skipped-no-data\t%u\n",args->nskip_no_data); + fprintf(args->fp,"INFO\tsites-skipped-GT-not-diploid\t%u\n",args->nskip_dip_GT); + fprintf(args->fp,"INFO\tsites-skipped-PL-not-diploid\t%u\n",args->nskip_dip_PL); + fprintf(args->fp,"# DC, discordance:\n"); + fprintf(args->fp,"# - query sample\n"); + fprintf(args->fp,"# - genotyped sample\n"); + fprintf(args->fp,"# - discordance (number of mismatches; smaller is better)\n"); + fprintf(args->fp,"# - negative log of HWE probability at matching sites (rare genotypes mataches are more informative, bigger is better)\n"); + fprintf(args->fp,"# - number of sites compared (bigger is better)\n"); + fprintf(args->fp,"#DC\t[2]Query Sample\t[3]Genotyped Sample\t[4]Discordance\t[5]-log P(HWE)\t[6]Number of sites compared\n"); + + int trim = args->ntop; + if ( !args->pairs ) + { + if ( !args->ngt_smpl && args->nqry_smpl <= args->ntop ) trim = 0; + if ( args->ngt_smpl && args->ngt_smpl <= args->ntop ) trim = 0; + } + + if ( args->pairs ) + { + int i; + for (i=0; inpairs; i++) + { + int iqry = args->pairs[i].iqry; + int igt = args->pairs[i].igt; + if ( args->ndiff ) + { + fprintf(args->fp,"DC\t%s\t%s\t%u\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->ndiff[i], + args->calc_hwe_prob ? args->hwe_prob[i] : 0, + args->ncnt[i]); + } + else + { + fprintf(args->fp,"DC\t%s\t%s\t%e\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->pdiff[i], + args->calc_hwe_prob ? args->hwe_prob[i] : 0, + args->ncnt[i]); + } + } + } + else if ( !trim ) + { + int i,j,idx=0; + for (i=0; inqry_smpl; i++) + { + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + int ngt = args->cross_check ? i : args->ngt_smpl; + for (j=0; jgt_smpl ? args->gt_smpl[j] : j; + if ( args->ndiff ) + { + fprintf(args->fp,"DC\t%s\t%s\t%u\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->ndiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + else + { + fprintf(args->fp,"DC\t%s\t%s\t%e\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->pdiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + idx++; + } + } + } + else if ( !args->cross_check ) + { + idbl_t *arr = (idbl_t*)malloc(sizeof(*arr)*args->ngt_smpl); + int i,j; + for (i=0; inqry_smpl; i++) + { + int idx = i*args->ngt_smpl; + for (j=0; jngt_smpl; j++) + { + if ( args->sort_by_hwe ) + arr[j].val = -args->hwe_prob[idx]; + else if ( args->ndiff ) + arr[j].val = args->ncnt[idx] ? (double)args->ndiff[idx]/args->ncnt[idx] : 0; + else + arr[j].val = args->ncnt[idx] ? args->pdiff[idx]/args->ncnt[idx] : 0; + arr[j].ism = j; + arr[j].idx = idx; + idx++; + } + qsort(arr, args->ngt_smpl, sizeof(*arr), cmp_idbl); + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + for (j=0; jntop; j++) + { + int idx = arr[j].idx; + int igt = args->gt_smpl ? args->gt_smpl[arr[j].ism] : arr[j].ism; + if ( args->ndiff ) + { + fprintf(args->fp,"DC\t%s\t%s\t%u\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->ndiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + else + { + fprintf(args->fp,"DC\t%s\t%s\t%e\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->gt_hdr?args->gt_hdr->samples[igt]:args->qry_hdr->samples[igt], + args->pdiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + } + } + free(arr); + } + else + { + int narr = args->nqry_smpl-1; + idbl_t *arr = (idbl_t*)malloc(sizeof(*arr)*narr); + int i,j,k,idx; + for (i=0; inqry_smpl; i++) + { + k = 0, idx = i*(i-1)/2; + for (j=0; jsort_by_hwe ) + arr[k].val = -args->hwe_prob[idx]; + else if ( args->ndiff ) + arr[k].val = args->ncnt[idx] ? (double)args->ndiff[idx]/args->ncnt[idx] : 0; + else + arr[k].val = args->ncnt[idx] ? args->pdiff[idx]/args->ncnt[idx] : 0; + arr[k].ism = j; + arr[k].idx = idx; + idx++; + k++; + } + for (; jsort_by_hwe ) + arr[k].val = -args->hwe_prob[idx]; + else if ( args->ndiff ) + arr[k].val = args->ncnt[idx] ? (double)args->ndiff[idx]/args->ncnt[idx] : 0; + else + arr[k].val = args->ncnt[idx] ? args->pdiff[idx]/args->ncnt[idx] : 0; + arr[k].ism = j + 1; + arr[k].idx = idx; + k++; + } + qsort(arr, narr, sizeof(*arr), cmp_idbl); + int iqry = args->qry_smpl ? args->qry_smpl[i] : i; + for (j=0; jntop; j++) + { + if ( i <= arr[j].ism ) continue; + int idx = arr[j].idx; + int igt = args->qry_smpl ? args->qry_smpl[arr[j].ism] : arr[j].ism; + if ( args->ndiff ) + { + fprintf(args->fp,"DC\t%s\t%s\t%u\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->qry_hdr->samples[igt], + args->ndiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + else + { + fprintf(args->fp,"DC\t%s\t%s\t%e\t%e\t%u\n", + args->qry_hdr->samples[iqry], + args->qry_hdr->samples[igt], + args->pdiff[idx], + args->calc_hwe_prob ? args->hwe_prob[idx] : 0, + args->ncnt[idx]); + } + } + } + free(arr); + } +} + +static int is_input_okay(args_t *args, int nmatch) +{ + int i; + const char *msg; + bcf_hdr_t *hdr; + bcf1_t *rec; + if ( args->gt_hdr && nmatch!=2 ) + { + if ( args->nskip_no_match++ ) return 0; + for (i=0; i<2; i++) + { + rec = bcf_sr_get_line(args->files,i); + if ( rec ) break; + } + hdr = bcf_sr_get_header(args->files,i); + fprintf(bcftools_stderr,"INFO: skipping %s:%"PRIhts_pos", no record with matching POS+ALT. (This is printed only once.)\n", + bcf_seqname(hdr,rec),rec->pos+1); + return 0; + } + for (i=0; i<2; i++) + { + hdr = bcf_sr_get_header(args->files,i); + rec = bcf_sr_get_line(args->files,i); + if ( rec->n_allele>2 ) + { + if ( args->nskip_not_ba++ ) return 0; + msg = "not a biallelic site, run `bcftools norm -m -` first"; + goto not_okay; + } + if ( bcf_get_variant_types(rec)==VCF_REF ) + { + if ( args->nskip_mono++ ) return 0; + msg = "monoallelic site"; + goto not_okay; + } + if ( !args->gt_hdr ) break; + } + return 1; + +not_okay: + fprintf(bcftools_stderr,"INFO: skipping %s:%"PRIhts_pos", %s. (This is printed only once.)\n", + bcf_seqname(hdr,rec),rec->pos+1,msg); + return 0; +} + +static void usage(void) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Check sample identity. With no -g BCF given, multi-sample cross-check is performed.\n"); + fprintf(bcftools_stderr, "Usage: bcftools gtcheck [options] [-g ] \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + //fprintf(bcftools_stderr, " -a, --all-sites Output comparison for all sites\n"); + //fprintf(bcftools_stderr, " -c, --cluster MIN,MAX Min inter- and max intra-sample error [0.23,-0.3]\n"); + fprintf(bcftools_stderr, " --distinctive-sites Find sites that can distinguish between at least NUM sample pairs.\n"); + fprintf(bcftools_stderr, " NUM[,MEM[,TMP]] If the number is smaller or equal to 1, it is interpreted as the fraction of pairs.\n"); + fprintf(bcftools_stderr, " The optional MEM string sets the maximum memory used for in-memory sorting [500M]\n"); +#ifdef _WIN32 + fprintf(bcftools_stderr, " and TMP is a prefix of temporary files used by external sorting [/bcftools.XXXXXX]\n"); +#else + fprintf(bcftools_stderr, " and TMP is a prefix of temporary files used by external sorting [/tmp/bcftools.XXXXXX]\n"); +#endif + fprintf(bcftools_stderr, " --dry-run Stop after first record to estimate required time\n"); + fprintf(bcftools_stderr, " -e, --error-probability INT Phred-scaled probability of genotyping error, 0 for faster but less accurate results [40]\n"); + fprintf(bcftools_stderr, " -g, --genotypes FILE Genotypes to compare against\n"); + fprintf(bcftools_stderr, " -H, --homs-only Homozygous genotypes only, useful with low coverage data (requires -g)\n"); + fprintf(bcftools_stderr, " --n-matches INT Print only top INT matches for each sample (sorted by average score), 0 for unlimited.\n"); + fprintf(bcftools_stderr, " Use negative value to sort by HWE probability rather than by discordance [0]\n"); + fprintf(bcftools_stderr, " --no-HWE-prob Disable calculation of HWE probability\n"); + fprintf(bcftools_stderr, " -p, --pairs LIST Comma-separated sample pairs to compare (qry,gt[,qry,gt..] with -g or qry,qry[,qry,qry..] w/o)\n"); + fprintf(bcftools_stderr, " -P, --pairs-file FILE File with tab-delimited sample pairs to compare (qry,gt with -g or qry,qry w/o)\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --samples [qry|gt]:LIST List of query or -g samples, \"-\" to select all samples (by default all samples are compared)\n"); + fprintf(bcftools_stderr, " -S, --samples-file [qry|gt]:FILE File with the query or -g samples to compare\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, " -u, --use TAG1[,TAG2] Which tag to use in the query file (TAG1) and the -g file (TAG2) [PL,GT]\n"); + fprintf(bcftools_stderr, "Examples:\n"); + fprintf(bcftools_stderr, " # Check discordance of all samples from B against all sample in A\n"); + fprintf(bcftools_stderr, " bcftools gtcheck -g A.bcf B.bcf\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # Limit comparisons to the fiven list of samples\n"); + fprintf(bcftools_stderr, " bcftools gtcheck -s gt:a1,a2,a3 -s qry:b1,b2 -g A.bcf B.bcf\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # Compare only two pairs a1,b1 and a1,b2\n"); + fprintf(bcftools_stderr, " bcftools gtcheck -p a1,b1,a1,b2 -g A.bcf B.bcf\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfgtcheck(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; set_cwd(args); + args->qry_use_GT = -1; + args->gt_use_GT = -1; + args->calc_hwe_prob = 1; + args->use_PLs = 40; + args->regions_overlap = 1; + args->targets_overlap = 0; + + // external sort for --distinctive-sites +#ifdef _WIN32 + args->es_tmp_prefix = NULL; +#else + args->es_tmp_prefix = "/tmp/bcftools-gtcheck"; +#endif + args->es_max_mem = strdup("500M"); + + // In simulated sample swaps the minimum error was 0.3 and maximum intra-sample error was 0.23 + // - min_inter: pairs with smaller err value will be considered identical + // - max_intra: pairs with err value bigger than abs(max_intra_err) will be considered + // different. If negative, the cutoff may be heuristically lowered + args->min_inter_err = 0.23; + args->max_intra_err = -0.3; + + static struct option loptions[] = + { + {"error-probability",1,0,'e'}, + {"use",1,0,'u'}, + {"cluster",1,0,'c'}, + {"GTs-only",1,0,'G'}, + {"all-sites",0,0,'a'}, + {"homs-only",0,0,'H'}, + {"help",0,0,'h'}, + {"genotypes",1,0,'g'}, + {"plot",1,0,'p'}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"n-matches",1,0,2}, + {"no-HWE-prob",0,0,3}, + {"target-sample",1,0,4}, + {"dry-run",0,0,5}, + {"distinctive-sites",1,0,6}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,7}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,8}, + {"pairs",1,0,'p'}, + {"pairs-file",1,0,'P'}, + {0,0,0,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "hg:p:s:S:p:P:Hr:R:at:T:G:c:u:e:",loptions,NULL)) >= 0) { + switch (c) { + case 'e': + args->use_PLs = strtol(optarg,&tmp,10); + if ( !tmp || *tmp ) error("Could not parse: --error-probability %s\n", optarg); + break; + case 'u': + { + int i,nlist; + char **list = hts_readlist(optarg, 0, &nlist); + if ( !list || nlist<=0 || nlist>2 ) error("Failed to parse --use %s\n", optarg); + if ( !strcasecmp("GT",list[0]) ) args->qry_use_GT = 1; + else if ( !strcasecmp("PL",list[0]) ) args->qry_use_GT = 0; + else error("Failed to parse --use %s; only GT and PL are supported\n", optarg); + if ( nlist==2 ) + { + if ( !strcasecmp("GT",list[1]) ) args->gt_use_GT = 1; + else if ( !strcasecmp("PL",list[1]) ) args->gt_use_GT = 0; + else error("Failed to parse --use %s; only GT and PL are supported\n", optarg); + } + else args->gt_use_GT = args->qry_use_GT; + for (i=0; intop = strtol(optarg,&tmp,10); + if ( !tmp || *tmp ) error("Could not parse: --n-matches %s\n", optarg); + if ( args->ntop < 0 ) + { + args->sort_by_hwe = 1; + args->ntop *= -1; + } + break; + case 3 : args->calc_hwe_prob = 0; break; + case 4 : error("The option -S, --target-sample has been deprecated\n"); break; + case 5 : args->dry_run = 1; break; + case 6 : + args->distinctive_sites = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',' ) error("Could not parse: --distinctive-sites %s\n", optarg); + tmp++; + free(args->es_max_mem); + args->es_max_mem = strdup(tmp); + while ( *tmp && *tmp!=',' ) tmp++; + if ( *tmp ) { *tmp = 0; args->es_tmp_prefix = tmp+1; } + } + args->use_PLs = 0; + break; + case 'c': + error("The -c option is to be implemented, please open an issue on github\n"); + args->min_inter_err = strtod(optarg,&tmp); + if ( *tmp ) + { + if ( *tmp!=',') error("Could not parse: -c %s\n", optarg); + args->max_intra_err = strtod(tmp+1,&tmp); + if ( *tmp ) error("Could not parse: -c %s\n", optarg); + } + break; + case 'G': error("The option -G, --GTs-only has been deprecated\n"); break; + case 'a': args->all_sites = 1; error("The -a option is to be implemented, please open an issue on github\n"); break; + case 'H': args->hom_only = 1; break; + case 'g': args->gt_fname = optarg; break; +// case 'p': args->plot = optarg; break; + case 's': + if ( !strncasecmp("gt:",optarg,3) ) args->gt_samples = optarg+3; + else if ( !strncasecmp("qry:",optarg,4) ) args->qry_samples = optarg+4; + else error("Which one? Query samples (qry:%s) or genotype samples (gt:%s)?\n",optarg,optarg); + break; + case 'S': + if ( !strncasecmp("gt:",optarg,3) ) args->gt_samples = optarg+3, args->gt_samples_is_file = 1; + else if ( !strncasecmp("qry:",optarg,4) ) args->qry_samples = optarg+4, args->qry_samples_is_file = 1; + else error("Which one? Query samples (qry:%s) or genotype samples (gt:%s)?\n",optarg,optarg); + break; + case 'p': args->pair_samples = optarg; break; + case 'P': args->pair_samples = optarg; args->pair_samples_is_file = 1; break; + case 'r': args->regions = optarg; break; + case 'R': args->regions = optarg; args->regions_is_file = 1; break; + case 't': args->targets = optarg; break; + case 'T': args->targets = optarg; args->targets_is_file = 1; break; + case 7 : + args->regions_overlap = parse_overlap_option(optarg); + if ( args->regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 8 : + args->targets_overlap = parse_overlap_option(optarg); + if ( args->targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( optind==argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args->qry_fname = "-"; // reading from stdin + else usage(); // no files given + } + else args->qry_fname = argv[optind]; + if ( argc>optind+1 ) error("Error: too many files given, run with -h for help\n"); // too many files given + if ( args->pair_samples ) + { + if ( args->gt_samples || args->qry_samples ) error("The -p/-P option cannot be combined with -s/-S\n"); + if ( args->ntop ) error("The --n-matches option cannot be combined with -p/-P\n"); + } + if ( args->distinctive_sites && !args->pair_samples ) error("The experimental option --distinctive-sites requires -p/-P\n"); + if ( args->hom_only && !args->gt_fname ) error("The option --homs-only requires --genotypes\n"); + if ( args->distinctive_sites && args->use_PLs ) error("The option --distinctive-sites cannot be combined with --error-probability\n"); + + init_data(args); + + int ret; + while ( (ret=bcf_sr_next_line(args->files)) ) + { + if ( !is_input_okay(args,ret) ) continue; + + // time one record to give the user an estimate with very big files + struct timeval t0, t1; + if ( !args->ncmp ) gettimeofday(&t0, NULL); + + process_line(args); + + if ( args->ncmp==1 ) + { + gettimeofday(&t1, NULL); + double delta = (t1.tv_sec - t0.tv_sec) * 1e6 + (t1.tv_usec - t0.tv_usec); + fprintf(bcftools_stderr,"INFO:\tTime required to process one record .. %f seconds\n",delta/1e6); + fprintf(args->fp,"INFO\tTime required to process one record .. %f seconds\n",delta/1e6); + if ( args->dry_run ) break; + } + } + if ( !args->dry_run ) + { + report(args); + if ( args->distinctive_sites ) report_distinctive_sites(args); + } + + destroy_data(args); + free(args); + return 0; +} + diff --git a/bcftools/vcfhead.c b/bcftools/vcfhead.c new file mode 100644 index 0000000..20be2a9 --- /dev/null +++ b/bcftools/vcfhead.c @@ -0,0 +1,133 @@ +/* vcfhead.c -- view VCF/BCF file headers. + + Copyright (C) 2021 University of Glasgow. + + Author: John Marshall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "bcftools.h" + +int main_vcfhead(int argc, char *argv[]) +{ + static const char usage[] = +"\n" +"About: Displays VCF/BCF headers and optionally the first few variant records\n" +"Usage: bcftools head [OPTION]... [FILE]\n" +"\n" +"Options:\n" +" -h, --headers INT Display INT header lines [all]\n" +" -n, --records INT Display INT variant record lines [none]\n" +"\n"; + + static const struct option loptions[] = { + { "headers", required_argument, NULL, 'h' }, + { "records", required_argument, NULL, 'n' }, + { NULL, 0, NULL, 0 } + }; + + int all_headers = 1; + uint64_t nheaders = 0; + uint64_t nrecords = 0; + + int c, nargs; + while ((c = getopt_long(argc, argv, "h:n:", loptions, NULL)) >= 0) + switch (c) { + case 'h': all_headers = 0; nheaders = strtoull(optarg, NULL, 0); break; + case 'n': nrecords = strtoull(optarg, NULL, 0); break; + default: + fputs(usage, stderr); + return EXIT_FAILURE; + } + + nargs = argc - optind; + if (nargs == 0 && isatty(STDIN_FILENO)) { + fputs(usage, stdout); + return EXIT_SUCCESS; + } + else if (nargs > 1) { + fputs(usage, stderr); + return EXIT_FAILURE; + } + + const char *fname = (nargs == 1)? argv[optind] : "-"; + vcfFile *fp = bcf_open(fname, "r"); + if (fp == NULL) { + if (strcmp(fname, "-") != 0) + error_errno("[%s] Can't open \"%s\"", __func__, fname); + else + error_errno("[%s] Can't open standard input", __func__); + } + + bcf_hdr_t *hdr = bcf_hdr_read(fp); + if (hdr == NULL) { + bcf_close(fp); + if (strcmp(fname, "-") != 0) + error("[%s] Can't read headers from \"%s\"\n", __func__, fname); + else + error("[%s] Can't read headers\n", __func__); + } + + kstring_t str = KS_INITIALIZE; + + if (all_headers) { + bcf_hdr_format(hdr, 0, &str); + fputs(ks_str(&str), stdout); + } + else if (nheaders > 0) { + bcf_hdr_format(hdr, 0, &str); + char *lim = str.s; + uint64_t n; + for (n = 0; n < nheaders; n++) { + lim = strchr(lim, '\n'); + if (lim) lim++; + else break; + } + if (lim) *lim = '\0'; + fputs(ks_str(&str), stdout); + } + + if (nrecords > 0) { + bcf1_t *rec = bcf_init(); + uint64_t n; + for (n = 0; n < nrecords && bcf_read(fp, hdr, rec) >= 0; n++) { + ks_clear(&str); + if (vcf_format(hdr, rec, &str) >= 0) + fputs(ks_str(&str), stdout); + else + fprintf(stderr, "[%s] Record #%"PRIu64 " is invalid\n", __func__, n+1); + } + bcf_destroy(rec); + } + + ks_free(&str); + bcf_hdr_destroy(hdr); + bcf_close(fp); + + return EXIT_SUCCESS; +} diff --git a/bcftools/vcfhead.c.pysam.c b/bcftools/vcfhead.c.pysam.c new file mode 100644 index 0000000..09744f2 --- /dev/null +++ b/bcftools/vcfhead.c.pysam.c @@ -0,0 +1,135 @@ +#include "bcftools.pysam.h" + +/* vcfhead.c -- view VCF/BCF file headers. + + Copyright (C) 2021 University of Glasgow. + + Author: John Marshall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "bcftools.h" + +int main_vcfhead(int argc, char *argv[]) +{ + static const char usage[] = +"\n" +"About: Displays VCF/BCF headers and optionally the first few variant records\n" +"Usage: bcftools head [OPTION]... [FILE]\n" +"\n" +"Options:\n" +" -h, --headers INT Display INT header lines [all]\n" +" -n, --records INT Display INT variant record lines [none]\n" +"\n"; + + static const struct option loptions[] = { + { "headers", required_argument, NULL, 'h' }, + { "records", required_argument, NULL, 'n' }, + { NULL, 0, NULL, 0 } + }; + + int all_headers = 1; + uint64_t nheaders = 0; + uint64_t nrecords = 0; + + int c, nargs; + while ((c = getopt_long(argc, argv, "h:n:", loptions, NULL)) >= 0) + switch (c) { + case 'h': all_headers = 0; nheaders = strtoull(optarg, NULL, 0); break; + case 'n': nrecords = strtoull(optarg, NULL, 0); break; + default: + fputs(usage, bcftools_stderr); + return EXIT_FAILURE; + } + + nargs = argc - optind; + if (nargs == 0 && isatty(STDIN_FILENO)) { + fputs(usage, bcftools_stdout); + return EXIT_SUCCESS; + } + else if (nargs > 1) { + fputs(usage, bcftools_stderr); + return EXIT_FAILURE; + } + + const char *fname = (nargs == 1)? argv[optind] : "-"; + vcfFile *fp = bcf_open(fname, "r"); + if (fp == NULL) { + if (strcmp(fname, "-") != 0) + error_errno("[%s] Can't open \"%s\"", __func__, fname); + else + error_errno("[%s] Can't open standard input", __func__); + } + + bcf_hdr_t *hdr = bcf_hdr_read(fp); + if (hdr == NULL) { + bcf_close(fp); + if (strcmp(fname, "-") != 0) + error("[%s] Can't read headers from \"%s\"\n", __func__, fname); + else + error("[%s] Can't read headers\n", __func__); + } + + kstring_t str = KS_INITIALIZE; + + if (all_headers) { + bcf_hdr_format(hdr, 0, &str); + fputs(ks_str(&str), bcftools_stdout); + } + else if (nheaders > 0) { + bcf_hdr_format(hdr, 0, &str); + char *lim = str.s; + uint64_t n; + for (n = 0; n < nheaders; n++) { + lim = strchr(lim, '\n'); + if (lim) lim++; + else break; + } + if (lim) *lim = '\0'; + fputs(ks_str(&str), bcftools_stdout); + } + + if (nrecords > 0) { + bcf1_t *rec = bcf_init(); + uint64_t n; + for (n = 0; n < nrecords && bcf_read(fp, hdr, rec) >= 0; n++) { + ks_clear(&str); + if (vcf_format(hdr, rec, &str) >= 0) + fputs(ks_str(&str), bcftools_stdout); + else + fprintf(bcftools_stderr, "[%s] Record #%"PRIu64 " is invalid\n", __func__, n+1); + } + bcf_destroy(rec); + } + + ks_free(&str); + bcf_hdr_destroy(hdr); + bcf_close(fp); + + return EXIT_SUCCESS; +} diff --git a/bcftools/vcfindex.c b/bcftools/vcfindex.c new file mode 100644 index 0000000..1dd960e --- /dev/null +++ b/bcftools/vcfindex.c @@ -0,0 +1,334 @@ +/* vcfindex.c -- Index bgzip compressed VCF/BCF files for random access. + + Copyright (C) 2014-2021 Genome Research Ltd. + + Author: Shane McCarthy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#define __STDC_FORMAT_MACROS +#include +#include +#include +#include "bcftools.h" + +#define BCF_LIDX_SHIFT 14 + +enum { + per_contig = 1, + all_contigs = 2, + total = 4 +}; + +static void usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Index bgzip compressed VCF/BCF files for random access.\n"); + fprintf(stderr, "Usage: bcftools index [options] |\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Indexing options:\n"); + fprintf(stderr, " -c, --csi generate CSI-format index for VCF/BCF files [default]\n"); + fprintf(stderr, " -f, --force overwrite index if it already exists\n"); + fprintf(stderr, " -m, --min-shift INT set minimal interval size for CSI indices to 2^INT [14]\n"); + fprintf(stderr, " -o, --output FILE optional output index file name\n"); + fprintf(stderr, " -t, --tbi generate TBI-format index for VCF files\n"); + fprintf(stderr, " --threads INT use multithreading with INT worker threads [0]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Stats options:\n"); + fprintf(stderr, " -a, --all with --stats, print stats for all contigs even when zero\n"); + fprintf(stderr, " -n, --nrecords print number of records based on existing index file\n"); + fprintf(stderr, " -s, --stats print per contig stats based on existing index file\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int vcf_index_stats(char *fname, int stats) +{ + const char **seq = NULL; + int tid, nseq = 0, ret = 0; + tbx_t *tbx = NULL; + bcf_hdr_t *hdr = NULL; + hts_idx_t *idx = NULL; + htsFile *fp = NULL; + uint64_t sum = 0; + char *fntemp = NULL, *fnidx = NULL; + + /* + * First, has the user provided an index file? If per contig stats + * are requested, open the variant file (together with the index file, + * if provided), since the contig names can only be retrieved from its + * header. Otherwise, use just the corresponding index file to count + * the total number of records. + */ + int len = strlen(fname); + int idx_only = 0; + if ( (fnidx = strstr(fname, HTS_IDX_DELIM)) != NULL ) { + fntemp = strdup(fname); + if ( !fntemp ) return 1; + fntemp[fnidx-fname] = 0; + fname = fntemp; + fnidx += strlen(HTS_IDX_DELIM); + } + else if ( len>4 && (!strcasecmp(".csi",fname+len-4) || !strcasecmp(".tbi",fname+len-4)) ) + { + fnidx = fname; + fntemp = strdup(fname); + fname = fntemp; + fname[len-4] = 0; + idx_only = 1; + } + + if ( stats&per_contig ) + { + if ( idx_only ) + { + struct stat buf; + if ( stat(fname, &buf)==0 ) idx_only = 0; + } + + enum htsExactFormat fmt; + if ( !idx_only ) + { + fp = hts_open(fname,"r"); + if ( !fp ) { + fprintf(stderr,"Could not read %s\n", fname); + ret = 1; goto cleanup; + } + hdr = bcf_hdr_read(fp); + if ( !hdr ) { + fprintf(stderr,"Could not read the header: %s\n", fname); + ret = 1; goto cleanup; + } + fmt = hts_get_format(fp)->format; + } + else + { + int len = strlen(fnidx); + if ( !strcasecmp(".tbi",fnidx+len-4) ) fmt = vcf; + else fmt = bcf; + } + + if ( fmt==vcf ) + { + tbx = tbx_index_load2(fname, fnidx); + if ( !tbx ) { fprintf(stderr,"Could not load index for VCF: %s\n", fname); return 1; } + } + else if ( fmt==bcf ) + { + idx = bcf_index_load2(fname, fnidx); + if ( !idx ) { fprintf(stderr,"Could not load index for BCF file: %s\n", fname); return 1; } + } + else + { + fprintf(stderr,"Could not detect the file type as VCF or BCF: %s\n", fname); + return 1; + } + } + else if ( fnidx ) + { + char *ext = strrchr(fnidx, '.'); + if ( ext && strcmp(ext, ".tbi") == 0 ) { + tbx = tbx_index_load2(fname, fnidx); + } else if ( ext && strcmp(ext, ".csi") == 0 ) { + idx = bcf_index_load2(fname, fnidx); + } + if ( !tbx && !idx ) { + fprintf(stderr,"Could not load index file '%s'\n", fnidx); + ret = 1; goto cleanup; + } + } else { + char *ext = strrchr(fname, '.'); + if ( ext && strcmp(ext, ".bcf") == 0 ) { + idx = bcf_index_load(fname); + } else if ( ext && (ext-fname) > 4 && strcmp(ext-4, ".vcf.gz") == 0 ) { + tbx = tbx_index_load(fname); + } + } + + if ( !tbx && !idx ) { + fprintf(stderr,"No index file could be found for '%s'. Use 'bcftools index' to create one\n", fname); + ret = 1; goto cleanup; + } + + if ( tbx ) { + seq = tbx_seqnames(tbx, &nseq); + } else { + nseq = hts_idx_nseq(idx); + } + if ( !tbx && !hdr ) fprintf(stderr,"Warning: cannot determine contig names given the .csi index alone\n"); + for (tid=0; tididx : idx, tid, &records, &v); + sum += records; + if ( (stats&total) || (records == 0 && !(stats&all_contigs)) ) continue; + const char *ctg_name = tbx ? seq[tid] : hdr ? bcf_hdr_id2name(hdr, tid) : "n/a"; + bcf_hrec_t *hrec = hdr ? bcf_hdr_get_hrec(hdr, BCF_HL_CTG, "ID", ctg_name, NULL) : NULL; + int hkey = hrec ? bcf_hrec_find_key(hrec, "length") : -1; + printf("%s\t%s\t", ctg_name, hkey<0?".":hrec->vals[hkey]); + if (ret >= 0) printf("%" PRIu64 "\n", records); + else printf(".\n"); + } + if ( !sum ) + { + // No counts found. + // Is this because index version has no stored count data, or no records? + bcf1_t *rec = bcf_init1(); + if (fp && hdr && rec && bcf_read1(fp, hdr, rec) >= 0) { + fprintf(stderr,"index of %s does not contain any count metadata. Please re-index with a newer version of bcftools or tabix.\n", fname); + ret = 1; + } + bcf_destroy1(rec); + } + if ( (stats&total) && !ret ) { + printf("%" PRIu64 "\n", sum); + } + +cleanup: + free(seq); + free(fntemp); + if ( fp && hts_close(fp)!=0 ) error("[%s] Error: close failed\n", __func__); + bcf_hdr_destroy(hdr); + if (tbx) + tbx_destroy(tbx); + if (idx) + hts_idx_destroy(idx); + return ret; +} + +int main_vcfindex(int argc, char *argv[]) +{ + int c, force = 0, tbi = 0, stats = 0, n_threads = 0; + int min_shift = BCF_LIDX_SHIFT; + char *outfn = NULL; + + static struct option loptions[] = + { + {"all",no_argument,NULL,'a'}, + {"csi",no_argument,NULL,'c'}, + {"tbi",no_argument,NULL,'t'}, + {"force",no_argument,NULL,'f'}, + {"min-shift",required_argument,NULL,'m'}, + {"stats",no_argument,NULL,'s'}, + {"nrecords",no_argument,NULL,'n'}, + {"threads",required_argument,NULL,9}, + {"output-file",required_argument,NULL,'o'}, + {"output",required_argument,NULL,'o'}, + {NULL, 0, NULL, 0} + }; + + char *tmp; + while ((c = getopt_long(argc, argv, "ctfm:snao:", loptions, NULL)) >= 0) + { + switch (c) + { + case 'c': tbi = 0; break; + case 't': tbi = 1; min_shift = 0; break; + case 'f': force = 1; break; + case 'm': + min_shift = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --min-shift %s\n", optarg); + break; + case 's': stats |= per_contig; break; + case 'n': stats |= total; break; + case 'a': stats |= all_contigs; break; + case 9: + n_threads = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --threads %s\n", optarg); + break; + case 'o': outfn = optarg; break; + default: usage(); + } + } + if (stats > total) + { + fprintf(stderr, "[E::%s] expected only one of --stats or --nrecords options\n", __func__); + return 1; + } + if (tbi && min_shift>0) + { + fprintf(stderr, "[E::%s] min-shift option only expected for CSI indices \n", __func__); + return 1; + } + if (min_shift < 0 || min_shift > 30) + { + fprintf(stderr, "[E::%s] expected min_shift in range [0,30] (%d)\n", __func__, min_shift); + return 1; + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(); + } + else fname = argv[optind]; + if (stats) return vcf_index_stats(fname, stats); + + kstring_t idx_fname = {0,0,0}; + if (outfn) + kputs(outfn,&idx_fname); + else + { + if (!strcmp(fname, "-")) { fprintf(stderr, "[E::%s] must specify an output path for index file when reading VCF/BCF from stdin\n", __func__); return 1; } + ksprintf(&idx_fname, "%s.%s", fname, tbi ? "tbi" : "csi"); + } + if (!force) + { + // Before complaining about existing index, check if the VCF file isn't newer. + struct stat stat_tbi, stat_file; + if ( stat(idx_fname.s, &stat_tbi)==0 ) + { + stat(fname, &stat_file); + if ( stat_file.st_mtime <= stat_tbi.st_mtime ) + { + fprintf(stderr,"[E::%s] the index file exists. Please use '-f' to overwrite %s\n", __func__, idx_fname.s); + free(idx_fname.s); + return 1; + } + } + + // check for truncated files, allow only with -f + BGZF *fp = bgzf_open(fname, "r"); + if ( !fp ) error("index: failed to open %s\n", fname); + if ( bgzf_compression(fp)!=2 ) error("index: the file is not BGZF compressed, cannot index: %s\n", fname); + if ( bgzf_check_EOF(fp)!=1 ) error("index: the input is probably truncated, use -f to index anyway: %s\n", fname); + if ( bgzf_close(fp)!=0 ) error("index: close failed: %s\n", fname); + } + + int ret = bcf_index_build3(fname, idx_fname.s, min_shift, n_threads); + free(idx_fname.s); + if (ret != 0) { + if (ret == -2) + error("index: failed to open \"%s\"\n", fname); + else if (ret == -3) + error("index: \"%s\" is in a format that cannot be usefully indexed\n", fname); + else + error("index: failed to create index for \"%s\"\n", fname); + } + return 0; +} diff --git a/bcftools/vcfindex.c.pysam.c b/bcftools/vcfindex.c.pysam.c new file mode 100644 index 0000000..ac9e3ba --- /dev/null +++ b/bcftools/vcfindex.c.pysam.c @@ -0,0 +1,336 @@ +#include "bcftools.pysam.h" + +/* vcfindex.c -- Index bgzip compressed VCF/BCF files for random access. + + Copyright (C) 2014-2021 Genome Research Ltd. + + Author: Shane McCarthy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#define __STDC_FORMAT_MACROS +#include +#include +#include +#include "bcftools.h" + +#define BCF_LIDX_SHIFT 14 + +enum { + per_contig = 1, + all_contigs = 2, + total = 4 +}; + +static void usage(void) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Index bgzip compressed VCF/BCF files for random access.\n"); + fprintf(bcftools_stderr, "Usage: bcftools index [options] |\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Indexing options:\n"); + fprintf(bcftools_stderr, " -c, --csi generate CSI-format index for VCF/BCF files [default]\n"); + fprintf(bcftools_stderr, " -f, --force overwrite index if it already exists\n"); + fprintf(bcftools_stderr, " -m, --min-shift INT set minimal interval size for CSI indices to 2^INT [14]\n"); + fprintf(bcftools_stderr, " -o, --output FILE optional output index file name\n"); + fprintf(bcftools_stderr, " -t, --tbi generate TBI-format index for VCF files\n"); + fprintf(bcftools_stderr, " --threads INT use multithreading with INT worker threads [0]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Stats options:\n"); + fprintf(bcftools_stderr, " -a, --all with --stats, print stats for all contigs even when zero\n"); + fprintf(bcftools_stderr, " -n, --nrecords print number of records based on existing index file\n"); + fprintf(bcftools_stderr, " -s, --stats print per contig stats based on existing index file\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int vcf_index_stats(char *fname, int stats) +{ + const char **seq = NULL; + int tid, nseq = 0, ret = 0; + tbx_t *tbx = NULL; + bcf_hdr_t *hdr = NULL; + hts_idx_t *idx = NULL; + htsFile *fp = NULL; + uint64_t sum = 0; + char *fntemp = NULL, *fnidx = NULL; + + /* + * First, has the user provided an index file? If per contig stats + * are requested, open the variant file (together with the index file, + * if provided), since the contig names can only be retrieved from its + * header. Otherwise, use just the corresponding index file to count + * the total number of records. + */ + int len = strlen(fname); + int idx_only = 0; + if ( (fnidx = strstr(fname, HTS_IDX_DELIM)) != NULL ) { + fntemp = strdup(fname); + if ( !fntemp ) return 1; + fntemp[fnidx-fname] = 0; + fname = fntemp; + fnidx += strlen(HTS_IDX_DELIM); + } + else if ( len>4 && (!strcasecmp(".csi",fname+len-4) || !strcasecmp(".tbi",fname+len-4)) ) + { + fnidx = fname; + fntemp = strdup(fname); + fname = fntemp; + fname[len-4] = 0; + idx_only = 1; + } + + if ( stats&per_contig ) + { + if ( idx_only ) + { + struct stat buf; + if ( stat(fname, &buf)==0 ) idx_only = 0; + } + + enum htsExactFormat fmt; + if ( !idx_only ) + { + fp = hts_open(fname,"r"); + if ( !fp ) { + fprintf(bcftools_stderr,"Could not read %s\n", fname); + ret = 1; goto cleanup; + } + hdr = bcf_hdr_read(fp); + if ( !hdr ) { + fprintf(bcftools_stderr,"Could not read the header: %s\n", fname); + ret = 1; goto cleanup; + } + fmt = hts_get_format(fp)->format; + } + else + { + int len = strlen(fnidx); + if ( !strcasecmp(".tbi",fnidx+len-4) ) fmt = vcf; + else fmt = bcf; + } + + if ( fmt==vcf ) + { + tbx = tbx_index_load2(fname, fnidx); + if ( !tbx ) { fprintf(bcftools_stderr,"Could not load index for VCF: %s\n", fname); return 1; } + } + else if ( fmt==bcf ) + { + idx = bcf_index_load2(fname, fnidx); + if ( !idx ) { fprintf(bcftools_stderr,"Could not load index for BCF file: %s\n", fname); return 1; } + } + else + { + fprintf(bcftools_stderr,"Could not detect the file type as VCF or BCF: %s\n", fname); + return 1; + } + } + else if ( fnidx ) + { + char *ext = strrchr(fnidx, '.'); + if ( ext && strcmp(ext, ".tbi") == 0 ) { + tbx = tbx_index_load2(fname, fnidx); + } else if ( ext && strcmp(ext, ".csi") == 0 ) { + idx = bcf_index_load2(fname, fnidx); + } + if ( !tbx && !idx ) { + fprintf(bcftools_stderr,"Could not load index file '%s'\n", fnidx); + ret = 1; goto cleanup; + } + } else { + char *ext = strrchr(fname, '.'); + if ( ext && strcmp(ext, ".bcf") == 0 ) { + idx = bcf_index_load(fname); + } else if ( ext && (ext-fname) > 4 && strcmp(ext-4, ".vcf.gz") == 0 ) { + tbx = tbx_index_load(fname); + } + } + + if ( !tbx && !idx ) { + fprintf(bcftools_stderr,"No index file could be found for '%s'. Use 'bcftools index' to create one\n", fname); + ret = 1; goto cleanup; + } + + if ( tbx ) { + seq = tbx_seqnames(tbx, &nseq); + } else { + nseq = hts_idx_nseq(idx); + } + if ( !tbx && !hdr ) fprintf(bcftools_stderr,"Warning: cannot determine contig names given the .csi index alone\n"); + for (tid=0; tididx : idx, tid, &records, &v); + sum += records; + if ( (stats&total) || (records == 0 && !(stats&all_contigs)) ) continue; + const char *ctg_name = tbx ? seq[tid] : hdr ? bcf_hdr_id2name(hdr, tid) : "n/a"; + bcf_hrec_t *hrec = hdr ? bcf_hdr_get_hrec(hdr, BCF_HL_CTG, "ID", ctg_name, NULL) : NULL; + int hkey = hrec ? bcf_hrec_find_key(hrec, "length") : -1; + fprintf(bcftools_stdout, "%s\t%s\t", ctg_name, hkey<0?".":hrec->vals[hkey]); + if (ret >= 0) fprintf(bcftools_stdout, "%" PRIu64 "\n", records); + else fprintf(bcftools_stdout, ".\n"); + } + if ( !sum ) + { + // No counts found. + // Is this because index version has no stored count data, or no records? + bcf1_t *rec = bcf_init1(); + if (fp && hdr && rec && bcf_read1(fp, hdr, rec) >= 0) { + fprintf(bcftools_stderr,"index of %s does not contain any count metadata. Please re-index with a newer version of bcftools or tabix.\n", fname); + ret = 1; + } + bcf_destroy1(rec); + } + if ( (stats&total) && !ret ) { + fprintf(bcftools_stdout, "%" PRIu64 "\n", sum); + } + +cleanup: + free(seq); + free(fntemp); + if ( fp && hts_close(fp)!=0 ) error("[%s] Error: close failed\n", __func__); + bcf_hdr_destroy(hdr); + if (tbx) + tbx_destroy(tbx); + if (idx) + hts_idx_destroy(idx); + return ret; +} + +int main_vcfindex(int argc, char *argv[]) +{ + int c, force = 0, tbi = 0, stats = 0, n_threads = 0; + int min_shift = BCF_LIDX_SHIFT; + char *outfn = NULL; + + static struct option loptions[] = + { + {"all",no_argument,NULL,'a'}, + {"csi",no_argument,NULL,'c'}, + {"tbi",no_argument,NULL,'t'}, + {"force",no_argument,NULL,'f'}, + {"min-shift",required_argument,NULL,'m'}, + {"stats",no_argument,NULL,'s'}, + {"nrecords",no_argument,NULL,'n'}, + {"threads",required_argument,NULL,9}, + {"output-file",required_argument,NULL,'o'}, + {"output",required_argument,NULL,'o'}, + {NULL, 0, NULL, 0} + }; + + char *tmp; + while ((c = getopt_long(argc, argv, "ctfm:snao:", loptions, NULL)) >= 0) + { + switch (c) + { + case 'c': tbi = 0; break; + case 't': tbi = 1; min_shift = 0; break; + case 'f': force = 1; break; + case 'm': + min_shift = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --min-shift %s\n", optarg); + break; + case 's': stats |= per_contig; break; + case 'n': stats |= total; break; + case 'a': stats |= all_contigs; break; + case 9: + n_threads = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --threads %s\n", optarg); + break; + case 'o': outfn = optarg; break; + default: usage(); + } + } + if (stats > total) + { + fprintf(bcftools_stderr, "[E::%s] expected only one of --stats or --nrecords options\n", __func__); + return 1; + } + if (tbi && min_shift>0) + { + fprintf(bcftools_stderr, "[E::%s] min-shift option only expected for CSI indices \n", __func__); + return 1; + } + if (min_shift < 0 || min_shift > 30) + { + fprintf(bcftools_stderr, "[E::%s] expected min_shift in range [0,30] (%d)\n", __func__, min_shift); + return 1; + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(); + } + else fname = argv[optind]; + if (stats) return vcf_index_stats(fname, stats); + + kstring_t idx_fname = {0,0,0}; + if (outfn) + kputs(outfn,&idx_fname); + else + { + if (!strcmp(fname, "-")) { fprintf(bcftools_stderr, "[E::%s] must specify an output path for index file when reading VCF/BCF from stdin\n", __func__); return 1; } + ksprintf(&idx_fname, "%s.%s", fname, tbi ? "tbi" : "csi"); + } + if (!force) + { + // Before complaining about existing index, check if the VCF file isn't newer. + struct stat stat_tbi, stat_file; + if ( stat(idx_fname.s, &stat_tbi)==0 ) + { + stat(fname, &stat_file); + if ( stat_file.st_mtime <= stat_tbi.st_mtime ) + { + fprintf(bcftools_stderr,"[E::%s] the index file exists. Please use '-f' to overwrite %s\n", __func__, idx_fname.s); + free(idx_fname.s); + return 1; + } + } + + // check for truncated files, allow only with -f + BGZF *fp = bgzf_open(fname, "r"); + if ( !fp ) error("index: failed to open %s\n", fname); + if ( bgzf_compression(fp)!=2 ) error("index: the file is not BGZF compressed, cannot index: %s\n", fname); + if ( bgzf_check_EOF(fp)!=1 ) error("index: the input is probably truncated, use -f to index anyway: %s\n", fname); + if ( bgzf_close(fp)!=0 ) error("index: close failed: %s\n", fname); + } + + int ret = bcf_index_build3(fname, idx_fname.s, min_shift, n_threads); + free(idx_fname.s); + if (ret != 0) { + if (ret == -2) + error("index: failed to open \"%s\"\n", fname); + else if (ret == -3) + error("index: \"%s\" is in a format that cannot be usefully indexed\n", fname); + else + error("index: failed to create index for \"%s\"\n", fname); + } + return 0; +} diff --git a/bcftools/vcfisec.c b/bcftools/vcfisec.c new file mode 100644 index 0000000..a755a85 --- /dev/null +++ b/bcftools/vcfisec.c @@ -0,0 +1,652 @@ +/* vcfisec.c -- Create intersections, unions and complements of VCF files. + + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" + +#define OP_PLUS 1 +#define OP_MINUS 2 +#define OP_EQUAL 3 +#define OP_VENN 4 +#define OP_COMPLEMENT 5 +#define OP_EXACT 6 + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +typedef struct +{ + int isec_op, isec_n, *write, iwrite, nwrite, output_type, n_threads, clevel; + int nflt, *flt_logic; + filter_t **flt; + char **flt_expr; + bcf_srs_t *files; + FILE *fh_log, *fh_sites; + htsFile **fh_out; + char **argv, *prefix, *output_fname, **fnames, *write_files, *targets_list, *regions_list; + char *isec_exact; + int argc, record_cmd_line; +} +args_t; + +/** + * mkdir_p() - create new directory for a file $fname + * @fname: the file name to create the directory for, the part after last "/" is ignored + */ +void mkdir_p(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int n = vsnprintf(NULL, 0, fmt, ap) + 2; + va_end(ap); + + char *path = (char*)malloc(n); + va_start(ap, fmt); + vsnprintf(path, n, fmt, ap); + va_end(ap); + + char *tmp = strdup(path), *p = tmp+1; + while (*p) + { + while (*p && *p!='/') p++; + if ( !*p ) break; + char ctmp = *p; + *p = 0; + int ret = mkdir(tmp,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + if ( ret!=0 && errno!=EEXIST ) error("Error creating directory %s: %s\n", path,strerror(errno)); + *p = ctmp; + while ( *p && *p=='/' ) p++; + } + free(tmp); + free(path); +} + +/** + * open_file() - open new file creating the file name using vsnprintf + * @fname: if not NULL, on output will point to newly allocated fname string + * @mode: if NULL, only the file name string will be created + * @fmt: vsnprintf format and args + * + * Returns open file descriptor or NULL if mode is NULL. + */ +FILE *open_file(char **fname, const char *mode, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int n = vsnprintf(NULL, 0, fmt, ap) + 2; + va_end(ap); + + char *str = (char*)malloc(n); + va_start(ap, fmt); + vsnprintf(str, n, fmt, ap); + va_end(ap); + + mkdir_p(str); + if ( !mode ) + { + if ( !fname ) error("Uh: expected fname or mode\n"); + *fname = str; + return NULL; + } + + FILE *fp = fopen(str,mode); + if ( fname ) *fname = str; + else free(str); + return fp; +} + +void isec_vcf(args_t *args) +{ + bcf_srs_t *files = args->files; + kstring_t str = {0,0,0}; + htsFile *out_fh = NULL; + + // When only one VCF is output, print VCF to stdout or -o file + int out_std = 0; + if ( args->nwrite==1 && !args->prefix ) out_std = 1; + if ( args->targets_list && files->nreaders==1 ) out_std = 1; + if ( out_std ) + { + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to %s: %s\n", args->output_fname? args->output_fname : "standard output", strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if (args->record_cmd_line) bcf_hdr_append_version(files->readers[args->iwrite].header,args->argc,args->argv,"bcftools_isec"); + if ( bcf_hdr_write(out_fh, files->readers[args->iwrite].header)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname?args->output_fname:"standard output"); + } + if ( !args->nwrite && !out_std && !args->prefix ) + fprintf(stderr,"Note: -w option not given, printing list of sites...\n"); + + int n; + while ( (n=bcf_sr_next_line(files)) ) + { + bcf_sr_t *reader = NULL; + bcf1_t *line = NULL; + int i, ret = 0; + for (i=0; inreaders; i++) + { + if ( !bcf_sr_has_line(files,i) ) continue; + + if ( args->nflt && args->flt[i] ) + { + bcf1_t *rec = bcf_sr_get_line(files, i); + int pass = filter_test(args->flt[i], rec, NULL); + if ( args->flt_logic[i] & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) + { + files->has_line[i] = 0; + n--; + continue; + } + } + + if ( !line ) + { + line = files->readers[i].buffer[0]; + reader = &files->readers[i]; + } + ret |= 1<isec_op) + { + case OP_COMPLEMENT: if ( n!=1 || !bcf_sr_has_line(files,0) ) continue; break; + case OP_EQUAL: if ( n != args->isec_n ) continue; break; + case OP_PLUS: if ( n < args->isec_n ) continue; break; + case OP_MINUS: if ( n > args->isec_n ) continue; break; + case OP_EXACT: + for (i=0; inreaders; i++) + if ( files->has_line[i] != args->isec_exact[i] ) break; + if ( inreaders ) continue; + break; + } + + if ( out_std ) + { + if ( bcf_sr_has_line(files,args->iwrite) && bcf_write1(out_fh, files->readers[args->iwrite].header, files->readers[args->iwrite].buffer[0])!=0 ) + error("[%s] Error: cannot write to %s\n", __func__, args->output_fname ? args->output_fname : "standard output"); + continue; + } + else if ( args->fh_sites ) + { + str.l = 0; + kputs(reader->header->id[BCF_DT_CTG][line->rid].key, &str); kputc('\t', &str); + kputw(line->pos+1, &str); kputc('\t', &str); + if (line->n_allele > 0) kputs(line->d.allele[0], &str); + else kputc('.', &str); + kputc('\t', &str); + if (line->n_allele > 1) kputs(line->d.allele[1], &str); + else kputc('.', &str); + for (i=2; in_allele; i++) + { + kputc(',', &str); + kputs(line->d.allele[i], &str); + } + kputc('\t', &str); + for (i=0; inreaders; i++) + kputc(bcf_sr_has_line(files,i)?'1':'0', &str); + kputc('\n', &str); + if ( fwrite(str.s,sizeof(char),str.l,args->fh_sites)!=str.l ) + error("[%s] Error: failed to write %d bytes to %s\n", __func__,(int)str.l,args->output_fname ? args->output_fname : "standard output"); + } + + if ( args->prefix ) + { + if ( args->isec_op==OP_VENN && ret==3 ) + { + if ( !args->nwrite || args->write[0] ) + { + if ( bcf_write1(args->fh_out[2], bcf_sr_get_header(files,0), bcf_sr_get_line(files,0))!=0 ) + error("[%s] Error: cannot write\n", __func__); + } + if ( !args->nwrite || args->write[1] ) + { + if ( bcf_write1(args->fh_out[3], bcf_sr_get_header(files,1), bcf_sr_get_line(files,1))!=0 ) + error("[%s] Error: cannot write\n", __func__); + } + } + else + { + for (i=0; inreaders; i++) + { + if ( !bcf_sr_has_line(files,i) ) continue; + if ( args->write && !args->write[i] ) continue; + if ( bcf_write1(args->fh_out[i], files->readers[i].header, files->readers[i].buffer[0])!=0 ) error("[%s] Error: cannot write\n", __func__); + } + } + } + } + if ( str.s ) free(str.s); + if ( out_fh && hts_close(out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname? args->output_fname : "-"); +} + +static void add_filter(args_t *args, char *expr, int logic) +{ + args->nflt++; + args->flt_expr = (char**) realloc(args->flt_expr,sizeof(char*)*args->nflt); + args->flt_logic = (int*) realloc(args->flt_logic,sizeof(int)*args->nflt); + args->flt = (filter_t**) realloc(args->flt,sizeof(filter_t*)*args->nflt); + if ( expr[0]=='-' && expr[1]==0 ) + { + args->flt_expr[args->nflt-1] = NULL; + args->flt[args->nflt-1] = NULL; + } + else + args->flt_expr[args->nflt-1] = expr; + args->flt_logic[args->nflt-1] = logic; +} + +static void destroy_data(args_t *args); +static void init_data(args_t *args) +{ + int i; + if ( args->nflt ) + { + if ( args->nflt > 1 && args->nflt!=args->files->nreaders ) + error("Error: expected either one -i/-e option or as many as there are input files\n"); + if ( args->nflt < args->files->nreaders ) + { + if ( !args->flt_expr[0] ) error("Error: useless use of -i/-e\n"); + args->nflt = args->files->nreaders; + args->flt_expr = (char**) realloc(args->flt_expr,sizeof(char*)*args->nflt); + args->flt_logic = (int*) realloc(args->flt_logic,sizeof(int)*args->nflt); + args->flt = (filter_t**) realloc(args->flt,sizeof(filter_t*)*args->nflt); + for (i=1; inflt; i++) + { + args->flt_expr[i] = args->flt_expr[0]; + args->flt_logic[i] = args->flt_logic[0]; + args->flt[i] = filter_init(args->files->readers[i].header,args->flt_expr[i]); + } + args->flt[0] = filter_init(args->files->readers[0].header,args->flt_expr[0]); + } + else + { + for (i=0; ifiles->nreaders; i++) + { + if ( !args->flt_expr[i] ) continue; + args->flt[i] = filter_init(args->files->readers[i].header,args->flt_expr[i]); + } + } + } + + if ( args->isec_op==OP_EXACT ) + { + if ( strlen(args->isec_exact)!=args->files->nreaders ) + error("The number of files does not match the bitmask: %d vs %s\n", args->files->nreaders,args->isec_exact); + for (i=0; ifiles->nreaders; i++) + if ( args->isec_exact[i]!='0' && args->isec_exact[i]!='1' ) error("Unexpected bitmask: %s\n",args->isec_exact); + for (i=0; ifiles->nreaders; i++) + args->isec_exact[i] -= '0'; + } + + // Which files to write: parse the string passed with -w + char *p = args->write_files; + while (p && *p) + { + if ( !args->write ) args->write = (int*) calloc(args->files->nreaders,sizeof(int)); + if ( sscanf(p,"%d",&i)!=1 ) error("Could not parse --write %s\n", args->write_files); + if ( i<=0 || i>args->files->nreaders ) error("The index is out of range: %d (-w %s)\n", i, args->write_files); + args->write[i-1] = 1; + args->iwrite = i-1; + args->nwrite++; + while (*p && *p!=',') p++; + if ( *p==',' ) p++; + } + if ( args->nwrite>1 && !args->prefix ) error("Expected -p when multiple output files given: --write %s\n", args->write_files); + if ( args->isec_op==OP_COMPLEMENT && args->nwrite ) + { + if ( args->nwrite>1 ) error("Multiple files to -w make no sense with -C\n"); + if ( !args->write[0] ) error("Only -w1 makes sense with -C\n"); + } + + if ( args->prefix ) + { + // Init output directory and create the readme file + args->fh_log = open_file(NULL,"w","%s/README.txt", args->prefix); + if ( !args->fh_log ) error("%s/README.txt: %s\n", args->prefix, strerror(errno)); + + fprintf(args->fh_log,"This file was produced by vcfisec.\n"); + fprintf(args->fh_log,"The command line was:\tbcftools %s ", args->argv[0]); + int i; + for (i=1; iargc; i++) fprintf(args->fh_log," %s",args->argv[i]); + fprintf(args->fh_log,"\n\nUsing the following file names:\n"); + + const char *suffix = "vcf"; + if ( args->output_type & FT_BCF ) suffix = "bcf"; + else if ( args->output_type & FT_GZ ) suffix = "vcf.gz"; + + // Open output files and write the legend + if ( args->isec_op==OP_VENN ) + { + args->fh_out = (htsFile**) malloc(sizeof(htsFile*)*4); + args->fnames = (char**) calloc(4,sizeof(char*)); + + #define OPEN_FILE(i,j) { \ + open_file(&args->fnames[i], NULL, "%s/%04d.%s", args->prefix, i, suffix); \ + char wmode[8]; \ + set_wmode(wmode,args->output_type,args->fnames[i],args->clevel); \ + args->fh_out[i] = hts_open(args->fnames[i], wmode); \ + if ( !args->fh_out[i] ) error("Could not open %s\n", args->fnames[i]); \ + if ( args->n_threads ) hts_set_threads(args->fh_out[i], args->n_threads); \ + if (args->record_cmd_line) bcf_hdr_append_version(args->files->readers[j].header,args->argc,args->argv,"bcftools_isec"); \ + if ( bcf_hdr_write(args->fh_out[i], args->files->readers[j].header)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->fnames[i]); \ + } + if ( !args->nwrite || args->write[0] ) + { + OPEN_FILE(0,0); + fprintf(args->fh_log,"%s\tfor records private to\t%s\n", args->fnames[0], args->files->readers[0].fname); + } + if ( !args->nwrite || args->write[1] ) + { + OPEN_FILE(1,1); + fprintf(args->fh_log,"%s\tfor records private to\t%s\n", args->fnames[1], args->files->readers[1].fname); + } + if ( !args->nwrite || args->write[0] ) + { + OPEN_FILE(2,0); + fprintf(args->fh_log,"%s\tfor records from %s shared by both\t%s %s\n", args->fnames[2], args->files->readers[0].fname, args->files->readers[0].fname, args->files->readers[1].fname); + } + if ( !args->nwrite || args->write[1] ) + { + OPEN_FILE(3,1); + fprintf(args->fh_log,"%s\tfor records from %s shared by both\t%s %s\n", args->fnames[3], args->files->readers[1].fname, args->files->readers[0].fname, args->files->readers[1].fname); + } + } + else + { + // Init one output file for each reader + args->fh_out = (htsFile**) calloc(args->files->nreaders, sizeof(htsFile*)); + args->fnames = (char**) calloc(args->files->nreaders, sizeof(char*)); + + for (i=0; ifiles->nreaders; i++) + { + if ( args->write && !args->write[i] ) continue; + if ( args->isec_op==OP_COMPLEMENT && i>0 ) break; + OPEN_FILE(i,i); + fprintf(args->fh_log,"%s\tfor stripped\t%s\n", args->fnames[i], args->files->readers[i].fname); + } + #undef OPEN_FILE + } + args->fh_sites = open_file(NULL, "w", "%s/sites.txt", args->prefix); + if ( !args->fh_sites ) error("%s/sites.txt: %s\n", args->prefix, strerror(errno)); + } + else { + if (args->output_fname) { + args->fh_sites = fopen(args->output_fname, "w"); + if ( args->fh_sites == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + } + else + args->fh_sites = stdout; + } +} + +static void destroy_data(args_t *args) +{ + int i; + if ( args->nflt ) + { + for (i=0; inflt; i++) + { + if ( !args->flt[i] ) continue; + filter_destroy(args->flt[i]); + } + free(args->flt_expr); + free(args->flt); + free(args->flt_logic); + } + if ( args->prefix ) + { + fclose(args->fh_log); + int n = args->isec_op==OP_VENN ? 4 : args->files->nreaders; + for (i=0; ifnames[i] ) continue; + if ( hts_close(args->fh_out[i])!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fnames[i]); + if ( args->output_type==FT_VCF_GZ ) + { + tbx_conf_t conf = tbx_conf_vcf; + tbx_index_build(args->fnames[i], -1, &conf); + } + else if ( args->output_type==FT_BCF_GZ ) + { + if ( bcf_index_build(args->fnames[i],14) ) error("Could not index %s\n", args->fnames[i]); + } + free(args->fnames[i]); + } + free(args->fh_out); + free(args->fnames); + if ( args->fh_sites ) fclose(args->fh_sites); + if ( args->write ) free(args->write); + } +} + +static void usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Create intersections, unions and complements of VCF files.\n"); + fprintf(stderr, "Usage: bcftools isec [options] [...]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -c, --collapse STRING Treat as identical records with , see man page for details [none]\n"); + fprintf(stderr, " -C, --complement Output positions present only in the first file but missing in the others\n"); + fprintf(stderr, " -e, --exclude EXPR Exclude sites for which the expression is true\n"); + fprintf(stderr, " -f, --apply-filters LIST Require at least one of the listed FILTER strings (e.g. \"PASS,.\")\n"); + fprintf(stderr, " -i, --include EXPR Include only sites for which the expression is true\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -n, --nfiles [+-=~]INT Output positions present in this many (=), this many or more (+), this many or fewer (-), the exact (~) files\n"); + fprintf(stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " -p, --prefix DIR If given, subset each of the input files accordingly, see also -w\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(stderr, " -w, --write LIST List of files to write with -p given as 1-based indexes. By default, all files are written\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, " # Create intersection and complements of two sets saving the output in dir/*\n"); + fprintf(stderr, " bcftools isec A.vcf.gz B.vcf.gz -p dir\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # Filter sites in A and B (but not in C) and create intersection\n"); + fprintf(stderr, " bcftools isec -e'MAF<0.01' -i'dbSNP=1' -e - A.vcf.gz B.vcf.gz C.vcf.gz -p dir\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # Extract and write records from A shared by both A and B using exact allele match\n"); + fprintf(stderr, " bcftools isec A.vcf.gz B.vcf.gz -p dir -n =2 -w 1\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # Extract and write records from C found in A and C but not in B\n"); + fprintf(stderr, " bcftools isec A.vcf.gz B.vcf.gz C.vcf.gz -p dir -n~101 -w 3\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # Extract records private to A or B comparing by position only\n"); + fprintf(stderr, " bcftools isec A.vcf.gz B.vcf.gz -p dir -n -1 -c all\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfisec(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->files = bcf_sr_init(); + args->argc = argc; args->argv = argv; + args->output_fname = NULL; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->clevel = -1; + int targets_is_file = 0, regions_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"help",no_argument,NULL,'h'}, + {"exclude",required_argument,NULL,'e'}, + {"include",required_argument,NULL,'i'}, + {"collapse",required_argument,NULL,'c'}, + {"complement",no_argument,NULL,'C'}, + {"apply-filters",required_argument,NULL,'f'}, + {"nfiles",required_argument,NULL,'n'}, + {"prefix",required_argument,NULL,'p'}, + {"write",required_argument,NULL,'w'}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,4}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "hc:r:R:p:n:w:t:T:Cf:o:O:i:e:",loptions,NULL)) >= 0) { + switch (c) { + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'c': + if ( !strcmp(optarg,"snps") ) args->files->collapse |= COLLAPSE_SNPS; + else if ( !strcmp(optarg,"indels") ) args->files->collapse |= COLLAPSE_INDELS; + else if ( !strcmp(optarg,"both") ) args->files->collapse |= COLLAPSE_SNPS | COLLAPSE_INDELS; + else if ( !strcmp(optarg,"any") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"all") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"some") ) args->files->collapse |= COLLAPSE_SOME; + else if ( !strcmp(optarg,"none") ) args->files->collapse = COLLAPSE_NONE; + else error("The --collapse string \"%s\" not recognised.\n", optarg); + break; + case 'f': args->files->apply_filters = optarg; break; + case 'C': + if ( args->isec_op!=0 && args->isec_op!=OP_COMPLEMENT ) error("Error: either -C or -n should be given, not both.\n"); + args->isec_op = OP_COMPLEMENT; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'p': args->prefix = optarg; break; + case 'w': args->write_files = optarg; break; + case 'i': add_filter(args, optarg, FLT_INCLUDE); break; + case 'e': add_filter(args, optarg, FLT_EXCLUDE); break; + case 'n': + { + if ( args->isec_op!=0 && args->isec_op==OP_COMPLEMENT ) error("Error: either -C or -n should be given, not both.\n"); + if ( args->isec_op!=0 ) error("Error: -n should be given only once.\n"); + char *p = optarg; + if ( *p=='-' ) { args->isec_op = OP_MINUS; p++; } + else if ( *p=='+' ) { args->isec_op = OP_PLUS; p++; } + else if ( *p=='=' ) { args->isec_op = OP_EQUAL; p++; } + else if ( *p=='~' ) { args->isec_op = OP_EXACT; p++; } + else if ( isdigit(*p) ) args->isec_op = OP_EQUAL; + else error("Could not parse --nfiles %s\n", optarg); + if ( args->isec_op == OP_EXACT ) args->isec_exact = p; + else if ( sscanf(p,"%d",&args->isec_n)!=1 ) error("Could not parse --nfiles %s\n", optarg); + } + break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 4 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( argc-optind<1 ) usage(); // no file given + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file,0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( argc-optind==2 && !args->isec_op ) + { + args->isec_op = OP_VENN; + if ( !args->prefix ) error("Expected the -p option\n"); + } + if ( !args->isec_op ) + { + args->isec_op = OP_PLUS; + args->isec_n = 1; + } + args->files->require_index = 1; + while (optindfiles, argv[optind]) ) error("Failed to open %s: %s\n", argv[optind],bcf_sr_strerror(args->files->errnum)); + optind++; + } + init_data(args); + isec_vcf(args); + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} + diff --git a/bcftools/vcfisec.c.pysam.c b/bcftools/vcfisec.c.pysam.c new file mode 100644 index 0000000..50214a6 --- /dev/null +++ b/bcftools/vcfisec.c.pysam.c @@ -0,0 +1,654 @@ +#include "bcftools.pysam.h" + +/* vcfisec.c -- Create intersections, unions and complements of VCF files. + + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" + +#define OP_PLUS 1 +#define OP_MINUS 2 +#define OP_EQUAL 3 +#define OP_VENN 4 +#define OP_COMPLEMENT 5 +#define OP_EXACT 6 + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +typedef struct +{ + int isec_op, isec_n, *write, iwrite, nwrite, output_type, n_threads, clevel; + int nflt, *flt_logic; + filter_t **flt; + char **flt_expr; + bcf_srs_t *files; + FILE *fh_log, *fh_sites; + htsFile **fh_out; + char **argv, *prefix, *output_fname, **fnames, *write_files, *targets_list, *regions_list; + char *isec_exact; + int argc, record_cmd_line; +} +args_t; + +/** + * mkdir_p() - create new directory for a file $fname + * @fname: the file name to create the directory for, the part after last "/" is ignored + */ +void mkdir_p(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int n = vsnprintf(NULL, 0, fmt, ap) + 2; + va_end(ap); + + char *path = (char*)malloc(n); + va_start(ap, fmt); + vsnprintf(path, n, fmt, ap); + va_end(ap); + + char *tmp = strdup(path), *p = tmp+1; + while (*p) + { + while (*p && *p!='/') p++; + if ( !*p ) break; + char ctmp = *p; + *p = 0; + int ret = mkdir(tmp,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + if ( ret!=0 && errno!=EEXIST ) error("Error creating directory %s: %s\n", path,strerror(errno)); + *p = ctmp; + while ( *p && *p=='/' ) p++; + } + free(tmp); + free(path); +} + +/** + * open_file() - open new file creating the file name using vsnprintf + * @fname: if not NULL, on output will point to newly allocated fname string + * @mode: if NULL, only the file name string will be created + * @fmt: vsnprintf format and args + * + * Returns open file descriptor or NULL if mode is NULL. + */ +FILE *open_file(char **fname, const char *mode, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int n = vsnprintf(NULL, 0, fmt, ap) + 2; + va_end(ap); + + char *str = (char*)malloc(n); + va_start(ap, fmt); + vsnprintf(str, n, fmt, ap); + va_end(ap); + + mkdir_p(str); + if ( !mode ) + { + if ( !fname ) error("Uh: expected fname or mode\n"); + *fname = str; + return NULL; + } + + FILE *fp = fopen(str,mode); + if ( fname ) *fname = str; + else free(str); + return fp; +} + +void isec_vcf(args_t *args) +{ + bcf_srs_t *files = args->files; + kstring_t str = {0,0,0}; + htsFile *out_fh = NULL; + + // When only one VCF is output, print VCF to bcftools_stdout or -o file + int out_std = 0; + if ( args->nwrite==1 && !args->prefix ) out_std = 1; + if ( args->targets_list && files->nreaders==1 ) out_std = 1; + if ( out_std ) + { + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( out_fh == NULL ) error("Can't write to %s: %s\n", args->output_fname? args->output_fname : "standard output", strerror(errno)); + if ( args->n_threads ) hts_set_threads(out_fh, args->n_threads); + if (args->record_cmd_line) bcf_hdr_append_version(files->readers[args->iwrite].header,args->argc,args->argv,"bcftools_isec"); + if ( bcf_hdr_write(out_fh, files->readers[args->iwrite].header)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname?args->output_fname:"standard output"); + } + if ( !args->nwrite && !out_std && !args->prefix ) + fprintf(bcftools_stderr,"Note: -w option not given, printing list of sites...\n"); + + int n; + while ( (n=bcf_sr_next_line(files)) ) + { + bcf_sr_t *reader = NULL; + bcf1_t *line = NULL; + int i, ret = 0; + for (i=0; inreaders; i++) + { + if ( !bcf_sr_has_line(files,i) ) continue; + + if ( args->nflt && args->flt[i] ) + { + bcf1_t *rec = bcf_sr_get_line(files, i); + int pass = filter_test(args->flt[i], rec, NULL); + if ( args->flt_logic[i] & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) + { + files->has_line[i] = 0; + n--; + continue; + } + } + + if ( !line ) + { + line = files->readers[i].buffer[0]; + reader = &files->readers[i]; + } + ret |= 1<isec_op) + { + case OP_COMPLEMENT: if ( n!=1 || !bcf_sr_has_line(files,0) ) continue; break; + case OP_EQUAL: if ( n != args->isec_n ) continue; break; + case OP_PLUS: if ( n < args->isec_n ) continue; break; + case OP_MINUS: if ( n > args->isec_n ) continue; break; + case OP_EXACT: + for (i=0; inreaders; i++) + if ( files->has_line[i] != args->isec_exact[i] ) break; + if ( inreaders ) continue; + break; + } + + if ( out_std ) + { + if ( bcf_sr_has_line(files,args->iwrite) && bcf_write1(out_fh, files->readers[args->iwrite].header, files->readers[args->iwrite].buffer[0])!=0 ) + error("[%s] Error: cannot write to %s\n", __func__, args->output_fname ? args->output_fname : "standard output"); + continue; + } + else if ( args->fh_sites ) + { + str.l = 0; + kputs(reader->header->id[BCF_DT_CTG][line->rid].key, &str); kputc('\t', &str); + kputw(line->pos+1, &str); kputc('\t', &str); + if (line->n_allele > 0) kputs(line->d.allele[0], &str); + else kputc('.', &str); + kputc('\t', &str); + if (line->n_allele > 1) kputs(line->d.allele[1], &str); + else kputc('.', &str); + for (i=2; in_allele; i++) + { + kputc(',', &str); + kputs(line->d.allele[i], &str); + } + kputc('\t', &str); + for (i=0; inreaders; i++) + kputc(bcf_sr_has_line(files,i)?'1':'0', &str); + kputc('\n', &str); + if ( fwrite(str.s,sizeof(char),str.l,args->fh_sites)!=str.l ) + error("[%s] Error: failed to write %d bytes to %s\n", __func__,(int)str.l,args->output_fname ? args->output_fname : "standard output"); + } + + if ( args->prefix ) + { + if ( args->isec_op==OP_VENN && ret==3 ) + { + if ( !args->nwrite || args->write[0] ) + { + if ( bcf_write1(args->fh_out[2], bcf_sr_get_header(files,0), bcf_sr_get_line(files,0))!=0 ) + error("[%s] Error: cannot write\n", __func__); + } + if ( !args->nwrite || args->write[1] ) + { + if ( bcf_write1(args->fh_out[3], bcf_sr_get_header(files,1), bcf_sr_get_line(files,1))!=0 ) + error("[%s] Error: cannot write\n", __func__); + } + } + else + { + for (i=0; inreaders; i++) + { + if ( !bcf_sr_has_line(files,i) ) continue; + if ( args->write && !args->write[i] ) continue; + if ( bcf_write1(args->fh_out[i], files->readers[i].header, files->readers[i].buffer[0])!=0 ) error("[%s] Error: cannot write\n", __func__); + } + } + } + } + if ( str.s ) free(str.s); + if ( out_fh && hts_close(out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname? args->output_fname : "-"); +} + +static void add_filter(args_t *args, char *expr, int logic) +{ + args->nflt++; + args->flt_expr = (char**) realloc(args->flt_expr,sizeof(char*)*args->nflt); + args->flt_logic = (int*) realloc(args->flt_logic,sizeof(int)*args->nflt); + args->flt = (filter_t**) realloc(args->flt,sizeof(filter_t*)*args->nflt); + if ( expr[0]=='-' && expr[1]==0 ) + { + args->flt_expr[args->nflt-1] = NULL; + args->flt[args->nflt-1] = NULL; + } + else + args->flt_expr[args->nflt-1] = expr; + args->flt_logic[args->nflt-1] = logic; +} + +static void destroy_data(args_t *args); +static void init_data(args_t *args) +{ + int i; + if ( args->nflt ) + { + if ( args->nflt > 1 && args->nflt!=args->files->nreaders ) + error("Error: expected either one -i/-e option or as many as there are input files\n"); + if ( args->nflt < args->files->nreaders ) + { + if ( !args->flt_expr[0] ) error("Error: useless use of -i/-e\n"); + args->nflt = args->files->nreaders; + args->flt_expr = (char**) realloc(args->flt_expr,sizeof(char*)*args->nflt); + args->flt_logic = (int*) realloc(args->flt_logic,sizeof(int)*args->nflt); + args->flt = (filter_t**) realloc(args->flt,sizeof(filter_t*)*args->nflt); + for (i=1; inflt; i++) + { + args->flt_expr[i] = args->flt_expr[0]; + args->flt_logic[i] = args->flt_logic[0]; + args->flt[i] = filter_init(args->files->readers[i].header,args->flt_expr[i]); + } + args->flt[0] = filter_init(args->files->readers[0].header,args->flt_expr[0]); + } + else + { + for (i=0; ifiles->nreaders; i++) + { + if ( !args->flt_expr[i] ) continue; + args->flt[i] = filter_init(args->files->readers[i].header,args->flt_expr[i]); + } + } + } + + if ( args->isec_op==OP_EXACT ) + { + if ( strlen(args->isec_exact)!=args->files->nreaders ) + error("The number of files does not match the bitmask: %d vs %s\n", args->files->nreaders,args->isec_exact); + for (i=0; ifiles->nreaders; i++) + if ( args->isec_exact[i]!='0' && args->isec_exact[i]!='1' ) error("Unexpected bitmask: %s\n",args->isec_exact); + for (i=0; ifiles->nreaders; i++) + args->isec_exact[i] -= '0'; + } + + // Which files to write: parse the string passed with -w + char *p = args->write_files; + while (p && *p) + { + if ( !args->write ) args->write = (int*) calloc(args->files->nreaders,sizeof(int)); + if ( sscanf(p,"%d",&i)!=1 ) error("Could not parse --write %s\n", args->write_files); + if ( i<=0 || i>args->files->nreaders ) error("The index is out of range: %d (-w %s)\n", i, args->write_files); + args->write[i-1] = 1; + args->iwrite = i-1; + args->nwrite++; + while (*p && *p!=',') p++; + if ( *p==',' ) p++; + } + if ( args->nwrite>1 && !args->prefix ) error("Expected -p when multiple output files given: --write %s\n", args->write_files); + if ( args->isec_op==OP_COMPLEMENT && args->nwrite ) + { + if ( args->nwrite>1 ) error("Multiple files to -w make no sense with -C\n"); + if ( !args->write[0] ) error("Only -w1 makes sense with -C\n"); + } + + if ( args->prefix ) + { + // Init output directory and create the readme file + args->fh_log = open_file(NULL,"w","%s/README.txt", args->prefix); + if ( !args->fh_log ) error("%s/README.txt: %s\n", args->prefix, strerror(errno)); + + fprintf(args->fh_log,"This file was produced by vcfisec.\n"); + fprintf(args->fh_log,"The command line was:\tbcftools %s ", args->argv[0]); + int i; + for (i=1; iargc; i++) fprintf(args->fh_log," %s",args->argv[i]); + fprintf(args->fh_log,"\n\nUsing the following file names:\n"); + + const char *suffix = "vcf"; + if ( args->output_type & FT_BCF ) suffix = "bcf"; + else if ( args->output_type & FT_GZ ) suffix = "vcf.gz"; + + // Open output files and write the legend + if ( args->isec_op==OP_VENN ) + { + args->fh_out = (htsFile**) malloc(sizeof(htsFile*)*4); + args->fnames = (char**) calloc(4,sizeof(char*)); + + #define OPEN_FILE(i,j) { \ + open_file(&args->fnames[i], NULL, "%s/%04d.%s", args->prefix, i, suffix); \ + char wmode[8]; \ + set_wmode(wmode,args->output_type,args->fnames[i],args->clevel); \ + args->fh_out[i] = hts_open(args->fnames[i], wmode); \ + if ( !args->fh_out[i] ) error("Could not open %s\n", args->fnames[i]); \ + if ( args->n_threads ) hts_set_threads(args->fh_out[i], args->n_threads); \ + if (args->record_cmd_line) bcf_hdr_append_version(args->files->readers[j].header,args->argc,args->argv,"bcftools_isec"); \ + if ( bcf_hdr_write(args->fh_out[i], args->files->readers[j].header)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->fnames[i]); \ + } + if ( !args->nwrite || args->write[0] ) + { + OPEN_FILE(0,0); + fprintf(args->fh_log,"%s\tfor records private to\t%s\n", args->fnames[0], args->files->readers[0].fname); + } + if ( !args->nwrite || args->write[1] ) + { + OPEN_FILE(1,1); + fprintf(args->fh_log,"%s\tfor records private to\t%s\n", args->fnames[1], args->files->readers[1].fname); + } + if ( !args->nwrite || args->write[0] ) + { + OPEN_FILE(2,0); + fprintf(args->fh_log,"%s\tfor records from %s shared by both\t%s %s\n", args->fnames[2], args->files->readers[0].fname, args->files->readers[0].fname, args->files->readers[1].fname); + } + if ( !args->nwrite || args->write[1] ) + { + OPEN_FILE(3,1); + fprintf(args->fh_log,"%s\tfor records from %s shared by both\t%s %s\n", args->fnames[3], args->files->readers[1].fname, args->files->readers[0].fname, args->files->readers[1].fname); + } + } + else + { + // Init one output file for each reader + args->fh_out = (htsFile**) calloc(args->files->nreaders, sizeof(htsFile*)); + args->fnames = (char**) calloc(args->files->nreaders, sizeof(char*)); + + for (i=0; ifiles->nreaders; i++) + { + if ( args->write && !args->write[i] ) continue; + if ( args->isec_op==OP_COMPLEMENT && i>0 ) break; + OPEN_FILE(i,i); + fprintf(args->fh_log,"%s\tfor stripped\t%s\n", args->fnames[i], args->files->readers[i].fname); + } + #undef OPEN_FILE + } + args->fh_sites = open_file(NULL, "w", "%s/sites.txt", args->prefix); + if ( !args->fh_sites ) error("%s/sites.txt: %s\n", args->prefix, strerror(errno)); + } + else { + if (args->output_fname) { + args->fh_sites = fopen(args->output_fname, "w"); + if ( args->fh_sites == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + } + else + args->fh_sites = bcftools_stdout; + } +} + +static void destroy_data(args_t *args) +{ + int i; + if ( args->nflt ) + { + for (i=0; inflt; i++) + { + if ( !args->flt[i] ) continue; + filter_destroy(args->flt[i]); + } + free(args->flt_expr); + free(args->flt); + free(args->flt_logic); + } + if ( args->prefix ) + { + fclose(args->fh_log); + int n = args->isec_op==OP_VENN ? 4 : args->files->nreaders; + for (i=0; ifnames[i] ) continue; + if ( hts_close(args->fh_out[i])!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fnames[i]); + if ( args->output_type==FT_VCF_GZ ) + { + tbx_conf_t conf = tbx_conf_vcf; + tbx_index_build(args->fnames[i], -1, &conf); + } + else if ( args->output_type==FT_BCF_GZ ) + { + if ( bcf_index_build(args->fnames[i],14) ) error("Could not index %s\n", args->fnames[i]); + } + free(args->fnames[i]); + } + free(args->fh_out); + free(args->fnames); + if ( args->fh_sites ) fclose(args->fh_sites); + if ( args->write ) free(args->write); + } +} + +static void usage(void) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Create intersections, unions and complements of VCF files.\n"); + fprintf(bcftools_stderr, "Usage: bcftools isec [options] [...]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -c, --collapse STRING Treat as identical records with , see man page for details [none]\n"); + fprintf(bcftools_stderr, " -C, --complement Output positions present only in the first file but missing in the others\n"); + fprintf(bcftools_stderr, " -e, --exclude EXPR Exclude sites for which the expression is true\n"); + fprintf(bcftools_stderr, " -f, --apply-filters LIST Require at least one of the listed FILTER strings (e.g. \"PASS,.\")\n"); + fprintf(bcftools_stderr, " -i, --include EXPR Include only sites for which the expression is true\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -n, --nfiles [+-=~]INT Output positions present in this many (=), this many or more (+), this many or fewer (-), the exact (~) files\n"); + fprintf(bcftools_stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " -p, --prefix DIR If given, subset each of the input files accordingly, see also -w\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(bcftools_stderr, " -w, --write LIST List of files to write with -p given as 1-based indexes. By default, all files are written\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Examples:\n"); + fprintf(bcftools_stderr, " # Create intersection and complements of two sets saving the output in dir/*\n"); + fprintf(bcftools_stderr, " bcftools isec A.vcf.gz B.vcf.gz -p dir\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # Filter sites in A and B (but not in C) and create intersection\n"); + fprintf(bcftools_stderr, " bcftools isec -e'MAF<0.01' -i'dbSNP=1' -e - A.vcf.gz B.vcf.gz C.vcf.gz -p dir\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # Extract and write records from A shared by both A and B using exact allele match\n"); + fprintf(bcftools_stderr, " bcftools isec A.vcf.gz B.vcf.gz -p dir -n =2 -w 1\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # Extract and write records from C found in A and C but not in B\n"); + fprintf(bcftools_stderr, " bcftools isec A.vcf.gz B.vcf.gz C.vcf.gz -p dir -n~101 -w 3\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # Extract records private to A or B comparing by position only\n"); + fprintf(bcftools_stderr, " bcftools isec A.vcf.gz B.vcf.gz -p dir -n -1 -c all\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfisec(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->files = bcf_sr_init(); + args->argc = argc; args->argv = argv; + args->output_fname = NULL; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->clevel = -1; + int targets_is_file = 0, regions_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"help",no_argument,NULL,'h'}, + {"exclude",required_argument,NULL,'e'}, + {"include",required_argument,NULL,'i'}, + {"collapse",required_argument,NULL,'c'}, + {"complement",no_argument,NULL,'C'}, + {"apply-filters",required_argument,NULL,'f'}, + {"nfiles",required_argument,NULL,'n'}, + {"prefix",required_argument,NULL,'p'}, + {"write",required_argument,NULL,'w'}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,4}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "hc:r:R:p:n:w:t:T:Cf:o:O:i:e:",loptions,NULL)) >= 0) { + switch (c) { + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'c': + if ( !strcmp(optarg,"snps") ) args->files->collapse |= COLLAPSE_SNPS; + else if ( !strcmp(optarg,"indels") ) args->files->collapse |= COLLAPSE_INDELS; + else if ( !strcmp(optarg,"both") ) args->files->collapse |= COLLAPSE_SNPS | COLLAPSE_INDELS; + else if ( !strcmp(optarg,"any") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"all") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"some") ) args->files->collapse |= COLLAPSE_SOME; + else if ( !strcmp(optarg,"none") ) args->files->collapse = COLLAPSE_NONE; + else error("The --collapse string \"%s\" not recognised.\n", optarg); + break; + case 'f': args->files->apply_filters = optarg; break; + case 'C': + if ( args->isec_op!=0 && args->isec_op!=OP_COMPLEMENT ) error("Error: either -C or -n should be given, not both.\n"); + args->isec_op = OP_COMPLEMENT; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'p': args->prefix = optarg; break; + case 'w': args->write_files = optarg; break; + case 'i': add_filter(args, optarg, FLT_INCLUDE); break; + case 'e': add_filter(args, optarg, FLT_EXCLUDE); break; + case 'n': + { + if ( args->isec_op!=0 && args->isec_op==OP_COMPLEMENT ) error("Error: either -C or -n should be given, not both.\n"); + if ( args->isec_op!=0 ) error("Error: -n should be given only once.\n"); + char *p = optarg; + if ( *p=='-' ) { args->isec_op = OP_MINUS; p++; } + else if ( *p=='+' ) { args->isec_op = OP_PLUS; p++; } + else if ( *p=='=' ) { args->isec_op = OP_EQUAL; p++; } + else if ( *p=='~' ) { args->isec_op = OP_EXACT; p++; } + else if ( isdigit(*p) ) args->isec_op = OP_EQUAL; + else error("Could not parse --nfiles %s\n", optarg); + if ( args->isec_op == OP_EXACT ) args->isec_exact = p; + else if ( sscanf(p,"%d",&args->isec_n)!=1 ) error("Could not parse --nfiles %s\n", optarg); + } + break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 4 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( argc-optind<1 ) usage(); // no file given + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file,0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( argc-optind==2 && !args->isec_op ) + { + args->isec_op = OP_VENN; + if ( !args->prefix ) error("Expected the -p option\n"); + } + if ( !args->isec_op ) + { + args->isec_op = OP_PLUS; + args->isec_n = 1; + } + args->files->require_index = 1; + while (optindfiles, argv[optind]) ) error("Failed to open %s: %s\n", argv[optind],bcf_sr_strerror(args->files->errnum)); + optind++; + } + init_data(args); + isec_vcf(args); + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} + diff --git a/bcftools/vcfmerge.c b/bcftools/vcfmerge.c new file mode 100644 index 0000000..7296a00 --- /dev/null +++ b/bcftools/vcfmerge.c @@ -0,0 +1,3330 @@ +/* vcfmerge.c -- Merge multiple VCF/BCF files to create one multi-sample file. + + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "regidx.h" +#include "vcmp.h" + +#define DBG 0 + +#define COLLAPSE_SNP_INS_DEL (1<<10) + +#include +KHASH_MAP_INIT_STR(strdict, int) +typedef khash_t(strdict) strdict_t; + +#define FLT_LOGIC_ADD 0 +#define FLT_LOGIC_REMOVE 1 + +#define SKIP_DONE 1 // the record was processed +#define SKIP_DIFF 2 // not compatible, merge later + +#define IS_VL_G(hdr,id) (bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_G) +#define IS_VL_A(hdr,id) (bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_A) +#define IS_VL_R(hdr,id) (bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_R) + +#define SWAP(type_t,a,b) { type_t tmp = (a); (a) = (b); (b) = tmp; } + +#define PL2PROB_MAX 1024 + +// For merging INFO Number=A,G,R tags +typedef struct +{ + const char *hdr_tag; + int type, nvals; + int nbuf, mbuf; + uint8_t *buf; +} +AGR_info_t; + +// Rules for merging arbitrary INFO tags +typedef struct _info_rule_t +{ + char *hdr_tag; + void (*merger)(bcf_hdr_t *hdr, bcf1_t *line, struct _info_rule_t *rule); + int type; // one of BCF_HT_* + int block_size; // number of values in a block + int type_size; // size of the corresponding BCF_HT_* type + int nblocks; // number of blocks in nvals (the number of merged files) + int nvals, mvals; // used and total size of vals array + void *vals; // the info tag values +} +info_rule_t; + +typedef struct +{ + bcf1_t *line; + int end, active; // end: 0-based INFO/END +} +gvcf_aux_t; + +// Auxiliary merge data for selecting the right combination +// of buffered records across multiple readers. maux1_t +// corresponds to one buffered line. +typedef struct +{ + int skip; + int *map; // mapping from input alleles to the array of output alleles (set by merge_alleles) + int mmap; // size of map array (only buffer[i].n_allele is actually used) + int als_differ; +} +maux1_t; +typedef struct +{ + int rid; // current rid + int beg,end; // valid ranges in reader's buffer [beg,end). Maintained by maux_reset and gvcf_flush. + int cur; // current line or -1 if none + int mrec; // allocated size of buf + maux1_t *rec; // buffer to keep reader's lines + bcf1_t **lines; // source buffer: either gvcf or readers' buffer +} +buffer_t; +typedef struct +{ + int n, pos, var_types; // number of readers, current position, currently available variant types + char *chr; // current chromosome + char **als, **out_als; // merged alleles (temp, may contain empty records) and merged alleles ready for output + int nals, mals, nout_als, mout_als; // size of the output array + int *cnt, ncnt; // number of records that refer to the alleles + int *smpl_ploidy, *smpl_nGsize; // ploidy and derived number of values in Number=G tags, updated for each line (todo: cache for missing cases) + bcf_fmt_t **fmt_map; // i-th output FORMAT field corresponds in j-th reader to i*nreader+j, first row is reserved for GT + int nfmt_map; // number of rows in the fmt_map array + int *agr_map, nagr_map, magr_map; // mapping between Number=AGR element indexes + void *tmp_arr; + size_t ntmp_arr; + buffer_t *buf; + AGR_info_t *AGR_info; + int nAGR_info, mAGR_info; + bcf_srs_t *files; + int gvcf_min, // min buffered gvcf END position (NB: gvcf_min is 1-based) or 0 if no active lines are present + gvcf_break; // 0-based position of a next record which breaks a gVCF block + gvcf_aux_t *gvcf; // buffer of gVCF lines, for each reader one line + int nout_smpl; + kstring_t *str; + int32_t *laa; // localized alternate alleles given as input-based indexes in per-sample blocks of (args->local_alleles+1) values, 0 is always first + int nlaa, laa_dirty; // number of LAA alleles actually used at this site, and was any L* added? + int32_t *tmpi, *k2k; + double *tmpd, *pl2prob; // mapping from phred-score likelihoods (PL) to probability + int ntmpi, ntmpd, nk2k; +} +maux_t; + +typedef struct +{ + vcmp_t *vcmp; + maux_t *maux; + regidx_t *regs; // apply regions only after the blocks are expanded + regitr_t *regs_itr; + int header_only, collapse, output_type, force_samples, merge_by_id, do_gvcf, filter_logic, missing_to_ref, no_index; + char *header_fname, *output_fname, *regions_list, *info_rules, *file_list; + faidx_t *gvcf_fai; + info_rule_t *rules; + int nrules; + strdict_t *tmph; + kstring_t tmps; + bcf_srs_t *files; + bcf1_t *out_line; + htsFile *out_fh; + bcf_hdr_t *out_hdr; + char **argv; + int argc, n_threads, record_cmd_line, clevel; + int local_alleles; // the value of -L option + int keep_AC_AN; +} +args_t; + +static bcf1_t *maux_get_line(args_t *args, int i) +{ + maux_t *ma = args->maux; + int ibuf = ma->buf[i].cur; + if ( ibuf >= 0 ) return ma->buf[i].lines[ibuf]; + return NULL; +} + +static void info_rules_merge_sum(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + int i, j, ndim = rule->block_size; + #define BRANCH(type_t,is_missing) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (i=0; invals; i++) if ( is_missing ) ptr[i] = 0; \ + for (i=1; inblocks; i++) \ + { \ + for (j=0; jtype) { + case BCF_HT_INT: BRANCH(int32_t, ptr[i]==bcf_int32_missing); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[i])); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,ndim,rule->type); +} +static void info_rules_merge_avg(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + int i, j, ndim = rule->block_size; + #define BRANCH(type_t,is_missing) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (i=0; invals; i++) if ( is_missing ) ptr[i] = 0; \ + for (j=0; jnblocks; i++) sum += ptr[j+i*ndim]; \ + ptr[j] = sum / rule->nblocks; \ + } \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int32_t, ptr[i]==bcf_int32_missing); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[i])); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,ndim,rule->type); +} +static void info_rules_merge_min(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + int i, j, ndim = rule->block_size; + #define BRANCH(type_t,is_missing,set_missing,huge_val) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (i=0; invals; i++) if ( is_missing ) ptr[i] = huge_val; \ + for (i=1; inblocks; i++) \ + { \ + for (j=0; j ptr[j+i*ndim] ) ptr[j] = ptr[j+i*ndim]; \ + } \ + for (i=0; invals; i++) if ( ptr[i]==huge_val ) set_missing; \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int32_t, ptr[i]==bcf_int32_missing, ptr[i]=bcf_int32_missing, INT32_MAX); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[i]), bcf_float_set_missing(ptr[i]), HUGE_VAL); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,ndim,rule->type); +} +static void info_rules_merge_max(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + int i, j, ndim = rule->block_size; + #define BRANCH(type_t,is_missing,set_missing,huge_val) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (i=0; invals; i++) if ( is_missing ) ptr[i] = huge_val; \ + for (i=1; inblocks; i++) \ + { \ + for (j=0; jnvals; i++) if ( ptr[i]==huge_val ) set_missing; \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int32_t, ptr[i]==bcf_int32_missing, ptr[i]=bcf_int32_missing, INT32_MIN); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[i]), bcf_float_set_missing(ptr[i]), -HUGE_VAL); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,ndim,rule->type); +} +static void info_rules_merge_join(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + if ( rule->type==BCF_HT_STR ) + { + ((char*)rule->vals)[rule->nvals] = 0; + bcf_update_info_string(hdr,line,rule->hdr_tag,rule->vals); + } + else + { + int isrc, idst = 0; + #define BRANCH(type_t,is_missing,is_vector_end) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (isrc=0; isrcnvals; isrc++) \ + { \ + if ( is_vector_end ) break; \ + if ( is_missing ) continue; \ + if ( idst!=isrc ) ptr[idst] = ptr[isrc]; \ + idst++; \ + } \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int32_t, ptr[isrc]==bcf_int32_missing, ptr[isrc]==bcf_int32_vector_end); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[isrc]), bcf_float_is_vector_end(ptr[isrc])); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + rule->nvals = idst; + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,rule->nvals,rule->type); + } +} + +static int info_rules_comp_key2(const void *a, const void *b) +{ + info_rule_t *rule1 = (info_rule_t*) a; + info_rule_t *rule2 = (info_rule_t*) b; + return strcmp(rule1->hdr_tag, rule2->hdr_tag); +} +static int info_rules_comp_key(const void *a, const void *b) +{ + char *key = (char*) a; + info_rule_t *rule = (info_rule_t*) b; + return strcmp(key, rule->hdr_tag); +} +static void info_rules_init(args_t *args) +{ + if ( args->info_rules && !strcmp("-",args->info_rules) ) return; + + kstring_t str = {0,0,0}; + if ( !args->info_rules ) + { + if ( bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "DP")) ) kputs("DP:sum",&str); + if ( bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "DP4")) ) + { + if ( str.l ) kputc(',',&str); + kputs("DP4:sum",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "QS")) ) + { + if ( str.l ) kputc(',',&str); + kputs("QS:sum",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "MinDP")) ) + { + if ( str.l ) kputc(',',&str); + kputs("MinDP:min",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "I16")) ) + { + if ( str.l ) kputc(',',&str); + kputs("I16:sum",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "IDV")) ) + { + if ( str.l ) kputc(',',&str); + kputs("IDV:max",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "IMF")) ) + { + if ( str.l ) kputc(',',&str); + kputs("IMF:max",&str); + } + if ( !bcf_hdr_nsamples(args->out_hdr) ) + { + if ( bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "AN")) ) + { + if ( str.l ) kputc(',',&str); + kputs("AN:sum",&str); + } + if ( bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "AC")) ) + { + if ( str.l ) kputc(',',&str); + kputs("AC:sum",&str); + } + } + + if ( !str.l ) return; + args->info_rules = str.s; + } + + args->nrules = 1; + char *ss = strdup(args->info_rules), *tmp = ss; + int n = 0; + while ( *ss ) + { + if ( *ss==':' ) { *ss = 0; n++; if ( n%2==0 ) error("Could not parse INFO rules: \"%s\"\n", args->info_rules); } + else if ( *ss==',' ) { *ss = 0; args->nrules++; n++; if ( n%2==1 ) error("Could not parse INFO rules: \"%s\"\n", args->info_rules); } + ss++; + } + if ( n%2==0 ) error("Could not parse INFO rules: \"%s\"\n", args->info_rules); + args->rules = (info_rule_t*) calloc(args->nrules,sizeof(info_rule_t)); + + n = 0; + ss = tmp; + while ( n < args->nrules ) + { + info_rule_t *rule = &args->rules[n]; + rule->hdr_tag = strdup(ss); + int id = bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, rule->hdr_tag); + if ( !bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,id) ) error("The INFO tag is not defined in the header: \"%s\"\n", rule->hdr_tag); + rule->type = bcf_hdr_id2type(args->out_hdr,BCF_HL_INFO,id); + if ( rule->type==BCF_HT_INT ) rule->type_size = sizeof(int32_t); + else if ( rule->type==BCF_HT_REAL ) rule->type_size = sizeof(float); + else if ( rule->type==BCF_HT_STR ) rule->type_size = sizeof(char); + else error("The INFO rule \"%s\" is not supported; the tag \"%s\" type is %d\n", ss,rule->hdr_tag,rule->type); + + if ( !strcmp(rule->hdr_tag,"AC") || !strcmp(rule->hdr_tag,"AN") ) args->keep_AC_AN = 1; + + ss = strchr(ss, '\0'); ss++; + if ( !*ss ) error("Could not parse INFO rules, missing logic of \"%s\"\n", rule->hdr_tag); + + int is_join = 0; + if ( !strcasecmp(ss,"sum") ) rule->merger = info_rules_merge_sum; + else if ( !strcasecmp(ss,"avg") ) rule->merger = info_rules_merge_avg; + else if ( !strcasecmp(ss,"min") ) rule->merger = info_rules_merge_min; + else if ( !strcasecmp(ss,"max") ) rule->merger = info_rules_merge_max; + else if ( !strcasecmp(ss,"join") ) { rule->merger = info_rules_merge_join; is_join = 1; } + else error("The rule logic \"%s\" not recognised\n", ss); + + if ( !is_join && rule->type==BCF_HT_STR ) + error("Numeric operation \"%s\" requested on non-numeric field: %s\n", ss, rule->hdr_tag); + if ( bcf_hdr_id2number(args->out_hdr,BCF_HL_INFO,id)==0xfffff ) + { + int is_agr = ( + bcf_hdr_id2length(args->out_hdr,BCF_HL_INFO,id)==BCF_VL_A || + bcf_hdr_id2length(args->out_hdr,BCF_HL_INFO,id)==BCF_VL_G || + bcf_hdr_id2length(args->out_hdr,BCF_HL_INFO,id)==BCF_VL_R + ) ? 1 : 0; + if ( is_join && bcf_hdr_id2length(args->out_hdr,BCF_HL_INFO,id)!=BCF_VL_VAR ) + { + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->out_hdr, BCF_HL_INFO, "ID", rule->hdr_tag, NULL); + hrec = bcf_hrec_dup(hrec); + int i = bcf_hrec_find_key(hrec, "Number"); + if ( i<0 ) error("Uh, could not find the entry Number in the header record of %s\n",rule->hdr_tag); + free(hrec->vals[i]); + hrec->vals[i] = strdup("."); + bcf_hdr_remove(args->out_hdr,BCF_HL_INFO, rule->hdr_tag); + bcf_hdr_add_hrec(args->out_hdr, hrec); + } + if ( !is_join && !is_agr ) + error("Only fixed-length vectors are supported with -i %s:%s\n", ss, rule->hdr_tag); + } + + ss = strchr(ss, '\0'); ss++; + n++; + } + free(str.s); + free(tmp); + + qsort(args->rules, args->nrules, sizeof(*args->rules), info_rules_comp_key2); +} +static void info_rules_destroy(args_t *args) +{ + int i; + for (i=0; inrules; i++) + { + info_rule_t *rule = &args->rules[i]; + free(rule->hdr_tag); + free(rule->vals); + } + free(args->rules); +} +static void info_rules_reset(args_t *args) +{ + int i; + for (i=0; inrules; i++) + args->rules[i].nblocks = args->rules[i].nvals = args->rules[i].block_size = 0; +} +static int info_rules_add_values(args_t *args, bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule, maux1_t *als, int var_len) +{ + int msize = args->maux->ntmp_arr / rule->type_size; + int ret = bcf_get_info_values(hdr, line, rule->hdr_tag, &args->maux->tmp_arr, &msize, rule->type); + if ( ret<=0 ) error("FIXME: error parsing %s at %s:%"PRId64" .. %d\n", rule->hdr_tag,bcf_seqname(hdr,line),(int64_t) line->pos+1,ret); + args->maux->ntmp_arr = msize * rule->type_size; + + rule->nblocks++; + + if ( rule->type==BCF_HT_STR ) + { + int need_comma = rule->nblocks==1 ? 0 : 1; + hts_expand(char,rule->nvals+ret+need_comma+1,rule->mvals,rule->vals); // 1 for null-termination + char *tmp = (char*) rule->vals + rule->nvals; + if ( rule->nvals>0 ) { *tmp = ','; tmp++; } + strncpy(tmp,(char*)args->maux->tmp_arr,ret); + rule->nvals += ret + need_comma; + return 1; + } + + int i, j; + if ( var_len==BCF_VL_A ) + { + if ( ret!=line->n_allele-1 ) error("Wrong number of %s fields at %s:%"PRId64"\n",rule->hdr_tag,bcf_seqname(hdr,line),(int64_t) line->pos+1); + args->maux->nagr_map = ret; + hts_expand(int,args->maux->nagr_map,args->maux->magr_map,args->maux->agr_map); + // create mapping from source file ALT indexes to dst file indexes + for (i=0; imaux->agr_map[i] = als->map[i+1] - 1; + rule->block_size = args->maux->nout_als - 1; + } + else if ( var_len==BCF_VL_R ) + { + if ( ret!=line->n_allele ) error("Wrong number of %s fields at %s:%"PRId64"\n",rule->hdr_tag,bcf_seqname(hdr,line),(int64_t) line->pos+1); + args->maux->nagr_map = ret; + hts_expand(int,args->maux->nagr_map,args->maux->magr_map,args->maux->agr_map); + for (i=0; imaux->agr_map[i] = als->map[i]; + rule->block_size = args->maux->nout_als; + } + else if ( var_len==BCF_VL_G ) + { + args->maux->nagr_map = bcf_alleles2gt(line->n_allele-1,line->n_allele-1)+1; + assert( ret==line->n_allele || ret==args->maux->nagr_map ); + if ( ret==line->n_allele ) // haploid + { + args->maux->nagr_map = line->n_allele; + hts_expand(int,args->maux->nagr_map,args->maux->magr_map,args->maux->agr_map); + for (i=0; imaux->agr_map[i] = als->map[i]; + rule->block_size = args->maux->nout_als; + } + else + { + hts_expand(int,args->maux->nagr_map,args->maux->magr_map,args->maux->agr_map); + int k_src = 0; + for (i=0; in_allele; i++) + { + for (j=0; j<=i; j++) + { + args->maux->agr_map[k_src] = bcf_alleles2gt(als->map[i],als->map[j]); + k_src++; + } + } + rule->block_size = bcf_alleles2gt(args->maux->nout_als-1,args->maux->nout_als-1)+1; + } + } + else + { + if ( rule->nblocks>1 && ret!=rule->block_size ) + error("Mismatch in number of values for INFO/%s at %s:%"PRId64"\n", rule->hdr_tag,bcf_seqname(hdr,line),(int64_t) line->pos+1); + rule->block_size = ret; + args->maux->nagr_map = 0; + } + + #define BRANCH(src_type_t,dst_type_t,set_missing) { \ + src_type_t *src = (src_type_t *) args->maux->tmp_arr; \ + hts_expand0(dst_type_t,(rule->nvals+rule->block_size),rule->mvals,rule->vals); \ + dst_type_t *dst = (dst_type_t *) rule->vals + rule->nvals; \ + rule->nvals += rule->block_size; \ + if ( !args->maux->nagr_map ) \ + { \ + for (i=0; iblock_size; i++) set_missing; \ + for (i=0; imaux->agr_map[i]] = src[i]; \ + } \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int, int32_t, dst[i] = bcf_int32_missing); break; + case BCF_HT_REAL: BRANCH(float, float, bcf_float_set_missing(dst[i])); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + return 1; +} + +int bcf_hdr_sync(bcf_hdr_t *h); + +void merge_headers(bcf_hdr_t *hw, const bcf_hdr_t *hr, const char *clash_prefix, int force_samples) +{ + // header lines + hw = bcf_hdr_merge(hw, hr); + + // samples + int i; + for (i=0; isamples[i]; + while ( bcf_hdr_id2int(hw, BCF_DT_SAMPLE, name)!=-1 ) + { + // there is a sample with the same name + if ( !force_samples ) error("Error: Duplicate sample names (%s), use --force-samples to proceed anyway.\n", name); + + // Resolve conflicting samples names. For example, replace: + // A + A with A,2:A + // A,2:A + A with A,2:A,2:2:A + + int len = strlen(name) + strlen(clash_prefix) + 1; + char *tmp = (char*) malloc(sizeof(char)*(len+1)); + sprintf(tmp,"%s:%s",clash_prefix,name); + free(rmme); + rmme = name = tmp; + } + bcf_hdr_add_sample(hw,name); + free(rmme); + } +} + +void debug_als(char **als, int nals) +{ + int k; for (k=0; k=lens[j] ) done = 1; + if ( als[j][lens[j]-i] != als[0][lens[0]-i] ) { done = 1; break; } + } + if ( done ) break; + i++; + } + if ( i>1 ) + { + i--; + als[0][lens[0]-i] = 0; + for (j=1; j0, + * 1->2, and 2->3. + */ +char **merge_alleles(char **a, int na, int *map, char **b, int *nb, int *mb) +{ + // reference allele never changes + map[0] = 0; + + int i,j; + int rla = !a[0][1] ? 1 : strlen(a[0]); + int rlb = !b[0][1] ? 1 : strlen(b[0]); + + // the most common case: same SNPs + if ( na==2 && *nb==2 && rla==1 && rlb==1 && a[1][0]==b[1][0] && !a[1][1] && !b[1][1] ) + { + map[1] = 1; + return b; + } + + // Sanity check: reference prefixes must be identical + if ( strncmp(a[0],b[0],rlarlb ) + { + for (i=0; i<*nb; i++) + { + if ( b[i][0]=='<' ) continue; // symbolic allele, do not modify + if ( b[i][0]=='*' ) continue; // overlapping deletion (*), do not modify + int l = strlen(b[i]); + b[i] = (char*) realloc(b[i],l+rla-rlb+1); + memcpy(b[i]+l,a[0]+rlb,rla-rlb+1); + } + } + + // now check if the $a alleles are present and if not add them + for (i=1; irla && a[i][0]!='<' && a[i][0]!='*' ) // $a alleles need expanding and not a symbolic allele or * + { + int l = strlen(a[i]); + ai = (char*) malloc(l+rlb-rla+1); + memcpy(ai,a[i],l); + memcpy(ai+l,b[0]+rla,rlb-rla+1); + const_ai = 0; + } + else + ai = a[i]; + + for (j=1; j<*nb; j++) + if ( !strcasecmp(ai,b[j]) ) break; + + if ( j<*nb ) // $b already has the same allele + { + map[i] = j; + if ( !const_ai ) free(ai); + continue; + } + // new allele + map[i] = *nb; + b[*nb] = const_ai ? strdup(ai) : ai; + (*nb)++; + } + return b; +} + +maux_t *maux_init(args_t *args) +{ + bcf_srs_t *files = args->files; + maux_t *ma = (maux_t*) calloc(1,sizeof(maux_t)); + ma->n = files->nreaders; + ma->files = files; + int i, n_smpl = 0; + for (i=0; in; i++) + n_smpl += bcf_hdr_nsamples(files->readers[i].header); + ma->nout_smpl = n_smpl; + assert( n_smpl==bcf_hdr_nsamples(args->out_hdr) ); + if ( args->do_gvcf ) + { + ma->gvcf = (gvcf_aux_t*) calloc(ma->n,sizeof(gvcf_aux_t)); // -Walloc-size-larger-than gives a harmless warning caused by signed integer ma->n + for (i=0; in; i++) + ma->gvcf[i].line = bcf_init1(); + } + ma->smpl_ploidy = (int*) calloc(n_smpl,sizeof(int)); + ma->smpl_nGsize = (int*) malloc(n_smpl*sizeof(int)); + ma->buf = (buffer_t*) calloc(ma->n,sizeof(buffer_t)); + for (i=0; in; i++) + ma->buf[i].rid = -1; + ma->str = (kstring_t*) calloc(n_smpl,sizeof(kstring_t)); + if ( args->local_alleles ) + { + ma->laa = (int32_t*)malloc(sizeof(*ma->laa)*ma->nout_smpl*(1+args->local_alleles)); + ma->pl2prob = (double*)malloc(PL2PROB_MAX*sizeof(*ma->pl2prob)); + for (i=0; ipl2prob[i] = pow(10,-0.1*i); + } + return ma; +} +void maux_destroy(maux_t *ma) +{ + int i,j; + for (i=0; inout_smpl; i++) free(ma->str[i].s); + free(ma->str); + for (i=0; imals; i++) + { + free(ma->als[i]); + ma->als[i] = NULL; + } + for (i=0; in; i++) // for each reader + { + for (j=0; jbuf[i].mrec; j++) // for each buffered line + free(ma->buf[i].rec[j].map); + free(ma->buf[i].rec); + } + free(ma->buf); + if ( ma->gvcf ) + { + for (i=0; in; i++) bcf_destroy(ma->gvcf[i].line); + free(ma->gvcf); + } + for (i=0; imAGR_info; i++) + free(ma->AGR_info[i].buf); + free(ma->agr_map); + free(ma->AGR_info); + if (ma->ntmp_arr) free(ma->tmp_arr); + if (ma->nfmt_map) free(ma->fmt_map); + // ma->inf freed in bcf_destroy1 + for (i=0; imals; i++) free(ma->als[i]); + if (ma->mout_als) free(ma->out_als); + free(ma->als); + free(ma->cnt); + free(ma->smpl_ploidy); + free(ma->smpl_nGsize); + free(ma->chr); + free(ma->laa); + free(ma->tmpi); + free(ma->k2k); + free(ma->tmpd); + free(ma->pl2prob); + free(ma); +} +void maux_expand1(buffer_t *buf, int size) +{ + if ( buf->mrec < size ) + { + hts_expand0(maux1_t,size,buf->mrec,buf->rec); + buf->mrec = size; + } +} +void maux_reset(maux_t *ma, int *rid_tab) +{ + int i,j; + for (i=0; in; i++) maux_expand1(&ma->buf[i],ma->files->readers[i].nbuffer+1); + for (i=0; incnt; i++) ma->cnt[i] = 0; + for (i=0; imals; i++) + { + free(ma->als[i]); + ma->als[i] = NULL; + } + const char *chr = NULL; + ma->nals = 0; + ma->pos = -1; + for (i=0; in; i++) + { + if ( !bcf_sr_has_line(ma->files,i) ) continue; + bcf1_t *line = bcf_sr_get_line(ma->files,i); + bcf_hdr_t *hdr = bcf_sr_get_header(ma->files,i); + chr = bcf_seqname(hdr,line); + ma->pos = line->pos; + break; + } + int new_chr = 0; + if ( chr && (!ma->chr || strcmp(ma->chr,chr)) ) + { + free(ma->chr); + ma->chr = strdup(chr); + new_chr = 1; + } + for (i=0; in; i++) + { + bcf_hdr_t *hdr = bcf_sr_get_header(ma->files,i); + if (new_chr) + rid_tab[i] = bcf_hdr_name2id(hdr,chr); + + ma->buf[i].rid = rid_tab[i]; + ma->buf[i].beg = bcf_sr_has_line(ma->files,i) ? 0 : 1; + for (j=ma->buf[i].beg; j<=ma->files->readers[i].nbuffer; j++) + { + ma->buf[i].rec[j].skip = 0; + bcf1_t *line = ma->files->readers[i].buffer[j]; + if ( line->rid!=ma->buf[i].rid || line->pos!=ma->pos ) break; + } + ma->buf[i].end = j; + ma->buf[i].cur = -1; + if ( ma->buf[i].beg < ma->buf[i].end ) + { + ma->buf[i].lines = ma->files->readers[i].buffer; + if ( ma->gvcf ) ma->gvcf[i].active = 0; // gvcf block cannot overlap with the next record + } + if ( new_chr && ma->gvcf ) ma->gvcf[i].active = 0; // make sure to close active gvcf block on new chr + } +} +void maux_debug(maux_t *ma, int ir, int ib) +{ + printf("[%d,%d]\t", ir,ib); + int i; + for (i=0; inals; i++) + { + printf(" %s [%d]", ma->als[i], ma->cnt[i]); + } + printf("\n"); +} + +void merge_chrom2qual(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + + int i, ret; + khiter_t kitr; + strdict_t *tmph = args->tmph; + kh_clear(strdict, tmph); + kstring_t *tmps = &args->tmps; + tmps->l = 0; + + maux_t *ma = args->maux; + int *al_idxs = (int*) calloc(ma->nals,sizeof(int)); + bcf_float_set_missing(out->qual); + + // CHROM, POS, ID, QUAL + out->pos = -1; + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args, i); + if ( !line ) continue; + bcf_unpack(line, BCF_UN_ALL); + + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + + // not all maux alleles are always used, mark the ones we'll need + int j; + for (j=1; jn_allele; j++) + { + int irec = ma->buf[i].cur; + al_idxs[ ma->buf[i].rec[irec].map[j] ] = 1; + } + + // position + if ( out->pos==-1 ) + { + const char *chr = hdr->id[BCF_DT_CTG][line->rid].key; + out->rid = bcf_hdr_name2id(out_hdr, chr); + if ( strcmp(chr,out_hdr->id[BCF_DT_CTG][out->rid].key) ) error("Uh\n"); + out->pos = line->pos; + } + + // ID + if ( line->d.id[0]!='.' || line->d.id[1] ) + { + kitr = kh_get(strdict, tmph, line->d.id); + if ( kitr == kh_end(tmph) ) + { + if ( tmps->l ) kputc(';', tmps); + kputs(line->d.id, tmps); + kh_put(strdict, tmph, line->d.id, &ret); + } + } + + // set QUAL to the max qual value. Not exactly correct, but good enough for now + if ( !bcf_float_is_missing(line->qual) ) + { + if ( bcf_float_is_missing(out->qual) || out->qual < line->qual ) out->qual = line->qual; + } + } + + // set ID + if ( !tmps->l ) kputs(".", tmps); + bcf_update_id(out_hdr, out, tmps->s); + + // set alleles + ma->nout_als = 0; + for (i=1; inals; i++) + { + if ( !al_idxs[i] ) continue; + ma->nout_als++; + + // Adjust the indexes, the allele map could be created for multiple collapsed records, + // some of which might be unused for this output line + int ir, j; + for (ir=0; irnreaders; ir++) + { + bcf1_t *line = maux_get_line(args,ir); + if ( !line ) continue; + for (j=1; jn_allele; j++) + { + int irec = ma->buf[ir].cur; + if ( ma->buf[ir].rec[irec].map[j]==i ) ma->buf[ir].rec[irec].map[j] = ma->nout_als; + } + } + } + // Expand the arrays and realloc the alleles string. Note that all alleles are in a single allocated block. + ma->nout_als++; + hts_expand0(char*, ma->nout_als, ma->mout_als, ma->out_als); + int k = 0; + for (i=0; inals; i++) + if ( i==0 || al_idxs[i] ) ma->out_als[k++] = strdup(ma->als[i]); + assert( k==ma->nout_als ); + normalize_alleles(ma->out_als, ma->nout_als); + bcf_update_alleles(out_hdr, out, (const char**) ma->out_als, ma->nout_als); + free(al_idxs); + for (i=0; inout_als; i++) free(ma->out_als[i]); +} + +void merge_filter(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + + int i, ret; + if ( args->filter_logic == FLT_LOGIC_REMOVE ) + { + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args, i); + if ( !line ) continue; + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + if ( bcf_has_filter(hdr, line, "PASS") ) break; + } + if ( inreaders ) + { + int flt_id = bcf_hdr_id2int(out_hdr, BCF_DT_ID, "PASS"); + bcf_add_filter(out_hdr, out, flt_id); + return; + } + } + + khiter_t kitr; + strdict_t *tmph = args->tmph; + kh_clear(strdict, tmph); + + out->d.n_flt = 0; + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args, i); + if ( !line ) continue; + + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + + int k; + for (k=0; kd.n_flt; k++) + { + const char *flt = hdr->id[BCF_DT_ID][line->d.flt[k]].key; + kitr = kh_get(strdict, tmph, flt); + if ( kitr == kh_end(tmph) ) + { + int id = bcf_hdr_id2int(out_hdr, BCF_DT_ID, flt); + if ( id==-1 ) error("Error: The filter is not defined in the header: %s\n", flt); + hts_expand(int,out->d.n_flt+1,out->d.m_flt,out->d.flt); + out->d.flt[out->d.n_flt] = id; + out->d.n_flt++; + kh_put(strdict, tmph, flt, &ret); + } + } + } + // Check if PASS is not mixed with other filters + if ( out->d.n_flt>1 ) + { + int id = bcf_hdr_id2int(out_hdr, BCF_DT_ID, "PASS"); + for (i=0; id.n_flt; i++) + if ( out->d.flt[i]==id ) break; + if ( id.n_flt ) + { + out->d.n_flt--; + for (; id.n_flt; i++) out->d.flt[i] = out->d.flt[i+1]; + } + } +} + +static void bcf_info_set_id(bcf1_t *line, bcf_info_t *info, int id, kstring_t *tmp_str) +{ + uint8_t *ptr = info->vptr - info->vptr_off; + bcf_dec_typed_int1(ptr, &ptr); + + tmp_str->l = 0; + bcf_enc_int1(tmp_str, id); + + if ( tmp_str->l == ptr - info->vptr + info->vptr_off ) + { + // the new id is represented with the same number of bytes + memcpy(info->vptr - info->vptr_off, tmp_str->s, tmp_str->l); + return; + } + + kputsn_(ptr, info->vptr - ptr, tmp_str); + info->vptr_off = tmp_str->l; + kputsn_(info->vptr, info->len << bcf_type_shift[info->type], tmp_str); + + info->vptr = (uint8_t*) tmp_str->s + info->vptr_off; + tmp_str->s = NULL; + tmp_str->m = 0; + tmp_str->l = 0; +} + +/* + * copy_string_field() - copy a comma-separated field + * @param src: source string + * @param isrc: index of the field to copy + * @param src_len: length of source string (excluding the terminating \0) + * @param dst: destination kstring (must be initialized with missing values, e.g. as ".") + * @param idst: index of the destination field + */ +int copy_string_field(char *src, int isrc, int src_len, kstring_t *dst, int idst) +{ + int ith_src = 0, start_src = 0; // i-th field in src string + while ( ith_srcl ) + { + if ( dst->s[start_dst]==',' ) { ith_dst++; } + start_dst++; + } + if ( ith_dst!=idst ) return -2; + int end_dst = start_dst; + while ( end_dstl && dst->s[end_dst]!=',' ) end_dst++; + + if ( end_dst - start_dst>1 || dst->s[start_dst]!='.' ) return 0; // do not overwrite non-empty values + + // Now start_dst and end_dst are indexes to the destination memory area + // which needs to be replaced with nsrc_cpy + // source bytes, end_dst points just after. + int ndst_shift = nsrc_cpy - (end_dst - start_dst); + int ndst_move = dst->l - end_dst + 1; // how many bytes must be moved (including \0) + if ( ndst_shift ) + { + ks_resize(dst, dst->l + ndst_shift + 1); // plus \0 + memmove(dst->s+end_dst+ndst_shift, dst->s+end_dst, ndst_move); + } + memcpy(dst->s+start_dst, src+start_src, nsrc_cpy); + dst->l += ndst_shift; + return 0; +} + +static void merge_AGR_info_tag(bcf_hdr_t *hdr, bcf1_t *line, bcf_info_t *info, int len, maux1_t *als, AGR_info_t *agr) +{ + int i; + if ( !agr->nbuf ) + { + if ( info->type==BCF_BT_INT8 || info->type==BCF_BT_INT16 || info->type==BCF_BT_INT32 || info->type==BCF_BT_FLOAT ) + { + agr->nbuf = 4 * agr->nvals; + hts_expand(uint8_t,agr->nbuf,agr->mbuf,agr->buf); + if ( info->type!=BCF_BT_FLOAT ) + { + int32_t *tmp = (int32_t*) agr->buf; + for (i=0; invals; i++) tmp[i] = bcf_int32_missing; + } + else + { + float *tmp = (float*) agr->buf; + for (i=0; invals; i++) bcf_float_set_missing(tmp[i]); + } + } + else if ( info->type==BCF_BT_CHAR ) + { + kstring_t tmp; tmp.l = 0; tmp.m = agr->mbuf; tmp.s = (char*)agr->buf; + kputc('.',&tmp); + for (i=1; invals; i++) kputs(",.",&tmp); + agr->mbuf = tmp.m; agr->nbuf = tmp.l; agr->buf = (uint8_t*)tmp.s; + } + else + error("Not ready for type [%d]: %s at %"PRId64"\n", info->type,agr->hdr_tag,(int64_t) line->pos+1); + } + + if ( info->type==BCF_BT_INT8 || info->type==BCF_BT_INT16 || info->type==BCF_BT_INT32 || info->type==BCF_BT_FLOAT ) + { + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int ifrom = len==BCF_VL_A ? 1 : 0; + #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ + type_t *src = (type_t *) info->vptr; \ + out_type_t *tgt = (out_type_t *) agr->buf; \ + int iori, inew; \ + for (iori=ifrom; iorin_allele; iori++) \ + { \ + if ( is_vector_end ) break; \ + if ( is_missing ) continue; \ + inew = als->map[iori] - ifrom; \ + tgt[inew] = *src; \ + src++; \ + } \ + } + switch (info->type) { + case BCF_BT_INT8: BRANCH(int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, int); break; + case BCF_BT_INT16: BRANCH(int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, int); break; + case BCF_BT_INT32: BRANCH(int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, int); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(*src), bcf_float_is_vector_end(*src), float); break; + default: fprintf(stderr,"TODO: %s:%d .. info->type=%d\n", __FILE__,__LINE__, info->type); exit(1); + } + #undef BRANCH + } + else + { + #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ + type_t *src = (type_t *) info->vptr; \ + out_type_t *tgt = (out_type_t *) agr->buf; \ + int iori,jori, inew,jnew; \ + for (iori=0; iorin_allele; iori++) \ + { \ + inew = als->map[iori]; \ + for (jori=0; jori<=iori; jori++) \ + { \ + jnew = als->map[jori]; \ + int kori = iori*(iori+1)/2 + jori; \ + if ( is_vector_end ) break; \ + if ( is_missing ) continue; \ + int knew = inew>jnew ? inew*(inew+1)/2 + jnew : jnew*(jnew+1)/2 + inew; \ + tgt[knew] = src[kori]; \ + } \ + if ( jori<=iori ) break; \ + } \ + } + switch (info->type) { + case BCF_BT_INT8: BRANCH(int8_t, src[kori]==bcf_int8_missing, src[kori]==bcf_int8_vector_end, int); break; + case BCF_BT_INT16: BRANCH(int16_t, src[kori]==bcf_int16_missing, src[kori]==bcf_int16_vector_end, int); break; + case BCF_BT_INT32: BRANCH(int32_t, src[kori]==bcf_int32_missing, src[kori]==bcf_int32_vector_end, int); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(src[kori]), bcf_float_is_vector_end(src[kori]), float); break; + default: fprintf(stderr,"TODO: %s:%d .. info->type=%d\n", __FILE__,__LINE__, info->type); exit(1); + } + #undef BRANCH + } + } + else + { + kstring_t tmp; tmp.l = agr->nbuf; tmp.m = agr->mbuf; tmp.s = (char*)agr->buf; + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int iori, ifrom = len==BCF_VL_A ? 1 : 0; + for (iori=ifrom; iorin_allele; iori++) + { + int ret = copy_string_field((char*)info->vptr, iori-ifrom, info->len, &tmp, als->map[iori]-ifrom); + if ( ret ) + error("Error at %s:%"PRId64": wrong number of fields in %s?\n", bcf_seqname(hdr,line),(int64_t) line->pos+1,agr->hdr_tag); + } + } + else + { + int iori,jori, inew,jnew; + for (iori=0; iorin_allele; iori++) + { + inew = als->map[iori]; + for (jori=0; jori<=iori; jori++) + { + jnew = als->map[jori]; + int kori = iori*(iori+1)/2 + jori; + int knew = bcf_alleles2gt(inew,jnew); + int ret = copy_string_field((char*)info->vptr, kori, info->len, &tmp, knew); + if ( ret ) + error("Error at %s:%"PRId64": wrong number of fields in %s?\n", bcf_seqname(hdr,line),(int64_t) line->pos+1,agr->hdr_tag); + } + } + } + agr->mbuf = tmp.m; agr->nbuf = tmp.l; agr->buf = (uint8_t*)tmp.s; + } +} + +void merge_info(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + + int i, j, ret; + khiter_t kitr; + strdict_t *tmph = args->tmph; + kh_clear(strdict, tmph); + + maux_t *ma = args->maux; + ma->nAGR_info = 0; + out->n_info = 0; + info_rules_reset(args); + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args,i); + if ( !line ) continue; + int irec = ma->buf[i].cur; + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + for (j=0; jn_info; j++) + { + bcf_info_t *inf = &line->d.info[j]; + + const char *key = hdr->id[BCF_DT_ID][inf->key].key; + // AC and AN are done in merge_format() after genotypes are done + if (!args->keep_AC_AN && + (key[0] == 'A' + && (key[1] == 'C' || key[1] == 'N') + && key[2] == 0)) + continue; + + int id = bcf_hdr_id2int(out_hdr, BCF_DT_ID, key); + if ( id==-1 ) error("Error: The INFO field is not defined in the header: %s\n", key); + + kitr = kh_get(strdict, tmph, key); // have we seen the tag in one of the readers? + int len = bcf_hdr_id2length(hdr,BCF_HL_INFO,inf->key); + if ( args->nrules ) + { + info_rule_t *rule = (info_rule_t*) bsearch(key, args->rules, args->nrules, sizeof(*args->rules), info_rules_comp_key); + if ( rule ) + { + maux1_t *als = ( len==BCF_VL_A || len==BCF_VL_G || len==BCF_VL_R ) ? &ma->buf[i].rec[irec] : NULL; + if ( info_rules_add_values(args, hdr, line, rule, als, len) ) continue; + } + } + + // Todo: Number=AGR tags should use the newer info_rules_* functions (info_rules_merge_first to be added) + // and merge_AGR_info_tag to be made obsolete. + if ( len==BCF_VL_A || len==BCF_VL_G || len==BCF_VL_R ) // Number=R,G,A requires special treatment + { + if ( kitr == kh_end(tmph) ) + { + // seeing this key for the first time + ma->nAGR_info++; + hts_expand0(AGR_info_t,ma->nAGR_info,ma->mAGR_info,ma->AGR_info); + kitr = kh_put(strdict, tmph, key, &ret); + kh_val(tmph,kitr) = ma->nAGR_info - 1; + ma->AGR_info[ma->nAGR_info-1].hdr_tag = key; + ma->AGR_info[ma->nAGR_info-1].type = bcf_hdr_id2type(hdr,BCF_HL_INFO,inf->key); + ma->AGR_info[ma->nAGR_info-1].nbuf = 0; // size of the buffer + switch (len) + { + case BCF_VL_A: ma->AGR_info[ma->nAGR_info-1].nvals = ma->nout_als - 1; break; + case BCF_VL_G: ma->AGR_info[ma->nAGR_info-1].nvals = bcf_alleles2gt(ma->nout_als-1,ma->nout_als-1)+1; break; + case BCF_VL_R: ma->AGR_info[ma->nAGR_info-1].nvals = ma->nout_als; break; + } + } + kitr = kh_get(strdict, tmph, key); + int idx = kh_val(tmph, kitr); + if ( idx<0 ) error("Error occurred while processing INFO tag \"%s\" at %s:%"PRId64"\n", key,bcf_seqname(hdr,line),(int64_t) line->pos+1); + merge_AGR_info_tag(hdr, line,inf,len,&ma->buf[i].rec[irec],&ma->AGR_info[idx]); + continue; + } + + if ( kitr == kh_end(tmph) ) + { + // Seeing this key for the first time. Although quite hacky, + // this is faster than anything else given the data structures.. + + hts_expand0(bcf_info_t,out->n_info+1,out->d.m_info,out->d.info); + out->d.info[out->n_info].key = id; + out->d.info[out->n_info].type = inf->type; + out->d.info[out->n_info].len = inf->len; + out->d.info[out->n_info].v1.i = inf->v1.i; + out->d.info[out->n_info].v1.f = inf->v1.f; + out->d.info[out->n_info].vptr_off = inf->vptr_off; + out->d.info[out->n_info].vptr_len = inf->vptr_len; + out->d.info[out->n_info].vptr_free = 1; + out->d.info[out->n_info].vptr = (uint8_t*) malloc(inf->vptr_len+inf->vptr_off); + memcpy(out->d.info[out->n_info].vptr,inf->vptr-inf->vptr_off, inf->vptr_len+inf->vptr_off); + out->d.info[out->n_info].vptr += inf->vptr_off; + if ( (args->output_type & FT_BCF) && id!=bcf_hdr_id2int(hdr, BCF_DT_ID, key) ) + bcf_info_set_id(out, &out->d.info[out->n_info], id, &args->tmps); + out->d.shared_dirty |= BCF1_DIRTY_INF; + out->n_info++; + kitr = kh_put(strdict, tmph, key, &ret); + kh_val(tmph,kitr) = -(out->n_info-1); // arbitrary negative value + } + } + } + for (i=0; inrules; i++) + args->rules[i].merger(args->out_hdr, out, &args->rules[i]); + for (i=0; inAGR_info; i++) + { + AGR_info_t *agr = &ma->AGR_info[i]; + bcf_update_info(out_hdr,out,agr->hdr_tag,agr->buf,agr->nvals,agr->type); + } +} + +void update_AN_AC(bcf_hdr_t *hdr, bcf1_t *line) +{ + int32_t an = 0, *tmp = (int32_t*) malloc(sizeof(int)*line->n_allele); + int ret = bcf_calc_ac(hdr, line, tmp, BCF_UN_FMT); + if ( ret>0 ) + { + int i; + for (i=0; in_allele; i++) an += tmp[i]; + bcf_update_info_int32(hdr, line, "AN", &an, 1); + bcf_update_info_int32(hdr, line, "AC", tmp+1, line->n_allele-1); + } + free(tmp); +} + +static inline int max_used_gt_ploidy(bcf_fmt_t *fmt, int nsmpl) +{ + int i,j, max_ploidy = 0; + + #define BRANCH(type_t, vector_end) { \ + type_t *ptr = (type_t*) fmt->p; \ + for (i=0; in; j++) \ + if ( ptr[j]==vector_end ) break; \ + if ( j==fmt->n ) \ + { \ + /* all fields were used */ \ + if ( max_ploidy < j ) max_ploidy = j; \ + break; \ + } \ + if ( max_ploidy < j ) max_ploidy = j; \ + ptr += fmt->n; \ + } \ + } + switch (fmt->type) + { + case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; + default: error("Unexpected case: %d\n", fmt->type); + } + #undef BRANCH + return max_ploidy; +} + +// Sets ma->laa to local indexes relevant for each sample or missing/vector_end. +// The indexes are with respect to the source indexes and must be translated as +// the very last step. +void init_local_alleles(args_t *args, bcf1_t *out, int ifmt_PL) +{ + bcf_srs_t *files = args->files; + maux_t *ma = args->maux; + int i,j,k,l, ismpl = 0, nlaa = 0; + static int warned = 0; + + hts_expand(double,out->n_allele,ma->ntmpd,ma->tmpd); // allele probabilities + hts_expand(int,out->n_allele,ma->ntmpi,ma->tmpi); // indexes of the sorted probabilities + + // Let map[] be the mapping from src to output idx. Then k2k[] is mapping from src allele idxs to src allele idxs + // reordered so that if in_allele,ma->nk2k,ma->k2k); + + // Determine local alleles: either take all that are present in the reader or use PL to determine the best + // subset for each sample. The alleles must be listed in the order of the alleles in the output file. + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = ma->fmt_map[files->nreaders*ifmt_PL+i]; + bcf1_t *line = maux_get_line(args, i); + int nsmpl = bcf_hdr_nsamples(hdr); + if ( line ) + { + if ( nlaa < line->n_allele - 1 ) + nlaa = line->n_allele - 1 <= args->local_alleles ? line->n_allele - 1 : args->local_alleles; + + for (j=0; jn_allele; j++) ma->k2k[j] = j; + + if ( line->n_allele <= args->local_alleles + 1 ) + { + // sort to the output order, insertion sort, ascending + int *map = ma->buf[i].rec[ma->buf[i].cur].map; + int *k2k = ma->k2k; + int tmp; + for (k=1; kn_allele; k++) + for (l=k; l>0 && map[k2k[l]] < map[k2k[l-1]]; l--) + tmp = k2k[l], k2k[l] = k2k[l-1], k2k[l-1] = tmp; + + // fewer than the allowed number of alleles, use all alleles from this file + for (j=0; jlaa + (1+args->local_alleles)*ismpl; + for (k=0; kn_allele; k++) ptr[k] = k2k[k]; + for (; k<=args->local_alleles; k++) ptr[k] = bcf_int32_vector_end; + ismpl++; + } + continue; + } + } + if ( !line || !fmt_ori ) + { + // no values, fill in missing values + for (j=0; jlaa + (1+args->local_alleles)*ismpl; + ptr[0] = bcf_int32_missing; + for (k=1; k<=args->local_alleles; k++) ptr[k] = bcf_int32_vector_end; + ismpl++; + } + continue; + } + + // there are more alternate alleles in the input files than is allowed on output, need to subset + if ( ifmt_PL==-1 ) + { + if ( !warned ) + fprintf(stderr,"Warning: local alleles are determined from FORMAT/PL but the tag is missing, cannot apply --local-alleles\n"); + warned = 1; + ma->nlaa = 0; + return; + } + + if ( !IS_VL_G(hdr, fmt_ori->id) ) error("FORMAT/PL must be defined as Number=G\n"); + if ( 2*fmt_ori->n != line->n_allele*(line->n_allele+1) ) error("Todo: haploid PL to LPL\n"); + + int *map = ma->buf[i].rec[ma->buf[i].cur].map; + double *allele_prob = ma->tmpd; + int *idx = ma->tmpi; + #define BRANCH(src_type_t, src_is_missing, src_is_vector_end, pl2prob_idx) { \ + src_type_t *src = (src_type_t*) fmt_ori->p; \ + for (j=0; jn_allele; k++) allele_prob[k] = 0; \ + for (k=0; kn_allele; k++) \ + for (l=0; l<=k; l++) \ + { \ + if ( src_is_missing || src_is_vector_end ) { src++; continue; } \ + double prob = ma->pl2prob[pl2prob_idx]; \ + allele_prob[k] += prob; \ + allele_prob[l] += prob; \ + src++; \ + } \ + /* insertion sort by allele probability, descending order, with the twist that REF (idx=0) always comes first */ \ + allele_prob++; idx[0] = -1; idx++; /* keep REF first */ \ + int si,sj,tmp; \ + for (si=0; sin_allele-1; si++) idx[si] = si; \ + for (si=1; sin_allele-1; si++) \ + for (sj=si; sj>0 && allele_prob[idx[sj]] > allele_prob[idx[sj-1]]; sj--) \ + tmp = idx[sj], idx[sj] = idx[sj-1], idx[sj-1] = tmp; \ + /*for debugging only: test order*/ \ + for (si=1; sin_allele-1; si++) \ + assert( allele_prob[idx[si-1]] >= allele_prob[idx[si]] ); \ + allele_prob--; idx--; /* this was to keep REF first */ \ + int32_t *ptr = ma->laa + (1+args->local_alleles)*ismpl; \ + ptr[0] = 0; \ + for (k=1; k<=args->local_alleles && kn_allele; k++) ptr[k] = idx[k]+1; \ + int kmax = k; \ + for (; k<=args->local_alleles; k++) ptr[k] = bcf_int32_vector_end; \ + /* insertion sort by indexes to the output order, ascending */ \ + for (k=1; k0 && map[ptr[l]] < map[ptr[l-1]]; l--) \ + tmp = ptr[l], ptr[l] = ptr[l-1], ptr[l-1] = tmp; \ + ismpl++; \ + } \ + } + switch (fmt_ori->type) + { + case BCF_BT_INT8: BRANCH( int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, *src); break; + case BCF_BT_INT16: BRANCH(int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, *src>=0 && *src=0 && *srctype); + } + #undef BRANCH + } + ma->nlaa = nlaa; +} + +void update_local_alleles(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + maux_t *ma = args->maux; + int i,j,k,ismpl=0,nsamples = bcf_hdr_nsamples(args->out_hdr); + for (i=0; inreaders; i++) + { + int irec = ma->buf[i].cur; + bcf_sr_t *reader = &files->readers[i]; + int nsmpl = bcf_hdr_nsamples(reader->header); + for (k=0; klaa + ismpl*(1+args->local_alleles); + int32_t *dst = ma->laa + ismpl*ma->nlaa; + j = 0; + if ( irec>=0 ) + { + for (; jnlaa; j++) + { + if ( src[j+1]==bcf_int32_missing ) dst[j] = bcf_int32_missing; + else if ( src[j+1]==bcf_int32_vector_end ) break; + else + dst[j] = ma->buf[i].rec[irec].map[src[j+1]]; + } + } + if ( j==0 ) dst[j++] = bcf_int32_missing; + for (; jnlaa; j++) src[j] = bcf_int32_vector_end; + ismpl++; + } + } + bcf_update_format_int32(args->out_hdr, out, "LAA", ma->laa, nsamples*ma->nlaa); +} + +void merge_GT(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + maux_t *ma = args->maux; + int i, ismpl = 0, nsamples = bcf_hdr_nsamples(out_hdr); + static int warned = 0; + + int nsize = 0; + for (i=0; inreaders; i++) + { + bcf_fmt_t *fmt = fmt_map[i]; + if ( !fmt ) continue; + int pld = max_used_gt_ploidy(fmt_map[i], bcf_hdr_nsamples(bcf_sr_get_header(args->files,i))); + if ( nsize < pld ) nsize = pld; + } + if ( nsize==0 ) nsize = 1; + + size_t msize = sizeof(int32_t)*nsize*nsamples; + if ( msize > 2147483647 ) + { + if ( !warned ) fprintf(stderr,"Warning: Too many genotypes at %s:%"PRId64", requires %zu bytes, skipping.\n", bcf_seqname(out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Could not allocate %zu bytes\n",msize); + ma->ntmp_arr = msize; + } + memset(ma->smpl_ploidy,0,nsamples*sizeof(int)); + + int default_gt = args->missing_to_ref ? bcf_gt_unphased(0) : bcf_gt_missing; + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + int32_t *tmp = (int32_t *) ma->tmp_arr + ismpl*nsize; + int irec = ma->buf[i].cur; + + int j,k; + if ( !fmt_ori ) + { + // missing values: assume maximum ploidy + for (j=0; jsmpl_ploidy[ismpl+j]++; } + tmp += nsize; + } + ismpl += bcf_hdr_nsamples(hdr); + continue; + } + + #define BRANCH(type_t, vector_end) { \ + type_t *p_ori = (type_t*) fmt_ori->p; \ + if ( !ma->buf[i].rec[irec].als_differ ) \ + { \ + /* the allele numbering is unchanged */ \ + for (j=0; jn; k++) \ + { \ + if ( p_ori[k]==vector_end ) break; /* smaller ploidy */ \ + ma->smpl_ploidy[ismpl+j]++; \ + if ( bcf_gt_is_missing(p_ori[k]) ) tmp[k] = 0; /* missing allele */ \ + else tmp[k] = p_ori[k]; \ + } \ + for (; kn; \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + continue; \ + } \ + /* allele numbering needs to be changed */ \ + for (j=0; jn; k++) \ + { \ + if ( p_ori[k]==vector_end ) break; /* smaller ploidy */ \ + ma->smpl_ploidy[ismpl+j]++; \ + if ( bcf_gt_is_missing(p_ori[k]) ) tmp[k] = 0; /* missing allele */ \ + else \ + { \ + int al = (p_ori[k]>>1) - 1; \ + al = al<=0 ? al + 1 : ma->buf[i].rec[irec].map[al] + 1; \ + tmp[k] = (al << 1) | ((p_ori[k])&1); \ + } \ + } \ + for (; kn; \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + } + switch (fmt_ori->type) + { + case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; + default: error("Unexpected case: %d\n", fmt_ori->type); + } + #undef BRANCH + } + bcf_update_format_int32(out_hdr, out, "GT", (int32_t*)ma->tmp_arr, nsamples*nsize); +} + +void merge_format_string(args_t *args, const char *key, bcf_fmt_t **fmt_map, bcf1_t *out, int length, int nsize) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + maux_t *ma = args->maux; + int i,j, nsamples = bcf_hdr_nsamples(out_hdr); + static int warned = 0; + + // initialize empty strings, a dot for each value, e.g. ".,.,." + int nmax = 0; + for (i=0; istr[i]; + if ( length==BCF_VL_FIXED || length==BCF_VL_VAR ) + { + str->l = 1; + ks_resize(str, str->l+1); + str->s[0] = '.'; + } + else + { + str->l = nsize*2 - 1; + ks_resize(str, str->l+1); + str->s[0] = '.'; + for (j=1; js[j*2-1] = ',', str->s[j*2] = '.'; + } + str->s[str->l] = 0; + if ( nmax < str->l ) nmax = str->l; + } + + // fill in values for each sample + int ismpl = 0; + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + if ( !fmt_ori ) + { + // the field is not present in this file + ismpl += bcf_hdr_nsamples(hdr); + continue; + } + + bcf1_t *line = maux_get_line(args, i); + int irec = ma->buf[i].cur; + char *src = (char*) fmt_ori->p; + + if ( length==BCF_VL_FIXED || length==BCF_VL_VAR || (line->n_allele==out->n_allele && !ma->buf[i].rec[irec].als_differ) ) + { + // alleles unchanged, copy over + for (j=0; jstr[ismpl++]; + str->l = 0; + kputsn(src, fmt_ori->n, str); + if ( nmax < str->l ) nmax = str->l; + src += fmt_ori->n; + } + continue; + } + // NB, what is below is not the fastest way, copy_string_field() keeps + // finding the indexes repeatedly at multiallelic sites + if ( length==BCF_VL_A || length==BCF_VL_R ) + { + int ifrom = length==BCF_VL_A ? 1 : 0; + for (j=0; jstr[ismpl++]; + int iori,inew; + for (iori=ifrom; iorin_allele; iori++) + { + inew = ma->buf[i].rec[irec].map[iori] - ifrom; + int ret = copy_string_field(src, iori - ifrom, fmt_ori->size, str, inew); + if ( ret<-1 ) error("[E::%s] fixme: internal error at %s:%"PRId64" .. %d\n",__func__,bcf_seqname(hdr,line),(int64_t) line->pos+1,ret); + } + if ( nmax < str->l ) nmax = str->l; + src += fmt_ori->size; + } + continue; + } + assert( length==BCF_VL_G ); + error("[E::%s] Merging of Number=G FORMAT strings (in your case FORMAT/%s) is not supported yet, sorry!\n" + "Please open an issue on github if this feature is essential for you. However, note that using FORMAT strings is not\n" + "a good idea in general - it is slow to parse and does not compress well, it is better to use integer codes instead.\n" + "If you don't really need it, use `bcftools annotate -x` to remove the annotation before merging.\n", __func__,key); + } + // update the record + size_t msize = nsamples*nmax; + if ( msize > 2147483647 ) + { + if ( !warned ) fprintf(stderr,"Warning: The row size is too big for FORMAT/%s at %s:%"PRId64", requires %zu bytes, skipping.\n", key,bcf_seqname(out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Could not allocate %zu bytes\n",msize); + ma->ntmp_arr = msize; + } + char *tgt = (char*) ma->tmp_arr; + for (i=0; istr[i].s, ma->str[i].l); + if ( ma->str[i].l < nmax ) memset(tgt + ma->str[i].l, 0, nmax - ma->str[i].l); + tgt += nmax; + } + bcf_update_format_char(out_hdr, out, key, (float*)ma->tmp_arr, nsamples*nmax); +} + +// Note: only diploid Number=G tags only for now +void merge_localized_numberG_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out, int irdr) +{ + int i,j,k, nsamples = bcf_hdr_nsamples(args->out_hdr); + bcf_srs_t *files = args->files; + maux_t *ma = args->maux; + bcf_fmt_t *fmt = fmt_map[irdr]; + const char *key = files->readers[irdr].header->id[BCF_DT_ID][fmt_map[irdr]->id].key; + size_t nsize = (ma->nlaa+1)*(ma->nlaa+2)/2; // max number of Number=G localized fields + size_t msize = sizeof(float)>sizeof(int32_t) ? sizeof(float) : sizeof(int32_t); + msize *= nsamples*nsize; + if ( msize > 2147483647 ) + { + static int warned = 0; + if ( !warned ) fprintf(stderr,"Warning: The row size is too big for FORMAT/%s at %s:%"PRId64", requires %zu bytes, skipping.\n", key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Failed to allocate %zu bytes at %s:%"PRId64" for FORMAT/%s\n", msize,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,key); + ma->ntmp_arr = msize; + } + int ismpl = 0; + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + bcf1_t *line = maux_get_line(args, i); + int nsmpl = bcf_hdr_nsamples(hdr); + + if ( !fmt_ori ) + { + // fill missing values + #define BRANCH(tgt_type_t, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; jtmp_arr + ismpl*nsize; \ + tgt_set_missing; \ + for (k=1; ktype) + { + case BCF_BT_INT8: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; + default: error("Unexpected case: %d, %s\n", fmt->type, key); + } + #undef BRANCH + continue; + } + if ( 2*fmt_ori->n!=line->n_allele*(line->n_allele+1) ) error("Todo: localization of missing or haploid Number=G tags\n"); + + // localize + #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; jp + j*fmt_ori->n; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + int *laa = ma->laa + (1+args->local_alleles)*ismpl; \ + int ii,ij,tgt_idx = 0; \ + for (ii=0; ii<=ma->nlaa; ii++) \ + { \ + if ( laa[ii]==bcf_int32_missing || laa[ii]==bcf_int32_vector_end ) break; \ + for (ij=0; ij<=ii; ij++) \ + { \ + int src_idx = bcf_alleles2gt(laa[ii],laa[ij]); \ + if ( src_is_missing ) tgt_set_missing; \ + else if ( src_is_vector_end ) break; \ + else tgt[tgt_idx] = src[src_idx]; \ + tgt_idx++; \ + } \ + } \ + if ( !tgt_idx ) { tgt_set_missing; tgt_idx++; } \ + for (; tgt_idxtype) + { + case BCF_BT_INT8: BRANCH(int32_t, int8_t, src[src_idx]==bcf_int8_missing, src[src_idx]==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, src[src_idx]==bcf_int16_missing, src[src_idx]==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, src[src_idx]==bcf_int32_missing, src[src_idx]==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(src[src_idx]), bcf_float_is_vector_end(src[src_idx]), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; + default: error("Unexpected case: %d, %s\n", fmt_ori->type, key); + } + #undef BRANCH + } + args->tmps.l = 0; + kputc('L',&args->tmps); + kputs(key,&args->tmps); + if ( fmt_map[irdr]->type==BCF_BT_FLOAT ) + bcf_update_format_float(args->out_hdr, out, args->tmps.s, (float*)ma->tmp_arr, nsamples*nsize); + else + bcf_update_format_int32(args->out_hdr, out, args->tmps.s, (int32_t*)ma->tmp_arr, nsamples*nsize); + ma->laa_dirty = 1; +} +void merge_localized_numberAR_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out, int irdr) +{ + int i,j,k, nsamples = bcf_hdr_nsamples(args->out_hdr); + bcf_srs_t *files = args->files; + maux_t *ma = args->maux; + bcf_fmt_t *fmt = fmt_map[irdr]; + const char *key = files->readers[irdr].header->id[BCF_DT_ID][fmt->id].key; + size_t nsize = IS_VL_R(files->readers[irdr].header, fmt->id) ? ma->nlaa + 1 : ma->nlaa; + size_t msize = sizeof(float)>sizeof(int32_t) ? sizeof(float) : sizeof(int32_t); + msize *= nsamples*nsize; + if ( msize > 2147483647 ) + { + static int warned = 0; + if ( !warned ) fprintf(stderr,"Warning: The row size is too big for FORMAT/%s at %s:%"PRId64", requires %zu bytes, skipping.\n", key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Failed to allocate %zu bytes at %s:%"PRId64" for FORMAT/%s\n", msize,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,key); + ma->ntmp_arr = msize; + } + int ismpl = 0, ibeg = IS_VL_R(files->readers[irdr].header, fmt->id) ? 0 : 1;; + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + int nsmpl = bcf_hdr_nsamples(hdr); + + if ( !fmt_ori ) + { + // fill missing values + #define BRANCH(tgt_type_t, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; jtmp_arr + ismpl*nsize; \ + tgt_set_missing; \ + for (k=1; ktype) + { + case BCF_BT_INT8: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; + default: error("Unexpected case: %d, %s\n", fmt->type, key); + } + #undef BRANCH + continue; + } + + // localize + #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; jp + j*fmt_ori->n; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + int *laa = ma->laa + (1+args->local_alleles)*ismpl; \ + int ii,tgt_idx = 0; \ + for (ii=ibeg; ii<=ma->nlaa; ii++) \ + { \ + if ( laa[ii]==bcf_int32_missing || laa[ii]==bcf_int32_vector_end ) break; \ + int src_idx = laa[ii] - ibeg; \ + if ( src_is_missing ) tgt_set_missing; \ + else if ( src_is_vector_end ) break; \ + else tgt[tgt_idx] = src[src_idx]; \ + tgt_idx++; \ + } \ + if ( !tgt_idx ) { tgt_set_missing; tgt_idx++; } \ + for (; tgt_idxtype) + { + case BCF_BT_INT8: BRANCH(int32_t, int8_t, src[src_idx]==bcf_int8_missing, src[src_idx]==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, src[src_idx]==bcf_int16_missing, src[src_idx]==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, src[src_idx]==bcf_int32_missing, src[src_idx]==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(src[src_idx]), bcf_float_is_vector_end(src[src_idx]), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; + default: error("Unexpected case: %d, %s\n", fmt_ori->type, key); + } + #undef BRANCH + } + args->tmps.l = 0; + kputc('L',&args->tmps); + kputs(key,&args->tmps); + if ( fmt_map[irdr]->type==BCF_BT_FLOAT ) + bcf_update_format_float(args->out_hdr, out, args->tmps.s, (float*)ma->tmp_arr, nsamples*nsize); + else + bcf_update_format_int32(args->out_hdr, out, args->tmps.s, (int32_t*)ma->tmp_arr, nsamples*nsize); + ma->laa_dirty = 1; +} +void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + maux_t *ma = args->maux; + int i, ismpl = 0, nsamples = bcf_hdr_nsamples(out_hdr); + static int warned = 0; + + const char *key = NULL; + size_t nsize = 0, length = BCF_VL_FIXED; + int type = -1; + for (i=0; inreaders; i++) + { + if ( !maux_get_line(args,i) ) continue; + if ( !fmt_map[i] ) continue; + if ( !key ) key = files->readers[i].header->id[BCF_DT_ID][fmt_map[i]->id].key; + type = fmt_map[i]->type; + if ( IS_VL_G(files->readers[i].header, fmt_map[i]->id) ) + { + length = BCF_VL_G; + nsize = out->n_allele*(out->n_allele + 1)/2; + break; + } + if ( IS_VL_A(files->readers[i].header, fmt_map[i]->id) ) + { + length = BCF_VL_A; + nsize = out->n_allele - 1; + break; + } + if ( IS_VL_R(files->readers[i].header, fmt_map[i]->id) ) + { + length = BCF_VL_R; + nsize = out->n_allele; + break; + } + if ( fmt_map[i]->n > nsize ) nsize = fmt_map[i]->n; + } + if ( ma->nlaa && length!=BCF_VL_FIXED ) + { + if ( length==BCF_VL_G ) merge_localized_numberG_format_field(args,fmt_map,out,i); + else if ( length==BCF_VL_A || length==BCF_VL_R ) merge_localized_numberAR_format_field(args,fmt_map,out,i); + return; + } + + if ( type==BCF_BT_CHAR ) + { + merge_format_string(args, key, fmt_map, out, length, nsize); + return; + } + + size_t msize = sizeof(float)>sizeof(int32_t) ? sizeof(float) : sizeof(int32_t); + msize *= nsamples*nsize; + if ( msize > 2147483647 ) + { + if ( !warned ) fprintf(stderr,"Warning: The row size is too big for FORMAT/%s at %s:%"PRId64", requires %zu bytes, skipping.\n", key,bcf_seqname(out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Failed to allocate %zu bytes at %s:%"PRId64" for FORMAT/%s\n", msize,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,key); + ma->ntmp_arr = msize; + } + + // Fill the temp array for all samples by collecting values from all files + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + bcf1_t *line = maux_get_line(args, i); + int irec = ma->buf[i].cur; + + if ( fmt_ori ) + { + type = fmt_ori->type; + int nals_ori = line->n_allele; + if ( length==BCF_VL_G ) + { + // if all fields are missing then n==1 is valid + if ( fmt_ori->n!=1 && fmt_ori->n != nals_ori*(nals_ori+1)/2 && fmt_map[i]->n != nals_ori ) + error("Incorrect number of FORMAT/%s values at %s:%"PRId64", cannot merge. The tag is defined as Number=G, but found\n" + "%d values and %d alleles. See also http://samtools.github.io/bcftools/howtos/FAQ.html#incorrect-nfields\n", + key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,fmt_ori->n,nals_ori); + } + else if ( length==BCF_VL_A ) + { + if ( fmt_ori->n!=1 && fmt_ori->n != nals_ori-1 ) + error("Incorrect number of FORMAT/%s values at %s:%"PRId64", cannot merge. The tag is defined as Number=A, but found\n" + "%d values and %d alleles. See also http://samtools.github.io/bcftools/howtos/FAQ.html#incorrect-nfields\n", + key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,fmt_ori->n,nals_ori); + } + else if ( length==BCF_VL_R ) + { + if ( fmt_ori->n!=1 && fmt_ori->n != nals_ori ) + error("Incorrect number of FORMAT/%s values at %s:%"PRId64", cannot merge. The tag is defined as Number=R, but found\n" + "%d values and %d alleles. See also http://samtools.github.io/bcftools/howtos/FAQ.html#incorrect-nfields\n", + key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,fmt_ori->n,nals_ori); + } + } + + // set the values + #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + int j, l, k; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + if ( !fmt_ori ) \ + { \ + /* the field is not present in this file, set missing values */ \ + for (j=0; jp; \ + if ( (length!=BCF_VL_G && length!=BCF_VL_A && length!=BCF_VL_R) || (line->n_allele==out->n_allele && !ma->buf[i].rec[irec].als_differ) ) \ + { \ + /* alleles unchanged, copy over */ \ + for (j=0; jn; l++) \ + { \ + if ( src_is_vector_end ) break; \ + else if ( src_is_missing ) tgt_set_missing; \ + else *tgt = *src; \ + tgt++; src++; \ + } \ + for (k=l; kn - l; \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + continue; \ + } \ + /* allele numbering needs to be changed */ \ + if ( length==BCF_VL_G ) \ + { \ + /* Number=G tags */ \ + for (j=0; jtmp_arr + (ismpl+j)*nsize; \ + src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ + if ( (src_is_missing && fmt_ori->n==1) || (++src && src_is_vector_end) ) \ + { \ + /* tag with missing value "." */ \ + tgt_set_missing; \ + for (l=1; lsmpl_ploidy[ismpl+j]==1 ? out->n_allele : out->n_allele*(out->n_allele + 1)/2; \ + for (l=0; lsmpl_ploidy[ismpl+j]==1 ) \ + { \ + /* Haploid */ \ + int iori, inew; \ + for (iori=0; iorin_allele; iori++) \ + { \ + inew = ma->buf[i].rec[irec].map[iori]; \ + src = (src_type_t*) fmt_ori->p + j*fmt_ori->n + iori; \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + inew; \ + if ( src_is_vector_end ) break; \ + if ( src_is_missing ) tgt_set_missing; \ + else *tgt = *src; \ + } \ + } \ + else \ + { \ + /* Diploid */ \ + int iori,jori, inew,jnew; \ + for (iori=0; iorin_allele; iori++) \ + { \ + inew = ma->buf[i].rec[irec].map[iori]; \ + for (jori=0; jori<=iori; jori++) \ + { \ + jnew = ma->buf[i].rec[irec].map[jori]; \ + int kori = iori*(iori+1)/2 + jori; \ + int knew = inew>jnew ? inew*(inew+1)/2 + jnew : jnew*(jnew+1)/2 + inew; \ + src = (src_type_t*) fmt_ori->p + j*fmt_ori->n + kori; \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + knew; \ + if ( src_is_vector_end ) \ + { \ + iori = line->n_allele; \ + break; \ + } \ + if ( src_is_missing ) tgt_set_missing; \ + else *tgt = *src; \ + } \ + } \ + } \ + } \ + } \ + else \ + { \ + /* Number=A or Number=R tags */ \ + int ifrom = length==BCF_VL_A ? 1 : 0; \ + for (j=0; jtmp_arr + (ismpl+j)*nsize; \ + src = (src_type_t*) (fmt_ori->p + j*fmt_ori->size); \ + if ( (src_is_missing && fmt_ori->n==1) || (++src && src_is_vector_end) ) \ + { \ + /* tag with missing value "." */ \ + tgt_set_missing; \ + for (l=1; lp + j*fmt_ori->size); \ + for (l=0; ln_allele; iori++) \ + { \ + inew = ma->buf[i].rec[irec].map[iori] - ifrom; \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + inew; \ + if ( src_is_vector_end ) break; \ + if ( src_is_missing ) tgt_set_missing; \ + else *tgt = *src; \ + src++; \ + } \ + } \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + } + switch (type) + { + case BCF_BT_INT8: BRANCH(int32_t, int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(*src), bcf_float_is_vector_end(*src), bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; + default: error("Unexpected case: %d, %s\n", type, key); + } + #undef BRANCH + } + if ( type==BCF_BT_FLOAT ) + bcf_update_format_float(out_hdr, out, key, (float*)ma->tmp_arr, nsamples*nsize); + else + bcf_update_format_int32(out_hdr, out, key, (int32_t*)ma->tmp_arr, nsamples*nsize); +} + +void merge_format(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + maux_t *ma = args->maux; + if ( !ma->nfmt_map ) + { + ma->nfmt_map = 2; + ma->fmt_map = (bcf_fmt_t**) calloc(ma->nfmt_map*files->nreaders, sizeof(bcf_fmt_t*)); + } + else + memset(ma->fmt_map, 0, ma->nfmt_map*files->nreaders*sizeof(bcf_fmt_t**)); + + khiter_t kitr; + strdict_t *tmph = args->tmph; + kh_clear(strdict, tmph); + int i, j, ret, has_GT = 0, has_PL = -1, max_ifmt = 0; // max fmt index + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args,i); + if ( !line ) continue; + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + for (j=0; jn_fmt; j++) + { + // Wat this tag already seen? + bcf_fmt_t *fmt = &line->d.fmt[j]; + const char *key = hdr->id[BCF_DT_ID][fmt->id].key; + kitr = kh_get(strdict, tmph, key); + + int ifmt; + if ( kitr != kh_end(tmph) ) + ifmt = kh_value(tmph, kitr); // seen + else + { + // new FORMAT tag + if ( key[0]=='G' && key[1]=='T' && key[2]==0 ) { has_GT = 1; ifmt = 0; } + else + { + ifmt = ++max_ifmt; + if ( max_ifmt >= ma->nfmt_map ) + { + ma->fmt_map = (bcf_fmt_t**) realloc(ma->fmt_map, sizeof(bcf_fmt_t*)*(max_ifmt+1)*files->nreaders); + memset(ma->fmt_map+ma->nfmt_map*files->nreaders, 0, (max_ifmt-ma->nfmt_map+1)*files->nreaders*sizeof(bcf_fmt_t*)); + ma->nfmt_map = max_ifmt+1; + } + if ( key[0]=='P' && key[1]=='L' && key[2]==0 ) { has_PL = ifmt; } + } + kitr = kh_put(strdict, tmph, key, &ret); + kh_value(tmph, kitr) = ifmt; + } + ma->fmt_map[ifmt*files->nreaders+i] = fmt; + } + // Check if the allele numbering must be changed + int irec = ma->buf[i].cur; + for (j=1; jn_allele; j++) + if ( ma->buf[i].rec[irec].map[j]!=j ) break; + ma->buf[i].rec[irec].als_differ = j==line->n_allele ? 0 : 1; + } + + if ( args->local_alleles ) + { + ma->laa_dirty = ma->nlaa = 0; + if ( out->n_allele > args->local_alleles + 1 ) init_local_alleles(args, out, has_PL); + } + + out->n_sample = bcf_hdr_nsamples(out_hdr); + if ( has_GT ) + merge_GT(args, ma->fmt_map, out); + if ( !args->keep_AC_AN ) + update_AN_AC(out_hdr, out); + + for (i=1; i<=max_ifmt; i++) + merge_format_field(args, &ma->fmt_map[i*files->nreaders], out); + + if ( ma->laa_dirty ) + update_local_alleles(args, out); + + out->d.indiv_dirty = 1; +} + +void gvcf_set_alleles(args_t *args) +{ + int i,k; + bcf_srs_t *files = args->files; + maux_t *maux = args->maux; + gvcf_aux_t *gaux = maux->gvcf; + for (i=0; inals; i++) + { + free(maux->als[i]); + maux->als[i] = NULL; + } + maux->nals = 0; + + for (i=0; inreaders; i++) + { + if ( !gaux[i].active ) continue; + bcf1_t *line = maux_get_line(args, i); + if ( !line ) continue; + int irec = maux->buf[i].cur; + + hts_expand(int, line->n_allele, maux->buf[i].rec[irec].mmap, maux->buf[i].rec[irec].map); + if ( !maux->nals ) // first record, copy the alleles to the output + { + maux->nals = line->n_allele; + hts_expand0(char*, maux->nals, maux->mals, maux->als); + hts_expand0(int, maux->nals, maux->ncnt, maux->cnt); + for (k=0; knals; k++) + { + if ( maux->als[k] ) free(maux->als[k]); + maux->als[k] = strdup(line->d.allele[k]); + maux->buf[i].rec[irec].map[k] = k; + } + } + else + { + maux->als = merge_alleles(line->d.allele, line->n_allele, maux->buf[i].rec[irec].map, maux->als, &maux->nals, &maux->mals); + if ( !maux->als ) + { + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,i); + error("Failed to merge alleles at %s:%"PRId64"\n",bcf_seqname(hdr,line),(int64_t) line->pos+1); + } + } + } +} + +/* + Output staged gVCF blocks, end is the last position of the block. Assuming + gaux[i].active flags are set and maux_get_line returns correct lines. + Both start,end coordinates are 0-based. +*/ +void gvcf_write_block(args_t *args, int start, int end) +{ + int i; + maux_t *maux = args->maux; + gvcf_aux_t *gaux = maux->gvcf; + assert(gaux); + + // Update POS + int min = INT_MAX; // the minimum active gVCF INFO/END (0-based) + char ref = 'N'; + for (i=0; ifiles->nreaders; i++) + { + if ( !gaux[i].active ) continue; + if ( ref=='N' && gaux[i].line->pos==start ) ref = gaux[i].line->d.allele[0][0]; + gaux[i].line->pos = start; + } + for (i=0; ifiles->nreaders; i++) + { + if ( !gaux[i].active ) continue; + if ( gaux[i].end < start ) + { + gaux[i].active = 0; + maux->buf[i].cur = -1; + continue; + } + gaux[i].line->d.allele[0][0] = ref; + if ( min > gaux[i].end ) min = gaux[i].end; + } + // Check for valid gVCF blocks in this region + if ( min==INT_MAX ) // this probably should not happen + { + assert(0); + maux->gvcf_min = 0; + return; + } + + bcf1_t *out = args->out_line; + + gvcf_set_alleles(args); + + // Merge the staged lines + merge_chrom2qual(args, out); + merge_filter(args, out); + merge_info(args, out); + merge_format(args, out); + + if ( args->gvcf_fai && out->d.allele[0][0]=='N' ) + { + int slen = 0; + char *seq = faidx_fetch_seq(args->gvcf_fai,maux->chr,out->pos,out->pos,&slen); + if (slen) + { + out->d.allele[0][0] = seq[0]; + free(seq); + } + } + + // Update END boundary + if ( end > start ) + { + end++; + bcf_update_info_int32(args->out_hdr, out, "END", &end, 1); + } + else + bcf_update_info_int32(args->out_hdr, out, "END", NULL, 0); + if ( bcf_write1(args->out_fh, args->out_hdr, out)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + bcf_clear1(out); + + + // Inactivate blocks which do not extend beyond END and find new gvcf_min + min = INT_MAX; + for (i=0; ifiles->nreaders; i++) + { + if ( !gaux[i].active ) continue; + if ( gaux[i].end < end ) + { + gaux[i].active = 0; + maux->buf[i].cur = -1; + continue; + } + // next min END position bigger than the current one + if ( maux->gvcf_min < gaux[i].end+1 && min > gaux[i].end+1 ) min = gaux[i].end + 1; + } + maux->gvcf_min = min==INT_MAX ? 0 : min; +} + +/* + Flush staged gVCF blocks. Flush everything if there are no more lines + (done=1) or if there is a new chromosome. If still on the same chromosome, + all hanging blocks must be ended by creating new records: + A + 1 END=10 + B + 3 END=7 + C + 3 END=5 + out + 1 END=2 A . . + 3 END=5 A B C + 6 END=7 A B . + 8 END=10 A . . + +*/ +void gvcf_flush(args_t *args, int done) +{ + int i; + maux_t *maux = args->maux; + + if ( !maux->chr ) return; // first time here, nothing to flush + + int flush_until = INT_MAX; + if ( !done ) + { + // Get current position and chromosome + for (i=0; in; i++) + if ( bcf_sr_has_line(maux->files,i) ) break; + bcf1_t *line = bcf_sr_get_line(maux->files,i); + bcf_hdr_t *hdr = bcf_sr_get_header(maux->files,i); + + if ( !strcmp(maux->chr,bcf_seqname(hdr,line)) ) flush_until = line->pos; // still on the same chr + } + + // When called on a region, trim the blocks accordingly + int start = maux->gvcf_break>=0 ? maux->gvcf_break + 1 : maux->pos; // the start of a new gvcf block to output + if ( args->regs ) + { + int rstart = -1, rend = -1; + if ( regidx_overlap(args->regs,maux->chr,start,flush_until,args->regs_itr) ) + { + // In case there are multiple regions, we treat them as one + rstart = args->regs_itr->beg; + while ( regitr_overlap(args->regs_itr) ) rend = args->regs_itr->end; + } + if ( rstart > start ) start = rstart; + if ( rend < flush_until ) flush_until = rend+1; + } + + // output all finished blocks + while ( maux->gvcf_min && start < flush_until ) + { + // does the block end before the new line or is it interrupted? + int tmp = maux->gvcf_min < flush_until ? maux->gvcf_min : flush_until; + if ( start > tmp-1 ) break; + gvcf_write_block(args,start,tmp-1); // gvcf_min is 1-based, passing 0-based coordinates + start = tmp; + } +} + +static inline int is_gvcf_block(bcf1_t *line) +{ + if ( line->rlen<=1 ) return 0; + if ( strlen(line->d.allele[0])==line->rlen ) return 0; + if ( line->n_allele==1 ) return 1; + + int i; + for (i=1; in_allele; i++) + { + if ( !strcmp(line->d.allele[i],"<*>") ) return 1; + if ( !strcmp(line->d.allele[i],"") ) return 1; + if ( !strcmp(line->d.allele[i],"") ) return 1; + } + return 0; +} + +// Lines can come with any combination of variant types. We use a subset of types defined in vcf.h +// but shift by two bits to account for VCF_REF defined as 0 (design flaw in vcf.h, my fault) and +// to accommodate for VCF_GVCF_REF defined below +static const int + snp_mask = (VCF_SNP<<2)|(VCF_MNP<<2), + indel_mask = VCF_INDEL<<2, + ins_mask = VCF_INS<<2, + del_mask = VCF_DEL<<2, + ref_mask = 2; + +/* + Check incoming lines for new gVCF blocks, set pointer to the current source + buffer (gvcf or readers). In contrast to gvcf_flush, this function can be + called only after maux_reset as it relies on updated maux buffers. + The coordinate is 0-based +*/ +void gvcf_stage(args_t *args, int pos) +{ + maux_t *maux = args->maux; + gvcf_aux_t *gaux = maux->gvcf; + bcf_srs_t *files = args->files; + int32_t *end = (int32_t*) maux->tmp_arr; + int i, nend = maux->ntmp_arr / sizeof(int32_t); + + maux->gvcf_break = -1; + maux->gvcf_min = INT_MAX; + for (i=0; inreaders; i++) + { + if ( gaux[i].active && gaux[i].end < pos ) gaux[i].active = 0; + if ( gaux[i].active ) + { + // gvcf block should not overlap with another record + if ( maux->gvcf_min > gaux[i].end+1 ) maux->gvcf_min = gaux[i].end + 1; + maux->buf[i].beg = 0; + maux->buf[i].end = 1; + maux->buf[i].cur = 0; + continue; + } + + // Does any of the lines have END set? It is enough to check only the + // first line, there should be no duplicate records with END in gVCF + + if ( maux->buf[i].beg==maux->buf[i].end ) continue; // no new record + + int irec = maux->buf[i].beg; + bcf_hdr_t *hdr = bcf_sr_get_header(files, i); + bcf1_t *line = args->files->readers[i].buffer[irec]; + int ret = is_gvcf_block(line) ? bcf_get_info_int32(hdr,line,"END",&end,&nend) : 0; + if ( ret==1 ) + { + if ( end[0] == line->pos + 1 ) // POS and INFO/END are identical, treat as if a normal w/o INFO/END + { + maux->gvcf_break = line->pos; + continue; + } + if ( end[0] <= line->pos ) error("Error: Incorrect END at %s:%"PRId64" .. END=%d\n", bcf_seqname(hdr,line),(int64_t) line->pos+1,end[0]); + + // END is set, this is a new gVCF block. Cache this line in gaux[i] and swap with + // an empty record: the gaux line must be kept until we reach its END. + + gaux[i].active = 1; + gaux[i].end = end[0] - 1; + SWAP(bcf1_t*,args->files->readers[i].buffer[irec],gaux[i].line); + gaux[i].line->pos = pos; + + maux->buf[i].lines = &gaux[i].line; + maux->buf[i].beg = 0; + maux->buf[i].end = 1; + maux->buf[i].cur = 0; + + // Set the rid,pos of the swapped line in the buffer or else the + // synced reader will have a problem with the next line + // + args->files->readers[i].buffer[irec]->rid = maux->buf[i].rid; + args->files->readers[i].buffer[irec]->pos = maux->pos; + + // Update block offsets + if ( maux->gvcf_min > gaux[i].end+1 ) maux->gvcf_min = gaux[i].end + 1; + } + else + maux->gvcf_break = line->pos; // must break the gvcf block + } + maux->ntmp_arr = nend * sizeof(int32_t); + maux->tmp_arr = end; + if ( maux->gvcf_min==INT_MAX ) maux->gvcf_min = 0; +} + + +void debug_buffers(FILE *fp, bcf_srs_t *files); +void debug_buffer(FILE *fp, bcf_srs_t *files, int reader); + +/* + Flush all buffered and processed records with the same coordinate. + Note that synced reader discards buffer[0], so that needs to stay + untouched. +*/ +void clean_buffer(args_t *args) +{ + maux_t *ma = args->maux; + + int ir; + for (ir=0; irn; ir++) + { + // Invalidate pointer to reader's buffer or else gvcf_flush will attempt + // to use the old lines via maux_get_line() + if ( ma->gvcf ) + { + if ( ma->gvcf[ir].active ) + { + if ( ma->pos >= ma->gvcf[ir].end ) ma->gvcf[ir].active = 0; + else if ( ma->buf[ir].cur==-1 ) ma->buf[ir].cur = ma->buf[ir].beg; // re-activate interrupted gVCF block + } + if ( !ma->gvcf[ir].active ) ma->buf[ir].cur = -1; + } + + bcf_sr_t *reader = bcf_sr_get_reader(args->files,ir); + if ( !reader->nbuffer ) continue; // nothing to clean + + bcf1_t **buf = reader->buffer; + if ( buf[1]->rid!=ma->buf[ir].rid || buf[1]->pos!=ma->pos ) continue; // nothing to flush + + int a = 1, b = 2; + while ( b<=reader->nbuffer && buf[b]->rid==ma->buf[ir].rid && buf[b]->pos==ma->pos ) b++; + // b now points to the first line we want to preserve + while ( b<=reader->nbuffer ) + { + SWAP(bcf1_t*, buf[a], buf[b]); + a++; b++; + } + reader->nbuffer -= b-a; + } +} + +void debug_maux(args_t *args) +{ + bcf_srs_t *files = args->files; + maux_t *maux = args->maux; + int j,k,l; + + fprintf(stderr,"Alleles to merge at %d, nals=%d\n", maux->pos+1,maux->nals); + for (j=0; jnreaders; j++) + { + bcf_sr_t *reader = &files->readers[j]; + buffer_t *buf = &maux->buf[j]; + fprintf(stderr," reader %d: ", j); + for (k=buf->beg; kend; k++) + { + if ( buf->rec[k].skip & SKIP_DONE ) continue; + bcf1_t *line = reader->buffer[k]; + fprintf(stderr,"\t"); + if ( buf->rec[k].skip ) fprintf(stderr,"["); // this record will not be merged in this round + for (l=0; ln_allele; l++) + fprintf(stderr,"%s%s", l==0?"":",", line->d.allele[l]); + if ( buf->rec[k].skip ) fprintf(stderr,"]"); + } + fprintf(stderr,"\n"); + } + fprintf(stderr," counts: "); + for (j=0; jnals; j++) fprintf(stderr,"%s %dx %s", j==0?"":",",maux->cnt[j], maux->als[j]); + fprintf(stderr,"\n\n"); +} + +void debug_state(args_t *args) +{ + maux_t *maux = args->maux; + int i,j; + for (i=0; ifiles->nreaders; i++) + { + fprintf(stderr,"reader %d:\tcur,beg,end=% d,%d,%d", i,maux->buf[i].cur,maux->buf[i].beg,maux->buf[i].end); + if ( maux->buf[i].cur >=0 ) + { + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,i); + const char *chr = bcf_hdr_id2name(hdr, maux->buf[i].rid); + fprintf(stderr,"\t"); + for (j=maux->buf[i].beg; jbuf[i].end; j++) fprintf(stderr," %s:%"PRId64,chr,(int64_t) maux->buf[i].lines[j]->pos+1); + } + fprintf(stderr,"\n"); + } + fprintf(stderr,"gvcf_min=%d\n", args->maux->gvcf_min); + for (i=0; ifiles->nreaders; i++) + { + fprintf(stderr,"reader %d:\tgvcf_active=%d", i,maux->gvcf[i].active); + if ( maux->gvcf[i].active ) fprintf(stderr,"\tpos,end=%"PRId64",%"PRId64, (int64_t) maux->gvcf[i].line->pos+1,(int64_t) maux->gvcf[i].end+1); + fprintf(stderr,"\n"); + } + fprintf(stderr,"\n"); +} + +/* + Determine which line should be merged from which reader: go through all + readers and all buffered lines, expand REF,ALT and try to match lines with + the same ALTs. + */ +int can_merge(args_t *args) +{ + bcf_srs_t *files = args->files; + maux_t *maux = args->maux; + gvcf_aux_t *gaux = maux->gvcf; + char *id = NULL, ref = 'N'; + int i,j,k, ntodo = 0; + + for (i=0; inals; i++) + { + free(maux->als[i]); + maux->als[i] = NULL; + } + maux->var_types = maux->nals = 0; + + // this is only for the `-m none -g` mode, ensure that <*> lines come last + #define VCF_GVCF_REF 1 + + for (i=0; inreaders; i++) + { + buffer_t *buf = &maux->buf[i]; + + if ( gaux && gaux[i].active ) + { + // skip readers with active gvcf blocks + buf->rec[buf->beg].skip = SKIP_DIFF; + continue; + } + for (j=buf->beg; jend; j++) + { + if ( buf->rec[j].skip & SKIP_DONE ) continue; + + buf->rec[j].skip = SKIP_DIFF; + ntodo++; + + bcf1_t *line = buf->lines[j]; + if ( args->merge_by_id ) + id = line->d.id; + else + { + int var_type = bcf_has_variant_types(line, VCF_ANY, bcf_match_overlap); + if (var_type < 0) error("bcf_has_variant_types() failed."); + if ( args->collapse==COLLAPSE_SNP_INS_DEL ) + { + // need to distinguish between ins and del so strip the VCF_INDEL flag + var_type &= ~VCF_INDEL; + } + maux->var_types |= var_type ? var_type<<2 : 2; + + // for the `-m none -g` mode + if ( args->collapse==COLLAPSE_NONE && args->do_gvcf && is_gvcf_block(line) ) + maux->var_types |= VCF_GVCF_REF; + } + } + + // for gvcf: find out REF at this position + if ( buf->beg < buf->end && ref=='N' ) + ref = buf->lines[buf->beg]->d.allele[0][0]; + } + if ( !ntodo ) return 0; + + // In this loop we select from each reader compatible candidate lines. + // (i.e. SNPs or indels). Go through all files and all lines at this + // position and normalize relevant alleles. + // REF-only sites may be associated with both SNPs and indels. + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + buffer_t *buf = &maux->buf[i]; + + if ( gaux && gaux[i].active ) + { + gaux[i].line->d.allele[0][0] = ref; + gaux[i].line->pos = maux->pos; + } + + for (j=buf->beg; jend; j++) + { + if ( buf->rec[j].skip & SKIP_DONE ) continue; + + bcf1_t *line = buf->lines[j]; // ptr to reader's buffer or gvcf buffer + + int line_type = bcf_has_variant_types(line, VCF_ANY, bcf_match_overlap); + if (line_type < 0) error("bcf_has_variant_types() failed."); + line_type = line_type ? line_type<<2 : 2; + + // select relevant lines + if ( args->merge_by_id ) + { + if ( strcmp(id,line->d.id) ) continue; + } + else + { + // when merging gVCF in -m none mode, make sure that gVCF blocks with the same POS as variant + // records come last, otherwise infinite loop is created (#1164) + if ( args->collapse==COLLAPSE_NONE && args->do_gvcf ) + { + if ( is_gvcf_block(line) && (maux->var_types & (~(VCF_GVCF_REF|2))) ) continue; + } + if ( args->collapse==COLLAPSE_NONE && maux->nals ) + { + // All alleles of the tested record must be present in the + // selected maux record plus variant types must be the same + if ( (maux->var_types & line_type) != line_type ) continue; + if ( vcmp_set_ref(args->vcmp,maux->als[0],line->d.allele[0]) < 0 ) continue; // refs not compatible + for (k=1; kn_allele; k++) + { + if ( vcmp_find_allele(args->vcmp,maux->als+1,maux->nals-1,line->d.allele[k])>=0 ) break; + } + if ( !(line_type&ref_mask) && k==line->n_allele ) continue; // not a REF-only site and there is no matching allele + } + if ( !(args->collapse&COLLAPSE_ANY) ) + { + // Merge: + // - SNPs+SNPs+MNPs+REF if -m both,snps + // - indels+indels+REF if -m both,indels, REF only if SNPs are not present + // - SNPs come first + if ( line_type & (indel_mask|ins_mask|del_mask) ) + { + if ( !(line_type&snp_mask) && maux->var_types&snp_mask ) continue; // SNPs come first + if ( args->do_gvcf && maux->var_types&ref_mask ) continue; // never merge indels with gVCF blocks + } + } + } + buf->rec[j].skip = 0; + + hts_expand(int, line->n_allele, buf->rec[j].mmap, buf->rec[j].map); + if ( !maux->nals ) // first record, copy the alleles to the output + { + maux->nals = line->n_allele; + hts_expand0(char*, maux->nals, maux->mals, maux->als); + hts_expand0(int, maux->nals, maux->ncnt, maux->cnt); + for (k=0; knals; k++) + { + free(maux->als[k]); + maux->als[k] = strdup(line->d.allele[k]); + buf->rec[j].map[k] = k; + maux->cnt[k] = 1; + } + continue; + } + // normalize alleles + maux->als = merge_alleles(line->d.allele, line->n_allele, buf->rec[j].map, maux->als, &maux->nals, &maux->mals); + if ( !maux->als ) error("Failed to merge alleles at %s:%"PRId64" in %s\n",maux->chr,(int64_t) line->pos+1,reader->fname); + hts_expand0(int, maux->nals, maux->ncnt, maux->cnt); + for (k=1; kn_allele; k++) + maux->cnt[ buf->rec[j].map[k] ]++; // how many times an allele appears in the files + maux->cnt[0]++; + } + } + return 1; +} + +/* + Select records that have the same alleles; the input ordering of indels + must not matter. Multiple VCF lines can be emitted from this loop. + We expect only very few alleles and not many records with the same + position in the buffers, therefore the nested loops should not slow us + much. +*/ +void stage_line(args_t *args) +{ + bcf_srs_t *files = args->files; + maux_t *maux = args->maux; + + // debug_maux(args); + + // take the most frequent allele present in multiple files, REF is skipped + int i,j,k,icnt = 1; + for (i=2; inals; i++) + if ( maux->cnt[i] > maux->cnt[icnt] ) icnt = i; + + int nout = 0; + for (i=0; inreaders; i++) + { + buffer_t *buf = &maux->buf[i]; + buf->cur = -1; + if ( buf->beg >= buf->end ) continue; // no lines in the buffer + + // find lines with the same allele + for (j=buf->beg; jend; j++) + { + if ( buf->rec[j].skip ) continue; // done or not compatible + if ( args->merge_by_id ) break; + if ( maux->nals==1 && buf->lines[j]->n_allele==1 ) break; // REF-only record + + for (k=0; klines[j]->n_allele; k++) + if ( icnt==buf->rec[j].map[k] ) break; + + if ( klines[j]->n_allele ) break; + } + if ( j>=buf->end ) + { + // no matching allele found in this file + if ( args->collapse==COLLAPSE_NONE ) continue; + + for (j=buf->beg; jend; j++) + { + if ( buf->rec[j].skip ) continue; // done or not compatible + if ( args->collapse&COLLAPSE_ANY ) break; // anything can be merged + int line_type = bcf_has_variant_types(buf->lines[j], VCF_ANY, bcf_match_overlap); + if (line_type < 0) error("bcf_has_variant_types() failed."); + if ( maux->var_types&snp_mask && line_type&VCF_SNP && (args->collapse&COLLAPSE_SNPS) ) break; + if ( maux->var_types&indel_mask && line_type&VCF_INDEL && (args->collapse&COLLAPSE_INDELS) ) break; + if ( maux->var_types&ins_mask && line_type&VCF_INS && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( maux->var_types&del_mask && line_type&VCF_DEL && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( line_type==VCF_REF ) + { + if ( maux->var_types&snp_mask && (args->collapse&COLLAPSE_SNPS) ) break; + if ( maux->var_types&indel_mask && (args->collapse&COLLAPSE_INDELS) ) break; + if ( maux->var_types&ins_mask && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( maux->var_types&del_mask && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( maux->var_types&ref_mask ) break; + } + else if ( maux->var_types&ref_mask ) + { + if ( line_type&snp_mask && (args->collapse&COLLAPSE_SNPS) ) break; + if ( line_type&indel_mask && (args->collapse&COLLAPSE_INDELS) ) break; + if ( line_type&ins_mask && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( line_type&del_mask && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + } + } + } + if ( jend ) + { + // found a suitable line for merging + buf->cur = j; + + // mark as finished so that it's ignored next time + buf->rec[j].skip = SKIP_DONE; + nout++; + } + } + assert( nout ); +} + +void merge_line(args_t *args) +{ + bcf1_t *out = args->out_line; + merge_chrom2qual(args, out); + if ( args->regs && !regidx_overlap(args->regs,args->maux->chr,out->pos,out->pos+out->rlen-1,NULL) ) return; + merge_filter(args, out); + merge_info(args, out); + if ( args->do_gvcf ) + bcf_update_info_int32(args->out_hdr, out, "END", NULL, 0); + merge_format(args, out); + if ( bcf_write1(args->out_fh, args->out_hdr, out)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + bcf_clear1(out); +} + +void bcf_hdr_append_version(bcf_hdr_t *hdr, int argc, char **argv, const char *cmd) +{ + kstring_t str = {0,0,0}; + int e = 0; + if (ksprintf(&str,"##%sVersion=%s+htslib-%s\n", cmd, bcftools_version(), hts_version()) < 0) + goto fail; + if (bcf_hdr_append(hdr,str.s) < 0) + goto fail; + + str.l = 0; + e |= ksprintf(&str,"##%sCommand=%s", cmd, argv[0]) < 0; + int i; + for (i=1; inhrec; i++) + { + if ( hdr->hrec[i]->type!=BCF_HL_FMT ) continue; + j = bcf_hrec_find_key(hdr->hrec[i],"ID"); + if ( j<0 ) continue; + char *key = hdr->hrec[i]->vals[j]; + int id = bcf_hdr_id2int(hdr, BCF_DT_ID, key); + assert( id>=0 ); + int localize = 0; + if ( bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_G ) localize = 1; + if ( bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_A ) localize = 1; + if ( bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_R ) localize = 1; + if ( !localize ) continue; + args->tmps.l = 0; + + uint32_t e = 0, nout = 0; + e |= ksprintf(&args->tmps, "##%s=<", hdr->hrec[i]->key) < 0; + for (j=0; jhrec[i]->nkeys; j++) + { + if ( !strcmp("IDX",hdr->hrec[i]->keys[j]) ) continue; + if ( nout ) e |= kputc(',',&args->tmps) < 0; + if ( !strcmp("ID",hdr->hrec[i]->keys[j]) ) + e |= ksprintf(&args->tmps,"%s=L%s", hdr->hrec[i]->keys[j], hdr->hrec[i]->vals[j]) < 0; + else if ( !strcmp("Number",hdr->hrec[i]->keys[j]) ) + e |= ksprintf(&args->tmps,"Number=.") < 0; + else if ( !strcmp("Description",hdr->hrec[i]->keys[j]) && hdr->hrec[i]->vals[j][0]=='"' ) + e |= ksprintf(&args->tmps,"Description=\"Localized field: %s", hdr->hrec[i]->vals[j]+1) < 0; + else + e |= ksprintf(&args->tmps,"%s=%s", hdr->hrec[i]->keys[j], hdr->hrec[i]->vals[j]) < 0; + nout++; + } + e |= ksprintf(&args->tmps,">\n") < 0; + if ( e ) error("Failed to format the header line for %s\n", key); + nstr++; + hts_expand(char*,nstr,mstr,str); + str[nstr-1] = strdup(args->tmps.s); + } + if ( !nstr ) return; + bcf_hdr_append(hdr,"##FORMAT="); + for (i=0; ioutput_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) hts_set_opt(args->out_fh, HTS_OPT_THREAD_POOL, args->files->p); //hts_set_threads(args->out_fh, args->n_threads); + args->out_hdr = bcf_hdr_init("w"); + + if ( args->header_fname ) + { + if ( bcf_hdr_set(args->out_hdr,args->header_fname) ) error("Could not read/parse the header: %s\n", args->header_fname); + } + else + { + int i; + for (i=0; ifiles->nreaders; i++) + { + char buf[24]; snprintf(buf,sizeof buf,"%d",i+1); + merge_headers(args->out_hdr, args->files->readers[i].header,buf,args->force_samples); + } + if ( args->local_alleles ) hdr_add_localized_tags(args, args->out_hdr); + if (args->record_cmd_line) bcf_hdr_append_version(args->out_hdr, args->argc, args->argv, "bcftools_merge"); + if (bcf_hdr_sync(args->out_hdr) < 0) + error_errno("[%s] Failed to update header", __func__); + } + info_rules_init(args); + + bcf_hdr_set_version(args->out_hdr, bcf_hdr_get_version(args->files->readers[0].header)); + if ( bcf_hdr_write(args->out_fh, args->out_hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + if ( args->header_only ) + { + bcf_hdr_destroy(args->out_hdr); + if ( hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + return; + } + + if ( args->collapse==COLLAPSE_NONE ) args->vcmp = vcmp_init(); + args->maux = maux_init(args); + args->out_line = bcf_init1(); + args->tmph = kh_init(strdict); + + int *rid_tab = calloc(args->maux->n, sizeof(*rid_tab)); + if (!rid_tab) + error("[%s:%d] Could not allocate %zu bytes\n", __FILE__, __LINE__, args->maux->n*sizeof(*rid_tab)); + + while ( bcf_sr_next_line(args->files) ) + { + // output cached gVCF blocks which end before the new record + if ( args->do_gvcf ) + gvcf_flush(args,0); + + maux_reset(args->maux, rid_tab); + + // determine which of the new records are gvcf blocks + if ( args->do_gvcf ) + gvcf_stage(args, args->maux->pos); + + while ( can_merge(args) ) + { + stage_line(args); + merge_line(args); + } + clean_buffer(args); + // debug_state(args); + } + free(rid_tab); + if ( args->do_gvcf ) + gvcf_flush(args,1); + + info_rules_destroy(args); + maux_destroy(args->maux); + bcf_hdr_destroy(args->out_hdr); + if ( hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + bcf_destroy1(args->out_line); + kh_destroy(strdict, args->tmph); + if ( args->tmps.m ) free(args->tmps.s); + if ( args->vcmp ) vcmp_destroy(args->vcmp); +} + +static void usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Merge multiple VCF/BCF files from non-overlapping sample sets to create one multi-sample file.\n"); + fprintf(stderr, " Note that only records from different files can be merged, never from the same file. For\n"); + fprintf(stderr, " \"vertical\" merge take a look at \"bcftools norm\" instead.\n"); + fprintf(stderr, "Usage: bcftools merge [options] [...]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " --force-samples Resolve duplicate sample names\n"); + fprintf(stderr, " --print-header Print only the merged header and exit\n"); + fprintf(stderr, " --use-header FILE Use the provided header\n"); + fprintf(stderr, " -0 --missing-to-ref Assume genotypes at missing sites are 0/0\n"); + fprintf(stderr, " -f, --apply-filters LIST Require at least one of the listed FILTER strings (e.g. \"PASS,.\")\n"); + fprintf(stderr, " -F, --filter-logic x|+ Remove filters if some input is PASS (\"x\"), or apply all filters (\"+\") [+]\n"); + fprintf(stderr, " -g, --gvcf -|REF.FA Merge gVCF blocks, INFO/END tag is expected. Implies -i QS:sum,MinDP:min,I16:sum,IDV:max,IMF:max\n"); + fprintf(stderr, " -i, --info-rules TAG:METHOD,.. Rules for merging INFO fields (method is one of sum,avg,min,max,join) or \"-\" to turn off the default [DP:sum,DP4:sum]\n"); + fprintf(stderr, " -l, --file-list FILE Read file names from the file\n"); + fprintf(stderr, " -L, --local-alleles INT EXPERIMENTAL: if more than ALT alleles are encountered, drop FMT/PL and output LAA+LPL instead; 0=unlimited [0]\n"); + fprintf(stderr, " -m, --merge STRING Allow multiallelic records for , see man page for details [both]\n"); + fprintf(stderr, " --no-index Merge unindexed files, the same chromosomal order is required and -r/-R are not allowed\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfmerge(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->files = bcf_sr_init(); + args->argc = argc; args->argv = argv; + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->collapse = COLLAPSE_BOTH; + args->clevel = -1; + int regions_is_file = 0; + int regions_overlap = 1; + + static struct option loptions[] = + { + {"help",no_argument,NULL,'h'}, + {"merge",required_argument,NULL,'m'}, + {"local-alleles",required_argument,NULL,'L'}, + {"gvcf",required_argument,NULL,'g'}, + {"file-list",required_argument,NULL,'l'}, + {"missing-to-ref",no_argument,NULL,'0'}, + {"apply-filters",required_argument,NULL,'f'}, + {"use-header",required_argument,NULL,1}, + {"print-header",no_argument,NULL,2}, + {"force-samples",no_argument,NULL,3}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,4}, + {"info-rules",required_argument,NULL,'i'}, + {"no-version",no_argument,NULL,8}, + {"no-index",no_argument,NULL,10}, + {"filter-logic",required_argument,NULL,'F'}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "hm:f:r:R:o:O:i:l:g:F:0L:",loptions,NULL)) >= 0) { + switch (c) { + case 'L': + args->local_alleles = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --local-alleles %s\n", optarg); + if ( args->local_alleles < 1 ) + error("Error: \"--local-alleles %s\" makes no sense, expected value bigger or equal than 1\n", optarg); + break; + case 'F': + if ( !strcmp(optarg,"+") ) args->filter_logic = FLT_LOGIC_ADD; + else if ( !strcmp(optarg,"x") ) args->filter_logic = FLT_LOGIC_REMOVE; + else error("Filter logic not recognised: %s\n", optarg); + break; + case '0': args->missing_to_ref = 1; break; + case 'g': + args->do_gvcf = 1; + if ( strcmp("-",optarg) ) + { + args->gvcf_fai = fai_load(optarg); + if ( !args->gvcf_fai ) error("Failed to load the fai index: %s\n", optarg); + } + break; + case 'l': args->file_list = optarg; break; + case 'i': args->info_rules = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'm': + args->collapse = COLLAPSE_NONE; + if ( !strcmp(optarg,"snps") ) args->collapse |= COLLAPSE_SNPS; + else if ( !strcmp(optarg,"indels") ) args->collapse |= COLLAPSE_INDELS; + else if ( !strcmp(optarg,"both") ) args->collapse |= COLLAPSE_BOTH; + else if ( !strcmp(optarg,"any") ) args->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"all") ) args->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"none") ) args->collapse = COLLAPSE_NONE; + else if ( !strcmp(optarg,"snp-ins-del") ) args->collapse = COLLAPSE_SNP_INS_DEL; + else if ( !strcmp(optarg,"id") ) { args->collapse = COLLAPSE_NONE; args->merge_by_id = 1; } + else error("The -m type \"%s\" is not recognised.\n", optarg); + break; + case 'f': args->files->apply_filters = optarg; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 1 : args->header_fname = optarg; break; + case 2 : args->header_only = 1; break; + case 3 : args->force_samples = 1; break; + case 4 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 10 : args->no_index = 1; break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( argc==optind && !args->file_list ) usage(); + if ( argc-optind<2 && !args->file_list ) usage(); + + if ( args->no_index ) + { + if ( args->regions_list ) error("Error: cannot combine --no-index with -r/-R\n"); + bcf_sr_set_opt(args->files,BCF_SR_ALLOW_NO_IDX); + } + else + bcf_sr_set_opt(args->files,BCF_SR_REQUIRE_IDX); + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + if ( regions_is_file ) + args->regs = regidx_init(args->regions_list,NULL,NULL,sizeof(char*),NULL); + else + { + args->regs = regidx_init(NULL,regidx_parse_reg,NULL,sizeof(char*),NULL); + if ( regidx_insert_list(args->regs,args->regions_list,',') !=0 ) error("Could not parse the regions: %s\n", args->regions_list); + regidx_insert(args->regs,NULL); + } + if ( !args->regs ) error("Could not parse the regions: %s\n", args->regions_list); + args->regs_itr = regitr_init(args->regs); + } + + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + while (optindfiles, argv[optind]) ) error("Failed to open %s: %s\n", argv[optind],bcf_sr_strerror(args->files->errnum)); + optind++; + } + if ( args->file_list ) + { + int nfiles, i; + char **files = hts_readlines(args->file_list, &nfiles); + if ( !files ) error("Failed to read from %s\n", args->file_list); + for (i=0;ifiles, files[i]) ) error("Failed to open %s: %s\n", files[i],bcf_sr_strerror(args->files->errnum)); + for (i=0; ifiles); + if ( args->regs ) regidx_destroy(args->regs); + if ( args->regs_itr ) regitr_destroy(args->regs_itr); + if ( args->gvcf_fai ) fai_destroy(args->gvcf_fai); + free(args); + return 0; +} + diff --git a/bcftools/vcfmerge.c.pysam.c b/bcftools/vcfmerge.c.pysam.c new file mode 100644 index 0000000..3a26cae --- /dev/null +++ b/bcftools/vcfmerge.c.pysam.c @@ -0,0 +1,3332 @@ +#include "bcftools.pysam.h" + +/* vcfmerge.c -- Merge multiple VCF/BCF files to create one multi-sample file. + + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "regidx.h" +#include "vcmp.h" + +#define DBG 0 + +#define COLLAPSE_SNP_INS_DEL (1<<10) + +#include +KHASH_MAP_INIT_STR(strdict, int) +typedef khash_t(strdict) strdict_t; + +#define FLT_LOGIC_ADD 0 +#define FLT_LOGIC_REMOVE 1 + +#define SKIP_DONE 1 // the record was processed +#define SKIP_DIFF 2 // not compatible, merge later + +#define IS_VL_G(hdr,id) (bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_G) +#define IS_VL_A(hdr,id) (bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_A) +#define IS_VL_R(hdr,id) (bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_R) + +#define SWAP(type_t,a,b) { type_t tmp = (a); (a) = (b); (b) = tmp; } + +#define PL2PROB_MAX 1024 + +// For merging INFO Number=A,G,R tags +typedef struct +{ + const char *hdr_tag; + int type, nvals; + int nbuf, mbuf; + uint8_t *buf; +} +AGR_info_t; + +// Rules for merging arbitrary INFO tags +typedef struct _info_rule_t +{ + char *hdr_tag; + void (*merger)(bcf_hdr_t *hdr, bcf1_t *line, struct _info_rule_t *rule); + int type; // one of BCF_HT_* + int block_size; // number of values in a block + int type_size; // size of the corresponding BCF_HT_* type + int nblocks; // number of blocks in nvals (the number of merged files) + int nvals, mvals; // used and total size of vals array + void *vals; // the info tag values +} +info_rule_t; + +typedef struct +{ + bcf1_t *line; + int end, active; // end: 0-based INFO/END +} +gvcf_aux_t; + +// Auxiliary merge data for selecting the right combination +// of buffered records across multiple readers. maux1_t +// corresponds to one buffered line. +typedef struct +{ + int skip; + int *map; // mapping from input alleles to the array of output alleles (set by merge_alleles) + int mmap; // size of map array (only buffer[i].n_allele is actually used) + int als_differ; +} +maux1_t; +typedef struct +{ + int rid; // current rid + int beg,end; // valid ranges in reader's buffer [beg,end). Maintained by maux_reset and gvcf_flush. + int cur; // current line or -1 if none + int mrec; // allocated size of buf + maux1_t *rec; // buffer to keep reader's lines + bcf1_t **lines; // source buffer: either gvcf or readers' buffer +} +buffer_t; +typedef struct +{ + int n, pos, var_types; // number of readers, current position, currently available variant types + char *chr; // current chromosome + char **als, **out_als; // merged alleles (temp, may contain empty records) and merged alleles ready for output + int nals, mals, nout_als, mout_als; // size of the output array + int *cnt, ncnt; // number of records that refer to the alleles + int *smpl_ploidy, *smpl_nGsize; // ploidy and derived number of values in Number=G tags, updated for each line (todo: cache for missing cases) + bcf_fmt_t **fmt_map; // i-th output FORMAT field corresponds in j-th reader to i*nreader+j, first row is reserved for GT + int nfmt_map; // number of rows in the fmt_map array + int *agr_map, nagr_map, magr_map; // mapping between Number=AGR element indexes + void *tmp_arr; + size_t ntmp_arr; + buffer_t *buf; + AGR_info_t *AGR_info; + int nAGR_info, mAGR_info; + bcf_srs_t *files; + int gvcf_min, // min buffered gvcf END position (NB: gvcf_min is 1-based) or 0 if no active lines are present + gvcf_break; // 0-based position of a next record which breaks a gVCF block + gvcf_aux_t *gvcf; // buffer of gVCF lines, for each reader one line + int nout_smpl; + kstring_t *str; + int32_t *laa; // localized alternate alleles given as input-based indexes in per-sample blocks of (args->local_alleles+1) values, 0 is always first + int nlaa, laa_dirty; // number of LAA alleles actually used at this site, and was any L* added? + int32_t *tmpi, *k2k; + double *tmpd, *pl2prob; // mapping from phred-score likelihoods (PL) to probability + int ntmpi, ntmpd, nk2k; +} +maux_t; + +typedef struct +{ + vcmp_t *vcmp; + maux_t *maux; + regidx_t *regs; // apply regions only after the blocks are expanded + regitr_t *regs_itr; + int header_only, collapse, output_type, force_samples, merge_by_id, do_gvcf, filter_logic, missing_to_ref, no_index; + char *header_fname, *output_fname, *regions_list, *info_rules, *file_list; + faidx_t *gvcf_fai; + info_rule_t *rules; + int nrules; + strdict_t *tmph; + kstring_t tmps; + bcf_srs_t *files; + bcf1_t *out_line; + htsFile *out_fh; + bcf_hdr_t *out_hdr; + char **argv; + int argc, n_threads, record_cmd_line, clevel; + int local_alleles; // the value of -L option + int keep_AC_AN; +} +args_t; + +static bcf1_t *maux_get_line(args_t *args, int i) +{ + maux_t *ma = args->maux; + int ibuf = ma->buf[i].cur; + if ( ibuf >= 0 ) return ma->buf[i].lines[ibuf]; + return NULL; +} + +static void info_rules_merge_sum(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + int i, j, ndim = rule->block_size; + #define BRANCH(type_t,is_missing) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (i=0; invals; i++) if ( is_missing ) ptr[i] = 0; \ + for (i=1; inblocks; i++) \ + { \ + for (j=0; jtype) { + case BCF_HT_INT: BRANCH(int32_t, ptr[i]==bcf_int32_missing); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[i])); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,ndim,rule->type); +} +static void info_rules_merge_avg(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + int i, j, ndim = rule->block_size; + #define BRANCH(type_t,is_missing) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (i=0; invals; i++) if ( is_missing ) ptr[i] = 0; \ + for (j=0; jnblocks; i++) sum += ptr[j+i*ndim]; \ + ptr[j] = sum / rule->nblocks; \ + } \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int32_t, ptr[i]==bcf_int32_missing); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[i])); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,ndim,rule->type); +} +static void info_rules_merge_min(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + int i, j, ndim = rule->block_size; + #define BRANCH(type_t,is_missing,set_missing,huge_val) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (i=0; invals; i++) if ( is_missing ) ptr[i] = huge_val; \ + for (i=1; inblocks; i++) \ + { \ + for (j=0; j ptr[j+i*ndim] ) ptr[j] = ptr[j+i*ndim]; \ + } \ + for (i=0; invals; i++) if ( ptr[i]==huge_val ) set_missing; \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int32_t, ptr[i]==bcf_int32_missing, ptr[i]=bcf_int32_missing, INT32_MAX); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[i]), bcf_float_set_missing(ptr[i]), HUGE_VAL); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,ndim,rule->type); +} +static void info_rules_merge_max(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + int i, j, ndim = rule->block_size; + #define BRANCH(type_t,is_missing,set_missing,huge_val) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (i=0; invals; i++) if ( is_missing ) ptr[i] = huge_val; \ + for (i=1; inblocks; i++) \ + { \ + for (j=0; jnvals; i++) if ( ptr[i]==huge_val ) set_missing; \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int32_t, ptr[i]==bcf_int32_missing, ptr[i]=bcf_int32_missing, INT32_MIN); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[i]), bcf_float_set_missing(ptr[i]), -HUGE_VAL); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,ndim,rule->type); +} +static void info_rules_merge_join(bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule) +{ + if ( !rule->nvals ) return; + if ( rule->type==BCF_HT_STR ) + { + ((char*)rule->vals)[rule->nvals] = 0; + bcf_update_info_string(hdr,line,rule->hdr_tag,rule->vals); + } + else + { + int isrc, idst = 0; + #define BRANCH(type_t,is_missing,is_vector_end) { \ + type_t *ptr = (type_t*) rule->vals; \ + for (isrc=0; isrcnvals; isrc++) \ + { \ + if ( is_vector_end ) break; \ + if ( is_missing ) continue; \ + if ( idst!=isrc ) ptr[idst] = ptr[isrc]; \ + idst++; \ + } \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int32_t, ptr[isrc]==bcf_int32_missing, ptr[isrc]==bcf_int32_vector_end); break; + case BCF_HT_REAL: BRANCH(float, bcf_float_is_missing(ptr[isrc]), bcf_float_is_vector_end(ptr[isrc])); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + rule->nvals = idst; + bcf_update_info(hdr,line,rule->hdr_tag,rule->vals,rule->nvals,rule->type); + } +} + +static int info_rules_comp_key2(const void *a, const void *b) +{ + info_rule_t *rule1 = (info_rule_t*) a; + info_rule_t *rule2 = (info_rule_t*) b; + return strcmp(rule1->hdr_tag, rule2->hdr_tag); +} +static int info_rules_comp_key(const void *a, const void *b) +{ + char *key = (char*) a; + info_rule_t *rule = (info_rule_t*) b; + return strcmp(key, rule->hdr_tag); +} +static void info_rules_init(args_t *args) +{ + if ( args->info_rules && !strcmp("-",args->info_rules) ) return; + + kstring_t str = {0,0,0}; + if ( !args->info_rules ) + { + if ( bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "DP")) ) kputs("DP:sum",&str); + if ( bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "DP4")) ) + { + if ( str.l ) kputc(',',&str); + kputs("DP4:sum",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "QS")) ) + { + if ( str.l ) kputc(',',&str); + kputs("QS:sum",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "MinDP")) ) + { + if ( str.l ) kputc(',',&str); + kputs("MinDP:min",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "I16")) ) + { + if ( str.l ) kputc(',',&str); + kputs("I16:sum",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "IDV")) ) + { + if ( str.l ) kputc(',',&str); + kputs("IDV:max",&str); + } + if ( args->do_gvcf && bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "IMF")) ) + { + if ( str.l ) kputc(',',&str); + kputs("IMF:max",&str); + } + if ( !bcf_hdr_nsamples(args->out_hdr) ) + { + if ( bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "AN")) ) + { + if ( str.l ) kputc(',',&str); + kputs("AN:sum",&str); + } + if ( bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, "AC")) ) + { + if ( str.l ) kputc(',',&str); + kputs("AC:sum",&str); + } + } + + if ( !str.l ) return; + args->info_rules = str.s; + } + + args->nrules = 1; + char *ss = strdup(args->info_rules), *tmp = ss; + int n = 0; + while ( *ss ) + { + if ( *ss==':' ) { *ss = 0; n++; if ( n%2==0 ) error("Could not parse INFO rules: \"%s\"\n", args->info_rules); } + else if ( *ss==',' ) { *ss = 0; args->nrules++; n++; if ( n%2==1 ) error("Could not parse INFO rules: \"%s\"\n", args->info_rules); } + ss++; + } + if ( n%2==0 ) error("Could not parse INFO rules: \"%s\"\n", args->info_rules); + args->rules = (info_rule_t*) calloc(args->nrules,sizeof(info_rule_t)); + + n = 0; + ss = tmp; + while ( n < args->nrules ) + { + info_rule_t *rule = &args->rules[n]; + rule->hdr_tag = strdup(ss); + int id = bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, rule->hdr_tag); + if ( !bcf_hdr_idinfo_exists(args->out_hdr,BCF_HL_INFO,id) ) error("The INFO tag is not defined in the header: \"%s\"\n", rule->hdr_tag); + rule->type = bcf_hdr_id2type(args->out_hdr,BCF_HL_INFO,id); + if ( rule->type==BCF_HT_INT ) rule->type_size = sizeof(int32_t); + else if ( rule->type==BCF_HT_REAL ) rule->type_size = sizeof(float); + else if ( rule->type==BCF_HT_STR ) rule->type_size = sizeof(char); + else error("The INFO rule \"%s\" is not supported; the tag \"%s\" type is %d\n", ss,rule->hdr_tag,rule->type); + + if ( !strcmp(rule->hdr_tag,"AC") || !strcmp(rule->hdr_tag,"AN") ) args->keep_AC_AN = 1; + + ss = strchr(ss, '\0'); ss++; + if ( !*ss ) error("Could not parse INFO rules, missing logic of \"%s\"\n", rule->hdr_tag); + + int is_join = 0; + if ( !strcasecmp(ss,"sum") ) rule->merger = info_rules_merge_sum; + else if ( !strcasecmp(ss,"avg") ) rule->merger = info_rules_merge_avg; + else if ( !strcasecmp(ss,"min") ) rule->merger = info_rules_merge_min; + else if ( !strcasecmp(ss,"max") ) rule->merger = info_rules_merge_max; + else if ( !strcasecmp(ss,"join") ) { rule->merger = info_rules_merge_join; is_join = 1; } + else error("The rule logic \"%s\" not recognised\n", ss); + + if ( !is_join && rule->type==BCF_HT_STR ) + error("Numeric operation \"%s\" requested on non-numeric field: %s\n", ss, rule->hdr_tag); + if ( bcf_hdr_id2number(args->out_hdr,BCF_HL_INFO,id)==0xfffff ) + { + int is_agr = ( + bcf_hdr_id2length(args->out_hdr,BCF_HL_INFO,id)==BCF_VL_A || + bcf_hdr_id2length(args->out_hdr,BCF_HL_INFO,id)==BCF_VL_G || + bcf_hdr_id2length(args->out_hdr,BCF_HL_INFO,id)==BCF_VL_R + ) ? 1 : 0; + if ( is_join && bcf_hdr_id2length(args->out_hdr,BCF_HL_INFO,id)!=BCF_VL_VAR ) + { + bcf_hrec_t *hrec = bcf_hdr_get_hrec(args->out_hdr, BCF_HL_INFO, "ID", rule->hdr_tag, NULL); + hrec = bcf_hrec_dup(hrec); + int i = bcf_hrec_find_key(hrec, "Number"); + if ( i<0 ) error("Uh, could not find the entry Number in the header record of %s\n",rule->hdr_tag); + free(hrec->vals[i]); + hrec->vals[i] = strdup("."); + bcf_hdr_remove(args->out_hdr,BCF_HL_INFO, rule->hdr_tag); + bcf_hdr_add_hrec(args->out_hdr, hrec); + } + if ( !is_join && !is_agr ) + error("Only fixed-length vectors are supported with -i %s:%s\n", ss, rule->hdr_tag); + } + + ss = strchr(ss, '\0'); ss++; + n++; + } + free(str.s); + free(tmp); + + qsort(args->rules, args->nrules, sizeof(*args->rules), info_rules_comp_key2); +} +static void info_rules_destroy(args_t *args) +{ + int i; + for (i=0; inrules; i++) + { + info_rule_t *rule = &args->rules[i]; + free(rule->hdr_tag); + free(rule->vals); + } + free(args->rules); +} +static void info_rules_reset(args_t *args) +{ + int i; + for (i=0; inrules; i++) + args->rules[i].nblocks = args->rules[i].nvals = args->rules[i].block_size = 0; +} +static int info_rules_add_values(args_t *args, bcf_hdr_t *hdr, bcf1_t *line, info_rule_t *rule, maux1_t *als, int var_len) +{ + int msize = args->maux->ntmp_arr / rule->type_size; + int ret = bcf_get_info_values(hdr, line, rule->hdr_tag, &args->maux->tmp_arr, &msize, rule->type); + if ( ret<=0 ) error("FIXME: error parsing %s at %s:%"PRId64" .. %d\n", rule->hdr_tag,bcf_seqname(hdr,line),(int64_t) line->pos+1,ret); + args->maux->ntmp_arr = msize * rule->type_size; + + rule->nblocks++; + + if ( rule->type==BCF_HT_STR ) + { + int need_comma = rule->nblocks==1 ? 0 : 1; + hts_expand(char,rule->nvals+ret+need_comma+1,rule->mvals,rule->vals); // 1 for null-termination + char *tmp = (char*) rule->vals + rule->nvals; + if ( rule->nvals>0 ) { *tmp = ','; tmp++; } + strncpy(tmp,(char*)args->maux->tmp_arr,ret); + rule->nvals += ret + need_comma; + return 1; + } + + int i, j; + if ( var_len==BCF_VL_A ) + { + if ( ret!=line->n_allele-1 ) error("Wrong number of %s fields at %s:%"PRId64"\n",rule->hdr_tag,bcf_seqname(hdr,line),(int64_t) line->pos+1); + args->maux->nagr_map = ret; + hts_expand(int,args->maux->nagr_map,args->maux->magr_map,args->maux->agr_map); + // create mapping from source file ALT indexes to dst file indexes + for (i=0; imaux->agr_map[i] = als->map[i+1] - 1; + rule->block_size = args->maux->nout_als - 1; + } + else if ( var_len==BCF_VL_R ) + { + if ( ret!=line->n_allele ) error("Wrong number of %s fields at %s:%"PRId64"\n",rule->hdr_tag,bcf_seqname(hdr,line),(int64_t) line->pos+1); + args->maux->nagr_map = ret; + hts_expand(int,args->maux->nagr_map,args->maux->magr_map,args->maux->agr_map); + for (i=0; imaux->agr_map[i] = als->map[i]; + rule->block_size = args->maux->nout_als; + } + else if ( var_len==BCF_VL_G ) + { + args->maux->nagr_map = bcf_alleles2gt(line->n_allele-1,line->n_allele-1)+1; + assert( ret==line->n_allele || ret==args->maux->nagr_map ); + if ( ret==line->n_allele ) // haploid + { + args->maux->nagr_map = line->n_allele; + hts_expand(int,args->maux->nagr_map,args->maux->magr_map,args->maux->agr_map); + for (i=0; imaux->agr_map[i] = als->map[i]; + rule->block_size = args->maux->nout_als; + } + else + { + hts_expand(int,args->maux->nagr_map,args->maux->magr_map,args->maux->agr_map); + int k_src = 0; + for (i=0; in_allele; i++) + { + for (j=0; j<=i; j++) + { + args->maux->agr_map[k_src] = bcf_alleles2gt(als->map[i],als->map[j]); + k_src++; + } + } + rule->block_size = bcf_alleles2gt(args->maux->nout_als-1,args->maux->nout_als-1)+1; + } + } + else + { + if ( rule->nblocks>1 && ret!=rule->block_size ) + error("Mismatch in number of values for INFO/%s at %s:%"PRId64"\n", rule->hdr_tag,bcf_seqname(hdr,line),(int64_t) line->pos+1); + rule->block_size = ret; + args->maux->nagr_map = 0; + } + + #define BRANCH(src_type_t,dst_type_t,set_missing) { \ + src_type_t *src = (src_type_t *) args->maux->tmp_arr; \ + hts_expand0(dst_type_t,(rule->nvals+rule->block_size),rule->mvals,rule->vals); \ + dst_type_t *dst = (dst_type_t *) rule->vals + rule->nvals; \ + rule->nvals += rule->block_size; \ + if ( !args->maux->nagr_map ) \ + { \ + for (i=0; iblock_size; i++) set_missing; \ + for (i=0; imaux->agr_map[i]] = src[i]; \ + } \ + } + switch (rule->type) { + case BCF_HT_INT: BRANCH(int, int32_t, dst[i] = bcf_int32_missing); break; + case BCF_HT_REAL: BRANCH(float, float, bcf_float_set_missing(dst[i])); break; + default: error("TODO: %s:%d .. type=%d\n", __FILE__,__LINE__, rule->type); + } + #undef BRANCH + + return 1; +} + +int bcf_hdr_sync(bcf_hdr_t *h); + +void merge_headers(bcf_hdr_t *hw, const bcf_hdr_t *hr, const char *clash_prefix, int force_samples) +{ + // header lines + hw = bcf_hdr_merge(hw, hr); + + // samples + int i; + for (i=0; isamples[i]; + while ( bcf_hdr_id2int(hw, BCF_DT_SAMPLE, name)!=-1 ) + { + // there is a sample with the same name + if ( !force_samples ) error("Error: Duplicate sample names (%s), use --force-samples to proceed anyway.\n", name); + + // Resolve conflicting samples names. For example, replace: + // A + A with A,2:A + // A,2:A + A with A,2:A,2:2:A + + int len = strlen(name) + strlen(clash_prefix) + 1; + char *tmp = (char*) malloc(sizeof(char)*(len+1)); + sprintf(tmp,"%s:%s",clash_prefix,name); + free(rmme); + rmme = name = tmp; + } + bcf_hdr_add_sample(hw,name); + free(rmme); + } +} + +void debug_als(char **als, int nals) +{ + int k; for (k=0; k=lens[j] ) done = 1; + if ( als[j][lens[j]-i] != als[0][lens[0]-i] ) { done = 1; break; } + } + if ( done ) break; + i++; + } + if ( i>1 ) + { + i--; + als[0][lens[0]-i] = 0; + for (j=1; j0, + * 1->2, and 2->3. + */ +char **merge_alleles(char **a, int na, int *map, char **b, int *nb, int *mb) +{ + // reference allele never changes + map[0] = 0; + + int i,j; + int rla = !a[0][1] ? 1 : strlen(a[0]); + int rlb = !b[0][1] ? 1 : strlen(b[0]); + + // the most common case: same SNPs + if ( na==2 && *nb==2 && rla==1 && rlb==1 && a[1][0]==b[1][0] && !a[1][1] && !b[1][1] ) + { + map[1] = 1; + return b; + } + + // Sanity check: reference prefixes must be identical + if ( strncmp(a[0],b[0],rlarlb ) + { + for (i=0; i<*nb; i++) + { + if ( b[i][0]=='<' ) continue; // symbolic allele, do not modify + if ( b[i][0]=='*' ) continue; // overlapping deletion (*), do not modify + int l = strlen(b[i]); + b[i] = (char*) realloc(b[i],l+rla-rlb+1); + memcpy(b[i]+l,a[0]+rlb,rla-rlb+1); + } + } + + // now check if the $a alleles are present and if not add them + for (i=1; irla && a[i][0]!='<' && a[i][0]!='*' ) // $a alleles need expanding and not a symbolic allele or * + { + int l = strlen(a[i]); + ai = (char*) malloc(l+rlb-rla+1); + memcpy(ai,a[i],l); + memcpy(ai+l,b[0]+rla,rlb-rla+1); + const_ai = 0; + } + else + ai = a[i]; + + for (j=1; j<*nb; j++) + if ( !strcasecmp(ai,b[j]) ) break; + + if ( j<*nb ) // $b already has the same allele + { + map[i] = j; + if ( !const_ai ) free(ai); + continue; + } + // new allele + map[i] = *nb; + b[*nb] = const_ai ? strdup(ai) : ai; + (*nb)++; + } + return b; +} + +maux_t *maux_init(args_t *args) +{ + bcf_srs_t *files = args->files; + maux_t *ma = (maux_t*) calloc(1,sizeof(maux_t)); + ma->n = files->nreaders; + ma->files = files; + int i, n_smpl = 0; + for (i=0; in; i++) + n_smpl += bcf_hdr_nsamples(files->readers[i].header); + ma->nout_smpl = n_smpl; + assert( n_smpl==bcf_hdr_nsamples(args->out_hdr) ); + if ( args->do_gvcf ) + { + ma->gvcf = (gvcf_aux_t*) calloc(ma->n,sizeof(gvcf_aux_t)); // -Walloc-size-larger-than gives a harmless warning caused by signed integer ma->n + for (i=0; in; i++) + ma->gvcf[i].line = bcf_init1(); + } + ma->smpl_ploidy = (int*) calloc(n_smpl,sizeof(int)); + ma->smpl_nGsize = (int*) malloc(n_smpl*sizeof(int)); + ma->buf = (buffer_t*) calloc(ma->n,sizeof(buffer_t)); + for (i=0; in; i++) + ma->buf[i].rid = -1; + ma->str = (kstring_t*) calloc(n_smpl,sizeof(kstring_t)); + if ( args->local_alleles ) + { + ma->laa = (int32_t*)malloc(sizeof(*ma->laa)*ma->nout_smpl*(1+args->local_alleles)); + ma->pl2prob = (double*)malloc(PL2PROB_MAX*sizeof(*ma->pl2prob)); + for (i=0; ipl2prob[i] = pow(10,-0.1*i); + } + return ma; +} +void maux_destroy(maux_t *ma) +{ + int i,j; + for (i=0; inout_smpl; i++) free(ma->str[i].s); + free(ma->str); + for (i=0; imals; i++) + { + free(ma->als[i]); + ma->als[i] = NULL; + } + for (i=0; in; i++) // for each reader + { + for (j=0; jbuf[i].mrec; j++) // for each buffered line + free(ma->buf[i].rec[j].map); + free(ma->buf[i].rec); + } + free(ma->buf); + if ( ma->gvcf ) + { + for (i=0; in; i++) bcf_destroy(ma->gvcf[i].line); + free(ma->gvcf); + } + for (i=0; imAGR_info; i++) + free(ma->AGR_info[i].buf); + free(ma->agr_map); + free(ma->AGR_info); + if (ma->ntmp_arr) free(ma->tmp_arr); + if (ma->nfmt_map) free(ma->fmt_map); + // ma->inf freed in bcf_destroy1 + for (i=0; imals; i++) free(ma->als[i]); + if (ma->mout_als) free(ma->out_als); + free(ma->als); + free(ma->cnt); + free(ma->smpl_ploidy); + free(ma->smpl_nGsize); + free(ma->chr); + free(ma->laa); + free(ma->tmpi); + free(ma->k2k); + free(ma->tmpd); + free(ma->pl2prob); + free(ma); +} +void maux_expand1(buffer_t *buf, int size) +{ + if ( buf->mrec < size ) + { + hts_expand0(maux1_t,size,buf->mrec,buf->rec); + buf->mrec = size; + } +} +void maux_reset(maux_t *ma, int *rid_tab) +{ + int i,j; + for (i=0; in; i++) maux_expand1(&ma->buf[i],ma->files->readers[i].nbuffer+1); + for (i=0; incnt; i++) ma->cnt[i] = 0; + for (i=0; imals; i++) + { + free(ma->als[i]); + ma->als[i] = NULL; + } + const char *chr = NULL; + ma->nals = 0; + ma->pos = -1; + for (i=0; in; i++) + { + if ( !bcf_sr_has_line(ma->files,i) ) continue; + bcf1_t *line = bcf_sr_get_line(ma->files,i); + bcf_hdr_t *hdr = bcf_sr_get_header(ma->files,i); + chr = bcf_seqname(hdr,line); + ma->pos = line->pos; + break; + } + int new_chr = 0; + if ( chr && (!ma->chr || strcmp(ma->chr,chr)) ) + { + free(ma->chr); + ma->chr = strdup(chr); + new_chr = 1; + } + for (i=0; in; i++) + { + bcf_hdr_t *hdr = bcf_sr_get_header(ma->files,i); + if (new_chr) + rid_tab[i] = bcf_hdr_name2id(hdr,chr); + + ma->buf[i].rid = rid_tab[i]; + ma->buf[i].beg = bcf_sr_has_line(ma->files,i) ? 0 : 1; + for (j=ma->buf[i].beg; j<=ma->files->readers[i].nbuffer; j++) + { + ma->buf[i].rec[j].skip = 0; + bcf1_t *line = ma->files->readers[i].buffer[j]; + if ( line->rid!=ma->buf[i].rid || line->pos!=ma->pos ) break; + } + ma->buf[i].end = j; + ma->buf[i].cur = -1; + if ( ma->buf[i].beg < ma->buf[i].end ) + { + ma->buf[i].lines = ma->files->readers[i].buffer; + if ( ma->gvcf ) ma->gvcf[i].active = 0; // gvcf block cannot overlap with the next record + } + if ( new_chr && ma->gvcf ) ma->gvcf[i].active = 0; // make sure to close active gvcf block on new chr + } +} +void maux_debug(maux_t *ma, int ir, int ib) +{ + fprintf(bcftools_stdout, "[%d,%d]\t", ir,ib); + int i; + for (i=0; inals; i++) + { + fprintf(bcftools_stdout, " %s [%d]", ma->als[i], ma->cnt[i]); + } + fprintf(bcftools_stdout, "\n"); +} + +void merge_chrom2qual(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + + int i, ret; + khiter_t kitr; + strdict_t *tmph = args->tmph; + kh_clear(strdict, tmph); + kstring_t *tmps = &args->tmps; + tmps->l = 0; + + maux_t *ma = args->maux; + int *al_idxs = (int*) calloc(ma->nals,sizeof(int)); + bcf_float_set_missing(out->qual); + + // CHROM, POS, ID, QUAL + out->pos = -1; + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args, i); + if ( !line ) continue; + bcf_unpack(line, BCF_UN_ALL); + + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + + // not all maux alleles are always used, mark the ones we'll need + int j; + for (j=1; jn_allele; j++) + { + int irec = ma->buf[i].cur; + al_idxs[ ma->buf[i].rec[irec].map[j] ] = 1; + } + + // position + if ( out->pos==-1 ) + { + const char *chr = hdr->id[BCF_DT_CTG][line->rid].key; + out->rid = bcf_hdr_name2id(out_hdr, chr); + if ( strcmp(chr,out_hdr->id[BCF_DT_CTG][out->rid].key) ) error("Uh\n"); + out->pos = line->pos; + } + + // ID + if ( line->d.id[0]!='.' || line->d.id[1] ) + { + kitr = kh_get(strdict, tmph, line->d.id); + if ( kitr == kh_end(tmph) ) + { + if ( tmps->l ) kputc(';', tmps); + kputs(line->d.id, tmps); + kh_put(strdict, tmph, line->d.id, &ret); + } + } + + // set QUAL to the max qual value. Not exactly correct, but good enough for now + if ( !bcf_float_is_missing(line->qual) ) + { + if ( bcf_float_is_missing(out->qual) || out->qual < line->qual ) out->qual = line->qual; + } + } + + // set ID + if ( !tmps->l ) kputs(".", tmps); + bcf_update_id(out_hdr, out, tmps->s); + + // set alleles + ma->nout_als = 0; + for (i=1; inals; i++) + { + if ( !al_idxs[i] ) continue; + ma->nout_als++; + + // Adjust the indexes, the allele map could be created for multiple collapsed records, + // some of which might be unused for this output line + int ir, j; + for (ir=0; irnreaders; ir++) + { + bcf1_t *line = maux_get_line(args,ir); + if ( !line ) continue; + for (j=1; jn_allele; j++) + { + int irec = ma->buf[ir].cur; + if ( ma->buf[ir].rec[irec].map[j]==i ) ma->buf[ir].rec[irec].map[j] = ma->nout_als; + } + } + } + // Expand the arrays and realloc the alleles string. Note that all alleles are in a single allocated block. + ma->nout_als++; + hts_expand0(char*, ma->nout_als, ma->mout_als, ma->out_als); + int k = 0; + for (i=0; inals; i++) + if ( i==0 || al_idxs[i] ) ma->out_als[k++] = strdup(ma->als[i]); + assert( k==ma->nout_als ); + normalize_alleles(ma->out_als, ma->nout_als); + bcf_update_alleles(out_hdr, out, (const char**) ma->out_als, ma->nout_als); + free(al_idxs); + for (i=0; inout_als; i++) free(ma->out_als[i]); +} + +void merge_filter(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + + int i, ret; + if ( args->filter_logic == FLT_LOGIC_REMOVE ) + { + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args, i); + if ( !line ) continue; + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + if ( bcf_has_filter(hdr, line, "PASS") ) break; + } + if ( inreaders ) + { + int flt_id = bcf_hdr_id2int(out_hdr, BCF_DT_ID, "PASS"); + bcf_add_filter(out_hdr, out, flt_id); + return; + } + } + + khiter_t kitr; + strdict_t *tmph = args->tmph; + kh_clear(strdict, tmph); + + out->d.n_flt = 0; + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args, i); + if ( !line ) continue; + + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + + int k; + for (k=0; kd.n_flt; k++) + { + const char *flt = hdr->id[BCF_DT_ID][line->d.flt[k]].key; + kitr = kh_get(strdict, tmph, flt); + if ( kitr == kh_end(tmph) ) + { + int id = bcf_hdr_id2int(out_hdr, BCF_DT_ID, flt); + if ( id==-1 ) error("Error: The filter is not defined in the header: %s\n", flt); + hts_expand(int,out->d.n_flt+1,out->d.m_flt,out->d.flt); + out->d.flt[out->d.n_flt] = id; + out->d.n_flt++; + kh_put(strdict, tmph, flt, &ret); + } + } + } + // Check if PASS is not mixed with other filters + if ( out->d.n_flt>1 ) + { + int id = bcf_hdr_id2int(out_hdr, BCF_DT_ID, "PASS"); + for (i=0; id.n_flt; i++) + if ( out->d.flt[i]==id ) break; + if ( id.n_flt ) + { + out->d.n_flt--; + for (; id.n_flt; i++) out->d.flt[i] = out->d.flt[i+1]; + } + } +} + +static void bcf_info_set_id(bcf1_t *line, bcf_info_t *info, int id, kstring_t *tmp_str) +{ + uint8_t *ptr = info->vptr - info->vptr_off; + bcf_dec_typed_int1(ptr, &ptr); + + tmp_str->l = 0; + bcf_enc_int1(tmp_str, id); + + if ( tmp_str->l == ptr - info->vptr + info->vptr_off ) + { + // the new id is represented with the same number of bytes + memcpy(info->vptr - info->vptr_off, tmp_str->s, tmp_str->l); + return; + } + + kputsn_(ptr, info->vptr - ptr, tmp_str); + info->vptr_off = tmp_str->l; + kputsn_(info->vptr, info->len << bcf_type_shift[info->type], tmp_str); + + info->vptr = (uint8_t*) tmp_str->s + info->vptr_off; + tmp_str->s = NULL; + tmp_str->m = 0; + tmp_str->l = 0; +} + +/* + * copy_string_field() - copy a comma-separated field + * @param src: source string + * @param isrc: index of the field to copy + * @param src_len: length of source string (excluding the terminating \0) + * @param dst: destination kstring (must be initialized with missing values, e.g. as ".") + * @param idst: index of the destination field + */ +int copy_string_field(char *src, int isrc, int src_len, kstring_t *dst, int idst) +{ + int ith_src = 0, start_src = 0; // i-th field in src string + while ( ith_srcl ) + { + if ( dst->s[start_dst]==',' ) { ith_dst++; } + start_dst++; + } + if ( ith_dst!=idst ) return -2; + int end_dst = start_dst; + while ( end_dstl && dst->s[end_dst]!=',' ) end_dst++; + + if ( end_dst - start_dst>1 || dst->s[start_dst]!='.' ) return 0; // do not overwrite non-empty values + + // Now start_dst and end_dst are indexes to the destination memory area + // which needs to be replaced with nsrc_cpy + // source bytes, end_dst points just after. + int ndst_shift = nsrc_cpy - (end_dst - start_dst); + int ndst_move = dst->l - end_dst + 1; // how many bytes must be moved (including \0) + if ( ndst_shift ) + { + ks_resize(dst, dst->l + ndst_shift + 1); // plus \0 + memmove(dst->s+end_dst+ndst_shift, dst->s+end_dst, ndst_move); + } + memcpy(dst->s+start_dst, src+start_src, nsrc_cpy); + dst->l += ndst_shift; + return 0; +} + +static void merge_AGR_info_tag(bcf_hdr_t *hdr, bcf1_t *line, bcf_info_t *info, int len, maux1_t *als, AGR_info_t *agr) +{ + int i; + if ( !agr->nbuf ) + { + if ( info->type==BCF_BT_INT8 || info->type==BCF_BT_INT16 || info->type==BCF_BT_INT32 || info->type==BCF_BT_FLOAT ) + { + agr->nbuf = 4 * agr->nvals; + hts_expand(uint8_t,agr->nbuf,agr->mbuf,agr->buf); + if ( info->type!=BCF_BT_FLOAT ) + { + int32_t *tmp = (int32_t*) agr->buf; + for (i=0; invals; i++) tmp[i] = bcf_int32_missing; + } + else + { + float *tmp = (float*) agr->buf; + for (i=0; invals; i++) bcf_float_set_missing(tmp[i]); + } + } + else if ( info->type==BCF_BT_CHAR ) + { + kstring_t tmp; tmp.l = 0; tmp.m = agr->mbuf; tmp.s = (char*)agr->buf; + kputc('.',&tmp); + for (i=1; invals; i++) kputs(",.",&tmp); + agr->mbuf = tmp.m; agr->nbuf = tmp.l; agr->buf = (uint8_t*)tmp.s; + } + else + error("Not ready for type [%d]: %s at %"PRId64"\n", info->type,agr->hdr_tag,(int64_t) line->pos+1); + } + + if ( info->type==BCF_BT_INT8 || info->type==BCF_BT_INT16 || info->type==BCF_BT_INT32 || info->type==BCF_BT_FLOAT ) + { + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int ifrom = len==BCF_VL_A ? 1 : 0; + #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ + type_t *src = (type_t *) info->vptr; \ + out_type_t *tgt = (out_type_t *) agr->buf; \ + int iori, inew; \ + for (iori=ifrom; iorin_allele; iori++) \ + { \ + if ( is_vector_end ) break; \ + if ( is_missing ) continue; \ + inew = als->map[iori] - ifrom; \ + tgt[inew] = *src; \ + src++; \ + } \ + } + switch (info->type) { + case BCF_BT_INT8: BRANCH(int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, int); break; + case BCF_BT_INT16: BRANCH(int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, int); break; + case BCF_BT_INT32: BRANCH(int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, int); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(*src), bcf_float_is_vector_end(*src), float); break; + default: fprintf(bcftools_stderr,"TODO: %s:%d .. info->type=%d\n", __FILE__,__LINE__, info->type); bcftools_exit(1); + } + #undef BRANCH + } + else + { + #define BRANCH(type_t, is_missing, is_vector_end, out_type_t) { \ + type_t *src = (type_t *) info->vptr; \ + out_type_t *tgt = (out_type_t *) agr->buf; \ + int iori,jori, inew,jnew; \ + for (iori=0; iorin_allele; iori++) \ + { \ + inew = als->map[iori]; \ + for (jori=0; jori<=iori; jori++) \ + { \ + jnew = als->map[jori]; \ + int kori = iori*(iori+1)/2 + jori; \ + if ( is_vector_end ) break; \ + if ( is_missing ) continue; \ + int knew = inew>jnew ? inew*(inew+1)/2 + jnew : jnew*(jnew+1)/2 + inew; \ + tgt[knew] = src[kori]; \ + } \ + if ( jori<=iori ) break; \ + } \ + } + switch (info->type) { + case BCF_BT_INT8: BRANCH(int8_t, src[kori]==bcf_int8_missing, src[kori]==bcf_int8_vector_end, int); break; + case BCF_BT_INT16: BRANCH(int16_t, src[kori]==bcf_int16_missing, src[kori]==bcf_int16_vector_end, int); break; + case BCF_BT_INT32: BRANCH(int32_t, src[kori]==bcf_int32_missing, src[kori]==bcf_int32_vector_end, int); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_is_missing(src[kori]), bcf_float_is_vector_end(src[kori]), float); break; + default: fprintf(bcftools_stderr,"TODO: %s:%d .. info->type=%d\n", __FILE__,__LINE__, info->type); bcftools_exit(1); + } + #undef BRANCH + } + } + else + { + kstring_t tmp; tmp.l = agr->nbuf; tmp.m = agr->mbuf; tmp.s = (char*)agr->buf; + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int iori, ifrom = len==BCF_VL_A ? 1 : 0; + for (iori=ifrom; iorin_allele; iori++) + { + int ret = copy_string_field((char*)info->vptr, iori-ifrom, info->len, &tmp, als->map[iori]-ifrom); + if ( ret ) + error("Error at %s:%"PRId64": wrong number of fields in %s?\n", bcf_seqname(hdr,line),(int64_t) line->pos+1,agr->hdr_tag); + } + } + else + { + int iori,jori, inew,jnew; + for (iori=0; iorin_allele; iori++) + { + inew = als->map[iori]; + for (jori=0; jori<=iori; jori++) + { + jnew = als->map[jori]; + int kori = iori*(iori+1)/2 + jori; + int knew = bcf_alleles2gt(inew,jnew); + int ret = copy_string_field((char*)info->vptr, kori, info->len, &tmp, knew); + if ( ret ) + error("Error at %s:%"PRId64": wrong number of fields in %s?\n", bcf_seqname(hdr,line),(int64_t) line->pos+1,agr->hdr_tag); + } + } + } + agr->mbuf = tmp.m; agr->nbuf = tmp.l; agr->buf = (uint8_t*)tmp.s; + } +} + +void merge_info(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + + int i, j, ret; + khiter_t kitr; + strdict_t *tmph = args->tmph; + kh_clear(strdict, tmph); + + maux_t *ma = args->maux; + ma->nAGR_info = 0; + out->n_info = 0; + info_rules_reset(args); + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args,i); + if ( !line ) continue; + int irec = ma->buf[i].cur; + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + for (j=0; jn_info; j++) + { + bcf_info_t *inf = &line->d.info[j]; + + const char *key = hdr->id[BCF_DT_ID][inf->key].key; + // AC and AN are done in merge_format() after genotypes are done + if (!args->keep_AC_AN && + (key[0] == 'A' + && (key[1] == 'C' || key[1] == 'N') + && key[2] == 0)) + continue; + + int id = bcf_hdr_id2int(out_hdr, BCF_DT_ID, key); + if ( id==-1 ) error("Error: The INFO field is not defined in the header: %s\n", key); + + kitr = kh_get(strdict, tmph, key); // have we seen the tag in one of the readers? + int len = bcf_hdr_id2length(hdr,BCF_HL_INFO,inf->key); + if ( args->nrules ) + { + info_rule_t *rule = (info_rule_t*) bsearch(key, args->rules, args->nrules, sizeof(*args->rules), info_rules_comp_key); + if ( rule ) + { + maux1_t *als = ( len==BCF_VL_A || len==BCF_VL_G || len==BCF_VL_R ) ? &ma->buf[i].rec[irec] : NULL; + if ( info_rules_add_values(args, hdr, line, rule, als, len) ) continue; + } + } + + // Todo: Number=AGR tags should use the newer info_rules_* functions (info_rules_merge_first to be added) + // and merge_AGR_info_tag to be made obsolete. + if ( len==BCF_VL_A || len==BCF_VL_G || len==BCF_VL_R ) // Number=R,G,A requires special treatment + { + if ( kitr == kh_end(tmph) ) + { + // seeing this key for the first time + ma->nAGR_info++; + hts_expand0(AGR_info_t,ma->nAGR_info,ma->mAGR_info,ma->AGR_info); + kitr = kh_put(strdict, tmph, key, &ret); + kh_val(tmph,kitr) = ma->nAGR_info - 1; + ma->AGR_info[ma->nAGR_info-1].hdr_tag = key; + ma->AGR_info[ma->nAGR_info-1].type = bcf_hdr_id2type(hdr,BCF_HL_INFO,inf->key); + ma->AGR_info[ma->nAGR_info-1].nbuf = 0; // size of the buffer + switch (len) + { + case BCF_VL_A: ma->AGR_info[ma->nAGR_info-1].nvals = ma->nout_als - 1; break; + case BCF_VL_G: ma->AGR_info[ma->nAGR_info-1].nvals = bcf_alleles2gt(ma->nout_als-1,ma->nout_als-1)+1; break; + case BCF_VL_R: ma->AGR_info[ma->nAGR_info-1].nvals = ma->nout_als; break; + } + } + kitr = kh_get(strdict, tmph, key); + int idx = kh_val(tmph, kitr); + if ( idx<0 ) error("Error occurred while processing INFO tag \"%s\" at %s:%"PRId64"\n", key,bcf_seqname(hdr,line),(int64_t) line->pos+1); + merge_AGR_info_tag(hdr, line,inf,len,&ma->buf[i].rec[irec],&ma->AGR_info[idx]); + continue; + } + + if ( kitr == kh_end(tmph) ) + { + // Seeing this key for the first time. Although quite hacky, + // this is faster than anything else given the data structures.. + + hts_expand0(bcf_info_t,out->n_info+1,out->d.m_info,out->d.info); + out->d.info[out->n_info].key = id; + out->d.info[out->n_info].type = inf->type; + out->d.info[out->n_info].len = inf->len; + out->d.info[out->n_info].v1.i = inf->v1.i; + out->d.info[out->n_info].v1.f = inf->v1.f; + out->d.info[out->n_info].vptr_off = inf->vptr_off; + out->d.info[out->n_info].vptr_len = inf->vptr_len; + out->d.info[out->n_info].vptr_free = 1; + out->d.info[out->n_info].vptr = (uint8_t*) malloc(inf->vptr_len+inf->vptr_off); + memcpy(out->d.info[out->n_info].vptr,inf->vptr-inf->vptr_off, inf->vptr_len+inf->vptr_off); + out->d.info[out->n_info].vptr += inf->vptr_off; + if ( (args->output_type & FT_BCF) && id!=bcf_hdr_id2int(hdr, BCF_DT_ID, key) ) + bcf_info_set_id(out, &out->d.info[out->n_info], id, &args->tmps); + out->d.shared_dirty |= BCF1_DIRTY_INF; + out->n_info++; + kitr = kh_put(strdict, tmph, key, &ret); + kh_val(tmph,kitr) = -(out->n_info-1); // arbitrary negative value + } + } + } + for (i=0; inrules; i++) + args->rules[i].merger(args->out_hdr, out, &args->rules[i]); + for (i=0; inAGR_info; i++) + { + AGR_info_t *agr = &ma->AGR_info[i]; + bcf_update_info(out_hdr,out,agr->hdr_tag,agr->buf,agr->nvals,agr->type); + } +} + +void update_AN_AC(bcf_hdr_t *hdr, bcf1_t *line) +{ + int32_t an = 0, *tmp = (int32_t*) malloc(sizeof(int)*line->n_allele); + int ret = bcf_calc_ac(hdr, line, tmp, BCF_UN_FMT); + if ( ret>0 ) + { + int i; + for (i=0; in_allele; i++) an += tmp[i]; + bcf_update_info_int32(hdr, line, "AN", &an, 1); + bcf_update_info_int32(hdr, line, "AC", tmp+1, line->n_allele-1); + } + free(tmp); +} + +static inline int max_used_gt_ploidy(bcf_fmt_t *fmt, int nsmpl) +{ + int i,j, max_ploidy = 0; + + #define BRANCH(type_t, vector_end) { \ + type_t *ptr = (type_t*) fmt->p; \ + for (i=0; in; j++) \ + if ( ptr[j]==vector_end ) break; \ + if ( j==fmt->n ) \ + { \ + /* all fields were used */ \ + if ( max_ploidy < j ) max_ploidy = j; \ + break; \ + } \ + if ( max_ploidy < j ) max_ploidy = j; \ + ptr += fmt->n; \ + } \ + } + switch (fmt->type) + { + case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; + default: error("Unexpected case: %d\n", fmt->type); + } + #undef BRANCH + return max_ploidy; +} + +// Sets ma->laa to local indexes relevant for each sample or missing/vector_end. +// The indexes are with respect to the source indexes and must be translated as +// the very last step. +void init_local_alleles(args_t *args, bcf1_t *out, int ifmt_PL) +{ + bcf_srs_t *files = args->files; + maux_t *ma = args->maux; + int i,j,k,l, ismpl = 0, nlaa = 0; + static int warned = 0; + + hts_expand(double,out->n_allele,ma->ntmpd,ma->tmpd); // allele probabilities + hts_expand(int,out->n_allele,ma->ntmpi,ma->tmpi); // indexes of the sorted probabilities + + // Let map[] be the mapping from src to output idx. Then k2k[] is mapping from src allele idxs to src allele idxs + // reordered so that if in_allele,ma->nk2k,ma->k2k); + + // Determine local alleles: either take all that are present in the reader or use PL to determine the best + // subset for each sample. The alleles must be listed in the order of the alleles in the output file. + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = ma->fmt_map[files->nreaders*ifmt_PL+i]; + bcf1_t *line = maux_get_line(args, i); + int nsmpl = bcf_hdr_nsamples(hdr); + if ( line ) + { + if ( nlaa < line->n_allele - 1 ) + nlaa = line->n_allele - 1 <= args->local_alleles ? line->n_allele - 1 : args->local_alleles; + + for (j=0; jn_allele; j++) ma->k2k[j] = j; + + if ( line->n_allele <= args->local_alleles + 1 ) + { + // sort to the output order, insertion sort, ascending + int *map = ma->buf[i].rec[ma->buf[i].cur].map; + int *k2k = ma->k2k; + int tmp; + for (k=1; kn_allele; k++) + for (l=k; l>0 && map[k2k[l]] < map[k2k[l-1]]; l--) + tmp = k2k[l], k2k[l] = k2k[l-1], k2k[l-1] = tmp; + + // fewer than the allowed number of alleles, use all alleles from this file + for (j=0; jlaa + (1+args->local_alleles)*ismpl; + for (k=0; kn_allele; k++) ptr[k] = k2k[k]; + for (; k<=args->local_alleles; k++) ptr[k] = bcf_int32_vector_end; + ismpl++; + } + continue; + } + } + if ( !line || !fmt_ori ) + { + // no values, fill in missing values + for (j=0; jlaa + (1+args->local_alleles)*ismpl; + ptr[0] = bcf_int32_missing; + for (k=1; k<=args->local_alleles; k++) ptr[k] = bcf_int32_vector_end; + ismpl++; + } + continue; + } + + // there are more alternate alleles in the input files than is allowed on output, need to subset + if ( ifmt_PL==-1 ) + { + if ( !warned ) + fprintf(bcftools_stderr,"Warning: local alleles are determined from FORMAT/PL but the tag is missing, cannot apply --local-alleles\n"); + warned = 1; + ma->nlaa = 0; + return; + } + + if ( !IS_VL_G(hdr, fmt_ori->id) ) error("FORMAT/PL must be defined as Number=G\n"); + if ( 2*fmt_ori->n != line->n_allele*(line->n_allele+1) ) error("Todo: haploid PL to LPL\n"); + + int *map = ma->buf[i].rec[ma->buf[i].cur].map; + double *allele_prob = ma->tmpd; + int *idx = ma->tmpi; + #define BRANCH(src_type_t, src_is_missing, src_is_vector_end, pl2prob_idx) { \ + src_type_t *src = (src_type_t*) fmt_ori->p; \ + for (j=0; jn_allele; k++) allele_prob[k] = 0; \ + for (k=0; kn_allele; k++) \ + for (l=0; l<=k; l++) \ + { \ + if ( src_is_missing || src_is_vector_end ) { src++; continue; } \ + double prob = ma->pl2prob[pl2prob_idx]; \ + allele_prob[k] += prob; \ + allele_prob[l] += prob; \ + src++; \ + } \ + /* insertion sort by allele probability, descending order, with the twist that REF (idx=0) always comes first */ \ + allele_prob++; idx[0] = -1; idx++; /* keep REF first */ \ + int si,sj,tmp; \ + for (si=0; sin_allele-1; si++) idx[si] = si; \ + for (si=1; sin_allele-1; si++) \ + for (sj=si; sj>0 && allele_prob[idx[sj]] > allele_prob[idx[sj-1]]; sj--) \ + tmp = idx[sj], idx[sj] = idx[sj-1], idx[sj-1] = tmp; \ + /*for debugging only: test order*/ \ + for (si=1; sin_allele-1; si++) \ + assert( allele_prob[idx[si-1]] >= allele_prob[idx[si]] ); \ + allele_prob--; idx--; /* this was to keep REF first */ \ + int32_t *ptr = ma->laa + (1+args->local_alleles)*ismpl; \ + ptr[0] = 0; \ + for (k=1; k<=args->local_alleles && kn_allele; k++) ptr[k] = idx[k]+1; \ + int kmax = k; \ + for (; k<=args->local_alleles; k++) ptr[k] = bcf_int32_vector_end; \ + /* insertion sort by indexes to the output order, ascending */ \ + for (k=1; k0 && map[ptr[l]] < map[ptr[l-1]]; l--) \ + tmp = ptr[l], ptr[l] = ptr[l-1], ptr[l-1] = tmp; \ + ismpl++; \ + } \ + } + switch (fmt_ori->type) + { + case BCF_BT_INT8: BRANCH( int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, *src); break; + case BCF_BT_INT16: BRANCH(int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, *src>=0 && *src=0 && *srctype); + } + #undef BRANCH + } + ma->nlaa = nlaa; +} + +void update_local_alleles(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + maux_t *ma = args->maux; + int i,j,k,ismpl=0,nsamples = bcf_hdr_nsamples(args->out_hdr); + for (i=0; inreaders; i++) + { + int irec = ma->buf[i].cur; + bcf_sr_t *reader = &files->readers[i]; + int nsmpl = bcf_hdr_nsamples(reader->header); + for (k=0; klaa + ismpl*(1+args->local_alleles); + int32_t *dst = ma->laa + ismpl*ma->nlaa; + j = 0; + if ( irec>=0 ) + { + for (; jnlaa; j++) + { + if ( src[j+1]==bcf_int32_missing ) dst[j] = bcf_int32_missing; + else if ( src[j+1]==bcf_int32_vector_end ) break; + else + dst[j] = ma->buf[i].rec[irec].map[src[j+1]]; + } + } + if ( j==0 ) dst[j++] = bcf_int32_missing; + for (; jnlaa; j++) src[j] = bcf_int32_vector_end; + ismpl++; + } + } + bcf_update_format_int32(args->out_hdr, out, "LAA", ma->laa, nsamples*ma->nlaa); +} + +void merge_GT(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + maux_t *ma = args->maux; + int i, ismpl = 0, nsamples = bcf_hdr_nsamples(out_hdr); + static int warned = 0; + + int nsize = 0; + for (i=0; inreaders; i++) + { + bcf_fmt_t *fmt = fmt_map[i]; + if ( !fmt ) continue; + int pld = max_used_gt_ploidy(fmt_map[i], bcf_hdr_nsamples(bcf_sr_get_header(args->files,i))); + if ( nsize < pld ) nsize = pld; + } + if ( nsize==0 ) nsize = 1; + + size_t msize = sizeof(int32_t)*nsize*nsamples; + if ( msize > 2147483647 ) + { + if ( !warned ) fprintf(bcftools_stderr,"Warning: Too many genotypes at %s:%"PRId64", requires %zu bytes, skipping.\n", bcf_seqname(out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Could not allocate %zu bytes\n",msize); + ma->ntmp_arr = msize; + } + memset(ma->smpl_ploidy,0,nsamples*sizeof(int)); + + int default_gt = args->missing_to_ref ? bcf_gt_unphased(0) : bcf_gt_missing; + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + int32_t *tmp = (int32_t *) ma->tmp_arr + ismpl*nsize; + int irec = ma->buf[i].cur; + + int j,k; + if ( !fmt_ori ) + { + // missing values: assume maximum ploidy + for (j=0; jsmpl_ploidy[ismpl+j]++; } + tmp += nsize; + } + ismpl += bcf_hdr_nsamples(hdr); + continue; + } + + #define BRANCH(type_t, vector_end) { \ + type_t *p_ori = (type_t*) fmt_ori->p; \ + if ( !ma->buf[i].rec[irec].als_differ ) \ + { \ + /* the allele numbering is unchanged */ \ + for (j=0; jn; k++) \ + { \ + if ( p_ori[k]==vector_end ) break; /* smaller ploidy */ \ + ma->smpl_ploidy[ismpl+j]++; \ + if ( bcf_gt_is_missing(p_ori[k]) ) tmp[k] = 0; /* missing allele */ \ + else tmp[k] = p_ori[k]; \ + } \ + for (; kn; \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + continue; \ + } \ + /* allele numbering needs to be changed */ \ + for (j=0; jn; k++) \ + { \ + if ( p_ori[k]==vector_end ) break; /* smaller ploidy */ \ + ma->smpl_ploidy[ismpl+j]++; \ + if ( bcf_gt_is_missing(p_ori[k]) ) tmp[k] = 0; /* missing allele */ \ + else \ + { \ + int al = (p_ori[k]>>1) - 1; \ + al = al<=0 ? al + 1 : ma->buf[i].rec[irec].map[al] + 1; \ + tmp[k] = (al << 1) | ((p_ori[k])&1); \ + } \ + } \ + for (; kn; \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + } + switch (fmt_ori->type) + { + case BCF_BT_INT8: BRANCH(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, bcf_int32_vector_end); break; + default: error("Unexpected case: %d\n", fmt_ori->type); + } + #undef BRANCH + } + bcf_update_format_int32(out_hdr, out, "GT", (int32_t*)ma->tmp_arr, nsamples*nsize); +} + +void merge_format_string(args_t *args, const char *key, bcf_fmt_t **fmt_map, bcf1_t *out, int length, int nsize) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + maux_t *ma = args->maux; + int i,j, nsamples = bcf_hdr_nsamples(out_hdr); + static int warned = 0; + + // initialize empty strings, a dot for each value, e.g. ".,.,." + int nmax = 0; + for (i=0; istr[i]; + if ( length==BCF_VL_FIXED || length==BCF_VL_VAR ) + { + str->l = 1; + ks_resize(str, str->l+1); + str->s[0] = '.'; + } + else + { + str->l = nsize*2 - 1; + ks_resize(str, str->l+1); + str->s[0] = '.'; + for (j=1; js[j*2-1] = ',', str->s[j*2] = '.'; + } + str->s[str->l] = 0; + if ( nmax < str->l ) nmax = str->l; + } + + // fill in values for each sample + int ismpl = 0; + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + if ( !fmt_ori ) + { + // the field is not present in this file + ismpl += bcf_hdr_nsamples(hdr); + continue; + } + + bcf1_t *line = maux_get_line(args, i); + int irec = ma->buf[i].cur; + char *src = (char*) fmt_ori->p; + + if ( length==BCF_VL_FIXED || length==BCF_VL_VAR || (line->n_allele==out->n_allele && !ma->buf[i].rec[irec].als_differ) ) + { + // alleles unchanged, copy over + for (j=0; jstr[ismpl++]; + str->l = 0; + kputsn(src, fmt_ori->n, str); + if ( nmax < str->l ) nmax = str->l; + src += fmt_ori->n; + } + continue; + } + // NB, what is below is not the fastest way, copy_string_field() keeps + // finding the indexes repeatedly at multiallelic sites + if ( length==BCF_VL_A || length==BCF_VL_R ) + { + int ifrom = length==BCF_VL_A ? 1 : 0; + for (j=0; jstr[ismpl++]; + int iori,inew; + for (iori=ifrom; iorin_allele; iori++) + { + inew = ma->buf[i].rec[irec].map[iori] - ifrom; + int ret = copy_string_field(src, iori - ifrom, fmt_ori->size, str, inew); + if ( ret<-1 ) error("[E::%s] fixme: internal error at %s:%"PRId64" .. %d\n",__func__,bcf_seqname(hdr,line),(int64_t) line->pos+1,ret); + } + if ( nmax < str->l ) nmax = str->l; + src += fmt_ori->size; + } + continue; + } + assert( length==BCF_VL_G ); + error("[E::%s] Merging of Number=G FORMAT strings (in your case FORMAT/%s) is not supported yet, sorry!\n" + "Please open an issue on github if this feature is essential for you. However, note that using FORMAT strings is not\n" + "a good idea in general - it is slow to parse and does not compress well, it is better to use integer codes instead.\n" + "If you don't really need it, use `bcftools annotate -x` to remove the annotation before merging.\n", __func__,key); + } + // update the record + size_t msize = nsamples*nmax; + if ( msize > 2147483647 ) + { + if ( !warned ) fprintf(bcftools_stderr,"Warning: The row size is too big for FORMAT/%s at %s:%"PRId64", requires %zu bytes, skipping.\n", key,bcf_seqname(out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Could not allocate %zu bytes\n",msize); + ma->ntmp_arr = msize; + } + char *tgt = (char*) ma->tmp_arr; + for (i=0; istr[i].s, ma->str[i].l); + if ( ma->str[i].l < nmax ) memset(tgt + ma->str[i].l, 0, nmax - ma->str[i].l); + tgt += nmax; + } + bcf_update_format_char(out_hdr, out, key, (float*)ma->tmp_arr, nsamples*nmax); +} + +// Note: only diploid Number=G tags only for now +void merge_localized_numberG_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out, int irdr) +{ + int i,j,k, nsamples = bcf_hdr_nsamples(args->out_hdr); + bcf_srs_t *files = args->files; + maux_t *ma = args->maux; + bcf_fmt_t *fmt = fmt_map[irdr]; + const char *key = files->readers[irdr].header->id[BCF_DT_ID][fmt_map[irdr]->id].key; + size_t nsize = (ma->nlaa+1)*(ma->nlaa+2)/2; // max number of Number=G localized fields + size_t msize = sizeof(float)>sizeof(int32_t) ? sizeof(float) : sizeof(int32_t); + msize *= nsamples*nsize; + if ( msize > 2147483647 ) + { + static int warned = 0; + if ( !warned ) fprintf(bcftools_stderr,"Warning: The row size is too big for FORMAT/%s at %s:%"PRId64", requires %zu bytes, skipping.\n", key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Failed to allocate %zu bytes at %s:%"PRId64" for FORMAT/%s\n", msize,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,key); + ma->ntmp_arr = msize; + } + int ismpl = 0; + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + bcf1_t *line = maux_get_line(args, i); + int nsmpl = bcf_hdr_nsamples(hdr); + + if ( !fmt_ori ) + { + // fill missing values + #define BRANCH(tgt_type_t, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; jtmp_arr + ismpl*nsize; \ + tgt_set_missing; \ + for (k=1; ktype) + { + case BCF_BT_INT8: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; + default: error("Unexpected case: %d, %s\n", fmt->type, key); + } + #undef BRANCH + continue; + } + if ( 2*fmt_ori->n!=line->n_allele*(line->n_allele+1) ) error("Todo: localization of missing or haploid Number=G tags\n"); + + // localize + #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; jp + j*fmt_ori->n; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + int *laa = ma->laa + (1+args->local_alleles)*ismpl; \ + int ii,ij,tgt_idx = 0; \ + for (ii=0; ii<=ma->nlaa; ii++) \ + { \ + if ( laa[ii]==bcf_int32_missing || laa[ii]==bcf_int32_vector_end ) break; \ + for (ij=0; ij<=ii; ij++) \ + { \ + int src_idx = bcf_alleles2gt(laa[ii],laa[ij]); \ + if ( src_is_missing ) tgt_set_missing; \ + else if ( src_is_vector_end ) break; \ + else tgt[tgt_idx] = src[src_idx]; \ + tgt_idx++; \ + } \ + } \ + if ( !tgt_idx ) { tgt_set_missing; tgt_idx++; } \ + for (; tgt_idxtype) + { + case BCF_BT_INT8: BRANCH(int32_t, int8_t, src[src_idx]==bcf_int8_missing, src[src_idx]==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, src[src_idx]==bcf_int16_missing, src[src_idx]==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, src[src_idx]==bcf_int32_missing, src[src_idx]==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(src[src_idx]), bcf_float_is_vector_end(src[src_idx]), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; + default: error("Unexpected case: %d, %s\n", fmt_ori->type, key); + } + #undef BRANCH + } + args->tmps.l = 0; + kputc('L',&args->tmps); + kputs(key,&args->tmps); + if ( fmt_map[irdr]->type==BCF_BT_FLOAT ) + bcf_update_format_float(args->out_hdr, out, args->tmps.s, (float*)ma->tmp_arr, nsamples*nsize); + else + bcf_update_format_int32(args->out_hdr, out, args->tmps.s, (int32_t*)ma->tmp_arr, nsamples*nsize); + ma->laa_dirty = 1; +} +void merge_localized_numberAR_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out, int irdr) +{ + int i,j,k, nsamples = bcf_hdr_nsamples(args->out_hdr); + bcf_srs_t *files = args->files; + maux_t *ma = args->maux; + bcf_fmt_t *fmt = fmt_map[irdr]; + const char *key = files->readers[irdr].header->id[BCF_DT_ID][fmt->id].key; + size_t nsize = IS_VL_R(files->readers[irdr].header, fmt->id) ? ma->nlaa + 1 : ma->nlaa; + size_t msize = sizeof(float)>sizeof(int32_t) ? sizeof(float) : sizeof(int32_t); + msize *= nsamples*nsize; + if ( msize > 2147483647 ) + { + static int warned = 0; + if ( !warned ) fprintf(bcftools_stderr,"Warning: The row size is too big for FORMAT/%s at %s:%"PRId64", requires %zu bytes, skipping.\n", key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Failed to allocate %zu bytes at %s:%"PRId64" for FORMAT/%s\n", msize,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,key); + ma->ntmp_arr = msize; + } + int ismpl = 0, ibeg = IS_VL_R(files->readers[irdr].header, fmt->id) ? 0 : 1;; + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + int nsmpl = bcf_hdr_nsamples(hdr); + + if ( !fmt_ori ) + { + // fill missing values + #define BRANCH(tgt_type_t, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; jtmp_arr + ismpl*nsize; \ + tgt_set_missing; \ + for (k=1; ktype) + { + case BCF_BT_INT8: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; + default: error("Unexpected case: %d, %s\n", fmt->type, key); + } + #undef BRANCH + continue; + } + + // localize + #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + for (j=0; jp + j*fmt_ori->n; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + int *laa = ma->laa + (1+args->local_alleles)*ismpl; \ + int ii,tgt_idx = 0; \ + for (ii=ibeg; ii<=ma->nlaa; ii++) \ + { \ + if ( laa[ii]==bcf_int32_missing || laa[ii]==bcf_int32_vector_end ) break; \ + int src_idx = laa[ii] - ibeg; \ + if ( src_is_missing ) tgt_set_missing; \ + else if ( src_is_vector_end ) break; \ + else tgt[tgt_idx] = src[src_idx]; \ + tgt_idx++; \ + } \ + if ( !tgt_idx ) { tgt_set_missing; tgt_idx++; } \ + for (; tgt_idxtype) + { + case BCF_BT_INT8: BRANCH(int32_t, int8_t, src[src_idx]==bcf_int8_missing, src[src_idx]==bcf_int8_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, src[src_idx]==bcf_int16_missing, src[src_idx]==bcf_int16_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, src[src_idx]==bcf_int32_missing, src[src_idx]==bcf_int32_vector_end, tgt[tgt_idx]=bcf_int32_missing, tgt[tgt_idx]=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(src[src_idx]), bcf_float_is_vector_end(src[src_idx]), bcf_float_set_missing(tgt[tgt_idx]), bcf_float_set_vector_end(tgt[tgt_idx])); break; + default: error("Unexpected case: %d, %s\n", fmt_ori->type, key); + } + #undef BRANCH + } + args->tmps.l = 0; + kputc('L',&args->tmps); + kputs(key,&args->tmps); + if ( fmt_map[irdr]->type==BCF_BT_FLOAT ) + bcf_update_format_float(args->out_hdr, out, args->tmps.s, (float*)ma->tmp_arr, nsamples*nsize); + else + bcf_update_format_int32(args->out_hdr, out, args->tmps.s, (int32_t*)ma->tmp_arr, nsamples*nsize); + ma->laa_dirty = 1; +} +void merge_format_field(args_t *args, bcf_fmt_t **fmt_map, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + maux_t *ma = args->maux; + int i, ismpl = 0, nsamples = bcf_hdr_nsamples(out_hdr); + static int warned = 0; + + const char *key = NULL; + size_t nsize = 0, length = BCF_VL_FIXED; + int type = -1; + for (i=0; inreaders; i++) + { + if ( !maux_get_line(args,i) ) continue; + if ( !fmt_map[i] ) continue; + if ( !key ) key = files->readers[i].header->id[BCF_DT_ID][fmt_map[i]->id].key; + type = fmt_map[i]->type; + if ( IS_VL_G(files->readers[i].header, fmt_map[i]->id) ) + { + length = BCF_VL_G; + nsize = out->n_allele*(out->n_allele + 1)/2; + break; + } + if ( IS_VL_A(files->readers[i].header, fmt_map[i]->id) ) + { + length = BCF_VL_A; + nsize = out->n_allele - 1; + break; + } + if ( IS_VL_R(files->readers[i].header, fmt_map[i]->id) ) + { + length = BCF_VL_R; + nsize = out->n_allele; + break; + } + if ( fmt_map[i]->n > nsize ) nsize = fmt_map[i]->n; + } + if ( ma->nlaa && length!=BCF_VL_FIXED ) + { + if ( length==BCF_VL_G ) merge_localized_numberG_format_field(args,fmt_map,out,i); + else if ( length==BCF_VL_A || length==BCF_VL_R ) merge_localized_numberAR_format_field(args,fmt_map,out,i); + return; + } + + if ( type==BCF_BT_CHAR ) + { + merge_format_string(args, key, fmt_map, out, length, nsize); + return; + } + + size_t msize = sizeof(float)>sizeof(int32_t) ? sizeof(float) : sizeof(int32_t); + msize *= nsamples*nsize; + if ( msize > 2147483647 ) + { + if ( !warned ) fprintf(bcftools_stderr,"Warning: The row size is too big for FORMAT/%s at %s:%"PRId64", requires %zu bytes, skipping.\n", key,bcf_seqname(out_hdr,out),(int64_t) out->pos+1,msize); + warned = 1; + return; + } + if ( ma->ntmp_arr < msize ) + { + ma->tmp_arr = realloc(ma->tmp_arr, msize); + if ( !ma->tmp_arr ) error("Failed to allocate %zu bytes at %s:%"PRId64" for FORMAT/%s\n", msize,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,key); + ma->ntmp_arr = msize; + } + + // Fill the temp array for all samples by collecting values from all files + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + bcf_fmt_t *fmt_ori = fmt_map[i]; + bcf1_t *line = maux_get_line(args, i); + int irec = ma->buf[i].cur; + + if ( fmt_ori ) + { + type = fmt_ori->type; + int nals_ori = line->n_allele; + if ( length==BCF_VL_G ) + { + // if all fields are missing then n==1 is valid + if ( fmt_ori->n!=1 && fmt_ori->n != nals_ori*(nals_ori+1)/2 && fmt_map[i]->n != nals_ori ) + error("Incorrect number of FORMAT/%s values at %s:%"PRId64", cannot merge. The tag is defined as Number=G, but found\n" + "%d values and %d alleles. See also http://samtools.github.io/bcftools/howtos/FAQ.html#incorrect-nfields\n", + key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,fmt_ori->n,nals_ori); + } + else if ( length==BCF_VL_A ) + { + if ( fmt_ori->n!=1 && fmt_ori->n != nals_ori-1 ) + error("Incorrect number of FORMAT/%s values at %s:%"PRId64", cannot merge. The tag is defined as Number=A, but found\n" + "%d values and %d alleles. See also http://samtools.github.io/bcftools/howtos/FAQ.html#incorrect-nfields\n", + key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,fmt_ori->n,nals_ori); + } + else if ( length==BCF_VL_R ) + { + if ( fmt_ori->n!=1 && fmt_ori->n != nals_ori ) + error("Incorrect number of FORMAT/%s values at %s:%"PRId64", cannot merge. The tag is defined as Number=R, but found\n" + "%d values and %d alleles. See also http://samtools.github.io/bcftools/howtos/FAQ.html#incorrect-nfields\n", + key,bcf_seqname(args->out_hdr,out),(int64_t) out->pos+1,fmt_ori->n,nals_ori); + } + } + + // set the values + #define BRANCH(tgt_type_t, src_type_t, src_is_missing, src_is_vector_end, tgt_set_missing, tgt_set_vector_end) { \ + int j, l, k; \ + tgt_type_t *tgt = (tgt_type_t *) ma->tmp_arr + ismpl*nsize; \ + if ( !fmt_ori ) \ + { \ + /* the field is not present in this file, set missing values */ \ + for (j=0; jp; \ + if ( (length!=BCF_VL_G && length!=BCF_VL_A && length!=BCF_VL_R) || (line->n_allele==out->n_allele && !ma->buf[i].rec[irec].als_differ) ) \ + { \ + /* alleles unchanged, copy over */ \ + for (j=0; jn; l++) \ + { \ + if ( src_is_vector_end ) break; \ + else if ( src_is_missing ) tgt_set_missing; \ + else *tgt = *src; \ + tgt++; src++; \ + } \ + for (k=l; kn - l; \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + continue; \ + } \ + /* allele numbering needs to be changed */ \ + if ( length==BCF_VL_G ) \ + { \ + /* Number=G tags */ \ + for (j=0; jtmp_arr + (ismpl+j)*nsize; \ + src = (src_type_t*) fmt_ori->p + j*fmt_ori->n; \ + if ( (src_is_missing && fmt_ori->n==1) || (++src && src_is_vector_end) ) \ + { \ + /* tag with missing value "." */ \ + tgt_set_missing; \ + for (l=1; lsmpl_ploidy[ismpl+j]==1 ? out->n_allele : out->n_allele*(out->n_allele + 1)/2; \ + for (l=0; lsmpl_ploidy[ismpl+j]==1 ) \ + { \ + /* Haploid */ \ + int iori, inew; \ + for (iori=0; iorin_allele; iori++) \ + { \ + inew = ma->buf[i].rec[irec].map[iori]; \ + src = (src_type_t*) fmt_ori->p + j*fmt_ori->n + iori; \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + inew; \ + if ( src_is_vector_end ) break; \ + if ( src_is_missing ) tgt_set_missing; \ + else *tgt = *src; \ + } \ + } \ + else \ + { \ + /* Diploid */ \ + int iori,jori, inew,jnew; \ + for (iori=0; iorin_allele; iori++) \ + { \ + inew = ma->buf[i].rec[irec].map[iori]; \ + for (jori=0; jori<=iori; jori++) \ + { \ + jnew = ma->buf[i].rec[irec].map[jori]; \ + int kori = iori*(iori+1)/2 + jori; \ + int knew = inew>jnew ? inew*(inew+1)/2 + jnew : jnew*(jnew+1)/2 + inew; \ + src = (src_type_t*) fmt_ori->p + j*fmt_ori->n + kori; \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + knew; \ + if ( src_is_vector_end ) \ + { \ + iori = line->n_allele; \ + break; \ + } \ + if ( src_is_missing ) tgt_set_missing; \ + else *tgt = *src; \ + } \ + } \ + } \ + } \ + } \ + else \ + { \ + /* Number=A or Number=R tags */ \ + int ifrom = length==BCF_VL_A ? 1 : 0; \ + for (j=0; jtmp_arr + (ismpl+j)*nsize; \ + src = (src_type_t*) (fmt_ori->p + j*fmt_ori->size); \ + if ( (src_is_missing && fmt_ori->n==1) || (++src && src_is_vector_end) ) \ + { \ + /* tag with missing value "." */ \ + tgt_set_missing; \ + for (l=1; lp + j*fmt_ori->size); \ + for (l=0; ln_allele; iori++) \ + { \ + inew = ma->buf[i].rec[irec].map[iori] - ifrom; \ + tgt = (tgt_type_t *) ma->tmp_arr + (ismpl+j)*nsize + inew; \ + if ( src_is_vector_end ) break; \ + if ( src_is_missing ) tgt_set_missing; \ + else *tgt = *src; \ + src++; \ + } \ + } \ + } \ + ismpl += bcf_hdr_nsamples(hdr); \ + } + switch (type) + { + case BCF_BT_INT8: BRANCH(int32_t, int8_t, *src==bcf_int8_missing, *src==bcf_int8_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT16: BRANCH(int32_t, int16_t, *src==bcf_int16_missing, *src==bcf_int16_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_INT32: BRANCH(int32_t, int32_t, *src==bcf_int32_missing, *src==bcf_int32_vector_end, *tgt=bcf_int32_missing, *tgt=bcf_int32_vector_end); break; + case BCF_BT_FLOAT: BRANCH(float, float, bcf_float_is_missing(*src), bcf_float_is_vector_end(*src), bcf_float_set_missing(*tgt), bcf_float_set_vector_end(*tgt)); break; + default: error("Unexpected case: %d, %s\n", type, key); + } + #undef BRANCH + } + if ( type==BCF_BT_FLOAT ) + bcf_update_format_float(out_hdr, out, key, (float*)ma->tmp_arr, nsamples*nsize); + else + bcf_update_format_int32(out_hdr, out, key, (int32_t*)ma->tmp_arr, nsamples*nsize); +} + +void merge_format(args_t *args, bcf1_t *out) +{ + bcf_srs_t *files = args->files; + bcf_hdr_t *out_hdr = args->out_hdr; + maux_t *ma = args->maux; + if ( !ma->nfmt_map ) + { + ma->nfmt_map = 2; + ma->fmt_map = (bcf_fmt_t**) calloc(ma->nfmt_map*files->nreaders, sizeof(bcf_fmt_t*)); + } + else + memset(ma->fmt_map, 0, ma->nfmt_map*files->nreaders*sizeof(bcf_fmt_t**)); + + khiter_t kitr; + strdict_t *tmph = args->tmph; + kh_clear(strdict, tmph); + int i, j, ret, has_GT = 0, has_PL = -1, max_ifmt = 0; // max fmt index + for (i=0; inreaders; i++) + { + bcf1_t *line = maux_get_line(args,i); + if ( !line ) continue; + bcf_sr_t *reader = &files->readers[i]; + bcf_hdr_t *hdr = reader->header; + for (j=0; jn_fmt; j++) + { + // Wat this tag already seen? + bcf_fmt_t *fmt = &line->d.fmt[j]; + const char *key = hdr->id[BCF_DT_ID][fmt->id].key; + kitr = kh_get(strdict, tmph, key); + + int ifmt; + if ( kitr != kh_end(tmph) ) + ifmt = kh_value(tmph, kitr); // seen + else + { + // new FORMAT tag + if ( key[0]=='G' && key[1]=='T' && key[2]==0 ) { has_GT = 1; ifmt = 0; } + else + { + ifmt = ++max_ifmt; + if ( max_ifmt >= ma->nfmt_map ) + { + ma->fmt_map = (bcf_fmt_t**) realloc(ma->fmt_map, sizeof(bcf_fmt_t*)*(max_ifmt+1)*files->nreaders); + memset(ma->fmt_map+ma->nfmt_map*files->nreaders, 0, (max_ifmt-ma->nfmt_map+1)*files->nreaders*sizeof(bcf_fmt_t*)); + ma->nfmt_map = max_ifmt+1; + } + if ( key[0]=='P' && key[1]=='L' && key[2]==0 ) { has_PL = ifmt; } + } + kitr = kh_put(strdict, tmph, key, &ret); + kh_value(tmph, kitr) = ifmt; + } + ma->fmt_map[ifmt*files->nreaders+i] = fmt; + } + // Check if the allele numbering must be changed + int irec = ma->buf[i].cur; + for (j=1; jn_allele; j++) + if ( ma->buf[i].rec[irec].map[j]!=j ) break; + ma->buf[i].rec[irec].als_differ = j==line->n_allele ? 0 : 1; + } + + if ( args->local_alleles ) + { + ma->laa_dirty = ma->nlaa = 0; + if ( out->n_allele > args->local_alleles + 1 ) init_local_alleles(args, out, has_PL); + } + + out->n_sample = bcf_hdr_nsamples(out_hdr); + if ( has_GT ) + merge_GT(args, ma->fmt_map, out); + if ( !args->keep_AC_AN ) + update_AN_AC(out_hdr, out); + + for (i=1; i<=max_ifmt; i++) + merge_format_field(args, &ma->fmt_map[i*files->nreaders], out); + + if ( ma->laa_dirty ) + update_local_alleles(args, out); + + out->d.indiv_dirty = 1; +} + +void gvcf_set_alleles(args_t *args) +{ + int i,k; + bcf_srs_t *files = args->files; + maux_t *maux = args->maux; + gvcf_aux_t *gaux = maux->gvcf; + for (i=0; inals; i++) + { + free(maux->als[i]); + maux->als[i] = NULL; + } + maux->nals = 0; + + for (i=0; inreaders; i++) + { + if ( !gaux[i].active ) continue; + bcf1_t *line = maux_get_line(args, i); + if ( !line ) continue; + int irec = maux->buf[i].cur; + + hts_expand(int, line->n_allele, maux->buf[i].rec[irec].mmap, maux->buf[i].rec[irec].map); + if ( !maux->nals ) // first record, copy the alleles to the output + { + maux->nals = line->n_allele; + hts_expand0(char*, maux->nals, maux->mals, maux->als); + hts_expand0(int, maux->nals, maux->ncnt, maux->cnt); + for (k=0; knals; k++) + { + if ( maux->als[k] ) free(maux->als[k]); + maux->als[k] = strdup(line->d.allele[k]); + maux->buf[i].rec[irec].map[k] = k; + } + } + else + { + maux->als = merge_alleles(line->d.allele, line->n_allele, maux->buf[i].rec[irec].map, maux->als, &maux->nals, &maux->mals); + if ( !maux->als ) + { + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,i); + error("Failed to merge alleles at %s:%"PRId64"\n",bcf_seqname(hdr,line),(int64_t) line->pos+1); + } + } + } +} + +/* + Output staged gVCF blocks, end is the last position of the block. Assuming + gaux[i].active flags are set and maux_get_line returns correct lines. + Both start,end coordinates are 0-based. +*/ +void gvcf_write_block(args_t *args, int start, int end) +{ + int i; + maux_t *maux = args->maux; + gvcf_aux_t *gaux = maux->gvcf; + assert(gaux); + + // Update POS + int min = INT_MAX; // the minimum active gVCF INFO/END (0-based) + char ref = 'N'; + for (i=0; ifiles->nreaders; i++) + { + if ( !gaux[i].active ) continue; + if ( ref=='N' && gaux[i].line->pos==start ) ref = gaux[i].line->d.allele[0][0]; + gaux[i].line->pos = start; + } + for (i=0; ifiles->nreaders; i++) + { + if ( !gaux[i].active ) continue; + if ( gaux[i].end < start ) + { + gaux[i].active = 0; + maux->buf[i].cur = -1; + continue; + } + gaux[i].line->d.allele[0][0] = ref; + if ( min > gaux[i].end ) min = gaux[i].end; + } + // Check for valid gVCF blocks in this region + if ( min==INT_MAX ) // this probably should not happen + { + assert(0); + maux->gvcf_min = 0; + return; + } + + bcf1_t *out = args->out_line; + + gvcf_set_alleles(args); + + // Merge the staged lines + merge_chrom2qual(args, out); + merge_filter(args, out); + merge_info(args, out); + merge_format(args, out); + + if ( args->gvcf_fai && out->d.allele[0][0]=='N' ) + { + int slen = 0; + char *seq = faidx_fetch_seq(args->gvcf_fai,maux->chr,out->pos,out->pos,&slen); + if (slen) + { + out->d.allele[0][0] = seq[0]; + free(seq); + } + } + + // Update END boundary + if ( end > start ) + { + end++; + bcf_update_info_int32(args->out_hdr, out, "END", &end, 1); + } + else + bcf_update_info_int32(args->out_hdr, out, "END", NULL, 0); + if ( bcf_write1(args->out_fh, args->out_hdr, out)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + bcf_clear1(out); + + + // Inactivate blocks which do not extend beyond END and find new gvcf_min + min = INT_MAX; + for (i=0; ifiles->nreaders; i++) + { + if ( !gaux[i].active ) continue; + if ( gaux[i].end < end ) + { + gaux[i].active = 0; + maux->buf[i].cur = -1; + continue; + } + // next min END position bigger than the current one + if ( maux->gvcf_min < gaux[i].end+1 && min > gaux[i].end+1 ) min = gaux[i].end + 1; + } + maux->gvcf_min = min==INT_MAX ? 0 : min; +} + +/* + Flush staged gVCF blocks. Flush everything if there are no more lines + (done=1) or if there is a new chromosome. If still on the same chromosome, + all hanging blocks must be ended by creating new records: + A + 1 END=10 + B + 3 END=7 + C + 3 END=5 + out + 1 END=2 A . . + 3 END=5 A B C + 6 END=7 A B . + 8 END=10 A . . + +*/ +void gvcf_flush(args_t *args, int done) +{ + int i; + maux_t *maux = args->maux; + + if ( !maux->chr ) return; // first time here, nothing to flush + + int flush_until = INT_MAX; + if ( !done ) + { + // Get current position and chromosome + for (i=0; in; i++) + if ( bcf_sr_has_line(maux->files,i) ) break; + bcf1_t *line = bcf_sr_get_line(maux->files,i); + bcf_hdr_t *hdr = bcf_sr_get_header(maux->files,i); + + if ( !strcmp(maux->chr,bcf_seqname(hdr,line)) ) flush_until = line->pos; // still on the same chr + } + + // When called on a region, trim the blocks accordingly + int start = maux->gvcf_break>=0 ? maux->gvcf_break + 1 : maux->pos; // the start of a new gvcf block to output + if ( args->regs ) + { + int rstart = -1, rend = -1; + if ( regidx_overlap(args->regs,maux->chr,start,flush_until,args->regs_itr) ) + { + // In case there are multiple regions, we treat them as one + rstart = args->regs_itr->beg; + while ( regitr_overlap(args->regs_itr) ) rend = args->regs_itr->end; + } + if ( rstart > start ) start = rstart; + if ( rend < flush_until ) flush_until = rend+1; + } + + // output all finished blocks + while ( maux->gvcf_min && start < flush_until ) + { + // does the block end before the new line or is it interrupted? + int tmp = maux->gvcf_min < flush_until ? maux->gvcf_min : flush_until; + if ( start > tmp-1 ) break; + gvcf_write_block(args,start,tmp-1); // gvcf_min is 1-based, passing 0-based coordinates + start = tmp; + } +} + +static inline int is_gvcf_block(bcf1_t *line) +{ + if ( line->rlen<=1 ) return 0; + if ( strlen(line->d.allele[0])==line->rlen ) return 0; + if ( line->n_allele==1 ) return 1; + + int i; + for (i=1; in_allele; i++) + { + if ( !strcmp(line->d.allele[i],"<*>") ) return 1; + if ( !strcmp(line->d.allele[i],"") ) return 1; + if ( !strcmp(line->d.allele[i],"") ) return 1; + } + return 0; +} + +// Lines can come with any combination of variant types. We use a subset of types defined in vcf.h +// but shift by two bits to account for VCF_REF defined as 0 (design flaw in vcf.h, my fault) and +// to accommodate for VCF_GVCF_REF defined below +static const int + snp_mask = (VCF_SNP<<2)|(VCF_MNP<<2), + indel_mask = VCF_INDEL<<2, + ins_mask = VCF_INS<<2, + del_mask = VCF_DEL<<2, + ref_mask = 2; + +/* + Check incoming lines for new gVCF blocks, set pointer to the current source + buffer (gvcf or readers). In contrast to gvcf_flush, this function can be + called only after maux_reset as it relies on updated maux buffers. + The coordinate is 0-based +*/ +void gvcf_stage(args_t *args, int pos) +{ + maux_t *maux = args->maux; + gvcf_aux_t *gaux = maux->gvcf; + bcf_srs_t *files = args->files; + int32_t *end = (int32_t*) maux->tmp_arr; + int i, nend = maux->ntmp_arr / sizeof(int32_t); + + maux->gvcf_break = -1; + maux->gvcf_min = INT_MAX; + for (i=0; inreaders; i++) + { + if ( gaux[i].active && gaux[i].end < pos ) gaux[i].active = 0; + if ( gaux[i].active ) + { + // gvcf block should not overlap with another record + if ( maux->gvcf_min > gaux[i].end+1 ) maux->gvcf_min = gaux[i].end + 1; + maux->buf[i].beg = 0; + maux->buf[i].end = 1; + maux->buf[i].cur = 0; + continue; + } + + // Does any of the lines have END set? It is enough to check only the + // first line, there should be no duplicate records with END in gVCF + + if ( maux->buf[i].beg==maux->buf[i].end ) continue; // no new record + + int irec = maux->buf[i].beg; + bcf_hdr_t *hdr = bcf_sr_get_header(files, i); + bcf1_t *line = args->files->readers[i].buffer[irec]; + int ret = is_gvcf_block(line) ? bcf_get_info_int32(hdr,line,"END",&end,&nend) : 0; + if ( ret==1 ) + { + if ( end[0] == line->pos + 1 ) // POS and INFO/END are identical, treat as if a normal w/o INFO/END + { + maux->gvcf_break = line->pos; + continue; + } + if ( end[0] <= line->pos ) error("Error: Incorrect END at %s:%"PRId64" .. END=%d\n", bcf_seqname(hdr,line),(int64_t) line->pos+1,end[0]); + + // END is set, this is a new gVCF block. Cache this line in gaux[i] and swap with + // an empty record: the gaux line must be kept until we reach its END. + + gaux[i].active = 1; + gaux[i].end = end[0] - 1; + SWAP(bcf1_t*,args->files->readers[i].buffer[irec],gaux[i].line); + gaux[i].line->pos = pos; + + maux->buf[i].lines = &gaux[i].line; + maux->buf[i].beg = 0; + maux->buf[i].end = 1; + maux->buf[i].cur = 0; + + // Set the rid,pos of the swapped line in the buffer or else the + // synced reader will have a problem with the next line + // + args->files->readers[i].buffer[irec]->rid = maux->buf[i].rid; + args->files->readers[i].buffer[irec]->pos = maux->pos; + + // Update block offsets + if ( maux->gvcf_min > gaux[i].end+1 ) maux->gvcf_min = gaux[i].end + 1; + } + else + maux->gvcf_break = line->pos; // must break the gvcf block + } + maux->ntmp_arr = nend * sizeof(int32_t); + maux->tmp_arr = end; + if ( maux->gvcf_min==INT_MAX ) maux->gvcf_min = 0; +} + + +void debug_buffers(FILE *fp, bcf_srs_t *files); +void debug_buffer(FILE *fp, bcf_srs_t *files, int reader); + +/* + Flush all buffered and processed records with the same coordinate. + Note that synced reader discards buffer[0], so that needs to stay + untouched. +*/ +void clean_buffer(args_t *args) +{ + maux_t *ma = args->maux; + + int ir; + for (ir=0; irn; ir++) + { + // Invalidate pointer to reader's buffer or else gvcf_flush will attempt + // to use the old lines via maux_get_line() + if ( ma->gvcf ) + { + if ( ma->gvcf[ir].active ) + { + if ( ma->pos >= ma->gvcf[ir].end ) ma->gvcf[ir].active = 0; + else if ( ma->buf[ir].cur==-1 ) ma->buf[ir].cur = ma->buf[ir].beg; // re-activate interrupted gVCF block + } + if ( !ma->gvcf[ir].active ) ma->buf[ir].cur = -1; + } + + bcf_sr_t *reader = bcf_sr_get_reader(args->files,ir); + if ( !reader->nbuffer ) continue; // nothing to clean + + bcf1_t **buf = reader->buffer; + if ( buf[1]->rid!=ma->buf[ir].rid || buf[1]->pos!=ma->pos ) continue; // nothing to flush + + int a = 1, b = 2; + while ( b<=reader->nbuffer && buf[b]->rid==ma->buf[ir].rid && buf[b]->pos==ma->pos ) b++; + // b now points to the first line we want to preserve + while ( b<=reader->nbuffer ) + { + SWAP(bcf1_t*, buf[a], buf[b]); + a++; b++; + } + reader->nbuffer -= b-a; + } +} + +void debug_maux(args_t *args) +{ + bcf_srs_t *files = args->files; + maux_t *maux = args->maux; + int j,k,l; + + fprintf(bcftools_stderr,"Alleles to merge at %d, nals=%d\n", maux->pos+1,maux->nals); + for (j=0; jnreaders; j++) + { + bcf_sr_t *reader = &files->readers[j]; + buffer_t *buf = &maux->buf[j]; + fprintf(bcftools_stderr," reader %d: ", j); + for (k=buf->beg; kend; k++) + { + if ( buf->rec[k].skip & SKIP_DONE ) continue; + bcf1_t *line = reader->buffer[k]; + fprintf(bcftools_stderr,"\t"); + if ( buf->rec[k].skip ) fprintf(bcftools_stderr,"["); // this record will not be merged in this round + for (l=0; ln_allele; l++) + fprintf(bcftools_stderr,"%s%s", l==0?"":",", line->d.allele[l]); + if ( buf->rec[k].skip ) fprintf(bcftools_stderr,"]"); + } + fprintf(bcftools_stderr,"\n"); + } + fprintf(bcftools_stderr," counts: "); + for (j=0; jnals; j++) fprintf(bcftools_stderr,"%s %dx %s", j==0?"":",",maux->cnt[j], maux->als[j]); + fprintf(bcftools_stderr,"\n\n"); +} + +void debug_state(args_t *args) +{ + maux_t *maux = args->maux; + int i,j; + for (i=0; ifiles->nreaders; i++) + { + fprintf(bcftools_stderr,"reader %d:\tcur,beg,end=% d,%d,%d", i,maux->buf[i].cur,maux->buf[i].beg,maux->buf[i].end); + if ( maux->buf[i].cur >=0 ) + { + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,i); + const char *chr = bcf_hdr_id2name(hdr, maux->buf[i].rid); + fprintf(bcftools_stderr,"\t"); + for (j=maux->buf[i].beg; jbuf[i].end; j++) fprintf(bcftools_stderr," %s:%"PRId64,chr,(int64_t) maux->buf[i].lines[j]->pos+1); + } + fprintf(bcftools_stderr,"\n"); + } + fprintf(bcftools_stderr,"gvcf_min=%d\n", args->maux->gvcf_min); + for (i=0; ifiles->nreaders; i++) + { + fprintf(bcftools_stderr,"reader %d:\tgvcf_active=%d", i,maux->gvcf[i].active); + if ( maux->gvcf[i].active ) fprintf(bcftools_stderr,"\tpos,end=%"PRId64",%"PRId64, (int64_t) maux->gvcf[i].line->pos+1,(int64_t) maux->gvcf[i].end+1); + fprintf(bcftools_stderr,"\n"); + } + fprintf(bcftools_stderr,"\n"); +} + +/* + Determine which line should be merged from which reader: go through all + readers and all buffered lines, expand REF,ALT and try to match lines with + the same ALTs. + */ +int can_merge(args_t *args) +{ + bcf_srs_t *files = args->files; + maux_t *maux = args->maux; + gvcf_aux_t *gaux = maux->gvcf; + char *id = NULL, ref = 'N'; + int i,j,k, ntodo = 0; + + for (i=0; inals; i++) + { + free(maux->als[i]); + maux->als[i] = NULL; + } + maux->var_types = maux->nals = 0; + + // this is only for the `-m none -g` mode, ensure that <*> lines come last + #define VCF_GVCF_REF 1 + + for (i=0; inreaders; i++) + { + buffer_t *buf = &maux->buf[i]; + + if ( gaux && gaux[i].active ) + { + // skip readers with active gvcf blocks + buf->rec[buf->beg].skip = SKIP_DIFF; + continue; + } + for (j=buf->beg; jend; j++) + { + if ( buf->rec[j].skip & SKIP_DONE ) continue; + + buf->rec[j].skip = SKIP_DIFF; + ntodo++; + + bcf1_t *line = buf->lines[j]; + if ( args->merge_by_id ) + id = line->d.id; + else + { + int var_type = bcf_has_variant_types(line, VCF_ANY, bcf_match_overlap); + if (var_type < 0) error("bcf_has_variant_types() failed."); + if ( args->collapse==COLLAPSE_SNP_INS_DEL ) + { + // need to distinguish between ins and del so strip the VCF_INDEL flag + var_type &= ~VCF_INDEL; + } + maux->var_types |= var_type ? var_type<<2 : 2; + + // for the `-m none -g` mode + if ( args->collapse==COLLAPSE_NONE && args->do_gvcf && is_gvcf_block(line) ) + maux->var_types |= VCF_GVCF_REF; + } + } + + // for gvcf: find out REF at this position + if ( buf->beg < buf->end && ref=='N' ) + ref = buf->lines[buf->beg]->d.allele[0][0]; + } + if ( !ntodo ) return 0; + + // In this loop we select from each reader compatible candidate lines. + // (i.e. SNPs or indels). Go through all files and all lines at this + // position and normalize relevant alleles. + // REF-only sites may be associated with both SNPs and indels. + for (i=0; inreaders; i++) + { + bcf_sr_t *reader = &files->readers[i]; + buffer_t *buf = &maux->buf[i]; + + if ( gaux && gaux[i].active ) + { + gaux[i].line->d.allele[0][0] = ref; + gaux[i].line->pos = maux->pos; + } + + for (j=buf->beg; jend; j++) + { + if ( buf->rec[j].skip & SKIP_DONE ) continue; + + bcf1_t *line = buf->lines[j]; // ptr to reader's buffer or gvcf buffer + + int line_type = bcf_has_variant_types(line, VCF_ANY, bcf_match_overlap); + if (line_type < 0) error("bcf_has_variant_types() failed."); + line_type = line_type ? line_type<<2 : 2; + + // select relevant lines + if ( args->merge_by_id ) + { + if ( strcmp(id,line->d.id) ) continue; + } + else + { + // when merging gVCF in -m none mode, make sure that gVCF blocks with the same POS as variant + // records come last, otherwise infinite loop is created (#1164) + if ( args->collapse==COLLAPSE_NONE && args->do_gvcf ) + { + if ( is_gvcf_block(line) && (maux->var_types & (~(VCF_GVCF_REF|2))) ) continue; + } + if ( args->collapse==COLLAPSE_NONE && maux->nals ) + { + // All alleles of the tested record must be present in the + // selected maux record plus variant types must be the same + if ( (maux->var_types & line_type) != line_type ) continue; + if ( vcmp_set_ref(args->vcmp,maux->als[0],line->d.allele[0]) < 0 ) continue; // refs not compatible + for (k=1; kn_allele; k++) + { + if ( vcmp_find_allele(args->vcmp,maux->als+1,maux->nals-1,line->d.allele[k])>=0 ) break; + } + if ( !(line_type&ref_mask) && k==line->n_allele ) continue; // not a REF-only site and there is no matching allele + } + if ( !(args->collapse&COLLAPSE_ANY) ) + { + // Merge: + // - SNPs+SNPs+MNPs+REF if -m both,snps + // - indels+indels+REF if -m both,indels, REF only if SNPs are not present + // - SNPs come first + if ( line_type & (indel_mask|ins_mask|del_mask) ) + { + if ( !(line_type&snp_mask) && maux->var_types&snp_mask ) continue; // SNPs come first + if ( args->do_gvcf && maux->var_types&ref_mask ) continue; // never merge indels with gVCF blocks + } + } + } + buf->rec[j].skip = 0; + + hts_expand(int, line->n_allele, buf->rec[j].mmap, buf->rec[j].map); + if ( !maux->nals ) // first record, copy the alleles to the output + { + maux->nals = line->n_allele; + hts_expand0(char*, maux->nals, maux->mals, maux->als); + hts_expand0(int, maux->nals, maux->ncnt, maux->cnt); + for (k=0; knals; k++) + { + free(maux->als[k]); + maux->als[k] = strdup(line->d.allele[k]); + buf->rec[j].map[k] = k; + maux->cnt[k] = 1; + } + continue; + } + // normalize alleles + maux->als = merge_alleles(line->d.allele, line->n_allele, buf->rec[j].map, maux->als, &maux->nals, &maux->mals); + if ( !maux->als ) error("Failed to merge alleles at %s:%"PRId64" in %s\n",maux->chr,(int64_t) line->pos+1,reader->fname); + hts_expand0(int, maux->nals, maux->ncnt, maux->cnt); + for (k=1; kn_allele; k++) + maux->cnt[ buf->rec[j].map[k] ]++; // how many times an allele appears in the files + maux->cnt[0]++; + } + } + return 1; +} + +/* + Select records that have the same alleles; the input ordering of indels + must not matter. Multiple VCF lines can be emitted from this loop. + We expect only very few alleles and not many records with the same + position in the buffers, therefore the nested loops should not slow us + much. +*/ +void stage_line(args_t *args) +{ + bcf_srs_t *files = args->files; + maux_t *maux = args->maux; + + // debug_maux(args); + + // take the most frequent allele present in multiple files, REF is skipped + int i,j,k,icnt = 1; + for (i=2; inals; i++) + if ( maux->cnt[i] > maux->cnt[icnt] ) icnt = i; + + int nout = 0; + for (i=0; inreaders; i++) + { + buffer_t *buf = &maux->buf[i]; + buf->cur = -1; + if ( buf->beg >= buf->end ) continue; // no lines in the buffer + + // find lines with the same allele + for (j=buf->beg; jend; j++) + { + if ( buf->rec[j].skip ) continue; // done or not compatible + if ( args->merge_by_id ) break; + if ( maux->nals==1 && buf->lines[j]->n_allele==1 ) break; // REF-only record + + for (k=0; klines[j]->n_allele; k++) + if ( icnt==buf->rec[j].map[k] ) break; + + if ( klines[j]->n_allele ) break; + } + if ( j>=buf->end ) + { + // no matching allele found in this file + if ( args->collapse==COLLAPSE_NONE ) continue; + + for (j=buf->beg; jend; j++) + { + if ( buf->rec[j].skip ) continue; // done or not compatible + if ( args->collapse&COLLAPSE_ANY ) break; // anything can be merged + int line_type = bcf_has_variant_types(buf->lines[j], VCF_ANY, bcf_match_overlap); + if (line_type < 0) error("bcf_has_variant_types() failed."); + if ( maux->var_types&snp_mask && line_type&VCF_SNP && (args->collapse&COLLAPSE_SNPS) ) break; + if ( maux->var_types&indel_mask && line_type&VCF_INDEL && (args->collapse&COLLAPSE_INDELS) ) break; + if ( maux->var_types&ins_mask && line_type&VCF_INS && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( maux->var_types&del_mask && line_type&VCF_DEL && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( line_type==VCF_REF ) + { + if ( maux->var_types&snp_mask && (args->collapse&COLLAPSE_SNPS) ) break; + if ( maux->var_types&indel_mask && (args->collapse&COLLAPSE_INDELS) ) break; + if ( maux->var_types&ins_mask && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( maux->var_types&del_mask && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( maux->var_types&ref_mask ) break; + } + else if ( maux->var_types&ref_mask ) + { + if ( line_type&snp_mask && (args->collapse&COLLAPSE_SNPS) ) break; + if ( line_type&indel_mask && (args->collapse&COLLAPSE_INDELS) ) break; + if ( line_type&ins_mask && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + if ( line_type&del_mask && (args->collapse&COLLAPSE_SNP_INS_DEL) ) break; + } + } + } + if ( jend ) + { + // found a suitable line for merging + buf->cur = j; + + // mark as finished so that it's ignored next time + buf->rec[j].skip = SKIP_DONE; + nout++; + } + } + assert( nout ); +} + +void merge_line(args_t *args) +{ + bcf1_t *out = args->out_line; + merge_chrom2qual(args, out); + if ( args->regs && !regidx_overlap(args->regs,args->maux->chr,out->pos,out->pos+out->rlen-1,NULL) ) return; + merge_filter(args, out); + merge_info(args, out); + if ( args->do_gvcf ) + bcf_update_info_int32(args->out_hdr, out, "END", NULL, 0); + merge_format(args, out); + if ( bcf_write1(args->out_fh, args->out_hdr, out)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + bcf_clear1(out); +} + +void bcf_hdr_append_version(bcf_hdr_t *hdr, int argc, char **argv, const char *cmd) +{ + kstring_t str = {0,0,0}; + int e = 0; + if (ksprintf(&str,"##%sVersion=%s+htslib-%s\n", cmd, bcftools_version(), hts_version()) < 0) + goto fail; + if (bcf_hdr_append(hdr,str.s) < 0) + goto fail; + + str.l = 0; + e |= ksprintf(&str,"##%sCommand=%s", cmd, argv[0]) < 0; + int i; + for (i=1; inhrec; i++) + { + if ( hdr->hrec[i]->type!=BCF_HL_FMT ) continue; + j = bcf_hrec_find_key(hdr->hrec[i],"ID"); + if ( j<0 ) continue; + char *key = hdr->hrec[i]->vals[j]; + int id = bcf_hdr_id2int(hdr, BCF_DT_ID, key); + assert( id>=0 ); + int localize = 0; + if ( bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_G ) localize = 1; + if ( bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_A ) localize = 1; + if ( bcf_hdr_id2length(hdr,BCF_HL_FMT,id) == BCF_VL_R ) localize = 1; + if ( !localize ) continue; + args->tmps.l = 0; + + uint32_t e = 0, nout = 0; + e |= ksprintf(&args->tmps, "##%s=<", hdr->hrec[i]->key) < 0; + for (j=0; jhrec[i]->nkeys; j++) + { + if ( !strcmp("IDX",hdr->hrec[i]->keys[j]) ) continue; + if ( nout ) e |= kputc(',',&args->tmps) < 0; + if ( !strcmp("ID",hdr->hrec[i]->keys[j]) ) + e |= ksprintf(&args->tmps,"%s=L%s", hdr->hrec[i]->keys[j], hdr->hrec[i]->vals[j]) < 0; + else if ( !strcmp("Number",hdr->hrec[i]->keys[j]) ) + e |= ksprintf(&args->tmps,"Number=.") < 0; + else if ( !strcmp("Description",hdr->hrec[i]->keys[j]) && hdr->hrec[i]->vals[j][0]=='"' ) + e |= ksprintf(&args->tmps,"Description=\"Localized field: %s", hdr->hrec[i]->vals[j]+1) < 0; + else + e |= ksprintf(&args->tmps,"%s=%s", hdr->hrec[i]->keys[j], hdr->hrec[i]->vals[j]) < 0; + nout++; + } + e |= ksprintf(&args->tmps,">\n") < 0; + if ( e ) error("Failed to format the header line for %s\n", key); + nstr++; + hts_expand(char*,nstr,mstr,str); + str[nstr-1] = strdup(args->tmps.s); + } + if ( !nstr ) return; + bcf_hdr_append(hdr,"##FORMAT="); + for (i=0; ioutput_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) hts_set_opt(args->out_fh, HTS_OPT_THREAD_POOL, args->files->p); //hts_set_threads(args->out_fh, args->n_threads); + args->out_hdr = bcf_hdr_init("w"); + + if ( args->header_fname ) + { + if ( bcf_hdr_set(args->out_hdr,args->header_fname) ) error("Could not read/parse the header: %s\n", args->header_fname); + } + else + { + int i; + for (i=0; ifiles->nreaders; i++) + { + char buf[24]; snprintf(buf,sizeof buf,"%d",i+1); + merge_headers(args->out_hdr, args->files->readers[i].header,buf,args->force_samples); + } + if ( args->local_alleles ) hdr_add_localized_tags(args, args->out_hdr); + if (args->record_cmd_line) bcf_hdr_append_version(args->out_hdr, args->argc, args->argv, "bcftools_merge"); + if (bcf_hdr_sync(args->out_hdr) < 0) + error_errno("[%s] Failed to update header", __func__); + } + info_rules_init(args); + + bcf_hdr_set_version(args->out_hdr, bcf_hdr_get_version(args->files->readers[0].header)); + if ( bcf_hdr_write(args->out_fh, args->out_hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + if ( args->header_only ) + { + bcf_hdr_destroy(args->out_hdr); + if ( hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + return; + } + + if ( args->collapse==COLLAPSE_NONE ) args->vcmp = vcmp_init(); + args->maux = maux_init(args); + args->out_line = bcf_init1(); + args->tmph = kh_init(strdict); + + int *rid_tab = calloc(args->maux->n, sizeof(*rid_tab)); + if (!rid_tab) + error("[%s:%d] Could not allocate %zu bytes\n", __FILE__, __LINE__, args->maux->n*sizeof(*rid_tab)); + + while ( bcf_sr_next_line(args->files) ) + { + // output cached gVCF blocks which end before the new record + if ( args->do_gvcf ) + gvcf_flush(args,0); + + maux_reset(args->maux, rid_tab); + + // determine which of the new records are gvcf blocks + if ( args->do_gvcf ) + gvcf_stage(args, args->maux->pos); + + while ( can_merge(args) ) + { + stage_line(args); + merge_line(args); + } + clean_buffer(args); + // debug_state(args); + } + free(rid_tab); + if ( args->do_gvcf ) + gvcf_flush(args,1); + + info_rules_destroy(args); + maux_destroy(args->maux); + bcf_hdr_destroy(args->out_hdr); + if ( hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + bcf_destroy1(args->out_line); + kh_destroy(strdict, args->tmph); + if ( args->tmps.m ) free(args->tmps.s); + if ( args->vcmp ) vcmp_destroy(args->vcmp); +} + +static void usage(void) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Merge multiple VCF/BCF files from non-overlapping sample sets to create one multi-sample file.\n"); + fprintf(bcftools_stderr, " Note that only records from different files can be merged, never from the same file. For\n"); + fprintf(bcftools_stderr, " \"vertical\" merge take a look at \"bcftools norm\" instead.\n"); + fprintf(bcftools_stderr, "Usage: bcftools merge [options] [...]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " --force-samples Resolve duplicate sample names\n"); + fprintf(bcftools_stderr, " --print-header Print only the merged header and exit\n"); + fprintf(bcftools_stderr, " --use-header FILE Use the provided header\n"); + fprintf(bcftools_stderr, " -0 --missing-to-ref Assume genotypes at missing sites are 0/0\n"); + fprintf(bcftools_stderr, " -f, --apply-filters LIST Require at least one of the listed FILTER strings (e.g. \"PASS,.\")\n"); + fprintf(bcftools_stderr, " -F, --filter-logic x|+ Remove filters if some input is PASS (\"x\"), or apply all filters (\"+\") [+]\n"); + fprintf(bcftools_stderr, " -g, --gvcf -|REF.FA Merge gVCF blocks, INFO/END tag is expected. Implies -i QS:sum,MinDP:min,I16:sum,IDV:max,IMF:max\n"); + fprintf(bcftools_stderr, " -i, --info-rules TAG:METHOD,.. Rules for merging INFO fields (method is one of sum,avg,min,max,join) or \"-\" to turn off the default [DP:sum,DP4:sum]\n"); + fprintf(bcftools_stderr, " -l, --file-list FILE Read file names from the file\n"); + fprintf(bcftools_stderr, " -L, --local-alleles INT EXPERIMENTAL: if more than ALT alleles are encountered, drop FMT/PL and output LAA+LPL instead; 0=unlimited [0]\n"); + fprintf(bcftools_stderr, " -m, --merge STRING Allow multiallelic records for , see man page for details [both]\n"); + fprintf(bcftools_stderr, " --no-index Merge unindexed files, the same chromosomal order is required and -r/-R are not allowed\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfmerge(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->files = bcf_sr_init(); + args->argc = argc; args->argv = argv; + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->collapse = COLLAPSE_BOTH; + args->clevel = -1; + int regions_is_file = 0; + int regions_overlap = 1; + + static struct option loptions[] = + { + {"help",no_argument,NULL,'h'}, + {"merge",required_argument,NULL,'m'}, + {"local-alleles",required_argument,NULL,'L'}, + {"gvcf",required_argument,NULL,'g'}, + {"file-list",required_argument,NULL,'l'}, + {"missing-to-ref",no_argument,NULL,'0'}, + {"apply-filters",required_argument,NULL,'f'}, + {"use-header",required_argument,NULL,1}, + {"print-header",no_argument,NULL,2}, + {"force-samples",no_argument,NULL,3}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,4}, + {"info-rules",required_argument,NULL,'i'}, + {"no-version",no_argument,NULL,8}, + {"no-index",no_argument,NULL,10}, + {"filter-logic",required_argument,NULL,'F'}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "hm:f:r:R:o:O:i:l:g:F:0L:",loptions,NULL)) >= 0) { + switch (c) { + case 'L': + args->local_alleles = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --local-alleles %s\n", optarg); + if ( args->local_alleles < 1 ) + error("Error: \"--local-alleles %s\" makes no sense, expected value bigger or equal than 1\n", optarg); + break; + case 'F': + if ( !strcmp(optarg,"+") ) args->filter_logic = FLT_LOGIC_ADD; + else if ( !strcmp(optarg,"x") ) args->filter_logic = FLT_LOGIC_REMOVE; + else error("Filter logic not recognised: %s\n", optarg); + break; + case '0': args->missing_to_ref = 1; break; + case 'g': + args->do_gvcf = 1; + if ( strcmp("-",optarg) ) + { + args->gvcf_fai = fai_load(optarg); + if ( !args->gvcf_fai ) error("Failed to load the fai index: %s\n", optarg); + } + break; + case 'l': args->file_list = optarg; break; + case 'i': args->info_rules = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'm': + args->collapse = COLLAPSE_NONE; + if ( !strcmp(optarg,"snps") ) args->collapse |= COLLAPSE_SNPS; + else if ( !strcmp(optarg,"indels") ) args->collapse |= COLLAPSE_INDELS; + else if ( !strcmp(optarg,"both") ) args->collapse |= COLLAPSE_BOTH; + else if ( !strcmp(optarg,"any") ) args->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"all") ) args->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"none") ) args->collapse = COLLAPSE_NONE; + else if ( !strcmp(optarg,"snp-ins-del") ) args->collapse = COLLAPSE_SNP_INS_DEL; + else if ( !strcmp(optarg,"id") ) { args->collapse = COLLAPSE_NONE; args->merge_by_id = 1; } + else error("The -m type \"%s\" is not recognised.\n", optarg); + break; + case 'f': args->files->apply_filters = optarg; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 1 : args->header_fname = optarg; break; + case 2 : args->header_only = 1; break; + case 3 : args->force_samples = 1; break; + case 4 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 10 : args->no_index = 1; break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( argc==optind && !args->file_list ) usage(); + if ( argc-optind<2 && !args->file_list ) usage(); + + if ( args->no_index ) + { + if ( args->regions_list ) error("Error: cannot combine --no-index with -r/-R\n"); + bcf_sr_set_opt(args->files,BCF_SR_ALLOW_NO_IDX); + } + else + bcf_sr_set_opt(args->files,BCF_SR_REQUIRE_IDX); + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + if ( regions_is_file ) + args->regs = regidx_init(args->regions_list,NULL,NULL,sizeof(char*),NULL); + else + { + args->regs = regidx_init(NULL,regidx_parse_reg,NULL,sizeof(char*),NULL); + if ( regidx_insert_list(args->regs,args->regions_list,',') !=0 ) error("Could not parse the regions: %s\n", args->regions_list); + regidx_insert(args->regs,NULL); + } + if ( !args->regs ) error("Could not parse the regions: %s\n", args->regions_list); + args->regs_itr = regitr_init(args->regs); + } + + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + while (optindfiles, argv[optind]) ) error("Failed to open %s: %s\n", argv[optind],bcf_sr_strerror(args->files->errnum)); + optind++; + } + if ( args->file_list ) + { + int nfiles, i; + char **files = hts_readlines(args->file_list, &nfiles); + if ( !files ) error("Failed to read from %s\n", args->file_list); + for (i=0;ifiles, files[i]) ) error("Failed to open %s: %s\n", files[i],bcf_sr_strerror(args->files->errnum)); + for (i=0; ifiles); + if ( args->regs ) regidx_destroy(args->regs); + if ( args->regs_itr ) regitr_destroy(args->regs_itr); + if ( args->gvcf_fai ) fai_destroy(args->gvcf_fai); + free(args); + return 0; +} + diff --git a/bcftools/vcfnorm.c b/bcftools/vcfnorm.c new file mode 100644 index 0000000..38c5de4 --- /dev/null +++ b/bcftools/vcfnorm.c @@ -0,0 +1,2295 @@ +/* vcfnorm.c -- Left-align and normalize indels. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "rbuf.h" +#include "abuf.h" + +#define CHECK_REF_EXIT 1 +#define CHECK_REF_WARN 2 +#define CHECK_REF_SKIP 4 +#define CHECK_REF_FIX 8 + +#define MROWS_SPLIT 1 +#define MROWS_MERGE 2 + +// for -m+, mapping from allele indexes of a single input record +// to allele indexes of output record +typedef struct +{ + int nals, mals, *map; +} +map_t; + +// primitive comparison of two records' alleles via hashes; normalized alleles assumed +typedef struct +{ + int n; // number of alleles + char *ref, *alt; + void *hash; +} +cmpals1_t; + +typedef struct +{ + cmpals1_t *cmpals; + int ncmpals, mcmpals; +} +cmpals_t; + +typedef struct +{ + char *tseq, *seq; + int mseq; + bcf1_t **lines, **tmp_lines, **alines, **blines, *mrow_out; + int ntmp_lines, mtmp_lines, nalines, malines, nblines, mblines; + map_t *maps; // mrow map for each buffered record + char **als; + int mmaps, nals, mals; + uint8_t *tmp_arr1, *tmp_arr2, *diploid; + int32_t *int32_arr; + int ntmp_arr1, ntmp_arr2, nint32_arr; + kstring_t *tmp_str; + kstring_t *tmp_als, tmp_kstr; + int ntmp_als; + rbuf_t rbuf; + int buf_win; // maximum distance between two records to consider + int aln_win; // the realignment window size (maximum repeat size) + bcf_srs_t *files; // using the synced reader only for -r option + bcf_hdr_t *hdr, *out_hdr; + cmpals_t cmpals_in, cmpals_out; + faidx_t *fai; + struct { int tot, set, swap; } nref; + char **argv, *output_fname, *ref_fname, *vcf_fname, *region, *targets; + int argc, rmdup, output_type, n_threads, check_ref, strict_filter, do_indels, clevel; + int nchanged, nskipped, nsplit, ntotal, mrows_op, mrows_collapse, parsimonious; + int record_cmd_line, force, force_warned, keep_sum_ad; + abuf_t *abuf; + abuf_opt_t atomize; + int use_star_allele; + char *old_rec_tag; + htsFile *out; +} +args_t; + +static inline int replace_iupac_codes(char *seq, int nseq) +{ + // Replace ambiguity codes with N for now, it awaits to be seen what the VCF spec codifies in the end + int i, n = 0; + for (i=0; id.allele[0]); + int i,j, maxlen = reflen, len; + for (i=1; in_allele; i++) + { + int len = strlen(line->d.allele[i]); + if ( maxlen < len ) maxlen = len; + } + + char *ref = faidx_fetch_seq(args->fai, (char*)bcf_seqname(args->hdr,line), line->pos, line->pos+maxlen-1, &len); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + replace_iupac_codes(ref,len); + + args->nref.tot++; + + // is the REF different? If not, we are done + if ( !strncasecmp(line->d.allele[0],ref,reflen) ) { free(ref); return; } + + // is the REF allele missing? + if ( reflen==1 && line->d.allele[0][0]=='.' ) + { + line->d.allele[0][0] = ref[0]; + args->nref.set++; + free(ref); + bcf_update_alleles(args->out_hdr,line,(const char**)line->d.allele,line->n_allele); + return; + } + + // does REF or ALT contain non-standard bases? + int has_non_acgtn = 0; + for (i=0; in_allele; i++) + { + if ( line->d.allele[i][0]=='<' ) continue; + has_non_acgtn += replace_iupac_codes(line->d.allele[i],strlen(line->d.allele[i])); + } + if ( has_non_acgtn ) + { + args->nref.set++; + bcf_update_alleles(args->out_hdr,line,(const char**)line->d.allele,line->n_allele); + if ( !strncasecmp(line->d.allele[0],ref,reflen) ) { free(ref); return; } + } + + // does the REF allele contain N's ? + int fix = 0; + for (i=0; id.allele[0][i]!='N' ) continue; + if ( ref[i]=='N' ) continue; + line->d.allele[0][i] = ref[i]; + fix++; + for (j=1; jn_allele; j++) + { + int len = strlen(line->d.allele[j]); + if ( len <= i || line->d.allele[j][i]!='N' ) continue; + line->d.allele[j][i] = ref[i]; + fix++; + } + } + if ( fix ) + { + args->nref.set++; + bcf_update_alleles(args->out_hdr,line,(const char**)line->d.allele,line->n_allele); + if ( !strncasecmp(line->d.allele[0],ref,reflen) ) { free(ref); return; } + } + + + // is it swapped? + for (i=1; in_allele; i++) + { + int len = strlen(line->d.allele[i]); + if ( !strncasecmp(line->d.allele[i],ref,len) ) break; + } + + kstring_t str = {0,0,0}; + if ( i==line->n_allele ) // none of the alternate alleles matches the reference + { + args->nref.set++; + kputsn(ref,reflen,&str); + for (i=1; in_allele; i++) + { + kputc(',',&str); + kputs(line->d.allele[i],&str); + } + bcf_update_alleles_str(args->out_hdr,line,str.s); + free(ref); + free(str.s); + return; + } + + // one of the alternate alleles matches the reference, assume it's a simple swap + kputs(line->d.allele[i],&str); + for (j=1; jn_allele; j++) + { + kputc(',',&str); + if ( j==i ) + kputs(line->d.allele[0],&str); + else + kputs(line->d.allele[j],&str); + } + bcf_update_alleles_str(args->out_hdr,line,str.s); + args->nref.swap++; + free(ref); + free(str.s); + + // swap genotypes + int ntmp = args->ntmp_arr1 / sizeof(int32_t); // reuse tmp_arr declared as uint8_t + int ngts = bcf_get_genotypes(args->hdr, line, &args->tmp_arr1, &ntmp); + args->ntmp_arr1 = ntmp * sizeof(int32_t); + int32_t *gts = (int32_t*) args->tmp_arr1; + int ni = 0; + for (j=0; jout_hdr,line,gts,ngts); + + // update AC + int nac = bcf_get_info_int32(args->hdr, line, "AC", &args->tmp_arr1, &ntmp); + args->ntmp_arr1 = ntmp * sizeof(int32_t); + if ( i <= nac ) + { + int32_t *ac = (int32_t*)args->tmp_arr1; + ac[i-1] = ni; + bcf_update_info_int32(args->out_hdr, line, "AC", ac, nac); + } +} + +static void fix_dup_alt(args_t *args, bcf1_t *line) +{ + // update alleles, create a mapping between old and new indexes + hts_expand(uint8_t,line->n_allele,args->ntmp_arr1,args->tmp_arr1); + args->tmp_arr1[0] = 0; // ref always unchanged + + int i, j, nals = line->n_allele, nals_ori = line->n_allele; + for (i=1, j=1; in_allele; i++) + { + if ( strcasecmp(line->d.allele[0],line->d.allele[i]) ) + { + args->tmp_arr1[i] = j++; + continue; + } + args->tmp_arr1[i] = 0; + nals--; + } + for (i=1, j=1; in_allele; i++) + { + if ( !args->tmp_arr1[i] ) continue; + line->d.allele[j++] = line->d.allele[i]; + } + bcf_update_alleles(args->out_hdr, line, (const char**)line->d.allele, nals); + + + // update genotypes + int ntmp = args->ntmp_arr2 / sizeof(int32_t); // reuse tmp_arr declared as uint8_t + int ngts = bcf_get_genotypes(args->hdr, line, &args->tmp_arr2, &ntmp); + args->ntmp_arr2 = ntmp * sizeof(int32_t); + int32_t *gts = (int32_t*) args->tmp_arr2; + int changed = 0; + for (i=0; itmp_arr1[ial] ) continue; + int ial_new = ialtmp_arr1[ial] : 0; + gts[i] = bcf_gt_is_phased(gts[i]) ? bcf_gt_phased(ial_new) : bcf_gt_unphased(ial_new); + changed = 1; + } + if ( changed ) bcf_update_genotypes(args->out_hdr,line,gts,ngts); +} + +static void set_old_rec_tag(args_t *args, bcf1_t *dst, bcf1_t *src, int ialt) +{ + if ( !args->old_rec_tag ) return; + + // only update if the tag is not present already, there can be multiple normalization steps + int i, id = bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, args->old_rec_tag); + bcf_unpack(dst, BCF_UN_INFO); + for (i=0; in_info; i++) + { + bcf_info_t *inf = &dst->d.info[i]; + if ( inf && inf->key == id ) return; + } + + args->tmp_kstr.l = 0; + ksprintf(&args->tmp_kstr,"%s|%"PRIhts_pos"|%s|",bcf_seqname(args->hdr,src),src->pos+1,src->d.allele[0]); + for (i=1; in_allele; i++) + { + kputs(src->d.allele[i],&args->tmp_kstr); + if ( i+1n_allele ) kputc(',',&args->tmp_kstr); + } + if ( ialt>0 ) + { + kputc('|',&args->tmp_kstr); + kputw(ialt,&args->tmp_kstr); + } + if ( (bcf_update_info_string(args->out_hdr, dst, args->old_rec_tag, args->tmp_kstr.s))!=0 ) + error("An error occurred while updating INFO/%s\n",args->old_rec_tag); +} + +#define ERR_DUP_ALLELE -2 +#define ERR_REF_MISMATCH -1 +#define ERR_OK 0 +#define ERR_SYMBOLIC 1 +#define ERR_SPANNING_DELETION 2 + +static int realign(args_t *args, bcf1_t *line) +{ + bcf_unpack(line, BCF_UN_STR); + + // Sanity check REF + int i, nref, reflen = strlen(line->d.allele[0]); + char *ref = faidx_fetch_seq(args->fai, (char*)args->hdr->id[BCF_DT_CTG][line->rid].key, line->pos, line->pos+reflen-1, &nref); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", args->hdr->id[BCF_DT_CTG][line->rid].key, (int64_t) line->pos+1); + seq_to_upper(ref,0); + replace_iupac_codes(ref,nref); // any non-ACGT character in fasta ref is replaced with N + + // does VCF REF contain non-standard bases? + if ( has_non_acgtn(line->d.allele[0],reflen) ) + { + if ( args->check_ref==CHECK_REF_EXIT ) + error("Non-ACGTN reference allele at %s:%"PRId64" .. REF_SEQ:'%s' vs VCF:'%s'\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,ref,line->d.allele[0]); + if ( args->check_ref & CHECK_REF_WARN ) + fprintf(stderr,"NON_ACGTN_REF\t%s\t%"PRId64"\t%s\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,line->d.allele[0]); + free(ref); + return ERR_REF_MISMATCH; + } + if ( strcasecmp(ref,line->d.allele[0]) ) + { + if ( args->check_ref==CHECK_REF_EXIT ) + error("Reference allele mismatch at %s:%"PRId64" .. REF_SEQ:'%s' vs VCF:'%s'\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,ref,line->d.allele[0]); + if ( args->check_ref & CHECK_REF_WARN ) + fprintf(stderr,"REF_MISMATCH\t%s\t%"PRId64"\t%s\t%s\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,line->d.allele[0],ref); + free(ref); + return ERR_REF_MISMATCH; + } + free(ref); + ref = NULL; + + if ( line->n_allele == 1 ) // a REF + { + if ( line->rlen > 1 ) + { + line->d.allele[0][1] = 0; + bcf_update_alleles(args->out_hdr,line,(const char**)line->d.allele,line->n_allele); + } + return ERR_OK; + } + if ( bcf_get_variant_types(line)==VCF_BND ) return ERR_SYMBOLIC; // breakend, not an error + + // make a copy of each allele for trimming + hts_expand0(kstring_t,line->n_allele,args->ntmp_als,args->tmp_als); + kstring_t *als = args->tmp_als; + for (i=0; in_allele; i++) + { + if ( line->d.allele[i][0]=='<' ) return ERR_SYMBOLIC; // symbolic allele + if ( line->d.allele[i][0]=='*' ) return ERR_SPANNING_DELETION; // spanning deletion + if ( has_non_acgtn(line->d.allele[i],line->shared.l) ) + { + if ( args->check_ref==CHECK_REF_EXIT ) + error("Non-ACGTN alternate allele at %s:%"PRId64" .. VCF:'%s'\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,line->d.allele[i]); + if ( args->check_ref & CHECK_REF_WARN ) + fprintf(stderr,"NON_ACGTN_ALT\t%s\t%"PRId64"\t%s\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,line->d.allele[i]); + return ERR_REF_MISMATCH; + } + + als[i].l = 0; + kputs(line->d.allele[i], &als[i]); + seq_to_upper(als[i].s,0); + + if ( i>0 && als[i].l==als[0].l && !strcasecmp(als[0].s,als[i].s) ) return ERR_DUP_ALLELE; + } + + // trim from right + int new_pos = line->pos; + while (1) + { + // is the rightmost base identical in all alleles? + int min_len = als[0].l; + for (i=1; in_allele; i++) + { + if ( toupper(als[0].s[ als[0].l-1 ])!=toupper(als[i].s[ als[i].l-1 ]) ) break; + if ( als[i].l < min_len ) min_len = als[i].l; + } + if ( i!=line->n_allele ) break; // there are differences, cannot be trimmed + if ( min_len<=1 && new_pos==0 ) break; + + int pad_from_left = 0; + for (i=0; in_allele; i++) // trim all alleles + { + als[i].l--; + if ( !als[i].l ) pad_from_left = 1; + } + if ( pad_from_left ) + { + int npad = new_pos >= args->aln_win ? args->aln_win : new_pos; + free(ref); + ref = faidx_fetch_seq(args->fai, (char*)args->hdr->id[BCF_DT_CTG][line->rid].key, new_pos-npad, new_pos-1, &nref); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", args->hdr->id[BCF_DT_CTG][line->rid].key, (int64_t) new_pos-npad+1); + replace_iupac_codes(ref,nref); + for (i=0; in_allele; i++) + { + ks_resize(&als[i], als[i].l + npad); + if ( als[i].l ) memmove(als[i].s+npad,als[i].s,als[i].l); + memcpy(als[i].s,ref,npad); + als[i].l += npad; + } + new_pos -= npad; + } + } + free(ref); + + // trim from left + int ntrim_left = 0; + while (1) + { + // is the first base identical in all alleles? + int min_len = als[0].l - ntrim_left; + for (i=1; in_allele; i++) + { + if ( als[0].s[ntrim_left]!=als[i].s[ntrim_left] ) break; + if ( min_len > als[i].l - ntrim_left ) min_len = als[i].l - ntrim_left; + } + if ( i!=line->n_allele || min_len<=1 ) break; // there are differences, cannot be trimmed + ntrim_left++; + } + if ( ntrim_left ) + { + for (i=0; in_allele; i++) + { + memmove(als[i].s,als[i].s+ntrim_left,als[i].l-ntrim_left); + als[i].l -= ntrim_left; + } + new_pos += ntrim_left; + } + + // Have the alleles changed? + als[0].s[ als[0].l ] = 0; // in order for strcmp to work + if ( new_pos==line->pos && !strcasecmp(line->d.allele[0],als[0].s) ) return ERR_OK; + + set_old_rec_tag(args, line, line, 0); + + // Create new block of alleles and update + args->tmp_kstr.l = 0; + for (i=0; in_allele; i++) + { + if (i>0) kputc(',',&args->tmp_kstr); + kputsn(als[i].s,als[i].l,&args->tmp_kstr); + } + args->tmp_kstr.s[ args->tmp_kstr.l ] = 0; + bcf_update_alleles_str(args->out_hdr,line,args->tmp_kstr.s); + args->nchanged++; + + // Update INFO/END if necessary + int new_reflen = strlen(line->d.allele[0]); + if ( (new_pos!=line->pos || reflen!=new_reflen) && bcf_get_info_int32(args->hdr, line, "END", &args->int32_arr, &args->nint32_arr)==1 ) + { + // bcf_update_alleles_str() messed up rlen because line->pos changed. This will be fixed by bcf_update_info_int32() + line->pos = new_pos; + args->int32_arr[0] = line->pos + new_reflen; + bcf_update_info_int32(args->out_hdr, line, "END", args->int32_arr, 1); + } + line->pos = new_pos; + + return ERR_OK; +} + +static void split_info_numeric(args_t *args, bcf1_t *src, bcf_info_t *info, int ialt, bcf1_t *dst) +{ + #define BRANCH_NUMERIC(type,type_t,is_vector_end,is_missing) \ + { \ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); \ + int ntmp = args->ntmp_arr1 / sizeof(type_t); \ + int ret = bcf_get_info_##type(args->hdr,src,tag,&args->tmp_arr1,&ntmp); \ + args->ntmp_arr1 = ntmp * sizeof(type_t); \ + assert( ret>0 ); \ + type_t *vals = (type_t*) args->tmp_arr1; \ + int len = bcf_hdr_id2length(args->hdr,BCF_HL_INFO,info->key); \ + if ( len==BCF_VL_A ) \ + { \ + if ( ret!=src->n_allele-1 ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(stderr, \ + "Warning: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele-1,ret); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_info_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele-1,ret); \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals+ialt,1); \ + } \ + else if ( len==BCF_VL_R ) \ + { \ + if ( ret!=src->n_allele ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(stderr, \ + "Warning: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele,ret); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_info_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele,ret); \ + } \ + if ( args->keep_sum_ad >= 0 && args->keep_sum_ad==info->key ) \ + { \ + int j; \ + for (j=1; jlen; j++) \ + if ( j!=ialt+1 && !(is_missing) && !(is_vector_end) ) vals[0] += vals[j]; \ + vals[1] = vals[ialt+1]; \ + } \ + else \ + { \ + if ( ialt!=0 ) vals[1] = vals[ialt+1]; \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals,2); \ + } \ + else if ( len==BCF_VL_G ) \ + { \ + if ( ret!=src->n_allele*(src->n_allele+1)/2 ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(stderr, \ + "Warning: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele*(src->n_allele+1)/2,ret); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_info_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele*(src->n_allele+1)/2,ret); \ + } \ + if ( ialt!=0 ) \ + { \ + vals[1] = vals[bcf_alleles2gt(0,ialt+1)]; \ + vals[2] = vals[bcf_alleles2gt(ialt+1,ialt+1)]; \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals,3); \ + } \ + else \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals,ret); \ + } + switch (bcf_hdr_id2type(args->hdr,BCF_HL_INFO,info->key)) + { + case BCF_HT_INT: BRANCH_NUMERIC(int32, int32_t, vals[j]==bcf_int32_vector_end, vals[j]==bcf_int32_missing); break; + case BCF_HT_REAL: BRANCH_NUMERIC(float, float, bcf_float_is_vector_end(vals[j]), bcf_float_is_missing(vals[j])); break; + } + #undef BRANCH_NUMERIC +} +// Find n-th field in a comma-separated list and move it to dst. +// The memory areas may overlap. +#define STR_MOVE_NTH(dst,src,end,nth,len) \ +{ \ + char *ss = src, *se = src; \ + int j = 0; \ + while ( *se && se<(end) ) \ + { \ + if ( *se==',' ) \ + { \ + if ( j==nth ) break; \ + j++; \ + ss = se+1; \ + } \ + se++; \ + } \ + if ( j==nth ) \ + { \ + int n = se - ss; \ + memmove((dst),ss,n); \ + src = se; \ + len += n; \ + } \ + else len = -1; \ +} +static void split_info_string(args_t *args, bcf1_t *src, bcf_info_t *info, int ialt, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); + int ret = bcf_get_info_string(args->hdr,src,tag,&args->tmp_arr1,&args->ntmp_arr1); + assert( ret>0 ); + + kstring_t str; + str.m = args->ntmp_arr1; + str.l = ret; + str.s = (char*) args->tmp_arr1; + + int len = bcf_hdr_id2length(args->hdr,BCF_HL_INFO,info->key); + if ( len==BCF_VL_A ) + { + char *tmp = str.s; + int len = 0; + STR_MOVE_NTH(str.s,tmp,str.s+str.l,ialt,len); + if ( len<0 ) return; // wrong number of fields: skip + str.s[len] = 0; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else if ( len==BCF_VL_R ) + { + char *tmp = str.s; + int len = 0; + STR_MOVE_NTH(str.s,tmp,str.s+str.l,0,len); + str.s[len]=','; tmp++; len++; + STR_MOVE_NTH(&str.s[len],tmp,str.s+str.l,ialt,len); + if ( len<0 ) return; // wrong number of fields: skip + str.s[len] = 0; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else if ( len==BCF_VL_G ) + { + int i0a = bcf_alleles2gt(0,ialt+1), iaa = bcf_alleles2gt(ialt+1,ialt+1); + char *tmp = str.s; + int len = 0; + STR_MOVE_NTH(str.s,tmp,str.s+str.l,0,len); + str.s[len]=','; tmp++; len++; + STR_MOVE_NTH(&str.s[len],tmp,str.s+str.l,i0a-1,len); + if ( len<0 ) return; // wrong number of fields: skip + str.s[len]=','; tmp++; len++; + STR_MOVE_NTH(&str.s[len],tmp,str.s+str.l,iaa-i0a-1,len); + if ( len<0 ) return; // wrong number of fields: skip + str.s[len] = 0; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else + bcf_update_info_string(args->out_hdr,dst,tag,str.s); +} +static void split_info_flag(args_t *args, bcf1_t *src, bcf_info_t *info, int ialt, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); + int ret = bcf_get_info_flag(args->hdr,src,tag,&args->tmp_arr1,&args->ntmp_arr1); + bcf_update_info_flag(args->out_hdr,dst,tag,NULL,ret); +} + +static void split_format_genotype(args_t *args, bcf1_t *src, bcf_fmt_t *fmt, int ialt, bcf1_t *dst) +{ + int ntmp = args->ntmp_arr1 / 4; + int ngts = bcf_get_genotypes(args->hdr,src,&args->tmp_arr1,&ntmp); + args->ntmp_arr1 = ntmp * 4; + assert( ngts >0 ); + + int32_t *gt = (int32_t*) args->tmp_arr1; + int i, j, nsmpl = bcf_hdr_nsamples(args->hdr); + ngts /= nsmpl; + for (i=0; iout_hdr,dst,args->tmp_arr1,ngts*nsmpl); +} +static void split_format_numeric(args_t *args, bcf1_t *src, bcf_fmt_t *fmt, int ialt, bcf1_t *dst) +{ + #define BRANCH_NUMERIC(type,type_t,is_vector_end,is_missing,set_vector_end) \ + { \ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,fmt->id); \ + int ntmp = args->ntmp_arr1 / sizeof(type_t); \ + int nvals = bcf_get_format_##type(args->hdr,src,tag,&args->tmp_arr1,&ntmp); \ + args->ntmp_arr1 = ntmp * sizeof(type_t); \ + assert( nvals>0 ); \ + type_t *vals = (type_t *) args->tmp_arr1; \ + int len = bcf_hdr_id2length(args->hdr,BCF_HL_FMT,fmt->id); \ + int i,j, nsmpl = bcf_hdr_nsamples(args->hdr); \ + if ( nvals==nsmpl ) /* all values are missing */ \ + { \ + bcf_update_format_##type(args->out_hdr,dst,tag,vals,nsmpl); \ + return; \ + } \ + if ( len==BCF_VL_A ) \ + { \ + if ( nvals!=(src->n_allele-1)*nsmpl ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(stderr, \ + "Warning: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d. Removing the field.\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,(src->n_allele-1)*nsmpl,nvals); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_format_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,(src->n_allele-1)*nsmpl,nvals); \ + } \ + nvals /= nsmpl; \ + type_t *src_vals = vals, *dst_vals = vals; \ + for (i=0; iout_hdr,dst,tag,vals,nsmpl); \ + } \ + else if ( len==BCF_VL_R ) \ + { \ + if ( nvals!=src->n_allele*nsmpl ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(stderr, \ + "Warning: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d. Removing the field.\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,(src->n_allele-1)*nsmpl,nvals); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_format_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele*nsmpl,nvals); \ + } \ + nvals /= nsmpl; \ + type_t *src_vals = vals, *dst_vals = vals; \ + if ( args->keep_sum_ad >= 0 && args->keep_sum_ad==fmt->id ) \ + { \ + for (i=0; iout_hdr,dst,tag,vals,nsmpl*2); \ + } \ + else if ( len==BCF_VL_G ) \ + { \ + if ( nvals!=src->n_allele*(src->n_allele+1)/2*nsmpl && nvals!=src->n_allele*nsmpl ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(stderr, \ + "Warning: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d. Removing the field.\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,(src->n_allele-1)*nsmpl,nvals); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_format_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error at %s:%"PRId64", the tag %s has wrong number of fields\n", bcf_seqname(args->hdr,src),(int64_t) src->pos+1,bcf_hdr_int2id(args->hdr,BCF_DT_ID,fmt->id)); \ + } \ + nvals /= nsmpl; \ + int all_haploid = nvals==src->n_allele ? 1 : 0; \ + type_t *src_vals = vals, *dst_vals = vals; \ + for (i=0; iout_hdr,dst,tag,vals,all_haploid ? nsmpl*2 : nsmpl*3); \ + } \ + else \ + bcf_update_format_##type(args->out_hdr,dst,tag,vals,nvals); \ + } + switch (bcf_hdr_id2type(args->hdr,BCF_HL_FMT,fmt->id)) + { + case BCF_HT_INT: BRANCH_NUMERIC(int32, int32_t, src_vals[j]==bcf_int32_vector_end, src_vals[j]==bcf_int32_missing, dst_vals[2]=bcf_int32_vector_end); break; + case BCF_HT_REAL: BRANCH_NUMERIC(float, float, bcf_float_is_vector_end(src_vals[j]), bcf_float_is_missing(src_vals[j]), bcf_float_set_vector_end(dst_vals[2])); break; + } + #undef BRANCH_NUMERIC +} +static void squeeze_format_char(char *str, int src_blen, int dst_blen, int n) +{ + int i, isrc = 0, idst = 0; + for (i=0; ihdr,BCF_DT_ID,fmt->id); + int ret = bcf_get_format_char(args->hdr,src,tag,&args->tmp_arr1,&args->ntmp_arr1); + if ( !ret ) return; // all values can be empty, leave out the tag, no need to panic + assert( ret>0 ); + + kstring_t str; + str.m = args->ntmp_arr1; + str.l = ret; + str.s = (char*) args->tmp_arr1; + + int nsmpl = bcf_hdr_nsamples(args->hdr); + int len = bcf_hdr_id2length(args->hdr,BCF_HL_FMT,fmt->id); + if ( len==BCF_VL_A ) + { + int i, blen = ret/nsmpl, maxlen = 0; + char *ptr = str.s; + for (i=0; iout_hdr,dst,tag,str.s,nsmpl*maxlen); + } + else if ( len==BCF_VL_R ) + { + int i, blen = ret/nsmpl, maxlen = 0; + char *ptr = str.s; + for (i=0; iout_hdr,dst,tag,str.s,nsmpl*maxlen); + } + else if ( len==BCF_VL_G ) + { + int i, blen = ret/nsmpl, maxlen = 0, i0a = bcf_alleles2gt(0,ialt+1), iaa = bcf_alleles2gt(ialt+1,ialt+1); + char *ptr = str.s; + for (i=0; in_allele*(src->n_allele+1)/2 && nfields!=src->n_allele ) + { + if ( args->force && !args->force_warned ) + { + fprintf(stderr, + "Warning: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d or %d, found %d. Removing the field.\n" + " (This warning is printed only once.)\n", + tag,bcf_seqname(args->hdr,src),(int64_t)src->pos+1,src->n_allele*(src->n_allele+1)/2,src->n_allele,nfields); + args->force_warned = 1; + } + if ( args->force ) + { + bcf_update_format_char(args->out_hdr,dst,tag,NULL,0); + return; + } + error("Error: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d or %d, found %d\n", + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele*(src->n_allele+1)/2,src->n_allele,nfields); + } + + int len = 0; + if ( nfields==src->n_allele ) // haploid + { + char *tmp = ptr; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,0,len); + ptr[len]=','; tmp++; len++; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,ialt,len); + if ( len<0 ) return; // wrong number of fields: skip + } + else // diploid + { + char *tmp = ptr; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,0,len); + ptr[len]=','; tmp++; len++; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,i0a-1,len); + if ( len<0 ) return; // wrong number of fields: skip + ptr[len]=','; tmp++; len++; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,iaa-i0a-1,len); + if ( len<0 ) return; // wrong number of fields: skip + } + if ( maxlen < len ) maxlen = len; + ptr += blen; + } + if ( maxlenout_hdr,dst,tag,str.s,nsmpl*maxlen); + } + else + bcf_update_format_char(args->out_hdr,dst,tag,str.s,str.l); +} + +static void split_multiallelic_to_biallelics(args_t *args, bcf1_t *line) +{ + int i; + + bcf_unpack(line, BCF_UN_ALL); + + // Init the target biallelic lines + args->ntmp_lines = line->n_allele-1; + if ( args->mtmp_lines < args->ntmp_lines ) + { + args->tmp_lines = (bcf1_t **)realloc(args->tmp_lines,sizeof(bcf1_t*)*args->ntmp_lines); + for (i=args->mtmp_lines; intmp_lines; i++) + args->tmp_lines[i] = NULL; + args->mtmp_lines = args->ntmp_lines; + } + kstring_t tmp = {0,0,0}; + kputs(line->d.allele[0], &tmp); + kputc(',', &tmp); + int rlen = tmp.l; + int gt_id = bcf_hdr_id2int(args->hdr,BCF_DT_ID,"GT"); + for (i=0; intmp_lines; i++) // for each ALT allele + { + if ( !args->tmp_lines[i] ) args->tmp_lines[i] = bcf_init1(); + bcf1_t *dst = args->tmp_lines[i]; + bcf_clear(dst); + + dst->rid = line->rid; + dst->pos = line->pos; + dst->qual = line->qual; + + // Not quite sure how to handle IDs, they can be assigned to a specific + // ALT. For now we leave the ID unchanged for all. + bcf_update_id(args->out_hdr, dst, line->d.id ? line->d.id : "."); + + tmp.l = rlen; + kputs(line->d.allele[i+1],&tmp); + bcf_update_alleles_str(args->out_hdr,dst,tmp.s); + + if ( line->d.n_flt ) bcf_update_filter(args->hdr, dst, line->d.flt, line->d.n_flt); + + int j; + for (j=0; jn_info; j++) + { + bcf_info_t *info = &line->d.info[j]; + int type = bcf_hdr_id2type(args->hdr,BCF_HL_INFO,info->key); + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) split_info_numeric(args, line, info, i, dst); + else if ( type==BCF_HT_FLAG ) split_info_flag(args, line, info, i, dst); + else split_info_string(args, line, info, i, dst); + } + set_old_rec_tag(args, dst, line, i + 1); // 1-based indexes + + dst->n_sample = line->n_sample; + for (j=0; jn_fmt; j++) + { + bcf_fmt_t *fmt = &line->d.fmt[j]; + int type = bcf_hdr_id2type(args->hdr,BCF_HL_FMT,fmt->id); + if ( fmt->id==gt_id ) split_format_genotype(args, line, fmt, i, dst); + else if ( type==BCF_HT_INT || type==BCF_HT_REAL ) split_format_numeric(args, line, fmt, i, dst); + else split_format_string(args, line, fmt, i, dst); + } + } + free(tmp.s); +} + +// Enlarge FORMAT array containing nsmpl samples each with nals_ori values +// to accommodate nvals values for each sample, filling the gaps with missing +// values. Works also for INFO arrays, with nsmpl set to 1. +#define ENLARGE_ARRAY(type_t,set_missing,arr,narr_bytes,nsmpl,nvals_ori,nvals) \ +{ \ + int nbytes_new = (nsmpl)*(nvals)*sizeof(type_t); \ + hts_expand(uint8_t,nbytes_new,narr_bytes,arr); \ + int ismpl, k; \ + for (ismpl=nsmpl-1; ismpl>=0; ismpl--) \ + { \ + type_t *dst_ptr = ((type_t*)arr) + ismpl*(nvals); \ + type_t *src_ptr = ((type_t*)arr) + ismpl*nvals_ori; \ + memmove(dst_ptr,src_ptr,sizeof(type_t)*nvals_ori); \ + for (k=nvals_ori; khdr,BCF_DT_ID,info->key); \ + int ntmp = args->ntmp_arr1 / sizeof(type_t); \ + int nvals_ori = bcf_get_info_##type(args->hdr,lines[0],tag,&args->tmp_arr1,&ntmp); \ + args->ntmp_arr1 = ntmp * sizeof(type_t); \ + assert( nvals_ori>0 ); \ + type_t *vals = (type_t*) args->tmp_arr1, *vals2; \ + int i,k,len = bcf_hdr_id2length(args->hdr,BCF_HL_INFO,info->key); \ + if ( len==BCF_VL_A ) \ + { \ + if (nvals_ori!=lines[0]->n_allele - 1) \ + error("vcfnorm: number of fields in first record at position %s:%"PRId64" for INFO tag %s not as expected [found: %d vs expected:%d]\n", bcf_seqname(args->hdr,lines[0]),(int64_t) lines[0]->pos+1, tag, nvals_ori, lines[0]->n_allele-1); \ + int nvals = dst->n_allele - 1; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,1,nvals_ori,nvals); \ + vals = (type_t*) args->tmp_arr1; \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_info_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* info tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + if (nvals2!=lines[i]->n_allele-1) \ + error("vcfnorm: could not merge INFO tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals2 = (type_t*) args->tmp_arr2; \ + for (k=0; kmaps[i].map[k+1] - 1 ] = vals2[k]; \ + } \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals); \ + } \ + else if ( len==BCF_VL_R ) \ + { \ + if (nvals_ori!=lines[0]->n_allele) \ + error("vcfnorm: number of fields in first record at position %s:%"PRId64" for INFO tag %s not as expected [found: %d vs expected:%d]\n", bcf_seqname(args->hdr,lines[0]),(int64_t) lines[0]->pos+1, tag, nvals_ori, lines[0]->n_allele); \ + int nvals = dst->n_allele; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,1,nvals_ori,nvals); \ + vals = (type_t*) args->tmp_arr1; \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_info_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* info tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + if (nvals2!=lines[i]->n_allele) \ + error("vcfnorm: could not merge INFO tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals2 = (type_t*) args->tmp_arr2; \ + for (k=0; kmaps[i].map[k] ] = vals2[k]; \ + } \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals); \ + } \ + else if ( len==BCF_VL_G ) \ + { \ + /* expecting diploid gt in INFO */ \ + if (nvals_ori!=lines[0]->n_allele*(lines[0]->n_allele+1)/2) { \ + fprintf(stderr, "todo: merge Number=G INFO fields for haploid sites\n"); \ + error("vcfnorm: number of fields in first record at position %s:%"PRId64" for INFO tag %s not as expected [found: %d vs expected:%d]\n", bcf_seqname(args->hdr,lines[0]),(int64_t) lines[0]->pos+1, tag, nvals_ori, lines[0]->n_allele*(lines[0]->n_allele+1)/2); \ + } \ + int nvals = dst->n_allele*(dst->n_allele+1)/2; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,1,nvals_ori,nvals); \ + vals = (type_t*) args->tmp_arr1; \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_info_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* info tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + if (nvals2!=lines[i]->n_allele*(lines[i]->n_allele+1)/2) \ + error("vcfnorm: could not merge INFO tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals2 = (type_t*) args->tmp_arr2; \ + int ia,ib; \ + k = 0; \ + for (ia=0; ian_allele; ia++) \ + { \ + for (ib=0; ib<=ia; ib++) \ + { \ + if ( is_vector_end ) break; \ + int l = bcf_alleles2gt(args->maps[i].map[ia],args->maps[i].map[ib]); \ + vals[l] = vals2[k]; \ + k++; \ + } \ + } \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals); \ + } \ + else \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals,nvals_ori); \ + } + switch (bcf_hdr_id2type(args->hdr,BCF_HL_INFO,info->key)) + { + case BCF_HT_INT: BRANCH_NUMERIC(int32, int32_t, dst_ptr[k]=bcf_int32_missing, vals2[k]==bcf_int32_vector_end); break; + case BCF_HT_REAL: BRANCH_NUMERIC(float, float, bcf_float_set_missing(dst_ptr[k]), bcf_float_is_vector_end(vals2[k])); break; + } + #undef BRANCH_NUMERIC +} +static void merge_info_flag(args_t *args, bcf1_t **lines, int nlines, bcf_info_t *info, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); + int ret = bcf_get_info_flag(args->hdr,lines[0],tag,&args->tmp_arr1,&args->ntmp_arr1); + bcf_update_info_flag(args->out_hdr,dst,tag,NULL,ret); +} +int copy_string_field(char *src, int isrc, int src_len, kstring_t *dst, int idst); // see vcfmerge.c +static void merge_info_string(args_t *args, bcf1_t **lines, int nlines, bcf_info_t *info, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); + + kstring_t str; + str.m = args->ntmp_arr1; + str.l = 0; + str.s = (char*) args->tmp_arr1; + + int i, j, len = bcf_hdr_id2length(args->hdr,BCF_HL_INFO,info->key); + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int jfrom = len==BCF_VL_A ? 1 : 0; + kputc('.',&str); + for (i=jfrom+1; in_allele; i++) kputs(",.",&str); + for (i=0; ihdr,lines[i],tag); + if (!src) continue; + for (j=jfrom; jn_allele; j++) + copy_string_field((char*)src->vptr, j-jfrom, src->len, &str, args->maps[i].map[j]-jfrom); + } + str.s[str.l] = 0; + args->tmp_arr1 = (uint8_t*) str.s; + args->ntmp_arr1 = str.m; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else if ( len==BCF_VL_G ) + { + int ngts = dst->n_allele*(dst->n_allele+1)/2; + kputc('.',&str); + for (i=1; ihdr,lines[i],tag); + if (!src) continue; + int iori, jori, kori = 0; + for (iori=0; iorin_allele; iori++) + { + int inew = args->maps[i].map[iori]; + for (jori=0; jori<=iori; jori++) + { + int jnew = args->maps[i].map[jori]; + int knew = bcf_alleles2gt(inew,jnew); + copy_string_field((char*)src->vptr,kori,src->len,&str,knew); + kori++; + } + } + } + str.s[str.l] = 0; + args->tmp_arr1 = (uint8_t*) str.s; + args->ntmp_arr1 = str.m; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else + { + bcf_get_info_string(args->hdr,lines[0],tag,&args->tmp_arr1,&args->ntmp_arr1); + bcf_update_info_string(args->out_hdr,dst,tag,args->tmp_arr1); + } +} +static void merge_format_genotype(args_t *args, bcf1_t **lines, int nlines, bcf_fmt_t *fmt, bcf1_t *dst) +{ + // reusing int8_t arrays as int32_t arrays + int ntmp = args->ntmp_arr1 / 4; + int ngts = bcf_get_genotypes(args->hdr,lines[0],&args->tmp_arr1,&ntmp); + args->ntmp_arr1 = ntmp * 4; + assert( ngts >0 ); + + int nsmpl = bcf_hdr_nsamples(args->hdr); + ngts /= nsmpl; + + int i, j, k,k2; + for (i=1; intmp_arr2 / 4; + int ngts2 = bcf_get_genotypes(args->hdr,lines[i],&args->tmp_arr2,&ntmp2); + args->ntmp_arr2 = ntmp2 * 4; + ngts2 /= nsmpl; + if ( ngts!=ngts2 ) error("Error at %s:%"PRId64": cannot combine diploid with haploid genotype\n", bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); + + int32_t *gt = (int32_t*) args->tmp_arr1; + int32_t *gt2 = (int32_t*) args->tmp_arr2; + for (j=0; j=args->maps[i].nals ) error("Error at %s:%"PRId64": incorrect allele index %d\n",bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1,ial2); + int ial = args->maps[i].map[ial2]; + for (k=0; kout_hdr,dst,args->tmp_arr1,ngts*nsmpl); +} +static int diploid_to_haploid(int size, int nsmpl, int nals, uint8_t *vals) +{ + int i, dsrc = size*nals*(nals+1)/2, ddst = size*nals; + uint8_t *src_ptr = vals + dsrc, *dst_ptr = vals + ddst; + for (i=1; ihdr,BCF_DT_ID,fmt->id); \ + int ntmp = args->ntmp_arr1 / sizeof(type_t); \ + int nvals_ori = bcf_get_format_##type(args->hdr,lines[0],tag,&args->tmp_arr1,&ntmp); \ + args->ntmp_arr1 = ntmp * sizeof(type_t); \ + assert( nvals_ori>0 ); \ + type_t *vals2, *vals = (type_t *) args->tmp_arr1; \ + int len = bcf_hdr_id2length(args->hdr,BCF_HL_FMT,fmt->id); \ + int i, j, k, nsmpl = bcf_hdr_nsamples(args->hdr); \ + nvals_ori /= nsmpl; \ + if ( len==BCF_VL_A ) \ + { \ + int nvals = dst->n_allele - 1; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,nsmpl,nvals_ori,nvals); \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_format_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* format tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + nvals2 /= nsmpl; \ + if (nvals2!=lines[i]->n_allele-1) \ + error("vcfnorm: could not merge FORMAT tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals = (type_t*) args->tmp_arr1; \ + vals2 = (type_t*) args->tmp_arr2; \ + for (j=0; jmaps[i].map[k+1] - 1 ] = vals2[k]; \ + } \ + vals += nvals; \ + vals2 += nvals2; \ + } \ + } \ + bcf_update_format_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals*nsmpl); \ + } \ + else if ( len==BCF_VL_R ) \ + { \ + int nvals = dst->n_allele; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,nsmpl,nvals_ori,nvals); \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_format_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* format tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + nvals2 /= nsmpl; \ + if (nvals2!=lines[i]->n_allele) \ + error("vcfnorm: could not merge FORMAT tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals = (type_t*) args->tmp_arr1; \ + vals2 = (type_t*) args->tmp_arr2; \ + for (j=0; jmaps[i].map[k] ] = vals2[k]; \ + } \ + vals += nvals; \ + vals2 += nvals2; \ + } \ + } \ + bcf_update_format_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals*nsmpl); \ + } \ + else if ( len==BCF_VL_G ) \ + { \ + /* which samples are diploid */ \ + memset(args->diploid,0,nsmpl); \ + int all_haploid = 1; \ + if ( nvals_ori > lines[0]->n_allele ) /* line possibly diploid */ \ + { \ + vals2 = (type_t*) args->tmp_arr1; \ + int ndiploid = lines[0]->n_allele*(lines[0]->n_allele+1)/2; \ + for (i=0; idiploid[i] ) \ + { \ + for (k=0; kdiploid[i] = 1; all_haploid = 0; }\ + } \ + vals2 += nvals_ori; \ + } \ + } \ + int nvals = dst->n_allele*(dst->n_allele+1)/2; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,nsmpl,nvals_ori,nvals); \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_format_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* format tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + nvals2 /= nsmpl; \ + int ndiploid = lines[i]->n_allele*(lines[i]->n_allele+1)/2; \ + int line_diploid = nvals2==ndiploid ? 1 : 0; \ + if (!(nvals2==1 || nvals2==lines[i]->n_allele || nvals2==lines[i]->n_allele*(lines[i]->n_allele+1)/2)) \ + error("vcfnorm: could not merge FORMAT tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals = (type_t*) args->tmp_arr1; \ + vals2 = (type_t*) args->tmp_arr2; \ + for (j=0; jdiploid[j] ) { args->diploid[j] = 1; all_haploid = 0; } \ + if ( !smpl_diploid ) \ + { \ + for (k=0; kn_allele; k++) vals[args->maps[i].map[k]] = vals2[k]; \ + } \ + else \ + { \ + k = 0; \ + int ia,ib; \ + for (ia=0; ian_allele; ia++) \ + { \ + for (ib=0; ib<=ia; ib++) \ + { \ + int l = bcf_alleles2gt(args->maps[i].map[ia],args->maps[i].map[ib]); \ + vals[l] = vals2[k]; \ + k++; \ + } \ + } \ + } \ + vals += nvals; \ + vals2 += nvals2; \ + } \ + } \ + if ( all_haploid ) \ + nvals = diploid_to_haploid(sizeof(type_t),nsmpl,dst->n_allele,args->tmp_arr1); \ + else \ + {\ + k = dst->n_allele;\ + vals2 = (type_t*) args->tmp_arr1;\ + for (i=0; idiploid[i] ) set_vector_end;\ + vals2 += nvals;\ + }\ + }\ + bcf_update_format_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals*nsmpl); \ + } \ + else \ + bcf_update_format_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals_ori*nsmpl); \ + } + switch (bcf_hdr_id2type(args->hdr,BCF_HL_FMT,fmt->id)) + { + case BCF_HT_INT: BRANCH_NUMERIC(int32, int32_t, dst_ptr[k]=bcf_int32_missing, vals2[k]==bcf_int32_vector_end, vals2[k]=bcf_int32_vector_end); break; + case BCF_HT_REAL: BRANCH_NUMERIC(float, float, bcf_float_set_missing(dst_ptr[k]), bcf_float_is_vector_end(vals2[k]), bcf_float_set_vector_end(vals2[k])); break; + } + #undef BRANCH_NUMERIC +} +static void merge_format_string(args_t *args, bcf1_t **lines, int nlines, bcf_fmt_t *fmt, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,fmt->id); + + int i, j, k, len = bcf_hdr_id2length(args->hdr,BCF_HL_FMT,fmt->id); + if ( len!=BCF_VL_A && len!=BCF_VL_R && len!=BCF_VL_G ) + { + int nret = bcf_get_format_char(args->hdr,lines[0],tag,&args->tmp_arr1,&args->ntmp_arr1); + bcf_update_format_char(args->out_hdr,dst,tag,args->tmp_arr1,nret); + return; + } + + int nsmpl = bcf_hdr_nsamples(args->hdr); + for (i=0; itmp_str[i].l = 0; + + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int jfrom = len==BCF_VL_A ? 1 : 0; + for (i=0; itmp_str[i]; + kputc('.',tmp); + for (k=jfrom+1; kn_allele; k++) kputs(",.",tmp); + } + for (i=0; ihdr,lines[i],tag,&args->tmp_arr1,&args->ntmp_arr1); + if (nret<0) continue; /* format tag does not exist in this record, skip */ + nret /= nsmpl; + for (k=0; ktmp_str[k]; + char *src = (char*)args->tmp_arr1 + k*nret; + for (j=jfrom; jn_allele; j++) + copy_string_field(src, j-jfrom, nret, tmp, args->maps[i].map[j]-jfrom); + } + } + } + else if ( len==BCF_VL_G ) + { + hts_expand(uint8_t,nsmpl,args->ntmp_arr2,args->tmp_arr2); + uint8_t *haploid = args->tmp_arr2; + int nret = bcf_get_format_char(args->hdr,lines[0],tag,&args->tmp_arr1,&args->ntmp_arr1); + nret /= nsmpl; + for (i=0; itmp_arr1 + i*nret, *se = ss+nret; + int nfields = 1; + while ( *ss && ssn_allele ) + { + haploid[i] = 1; + nfields = dst->n_allele; + } + else if ( nfields==lines[0]->n_allele*(lines[0]->n_allele+1)/2 ) + { + haploid[i] = 0; + nfields = dst->n_allele*(dst->n_allele+1)/2; + } + else error("The field %s at %s:%"PRId64" neither diploid nor haploid?\n", tag,bcf_seqname(args->hdr,dst),(int64_t) dst->pos+1); + + kstring_t *tmp = &args->tmp_str[i]; + kputc('.',tmp); + for (j=1; jhdr,lines[i],tag,&args->tmp_arr1,&args->ntmp_arr1); + if (nret<0) continue; /* format tag does not exist in this record, skip */ + nret /= nsmpl; + } + for (k=0; ktmp_str[k]; + char *src = (char*)args->tmp_arr1 + k*nret; + if ( haploid[k] ) + { + for (j=0; jn_allele; j++) + copy_string_field(src,j,nret, tmp, args->maps[i].map[j]); + } + else + { + int iori, jori, kori = 0; + for (iori=0; iorin_allele; iori++) + { + int inew = args->maps[i].map[iori]; + for (jori=0; jori<=iori; jori++) + { + int jnew = args->maps[i].map[jori]; + int knew = bcf_alleles2gt(inew,jnew); + copy_string_field(src,kori,nret,tmp,knew); + kori++; + } + } + } + } + } + } + kstring_t str; + str.m = args->ntmp_arr2; + str.l = 0; + str.s = (char*) args->tmp_arr2; + + int max_len = 0; + for (i=0; itmp_str[i].l ) max_len = args->tmp_str[i].l; + for (i=0; itmp_str[i]; + kputsn(tmp->s,tmp->l,&str); + for (j=tmp->l; jntmp_arr2 = str.m; + args->tmp_arr2 = (uint8_t*)str.s; + bcf_update_format_char(args->out_hdr,dst,tag,str.s,str.l); +} + +char **merge_alleles(char **a, int na, int *map, char **b, int *nb, int *mb); // see vcfmerge.c +static void merge_biallelics_to_multiallelic(args_t *args, bcf1_t *dst, bcf1_t **lines, int nlines) +{ + int i; + for (i=0; irid = lines[0]->rid; + dst->pos = lines[0]->pos; + + // take max for QUAL + bcf_float_set_missing(dst->qual); + for (i=0; iqual)) continue; + if (bcf_float_is_missing(dst->qual) || dst->qualqual) + dst->qual = lines[i]->qual; + } + + bcf_update_id(args->out_hdr, dst, lines[0]->d.id); + + // Merge and set the alleles, create a mapping from source allele indexes to dst idxs + hts_expand0(map_t,nlines,args->mmaps,args->maps); // a mapping for each line + args->nals = args->maps[0].nals = lines[0]->n_allele; + hts_expand(int,args->maps[0].nals,args->maps[0].mals,args->maps[0].map); + hts_expand(char*,args->nals,args->mals,args->als); + for (i=0; imaps[0].nals; i++) + { + args->maps[0].map[i] = i; + args->als[i] = strdup(lines[0]->d.allele[i]); + } + for (i=1; id.id[0]!='.' || lines[i]->d.id[1]) bcf_add_id(args->out_hdr, dst, lines[i]->d.id); + args->maps[i].nals = lines[i]->n_allele; + hts_expand(int,args->maps[i].nals,args->maps[i].mals,args->maps[i].map); + args->als = merge_alleles(lines[i]->d.allele, lines[i]->n_allele, args->maps[i].map, args->als, &args->nals, &args->mals); + if ( !args->als ) error("Failed to merge alleles at %s:%"PRId64"\n", bcf_seqname(args->hdr,dst),(int64_t) dst->pos+1); + } + bcf_update_alleles(args->out_hdr, dst, (const char**)args->als, args->nals); + for (i=0; inals; i++) + { + free(args->als[i]); + args->als[i] = NULL; + } + + if ( lines[0]->d.n_flt ) bcf_update_filter(args->out_hdr, dst, lines[0]->d.flt, lines[0]->d.n_flt); + for (i=1; id.n_flt; j++) { + // if strict_filter, set FILTER to PASS if any site PASS + // otherwise accumulate FILTERs + if (lines[i]->d.flt[j] == bcf_hdr_id2int(args->hdr, BCF_DT_ID, "PASS")) { + if (args->strict_filter) { + bcf_update_filter(args->out_hdr, dst, lines[i]->d.flt, lines[i]->d.n_flt); + break; + } + else + continue; + } + bcf_add_filter(args->out_hdr, dst, lines[i]->d.flt[j]); + } + } + + // merge info + for (i=0; in_info; i++) + { + bcf_info_t *info = &lines[0]->d.info[i]; + int type = bcf_hdr_id2type(args->hdr,BCF_HL_INFO,info->key); + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) merge_info_numeric(args, lines, nlines, info, dst); + else if ( type==BCF_HT_FLAG ) merge_info_flag(args, lines, nlines, info, dst); + else merge_info_string(args, lines, nlines, info, dst); + } + + // merge format + int gt_id = bcf_hdr_id2int(args->hdr,BCF_DT_ID,"GT"); + dst->n_sample = lines[0]->n_sample; + for (i=0; in_fmt; i++) + { + bcf_fmt_t *fmt = &lines[0]->d.fmt[i]; + int type = bcf_hdr_id2type(args->hdr,BCF_HL_FMT,fmt->id); + if ( fmt->id==gt_id ) merge_format_genotype(args, lines, nlines, fmt, dst); + else if ( type==BCF_HT_INT || type==BCF_HT_REAL ) merge_format_numeric(args, lines, nlines, fmt, dst); + else merge_format_string(args, lines, nlines, fmt, dst); + } +} + +#define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } +static void mrows_schedule(args_t *args, bcf1_t **line) +{ + int i,m; + if ( args->mrows_collapse==COLLAPSE_ANY // merge all record types together + || bcf_get_variant_types(*line)&VCF_SNP // SNP, put into alines + || bcf_get_variant_types(*line)==VCF_REF ) // ref + { + args->nalines++; + m = args->malines; + hts_expand(bcf1_t*,args->nalines,args->malines,args->alines); + for (i=m; imalines; i++) args->alines[i] = bcf_init1(); + SWAP(bcf1_t*, args->alines[args->nalines-1], *line); + } + else + { + args->nblines++; + m = args->mblines; + hts_expand(bcf1_t*,args->nblines,args->mblines,args->blines); + for (i=m; imblines; i++) args->blines[i] = bcf_init1(); + SWAP(bcf1_t*, args->blines[args->nblines-1], *line); + } +} +static int mrows_ready_to_flush(args_t *args, bcf1_t *line) +{ + if ( args->nalines && (args->alines[0]->rid!=line->rid || args->alines[0]->pos!=line->pos) ) return 1; + if ( args->nblines && (args->blines[0]->rid!=line->rid || args->blines[0]->pos!=line->pos) ) return 1; + return 0; +} +static bcf1_t *mrows_flush(args_t *args) +{ + if ( args->nblines && args->nalines==1 && bcf_get_variant_types(args->alines[0])==VCF_REF ) + { + // By default, REF lines are merged with SNPs if SNPs and indels are to be kept separately. + // However, if there are indels only and a single REF line, merge it with indels. + args->nblines++; + int i,m = args->mblines; + hts_expand(bcf1_t*,args->nblines,args->mblines,args->blines); + for (i=m; imblines; i++) args->blines[i] = bcf_init1(); + SWAP(bcf1_t*, args->blines[args->nblines-1], args->alines[0]); + args->nalines--; + } + if ( args->nalines ) + { + if ( args->nalines==1 ) + { + args->nalines = 0; + return args->alines[0]; + } + bcf_clear(args->mrow_out); + merge_biallelics_to_multiallelic(args, args->mrow_out, args->alines, args->nalines); + args->nalines = 0; + return args->mrow_out; + } + else if ( args->nblines ) + { + if ( args->nblines==1 ) + { + args->nblines = 0; + return args->blines[0]; + } + bcf_clear(args->mrow_out); + merge_biallelics_to_multiallelic(args, args->mrow_out, args->blines, args->nblines); + args->nblines = 0; + return args->mrow_out; + } + return NULL; +} +static void cmpals_add(cmpals_t *ca, bcf1_t *rec) +{ + ca->ncmpals++; + hts_expand0(cmpals1_t, ca->ncmpals, ca->mcmpals, ca->cmpals); + cmpals1_t *cmpals = ca->cmpals + ca->ncmpals - 1; + free(cmpals->ref); + cmpals->ref = strdup(rec->d.allele[0]); + cmpals->n = rec->n_allele; + if ( rec->n_allele==2 ) + { + free(cmpals->alt); + cmpals->alt = strdup(rec->d.allele[1]); + } + else + { + if ( cmpals->hash ) khash_str2int_destroy_free(cmpals->hash); + cmpals->hash = khash_str2int_init(); + int i; + for (i=1; in_allele; i++) + khash_str2int_inc(cmpals->hash, strdup(rec->d.allele[i])); + } +} +static int cmpals_match(cmpals_t *ca, bcf1_t *rec) +{ + int i, j; + for (i=0; incmpals; i++) + { + cmpals1_t *cmpals = ca->cmpals + i; + if ( rec->n_allele != cmpals->n ) continue; + + // NB. assuming both are normalized + if ( strcasecmp(rec->d.allele[0], cmpals->ref) ) continue; + + // the most frequent case + if ( rec->n_allele==2 ) + { + if ( strcasecmp(rec->d.allele[1], cmpals->alt) ) continue; + return 1; + } + + khash_t(str2int) *hash = (khash_t(str2int)*) cmpals->hash; + for (j=1; jn_allele; j++) + if ( !khash_str2int_has_key(hash, rec->d.allele[j]) ) break; + if ( jn_allele ) continue; + return 1; + } + return 0; +} +static void cmpals_reset(cmpals_t *ca) { ca->ncmpals = 0; } +static void cmpals_destroy(cmpals_t *ca) +{ + int i; + for (i=0; imcmpals; i++) + { + cmpals1_t *cmpals = ca->cmpals + i; + free(cmpals->ref); + free(cmpals->alt); + if ( cmpals->hash ) khash_str2int_destroy_free(cmpals->hash); + } + free(ca->cmpals); +} + +static void flush_buffer(args_t *args, htsFile *file, int n) +{ + bcf1_t *line; + int i, k; + int prev_rid = -1, prev_pos = -1, prev_type = 0; + for (i=0; irbuf); + if ( args->mrows_op==MROWS_MERGE ) + { + if ( mrows_ready_to_flush(args, args->lines[k]) ) + { + while ( (line=mrows_flush(args)) ) + if ( bcf_write1(file, args->out_hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } + int merge = 1; + if ( args->mrows_collapse!=COLLAPSE_BOTH && args->mrows_collapse!=COLLAPSE_ANY ) + { + if ( !(bcf_get_variant_types(args->lines[k]) & args->mrows_collapse) ) merge = 0; + } + if ( merge ) + { + mrows_schedule(args, &args->lines[k]); + continue; + } + } + else if ( args->rmdup ) + { + int line_type = bcf_get_variant_types(args->lines[k]); + if ( prev_rid>=0 && prev_rid==args->lines[k]->rid && prev_pos==args->lines[k]->pos ) + { + if ( args->rmdup & BCF_SR_PAIR_ANY ) continue; // rmdup by position only + if ( args->rmdup & BCF_SR_PAIR_SNPS && line_type&(VCF_SNP|VCF_MNP) && prev_type&(VCF_SNP|VCF_MNP) ) continue; + if ( args->rmdup & BCF_SR_PAIR_INDELS && line_type&(VCF_INDEL) && prev_type&(VCF_INDEL) ) continue; + if ( args->rmdup & BCF_SR_PAIR_EXACT && cmpals_match(&args->cmpals_out, args->lines[k]) ) continue; + } + else + { + prev_rid = args->lines[k]->rid; + prev_pos = args->lines[k]->pos; + prev_type = 0; + if ( args->rmdup & BCF_SR_PAIR_EXACT ) cmpals_reset(&args->cmpals_out); + } + prev_type |= line_type; + if ( args->rmdup & BCF_SR_PAIR_EXACT ) cmpals_add(&args->cmpals_out, args->lines[k]); + } + if ( bcf_write1(file, args->out_hdr, args->lines[k])!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } + if ( args->mrows_op==MROWS_MERGE && !args->rbuf.n ) + { + while ( (line=mrows_flush(args)) ) + if ( bcf_write1(file, args->out_hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } +} + +static void init_data(args_t *args) +{ + args->hdr = args->files->readers[0].header; + if ( args->keep_sum_ad ) + { + args->keep_sum_ad = bcf_hdr_id2int(args->hdr,BCF_DT_ID,"AD"); + if ( args->keep_sum_ad < 0 ) error("Error: --keep-sum-ad requested but the tag AD is not present\n"); + } + else + args->keep_sum_ad = -1; + + args->out_hdr = bcf_hdr_dup(args->hdr); + if ( args->old_rec_tag ) + bcf_hdr_printf(args->out_hdr,"##INFO=",args->old_rec_tag); + + rbuf_init(&args->rbuf, 100); + args->lines = (bcf1_t**) calloc(args->rbuf.m, sizeof(bcf1_t*)); + if ( args->ref_fname ) + { + args->fai = fai_load(args->ref_fname); + if ( !args->fai ) error("Failed to load the fai index: %s\n", args->ref_fname); + } + if ( args->mrows_op==MROWS_MERGE ) + { + args->mrow_out = bcf_init1(); + args->tmp_str = (kstring_t*) calloc(bcf_hdr_nsamples(args->hdr),sizeof(kstring_t)); + args->diploid = (uint8_t*) malloc(bcf_hdr_nsamples(args->hdr)); + } + if ( args->atomize==SPLIT ) + { + args->abuf = abuf_init(args->hdr, SPLIT); + abuf_set_opt(args->abuf, bcf_hdr_t*, BCF_HDR, args->out_hdr); + if ( args->old_rec_tag ) + abuf_set_opt(args->abuf, const char*, INFO_TAG, args->old_rec_tag); + abuf_set_opt(args->abuf, int, STAR_ALLELE, args->use_star_allele); + } +} + +static void destroy_data(args_t *args) +{ + cmpals_destroy(&args->cmpals_in); + cmpals_destroy(&args->cmpals_out); + int i; + for (i=0; irbuf.m; i++) + if ( args->lines[i] ) bcf_destroy1(args->lines[i]); + free(args->lines); + for (i=0; imtmp_lines; i++) + if ( args->tmp_lines[i] ) bcf_destroy1(args->tmp_lines[i]); + free(args->tmp_lines); + for (i=0; imalines; i++) + bcf_destroy1(args->alines[i]); + free(args->alines); + for (i=0; imblines; i++) + bcf_destroy1(args->blines[i]); + free(args->blines); + for (i=0; immaps; i++) + free(args->maps[i].map); + for (i=0; intmp_als; i++) + free(args->tmp_als[i].s); + free(args->tmp_als); + free(args->tmp_kstr.s); + if ( args->tmp_str ) + { + for (i=0; ihdr); i++) free(args->tmp_str[i].s); + free(args->tmp_str); + } + free(args->maps); + free(args->als); + free(args->int32_arr); + free(args->tmp_arr1); + free(args->tmp_arr2); + free(args->diploid); + if ( args->abuf ) abuf_destroy(args->abuf); + bcf_hdr_destroy(args->out_hdr); + if ( args->mrow_out ) bcf_destroy1(args->mrow_out); + if ( args->fai ) fai_destroy(args->fai); + if ( args->mseq ) free(args->seq); +} + + +static void normalize_line(args_t *args, bcf1_t *line) +{ + if ( args->fai ) + { + if ( args->check_ref & CHECK_REF_FIX ) fix_ref(args, line); + if ( args->do_indels ) + { + int ret = realign(args, line); + + // exclude broken VCF lines + if ( ret==ERR_REF_MISMATCH && args->check_ref & CHECK_REF_SKIP ) + { + args->nskipped++; + return; + } + if ( ret==ERR_DUP_ALLELE ) + { + if ( args->check_ref & CHECK_REF_FIX ) + fix_dup_alt(args, line); + else if ( args->check_ref==CHECK_REF_EXIT ) + error("Duplicate alleles at %s:%"PRId64"; run with -cw to turn the error into warning or with -cs to fix.\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + else if ( args->check_ref & CHECK_REF_WARN ) + fprintf(stderr,"ALT_DUP\t%s\t%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + } + } + } + + // insert into sorted buffer + rbuf_expand0(&args->rbuf,bcf1_t*,args->rbuf.n+1,args->lines); + int i,j; + i = j = rbuf_append(&args->rbuf); + if ( args->lines[i] ) bcf_destroy(args->lines[i]); + args->lines[i] = bcf_dup(line); + while ( rbuf_prev(&args->rbuf,&i) ) + { + if ( args->lines[i]->pos > args->lines[j]->pos ) SWAP(bcf1_t*, args->lines[i], args->lines[j]); + j = i; + } +} + +static bcf1_t *next_atomized_line(args_t *args) +{ + bcf1_t *rec = NULL; + if ( args->atomize==SPLIT ) + { + rec = abuf_flush(args->abuf, 0); + if ( rec ) return rec; + } + + if ( !bcf_sr_next_line(args->files) ) return NULL; + + if ( args->atomize==SPLIT ) + { + abuf_push(args->abuf,bcf_sr_get_line(args->files,0)); + return abuf_flush(args->abuf, 0); + } + return bcf_sr_get_line(args->files,0); +} +static void normalize_vcf(args_t *args) +{ + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) + hts_set_opt(args->out, HTS_OPT_THREAD_POOL, args->files->p); + if (args->record_cmd_line) bcf_hdr_append_version(args->out_hdr, args->argc, args->argv, "bcftools_norm"); + if ( bcf_hdr_write(args->out, args->out_hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + + bcf1_t *line; + int prev_rid = -1, prev_pos = -1, prev_type = 0; + while ( (line = next_atomized_line(args)) ) + { + args->ntotal++; + if ( args->rmdup ) + { + int line_type = bcf_get_variant_types(line); + if ( prev_rid>=0 && prev_rid==line->rid && prev_pos==line->pos ) + { + if ( args->rmdup & BCF_SR_PAIR_ANY ) continue; // rmdup by position only + if ( args->rmdup & BCF_SR_PAIR_SNPS && line_type&(VCF_SNP|VCF_MNP) && prev_type&(VCF_SNP|VCF_MNP) ) continue; + if ( args->rmdup & BCF_SR_PAIR_INDELS && line_type&(VCF_INDEL) && prev_type&(VCF_INDEL) ) continue; + if ( args->rmdup & BCF_SR_PAIR_EXACT && cmpals_match(&args->cmpals_in, line) ) continue; + } + else + { + prev_rid = line->rid; + prev_pos = line->pos; + prev_type = 0; + if ( args->rmdup & BCF_SR_PAIR_EXACT ) cmpals_reset(&args->cmpals_in); + } + prev_type |= line_type; + if ( args->rmdup & BCF_SR_PAIR_EXACT ) cmpals_add(&args->cmpals_in, line); + } + + // still on the same chromosome? + int i,j,ilast = rbuf_last(&args->rbuf); + if ( ilast>=0 && line->rid != args->lines[ilast]->rid ) flush_buffer(args, args->out, args->rbuf.n); // new chromosome + + int split = 0; + if ( args->mrows_op==MROWS_SPLIT ) + { + split = 1; + if ( args->mrows_collapse!=COLLAPSE_BOTH && args->mrows_collapse!=COLLAPSE_ANY ) + { + if ( !(bcf_get_variant_types(line) & args->mrows_collapse) ) split = 0; + } + if ( split && line->n_allele>2 ) + { + args->nsplit++; + split_multiallelic_to_biallelics(args, line); + for (j=0; jntmp_lines; j++) + normalize_line(args, args->tmp_lines[j]); + } + else + split = 0; + } + if ( !split ) + normalize_line(args, line); + + // find out how many sites to flush + ilast = rbuf_last(&args->rbuf); + j = 0; + for (i=-1; rbuf_next(&args->rbuf,&i); ) + { + if ( args->lines[ilast]->pos - args->lines[i]->pos < args->buf_win ) break; + j++; + } + if ( j>0 ) flush_buffer(args, args->out, j); + } + flush_buffer(args, args->out, args->rbuf.n); + if ( hts_close(args->out)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + + fprintf(stderr,"Lines total/split/realigned/skipped:\t%d/%d/%d/%d\n", args->ntotal,args->nsplit,args->nchanged,args->nskipped); + if ( args->check_ref & CHECK_REF_FIX ) + fprintf(stderr,"REF/ALT total/modified/added: \t%d/%d/%d\n", args->nref.tot,args->nref.swap,args->nref.set); +} + +static void usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Left-align and normalize indels; check if REF alleles match the reference;\n"); + fprintf(stderr, " split multiallelic sites into multiple rows; recover multiallelics from\n"); + fprintf(stderr, " multiple rows.\n"); + fprintf(stderr, "Usage: bcftools norm [options] \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -a, --atomize Decompose complex variants (e.g. MNVs become consecutive SNVs)\n"); + fprintf(stderr, " --atom-overlaps '*'|. Use the star allele (*) for overlapping alleles or set to missing (.) [*]\n"); + fprintf(stderr, " -c, --check-ref e|w|x|s Check REF alleles and exit (e), warn (w), exclude (x), or set (s) bad sites [e]\n"); + fprintf(stderr, " -D, --remove-duplicates Remove duplicate lines of the same type.\n"); + fprintf(stderr, " -d, --rm-dup TYPE Remove duplicate snps|indels|both|all|exact\n"); + fprintf(stderr, " -f, --fasta-ref FILE Reference sequence\n"); + fprintf(stderr, " --force Try to proceed even if malformed tags are encountered. Experimental, use at your own risk\n"); + fprintf(stderr, " --keep-sum TAG,.. Keep vector sum constant when splitting multiallelics (see github issue #360)\n"); + fprintf(stderr, " -m, --multiallelics -|+TYPE Split multiallelics (-) or join biallelics (+), type: snps|indels|both|any [both]\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -N, --do-not-normalize Do not normalize indels (with -m or -c s)\n"); + fprintf(stderr, " --old-rec-tag STR Annotate modified records with INFO/STR indicating the original variant\n"); + fprintf(stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --strict-filter When merging (-m+), merged site is PASS only if all sites being merged PASS\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(stderr, " -w, --site-win INT Buffer for sorting lines which changed position during realignment [1000]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, " # normalize and left-align indels\n"); + fprintf(stderr, " bcftools norm -f ref.fa in.vcf\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " # split multi-allelic sites\n"); + fprintf(stderr, " bcftools norm -m- in.vcf\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfnorm(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->aln_win = 100; + args->buf_win = 1000; + args->mrows_collapse = COLLAPSE_BOTH; + args->do_indels = 1; + args->clevel = -1; + int region_is_file = 0; + int targets_is_file = 0; + args->use_star_allele = 1; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"help",no_argument,NULL,'h'}, + {"force",no_argument,NULL,7}, + {"atomize",no_argument,NULL,'a'}, + {"atom-overlaps",required_argument,NULL,11}, + {"old-rec-tag",required_argument,NULL,12}, + {"keep-sum",required_argument,NULL,10}, + {"fasta-ref",required_argument,NULL,'f'}, + {"do-not-normalize",no_argument,NULL,'N'}, + {"multiallelics",required_argument,NULL,'m'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,1}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,2}, + {"site-win",required_argument,NULL,'w'}, + {"remove-duplicates",no_argument,NULL,'D'}, + {"rm-dup",required_argument,NULL,'d'}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"check-ref",required_argument,NULL,'c'}, + {"strict-filter",no_argument,NULL,'s'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "hr:R:f:w:Dd:o:O:c:m:t:T:sNa",loptions,NULL)) >= 0) { + switch (c) { + case 10: + // possibly generalize this also to INFO/AD and other tags + if ( strcasecmp("ad",optarg) ) + error("Error: only --keep-sum AD is currently supported. See https://github.com/samtools/bcftools/issues/360 for more.\n"); + args->keep_sum_ad = 1; // this will be set to the header id or -1 in init_data + break; + case 'a': args->atomize = SPLIT; break; + case 11 : + if ( optarg[0]=='*' ) args->use_star_allele = 1; + else if ( optarg[0]=='.' ) args->use_star_allele = 0; + else error("Invalid argument to --atom-overlaps. Perhaps you wanted: \"--atom-overlaps '*'\"?\n"); + break; + case 12 : args->old_rec_tag = optarg; break; + case 'N': args->do_indels = 0; break; + case 'd': + if ( !strcmp("snps",optarg) ) args->rmdup = BCF_SR_PAIR_SNPS; + else if ( !strcmp("indels",optarg) ) args->rmdup = BCF_SR_PAIR_INDELS; + else if ( !strcmp("both",optarg) ) args->rmdup = BCF_SR_PAIR_BOTH; + else if ( !strcmp("all",optarg) ) args->rmdup = BCF_SR_PAIR_ANY; + else if ( !strcmp("any",optarg) ) args->rmdup = BCF_SR_PAIR_ANY; + else if ( !strcmp("none",optarg) ) args->rmdup = BCF_SR_PAIR_EXACT; + else if ( !strcmp("exact",optarg) ) args->rmdup = BCF_SR_PAIR_EXACT; + else error("The argument to -d not recognised: %s\n", optarg); + break; + case 'm': + if ( optarg[0]=='-' ) args->mrows_op = MROWS_SPLIT; + else if ( optarg[0]=='+' ) args->mrows_op = MROWS_MERGE; + else error("Expected '+' or '-' with -m\n"); + if ( optarg[1]!=0 ) + { + if ( !strcmp("snps",optarg+1) ) args->mrows_collapse = COLLAPSE_SNPS; + else if ( !strcmp("indels",optarg+1) ) args->mrows_collapse = COLLAPSE_INDELS; + else if ( !strcmp("both",optarg+1) ) args->mrows_collapse = COLLAPSE_BOTH; + else if ( !strcmp("any",optarg+1) ) args->mrows_collapse = COLLAPSE_ANY; + else error("The argument to -m not recognised: %s\n", optarg); + } + break; + case 'c': + if ( strchr(optarg,'w') ) args->check_ref |= CHECK_REF_WARN; + if ( strchr(optarg,'x') ) args->check_ref |= CHECK_REF_SKIP; + if ( strchr(optarg,'s') ) args->check_ref |= CHECK_REF_FIX; + if ( strchr(optarg,'e') ) args->check_ref = CHECK_REF_EXIT; // overrides the above + break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'o': args->output_fname = optarg; break; + case 'D': + fprintf(stderr,"Warning: `-D` is functional but deprecated, replaced by and alias of `-d none`.\n"); + args->rmdup = BCF_SR_PAIR_EXACT; + break; + case 's': args->strict_filter = 1; break; + case 'f': args->ref_fname = optarg; break; + case 'r': args->region = optarg; break; + case 'R': args->region = optarg; region_is_file = 1; break; + case 't': args->targets = optarg; break; + case 'T': args->targets = optarg; targets_is_file = 1; break; + case 'w': + args->buf_win = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --site-win %s\n", optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 7 : args->force = 1; break; + case 1 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 2 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(); + } + else fname = argv[optind]; + + if ( !args->ref_fname && !args->mrows_op && !args->rmdup && args->atomize==NONE ) error("Expected -a, -f, -m, -D or -d option\n"); + if ( !args->check_ref && args->ref_fname ) args->check_ref = CHECK_REF_EXIT; + if ( args->check_ref && !args->ref_fname ) error("Expected --fasta-ref with --check-ref\n"); + + if ( args->region ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->region,region_is_file)<0 ) + error("Failed to read the regions: %s\n", args->region); + } + if ( args->targets ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets,targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets); + } + + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + if ( args->mrows_op&MROWS_SPLIT && args->rmdup ) error("Cannot combine -D and -m-\n"); + init_data(args); + normalize_vcf(args); + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} + diff --git a/bcftools/vcfnorm.c.pysam.c b/bcftools/vcfnorm.c.pysam.c new file mode 100644 index 0000000..a292b96 --- /dev/null +++ b/bcftools/vcfnorm.c.pysam.c @@ -0,0 +1,2297 @@ +#include "bcftools.pysam.h" + +/* vcfnorm.c -- Left-align and normalize indels. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "rbuf.h" +#include "abuf.h" + +#define CHECK_REF_EXIT 1 +#define CHECK_REF_WARN 2 +#define CHECK_REF_SKIP 4 +#define CHECK_REF_FIX 8 + +#define MROWS_SPLIT 1 +#define MROWS_MERGE 2 + +// for -m+, mapping from allele indexes of a single input record +// to allele indexes of output record +typedef struct +{ + int nals, mals, *map; +} +map_t; + +// primitive comparison of two records' alleles via hashes; normalized alleles assumed +typedef struct +{ + int n; // number of alleles + char *ref, *alt; + void *hash; +} +cmpals1_t; + +typedef struct +{ + cmpals1_t *cmpals; + int ncmpals, mcmpals; +} +cmpals_t; + +typedef struct +{ + char *tseq, *seq; + int mseq; + bcf1_t **lines, **tmp_lines, **alines, **blines, *mrow_out; + int ntmp_lines, mtmp_lines, nalines, malines, nblines, mblines; + map_t *maps; // mrow map for each buffered record + char **als; + int mmaps, nals, mals; + uint8_t *tmp_arr1, *tmp_arr2, *diploid; + int32_t *int32_arr; + int ntmp_arr1, ntmp_arr2, nint32_arr; + kstring_t *tmp_str; + kstring_t *tmp_als, tmp_kstr; + int ntmp_als; + rbuf_t rbuf; + int buf_win; // maximum distance between two records to consider + int aln_win; // the realignment window size (maximum repeat size) + bcf_srs_t *files; // using the synced reader only for -r option + bcf_hdr_t *hdr, *out_hdr; + cmpals_t cmpals_in, cmpals_out; + faidx_t *fai; + struct { int tot, set, swap; } nref; + char **argv, *output_fname, *ref_fname, *vcf_fname, *region, *targets; + int argc, rmdup, output_type, n_threads, check_ref, strict_filter, do_indels, clevel; + int nchanged, nskipped, nsplit, ntotal, mrows_op, mrows_collapse, parsimonious; + int record_cmd_line, force, force_warned, keep_sum_ad; + abuf_t *abuf; + abuf_opt_t atomize; + int use_star_allele; + char *old_rec_tag; + htsFile *out; +} +args_t; + +static inline int replace_iupac_codes(char *seq, int nseq) +{ + // Replace ambiguity codes with N for now, it awaits to be seen what the VCF spec codifies in the end + int i, n = 0; + for (i=0; id.allele[0]); + int i,j, maxlen = reflen, len; + for (i=1; in_allele; i++) + { + int len = strlen(line->d.allele[i]); + if ( maxlen < len ) maxlen = len; + } + + char *ref = faidx_fetch_seq(args->fai, (char*)bcf_seqname(args->hdr,line), line->pos, line->pos+maxlen-1, &len); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + replace_iupac_codes(ref,len); + + args->nref.tot++; + + // is the REF different? If not, we are done + if ( !strncasecmp(line->d.allele[0],ref,reflen) ) { free(ref); return; } + + // is the REF allele missing? + if ( reflen==1 && line->d.allele[0][0]=='.' ) + { + line->d.allele[0][0] = ref[0]; + args->nref.set++; + free(ref); + bcf_update_alleles(args->out_hdr,line,(const char**)line->d.allele,line->n_allele); + return; + } + + // does REF or ALT contain non-standard bases? + int has_non_acgtn = 0; + for (i=0; in_allele; i++) + { + if ( line->d.allele[i][0]=='<' ) continue; + has_non_acgtn += replace_iupac_codes(line->d.allele[i],strlen(line->d.allele[i])); + } + if ( has_non_acgtn ) + { + args->nref.set++; + bcf_update_alleles(args->out_hdr,line,(const char**)line->d.allele,line->n_allele); + if ( !strncasecmp(line->d.allele[0],ref,reflen) ) { free(ref); return; } + } + + // does the REF allele contain N's ? + int fix = 0; + for (i=0; id.allele[0][i]!='N' ) continue; + if ( ref[i]=='N' ) continue; + line->d.allele[0][i] = ref[i]; + fix++; + for (j=1; jn_allele; j++) + { + int len = strlen(line->d.allele[j]); + if ( len <= i || line->d.allele[j][i]!='N' ) continue; + line->d.allele[j][i] = ref[i]; + fix++; + } + } + if ( fix ) + { + args->nref.set++; + bcf_update_alleles(args->out_hdr,line,(const char**)line->d.allele,line->n_allele); + if ( !strncasecmp(line->d.allele[0],ref,reflen) ) { free(ref); return; } + } + + + // is it swapped? + for (i=1; in_allele; i++) + { + int len = strlen(line->d.allele[i]); + if ( !strncasecmp(line->d.allele[i],ref,len) ) break; + } + + kstring_t str = {0,0,0}; + if ( i==line->n_allele ) // none of the alternate alleles matches the reference + { + args->nref.set++; + kputsn(ref,reflen,&str); + for (i=1; in_allele; i++) + { + kputc(',',&str); + kputs(line->d.allele[i],&str); + } + bcf_update_alleles_str(args->out_hdr,line,str.s); + free(ref); + free(str.s); + return; + } + + // one of the alternate alleles matches the reference, assume it's a simple swap + kputs(line->d.allele[i],&str); + for (j=1; jn_allele; j++) + { + kputc(',',&str); + if ( j==i ) + kputs(line->d.allele[0],&str); + else + kputs(line->d.allele[j],&str); + } + bcf_update_alleles_str(args->out_hdr,line,str.s); + args->nref.swap++; + free(ref); + free(str.s); + + // swap genotypes + int ntmp = args->ntmp_arr1 / sizeof(int32_t); // reuse tmp_arr declared as uint8_t + int ngts = bcf_get_genotypes(args->hdr, line, &args->tmp_arr1, &ntmp); + args->ntmp_arr1 = ntmp * sizeof(int32_t); + int32_t *gts = (int32_t*) args->tmp_arr1; + int ni = 0; + for (j=0; jout_hdr,line,gts,ngts); + + // update AC + int nac = bcf_get_info_int32(args->hdr, line, "AC", &args->tmp_arr1, &ntmp); + args->ntmp_arr1 = ntmp * sizeof(int32_t); + if ( i <= nac ) + { + int32_t *ac = (int32_t*)args->tmp_arr1; + ac[i-1] = ni; + bcf_update_info_int32(args->out_hdr, line, "AC", ac, nac); + } +} + +static void fix_dup_alt(args_t *args, bcf1_t *line) +{ + // update alleles, create a mapping between old and new indexes + hts_expand(uint8_t,line->n_allele,args->ntmp_arr1,args->tmp_arr1); + args->tmp_arr1[0] = 0; // ref always unchanged + + int i, j, nals = line->n_allele, nals_ori = line->n_allele; + for (i=1, j=1; in_allele; i++) + { + if ( strcasecmp(line->d.allele[0],line->d.allele[i]) ) + { + args->tmp_arr1[i] = j++; + continue; + } + args->tmp_arr1[i] = 0; + nals--; + } + for (i=1, j=1; in_allele; i++) + { + if ( !args->tmp_arr1[i] ) continue; + line->d.allele[j++] = line->d.allele[i]; + } + bcf_update_alleles(args->out_hdr, line, (const char**)line->d.allele, nals); + + + // update genotypes + int ntmp = args->ntmp_arr2 / sizeof(int32_t); // reuse tmp_arr declared as uint8_t + int ngts = bcf_get_genotypes(args->hdr, line, &args->tmp_arr2, &ntmp); + args->ntmp_arr2 = ntmp * sizeof(int32_t); + int32_t *gts = (int32_t*) args->tmp_arr2; + int changed = 0; + for (i=0; itmp_arr1[ial] ) continue; + int ial_new = ialtmp_arr1[ial] : 0; + gts[i] = bcf_gt_is_phased(gts[i]) ? bcf_gt_phased(ial_new) : bcf_gt_unphased(ial_new); + changed = 1; + } + if ( changed ) bcf_update_genotypes(args->out_hdr,line,gts,ngts); +} + +static void set_old_rec_tag(args_t *args, bcf1_t *dst, bcf1_t *src, int ialt) +{ + if ( !args->old_rec_tag ) return; + + // only update if the tag is not present already, there can be multiple normalization steps + int i, id = bcf_hdr_id2int(args->out_hdr, BCF_DT_ID, args->old_rec_tag); + bcf_unpack(dst, BCF_UN_INFO); + for (i=0; in_info; i++) + { + bcf_info_t *inf = &dst->d.info[i]; + if ( inf && inf->key == id ) return; + } + + args->tmp_kstr.l = 0; + ksprintf(&args->tmp_kstr,"%s|%"PRIhts_pos"|%s|",bcf_seqname(args->hdr,src),src->pos+1,src->d.allele[0]); + for (i=1; in_allele; i++) + { + kputs(src->d.allele[i],&args->tmp_kstr); + if ( i+1n_allele ) kputc(',',&args->tmp_kstr); + } + if ( ialt>0 ) + { + kputc('|',&args->tmp_kstr); + kputw(ialt,&args->tmp_kstr); + } + if ( (bcf_update_info_string(args->out_hdr, dst, args->old_rec_tag, args->tmp_kstr.s))!=0 ) + error("An error occurred while updating INFO/%s\n",args->old_rec_tag); +} + +#define ERR_DUP_ALLELE -2 +#define ERR_REF_MISMATCH -1 +#define ERR_OK 0 +#define ERR_SYMBOLIC 1 +#define ERR_SPANNING_DELETION 2 + +static int realign(args_t *args, bcf1_t *line) +{ + bcf_unpack(line, BCF_UN_STR); + + // Sanity check REF + int i, nref, reflen = strlen(line->d.allele[0]); + char *ref = faidx_fetch_seq(args->fai, (char*)args->hdr->id[BCF_DT_CTG][line->rid].key, line->pos, line->pos+reflen-1, &nref); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", args->hdr->id[BCF_DT_CTG][line->rid].key, (int64_t) line->pos+1); + seq_to_upper(ref,0); + replace_iupac_codes(ref,nref); // any non-ACGT character in fasta ref is replaced with N + + // does VCF REF contain non-standard bases? + if ( has_non_acgtn(line->d.allele[0],reflen) ) + { + if ( args->check_ref==CHECK_REF_EXIT ) + error("Non-ACGTN reference allele at %s:%"PRId64" .. REF_SEQ:'%s' vs VCF:'%s'\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,ref,line->d.allele[0]); + if ( args->check_ref & CHECK_REF_WARN ) + fprintf(bcftools_stderr,"NON_ACGTN_REF\t%s\t%"PRId64"\t%s\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,line->d.allele[0]); + free(ref); + return ERR_REF_MISMATCH; + } + if ( strcasecmp(ref,line->d.allele[0]) ) + { + if ( args->check_ref==CHECK_REF_EXIT ) + error("Reference allele mismatch at %s:%"PRId64" .. REF_SEQ:'%s' vs VCF:'%s'\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,ref,line->d.allele[0]); + if ( args->check_ref & CHECK_REF_WARN ) + fprintf(bcftools_stderr,"REF_MISMATCH\t%s\t%"PRId64"\t%s\t%s\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,line->d.allele[0],ref); + free(ref); + return ERR_REF_MISMATCH; + } + free(ref); + ref = NULL; + + if ( line->n_allele == 1 ) // a REF + { + if ( line->rlen > 1 ) + { + line->d.allele[0][1] = 0; + bcf_update_alleles(args->out_hdr,line,(const char**)line->d.allele,line->n_allele); + } + return ERR_OK; + } + if ( bcf_get_variant_types(line)==VCF_BND ) return ERR_SYMBOLIC; // breakend, not an error + + // make a copy of each allele for trimming + hts_expand0(kstring_t,line->n_allele,args->ntmp_als,args->tmp_als); + kstring_t *als = args->tmp_als; + for (i=0; in_allele; i++) + { + if ( line->d.allele[i][0]=='<' ) return ERR_SYMBOLIC; // symbolic allele + if ( line->d.allele[i][0]=='*' ) return ERR_SPANNING_DELETION; // spanning deletion + if ( has_non_acgtn(line->d.allele[i],line->shared.l) ) + { + if ( args->check_ref==CHECK_REF_EXIT ) + error("Non-ACGTN alternate allele at %s:%"PRId64" .. VCF:'%s'\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,line->d.allele[i]); + if ( args->check_ref & CHECK_REF_WARN ) + fprintf(bcftools_stderr,"NON_ACGTN_ALT\t%s\t%"PRId64"\t%s\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1,line->d.allele[i]); + return ERR_REF_MISMATCH; + } + + als[i].l = 0; + kputs(line->d.allele[i], &als[i]); + seq_to_upper(als[i].s,0); + + if ( i>0 && als[i].l==als[0].l && !strcasecmp(als[0].s,als[i].s) ) return ERR_DUP_ALLELE; + } + + // trim from right + int new_pos = line->pos; + while (1) + { + // is the rightmost base identical in all alleles? + int min_len = als[0].l; + for (i=1; in_allele; i++) + { + if ( toupper(als[0].s[ als[0].l-1 ])!=toupper(als[i].s[ als[i].l-1 ]) ) break; + if ( als[i].l < min_len ) min_len = als[i].l; + } + if ( i!=line->n_allele ) break; // there are differences, cannot be trimmed + if ( min_len<=1 && new_pos==0 ) break; + + int pad_from_left = 0; + for (i=0; in_allele; i++) // trim all alleles + { + als[i].l--; + if ( !als[i].l ) pad_from_left = 1; + } + if ( pad_from_left ) + { + int npad = new_pos >= args->aln_win ? args->aln_win : new_pos; + free(ref); + ref = faidx_fetch_seq(args->fai, (char*)args->hdr->id[BCF_DT_CTG][line->rid].key, new_pos-npad, new_pos-1, &nref); + if ( !ref ) error("faidx_fetch_seq failed at %s:%"PRId64"\n", args->hdr->id[BCF_DT_CTG][line->rid].key, (int64_t) new_pos-npad+1); + replace_iupac_codes(ref,nref); + for (i=0; in_allele; i++) + { + ks_resize(&als[i], als[i].l + npad); + if ( als[i].l ) memmove(als[i].s+npad,als[i].s,als[i].l); + memcpy(als[i].s,ref,npad); + als[i].l += npad; + } + new_pos -= npad; + } + } + free(ref); + + // trim from left + int ntrim_left = 0; + while (1) + { + // is the first base identical in all alleles? + int min_len = als[0].l - ntrim_left; + for (i=1; in_allele; i++) + { + if ( als[0].s[ntrim_left]!=als[i].s[ntrim_left] ) break; + if ( min_len > als[i].l - ntrim_left ) min_len = als[i].l - ntrim_left; + } + if ( i!=line->n_allele || min_len<=1 ) break; // there are differences, cannot be trimmed + ntrim_left++; + } + if ( ntrim_left ) + { + for (i=0; in_allele; i++) + { + memmove(als[i].s,als[i].s+ntrim_left,als[i].l-ntrim_left); + als[i].l -= ntrim_left; + } + new_pos += ntrim_left; + } + + // Have the alleles changed? + als[0].s[ als[0].l ] = 0; // in order for strcmp to work + if ( new_pos==line->pos && !strcasecmp(line->d.allele[0],als[0].s) ) return ERR_OK; + + set_old_rec_tag(args, line, line, 0); + + // Create new block of alleles and update + args->tmp_kstr.l = 0; + for (i=0; in_allele; i++) + { + if (i>0) kputc(',',&args->tmp_kstr); + kputsn(als[i].s,als[i].l,&args->tmp_kstr); + } + args->tmp_kstr.s[ args->tmp_kstr.l ] = 0; + bcf_update_alleles_str(args->out_hdr,line,args->tmp_kstr.s); + args->nchanged++; + + // Update INFO/END if necessary + int new_reflen = strlen(line->d.allele[0]); + if ( (new_pos!=line->pos || reflen!=new_reflen) && bcf_get_info_int32(args->hdr, line, "END", &args->int32_arr, &args->nint32_arr)==1 ) + { + // bcf_update_alleles_str() messed up rlen because line->pos changed. This will be fixed by bcf_update_info_int32() + line->pos = new_pos; + args->int32_arr[0] = line->pos + new_reflen; + bcf_update_info_int32(args->out_hdr, line, "END", args->int32_arr, 1); + } + line->pos = new_pos; + + return ERR_OK; +} + +static void split_info_numeric(args_t *args, bcf1_t *src, bcf_info_t *info, int ialt, bcf1_t *dst) +{ + #define BRANCH_NUMERIC(type,type_t,is_vector_end,is_missing) \ + { \ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); \ + int ntmp = args->ntmp_arr1 / sizeof(type_t); \ + int ret = bcf_get_info_##type(args->hdr,src,tag,&args->tmp_arr1,&ntmp); \ + args->ntmp_arr1 = ntmp * sizeof(type_t); \ + assert( ret>0 ); \ + type_t *vals = (type_t*) args->tmp_arr1; \ + int len = bcf_hdr_id2length(args->hdr,BCF_HL_INFO,info->key); \ + if ( len==BCF_VL_A ) \ + { \ + if ( ret!=src->n_allele-1 ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(bcftools_stderr, \ + "Warning: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele-1,ret); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_info_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele-1,ret); \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals+ialt,1); \ + } \ + else if ( len==BCF_VL_R ) \ + { \ + if ( ret!=src->n_allele ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(bcftools_stderr, \ + "Warning: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele,ret); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_info_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele,ret); \ + } \ + if ( args->keep_sum_ad >= 0 && args->keep_sum_ad==info->key ) \ + { \ + int j; \ + for (j=1; jlen; j++) \ + if ( j!=ialt+1 && !(is_missing) && !(is_vector_end) ) vals[0] += vals[j]; \ + vals[1] = vals[ialt+1]; \ + } \ + else \ + { \ + if ( ialt!=0 ) vals[1] = vals[ialt+1]; \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals,2); \ + } \ + else if ( len==BCF_VL_G ) \ + { \ + if ( ret!=src->n_allele*(src->n_allele+1)/2 ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(bcftools_stderr, \ + "Warning: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele*(src->n_allele+1)/2,ret); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_info_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in INFO/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele*(src->n_allele+1)/2,ret); \ + } \ + if ( ialt!=0 ) \ + { \ + vals[1] = vals[bcf_alleles2gt(0,ialt+1)]; \ + vals[2] = vals[bcf_alleles2gt(ialt+1,ialt+1)]; \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals,3); \ + } \ + else \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals,ret); \ + } + switch (bcf_hdr_id2type(args->hdr,BCF_HL_INFO,info->key)) + { + case BCF_HT_INT: BRANCH_NUMERIC(int32, int32_t, vals[j]==bcf_int32_vector_end, vals[j]==bcf_int32_missing); break; + case BCF_HT_REAL: BRANCH_NUMERIC(float, float, bcf_float_is_vector_end(vals[j]), bcf_float_is_missing(vals[j])); break; + } + #undef BRANCH_NUMERIC +} +// Find n-th field in a comma-separated list and move it to dst. +// The memory areas may overlap. +#define STR_MOVE_NTH(dst,src,end,nth,len) \ +{ \ + char *ss = src, *se = src; \ + int j = 0; \ + while ( *se && se<(end) ) \ + { \ + if ( *se==',' ) \ + { \ + if ( j==nth ) break; \ + j++; \ + ss = se+1; \ + } \ + se++; \ + } \ + if ( j==nth ) \ + { \ + int n = se - ss; \ + memmove((dst),ss,n); \ + src = se; \ + len += n; \ + } \ + else len = -1; \ +} +static void split_info_string(args_t *args, bcf1_t *src, bcf_info_t *info, int ialt, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); + int ret = bcf_get_info_string(args->hdr,src,tag,&args->tmp_arr1,&args->ntmp_arr1); + assert( ret>0 ); + + kstring_t str; + str.m = args->ntmp_arr1; + str.l = ret; + str.s = (char*) args->tmp_arr1; + + int len = bcf_hdr_id2length(args->hdr,BCF_HL_INFO,info->key); + if ( len==BCF_VL_A ) + { + char *tmp = str.s; + int len = 0; + STR_MOVE_NTH(str.s,tmp,str.s+str.l,ialt,len); + if ( len<0 ) return; // wrong number of fields: skip + str.s[len] = 0; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else if ( len==BCF_VL_R ) + { + char *tmp = str.s; + int len = 0; + STR_MOVE_NTH(str.s,tmp,str.s+str.l,0,len); + str.s[len]=','; tmp++; len++; + STR_MOVE_NTH(&str.s[len],tmp,str.s+str.l,ialt,len); + if ( len<0 ) return; // wrong number of fields: skip + str.s[len] = 0; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else if ( len==BCF_VL_G ) + { + int i0a = bcf_alleles2gt(0,ialt+1), iaa = bcf_alleles2gt(ialt+1,ialt+1); + char *tmp = str.s; + int len = 0; + STR_MOVE_NTH(str.s,tmp,str.s+str.l,0,len); + str.s[len]=','; tmp++; len++; + STR_MOVE_NTH(&str.s[len],tmp,str.s+str.l,i0a-1,len); + if ( len<0 ) return; // wrong number of fields: skip + str.s[len]=','; tmp++; len++; + STR_MOVE_NTH(&str.s[len],tmp,str.s+str.l,iaa-i0a-1,len); + if ( len<0 ) return; // wrong number of fields: skip + str.s[len] = 0; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else + bcf_update_info_string(args->out_hdr,dst,tag,str.s); +} +static void split_info_flag(args_t *args, bcf1_t *src, bcf_info_t *info, int ialt, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); + int ret = bcf_get_info_flag(args->hdr,src,tag,&args->tmp_arr1,&args->ntmp_arr1); + bcf_update_info_flag(args->out_hdr,dst,tag,NULL,ret); +} + +static void split_format_genotype(args_t *args, bcf1_t *src, bcf_fmt_t *fmt, int ialt, bcf1_t *dst) +{ + int ntmp = args->ntmp_arr1 / 4; + int ngts = bcf_get_genotypes(args->hdr,src,&args->tmp_arr1,&ntmp); + args->ntmp_arr1 = ntmp * 4; + assert( ngts >0 ); + + int32_t *gt = (int32_t*) args->tmp_arr1; + int i, j, nsmpl = bcf_hdr_nsamples(args->hdr); + ngts /= nsmpl; + for (i=0; iout_hdr,dst,args->tmp_arr1,ngts*nsmpl); +} +static void split_format_numeric(args_t *args, bcf1_t *src, bcf_fmt_t *fmt, int ialt, bcf1_t *dst) +{ + #define BRANCH_NUMERIC(type,type_t,is_vector_end,is_missing,set_vector_end) \ + { \ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,fmt->id); \ + int ntmp = args->ntmp_arr1 / sizeof(type_t); \ + int nvals = bcf_get_format_##type(args->hdr,src,tag,&args->tmp_arr1,&ntmp); \ + args->ntmp_arr1 = ntmp * sizeof(type_t); \ + assert( nvals>0 ); \ + type_t *vals = (type_t *) args->tmp_arr1; \ + int len = bcf_hdr_id2length(args->hdr,BCF_HL_FMT,fmt->id); \ + int i,j, nsmpl = bcf_hdr_nsamples(args->hdr); \ + if ( nvals==nsmpl ) /* all values are missing */ \ + { \ + bcf_update_format_##type(args->out_hdr,dst,tag,vals,nsmpl); \ + return; \ + } \ + if ( len==BCF_VL_A ) \ + { \ + if ( nvals!=(src->n_allele-1)*nsmpl ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(bcftools_stderr, \ + "Warning: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d. Removing the field.\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,(src->n_allele-1)*nsmpl,nvals); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_format_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,(src->n_allele-1)*nsmpl,nvals); \ + } \ + nvals /= nsmpl; \ + type_t *src_vals = vals, *dst_vals = vals; \ + for (i=0; iout_hdr,dst,tag,vals,nsmpl); \ + } \ + else if ( len==BCF_VL_R ) \ + { \ + if ( nvals!=src->n_allele*nsmpl ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(bcftools_stderr, \ + "Warning: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d. Removing the field.\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,(src->n_allele-1)*nsmpl,nvals); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_format_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele*nsmpl,nvals); \ + } \ + nvals /= nsmpl; \ + type_t *src_vals = vals, *dst_vals = vals; \ + if ( args->keep_sum_ad >= 0 && args->keep_sum_ad==fmt->id ) \ + { \ + for (i=0; iout_hdr,dst,tag,vals,nsmpl*2); \ + } \ + else if ( len==BCF_VL_G ) \ + { \ + if ( nvals!=src->n_allele*(src->n_allele+1)/2*nsmpl && nvals!=src->n_allele*nsmpl ) \ + { \ + if ( args->force && !args->force_warned ) \ + { \ + fprintf(bcftools_stderr, \ + "Warning: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d, found %d. Removing the field.\n" \ + " (This warning is printed only once.)\n", \ + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,(src->n_allele-1)*nsmpl,nvals); \ + args->force_warned = 1; \ + } \ + if ( args->force ) \ + { \ + bcf_update_format_##type(args->out_hdr,dst,tag,NULL,0); \ + return; \ + } \ + error("Error at %s:%"PRId64", the tag %s has wrong number of fields\n", bcf_seqname(args->hdr,src),(int64_t) src->pos+1,bcf_hdr_int2id(args->hdr,BCF_DT_ID,fmt->id)); \ + } \ + nvals /= nsmpl; \ + int all_haploid = nvals==src->n_allele ? 1 : 0; \ + type_t *src_vals = vals, *dst_vals = vals; \ + for (i=0; iout_hdr,dst,tag,vals,all_haploid ? nsmpl*2 : nsmpl*3); \ + } \ + else \ + bcf_update_format_##type(args->out_hdr,dst,tag,vals,nvals); \ + } + switch (bcf_hdr_id2type(args->hdr,BCF_HL_FMT,fmt->id)) + { + case BCF_HT_INT: BRANCH_NUMERIC(int32, int32_t, src_vals[j]==bcf_int32_vector_end, src_vals[j]==bcf_int32_missing, dst_vals[2]=bcf_int32_vector_end); break; + case BCF_HT_REAL: BRANCH_NUMERIC(float, float, bcf_float_is_vector_end(src_vals[j]), bcf_float_is_missing(src_vals[j]), bcf_float_set_vector_end(dst_vals[2])); break; + } + #undef BRANCH_NUMERIC +} +static void squeeze_format_char(char *str, int src_blen, int dst_blen, int n) +{ + int i, isrc = 0, idst = 0; + for (i=0; ihdr,BCF_DT_ID,fmt->id); + int ret = bcf_get_format_char(args->hdr,src,tag,&args->tmp_arr1,&args->ntmp_arr1); + if ( !ret ) return; // all values can be empty, leave out the tag, no need to panic + assert( ret>0 ); + + kstring_t str; + str.m = args->ntmp_arr1; + str.l = ret; + str.s = (char*) args->tmp_arr1; + + int nsmpl = bcf_hdr_nsamples(args->hdr); + int len = bcf_hdr_id2length(args->hdr,BCF_HL_FMT,fmt->id); + if ( len==BCF_VL_A ) + { + int i, blen = ret/nsmpl, maxlen = 0; + char *ptr = str.s; + for (i=0; iout_hdr,dst,tag,str.s,nsmpl*maxlen); + } + else if ( len==BCF_VL_R ) + { + int i, blen = ret/nsmpl, maxlen = 0; + char *ptr = str.s; + for (i=0; iout_hdr,dst,tag,str.s,nsmpl*maxlen); + } + else if ( len==BCF_VL_G ) + { + int i, blen = ret/nsmpl, maxlen = 0, i0a = bcf_alleles2gt(0,ialt+1), iaa = bcf_alleles2gt(ialt+1,ialt+1); + char *ptr = str.s; + for (i=0; in_allele*(src->n_allele+1)/2 && nfields!=src->n_allele ) + { + if ( args->force && !args->force_warned ) + { + fprintf(bcftools_stderr, + "Warning: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d or %d, found %d. Removing the field.\n" + " (This warning is printed only once.)\n", + tag,bcf_seqname(args->hdr,src),(int64_t)src->pos+1,src->n_allele*(src->n_allele+1)/2,src->n_allele,nfields); + args->force_warned = 1; + } + if ( args->force ) + { + bcf_update_format_char(args->out_hdr,dst,tag,NULL,0); + return; + } + error("Error: wrong number of fields in FMT/%s at %s:%"PRId64", expected %d or %d, found %d\n", + tag,bcf_seqname(args->hdr,src),(int64_t) src->pos+1,src->n_allele*(src->n_allele+1)/2,src->n_allele,nfields); + } + + int len = 0; + if ( nfields==src->n_allele ) // haploid + { + char *tmp = ptr; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,0,len); + ptr[len]=','; tmp++; len++; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,ialt,len); + if ( len<0 ) return; // wrong number of fields: skip + } + else // diploid + { + char *tmp = ptr; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,0,len); + ptr[len]=','; tmp++; len++; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,i0a-1,len); + if ( len<0 ) return; // wrong number of fields: skip + ptr[len]=','; tmp++; len++; + STR_MOVE_NTH(&ptr[len],tmp,ptr+blen,iaa-i0a-1,len); + if ( len<0 ) return; // wrong number of fields: skip + } + if ( maxlen < len ) maxlen = len; + ptr += blen; + } + if ( maxlenout_hdr,dst,tag,str.s,nsmpl*maxlen); + } + else + bcf_update_format_char(args->out_hdr,dst,tag,str.s,str.l); +} + +static void split_multiallelic_to_biallelics(args_t *args, bcf1_t *line) +{ + int i; + + bcf_unpack(line, BCF_UN_ALL); + + // Init the target biallelic lines + args->ntmp_lines = line->n_allele-1; + if ( args->mtmp_lines < args->ntmp_lines ) + { + args->tmp_lines = (bcf1_t **)realloc(args->tmp_lines,sizeof(bcf1_t*)*args->ntmp_lines); + for (i=args->mtmp_lines; intmp_lines; i++) + args->tmp_lines[i] = NULL; + args->mtmp_lines = args->ntmp_lines; + } + kstring_t tmp = {0,0,0}; + kputs(line->d.allele[0], &tmp); + kputc(',', &tmp); + int rlen = tmp.l; + int gt_id = bcf_hdr_id2int(args->hdr,BCF_DT_ID,"GT"); + for (i=0; intmp_lines; i++) // for each ALT allele + { + if ( !args->tmp_lines[i] ) args->tmp_lines[i] = bcf_init1(); + bcf1_t *dst = args->tmp_lines[i]; + bcf_clear(dst); + + dst->rid = line->rid; + dst->pos = line->pos; + dst->qual = line->qual; + + // Not quite sure how to handle IDs, they can be assigned to a specific + // ALT. For now we leave the ID unchanged for all. + bcf_update_id(args->out_hdr, dst, line->d.id ? line->d.id : "."); + + tmp.l = rlen; + kputs(line->d.allele[i+1],&tmp); + bcf_update_alleles_str(args->out_hdr,dst,tmp.s); + + if ( line->d.n_flt ) bcf_update_filter(args->hdr, dst, line->d.flt, line->d.n_flt); + + int j; + for (j=0; jn_info; j++) + { + bcf_info_t *info = &line->d.info[j]; + int type = bcf_hdr_id2type(args->hdr,BCF_HL_INFO,info->key); + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) split_info_numeric(args, line, info, i, dst); + else if ( type==BCF_HT_FLAG ) split_info_flag(args, line, info, i, dst); + else split_info_string(args, line, info, i, dst); + } + set_old_rec_tag(args, dst, line, i + 1); // 1-based indexes + + dst->n_sample = line->n_sample; + for (j=0; jn_fmt; j++) + { + bcf_fmt_t *fmt = &line->d.fmt[j]; + int type = bcf_hdr_id2type(args->hdr,BCF_HL_FMT,fmt->id); + if ( fmt->id==gt_id ) split_format_genotype(args, line, fmt, i, dst); + else if ( type==BCF_HT_INT || type==BCF_HT_REAL ) split_format_numeric(args, line, fmt, i, dst); + else split_format_string(args, line, fmt, i, dst); + } + } + free(tmp.s); +} + +// Enlarge FORMAT array containing nsmpl samples each with nals_ori values +// to accommodate nvals values for each sample, filling the gaps with missing +// values. Works also for INFO arrays, with nsmpl set to 1. +#define ENLARGE_ARRAY(type_t,set_missing,arr,narr_bytes,nsmpl,nvals_ori,nvals) \ +{ \ + int nbytes_new = (nsmpl)*(nvals)*sizeof(type_t); \ + hts_expand(uint8_t,nbytes_new,narr_bytes,arr); \ + int ismpl, k; \ + for (ismpl=nsmpl-1; ismpl>=0; ismpl--) \ + { \ + type_t *dst_ptr = ((type_t*)arr) + ismpl*(nvals); \ + type_t *src_ptr = ((type_t*)arr) + ismpl*nvals_ori; \ + memmove(dst_ptr,src_ptr,sizeof(type_t)*nvals_ori); \ + for (k=nvals_ori; khdr,BCF_DT_ID,info->key); \ + int ntmp = args->ntmp_arr1 / sizeof(type_t); \ + int nvals_ori = bcf_get_info_##type(args->hdr,lines[0],tag,&args->tmp_arr1,&ntmp); \ + args->ntmp_arr1 = ntmp * sizeof(type_t); \ + assert( nvals_ori>0 ); \ + type_t *vals = (type_t*) args->tmp_arr1, *vals2; \ + int i,k,len = bcf_hdr_id2length(args->hdr,BCF_HL_INFO,info->key); \ + if ( len==BCF_VL_A ) \ + { \ + if (nvals_ori!=lines[0]->n_allele - 1) \ + error("vcfnorm: number of fields in first record at position %s:%"PRId64" for INFO tag %s not as expected [found: %d vs expected:%d]\n", bcf_seqname(args->hdr,lines[0]),(int64_t) lines[0]->pos+1, tag, nvals_ori, lines[0]->n_allele-1); \ + int nvals = dst->n_allele - 1; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,1,nvals_ori,nvals); \ + vals = (type_t*) args->tmp_arr1; \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_info_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* info tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + if (nvals2!=lines[i]->n_allele-1) \ + error("vcfnorm: could not merge INFO tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals2 = (type_t*) args->tmp_arr2; \ + for (k=0; kmaps[i].map[k+1] - 1 ] = vals2[k]; \ + } \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals); \ + } \ + else if ( len==BCF_VL_R ) \ + { \ + if (nvals_ori!=lines[0]->n_allele) \ + error("vcfnorm: number of fields in first record at position %s:%"PRId64" for INFO tag %s not as expected [found: %d vs expected:%d]\n", bcf_seqname(args->hdr,lines[0]),(int64_t) lines[0]->pos+1, tag, nvals_ori, lines[0]->n_allele); \ + int nvals = dst->n_allele; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,1,nvals_ori,nvals); \ + vals = (type_t*) args->tmp_arr1; \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_info_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* info tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + if (nvals2!=lines[i]->n_allele) \ + error("vcfnorm: could not merge INFO tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals2 = (type_t*) args->tmp_arr2; \ + for (k=0; kmaps[i].map[k] ] = vals2[k]; \ + } \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals); \ + } \ + else if ( len==BCF_VL_G ) \ + { \ + /* expecting diploid gt in INFO */ \ + if (nvals_ori!=lines[0]->n_allele*(lines[0]->n_allele+1)/2) { \ + fprintf(bcftools_stderr, "todo: merge Number=G INFO fields for haploid sites\n"); \ + error("vcfnorm: number of fields in first record at position %s:%"PRId64" for INFO tag %s not as expected [found: %d vs expected:%d]\n", bcf_seqname(args->hdr,lines[0]),(int64_t) lines[0]->pos+1, tag, nvals_ori, lines[0]->n_allele*(lines[0]->n_allele+1)/2); \ + } \ + int nvals = dst->n_allele*(dst->n_allele+1)/2; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,1,nvals_ori,nvals); \ + vals = (type_t*) args->tmp_arr1; \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_info_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* info tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + if (nvals2!=lines[i]->n_allele*(lines[i]->n_allele+1)/2) \ + error("vcfnorm: could not merge INFO tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals2 = (type_t*) args->tmp_arr2; \ + int ia,ib; \ + k = 0; \ + for (ia=0; ian_allele; ia++) \ + { \ + for (ib=0; ib<=ia; ib++) \ + { \ + if ( is_vector_end ) break; \ + int l = bcf_alleles2gt(args->maps[i].map[ia],args->maps[i].map[ib]); \ + vals[l] = vals2[k]; \ + k++; \ + } \ + } \ + } \ + bcf_update_info_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals); \ + } \ + else \ + bcf_update_info_##type(args->out_hdr,dst,tag,vals,nvals_ori); \ + } + switch (bcf_hdr_id2type(args->hdr,BCF_HL_INFO,info->key)) + { + case BCF_HT_INT: BRANCH_NUMERIC(int32, int32_t, dst_ptr[k]=bcf_int32_missing, vals2[k]==bcf_int32_vector_end); break; + case BCF_HT_REAL: BRANCH_NUMERIC(float, float, bcf_float_set_missing(dst_ptr[k]), bcf_float_is_vector_end(vals2[k])); break; + } + #undef BRANCH_NUMERIC +} +static void merge_info_flag(args_t *args, bcf1_t **lines, int nlines, bcf_info_t *info, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); + int ret = bcf_get_info_flag(args->hdr,lines[0],tag,&args->tmp_arr1,&args->ntmp_arr1); + bcf_update_info_flag(args->out_hdr,dst,tag,NULL,ret); +} +int copy_string_field(char *src, int isrc, int src_len, kstring_t *dst, int idst); // see vcfmerge.c +static void merge_info_string(args_t *args, bcf1_t **lines, int nlines, bcf_info_t *info, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,info->key); + + kstring_t str; + str.m = args->ntmp_arr1; + str.l = 0; + str.s = (char*) args->tmp_arr1; + + int i, j, len = bcf_hdr_id2length(args->hdr,BCF_HL_INFO,info->key); + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int jfrom = len==BCF_VL_A ? 1 : 0; + kputc('.',&str); + for (i=jfrom+1; in_allele; i++) kputs(",.",&str); + for (i=0; ihdr,lines[i],tag); + if (!src) continue; + for (j=jfrom; jn_allele; j++) + copy_string_field((char*)src->vptr, j-jfrom, src->len, &str, args->maps[i].map[j]-jfrom); + } + str.s[str.l] = 0; + args->tmp_arr1 = (uint8_t*) str.s; + args->ntmp_arr1 = str.m; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else if ( len==BCF_VL_G ) + { + int ngts = dst->n_allele*(dst->n_allele+1)/2; + kputc('.',&str); + for (i=1; ihdr,lines[i],tag); + if (!src) continue; + int iori, jori, kori = 0; + for (iori=0; iorin_allele; iori++) + { + int inew = args->maps[i].map[iori]; + for (jori=0; jori<=iori; jori++) + { + int jnew = args->maps[i].map[jori]; + int knew = bcf_alleles2gt(inew,jnew); + copy_string_field((char*)src->vptr,kori,src->len,&str,knew); + kori++; + } + } + } + str.s[str.l] = 0; + args->tmp_arr1 = (uint8_t*) str.s; + args->ntmp_arr1 = str.m; + bcf_update_info_string(args->out_hdr,dst,tag,str.s); + } + else + { + bcf_get_info_string(args->hdr,lines[0],tag,&args->tmp_arr1,&args->ntmp_arr1); + bcf_update_info_string(args->out_hdr,dst,tag,args->tmp_arr1); + } +} +static void merge_format_genotype(args_t *args, bcf1_t **lines, int nlines, bcf_fmt_t *fmt, bcf1_t *dst) +{ + // reusing int8_t arrays as int32_t arrays + int ntmp = args->ntmp_arr1 / 4; + int ngts = bcf_get_genotypes(args->hdr,lines[0],&args->tmp_arr1,&ntmp); + args->ntmp_arr1 = ntmp * 4; + assert( ngts >0 ); + + int nsmpl = bcf_hdr_nsamples(args->hdr); + ngts /= nsmpl; + + int i, j, k,k2; + for (i=1; intmp_arr2 / 4; + int ngts2 = bcf_get_genotypes(args->hdr,lines[i],&args->tmp_arr2,&ntmp2); + args->ntmp_arr2 = ntmp2 * 4; + ngts2 /= nsmpl; + if ( ngts!=ngts2 ) error("Error at %s:%"PRId64": cannot combine diploid with haploid genotype\n", bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); + + int32_t *gt = (int32_t*) args->tmp_arr1; + int32_t *gt2 = (int32_t*) args->tmp_arr2; + for (j=0; j=args->maps[i].nals ) error("Error at %s:%"PRId64": incorrect allele index %d\n",bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1,ial2); + int ial = args->maps[i].map[ial2]; + for (k=0; kout_hdr,dst,args->tmp_arr1,ngts*nsmpl); +} +static int diploid_to_haploid(int size, int nsmpl, int nals, uint8_t *vals) +{ + int i, dsrc = size*nals*(nals+1)/2, ddst = size*nals; + uint8_t *src_ptr = vals + dsrc, *dst_ptr = vals + ddst; + for (i=1; ihdr,BCF_DT_ID,fmt->id); \ + int ntmp = args->ntmp_arr1 / sizeof(type_t); \ + int nvals_ori = bcf_get_format_##type(args->hdr,lines[0],tag,&args->tmp_arr1,&ntmp); \ + args->ntmp_arr1 = ntmp * sizeof(type_t); \ + assert( nvals_ori>0 ); \ + type_t *vals2, *vals = (type_t *) args->tmp_arr1; \ + int len = bcf_hdr_id2length(args->hdr,BCF_HL_FMT,fmt->id); \ + int i, j, k, nsmpl = bcf_hdr_nsamples(args->hdr); \ + nvals_ori /= nsmpl; \ + if ( len==BCF_VL_A ) \ + { \ + int nvals = dst->n_allele - 1; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,nsmpl,nvals_ori,nvals); \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_format_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* format tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + nvals2 /= nsmpl; \ + if (nvals2!=lines[i]->n_allele-1) \ + error("vcfnorm: could not merge FORMAT tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals = (type_t*) args->tmp_arr1; \ + vals2 = (type_t*) args->tmp_arr2; \ + for (j=0; jmaps[i].map[k+1] - 1 ] = vals2[k]; \ + } \ + vals += nvals; \ + vals2 += nvals2; \ + } \ + } \ + bcf_update_format_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals*nsmpl); \ + } \ + else if ( len==BCF_VL_R ) \ + { \ + int nvals = dst->n_allele; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,nsmpl,nvals_ori,nvals); \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_format_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* format tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + nvals2 /= nsmpl; \ + if (nvals2!=lines[i]->n_allele) \ + error("vcfnorm: could not merge FORMAT tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals = (type_t*) args->tmp_arr1; \ + vals2 = (type_t*) args->tmp_arr2; \ + for (j=0; jmaps[i].map[k] ] = vals2[k]; \ + } \ + vals += nvals; \ + vals2 += nvals2; \ + } \ + } \ + bcf_update_format_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals*nsmpl); \ + } \ + else if ( len==BCF_VL_G ) \ + { \ + /* which samples are diploid */ \ + memset(args->diploid,0,nsmpl); \ + int all_haploid = 1; \ + if ( nvals_ori > lines[0]->n_allele ) /* line possibly diploid */ \ + { \ + vals2 = (type_t*) args->tmp_arr1; \ + int ndiploid = lines[0]->n_allele*(lines[0]->n_allele+1)/2; \ + for (i=0; idiploid[i] ) \ + { \ + for (k=0; kdiploid[i] = 1; all_haploid = 0; }\ + } \ + vals2 += nvals_ori; \ + } \ + } \ + int nvals = dst->n_allele*(dst->n_allele+1)/2; \ + ENLARGE_ARRAY(type_t,set_missing,args->tmp_arr1,args->ntmp_arr1,nsmpl,nvals_ori,nvals); \ + for (i=1; intmp_arr2 / sizeof(type_t); \ + int nvals2 = bcf_get_format_##type(args->hdr,lines[i],tag,&args->tmp_arr2,&ntmp2); \ + if (nvals2<0) continue; /* format tag does not exist in this record, skip */ \ + args->ntmp_arr2 = ntmp2 * sizeof(type_t); \ + nvals2 /= nsmpl; \ + int ndiploid = lines[i]->n_allele*(lines[i]->n_allele+1)/2; \ + int line_diploid = nvals2==ndiploid ? 1 : 0; \ + if (!(nvals2==1 || nvals2==lines[i]->n_allele || nvals2==lines[i]->n_allele*(lines[i]->n_allele+1)/2)) \ + error("vcfnorm: could not merge FORMAT tag %s at position %s:%"PRId64"\n", tag, bcf_seqname(args->hdr,lines[i]),(int64_t) lines[i]->pos+1); \ + vals = (type_t*) args->tmp_arr1; \ + vals2 = (type_t*) args->tmp_arr2; \ + for (j=0; jdiploid[j] ) { args->diploid[j] = 1; all_haploid = 0; } \ + if ( !smpl_diploid ) \ + { \ + for (k=0; kn_allele; k++) vals[args->maps[i].map[k]] = vals2[k]; \ + } \ + else \ + { \ + k = 0; \ + int ia,ib; \ + for (ia=0; ian_allele; ia++) \ + { \ + for (ib=0; ib<=ia; ib++) \ + { \ + int l = bcf_alleles2gt(args->maps[i].map[ia],args->maps[i].map[ib]); \ + vals[l] = vals2[k]; \ + k++; \ + } \ + } \ + } \ + vals += nvals; \ + vals2 += nvals2; \ + } \ + } \ + if ( all_haploid ) \ + nvals = diploid_to_haploid(sizeof(type_t),nsmpl,dst->n_allele,args->tmp_arr1); \ + else \ + {\ + k = dst->n_allele;\ + vals2 = (type_t*) args->tmp_arr1;\ + for (i=0; idiploid[i] ) set_vector_end;\ + vals2 += nvals;\ + }\ + }\ + bcf_update_format_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals*nsmpl); \ + } \ + else \ + bcf_update_format_##type(args->out_hdr,dst,tag,args->tmp_arr1,nvals_ori*nsmpl); \ + } + switch (bcf_hdr_id2type(args->hdr,BCF_HL_FMT,fmt->id)) + { + case BCF_HT_INT: BRANCH_NUMERIC(int32, int32_t, dst_ptr[k]=bcf_int32_missing, vals2[k]==bcf_int32_vector_end, vals2[k]=bcf_int32_vector_end); break; + case BCF_HT_REAL: BRANCH_NUMERIC(float, float, bcf_float_set_missing(dst_ptr[k]), bcf_float_is_vector_end(vals2[k]), bcf_float_set_vector_end(vals2[k])); break; + } + #undef BRANCH_NUMERIC +} +static void merge_format_string(args_t *args, bcf1_t **lines, int nlines, bcf_fmt_t *fmt, bcf1_t *dst) +{ + const char *tag = bcf_hdr_int2id(args->hdr,BCF_DT_ID,fmt->id); + + int i, j, k, len = bcf_hdr_id2length(args->hdr,BCF_HL_FMT,fmt->id); + if ( len!=BCF_VL_A && len!=BCF_VL_R && len!=BCF_VL_G ) + { + int nret = bcf_get_format_char(args->hdr,lines[0],tag,&args->tmp_arr1,&args->ntmp_arr1); + bcf_update_format_char(args->out_hdr,dst,tag,args->tmp_arr1,nret); + return; + } + + int nsmpl = bcf_hdr_nsamples(args->hdr); + for (i=0; itmp_str[i].l = 0; + + if ( len==BCF_VL_A || len==BCF_VL_R ) + { + int jfrom = len==BCF_VL_A ? 1 : 0; + for (i=0; itmp_str[i]; + kputc('.',tmp); + for (k=jfrom+1; kn_allele; k++) kputs(",.",tmp); + } + for (i=0; ihdr,lines[i],tag,&args->tmp_arr1,&args->ntmp_arr1); + if (nret<0) continue; /* format tag does not exist in this record, skip */ + nret /= nsmpl; + for (k=0; ktmp_str[k]; + char *src = (char*)args->tmp_arr1 + k*nret; + for (j=jfrom; jn_allele; j++) + copy_string_field(src, j-jfrom, nret, tmp, args->maps[i].map[j]-jfrom); + } + } + } + else if ( len==BCF_VL_G ) + { + hts_expand(uint8_t,nsmpl,args->ntmp_arr2,args->tmp_arr2); + uint8_t *haploid = args->tmp_arr2; + int nret = bcf_get_format_char(args->hdr,lines[0],tag,&args->tmp_arr1,&args->ntmp_arr1); + nret /= nsmpl; + for (i=0; itmp_arr1 + i*nret, *se = ss+nret; + int nfields = 1; + while ( *ss && ssn_allele ) + { + haploid[i] = 1; + nfields = dst->n_allele; + } + else if ( nfields==lines[0]->n_allele*(lines[0]->n_allele+1)/2 ) + { + haploid[i] = 0; + nfields = dst->n_allele*(dst->n_allele+1)/2; + } + else error("The field %s at %s:%"PRId64" neither diploid nor haploid?\n", tag,bcf_seqname(args->hdr,dst),(int64_t) dst->pos+1); + + kstring_t *tmp = &args->tmp_str[i]; + kputc('.',tmp); + for (j=1; jhdr,lines[i],tag,&args->tmp_arr1,&args->ntmp_arr1); + if (nret<0) continue; /* format tag does not exist in this record, skip */ + nret /= nsmpl; + } + for (k=0; ktmp_str[k]; + char *src = (char*)args->tmp_arr1 + k*nret; + if ( haploid[k] ) + { + for (j=0; jn_allele; j++) + copy_string_field(src,j,nret, tmp, args->maps[i].map[j]); + } + else + { + int iori, jori, kori = 0; + for (iori=0; iorin_allele; iori++) + { + int inew = args->maps[i].map[iori]; + for (jori=0; jori<=iori; jori++) + { + int jnew = args->maps[i].map[jori]; + int knew = bcf_alleles2gt(inew,jnew); + copy_string_field(src,kori,nret,tmp,knew); + kori++; + } + } + } + } + } + } + kstring_t str; + str.m = args->ntmp_arr2; + str.l = 0; + str.s = (char*) args->tmp_arr2; + + int max_len = 0; + for (i=0; itmp_str[i].l ) max_len = args->tmp_str[i].l; + for (i=0; itmp_str[i]; + kputsn(tmp->s,tmp->l,&str); + for (j=tmp->l; jntmp_arr2 = str.m; + args->tmp_arr2 = (uint8_t*)str.s; + bcf_update_format_char(args->out_hdr,dst,tag,str.s,str.l); +} + +char **merge_alleles(char **a, int na, int *map, char **b, int *nb, int *mb); // see vcfmerge.c +static void merge_biallelics_to_multiallelic(args_t *args, bcf1_t *dst, bcf1_t **lines, int nlines) +{ + int i; + for (i=0; irid = lines[0]->rid; + dst->pos = lines[0]->pos; + + // take max for QUAL + bcf_float_set_missing(dst->qual); + for (i=0; iqual)) continue; + if (bcf_float_is_missing(dst->qual) || dst->qualqual) + dst->qual = lines[i]->qual; + } + + bcf_update_id(args->out_hdr, dst, lines[0]->d.id); + + // Merge and set the alleles, create a mapping from source allele indexes to dst idxs + hts_expand0(map_t,nlines,args->mmaps,args->maps); // a mapping for each line + args->nals = args->maps[0].nals = lines[0]->n_allele; + hts_expand(int,args->maps[0].nals,args->maps[0].mals,args->maps[0].map); + hts_expand(char*,args->nals,args->mals,args->als); + for (i=0; imaps[0].nals; i++) + { + args->maps[0].map[i] = i; + args->als[i] = strdup(lines[0]->d.allele[i]); + } + for (i=1; id.id[0]!='.' || lines[i]->d.id[1]) bcf_add_id(args->out_hdr, dst, lines[i]->d.id); + args->maps[i].nals = lines[i]->n_allele; + hts_expand(int,args->maps[i].nals,args->maps[i].mals,args->maps[i].map); + args->als = merge_alleles(lines[i]->d.allele, lines[i]->n_allele, args->maps[i].map, args->als, &args->nals, &args->mals); + if ( !args->als ) error("Failed to merge alleles at %s:%"PRId64"\n", bcf_seqname(args->hdr,dst),(int64_t) dst->pos+1); + } + bcf_update_alleles(args->out_hdr, dst, (const char**)args->als, args->nals); + for (i=0; inals; i++) + { + free(args->als[i]); + args->als[i] = NULL; + } + + if ( lines[0]->d.n_flt ) bcf_update_filter(args->out_hdr, dst, lines[0]->d.flt, lines[0]->d.n_flt); + for (i=1; id.n_flt; j++) { + // if strict_filter, set FILTER to PASS if any site PASS + // otherwise accumulate FILTERs + if (lines[i]->d.flt[j] == bcf_hdr_id2int(args->hdr, BCF_DT_ID, "PASS")) { + if (args->strict_filter) { + bcf_update_filter(args->out_hdr, dst, lines[i]->d.flt, lines[i]->d.n_flt); + break; + } + else + continue; + } + bcf_add_filter(args->out_hdr, dst, lines[i]->d.flt[j]); + } + } + + // merge info + for (i=0; in_info; i++) + { + bcf_info_t *info = &lines[0]->d.info[i]; + int type = bcf_hdr_id2type(args->hdr,BCF_HL_INFO,info->key); + if ( type==BCF_HT_INT || type==BCF_HT_REAL ) merge_info_numeric(args, lines, nlines, info, dst); + else if ( type==BCF_HT_FLAG ) merge_info_flag(args, lines, nlines, info, dst); + else merge_info_string(args, lines, nlines, info, dst); + } + + // merge format + int gt_id = bcf_hdr_id2int(args->hdr,BCF_DT_ID,"GT"); + dst->n_sample = lines[0]->n_sample; + for (i=0; in_fmt; i++) + { + bcf_fmt_t *fmt = &lines[0]->d.fmt[i]; + int type = bcf_hdr_id2type(args->hdr,BCF_HL_FMT,fmt->id); + if ( fmt->id==gt_id ) merge_format_genotype(args, lines, nlines, fmt, dst); + else if ( type==BCF_HT_INT || type==BCF_HT_REAL ) merge_format_numeric(args, lines, nlines, fmt, dst); + else merge_format_string(args, lines, nlines, fmt, dst); + } +} + +#define SWAP(type_t, a, b) { type_t t = a; a = b; b = t; } +static void mrows_schedule(args_t *args, bcf1_t **line) +{ + int i,m; + if ( args->mrows_collapse==COLLAPSE_ANY // merge all record types together + || bcf_get_variant_types(*line)&VCF_SNP // SNP, put into alines + || bcf_get_variant_types(*line)==VCF_REF ) // ref + { + args->nalines++; + m = args->malines; + hts_expand(bcf1_t*,args->nalines,args->malines,args->alines); + for (i=m; imalines; i++) args->alines[i] = bcf_init1(); + SWAP(bcf1_t*, args->alines[args->nalines-1], *line); + } + else + { + args->nblines++; + m = args->mblines; + hts_expand(bcf1_t*,args->nblines,args->mblines,args->blines); + for (i=m; imblines; i++) args->blines[i] = bcf_init1(); + SWAP(bcf1_t*, args->blines[args->nblines-1], *line); + } +} +static int mrows_ready_to_flush(args_t *args, bcf1_t *line) +{ + if ( args->nalines && (args->alines[0]->rid!=line->rid || args->alines[0]->pos!=line->pos) ) return 1; + if ( args->nblines && (args->blines[0]->rid!=line->rid || args->blines[0]->pos!=line->pos) ) return 1; + return 0; +} +static bcf1_t *mrows_flush(args_t *args) +{ + if ( args->nblines && args->nalines==1 && bcf_get_variant_types(args->alines[0])==VCF_REF ) + { + // By default, REF lines are merged with SNPs if SNPs and indels are to be kept separately. + // However, if there are indels only and a single REF line, merge it with indels. + args->nblines++; + int i,m = args->mblines; + hts_expand(bcf1_t*,args->nblines,args->mblines,args->blines); + for (i=m; imblines; i++) args->blines[i] = bcf_init1(); + SWAP(bcf1_t*, args->blines[args->nblines-1], args->alines[0]); + args->nalines--; + } + if ( args->nalines ) + { + if ( args->nalines==1 ) + { + args->nalines = 0; + return args->alines[0]; + } + bcf_clear(args->mrow_out); + merge_biallelics_to_multiallelic(args, args->mrow_out, args->alines, args->nalines); + args->nalines = 0; + return args->mrow_out; + } + else if ( args->nblines ) + { + if ( args->nblines==1 ) + { + args->nblines = 0; + return args->blines[0]; + } + bcf_clear(args->mrow_out); + merge_biallelics_to_multiallelic(args, args->mrow_out, args->blines, args->nblines); + args->nblines = 0; + return args->mrow_out; + } + return NULL; +} +static void cmpals_add(cmpals_t *ca, bcf1_t *rec) +{ + ca->ncmpals++; + hts_expand0(cmpals1_t, ca->ncmpals, ca->mcmpals, ca->cmpals); + cmpals1_t *cmpals = ca->cmpals + ca->ncmpals - 1; + free(cmpals->ref); + cmpals->ref = strdup(rec->d.allele[0]); + cmpals->n = rec->n_allele; + if ( rec->n_allele==2 ) + { + free(cmpals->alt); + cmpals->alt = strdup(rec->d.allele[1]); + } + else + { + if ( cmpals->hash ) khash_str2int_destroy_free(cmpals->hash); + cmpals->hash = khash_str2int_init(); + int i; + for (i=1; in_allele; i++) + khash_str2int_inc(cmpals->hash, strdup(rec->d.allele[i])); + } +} +static int cmpals_match(cmpals_t *ca, bcf1_t *rec) +{ + int i, j; + for (i=0; incmpals; i++) + { + cmpals1_t *cmpals = ca->cmpals + i; + if ( rec->n_allele != cmpals->n ) continue; + + // NB. assuming both are normalized + if ( strcasecmp(rec->d.allele[0], cmpals->ref) ) continue; + + // the most frequent case + if ( rec->n_allele==2 ) + { + if ( strcasecmp(rec->d.allele[1], cmpals->alt) ) continue; + return 1; + } + + khash_t(str2int) *hash = (khash_t(str2int)*) cmpals->hash; + for (j=1; jn_allele; j++) + if ( !khash_str2int_has_key(hash, rec->d.allele[j]) ) break; + if ( jn_allele ) continue; + return 1; + } + return 0; +} +static void cmpals_reset(cmpals_t *ca) { ca->ncmpals = 0; } +static void cmpals_destroy(cmpals_t *ca) +{ + int i; + for (i=0; imcmpals; i++) + { + cmpals1_t *cmpals = ca->cmpals + i; + free(cmpals->ref); + free(cmpals->alt); + if ( cmpals->hash ) khash_str2int_destroy_free(cmpals->hash); + } + free(ca->cmpals); +} + +static void flush_buffer(args_t *args, htsFile *file, int n) +{ + bcf1_t *line; + int i, k; + int prev_rid = -1, prev_pos = -1, prev_type = 0; + for (i=0; irbuf); + if ( args->mrows_op==MROWS_MERGE ) + { + if ( mrows_ready_to_flush(args, args->lines[k]) ) + { + while ( (line=mrows_flush(args)) ) + if ( bcf_write1(file, args->out_hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } + int merge = 1; + if ( args->mrows_collapse!=COLLAPSE_BOTH && args->mrows_collapse!=COLLAPSE_ANY ) + { + if ( !(bcf_get_variant_types(args->lines[k]) & args->mrows_collapse) ) merge = 0; + } + if ( merge ) + { + mrows_schedule(args, &args->lines[k]); + continue; + } + } + else if ( args->rmdup ) + { + int line_type = bcf_get_variant_types(args->lines[k]); + if ( prev_rid>=0 && prev_rid==args->lines[k]->rid && prev_pos==args->lines[k]->pos ) + { + if ( args->rmdup & BCF_SR_PAIR_ANY ) continue; // rmdup by position only + if ( args->rmdup & BCF_SR_PAIR_SNPS && line_type&(VCF_SNP|VCF_MNP) && prev_type&(VCF_SNP|VCF_MNP) ) continue; + if ( args->rmdup & BCF_SR_PAIR_INDELS && line_type&(VCF_INDEL) && prev_type&(VCF_INDEL) ) continue; + if ( args->rmdup & BCF_SR_PAIR_EXACT && cmpals_match(&args->cmpals_out, args->lines[k]) ) continue; + } + else + { + prev_rid = args->lines[k]->rid; + prev_pos = args->lines[k]->pos; + prev_type = 0; + if ( args->rmdup & BCF_SR_PAIR_EXACT ) cmpals_reset(&args->cmpals_out); + } + prev_type |= line_type; + if ( args->rmdup & BCF_SR_PAIR_EXACT ) cmpals_add(&args->cmpals_out, args->lines[k]); + } + if ( bcf_write1(file, args->out_hdr, args->lines[k])!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } + if ( args->mrows_op==MROWS_MERGE && !args->rbuf.n ) + { + while ( (line=mrows_flush(args)) ) + if ( bcf_write1(file, args->out_hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } +} + +static void init_data(args_t *args) +{ + args->hdr = args->files->readers[0].header; + if ( args->keep_sum_ad ) + { + args->keep_sum_ad = bcf_hdr_id2int(args->hdr,BCF_DT_ID,"AD"); + if ( args->keep_sum_ad < 0 ) error("Error: --keep-sum-ad requested but the tag AD is not present\n"); + } + else + args->keep_sum_ad = -1; + + args->out_hdr = bcf_hdr_dup(args->hdr); + if ( args->old_rec_tag ) + bcf_hdr_printf(args->out_hdr,"##INFO=",args->old_rec_tag); + + rbuf_init(&args->rbuf, 100); + args->lines = (bcf1_t**) calloc(args->rbuf.m, sizeof(bcf1_t*)); + if ( args->ref_fname ) + { + args->fai = fai_load(args->ref_fname); + if ( !args->fai ) error("Failed to load the fai index: %s\n", args->ref_fname); + } + if ( args->mrows_op==MROWS_MERGE ) + { + args->mrow_out = bcf_init1(); + args->tmp_str = (kstring_t*) calloc(bcf_hdr_nsamples(args->hdr),sizeof(kstring_t)); + args->diploid = (uint8_t*) malloc(bcf_hdr_nsamples(args->hdr)); + } + if ( args->atomize==SPLIT ) + { + args->abuf = abuf_init(args->hdr, SPLIT); + abuf_set_opt(args->abuf, bcf_hdr_t*, BCF_HDR, args->out_hdr); + if ( args->old_rec_tag ) + abuf_set_opt(args->abuf, const char*, INFO_TAG, args->old_rec_tag); + abuf_set_opt(args->abuf, int, STAR_ALLELE, args->use_star_allele); + } +} + +static void destroy_data(args_t *args) +{ + cmpals_destroy(&args->cmpals_in); + cmpals_destroy(&args->cmpals_out); + int i; + for (i=0; irbuf.m; i++) + if ( args->lines[i] ) bcf_destroy1(args->lines[i]); + free(args->lines); + for (i=0; imtmp_lines; i++) + if ( args->tmp_lines[i] ) bcf_destroy1(args->tmp_lines[i]); + free(args->tmp_lines); + for (i=0; imalines; i++) + bcf_destroy1(args->alines[i]); + free(args->alines); + for (i=0; imblines; i++) + bcf_destroy1(args->blines[i]); + free(args->blines); + for (i=0; immaps; i++) + free(args->maps[i].map); + for (i=0; intmp_als; i++) + free(args->tmp_als[i].s); + free(args->tmp_als); + free(args->tmp_kstr.s); + if ( args->tmp_str ) + { + for (i=0; ihdr); i++) free(args->tmp_str[i].s); + free(args->tmp_str); + } + free(args->maps); + free(args->als); + free(args->int32_arr); + free(args->tmp_arr1); + free(args->tmp_arr2); + free(args->diploid); + if ( args->abuf ) abuf_destroy(args->abuf); + bcf_hdr_destroy(args->out_hdr); + if ( args->mrow_out ) bcf_destroy1(args->mrow_out); + if ( args->fai ) fai_destroy(args->fai); + if ( args->mseq ) free(args->seq); +} + + +static void normalize_line(args_t *args, bcf1_t *line) +{ + if ( args->fai ) + { + if ( args->check_ref & CHECK_REF_FIX ) fix_ref(args, line); + if ( args->do_indels ) + { + int ret = realign(args, line); + + // exclude broken VCF lines + if ( ret==ERR_REF_MISMATCH && args->check_ref & CHECK_REF_SKIP ) + { + args->nskipped++; + return; + } + if ( ret==ERR_DUP_ALLELE ) + { + if ( args->check_ref & CHECK_REF_FIX ) + fix_dup_alt(args, line); + else if ( args->check_ref==CHECK_REF_EXIT ) + error("Duplicate alleles at %s:%"PRId64"; run with -cw to turn the error into warning or with -cs to fix.\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + else if ( args->check_ref & CHECK_REF_WARN ) + fprintf(bcftools_stderr,"ALT_DUP\t%s\t%"PRId64"\n", bcf_seqname(args->hdr,line),(int64_t) line->pos+1); + } + } + } + + // insert into sorted buffer + rbuf_expand0(&args->rbuf,bcf1_t*,args->rbuf.n+1,args->lines); + int i,j; + i = j = rbuf_append(&args->rbuf); + if ( args->lines[i] ) bcf_destroy(args->lines[i]); + args->lines[i] = bcf_dup(line); + while ( rbuf_prev(&args->rbuf,&i) ) + { + if ( args->lines[i]->pos > args->lines[j]->pos ) SWAP(bcf1_t*, args->lines[i], args->lines[j]); + j = i; + } +} + +static bcf1_t *next_atomized_line(args_t *args) +{ + bcf1_t *rec = NULL; + if ( args->atomize==SPLIT ) + { + rec = abuf_flush(args->abuf, 0); + if ( rec ) return rec; + } + + if ( !bcf_sr_next_line(args->files) ) return NULL; + + if ( args->atomize==SPLIT ) + { + abuf_push(args->abuf,bcf_sr_get_line(args->files,0)); + return abuf_flush(args->abuf, 0); + } + return bcf_sr_get_line(args->files,0); +} +static void normalize_vcf(args_t *args) +{ + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) + hts_set_opt(args->out, HTS_OPT_THREAD_POOL, args->files->p); + if (args->record_cmd_line) bcf_hdr_append_version(args->out_hdr, args->argc, args->argv, "bcftools_norm"); + if ( bcf_hdr_write(args->out, args->out_hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + + bcf1_t *line; + int prev_rid = -1, prev_pos = -1, prev_type = 0; + while ( (line = next_atomized_line(args)) ) + { + args->ntotal++; + if ( args->rmdup ) + { + int line_type = bcf_get_variant_types(line); + if ( prev_rid>=0 && prev_rid==line->rid && prev_pos==line->pos ) + { + if ( args->rmdup & BCF_SR_PAIR_ANY ) continue; // rmdup by position only + if ( args->rmdup & BCF_SR_PAIR_SNPS && line_type&(VCF_SNP|VCF_MNP) && prev_type&(VCF_SNP|VCF_MNP) ) continue; + if ( args->rmdup & BCF_SR_PAIR_INDELS && line_type&(VCF_INDEL) && prev_type&(VCF_INDEL) ) continue; + if ( args->rmdup & BCF_SR_PAIR_EXACT && cmpals_match(&args->cmpals_in, line) ) continue; + } + else + { + prev_rid = line->rid; + prev_pos = line->pos; + prev_type = 0; + if ( args->rmdup & BCF_SR_PAIR_EXACT ) cmpals_reset(&args->cmpals_in); + } + prev_type |= line_type; + if ( args->rmdup & BCF_SR_PAIR_EXACT ) cmpals_add(&args->cmpals_in, line); + } + + // still on the same chromosome? + int i,j,ilast = rbuf_last(&args->rbuf); + if ( ilast>=0 && line->rid != args->lines[ilast]->rid ) flush_buffer(args, args->out, args->rbuf.n); // new chromosome + + int split = 0; + if ( args->mrows_op==MROWS_SPLIT ) + { + split = 1; + if ( args->mrows_collapse!=COLLAPSE_BOTH && args->mrows_collapse!=COLLAPSE_ANY ) + { + if ( !(bcf_get_variant_types(line) & args->mrows_collapse) ) split = 0; + } + if ( split && line->n_allele>2 ) + { + args->nsplit++; + split_multiallelic_to_biallelics(args, line); + for (j=0; jntmp_lines; j++) + normalize_line(args, args->tmp_lines[j]); + } + else + split = 0; + } + if ( !split ) + normalize_line(args, line); + + // find out how many sites to flush + ilast = rbuf_last(&args->rbuf); + j = 0; + for (i=-1; rbuf_next(&args->rbuf,&i); ) + { + if ( args->lines[ilast]->pos - args->lines[i]->pos < args->buf_win ) break; + j++; + } + if ( j>0 ) flush_buffer(args, args->out, j); + } + flush_buffer(args, args->out, args->rbuf.n); + if ( hts_close(args->out)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); + + fprintf(bcftools_stderr,"Lines total/split/realigned/skipped:\t%d/%d/%d/%d\n", args->ntotal,args->nsplit,args->nchanged,args->nskipped); + if ( args->check_ref & CHECK_REF_FIX ) + fprintf(bcftools_stderr,"REF/ALT total/modified/added: \t%d/%d/%d\n", args->nref.tot,args->nref.swap,args->nref.set); +} + +static void usage(void) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Left-align and normalize indels; check if REF alleles match the reference;\n"); + fprintf(bcftools_stderr, " split multiallelic sites into multiple rows; recover multiallelics from\n"); + fprintf(bcftools_stderr, " multiple rows.\n"); + fprintf(bcftools_stderr, "Usage: bcftools norm [options] \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -a, --atomize Decompose complex variants (e.g. MNVs become consecutive SNVs)\n"); + fprintf(bcftools_stderr, " --atom-overlaps '*'|. Use the star allele (*) for overlapping alleles or set to missing (.) [*]\n"); + fprintf(bcftools_stderr, " -c, --check-ref e|w|x|s Check REF alleles and exit (e), warn (w), exclude (x), or set (s) bad sites [e]\n"); + fprintf(bcftools_stderr, " -D, --remove-duplicates Remove duplicate lines of the same type.\n"); + fprintf(bcftools_stderr, " -d, --rm-dup TYPE Remove duplicate snps|indels|both|all|exact\n"); + fprintf(bcftools_stderr, " -f, --fasta-ref FILE Reference sequence\n"); + fprintf(bcftools_stderr, " --force Try to proceed even if malformed tags are encountered. Experimental, use at your own risk\n"); + fprintf(bcftools_stderr, " --keep-sum TAG,.. Keep vector sum constant when splitting multiallelics (see github issue #360)\n"); + fprintf(bcftools_stderr, " -m, --multiallelics -|+TYPE Split multiallelics (-) or join biallelics (+), type: snps|indels|both|any [both]\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -N, --do-not-normalize Do not normalize indels (with -m or -c s)\n"); + fprintf(bcftools_stderr, " --old-rec-tag STR Annotate modified records with INFO/STR indicating the original variant\n"); + fprintf(bcftools_stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --strict-filter When merging (-m+), merged site is PASS only if all sites being merged PASS\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(bcftools_stderr, " -w, --site-win INT Buffer for sorting lines which changed position during realignment [1000]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Examples:\n"); + fprintf(bcftools_stderr, " # normalize and left-align indels\n"); + fprintf(bcftools_stderr, " bcftools norm -f ref.fa in.vcf\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, " # split multi-allelic sites\n"); + fprintf(bcftools_stderr, " bcftools norm -m- in.vcf\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfnorm(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->aln_win = 100; + args->buf_win = 1000; + args->mrows_collapse = COLLAPSE_BOTH; + args->do_indels = 1; + args->clevel = -1; + int region_is_file = 0; + int targets_is_file = 0; + args->use_star_allele = 1; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"help",no_argument,NULL,'h'}, + {"force",no_argument,NULL,7}, + {"atomize",no_argument,NULL,'a'}, + {"atom-overlaps",required_argument,NULL,11}, + {"old-rec-tag",required_argument,NULL,12}, + {"keep-sum",required_argument,NULL,10}, + {"fasta-ref",required_argument,NULL,'f'}, + {"do-not-normalize",no_argument,NULL,'N'}, + {"multiallelics",required_argument,NULL,'m'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,1}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,2}, + {"site-win",required_argument,NULL,'w'}, + {"remove-duplicates",no_argument,NULL,'D'}, + {"rm-dup",required_argument,NULL,'d'}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"check-ref",required_argument,NULL,'c'}, + {"strict-filter",no_argument,NULL,'s'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "hr:R:f:w:Dd:o:O:c:m:t:T:sNa",loptions,NULL)) >= 0) { + switch (c) { + case 10: + // possibly generalize this also to INFO/AD and other tags + if ( strcasecmp("ad",optarg) ) + error("Error: only --keep-sum AD is currently supported. See https://github.com/samtools/bcftools/issues/360 for more.\n"); + args->keep_sum_ad = 1; // this will be set to the header id or -1 in init_data + break; + case 'a': args->atomize = SPLIT; break; + case 11 : + if ( optarg[0]=='*' ) args->use_star_allele = 1; + else if ( optarg[0]=='.' ) args->use_star_allele = 0; + else error("Invalid argument to --atom-overlaps. Perhaps you wanted: \"--atom-overlaps '*'\"?\n"); + break; + case 12 : args->old_rec_tag = optarg; break; + case 'N': args->do_indels = 0; break; + case 'd': + if ( !strcmp("snps",optarg) ) args->rmdup = BCF_SR_PAIR_SNPS; + else if ( !strcmp("indels",optarg) ) args->rmdup = BCF_SR_PAIR_INDELS; + else if ( !strcmp("both",optarg) ) args->rmdup = BCF_SR_PAIR_BOTH; + else if ( !strcmp("all",optarg) ) args->rmdup = BCF_SR_PAIR_ANY; + else if ( !strcmp("any",optarg) ) args->rmdup = BCF_SR_PAIR_ANY; + else if ( !strcmp("none",optarg) ) args->rmdup = BCF_SR_PAIR_EXACT; + else if ( !strcmp("exact",optarg) ) args->rmdup = BCF_SR_PAIR_EXACT; + else error("The argument to -d not recognised: %s\n", optarg); + break; + case 'm': + if ( optarg[0]=='-' ) args->mrows_op = MROWS_SPLIT; + else if ( optarg[0]=='+' ) args->mrows_op = MROWS_MERGE; + else error("Expected '+' or '-' with -m\n"); + if ( optarg[1]!=0 ) + { + if ( !strcmp("snps",optarg+1) ) args->mrows_collapse = COLLAPSE_SNPS; + else if ( !strcmp("indels",optarg+1) ) args->mrows_collapse = COLLAPSE_INDELS; + else if ( !strcmp("both",optarg+1) ) args->mrows_collapse = COLLAPSE_BOTH; + else if ( !strcmp("any",optarg+1) ) args->mrows_collapse = COLLAPSE_ANY; + else error("The argument to -m not recognised: %s\n", optarg); + } + break; + case 'c': + if ( strchr(optarg,'w') ) args->check_ref |= CHECK_REF_WARN; + if ( strchr(optarg,'x') ) args->check_ref |= CHECK_REF_SKIP; + if ( strchr(optarg,'s') ) args->check_ref |= CHECK_REF_FIX; + if ( strchr(optarg,'e') ) args->check_ref = CHECK_REF_EXIT; // overrides the above + break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + } + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'o': args->output_fname = optarg; break; + case 'D': + fprintf(bcftools_stderr,"Warning: `-D` is functional but deprecated, replaced by and alias of `-d none`.\n"); + args->rmdup = BCF_SR_PAIR_EXACT; + break; + case 's': args->strict_filter = 1; break; + case 'f': args->ref_fname = optarg; break; + case 'r': args->region = optarg; break; + case 'R': args->region = optarg; region_is_file = 1; break; + case 't': args->targets = optarg; break; + case 'T': args->targets = optarg; targets_is_file = 1; break; + case 'w': + args->buf_win = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --site-win %s\n", optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case 7 : args->force = 1; break; + case 1 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 2 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(); + } + else fname = argv[optind]; + + if ( !args->ref_fname && !args->mrows_op && !args->rmdup && args->atomize==NONE ) error("Expected -a, -f, -m, -D or -d option\n"); + if ( !args->check_ref && args->ref_fname ) args->check_ref = CHECK_REF_EXIT; + if ( args->check_ref && !args->ref_fname ) error("Expected --fasta-ref with --check-ref\n"); + + if ( args->region ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->region,region_is_file)<0 ) + error("Failed to read the regions: %s\n", args->region); + } + if ( args->targets ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets,targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets); + } + + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + if ( args->mrows_op&MROWS_SPLIT && args->rmdup ) error("Cannot combine -D and -m-\n"); + init_data(args); + normalize_vcf(args); + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} + diff --git a/bcftools/vcfplugin.c b/bcftools/vcfplugin.c new file mode 100644 index 0000000..4568668 --- /dev/null +++ b/bcftools/vcfplugin.c @@ -0,0 +1,822 @@ +/* vcfplugin.c -- plugin modules for operating on VCF/BCF files. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif +#include "bcftools.h" +#include "vcmp.h" +#include "filter.h" + +#ifdef ENABLE_BCF_PLUGINS + +typedef struct _plugin_t plugin_t; + +/** + * Plugin API: + * ---------- + * const char *about(void) + * - short description used by 'bcftools plugin -lv' + * + * const char *usage(void) + * - longer description used by 'bcftools +name -h' + * + * int run(int argc, char **argv) + * - if implemented, the control is immediately handed over to the plugin, + * none of the init/process/destroy functions is called. Return 0 on + * success or non-zero value on error. + * + * int init(int argc, char **argv, bcf_hdr_t *in_hdr, bcf_hdr_t *out_hdr) + * - called once at startup, allows to initialize local variables. + * Return 1 to suppress normal VCF/BCF header output, -1 on critical + * errors, 0 otherwise. + * + * bcf1_t *process(bcf1_t *rec) + * - called for each VCF record, return NULL for no output + * + * void destroy(void) + * - called after all lines have been processed to clean up + */ +typedef void (*dl_version_f) (const char **, const char **); +typedef int (*dl_run_f) (int, char **); +typedef int (*dl_init_f) (int, char **, bcf_hdr_t *, bcf_hdr_t *); +typedef char* (*dl_about_f) (void); +typedef char* (*dl_usage_f) (void); +typedef bcf1_t* (*dl_process_f) (bcf1_t *); +typedef void (*dl_destroy_f) (void); + +struct _plugin_t +{ + int argc; + char *name, **argv; + dl_version_f version; + dl_run_f run; + dl_init_f init; + dl_about_f about; + dl_usage_f usage; + dl_process_f process; + dl_destroy_f destroy; + void *handle; +}; + + +struct _args_t; + +typedef struct _rm_tag_t +{ + char *key; + int hdr_id; + void (*handler)(struct _args_t *, bcf1_t *, struct _rm_tag_t *); +} +rm_tag_t; + +typedef struct +{ + char **cols; + int ncols, mcols; + char **als; + int nals, mals; + kstring_t line; + int rid, start, end; +} +annot_line_t; + +typedef struct _annot_col_t +{ + int icol, replace; + char *hdr_key; + int (*setter)(struct _args_t *, bcf1_t *, struct _annot_col_t *, void*); +} +annot_col_t; + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +typedef struct _args_t +{ + bcf_srs_t *files; + bcf_hdr_t *hdr, *hdr_out; + htsFile *out_fh; + int output_type, n_threads, clevel; + + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + + plugin_t plugin; + int nplugin_paths; + char **plugin_paths; + + char **argv, *output_fname, *regions_list, *targets_list; + int argc, drop_header, verbose, record_cmd_line, plist_only; +} +args_t; + +char *msprintf(const char *fmt, ...); + +static void add_plugin_paths(args_t *args, const char *path) +{ + while (1) + { + size_t len = strcspn(path, HTS_PATH_SEPARATOR_STR); + + if ( len == 0 ) + { +#ifdef PLUGINPATH + add_plugin_paths(args, PLUGINPATH); +#endif + } + else + { + char *dir = (char *) malloc(len + 1); + strncpy(dir, path, len); + dir[len] = '\0'; + + struct stat st; + if ( stat(dir, &st) == 0 ) + { + args->plugin_paths = (char**) realloc(args->plugin_paths,sizeof(char*)*(args->nplugin_paths+1)); + args->plugin_paths[args->nplugin_paths] = dir; + args->nplugin_paths++; + if ( args->verbose > 1 && strcmp(".",dir) ) fprintf(stderr, "plugin directory %s .. ok\n", dir); + } + else + { + if ( args->verbose > 1 ) fprintf(stderr, "plugin directory %s .. %s\n", dir, strerror(errno)); + free(dir); + } + + } + + path += len; + if ( *path == HTS_PATH_SEPARATOR_CHAR ) path++; + else break; + } +} + +static void init_plugin_paths(args_t *args) +{ + if ( args->nplugin_paths!=-1 ) return; + + args->nplugin_paths = 0; + args->plugin_paths = NULL; + + char *path = getenv("BCFTOOLS_PLUGINS"); + add_plugin_paths(args, path ? path : ""); +} + +static void *dlopen_plugin(args_t *args, const char *fname) +{ + init_plugin_paths(args); + + void *handle; + char *tmp; + int is_absolute_path = 0; +#ifdef _WIN32 + // Windows accepts both forward slash (/) and backslash (\) as folder separator + // and can have any path prefixed by the drive letter and a colon (:). + if ( fname[0]=='/' || fname[0]=='\\') is_absolute_path = 1; + else if ( fname[0] && fname[1]==':' && (fname[2]=='/' || fname[2]=='\\') ) is_absolute_path = 1; +#else + if ( fname[0]=='/' ) is_absolute_path = 1; +#endif + + kstring_t err = {0,0,0}; + if ( !is_absolute_path ) + { + int i; + for (i=0; inplugin_paths; i++) + { + tmp = msprintf("%s/%s%s", args->plugin_paths[i], fname, PLUGIN_EXT); +#ifdef _WIN32 + handle = LoadLibraryA(tmp); +#else + handle = dlopen(tmp, RTLD_NOW); // valgrind complains about unfreed memory, not our problem though +#endif + if ( !handle ) +#ifdef _WIN32 + ksprintf(&err,"LoadLibraryA .. %lu\n", GetLastError()); +#else + ksprintf(&err,"%s:\n\tdlopen .. %s\n", tmp,dlerror()); +#endif + else if ( args->verbose > 1 ) + fprintf(stderr,"%s:\n\tplugin open .. ok\n", tmp); + free(tmp); + if ( handle ) return handle; + } + } + +#ifdef _WIN32 + handle = LoadLibraryA(fname); +#else + handle = dlopen(fname, RTLD_NOW); +#endif + if ( !handle ) +#ifdef _WIN32 + ksprintf(&err,"LoadLibraryA .. %lu\n", GetLastError()); +#else + ksprintf(&err,"%s:\n\tdlopen .. %s\n", fname,dlerror()); +#endif + else if ( args->verbose > 1 ) + fprintf(stderr,"%s:\n\tplugin open .. ok\n", fname); + + if ( !handle && (!args->plist_only || args->verbose>1) ) + fprintf(stderr,"%s",err.s); + free(err.s); + + return handle; +} + +static void print_plugin_usage_hint(const char *name) +{ + if ( name ) + fprintf(stderr, "\nThe bcftools plugin \"%s\" was not found or is not functional", name); + else + fprintf(stderr, "\nNo functional bcftools plugins were found"); + if ( !getenv("BCFTOOLS_PLUGINS") ) + { + fprintf(stderr,". The environment variable BCFTOOLS_PLUGINS is not set"); +#ifdef PLUGINPATH + fprintf(stderr,"\nand no usable plugins were found in %s", PLUGINPATH); +#endif + fprintf(stderr,".\n\n"); + } + else + { + fprintf(stderr, + " in\n\tBCFTOOLS_PLUGINS=\"%s\".\n\n" + "- Is the plugin path correct?\n\n" + "- Run \"bcftools plugin -l\" or \"bcftools plugin -lvv\" for a list of available plugins.\n" + "\n", + getenv("BCFTOOLS_PLUGINS") + ); + } +} + +static int load_plugin(args_t *args, const char *fname, int exit_on_error, plugin_t *plugin) +{ + plugin->name = strdup(fname); + + plugin->handle = dlopen_plugin(args, fname); + if ( !plugin->handle ) + { + if ( exit_on_error ) + { + print_plugin_usage_hint(fname); + error("Could not load \"%s\".\n\n", fname); + } + return -1; + } + +#ifdef _WIN32 + plugin->init = (dl_init_f) GetProcAddress(plugin->handle, "init"); + if ( plugin->init && args->verbose > 1 ) fprintf(stderr,"\tinit .. ok\n"); + + plugin->run = (dl_run_f) GetProcAddress(plugin->handle, "run"); + if ( plugin->run && args->verbose > 1 ) fprintf(stderr,"\trun .. ok\n"); + + if ( !plugin->init && !plugin->run ) + { + if ( exit_on_error ) error("Could not initialize %s, neither run or init found \n", plugin->name); + else if ( args->verbose > 1 ) fprintf(stderr,"\tinit/run .. not found\n"); + return -1; + } + + plugin->version = (dl_version_f) GetProcAddress(plugin->handle, "version"); + if ( !plugin->version ) + { + if ( exit_on_error ) error("Could not initialize %s: version string not found\n", plugin->name); + else if ( args->verbose > 1 ) fprintf(stderr,"\tversion .. not found\n"); + return -1; + } + + plugin->about = (dl_about_f) GetProcAddress(plugin->handle, "about"); + if ( !plugin->about ) + { + if ( exit_on_error ) error("Could not initialize %s: about string not found\n", plugin->name); + return -1; + } + + plugin->usage = (dl_about_f) GetProcAddress(plugin->handle, "usage"); + if ( !plugin->usage ) + plugin->usage = plugin->about; + + if ( plugin->run ) return 0; + + plugin->process = (dl_process_f) GetProcAddress(plugin->handle, "process"); + if ( !plugin->process ) + { + if ( exit_on_error ) error("Could not initialize %s: process method not found\n", plugin->name); + return -1; + } + + plugin->destroy = (dl_destroy_f) GetProcAddress(plugin->handle, "destroy"); + if ( !plugin->destroy ) + { + if ( exit_on_error ) error("Could not initialize %s: destroy method not found\n", plugin->name); + return -1; + } +#else + dlerror(); + plugin->init = (dl_init_f) dlsym(plugin->handle, "init"); + char *ret = dlerror(); + if ( ret ) + plugin->init = NULL; + else + if ( args->verbose > 1 ) fprintf(stderr,"\tinit .. ok\n"); + + plugin->run = (dl_run_f) dlsym(plugin->handle, "run"); + ret = dlerror(); + if ( ret ) + plugin->run = NULL; + else + if ( args->verbose > 1 ) fprintf(stderr,"\trun .. ok\n"); + + if ( !plugin->init && !plugin->run ) + { + if ( exit_on_error ) error("Could not initialize %s, neither run or init found \n", plugin->name); + else if ( args->verbose > 1 ) fprintf(stderr,"\tinit/run .. not found\n"); + return -1; + } + + plugin->version = (dl_version_f) dlsym(plugin->handle, "version"); + ret = dlerror(); + if ( ret ) + { + if ( exit_on_error ) error("Could not initialize %s, version string not found\n", plugin->name); + else if ( args->verbose > 1 ) fprintf(stderr,"\tversion .. not found\n"); + return -1; + } + + plugin->about = (dl_about_f) dlsym(plugin->handle, "about"); + ret = dlerror(); + if ( ret ) + { + if ( exit_on_error ) error("Could not initialize %s: %s\n", plugin->name, ret); + return -1; + } + + plugin->usage = (dl_about_f) dlsym(plugin->handle, "usage"); + ret = dlerror(); + if ( ret ) + plugin->usage = plugin->about; + + if ( plugin->run ) return 0; + + plugin->process = (dl_process_f) dlsym(plugin->handle, "process"); + ret = dlerror(); + if ( ret ) + { + if ( exit_on_error ) error("Could not initialize %s: %s\n", plugin->name, ret); + return -1; + } + + plugin->destroy = (dl_destroy_f) dlsym(plugin->handle, "destroy"); + ret = dlerror(); + if ( ret ) + { + if ( exit_on_error ) error("Could not initialize %s: %s\n", plugin->name, ret); + return -1; + } +#endif + + return 0; +} + +static void check_version(args_t *args) +{ + static int warned_bcftools = 0, warned_htslib = 0; + const char *bver, *hver; + args->plugin.version(&bver, &hver); + if ( strcmp(bver,bcftools_version()) && !warned_bcftools ) + { + fprintf(stderr,"WARNING: bcftools version mismatch .. bcftools at %s, the plugin \"%s\" at %s\n", bcftools_version(),args->plugin.name,bver); + warned_bcftools = 1; + } + if ( strcmp(hver,hts_version()) && !warned_htslib ) + { + fprintf(stderr,"WARNING: htslib version mismatch .. bcftools at %s, the plugin \"%s\" at %s\n", hts_version(),args->plugin.name,hver); + warned_htslib = 1; + } +} + +static void init_plugin(args_t *args) +{ + int ret = args->plugin.init(args->plugin.argc,args->plugin.argv,args->hdr,args->hdr_out); + if ( ret<0 ) error("The plugin exited with an error.\n"); + check_version(args); + args->drop_header += ret; +} + +static int cmp_plugin_name(const void *p1, const void *p2) +{ + plugin_t *a = (plugin_t*) p1; + plugin_t *b = (plugin_t*) p2; + return strcmp(a->name,b->name); +} + +// If args=NULL then returns the number of plugins available. Otherwise prints the +// plugins on stdout and returns 0 on success. +static int list_plugins(args_t *args) +{ + plugin_t *plugins = NULL; + int nplugins = 0, mplugins = 0; + + int count_only = 0; + args_t _args; + if ( !args ) + { + memset(&_args,0,sizeof(_args)); + args = &_args; + args->nplugin_paths = -1; + count_only = 1; + } + init_plugin_paths(args); + + kstring_t str = {0,0,0}; + int plugin_ext_len = strlen(PLUGIN_EXT); + int i; + for (i=0; inplugin_paths; i++) + { + DIR *dp = opendir(args->plugin_paths[i]); + if ( dp==NULL ) continue; + + struct dirent *ep; + while ( (ep=readdir(dp)) ) + { + int len = strlen(ep->d_name); + if ( strcasecmp(PLUGIN_EXT,ep->d_name+len-plugin_ext_len) ) continue; + str.l = 0; + ksprintf(&str,"%s/%s", args->plugin_paths[i],ep->d_name); + hts_expand(plugin_t, nplugins+1, mplugins, plugins); + if ( load_plugin(args, str.s, 0, &plugins[nplugins]) < 0 ) continue; + nplugins++; + str.l = 0; + kputs(ep->d_name, &str); + int l = str.l - 1; + while ( l>=0 && str.s[l]!='.' ) l--; + if ( l>=0 ) str.s[l] = 0; + free(plugins[nplugins-1].name); + plugins[nplugins-1].name = strdup(str.s); // use a short name + } + closedir(dp); + } + if ( count_only ) + { + free(str.s); + return nplugins; + } + if ( nplugins ) + { + qsort(plugins, nplugins, sizeof(plugins[0]), cmp_plugin_name); + + for (i=0; iverbose ) + printf("\n-- %s --\n%s", plugins[i].name, plugins[i].about()); + else + printf("%s\n", plugins[i].name); + } + if ( args->verbose ) printf("\n"); + } + else + print_plugin_usage_hint(NULL); + free(str.s); + return nplugins ? 0 : 1; +} +int count_plugins(void) +{ + return list_plugins(NULL); +} + +static void init_data(args_t *args) +{ + args->hdr = args->files->readers[0].header; + args->hdr_out = bcf_hdr_dup(args->hdr); + + init_plugin(args); + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + + if (args->record_cmd_line) bcf_hdr_append_version(args->hdr_out, args->argc, args->argv, "bcftools_plugin"); + if ( !args->drop_header ) + { + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(args->out_fh, args->n_threads); + if ( bcf_hdr_write(args->out_fh, args->hdr_out)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } +} + +static void destroy_data(args_t *args) +{ + free(args->plugin.name); + if ( args->plugin.destroy ) args->plugin.destroy(); +#ifdef _WIN32 + FreeLibrary(args->plugin.handle); +#else + dlclose(args->plugin.handle); +#endif + if ( args->hdr_out ) bcf_hdr_destroy(args->hdr_out); + if ( args->nplugin_paths>0 ) + { + int i; + for (i=0; inplugin_paths; i++) free(args->plugin_paths[i]); + free(args->plugin_paths); + } + if ( args->filter ) + filter_destroy(args->filter); + if (args->out_fh && hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Run user defined plugin\n"); + fprintf(stderr, "Usage: bcftools plugin [OPTIONS] [-- PLUGIN_OPTIONS]\n"); + fprintf(stderr, " bcftools +name [OPTIONS] [-- PLUGIN_OPTIONS]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "VCF input options:\n"); + fprintf(stderr, " -e, --exclude EXPR Exclude sites for which the expression is true\n"); + fprintf(stderr, " -i, --include EXPR Select sites for which the expression is true\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, "VCF output options:\n"); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " --threads INTT Use multithreading with worker threads [0]\n"); + fprintf(stderr, "Plugin options:\n"); + fprintf(stderr, " -h, --help List plugin's options\n"); + fprintf(stderr, " -l, --list-plugins List available plugins. See BCFTOOLS_PLUGINS environment variable and man page for details\n"); + fprintf(stderr, " -v, --verbose Print verbose information, -vv increases verbosity\n"); + fprintf(stderr, " -V, --version Print version string and exit\n"); + fprintf(stderr, "\n"); + exit(1); +} + +static int is_verbose(int argc, char *argv[]) +{ + int c, verbose = 0, opterr_ori = opterr; + static struct option loptions[] = + { + {"verbose",no_argument,NULL,'v'}, + {NULL,0,NULL,0} + }; + opterr = 0; + while ((c = getopt_long(argc, argv, "-v",loptions,NULL)) >= 0) + { + switch (c) { + case 'v': verbose++; break; + case 1: + default: break; + } + } + opterr = opterr_ori; + optind = 0; + return verbose; +} +int main_plugin(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->nplugin_paths = -1; + args->clevel = -1; + int regions_is_file = 0, targets_is_file = 0, usage_only = 0, version_only = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + if ( argc==1 ) usage(args); + char *plugin_name = NULL; + if ( argv[1][0]!='-' ) + { + args->verbose = is_verbose(argc, argv); + plugin_name = argv[1]; + argc--; + argv++; + load_plugin(args, plugin_name, 1, &args->plugin); + if ( args->plugin.run ) + { + check_version(args); + int ret = args->plugin.run(argc, argv); + destroy_data(args); + free(args); + return ret; + } + } + + static struct option loptions[] = + { + {"version",no_argument,NULL,'V'}, + {"verbose",no_argument,NULL,'v'}, + {"help",no_argument,NULL,'h'}, + {"list-plugins",no_argument,NULL,'l'}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"include",required_argument,NULL,'i'}, + {"exclude",required_argument,NULL,'e'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,1}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,2}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "h?o:O:r:R:t:T:li:e:vV",loptions,NULL)) >= 0) + { + switch (c) { + case 'V': version_only = 1; break; + case 'v': args->verbose++; break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'l': args->plist_only = 1; break; + case 1 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 2 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case '?': + case 'h': usage_only = 1; break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( args->plist_only ) return list_plugins(args); + if ( !plugin_name ) usage(args); + + if ( version_only ) + { + const char *bver, *hver; + args->plugin.version(&bver, &hver); + printf("bcftools %s using htslib %s\n", bcftools_version(), hts_version()); + printf("plugin at %s using htslib %s\n\n", bver, hver); + return 0; + } + + if ( usage_only ) + { + if ( args->plugin.usage ) + fprintf(stderr,"%s",args->plugin.usage()); + else + fprintf(stderr,"Usage: bcftools +%s [General Options] -- [Plugin Options]\n",plugin_name); + return 0; + } + + char *fname = NULL; + if ( optind>=argc || (argv[optind][0]=='-' && argv[optind][1]) ) + { + args->plugin.argc = argc - optind + 1; + args->plugin.argv = argv + optind - 1; + + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else if ( optind>=argc ) usage(args); + else + { + optind = 1; + init_plugin(args); + } + } + else + { + fname = argv[optind]; + args->plugin.argc = argc - optind; + args->plugin.argv = argv + optind; + } + optind = 0; + + args->files = bcf_sr_init(); + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + args->files->collapse |= COLLAPSE_SOME; + } + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) continue; + } + line = args->plugin.process(line); + if ( line ) + { + if ( line->errcode ) error("[E::main_plugin] Unchecked error (%d), exiting\n",line->errcode); + if ( bcf_write1(args->out_fh, args->hdr_out, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } + } + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} + +#else /* ENABLE_BCF_PLUGINS */ + +int main_plugin(int argc, char *argv[]) +{ + fprintf(stderr, "bcftools plugins are disabled. To use them, you will need to rebuild\n" + "bcftools from the source distribution with plugins enabled.\n"); + return 1; +} + +#endif /* ENABLE_BCF_PLUGINS */ diff --git a/bcftools/vcfplugin.c.pysam.c b/bcftools/vcfplugin.c.pysam.c new file mode 100644 index 0000000..b37ac23 --- /dev/null +++ b/bcftools/vcfplugin.c.pysam.c @@ -0,0 +1,824 @@ +#include "bcftools.pysam.h" + +/* vcfplugin.c -- plugin modules for operating on VCF/BCF files. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif +#include "bcftools.h" +#include "vcmp.h" +#include "filter.h" + +#ifdef ENABLE_BCF_PLUGINS + +typedef struct _plugin_t plugin_t; + +/** + * Plugin API: + * ---------- + * const char *about(void) + * - short description used by 'bcftools plugin -lv' + * + * const char *usage(void) + * - longer description used by 'bcftools +name -h' + * + * int run(int argc, char **argv) + * - if implemented, the control is immediately handed over to the plugin, + * none of the init/process/destroy functions is called. Return 0 on + * success or non-zero value on error. + * + * int init(int argc, char **argv, bcf_hdr_t *in_hdr, bcf_hdr_t *out_hdr) + * - called once at startup, allows to initialize local variables. + * Return 1 to suppress normal VCF/BCF header output, -1 on critical + * errors, 0 otherwise. + * + * bcf1_t *process(bcf1_t *rec) + * - called for each VCF record, return NULL for no output + * + * void destroy(void) + * - called after all lines have been processed to clean up + */ +typedef void (*dl_version_f) (const char **, const char **); +typedef int (*dl_run_f) (int, char **); +typedef int (*dl_init_f) (int, char **, bcf_hdr_t *, bcf_hdr_t *); +typedef char* (*dl_about_f) (void); +typedef char* (*dl_usage_f) (void); +typedef bcf1_t* (*dl_process_f) (bcf1_t *); +typedef void (*dl_destroy_f) (void); + +struct _plugin_t +{ + int argc; + char *name, **argv; + dl_version_f version; + dl_run_f run; + dl_init_f init; + dl_about_f about; + dl_usage_f usage; + dl_process_f process; + dl_destroy_f destroy; + void *handle; +}; + + +struct _args_t; + +typedef struct _rm_tag_t +{ + char *key; + int hdr_id; + void (*handler)(struct _args_t *, bcf1_t *, struct _rm_tag_t *); +} +rm_tag_t; + +typedef struct +{ + char **cols; + int ncols, mcols; + char **als; + int nals, mals; + kstring_t line; + int rid, start, end; +} +annot_line_t; + +typedef struct _annot_col_t +{ + int icol, replace; + char *hdr_key; + int (*setter)(struct _args_t *, bcf1_t *, struct _annot_col_t *, void*); +} +annot_col_t; + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +typedef struct _args_t +{ + bcf_srs_t *files; + bcf_hdr_t *hdr, *hdr_out; + htsFile *out_fh; + int output_type, n_threads, clevel; + + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + + plugin_t plugin; + int nplugin_paths; + char **plugin_paths; + + char **argv, *output_fname, *regions_list, *targets_list; + int argc, drop_header, verbose, record_cmd_line, plist_only; +} +args_t; + +char *msprintf(const char *fmt, ...); + +static void add_plugin_paths(args_t *args, const char *path) +{ + while (1) + { + size_t len = strcspn(path, HTS_PATH_SEPARATOR_STR); + + if ( len == 0 ) + { +#ifdef PLUGINPATH + add_plugin_paths(args, PLUGINPATH); +#endif + } + else + { + char *dir = (char *) malloc(len + 1); + strncpy(dir, path, len); + dir[len] = '\0'; + + struct stat st; + if ( stat(dir, &st) == 0 ) + { + args->plugin_paths = (char**) realloc(args->plugin_paths,sizeof(char*)*(args->nplugin_paths+1)); + args->plugin_paths[args->nplugin_paths] = dir; + args->nplugin_paths++; + if ( args->verbose > 1 && strcmp(".",dir) ) fprintf(bcftools_stderr, "plugin directory %s .. ok\n", dir); + } + else + { + if ( args->verbose > 1 ) fprintf(bcftools_stderr, "plugin directory %s .. %s\n", dir, strerror(errno)); + free(dir); + } + + } + + path += len; + if ( *path == HTS_PATH_SEPARATOR_CHAR ) path++; + else break; + } +} + +static void init_plugin_paths(args_t *args) +{ + if ( args->nplugin_paths!=-1 ) return; + + args->nplugin_paths = 0; + args->plugin_paths = NULL; + + char *path = getenv("BCFTOOLS_PLUGINS"); + add_plugin_paths(args, path ? path : ""); +} + +static void *dlopen_plugin(args_t *args, const char *fname) +{ + init_plugin_paths(args); + + void *handle; + char *tmp; + int is_absolute_path = 0; +#ifdef _WIN32 + // Windows accepts both forward slash (/) and backslash (\) as folder separator + // and can have any path prefixed by the drive letter and a colon (:). + if ( fname[0]=='/' || fname[0]=='\\') is_absolute_path = 1; + else if ( fname[0] && fname[1]==':' && (fname[2]=='/' || fname[2]=='\\') ) is_absolute_path = 1; +#else + if ( fname[0]=='/' ) is_absolute_path = 1; +#endif + + kstring_t err = {0,0,0}; + if ( !is_absolute_path ) + { + int i; + for (i=0; inplugin_paths; i++) + { + tmp = msprintf("%s/%s%s", args->plugin_paths[i], fname, PLUGIN_EXT); +#ifdef _WIN32 + handle = LoadLibraryA(tmp); +#else + handle = dlopen(tmp, RTLD_NOW); // valgrind complains about unfreed memory, not our problem though +#endif + if ( !handle ) +#ifdef _WIN32 + ksprintf(&err,"LoadLibraryA .. %lu\n", GetLastError()); +#else + ksprintf(&err,"%s:\n\tdlopen .. %s\n", tmp,dlerror()); +#endif + else if ( args->verbose > 1 ) + fprintf(bcftools_stderr,"%s:\n\tplugin open .. ok\n", tmp); + free(tmp); + if ( handle ) return handle; + } + } + +#ifdef _WIN32 + handle = LoadLibraryA(fname); +#else + handle = dlopen(fname, RTLD_NOW); +#endif + if ( !handle ) +#ifdef _WIN32 + ksprintf(&err,"LoadLibraryA .. %lu\n", GetLastError()); +#else + ksprintf(&err,"%s:\n\tdlopen .. %s\n", fname,dlerror()); +#endif + else if ( args->verbose > 1 ) + fprintf(bcftools_stderr,"%s:\n\tplugin open .. ok\n", fname); + + if ( !handle && (!args->plist_only || args->verbose>1) ) + fprintf(bcftools_stderr,"%s",err.s); + free(err.s); + + return handle; +} + +static void print_plugin_usage_hint(const char *name) +{ + if ( name ) + fprintf(bcftools_stderr, "\nThe bcftools plugin \"%s\" was not found or is not functional", name); + else + fprintf(bcftools_stderr, "\nNo functional bcftools plugins were found"); + if ( !getenv("BCFTOOLS_PLUGINS") ) + { + fprintf(bcftools_stderr,". The environment variable BCFTOOLS_PLUGINS is not set"); +#ifdef PLUGINPATH + fprintf(bcftools_stderr,"\nand no usable plugins were found in %s", PLUGINPATH); +#endif + fprintf(bcftools_stderr,".\n\n"); + } + else + { + fprintf(bcftools_stderr, + " in\n\tBCFTOOLS_PLUGINS=\"%s\".\n\n" + "- Is the plugin path correct?\n\n" + "- Run \"bcftools plugin -l\" or \"bcftools plugin -lvv\" for a list of available plugins.\n" + "\n", + getenv("BCFTOOLS_PLUGINS") + ); + } +} + +static int load_plugin(args_t *args, const char *fname, int exit_on_error, plugin_t *plugin) +{ + plugin->name = strdup(fname); + + plugin->handle = dlopen_plugin(args, fname); + if ( !plugin->handle ) + { + if ( exit_on_error ) + { + print_plugin_usage_hint(fname); + error("Could not load \"%s\".\n\n", fname); + } + return -1; + } + +#ifdef _WIN32 + plugin->init = (dl_init_f) GetProcAddress(plugin->handle, "init"); + if ( plugin->init && args->verbose > 1 ) fprintf(bcftools_stderr,"\tinit .. ok\n"); + + plugin->run = (dl_run_f) GetProcAddress(plugin->handle, "run"); + if ( plugin->run && args->verbose > 1 ) fprintf(bcftools_stderr,"\trun .. ok\n"); + + if ( !plugin->init && !plugin->run ) + { + if ( exit_on_error ) error("Could not initialize %s, neither run or init found \n", plugin->name); + else if ( args->verbose > 1 ) fprintf(bcftools_stderr,"\tinit/run .. not found\n"); + return -1; + } + + plugin->version = (dl_version_f) GetProcAddress(plugin->handle, "version"); + if ( !plugin->version ) + { + if ( exit_on_error ) error("Could not initialize %s: version string not found\n", plugin->name); + else if ( args->verbose > 1 ) fprintf(bcftools_stderr,"\tversion .. not found\n"); + return -1; + } + + plugin->about = (dl_about_f) GetProcAddress(plugin->handle, "about"); + if ( !plugin->about ) + { + if ( exit_on_error ) error("Could not initialize %s: about string not found\n", plugin->name); + return -1; + } + + plugin->usage = (dl_about_f) GetProcAddress(plugin->handle, "usage"); + if ( !plugin->usage ) + plugin->usage = plugin->about; + + if ( plugin->run ) return 0; + + plugin->process = (dl_process_f) GetProcAddress(plugin->handle, "process"); + if ( !plugin->process ) + { + if ( exit_on_error ) error("Could not initialize %s: process method not found\n", plugin->name); + return -1; + } + + plugin->destroy = (dl_destroy_f) GetProcAddress(plugin->handle, "destroy"); + if ( !plugin->destroy ) + { + if ( exit_on_error ) error("Could not initialize %s: destroy method not found\n", plugin->name); + return -1; + } +#else + dlerror(); + plugin->init = (dl_init_f) dlsym(plugin->handle, "init"); + char *ret = dlerror(); + if ( ret ) + plugin->init = NULL; + else + if ( args->verbose > 1 ) fprintf(bcftools_stderr,"\tinit .. ok\n"); + + plugin->run = (dl_run_f) dlsym(plugin->handle, "run"); + ret = dlerror(); + if ( ret ) + plugin->run = NULL; + else + if ( args->verbose > 1 ) fprintf(bcftools_stderr,"\trun .. ok\n"); + + if ( !plugin->init && !plugin->run ) + { + if ( exit_on_error ) error("Could not initialize %s, neither run or init found \n", plugin->name); + else if ( args->verbose > 1 ) fprintf(bcftools_stderr,"\tinit/run .. not found\n"); + return -1; + } + + plugin->version = (dl_version_f) dlsym(plugin->handle, "version"); + ret = dlerror(); + if ( ret ) + { + if ( exit_on_error ) error("Could not initialize %s, version string not found\n", plugin->name); + else if ( args->verbose > 1 ) fprintf(bcftools_stderr,"\tversion .. not found\n"); + return -1; + } + + plugin->about = (dl_about_f) dlsym(plugin->handle, "about"); + ret = dlerror(); + if ( ret ) + { + if ( exit_on_error ) error("Could not initialize %s: %s\n", plugin->name, ret); + return -1; + } + + plugin->usage = (dl_about_f) dlsym(plugin->handle, "usage"); + ret = dlerror(); + if ( ret ) + plugin->usage = plugin->about; + + if ( plugin->run ) return 0; + + plugin->process = (dl_process_f) dlsym(plugin->handle, "process"); + ret = dlerror(); + if ( ret ) + { + if ( exit_on_error ) error("Could not initialize %s: %s\n", plugin->name, ret); + return -1; + } + + plugin->destroy = (dl_destroy_f) dlsym(plugin->handle, "destroy"); + ret = dlerror(); + if ( ret ) + { + if ( exit_on_error ) error("Could not initialize %s: %s\n", plugin->name, ret); + return -1; + } +#endif + + return 0; +} + +static void check_version(args_t *args) +{ + static int warned_bcftools = 0, warned_htslib = 0; + const char *bver, *hver; + args->plugin.version(&bver, &hver); + if ( strcmp(bver,bcftools_version()) && !warned_bcftools ) + { + fprintf(bcftools_stderr,"WARNING: bcftools version mismatch .. bcftools at %s, the plugin \"%s\" at %s\n", bcftools_version(),args->plugin.name,bver); + warned_bcftools = 1; + } + if ( strcmp(hver,hts_version()) && !warned_htslib ) + { + fprintf(bcftools_stderr,"WARNING: htslib version mismatch .. bcftools at %s, the plugin \"%s\" at %s\n", hts_version(),args->plugin.name,hver); + warned_htslib = 1; + } +} + +static void init_plugin(args_t *args) +{ + int ret = args->plugin.init(args->plugin.argc,args->plugin.argv,args->hdr,args->hdr_out); + if ( ret<0 ) error("The plugin exited with an error.\n"); + check_version(args); + args->drop_header += ret; +} + +static int cmp_plugin_name(const void *p1, const void *p2) +{ + plugin_t *a = (plugin_t*) p1; + plugin_t *b = (plugin_t*) p2; + return strcmp(a->name,b->name); +} + +// If args=NULL then returns the number of plugins available. Otherwise prints the +// plugins on bcftools_stdout and returns 0 on success. +static int list_plugins(args_t *args) +{ + plugin_t *plugins = NULL; + int nplugins = 0, mplugins = 0; + + int count_only = 0; + args_t _args; + if ( !args ) + { + memset(&_args,0,sizeof(_args)); + args = &_args; + args->nplugin_paths = -1; + count_only = 1; + } + init_plugin_paths(args); + + kstring_t str = {0,0,0}; + int plugin_ext_len = strlen(PLUGIN_EXT); + int i; + for (i=0; inplugin_paths; i++) + { + DIR *dp = opendir(args->plugin_paths[i]); + if ( dp==NULL ) continue; + + struct dirent *ep; + while ( (ep=readdir(dp)) ) + { + int len = strlen(ep->d_name); + if ( strcasecmp(PLUGIN_EXT,ep->d_name+len-plugin_ext_len) ) continue; + str.l = 0; + ksprintf(&str,"%s/%s", args->plugin_paths[i],ep->d_name); + hts_expand(plugin_t, nplugins+1, mplugins, plugins); + if ( load_plugin(args, str.s, 0, &plugins[nplugins]) < 0 ) continue; + nplugins++; + str.l = 0; + kputs(ep->d_name, &str); + int l = str.l - 1; + while ( l>=0 && str.s[l]!='.' ) l--; + if ( l>=0 ) str.s[l] = 0; + free(plugins[nplugins-1].name); + plugins[nplugins-1].name = strdup(str.s); // use a short name + } + closedir(dp); + } + if ( count_only ) + { + free(str.s); + return nplugins; + } + if ( nplugins ) + { + qsort(plugins, nplugins, sizeof(plugins[0]), cmp_plugin_name); + + for (i=0; iverbose ) + fprintf(bcftools_stdout, "\n-- %s --\n%s", plugins[i].name, plugins[i].about()); + else + fprintf(bcftools_stdout, "%s\n", plugins[i].name); + } + if ( args->verbose ) fprintf(bcftools_stdout, "\n"); + } + else + print_plugin_usage_hint(NULL); + free(str.s); + return nplugins ? 0 : 1; +} +int count_plugins(void) +{ + return list_plugins(NULL); +} + +static void init_data(args_t *args) +{ + args->hdr = args->files->readers[0].header; + args->hdr_out = bcf_hdr_dup(args->hdr); + + init_plugin(args); + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + + if (args->record_cmd_line) bcf_hdr_append_version(args->hdr_out, args->argc, args->argv, "bcftools_plugin"); + if ( !args->drop_header ) + { + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + args->out_fh = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( args->out_fh == NULL ) error("Can't write to \"%s\": %s\n", args->output_fname, strerror(errno)); + if ( args->n_threads ) hts_set_threads(args->out_fh, args->n_threads); + if ( bcf_hdr_write(args->out_fh, args->hdr_out)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } +} + +static void destroy_data(args_t *args) +{ + free(args->plugin.name); + if ( args->plugin.destroy ) args->plugin.destroy(); +#ifdef _WIN32 + FreeLibrary(args->plugin.handle); +#else + dlclose(args->plugin.handle); +#endif + if ( args->hdr_out ) bcf_hdr_destroy(args->hdr_out); + if ( args->nplugin_paths>0 ) + { + int i; + for (i=0; inplugin_paths; i++) free(args->plugin_paths[i]); + free(args->plugin_paths); + } + if ( args->filter ) + filter_destroy(args->filter); + if (args->out_fh && hts_close(args->out_fh)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->output_fname); +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Run user defined plugin\n"); + fprintf(bcftools_stderr, "Usage: bcftools plugin [OPTIONS] [-- PLUGIN_OPTIONS]\n"); + fprintf(bcftools_stderr, " bcftools +name [OPTIONS] [-- PLUGIN_OPTIONS]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "VCF input options:\n"); + fprintf(bcftools_stderr, " -e, --exclude EXPR Exclude sites for which the expression is true\n"); + fprintf(bcftools_stderr, " -i, --include EXPR Select sites for which the expression is true\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, "VCF output options:\n"); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -o, --output FILE Write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " --threads INTT Use multithreading with worker threads [0]\n"); + fprintf(bcftools_stderr, "Plugin options:\n"); + fprintf(bcftools_stderr, " -h, --help List plugin's options\n"); + fprintf(bcftools_stderr, " -l, --list-plugins List available plugins. See BCFTOOLS_PLUGINS environment variable and man page for details\n"); + fprintf(bcftools_stderr, " -v, --verbose Print verbose information, -vv increases verbosity\n"); + fprintf(bcftools_stderr, " -V, --version Print version string and exit\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +static int is_verbose(int argc, char *argv[]) +{ + int c, verbose = 0, opterr_ori = opterr; + static struct option loptions[] = + { + {"verbose",no_argument,NULL,'v'}, + {NULL,0,NULL,0} + }; + opterr = 0; + while ((c = getopt_long(argc, argv, "-v",loptions,NULL)) >= 0) + { + switch (c) { + case 'v': verbose++; break; + case 1: + default: break; + } + } + opterr = opterr_ori; + optind = 0; + return verbose; +} +int main_plugin(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->output_fname = "-"; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->nplugin_paths = -1; + args->clevel = -1; + int regions_is_file = 0, targets_is_file = 0, usage_only = 0, version_only = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + if ( argc==1 ) usage(args); + char *plugin_name = NULL; + if ( argv[1][0]!='-' ) + { + args->verbose = is_verbose(argc, argv); + plugin_name = argv[1]; + argc--; + argv++; + load_plugin(args, plugin_name, 1, &args->plugin); + if ( args->plugin.run ) + { + check_version(args); + int ret = args->plugin.run(argc, argv); + destroy_data(args); + free(args); + return ret; + } + } + + static struct option loptions[] = + { + {"version",no_argument,NULL,'V'}, + {"verbose",no_argument,NULL,'v'}, + {"help",no_argument,NULL,'h'}, + {"list-plugins",no_argument,NULL,'l'}, + {"output",required_argument,NULL,'o'}, + {"output-type",required_argument,NULL,'O'}, + {"threads",required_argument,NULL,9}, + {"include",required_argument,NULL,'i'}, + {"exclude",required_argument,NULL,'e'}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,1}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,2}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "h?o:O:r:R:t:T:li:e:vV",loptions,NULL)) >= 0) + { + switch (c) { + case 'V': version_only = 1; break; + case 'v': args->verbose++; break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'l': args->plist_only = 1; break; + case 1 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 2 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case '?': + case 'h': usage_only = 1; break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( args->plist_only ) return list_plugins(args); + if ( !plugin_name ) usage(args); + + if ( version_only ) + { + const char *bver, *hver; + args->plugin.version(&bver, &hver); + fprintf(bcftools_stdout, "bcftools %s using htslib %s\n", bcftools_version(), hts_version()); + fprintf(bcftools_stdout, "plugin at %s using htslib %s\n\n", bver, hver); + return 0; + } + + if ( usage_only ) + { + if ( args->plugin.usage ) + fprintf(bcftools_stderr,"%s",args->plugin.usage()); + else + fprintf(bcftools_stderr,"Usage: bcftools +%s [General Options] -- [Plugin Options]\n",plugin_name); + return 0; + } + + char *fname = NULL; + if ( optind>=argc || (argv[optind][0]=='-' && argv[optind][1]) ) + { + args->plugin.argc = argc - optind + 1; + args->plugin.argv = argv + optind - 1; + + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else if ( optind>=argc ) usage(args); + else + { + optind = 1; + init_plugin(args); + } + } + else + { + fname = argv[optind]; + args->plugin.argc = argc - optind; + args->plugin.argv = argv + optind; + } + optind = 0; + + args->files = bcf_sr_init(); + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + args->files->collapse |= COLLAPSE_SOME; + } + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) continue; + } + line = args->plugin.process(line); + if ( line ) + { + if ( line->errcode ) error("[E::main_plugin] Unchecked error (%d), exiting\n",line->errcode); + if ( bcf_write1(args->out_fh, args->hdr_out, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->output_fname); + } + } + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} + +#else /* ENABLE_BCF_PLUGINS */ + +int main_plugin(int argc, char *argv[]) +{ + fprintf(bcftools_stderr, "bcftools plugins are disabled. To use them, you will need to rebuild\n" + "bcftools from the source distribution with plugins enabled.\n"); + return 1; +} + +#endif /* ENABLE_BCF_PLUGINS */ diff --git a/bcftools/vcfquery.c b/bcftools/vcfquery.c new file mode 100644 index 0000000..70b5f30 --- /dev/null +++ b/bcftools/vcfquery.c @@ -0,0 +1,447 @@ +/* vcfquery.c -- Extracts fields from VCF/BCF file. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "convert.h" +#include "smpl_ilist.h" + + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +typedef struct +{ + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + uint8_t *smpl_pass; + convert_t *convert; + bcf_srs_t *files; + bcf_hdr_t *header; + int sample_is_file; + char **argv, *format_str, *sample_list, *targets_list, *regions_list, *vcf_list, *fn_out; + int argc, list_columns, print_header, allow_undef_tags, force_samples; + FILE *out; +} +args_t; + +static void destroy_list(char **list, int n) +{ + int i; + for (i=0; iheader = args->files->readers[0].header; + + int i, nsamples = 0, *samples = NULL; + if ( args->sample_list && strcmp("-",args->sample_list) ) + { + for (i=0; ifiles->nreaders; i++) + { + // This tells htslib to subset samples directly when reading. Also the header is modified to + // include only the requested samples + int ret = bcf_hdr_set_samples(args->files->readers[i].header,args->sample_list,args->sample_is_file); + if ( ret<0 ) error("Error parsing the sample list\n"); + else if ( ret>0 && !args->force_samples ) + error("Error: sample #%d not found in the header, user --force-samples to proceed anyway\n", ret); + } + + int flags = SMPL_REORDER; + smpl_ilist_t *ilist = smpl_ilist_init(args->files->readers[0].header, args->sample_list, args->sample_is_file, flags); + nsamples = ilist->n; + samples = (int*) malloc(sizeof(int)*nsamples); + for (i=0; in; i++) + samples[i] = ilist->idx[i]; + smpl_ilist_destroy(ilist); + } + args->convert = convert_init(args->header, samples, nsamples, args->format_str); + convert_set_option(args->convert, subset_samples, &args->smpl_pass); + if ( args->allow_undef_tags ) convert_set_option(args->convert, allow_undef_tags, 1); + free(samples); + + int max_unpack = convert_max_unpack(args->convert); + if ( args->filter_str ) + { + args->filter = filter_init(args->header, args->filter_str); + max_unpack |= filter_max_unpack(args->filter); + } + args->files->max_unpack = max_unpack; +} + +static void destroy_data(args_t *args) +{ + convert_destroy(args->convert); + if ( args->filter ) + filter_destroy(args->filter); +} + +static void query_vcf(args_t *args) +{ + kstring_t str = {0,0,0}; + + if ( args->print_header ) + { + convert_header(args->convert,&str); + if ( fwrite(str.s, str.l, 1, args->out)!=1 ) error("[%s] Error: cannot write to %s\n", __func__,args->fn_out?args->fn_out:"standard output"); + } + + int i,max_convert_unpack = convert_max_unpack(args->convert); + while ( bcf_sr_next_line(args->files) ) + { + if ( !bcf_sr_has_line(args->files,0) ) continue; + bcf1_t *line = args->files->readers[0].buffer[0]; + bcf_unpack(line, args->files->max_unpack); + + if ( args->filter ) + { + int pass = filter_test(args->filter, line, (const uint8_t**) &args->smpl_pass); + if ( args->filter_logic & FLT_EXCLUDE ) + { + // This code addresses this problem: + // -i can include a site but exclude a sample + // -e exclude a site but include a sample + + if ( pass ) + { + if ( !args->smpl_pass ) continue; + if ( !(max_convert_unpack & BCF_UN_FMT) ) continue; + + pass = 0; + for (i=0; in_sample; i++) + { + if ( args->smpl_pass[i] ) args->smpl_pass[i] = 0; + else { args->smpl_pass[i] = 1; pass = 1; } + } + if ( !pass ) continue; + } + else if ( args->smpl_pass ) + for (i=0; in_sample; i++) args->smpl_pass[i] = 1; + } + else if ( !pass ) continue; + } + + str.l = 0; + convert_line(args->convert, line, &str); + if ( str.l && fwrite(str.s, str.l, 1, args->out)!=1 ) error("[%s] Error: cannot write to %s\n", __func__,args->fn_out?args->fn_out:"standard output"); + } + if ( str.m ) free(str.s); +} + +static void list_columns(args_t *args) +{ + int negate = 0; + int i; + bcf_sr_t *reader = &args->files->readers[0]; + void *has_sample = NULL; + if ( args->sample_list ) + { + if ( args->sample_list[0]=='^' ) negate = 1; + has_sample = khash_str2int_init(); + int i, nsmpl; + char **smpl = hts_readlist(negate ? args->sample_list+1 : args->sample_list, args->sample_is_file, &nsmpl); + if ( !smpl ) error("Error: failed to read %s\n", negate ? args->sample_list+1 : args->sample_list); + for (i=0; iheader,BCF_DT_SAMPLE,smpl[i])<0 && !args->force_samples ) + error("Error: sample #%d not found in the header, user --force-samples to proceed anyway\n", i+1); + khash_str2int_inc(has_sample, smpl[i]); + } + free(smpl); + } + + for (i=0; iheader); i++) + { + int skip = 0; + if ( negate ) + { + if ( khash_str2int_has_key(has_sample, reader->header->samples[i]) ) skip = 1; + } + else if ( has_sample && !khash_str2int_has_key(has_sample, reader->header->samples[i]) ) skip = 1; + if ( skip ) continue; + printf("%s\n", reader->header->samples[i]); + } + + if ( has_sample ) + khash_str2int_destroy_free(has_sample); +} + +static char **copy_header(bcf_hdr_t *hdr, char **src, int nsrc) +{ + char **dst = (char**) malloc(sizeof(char*)*nsrc); + int i; + for (i=0; i [ [...]]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -e, --exclude EXPR Exclude sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " --force-samples Only warn about unknown subset samples\n"); + fprintf(stderr, " -f, --format STRING See man page for details\n"); + fprintf(stderr, " -H, --print-header Print header\n"); + fprintf(stderr, " -i, --include EXPR Select sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " -l, --list-samples Print the list of samples and exit\n"); + fprintf(stderr, " -o, --output FILE Output file name [stdout]\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --samples LIST List of samples to include\n"); + fprintf(stderr, " -S, --samples-file FILE File of samples to include\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, " -u, --allow-undef-tags Print \".\" for undefined tags\n"); + fprintf(stderr, " -v, --vcf-list FILE Process multiple VCFs listed in the file\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Examples:\n"); + fprintf(stderr, "\tbcftools query -f '%%CHROM\\t%%POS\\t%%REF\\t%%ALT[\\t%%SAMPLE=%%GT]\\n' file.vcf.gz\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfquery(int argc, char *argv[]) +{ + int c, collapse = 0; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"help",0,0,'h'}, + {"list-samples",0,0,'l'}, + {"include",1,0,'i'}, + {"exclude",1,0,'e'}, + {"format",1,0,'f'}, + {"force-samples",0,0,3}, + {"output-file",1,0,'o'}, + {"output",1,0,'o'}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,1}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,2}, + {"annots",1,0,'a'}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"print-header",0,0,'H'}, + {"collapse",1,0,'c'}, + {"vcf-list",1,0,'v'}, + {"allow-undef-tags",0,0,'u'}, + {0,0,0,0} + }; + while ((c = getopt_long(argc, argv, "hlr:R:f:a:s:S:Ht:T:c:v:i:e:o:u",loptions,NULL)) >= 0) { + switch (c) { + case 'o': args->fn_out = optarg; break; + case 'f': args->format_str = strdup(optarg); break; + case 'H': args->print_header = 1; break; + case 'v': args->vcf_list = optarg; break; + case 'c': + error("The --collapse option is obsolete, pipe through `bcftools norm -c` instead.\n"); + break; + case 'a': + { + kstring_t str = {0,0,0}; + kputs("%CHROM\t%POS\t%MASK\t%REF\t%ALT\t%", &str); + char *p = optarg; + while ( *p ) + { + if ( *p==',' ) + kputs("\t%", &str); + else + kputc(*p, &str); + p++; + } + kputc('\n', &str); + args->format_str = str.s; + break; + } + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'l': args->list_columns = 1; break; + case 'u': args->allow_undef_tags = 1; break; + case 's': args->sample_list = optarg; break; + case 'S': args->sample_list = optarg; args->sample_is_file = 1; break; + case 1 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 2 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 3 : args->force_samples = 1; break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; + } + else fname = argv[optind]; + + if ( args->list_columns ) + { + if ( !fname ) error("Missing the VCF file name\n"); + args->files = bcf_sr_init(); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + list_columns(args); + bcf_sr_destroy(args->files); + free(args); + return 0; + } + + if ( !args->format_str ) + { + if ( argc==1 && !fname ) usage(); + error("Error: Missing the --format option\n"); + } + args->out = args->fn_out ? fopen(args->fn_out, "w") : stdout; + if ( !args->out ) error("%s: %s\n", args->fn_out,strerror(errno)); + + if ( !args->vcf_list ) + { + if ( !fname ) usage(); + args->files = bcf_sr_init(); + if ( optind+1 < argc ) args->files->require_index = 1; + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + while ( fname ) + { + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + fname = ++optind < argc ? argv[optind] : NULL; + } + init_data(args); + query_vcf(args); + free(args->format_str); + destroy_data(args); + bcf_sr_destroy(args->files); + if ( fclose(args->out)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fn_out); + free(args); + return 0; + } + + // multiple VCFs + int i, k, nfiles, prev_nsamples = 0; + char **fnames, **prev_samples = NULL; + fnames = hts_readlist(args->vcf_list, 1, &nfiles); + if ( !fnames ) error("Error: failed to read %s\n", args->vcf_list); + if ( !nfiles ) error("No files in %s?\n", args->vcf_list); + for (i=0; ifiles = bcf_sr_init(); + args->files->collapse = collapse; + if ( args->regions_list && bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + if ( optind < argc ) args->files->require_index = 1; + if ( args->targets_list ) + { + if ( bcf_sr_set_targets(args->files, args->targets_list,targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( !bcf_sr_add_reader(args->files, fnames[i]) ) error("Failed to open %s: %s\n", fnames[i],bcf_sr_strerror(args->files->errnum)); + for (k=optind; kfiles, argv[k]) ) error("Failed to open %s: %s\n", argv[k],bcf_sr_strerror(args->files->errnum)); + init_data(args); + if ( i==0 ) + { + prev_samples = copy_header(args->header, args->files->readers[0].header->samples, bcf_hdr_nsamples(args->files->readers[0].header)); + prev_nsamples = bcf_hdr_nsamples(args->files->readers[0].header); + } + else + { + args->print_header = 0; + if ( compare_header(args->header, args->files->readers[0].header->samples, bcf_hdr_nsamples(args->files->readers[0].header), prev_samples, prev_nsamples) ) + error("Different samples in %s and %s\n", fnames[i-1],fnames[i]); + } + query_vcf(args); + destroy_data(args); + bcf_sr_destroy(args->files); + } + if ( fclose(args->out)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fn_out);; + destroy_list(fnames, nfiles); + destroy_list(prev_samples, prev_nsamples); + free(args->format_str); + free(args); + return 0; +} + + diff --git a/bcftools/vcfquery.c.pysam.c b/bcftools/vcfquery.c.pysam.c new file mode 100644 index 0000000..5ffbd64 --- /dev/null +++ b/bcftools/vcfquery.c.pysam.c @@ -0,0 +1,449 @@ +#include "bcftools.pysam.h" + +/* vcfquery.c -- Extracts fields from VCF/BCF file. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "convert.h" +#include "smpl_ilist.h" + + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +typedef struct +{ + filter_t *filter; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + uint8_t *smpl_pass; + convert_t *convert; + bcf_srs_t *files; + bcf_hdr_t *header; + int sample_is_file; + char **argv, *format_str, *sample_list, *targets_list, *regions_list, *vcf_list, *fn_out; + int argc, list_columns, print_header, allow_undef_tags, force_samples; + FILE *out; +} +args_t; + +static void destroy_list(char **list, int n) +{ + int i; + for (i=0; iheader = args->files->readers[0].header; + + int i, nsamples = 0, *samples = NULL; + if ( args->sample_list && strcmp("-",args->sample_list) ) + { + for (i=0; ifiles->nreaders; i++) + { + // This tells htslib to subset samples directly when reading. Also the header is modified to + // include only the requested samples + int ret = bcf_hdr_set_samples(args->files->readers[i].header,args->sample_list,args->sample_is_file); + if ( ret<0 ) error("Error parsing the sample list\n"); + else if ( ret>0 && !args->force_samples ) + error("Error: sample #%d not found in the header, user --force-samples to proceed anyway\n", ret); + } + + int flags = SMPL_REORDER; + smpl_ilist_t *ilist = smpl_ilist_init(args->files->readers[0].header, args->sample_list, args->sample_is_file, flags); + nsamples = ilist->n; + samples = (int*) malloc(sizeof(int)*nsamples); + for (i=0; in; i++) + samples[i] = ilist->idx[i]; + smpl_ilist_destroy(ilist); + } + args->convert = convert_init(args->header, samples, nsamples, args->format_str); + convert_set_option(args->convert, subset_samples, &args->smpl_pass); + if ( args->allow_undef_tags ) convert_set_option(args->convert, allow_undef_tags, 1); + free(samples); + + int max_unpack = convert_max_unpack(args->convert); + if ( args->filter_str ) + { + args->filter = filter_init(args->header, args->filter_str); + max_unpack |= filter_max_unpack(args->filter); + } + args->files->max_unpack = max_unpack; +} + +static void destroy_data(args_t *args) +{ + convert_destroy(args->convert); + if ( args->filter ) + filter_destroy(args->filter); +} + +static void query_vcf(args_t *args) +{ + kstring_t str = {0,0,0}; + + if ( args->print_header ) + { + convert_header(args->convert,&str); + if ( fwrite(str.s, str.l, 1, args->out)!=1 ) error("[%s] Error: cannot write to %s\n", __func__,args->fn_out?args->fn_out:"standard output"); + } + + int i,max_convert_unpack = convert_max_unpack(args->convert); + while ( bcf_sr_next_line(args->files) ) + { + if ( !bcf_sr_has_line(args->files,0) ) continue; + bcf1_t *line = args->files->readers[0].buffer[0]; + bcf_unpack(line, args->files->max_unpack); + + if ( args->filter ) + { + int pass = filter_test(args->filter, line, (const uint8_t**) &args->smpl_pass); + if ( args->filter_logic & FLT_EXCLUDE ) + { + // This code addresses this problem: + // -i can include a site but exclude a sample + // -e exclude a site but include a sample + + if ( pass ) + { + if ( !args->smpl_pass ) continue; + if ( !(max_convert_unpack & BCF_UN_FMT) ) continue; + + pass = 0; + for (i=0; in_sample; i++) + { + if ( args->smpl_pass[i] ) args->smpl_pass[i] = 0; + else { args->smpl_pass[i] = 1; pass = 1; } + } + if ( !pass ) continue; + } + else if ( args->smpl_pass ) + for (i=0; in_sample; i++) args->smpl_pass[i] = 1; + } + else if ( !pass ) continue; + } + + str.l = 0; + convert_line(args->convert, line, &str); + if ( str.l && fwrite(str.s, str.l, 1, args->out)!=1 ) error("[%s] Error: cannot write to %s\n", __func__,args->fn_out?args->fn_out:"standard output"); + } + if ( str.m ) free(str.s); +} + +static void list_columns(args_t *args) +{ + int negate = 0; + int i; + bcf_sr_t *reader = &args->files->readers[0]; + void *has_sample = NULL; + if ( args->sample_list ) + { + if ( args->sample_list[0]=='^' ) negate = 1; + has_sample = khash_str2int_init(); + int i, nsmpl; + char **smpl = hts_readlist(negate ? args->sample_list+1 : args->sample_list, args->sample_is_file, &nsmpl); + if ( !smpl ) error("Error: failed to read %s\n", negate ? args->sample_list+1 : args->sample_list); + for (i=0; iheader,BCF_DT_SAMPLE,smpl[i])<0 && !args->force_samples ) + error("Error: sample #%d not found in the header, user --force-samples to proceed anyway\n", i+1); + khash_str2int_inc(has_sample, smpl[i]); + } + free(smpl); + } + + for (i=0; iheader); i++) + { + int skip = 0; + if ( negate ) + { + if ( khash_str2int_has_key(has_sample, reader->header->samples[i]) ) skip = 1; + } + else if ( has_sample && !khash_str2int_has_key(has_sample, reader->header->samples[i]) ) skip = 1; + if ( skip ) continue; + fprintf(bcftools_stdout, "%s\n", reader->header->samples[i]); + } + + if ( has_sample ) + khash_str2int_destroy_free(has_sample); +} + +static char **copy_header(bcf_hdr_t *hdr, char **src, int nsrc) +{ + char **dst = (char**) malloc(sizeof(char*)*nsrc); + int i; + for (i=0; i [ [...]]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -e, --exclude EXPR Exclude sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " --force-samples Only warn about unknown subset samples\n"); + fprintf(bcftools_stderr, " -f, --format STRING See man page for details\n"); + fprintf(bcftools_stderr, " -H, --print-header Print header\n"); + fprintf(bcftools_stderr, " -i, --include EXPR Select sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " -l, --list-samples Print the list of samples and exit\n"); + fprintf(bcftools_stderr, " -o, --output FILE Output file name [bcftools_stdout]\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --samples LIST List of samples to include\n"); + fprintf(bcftools_stderr, " -S, --samples-file FILE File of samples to include\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, " -u, --allow-undef-tags Print \".\" for undefined tags\n"); + fprintf(bcftools_stderr, " -v, --vcf-list FILE Process multiple VCFs listed in the file\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Examples:\n"); + fprintf(bcftools_stderr, "\tbcftools query -f '%%CHROM\\t%%POS\\t%%REF\\t%%ALT[\\t%%SAMPLE=%%GT]\\n' file.vcf.gz\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfquery(int argc, char *argv[]) +{ + int c, collapse = 0; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"help",0,0,'h'}, + {"list-samples",0,0,'l'}, + {"include",1,0,'i'}, + {"exclude",1,0,'e'}, + {"format",1,0,'f'}, + {"force-samples",0,0,3}, + {"output-file",1,0,'o'}, + {"output",1,0,'o'}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,1}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,2}, + {"annots",1,0,'a'}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"print-header",0,0,'H'}, + {"collapse",1,0,'c'}, + {"vcf-list",1,0,'v'}, + {"allow-undef-tags",0,0,'u'}, + {0,0,0,0} + }; + while ((c = getopt_long(argc, argv, "hlr:R:f:a:s:S:Ht:T:c:v:i:e:o:u",loptions,NULL)) >= 0) { + switch (c) { + case 'o': args->fn_out = optarg; break; + case 'f': args->format_str = strdup(optarg); break; + case 'H': args->print_header = 1; break; + case 'v': args->vcf_list = optarg; break; + case 'c': + error("The --collapse option is obsolete, pipe through `bcftools norm -c` instead.\n"); + break; + case 'a': + { + kstring_t str = {0,0,0}; + kputs("%CHROM\t%POS\t%MASK\t%REF\t%ALT\t%", &str); + char *p = optarg; + while ( *p ) + { + if ( *p==',' ) + kputs("\t%", &str); + else + kputc(*p, &str); + p++; + } + kputc('\n', &str); + args->format_str = str.s; + break; + } + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'l': args->list_columns = 1; break; + case 'u': args->allow_undef_tags = 1; break; + case 's': args->sample_list = optarg; break; + case 'S': args->sample_list = optarg; args->sample_is_file = 1; break; + case 1 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 2 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 3 : args->force_samples = 1; break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; + } + else fname = argv[optind]; + + if ( args->list_columns ) + { + if ( !fname ) error("Missing the VCF file name\n"); + args->files = bcf_sr_init(); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + list_columns(args); + bcf_sr_destroy(args->files); + free(args); + return 0; + } + + if ( !args->format_str ) + { + if ( argc==1 && !fname ) usage(); + error("Error: Missing the --format option\n"); + } + args->out = args->fn_out ? fopen(args->fn_out, "w") : bcftools_stdout; + if ( !args->out ) error("%s: %s\n", args->fn_out,strerror(errno)); + + if ( !args->vcf_list ) + { + if ( !fname ) usage(); + args->files = bcf_sr_init(); + if ( optind+1 < argc ) args->files->require_index = 1; + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + while ( fname ) + { + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + fname = ++optind < argc ? argv[optind] : NULL; + } + init_data(args); + query_vcf(args); + free(args->format_str); + destroy_data(args); + bcf_sr_destroy(args->files); + if ( fclose(args->out)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fn_out); + free(args); + return 0; + } + + // multiple VCFs + int i, k, nfiles, prev_nsamples = 0; + char **fnames, **prev_samples = NULL; + fnames = hts_readlist(args->vcf_list, 1, &nfiles); + if ( !fnames ) error("Error: failed to read %s\n", args->vcf_list); + if ( !nfiles ) error("No files in %s?\n", args->vcf_list); + for (i=0; ifiles = bcf_sr_init(); + args->files->collapse = collapse; + if ( args->regions_list && bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + if ( optind < argc ) args->files->require_index = 1; + if ( args->targets_list ) + { + if ( bcf_sr_set_targets(args->files, args->targets_list,targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( !bcf_sr_add_reader(args->files, fnames[i]) ) error("Failed to open %s: %s\n", fnames[i],bcf_sr_strerror(args->files->errnum)); + for (k=optind; kfiles, argv[k]) ) error("Failed to open %s: %s\n", argv[k],bcf_sr_strerror(args->files->errnum)); + init_data(args); + if ( i==0 ) + { + prev_samples = copy_header(args->header, args->files->readers[0].header->samples, bcf_hdr_nsamples(args->files->readers[0].header)); + prev_nsamples = bcf_hdr_nsamples(args->files->readers[0].header); + } + else + { + args->print_header = 0; + if ( compare_header(args->header, args->files->readers[0].header->samples, bcf_hdr_nsamples(args->files->readers[0].header), prev_samples, prev_nsamples) ) + error("Different samples in %s and %s\n", fnames[i-1],fnames[i]); + } + query_vcf(args); + destroy_data(args); + bcf_sr_destroy(args->files); + } + if ( fclose(args->out)!=0 ) error("[%s] Error: close failed .. %s\n", __func__,args->fn_out);; + destroy_list(fnames, nfiles); + destroy_list(prev_samples, prev_nsamples); + free(args->format_str); + free(args); + return 0; +} + + diff --git a/bcftools/vcfroh.c b/bcftools/vcfroh.c new file mode 100644 index 0000000..a0802db --- /dev/null +++ b/bcftools/vcfroh.c @@ -0,0 +1,1301 @@ +/* vcfroh.c -- HMM model for detecting runs of autozygosity. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "HMM.h" +#include "smpl_ilist.h" +#include "filter.h" + +#define STATE_HW 0 // normal state, follows Hardy-Weinberg allele frequencies +#define STATE_AZ 1 // autozygous state + +#define OUTPUT_ST (1<<1) +#define OUTPUT_RG (1<<2) +#define OUTPUT_GZ (1<<3) + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + + +/** Genetic map */ +typedef struct +{ + int pos; + double rate; +} +genmap_t; + +/** HMM data for each sample */ +typedef struct +{ + double *eprob; // emission probs [2*nsites,msites] + uint32_t *sites; // positions [nsites,msites] + int nsites, msites; + int igenmap; // current position in genmap + int nused; // some stats to detect if things didn't go wrong + int nrid, *rid, *rid_off; // for viterbi training, keep all chromosomes + void *snapshot; // hmm snapshot + struct { + uint32_t beg,end,nqual; + double qual; + int rid, state; + } rg; +} +smpl_t; + +typedef struct _args_t +{ + bcf_srs_t *files; + bcf_hdr_t *hdr; + double t2AZ, t2HW; // P(AZ|HW) and P(HW|AZ) parameters + double unseen_PL, dflt_AF; + + char *genmap_fname; + genmap_t *genmap; + int ngenmap, mgenmap, igenmap; + double rec_rate; // constant recombination rate if > 0 + + hmm_t *hmm; + double baum_welch_th; + int nrids, *rids, *rid_offs; // multiple chroms with vi_training + int nbuf_max, nbuf_olap; + + float *AFs; + int32_t *itmp; + int mAFs, nitmp, mitmp, pl_hdr_id, gt_hdr_id; + + double pl2p[256], *pdg; + int32_t skip_rid, prev_rid, prev_pos; + + int ntot; // some stats to detect if things didn't go wrong + int nno_af; // number of sites rejected because AF could not be determined + int nfiltered; // .. because of filters + int nno_alt, nmultiallelic, ndup; + smpl_t *smpl; // HMM data for each sample + smpl_ilist_t *af_smpl; // list of samples to estimate AF from (--estimate-AF) + smpl_ilist_t *roh_smpl; // list of samples to analyze (--samples, --samples-file) + char *estimate_AF; // list of samples for AF estimate and query sample + int af_from_PL; // estimate AF from FMT/PL rather than FMT/GT + char **argv, *targets_list, *regions_list, *af_fname, *af_tag, *samples, *buffer_size, *output_fname; + int argc, fake_PLs, snps_only, vi_training, samples_is_file, output_type, skip_homref, n_threads; + int include_noalt_sites; + BGZF *out; + kstring_t str; + + int filter_logic; + filter_t *filter; + char *filter_str; +} +args_t; + +void set_tprob_genmap(hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob); +void set_tprob_rrate(hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob); + +void *smalloc(size_t size) +{ + void *mem = malloc(size); + if ( !mem ) error("malloc: Could not allocate %d bytes\n", (int)size); + return mem; +} + +static inline int max255(int i) +{ + return i < 256 ? i : 255; +} + +static void init_data(args_t *args) +{ + int i; + + args->prev_rid = args->skip_rid = -1; + args->hdr = args->files->readers[0].header; + + if ( !bcf_hdr_nsamples(args->hdr) ) error("No samples in the VCF?\n"); + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + + if ( !args->fake_PLs ) + { + args->pl_hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "PL"); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,args->pl_hdr_id) ) + error("Error: The FORMAT/PL tag not found in the header, consider running with -G\n"); + if ( bcf_hdr_id2type(args->hdr,BCF_HL_FMT,args->pl_hdr_id)!=BCF_HT_INT ) + error("Error: The FORMAT/PL tag not defined as Integer in the header\n"); + } + + if ( args->estimate_AF ) + { + if ( !strncmp("GT,",args->estimate_AF,3) ) args->estimate_AF += 3; + else if ( !strncmp("PL,",args->estimate_AF,3) ) { args->estimate_AF += 3; args->af_from_PL = 1; } + if ( strcmp("-",args->estimate_AF) ) + args->af_smpl = smpl_ilist_init(args->hdr, args->estimate_AF, 1, SMPL_NONE|SMPL_VERBOSE); + } + + if ( args->estimate_AF || args->fake_PLs ) + { + if ( args->af_from_PL ) + { + args->pl_hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "PL"); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,args->pl_hdr_id) ) + error("Error: The FORMAT/PL tag not found in the header\n"); + } + else + { + args->gt_hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,args->gt_hdr_id) ) + error("Error: The FORMAT/GT tag not found in the header\n"); + } + } + if ( args->fake_PLs ) + { + args->gt_hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,args->gt_hdr_id) ) + error("Error: The FORMAT/GT tag not found in the header\n"); + } + + args->roh_smpl = smpl_ilist_init(args->hdr, args->samples, args->samples_is_file, SMPL_NONE|SMPL_VERBOSE); + if ( args->samples ) + { + // we may be able to subset to a few samples, for a text VCF this can be a major speedup + if ( (bcf_sr_get_reader(args->files,0))->file->format.format==vcf ) + { + kstring_t str = {0,0,0}; + smpl_ilist_t *tmp = args->roh_smpl, *rmme = NULL; + if ( args->af_smpl ) + { + for (i=0; iroh_smpl->n; i++) + { + if ( str.l ) kputc(',', &str); + kputs(args->hdr->samples[args->roh_smpl->idx[i]], &str); + } + for (i=0; iaf_smpl->n; i++) + { + kputc(',', &str); + kputs(args->hdr->samples[args->af_smpl->idx[i]], &str); + } + rmme = tmp = smpl_ilist_init(args->hdr, str.s, 0, SMPL_NONE); + } + if ( tmp->n < bcf_hdr_nsamples(args->hdr) ) + { + str.l = 0; + for (i=0; in; i++) + { + if ( str.l ) kputc(',', &str); + kputs(args->hdr->samples[tmp->idx[i]], &str); + } + int ret = bcf_hdr_set_samples(args->hdr, str.s, 0); + if ( ret<0 ) error("Error parsing the list of samples: %s\n", str.s); + else if ( ret>0 ) error("The %d-th sample not found in the VCF: %s\n", ret,str.s); + + // update sample ids + smpl_ilist_destroy(args->roh_smpl); + args->roh_smpl = smpl_ilist_init(args->hdr, args->samples, args->samples_is_file, SMPL_NONE); + + if ( args->af_smpl ) + { + smpl_ilist_destroy(args->af_smpl); + args->af_smpl = smpl_ilist_init(args->hdr, args->estimate_AF, 1, SMPL_NONE); + } + } + free(str.s); + if ( rmme ) + smpl_ilist_destroy(rmme); + } + } + + // check whether all samples are in this list. If so, the lookup will not be needed + if ( args->af_smpl && args->af_smpl->n == bcf_hdr_nsamples(args->hdr) ) + { + // all samples are in this list + smpl_ilist_destroy(args->af_smpl); + args->af_smpl = NULL; + } + + if ( args->buffer_size ) + { + args->nbuf_olap = -1; + char *end; + double tmp = strtod(args->buffer_size,&end); + if ( *end ) + { + if ( *end!=',') error("Could not parse: --buffer-size %s\n", args->buffer_size); + args->nbuf_olap = strtol(end+1,&end,10); + if ( *end || args->nbuf_olap<0 ) error("Could not parse: --bufer-size %s\n", args->buffer_size); + } + if ( tmp<0 ) + args->nbuf_max = fabs(tmp)*1e6/(4+8*2)/args->roh_smpl->n; + else + args->nbuf_max = tmp; + + if ( args->nbuf_olap<0 ) + args->nbuf_olap = args->nbuf_max*0.01; + } + fprintf(stderr,"Number of target samples: %d\n", args->roh_smpl->n); + fprintf(stderr,"Number of --estimate-AF samples: %d\n", args->af_smpl ? args->af_smpl->n : (args->estimate_AF ? bcf_hdr_nsamples(args->hdr) : 0)); + fprintf(stderr,"Number of sites in the buffer/overlap: "); + if ( args->nbuf_max ) fprintf(stderr,"%d/%d\n", args->nbuf_max,args->nbuf_olap); + else fprintf(stderr,"unlimited\n"); + + args->smpl = (smpl_t*) calloc(args->roh_smpl->n,sizeof(smpl_t)); + + for (i=0; i<256; i++) args->pl2p[i] = pow(10., -i/10.); + + // Init transition matrix and HMM + double tprob[4]; + MAT(tprob,2,STATE_HW,STATE_HW) = 1 - args->t2AZ; + MAT(tprob,2,STATE_HW,STATE_AZ) = args->t2HW; + MAT(tprob,2,STATE_AZ,STATE_HW) = args->t2AZ; + MAT(tprob,2,STATE_AZ,STATE_AZ) = 1 - args->t2HW; + + args->hmm = hmm_init(2, tprob, 10000); + if ( args->genmap_fname ) + hmm_set_tprob_func(args->hmm, set_tprob_genmap, args); + else if ( args->rec_rate > 0 ) + hmm_set_tprob_func(args->hmm, set_tprob_rrate, args); + + args->out = bgzf_open(strcmp("stdout",args->output_fname)?args->output_fname:"-", args->output_type&OUTPUT_GZ ? "wg" : "wu"); + if ( !args->out ) error("Failed to open %s: %s\n", args->output_fname, strerror(errno)); + + // print header + args->str.l = 0; + ksprintf(&args->str, "# This file was produced by: bcftools roh(%s+htslib-%s)\n", bcftools_version(),hts_version()); + ksprintf(&args->str, "# The command line was:\tbcftools %s", args->argv[0]); + for (i=1; iargc; i++) + ksprintf(&args->str, " %s",args->argv[i]); + ksprintf(&args->str, "\n#\n"); + if ( args->output_type & OUTPUT_RG ) + { + i = 2; + ksprintf(&args->str, "# RG"); + ksprintf(&args->str, "\t[%d]Sample", i++); + ksprintf(&args->str, "\t[%d]Chromosome", i++); + ksprintf(&args->str, "\t[%d]Start", i++); + ksprintf(&args->str, "\t[%d]End", i++); + ksprintf(&args->str, "\t[%d]Length (bp)", i++); + ksprintf(&args->str, "\t[%d]Number of markers", i++); + ksprintf(&args->str, "\t[%d]Quality (average fwd-bwd phred score)", i++); + ksprintf(&args->str, "\n"); + } + if ( args->output_type & OUTPUT_ST ) + { + i = 2; + ksprintf(&args->str, "# ST"); + ksprintf(&args->str, "\t[%d]Sample", i++); + ksprintf(&args->str, "\t[%d]Chromosome", i++); + ksprintf(&args->str, "\t[%d]Position", i++); + ksprintf(&args->str, "\t[%d]State (0:HW, 1:AZ)", i++); + ksprintf(&args->str, "\t[%d]Quality (fwd-bwd phred score)", i++); + ksprintf(&args->str, "\n"); + } + if ( args->vi_training) + { + i = 2; + ksprintf(&args->str, "# VT, Viterbi Training"); + ksprintf(&args->str, "\t[%d]Sample", i++); + ksprintf(&args->str, "\t[%d]Iteration", i++); + ksprintf(&args->str, "\t[%d]dAZ", i++); + ksprintf(&args->str, "\t[%d]dHW", i++); + ksprintf(&args->str, "\t[%d]1 - P(HW|HW)", i++); + ksprintf(&args->str, "\t[%d]P(AZ|HW)", i++); + ksprintf(&args->str, "\t[%d]1 - P(AZ|AZ)", i++); + ksprintf(&args->str, "\t[%d]P(HW|AZ)", i++); + ksprintf(&args->str, "\n"); + } + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) + error("Error writing %s: %s\n", args->output_fname, strerror(errno)); +} + +static void destroy_data(args_t *args) +{ + if ( args->filter ) filter_destroy(args->filter); + if ( bgzf_close(args->out)!=0 ) error("Error: close failed .. %s\n", args->output_fname); + int i; + for (i=0; iroh_smpl->n; i++) + { + free(args->smpl[i].eprob); + free(args->smpl[i].sites); + free(args->smpl[i].rid); + free(args->smpl[i].rid_off); + free(args->smpl[i].snapshot); + } + free(args->str.s); + free(args->smpl); + if ( args->af_smpl ) smpl_ilist_destroy(args->af_smpl); + smpl_ilist_destroy(args->roh_smpl); + free(args->rids); + free(args->rid_offs); + hmm_destroy(args->hmm); + bcf_sr_destroy(args->files); + free(args->AFs); free(args->pdg); + free(args->genmap); + free(args->itmp); + free(args->samples); +} + +static int load_genmap(args_t *args, const char *chr) +{ + if ( !args->genmap_fname ) { args->ngenmap = 0; return 0; } + + kstring_t str = {0,0,0}; + char *fname = strstr(args->genmap_fname,"{CHROM}"); + if ( fname ) + { + kputsn(args->genmap_fname, fname - args->genmap_fname, &str); + kputs(chr, &str); + kputs(fname+7,&str); + fname = str.s; + } + else + fname = args->genmap_fname; + + htsFile *fp = hts_open(fname, "rb"); + if ( !fp ) + { + args->ngenmap = 0; + return -1; + } + + hts_getline(fp, KS_SEP_LINE, &str); + if ( strcmp(str.s,"position COMBINED_rate(cM/Mb) Genetic_Map(cM)") ) + error("Unexpected header in %s, found:\n\t[%s], but expected:\n\t[position COMBINED_rate(cM/Mb) Genetic_Map(cM)]\n", fname, str.s); + + args->ngenmap = args->igenmap = 0; + while ( hts_getline(fp, KS_SEP_LINE, &str) > 0 ) + { + args->ngenmap++; + hts_expand(genmap_t,args->ngenmap,args->mgenmap,args->genmap); + genmap_t *gm = &args->genmap[args->ngenmap-1]; + + // position, convert to 0-based + char *tmp, *end; + gm->pos = strtol(str.s, &tmp, 10); + if ( str.s==tmp ) error("Could not parse %s: %s\n", fname, str.s); + gm->pos -= 1; + + // skip second column + tmp++; + while ( *tmp && !isspace(*tmp) ) tmp++; + + // read the genetic map in cM, scale from % to likelihood + gm->rate = strtod(tmp+1, &end); + if ( tmp+1==end ) error("Could not parse %s: %s\n", fname, str.s); + gm->rate *= 0.01; + } + if ( !args->ngenmap ) error("Genetic map empty?\n"); + if ( hts_close(fp) ) error("Close failed\n"); + free(str.s); + return 0; +} + +static double get_genmap_rate(args_t *args, int start, int end) +{ + // position i to be equal to or smaller than start + int i = args->igenmap; + if ( args->genmap[i].pos > start ) + { + while ( i>0 && args->genmap[i].pos > start ) i--; + } + else + { + while ( i+1ngenmap && args->genmap[i+1].pos < start ) i++; + } + // position j to be equal or larger than end + int j = i; + while ( j+1ngenmap && args->genmap[j].pos < end ) j++; + if ( i==j ) + { + args->igenmap = i; + return 0; + } + + if ( start < args->genmap[i].pos ) start = args->genmap[i].pos; + if ( end > args->genmap[j].pos ) end = args->genmap[j].pos; + double rate = (args->genmap[j].rate - args->genmap[i].rate)/(args->genmap[j].pos - args->genmap[i].pos) * (end-start); + args->igenmap = j; + return rate; +} + +void set_tprob_genmap(hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob) +{ + args_t *args = (args_t*) data; + double ci = get_genmap_rate(args, prev_pos, pos); + if ( args->rec_rate ) ci *= args->rec_rate; + if ( ci > 1 ) ci = 1; + MAT(tprob,2,STATE_HW,STATE_AZ) *= ci; + MAT(tprob,2,STATE_AZ,STATE_HW) *= ci; + MAT(tprob,2,STATE_AZ,STATE_AZ) = 1 - MAT(tprob,2,STATE_HW,STATE_AZ); + MAT(tprob,2,STATE_HW,STATE_HW) = 1 - MAT(tprob,2,STATE_AZ,STATE_HW); +} + +void set_tprob_rrate(hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob) +{ + args_t *args = (args_t*) data; + double ci = (pos - prev_pos) * args->rec_rate; + if ( ci > 1 ) ci = 1; + MAT(tprob,2,STATE_HW,STATE_AZ) *= ci; + MAT(tprob,2,STATE_AZ,STATE_HW) *= ci; + MAT(tprob,2,STATE_AZ,STATE_AZ) = 1 - MAT(tprob,2,STATE_HW,STATE_AZ); + MAT(tprob,2,STATE_HW,STATE_HW) = 1 - MAT(tprob,2,STATE_AZ,STATE_HW); +} + + +/** + * This function implements the HMM model: + * D = Data, AZ = autozygosity, HW = Hardy-Weinberg (non-autozygosity), + * f = non-ref allele frequency + * + * Emission probabilities: + * oAZ = P_i(D|AZ) = (1-f)*P(D|RR) + f*P(D|AA) + * oHW = P_i(D|HW) = (1-f)^2 * P(D|RR) + f^2 * P(D|AA) + 2*f*(1-f)*P(D|RA) + * + * Transition probabilities: + * tAZ = P(AZ|HW) .. parameter + * tHW = P(HW|AZ) .. parameter + * + * ci = P_i(C) .. probability of cross-over at site i, from genetic map + * + * AZi = P_i(AZ) .. probability of site i being AZ/non-AZ, scaled so that AZi+HWi = 1 + * HWi = P_i(HW) + * + * P_i(AZ|HW) = P(AZ|HW) * ci * HW{i-1} = tAZ * ci * (1 - AZ{i-1}) + * P_i(HW|AZ) = P(HW|AZ) * ci * AZ{i-1} = tHW * ci * AZ{i-1} + * P_i(AZ|AZ) = 1 - P_i(HW|AZ) + * P_i(HW|HW) = 1 - P_i(AZ|HW) + * + */ + +static void flush_viterbi(args_t *args, int ismpl) +{ + smpl_t *smpl = &args->smpl[ismpl]; + if ( !smpl->nsites ) return; + + const char *name = args->hdr->samples[ args->roh_smpl->idx[ismpl] ]; + + int i,j,k; + + if ( !args->vi_training ) // single viterbi pass + { + hmm_restore(args->hmm, smpl->snapshot); + int end = (args->nbuf_max && smpl->nsites >= args->nbuf_max && smpl->nsites > args->nbuf_olap) ? smpl->nsites - args->nbuf_olap : smpl->nsites; + if ( end < smpl->nsites ) + smpl->snapshot = hmm_snapshot(args->hmm, smpl->snapshot, smpl->sites[smpl->nsites - args->nbuf_olap - 1]); + + args->igenmap = smpl->igenmap; + hmm_run_viterbi(args->hmm, smpl->nsites, smpl->eprob, smpl->sites); + hmm_run_fwd_bwd(args->hmm, smpl->nsites, smpl->eprob, smpl->sites); + double *fwd = hmm_get_fwd_bwd_prob(args->hmm); + + const char *chr = bcf_hdr_id2name(args->hdr,args->prev_rid); + uint8_t *vpath = hmm_get_viterbi_path(args->hmm); + + for (i=0; ioutput_type & OUTPUT_ST ) + { + args->str.l = 0; + ksprintf(&args->str, "ST\t%s\t%s\t%d\t%d\t%.1f\n", name,chr,smpl->sites[i]+1, state, qual); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + } + + if ( args->output_type & OUTPUT_RG ) + { + if ( state!=smpl->rg.state ) + { + if ( !state ) // the region ends, flush + { + args->str.l = 0; + ksprintf(&args->str, "RG\t%s\t%s\t%d\t%d\t%d\t%d\t%.1f\n",name,bcf_hdr_id2name(args->hdr,smpl->rg.rid), + smpl->rg.beg+1,smpl->rg.end+1,smpl->rg.end-smpl->rg.beg+1,smpl->rg.nqual,smpl->rg.qual/smpl->rg.nqual); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + smpl->rg.state = 0; + } + else + { + smpl->rg.state = 1; + smpl->rg.beg = smpl->sites[i]; + smpl->rg.end = smpl->sites[i]; + smpl->rg.rid = args->prev_rid; + smpl->rg.qual = qual; + smpl->rg.nqual = 1; + } + } + else if ( state ) + { + smpl->rg.nqual++; + smpl->rg.qual += qual; + smpl->rg.end = smpl->sites[i]; + } + } + } + + if ( end < smpl->nsites ) + { + end = smpl->nsites - args->nbuf_olap; + memmove(smpl->sites, smpl->sites + end, sizeof(*smpl->sites)*args->nbuf_olap); + memmove(smpl->eprob, smpl->eprob + end*2, sizeof(*smpl->eprob)*args->nbuf_olap*2); + smpl->nsites = args->nbuf_olap; + smpl->igenmap = args->igenmap; + } + else + { + smpl->nsites = 0; + smpl->igenmap = 0; + + if ( smpl->rg.state ) + { + args->str.l = 0; + ksprintf(&args->str, "RG\t%s\t%s\t%d\t%d\t%d\t%d\t%.1f\n",name,bcf_hdr_id2name(args->hdr,smpl->rg.rid), + smpl->rg.beg+1,smpl->rg.end+1,smpl->rg.end-smpl->rg.beg+1,smpl->rg.nqual,smpl->rg.qual/smpl->rg.nqual); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + smpl->rg.state = 0; + } + } + + return; + } + + + // viterbi training, multiple chromosomes + double t2az_prev, t2hw_prev; + double deltaz, delthw; + + double *tprob_arr = hmm_get_tprob(args->hmm); + MAT(tprob_arr,2,STATE_HW,STATE_HW) = 1 - args->t2AZ; + MAT(tprob_arr,2,STATE_HW,STATE_AZ) = args->t2HW; + MAT(tprob_arr,2,STATE_AZ,STATE_HW) = args->t2AZ; + MAT(tprob_arr,2,STATE_AZ,STATE_AZ) = 1 - args->t2HW; + hmm_set_tprob(args->hmm, tprob_arr, 10000); + + int niter = 0; + do + { + tprob_arr = hmm_get_tprob(args->hmm); + t2az_prev = MAT(tprob_arr,2,STATE_AZ,STATE_HW); //args->t2AZ; + t2hw_prev = MAT(tprob_arr,2,STATE_HW,STATE_AZ); //args->t2HW; + double tprob_new[] = { 0,0,0,0 }; + for (i=0; inrid; i++) + { + int ioff = smpl->rid_off[i]; + int nsites = (i+1==smpl->nrid ? smpl->nsites : smpl->rid_off[i+1]) - ioff; + args->igenmap = 0; + tprob_arr = hmm_run_baum_welch(args->hmm, nsites, smpl->eprob+ioff*2, smpl->sites+ioff); + for (j=0; j<2; j++) + for (k=0; k<2; k++) MAT(tprob_new,2,j,k) += MAT(tprob_arr,2,j,k); + } + for (j=0; j<2; j++) + for (k=0; k<2; k++) MAT(tprob_new,2,j,k) /= smpl->nrid; + + hmm_set_tprob(args->hmm, tprob_new, 10000); + + deltaz = fabs(MAT(tprob_new,2,STATE_AZ,STATE_HW)-t2az_prev); + delthw = fabs(MAT(tprob_new,2,STATE_HW,STATE_AZ)-t2hw_prev); + niter++; + args->str.l = 0; + ksprintf(&args->str, "VT\t%s\t%d\t%e\t%e\t%e\t%e\t%e\t%e\n", + name,niter,deltaz,delthw, + 1-MAT(tprob_new,2,STATE_HW,STATE_HW),MAT(tprob_new,2,STATE_AZ,STATE_HW), + 1-MAT(tprob_new,2,STATE_AZ,STATE_AZ),MAT(tprob_new,2,STATE_HW,STATE_AZ)); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + } + while ( deltaz > args->baum_welch_th || delthw > args->baum_welch_th ); + + // output the results + for (i=0; inrid; i++) + { + int ioff = smpl->rid_off[i]; + int nsites = (i+1==smpl->nrid ? smpl->nsites : smpl->rid_off[i+1]) - ioff; + args->igenmap = 0; + hmm_run_viterbi(args->hmm, nsites, smpl->eprob+ioff*2, smpl->sites+ioff); + hmm_run_fwd_bwd(args->hmm, nsites, smpl->eprob+ioff*2, smpl->sites+ioff); + uint8_t *vpath = hmm_get_viterbi_path(args->hmm); + double *fwd = hmm_get_fwd_bwd_prob(args->hmm); + + const char *chr = bcf_hdr_id2name(args->hdr,smpl->rid[i]); + for (j=0; jstr.l = 0; + ksprintf(&args->str, "ROH\t%s\t%s\t%d\t%d\t%.1f\n", name,chr,smpl->sites[ioff+j]+1, state, phred_score(1.0-pval[state])); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + } + } +} + +int read_AF(bcf_sr_regions_t *tgt, bcf1_t *line, double *alt_freq) +{ + if ( tgt->nals < 2 ) + error("Expected two comma-separated alleles (REF,ALT) in the third column of %s, found:\n\t%s\n", tgt->fname,tgt->line.s); + if ( tgt->nals != line->n_allele ) return -1; // number of alleles does not match + + int i; + for (i=0; inals; i++) + if ( strcmp(line->d.allele[i],tgt->als[i]) ) break; // we could be smarter, see vcmp + if ( inals ) return -1; + + char *tmp, *str = tgt->line.s; + i = 0; + while ( *str && i<3 ) + { + if ( *str=='\t' ) i++; + str++; + } + *alt_freq = strtod(str, &tmp); + if ( *tmp && !isspace(*tmp) ) + { + if ( str[0]=='.' && (!str[1] || isspace(str[1])) ) return -1; // missing value + error("Could not parse: [%s]\n", tgt->line.s); + } + if ( *alt_freq<0 || *alt_freq>1 ) error("Could not parse AF: [%s]\n", tgt->line.s); + return 0; +} + +int8_t *get_GT(args_t *args, bcf1_t *line) +{ + int i; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==args->gt_hdr_id ) break; + if ( i==line->n_fmt ) return NULL; // the tag is not present in this record + + bcf_fmt_t *fmt = &line->d.fmt[i]; + if ( fmt->n!=2 ) return NULL; // not diploid + + if ( fmt->type!=BCF_BT_INT8 ) error("This is unexpected, GT type is %d\n", fmt->type); + return (int8_t*) fmt->p; +} + +int estimate_AF_from_GT(args_t *args, int8_t *gt, double *alt_freq) +{ + int i, nalt = 0, nref = 0; + if ( args->af_smpl ) // subset samples for AF estimate + { + for (i=0; iaf_smpl->n; i++) + { + int ismpl = args->af_smpl->idx[i]; + if ( bcf_gt_is_missing(gt[2*ismpl]) || bcf_gt_is_missing(gt[2*ismpl+1]) ) continue; + + if ( bcf_gt_allele(gt[2*ismpl]) ) nalt++; + else nref++; + + if ( bcf_gt_allele(gt[2*ismpl+1]) ) nalt++; + else nref++; + } + } + else // all samples used in AF estimate + { + int8_t *end = gt + 2*bcf_hdr_nsamples(args->hdr); + while ( gt < end ) + { + if ( bcf_gt_is_missing(gt[0]) || bcf_gt_is_missing(gt[1]) ) + { + gt += 2; + continue; + } + + if ( bcf_gt_allele(gt[0]) ) nalt++; + else nref++; + + if ( bcf_gt_allele(gt[1]) ) nalt++; + else nref++; + + gt += 2; + } + } + if ( !nalt && !nref ) return -1; + + *alt_freq = (double)nalt / (nalt + nref); + return 0; +} + +int estimate_AF_from_PL(args_t *args, bcf_fmt_t *fmt_pl, int ial, double *alt_freq) +{ + double af = 0; + int i, j, naf = 0; + + int irr = bcf_alleles2gt(0,0), ira = bcf_alleles2gt(0,ial), iaa = bcf_alleles2gt(ial,ial); + if ( iaa >= fmt_pl->n ) return -1; // not diploid or wrong number of fields + + if ( args->af_smpl ) // subset samples for AF estimate + { + #define BRANCH(type_t) \ + { \ + for (i=0; iaf_smpl->n; i++) \ + { \ + int ismpl = args->af_smpl->idx[i]; \ + type_t *p = (type_t*)fmt_pl->p + fmt_pl->n*ismpl; \ + if ( p[irr]<0 || p[ira]<0 || p[iaa]<0 ) continue; /* missing value */ \ + if ( p[irr]==p[ira] && p[irr]==p[iaa] ) continue; /* all values are the same */ \ + double prob[3], norm = 0; \ + prob[0] = args->pl2p[ max255(p[irr]) ]; \ + prob[1] = args->pl2p[ max255(p[ira]) ]; \ + prob[2] = args->pl2p[ max255(p[iaa]) ]; \ + for (j=0; j<3; j++) norm += prob[j]; \ + for (j=0; j<3; j++) prob[j] /= norm; \ + af += 0.5*prob[1] + prob[2]; \ + naf++; \ + } \ + } + switch (fmt_pl->type) { + case BCF_BT_INT8: BRANCH(int8_t); break; + case BCF_BT_INT16: BRANCH(int16_t); break; + case BCF_BT_INT32: BRANCH(int32_t); break; + default: fprintf(stderr,"Unknown format type for PL: %s:%d .. fmt->type=%d\n", __FILE__,__LINE__, fmt_pl->type); exit(1); + } + #undef BRANCH + } + else // all samples used in AF estimate + { + int nsmpl = bcf_hdr_nsamples(args->hdr); + #define BRANCH(type_t) \ + { \ + type_t *p = (type_t*)fmt_pl->p; \ + p -= fmt_pl->n; \ + for (i=0; in; \ + if ( p[irr]<0 || p[ira]<0 || p[iaa]<0 ) continue; /* missing value */ \ + if ( p[irr]==p[ira] && p[irr]==p[iaa] ) continue; /* all values are the same */ \ + double prob[3], norm = 0; \ + prob[0] = args->pl2p[ max255(p[irr]) ]; \ + prob[1] = args->pl2p[ max255(p[ira]) ]; \ + prob[2] = args->pl2p[ max255(p[iaa]) ]; \ + for (j=0; j<3; j++) norm += prob[j]; \ + for (j=0; j<3; j++) prob[j] /= norm; \ + af += 0.5*prob[1] + prob[2]; \ + naf++; \ + } \ + } + switch (fmt_pl->type) { + case BCF_BT_INT8: BRANCH(int8_t); break; + case BCF_BT_INT16: BRANCH(int16_t); break; + case BCF_BT_INT32: BRANCH(int32_t); break; + default: fprintf(stderr,"Unknown format type for PL: %s:%d .. fmt->type=%d\n", __FILE__,__LINE__, fmt_pl->type); exit(1); + } + #undef BRANCH + } + if ( !naf ) return -1; + + *alt_freq = af / naf; + return 0; +} + +bcf_fmt_t *get_PL(args_t *args, bcf1_t *line) +{ + int i; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==args->pl_hdr_id ) return &line->d.fmt[i]; + return NULL; +} + +int process_line(args_t *args, bcf1_t *line, int ial) +{ + if ( !(line->unpacked & BCF_UN_FMT) ) bcf_unpack(line, BCF_UN_FMT); + + double alt_freq; + int8_t *GTs = NULL; + bcf_fmt_t *fmt_pl = NULL; + + // Set allele frequency + int ret = 0, i,j; + if ( args->af_tag ) + { + // Use an INFO tag provided by the user + ret = bcf_get_info_float(args->hdr, line, args->af_tag, &args->AFs, &args->mAFs); + if ( ret>0 ) + alt_freq = args->AFs[ial-1]; + if ( ret==-2 ) + error("Type mismatch for INFO/%s tag at %s:%"PRId64"\n", args->af_tag, bcf_seqname(args->hdr,line), (int64_t) line->pos+1); + } + else if ( args->af_fname ) + { + // Read AF from a file + ret = read_AF(args->files->targets, line, &alt_freq); + } + else if ( args->dflt_AF > 0 ) + { + alt_freq = args->dflt_AF; + } + else if ( args->estimate_AF ) + { + // Estimate AF from GTs or PLs of all samples or samples listed in a file + if ( args->af_from_PL ) + { + fmt_pl = get_PL(args, line); + if ( !fmt_pl ) return -1; + ret = estimate_AF_from_PL(args, fmt_pl, ial, &alt_freq); + } + else + { + GTs = get_GT(args, line); + if ( !GTs ) return -1; + ret = estimate_AF_from_GT(args, GTs, &alt_freq); + } + } + else + { + // Use AC/AN + int AC = -1, AN = 0; + ret = bcf_get_info_int32(args->hdr, line, "AN", &args->itmp, &args->mitmp); + if ( ret==1 ) + { + AN = args->itmp[0]; + ret = bcf_get_info_int32(args->hdr, line, "AC", &args->itmp, &args->mitmp); + if ( ret>0 ) + AC = args->itmp[0]; + } + if ( AN<=0 || AC<0 ) + ret = -1; + else + alt_freq = (double) AC/AN; + } + + if ( args->dflt_AF>0 && (ret<0 || alt_freq==0.0) ) alt_freq = args->dflt_AF; + else if ( ret<0 ) { args->nno_af++; return ret; } + else if ( alt_freq==0.0 ) { args->nno_af++; return -1; } + + int irr = bcf_alleles2gt(0,0), ira = bcf_alleles2gt(0,ial), iaa = bcf_alleles2gt(ial,ial); + if ( args->fake_PLs ) + { + if ( !GTs ) GTs = get_GT(args, line); + } + else + { + fmt_pl = get_PL(args, line); + if ( !fmt_pl ) return -1; + if ( iaa >= fmt_pl->n ) return -1; // not diploid or wrong number of fields + } + + for (i=0; iroh_smpl->n; i++) + { + int ismpl = args->roh_smpl->idx[i]; + + // set P(D|G) + double pdg[3]; + if ( args->fake_PLs ) + { + int8_t *gt = GTs + 2*ismpl; + if ( bcf_gt_is_missing(gt[0]) || bcf_gt_is_missing(gt[1]) ) continue; + + int a = bcf_gt_allele(gt[0]); + int b = bcf_gt_allele(gt[1]); + if ( a!=b ) + { + pdg[0] = pdg[2] = args->unseen_PL; + pdg[1] = 1 - 2*args->unseen_PL; + } + else if ( a==0 ) + { + pdg[0] = 1 - args->unseen_PL - args->unseen_PL*args->unseen_PL; + pdg[1] = args->unseen_PL; + pdg[2] = args->unseen_PL*args->unseen_PL; + } + else + { + pdg[0] = args->unseen_PL*args->unseen_PL; + pdg[1] = args->unseen_PL; + pdg[2] = 1 - args->unseen_PL - args->unseen_PL*args->unseen_PL; + } + } + else + { + #define BRANCH(type_t) \ + { \ + type_t *p = (type_t*)fmt_pl->p + fmt_pl->n*ismpl; \ + if ( p[irr]<0 || p[ira]<0 || p[iaa]<0 ) continue; /* missing value */ \ + if ( p[irr]==p[ira] && p[irr]==p[iaa] ) continue; /* all values are the same */ \ + pdg[0] = args->pl2p[ max255(p[irr]) ]; \ + pdg[1] = args->pl2p[ max255(p[ira]) ]; \ + pdg[2] = args->pl2p[ max255(p[iaa]) ]; \ + } + switch (fmt_pl->type) { + case BCF_BT_INT8: BRANCH(int8_t); break; + case BCF_BT_INT16: BRANCH(int16_t); break; + case BCF_BT_INT32: BRANCH(int32_t); break; + default: fprintf(stderr,"Unknown format type for PL: %s:%d .. fmt->type=%d\n", __FILE__,__LINE__, fmt_pl->type); exit(1); + } + #undef BRANCH + } + + double sum = pdg[0] + pdg[1] + pdg[2]; + if ( !sum ) continue; + for (j=0; j<3; j++) pdg[j] /= sum; + if ( args->skip_homref && pdg[0]>0.99 ) continue; + + smpl_t *smpl = &args->smpl[i]; + smpl->nused++; + + if ( smpl->nsites >= smpl->msites ) + { + hts_expand(uint32_t,smpl->nsites+1,smpl->msites,smpl->sites); + smpl->eprob = (double*) realloc(smpl->eprob,sizeof(*smpl->eprob)*smpl->msites*2); + if ( !smpl->eprob ) error("Error: failed to alloc %"PRIu64" bytes\n", (uint64_t)(sizeof(*smpl->eprob)*smpl->msites*2)); + } + + // Calculate emission probabilities P(D|AZ) and P(D|HW) + double *eprob = &smpl->eprob[2*smpl->nsites]; + eprob[STATE_AZ] = pdg[0]*(1-alt_freq) + pdg[2]*alt_freq; + eprob[STATE_HW] = pdg[0]*(1-alt_freq)*(1-alt_freq) + 2*pdg[1]*(1-alt_freq)*alt_freq + pdg[2]*alt_freq*alt_freq; + + smpl->sites[smpl->nsites] = line->pos; + smpl->nsites++; + + if ( args->vi_training ) + { + if ( !smpl->nrid || line->rid!=smpl->rid[smpl->nrid-1] ) + { + smpl->nrid++; + smpl->rid = (int*) realloc(smpl->rid,sizeof(*smpl->rid)*smpl->nrid); + smpl->rid[smpl->nrid-1] = line->rid; + smpl->rid_off = (int*) realloc(smpl->rid_off,sizeof(*smpl->rid_off)*smpl->nrid); + smpl->rid_off[smpl->nrid-1] = smpl->nsites - 1; + } + } + else if ( args->nbuf_max && smpl->nsites >= args->nbuf_max ) flush_viterbi(args, i); + } + + return 0; +} + +static void vcfroh(args_t *args, bcf1_t *line) +{ + int i; + + // Are we done? + if ( !line ) + { + for (i=0; iroh_smpl->n; i++) flush_viterbi(args, i); + return; + } + + // Skip unwanted lines, for simplicity we consider only biallelic sites + if ( line->rid == args->skip_rid ) return; + + // This can be raw callable VCF with the symbolic unseen allele <*> + int ial = 0, nalt = line->n_allele - 1; + for (i=1; in_allele; i++) + { + if ( !strcmp("<*>",line->d.allele[i]) || !strcmp("",line->d.allele[i]) ) nalt--; + else if ( !ial ) ial = i; + } + + if ( !nalt ) // no ALT allele + { + args->nno_alt++; + if ( !args->include_noalt_sites ) return; + } + else if ( nalt>1 ) + { + args->nmultiallelic++; + return; + } + + if ( args->snps_only && !bcf_is_snp(line) ) return; + + // Initialize genetic map + int skip_rid = 0; + if ( args->prev_rid<0 ) + skip_rid = load_genmap(args, bcf_seqname(args->hdr,line)); + + // New chromosome? + if ( args->prev_rid!=line->rid ) + { + if ( !args->vi_training ) + { + for (i=0; iroh_smpl->n; i++) + { + flush_viterbi(args, i); + hmm_reset(args->hmm, args->smpl[i].snapshot); + } + } + args->prev_rid = line->rid; + args->prev_pos = line->pos; + skip_rid = load_genmap(args, bcf_seqname(args->hdr,line)); + } + else if ( args->prev_pos == line->pos ) + { + args->ndup++; + return; // skip duplicate positions + } + + if ( skip_rid ) + { + fprintf(stderr,"Skipping the sequence, no genmap for %s\n", bcf_seqname(args->hdr,line)); + args->skip_rid = line->rid; + return; + } + if ( args->prev_pos > line->pos ) error("The file is not sorted?!\n"); + + args->prev_rid = line->rid; + args->prev_pos = line->pos; + + + // parse the new line + process_line(args, line, ial); +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: HMM model for detecting runs of autozygosity.\n"); + fprintf(stderr, "Usage: bcftools roh [options] \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "General Options:\n"); + fprintf(stderr, " --AF-dflt if AF is not known, use this allele frequency [skip]\n"); + fprintf(stderr, " --AF-tag use TAG for allele frequency\n"); + fprintf(stderr, " --AF-file read allele frequencies from file (CHR\\tPOS\\tREF,ALT\\tAF)\n"); + fprintf(stderr, " -b --buffer-size buffer size and the number of overlapping sites, 0 for unlimited [0]\n"); + fprintf(stderr, " If the first number is negative, it is interpreted as the maximum memory to\n"); + fprintf(stderr, " use, in MB. The default overlap is set to roughly 1%% of the buffer size.\n"); + fprintf(stderr, " -e, --estimate-AF [TAG], estimate AF from FORMAT/TAG (GT or PL) of all samples (\"-\") or samples listed\n"); + fprintf(stderr, " in . If TAG is not given, the frequency is estimated from GT by default\n"); + fprintf(stderr, " --exclude exclude sites for which the expression is true\n"); + fprintf(stderr, " -G, --GTs-only use GTs and ignore PLs, instead using for PL of the two least likely genotypes.\n"); + fprintf(stderr, " Safe value to use is 30 to account for GT errors.\n"); + fprintf(stderr, " --include select sites for which the expression is true\n"); + fprintf(stderr, " -i, --ignore-homref skip hom-ref genotypes (0/0)\n"); + fprintf(stderr, " --include-noalt include sites with no ALT allele (ignored by default)\n"); + fprintf(stderr, " -I, --skip-indels skip indels as their genotypes are enriched for errors\n"); + fprintf(stderr, " -m, --genetic-map genetic map in IMPUTE2 format, single file or mask, where string \"{CHROM}\"\n"); + fprintf(stderr, " is replaced with chromosome name\n"); + fprintf(stderr, " -M, --rec-rate constant recombination rate per bp\n"); + fprintf(stderr, " -o, --output write output to a file [standard output]\n"); + fprintf(stderr, " -O, --output-type [srz] output s:per-site, r:regions, z:compressed [sr]\n"); + fprintf(stderr, " -r, --regions restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --samples list of samples to analyze [all samples]\n"); + fprintf(stderr, " -S, --samples-file file of samples to analyze [all samples]\n"); + fprintf(stderr, " -t, --targets similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, " --threads use multithreading with worker threads [0]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "HMM Options:\n"); + fprintf(stderr, " -a, --hw-to-az P(AZ|HW) transition probability from HW (Hardy-Weinberg) to AZ (autozygous) state [6.7e-8]\n"); + fprintf(stderr, " -H, --az-to-hw P(HW|AZ) transition probability from AZ to HW state [5e-9]\n"); + fprintf(stderr, " -V, --viterbi-training estimate HMM parameters, is the convergence threshold, e.g. 1e-10 (experimental)\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfroh(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->t2AZ = 6.7e-8; + args->t2HW = 5e-9; + args->rec_rate = 0; + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"AF-tag",1,0,0}, + {"AF-file",1,0,1}, + {"AF-dflt",1,0,2}, + {"include",1,0,3}, + {"exclude",1,0,4}, + {"include-noalt",0,0,5}, + {"buffer-size",1,0,'b'}, + {"ignore-homref",0,0,'i'}, + {"estimate-AF",1,0,'e'}, + {"output",1,0,'o'}, + {"output-type",1,0,'O'}, + {"GTs-only",1,0,'G'}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"hw-to-az",1,0,'a'}, + {"az-to-hw",1,0,'H'}, + {"viterbi-training",1,0,'V'}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,6}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,7}, + {"genetic-map",1,0,'m'}, + {"rec-rate",1,0,'M'}, + {"skip-indels",0,0,'I'}, + {"threads",1,0,9}, + {0,0,0,0} + }; + + int naf_opts = 0; + char *tmp; + while ((c = getopt_long(argc, argv, "h?r:R:t:T:H:a:s:S:m:M:G:Ia:e:V:b:O:o:i",loptions,NULL)) >= 0) { + switch (c) { + case 0: args->af_tag = optarg; naf_opts++; break; + case 1: args->af_fname = optarg; naf_opts++; break; + case 2: + args->dflt_AF = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: --AF-dflt %s\n", optarg); + break; + case 3 : + if ( args->filter_str ) error("Error: only one --include or --exclude expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 4 : + if ( args->filter_str ) error("Error: only one --include or --exclude expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 5: args->include_noalt_sites = 1; break; + case 'o': args->output_fname = optarg; break; + case 'O': + if ( strchr(optarg,'s') || strchr(optarg,'S') ) args->output_type |= OUTPUT_ST; + if ( strchr(optarg,'r') || strchr(optarg,'R') ) args->output_type |= OUTPUT_RG; + if ( strchr(optarg,'z') || strchr(optarg,'z') ) args->output_type |= OUTPUT_GZ; + break; + case 'e': args->estimate_AF = optarg; naf_opts++; break; + case 'b': args->buffer_size = optarg; break; + case 'i': args->skip_homref = 1; break; + case 'I': args->snps_only = 1; break; + case 'G': + args->fake_PLs = 1; + args->unseen_PL = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -G %s\n", optarg); + args->unseen_PL = pow(10,-args->unseen_PL/10.); + break; + case 'm': args->genmap_fname = optarg; break; + case 'M': + args->rec_rate = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -M %s\n", optarg); + break; + case 's': args->samples = strdup(optarg); break; + case 'S': args->samples = strdup(optarg); args->samples_is_file = 1; break; + case 'a': + args->t2AZ = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -a %s\n", optarg); + break; + case 'H': + args->t2HW = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -H %s\n", optarg); + break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 6 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 7 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 'V': + args->vi_training = 1; + args->baum_welch_th = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: --viterbi-training %s\n", optarg); + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( !args->output_fname ) args->output_fname = "stdout"; + if ( !args->output_type || args->output_type==OUTPUT_GZ ) args->output_type |= OUTPUT_ST|OUTPUT_RG; + char *fname = NULL; + if ( optind==argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(args); + } + else fname = argv[optind]; + + if ( args->vi_training && args->buffer_size ) error("Error: cannot use -b with -V\n"); + if ( args->t2AZ<0 || args->t2AZ>1 ) error("Error: The parameter --hw-to-az is not in [0,1] .. %e\n", args->t2AZ); + if ( args->t2HW<0 || args->t2HW>1 ) error("Error: The parameter --az-to-hw is not in [0,1] .. %e\n", args->t2HW); + if ( naf_opts>1 ) error("Error: The options --AF-tag, --AF-file and -e are mutually exclusive\n"); + if ( args->af_fname && args->targets_list ) error("Error: The options --AF-file and -t are mutually exclusive\n"); + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( args->af_fname ) + { + if ( bcf_sr_set_targets(args->files, args->af_fname, 1, 3)<0 ) + error("Failed to read the targets: %s\n", args->af_fname); + } + if ( args->n_threads && bcf_sr_set_threads(args->files, args->n_threads)<0) + error("Failed to create threads\n"); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + while ( bcf_sr_next_line(args->files) ) + { + args->ntot++; + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) { args->nfiltered++; continue; } + } + vcfroh(args, line); + } + vcfroh(args, NULL); + int i, nmin = 0; + for (i=0; iroh_smpl->n; i++) + if ( !i || args->smpl[i].nused < nmin ) nmin = args->smpl[i].nused; + if ( args->af_fname ) + fprintf(stderr,"Number of lines overlapping with --AF-file/processed: %d/%d\n", args->ntot,nmin); + else + fprintf(stderr,"Number of lines total/processed: %d/%d\n", args->ntot,nmin); + fprintf(stderr,"Number of lines filtered/no AF/no alt/multiallelic/dup: %d/%d/%d/%d/%d\n", args->nfiltered,args->nno_af,args->nno_alt,args->nmultiallelic,args->ndup); + if ( nmin==0 ) + { + fprintf(stderr,"No usable sites were found.\n"); + if ( !naf_opts && !args->dflt_AF ) fprintf(stderr, " Consider using one of the AF options.\n"); + } + destroy_data(args); + free(args); + return 0; +} + + diff --git a/bcftools/vcfroh.c.pysam.c b/bcftools/vcfroh.c.pysam.c new file mode 100644 index 0000000..f9b8aab --- /dev/null +++ b/bcftools/vcfroh.c.pysam.c @@ -0,0 +1,1303 @@ +#include "bcftools.pysam.h" + +/* vcfroh.c -- HMM model for detecting runs of autozygosity. + + Copyright (C) 2013-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "HMM.h" +#include "smpl_ilist.h" +#include "filter.h" + +#define STATE_HW 0 // normal state, follows Hardy-Weinberg allele frequencies +#define STATE_AZ 1 // autozygous state + +#define OUTPUT_ST (1<<1) +#define OUTPUT_RG (1<<2) +#define OUTPUT_GZ (1<<3) + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + + +/** Genetic map */ +typedef struct +{ + int pos; + double rate; +} +genmap_t; + +/** HMM data for each sample */ +typedef struct +{ + double *eprob; // emission probs [2*nsites,msites] + uint32_t *sites; // positions [nsites,msites] + int nsites, msites; + int igenmap; // current position in genmap + int nused; // some stats to detect if things didn't go wrong + int nrid, *rid, *rid_off; // for viterbi training, keep all chromosomes + void *snapshot; // hmm snapshot + struct { + uint32_t beg,end,nqual; + double qual; + int rid, state; + } rg; +} +smpl_t; + +typedef struct _args_t +{ + bcf_srs_t *files; + bcf_hdr_t *hdr; + double t2AZ, t2HW; // P(AZ|HW) and P(HW|AZ) parameters + double unseen_PL, dflt_AF; + + char *genmap_fname; + genmap_t *genmap; + int ngenmap, mgenmap, igenmap; + double rec_rate; // constant recombination rate if > 0 + + hmm_t *hmm; + double baum_welch_th; + int nrids, *rids, *rid_offs; // multiple chroms with vi_training + int nbuf_max, nbuf_olap; + + float *AFs; + int32_t *itmp; + int mAFs, nitmp, mitmp, pl_hdr_id, gt_hdr_id; + + double pl2p[256], *pdg; + int32_t skip_rid, prev_rid, prev_pos; + + int ntot; // some stats to detect if things didn't go wrong + int nno_af; // number of sites rejected because AF could not be determined + int nfiltered; // .. because of filters + int nno_alt, nmultiallelic, ndup; + smpl_t *smpl; // HMM data for each sample + smpl_ilist_t *af_smpl; // list of samples to estimate AF from (--estimate-AF) + smpl_ilist_t *roh_smpl; // list of samples to analyze (--samples, --samples-file) + char *estimate_AF; // list of samples for AF estimate and query sample + int af_from_PL; // estimate AF from FMT/PL rather than FMT/GT + char **argv, *targets_list, *regions_list, *af_fname, *af_tag, *samples, *buffer_size, *output_fname; + int argc, fake_PLs, snps_only, vi_training, samples_is_file, output_type, skip_homref, n_threads; + int include_noalt_sites; + BGZF *out; + kstring_t str; + + int filter_logic; + filter_t *filter; + char *filter_str; +} +args_t; + +void set_tprob_genmap(hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob); +void set_tprob_rrate(hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob); + +void *smalloc(size_t size) +{ + void *mem = malloc(size); + if ( !mem ) error("malloc: Could not allocate %d bytes\n", (int)size); + return mem; +} + +static inline int max255(int i) +{ + return i < 256 ? i : 255; +} + +static void init_data(args_t *args) +{ + int i; + + args->prev_rid = args->skip_rid = -1; + args->hdr = args->files->readers[0].header; + + if ( !bcf_hdr_nsamples(args->hdr) ) error("No samples in the VCF?\n"); + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); + + if ( !args->fake_PLs ) + { + args->pl_hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "PL"); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,args->pl_hdr_id) ) + error("Error: The FORMAT/PL tag not found in the header, consider running with -G\n"); + if ( bcf_hdr_id2type(args->hdr,BCF_HL_FMT,args->pl_hdr_id)!=BCF_HT_INT ) + error("Error: The FORMAT/PL tag not defined as Integer in the header\n"); + } + + if ( args->estimate_AF ) + { + if ( !strncmp("GT,",args->estimate_AF,3) ) args->estimate_AF += 3; + else if ( !strncmp("PL,",args->estimate_AF,3) ) { args->estimate_AF += 3; args->af_from_PL = 1; } + if ( strcmp("-",args->estimate_AF) ) + args->af_smpl = smpl_ilist_init(args->hdr, args->estimate_AF, 1, SMPL_NONE|SMPL_VERBOSE); + } + + if ( args->estimate_AF || args->fake_PLs ) + { + if ( args->af_from_PL ) + { + args->pl_hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "PL"); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,args->pl_hdr_id) ) + error("Error: The FORMAT/PL tag not found in the header\n"); + } + else + { + args->gt_hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,args->gt_hdr_id) ) + error("Error: The FORMAT/GT tag not found in the header\n"); + } + } + if ( args->fake_PLs ) + { + args->gt_hdr_id = bcf_hdr_id2int(args->hdr, BCF_DT_ID, "GT"); + if ( !bcf_hdr_idinfo_exists(args->hdr,BCF_HL_FMT,args->gt_hdr_id) ) + error("Error: The FORMAT/GT tag not found in the header\n"); + } + + args->roh_smpl = smpl_ilist_init(args->hdr, args->samples, args->samples_is_file, SMPL_NONE|SMPL_VERBOSE); + if ( args->samples ) + { + // we may be able to subset to a few samples, for a text VCF this can be a major speedup + if ( (bcf_sr_get_reader(args->files,0))->file->format.format==vcf ) + { + kstring_t str = {0,0,0}; + smpl_ilist_t *tmp = args->roh_smpl, *rmme = NULL; + if ( args->af_smpl ) + { + for (i=0; iroh_smpl->n; i++) + { + if ( str.l ) kputc(',', &str); + kputs(args->hdr->samples[args->roh_smpl->idx[i]], &str); + } + for (i=0; iaf_smpl->n; i++) + { + kputc(',', &str); + kputs(args->hdr->samples[args->af_smpl->idx[i]], &str); + } + rmme = tmp = smpl_ilist_init(args->hdr, str.s, 0, SMPL_NONE); + } + if ( tmp->n < bcf_hdr_nsamples(args->hdr) ) + { + str.l = 0; + for (i=0; in; i++) + { + if ( str.l ) kputc(',', &str); + kputs(args->hdr->samples[tmp->idx[i]], &str); + } + int ret = bcf_hdr_set_samples(args->hdr, str.s, 0); + if ( ret<0 ) error("Error parsing the list of samples: %s\n", str.s); + else if ( ret>0 ) error("The %d-th sample not found in the VCF: %s\n", ret,str.s); + + // update sample ids + smpl_ilist_destroy(args->roh_smpl); + args->roh_smpl = smpl_ilist_init(args->hdr, args->samples, args->samples_is_file, SMPL_NONE); + + if ( args->af_smpl ) + { + smpl_ilist_destroy(args->af_smpl); + args->af_smpl = smpl_ilist_init(args->hdr, args->estimate_AF, 1, SMPL_NONE); + } + } + free(str.s); + if ( rmme ) + smpl_ilist_destroy(rmme); + } + } + + // check whether all samples are in this list. If so, the lookup will not be needed + if ( args->af_smpl && args->af_smpl->n == bcf_hdr_nsamples(args->hdr) ) + { + // all samples are in this list + smpl_ilist_destroy(args->af_smpl); + args->af_smpl = NULL; + } + + if ( args->buffer_size ) + { + args->nbuf_olap = -1; + char *end; + double tmp = strtod(args->buffer_size,&end); + if ( *end ) + { + if ( *end!=',') error("Could not parse: --buffer-size %s\n", args->buffer_size); + args->nbuf_olap = strtol(end+1,&end,10); + if ( *end || args->nbuf_olap<0 ) error("Could not parse: --bufer-size %s\n", args->buffer_size); + } + if ( tmp<0 ) + args->nbuf_max = fabs(tmp)*1e6/(4+8*2)/args->roh_smpl->n; + else + args->nbuf_max = tmp; + + if ( args->nbuf_olap<0 ) + args->nbuf_olap = args->nbuf_max*0.01; + } + fprintf(bcftools_stderr,"Number of target samples: %d\n", args->roh_smpl->n); + fprintf(bcftools_stderr,"Number of --estimate-AF samples: %d\n", args->af_smpl ? args->af_smpl->n : (args->estimate_AF ? bcf_hdr_nsamples(args->hdr) : 0)); + fprintf(bcftools_stderr,"Number of sites in the buffer/overlap: "); + if ( args->nbuf_max ) fprintf(bcftools_stderr,"%d/%d\n", args->nbuf_max,args->nbuf_olap); + else fprintf(bcftools_stderr,"unlimited\n"); + + args->smpl = (smpl_t*) calloc(args->roh_smpl->n,sizeof(smpl_t)); + + for (i=0; i<256; i++) args->pl2p[i] = pow(10., -i/10.); + + // Init transition matrix and HMM + double tprob[4]; + MAT(tprob,2,STATE_HW,STATE_HW) = 1 - args->t2AZ; + MAT(tprob,2,STATE_HW,STATE_AZ) = args->t2HW; + MAT(tprob,2,STATE_AZ,STATE_HW) = args->t2AZ; + MAT(tprob,2,STATE_AZ,STATE_AZ) = 1 - args->t2HW; + + args->hmm = hmm_init(2, tprob, 10000); + if ( args->genmap_fname ) + hmm_set_tprob_func(args->hmm, set_tprob_genmap, args); + else if ( args->rec_rate > 0 ) + hmm_set_tprob_func(args->hmm, set_tprob_rrate, args); + + args->out = bgzf_open(strcmp("bcftools_stdout",args->output_fname)?args->output_fname:"-", args->output_type&OUTPUT_GZ ? "wg" : "wu"); + if ( !args->out ) error("Failed to open %s: %s\n", args->output_fname, strerror(errno)); + + // print header + args->str.l = 0; + ksprintf(&args->str, "# This file was produced by: bcftools roh(%s+htslib-%s)\n", bcftools_version(),hts_version()); + ksprintf(&args->str, "# The command line was:\tbcftools %s", args->argv[0]); + for (i=1; iargc; i++) + ksprintf(&args->str, " %s",args->argv[i]); + ksprintf(&args->str, "\n#\n"); + if ( args->output_type & OUTPUT_RG ) + { + i = 2; + ksprintf(&args->str, "# RG"); + ksprintf(&args->str, "\t[%d]Sample", i++); + ksprintf(&args->str, "\t[%d]Chromosome", i++); + ksprintf(&args->str, "\t[%d]Start", i++); + ksprintf(&args->str, "\t[%d]End", i++); + ksprintf(&args->str, "\t[%d]Length (bp)", i++); + ksprintf(&args->str, "\t[%d]Number of markers", i++); + ksprintf(&args->str, "\t[%d]Quality (average fwd-bwd phred score)", i++); + ksprintf(&args->str, "\n"); + } + if ( args->output_type & OUTPUT_ST ) + { + i = 2; + ksprintf(&args->str, "# ST"); + ksprintf(&args->str, "\t[%d]Sample", i++); + ksprintf(&args->str, "\t[%d]Chromosome", i++); + ksprintf(&args->str, "\t[%d]Position", i++); + ksprintf(&args->str, "\t[%d]State (0:HW, 1:AZ)", i++); + ksprintf(&args->str, "\t[%d]Quality (fwd-bwd phred score)", i++); + ksprintf(&args->str, "\n"); + } + if ( args->vi_training) + { + i = 2; + ksprintf(&args->str, "# VT, Viterbi Training"); + ksprintf(&args->str, "\t[%d]Sample", i++); + ksprintf(&args->str, "\t[%d]Iteration", i++); + ksprintf(&args->str, "\t[%d]dAZ", i++); + ksprintf(&args->str, "\t[%d]dHW", i++); + ksprintf(&args->str, "\t[%d]1 - P(HW|HW)", i++); + ksprintf(&args->str, "\t[%d]P(AZ|HW)", i++); + ksprintf(&args->str, "\t[%d]1 - P(AZ|AZ)", i++); + ksprintf(&args->str, "\t[%d]P(HW|AZ)", i++); + ksprintf(&args->str, "\n"); + } + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) + error("Error writing %s: %s\n", args->output_fname, strerror(errno)); +} + +static void destroy_data(args_t *args) +{ + if ( args->filter ) filter_destroy(args->filter); + if ( bgzf_close(args->out)!=0 ) error("Error: close failed .. %s\n", args->output_fname); + int i; + for (i=0; iroh_smpl->n; i++) + { + free(args->smpl[i].eprob); + free(args->smpl[i].sites); + free(args->smpl[i].rid); + free(args->smpl[i].rid_off); + free(args->smpl[i].snapshot); + } + free(args->str.s); + free(args->smpl); + if ( args->af_smpl ) smpl_ilist_destroy(args->af_smpl); + smpl_ilist_destroy(args->roh_smpl); + free(args->rids); + free(args->rid_offs); + hmm_destroy(args->hmm); + bcf_sr_destroy(args->files); + free(args->AFs); free(args->pdg); + free(args->genmap); + free(args->itmp); + free(args->samples); +} + +static int load_genmap(args_t *args, const char *chr) +{ + if ( !args->genmap_fname ) { args->ngenmap = 0; return 0; } + + kstring_t str = {0,0,0}; + char *fname = strstr(args->genmap_fname,"{CHROM}"); + if ( fname ) + { + kputsn(args->genmap_fname, fname - args->genmap_fname, &str); + kputs(chr, &str); + kputs(fname+7,&str); + fname = str.s; + } + else + fname = args->genmap_fname; + + htsFile *fp = hts_open(fname, "rb"); + if ( !fp ) + { + args->ngenmap = 0; + return -1; + } + + hts_getline(fp, KS_SEP_LINE, &str); + if ( strcmp(str.s,"position COMBINED_rate(cM/Mb) Genetic_Map(cM)") ) + error("Unexpected header in %s, found:\n\t[%s], but expected:\n\t[position COMBINED_rate(cM/Mb) Genetic_Map(cM)]\n", fname, str.s); + + args->ngenmap = args->igenmap = 0; + while ( hts_getline(fp, KS_SEP_LINE, &str) > 0 ) + { + args->ngenmap++; + hts_expand(genmap_t,args->ngenmap,args->mgenmap,args->genmap); + genmap_t *gm = &args->genmap[args->ngenmap-1]; + + // position, convert to 0-based + char *tmp, *end; + gm->pos = strtol(str.s, &tmp, 10); + if ( str.s==tmp ) error("Could not parse %s: %s\n", fname, str.s); + gm->pos -= 1; + + // skip second column + tmp++; + while ( *tmp && !isspace(*tmp) ) tmp++; + + // read the genetic map in cM, scale from % to likelihood + gm->rate = strtod(tmp+1, &end); + if ( tmp+1==end ) error("Could not parse %s: %s\n", fname, str.s); + gm->rate *= 0.01; + } + if ( !args->ngenmap ) error("Genetic map empty?\n"); + if ( hts_close(fp) ) error("Close failed\n"); + free(str.s); + return 0; +} + +static double get_genmap_rate(args_t *args, int start, int end) +{ + // position i to be equal to or smaller than start + int i = args->igenmap; + if ( args->genmap[i].pos > start ) + { + while ( i>0 && args->genmap[i].pos > start ) i--; + } + else + { + while ( i+1ngenmap && args->genmap[i+1].pos < start ) i++; + } + // position j to be equal or larger than end + int j = i; + while ( j+1ngenmap && args->genmap[j].pos < end ) j++; + if ( i==j ) + { + args->igenmap = i; + return 0; + } + + if ( start < args->genmap[i].pos ) start = args->genmap[i].pos; + if ( end > args->genmap[j].pos ) end = args->genmap[j].pos; + double rate = (args->genmap[j].rate - args->genmap[i].rate)/(args->genmap[j].pos - args->genmap[i].pos) * (end-start); + args->igenmap = j; + return rate; +} + +void set_tprob_genmap(hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob) +{ + args_t *args = (args_t*) data; + double ci = get_genmap_rate(args, prev_pos, pos); + if ( args->rec_rate ) ci *= args->rec_rate; + if ( ci > 1 ) ci = 1; + MAT(tprob,2,STATE_HW,STATE_AZ) *= ci; + MAT(tprob,2,STATE_AZ,STATE_HW) *= ci; + MAT(tprob,2,STATE_AZ,STATE_AZ) = 1 - MAT(tprob,2,STATE_HW,STATE_AZ); + MAT(tprob,2,STATE_HW,STATE_HW) = 1 - MAT(tprob,2,STATE_AZ,STATE_HW); +} + +void set_tprob_rrate(hmm_t *hmm, uint32_t prev_pos, uint32_t pos, void *data, double *tprob) +{ + args_t *args = (args_t*) data; + double ci = (pos - prev_pos) * args->rec_rate; + if ( ci > 1 ) ci = 1; + MAT(tprob,2,STATE_HW,STATE_AZ) *= ci; + MAT(tprob,2,STATE_AZ,STATE_HW) *= ci; + MAT(tprob,2,STATE_AZ,STATE_AZ) = 1 - MAT(tprob,2,STATE_HW,STATE_AZ); + MAT(tprob,2,STATE_HW,STATE_HW) = 1 - MAT(tprob,2,STATE_AZ,STATE_HW); +} + + +/** + * This function implements the HMM model: + * D = Data, AZ = autozygosity, HW = Hardy-Weinberg (non-autozygosity), + * f = non-ref allele frequency + * + * Emission probabilities: + * oAZ = P_i(D|AZ) = (1-f)*P(D|RR) + f*P(D|AA) + * oHW = P_i(D|HW) = (1-f)^2 * P(D|RR) + f^2 * P(D|AA) + 2*f*(1-f)*P(D|RA) + * + * Transition probabilities: + * tAZ = P(AZ|HW) .. parameter + * tHW = P(HW|AZ) .. parameter + * + * ci = P_i(C) .. probability of cross-over at site i, from genetic map + * + * AZi = P_i(AZ) .. probability of site i being AZ/non-AZ, scaled so that AZi+HWi = 1 + * HWi = P_i(HW) + * + * P_i(AZ|HW) = P(AZ|HW) * ci * HW{i-1} = tAZ * ci * (1 - AZ{i-1}) + * P_i(HW|AZ) = P(HW|AZ) * ci * AZ{i-1} = tHW * ci * AZ{i-1} + * P_i(AZ|AZ) = 1 - P_i(HW|AZ) + * P_i(HW|HW) = 1 - P_i(AZ|HW) + * + */ + +static void flush_viterbi(args_t *args, int ismpl) +{ + smpl_t *smpl = &args->smpl[ismpl]; + if ( !smpl->nsites ) return; + + const char *name = args->hdr->samples[ args->roh_smpl->idx[ismpl] ]; + + int i,j,k; + + if ( !args->vi_training ) // single viterbi pass + { + hmm_restore(args->hmm, smpl->snapshot); + int end = (args->nbuf_max && smpl->nsites >= args->nbuf_max && smpl->nsites > args->nbuf_olap) ? smpl->nsites - args->nbuf_olap : smpl->nsites; + if ( end < smpl->nsites ) + smpl->snapshot = hmm_snapshot(args->hmm, smpl->snapshot, smpl->sites[smpl->nsites - args->nbuf_olap - 1]); + + args->igenmap = smpl->igenmap; + hmm_run_viterbi(args->hmm, smpl->nsites, smpl->eprob, smpl->sites); + hmm_run_fwd_bwd(args->hmm, smpl->nsites, smpl->eprob, smpl->sites); + double *fwd = hmm_get_fwd_bwd_prob(args->hmm); + + const char *chr = bcf_hdr_id2name(args->hdr,args->prev_rid); + uint8_t *vpath = hmm_get_viterbi_path(args->hmm); + + for (i=0; ioutput_type & OUTPUT_ST ) + { + args->str.l = 0; + ksprintf(&args->str, "ST\t%s\t%s\t%d\t%d\t%.1f\n", name,chr,smpl->sites[i]+1, state, qual); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + } + + if ( args->output_type & OUTPUT_RG ) + { + if ( state!=smpl->rg.state ) + { + if ( !state ) // the region ends, flush + { + args->str.l = 0; + ksprintf(&args->str, "RG\t%s\t%s\t%d\t%d\t%d\t%d\t%.1f\n",name,bcf_hdr_id2name(args->hdr,smpl->rg.rid), + smpl->rg.beg+1,smpl->rg.end+1,smpl->rg.end-smpl->rg.beg+1,smpl->rg.nqual,smpl->rg.qual/smpl->rg.nqual); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + smpl->rg.state = 0; + } + else + { + smpl->rg.state = 1; + smpl->rg.beg = smpl->sites[i]; + smpl->rg.end = smpl->sites[i]; + smpl->rg.rid = args->prev_rid; + smpl->rg.qual = qual; + smpl->rg.nqual = 1; + } + } + else if ( state ) + { + smpl->rg.nqual++; + smpl->rg.qual += qual; + smpl->rg.end = smpl->sites[i]; + } + } + } + + if ( end < smpl->nsites ) + { + end = smpl->nsites - args->nbuf_olap; + memmove(smpl->sites, smpl->sites + end, sizeof(*smpl->sites)*args->nbuf_olap); + memmove(smpl->eprob, smpl->eprob + end*2, sizeof(*smpl->eprob)*args->nbuf_olap*2); + smpl->nsites = args->nbuf_olap; + smpl->igenmap = args->igenmap; + } + else + { + smpl->nsites = 0; + smpl->igenmap = 0; + + if ( smpl->rg.state ) + { + args->str.l = 0; + ksprintf(&args->str, "RG\t%s\t%s\t%d\t%d\t%d\t%d\t%.1f\n",name,bcf_hdr_id2name(args->hdr,smpl->rg.rid), + smpl->rg.beg+1,smpl->rg.end+1,smpl->rg.end-smpl->rg.beg+1,smpl->rg.nqual,smpl->rg.qual/smpl->rg.nqual); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + smpl->rg.state = 0; + } + } + + return; + } + + + // viterbi training, multiple chromosomes + double t2az_prev, t2hw_prev; + double deltaz, delthw; + + double *tprob_arr = hmm_get_tprob(args->hmm); + MAT(tprob_arr,2,STATE_HW,STATE_HW) = 1 - args->t2AZ; + MAT(tprob_arr,2,STATE_HW,STATE_AZ) = args->t2HW; + MAT(tprob_arr,2,STATE_AZ,STATE_HW) = args->t2AZ; + MAT(tprob_arr,2,STATE_AZ,STATE_AZ) = 1 - args->t2HW; + hmm_set_tprob(args->hmm, tprob_arr, 10000); + + int niter = 0; + do + { + tprob_arr = hmm_get_tprob(args->hmm); + t2az_prev = MAT(tprob_arr,2,STATE_AZ,STATE_HW); //args->t2AZ; + t2hw_prev = MAT(tprob_arr,2,STATE_HW,STATE_AZ); //args->t2HW; + double tprob_new[] = { 0,0,0,0 }; + for (i=0; inrid; i++) + { + int ioff = smpl->rid_off[i]; + int nsites = (i+1==smpl->nrid ? smpl->nsites : smpl->rid_off[i+1]) - ioff; + args->igenmap = 0; + tprob_arr = hmm_run_baum_welch(args->hmm, nsites, smpl->eprob+ioff*2, smpl->sites+ioff); + for (j=0; j<2; j++) + for (k=0; k<2; k++) MAT(tprob_new,2,j,k) += MAT(tprob_arr,2,j,k); + } + for (j=0; j<2; j++) + for (k=0; k<2; k++) MAT(tprob_new,2,j,k) /= smpl->nrid; + + hmm_set_tprob(args->hmm, tprob_new, 10000); + + deltaz = fabs(MAT(tprob_new,2,STATE_AZ,STATE_HW)-t2az_prev); + delthw = fabs(MAT(tprob_new,2,STATE_HW,STATE_AZ)-t2hw_prev); + niter++; + args->str.l = 0; + ksprintf(&args->str, "VT\t%s\t%d\t%e\t%e\t%e\t%e\t%e\t%e\n", + name,niter,deltaz,delthw, + 1-MAT(tprob_new,2,STATE_HW,STATE_HW),MAT(tprob_new,2,STATE_AZ,STATE_HW), + 1-MAT(tprob_new,2,STATE_AZ,STATE_AZ),MAT(tprob_new,2,STATE_HW,STATE_AZ)); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + } + while ( deltaz > args->baum_welch_th || delthw > args->baum_welch_th ); + + // output the results + for (i=0; inrid; i++) + { + int ioff = smpl->rid_off[i]; + int nsites = (i+1==smpl->nrid ? smpl->nsites : smpl->rid_off[i+1]) - ioff; + args->igenmap = 0; + hmm_run_viterbi(args->hmm, nsites, smpl->eprob+ioff*2, smpl->sites+ioff); + hmm_run_fwd_bwd(args->hmm, nsites, smpl->eprob+ioff*2, smpl->sites+ioff); + uint8_t *vpath = hmm_get_viterbi_path(args->hmm); + double *fwd = hmm_get_fwd_bwd_prob(args->hmm); + + const char *chr = bcf_hdr_id2name(args->hdr,smpl->rid[i]); + for (j=0; jstr.l = 0; + ksprintf(&args->str, "ROH\t%s\t%s\t%d\t%d\t%.1f\n", name,chr,smpl->sites[ioff+j]+1, state, phred_score(1.0-pval[state])); + if ( bgzf_write(args->out, args->str.s, args->str.l) != args->str.l ) error("Error writing %s: %s\n", args->output_fname, strerror(errno)); + } + } +} + +int read_AF(bcf_sr_regions_t *tgt, bcf1_t *line, double *alt_freq) +{ + if ( tgt->nals < 2 ) + error("Expected two comma-separated alleles (REF,ALT) in the third column of %s, found:\n\t%s\n", tgt->fname,tgt->line.s); + if ( tgt->nals != line->n_allele ) return -1; // number of alleles does not match + + int i; + for (i=0; inals; i++) + if ( strcmp(line->d.allele[i],tgt->als[i]) ) break; // we could be smarter, see vcmp + if ( inals ) return -1; + + char *tmp, *str = tgt->line.s; + i = 0; + while ( *str && i<3 ) + { + if ( *str=='\t' ) i++; + str++; + } + *alt_freq = strtod(str, &tmp); + if ( *tmp && !isspace(*tmp) ) + { + if ( str[0]=='.' && (!str[1] || isspace(str[1])) ) return -1; // missing value + error("Could not parse: [%s]\n", tgt->line.s); + } + if ( *alt_freq<0 || *alt_freq>1 ) error("Could not parse AF: [%s]\n", tgt->line.s); + return 0; +} + +int8_t *get_GT(args_t *args, bcf1_t *line) +{ + int i; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==args->gt_hdr_id ) break; + if ( i==line->n_fmt ) return NULL; // the tag is not present in this record + + bcf_fmt_t *fmt = &line->d.fmt[i]; + if ( fmt->n!=2 ) return NULL; // not diploid + + if ( fmt->type!=BCF_BT_INT8 ) error("This is unexpected, GT type is %d\n", fmt->type); + return (int8_t*) fmt->p; +} + +int estimate_AF_from_GT(args_t *args, int8_t *gt, double *alt_freq) +{ + int i, nalt = 0, nref = 0; + if ( args->af_smpl ) // subset samples for AF estimate + { + for (i=0; iaf_smpl->n; i++) + { + int ismpl = args->af_smpl->idx[i]; + if ( bcf_gt_is_missing(gt[2*ismpl]) || bcf_gt_is_missing(gt[2*ismpl+1]) ) continue; + + if ( bcf_gt_allele(gt[2*ismpl]) ) nalt++; + else nref++; + + if ( bcf_gt_allele(gt[2*ismpl+1]) ) nalt++; + else nref++; + } + } + else // all samples used in AF estimate + { + int8_t *end = gt + 2*bcf_hdr_nsamples(args->hdr); + while ( gt < end ) + { + if ( bcf_gt_is_missing(gt[0]) || bcf_gt_is_missing(gt[1]) ) + { + gt += 2; + continue; + } + + if ( bcf_gt_allele(gt[0]) ) nalt++; + else nref++; + + if ( bcf_gt_allele(gt[1]) ) nalt++; + else nref++; + + gt += 2; + } + } + if ( !nalt && !nref ) return -1; + + *alt_freq = (double)nalt / (nalt + nref); + return 0; +} + +int estimate_AF_from_PL(args_t *args, bcf_fmt_t *fmt_pl, int ial, double *alt_freq) +{ + double af = 0; + int i, j, naf = 0; + + int irr = bcf_alleles2gt(0,0), ira = bcf_alleles2gt(0,ial), iaa = bcf_alleles2gt(ial,ial); + if ( iaa >= fmt_pl->n ) return -1; // not diploid or wrong number of fields + + if ( args->af_smpl ) // subset samples for AF estimate + { + #define BRANCH(type_t) \ + { \ + for (i=0; iaf_smpl->n; i++) \ + { \ + int ismpl = args->af_smpl->idx[i]; \ + type_t *p = (type_t*)fmt_pl->p + fmt_pl->n*ismpl; \ + if ( p[irr]<0 || p[ira]<0 || p[iaa]<0 ) continue; /* missing value */ \ + if ( p[irr]==p[ira] && p[irr]==p[iaa] ) continue; /* all values are the same */ \ + double prob[3], norm = 0; \ + prob[0] = args->pl2p[ max255(p[irr]) ]; \ + prob[1] = args->pl2p[ max255(p[ira]) ]; \ + prob[2] = args->pl2p[ max255(p[iaa]) ]; \ + for (j=0; j<3; j++) norm += prob[j]; \ + for (j=0; j<3; j++) prob[j] /= norm; \ + af += 0.5*prob[1] + prob[2]; \ + naf++; \ + } \ + } + switch (fmt_pl->type) { + case BCF_BT_INT8: BRANCH(int8_t); break; + case BCF_BT_INT16: BRANCH(int16_t); break; + case BCF_BT_INT32: BRANCH(int32_t); break; + default: fprintf(bcftools_stderr,"Unknown format type for PL: %s:%d .. fmt->type=%d\n", __FILE__,__LINE__, fmt_pl->type); bcftools_exit(1); + } + #undef BRANCH + } + else // all samples used in AF estimate + { + int nsmpl = bcf_hdr_nsamples(args->hdr); + #define BRANCH(type_t) \ + { \ + type_t *p = (type_t*)fmt_pl->p; \ + p -= fmt_pl->n; \ + for (i=0; in; \ + if ( p[irr]<0 || p[ira]<0 || p[iaa]<0 ) continue; /* missing value */ \ + if ( p[irr]==p[ira] && p[irr]==p[iaa] ) continue; /* all values are the same */ \ + double prob[3], norm = 0; \ + prob[0] = args->pl2p[ max255(p[irr]) ]; \ + prob[1] = args->pl2p[ max255(p[ira]) ]; \ + prob[2] = args->pl2p[ max255(p[iaa]) ]; \ + for (j=0; j<3; j++) norm += prob[j]; \ + for (j=0; j<3; j++) prob[j] /= norm; \ + af += 0.5*prob[1] + prob[2]; \ + naf++; \ + } \ + } + switch (fmt_pl->type) { + case BCF_BT_INT8: BRANCH(int8_t); break; + case BCF_BT_INT16: BRANCH(int16_t); break; + case BCF_BT_INT32: BRANCH(int32_t); break; + default: fprintf(bcftools_stderr,"Unknown format type for PL: %s:%d .. fmt->type=%d\n", __FILE__,__LINE__, fmt_pl->type); bcftools_exit(1); + } + #undef BRANCH + } + if ( !naf ) return -1; + + *alt_freq = af / naf; + return 0; +} + +bcf_fmt_t *get_PL(args_t *args, bcf1_t *line) +{ + int i; + for (i=0; in_fmt; i++) + if ( line->d.fmt[i].id==args->pl_hdr_id ) return &line->d.fmt[i]; + return NULL; +} + +int process_line(args_t *args, bcf1_t *line, int ial) +{ + if ( !(line->unpacked & BCF_UN_FMT) ) bcf_unpack(line, BCF_UN_FMT); + + double alt_freq; + int8_t *GTs = NULL; + bcf_fmt_t *fmt_pl = NULL; + + // Set allele frequency + int ret = 0, i,j; + if ( args->af_tag ) + { + // Use an INFO tag provided by the user + ret = bcf_get_info_float(args->hdr, line, args->af_tag, &args->AFs, &args->mAFs); + if ( ret>0 ) + alt_freq = args->AFs[ial-1]; + if ( ret==-2 ) + error("Type mismatch for INFO/%s tag at %s:%"PRId64"\n", args->af_tag, bcf_seqname(args->hdr,line), (int64_t) line->pos+1); + } + else if ( args->af_fname ) + { + // Read AF from a file + ret = read_AF(args->files->targets, line, &alt_freq); + } + else if ( args->dflt_AF > 0 ) + { + alt_freq = args->dflt_AF; + } + else if ( args->estimate_AF ) + { + // Estimate AF from GTs or PLs of all samples or samples listed in a file + if ( args->af_from_PL ) + { + fmt_pl = get_PL(args, line); + if ( !fmt_pl ) return -1; + ret = estimate_AF_from_PL(args, fmt_pl, ial, &alt_freq); + } + else + { + GTs = get_GT(args, line); + if ( !GTs ) return -1; + ret = estimate_AF_from_GT(args, GTs, &alt_freq); + } + } + else + { + // Use AC/AN + int AC = -1, AN = 0; + ret = bcf_get_info_int32(args->hdr, line, "AN", &args->itmp, &args->mitmp); + if ( ret==1 ) + { + AN = args->itmp[0]; + ret = bcf_get_info_int32(args->hdr, line, "AC", &args->itmp, &args->mitmp); + if ( ret>0 ) + AC = args->itmp[0]; + } + if ( AN<=0 || AC<0 ) + ret = -1; + else + alt_freq = (double) AC/AN; + } + + if ( args->dflt_AF>0 && (ret<0 || alt_freq==0.0) ) alt_freq = args->dflt_AF; + else if ( ret<0 ) { args->nno_af++; return ret; } + else if ( alt_freq==0.0 ) { args->nno_af++; return -1; } + + int irr = bcf_alleles2gt(0,0), ira = bcf_alleles2gt(0,ial), iaa = bcf_alleles2gt(ial,ial); + if ( args->fake_PLs ) + { + if ( !GTs ) GTs = get_GT(args, line); + } + else + { + fmt_pl = get_PL(args, line); + if ( !fmt_pl ) return -1; + if ( iaa >= fmt_pl->n ) return -1; // not diploid or wrong number of fields + } + + for (i=0; iroh_smpl->n; i++) + { + int ismpl = args->roh_smpl->idx[i]; + + // set P(D|G) + double pdg[3]; + if ( args->fake_PLs ) + { + int8_t *gt = GTs + 2*ismpl; + if ( bcf_gt_is_missing(gt[0]) || bcf_gt_is_missing(gt[1]) ) continue; + + int a = bcf_gt_allele(gt[0]); + int b = bcf_gt_allele(gt[1]); + if ( a!=b ) + { + pdg[0] = pdg[2] = args->unseen_PL; + pdg[1] = 1 - 2*args->unseen_PL; + } + else if ( a==0 ) + { + pdg[0] = 1 - args->unseen_PL - args->unseen_PL*args->unseen_PL; + pdg[1] = args->unseen_PL; + pdg[2] = args->unseen_PL*args->unseen_PL; + } + else + { + pdg[0] = args->unseen_PL*args->unseen_PL; + pdg[1] = args->unseen_PL; + pdg[2] = 1 - args->unseen_PL - args->unseen_PL*args->unseen_PL; + } + } + else + { + #define BRANCH(type_t) \ + { \ + type_t *p = (type_t*)fmt_pl->p + fmt_pl->n*ismpl; \ + if ( p[irr]<0 || p[ira]<0 || p[iaa]<0 ) continue; /* missing value */ \ + if ( p[irr]==p[ira] && p[irr]==p[iaa] ) continue; /* all values are the same */ \ + pdg[0] = args->pl2p[ max255(p[irr]) ]; \ + pdg[1] = args->pl2p[ max255(p[ira]) ]; \ + pdg[2] = args->pl2p[ max255(p[iaa]) ]; \ + } + switch (fmt_pl->type) { + case BCF_BT_INT8: BRANCH(int8_t); break; + case BCF_BT_INT16: BRANCH(int16_t); break; + case BCF_BT_INT32: BRANCH(int32_t); break; + default: fprintf(bcftools_stderr,"Unknown format type for PL: %s:%d .. fmt->type=%d\n", __FILE__,__LINE__, fmt_pl->type); bcftools_exit(1); + } + #undef BRANCH + } + + double sum = pdg[0] + pdg[1] + pdg[2]; + if ( !sum ) continue; + for (j=0; j<3; j++) pdg[j] /= sum; + if ( args->skip_homref && pdg[0]>0.99 ) continue; + + smpl_t *smpl = &args->smpl[i]; + smpl->nused++; + + if ( smpl->nsites >= smpl->msites ) + { + hts_expand(uint32_t,smpl->nsites+1,smpl->msites,smpl->sites); + smpl->eprob = (double*) realloc(smpl->eprob,sizeof(*smpl->eprob)*smpl->msites*2); + if ( !smpl->eprob ) error("Error: failed to alloc %"PRIu64" bytes\n", (uint64_t)(sizeof(*smpl->eprob)*smpl->msites*2)); + } + + // Calculate emission probabilities P(D|AZ) and P(D|HW) + double *eprob = &smpl->eprob[2*smpl->nsites]; + eprob[STATE_AZ] = pdg[0]*(1-alt_freq) + pdg[2]*alt_freq; + eprob[STATE_HW] = pdg[0]*(1-alt_freq)*(1-alt_freq) + 2*pdg[1]*(1-alt_freq)*alt_freq + pdg[2]*alt_freq*alt_freq; + + smpl->sites[smpl->nsites] = line->pos; + smpl->nsites++; + + if ( args->vi_training ) + { + if ( !smpl->nrid || line->rid!=smpl->rid[smpl->nrid-1] ) + { + smpl->nrid++; + smpl->rid = (int*) realloc(smpl->rid,sizeof(*smpl->rid)*smpl->nrid); + smpl->rid[smpl->nrid-1] = line->rid; + smpl->rid_off = (int*) realloc(smpl->rid_off,sizeof(*smpl->rid_off)*smpl->nrid); + smpl->rid_off[smpl->nrid-1] = smpl->nsites - 1; + } + } + else if ( args->nbuf_max && smpl->nsites >= args->nbuf_max ) flush_viterbi(args, i); + } + + return 0; +} + +static void vcfroh(args_t *args, bcf1_t *line) +{ + int i; + + // Are we done? + if ( !line ) + { + for (i=0; iroh_smpl->n; i++) flush_viterbi(args, i); + return; + } + + // Skip unwanted lines, for simplicity we consider only biallelic sites + if ( line->rid == args->skip_rid ) return; + + // This can be raw callable VCF with the symbolic unseen allele <*> + int ial = 0, nalt = line->n_allele - 1; + for (i=1; in_allele; i++) + { + if ( !strcmp("<*>",line->d.allele[i]) || !strcmp("",line->d.allele[i]) ) nalt--; + else if ( !ial ) ial = i; + } + + if ( !nalt ) // no ALT allele + { + args->nno_alt++; + if ( !args->include_noalt_sites ) return; + } + else if ( nalt>1 ) + { + args->nmultiallelic++; + return; + } + + if ( args->snps_only && !bcf_is_snp(line) ) return; + + // Initialize genetic map + int skip_rid = 0; + if ( args->prev_rid<0 ) + skip_rid = load_genmap(args, bcf_seqname(args->hdr,line)); + + // New chromosome? + if ( args->prev_rid!=line->rid ) + { + if ( !args->vi_training ) + { + for (i=0; iroh_smpl->n; i++) + { + flush_viterbi(args, i); + hmm_reset(args->hmm, args->smpl[i].snapshot); + } + } + args->prev_rid = line->rid; + args->prev_pos = line->pos; + skip_rid = load_genmap(args, bcf_seqname(args->hdr,line)); + } + else if ( args->prev_pos == line->pos ) + { + args->ndup++; + return; // skip duplicate positions + } + + if ( skip_rid ) + { + fprintf(bcftools_stderr,"Skipping the sequence, no genmap for %s\n", bcf_seqname(args->hdr,line)); + args->skip_rid = line->rid; + return; + } + if ( args->prev_pos > line->pos ) error("The file is not sorted?!\n"); + + args->prev_rid = line->rid; + args->prev_pos = line->pos; + + + // parse the new line + process_line(args, line, ial); +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: HMM model for detecting runs of autozygosity.\n"); + fprintf(bcftools_stderr, "Usage: bcftools roh [options] \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "General Options:\n"); + fprintf(bcftools_stderr, " --AF-dflt if AF is not known, use this allele frequency [skip]\n"); + fprintf(bcftools_stderr, " --AF-tag use TAG for allele frequency\n"); + fprintf(bcftools_stderr, " --AF-file read allele frequencies from file (CHR\\tPOS\\tREF,ALT\\tAF)\n"); + fprintf(bcftools_stderr, " -b --buffer-size buffer size and the number of overlapping sites, 0 for unlimited [0]\n"); + fprintf(bcftools_stderr, " If the first number is negative, it is interpreted as the maximum memory to\n"); + fprintf(bcftools_stderr, " use, in MB. The default overlap is set to roughly 1%% of the buffer size.\n"); + fprintf(bcftools_stderr, " -e, --estimate-AF [TAG], estimate AF from FORMAT/TAG (GT or PL) of all samples (\"-\") or samples listed\n"); + fprintf(bcftools_stderr, " in . If TAG is not given, the frequency is estimated from GT by default\n"); + fprintf(bcftools_stderr, " --exclude exclude sites for which the expression is true\n"); + fprintf(bcftools_stderr, " -G, --GTs-only use GTs and ignore PLs, instead using for PL of the two least likely genotypes.\n"); + fprintf(bcftools_stderr, " Safe value to use is 30 to account for GT errors.\n"); + fprintf(bcftools_stderr, " --include select sites for which the expression is true\n"); + fprintf(bcftools_stderr, " -i, --ignore-homref skip hom-ref genotypes (0/0)\n"); + fprintf(bcftools_stderr, " --include-noalt include sites with no ALT allele (ignored by default)\n"); + fprintf(bcftools_stderr, " -I, --skip-indels skip indels as their genotypes are enriched for errors\n"); + fprintf(bcftools_stderr, " -m, --genetic-map genetic map in IMPUTE2 format, single file or mask, where string \"{CHROM}\"\n"); + fprintf(bcftools_stderr, " is replaced with chromosome name\n"); + fprintf(bcftools_stderr, " -M, --rec-rate constant recombination rate per bp\n"); + fprintf(bcftools_stderr, " -o, --output write output to a file [standard output]\n"); + fprintf(bcftools_stderr, " -O, --output-type [srz] output s:per-site, r:regions, z:compressed [sr]\n"); + fprintf(bcftools_stderr, " -r, --regions restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --samples list of samples to analyze [all samples]\n"); + fprintf(bcftools_stderr, " -S, --samples-file file of samples to analyze [all samples]\n"); + fprintf(bcftools_stderr, " -t, --targets similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, " --threads use multithreading with worker threads [0]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "HMM Options:\n"); + fprintf(bcftools_stderr, " -a, --hw-to-az P(AZ|HW) transition probability from HW (Hardy-Weinberg) to AZ (autozygous) state [6.7e-8]\n"); + fprintf(bcftools_stderr, " -H, --az-to-hw P(HW|AZ) transition probability from AZ to HW state [5e-9]\n"); + fprintf(bcftools_stderr, " -V, --viterbi-training estimate HMM parameters, is the convergence threshold, e.g. 1e-10 (experimental)\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfroh(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->t2AZ = 6.7e-8; + args->t2HW = 5e-9; + args->rec_rate = 0; + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"AF-tag",1,0,0}, + {"AF-file",1,0,1}, + {"AF-dflt",1,0,2}, + {"include",1,0,3}, + {"exclude",1,0,4}, + {"include-noalt",0,0,5}, + {"buffer-size",1,0,'b'}, + {"ignore-homref",0,0,'i'}, + {"estimate-AF",1,0,'e'}, + {"output",1,0,'o'}, + {"output-type",1,0,'O'}, + {"GTs-only",1,0,'G'}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"hw-to-az",1,0,'a'}, + {"az-to-hw",1,0,'H'}, + {"viterbi-training",1,0,'V'}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,6}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,7}, + {"genetic-map",1,0,'m'}, + {"rec-rate",1,0,'M'}, + {"skip-indels",0,0,'I'}, + {"threads",1,0,9}, + {0,0,0,0} + }; + + int naf_opts = 0; + char *tmp; + while ((c = getopt_long(argc, argv, "h?r:R:t:T:H:a:s:S:m:M:G:Ia:e:V:b:O:o:i",loptions,NULL)) >= 0) { + switch (c) { + case 0: args->af_tag = optarg; naf_opts++; break; + case 1: args->af_fname = optarg; naf_opts++; break; + case 2: + args->dflt_AF = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: --AF-dflt %s\n", optarg); + break; + case 3 : + if ( args->filter_str ) error("Error: only one --include or --exclude expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 4 : + if ( args->filter_str ) error("Error: only one --include or --exclude expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 5: args->include_noalt_sites = 1; break; + case 'o': args->output_fname = optarg; break; + case 'O': + if ( strchr(optarg,'s') || strchr(optarg,'S') ) args->output_type |= OUTPUT_ST; + if ( strchr(optarg,'r') || strchr(optarg,'R') ) args->output_type |= OUTPUT_RG; + if ( strchr(optarg,'z') || strchr(optarg,'z') ) args->output_type |= OUTPUT_GZ; + break; + case 'e': args->estimate_AF = optarg; naf_opts++; break; + case 'b': args->buffer_size = optarg; break; + case 'i': args->skip_homref = 1; break; + case 'I': args->snps_only = 1; break; + case 'G': + args->fake_PLs = 1; + args->unseen_PL = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -G %s\n", optarg); + args->unseen_PL = pow(10,-args->unseen_PL/10.); + break; + case 'm': args->genmap_fname = optarg; break; + case 'M': + args->rec_rate = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -M %s\n", optarg); + break; + case 's': args->samples = strdup(optarg); break; + case 'S': args->samples = strdup(optarg); args->samples_is_file = 1; break; + case 'a': + args->t2AZ = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -a %s\n", optarg); + break; + case 'H': + args->t2HW = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: -H %s\n", optarg); + break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 6 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 7 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 'V': + args->vi_training = 1; + args->baum_welch_th = strtod(optarg,&tmp); + if ( *tmp ) error("Could not parse: --viterbi-training %s\n", optarg); + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + if ( !args->output_fname ) args->output_fname = "bcftools_stdout"; + if ( !args->output_type || args->output_type==OUTPUT_GZ ) args->output_type |= OUTPUT_ST|OUTPUT_RG; + char *fname = NULL; + if ( optind==argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(args); + } + else fname = argv[optind]; + + if ( args->vi_training && args->buffer_size ) error("Error: cannot use -b with -V\n"); + if ( args->t2AZ<0 || args->t2AZ>1 ) error("Error: The parameter --hw-to-az is not in [0,1] .. %e\n", args->t2AZ); + if ( args->t2HW<0 || args->t2HW>1 ) error("Error: The parameter --az-to-hw is not in [0,1] .. %e\n", args->t2HW); + if ( naf_opts>1 ) error("Error: The options --AF-tag, --AF-file and -e are mutually exclusive\n"); + if ( args->af_fname && args->targets_list ) error("Error: The options --AF-file and -t are mutually exclusive\n"); + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( args->af_fname ) + { + if ( bcf_sr_set_targets(args->files, args->af_fname, 1, 3)<0 ) + error("Failed to read the targets: %s\n", args->af_fname); + } + if ( args->n_threads && bcf_sr_set_threads(args->files, args->n_threads)<0) + error("Failed to create threads\n"); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + while ( bcf_sr_next_line(args->files) ) + { + args->ntot++; + bcf1_t *line = bcf_sr_get_line(args->files,0); + if ( args->filter ) + { + int pass = filter_test(args->filter, line, NULL); + if ( args->filter_logic & FLT_EXCLUDE ) pass = pass ? 0 : 1; + if ( !pass ) { args->nfiltered++; continue; } + } + vcfroh(args, line); + } + vcfroh(args, NULL); + int i, nmin = 0; + for (i=0; iroh_smpl->n; i++) + if ( !i || args->smpl[i].nused < nmin ) nmin = args->smpl[i].nused; + if ( args->af_fname ) + fprintf(bcftools_stderr,"Number of lines overlapping with --AF-file/processed: %d/%d\n", args->ntot,nmin); + else + fprintf(bcftools_stderr,"Number of lines total/processed: %d/%d\n", args->ntot,nmin); + fprintf(bcftools_stderr,"Number of lines filtered/no AF/no alt/multiallelic/dup: %d/%d/%d/%d/%d\n", args->nfiltered,args->nno_af,args->nno_alt,args->nmultiallelic,args->ndup); + if ( nmin==0 ) + { + fprintf(bcftools_stderr,"No usable sites were found.\n"); + if ( !naf_opts && !args->dflt_AF ) fprintf(bcftools_stderr, " Consider using one of the AF options.\n"); + } + destroy_data(args); + free(args); + return 0; +} + + diff --git a/bcftools/vcfsom.c b/bcftools/vcfsom.c new file mode 100644 index 0000000..db01d24 --- /dev/null +++ b/bcftools/vcfsom.c @@ -0,0 +1,718 @@ +/* vcfsom.c -- SOM (Self-Organizing Map) filtering. + + Copyright (C) 2013-2014, 2020 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" + +#define SOM_TRAIN 1 +#define SOM_CLASSIFY 2 + +typedef struct +{ + int ndim; // dimension of the map (2D, 3D, ...) + int nbin; // number of bins in th map + int size; // pow(nbin,ndim) + int kdim; // dimension of the input vectors + int nt, t; // total number of learning cycles and the current cycle + double *w, *c; // weights and counts (sum of learning influence) + double learn; // learning rate + double bmu_th; // best-matching unit threshold + int *a_idx, *b_idx; // temp arrays for traversing variable number of nested loops + double *div; // dtto +} +som_t; + +typedef struct +{ + // SOM parameters + double bmu_th, learn; + int ndim, nbin, ntrain, t; + int nfold; // n-fold cross validation = the number of SOMs + som_t **som; + + // annots reader's data + htsFile *file; // reader + kstring_t str; // temporary string for the reader + int dclass, mvals; + double *vals; + + // training data + double *train_dat; + int *train_class, mtrain_class, mtrain_dat; + + int rand_seed, good_class, bad_class; + char **argv, *fname, *prefix; + int argc, action, train_bad, merge; +} +args_t; + +static void usage(void); +FILE *open_file(char **fname, const char *mode, const char *fmt, ...); +void mkdir_p(const char *fmt, ...); + +char *msprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int n = vsnprintf(NULL, 0, fmt, ap) + 2; + va_end(ap); + + char *str = (char*)malloc(n); + va_start(ap, fmt); + vsnprintf(str, n, fmt, ap); + va_end(ap); + + return str; +} + +/* + * char *t, *p = str; + * t = column_next(p, '\t'); + * if ( strlen("")==t-p && !strncmp(p,"",t-p) ) printf("found!\n"); + * + * char *t; + * t = column_next(str, '\t'); if ( !*t ) error("expected field\n", str); + * t = column_next(t+1, '\t'); if ( !*t ) error("expected field\n", str); + */ +static inline char *column_next(char *start, char delim) +{ + char *end = start; + while (*end && *end!=delim) end++; + return end; +} +/** + * annots_reader_next() - reads next line from annots.tab.gz and sets: class, vals + * Returns 1 on successful read or 0 if no further record could be read. + */ +int annots_reader_next(args_t *args) +{ + args->str.l = 0; + if ( hts_getline(args->file,'\n',&args->str)<=0 ) return 0; + + char *t, *line = args->str.s; + + if ( !args->mvals ) + { + t = line; + while ( *t ) + { + if ( *t=='\t' ) args->mvals++; + t++; + } + args->vals = (double*) malloc(args->mvals*sizeof(double)); + } + + // class + args->dclass = atoi(line); + t = column_next(line, '\t'); + + // values + int i; + for (i=0; imvals; i++) + { + if ( !*t ) error("Could not parse %d-th data field: is the line truncated?\nThe line was: [%s]\n",i+2,line); + args->vals[i] = atof(++t); + t = column_next(t,'\t'); + } + return 1; +} +void annots_reader_reset(args_t *args) +{ + if ( args->file ) hts_close(args->file); + if ( !args->fname ) error("annots_reader_reset: no fname\n"); + args->file = hts_open(args->fname, "r"); +} +void annots_reader_close(args_t *args) +{ + hts_close(args->file); +} + +static void som_write_map(char *prefix, som_t **som, int nsom) +{ + FILE *fp = open_file(NULL,"w","%s.som",prefix); + size_t nw; + if ( (nw=fwrite("SOMv1",5,1,fp))!=5 ) error("Failed to write 5 bytes\n"); + if ( (nw=fwrite(&nsom,sizeof(int),1,fp))!=sizeof(int) ) error("Failed to write %zu bytes\n",sizeof(int)); + int i; + for (i=0; isize,sizeof(int),1,fp))!=sizeof(int) ) error("Failed to write %zu bytes\n",sizeof(int)); + if ( (nw=fwrite(&som[i]->kdim,sizeof(int),1,fp))!=sizeof(int) ) error("Failed to write %zu bytes\n",sizeof(int)); + if ( (nw=fwrite(som[i]->w,sizeof(double),som[i]->size*som[i]->kdim,fp))!=sizeof(double)*som[i]->size*som[i]->kdim ) error("Failed to write %zu bytes\n",sizeof(double)*som[i]->size*som[i]->kdim); + if ( (nw=fwrite(som[i]->c,sizeof(double),som[i]->size,fp))!=sizeof(double)*som[i]->size ) error("Failed to write %zu bytes\n",sizeof(double)*som[i]->size); + } + if ( fclose(fp) ) error("%s.som: fclose failed\n",prefix); +} +static som_t** som_load_map(char *prefix, int *nsom) +{ + FILE *fp = open_file(NULL,"r","%s.som",prefix); + char buf[5]; + if ( fread(buf,5,1,fp)!=1 || strncmp(buf,"SOMv1",5) ) error("Could not parse %s.som\n", prefix); + + if ( fread(nsom,sizeof(int),1,fp)!=1 ) error("Could not read %s.som\n", prefix); + som_t **som = (som_t**)malloc(*nsom*sizeof(som_t*)); + + int i; + for (i=0; i<*nsom; i++) + { + som[i] = (som_t*) calloc(1,sizeof(som_t)); + if ( fread(&som[i]->size,sizeof(int),1,fp) != 1 ) error("Could not read %s.som\n", prefix); + if ( fread(&som[i]->kdim,sizeof(int),1,fp) != 1 ) error("Could not read %s.som\n", prefix); + som[i]->w = (double*) malloc(sizeof(double)*som[i]->size*som[i]->kdim); + som[i]->c = (double*) malloc(sizeof(double)*som[i]->size); + if ( fread(som[i]->w,sizeof(double),som[i]->size*som[i]->kdim,fp) != som[i]->size*som[i]->kdim ) error("Could not read from %s.som\n", prefix); + if ( fread(som[i]->c,sizeof(double),som[i]->size,fp) != som[i]->size ) error("Could not read from %s.som\n", prefix); + } + if ( fclose(fp) ) error("%s.som: fclose failed\n",prefix); + return som; +} +static void som_create_plot(som_t *som, char *prefix) +{ + if ( som->ndim!=2 ) return; + + char *fname; + FILE *fp = open_file(&fname,"w","%s.py",prefix); + fprintf(fp, + "import matplotlib as mpl\n" + "mpl.use('Agg')\n" + "import matplotlib.pyplot as plt\n" + "\n" + "dat = [\n" + ); + int i,j; + double *val = som->c; + for (i=0; inbin; i++) + { + fprintf(fp,"["); + for (j=0; jnbin; j++) + { + if ( j>0 ) fprintf(fp,","); + fprintf(fp,"%e", *val); + val++; + } + fprintf(fp,"],\n"); + } + fprintf(fp, + "]\n" + "fig = plt.figure()\n" + "ax1 = plt.subplot(111)\n" + "im1 = ax1.imshow(dat)\n" + "fig.colorbar(im1)\n" + "plt.savefig('%s.png')\n" + "plt.close()\n" + "\n", prefix + ); + fclose(fp); + free(fname); +} +// Find the best matching unit: the node with minimum distance from the input vector +static inline int som_find_bmu(som_t *som, double *vec, double *dist) +{ + double *ptr = som->w; + double min_dist = HUGE_VAL; + int min_idx = 0; + + int i, k; + for (i=0; isize; i++) + { + double dist = 0; + for (k=0; kkdim; k++) + dist += (vec[k] - ptr[k]) * (vec[k] - ptr[k]); + if ( dist < min_dist ) + { + min_dist = dist; + min_idx = i; + } + ptr += som->kdim; + } + + if ( dist ) *dist = min_dist; + return min_idx; +} +static inline double som_get_score(som_t *som, double *vec, double bmu_th) +{ + double *ptr = som->w; + double min_dist = HUGE_VAL; + + int i, k; + for (i=0; isize; i++) + { + if ( som->c[i] >= bmu_th ) + { + double dist = 0; + for (k=0; kkdim; k++) + dist += (vec[k] - ptr[k]) * (vec[k] - ptr[k]); + if ( dist < min_dist ) min_dist = dist; + } + ptr += som->kdim; + } + return sqrt(min_dist); +} +// Convert flat index to that of a k-dimensional cube +static inline void som_idx_to_ndim(som_t *som, int idx, int *ndim) +{ + int i; + double sub = 0; + + ndim[0] = idx/som->div[0]; + for (i=1; indim; i++) + { + sub += ndim[i-1] * som->div[i-1]; + ndim[i] = (idx - sub)/som->div[i]; + } +} +static void som_train_site(som_t *som, double *vec, int update_counts) +{ + // update learning rate and learning radius + som->t++; + double dt = exp(-som->t/som->nt); + double learning_rate = som->learn * dt; + double radius = som->nbin * dt; radius *= radius; + + // find the best matching unit and its indexes + int min_idx = som_find_bmu(som, vec, NULL); + som_idx_to_ndim(som, min_idx, som->a_idx); + + // update the weights: traverse the map and make all nodes within the + // radius more similar to the input vector + double *ptr = som->w; + double *cnt = som->c; + int i, j, k; + for (i=0; isize; i++) + { + som_idx_to_ndim(som, i, som->b_idx); + double dist = 0; + for (j=0; jndim; j++) + dist += (som->a_idx[j] - som->b_idx[j]) * (som->a_idx[j] - som->b_idx[j]); + if ( dist <= radius ) + { + double influence = exp(-dist*dist*0.5/radius) * learning_rate; + for (k=0; kkdim; k++) + ptr[k] += influence * (vec[k] - ptr[k]); + + // Bad sites may help to shape the map, but only nodes with big enough + // influence will be used for classification. + if ( update_counts ) *cnt += influence; + } + ptr += som->kdim; + cnt++; + } +} +static void som_norm_counts(som_t *som) +{ + int i; + double max = 0; + for (i=0; isize; i++) + if ( max < som->c[i] ) max = som->c[i]; + for (i=0; isize; i++) + som->c[i] /= max; +} +static som_t *som_init(args_t *args) +{ + som_t *som = (som_t*) calloc(1,sizeof(som_t)); + som->ndim = args->ndim; + som->nbin = args->nbin; + som->kdim = args->mvals; + som->nt = args->ntrain; + som->learn = args->learn; + som->bmu_th = args->bmu_th; + som->size = pow(som->nbin,som->ndim); + som->w = (double*) malloc(sizeof(double)*som->size*som->kdim); + if ( !som->w ) error("Could not alloc %"PRIu64" bytes [nbin=%d ndim=%d kdim=%d]\n", (uint64_t)(sizeof(double)*som->size*som->kdim),som->nbin,som->ndim,som->kdim); + som->c = (double*) calloc(som->size,sizeof(double)); + if ( !som->w ) error("Could not alloc %"PRIu64" bytes [nbin=%d ndim=%d]\n", (uint64_t)(sizeof(double)*som->size),som->nbin,som->ndim); + int i; + for (i=0; isize*som->kdim; i++) + som->w[i] = random(); + som->a_idx = (int*) malloc(sizeof(int)*som->ndim); + som->b_idx = (int*) malloc(sizeof(int)*som->ndim); + som->div = (double*) malloc(sizeof(double)*som->ndim); + for (i=0; indim; i++) + som->div[i] = pow(som->nbin,som->ndim-i-1); + return som; +} +static void som_destroy(som_t *som) +{ + free(som->a_idx); free(som->b_idx); free(som->div); + free(som->w); free(som->c); + free(som); +} + +static void init_data(args_t *args) +{ + // Get first line to learn the vector size + annots_reader_reset(args); + annots_reader_next(args); + + if ( args->action==SOM_CLASSIFY ) + args->som = som_load_map(args->prefix,&args->nfold); +} +static void destroy_data(args_t *args) +{ + int i; + if ( args->som ) + { + for (i=0; infold; i++) som_destroy(args->som[i]); + } + free(args->train_dat); + free(args->train_class); + free(args->som); + free(args->vals); + free(args->str.s); +} + +#define MERGE_MIN 0 +#define MERGE_MAX 1 +#define MERGE_AVG 2 +static double get_min_score(args_t *args, int iskip) +{ + int i; + double score, min_score = HUGE_VAL; + for (i=0; infold; i++) + { + if ( i==iskip ) continue; + score = som_get_score(args->som[i], args->vals, args->bmu_th); + if ( i==0 || score < min_score ) min_score = score; + } + return min_score; +} +static double get_max_score(args_t *args, int iskip) +{ + int i; + double score, max_score = -HUGE_VAL; + for (i=0; infold; i++) + { + if ( i==iskip ) continue; + score = som_get_score(args->som[i], args->vals, args->bmu_th); + if ( i==0 || max_score < score ) max_score = score; + } + return max_score; +} +static double get_avg_score(args_t *args, int iskip) +{ + int i, n = 0; + double score = 0; + for (i=0; infold; i++) + { + if ( i==iskip ) continue; + score += som_get_score(args->som[i], args->vals, args->bmu_th); + n++; + } + return score/n; +} +static int cmpfloat_desc(const void *a, const void *b) +{ + float fa = *((float*)a); + float fb = *((float*)b); + if ( fafb ) return -1; + return 0; +} + +static void create_eval_plot(args_t *args) +{ + FILE *fp = open_file(NULL,"w","%s.eval.py", args->prefix); + fprintf(fp, + "import matplotlib as mpl\n" + "mpl.use('Agg')\n" + "import matplotlib.pyplot as plt\n" + "\n" + "import csv\n" + "csv.register_dialect('tab', delimiter='\\t', quoting=csv.QUOTE_NONE)\n" + "dat = []\n" + "with open('%s.eval', 'r') as f:\n" + "\treader = csv.reader(f, 'tab')\n" + "\tfor row in reader:\n" + "\t\tif row[0][0]!='#': dat.append(row)\n" + "\n" + "fig = plt.figure()\n" + "ax1 = plt.subplot(111)\n" + "ax1.plot([x[0] for x in dat],[x[1] for x in dat],'g',label='Good')\n" + "ax1.plot([x[0] for x in dat],[x[2] for x in dat],'r',label='Bad')\n" + "ax1.set_xlabel('SOM score')\n" + "ax1.set_ylabel('Number of training sites')\n" + "ax1.legend(loc='best',prop={'size':8},frameon=False)\n" + "plt.savefig('%s.eval.png')\n" + "plt.close()\n" + "\n", args->prefix,args->prefix + ); + fclose(fp); +} + +static void do_train(args_t *args) +{ + // read training sites + int i, igood = 0, ibad = 0, ngood = 0, nbad = 0, ntrain = 0; + annots_reader_reset(args); + while ( annots_reader_next(args) ) + { + // determine which of the nfold's SOMs to train + int isom = 0; + if ( args->dclass == args->good_class ) + { + if ( ++igood >= args->nfold ) igood = 0; + isom = igood; + ngood++; + } + else if ( args->dclass == args->bad_class ) + { + if ( ++ibad >= args->nfold ) ibad = 0; + isom = ibad; + nbad++; + } + else + error("Could not determine the class: %d (vs %d and %d)\n", args->dclass,args->good_class,args->bad_class); + + // save the values for evaluation + ntrain++; + hts_expand(double, ntrain*args->mvals, args->mtrain_dat, args->train_dat); + hts_expand(int, ntrain, args->mtrain_class, args->train_class); + memcpy(args->train_dat+(ntrain-1)*args->mvals, args->vals, args->mvals*sizeof(double)); + args->train_class[ntrain-1] = (args->dclass==args->good_class ? 1 : 0) | isom<<1; // store class + chunk used for training + } + annots_reader_close(args); + + // init maps + if ( !args->ntrain ) args->ntrain = ngood/args->nfold; + srandom(args->rand_seed); + args->som = (som_t**) malloc(sizeof(som_t*)*args->nfold); + for (i=0; infold; i++) args->som[i] = som_init(args); + + // train + for (i=0; itrain_class[i] & 1; + int isom = args->train_class[i] >> 1; + if ( is_good || args->train_bad ) + som_train_site(args->som[isom], args->train_dat+i*args->mvals, is_good); + } + + // norm and create plots + for (i=0; infold; i++) + { + som_norm_counts(args->som[i]); + if ( args->prefix ) + { + char *bname = msprintf("%s.som.%d", args->prefix,i); + som_create_plot(args->som[i], bname); + free(bname); + } + } + + // evaluate + float *good = (float*) malloc(sizeof(float)*ngood); assert(good); + float *bad = (float*) malloc(sizeof(float)*nbad); assert(bad); + igood = ibad = 0; + double max_score = sqrt(args->som[0]->kdim); + for (i=0; itrain_class[i] & 1; + int isom = args->train_class[i] >> 1; // this vector was used for training isom-th SOM, skip + if ( args->nfold==1 ) isom = -1; + memcpy(args->vals, args->train_dat+i*args->mvals, args->mvals*sizeof(double)); + switch (args->merge) + { + case MERGE_MIN: score = get_min_score(args, isom); break; + case MERGE_MAX: score = get_max_score(args, isom); break; + case MERGE_AVG: score = get_avg_score(args, isom); break; + } + score = 1.0 - score/max_score; + if ( is_good ) + good[igood++] = score; + else + bad[ibad++] = score; + } + qsort(good, ngood, sizeof(float), cmpfloat_desc); + qsort(bad, nbad, sizeof(float), cmpfloat_desc); + FILE *fp = NULL; + if ( args->prefix ) fp = open_file(NULL,"w","%s.eval", args->prefix); + igood = 0; + ibad = 0; + float prev_score = good[0]>bad[0] ? good[0] : bad[0]; + int printed = 0; + while ( igood 0.9 ) + { + printf("%.2f\t%.2f\t%e\t# %% of bad [1] and good [2] sites at a cutoff [3]\n", 100.*ibad/nbad,100.*igood/ngood,prev_score); + printed = 1; + } + + if ( igoodbad[ibad] ? good[igood] : bad[ibad]; + else if ( igoodprefix,strerror(errno)); + create_eval_plot(args); + som_write_map(args->prefix, args->som, args->nfold); + } + + free(good); + free(bad); +} + +static void do_classify(args_t *args) +{ + annots_reader_reset(args); + double max_score = sqrt(args->som[0]->kdim); + while ( annots_reader_next(args) ) + { + double score = 0; + switch (args->merge) + { + case MERGE_MIN: score = get_min_score(args, -1); break; + case MERGE_MAX: score = get_max_score(args, -1); break; + case MERGE_AVG: score = get_avg_score(args, -1); break; + } + printf("%e\n", 1.0 - score/max_score); + } + annots_reader_close(args); +} + +static void usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: SOM (Self-Organizing Map) filtering.\n"); + fprintf(stderr, "Usage: bcftools som --train [options] \n"); + fprintf(stderr, " bcftools som --classify [options]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Model training options:\n"); + fprintf(stderr, " -f, --nfold n-fold cross-validation (number of maps) [5]\n"); + fprintf(stderr, " -p, --prefix prefix of output files\n"); + fprintf(stderr, " -s, --size map size [20]\n"); + fprintf(stderr, " -t, --train \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Classifying options:\n"); + fprintf(stderr, " -c, --classify \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Experimental training options (no reason to change):\n"); + fprintf(stderr, " -b, --bmu-threshold threshold for selection of best-matching unit [0.9]\n"); + fprintf(stderr, " -d, --som-dimension SOM dimension [2]\n"); + fprintf(stderr, " -e, --exclude-bad exclude bad sites from training, use for evaluation only\n"); + fprintf(stderr, " -l, --learning-rate learning rate [1.0]\n"); + fprintf(stderr, " -m, --merge -f merge algorithm [avg]\n"); + fprintf(stderr, " -n, --ntrain-sites effective number of training sites [number of good sites]\n"); + fprintf(stderr, " -r, --random-seed random seed, 0 for time() [1]\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfsom(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->nbin = 20; + args->learn = 1.0; + args->bmu_th = 0.9; + args->nfold = 5; + args->rand_seed = 1; + args->ndim = 2; + args->bad_class = 1; + args->good_class = 2; + args->merge = MERGE_AVG; + args->train_bad = 1; + + static struct option loptions[] = + { + {"help",0,0,'h'}, + {"prefix",1,0,'p'}, + {"ntrain-sites",1,0,'n'}, + {"random-seed",1,0,'r'}, + {"bmu-threshold",1,0,'b'}, + {"exclude-bad",0,0,'e'}, + {"learning-rate",1,0,'l'}, + {"size",1,0,'s'}, + {"som-dimension",1,0,'d'}, + {"nfold",1,0,'f'}, + {"merge",1,0,'m'}, + {"train",0,0,'t'}, + {"classify",0,0,'c'}, + {0,0,0,0} + }; + while ((c = getopt_long(argc, argv, "htcp:n:r:b:l:s:f:d:m:e",loptions,NULL)) >= 0) { + switch (c) { + case 'e': args->train_bad = 0; break; + case 'm': + if ( !strcmp(optarg,"min") ) args->merge = MERGE_MIN; + else if ( !strcmp(optarg,"max") ) args->merge = MERGE_MAX; + else if ( !strcmp(optarg,"avg") ) args->merge = MERGE_AVG; + else error("The -m method not recognised: %s\n", optarg); + break; + case 'p': args->prefix = optarg; break; + case 'n': args->ntrain = atoi(optarg); break; + case 'r': args->rand_seed = atoi(optarg); break; + case 'b': args->bmu_th = atof(optarg); break; + case 'l': args->learn = atof(optarg); break; + case 's': args->nbin = atoi(optarg); break; + case 'f': args->nfold = atoi(optarg); break; + case 'd': + args->ndim = atoi(optarg); + if ( args->ndim<2 ) error("Expected -d >=2, got %d\n", args->ndim); + if ( args->ndim>3 ) fprintf(stderr,"Warning: This will take a long time and is not going to make the results better: -d %d\n", args->ndim); + break; + case 't': args->action = SOM_TRAIN; break; + case 'c': args->action = SOM_CLASSIFY; break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( !args->rand_seed ) args->rand_seed = time(NULL); + if ( argc!=optind+1 ) usage(); + args->fname = argv[optind]; + init_data(args); + + if ( args->action == SOM_TRAIN ) do_train(args); + else if ( args->action == SOM_CLASSIFY ) do_classify(args); + + destroy_data(args); + free(args); + return 0; +} + diff --git a/bcftools/vcfsom.c.pysam.c b/bcftools/vcfsom.c.pysam.c new file mode 100644 index 0000000..effd352 --- /dev/null +++ b/bcftools/vcfsom.c.pysam.c @@ -0,0 +1,720 @@ +#include "bcftools.pysam.h" + +/* vcfsom.c -- SOM (Self-Organizing Map) filtering. + + Copyright (C) 2013-2014, 2020 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" + +#define SOM_TRAIN 1 +#define SOM_CLASSIFY 2 + +typedef struct +{ + int ndim; // dimension of the map (2D, 3D, ...) + int nbin; // number of bins in th map + int size; // pow(nbin,ndim) + int kdim; // dimension of the input vectors + int nt, t; // total number of learning cycles and the current cycle + double *w, *c; // weights and counts (sum of learning influence) + double learn; // learning rate + double bmu_th; // best-matching unit threshold + int *a_idx, *b_idx; // temp arrays for traversing variable number of nested loops + double *div; // dtto +} +som_t; + +typedef struct +{ + // SOM parameters + double bmu_th, learn; + int ndim, nbin, ntrain, t; + int nfold; // n-fold cross validation = the number of SOMs + som_t **som; + + // annots reader's data + htsFile *file; // reader + kstring_t str; // temporary string for the reader + int dclass, mvals; + double *vals; + + // training data + double *train_dat; + int *train_class, mtrain_class, mtrain_dat; + + int rand_seed, good_class, bad_class; + char **argv, *fname, *prefix; + int argc, action, train_bad, merge; +} +args_t; + +static void usage(void); +FILE *open_file(char **fname, const char *mode, const char *fmt, ...); +void mkdir_p(const char *fmt, ...); + +char *msprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int n = vsnprintf(NULL, 0, fmt, ap) + 2; + va_end(ap); + + char *str = (char*)malloc(n); + va_start(ap, fmt); + vsnprintf(str, n, fmt, ap); + va_end(ap); + + return str; +} + +/* + * char *t, *p = str; + * t = column_next(p, '\t'); + * if ( strlen("")==t-p && !strncmp(p,"",t-p) ) fprintf(bcftools_stdout, "found!\n"); + * + * char *t; + * t = column_next(str, '\t'); if ( !*t ) error("expected field\n", str); + * t = column_next(t+1, '\t'); if ( !*t ) error("expected field\n", str); + */ +static inline char *column_next(char *start, char delim) +{ + char *end = start; + while (*end && *end!=delim) end++; + return end; +} +/** + * annots_reader_next() - reads next line from annots.tab.gz and sets: class, vals + * Returns 1 on successful read or 0 if no further record could be read. + */ +int annots_reader_next(args_t *args) +{ + args->str.l = 0; + if ( hts_getline(args->file,'\n',&args->str)<=0 ) return 0; + + char *t, *line = args->str.s; + + if ( !args->mvals ) + { + t = line; + while ( *t ) + { + if ( *t=='\t' ) args->mvals++; + t++; + } + args->vals = (double*) malloc(args->mvals*sizeof(double)); + } + + // class + args->dclass = atoi(line); + t = column_next(line, '\t'); + + // values + int i; + for (i=0; imvals; i++) + { + if ( !*t ) error("Could not parse %d-th data field: is the line truncated?\nThe line was: [%s]\n",i+2,line); + args->vals[i] = atof(++t); + t = column_next(t,'\t'); + } + return 1; +} +void annots_reader_reset(args_t *args) +{ + if ( args->file ) hts_close(args->file); + if ( !args->fname ) error("annots_reader_reset: no fname\n"); + args->file = hts_open(args->fname, "r"); +} +void annots_reader_close(args_t *args) +{ + hts_close(args->file); +} + +static void som_write_map(char *prefix, som_t **som, int nsom) +{ + FILE *fp = open_file(NULL,"w","%s.som",prefix); + size_t nw; + if ( (nw=fwrite("SOMv1",5,1,fp))!=5 ) error("Failed to write 5 bytes\n"); + if ( (nw=fwrite(&nsom,sizeof(int),1,fp))!=sizeof(int) ) error("Failed to write %zu bytes\n",sizeof(int)); + int i; + for (i=0; isize,sizeof(int),1,fp))!=sizeof(int) ) error("Failed to write %zu bytes\n",sizeof(int)); + if ( (nw=fwrite(&som[i]->kdim,sizeof(int),1,fp))!=sizeof(int) ) error("Failed to write %zu bytes\n",sizeof(int)); + if ( (nw=fwrite(som[i]->w,sizeof(double),som[i]->size*som[i]->kdim,fp))!=sizeof(double)*som[i]->size*som[i]->kdim ) error("Failed to write %zu bytes\n",sizeof(double)*som[i]->size*som[i]->kdim); + if ( (nw=fwrite(som[i]->c,sizeof(double),som[i]->size,fp))!=sizeof(double)*som[i]->size ) error("Failed to write %zu bytes\n",sizeof(double)*som[i]->size); + } + if ( fclose(fp) ) error("%s.som: fclose failed\n",prefix); +} +static som_t** som_load_map(char *prefix, int *nsom) +{ + FILE *fp = open_file(NULL,"r","%s.som",prefix); + char buf[5]; + if ( fread(buf,5,1,fp)!=1 || strncmp(buf,"SOMv1",5) ) error("Could not parse %s.som\n", prefix); + + if ( fread(nsom,sizeof(int),1,fp)!=1 ) error("Could not read %s.som\n", prefix); + som_t **som = (som_t**)malloc(*nsom*sizeof(som_t*)); + + int i; + for (i=0; i<*nsom; i++) + { + som[i] = (som_t*) calloc(1,sizeof(som_t)); + if ( fread(&som[i]->size,sizeof(int),1,fp) != 1 ) error("Could not read %s.som\n", prefix); + if ( fread(&som[i]->kdim,sizeof(int),1,fp) != 1 ) error("Could not read %s.som\n", prefix); + som[i]->w = (double*) malloc(sizeof(double)*som[i]->size*som[i]->kdim); + som[i]->c = (double*) malloc(sizeof(double)*som[i]->size); + if ( fread(som[i]->w,sizeof(double),som[i]->size*som[i]->kdim,fp) != som[i]->size*som[i]->kdim ) error("Could not read from %s.som\n", prefix); + if ( fread(som[i]->c,sizeof(double),som[i]->size,fp) != som[i]->size ) error("Could not read from %s.som\n", prefix); + } + if ( fclose(fp) ) error("%s.som: fclose failed\n",prefix); + return som; +} +static void som_create_plot(som_t *som, char *prefix) +{ + if ( som->ndim!=2 ) return; + + char *fname; + FILE *fp = open_file(&fname,"w","%s.py",prefix); + fprintf(fp, + "import matplotlib as mpl\n" + "mpl.use('Agg')\n" + "import matplotlib.pyplot as plt\n" + "\n" + "dat = [\n" + ); + int i,j; + double *val = som->c; + for (i=0; inbin; i++) + { + fprintf(fp,"["); + for (j=0; jnbin; j++) + { + if ( j>0 ) fprintf(fp,","); + fprintf(fp,"%e", *val); + val++; + } + fprintf(fp,"],\n"); + } + fprintf(fp, + "]\n" + "fig = plt.figure()\n" + "ax1 = plt.subplot(111)\n" + "im1 = ax1.imshow(dat)\n" + "fig.colorbar(im1)\n" + "plt.savefig('%s.png')\n" + "plt.close()\n" + "\n", prefix + ); + fclose(fp); + free(fname); +} +// Find the best matching unit: the node with minimum distance from the input vector +static inline int som_find_bmu(som_t *som, double *vec, double *dist) +{ + double *ptr = som->w; + double min_dist = HUGE_VAL; + int min_idx = 0; + + int i, k; + for (i=0; isize; i++) + { + double dist = 0; + for (k=0; kkdim; k++) + dist += (vec[k] - ptr[k]) * (vec[k] - ptr[k]); + if ( dist < min_dist ) + { + min_dist = dist; + min_idx = i; + } + ptr += som->kdim; + } + + if ( dist ) *dist = min_dist; + return min_idx; +} +static inline double som_get_score(som_t *som, double *vec, double bmu_th) +{ + double *ptr = som->w; + double min_dist = HUGE_VAL; + + int i, k; + for (i=0; isize; i++) + { + if ( som->c[i] >= bmu_th ) + { + double dist = 0; + for (k=0; kkdim; k++) + dist += (vec[k] - ptr[k]) * (vec[k] - ptr[k]); + if ( dist < min_dist ) min_dist = dist; + } + ptr += som->kdim; + } + return sqrt(min_dist); +} +// Convert flat index to that of a k-dimensional cube +static inline void som_idx_to_ndim(som_t *som, int idx, int *ndim) +{ + int i; + double sub = 0; + + ndim[0] = idx/som->div[0]; + for (i=1; indim; i++) + { + sub += ndim[i-1] * som->div[i-1]; + ndim[i] = (idx - sub)/som->div[i]; + } +} +static void som_train_site(som_t *som, double *vec, int update_counts) +{ + // update learning rate and learning radius + som->t++; + double dt = exp(-som->t/som->nt); + double learning_rate = som->learn * dt; + double radius = som->nbin * dt; radius *= radius; + + // find the best matching unit and its indexes + int min_idx = som_find_bmu(som, vec, NULL); + som_idx_to_ndim(som, min_idx, som->a_idx); + + // update the weights: traverse the map and make all nodes within the + // radius more similar to the input vector + double *ptr = som->w; + double *cnt = som->c; + int i, j, k; + for (i=0; isize; i++) + { + som_idx_to_ndim(som, i, som->b_idx); + double dist = 0; + for (j=0; jndim; j++) + dist += (som->a_idx[j] - som->b_idx[j]) * (som->a_idx[j] - som->b_idx[j]); + if ( dist <= radius ) + { + double influence = exp(-dist*dist*0.5/radius) * learning_rate; + for (k=0; kkdim; k++) + ptr[k] += influence * (vec[k] - ptr[k]); + + // Bad sites may help to shape the map, but only nodes with big enough + // influence will be used for classification. + if ( update_counts ) *cnt += influence; + } + ptr += som->kdim; + cnt++; + } +} +static void som_norm_counts(som_t *som) +{ + int i; + double max = 0; + for (i=0; isize; i++) + if ( max < som->c[i] ) max = som->c[i]; + for (i=0; isize; i++) + som->c[i] /= max; +} +static som_t *som_init(args_t *args) +{ + som_t *som = (som_t*) calloc(1,sizeof(som_t)); + som->ndim = args->ndim; + som->nbin = args->nbin; + som->kdim = args->mvals; + som->nt = args->ntrain; + som->learn = args->learn; + som->bmu_th = args->bmu_th; + som->size = pow(som->nbin,som->ndim); + som->w = (double*) malloc(sizeof(double)*som->size*som->kdim); + if ( !som->w ) error("Could not alloc %"PRIu64" bytes [nbin=%d ndim=%d kdim=%d]\n", (uint64_t)(sizeof(double)*som->size*som->kdim),som->nbin,som->ndim,som->kdim); + som->c = (double*) calloc(som->size,sizeof(double)); + if ( !som->w ) error("Could not alloc %"PRIu64" bytes [nbin=%d ndim=%d]\n", (uint64_t)(sizeof(double)*som->size),som->nbin,som->ndim); + int i; + for (i=0; isize*som->kdim; i++) + som->w[i] = random(); + som->a_idx = (int*) malloc(sizeof(int)*som->ndim); + som->b_idx = (int*) malloc(sizeof(int)*som->ndim); + som->div = (double*) malloc(sizeof(double)*som->ndim); + for (i=0; indim; i++) + som->div[i] = pow(som->nbin,som->ndim-i-1); + return som; +} +static void som_destroy(som_t *som) +{ + free(som->a_idx); free(som->b_idx); free(som->div); + free(som->w); free(som->c); + free(som); +} + +static void init_data(args_t *args) +{ + // Get first line to learn the vector size + annots_reader_reset(args); + annots_reader_next(args); + + if ( args->action==SOM_CLASSIFY ) + args->som = som_load_map(args->prefix,&args->nfold); +} +static void destroy_data(args_t *args) +{ + int i; + if ( args->som ) + { + for (i=0; infold; i++) som_destroy(args->som[i]); + } + free(args->train_dat); + free(args->train_class); + free(args->som); + free(args->vals); + free(args->str.s); +} + +#define MERGE_MIN 0 +#define MERGE_MAX 1 +#define MERGE_AVG 2 +static double get_min_score(args_t *args, int iskip) +{ + int i; + double score, min_score = HUGE_VAL; + for (i=0; infold; i++) + { + if ( i==iskip ) continue; + score = som_get_score(args->som[i], args->vals, args->bmu_th); + if ( i==0 || score < min_score ) min_score = score; + } + return min_score; +} +static double get_max_score(args_t *args, int iskip) +{ + int i; + double score, max_score = -HUGE_VAL; + for (i=0; infold; i++) + { + if ( i==iskip ) continue; + score = som_get_score(args->som[i], args->vals, args->bmu_th); + if ( i==0 || max_score < score ) max_score = score; + } + return max_score; +} +static double get_avg_score(args_t *args, int iskip) +{ + int i, n = 0; + double score = 0; + for (i=0; infold; i++) + { + if ( i==iskip ) continue; + score += som_get_score(args->som[i], args->vals, args->bmu_th); + n++; + } + return score/n; +} +static int cmpfloat_desc(const void *a, const void *b) +{ + float fa = *((float*)a); + float fb = *((float*)b); + if ( fafb ) return -1; + return 0; +} + +static void create_eval_plot(args_t *args) +{ + FILE *fp = open_file(NULL,"w","%s.eval.py", args->prefix); + fprintf(fp, + "import matplotlib as mpl\n" + "mpl.use('Agg')\n" + "import matplotlib.pyplot as plt\n" + "\n" + "import csv\n" + "csv.register_dialect('tab', delimiter='\\t', quoting=csv.QUOTE_NONE)\n" + "dat = []\n" + "with open('%s.eval', 'r') as f:\n" + "\treader = csv.reader(f, 'tab')\n" + "\tfor row in reader:\n" + "\t\tif row[0][0]!='#': dat.append(row)\n" + "\n" + "fig = plt.figure()\n" + "ax1 = plt.subplot(111)\n" + "ax1.plot([x[0] for x in dat],[x[1] for x in dat],'g',label='Good')\n" + "ax1.plot([x[0] for x in dat],[x[2] for x in dat],'r',label='Bad')\n" + "ax1.set_xlabel('SOM score')\n" + "ax1.set_ylabel('Number of training sites')\n" + "ax1.legend(loc='best',prop={'size':8},frameon=False)\n" + "plt.savefig('%s.eval.png')\n" + "plt.close()\n" + "\n", args->prefix,args->prefix + ); + fclose(fp); +} + +static void do_train(args_t *args) +{ + // read training sites + int i, igood = 0, ibad = 0, ngood = 0, nbad = 0, ntrain = 0; + annots_reader_reset(args); + while ( annots_reader_next(args) ) + { + // determine which of the nfold's SOMs to train + int isom = 0; + if ( args->dclass == args->good_class ) + { + if ( ++igood >= args->nfold ) igood = 0; + isom = igood; + ngood++; + } + else if ( args->dclass == args->bad_class ) + { + if ( ++ibad >= args->nfold ) ibad = 0; + isom = ibad; + nbad++; + } + else + error("Could not determine the class: %d (vs %d and %d)\n", args->dclass,args->good_class,args->bad_class); + + // save the values for evaluation + ntrain++; + hts_expand(double, ntrain*args->mvals, args->mtrain_dat, args->train_dat); + hts_expand(int, ntrain, args->mtrain_class, args->train_class); + memcpy(args->train_dat+(ntrain-1)*args->mvals, args->vals, args->mvals*sizeof(double)); + args->train_class[ntrain-1] = (args->dclass==args->good_class ? 1 : 0) | isom<<1; // store class + chunk used for training + } + annots_reader_close(args); + + // init maps + if ( !args->ntrain ) args->ntrain = ngood/args->nfold; + srandom(args->rand_seed); + args->som = (som_t**) malloc(sizeof(som_t*)*args->nfold); + for (i=0; infold; i++) args->som[i] = som_init(args); + + // train + for (i=0; itrain_class[i] & 1; + int isom = args->train_class[i] >> 1; + if ( is_good || args->train_bad ) + som_train_site(args->som[isom], args->train_dat+i*args->mvals, is_good); + } + + // norm and create plots + for (i=0; infold; i++) + { + som_norm_counts(args->som[i]); + if ( args->prefix ) + { + char *bname = msprintf("%s.som.%d", args->prefix,i); + som_create_plot(args->som[i], bname); + free(bname); + } + } + + // evaluate + float *good = (float*) malloc(sizeof(float)*ngood); assert(good); + float *bad = (float*) malloc(sizeof(float)*nbad); assert(bad); + igood = ibad = 0; + double max_score = sqrt(args->som[0]->kdim); + for (i=0; itrain_class[i] & 1; + int isom = args->train_class[i] >> 1; // this vector was used for training isom-th SOM, skip + if ( args->nfold==1 ) isom = -1; + memcpy(args->vals, args->train_dat+i*args->mvals, args->mvals*sizeof(double)); + switch (args->merge) + { + case MERGE_MIN: score = get_min_score(args, isom); break; + case MERGE_MAX: score = get_max_score(args, isom); break; + case MERGE_AVG: score = get_avg_score(args, isom); break; + } + score = 1.0 - score/max_score; + if ( is_good ) + good[igood++] = score; + else + bad[ibad++] = score; + } + qsort(good, ngood, sizeof(float), cmpfloat_desc); + qsort(bad, nbad, sizeof(float), cmpfloat_desc); + FILE *fp = NULL; + if ( args->prefix ) fp = open_file(NULL,"w","%s.eval", args->prefix); + igood = 0; + ibad = 0; + float prev_score = good[0]>bad[0] ? good[0] : bad[0]; + int printed = 0; + while ( igood 0.9 ) + { + fprintf(bcftools_stdout, "%.2f\t%.2f\t%e\t# %% of bad [1] and good [2] sites at a cutoff [3]\n", 100.*ibad/nbad,100.*igood/ngood,prev_score); + printed = 1; + } + + if ( igoodbad[ibad] ? good[igood] : bad[ibad]; + else if ( igoodprefix,strerror(errno)); + create_eval_plot(args); + som_write_map(args->prefix, args->som, args->nfold); + } + + free(good); + free(bad); +} + +static void do_classify(args_t *args) +{ + annots_reader_reset(args); + double max_score = sqrt(args->som[0]->kdim); + while ( annots_reader_next(args) ) + { + double score = 0; + switch (args->merge) + { + case MERGE_MIN: score = get_min_score(args, -1); break; + case MERGE_MAX: score = get_max_score(args, -1); break; + case MERGE_AVG: score = get_avg_score(args, -1); break; + } + fprintf(bcftools_stdout, "%e\n", 1.0 - score/max_score); + } + annots_reader_close(args); +} + +static void usage(void) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: SOM (Self-Organizing Map) filtering.\n"); + fprintf(bcftools_stderr, "Usage: bcftools som --train [options] \n"); + fprintf(bcftools_stderr, " bcftools som --classify [options]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Model training options:\n"); + fprintf(bcftools_stderr, " -f, --nfold n-fold cross-validation (number of maps) [5]\n"); + fprintf(bcftools_stderr, " -p, --prefix prefix of output files\n"); + fprintf(bcftools_stderr, " -s, --size map size [20]\n"); + fprintf(bcftools_stderr, " -t, --train \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Classifying options:\n"); + fprintf(bcftools_stderr, " -c, --classify \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Experimental training options (no reason to change):\n"); + fprintf(bcftools_stderr, " -b, --bmu-threshold threshold for selection of best-matching unit [0.9]\n"); + fprintf(bcftools_stderr, " -d, --som-dimension SOM dimension [2]\n"); + fprintf(bcftools_stderr, " -e, --exclude-bad exclude bad sites from training, use for evaluation only\n"); + fprintf(bcftools_stderr, " -l, --learning-rate learning rate [1.0]\n"); + fprintf(bcftools_stderr, " -m, --merge -f merge algorithm [avg]\n"); + fprintf(bcftools_stderr, " -n, --ntrain-sites effective number of training sites [number of good sites]\n"); + fprintf(bcftools_stderr, " -r, --random-seed random seed, 0 for time() [1]\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfsom(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->nbin = 20; + args->learn = 1.0; + args->bmu_th = 0.9; + args->nfold = 5; + args->rand_seed = 1; + args->ndim = 2; + args->bad_class = 1; + args->good_class = 2; + args->merge = MERGE_AVG; + args->train_bad = 1; + + static struct option loptions[] = + { + {"help",0,0,'h'}, + {"prefix",1,0,'p'}, + {"ntrain-sites",1,0,'n'}, + {"random-seed",1,0,'r'}, + {"bmu-threshold",1,0,'b'}, + {"exclude-bad",0,0,'e'}, + {"learning-rate",1,0,'l'}, + {"size",1,0,'s'}, + {"som-dimension",1,0,'d'}, + {"nfold",1,0,'f'}, + {"merge",1,0,'m'}, + {"train",0,0,'t'}, + {"classify",0,0,'c'}, + {0,0,0,0} + }; + while ((c = getopt_long(argc, argv, "htcp:n:r:b:l:s:f:d:m:e",loptions,NULL)) >= 0) { + switch (c) { + case 'e': args->train_bad = 0; break; + case 'm': + if ( !strcmp(optarg,"min") ) args->merge = MERGE_MIN; + else if ( !strcmp(optarg,"max") ) args->merge = MERGE_MAX; + else if ( !strcmp(optarg,"avg") ) args->merge = MERGE_AVG; + else error("The -m method not recognised: %s\n", optarg); + break; + case 'p': args->prefix = optarg; break; + case 'n': args->ntrain = atoi(optarg); break; + case 'r': args->rand_seed = atoi(optarg); break; + case 'b': args->bmu_th = atof(optarg); break; + case 'l': args->learn = atof(optarg); break; + case 's': args->nbin = atoi(optarg); break; + case 'f': args->nfold = atoi(optarg); break; + case 'd': + args->ndim = atoi(optarg); + if ( args->ndim<2 ) error("Expected -d >=2, got %d\n", args->ndim); + if ( args->ndim>3 ) fprintf(bcftools_stderr,"Warning: This will take a long time and is not going to make the results better: -d %d\n", args->ndim); + break; + case 't': args->action = SOM_TRAIN; break; + case 'c': args->action = SOM_CLASSIFY; break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( !args->rand_seed ) args->rand_seed = time(NULL); + if ( argc!=optind+1 ) usage(); + args->fname = argv[optind]; + init_data(args); + + if ( args->action == SOM_TRAIN ) do_train(args); + else if ( args->action == SOM_CLASSIFY ) do_classify(args); + + destroy_data(args); + free(args); + return 0; +} + diff --git a/bcftools/vcfsort.c b/bcftools/vcfsort.c new file mode 100644 index 0000000..a8052d0 --- /dev/null +++ b/bcftools/vcfsort.c @@ -0,0 +1,443 @@ +/* vcfsort.c -- sort subcommand + + Copyright (C) 2017-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include +#include +#include "kheap.h" +#include "bcftools.h" + +typedef struct +{ + char *fname; + htsFile *fh; + bcf1_t *rec; +} +blk_t; + +typedef struct _args_t +{ + bcf_hdr_t *hdr; + char **argv, *fname, *output_fname, *tmp_dir; + int argc, output_type, clevel; + size_t max_mem, mem; + bcf1_t **buf; + uint8_t *mem_block; + size_t nbuf, mbuf, nblk; + blk_t *blk; +} +args_t; + +void clean_files(args_t *args) +{ + int i; + fprintf(stderr,"Cleaning\n"); + for (i=0; inblk; i++) + { + blk_t *blk = args->blk + i; + if ( blk->fname ) + { + unlink(blk->fname); + free(blk->fname); + } + if ( blk->rec ) + bcf_destroy(blk->rec); + } + rmdir(args->tmp_dir); +} +void clean_files_and_throw(args_t *args, const char *format, ...) +{ + va_list ap; + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + clean_files(args); + exit(-1); +} + +int cmp_bcf_pos(const void *aptr, const void *bptr) +{ + bcf1_t *a = *((bcf1_t**)aptr); + bcf1_t *b = *((bcf1_t**)bptr); + if ( a->rid < b->rid ) return -1; + if ( a->rid > b->rid ) return 1; + if ( a->pos < b->pos ) return -1; + if ( a->pos > b->pos ) return 1; + + // Sort the same chr:pos records lexicographically by ref,alt. + // This will be called rarely so should not slow the sorting down + // noticeably. + + int i; + for (i=0; in_allele; i++) + { + if ( i >= b->n_allele ) return 1; + int ret = strcasecmp(a->d.allele[i],b->d.allele[i]); + if ( ret ) return ret; + } + if ( a->n_allele < b->n_allele ) return -1; + return 0; +} + +void buf_flush(args_t *args) +{ + if ( !args->nbuf ) return; + + qsort(args->buf, args->nbuf, sizeof(*args->buf), cmp_bcf_pos); + + args->nblk++; + args->blk = (blk_t*) realloc(args->blk, sizeof(blk_t)*args->nblk); + blk_t *blk = args->blk + args->nblk - 1; + + kstring_t str = {0,0,0}; + ksprintf(&str, "%s/%05d.bcf", args->tmp_dir, (int)args->nblk); + blk->fname = str.s; + blk->rec = NULL; + blk->fh = NULL; + + htsFile *fh = hts_open(blk->fname, "wbu"); + if ( fh == NULL ) clean_files_and_throw(args, "Cannot write %s: %s\n", blk->fname, strerror(errno)); + if ( bcf_hdr_write(fh, args->hdr)!=0 ) clean_files_and_throw(args, "[%s] Error: cannot write to %s\n", __func__,blk->fname); + + int i; + for (i=0; inbuf; i++) + { + if ( bcf_write(fh, args->hdr, args->buf[i])!=0 ) clean_files_and_throw(args, "[%s] Error: cannot write to %s\n", __func__,blk->fname); + } + if ( hts_close(fh)!=0 ) clean_files_and_throw(args, "[%s] Error: close failed .. %s\n", __func__,blk->fname); + + args->nbuf = 0; + args->mem = 0; +} + + +static inline uint8_t *_align_up(uint8_t *ptr) +{ + return (uint8_t*)(((size_t)ptr + 8 - 1) & ~((size_t)(8 - 1))); +} + +void buf_push(args_t *args, bcf1_t *rec) +{ + size_t delta = sizeof(bcf1_t) + rec->shared.l + rec->indiv.l + rec->unpack_size[0] + rec->unpack_size[1] + + sizeof(*rec->d.allele)*rec->d.m_allele + + sizeof(bcf1_t*) // args->buf + + 8; // the number of _align_up() calls + + if ( delta > args->max_mem - args->mem ) + { + args->nbuf++; + hts_expand(bcf1_t*, args->nbuf, args->mbuf, args->buf); + args->buf[args->nbuf-1] = rec; + buf_flush(args); + bcf_destroy(rec); + return; + } + + // make sure nothing has changed in htslib + assert( rec->unpacked==BCF_UN_STR && !rec->d.flt && !rec->d.info && !rec->d.fmt && !rec->d.var ); + + uint8_t *ptr_beg = args->mem_block + args->mem; + uint8_t *ptr = _align_up(ptr_beg); + bcf1_t *new_rec = (bcf1_t*)ptr; + memcpy(new_rec,rec,sizeof(*rec)); + ptr += sizeof(*rec); + + // The array of allele pointers does not need alignment as bcf1_t is already padded to the biggest + // data type in the structure + char **allele = (char**)ptr; + ptr += rec->n_allele*sizeof(*allele); + + // This is just to prevent valgrind from complaining about memcpy, unpack_size is a high-water mark + // and the end may be uninitialized + delta = rec->d.allele[rec->n_allele-1] - rec->d.allele[0]; + while ( delta < rec->unpack_size[1] ) if ( !rec->d.als[delta++] ) break; + memcpy(ptr,rec->d.als,delta); + new_rec->d.als = (char*)ptr; + ptr = ptr + delta; + + int i; + for (i=0; in_allele; i++) allele[i] = new_rec->d.als + (ptrdiff_t)(rec->d.allele[i] - rec->d.allele[0]); + new_rec->d.allele = allele; + + memcpy(ptr,rec->shared.s,rec->shared.l); + new_rec->shared.s = (char*)ptr; + new_rec->shared.m = rec->shared.l; + ptr += rec->shared.l; + + memcpy(ptr,rec->indiv.s,rec->indiv.l); + new_rec->indiv.s = (char*)ptr; + new_rec->indiv.m = rec->indiv.l; + ptr += rec->indiv.l; + + // This is just to prevent valgrind from complaining about memcpy, unpack_size is a high-water mark + // and the end may be uninitialized + i = 0; + while ( i < rec->unpack_size[0] ) if ( !rec->d.id[i++] ) break; + memcpy(ptr,rec->d.id,i); + new_rec->d.id = (char*)ptr; + ptr += i; + + args->nbuf++; + hts_expand(bcf1_t*, args->nbuf, args->mbuf, args->buf); + args->buf[args->nbuf-1] = new_rec; + + delta = ptr - ptr_beg; + args->mem += delta; + + assert( args->mem <= args->max_mem ); + + bcf_destroy(rec); +} + +void sort_blocks(args_t *args) +{ + htsFile *in = hts_open(args->fname, "r"); + if ( !in ) clean_files_and_throw(args, "Could not read %s\n", args->fname); + args->hdr = bcf_hdr_read(in); + if ( !args->hdr) clean_files_and_throw(args, "Could not read VCF/BCF headers from %s\n", args->fname); + + while ( 1 ) + { + bcf1_t *rec = bcf_init(); + int ret = bcf_read1(in, args->hdr, rec); + if ( ret < -1 ) clean_files_and_throw(args,"Error encountered while parsing the input\n"); + if ( ret == -1 ) + { + bcf_destroy(rec); + break; + } + if ( rec->errcode ) clean_files_and_throw(args,"Error encountered while parsing the input at %s:%d\n",bcf_seqname(args->hdr,rec),rec->pos+1); + bcf_unpack(rec, BCF_UN_STR); + buf_push(args, rec); + } + buf_flush(args); + free(args->buf); + + if ( hts_close(in)!=0 ) clean_files_and_throw(args,"Close failed: %s\n", args->fname); +} + +static inline int blk_is_smaller(blk_t **aptr, blk_t **bptr) +{ + blk_t *a = *aptr; + blk_t *b = *bptr; + int ret = cmp_bcf_pos(&a->rec, &b->rec); + if ( ret < 0 ) return 1; + return 0; +} +KHEAP_INIT(blk, blk_t*, blk_is_smaller) + +void blk_read(args_t *args, khp_blk_t *bhp, bcf_hdr_t *hdr, blk_t *blk) +{ + if ( !blk->fh ) return; + int ret = bcf_read(blk->fh, hdr, blk->rec); + if ( ret < -1 ) clean_files_and_throw(args, "Error reading %s\n", blk->fname); + if ( ret == -1 ) + { + if ( hts_close(blk->fh)!=0 ) clean_files_and_throw(args, "Close failed: %s\n", blk->fname); + blk->fh = 0; + return; + } + bcf_unpack(blk->rec, BCF_UN_STR); + khp_insert(blk, bhp, &blk); +} + +void merge_blocks(args_t *args) +{ + fprintf(stderr,"Merging %d temporary files\n", (int)args->nblk); + khp_blk_t *bhp = khp_init(blk); + + int i; + for (i=0; inblk; i++) + { + blk_t *blk = args->blk + i; + blk->fh = hts_open(blk->fname, "r"); + if ( !blk->fh ) clean_files_and_throw(args, "Could not read %s: %s\n", blk->fname, strerror(errno)); + bcf_hdr_t *hdr = bcf_hdr_read(blk->fh); + bcf_hdr_destroy(hdr); + blk->rec = bcf_init(); + blk_read(args, bhp, args->hdr, blk); + } + + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + htsFile *out = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( bcf_hdr_write(out, args->hdr)!=0 ) clean_files_and_throw(args, "[%s] Error: cannot write to %s\n", __func__,args->output_fname); + while ( bhp->ndat ) + { + blk_t *blk = bhp->dat[0]; + if ( bcf_write(out, args->hdr, blk->rec)!=0 ) clean_files_and_throw(args, "[%s] Error: cannot write to %s\n", __func__,args->output_fname); + khp_delete(blk, bhp); + blk_read(args, bhp, args->hdr, blk); + } + if ( hts_close(out)!=0 ) clean_files_and_throw(args, "Close failed: %s\n", args->output_fname); + + clean_files(args); + + free(args->blk); + khp_destroy(blk, bhp); + fprintf(stderr,"Done\n"); +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Sort VCF/BCF file.\n"); + fprintf(stderr, "Usage: bcftools sort [OPTIONS] \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -m, --max-mem FLOAT[kMG] maximum memory to use [768M]\n"); // using metric units, 1M=1e6 + fprintf(stderr, " -o, --output FILE output file name [stdout]\n"); + fprintf(stderr, " -O, --output-type b|u|z|v b: compressed BCF, u: uncompressed BCF, z: compressed VCF, v: uncompressed VCF [v]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + +#ifdef _WIN32 + fprintf(stderr, " -T, --temp-dir DIR temporary files [/bcftools.XXXXXX]\n"); +#else + fprintf(stderr, " -T, --temp-dir DIR temporary files [/tmp/bcftools.XXXXXX]\n"); +#endif + fprintf(stderr, "\n"); + exit(1); +} + +size_t parse_mem_string(const char *str) +{ + char *tmp; + double mem = strtod(str, &tmp); + if ( tmp==str ) error("Could not parse the memory string: \"%s\"\n", str); + if ( !strcasecmp("k",tmp) ) mem *= 1000; + else if ( !strcasecmp("m",tmp) ) mem *= 1000*1000; + else if ( !strcasecmp("g",tmp) ) mem *= 1000*1000*1000; + return mem; +} + +void mkdir_p(const char *fmt, ...); +static void init(args_t *args) +{ + args->max_mem *= 0.9; + args->mem_block = malloc(args->max_mem); + args->mem = 0; + + args->tmp_dir = init_tmp_prefix(args->tmp_dir); + +#ifdef _WIN32 + int ret = mkdir(mktemp(args->tmp_dir), 0700); + if ( ret ) error("mkdir(%s) failed: %s\n", args->tmp_dir,strerror(errno)); +#else + char *tmp = mkdtemp(args->tmp_dir); + if ( !tmp ) error("mkdtemp(%s) failed: %s\n", args->tmp_dir,strerror(errno)); + int ret = chmod(tmp, S_IRUSR|S_IWUSR|S_IXUSR); + if ( ret ) error("chmod(%s,S_IRUSR|S_IWUSR|S_IXUSR) failed: %s\n", args->tmp_dir,strerror(errno)); +#endif + + fprintf(stderr,"Writing to %s\n", args->tmp_dir); +} +static void destroy(args_t *args) +{ + bcf_hdr_destroy(args->hdr); + free(args->mem_block); + free(args->tmp_dir); + free(args); +} + +int main_sort(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->max_mem = 768*1000*1000; + args->output_fname = "-"; + args->clevel = -1; + + static struct option loptions[] = + { + {"max-mem",required_argument,NULL,'m'}, + {"temp-dir",required_argument,NULL,'T'}, + {"output-type",required_argument,NULL,'O'}, + {"output-file",required_argument,NULL,'o'}, + {"output",required_argument,NULL,'o'}, + {"help",no_argument,NULL,'h'}, + {0,0,0,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "m:T:O:o:h?",loptions,NULL)) >= 0) + { + switch (c) + { + case 'm': args->max_mem = parse_mem_string(optarg); break; + case 'T': args->tmp_dir = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args->fname = "-"; // reading from stdin + else usage(args); + } + else args->fname = argv[optind]; + + init(args); + sort_blocks(args); + merge_blocks(args); + destroy(args); + + return 0; +} diff --git a/bcftools/vcfsort.c.pysam.c b/bcftools/vcfsort.c.pysam.c new file mode 100644 index 0000000..d3eb6b7 --- /dev/null +++ b/bcftools/vcfsort.c.pysam.c @@ -0,0 +1,445 @@ +#include "bcftools.pysam.h" + +/* vcfsort.c -- sort subcommand + + Copyright (C) 2017-2021 Genome Research Ltd. + + Author: Petr Danecek + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif +#include +#include +#include +#include "kheap.h" +#include "bcftools.h" + +typedef struct +{ + char *fname; + htsFile *fh; + bcf1_t *rec; +} +blk_t; + +typedef struct _args_t +{ + bcf_hdr_t *hdr; + char **argv, *fname, *output_fname, *tmp_dir; + int argc, output_type, clevel; + size_t max_mem, mem; + bcf1_t **buf; + uint8_t *mem_block; + size_t nbuf, mbuf, nblk; + blk_t *blk; +} +args_t; + +void clean_files(args_t *args) +{ + int i; + fprintf(bcftools_stderr,"Cleaning\n"); + for (i=0; inblk; i++) + { + blk_t *blk = args->blk + i; + if ( blk->fname ) + { + unlink(blk->fname); + free(blk->fname); + } + if ( blk->rec ) + bcf_destroy(blk->rec); + } + rmdir(args->tmp_dir); +} +void clean_files_and_throw(args_t *args, const char *format, ...) +{ + va_list ap; + va_start(ap, format); + vfprintf(bcftools_stderr, format, ap); + va_end(ap); + clean_files(args); + bcftools_exit(-1); +} + +int cmp_bcf_pos(const void *aptr, const void *bptr) +{ + bcf1_t *a = *((bcf1_t**)aptr); + bcf1_t *b = *((bcf1_t**)bptr); + if ( a->rid < b->rid ) return -1; + if ( a->rid > b->rid ) return 1; + if ( a->pos < b->pos ) return -1; + if ( a->pos > b->pos ) return 1; + + // Sort the same chr:pos records lexicographically by ref,alt. + // This will be called rarely so should not slow the sorting down + // noticeably. + + int i; + for (i=0; in_allele; i++) + { + if ( i >= b->n_allele ) return 1; + int ret = strcasecmp(a->d.allele[i],b->d.allele[i]); + if ( ret ) return ret; + } + if ( a->n_allele < b->n_allele ) return -1; + return 0; +} + +void buf_flush(args_t *args) +{ + if ( !args->nbuf ) return; + + qsort(args->buf, args->nbuf, sizeof(*args->buf), cmp_bcf_pos); + + args->nblk++; + args->blk = (blk_t*) realloc(args->blk, sizeof(blk_t)*args->nblk); + blk_t *blk = args->blk + args->nblk - 1; + + kstring_t str = {0,0,0}; + ksprintf(&str, "%s/%05d.bcf", args->tmp_dir, (int)args->nblk); + blk->fname = str.s; + blk->rec = NULL; + blk->fh = NULL; + + htsFile *fh = hts_open(blk->fname, "wbu"); + if ( fh == NULL ) clean_files_and_throw(args, "Cannot write %s: %s\n", blk->fname, strerror(errno)); + if ( bcf_hdr_write(fh, args->hdr)!=0 ) clean_files_and_throw(args, "[%s] Error: cannot write to %s\n", __func__,blk->fname); + + int i; + for (i=0; inbuf; i++) + { + if ( bcf_write(fh, args->hdr, args->buf[i])!=0 ) clean_files_and_throw(args, "[%s] Error: cannot write to %s\n", __func__,blk->fname); + } + if ( hts_close(fh)!=0 ) clean_files_and_throw(args, "[%s] Error: close failed .. %s\n", __func__,blk->fname); + + args->nbuf = 0; + args->mem = 0; +} + + +static inline uint8_t *_align_up(uint8_t *ptr) +{ + return (uint8_t*)(((size_t)ptr + 8 - 1) & ~((size_t)(8 - 1))); +} + +void buf_push(args_t *args, bcf1_t *rec) +{ + size_t delta = sizeof(bcf1_t) + rec->shared.l + rec->indiv.l + rec->unpack_size[0] + rec->unpack_size[1] + + sizeof(*rec->d.allele)*rec->d.m_allele + + sizeof(bcf1_t*) // args->buf + + 8; // the number of _align_up() calls + + if ( delta > args->max_mem - args->mem ) + { + args->nbuf++; + hts_expand(bcf1_t*, args->nbuf, args->mbuf, args->buf); + args->buf[args->nbuf-1] = rec; + buf_flush(args); + bcf_destroy(rec); + return; + } + + // make sure nothing has changed in htslib + assert( rec->unpacked==BCF_UN_STR && !rec->d.flt && !rec->d.info && !rec->d.fmt && !rec->d.var ); + + uint8_t *ptr_beg = args->mem_block + args->mem; + uint8_t *ptr = _align_up(ptr_beg); + bcf1_t *new_rec = (bcf1_t*)ptr; + memcpy(new_rec,rec,sizeof(*rec)); + ptr += sizeof(*rec); + + // The array of allele pointers does not need alignment as bcf1_t is already padded to the biggest + // data type in the structure + char **allele = (char**)ptr; + ptr += rec->n_allele*sizeof(*allele); + + // This is just to prevent valgrind from complaining about memcpy, unpack_size is a high-water mark + // and the end may be uninitialized + delta = rec->d.allele[rec->n_allele-1] - rec->d.allele[0]; + while ( delta < rec->unpack_size[1] ) if ( !rec->d.als[delta++] ) break; + memcpy(ptr,rec->d.als,delta); + new_rec->d.als = (char*)ptr; + ptr = ptr + delta; + + int i; + for (i=0; in_allele; i++) allele[i] = new_rec->d.als + (ptrdiff_t)(rec->d.allele[i] - rec->d.allele[0]); + new_rec->d.allele = allele; + + memcpy(ptr,rec->shared.s,rec->shared.l); + new_rec->shared.s = (char*)ptr; + new_rec->shared.m = rec->shared.l; + ptr += rec->shared.l; + + memcpy(ptr,rec->indiv.s,rec->indiv.l); + new_rec->indiv.s = (char*)ptr; + new_rec->indiv.m = rec->indiv.l; + ptr += rec->indiv.l; + + // This is just to prevent valgrind from complaining about memcpy, unpack_size is a high-water mark + // and the end may be uninitialized + i = 0; + while ( i < rec->unpack_size[0] ) if ( !rec->d.id[i++] ) break; + memcpy(ptr,rec->d.id,i); + new_rec->d.id = (char*)ptr; + ptr += i; + + args->nbuf++; + hts_expand(bcf1_t*, args->nbuf, args->mbuf, args->buf); + args->buf[args->nbuf-1] = new_rec; + + delta = ptr - ptr_beg; + args->mem += delta; + + assert( args->mem <= args->max_mem ); + + bcf_destroy(rec); +} + +void sort_blocks(args_t *args) +{ + htsFile *in = hts_open(args->fname, "r"); + if ( !in ) clean_files_and_throw(args, "Could not read %s\n", args->fname); + args->hdr = bcf_hdr_read(in); + if ( !args->hdr) clean_files_and_throw(args, "Could not read VCF/BCF headers from %s\n", args->fname); + + while ( 1 ) + { + bcf1_t *rec = bcf_init(); + int ret = bcf_read1(in, args->hdr, rec); + if ( ret < -1 ) clean_files_and_throw(args,"Error encountered while parsing the input\n"); + if ( ret == -1 ) + { + bcf_destroy(rec); + break; + } + if ( rec->errcode ) clean_files_and_throw(args,"Error encountered while parsing the input at %s:%d\n",bcf_seqname(args->hdr,rec),rec->pos+1); + bcf_unpack(rec, BCF_UN_STR); + buf_push(args, rec); + } + buf_flush(args); + free(args->buf); + + if ( hts_close(in)!=0 ) clean_files_and_throw(args,"Close failed: %s\n", args->fname); +} + +static inline int blk_is_smaller(blk_t **aptr, blk_t **bptr) +{ + blk_t *a = *aptr; + blk_t *b = *bptr; + int ret = cmp_bcf_pos(&a->rec, &b->rec); + if ( ret < 0 ) return 1; + return 0; +} +KHEAP_INIT(blk, blk_t*, blk_is_smaller) + +void blk_read(args_t *args, khp_blk_t *bhp, bcf_hdr_t *hdr, blk_t *blk) +{ + if ( !blk->fh ) return; + int ret = bcf_read(blk->fh, hdr, blk->rec); + if ( ret < -1 ) clean_files_and_throw(args, "Error reading %s\n", blk->fname); + if ( ret == -1 ) + { + if ( hts_close(blk->fh)!=0 ) clean_files_and_throw(args, "Close failed: %s\n", blk->fname); + blk->fh = 0; + return; + } + bcf_unpack(blk->rec, BCF_UN_STR); + khp_insert(blk, bhp, &blk); +} + +void merge_blocks(args_t *args) +{ + fprintf(bcftools_stderr,"Merging %d temporary files\n", (int)args->nblk); + khp_blk_t *bhp = khp_init(blk); + + int i; + for (i=0; inblk; i++) + { + blk_t *blk = args->blk + i; + blk->fh = hts_open(blk->fname, "r"); + if ( !blk->fh ) clean_files_and_throw(args, "Could not read %s: %s\n", blk->fname, strerror(errno)); + bcf_hdr_t *hdr = bcf_hdr_read(blk->fh); + bcf_hdr_destroy(hdr); + blk->rec = bcf_init(); + blk_read(args, bhp, args->hdr, blk); + } + + char wmode[8]; + set_wmode(wmode,args->output_type,args->output_fname,args->clevel); + htsFile *out = hts_open(args->output_fname ? args->output_fname : "-", wmode); + if ( bcf_hdr_write(out, args->hdr)!=0 ) clean_files_and_throw(args, "[%s] Error: cannot write to %s\n", __func__,args->output_fname); + while ( bhp->ndat ) + { + blk_t *blk = bhp->dat[0]; + if ( bcf_write(out, args->hdr, blk->rec)!=0 ) clean_files_and_throw(args, "[%s] Error: cannot write to %s\n", __func__,args->output_fname); + khp_delete(blk, bhp); + blk_read(args, bhp, args->hdr, blk); + } + if ( hts_close(out)!=0 ) clean_files_and_throw(args, "Close failed: %s\n", args->output_fname); + + clean_files(args); + + free(args->blk); + khp_destroy(blk, bhp); + fprintf(bcftools_stderr,"Done\n"); +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Sort VCF/BCF file.\n"); + fprintf(bcftools_stderr, "Usage: bcftools sort [OPTIONS] \n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " -m, --max-mem FLOAT[kMG] maximum memory to use [768M]\n"); // using metric units, 1M=1e6 + fprintf(bcftools_stderr, " -o, --output FILE output file name [bcftools_stdout]\n"); + fprintf(bcftools_stderr, " -O, --output-type b|u|z|v b: compressed BCF, u: uncompressed BCF, z: compressed VCF, v: uncompressed VCF [v]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + +#ifdef _WIN32 + fprintf(bcftools_stderr, " -T, --temp-dir DIR temporary files [/bcftools.XXXXXX]\n"); +#else + fprintf(bcftools_stderr, " -T, --temp-dir DIR temporary files [/tmp/bcftools.XXXXXX]\n"); +#endif + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +size_t parse_mem_string(const char *str) +{ + char *tmp; + double mem = strtod(str, &tmp); + if ( tmp==str ) error("Could not parse the memory string: \"%s\"\n", str); + if ( !strcasecmp("k",tmp) ) mem *= 1000; + else if ( !strcasecmp("m",tmp) ) mem *= 1000*1000; + else if ( !strcasecmp("g",tmp) ) mem *= 1000*1000*1000; + return mem; +} + +void mkdir_p(const char *fmt, ...); +static void init(args_t *args) +{ + args->max_mem *= 0.9; + args->mem_block = malloc(args->max_mem); + args->mem = 0; + + args->tmp_dir = init_tmp_prefix(args->tmp_dir); + +#ifdef _WIN32 + int ret = mkdir(mktemp(args->tmp_dir), 0700); + if ( ret ) error("mkdir(%s) failed: %s\n", args->tmp_dir,strerror(errno)); +#else + char *tmp = mkdtemp(args->tmp_dir); + if ( !tmp ) error("mkdtemp(%s) failed: %s\n", args->tmp_dir,strerror(errno)); + int ret = chmod(tmp, S_IRUSR|S_IWUSR|S_IXUSR); + if ( ret ) error("chmod(%s,S_IRUSR|S_IWUSR|S_IXUSR) failed: %s\n", args->tmp_dir,strerror(errno)); +#endif + + fprintf(bcftools_stderr,"Writing to %s\n", args->tmp_dir); +} +static void destroy(args_t *args) +{ + bcf_hdr_destroy(args->hdr); + free(args->mem_block); + free(args->tmp_dir); + free(args); +} + +int main_sort(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->max_mem = 768*1000*1000; + args->output_fname = "-"; + args->clevel = -1; + + static struct option loptions[] = + { + {"max-mem",required_argument,NULL,'m'}, + {"temp-dir",required_argument,NULL,'T'}, + {"output-type",required_argument,NULL,'O'}, + {"output-file",required_argument,NULL,'o'}, + {"output",required_argument,NULL,'o'}, + {"help",no_argument,NULL,'h'}, + {0,0,0,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "m:T:O:o:h?",loptions,NULL)) >= 0) + { + switch (c) + { + case 'm': args->max_mem = parse_mem_string(optarg); break; + case 'T': args->tmp_dir = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'h': + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) args->fname = "-"; // reading from stdin + else usage(args); + } + else args->fname = argv[optind]; + + init(args); + sort_blocks(args); + merge_blocks(args); + destroy(args); + + return 0; +} diff --git a/bcftools/vcfstats.c b/bcftools/vcfstats.c new file mode 100644 index 0000000..6a7272f --- /dev/null +++ b/bcftools/vcfstats.c @@ -0,0 +1,1915 @@ +/* vcfstats.c -- Produces stats which can be plotted using plot-vcfstats. + + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +/* + Notes and known issues: + - SN ts/tv calculation includes all non-ref alleles listed in ALT while per-sample ts/tv + takes the first non-ref allele only, something to consider with many non-ref HETs. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "bin.h" +#include "dist.h" + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +#define HWE_STATS 1 +#define QUAL_STATS 1 +#define IRC_STATS 1 +#define IRC_RLEN 10 +#define NA_STRING "0" + +typedef struct +{ + char *tag; + float min, max; + uint64_t *vals_ts, *vals_tv; + void *val; + int nbins, type, m_val, idx; +} +user_stats_t; + +typedef struct +{ + int min, max, step, m_vals; + uint64_t *vals; +} +idist_t; + +typedef struct +{ + uint64_t n_snps, n_indels, n_mnps, n_others, n_mals, n_snp_mals, n_records, n_noalts; + int *af_ts, *af_tv, *af_snps; // first bin of af_* stats are singletons + #if HWE_STATS + int *af_hwe; + #endif + #if IRC_STATS + int n_repeat[IRC_RLEN][4], n_repeat_na; // number of indels which are repeat-consistent, repeat-inconsistent (dels and ins), and not applicable + int *af_repeats[3]; + #endif + int ts_alt1, tv_alt1; + #if QUAL_STATS + // Values are rounded to one significant digit and 1 is added (Q*10+1); missing and negative values go in the first bin + // Only SNPs that are the 1st alternate allele are counted + dist_t *qual_ts, *qual_tv, *qual_indels; + #endif + int *insertions, *deletions, m_indel; // maximum indel length + int in_frame, out_frame, na_frame, in_frame_alt1, out_frame_alt1, na_frame_alt1; + int subst[15]; + int *smpl_hets, *smpl_homRR, *smpl_homAA, *smpl_ts, *smpl_tv, *smpl_indels, *smpl_ndp, *smpl_sngl; + int *smpl_hapRef, *smpl_hapAlt, *smpl_missing; + int *smpl_ins_hets, *smpl_del_hets, *smpl_ins_homs, *smpl_del_homs; + int *smpl_frm_shifts; // not-applicable, in-frame, out-frame + unsigned long int *smpl_dp; + idist_t dp, dp_sites; + int nusr; + user_stats_t *usr; + double *dvaf; // distribution of the mean indel-allele frequency by length: -m_indel,-(m_indel-1),...-1,0,1,..,m_indel + uint32_t *nvaf; +} +stats_t; + +typedef struct +{ + uint64_t gt2gt[5][5]; // number of RR->RR, RR->RA, etc. matches/mismatches; see type2stats + /* + Pearson's R^2 is used for aggregate R^2 + y, yy .. sum of dosage and squared dosage in the query VCF (second file) + x, xx .. sum of squared dosage in the truth VCF (first file) + n .. number of genotypes + */ + double y, yy, x, xx, yx, n; +} +gtcmp_t; + +typedef struct +{ + char *seq; + int pos, cnt, len; +} +_idc1_t; +typedef struct +{ + faidx_t *ref; + _idc1_t *dat; + int ndat, mdat; +} +indel_ctx_t; + +typedef struct +{ + // stats + stats_t stats[3]; + int *tmp_iaf, ntmp_iaf, m_af, m_qual, naf_hwe, mtmp_frm; + uint8_t *tmp_frm; + int dp_min, dp_max, dp_step; + gtcmp_t *smpl_gts_snps, *smpl_gts_indels; + gtcmp_t *af_gts_snps, *af_gts_indels; // first bin of af_* stats are singletons + bin_t *af_bins; + float *farr; + int mfarr; + + // indel context + indel_ctx_t *indel_ctx; + char *ref_fname; + + // user stats + int nusr; + user_stats_t *usr; + + // other + bcf_srs_t *files; + bcf_sr_regions_t *exons; + char **argv, *exons_fname, *regions_list, *samples_list, *targets_list, *af_bins_list, *af_tag; + int argc, verbose_sites, first_allele_only, samples_is_file; + int split_by_id, nstats; + + filter_t *filter[2]; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + int n_threads; +} +args_t; + +static int type2dosage[6], type2ploidy[6], type2stats[7]; + +static void idist_init(idist_t *d, int min, int max, int step) +{ + d->min = min; d->max = max; d->step = step; + d->m_vals = 4 + (d->max - d->min)/d->step; + d->vals = (uint64_t*) calloc(d->m_vals,sizeof(uint64_t)); +} +static void idist_destroy(idist_t *d) +{ + if ( d->vals ) free(d->vals); +} +static inline uint64_t *idist(idist_t *d, int val) +{ + if ( val < d->min ) return &d->vals[0]; + if ( val > d->max ) return &d->vals[d->m_vals-1]; + return &d->vals[1 + (val - d->min) / d->step]; +} +static inline int idist_i2bin(idist_t *d, int i) +{ + if ( i<=0 ) return d->min; + if ( i>= d->m_vals ) return d->max; + return i-1+d->min; +} + +#define IC_DBG 0 +#if IC_DBG +static void _indel_ctx_print1(_idc1_t *idc) +{ + int i; + fprintf(stdout, "%d\t", idc->cnt); + for (i=0; ilen; i++) + fputc(idc->seq[i], stdout); + fputc('\n', stdout); +} +static void _indel_ctx_print(indel_ctx_t *ctx) +{ + int i; + for (i=0; indat; i++) + _indel_ctx_print1(&ctx->dat[i]); + fputc('\n',stdout); +} +#endif +static int _indel_ctx_lookup(indel_ctx_t *ctx, char *seq, int seq_len, int *hit) +{ + // binary search + int min = 0, max = ctx->ndat - 1; + while ( min<=max ) + { + int i = (min+max)/2; + int cmp = strncmp(seq, ctx->dat[i].seq, seq_len); + if ( cmp<0 ) max = i - 1; + else if ( cmp>0 ) min = i + 1; + else + { + if ( seq_len==ctx->dat[i].len ) + { + *hit = 1; + return i; + } + else if ( seq_lendat[i].len ) max = i - 1; + else min = i + 1; + } + } + *hit = 0; + return max; +} +static void _indel_ctx_insert(indel_ctx_t *ctx, char *seq, int seq_len, int pos) +{ + int idat, hit, i; + idat = _indel_ctx_lookup(ctx, seq, seq_len, &hit); + if ( !hit ) + { + if ( pos>0 ) return; + idat++; + ctx->ndat++; + hts_expand(_idc1_t, ctx->ndat+1, ctx->mdat, ctx->dat); + if ( idatndat && ctx->ndat>1 ) + memmove(&ctx->dat[idat+1], &ctx->dat[idat], (ctx->ndat - idat - 1)*sizeof(_idc1_t)); + ctx->dat[idat].len = seq_len; + ctx->dat[idat].cnt = 1; + ctx->dat[idat].pos = pos; + ctx->dat[idat].seq = (char*) malloc(sizeof(char)*(seq_len+1)); + for (i=0; idat[idat].seq[i] = seq[i]; + ctx->dat[idat].seq[i] = 0; + return; + } + if ( ctx->dat[idat].pos + seq_len == pos ) + { + ctx->dat[idat].cnt++; + ctx->dat[idat].pos = pos; + } +} +indel_ctx_t *indel_ctx_init(char *fa_ref_fname) +{ + indel_ctx_t *ctx = (indel_ctx_t *) calloc(1,sizeof(indel_ctx_t)); + ctx->ref = fai_load(fa_ref_fname); + if ( !ctx->ref ) + { + free(ctx); + return NULL; + } + return ctx; +} +void indel_ctx_destroy(indel_ctx_t *ctx) +{ + fai_destroy(ctx->ref); + if ( ctx->mdat ) free(ctx->dat); + free(ctx); +} +/** + * indel_ctx_type() - determine indel context type + * @ctx: + * @chr: chromosome name + * @pos: position of the first @ref base, 1-based + * @ref: reference allele + * @alt: alternate allele. Only first of multiple comma-separated alleles is + * considered + * @nrep: number of repeated elements (w) + * @nlen: length of a single repeat element (w) + * + * Returns the INDEL length, negative for deletions, positive for insertions + */ +int indel_ctx_type(indel_ctx_t *ctx, char *chr, int pos, char *ref, char *alt, int *nrep, int *nlen) +{ + const int win_size = 50; // hard-wired for now + const int rep_len = IRC_RLEN; // hard-wired for now + + int ref_len = strlen(ref); + int alt_len = 0; + while ( alt[alt_len] && alt[alt_len]!=',' ) alt_len++; + + int i, fai_ref_len; + char *fai_ref = faidx_fetch_seq(ctx->ref, chr, pos-1, pos+win_size, &fai_ref_len); + for (i=0; i96 ) fai_ref[i] -= 32; + + // Sanity check: the reference sequence must match the REF allele + for (i=0; indat = 0; + for (i=0; indat; i++) + { + if ( max_cnt < ctx->dat[i].cnt || (max_cnt==ctx->dat[i].cnt && max_len < ctx->dat[i].len) ) + { + max_cnt = ctx->dat[i].cnt; + max_len = ctx->dat[i].len; + } + free(ctx->dat[i].seq); + } + free(fai_ref); + + *nrep = max_cnt; + *nlen = max_len; + return alt_len - ref_len; +} + +static void add_user_stats(args_t *args, char *str) +{ + args->nusr++; + args->usr = (user_stats_t*) realloc(args->usr,sizeof(user_stats_t)*args->nusr); + user_stats_t *usr = &args->usr[args->nusr-1]; + memset(usr,0,sizeof(*usr)); + usr->min = 0; + usr->max = 1; + usr->nbins = 100; + usr->idx = 0; + + char *tmp = str; + while ( *tmp && *tmp!=':' ) tmp++; + + // Tag with an index or just tag? (e.g. PV4[1] vs DP) + if ( tmp > str && tmp[-1]==']' ) + { + char *ptr = tmp; + while ( ptr>str && *ptr!='[' ) ptr--; + if ( *ptr=='[' ) + { + char *ptr2; + usr->idx = strtol(ptr+1, &ptr2, 10); + if ( ptr+1==ptr2 || ptr2 != tmp-1 ) error("Could not parse the index in \"%s\" (ptr=%s;ptr2=%s(%p),tmp=%s(%p),idx=%d)\n", str,ptr,ptr2,ptr2,tmp,tmp,usr->idx); + if ( usr->idx<0 ) error("Error: negative index is not allowed: \"%s\"\n", str); + *ptr = 0; + } + } + + usr->tag = (char*)calloc(tmp-str+2,sizeof(char)); + memcpy(usr->tag,str,tmp-str); + + if ( *tmp ) + { + char *ptr = ++tmp; + usr->min = strtod(tmp, &ptr); + if ( tmp==ptr ) error("Could not parse %s\n", str); + tmp = ptr+1; + } + if ( *tmp ) + { + char *ptr = tmp; + usr->max = strtod(tmp, &ptr); + if ( tmp==ptr ) error("Could not parse %s\n", str); + tmp = ptr+1; + } + if ( *tmp ) + { + char *ptr = tmp; + usr->nbins = strtol(tmp, &ptr, 10); + if ( tmp==ptr ) error("Could not parse %s\n", str); + if ( usr->nbins<=0 ) error("Number of bins does not make sense (%d): %s.\n", usr->nbins, str); + } +} +static void init_user_stats(args_t *args, bcf_hdr_t *hdr, stats_t *stats) +{ + stats->nusr = args->nusr; + stats->usr = (user_stats_t*)malloc(sizeof(user_stats_t)*args->nusr); + memcpy(stats->usr,args->usr,args->nusr*sizeof(user_stats_t)); + int i; + for (i=0; inusr; i++) + { + user_stats_t *usr = &stats->usr[i]; + usr->vals_ts = (uint64_t*)calloc(usr->nbins,sizeof(uint64_t)); + usr->vals_tv = (uint64_t*)calloc(usr->nbins,sizeof(uint64_t)); + int id = bcf_hdr_id2int(hdr,BCF_DT_ID,usr->tag); + if ( !bcf_hdr_idinfo_exists(hdr,BCF_HL_INFO,id) ) error("The INFO tag \"%s\" is not defined in the header\n", usr->tag); + usr->type = bcf_hdr_id2type(hdr,BCF_HL_INFO,id); + if ( usr->type!=BCF_HT_REAL && usr->type!=BCF_HT_INT ) error("The INFO tag \"%s\" is not of Float or Integer type (%d)\n", usr->tag, usr->type); + } +} +static void init_stats(args_t *args) +{ + int i; + args->nstats = args->files->nreaders==1 ? 1 : 3; + if ( args->split_by_id ) args->nstats = 2; + + if ( args->filter_str ) + { + args->filter[0] = filter_init(bcf_sr_get_header(args->files,0), args->filter_str); + if ( args->files->nreaders==2 ) + args->filter[1] = filter_init(bcf_sr_get_header(args->files,1), args->filter_str); + args->files->max_unpack |= filter_max_unpack(args->filter[0]); + } + + // AF corresponds to AC but is more robust to mixtures of haploid and diploid GTs + if ( !args->af_bins_list ) + { + args->m_af = 101; + for (i=0; ifiles->nreaders; i++) + if ( bcf_hdr_nsamples(args->files->readers[i].header) + 1> args->m_af ) + args->m_af = bcf_hdr_nsamples(args->files->readers[i].header) + 1; + } + else + { + args->af_bins = bin_init(args->af_bins_list,0,1); + + // m_af is used also for other af arrays, where the first bin is for + // singletons. However, since the last element is unused in af_bins + // (n boundaries form n-1 intervals), the m_af count is good for both. + args->m_af = bin_get_size(args->af_bins); + } + + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,0); + if ( args->af_tag && !bcf_hdr_idinfo_exists(hdr,BCF_HL_INFO,bcf_hdr_id2int(hdr,BCF_DT_ID,args->af_tag)) ) + error("No such INFO tag: %s\n", args->af_tag); + + #if QUAL_STATS + args->m_qual = 999; + #endif + #if HWE_STATS + args->naf_hwe = 100; + #endif + + if ( args->samples_list ) + { + if ( !bcf_sr_set_samples(args->files,args->samples_list,args->samples_is_file) ) + { + if ( !bcf_hdr_nsamples(args->files->readers[0].header) ) + error("No sample columns in %s\n", args->files->readers[0].fname); + error("Unable to parse the samples: \"%s\"\n", args->samples_list); + } + args->af_gts_snps = (gtcmp_t *) calloc(args->m_af,sizeof(gtcmp_t)); + args->af_gts_indels = (gtcmp_t *) calloc(args->m_af,sizeof(gtcmp_t)); + args->smpl_gts_snps = (gtcmp_t *) calloc(args->files->n_smpl,sizeof(gtcmp_t)); + args->smpl_gts_indels = (gtcmp_t *) calloc(args->files->n_smpl,sizeof(gtcmp_t)); + } + for (i=0; instats; i++) + { + stats_t *stats = &args->stats[i]; + stats->m_indel = 60; + stats->insertions = (int*) calloc(stats->m_indel,sizeof(int)); + stats->deletions = (int*) calloc(stats->m_indel,sizeof(int)); + stats->af_ts = (int*) calloc(args->m_af,sizeof(int)); + stats->af_tv = (int*) calloc(args->m_af,sizeof(int)); + stats->af_snps = (int*) calloc(args->m_af,sizeof(int)); + int j; + for (j=0; j<3; j++) stats->af_repeats[j] = (int*) calloc(args->m_af,sizeof(int)); + #if QUAL_STATS + stats->qual_ts = dist_init(5); + stats->qual_tv = dist_init(5); + stats->qual_indels = dist_init(5); + #endif + if ( args->files->n_smpl ) + { + stats->smpl_missing = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_hets = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_homAA = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_homRR = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_hapRef = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_hapAlt = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_ins_hets = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_del_hets = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_ins_homs = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_del_homs = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_ts = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_tv = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_indels = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_dp = (unsigned long int *) calloc(args->files->n_smpl,sizeof(unsigned long int)); + stats->smpl_ndp = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_sngl = (int *) calloc(args->files->n_smpl,sizeof(int)); + #if HWE_STATS + stats->af_hwe = (int*) calloc(args->m_af*args->naf_hwe,sizeof(int)); + #endif + if ( args->exons_fname ) + stats->smpl_frm_shifts = (int*) calloc(args->files->n_smpl*3,sizeof(int)); + stats->nvaf = (uint32_t*) calloc(stats->m_indel*2+1,sizeof(*stats->nvaf)); + stats->dvaf = (double*) calloc(stats->m_indel*2+1,sizeof(*stats->dvaf)); + } + idist_init(&stats->dp, args->dp_min,args->dp_max,args->dp_step); + idist_init(&stats->dp_sites, args->dp_min,args->dp_max,args->dp_step); + init_user_stats(args, i!=1 ? args->files->readers[0].header : args->files->readers[1].header, stats); + } + + if ( args->exons_fname ) + { + args->exons = bcf_sr_regions_init(args->exons_fname,1,0,1,2); + if ( !args->exons ) + error("Error occurred while reading, was the file compressed with bgzip: %s?\n", args->exons_fname); + } + + #if IRC_STATS + if ( args->ref_fname ) + args->indel_ctx = indel_ctx_init(args->ref_fname); + #endif + + type2dosage[GT_HOM_RR] = 0; + type2dosage[GT_HET_RA] = 1; + type2dosage[GT_HOM_AA] = 2; + type2dosage[GT_HET_AA] = 2; + type2dosage[GT_HAPL_R] = 0; + type2dosage[GT_HAPL_A] = 1; + + type2ploidy[GT_HOM_RR] = 1; + type2ploidy[GT_HET_RA] = 1; + type2ploidy[GT_HOM_AA] = 1; + type2ploidy[GT_HET_AA] = 1; + type2ploidy[GT_HAPL_R] = -1; + type2ploidy[GT_HAPL_A] = -1; + + type2stats[GT_HOM_RR] = 0; + type2stats[GT_HET_RA] = 1; + type2stats[GT_HOM_AA] = 2; + type2stats[GT_HET_AA] = 3; + type2stats[GT_HAPL_R] = 0; + type2stats[GT_HAPL_A] = 2; + type2stats[GT_UNKN] = 4; + +} +static void destroy_stats(args_t *args) +{ + int id, j; + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + if (stats->af_ts) free(stats->af_ts); + if (stats->af_tv) free(stats->af_tv); + if (stats->af_snps) free(stats->af_snps); + for (j=0; j<3; j++) + if (stats->af_repeats[j]) free(stats->af_repeats[j]); + #if QUAL_STATS + if (stats->qual_ts) dist_destroy(stats->qual_ts); + if (stats->qual_tv) dist_destroy(stats->qual_tv); + if (stats->qual_indels) dist_destroy(stats->qual_indels); + #endif + #if HWE_STATS + free(stats->af_hwe); + #endif + free(stats->insertions); + free(stats->deletions); + free(stats->smpl_missing); + free(stats->smpl_hets); + free(stats->smpl_homAA); + free(stats->smpl_homRR); + free(stats->smpl_hapRef); + free(stats->smpl_hapAlt); + free(stats->smpl_ins_homs); + free(stats->smpl_del_homs); + free(stats->smpl_ins_hets); + free(stats->smpl_del_hets); + free(stats->smpl_ts); + free(stats->smpl_tv); + free(stats->smpl_indels); + free(stats->smpl_dp); + free(stats->smpl_ndp); + free(stats->smpl_sngl); + idist_destroy(&stats->dp); + idist_destroy(&stats->dp_sites); + for (j=0; jnusr; j++) + { + free(stats->usr[j].vals_ts); + free(stats->usr[j].vals_tv); + free(stats->usr[j].val); + } + free(stats->usr); + if ( args->exons ) free(stats->smpl_frm_shifts); + free(stats->nvaf); + free(stats->dvaf); + } + for (j=0; jnusr; j++) free(args->usr[j].tag); + if ( args->af_bins ) bin_destroy(args->af_bins); + free(args->farr); + free(args->usr); + free(args->tmp_frm); + free(args->tmp_iaf); + if (args->exons) bcf_sr_regions_destroy(args->exons); + free(args->af_gts_snps); + free(args->af_gts_indels); + free(args->smpl_gts_snps); + free(args->smpl_gts_indels); + if (args->indel_ctx) indel_ctx_destroy(args->indel_ctx); + if (args->filter[0]) filter_destroy(args->filter[0]); + if (args->filter[1]) filter_destroy(args->filter[1]); +} + +static void init_iaf(args_t *args, bcf_sr_t *reader) +{ + bcf1_t *line = reader->buffer[0]; + hts_expand(int32_t,line->n_allele,args->ntmp_iaf,args->tmp_iaf); + + int i, ret; + if ( args->af_tag ) + { + ret = bcf_get_info_float(reader->header, line, args->af_tag, &args->farr, &args->mfarr); + if ( ret<=0 || ret!=line->n_allele-1 ) + { + // the AF tag is not present or wrong number of values, put in the singletons/unknown bin + for (i=0; in_allele; i++) args->tmp_iaf[i] = 0; + return; + } + args->tmp_iaf[0] = 0; + for (i=1; in_allele; i++) + { + float af = args->farr[i-1]; + if ( af<0 ) af = 0; + else if ( af>1 ) af = 1; + int iaf = args->af_bins ? bin_get_idx(args->af_bins,af) : af*(args->m_af-2); + args->tmp_iaf[i] = iaf + 1; // the first tmp_iaf bin is reserved for singletons + } + return; + } + + // tmp_iaf is first filled with AC counts in calc_ac and then transformed to + // an index to af_gts_snps + ret = bcf_calc_ac(reader->header, line, args->tmp_iaf, args->samples_list ? BCF_UN_INFO|BCF_UN_FMT : BCF_UN_INFO); + if ( !ret ) + { + for (i=0; in_allele; i++) args->tmp_iaf[i] = 0; // singletons/unknown bin + return; + } + + int an = 0; + for (i=0; in_allele; i++) + an += args->tmp_iaf[i]; + + args->tmp_iaf[0] = 0; + for (i=1; in_allele; i++) + { + if ( args->tmp_iaf[i]==1 ) + args->tmp_iaf[i] = 0; // singletons into the first bin + else if ( !an ) + args->tmp_iaf[i] = 1; // no genotype at all, put to the AF=0 bin + else + { + float af = (float) args->tmp_iaf[i] / an; + if ( af<0 ) af = 0; + else if ( af>1 ) af = 1; + int iaf = args->af_bins ? bin_get_idx(args->af_bins,af) : af*(args->m_af-2); + args->tmp_iaf[i] = iaf + 1; + } + } +} + +static inline void do_mnp_stats(args_t *args, stats_t *stats, bcf_sr_t *reader) +{ + stats->n_mnps++; +} + +static inline void do_other_stats(args_t *args, stats_t *stats, bcf_sr_t *reader) +{ + stats->n_others++; +} + +static void do_indel_stats(args_t *args, stats_t *stats, bcf_sr_t *reader) +{ + stats->n_indels++; + + bcf1_t *line = reader->buffer[0]; + + #if QUAL_STATS + int iqual = (isnan(line->qual) || line->qual<0) ? 0 : 1 + (int)(line->qual*10); + dist_insert(stats->qual_indels, iqual); + #endif + + // Check if the indel is near an exon for the frameshift statistics + int i, exon_overlap = 0; + if ( args->exons ) + { + if ( !bcf_sr_regions_overlap(args->exons, bcf_seqname(reader->header,line),line->pos,line->pos) ) exon_overlap = 1; + hts_expand(uint8_t,line->n_allele,args->mtmp_frm,args->tmp_frm); + for (i=0; in_allele; i++) args->tmp_frm[i] = 0; + } + + for (i=1; in_allele; i++) + { + if ( args->first_allele_only && i>1 ) break; + int is_indel = bcf_has_variant_type(line,i,VCF_INDEL); + if (is_indel < 0) error("bcf_has_variant_type() failed."); + if ( !is_indel ) continue; + int len = bcf_variant_length(line, i); + + #if IRC_STATS + // Indel repeat consistency + if ( args->indel_ctx ) + { + int nrep, nlen, ndel; + ndel = indel_ctx_type(args->indel_ctx, (char*)reader->header->id[BCF_DT_CTG][line->rid].key, line->pos+1, line->d.allele[0], line->d.allele[i], &nrep, &nlen); + if ( nlen<=1 || nrep<=1 ) + { + // not a repeat or a single base repeat + stats->n_repeat_na++; + stats->af_repeats[2][ args->tmp_iaf[i] ]++; + } + else + { + if ( abs(ndel) % nlen ) + { + // the length of the inserted/deleted sequence is not consistent with the repeat element + stats->n_repeat[nlen-1][ndel<0 ? 1 : 3]++; + stats->af_repeats[1][ args->tmp_iaf[i] ]++; + } + else + { + // the length consistent with the repeat + stats->n_repeat[nlen-1][ndel<0 ? 0 : 2]++; + stats->af_repeats[0][ args->tmp_iaf[i] ]++; + } + } + } + else + stats->af_repeats[2][ args->tmp_iaf[i] ]++; + #endif + + // Check the frameshifts + int tlen = 0; + if ( args->exons && exon_overlap ) // there is an exon + { + if ( len>0 ) + { + // insertion + if ( args->exons->start <= line->pos && args->exons->end > line->pos ) tlen = abs(len); + } + else if ( args->exons->start <= line->pos + abs(len) ) + { + // deletion + tlen = abs(len); + if ( line->pos < args->exons->start ) // trim the beginning + tlen -= args->exons->start - line->pos + 1; + if ( args->exons->end < line->pos + abs(len) ) // trim the end + tlen -= line->pos + abs(len) - args->exons->end; + } + } + if ( tlen ) // there are some deleted/inserted bases in the exon + { + if ( tlen%3 ) { stats->out_frame++; args->tmp_frm[i] = 2; } + else { stats->in_frame++; args->tmp_frm[i] = 1; } + + if ( i==1 ) + { + if ( tlen%3 ) stats->out_frame_alt1++; + else stats->in_frame_alt1++; + } + } + else // no exon affected + { + if ( i==1 ) stats->na_frame_alt1++; + stats->na_frame++; + } + + + // Indel length distribution + int *ptr = stats->insertions; + if ( len<0 ) + { + len *= -1; + ptr = stats->deletions; + } + if ( --len >= stats->m_indel ) len = stats->m_indel-1; + ptr[len]++; + } +} + +static void do_user_stats(stats_t *stats, bcf_sr_t *reader, int is_ts) +{ + int i, nval; + for (i=0; inusr; i++) + { + user_stats_t *usr = &stats->usr[i]; + uint64_t *vals = is_ts ? usr->vals_ts : usr->vals_tv; + float val; + if ( usr->type==BCF_HT_REAL ) + { + if ( (nval=bcf_get_info_float(reader->header,reader->buffer[0],usr->tag,&usr->val,&usr->m_val))<=0 ) continue; + if ( usr->idx >= nval ) continue; + val = ((float*)usr->val)[usr->idx]; + } + else + { + if ( (nval=bcf_get_info_int32(reader->header,reader->buffer[0],usr->tag,&usr->val,&usr->m_val))<=0 ) continue; + if ( usr->idx >= nval ) continue; + val = ((int32_t*)usr->val)[usr->idx]; + } + int idx; + if ( val<=usr->min ) idx = 0; + else if ( val>=usr->max ) idx = usr->nbins - 1; + else idx = (val - usr->min)/(usr->max - usr->min) * (usr->nbins-1); + vals[idx]++; + } +} + +static void do_snp_stats(args_t *args, stats_t *stats, bcf_sr_t *reader) +{ + stats->n_snps++; + + bcf1_t *line = reader->buffer[0]; + int ref = bcf_acgt2int(*line->d.allele[0]); + if ( ref<0 ) return; + + #if QUAL_STATS + int iqual = (isnan(line->qual) || line->qual<0) ? 0 : 1 + (int)(line->qual*10); + #endif + + int i; + for (i=1; in_allele; i++) + { + if ( args->first_allele_only && i>1 ) break; + if ( !(bcf_get_variant_type(line,i)&VCF_SNP) ) continue; + int alt = bcf_acgt2int(*line->d.allele[i]); + if ( alt<0 || ref==alt ) continue; + stats->subst[ref<<2|alt]++; + int iaf = args->tmp_iaf[i]; + stats->af_snps[iaf]++; + if ( abs(ref-alt)==2 ) + { + if (i==1) + { + stats->ts_alt1++; + #if QUAL_STATS + dist_insert(stats->qual_ts,iqual); + #endif + do_user_stats(stats, reader, 1); + } + stats->af_ts[iaf]++; + } + else + { + if (i==1) + { + stats->tv_alt1++; + #if QUAL_STATS + dist_insert(stats->qual_tv,iqual); + #endif + do_user_stats(stats, reader, 0); + } + stats->af_tv[iaf]++; + } + } +} + +static inline void update_dvaf(stats_t *stats, bcf1_t *line, bcf_fmt_t *fmt, int ismpl, int ial, int jal) +{ + if ( !fmt ) return; + + float dvaf; + #define BRANCH_INT(type_t,missing,vector_end) { \ + type_t *p = (type_t *) (fmt->p + fmt->size*ismpl); \ + if ( p[ial]==vector_end || p[jal]==vector_end ) return; \ + if ( p[ial]==missing || p[jal]==missing ) return; \ + if ( !p[ial] && !p[jal] ) return; \ + dvaf = (float)p[ial]/(p[ial]+p[jal]); \ + } + switch (fmt->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_missing, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_missing, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_missing, bcf_int32_vector_end); break; + default: fprintf(stderr, "[E::%s] todo: %d\n", __func__, fmt->type); exit(1); break; + } + #undef BRANCH_INT + + int len = line->d.var[ial].n; + if ( len < -stats->m_indel ) len = -stats->m_indel; + else if ( len > stats->m_indel ) len = stats->m_indel; + int bin = stats->m_indel + len; + stats->nvaf[bin]++; + stats->dvaf[bin] += dvaf; +} + +static void do_sample_stats(args_t *args, stats_t *stats, bcf_sr_t *reader, int matched) +{ + bcf_srs_t *files = args->files; + bcf1_t *line = reader->buffer[0]; + bcf_fmt_t *fmt_ptr; + int nref_tot = 0, nhet_tot = 0, nalt_tot = 0; + int line_type = bcf_get_variant_types(line); + + if ( (fmt_ptr = bcf_get_fmt(reader->header,reader->buffer[0],"GT")) ) + { + bcf_fmt_t *ad_fmt_ptr = bcf_get_variant_types(line)&VCF_INDEL ? bcf_get_fmt(reader->header,reader->buffer[0],"AD") : NULL; + + int ref = bcf_acgt2int(*line->d.allele[0]); + int is, n_nref = 0, i_nref = 0; + for (is=0; isfiles->n_smpl; is++) + { + int ial, jal; + int gt = bcf_gt_type(fmt_ptr, reader->samples[is], &ial, &jal); + if ( gt==GT_UNKN ) + { + stats->smpl_missing[is]++; + continue; + } + if ( gt==GT_HAPL_R || gt==GT_HAPL_A ) + { + if ( line_type&VCF_INDEL && stats->smpl_frm_shifts ) + { + assert( ialn_allele ); + stats->smpl_frm_shifts[is*3 + args->tmp_frm[ial]]++; + } + if ( gt == GT_HAPL_R ) stats->smpl_hapRef[is]++; + if ( gt == GT_HAPL_A ) stats->smpl_hapAlt[is]++; + continue; + } + if ( gt != GT_HOM_RR ) { n_nref++; i_nref = is; } + #if HWE_STATS + switch (gt) + { + case GT_HOM_RR: nref_tot++; break; + case GT_HET_RA: nhet_tot++; break; + case GT_HET_AA: + case GT_HOM_AA: nalt_tot++; break; + } + #endif + int var_type = 0; + if ( ial>0 ) var_type |= bcf_get_variant_type(line,ial); + if ( jal>0 ) var_type |= bcf_get_variant_type(line,jal); + if ( var_type&VCF_SNP || var_type==VCF_REF ) // count ALT=. as SNP + { + if ( gt == GT_HET_RA ) stats->smpl_hets[is]++; + else if ( gt == GT_HET_AA ) stats->smpl_hets[is]++; + else if ( gt == GT_HOM_RR ) stats->smpl_homRR[is]++; + else if ( gt == GT_HOM_AA ) stats->smpl_homAA[is]++; + if ( gt != GT_HOM_RR && line->d.var[ial].type&VCF_SNP ) // this is safe, bcf_get_variant_types has been already called + { + int alt = bcf_acgt2int(*line->d.allele[ial]); + if ( alt<0 ) continue; + if ( abs(ref-alt)==2 ) + stats->smpl_ts[is]++; + else + stats->smpl_tv[is]++; + } + } + if ( var_type&VCF_INDEL ) + { + if ( gt != GT_HOM_RR ) + { + stats->smpl_indels[is]++; + + if ( gt==GT_HET_RA || gt==GT_HET_AA ) + { + int is_ins = 0, is_del = 0; + if ( bcf_get_variant_type(line,ial)&VCF_INDEL ) + { + if ( line->d.var[ial].n < 0 ) is_del = 1; + else is_ins = 1; + update_dvaf(stats,line,ad_fmt_ptr,is,ial,jal); + } + if ( bcf_get_variant_type(line,jal)&VCF_INDEL ) + { + if ( line->d.var[jal].n < 0 ) is_del = 1; + else is_ins = 1; + update_dvaf(stats,line,ad_fmt_ptr,is,jal,ial); + } + // Note that alt-het genotypes with both ins and del allele are counted twice!! + if ( is_del ) stats->smpl_del_hets[is]++; + if ( is_ins ) stats->smpl_ins_hets[is]++; + } + else if ( gt==GT_HOM_AA ) + { + if ( line->d.var[ial].n < 0 ) stats->smpl_del_homs[is]++; + else stats->smpl_ins_homs[is]++; + } + } + if ( stats->smpl_frm_shifts ) + { + assert( ialn_allele && jaln_allele ); + stats->smpl_frm_shifts[is*3 + args->tmp_frm[ial]]++; + stats->smpl_frm_shifts[is*3 + args->tmp_frm[jal]]++; + } + } + } + if ( n_nref==1 ) stats->smpl_sngl[i_nref]++; + } + + #if HWE_STATS + if ( nhet_tot + nref_tot + nalt_tot ) + { + float het_frac = (float)nhet_tot/(nhet_tot + nref_tot + nalt_tot); + int idx = het_frac*(args->naf_hwe - 1); +//check me: what is this? + if ( line->n_allele>1 ) idx += args->naf_hwe*args->tmp_iaf[1]; + stats->af_hwe[idx]++; + } + #endif + + if ( (fmt_ptr = bcf_get_fmt(reader->header,reader->buffer[0],"DP")) ) + { + #define BRANCH_INT(type_t,missing,vector_end) { \ + int is; \ + for (is=0; isfiles->n_smpl; is++) \ + { \ + type_t *p = (type_t *) (fmt_ptr->p + fmt_ptr->size*is); \ + if ( *p==vector_end ) continue; \ + if ( *p!=missing ) \ + { \ + (*idist(&stats->dp, *p))++; \ + stats->smpl_ndp[is]++; \ + stats->smpl_dp[is] += *p; \ + } \ + } \ + } + switch (fmt_ptr->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_missing, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_missing, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_missing, bcf_int32_vector_end); break; + default: fprintf(stderr, "[E::%s] todo: %d\n", __func__, fmt_ptr->type); exit(1); break; + } + #undef BRANCH_INT + } + else if ( (fmt_ptr = bcf_get_fmt(reader->header,reader->buffer[0],"AD")) ) + { + #define BRANCH_INT(type_t,missing,vector_end) { \ + int is,iv; \ + for (is=0; isfiles->n_smpl; is++) \ + { \ + type_t *p = (type_t *) (fmt_ptr->p + fmt_ptr->size*is); \ + int dp = 0, has_value = 0; \ + for (iv=0; ivn; iv++) \ + { \ + if ( p[iv]==vector_end ) break; \ + if ( p[iv]==missing ) continue; \ + has_value = 1; \ + dp += p[iv]; \ + } \ + if ( has_value ) \ + { \ + (*idist(&stats->dp, dp))++; \ + stats->smpl_ndp[is]++; \ + stats->smpl_dp[is] += dp; \ + } \ + } \ + } + switch (fmt_ptr->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_missing, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_missing, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_missing, bcf_int32_vector_end); break; + default: fprintf(stderr, "[E::%s] todo: %d\n", __func__, fmt_ptr->type); exit(1); break; + } + #undef BRANCH_INT + } + + if ( matched==3 ) + { + int is; + bcf_fmt_t *fmt0, *fmt1; + fmt0 = bcf_get_fmt(files->readers[0].header,files->readers[0].buffer[0],"GT"); if ( !fmt0 ) return; + fmt1 = bcf_get_fmt(files->readers[1].header,files->readers[1].buffer[0],"GT"); if ( !fmt1 ) return; + + // only the first ALT allele is considered + if (args->ntmp_iaf <= 1) return; // Do not consider invariate sites + int iaf = args->tmp_iaf[1]; + int line_type = bcf_get_variant_types(files->readers[0].buffer[0]); + gtcmp_t *af_stats = line_type&VCF_SNP ? args->af_gts_snps : args->af_gts_indels; + gtcmp_t *smpl_stats = line_type&VCF_SNP ? args->smpl_gts_snps : args->smpl_gts_indels; + + for (is=0; isn_smpl; is++) + { + // Simplified comparison: only 0/0, 0/1, 1/1 is looked at as the identity of + // actual alleles can be enforced by running without the -c option. + int gt0 = bcf_gt_type(fmt0, files->readers[0].samples[is], NULL, NULL); + int gt1 = bcf_gt_type(fmt1, files->readers[1].samples[is], NULL, NULL); + + int idx0 = type2stats[gt0]; + int idx1 = type2stats[gt1]; + af_stats[iaf].gt2gt[idx0][idx1]++; + smpl_stats[is].gt2gt[idx0][idx1]++; + + if ( gt0 == GT_UNKN || gt1 == GT_UNKN ) continue; + if ( type2ploidy[gt0]*type2ploidy[gt1] == -1 ) continue; // cannot compare diploid and haploid genotypes + + float y = type2dosage[gt0]; + float x = type2dosage[gt1]; + + smpl_stats[is].yx += y*x; + smpl_stats[is].x += x; + smpl_stats[is].xx += x*x; + smpl_stats[is].y += y; + smpl_stats[is].yy += y*y; + smpl_stats[is].n += 1; + + af_stats[iaf].yx += y*x; + af_stats[iaf].x += x; + af_stats[iaf].xx += x*x; + af_stats[iaf].y += y; + af_stats[iaf].yy += y*y; + af_stats[iaf].n += 1; + } + + if ( args->verbose_sites ) + { + int nm = 0, nmm = 0, nrefm = 0; + for (is=0; isn_smpl; is++) + { + int gt = bcf_gt_type(fmt0, files->readers[0].samples[is], NULL, NULL); + if ( gt == GT_UNKN ) continue; + int gt2 = bcf_gt_type(fmt1, files->readers[1].samples[is], NULL, NULL); + if ( gt2 == GT_UNKN ) continue; + if ( gt != gt2 ) + { + nmm++; + bcf_sr_t *reader = &files->readers[0]; + printf("DBG\t%s\t%"PRId64"\t%s\t%d\t%d\n",reader->header->id[BCF_DT_CTG][reader->buffer[0]->rid].key,(int64_t) reader->buffer[0]->pos+1,files->samples[is],gt,gt2); + } + else + { + if ( gt!=GT_HOM_RR ) nrefm++; + nm++; + } + } + float nrd = nrefm+nmm ? 100.*nmm/(nrefm+nmm) : 0; + printf("PSD\t%s\t%"PRId64"\t%d\t%d\t%f\n", reader->header->id[BCF_DT_CTG][reader->buffer[0]->rid].key,(int64_t) reader->buffer[0]->pos+1,nm,nmm,nrd); + } + } +} + +static void do_vcf_stats(args_t *args) +{ + bcf_srs_t *files = args->files; + assert( sizeof(int)>files->nreaders ); + while ( bcf_sr_next_line(files) ) + { + bcf_sr_t *reader = NULL; + bcf1_t *line = NULL; + int ret = 0, i, pass = 1; + for (i=0; inreaders; i++) + { + if ( !bcf_sr_has_line(files,i) ) continue; + if ( args->filter[i] ) + { + int is_ok = filter_test(args->filter[i], bcf_sr_get_line(files,i), NULL); + if ( args->filter_logic & FLT_EXCLUDE ) is_ok = is_ok ? 0 : 1; + if ( !is_ok ) { pass = 0; break; } + } + ret |= 1<readers[i]; + line = bcf_sr_get_line(files,i); + } + + } + if ( !pass ) continue; + + int line_type = bcf_get_variant_types(line); + init_iaf(args, reader); + + stats_t *stats = &args->stats[ret-1]; + if ( args->split_by_id && line->d.id[0]=='.' && !line->d.id[1] ) + stats = &args->stats[1]; + + stats->n_records++; + + if ( line_type==VCF_REF ) + stats->n_noalts++; + if ( line_type&VCF_SNP ) + do_snp_stats(args, stats, reader); + if ( line_type&VCF_INDEL ) + do_indel_stats(args, stats, reader); + if ( line_type&VCF_MNP ) + do_mnp_stats(args, stats, reader); + if ( line_type&VCF_OTHER ) + do_other_stats(args, stats, reader); + + if ( line->n_allele>2 ) + { + stats->n_mals++; + if ( line_type == VCF_SNP ) stats->n_snp_mals++; // note: this will be fooled by C>C,T + } + + if ( files->n_smpl ) + do_sample_stats(args, stats, reader, ret); + + if ( bcf_get_info_int32(reader->header,line,"DP",&args->tmp_iaf,&args->ntmp_iaf)==1 ) + (*idist(&stats->dp_sites, args->tmp_iaf[0]))++; + } +} + +static void print_header(args_t *args) +{ + int i; + printf("# This file was produced by bcftools stats (%s+htslib-%s) and can be plotted using plot-vcfstats.\n", bcftools_version(),hts_version()); + printf("# The command line was:\tbcftools %s ", args->argv[0]); + for (i=1; iargc; i++) + printf(" %s",args->argv[i]); + printf("\n#\n"); + + printf("# Definition of sets:\n# ID\t[2]id\t[3]tab-separated file names\n"); + if ( args->files->nreaders==1 ) + { + const char *fname = strcmp("-",args->files->readers[0].fname) ? args->files->readers[0].fname : ""; + if ( args->split_by_id ) + { + printf("ID\t0\t%s:known (sites with ID different from \".\")\n", fname); + printf("ID\t1\t%s:novel (sites where ID column is \".\")\n", fname); + } + else + printf("ID\t0\t%s\n", fname); + } + else + { + const char *fname0 = strcmp("-",args->files->readers[0].fname) ? args->files->readers[0].fname : ""; + const char *fname1 = strcmp("-",args->files->readers[1].fname) ? args->files->readers[1].fname : ""; + printf("ID\t0\t%s\n", fname0); + printf("ID\t1\t%s\n", fname1); + printf("ID\t2\t%s\t%s\n", fname0,fname1); + + if ( args->verbose_sites ) + { + printf( + "# Verbose per-site discordance output.\n" + "# PSD\t[2]CHROM\t[3]POS\t[4]Number of matches\t[5]Number of mismatches\t[6]NRD\n"); + printf( + "# Verbose per-site and per-sample output. Genotype codes: %d:HomRefRef, %d:HomAltAlt, %d:HetAltRef, %d:HetAltAlt, %d:haploidRef, %d:haploidAlt\n" + "# DBG\t[2]CHROM\t[3]POS\t[4]Sample\t[5]GT in %s\t[6]GT in %s\n", + GT_HOM_RR, GT_HOM_AA, GT_HET_RA, GT_HET_AA, GT_HAPL_R, GT_HAPL_A, fname0,fname1); + } + } +} + +#define T2S(x) type2stats[x] +static void print_stats(args_t *args) +{ + int i, j,k, id; + printf("# SN, Summary numbers:\n"); + printf("# number of records .. number of data rows in the VCF\n"); + printf("# number of no-ALTs .. reference-only sites, ALT is either \".\" or identical to REF\n"); + printf("# number of SNPs .. number of rows with a SNP\n"); + printf("# number of MNPs .. number of rows with a MNP, such as CC>TT\n"); + printf("# number of indels .. number of rows with an indel\n"); + printf("# number of others .. number of rows with other type, for example a symbolic allele or\n"); + printf("# a complex substitution, such as ACT>TCGA\n"); + printf("# number of multiallelic sites .. number of rows with multiple alternate alleles\n"); + printf("# number of multiallelic SNP sites .. number of rows with multiple alternate alleles, all SNPs\n"); + printf("# \n"); + printf("# Note that rows containing multiple types will be counted multiple times, in each\n"); + printf("# counter. For example, a row with a SNP and an indel increments both the SNP and\n"); + printf("# the indel counter.\n"); + printf("# \n"); + printf("# SN\t[2]id\t[3]key\t[4]value\n"); + for (id=0; idfiles->nreaders; id++) + printf("SN\t%d\tnumber of samples:\t%d\n", id, bcf_hdr_nsamples(args->files->readers[id].header)); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + printf("SN\t%d\tnumber of records:\t%"PRIu64"\n", id, stats->n_records); + printf("SN\t%d\tnumber of no-ALTs:\t%"PRIu64"\n", id, stats->n_noalts); + printf("SN\t%d\tnumber of SNPs:\t%"PRIu64"\n", id, stats->n_snps); + printf("SN\t%d\tnumber of MNPs:\t%"PRIu64"\n", id, stats->n_mnps); + printf("SN\t%d\tnumber of indels:\t%"PRIu64"\n", id, stats->n_indels); + printf("SN\t%d\tnumber of others:\t%"PRIu64"\n", id, stats->n_others); + printf("SN\t%d\tnumber of multiallelic sites:\t%"PRIu64"\n", id, stats->n_mals); + printf("SN\t%d\tnumber of multiallelic SNP sites:\t%"PRIu64"\n", id, stats->n_snp_mals); + } + printf("# TSTV, transitions/transversions:\n# TSTV\t[2]id\t[3]ts\t[4]tv\t[5]ts/tv\t[6]ts (1st ALT)\t[7]tv (1st ALT)\t[8]ts/tv (1st ALT)\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + int ts=0,tv=0; + for (i=0; im_af; i++) { ts += stats->af_ts[i]; tv += stats->af_tv[i]; } + printf("TSTV\t%d\t%d\t%d\t%.2f\t%d\t%d\t%.2f\n", id,ts,tv,tv?(float)ts/tv:0, stats->ts_alt1,stats->tv_alt1,stats->tv_alt1?(float)stats->ts_alt1/stats->tv_alt1:0); + } + if ( args->exons_fname ) + { + printf("# FS, Indel frameshifts:\n# FS\t[2]id\t[3]in-frame\t[4]out-frame\t[5]not applicable\t[6]out/(in+out) ratio\t[7]in-frame (1st ALT)\t[8]out-frame (1st ALT)\t[9]not applicable (1st ALT)\t[10]out/(in+out) ratio (1st ALT)\n"); + for (id=0; idnstats; id++) + { + int in=args->stats[id].in_frame, out=args->stats[id].out_frame, na=args->stats[id].na_frame; + int in1=args->stats[id].in_frame_alt1, out1=args->stats[id].out_frame_alt1, na1=args->stats[id].na_frame_alt1; + printf("FS\t%d\t%d\t%d\t%d\t%.2f\t%d\t%d\t%d\t%.2f\n", id, in,out,na,out?(float)out/(in+out):0,in1,out1,na1,out1?(float)out1/(in1+out1):0); + } + } + if ( args->indel_ctx ) + { + printf("# ICS, Indel context summary:\n# ICS\t[2]id\t[3]repeat-consistent\t[4]repeat-inconsistent\t[5]not applicable\t[6]c/(c+i) ratio\n"); + for (id=0; idnstats; id++) + { + int nc = 0, ni = 0, na = args->stats[id].n_repeat_na; + for (i=0; istats[id].n_repeat[i][0] + args->stats[id].n_repeat[i][2]; + ni += args->stats[id].n_repeat[i][1] + args->stats[id].n_repeat[i][3]; + } + printf("ICS\t%d\t%d\t%d\t%d\t%.4f\n", id, nc,ni,na,nc+ni ? (float)nc/(nc+ni) : 0.0); + } + printf("# ICL, Indel context by length:\n# ICL\t[2]id\t[3]length of repeat element\t[4]repeat-consistent deletions)\t[5]repeat-inconsistent deletions\t[6]consistent insertions\t[7]inconsistent insertions\t[8]c/(c+i) ratio\n"); + for (id=0; idnstats; id++) + { + for (i=1; istats[id].n_repeat[i][0]+args->stats[id].n_repeat[i][2], ni = args->stats[id].n_repeat[i][1]+args->stats[id].n_repeat[i][3]; + printf("ICL\t%d\t%d\t%d\t%d\t%d\t%d\t%.4f\n", id, i+1, + args->stats[id].n_repeat[i][0],args->stats[id].n_repeat[i][1],args->stats[id].n_repeat[i][2],args->stats[id].n_repeat[i][3], + nc+ni ? (float)nc/(nc+ni) : 0.0); + } + } + } + printf("# SiS, Singleton stats:\n# SiS\t[2]id\t[3]allele count\t[4]number of SNPs\t[5]number of transitions\t[6]number of transversions\t[7]number of indels\t[8]repeat-consistent\t[9]repeat-inconsistent\t[10]not applicable\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + printf("SiS\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", id,1,stats->af_snps[0],stats->af_ts[0],stats->af_tv[0], + stats->af_repeats[0][0]+stats->af_repeats[1][0]+stats->af_repeats[2][0],stats->af_repeats[0][0],stats->af_repeats[1][0],stats->af_repeats[2][0]); + // put the singletons stats into the first AF bin, note that not all of the stats is transferred (i.e. nrd mismatches) + stats->af_snps[1] += stats->af_snps[0]; + stats->af_ts[1] += stats->af_ts[0]; + stats->af_tv[1] += stats->af_tv[0]; + stats->af_repeats[0][1] += stats->af_repeats[0][0]; + stats->af_repeats[1][1] += stats->af_repeats[1][0]; + stats->af_repeats[2][1] += stats->af_repeats[2][0]; + } + // move the singletons stats into the first AF bin, singleton stats was collected separately because of init_iaf + if ( args->af_gts_snps ) + { + args->af_gts_snps[1].y += args->af_gts_snps[0].y; + args->af_gts_snps[1].yy += args->af_gts_snps[0].yy; + args->af_gts_snps[1].xx += args->af_gts_snps[0].xx; + args->af_gts_snps[1].yx += args->af_gts_snps[0].yx; + args->af_gts_snps[1].n += args->af_gts_snps[0].n; + } + if ( args->af_gts_indels ) + { + args->af_gts_indels[1].y += args->af_gts_indels[0].y; + args->af_gts_indels[1].yy += args->af_gts_indels[0].yy; + args->af_gts_indels[1].xx += args->af_gts_indels[0].xx; + args->af_gts_indels[1].yx += args->af_gts_indels[0].yx; + args->af_gts_indels[1].n += args->af_gts_indels[0].n; + } + + printf("# AF, Stats by non-reference allele frequency:\n# AF\t[2]id\t[3]allele frequency\t[4]number of SNPs\t[5]number of transitions\t[6]number of transversions\t[7]number of indels\t[8]repeat-consistent\t[9]repeat-inconsistent\t[10]not applicable\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=1; im_af; i++) // note that af[1] now contains also af[0], see SiS stats output above + { + if ( stats->af_snps[i]+stats->af_ts[i]+stats->af_tv[i]+stats->af_repeats[0][i]+stats->af_repeats[1][i]+stats->af_repeats[2][i] == 0 ) continue; + double af = args->af_bins ? (bin_get_value(args->af_bins,i)+bin_get_value(args->af_bins,i-1))*0.5 : (double)(i-1)/(args->m_af-1); + printf("AF\t%d\t%f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", id,af,stats->af_snps[i],stats->af_ts[i],stats->af_tv[i], + stats->af_repeats[0][i]+stats->af_repeats[1][i]+stats->af_repeats[2][i],stats->af_repeats[0][i],stats->af_repeats[1][i],stats->af_repeats[2][i]); + } + } + #if QUAL_STATS + printf("# QUAL, Stats by quality\n# QUAL\t[2]id\t[3]Quality\t[4]number of SNPs\t[5]number of transitions (1st ALT)\t[6]number of transversions (1st ALT)\t[7]number of indels\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + int ndist_ts = dist_nbins(stats->qual_ts); + int ndist_tv = dist_nbins(stats->qual_tv); + int ndist_in = dist_nbins(stats->qual_indels); + int ndist_max = ndist_ts; + if ( ndist_max < ndist_tv ) ndist_max = ndist_tv; + if ( ndist_max < ndist_in ) ndist_max = ndist_in; + uint32_t beg, end; + uint32_t nts, ntv, nin; + for (i=0; iqual_ts, i, &beg, &end); + qval = beg>0 ? 0.1*(beg - 1) : -1; + } + if ( i < ndist_tv ) + { + ntv = dist_get(stats->qual_tv, i, &beg, &end); + if ( qval==-1 ) qval = beg > 0 ? 0.1*(beg - 1) : -1; + } + if ( i < ndist_in ) + { + nin = dist_get(stats->qual_indels, i, &beg, &end); + if ( qval==-1 ) qval = beg > 0 ? 0.1*(beg - 1) : -1; + } + if ( nts+ntv+nin==0 ) continue; + + printf("QUAL\t%d\t",id); + if ( qval==-1 ) printf("."); + else printf("%.1f",qval); + printf("\t%d\t%d\t%d\t%d\n",nts+ntv,nts,ntv,nin); + } + } + #endif + for (i=0; inusr; i++) + { + printf("# USR:%s/%d\t[2]id\t[3]%s/%d\t[4]number of SNPs\t[5]number of transitions (1st ALT)\t[6]number of transversions (1st ALT)\n", + args->usr[i].tag,args->usr[i].idx,args->usr[i].tag,args->usr[i].idx); + for (id=0; idnstats; id++) + { + user_stats_t *usr = &args->stats[id].usr[i]; + int j; + for (j=0; jnbins; j++) + { + if ( usr->vals_ts[j]+usr->vals_tv[j] == 0 ) continue; // skip empty bins + float val = usr->min + (usr->max - usr->min)*j/(usr->nbins-1); + const char *fmt = usr->type==BCF_HT_REAL ? "USR:%s/%d\t%d\t%e\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n" : "USR:%s/%d\t%d\t%.0f\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n"; + printf(fmt,usr->tag,usr->idx,id,val,usr->vals_ts[j]+usr->vals_tv[j],usr->vals_ts[j],usr->vals_tv[j]); + } + } + } + printf("# IDD, InDel distribution:\n# IDD\t[2]id\t[3]length (deletions negative)\t[4]number of sites\t[5]number of genotypes\t[6]mean VAF\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=stats->m_indel-1; i>=0; i--) + { + if ( !stats->deletions[i] ) continue; + // whops, differently organized arrow, dels are together with ins + int bin = stats->m_indel - i - 1; + printf("IDD\t%d\t%d\t%d\t", id,-i-1,stats->deletions[i]); + if ( stats->nvaf && stats->nvaf[bin] ) + printf("%u\t%.2f",stats->nvaf[bin],stats->dvaf[bin]/stats->nvaf[bin]); + else + printf("0\t."); + printf("\n"); + } + for (i=0; im_indel; i++) + { + if ( !stats->insertions[i] ) continue; + int bin = stats->m_indel + i + 1; + printf("IDD\t%d\t%d\t%d\t", id,i+1,stats->insertions[i]); + if ( stats->nvaf && stats->nvaf[bin] ) + printf("%u\t%.2f",stats->nvaf[bin],stats->dvaf[bin]/stats->nvaf[bin]); + else + printf("0\t."); + printf("\n"); + } + } + printf("# ST, Substitution types:\n# ST\t[2]id\t[3]type\t[4]count\n"); + for (id=0; idnstats; id++) + { + int t; + for (t=0; t<15; t++) + { + if ( t>>2 == (t&3) ) continue; + printf("ST\t%d\t%c>%c\t%d\n", id, bcf_int2acgt(t>>2),bcf_int2acgt(t&3),args->stats[id].subst[t]); + } + } + if ( args->files->nreaders>1 && args->files->n_smpl ) + { + printf("SN\t%d\tnumber of samples:\t%d\n", 2, args->files->n_smpl); + + int x; + for (x=0; x<2; x++) // x=0: snps, x=1: indels + { + gtcmp_t *stats; + if ( x==0 ) + { + printf("# GCsAF, Genotype concordance by non-reference allele frequency (SNPs)\n# GCsAF\t[2]id\t[3]allele frequency\t[4]RR Hom matches\t[5]RA Het matches\t[6]AA Hom matches\t[7]RR Hom mismatches\t[8]RA Het mismatches\t[9]AA Hom mismatches\t[10]dosage r-squared\t[11]number of genotypes\n"); + stats = args->af_gts_snps; + } + else + { + printf("# GCiAF, Genotype concordance by non-reference allele frequency (indels)\n# GCiAF\t[2]id\t[3]allele frequency\t[4]RR Hom matches\t[5]RA Het matches\t[6]AA Hom matches\t[7]RR Hom mismatches\t[8]RA Het mismatches\t[9]AA Hom mismatches\t[10]dosage r-squared\t[11]number of genotypes\n"); + stats = args->af_gts_indels; + } + uint64_t nrd_m[4] = {0,0,0,0}, nrd_mm[4] = {0,0,0,0}; // across all bins + for (i=0; im_af; i++) + { + int n = 0; + uint64_t m[4] = {0,0,0,0}, mm[4] = {0,0,0,0}; // in i-th AF bin + for (j=0; j<4; j++) // rr, ra, aa hom, aa het, ./. + for (k=0; k<4; k++) + { + n += stats[i].gt2gt[j][k]; + if ( j==k ) + { + nrd_m[j] += stats[i].gt2gt[j][k]; + m[j] += stats[i].gt2gt[j][k]; + } + else + { + nrd_mm[j] += stats[i].gt2gt[j][k]; + mm[j] += stats[i].gt2gt[j][k]; + } + } + if ( !i || !n ) continue; // skip singleton stats and empty bins + + // Pearson's r2 + double r2 = 0; + if ( stats[i].n ) + { + r2 = (stats[i].yx - stats[i].x*stats[i].y/stats[i].n); + r2 /= sqrt((stats[i].xx - stats[i].x*stats[i].x/stats[i].n) * (stats[i].yy - stats[i].y*stats[i].y/stats[i].n)); + r2 *= r2; + } + double af = args->af_bins ? (bin_get_value(args->af_bins,i)+bin_get_value(args->af_bins,i-1))*0.5 : (double)(i-1)/(args->m_af-1); + printf("GC%cAF\t2\t%f", x==0 ? 's' : 'i', af); + printf("\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"", m[T2S(GT_HOM_RR)],m[T2S(GT_HET_RA)],m[T2S(GT_HOM_AA)]); + printf("\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"", mm[T2S(GT_HOM_RR)],mm[T2S(GT_HET_RA)],mm[T2S(GT_HOM_AA)]); + if ( stats[i].n && !isnan(r2) ) printf("\t%f", r2); + else printf("\t"NA_STRING); + printf("\t%.0f\n", stats[i].n); + } + + if ( x==0 ) + { + printf("# NRD and discordance is calculated as follows:\n"); + printf("# m .. number of matches\n"); + printf("# x .. number of mismatches\n"); + printf("# NRD = 100 * (xRR + xRA + xAA) / (xRR + xRA + xAA + mRA + mAA)\n"); + printf("# RR discordance = 100 * xRR / (xRR + mRR)\n"); + printf("# RA discordance = 100 * xRA / (xRA + mRA)\n"); + printf("# AA discordance = 100 * xAA / (xAA + mAA)\n"); + printf("# Non-Reference Discordance (NRD), SNPs\n# NRDs\t[2]id\t[3]NRD\t[4]Ref/Ref discordance\t[5]Ref/Alt discordance\t[6]Alt/Alt discordance\n"); + } + else + printf("# Non-Reference Discordance (NRD), indels\n# NRDi\t[2]id\t[3]NRD\t[4]Ref/Ref discordance\t[5]Ref/Alt discordance\t[6]Alt/Alt discordance\n"); + uint64_t m = nrd_m[T2S(GT_HET_RA)] + nrd_m[T2S(GT_HOM_AA)] + nrd_m[T2S(GT_HET_AA)]; + uint64_t mm = nrd_mm[T2S(GT_HOM_RR)] + nrd_mm[T2S(GT_HET_RA)] + nrd_mm[T2S(GT_HOM_AA)] + nrd_mm[T2S(GT_HET_AA)]; + printf("NRD%c\t2\t%f\t%f\t%f\t%f\n", x==0 ? 's' : 'i', + m+mm ? mm*100.0/(m+mm) : 0, + nrd_m[T2S(GT_HOM_RR)]+nrd_mm[T2S(GT_HOM_RR)] ? nrd_mm[T2S(GT_HOM_RR)]*100.0/(nrd_m[T2S(GT_HOM_RR)]+nrd_mm[T2S(GT_HOM_RR)]) : 0, + nrd_m[T2S(GT_HET_RA)]+nrd_mm[T2S(GT_HET_RA)] ? nrd_mm[T2S(GT_HET_RA)]*100.0/(nrd_m[T2S(GT_HET_RA)]+nrd_mm[T2S(GT_HET_RA)]) : 0, + nrd_m[T2S(GT_HOM_AA)]+nrd_mm[T2S(GT_HOM_AA)] ? nrd_mm[T2S(GT_HOM_AA)]*100.0/(nrd_m[T2S(GT_HOM_AA)]+nrd_mm[T2S(GT_HOM_AA)]) : 0 + ); + } + + for (x=0; x<2; x++) // x=0: snps, x=1: indels + { + gtcmp_t *stats; + if ( x==0 ) + { + printf("# GCsS, Genotype concordance by sample (SNPs)\n# GCsS\t[2]id\t[3]sample\t[4]non-reference discordance rate\t[5]RR Hom matches\t[6]RA Het matches\t[7]AA Hom matches\t[8]RR Hom mismatches\t[9]RA Het mismatches\t[10]AA Hom mismatches\t[11]dosage r-squared\n"); + stats = args->smpl_gts_snps; + } + else + { + printf("# GCiS, Genotype concordance by sample (indels)\n# GCiS\t[2]id\t[3]sample\t[4]non-reference discordance rate\t[5]RR Hom matches\t[6]RA Het matches\t[7]AA Hom matches\t[8]RR Hom mismatches\t[9]RA Het mismatches\t[10]AA Hom mismatches\t[11]dosage r-squared\n"); + stats = args->smpl_gts_indels; + } + for (i=0; ifiles->n_smpl; i++) + { + uint64_t mm = 0, m = stats[i].gt2gt[T2S(GT_HET_RA)][T2S(GT_HET_RA)] + stats[i].gt2gt[T2S(GT_HOM_AA)][T2S(GT_HOM_AA)]; + for (j=0; j<3; j++) + for (k=0; k<3; k++) + if ( j!=k ) mm += stats[i].gt2gt[j][k]; + + // Pearson's r2 + double r2 = 0; + if ( stats[i].n ) + { + r2 = (stats[i].yx - stats[i].x*stats[i].y/stats[i].n); + r2 /= sqrt((stats[i].xx - stats[i].x*stats[i].x/stats[i].n) * (stats[i].yy - stats[i].y*stats[i].y/stats[i].n)); + r2 *= r2; + } + printf("GC%cS\t2\t%s\t%.3f", x==0 ? 's' : 'i', args->files->samples[i], m+mm ? mm*100.0/(m+mm) : 0); + printf("\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"", + stats[i].gt2gt[T2S(GT_HOM_RR)][T2S(GT_HOM_RR)], + stats[i].gt2gt[T2S(GT_HET_RA)][T2S(GT_HET_RA)], + stats[i].gt2gt[T2S(GT_HOM_AA)][T2S(GT_HOM_AA)]); + printf("\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"", + stats[i].gt2gt[T2S(GT_HOM_RR)][T2S(GT_HET_RA)] + stats[i].gt2gt[T2S(GT_HOM_RR)][T2S(GT_HOM_AA)], + stats[i].gt2gt[T2S(GT_HET_RA)][T2S(GT_HOM_RR)] + stats[i].gt2gt[T2S(GT_HET_RA)][T2S(GT_HOM_AA)], + stats[i].gt2gt[T2S(GT_HOM_AA)][T2S(GT_HOM_RR)] + stats[i].gt2gt[T2S(GT_HOM_AA)][T2S(GT_HET_RA)]); + if ( stats[i].n && !isnan(r2) ) printf("\t%f\n", r2); + else printf("\t"NA_STRING"\n"); + } + } + for (x=0; x<2; x++) // x=0: snps, x=1: indels + { + //printf("# GCiS, Genotype concordance by sample (indels)\n# GCiS\t[2]id\t[3]sample\t[4]non-reference discordance rate\t[5]RR Hom matches\t[6]RA Het matches\t[7]AA Hom matches\t[8]RR Hom mismatches\t[9]RA Het mismatches\t[10]AA Hom mismatches\t[11]dosage r-squared\n"); + + gtcmp_t *stats; + if ( x==0 ) + { + printf("# GCTs, Genotype concordance table (SNPs)\n# GCTs"); + stats = args->smpl_gts_snps; + } + else + { + printf("# GCTi, Genotype concordance table (indels)\n# GCTi"); + stats = args->smpl_gts_indels; + } + i = 1; + printf("\t[%d]sample", ++i); + printf("\t[%d]RR Hom -> RR Hom", ++i); + printf("\t[%d]RR Hom -> RA Het", ++i); + printf("\t[%d]RR Hom -> AA Hom", ++i); + printf("\t[%d]RR Hom -> AA Het", ++i); + printf("\t[%d]RR Hom -> missing", ++i); + printf("\t[%d]RA Het -> RR Hom", ++i); + printf("\t[%d]RA Het -> RA Het", ++i); + printf("\t[%d]RA Het -> AA Hom", ++i); + printf("\t[%d]RA Het -> AA Het", ++i); + printf("\t[%d]RA Het -> missing", ++i); + printf("\t[%d]AA Hom -> RR Hom", ++i); + printf("\t[%d]AA Hom -> RA Het", ++i); + printf("\t[%d]AA Hom -> AA Hom", ++i); + printf("\t[%d]AA Hom -> AA Het", ++i); + printf("\t[%d]AA Hom -> missing", ++i); + printf("\t[%d]AA Het -> RR Hom", ++i); + printf("\t[%d]AA Het -> RA Het", ++i); + printf("\t[%d]AA Het -> AA Hom", ++i); + printf("\t[%d]AA Het -> AA Het", ++i); + printf("\t[%d]AA Het -> missing", ++i); + printf("\t[%d]missing -> RR Hom", ++i); + printf("\t[%d]missing -> RA Het", ++i); + printf("\t[%d]missing -> AA Hom", ++i); + printf("\t[%d]missing -> AA Het", ++i); + printf("\t[%d]missing -> missing\n", ++i); + + for (i=0; ifiles->n_smpl; i++) + { + printf("GCT%c\t%s", x==0 ? 's' : 'i', args->files->samples[i]); + for (j=0; j<5; j++) + for (k=0; k<5; k++) + printf("\t%"PRIu64, stats[i].gt2gt[j][k]); + printf("\n"); + } + } + } + + printf("# DP, Depth distribution\n# DP\t[2]id\t[3]bin\t[4]number of genotypes\t[5]fraction of genotypes (%%)\t[6]number of sites\t[7]fraction of sites (%%)\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + long unsigned int sum = 0, sum_sites = 0; + for (i=0; idp.m_vals; i++) { sum += stats->dp.vals[i]; sum_sites += stats->dp_sites.vals[i]; } + for (i=0; idp.m_vals; i++) + { + if ( stats->dp.vals[i]==0 && stats->dp_sites.vals[i]==0 ) continue; + printf("DP\t%d\t", id); + if ( i==0 ) printf("<%d", stats->dp.min); + else if ( i+1==stats->dp.m_vals ) printf(">%d", stats->dp.max); + else printf("%d", idist_i2bin(&stats->dp,i)); + printf("\t%"PRIu64"\t%f", stats->dp.vals[i], sum ? stats->dp.vals[i]*100./sum : 0); + printf("\t%"PRIu64"\t%f\n", stats->dp_sites.vals[i], sum_sites ? stats->dp_sites.vals[i]*100./sum_sites : 0); + } + } + + if ( args->files->n_smpl ) + { + printf("# PSC, Per-sample counts. Note that the ref/het/hom counts include only SNPs, for indels see PSI. The rest include both SNPs and indels.\n"); + printf("# PSC\t[2]id\t[3]sample\t[4]nRefHom\t[5]nNonRefHom\t[6]nHets\t[7]nTransitions\t[8]nTransversions\t[9]nIndels\t[10]average depth\t[11]nSingletons" + "\t[12]nHapRef\t[13]nHapAlt\t[14]nMissing\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=0; ifiles->n_smpl; i++) + { + float dp = stats->smpl_ndp[i] ? stats->smpl_dp[i]/(float)stats->smpl_ndp[i] : 0; + printf("PSC\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%.1f\t%d\t%d\t%d\t%d\n", id,args->files->samples[i], + stats->smpl_homRR[i], stats->smpl_homAA[i], stats->smpl_hets[i], stats->smpl_ts[i], + stats->smpl_tv[i], stats->smpl_indels[i],dp, stats->smpl_sngl[i], stats->smpl_hapRef[i], + stats->smpl_hapAlt[i], stats->smpl_missing[i]); + } + } + + printf("# PSI, Per-Sample Indels. Note that alt-het genotypes with both ins and del allele are counted twice, in both nInsHets and nDelHets.\n"); + printf("# PSI\t[2]id\t[3]sample\t[4]in-frame\t[5]out-frame\t[6]not applicable\t[7]out/(in+out) ratio\t[8]nInsHets\t[9]nDelHets\t[10]nInsAltHoms\t[11]nDelAltHoms\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=0; ifiles->n_smpl; i++) + { + int na = 0, in = 0, out = 0; + if ( args->exons ) + { + na = stats->smpl_frm_shifts[i*3 + 0]; + in = stats->smpl_frm_shifts[i*3 + 1]; + out = stats->smpl_frm_shifts[i*3 + 2]; + } + printf("PSI\t%d\t%s\t%d\t%d\t%d\t%.2f\t%d\t%d\t%d\t%d\n", id,args->files->samples[i], in,out,na,in+out?1.0*out/(in+out):0, + stats->smpl_ins_hets[i],stats->smpl_del_hets[i],stats->smpl_ins_homs[i],stats->smpl_del_homs[i]); + } + } + + #ifdef HWE_STATS + printf("# HWE\n# HWE\t[2]id\t[3]1st ALT allele frequency\t[4]Number of observations\t[5]25th percentile\t[6]median\t[7]75th percentile\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=0; inaf_hwe; i++) stats->af_hwe[i+args->naf_hwe] += stats->af_hwe[i]; // singletons + for (i=1; im_af; i++) + { + unsigned int sum_tot = 0, sum_tmp = 0; + int j, *ptr = &stats->af_hwe[i*args->naf_hwe]; + for (j=0; jnaf_hwe; j++) sum_tot += ptr[j]; + if ( !sum_tot ) continue; + + double af = args->af_bins ? (bin_get_value(args->af_bins,i)+bin_get_value(args->af_bins,i-1))*0.5 : (double)(i-1)/(args->m_af-1); + + int nprn = 3; + printf("HWE\t%d\t%f\t%d",id,af,sum_tot); + for (j=0; jnaf_hwe; j++) + { + sum_tmp += ptr[j]; + float frac = (float)sum_tmp/sum_tot; + if ( frac >= 0.75 ) + { + while (nprn>0) { printf("\t%f", (float)j/args->naf_hwe); nprn--; } + break; + } + if ( frac >= 0.5 ) + { + while (nprn>1) { printf("\t%f", (float)j/args->naf_hwe); nprn--; } + continue; + } + if ( frac >= 0.25 ) + { + while (nprn>2) { printf("\t%f", (float)j/args->naf_hwe); nprn--; } + } + } + assert(nprn==0); + printf("\n"); + } + } + #endif + } +} + +static void usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Parses VCF or BCF and produces stats which can be plotted using plot-vcfstats.\n"); + fprintf(stderr, " When two files are given, the program generates separate stats for intersection\n"); + fprintf(stderr, " and the complements. By default only sites are compared, -s/-S must given to include\n"); + fprintf(stderr, " also sample columns.\n"); + fprintf(stderr, "Usage: bcftools stats [options] []\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " --af-bins LIST Allele frequency bins, a list (0.1,0.5,1) or a file (0.1\\n0.5\\n1)\n"); + fprintf(stderr, " --af-tag STRING Allele frequency tag to use, by default estimated from AN,AC or GT\n"); + fprintf(stderr, " -1, --1st-allele-only Include only 1st allele at multiallelic sites\n"); + fprintf(stderr, " -c, --collapse STRING Treat as identical records with , see man page for details [none]\n"); + fprintf(stderr, " -d, --depth INT,INT,INT Depth distribution: min,max,bin size [0,500,1]\n"); + fprintf(stderr, " -e, --exclude EXPR Exclude sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " -E, --exons FILE.gz Tab-delimited file with exons for indel frameshifts (chr,beg,end; 1-based, inclusive, bgzip compressed)\n"); + fprintf(stderr, " -f, --apply-filters LIST Require at least one of the listed FILTER strings (e.g. \"PASS,.\")\n"); + fprintf(stderr, " -F, --fasta-ref FILE Faidx indexed reference sequence file to determine INDEL context\n"); + fprintf(stderr, " -i, --include EXPR Select sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " -I, --split-by-ID Collect stats for sites with ID separately (known vs novel)\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -s, --samples LIST List of samples for sample stats, \"-\" to include all samples\n"); + fprintf(stderr, " -S, --samples-file FILE File of samples to include\n"); + fprintf(stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, " -u, --user-tstv TAG[:min:max:n] Collect Ts/Tv stats for any tag using the given binning [0:1:100]\n"); + fprintf(stderr, " A subfield can be selected as e.g. 'PV4[0]', here the first value of the PV4 tag\n"); + fprintf(stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(stderr, " -v, --verbose Produce verbose per-site and per-sample output\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfstats(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->files = bcf_sr_init(); + args->argc = argc; args->argv = argv; + args->dp_min = 0; args->dp_max = 500; args->dp_step = 1; + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"af-bins",1,0,1}, + {"af-tag",1,0,2}, + {"1st-allele-only",0,0,'1'}, + {"include",1,0,'i'}, + {"exclude",1,0,'e'}, + {"help",0,0,'h'}, + {"collapse",1,0,'c'}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"verbose",0,0,'v'}, + {"depth",1,0,'d'}, + {"apply-filters",1,0,'f'}, + {"exons",1,0,'E'}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"split-by-ID",0,0,'I'}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,4}, + {"fasta-ref",1,0,'F'}, + {"user-tstv",1,0,'u'}, + {"threads",1,0,9}, + {0,0,0,0} + }; + while ((c = getopt_long(argc, argv, "hc:r:R:e:s:S:d:i:t:T:F:f:1u:vIE:",loptions,NULL)) >= 0) { + switch (c) { + case 1 : args->af_bins_list = optarg; break; + case 2 : args->af_tag = optarg; break; + case 'u': add_user_stats(args,optarg); break; + case '1': args->first_allele_only = 1; break; + case 'F': args->ref_fname = optarg; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'c': + if ( !strcmp(optarg,"snps") ) args->files->collapse |= COLLAPSE_SNPS; + else if ( !strcmp(optarg,"indels") ) args->files->collapse |= COLLAPSE_INDELS; + else if ( !strcmp(optarg,"both") ) args->files->collapse |= COLLAPSE_SNPS | COLLAPSE_INDELS; + else if ( !strcmp(optarg,"any") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"all") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"some") ) args->files->collapse |= COLLAPSE_SOME; + else if ( !strcmp(optarg,"none") ) args->files->collapse = COLLAPSE_NONE; + else error("The --collapse string \"%s\" not recognised.\n", optarg); + break; + case 'v': args->verbose_sites = 1; break; + case 'd': + if ( sscanf(optarg,"%d,%d,%d",&args->dp_min,&args->dp_max,&args->dp_step)!=3 ) + error("Could not parse --depth %s\n", optarg); + if ( args->dp_min<0 || args->dp_min >= args->dp_max || args->dp_step > args->dp_max - args->dp_min + 1 ) + error("Is this a typo? --depth %s\n", optarg); + break; + case 'f': args->files->apply_filters = optarg; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 'E': args->exons_fname = optarg; break; + case 's': args->samples_list = optarg; break; + case 'S': args->samples_list = optarg; args->samples_is_file = 1; break; + case 'I': args->split_by_id = 1; break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 4 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + char *fname = NULL; + if ( optind==argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(); + } + else fname = argv[optind]; + + if ( argc-optind>2 ) usage(); + if ( argc-optind>1 ) + { + args->files->require_index = 1; + if ( args->split_by_id ) error("Only one file can be given with -i.\n"); + } + if ( !args->samples_list ) args->files->max_unpack = BCF_UN_INFO; + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( args->regions_list) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->n_threads && bcf_sr_set_threads(args->files, args->n_threads)<0) + error("Failed to create threads\n"); + + while (fname) + { + if ( !bcf_sr_add_reader(args->files, fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + fname = ++optind < argc ? argv[optind] : NULL; + } + + init_stats(args); + print_header(args); + do_vcf_stats(args); + print_stats(args); + destroy_stats(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} + diff --git a/bcftools/vcfstats.c.pysam.c b/bcftools/vcfstats.c.pysam.c new file mode 100644 index 0000000..7b5c485 --- /dev/null +++ b/bcftools/vcfstats.c.pysam.c @@ -0,0 +1,1917 @@ +#include "bcftools.pysam.h" + +/* vcfstats.c -- Produces stats which can be plotted using plot-vcfstats. + + Copyright (C) 2012-2022 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +/* + Notes and known issues: + - SN ts/tv calculation includes all non-ref alleles listed in ALT while per-sample ts/tv + takes the first non-ref allele only, something to consider with many non-ref HETs. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "bin.h" +#include "dist.h" + +// Logic of the filters: include or exclude sites which match the filters? +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +#define HWE_STATS 1 +#define QUAL_STATS 1 +#define IRC_STATS 1 +#define IRC_RLEN 10 +#define NA_STRING "0" + +typedef struct +{ + char *tag; + float min, max; + uint64_t *vals_ts, *vals_tv; + void *val; + int nbins, type, m_val, idx; +} +user_stats_t; + +typedef struct +{ + int min, max, step, m_vals; + uint64_t *vals; +} +idist_t; + +typedef struct +{ + uint64_t n_snps, n_indels, n_mnps, n_others, n_mals, n_snp_mals, n_records, n_noalts; + int *af_ts, *af_tv, *af_snps; // first bin of af_* stats are singletons + #if HWE_STATS + int *af_hwe; + #endif + #if IRC_STATS + int n_repeat[IRC_RLEN][4], n_repeat_na; // number of indels which are repeat-consistent, repeat-inconsistent (dels and ins), and not applicable + int *af_repeats[3]; + #endif + int ts_alt1, tv_alt1; + #if QUAL_STATS + // Values are rounded to one significant digit and 1 is added (Q*10+1); missing and negative values go in the first bin + // Only SNPs that are the 1st alternate allele are counted + dist_t *qual_ts, *qual_tv, *qual_indels; + #endif + int *insertions, *deletions, m_indel; // maximum indel length + int in_frame, out_frame, na_frame, in_frame_alt1, out_frame_alt1, na_frame_alt1; + int subst[15]; + int *smpl_hets, *smpl_homRR, *smpl_homAA, *smpl_ts, *smpl_tv, *smpl_indels, *smpl_ndp, *smpl_sngl; + int *smpl_hapRef, *smpl_hapAlt, *smpl_missing; + int *smpl_ins_hets, *smpl_del_hets, *smpl_ins_homs, *smpl_del_homs; + int *smpl_frm_shifts; // not-applicable, in-frame, out-frame + unsigned long int *smpl_dp; + idist_t dp, dp_sites; + int nusr; + user_stats_t *usr; + double *dvaf; // distribution of the mean indel-allele frequency by length: -m_indel,-(m_indel-1),...-1,0,1,..,m_indel + uint32_t *nvaf; +} +stats_t; + +typedef struct +{ + uint64_t gt2gt[5][5]; // number of RR->RR, RR->RA, etc. matches/mismatches; see type2stats + /* + Pearson's R^2 is used for aggregate R^2 + y, yy .. sum of dosage and squared dosage in the query VCF (second file) + x, xx .. sum of squared dosage in the truth VCF (first file) + n .. number of genotypes + */ + double y, yy, x, xx, yx, n; +} +gtcmp_t; + +typedef struct +{ + char *seq; + int pos, cnt, len; +} +_idc1_t; +typedef struct +{ + faidx_t *ref; + _idc1_t *dat; + int ndat, mdat; +} +indel_ctx_t; + +typedef struct +{ + // stats + stats_t stats[3]; + int *tmp_iaf, ntmp_iaf, m_af, m_qual, naf_hwe, mtmp_frm; + uint8_t *tmp_frm; + int dp_min, dp_max, dp_step; + gtcmp_t *smpl_gts_snps, *smpl_gts_indels; + gtcmp_t *af_gts_snps, *af_gts_indels; // first bin of af_* stats are singletons + bin_t *af_bins; + float *farr; + int mfarr; + + // indel context + indel_ctx_t *indel_ctx; + char *ref_fname; + + // user stats + int nusr; + user_stats_t *usr; + + // other + bcf_srs_t *files; + bcf_sr_regions_t *exons; + char **argv, *exons_fname, *regions_list, *samples_list, *targets_list, *af_bins_list, *af_tag; + int argc, verbose_sites, first_allele_only, samples_is_file; + int split_by_id, nstats; + + filter_t *filter[2]; + char *filter_str; + int filter_logic; // include or exclude sites which match the filters? One of FLT_INCLUDE/FLT_EXCLUDE + int n_threads; +} +args_t; + +static int type2dosage[6], type2ploidy[6], type2stats[7]; + +static void idist_init(idist_t *d, int min, int max, int step) +{ + d->min = min; d->max = max; d->step = step; + d->m_vals = 4 + (d->max - d->min)/d->step; + d->vals = (uint64_t*) calloc(d->m_vals,sizeof(uint64_t)); +} +static void idist_destroy(idist_t *d) +{ + if ( d->vals ) free(d->vals); +} +static inline uint64_t *idist(idist_t *d, int val) +{ + if ( val < d->min ) return &d->vals[0]; + if ( val > d->max ) return &d->vals[d->m_vals-1]; + return &d->vals[1 + (val - d->min) / d->step]; +} +static inline int idist_i2bin(idist_t *d, int i) +{ + if ( i<=0 ) return d->min; + if ( i>= d->m_vals ) return d->max; + return i-1+d->min; +} + +#define IC_DBG 0 +#if IC_DBG +static void _indel_ctx_print1(_idc1_t *idc) +{ + int i; + fprintf(bcftools_stdout, "%d\t", idc->cnt); + for (i=0; ilen; i++) + fputc(idc->seq[i], bcftools_stdout); + fputc('\n', bcftools_stdout); +} +static void _indel_ctx_print(indel_ctx_t *ctx) +{ + int i; + for (i=0; indat; i++) + _indel_ctx_print1(&ctx->dat[i]); + fputc('\n',bcftools_stdout); +} +#endif +static int _indel_ctx_lookup(indel_ctx_t *ctx, char *seq, int seq_len, int *hit) +{ + // binary search + int min = 0, max = ctx->ndat - 1; + while ( min<=max ) + { + int i = (min+max)/2; + int cmp = strncmp(seq, ctx->dat[i].seq, seq_len); + if ( cmp<0 ) max = i - 1; + else if ( cmp>0 ) min = i + 1; + else + { + if ( seq_len==ctx->dat[i].len ) + { + *hit = 1; + return i; + } + else if ( seq_lendat[i].len ) max = i - 1; + else min = i + 1; + } + } + *hit = 0; + return max; +} +static void _indel_ctx_insert(indel_ctx_t *ctx, char *seq, int seq_len, int pos) +{ + int idat, hit, i; + idat = _indel_ctx_lookup(ctx, seq, seq_len, &hit); + if ( !hit ) + { + if ( pos>0 ) return; + idat++; + ctx->ndat++; + hts_expand(_idc1_t, ctx->ndat+1, ctx->mdat, ctx->dat); + if ( idatndat && ctx->ndat>1 ) + memmove(&ctx->dat[idat+1], &ctx->dat[idat], (ctx->ndat - idat - 1)*sizeof(_idc1_t)); + ctx->dat[idat].len = seq_len; + ctx->dat[idat].cnt = 1; + ctx->dat[idat].pos = pos; + ctx->dat[idat].seq = (char*) malloc(sizeof(char)*(seq_len+1)); + for (i=0; idat[idat].seq[i] = seq[i]; + ctx->dat[idat].seq[i] = 0; + return; + } + if ( ctx->dat[idat].pos + seq_len == pos ) + { + ctx->dat[idat].cnt++; + ctx->dat[idat].pos = pos; + } +} +indel_ctx_t *indel_ctx_init(char *fa_ref_fname) +{ + indel_ctx_t *ctx = (indel_ctx_t *) calloc(1,sizeof(indel_ctx_t)); + ctx->ref = fai_load(fa_ref_fname); + if ( !ctx->ref ) + { + free(ctx); + return NULL; + } + return ctx; +} +void indel_ctx_destroy(indel_ctx_t *ctx) +{ + fai_destroy(ctx->ref); + if ( ctx->mdat ) free(ctx->dat); + free(ctx); +} +/** + * indel_ctx_type() - determine indel context type + * @ctx: + * @chr: chromosome name + * @pos: position of the first @ref base, 1-based + * @ref: reference allele + * @alt: alternate allele. Only first of multiple comma-separated alleles is + * considered + * @nrep: number of repeated elements (w) + * @nlen: length of a single repeat element (w) + * + * Returns the INDEL length, negative for deletions, positive for insertions + */ +int indel_ctx_type(indel_ctx_t *ctx, char *chr, int pos, char *ref, char *alt, int *nrep, int *nlen) +{ + const int win_size = 50; // hard-wired for now + const int rep_len = IRC_RLEN; // hard-wired for now + + int ref_len = strlen(ref); + int alt_len = 0; + while ( alt[alt_len] && alt[alt_len]!=',' ) alt_len++; + + int i, fai_ref_len; + char *fai_ref = faidx_fetch_seq(ctx->ref, chr, pos-1, pos+win_size, &fai_ref_len); + for (i=0; i96 ) fai_ref[i] -= 32; + + // Sanity check: the reference sequence must match the REF allele + for (i=0; indat = 0; + for (i=0; indat; i++) + { + if ( max_cnt < ctx->dat[i].cnt || (max_cnt==ctx->dat[i].cnt && max_len < ctx->dat[i].len) ) + { + max_cnt = ctx->dat[i].cnt; + max_len = ctx->dat[i].len; + } + free(ctx->dat[i].seq); + } + free(fai_ref); + + *nrep = max_cnt; + *nlen = max_len; + return alt_len - ref_len; +} + +static void add_user_stats(args_t *args, char *str) +{ + args->nusr++; + args->usr = (user_stats_t*) realloc(args->usr,sizeof(user_stats_t)*args->nusr); + user_stats_t *usr = &args->usr[args->nusr-1]; + memset(usr,0,sizeof(*usr)); + usr->min = 0; + usr->max = 1; + usr->nbins = 100; + usr->idx = 0; + + char *tmp = str; + while ( *tmp && *tmp!=':' ) tmp++; + + // Tag with an index or just tag? (e.g. PV4[1] vs DP) + if ( tmp > str && tmp[-1]==']' ) + { + char *ptr = tmp; + while ( ptr>str && *ptr!='[' ) ptr--; + if ( *ptr=='[' ) + { + char *ptr2; + usr->idx = strtol(ptr+1, &ptr2, 10); + if ( ptr+1==ptr2 || ptr2 != tmp-1 ) error("Could not parse the index in \"%s\" (ptr=%s;ptr2=%s(%p),tmp=%s(%p),idx=%d)\n", str,ptr,ptr2,ptr2,tmp,tmp,usr->idx); + if ( usr->idx<0 ) error("Error: negative index is not allowed: \"%s\"\n", str); + *ptr = 0; + } + } + + usr->tag = (char*)calloc(tmp-str+2,sizeof(char)); + memcpy(usr->tag,str,tmp-str); + + if ( *tmp ) + { + char *ptr = ++tmp; + usr->min = strtod(tmp, &ptr); + if ( tmp==ptr ) error("Could not parse %s\n", str); + tmp = ptr+1; + } + if ( *tmp ) + { + char *ptr = tmp; + usr->max = strtod(tmp, &ptr); + if ( tmp==ptr ) error("Could not parse %s\n", str); + tmp = ptr+1; + } + if ( *tmp ) + { + char *ptr = tmp; + usr->nbins = strtol(tmp, &ptr, 10); + if ( tmp==ptr ) error("Could not parse %s\n", str); + if ( usr->nbins<=0 ) error("Number of bins does not make sense (%d): %s.\n", usr->nbins, str); + } +} +static void init_user_stats(args_t *args, bcf_hdr_t *hdr, stats_t *stats) +{ + stats->nusr = args->nusr; + stats->usr = (user_stats_t*)malloc(sizeof(user_stats_t)*args->nusr); + memcpy(stats->usr,args->usr,args->nusr*sizeof(user_stats_t)); + int i; + for (i=0; inusr; i++) + { + user_stats_t *usr = &stats->usr[i]; + usr->vals_ts = (uint64_t*)calloc(usr->nbins,sizeof(uint64_t)); + usr->vals_tv = (uint64_t*)calloc(usr->nbins,sizeof(uint64_t)); + int id = bcf_hdr_id2int(hdr,BCF_DT_ID,usr->tag); + if ( !bcf_hdr_idinfo_exists(hdr,BCF_HL_INFO,id) ) error("The INFO tag \"%s\" is not defined in the header\n", usr->tag); + usr->type = bcf_hdr_id2type(hdr,BCF_HL_INFO,id); + if ( usr->type!=BCF_HT_REAL && usr->type!=BCF_HT_INT ) error("The INFO tag \"%s\" is not of Float or Integer type (%d)\n", usr->tag, usr->type); + } +} +static void init_stats(args_t *args) +{ + int i; + args->nstats = args->files->nreaders==1 ? 1 : 3; + if ( args->split_by_id ) args->nstats = 2; + + if ( args->filter_str ) + { + args->filter[0] = filter_init(bcf_sr_get_header(args->files,0), args->filter_str); + if ( args->files->nreaders==2 ) + args->filter[1] = filter_init(bcf_sr_get_header(args->files,1), args->filter_str); + args->files->max_unpack |= filter_max_unpack(args->filter[0]); + } + + // AF corresponds to AC but is more robust to mixtures of haploid and diploid GTs + if ( !args->af_bins_list ) + { + args->m_af = 101; + for (i=0; ifiles->nreaders; i++) + if ( bcf_hdr_nsamples(args->files->readers[i].header) + 1> args->m_af ) + args->m_af = bcf_hdr_nsamples(args->files->readers[i].header) + 1; + } + else + { + args->af_bins = bin_init(args->af_bins_list,0,1); + + // m_af is used also for other af arrays, where the first bin is for + // singletons. However, since the last element is unused in af_bins + // (n boundaries form n-1 intervals), the m_af count is good for both. + args->m_af = bin_get_size(args->af_bins); + } + + bcf_hdr_t *hdr = bcf_sr_get_header(args->files,0); + if ( args->af_tag && !bcf_hdr_idinfo_exists(hdr,BCF_HL_INFO,bcf_hdr_id2int(hdr,BCF_DT_ID,args->af_tag)) ) + error("No such INFO tag: %s\n", args->af_tag); + + #if QUAL_STATS + args->m_qual = 999; + #endif + #if HWE_STATS + args->naf_hwe = 100; + #endif + + if ( args->samples_list ) + { + if ( !bcf_sr_set_samples(args->files,args->samples_list,args->samples_is_file) ) + { + if ( !bcf_hdr_nsamples(args->files->readers[0].header) ) + error("No sample columns in %s\n", args->files->readers[0].fname); + error("Unable to parse the samples: \"%s\"\n", args->samples_list); + } + args->af_gts_snps = (gtcmp_t *) calloc(args->m_af,sizeof(gtcmp_t)); + args->af_gts_indels = (gtcmp_t *) calloc(args->m_af,sizeof(gtcmp_t)); + args->smpl_gts_snps = (gtcmp_t *) calloc(args->files->n_smpl,sizeof(gtcmp_t)); + args->smpl_gts_indels = (gtcmp_t *) calloc(args->files->n_smpl,sizeof(gtcmp_t)); + } + for (i=0; instats; i++) + { + stats_t *stats = &args->stats[i]; + stats->m_indel = 60; + stats->insertions = (int*) calloc(stats->m_indel,sizeof(int)); + stats->deletions = (int*) calloc(stats->m_indel,sizeof(int)); + stats->af_ts = (int*) calloc(args->m_af,sizeof(int)); + stats->af_tv = (int*) calloc(args->m_af,sizeof(int)); + stats->af_snps = (int*) calloc(args->m_af,sizeof(int)); + int j; + for (j=0; j<3; j++) stats->af_repeats[j] = (int*) calloc(args->m_af,sizeof(int)); + #if QUAL_STATS + stats->qual_ts = dist_init(5); + stats->qual_tv = dist_init(5); + stats->qual_indels = dist_init(5); + #endif + if ( args->files->n_smpl ) + { + stats->smpl_missing = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_hets = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_homAA = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_homRR = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_hapRef = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_hapAlt = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_ins_hets = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_del_hets = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_ins_homs = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_del_homs = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_ts = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_tv = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_indels = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_dp = (unsigned long int *) calloc(args->files->n_smpl,sizeof(unsigned long int)); + stats->smpl_ndp = (int *) calloc(args->files->n_smpl,sizeof(int)); + stats->smpl_sngl = (int *) calloc(args->files->n_smpl,sizeof(int)); + #if HWE_STATS + stats->af_hwe = (int*) calloc(args->m_af*args->naf_hwe,sizeof(int)); + #endif + if ( args->exons_fname ) + stats->smpl_frm_shifts = (int*) calloc(args->files->n_smpl*3,sizeof(int)); + stats->nvaf = (uint32_t*) calloc(stats->m_indel*2+1,sizeof(*stats->nvaf)); + stats->dvaf = (double*) calloc(stats->m_indel*2+1,sizeof(*stats->dvaf)); + } + idist_init(&stats->dp, args->dp_min,args->dp_max,args->dp_step); + idist_init(&stats->dp_sites, args->dp_min,args->dp_max,args->dp_step); + init_user_stats(args, i!=1 ? args->files->readers[0].header : args->files->readers[1].header, stats); + } + + if ( args->exons_fname ) + { + args->exons = bcf_sr_regions_init(args->exons_fname,1,0,1,2); + if ( !args->exons ) + error("Error occurred while reading, was the file compressed with bgzip: %s?\n", args->exons_fname); + } + + #if IRC_STATS + if ( args->ref_fname ) + args->indel_ctx = indel_ctx_init(args->ref_fname); + #endif + + type2dosage[GT_HOM_RR] = 0; + type2dosage[GT_HET_RA] = 1; + type2dosage[GT_HOM_AA] = 2; + type2dosage[GT_HET_AA] = 2; + type2dosage[GT_HAPL_R] = 0; + type2dosage[GT_HAPL_A] = 1; + + type2ploidy[GT_HOM_RR] = 1; + type2ploidy[GT_HET_RA] = 1; + type2ploidy[GT_HOM_AA] = 1; + type2ploidy[GT_HET_AA] = 1; + type2ploidy[GT_HAPL_R] = -1; + type2ploidy[GT_HAPL_A] = -1; + + type2stats[GT_HOM_RR] = 0; + type2stats[GT_HET_RA] = 1; + type2stats[GT_HOM_AA] = 2; + type2stats[GT_HET_AA] = 3; + type2stats[GT_HAPL_R] = 0; + type2stats[GT_HAPL_A] = 2; + type2stats[GT_UNKN] = 4; + +} +static void destroy_stats(args_t *args) +{ + int id, j; + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + if (stats->af_ts) free(stats->af_ts); + if (stats->af_tv) free(stats->af_tv); + if (stats->af_snps) free(stats->af_snps); + for (j=0; j<3; j++) + if (stats->af_repeats[j]) free(stats->af_repeats[j]); + #if QUAL_STATS + if (stats->qual_ts) dist_destroy(stats->qual_ts); + if (stats->qual_tv) dist_destroy(stats->qual_tv); + if (stats->qual_indels) dist_destroy(stats->qual_indels); + #endif + #if HWE_STATS + free(stats->af_hwe); + #endif + free(stats->insertions); + free(stats->deletions); + free(stats->smpl_missing); + free(stats->smpl_hets); + free(stats->smpl_homAA); + free(stats->smpl_homRR); + free(stats->smpl_hapRef); + free(stats->smpl_hapAlt); + free(stats->smpl_ins_homs); + free(stats->smpl_del_homs); + free(stats->smpl_ins_hets); + free(stats->smpl_del_hets); + free(stats->smpl_ts); + free(stats->smpl_tv); + free(stats->smpl_indels); + free(stats->smpl_dp); + free(stats->smpl_ndp); + free(stats->smpl_sngl); + idist_destroy(&stats->dp); + idist_destroy(&stats->dp_sites); + for (j=0; jnusr; j++) + { + free(stats->usr[j].vals_ts); + free(stats->usr[j].vals_tv); + free(stats->usr[j].val); + } + free(stats->usr); + if ( args->exons ) free(stats->smpl_frm_shifts); + free(stats->nvaf); + free(stats->dvaf); + } + for (j=0; jnusr; j++) free(args->usr[j].tag); + if ( args->af_bins ) bin_destroy(args->af_bins); + free(args->farr); + free(args->usr); + free(args->tmp_frm); + free(args->tmp_iaf); + if (args->exons) bcf_sr_regions_destroy(args->exons); + free(args->af_gts_snps); + free(args->af_gts_indels); + free(args->smpl_gts_snps); + free(args->smpl_gts_indels); + if (args->indel_ctx) indel_ctx_destroy(args->indel_ctx); + if (args->filter[0]) filter_destroy(args->filter[0]); + if (args->filter[1]) filter_destroy(args->filter[1]); +} + +static void init_iaf(args_t *args, bcf_sr_t *reader) +{ + bcf1_t *line = reader->buffer[0]; + hts_expand(int32_t,line->n_allele,args->ntmp_iaf,args->tmp_iaf); + + int i, ret; + if ( args->af_tag ) + { + ret = bcf_get_info_float(reader->header, line, args->af_tag, &args->farr, &args->mfarr); + if ( ret<=0 || ret!=line->n_allele-1 ) + { + // the AF tag is not present or wrong number of values, put in the singletons/unknown bin + for (i=0; in_allele; i++) args->tmp_iaf[i] = 0; + return; + } + args->tmp_iaf[0] = 0; + for (i=1; in_allele; i++) + { + float af = args->farr[i-1]; + if ( af<0 ) af = 0; + else if ( af>1 ) af = 1; + int iaf = args->af_bins ? bin_get_idx(args->af_bins,af) : af*(args->m_af-2); + args->tmp_iaf[i] = iaf + 1; // the first tmp_iaf bin is reserved for singletons + } + return; + } + + // tmp_iaf is first filled with AC counts in calc_ac and then transformed to + // an index to af_gts_snps + ret = bcf_calc_ac(reader->header, line, args->tmp_iaf, args->samples_list ? BCF_UN_INFO|BCF_UN_FMT : BCF_UN_INFO); + if ( !ret ) + { + for (i=0; in_allele; i++) args->tmp_iaf[i] = 0; // singletons/unknown bin + return; + } + + int an = 0; + for (i=0; in_allele; i++) + an += args->tmp_iaf[i]; + + args->tmp_iaf[0] = 0; + for (i=1; in_allele; i++) + { + if ( args->tmp_iaf[i]==1 ) + args->tmp_iaf[i] = 0; // singletons into the first bin + else if ( !an ) + args->tmp_iaf[i] = 1; // no genotype at all, put to the AF=0 bin + else + { + float af = (float) args->tmp_iaf[i] / an; + if ( af<0 ) af = 0; + else if ( af>1 ) af = 1; + int iaf = args->af_bins ? bin_get_idx(args->af_bins,af) : af*(args->m_af-2); + args->tmp_iaf[i] = iaf + 1; + } + } +} + +static inline void do_mnp_stats(args_t *args, stats_t *stats, bcf_sr_t *reader) +{ + stats->n_mnps++; +} + +static inline void do_other_stats(args_t *args, stats_t *stats, bcf_sr_t *reader) +{ + stats->n_others++; +} + +static void do_indel_stats(args_t *args, stats_t *stats, bcf_sr_t *reader) +{ + stats->n_indels++; + + bcf1_t *line = reader->buffer[0]; + + #if QUAL_STATS + int iqual = (isnan(line->qual) || line->qual<0) ? 0 : 1 + (int)(line->qual*10); + dist_insert(stats->qual_indels, iqual); + #endif + + // Check if the indel is near an exon for the frameshift statistics + int i, exon_overlap = 0; + if ( args->exons ) + { + if ( !bcf_sr_regions_overlap(args->exons, bcf_seqname(reader->header,line),line->pos,line->pos) ) exon_overlap = 1; + hts_expand(uint8_t,line->n_allele,args->mtmp_frm,args->tmp_frm); + for (i=0; in_allele; i++) args->tmp_frm[i] = 0; + } + + for (i=1; in_allele; i++) + { + if ( args->first_allele_only && i>1 ) break; + int is_indel = bcf_has_variant_type(line,i,VCF_INDEL); + if (is_indel < 0) error("bcf_has_variant_type() failed."); + if ( !is_indel ) continue; + int len = bcf_variant_length(line, i); + + #if IRC_STATS + // Indel repeat consistency + if ( args->indel_ctx ) + { + int nrep, nlen, ndel; + ndel = indel_ctx_type(args->indel_ctx, (char*)reader->header->id[BCF_DT_CTG][line->rid].key, line->pos+1, line->d.allele[0], line->d.allele[i], &nrep, &nlen); + if ( nlen<=1 || nrep<=1 ) + { + // not a repeat or a single base repeat + stats->n_repeat_na++; + stats->af_repeats[2][ args->tmp_iaf[i] ]++; + } + else + { + if ( abs(ndel) % nlen ) + { + // the length of the inserted/deleted sequence is not consistent with the repeat element + stats->n_repeat[nlen-1][ndel<0 ? 1 : 3]++; + stats->af_repeats[1][ args->tmp_iaf[i] ]++; + } + else + { + // the length consistent with the repeat + stats->n_repeat[nlen-1][ndel<0 ? 0 : 2]++; + stats->af_repeats[0][ args->tmp_iaf[i] ]++; + } + } + } + else + stats->af_repeats[2][ args->tmp_iaf[i] ]++; + #endif + + // Check the frameshifts + int tlen = 0; + if ( args->exons && exon_overlap ) // there is an exon + { + if ( len>0 ) + { + // insertion + if ( args->exons->start <= line->pos && args->exons->end > line->pos ) tlen = abs(len); + } + else if ( args->exons->start <= line->pos + abs(len) ) + { + // deletion + tlen = abs(len); + if ( line->pos < args->exons->start ) // trim the beginning + tlen -= args->exons->start - line->pos + 1; + if ( args->exons->end < line->pos + abs(len) ) // trim the end + tlen -= line->pos + abs(len) - args->exons->end; + } + } + if ( tlen ) // there are some deleted/inserted bases in the exon + { + if ( tlen%3 ) { stats->out_frame++; args->tmp_frm[i] = 2; } + else { stats->in_frame++; args->tmp_frm[i] = 1; } + + if ( i==1 ) + { + if ( tlen%3 ) stats->out_frame_alt1++; + else stats->in_frame_alt1++; + } + } + else // no exon affected + { + if ( i==1 ) stats->na_frame_alt1++; + stats->na_frame++; + } + + + // Indel length distribution + int *ptr = stats->insertions; + if ( len<0 ) + { + len *= -1; + ptr = stats->deletions; + } + if ( --len >= stats->m_indel ) len = stats->m_indel-1; + ptr[len]++; + } +} + +static void do_user_stats(stats_t *stats, bcf_sr_t *reader, int is_ts) +{ + int i, nval; + for (i=0; inusr; i++) + { + user_stats_t *usr = &stats->usr[i]; + uint64_t *vals = is_ts ? usr->vals_ts : usr->vals_tv; + float val; + if ( usr->type==BCF_HT_REAL ) + { + if ( (nval=bcf_get_info_float(reader->header,reader->buffer[0],usr->tag,&usr->val,&usr->m_val))<=0 ) continue; + if ( usr->idx >= nval ) continue; + val = ((float*)usr->val)[usr->idx]; + } + else + { + if ( (nval=bcf_get_info_int32(reader->header,reader->buffer[0],usr->tag,&usr->val,&usr->m_val))<=0 ) continue; + if ( usr->idx >= nval ) continue; + val = ((int32_t*)usr->val)[usr->idx]; + } + int idx; + if ( val<=usr->min ) idx = 0; + else if ( val>=usr->max ) idx = usr->nbins - 1; + else idx = (val - usr->min)/(usr->max - usr->min) * (usr->nbins-1); + vals[idx]++; + } +} + +static void do_snp_stats(args_t *args, stats_t *stats, bcf_sr_t *reader) +{ + stats->n_snps++; + + bcf1_t *line = reader->buffer[0]; + int ref = bcf_acgt2int(*line->d.allele[0]); + if ( ref<0 ) return; + + #if QUAL_STATS + int iqual = (isnan(line->qual) || line->qual<0) ? 0 : 1 + (int)(line->qual*10); + #endif + + int i; + for (i=1; in_allele; i++) + { + if ( args->first_allele_only && i>1 ) break; + if ( !(bcf_get_variant_type(line,i)&VCF_SNP) ) continue; + int alt = bcf_acgt2int(*line->d.allele[i]); + if ( alt<0 || ref==alt ) continue; + stats->subst[ref<<2|alt]++; + int iaf = args->tmp_iaf[i]; + stats->af_snps[iaf]++; + if ( abs(ref-alt)==2 ) + { + if (i==1) + { + stats->ts_alt1++; + #if QUAL_STATS + dist_insert(stats->qual_ts,iqual); + #endif + do_user_stats(stats, reader, 1); + } + stats->af_ts[iaf]++; + } + else + { + if (i==1) + { + stats->tv_alt1++; + #if QUAL_STATS + dist_insert(stats->qual_tv,iqual); + #endif + do_user_stats(stats, reader, 0); + } + stats->af_tv[iaf]++; + } + } +} + +static inline void update_dvaf(stats_t *stats, bcf1_t *line, bcf_fmt_t *fmt, int ismpl, int ial, int jal) +{ + if ( !fmt ) return; + + float dvaf; + #define BRANCH_INT(type_t,missing,vector_end) { \ + type_t *p = (type_t *) (fmt->p + fmt->size*ismpl); \ + if ( p[ial]==vector_end || p[jal]==vector_end ) return; \ + if ( p[ial]==missing || p[jal]==missing ) return; \ + if ( !p[ial] && !p[jal] ) return; \ + dvaf = (float)p[ial]/(p[ial]+p[jal]); \ + } + switch (fmt->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_missing, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_missing, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_missing, bcf_int32_vector_end); break; + default: fprintf(bcftools_stderr, "[E::%s] todo: %d\n", __func__, fmt->type); bcftools_exit(1); break; + } + #undef BRANCH_INT + + int len = line->d.var[ial].n; + if ( len < -stats->m_indel ) len = -stats->m_indel; + else if ( len > stats->m_indel ) len = stats->m_indel; + int bin = stats->m_indel + len; + stats->nvaf[bin]++; + stats->dvaf[bin] += dvaf; +} + +static void do_sample_stats(args_t *args, stats_t *stats, bcf_sr_t *reader, int matched) +{ + bcf_srs_t *files = args->files; + bcf1_t *line = reader->buffer[0]; + bcf_fmt_t *fmt_ptr; + int nref_tot = 0, nhet_tot = 0, nalt_tot = 0; + int line_type = bcf_get_variant_types(line); + + if ( (fmt_ptr = bcf_get_fmt(reader->header,reader->buffer[0],"GT")) ) + { + bcf_fmt_t *ad_fmt_ptr = bcf_get_variant_types(line)&VCF_INDEL ? bcf_get_fmt(reader->header,reader->buffer[0],"AD") : NULL; + + int ref = bcf_acgt2int(*line->d.allele[0]); + int is, n_nref = 0, i_nref = 0; + for (is=0; isfiles->n_smpl; is++) + { + int ial, jal; + int gt = bcf_gt_type(fmt_ptr, reader->samples[is], &ial, &jal); + if ( gt==GT_UNKN ) + { + stats->smpl_missing[is]++; + continue; + } + if ( gt==GT_HAPL_R || gt==GT_HAPL_A ) + { + if ( line_type&VCF_INDEL && stats->smpl_frm_shifts ) + { + assert( ialn_allele ); + stats->smpl_frm_shifts[is*3 + args->tmp_frm[ial]]++; + } + if ( gt == GT_HAPL_R ) stats->smpl_hapRef[is]++; + if ( gt == GT_HAPL_A ) stats->smpl_hapAlt[is]++; + continue; + } + if ( gt != GT_HOM_RR ) { n_nref++; i_nref = is; } + #if HWE_STATS + switch (gt) + { + case GT_HOM_RR: nref_tot++; break; + case GT_HET_RA: nhet_tot++; break; + case GT_HET_AA: + case GT_HOM_AA: nalt_tot++; break; + } + #endif + int var_type = 0; + if ( ial>0 ) var_type |= bcf_get_variant_type(line,ial); + if ( jal>0 ) var_type |= bcf_get_variant_type(line,jal); + if ( var_type&VCF_SNP || var_type==VCF_REF ) // count ALT=. as SNP + { + if ( gt == GT_HET_RA ) stats->smpl_hets[is]++; + else if ( gt == GT_HET_AA ) stats->smpl_hets[is]++; + else if ( gt == GT_HOM_RR ) stats->smpl_homRR[is]++; + else if ( gt == GT_HOM_AA ) stats->smpl_homAA[is]++; + if ( gt != GT_HOM_RR && line->d.var[ial].type&VCF_SNP ) // this is safe, bcf_get_variant_types has been already called + { + int alt = bcf_acgt2int(*line->d.allele[ial]); + if ( alt<0 ) continue; + if ( abs(ref-alt)==2 ) + stats->smpl_ts[is]++; + else + stats->smpl_tv[is]++; + } + } + if ( var_type&VCF_INDEL ) + { + if ( gt != GT_HOM_RR ) + { + stats->smpl_indels[is]++; + + if ( gt==GT_HET_RA || gt==GT_HET_AA ) + { + int is_ins = 0, is_del = 0; + if ( bcf_get_variant_type(line,ial)&VCF_INDEL ) + { + if ( line->d.var[ial].n < 0 ) is_del = 1; + else is_ins = 1; + update_dvaf(stats,line,ad_fmt_ptr,is,ial,jal); + } + if ( bcf_get_variant_type(line,jal)&VCF_INDEL ) + { + if ( line->d.var[jal].n < 0 ) is_del = 1; + else is_ins = 1; + update_dvaf(stats,line,ad_fmt_ptr,is,jal,ial); + } + // Note that alt-het genotypes with both ins and del allele are counted twice!! + if ( is_del ) stats->smpl_del_hets[is]++; + if ( is_ins ) stats->smpl_ins_hets[is]++; + } + else if ( gt==GT_HOM_AA ) + { + if ( line->d.var[ial].n < 0 ) stats->smpl_del_homs[is]++; + else stats->smpl_ins_homs[is]++; + } + } + if ( stats->smpl_frm_shifts ) + { + assert( ialn_allele && jaln_allele ); + stats->smpl_frm_shifts[is*3 + args->tmp_frm[ial]]++; + stats->smpl_frm_shifts[is*3 + args->tmp_frm[jal]]++; + } + } + } + if ( n_nref==1 ) stats->smpl_sngl[i_nref]++; + } + + #if HWE_STATS + if ( nhet_tot + nref_tot + nalt_tot ) + { + float het_frac = (float)nhet_tot/(nhet_tot + nref_tot + nalt_tot); + int idx = het_frac*(args->naf_hwe - 1); +//check me: what is this? + if ( line->n_allele>1 ) idx += args->naf_hwe*args->tmp_iaf[1]; + stats->af_hwe[idx]++; + } + #endif + + if ( (fmt_ptr = bcf_get_fmt(reader->header,reader->buffer[0],"DP")) ) + { + #define BRANCH_INT(type_t,missing,vector_end) { \ + int is; \ + for (is=0; isfiles->n_smpl; is++) \ + { \ + type_t *p = (type_t *) (fmt_ptr->p + fmt_ptr->size*is); \ + if ( *p==vector_end ) continue; \ + if ( *p!=missing ) \ + { \ + (*idist(&stats->dp, *p))++; \ + stats->smpl_ndp[is]++; \ + stats->smpl_dp[is] += *p; \ + } \ + } \ + } + switch (fmt_ptr->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_missing, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_missing, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_missing, bcf_int32_vector_end); break; + default: fprintf(bcftools_stderr, "[E::%s] todo: %d\n", __func__, fmt_ptr->type); bcftools_exit(1); break; + } + #undef BRANCH_INT + } + else if ( (fmt_ptr = bcf_get_fmt(reader->header,reader->buffer[0],"AD")) ) + { + #define BRANCH_INT(type_t,missing,vector_end) { \ + int is,iv; \ + for (is=0; isfiles->n_smpl; is++) \ + { \ + type_t *p = (type_t *) (fmt_ptr->p + fmt_ptr->size*is); \ + int dp = 0, has_value = 0; \ + for (iv=0; ivn; iv++) \ + { \ + if ( p[iv]==vector_end ) break; \ + if ( p[iv]==missing ) continue; \ + has_value = 1; \ + dp += p[iv]; \ + } \ + if ( has_value ) \ + { \ + (*idist(&stats->dp, dp))++; \ + stats->smpl_ndp[is]++; \ + stats->smpl_dp[is] += dp; \ + } \ + } \ + } + switch (fmt_ptr->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_missing, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_missing, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_missing, bcf_int32_vector_end); break; + default: fprintf(bcftools_stderr, "[E::%s] todo: %d\n", __func__, fmt_ptr->type); bcftools_exit(1); break; + } + #undef BRANCH_INT + } + + if ( matched==3 ) + { + int is; + bcf_fmt_t *fmt0, *fmt1; + fmt0 = bcf_get_fmt(files->readers[0].header,files->readers[0].buffer[0],"GT"); if ( !fmt0 ) return; + fmt1 = bcf_get_fmt(files->readers[1].header,files->readers[1].buffer[0],"GT"); if ( !fmt1 ) return; + + // only the first ALT allele is considered + if (args->ntmp_iaf <= 1) return; // Do not consider invariate sites + int iaf = args->tmp_iaf[1]; + int line_type = bcf_get_variant_types(files->readers[0].buffer[0]); + gtcmp_t *af_stats = line_type&VCF_SNP ? args->af_gts_snps : args->af_gts_indels; + gtcmp_t *smpl_stats = line_type&VCF_SNP ? args->smpl_gts_snps : args->smpl_gts_indels; + + for (is=0; isn_smpl; is++) + { + // Simplified comparison: only 0/0, 0/1, 1/1 is looked at as the identity of + // actual alleles can be enforced by running without the -c option. + int gt0 = bcf_gt_type(fmt0, files->readers[0].samples[is], NULL, NULL); + int gt1 = bcf_gt_type(fmt1, files->readers[1].samples[is], NULL, NULL); + + int idx0 = type2stats[gt0]; + int idx1 = type2stats[gt1]; + af_stats[iaf].gt2gt[idx0][idx1]++; + smpl_stats[is].gt2gt[idx0][idx1]++; + + if ( gt0 == GT_UNKN || gt1 == GT_UNKN ) continue; + if ( type2ploidy[gt0]*type2ploidy[gt1] == -1 ) continue; // cannot compare diploid and haploid genotypes + + float y = type2dosage[gt0]; + float x = type2dosage[gt1]; + + smpl_stats[is].yx += y*x; + smpl_stats[is].x += x; + smpl_stats[is].xx += x*x; + smpl_stats[is].y += y; + smpl_stats[is].yy += y*y; + smpl_stats[is].n += 1; + + af_stats[iaf].yx += y*x; + af_stats[iaf].x += x; + af_stats[iaf].xx += x*x; + af_stats[iaf].y += y; + af_stats[iaf].yy += y*y; + af_stats[iaf].n += 1; + } + + if ( args->verbose_sites ) + { + int nm = 0, nmm = 0, nrefm = 0; + for (is=0; isn_smpl; is++) + { + int gt = bcf_gt_type(fmt0, files->readers[0].samples[is], NULL, NULL); + if ( gt == GT_UNKN ) continue; + int gt2 = bcf_gt_type(fmt1, files->readers[1].samples[is], NULL, NULL); + if ( gt2 == GT_UNKN ) continue; + if ( gt != gt2 ) + { + nmm++; + bcf_sr_t *reader = &files->readers[0]; + fprintf(bcftools_stdout, "DBG\t%s\t%"PRId64"\t%s\t%d\t%d\n",reader->header->id[BCF_DT_CTG][reader->buffer[0]->rid].key,(int64_t) reader->buffer[0]->pos+1,files->samples[is],gt,gt2); + } + else + { + if ( gt!=GT_HOM_RR ) nrefm++; + nm++; + } + } + float nrd = nrefm+nmm ? 100.*nmm/(nrefm+nmm) : 0; + fprintf(bcftools_stdout, "PSD\t%s\t%"PRId64"\t%d\t%d\t%f\n", reader->header->id[BCF_DT_CTG][reader->buffer[0]->rid].key,(int64_t) reader->buffer[0]->pos+1,nm,nmm,nrd); + } + } +} + +static void do_vcf_stats(args_t *args) +{ + bcf_srs_t *files = args->files; + assert( sizeof(int)>files->nreaders ); + while ( bcf_sr_next_line(files) ) + { + bcf_sr_t *reader = NULL; + bcf1_t *line = NULL; + int ret = 0, i, pass = 1; + for (i=0; inreaders; i++) + { + if ( !bcf_sr_has_line(files,i) ) continue; + if ( args->filter[i] ) + { + int is_ok = filter_test(args->filter[i], bcf_sr_get_line(files,i), NULL); + if ( args->filter_logic & FLT_EXCLUDE ) is_ok = is_ok ? 0 : 1; + if ( !is_ok ) { pass = 0; break; } + } + ret |= 1<readers[i]; + line = bcf_sr_get_line(files,i); + } + + } + if ( !pass ) continue; + + int line_type = bcf_get_variant_types(line); + init_iaf(args, reader); + + stats_t *stats = &args->stats[ret-1]; + if ( args->split_by_id && line->d.id[0]=='.' && !line->d.id[1] ) + stats = &args->stats[1]; + + stats->n_records++; + + if ( line_type==VCF_REF ) + stats->n_noalts++; + if ( line_type&VCF_SNP ) + do_snp_stats(args, stats, reader); + if ( line_type&VCF_INDEL ) + do_indel_stats(args, stats, reader); + if ( line_type&VCF_MNP ) + do_mnp_stats(args, stats, reader); + if ( line_type&VCF_OTHER ) + do_other_stats(args, stats, reader); + + if ( line->n_allele>2 ) + { + stats->n_mals++; + if ( line_type == VCF_SNP ) stats->n_snp_mals++; // note: this will be fooled by C>C,T + } + + if ( files->n_smpl ) + do_sample_stats(args, stats, reader, ret); + + if ( bcf_get_info_int32(reader->header,line,"DP",&args->tmp_iaf,&args->ntmp_iaf)==1 ) + (*idist(&stats->dp_sites, args->tmp_iaf[0]))++; + } +} + +static void print_header(args_t *args) +{ + int i; + fprintf(bcftools_stdout, "# This file was produced by bcftools stats (%s+htslib-%s) and can be plotted using plot-vcfstats.\n", bcftools_version(),hts_version()); + fprintf(bcftools_stdout, "# The command line was:\tbcftools %s ", args->argv[0]); + for (i=1; iargc; i++) + fprintf(bcftools_stdout, " %s",args->argv[i]); + fprintf(bcftools_stdout, "\n#\n"); + + fprintf(bcftools_stdout, "# Definition of sets:\n# ID\t[2]id\t[3]tab-separated file names\n"); + if ( args->files->nreaders==1 ) + { + const char *fname = strcmp("-",args->files->readers[0].fname) ? args->files->readers[0].fname : ""; + if ( args->split_by_id ) + { + fprintf(bcftools_stdout, "ID\t0\t%s:known (sites with ID different from \".\")\n", fname); + fprintf(bcftools_stdout, "ID\t1\t%s:novel (sites where ID column is \".\")\n", fname); + } + else + fprintf(bcftools_stdout, "ID\t0\t%s\n", fname); + } + else + { + const char *fname0 = strcmp("-",args->files->readers[0].fname) ? args->files->readers[0].fname : ""; + const char *fname1 = strcmp("-",args->files->readers[1].fname) ? args->files->readers[1].fname : ""; + fprintf(bcftools_stdout, "ID\t0\t%s\n", fname0); + fprintf(bcftools_stdout, "ID\t1\t%s\n", fname1); + fprintf(bcftools_stdout, "ID\t2\t%s\t%s\n", fname0,fname1); + + if ( args->verbose_sites ) + { + fprintf(bcftools_stdout, + "# Verbose per-site discordance output.\n" + "# PSD\t[2]CHROM\t[3]POS\t[4]Number of matches\t[5]Number of mismatches\t[6]NRD\n"); + fprintf(bcftools_stdout, + "# Verbose per-site and per-sample output. Genotype codes: %d:HomRefRef, %d:HomAltAlt, %d:HetAltRef, %d:HetAltAlt, %d:haploidRef, %d:haploidAlt\n" + "# DBG\t[2]CHROM\t[3]POS\t[4]Sample\t[5]GT in %s\t[6]GT in %s\n", + GT_HOM_RR, GT_HOM_AA, GT_HET_RA, GT_HET_AA, GT_HAPL_R, GT_HAPL_A, fname0,fname1); + } + } +} + +#define T2S(x) type2stats[x] +static void print_stats(args_t *args) +{ + int i, j,k, id; + fprintf(bcftools_stdout, "# SN, Summary numbers:\n"); + fprintf(bcftools_stdout, "# number of records .. number of data rows in the VCF\n"); + fprintf(bcftools_stdout, "# number of no-ALTs .. reference-only sites, ALT is either \".\" or identical to REF\n"); + fprintf(bcftools_stdout, "# number of SNPs .. number of rows with a SNP\n"); + fprintf(bcftools_stdout, "# number of MNPs .. number of rows with a MNP, such as CC>TT\n"); + fprintf(bcftools_stdout, "# number of indels .. number of rows with an indel\n"); + fprintf(bcftools_stdout, "# number of others .. number of rows with other type, for example a symbolic allele or\n"); + fprintf(bcftools_stdout, "# a complex substitution, such as ACT>TCGA\n"); + fprintf(bcftools_stdout, "# number of multiallelic sites .. number of rows with multiple alternate alleles\n"); + fprintf(bcftools_stdout, "# number of multiallelic SNP sites .. number of rows with multiple alternate alleles, all SNPs\n"); + fprintf(bcftools_stdout, "# \n"); + fprintf(bcftools_stdout, "# Note that rows containing multiple types will be counted multiple times, in each\n"); + fprintf(bcftools_stdout, "# counter. For example, a row with a SNP and an indel increments both the SNP and\n"); + fprintf(bcftools_stdout, "# the indel counter.\n"); + fprintf(bcftools_stdout, "# \n"); + fprintf(bcftools_stdout, "# SN\t[2]id\t[3]key\t[4]value\n"); + for (id=0; idfiles->nreaders; id++) + fprintf(bcftools_stdout, "SN\t%d\tnumber of samples:\t%d\n", id, bcf_hdr_nsamples(args->files->readers[id].header)); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + fprintf(bcftools_stdout, "SN\t%d\tnumber of records:\t%"PRIu64"\n", id, stats->n_records); + fprintf(bcftools_stdout, "SN\t%d\tnumber of no-ALTs:\t%"PRIu64"\n", id, stats->n_noalts); + fprintf(bcftools_stdout, "SN\t%d\tnumber of SNPs:\t%"PRIu64"\n", id, stats->n_snps); + fprintf(bcftools_stdout, "SN\t%d\tnumber of MNPs:\t%"PRIu64"\n", id, stats->n_mnps); + fprintf(bcftools_stdout, "SN\t%d\tnumber of indels:\t%"PRIu64"\n", id, stats->n_indels); + fprintf(bcftools_stdout, "SN\t%d\tnumber of others:\t%"PRIu64"\n", id, stats->n_others); + fprintf(bcftools_stdout, "SN\t%d\tnumber of multiallelic sites:\t%"PRIu64"\n", id, stats->n_mals); + fprintf(bcftools_stdout, "SN\t%d\tnumber of multiallelic SNP sites:\t%"PRIu64"\n", id, stats->n_snp_mals); + } + fprintf(bcftools_stdout, "# TSTV, transitions/transversions:\n# TSTV\t[2]id\t[3]ts\t[4]tv\t[5]ts/tv\t[6]ts (1st ALT)\t[7]tv (1st ALT)\t[8]ts/tv (1st ALT)\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + int ts=0,tv=0; + for (i=0; im_af; i++) { ts += stats->af_ts[i]; tv += stats->af_tv[i]; } + fprintf(bcftools_stdout, "TSTV\t%d\t%d\t%d\t%.2f\t%d\t%d\t%.2f\n", id,ts,tv,tv?(float)ts/tv:0, stats->ts_alt1,stats->tv_alt1,stats->tv_alt1?(float)stats->ts_alt1/stats->tv_alt1:0); + } + if ( args->exons_fname ) + { + fprintf(bcftools_stdout, "# FS, Indel frameshifts:\n# FS\t[2]id\t[3]in-frame\t[4]out-frame\t[5]not applicable\t[6]out/(in+out) ratio\t[7]in-frame (1st ALT)\t[8]out-frame (1st ALT)\t[9]not applicable (1st ALT)\t[10]out/(in+out) ratio (1st ALT)\n"); + for (id=0; idnstats; id++) + { + int in=args->stats[id].in_frame, out=args->stats[id].out_frame, na=args->stats[id].na_frame; + int in1=args->stats[id].in_frame_alt1, out1=args->stats[id].out_frame_alt1, na1=args->stats[id].na_frame_alt1; + fprintf(bcftools_stdout, "FS\t%d\t%d\t%d\t%d\t%.2f\t%d\t%d\t%d\t%.2f\n", id, in,out,na,out?(float)out/(in+out):0,in1,out1,na1,out1?(float)out1/(in1+out1):0); + } + } + if ( args->indel_ctx ) + { + fprintf(bcftools_stdout, "# ICS, Indel context summary:\n# ICS\t[2]id\t[3]repeat-consistent\t[4]repeat-inconsistent\t[5]not applicable\t[6]c/(c+i) ratio\n"); + for (id=0; idnstats; id++) + { + int nc = 0, ni = 0, na = args->stats[id].n_repeat_na; + for (i=0; istats[id].n_repeat[i][0] + args->stats[id].n_repeat[i][2]; + ni += args->stats[id].n_repeat[i][1] + args->stats[id].n_repeat[i][3]; + } + fprintf(bcftools_stdout, "ICS\t%d\t%d\t%d\t%d\t%.4f\n", id, nc,ni,na,nc+ni ? (float)nc/(nc+ni) : 0.0); + } + fprintf(bcftools_stdout, "# ICL, Indel context by length:\n# ICL\t[2]id\t[3]length of repeat element\t[4]repeat-consistent deletions)\t[5]repeat-inconsistent deletions\t[6]consistent insertions\t[7]inconsistent insertions\t[8]c/(c+i) ratio\n"); + for (id=0; idnstats; id++) + { + for (i=1; istats[id].n_repeat[i][0]+args->stats[id].n_repeat[i][2], ni = args->stats[id].n_repeat[i][1]+args->stats[id].n_repeat[i][3]; + fprintf(bcftools_stdout, "ICL\t%d\t%d\t%d\t%d\t%d\t%d\t%.4f\n", id, i+1, + args->stats[id].n_repeat[i][0],args->stats[id].n_repeat[i][1],args->stats[id].n_repeat[i][2],args->stats[id].n_repeat[i][3], + nc+ni ? (float)nc/(nc+ni) : 0.0); + } + } + } + fprintf(bcftools_stdout, "# SiS, Singleton stats:\n# SiS\t[2]id\t[3]allele count\t[4]number of SNPs\t[5]number of transitions\t[6]number of transversions\t[7]number of indels\t[8]repeat-consistent\t[9]repeat-inconsistent\t[10]not applicable\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + fprintf(bcftools_stdout, "SiS\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", id,1,stats->af_snps[0],stats->af_ts[0],stats->af_tv[0], + stats->af_repeats[0][0]+stats->af_repeats[1][0]+stats->af_repeats[2][0],stats->af_repeats[0][0],stats->af_repeats[1][0],stats->af_repeats[2][0]); + // put the singletons stats into the first AF bin, note that not all of the stats is transferred (i.e. nrd mismatches) + stats->af_snps[1] += stats->af_snps[0]; + stats->af_ts[1] += stats->af_ts[0]; + stats->af_tv[1] += stats->af_tv[0]; + stats->af_repeats[0][1] += stats->af_repeats[0][0]; + stats->af_repeats[1][1] += stats->af_repeats[1][0]; + stats->af_repeats[2][1] += stats->af_repeats[2][0]; + } + // move the singletons stats into the first AF bin, singleton stats was collected separately because of init_iaf + if ( args->af_gts_snps ) + { + args->af_gts_snps[1].y += args->af_gts_snps[0].y; + args->af_gts_snps[1].yy += args->af_gts_snps[0].yy; + args->af_gts_snps[1].xx += args->af_gts_snps[0].xx; + args->af_gts_snps[1].yx += args->af_gts_snps[0].yx; + args->af_gts_snps[1].n += args->af_gts_snps[0].n; + } + if ( args->af_gts_indels ) + { + args->af_gts_indels[1].y += args->af_gts_indels[0].y; + args->af_gts_indels[1].yy += args->af_gts_indels[0].yy; + args->af_gts_indels[1].xx += args->af_gts_indels[0].xx; + args->af_gts_indels[1].yx += args->af_gts_indels[0].yx; + args->af_gts_indels[1].n += args->af_gts_indels[0].n; + } + + fprintf(bcftools_stdout, "# AF, Stats by non-reference allele frequency:\n# AF\t[2]id\t[3]allele frequency\t[4]number of SNPs\t[5]number of transitions\t[6]number of transversions\t[7]number of indels\t[8]repeat-consistent\t[9]repeat-inconsistent\t[10]not applicable\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=1; im_af; i++) // note that af[1] now contains also af[0], see SiS stats output above + { + if ( stats->af_snps[i]+stats->af_ts[i]+stats->af_tv[i]+stats->af_repeats[0][i]+stats->af_repeats[1][i]+stats->af_repeats[2][i] == 0 ) continue; + double af = args->af_bins ? (bin_get_value(args->af_bins,i)+bin_get_value(args->af_bins,i-1))*0.5 : (double)(i-1)/(args->m_af-1); + fprintf(bcftools_stdout, "AF\t%d\t%f\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", id,af,stats->af_snps[i],stats->af_ts[i],stats->af_tv[i], + stats->af_repeats[0][i]+stats->af_repeats[1][i]+stats->af_repeats[2][i],stats->af_repeats[0][i],stats->af_repeats[1][i],stats->af_repeats[2][i]); + } + } + #if QUAL_STATS + fprintf(bcftools_stdout, "# QUAL, Stats by quality\n# QUAL\t[2]id\t[3]Quality\t[4]number of SNPs\t[5]number of transitions (1st ALT)\t[6]number of transversions (1st ALT)\t[7]number of indels\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + int ndist_ts = dist_nbins(stats->qual_ts); + int ndist_tv = dist_nbins(stats->qual_tv); + int ndist_in = dist_nbins(stats->qual_indels); + int ndist_max = ndist_ts; + if ( ndist_max < ndist_tv ) ndist_max = ndist_tv; + if ( ndist_max < ndist_in ) ndist_max = ndist_in; + uint32_t beg, end; + uint32_t nts, ntv, nin; + for (i=0; iqual_ts, i, &beg, &end); + qval = beg>0 ? 0.1*(beg - 1) : -1; + } + if ( i < ndist_tv ) + { + ntv = dist_get(stats->qual_tv, i, &beg, &end); + if ( qval==-1 ) qval = beg > 0 ? 0.1*(beg - 1) : -1; + } + if ( i < ndist_in ) + { + nin = dist_get(stats->qual_indels, i, &beg, &end); + if ( qval==-1 ) qval = beg > 0 ? 0.1*(beg - 1) : -1; + } + if ( nts+ntv+nin==0 ) continue; + + fprintf(bcftools_stdout, "QUAL\t%d\t",id); + if ( qval==-1 ) fprintf(bcftools_stdout, "."); + else fprintf(bcftools_stdout, "%.1f",qval); + fprintf(bcftools_stdout, "\t%d\t%d\t%d\t%d\n",nts+ntv,nts,ntv,nin); + } + } + #endif + for (i=0; inusr; i++) + { + fprintf(bcftools_stdout, "# USR:%s/%d\t[2]id\t[3]%s/%d\t[4]number of SNPs\t[5]number of transitions (1st ALT)\t[6]number of transversions (1st ALT)\n", + args->usr[i].tag,args->usr[i].idx,args->usr[i].tag,args->usr[i].idx); + for (id=0; idnstats; id++) + { + user_stats_t *usr = &args->stats[id].usr[i]; + int j; + for (j=0; jnbins; j++) + { + if ( usr->vals_ts[j]+usr->vals_tv[j] == 0 ) continue; // skip empty bins + float val = usr->min + (usr->max - usr->min)*j/(usr->nbins-1); + const char *fmt = usr->type==BCF_HT_REAL ? "USR:%s/%d\t%d\t%e\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n" : "USR:%s/%d\t%d\t%.0f\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n"; + fprintf(bcftools_stdout, fmt,usr->tag,usr->idx,id,val,usr->vals_ts[j]+usr->vals_tv[j],usr->vals_ts[j],usr->vals_tv[j]); + } + } + } + fprintf(bcftools_stdout, "# IDD, InDel distribution:\n# IDD\t[2]id\t[3]length (deletions negative)\t[4]number of sites\t[5]number of genotypes\t[6]mean VAF\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=stats->m_indel-1; i>=0; i--) + { + if ( !stats->deletions[i] ) continue; + // whops, differently organized arrow, dels are together with ins + int bin = stats->m_indel - i - 1; + fprintf(bcftools_stdout, "IDD\t%d\t%d\t%d\t", id,-i-1,stats->deletions[i]); + if ( stats->nvaf && stats->nvaf[bin] ) + fprintf(bcftools_stdout, "%u\t%.2f",stats->nvaf[bin],stats->dvaf[bin]/stats->nvaf[bin]); + else + fprintf(bcftools_stdout, "0\t."); + fprintf(bcftools_stdout, "\n"); + } + for (i=0; im_indel; i++) + { + if ( !stats->insertions[i] ) continue; + int bin = stats->m_indel + i + 1; + fprintf(bcftools_stdout, "IDD\t%d\t%d\t%d\t", id,i+1,stats->insertions[i]); + if ( stats->nvaf && stats->nvaf[bin] ) + fprintf(bcftools_stdout, "%u\t%.2f",stats->nvaf[bin],stats->dvaf[bin]/stats->nvaf[bin]); + else + fprintf(bcftools_stdout, "0\t."); + fprintf(bcftools_stdout, "\n"); + } + } + fprintf(bcftools_stdout, "# ST, Substitution types:\n# ST\t[2]id\t[3]type\t[4]count\n"); + for (id=0; idnstats; id++) + { + int t; + for (t=0; t<15; t++) + { + if ( t>>2 == (t&3) ) continue; + fprintf(bcftools_stdout, "ST\t%d\t%c>%c\t%d\n", id, bcf_int2acgt(t>>2),bcf_int2acgt(t&3),args->stats[id].subst[t]); + } + } + if ( args->files->nreaders>1 && args->files->n_smpl ) + { + fprintf(bcftools_stdout, "SN\t%d\tnumber of samples:\t%d\n", 2, args->files->n_smpl); + + int x; + for (x=0; x<2; x++) // x=0: snps, x=1: indels + { + gtcmp_t *stats; + if ( x==0 ) + { + fprintf(bcftools_stdout, "# GCsAF, Genotype concordance by non-reference allele frequency (SNPs)\n# GCsAF\t[2]id\t[3]allele frequency\t[4]RR Hom matches\t[5]RA Het matches\t[6]AA Hom matches\t[7]RR Hom mismatches\t[8]RA Het mismatches\t[9]AA Hom mismatches\t[10]dosage r-squared\t[11]number of genotypes\n"); + stats = args->af_gts_snps; + } + else + { + fprintf(bcftools_stdout, "# GCiAF, Genotype concordance by non-reference allele frequency (indels)\n# GCiAF\t[2]id\t[3]allele frequency\t[4]RR Hom matches\t[5]RA Het matches\t[6]AA Hom matches\t[7]RR Hom mismatches\t[8]RA Het mismatches\t[9]AA Hom mismatches\t[10]dosage r-squared\t[11]number of genotypes\n"); + stats = args->af_gts_indels; + } + uint64_t nrd_m[4] = {0,0,0,0}, nrd_mm[4] = {0,0,0,0}; // across all bins + for (i=0; im_af; i++) + { + int n = 0; + uint64_t m[4] = {0,0,0,0}, mm[4] = {0,0,0,0}; // in i-th AF bin + for (j=0; j<4; j++) // rr, ra, aa hom, aa het, ./. + for (k=0; k<4; k++) + { + n += stats[i].gt2gt[j][k]; + if ( j==k ) + { + nrd_m[j] += stats[i].gt2gt[j][k]; + m[j] += stats[i].gt2gt[j][k]; + } + else + { + nrd_mm[j] += stats[i].gt2gt[j][k]; + mm[j] += stats[i].gt2gt[j][k]; + } + } + if ( !i || !n ) continue; // skip singleton stats and empty bins + + // Pearson's r2 + double r2 = 0; + if ( stats[i].n ) + { + r2 = (stats[i].yx - stats[i].x*stats[i].y/stats[i].n); + r2 /= sqrt((stats[i].xx - stats[i].x*stats[i].x/stats[i].n) * (stats[i].yy - stats[i].y*stats[i].y/stats[i].n)); + r2 *= r2; + } + double af = args->af_bins ? (bin_get_value(args->af_bins,i)+bin_get_value(args->af_bins,i-1))*0.5 : (double)(i-1)/(args->m_af-1); + fprintf(bcftools_stdout, "GC%cAF\t2\t%f", x==0 ? 's' : 'i', af); + fprintf(bcftools_stdout, "\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"", m[T2S(GT_HOM_RR)],m[T2S(GT_HET_RA)],m[T2S(GT_HOM_AA)]); + fprintf(bcftools_stdout, "\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"", mm[T2S(GT_HOM_RR)],mm[T2S(GT_HET_RA)],mm[T2S(GT_HOM_AA)]); + if ( stats[i].n && !isnan(r2) ) fprintf(bcftools_stdout, "\t%f", r2); + else fprintf(bcftools_stdout, "\t"NA_STRING); + fprintf(bcftools_stdout, "\t%.0f\n", stats[i].n); + } + + if ( x==0 ) + { + fprintf(bcftools_stdout, "# NRD and discordance is calculated as follows:\n"); + fprintf(bcftools_stdout, "# m .. number of matches\n"); + fprintf(bcftools_stdout, "# x .. number of mismatches\n"); + fprintf(bcftools_stdout, "# NRD = 100 * (xRR + xRA + xAA) / (xRR + xRA + xAA + mRA + mAA)\n"); + fprintf(bcftools_stdout, "# RR discordance = 100 * xRR / (xRR + mRR)\n"); + fprintf(bcftools_stdout, "# RA discordance = 100 * xRA / (xRA + mRA)\n"); + fprintf(bcftools_stdout, "# AA discordance = 100 * xAA / (xAA + mAA)\n"); + fprintf(bcftools_stdout, "# Non-Reference Discordance (NRD), SNPs\n# NRDs\t[2]id\t[3]NRD\t[4]Ref/Ref discordance\t[5]Ref/Alt discordance\t[6]Alt/Alt discordance\n"); + } + else + fprintf(bcftools_stdout, "# Non-Reference Discordance (NRD), indels\n# NRDi\t[2]id\t[3]NRD\t[4]Ref/Ref discordance\t[5]Ref/Alt discordance\t[6]Alt/Alt discordance\n"); + uint64_t m = nrd_m[T2S(GT_HET_RA)] + nrd_m[T2S(GT_HOM_AA)] + nrd_m[T2S(GT_HET_AA)]; + uint64_t mm = nrd_mm[T2S(GT_HOM_RR)] + nrd_mm[T2S(GT_HET_RA)] + nrd_mm[T2S(GT_HOM_AA)] + nrd_mm[T2S(GT_HET_AA)]; + fprintf(bcftools_stdout, "NRD%c\t2\t%f\t%f\t%f\t%f\n", x==0 ? 's' : 'i', + m+mm ? mm*100.0/(m+mm) : 0, + nrd_m[T2S(GT_HOM_RR)]+nrd_mm[T2S(GT_HOM_RR)] ? nrd_mm[T2S(GT_HOM_RR)]*100.0/(nrd_m[T2S(GT_HOM_RR)]+nrd_mm[T2S(GT_HOM_RR)]) : 0, + nrd_m[T2S(GT_HET_RA)]+nrd_mm[T2S(GT_HET_RA)] ? nrd_mm[T2S(GT_HET_RA)]*100.0/(nrd_m[T2S(GT_HET_RA)]+nrd_mm[T2S(GT_HET_RA)]) : 0, + nrd_m[T2S(GT_HOM_AA)]+nrd_mm[T2S(GT_HOM_AA)] ? nrd_mm[T2S(GT_HOM_AA)]*100.0/(nrd_m[T2S(GT_HOM_AA)]+nrd_mm[T2S(GT_HOM_AA)]) : 0 + ); + } + + for (x=0; x<2; x++) // x=0: snps, x=1: indels + { + gtcmp_t *stats; + if ( x==0 ) + { + fprintf(bcftools_stdout, "# GCsS, Genotype concordance by sample (SNPs)\n# GCsS\t[2]id\t[3]sample\t[4]non-reference discordance rate\t[5]RR Hom matches\t[6]RA Het matches\t[7]AA Hom matches\t[8]RR Hom mismatches\t[9]RA Het mismatches\t[10]AA Hom mismatches\t[11]dosage r-squared\n"); + stats = args->smpl_gts_snps; + } + else + { + fprintf(bcftools_stdout, "# GCiS, Genotype concordance by sample (indels)\n# GCiS\t[2]id\t[3]sample\t[4]non-reference discordance rate\t[5]RR Hom matches\t[6]RA Het matches\t[7]AA Hom matches\t[8]RR Hom mismatches\t[9]RA Het mismatches\t[10]AA Hom mismatches\t[11]dosage r-squared\n"); + stats = args->smpl_gts_indels; + } + for (i=0; ifiles->n_smpl; i++) + { + uint64_t mm = 0, m = stats[i].gt2gt[T2S(GT_HET_RA)][T2S(GT_HET_RA)] + stats[i].gt2gt[T2S(GT_HOM_AA)][T2S(GT_HOM_AA)]; + for (j=0; j<3; j++) + for (k=0; k<3; k++) + if ( j!=k ) mm += stats[i].gt2gt[j][k]; + + // Pearson's r2 + double r2 = 0; + if ( stats[i].n ) + { + r2 = (stats[i].yx - stats[i].x*stats[i].y/stats[i].n); + r2 /= sqrt((stats[i].xx - stats[i].x*stats[i].x/stats[i].n) * (stats[i].yy - stats[i].y*stats[i].y/stats[i].n)); + r2 *= r2; + } + fprintf(bcftools_stdout, "GC%cS\t2\t%s\t%.3f", x==0 ? 's' : 'i', args->files->samples[i], m+mm ? mm*100.0/(m+mm) : 0); + fprintf(bcftools_stdout, "\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"", + stats[i].gt2gt[T2S(GT_HOM_RR)][T2S(GT_HOM_RR)], + stats[i].gt2gt[T2S(GT_HET_RA)][T2S(GT_HET_RA)], + stats[i].gt2gt[T2S(GT_HOM_AA)][T2S(GT_HOM_AA)]); + fprintf(bcftools_stdout, "\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"", + stats[i].gt2gt[T2S(GT_HOM_RR)][T2S(GT_HET_RA)] + stats[i].gt2gt[T2S(GT_HOM_RR)][T2S(GT_HOM_AA)], + stats[i].gt2gt[T2S(GT_HET_RA)][T2S(GT_HOM_RR)] + stats[i].gt2gt[T2S(GT_HET_RA)][T2S(GT_HOM_AA)], + stats[i].gt2gt[T2S(GT_HOM_AA)][T2S(GT_HOM_RR)] + stats[i].gt2gt[T2S(GT_HOM_AA)][T2S(GT_HET_RA)]); + if ( stats[i].n && !isnan(r2) ) fprintf(bcftools_stdout, "\t%f\n", r2); + else fprintf(bcftools_stdout, "\t"NA_STRING"\n"); + } + } + for (x=0; x<2; x++) // x=0: snps, x=1: indels + { + //printf("# GCiS, Genotype concordance by sample (indels)\n# GCiS\t[2]id\t[3]sample\t[4]non-reference discordance rate\t[5]RR Hom matches\t[6]RA Het matches\t[7]AA Hom matches\t[8]RR Hom mismatches\t[9]RA Het mismatches\t[10]AA Hom mismatches\t[11]dosage r-squared\n"); + + gtcmp_t *stats; + if ( x==0 ) + { + fprintf(bcftools_stdout, "# GCTs, Genotype concordance table (SNPs)\n# GCTs"); + stats = args->smpl_gts_snps; + } + else + { + fprintf(bcftools_stdout, "# GCTi, Genotype concordance table (indels)\n# GCTi"); + stats = args->smpl_gts_indels; + } + i = 1; + fprintf(bcftools_stdout, "\t[%d]sample", ++i); + fprintf(bcftools_stdout, "\t[%d]RR Hom -> RR Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]RR Hom -> RA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]RR Hom -> AA Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]RR Hom -> AA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]RR Hom -> missing", ++i); + fprintf(bcftools_stdout, "\t[%d]RA Het -> RR Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]RA Het -> RA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]RA Het -> AA Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]RA Het -> AA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]RA Het -> missing", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Hom -> RR Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Hom -> RA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Hom -> AA Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Hom -> AA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Hom -> missing", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Het -> RR Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Het -> RA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Het -> AA Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Het -> AA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]AA Het -> missing", ++i); + fprintf(bcftools_stdout, "\t[%d]missing -> RR Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]missing -> RA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]missing -> AA Hom", ++i); + fprintf(bcftools_stdout, "\t[%d]missing -> AA Het", ++i); + fprintf(bcftools_stdout, "\t[%d]missing -> missing\n", ++i); + + for (i=0; ifiles->n_smpl; i++) + { + fprintf(bcftools_stdout, "GCT%c\t%s", x==0 ? 's' : 'i', args->files->samples[i]); + for (j=0; j<5; j++) + for (k=0; k<5; k++) + fprintf(bcftools_stdout, "\t%"PRIu64, stats[i].gt2gt[j][k]); + fprintf(bcftools_stdout, "\n"); + } + } + } + + fprintf(bcftools_stdout, "# DP, Depth distribution\n# DP\t[2]id\t[3]bin\t[4]number of genotypes\t[5]fraction of genotypes (%%)\t[6]number of sites\t[7]fraction of sites (%%)\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + long unsigned int sum = 0, sum_sites = 0; + for (i=0; idp.m_vals; i++) { sum += stats->dp.vals[i]; sum_sites += stats->dp_sites.vals[i]; } + for (i=0; idp.m_vals; i++) + { + if ( stats->dp.vals[i]==0 && stats->dp_sites.vals[i]==0 ) continue; + fprintf(bcftools_stdout, "DP\t%d\t", id); + if ( i==0 ) fprintf(bcftools_stdout, "<%d", stats->dp.min); + else if ( i+1==stats->dp.m_vals ) fprintf(bcftools_stdout, ">%d", stats->dp.max); + else fprintf(bcftools_stdout, "%d", idist_i2bin(&stats->dp,i)); + fprintf(bcftools_stdout, "\t%"PRIu64"\t%f", stats->dp.vals[i], sum ? stats->dp.vals[i]*100./sum : 0); + fprintf(bcftools_stdout, "\t%"PRIu64"\t%f\n", stats->dp_sites.vals[i], sum_sites ? stats->dp_sites.vals[i]*100./sum_sites : 0); + } + } + + if ( args->files->n_smpl ) + { + fprintf(bcftools_stdout, "# PSC, Per-sample counts. Note that the ref/het/hom counts include only SNPs, for indels see PSI. The rest include both SNPs and indels.\n"); + fprintf(bcftools_stdout, "# PSC\t[2]id\t[3]sample\t[4]nRefHom\t[5]nNonRefHom\t[6]nHets\t[7]nTransitions\t[8]nTransversions\t[9]nIndels\t[10]average depth\t[11]nSingletons" + "\t[12]nHapRef\t[13]nHapAlt\t[14]nMissing\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=0; ifiles->n_smpl; i++) + { + float dp = stats->smpl_ndp[i] ? stats->smpl_dp[i]/(float)stats->smpl_ndp[i] : 0; + fprintf(bcftools_stdout, "PSC\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%.1f\t%d\t%d\t%d\t%d\n", id,args->files->samples[i], + stats->smpl_homRR[i], stats->smpl_homAA[i], stats->smpl_hets[i], stats->smpl_ts[i], + stats->smpl_tv[i], stats->smpl_indels[i],dp, stats->smpl_sngl[i], stats->smpl_hapRef[i], + stats->smpl_hapAlt[i], stats->smpl_missing[i]); + } + } + + fprintf(bcftools_stdout, "# PSI, Per-Sample Indels. Note that alt-het genotypes with both ins and del allele are counted twice, in both nInsHets and nDelHets.\n"); + fprintf(bcftools_stdout, "# PSI\t[2]id\t[3]sample\t[4]in-frame\t[5]out-frame\t[6]not applicable\t[7]out/(in+out) ratio\t[8]nInsHets\t[9]nDelHets\t[10]nInsAltHoms\t[11]nDelAltHoms\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=0; ifiles->n_smpl; i++) + { + int na = 0, in = 0, out = 0; + if ( args->exons ) + { + na = stats->smpl_frm_shifts[i*3 + 0]; + in = stats->smpl_frm_shifts[i*3 + 1]; + out = stats->smpl_frm_shifts[i*3 + 2]; + } + fprintf(bcftools_stdout, "PSI\t%d\t%s\t%d\t%d\t%d\t%.2f\t%d\t%d\t%d\t%d\n", id,args->files->samples[i], in,out,na,in+out?1.0*out/(in+out):0, + stats->smpl_ins_hets[i],stats->smpl_del_hets[i],stats->smpl_ins_homs[i],stats->smpl_del_homs[i]); + } + } + + #ifdef HWE_STATS + fprintf(bcftools_stdout, "# HWE\n# HWE\t[2]id\t[3]1st ALT allele frequency\t[4]Number of observations\t[5]25th percentile\t[6]median\t[7]75th percentile\n"); + for (id=0; idnstats; id++) + { + stats_t *stats = &args->stats[id]; + for (i=0; inaf_hwe; i++) stats->af_hwe[i+args->naf_hwe] += stats->af_hwe[i]; // singletons + for (i=1; im_af; i++) + { + unsigned int sum_tot = 0, sum_tmp = 0; + int j, *ptr = &stats->af_hwe[i*args->naf_hwe]; + for (j=0; jnaf_hwe; j++) sum_tot += ptr[j]; + if ( !sum_tot ) continue; + + double af = args->af_bins ? (bin_get_value(args->af_bins,i)+bin_get_value(args->af_bins,i-1))*0.5 : (double)(i-1)/(args->m_af-1); + + int nprn = 3; + fprintf(bcftools_stdout, "HWE\t%d\t%f\t%d",id,af,sum_tot); + for (j=0; jnaf_hwe; j++) + { + sum_tmp += ptr[j]; + float frac = (float)sum_tmp/sum_tot; + if ( frac >= 0.75 ) + { + while (nprn>0) { fprintf(bcftools_stdout, "\t%f", (float)j/args->naf_hwe); nprn--; } + break; + } + if ( frac >= 0.5 ) + { + while (nprn>1) { fprintf(bcftools_stdout, "\t%f", (float)j/args->naf_hwe); nprn--; } + continue; + } + if ( frac >= 0.25 ) + { + while (nprn>2) { fprintf(bcftools_stdout, "\t%f", (float)j/args->naf_hwe); nprn--; } + } + } + assert(nprn==0); + fprintf(bcftools_stdout, "\n"); + } + } + #endif + } +} + +static void usage(void) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: Parses VCF or BCF and produces stats which can be plotted using plot-vcfstats.\n"); + fprintf(bcftools_stderr, " When two files are given, the program generates separate stats for intersection\n"); + fprintf(bcftools_stderr, " and the complements. By default only sites are compared, -s/-S must given to include\n"); + fprintf(bcftools_stderr, " also sample columns.\n"); + fprintf(bcftools_stderr, "Usage: bcftools stats [options] []\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Options:\n"); + fprintf(bcftools_stderr, " --af-bins LIST Allele frequency bins, a list (0.1,0.5,1) or a file (0.1\\n0.5\\n1)\n"); + fprintf(bcftools_stderr, " --af-tag STRING Allele frequency tag to use, by default estimated from AN,AC or GT\n"); + fprintf(bcftools_stderr, " -1, --1st-allele-only Include only 1st allele at multiallelic sites\n"); + fprintf(bcftools_stderr, " -c, --collapse STRING Treat as identical records with , see man page for details [none]\n"); + fprintf(bcftools_stderr, " -d, --depth INT,INT,INT Depth distribution: min,max,bin size [0,500,1]\n"); + fprintf(bcftools_stderr, " -e, --exclude EXPR Exclude sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " -E, --exons FILE.gz Tab-delimited file with exons for indel frameshifts (chr,beg,end; 1-based, inclusive, bgzip compressed)\n"); + fprintf(bcftools_stderr, " -f, --apply-filters LIST Require at least one of the listed FILTER strings (e.g. \"PASS,.\")\n"); + fprintf(bcftools_stderr, " -F, --fasta-ref FILE Faidx indexed reference sequence file to determine INDEL context\n"); + fprintf(bcftools_stderr, " -i, --include EXPR Select sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " -I, --split-by-ID Collect stats for sites with ID separately (known vs novel)\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in a file\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -s, --samples LIST List of samples for sample stats, \"-\" to include all samples\n"); + fprintf(bcftools_stderr, " -S, --samples-file FILE File of samples to include\n"); + fprintf(bcftools_stderr, " -t, --targets REGION Similar to -r but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " -T, --targets-file FILE Similar to -R but streams rather than index-jumps\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, " -u, --user-tstv TAG[:min:max:n] Collect Ts/Tv stats for any tag using the given binning [0:1:100]\n"); + fprintf(bcftools_stderr, " A subfield can be selected as e.g. 'PV4[0]', here the first value of the PV4 tag\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with worker threads [0]\n"); + fprintf(bcftools_stderr, " -v, --verbose Produce verbose per-site and per-sample output\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfstats(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->files = bcf_sr_init(); + args->argc = argc; args->argv = argv; + args->dp_min = 0; args->dp_max = 500; args->dp_step = 1; + int regions_is_file = 0, targets_is_file = 0; + int regions_overlap = 1; + int targets_overlap = 0; + + static struct option loptions[] = + { + {"af-bins",1,0,1}, + {"af-tag",1,0,2}, + {"1st-allele-only",0,0,'1'}, + {"include",1,0,'i'}, + {"exclude",1,0,'e'}, + {"help",0,0,'h'}, + {"collapse",1,0,'c'}, + {"regions",1,0,'r'}, + {"regions-file",1,0,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"verbose",0,0,'v'}, + {"depth",1,0,'d'}, + {"apply-filters",1,0,'f'}, + {"exons",1,0,'E'}, + {"samples",1,0,'s'}, + {"samples-file",1,0,'S'}, + {"split-by-ID",0,0,'I'}, + {"targets",1,0,'t'}, + {"targets-file",1,0,'T'}, + {"targets-overlap",required_argument,NULL,4}, + {"fasta-ref",1,0,'F'}, + {"user-tstv",1,0,'u'}, + {"threads",1,0,9}, + {0,0,0,0} + }; + while ((c = getopt_long(argc, argv, "hc:r:R:e:s:S:d:i:t:T:F:f:1u:vIE:",loptions,NULL)) >= 0) { + switch (c) { + case 1 : args->af_bins_list = optarg; break; + case 2 : args->af_tag = optarg; break; + case 'u': add_user_stats(args,optarg); break; + case '1': args->first_allele_only = 1; break; + case 'F': args->ref_fname = optarg; break; + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'c': + if ( !strcmp(optarg,"snps") ) args->files->collapse |= COLLAPSE_SNPS; + else if ( !strcmp(optarg,"indels") ) args->files->collapse |= COLLAPSE_INDELS; + else if ( !strcmp(optarg,"both") ) args->files->collapse |= COLLAPSE_SNPS | COLLAPSE_INDELS; + else if ( !strcmp(optarg,"any") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"all") ) args->files->collapse |= COLLAPSE_ANY; + else if ( !strcmp(optarg,"some") ) args->files->collapse |= COLLAPSE_SOME; + else if ( !strcmp(optarg,"none") ) args->files->collapse = COLLAPSE_NONE; + else error("The --collapse string \"%s\" not recognised.\n", optarg); + break; + case 'v': args->verbose_sites = 1; break; + case 'd': + if ( sscanf(optarg,"%d,%d,%d",&args->dp_min,&args->dp_max,&args->dp_step)!=3 ) + error("Could not parse --depth %s\n", optarg); + if ( args->dp_min<0 || args->dp_min >= args->dp_max || args->dp_step > args->dp_max - args->dp_min + 1 ) + error("Is this a typo? --depth %s\n", optarg); + break; + case 'f': args->files->apply_filters = optarg; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + case 'E': args->exons_fname = optarg; break; + case 's': args->samples_list = optarg; break; + case 'S': args->samples_list = optarg; args->samples_is_file = 1; break; + case 'I': args->split_by_id = 1; break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 3 : + regions_overlap = parse_overlap_option(optarg); + if ( regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 4 : + targets_overlap = parse_overlap_option(optarg); + if ( targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 'h': + case '?': usage(); break; + default: error("Unknown argument: %s\n", optarg); + } + } + char *fname = NULL; + if ( optind==argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(); + } + else fname = argv[optind]; + + if ( argc-optind>2 ) usage(); + if ( argc-optind>1 ) + { + args->files->require_index = 1; + if ( args->split_by_id ) error("Only one file can be given with -i.\n"); + } + if ( !args->samples_list ) args->files->max_unpack = BCF_UN_INFO; + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + if ( args->regions_list) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + if ( args->n_threads && bcf_sr_set_threads(args->files, args->n_threads)<0) + error("Failed to create threads\n"); + + while (fname) + { + if ( !bcf_sr_add_reader(args->files, fname) ) + error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + fname = ++optind < argc ? argv[optind] : NULL; + } + + init_stats(args); + print_header(args); + do_vcf_stats(args); + print_stats(args); + destroy_stats(args); + bcf_sr_destroy(args->files); + free(args); + return 0; +} + diff --git a/bcftools/vcfview.c b/bcftools/vcfview.c new file mode 100644 index 0000000..cc02058 --- /dev/null +++ b/bcftools/vcfview.c @@ -0,0 +1,801 @@ +/* vcfview.c -- VCF/BCF conversion, view, subset and filter VCF/BCF files. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Shane McCarthy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "htslib/khash_str2int.h" + +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +#define ALLELE_NONREF 1 +#define ALLELE_MINOR 2 +#define ALLELE_ALT1 3 +#define ALLELE_MAJOR 4 +#define ALLELE_NONMAJOR 5 + +#define GT_NEED_HOM 1 +#define GT_NEED_HET 2 +#define GT_NO_HOM 3 +#define GT_NO_HET 4 +#define GT_NEED_MISSING 5 +#define GT_NO_MISSING 6 + +typedef struct _args_t +{ + filter_t *filter; + char *filter_str; + int filter_logic; // one of FLT_INCLUDE/FLT_EXCLUDE (-i or -e) + + bcf_srs_t *files; + bcf_hdr_t *hdr, *hnull, *hsub; // original header, sites-only header, subset header + char **argv, *format, *sample_names, *subset_fname, *targets_list, *regions_list; + int regions_overlap, targets_overlap; + int argc, clevel, n_threads, output_type, print_header, update_info, header_only, n_samples, *imap, calc_ac; + int trim_alts, sites_only, known, novel, min_alleles, max_alleles, private_vars, uncalled, phased; + int min_ac, min_ac_type, max_ac, max_ac_type, min_af_type, max_af_type, gt_type; + int *ac, mac; + float min_af, max_af; + char *fn_ref, *fn_out, **samples; + int sample_is_file, force_samples; + char *include_types, *exclude_types; + int include, exclude; + int record_cmd_line; + htsFile *out; +} +args_t; + +static void init_data(args_t *args) +{ + int i; + args->hdr = args->files->readers[0].header; + + if (args->calc_ac && args->update_info) + { + if (bcf_hdr_append(args->hdr,"##INFO=") < 0) + error_errno("[%s] Failed to add \"AC\" INFO header", __func__); + if (bcf_hdr_append(args->hdr,"##INFO=") < 0) + error_errno("[%s] Failed to add \"AN\" INFO header", __func__); + } + if (args->record_cmd_line) bcf_hdr_append_version(args->hdr, args->argc, args->argv, "bcftools_view"); + else if (bcf_hdr_sync(args->hdr) < 0) + error_errno("[%s] Failed to update header", __func__); + + // setup sample data + if (args->sample_names) + { + void *hdr_samples = khash_str2int_init(); + for (i=0; ihdr); i++) + khash_str2int_inc(hdr_samples, bcf_hdr_int2id(args->hdr,BCF_DT_SAMPLE,i)); + + void *exclude = (args->sample_names[0]=='^') ? khash_str2int_init() : NULL; + int nsmpl; + char **smpl = NULL; + args->samples = NULL; args->n_samples = 0; + smpl = hts_readlist(exclude ? &args->sample_names[1] : args->sample_names, args->sample_is_file, &nsmpl); + if ( !smpl ) + { + error("Could not read the list: \"%s\"\n", exclude ? &args->sample_names[1] : args->sample_names); + } + + if ( exclude ) + { + for (i=0; iforce_samples) { + fprintf(stderr, "Warn: exclude called for sample that does not exist in header: \"%s\"... skipping\n", smpl[i]); + } else { + error("Error: exclude called for sample that does not exist in header: \"%s\". Use \"--force-samples\" to ignore this error.\n", smpl[i]); + } + } + khash_str2int_inc(exclude, smpl[i]); + } + + for (i=0; ihdr); i++) + { + if ( exclude && khash_str2int_has_key(exclude,bcf_hdr_int2id(args->hdr,BCF_DT_SAMPLE,i)) ) continue; + args->samples = (char**) realloc(args->samples, (args->n_samples+1)*sizeof(const char*)); + args->samples[args->n_samples++] = strdup(bcf_hdr_int2id(args->hdr,BCF_DT_SAMPLE,i)); + } + khash_str2int_destroy(exclude); + } + else + { + for (i=0; iforce_samples) { + fprintf(stderr, "Warn: subset called for sample that does not exist in header: \"%s\"... skipping\n", smpl[i]); + continue; + } else { + error("Error: subset called for sample that does not exist in header: \"%s\". Use \"--force-samples\" to ignore this error.\n", smpl[i]); + } + } + args->samples = (char**) realloc(args->samples, (args->n_samples+1)*sizeof(const char*)); + args->samples[args->n_samples++] = strdup(smpl[i]); + } + } + for (i=0; in_samples == 0) { + fprintf(stderr, "Warn: subsetting has removed all samples\n"); + args->sites_only = 1; + } + } + + if (args->n_samples) + args->imap = (int*)malloc(args->n_samples * sizeof(int)); + + // determine variant types to include/exclude + if (args->include_types || args->exclude_types) { + if (args->include_types && args->exclude_types) { + fprintf(stderr, "Error: only supply one of --include-types, --exclude-types options\n"); + exit(1); + } + char **type_list = 0; + int m = 0, n = 0; + const char *q, *p; + for (q = p = args->include_types ? args->include_types : args->exclude_types;; ++p) { + if (*p == ',' || *p == 0) { + if (m == n) { + m = m? m<<1 : 16; + type_list = (char**)realloc(type_list, m * sizeof(char*)); + } + type_list[n] = (char*)calloc(p - q + 1, 1); + strncpy(type_list[n++], q, p - q); + q = p + 1; + if (*p == 0) break; + } + } + type_list = (char**)realloc(type_list, n * sizeof(char*)); + + if (args->include_types) { + args->include = 0; + for (i = 0; i < n; ++i) { + if (strcmp(type_list[i], "snps") == 0) args->include |= VCF_SNP<<1; + else if (strcmp(type_list[i], "indels") == 0) args->include |= VCF_INDEL<<1; + else if (strcmp(type_list[i], "mnps") == 0) args->include |= VCF_MNP<<1; + else if (strcmp(type_list[i], "other") == 0) args->include |= VCF_OTHER<<1; + else if (strcmp(type_list[i], "ref") == 0) args->include |= VCF_OTHER<<1; + else if (strcmp(type_list[i], "bnd") == 0) args->include |= VCF_BND<<1; + else { + fprintf(stderr, "[E::%s] unknown type\n", type_list[i]); + fprintf(stderr, "Accepted types are snps, indels, mnps, other\n"); + exit(1); + } + } + } + if (args->exclude_types) { + args->exclude = 0; + for (i = 0; i < n; ++i) { + if (strcmp(type_list[i], "snps") == 0) args->exclude |= VCF_SNP<<1; + else if (strcmp(type_list[i], "indels") == 0) args->exclude |= VCF_INDEL<<1; + else if (strcmp(type_list[i], "mnps") == 0) args->exclude |= VCF_MNP<<1; + else if (strcmp(type_list[i], "other") == 0) args->exclude |= VCF_OTHER<<1; + else if (strcmp(type_list[i], "ref") == 0) args->exclude |= VCF_OTHER<<1; + else if (strcmp(type_list[i], "bnd") == 0) args->exclude |= VCF_BND<<1; + else { + fprintf(stderr, "[E::%s] unknown type\n", type_list[i]); + fprintf(stderr, "Accepted types are snps, indels, mnps, other\n"); + exit(1); + } + } + } + for (i = 0; i < n; ++i) + free(type_list[i]); + free(type_list); + } + + char wmode[8]; + set_wmode(wmode,args->output_type,args->fn_out,args->clevel); + args->out = hts_open(args->fn_out ? args->fn_out : "-", wmode); + if ( !args->out ) error("%s: %s\n", args->fn_out,strerror(errno)); + if ( args->n_threads > 0) + hts_set_opt(args->out, HTS_OPT_THREAD_POOL, args->files->p); + + // headers: hdr=full header, hsub=subset header, hnull=sites only header + if (args->sites_only){ + args->hnull = bcf_hdr_subset(args->hdr, 0, 0, 0); + bcf_hdr_remove(args->hnull, BCF_HL_FMT, NULL); + } + if (args->n_samples > 0) + { + args->hsub = bcf_hdr_subset(args->hdr, args->n_samples, args->samples, args->imap); + if ( !args->hsub ) error("Error occurred while subsetting samples\n"); + if ( args->n_samples != bcf_hdr_nsamples(args->hsub) ) + { + int i; + for (i=0; in_samples; i++) + if ( args->imap[i]<0 ) error("Error: No such sample: \"%s\"\n", args->samples[i]); + } + } + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); +} + +static void destroy_data(args_t *args) +{ + int i; + if ( args->imap ) { + for (i = 0; i < args->n_samples; ++i) + free(args->samples[i]); + free(args->samples); + free(args->imap); + } + if (args->hnull) bcf_hdr_destroy(args->hnull); + if (args->hsub) bcf_hdr_destroy(args->hsub); + if ( args->filter ) + filter_destroy(args->filter); + free(args->ac); +} + +// true if all samples are phased. +// haploid genotypes are considered phased +// ./. => not phased, .|. => phased +int bcf_all_phased(const bcf_hdr_t *header, bcf1_t *line) +{ + bcf_unpack(line, BCF_UN_FMT); + bcf_fmt_t *fmt_ptr = bcf_get_fmt(header, line, "GT"); + int all_phased = 1; + if ( fmt_ptr ) + { + int i, isample; + for (isample=0; isamplen_sample; isample++) + { + int sample_phased = 0; + #define BRANCH_INT(type_t,vector_end) { \ + type_t *p = (type_t*) (fmt_ptr->p + isample*fmt_ptr->size); \ + for (i=0; in; i++) \ + { \ + if (fmt_ptr->n == 1 || (p[i] == vector_end && i == 1)) { sample_phased = 1; break; } /* haploid phased by definition */ \ + if ( p[i] == vector_end ) { break; }; /* smaller ploidy */ \ + if ( bcf_gt_is_missing(p[i]) ) continue; /* missing allele */ \ + if ((p[i])&1) { \ + sample_phased = 1; \ + break; \ + } \ + } \ + } + switch (fmt_ptr->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_vector_end); break; + default: fprintf(stderr, "[E::%s] todo: fmt_type %d\n", __func__, fmt_ptr->type); exit(1); break; + } + #undef BRANCH_INT + if (!sample_phased) { + all_phased = 0; + break; + } + } + } + return all_phased; +} + +int subset_vcf(args_t *args, bcf1_t *line) +{ + if ( args->min_alleles && line->n_allele < args->min_alleles ) return 0; // min alleles + if ( args->max_alleles && line->n_allele > args->max_alleles ) return 0; // max alleles + if (args->novel || args->known) + { + if ( args->novel && (line->d.id[0]!='.' || line->d.id[1]!=0) ) return 0; // skip sites which are known, ID != '.' + if ( args->known && line->d.id[0]=='.' && line->d.id[1]==0 ) return 0; // skip sites which are novel, ID == '.' + } + + if (args->include || args->exclude) + { + int line_type = bcf_get_variant_types(line); + if ( args->include && !((line_type<<1) & args->include) ) return 0; // include only given variant types + if ( args->exclude && (line_type<<1) & args->exclude ) return 0; // exclude given variant types + } + + if ( args->filter ) + { + int ret = filter_test(args->filter, line, NULL); + if ( args->filter_logic==FLT_INCLUDE ) { if ( !ret ) return 0; } + else if ( ret ) return 0; + } + + hts_expand(int, line->n_allele, args->mac, args->ac); + int i, an = 0, non_ref_ac = 0; + if (args->calc_ac) { + bcf_calc_ac(args->hdr, line, args->ac, BCF_UN_INFO|BCF_UN_FMT); // get original AC and AN values from INFO field if available, otherwise calculate + for (i=1; in_allele; i++) + non_ref_ac += args->ac[i]; + for (i=0; in_allele; i++) + an += args->ac[i]; + } + + int update_ac = args->calc_ac; + if (args->n_samples) + { + int non_ref_ac_sub = 0, *ac_sub = (int*) calloc(line->n_allele,sizeof(int)); + bcf_subset(args->hdr, line, args->n_samples, args->imap); + if ( args->calc_ac && !bcf_get_fmt(args->hdr,line,"GT") ) update_ac = 0; + if ( update_ac ) + { + bcf_calc_ac(args->hsub, line, ac_sub, BCF_UN_FMT); // recalculate AC and AN + an = 0; + for (i=0; in_allele; i++) { + args->ac[i] = ac_sub[i]; + an += ac_sub[i]; + } + for (i=1; in_allele; i++) + non_ref_ac_sub += ac_sub[i]; + if (args->private_vars) { + if (args->private_vars == FLT_INCLUDE && !(non_ref_ac_sub > 0 && non_ref_ac == non_ref_ac_sub)) { free(ac_sub); return 0; } // select private sites + if (args->private_vars == FLT_EXCLUDE && non_ref_ac_sub > 0 && non_ref_ac == non_ref_ac_sub) { free(ac_sub); return 0; } // exclude private sites + } + non_ref_ac = non_ref_ac_sub; + } + free(ac_sub); + } + + bcf_fmt_t *gt_fmt; + if ( args->gt_type && (gt_fmt=bcf_get_fmt(args->hdr,line,"GT")) ) + { + int nhet = 0, nhom = 0, nmiss = 0; + for (i=0; ihdr); i++) + { + int type = bcf_gt_type(gt_fmt,i,NULL,NULL); + if ( type==GT_HET_RA || type==GT_HET_AA ) + { + if ( args->gt_type==GT_NO_HET ) return 0; + nhet = 1; + } + else if ( type==GT_UNKN ) + { + if ( args->gt_type==GT_NO_MISSING ) return 0; + nmiss = 1; + } + else + { + if ( args->gt_type==GT_NO_HOM ) return 0; + nhom = 1; + } + } + if ( args->gt_type==GT_NEED_HOM && !nhom ) return 0; + else if ( args->gt_type==GT_NEED_HET && !nhet ) return 0; + else if ( args->gt_type==GT_NEED_MISSING && !nmiss ) return 0; + } + + int minor_ac = 0; + int major_ac = 0; + if ( args->calc_ac ) + { + minor_ac = args->ac[0]; + major_ac = args->ac[0]; + for (i=1; in_allele; i++){ + if (args->ac[i] < minor_ac) { minor_ac = args->ac[i]; } + if (args->ac[i] > major_ac) { major_ac = args->ac[i]; } + } + } + + if (args->min_ac!=-1) + { + if (args->min_ac_type == ALLELE_NONREF && args->min_ac>non_ref_ac) return 0; // min AC + else if (args->min_ac_type == ALLELE_MINOR && args->min_ac>minor_ac) return 0; // min minor AC + else if (args->min_ac_type == ALLELE_ALT1 && args->min_ac>args->ac[1]) return 0; // min 1st alternate AC + else if (args->min_ac_type == ALLELE_MAJOR && args->min_ac > major_ac) return 0; // min major AC + else if (args->min_ac_type == ALLELE_NONMAJOR && args->min_ac > an-major_ac) return 0; // min non-major AC + } + if (args->max_ac!=-1) + { + if (args->max_ac_type == ALLELE_NONREF && args->max_acmax_ac_type == ALLELE_MINOR && args->max_acmax_ac_type == ALLELE_ALT1 && args->max_acac[1]) return 0; // max 1st alternate AC + else if (args->max_ac_type == ALLELE_MAJOR && args->max_ac < major_ac) return 0; // max major AC + else if (args->max_ac_type == ALLELE_NONMAJOR && args->max_ac < an-major_ac) return 0; // max non-major AC + } + if (args->min_af!=-1) + { + if (an == 0) return 0; // freq not defined, skip site + if (args->min_af_type == ALLELE_NONREF && args->min_af>non_ref_ac/(double)an) return 0; // min AF + else if (args->min_af_type == ALLELE_MINOR && args->min_af>minor_ac/(double)an) return 0; // min minor AF + else if (args->min_af_type == ALLELE_ALT1 && args->min_af>args->ac[1]/(double)an) return 0; // min 1st alternate AF + else if (args->min_af_type == ALLELE_MAJOR && args->min_af > major_ac/(double)an) return 0; // min major AF + else if (args->min_af_type == ALLELE_NONMAJOR && args->min_af > (an-major_ac)/(double)an) return 0; // min non-major AF + } + if (args->max_af!=-1) + { + if (an == 0) return 0; // freq not defined, skip site + if (args->max_af_type == ALLELE_NONREF && args->max_afmax_af_type == ALLELE_MINOR && args->max_afmax_af_type == ALLELE_ALT1 && args->max_afac[1]/(double)an) return 0; // max 1st alternate AF + else if (args->max_af_type == ALLELE_MAJOR && args->max_af < major_ac/(double)an) return 0; // max major AF + else if (args->max_af_type == ALLELE_NONMAJOR && args->max_af < (an-major_ac)/(double)an) return 0; // max non-major AF + } + if (args->uncalled) { + if (args->uncalled == FLT_INCLUDE && an > 0) return 0; // select uncalled + if (args->uncalled == FLT_EXCLUDE && an == 0) return 0; // skip if uncalled + } + if (update_ac && args->update_info) { + bcf_update_info_int32(args->hdr, line, "AC", &args->ac[1], line->n_allele-1); + bcf_update_info_int32(args->hdr, line, "AN", &an, 1); + } + if (args->trim_alts) + { + int ret = bcf_trim_alleles(args->hsub ? args->hsub : args->hdr, line); + if ( ret<0 ) error("Error: Could not trim alleles at %s:%"PRId64"\n", bcf_seqname(args->hsub ? args->hsub : args->hdr, line), (int64_t) line->pos+1); + } + if (args->phased) { + int phased = bcf_all_phased(args->hdr, line); + if (args->phased == FLT_INCLUDE && !phased) { return 0; } // skip unphased + if (args->phased == FLT_EXCLUDE && phased) { return 0; } // skip phased + } + if (args->sites_only) bcf_subset(args->hsub ? args->hsub : args->hdr, line, 0, 0); + return 1; +} + +void set_allele_type (int *atype, char *atype_string) +{ + *atype = ALLELE_NONREF; + if (strcmp(atype_string, "minor") == 0) { + *atype = ALLELE_MINOR; + } + else if (strcmp(atype_string, "alt1") == 0) { + *atype = ALLELE_ALT1; + } + else if (strcmp(atype_string, "nref") == 0) { + *atype = ALLELE_NONREF; + } + else if (strcmp(atype_string, "major") == 0) { + *atype = ALLELE_MAJOR; + } + else if (strcmp(atype_string, "nonmajor") == 0) { + *atype = ALLELE_NONMAJOR; + } + else { + error("Error: allele type not recognised. Expected one of nref|alt1|minor|major|nonmajor, got \"%s\".\n", atype_string); + } +} + +static void usage(args_t *args) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: VCF/BCF conversion, view, subset and filter VCF/BCF files.\n"); + fprintf(stderr, "Usage: bcftools view [options] [region1 [...]]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Output options:\n"); + fprintf(stderr, " -G, --drop-genotypes Drop individual genotype information (after subsetting if -s option set)\n"); + fprintf(stderr, " -h, --header-only Print only the header in VCF output (equivalent to bcftools head)\n"); + fprintf(stderr, " -H, --no-header Suppress the header in VCF output\n"); + fprintf(stderr, " --with-header Print both header and records in VCF output [default]\n"); + fprintf(stderr, " -l, --compression-level [0-9] Compression level: 0 uncompressed, 1 best speed, 9 best compression [%d]\n", args->clevel); + fprintf(stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(stderr, " -o, --output FILE Output file name [stdout]\n"); + fprintf(stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(stderr, " -R, --regions-file FILE Restrict to regions listed in FILE\n"); + fprintf(stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(stderr, " -t, --targets [^]REGION Similar to -r but streams rather than index-jumps. Exclude regions with \"^\" prefix\n"); + fprintf(stderr, " -T, --targets-file [^]FILE Similar to -R but streams rather than index-jumps. Exclude regions with \"^\" prefix\n"); + fprintf(stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(stderr, " --threads INT Use multithreading with INT worker threads [0]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Subset options:\n"); + fprintf(stderr, " -a, --trim-alt-alleles Trim ALT alleles not seen in the genotype fields (or their subset with -s/-S)\n"); + fprintf(stderr, " -I, --no-update Do not (re)calculate INFO fields for the subset (currently INFO/AC and INFO/AN)\n"); + fprintf(stderr, " -s, --samples [^]LIST Comma separated list of samples to include (or exclude with \"^\" prefix)\n"); + fprintf(stderr, " -S, --samples-file [^]FILE File of samples to include (or exclude with \"^\" prefix)\n"); + fprintf(stderr, " --force-samples Only warn about unknown subset samples\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Filter options:\n"); + fprintf(stderr, " -c/C, --min-ac/--max-ac INT[:TYPE] Minimum/maximum count for non-reference (nref), 1st alternate (alt1), least frequent\n"); + fprintf(stderr, " (minor), most frequent (major) or sum of all but most frequent (nonmajor) alleles [nref]\n"); + fprintf(stderr, " -f, --apply-filters LIST Require at least one of the listed FILTER strings (e.g. \"PASS,.\")\n"); + fprintf(stderr, " -g, --genotype [^]hom|het|miss Require one or more hom/het/missing genotype or, if prefixed with \"^\", exclude such sites\n"); + fprintf(stderr, " -i/e, --include/--exclude EXPR Select/exclude sites for which the expression is true (see man page for details)\n"); + fprintf(stderr, " -k/n, --known/--novel Select known/novel sites only (ID is not/is '.')\n"); + fprintf(stderr, " -m/M, --min-alleles/--max-alleles INT Minimum/maximum number of alleles listed in REF and ALT (e.g. -m2 -M2 for biallelic sites)\n"); + fprintf(stderr, " -p/P, --phased/--exclude-phased Select/exclude sites where all samples are phased\n"); + fprintf(stderr, " -q/Q, --min-af/--max-af FLOAT[:TYPE] Minimum/maximum frequency for non-reference (nref), 1st alternate (alt1), least frequent\n"); + fprintf(stderr, " (minor), most frequent (major) or sum of all but most frequent (nonmajor) alleles [nref]\n"); + fprintf(stderr, " -u/U, --uncalled/--exclude-uncalled Select/exclude sites without a called genotype\n"); + fprintf(stderr, " -v/V, --types/--exclude-types LIST Select/exclude comma-separated list of variant types: snps,indels,mnps,ref,bnd,other [null]\n"); + fprintf(stderr, " -x/X, --private/--exclude-private Select/exclude sites where the non-reference alleles are exclusive (private) to the subset samples\n"); + fprintf(stderr, "\n"); + exit(1); +} + +int main_vcfview(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->clevel = -1; + args->print_header = 1; + args->update_info = 1; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->min_ac = args->max_ac = args->min_af = args->max_af = -1; + args->regions_overlap = 1; + args->targets_overlap = 0; + int targets_is_file = 0, regions_is_file = 0; + + static struct option loptions[] = + { + {"genotype",required_argument,NULL,'g'}, + {"compression-level",required_argument,NULL,'l'}, + {"threads",required_argument,NULL,9}, + {"header-only",no_argument,NULL,'h'}, + {"no-header",no_argument,NULL,'H'}, + {"with-header",no_argument,NULL,4}, + {"exclude",required_argument,NULL,'e'}, + {"include",required_argument,NULL,'i'}, + {"trim-alt-alleles",no_argument,NULL,'a'}, + {"no-update",no_argument,NULL,'I'}, + {"drop-genotypes",no_argument,NULL,'G'}, + {"private",no_argument,NULL,'x'}, + {"exclude-private",no_argument,NULL,'X'}, + {"uncalled",no_argument,NULL,'u'}, + {"exclude-uncalled",no_argument,NULL,'U'}, + {"apply-filters",required_argument,NULL,'f'}, + {"known",no_argument,NULL,'k'}, + {"novel",no_argument,NULL,'n'}, + {"min-alleles",required_argument,NULL,'m'}, + {"max-alleles",required_argument,NULL,'M'}, + {"samples",required_argument,NULL,'s'}, + {"samples-file",required_argument,NULL,'S'}, + {"force-samples",no_argument,NULL,1}, + {"output-type",required_argument,NULL,'O'}, + {"output-file",required_argument,NULL,'o'}, + {"output",required_argument,NULL,'o'}, + {"types",required_argument,NULL,'v'}, + {"exclude-types",required_argument,NULL,'V'}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,2}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"min-ac",required_argument,NULL,'c'}, + {"max-ac",required_argument,NULL,'C'}, + {"min-af",required_argument,NULL,'q'}, + {"max-af",required_argument,NULL,'Q'}, + {"phased",no_argument,NULL,'p'}, + {"exclude-phased",no_argument,NULL,'P'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "l:t:T:r:R:o:O:s:S:Gf:knv:V:m:M:auUhHc:C:Ii:e:xXpPq:Q:g:",loptions,NULL)) >= 0) + { + char allele_type[9] = "nref"; + switch (c) + { + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'l': + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --compression-level %s\n", optarg); + args->output_type |= FT_GZ; + break; + case 'o': args->fn_out = optarg; break; + case 'H': args->print_header = 0; break; + case 'h': args->header_only = 1; break; + case 4 : args->print_header = 1; args->header_only = 0; break; + + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + + case 's': args->sample_names = optarg; break; + case 'S': args->sample_names = optarg; args->sample_is_file = 1; break; + case 1 : args->force_samples = 1; break; + case 'a': args->trim_alts = 1; args->calc_ac = 1; break; + case 'I': args->update_info = 0; break; + case 'G': args->sites_only = 1; break; + + case 'f': args->files->apply_filters = optarg; break; + case 'k': args->known = 1; break; + case 'n': args->novel = 1; break; + case 'm': + args->min_alleles = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --min-alleles %s\n", optarg); + break; + case 'M': + args->max_alleles = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --max-alleles %s\n", optarg); + break; + case 'v': args->include_types = optarg; break; + case 'V': args->exclude_types = optarg; break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'c': + { + args->min_ac_type = ALLELE_NONREF; + if ( sscanf(optarg,"%d:%8s",&args->min_ac, allele_type)!=2 && sscanf(optarg,"%d",&args->min_ac)!=1 ) + error("Error: Could not parse --min-ac %s\n", optarg); + set_allele_type(&args->min_ac_type, allele_type); + args->calc_ac = 1; + break; + } + case 'C': + { + args->max_ac_type = ALLELE_NONREF; + if ( sscanf(optarg,"%d:%8s",&args->max_ac, allele_type)!=2 && sscanf(optarg,"%d",&args->max_ac)!=1 ) + error("Error: Could not parse --max-ac %s\n", optarg); + set_allele_type(&args->max_ac_type, allele_type); + args->calc_ac = 1; + break; + } + case 'q': + { + args->min_af_type = ALLELE_NONREF; + if ( sscanf(optarg,"%f:%8s",&args->min_af, allele_type)!=2 && sscanf(optarg,"%f",&args->min_af)!=1 ) + error("Error: Could not parse --min-af %s\n", optarg); + set_allele_type(&args->min_af_type, allele_type); + args->calc_ac = 1; + break; + } + case 'Q': + { + args->max_af_type = ALLELE_NONREF; + if ( sscanf(optarg,"%f:%8s",&args->max_af, allele_type)!=2 && sscanf(optarg,"%f",&args->max_af)!=1 ) + error("Error: Could not parse --max-af %s\n", optarg); + set_allele_type(&args->max_af_type, allele_type); + args->calc_ac = 1; + break; + } + + case 'x': args->private_vars |= FLT_INCLUDE; args->calc_ac = 1; break; + case 'X': args->private_vars |= FLT_EXCLUDE; args->calc_ac = 1; break; + case 'u': args->uncalled |= FLT_INCLUDE; args->calc_ac = 1; break; + case 'U': args->uncalled |= FLT_EXCLUDE; args->calc_ac = 1; break; + case 'p': args->phased |= FLT_INCLUDE; break; // phased + case 'P': args->phased |= FLT_EXCLUDE; break; // exclude-phased + case 'g': + { + if ( !strcasecmp(optarg,"hom") ) args->gt_type = GT_NEED_HOM; + else if ( !strcasecmp(optarg,"het") ) args->gt_type = GT_NEED_HET; + else if ( !strcasecmp(optarg,"miss") ) args->gt_type = GT_NEED_MISSING; + else if ( !strcasecmp(optarg,"^hom") ) args->gt_type = GT_NO_HOM; + else if ( !strcasecmp(optarg,"^het") ) args->gt_type = GT_NO_HET; + else if ( !strcasecmp(optarg,"^miss") ) args->gt_type = GT_NO_MISSING; + else error("The argument to -g not recognised. Expected one of hom/het/miss/^hom/^het/^miss, got \"%s\".\n", optarg); + break; + } + case 2 : + args->targets_overlap = parse_overlap_option(optarg); + if ( args->targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 3 : + args->regions_overlap = parse_overlap_option(optarg); + if ( args->regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( args->filter_logic == (FLT_EXCLUDE|FLT_INCLUDE) ) error("Only one of -i or -e can be given.\n"); + if ( args->private_vars > FLT_EXCLUDE ) error("Only one of -x or -X can be given.\n"); + if ( args->uncalled > FLT_EXCLUDE ) error("Only one of -u or -U can be given.\n"); + if ( args->phased > FLT_EXCLUDE ) error("Only one of -p or -P can be given.\n"); + + if ( args->sample_names && args->update_info) args->calc_ac = 1; + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(args); + } + else fname = argv[optind]; + + // read in the regions from the command line + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + else if ( optind+1 < argc ) + { + int i; + kstring_t tmp = {0,0,0}; + kputs(argv[optind+1],&tmp); + for (i=optind+2; ifiles, tmp.s, 0)<0 ) + error("Failed to read the regions: %s\n", tmp.s); + free(tmp.s); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,args->targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + bcf_hdr_t *out_hdr = args->hnull ? args->hnull : (args->hsub ? args->hsub : args->hdr); + if (args->print_header) + { + if ( bcf_hdr_write(args->out, out_hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->fn_out); + } + else if ( args->output_type & FT_BCF ) + error("BCF output requires header, cannot proceed with -H\n"); + + int ret = 0; + if (!args->header_only) + { + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = args->files->readers[0].buffer[0]; + if ( line->errcode && out_hdr!=args->hdr ) error("Undefined tags in the header, cannot proceed in the sample subset mode.\n"); + if ( subset_vcf(args, line) && bcf_write1(args->out, out_hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->fn_out); + } + ret = args->files->errnum; + if ( ret ) fprintf(stderr,"Error: %s\n", bcf_sr_strerror(args->files->errnum)); + } + hts_close(args->out); + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return ret; +} diff --git a/bcftools/vcfview.c.pysam.c b/bcftools/vcfview.c.pysam.c new file mode 100644 index 0000000..4bbbefb --- /dev/null +++ b/bcftools/vcfview.c.pysam.c @@ -0,0 +1,803 @@ +#include "bcftools.pysam.h" + +/* vcfview.c -- VCF/BCF conversion, view, subset and filter VCF/BCF files. + + Copyright (C) 2013-2021 Genome Research Ltd. + + Author: Shane McCarthy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "filter.h" +#include "htslib/khash_str2int.h" + +#define FLT_INCLUDE 1 +#define FLT_EXCLUDE 2 + +#define ALLELE_NONREF 1 +#define ALLELE_MINOR 2 +#define ALLELE_ALT1 3 +#define ALLELE_MAJOR 4 +#define ALLELE_NONMAJOR 5 + +#define GT_NEED_HOM 1 +#define GT_NEED_HET 2 +#define GT_NO_HOM 3 +#define GT_NO_HET 4 +#define GT_NEED_MISSING 5 +#define GT_NO_MISSING 6 + +typedef struct _args_t +{ + filter_t *filter; + char *filter_str; + int filter_logic; // one of FLT_INCLUDE/FLT_EXCLUDE (-i or -e) + + bcf_srs_t *files; + bcf_hdr_t *hdr, *hnull, *hsub; // original header, sites-only header, subset header + char **argv, *format, *sample_names, *subset_fname, *targets_list, *regions_list; + int regions_overlap, targets_overlap; + int argc, clevel, n_threads, output_type, print_header, update_info, header_only, n_samples, *imap, calc_ac; + int trim_alts, sites_only, known, novel, min_alleles, max_alleles, private_vars, uncalled, phased; + int min_ac, min_ac_type, max_ac, max_ac_type, min_af_type, max_af_type, gt_type; + int *ac, mac; + float min_af, max_af; + char *fn_ref, *fn_out, **samples; + int sample_is_file, force_samples; + char *include_types, *exclude_types; + int include, exclude; + int record_cmd_line; + htsFile *out; +} +args_t; + +static void init_data(args_t *args) +{ + int i; + args->hdr = args->files->readers[0].header; + + if (args->calc_ac && args->update_info) + { + if (bcf_hdr_append(args->hdr,"##INFO=") < 0) + error_errno("[%s] Failed to add \"AC\" INFO header", __func__); + if (bcf_hdr_append(args->hdr,"##INFO=") < 0) + error_errno("[%s] Failed to add \"AN\" INFO header", __func__); + } + if (args->record_cmd_line) bcf_hdr_append_version(args->hdr, args->argc, args->argv, "bcftools_view"); + else if (bcf_hdr_sync(args->hdr) < 0) + error_errno("[%s] Failed to update header", __func__); + + // setup sample data + if (args->sample_names) + { + void *hdr_samples = khash_str2int_init(); + for (i=0; ihdr); i++) + khash_str2int_inc(hdr_samples, bcf_hdr_int2id(args->hdr,BCF_DT_SAMPLE,i)); + + void *exclude = (args->sample_names[0]=='^') ? khash_str2int_init() : NULL; + int nsmpl; + char **smpl = NULL; + args->samples = NULL; args->n_samples = 0; + smpl = hts_readlist(exclude ? &args->sample_names[1] : args->sample_names, args->sample_is_file, &nsmpl); + if ( !smpl ) + { + error("Could not read the list: \"%s\"\n", exclude ? &args->sample_names[1] : args->sample_names); + } + + if ( exclude ) + { + for (i=0; iforce_samples) { + fprintf(bcftools_stderr, "Warn: exclude called for sample that does not exist in header: \"%s\"... skipping\n", smpl[i]); + } else { + error("Error: exclude called for sample that does not exist in header: \"%s\". Use \"--force-samples\" to ignore this error.\n", smpl[i]); + } + } + khash_str2int_inc(exclude, smpl[i]); + } + + for (i=0; ihdr); i++) + { + if ( exclude && khash_str2int_has_key(exclude,bcf_hdr_int2id(args->hdr,BCF_DT_SAMPLE,i)) ) continue; + args->samples = (char**) realloc(args->samples, (args->n_samples+1)*sizeof(const char*)); + args->samples[args->n_samples++] = strdup(bcf_hdr_int2id(args->hdr,BCF_DT_SAMPLE,i)); + } + khash_str2int_destroy(exclude); + } + else + { + for (i=0; iforce_samples) { + fprintf(bcftools_stderr, "Warn: subset called for sample that does not exist in header: \"%s\"... skipping\n", smpl[i]); + continue; + } else { + error("Error: subset called for sample that does not exist in header: \"%s\". Use \"--force-samples\" to ignore this error.\n", smpl[i]); + } + } + args->samples = (char**) realloc(args->samples, (args->n_samples+1)*sizeof(const char*)); + args->samples[args->n_samples++] = strdup(smpl[i]); + } + } + for (i=0; in_samples == 0) { + fprintf(bcftools_stderr, "Warn: subsetting has removed all samples\n"); + args->sites_only = 1; + } + } + + if (args->n_samples) + args->imap = (int*)malloc(args->n_samples * sizeof(int)); + + // determine variant types to include/exclude + if (args->include_types || args->exclude_types) { + if (args->include_types && args->exclude_types) { + fprintf(bcftools_stderr, "Error: only supply one of --include-types, --exclude-types options\n"); + bcftools_exit(1); + } + char **type_list = 0; + int m = 0, n = 0; + const char *q, *p; + for (q = p = args->include_types ? args->include_types : args->exclude_types;; ++p) { + if (*p == ',' || *p == 0) { + if (m == n) { + m = m? m<<1 : 16; + type_list = (char**)realloc(type_list, m * sizeof(char*)); + } + type_list[n] = (char*)calloc(p - q + 1, 1); + strncpy(type_list[n++], q, p - q); + q = p + 1; + if (*p == 0) break; + } + } + type_list = (char**)realloc(type_list, n * sizeof(char*)); + + if (args->include_types) { + args->include = 0; + for (i = 0; i < n; ++i) { + if (strcmp(type_list[i], "snps") == 0) args->include |= VCF_SNP<<1; + else if (strcmp(type_list[i], "indels") == 0) args->include |= VCF_INDEL<<1; + else if (strcmp(type_list[i], "mnps") == 0) args->include |= VCF_MNP<<1; + else if (strcmp(type_list[i], "other") == 0) args->include |= VCF_OTHER<<1; + else if (strcmp(type_list[i], "ref") == 0) args->include |= VCF_OTHER<<1; + else if (strcmp(type_list[i], "bnd") == 0) args->include |= VCF_BND<<1; + else { + fprintf(bcftools_stderr, "[E::%s] unknown type\n", type_list[i]); + fprintf(bcftools_stderr, "Accepted types are snps, indels, mnps, other\n"); + bcftools_exit(1); + } + } + } + if (args->exclude_types) { + args->exclude = 0; + for (i = 0; i < n; ++i) { + if (strcmp(type_list[i], "snps") == 0) args->exclude |= VCF_SNP<<1; + else if (strcmp(type_list[i], "indels") == 0) args->exclude |= VCF_INDEL<<1; + else if (strcmp(type_list[i], "mnps") == 0) args->exclude |= VCF_MNP<<1; + else if (strcmp(type_list[i], "other") == 0) args->exclude |= VCF_OTHER<<1; + else if (strcmp(type_list[i], "ref") == 0) args->exclude |= VCF_OTHER<<1; + else if (strcmp(type_list[i], "bnd") == 0) args->exclude |= VCF_BND<<1; + else { + fprintf(bcftools_stderr, "[E::%s] unknown type\n", type_list[i]); + fprintf(bcftools_stderr, "Accepted types are snps, indels, mnps, other\n"); + bcftools_exit(1); + } + } + } + for (i = 0; i < n; ++i) + free(type_list[i]); + free(type_list); + } + + char wmode[8]; + set_wmode(wmode,args->output_type,args->fn_out,args->clevel); + args->out = hts_open(args->fn_out ? args->fn_out : "-", wmode); + if ( !args->out ) error("%s: %s\n", args->fn_out,strerror(errno)); + if ( args->n_threads > 0) + hts_set_opt(args->out, HTS_OPT_THREAD_POOL, args->files->p); + + // headers: hdr=full header, hsub=subset header, hnull=sites only header + if (args->sites_only){ + args->hnull = bcf_hdr_subset(args->hdr, 0, 0, 0); + bcf_hdr_remove(args->hnull, BCF_HL_FMT, NULL); + } + if (args->n_samples > 0) + { + args->hsub = bcf_hdr_subset(args->hdr, args->n_samples, args->samples, args->imap); + if ( !args->hsub ) error("Error occurred while subsetting samples\n"); + if ( args->n_samples != bcf_hdr_nsamples(args->hsub) ) + { + int i; + for (i=0; in_samples; i++) + if ( args->imap[i]<0 ) error("Error: No such sample: \"%s\"\n", args->samples[i]); + } + } + + if ( args->filter_str ) + args->filter = filter_init(args->hdr, args->filter_str); +} + +static void destroy_data(args_t *args) +{ + int i; + if ( args->imap ) { + for (i = 0; i < args->n_samples; ++i) + free(args->samples[i]); + free(args->samples); + free(args->imap); + } + if (args->hnull) bcf_hdr_destroy(args->hnull); + if (args->hsub) bcf_hdr_destroy(args->hsub); + if ( args->filter ) + filter_destroy(args->filter); + free(args->ac); +} + +// true if all samples are phased. +// haploid genotypes are considered phased +// ./. => not phased, .|. => phased +int bcf_all_phased(const bcf_hdr_t *header, bcf1_t *line) +{ + bcf_unpack(line, BCF_UN_FMT); + bcf_fmt_t *fmt_ptr = bcf_get_fmt(header, line, "GT"); + int all_phased = 1; + if ( fmt_ptr ) + { + int i, isample; + for (isample=0; isamplen_sample; isample++) + { + int sample_phased = 0; + #define BRANCH_INT(type_t,vector_end) { \ + type_t *p = (type_t*) (fmt_ptr->p + isample*fmt_ptr->size); \ + for (i=0; in; i++) \ + { \ + if (fmt_ptr->n == 1 || (p[i] == vector_end && i == 1)) { sample_phased = 1; break; } /* haploid phased by definition */ \ + if ( p[i] == vector_end ) { break; }; /* smaller ploidy */ \ + if ( bcf_gt_is_missing(p[i]) ) continue; /* missing allele */ \ + if ((p[i])&1) { \ + sample_phased = 1; \ + break; \ + } \ + } \ + } + switch (fmt_ptr->type) { + case BCF_BT_INT8: BRANCH_INT(int8_t, bcf_int8_vector_end); break; + case BCF_BT_INT16: BRANCH_INT(int16_t, bcf_int16_vector_end); break; + case BCF_BT_INT32: BRANCH_INT(int32_t, bcf_int32_vector_end); break; + default: fprintf(bcftools_stderr, "[E::%s] todo: fmt_type %d\n", __func__, fmt_ptr->type); bcftools_exit(1); break; + } + #undef BRANCH_INT + if (!sample_phased) { + all_phased = 0; + break; + } + } + } + return all_phased; +} + +int subset_vcf(args_t *args, bcf1_t *line) +{ + if ( args->min_alleles && line->n_allele < args->min_alleles ) return 0; // min alleles + if ( args->max_alleles && line->n_allele > args->max_alleles ) return 0; // max alleles + if (args->novel || args->known) + { + if ( args->novel && (line->d.id[0]!='.' || line->d.id[1]!=0) ) return 0; // skip sites which are known, ID != '.' + if ( args->known && line->d.id[0]=='.' && line->d.id[1]==0 ) return 0; // skip sites which are novel, ID == '.' + } + + if (args->include || args->exclude) + { + int line_type = bcf_get_variant_types(line); + if ( args->include && !((line_type<<1) & args->include) ) return 0; // include only given variant types + if ( args->exclude && (line_type<<1) & args->exclude ) return 0; // exclude given variant types + } + + if ( args->filter ) + { + int ret = filter_test(args->filter, line, NULL); + if ( args->filter_logic==FLT_INCLUDE ) { if ( !ret ) return 0; } + else if ( ret ) return 0; + } + + hts_expand(int, line->n_allele, args->mac, args->ac); + int i, an = 0, non_ref_ac = 0; + if (args->calc_ac) { + bcf_calc_ac(args->hdr, line, args->ac, BCF_UN_INFO|BCF_UN_FMT); // get original AC and AN values from INFO field if available, otherwise calculate + for (i=1; in_allele; i++) + non_ref_ac += args->ac[i]; + for (i=0; in_allele; i++) + an += args->ac[i]; + } + + int update_ac = args->calc_ac; + if (args->n_samples) + { + int non_ref_ac_sub = 0, *ac_sub = (int*) calloc(line->n_allele,sizeof(int)); + bcf_subset(args->hdr, line, args->n_samples, args->imap); + if ( args->calc_ac && !bcf_get_fmt(args->hdr,line,"GT") ) update_ac = 0; + if ( update_ac ) + { + bcf_calc_ac(args->hsub, line, ac_sub, BCF_UN_FMT); // recalculate AC and AN + an = 0; + for (i=0; in_allele; i++) { + args->ac[i] = ac_sub[i]; + an += ac_sub[i]; + } + for (i=1; in_allele; i++) + non_ref_ac_sub += ac_sub[i]; + if (args->private_vars) { + if (args->private_vars == FLT_INCLUDE && !(non_ref_ac_sub > 0 && non_ref_ac == non_ref_ac_sub)) { free(ac_sub); return 0; } // select private sites + if (args->private_vars == FLT_EXCLUDE && non_ref_ac_sub > 0 && non_ref_ac == non_ref_ac_sub) { free(ac_sub); return 0; } // exclude private sites + } + non_ref_ac = non_ref_ac_sub; + } + free(ac_sub); + } + + bcf_fmt_t *gt_fmt; + if ( args->gt_type && (gt_fmt=bcf_get_fmt(args->hdr,line,"GT")) ) + { + int nhet = 0, nhom = 0, nmiss = 0; + for (i=0; ihdr); i++) + { + int type = bcf_gt_type(gt_fmt,i,NULL,NULL); + if ( type==GT_HET_RA || type==GT_HET_AA ) + { + if ( args->gt_type==GT_NO_HET ) return 0; + nhet = 1; + } + else if ( type==GT_UNKN ) + { + if ( args->gt_type==GT_NO_MISSING ) return 0; + nmiss = 1; + } + else + { + if ( args->gt_type==GT_NO_HOM ) return 0; + nhom = 1; + } + } + if ( args->gt_type==GT_NEED_HOM && !nhom ) return 0; + else if ( args->gt_type==GT_NEED_HET && !nhet ) return 0; + else if ( args->gt_type==GT_NEED_MISSING && !nmiss ) return 0; + } + + int minor_ac = 0; + int major_ac = 0; + if ( args->calc_ac ) + { + minor_ac = args->ac[0]; + major_ac = args->ac[0]; + for (i=1; in_allele; i++){ + if (args->ac[i] < minor_ac) { minor_ac = args->ac[i]; } + if (args->ac[i] > major_ac) { major_ac = args->ac[i]; } + } + } + + if (args->min_ac!=-1) + { + if (args->min_ac_type == ALLELE_NONREF && args->min_ac>non_ref_ac) return 0; // min AC + else if (args->min_ac_type == ALLELE_MINOR && args->min_ac>minor_ac) return 0; // min minor AC + else if (args->min_ac_type == ALLELE_ALT1 && args->min_ac>args->ac[1]) return 0; // min 1st alternate AC + else if (args->min_ac_type == ALLELE_MAJOR && args->min_ac > major_ac) return 0; // min major AC + else if (args->min_ac_type == ALLELE_NONMAJOR && args->min_ac > an-major_ac) return 0; // min non-major AC + } + if (args->max_ac!=-1) + { + if (args->max_ac_type == ALLELE_NONREF && args->max_acmax_ac_type == ALLELE_MINOR && args->max_acmax_ac_type == ALLELE_ALT1 && args->max_acac[1]) return 0; // max 1st alternate AC + else if (args->max_ac_type == ALLELE_MAJOR && args->max_ac < major_ac) return 0; // max major AC + else if (args->max_ac_type == ALLELE_NONMAJOR && args->max_ac < an-major_ac) return 0; // max non-major AC + } + if (args->min_af!=-1) + { + if (an == 0) return 0; // freq not defined, skip site + if (args->min_af_type == ALLELE_NONREF && args->min_af>non_ref_ac/(double)an) return 0; // min AF + else if (args->min_af_type == ALLELE_MINOR && args->min_af>minor_ac/(double)an) return 0; // min minor AF + else if (args->min_af_type == ALLELE_ALT1 && args->min_af>args->ac[1]/(double)an) return 0; // min 1st alternate AF + else if (args->min_af_type == ALLELE_MAJOR && args->min_af > major_ac/(double)an) return 0; // min major AF + else if (args->min_af_type == ALLELE_NONMAJOR && args->min_af > (an-major_ac)/(double)an) return 0; // min non-major AF + } + if (args->max_af!=-1) + { + if (an == 0) return 0; // freq not defined, skip site + if (args->max_af_type == ALLELE_NONREF && args->max_afmax_af_type == ALLELE_MINOR && args->max_afmax_af_type == ALLELE_ALT1 && args->max_afac[1]/(double)an) return 0; // max 1st alternate AF + else if (args->max_af_type == ALLELE_MAJOR && args->max_af < major_ac/(double)an) return 0; // max major AF + else if (args->max_af_type == ALLELE_NONMAJOR && args->max_af < (an-major_ac)/(double)an) return 0; // max non-major AF + } + if (args->uncalled) { + if (args->uncalled == FLT_INCLUDE && an > 0) return 0; // select uncalled + if (args->uncalled == FLT_EXCLUDE && an == 0) return 0; // skip if uncalled + } + if (update_ac && args->update_info) { + bcf_update_info_int32(args->hdr, line, "AC", &args->ac[1], line->n_allele-1); + bcf_update_info_int32(args->hdr, line, "AN", &an, 1); + } + if (args->trim_alts) + { + int ret = bcf_trim_alleles(args->hsub ? args->hsub : args->hdr, line); + if ( ret<0 ) error("Error: Could not trim alleles at %s:%"PRId64"\n", bcf_seqname(args->hsub ? args->hsub : args->hdr, line), (int64_t) line->pos+1); + } + if (args->phased) { + int phased = bcf_all_phased(args->hdr, line); + if (args->phased == FLT_INCLUDE && !phased) { return 0; } // skip unphased + if (args->phased == FLT_EXCLUDE && phased) { return 0; } // skip phased + } + if (args->sites_only) bcf_subset(args->hsub ? args->hsub : args->hdr, line, 0, 0); + return 1; +} + +void set_allele_type (int *atype, char *atype_string) +{ + *atype = ALLELE_NONREF; + if (strcmp(atype_string, "minor") == 0) { + *atype = ALLELE_MINOR; + } + else if (strcmp(atype_string, "alt1") == 0) { + *atype = ALLELE_ALT1; + } + else if (strcmp(atype_string, "nref") == 0) { + *atype = ALLELE_NONREF; + } + else if (strcmp(atype_string, "major") == 0) { + *atype = ALLELE_MAJOR; + } + else if (strcmp(atype_string, "nonmajor") == 0) { + *atype = ALLELE_NONMAJOR; + } + else { + error("Error: allele type not recognised. Expected one of nref|alt1|minor|major|nonmajor, got \"%s\".\n", atype_string); + } +} + +static void usage(args_t *args) +{ + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "About: VCF/BCF conversion, view, subset and filter VCF/BCF files.\n"); + fprintf(bcftools_stderr, "Usage: bcftools view [options] [region1 [...]]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Output options:\n"); + fprintf(bcftools_stderr, " -G, --drop-genotypes Drop individual genotype information (after subsetting if -s option set)\n"); + fprintf(bcftools_stderr, " -h, --header-only Print only the header in VCF output (equivalent to bcftools head)\n"); + fprintf(bcftools_stderr, " -H, --no-header Suppress the header in VCF output\n"); + fprintf(bcftools_stderr, " --with-header Print both header and records in VCF output [default]\n"); + fprintf(bcftools_stderr, " -l, --compression-level [0-9] Compression level: 0 uncompressed, 1 best speed, 9 best compression [%d]\n", args->clevel); + fprintf(bcftools_stderr, " --no-version Do not append version and command line to the header\n"); + fprintf(bcftools_stderr, " -o, --output FILE Output file name [bcftools_stdout]\n"); + fprintf(bcftools_stderr, " -O, --output-type u|b|v|z[0-9] u/b: un/compressed BCF, v/z: un/compressed VCF, 0-9: compression level [v]\n"); + fprintf(bcftools_stderr, " -r, --regions REGION Restrict to comma-separated list of regions\n"); + fprintf(bcftools_stderr, " -R, --regions-file FILE Restrict to regions listed in FILE\n"); + fprintf(bcftools_stderr, " --regions-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [1]\n"); + fprintf(bcftools_stderr, " -t, --targets [^]REGION Similar to -r but streams rather than index-jumps. Exclude regions with \"^\" prefix\n"); + fprintf(bcftools_stderr, " -T, --targets-file [^]FILE Similar to -R but streams rather than index-jumps. Exclude regions with \"^\" prefix\n"); + fprintf(bcftools_stderr, " --targets-overlap 0|1|2 Include if POS in the region (0), record overlaps (1), variant overlaps (2) [0]\n"); + fprintf(bcftools_stderr, " --threads INT Use multithreading with INT worker threads [0]\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Subset options:\n"); + fprintf(bcftools_stderr, " -a, --trim-alt-alleles Trim ALT alleles not seen in the genotype fields (or their subset with -s/-S)\n"); + fprintf(bcftools_stderr, " -I, --no-update Do not (re)calculate INFO fields for the subset (currently INFO/AC and INFO/AN)\n"); + fprintf(bcftools_stderr, " -s, --samples [^]LIST Comma separated list of samples to include (or exclude with \"^\" prefix)\n"); + fprintf(bcftools_stderr, " -S, --samples-file [^]FILE File of samples to include (or exclude with \"^\" prefix)\n"); + fprintf(bcftools_stderr, " --force-samples Only warn about unknown subset samples\n"); + fprintf(bcftools_stderr, "\n"); + fprintf(bcftools_stderr, "Filter options:\n"); + fprintf(bcftools_stderr, " -c/C, --min-ac/--max-ac INT[:TYPE] Minimum/maximum count for non-reference (nref), 1st alternate (alt1), least frequent\n"); + fprintf(bcftools_stderr, " (minor), most frequent (major) or sum of all but most frequent (nonmajor) alleles [nref]\n"); + fprintf(bcftools_stderr, " -f, --apply-filters LIST Require at least one of the listed FILTER strings (e.g. \"PASS,.\")\n"); + fprintf(bcftools_stderr, " -g, --genotype [^]hom|het|miss Require one or more hom/het/missing genotype or, if prefixed with \"^\", exclude such sites\n"); + fprintf(bcftools_stderr, " -i/e, --include/--exclude EXPR Select/exclude sites for which the expression is true (see man page for details)\n"); + fprintf(bcftools_stderr, " -k/n, --known/--novel Select known/novel sites only (ID is not/is '.')\n"); + fprintf(bcftools_stderr, " -m/M, --min-alleles/--max-alleles INT Minimum/maximum number of alleles listed in REF and ALT (e.g. -m2 -M2 for biallelic sites)\n"); + fprintf(bcftools_stderr, " -p/P, --phased/--exclude-phased Select/exclude sites where all samples are phased\n"); + fprintf(bcftools_stderr, " -q/Q, --min-af/--max-af FLOAT[:TYPE] Minimum/maximum frequency for non-reference (nref), 1st alternate (alt1), least frequent\n"); + fprintf(bcftools_stderr, " (minor), most frequent (major) or sum of all but most frequent (nonmajor) alleles [nref]\n"); + fprintf(bcftools_stderr, " -u/U, --uncalled/--exclude-uncalled Select/exclude sites without a called genotype\n"); + fprintf(bcftools_stderr, " -v/V, --types/--exclude-types LIST Select/exclude comma-separated list of variant types: snps,indels,mnps,ref,bnd,other [null]\n"); + fprintf(bcftools_stderr, " -x/X, --private/--exclude-private Select/exclude sites where the non-reference alleles are exclusive (private) to the subset samples\n"); + fprintf(bcftools_stderr, "\n"); + bcftools_exit(1); +} + +int main_vcfview(int argc, char *argv[]) +{ + int c; + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->argc = argc; args->argv = argv; + args->files = bcf_sr_init(); + args->clevel = -1; + args->print_header = 1; + args->update_info = 1; + args->output_type = FT_VCF; + args->n_threads = 0; + args->record_cmd_line = 1; + args->min_ac = args->max_ac = args->min_af = args->max_af = -1; + args->regions_overlap = 1; + args->targets_overlap = 0; + int targets_is_file = 0, regions_is_file = 0; + + static struct option loptions[] = + { + {"genotype",required_argument,NULL,'g'}, + {"compression-level",required_argument,NULL,'l'}, + {"threads",required_argument,NULL,9}, + {"header-only",no_argument,NULL,'h'}, + {"no-header",no_argument,NULL,'H'}, + {"with-header",no_argument,NULL,4}, + {"exclude",required_argument,NULL,'e'}, + {"include",required_argument,NULL,'i'}, + {"trim-alt-alleles",no_argument,NULL,'a'}, + {"no-update",no_argument,NULL,'I'}, + {"drop-genotypes",no_argument,NULL,'G'}, + {"private",no_argument,NULL,'x'}, + {"exclude-private",no_argument,NULL,'X'}, + {"uncalled",no_argument,NULL,'u'}, + {"exclude-uncalled",no_argument,NULL,'U'}, + {"apply-filters",required_argument,NULL,'f'}, + {"known",no_argument,NULL,'k'}, + {"novel",no_argument,NULL,'n'}, + {"min-alleles",required_argument,NULL,'m'}, + {"max-alleles",required_argument,NULL,'M'}, + {"samples",required_argument,NULL,'s'}, + {"samples-file",required_argument,NULL,'S'}, + {"force-samples",no_argument,NULL,1}, + {"output-type",required_argument,NULL,'O'}, + {"output-file",required_argument,NULL,'o'}, + {"output",required_argument,NULL,'o'}, + {"types",required_argument,NULL,'v'}, + {"exclude-types",required_argument,NULL,'V'}, + {"targets",required_argument,NULL,'t'}, + {"targets-file",required_argument,NULL,'T'}, + {"targets-overlap",required_argument,NULL,2}, + {"regions",required_argument,NULL,'r'}, + {"regions-file",required_argument,NULL,'R'}, + {"regions-overlap",required_argument,NULL,3}, + {"min-ac",required_argument,NULL,'c'}, + {"max-ac",required_argument,NULL,'C'}, + {"min-af",required_argument,NULL,'q'}, + {"max-af",required_argument,NULL,'Q'}, + {"phased",no_argument,NULL,'p'}, + {"exclude-phased",no_argument,NULL,'P'}, + {"no-version",no_argument,NULL,8}, + {NULL,0,NULL,0} + }; + char *tmp; + while ((c = getopt_long(argc, argv, "l:t:T:r:R:o:O:s:S:Gf:knv:V:m:M:auUhHc:C:Ii:e:xXpPq:Q:g:",loptions,NULL)) >= 0) + { + char allele_type[9] = "nref"; + switch (c) + { + case 'O': + switch (optarg[0]) { + case 'b': args->output_type = FT_BCF_GZ; break; + case 'u': args->output_type = FT_BCF; break; + case 'z': args->output_type = FT_VCF_GZ; break; + case 'v': args->output_type = FT_VCF; break; + default: + { + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("The output type \"%s\" not recognised\n", optarg); + } + }; + if ( optarg[1] ) + { + args->clevel = strtol(optarg+1,&tmp,10); + if ( *tmp || args->clevel<0 || args->clevel>9 ) error("Could not parse argument: --compression-level %s\n", optarg+1); + } + break; + case 'l': + args->clevel = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --compression-level %s\n", optarg); + args->output_type |= FT_GZ; + break; + case 'o': args->fn_out = optarg; break; + case 'H': args->print_header = 0; break; + case 'h': args->header_only = 1; break; + case 4 : args->print_header = 1; args->header_only = 0; break; + + case 't': args->targets_list = optarg; break; + case 'T': args->targets_list = optarg; targets_is_file = 1; break; + case 'r': args->regions_list = optarg; break; + case 'R': args->regions_list = optarg; regions_is_file = 1; break; + + case 's': args->sample_names = optarg; break; + case 'S': args->sample_names = optarg; args->sample_is_file = 1; break; + case 1 : args->force_samples = 1; break; + case 'a': args->trim_alts = 1; args->calc_ac = 1; break; + case 'I': args->update_info = 0; break; + case 'G': args->sites_only = 1; break; + + case 'f': args->files->apply_filters = optarg; break; + case 'k': args->known = 1; break; + case 'n': args->novel = 1; break; + case 'm': + args->min_alleles = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --min-alleles %s\n", optarg); + break; + case 'M': + args->max_alleles = strtol(optarg,&tmp,10); + if ( *tmp ) error("Could not parse argument: --max-alleles %s\n", optarg); + break; + case 'v': args->include_types = optarg; break; + case 'V': args->exclude_types = optarg; break; + case 'e': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_EXCLUDE; break; + case 'i': + if ( args->filter_str ) error("Error: only one -i or -e expression can be given, and they cannot be combined\n"); + args->filter_str = optarg; args->filter_logic |= FLT_INCLUDE; break; + case 'c': + { + args->min_ac_type = ALLELE_NONREF; + if ( sscanf(optarg,"%d:%8s",&args->min_ac, allele_type)!=2 && sscanf(optarg,"%d",&args->min_ac)!=1 ) + error("Error: Could not parse --min-ac %s\n", optarg); + set_allele_type(&args->min_ac_type, allele_type); + args->calc_ac = 1; + break; + } + case 'C': + { + args->max_ac_type = ALLELE_NONREF; + if ( sscanf(optarg,"%d:%8s",&args->max_ac, allele_type)!=2 && sscanf(optarg,"%d",&args->max_ac)!=1 ) + error("Error: Could not parse --max-ac %s\n", optarg); + set_allele_type(&args->max_ac_type, allele_type); + args->calc_ac = 1; + break; + } + case 'q': + { + args->min_af_type = ALLELE_NONREF; + if ( sscanf(optarg,"%f:%8s",&args->min_af, allele_type)!=2 && sscanf(optarg,"%f",&args->min_af)!=1 ) + error("Error: Could not parse --min-af %s\n", optarg); + set_allele_type(&args->min_af_type, allele_type); + args->calc_ac = 1; + break; + } + case 'Q': + { + args->max_af_type = ALLELE_NONREF; + if ( sscanf(optarg,"%f:%8s",&args->max_af, allele_type)!=2 && sscanf(optarg,"%f",&args->max_af)!=1 ) + error("Error: Could not parse --max-af %s\n", optarg); + set_allele_type(&args->max_af_type, allele_type); + args->calc_ac = 1; + break; + } + + case 'x': args->private_vars |= FLT_INCLUDE; args->calc_ac = 1; break; + case 'X': args->private_vars |= FLT_EXCLUDE; args->calc_ac = 1; break; + case 'u': args->uncalled |= FLT_INCLUDE; args->calc_ac = 1; break; + case 'U': args->uncalled |= FLT_EXCLUDE; args->calc_ac = 1; break; + case 'p': args->phased |= FLT_INCLUDE; break; // phased + case 'P': args->phased |= FLT_EXCLUDE; break; // exclude-phased + case 'g': + { + if ( !strcasecmp(optarg,"hom") ) args->gt_type = GT_NEED_HOM; + else if ( !strcasecmp(optarg,"het") ) args->gt_type = GT_NEED_HET; + else if ( !strcasecmp(optarg,"miss") ) args->gt_type = GT_NEED_MISSING; + else if ( !strcasecmp(optarg,"^hom") ) args->gt_type = GT_NO_HOM; + else if ( !strcasecmp(optarg,"^het") ) args->gt_type = GT_NO_HET; + else if ( !strcasecmp(optarg,"^miss") ) args->gt_type = GT_NO_MISSING; + else error("The argument to -g not recognised. Expected one of hom/het/miss/^hom/^het/^miss, got \"%s\".\n", optarg); + break; + } + case 2 : + args->targets_overlap = parse_overlap_option(optarg); + if ( args->targets_overlap < 0 ) error("Could not parse: --targets-overlap %s\n",optarg); + break; + case 3 : + args->regions_overlap = parse_overlap_option(optarg); + if ( args->regions_overlap < 0 ) error("Could not parse: --regions-overlap %s\n",optarg); + break; + case 9 : args->n_threads = strtol(optarg, 0, 0); break; + case 8 : args->record_cmd_line = 0; break; + case '?': usage(args); break; + default: error("Unknown argument: %s\n", optarg); + } + } + + if ( args->filter_logic == (FLT_EXCLUDE|FLT_INCLUDE) ) error("Only one of -i or -e can be given.\n"); + if ( args->private_vars > FLT_EXCLUDE ) error("Only one of -x or -X can be given.\n"); + if ( args->uncalled > FLT_EXCLUDE ) error("Only one of -u or -U can be given.\n"); + if ( args->phased > FLT_EXCLUDE ) error("Only one of -p or -P can be given.\n"); + + if ( args->sample_names && args->update_info) args->calc_ac = 1; + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(fileno((FILE *)stdin)) ) fname = "-"; // reading from stdin + else usage(args); + } + else fname = argv[optind]; + + // read in the regions from the command line + if ( args->regions_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_REGIONS_OVERLAP,args->regions_overlap); + if ( bcf_sr_set_regions(args->files, args->regions_list, regions_is_file)<0 ) + error("Failed to read the regions: %s\n", args->regions_list); + } + else if ( optind+1 < argc ) + { + int i; + kstring_t tmp = {0,0,0}; + kputs(argv[optind+1],&tmp); + for (i=optind+2; ifiles, tmp.s, 0)<0 ) + error("Failed to read the regions: %s\n", tmp.s); + free(tmp.s); + } + if ( args->targets_list ) + { + bcf_sr_set_opt(args->files,BCF_SR_TARGETS_OVERLAP,args->targets_overlap); + if ( bcf_sr_set_targets(args->files, args->targets_list, targets_is_file, 0)<0 ) + error("Failed to read the targets: %s\n", args->targets_list); + } + + if ( bcf_sr_set_threads(args->files, args->n_threads)<0 ) error("Failed to create threads\n"); + if ( !bcf_sr_add_reader(args->files, fname) ) error("Failed to read from %s: %s\n", !strcmp("-",fname)?"standard input":fname,bcf_sr_strerror(args->files->errnum)); + + init_data(args); + bcf_hdr_t *out_hdr = args->hnull ? args->hnull : (args->hsub ? args->hsub : args->hdr); + if (args->print_header) + { + if ( bcf_hdr_write(args->out, out_hdr)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->fn_out); + } + else if ( args->output_type & FT_BCF ) + error("BCF output requires header, cannot proceed with -H\n"); + + int ret = 0; + if (!args->header_only) + { + while ( bcf_sr_next_line(args->files) ) + { + bcf1_t *line = args->files->readers[0].buffer[0]; + if ( line->errcode && out_hdr!=args->hdr ) error("Undefined tags in the header, cannot proceed in the sample subset mode.\n"); + if ( subset_vcf(args, line) && bcf_write1(args->out, out_hdr, line)!=0 ) error("[%s] Error: cannot write to %s\n", __func__,args->fn_out); + } + ret = args->files->errnum; + if ( ret ) fprintf(bcftools_stderr,"Error: %s\n", bcf_sr_strerror(args->files->errnum)); + } + hts_close(args->out); + destroy_data(args); + bcf_sr_destroy(args->files); + free(args); + return ret; +} diff --git a/bcftools/vcmp.c b/bcftools/vcmp.c new file mode 100644 index 0000000..dbdc4b7 --- /dev/null +++ b/bcftools/vcmp.c @@ -0,0 +1,155 @@ +/* vcmp.c -- reference allele utility functions. + + Copyright (C) 2013-2015, 2018 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include "vcmp.h" + +struct _vcmp_t +{ + char *dref; + int ndref, mdref; // ndref: positive when ref1 longer, negative when ref2 is longer + int nmatch; + int *map, mmap, nmap; + int *map_dip, mmap_dip, nmap_dip; +}; + +vcmp_t *vcmp_init() +{ + return (vcmp_t*)calloc(1,sizeof(vcmp_t)); +} + +void vcmp_destroy(vcmp_t *vcmp) +{ + free(vcmp->map_dip); + free(vcmp->map); + free(vcmp->dref); + free(vcmp); +} + +int vcmp_set_ref(vcmp_t *vcmp, char *ref1, char *ref2) +{ + vcmp->ndref = 0; + + char *a = ref1, *b = ref2; + while ( *a && *b && toupper(*a)==toupper(*b) ) { a++; b++; } + if ( !*a && !*b ) return 0; + if ( *a && *b ) return -1; // refs not compatible + + int i; + if ( *a ) // ref1 is longer + { + vcmp->nmatch = b-ref2; + while ( *a ) a++; + vcmp->ndref = (a-ref1) - vcmp->nmatch; + hts_expand(char,vcmp->ndref+1,vcmp->mdref,vcmp->dref); + for (i=0; indref; i++) vcmp->dref[i] = toupper(ref1[vcmp->nmatch+i]); + vcmp->dref[vcmp->ndref] = 0; + return 0; + } + + // ref2 is longer + vcmp->nmatch = a-ref1; + while ( *b ) b++; + vcmp->ndref = (b-ref2) - vcmp->nmatch; + hts_expand(char,vcmp->ndref+1,vcmp->mdref,vcmp->dref); + for (i=0; indref; i++) vcmp->dref[i] = toupper(ref2[vcmp->nmatch+i]); + vcmp->dref[vcmp->ndref] = 0; + vcmp->ndref *= -1; + return 0; +} + +int vcmp_find_allele(vcmp_t *vcmp, char **als1, int nals1, char *al2) +{ + int i, j; + for (i=0; indref ) + { + if ( !*a && !*b ) break; // found + continue; + } + + // the prefixes match + if ( *a ) + { + if ( vcmp->ndref<0 ) continue; + for (j=0; jndref; j++) + if ( !a[j] || toupper(a[j])!=vcmp->dref[j] ) break; + if ( j!=vcmp->ndref || a[j] ) continue; + break; // found + } + + if ( vcmp->ndref>0 ) continue; + for (j=0; j<-vcmp->ndref; j++) + if ( !b[j] || toupper(b[j])!=vcmp->dref[j] ) break; + if ( j!=-vcmp->ndref || b[j] ) continue; + break; // found + } + if (i==nals1) return -1; + return i; +} + + +int *vcmp_map_ARvalues(vcmp_t *vcmp, int n, int nals1, char **als1, int nals2, char **als2) +{ + if ( vcmp_set_ref(vcmp,als1[0],als2[0]) < 0 ) return NULL; + + vcmp->nmap = n; + hts_expand(int, vcmp->nmap, vcmp->mmap, vcmp->map); + + int i, ifrom = n==nals2 ? 0 : 1; + for (i=ifrom; imap[i-ifrom] = vcmp_find_allele(vcmp, als1+ifrom, nals1-ifrom, als2[i]); + } + return vcmp->map; +} + +int *vcmp_map_dipGvalues(vcmp_t *vcmp, int *nmap) +{ + vcmp->nmap_dip = vcmp->nmap*(vcmp->nmap+1)/2; + hts_expand(int, vcmp->nmap_dip, vcmp->mmap_dip, vcmp->map_dip); + + int i, j, k = 0; + for (i=0; inmap; i++) + { + for (j=0; j<=i; j++) + { + vcmp->map_dip[k] = vcmp->map[i]>=0 && vcmp->map[j]>=0 ? bcf_alleles2gt(vcmp->map[i],vcmp->map[j]) : -1; + k++; + } + } + *nmap = k; + return vcmp->map_dip; +} + + diff --git a/bcftools/vcmp.c.pysam.c b/bcftools/vcmp.c.pysam.c new file mode 100644 index 0000000..18a6813 --- /dev/null +++ b/bcftools/vcmp.c.pysam.c @@ -0,0 +1,157 @@ +#include "bcftools.pysam.h" + +/* vcmp.c -- reference allele utility functions. + + Copyright (C) 2013-2015, 2018 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include "vcmp.h" + +struct _vcmp_t +{ + char *dref; + int ndref, mdref; // ndref: positive when ref1 longer, negative when ref2 is longer + int nmatch; + int *map, mmap, nmap; + int *map_dip, mmap_dip, nmap_dip; +}; + +vcmp_t *vcmp_init() +{ + return (vcmp_t*)calloc(1,sizeof(vcmp_t)); +} + +void vcmp_destroy(vcmp_t *vcmp) +{ + free(vcmp->map_dip); + free(vcmp->map); + free(vcmp->dref); + free(vcmp); +} + +int vcmp_set_ref(vcmp_t *vcmp, char *ref1, char *ref2) +{ + vcmp->ndref = 0; + + char *a = ref1, *b = ref2; + while ( *a && *b && toupper(*a)==toupper(*b) ) { a++; b++; } + if ( !*a && !*b ) return 0; + if ( *a && *b ) return -1; // refs not compatible + + int i; + if ( *a ) // ref1 is longer + { + vcmp->nmatch = b-ref2; + while ( *a ) a++; + vcmp->ndref = (a-ref1) - vcmp->nmatch; + hts_expand(char,vcmp->ndref+1,vcmp->mdref,vcmp->dref); + for (i=0; indref; i++) vcmp->dref[i] = toupper(ref1[vcmp->nmatch+i]); + vcmp->dref[vcmp->ndref] = 0; + return 0; + } + + // ref2 is longer + vcmp->nmatch = a-ref1; + while ( *b ) b++; + vcmp->ndref = (b-ref2) - vcmp->nmatch; + hts_expand(char,vcmp->ndref+1,vcmp->mdref,vcmp->dref); + for (i=0; indref; i++) vcmp->dref[i] = toupper(ref2[vcmp->nmatch+i]); + vcmp->dref[vcmp->ndref] = 0; + vcmp->ndref *= -1; + return 0; +} + +int vcmp_find_allele(vcmp_t *vcmp, char **als1, int nals1, char *al2) +{ + int i, j; + for (i=0; indref ) + { + if ( !*a && !*b ) break; // found + continue; + } + + // the prefixes match + if ( *a ) + { + if ( vcmp->ndref<0 ) continue; + for (j=0; jndref; j++) + if ( !a[j] || toupper(a[j])!=vcmp->dref[j] ) break; + if ( j!=vcmp->ndref || a[j] ) continue; + break; // found + } + + if ( vcmp->ndref>0 ) continue; + for (j=0; j<-vcmp->ndref; j++) + if ( !b[j] || toupper(b[j])!=vcmp->dref[j] ) break; + if ( j!=-vcmp->ndref || b[j] ) continue; + break; // found + } + if (i==nals1) return -1; + return i; +} + + +int *vcmp_map_ARvalues(vcmp_t *vcmp, int n, int nals1, char **als1, int nals2, char **als2) +{ + if ( vcmp_set_ref(vcmp,als1[0],als2[0]) < 0 ) return NULL; + + vcmp->nmap = n; + hts_expand(int, vcmp->nmap, vcmp->mmap, vcmp->map); + + int i, ifrom = n==nals2 ? 0 : 1; + for (i=ifrom; imap[i-ifrom] = vcmp_find_allele(vcmp, als1+ifrom, nals1-ifrom, als2[i]); + } + return vcmp->map; +} + +int *vcmp_map_dipGvalues(vcmp_t *vcmp, int *nmap) +{ + vcmp->nmap_dip = vcmp->nmap*(vcmp->nmap+1)/2; + hts_expand(int, vcmp->nmap_dip, vcmp->mmap_dip, vcmp->map_dip); + + int i, j, k = 0; + for (i=0; inmap; i++) + { + for (j=0; j<=i; j++) + { + vcmp->map_dip[k] = vcmp->map[i]>=0 && vcmp->map[j]>=0 ? bcf_alleles2gt(vcmp->map[i],vcmp->map[j]) : -1; + k++; + } + } + *nmap = k; + return vcmp->map_dip; +} + + diff --git a/bcftools/vcmp.h b/bcftools/vcmp.h new file mode 100644 index 0000000..03234b4 --- /dev/null +++ b/bcftools/vcmp.h @@ -0,0 +1,63 @@ +/* vcmp.h -- reference allele utility functions. + + Copyright (C) 2013-2015 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. */ + +#ifndef __VCMP_H__ +#define __VCMP_H__ + +typedef struct _vcmp_t vcmp_t; + +vcmp_t *vcmp_init(void); +void vcmp_destroy(vcmp_t *vcmp); + +/* + * vcmp_set_ref() - sets and compares reference alleles + * Returns 0 on success or -1 if alleles not compatible + */ +int vcmp_set_ref(vcmp_t *vcmp, char *ref1, char *ref2); + +/* + * vcmp_find_allele() + * @param als1: alternate alleles to ref1 above + * @param al2: alternate allele to ref2 above + * Returns -1 if not found or 0-based index to als1 of matching allele + */ +int vcmp_find_allele(vcmp_t *vcmp, char **als1, int nals1, char *al2); + +/* + * vcmp_map_ARvalues() - Create mapping for Number=A,R tag values + * @param number: nals2 for Number=R, nals2-1 for Number=A + * @param nals1: number of alleles + * @param als1: alleles + * + * Returns pointer to an array of size nals2 with mapping from als2 + * to als1 or NULL if REFs (als1[0] and als2[0]) are not compatible. + * If i is the index of an allele in als2, ret[i] is the index of matching + * allele in als1 or -1 if als2 does not have a matching allele. + * The caller must not free the array. + */ +int *vcmp_map_ARvalues(vcmp_t *vcmp, int number, int nals1, char **als1, int nals2, char **als2); + +int *vcmp_map_dipGvalues(vcmp_t *vcmp, int *nmap); + +#endif diff --git a/bcftools/version.c b/bcftools/version.c new file mode 100644 index 0000000..4306d40 --- /dev/null +++ b/bcftools/version.c @@ -0,0 +1,109 @@ +/* version.c -- report version numbers for plugins. + + Copyright (C) 2014-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "version.h" + +void version(const char **bcftools_version, const char **htslib_version) +{ + *bcftools_version = BCFTOOLS_VERSION; + *htslib_version = hts_version(); +} + +void error(const char *format, ...) +{ + va_list ap; + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + exit(-1); +} + +void error_errno(const char *format, ...) +{ + va_list ap; + int e = errno; + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + if (e) { + fprintf(stderr, ": %s\n", strerror(e)); + } else { + fprintf(stderr, "\n"); + } + exit(-1); +} + +const char *hts_bcf_wmode(int file_type) +{ + if ( file_type == FT_BCF ) return "wbu"; // uncompressed BCF + if ( file_type & FT_BCF ) return "wb"; // compressed BCF + if ( file_type & FT_GZ ) return "wz"; // compressed VCF + return "w"; // uncompressed VCF +} + +const char *hts_bcf_wmode2(int file_type, const char *fname) +{ + if ( !fname ) return hts_bcf_wmode(file_type); + int len = strlen(fname); + if ( len >= 4 && !strcasecmp(".bcf",fname+len-4) ) return hts_bcf_wmode(FT_BCF|FT_GZ); + if ( len >= 4 && !strcasecmp(".vcf",fname+len-4) ) return hts_bcf_wmode(FT_VCF); + if ( len >= 7 && !strcasecmp(".vcf.gz",fname+len-7) ) return hts_bcf_wmode(FT_VCF|FT_GZ); + if ( len >= 8 && !strcasecmp(".vcf.bgz",fname+len-8) ) return hts_bcf_wmode(FT_VCF|FT_GZ); + return hts_bcf_wmode(file_type); +} + +void set_wmode(char dst[8], int file_type, const char *fname, int clevel) +{ + const char *ret = NULL; + int len = fname ? strlen(fname) : 0; + if ( len >= 4 && !strcasecmp(".bcf",fname+len-4) ) ret = hts_bcf_wmode(FT_BCF|FT_GZ); + else if ( len >= 4 && !strcasecmp(".vcf",fname+len-4) ) ret = hts_bcf_wmode(FT_VCF); + else if ( len >= 7 && !strcasecmp(".vcf.gz",fname+len-7) ) ret = hts_bcf_wmode(FT_VCF|FT_GZ); + else if ( len >= 8 && !strcasecmp(".vcf.bgz",fname+len-8) ) ret = hts_bcf_wmode(FT_VCF|FT_GZ); + else ret = hts_bcf_wmode(file_type); + if ( clevel>=0 && clevel<=9 ) + { + if ( strchr(ret,'v') || strchr(ret,'u') ) error("Error: compression level (%d) cannot be set on uncompressed streams (%s)\n",clevel,fname); + len = strlen(ret); + if ( len>6 ) error("Fixme: %s\n", ret); + sprintf(dst, "%s%d", ret, clevel); + } + else + strcpy(dst, ret); +} + +int parse_overlap_option(const char *arg) +{ + if ( strcasecmp(arg, "pos") == 0 || strcmp(arg, "0") == 0 ) return 0; + else if ( strcasecmp(arg, "record") == 0 || strcmp(arg, "1") == 0 ) return 1; + else if ( strcasecmp(arg, "variant") == 0 || strcmp(arg, "2") == 0 ) return 2; + else return -1; +} diff --git a/bcftools/version.c.pysam.c b/bcftools/version.c.pysam.c new file mode 100644 index 0000000..df12fc4 --- /dev/null +++ b/bcftools/version.c.pysam.c @@ -0,0 +1,111 @@ +#include "bcftools.pysam.h" + +/* version.c -- report version numbers for plugins. + + Copyright (C) 2014-2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include "bcftools.h" +#include "version.h" + +void version(const char **bcftools_version, const char **htslib_version) +{ + *bcftools_version = BCFTOOLS_VERSION; + *htslib_version = hts_version(); +} + +void error(const char *format, ...) +{ + va_list ap; + va_start(ap, format); + vfprintf(bcftools_stderr, format, ap); + va_end(ap); + bcftools_exit(-1); +} + +void error_errno(const char *format, ...) +{ + va_list ap; + int e = errno; + va_start(ap, format); + vfprintf(bcftools_stderr, format, ap); + va_end(ap); + if (e) { + fprintf(bcftools_stderr, ": %s\n", strerror(e)); + } else { + fprintf(bcftools_stderr, "\n"); + } + bcftools_exit(-1); +} + +const char *hts_bcf_wmode(int file_type) +{ + if ( file_type == FT_BCF ) return "wbu"; // uncompressed BCF + if ( file_type & FT_BCF ) return "wb"; // compressed BCF + if ( file_type & FT_GZ ) return "wz"; // compressed VCF + return "w"; // uncompressed VCF +} + +const char *hts_bcf_wmode2(int file_type, const char *fname) +{ + if ( !fname ) return hts_bcf_wmode(file_type); + int len = strlen(fname); + if ( len >= 4 && !strcasecmp(".bcf",fname+len-4) ) return hts_bcf_wmode(FT_BCF|FT_GZ); + if ( len >= 4 && !strcasecmp(".vcf",fname+len-4) ) return hts_bcf_wmode(FT_VCF); + if ( len >= 7 && !strcasecmp(".vcf.gz",fname+len-7) ) return hts_bcf_wmode(FT_VCF|FT_GZ); + if ( len >= 8 && !strcasecmp(".vcf.bgz",fname+len-8) ) return hts_bcf_wmode(FT_VCF|FT_GZ); + return hts_bcf_wmode(file_type); +} + +void set_wmode(char dst[8], int file_type, const char *fname, int clevel) +{ + const char *ret = NULL; + int len = fname ? strlen(fname) : 0; + if ( len >= 4 && !strcasecmp(".bcf",fname+len-4) ) ret = hts_bcf_wmode(FT_BCF|FT_GZ); + else if ( len >= 4 && !strcasecmp(".vcf",fname+len-4) ) ret = hts_bcf_wmode(FT_VCF); + else if ( len >= 7 && !strcasecmp(".vcf.gz",fname+len-7) ) ret = hts_bcf_wmode(FT_VCF|FT_GZ); + else if ( len >= 8 && !strcasecmp(".vcf.bgz",fname+len-8) ) ret = hts_bcf_wmode(FT_VCF|FT_GZ); + else ret = hts_bcf_wmode(file_type); + if ( clevel>=0 && clevel<=9 ) + { + if ( strchr(ret,'v') || strchr(ret,'u') ) error("Error: compression level (%d) cannot be set on uncompressed streams (%s)\n",clevel,fname); + len = strlen(ret); + if ( len>6 ) error("Fixme: %s\n", ret); + sprintf(dst, "%s%d", ret, clevel); + } + else + strcpy(dst, ret); +} + +int parse_overlap_option(const char *arg) +{ + if ( strcasecmp(arg, "pos") == 0 || strcmp(arg, "0") == 0 ) return 0; + else if ( strcasecmp(arg, "record") == 0 || strcmp(arg, "1") == 0 ) return 1; + else if ( strcasecmp(arg, "variant") == 0 || strcmp(arg, "2") == 0 ) return 2; + else return -1; +} diff --git a/bcftools/version.sh b/bcftools/version.sh new file mode 100755 index 0000000..5fbf8df --- /dev/null +++ b/bcftools/version.sh @@ -0,0 +1,36 @@ +#!/bin/sh +# version.sh +# +# Author : Petr Danecek +# +# Copyright (C) 2018-2021 Genome Research Ltd. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +# Master version, for use in tarballs or non-git source copies +VERSION=1.16 + +# If we have a git clone, then check against the current tag +if [ -e .git ] +then + # If we ever get to 10.x this will need to be more liberal + VERSION=`git describe --match '[0-9].[0-9]*' --dirty --always` +fi + +echo $VERSION diff --git a/cy_build.py b/cy_build.py new file mode 100644 index 0000000..2726e94 --- /dev/null +++ b/cy_build.py @@ -0,0 +1,90 @@ +import os +import re +import sys + +try: + from Cython.Distutils import build_ext +except ImportError: + from setuptools.command.build_ext import build_ext + +from distutils.extension import Extension +from distutils.sysconfig import get_config_vars, get_python_version +from pkg_resources import Distribution + + +if sys.platform == 'darwin': + config_vars = get_config_vars() + config_vars['LDSHARED'] = config_vars['LDSHARED'].replace('-bundle', '') + config_vars['SHLIB_EXT'] = '.so' + + +def is_pip_install(): + if "_" in os.environ and os.environ["_"].endswith("pip"): + return True + if "pip-egg-info" in sys.argv: + return True + if re.search("/pip-.*-build/", __file__): + return True + return False + + +class CyExtension(Extension): + def __init__(self, *args, **kwargs): + self._init_func = kwargs.pop("init_func", None) + self._prebuild_func = kwargs.pop("prebuild_func", None) + Extension.__init__(self, *args, **kwargs) + + def extend_includes(self, includes): + self.include_dirs.extend(includes) + + def extend_macros(self, macros): + self.define_macros.extend(macros) + + def extend_extra_objects(self, objs): + self.extra_objects.extend(objs) + + +class cy_build_ext(build_ext): + + def _get_egg_name(self): + ei_cmd = self.get_finalized_command("egg_info") + return Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version, get_python_version(), + self.distribution.has_ext_modules() and self.plat_name).egg_name() + + def build_extension(self, ext): + + if isinstance(ext, CyExtension) and ext._init_func: + ext._init_func(ext) + + if not self.inplace: + ext.library_dirs.append(os.path.join(self.build_lib, "pysam")) + + if sys.platform == 'darwin': + # The idea is to give shared libraries an install name of the form + # `@rpath/`, and to set the rpath equal to + # @loader_path. This will allow Python packages to find the library + # in the expected place, while still giving enough flexibility to + # external applications to link against the library. + relative_module_path = ext.name.replace(".", os.sep) + get_config_vars()["SO"] + library_path = os.path.join( + "@rpath", os.path.basename(relative_module_path) + ) + + if not ext.extra_link_args: + ext.extra_link_args = [] + ext.extra_link_args += ['-dynamiclib', + '-rpath', '@loader_path', + '-Wl,-headerpad_max_install_names', + '-Wl,-install_name,%s' % library_path, + '-Wl,-x'] + else: + if not ext.extra_link_args: + ext.extra_link_args = [] + + ext.extra_link_args += ['-Wl,-rpath,$ORIGIN'] + + if isinstance(ext, CyExtension) and ext._prebuild_func: + ext._prebuild_func(ext, self.force) + + build_ext.build_extension(self, ext) diff --git a/devtools/buildwheels.sh b/devtools/buildwheels.sh new file mode 100755 index 0000000..4d12566 --- /dev/null +++ b/devtools/buildwheels.sh @@ -0,0 +1,73 @@ +#!/bin/bash +# +# Build manylinux1 wheels for pysam. Based on the example at +# +# +# It is best to run this in a fresh clone of the repository! +# +# Before running, make sure to update image: +# +# docker pull quay.io/pypa/manylinux1_x86_64 +# +# Run this within the repository root: +# docker run --rm -v $(pwd):/io quay.io/pypa/manylinux1_x86_64 /io/buildwheels.sh +# +# The wheels will be put into the wheelhouse/ subdirectory. +# +# For interactive tests: +# docker run -it -v $(pwd):/io quay.io/pypa/manylinux1_x86_64 /bin/bash + +set -xeuo pipefail + +# For convenience, if this script is called from outside of a docker container, +# it starts a container and runs itself inside of it. +if ! grep -q docker /proc/1/cgroup; then + # We are not inside a container + exec docker run --rm -v $(pwd):/io quay.io/pypa/manylinux1_x86_64 /io/$0 +fi + +yum install -y zlib-devel bzip2-devel xz-devel + +# Without libcurl support, htslib can open files from HTTP and FTP URLs. +# With libcurl support, it also supports HTTPS and S3 URLs, but libcurl needs a +# current version of OpenSSL, and we do not want to be responsible for +# updating the wheels as soon as there are any security issues. So disable +# libcurl for now. +# See also . +# +export HTSLIB_CONFIGURE_OPTIONS="--disable-libcurl" + +PYBINS="/opt/python/*/bin" +echo $PYBINS + +for PYBIN in ${PYBINS}; do + ${PYBIN}/pip install -r /io/requirements.txt + ${PYBIN}/pip wheel /io/ -w wheelhouse/ +done + +# Bundle external shared libraries into the wheels +# +# The '-L ""' option is a workaround. By default, auditwheel puts all external +# libraries (.so files) into a .libs directory and sets the RUNPATH to $ORIGIN/.libs. +# When HTSLIB_MODE is 'shared' (now the default), then all so libraries part of +# pysam require that RUNPATH is set to $ORIGIN (without the .libs). It seems +# auditwheel overwrites $ORIGIN with $ORIGIN/.libs. This workaround makes +# auditwheel keeps the RUNPATH at "$ORIGIN" and put all the external libraries into +# the pysam directory. +for whl in wheelhouse/*.whl; do + auditwheel repair -L "" $whl -w /io/wheelhouse/ +done + +# mkdir -p /io/wheelhouse +# cp wheelhouse/*.whl /io/wheelhouse + +# Created files are owned by root, so fix permissions. +chown -R --reference=/io/setup.py /io/wheelhouse/ + +# TODO Install packages and test them +for PYBIN in ${PYBINS}; do + ${PYBIN}/pip install pysam --no-index -f /io/wheelhouse + # smoketest + (cd $HOME; ${PYBIN}/python -c 'import pysam') + # todo: add more tests +done diff --git a/devtools/conda-recipe/build.sh b/devtools/conda-recipe/build.sh new file mode 100644 index 0000000..32b67db --- /dev/null +++ b/devtools/conda-recipe/build.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Use internal htslib +chmod a+x ./htslib/configure +export CFLAGS="-I${PREFIX}/include/curl/ -I${PREFIX}/include -L${PREFIX}/lib" +export HTSLIB_CONFIGURE_OPTIONS="--disable-libcurl" + +$PYTHON setup.py install diff --git a/devtools/conda-recipe/meta.yaml b/devtools/conda-recipe/meta.yaml new file mode 100644 index 0000000..4e57895 --- /dev/null +++ b/devtools/conda-recipe/meta.yaml @@ -0,0 +1,29 @@ +package: + name: pysam + version: 0.8.5 + +source: + path: ../../ + +build: + number: 0 + +requirements: + build: + - python + - setuptools + - zlib + - cython + + run: + - python + - zlib + +test: + imports: + - pysam + +about: + home: https://github.com/pysam-developers/pysam + license: MIT + summary: Pysam is a python module for reading and manipulating Samfiles. It's a lightweight wrapper of the samtools C-API. Pysam also includes an interface for tabix. diff --git a/devtools/import.py b/devtools/import.py new file mode 100644 index 0000000..90194d0 --- /dev/null +++ b/devtools/import.py @@ -0,0 +1,262 @@ +################################################################# +# Importing samtools, bcftools, and htslib +# +# For each package PKG: +# +# rm -rf PKG +# python import.py PKG path/to/download/PKG-X.Y + +import fnmatch +import os +import re +import itertools +import shutil +import sys +import hashlib + + +EXCLUDE = { + "samtools": ( + "test", "misc", + "bgzip.c", + "main.c", + "calDepth.c", + "bam2bed.c", + "bam_tview.c", + "bam_tview.h", + "bam_tview_html.c", + "bam_tview_curses.c", + "bam2bcf.c", + "bam2bcf.h", + "vcf-miniview.c", + ), + "bcftools": ( + "test", "plugins", "peakfit.c", + "peakfit.h", + "polysomy.c"), + "htslib": ( + 'htslib/tabix.c', 'htslib/bgzip.c', + 'htslib/htsfile.c', + "test", "tests"), +} + + +MAIN = { + "samtools": "bamtk", + "bcftools": "main" +} + + +C_VERSION = { + "htslib": "HTS_VERSION_TEXT", + "samtools": "SAMTOOLS_VERSION", + "bcftools": "BCFTOOLS_VERSION" +} + + +def locate(pattern, root=os.curdir, exclude=[], exclude_htslib=False): + '''Locate all files matching supplied filename pattern (but not listed + in exclude) in and below the supplied root directory. Omit any files under + directories listed in exclude or (if exclude_htslib=True) matching /htslib-*/. + ''' + for path, dirs, files in os.walk(os.path.abspath(root)): + for filename in fnmatch.filter(files, pattern): + if filename not in exclude: + yield os.path.join(path, filename) + + for dirname in exclude: + if dirname in dirs: dirs.remove(dirname) + if exclude_htslib: + for dirname in [d for d in dirs if re.match(r"htslib-", d)]: + dirs.remove(dirname) + + +def _update_pysam_files(cf, destdir): + '''update pysam files applying redirection of ouput''' + basename = os.path.basename(destdir) + for filename in cf: + if not filename: + continue + dest = filename + ".pysam.c" + with open(filename, encoding="utf-8") as infile: + lines = "".join(infile.readlines()) + + with open(dest, "w", encoding="utf-8") as outfile: + outfile.write('#include "{}.pysam.h"\n\n'.format(basename)) + subname, _ = os.path.splitext(os.path.basename(filename)) + if subname in MAIN.get(basename, []): + lines = re.sub(r"int main\(", "int {}_main(".format( + basename), lines) + else: + lines = re.sub(r"int main\(", "int {}_{}_main(".format( + basename, subname), lines) + lines = re.sub(r"\b({}_stdout)\b".format(basename), r"\1_internal", lines) + lines = re.sub(r"\bexit\(", "{}_exit(".format(basename), lines) + lines = re.sub(r"\bstderr\b", "{}_stderr".format(basename), lines) + lines = re.sub(r"\bstdout\b", "{}_stdout".format(basename), lines) + lines = re.sub(r" printf\(", " fprintf({}_stdout, ".format(basename), lines) + lines = re.sub(r"([^kf])puts\(", r"\1{}_puts(".format(basename), lines) + lines = re.sub(r"putchar\(([^)]+)\)", + r"fputc(\1, {}_stdout)".format(basename), lines) + + fn = os.path.basename(filename) + # some specific fixes: + SPECIFIC_SUBSTITUTIONS = { + "bam_md.c": ( + 'sam_open_format("-", mode_w', + 'sam_open_format({}_stdout_fn, mode_w'.format(basename)), + "phase.c": ( + 'putc("ACGT"[f->seq[j] == 1? (c&3, {}_stdout) : (c>>16&3)]);'.format(basename), + 'putc("ACGT"[f->seq[j] == 1? (c&3) : (c>>16&3)], {}_stdout);'.format(basename)), + "cut_target.c": ( + 'putc(33 + (cns[j]>>8>>2, {}_stdout));'.format(basename), + 'putc(33 + (cns[j]>>8>>2), {}_stdout);'.format(basename)) + } + if fn in SPECIFIC_SUBSTITUTIONS: + lines = lines.replace( + SPECIFIC_SUBSTITUTIONS[fn][0], + SPECIFIC_SUBSTITUTIONS[fn][1]) + if fn == "bamtk.c": + lines = re.sub(r'(#include "version.h")', r'\1\n#include "samtools_config_vars.h"', lines) + lines = re.sub(r'(else if.*"tview")', r'//\1', lines) + + outfile.write(lines) + + with open(os.path.join("import", "pysam.h")) as inf, \ + open(os.path.join(destdir, "{}.pysam.h".format(basename)), "w") as outf: + outf.write(re.sub("@pysam@", basename, inf.read())) + + with open(os.path.join("import", "pysam.c")) as inf, \ + open(os.path.join(destdir, "{}.pysam.c".format(basename)), "w") as outf: + outf.write(re.sub("@pysam@", basename, inf.read())) + + +if len(sys.argv) >= 1: + if len(sys.argv) != 3: + raise ValueError("import requires dest src") + + dest, srcdir = sys.argv[1:3] + if dest not in EXCLUDE: + raise ValueError("import expected one of %s" % + ",".join(EXCLUDE.keys())) + exclude = EXCLUDE[dest] + destdir = os.path.abspath(dest) + srcdir = os.path.abspath(srcdir) + if not os.path.exists(srcdir): + raise IOError( + "source directory `%s` does not exist." % srcdir) + + cfiles = locate("*.c", srcdir, exclude=exclude, exclude_htslib=True) + hfiles = locate("*.h", srcdir, exclude=exclude, exclude_htslib=True) + mfiles = itertools.chain(locate("README", srcdir), locate("LICENSE", srcdir), + locate("version.sh", srcdir, exclude_htslib=True)) + + if dest == "htslib": + # Add build files, including *.ac *.in *.mk *.m4 *.sh + mfiles = itertools.chain(mfiles, locate("Makefile", srcdir), + locate("configure", srcdir), + locate("*.[aims][cnk4h]", srcdir, exclude)) + + ncopied = 0 + + def _compareAndCopy(src, srcdir, destdir, exclude): + + d, f = os.path.split(src) + common_prefix = os.path.commonprefix((d, srcdir)) + subdir = re.sub(common_prefix, "", d)[1:] + targetdir = os.path.join(destdir, subdir) + if not os.path.exists(targetdir): + os.makedirs(targetdir) + old_file = os.path.join(targetdir, f) + if os.path.exists(old_file): + md5_old = hashlib.md5( + "".join(open(old_file, "r", encoding="utf-8").readlines()).encode()).digest() + md5_new = hashlib.md5( + "".join(open(src, "r", encoding="utf-8").readlines()).encode()).digest() + if md5_old != md5_new: + raise ValueError( + "incompatible files for %s and %s" % + (old_file, src)) + + shutil.copy(src, targetdir) + return old_file + + for src_file in hfiles: + _compareAndCopy(src_file, srcdir, destdir, exclude) + ncopied += 1 + + for src_file in mfiles: + _compareAndCopy(src_file, srcdir, destdir, exclude) + ncopied += 1 + + cf = [] + for src_file in cfiles: + cf.append(_compareAndCopy(src_file, + srcdir, + destdir, + exclude)) + ncopied += 1 + + sys.stdout.write( + "installed latest source code from %s: " + "%i files copied\n" % (srcdir, ncopied)) + + if dest in MAIN: + # redirect stderr to pysamerr and replace bam.h with a stub. + sys.stdout.write("applying stderr redirection\n") + + _update_pysam_files(cf, destdir) + + def _getVersion(srcdir): + with open(os.path.join(srcdir, "version.sh"), encoding="utf-8") as inf: + for line in inf: + m = re.match(r"VERSION=(\S+)", line) + if m: return m.group(1) + raise ValueError("no VERSION line in version.sh") + + def _update_version_file(key, value, filename): + tmpfilename = filename + ".tmp" + with open(filename, encoding="utf-8") as inf: + with open(tmpfilename, "w", encoding="utf-8") as outf: + for line in inf: + if key in line: + line = re.sub(r'"[^"]*"', '"{}"'.format(value), line) + outf.write(line) + os.rename(tmpfilename, filename) + + def _update_version_doc_file(dest, value, filename): + tmpfilename = filename + ".tmp" + with open(filename, encoding="utf-8") as inf: + with open(tmpfilename, "w", encoding="utf-8") as outf: + for line in inf: + if " wraps " in line: + # hide the sentence's fullstop from the main regexp + line = re.sub(r'\.$', ',DOT', line) + line = re.sub(r'{}-[^*,]*'.format(dest), + '{}-{}'.format(dest, value), line) + line = re.sub(',DOT', '.', line) + outf.write(line) + os.rename(tmpfilename, filename) + + version = _getVersion(srcdir) + _update_version_file("__{}_version__".format(dest), version, "pysam/version.py") + _update_version_file(C_VERSION[dest], version + " (pysam)", "pysam/version.h") + _update_version_doc_file(dest, version, "README.rst") + _update_version_doc_file(dest, version, "doc/index.rst") + + sys.exit(0) + + +# if len(sys.argv) >= 2 and sys.argv[1] == "refresh": +# sys.stdout.write("refreshing latest source code from .c to .pysam.c") +# # redirect stderr to pysamerr and replace bam.h with a stub. +# sys.stdout.write("applying stderr redirection") +# for destdir in ('samtools', ): +# pysamcfiles = locate("*.pysam.c", destdir) +# for f in pysamcfiles: +# os.remove(f) +# cfiles = locate("*.c", destdir) +# _update_pysam_files(cfiles, destdir) + +# sys.exit(0) + diff --git a/devtools/install-CGAT-tools.sh b/devtools/install-CGAT-tools.sh new file mode 100755 index 0000000..e45d391 --- /dev/null +++ b/devtools/install-CGAT-tools.sh @@ -0,0 +1,282 @@ +#!/usr/bin/env bash + +# function to detect the Operating System +detect_os(){ + +if [ -f /etc/os-release ]; then + + OS=$(cat /etc/os-release | awk '/VERSION_ID/ {sub("="," "); print $2;}' | sed 's/\"//g' | awk '{sub("\\."," "); print $1;}') + if [ "$OS" != "12" ] ; then + + echo + echo " Ubuntu version not supported " + echo + echo " Only Ubuntu 12.x has been tested so far " + echo + exit 1; + + fi + + OS="ubuntu" + +elif [ -f /etc/system-release ]; then + + OS=$(cat /etc/system-release | awk ' {print $4;}' | awk '{sub("\\."," "); print $1;}') + if [ "$OS" != "6" ] ; then + echo + echo " Scientific Linux version not supported " + echo + echo " Only 6.x Scientific Linux has been tested so far " + echo + exit 1; + fi + + OS="sl" + +else + + echo + echo " Operating system not supported " + echo + echo " Exiting installation " + echo + exit 1; + +fi +} # detect_os + +# message to display when the OS is not correct +sanity_check_os() { + echo + echo " Unsupported operating system: $OS " + echo " Installation aborted " + echo + exit 1; +} # sanity_check_os + +# function to install operating system dependencies +install_os_packages() { + +if [ "$OS" == "ubuntu" -o "$OS" == "travis" ] ; then + + echo + echo " Installing packages for Ubuntu " + echo + + apt-get install -y gcc g++ + +elif [ "$OS" == "sl" ] ; then + + echo + echo " Installing packages for Scientific Linux " + echo + + yum -y install gcc zlib-devel gcc-c++ + +else + + sanity_check_os + +fi # if-OS +} # install_os_packages + +# function to install Python dependencies +install_python_deps() { + +if [ "$OS" == "ubuntu" -o "$OS" == "sl" ] ; then + + echo + echo " Installing Python dependencies for $1 " + echo + + # Create virtual environment + cd + mkdir CGAT + cd CGAT + wget --no-check-certificate https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.10.1.tar.gz + tar xvfz virtualenv-1.10.1.tar.gz + rm virtualenv-1.10.1.tar.gz + cd virtualenv-1.10.1 + python virtualenv.py cgat-venv + source cgat-venv/bin/activate + + # Install Python prerequisites + pip install cython + +elif [ "$OS" == "travis" ] ; then + # Travis-CI provides a virtualenv with Python 2.7 + echo + echo " Installing Python dependencies in travis " + echo + + # Install Python prerequisites + pip install cython + pip install nose + +else + + sanity_check_os + +fi # if-OS +} # install_python_deps + +# common set of tasks to prepare external dependencies +nosetests_external_deps() { +echo +echo " Running nosetests for $1 " +echo + +pushd . + +# create a new folder to store external tools +mkdir -p $HOME/CGAT/external-tools + +# install samtools +cd $HOME/CGAT/external-tools +curl -L http://downloads.sourceforge.net/project/samtools/samtools/1.3/samtools-1.3.tar.bz2 > samtools-1.3.tar.bz2 +tar xjf samtools-1.3.tar.bz2 +cd samtools-1.3 +make +PATH=$PATH:$HOME/CGAT/external-tools/samtools-1.3 + +echo "installed samtools" +samtools --version + +if [ $? != 0 ]; then + exit 1 +fi + +# install bcftools +cd $HOME/CGAT/external-tools +curl -L https://github.com/samtools/bcftools/releases/download/1.3/bcftools-1.3.tar.bz2 > bcftools-1.3.tar.bz2 +tar xjf bcftools-1.3.tar.bz2 +cd bcftools-1.3 +make +PATH=$PATH:$HOME/CGAT/external-tools/bcftools-1.3 + +echo "installed bcftools" +bcftools --version + +if [ $? != 0 ]; then + exit 1 +fi + +popd + +} # nosetests_external_deps + + +# function to run nosetests +run_nosetests() { + +echo +echo " Running nosetests for $1 " +echo + +# prepare external dependencies +nosetests_external_deps $OS + +# install code +python setup.py install + +# change into tests directory. Otherwise, +# 'import pysam' will import the repository, +# not the installed version. This causes +# problems in the compilation test. +cd tests + +# create auxiliary data +echo +echo 'building test data' +echo +make -C pysam_data all +make -C cbcf_data all +make -C tabix_data all + +# run nosetests +# -s: do not capture stdout, conflicts with pysam.dispatch +# -v: verbose output +nosetests -s -v + +} # run_nosetests + +# function to display help message +help_message() { +echo +echo " Use this script as follows: " +echo +echo " 1) Become root and install the operating system* packages: " +echo " ./install-CGAT-tools.sh --install-os-packages" +echo +echo " 2) Now, as a normal user (non root), install the Python dependencies**: " +echo " ./install-CGAT-tools.sh --install-python-deps" +echo +echo " At this stage the CGAT Code Collection is ready to go and you do not need further steps. Please type the following for more information:" +echo " source $HOME/CGAT/virtualenv-1.10.1/cgat-venv/bin/activate" +echo " cgat --help " +echo +echo " The CGAT Code Collection tests the software with nosetests. If you are interested in running those, please continue with the following steps:" +echo +echo " 3) Become root to install external tools and set up the environment: " +echo " ./install-CGAT-tools.sh --install-nosetests-deps" +echo +echo " 4) Then, back as a normal user (non root), run nosetests as follows:" +echo " ./install-CGAT-tools.sh --run-nosetests" +echo +echo " NOTES: " +echo " * Supported operating systems: Ubuntu 12.x and Scientific Linux 6.x " +echo " ** An isolated virtual environment will be created to install Python dependencies " +echo +exit 1; +} + + +# the main script starts here + +if [ $# -eq 0 -o $# -gt 1 ] ; then + + help_message + +else + + if [ "$1" == "--help" ] ; then + + help_message + + elif [ "$1" == "--travis" ] ; then + + OS="travis" + install_os_packages + install_python_deps + run_nosetests + + elif [ "$1" == "--install-os-packages" ] ; then + + detect_os + install_os_packages + + elif [ "$1" == "--install-python-deps" ] ; then + + detect_os + install_python_deps + + elif [ "$1" == "--install-nosetests-deps" ] ; then + + detect_os + install_nosetests_deps + + elif [ "$1" == "--run-nosetests" ] ; then + + detect_os + run_nosetests + + else + + echo + echo " Incorrect input parameter: $1 " + help_message + + fi # if argument 1 + +fi # if number of input parameters + diff --git a/devtools/run_tests_travis.sh b/devtools/run_tests_travis.sh new file mode 100755 index 0000000..1f14fc3 --- /dev/null +++ b/devtools/run_tests_travis.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash + +# test script for pysam. +# The script performs the following tasks: +# 1. Setup a conda environment and install dependencies via conda +# 2. Build pysam via the conda recipe +# 3. Build pysam via setup.py from repository +# 4. Run tests on the setup.py version +# 5. Additional build tests +# 5.1 pip install with cython +# 5.2 pip install without cython +# 5.3 pip install without cython and without configure options + +pushd . + +WORKDIR=`pwd` + +#Install miniconda python +if [ $TRAVIS_OS_NAME == "osx" ]; then + wget -q https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -O Miniconda3.sh +else + wget -q https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda3.sh --no-check-certificate # Default OS versions are old and have SSL / CERT issues +fi + +bash Miniconda3.sh -b + +# Create a new conda environment with the target python version +~/miniconda3/bin/conda install conda-build -y +~/miniconda3/bin/conda create -q -y --name testenv python=$CONDA_PY cython numpy pytest psutil pip + +# activate testenv environment +source ~/miniconda3/bin/activate testenv + +conda config --add channels defaults +conda config --add channels bioconda +conda config --add channels conda-forge + +# pin versions, so that tests do not fail when pysam/htslib out of step +# add htslib dependencies +# NB: force conda-forge:blas due to conda/conda#7548 +conda install -y "samtools>=1.11" "bcftools>=1.11" "htslib>=1.11" xz curl bzip2 "conda-forge::blas=*=openblas" + +# As HTSLIB_MODE is (defaulted to) 'shared', ensure we don't pick up +# the external headers from the Conda-installed htslib package. +mv $CONDA_PREFIX/include/htslib $CONDA_PREFIX/include/htslib-disable + +export HTSLIB_CONFIGURE_OPTIONS="--disable-libcurl" + +echo "show samtools, htslib, and bcftools versions" +samtools --version +htsfile --version +bcftools --version + +# Try building conda recipe first +~/miniconda3/bin/conda-build devtools/conda-recipe/ --python=$CONDA_PY + +# install code from the repository via setup.py +echo +echo "============ installing via setup.py from repository ============" +echo +python setup.py install || exit + +# create auxiliary data +echo +echo 'building test data' +echo +make -C tests/pysam_data +make -C tests/cbcf_data +make -C tests/tabix_data + +# echo any limits that are in place +ulimit -a + +# run tests +pytest + +if [ $? != 0 ]; then + exit 1 +fi + +# build source tar-ball. Make sure to run 'build' target so that .pyx +# files are cythonized. +python setup.py build sdist + +if [ $? != 0 ]; then + exit 1 +fi + +# check for presence of config.h files +echo "checking for presence of config.h files in tar-ball" +tar -tvzf dist/pysam-*.tar.gz | grep "config.h$" + +if [ $? != 1 ]; then + echo "ERROR: found config.h in tar-ball" + tar -tvzf dist/pysam-*.tar.gz | grep "config.h%" + exit 1 +fi + +# test pip installation from tar-ball with cython +echo "pip installing with cython" +pip install --verbose --no-deps --no-binary=:all: dist/pysam-*.tar.gz + +if [ $? != 0 ]; then + exit 1 +fi + +# attempt pip installation without cython +echo "pip installing without cython" +~/miniconda3/bin/conda remove -y cython +~/miniconda3/bin/conda list +echo "python is" `which python` +pip install --verbose --no-deps --no-binary=:all: --force-reinstall --upgrade dist/pysam-*.tar.gz + +if [ $? != 0 ]; then + exit 1 +fi + +# attempt pip installation without cython and without +# command line options +echo "pip installing without cython and no configure options" +export HTSLIB_CONFIGURE_OPTIONS="" +pip install --verbose --no-deps --no-binary=:all: --force-reinstall --upgrade dist/pysam-*.tar.gz + +if [ $? != 0 ]; then + exit 1 +fi diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..69e4e3a --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,96 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +DIR_PUBLISH=/ifs/home/andreas/public_html/documentation/pysam + +.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " publish to copy the HTML documentation to the server." + +clean: + -rm -rf _build/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html + @echo + @echo "Build finished. The HTML pages are in _build/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) _build/dirhtml + @echo + @echo "Build finished. The HTML pages are in _build/dirhtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) _build/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in _build/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) _build/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in _build/qthelp, like this:" + @echo "# qcollectiongenerator _build/qthelp/samtools.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile _build/qthelp/samtools.qhc" + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex + @echo + @echo "Build finished; the LaTeX files are in _build/latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes + @echo + @echo "The overview file is in _build/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in _build/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in _build/doctest/output.txt." + +publish: + rm -rf $(DIR_PUBLISH) + mkdir -p $(DIR_PUBLISH) + cp -r _build/html/* $(DIR_PUBLISH) diff --git a/doc/api.rst b/doc/api.rst new file mode 100644 index 0000000..47fe314 --- /dev/null +++ b/doc/api.rst @@ -0,0 +1,230 @@ +============ +Introduction +============ + +Pysam is a python module that makes it easy to read and manipulate +mapped short read sequence data stored in SAM/BAM files. It is a +lightweight wrapper of the htslib_ C-API. + +This page provides a quick introduction in using pysam followed by the +API. See :ref:`usage` for more detailed usage instructions. + +To use the module to read a file in BAM format, create a +:class:`~pysam.AlignmentFile` object:: + + import pysam + samfile = pysam.AlignmentFile("ex1.bam", "rb") + +Once a file is opened you can iterate over all of the read mapping to +a specified region using :meth:`~pysam.AlignmentFile.fetch`. Each +iteration returns a :class:`~pysam.AlignedSegment` object which +represents a single read along with its fields and optional tags:: + + for read in samfile.fetch('chr1', 100, 120): + print(read) + + samfile.close() + +To give:: + + EAS56_57:6:190:289:82 0 99 <<<7<<<;<<<<<<<<8;;<7;4<;<;;;;;94<; 69 CTCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA 0 192 1 + EAS56_57:6:190:289:82 0 99 <<<<<<;<<<<<<<<<<;<<;<<<<;8<6;9;;2; 137 AGGGGTGCAGAGCCGAGTCACGGGGTTGCCAGCAC 73 64 1 + EAS51_64:3:190:727:308 0 102 <<<<<<<<<<<<<<<<<<<<<<<<<<<::<<<844 99 GGTGCAGAGCCGAGTCACGGGGTTGCCAGCACAGG 99 18 1 + ... + +You can also write to a :class:`~pysam.AlignmentFile`:: + + import pysam + samfile = pysam.AlignmentFile("ex1.bam", "rb") + pairedreads = pysam.AlignmentFile("allpaired.bam", "wb", template=samfile) + for read in samfile.fetch(): + if read.is_paired: + pairedreads.write(read) + + pairedreads.close() + samfile.close() + +An alternative way of accessing the data in a SAM file is by iterating +over each base of a specified region using the +:meth:`~pysam.AlignmentFile.pileup` method. Each iteration returns a +:class:`~pysam.PileupColumn` which represents all the reads in the SAM +file that map to a single base in the reference sequence. The list of +reads are represented as :class:`~pysam.PileupRead` objects in the +:attr:`PileupColumn.pileups ` property:: + + import pysam + samfile = pysam.AlignmentFile("ex1.bam", "rb" ) + for pileupcolumn in samfile.pileup("chr1", 100, 120): + print("\ncoverage at base %s = %s" % (pileupcolumn.pos, pileupcolumn.n)) + for pileupread in pileupcolumn.pileups: + if not pileupread.is_del and not pileupread.is_refskip: + # query position is None if is_del or is_refskip is set. + print('\tbase in read %s = %s' % + (pileupread.alignment.query_name, + pileupread.alignment.query_sequence[pileupread.query_position])) + + samfile.close() + +The above code outputs:: + + coverage at base 99 = 1 + base in read EAS56_57:6:190:289:82 = A + + coverage at base 100 = 1 + base in read EAS56_57:6:190:289:82 = G + + coverage at base 101 = 1 + base in read EAS56_57:6:190:289:82 = G + + coverage at base 102 = 2 + base in read EAS56_57:6:190:289:82 = G + base in read EAS51_64:3:190:727:308 = G + ... + +Commands available in `samtools`_ are available as simple +function calls. For example:: + + pysam.sort("-o", "output.bam", "ex1.bam") + +corresponds to the command line:: + + samtools sort -o output.bam ex1.bam + +Analogous to :class:`~pysam.AlignmentFile`, a +:class:`~pysam.TabixFile` allows fast random access to compressed and +tabix indexed tab-separated file formats with genomic data:: + + import pysam + tabixfile = pysam.TabixFile("example.gtf.gz") + + for gtf in tabixfile.fetch("chr1", 1000, 2000): + print(gtf.contig, gtf.start, gtf.end, gtf.gene_id) + +:class:`~pysam.TabixFile` implements lazy parsing in order to iterate +over large tables efficiently. + +More detailed usage instructions is at :ref:`usage`. + +.. note:: + + Coordinates in pysam are always 0-based (following the python + convention). SAM text files use 1-based coordinates. + +.. note:: + + The above examples can be run in the :file:`tests` directory of the + installation directory. Type 'make' before running them. + +.. seealso:: + + https://github.com/pysam-developers/pysam + + The pysam code repository, containing source code and download + instructions + + http://pysam.readthedocs.org/en/latest/ + + The pysam website containing documentation + +=== +API +=== + +SAM/BAM/CRAM files +================== + +Objects of type :class:`~pysam.AlignmentFile` allow working with +BAM/SAM formatted files. + +.. autoclass:: pysam.AlignmentFile + :members: + +.. autoclass:: pysam.AlignmentHeader + :members: + +An :class:`~pysam.AlignedSegment` represents an aligned segment within +a SAM/BAM file. + +.. autoclass:: pysam.AlignedSegment + :members: + +.. autoclass:: pysam.PileupColumn + :members: + +.. autoclass:: pysam.PileupRead + :members: + +.. autoclass:: pysam.IndexedReads + :members: + + +Tabix files +=========== + +:class:`~pysam.TabixFile` opens tabular files that have been +indexed with tabix_. + +.. autoclass:: pysam.TabixFile + :members: + +To iterate over tabix files, use :func:`~pysam.tabix_iterator`: + +.. autofunction:: pysam.tabix_iterator + +.. autofunction:: pysam.tabix_compress + +.. autofunction:: pysam.tabix_index + +.. autoclass:: pysam.asTuple + :members: + +.. autoclass:: pysam.asVCF + :members: + +.. autoclass:: pysam.asBed + :members: + +.. autoclass:: pysam.asGTF + :members: + + +FASTA files +=========== + +.. autoclass:: pysam.FastaFile + :members: + +FASTQ files +=========== + +.. autoclass:: pysam.FastxFile + :members: + + +.. autoclass:: pysam.FastqProxy + :members: + + +VCF/BCF files +============= + +.. autoclass:: pysam.VariantFile + :members: + +.. autoclass:: pysam.VariantHeader + :members: + +.. autoclass:: pysam.VariantRecord + :members: + +.. autoclass:: pysam.VariantHeaderRecord + :members: + +HTSFile +======= + +HTSFile is the base class for :class:`pysam.AlignmentFile` and +:class:`pysam.VariantFile`. + +.. autoclass:: pysam.HTSFile + :members: diff --git a/doc/benchmarking.rst b/doc/benchmarking.rst new file mode 100644 index 0000000..8fc054a --- /dev/null +++ b/doc/benchmarking.rst @@ -0,0 +1,70 @@ +.. _Benchmarking: + +============ +Benchmarking +============ + +Latest benchmarking results:: + + ------------------------------------------------------------------------------------------------------------------------ benchmark: 57 tests ------------------------------------------------------------------------------------------------------------------------ + Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + test_set_binary_tag 93.8382 (1.0) 199.8786 (1.0) 96.1554 (1.0) 2.6241 (1.0) 95.7036 (1.0) 1.2442 (1.0) 276;303 10,399.8372 (1.0) 3170 1 + test_fasta_iteration_long_sequences_without_persistence 145.3292 (1.55) 296.4940 (1.48) 176.5367 (1.84) 30.0896 (11.47) 167.2544 (1.75) 25.1532 (20.22) 840;579 5,664.5438 (0.54) 4972 1 + test_fasta_iteration_long_sequences_as_file 149.0638 (1.59) 312.6319 (1.56) 177.2990 (1.84) 30.5218 (11.63) 168.6383 (1.76) 27.7516 (22.30) 669;510 5,640.1883 (0.54) 4493 1 + test_fasta_iteration_long_sequences 150.3211 (1.60) 429.9153 (2.15) 176.7384 (1.84) 30.7021 (11.70) 167.5002 (1.75) 21.7482 (17.48) 682;647 5,658.0803 (0.54) 4845 1 + test_fasta_iteration_short_sequences_as_file 190.6604 (2.03) 395.8736 (1.98) 216.6984 (2.25) 32.8710 (12.53) 208.9385 (2.18) 16.8057 (13.51) 291;326 4,614.7086 (0.44) 3205 1 + test_read_python_uncompressed 214.1297 (2.28) 450.2051 (2.25) 234.6956 (2.44) 33.3642 (12.71) 223.4913 (2.34) 15.0129 (12.07) 140;221 4,260.8375 (0.41) 2043 1 + test_fastq_iteration_short_sequences_as_file 217.5961 (2.32) 420.1643 (2.10) 238.0264 (2.48) 30.4469 (11.60) 228.8874 (2.39) 15.5573 (12.50) 209;235 4,201.2146 (0.40) 2877 1 + test_iterate_file_uncompressed 225.5719 (2.40) 481.0989 (2.41) 249.7603 (2.60) 40.7266 (15.52) 239.5548 (2.50) 15.9908 (12.85) 209;327 4,003.8387 (0.38) 3627 1 + test_iterate_file_compressed 257.5517 (2.74) 576.6843 (2.89) 287.2536 (2.99) 49.8803 (19.01) 277.4149 (2.90) 14.3824 (11.56) 126;248 3,481.2446 (0.33) 3023 1 + test_iterate_generic_uncompressed 344.8855 (3.68) 712.5959 (3.57) 370.9369 (3.86) 46.2477 (17.62) 365.0384 (3.81) 15.7915 (12.69) 54;83 2,695.8763 (0.26) 2240 1 + test_iterate_parsed_uncompressed 349.3819 (3.72) 765.3460 (3.83) 378.1446 (3.93) 54.2199 (20.66) 369.5488 (3.86) 15.4320 (12.40) 48;69 2,644.4910 (0.25) 1638 1 + test_read_python_compressed 462.0645 (4.92) 836.2234 (4.18) 493.6158 (5.13) 51.2946 (19.55) 485.5469 (5.07) 11.4385 (9.19) 28;46 2,025.8670 (0.19) 906 1 + test_iterate_parsed_compressed 586.5730 (6.25) 1,050.1631 (5.25) 632.5464 (6.58) 82.6438 (31.49) 608.1080 (6.35) 20.1799 (16.22) 115;143 1,580.9117 (0.15) 1474 1 + test_iterate_generic_compressed 587.7707 (6.26) 1,093.4286 (5.47) 639.6830 (6.65) 85.2593 (32.49) 612.6408 (6.40) 19.9433 (16.03) 105;144 1,563.2743 (0.15) 1260 1 + test_fasta_iteration_short_sequences_without_persistence 725.2563 (7.73) 1,091.6069 (5.46) 774.6549 (8.06) 53.0901 (20.23) 751.8455 (7.86) 45.0788 (36.23) 172;110 1,290.8974 (0.12) 1276 1 + test_read_binary_tag 817.2598 (8.71) 1,232.0559 (6.16) 902.7002 (9.39) 87.7807 (33.45) 871.5261 (9.11) 17.4227 (14.00) 39;55 1,107.7875 (0.11) 331 1 + test_fastq_iteration_short_sequences_without_persistence 840.3640 (8.96) 1,201.5756 (6.01) 870.9679 (9.06) 35.8709 (13.67) 866.1682 (9.05) 15.9768 (12.84) 53;85 1,148.1480 (0.11) 1124 1 + test_count_number_lines_from_sam_with_pysam 2,755.6140 (29.37) 9,656.9806 (48.31) 2,963.2206 (30.82) 729.0077 (277.81) 2,814.3115 (29.41) 106.2388 (85.38) 8;14 337.4707 (0.03) 281 1 + test_fasta_iteration_short_sequences 2,905.5942 (30.96) 3,674.1439 (18.38) 2,982.3892 (31.02) 90.9585 (34.66) 2,941.2108 (30.73) 96.1348 (77.26) 27;7 335.3016 (0.03) 302 1 + test_fastq_iteration_short_sequences 3,601.3145 (38.38) 4,065.5769 (20.34) 3,671.8361 (38.19) 71.5348 (27.26) 3,635.1625 (37.98) 81.5415 (65.53) 43;10 272.3433 (0.03) 243 1 + test_count_number_lines_from_bam_with_pysam 4,178.8872 (44.53) 12,063.5536 (60.35) 4,395.9713 (45.72) 794.3991 (302.73) 4,240.1757 (44.31) 67.0198 (53.86) 6;19 227.4810 (0.02) 205 1 + test_build_depth_from_bam_with_pysam 6,290.2980 (67.03) 6,788.0806 (33.96) 6,420.3862 (66.77) 126.5447 (48.22) 6,357.6270 (66.43) 94.3104 (75.80) 35;29 155.7539 (0.01) 145 1 + test_build_depth_with_filter_from_bam_with_pysam 6,935.8926 (73.91) 8,309.5767 (41.57) 7,085.6801 (73.69) 221.5069 (84.41) 7,005.6170 (73.20) 74.4388 (59.83) 14;27 141.1297 (0.01) 139 1 + test_build_query_positions_from_bam_with_pysam 8,729.2437 (93.02) 16,836.6525 (84.23) 9,173.2902 (95.40) 1,057.4321 (402.97) 8,885.4395 (92.84) 264.7634 (212.79) 3;9 109.0121 (0.01) 103 1 + test_build_mapping_qualities_from_bam_with_pysam 8,805.0570 (93.83) 15,829.8910 (79.20) 9,274.7475 (96.46) 964.6925 (367.63) 9,004.7438 (94.09) 354.9103 (285.24) 4;9 107.8196 (0.01) 106 1 + test_build_query_qualities_from_bam_with_pysam 8,947.6798 (95.35) 16,756.8158 (83.83) 9,272.9117 (96.44) 1,008.7759 (384.43) 9,017.0493 (94.22) 217.2068 (174.57) 3;5 107.8410 (0.01) 94 1 + test_build_query_bases_from_bam_with_samtoolspysam 9,149.0448 (97.50) 9,776.0092 (48.91) 9,208.3405 (95.77) 86.1889 (32.85) 9,190.2809 (96.03) 34.1963 (27.48) 5;7 108.5972 (0.01) 84 1 + test_count_number_lines_from_bam_with_samtoolspipe 10,431.4052 (111.16) 13,431.7447 (67.20) 11,052.2360 (114.94) 445.8241 (169.90) 11,014.8042 (115.09) 492.6044 (395.91) 17;3 90.4794 (0.01) 90 1 + test_count_number_lines_from_bam_with_samtools 12,057.8520 (128.50) 13,537.5429 (67.73) 12,595.0708 (130.99) 381.1799 (145.26) 12,499.5783 (130.61) 457.8107 (367.94) 25;1 79.3961 (0.01) 73 1 + test_count_number_lines_from_sam_with_samtoolspipe 12,434.8756 (132.51) 14,234.1983 (71.21) 13,034.1032 (135.55) 371.0373 (141.40) 13,049.9089 (136.36) 464.8147 (373.57) 21;3 76.7218 (0.01) 72 1 + test_build_query_bases_from_bam_with_pysam 12,811.6887 (136.53) 19,972.7099 (99.92) 13,268.7908 (137.99) 1,103.9459 (420.70) 13,023.1632 (136.08) 202.3596 (162.64) 4;6 75.3648 (0.01) 76 1 + test_build_pileup_from_bam_with_samtoolspipe 13,480.7490 (143.66) 15,413.4836 (77.11) 13,968.3817 (145.27) 362.1282 (138.00) 13,917.4843 (145.42) 447.9736 (360.04) 12;3 71.5903 (0.01) 66 1 + test_count_number_lines_from_sam_with_samtools 13,963.2300 (148.80) 15,936.2238 (79.73) 14,442.5627 (150.20) 340.4846 (129.75) 14,395.4996 (150.42) 339.3036 (272.70) 12;2 69.2398 (0.01) 59 1 + test_build_pileup_from_bam_with_samtoolsshell 15,140.2969 (161.34) 16,469.8567 (82.40) 15,525.9034 (161.47) 256.0741 (97.59) 15,526.7641 (162.24) 318.5044 (255.98) 13;2 64.4085 (0.01) 51 1 + test_build_depth_from_bam_with_samtoolsshell 15,291.4841 (162.96) 16,387.9916 (81.99) 15,656.5365 (162.83) 217.2420 (82.79) 15,609.9945 (163.11) 258.9412 (208.11) 16;2 63.8711 (0.01) 57 1 + test_build_query_bases_from_bam_with_samtoolspipe 15,478.0652 (164.94) 17,068.8462 (85.40) 16,072.5749 (167.15) 327.6668 (124.87) 16,040.5049 (167.61) 428.1597 (344.11) 18;2 62.2178 (0.01) 60 1 + test_build_query_bases_from_bam_with_samtoolsshell 15,765.5794 (168.01) 17,102.8059 (85.57) 16,305.4955 (169.57) 367.6865 (140.12) 16,256.2486 (169.86) 593.9230 (477.34) 20;0 61.3290 (0.01) 57 1 + test_build_depth_from_bam_with_samtoolspipe 16,024.7944 (170.77) 25,804.2309 (129.10) 17,041.3497 (177.23) 1,522.0046 (580.01) 16,726.8887 (174.78) 767.1015 (616.52) 1;1 58.6808 (0.01) 40 1 + test_build_query_qualities_from_bam_with_samtoolspipe 16,275.7467 (173.44) 18,501.0433 (92.56) 17,262.6517 (179.53) 642.2656 (244.76) 17,255.3696 (180.30) 1,060.3429 (852.20) 20;0 57.9285 (0.01) 51 1 + test_build_pileup_from_bam_with_pysam 16,632.5681 (177.25) 19,306.6560 (96.59) 17,037.7162 (177.19) 531.0751 (202.38) 16,870.8330 (176.28) 279.1677 (224.37) 3;4 58.6933 (0.01) 32 1 + test_build_mapping_qualities_from_bam_with_samtoolspipe 17,398.3518 (185.41) 18,481.6569 (92.46) 17,832.1261 (185.45) 294.9103 (112.39) 17,837.8206 (186.39) 511.8400 (411.37) 21;0 56.0786 (0.01) 52 1 + test_build_query_names_from_bam_with_pysam 31,534.0199 (336.05) 38,316.2647 (191.70) 32,677.2804 (339.84) 1,371.6101 (522.70) 32,179.0325 (336.24) 1,392.1391 (>1000.0) 3;1 30.6023 (0.00) 30 1 + test_fetch_plain 43,747.1233 (466.20) 48,690.7829 (243.60) 44,573.8085 (463.56) 1,170.8588 (446.20) 44,067.5411 (460.46) 1,436.5837 (>1000.0) 3;1 22.4347 (0.00) 22 1 + test_build_query_positions_from_bam_with_samtoolspipe 46,316.5548 (493.58) 53,700.3577 (268.66) 48,235.6640 (501.64) 1,861.0317 (709.21) 47,625.2194 (497.63) 2,603.7074 (>1000.0) 6;1 20.7315 (0.00) 21 1 + test_build_query_bases_with_reference_from_bam_with_samtoolspysam 51,565.1479 (549.51) 53,523.1121 (267.78) 51,778.6650 (538.49) 424.4621 (161.76) 51,656.8925 (539.76) 110.5051 (88.81) 1;4 19.3130 (0.00) 20 1 + test_build_query_bases_with_reference_from_bam_with_pysam 58,850.6740 (627.15) 62,164.5451 (311.01) 60,161.6779 (625.67) 1,120.6101 (427.05) 59,595.2785 (622.71) 1,995.0196 (>1000.0) 7;0 16.6219 (0.00) 16 1 + test_iterate_file_large_uncompressed 59,419.9076 (633.22) 69,053.0874 (345.48) 62,825.7126 (653.38) 3,805.1150 (>1000.0) 60,805.1391 (635.35) 6,407.6949 (>1000.0) 3;0 15.9170 (0.00) 14 1 + test_iterate_file_large_compressed 63,986.9571 (681.89) 74,156.9120 (371.01) 68,370.8835 (711.05) 3,254.6200 (>1000.0) 67,221.2075 (702.39) 4,770.3525 (>1000.0) 5;0 14.6261 (0.00) 16 1 + test_read_python_large_uncompressed 67,611.8080 (720.51) 89,112.1533 (445.83) 73,631.8916 (765.76) 5,978.7052 (>1000.0) 71,702.4822 (749.21) 7,856.0165 (>1000.0) 2;1 13.5811 (0.00) 13 1 + test_fetch_parsed 72,237.5344 (769.81) 81,976.9856 (410.13) 74,540.4099 (775.21) 2,326.3668 (886.54) 74,016.3419 (773.39) 1,579.0667 (>1000.0) 1;1 13.4155 (0.00) 14 1 + test_build_query_bases_from_bam_with_pysam_pileups 75,841.3766 (808.21) 87,975.1425 (440.14) 79,393.9784 (825.68) 3,516.2458 (>1000.0) 79,346.7313 (829.09) 5,217.5033 (>1000.0) 2;0 12.5954 (0.00) 13 1 + test_build_query_bases_with_reference_from_bam_with_samtoolspipe 131,162.9396 (>1000.0) 132,858.8147 (664.70) 131,838.0199 (>1000.0) 595.6090 (226.98) 131,801.5633 (>1000.0) 956.9665 (769.11) 2;0 7.5851 (0.00) 8 1 + test_iterate_parsed_large_uncompressed 132,991.8914 (>1000.0) 140,153.4099 (701.19) 134,101.5892 (>1000.0) 2,452.3161 (934.54) 133,218.1590 (>1000.0) 396.3616 (318.56) 1;1 7.4570 (0.00) 8 1 + test_iterate_generic_large_uncompressed 134,743.7277 (>1000.0) 142,329.4526 (712.08) 138,167.4954 (>1000.0) 3,346.7773 (>1000.0) 136,839.1849 (>1000.0) 6,541.1879 (>1000.0) 4;0 7.2376 (0.00) 8 1 + test_read_python_large_compressed 175,127.6311 (>1000.0) 190,855.1529 (954.86) 181,702.9339 (>1000.0) 5,756.2207 (>1000.0) 181,221.0185 (>1000.0) 8,577.6616 (>1000.0) 2;0 5.5035 (0.00) 6 1 + test_iterate_parsed_large_compressed 231,405.7611 (>1000.0) 243,728.8519 (>1000.0) 239,037.8296 (>1000.0) 5,212.7778 (>1000.0) 241,544.3324 (>1000.0) 8,062.6113 (>1000.0) 1;0 4.1834 (0.00) 5 1 + test_iterate_generic_large_compressed 235,042.3876 (>1000.0) 256,518.8371 (>1000.0) 242,535.5468 (>1000.0) 8,272.5197 (>1000.0) 240,163.0748 (>1000.0) 8,360.1568 (>1000.0) 1;0 4.1231 (0.00) 5 1 + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..aaf1d35 --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,228 @@ +# -*- coding: utf-8 -*- +# +# samtools documentation build configuration file, created by +# sphinx-quickstart on Wed Aug 12 14:43:42 2009. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os, setuptools + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +_build_obj = setuptools.dist.Distribution().get_command_obj('build') +_build_obj.ensure_finalized() + +_libdir = os.path.join('..', _build_obj.build_platlib) +if os.path.exists(_libdir): + sys.path.insert(0, os.path.abspath(_libdir)) + +# -- General configuration ----------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.todo', + 'sphinx.ext.ifconfig', + 'sphinx.ext.intersphinx', + 'sphinx.ext.napoleon'] + +intersphinx_mapping = {'python': ('https://docs.python.org/%d.%d' % sys.version_info[:2], None)} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'pysam' +copyright = u'2009–2021, Andreas Heger, Kevin Jacobs, et al' + +# Included at the end of each rst file +rst_epilog = ''' +.. _CGAT Training Programme: http://www.cgat.org +.. _pysam: https://github.com/pysam-developers/pysam +.. _samtools: http://samtools.sourceforge.net/ +.. _bcftools: https://samtools.github.io/bcftools/bcftools.html +.. _htslib: http://www.htslib.org/ +.. _tabix: http://www.htslib.org/doc/tabix.html +.. _Galaxy: https://main.g2.bx.psu.edu/ +.. _cython: https://cython.org/ +.. _python: https://www.python.org/ +.. _pypi: https://pypi.org/ +.. _pip: https://pip.pypa.io/ +.. _pyximport: https://github.com/cython/cython/tree/master/pyximport +.. _conda: https://conda.io/docs/ +.. _bioconda: https://bioconda.github.io/ +.. _sphinx: https://www.sphinx-doc.org/en/master/usage/installation.html +''' + +autosummary_generate = True + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +import pysam.version +# The short X.Y version. +version = pysam.version.__version__ +# The full version, including alpha/beta/rc tags. +release = version + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = '' +# Else, today_fmt is used as the format for a strftime call. +# today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +# unused_docs = [] + +# List of directories, relative to source directory, that shouldn't be searched +# for source files. +exclude_trees = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +# html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +# html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# html_additional_pages = {} + +# If false, no module index is generated. +# html_use_modindex = True + +# If false, no index is generated. +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# html_show_sourcelink = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'samtoolsdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +# latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +# latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'pysam.tex', u'pysam documentation', + u'Andreas Heger, Kevin Jacobs, et al.', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +# latex_preamble = '' + +# Documents to append as an appendix to all manuals. +# latex_appendices = [] + +# If false, no module index is generated. +# latex_use_modindex = True diff --git a/doc/developer.rst b/doc/developer.rst new file mode 100644 index 0000000..5bc3066 --- /dev/null +++ b/doc/developer.rst @@ -0,0 +1,80 @@ +================= +Developer's guide +================= + +Code organization +================= + +The top level directory is organized in the following +directories: + +:file:`pysam` + Code specific to pysam. + +:file:`doc` + The documentation. To build the latest documentation, first install + `Sphinx`_ and then type:: + + make -C doc html + +:file:`tests` + Code and data for testing and benchmarking. + +:file:`htslib` + Source code from `htslib`_ shipped with pysam. See + :file:`import.py` about importing. + +:file:`samtools` + Source code from `samtools`_ shipped with pysam. See + :file:`import.py` about importing. + +:file:`bcftools` + Source code from `bcftools`_ shipped with pysam. See + :file:`import.py` about importing. + + +Importing new versions of htslib and samtools +============================================= + +See instructions in :file:`import.py` to import the latest +versions of `htslib`_, `samtools`_ and `bcftools`_. + +Unit testing +============ + +Unit tests are in the :file:`tests` directory. To run all unit tests, +run:: + + pytest tests + +Most tests use test data from the :file:`tests/*_data` directories. +Some of these test data files are generated from other files in these +directories, which is done by running ``make`` in each directory:: + + make -C tests/pysam_data + # etc + +Alternatively if any :file:`tests/*_data/all.stamp` file is not already +present, running the unit tests should generate that directory's data +files automatically. + +Benchmarking +============ + +To run the benchmarking suite, make sure that `pytest-benchmark +`_ is installed. To run +all benchmarks, type:: + + pytest tests/*_bench.py + +See :ref:`Benchmarking` for more on this topic. + +Contributors +============ + +Please see Github for a list of all contributors: + +https://github.com/pysam-developers/pysam/graphs/contributors + +Many thanks to all contributors for helping in making pysam +useful. diff --git a/doc/faq.rst b/doc/faq.rst new file mode 100644 index 0000000..e2352eb --- /dev/null +++ b/doc/faq.rst @@ -0,0 +1,278 @@ +=== +FAQ +=== + +How should I cite pysam +======================= + +Pysam has not been published in print. When referring to pysam, please +use the github URL: https://github.com/pysam-developers/pysam. +As pysam is a wrapper around htslib and the samtools package, I +suggest citing [Li.2009]_, [Bonfield.2021]_, and/or [Danecek.2021]_, +as appropriate. + +Is pysam thread-safe? +===================== + +Pysam is a mix of python and C code. Instructions within python are +generally made thread-safe through python's `global interpreter lock`_ +(:dfn:`GIL`). This ensures that python data structures will always be in a +consistent state. + +If an external function outside python is called, the programmer has a +choice to keep the GIL in place or to release it. Keeping the GIL in +place will make sure that all python threads wait until the external +function has completed. This is a safe option and ensures +thread-safety. + +Alternatively, the GIL can be released while the external function is +called. This will allow other threads to run concurrently. This can be +beneficial if the external function is expected to halt, for example +when waiting for data to read or write. However, to achieve +thread-safety, the external function needs to be implemented with +thread-safety in mind. This means that there can be no shared state +between threads, or if there is shared, it needs to be controlled to +prevent any access conflicts. + +Pysam generally uses the latter option and aims to release the GIL for +I/O intensive tasks. This is generally fine, but thread-safety of all +parts have not been fully tested. + +A related issue is when different threads read from the same file +object - or the same thread uses two iterators over a file. There is +only a single file-position for each opened file. To prevent this from +happening, use the option ``multiple_iterators=True`` when calling +a fetch() method. This will return an iterator on a newly opened +file. + +pysam coordinates are wrong +=========================== + +pysam uses 0-based coordinates and the half-open notation for ranges +as does python. Coordinates and intervals reported from pysam always +follow that convention. + +Confusion might arise as different file formats might have different +conventions. For example, the SAM format is 1-based while the BAM +format is 0-based. It is important to remember that pysam will always +conform to the python convention and translate to/from the file format +automatically. + +The only exception is the :term:`region` string in the +:meth:`~pysam.AlignmentFile.fetch` and +:meth:`~pysam.AlignmentFile.pileup` methods. This string follows the +convention of the samtools command line utilities. The same is true +for any coordinates passed to the samtools command utilities directly, +such as :meth:`pysam.mpileup`. + +Calling pysam.fetch() confuses existing iterators +================================================= + +The following code will cause unexpected behaviour:: + + samfile = pysam.AlignmentFile("pysam_ex1.bam", "rb") + + iter1 = samfile.fetch("chr1") + print(next(iter1).reference_id) + iter2 = samfile.fetch("chr2") + print(next(iter2).reference_id) + print(next(iter1).reference_id) + +This will give the following output:: + + 0 + 1 + Traceback (most recent call last): + File "xx.py", line 8, in + print(next(iter1).reference_id) + File "libcalignmentfile.pyx", line 2103, + in pysam.libcalignmentfile.IteratorRowRegion.__next__ + StopIteration + +Note how the second iterator stops as the file pointer has moved to +chr2. The correct way to work with multiple iterators is:: + + samfile = pysam.AlignmentFile("pysam_ex1.bam", "rb") + + iter1 = samfile.fetch("chr1", multiple_iterators=True) + print(next(iter1).reference_id) + iter2 = samfile.fetch("chr2") + print(next(iter2).reference_id) + print(next(iter1).reference_id) + +Here, the output is:: + + 0 + 1 + 0 + +The reason for this behaviour is that every iterator needs to keep +track of its current position in the file. Within pysam, each opened +file can only keep track of one file position and hence there can only +be one iterator per file. Using the option ``multiple_iterators=True`` +will return an iterator within a newly opened file. This iterator will +not interfere with existing iterators as it has its own file handle +associated with it. + +Note that re-opening files incurs a performance penalty which can +become severe when calling :meth:`~pysam.AlignmentFile.fetch` often. +Thus, ``multiple_iterators`` is set to ``False`` by default. + +AlignmentFile.fetch does not show unmapped reads +================================================ + +:meth:`~pysam.AlignmentFile.fetch` will only iterate over alignments +in the SAM/BAM file. The following thus always works:: + + bf = pysam.AlignmentFile(fname, "rb") + for r in bf.fetch(): + assert not r.is_unmapped + +If the SAM/BAM file contains unaligned reads, they can be included +in the iteration by adding the ``until_eof=True`` flag:: + + bf = pysam.AlignmentFile(fname, "rb") + for r in bf.fetch(until_eof=True): + if r.is_unmapped: + print("read is unmapped") + +I can't call AlignmentFile.fetch on a file without an index +=========================================================== + +:meth:`~pysam.AlignmentFile.fetch` requires an index when +iterating over a SAM/BAM file. To iterate over a file without an +index, use ``until_eof=True``:: + + bf = pysam.AlignmentFile(fname, "rb") + for r in bf.fetch(until_eof=True): + print(r) + + +BAM files with a large number of reference sequences are slow +============================================================= + +If you have many reference sequences in a BAM file, the following +might be slow:: + + track = pysam.AlignmentFile(fname, "rb") + for aln in track.fetch(): + pass + +The reason is that track.fetch() will iterate through the BAM file +for each reference sequence in the order as it is defined in the +header. This might require a lot of jumping around in the file. To +avoid this, use:: + + track = pysam.AlignmentFile(fname, "rb") + for aln in track.fetch(until_eof=True): + pass + +This will iterate through reads as they appear in the file. + +Weirdness with spliced reads in samfile.pileup(chr,start,end) given spliced alignments from an RNA-seq bam file +=============================================================================================================== + +Spliced reads are reported within samfile.pileup. To ignore these +in your analysis, test the flags ``is_del == True and indel == 0`` +in the :class:`~.PileupRead` object. + +I can't edit quality scores in place +==================================== + +Editing reads in-place generally works, though there is one +quirk to be aware of. Assigning to AlignedSegment.query_sequence will invalidate +any quality scores in AlignedSegment.query_qualities. The reason is that samtools +manages the memory of the sequence and quality scores together +and thus requires them to always be of the same length or 0. + +Thus, to in-place edit the sequence and quality scores, copies of +the quality scores need to be taken. Consider trimming for example:: + + quals = read.query_qualities + read.query_sequence = read.query_sequence[5:10] + read.query_qualities = quals[5:10] + +Why is there no SNPCaller class anymore? +========================================= + +SNP calling is highly complex and heavily parameterized. There was a +danger that the pysam implementations might show different behaviour from the +samtools implementation, which would have caused a lot of confusion. + +The best way to use samtools SNP calling from python is to use the +:meth:`pysam.mpileup` command and parse the output directly. + +I get an error 'PileupProxy accessed after iterator finished' +============================================================= + +Pysam works by providing proxy objects to objects defined within +the C-samtools package. Thus, some attention must be paid to the +lifetime of objects. The following to code snippets will cause an +error:: + + s = AlignmentFile('ex1.bam') + for p in s.pileup('chr1', 1000,1010): + pass + + for pp in p.pileups: + print(pp) + +The iteration has finished, thus the contents of ``p`` are invalid. Another +variation of this:: + + p = next(AlignmentFile('ex1.bam').pileup('chr1', 1000, 1010)) + for pp in p.pileups: + print(pp) + +Again, the iteration finishes as the temporary iterator created +by pileup goes out of scope. The solution is to keep a handle +to the iterator that remains alive:: + + i = AlignmentFile('ex1.bam').pileup('chr1', 1000, 1010) + p = next(i) + for pp in p.pileups: + print(pp) + +Pysam won't compile +=================== + +Compiling pysam can be tricky as there are numerous variables that +differ between build environments such as OS, version, python version, +and compiler. It is difficult to build software that builds cleanly +on all systems and the process might fail. Please see the +`pysam user group +`_ +for common issues. + +If there is a build issue, read the generated output carefully - +generally the cause of the problem is among the first errors to be +reported. For example, you will need to have the development version +of python installed that includes the header files such as +:file:`Python.h`. If that file is missing, the compiler will report +this at the very top of its error messages but will follow it +with any unknown function or variable definition it encounters later +on. + +General advice is to always use the latest version on python_ and +cython_ when building pysam. There are some known incompatibilities: + +* Python 3.4 requires cython 0.20.2 or later (see `here + `_) + +.. _global interpreter lock: https://en.wikipedia.org/wiki/Global_interpreter_lock + +ImportError: cannot import name csamtools +========================================= + +In version 0.10.0 and onwards, all pysam extension modules contain a +``lib``-prefix. This facilates linking against pysam extension modules +with compilers that require to start with ``lib``. As a consequence, +all code using pysam extension modules directly will need to be +adapted. For example,:: + + cimport pysam.csamtools + +will become:: + + cimport pysam.libcsamtools + diff --git a/doc/glossary.rst b/doc/glossary.rst new file mode 100644 index 0000000..b67e2f4 --- /dev/null +++ b/doc/glossary.rst @@ -0,0 +1,144 @@ +======== +Glossary +======== + +.. glossary:: + :sorted: + + cigar + Stands for Compact Idiosyncratic Gapped Alignment Report and + represents a compressed (run-length encoded) pairwise alignment + format. It was first defined by the Exonerate Aligner, but was alter + adapted and adopted as part of the :term:`SAM` standard and many other + aligners. In the Python API, the cigar alignment is presented as a + list of tuples ``(operation,length)``. For example, the tuple ``[ + (0,3), (1,5), (0,2) ]`` refers to an alignment with 3 matches, 5 + insertions and another 2 matches. + + region + A genomic region, stated relative to a :term:`reference` sequence. A + region consists of reference name ('chr1'), start (15000), and + end (20000). Start and end can be omitted for regions spanning + a whole chromosome. If ``end`` is missing, the region will span from + ``start`` to the end of the chromosome. Within pysam, coordinates + are 0-based half-open intervals, i.e., the first base of the + reference sequence is numbered zero; and the base at position + ``start`` is part of the interval, but the base at ``end`` is not. + + When a region is written as a single string using + `samtools`_-compatible notation, e.g., 'chr1:15001-20000', + the string's coordinates instead represent a 1-based closed interval, + i.e., both (1-based) positions 15,001 and 20,000 are part of the + interval. (This example denotes the same 5,000-base region as the + example in the previous paragraph.) + + genotype + An individual's collection of genes. It can also refer to the two alleles + inherited for a particular gene. + + column + The portion of reads aligned to a single base in the + :term:`reference` sequence. + + tid + The :term:`target` id. The target id is 0 or a positive integer mapping to + entries within the sequence dictionary in the header section of + a :term:`TAM` file or :term:`BAM` file. + + contig + The sequence that a :term:`tid` refers to. For example ``chr1``, ``contig123``. + + reference + Synonym for contig. + + BED + Browser Extensible Data format. A text file format used to store genomic + :term:`regions` as coordinates and associated notations. + + GTF + The Gene Transfer Format is a file format used to hold information + about gene structure. + + SAM + A textual format for storing genomic alignment information. + + BAM + Binary SAM format. BAM files are binary formatted, indexed and + allow random access. + + CRAM + CRAM is a binary format representing the same sequence alignment + information as SAM and BAM, but offering significantly better + lossless compression than BAM. + + TAM + Text SAM file. TAM files are human readable files of + tab-separated fields. TAM files do not allow random access. + + sam file + A file containing aligned reads. The :term:`sam file` can either + be a :term:`BAM` file or a :term:`TAM` file. + + pileup + Pileup + + fetching + Retrieving all mapped reads mapped to a :term:`region`. + + target + The sequence that a read has been aligned to. Target + sequences have bot a numerical identifier (:term:`tid`) + and an alphanumeric name (:term:`Reference`). + + tabix file + A sorted, compressed and indexed tab-separated file created + by the command line tool :file:`tabix` or the commands + :meth:`tabix_compress` and :meth:`tabix_index`. The file + is indexed by chromosomal coordinates. + + tabix row + A row in a :term:`tabix file`. Fields within a row are + tab-separated. + + soft clipping + soft clipped + + In alignments with soft clipping part of the query sequence + are not aligned. The unaligned query sequence is still part + of the alignment record. This is in difference to + :term:`hard clipped` reads. + + hard clipping + hard clipped + + In hard clipped reads, part of the sequence has been removed + prior to alignment. That only a subsequence is aligend might be + recorded in the :term:`cigar` alignment, but the removed + sequence will not be part of the alignment record, in contrast + to :term:`soft clipped` reads. + + VCF + Variant Call Format. + + BCF + Binary :term:`VCF`. + + FASTA + Simple text format containing sequence data, with only the bare + minimum of metadata. Typically used for reference sequence data. + + FASTQ + Simple text format containing sequence data and associated base + qualities. + + tabix + Utility in the htslib package to index :term:`bgzip` compressed + files. + + faidx + Utility in the `samtools`_ package to index :term:`fasta` formatted + files. + + bgzip + Utility in the htslib package to block compress genomic data + files. diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..6bff551 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,84 @@ +pysam: htslib interface for python +================================== + +:Author: Andreas Heger, Kevin Jacobs and contributors +:Date: |today| +:Version: |version| + +Pysam is a python module for reading, manipulating and writing +genomic data sets. + +Pysam is a wrapper of the htslib_ C-API and provides facilities to +read and write SAM/BAM/VCF/BCF/BED/GFF/GTF/FASTA/FASTQ files as well +as access to the command line functionality of the samtools_ and +bcftools_ packages. The module supports compression and random access +through indexing. + +This module provides a low-level wrapper around the htslib_ C-API as +using cython and a high-level, pythonic API for convenient access to +the data within genomic file formats. + +The current version wraps *htslib-1.16*, *samtools-1.16.1*, and *bcftools-1.16*. + +To install the latest release, type:: + + pip install pysam + +See the :ref:`Installation notes ` for details. + +Contents +-------- + +.. toctree:: + :maxdepth: 2 + + api.rst + usage.rst + installation.rst + faq.rst + developer.rst + release.rst + benchmarking.rst + glossary.rst + +Indices and tables +------------------ + +Contents: + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +References +---------- + +.. [Li.2009] *The Sequence Alignment/Map format and SAMtools.* + Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. + Bioinformatics. 2009 Aug 15;25(16):2078-9. + Epub 2009 Jun 8 `btp352 `_. + PMID: `19505943 `_. + +.. [Bonfield.2021] *HTSlib: C library for reading/writing high-throughput sequencing data.* + Bonfield JK, Marshall J, Danecek P, Li H, Ohan V, Whitwham A, Keane T, Davies RM. + GigaScience (2021) 10(2) `giab007 `_. + PMID: `33594436 `_. + +.. [Danecek.2021] *Twelve years of SAMtools and BCFtools.* + Danecek P, Bonfield JK, Liddle J, Marshall J, Ohan V, Pollard MO, Whitwham A, Keane T, McCarthy SA, Davies RM, Li H. + GigaScience (2021) 10(2) `giab008 `_. + PMID: `33590861 `_. + +.. seealso:: + + Information about htslib + http://www.htslib.org + + The samtools homepage + http://samtools.sourceforge.net + + The cython C-extensions for python + https://cython.org/ + + The python language + https://www.python.org diff --git a/doc/installation.rst b/doc/installation.rst new file mode 100644 index 0000000..a286c27 --- /dev/null +++ b/doc/installation.rst @@ -0,0 +1,108 @@ +.. _installation: + +================ +Installing pysam +================ + +Pysam can be installed through conda_, pypi_ and from the repository. +The recommended way to install pysam is through conda/bioconda. + +Conda installation +================== + +To install pysam in your current conda_ environment, type:: + + conda config --add channels r + conda config --add channels bioconda + conda install pysam + +This will install pysam from the bioconda_ channel and automatically +makes sure that dependencies are installed. Also, compilation flags +will be set automatically, which will potentially save a lot of +trouble on OS X. + +Pypi installation +================= + +Pysam provides a python interface to the functionality contained +within the htslib_ C library. There are two ways that these two +can be combined, ``builtin`` and ``external``. + +Builtin +------- + +The typical installation will be through pypi_:: + + pip install pysam + +This will compile the ``builtin`` htslib source code within pysam. + +htslib_ can be configured at compilation to turn on additional +features such support using encrypted configurations, enable plugins, +and more. See the htslib_ project for more information on these. + +Pysam will attempt to configure htslib_ to turn on some advanced +features. If these fail, for example due to missing library +dependencies (`libcurl`, `libcrypto`), it will fall back to +conservative defaults. + +Options can be passed to the configure script explicitly by +setting the environment variable `HTSLIB_CONFIGURE_OPTIONS`. +For example:: + + export HTSLIB_CONFIGURE_OPTIONS=--enable-plugins + pip install pysam + +External +-------- + +pysam can be combined with an externally installed htslib_ +library. This is a good way to avoid duplication of libraries. To link +against an externally installed library, set the environment variables +`HTSLIB_LIBRARY_DIR` and `HTSLIB_INCLUDE_DIR` before installing:: + + export HTSLIB_LIBRARY_DIR=/usr/local/lib + export HTSLIB_INCLUDE_DIR=/usr/local/include + pip install pysam + +Note that the location of the file :file:`libhts.so` needs to be known +to the linker once you run pysam, for example by setting the +environment-varirable `LD_LIBRARY_PATH`. + +Note that generally the pysam and htslib version need to be +compatible. See the release notes for more information. + +Installation from repository +============================ + +pysam depends on cython_ to provide the connectivity to the htslib_ C +library. The installation of the source tarball (:file:`.tar.gz`) +contains pre-built C-files and cython needs not be present +during installation. However, when installing from the repository, +cython needs to be installed beforehand. + +To install from repository, type:: + + python setup.py install + +For compilation options, see the section on Pypi installation above. + +Requirements +============ + +Depending on the installation method, requirements for building pysam differ. + +When installing through conda_, dependencies will be resolved by the +package manager. The pip_ installation and installation from source +require a C compiler and its standard libraries as well as all +requirements for building htslib. Htslib requirements are listed in +the htslib/INSTALL file. + +Installing from the repository will require cython_ to be installed. + + + + + + + diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 0000000..caca799 --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,112 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +set SPHINXBUILD=sphinx-build +set ALLSPHINXOPTS=-d _build/doctrees %SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (_build\*) do rmdir /q /s %%i + del /q /s _build\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% _build/html + echo. + echo.Build finished. The HTML pages are in _build/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% _build/dirhtml + echo. + echo.Build finished. The HTML pages are in _build/dirhtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% _build/pickle + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% _build/json + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% _build/htmlhelp + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in _build/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% _build/qthelp + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in _build/qthelp, like this: + echo.^> qcollectiongenerator _build\qthelp\samtools.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile _build\qthelp\samtools.ghc + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% _build/latex + echo. + echo.Build finished; the LaTeX files are in _build/latex. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% _build/changes + echo. + echo.The overview file is in _build/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% _build/linkcheck + echo. + echo.Link check complete; look for any errors in the above output ^ +or in _build/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% _build/doctest + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in _build/doctest/output.txt. + goto end +) + +:end diff --git a/doc/release.rst b/doc/release.rst new file mode 100644 index 0000000..d731c36 --- /dev/null +++ b/doc/release.rst @@ -0,0 +1,841 @@ +============= +Release notes +============= + +Release 0.19.1 +============== + +This release wraps htslib/samtools/bcftools version 1.15.1. + +* [#1104] add an add_samples() method to quickly add multiple samples + to VCF. + +Release 0.19.0 +============== + +This release wraps htslib/samtools/bcftools version 1.15. + +* [#1085] Improve getopt()/getopt_long() resetting when running samtools/bcftools commands + +* [#1078] Support BAM_CPAD in get_aligned_pairs + +* [#1063] Run flake8 and fix some linting issues + +* [#1088] Add AlignedSegment is_mapped/mate_is_mapped/is_forward/mate_is_forward properties + +* Write an absent AlignedSegment.qual as all-bytes-0xff + +* Fix BGZFile.read() behaviour near or at EOF + +* First API for the htslib modified bases interface + +Release 0.18.0 +============== + +This release wraps htslib/samtools/bcftools version 1.14. + +* [#1048] and [#1060], clarify documentation of index statistics with CRAM files +* Prevent "retval may be used uninitialised" warning. +* Add new "samples" subcommand to pysam/samtools.py +* Introduce TupleProxyIterator iterator object class + +Release 0.17.0 +============== + +This release wraps htslib/samtools/bcftools version 1.13. Corresponding +to new samtools commands, `pysam.samtools` now has additional functions +`ampliconclip`, `ampliconstats`, `fqimport`, and `version`. + +Bugs fixed: + +* [#447] The maximum QNAME length is fully restored to 254 +* [#506, #958, #1000] Don't crash the Python interpreter on ``pysam.bcftools.*()`` errors +* [#603] count_coverage: ignore reads that have no SEQ field +* [#928] Fix ``pysam.bcftools.mpileup()`` segmentation fault +* [#983] Add win32/\*.[ch] to MANIFEST.in +* [#994] Raise exception in ``get_tid()`` if header could not be parsed +* [#995] Choose TBI/CSI in ``tabix_index()`` via both min_shift and csi +* [#996] ``AlignmentFile.fetch()`` now works with large chromosomes longer than 2\ :sup:`29` bases +* [#1019] Fix Sphinx documentation generation by avoiding Python 2 ``ur'string'`` syntax +* [#1035] Improved handling of file iteration errors +* [#1038] ``tabix_index()`` no longer leaks file descriptors +* [#1040] ``print(aligned_segment)`` now prints the correct TLEN value + (it also now prints RNAME/RNEXT more clearly and prints POS/PNEXT 1-based) +* *setup.py* longer uses ``setup(use_2to3)`` for compatibility with setuptools >= v58.0.0 + +New facilities: + +* [PR #963] Additional VCF classes are exposed to pysam programmers +* [#998, PR #1001] Add ``get/set_encoding_error_handler()`` to control UTF-8 conversion +* [PR #1012] Running ``python setup.py sdist`` now automatically runs cythonize +* Running tests with ``pytest`` now automatically runs ``make`` to generate test data + +Documentation improvements: + +* [#726] Clarify get_forward_sequence/get_forward_qualities documentation +* [#865] Improved example +* [#968] ``get_index_statstics`` parameters +* [#986] Clarify ``VariantFile.fetch`` start/stop region parameters are 0-based and half-open. +* [#990] Corrected ``PileupColumn.get_query_sequences`` documentation +* [#999] Fix documentation for ``AlignmentFile.get_reference_length()`` +* [#1002] Document the default min_base_quality for ``pileup()`` + + +Release 0.16.0 +============== + +This release wraps htslib/bcftools version 1.10.2 and samtools version +1.10. The following bugs reported against pysam are fixed due to this: + +* [#447] Writing out QNAME longer than 251 characters corrupts BAM +* [#640, #734, #843] Setting VariantRecord pos or stop raises error +* [#738, #919] FastxFile truncates concatenated plain gzip compressed files + +Additional bugfixes: + +* [#840] Pileup doesn't work on python3 when `index_filename` is used +* [#886] FastqProxy raises ValueError when instantiated from python +* [#904] VariantFile.fetch() throws ValueError on files with no records +* [#909] Fix incorrect quoting in VariantFile contig records +* [#915, #916] Implement pileup() for unindexed files and/or SAM files + +Backwards incompatible changes: + +* The `samtools import` command was removed in samtools 1.10, so pysam + no longer exports a `samimport` function. Use `pysam.view()` instead. + + +Release 0.15.4 +============== + +Bugfix release. Principal reason for release is to update cython +version in order to fix pip install pysam with python 3.8. + +* [#879] Fix add_meta function in libcbcf.pyx, so meta-information + lines in header added with this function have double-quoting rules + in accordance to rules specified in VCF4.2 and VCF4.3 specifications +* [#863] Force arg to bytes to support non-ASCII encoding +* [#875] Bump minimum Cython version +* [#868] Prevent segfault on Python 2.7 AlignedSegment.compare(other=None) +* [#867] Fix wheel building on TravisCI +* [#863] Force arg to bytes to support non-ASCII encoding +* [#799] disambiguate interpretation of bcf_read return code +* [#841] Fix silent truncation of FASTQ with bad q strings +* [#846] Prevent segmentation fault on ID, when handling malformed records +* [#829] Run configure with the correct CC/CFLAGS/LDFLAGS env vars + + +Release 0.15.3 +============== + +Bugfix release. + +* [#824] allow reading of UTF-8 encoded text in VCF/BCF files. +* [#780] close all filehandles before opening new ones in pysam_dispatch +* [#773] do not cache VariantRecord.id to avoid memory leak +* [#781] default of multiple_iterators=True is changed to False for + CRAM files. +* [#825] fix collections.abc import +* [#825] use bcf_hdr_format instead of bcf_hdr_fmt_text, fix memcpy + bug when setting FORMAT fields. +* [#804] Use HTSlib's kstring_t, which reallocates and enlarges its + memory as needed, rather than a fixed-size char buffer. +* [#814] Build wheels and upload them to PyPI +* [#755] Allow passing flags and arguments to index methods +* [#763] Strip \0 in header check +* [#761] Test Tabix index contents, not the compression + +Release 0.15.2 +============== + +Bugfix release. + +* [#746] catch pileup itorator out-of-scope segfaults +* [#747] fix faixd fetch with region +* [#748] increase max_pos to (1<<31)-1 +* [#645] Add missing macOS stub files in `MANIFEST.in`, @SoapZA +* [#737] Fix bug in get_aligned_pairs, @bkohrn + +Release 0.15.1 +============== + +Bugfix release. + +* [#716] raise ValueError if tid is out of range when writing +* [#697] release version using cython 0.28.5 for python 3.7 + compatibility + +Release 0.15.0 +============== + +This release wraps htslib/samtools/bcftools version 1.9.0. + +* [#673] permit dash in chromosome name of region string +* [#656] Support `text` when opening a SAM file for writing +* [#658] return None in get_forward_sequence if sequence not in record +* [#683] allow lower case bases in MD tags +* Ensure that = and X CIGAR ops are treated the same as M + +Release 0.14.1 +============== + +This is mostly a bugfix release, though bcftools has now also been +upgraded to 1.7.0. + +* [#621] Add a warning to count_coverage when an alignment has an + empty QUAL field +* [#635] Speed-up of AlignedSegment.find_intro() +* treat border case of all bases in pileup column below quality score +* [#634] Fix access to pileup reference_sequence + + +Release 0.14.0 +============== + +This release wraps htslib/samtools versions 1.7.0. + +* SAM/BAM/CRAM headers are now managed by a separate AlignmentHeader + class. +* AlignmentFile.header.as_dict() returns an ordered dictionary. +* Use "stop" instead of "end" to ensure consistency to + VariantFile. The end designations have been kept for backwards + compatibility. + +* [#611] and [#293] CRAM repeated fetch now works, each iterator + reloads index if multiple_iterators=True +* [#608] pysam now wraps htslib 1.7 and samtools 1.7. +* [#580] reference_name and next_reference_name can now be set to "*" + (will be converted to None to indicate an unmapped location) +* [#302] providing no coordinate to count_coverage will not count from + start/end of contig. +* [#325] @SQ records will be automatically added to header if they are + absent from text section of header. +* [#529] add get_forward_sequence() and get_forward_qualities() + methods +* [#577] add from_string() and to_dict()/from_dict() methods to + AlignedSegment. Rename tostring() to to_string() throughout for + consistency +* [#589] return None from build_alignment_sequence if no MD tag is set +* [#528] add PileupColumn.__len__ method + +Backwards incompatible changes: + +* AlignmentFile.header now returns an AlignmentHeader object. Use + AlignmentFile.header.to_dict() to get the dictionary as + previously. Most dictionary accessor methods (keys(), values(), + __getitem__, ...) have been implemented to ensure some level of + backwards compatibility when only reading. + + The rationale for this change is to have consistency between + AlignmentFile and VariantFile. + +* AlignmentFile and FastaFile now raise IOError instead of OSError + +Medium term we plan to have a 1.0 release. The pysam +interface has grown over the years and the API is cluttered with +deprecated names (Samfile, getrname(), gettid(), ...). To work towards +this, the next release (0.15.0) will yield DeprecationWarnings +for any parts of the API that are considered obsolete and will not be +in 1.0. Once 1.0 has been reached, we will use semantic versioning. + +Release 0.13.0 +=============== + +This release wraps htslib/samtools/bcftools versions 1.6.0 and +contains a series of bugfixes. + +* [#544] reading header from remote TabixFiles now works. +* [#531] add missing tag types H and A. A python float will now be + added as 'f' type instead of 'd' type. +* [#543] use FastaFile instead of Fastafile in pileup. +* [#546] set is_modified flag in setAttribute so updated attributes + are output. +* [#537] allow tabix index files to be created in a custom location. +* [#530] add get_index_statistics() method + + +Release 0.12.0.1 +================ + +Bugfix release to solve compilation issue due to missinge +bcftools/config.h file. + +Release 0.12.0 +============== + +This release wraps htslib/samtools/bcftools versions 1.5.0 and +contains a series of bugfixes. + +* [#473] A new FastxRecord class that can be instantiated from class and + modified in-place. Replaces PersistentFastqProxy. +* [#521] In AligmentFile, Simplify file detection logic and allow remote index files + + * Removed attempts to guess data and index file names; this is magic left + to htslib. + * Removed file existence check prior to opening files with htslib + * Better error checking after opening files that raise the appropriate + error (IOError for when errno is set, ValueError otherwise for backward + compatibility). + * Report IO errors when loading an index by name. + * Allow remote indices (tested using S3 signed URLs). + * Document filepath_index and make it an alias for index_filename. + * Added a require_index parameter to AlignmentFile + +* [#526] handle unset ref when creating new records +* [#513] fix bcf_translate to skip deleted FORMAT fields to avoid + segfaults +* [#516] expose IO errors via IOError exceptions +* [#487] add tabix line_skip, remove 'pileup' preset +* add FastxRecord, replaces PersistentFastqProxy (still present for + backwards compatibility) +* [#496] upgrade to htslib/samtools/bcftools versions 1.5 +* add start/stop to AlignmentFile.fetch() to be consistent with + VariantFile.fetch(). "end" is kept for backwards compatibility. +* [#512] add get_index_statistics() method to AlignmentFile. + +Upcoming changes: + +In the next release we are plannig to separate the header information +from AlignmentFile into a separate class AlignmentHeader. This layout +is similar to VariantFile/VariantHeader. With this change we will +ensure that an AlignedSegment record will be linked to a header so +that chromosome names can be automatically translated from the numeric +representation. As a consequence, the way new AlignedSegment records +are created will need to change as the constructor requires a header:: + + header = pysam.AlignmentHeader( + reference_names=["chr1", "chr2"], + reference_lengths=[1000, 1000]) + + read = pysam.AlignedSegment(header) + +This will affect all code that instantiates AlignedSegment objects +directly. We have not yet merged to allow users to provide feed-back. +The pull-request is here: https://github.com/pysam-developers/pysam/pull/518 +Please comment on github. + +Release 0.11.2.2 +================ + +Bugfix release to address two issues: + +* Changes in 0.11.2.1 broke the GTF/GFF3 parser. Corrected and + more tests have been added. +* [#479] Correct VariantRecord edge cases described in issue + +Release 0.11.2.1 +================ + +Release to fix release tar-ball containing 0.11.1 pre-compiled +C-files. + +Release 0.11.2 +============== + +This release wraps htslib/samtools/bcfools versions 1.4.1 in response +to a security fix in these libraries. Additionally the following +issues have been fixed: + +* [#452] add GFF3 support for tabix parsers +* [#461] Multiple fixes related to VariantRecordInfo and handling of INFO/END +* [#447] limit query name to 251 characters (only partially addresses issue) + +VariantFile and related object fixes + +* Restore VariantFile.\_\_dealloc\_\_ +* Correct handling of bcf_str_missing in bcf_array_to_object and + bcf_object_to_array +* Added update() and pop() methods to some dict-like proxy objects +* scalar INFO entries could not be set again after being deleted +* VariantRecordInfo.__delitem__ now allows unset flags to be deleted without + raising a KeyError +* Multiple other fixes for VariantRecordInfo methods +* INFO/END is now accessible only via VariantRecord.stop and + VariantRecord.rlen. Even if present behind the scenes, it is no longer + accessible via VariantRecordInfo. +* Add argument to issue a warning instead of an exception if input appears + to be truncated + +Other features and fixes: + +* Make AlignmentFile \_\_dealloc\_\_ and close more + stringent +* Add argument AlignmentFile to issue a warning instead of an + exception if input appears to be truncated + +Release 0.11.1 +============== + +Bugfix release + +* [#440] add deprecated 'always' option to infer_query_length for backwards compatibility. + +Release 0.11.0 +============== + +This release wraps the latest versions of htslib/samtools/bcftools and +implements a few bugfixes. + +* [#413] Wrap HTSlib/Samtools/BCFtools 1.4 +* [#422] Fix missing pysam.sort.usage() message +* [#411] Fix BGZfile initialization bug +* [#412] Add seek support for BGZFile +* [#395] Make BGZfile iterable +* [#433] Correct getQueryEnd +* [#419] Export SAM enums such as pysam.CMATCH +* [#415] Fix access by tid in AlignmentFile.fetch() +* [#405] Writing SAM now outputs a header by default. +* [#332] split infer_query_length(always) into infer_query_length and infer_read_length + +Release 0.10.0 +============== + +This release implements further functionality in the VariantFile API +and includes several bugfixes: + +* treat special case -c option in samtools view outputs to stdout even + if -o given, fixes #315 +* permit reading BAM files with CSI index, closes #370 +* raise Error if query name exceeds maximum length, fixes #373 +* new method to compute hash value for AlignedSegment +* AlignmentFile, VariantFile and TabixFile all inherit from HTSFile +* Avoid segfault by detecting out of range reference_id and + next_reference in AlignedSegment.tostring +* Issue #355: Implement streams using file descriptors for VariantFile +* upgrade to htslib 1.3.2 +* fix compilation with musl libc +* Issue #316, #360: Rename all Cython modules to have lib as a prefix +* Issue #332, hardclipped bases in cigar included by + pysam.AlignedSegment.infer_query_length() +* Added support for Python 3.6 filename encoding protocol +* Issue #371, fix incorrect parsing of scalar INFO and FORMAT fields in VariantRecord +* Issue #331, fix failure in VariantFile.reset() method +* Issue #314, add VariantHeader.new_record(), VariantFile.new_record() and + VariantRecord.copy() methods to create new VariantRecord objects +* Added VariantRecordFilter.add() method to allow setting new VariantRecord filters +* Preliminary (potentially unsafe) support for removing and altering header metadata +* Many minor fixes and improvements to VariantFile and related objects + +Please note that all internal cython extensions now have a lib prefix +to facilitate linking against pysam extension modules. Any user cython +extensions using cimport to import pysam definitions will need +changes, for example:: + + cimport pysam.csamtools + +will become:: + + cimport pysam.libcsamtools + +Release 0.9.1 +============= + +This is a bugfix release addressing some installation problems +in pysam 0.9.0, in particular: + +* patch included htslib to work with older libcurl versions, fixes #262. +* do not require cython for python 3 install, fixes #260 +* FastaFile does not accept filepath_index any more, see #270 +* add AlignedSegment.get_cigar_stats method. +* py3 bugfix in VariantFile.subset_samples, fixes #272 +* add missing sysconfig import, fixes #278 +* do not redirect stdout, but instead write to a separately + created file. This should resolve issues when pysam is used + in notebooks or other environments that redirect stdout. +* wrap htslib-1.3.1, samtools-1.3.1 and bcftools-1.3.1 +* use bgzf throughout instead of gzip +* allow specifying a fasta reference for CRAM file when opening + for both read and write, fixes #280 + +Release 0.9.0 +============= + +Overview +-------- + +The 0.9.0 release upgrades htslib to htslib 1.3 and numerous other +enhancements and bugfixes. See below for a detailed list. + +`Htslib 1.3 `_ +comes with additional capabilities for remote file access which depend +on the presence of optional system libraries. As a consequence, the +installation script :file:`setup.py` has become more complex. For an +overview, see :ref:`installation`. We have tested installation on +linux and OS X, but could not capture all variations. It is possible +that a 0.9.1 release might follow soon addressing installation issues. + +The :py:class:`~.pysam.VariantFile` class provides access to +:term:`vcf` and :term:`bcf` formatted files. The class is certainly +usable and interface is reaching completion, but the API and the +functionality is subject to change. + +Detailed release notes +---------------------- + +* upgrade to htslib 1.3 +* python 3 compatibility tested throughout. +* added a first set of bcftools commands in the pysam.bcftools + submodule. +* samtools commands are now in the pysam.samtools module. For + backwards compatibility they are still imported into the pysam + namespace. +* samtools/bcftools return stdout as a single (byte) string. As output + can be binary (VCF.gz, BAM) this is necessary to ensure py2/py3 + compatibility. To replicate the previous behaviour in py2.7, use:: + + pysam.samtools.view(self.filename).splitlines(True) + +* get_tags() returns the tag type as a character, not an integer (#214) +* TabixFile now raises ValueError on indices created by tabix <1.0 (#206) +* improve OSX installation and develop mode +* FastxIterator now handles empty sequences (#204) +* TabixFile.isremote is not TabixFile.is_remote in line with AlignmentFile +* AlignmentFile.count() has extra optional argument read_callback +* setup.py has been changed to: + * install a single builtin htslib library. Previously, each pysam + module contained its own version. This reduces compilation time + and code bloat. + * run configure for the builtin htslib library in order to detect + optional libraries such as libcurl. Configure behaviour can be + controlled by setting the environment variable + HTSLIB_CONFIGURE_OPTIONS. +* get_reference_sequence() now returns the reference sequence and not + something looking like it. This bug had effects on + get_aligned_pairs(with_seq=True), see #225. If you have relied on on + get_aligned_pairs(with_seq=True) in pysam-0.8.4, please check your + results. +* improved autodetection of file formats in AlignmentFile and VariantFile. + +Release 0.8.4 +============= + +This release contains numerous bugfixes and a first implementation of +a pythonic interface to VCF/BCF files. Note that this code is still +incomplete and preliminary, but does offer a nearly complete immutable +Pythonic interface to VCF/BCF metadata and data with reading and +writing capability. + +Potential isses when upgrading from v0.8.3: + +* binary tags are now returned as python arrays + +* renamed several methods for pep8 compatibility, old names still retained for + backwards compatibility, but should be considered deprecated. + + * gettid() is now get_tid() + * getrname() is now get_reference_name() + * parseRegion() is now parse_region() + +* some methods have changed for pep8 compatibility without the old + names being present: + + * fromQualityString() is now qualitystring_to_array() + * toQualityString() is now qualities_to_qualitystring() + +* faidx now returns strings and not binary strings in py3. + +* The cython components have been broken up into smaller files with + more specific content. This will affect users using the cython + interfaces. + +Edited list of commit log changes: + +* fixes AlignmentFile.check_index to return True +* add RG/PM header tag - closes #179 +* add with_seq option to get_aligned_pairs +* use char * inside reconsituteReferenceSequence +* add soft clipping for get_reference_sequence +* add get_reference_sequence +* queryEnd now computes length from cigar string if no sequence present, closes #176 +* tolerate missing space at end of gtf files, closes #162 +* do not raise Error when receiving output on stderr +* add docu about fetching without index, closes #170 +* FastaFile and FastxFile now return strings in python3, closes #173 +* py3 compat: relative -> absolute imports. +* add reference_name and next_reference_name attributes to AlignedSegment +* add function signatures to cvcf cython. Added note about other VCF code. +* add context manager functions to FastaFile +* add reference_name and next_reference_name attributes to AlignedSegment +* PileupColumn also gets a reference_name attribute. +* add context manager functions to FastaFile +* TabixFile.header for remote files raises AttributeError, fixes #157 +* add context manager interface to TabixFile, closes #165 +* change ctypedef enum to typedef enum for cython 0.23 +* add function signatures to cvcf cython, also added note about other VCF code +* remove exception for custom upper-case header record tags. +* rename VALID_HEADER_FIELDS to KNOWN_HEADER_FIELDS +* fix header record tag parsing for custom tags. +* use cython.str in count_coverage, fixes #141 +* avoid maketrans (issues with python3) +* refactoring: AlignedSegment now in separate module +* do not execute remote tests if URL not available +* fix the unmapped count, incl reads with no SQ group +* add raw output to tags +* added write access for binary tags +* bugfix in call to resize +* implemented writing of binary tags from arrays +* implemented convert_binary_tag to use arrays +* add special cases for reads that are unmapped or whose mates are unmapped. +* rename TabProxies to ctabixproxies +* remove underscores from utility functions +* move utility methods into cutils +* remove callback argument to fetch - closes #128 +* avoid calling close in dealloc +* add unit tests for File object opening +* change AlignmentFile.open to filepath_or_object +* implement copy.copy, close #65 +* add chaching of array attributes in AlignedSegment, closes #121 +* add export of Fastafile +* remove superfluous pysam_dispatch +* use persist option in FastqFile +* get_tag: expose tag type if requested with `with_value_type` +* fix to allow reading vcf record info via tabix-based vcf reader +* add pFastqProxy and pFastqFile objects to make it possible to work with multiple fastq records per file handle, unlike FastqProxy/FastqFile. +* release GIL around htslib IO operations +* More work on read/write support, API improvements +* add `phased` property on `VariantRecordSample` +* add mutable properties to VariantRecord +* BCF fixes and start of read/write support +* VariantHeaderRecord objects now act like mappings for attributes. +* add VariantHeader.alts dict from alt ID->Record. +* Bug fix to strong representation of structured header records. +* VariantHeader is now mutable + + +Release 0.8.3 +============= + +* samtools command now accept the "catch_stdout" option. + +* get_aligned_pairs now works for soft-clipped reads. + +* query_position is now None when a PileupRead is not aligned + to a particular position. + +* AlignedSegments are now comparable and hashable. + +Release 0.8.2.1 +=============== + +* Installation bugfix release. + +Release 0.8.2 +============= + +* Pysam now wraps htslib 1.2.1 and samtools version 1.2. + +* Added CRAM file support to pysam. + +* New alignment info interface. + * opt() and setTag are deprecated, use get_tag() and set_tag() + instead. + * added has_tag() + * tags is deprecated, use get_tags() and set_tags() instead. + +* FastqFile is now FastxFile to reflect that the latter permits + iteration over both fastq- and fasta-formatted files. + +* A Cython wrapper for htslib VCF/BCF reader/writer. The wrapper + provides a nearly complete Pythonic interface to VCF/BCF metadata + with reading and writing capability. However, the interface is still + incomplete and preliminary and lacks capability to mutate the + resulting data. + +Release 0.8.1 +============= + +* Pysam now wraps htslib and samtools versions 1.1. + +* Bugfixes, most notable: + * issue #43: uncompressed BAM output + * issue #42: skip tests requiring network if none available + * issue #19: multiple iterators can now be made to work on the same tabix file + * issue #24: All strings returned from/passed to the pysam API are now unicode in python 3 + * issue #5: type guessing for lists of integers fixed + +* API changes for consistency. The old API is still present, + but deprecated. + In particular: + + * Tabixfile -> TabixFile + * Fastafile -> FastaFile + * Fastqfile -> FastqFile + * Samfile -> AlignmentFile + * AlignedRead -> AlignedSegment + * qname -> query_name + * tid -> reference_id + * pos -> reference_start + * mapq -> mapping_quality + * rnext -> next_reference_id + * pnext -> next_reference_start + * cigar -> cigartuples + * cigarstring -> cigarstring + * tlen -> template_length + * seq -> query_sequence + * qual -> query_qualities, now returns array + * qqual -> query_alignment_qualities, now returns array + * tags -> tags + * alen -> reference_length, reference is always "alignment", so removed + * aend -> reference_end + * rlen -> query_length + * query -> query_alignment_sequence + * qstart -> query_alignment_start + * qend -> query_alignment_end + * qlen -> query_alignment_length + * mrnm -> next_reference_id + * mpos -> next_reference_start + * rname -> reference_id + * isize -> template_length + * blocks -> get_blocks() + * aligned_pairs -> get_aligned_pairs() + * inferred_length -> infer_query_length() + * positions -> get_reference_positions() + * overlap() -> get_overlap() + + * All strings are now passed to or received from the pysam API + as strings, no more bytes. + +Other changes: + * AlignmentFile.fetch(reopen) option is now multiple_iterators. The + default changed to not reopen a file unless requested by the user. + * FastaFile.getReferenceLength is now FastaFile.get_reference_length + +Backwards incompatible changes + +* Empty cigarstring now returns None (instead of '') +* Empty cigar now returns None (instead of []) +* When using the extension classes in cython modules, AlignedRead + needs to be substituted with AlignedSegment. +* fancy_str() has been removed +* qual, qqual now return arrays + +Release 0.8.0 +============= + +* Disabled features + * IteratorColumn.setMask() disabled as htslib does not implement + this functionality? + +* Not implemented yet: + * reading SAM files without header + +Tabix files between version 0.7.8 and 0.8.0 are +not compatible and need to be re-indexed. + +While version 0.7.8 and 0.8.0 should be mostly +compatible, there are some notable exceptions: + +* tabix iterators will fail if there are comments + in the middle or the end of a file. + +* tabix raises always ValueError for invalid intervals. + Previously, different types of errors were raised + (KeyError, IndexError, ValueError) depending on + the type of invalid intervals (missing chromosome, + out-of-range, malformatted interval). + + +Release 0.7.8 +============= + +* added AlignedRead.setTag method +* added AlignedRead.blocks +* unsetting CIGAR strings is now possible +* empty CIGAR string returns empty list +* added reopen flag to Samfile.fetch() +* various bugfixes + +Release 0.7.7 +============= + +* added Fastafile.references, .nreferences and .lengths +* tabix_iterator now uses kseq.h for python 2.7 + +Release 0.7.6 +============= + +* added inferred_length property +* issue 122: MACOSX getline missing, now it works? +* seq and qual can be set None +* added Fastqfile + +Release 0.7.5 +============= + +* switch to samtools 0.1.19 +* issue 122: MACOSX getline missing +* issue 130: clean up tempfiles +* various other bugfixes + +Release 0.7.4 +============= + +* further bugfixes to setup.py and package layout + +Release 0.7.3 +============= + +* further bugfixes to setup.py +* upgraded distribute_setup.py to 0.6.34 + +Release 0.7.2 +============= + +* bugfix in installer - failed when cython not present +* changed installation locations of shared libraries + +Release 0.7.1 +============= + +* bugfix: missing PP tag PG records in header +* added pre-built .c files to distribution + +Release 0.7 +=========== + +* switch to tabix 0.2.6 +* added cigarstring field +* python3 compatibility +* added B tag handling +* added check_sq and check_header options to Samfile.__init__ +* added lazy GTF parsing to tabix +* reworked support for VCF format parsing +* bugfixes + +Release 0.6 +=========== + +* switch to samtools 0.1.18 +* various bugfixes +* removed references to deprecated 'samtools pileup' functionality +* AlignedRead.tags now returns an empty list if there are no tags. +* added pnext, rnext and tlen + +Release 0.5 +=========== + +* switch to samtools 0.1.16 and tabix 0.2.5 +* improved tabix parsing, added vcf support +* re-organized code to permit linking against pysam +* various bugfixes +* added Samfile.positions and Samfile.overlap + +Release 0.4 +=========== + +* switch to samtools 0.1.12a and tabix 0.2.3 +* added snp and indel calling. +* switch from pyrex to cython +* changed handling of samtools stderr +* various bugfixes +* added Samfile.count and Samfile.mate +* deprecated AlignedRead.rname, added AlignedRead.tid + +Release 0.3 +=========== + +* switch to samtools 0.1.8 +* added support for tabix files +* numerous bugfixes including +* permit simultaneous iterators on the same file +* working access to remote files diff --git a/doc/usage.rst b/doc/usage.rst new file mode 100644 index 0000000..3c8ab04 --- /dev/null +++ b/doc/usage.rst @@ -0,0 +1,423 @@ +.. _Usage: + +========================================= +Working with BAM/CRAM/SAM-formatted files +========================================= + +Opening a file +============== + +To begin with, import the pysam module and open a +:class:`pysam.AlignmentFile`:: + + import pysam + samfile = pysam.AlignmentFile("ex1.bam", "rb") + +The above command opens the file :file:`ex1.bam` for reading. +The ``b`` qualifier indicates that this is a :term:`BAM` file. +To open a :term:`SAM` file, type:: + + import pysam + samfile = pysam.AlignmentFile("ex1.sam", "r") + +:term:`CRAM` files are identified by a ``c`` qualifier:: + + import pysam + samfile = pysam.AlignmentFile("ex1.cram", "rc") + +Fetching reads mapped to a :term:`region` +========================================= + +Reads are obtained through a call to the +:meth:`pysam.AlignmentFile.fetch` method which returns an iterator. +Each call to the iterator will returns a :class:`pysam.AlignedSegment` +object:: + + iter = samfile.fetch("seq1", 10, 20) + for x in iter: + print(str(x)) + +:meth:`pysam.AlignmentFile.fetch` returns all reads overlapping a +region sorted by the first aligned base in the :term:`reference` +sequence. Note that it will also return reads that are only partially +overlapping with the :term:`region`. Thus the reads returned might +span a region that is larger than the one queried. + +Using the pileup-engine +======================= + +In contrast to :term:`fetching`, the :term:`pileup` engine returns for +each base in the :term:`reference` sequence the reads that map to that +particular position. In the typical view of reads stacking vertically +on top of the reference sequence similar to a multiple alignment, +:term:`fetching` iterates over the rows of this implied multiple +alignment while a :term:`pileup` iterates over the :term:`columns`. + +Calling :meth:`~pysam.AlignmentFile.pileup` will return an iterator +over each :term:`column` (reference base) of a specified +:term:`region`. Each call to the iterator returns an object of the +type :class:`pysam.PileupColumn` that provides access to all the +reads aligned to that particular reference position as well as +some additional information:: + + iter = samfile.pileup('seq1', 10, 20) + for x in iter: + print(str(x)) + + +Creating BAM/CRAM/SAM files from scratch +======================================== + +The following example shows how a new :term:`BAM` file is constructed +from scratch. The important part here is that the +:class:`pysam.AlignmentFile` class needs to receive the sequence +identifiers. These can be given either as a dictionary in a header +structure, as lists of names and sizes, or from a template file. +Here, we use a header dictionary:: + + header = { 'HD': {'VN': '1.0'}, + 'SQ': [{'LN': 1575, 'SN': 'chr1'}, + {'LN': 1584, 'SN': 'chr2'}] } + + with pysam.AlignmentFile(tmpfilename, "wb", header=header) as outf: + a = pysam.AlignedSegment() + a.query_name = "read_28833_29006_6945" + a.query_sequence="AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG" + a.flag = 99 + a.reference_id = 0 + a.reference_start = 32 + a.mapping_quality = 20 + a.cigar = ((0,10), (2,1), (0,25)) + a.next_reference_id = 0 + a.next_reference_start=199 + a.template_length=167 + a.query_qualities = pysam.qualitystring_to_array("<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<") + a.tags = (("NM", 1), + ("RG", "L1")) + outf.write(a) + +Using streams +============= + +Pysam does not support reading and writing from true python file +objects, but it does support reading and writing from stdin and +stdout. The following example reads from stdin and writes to stdout:: + + infile = pysam.AlignmentFile("-", "r") + outfile = pysam.AlignmentFile("-", "w", template=infile) + for s in infile: + outfile.write(s) + +It will also work with :term:`BAM` files. The following script +converts a :term:`BAM` formatted file on stdin to a :term:`SAM` +formatted file on stdout:: + + infile = pysam.AlignmentFile("-", "rb") + outfile = pysam.AlignmentFile("-", "w", template=infile) + for s in infile: + outfile.write(s) + +Note that the file open mode needs to changed from ``r`` to ``rb``. + +===================================== +Using samtools commands within python +===================================== + +Commands available in `samtools`_ are available as simple +function calls. Command line options are provided as arguments. For +example:: + + pysam.sort("-o", "output.bam", "ex1.bam") + +corresponds to the command line:: + + samtools sort -o output.bam ex1.bam + +Or for example:: + + pysam.sort("-m", "1000000", "-o", "output.bam", "ex1.bam") + +In order to get usage information, try:: + + print(pysam.sort.usage()) + +Argument errors raise a :class:`pysam.SamtoolsError`:: + + pysam.sort() + + Traceback (most recent call last): + File "x.py", line 12, in + pysam.sort() + File "/build/lib.linux-x86_64-2.6/pysam/__init__.py", line 37, in __call__ + if retval: raise SamtoolsError( "\n".join( stderr ) ) + pysam.SamtoolsError: 'Usage: samtools sort [-n] [-m ] \n' + +Messages from `samtools`_ on stderr are captured and are +available using the :meth:`getMessages` method:: + + pysam.sort.getMessage() + +Note that only the output from the last invocation of a command is +stored. + +In order for pysam to make the output of samtools commands accessible +the stdout stream needs to be redirected. This is the default +behaviour, but can cause problems in environments such as the ipython +notebook. A solution is to pass the ``catch_stdout`` keyword +argument:: + + pysam.sort(catch_stdout=False) + +Note that this means that output from commands which produce output on +stdout will not be available. The only solution is to run samtools +commands through subprocess. + +================================ +Working with tabix-indexed files +================================ + +To open a tabular file that has been indexed with tabix_, use +:class:`~pysam.TabixFile`:: + + import pysam + tbx = pysam.TabixFile("example.bed.gz") + +Similar to :class:`~pysam.AlignmentFile.fetch`, intervals within a +region can be retrieved by calling :meth:`~pysam.TabixFile.fetch()`:: + + for row in tbx.fetch("chr1", 1000, 2000): + print(str(row)) + +This will return a tuple-like data structure in which columns can +be retrieved by numeric index:: + + for row in tbx.fetch("chr1", 1000, 2000): + print("chromosome is", row[0]) + +By providing a parser to :class:`~pysam.AlignmentFile.fetch` +or :class:`~pysam.TabixFile`, the data will we presented in parsed +form:: + + for row in tbx.fetch("chr1", 1000, 2000, parser=pysam.asTuple()): + print("chromosome is", row.contig) + print("first field (chrom)=", row[0]) + +Pre-built parsers are available for :term:`bed` +(:class:`~pysam.asBed`) formatted files and :term:`gtf` +(:class:`~pysam.asGTF`) formatted files. Thus, additional fields +become available through named access, for example:: + + for row in tbx.fetch("chr1", 1000, 2000, parser=pysam.asBed()): + print("name is", row.name) + + +.. Currently inactivated as pileup deprecated +.. Using the samtools SNP caller +.. ----------------------------- + +.. There are two ways to access the samtools SNP caller. The :class:`pysam.IteratorSNPCalls` +.. is appropriate when calling many consecutive SNPs, while :class:`pysam.SNPCaller` is +.. best when calling SNPs at non-consecutive genomic positions. Each snp caller returns objects of +.. type :class:`pysam.SNPCall`. + +.. To use :class:`pysam.IteratorSNPCalls`, associate it with a :class:`pysam.IteratorColumn`:: + +.. samfile = pysam.AlignmentFile( "ex1.bam", "rb") +.. fastafile = pysam.Fastafile( "ex1.fa" ) +.. pileup_iter = samfile.pileup( stepper = "samtools", fastafile = fastafile ) +.. sncpall_iter = pysam.IteratorSNPCalls(pileup_iter) +.. for call in snpcall_iter: +.. print(str(call)) + +.. Usage of :class:`pysam.SNPCaller` is similar:: + +.. samfile = pysam.AlignmentFile( "ex1.bam", "rb") +.. fastafile = pysam.Fastafile( "ex1.fa" ) +.. pileup_iter = samfile.pileup( stepper = "samtools", fastafile = fastafile ) +.. snpcaller = pysam.SNPCaller.call(pileup_iter) +.. print(snpcaller( "chr1", 100 )) + +.. Note the use of the option *stepper* to control which reads are included in the +.. in the :term:`pileup`. The ``samtools`` stepper implements the same read selection +.. and processing as in the samtools pileup command. + +.. Calling indels works along the same lines, using the :class:`pysam.IteratorIndelCalls` +.. and :class:`pysam.IteratorIndelCaller`. + + +==================================== +Working with VCF/BCF formatted files +==================================== + +To iterate through a VCF/BCF formatted file use +:class:`~pysam.VariantFile`:: + + from pysam import VariantFile + + bcf_in = VariantFile("test.bcf") # auto-detect input format + bcf_out = VariantFile('-', 'w', header=bcf_in.header) + + for rec in bcf_in.fetch('chr1', 100000, 200000): + bcf_out.write(rec) + +:meth:`_pysam.VariantFile.fetch()` iterates over +:class:`~pysam.VariantRecord` objects which provides access to +simple variant attributes such as :class:`~pysam.VariantRecord.contig`, +:class:`~pysam.VariantRecord.pos`, :class:`~pysam.VariantRecord.ref`:: + + for rec in bcf_in.fetch(): + print(rec.pos) + +but also to complex attributes such as the contents to the +:class:`~pysam.VariantRecord.info`, :class:`~pysam.VariantRecord.format` +and :term:`genotype` columns. These +complex attributes are views on the underlying htslib data structures +and provide dictionary-like access to the data:: + + for rec in bcf_in.fetch(): + print(rec.info) + print(rec.info.keys()) + print(rec.info["DP"]) + +The :py:attr:`~pysam.VariantFile.header` attribute +(:class:`~pysam.VariantHeader`) provides access information +stored in the :term:`vcf` header. The complete header can be printed:: + + >>> print(bcf_in.header) + ##fileformat=VCFv4.2 + ##FILTER= + ##fileDate=20090805 + ##source=myImputationProgramV3.1 + ##reference=1000GenomesPilot-NCBI36 + ##phasing=partial + ##INFO= + ##INFO= + ##INFO= + ##INFO= + ##INFO= + ##INFO= + ##FILTER= + ##FILTER= + ##FORMAT= + ##FORMAT= + ##FORMAT= + ##FORMAT= + ##contig= + ##contig= + ##contig= + ##bcftools_viewVersion=1.3+htslib-1.3 + ##bcftools_viewCommand=view -O b -o example_vcf42.bcf + example_vcf42.vcf.gz + #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA0000 + +Individual contents such as contigs, info fields, samples, formats can +be retrieved as attributes from :py:attr:`~pysam.VariantFile.header`:: + + >>> print(bcf_in.header.contigs) + + +To convert these views to native python types, iterate through the views:: + + >>> print(list((bcf_in.header.contigs))) + ['M', '17', '20'] + >>> print(list((bcf_in.header.filters))) + ['PASS', 'q10', 's50'] + >>> print(list((bcf_in.header.info))) + ['NS', 'DP', 'AF', 'AA', 'DB', 'H2'] + >>> print(list((bcf_in.header.samples))) + ['NA00001', 'NA00002', 'NA00003'] + +Alternatively, it is possible to iterate through all records in the +header returning objects of type :py:class:`~pysam.VariantHeaderRecord`:: :: + + >>> for x in bcf_in.header.records: + >>> print(x) + >>> print(x.type, x.key) + GENERIC fileformat + FILTER FILTER + GENERIC fileDate + GENERIC source + GENERIC reference + GENERIC phasing + INFO INFO + INFO INFO + INFO INFO + INFO INFO + INFO INFO + INFO INFO + FILTER FILTER + FILTER FILTER + FORMAT FORMAT + FORMAT FORMAT + FORMAT FORMAT + FORMAT FORMAT + CONTIG contig + CONTIG contig + CONTIG contig + GENERIC bcftools_viewVersion + GENERIC bcftools_viewCommand + +=============== +Extending pysam +=============== + +Using pyximport_, it is (relatively) straight-forward to access pysam +internals and the underlying `samtools`_ library. An example is provided +in the :file:`tests` directory. The example emulates the samtools +flagstat command and consists of three files: + +1. The main script :file:`pysam_flagstat.py`. The important lines in + this script are:: + + import pyximport + pyximport.install() + import _pysam_flagstat + + ... + + flag_counts = _pysam_flagstat.count(pysam_in) + + The first part imports, sets up pyximport_ and imports the cython + module :file:`_pysam_flagstat`. The second part calls the + ``count`` method in :file:`_pysam_flagstat`. + +2. The cython implementation :file:`_pysam_flagstat.pyx`. This script + imports the pysam API via:: + + from pysam.libcalignmentfile cimport AlignmentFile, AlignedSegment + + This statement imports, amongst others, :class:`AlignedSegment` + into the namespace. Speed can be gained from declaring + variables. For example, to efficiently iterate over a file, an + :class:`AlignedSegment` object is declared:: + + # loop over samfile + cdef AlignedSegment read + for read in samfile: + ... + +3. A :file:`pyxbld` providing pyximport_ with build information. + Required are the locations of the samtools and pysam header + libraries of a source installation of pysam plus the + :file:`csamtools.so` shared library. For example:: + + def make_ext(modname, pyxfilename): + from distutils.extension import Extension + import pysam + return Extension(name=modname, + sources=[pyxfilename], + extra_link_args=pysam.get_libraries(), + include_dirs=pysam.get_include(), + define_macros=pysam.get_defines()) + +If the script :file:`pysam_flagstat.py` is called the first time, +pyximport_ will compile the cython_ extension +:file:`_pysam_flagstat.pyx` and make it available to the +script. Compilation requires a working compiler and cython_ +installation. Each time :file:`_pysam_flagstat.pyx` is modified, a +new compilation will take place. + +pyximport_ comes with cython_. + diff --git a/import/pysam.c b/import/pysam.c new file mode 100644 index 0000000..168255c --- /dev/null +++ b/import/pysam.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include + +#include "@pysam@.pysam.h" + +FILE * @pysam@_stderr = NULL; +FILE * @pysam@_stdout = NULL; +const char * @pysam@_stdout_fn = NULL; + + +FILE * @pysam@_set_stderr(int fd) +{ + if (@pysam@_stderr != NULL) + fclose(@pysam@_stderr); + @pysam@_stderr = fdopen(fd, "w"); + return @pysam@_stderr; +} + +void @pysam@_close_stderr(void) +{ + fclose(@pysam@_stderr); + @pysam@_stderr = NULL; +} + +FILE * @pysam@_set_stdout(int fd) +{ + if (@pysam@_stdout != NULL) + fclose(@pysam@_stdout); + @pysam@_stdout = fdopen(fd, "w"); + if (@pysam@_stdout == NULL) + { + fprintf(@pysam@_stderr, "could not set stdout to fd %i", fd); + } + return @pysam@_stdout; +} + +void @pysam@_set_stdout_fn(const char *fn) +{ + @pysam@_stdout_fn = fn; +} + +void @pysam@_close_stdout(void) +{ + fclose(@pysam@_stdout); + @pysam@_stdout = NULL; +} + +int @pysam@_puts(const char *s) +{ + if (fputs(s, @pysam@_stdout) == EOF) return EOF; + return putc('\n', @pysam@_stdout); +} + + +static jmp_buf @pysam@_jmpbuf; +static int @pysam@_status = 0; + +int @pysam@_dispatch(int argc, char *argv[]) +{ + /* Reset getopt()/getopt_long() processing. */ +#if defined __GLIBC__ + optind = 0; +#elif defined _OPTRESET || defined _OPTRESET_DECLARED + optreset = optind = 1; +#else + optind = 1; +#endif + + if (setjmp(@pysam@_jmpbuf) == 0) + return @pysam@_main(argc, argv); + else + return @pysam@_status; +} + +void @pysam@_exit(int status) +{ + @pysam@_status = status; + longjmp(@pysam@_jmpbuf, 1); +} diff --git a/import/pysam.h b/import/pysam.h new file mode 100644 index 0000000..da07281 --- /dev/null +++ b/import/pysam.h @@ -0,0 +1,74 @@ +#ifndef @pysam@_PYSAM_H +#define @pysam@_PYSAM_H + +#include + +#ifndef __has_attribute +#define __has_attribute(attribute) 0 +#endif +#ifndef PYSAM_NORETURN +#if __has_attribute(__noreturn__) || __GNUC__ >= 3 +#define PYSAM_NORETURN __attribute__((__noreturn__)) +#else +#define PYSAM_NORETURN +#endif +#endif + +extern FILE * @pysam@_stderr; + +extern FILE * @pysam@_stdout; + +extern const char * @pysam@_stdout_fn; + +/*! set pysam standard error to point to file descriptor + + Setting the stderr will close the previous stderr. + */ +FILE * @pysam@_set_stderr(int fd); + +/*! set pysam standard output to point to file descriptor + + Setting the stdout will close the previous stdout. + */ +FILE * @pysam@_set_stdout(int fd); + +/*! set pysam standard output to point to filename + + */ +void @pysam@_set_stdout_fn(const char * fn); + +/*! close pysam standard error and set to NULL + + */ +void @pysam@_close_stderr(void); + +/*! close pysam standard output and set to NULL + + */ +void @pysam@_close_stdout(void); + +int @pysam@_puts(const char *s); + +int @pysam@_dispatch(int argc, char *argv[]); + +void PYSAM_NORETURN @pysam@_exit(int status); + +extern int @pysam@_main(int argc, char *argv[]); + +/* Define these only in samtools/bcftools C source, not Cython code. */ +#if !(defined CYTHON_ABI || defined CYTHON_HEX_VERSION) + +/*! Several non-static function names are used in both samtools and bcftools. + Both libcsamtools.so and libcbcftools.so are loaded simultaneously, leading + to collisions and wrong functions being called. #define these names so the + actual symbol names include distinct prefixes to avoid collisions. + */ +#define main_consensus @pysam@_main_consensus +#define main_reheader @pysam@_main_reheader +#define bam_smpl_init @pysam@_bam_smpl_init +#define bam_smpl_destroy @pysam@_bam_smpl_destroy +#define read_file_list @pysam@_read_file_list + +#endif + +#endif diff --git a/linker_tests/link_pre_489/PysamTestModule_link_pre_489/BuildRead.pyx b/linker_tests/link_pre_489/PysamTestModule_link_pre_489/BuildRead.pyx new file mode 100644 index 0000000..9c51e8f --- /dev/null +++ b/linker_tests/link_pre_489/PysamTestModule_link_pre_489/BuildRead.pyx @@ -0,0 +1,24 @@ +from __future__ import absolute_import + +from pysam.libchtslib cimport bam1_t, bam_endpos +from pysam.libcsamfile cimport aux_type2size +from pysam.libcalignedsegment cimport AlignedSegment + +import pysam + + +cpdef build_read(): + cdef AlignedSegment read = pysam.AlignedSegment() + read.query_name = "hello" + read.query_sequence = "ACGT" + read.reference_start = 10 + read.cigarstring = "4M" + + # Test calling htslib function + cdef bam1_t *calign = read._delegate + print(bam_endpos(calign)) + + # Test calling pysam htslib_util function + print(aux_type2size(12)) + + return read diff --git a/linker_tests/link_pre_489/PysamTestModule_link_pre_489/__init__.py b/linker_tests/link_pre_489/PysamTestModule_link_pre_489/__init__.py new file mode 100644 index 0000000..e441021 --- /dev/null +++ b/linker_tests/link_pre_489/PysamTestModule_link_pre_489/__init__.py @@ -0,0 +1,3 @@ +from PysamTestModule_link_pre_489.BuildRead import build_read + +all = ["build_read"] diff --git a/linker_tests/link_pre_489/cy_build.py b/linker_tests/link_pre_489/cy_build.py new file mode 100644 index 0000000..fae7055 --- /dev/null +++ b/linker_tests/link_pre_489/cy_build.py @@ -0,0 +1,86 @@ +import os +import re +import sys + +try: + from Cython.Distutils import build_ext +except ImportError: + from setuptools.command.build_ext import build_ext + +from distutils.extension import Extension +from distutils.sysconfig import get_config_vars, get_python_lib, get_python_version +from pkg_resources import Distribution + + +if sys.platform == 'darwin': + config_vars = get_config_vars() + config_vars['LDSHARED'] = config_vars['LDSHARED'].replace('-bundle', '') + config_vars['SHLIB_EXT'] = '.so' + + +def is_pip_install(): + if "_" in os.environ and os.environ["_"].endswith("pip"): + return True + if "pip-egg-info" in sys.argv: + return True + if re.search("/pip-.*-build/", __file__): + return True + return False + + +class CyExtension(Extension): + def __init__(self, *args, **kwargs): + self._init_func = kwargs.pop("init_func", None) + Extension.__init__(self, *args, **kwargs) + + def extend_includes(self, includes): + self.include_dirs.extend(includes) + + def extend_macros(self, macros): + self.define_macros.extend(macros) + + def extend_extra_objects(self, objs): + self.extra_objects.extend(objs) + + +class cy_build_ext(build_ext): + + def _get_egg_name(self): + ei_cmd = self.get_finalized_command("egg_info") + return Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version, get_python_version(), + self.distribution.has_ext_modules() and self.plat_name).egg_name() + + def build_extension(self, ext): + + if isinstance(ext, CyExtension) and ext._init_func: + ext._init_func(ext) + + if not self.inplace: + ext.library_dirs.append(os.path.join(self.build_lib, "pysam")) + + if sys.platform == 'darwin': + # The idea is to give shared libraries an install name of the form + # `@rpath/`, and to set the rpath equal to + # @loader_path. This will allow Python packages to find the library + # in the expected place, while still giving enough flexibility to + # external applications to link against the library. + relative_module_path = ext.name.replace(".", os.sep) + get_config_vars()["SO"] + library_path = os.path.join( + "@rpath", os.path.basename(relative_module_path) + ) + + if not ext.extra_link_args: + ext.extra_link_args = [] + ext.extra_link_args += ['-dynamiclib', + '-rpath', '@loader_path', + '-Wl,-headerpad_max_install_names', + '-Wl,-install_name,%s' % library_path, + '-Wl,-x'] + else: + if not ext.extra_link_args: + ext.extra_link_args = [] + + ext.extra_link_args += ['-Wl,-rpath,$ORIGIN'] + + build_ext.build_extension(self, ext) diff --git a/linker_tests/link_pre_489/setup.py b/linker_tests/link_pre_489/setup.py new file mode 100644 index 0000000..5fc75d5 --- /dev/null +++ b/linker_tests/link_pre_489/setup.py @@ -0,0 +1,28 @@ +import glob +import sys +import os + +from setuptools import setup, find_packages, Extension +from cy_build import CyExtension as Extension, cy_build_ext as build_ext + +import pysam + +test_module_suffix = os.path.dirname(os.path.abspath(__file__)).split(os.sep)[-1] +test_module_name = "PysamTestModule_{}".format(test_module_suffix) + +TestModule = Extension( + "{}.BuildRead".format(test_module_name), + ["{}/BuildRead.pyx".format(test_module_name)], + include_dirs=pysam.get_include(), + extra_link_args=pysam.get_libraries(), + define_macros=pysam.get_defines(), +) + +setup( + name=test_module_name, + version='0.1', + packages=find_packages(), + package_dir={test_module_name: test_module_name}, + ext_modules=[TestModule], + cmdclass={'build_ext': build_ext}, +) diff --git a/linker_tests/link_pre_489/tests/test_module.py b/linker_tests/link_pre_489/tests/test_module.py new file mode 100644 index 0000000..46ba27a --- /dev/null +++ b/linker_tests/link_pre_489/tests/test_module.py @@ -0,0 +1,15 @@ +import unittest + +from PysamTestModule_link_pre_489 import build_read + + +class TestModule(unittest.TestCase): + + def test_pass_if_module_can_be_called(self): + read = build_read() + self.assertEqual(read.query_name, "hello") + self.assertEqual(read.query_sequence, "ACGT") + + +if __name__ == "__main__": + unittest.main() diff --git a/linker_tests/link_with_rpath/PysamTestModule_link_with_rpath/BuildRead.pyx b/linker_tests/link_with_rpath/PysamTestModule_link_with_rpath/BuildRead.pyx new file mode 100644 index 0000000..9c51e8f --- /dev/null +++ b/linker_tests/link_with_rpath/PysamTestModule_link_with_rpath/BuildRead.pyx @@ -0,0 +1,24 @@ +from __future__ import absolute_import + +from pysam.libchtslib cimport bam1_t, bam_endpos +from pysam.libcsamfile cimport aux_type2size +from pysam.libcalignedsegment cimport AlignedSegment + +import pysam + + +cpdef build_read(): + cdef AlignedSegment read = pysam.AlignedSegment() + read.query_name = "hello" + read.query_sequence = "ACGT" + read.reference_start = 10 + read.cigarstring = "4M" + + # Test calling htslib function + cdef bam1_t *calign = read._delegate + print(bam_endpos(calign)) + + # Test calling pysam htslib_util function + print(aux_type2size(12)) + + return read diff --git a/linker_tests/link_with_rpath/PysamTestModule_link_with_rpath/__init__.py b/linker_tests/link_with_rpath/PysamTestModule_link_with_rpath/__init__.py new file mode 100644 index 0000000..c4b1a09 --- /dev/null +++ b/linker_tests/link_with_rpath/PysamTestModule_link_with_rpath/__init__.py @@ -0,0 +1,3 @@ +from PysamTestModule_link_with_rpath.BuildRead import build_read + +all = ["build_read"] diff --git a/linker_tests/link_with_rpath/setup.py b/linker_tests/link_with_rpath/setup.py new file mode 100644 index 0000000..2e5a8af --- /dev/null +++ b/linker_tests/link_with_rpath/setup.py @@ -0,0 +1,36 @@ +import glob +import sys +import os + +from setuptools import setup, find_packages, Extension +from Cython.Distutils import build_ext + +import pysam + +test_module_suffix = os.path.dirname(os.path.abspath(__file__)).split(os.sep)[-1] +test_module_name = "PysamTestModule_{}".format(test_module_suffix) + +pysam_libraries = pysam.get_libraries() +pysam_libdirs, pysam_libs = zip(*[os.path.split(x) for x in pysam_libraries]) +pysam_libdir = pysam_libdirs[0] +# remove lib and .so +pysam_libs = [x[3:-3] for x in pysam_libs] + +TestModule = Extension( + "{}.BuildRead".format(test_module_name), + ["{}/BuildRead.pyx".format(test_module_name)], + include_dirs=pysam.get_include(), + library_dirs=[pysam_libdir], + libraries=pysam_libs, + extra_link_args=['-Wl,-rpath,{}'.format(pysam_libdir)], + language="C", +) + +setup( + name=test_module_name, + version='0.1', + packages=find_packages(), + package_dir={test_module_name: test_module_name}, + ext_modules=[TestModule], + cmdclass={'build_ext': build_ext}, +) diff --git a/linker_tests/link_with_rpath/tests/test_module.py b/linker_tests/link_with_rpath/tests/test_module.py new file mode 100644 index 0000000..f8621b4 --- /dev/null +++ b/linker_tests/link_with_rpath/tests/test_module.py @@ -0,0 +1,15 @@ +import unittest + +from PysamTestModule_link_with_rpath import build_read + + +class TestModule(unittest.TestCase): + + def test_pass_if_module_can_be_called(self): + read = build_read() + self.assertEqual(read.query_name, "hello") + self.assertEqual(read.query_sequence, "ACGT") + + +if __name__ == "__main__": + unittest.main() diff --git a/linker_tests/link_without_rpath/PysamTestModule_link_without_rpath/BuildRead.pyx b/linker_tests/link_without_rpath/PysamTestModule_link_without_rpath/BuildRead.pyx new file mode 100644 index 0000000..9c51e8f --- /dev/null +++ b/linker_tests/link_without_rpath/PysamTestModule_link_without_rpath/BuildRead.pyx @@ -0,0 +1,24 @@ +from __future__ import absolute_import + +from pysam.libchtslib cimport bam1_t, bam_endpos +from pysam.libcsamfile cimport aux_type2size +from pysam.libcalignedsegment cimport AlignedSegment + +import pysam + + +cpdef build_read(): + cdef AlignedSegment read = pysam.AlignedSegment() + read.query_name = "hello" + read.query_sequence = "ACGT" + read.reference_start = 10 + read.cigarstring = "4M" + + # Test calling htslib function + cdef bam1_t *calign = read._delegate + print(bam_endpos(calign)) + + # Test calling pysam htslib_util function + print(aux_type2size(12)) + + return read diff --git a/linker_tests/link_without_rpath/PysamTestModule_link_without_rpath/__init__.py b/linker_tests/link_without_rpath/PysamTestModule_link_without_rpath/__init__.py new file mode 100644 index 0000000..722c5d0 --- /dev/null +++ b/linker_tests/link_without_rpath/PysamTestModule_link_without_rpath/__init__.py @@ -0,0 +1,3 @@ +from PysamTestModule_link_without_rpath.BuildRead import build_read + +all = ["build_read"] diff --git a/linker_tests/link_without_rpath/setup.py b/linker_tests/link_without_rpath/setup.py new file mode 100644 index 0000000..7846e4b --- /dev/null +++ b/linker_tests/link_without_rpath/setup.py @@ -0,0 +1,35 @@ +import glob +import sys +import os + +from setuptools import setup, find_packages, Extension +from Cython.Distutils import build_ext + +import pysam + +test_module_suffix = os.path.dirname(os.path.abspath(__file__)).split(os.sep)[-1] +test_module_name = "PysamTestModule_{}".format(test_module_suffix) + +pysam_libraries = pysam.get_libraries() +pysam_libdirs, pysam_libs = zip(*[os.path.split(x) for x in pysam_libraries]) +pysam_libdir = pysam_libdirs[0] +# remove lib and .so +pysam_libs = [x[3:-3] for x in pysam_libs] + +TestModule = Extension( + "{}.BuildRead".format(test_module_name), + ["{}/BuildRead.pyx".format(test_module_name)], + include_dirs=pysam.get_include(), + library_dirs=[pysam_libdir], + libraries=pysam_libs, + language="C", +) + +setup( + name=test_module_name, + version='0.1', + packages=find_packages(), + package_dir={test_module_name: test_module_name}, + ext_modules=[TestModule], + cmdclass={'build_ext': build_ext}, +) diff --git a/linker_tests/link_without_rpath/tests/test_module.py b/linker_tests/link_without_rpath/tests/test_module.py new file mode 100644 index 0000000..1da5bbc --- /dev/null +++ b/linker_tests/link_without_rpath/tests/test_module.py @@ -0,0 +1,15 @@ +import unittest + +from PysamTestModule_link_without_rpath import build_read + + +class TestModule(unittest.TestCase): + + def test_pass_if_module_can_be_called(self): + read = build_read() + self.assertEqual(read.query_name, "hello") + self.assertEqual(read.query_sequence, "ACGT") + + +if __name__ == "__main__": + unittest.main() diff --git a/pysam/Pileup.py b/pysam/Pileup.py new file mode 100644 index 0000000..2d05e3a --- /dev/null +++ b/pysam/Pileup.py @@ -0,0 +1,282 @@ +'''Tools for working with files in the samtools pileup -c format.''' +import collections +import pysam + +PileupSubstitution = collections.namedtuple("PileupSubstitution", + ( + "chromosome", + "pos", + "reference_base", + "genotype", + "consensus_quality", + "snp_quality", + "mapping_quality", + "coverage", + "read_bases", + "base_qualities")) + +PileupIndel = collections.namedtuple("PileupIndel", + ( + "chromosome", + "pos", + "reference_base", + "genotype", + "consensus_quality", + "snp_quality", + "mapping_quality", + "coverage", + "first_allele", + "second_allele", + "reads_first", + "reads_second", + "reads_diff")) + + +def iterate(infile): + '''iterate over ``samtools pileup -c`` formatted file. + + *infile* can be any iterator over a lines. + + The function yields named tuples of the type :class:`pysam.Pileup.PileupSubstitution` + or :class:`pysam.Pileup.PileupIndel`. + + .. note:: + + The parser converts to 0-based coordinates + ''' + + conv_subst = (str, lambda x: int(x) - 1, str, + str, int, int, int, int, str, str) + conv_indel = (str, lambda x: int(x) - 1, str, str, int, + int, int, int, str, str, int, int, int) + + for line in infile: + d = line[:-1].split() + if d[2] == "*": + try: + yield PileupIndel(*[x(y) for x, y in zip(conv_indel, d)]) + except TypeError: + raise pysam.SamtoolsError("parsing error in line: `%s`" % line) + else: + try: + yield PileupSubstitution(*[x(y) for x, y in zip(conv_subst, d)]) + except TypeError: + raise pysam.SamtoolsError("parsing error in line: `%s`" % line) + + +ENCODE_GENOTYPE = { + 'A': 'A', 'C': 'C', 'G': 'G', 'T': 'T', + 'AA': 'A', 'CC': 'C', 'GG': 'G', 'TT': 'T', 'UU': 'U', + 'AG': 'r', 'GA': 'R', + 'CT': 'y', 'TC': 'Y', + 'AC': 'm', 'CA': 'M', + 'GT': 'k', 'TG': 'K', + 'CG': 's', 'GC': 'S', + 'AT': 'w', 'TA': 'W', +} + +DECODE_GENOTYPE = { + 'A': 'AA', + 'C': 'CC', + 'G': 'GG', + 'T': 'TT', + 'r': 'AG', 'R': 'AG', + 'y': 'CT', 'Y': 'CT', + 'm': 'AC', 'M': 'AC', + 'k': 'GT', 'K': 'GT', + 's': 'CG', 'S': 'CG', + 'w': 'AT', 'W': 'AT', +} + +# ------------------------------------------------------------ + + +def encodeGenotype(code): + '''encode genotypes like GG, GA into a one-letter code. + The returned code is lower case if code[0] < code[1], otherwise + it is uppercase. + ''' + return ENCODE_GENOTYPE[code.upper()] + + +def decodeGenotype(code): + '''decode single letter genotypes like m, M into two letters. + This is the reverse operation to :meth:`encodeGenotype`. + ''' + return DECODE_GENOTYPE[code] + + +def translateIndelGenotypeFromVCF(vcf_genotypes, ref): + '''translate indel from vcf to pileup format.''' + + # indels + def getPrefix(s1, s2): + '''get common prefix of strings s1 and s2.''' + n = min(len(s1), len(s2)) + for x in range(n): + if s1[x] != s2[x]: + return s1[:x] + return s1[:n] + + def getSuffix(s1, s2): + '''get common sufix of strings s1 and s2.''' + n = min(len(s1), len(s2)) + if s1[-1] != s2[-1]: + return "" + for x in range(-2, -n - 1, -1): + if s1[x] != s2[x]: + return s1[x + 1:] + return s1[-n:] + + def getGenotype(variant, ref): + + if variant == ref: + return "*", 0 + + if len(ref) > len(variant): + # is a deletion + if ref.startswith(variant): + return "-%s" % ref[len(variant):], len(variant) - 1 + elif ref.endswith(variant): + return "-%s" % ref[:-len(variant)], -1 + else: + prefix = getPrefix(ref, variant) + suffix = getSuffix(ref, variant) + shared = len(prefix) + len(suffix) - len(variant) + # print "-", prefix, suffix, ref, variant, shared, len(prefix), len(suffix), len(ref) + if shared < 0: + raise ValueError() + return "-%s" % ref[len(prefix):-(len(suffix) - shared)], len(prefix) - 1 + + elif len(ref) < len(variant): + # is an insertion + if variant.startswith(ref): + return "+%s" % variant[len(ref):], len(ref) - 1 + elif variant.endswith(ref): + return "+%s" % variant[:len(ref)], 0 + else: + prefix = getPrefix(ref, variant) + suffix = getSuffix(ref, variant) + shared = len(prefix) + len(suffix) - len(ref) + if shared < 0: + raise ValueError() + + return "+%s" % variant[len(prefix):-(len(suffix) - shared)], len(prefix) + else: + assert 0, "snp?" + + # in pileup, the position refers to the base + # after the coordinate, hence subtract 1 + # pos -= 1 + + genotypes, offsets = [], [] + is_error = True + + for variant in vcf_genotypes: + try: + g, offset = getGenotype(variant, ref) + except ValueError: + break + + genotypes.append(g) + if g != "*": + offsets.append(offset) + + else: + is_error = False + + if is_error: + raise ValueError() + + assert len(set(offsets)) == 1, "multiple offsets for indel" + offset = offsets[0] + + genotypes = "/".join(genotypes) + return genotypes, offset + + +def vcf2pileup(vcf, sample): + '''convert vcf record to pileup record.''' + + chromosome = vcf.contig + pos = vcf.pos + reference = vcf.ref + allelles = [reference] + vcf.alt + + data = vcf[sample] + + # get genotype + genotypes = data["GT"] + if len(genotypes) > 1: + raise ValueError("only single genotype per position, %s" % (str(vcf))) + + genotypes = genotypes[0] + + # not a variant + if genotypes[0] == ".": + return None + + genotypes = [allelles[int(x)] for x in genotypes if x != "/"] + + # snp_quality is "genotype quality" + snp_quality = consensus_quality = data.get("GQ", [0])[0] + mapping_quality = vcf.info.get("MQ", [0])[0] + coverage = data.get("DP", 0) + + if len(reference) > 1 or max([len(x) for x in vcf.alt]) > 1: + # indel + genotype, offset = translateIndelGenotypeFromVCF(genotypes, reference) + + return PileupIndel(chromosome, + pos + offset, + "*", + genotype, + consensus_quality, + snp_quality, + mapping_quality, + coverage, + genotype, + "<" * len(genotype), + 0, + 0, + 0) + + else: + genotype = encodeGenotype("".join(genotypes)) + read_bases = "" + base_qualities = "" + + return PileupSubstitution(chromosome, pos, reference, + genotype, consensus_quality, + snp_quality, mapping_quality, + coverage, read_bases, + base_qualities) + + +def iterate_from_vcf(infile, sample): + '''iterate over a vcf-formatted file. + + *infile* can be any iterator over a lines. + + The function yields named tuples of the type + :class:`pysam.Pileup.PileupSubstitution` or + :class:`pysam.Pileup.PileupIndel`. + + Positions without a snp will be skipped. + + This method is wasteful and written to support same legacy code + that expects samtools pileup output. + + Better use the vcf parser directly. + + ''' + vcf = pysam.VCF() + vcf.connect(infile) + + if sample not in vcf.getsamples(): + raise KeyError("sample %s not vcf file") + + for row in vcf.fetch(): + result = vcf2pileup(row, sample) + if result: + yield result diff --git a/pysam/VCF.py.obsolete b/pysam/VCF.py.obsolete new file mode 100644 index 0000000..78e6220 --- /dev/null +++ b/pysam/VCF.py.obsolete @@ -0,0 +1,1087 @@ +# +# Code to read, write and edit VCF files +# +# VCF lines are encoded as a dictionary with these keys (note: all lowercase): +# 'chrom': string +# 'pos': integer +# 'id': string +# 'ref': string +# 'alt': list of strings +# 'qual': integer +# 'filter': None (missing value), or list of keys (strings); empty list parsed as ["PASS"] +# 'info': dictionary of values (see below) +# 'format': list of keys (strings) +# sample keys: dictionary of values (see below) +# +# The sample keys are accessible through vcf.getsamples() +# +# A dictionary of values contains value keys (defined in ##INFO or ##FORMAT lines) which map +# to a list, containign integers, floats, strings, or characters. Missing values are replaced +# by a particular value, often -1 or . +# +# Genotypes are not stored as a string, but as a list of 1 or 3 elements (for haploid and diploid samples), +# the first (and last) the integer representing an allele, and the second the separation character. +# Note that there is just one genotype per sample, but for consistency the single element is stored in a list. +# +# Header lines other than ##INFO, ##FORMAT and ##FILTER are stored as (key, value) pairs and are accessible +# through getheader() +# +# The VCF class can be instantiated with a 'regions' variable consisting of tuples (chrom,start,end) encoding +# 0-based half-open segments. Only variants with a position inside the segment will be parsed. A regions +# parser is available under parse_regions. +# +# When instantiated, a reference can be passed to the VCF class. This may be any class that supports a +# fetch(chrom, start, end) method. +# +# +# +# NOTE: the position that is returned to Python is 0-based, NOT 1-based as in the VCF file. +# +# +# +# TODO: +# only v4.0 writing is complete; alleles are not converted to v3.3 format +# + +from collections import namedtuple, defaultdict +from operator import itemgetter +import sys, re, copy, bisect + +import pysam + +gtsRegEx = re.compile("[|/\\\\]") +alleleRegEx = re.compile('^[ACGTN]+$') + +# Utility function. Uses 0-based coordinates +def get_sequence(chrom, start, end, fa): + # obtain sequence from .fa file, without truncation + if end<=start: return "" + if not fa: return "N"*(end-start) + if start<0: return "N"*(-start) + get_sequence(chrom, 0, end, fa).upper() + sequence = fa.fetch(chrom, start, end).upper() + if len(sequence) < end-start: sequence += "N"*(end-start-len(sequence)) + return sequence + +# Utility function. Parses a region string +def parse_regions( string ): + result = [] + for r in string.split(','): + elts = r.split(':') + chrom, start, end = elts[0], 0, 3000000000 + if len(elts)==1: pass + elif len(elts)==2: + if len(elts[1])>0: + ielts = elts[1].split('-') + if len(ielts) != 2: ValueError("Don't understand region string '%s'" % r) + try: start, end = int(ielts[0])-1, int(ielts[1]) + except: raise ValueError("Don't understand region string '%s'" % r) + else: + raise ValueError("Don't understand region string '%s'" % r) + result.append( (chrom,start,end) ) + return result + + +FORMAT = namedtuple('FORMAT','id numbertype number type description missingvalue') + +########################################################################################################### +# +# New class +# +########################################################################################################### + +class VCFRecord(object): + '''vcf record. + + initialized from data and vcf meta + ''' + + data = None + vcf = None + + def __init__(self, data, vcf): + self.data, self.vcf = data, vcf + + if len(data) != len(self.vcf._samples): + self.error(str(data), + self.BAD_NUMBER_OF_COLUMNS, + "expected %s for %s samples (%s), got %s" % \ + (len(self.vcf._samples), + len(self.vcf._samples), + self.vcf._samples, + len(data))) + + property contig: + def __get__( self ): return self.data[0] + + property pos: + def __get__( self ): + return self.data.pos + + property id: + def __get__( self ): return self.data[2] + + property ref: + def __get__(self ): + # note: gerton substitutes reference if it can be fixed. + return self.data[3].upper() + + property alt: + def __get__(self): + # convert v3.3 to v4.0 alleles below + alt = self.data[4] + if alt == ".": alt = [] + else: alt = alt.upper().split(',') + return alt + + property qual: + def __get__(self): + qual = self.data[5] + if qual == ".": qual = -1 + else: + try: qual = float(qual) + except: self.error(line,self.QUAL_NOT_NUMERICAL) + + property filter: + def __get__(self): + # postpone checking that filters exist. Encode missing filter or no filtering as empty list + if cols[6] == "." or cols[6] == "PASS" or cols[6] == "0": filter = [] + else: filter = cols[6].split(';') + + return filter + + property info: + def __get__(self): + col = self.data[7] + # dictionary of keys, and list of values + info = {} + if col != ".": + for blurp in col.split(';'): + elts = blurp.split('=') + if len(elts) == 1: v = None + elif len(elts) == 2: v = elts[1] + else: self.error(str(self.data),self.ERROR_INFO_STRING) + info[elts[0]] = self.parse_formatdata(elts[0], v, self.vcf._info, line) + return info + + property format: + def __get__(self): + return self.data[8].split(':') + + def __getitem__(self, key): + + # parse sample columns + values = self.data[self.vcf._sample2column[key]].split(':') + alt = self.alt + format = self.format + + if len(values) > len(format): + self.error(line,self.BAD_NUMBER_OF_VALUES,"(found %s values in element %s; expected %s)" % (len(values),sample,len(format))) + + result = {} + for idx in range(len(format)): + expected = self.vcf.get_expected(format[idx], self.vcf._format, alt) + if idx < len(values): value = values[idx] + else: + if expected == -1: value = "." + else: value = ",".join(["."]*expected) + + result[format[idx]] = self.vcf.parse_formatdata(format[idx], value, self.vcf._format, line) + if expected != -1 and len(result[format[idx]]) != expected: + self.error(str(self.data),self.BAD_NUMBER_OF_PARAMETERS, + "id=%s, expected %s parameters, got %s" % (format[idx],expected,result[format[idx]])) + if len(result[format[idx]] ) < expected: result[format[idx]] += [result[format[idx]][-1]]*(expected-len(result[format[idx]])) + result[format[idx]] = result[format[idx]][:expected] + + return result + + def __str__(self): + return str(self.data) + +class VCF: + + # types + NT_UNKNOWN = 0 + NT_NUMBER = 1 + NT_ALLELES = 2 + NT_NR_ALLELES = 3 + NT_GENOTYPES = 4 + NT_PHASED_GENOTYPES = 5 + + _errors = { 0:"UNKNOWN_FORMAT_STRING:Unknown file format identifier", + 1:"BADLY_FORMATTED_FORMAT_STRING:Formatting error in the format string", + 2:"BADLY_FORMATTED_HEADING:Did not find 9 required headings (CHROM, POS, ..., FORMAT) %s", + 3:"BAD_NUMBER_OF_COLUMNS:Wrong number of columns found (%s)", + 4:"POS_NOT_NUMERICAL:Position column is not numerical", + 5:"UNKNOWN_CHAR_IN_REF:Unknown character in reference field", + 6:"V33_BAD_REF:Reference should be single-character in v3.3 VCF", + 7:"V33_BAD_ALLELE:Cannot interpret allele for v3.3 VCF", + 8:"POS_NOT_POSITIVE:Position field must be >0", + 9:"QUAL_NOT_NUMERICAL:Quality field must be numerical, or '.'", + 10:"ERROR_INFO_STRING:Error while parsing info field", + 11:"ERROR_UNKNOWN_KEY:Unknown key (%s) found in formatted field (info; format; or filter)", + 12:"ERROR_FORMAT_NOT_NUMERICAL:Expected integer or float in formatted field; got %s", + 13:"ERROR_FORMAT_NOT_CHAR:Eexpected character in formatted field; got string", + 14:"FILTER_NOT_DEFINED:Identifier (%s) in filter found which was not defined in header", + 15:"FORMAT_NOT_DEFINED:Identifier (%s) in format found which was not defined in header", + 16:"BAD_NUMBER_OF_VALUES:Found too many of values in sample column (%s)", + 17:"BAD_NUMBER_OF_PARAMETERS:Found unexpected number of parameters (%s)", + 18:"BAD_GENOTYPE:Cannot parse genotype (%s)", + 19:"V40_BAD_ALLELE:Bad allele found for v4.0 VCF (%s)", + 20:"MISSING_REF:Reference allele missing", + 21:"V33_UNMATCHED_DELETION:Deleted sequence does not match reference (%s)", + 22:"V40_MISSING_ANGLE_BRACKETS:Format definition is not deliminted by angular brackets", + 23:"FORMAT_MISSING_QUOTES:Description field in format definition is not surrounded by quotes", + 24:"V40_FORMAT_MUST_HAVE_NAMED_FIELDS:Fields in v4.0 VCF format definition must have named fields", + 25:"HEADING_NOT_SEPARATED_BY_TABS:Heading line appears separated by spaces, not tabs", + 26:"WRONG_REF:Wrong reference %s", + 27:"ERROR_TRAILING_DATA:Numerical field ('%s') has semicolon-separated trailing data", + 28:"BAD_CHR_TAG:Error calculating chr tag for %s", + 29:"ZERO_LENGTH_ALLELE:Found zero-length allele", + 30:"MISSING_INDEL_ALLELE_REF_BASE:Indel alleles must begin with single reference base" + } + + # tag-value pairs; tags are not unique; does not include fileformat, INFO, FILTER or FORMAT fields + _header = [] + + # version number; 33=v3.3; 40=v4.0 + _version = 40 + + # info, filter and format data + _info = {} + _filter = {} + _format = {} + + # header; and required columns + _required = ["CHROM","POS","ID","REF","ALT","QUAL","FILTER","INFO","FORMAT"] + _samples = [] + + # control behaviour + _ignored_errors = set([11]) # ERROR_UNKNOWN_KEY + _warn_errors = set([]) + _leftalign = False + + # reference sequence + _reference = None + + # regions to include; None includes everything + _regions = None + + # statefull stuff + _lineno = -1 + _line = None + _lines = None + + def __init__(self, _copy=None, reference=None, regions=None, lines=None, leftalign=False): + # make error identifiers accessible by name + for id in self._errors.keys(): self.__dict__[self._errors[id].split(':')[0]] = id + if _copy != None: + self._leftalign = _copy._leftalign + self._header = _copy._header[:] + self._version = _copy._version + self._info = copy.deepcopy(_copy._info) + self._filter = copy.deepcopy(_copy._filter) + self._format = copy.deepcopy(_copy._format) + self._samples = _copy._samples[:] + self._sample2column = copy.deepcopy(_copy._sample2column) + self._ignored_errors = copy.deepcopy(_copy._ignored_errors) + self._warn_errors = copy.deepcopy(_copy._warn_errors) + self._reference = _copy._reference + self._regions = _copy._regions + if reference: self._reference = reference + if regions: self._regions = regions + if leftalign: self._leftalign = leftalign + self._lines = lines + + def error(self,line,error,opt=None): + if error in self._ignored_errors: return + errorlabel, errorstring = self._errors[error].split(':') + if opt: errorstring = errorstring % opt + errwarn = ["Error","Warning"][error in self._warn_errors] + sys.stderr.write("Line %s: '%s'\n%s %s: %s\n" % (self._lineno,line,errwarn,errorlabel,errorstring)) + if error in self._warn_errors: return + raise ValueError(errorstring) + + def parse_format(self,line,format,filter=False): + if self._version >= 40: + if not format.startswith('<'): + self.error(line,self.V40_MISSING_ANGLE_BRACKETS) + format = "<"+format + if not format.endswith('>'): + self.error(line,self.V40_MISSING_ANGLE_BRACKETS) + format += ">" + format = format[1:-1] + data = {'id':None,'number':None,'type':None,'descr':None} + idx = 0 + while len(format.strip())>0: + elts = format.strip().split(',') + first, rest = elts[0], ','.join(elts[1:]) + if first.find('=') == -1 or (first.find('"')>=0 and first.find('=') > first.find('"')): + if self._version >= 40: self.error(line,self.V40_FORMAT_MUST_HAVE_NAMED_FIELDS) + if idx == 4: self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + first = ["ID=","Number=","Type=","Description="][idx] + first + if first.startswith('ID='): data['id'] = first.split('=')[1] + elif first.startswith('Number='): data['number'] = first.split('=')[1] + elif first.startswith('Type='): data['type'] = first.split('=')[1] + elif first.startswith('Description='): + elts = format.split('"') + if len(elts)<3: + self.error(line,self.FORMAT_MISSING_QUOTES) + elts = first.split('=') + [rest] + data['descr'] = elts[1] + rest = '"'.join(elts[2:]) + if rest.startswith(','): rest = rest[1:] + else: + self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + format = rest + idx += 1 + if filter and idx==1: idx=3 # skip number and type fields for FILTER format strings + if not data['id']: self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + if not data['descr']: + self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + data['descr'] = '' + if not data['type'] and not data['number']: + # fine, ##filter format + return FORMAT(data['id'],self.NT_NUMBER,0,"Flag",data['descr'],'.') + if not data['type'] in ["Integer","Float","Character","String","Flag"]: + self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + # I would like a missing-value field, but it isn't there + if data['type'] in ['Integer','Float']: data['missing'] = None # Do NOT use arbitrary int/float as missing value + else: data['missing'] = '.' + if not data['number']: self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + try: + n = int(data['number']) + t = self.NT_NUMBER + except ValueError: + n = -1 + if data['number'] == '.': t = self.NT_UNKNOWN + elif data['number'] == '#alleles': t = self.NT_ALLELES + elif data['number'] == '#nonref_alleles': t = self.NT_NR_ALLELES + elif data['number'] == '#genotypes': t = self.NT_GENOTYPES + elif data['number'] == '#phased_genotypes': t = self.NT_PHASED_GENOTYPES + else: + self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + return FORMAT(data['id'],t,n,data['type'],data['descr'],data['missing']) + + + def format_format( self, fmt, filter=False ): + values = [('ID',fmt.id)] + if fmt.number != None and not filter: + if fmt.numbertype == self.NT_UNKNOWN: nmb = "." + elif fmt.numbertype == self.NT_NUMBER: nmb = str(fmt.number) + elif fmt.numbertype == self.NT_ALLELES: nmb = "#alleles" + elif fmt.numbertype == self.NT_NR_ALLELES: nmb = "#nonref_alleles" + elif fmt.numbertype == self.NT_GENOTYPES: nmb = "#genotypes" + elif fmt.numbertype == self.NT_PHASED_GENOTYPES: nmb = "#phased_genotypes" + else: + raise ValueError("Unknown number type encountered: %s" % fmt.numbertype) + values.append( ('Number',nmb) ) + values.append( ('Type', fmt.type) ) + values.append( ('Description', '"' + fmt.description + '"') ) + if self._version == 33: + format = ",".join(v for k,v in values) + else: + format = "<" + (",".join( "%s=%s" % (k,v) for (k,v) in values )) + ">" + return format + + def get_expected(self, format, formatdict, alt): + fmt = formatdict[format] + if fmt.numbertype == self.NT_UNKNOWN: return -1 + if fmt.numbertype == self.NT_NUMBER: return fmt.number + if fmt.numbertype == self.NT_ALLELES: return len(alt)+1 + if fmt.numbertype == self.NT_NR_ALLELES: return len(alt) + if fmt.numbertype == self.NT_GENOTYPES: return ((len(alt)+1)*(len(alt)+2)) // 2 + if fmt.numbertype == self.NT_PHASED_GENOTYPES: return (len(alt)+1)*(len(alt)+1) + return 0 + + + def _add_definition(self, formatdict, key, data, line ): + if key in formatdict: return + self.error(line,self.ERROR_UNKNOWN_KEY,key) + if data == None: + formatdict[key] = FORMAT(key,self.NT_NUMBER,0,"Flag","(Undefined tag)",".") + return + if data == []: data = [""] # unsure what type -- say string + if type(data[0]) == type(0.0): + formatdict[key] = FORMAT(key,self.NT_UNKNOWN,-1,"Float","(Undefined tag)",None) + return + if type(data[0]) == type(0): + formatdict[key] = FORMAT(key,self.NT_UNKNOWN,-1,"Integer","(Undefined tag)",None) + return + formatdict[key] = FORMAT(key,self.NT_UNKNOWN,-1,"String","(Undefined tag)",".") + + + # todo: trim trailing missing values + def format_formatdata( self, data, format, key=True, value=True, separator=":" ): + output, sdata = [], [] + if type(data) == type([]): # for FORMAT field, make data with dummy values + d = {} + for k in data: d[k] = [] + data = d + # convert missing values; and silently add definitions if required + for k in data: + self._add_definition( format, k, data[k], "(output)" ) + for idx,v in enumerate(data[k]): + if v == format[k].missingvalue: data[k][idx] = "." + # make sure GT comes first; and ensure fixed ordering; also convert GT data back to string + for k in data: + if k != 'GT': sdata.append( (k,data[k]) ) + sdata.sort() + if 'GT' in data: + sdata = [('GT',map(self.convertGTback,data['GT']))] + sdata + for k,v in sdata: + if v == []: v = None + if key and value: + if v != None: output.append( k+"="+','.join(map(str,v)) ) + else: output.append( k ) + elif key: output.append(k) + elif value: + if v != None: output.append( ','.join(map(str,v)) ) + else: output.append( "." ) # should not happen + # snip off trailing missing data + while len(output) > 1: + last = output[-1].replace(',','').replace('.','') + if len(last)>0: break + output = output[:-1] + return separator.join(output) + + + def enter_default_format(self): + for f in [FORMAT('GT',self.NT_NUMBER,1,'String','Genotype','.'), + FORMAT('GQ',self.NT_NUMBER,1,'Integer','Genotype Quality',-1), + FORMAT('DP',self.NT_NUMBER,1,'Integer','Read depth at this position for this sample',-1), + FORMAT('HQ',self.NT_UNKNOWN,-1,'Integer','Haplotype Quality',-1), # unknown number, since may be haploid + FORMAT('FT',self.NT_NUMBER,1,'String','Sample Genotype Filter','.')]: + if f.id not in self._format: + self._format[f.id] = f + + def parse_header( self, line ): + assert line.startswith('##') + elts = line[2:].split('=') + key = elts[0].strip() + value = '='.join(elts[1:]).strip() + if key == "fileformat": + if value == "VCFv3.3": + self._version = 33 + elif value == "VCFv4.0": + self._version = 40 + elif value == "VCFv4.1": + self._version = 41 + else: + self.error(line,self.UNKNOWN_FORMAT_STRING) + elif key == "INFO": + f = self.parse_format(line, value) + self._info[ f.id ] = f + elif key == "FILTER": + f = self.parse_format(line, value, filter=True) + self._filter[ f.id ] = f + elif key == "FORMAT": + f = self.parse_format(line, value) + self._format[ f.id ] = f + else: + # keep other keys in the header field + self._header.append( (key,value) ) + + + def write_header( self, stream ): + stream.write("##fileformat=VCFv%s.%s\n" % (self._version // 10, self._version % 10)) + for key,value in self._header: stream.write("##%s=%s\n" % (key,value)) + for var,label in [(self._info,"INFO"),(self._filter,"FILTER"),(self._format,"FORMAT")]: + for f in var.itervalues(): stream.write("##%s=%s\n" % (label,self.format_format(f,filter=(label=="FILTER")))) + + + def parse_heading( self, line ): + assert line.startswith('#') + assert not line.startswith('##') + headings = line[1:].split('\t') + if len(headings)==1 and len(line[1:].split()) >= 9: + self.error(line,self.HEADING_NOT_SEPARATED_BY_TABS) + headings = line[1:].split() + + for i,s in enumerate(self._required): + + if len(headings)<=i or headings[i] != s: + + if len(headings) <= i: + err = "(%sth entry not found)" % (i+1) + else: + err = "(found %s, expected %s)" % (headings[i],s) + + #self.error(line,self.BADLY_FORMATTED_HEADING,err) + + # allow FORMAT column to be absent + if len(headings) == 8: + headings.append("FORMAT") + else: + self.error(line,self.BADLY_FORMATTED_HEADING,err) + + self._samples = headings[9:] + self._sample2column = dict( [(y,x) for x,y in enumerate( self._samples ) ] ) + + def write_heading( self, stream ): + stream.write("#" + "\t".join(self._required + self._samples) + "\n") + + def convertGT(self, GTstring): + if GTstring == ".": return ["."] + try: + gts = gtsRegEx.split(GTstring) + if len(gts) == 1: return [int(gts[0])] + if len(gts) != 2: raise ValueError() + if gts[0] == "." and gts[1] == ".": return [gts[0],GTstring[len(gts[0]):-len(gts[1])],gts[1]] + return [int(gts[0]),GTstring[len(gts[0]):-len(gts[1])],int(gts[1])] + except ValueError: + self.error(self._line,self.BAD_GENOTYPE,GTstring) + return [".","|","."] + + + def convertGTback(self, GTdata): + return ''.join(map(str,GTdata)) + + def parse_formatdata( self, key, value, formatdict, line ): + # To do: check that the right number of values is present + f = formatdict.get(key,None) + if f == None: + self._add_definition(formatdict, key, value, line ) + f = formatdict[key] + if f.type == "Flag": + if value is not None: self.error(line,self.ERROR_FLAG_HAS_VALUE) + return [] + values = value.split(',') + # deal with trailing data in some early VCF files + if f.type in ["Float","Integer"] and len(values)>0 and values[-1].find(';') > -1: + self.error(line,self.ERROR_TRAILING_DATA,values[-1]) + values[-1] = values[-1].split(';')[0] + if f.type == "Integer": + for idx,v in enumerate(values): + try: + if v == ".": values[idx] = f.missingvalue + else: values[idx] = int(v) + except: + self.error(line,self.ERROR_FORMAT_NOT_NUMERICAL,values) + return [0] * len(values) + return values + elif f.type == "String": + self._line = line + if f.id == "GT": values = map( self.convertGT, values ) + return values + elif f.type == "Character": + for v in values: + if len(v) != 1: self.error(line,self.ERROR_FORMAT_NOT_CHAR) + return values + elif f.type == "Float": + for idx,v in enumerate(values): + if v == ".": values[idx] = f.missingvalue + try: return map(float,values) + except: + self.error(line,self.ERROR_FORMAT_NOT_NUMERICAL,values) + return [0.0] * len(values) + else: + # can't happen + self.error(line,self.ERROR_INFO_STRING) + + + def inregion(self, chrom, pos): + if not self._regions: return True + for r in self._regions: + if r[0] == chrom and r[1] <= pos < r[2]: return True + return False + + + def parse_data( self, line, lineparse=False ): + cols = line.split('\t') + if len(cols) != len(self._samples)+9: + # gracefully deal with absent FORMAT column + if len(cols) == 8 and len(self._samples)==0: + cols.append("") + else: + self.error(line, + self.BAD_NUMBER_OF_COLUMNS, + "expected %s for %s samples (%s), got %s" % (len(self._samples)+9, len(self._samples), self._samples, len(cols))) + + chrom = cols[0] + + # get 0-based position + try: pos = int(cols[1])-1 + except: self.error(line,self.POS_NOT_NUMERICAL) + if pos < 0: self.error(line,self.POS_NOT_POSITIVE) + + # implement filtering + if not self.inregion(chrom,pos): return None + + # end of first-pass parse for sortedVCF + if lineparse: return chrom, pos, line + + id = cols[2] + + ref = cols[3].upper() + if ref == ".": + self.error(line,self.MISSING_REF) + if self._version == 33: ref = get_sequence(chrom,pos,pos+1,self._reference) + else: ref = "" + else: + for c in ref: + if c not in "ACGTN": self.error(line,self.UNKNOWN_CHAR_IN_REF) + if "N" in ref: ref = get_sequence(chrom,pos,pos+len(ref),self._reference) + + # make sure reference is sane + if self._reference: + left = max(0,pos-100) + faref_leftflank = get_sequence(chrom,left,pos+len(ref),self._reference) + faref = faref_leftflank[pos-left:] + if faref != ref: self.error(line,self.WRONG_REF,"(reference is %s, VCF says %s)" % (faref,ref)) + ref = faref + + # convert v3.3 to v4.0 alleles below + if cols[4] == ".": alt = [] + else: alt = cols[4].upper().split(',') + + if cols[5] == ".": qual = -1 + else: + try: qual = float(cols[5]) + except: self.error(line,self.QUAL_NOT_NUMERICAL) + + # postpone checking that filters exist. Encode missing filter or no filtering as empty list + if cols[6] == "." or cols[6] == "PASS" or cols[6] == "0": filter = [] + else: filter = cols[6].split(';') + + # dictionary of keys, and list of values + info = {} + if cols[7] != ".": + for blurp in cols[7].split(';'): + elts = blurp.split('=') + if len(elts) == 1: v = None + elif len(elts) == 2: v = elts[1] + else: self.error(line,self.ERROR_INFO_STRING) + info[elts[0]] = self.parse_formatdata(elts[0], v, self._info, line) + + # Gracefully deal with absent FORMAT column + if cols[8] == "": format = [] + else: format = cols[8].split(':') + + # check: all filters are defined + for f in filter: + if f not in self._filter: self.error(line,self.FILTER_NOT_DEFINED, f) + + # check: format fields are defined + for f in format: + if f not in self._format: self.error(line,self.FORMAT_NOT_DEFINED, f) + + # convert v3.3 alleles + if self._version == 33: + if len(ref) != 1: self.error(line,self.V33_BAD_REF) + newalts = [] + have_deletions = False + for a in alt: + if len(a) == 1: a = a + ref[1:] # SNP; add trailing reference + elif a.startswith('I'): a = ref[0] + a[1:] + ref[1:] # insertion just beyond pos; add first and trailing reference + elif a.startswith('D'): # allow D and D + have_deletions = True + try: + l = int(a[1:]) # throws ValueError if sequence + if len(ref) < l: # add to reference if necessary + addns = get_sequence(chrom,pos+len(ref),pos+l,self._reference) + ref += addns + for i,na in enumerate(newalts): newalts[i] = na+addns + a = ref[l:] # new deletion, deleting pos...pos+l + except ValueError: + s = a[1:] + if len(ref) < len(s): # add Ns to reference if necessary + addns = get_sequence(chrom,pos+len(ref),pos+len(s),self._reference) + if not s.endswith(addns) and addns != 'N'*len(addns): + self.error(line,self.V33_UNMATCHED_DELETION, + "(deletion is %s, reference is %s)" % (a,get_sequence(chrom,pos,pos+len(s),self._reference))) + ref += addns + for i,na in enumerate(newalts): newalts[i] = na+addns + a = ref[len(s):] # new deletion, deleting from pos + else: + self.error(line,self.V33_BAD_ALLELE) + newalts.append(a) + alt = newalts + # deletion alleles exist, add dummy 1st reference allele, and account for leading base + if have_deletions: + if pos == 0: + # Petr Danacek's: we can't have a leading nucleotide at (1-based) position 1 + addn = get_sequence(chrom,pos+len(ref),pos+len(ref)+1,self._reference) + ref += addn + alt = [allele+addn for allele in alt] + else: + addn = get_sequence(chrom,pos-1,pos,self._reference) + ref = addn + ref + alt = [addn + allele for allele in alt] + pos -= 1 + else: + # format v4.0 -- just check for nucleotides + for allele in alt: + if not alleleRegEx.match(allele): + self.error(line,self.V40_BAD_ALLELE,allele) + + # check for leading nucleotide in indel calls + for allele in alt: + if len(allele) != len(ref): + if len(allele) == 0: self.error(line,self.ZERO_LENGTH_ALLELE) + if ref[0].upper() != allele[0].upper() and "N" not in (ref[0]+allele[0]).upper(): + self.error(line,self.MISSING_INDEL_ALLELE_REF_BASE) + + # trim trailing bases in alleles + for i in range(1,min(len(ref),min(map(len,alt)))): + if len(set(allele[-1].upper() for allele in alt)) > 1 or ref[-1].upper() != alt[0][-1].upper(): + break + ref, alt = ref[:-1], [allele[:-1] for allele in alt] + + # left-align alleles, if a reference is available + if self._leftalign and self._reference: + while left < pos: + movable = True + for allele in alt: + if len(allele) > len(ref): + longest, shortest = allele, ref + else: + longest, shortest = ref, allele + if len(longest) == len(shortest) or longest[:len(shortest)].upper() != shortest.upper(): + movable = False + if longest[-1].upper() != longest[len(shortest)-1].upper(): + movable = False + if not movable: + break + ref = ref[:-1] + alt = [allele[:-1] for allele in alt] + if min(len(allele) for allele in alt) == 0 or len(ref) == 0: + ref = faref_leftflank[pos-left-1] + ref + alt = [faref_leftflank[pos-left-1] + allele for allele in alt] + pos -= 1 + + # parse sample columns + samples = [] + for sample in cols[9:]: + dict = {} + values = sample.split(':') + if len(values) > len(format): + self.error(line,self.BAD_NUMBER_OF_VALUES,"(found %s values in element %s; expected %s)" % (len(values),sample,len(format))) + for idx in range(len(format)): + expected = self.get_expected(format[idx], self._format, alt) + if idx < len(values): value = values[idx] + else: + if expected == -1: value = "." + else: value = ",".join(["."]*expected) + dict[format[idx]] = self.parse_formatdata(format[idx], value, self._format, line) + if expected != -1 and len(dict[format[idx]]) != expected: + self.error(line,self.BAD_NUMBER_OF_PARAMETERS, + "id=%s, expected %s parameters, got %s" % (format[idx],expected,dict[format[idx]])) + if len(dict[format[idx]] ) < expected: dict[format[idx]] += [dict[format[idx]][-1]]*(expected-len(dict[format[idx]])) + dict[format[idx]] = dict[format[idx]][:expected] + samples.append( dict ) + + # done + d = {'chrom':chrom, + 'pos':pos, # return 0-based position + 'id':id, + 'ref':ref, + 'alt':alt, + 'qual':qual, + 'filter':filter, + 'info':info, + 'format':format} + for key,value in zip(self._samples,samples): + d[key] = value + + return d + + + def write_data(self, stream, data): + required = ['chrom','pos','id','ref','alt','qual','filter','info','format'] + self._samples + for k in required: + if k not in data: raise ValueError("Required key %s not found in data" % str(k)) + if data['alt'] == []: alt = "." + else: alt = ",".join(data['alt']) + if data['filter'] == None: filter = "." + elif data['filter'] == []: + if self._version == 33: filter = "0" + else: filter = "PASS" + else: filter = ';'.join(data['filter']) + if data['qual'] == -1: qual = "." + else: qual = str(data['qual']) + + output = [data['chrom'], + str(data['pos']+1), # change to 1-based position + data['id'], + data['ref'], + alt, + qual, + filter, + self.format_formatdata( data['info'], self._info, separator=";" ), + self.format_formatdata( data['format'], self._format, value=False ) ] + + for s in self._samples: + output.append( self.format_formatdata( data[s], self._format, key=False ) ) + + stream.write( "\t".join(output) + "\n" ) + + def _parse_header(self, stream): + self._lineno = 0 + for line in stream: + self._lineno += 1 + if line.startswith('##'): + self.parse_header( line.strip() ) + elif line.startswith('#'): + self.parse_heading( line.strip() ) + self.enter_default_format() + else: + break + return line + + def _parse(self, line, stream): + if len(line.strip()) > 0: + d = self.parse_data( line.strip() ) + if d: yield d + for line in stream: + self._lineno += 1 + if self._lines and self._lineno > self._lines: raise StopIteration + d = self.parse_data( line.strip() ) + if d: yield d + + ###################################################################################################### + # + # API follows + # + ###################################################################################################### + + def getsamples(self): + """ List of samples in VCF file """ + return self._samples + + def setsamples(self,samples): + """ List of samples in VCF file """ + self._samples = samples + + def getheader(self): + """ List of header key-value pairs (strings) """ + return self._header + + def setheader(self,header): + """ List of header key-value pairs (strings) """ + self._header = header + + def getinfo(self): + """ Dictionary of ##INFO tags, as VCF.FORMAT values """ + return self._info + + def setinfo(self,info): + """ Dictionary of ##INFO tags, as VCF.FORMAT values """ + self._info = info + + def getformat(self): + """ Dictionary of ##FORMAT tags, as VCF.FORMAT values """ + return self._format + + def setformat(self,format): + """ Dictionary of ##FORMAT tags, as VCF.FORMAT values """ + self._format = format + + def getfilter(self): + """ Dictionary of ##FILTER tags, as VCF.FORMAT values """ + return self._filter + + def setfilter(self,filter): + """ Dictionary of ##FILTER tags, as VCF.FORMAT values """ + self._filter = filter + + def setversion(self, version): + if version not in [33,40,41]: raise ValueError("Can only handle v3.3, v4.0 and v4.1 VCF files") + self._version = version + + def setregions(self, regions): + self._regions = regions + + def setreference(self, ref): + """ Provide a reference sequence; a Python class supporting a fetch(chromosome, start, end) method, e.g. PySam.FastaFile """ + self._reference = ref + + def ignoreerror(self, errorstring): + try: self._ignored_errors.add(self.__dict__[errorstring]) + except KeyError: raise ValueError("Invalid error string: %s" % errorstring) + + def warnerror(self, errorstring): + try: self._warn_errors.add(self.__dict__[errorstring]) + except KeyError: raise ValueError("Invalid error string: %s" % errorstring) + + def parse(self, stream): + """ Parse a stream of VCF-formatted lines. Initializes class instance and return generator """ + last_line = self._parse_header(stream) + # now return a generator that does the actual work. In this way the pre-processing is done + # before the first piece of data is yielded + return self._parse(last_line, stream) + + def write(self, stream, datagenerator): + """ Writes a VCF file to a stream, using a data generator (or list) """ + self.write_header(stream) + self.write_heading(stream) + for data in datagenerator: self.write_data(stream,data) + + def writeheader(self, stream): + """ Writes a VCF header """ + self.write_header(stream) + self.write_heading(stream) + + def compare_calls(self, pos1, ref1, alt1, pos2, ref2, alt2): + """ Utility function: compares two calls for equality """ + # a variant should always be assigned to a unique position, one base before + # the leftmost position of the alignment gap. If this rule is implemented + # correctly, the two positions must be equal for the calls to be identical. + if pos1 != pos2: return False + # from both calls, trim rightmost bases when identical. Do this safely, i.e. + # only when the reference bases are not Ns + while len(ref1)>0 and len(alt1)>0 and ref1[-1] == alt1[-1]: + ref1 = ref1[:-1] + alt1 = alt1[:-1] + while len(ref2)>0 and len(alt2)>0 and ref2[-1] == alt2[-1]: + ref2 = ref2[:-1] + alt2 = alt2[:-1] + # now, the alternative alleles must be identical + return alt1 == alt2 + +########################################################################################################### +########################################################################################################### +## API functions added by Andreas +########################################################################################################### + + def connect( self, filename ): + '''connect to tabix file.''' + self.tabixfile = pysam.Tabixfile( filename ) + self._parse_header(self.tabixfile.header) + + def fetch(self, + reference = None, + start = None, + end = None, + region = None ): + """ Parse a stream of VCF-formatted lines. Initializes class instance and return generator """ + + iter = self.tabixfile.fetch( reference, start, end, region, parser = pysam.asVCF() ) + for x in iter: + yield VCFRecord( x, self ) + + def validate( self, record ): + '''validate vcf record. + + returns a validated record. + ''' + + chrom, pos = record.chrom, record.pos + + # check reference + ref = record.ref + if ref == ".": + self.error(str(record),self.MISSING_REF) + if self._version == 33: ref = get_sequence(chrom,pos,pos+1,self._reference) + else: ref = "" + else: + for c in ref: + if c not in "ACGTN": self.error(str(record),self.UNKNOWN_CHAR_IN_REF) + if "N" in ref: ref = get_sequence(chrom, + pos, + pos+len(ref), + self._reference) + + # make sure reference is sane + if self._reference: + left = max(0,self.pos-100) + faref_leftflank = get_sequence(chrom,left,self.pos+len(ref),self._reference) + faref = faref_leftflank[pos-left:] + if faref != ref: self.error(line,self.WRONG_REF,"(reference is %s, VCF says %s)" % (faref,ref)) + ref = faref + + # check: format fields are defined + for f in record.format: + if f not in self._format: self.error(str(record),self.FORMAT_NOT_DEFINED, f) + + # check: all filters are defined + for f in record.filter: + if f not in self._filter: self.error(str(record),self.FILTER_NOT_DEFINED, f) + + # convert v3.3 alleles + if self._version == 33: + if len(ref) != 1: self.error(line,self.V33_BAD_REF) + newalts = [] + have_deletions = False + for a in alt: + if len(a) == 1: a = a + ref[1:] # SNP; add trailing reference + elif a.startswith('I'): a = ref[0] + a[1:] + ref[1:] # insertion just beyond pos; add first and trailing reference + elif a.startswith('D'): # allow D and D + have_deletions = True + try: + l = int(a[1:]) # throws ValueError if sequence + if len(ref) < l: # add to reference if necessary + addns = get_sequence(chrom,pos+len(ref),pos+l,self._reference) + ref += addns + for i,na in enumerate(newalts): newalts[i] = na+addns + a = ref[l:] # new deletion, deleting pos...pos+l + except ValueError: + s = a[1:] + if len(ref) < len(s): # add Ns to reference if necessary + addns = get_sequence(chrom,pos+len(ref),pos+len(s),self._reference) + if not s.endswith(addns) and addns != 'N'*len(addns): + self.error(line,self.V33_UNMATCHED_DELETION, + "(deletion is %s, reference is %s)" % (a,get_sequence(chrom,pos,pos+len(s),self._reference))) + ref += addns + for i,na in enumerate(newalts): newalts[i] = na+addns + a = ref[len(s):] # new deletion, deleting from pos + else: + self.error(line,self.V33_BAD_ALLELE) + newalts.append(a) + alt = newalts + # deletion alleles exist, add dummy 1st reference allele, and account for leading base + if have_deletions: + if pos == 0: + # Petr Danacek's: we can't have a leading nucleotide at (1-based) position 1 + addn = get_sequence(chrom,pos+len(ref),pos+len(ref)+1,self._reference) + ref += addn + alt = [allele+addn for allele in alt] + else: + addn = get_sequence(chrom,pos-1,pos,self._reference) + ref = addn + ref + alt = [addn + allele for allele in alt] + pos -= 1 + else: + # format v4.0 -- just check for nucleotides + for allele in alt: + if not alleleRegEx.match(allele): + self.error(line,self.V40_BAD_ALLELE,allele) + + + # check for leading nucleotide in indel calls + for allele in alt: + if len(allele) != len(ref): + if len(allele) == 0: self.error(line,self.ZERO_LENGTH_ALLELE) + if ref[0].upper() != allele[0].upper() and "N" not in (ref[0]+allele[0]).upper(): + self.error(line,self.MISSING_INDEL_ALLELE_REF_BASE) + + # trim trailing bases in alleles + for i in range(1,min(len(ref),min(map(len,alt)))): + if len(set(allele[-1].upper() for allele in alt)) > 1 or ref[-1].upper() != alt[0][-1].upper(): + break + ref, alt = ref[:-1], [allele[:-1] for allele in alt] + + # left-align alleles, if a reference is available + if self._leftalign and self._reference: + while left < pos: + movable = True + for allele in alt: + if len(allele) > len(ref): + longest, shortest = allele, ref + else: + longest, shortest = ref, allele + if len(longest) == len(shortest) or longest[:len(shortest)].upper() != shortest.upper(): + movable = False + if longest[-1].upper() != longest[len(shortest)-1].upper(): + movable = False + if not movable: + break + ref = ref[:-1] + alt = [allele[:-1] for allele in alt] + if min(len(allele) for allele in alt) == 0 or len(ref) == 0: + ref = faref_leftflank[pos-left-1] + ref + alt = [faref_leftflank[pos-left-1] + allele for allele in alt] + pos -= 1 + + + + diff --git a/pysam/__init__.py b/pysam/__init__.py new file mode 100644 index 0000000..ec52d94 --- /dev/null +++ b/pysam/__init__.py @@ -0,0 +1,100 @@ +import os +import sysconfig + +from pysam.libchtslib import * +import pysam.libchtslib as libchtslib +from pysam.libcsamtools import * +from pysam.libcbcftools import * +from pysam.libcutils import * +import pysam.libcutils as libcutils +import pysam.libcfaidx as libcfaidx +from pysam.libcfaidx import * +import pysam.libctabix as libctabix +from pysam.libctabix import * +import pysam.libctabixproxies as libctabixproxies +from pysam.libctabixproxies import * +import pysam.libcsamfile as libcsamfile +from pysam.libcsamfile import * +import pysam.libcalignmentfile as libcalignmentfile +from pysam.libcalignmentfile import * +import pysam.libcalignedsegment as libcalignedsegment +from pysam.libcalignedsegment import * +import pysam.libcvcf as libcvcf +from pysam.libcvcf import * +import pysam.libcbcf as libcbcf +from pysam.libcbcf import * +import pysam.libcbgzf as libcbgzf +from pysam.libcbgzf import * +from pysam.utils import SamtoolsError +import pysam.Pileup as Pileup +from pysam.samtools import * +import pysam.config + + +# export all the symbols from separate modules +__all__ = ( + libchtslib.__all__ + # type: ignore + libcutils.__all__ + # type: ignore + libctabix.__all__ + # type: ignore + libcvcf.__all__ + # type: ignore + libcbcf.__all__ + # type: ignore + libcbgzf.__all__ + # type: ignore + libcfaidx.__all__ + # type: ignore + libctabixproxies.__all__ + # type: ignore + libcalignmentfile.__all__ + # type: ignore + libcalignedsegment.__all__ + # type: ignore + libcsamfile.__all__ + # type: ignore + ["SamtoolsError"] + + ["Pileup"] +) +from pysam.version import __version__, __samtools_version__ + + +def get_include(): + '''return a list of include directories.''' + dirname = os.path.abspath(os.path.join(os.path.dirname(__file__))) + + # + # Header files may be stored in different relative locations + # depending on installation mode (e.g., `python setup.py install`, + # `python setup.py develop`. The first entry in each list is + # where develop-mode headers can be found. + # + htslib_possibilities = [os.path.join(dirname, '..', 'htslib'), + os.path.join(dirname, 'include', 'htslib')] + samtool_possibilities = [os.path.join(dirname, '..', 'samtools'), + os.path.join(dirname, 'include', 'samtools')] + + includes = [dirname] + for header_locations in [htslib_possibilities, samtool_possibilities]: + for header_location in header_locations: + if os.path.exists(header_location): + includes.append(os.path.abspath(header_location)) + break + + return includes + + +def get_defines(): + '''return a list of defined compilation parameters.''' + # ('_FILE_OFFSET_BITS', '64'), + # ('_USE_KNETFILE', '')] + return [] + + +def get_libraries(): + '''return a list of libraries to link against.''' + # Note that this list does not include libcsamtools.so as there are + # numerous name conflicts with libchtslib.so. + dirname = os.path.abspath(os.path.join(os.path.dirname(__file__))) + pysam_libs = ['libctabixproxies', + 'libcfaidx', + 'libcsamfile', + 'libcvcf', + 'libcbcf', + 'libctabix'] + if pysam.config.HTSLIB == "builtin": + pysam_libs.append('libchtslib') + + so = sysconfig.get_config_var('SO') + return [os.path.join(dirname, x + so) for x in pysam_libs] diff --git a/pysam/alternatives.py.obsolete b/pysam/alternatives.py.obsolete new file mode 100644 index 0000000..fd76802 --- /dev/null +++ b/pysam/alternatives.py.obsolete @@ -0,0 +1,82 @@ +# This file contains an alternative implementation +# to call samtools functions. These are direct calls. +# Plus: less overhead +# Minus: more trouble in maintaining + +#in csamtools.pxd + # samtools toolkit functions + ctypedef int (*pysam_samtools_f)(int argc, char *argv[]) + + int bam_taf2baf(int argc, char *argv[]) + int bam_pileup(int argc, char *argv[]) + int bam_merge(int argc, char *argv[]) + int bam_index(int argc, char *argv[]) + int bam_sort(int argc, char *argv[]) + int bam_tview_main(int argc, char *argv[]) + int bam_mating(int argc, char *argv[]) + int bam_rmdup(int argc, char *argv[]) + int bam_rmdupse(int argc, char *argv[]) + int bam_flagstat(int argc, char *argv[]) + int bam_fillmd(int argc, char *argv[]) + int main_samview(int argc, char *argv[]) + int main_import(int argc, char *argv[]) + int faidx_main(int argc, char *argv[]) + int glf3_view_main(int argc, char *argv[]) + + +## Alternative code in csamtools.pyx +cdef class SamtoolsWrapper: + '''generic wrapper around samtools functions''' + cdef pysam_samtools_f f + + def __init__(self): self.f = NULL + + def call(self, *args ): + + if self.f == NULL: raise NotImplementedError("invalid call to base class" ) + + cdef char ** cargs + cdef int i, n, retval + n = len(args) + # allocate one more for first (dummy) argument (contains command) + cargs = calloc( n+1, sizeof( char *) ) + cargs[0] = "method" + for i from 0 <= i < n: + cargs[i+1] = args[i] + for i from 0 <= i < n+1: + print cargs[i] + retval = self.f(n+1, cargs) + free( cargs ) + return retval + +cdef class SamtoolsWrapperImport( SamtoolsWrapper ): + def __init__(self): self.f = main_import +cdef class SamtoolsWrapperPileup( SamtoolsWrapper ): + def __init__(self): self.f = bam_pileup +cdef class SamtoolsWrapperMerge( SamtoolsWrapper ): + def __init__(self): self.f = bam_merge +cdef class SamtoolsWrapperSort( SamtoolsWrapper ): + def __init__(self): self.f = bam_sort +cdef class SamtoolsWrapperIndex( SamtoolsWrapper ): + def __init__(self): self.f = bam_index +cdef class SamtoolsWrapperFaidx( SamtoolsWrapper ): + def __init__(self): self.f = faidx_main +cdef class SamtoolsWrapperFixMate( SamtoolsWrapper ): + def __init__(self): self.f = bam_mating +cdef class SamtoolsWrapperRmDup( SamtoolsWrapper ): + def __init__(self): self.f = bam_rmdup +cdef class SamtoolsWrapperRmDupSe( SamtoolsWrapper ): + def __init__(self): self.f = bam_rmdupse +cdef class SamtoolsWrapperGlf3Viwen( SamtoolsWrapper ): + def __init__(self): self.f = glf3_view_main +cdef class SamtoolsWrapperFlagStat( SamtoolsWrapper ): + def __init__(self): self.f = bam_flagstat +cdef class SamtoolsWrapperFillMd( SamtoolsWrapper ): + def __init__(self): self.f = bam_fillmd +cdef class SamtoolsWrapperCalMd( SamtoolsWrapper ): + def __init__(self): self.f = bam_fillmd + +automatic creation of these functions does not work +due to pyrex/cython + +def sort( *args, **kwargs ): return SamtoolsWrapperSort().call(*args, **kwargs) diff --git a/pysam/bcftools.py b/pysam/bcftools.py new file mode 100644 index 0000000..4cbe82f --- /dev/null +++ b/pysam/bcftools.py @@ -0,0 +1,29 @@ +from pysam.utils import PysamDispatcher + +BCFTOOLS_DISPATCH = [ + "index", + "annotate", + "concat", + "convert", + "isec", + "merge", + "norm", + "plugin", + "query", + "reheader", + "sort", + "view", + "head", + "call", + "consensus", + "cnv", + "csq", + "filter", + "gtcheck", + "mpileup", + "roh", + "stats"] + +# instantiate bcftools commands as python functions +for cmd in BCFTOOLS_DISPATCH: + globals()[cmd] = PysamDispatcher("bcftools", cmd, None) diff --git a/pysam/cbcftools_util.h b/pysam/cbcftools_util.h new file mode 100644 index 0000000..4a9f2e9 --- /dev/null +++ b/pysam/cbcftools_util.h @@ -0,0 +1,6 @@ +#ifndef CBCFTOOLS_UTIL_H +#define CBCFTOOLS_UTIL_H + +int bcftools_main(int argc, char *argv[]); + +#endif diff --git a/pysam/csamtools_util.h b/pysam/csamtools_util.h new file mode 100644 index 0000000..0a03c13 --- /dev/null +++ b/pysam/csamtools_util.h @@ -0,0 +1,6 @@ +#ifndef CSAMTOOLS_UTIL_H +#define CSAMTOOLS_UTIL_H + +int samtools_main(int argc, char *argv[]); + +#endif diff --git a/pysam/htslib_util.c b/pysam/htslib_util.c new file mode 100644 index 0000000..0830900 --- /dev/null +++ b/pysam/htslib_util.c @@ -0,0 +1,159 @@ +#include +#include +#include "htslib/khash.h" +#include "htslib/ksort.h" +#include "htslib/sam.h" +#include "htslib/hts.h" +#include "htslib/knetfile.h" +#include "htslib/kseq.h" +#include "htslib_util.h" +#include + +#ifndef inline +#define inline __inline +#endif + +// set htslib verbosity level +extern int hts_verbose; +int hts_set_verbosity(int verbosity) +{ + int old_verbosity = hts_verbose; + hts_verbose = verbosity; + return old_verbosity; +} + +int hts_get_verbosity(void) +{ + return hts_verbose; +} + + +// taken from samtools/bam_import.c +static inline uint8_t * alloc_data(bam1_t *b, size_t size) +{ + if (b->m_data < size) + { + b->m_data = size; + kroundup32(b->m_data); + b->data = (uint8_t*)realloc(b->data, b->m_data); + } + return b->data; +} + +// update the variable length data within a bam1_t entry. +// Adds *nbytes_new* - *nbytes_old* into the variable length data of *src* at *pos*. +// Data within the bam1_t entry is moved so that it is +// consistent with the data field lengths. +// Return NULL on error (memory allocation) +bam1_t * pysam_bam_update(bam1_t * b, + const size_t nbytes_old, + const size_t nbytes_new, + uint8_t * field_start) +{ + int d = nbytes_new - nbytes_old; + int new_size; + size_t nbytes_before; + uint8_t * retval = NULL; + + // no change + if (d == 0) + return b; + + // new size of total data + new_size = d + b->l_data; + + // fields before field in data + nbytes_before = field_start - b->data; + + if (b->l_data != 0) + { + assert(nbytes_before >= 0); + assert(nbytes_before <= b->l_data); + } + + // increase memory if required + if (d > 0) + { + retval = alloc_data(b, new_size); + if (retval == NULL) + return NULL; + field_start = b->data + nbytes_before; + } + + // move data after field to new location + memmove(field_start + nbytes_new, + field_start + nbytes_old, + b->l_data - (nbytes_before + nbytes_old)); + + // adjust l_data + b->l_data = new_size; + + return b; +} + +// translate a nucleotide character to binary code +unsigned char pysam_translate_sequence(const unsigned char s) +{ + return seq_nt16_table[s]; +} + +// Auxiliary functions for B support +void bam_aux_appendB(bam1_t *b, + const char tag[2], + char type, + char subtype, + int len, + uint8_t *data) +{ + + int ori_len; + int l_data; + + // check that type is 'B' + if('B' != type) return; + + ori_len = b->l_data; + + l_data = len * aux_type2size(subtype); + // infer the data length from the sub-type + b->l_data += 8 + l_data; + + // htslib: obsolete? + // b->l_aux += 8 + l_data; + if (b->m_data < b->l_data) + { + b->m_data = b->l_data; + kroundup32(b->m_data); + b->data = (uint8_t*)realloc(b->data, b->m_data); + } + + b->data[ori_len] = tag[0]; + b->data[ori_len + 1] = tag[1]; + // tag + b->data[ori_len + 2] = type; + // type + b->data[ori_len + 3] = subtype; + // subtype + (*(int32_t*)(b->data + ori_len + 4)) = len; + // size + memcpy(b->data + ori_len + 8, data, l_data); + // data +} + +int aux_type2size(uint8_t type) +{ + switch (type) { + case 'A': case 'c': case 'C': + return 1; + case 's': case 'S': + return 2; + case 'i': case 'I': case 'f': + return 4; + case 'd': + return 8; + case 'Z': case 'H': case 'B': + return type; + default: + return 0; + } +} diff --git a/pysam/htslib_util.h b/pysam/htslib_util.h new file mode 100644 index 0000000..63fdaaa --- /dev/null +++ b/pysam/htslib_util.h @@ -0,0 +1,97 @@ +#ifndef HTSLIB_UTIL_H +#define HTSLIB_UTIL_H + +#include "htslib/sam.h" +#include "htslib/vcf.h" +#include "htslib/khash.h" + +int hts_set_verbosity(int verbosity); +int hts_get_verbosity(void); + + +KHASH_MAP_INIT_STR(vdict, bcf_idinfo_t) +typedef khash_t(vdict) vdict_t; + +KHASH_DECLARE(s2i, kh_cstr_t, int64_t) +typedef khash_t(s2i) s2i_t; + +////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////// +// various helper functions +// + +/*! + @abstract Update the variable length data within a bam1_t entry + + Old data is deleted and the data within b are re-arranged to + make place for new data. + + @discussion Return NULL on error, otherwise b is returned. + + @param b bam1_t data + @param nbytes_old size of old data + @param nbytes_new size of new data + @param pos position of data +*/ +bam1_t * pysam_bam_update(bam1_t * b, + const size_t nbytes_old, + const size_t nbytes_new, + uint8_t * pos); + +// translate a nucleotide character to binary code +unsigned char pysam_translate_sequence(const unsigned char s); + +// return byte size of type +int aux_type2size(uint8_t type); + + +//------------------------------------------------------- +// Wrapping accessor macros in sam.h +static inline int pysam_bam_is_rev(bam1_t * b) { + return bam_is_rev(b);}; + +static inline int pysam_bam_is_mrev(bam1_t * b) { + return bam_is_mrev(b);} + +static inline char * pysam_bam_get_qname(bam1_t * b) { + return bam_get_qname(b);} + +static inline uint32_t * pysam_bam_get_cigar(bam1_t * b) { + return bam_get_cigar(b);} + +static inline uint8_t * pysam_bam_get_seq(bam1_t * b) { + return bam_get_seq(b);} + +static inline uint8_t * pysam_bam_get_qual(bam1_t * b) { + return bam_get_qual(b);} + +static inline uint8_t * pysam_bam_get_aux(bam1_t * b) { + return bam_get_aux(b);} + +static inline int pysam_bam_get_l_aux(bam1_t * b) { + return bam_get_l_aux(b); } + +static inline char pysam_bam_seqi(uint8_t * s, int i) { + return bam_seqi(s,i);} + +static inline uint8_t pysam_get_qual(bam1_t * b) { + return b->core.qual;} + +static inline uint32_t pysam_get_n_cigar(bam1_t * b) { + return b->core.n_cigar;} + +static inline void pysam_set_qual(bam1_t * b, uint8_t v) { + b->core.qual=v;} + +static inline void pysam_set_n_cigar(bam1_t * b, uint32_t v) { + b->core.n_cigar=v;} + +static inline void pysam_update_flag(bam1_t * b, uint16_t v, uint16_t flag) { + if (v) + b->core.flag |= flag; + else + b->core.flag &= ~flag; +} + +#endif diff --git a/pysam/include/__init__.py b/pysam/include/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pysam/libcalignedsegment.pxd b/pysam/libcalignedsegment.pxd new file mode 100644 index 0000000..32e2c97 --- /dev/null +++ b/pysam/libcalignedsegment.pxd @@ -0,0 +1,102 @@ +from pysam.libchtslib cimport * + +cdef extern from "htslib_util.h": + + # add *nbytes* into the variable length data of *src* at *pos* + bam1_t * pysam_bam_update(bam1_t * b, + size_t nbytes_old, + size_t nbytes_new, + uint8_t * pos) + + # now: static + int aux_type2size(int) + + char * pysam_bam_get_qname(bam1_t * b) + uint32_t * pysam_bam_get_cigar(bam1_t * b) + uint8_t * pysam_bam_get_seq(bam1_t * b) + uint8_t * pysam_bam_get_qual(bam1_t * b) + uint8_t * pysam_bam_get_aux(bam1_t * b) + int pysam_bam_get_l_aux(bam1_t * b) + char pysam_bam_seqi(uint8_t * s, int i) + + uint8_t pysam_get_qual(bam1_t * b) + uint32_t pysam_get_n_cigar(bam1_t * b) + void pysam_set_qual(bam1_t * b, uint8_t v) + void pysam_set_n_cigar(bam1_t * b, uint32_t v) + void pysam_update_flag(bam1_t * b, uint16_t v, uint16_t flag) + + +from pysam.libcalignmentfile cimport AlignmentFile, AlignmentHeader +ctypedef AlignmentFile AlignmentFile_t + + +# Note: need to declare all C fields and methods here +cdef class AlignedSegment: + + # object that this AlignedSegment represents + cdef bam1_t * _delegate + + # the header that a read is associated with + cdef readonly AlignmentHeader header + + # caching of array properties for quick access + cdef object cache_query_qualities + cdef object cache_query_alignment_qualities + cdef object cache_query_sequence + cdef object cache_query_alignment_sequence + + # add an alignment tag with value to the AlignedSegment + # an existing tag of the same name will be replaced. + cpdef set_tag(self, tag, value, value_type=?, replace=?) + + # get an alignment tag from the AlignedSegment + cpdef get_tag(self, tag, with_value_type=?) + + # return true if tag exists + cpdef has_tag(self, tag) + + # returns a valid sam alignment string + cpdef to_string(self) + + # returns a valid sam alignment string (deprecated) + cpdef tostring(self, htsfile=*) + + +cdef class PileupColumn: + cdef const bam_pileup1_t ** plp + cdef int tid + cdef int pos + cdef int n_pu + cdef AlignmentHeader header + cdef uint32_t min_base_quality + cdef kstring_t buf + cdef char * reference_sequence + +cdef class PileupRead: + cdef int32_t _qpos + cdef AlignedSegment _alignment + cdef int _indel + cdef int _level + cdef uint32_t _is_del + cdef uint32_t _is_head + cdef uint32_t _is_tail + cdef uint32_t _is_refskip + +# factory methods +cdef AlignedSegment makeAlignedSegment( + bam1_t * src, + AlignmentHeader header) + +cdef PileupColumn makePileupColumn( + const bam_pileup1_t ** plp, + int tid, + int pos, + int n_pu, + uint32_t min_base_quality, + char * reference_sequence, + AlignmentHeader header) + +cdef PileupRead makePileupRead(const bam_pileup1_t * src, + AlignmentHeader header) + +cdef uint32_t get_alignment_length(bam1_t * src) diff --git a/pysam/libcalignedsegment.pyi b/pysam/libcalignedsegment.pyi new file mode 100644 index 0000000..4e4b1d6 --- /dev/null +++ b/pysam/libcalignedsegment.pyi @@ -0,0 +1,222 @@ +import enum +import re +import sys +from array import array +from typing import Any, List, Optional, Dict, Tuple, Union, overload + +if sys.version_info < (3, 8): + from typing_extensions import Literal +else: + from typing import Literal + +from pysam import AlignmentHeader # type: ignore + +CMATCH: int +CINS: int +CDEL: int +CREF_SKIP: int +CSOFT_CLIP: int +CHARD_CLIP: int +CPAD: int +CEQUAL: int +CDIFF: int +CBACK: int + +FPAIRED: int +FPROPER_PAIR: int +FUNMAP: int +FMUNMAP: int +FREVERSE: int +FMREVERSE: int +FREAD1: int +FREAD2: int +FSECONDARY: int +FQCFAIL: int +FDUP: int +FSUPPLEMENTARY: int + +CIGAR2CODE: Dict[int, str] +CIGAR_REGEX: re.Pattern +DATATYPE2FORMAT: Dict[int, Tuple[str, int]] +KEY_NAMES: List[str] + +TagValue = Union[str, int, float, array] + +class CIGAR_OPS(enum.IntEnum): + CBACK: int + CDEL: int + CDIFF: int + CEQUAL: int + CHARD_CLIP: int + CINS: int + CMATCH: int + CPAD: int + CREF_SKIP: int + CSOFT_CLIP: int + +class SAM_FLAGS(enum.IntEnum): + FDUP: int + FMREVERSE: int + FMUNMAP: int + FPAIRED: int + FPROPER_PAIR: int + FQCFAIL: int + FREAD1: int + FREAD2: int + FREVERSE: int + FSECONDARY: int + FSUPPLEMENTARY: int + FUNMAP: int + +class AlignedSegment: + header: AlignmentHeader + query_name: Optional[str] + flag: int + reference_name: Optional[str] + reference_id: int + reference_start: int + mapping_quality: int + cigarstring: Optional[str] + next_reference_id: int + next_reference_name: Optional[str] + next_reference_start: int + template_length: int + query_sequence: Optional[str] + query_qualities: Optional[array] + bin: int + is_paired: bool + is_proper_pair: bool + is_unmapped: bool + mate_is_unmapped: bool + is_reverse: bool + mate_is_reverse: bool + is_read1: bool + is_read2: bool + is_secondary: bool + is_qcfail: bool + is_duplicate: bool + is_supplementary: bool + cigartuples: Optional[List[Tuple[int, int]]] + def __init__(self, header: Optional[AlignmentHeader] = ...) -> None: ... + def compare(self, other: Any) -> int: ... + def to_string(self) -> str: ... + @classmethod + def fromstring(cls, sam: str, header: AlignmentHeader) -> AlignedSegment: ... + def to_dict(self) -> Dict: ... + @classmethod + def from_dict(cls, sam_dict: Dict[str, Any], header: AlignmentHeader) -> Any: ... + def get_reference_positions(self, full_length: bool = ...) -> List[int]: ... + @property + def query_length(self) -> int: ... + @property + def reference_end(self) -> Optional[int]: ... + @property + def reference_length(self) -> Optional[int]: ... + @property + def query_alignment_sequence(self) -> Optional[str]: ... + @property + def query_alignment_qualities(self) -> Optional[array]: ... + @property + def query_alignment_start(self) -> int: ... + @property + def query_alignment_end(self) -> int: ... + @property + def query_alignment_length(self) -> int: ... + def infer_query_length(self) -> Optional[int]: ... + def infer_read_length(self) -> Optional[int]: ... + def get_reference_sequence(self) -> str: ... + def get_forward_sequence(self) -> Optional[str]: ... + def get_forward_qualities(self) -> Optional[array]: ... + def get_aligned_pairs( + self, matches_only: bool = ..., with_seq: bool = ... + ) -> List[Tuple[int, int]]: ... + def get_blocks(self) -> List[Tuple[int, int]]: ... + def get_overlap(self, start: int, end: int) -> Optional[int]: ... + def get_cigar_stats(self) -> Tuple[array, array]: ... + def set_tag( + self, + tag: str, + value: Union[int, float, str, bytes, array, List, Tuple, None], + value_type: Optional[ + Literal["A", "i", "f", "Z", "H", "B", "c", "C", "s", "S", "I"] + ] = ..., + replace: bool = ..., + ) -> None: ... + def has_tag(self, tag: str) -> bool: ... + @overload + def get_tag(self, tag: str, with_value_type: Literal[False] = ...) -> TagValue: ... + @overload + def get_tag( + self, tag: str, with_value_type: Literal[True] + ) -> Tuple[TagValue, str]: ... + @overload + def get_tag( + self, tag: str, with_value_type: bool + ) -> Union[TagValue, Tuple[TagValue, str]]: ... + @overload + def get_tags( + self, with_value_type: Literal[False] = ... + ) -> List[Tuple[str, TagValue]]: ... + @overload + def get_tags( + self, with_value_type: Literal[True] + ) -> List[Tuple[str, TagValue, str]]: ... + @overload + def get_tags( + self, with_value_type: bool + ) -> Union[List[Tuple[str, TagValue]], List[Tuple[str, TagValue, str]]]: ... + @overload + def get_tags( + self, with_value_type: bool = ... + ) -> Union[List[Tuple[str, TagValue, str]], List[Tuple[str, TagValue]]]: ... + def set_tags(self, tags: Any) -> None: ... + def __eq__(self, other): ... + def __ge__(self, other): ... + def __gt__(self, other): ... + def __le__(self, other): ... + def __lt__(self, other): ... + def __ne__(self, other): ... + +class PileupRead: + @property + def alignment(self) -> AlignedSegment: ... + @property + def query_position(self) -> Optional[int]: ... + @property + def query_position_or_next(self) -> int: ... + @property + def indel(self) -> int: ... + @property + def level(self) -> int: ... + @property + def is_del(self) -> int: ... + @property + def is_head(self) -> int: ... + @property + def is_tail(self) -> int: ... + @property + def is_refskip(self) -> int: ... + +class PileupColumn: + nsegments: int + def set_min_base_quality(self, min_base_quality: int) -> None: ... + def __len__(self) -> int: ... + @property + def reference_id(self) -> int: ... + @property + def reference_name(self) -> Optional[str]: ... + @property + def reference_pos(self) -> int: ... + @property + def pileups(self) -> List[PileupRead]: ... + def get_num_aligned(self) -> int: ... + def get_query_sequences( + self, + mark_matches: bool = ..., + mark_ends: bool = ..., + add_indels: bool = ..., + ) -> List[str]: ... + def get_query_qualities(self) -> List[int]: ... + def get_mapping_qualities(self) -> List[int]: ... + def get_query_positions(self) -> List[int]: ... + def get_query_names(self) -> List[str]: ... diff --git a/pysam/libcalignedsegment.pyx b/pysam/libcalignedsegment.pyx new file mode 100644 index 0000000..810a861 --- /dev/null +++ b/pysam/libcalignedsegment.pyx @@ -0,0 +1,3409 @@ +# cython: embedsignature=True +# cython: profile=True +############################################################################### +############################################################################### +# Cython wrapper for SAM/BAM/CRAM files based on htslib +############################################################################### +# The principal classes defined in this module are: +# +# class AlignedSegment an aligned segment (read) +# +# class PileupColumn a collection of segments (PileupRead) aligned to +# a particular genomic position. +# +# class PileupRead an AlignedSegment aligned to a particular genomic +# position. Contains additional attributes with respect +# to this. +# +# Additionally this module defines numerous additional classes that are part +# of the internal API. These are: +# +# Various iterator classes to iterate over alignments in sequential (IteratorRow) +# or in a stacked fashion (IteratorColumn): +# +# class IteratorRow +# class IteratorRowRegion +# class IteratorRowHead +# class IteratorRowAll +# class IteratorRowAllRefs +# class IteratorRowSelection +# +############################################################################### +# +# The MIT License +# +# Copyright (c) 2015 Andreas Heger +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +############################################################################### +import re +import array +import json +import string +import ctypes +import struct + +cimport cython +from cpython cimport array as c_array +from cpython.version cimport PY_MAJOR_VERSION +from cpython cimport PyBytes_FromStringAndSize +from libc.string cimport memset, strchr +from cpython cimport array as c_array +from libc.stdint cimport INT8_MIN, INT16_MIN, INT32_MIN, \ + INT8_MAX, INT16_MAX, INT32_MAX, \ + UINT8_MAX, UINT16_MAX, UINT32_MAX + +from pysam.libchtslib cimport HTS_IDX_NOCOOR +from pysam.libcutils cimport force_bytes, force_str, \ + charptr_to_str, charptr_to_bytes +from pysam.libcutils cimport qualities_to_qualitystring, qualitystring_to_array, \ + array_to_qualitystring + +# Constants for binary tag conversion +cdef char * htslib_types = 'cCsSiIf' +cdef char * parray_types = 'bBhHiIf' + +cdef bint IS_PYTHON3 = PY_MAJOR_VERSION >= 3 + +# translation tables + +# cigar code to character and vice versa +cdef char* CODE2CIGAR= "MIDNSHP=XB" +cdef int NCIGAR_CODES = 10 + +if IS_PYTHON3: + CIGAR2CODE = dict([y, x] for x, y in enumerate(CODE2CIGAR)) + maketrans = str.maketrans +else: + CIGAR2CODE = dict([ord(y), x] for x, y in enumerate(CODE2CIGAR)) + maketrans = string.maketrans + +CIGAR_REGEX = re.compile("(\d+)([MIDNSHP=XB])") + +# names for keys in dictionary representation of an AlignedSegment +KEY_NAMES = ["name", "flag", "ref_name", "ref_pos", "map_quality", "cigar", + "next_ref_name", "next_ref_pos", "length", "seq", "qual", "tags"] + +##################################################################### +# C multiplication with wrapping around +cdef inline uint32_t c_mul(uint32_t a, uint32_t b): + return (a * b) & 0xffffffff + + +cdef inline uint8_t tolower(uint8_t ch): + if ch >= 65 and ch <= 90: + return ch + 32 + else: + return ch + + +cdef inline uint8_t toupper(uint8_t ch): + if ch >= 97 and ch <= 122: + return ch - 32 + else: + return ch + + +cdef inline uint8_t strand_mark_char(uint8_t ch, bam1_t *b): + if ch == '=': + if bam_is_rev(b): + return ',' + else: + return '.' + else: + if bam_is_rev(b): + return tolower(ch) + else: + return toupper(ch) + + +cdef inline bint pileup_base_qual_skip(const bam_pileup1_t * p, uint32_t threshold): + cdef uint32_t c + if p.qpos < p.b.core.l_qseq: + c = bam_get_qual(p.b)[p.qpos] + else: + c = 0 + if c < threshold: + return True + return False + + +cdef inline char map_typecode_htslib_to_python(uint8_t s): + """map an htslib typecode to the corresponding python typecode + to be used in the struct or array modules.""" + + # map type from htslib to python array + cdef char * f = strchr(htslib_types, s) + + if f == NULL: + return 0 + return parray_types[f - htslib_types] + + +cdef inline uint8_t map_typecode_python_to_htslib(char s): + """determine value type from type code of array""" + cdef char * f = strchr(parray_types, s) + if f == NULL: + return 0 + return htslib_types[f - parray_types] + + +cdef inline void update_bin(bam1_t * src): + if src.core.flag & BAM_FUNMAP: + # treat alignment as length of 1 for unmapped reads + src.core.bin = hts_reg2bin( + src.core.pos, + src.core.pos + 1, + 14, + 5) + elif pysam_get_n_cigar(src): + src.core.bin = hts_reg2bin( + src.core.pos, + bam_endpos(src), + 14, + 5) + else: + src.core.bin = hts_reg2bin( + src.core.pos, + src.core.pos + 1, + 14, + 5) + + +# optional tag data manipulation +cdef convert_binary_tag(uint8_t * tag): + """return bytesize, number of values and array of values + in aux_data memory location pointed to by tag.""" + cdef uint8_t auxtype + cdef uint8_t byte_size + cdef int32_t nvalues + # get byte size + auxtype = tag[0] + byte_size = aux_type2size(auxtype) + tag += 1 + # get number of values in array + nvalues = (tag)[0] + tag += 4 + + # define python array + cdef c_array.array c_values = array.array( + chr(map_typecode_htslib_to_python(auxtype))) + c_array.resize(c_values, nvalues) + + # copy data + memcpy(c_values.data.as_voidptr, tag, nvalues * byte_size) + + # no need to check for endian-ness as bam1_core_t fields + # and aux_data are in host endian-ness. See sam.c and calls + # to swap_data + return byte_size, nvalues, c_values + + +cdef inline uint8_t get_tag_typecode(value, value_type=None): + """guess type code for a *value*. If *value_type* is None, the type + code will be inferred based on the Python type of *value* + + """ + # 0 is unknown typecode + cdef char typecode = 0 + + if value_type is None: + if isinstance(value, int): + if value < 0: + if value >= INT8_MIN: + typecode = 'c' + elif value >= INT16_MIN: + typecode = 's' + elif value >= INT32_MIN: + typecode = 'i' + # unsigned ints + else: + if value <= UINT8_MAX: + typecode = 'C' + elif value <= UINT16_MAX: + typecode = 'S' + elif value <= UINT32_MAX: + typecode = 'I' + elif isinstance(value, float): + typecode = 'f' + elif isinstance(value, str): + typecode = 'Z' + elif isinstance(value, bytes): + typecode = 'Z' + elif isinstance(value, array.array) or \ + isinstance(value, list) or \ + isinstance(value, tuple): + typecode = 'B' + else: + if value_type in 'aAsSIcCZidfH': + typecode = force_bytes(value_type)[0] + + return typecode + + +cdef inline uint8_t get_btag_typecode(value, min_value=None, max_value=None): + '''returns the value typecode of a value. + + If max is specified, the appropriate type is returned for a range + where value is the minimum. + + Note that this method returns types from the extended BAM alphabet + of types that includes tags that are not part of the SAM + specification. + ''' + + + cdef uint8_t typecode + + t = type(value) + + if t is float: + typecode = 'f' + elif t is int: + if max_value is None: + max_value = value + if min_value is None: + min_value = value + # signed ints + if min_value < 0: + if min_value >= INT8_MIN and max_value <= INT8_MAX: + typecode = 'c' + elif min_value >= INT16_MIN and max_value <= INT16_MAX: + typecode = 's' + elif min_value >= INT32_MIN or max_value <= INT32_MAX: + typecode = 'i' + else: + raise ValueError( + "at least one signed integer out of range of " + "BAM/SAM specification") + # unsigned ints + else: + if max_value <= UINT8_MAX: + typecode = 'C' + elif max_value <= UINT16_MAX: + typecode = 'S' + elif max_value <= UINT32_MAX: + typecode = 'I' + else: + raise ValueError( + "at least one integer out of range of BAM/SAM specification") + else: + # Note: hex strings (H) are not supported yet + if t is not bytes: + value = value.encode('ascii') + if len(value) == 1: + typecode = 'A' + else: + typecode = 'Z' + + return typecode + + +# mapping python array.array and htslib typecodes to struct typecodes +DATATYPE2FORMAT = { + ord('c'): ('b', 1), + ord('C'): ('B', 1), + ord('s'): ('h', 2), + ord('S'): ('H', 2), + ord('i'): ('i', 4), + ord('I'): ('I', 4), + ord('f'): ('f', 4), + ord('d'): ('d', 8), + ord('A'): ('c', 1), + ord('a'): ('c', 1)} + + +cdef inline pack_tags(tags): + """pack a list of tags. Each tag is a tuple of (tag, tuple). + + Values are packed into the most space efficient data structure + possible unless the tag contains a third field with the typecode. + + Returns a format string and the associated list of arguments to be + used in a call to struct.pack_into. + """ + fmts, args = ["<"], [] + + # htslib typecode + cdef uint8_t typecode + for tag in tags: + + if len(tag) == 2: + pytag, value = tag + valuetype = None + elif len(tag) == 3: + pytag, value, valuetype = tag + else: + raise ValueError("malformatted tag: %s" % str(tag)) + + if valuetype is None: + typecode = 0 + else: + # only first character in valuecode matters + if IS_PYTHON3: + typecode = force_bytes(valuetype)[0] + else: + typecode = ord(valuetype[0]) + + pytag = force_bytes(pytag) + pytype = type(value) + + if pytype is tuple or pytype is list: + # binary tags from tuples or lists + if not typecode: + # automatically determine value type - first value + # determines type. If there is a mix of types, the + # result is undefined. + typecode = get_btag_typecode(min(value), + min_value=min(value), + max_value=max(value)) + + if typecode not in DATATYPE2FORMAT: + raise ValueError("invalid value type '{}'".format(chr(typecode))) + + datafmt = "2sBBI%i%s" % (len(value), DATATYPE2FORMAT[typecode][0]) + args.extend([pytag[:2], + ord("B"), + typecode, + len(value)] + list(value)) + + elif isinstance(value, array.array): + # binary tags from arrays + if typecode == 0: + typecode = map_typecode_python_to_htslib(ord(value.typecode)) + + if typecode == 0: + raise ValueError("unsupported type code '{}'".format(value.typecode)) + + if typecode not in DATATYPE2FORMAT: + raise ValueError("invalid value type '{}' ({})".format(chr(typecode), array.typecode)) + + # use array.tostring() to retrieve byte representation and + # save as bytes + datafmt = "2sBBI%is" % (len(value) * DATATYPE2FORMAT[typecode][1]) + if IS_PYTHON3: + args.extend([pytag[:2], + ord("B"), + typecode, + len(value), + value.tobytes()]) + else: + args.extend([pytag[:2], + ord("B"), + typecode, + len(value), + force_bytes(value.tostring())]) + + else: + if typecode == 0: + typecode = get_tag_typecode(value) + if typecode == 0: + raise ValueError("could not deduce typecode for value {}".format(value)) + + if typecode == 'a' or typecode == 'A' or typecode == 'Z' or typecode == 'H': + value = force_bytes(value) + + if typecode == "a": + typecode = 'A' + + if typecode == 'Z' or typecode == 'H': + datafmt = "2sB%is" % (len(value)+1) + else: + datafmt = "2sB%s" % DATATYPE2FORMAT[typecode][0] + + args.extend([pytag[:2], + typecode, + value]) + + fmts.append(datafmt) + + return "".join(fmts), args + + +cdef inline int32_t calculateQueryLengthWithoutHardClipping(bam1_t * src): + """return query length computed from CIGAR alignment. + + Length ignores hard-clipped bases. + + Return 0 if there is no CIGAR alignment. + """ + + cdef uint32_t * cigar_p = pysam_bam_get_cigar(src) + + if cigar_p == NULL: + return 0 + + cdef uint32_t k, qpos + cdef int op + qpos = 0 + + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + + if op == BAM_CMATCH or \ + op == BAM_CINS or \ + op == BAM_CSOFT_CLIP or \ + op == BAM_CEQUAL or \ + op == BAM_CDIFF: + qpos += cigar_p[k] >> BAM_CIGAR_SHIFT + + return qpos + + +cdef inline int32_t calculateQueryLengthWithHardClipping(bam1_t * src): + """return query length computed from CIGAR alignment. + + Length includes hard-clipped bases. + + Return 0 if there is no CIGAR alignment. + """ + + cdef uint32_t * cigar_p = pysam_bam_get_cigar(src) + + if cigar_p == NULL: + return 0 + + cdef uint32_t k, qpos + cdef int op + qpos = 0 + + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + + if op == BAM_CMATCH or \ + op == BAM_CINS or \ + op == BAM_CSOFT_CLIP or \ + op == BAM_CHARD_CLIP or \ + op == BAM_CEQUAL or \ + op == BAM_CDIFF: + qpos += cigar_p[k] >> BAM_CIGAR_SHIFT + + return qpos + + +cdef inline int32_t getQueryStart(bam1_t *src) except -1: + cdef uint32_t * cigar_p + cdef uint32_t start_offset = 0 + cdef uint32_t k, op + + cigar_p = pysam_bam_get_cigar(src); + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + if op == BAM_CHARD_CLIP: + if start_offset != 0 and start_offset != src.core.l_qseq: + raise ValueError('Invalid clipping in CIGAR string') + elif op == BAM_CSOFT_CLIP: + start_offset += cigar_p[k] >> BAM_CIGAR_SHIFT + else: + break + + return start_offset + + +cdef inline int32_t getQueryEnd(bam1_t *src) except -1: + cdef uint32_t * cigar_p = pysam_bam_get_cigar(src) + cdef uint32_t end_offset = src.core.l_qseq + cdef uint32_t k, op + + # if there is no sequence, compute length from cigar string + if end_offset == 0: + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + if op == BAM_CMATCH or \ + op == BAM_CINS or \ + op == BAM_CEQUAL or \ + op == BAM_CDIFF or \ + (op == BAM_CSOFT_CLIP and end_offset == 0): + end_offset += cigar_p[k] >> BAM_CIGAR_SHIFT + else: + # walk backwards in cigar string + for k from pysam_get_n_cigar(src) > k >= 1: + op = cigar_p[k] & BAM_CIGAR_MASK + if op == BAM_CHARD_CLIP: + if end_offset != src.core.l_qseq: + raise ValueError('Invalid clipping in CIGAR string') + elif op == BAM_CSOFT_CLIP: + end_offset -= cigar_p[k] >> BAM_CIGAR_SHIFT + else: + break + + return end_offset + + +cdef inline bytes getSequenceInRange(bam1_t *src, + uint32_t start, + uint32_t end): + """return python string of the sequence in a bam1_t object. + """ + + cdef uint8_t * p + cdef uint32_t k + cdef char * s + + if not src.core.l_qseq: + return None + + seq = PyBytes_FromStringAndSize(NULL, end - start) + s = seq + p = pysam_bam_get_seq(src) + + for k from start <= k < end: + # equivalent to seq_nt16_str[bam1_seqi(s, i)] (see bam.c) + # note: do not use string literal as it will be a python string + s[k-start] = seq_nt16_str[p[k/2] >> 4 * (1 - k%2) & 0xf] + + return charptr_to_bytes(seq) + + +cdef inline object getQualitiesInRange(bam1_t *src, + uint32_t start, + uint32_t end): + """return python array of quality values from a bam1_t object""" + + cdef uint8_t * p + cdef uint32_t k + + p = pysam_bam_get_qual(src) + if p[0] == 0xff: + return None + + # 'B': unsigned char + cdef c_array.array result = array.array('B', [0]) + c_array.resize(result, end - start) + + # copy data + memcpy(result.data.as_voidptr, &p[start], end - start) + + return result + + +##################################################################### +## factory methods for instantiating extension classes +cdef class AlignedSegment +cdef AlignedSegment makeAlignedSegment(bam1_t *src, + AlignmentHeader header): + '''return an AlignedSegment object constructed from `src`''' + # note that the following does not call __init__ + cdef AlignedSegment dest = AlignedSegment.__new__(AlignedSegment) + dest._delegate = bam_dup1(src) + dest.header = header + return dest + + +cdef class PileupColumn +cdef PileupColumn makePileupColumn(const bam_pileup1_t ** plp, + int tid, + int pos, + int n_pu, + uint32_t min_base_quality, + char * reference_sequence, + AlignmentHeader header): + '''return a PileupColumn object constructed from pileup in `plp` and + setting additional attributes. + + ''' + # note that the following does not call __init__ + cdef PileupColumn dest = PileupColumn.__new__(PileupColumn) + dest.header = header + dest.plp = plp + dest.tid = tid + dest.pos = pos + dest.n_pu = n_pu + dest.min_base_quality = min_base_quality + dest.reference_sequence = reference_sequence + dest.buf.l = dest.buf.m = 0 + dest.buf.s = NULL + + return dest + + +cdef class PileupRead +cdef PileupRead makePileupRead(const bam_pileup1_t *src, + AlignmentHeader header): + '''return a PileupRead object construted from a bam_pileup1_t * object.''' + # note that the following does not call __init__ + cdef PileupRead dest = PileupRead.__new__(PileupRead) + dest._alignment = makeAlignedSegment(src.b, header) + dest._qpos = src.qpos + dest._indel = src.indel + dest._level = src.level + dest._is_del = src.is_del + dest._is_head = src.is_head + dest._is_tail = src.is_tail + dest._is_refskip = src.is_refskip + return dest + + +cdef inline uint32_t get_alignment_length(bam1_t *src): + cdef uint32_t k = 0 + cdef uint32_t l = 0 + if src == NULL: + return 0 + cdef uint32_t * cigar_p = bam_get_cigar(src) + if cigar_p == NULL: + return 0 + cdef int op + cdef uint32_t n = pysam_get_n_cigar(src) + for k from 0 <= k < n: + op = cigar_p[k] & BAM_CIGAR_MASK + if op == BAM_CSOFT_CLIP or op == BAM_CHARD_CLIP: + continue + l += cigar_p[k] >> BAM_CIGAR_SHIFT + return l + + +cdef inline uint32_t get_md_reference_length(char * md_tag): + cdef int l = 0 + cdef int md_idx = 0 + cdef int nmatches = 0 + + while md_tag[md_idx] != 0: + if md_tag[md_idx] >= 48 and md_tag[md_idx] <= 57: + nmatches *= 10 + nmatches += md_tag[md_idx] - 48 + md_idx += 1 + continue + else: + l += nmatches + nmatches = 0 + if md_tag[md_idx] == '^': + md_idx += 1 + while md_tag[md_idx] >= 65 and md_tag[md_idx] <= 90: + md_idx += 1 + l += 1 + else: + md_idx += 1 + l += 1 + + l += nmatches + return l + +# TODO: avoid string copying for getSequenceInRange, reconstituneSequenceFromMD, ... +cdef inline bytes build_alignment_sequence(bam1_t * src): + """return expanded sequence from MD tag. + + The sequence includes substitutions and both insertions in the + reference as well as deletions to the reference sequence. Combine + with the cigar string to reconstitute the query or the reference + sequence. + + Positions corresponding to `N` (skipped region from the reference) + or `P` (padding (silent deletion from padded reference)) in the CIGAR + string will not appear in the returned sequence. The MD should + correspondingly not contain these. Thus proper tags are:: + + Deletion from the reference: cigar=5M1D5M MD=5^C5 + Skipped region from reference: cigar=5M1N5M MD=10 + Padded region in the reference: cigar=5M1P5M MD=10 + + Returns + ------- + + None, if no MD tag is present. + + """ + if src == NULL: + return None + + cdef uint8_t * md_tag_ptr = bam_aux_get(src, "MD") + if md_tag_ptr == NULL: + return None + + cdef uint32_t start = getQueryStart(src) + cdef uint32_t end = getQueryEnd(src) + # get read sequence, taking into account soft-clipping + r = getSequenceInRange(src, start, end) + cdef char * read_sequence = r + cdef uint32_t * cigar_p = pysam_bam_get_cigar(src) + if cigar_p == NULL: + return None + + cdef uint32_t r_idx = 0 + cdef int op + cdef uint32_t k, i, l, x + cdef int nmatches = 0 + cdef int s_idx = 0 + + cdef uint32_t max_len = get_alignment_length(src) + if max_len == 0: + raise ValueError("could not determine alignment length") + + cdef char * s = calloc(max_len + 1, sizeof(char)) + if s == NULL: + raise ValueError( + "could not allocate sequence of length %i" % max_len) + + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + l = cigar_p[k] >> BAM_CIGAR_SHIFT + if op == BAM_CMATCH or op == BAM_CEQUAL or op == BAM_CDIFF: + for i from 0 <= i < l: + s[s_idx] = read_sequence[r_idx] + r_idx += 1 + s_idx += 1 + elif op == BAM_CDEL: + for i from 0 <= i < l: + s[s_idx] = '-' + s_idx += 1 + elif op == BAM_CREF_SKIP: + pass + elif op == BAM_CINS or op == BAM_CPAD: + for i from 0 <= i < l: + # encode insertions into reference as lowercase + s[s_idx] = read_sequence[r_idx] + 32 + r_idx += 1 + s_idx += 1 + elif op == BAM_CSOFT_CLIP: + pass + elif op == BAM_CHARD_CLIP: + pass # advances neither + + cdef char * md_tag = bam_aux2Z(md_tag_ptr) + cdef int md_idx = 0 + cdef char c + s_idx = 0 + + # Check if MD tag is valid by matching CIGAR length to MD tag defined length + # Insertions would be in addition to what is described by MD, so we calculate + # the number of insertions separately. + cdef int insertions = 0 + + while s[s_idx] != 0: + if s[s_idx] >= 'a': + insertions += 1 + s_idx += 1 + s_idx = 0 + + cdef uint32_t md_len = get_md_reference_length(md_tag) + if md_len + insertions > max_len: + free(s) + raise AssertionError( + "Invalid MD tag: MD length {} mismatch with CIGAR length {} and {} insertions".format( + md_len, max_len, insertions)) + + while md_tag[md_idx] != 0: + # c is numerical + if md_tag[md_idx] >= 48 and md_tag[md_idx] <= 57: + nmatches *= 10 + nmatches += md_tag[md_idx] - 48 + md_idx += 1 + continue + else: + # save matches up to this point, skipping insertions + for x from 0 <= x < nmatches: + while s[s_idx] >= 'a': + s_idx += 1 + s_idx += 1 + while s[s_idx] >= 'a': + s_idx += 1 + + r_idx += nmatches + nmatches = 0 + if md_tag[md_idx] == '^': + md_idx += 1 + while md_tag[md_idx] >= 65 and md_tag[md_idx] <= 90: + # assert s[s_idx] == '-' + s[s_idx] = md_tag[md_idx] + s_idx += 1 + md_idx += 1 + else: + # save mismatch + # enforce lower case + c = md_tag[md_idx] + if c <= 90: + c += 32 + s[s_idx] = c + s_idx += 1 + r_idx += 1 + md_idx += 1 + + # save matches up to this point, skipping insertions + for x from 0 <= x < nmatches: + while s[s_idx] >= 'a': + s_idx += 1 + s_idx += 1 + while s[s_idx] >= 'a': + s_idx += 1 + + seq = PyBytes_FromStringAndSize(s, s_idx) + free(s) + + return seq + + +cdef inline bytes build_reference_sequence(bam1_t * src): + """return the reference sequence in the region that is covered by the + alignment of the read to the reference. + + This method requires the MD tag to be set. + + """ + cdef uint32_t k, i, l + cdef int op + cdef int s_idx = 0 + ref_seq = build_alignment_sequence(src) + if ref_seq is None: + raise ValueError("MD tag not present") + + cdef char * s = calloc(len(ref_seq) + 1, sizeof(char)) + if s == NULL: + raise ValueError( + "could not allocate sequence of length %i" % len(ref_seq)) + + cdef char * cref_seq = ref_seq + cdef uint32_t * cigar_p = pysam_bam_get_cigar(src) + cdef uint32_t r_idx = 0 + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + l = cigar_p[k] >> BAM_CIGAR_SHIFT + if op == BAM_CMATCH or op == BAM_CEQUAL or op == BAM_CDIFF: + for i from 0 <= i < l: + s[s_idx] = cref_seq[r_idx] + r_idx += 1 + s_idx += 1 + elif op == BAM_CDEL: + for i from 0 <= i < l: + s[s_idx] = cref_seq[r_idx] + r_idx += 1 + s_idx += 1 + elif op == BAM_CREF_SKIP: + pass + elif op == BAM_CINS or op == BAM_CPAD: + r_idx += l + elif op == BAM_CSOFT_CLIP: + pass + elif op == BAM_CHARD_CLIP: + pass # advances neither + + seq = PyBytes_FromStringAndSize(s, s_idx) + free(s) + + return seq + + +cdef class AlignedSegment: + '''Class representing an aligned segment. + + This class stores a handle to the samtools C-structure representing + an aligned read. Member read access is forwarded to the C-structure + and converted into python objects. This implementation should be fast, + as only the data needed is converted. + + For write access, the C-structure is updated in-place. This is + not the most efficient way to build BAM entries, as the variable + length data is concatenated and thus needs to be resized if + a field is updated. Furthermore, the BAM entry might be + in an inconsistent state. + + One issue to look out for is that the sequence should always + be set *before* the quality scores. Setting the sequence will + also erase any quality scores that were set previously. + + Parameters + ---------- + + header: + :class:`~pysam.AlignmentHeader` object to map numerical + identifiers to chromosome names. If not given, an empty + header is created. + ''' + + # Now only called when instances are created from Python + def __init__(self, AlignmentHeader header=None): + # see bam_init1 + self._delegate = calloc(1, sizeof(bam1_t)) + if self._delegate == NULL: + raise MemoryError("could not allocated memory of {} bytes".format(sizeof(bam1_t))) + # allocate some memory. If size is 0, calloc does not return a + # pointer that can be passed to free() so allocate 40 bytes + # for a new read + self._delegate.m_data = 40 + self._delegate.data = calloc( + self._delegate.m_data, 1) + if self._delegate.data == NULL: + raise MemoryError("could not allocate memory of {} bytes".format(self._delegate.m_data)) + self._delegate.l_data = 0 + # set some data to make read approximately legit. + # Note, SAM writing fails with q_name of length 0 + self._delegate.core.l_qname = 0 + self._delegate.core.tid = -1 + self._delegate.core.pos = -1 + self._delegate.core.mtid = -1 + self._delegate.core.mpos = -1 + + # caching for selected fields + self.cache_query_qualities = None + self.cache_query_alignment_qualities = None + self.cache_query_sequence = None + self.cache_query_alignment_sequence = None + + self.header = header + + def __dealloc__(self): + bam_destroy1(self._delegate) + + def __str__(self): + """return string representation of alignment. + + The representation is an approximate :term:`SAM` format, because + an aligned read might not be associated with a :term:`AlignmentFile`. + As a result :term:`tid` is shown instead of the reference name. + Similarly, the tags field is returned in its parsed state. + + To get a valid SAM record, use :meth:`to_string`. + """ + # sam-parsing is done in sam.c/bam_format1_core which + # requires a valid header. + return "\t".join(map(str, (self.query_name, + self.flag, + "#%d" % self.reference_id if self.reference_id >= 0 else "*", + self.reference_start + 1, + self.mapping_quality, + self.cigarstring, + "#%d" % self.next_reference_id if self.next_reference_id >= 0 else "*", + self.next_reference_start + 1, + self.template_length, + self.query_sequence, + self.query_qualities, + self.tags))) + + def __copy__(self): + return makeAlignedSegment(self._delegate, self.header) + + def __deepcopy__(self, memo): + return makeAlignedSegment(self._delegate, self.header) + + def compare(self, AlignedSegment other): + '''return -1,0,1, if contents in this are binary + <,=,> to *other* + ''' + + # avoid segfault when other equals None + if other is None: + return -1 + + cdef int retval, x + cdef bam1_t *t + cdef bam1_t *o + + t = self._delegate + o = other._delegate + + # uncomment for debugging purposes + # cdef unsigned char * oo, * tt + # tt = (&t.core) + # oo = (&o.core) + # for x from 0 <= x < sizeof( bam1_core_t): print x, tt[x], oo[x] + # tt = (t.data) + # oo = (o.data) + # for x from 0 <= x < max(t.l_data, o.l_data): print x, tt[x], oo[x], chr(tt[x]), chr(oo[x]) + + # Fast-path test for object identity + if t == o: + return 0 + + cdef uint8_t *a = &t.core + cdef uint8_t *b = &o.core + + retval = memcmp(&t.core, &o.core, sizeof(bam1_core_t)) + if retval: + return retval + + # cmp(t.l_data, o.l_data) + retval = (t.l_data > o.l_data) - (t.l_data < o.l_data) + if retval: + return retval + return memcmp(t.data, o.data, t.l_data) + + def __richcmp__(self, AlignedSegment other, int op): + if op == 2: # == operator + return self.compare(other) == 0 + elif op == 3: # != operator + return self.compare(other) != 0 + else: + return NotImplemented + + def __hash__(self): + cdef bam1_t * src = self._delegate + cdef int x + + # see http://effbot.org/zone/python-hash.htm + cdef uint8_t * c = &src.core + cdef uint32_t hash_value = c[0] + for x from 1 <= x < sizeof(bam1_core_t): + hash_value = c_mul(hash_value, 1000003) ^ c[x] + c = src.data + for x from 0 <= x < src.l_data: + hash_value = c_mul(hash_value, 1000003) ^ c[x] + + return hash_value + + cpdef to_string(self): + """returns a string representation of the aligned segment. + + The output format is valid SAM format if a header is associated + with the AlignedSegment. + """ + cdef kstring_t line + line.l = line.m = 0 + line.s = NULL + + if self.header: + if sam_format1(self.header.ptr, self._delegate, &line) < 0: + if line.m: + free(line.s) + raise ValueError('sam_format failed') + else: + raise NotImplementedError("todo") + + ret = force_str(line.s[:line.l]) + + if line.m: + free(line.s) + + return ret + + @classmethod + def fromstring(cls, sam, AlignmentHeader header): + """parses a string representation of the aligned segment. + + The input format should be valid SAM format. + + Parameters + ---------- + sam: + :term:`SAM` formatted string + + """ + cdef AlignedSegment dest = cls.__new__(cls) + dest._delegate = calloc(1, sizeof(bam1_t)) + dest.header = header + + cdef kstring_t line + line.l = line.m = len(sam) + _sam = force_bytes(sam) + line.s = _sam + + sam_parse1(&line, dest.header.ptr, dest._delegate) + + return dest + + cpdef tostring(self, htsfile=None): + """deprecated, use :meth:`to_string()` instead. + + Parameters + ---------- + + htsfile: + (deprecated) AlignmentFile object to map numerical + identifiers to chromosome names. This parameter is present + for backwards compatibility and ignored. + """ + + return self.to_string() + + def to_dict(self): + """returns a json representation of the aligned segment. + + Field names are abbreviated versions of the class attributes. + """ + # let htslib do the string conversions, but treat optional field properly as list + vals = self.to_string().split("\t") + n = len(KEY_NAMES) - 1 + return dict(list(zip(KEY_NAMES[:-1], vals[:n])) + [(KEY_NAMES[-1], vals[n:])]) + + @classmethod + def from_dict(cls, sam_dict, AlignmentHeader header): + """parses a dictionary representation of the aligned segment. + + Parameters + ---------- + sam_dict: + dictionary of alignment values, keys corresponding to output from + :meth:`todict()`. + + """ + # let htslib do the parsing + # the tags field can be missing + return cls.fromstring( + "\t".join((sam_dict[x] for x in KEY_NAMES[:-1])) + + "\t" + + "\t".join(sam_dict.get(KEY_NAMES[-1], [])), header) + + ######################################################## + ## Basic attributes in order of appearance in SAM format + property query_name: + """the query template name (None if not present)""" + def __get__(self): + + cdef bam1_t * src = self._delegate + if src.core.l_qname == 0: + return None + + return charptr_to_str(pysam_bam_get_qname(src)) + + def __set__(self, qname): + + if qname is None or len(qname) == 0: + return + + if len(qname) > 254: + raise ValueError("query length out of range {} > 254".format( + len(qname))) + + qname = force_bytes(qname) + cdef bam1_t * src = self._delegate + # the qname is \0 terminated + cdef uint8_t l = len(qname) + 1 + + cdef char * p = pysam_bam_get_qname(src) + cdef uint8_t l_extranul = 0 + + if l % 4 != 0: + l_extranul = 4 - l % 4 + + cdef bam1_t * retval = pysam_bam_update(src, + src.core.l_qname, + l + l_extranul, + p) + if retval == NULL: + raise MemoryError("could not allocate memory") + + src.core.l_extranul = l_extranul + src.core.l_qname = l + l_extranul + + # re-acquire pointer to location in memory + # as it might have moved + p = pysam_bam_get_qname(src) + + strncpy(p, qname, l) + # x might be > 255 + cdef uint16_t x = 0 + + for x from l <= x < l + l_extranul: + p[x] = '\0' + + property flag: + """properties flag""" + def __get__(self): + return self._delegate.core.flag + def __set__(self, flag): + self._delegate.core.flag = flag + + property reference_name: + """:term:`reference` name""" + def __get__(self): + if self._delegate.core.tid == -1: + return None + if self.header: + return self.header.get_reference_name(self._delegate.core.tid) + else: + raise ValueError("reference_name unknown if no header associated with record") + def __set__(self, reference): + cdef int tid + if reference is None or reference == "*": + self._delegate.core.tid = -1 + elif self.header: + tid = self.header.get_tid(reference) + if tid < 0: + raise ValueError("reference {} does not exist in header".format( + reference)) + self._delegate.core.tid = tid + else: + raise ValueError("reference_name can not be set if no header associated with record") + + property reference_id: + """:term:`reference` ID + + .. note:: + + This field contains the index of the reference sequence in + the sequence dictionary. To obtain the name of the + reference sequence, use :meth:`get_reference_name()` + + """ + def __get__(self): + return self._delegate.core.tid + def __set__(self, tid): + if tid != -1 and self.header and not self.header.is_valid_tid(tid): + raise ValueError("reference id {} does not exist in header".format( + tid)) + self._delegate.core.tid = tid + + property reference_start: + """0-based leftmost coordinate""" + def __get__(self): + return self._delegate.core.pos + def __set__(self, pos): + ## setting the position requires updating the "bin" attribute + cdef bam1_t * src + src = self._delegate + src.core.pos = pos + update_bin(src) + + property mapping_quality: + """mapping quality""" + def __get__(self): + return pysam_get_qual(self._delegate) + def __set__(self, qual): + pysam_set_qual(self._delegate, qual) + + property cigarstring: + '''the :term:`cigar` alignment as a string. + + The cigar string is a string of alternating integers + and characters denoting the length and the type of + an operation. + + .. note:: + The order length,operation is specified in the + SAM format. It is different from the order of + the :attr:`cigar` property. + + Returns None if not present. + + To unset the cigarstring, assign None or the + empty string. + ''' + def __get__(self): + c = self.cigartuples + if c is None: + return None + # reverse order + else: + return "".join([ "%i%c" % (y,CODE2CIGAR[x]) for x,y in c]) + + def __set__(self, cigar): + if cigar is None or len(cigar) == 0: + self.cigartuples = [] + else: + parts = CIGAR_REGEX.findall(cigar) + # reverse order + self.cigartuples = [(CIGAR2CODE[ord(y)], int(x)) for x,y in parts] + + # TODO + # property cigar: + # """the cigar alignment""" + + property next_reference_id: + """the :term:`reference` id of the mate/next read.""" + def __get__(self): + return self._delegate.core.mtid + def __set__(self, mtid): + if mtid != -1 and self.header and not self.header.is_valid_tid(mtid): + raise ValueError("reference id {} does not exist in header".format( + mtid)) + self._delegate.core.mtid = mtid + + property next_reference_name: + """:term:`reference` name of the mate/next read (None if no + AlignmentFile is associated)""" + def __get__(self): + if self._delegate.core.mtid == -1: + return None + if self.header: + return self.header.get_reference_name(self._delegate.core.mtid) + else: + raise ValueError("next_reference_name unknown if no header associated with record") + + def __set__(self, reference): + cdef int mtid + if reference is None or reference == "*": + self._delegate.core.mtid = -1 + elif reference == "=": + self._delegate.core.mtid = self._delegate.core.tid + elif self.header: + mtid = self.header.get_tid(reference) + if mtid < 0: + raise ValueError("reference {} does not exist in header".format( + reference)) + self._delegate.core.mtid = mtid + else: + raise ValueError("next_reference_name can not be set if no header associated with record") + + property next_reference_start: + """the position of the mate/next read.""" + def __get__(self): + return self._delegate.core.mpos + def __set__(self, mpos): + self._delegate.core.mpos = mpos + + property query_length: + """the length of the query/read. + + This value corresponds to the length of the sequence supplied + in the BAM/SAM file. The length of a query is 0 if there is no + sequence in the BAM/SAM file. In those cases, the read length + can be inferred from the CIGAR alignment, see + :meth:`pysam.AlignedSegment.infer_query_length`. + + The length includes soft-clipped bases and is equal to + ``len(query_sequence)``. + + This property is read-only but is updated when a new query + sequence is assigned to this AlignedSegment. + + Returns 0 if not available. + + """ + def __get__(self): + return self._delegate.core.l_qseq + + property template_length: + """the observed query template length""" + def __get__(self): + return self._delegate.core.isize + def __set__(self, isize): + self._delegate.core.isize = isize + + property query_sequence: + """read sequence bases, including :term:`soft clipped` bases + (None if not present). + + Assigning to this attribute will invalidate any quality scores. + Thus, to in-place edit the sequence and quality scores, copies of + the quality scores need to be taken. Consider trimming for example:: + + q = read.query_qualities + read.query_sequence = read.query_sequence[5:10] + read.query_qualities = q[5:10] + + The sequence is returned as it is stored in the BAM file. (This will + be the reverse complement of the original read sequence if the mapper + has aligned the read to the reverse strand.) + """ + def __get__(self): + if self.cache_query_sequence: + return self.cache_query_sequence + + cdef bam1_t * src + cdef char * s + src = self._delegate + + if src.core.l_qseq == 0: + return None + + self.cache_query_sequence = force_str(getSequenceInRange( + src, 0, src.core.l_qseq)) + return self.cache_query_sequence + + def __set__(self, seq): + # samtools manages sequence and quality length memory together + # if no quality information is present, the first byte says 0xff. + cdef bam1_t * src + cdef uint8_t * p + cdef char * s + cdef int l, k + cdef Py_ssize_t nbytes_new, nbytes_old + + if seq == None: + l = 0 + else: + l = len(seq) + seq = force_bytes(seq) + + src = self._delegate + + # as the sequence is stored in half-bytes, the total length (sequence + # plus quality scores) is (l+1)/2 + l + nbytes_new = (l + 1) / 2 + l + nbytes_old = (src.core.l_qseq + 1) / 2 + src.core.l_qseq + + # acquire pointer to location in memory + p = pysam_bam_get_seq(src) + src.core.l_qseq = l + + # change length of data field + cdef bam1_t * retval = pysam_bam_update(src, + nbytes_old, + nbytes_new, + p) + + if retval == NULL: + raise MemoryError("could not allocate memory") + + if l > 0: + # re-acquire pointer to location in memory + # as it might have moved + p = pysam_bam_get_seq(src) + for k from 0 <= k < nbytes_new: + p[k] = 0 + # convert to C string + s = seq + for k from 0 <= k < l: + p[k/2] |= seq_nt16_table[s[k]] << 4 * (1 - k % 2) + + # erase qualities + p = pysam_bam_get_qual(src) + memset(p, 0xff, l) + + self.cache_query_sequence = force_str(seq) + + # clear cached values for quality values + self.cache_query_qualities = None + self.cache_query_alignment_qualities = None + + property query_qualities: + """read sequence base qualities, including :term:`soft clipped` bases + (None if not present). + + Quality scores are returned as a python array of unsigned + chars. Note that this is not the ASCII-encoded value typically + seen in FASTQ or SAM formatted files. Thus, no offset of 33 + needs to be subtracted. + + Note that to set quality scores the sequence has to be set + beforehand as this will determine the expected length of the + quality score array. + + This method raises a ValueError if the length of the + quality scores and the sequence are not the same. + + """ + def __get__(self): + + if self.cache_query_qualities: + return self.cache_query_qualities + + cdef bam1_t * src + cdef char * q + + src = self._delegate + + if src.core.l_qseq == 0: + return None + + self.cache_query_qualities = getQualitiesInRange(src, 0, src.core.l_qseq) + return self.cache_query_qualities + + def __set__(self, qual): + + # note that memory is already allocated via setting the sequence + # hence length match of sequence and quality needs is checked. + cdef bam1_t * src + cdef uint8_t * p + cdef int l + + src = self._delegate + p = pysam_bam_get_qual(src) + if qual is None or len(qual) == 0: + # if absent and there is a sequence: set to 0xff + memset(p, 0xff, src.core.l_qseq) + return + + # check for length match + l = len(qual) + if src.core.l_qseq != l: + raise ValueError( + "quality and sequence mismatch: %i != %i" % + (l, src.core.l_qseq)) + + # create a python array object filling it + # with the quality scores + + # NB: should avoid this copying if qual is + # already of the correct type. + cdef c_array.array result = c_array.array('B', qual) + + # copy data + memcpy(p, result.data.as_voidptr, l) + + # save in cache + self.cache_query_qualities = qual + + property bin: + """properties bin""" + def __get__(self): + return self._delegate.core.bin + def __set__(self, bin): + self._delegate.core.bin = bin + + + ########################################################## + # Derived simple attributes. These are simple attributes of + # AlignedSegment getting and setting values. + ########################################################## + # 1. Flags + ########################################################## + property is_paired: + """true if read is paired in sequencing""" + def __get__(self): + return (self.flag & BAM_FPAIRED) != 0 + def __set__(self,val): + pysam_update_flag(self._delegate, val, BAM_FPAIRED) + + property is_proper_pair: + """true if read is mapped in a proper pair""" + def __get__(self): + return (self.flag & BAM_FPROPER_PAIR) != 0 + def __set__(self,val): + pysam_update_flag(self._delegate, val, BAM_FPROPER_PAIR) + + property is_unmapped: + """true if read itself is unmapped""" + def __get__(self): + return (self.flag & BAM_FUNMAP) != 0 + def __set__(self, val): + pysam_update_flag(self._delegate, val, BAM_FUNMAP) + # setting the unmapped flag requires recalculation of + # bin as alignment length is now implicitly 1 + update_bin(self._delegate) + + property is_mapped: + """true if read itself is mapped + (implemented in terms of :attr:`is_unmapped`)""" + def __get__(self): + return (self.flag & BAM_FUNMAP) == 0 + def __set__(self, val): + pysam_update_flag(self._delegate, not val, BAM_FUNMAP) + update_bin(self._delegate) + + property mate_is_unmapped: + """true if the mate is unmapped""" + def __get__(self): + return (self.flag & BAM_FMUNMAP) != 0 + def __set__(self,val): + pysam_update_flag(self._delegate, val, BAM_FMUNMAP) + + property mate_is_mapped: + """true if the mate is mapped + (implemented in terms of :attr:`mate_is_unmapped`)""" + def __get__(self): + return (self.flag & BAM_FMUNMAP) == 0 + def __set__(self,val): + pysam_update_flag(self._delegate, not val, BAM_FMUNMAP) + + property is_reverse: + """true if read is mapped to reverse strand""" + def __get__(self): + return (self.flag & BAM_FREVERSE) != 0 + def __set__(self,val): + pysam_update_flag(self._delegate, val, BAM_FREVERSE) + + property is_forward: + """true if read is mapped to forward strand + (implemented in terms of :attr:`is_reverse`)""" + def __get__(self): + return (self.flag & BAM_FREVERSE) == 0 + def __set__(self,val): + pysam_update_flag(self._delegate, not val, BAM_FREVERSE) + + property mate_is_reverse: + """true if the mate is mapped to reverse strand""" + def __get__(self): + return (self.flag & BAM_FMREVERSE) != 0 + def __set__(self,val): + pysam_update_flag(self._delegate, val, BAM_FMREVERSE) + + property mate_is_forward: + """true if the mate is mapped to forward strand + (implemented in terms of :attr:`mate_is_reverse`)""" + def __get__(self): + return (self.flag & BAM_FMREVERSE) == 0 + def __set__(self,val): + pysam_update_flag(self._delegate, not val, BAM_FMREVERSE) + + property is_read1: + """true if this is read1""" + def __get__(self): + return (self.flag & BAM_FREAD1) != 0 + def __set__(self,val): + pysam_update_flag(self._delegate, val, BAM_FREAD1) + property is_read2: + """true if this is read2""" + def __get__(self): + return (self.flag & BAM_FREAD2) != 0 + def __set__(self, val): + pysam_update_flag(self._delegate, val, BAM_FREAD2) + property is_secondary: + """true if not primary alignment""" + def __get__(self): + return (self.flag & BAM_FSECONDARY) != 0 + def __set__(self, val): + pysam_update_flag(self._delegate, val, BAM_FSECONDARY) + property is_qcfail: + """true if QC failure""" + def __get__(self): + return (self.flag & BAM_FQCFAIL) != 0 + def __set__(self, val): + pysam_update_flag(self._delegate, val, BAM_FQCFAIL) + property is_duplicate: + """true if optical or PCR duplicate""" + def __get__(self): + return (self.flag & BAM_FDUP) != 0 + def __set__(self, val): + pysam_update_flag(self._delegate, val, BAM_FDUP) + property is_supplementary: + """true if this is a supplementary alignment""" + def __get__(self): + return (self.flag & BAM_FSUPPLEMENTARY) != 0 + def __set__(self, val): + pysam_update_flag(self._delegate, val, BAM_FSUPPLEMENTARY) + + # 2. Coordinates and lengths + property reference_end: + '''aligned reference position of the read on the reference genome. + + reference_end points to one past the last aligned residue. + Returns None if not available (read is unmapped or no cigar + alignment present). + + ''' + def __get__(self): + cdef bam1_t * src + src = self._delegate + if (self.flag & BAM_FUNMAP) or pysam_get_n_cigar(src) == 0: + return None + return bam_endpos(src) + + property reference_length: + '''aligned length of the read on the reference genome. + + This is equal to `reference_end - reference_start`. + Returns None if not available. + ''' + def __get__(self): + cdef bam1_t * src + src = self._delegate + if (self.flag & BAM_FUNMAP) or pysam_get_n_cigar(src) == 0: + return None + return bam_endpos(src) - \ + self._delegate.core.pos + + property query_alignment_sequence: + """aligned portion of the read. + + This is a substring of :attr:`query_sequence` that excludes flanking + bases that were :term:`soft clipped` (None if not present). It + is equal to ``query_sequence[query_alignment_start:query_alignment_end]``. + + SAM/BAM files may include extra flanking bases that are not + part of the alignment. These bases may be the result of the + Smith-Waterman or other algorithms, which may not require + alignments that begin at the first residue or end at the last. + In addition, extra sequencing adapters, multiplex identifiers, + and low-quality bases that were not considered for alignment + may have been retained. + + """ + + def __get__(self): + if self.cache_query_alignment_sequence: + return self.cache_query_alignment_sequence + + cdef bam1_t * src + cdef uint32_t start, end + + src = self._delegate + + if src.core.l_qseq == 0: + return None + + start = getQueryStart(src) + end = getQueryEnd(src) + + self.cache_query_alignment_sequence = force_str( + getSequenceInRange(src, start, end)) + return self.cache_query_alignment_sequence + + property query_alignment_qualities: + """aligned query sequence quality values (None if not present). These + are the quality values that correspond to + :attr:`query_alignment_sequence`, that is, they exclude qualities of + :term:`soft clipped` bases. This is equal to + ``query_qualities[query_alignment_start:query_alignment_end]``. + + Quality scores are returned as a python array of unsigned + chars. Note that this is not the ASCII-encoded value typically + seen in FASTQ or SAM formatted files. Thus, no offset of 33 + needs to be subtracted. + + This property is read-only. + + """ + def __get__(self): + + if self.cache_query_alignment_qualities: + return self.cache_query_alignment_qualities + + cdef bam1_t * src + cdef uint32_t start, end + + src = self._delegate + + if src.core.l_qseq == 0: + return None + + start = getQueryStart(src) + end = getQueryEnd(src) + self.cache_query_alignment_qualities = \ + getQualitiesInRange(src, start, end) + return self.cache_query_alignment_qualities + + property query_alignment_start: + """start index of the aligned query portion of the sequence (0-based, + inclusive). + + This the index of the first base in :attr:`query_sequence` + that is not soft-clipped. + """ + def __get__(self): + return getQueryStart(self._delegate) + + property query_alignment_end: + """end index of the aligned query portion of the sequence (0-based, + exclusive) + + This the index just past the last base in :attr:`query_sequence` + that is not soft-clipped. + """ + def __get__(self): + return getQueryEnd(self._delegate) + + property modified_bases: + """Modified bases annotations from Ml/Mm tags. The output is + Dict[(canonical base, strand, modification)] -> [ (pos,qual), ...] + with qual being (256*probability), or -1 if unknown. + Strand==0 for forward and 1 for reverse strand modification + """ + def __get__(self): + cdef bam1_t * src + cdef hts_base_mod_state *m = hts_base_mod_state_alloc() + cdef hts_base_mod mods[5] + cdef int pos + + ret = {} + src = self._delegate + + if bam_parse_basemod(src, m) < 0: + return None + + n = bam_next_basemod(src, m, mods, 5, &pos) + + while n>0: + for i in range(n): + mod_code = chr(mods[i].modified_base) if mods[i].modified_base>0 else -mods[i].modified_base + mod_strand = mods[i].strand + if self.is_reverse: + mod_strand = 1 - mod_strand + key = (chr(mods[i].canonical_base), + mod_strand, + mod_code ) + ret.setdefault(key,[]).append((pos,mods[i].qual)) + + n = bam_next_basemod(src, m, mods, 5, &pos) + + if n<0: + return None + + hts_base_mod_state_free(m) + return ret + + property modified_bases_forward: + """Modified bases annotations from Ml/Mm tags. The output is + Dict[(canonical base, strand, modification)] -> [ (pos,qual), ...] + with qual being (256*probability), or -1 if unknown. + Strand==0 for forward and 1 for reverse strand modification. + The positions are with respect to the original sequence from get_forward_sequence() + """ + def __get__(self): + pmods = self.modified_bases + if pmods and self.is_reverse: + rmod = {} + + # Try to find the length of the original sequence + rlen = self.infer_read_length() + if rlen is None and self.query_sequence is None: + return rmod + else: + rlen = len(self.query_sequence) + + for k,mods in pmods.items(): + nk = k[0],1 - k[1],k[2] + for i in range(len(mods)): + + mods[i] = (rlen - 1 -mods[i][0], mods[i][1]) + rmod[nk] = mods + return rmod + + return pmods + + + property query_alignment_length: + """length of the aligned query sequence. + + This is equal to :attr:`query_alignment_end` - + :attr:`query_alignment_start` + """ + def __get__(self): + cdef bam1_t * src + src = self._delegate + return getQueryEnd(src) - getQueryStart(src) + + ##################################################### + # Computed properties + + def get_reference_positions(self, full_length=False): + """a list of reference positions that this read aligns to. + + By default, this method only returns positions in the + reference that are within the alignment. If *full_length* is + set, None values will be included for any soft-clipped or + unaligned positions within the read. The returned list will + thus be of the same length as the read. + + """ + cdef uint32_t k, i, l, pos + cdef int op + cdef uint32_t * cigar_p + cdef bam1_t * src + cdef bint _full = full_length + + src = self._delegate + if pysam_get_n_cigar(src) == 0: + return [] + + result = [] + pos = src.core.pos + cigar_p = pysam_bam_get_cigar(src) + + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + l = cigar_p[k] >> BAM_CIGAR_SHIFT + + if op == BAM_CSOFT_CLIP or op == BAM_CINS: + if _full: + for i from 0 <= i < l: + result.append(None) + elif op == BAM_CMATCH or op == BAM_CEQUAL or op == BAM_CDIFF: + for i from pos <= i < pos + l: + result.append(i) + pos += l + elif op == BAM_CDEL or op == BAM_CREF_SKIP: + pos += l + + return result + + def infer_query_length(self, always=False): + """infer query length from CIGAR alignment. + + This method deduces the query length from the CIGAR alignment + but does not include hard-clipped bases. + + Returns None if CIGAR alignment is not present. + + If *always* is set to True, `infer_read_length` is used instead. + This is deprecated and only present for backward compatibility. + """ + if always is True: + return self.infer_read_length() + cdef int32_t l = calculateQueryLengthWithoutHardClipping(self._delegate) + if l > 0: + return l + else: + return None + + def infer_read_length(self): + """infer read length from CIGAR alignment. + + This method deduces the read length from the CIGAR alignment + including hard-clipped bases. + + Returns None if CIGAR alignment is not present. + """ + cdef int32_t l = calculateQueryLengthWithHardClipping(self._delegate) + if l > 0: + return l + else: + return None + + def get_reference_sequence(self): + """return the reference sequence in the region that is covered by the + alignment of the read to the reference. + + This method requires the MD tag to be set. + + """ + return force_str(build_reference_sequence(self._delegate)) + + def get_forward_sequence(self): + """return the original read sequence. + + Reads mapped to the reverse strand are stored reverse complemented in + the BAM file. This method returns such reads reverse complemented back + to their original orientation. + + Returns None if the record has no query sequence. + """ + if self.query_sequence is None: + return None + s = force_str(self.query_sequence) + if self.is_reverse: + s = s.translate(maketrans("ACGTacgtNnXx", "TGCAtgcaNnXx"))[::-1] + return s + + def get_forward_qualities(self): + """return the original base qualities of the read sequence, + in the same format as the :attr:`query_qualities` property. + + Reads mapped to the reverse strand have their base qualities stored + reversed in the BAM file. This method returns such reads' base qualities + reversed back to their original orientation. + """ + if self.is_reverse: + return self.query_qualities[::-1] + else: + return self.query_qualities + + + def get_aligned_pairs(self, matches_only=False, with_seq=False): + """a list of aligned read (query) and reference positions. + + For inserts, deletions, skipping either query or reference + position may be None. + + For padding in the reference, the reference position will + always be None. + + Parameters + ---------- + + matches_only : bool + If True, only matched bases are returned - no None on either + side. + with_seq : bool + If True, return a third element in the tuple containing the + reference sequence. For CIGAR 'P' (padding in the reference) + operations, the third tuple element will be None. Substitutions + are lower-case. This option requires an MD tag to be present. + + Returns + ------- + + aligned_pairs : list of tuples + + """ + cdef uint32_t k, i, pos, qpos, r_idx, l + cdef int op + cdef uint32_t * cigar_p + cdef bam1_t * src = self._delegate + cdef bint _matches_only = bool(matches_only) + cdef bint _with_seq = bool(with_seq) + + # TODO: this method performs no checking and assumes that + # read sequence, cigar and MD tag are consistent. + + if _with_seq: + # force_str required for py2/py3 compatibility + ref_seq = force_str(build_reference_sequence(src)) + if ref_seq is None: + raise ValueError("MD tag not present") + + r_idx = 0 + + if pysam_get_n_cigar(src) == 0: + return [] + + result = [] + pos = src.core.pos + qpos = 0 + cigar_p = pysam_bam_get_cigar(src) + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + l = cigar_p[k] >> BAM_CIGAR_SHIFT + + if op == BAM_CMATCH or op == BAM_CEQUAL or op == BAM_CDIFF: + if _with_seq: + for i from pos <= i < pos + l: + result.append((qpos, i, ref_seq[r_idx])) + r_idx += 1 + qpos += 1 + else: + for i from pos <= i < pos + l: + result.append((qpos, i)) + qpos += 1 + pos += l + + elif op == BAM_CINS or op == BAM_CSOFT_CLIP or op == BAM_CPAD: + if not _matches_only: + if _with_seq: + for i from pos <= i < pos + l: + result.append((qpos, None, None)) + qpos += 1 + else: + for i from pos <= i < pos + l: + result.append((qpos, None)) + qpos += 1 + else: + qpos += l + + elif op == BAM_CDEL: + if not _matches_only: + if _with_seq: + for i from pos <= i < pos + l: + result.append((None, i, ref_seq[r_idx])) + r_idx += 1 + else: + for i from pos <= i < pos + l: + result.append((None, i)) + else: + r_idx += l + pos += l + + elif op == BAM_CHARD_CLIP: + pass # advances neither + + elif op == BAM_CREF_SKIP: + if not _matches_only: + if _with_seq: + for i from pos <= i < pos + l: + result.append((None, i, None)) + else: + for i from pos <= i < pos + l: + result.append((None, i)) + + pos += l + + return result + + def get_blocks(self): + """ a list of start and end positions of + aligned gapless blocks. + + The start and end positions are in genomic + coordinates. + + Blocks are not normalized, i.e. two blocks + might be directly adjacent. This happens if + the two blocks are separated by an insertion + in the read. + """ + + cdef uint32_t k, pos, l + cdef int op + cdef uint32_t * cigar_p + cdef bam1_t * src + + src = self._delegate + if pysam_get_n_cigar(src) == 0: + return [] + + result = [] + pos = src.core.pos + cigar_p = pysam_bam_get_cigar(src) + l = 0 + + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + l = cigar_p[k] >> BAM_CIGAR_SHIFT + if op == BAM_CMATCH or op == BAM_CEQUAL or op == BAM_CDIFF: + result.append((pos, pos + l)) + pos += l + elif op == BAM_CDEL or op == BAM_CREF_SKIP: + pos += l + + return result + + def get_overlap(self, uint32_t start, uint32_t end): + """return number of aligned bases of read overlapping the interval + *start* and *end* on the reference sequence. + + Return None if cigar alignment is not available. + """ + cdef uint32_t k, i, pos, overlap + cdef int op, o + cdef uint32_t * cigar_p + cdef bam1_t * src + + overlap = 0 + + src = self._delegate + if pysam_get_n_cigar(src) == 0: + return None + pos = src.core.pos + o = 0 + + cigar_p = pysam_bam_get_cigar(src) + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + l = cigar_p[k] >> BAM_CIGAR_SHIFT + + if op == BAM_CMATCH or op == BAM_CEQUAL or op == BAM_CDIFF: + o = min( pos + l, end) - max( pos, start ) + if o > 0: overlap += o + + if op == BAM_CMATCH or op == BAM_CDEL or op == BAM_CREF_SKIP or op == BAM_CEQUAL or op == BAM_CDIFF: + pos += l + + return overlap + + def get_cigar_stats(self): + """summary of operations in cigar string. + + The output order in the array is "MIDNSHP=X" followed by a + field for the NM tag. If the NM tag is not present, this + field will always be 0. + + +-----+--------------+-----+ + |M |BAM_CMATCH |0 | + +-----+--------------+-----+ + |I |BAM_CINS |1 | + +-----+--------------+-----+ + |D |BAM_CDEL |2 | + +-----+--------------+-----+ + |N |BAM_CREF_SKIP |3 | + +-----+--------------+-----+ + |S |BAM_CSOFT_CLIP|4 | + +-----+--------------+-----+ + |H |BAM_CHARD_CLIP|5 | + +-----+--------------+-----+ + |P |BAM_CPAD |6 | + +-----+--------------+-----+ + |= |BAM_CEQUAL |7 | + +-----+--------------+-----+ + |X |BAM_CDIFF |8 | + +-----+--------------+-----+ + |B |BAM_CBACK |9 | + +-----+--------------+-----+ + |NM |NM tag |10 | + +-----+--------------+-----+ + + If no cigar string is present, empty arrays will be returned. + + Returns: + arrays : + two arrays. The first contains the nucleotide counts within + each cigar operation, the second contains the number of blocks + for each cigar operation. + + """ + + cdef int nfields = NCIGAR_CODES + 1 + + cdef c_array.array base_counts = array.array( + "I", + [0] * nfields) + cdef uint32_t [:] base_view = base_counts + cdef c_array.array block_counts = array.array( + "I", + [0] * nfields) + cdef uint32_t [:] block_view = block_counts + + cdef bam1_t * src = self._delegate + cdef int op + cdef uint32_t l + cdef int32_t k + cdef uint32_t * cigar_p = pysam_bam_get_cigar(src) + + if cigar_p == NULL: + return None + + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + l = cigar_p[k] >> BAM_CIGAR_SHIFT + base_view[op] += l + block_view[op] += 1 + + cdef uint8_t * v = bam_aux_get(src, 'NM') + if v != NULL: + base_view[nfields - 1] = bam_aux2i(v) + + return base_counts, block_counts + + ##################################################### + ## Unsorted as yet + # TODO: capture in CIGAR object + property cigartuples: + """the :term:`cigar` alignment. The alignment + is returned as a list of tuples of (operation, length). + + If the alignment is not present, None is returned. + + The operations are: + + +-----+--------------+-----+ + |M |BAM_CMATCH |0 | + +-----+--------------+-----+ + |I |BAM_CINS |1 | + +-----+--------------+-----+ + |D |BAM_CDEL |2 | + +-----+--------------+-----+ + |N |BAM_CREF_SKIP |3 | + +-----+--------------+-----+ + |S |BAM_CSOFT_CLIP|4 | + +-----+--------------+-----+ + |H |BAM_CHARD_CLIP|5 | + +-----+--------------+-----+ + |P |BAM_CPAD |6 | + +-----+--------------+-----+ + |= |BAM_CEQUAL |7 | + +-----+--------------+-----+ + |X |BAM_CDIFF |8 | + +-----+--------------+-----+ + |B |BAM_CBACK |9 | + +-----+--------------+-----+ + + .. note:: + The output is a list of (operation, length) tuples, such as + ``[(0, 30)]``. + This is different from the SAM specification and + the :attr:`cigarstring` property, which uses a + (length, operation) order, for example: ``30M``. + + To unset the cigar property, assign an empty list + or None. + """ + def __get__(self): + cdef uint32_t * cigar_p + cdef bam1_t * src + cdef uint32_t op, l + cdef uint32_t k + + src = self._delegate + if pysam_get_n_cigar(src) == 0: + return None + + cigar = [] + + cigar_p = pysam_bam_get_cigar(src); + for k from 0 <= k < pysam_get_n_cigar(src): + op = cigar_p[k] & BAM_CIGAR_MASK + l = cigar_p[k] >> BAM_CIGAR_SHIFT + cigar.append((op, l)) + return cigar + + def __set__(self, values): + cdef uint32_t * p + cdef bam1_t * src + cdef op, l + cdef int k + + k = 0 + + src = self._delegate + + # get location of cigar string + p = pysam_bam_get_cigar(src) + + # empty values for cigar string + if values is None: + values = [] + + cdef uint32_t ncigar = len(values) + + cdef bam1_t * retval = pysam_bam_update(src, + pysam_get_n_cigar(src) * 4, + ncigar * 4, + p) + + if retval == NULL: + raise MemoryError("could not allocate memory") + + # length is number of cigar operations, not bytes + pysam_set_n_cigar(src, ncigar) + + # re-acquire pointer to location in memory + # as it might have moved + p = pysam_bam_get_cigar(src) + + # insert cigar operations + for op, l in values: + p[k] = l << BAM_CIGAR_SHIFT | op + k += 1 + + ## setting the cigar string requires updating the bin + update_bin(src) + + cpdef set_tag(self, + tag, + value, + value_type=None, + replace=True): + """sets a particular field *tag* to *value* in the optional alignment + section. + + *value_type* describes the type of *value* that is to entered + into the alignment record. It can be set explicitly to one of + the valid one-letter type codes. If unset, an appropriate type + will be chosen automatically based on the python type of + *value*. + + An existing value of the same *tag* will be overwritten unless + *replace* is set to False. This is usually not recommended as a + tag may only appear once in the optional alignment section. + + If *value* is `None`, the tag will be deleted. + + This method accepts valid SAM specification value types, which + are:: + + A: printable char + i: signed int + f: float + Z: printable string + H: Byte array in hex format + B: Integer or numeric array + + Additionally, it will accept the integer BAM types ('cCsSI') + + For htslib compatibility, 'a' is synonymous with 'A' and the + method accepts a 'd' type code for a double precision float. + + When deducing the type code by the python type of *value*, the + following mapping is applied:: + + i: python int + f: python float + Z: python str or bytes + B: python array.array, list or tuple + + Note that a single character string will be output as 'Z' and + not 'A' as the former is the more general type. + """ + + cdef int value_size + cdef uint8_t tc + cdef uint8_t * value_ptr + cdef uint8_t *existing_ptr + cdef float float_value + cdef double double_value + cdef int32_t int32_t_value + cdef uint32_t uint32_t_value + cdef int16_t int16_t_value + cdef uint16_t uint16_t_value + cdef int8_t int8_t_value + cdef uint8_t uint8_t_value + cdef bam1_t * src = self._delegate + cdef char * _value_type + cdef c_array.array array_value + cdef object buffer + + if len(tag) != 2: + raise ValueError('Invalid tag: %s' % tag) + + tag = force_bytes(tag) + if replace: + existing_ptr = bam_aux_get(src, tag) + if existing_ptr: + bam_aux_del(src, existing_ptr) + + # setting value to None deletes a tag + if value is None: + return + + cdef uint8_t typecode = get_tag_typecode(value, value_type) + if typecode == 0: + raise ValueError("can't guess type or invalid type code specified: {} {}".format( + value, value_type)) + + # sam_format1 for typecasting + if typecode == 'Z': + value = force_bytes(value) + value_ptr = value + value_size = len(value)+1 + elif typecode == 'H': + # Note that hex tags are stored the very same + # way as Z string.s + value = force_bytes(value) + value_ptr = value + value_size = len(value)+1 + elif typecode == 'A' or typecode == 'a': + value = force_bytes(value) + value_ptr = value + value_size = sizeof(char) + typecode = 'A' + elif typecode == 'i': + int32_t_value = value + value_ptr = &int32_t_value + value_size = sizeof(int32_t) + elif typecode == 'I': + uint32_t_value = value + value_ptr = &uint32_t_value + value_size = sizeof(uint32_t) + elif typecode == 's': + int16_t_value = value + value_ptr = &int16_t_value + value_size = sizeof(int16_t) + elif typecode == 'S': + uint16_t_value = value + value_ptr = &uint16_t_value + value_size = sizeof(uint16_t) + elif typecode == 'c': + int8_t_value = value + value_ptr = &int8_t_value + value_size = sizeof(int8_t) + elif typecode == 'C': + uint8_t_value = value + value_ptr = &uint8_t_value + value_size = sizeof(uint8_t) + elif typecode == 'd': + double_value = value + value_ptr = &double_value + value_size = sizeof(double) + elif typecode == 'f': + float_value = value + value_ptr = &float_value + value_size = sizeof(float) + elif typecode == 'B': + # the following goes through python, needs to be cleaned up + # pack array using struct + fmt, args = pack_tags([(tag, value, value_type)]) + + # remove tag and type code as set by bam_aux_append + # first four chars of format (<2sB) + fmt = '<' + fmt[4:] + # first two values to pack + args = args[2:] + value_size = struct.calcsize(fmt) + # buffer will be freed when object goes out of scope + buffer = ctypes.create_string_buffer(value_size) + struct.pack_into(fmt, buffer, 0, *args) + # bam_aux_append copies data from value_ptr + bam_aux_append(src, + tag, + typecode, + value_size, + buffer.raw) + return + else: + raise ValueError('unsupported value_type {} in set_option'.format(typecode)) + + bam_aux_append(src, + tag, + typecode, + value_size, + value_ptr) + + cpdef has_tag(self, tag): + """returns true if the optional alignment section + contains a given *tag*.""" + cdef uint8_t * v + cdef int nvalues + btag = force_bytes(tag) + v = bam_aux_get(self._delegate, btag) + return v != NULL + + cpdef get_tag(self, tag, with_value_type=False): + """ + retrieves data from the optional alignment section + given a two-letter *tag* denoting the field. + + The returned value is cast into an appropriate python type. + + This method is the fastest way to access the optional + alignment section if only few tags need to be retrieved. + + Possible value types are "AcCsSiIfZHB" (see BAM format + specification) as well as additional value type 'd' as + implemented in htslib. + + Parameters: + + tag : + data tag. + + with_value_type : Optional[bool] + if set to True, the return value is a tuple of (tag value, type + code). (default False) + + Returns: + + A python object with the value of the `tag`. The type of the + object depends on the data type in the data record. + + Raises: + + KeyError + If `tag` is not present, a KeyError is raised. + + """ + cdef uint8_t * v + cdef int nvalues + btag = force_bytes(tag) + v = bam_aux_get(self._delegate, btag) + if v == NULL: + raise KeyError("tag '%s' not present" % tag) + if chr(v[0]) == "B": + auxtype = chr(v[0]) + chr(v[1]) + else: + auxtype = chr(v[0]) + + if auxtype in "iIcCsS": + value = bam_aux2i(v) + elif auxtype == 'f' or auxtype == 'F': + value = bam_aux2f(v) + elif auxtype == 'd' or auxtype == 'D': + value = bam_aux2f(v) + elif auxtype == 'A' or auxtype == 'a': + # force A to a + v[0] = 'A' + # there might a more efficient way + # to convert a char into a string + value = '%c' % bam_aux2A(v) + elif auxtype == 'Z' or auxtype == 'H': + # Z and H are treated equally as strings in htslib + value = charptr_to_str(bam_aux2Z(v)) + elif auxtype[0] == 'B': + bytesize, nvalues, values = convert_binary_tag(v + 1) + value = values + else: + raise ValueError("unknown auxiliary type '%s'" % auxtype) + + if with_value_type: + return (value, auxtype) + else: + return value + + def get_tags(self, with_value_type=False): + """the fields in the optional alignment section. + + Returns a list of all fields in the optional + alignment section. Values are converted to appropriate python + values. For example: ``[(NM, 2), (RG, "GJP00TM04")]`` + + If *with_value_type* is set, the value type as encode in + the AlignedSegment record will be returned as well: + + [(NM, 2, "i"), (RG, "GJP00TM04", "Z")] + + This method will convert all values in the optional alignment + section. When getting only one or few tags, please see + :meth:`get_tag` for a quicker way to achieve this. + + """ + + cdef char * ctag + cdef bam1_t * src + cdef uint8_t * s + cdef char auxtag[3] + cdef char auxtype + cdef uint8_t byte_size + cdef int32_t nvalues + + src = self._delegate + if src.l_data == 0: + return [] + s = pysam_bam_get_aux(src) + result = [] + auxtag[2] = 0 + while s < (src.data + src.l_data): + # get tag + auxtag[0] = s[0] + auxtag[1] = s[1] + s += 2 + auxtype = s[0] + if auxtype in ('c', 'C'): + value = bam_aux2i(s) + s += 1 + elif auxtype in ('s', 'S'): + value = bam_aux2i(s) + s += 2 + elif auxtype in ('i', 'I'): + value = bam_aux2i(s) + s += 4 + elif auxtype == 'f': + value = bam_aux2f(s) + s += 4 + elif auxtype == 'd': + value = bam_aux2f(s) + s += 8 + elif auxtype in ('A', 'a'): + value = "%c" % bam_aux2A(s) + s += 1 + elif auxtype in ('Z', 'H'): + value = charptr_to_str(bam_aux2Z(s)) + # +1 for NULL terminated string + s += len(value) + 1 + elif auxtype == 'B': + s += 1 + byte_size, nvalues, value = convert_binary_tag(s) + # 5 for 1 char and 1 int + s += 5 + (nvalues * byte_size) - 1 + else: + raise KeyError("unknown type '%s'" % auxtype) + + s += 1 + + if with_value_type: + result.append((charptr_to_str(auxtag), value, chr(auxtype))) + else: + result.append((charptr_to_str(auxtag), value)) + + return result + + def set_tags(self, tags): + """sets the fields in the optional alignment section with + a list of (tag, value) tuples. + + The value type of the values is determined from the + python type. Optionally, a type may be given explicitly as + a third value in the tuple, For example: + + x.set_tags([(NM, 2, "i"), (RG, "GJP00TM04", "Z")] + + This method will not enforce the rule that the same tag may appear + only once in the optional alignment section. + """ + + cdef bam1_t * src + cdef uint8_t * s + cdef char * temp + cdef int new_size = 0 + cdef int old_size + src = self._delegate + + # convert and pack the data + if tags is not None and len(tags) > 0: + fmt, args = pack_tags(tags) + new_size = struct.calcsize(fmt) + buffer = ctypes.create_string_buffer(new_size) + struct.pack_into(fmt, + buffer, + 0, + *args) + + + # delete the old data and allocate new space. + # If total_size == 0, the aux field will be + # empty + old_size = pysam_bam_get_l_aux(src) + cdef bam1_t * retval = pysam_bam_update(src, + old_size, + new_size, + pysam_bam_get_aux(src)) + if retval == NULL: + raise MemoryError("could not allocate memory") + + # copy data only if there is any + if new_size > 0: + + # get location of new data + s = pysam_bam_get_aux(src) + + # check if there is direct path from buffer.raw to tmp + p = buffer.raw + # create handle to make sure buffer stays alive long + # enough for memcpy, see issue 129 + temp = p + memcpy(s, temp, new_size) + + + ######################################################## + # Compatibility Accessors + # Functions, properties for compatibility with pysam < 0.8 + # + # Several options + # change the factory functions according to API + # * requires code changes throughout, incl passing + # handles to factory functions + # subclass functions and add attributes at runtime + # e.g.: AlignedSegments.qname = AlignedSegments.query_name + # * will slow down the default interface + # explicit declaration of getters/setters + ######################################################## + property qname: + """deprecated, use :attr:`query_name` instead.""" + def __get__(self): return self.query_name + def __set__(self, v): self.query_name = v + property tid: + """deprecated, use :attr:`reference_id` instead.""" + def __get__(self): return self.reference_id + def __set__(self, v): self.reference_id = v + property pos: + """deprecated, use :attr:`reference_start` instead.""" + def __get__(self): return self.reference_start + def __set__(self, v): self.reference_start = v + property mapq: + """deprecated, use :attr:`mapping_quality` instead.""" + def __get__(self): return self.mapping_quality + def __set__(self, v): self.mapping_quality = v + property rnext: + """deprecated, use :attr:`next_reference_id` instead.""" + def __get__(self): return self.next_reference_id + def __set__(self, v): self.next_reference_id = v + property pnext: + """deprecated, use :attr:`next_reference_start` instead.""" + def __get__(self): + return self.next_reference_start + def __set__(self, v): + self.next_reference_start = v + property cigar: + """deprecated, use :attr:`cigarstring` or :attr:`cigartuples` instead.""" + def __get__(self): + r = self.cigartuples + if r is None: + r = [] + return r + def __set__(self, v): self.cigartuples = v + property tlen: + """deprecated, use :attr:`template_length` instead.""" + def __get__(self): + return self.template_length + def __set__(self, v): + self.template_length = v + property seq: + """deprecated, use :attr:`query_sequence` instead.""" + def __get__(self): + return self.query_sequence + def __set__(self, v): + self.query_sequence = v + property qual: + """deprecated, use :attr:`query_qualities` instead.""" + def __get__(self): + return array_to_qualitystring(self.query_qualities) + def __set__(self, v): + self.query_qualities = qualitystring_to_array(v) + property alen: + """deprecated, use :attr:`reference_length` instead.""" + def __get__(self): + return self.reference_length + def __set__(self, v): + self.reference_length = v + property aend: + """deprecated, use :attr:`reference_end` instead.""" + def __get__(self): + return self.reference_end + def __set__(self, v): + self.reference_end = v + property rlen: + """deprecated, use :attr:`query_length` instead.""" + def __get__(self): + return self.query_length + def __set__(self, v): + self.query_length = v + property query: + """deprecated, use :attr:`query_alignment_sequence` + instead.""" + def __get__(self): + return self.query_alignment_sequence + def __set__(self, v): + self.query_alignment_sequence = v + property qqual: + """deprecated, use :attr:`query_alignment_qualities` + instead.""" + def __get__(self): + return array_to_qualitystring(self.query_alignment_qualities) + def __set__(self, v): + self.query_alignment_qualities = qualitystring_to_array(v) + property qstart: + """deprecated, use :attr:`query_alignment_start` instead.""" + def __get__(self): + return self.query_alignment_start + def __set__(self, v): + self.query_alignment_start = v + property qend: + """deprecated, use :attr:`query_alignment_end` instead.""" + def __get__(self): + return self.query_alignment_end + def __set__(self, v): + self.query_alignment_end = v + property qlen: + """deprecated, use :attr:`query_alignment_length` + instead.""" + def __get__(self): + return self.query_alignment_length + def __set__(self, v): + self.query_alignment_length = v + property mrnm: + """deprecated, use :attr:`next_reference_id` instead.""" + def __get__(self): + return self.next_reference_id + def __set__(self, v): + self.next_reference_id = v + property mpos: + """deprecated, use :attr:`next_reference_start` + instead.""" + def __get__(self): + return self.next_reference_start + def __set__(self, v): + self.next_reference_start = v + property rname: + """deprecated, use :attr:`reference_id` instead.""" + def __get__(self): + return self.reference_id + def __set__(self, v): + self.reference_id = v + property isize: + """deprecated, use :attr:`template_length` instead.""" + def __get__(self): + return self.template_length + def __set__(self, v): + self.template_length = v + property blocks: + """deprecated, use :meth:`get_blocks()` instead.""" + def __get__(self): + return self.get_blocks() + property aligned_pairs: + """deprecated, use :meth:`get_aligned_pairs()` instead.""" + def __get__(self): + return self.get_aligned_pairs() + property inferred_length: + """deprecated, use :meth:`infer_query_length()` instead.""" + def __get__(self): + return self.infer_query_length() + property positions: + """deprecated, use :meth:`get_reference_positions()` instead.""" + def __get__(self): + return self.get_reference_positions() + property tags: + """deprecated, use :meth:`get_tags()` instead.""" + def __get__(self): + return self.get_tags() + def __set__(self, tags): + self.set_tags(tags) + def overlap(self): + """deprecated, use :meth:`get_overlap()` instead.""" + return self.get_overlap() + def opt(self, tag): + """deprecated, use :meth:`get_tag()` instead.""" + return self.get_tag(tag) + def setTag(self, tag, value, value_type=None, replace=True): + """deprecated, use :meth:`set_tag()` instead.""" + return self.set_tag(tag, value, value_type, replace) + + +cdef class PileupColumn: + '''A pileup of reads at a particular reference sequence position + (:term:`column`). A pileup column contains all the reads that map + to a certain target base. + + This class is a proxy for results returned by the samtools pileup + engine. If the underlying engine iterator advances, the results + of this column will change. + ''' + def __init__(self): + raise TypeError("this class cannot be instantiated from Python") + + def __str__(self): + return "\t".join(map(str, + (self.reference_id, + self.reference_pos, + self.nsegments))) +\ + "\n" +\ + "\n".join(map(str, self.pileups)) + + def __dealloc__(self): + free(self.buf.s) + + def set_min_base_quality(self, min_base_quality): + """set the minimum base quality for this pileup column. + """ + self.min_base_quality = min_base_quality + + def __len__(self): + """return number of reads aligned to this column. + + see :meth:`get_num_aligned` + """ + return self.get_num_aligned() + + property reference_id: + '''the reference sequence number as defined in the header''' + def __get__(self): + return self.tid + + property reference_name: + """:term:`reference` name (None if no AlignmentFile is associated)""" + def __get__(self): + if self.header is not None: + return self.header.get_reference_name(self.tid) + return None + + property nsegments: + '''number of reads mapping to this column. + + Note that this number ignores the base quality filter.''' + def __get__(self): + return self.n_pu + def __set__(self, n): + self.n_pu = n + + property reference_pos: + '''the position in the reference sequence (0-based).''' + def __get__(self): + return self.pos + + property pileups: + '''list of reads (:class:`pysam.PileupRead`) aligned to this column''' + def __get__(self): + if self.plp == NULL or self.plp[0] == NULL: + raise ValueError("PileupColumn accessed after iterator finished") + + cdef int x + cdef const bam_pileup1_t * p = NULL + pileups = [] + + # warning: there could be problems if self.n and self.buf are + # out of sync. + for x from 0 <= x < self.n_pu: + p = &(self.plp[0][x]) + if p == NULL: + raise ValueError( + "pileup buffer out of sync - most likely use of iterator " + "outside loop") + if pileup_base_qual_skip(p, self.min_base_quality): + continue + pileups.append(makePileupRead(p, self.header)) + return pileups + + ######################################################## + # Compatibility Accessors + # Functions, properties for compatibility with pysam < 0.8 + ######################################################## + property pos: + """deprecated, use :attr:`reference_pos` instead.""" + def __get__(self): + return self.reference_pos + def __set__(self, v): + self.reference_pos = v + + property tid: + """deprecated, use :attr:`reference_id` instead.""" + def __get__(self): + return self.reference_id + def __set__(self, v): + self.reference_id = v + + property n: + """deprecated, use :attr:`nsegments` instead.""" + def __get__(self): + return self.nsegments + def __set__(self, v): + self.nsegments = v + + def get_num_aligned(self): + """return number of aligned bases at pileup column position. + + This method applies a base quality filter and the number is + equal to the size of :meth:`get_query_sequences`, + :meth:`get_mapping_qualities`, etc. + + """ + cdef uint32_t x = 0 + cdef uint32_t c = 0 + cdef uint32_t cnt = 0 + cdef const bam_pileup1_t * p = NULL + if self.plp == NULL or self.plp[0] == NULL: + raise ValueError("PileupColumn accessed after iterator finished") + + for x from 0 <= x < self.n_pu: + p = &(self.plp[0][x]) + if p == NULL: + raise ValueError( + "pileup buffer out of sync - most likely use of iterator " + "outside loop") + if pileup_base_qual_skip(p, self.min_base_quality): + continue + cnt += 1 + return cnt + + def get_query_sequences(self, bint mark_matches=False, bint mark_ends=False, bint add_indels=False): + """query bases/sequences at pileup column position. + + Optionally, the bases/sequences can be annotated according to the samtools + mpileup format. This is the format description from the samtools mpileup tool:: + + Information on match, mismatch, indel, strand, mapping + quality and start and end of a read are all encoded at the + read base column. At this column, a dot stands for a match + to the reference base on the forward strand, a comma for a + match on the reverse strand, a '>' or '<' for a reference + skip, `ACGTN' for a mismatch on the forward strand and + `acgtn' for a mismatch on the reverse strand. A pattern + `\\+[0-9]+[ACGTNacgtn]+' indicates there is an insertion + between this reference position and the next reference + position. The length of the insertion is given by the + integer in the pattern, followed by the inserted + sequence. Similarly, a pattern `-[0-9]+[ACGTNacgtn]+' + represents a deletion from the reference. The deleted bases + will be presented as `*' in the following lines. Also at + the read base column, a symbol `^' marks the start of a + read. The ASCII of the character following `^' minus 33 + gives the mapping quality. A symbol `$' marks the end of a + read segment + + To reproduce samtools mpileup format, set all of mark_matches, + mark_ends and add_indels to True. + + Parameters + ---------- + + mark_matches: bool + + If True, output bases matching the reference as "." or "," + for forward and reverse strand, respectively. This mark + requires the reference sequence. If no reference is + present, this option is ignored. + + mark_ends : bool + + If True, add markers "^" and "$" for read start and end, respectively. + + add_indels : bool + + If True, add bases for bases inserted into or skipped from the + reference. The latter requires a reference sequence file to have + been given, e.g. via `pileup(fastafile = ...)`. If no reference + sequence is available, skipped bases are represented as 'N's. + + Returns + ------- + + a list of bases/sequences per read at pileup column position. : list + + """ + cdef uint32_t x = 0 + cdef uint32_t j = 0 + cdef uint32_t c = 0 + cdef uint8_t cc = 0 + cdef uint8_t rb = 0 + cdef kstring_t * buf = &self.buf + cdef const bam_pileup1_t * p = NULL + + if self.plp == NULL or self.plp[0] == NULL: + raise ValueError("PileupColumn accessed after iterator finished") + + buf.l = 0 + + # todo: reference sequence to count matches/mismatches + # todo: convert assertions to exceptions + for x from 0 <= x < self.n_pu: + p = &(self.plp[0][x]) + if p == NULL: + raise ValueError( + "pileup buffer out of sync - most likely use of iterator " + "outside loop") + if pileup_base_qual_skip(p, self.min_base_quality): + continue + # see samtools pileup_seq + if mark_ends and p.is_head: + kputc('^', buf) + + if p.b.core.qual > 93: + kputc(126, buf) + else: + kputc(p.b.core.qual + 33, buf) + if not p.is_del: + if p.qpos < p.b.core.l_qseq: + cc = seq_nt16_str[bam_seqi(bam_get_seq(p.b), p.qpos)] + else: + cc = 'N' + + if mark_matches and self.reference_sequence != NULL: + rb = self.reference_sequence[self.reference_pos] + if seq_nt16_table[cc] == seq_nt16_table[rb]: + cc = "=" + kputc(strand_mark_char(cc, p.b), buf) + elif add_indels: + if p.is_refskip: + if bam_is_rev(p.b): + kputc('<', buf) + else: + kputc('>', buf) + else: + kputc('*', buf) + if add_indels: + if p.indel > 0: + kputc('+', buf) + kputw(p.indel, buf) + for j from 1 <= j <= p.indel: + cc = seq_nt16_str[bam_seqi(bam_get_seq(p.b), p.qpos + j)] + kputc(strand_mark_char(cc, p.b), buf) + elif p.indel < 0: + kputc('-', buf) + kputw(-p.indel, buf) + for j from 1 <= j <= -p.indel: + # TODO: out-of-range check here? + if self.reference_sequence == NULL: + cc = 'N' + else: + cc = self.reference_sequence[self.reference_pos + j] + kputc(strand_mark_char(cc, p.b), buf) + if mark_ends and p.is_tail: + kputc('$', buf) + + kputc(':', buf) + + if buf.l == 0: + # could be zero if all qualities are too low + return "" + else: + # quicker to ensemble all and split than to encode all separately. + # ignore last ":" + return force_str(PyBytes_FromStringAndSize(buf.s, buf.l-1)).split(":") + + def get_query_qualities(self): + """query base quality scores at pileup column position. + + Returns + ------- + + a list of quality scores : list + """ + cdef uint32_t x = 0 + cdef const bam_pileup1_t * p = NULL + cdef uint32_t c = 0 + result = [] + for x from 0 <= x < self.n_pu: + p = &(self.plp[0][x]) + if p == NULL: + raise ValueError( + "pileup buffer out of sync - most likely use of iterator " + "outside loop") + + if p.qpos < p.b.core.l_qseq: + c = bam_get_qual(p.b)[p.qpos] + else: + c = 0 + if c < self.min_base_quality: + continue + result.append(c) + return result + + def get_mapping_qualities(self): + """query mapping quality scores at pileup column position. + + Returns + ------- + + a list of quality scores : list + """ + if self.plp == NULL or self.plp[0] == NULL: + raise ValueError("PileupColumn accessed after iterator finished") + + cdef uint32_t x = 0 + cdef const bam_pileup1_t * p = NULL + result = [] + for x from 0 <= x < self.n_pu: + p = &(self.plp[0][x]) + if p == NULL: + raise ValueError( + "pileup buffer out of sync - most likely use of iterator " + "outside loop") + + if pileup_base_qual_skip(p, self.min_base_quality): + continue + result.append(p.b.core.qual) + return result + + def get_query_positions(self): + """positions in read at pileup column position. + + Returns + ------- + + a list of read positions : list + """ + if self.plp == NULL or self.plp[0] == NULL: + raise ValueError("PileupColumn accessed after iterator finished") + + cdef uint32_t x = 0 + cdef const bam_pileup1_t * p = NULL + result = [] + for x from 0 <= x < self.n_pu: + p = &(self.plp[0][x]) + if p == NULL: + raise ValueError( + "pileup buffer out of sync - most likely use of iterator " + "outside loop") + + if pileup_base_qual_skip(p, self.min_base_quality): + continue + result.append(p.qpos) + return result + + def get_query_names(self): + """query/read names aligned at pileup column position. + + Returns + ------- + + a list of query names at pileup column position. : list + """ + if self.plp == NULL or self.plp[0] == NULL: + raise ValueError("PileupColumn accessed after iterator finished") + + cdef uint32_t x = 0 + cdef const bam_pileup1_t * p = NULL + result = [] + for x from 0 <= x < self.n_pu: + p = &(self.plp[0][x]) + if p == NULL: + raise ValueError( + "pileup buffer out of sync - most likely use of iterator " + "outside loop") + + if pileup_base_qual_skip(p, self.min_base_quality): + continue + result.append(charptr_to_str(pysam_bam_get_qname(p.b))) + return result + + +cdef class PileupRead: + '''Representation of a read aligned to a particular position in the + reference sequence. + + ''' + + def __init__(self): + raise TypeError( + "this class cannot be instantiated from Python") + + def __str__(self): + return "\t".join( + map(str, + (self.alignment, self.query_position, + self.indel, self.level, + self.is_del, self.is_head, + self.is_tail, self.is_refskip))) + + property alignment: + """a :class:`pysam.AlignedSegment` object of the aligned read""" + def __get__(self): + return self._alignment + + property query_position: + """position of the read base at the pileup site, 0-based. + None if :attr:`is_del` or :attr:`is_refskip` is set. + + """ + def __get__(self): + if self.is_del or self.is_refskip: + return None + else: + return self._qpos + + property query_position_or_next: + """position of the read base at the pileup site, 0-based. + + If the current position is a deletion, returns the next + aligned base. + + """ + def __get__(self): + return self._qpos + + property indel: + """indel length for the position following the current pileup site. + + This quantity peeks ahead to the next cigar operation in this + alignment. If the next operation is an insertion, indel will + be positive. If the next operation is a deletion, it will be + negation. 0 if the next operation is not an indel. + + """ + def __get__(self): + return self._indel + + property level: + """the level of the read in the "viewer" mode. Note that this value + is currently not computed.""" + def __get__(self): + return self._level + + property is_del: + """1 iff the base on the padded read is a deletion""" + def __get__(self): + return self._is_del + + property is_head: + """1 iff the base on the padded read is the left-most base.""" + def __get__(self): + return self._is_head + + property is_tail: + """1 iff the base on the padded read is the right-most base.""" + def __get__(self): + return self._is_tail + + property is_refskip: + """1 iff the base on the padded read is part of CIGAR N op.""" + def __get__(self): + return self._is_refskip + + + +cpdef enum CIGAR_OPS: + CMATCH = 0 + CINS = 1 + CDEL = 2 + CREF_SKIP = 3 + CSOFT_CLIP = 4 + CHARD_CLIP = 5 + CPAD = 6 + CEQUAL = 7 + CDIFF = 8 + CBACK = 9 + + +cpdef enum SAM_FLAGS: + # the read is paired in sequencing, no matter whether it is mapped in a pair + FPAIRED = 1 + # the read is mapped in a proper pair + FPROPER_PAIR = 2 + # the read itself is unmapped; conflictive with FPROPER_PAIR + FUNMAP = 4 + # the mate is unmapped + FMUNMAP = 8 + # the read is mapped to the reverse strand + FREVERSE = 16 + # the mate is mapped to the reverse strand + FMREVERSE = 32 + # this is read1 + FREAD1 = 64 + # this is read2 + FREAD2 = 128 + # not primary alignment + FSECONDARY = 256 + # QC failure + FQCFAIL = 512 + # optical or PCR duplicate + FDUP = 1024 + # supplementary alignment + FSUPPLEMENTARY = 2048 + + +__all__ = [ + "AlignedSegment", + "PileupColumn", + "PileupRead", + "CMATCH", + "CINS", + "CDEL", + "CREF_SKIP", + "CSOFT_CLIP", + "CHARD_CLIP", + "CPAD", + "CEQUAL", + "CDIFF", + "CBACK", + "FPAIRED", + "FPROPER_PAIR", + "FUNMAP", + "FMUNMAP", + "FREVERSE", + "FMREVERSE", + "FREAD1", + "FREAD2", + "FSECONDARY", + "FQCFAIL", + "FDUP", + "FSUPPLEMENTARY", + "KEY_NAMES"] diff --git a/pysam/libcalignmentfile.pxd b/pysam/libcalignmentfile.pxd new file mode 100644 index 0000000..2a17fbe --- /dev/null +++ b/pysam/libcalignmentfile.pxd @@ -0,0 +1,152 @@ +from libc.stdint cimport int8_t, int16_t, int32_t, int64_t +from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t +from libc.stdlib cimport malloc, calloc, realloc, free +from libc.string cimport memcpy, memcmp, strncpy, strlen, strdup +from libc.stdio cimport FILE, printf + +from pysam.libcfaidx cimport faidx_t, FastaFile +from pysam.libcalignedsegment cimport AlignedSegment +from pysam.libchtslib cimport * + +from cpython cimport array +cimport cython + +cdef extern from *: + ctypedef char* const_char_ptr "const char*" + +cdef extern from "htslib_util.h": + + char * pysam_bam_get_qname(bam1_t * b) + +#################################################################### +# Utility types + +ctypedef struct __iterdata: + htsFile * htsfile + bam_hdr_t * header + hts_itr_t * iter + faidx_t * fastafile + int tid + char * seq + int seq_len + int min_mapping_quality + int flag_require + int flag_filter + bint compute_baq + bint redo_baq + bint ignore_orphans + int adjust_capq_threshold + + +cdef class AlignmentHeader(object): + cdef bam_hdr_t *ptr + +cdef class AlignmentFile(HTSFile): + cdef readonly object reference_filename + cdef readonly AlignmentHeader header + + # pointer to index + cdef hts_idx_t *index + + # current read within iteration + cdef bam1_t * b + + cdef bam1_t * getCurrent(self) + cdef int cnext(self) + + # write an aligned read + cpdef int write(self, AlignedSegment read) except -1 + + +cdef class IteratorRow: + cdef int retval + cdef bam1_t * b + cdef AlignmentFile samfile + cdef htsFile * htsfile + cdef hts_idx_t * index + cdef AlignmentHeader header + cdef int owns_samfile + + +cdef class IteratorRowRegion(IteratorRow): + cdef hts_itr_t * iter + cdef bam1_t * getCurrent(self) + cdef int cnext(self) + + +cdef class IteratorRowHead(IteratorRow): + cdef int max_rows + cdef int current_row + cdef bam1_t * getCurrent(self) + cdef int cnext(self) + + +cdef class IteratorRowAll(IteratorRow): + cdef bam1_t * getCurrent(self) + cdef int cnext(self) + + +cdef class IteratorRowAllRefs(IteratorRow): + cdef int tid + cdef IteratorRowRegion rowiter + + +cdef class IteratorRowSelection(IteratorRow): + cdef int current_pos + cdef positions + cdef bam1_t * getCurrent(self) + cdef int cnext(self) + + +cdef class IteratorColumn: + + # result of the last plbuf_push + cdef IteratorRowRegion iter + cdef int tid + cdef int pos + cdef int n_plp + cdef uint32_t min_base_quality + cdef const bam_pileup1_t * plp + cdef bam_mplp_t pileup_iter + cdef __iterdata iterdata + cdef AlignmentFile samfile + cdef FastaFile fastafile + cdef stepper + cdef int max_depth + cdef bint ignore_overlaps + + cdef int cnext(self) + cdef char * get_sequence(self) + cdef _setup_iterator(self, + int tid, + int start, + int stop, + int multiple_iterators=?) + cdef _setup_raw_rest_iterator(self) + + cdef reset(self, tid, start, stop) + cdef _free_pileup_iter(self) + # backwards compatibility + cdef char * getSequence(self) + + +cdef class IteratorColumnRegion(IteratorColumn): + cdef int start + cdef int stop + cdef int truncate + + +cdef class IteratorColumnAllRefs(IteratorColumn): + pass + + +cdef class IteratorColumnAll(IteratorColumn): + pass + + +cdef class IndexedReads: + cdef AlignmentFile samfile + cdef htsFile * htsfile + cdef object index + cdef int owns_samfile + cdef AlignmentHeader header diff --git a/pysam/libcalignmentfile.pyi b/pysam/libcalignmentfile.pyi new file mode 100644 index 0000000..75c1fa4 --- /dev/null +++ b/pysam/libcalignmentfile.pyi @@ -0,0 +1,237 @@ +import array +import sys +from typing import ( + Any, + Dict, + Type, + NamedTuple, + Tuple, + Optional, + Sequence, + Union, + Callable, + List, + Iterable, +) + +if sys.version_info < (3, 8): + from typing_extensions import Literal +else: + from typing import Literal + +from pysam.libchtslib import HTSFile, _HasFileNo +from pysam.libcalignedsegment import AlignedSegment +from pysam.libcfaidx import FastaFile + +class IndexStats(NamedTuple): + contig: str + mapped: int + unmapped: int + total: int + +VALID_HEADER_TYPES: Dict[str, Type] +VALID_HEADERS: Tuple[str] +KNOWN_HEADER_FIELDS: Dict[str, Dict[str, Type]] +VALID_HEADER_ORDER: Dict[str, Tuple[str]] + +def build_header_line(fields: Dict[str, str], record: str) -> str: ... + +class AlignmentHeader: + def __init__(self) -> None: ... + @classmethod + def _from_text_and_lengths( + cls, + text: Optional[str], + reference_names: Optional[Sequence[str]], + reference_lengths: Optional[Sequence[int]], + ) -> AlignmentHeader: ... + @classmethod + def from_text(cls, text: str) -> AlignmentHeader: ... + @classmethod + def from_dict(cls, header_dict: Dict) -> AlignmentHeader: ... + @classmethod + def from_references( + cls, + reference_names: Sequence[str], + reference_lengths: Sequence[int], + text: Optional[str] = ..., + add_sq_text: bool = ..., + ) -> AlignmentHeader: ... + def __bool__(self) -> bool: ... + def copy(self) -> AlignmentHeader: ... + @property + def nreferences(self) -> int: ... + @property + def references(self) -> Tuple[str]: ... + @property + def lengths(self) -> Tuple[int]: ... + def to_dict(self) -> Dict: ... + def get_reference_name(self, tid: int) -> Optional[str]: ... + def get_reference_length(self, reference: int) -> int: ... + def is_valid_tid(self, tid: int) -> bool: ... + def get_tid(self, reference: int) -> int: ... + +class AlignmentFile(HTSFile): + def __init__( + self, + filename: Union[str, bytes, int, _HasFileNo], + mode: Optional[ + Literal["r", "w", "wh", "rb", "wb", "wbu", "wb0", "rc", "wc"] + ] = ..., + template: Optional[AlignmentFile] = ..., + reference_names: Optional[Sequence[str]] = ..., + reference_lengths: Optional[Sequence[int]] = ..., + reference_filename: Optional[str] = ..., + text: Optional[str] = ..., + header: Union[None, Dict, AlignmentHeader] = ..., + add_sq_text: bool = ..., + add_sam_header: bool = ..., + check_sq: bool = ..., + index_filename: Optional[str] = ..., + filepath_index: Optional[str] = ..., + require_index: bool = ..., + duplicate_filehandle: bool = ..., + ignore_truncation: bool = ..., + format_options: Optional[Sequence[str]] = ..., + threads: int = ..., + ) -> None: ... + def has_index(self) -> bool: ... + def check_index(self) -> bool: ... + def fetch( + self, + contig: Optional[str] = ..., + start: Optional[int] = ..., + stop: Optional[int] = ..., + region: Optional[str] = ..., + tid: Optional[int] = ..., + until_eof: bool = ..., + multiple_iterators: bool = ..., + reference: Optional[str] = ..., + end: int = ..., + ) -> IteratorRow: ... + def head(self, n: int, multiple_iterators: bool = ...) -> IteratorRow: ... + def mate(self, read: AlignedSegment) -> AlignedSegment: ... + def pileup( + self, + contig: Optional[str] = ..., + start: Optional[int] = ..., + stop: Optional[int] = ..., + region: Optional[str] = ..., + reference: Optional[str] = ..., + end: Optional[int] = ..., + truncate: bool = ..., + max_depth: int = ..., + stepper: str = ..., + fastafile: Optional[FastaFile] = ..., + ignore_overlaps: bool = ..., + flag_filter: int = ..., + flag_require: int = ..., + ignore_orphans: bool = ..., + min_base_quality: int = ..., + adjust_capq_threshold: int = ..., + min_mapping_quality: int = ..., + compute_baq: bool = ..., + redo_baq: bool = ..., + ) -> IteratorColumn: ... + def count( + self, + contig: Optional[str] = ..., + start: Optional[int] = ..., + stop: Optional[int] = ..., + region: Optional[str] = ..., + until_eof: bool = ..., + read_callback: Union[str, Callable[[AlignedSegment], bool]] = ..., + reference: Optional[str] = ..., + end: Optional[int] = ..., + ) -> int: ... + def count_coverage( + self, + contig: Optional[str] = ..., + start: Optional[int] = ..., + stop: Optional[int] = ..., + region: Optional[str] = ..., + quality_threshold: int = ..., + read_callback: Union[str, Callable[[AlignedSegment], bool]] = ..., + reference: Optional[str] = ..., + end: Optional[int] = ..., + ) -> Tuple[array.array, array.array, array.array, array.array]: ... + def find_introns_slow( + self, read_iterator: Iterable[AlignedSegment] + ) -> Dict[Tuple[int, int], int]: ... + def find_introns( + self, read_iterator: Iterable[AlignedSegment] + ) -> Dict[Tuple[int, int], int]: ... + def close(self) -> None: ... + def write(self, read: AlignedSegment) -> int: ... + def __enter__(self) -> AlignmentFile: ... + def __exit__(self, exc_type, exc_value, traceback): ... + @property + def mapped(self) -> int: ... + @property + def unmapped(self) -> int: ... + @property + def nocoordinate(self) -> int: ... + def get_index_statistics(self) -> List[IndexStats]: ... + def __iter__(self) -> Any: ... + def __next__(self) -> Any: ... + def is_valid_tid(self, tid: int) -> bool: ... + def get_tid(self, reference: str) -> int: ... + def get_reference_name(self, tid: int) -> str: ... + def get_reference_length(self, reference: str) -> int: ... + @property + def nreferences(self) -> int: ... + @property + def references(self) -> Tuple[str, ...]: ... + @property + def lengths(self) -> Tuple[int, ...]: ... + @property + def reference_filename(self) -> Optional[str]: ... + @property + def header(self) -> AlignmentHeader: ... + +class IteratorRow: + def __iter__(self) -> IteratorRow: ... + def __next__(self) -> PileupColumn: ... + +class IteratorRowAll(IteratorRow): ... +class IteratorRowAllRefs(IteratorRow): ... +class IteratorRowHead(IteratorRow): ... +class IteratorRowRegion(IteratorRow): ... +class IteratorRowSelection(IteratorRow): ... + +class IteratorColumn: + def __iter__(self) -> IteratorRow: ... + def __next__(self) -> PileupColumn: ... + @property + def seq_len(self) -> int: ... + def add_reference(self, fastafile: FastaFile) -> None: ... + def has_reference(self) -> bool: ... + +class IteratorColumnAll(IteratorColumn): ... +class IteratorColumnAllRefs(IteratorColumn): ... +class IteratorColumnRegion(IteratorColumn): ... + +class SNPCall: + @property + def tid(self) -> int: ... + @property + def pos(self) -> int: ... + @property + def reference_base(self) -> str: ... + @property + def genotype(self) -> str: ... + @property + def consensus_quality(self) -> int: ... + @property + def snp_quality(self) -> int: ... + @property + def mapping_quality(self) -> int: ... + @property + def coverage(self) -> int: ... + +class IndexedReads: + def __init__( + self, samfile: AlignmentFile, multiple_iterators: bool = ... + ) -> None: ... + def build(self) -> None: ... + def find(self, query_name: str) -> IteratorRow: ... diff --git a/pysam/libcalignmentfile.pyx b/pysam/libcalignmentfile.pyx new file mode 100644 index 0000000..799258a --- /dev/null +++ b/pysam/libcalignmentfile.pyx @@ -0,0 +1,2988 @@ +# cython: embedsignature=True +# cython: profile=True +######################################################## +######################################################## +# Cython wrapper for SAM/BAM/CRAM files based on htslib +######################################################## +# The principal classes defined in this module are: +# +# class AlignmentFile read/write access to SAM/BAM/CRAM formatted files +# +# class AlignmentHeader manage SAM/BAM/CRAM header data +# +# class IndexedReads index a SAM/BAM/CRAM file by query name while keeping +# the original sort order intact +# +# Additionally this module defines numerous additional classes that +# are part of the internal API. These are: +# +# Various iterator classes to iterate over alignments in sequential +# (IteratorRow) or in a stacked fashion (IteratorColumn): +# +# class IteratorRow +# class IteratorRowRegion +# class IteratorRowHead +# class IteratorRowAll +# class IteratorRowAllRefs +# class IteratorRowSelection +# class IteratorColumn +# class IteratorColumnRegion +# class IteratorColumnAll +# class IteratorColumnAllRefs +# +######################################################## +# +# The MIT License +# +# Copyright (c) 2015 Andreas Heger +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +######################################################## +import os +import collections +try: + from collections.abc import Sequence, Mapping # noqa +except ImportError: + from collections import Sequence, Mapping # noqa +import re +import warnings +import array +from libc.errno cimport errno, EPIPE +from libc.string cimport strcmp, strpbrk, strerror +from libc.stdint cimport INT32_MAX + +from cpython cimport array as c_array +from cpython.version cimport PY_MAJOR_VERSION + +from pysam.libcutils cimport force_bytes, force_str, charptr_to_str +from pysam.libcutils cimport encode_filename, from_string_and_size +from pysam.libcalignedsegment cimport makeAlignedSegment, makePileupColumn +from pysam.libchtslib cimport HTSFile, hisremote + +if PY_MAJOR_VERSION >= 3: + from io import StringIO +else: + from StringIO import StringIO + +cimport cython + + +__all__ = [ + "AlignmentFile", + "AlignmentHeader", + "IteratorRow", + "IteratorColumn", + "IndexedReads"] + +IndexStats = collections.namedtuple("IndexStats", + ("contig", + "mapped", + "unmapped", + "total")) + +######################################################## +## global variables +# maximum genomic coordinace +# for some reason, using 'int' causes overflow +cdef int MAX_POS = (1 << 31) - 1 + +# valid types for SAM headers +VALID_HEADER_TYPES = {"HD" : Mapping, + "SQ" : Sequence, + "RG" : Sequence, + "PG" : Sequence, + "CO" : Sequence} + +# order of records within SAM headers +VALID_HEADERS = ("HD", "SQ", "RG", "PG", "CO") + +# default type conversions within SAM header records +KNOWN_HEADER_FIELDS = {"HD" : {"VN" : str, "SO" : str, "GO" : str}, + "SQ" : {"SN" : str, "LN" : int, "AS" : str, + "M5" : str, "SP" : str, "UR" : str, + "AH" : str,}, + "RG" : {"ID" : str, "CN" : str, "DS" : str, + "DT" : str, "FO" : str, "KS" : str, + "LB" : str, "PG" : str, "PI" : str, + "PL" : str, "PM" : str, "PU" : str, + "SM" : str,}, + "PG" : {"ID" : str, "PN" : str, "CL" : str, + "PP" : str, "DS" : str, "VN" : str,},} + +# output order of fields within records. Ensure that CL is at +# the end as parsing a CL will ignore any subsequent records. +VALID_HEADER_ORDER = {"HD" : ("VN", "SO", "GO"), + "SQ" : ("SN", "LN", "AS", "M5", + "UR", "SP", "AH"), + "RG" : ("ID", "CN", "SM", "LB", + "PU", "PI", "DT", "DS", + "PL", "FO", "KS", "PG", + "PM"), + "PG" : ("PN", "ID", "VN", "PP", + "DS", "CL"),} + + +def build_header_line(fields, record): + '''build a header line from `fields` dictionary for `record`''' + + # TODO: add checking for field and sort order + line = ["@%s" % record] + # comment + if record == "CO": + line.append(fields) + # user tags + elif record.islower(): + for key in sorted(fields): + line.append("%s:%s" % (key, str(fields[key]))) + # defined tags + else: + # write fields of the specification + for key in VALID_HEADER_ORDER[record]: + if key in fields: + line.append("%s:%s" % (key, str(fields[key]))) + # write user fields + for key in fields: + if not key.isupper(): + line.append("%s:%s" % (key, str(fields[key]))) + + return "\t".join(line) + + +cdef AlignmentHeader makeAlignmentHeader(bam_hdr_t *hdr): + if not hdr: + raise ValueError('cannot create AlignmentHeader, received NULL pointer') + + # check: is AlignmetHeader.__cinit__ called? + cdef AlignmentHeader header = AlignmentHeader.__new__(AlignmentHeader) + header.ptr = hdr + + return header + +def read_failure_reason(code): + if code == -2: + return 'truncated file' + else: + return "error {} while reading file".format(code) + + +# the following should be class-method for VariantHeader, but cdef @classmethods +# are not implemented in cython. +cdef int fill_AlignmentHeader_from_list(bam_hdr_t *dest, + reference_names, + reference_lengths, + add_sq_text=True, + text=None) except -1: + """build header from list of reference names and lengths. + """ + +cdef class AlignmentHeader(object): + """header information for a :class:`AlignmentFile` object + + Parameters + ---------- + header_dict : dict + build header from a multi-level dictionary. The + first level are the four types ('HD', 'SQ', ...). The second + level are a list of lines, with each line being a list of + tag-value pairs. The header is constructed first from all the + defined fields, followed by user tags in alphabetical + order. Alternatively, an :class:`~pysam.AlignmentHeader` + object can be passed directly. + + text : string + use the string provided as the header + + reference_names : list + see reference_lengths + + reference_lengths : list + build header from list of chromosome names and lengths. By + default, 'SQ' and 'LN' tags will be added to the header + text. This option can be changed by unsetting the flag + `add_sq_text`. + + add_sq_text : bool + do not add 'SQ' and 'LN' tags to header. This option permits + construction :term:`SAM` formatted files without a header. + + """ + + # See makeVariantHeader for C constructor + def __cinit__(self): + self.ptr = NULL + + # Python constructor + def __init__(self): + self.ptr = bam_hdr_init() + if self.ptr is NULL: + raise MemoryError("could not create header") + + @classmethod + def _from_text_and_lengths(cls, text, reference_names, reference_lengths): + + cdef AlignmentHeader self = AlignmentHeader() + cdef char *ctext + cdef int l_text + cdef int n, x + if text is not None: + btext = force_bytes(text) + ctext = btext + l_text = len(btext) + self.ptr.text = calloc(l_text + 1, sizeof(char)) + if self.ptr.text == NULL: + raise MemoryError("could not allocate {} bytes".format(l_text + 1), sizeof(char)) + self.ptr.l_text = l_text + memcpy(self.ptr.text, ctext, l_text + 1) + + if reference_names and reference_lengths: + reference_names = [force_bytes(ref) for ref in reference_names] + + self.ptr.n_targets = len(reference_names) + + n = sum([len(reference_names) + 1]) + self.ptr.target_name = calloc(n, sizeof(char*)) + if self.ptr.target_name == NULL: + raise MemoryError("could not allocate {} bytes".format(n, sizeof(char *))) + + self.ptr.target_len = calloc(n, sizeof(uint32_t)) + if self.ptr.target_len == NULL: + raise MemoryError("could not allocate {} bytes".format(n, sizeof(uint32_t))) + + for x from 0 <= x < self.ptr.n_targets: + self.ptr.target_len[x] = reference_lengths[x] + name = reference_names[x] + self.ptr.target_name[x] = calloc(len(name) + 1, sizeof(char)) + if self.ptr.target_name[x] == NULL: + raise MemoryError("could not allocate {} bytes".format(len(name) + 1, sizeof(char))) + strncpy(self.ptr.target_name[x], name, len(name)) + + return self + + @classmethod + def from_text(cls, text): + + reference_names, reference_lengths = [], [] + for line in text.splitlines(): + if line.startswith("@SQ"): + fields = dict([x.split(":", 1) for x in line.split("\t")[1:]]) + try: + reference_names.append(fields["SN"]) + reference_lengths.append(int(fields["LN"])) + except KeyError: + raise KeyError("incomplete sequence information in '%s'" % str(fields)) + except ValueError: + raise ValueError("wrong sequence information in '%s'" % str(fields)) + + return cls._from_text_and_lengths(text, reference_names, reference_lengths) + + @classmethod + def from_dict(cls, header_dict): + + cdef list lines = [] + # first: defined tags + for record in VALID_HEADERS: + if record in header_dict: + data = header_dict[record] + if not isinstance(data, VALID_HEADER_TYPES[record]): + raise ValueError( + "invalid type for record %s: %s, expected %s".format( + record, type(data), VALID_HEADER_TYPES[record])) + if isinstance(data, Mapping): + lines.append(build_header_line(data, record)) + else: + for fields in header_dict[record]: + lines.append(build_header_line(fields, record)) + + # then: user tags (lower case), sorted alphabetically + for record, data in sorted(header_dict.items()): + if record in VALID_HEADERS: + continue + if isinstance(data, Mapping): + lines.append(build_header_line(data, record)) + else: + for fields in header_dict[record]: + lines.append(build_header_line(fields, record)) + + text = "\n".join(lines) + "\n" + + reference_names, reference_lengths = [], [] + if "SQ" in header_dict: + for fields in header_dict["SQ"]: + try: + reference_names.append(fields["SN"]) + reference_lengths.append(fields["LN"]) + except KeyError: + raise KeyError("incomplete sequence information in '%s'" % str(fields)) + + return cls._from_text_and_lengths(text, reference_names, reference_lengths) + + @classmethod + def from_references(cls, reference_names, reference_lengths, text=None, add_sq_text=True): + + if len(reference_names) != len(reference_lengths): + raise ValueError("number of reference names and lengths do not match") + + # optionally, if there is no text, add a SAM compatible header to output file. + if text is None and add_sq_text: + text = "".join(["@SQ\tSN:{}\tLN:{}\n".format(x, y) for x, y in zip( + reference_names, reference_lengths)]) + + return cls._from_text_and_lengths(text, reference_names, reference_lengths) + + def __dealloc__(self): + bam_hdr_destroy(self.ptr) + self.ptr = NULL + + def __bool__(self): + return self.ptr != NULL + + def copy(self): + return makeAlignmentHeader(bam_hdr_dup(self.ptr)) + + property nreferences: + """int with the number of :term:`reference` sequences in the file. + + This is a read-only attribute.""" + def __get__(self): + return self.ptr.n_targets + + property references: + """tuple with the names of :term:`reference` sequences. This is a + read-only attribute""" + def __get__(self): + t = [] + cdef int x + for x in range(self.ptr.n_targets): + t.append(charptr_to_str(self.ptr.target_name[x])) + return tuple(t) + + property lengths: + """tuple of the lengths of the :term:`reference` sequences. This is a + read-only attribute. The lengths are in the same order as + :attr:`pysam.AlignmentFile.references` + """ + def __get__(self): + t = [] + cdef int x + for x in range(self.ptr.n_targets): + t.append(self.ptr.target_len[x]) + return tuple(t) + + def _build_sequence_section(self): + """return sequence section of header. + + The sequence section is built from the list of reference names and + lengths stored in the BAM-file and not from any @SQ entries that + are part of the header's text section. + """ + + cdef int x + text = [] + for x in range(self.ptr.n_targets): + text.append("@SQ\tSN:{}\tLN:{}\n".format( + force_str(self.ptr.target_name[x]), + self.ptr.target_len[x])) + return "".join(text) + + def to_dict(self): + """return two-level dictionary with header information from the file. + + The first level contains the record (``HD``, ``SQ``, etc) and + the second level contains the fields (``VN``, ``LN``, etc). + + The parser is validating and will raise an AssertionError if + if encounters any record or field tags that are not part of + the SAM specification. Use the + :attr:`pysam.AlignmentFile.text` attribute to get the unparsed + header. + + The parsing follows the SAM format specification with the + exception of the ``CL`` field. This option will consume the + rest of a header line irrespective of any additional fields. + This behaviour has been added to accommodate command line + options that contain characters that are not valid field + separators. + + If no @SQ entries are within the text section of the header, + this will be automatically added from the reference names and + lengths stored in the binary part of the header. + """ + result = collections.OrderedDict() + + # convert to python string + t = self.__str__() + for line in t.split("\n"): + line = line.strip(' \0') + if not line: + continue + assert line.startswith("@"), \ + "header line without '@': '%s'" % line + fields = line[1:].split("\t") + record = fields[0] + assert record in VALID_HEADER_TYPES, \ + "header line with invalid type '%s': '%s'" % (record, line) + + # treat comments + if record == "CO": + if record not in result: + result[record] = [] + result[record].append("\t".join( fields[1:])) + continue + # the following is clumsy as generators do not work? + x = {} + + for idx, field in enumerate(fields[1:]): + if ":" not in field: + raise ValueError("malformatted header: no ':' in field" ) + key, value = field.split(":", 1) + if key in ("CL",): + # special treatment for command line + # statements (CL). These might contain + # characters that are non-conformant with + # the valid field separators in the SAM + # header. Thus, in contravention to the + # SAM API, consume the rest of the line. + key, value = "\t".join(fields[idx+1:]).split(":", 1) + x[key] = KNOWN_HEADER_FIELDS[record][key](value) + break + + # interpret type of known header record tags, default to str + x[key] = KNOWN_HEADER_FIELDS[record].get(key, str)(value) + + if VALID_HEADER_TYPES[record] == Mapping: + if record in result: + raise ValueError( + "multiple '%s' lines are not permitted" % record) + + result[record] = x + elif VALID_HEADER_TYPES[record] == Sequence: + if record not in result: result[record] = [] + result[record].append(x) + + # if there are no SQ lines in the header, add the + # reference names from the information in the bam + # file. + # + # Background: c-samtools keeps the textual part of the + # header separate from the list of reference names and + # lengths. Thus, if a header contains only SQ lines, + # the SQ information is not part of the textual header + # and thus are missing from the output. See issue 84. + if "SQ" not in result: + sq = [] + for ref, length in zip(self.references, self.lengths): + sq.append({'LN': length, 'SN': ref }) + result["SQ"] = sq + + return result + + def as_dict(self): + """deprecated, use :meth:`to_dict()` instead""" + return self.to_dict() + + def get_reference_name(self, tid): + if tid == -1: + return None + if not 0 <= tid < self.ptr.n_targets: + raise ValueError("reference_id %i out of range 0<=tid<%i" % + (tid, self.ptr.n_targets)) + return charptr_to_str(self.ptr.target_name[tid]) + + def get_reference_length(self, reference): + cdef int tid = self.get_tid(reference) + if tid < 0: + raise KeyError("unknown reference {}".format(reference)) + else: + return self.ptr.target_len[tid] + + def is_valid_tid(self, int tid): + """ + return True if the numerical :term:`tid` is valid; False otherwise. + + Note that the unmapped tid code (-1) counts as an invalid. + """ + return 0 <= tid < self.ptr.n_targets + + def get_tid(self, reference): + """ + return the numerical :term:`tid` corresponding to + :term:`reference` + + returns -1 if reference is not known. + """ + reference = force_bytes(reference) + tid = bam_name2id(self.ptr, reference) + if tid < -1: + raise ValueError('could not parse header') + return tid + + def __str__(self): + '''string with the full contents of the :term:`sam file` header as a + string. + + If no @SQ entries are within the text section of the header, + this will be automatically added from the reference names and + lengths stored in the binary part of the header. + + See :attr:`pysam.AlignmentFile.header.to_dict()` to get a parsed + representation of the header. + ''' + text = from_string_and_size(self.ptr.text, self.ptr.l_text) + if "@SQ" not in text: + text += "\n" + self._build_sequence_section() + return text + + # dictionary access methods, for backwards compatibility. + def __setitem__(self, key, value): + raise TypeError("AlignmentHeader does not support item assignment (use header.to_dict()") + + def __getitem__(self, key): + return self.to_dict().__getitem__(key) + + def items(self): + return self.to_dict().items() + + # PY2 compatibility + def iteritems(self): + return self.to_dict().items() + + def keys(self): + return self.to_dict().keys() + + def values(self): + return self.to_dict().values() + + def get(self, *args): + return self.to_dict().get(*args) + + def __len__(self): + return self.to_dict().__len__() + + def __contains__(self, key): + return self.to_dict().__contains__(key) + + +cdef class AlignmentFile(HTSFile): + """AlignmentFile(filepath_or_object, mode=None, template=None, + reference_names=None, reference_lengths=None, text=NULL, + header=None, add_sq_text=False, check_header=True, check_sq=True, + reference_filename=None, filename=None, index_filename=None, + filepath_index=None, require_index=False, duplicate_filehandle=True, + ignore_truncation=False, threads=1) + + A :term:`SAM`/:term:`BAM`/:term:`CRAM` formatted file. + + If `filepath_or_object` is a string, the file is automatically + opened. If `filepath_or_object` is a python File object, the + already opened file will be used. + + If the file is opened for reading and an index exists (if file is BAM, a + .bai file or if CRAM a .crai file), it will be opened automatically. + `index_filename` may be specified explicitly. If the index is not named + in the standard manner, not located in the same directory as the + BAM/CRAM file, or is remote. Without an index, random access via + :meth:`~pysam.AlignmentFile.fetch` and :meth:`~pysam.AlignmentFile.pileup` + is disabled. + + For writing, the header of a :term:`SAM` file/:term:`BAM` file can + be constituted from several sources (see also the samtools format + specification): + + 1. If `template` is given, the header is copied from another + `AlignmentFile` (`template` must be a + :class:`~pysam.AlignmentFile`). + + 2. If `header` is given, the header is built from a + multi-level dictionary. + + 3. If `text` is given, new header text is copied from raw + text. + + 4. The names (`reference_names`) and lengths + (`reference_lengths`) are supplied directly as lists. + + When reading or writing a CRAM file, the filename of a FASTA-formatted + reference can be specified with `reference_filename`. + + By default, if a file is opened in mode 'r', it is checked + for a valid header (`check_header` = True) and a definition of + chromosome names (`check_sq` = True). + + Parameters + ---------- + mode : string + `mode` should be ``r`` for reading or ``w`` for writing. The + default is text mode (:term:`SAM`). For binary (:term:`BAM`) + I/O you should append ``b`` for compressed or ``u`` for + uncompressed :term:`BAM` output. Use ``h`` to output header + information in text (:term:`TAM`) mode. Use ``c`` for + :term:`CRAM` formatted files. + + If ``b`` is present, it must immediately follow ``r`` or + ``w``. Valid modes are ``r``, ``w``, ``wh``, ``rb``, ``wb``, + ``wbu``, ``wb0``, ``rc`` and ``wc``. For instance, to open a + :term:`BAM` formatted file for reading, type:: + + f = pysam.AlignmentFile('ex1.bam','rb') + + If mode is not specified, the method will try to auto-detect + in the order 'rb', 'r', thus both the following should work:: + + f1 = pysam.AlignmentFile('ex1.bam') + f2 = pysam.AlignmentFile('ex1.sam') + + template : AlignmentFile + when writing, copy header from file `template`. + + header : dict or AlignmentHeader + when writing, build header from a multi-level dictionary. The + first level are the four types ('HD', 'SQ', ...). The second + level are a list of lines, with each line being a list of + tag-value pairs. The header is constructed first from all the + defined fields, followed by user tags in alphabetical + order. Alternatively, an :class:`~pysam.AlignmentHeader` + object can be passed directly. + + text : string + when writing, use the string provided as the header + + reference_names : list + see reference_lengths + + reference_lengths : list + when writing or opening a SAM file without header build header + from list of chromosome names and lengths. By default, 'SQ' + and 'LN' tags will be added to the header text. This option + can be changed by unsetting the flag `add_sq_text`. + + add_sq_text : bool + do not add 'SQ' and 'LN' tags to header. This option permits + construction :term:`SAM` formatted files without a header. + + add_sam_header : bool + when outputting SAM the default is to output a header. This is + equivalent to opening the file in 'wh' mode. If this option is + set to False, no header will be output. To read such a file, + set `check_header=False`. + + check_header : bool + obsolete: when reading a SAM file, check if header is present + (default=True) + + check_sq : bool + when reading, check if SQ entries are present in header + (default=True) + + reference_filename : string + Path to a FASTA-formatted reference file. Valid only for CRAM files. + When reading a CRAM file, this overrides both ``$REF_PATH`` and the URL + specified in the header (``UR`` tag), which are normally used to find + the reference. + + index_filename : string + Explicit path to the index file. Only needed if the index is not + named in the standard manner, not located in the same directory as + the BAM/CRAM file, or is remote. An IOError is raised if the index + cannot be found or is invalid. + + filepath_index : string + Alias for `index_filename`. + + require_index : bool + When reading, require that an index file is present and is valid or + raise an IOError. (default=False) + + filename : string + Alternative to filepath_or_object. Filename of the file + to be opened. + + duplicate_filehandle: bool + By default, file handles passed either directly or through + File-like objects will be duplicated before passing them to + htslib. The duplication prevents issues where the same stream + will be closed by htslib and through destruction of the + high-level python object. Set to False to turn off + duplication. + + ignore_truncation: bool + Issue a warning, instead of raising an error if the current file + appears to be truncated due to a missing EOF marker. Only applies + to bgzipped formats. (Default=False) + + format_options: list + A list of key=value strings, as accepted by --input-fmt-option and + --output-fmt-option in samtools. + threads: integer + Number of threads to use for compressing/decompressing BAM/CRAM files. + Setting threads to > 1 cannot be combined with `ignore_truncation`. + (Default=1) + """ + + def __cinit__(self, *args, **kwargs): + self.htsfile = NULL + self.filename = None + self.mode = None + self.threads = 1 + self.is_stream = False + self.is_remote = False + self.index = NULL + + if "filename" in kwargs: + args = [kwargs["filename"]] + del kwargs["filename"] + + self._open(*args, **kwargs) + + # allocate memory for iterator + self.b = calloc(1, sizeof(bam1_t)) + if self.b == NULL: + raise MemoryError("could not allocate memory of size {}".format(sizeof(bam1_t))) + + def has_index(self): + """return true if htsfile has an existing (and opened) index. + """ + return self.index != NULL + + def check_index(self): + """return True if index is present. + + Raises + ------ + + AttributeError + if htsfile is :term:`SAM` formatted and thus has no index. + + ValueError + if htsfile is closed or index could not be opened. + """ + + if not self.is_open: + raise ValueError("I/O operation on closed file") + if not self.is_bam and not self.is_cram: + raise AttributeError( + "AlignmentFile.mapped only available in bam files") + if self.index == NULL: + raise ValueError( + "mapping information not recorded in index " + "or index not available") + return True + + def _open(self, + filepath_or_object, + mode=None, + AlignmentFile template=None, + reference_names=None, + reference_lengths=None, + reference_filename=None, + text=None, + header=None, + port=None, + add_sq_text=True, + add_sam_header=True, + check_header=True, + check_sq=True, + index_filename=None, + filepath_index=None, + require_index=False, + referencenames=None, + referencelengths=None, + duplicate_filehandle=True, + ignore_truncation=False, + format_options=None, + threads=1): + '''open a sam, bam or cram formatted file. + + If _open is called on an existing file, the current file + will be closed and a new file will be opened. + + ''' + cdef char *cfilename = NULL + cdef char *creference_filename = NULL + cdef char *cindexname = NULL + cdef char *cmode = NULL + cdef bam_hdr_t * hdr = NULL + + if threads > 1 and ignore_truncation: + # This won't raise errors if reaching a truncated alignment, + # because bgzf_mt_reader in htslib does not deal with + # bgzf_mt_read_block returning non-zero values, contrary + # to bgzf_read (https://github.com/samtools/htslib/blob/1.7/bgzf.c#L888) + # Better to avoid this (for now) than to produce seemingly correct results. + raise ValueError('Cannot add extra threads when "ignore_truncation" is True') + self.threads = threads + + # for backwards compatibility: + if referencenames is not None: + reference_names = referencenames + if referencelengths is not None: + reference_lengths = referencelengths + + # close a previously opened file + if self.is_open: + self.close() + + # autodetection for read + if mode is None: + mode = "r" + + if add_sam_header and mode == "w": + mode = "wh" + + assert mode in ("r", "w", "rb", "wb", "wh", + "wbu", "rU", "wb0", + "rc", "wc"), \ + "invalid file opening mode `%s`" % mode + + self.duplicate_filehandle = duplicate_filehandle + + # StringIO not supported + if isinstance(filepath_or_object, StringIO): + raise NotImplementedError( + "access from StringIO objects not supported") + # reading from a file descriptor + elif isinstance(filepath_or_object, int): + self.filename = filepath_or_object + filename = None + self.is_remote = False + self.is_stream = True + # reading from a File object or other object with fileno + elif hasattr(filepath_or_object, "fileno"): + if filepath_or_object.closed: + raise ValueError('I/O operation on closed file') + self.filename = filepath_or_object + # .name can be TextIOWrapper + try: + filename = encode_filename(str(filepath_or_object.name)) + cfilename = filename + except AttributeError: + filename = None + self.is_remote = False + self.is_stream = True + # what remains is a filename + else: + self.filename = filename = encode_filename(filepath_or_object) + cfilename = filename + self.is_remote = hisremote(cfilename) + self.is_stream = self.filename == b'-' + + # for htslib, wbu seems to not work + if mode == "wbu": + mode = "wb0" + + self.mode = force_bytes(mode) + self.reference_filename = reference_filename = encode_filename( + reference_filename) + + if mode[0] == 'w': + # open file for writing + + if not (template or header or text or (reference_names and reference_lengths)): + raise ValueError( + "either supply options `template`, `header`, `text` or both `reference_names` " + "and `reference_lengths` for writing") + + if template: + # header is copied, though at the moment not strictly + # necessary as AlignmentHeader is immutable. + self.header = template.header.copy() + elif isinstance(header, AlignmentHeader): + self.header = header.copy() + elif isinstance(header, Mapping): + self.header = AlignmentHeader.from_dict(header) + elif reference_names and reference_lengths: + self.header = AlignmentHeader.from_references( + reference_names, + reference_lengths, + add_sq_text=add_sq_text, + text=text) + elif text: + self.header = AlignmentHeader.from_text(text) + else: + raise ValueError("not enough information to construct header. Please provide template, " + "header, text or reference_names/reference_lengths") + self.htsfile = self._open_htsfile() + + if self.htsfile == NULL: + if errno: + raise IOError(errno, "could not open alignment file `{}`: {}".format( + force_str(filename), + force_str(strerror(errno)))) + else: + raise ValueError("could not open alignment file `{}`".format(force_str(filename))) + if format_options and len(format_options): + self.add_hts_options(format_options) + # set filename with reference sequences. If no filename + # is given, the CRAM reference arrays will be built from + # the @SQ header in the header + if "c" in mode and reference_filename: + if (hts_set_fai_filename(self.htsfile, self.reference_filename) != 0): + raise ValueError("failure when setting reference filename") + + # write header to htsfile + if "b" in mode or "c" in mode or "h" in mode: + hdr = self.header.ptr + with nogil: + sam_hdr_write(self.htsfile, hdr) + + elif mode[0] == "r": + # open file for reading + self.htsfile = self._open_htsfile() + + if self.htsfile == NULL: + if errno: + raise IOError(errno, "could not open alignment file `{}`: {}".format(force_str(filename), + force_str(strerror(errno)))) + else: + raise ValueError("could not open alignment file `{}`".format(force_str(filename))) + + if self.htsfile.format.category != sequence_data: + raise ValueError("file does not contain alignment data") + + if format_options and len(format_options): + self.add_hts_options(format_options) + + self.check_truncation(ignore_truncation) + + # bam/cram files require a valid header + if self.is_bam or self.is_cram: + with nogil: + hdr = sam_hdr_read(self.htsfile) + if hdr == NULL: + raise ValueError( + "file does not have a valid header (mode='%s') " + "- is it BAM/CRAM format?" % mode) + self.header = makeAlignmentHeader(hdr) + else: + # in sam files a header is optional. If not given, + # user may provide reference names and lengths to built + # an on-the-fly header. + if reference_names and reference_lengths: + # build header from a target names and lengths + self.header = AlignmentHeader.from_references( + reference_names=reference_names, + reference_lengths=reference_lengths, + add_sq_text=add_sq_text, + text=text) + else: + with nogil: + hdr = sam_hdr_read(self.htsfile) + if hdr == NULL: + raise ValueError( + "SAM? file does not have a valid header (mode='%s'), " + "please provide reference_names and reference_lengths") + self.header = makeAlignmentHeader(hdr) + + # set filename with reference sequences + if self.is_cram and reference_filename: + creference_filename = self.reference_filename + hts_set_opt(self.htsfile, + CRAM_OPT_REFERENCE, + creference_filename) + + if check_sq and self.header.nreferences == 0: + raise ValueError( + ("file has no sequences defined (mode='%s') - " + "is it SAM/BAM format? Consider opening with " + "check_sq=False") % mode) + + if self.is_bam or self.is_cram: + self.index_filename = index_filename or filepath_index + if self.index_filename: + cindexname = bfile_name = encode_filename(self.index_filename) + + if cfilename or cindexname: + with nogil: + self.index = sam_index_load2(self.htsfile, cfilename, cindexname) + + if not self.index and (cindexname or require_index): + if errno: + raise IOError(errno, force_str(strerror(errno))) + else: + raise IOError('unable to open index file `%s`' % self.index_filename) + + elif require_index: + raise IOError('unable to open index file') + + # save start of data section + if not self.is_stream: + self.start_offset = self.tell() + + def fetch(self, + contig=None, + start=None, + stop=None, + region=None, + tid=None, + until_eof=False, + multiple_iterators=False, + reference=None, + end=None): + """fetch reads aligned in a :term:`region`. + + See :meth:`~pysam.HTSFile.parse_region` for more information + on how genomic regions can be specified. :term:`reference` and + `end` are also accepted for backward compatibility as synonyms + for :term:`contig` and `stop`, respectively. + + Without a `contig` or `region` all mapped reads in the file + will be fetched. The reads will be returned ordered by reference + sequence, which will not necessarily be the order within the + file. This mode of iteration still requires an index. If there is + no index, use `until_eof=True`. + + If only `contig` is set, all reads aligned to `contig` + will be fetched. + + A :term:`SAM` file does not allow random access. If `region` + or `contig` are given, an exception is raised. + + Parameters + ---------- + + until_eof : bool + + If `until_eof` is True, all reads from the current file + position will be returned in order as they are within the + file. Using this option will also fetch unmapped reads. + + multiple_iterators : bool + + If `multiple_iterators` is True, multiple + iterators on the same file can be used at the same time. The + iterator returned will receive its own copy of a filehandle to + the file effectively re-opening the file. Re-opening a file + creates some overhead, so beware. + + Returns + ------- + + An iterator over a collection of reads. : IteratorRow + + Raises + ------ + + ValueError + if the genomic coordinates are out of range or invalid or the + file does not permit random access to genomic coordinates. + + """ + cdef int rtid, rstart, rstop, has_coord + + if not self.is_open: + raise ValueError( "I/O operation on closed file" ) + + has_coord, rtid, rstart, rstop = self.parse_region( + contig, start, stop, region, tid, + end=end, reference=reference) + + # Turn of re-opening if htsfile is a stream + if self.is_stream: + multiple_iterators = False + + if self.is_bam or self.is_cram: + if not until_eof and not self.is_remote: + if not self.has_index(): + raise ValueError( + "fetch called on bamfile without index") + + if has_coord: + return IteratorRowRegion( + self, rtid, rstart, rstop, + multiple_iterators=multiple_iterators) + else: + if until_eof: + return IteratorRowAll( + self, + multiple_iterators=multiple_iterators) + else: + # AH: check - reason why no multiple_iterators for + # AllRefs? + return IteratorRowAllRefs( + self, + multiple_iterators=multiple_iterators) + else: + if has_coord: + raise ValueError( + "fetching by region is not available for SAM files") + + if multiple_iterators == True: + raise ValueError( + "multiple iterators not implemented for SAM files") + + return IteratorRowAll(self, + multiple_iterators=multiple_iterators) + + def head(self, n, multiple_iterators=True): + '''return an iterator over the first n alignments. + + This iterator is is useful for inspecting the bam-file. + + Parameters + ---------- + + multiple_iterators : bool + + is set to True by default in order to + avoid changing the current file position. + + Returns + ------- + + an iterator over a collection of reads : IteratorRowHead + + ''' + return IteratorRowHead(self, n, + multiple_iterators=multiple_iterators) + + def mate(self, AlignedSegment read): + '''return the mate of :class:`pysam.AlignedSegment` `read`. + + .. note:: + + Calling this method will change the file position. + This might interfere with any iterators that have + not re-opened the file. + + .. note:: + + This method is too slow for high-throughput processing. + If a read needs to be processed with its mate, work + from a read name sorted file or, better, cache reads. + + Returns + ------- + + the mate : AlignedSegment + + Raises + ------ + + ValueError + if the read is unpaired or the mate is unmapped + + ''' + cdef uint32_t flag = read._delegate.core.flag + + if flag & BAM_FPAIRED == 0: + raise ValueError("read %s: is unpaired" % + (read.query_name)) + if flag & BAM_FMUNMAP != 0: + raise ValueError("mate %s: is unmapped" % + (read.query_name)) + + # xor flags to get the other mate + cdef int x = BAM_FREAD1 + BAM_FREAD2 + flag = (flag ^ x) & x + + # Make sure to use a separate file to jump around + # to mate as otherwise the original file position + # will be lost + # The following code is not using the C API and + # could thus be made much quicker, for example + # by using tell and seek. + for mate in self.fetch( + read._delegate.core.mpos, + read._delegate.core.mpos + 1, + tid=read._delegate.core.mtid, + multiple_iterators=True): + if mate.flag & flag != 0 and \ + mate.query_name == read.query_name: + break + else: + raise ValueError("mate not found") + + return mate + + def pileup(self, + contig=None, + start=None, + stop=None, + region=None, + reference=None, + end=None, + **kwargs): + """perform a :term:`pileup` within a :term:`region`. The region is + specified by :term:`contig`, `start` and `stop` (using + 0-based indexing). :term:`reference` and `end` are also accepted for + backward compatibility as synonyms for :term:`contig` and `stop`, + respectively. Alternatively, a samtools 'region' string + can be supplied. + + Without 'contig' or 'region' all reads will be used for the + pileup. The reads will be returned ordered by + :term:`contig` sequence, which will not necessarily be the + order within the file. + + Note that :term:`SAM` formatted files do not allow random + access. In these files, if a 'region' or 'contig' are + given an exception is raised. + + .. note:: + + 'all' reads which overlap the region are returned. The + first base returned will be the first base of the first + read 'not' necessarily the first base of the region used + in the query. + + Parameters + ---------- + + truncate : bool + + By default, the samtools pileup engine outputs all reads + overlapping a region. If truncate is True and a region is + given, only columns in the exact region specified are + returned. + + max_depth : int + Maximum read depth permitted. The default limit is '8000'. + + stepper : string + The stepper controls how the iterator advances. + Possible options for the stepper are + + ``all`` + skip reads in which any of the following flags are set: + BAM_FUNMAP, BAM_FSECONDARY, BAM_FQCFAIL, BAM_FDUP + + ``nofilter`` + uses every single read turning off any filtering. + + ``samtools`` + same filter and read processing as in samtools + pileup. For full compatibility, this requires a + 'fastafile' to be given. The following options all pertain + to filtering of the ``samtools`` stepper. + + fastafile : :class:`~pysam.FastaFile` object. + + This is required for some of the steppers. + + ignore_overlaps: bool + + If set to True, detect if read pairs overlap and only take + the higher quality base. This is the default. + + flag_filter : int + + ignore reads where any of the bits in the flag are set. The default is + BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP. + + flag_require : int + + only use reads where certain flags are set. The default is 0. + + ignore_orphans: bool + + ignore orphans (paired reads that are not in a proper pair). + The default is to ignore orphans. + + min_base_quality: int + + Minimum base quality. Bases below the minimum quality will + not be output. The default is 13. + + adjust_capq_threshold: int + + adjust mapping quality. The default is 0 for no + adjustment. The recommended value for adjustment is 50. + + min_mapping_quality : int + + only use reads above a minimum mapping quality. The default is 0. + + compute_baq: bool + + re-alignment computing per-Base Alignment Qualities (BAQ). The + default is to do re-alignment. Realignment requires a reference + sequence. If none is present, no realignment will be performed. + + redo_baq: bool + + recompute per-Base Alignment Quality on the fly ignoring + existing base qualities. The default is False (use existing + base qualities). + + Returns + ------- + + an iterator over genomic positions. : IteratorColumn + + """ + cdef int rtid, has_coord + cdef int32_t rstart, rstop + + if not self.is_open: + raise ValueError("I/O operation on closed file") + + has_coord, rtid, rstart, rstop = self.parse_region( + contig, start, stop, region, reference=reference, end=end) + + if has_coord: + if not self.has_index(): + raise ValueError("no index available for pileup") + + return IteratorColumnRegion(self, + tid=rtid, + start=rstart, + stop=rstop, + **kwargs) + else: + if self.has_index(): + return IteratorColumnAllRefs(self, **kwargs) + else: + return IteratorColumnAll(self, **kwargs) + + def count(self, + contig=None, + start=None, + stop=None, + region=None, + until_eof=False, + read_callback="nofilter", + reference=None, + end=None): + '''count the number of reads in :term:`region` + + The region is specified by :term:`contig`, `start` and `stop`. + :term:`reference` and `end` are also accepted for backward + compatibility as synonyms for :term:`contig` and `stop`, + respectively. Alternatively, a `samtools`_ :term:`region` + string can be supplied. + + A :term:`SAM` file does not allow random access and if + `region` or `contig` are given, an exception is raised. + + Parameters + ---------- + + contig : string + reference_name of the genomic region (chromosome) + + start : int + start of the genomic region (0-based inclusive) + + stop : int + end of the genomic region (0-based exclusive) + + region : string + a region string in samtools format. + + until_eof : bool + count until the end of the file, possibly including + unmapped reads as well. + + read_callback: string or function + + select a call-back to ignore reads when counting. It can + be either a string with the following values: + + ``all`` + skip reads in which any of the following + flags are set: BAM_FUNMAP, BAM_FSECONDARY, BAM_FQCFAIL, + BAM_FDUP + + ``nofilter`` + uses every single read + + Alternatively, `read_callback` can be a function + ``check_read(read)`` that should return True only for + those reads that shall be included in the counting. + + reference : string + backward compatible synonym for `contig` + + end : int + backward compatible synonym for `stop` + + Raises + ------ + + ValueError + if the genomic coordinates are out of range or invalid. + + ''' + cdef AlignedSegment read + cdef long counter = 0 + + if not self.is_open: + raise ValueError("I/O operation on closed file") + + cdef int filter_method = 0 + if read_callback == "all": + filter_method = 1 + elif read_callback == "nofilter": + filter_method = 2 + + for read in self.fetch(contig=contig, + start=start, + stop=stop, + reference=reference, + end=end, + region=region, + until_eof=until_eof): + # apply filter + if filter_method == 1: + # filter = "all" + if (read.flag & (0x4 | 0x100 | 0x200 | 0x400)): + continue + elif filter_method == 2: + # filter = "nofilter" + pass + else: + if not read_callback(read): + continue + counter += 1 + + return counter + + @cython.boundscheck(False) # we do manual bounds checking + def count_coverage(self, + contig, + start=None, + stop=None, + region=None, + quality_threshold=15, + read_callback='all', + reference=None, + end=None): + """count the coverage of genomic positions by reads in :term:`region`. + + The region is specified by :term:`contig`, `start` and `stop`. + :term:`reference` and `end` are also accepted for backward + compatibility as synonyms for :term:`contig` and `stop`, + respectively. Alternatively, a `samtools`_ :term:`region` + string can be supplied. The coverage is computed per-base [ACGT]. + + Parameters + ---------- + + contig : string + reference_name of the genomic region (chromosome) + + start : int + start of the genomic region (0-based inclusive). If not + given, count from the start of the chromosome. + + stop : int + end of the genomic region (0-based exclusive). If not given, + count to the end of the chromosome. + + region : string + a region string. + + quality_threshold : int + quality_threshold is the minimum quality score (in phred) a + base has to reach to be counted. + + read_callback: string or function + + select a call-back to ignore reads when counting. It can + be either a string with the following values: + + ``all`` + skip reads in which any of the following + flags are set: BAM_FUNMAP, BAM_FSECONDARY, BAM_FQCFAIL, + BAM_FDUP + + ``nofilter`` + uses every single read + + Alternatively, `read_callback` can be a function + ``check_read(read)`` that should return True only for + those reads that shall be included in the counting. + + reference : string + backward compatible synonym for `contig` + + end : int + backward compatible synonym for `stop` + + Raises + ------ + + ValueError + if the genomic coordinates are out of range or invalid. + + Returns + ------- + + four array.arrays of the same length in order A C G T : tuple + + """ + + cdef uint32_t contig_length = self.get_reference_length(contig) + cdef int _start = start if start is not None else 0 + cdef int _stop = stop if stop is not None else contig_length + _stop = _stop if _stop < contig_length else contig_length + + if _stop == _start: + raise ValueError("interval of size 0") + if _stop < _start: + raise ValueError("interval of size less than 0") + + cdef int length = _stop - _start + cdef c_array.array int_array_template = array.array('L', []) + cdef c_array.array count_a + cdef c_array.array count_c + cdef c_array.array count_g + cdef c_array.array count_t + count_a = c_array.clone(int_array_template, length, zero=True) + count_c = c_array.clone(int_array_template, length, zero=True) + count_g = c_array.clone(int_array_template, length, zero=True) + count_t = c_array.clone(int_array_template, length, zero=True) + + cdef AlignedSegment read + cdef cython.str seq + cdef c_array.array quality + cdef int qpos + cdef int refpos + cdef int c = 0 + cdef int filter_method = 0 + + + if read_callback == "all": + filter_method = 1 + elif read_callback == "nofilter": + filter_method = 2 + + cdef int _threshold = quality_threshold or 0 + for read in self.fetch(contig=contig, + reference=reference, + start=start, + stop=stop, + end=end, + region=region): + # apply filter + if filter_method == 1: + # filter = "all" + if (read.flag & (0x4 | 0x100 | 0x200 | 0x400)): + continue + elif filter_method == 2: + # filter = "nofilter" + pass + else: + if not read_callback(read): + continue + + # count + seq = read.seq + if seq is None: + continue + quality = read.query_qualities + + for qpos, refpos in read.get_aligned_pairs(True): + if qpos is not None and refpos is not None and \ + _start <= refpos < _stop: + + # only check base quality if _threshold > 0 + if (_threshold and quality and quality[qpos] >= _threshold) or not _threshold: + if seq[qpos] == 'A': + count_a.data.as_ulongs[refpos - _start] += 1 + if seq[qpos] == 'C': + count_c.data.as_ulongs[refpos - _start] += 1 + if seq[qpos] == 'G': + count_g.data.as_ulongs[refpos - _start] += 1 + if seq[qpos] == 'T': + count_t.data.as_ulongs[refpos - _start] += 1 + + return count_a, count_c, count_g, count_t + + def find_introns_slow(self, read_iterator): + """Return a dictionary {(start, stop): count} + Listing the intronic sites in the reads (identified by 'N' in the cigar strings), + and their support ( = number of reads ). + + read_iterator can be the result of a .fetch(...) call. + Or it can be a generator filtering such reads. Example + samfile.find_introns((read for read in samfile.fetch(...) if read.is_reverse) + """ + res = collections.Counter() + for r in read_iterator: + if 'N' in r.cigarstring: + last_read_pos = False + for read_loc, genome_loc in r.get_aligned_pairs(): + if read_loc is None and last_read_pos: + start = genome_loc + elif read_loc and last_read_pos is None: + stop = genome_loc # we are right exclusive ,so this is correct + res[(start, stop)] += 1 + del start + del stop + last_read_pos = read_loc + return res + + def find_introns(self, read_iterator): + """Return a dictionary {(start, stop): count} + Listing the intronic sites in the reads (identified by 'N' in the cigar strings), + and their support ( = number of reads ). + + read_iterator can be the result of a .fetch(...) call. + Or it can be a generator filtering such reads. Example + samfile.find_introns((read for read in samfile.fetch(...) if read.is_reverse) + """ + cdef: + uint32_t base_position, junc_start, nt + int op + AlignedSegment r + int BAM_CREF_SKIP = 3 #BAM_CREF_SKIP + + res = collections.Counter() + + match_or_deletion = {0, 2, 7, 8} # only M/=/X (0/7/8) and D (2) are related to genome position + for r in read_iterator: + base_position = r.pos + + for op, nt in r.cigartuples: + if op in match_or_deletion: + base_position += nt + elif op == BAM_CREF_SKIP: + junc_start = base_position + base_position += nt + res[(junc_start, base_position)] += 1 + return res + + + def close(self): + '''closes the :class:`pysam.AlignmentFile`.''' + + if self.htsfile == NULL: + return + + cdef int ret = hts_close(self.htsfile) + self.htsfile = NULL + + if self.index != NULL: + hts_idx_destroy(self.index) + self.index = NULL + + self.header = None + + if ret < 0: + global errno + if errno == EPIPE: + errno = 0 + else: + raise IOError(errno, force_str(strerror(errno))) + + def __dealloc__(self): + cdef int ret = 0 + + if self.htsfile != NULL: + ret = hts_close(self.htsfile) + self.htsfile = NULL + + if self.index != NULL: + hts_idx_destroy(self.index) + self.index = NULL + + self.header = None + + if self.b: + bam_destroy1(self.b) + self.b = NULL + + if ret < 0: + global errno + if errno == EPIPE: + errno = 0 + else: + raise IOError(errno, force_str(strerror(errno))) + + cpdef int write(self, AlignedSegment read) except -1: + ''' + write a single :class:`pysam.AlignedSegment` to disk. + + Raises: + ValueError + if the writing failed + + Returns: + int : + the number of bytes written. If the file is closed, + this will be 0. + ''' + if not self.is_open: + return 0 + + if self.header.ptr.n_targets <= read._delegate.core.tid: + raise ValueError( + "AlignedSegment refers to reference number {} that " + "is larger than the number of references ({}) in the header".format( + read._delegate.core.tid, self.header.ptr.n_targets)) + + cdef int ret + with nogil: + ret = sam_write1(self.htsfile, + self.header.ptr, + read._delegate) + + # kbj: Still need to raise an exception with except -1. Otherwise + # when ret == -1 we get a "SystemError: error return without + # exception set". + if ret < 0: + raise IOError( + "sam_write1 failed with error code {}".format(ret)) + + return ret + + # context manager interface + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + return False + + ############################################################### + ############################################################### + ############################################################### + ## properties + ############################################################### + property mapped: + """int with total number of mapped alignments according to the + statistics recorded in the index. This is a read-only + attribute. + (This will be 0 for a CRAM file indexed by a .crai index, as that + index format does not record these statistics.) + """ + def __get__(self): + self.check_index() + cdef int tid + cdef uint64_t total = 0 + cdef uint64_t mapped, unmapped + for tid from 0 <= tid < self.header.nreferences: + with nogil: + hts_idx_get_stat(self.index, tid, &mapped, &unmapped) + total += mapped + return total + + property unmapped: + """int with total number of unmapped reads according to the statistics + recorded in the index. This number of reads includes the number of reads + without coordinates. This is a read-only attribute. + (This will be 0 for a CRAM file indexed by a .crai index, as that + index format does not record these statistics.) + """ + def __get__(self): + self.check_index() + cdef int tid + cdef uint64_t total = hts_idx_get_n_no_coor(self.index) + cdef uint64_t mapped, unmapped + for tid from 0 <= tid < self.header.nreferences: + with nogil: + hts_idx_get_stat(self.index, tid, &mapped, &unmapped) + total += unmapped + return total + + property nocoordinate: + """int with total number of reads without coordinates according to the + statistics recorded in the index, i.e., the statistic printed for "*" + by the ``samtools idxstats`` command. This is a read-only attribute. + (This will be 0 for a CRAM file indexed by a .crai index, as that + index format does not record these statistics.) + """ + def __get__(self): + self.check_index() + cdef uint64_t n + with nogil: + n = hts_idx_get_n_no_coor(self.index) + return n + + def get_index_statistics(self): + """return statistics about mapped/unmapped reads per chromosome as + they are stored in the index, similarly to the statistics printed + by the ``samtools idxstats`` command. + + CRAI indexes do not record these statistics, so for a CRAM file + with a .crai index the returned statistics will all be 0. + + Returns: + list : + a list of records for each chromosome. Each record has the + attributes 'contig', 'mapped', 'unmapped' and 'total'. + """ + + self.check_index() + cdef int tid + cdef uint64_t mapped, unmapped + results = [] + # TODO: use header + for tid from 0 <= tid < self.nreferences: + with nogil: + hts_idx_get_stat(self.index, tid, &mapped, &unmapped) + results.append( + IndexStats._make(( + self.get_reference_name(tid), + mapped, + unmapped, + mapped + unmapped))) + + return results + + ############################################################### + ## file-object like iterator access + ## note: concurrent access will cause errors (see IteratorRow + ## and multiple_iterators) + ## Possible solutions: deprecate or open new file handle + def __iter__(self): + if not self.is_open: + raise ValueError("I/O operation on closed file") + + if not self.is_bam and self.header.nreferences == 0: + raise NotImplementedError( + "can not iterate over samfile without header") + return self + + cdef bam1_t * getCurrent(self): + return self.b + + cdef int cnext(self): + ''' + cversion of iterator. Used by :class:`pysam.AlignmentFile.IteratorColumn`. + ''' + cdef int ret + cdef bam_hdr_t * hdr = self.header.ptr + with nogil: + ret = sam_read1(self.htsfile, + hdr, + self.b) + return ret + + def __next__(self): + cdef int ret = self.cnext() + if ret >= 0: + return makeAlignedSegment(self.b, self.header) + elif ret == -1: + raise StopIteration + else: + raise IOError(read_failure_reason(ret)) + + ########################################### + # methods/properties referencing the header + def is_valid_tid(self, int tid): + """ + return True if the numerical :term:`tid` is valid; False otherwise. + + Note that the unmapped tid code (-1) counts as an invalid. + """ + if self.header is None: + raise ValueError("header not available in closed files") + return self.header.is_valid_tid(tid) + + def get_tid(self, reference): + """ + return the numerical :term:`tid` corresponding to + :term:`reference` + + returns -1 if reference is not known. + """ + if self.header is None: + raise ValueError("header not available in closed files") + return self.header.get_tid(reference) + + def get_reference_name(self, tid): + """ + return :term:`reference` name corresponding to numerical :term:`tid` + """ + if self.header is None: + raise ValueError("header not available in closed files") + return self.header.get_reference_name(tid) + + def get_reference_length(self, reference): + """ + return :term:`reference` length corresponding to numerical :term:`tid` + """ + if self.header is None: + raise ValueError("header not available in closed files") + return self.header.get_reference_length(reference) + + property nreferences: + """int with the number of :term:`reference` sequences in the file. + This is a read-only attribute.""" + def __get__(self): + if self.header: + return self.header.nreferences + else: + raise ValueError("header not available in closed files") + + property references: + """tuple with the names of :term:`reference` sequences. This is a + read-only attribute""" + def __get__(self): + if self.header: + return self.header.references + else: + raise ValueError("header not available in closed files") + + property lengths: + """tuple of the lengths of the :term:`reference` sequences. This is a + read-only attribute. The lengths are in the same order as + :attr:`pysam.AlignmentFile.references` + + """ + def __get__(self): + if self.header: + return self.header.lengths + else: + raise ValueError("header not available in closed files") + + # Compatibility functions for pysam < 0.14 + property text: + """deprecated, use :attr:`references` and :attr:`lengths` instead""" + def __get__(self): + if self.header: + return self.header.__str__() + else: + raise ValueError("header not available in closed files") + + # Compatibility functions for pysam < 0.8.3 + def gettid(self, reference): + """deprecated, use :meth:`get_tid` instead""" + return self.get_tid(reference) + + def getrname(self, tid): + """deprecated, use :meth:`get_reference_name` instead""" + return self.get_reference_name(tid) + + +cdef class IteratorRow: + '''abstract base class for iterators over mapped reads. + + Various iterators implement different behaviours for wrapping around + contig boundaries. Examples include: + + :class:`pysam.IteratorRowRegion` + iterate within a single contig and a defined region. + + :class:`pysam.IteratorRowAll` + iterate until EOF. This iterator will also include unmapped reads. + + :class:`pysam.IteratorRowAllRefs` + iterate over all reads in all reference sequences. + + The method :meth:`AlignmentFile.fetch` returns an IteratorRow. + + .. note:: + + It is usually not necessary to create an object of this class + explicitly. It is returned as a result of call to a + :meth:`AlignmentFile.fetch`. + + ''' + + def __init__(self, AlignmentFile samfile, int multiple_iterators=False): + cdef char *cfilename + cdef char *creference_filename + cdef char *cindexname = NULL + + if not samfile.is_open: + raise ValueError("I/O operation on closed file") + + # makes sure that samfile stays alive as long as the + # iterator is alive + self.samfile = samfile + + # reopen the file - note that this makes the iterator + # slow and causes pileup to slow down significantly. + if multiple_iterators: + + cfilename = samfile.filename + with nogil: + self.htsfile = hts_open(cfilename, 'r') + assert self.htsfile != NULL + + if samfile.has_index(): + if samfile.index_filename: + cindexname = bindex_filename = encode_filename(samfile.index_filename) + with nogil: + self.index = sam_index_load2(self.htsfile, cfilename, cindexname) + else: + self.index = NULL + + # need to advance in newly opened file to position after header + # better: use seek/tell? + with nogil: + hdr = sam_hdr_read(self.htsfile) + if hdr is NULL: + raise IOError("unable to read header information") + self.header = makeAlignmentHeader(hdr) + + self.owns_samfile = True + + # options specific to CRAM files + if samfile.is_cram and samfile.reference_filename: + creference_filename = samfile.reference_filename + hts_set_opt(self.htsfile, + CRAM_OPT_REFERENCE, + creference_filename) + + else: + self.htsfile = samfile.htsfile + self.index = samfile.index + self.owns_samfile = False + self.header = samfile.header + + self.retval = 0 + + self.b = bam_init1() + + def __dealloc__(self): + bam_destroy1(self.b) + if self.owns_samfile: + hts_close(self.htsfile) + hts_idx_destroy(self.index) + + +cdef class IteratorRowRegion(IteratorRow): + """*(AlignmentFile samfile, int tid, int beg, int stop, + int multiple_iterators=False)* + + iterate over mapped reads in a region. + + .. note:: + + It is usually not necessary to create an object of this class + explicitly. It is returned as a result of call to a + :meth:`AlignmentFile.fetch`. + + """ + + def __init__(self, AlignmentFile samfile, + int tid, int beg, int stop, + int multiple_iterators=False): + + if not samfile.has_index(): + raise ValueError("no index available for iteration") + + IteratorRow.__init__(self, samfile, + multiple_iterators=multiple_iterators) + with nogil: + self.iter = sam_itr_queryi( + self.index, + tid, + beg, + stop) + + def __iter__(self): + return self + + cdef bam1_t * getCurrent(self): + return self.b + + cdef int cnext(self): + '''cversion of iterator. Used by IteratorColumn''' + with nogil: + self.retval = hts_itr_next(hts_get_bgzfp(self.htsfile), + self.iter, + self.b, + self.htsfile) + + def __next__(self): + self.cnext() + if self.retval >= 0: + return makeAlignedSegment(self.b, self.header) + elif self.retval == -1: + raise StopIteration + elif self.retval == -2: + # Note: it is currently not the case that hts_iter_next + # returns -2 for a truncated file. + # See https://github.com/pysam-developers/pysam/pull/50#issuecomment-64928625 + raise IOError('truncated file') + else: + raise IOError("error while reading file {}: {}".format(self.samfile.filename, self.retval)) + + def __dealloc__(self): + hts_itr_destroy(self.iter) + + +cdef class IteratorRowHead(IteratorRow): + """*(AlignmentFile samfile, n, int multiple_iterators=False)* + + iterate over first n reads in `samfile` + + .. note:: + It is usually not necessary to create an object of this class + explicitly. It is returned as a result of call to a + :meth:`AlignmentFile.head`. + + """ + + def __init__(self, + AlignmentFile samfile, + int n, + int multiple_iterators=False): + + IteratorRow.__init__(self, samfile, + multiple_iterators=multiple_iterators) + + self.max_rows = n + self.current_row = 0 + + def __iter__(self): + return self + + cdef bam1_t * getCurrent(self): + return self.b + + cdef int cnext(self): + '''cversion of iterator. Used by IteratorColumn''' + cdef int ret + cdef bam_hdr_t * hdr = self.header.ptr + with nogil: + ret = sam_read1(self.htsfile, + hdr, + self.b) + return ret + + def __next__(self): + if self.current_row >= self.max_rows: + raise StopIteration + + cdef int ret = self.cnext() + if ret >= 0: + self.current_row += 1 + return makeAlignedSegment(self.b, self.header) + elif ret == -1: + raise StopIteration + else: + raise IOError(read_failure_reason(ret)) + + +cdef class IteratorRowAll(IteratorRow): + """*(AlignmentFile samfile, int multiple_iterators=False)* + + iterate over all reads in `samfile` + + .. note:: + + It is usually not necessary to create an object of this class + explicitly. It is returned as a result of call to a + :meth:`AlignmentFile.fetch`. + + """ + + def __init__(self, AlignmentFile samfile, + int multiple_iterators=False): + + IteratorRow.__init__(self, samfile, + multiple_iterators=multiple_iterators) + + def __iter__(self): + return self + + cdef bam1_t * getCurrent(self): + return self.b + + cdef int cnext(self): + '''cversion of iterator. Used by IteratorColumn''' + cdef int ret + cdef bam_hdr_t * hdr = self.header.ptr + with nogil: + ret = sam_read1(self.htsfile, + hdr, + self.b) + return ret + + def __next__(self): + cdef int ret = self.cnext() + if ret >= 0: + return makeAlignedSegment(self.b, self.header) + elif ret == -1: + raise StopIteration + else: + raise IOError(read_failure_reason(ret)) + + +cdef class IteratorRowAllRefs(IteratorRow): + """iterates over all mapped reads by chaining iterators over each + reference + + .. note:: + It is usually not necessary to create an object of this class + explicitly. It is returned as a result of call to a + :meth:`AlignmentFile.fetch`. + + """ + + def __init__(self, AlignmentFile samfile, + multiple_iterators=False): + + IteratorRow.__init__(self, samfile, + multiple_iterators=multiple_iterators) + + if not samfile.has_index(): + raise ValueError("no index available for fetch") + + self.tid = -1 + + def nextiter(self): + # get a new iterator for a chromosome. The file + # will not be re-opened. + self.rowiter = IteratorRowRegion(self.samfile, + self.tid, + 0, + MAX_POS) + # set htsfile and header of the rowiter + # to the values in this iterator to reflect multiple_iterators + self.rowiter.htsfile = self.htsfile + self.rowiter.header = self.header + + # make sure the iterator understand that IteratorRowAllRefs + # has ownership + self.rowiter.owns_samfile = False + + def __iter__(self): + return self + + def __next__(self): + # Create an initial iterator + if self.tid == -1: + if not self.samfile.nreferences: + raise StopIteration + self.tid = 0 + self.nextiter() + + while 1: + self.rowiter.cnext() + + # If current iterator is not exhausted, return aligned read + if self.rowiter.retval > 0: + return makeAlignedSegment(self.rowiter.b, self.header) + + self.tid += 1 + + # Otherwise, proceed to next reference or stop + if self.tid < self.samfile.nreferences: + self.nextiter() + else: + raise StopIteration + + +cdef class IteratorRowSelection(IteratorRow): + """*(AlignmentFile samfile)* + + iterate over reads in `samfile` at a given list of file positions. + + .. note:: + It is usually not necessary to create an object of this class + explicitly. It is returned as a result of call to a :meth:`AlignmentFile.fetch`. + """ + + def __init__(self, AlignmentFile samfile, positions, int multiple_iterators=True): + + IteratorRow.__init__(self, samfile, multiple_iterators=multiple_iterators) + + self.positions = positions + self.current_pos = 0 + + def __iter__(self): + return self + + cdef bam1_t * getCurrent(self): + return self.b + + cdef int cnext(self): + '''cversion of iterator''' + # end iteration if out of positions + if self.current_pos >= len(self.positions): return -1 + + cdef uint64_t pos = self.positions[self.current_pos] + with nogil: + bgzf_seek(hts_get_bgzfp(self.htsfile), + pos, + 0) + self.current_pos += 1 + + cdef int ret + cdef bam_hdr_t * hdr = self.header.ptr + with nogil: + ret = sam_read1(self.htsfile, + hdr, + self.b) + return ret + + def __next__(self): + cdef int ret = self.cnext() + if ret >= 0: + return makeAlignedSegment(self.b, self.header) + elif ret == -1: + raise StopIteration + else: + raise IOError(read_failure_reason(ret)) + + +cdef int __advance_nofilter(void *data, bam1_t *b): + '''advance without any read filtering. + ''' + cdef __iterdata * d = <__iterdata*>data + cdef int ret + with nogil: + ret = sam_itr_next(d.htsfile, d.iter, b) + return ret + + +cdef int __advance_raw_nofilter(void *data, bam1_t *b): + '''advance (without iterator) without any read filtering. + ''' + cdef __iterdata * d = <__iterdata*>data + cdef int ret + with nogil: + ret = sam_read1(d.htsfile, d.header, b) + return ret + + +cdef int __advance_all(void *data, bam1_t *b): + '''only use reads for pileup passing basic filters such as + + BAM_FUNMAP, BAM_FSECONDARY, BAM_FQCFAIL, BAM_FDUP + ''' + + cdef __iterdata * d = <__iterdata*>data + cdef mask = BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP + cdef int ret + while 1: + with nogil: + ret = sam_itr_next(d.htsfile, d.iter, b) + if ret < 0: + break + if b.core.flag & d.flag_filter: + continue + break + return ret + + +cdef int __advance_raw_all(void *data, bam1_t *b): + '''only use reads for pileup passing basic filters such as + + BAM_FUNMAP, BAM_FSECONDARY, BAM_FQCFAIL, BAM_FDUP + ''' + + cdef __iterdata * d = <__iterdata*>data + cdef int ret + while 1: + with nogil: + ret = sam_read1(d.htsfile, d.header, b) + if ret < 0: + break + if b.core.flag & d.flag_filter: + continue + break + return ret + + +cdef int __advance_samtools(void * data, bam1_t * b): + '''advance using same filter and read processing as in + the samtools pileup. + ''' + cdef __iterdata * d = <__iterdata*>data + cdef int ret + cdef int q + + while 1: + with nogil: + ret = sam_itr_next(d.htsfile, d.iter, b) if d.iter else sam_read1(d.htsfile, d.header, b) + if ret < 0: + break + if b.core.flag & d.flag_filter: + continue + if d.flag_require and not (b.core.flag & d.flag_require): + continue + + # reload sequence + if d.fastafile != NULL and b.core.tid != d.tid: + if d.seq != NULL: + free(d.seq) + d.tid = b.core.tid + with nogil: + d.seq = faidx_fetch_seq( + d.fastafile, + d.header.target_name[d.tid], + 0, MAX_POS, + &d.seq_len) + + if d.seq == NULL: + raise ValueError( + "reference sequence for '{}' (tid={}) not found".format( + d.header.target_name[d.tid], d.tid)) + + # realign read - changes base qualities + if d.seq != NULL and d.compute_baq: + # 4th option to realign is flag: + # apply_baq = flag&1, extend_baq = flag&2, redo_baq = flag&4 + if d.redo_baq: + sam_prob_realn(b, d.seq, d.seq_len, 7) + else: + sam_prob_realn(b, d.seq, d.seq_len, 3) + + if d.seq != NULL and d.adjust_capq_threshold > 10: + q = sam_cap_mapq(b, d.seq, d.seq_len, d.adjust_capq_threshold) + if q < 0: + continue + elif b.core.qual > q: + b.core.qual = q + + if b.core.qual < d.min_mapping_quality: + continue + if d.ignore_orphans and b.core.flag & BAM_FPAIRED and not (b.core.flag & BAM_FPROPER_PAIR): + continue + + break + + return ret + + +cdef class IteratorColumn: + '''abstract base class for iterators over columns. + + IteratorColumn objects wrap the pileup functionality of samtools. + + For reasons of efficiency, the iterator points to the current + pileup buffer. The pileup buffer is updated at every iteration. + This might cause some unexpected behaviour. For example, + consider the conversion to a list:: + + f = AlignmentFile("file.bam", "rb") + result = list(f.pileup()) + + Here, ``result`` will contain ``n`` objects of type + :class:`~pysam.PileupColumn` for ``n`` columns, but each object in + ``result`` will contain the same information. + + The desired behaviour can be achieved by list comprehension:: + + result = [x.pileups() for x in f.pileup()] + + ``result`` will be a list of ``n`` lists of objects of type + :class:`~pysam.PileupRead`. + + If the iterator is associated with a :class:`~pysam.Fastafile` + using the :meth:`add_reference` method, then the iterator will + export the current sequence via the methods :meth:`get_sequence` + and :meth:`seq_len`. + + See :class:`~AlignmentFile.pileup` for kwargs to the iterator. + ''' + + def __cinit__( self, AlignmentFile samfile, **kwargs): + self.samfile = samfile + self.fastafile = kwargs.get("fastafile", None) + self.stepper = kwargs.get("stepper", "samtools") + self.max_depth = kwargs.get("max_depth", 8000) + self.ignore_overlaps = kwargs.get("ignore_overlaps", True) + self.min_base_quality = kwargs.get("min_base_quality", 13) + self.iterdata.seq = NULL + self.iterdata.min_mapping_quality = kwargs.get("min_mapping_quality", 0) + self.iterdata.flag_require = kwargs.get("flag_require", 0) + self.iterdata.flag_filter = kwargs.get("flag_filter", BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP) + self.iterdata.adjust_capq_threshold = kwargs.get("adjust_capq_threshold", 0) + self.iterdata.compute_baq = kwargs.get("compute_baq", True) + self.iterdata.redo_baq = kwargs.get("redo_baq", False) + self.iterdata.ignore_orphans = kwargs.get("ignore_orphans", True) + + self.tid = 0 + self.pos = 0 + self.n_plp = 0 + self.plp = NULL + self.pileup_iter = NULL + + def __iter__(self): + return self + + cdef int cnext(self): + '''perform next iteration. + ''' + # do not release gil here because of call-backs + cdef int ret = bam_mplp_auto(self.pileup_iter, + &self.tid, + &self.pos, + &self.n_plp, + &self.plp) + return ret + + cdef char * get_sequence(self): + '''return current reference sequence underlying the iterator. + ''' + return self.iterdata.seq + + property seq_len: + '''current sequence length.''' + def __get__(self): + return self.iterdata.seq_len + + def add_reference(self, FastaFile fastafile): + ''' + add reference sequences in `fastafile` to iterator.''' + self.fastafile = fastafile + if self.iterdata.seq != NULL: + free(self.iterdata.seq) + self.iterdata.tid = -1 + self.iterdata.fastafile = self.fastafile.fastafile + + def has_reference(self): + ''' + return true if iterator is associated with a reference''' + return self.fastafile + + cdef _setup_iterator(self, + int tid, + int start, + int stop, + int multiple_iterators=0): + '''setup the iterator structure''' + + self.iter = IteratorRowRegion(self.samfile, tid, start, stop, multiple_iterators) + self.iterdata.htsfile = self.samfile.htsfile + self.iterdata.iter = self.iter.iter + self.iterdata.seq = NULL + self.iterdata.tid = -1 + self.iterdata.header = self.samfile.header.ptr + + if self.fastafile is not None: + self.iterdata.fastafile = self.fastafile.fastafile + else: + self.iterdata.fastafile = NULL + + # Free any previously allocated memory before reassigning + # pileup_iter + self._free_pileup_iter() + + cdef void * data[1] + data[0] = &self.iterdata + + if self.stepper is None or self.stepper == "all": + with nogil: + self.pileup_iter = bam_mplp_init(1, + &__advance_all, + data) + elif self.stepper == "nofilter": + with nogil: + self.pileup_iter = bam_mplp_init(1, + &__advance_nofilter, + data) + elif self.stepper == "samtools": + with nogil: + self.pileup_iter = bam_mplp_init(1, + &__advance_samtools, + data) + else: + raise ValueError( + "unknown stepper option `%s` in IteratorColumn" % self.stepper) + + if self.max_depth: + with nogil: + bam_mplp_set_maxcnt(self.pileup_iter, self.max_depth) + + if self.ignore_overlaps: + with nogil: + bam_mplp_init_overlaps(self.pileup_iter) + + cdef _setup_raw_rest_iterator(self): + '''set up an "iterator" that just uses sam_read1(), similar to HTS_IDX_REST''' + + self.iter = None + self.iterdata.iter = NULL + self.iterdata.htsfile = self.samfile.htsfile + self.iterdata.seq = NULL + self.iterdata.tid = -1 + self.iterdata.header = self.samfile.header.ptr + + if self.fastafile is not None: + self.iterdata.fastafile = self.fastafile.fastafile + else: + self.iterdata.fastafile = NULL + + # Free any previously allocated memory before reassigning + # pileup_iter + self._free_pileup_iter() + + cdef void * data[1] + data[0] = &self.iterdata + + if self.stepper is None or self.stepper == "all": + with nogil: + self.pileup_iter = bam_mplp_init(1, + &__advance_raw_all, + data) + elif self.stepper == "nofilter": + with nogil: + self.pileup_iter = bam_mplp_init(1, + &__advance_raw_nofilter, + data) + elif self.stepper == "samtools": + with nogil: + self.pileup_iter = bam_mplp_init(1, + &__advance_samtools, + data) + else: + raise ValueError( + "unknown stepper option `%s` in IteratorColumn" % self.stepper) + + if self.max_depth: + with nogil: + bam_mplp_set_maxcnt(self.pileup_iter, self.max_depth) + + if self.ignore_overlaps: + with nogil: + bam_mplp_init_overlaps(self.pileup_iter) + + cdef reset(self, tid, start, stop): + '''reset iterator position. + + This permits using the iterator multiple times without + having to incur the full set-up costs. + ''' + if self.iter is None: + raise TypeError("Raw iterator set up without region cannot be reset") + + self.iter = IteratorRowRegion(self.samfile, tid, start, stop, multiple_iterators=0) + self.iterdata.iter = self.iter.iter + + # invalidate sequence if different tid + if self.tid != tid: + if self.iterdata.seq != NULL: + free(self.iterdata.seq) + self.iterdata.seq = NULL + self.iterdata.tid = -1 + + # self.pileup_iter = bam_mplp_init(1 + # &__advancepileup, + # &self.iterdata) + with nogil: + bam_mplp_reset(self.pileup_iter) + + cdef _free_pileup_iter(self): + '''free the memory alloc'd by bam_plp_init. + + This is needed before setup_iterator allocates another + pileup_iter, or else memory will be lost. ''' + if self.pileup_iter != NULL: + with nogil: + bam_mplp_reset(self.pileup_iter) + bam_mplp_destroy(self.pileup_iter) + self.pileup_iter = NULL + + def __dealloc__(self): + # reset in order to avoid memory leak messages for iterators + # that have not been fully consumed + self._free_pileup_iter() + self.plp = NULL + + if self.iterdata.seq != NULL: + free(self.iterdata.seq) + self.iterdata.seq = NULL + + # backwards compatibility + + def hasReference(self): + return self.has_reference() + cdef char * getSequence(self): + return self.get_sequence() + def addReference(self, FastaFile fastafile): + return self.add_reference(fastafile) + + +cdef class IteratorColumnRegion(IteratorColumn): + '''iterates over a region only. + ''' + def __cinit__(self, + AlignmentFile samfile, + int tid = 0, + int start = 0, + int stop = MAX_POS, + int truncate = False, + int multiple_iterators = True, + **kwargs ): + + # initialize iterator. Multiple iterators not available + # for CRAM. + if multiple_iterators and samfile.is_cram: + warnings.warn("multiple_iterators not implemented for CRAM") + multiple_iterators = False + + self._setup_iterator(tid, start, stop, multiple_iterators) + self.start = start + self.stop = stop + self.truncate = truncate + + def __next__(self): + + cdef int n + + while 1: + n = self.cnext() + if n < 0: + raise ValueError("error during iteration" ) + + if n == 0: + raise StopIteration + + if self.truncate: + if self.start > self.pos: + continue + if self.pos >= self.stop: + raise StopIteration + + return makePileupColumn(&self.plp, + self.tid, + self.pos, + self.n_plp, + self.min_base_quality, + self.iterdata.seq, + self.samfile.header) + + +cdef class IteratorColumnAllRefs(IteratorColumn): + """iterates over all columns by chaining iterators over each reference + """ + + def __cinit__(self, + AlignmentFile samfile, + **kwargs): + + # no iteration over empty files + if not samfile.nreferences: + raise StopIteration + + # initialize iterator + self._setup_iterator(self.tid, 0, MAX_POS, 1) + + def __next__(self): + + cdef int n + while 1: + n = self.cnext() + if n < 0: + raise ValueError("error during iteration") + + # proceed to next reference or stop + if n == 0: + self.tid += 1 + if self.tid < self.samfile.nreferences: + self._setup_iterator(self.tid, 0, MAX_POS, 0) + else: + raise StopIteration + continue + + # return result, if within same reference + return makePileupColumn(&self.plp, + self.tid, + self.pos, + self.n_plp, + self.min_base_quality, + self.iterdata.seq, + self.samfile.header) + + +cdef class IteratorColumnAll(IteratorColumn): + """iterates over all columns, without using an index + """ + + def __cinit__(self, + AlignmentFile samfile, + **kwargs): + + self._setup_raw_rest_iterator() + + def __next__(self): + + cdef int n + n = self.cnext() + if n < 0: + raise ValueError("error during iteration") + + if n == 0: + raise StopIteration + + return makePileupColumn(&self.plp, + self.tid, + self.pos, + self.n_plp, + self.min_base_quality, + self.iterdata.seq, + self.samfile.header) + + +cdef class SNPCall: + '''the results of a SNP call.''' + cdef int _tid + cdef int _pos + cdef char _reference_base + cdef char _genotype + cdef int _consensus_quality + cdef int _snp_quality + cdef int _rms_mapping_quality + cdef int _coverage + + property tid: + '''the chromosome ID as is defined in the header''' + def __get__(self): + return self._tid + + property pos: + '''nucleotide position of SNP.''' + def __get__(self): return self._pos + + property reference_base: + '''reference base at pos. ``N`` if no reference sequence supplied.''' + def __get__(self): return from_string_and_size( &self._reference_base, 1 ) + + property genotype: + '''the genotype called.''' + def __get__(self): return from_string_and_size( &self._genotype, 1 ) + + property consensus_quality: + '''the genotype quality (Phred-scaled).''' + def __get__(self): return self._consensus_quality + + property snp_quality: + '''the snp quality (Phred scaled) - probability of consensus being + identical to reference sequence.''' + def __get__(self): return self._snp_quality + + property mapping_quality: + '''the root mean square (rms) of the mapping quality of all reads + involved in the call.''' + def __get__(self): return self._rms_mapping_quality + + property coverage: + '''coverage or read depth - the number of reads involved in the call.''' + def __get__(self): return self._coverage + + def __str__(self): + + return "\t".join( map(str, ( + self.tid, + self.pos, + self.reference_base, + self.genotype, + self.consensus_quality, + self.snp_quality, + self.mapping_quality, + self.coverage ) ) ) + + +cdef class IndexedReads: + """Index a Sam/BAM-file by query name while keeping the + original sort order intact. + + The index is kept in memory and can be substantial. + + By default, the file is re-opened to avoid conflicts if multiple + operators work on the same file. Set `multiple_iterators` = False + to not re-open `samfile`. + + Parameters + ---------- + + samfile : AlignmentFile + File to be indexed. + + multiple_iterators : bool + Flag indicating whether the file should be reopened. Reopening prevents + existing iterators being affected by the indexing. + + """ + + def __init__(self, AlignmentFile samfile, int multiple_iterators=True): + cdef char *cfilename + + # makes sure that samfile stays alive as long as this + # object is alive. + self.samfile = samfile + cdef bam_hdr_t * hdr = NULL + assert samfile.is_bam, "can only apply IndexReads on bam files" + + # multiple_iterators the file - note that this makes the iterator + # slow and causes pileup to slow down significantly. + if multiple_iterators: + cfilename = samfile.filename + with nogil: + self.htsfile = hts_open(cfilename, 'r') + if self.htsfile == NULL: + raise OSError("unable to reopen htsfile") + + # need to advance in newly opened file to position after header + # better: use seek/tell? + with nogil: + hdr = sam_hdr_read(self.htsfile) + if hdr == NULL: + raise OSError("unable to read header information") + self.header = makeAlignmentHeader(hdr) + self.owns_samfile = True + else: + self.htsfile = self.samfile.htsfile + self.header = samfile.header + self.owns_samfile = False + + def build(self): + '''build the index.''' + + self.index = collections.defaultdict(list) + + # this method will start indexing from the current file position + cdef int ret = 1 + cdef bam1_t * b = calloc(1, sizeof( bam1_t)) + if b == NULL: + raise MemoryError("could not allocate {} bytes".format(sizeof(bam1_t))) + + cdef uint64_t pos + cdef bam_hdr_t * hdr = self.header.ptr + + while ret > 0: + with nogil: + pos = bgzf_tell(hts_get_bgzfp(self.htsfile)) + ret = sam_read1(self.htsfile, + hdr, + b) + + if ret > 0: + qname = charptr_to_str(pysam_bam_get_qname(b)) + self.index[qname].append(pos) + + bam_destroy1(b) + + def find(self, query_name): + '''find `query_name` in index. + + Returns + ------- + + IteratorRowSelection + Returns an iterator over all reads with query_name. + + Raises + ------ + + KeyError + if the `query_name` is not in the index. + + ''' + if query_name in self.index: + return IteratorRowSelection( + self.samfile, + self.index[query_name], + multiple_iterators = False) + else: + raise KeyError("read %s not found" % query_name) + + def __dealloc__(self): + if self.owns_samfile: + hts_close(self.htsfile) diff --git a/pysam/libcbcf.pxd b/pysam/libcbcf.pxd new file mode 100644 index 0000000..6508994 --- /dev/null +++ b/pysam/libcbcf.pxd @@ -0,0 +1,143 @@ +############################################################################### +############################################################################### +## Cython wrapper for htslib VCF/BCF reader/writer +############################################################################### +# +# The MIT License +# +# Copyright (c) 2015, 2016 Kevin Jacobs (jacobs@bioinformed.com) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +############################################################################### + +from libc.stdint cimport int8_t, int16_t, int32_t, int64_t +from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t +from libc.stdlib cimport malloc, calloc, realloc, free +from libc.string cimport memcpy, memcmp, memmove, strncpy, strlen, strdup + +from pysam.libchtslib cimport * + + +cdef class VariantHeader(object): + cdef bcf_hdr_t *ptr + + cdef _add_sample(self, name) + cdef _hdr_sync(self) + cdef _subset_samples(self, include_samples) + + +cdef class VariantHeaderRecord(object): + cdef readonly VariantHeader header + cdef bcf_hrec_t *ptr + + +cdef class VariantHeaderRecords(object): + cdef readonly VariantHeader header + + +cdef class VariantHeaderContigs(object): + cdef readonly VariantHeader header + + +cdef class VariantHeaderSamples(object): + cdef readonly VariantHeader header + + +cdef class VariantContig(object): + cdef readonly VariantHeader header + cdef int id + + +cdef class VariantMetadata(object): + cdef readonly VariantHeader header + cdef int type + cdef int id + + +cdef class VariantHeaderMetadata(object): + cdef readonly VariantHeader header + cdef int32_t type + + +cdef class VariantRecord(object): + cdef readonly VariantHeader header + cdef bcf1_t *ptr + + +cdef class VariantRecordFilter(object): + cdef VariantRecord record + + +cdef class VariantRecordFormat(object): + cdef VariantRecord record + + +cdef class VariantRecordInfo(object): + cdef VariantRecord record + + +cdef class VariantRecordSamples(object): + cdef VariantRecord record + + +cdef class VariantRecordSample(object): + cdef VariantRecord record + cdef readonly int32_t index + + +cdef class BaseIndex(object): + cdef tuple refs + cdef dict refmap + + +cdef class BCFIndex(BaseIndex): + cdef readonly VariantHeader header + cdef hts_idx_t *ptr + + +cdef class TabixIndex(BaseIndex): + cdef tbx_t *ptr + + +cdef class BaseIterator(object): + cdef VariantFile bcf + cdef hts_itr_t *iter + + +cdef class BCFIterator(BaseIterator): + cdef BCFIndex index + + +cdef class TabixIterator(BaseIterator): + cdef TabixIndex index + cdef kstring_t line_buffer + + +cdef class VariantFile(HTSFile): + cdef readonly VariantHeader header + cdef readonly BaseIndex index + + cdef readonly bint drop_samples # true if sample information is to be ignored + + # FIXME: Temporary, use htsFormat when it is available + cdef readonly bint is_reading # true if file has begun reading records + cdef readonly bint header_written # true if header has already been written + + cpdef int write(self, VariantRecord record) except -1 diff --git a/pysam/libcbcf.pyi b/pysam/libcbcf.pyi new file mode 100644 index 0000000..bb875dd --- /dev/null +++ b/pysam/libcbcf.pyi @@ -0,0 +1,369 @@ +import sys +from typing import ( + Optional, + Union, + Any, + Sequence, + Tuple, + Iterator, + List, + Iterable, + Dict, + overload, + TypeVar, + Mapping, + Generic, +) + +if sys.version_info < (3, 8): + from typing_extensions import Literal +else: + from typing import Literal + +from .libchtslib import HTSFile, _HasFileNo + +_D = TypeVar("_D") +_K = TypeVar("_K", str, Union[int, str]) +_V = TypeVar("_V") + +class _Mapping(Generic[_K, _V]): + def __len__(self) -> int: ... + def __contains__(self, key: _K) -> bool: ... + def __iter__(self) -> Iterator[_K]: ... + def iterkeys(self) -> Iterator[_K]: ... + def itervalues(self) -> Iterator[_V]: ... + def iteritems(self) -> Iterator[Tuple[_K, _V]]: ... + def keys(self) -> List[_K]: ... + def items(self) -> List[Tuple[_K, _V]]: ... + def values(self) -> List[_V]: ... + def __bool__(self) -> bool: ... + def __getitem__(self, key: _K) -> _V: ... + def get(self, key: _K, default: _D = ...) -> Union[_D, _V]: ... + +class VariantHeaderRecord(_Mapping[str, str]): + @property + def header(self) -> VariantHeader: ... + @property + def type(self) -> Optional[str]: ... + @property + def key(self) -> Optional[str]: ... + @property + def value(self) -> Optional[str]: ... + @property + def attrs(self) -> Sequence[Tuple[str, str]]: ... + def update(self, items: Union[Iterable, Dict] = ..., **kwargs) -> None: ... + def pop(self, key: str, default: str = ...) -> str: ... + def remove(self) -> None: ... # crashes + +class VariantHeaderRecords: + @property + def header(self) -> VariantHeader: ... + def __len__(self) -> int: ... + def __bool__(self) -> bool: ... + def __getitem__(self, index) -> VariantHeaderRecord: ... + def __iter__(self) -> Iterator[VariantHeaderRecord]: ... + +class VariantMetadata: + @property + def header(self) -> VariantHeader: ... + @property + def name(self) -> str: ... + # @property # should this be exposed? + # def id(self) -> int: ... + @property + def number(self) -> Optional[str]: ... + @property + def type(self) -> Optional[str]: ... + @property + def description(self) -> Optional[str]: ... + @property + def record(self) -> Optional[VariantHeaderRecord]: ... + def remove_header(self) -> None: ... + +class VariantHeaderMetadata(_Mapping[str, VariantMetadata]): + @property + def header(self) -> VariantHeader: ... + def add( + self, + id: str, + number: Optional[Union[int, str]], + type: Optional[str], + description: str, + **kwargs + ) -> None: ... + def remove_header(self, key: str) -> None: ... + def clear_header(self) -> None: ... + +class VariantContig: + @property + def header(self) -> VariantHeader: ... + @property + def name(self) -> str: ... + @property + def id(self) -> int: ... + @property + def length(self) -> Optional[int]: ... + @property + def header_record(self) -> VariantHeaderRecord: ... + def remove_header(self) -> None: ... + +class VariantHeaderContigs(_Mapping[Union[int, str], VariantContig]): + @property + def header(self) -> VariantHeader: ... + def remove_header(self, key: Union[int, str]) -> None: ... + def clear_header(self) -> None: ... + def add(self, id: str, length: Optional[int] = ..., **kwargs) -> None: ... + +class VariantHeaderSamples: + @property + def header(self) -> VariantHeader: ... + def __len__(self) -> int: ... + def __bool__(self) -> bool: ... + def __getitem__(self, index: int) -> str: ... + def __iter__(self) -> Iterator[str]: ... + def __contains__(self, key: str) -> bool: ... + def add(self, name: str) -> None: ... + +class VariantHeader: + def __init__(self) -> None: ... + def __bool__(self) -> bool: ... + def copy(self) -> VariantHeader: ... + def merge(self, header: VariantHeader) -> None: ... + @property + def version(self) -> str: ... + @property + def samples(self) -> VariantHeaderSamples: ... + @property + def records(self) -> VariantHeaderRecords: ... + @property + def contigs(self) -> VariantHeaderContigs: ... + @property + def filters(self) -> VariantHeaderMetadata: ... + @property + def info(self) -> VariantHeaderMetadata: ... + @property + def formats(self) -> VariantHeaderMetadata: ... + @property + def alts(self) -> Dict[str, VariantHeaderRecord]: ... + def new_record( + self, + contig: Optional[str] = ..., + start: int = ..., + stop: int = ..., + alleles: Optional[Tuple[str, ...]] = ..., + id: Optional[str] = ..., + qual: Optional[int] = ..., + filter: Optional[Any] = ..., + info: Optional[Mapping[str, _InfoValue]] = ..., + samples: Optional[Iterable[Optional[Mapping[str, _FormatValue]]]] = ..., + **kwargs + ) -> VariantRecord: ... + def add_record(self, record: VariantHeaderRecord) -> None: ... + def add_line(self, line: str) -> None: ... + @overload + def add_meta( + self, key: str, value: None = ..., items: Iterable[Tuple[str, str]] = ... + ) -> None: ... + @overload + def add_meta(self, key: str, value: str = ..., items: None = ...) -> None: ... + def add_sample(self, name: str) -> None: ... + def add_samples(self, *args: Union[str, Iterable[str]]) -> None: ... + +class VariantRecordFilter(_Mapping[Union[int, str], VariantMetadata]): + def add(self, key: str) -> None: ... + def __delitem__(self, key: Union[int, str]) -> None: ... + def clear(self) -> None: ... + def __eq__(self, other) -> bool: ... + def __ne__(self, other) -> bool: ... + +class VariantRecordFormat(_Mapping[str, VariantMetadata]): + def __delitem__(self, key: str) -> None: ... + def clear(self) -> None: ... + +_InfoValue = Any # TODO see bcf_info_get_value + +class VariantRecordInfo(_Mapping[str, _InfoValue]): + def __setitem__(self, key: str, object: _InfoValue) -> None: ... + def __delitem__(self, key: str) -> None: ... + def clear(self) -> None: ... + def update( + self, items: Optional[_Mapping[str, _InfoValue]] = ..., **kwargs + ) -> None: ... + def pop(self, key: str, default: _D = ...) -> Union[_D, _InfoValue]: ... + def __eq__(self, other) -> bool: ... + def __ne__(self, other) -> bool: ... + +class VariantRecordSamples(_Mapping[Union[str, int], "VariantRecordSample"]): + def __eq__(self, other) -> bool: ... + def __ne__(self, other) -> bool: ... + # TODO Do these work? Isn’t the container read only? + def update( + self, + items: Optional[Mapping[Union[str, int], VariantRecordSample]] = ..., + **kwargs + ) -> None: ... + def pop( + self, key: Union[str, int], default: _D = ... + ) -> Union[_D, VariantRecordSample]: ... + +class VariantRecord: + @property + def header(self) -> VariantHeader: ... + def copy(self) -> VariantRecord: ... + def translate(self, dst_header: VariantHeader) -> None: ... + rid: int + chrom: str + contig: str + pos: int + start: int + stop: int + rlen: int + qual: Optional[int] + id: Optional[str] + ref: Optional[str] + alleles: Optional[Tuple[str, ...]] + alts: Optional[Tuple[str, ...]] + @property + def filter(self) -> VariantRecordFilter: ... + @property + def info(self) -> VariantRecordInfo: ... + @property + def format(self) -> VariantRecordFormat: ... + @property + def samples(self) -> VariantRecordSamples: ... + def __eq__(self, other) -> bool: ... + def __ne__(self, other) -> bool: ... + +_FormatValue = Any # TODO see bcf_format_get_value + +class VariantRecordSample(_Mapping[str, _FormatValue]): + @property + def index(self) -> int: ... + @property + def name(self) -> str: ... + allele_indices: Optional[Tuple[Optional[int, ...]]] + alleles: Optional[Tuple[Optional[str, ...]]] + phased: bool + def __setitem__(self, key: str, value: _FormatValue) -> None: ... + def __delitem__(self, key: str) -> None: ... + def clear(self) -> None: ... + def update( + self, items: Optional[Mapping[str, _FormatValue]] = ..., **kwargs + ) -> None: ... + def pop(self, key: str, default: _D = ...) -> Union[_D, _FormatValue]: ... + def __eq__(self, other) -> Any: ... + def __ne__(self, other) -> Any: ... + +class BaseIndex(_Mapping[Union[int, str], str]): + refs: Sequence[str] + refmap: Dict[str, str] + def __init__(self) -> None: ... + # TODO Do these work? Isn’t the container read only? + def update(self, items: Optional[Mapping[str, str]] = ..., **kwargs) -> None: ... + def pop(self, key: str, default: _D = ...) -> Union[_D, str]: ... + +class BCFIndex(BaseIndex): + @property + def header(self) -> VariantHeader: ... + def __init__(self) -> None: ... + def fetch( + self, + bcf: VariantFile, + contig: str, + start: Optional[int], + stop: Optional[int], + reopen: bool, + ) -> BCFIterator: ... + +class TabixIndex(BaseIndex): + def __init__(self) -> None: ... + def fetch( + self, + bcf: VariantFile, + contig: str, + start: Optional[int], + stop: Optional[int], + reopen: bool, + ) -> TabixIterator: ... + +class BaseIterator: + def __init__(self) -> None: ... + +class BCFIterator(BaseIterator): + def __init__( + self, + bcf: VariantFile, + contig: str, + start: Optional[int] = ..., + stop: Optional[int] = ..., + reopen: bool = ..., + ) -> None: ... + def __iter__(self) -> BCFIterator: ... + def __next__(self) -> VariantRecord: ... + +class TabixIterator(BaseIterator): + def __init__( + self, + bcf: VariantFile, + contig: str, + start: Optional[int] = ..., + stop: Optional[int] = ..., + reopen: bool = ..., + ) -> None: ... + def __iter__(self) -> TabixIterator: ... + def __next__(self) -> VariantRecord: ... + +class VariantFile(HTSFile): + @property + def header(self) -> VariantHeader: ... + @property + def index(self) -> BaseIndex: ... + @property + def drop_samples(self) -> bool: ... + @property + def is_reading(self) -> bool: ... + @property + def header_written(self) -> bool: ... + def __init__( + self, + filename: Union[str, bytes, int, _HasFileNo], + mode: Optional[Literal["r", "w", "wh", "rb", "wb", "wbu", "wb0"]] = ..., + index_filename: Optional[str] = ..., + header: Optional[VariantHeader] = ..., + drop_samples: bool = ..., + duplicate_filehandle: bool = ..., + ignore_truncation: bool = ..., + threads: int = ..., + ) -> None: ... + def close(self) -> None: ... + def __iter__(self) -> VariantFile: ... + def __next__(self) -> VariantRecord: ... + def copy(self) -> VariantFile: ... + def open( + self, + filename: Union[str, bytes, int, _HasFileNo], + mode: Optional[Literal["r", "w", "wh", "rb", "wb", "wbu", "wb0"]] = ..., + index_filename: Optional[str] = ..., + header: Optional[VariantHeader] = ..., + drop_samples: bool = ..., + duplicate_filehandle: bool = ..., + ignore_truncation: bool = ..., + threads: int = ..., + ) -> None: ... + def reset(self) -> None: ... + def is_valid_tid(self, tid: int) -> bool: ... + def get_tid(self, reference: str) -> int: ... + def get_reference_name(self, tid: int) -> str: ... + def fetch( + self, + contig: Optional[str] = ..., + start: Optional[int] = ..., + stop: Optional[int] = ..., + region: Optional[str] = ..., + reopen: bool = ..., + end: Optional[int] = ..., + reference: Optional[str] = ..., + ) -> Iterator[VariantRecord]: ... + def new_record(self, *args, **kwargs) -> Any: ... + def write(self, record: VariantRecord) -> int: ... + def subset_samples(self, include_samples: Iterable[str]) -> None: ... diff --git a/pysam/libcbcf.pyx b/pysam/libcbcf.pyx new file mode 100644 index 0000000..c3cf8cf --- /dev/null +++ b/pysam/libcbcf.pyx @@ -0,0 +1,4544 @@ +# cython: embedsignature=True +# cython: profile=True +############################################################################### +############################################################################### +## Cython wrapper for htslib VCF/BCF reader/writer +############################################################################### +# +# NOTICE: This code is incomplete and preliminary. It offers a nearly +# complete Pythonic interface to VCF/BCF metadata and data with +# reading and writing capability. Documentation and a unit test suite +# are in the works. The code is best tested under Python 2, but +# should also work with Python 3. Please report any remaining +# str/bytes issues on the github site when using Python 3 and I'll +# fix them promptly. +# +# Here is a minimal example of how to use the API: +# +# $ cat bcfview.py +# import sys +# from pysam import VariantFile +# +# bcf_in = VariantFile(sys.argv[1]) # auto-detect input format +# bcf_out = VariantFile('-', 'w', header=bcf_in.header) +# +# for rec in bcf_in: +# bcf_out.write(rec) +# +# Performance is fairly close to that of bcftools view. Here is an example +# using some 1k Genomes data: +# +# $ time python bcfview.py ALL.chr22.phase3_shapeit2_mvncall_integrated_v5.20130502.genotypes.bcf |wc -l +# 1103799 +# +# real 0m56.114s +# user 1m4.489s +# sys 0m3.102s +# +# $ time bcftools view ALL.chr22.phase3_shapeit2_mvncall_integrated_v5.20130502.genotypes.bcf |wc -l +# 1103800 # bcftools adds an extra header +# +# real 0m55.126s +# user 1m3.502s +# sys 0m3.459s +# +############################################################################### +# +# TODO list: +# +# * more genotype methods +# * unit test suite (perhaps py.test based) +# * documentation +# * pickle support +# * left/right locus normalization +# * fix reopen to re-use fd +# +############################################################################### +# +# The MIT License +# +# Copyright (c) 2015,2016 Kevin Jacobs (jacobs@bioinformed.com) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +############################################################################### + +from __future__ import division, print_function + +import os +import sys + +from libc.errno cimport errno, EPIPE +from libc.string cimport strcmp, strpbrk, strerror +from libc.stdint cimport INT8_MAX, INT16_MAX, INT32_MAX + +cimport cython + +from cpython.object cimport PyObject +from cpython.ref cimport Py_INCREF +from cpython.dict cimport PyDict_GetItemString, PyDict_SetItemString +from cpython.tuple cimport PyTuple_New, PyTuple_SET_ITEM +from cpython.bytes cimport PyBytes_FromStringAndSize +from cpython.unicode cimport PyUnicode_DecodeUTF8 +from cpython.version cimport PY_MAJOR_VERSION + +from pysam.libchtslib cimport HTSFile, hisremote + +from pysam.utils import unquoted_str + + +__all__ = ['VariantFile', + 'VariantHeader', + 'VariantHeaderRecord', + 'VariantHeaderRecords', + 'VariantMetadata', + 'VariantHeaderMetadata', + 'VariantContig', + 'VariantHeaderContigs', + 'VariantHeaderSamples', + 'VariantRecordFilter', + 'VariantRecordFormat', + 'VariantRecordInfo', + 'VariantRecordSamples', + 'VariantRecord', + 'VariantRecordSample', + 'BaseIndex', + 'BCFIndex', + 'TabixIndex', + 'BaseIterator', + 'BCFIterator', + 'TabixIterator', + 'VariantRecord'] + +######################################################################## +######################################################################## +## Constants +######################################################################## + +cdef int MAX_POS = (1 << 31) - 1 +cdef tuple VALUE_TYPES = ('Flag', 'Integer', 'Float', 'String') +cdef tuple METADATA_TYPES = ('FILTER', 'INFO', 'FORMAT', 'CONTIG', 'STRUCTURED', 'GENERIC') +cdef tuple METADATA_LENGTHS = ('FIXED', 'VARIABLE', 'A', 'G', 'R') + + +######################################################################## +######################################################################## +## Python 3 compatibility functions +######################################################################## + +from pysam.libcutils cimport force_bytes, force_str, charptr_to_str, charptr_to_str_w_len +from pysam.libcutils cimport encode_filename, from_string_and_size, decode_bytes + + +######################################################################## +######################################################################## +## Sentinel object +######################################################################## + +cdef object _nothing = object() + +######################################################################## +######################################################################## +## VCF/BCF string intern system +######################################################################## + +cdef dict bcf_str_cache = {} + +cdef inline bcf_str_cache_get_charptr(const char* s): + if s == NULL: + return None + + cdef PyObject *pystr = PyDict_GetItemString(bcf_str_cache, s) + if pystr: + return pystr + + if PY_MAJOR_VERSION < 3: + val = s + else: + val = PyUnicode_DecodeUTF8(s, strlen(s), NULL) + + PyDict_SetItemString(bcf_str_cache, s, val) + + return val + + +######################################################################## +######################################################################## +## Genotype math +######################################################################## + +cdef int comb(int n, int k) except -1: + """Return binomial coefficient: n choose k + + >>> comb(5, 1) + 5 + >>> comb(5, 2) + 10 + >>> comb(2, 2) + 1 + >>> comb(100, 2) + 4950 + """ + if k > n: + return 0 + elif k == n: + return 1 + elif k > n // 2: + k = n - k + + cdef d, result + + d = result = n - k + 1 + for i in range(2, k + 1): + d += 1 + result *= d + result //= i + return result + + +cdef inline int bcf_geno_combinations(int ploidy, int alleles) except -1: + """Return the count of genotypes expected for the given ploidy and number of alleles. + + >>> bcf_geno_combinations(1, 2) + 2 + >>> bcf_geno_combinations(2, 2) + 3 + >>> bcf_geno_combinations(2, 3) + 6 + >>> bcf_geno_combinations(3, 2) + 4 + """ + return comb(alleles + ploidy - 1, ploidy) + + +######################################################################## +######################################################################## +## Low level type conversion helpers +######################################################################## + + +cdef inline bint check_header_id(bcf_hdr_t *hdr, int hl_type, int id): + return id >= 0 and id < hdr.n[BCF_DT_ID] and bcf_hdr_idinfo_exists(hdr, hl_type, id) + + +cdef inline int is_gt_fmt(bcf_hdr_t *hdr, int fmt_id): + return strcmp(bcf_hdr_int2id(hdr, BCF_DT_ID, fmt_id), 'GT') == 0 + + +cdef inline int bcf_genotype_count(bcf_hdr_t *hdr, bcf1_t *rec, int sample) except -1: + + if sample < 0: + raise ValueError('genotype is only valid as a format field') + + cdef int32_t *gt_arr = NULL + cdef int ngt = 0 + ngt = bcf_get_genotypes(hdr, rec, >_arr, &ngt) + + if ngt <= 0 or not gt_arr: + return 0 + + assert ngt % rec.n_sample == 0 + cdef int max_ploidy = ngt // rec.n_sample + cdef int32_t *gt = gt_arr + sample * max_ploidy + cdef int ploidy = 0 + + while ploidy < max_ploidy and gt[0] != bcf_int32_vector_end: + gt += 1 + ploidy += 1 + + free(gt_arr) + + return bcf_geno_combinations(ploidy, rec.n_allele) + + +cdef tuple char_array_to_tuple(const char **a, ssize_t n, int free_after=0): + if not a: + return None + try: + return tuple(charptr_to_str(a[i]) for i in range(n)) + finally: + if free_after and a: + free(a) + + +cdef bcf_array_to_object(void *data, int type, ssize_t n, ssize_t count, int scalar): + cdef char *datac + cdef int8_t *data8 + cdef int16_t *data16 + cdef int32_t *data32 + cdef float *dataf + cdef int i + cdef bytes b + + if not data or n <= 0: + return None + + if type == BCF_BT_CHAR: + datac = data + + if not n: + value = () + else: + # Check if at least one null terminator is present + if datac[n-1] == bcf_str_vector_end: + # If so, create a string up to the first null terminator + b = datac + else: + # Otherwise, copy the entire block + b = datac[:n] + value = tuple(decode_bytes(v, 'utf-8') if v and v != bcf_str_missing else None for v in b.split(b',')) + else: + value = [] + if type == BCF_BT_INT8: + data8 = data + for i in range(n): + if data8[i] == bcf_int8_vector_end: + break + value.append(data8[i] if data8[i] != bcf_int8_missing else None) + elif type == BCF_BT_INT16: + data16 = data + for i in range(n): + if data16[i] == bcf_int16_vector_end: + break + value.append(data16[i] if data16[i] != bcf_int16_missing else None) + elif type == BCF_BT_INT32: + data32 = data + for i in range(n): + if data32[i] == bcf_int32_vector_end: + break + value.append(data32[i] if data32[i] != bcf_int32_missing else None) + elif type == BCF_BT_FLOAT: + dataf = data + for i in range(n): + if bcf_float_is_vector_end(dataf[i]): + break + value.append(dataf[i] if not bcf_float_is_missing(dataf[i]) else None) + else: + raise TypeError('unsupported info type code') + + # FIXME: Need to know length? Report errors? Pad with missing values? Not clear what to do. + if not value: + if scalar: + value = None + elif count <= 0: + value = () + else: + value = (None,)*count + elif scalar and len(value) == 1: + value = value[0] + else: + value = tuple(value) + + return value + + +cdef bcf_object_to_array(values, void *data, int bt_type, ssize_t n, int vlen): + cdef char *datac + cdef int8_t *data8 + cdef int16_t *data16 + cdef int32_t *data32 + cdef float *dataf + cdef ssize_t i, value_count = len(values) + + assert value_count <= n + + if bt_type == BCF_BT_CHAR: + if not isinstance(values, (str, bytes)): + values = b','.join(force_bytes(v) if v else bcf_str_missing for v in values) + value_count = len(values) + assert value_count <= n + datac = data + memcpy(datac, values, value_count) + for i in range(value_count, n): + datac[i] = 0 + elif bt_type == BCF_BT_INT8: + datai8 = data + for i in range(value_count): + val = values[i] + datai8[i] = val if val is not None else bcf_int8_missing + for i in range(value_count, n): + datai8[i] = bcf_int8_vector_end + elif bt_type == BCF_BT_INT16: + datai16 = data + for i in range(value_count): + val = values[i] + datai16[i] = val if val is not None else bcf_int16_missing + for i in range(value_count, n): + datai16[i] = bcf_int16_vector_end + elif bt_type == BCF_BT_INT32: + datai32 = data + for i in range(value_count): + val = values[i] + datai32[i] = val if val is not None else bcf_int32_missing + for i in range(value_count, n): + datai32[i] = bcf_int32_vector_end + elif bt_type == BCF_BT_FLOAT: + dataf = data + for i in range(value_count): + val = values[i] + if val is None: + bcf_float_set(dataf + i, bcf_float_missing) + else: + dataf[i] = val + for i in range(value_count, n): + bcf_float_set(dataf + i, bcf_float_vector_end) + else: + raise TypeError('unsupported type') + + +cdef bcf_empty_array(int type, ssize_t n, int vlen): + cdef char *datac + cdef int32_t *data32 + cdef float *dataf + cdef int i + + if n <= 0: + raise ValueError('Cannot create empty array') + + if type == BCF_HT_STR: + value = PyBytes_FromStringAndSize(NULL, sizeof(char)*n) + datac = value + for i in range(n): + datac[i] = bcf_str_missing if not vlen else bcf_str_vector_end + elif type == BCF_HT_INT: + value = PyBytes_FromStringAndSize(NULL, sizeof(int32_t)*n) + data32 = value + for i in range(n): + data32[i] = bcf_int32_missing if not vlen else bcf_int32_vector_end + elif type == BCF_HT_REAL: + value = PyBytes_FromStringAndSize(NULL, sizeof(float)*n) + dataf = value + for i in range(n): + bcf_float_set(dataf + i, bcf_float_missing if not vlen else bcf_float_vector_end) + else: + raise TypeError('unsupported header type code') + + return value + + +cdef bcf_copy_expand_array(void *src_data, int src_type, size_t src_values, + void *dst_data, int dst_type, size_t dst_values, + int vlen): + """copy data from src to dest where the size of the elements (src_type/dst_type) differ + as well as the number of elements (src_values/dst_values). + """ + + cdef char *src_datac + cdef char *dst_datac + cdef int8_t *src_datai8 + cdef int16_t *src_datai16 + cdef int32_t *src_datai32 + cdef int32_t *dst_datai + cdef float *src_dataf + cdef float *dst_dataf + cdef ssize_t src_size, dst_size, i, j + cdef int val + + if src_values > dst_values: + raise ValueError('Cannot copy arrays with src_values={} > dst_values={}'.format(src_values, dst_values)) + + if src_type == dst_type == BCF_BT_CHAR: + src_datac = src_data + dst_datac = dst_data + memcpy(dst_datac, src_datac, src_values) + for i in range(src_values, dst_values): + dst_datac[i] = 0 + elif src_type == BCF_BT_INT8 and dst_type == BCF_BT_INT32: + src_datai8 = src_data + dst_datai = dst_data + for i in range(src_values): + val = src_datai8[i] + if val == bcf_int8_missing: + val = bcf_int32_missing + elif val == bcf_int8_vector_end: + val = bcf_int32_vector_end + dst_datai[i] = val + for i in range(src_values, dst_values): + dst_datai[i] = bcf_int32_missing if not vlen else bcf_int32_vector_end + elif src_type == BCF_BT_INT16 and dst_type == BCF_BT_INT32: + src_datai16 = src_data + dst_datai = dst_data + for i in range(src_values): + val = src_datai16[i] + if val == bcf_int16_missing: + val = bcf_int32_missing + elif val == bcf_int16_vector_end: + val = bcf_int32_vector_end + dst_datai[i] = val + for i in range(src_values, dst_values): + dst_datai[i] = bcf_int32_missing if not vlen else bcf_int32_vector_end + elif src_type == BCF_BT_INT32 and dst_type == BCF_BT_INT32: + src_datai32 = src_data + dst_datai = dst_data + for i in range(src_values): + dst_datai[i] = src_datai32[i] + for i in range(src_values, dst_values): + dst_datai[i] = bcf_int32_missing if not vlen else bcf_int32_vector_end + elif src_type == BCF_BT_FLOAT and dst_type == BCF_BT_FLOAT: + src_dataf = src_data + dst_dataf = dst_data + for i in range(src_values): + dst_dataf[i] = src_dataf[i] + for i in range(src_values, dst_values): + bcf_float_set(dst_dataf + i, bcf_float_missing if not vlen else bcf_float_vector_end) + else: + raise TypeError('unsupported types') + + +cdef bcf_get_value_count(VariantRecord record, int hl_type, int id, ssize_t *count, int *scalar, int sample): + if record is None: + raise ValueError('record must not be None') + + cdef bcf_hdr_t *hdr = record.header.ptr + cdef bcf1_t *r = record.ptr + + if not check_header_id(hdr, hl_type, id): + raise ValueError('Invalid header') + + cdef int length = bcf_hdr_id2length(hdr, hl_type, id) + cdef int number = bcf_hdr_id2number(hdr, hl_type, id) + + scalar[0] = 0 + + if hl_type == BCF_HL_FMT and is_gt_fmt(hdr, id): + count[0] = number + elif length == BCF_VL_FIXED: + if number == 1: + scalar[0] = 1 + count[0] = number + elif length == BCF_VL_R: + count[0] = r.n_allele + elif length == BCF_VL_A: + count[0] = r.n_allele - 1 + elif length == BCF_VL_G: + count[0] = bcf_genotype_count(hdr, r, sample) + elif length == BCF_VL_VAR: + count[0] = -1 + else: + raise ValueError('Unknown format length') + + +cdef object bcf_info_get_value(VariantRecord record, const bcf_info_t *z): + if record is None: + raise ValueError('record must not be None') + + cdef bcf_hdr_t *hdr = record.header.ptr + + cdef char *s + cdef ssize_t count + cdef int scalar + + bcf_get_value_count(record, BCF_HL_INFO, z.key, &count, &scalar, -1) + + if z.len == 0: + if bcf_hdr_id2type(hdr, BCF_HL_INFO, z.key) == BCF_HT_FLAG: + value = True + elif scalar: + value = None + else: + value = () + elif z.len == 1: + if z.type == BCF_BT_INT8: + value = z.v1.i if z.v1.i != bcf_int8_missing else None + elif z.type == BCF_BT_INT16: + value = z.v1.i if z.v1.i != bcf_int16_missing else None + elif z.type == BCF_BT_INT32: + value = z.v1.i if z.v1.i != bcf_int32_missing else None + elif z.type == BCF_BT_FLOAT: + value = z.v1.f if not bcf_float_is_missing(z.v1.f) else None + elif z.type == BCF_BT_CHAR: + value = force_str(chr(z.v1.i)) + else: + raise TypeError('unsupported info type code') + + if not scalar and value != (): + value = (value,) + else: + value = bcf_array_to_object(z.vptr, z.type, z.len, count, scalar) + + return value + + +cdef object bcf_check_values(VariantRecord record, value, int sample, + int hl_type, int ht_type, + int id, int bt_type, ssize_t bt_len, + ssize_t *value_count, int *scalar, int *realloc): + + if record is None: + raise ValueError('record must not be None') + + bcf_get_value_count(record, hl_type, id, value_count, scalar, sample) + + # Validate values now that we know the type and size + values = (value,) if not isinstance(value, (list, tuple)) else value + + # Validate values now that we know the type and size + if ht_type == BCF_HT_FLAG: + value_count[0] = 1 + elif hl_type == BCF_HL_FMT and is_gt_fmt(record.header.ptr, id): + # KBJ: htslib lies about the cardinality of GT fields-- they're really VLEN (-1) + value_count[0] = -1 + + cdef int given = len(values) + if value_count[0] != -1 and value_count[0] != given: + if scalar[0]: + raise TypeError('value expected to be scalar, given len={}'.format(given)) + else: + raise TypeError('values expected to be {}-tuple, given len={}'.format(value_count[0], given)) + + if ht_type == BCF_HT_REAL: + for v in values: + if not(v is None or isinstance(v, (float, int))): + raise TypeError('invalid value for Float format') + elif ht_type == BCF_HT_INT: + for v in values: + if not(v is None or (isinstance(v, (float, int)) and int(v) == v)): + raise TypeError('invalid value for Integer format') + for v in values: + if not(v is None or bcf_int32_missing < v <= INT32_MAX): + raise ValueError('Integer value too small/large to store in VCF/BCF') + elif ht_type == BCF_HT_STR: + values = b','.join(force_bytes(v) if v is not None else b'' for v in values) + elif ht_type == BCF_HT_FLAG: + if values[0] not in (True, False, None, 1, 0): + raise ValueError('Flag values must be: True, False, None, 1, 0') + else: + raise TypeError('unsupported type') + + realloc[0] = 0 + if len(values) <= 1 and hl_type == BCF_HL_INFO: + realloc[0] = 0 + elif len(values) > bt_len: + realloc[0] = 1 + elif bt_type == BCF_BT_INT8: + for v in values: + if v is not None and not(bcf_int8_missing < v <= INT8_MAX): + realloc[0] = 1 + break + elif bt_type == BCF_BT_INT16: + for v in values: + if v is not None and not(bcf_int16_missing < v <= INT16_MAX): + realloc[0] = 1 + break + + return values + + +cdef bcf_encode_alleles(VariantRecord record, values): + if record is None: + raise ValueError('record must not be None') + + cdef bcf1_t *r = record.ptr + cdef int32_t nalleles = r.n_allele + cdef list gt_values = [] + cdef char *s + cdef int i + + if values is None: + return () + + if not isinstance(values, (list, tuple)): + values = (values,) + + for value in values: + if value is None: + gt_values.append(bcf_gt_missing) + elif isinstance(value, (str, bytes)): + bvalue = force_bytes(value) + s = bvalue + for i in range(r.n_allele): + if strcmp(r.d.allele[i], s) != 0: + gt_values.append(bcf_gt_unphased(i)) + break + else: + raise ValueError('Unknown allele') + else: + i = value + if not (0 <= i < nalleles): + raise ValueError('Invalid allele index') + gt_values.append(bcf_gt_unphased(i)) + + return gt_values + + +cdef bcf_info_set_value(VariantRecord record, key, value): + if record is None: + raise ValueError('record must not be None') + + cdef bcf_hdr_t *hdr = record.header.ptr + cdef bcf1_t *r = record.ptr + cdef int info_id, info_type, scalar, dst_type, realloc, vlen = 0 + cdef ssize_t i, value_count, alloc_len, alloc_size, dst_size + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + cdef bcf_info_t *info = bcf_get_info(hdr, r, bkey) + + if info: + info_id = info.key + else: + info_id = bcf_header_get_info_id(hdr, bkey) + + if info_id < 0: + raise KeyError('unknown INFO: {}'.format(key)) + + if not check_header_id(hdr, BCF_HL_INFO, info_id): + raise ValueError('Invalid header') + + info_type = bcf_hdr_id2type(hdr, BCF_HL_INFO, info_id) + values = bcf_check_values(record, value, -1, + BCF_HL_INFO, info_type, info_id, + info.type if info else -1, + info.len if info else -1, + &value_count, &scalar, &realloc) + + if info_type == BCF_HT_FLAG: + if bcf_update_info(hdr, r, bkey, NULL, bool(values[0]), info_type) < 0: + raise ValueError('Unable to update INFO values') + return + + vlen = value_count < 0 + value_count = len(values) + + # DISABLED DUE TO ISSUES WITH THE CRAZY POINTERS + # If we can, write updated values to existing allocated storage + if 0 and info and not realloc: + r.d.shared_dirty |= BCF1_DIRTY_INF + + if value_count == 0: + info.len = 0 + if not info.vptr: + info.vptr = &info.v1.i + + elif value_count == 1: + # FIXME: Check if need to free vptr if info.len > 0? + if info.type == BCF_BT_INT8 or info.type == BCF_BT_INT16 or info.type == BCF_BT_INT32: + bcf_object_to_array(values, &info.v1.i, BCF_BT_INT32, 1, vlen) + elif info.type == BCF_BT_FLOAT: + bcf_object_to_array(values, &info.v1.f, BCF_BT_FLOAT, 1, vlen) + else: + raise TypeError('unsupported info type code') + + info.len = 1 + if not info.vptr: + info.vptr = &info.v1.i + else: + bcf_object_to_array(values, info.vptr, info.type, info.len, vlen) + + return + + alloc_len = max(1, value_count) + if info and info.len > alloc_len: + alloc_len = info.len + + new_values = bcf_empty_array(info_type, alloc_len, vlen) + cdef char *valp = new_values + + if info_type == BCF_HT_INT: + dst_type = BCF_BT_INT32 + elif info_type == BCF_HT_REAL: + dst_type = BCF_BT_FLOAT + elif info_type == BCF_HT_STR: + dst_type = BCF_BT_CHAR + else: + raise ValueError('Unsupported INFO type') + + bcf_object_to_array(values, valp, dst_type, alloc_len, vlen) + + if bcf_update_info(hdr, r, bkey, valp, alloc_len, info_type) < 0: + raise ValueError('Unable to update INFO values') + + +cdef bcf_info_del_value(VariantRecord record, key): + if record is None: + raise ValueError('record must not be None') + + cdef bcf_hdr_t *hdr = record.header.ptr + cdef bcf1_t *r = record.ptr + cdef ssize_t value_count + cdef int scalar + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + cdef bcf_info_t *info = bcf_get_info(hdr, r, bkey) + + if not info: + raise KeyError(key) + + bcf_get_value_count(record, BCF_HL_INFO, info.key, &value_count, &scalar, -1) + + if value_count <= 0: + null_value = () + elif scalar: + null_value = None + else: + null_value = (None,)*value_count + + bcf_info_set_value(record, bkey, null_value) + + +cdef bcf_format_get_value(VariantRecordSample sample, key): + if sample is None: + raise ValueError('sample must not be None') + + cdef bcf_hdr_t *hdr = sample.record.header.ptr + cdef bcf1_t *r = sample.record.ptr + cdef ssize_t count + cdef int scalar + + if bcf_unpack(r, BCF_UN_ALL) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + cdef bcf_fmt_t *fmt = bcf_get_fmt(hdr, r, bkey) + + if not fmt or not fmt.p: + raise KeyError('invalid FORMAT: {}'.format(key)) + + if is_gt_fmt(hdr, fmt.id): + return bcf_format_get_allele_indices(sample) + + bcf_get_value_count(sample.record, BCF_HL_FMT, fmt.id, &count, &scalar, sample.index) + + if fmt.p and fmt.n and fmt.size: + return bcf_array_to_object(fmt.p + sample.index * fmt.size, fmt.type, fmt.n, count, scalar) + elif scalar: + return None + elif count <= 0: + return () + else: + return (None,)*count + + +cdef bcf_format_set_value(VariantRecordSample sample, key, value): + if sample is None: + raise ValueError('sample must not be None') + + if key == 'phased': + sample.phased = bool(value) + return + + cdef bcf_hdr_t *hdr = sample.record.header.ptr + cdef bcf1_t *r = sample.record.ptr + cdef int fmt_id + cdef vdict_t *d + cdef khiter_t k + cdef int fmt_type, scalar, realloc, dst_type, vlen = 0 + cdef ssize_t i, nsamples, value_count, alloc_size, alloc_len, dst_size + + if bcf_unpack(r, BCF_UN_ALL) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + cdef bcf_fmt_t *fmt = bcf_get_fmt(hdr, r, bkey) + + if fmt: + fmt_id = fmt.id + else: + d = hdr.dict[BCF_DT_ID] + k = kh_get_vdict(d, bkey) + + if k == kh_end(d) or kh_val_vdict(d, k).info[BCF_HL_FMT] & 0xF == 0xF: + raise KeyError('unknown format: {}'.format(key)) + + fmt_id = kh_val_vdict(d, k).id + + if not check_header_id(hdr, BCF_HL_FMT, fmt_id): + raise ValueError('Invalid header') + + fmt_type = bcf_hdr_id2type(hdr, BCF_HL_FMT, fmt_id) + + if fmt_type == BCF_HT_FLAG: + raise ValueError('Flag types are not allowed on FORMATs') + + if is_gt_fmt(hdr, fmt_id): + value = bcf_encode_alleles(sample.record, value) + # KBJ: GT field is considered to be a string by the VCF header but BCF represents it as INT. + fmt_type = BCF_HT_INT + + values = bcf_check_values(sample.record, value, sample.index, + BCF_HL_FMT, fmt_type, fmt_id, + fmt.type if fmt else -1, + fmt.n if fmt else -1, + &value_count, &scalar, &realloc) + vlen = value_count < 0 + value_count = len(values) + + # If we can, write updated values to existing allocated storage. + if fmt and not realloc: + r.d.indiv_dirty = 1 + bcf_object_to_array(values, fmt.p + sample.index * fmt.size, fmt.type, fmt.n, vlen) + return + + alloc_len = max(1, value_count) + if fmt and fmt.n > alloc_len: + alloc_len = fmt.n + + nsamples = r.n_sample + new_values = bcf_empty_array(fmt_type, nsamples * alloc_len, vlen) + cdef char *new_values_p = new_values + + if fmt_type == BCF_HT_INT: + dst_type = BCF_BT_INT32 + dst_size = sizeof(int32_t) * alloc_len + elif fmt_type == BCF_HT_REAL: + dst_type = BCF_BT_FLOAT + dst_size = sizeof(float) * alloc_len + elif fmt_type == BCF_HT_STR: + dst_type = BCF_BT_CHAR + dst_size = sizeof(char) * alloc_len + else: + raise ValueError('Unsupported FORMAT type') + + if fmt and nsamples > 1: + for i in range(nsamples): + bcf_copy_expand_array(fmt.p + i * fmt.size, fmt.type, fmt.n, + new_values_p + i * dst_size, dst_type, alloc_len, + vlen) + + bcf_object_to_array(values, new_values_p + sample.index * dst_size, dst_type, alloc_len, vlen) + + if bcf_update_format(hdr, r, bkey, new_values_p, (nsamples * alloc_len), fmt_type) < 0: + raise ValueError('Unable to update format values') + + +cdef bcf_format_del_value(VariantRecordSample sample, key): + if sample is None: + raise ValueError('sample must not be None') + + cdef bcf_hdr_t *hdr = sample.record.header.ptr + cdef bcf1_t *r = sample.record.ptr + cdef ssize_t value_count + cdef int scalar + + if bcf_unpack(r, BCF_UN_ALL) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + cdef bcf_fmt_t *fmt = bcf_get_fmt(hdr, r, bkey) + + if not fmt or not fmt.p: + raise KeyError(key) + + bcf_get_value_count(sample.record, BCF_HL_FMT, fmt.id, &value_count, &scalar, sample.index) + + if value_count <= 0: + null_value = () + elif scalar: + null_value = None + else: + null_value = (None,)*value_count + + bcf_format_set_value(sample, bkey, null_value) + + +cdef bcf_format_get_allele_indices(VariantRecordSample sample): + if sample is None: + raise ValueError('sample must not be None') + + cdef bcf_hdr_t *hdr = sample.record.header.ptr + cdef bcf1_t *r = sample.record.ptr + cdef int32_t n = r.n_sample + + if bcf_unpack(r, BCF_UN_ALL) < 0: + raise ValueError('Error unpacking VariantRecord') + + if sample.index < 0 or sample.index >= n or not r.n_fmt: + return () + + cdef bcf_fmt_t *fmt0 = r.d.fmt + cdef int gt0 = is_gt_fmt(hdr, fmt0.id) + + if not gt0 or not fmt0.n: + return () + + cdef int8_t *data8 + cdef int16_t *data16 + cdef int32_t *data32 + cdef int32_t a, nalleles = r.n_allele + cdef list alleles = [] + + if fmt0.type == BCF_BT_INT8: + data8 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data8[i] == bcf_int8_vector_end: + break + elif data8[i] == bcf_gt_missing: + a = -1 + else: + a = bcf_gt_allele(data8[i]) + alleles.append(a if 0 <= a < nalleles else None) + elif fmt0.type == BCF_BT_INT16: + data16 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data16[i] == bcf_int16_vector_end: + break + elif data16[i] == bcf_gt_missing: + a = -1 + else: + a = bcf_gt_allele(data16[i]) + alleles.append(a if 0 <= a < nalleles else None) + elif fmt0.type == BCF_BT_INT32: + data32 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data32[i] == bcf_int32_vector_end: + break + elif data32[i] == bcf_gt_missing: + a = -1 + else: + a = bcf_gt_allele(data32[i]) + alleles.append(a if 0 <= a < nalleles else None) + + return tuple(alleles) + + +cdef bcf_format_get_alleles(VariantRecordSample sample): + if sample is None: + raise ValueError('sample must not be None') + + cdef bcf_hdr_t *hdr = sample.record.header.ptr + cdef bcf1_t *r = sample.record.ptr + cdef int32_t nsamples = r.n_sample + + if bcf_unpack(r, BCF_UN_ALL) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef int32_t nalleles = r.n_allele + + if sample.index < 0 or sample.index >= nsamples or not r.n_fmt: + return () + + cdef bcf_fmt_t *fmt0 = r.d.fmt + cdef int gt0 = is_gt_fmt(hdr, fmt0.id) + + if not gt0 or not fmt0.n: + return () + + cdef int32_t a + cdef int8_t *data8 + cdef int16_t *data16 + cdef int32_t *data32 + alleles = [] + if fmt0.type == BCF_BT_INT8: + data8 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data8[i] == bcf_int8_vector_end: + break + a = bcf_gt_allele(data8[i]) + alleles.append(charptr_to_str(r.d.allele[a]) if 0 <= a < nalleles else None) + elif fmt0.type == BCF_BT_INT16: + data16 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data16[i] == bcf_int16_vector_end: + break + a = bcf_gt_allele(data16[i]) + alleles.append(charptr_to_str(r.d.allele[a]) if 0 <= a < nalleles else None) + elif fmt0.type == BCF_BT_INT32: + data32 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data32[i] == bcf_int32_vector_end: + break + a = bcf_gt_allele(data32[i]) + alleles.append(charptr_to_str(r.d.allele[a]) if 0 <= a < nalleles else None) + return tuple(alleles) + + +cdef bint bcf_sample_get_phased(VariantRecordSample sample): + if sample is None: + raise ValueError('sample must not be None') + + cdef bcf_hdr_t *hdr = sample.record.header.ptr + cdef bcf1_t *r = sample.record.ptr + cdef int32_t n = r.n_sample + + if bcf_unpack(r, BCF_UN_ALL) < 0: + raise ValueError('Error unpacking VariantRecord') + + if sample.index < 0 or sample.index >= n or not r.n_fmt: + return False + + cdef bcf_fmt_t *fmt0 = r.d.fmt + cdef int gt0 = is_gt_fmt(hdr, fmt0.id) + + if not gt0 or not fmt0.n: + return False + + cdef int8_t *data8 + cdef int16_t *data16 + cdef int32_t *data32 + + cdef bint phased = False + + if fmt0.type == BCF_BT_INT8: + data8 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data8[i] == bcf_int8_vector_end: + break + elif data8[i] == bcf_int8_missing: + continue + elif i and not bcf_gt_is_phased(data8[i]): + return False + else: + phased = True + elif fmt0.type == BCF_BT_INT16: + data16 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data16[i] == bcf_int16_vector_end: + break + elif data16[i] == bcf_int16_missing: + continue + elif i and not bcf_gt_is_phased(data16[i]): + return False + else: + phased = True + elif fmt0.type == BCF_BT_INT32: + data32 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data32[i] == bcf_int32_vector_end: + break + elif data32[i] == bcf_int32_missing: + continue + elif i and not bcf_gt_is_phased(data32[i]): + return False + else: + phased = True + + return phased + + +cdef bcf_sample_set_phased(VariantRecordSample sample, bint phased): + if sample is None: + raise ValueError('sample must not be None') + + cdef bcf_hdr_t *hdr = sample.record.header.ptr + cdef bcf1_t *r = sample.record.ptr + cdef int32_t n = r.n_sample + + if bcf_unpack(r, BCF_UN_ALL) < 0: + raise ValueError('Error unpacking VariantRecord') + + if sample.index < 0 or sample.index >= n or not r.n_fmt: + return + + cdef bcf_fmt_t *fmt0 = r.d.fmt + cdef int gt0 = is_gt_fmt(hdr, fmt0.id) + + if not gt0 or not fmt0.n: + raise ValueError('Cannot set phased before genotype is set') + + cdef int8_t *data8 + cdef int16_t *data16 + cdef int32_t *data32 + + if fmt0.type == BCF_BT_INT8: + data8 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data8[i] == bcf_int8_vector_end: + break + elif data8[i] == bcf_int8_missing: + continue + elif i: + data8[i] = (data8[i] & 0xFE) | phased + elif fmt0.type == BCF_BT_INT16: + data16 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data16[i] == bcf_int16_vector_end: + break + elif data16[i] == bcf_int16_missing: + continue + elif i: + data16[i] = (data16[i] & 0xFFFE) | phased + elif fmt0.type == BCF_BT_INT32: + data32 = (fmt0.p + sample.index * fmt0.size) + for i in range(fmt0.n): + if data32[i] == bcf_int32_vector_end: + break + elif data32[i] == bcf_int32_missing: + continue + elif i: + data32[i] = (data32[i] & 0xFFFFFFFE) | phased + + +cdef inline bcf_sync_end(VariantRecord record): + cdef bcf_hdr_t *hdr = record.header.ptr + cdef bcf_info_t *info + cdef int end_id = bcf_header_get_info_id(record.header.ptr, b'END') + cdef int ref_len + + # allow missing ref when instantiating a new record + if record.ref is not None: + ref_len = len(record.ref) + else: + ref_len = 0 + + # Delete INFO/END if no alleles are present or if rlen is equal to len(ref) + # Always keep END for symbolic alleles + if not has_symbolic_allele(record) and (not record.ptr.n_allele or record.ptr.rlen == ref_len): + # If INFO/END is not defined in the header, it doesn't exist in the record + if end_id >= 0: + info = bcf_get_info(hdr, record.ptr, b'END') + if info and info.vptr: + if bcf_update_info(hdr, record.ptr, b'END', NULL, 0, info.type) < 0: + raise ValueError('Unable to delete END') + else: + # Create END header, if not present + if end_id < 0: + record.header.info.add('END', number=1, type='Integer', description='Stop position of the interval') + + # Update to reflect stop position + bcf_info_set_value(record, b'END', record.ptr.pos + record.ptr.rlen) + + +cdef inline int has_symbolic_allele(VariantRecord record): + """Return index of first symbolic allele. 0 if no symbolic alleles.""" + + for i in range(1, record.ptr.n_allele): + alt = record.ptr.d.allele[i] + if alt[0] == b'<' and alt[len(alt) - 1] == b'>': + return i + + return 0 + + +######################################################################## +######################################################################## +## Variant Header objects +######################################################################## + + +cdef bcf_header_remove_hrec(VariantHeader header, int i): + if header is None: + raise ValueError('header must not be None') + + cdef bcf_hdr_t *hdr = header.ptr + + if i < 0 or i >= hdr.nhrec: + raise ValueError('Invalid header record index') + + cdef bcf_hrec_t *hrec = hdr.hrec[i] + hdr.nhrec -= 1 + + if i < hdr.nhrec: + memmove(&hdr.hrec[i], &hdr.hrec[i+1], (hdr.nhrec-i)*sizeof(bcf_hrec_t*)) + + bcf_hrec_destroy(hrec) + hdr.hrec[hdr.nhrec] = NULL + hdr.dirty = 1 + + +#FIXME: implement a full mapping interface +#FIXME: passing bcf_hrec_t* is not safe, since we cannot control the +# object lifetime. +cdef class VariantHeaderRecord(object): + """header record from a :class:`VariantHeader` object""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + @property + def type(self): + """header type: FILTER, INFO, FORMAT, CONTIG, STRUCTURED, or GENERIC""" + cdef bcf_hrec_t *r = self.ptr + if not r: + return None + return METADATA_TYPES[r.type] + + @property + def key(self): + """header key (the part before '=', in FILTER/INFO/FORMAT/contig/fileformat etc.)""" + cdef bcf_hrec_t *r = self.ptr + return bcf_str_cache_get_charptr(r.key) if r and r.key else None + + @property + def value(self): + """header value. Set only for generic lines, None for FILTER/INFO, etc.""" + cdef bcf_hrec_t *r = self.ptr + return charptr_to_str(r.value) if r and r.value else None + + @property + def attrs(self): + """sequence of additional header attributes""" + cdef bcf_hrec_t *r = self.ptr + if not r: + return () + cdef int i + return tuple((bcf_str_cache_get_charptr(r.keys[i]) if r.keys[i] else None, + charptr_to_str(r.vals[i]) if r.vals[i] else None) + for i in range(r.nkeys)) + + def __len__(self): + cdef bcf_hrec_t *r = self.ptr + return r.nkeys if r else 0 + + def __bool__(self): + cdef bcf_hrec_t *r = self.ptr + return r != NULL and r.nkeys != 0 + + def __getitem__(self, key): + """get attribute value""" + cdef bcf_hrec_t *r = self.ptr + cdef int i + if r: + bkey = force_bytes(key) + for i in range(r.nkeys): + if r.keys[i] and r.keys[i] == bkey: + return charptr_to_str(r.vals[i]) if r.vals[i] else None + raise KeyError('cannot find metadata key') + + def __iter__(self): + cdef bcf_hrec_t *r = self.ptr + if not r: + return + cdef int i + for i in range(r.nkeys): + if r.keys[i]: + yield bcf_str_cache_get_charptr(r.keys[i]) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + try: + self[key] + except KeyError: + return False + else: + return True + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + cdef bcf_hrec_t *r = self.ptr + if not r: + return + cdef int i + for i in range(r.nkeys): + if r.keys[i]: + yield charptr_to_str(r.vals[i]) if r.vals[i] else None + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + cdef bcf_hrec_t *r = self.ptr + if not r: + return + cdef int i + for i in range(r.nkeys): + if r.keys[i]: + yield (bcf_str_cache_get_charptr(r.keys[i]), charptr_to_str(r.vals[i]) if r.vals[i] else None) + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + def update(self, items=None, **kwargs): + """D.update([E, ]**F) -> None. + + Update D from dict/iterable E and F. + """ + for k, v in items.items(): + self[k] = v + + if kwargs: + for k, v in kwargs.items(): + self[k] = v + + def pop(self, key, default=_nothing): + try: + value = self[key] + del self[key] + return value + except KeyError: + if default is not _nothing: + return default + raise + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + #TODO: implement __richcmp__ + + def __str__(self): + cdef bcf_hrec_t *r = self.ptr + + if not r: + raise ValueError('cannot convert deleted record to str') + + cdef kstring_t hrec_str + hrec_str.l = hrec_str.m = 0 + hrec_str.s = NULL + + bcf_hrec_format(r, &hrec_str) + + ret = charptr_to_str_w_len(hrec_str.s, hrec_str.l) + + if hrec_str.m: + free(hrec_str.s) + + return ret + + # FIXME: Not safe -- causes trivial segfaults at the moment + def remove(self): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef bcf_hrec_t *r = self.ptr + if not r: + return + assert r.key + cdef char *key = r.key if r.type == BCF_HL_GEN else r.value + bcf_hdr_remove(hdr, r.type, key) + self.ptr = NULL + + +cdef VariantHeaderRecord makeVariantHeaderRecord(VariantHeader header, bcf_hrec_t *hdr): + if not header: + raise ValueError('invalid VariantHeader') + + if not hdr: + return None + + cdef VariantHeaderRecord record = VariantHeaderRecord.__new__(VariantHeaderRecord) + record.header = header + record.ptr = hdr + + return record + + +cdef class VariantHeaderRecords(object): + """sequence of :class:`VariantHeaderRecord` object from a :class:`VariantHeader` object""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def __len__(self): + return self.header.ptr.nhrec + + def __bool__(self): + return self.header.ptr.nhrec != 0 + + def __getitem__(self, index): + cdef int32_t i = index + if i < 0 or i >= self.header.ptr.nhrec: + raise IndexError('invalid header record index') + return makeVariantHeaderRecord(self.header, self.header.ptr.hrec[i]) + + def __iter__(self): + cdef int32_t i + for i in range(self.header.ptr.nhrec): + yield makeVariantHeaderRecord(self.header, self.header.ptr.hrec[i]) + + __hash__ = None + + +cdef VariantHeaderRecords makeVariantHeaderRecords(VariantHeader header): + if not header: + raise ValueError('invalid VariantHeader') + + cdef VariantHeaderRecords records = VariantHeaderRecords.__new__(VariantHeaderRecords) + records.header = header + return records + + +cdef class VariantMetadata(object): + """filter, info or format metadata record from a :class:`VariantHeader` object""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + @property + def name(self): + """metadata name""" + cdef bcf_hdr_t *hdr = self.header.ptr + return bcf_str_cache_get_charptr(hdr.id[BCF_DT_ID][self.id].key) + + # Q: Should this be exposed? + @property + def id(self): + """metadata internal header id number""" + return self.id + + @property + def number(self): + """metadata number (i.e. cardinality)""" + cdef bcf_hdr_t *hdr = self.header.ptr + + if not check_header_id(hdr, self.type, self.id): + raise ValueError('Invalid header id') + + if self.type == BCF_HL_FLT: + return None + + cdef int l = bcf_hdr_id2length(hdr, self.type, self.id) + if l == BCF_VL_FIXED: + return bcf_hdr_id2number(hdr, self.type, self.id) + elif l == BCF_VL_VAR: + return '.' + else: + return METADATA_LENGTHS[l] + + @property + def type(self): + """metadata value type""" + cdef bcf_hdr_t *hdr = self.header.ptr + if not check_header_id(hdr, self.type, self.id): + raise ValueError('Invalid header id') + + if self.type == BCF_HL_FLT: + return None + return VALUE_TYPES[bcf_hdr_id2type(hdr, self.type, self.id)] + + @property + def description(self): + """metadata description (or None if not set)""" + descr = self.record.get('Description') + if descr: + descr = descr.strip('"') + return force_str(descr) + + @property + def record(self): + """:class:`VariantHeaderRecord` associated with this :class:`VariantMetadata` object""" + cdef bcf_hdr_t *hdr = self.header.ptr + if not check_header_id(hdr, self.type, self.id): + raise ValueError('Invalid header id') + cdef bcf_hrec_t *hrec = hdr.id[BCF_DT_ID][self.id].val.hrec[self.type] + if not hrec: + return None + return makeVariantHeaderRecord(self.header, hrec) + + def remove_header(self): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef const char *key = hdr.id[BCF_DT_ID][self.id].key + bcf_hdr_remove(hdr, self.type, key) + + +cdef VariantMetadata makeVariantMetadata(VariantHeader header, int type, int id): + if not header: + raise ValueError('invalid VariantHeader') + + if type != BCF_HL_FLT and type != BCF_HL_INFO and type != BCF_HL_FMT: + raise ValueError('invalid metadata type') + + if id < 0 or id >= header.ptr.n[BCF_DT_ID]: + raise ValueError('invalid metadata id') + + cdef VariantMetadata meta = VariantMetadata.__new__(VariantMetadata) + meta.header = header + meta.type = type + meta.id = id + + return meta + + +cdef class VariantHeaderMetadata(object): + """mapping from filter, info or format name to :class:`VariantMetadata` object""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def add(self, id, number, type, description, **kwargs): + """Add a new filter, info or format record""" + if id in self: + raise ValueError('Header already exists for id={}'.format(id)) + + if self.type == BCF_HL_FLT: + if number is not None: + raise ValueError('Number must be None when adding a filter') + if type is not None: + raise ValueError('Type must be None when adding a filter') + + items = [('ID', unquoted_str(id)), ('Description', description)] + else: + if type not in VALUE_TYPES: + raise ValueError('unknown type specified: {}'.format(type)) + if number is None: + number = '.' + + items = [('ID', unquoted_str(id)), + ('Number', unquoted_str(number)), + ('Type', unquoted_str(type)), + ('Description', description)] + + items += kwargs.items() + self.header.add_meta(METADATA_TYPES[self.type], items=items) + + def __len__(self): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef bcf_idpair_t *idpair + cdef int32_t i, n = 0 + + for i in range(hdr.n[BCF_DT_ID]): + idpair = hdr.id[BCF_DT_ID] + i + if idpair.key and idpair.val and idpair.val.info[self.type] & 0xF != 0xF: + n += 1 + return n + + def __bool__(self): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef bcf_idpair_t *idpair + cdef int32_t i + + for i in range(hdr.n[BCF_DT_ID]): + idpair = hdr.id[BCF_DT_ID] + i + if idpair.key and idpair.val and idpair.val.info[self.type] & 0xF != 0xF: + return True + return False + + def __getitem__(self, key): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef vdict_t *d = hdr.dict[BCF_DT_ID] + + cdef bytes bkey = force_bytes(key) + cdef khiter_t k = kh_get_vdict(d, bkey) + + if k == kh_end(d) or kh_val_vdict(d, k).info[self.type] & 0xF == 0xF: + raise KeyError('invalid key: {}'.format(key)) + + return makeVariantMetadata(self.header, self.type, kh_val_vdict(d, k).id) + + def remove_header(self, key): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef vdict_t *d = hdr.dict[BCF_DT_ID] + + cdef bytes bkey = force_bytes(key) + cdef khiter_t k = kh_get_vdict(d, bkey) + + if k == kh_end(d) or kh_val_vdict(d, k).info[self.type] & 0xF == 0xF: + raise KeyError('invalid key: {}'.format(key)) + + bcf_hdr_remove(hdr, self.type, bkey) + #bcf_hdr_sync(hdr) + + def clear_header(self): + cdef bcf_hdr_t *hdr = self.header.ptr + bcf_hdr_remove(hdr, self.type, NULL) + #bcf_hdr_sync(hdr) + + def __iter__(self): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef bcf_idpair_t *idpair + cdef int32_t i + + for i in range(hdr.n[BCF_DT_ID]): + idpair = hdr.id[BCF_DT_ID] + i + if idpair.key and idpair.val and idpair.val.info[self.type] & 0xF != 0xF: + yield bcf_str_cache_get_charptr(idpair.key) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + try: + self[key] + except KeyError: + return False + else: + return True + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + for key in self: + yield self[key] + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + for key in self: + yield (key, self[key]) + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + #TODO: implement __richcmp__ + + +cdef VariantHeaderMetadata makeVariantHeaderMetadata(VariantHeader header, int32_t type): + if not header: + raise ValueError('invalid VariantHeader') + + cdef VariantHeaderMetadata meta = VariantHeaderMetadata.__new__(VariantHeaderMetadata) + meta.header = header + meta.type = type + + return meta + + +cdef class VariantContig(object): + """contig metadata from a :class:`VariantHeader`""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + @property + def name(self): + """contig name""" + cdef bcf_hdr_t *hdr = self.header.ptr + return bcf_str_cache_get_charptr(hdr.id[BCF_DT_CTG][self.id].key) + + @property + def id(self): + """contig internal id number""" + return self.id + + @property + def length(self): + """contig length or None if not available""" + cdef bcf_hdr_t *hdr = self.header.ptr + cdef uint32_t length = hdr.id[BCF_DT_CTG][self.id].val.info[0] + return length if length else None + + @property + def header_record(self): + """:class:`VariantHeaderRecord` associated with this :class:`VariantContig` object""" + cdef bcf_hdr_t *hdr = self.header.ptr + cdef bcf_hrec_t *hrec = hdr.id[BCF_DT_CTG][self.id].val.hrec[0] + return makeVariantHeaderRecord(self.header, hrec) + + def remove_header(self): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef const char *key = hdr.id[BCF_DT_CTG][self.id].key + bcf_hdr_remove(hdr, BCF_HL_CTG, key) + + +cdef VariantContig makeVariantContig(VariantHeader header, int id): + if not header: + raise ValueError('invalid VariantHeader') + + if id < 0 or id >= header.ptr.n[BCF_DT_CTG]: + raise ValueError('invalid contig id') + + cdef VariantContig contig = VariantContig.__new__(VariantContig) + contig.header = header + contig.id = id + + return contig + + +cdef class VariantHeaderContigs(object): + """mapping from contig name or index to :class:`VariantContig` object.""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def __len__(self): + cdef bcf_hdr_t *hdr = self.header.ptr + assert kh_size(hdr.dict[BCF_DT_CTG]) == hdr.n[BCF_DT_CTG] + return hdr.n[BCF_DT_CTG] + + def __bool__(self): + cdef bcf_hdr_t *hdr = self.header.ptr + assert kh_size(hdr.dict[BCF_DT_CTG]) == hdr.n[BCF_DT_CTG] + return hdr.n[BCF_DT_CTG] != 0 + + def __getitem__(self, key): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int index + + if isinstance(key, int): + index = key + if index < 0 or index >= hdr.n[BCF_DT_CTG]: + raise IndexError('invalid contig index') + return makeVariantContig(self.header, index) + + cdef vdict_t *d = hdr.dict[BCF_DT_CTG] + cdef bytes bkey = force_bytes(key) + cdef khiter_t k = kh_get_vdict(d, bkey) + + if k == kh_end(d): + raise KeyError('invalid contig: {}'.format(key)) + + cdef int id = kh_val_vdict(d, k).id + + return makeVariantContig(self.header, id) + + def remove_header(self, key): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int index + cdef const char *ckey + cdef vdict_t *d + cdef khiter_t k + + if isinstance(key, int): + index = key + if index < 0 or index >= hdr.n[BCF_DT_CTG]: + raise IndexError('invalid contig index') + ckey = hdr.id[BCF_DT_CTG][self.id].key + else: + d = hdr.dict[BCF_DT_CTG] + key = force_bytes(key) + if kh_get_vdict(d, key) == kh_end(d): + raise KeyError('invalid contig: {}'.format(key)) + ckey = key + + bcf_hdr_remove(hdr, BCF_HL_CTG, ckey) + + def clear_header(self): + cdef bcf_hdr_t *hdr = self.header.ptr + bcf_hdr_remove(hdr, BCF_HL_CTG, NULL) + #bcf_hdr_sync(hdr) + + def __iter__(self): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef vdict_t *d = hdr.dict[BCF_DT_CTG] + cdef uint32_t n = kh_size(d) + + assert n == hdr.n[BCF_DT_CTG] + + for i in range(n): + yield bcf_str_cache_get_charptr(bcf_hdr_id2name(hdr, i)) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + try: + self[key] + except KeyError: + return False + else: + return True + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + for key in self: + yield self[key] + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + for key in self: + yield (key, self[key]) + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + #TODO: implement __richcmp__ + + def add(self, id, length=None, **kwargs): + """Add a new contig record""" + if id in self: + raise ValueError('Header already exists for contig {}'.format(id)) + + items = [('ID', unquoted_str(id))] + if length is not None: + items.append(("length", unquoted_str(length))) + items += kwargs.items() + self.header.add_meta('contig', items=items) + + +cdef VariantHeaderContigs makeVariantHeaderContigs(VariantHeader header): + if not header: + raise ValueError('invalid VariantHeader') + + cdef VariantHeaderContigs contigs = VariantHeaderContigs.__new__(VariantHeaderContigs) + contigs.header = header + + return contigs + + +cdef class VariantHeaderSamples(object): + """sequence of sample names from a :class:`VariantHeader` object""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def __len__(self): + return bcf_hdr_nsamples(self.header.ptr) + + def __bool__(self): + return bcf_hdr_nsamples(self.header.ptr) != 0 + + def __getitem__(self, index): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int32_t n = bcf_hdr_nsamples(hdr) + cdef int32_t i = index + + if i < 0 or i >= n: + raise IndexError('invalid sample index') + + return charptr_to_str(hdr.samples[i]) + + def __iter__(self): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int32_t i, n = bcf_hdr_nsamples(hdr) + + for i in range(n): + yield charptr_to_str(hdr.samples[i]) + + def __contains__(self, key): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef vdict_t *d = hdr.dict[BCF_DT_SAMPLE] + cdef bytes bkey = force_bytes(key) + cdef khiter_t k = kh_get_vdict(d, bkey) + + return k != kh_end(d) + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + #TODO: implement __richcmp__ + + def add(self, name): + """Add a new sample""" + self.header.add_sample(name) + + +cdef VariantHeaderSamples makeVariantHeaderSamples(VariantHeader header): + if not header: + raise ValueError('invalid VariantHeader') + + cdef VariantHeaderSamples samples = VariantHeaderSamples.__new__(VariantHeaderSamples) + samples.header = header + + return samples + + +cdef class VariantHeader(object): + """header information for a :class:`VariantFile` object""" + #FIXME: Add structured proxy + #FIXME: Add generic proxy + #FIXME: Add mutable methods + + # See makeVariantHeader for C constructor + def __cinit__(self): + self.ptr = NULL + + # Python constructor + def __init__(self): + self.ptr = bcf_hdr_init(b'w') + if not self.ptr: + raise ValueError('cannot create VariantHeader') + + def __dealloc__(self): + if self.ptr: + bcf_hdr_destroy(self.ptr) + self.ptr = NULL + + def __bool__(self): + return self.ptr != NULL + + def copy(self): + return makeVariantHeader(bcf_hdr_dup(self.ptr)) + + def merge(self, VariantHeader header): + if header is None: + raise ValueError('header must not be None') + bcf_hdr_merge(self.ptr, header.ptr) + + @property + def version(self): + """VCF version""" + return force_str(bcf_hdr_get_version(self.ptr)) + + @property + def samples(self): + """samples (:class:`VariantHeaderSamples`)""" + return makeVariantHeaderSamples(self) + + @property + def records(self): + """header records (:class:`VariantHeaderRecords`)""" + return makeVariantHeaderRecords(self) + + @property + def contigs(self): + """contig information (:class:`VariantHeaderContigs`)""" + return makeVariantHeaderContigs(self) + + @property + def filters(self): + """filter metadata (:class:`VariantHeaderMetadata`)""" + return makeVariantHeaderMetadata(self, BCF_HL_FLT) + + @property + def info(self): + """info metadata (:class:`VariantHeaderMetadata`)""" + return makeVariantHeaderMetadata(self, BCF_HL_INFO) + + @property + def formats(self): + """format metadata (:class:`VariantHeaderMetadata`)""" + return makeVariantHeaderMetadata(self, BCF_HL_FMT) + + @property + def alts(self): + """alt metadata (:class:`dict` ID->record). + + The data returned just a snapshot of alt records, is created + every time the property is requested, and modifications will + not be reflected in the header metadata and vice versa. + + i.e. it is just a dict that reflects the state of alt records + at the time it is created. + """ + return {record['ID']:record for record in self.records + if record.key.upper() == 'ALT' } + + # only safe to do when opening an htsfile + cdef _subset_samples(self, include_samples): + keep_samples = set(self.samples) + include_samples = set(include_samples) + missing_samples = include_samples - keep_samples + keep_samples &= include_samples + + if missing_samples: + # FIXME: add specialized exception with payload + raise ValueError( + 'missing {:d} requested samples'.format( + len(missing_samples))) + + keep_samples = force_bytes(','.join(keep_samples)) + cdef char *keep = keep_samples if keep_samples else NULL + cdef ret = bcf_hdr_set_samples(self.ptr, keep, 0) + + if ret != 0: + raise ValueError( + 'bcf_hdr_set_samples failed: ret = {}'.format(ret)) + + def __str__(self): + cdef int hlen + cdef kstring_t line + line.l = line.m = 0 + line.s = NULL + + if bcf_hdr_format(self.ptr, 0, &line) < 0: + if line.m: + free(line.s) + raise ValueError('bcf_hdr_format failed') + + ret = charptr_to_str_w_len(line.s, line.l) + + if line.m: + free(line.s) + return ret + + def new_record(self, contig=None, start=0, stop=0, alleles=None, + id=None, qual=None, filter=None, info=None, samples=None, + **kwargs): + """Create a new empty VariantRecord. + + Arguments are currently experimental. Use with caution and expect + changes in upcoming releases. + + """ + rec = makeVariantRecord(self, bcf_init()) + + if not rec: + raise MemoryError('unable to allocate BCF record') + + rec.ptr.n_sample = bcf_hdr_nsamples(self.ptr) + + if contig is not None: + rec.contig = contig + if alleles is not None: + rec.alleles = alleles + + rec.start = start + rec.stop = stop + rec.id = id + rec.qual = qual + + if filter is not None: + if isinstance(filter, (list, tuple, VariantRecordFilter)): + for f in filter: + rec.filter.add(f) + else: + rec.filter.add(filter) + + if info: + rec.info.update(info) + + if kwargs: + if 'GT' in kwargs: + rec.samples[0]['GT'] = kwargs.pop('GT') + rec.samples[0].update(kwargs) + + if samples: + for i, sample in enumerate(samples): + if 'GT' in sample: + rec.samples[i]['GT'] = sample.pop('GT') + rec.samples[i].update(sample) + + return rec + + def add_record(self, VariantHeaderRecord record): + """Add an existing :class:`VariantHeaderRecord` to this header""" + if record is None: + raise ValueError('record must not be None') + + cdef bcf_hrec_t *hrec = bcf_hrec_dup(record.ptr) + + bcf_hdr_add_hrec(self.ptr, hrec) + + self._hdr_sync() + + def add_line(self, line): + """Add a metadata line to this header""" + bline = force_bytes(line) + if bcf_hdr_append(self.ptr, bline) < 0: + raise ValueError('invalid header line') + + self._hdr_sync() + + + def add_meta(self, key, value=None, items=None): + """Add metadata to this header""" + if not ((value is not None) ^ (items is not None)): + raise ValueError('either value or items must be specified') + + cdef bcf_hrec_t *hrec = calloc(1, sizeof(bcf_hrec_t)) + cdef int quoted + + try: + key = force_bytes(key) + hrec.key = strdup(key) + + if value is not None: + hrec.value = strdup(force_bytes(value)) + else: + for key, value in items: + quoted = not isinstance(value, unquoted_str) and key not in ("ID", "Number", "Type") + + key = force_bytes(key) + bcf_hrec_add_key(hrec, key, len(key)) + + value = force_bytes(str(value)) + bcf_hrec_set_val(hrec, hrec.nkeys-1, value, len(value), quoted) + except: + bcf_hrec_destroy(hrec) + raise + + bcf_hdr_add_hrec(self.ptr, hrec) + + self._hdr_sync() + + cdef _add_sample(self, name): + bname = force_bytes(name) + if bcf_hdr_add_sample(self.ptr, bname) < 0: + raise ValueError('Duplicated sample name: {}'.format(name)) + + cdef _hdr_sync(self): + cdef bcf_hdr_t *hdr = self.ptr + if hdr.dirty: + if bcf_hdr_sync(hdr) < 0: + raise MemoryError('unable to reallocate VariantHeader') + + def add_sample(self, name): + """Add a new sample to this header""" + self._add_sample(name) + self._hdr_sync() + + def add_samples(self, *args): + """Add several new samples to this header. + This function takes multiple arguments, each of which may + be either a sample name or an iterable returning sample names + (e.g., a list of sample names). + """ + for arg in args: + if isinstance(arg, str): + self._add_sample(arg) + else: + for name in arg: + self._add_sample(name) + self._hdr_sync() + + +cdef VariantHeader makeVariantHeader(bcf_hdr_t *hdr): + if not hdr: + raise ValueError('cannot create VariantHeader') + + cdef VariantHeader header = VariantHeader.__new__(VariantHeader) + header.ptr = hdr + + return header + + +cdef inline int bcf_header_get_info_id(bcf_hdr_t *hdr, key) except? -2: + cdef vdict_t *d + cdef khiter_t k + cdef int info_id + + if isinstance(key, str): + key = force_bytes(key) + + d = hdr.dict[BCF_DT_ID] + k = kh_get_vdict(d, key) + + if k == kh_end(d) or kh_val_vdict(d, k).info[BCF_HL_INFO] & 0xF == 0xF: + return -1 + + return kh_val_vdict(d, k).id + + +######################################################################## +######################################################################## +## Variant Record objects +######################################################################## + +cdef class VariantRecordFilter(object): + """Filters set on a :class:`VariantRecord` object, presented as a mapping from + filter index or name to :class:`VariantMetadata` object""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def __len__(self): + return self.record.ptr.d.n_flt + + def __bool__(self): + return self.record.ptr.d.n_flt != 0 + + def __getitem__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int index, id + cdef int n = r.d.n_flt + + if isinstance(key, int): + index = key + + if index < 0 or index >= n: + raise IndexError('invalid filter index') + + id = r.d.flt[index] + else: + if key == '.': + key = 'PASS' + + bkey = force_bytes(key) + id = bcf_hdr_id2int(hdr, BCF_DT_ID, bkey) + + if not check_header_id(hdr, BCF_HL_FLT, id) or not bcf_has_filter(hdr, r, bkey): + raise KeyError('Invalid filter: {}'.format(key)) + + return makeVariantMetadata(self.record.header, BCF_HL_FLT, id) + + def add(self, key): + """Add a new filter""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int id + + if key == '.': + key = 'PASS' + + cdef bytes bkey = force_bytes(key) + id = bcf_hdr_id2int(hdr, BCF_DT_ID, bkey) + + if not check_header_id(hdr, BCF_HL_FLT, id): + raise KeyError('Invalid filter: {}'.format(key)) + + bcf_add_filter(hdr, r, id) + + def __delitem__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int index, id + cdef int n = r.d.n_flt + + if isinstance(key, int): + index = key + + if index < 0 or index >= n: + raise IndexError('invalid filter index') + + id = r.d.flt[index] + else: + if key == '.': + key = 'PASS' + + bkey = force_bytes(key) + id = bcf_hdr_id2int(hdr, BCF_DT_ID, bkey) + + if not check_header_id(hdr, BCF_HL_FLT, id) or not bcf_has_filter(hdr, r, bkey): + raise KeyError('Invalid filter: {}'.format(key)) + + bcf_remove_filter(hdr, r, id, 0) + + def clear(self): + """Clear all filters""" + cdef bcf1_t *r = self.record.ptr + r.d.shared_dirty |= BCF1_DIRTY_FLT + r.d.n_flt = 0 + + def __iter__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int i + + for i in range(r.d.n_flt): + yield bcf_str_cache_get_charptr(bcf_hdr_int2id(hdr, BCF_DT_ID, r.d.flt[i])) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bytes bkey = force_bytes(key) + return bcf_has_filter(hdr, r, bkey) == 1 + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + for key in self: + yield self[key] + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + for key in self: + yield (key, self[key]) + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + def __richcmp__(VariantRecordFilter self not None, VariantRecordFilter other not None, int op): + if op != 2 and op != 3: + return NotImplemented + + cdef bcf1_t *s = self.record.ptr + cdef bcf1_t *o = other.record.ptr + + cdef bint cmp = (s.d.n_flt == o.d.n_flt and list(self) == list(other)) + + if op == 3: + cmp = not cmp + + return cmp + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + #TODO: implement __richcmp__ + + +cdef VariantRecordFilter makeVariantRecordFilter(VariantRecord record): + if not record: + raise ValueError('invalid VariantRecord') + + cdef VariantRecordFilter filter = VariantRecordFilter.__new__(VariantRecordFilter) + filter.record = record + + return filter + + +cdef class VariantRecordFormat(object): + """Format data present for each sample in a :class:`VariantRecord` object, + presented as mapping from format name to :class:`VariantMetadata` object.""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def __len__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int i, n = 0 + + for i in range(r.n_fmt): + if r.d.fmt[i].p: + n += 1 + return n + + def __bool__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int i + + for i in range(r.n_fmt): + if r.d.fmt[i].p: + return True + return False + + def __getitem__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + + cdef bytes bkey = force_bytes(key) + cdef bcf_fmt_t *fmt = bcf_get_fmt(hdr, r, bkey) + + if not fmt or not fmt.p: + raise KeyError('unknown format: {}'.format(key)) + + return makeVariantMetadata(self.record.header, BCF_HL_FMT, fmt.id) + + def __delitem__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + + cdef bytes bkey = force_bytes(key) + cdef bcf_fmt_t *fmt = bcf_get_fmt(hdr, r, bkey) + + if not fmt or not fmt.p: + raise KeyError('unknown format: {}'.format(key)) + + if bcf_update_format(hdr, r, bkey, fmt.p, 0, fmt.type) < 0: + raise ValueError('Unable to delete FORMAT') + + def clear(self): + """Clear all formats for all samples within the associated + :class:`VariantRecord` instance""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_fmt_t *fmt + cdef const char *key + cdef int i + + for i in reversed(range(r.n_fmt)): + fmt = &r.d.fmt[i] + if fmt.p: + key = bcf_hdr_int2id(hdr, BCF_DT_ID, fmt.id) + if bcf_update_format(hdr, r, key, fmt.p, 0, fmt.type) < 0: + raise ValueError('Unable to delete FORMAT') + + def __iter__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_fmt_t *fmt + cdef int i + + for i in range(r.n_fmt): + fmt = &r.d.fmt[i] + if fmt.p: + yield bcf_str_cache_get_charptr(bcf_hdr_int2id(hdr, BCF_DT_ID, fmt.id)) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bytes bkey = force_bytes(key) + cdef bcf_fmt_t *fmt = bcf_get_fmt(hdr, r, bkey) + return fmt != NULL and fmt.p != NULL + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + for key in self: + yield self[key] + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + for key in self: + yield (key, self[key]) + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + #TODO: implement __richcmp__ + + +cdef VariantRecordFormat makeVariantRecordFormat(VariantRecord record): + if not record: + raise ValueError('invalid VariantRecord') + + cdef VariantRecordFormat format = VariantRecordFormat.__new__(VariantRecordFormat) + format.record = record + + return format + + +#TODO: Add a getmeta method to return the corresponding VariantMetadata? +cdef class VariantRecordInfo(object): + """Info data stored in a :class:`VariantRecord` object, presented as a + mapping from info metadata name to value.""" + + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def __len__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_info_t *info + cdef const char *key + cdef int i, count = 0 + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + for i in range(r.n_info): + info = &r.d.info[i] + key = bcf_hdr_int2id(hdr, BCF_DT_ID, info.key) + if info != NULL and info.vptr != NULL and strcmp(key, b'END') != 0: + count += 1 + + return count + + def __bool__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_info_t *info + cdef const char *key + cdef int i + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + for i in range(r.n_info): + info = &r.d.info[i] + key = bcf_hdr_int2id(hdr, BCF_DT_ID, info.key) + if info != NULL and info.vptr != NULL and strcmp(key, b'END') != 0: + return True + + return False + + def __getitem__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + + if strcmp(bkey, b'END') == 0: + raise KeyError('END is a reserved attribute; access is via record.stop') + + cdef bcf_info_t *info = bcf_get_info(hdr, r, bkey) + + # Cannot stop here if info == NULL, since flags must return False + cdef int info_id = bcf_header_get_info_id(hdr, bkey) if not info else info.key + + if info_id < 0: + raise KeyError('Unknown INFO field: {}'.format(key)) + + if not check_header_id(hdr, BCF_HL_INFO, info_id): + raise ValueError('Invalid header') + + # Handle type=Flag values + if bcf_hdr_id2type(hdr, BCF_HL_INFO, info_id) == BCF_HT_FLAG: + return info != NULL and info.vptr != NULL + + if not info or not info.vptr: + raise KeyError('Invalid INFO field: {}'.format(key)) + + return bcf_info_get_value(self.record, info) + + def __setitem__(self, key, value): + cdef bytes bkey = force_bytes(key) + + if strcmp(bkey, b'END') == 0: + raise KeyError('END is a reserved attribute; access is via record.stop') + + if bcf_unpack(self.record.ptr, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + bcf_info_set_value(self.record, key, value) + + def __delitem__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + + cdef bytes bkey = force_bytes(key) + if strcmp(bkey, b'END') == 0: + raise KeyError('END is a reserved attribute; access is via record.stop') + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bcf_info_t *info = bcf_get_info(hdr, r, bkey) + + # Cannot stop here if info == NULL, since flags must return False + cdef int info_id = bcf_header_get_info_id(hdr, bkey) if not info else info.key + + if info_id < 0: + raise KeyError('Unknown INFO field: {}'.format(key)) + + if not check_header_id(hdr, BCF_HL_INFO, info_id): + raise ValueError('Invalid header') + + # Handle flags + if bcf_hdr_id2type(hdr, BCF_HL_INFO, info_id) == BCF_HT_FLAG and (not info or not info.vptr): + return + + if not info or not info.vptr: + raise KeyError('Unknown INFO field: {}'.format(key)) + + if bcf_update_info(hdr, r, bkey, NULL, 0, info.type) < 0: + raise ValueError('Unable to delete INFO') + + def clear(self): + """Clear all info data""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_info_t *info + cdef const char *key + cdef int i + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + for i in range(r.n_info): + info = &r.d.info[i] + if info and info.vptr: + key = bcf_hdr_int2id(hdr, BCF_DT_ID, info.key) + if strcmp(key, b'END') == 0: + continue + if bcf_update_info(hdr, r, key, NULL, 0, info.type) < 0: + raise ValueError('Unable to delete INFO') + + def __iter__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_info_t *info + cdef const char *key + cdef int i + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + for i in range(r.n_info): + info = &r.d.info[i] + if info and info.vptr: + key = bcf_hdr_int2id(hdr, BCF_DT_ID, info.key) + if strcmp(key, b'END') != 0: + yield bcf_str_cache_get_charptr(key) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + + if strcmp(bkey, b'END') == 0: + return default + + cdef bcf_info_t *info = bcf_get_info(hdr, r, bkey) + + # Cannot stop here if info == NULL, since flags must return False + cdef int info_id = bcf_header_get_info_id(hdr, bkey) if not info else info.key + + if not check_header_id(hdr, BCF_HL_INFO, info_id): + raise ValueError('Invalid header') + + # Handle flags + if bcf_hdr_id2type(hdr, BCF_HL_INFO, info_id) == BCF_HT_FLAG: + return info != NULL and info.vptr != NULL + + if not info or not info.vptr: + return default + + return bcf_info_get_value(self.record, info) + + def __contains__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + + if strcmp(bkey, b'END') == 0: + return False + + cdef bcf_info_t *info = bcf_get_info(hdr, r, bkey) + + return info != NULL and info.vptr != NULL + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_info_t *info + cdef const char *key + cdef int i + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + for i in range(r.n_info): + info = &r.d.info[i] + if info and info.vptr: + key = bcf_hdr_int2id(hdr, BCF_DT_ID, info.key) + if strcmp(key, b'END') != 0: + yield bcf_info_get_value(self.record, info) + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_info_t *info + cdef const char *key + cdef int i + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + for i in range(r.n_info): + info = &r.d.info[i] + if info and info.vptr: + key = bcf_hdr_int2id(hdr, BCF_DT_ID, info.key) + if strcmp(key, b'END') != 0: + value = bcf_info_get_value(self.record, info) + yield bcf_str_cache_get_charptr(key), value + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + def update(self, items=None, **kwargs): + """D.update([E, ]**F) -> None. + + Update D from dict/iterable E and F. + """ + for k, v in items.items(): + if k != 'END': + self[k] = v + + if kwargs: + kwargs.pop('END', None) + for k, v in kwargs.items(): + self[k] = v + + def pop(self, key, default=_nothing): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + + if bcf_unpack(r, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + + cdef bytes bkey = force_bytes(key) + cdef bcf_info_t *info = bcf_get_info(hdr, r, bkey) + + # Cannot stop here if info == NULL, since flags must return False + cdef int info_id = bcf_header_get_info_id(hdr, bkey) if not info else info.key + + if info_id < 0: + if default is _nothing: + raise KeyError('Unknown INFO field: {}'.format(key)) + return default + + if not check_header_id(hdr, BCF_HL_INFO, info_id): + raise ValueError('Invalid header') + + # Handle flags + if bcf_hdr_id2type(hdr, BCF_HL_INFO, info_id) == BCF_HT_FLAG and (not info or not info.vptr): + return + + if not info or not info.vptr: + if default is _nothing: + raise KeyError('Unknown INFO field: {}'.format(key)) + return default + + value = bcf_info_get_value(self.record, info) + + if bcf_update_info(hdr, r, bkey, NULL, 0, info.type) < 0: + raise ValueError('Unable to delete INFO') + + return value + + def __richcmp__(VariantRecordInfo self not None, VariantRecordInfo other not None, int op): + if op != 2 and op != 3: + return NotImplemented + + cdef bcf1_t *s = self.record.ptr + cdef bcf1_t *o = other.record.ptr + + # Cannot use n_info as shortcut logic, since null values may remain + cdef bint cmp = dict(self) == dict(other) + + if op == 3: + cmp = not cmp + + return cmp + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + +cdef VariantRecordInfo makeVariantRecordInfo(VariantRecord record): + if not record: + raise ValueError('invalid VariantRecord') + + cdef VariantRecordInfo info = VariantRecordInfo.__new__(VariantRecordInfo) + info.record = record + + return info + + +cdef class VariantRecordSamples(object): + """mapping from sample index or name to :class:`VariantRecordSample` object.""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def __len__(self): + return self.record.ptr.n_sample # bcf_hdr_nsamples(self.record.header.ptr) + + def __bool__(self): + return self.record.ptr.n_sample != 0 # bcf_hdr_nsamples(self.record.header.ptr) != 0 + + def __getitem__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int n = self.record.ptr.n_sample + cdef int sample_index + cdef vdict_t *d + cdef khiter_t k + + if isinstance(key, int): + sample_index = key + else: + bkey = force_bytes(key) + sample_index = bcf_hdr_id2int(hdr, BCF_DT_SAMPLE, bkey) + if sample_index < 0: + raise KeyError('invalid sample name: {}'.format(key)) + + if sample_index < 0 or sample_index >= n: + raise IndexError('invalid sample index') + + return makeVariantRecordSample(self.record, sample_index) + + def __iter__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int32_t i, n = self.record.ptr.n_sample + + for i in range(n): + yield charptr_to_str(hdr.samples[i]) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int n = self.record.ptr.n_sample + cdef int sample_index + cdef vdict_t *d + cdef khiter_t k + + if isinstance(key, int): + sample_index = key + else: + bkey = force_bytes(key) + sample_index = bcf_hdr_id2int(hdr, BCF_DT_SAMPLE, bkey) + if sample_index < 0: + raise KeyError('invalid sample name: {}'.format(key)) + + return 0 <= sample_index < n + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int32_t i, n = self.record.ptr.n_sample + + for i in range(n): + yield makeVariantRecordSample(self.record, i) + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int32_t i, n = self.record.ptr.n_sample + + for i in range(n): + yield (charptr_to_str(hdr.samples[i]), makeVariantRecordSample(self.record, i)) + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + def update(self, items=None, **kwargs): + """D.update([E, ]**F) -> None. + + Update D from dict/iterable E and F. + """ + for k, v in items.items(): + self[k] = v + + if kwargs: + for k, v in kwargs.items(): + self[k] = v + + def pop(self, key, default=_nothing): + try: + value = self[key] + del self[key] + return value + except KeyError: + if default is not _nothing: + return default + raise + + def __richcmp__(VariantRecordSamples self not None, VariantRecordSamples other not None, int op): + if op != 2 and op != 3: + return NotImplemented + + cdef bcf1_t *s = self.record.ptr + cdef bcf1_t *o = other.record.ptr + + cdef bint cmp = (s.n_sample == o.n_sample and self.values() == other.values()) + + if op == 3: + cmp = not cmp + + return cmp + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + +cdef VariantRecordSamples makeVariantRecordSamples(VariantRecord record): + if not record: + raise ValueError('invalid VariantRecord') + + cdef VariantRecordSamples samples = VariantRecordSamples.__new__( + VariantRecordSamples) + samples.record = record + + return samples + + +cdef class VariantRecord(object): + """Variant record""" + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + def __dealloc__(self): + if self.ptr: + bcf_destroy1(self.ptr) + self.ptr = NULL + + def copy(self): + """return a copy of this VariantRecord object""" + return makeVariantRecord(self.header, bcf_dup(self.ptr)) + + def translate(self, VariantHeader dst_header): + if dst_header is None: + raise ValueError('dst_header must not be None') + + cdef bcf_hdr_t *src_hdr = self.header.ptr + cdef bcf_hdr_t *dst_hdr = dst_header.ptr + + if src_hdr != dst_hdr: + if self.ptr.n_sample != bcf_hdr_nsamples(dst_hdr): + msg = 'Cannot translate record. Number of samples does not match header ({} vs {})' + raise ValueError(msg.format(self.ptr.n_sample, bcf_hdr_nsamples(dst_hdr))) + + bcf_translate(dst_hdr, src_hdr, self.ptr) + self.header = dst_header + + @property + def rid(self): + """internal reference id number""" + return self.ptr.rid + + @rid.setter + def rid(self, value): + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int r = value + if r < 0 or r >= hdr.n[BCF_DT_CTG] or not hdr.id[BCF_DT_CTG][r].val: + raise ValueError('invalid reference id') + self.ptr.rid = r + + @property + def chrom(self): + """chromosome/contig name""" + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int rid = self.ptr.rid + if rid < 0 or rid >= hdr.n[BCF_DT_CTG]: + raise ValueError('Invalid header') + return bcf_str_cache_get_charptr(bcf_hdr_id2name(hdr, rid)) + + @chrom.setter + def chrom(self, value): + cdef vdict_t *d = self.header.ptr.dict[BCF_DT_CTG] + bchrom = force_bytes(value) + cdef khint_t k = kh_get_vdict(d, bchrom) + if k == kh_end(d): + raise ValueError('Invalid chromosome/contig') + self.ptr.rid = kh_val_vdict(d, k).id + + @property + def contig(self): + """chromosome/contig name""" + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int rid = self.ptr.rid + if rid < 0 or rid >= hdr.n[BCF_DT_CTG]: + raise ValueError('Invalid header') + return bcf_str_cache_get_charptr(bcf_hdr_id2name(hdr, rid)) + + @contig.setter + def contig(self, value): + cdef vdict_t *d = self.header.ptr.dict[BCF_DT_CTG] + bchrom = force_bytes(value) + cdef khint_t k = kh_get_vdict(d, bchrom) + if k == kh_end(d): + raise ValueError('Invalid chromosome/contig') + self.ptr.rid = kh_val_vdict(d, k).id + + @property + def pos(self): + """record start position on chrom/contig (1-based inclusive)""" + return self.ptr.pos + 1 + + @pos.setter + def pos(self, value): + cdef int p = value + if p < 1: + raise ValueError('Position must be positive') + self.ptr.pos = p - 1 + bcf_sync_end(self) + + @property + def start(self): + """record start position on chrom/contig (0-based inclusive)""" + return self.ptr.pos + + @start.setter + def start(self, value): + cdef int s = value + if s < 0: + raise ValueError('Start coordinate must be non-negative') + self.ptr.pos = s + bcf_sync_end(self) + + @property + def stop(self): + """record stop position on chrom/contig (0-based exclusive)""" + return self.ptr.pos + self.ptr.rlen + + @stop.setter + def stop(self, value): + cdef int s = value + if s < 0: + raise ValueError('Stop coordinate must be non-negative') + self.ptr.rlen = s - self.ptr.pos + bcf_sync_end(self) + + @property + def rlen(self): + """record length on chrom/contig (aka rec.stop - rec.start)""" + return self.ptr.rlen + + @rlen.setter + def rlen(self, value): + cdef int r = value + self.ptr.rlen = r + bcf_sync_end(self) + + @property + def qual(self): + """phred scaled quality score or None if not available""" + return self.ptr.qual if not bcf_float_is_missing(self.ptr.qual) else None + + @qual.setter + def qual(self, value): + if value is not None: + self.ptr.qual = value + else: + bcf_float_set(&self.ptr.qual, bcf_float_missing) + + +# @property +# def n_allele(self): +# return self.ptr.n_allele + +# @property +# def n_sample(self): +# return self.ptr.n_sample + + @property + def id(self): + """record identifier or None if not available""" + cdef bcf1_t *r = self.ptr + if bcf_unpack(r, BCF_UN_STR) < 0: + raise ValueError('Error unpacking VariantRecord') + # causes a memory leak https://github.com/pysam-developers/pysam/issues/773 + # return bcf_str_cache_get_charptr(r.d.id) if r.d.id != b'.' else None + if (r.d.m_id == 0): + raise ValueError('Error extracting ID') + return charptr_to_str(r.d.id) if r.d.id != b'.' else None + + @id.setter + def id(self, value): + cdef bcf1_t *r = self.ptr + if bcf_unpack(r, BCF_UN_STR) < 0: + raise ValueError('Error unpacking VariantRecord') + cdef char *idstr = NULL + if value is not None: + bid = force_bytes(value) + idstr = bid + if bcf_update_id(self.header.ptr, self.ptr, idstr) < 0: + raise ValueError('Error updating id') + + @property + def ref(self): + """reference allele""" + cdef bcf1_t *r = self.ptr + if bcf_unpack(r, BCF_UN_STR) < 0: + raise ValueError('Error unpacking VariantRecord') + return charptr_to_str(r.d.allele[0]) if r.d.allele else None + + @ref.setter + def ref(self, value): + cdef bcf1_t *r = self.ptr + if bcf_unpack(r, BCF_UN_STR) < 0: + raise ValueError('Error unpacking VariantRecord') + #FIXME: Set alleles directly -- this is stupid + if not value: + raise ValueError('ref allele must not be null') + value = force_bytes(value) + if r.d.allele and r.n_allele: + alleles = [r.d.allele[i] for i in range(r.n_allele)] + alleles[0] = value + else: + alleles = [value, ''] + self.alleles = alleles + bcf_sync_end(self) + + @property + def alleles(self): + """tuple of reference allele followed by alt alleles""" + cdef bcf1_t *r = self.ptr + if bcf_unpack(r, BCF_UN_STR) < 0: + raise ValueError('Error unpacking VariantRecord') + if not r.d.allele: + return None + cdef tuple res = PyTuple_New(r.n_allele) + for i in range(r.n_allele): + a = charptr_to_str(r.d.allele[i]) + PyTuple_SET_ITEM(res, i, a) + Py_INCREF(a) + return res + + @alleles.setter + def alleles(self, values): + cdef bcf1_t *r = self.ptr + + # Cache rlen of symbolic alleles before call to bcf_update_alleles_str + cdef int rlen = r.rlen + + if bcf_unpack(r, BCF_UN_STR) < 0: + raise ValueError('Error unpacking VariantRecord') + + values = [force_bytes(v) for v in values] + + if len(values) < 2: + raise ValueError('must set at least 2 alleles') + + if b'' in values: + raise ValueError('cannot set null allele') + + value = b','.join(values) + + if bcf_update_alleles_str(self.header.ptr, r, value) < 0: + raise ValueError('Error updating alleles') + + # Reset rlen if alternate allele isn't symbolic, otherwise used cached + if has_symbolic_allele(self): + self.ptr.rlen = rlen + else: + self.ptr.rlen = len(values[0]) + r.d.var_type = -1 + bcf_sync_end(self) + + @property + def alts(self): + """tuple of alt alleles""" + cdef bcf1_t *r = self.ptr + if bcf_unpack(r, BCF_UN_STR) < 0: + raise ValueError('Error unpacking VariantRecord') + if r.n_allele < 2 or not r.d.allele: + return None + cdef tuple res = PyTuple_New(r.n_allele - 1) + for i in range(1, r.n_allele): + a = charptr_to_str(r.d.allele[i]) + PyTuple_SET_ITEM(res, i - 1, a) + Py_INCREF(a) + return res + + @alts.setter + def alts(self, value): + #FIXME: Set alleles directly -- this is stupid + cdef bcf1_t *r = self.ptr + if bcf_unpack(r, BCF_UN_STR) < 0: + raise ValueError('Error unpacking VariantRecord') + value = [force_bytes(v) for v in value] + if b'' in value: + raise ValueError('cannot set null alt allele') + ref = [r.d.allele[0] if r.d.allele and r.n_allele else b'.'] + self.alleles = ref + value + r.d.var_type = -1 + + @property + def filter(self): + """filter information (see :class:`VariantRecordFilter`)""" + if bcf_unpack(self.ptr, BCF_UN_FLT) < 0: + raise ValueError('Error unpacking VariantRecord') + return makeVariantRecordFilter(self) + + @property + def info(self): + """info data (see :class:`VariantRecordInfo`)""" + if bcf_unpack(self.ptr, BCF_UN_INFO) < 0: + raise ValueError('Error unpacking VariantRecord') + return makeVariantRecordInfo(self) + + @property + def format(self): + """sample format metadata (see :class:`VariantRecordFormat`)""" + if bcf_unpack(self.ptr, BCF_UN_FMT) < 0: + raise ValueError('Error unpacking VariantRecord') + return makeVariantRecordFormat(self) + + @property + def samples(self): + """sample data (see :class:`VariantRecordSamples`)""" + if bcf_unpack(self.ptr, BCF_UN_ALL) < 0: + raise ValueError('Error unpacking VariantRecord') + return makeVariantRecordSamples(self) + + property alleles_variant_types: + def __get__(self): + cdef bcf1_t *r = self.ptr + cdef tuple result = PyTuple_New(r.n_allele) + + for i in range(r.n_allele): + tp = bcf_get_variant_type(r, i) + + if tp == VCF_REF: + v_type = "REF" + elif tp == VCF_SNP: + v_type = "SNP" + elif tp == VCF_MNP: + v_type = "MNP" + elif tp == VCF_INDEL: + v_type = "INDEL" + elif tp == VCF_BND: + v_type = "BND" + elif tp == VCF_OVERLAP: + v_type = "OVERLAP" + else: + v_type = "OTHER" + + PyTuple_SET_ITEM(result, i, v_type) + Py_INCREF(v_type) + + return result + + def __richcmp__(VariantRecord self not None, VariantRecord other not None, int op): + if op != 2 and op != 3: + return NotImplemented + + cdef bcf1_t *s = self.ptr + cdef bcf1_t *o = other.ptr + + cdef bint cmp = self is other or ( + s.pos == o.pos + and s.rlen == o.rlen + and ((bcf_float_is_missing(s.qual) and bcf_float_is_missing(o.qual)) + or s.qual == o.qual) + and s.n_sample == o.n_sample + and s.n_allele == o.n_allele + and self.contig == other.contig + and self.alleles == other.alleles + and self.id == other.id + and self.info == other.info + and self.filter == other.filter + and self.samples == other.samples) + + if op == 3: + cmp = not cmp + + return cmp + + def __str__(self): + cdef kstring_t line + cdef char c + + line.l = line.m = 0 + line.s = NULL + + if vcf_format(self.header.ptr, self.ptr, &line) < 0: + if line.m: + free(line.s) + raise ValueError('vcf_format failed') + + # Strip CR/LF? + #while line.l: + # c = line.s[line.l - 1] + # if c != b'\n' and c != b'\r': + # break + # line.l -= 1 + + ret = charptr_to_str_w_len(line.s, line.l) + + if line.m: + free(line.s) + + return ret + + +cdef VariantRecord makeVariantRecord(VariantHeader header, bcf1_t *r): + if not header: + raise ValueError('invalid VariantHeader') + + if not r: + raise ValueError('cannot create VariantRecord') + + if r.errcode: + msg = [] + #if r.errcode & BCF_ERR_CTG_UNDEF: + # msg.append('undefined contig') + #if r.errcode & BCF_ERR_TAG_UNDEF: + # msg.append('undefined tag') + if r.errcode & BCF_ERR_NCOLS: + msg.append('invalid number of columns') + if r.errcode & BCF_ERR_LIMITS: + msg.append('limits violated') + if r.errcode & BCF_ERR_CHAR: + msg.append('invalid character found') + if r.errcode & BCF_ERR_CTG_INVALID: + msg.append('invalid contig') + if r.errcode & BCF_ERR_TAG_INVALID: + msg.append('invalid tag') + + if msg: + msg = ', '.join(msg) + raise ValueError('Error(s) reading record: {}'.format(msg)) + + cdef VariantRecord record = VariantRecord.__new__(VariantRecord) + record.header = header + record.ptr = r + + return record + + +######################################################################## +######################################################################## +## Variant Sampletype object +######################################################################## + + +cdef class VariantRecordSample(object): + """Data for a single sample from a :class:`VariantRecord` object. + Provides data accessors for genotypes and a mapping interface + from format name to values. + """ + def __init__(self, *args, **kwargs): + raise TypeError('this class cannot be instantiated from Python') + + @property + def name(self): + """sample name""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int32_t n = r.n_sample + + if self.index < 0 or self.index >= n: + raise ValueError('invalid sample index') + + return charptr_to_str(hdr.samples[self.index]) + + @property + def allele_indices(self): + """allele indices for called genotype, if present. Otherwise None""" + return bcf_format_get_allele_indices(self) + + @allele_indices.setter + def allele_indices(self, value): + self['GT'] = value + + @allele_indices.deleter + def allele_indices(self): + self['GT'] = () + + @property + def alleles(self): + """alleles for called genotype, if present. Otherwise None""" + return bcf_format_get_alleles(self) + + @alleles.setter + def alleles(self, value: tuple): + # Sets the genotype, supply a tuple of alleles to set. + # The supplied alleles need to be defined in the correspoding pysam.libcbcf.VariantRecord + # The genotype is reset when an empty tuple, None or (None,) is supplied + + if value==(None,) or value==tuple() or value is None: + self['GT'] = () + return + + if any((type(x) == int for x in value)): + raise ValueError('Use .allele_indices to set integer allele indices') + + # determine and set allele indices: + try: + self['GT'] = tuple( (self.record.alleles.index(allele) for allele in value) ) + except ValueError: + raise ValueError("One or more of the supplied sample alleles are not defined as alleles of the corresponding pysam.libcbcf.VariantRecord." + "First set the .alleles of this record to define the alleles") + + @alleles.deleter + def alleles(self): + self['GT'] = () + + @property + def phased(self): + """False if genotype is missing or any allele is unphased. Otherwise True.""" + return bcf_sample_get_phased(self) + + @phased.setter + def phased(self, value): + bcf_sample_set_phased(self, value) + + def __len__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int i, n = 0 + + if bcf_unpack(r, BCF_UN_FMT) < 0: + raise ValueError('Error unpacking VariantRecord') + + for i in range(r.n_fmt): + if r.d.fmt[i].p: + n += 1 + return n + + def __bool__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef int i + + if bcf_unpack(r, BCF_UN_FMT) < 0: + raise ValueError('Error unpacking VariantRecord') + + for i in range(r.n_fmt): + if r.d.fmt[i].p: + return True + return False + + def __getitem__(self, key): + return bcf_format_get_value(self, key) + + def __setitem__(self, key, value): + bcf_format_set_value(self, key, value) + + def __delitem__(self, key): + bcf_format_del_value(self, key) + + def clear(self): + """Clear all format data (including genotype) for this sample""" + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_fmt_t *fmt + cdef int i + + for i in range(r.n_fmt): + fmt = &r.d.fmt[i] + if fmt.p: + bcf_format_del_value(self, bcf_hdr_int2id(hdr, BCF_DT_ID, fmt.id)) + + def __iter__(self): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bcf_fmt_t *fmt + cdef int i + + for i in range(r.n_fmt): + fmt = &r.d.fmt[i] + if r.d.fmt[i].p: + yield bcf_str_cache_get_charptr(bcf_hdr_int2id(hdr, BCF_DT_ID, fmt.id)) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + cdef bcf_hdr_t *hdr = self.record.header.ptr + cdef bcf1_t *r = self.record.ptr + cdef bytes bkey = force_bytes(key) + cdef bcf_fmt_t *fmt = bcf_get_fmt(hdr, r, bkey) + return fmt != NULL and fmt.p != NULL + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + for key in self: + yield self[key] + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + for key in self: + yield (key, self[key]) + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + def update(self, items=None, **kwargs): + """D.update([E, ]**F) -> None. + + Update D from dict/iterable E and F. + """ + for k, v in items.items(): + self[k] = v + + if kwargs: + for k, v in kwargs.items(): + self[k] = v + + def pop(self, key, default=_nothing): + try: + value = self[key] + del self[key] + return value + except KeyError: + if default is not _nothing: + return default + raise + + def __richcmp__(VariantRecordSample self not None, VariantRecordSample other not None, int op): + if op != 2 and op != 3: + return NotImplemented + + cdef bint cmp = dict(self) == dict(other) + + if op == 3: + cmp = not cmp + + return cmp + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + +cdef VariantRecordSample makeVariantRecordSample(VariantRecord record, int32_t sample_index): + if not record or sample_index < 0: + raise ValueError('cannot create VariantRecordSample') + + cdef VariantRecordSample sample = VariantRecordSample.__new__(VariantRecordSample) + sample.record = record + sample.index = sample_index + + return sample + + +######################################################################## +######################################################################## +## Index objects +######################################################################## + + +cdef class BaseIndex(object): + def __init__(self): + self.refs = () + self.remap = {} + + def __len__(self): + return len(self.refs) + + def __bool__(self): + return len(self.refs) != 0 + + def __getitem__(self, key): + if isinstance(key, int): + return self.refs[key] + else: + return self.refmap[key] + + def __iter__(self): + return iter(self.refs) + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + try: + return self[key] + except KeyError: + return default + + def __contains__(self, key): + try: + self[key] + except KeyError: + return False + else: + return True + + def iterkeys(self): + """D.iterkeys() -> an iterator over the keys of D""" + return iter(self) + + def itervalues(self): + """D.itervalues() -> an iterator over the values of D""" + for key in self: + yield self[key] + + def iteritems(self): + """D.iteritems() -> an iterator over the (key, value) items of D""" + for key in self: + yield (key, self[key]) + + def keys(self): + """D.keys() -> list of D's keys""" + return list(self) + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples""" + return list(self.iteritems()) + + def values(self): + """D.values() -> list of D's values""" + return list(self.itervalues()) + + def update(self, items=None, **kwargs): + """D.update([E, ]**F) -> None. + + Update D from dict/iterable E and F. + """ + for k, v in items.items(): + self[k] = v + + if kwargs: + for k, v in kwargs.items(): + self[k] = v + + def pop(self, key, default=_nothing): + try: + value = self[key] + del self[key] + return value + except KeyError: + if default is not _nothing: + return default + raise + + # Mappings are not hashable by default, but subclasses can change this + __hash__ = None + + #TODO: implement __richcmp__ + + +cdef class BCFIndex(object): + """CSI index data structure for BCF files""" + def __init__(self): + self.refs = () + self.refmap = {} + + if not self.ptr: + raise ValueError('Invalid index object') + + cdef int n + cdef const char **refs = bcf_index_seqnames(self.ptr, self.header.ptr, &n) + + self.refs = char_array_to_tuple(refs, n, free_after=1) if refs else () + self.refmap = { r:i for i,r in enumerate(self.refs) } + + def __dealloc__(self): + if self.ptr: + hts_idx_destroy(self.ptr) + self.ptr = NULL + + def fetch(self, bcf, contig, start, stop, reopen): + return BCFIterator(bcf, contig, start, stop, reopen) + + +cdef BCFIndex makeBCFIndex(VariantHeader header, hts_idx_t *idx): + if not idx: + return None + + if not header: + raise ValueError('invalid VariantHeader') + + cdef BCFIndex index = BCFIndex.__new__(BCFIndex) + index.header = header + index.ptr = idx + index.__init__() + + return index + + +cdef class TabixIndex(BaseIndex): + """Tabix index data structure for VCF files""" + def __init__(self): + self.refs = () + self.refmap = {} + + if not self.ptr: + raise ValueError('Invalid index object') + + cdef int n + cdef const char **refs = tbx_seqnames(self.ptr, &n) + + self.refs = char_array_to_tuple(refs, n, free_after=1) if refs else () + self.refmap = { r:i for i,r in enumerate(self.refs) } + + def __dealloc__(self): + if self.ptr: + tbx_destroy(self.ptr) + self.ptr = NULL + + def fetch(self, bcf, contig, start, stop, reopen): + return TabixIterator(bcf, contig, start, stop, reopen) + + +cdef TabixIndex makeTabixIndex(tbx_t *idx): + if not idx: + return None + + cdef TabixIndex index = TabixIndex.__new__(TabixIndex) + index.ptr = idx + index.__init__() + + return index + + +######################################################################## +######################################################################## +## Iterators +######################################################################## + + +cdef class BaseIterator(object): + pass + + +# Internal function to clean up after iteration stop or failure. +# This would be a nested function if it weren't a cdef function. +cdef void _stop_BCFIterator(BCFIterator self, bcf1_t *record): + bcf_destroy1(record) + + # destroy iter so future calls to __next__ raise StopIteration + bcf_itr_destroy(self.iter) + self.iter = NULL + + +cdef class BCFIterator(BaseIterator): + def __init__(self, VariantFile bcf, contig=None, start=None, stop=None, reopen=True): + if bcf is None: + raise ValueError('bcf must not be None') + + if contig is None: + raise ValueError('contig must be specified') + + if not isinstance(bcf.index, BCFIndex): + raise ValueError('bcf index required') + + cdef BCFIndex index = bcf.index + + self.bcf = bcf + self.index = index + + cdef int rid, cstart, cstop + + try: + rid = index.refmap[contig] + except KeyError: + # A query for a non-existent contig yields an empty iterator, does not raise an error + self.iter = NULL + return + + if reopen: + self.bcf = self.bcf.copy() + + cstart = start if start is not None else 0 + cstop = stop if stop is not None else MAX_POS + + with nogil: + self.iter = bcf_itr_queryi(index.ptr, rid, cstart, cstop) + + if not self.iter: + if errno: + raise IOError(errno, strerror(errno)) + else: + raise IOError('unable to fetch {}:{}-{}'.format(contig, start+1, stop)) + + def __dealloc__(self): + if self.iter: + bcf_itr_destroy(self.iter) + self.iter = NULL + + def __iter__(self): + return self + + def __next__(self): + if not self.iter: + raise StopIteration + + cdef bcf1_t *record = bcf_init1() + + if not record: + raise MemoryError('unable to allocate BCF record') + + record.pos = -1 + if self.bcf.drop_samples: + record.max_unpack = BCF_UN_SHR + + cdef int ret + + with nogil: + ret = bcf_itr_next(self.bcf.htsfile, self.iter, record) + + if ret < 0: + _stop_BCFIterator(self, record) + if ret == -1: + raise StopIteration + elif ret == -2: + raise IOError('truncated file') + elif errno: + raise IOError(errno, strerror(errno)) + else: + raise IOError('unable to fetch next record') + + ret = bcf_subset_format(self.bcf.header.ptr, record) + + if ret < 0: + _stop_BCFIterator(self, record) + raise ValueError('error in bcf_subset_format') + + return makeVariantRecord(self.bcf.header, record) + + +cdef class TabixIterator(BaseIterator): + def __cinit__(self, *args, **kwargs): + self.line_buffer.l = 0 + self.line_buffer.m = 0 + self.line_buffer.s = NULL + + def __init__(self, VariantFile bcf, contig=None, start=None, stop=None, reopen=True): + if bcf is None: + raise ValueError('bcf must not be None') + + if not isinstance(bcf.index, TabixIndex): + raise ValueError('tabix index required') + + cdef TabixIndex index = bcf.index + + self.bcf = bcf + self.index = index + + cdef int rid, cstart, cstop + + try: + rid = index.refmap[contig] + except KeyError: + # A query for a non-existent contig yields an empty iterator, does not raise an error + self.iter = NULL + return + + if reopen: + self.bcf = self.bcf.copy() + + cstart = start if start is not None else 0 + cstop = stop if stop is not None else MAX_POS + + self.iter = tbx_itr_queryi(index.ptr, rid, start, stop) + + if not self.iter: + if errno: + raise IOError(errno, strerror(errno)) + else: + raise IOError('unable to fetch {}:{}-{}'.format(contig, start+1, stop)) + + def __dealloc__(self): + if self.iter: + tbx_itr_destroy(self.iter) + self.iter = NULL + + if self.line_buffer.m: + free(self.line_buffer.s) + + self.line_buffer.l = 0 + self.line_buffer.m = 0 + self.line_buffer.s = NULL + + def __iter__(self): + return self + + def __next__(self): + if not self.iter: + raise StopIteration + + cdef int ret + + with nogil: + ret = tbx_itr_next(self.bcf.htsfile, self.index.ptr, self.iter, &self.line_buffer) + + if ret < 0: + tbx_itr_destroy(self.iter) + self.iter = NULL + if ret == -1: + raise StopIteration + elif ret == -2: + raise IOError('truncated file') + elif errno: + raise IOError(errno, strerror(errno)) + else: + raise IOError('unable to fetch next record') + + cdef bcf1_t *record = bcf_init1() + + if not record: + raise MemoryError('unable to allocate BCF record') + + record.pos = -1 + if self.bcf.drop_samples: + record.max_unpack = BCF_UN_SHR + + ret = vcf_parse1(&self.line_buffer, self.bcf.header.ptr, record) + + # FIXME: stop iteration on parse failure? + if ret < 0: + bcf_destroy1(record) + raise ValueError('error in vcf_parse') + + return makeVariantRecord(self.bcf.header, record) + + +######################################################################## +######################################################################## +## Variant File +######################################################################## + + +cdef class VariantFile(HTSFile): + """*(filename, mode=None, index_filename=None, header=None, drop_samples=False, + duplicate_filehandle=True, ignore_truncation=False, threads=1)* + + A :term:`VCF`/:term:`BCF` formatted file. The file is automatically + opened. + + If an index for a variant file exists (.csi or .tbi), it will be + opened automatically. Without an index random access to records + via :meth:`fetch` is disabled. + + For writing, a :class:`VariantHeader` object must be provided, + typically obtained from another :term:`VCF` file/:term:`BCF` + file. + + Parameters + ---------- + mode : string + *mode* should be ``r`` for reading or ``w`` for writing. The default is + text mode (:term:`VCF`). For binary (:term:`BCF`) I/O you should append + ``b`` for compressed or ``u`` for uncompressed :term:`BCF` output. + + If ``b`` is present, it must immediately follow ``r`` or ``w``. Valid + modes are ``r``, ``w``, ``wh``, ``rb``, ``wb``, ``wbu`` and ``wb0``. + For instance, to open a :term:`BCF` formatted file for reading, type:: + + f = pysam.VariantFile('ex1.bcf','r') + + If mode is not specified, we will try to auto-detect the file type. All + of the following should work:: + + f1 = pysam.VariantFile('ex1.bcf') + f2 = pysam.VariantFile('ex1.vcf') + f3 = pysam.VariantFile('ex1.vcf.gz') + + index_filename : string + Explicit path to an index file. + + header : VariantHeader + :class:`VariantHeader` object required for writing. + + drop_samples: bool + Ignore sample information when reading. + + duplicate_filehandle: bool + By default, file handles passed either directly or through + File-like objects will be duplicated before passing them to + htslib. The duplication prevents issues where the same stream + will be closed by htslib and through destruction of the + high-level python object. Set to False to turn off + duplication. + + ignore_truncation: bool + Issue a warning, instead of raising an error if the current file + appears to be truncated due to a missing EOF marker. Only applies + to bgzipped formats. (Default=False) + + threads: integer + Number of threads to use for compressing/decompressing VCF/BCF files. + Setting threads to > 1 cannot be combined with `ignore_truncation`. + (Default=1) + + """ + def __cinit__(self, *args, **kwargs): + self.htsfile = NULL + + def __init__(self, *args, **kwargs): + self.header = None + self.index = None + self.filename = None + self.mode = None + self.threads = 1 + self.index_filename = None + self.is_stream = False + self.is_remote = False + self.is_reading = False + self.drop_samples = False + self.header_written = False + self.start_offset = -1 + + self.open(*args, **kwargs) + + def __dealloc__(self): + if not self.htsfile or not self.header: + return + + # Write header if no records were written + if self.htsfile.is_write and not self.header_written: + with nogil: + bcf_hdr_write(self.htsfile, self.header.ptr) + + cdef int ret = hts_close(self.htsfile) + self.htsfile = NULL + self.header = self.index = None + + if ret < 0: + global errno + if errno == EPIPE: + errno = 0 + else: + raise IOError(errno, force_str(strerror(errno))) + + def close(self): + """closes the :class:`pysam.VariantFile`.""" + if not self.htsfile: + return + + # Write header if no records were written + if self.htsfile.is_write and not self.header_written: + with nogil: + bcf_hdr_write(self.htsfile, self.header.ptr) + + cdef int ret = hts_close(self.htsfile) + self.htsfile = NULL + self.header = self.index = None + + if ret < 0: + global errno + if errno == EPIPE: + errno = 0 + else: + raise IOError(errno, force_str(strerror(errno))) + + def __iter__(self): + if not self.is_open: + raise ValueError('I/O operation on closed file') + + if self.htsfile.is_write: + raise ValueError('cannot iterate over Variantfile opened for writing') + + self.is_reading = 1 + return self + + def __next__(self): + cdef int ret + cdef int errcode + cdef bcf1_t *record = bcf_init1() + + if not record: + raise MemoryError('unable to allocate BCF record') + + record.pos = -1 + if self.drop_samples: + record.max_unpack = BCF_UN_SHR + + with nogil: + ret = bcf_read1(self.htsfile, self.header.ptr, record) + + if ret < 0: + errcode = record.errcode + bcf_destroy1(record) + if errcode: + raise IOError('unable to parse next record') + if ret == -1: + raise StopIteration + elif ret == -2: + raise IOError('truncated file') + elif errno: + raise IOError(errno, strerror(errno)) + else: + raise IOError('unable to fetch next record') + + return makeVariantRecord(self.header, record) + + def copy(self): + if not self.is_open: + raise ValueError + + cdef VariantFile vars = VariantFile.__new__(VariantFile) + cdef bcf_hdr_t *hdr + + # FIXME: re-open using fd or else header and index could be invalid + vars.htsfile = self._open_htsfile() + + if not vars.htsfile: + raise ValueError('Cannot re-open htsfile') + + # minimize overhead by re-using header and index. This approach is + # currently risky, but see above for how this can be mitigated. + vars.header = self.header + vars.index = self.index + + vars.filename = self.filename + vars.mode = self.mode + vars.threads = self.threads + vars.index_filename = self.index_filename + vars.drop_samples = self.drop_samples + vars.is_stream = self.is_stream + vars.is_remote = self.is_remote + vars.is_reading = self.is_reading + vars.start_offset = self.start_offset + vars.header_written = self.header_written + + if self.htsfile.is_bin: + vars.seek(self.tell()) + else: + with nogil: + hdr = bcf_hdr_read(vars.htsfile) + makeVariantHeader(hdr) + + return vars + + def open(self, filename, mode='r', + index_filename=None, + VariantHeader header=None, + drop_samples=False, + duplicate_filehandle=True, + ignore_truncation=False, + threads=1): + """open a vcf/bcf file. + + If open is called on an existing VariantFile, the current file will be + closed and a new file will be opened. + """ + cdef bcf_hdr_t *hdr + cdef BGZF *bgzfp + cdef hts_idx_t *idx + cdef tbx_t *tidx + cdef char *cfilename + cdef char *cindex_filename = NULL + cdef char *cmode + + if threads > 1 and ignore_truncation: + # This won't raise errors if reaching a truncated alignment, + # because bgzf_mt_reader in htslib does not deal with + # bgzf_mt_read_block returning non-zero values, contrary + # to bgzf_read (https://github.com/samtools/htslib/blob/1.7/bgzf.c#L888) + # Better to avoid this (for now) than to produce seemingly correct results. + raise ValueError('Cannot add extra threads when "ignore_truncation" is True') + self.threads = threads + + # close a previously opened file + if self.is_open: + self.close() + + if not mode or mode[0] not in 'rwa': + raise ValueError('mode must begin with r, w or a') + + self.duplicate_filehandle = duplicate_filehandle + + format_modes = [m for m in mode[1:] if m in 'bcguz'] + if len(format_modes) > 1: + raise ValueError('mode contains conflicting format specifiers: {}'.format(''.join(format_modes))) + + invalid_modes = [m for m in mode[1:] if m not in 'bcguz0123456789ex'] + if invalid_modes: + raise ValueError('invalid mode options: {}'.format(''.join(invalid_modes))) + + # Autodetect mode from filename + if mode == 'w' and isinstance(filename, str): + if filename.endswith('.gz'): + mode = 'wz' + elif filename.endswith('.bcf'): + mode = 'wb' + + # for htslib, wbu seems to not work + if mode == 'wbu': + mode = 'wb0' + + self.mode = mode = force_bytes(mode) + try: + filename = encode_filename(filename) + self.is_remote = hisremote(filename) + self.is_stream = filename == b'-' + except TypeError: + filename = filename + self.is_remote = False + self.is_stream = True + + self.filename = filename + + if index_filename is not None: + self.index_filename = index_filename = encode_filename(index_filename) + else: + self.index_filename = None + + self.drop_samples = bool(drop_samples) + self.header = None + + self.header_written = False + + if mode.startswith(b'w'): + # open file for writing + if index_filename is not None: + raise ValueError('Cannot specify an index filename when writing a VCF/BCF file') + + # header structure (used for writing) + if header: + self.header = header.copy() + else: + self.header = VariantHeader() + #raise ValueError('a VariantHeader must be specified') + + # Header is not written until the first write or on close + self.htsfile = self._open_htsfile() + + if not self.htsfile: + raise ValueError("could not open file `{}` (mode='{}')".format(filename, mode)) + + elif mode.startswith(b'r'): + # open file for reading + self.htsfile = self._open_htsfile() + + if not self.htsfile: + if errno: + raise IOError(errno, 'could not open variant file `{}`: {}'.format(filename, force_str(strerror(errno)))) + else: + raise ValueError('could not open variant file `{}`'.format(filename)) + + if self.htsfile.format.format not in (bcf, vcf): + raise ValueError('invalid file `{}` (mode=`{}`) - is it VCF/BCF format?'.format(filename, mode)) + + self.check_truncation(ignore_truncation) + + with nogil: + hdr = bcf_hdr_read(self.htsfile) + + try: + self.header = makeVariantHeader(hdr) + except ValueError: + raise ValueError('file `{}` does not have valid header (mode=`{}`) - is it VCF/BCF format?'.format(filename, mode)) + + if isinstance(self.filename, bytes): + cfilename = self.filename + else: + cfilename = NULL + + # check for index and open if present + if self.htsfile.format.format == bcf and cfilename: + if index_filename is not None: + cindex_filename = index_filename + with nogil: + idx = bcf_index_load2(cfilename, cindex_filename) + self.index = makeBCFIndex(self.header, idx) + + elif self.htsfile.format.compression == bgzf and cfilename: + if index_filename is not None: + cindex_filename = index_filename + with nogil: + tidx = tbx_index_load2(cfilename, cindex_filename) + self.index = makeTabixIndex(tidx) + + if not self.is_stream: + self.start_offset = self.tell() + else: + raise ValueError('unknown mode {}'.format(mode)) + + def reset(self): + """reset file position to beginning of file just after the header.""" + return self.seek(self.start_offset) + + def is_valid_tid(self, tid): + """ + return True if the numerical :term:`tid` is valid; False otherwise. + + returns -1 if reference is not known. + """ + if not self.is_open: + raise ValueError('I/O operation on closed file') + + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int rid = tid + return 0 <= rid < hdr.n[BCF_DT_CTG] + + def get_tid(self, reference): + """ + return the numerical :term:`tid` corresponding to + :term:`reference` + + returns -1 if reference is not known. + """ + if not self.is_open: + raise ValueError('I/O operation on closed file') + + cdef vdict_t *d = self.header.ptr.dict[BCF_DT_CTG] + reference = force_bytes(reference) + cdef khint_t k = kh_get_vdict(d, reference) + return kh_val_vdict(d, k).id if k != kh_end(d) else -1 + + def get_reference_name(self, tid): + """ + return :term:`reference` name corresponding to numerical :term:`tid` + """ + if not self.is_open: + raise ValueError('I/O operation on closed file') + + cdef bcf_hdr_t *hdr = self.header.ptr + cdef int rid = tid + if rid < 0 or rid >= hdr.n[BCF_DT_CTG]: + raise ValueError('Invalid tid') + return bcf_str_cache_get_charptr(bcf_hdr_id2name(hdr, rid)) + + def fetch(self, contig=None, start=None, stop=None, region=None, reopen=False, end=None, reference=None): + """fetch records in a :term:`region`, specified either by + :term:`contig`, *start*, and *end* (which are 0-based, half-open); + or alternatively by a samtools :term:`region` string (which is + 1-based inclusive). + + Without *contig* or *region* all mapped records will be fetched. The + records will be returned ordered by contig, which will not necessarily + be the order within the file. + + Set *reopen* to true if you will be using multiple iterators on the + same file at the same time. The iterator returned will receive its + own copy of a filehandle to the file effectively re-opening the + file. Re-opening a file incurrs some overhead, so use with care. + + If only *contig* is set, all records on *contig* will be fetched. + If both *region* and *contig* are given, an exception is raised. + + Note that a bgzipped :term:`VCF`.gz file without a tabix/CSI index + (.tbi/.csi) or a :term:`BCF` file without a CSI index can only be + read sequentially. + """ + if not self.is_open: + raise ValueError('I/O operation on closed file') + + if self.htsfile.is_write: + raise ValueError('cannot fetch from Variantfile opened for writing') + + if contig is None and region is None: + self.is_reading = 1 + bcf = self.copy() if reopen else self + bcf.seek(self.start_offset) + return iter(bcf) + + if self.index is None: + raise ValueError('fetch requires an index') + + _, tid, start, stop = self.parse_region(contig, start, stop, region, + None, end=end, reference=reference) + + if contig is None: + contig = self.get_reference_name(tid) + + self.is_reading = 1 + return self.index.fetch(self, contig, start, stop, reopen) + + def new_record(self, *args, **kwargs): + """Create a new empty :class:`VariantRecord`. + + See :meth:`VariantHeader.new_record` + """ + return self.header.new_record(*args, **kwargs) + + cpdef int write(self, VariantRecord record) except -1: + """ + write a single :class:`pysam.VariantRecord` to disk. + + returns the number of bytes written. + """ + if record is None: + raise ValueError('record must not be None') + + if not self.is_open: + return ValueError('I/O operation on closed file') + + if not self.htsfile.is_write: + raise ValueError('cannot write to a Variantfile opened for reading') + + if not self.header_written: + self.header_written = True + with nogil: + bcf_hdr_write(self.htsfile, self.header.ptr) + + #if record.header is not self.header: + # record.translate(self.header) + # raise ValueError('Writing records from a different VariantFile is not yet supported') + + if record.ptr.n_sample != bcf_hdr_nsamples(self.header.ptr): + msg = 'Invalid VariantRecord. Number of samples does not match header ({} vs {})' + raise ValueError(msg.format(record.ptr.n_sample, bcf_hdr_nsamples(self.header.ptr))) + + # Sync END annotation before writing + bcf_sync_end(record) + + cdef int ret + + with nogil: + ret = bcf_write1(self.htsfile, self.header.ptr, record.ptr) + + if ret < 0: + raise IOError(errno, strerror(errno)) + + return ret + + def subset_samples(self, include_samples): + """ + Read only a subset of samples to reduce processing time and memory. + Must be called prior to retrieving records. + """ + if not self.is_open: + raise ValueError('I/O operation on closed file') + + if self.htsfile.is_write: + raise ValueError('cannot subset samples from Variantfile opened for writing') + + if self.is_reading: + raise ValueError('cannot subset samples after fetching records') + + self.header._subset_samples(include_samples) + + # potentially unnecessary optimization that also sets max_unpack + if not include_samples: + self.drop_samples = True + diff --git a/pysam/libcbcftools.pxd b/pysam/libcbcftools.pxd new file mode 100644 index 0000000..f8892ed --- /dev/null +++ b/pysam/libcbcftools.pxd @@ -0,0 +1,8 @@ +cdef extern from "bcftools.pysam.h": + + int bcftools_dispatch(int argc, char *argv[]) + void bcftools_set_stderr(int fd) + void bcftools_close_stderr() + void bcftools_set_stdout(int fd) + void bcftools_set_stdout_fn(const char *) + void bcftools_close_stdout() diff --git a/pysam/libcbcftools.pyi b/pysam/libcbcftools.pyi new file mode 100644 index 0000000..242b931 --- /dev/null +++ b/pysam/libcbcftools.pyi @@ -0,0 +1 @@ +def py_bcftools() -> None: ... diff --git a/pysam/libcbcftools.pyx b/pysam/libcbcftools.pyx new file mode 100644 index 0000000..8e90388 --- /dev/null +++ b/pysam/libcbcftools.pyx @@ -0,0 +1,2 @@ +def py_bcftools(): + pass diff --git a/pysam/libcbgzf.pyi b/pysam/libcbgzf.pyi new file mode 100644 index 0000000..4d64e8d --- /dev/null +++ b/pysam/libcbgzf.pyi @@ -0,0 +1,40 @@ +import sys + +from typing import Optional, Union, Any, NoReturn + +if sys.version_info < (3, 8): + from typing_extensions import Literal +else: + from typing import Literal + +BUFFER_SIZE: int + +class BGZFile: + def __init__( + self, + filename: str, + mode: Optional[Literal["r", "rb", "a", "ab", "w", "wb", "x", "xb"]], + index: Optional[str], + ) -> None: ... + @property + def name(self) -> str: ... + @property + def index(self) -> Optional[str]: ... + def write(self, data: Union[bytes, bytearray, memoryview]) -> int: ... + def read(self, size: int = ...) -> bytes: ... + @property + def closed(self) -> bool: ... + def close(self) -> None: ... + def __enter__(self) -> BGZFile: ... + def __exit__(self, type, value, traceback) -> Any: ... + def flush(self) -> None: ... + def fileno(self) -> NoReturn: ... + def rewind(self) -> None: ... + def readable(self) -> bool: ... + def writable(self) -> bool: ... + def seekable(self) -> bool: ... + def tell(self) -> int: ... + def seek(self, offset: int, whence: int = ...) -> int: ... + def readline(self, size: int = ...) -> bytes: ... + def __iter__(self) -> BGZFile: ... + def __next__(self) -> bytes: ... diff --git a/pysam/libcbgzf.pyx b/pysam/libcbgzf.pyx new file mode 100644 index 0000000..ede6463 --- /dev/null +++ b/pysam/libcbgzf.pyx @@ -0,0 +1,238 @@ +"""Functions that read and write block gzipped files. + +The user of the file doesn't have to worry about the compression +and random access is allowed if an index file is present.""" + +# based on Python 3.5's gzip module + +import io + +from libc.stdint cimport int8_t, int16_t, int32_t, int64_t +from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t +from libc.stdlib cimport malloc, calloc, realloc, free + +from cpython.object cimport PyObject +from cpython.bytes cimport PyBytes_FromStringAndSize, _PyBytes_Resize + +from pysam.libcutils cimport force_bytes, encode_filename +from pysam.libchtslib cimport bgzf_open, bgzf_index_build_init, bgzf_write, bgzf_read, \ + bgzf_flush, bgzf_index_dump, bgzf_close, bgzf_seek, \ + bgzf_tell, bgzf_getline, kstring_t, SEEK_SET, BGZF + +__all__ = ["BGZFile"] + + +BUFFER_SIZE = io.DEFAULT_BUFFER_SIZE + + +cdef class BGZFile(object): + """The BGZFile class simulates most of the methods of a file object with + the exception of the truncate() method. + + This class only supports opening files in binary mode. If you need to open a + compressed file in text mode, use the gzip.open() function. + """ + cdef BGZF* bgzf + cdef readonly object name, index + + def __init__(self, filename, mode=None, index=None): + """Constructor for the BGZFile class. + + The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', 'wb', 'x', or + 'xb' depending on whether the file will be read or written. The default + is the mode of fileobj if discernible; otherwise, the default is 'rb'. + A mode of 'r' is equivalent to one of 'rb', and similarly for 'w' and + 'wb', 'a' and 'ab', and 'x' and 'xb'. + """ + if mode and ('t' in mode or 'U' in mode): + raise ValueError("Invalid mode: {!r}".format(mode)) + if not mode: + mode = 'rb' + elif mode and 'b' not in mode: + mode += 'b' + + mode = force_bytes(mode) + + self.name = encode_filename(filename) + self.index = encode_filename(index) if index is not None else None + + self.bgzf = bgzf_open(self.name, mode) + + if self.bgzf.is_write and index is not None and bgzf_index_build_init(self.bgzf) < 0: + raise IOError('Error building bgzf index') + + def __dealloc__(self): + self.close() + + def write(self, data): + if not self.bgzf: + raise ValueError("write() on closed BGZFile object") + + if not self.bgzf.is_write: + import errno + raise IOError(errno.EBADF, "write() on read-only BGZFile object") + + if isinstance(data, bytes): + length = len(data) + else: + # accept any data that supports the buffer protocol + data = memoryview(data) + length = data.nbytes + + if length > 0 and bgzf_write(self.bgzf, data, length) < 0: + raise IOError('BGZFile write failed') + + return length + + def read(self, size=-1): + cdef ssize_t read_size + + if not self.bgzf: + raise ValueError("read() on closed BGZFile object") + + if self.bgzf.is_write: + import errno + raise IOError(errno.EBADF, "read() on write-only BGZFile object") + + if size < 0: + chunks = [] + while 1: + chunk = PyBytes_FromStringAndSize(NULL, BUFFER_SIZE) + cdata = chunk + read_size = bgzf_read(self.bgzf, chunk, BUFFER_SIZE) + if read_size < 0: + raise IOError('Error reading from BGZFile') + elif not read_size: + break + elif read_size < BUFFER_SIZE: + chunk = chunk[:read_size] + chunks.append(chunk) + return b''.join(chunks) + + elif size > 0: + chunk = PyBytes_FromStringAndSize(NULL, size) + read_size = bgzf_read(self.bgzf, chunk, size) + if read_size < 0: + raise IOError('Error reading from BGZFile') + elif read_size < size: + chunk = chunk[:read_size] + return chunk + else: + return b'' + + @property + def closed(self): + return self.bgzf == NULL + + def close(self): + if not self.bgzf: + return + + if self.bgzf.is_write and bgzf_flush(self.bgzf) < 0: + raise IOError('Error flushing BGZFile object') + + if self.index and bgzf_index_dump(self.bgzf, self.index, NULL) < 0: + raise IOError('Cannot write index') + + cdef ret = bgzf_close(self.bgzf) + self.bgzf = NULL + + if ret < 0: + raise IOError('Error closing BGZFile object') + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.close() + + def flush(self): + if not self.bgzf: + return + + if self.bgzf.is_write and bgzf_flush(self.bgzf) < 0: + raise IOError('Error flushing BGZFile object') + + def fileno(self): + """Invoke the underlying file object's fileno() method. + + This will raise AttributeError if the underlying file object + doesn't support fileno(). + """ + raise AttributeError('fileno') + + def rewind(self): + '''Return the uncompressed stream file position indicator to the + beginning of the file''' + if not self.bgzf: + raise ValueError("rewind() on closed BGZFile object") + if not self.bgzf.is_write: + raise IOError("Can't rewind in write mode") + if bgzf_seek(self.bgzf, 0, SEEK_SET) < 0: + raise IOError('Error seeking BGZFFile object') + + def readable(self): + if not self.bgzf: + raise ValueError("readable() on closed BGZFile object") + return self.bgzf != NULL and not self.bgzf.is_write + + def writable(self): + return self.bgzf != NULL and self.bgzf.is_write + + def seekable(self): + return True + + def tell(self): + if not self.bgzf: + raise ValueError("seek() on closed BGZFile object") + cdef int64_t off = bgzf_tell(self.bgzf) + if off < 0: + raise IOError('Error in tell on BGZFFile object') + + return off + + def seek(self, offset, whence=io.SEEK_SET): + if not self.bgzf: + raise ValueError("seek() on closed BGZFile object") + if whence is not io.SEEK_SET: + raise ValueError('Seek from end not supported') + + cdef int64_t off = bgzf_seek(self.bgzf, offset, SEEK_SET) + if off < 0: + raise IOError('Error seeking BGZFFile object') + + return off + + def readline(self, size=-1): + if not self.bgzf: + raise ValueError("readline() on closed BGZFile object") + + cdef kstring_t line + cdef char c + + line.l = line.m = 0 + line.s = NULL + + cdef int ret = bgzf_getline(self.bgzf, '\n', &line) + if ret == -1: + s = b'' + elif ret == -2: + if line.m: + free(line.s) + raise IOError('Error reading line in BGZFFile object') + else: + s = line.s[:line.l] + + if line.m: + free(line.s) + + return s + + def __iter__(self): + return self + + def __next__(self): + line = self.readline() + if not line: + raise StopIteration() + return line diff --git a/pysam/libcfaidx.pxd b/pysam/libcfaidx.pxd new file mode 100644 index 0000000..53ad767 --- /dev/null +++ b/pysam/libcfaidx.pxd @@ -0,0 +1,80 @@ +from libc.stdint cimport int8_t, int16_t, int32_t, int64_t +from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t +from libc.stdlib cimport malloc, calloc, realloc, free +from libc.string cimport memcpy, memcmp, strncpy, strlen, strdup +from libc.stdio cimport FILE, printf +cimport cython + +from cpython cimport array +from pysam.libchtslib cimport faidx_t, kstring_t, BGZF + +# These functions are put here and not in chtslib.pxd in order +# to avoid warnings for unused functions. +cdef extern from "pysam_stream.h" nogil: + + ctypedef struct kstream_t: + pass + + ctypedef struct kseq_t: + kstring_t name + kstring_t comment + kstring_t seq + kstring_t qual + + kseq_t *kseq_init(BGZF *) + int kseq_read(kseq_t *) + void kseq_destroy(kseq_t *) + kstream_t *ks_init(BGZF *) + void ks_destroy(kstream_t *) + + # Retrieve characters from stream until delimiter + # is reached placing results in str. + int ks_getuntil(kstream_t *, + int delimiter, + kstring_t * str, + int * dret) + +cdef class FastaFile: + cdef bint is_remote + cdef object _filename, _references, _lengths, reference2length + cdef faidx_t* fastafile + cdef char* _fetch(self, char* reference, + int start, int end, int* length) except? NULL + + +cdef class FastqProxy: + cdef kseq_t * _delegate + cdef cython.str to_string(self) + cdef cython.str tostring(self) + cpdef array.array get_quality_array(self, int offset=*) + + +cdef class FastxRecord: + """ + Python container for pysam.libcfaidx.FastqProxy with persistence. + """ + cdef public str comment, quality, sequence, name + cdef cython.str to_string(self) + cdef cython.str tostring(self) + cpdef array.array get_quality_array(self, int offset=*) + +cdef class FastxFile: + cdef object _filename + cdef BGZF * fastqfile + cdef kseq_t * entry + cdef bint persist + cdef bint is_remote + + cdef kseq_t * getCurrent(self) + cdef int cnext(self) + + +# Compatibility Layer for pysam 0.8.1 +cdef class FastqFile(FastxFile): + pass + + +# Compatibility Layer for pysam < 0.8 +cdef class Fastafile(FastaFile): + pass + diff --git a/pysam/libcfaidx.pyi b/pysam/libcfaidx.pyi new file mode 100644 index 0000000..5865701 --- /dev/null +++ b/pysam/libcfaidx.pyi @@ -0,0 +1,68 @@ +import array +from typing import Optional, Any, Sequence, Iterator + +class FastaFile: + def __init__( + self, + filename: str, + filepath_index: Optional[str] = ..., + filepath_index_compressed: Optional[str] = ..., + ) -> None: ... + def is_open(self) -> bool: ... + def __len__(self) -> int: ... + def close(self) -> None: ... + def __enter__(self) -> FastaFile: ... + def __exit__(self, type, value, traceback) -> Any: ... + @property + def closed(self) -> bool: ... + @property + def filename(self) -> str: ... + @property + def references(self) -> Sequence[str]: ... + @property + def nreferences(self) -> Optional[int]: ... + @property + def lengths(self) -> Sequence[int]: ... + def fetch( + self, + reference: Optional[str] = ..., + start: Optional[int] = ..., + end: Optional[int] = ..., + region: Optional[str] = ..., + ) -> str: ... + def get_reference_length(self, reference: str) -> int: ... + def __getitem__(self, reference: str) -> str: ... + def __contains__(self, reference: str) -> bool: ... + +class FastxRecord: + comment: str = ... + quality: str = ... + sequence: str = ... + name: str = ... + def __init__( + self, + name: Optional[str] = ..., + comment: Optional[str] = ..., + sequence: Optional[str] = ..., + quality: Optional[str] = ..., + ) -> None: ... + def set_name(self, name: str) -> None: ... + def set_comment(self, comment: str) -> None: ... + def set_sequence(self, sequence: str, quality: Optional[str] = ...) -> None: ... + def get_quality_array(self, offset: int = ...) -> array.array: ... + +class FastxFile: + def __init__(self, filename: str, persist: bool = ...) -> None: ... + def is_open(self) -> bool: ... + def close(self) -> None: ... + def __enter__(self) -> FastxFile: ... + def __exit__(self, type, value, traceback) -> Any: ... + @property + def closed(self) -> bool: ... + @property + def filename(self) -> str: ... + def __iter__(self) -> Iterator[FastxRecord]: ... + def __next__(self) -> FastxRecord: ... + +# deprecated +class FastqFile(FastxFile): ... diff --git a/pysam/libcfaidx.pyx b/pysam/libcfaidx.pyx new file mode 100644 index 0000000..e73adf9 --- /dev/null +++ b/pysam/libcfaidx.pyx @@ -0,0 +1,674 @@ +# cython: embedsignature=True +# cython: profile=True +############################################################################### +############################################################################### +# Cython wrapper for SAM/BAM/CRAM files based on htslib +############################################################################### +# The principal classes defined in this module are: +# +# class FastaFile random read read/write access to faidx indexd files +# class FastxFile streamed read/write access to fasta/fastq files +# +# Additionally this module defines several additional classes that are part +# of the internal API. These are: +# +# class FastqProxy +# class FastxRecord +# +# For backwards compatibility, the following classes are also defined: +# +# class Fastafile equivalent to FastaFile +# class FastqFile equivalent to FastxFile +# +############################################################################### +# +# The MIT License +# +# Copyright (c) 2015 Andreas Heger +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +############################################################################### +import sys +import os +import re + + +from libc.errno cimport errno +from libc.string cimport strerror + +from cpython cimport array + +from cpython cimport PyErr_SetString, \ + PyBytes_Check, \ + PyUnicode_Check, \ + PyBytes_FromStringAndSize + +from cpython.version cimport PY_MAJOR_VERSION + +from pysam.libchtslib cimport \ + faidx_nseq, fai_load, fai_load3, fai_destroy, fai_fetch, \ + faidx_seq_len, faidx_iseq, faidx_seq_len, \ + faidx_fetch_seq, hisremote, \ + bgzf_open, bgzf_close + +from pysam.libcutils cimport force_bytes, force_str, charptr_to_str +from pysam.libcutils cimport encode_filename, from_string_and_size +from pysam.libcutils cimport qualitystring_to_array, parse_region + +cdef class FastqProxy +cdef makeFastqProxy(kseq_t * src): + '''enter src into AlignedRead.''' + cdef FastqProxy dest = FastqProxy.__new__(FastqProxy) + dest._delegate = src + return dest + +## TODO: +## add automatic indexing. +## add function to get sequence names. +cdef class FastaFile: + """Random access to fasta formatted files that + have been indexed by :term:`faidx`. + + The file is automatically opened. The index file of file + ```` is expected to be called ``.fai``. + + Parameters + ---------- + + filename : string + Filename of fasta file to be opened. + + filepath_index : string + Optional, filename of the index. By default this is + the filename + ".fai". + + filepath_index_compressed : string + Optional, filename of the index if fasta file is. By default this is + the filename + ".gzi". + + Raises + ------ + + ValueError + if index file is missing + + IOError + if file could not be opened + + """ + + def __cinit__(self, *args, **kwargs): + self.fastafile = NULL + self._filename = None + self._references = None + self._lengths = None + self.reference2length = None + self._open(*args, **kwargs) + + def is_open(self): + '''return true if samfile has been opened.''' + return self.fastafile != NULL + + def __len__(self): + if self.fastafile == NULL: + raise ValueError("calling len() on closed file") + + return faidx_nseq(self.fastafile) + + def _open(self, filename, filepath_index=None, filepath_index_compressed=None): + '''open an indexed fasta file. + + This method expects an indexed fasta file. + ''' + + # close a previously opened file + if self.fastafile != NULL: + self.close() + + self._filename = encode_filename(filename) + cdef char *cfilename = self._filename + cdef char *cindexname = NULL + cdef char *cindexname_compressed = NULL + self.is_remote = hisremote(cfilename) + + # open file for reading + if (self._filename != b"-" + and not self.is_remote + and not os.path.exists(filename)): + raise IOError("file `%s` not found" % filename) + + # 3 modes to open: + # compressed fa: fai_load3 with filename, index_fai and index_gzi + # uncompressed fa: fai_load3 with filename and index_fai + # uncompressed fa: fai_load with default index name + if filepath_index: + # when opening, set flags to 0 - do not automatically + # build index if it does not exist. + + if not os.path.exists(filepath_index): + raise IOError("filename {} does not exist".format(filepath_index)) + cindexname = bindex_filename = encode_filename(filepath_index) + + if filepath_index_compressed: + if not os.path.exists(filepath_index_compressed): + raise IOError("filename {} does not exist".format(filepath_index_compressed)) + cindexname_compressed = bindex_filename_compressed = encode_filename(filepath_index_compressed) + with nogil: + self.fastafile = fai_load3(cfilename, cindexname, cindexname_compressed, 0) + else: + with nogil: + self.fastafile = fai_load3(cfilename, cindexname, NULL, 0) + else: + with nogil: + self.fastafile = fai_load(cfilename) + + if self.fastafile == NULL: + raise IOError("error when opening file `%s`" % filename) + + cdef int nreferences = faidx_nseq(self.fastafile) + cdef int x + cdef const char * s + self._references = [] + self._lengths = [] + for x from 0 <= x < nreferences: + s = faidx_iseq(self.fastafile, x) + ss = force_str(s) + self._references.append(ss) + self._lengths.append(faidx_seq_len(self.fastafile, s)) + self.reference2length = dict(zip(self._references, self._lengths)) + + def close(self): + """close the file.""" + if self.fastafile != NULL: + fai_destroy(self.fastafile) + self.fastafile = NULL + + def __dealloc__(self): + if self.fastafile != NULL: + fai_destroy(self.fastafile) + self.fastafile = NULL + + # context manager interface + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + return False + + property closed: + """bool indicating the current state of the file object. + This is a read-only attribute; the close() method changes the value. + """ + def __get__(self): + return not self.is_open() + + property filename: + """filename associated with this object. This is a read-only attribute.""" + def __get__(self): + return self._filename + + property references: + '''tuple with the names of :term:`reference` sequences.''' + def __get__(self): + return self._references + + property nreferences: + """int with the number of :term:`reference` sequences in the file. + This is a read-only attribute.""" + def __get__(self): + return len(self._references) if self.references else None + + property lengths: + """tuple with the lengths of :term:`reference` sequences.""" + def __get__(self): + return self._lengths + + def fetch(self, + reference=None, + start=None, + end=None, + region=None): + """fetch sequences in a :term:`region`. + + A region can + either be specified by :term:`reference`, `start` and + `end`. `start` and `end` denote 0-based, half-open + intervals. + + Alternatively, a samtools :term:`region` string can be + supplied. + + If any of the coordinates are missing they will be replaced by the + minimum (`start`) or maximum (`end`) coordinate. + + Note that region strings are 1-based, while `start` and `end` denote + an interval in python coordinates. + The region is specified by :term:`reference`, `start` and `end`. + + Returns + ------- + + string : a string with the sequence specified by the region. + + Raises + ------ + + IndexError + if the coordinates are out of range + + ValueError + if the region is invalid + + """ + + if not self.is_open(): + raise ValueError("I/O operation on closed file" ) + + cdef int length + cdef char *seq + cdef char *ref + cdef int rstart, rend + + contig, rstart, rend = parse_region(reference, start, end, region) + + if contig is None: + raise ValueError("no sequence/region supplied.") + + if rstart == rend: + return "" + + contig_b = force_bytes(contig) + ref = contig_b + with nogil: + length = faidx_seq_len(self.fastafile, ref) + if length == -1: + raise KeyError("sequence '%s' not present" % contig) + if rstart >= length: + return "" + + # fai_fetch adds a '\0' at the end + with nogil: + seq = faidx_fetch_seq(self.fastafile, + ref, + rstart, + rend-1, + &length) + + if not seq: + if errno: + raise IOError(errno, strerror(errno)) + else: + raise ValueError("failure when retrieving sequence on '%s'" % contig) + + try: + return charptr_to_str(seq) + finally: + free(seq) + + cdef char *_fetch(self, char *reference, int start, int end, int *length) except? NULL: + '''fetch sequence for reference, start and end''' + + cdef char *seq + with nogil: + seq = faidx_fetch_seq(self.fastafile, + reference, + start, + end-1, + length) + + if not seq: + if errno: + raise IOError(errno, strerror(errno)) + else: + raise ValueError("failure when retrieving sequence on '%s'" % reference) + + return seq + + def get_reference_length(self, reference): + '''return the length of reference.''' + return self.reference2length[reference] + + def __getitem__(self, reference): + return self.fetch(reference) + + def __contains__(self, reference): + '''return true if reference in fasta file.''' + return reference in self.reference2length + + +cdef class FastqProxy: + """A single entry in a fastq file.""" + def __init__(self): + raise ValueError("do not instantiate FastqProxy directly") + + property name: + """The name of each entry in the fastq file.""" + def __get__(self): + return charptr_to_str(self._delegate.name.s) + + property sequence: + """The sequence of each entry in the fastq file.""" + def __get__(self): + return charptr_to_str(self._delegate.seq.s) + + property comment: + def __get__(self): + if self._delegate.comment.l: + return charptr_to_str(self._delegate.comment.s) + else: + return None + + property quality: + """The quality score of each entry in the fastq file, represented as a string.""" + def __get__(self): + if self._delegate.qual.l: + return charptr_to_str(self._delegate.qual.s) + else: + return None + + cdef cython.str to_string(self): + if self.comment is None: + comment = "" + else: + comment = " %s" % self.comment + + if self.quality is None: + return ">%s%s\n%s" % (self.name, comment, self.sequence) + else: + return "@%s%s\n%s\n+\n%s" % (self.name, comment, + self.sequence, self.quality) + + cdef cython.str tostring(self): + """deprecated : use :meth:`to_string`""" + return self.to_string() + + def __str__(self): + return self.to_string() + + cpdef array.array get_quality_array(self, int offset=33): + '''return quality values as integer array after subtracting offset.''' + if self.quality is None: + return None + return qualitystring_to_array(force_bytes(self.quality), + offset=offset) + +cdef class FastxRecord: + """A fasta/fastq record. + + A record must contain a name and a sequence. If either of them are + None, a ValueError is raised on writing. + + """ + def __init__(self, + name=None, + comment=None, + sequence=None, + quality=None, + FastqProxy proxy=None): + if proxy is not None: + self.comment = proxy.comment + self.quality = proxy.quality + self.sequence = proxy.sequence + self.name = proxy.name + else: + self.comment = comment + self.quality = quality + self.sequence = sequence + self.name = name + + def __copy__(self): + return FastxRecord(self.name, self.comment, self.sequence, self.quality) + + def __deepcopy__(self, memo): + return FastxRecord(self.name, self.comment, self.sequence, self.quality) + + cdef cython.str to_string(self): + if self.name is None: + raise ValueError("can not write record without name") + + if self.sequence is None: + raise ValueError("can not write record without a sequence") + + if self.comment is None: + comment = "" + else: + comment = " %s" % self.comment + + if self.quality is None: + return ">%s%s\n%s" % (self.name, comment, self.sequence) + else: + return "@%s%s\n%s\n+\n%s" % (self.name, comment, + self.sequence, self.quality) + + cdef cython.str tostring(self): + """deprecated : use :meth:`to_string`""" + return self.to_string() + + def set_name(self, name): + if name is None: + raise ValueError("FastxRecord must have a name and not None") + self.name = name + + def set_comment(self, comment): + self.comment = comment + + def set_sequence(self, sequence, quality=None): + """set sequence of this record. + + """ + self.sequence = sequence + if quality is not None: + if len(sequence) != len(quality): + raise ValueError("sequence and quality length do not match: {} vs {}".format( + len(sequence), len(quality))) + + self.quality = quality + else: + self.quality = None + + def __str__(self): + return self.to_string() + + cpdef array.array get_quality_array(self, int offset=33): + '''return quality values as array after subtracting offset.''' + if self.quality is None: + return None + return qualitystring_to_array(force_bytes(self.quality), + offset=offset) + + +cdef class FastxFile: + r"""Stream access to :term:`fasta` or :term:`fastq` formatted files. + + The file is automatically opened. + + Entries in the file can be both fastq or fasta formatted or even a + mixture of the two. + + This file object permits iterating over all entries in the + file. Random access is not implemented. The iteration returns + objects of type :class:`FastqProxy` + + Parameters + ---------- + + filename : string + Filename of fasta/fastq file to be opened. + + persist : bool + + If True (default) make a copy of the entry in the file during + iteration. If set to False, no copy will be made. This will + permit much faster iteration, but an entry will not persist + when the iteration continues and an entry is read-only. + + Notes + ----- + Prior to version 0.8.2, this class was called FastqFile. + + Raises + ------ + + IOError + if file could not be opened + + + Examples + -------- + >>> with pysam.FastxFile(filename) as fh: + ... for entry in fh: + ... print(entry.name) + ... print(entry.sequence) + ... print(entry.comment) + ... print(entry.quality) + >>> with pysam.FastxFile(filename) as fin, open(out_filename, mode='w') as fout: + ... for entry in fin: + ... fout.write(str(entry) + '\n') + + """ + def __cinit__(self, *args, **kwargs): + # self.fastqfile = NULL + self._filename = None + self.entry = NULL + self._open(*args, **kwargs) + + def is_open(self): + '''return true if samfile has been opened.''' + return self.entry != NULL + + def _open(self, filename, persist=True): + '''open a fastq/fasta file in *filename* + + Paramentes + ---------- + + persist : bool + + if True return a copy of the underlying data (default + True). The copy will persist even if the iteration + on the file continues. + + ''' + if self.fastqfile != NULL: + self.close() + + self._filename = encode_filename(filename) + cdef char *cfilename = self._filename + self.is_remote = hisremote(cfilename) + + # open file for reading + if (self._filename != b"-" + and not self.is_remote + and not os.path.exists(filename)): + raise IOError("file `%s` not found" % filename) + + self.persist = persist + + with nogil: + self.fastqfile = bgzf_open(cfilename, "r") + self.entry = kseq_init(self.fastqfile) + self._filename = filename + + def close(self): + '''close the file.''' + if self.fastqfile != NULL: + bgzf_close(self.fastqfile) + self.fastqfile = NULL + if self.entry != NULL: + kseq_destroy(self.entry) + self.entry = NULL + + def __dealloc__(self): + if self.fastqfile != NULL: + bgzf_close(self.fastqfile) + if self.entry: + kseq_destroy(self.entry) + + # context manager interface + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + return False + + property closed: + """bool indicating the current state of the file object. + This is a read-only attribute; the close() method changes the value. + """ + def __get__(self): + return not self.is_open() + + property filename: + """string with the filename associated with this object.""" + def __get__(self): + return self._filename + + def __iter__(self): + if not self.is_open(): + raise ValueError("I/O operation on closed file") + return self + + cdef kseq_t * getCurrent(self): + return self.entry + + cdef int cnext(self): + '''C version of iterator + ''' + with nogil: + return kseq_read(self.entry) + + def __next__(self): + """ + python version of next(). + """ + cdef int l + with nogil: + l = kseq_read(self.entry) + if (l >= 0): + if self.persist: + return FastxRecord(proxy=makeFastqProxy(self.entry)) + return makeFastqProxy(self.entry) + elif (l == -1): + raise StopIteration + elif (l == -2): + raise ValueError('truncated quality string in {0}' + .format(self._filename)) + else: + raise ValueError('unknown problem parsing {0}' + .format(self._filename)) + +# Compatibility Layer for pysam 0.8.1 +cdef class FastqFile(FastxFile): + """FastqFile is deprecated: use FastxFile instead""" + pass + +# Compatibility Layer for pysam < 0.8 +cdef class Fastafile(FastaFile): + """Fastafile is deprecated: use FastaFile instead""" + pass + +__all__ = ["FastaFile", + "FastqFile", + "FastxFile", + "Fastafile", + "FastxRecord", + "FastqProxy"] diff --git a/pysam/libchtslib.pxd b/pysam/libchtslib.pxd new file mode 100644 index 0000000..ed3ca92 --- /dev/null +++ b/pysam/libchtslib.pxd @@ -0,0 +1,2693 @@ +from libc.stdint cimport int8_t, int16_t, int32_t, int64_t +from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t +from libc.stdlib cimport malloc, calloc, realloc, free +from libc.string cimport memcpy, memcmp, strncpy, strlen, strdup +from libc.stdio cimport FILE, printf +from posix.types cimport off_t + +cdef extern from "Python.h": + FILE* PyFile_AsFile(object) + + +# cython does not wrap stdarg +cdef extern from "stdarg.h": + ctypedef struct va_list: + pass + + +cdef extern from "htslib/kstring.h" nogil: + ctypedef struct kstring_t: + size_t l, m + char *s + + int kputc(int c, kstring_t *s) + int kputw(int c, kstring_t *s) + int kputl(long c, kstring_t *s) + int ksprintf(kstring_t *s, const char *fmt, ...) + + +cdef extern from "htslib_util.h" nogil: + int hts_set_verbosity(int verbosity) + int hts_get_verbosity() + + ctypedef uint32_t khint32_t + ctypedef uint32_t khint_t + ctypedef khint_t khiter_t + + # Used to manage BCF Header info + ctypedef struct vdict_t: + khint_t n_buckets, size, n_occupied, upper_bound + khint32_t *flags + const char *keys + bcf_idinfo_t *vals + + # Used to manage indexed contigs in Tabix + ctypedef struct s2i_t: + khint_t n_buckets, size, n_occupied, upper_bound + khint32_t *flags + const char *keys + int64_t *vals + + # Generic khash methods + khint_t kh_size(void *d) + khint_t kh_begin(void *d) + khint_t kh_end(void *d) + int kh_exist(void *d, khiter_t i) + + # Specialized khash methods for vdict + khint_t kh_get_vdict(vdict_t *d, const char *key) + const char *kh_key_vdict "kh_key" (vdict_t *d, khint_t i) + bcf_idinfo_t kh_val_vdict "kh_val" (vdict_t *d, khint_t i) + + +cdef extern from "htslib/hfile.h" nogil: + ctypedef struct hFILE + + # @abstract Open the named file or URL as a stream + # @return An hFILE pointer, or NULL (with errno set) if an error occurred. + hFILE *hopen(const char *filename, const char *mode, ...) + + # @abstract Associate a stream with an existing open file descriptor + # @return An hFILE pointer, or NULL (with errno set) if an error occurred. + # @notes For socket descriptors (on Windows), mode should contain 's'. + hFILE *hdopen(int fd, const char *mode) + + # @abstract Report whether the file name or URL denotes remote storage + # @return 0 if local, 1 if remote. + # @notes "Remote" means involving e.g. explicit network access, with the + # implication that callers may wish to cache such files' contents locally. + int hisremote(const char *filename) + + # @abstract Flush (for output streams) and close the stream + # @return 0 if successful, or EOF (with errno set) if an error occurred. + int hclose(hFILE *fp) + + # @abstract Close the stream, without flushing or propagating errors + # @notes For use while cleaning up after an error only. Preserves errno. + void hclose_abruptly(hFILE *fp) + + # @abstract Return the stream's error indicator + # @return Non-zero (in fact, an errno value) if an error has occurred. + # @notes This would be called herror() and return true/false to parallel + # ferror(3), but a networking-related herror(3) function already exists. */ + int herrno(hFILE *fp) + + # @abstract Clear the stream's error indicator + void hclearerr(hFILE *fp) + + # @abstract Reposition the read/write stream offset + # @return The resulting offset within the stream (as per lseek(2)), + # or negative if an error occurred. + off_t hseek(hFILE *fp, off_t offset, int whence) + + # @abstract Report the current stream offset + # @return The offset within the stream, starting from zero. + off_t htell(hFILE *fp) + + # @abstract Read one character from the stream + # @return The character read, or EOF on end-of-file or error + int hgetc(hFILE *fp) + + # Read from the stream until the delimiter, up to a maximum length + # @param buffer The buffer into which bytes will be written + # @param size The size of the buffer + # @param delim The delimiter (interpreted as an `unsigned char`) + # @param fp The file stream + # @return The number of bytes read, or negative on error. + # @since 1.4 + # + # Bytes will be read into the buffer up to and including a delimiter, until + # EOF is reached, or _size-1_ bytes have been written, whichever comes first. + # The string will then be terminated with a NUL byte (`\0`). + ssize_t hgetdelim(char *buffer, size_t size, int delim, hFILE *fp) + + # Read a line from the stream, up to a maximum length + # @param buffer The buffer into which bytes will be written + # @param size The size of the buffer + # @param fp The file stream + # @return The number of bytes read, or negative on error. + # @since 1.4 + # + # Specialization of hgetdelim() for a `\n` delimiter. + ssize_t hgetln(char *buffer, size_t size, hFILE *fp) + + # Read a line from the stream, up to a maximum length + # @param buffer The buffer into which bytes will be written + # @param size The size of the buffer (must be > 1 to be useful) + # @param fp The file stream + # @return _buffer_ on success, or `NULL` if an error occurred. + # @since 1.4 + # + # This function can be used as a replacement for `fgets(3)`, or together with + # kstring's `kgetline()` to read arbitrarily-long lines into a _kstring_t_. + char *hgets(char *buffer, int size, hFILE *fp) + + # @abstract Peek at characters to be read without removing them from buffers + # @param fp The file stream + # @param buffer The buffer to which the peeked bytes will be written + # @param nbytes The number of bytes to peek at; limited by the size of the + # internal buffer, which could be as small as 4K. + # @return The number of bytes peeked, which may be less than nbytes if EOF + # is encountered; or negative, if there was an I/O error. + # @notes The characters peeked at remain in the stream's internal buffer, + # and will be returned by later hread() etc calls. + ssize_t hpeek(hFILE *fp, void *buffer, size_t nbytes) + + # @abstract Read a block of characters from the file + # @return The number of bytes read, or negative if an error occurred. + # @notes The full nbytes requested will be returned, except as limited + # by EOF or I/O errors. + ssize_t hread(hFILE *fp, void *buffer, size_t nbytes) + + # @abstract Write a character to the stream + # @return The character written, or EOF if an error occurred. + int hputc(int c, hFILE *fp) + + # @abstract Write a string to the stream + # @return 0 if successful, or EOF if an error occurred. + int hputs(const char *text, hFILE *fp) + + # @abstract Write a block of characters to the file + # @return Either nbytes, or negative if an error occurred. + # @notes In the absence of I/O errors, the full nbytes will be written. + ssize_t hwrite(hFILE *fp, const void *buffer, size_t nbytes) + + # @abstract For writing streams, flush buffered output to the underlying stream + # @return 0 if successful, or EOF if an error occurred. + int hflush(hFILE *fp) + + +cdef extern from "htslib/bgzf.h" nogil: + ctypedef struct bgzf_mtaux_t + ctypedef struct bgzidx_t + ctypedef struct z_stream + + ctypedef struct BGZF: + unsigned errcode + unsigned is_write + int is_be + int compress_level + int is_compressed + int is_gzip + int cache_size + int64_t block_address + int64_t uncompressed_address + void *uncompressed_block + void *compressed_block + void *cache + hFILE *fp + bgzf_mtaux_t *mt + bgzidx_t *idx + int idx_build_otf + z_stream *gz_stream + + #***************** + # Basic routines * + # *****************/ + + # Open an existing file descriptor for reading or writing. + # + # @param fd file descriptor + # @param mode mode matching /[rwag][u0-9]+/: 'r' for reading, 'w' for + # writing, 'a' for appending, 'g' for gzip rather than BGZF + # compression (with 'w' only), and digit specifies the zlib + # compression level. + # Note that there is a distinction between 'u' and '0': the + # first yields plain uncompressed output whereas the latter + # outputs uncompressed data wrapped in the zlib format. + # @return BGZF file handler; 0 on error + + BGZF* bgzf_dopen(int fd, const char *mode) + BGZF* bgzf_fdopen(int fd, const char *mode) # for backward compatibility + + # Open the specified file for reading or writing. + BGZF* bgzf_open(const char* path, const char *mode) + + # Open an existing hFILE stream for reading or writing. + BGZF* bgzf_hopen(hFILE *fp, const char *mode) + + # Close the BGZF and free all associated resources. + # + # @param fp BGZF file handler + # @return 0 on success and -1 on error + int bgzf_close(BGZF *fp) + + # Read up to _length_ bytes from the file storing into _data_. + # + # @param fp BGZF file handler + # @param data data array to read into + # @param length size of data to read + # @return number of bytes actually read; 0 on end-of-file and -1 on error + ssize_t bgzf_read(BGZF *fp, void *data, size_t length) + + # Write _length_ bytes from _data_ to the file. If no I/O errors occur, + # the complete _length_ bytes will be written (or queued for writing). + # + # @param fp BGZF file handler + # @param data data array to write + # @param length size of data to write + # @return number of bytes written (i.e., _length_); negative on error + ssize_t bgzf_write(BGZF *fp, const void *data, size_t length) + + # Read up to _length_ bytes directly from the underlying stream without + # decompressing. Bypasses BGZF blocking, so must be used with care in + # specialised circumstances only. + # + # @param fp BGZF file handler + # @param data data array to read into + # @param length number of raw bytes to read + # @return number of bytes actually read; 0 on end-of-file and -1 on error + ssize_t bgzf_raw_read(BGZF *fp, void *data, size_t length) + + # Write _length_ bytes directly to the underlying stream without + # compressing. Bypasses BGZF blocking, so must be used with care + # in specialised circumstances only. + # + # @param fp BGZF file handler + # @param data data array to write + # @param length number of raw bytes to write + # @return number of bytes actually written; -1 on error + ssize_t bgzf_raw_write(BGZF *fp, const void *data, size_t length) + + # Write the data in the buffer to the file. + int bgzf_flush(BGZF *fp) + + int SEEK_SET + + # Return a virtual file pointer to the current location in the file. + # No interpretation of the value should be made, other than a subsequent + # call to bgzf_seek can be used to position the file at the same point. + # Return value is non-negative on success. + int64_t bgzf_tell(BGZF *fp) + + # Set the file to read from the location specified by _pos_. + # + # @param fp BGZF file handler + # @param pos virtual file offset returned by bgzf_tell() + # @param whence must be SEEK_SET + # @return 0 on success and -1 on error + # / + int64_t bgzf_seek(BGZF *fp, int64_t pos, int whence) + + # Check if the BGZF end-of-file (EOF) marker is present + # + # @param fp BGZF file handler opened for reading + # @return 1 if the EOF marker is present and correct + # 2 if it can't be checked, e.g., because fp isn't seekable + # 0 if the EOF marker is absent + # -1 (with errno set) on error + int bgzf_check_EOF(BGZF *fp) + + # Check if a file is in the BGZF format + # + # @param fn file name + # @return 1 if _fn_ is BGZF; 0 if not or on I/O error + int bgzf_is_bgzf(const char *fn) + + #********************* + # Advanced routines * + #********************* + + # Set the cache size. Only effective when compiled with -DBGZF_CACHE. + # + # @param fp BGZF file handler + # @param size size of cache in bytes; 0 to disable caching (default) + void bgzf_set_cache_size(BGZF *fp, int size) + + # Flush the file if the remaining buffer size is smaller than _size_ + # @return 0 if flushing succeeded or was not needed; negative on error + int bgzf_flush_try(BGZF *fp, ssize_t size) + + # Read one byte from a BGZF file. It is faster than bgzf_read() + # @param fp BGZF file handler + # @return byte read; -1 on end-of-file or error + int bgzf_getc(BGZF *fp) + + # Read one line from a BGZF file. It is faster than bgzf_getc() + # + # @param fp BGZF file handler + # @param delim delimiter + # @param str string to write to; must be initialized + # @return length of the string; 0 on end-of-file; negative on error + int bgzf_getline(BGZF *fp, int delim, kstring_t *str) + + # Read the next BGZF block. + int bgzf_read_block(BGZF *fp) + + # Enable multi-threading (only effective on writing and when the + # library was compiled with -DBGZF_MT) + # + # @param fp BGZF file handler; must be opened for writing + # @param n_threads #threads used for writing + # @param n_sub_blks #blocks processed by each thread; a value 64-256 is recommended + int bgzf_mt(BGZF *fp, int n_threads, int n_sub_blks) + + + # Compress a single BGZF block. + # + # @param dst output buffer (must have size >= BGZF_MAX_BLOCK_SIZE) + # @param dlen size of output buffer; updated on return to the number + # of bytes actually written to dst + # @param src buffer to be compressed + # @param slen size of data to compress (must be <= BGZF_BLOCK_SIZE) + # @param level compression level + # @return 0 on success and negative on error + # + int bgzf_compress(void *dst, size_t *dlen, const void *src, size_t slen, int level) + + #******************* + # bgzidx routines * + # BGZF at the uncompressed offset + # + # @param fp BGZF file handler; must be opened for reading + # @param uoffset file offset in the uncompressed data + # @param where SEEK_SET supported atm + # + # Returns 0 on success and -1 on error. + int bgzf_useek(BGZF *fp, long uoffset, int where) + + # Position in uncompressed BGZF + # + # @param fp BGZF file handler; must be opened for reading + # + # Returns the current offset on success and -1 on error. + long bgzf_utell(BGZF *fp) + + # Tell BGZF to build index while compressing. + # + # @param fp BGZF file handler; can be opened for reading or writing. + # + # Returns 0 on success and -1 on error. + int bgzf_index_build_init(BGZF *fp) + + # Load BGZF index + # + # @param fp BGZF file handler + # @param bname base name + # @param suffix suffix to add to bname (can be NULL) + # + # Returns 0 on success and -1 on error. + int bgzf_index_load(BGZF *fp, const char *bname, const char *suffix) + + # Save BGZF index + # + # @param fp BGZF file handler + # @param bname base name + # @param suffix suffix to add to bname (can be NULL) + # + # Returns 0 on success and -1 on error. + int bgzf_index_dump(BGZF *fp, const char *bname, const char *suffix) + + +cdef extern from "htslib/hts.h" nogil: + uint32_t kroundup32(uint32_t x) + + ctypedef struct cram_fd + + union FilePointerUnion: + BGZF *bgzf + cram_fd *cram + hFILE *hfile + void *voidp + + enum htsFormatCategory: + unknown_category + sequence_data # Sequence data -- SAM, BAM, CRAM, etc + variant_data # Variant calling data -- VCF, BCF, etc + index_file # Index file associated with some data file + region_list # Coordinate intervals or regions -- BED, etc + category_maximum + + enum htsExactFormat: + unknown_format + binary_format + text_format + sam, bam, bai, cram, crai, vcf, bcf, csi, gzi, tbi, bed + format_maximum + + enum htsCompression: + no_compression, gzip, bgzf, custom + compression_maximum + + cdef enum hts_fmt_option: + CRAM_OPT_DECODE_MD, + CRAM_OPT_PREFIX, + CRAM_OPT_VERBOSITY, + CRAM_OPT_SEQS_PER_SLICE, + CRAM_OPT_SLICES_PER_CONTAINER, + CRAM_OPT_RANGE, + CRAM_OPT_VERSION, + CRAM_OPT_EMBED_REF, + CRAM_OPT_IGNORE_MD5, + CRAM_OPT_REFERENCE, + CRAM_OPT_MULTI_SEQ_PER_SLICE, + CRAM_OPT_NO_REF, + CRAM_OPT_USE_BZIP2, + CRAM_OPT_SHARED_REF, + CRAM_OPT_NTHREADS, + CRAM_OPT_THREAD_POOL, + CRAM_OPT_USE_LZMA, + CRAM_OPT_USE_RANS, + CRAM_OPT_REQUIRED_FIELDS, + HTS_OPT_COMPRESSION_LEVEL, + HTS_OPT_NTHREADS, + + ctypedef struct htsVersion: + short major, minor + + ctypedef struct htsFormat: + htsFormatCategory category + htsExactFormat format + htsVersion version + htsCompression compression + short compression_level + void *specific + + ctypedef struct htsFile: + uint8_t is_bin + uint8_t is_write + uint8_t is_be + uint8_t is_cram + int64_t lineno + kstring_t line + char *fn + char *fn_aux + FilePointerUnion fp + htsFormat format + + int hts_verbose + + cdef union hts_opt_val_union: + int i + char *s + + ctypedef struct hts_opt: + char *arg + hts_fmt_option opt + hts_opt_val_union val + void *next + + # @abstract Parses arg and appends it to the option list. + # @return 0 on success and -1 on failure + int hts_opt_add(hts_opt **opts, const char *c_arg) + + # @abstract Applies an hts_opt option list to a given htsFile. + # @return 0 on success and -1 on failure + int hts_opt_apply(htsFile *fp, hts_opt *opts) + + # @abstract Frees an hts_opt list. + void hts_opt_free(hts_opt *opts) + + # @abstract Table for converting a nucleotide character to 4-bit encoding. + # The input character may be either an IUPAC ambiguity code, '=' for 0, or + # '0'/'1'/'2'/'3' for a result of 1/2/4/8. The result is encoded as 1/2/4/8 + # for A/C/G/T or combinations of these bits for ambiguous bases. + const unsigned char *seq_nt16_table + + # @abstract Table for converting a 4-bit encoded nucleotide to an IUPAC + # ambiguity code letter (or '=' when given 0). + const char *seq_nt16_str + + # @abstract Table for converting a 4-bit encoded nucleotide to about 2 bits. + # Returns 0/1/2/3 for 1/2/4/8 (i.e., A/C/G/T), or 4 otherwise (0 or ambiguous). + const int *seq_nt16_int + + # @abstract Get the htslib version number + # @return For released versions, a string like "N.N[.N]"; or git describe + # output if using a library built within a Git repository. + const char *hts_version() + + # @abstract Determine format by peeking at the start of a file + # @param fp File opened for reading, positioned at the beginning + # @param fmt Format structure that will be filled out on return + # @return 0 for success, or negative if an error occurred. + int hts_detect_format(hFILE *fp, htsFormat *fmt) + + # @abstract Get a human-readable description of the file format + # @return Description string, to be freed by the caller after use. + char *hts_format_description(const htsFormat *format) + + # @abstract Open a SAM/BAM/CRAM/VCF/BCF/etc file + # @param fn The file name or "-" for stdin/stdout + # @param mode Mode matching / [rwa][bceguxz0-9]* / + # @discussion + # With 'r' opens for reading; any further format mode letters are ignored + # as the format is detected by checking the first few bytes or BGZF blocks + # of the file. With 'w' or 'a' opens for writing or appending, with format + # specifier letters: + # b binary format (BAM, BCF, etc) rather than text (SAM, VCF, etc) + # c CRAM format + # g gzip compressed + # u uncompressed + # z bgzf compressed + # [0-9] zlib compression level + # and with non-format option letters (for any of 'r'/'w'/'a'): + # e close the file on exec(2) (opens with O_CLOEXEC, where supported) + # x create the file exclusively (opens with O_EXCL, where supported) + # Note that there is a distinction between 'u' and '0': the first yields + # plain uncompressed output whereas the latter outputs uncompressed data + # wrapped in the zlib format. + # @example + # [rw]b .. compressed BCF, BAM, FAI + # [rw]bu .. uncompressed BCF + # [rw]z .. compressed VCF + # [rw] .. uncompressed VCF + htsFile *hts_open(const char *fn, const char *mode) + + # @abstract Open a SAM/BAM/CRAM/VCF/BCF/etc file + # @param fn The file name or "-" for stdin/stdout + # @param mode Open mode, as per hts_open() + # @param fmt Optional format specific parameters + # @discussion + # See hts_open() for description of fn and mode. + # // TODO Update documentation for s/opts/fmt/ + # Opts contains a format string (sam, bam, cram, vcf, bcf) which will, + # if defined, override mode. Opts also contains a linked list of hts_opt + # structures to apply to the open file handle. These can contain things + # like pointers to the reference or information on compression levels, + # block sizes, etc. + htsFile *hts_open_format(const char *fn, const char *mode, const htsFormat *fmt) + + # @abstract Open an existing stream as a SAM/BAM/CRAM/VCF/BCF/etc file + # @param fp The already-open file handle + # @param fn The file name or "-" for stdin/stdout + # @param mode Open mode, as per hts_open() + htsFile *hts_hopen(hFILE *fp, const char *fn, const char *mode) + + # @abstract Close a file handle, flushing buffered data for output streams + # @param fp The file handle to be closed + # @return 0 for success, or negative if an error occurred. + int hts_close(htsFile *fp) + + # @abstract Returns the file's format information + # @param fp The file handle + # @return Read-only pointer to the file's htsFormat. + const htsFormat *hts_get_format(htsFile *fp) + + # @ abstract Returns a string containing the file format extension. + # @ param format Format structure containing the file type. + # @ return A string ("sam", "bam", etc) or "?" for unknown formats. + const char *hts_format_file_extension(const htsFormat *format) + + # @abstract Sets a specified CRAM option on the open file handle. + # @param fp The file handle open the open file. + # @param opt The CRAM_OPT_* option. + # @param ... Optional arguments, dependent on the option used. + # @return 0 for success, or negative if an error occurred. + int hts_set_opt(htsFile *fp, hts_fmt_option opt, ...) + + int hts_getline(htsFile *fp, int delimiter, kstring_t *str) + char **hts_readlines(const char *fn, int *_n) + + # @abstract Parse comma-separated list or read list from a file + # @param list File name or comma-separated list + # @param is_file + # @param _n Size of the output array (number of items read) + # @return NULL on failure or pointer to newly allocated array of + # strings + char **hts_readlist(const char *fn, int is_file, int *_n) + + # @abstract Create extra threads to aid compress/decompression for this file + # @param fp The file handle + # @param n The number of worker threads to create + # @return 0 for success, or negative if an error occurred. + # @notes THIS THREADING API IS LIKELY TO CHANGE IN FUTURE. + int hts_set_threads(htsFile *fp, int n) + + # @abstract Set .fai filename for a file opened for reading + # @return 0 for success, negative on failure + # @discussion + # Called before *_hdr_read(), this provides the name of a .fai file + # used to provide a reference list if the htsFile contains no @SQ headers. + int hts_set_fai_filename(htsFile *fp, const char *fn_aux) + + int8_t HTS_IDX_NOCOOR + int8_t HTS_IDX_START + int8_t HTS_IDX_REST + int8_t HTS_IDX_NONE + + int8_t HTS_FMT_CSI + int8_t HTS_FMT_BAI + int8_t HTS_FMT_TBI + int8_t HTS_FMT_CRAI + + BGZF *hts_get_bgzfp(htsFile *fp) + + ctypedef struct hts_idx_t + + ctypedef struct hts_pair64_t: + uint64_t u, v + + ctypedef int hts_readrec_func(BGZF *fp, void *data, void *r, int *tid, int *beg, int *end) + + ctypedef struct hts_bins_t: + int n, m + int *a + + ctypedef struct hts_itr_t: + uint32_t read_rest + uint32_t finished + int tid, bed, end, n_off, i + int curr_tid, curr_beg, curr_end + uint64_t curr_off + hts_pair64_t *off + hts_readrec_func *readfunc + hts_bins_t bins + + hts_idx_t *hts_idx_init(int n, int fmt, uint64_t offset0, int min_shift, int n_lvls) + void hts_idx_destroy(hts_idx_t *idx) + int hts_idx_push(hts_idx_t *idx, int tid, int beg, int end, uint64_t offset, int is_mapped) + void hts_idx_finish(hts_idx_t *idx, uint64_t final_offset) + + #### Save an index to a file + # @param idx Index to be written + # @param fn Input BAM/BCF/etc filename, to which .bai/.csi/etc will be added + # @param fmt One of the HTS_FMT_* index formats + # @return 0 if successful, or negative if an error occurred. + int hts_idx_save(const hts_idx_t *idx, const char *fn, int fmt) + + #### Save an index to a specific file + # @param idx Index to be written + # @param fn Input BAM/BCF/etc filename + # @param fnidx Output filename, or NULL to add .bai/.csi/etc to @a fn + # @param fmt One of the HTS_FMT_* index formats + # @return 0 if successful, or negative if an error occurred. + int hts_idx_save_as(const hts_idx_t *idx, const char *fn, const char *fnidx, int fmt) + + #### Load an index file + # @param fn BAM/BCF/etc filename, to which .bai/.csi/etc will be added or + # the extension substituted, to search for an existing index file + # @param fmt One of the HTS_FMT_* index formats + # @return The index, or NULL if an error occurred. + hts_idx_t *hts_idx_load(const char *fn, int fmt) + + #### Load a specific index file + # @param fn Input BAM/BCF/etc filename + # @param fnidx The input index filename + # @return The index, or NULL if an error occurred. + hts_idx_t *hts_idx_load2(const char *fn, const char *fnidx) + + uint8_t *hts_idx_get_meta(hts_idx_t *idx, uint32_t *l_meta) + void hts_idx_set_meta(hts_idx_t *idx, int l_meta, uint8_t *meta, int is_copy) + + int hts_idx_get_stat(const hts_idx_t* idx, int tid, + uint64_t* mapped, uint64_t* unmapped) + + uint64_t hts_idx_get_n_no_coor(const hts_idx_t* idx) + + int HTS_PARSE_THOUSANDS_SEP # Ignore ',' separators within numbers + + # Parse a numeric string + # The number may be expressed in scientific notation, and optionally may + # contain commas in the integer part (before any decimal point or E notation). + # @param str String to be parsed + # @param strend If non-NULL, set on return to point to the first character + # in @a str after those forming the parsed number + # @param flags Or'ed-together combination of HTS_PARSE_* flags + # @return Converted value of the parsed number. + # + # When @a strend is NULL, a warning will be printed (if hts_verbose is 2 + # or more) if there are any trailing characters after the number. + long long hts_parse_decimal(const char *str, char **strend, int flags) + + # Parse a "CHR:START-END"-style region string + # @param str String to be parsed + # @param beg Set on return to the 0-based start of the region + # @param end Set on return to the 1-based end of the region + # @return Pointer to the colon or '\0' after the reference sequence name, + # or NULL if @a str could not be parsed. + const char *hts_parse_reg(const char *str, int *beg, int *end) + + hts_itr_t *hts_itr_query(const hts_idx_t *idx, int tid, int beg, int end, hts_readrec_func *readrec) + void hts_itr_destroy(hts_itr_t *iter) + + ctypedef int (*hts_name2id_f)(void*, const char*) + ctypedef const char *(*hts_id2name_f)(void*, int) + ctypedef hts_itr_t *hts_itr_query_func( + const hts_idx_t *idx, + int tid, + int beg, + int end, + hts_readrec_func *readrec) + + hts_itr_t *hts_itr_querys( + const hts_idx_t *idx, + const char *reg, + hts_name2id_f getid, + void *hdr, + hts_itr_query_func *itr_query, + hts_readrec_func *readrec) + + int hts_itr_next(BGZF *fp, hts_itr_t *iter, void *r, void *data) + const char **hts_idx_seqnames(const hts_idx_t *idx, int *n, hts_id2name_f getid, void *hdr) # free only the array, not the values + + # hts_file_type() - Convenience function to determine file type + # @fname: the file name + # + # Returns one of the FT_* defines. + # + # DEPRECATED: This function has been replaced by hts_detect_format(). + # It and these FT_* macros will be removed in a future HTSlib release. + int FT_UNKN + int FT_GZ + int FT_VCF + int FT_VCF_GZ + int FT_BCF + int FT_BCF_GZ + int FT_STDIN + + int hts_file_type(const char *fname) + + # /*************************** + # * Revised MAQ error model * + # ***************************/ + + ctypedef struct errmod_t + + errmod_t *errmod_init(double depcorr) + void errmod_destroy(errmod_t *em) + + # /* + # n: number of bases + # m: maximum base + # bases[i]: qual:6, strand:1, base:4 + # q[i*m+j]: phred-scaled likelihood of (i,j) + # */ + int errmod_cal(const errmod_t *em, int n, int m, uint16_t *bases, float *Probabilistic) + + # /***************************************** + # * q banded glocal alignment * + # *****************************************/ + + ctypedef struct probaln_par_t: + float d, e + int bw + + int probaln_glocal(const uint8_t *ref, + int l_ref, + const uint8_t *query, + int l_query, const uint8_t *iqual, + const probaln_par_t *c, + int *state, uint8_t *q) + + # /********************** + # * MD5 implementation * + # **********************/ + + ctypedef struct hts_md5_context + + # /*! @abstract Initialises an MD5 context. + # * @discussion + # * The expected use is to allocate an hts_md5_context using + # * hts_md5_init(). This pointer is then passed into one or more calls + # * of hts_md5_update() to compute successive internal portions of the + # * MD5 sum, which can then be externalised as a full 16-byte MD5sum + # * calculation by calling hts_md5_final(). This can then be turned + # * into ASCII via hts_md5_hex(). + # * + # * To dealloate any resources created by hts_md5_init() call the + # * hts_md5_destroy() function. + # * + # * @return hts_md5_context pointer on success, NULL otherwise. + # */ + hts_md5_context *hts_md5_init() + + # /*! @abstract Updates the context with the MD5 of the data. */ + void hts_md5_update(hts_md5_context *ctx, const void *data, unsigned long size) + + # /*! @abstract Computes the final 128-bit MD5 hash from the given context */ + void hts_md5_final(unsigned char *digest, hts_md5_context *ctx) + + # /*! @abstract Resets an md5_context to the initial state, as returned + # * by hts_md5_init(). + # */ + void hts_md5_reset(hts_md5_context *ctx) + + # /*! @abstract Converts a 128-bit MD5 hash into a 33-byte nul-termninated + # * hex string. + # */ + void hts_md5_hex(char *hex, const unsigned char *digest) + + # /*! @abstract Deallocates any memory allocated by hts_md5_init. */ + void hts_md5_destroy(hts_md5_context *ctx) + + int hts_reg2bin(int64_t beg, int64_t end, int min_shift, int n_lvls) + int hts_bin_bot(int bin, int n_lvls) + + # * Endianness * + int ed_is_big() + uint16_t ed_swap_2(uint16_t v) + void *ed_swap_2p(void *x) + uint32_t ed_swap_4(uint32_t v) + void *ed_swap_4p(void *x) + uint64_t ed_swap_8(uint64_t v) + void *ed_swap_8p(void *x) + + +cdef extern from "htslib/sam.h" nogil: + #********************** + #*** SAM/BAM header *** + #********************** + + # @abstract Structure for the alignment header. + # @field n_targets number of reference sequences + # @field l_text length of the plain text in the header + # @field target_len lengths of the reference sequences + # @field target_name names of the reference sequences + # @field text plain text + # @field sdict header dictionary + + ctypedef struct bam_hdr_t: + int32_t n_targets, ignore_sam_err + uint32_t l_text + uint32_t *target_len + uint8_t *cigar_tab + char **target_name + char *text + void *sdict + + #**************************** + #*** CIGAR related macros *** + #**************************** + + int BAM_CMATCH + int BAM_CINS + int BAM_CDEL + int BAM_CREF_SKIP + int BAM_CSOFT_CLIP + int BAM_CHARD_CLIP + int BAM_CPAD + int BAM_CEQUAL + int BAM_CDIFF + int BAM_CBACK + + char *BAM_CIGAR_STR + int BAM_CIGAR_SHIFT + uint32_t BAM_CIGAR_MASK + uint32_t BAM_CIGAR_TYPE + + char bam_cigar_op(uint32_t c) + uint32_t bam_cigar_oplen(uint32_t c) + char bam_cigar_opchr(uint32_t) + uint32_t bam_cigar_gen(char, uint32_t) + int bam_cigar_type(char o) + + # @abstract the read is paired in sequencing, no matter whether it is mapped in a pair + int BAM_FPAIRED + # @abstract the read is mapped in a proper pair + int BAM_FPROPER_PAIR + # @abstract the read itself is unmapped; conflictive with BAM_FPROPER_PAIR + int BAM_FUNMAP + # @abstract the mate is unmapped + int BAM_FMUNMAP + # @abstract the read is mapped to the reverse strand + int BAM_FREVERSE + # @abstract the mate is mapped to the reverse strand + int BAM_FMREVERSE + # @abstract this is read1 + int BAM_FREAD1 + # @abstract this is read2 + int BAM_FREAD2 + # @abstract not primary alignment + int BAM_FSECONDARY + # @abstract QC failure + int BAM_FQCFAIL + # @abstract optical or PCR duplicate + int BAM_FDUP + # @abstract supplementary alignment + int BAM_FSUPPLEMENTARY + + #************************* + #*** Alignment records *** + #************************* + + # @abstract Structure for core alignment information. + # @field tid chromosome ID, defined by bam_hdr_t + # @field pos 0-based leftmost coordinate + # @field bin bin calculated by bam_reg2bin() + # @field qual mapping quality + # @field l_qname length of the query name + # @field flag bitwise flag + # @field n_cigar number of CIGAR operations + # @field l_qseq length of the query sequence (read) + # @field mtid chromosome ID of next read in template, defined by bam_hdr_t + # @field mpos 0-based leftmost coordinate of next read in template + + ctypedef struct bam1_core_t: + int32_t tid + int32_t pos + uint16_t bin + uint8_t qual + uint8_t l_qname + uint16_t flag + uint8_t unused1 + uint8_t l_extranul + uint32_t n_cigar + int32_t l_qseq + int32_t mtid + int32_t mpos + int32_t isize + + # @abstract Structure for one alignment. + # @field core core information about the alignment + # @field l_data current length of bam1_t::data + # @field m_data maximum length of bam1_t::data + # @field data all variable-length data, concatenated; structure: qname-cigar-seq-qual-aux + # + # @discussion Notes: + # + # 1. qname is zero tailing and core.l_qname includes the tailing '\0'. + # 2. l_qseq is calculated from the total length of an alignment block + # on reading or from CIGAR. + # 3. cigar data is encoded 4 bytes per CIGAR operation. + # 4. seq is nybble-encoded according to seq_nt16_table. + ctypedef struct bam1_t: + bam1_core_t core + int l_data + uint32_t m_data + uint8_t *data + uint64_t id + + # @abstract Get whether the query is on the reverse strand + # @param b pointer to an alignment + # @return boolean true if query is on the reverse strand + int bam_is_rev(bam1_t *b) + + # @abstract Get whether the query's mate is on the reverse strand + # @param b pointer to an alignment + # @return boolean true if query's mate on the reverse strand + int bam_is_mrev(bam1_t *b) + + # @abstract Get the name of the query + # @param b pointer to an alignment + # @return pointer to the name string, null terminated + char *bam_get_qname(bam1_t *b) + + # @abstract Get the CIGAR array + # @param b pointer to an alignment + # @return pointer to the CIGAR array + # + # @discussion In the CIGAR array, each element is a 32-bit integer. The + # lower 4 bits gives a CIGAR operation and the higher 28 bits keep the + # length of a CIGAR. + uint32_t *bam_get_cigar(bam1_t *b) + + # @abstract Get query sequence + # @param b pointer to an alignment + # @return pointer to sequence + # + # @discussion Each base is encoded in 4 bits: 1 for A, 2 for C, 4 for G, + # 8 for T and 15 for N. Two bases are packed in one byte with the base + # at the higher 4 bits having smaller coordinate on the read. It is + # recommended to use bam_seqi() macro to get the base. + char *bam_get_seq(bam1_t *b) + + # @abstract Get query quality + # @param b pointer to an alignment + # @return pointer to quality string + uint8_t *bam_get_qual(bam1_t *b) + + # @abstract Get auxiliary data + # @param b pointer to an alignment + # @return pointer to the concatenated auxiliary data + uint8_t *bam_get_aux(bam1_t *b) + + # @abstract Get length of auxiliary data + # @param b pointer to an alignment + # @return length of the concatenated auxiliary data + int bam_get_l_aux(bam1_t *b) + + # @abstract Get a base on read + # @param s Query sequence returned by bam1_seq() + # @param i The i-th position, 0-based + # @return 4-bit integer representing the base. + char bam_seqi(char *s, int i) + + #************************** + #*** Exported functions *** + #************************** + + #*************** + #*** BAM I/O *** + #*************** + + bam_hdr_t *bam_hdr_init() + bam_hdr_t *bam_hdr_read(BGZF *fp) + int bam_hdr_write(BGZF *fp, const bam_hdr_t *h) + void bam_hdr_destroy(bam_hdr_t *h) + int bam_name2id(bam_hdr_t *h, const char *ref) + bam_hdr_t* bam_hdr_dup(const bam_hdr_t *h0) + + bam1_t *bam_init1() + void bam_destroy1(bam1_t *b) + int bam_read1(BGZF *fp, bam1_t *b) + int bam_write1(BGZF *fp, const bam1_t *b) + bam1_t *bam_copy1(bam1_t *bdst, const bam1_t *bsrc) + bam1_t *bam_dup1(const bam1_t *bsrc) + + int bam_cigar2qlen(int n_cigar, const uint32_t *cigar) + int bam_cigar2rlen(int n_cigar, const uint32_t *cigar) + + # @abstract Calculate the rightmost base position of an alignment on the + # reference genome. + + # @param b pointer to an alignment + # @return the coordinate of the first base after the alignment, 0-based + + # @discussion For a mapped read, this is just b->core.pos + bam_cigar2rlen. + # For an unmapped read (either according to its flags or if it has no cigar + # string), we return b->core.pos + 1 by convention. + int32_t bam_endpos(const bam1_t *b) + + int bam_str2flag(const char *str) # returns negative value on error + char *bam_flag2str(int flag) # The string must be freed by the user + + #************************* + #*** BAM/CRAM indexing *** + #************************* + + # These BAM iterator functions work only on BAM files. To work with either + # BAM or CRAM files use the sam_index_load() & sam_itr_*() functions. + void bam_itr_destroy(hts_itr_t *iter) + hts_itr_t *bam_itr_queryi(const hts_idx_t *idx, int tid, int beg, int end) + hts_itr_t *bam_itr_querys(const hts_idx_t *idx, bam_hdr_t *hdr, const char *region) + int bam_itr_next(htsFile *htsfp, hts_itr_t *itr, void *r) + + # Load/build .csi or .bai BAM index file. Does not work with CRAM. + # It is recommended to use the sam_index_* functions below instead. + hts_idx_t *bam_index_load(const char *fn) + int bam_index_build(const char *fn, int min_shift) + + # Load a BAM (.csi or .bai) or CRAM (.crai) index file + # @param fp File handle of the data file whose index is being opened + # @param fn BAM/CRAM/etc filename to search alongside for the index file + # @return The index, or NULL if an error occurred. + hts_idx_t *sam_index_load(htsFile *fp, const char *fn) + + # Load a specific BAM (.csi or .bai) or CRAM (.crai) index file + # @param fp File handle of the data file whose index is being opened + # @param fn BAM/CRAM/etc data file filename + # @param fnidx Index filename, or NULL to search alongside @a fn + # @return The index, or NULL if an error occurred. + hts_idx_t *sam_index_load2(htsFile *fp, const char *fn, const char *fnidx) + + # Generate and save an index file + # @param fn Input BAM/etc filename, to which .csi/etc will be added + # @param min_shift Positive to generate CSI, or 0 to generate BAI + # @return 0 if successful, or negative if an error occurred (usually -1; or + # -2: opening fn failed; -3: format not indexable) + int sam_index_build(const char *fn, int min_shift) + + # Generate and save an index to a specific file + # @param fn Input BAM/CRAM/etc filename + # @param fnidx Output filename, or NULL to add .bai/.csi/etc to @a fn + # @param min_shift Positive to generate CSI, or 0 to generate BAI + # @return 0 if successful, or negative if an error occurred. + int sam_index_build2(const char *fn, const char *fnidx, int min_shift) + + void sam_itr_destroy(hts_itr_t *iter) + hts_itr_t *sam_itr_queryi(const hts_idx_t *idx, int tid, int beg, int end) + hts_itr_t *sam_itr_querys(const hts_idx_t *idx, bam_hdr_t *hdr, const char *region) + int sam_itr_next(htsFile *htsfp, hts_itr_t *itr, void *r) + + #*************** + #*** SAM I/O *** + #*************** + + htsFile *sam_open(const char *fn, const char *mode) + htsFile *sam_open_format(const char *fn, const char *mode, const htsFormat *fmt) + int sam_close(htsFile *fp) + + int sam_open_mode(char *mode, const char *fn, const char *format) + + # A version of sam_open_mode that can handle ,key=value options. + # The format string is allocated and returned, to be freed by the caller. + # Prefix should be "r" or "w", + char *sam_open_mode_opts(const char *fn, const char *mode, const char *format) + + bam_hdr_t *sam_hdr_parse(int l_text, const char *text) + bam_hdr_t *sam_hdr_read(htsFile *fp) + int sam_hdr_write(htsFile *fp, const bam_hdr_t *h) + + int sam_parse1(kstring_t *s, bam_hdr_t *h, bam1_t *b) + int sam_format1(const bam_hdr_t *h, const bam1_t *b, kstring_t *str) + int sam_read1(htsFile *fp, bam_hdr_t *h, bam1_t *b) + int sam_write1(htsFile *fp, const bam_hdr_t *h, const bam1_t *b) + + #************************************* + #*** Manipulating auxiliary fields *** + #************************************* + + uint8_t *bam_aux_get(const bam1_t *b, const char *tag) + int64_t bam_aux2i(const uint8_t *s) + double bam_aux2f(const uint8_t *s) + char bam_aux2A(const uint8_t *s) + char *bam_aux2Z(const uint8_t *s) + + void bam_aux_append(bam1_t *b, const char *tag, char type, int len, uint8_t *data) + int bam_aux_del(bam1_t *b, uint8_t *s) + + #************************** + #*** Pileup and Mpileup *** + #************************** + + # @abstract Generic pileup 'client data'. + # @discussion The pileup iterator allows setting a constructor and + # destructor function, which will be called every time a sequence is + # fetched and discarded. This permits caching of per-sequence data in + # a tidy manner during the pileup process. This union is the cached + # data to be manipulated by the "client" (the caller of pileup). + # + union bam_pileup_cd: + void *p + int64_t i + double f + + # @abstract Structure for one alignment covering the pileup position. + # @field b pointer to the alignment + # @field qpos position of the read base at the pileup site, 0-based + # @field indel indel length; 0 for no indel, positive for ins and negative for del + # @field level the level of the read in the "viewer" mode + # @field is_del 1 iff the base on the padded read is a deletion + # @field is_head ??? + # @field is_tail ??? + # @field is_refskip ??? + # @field aux ??? + # + # @discussion See also bam_plbuf_push() and bam_lplbuf_push(). The + # difference between the two functions is that the former does not + # set bam_pileup1_t::level, while the later does. Level helps the + # implementation of alignment viewers, but calculating this has some + # overhead. + # + # is_del, is_head, etc are a bit field, declaring as below should + # work as expected, see + # https://groups.google.com/forum/#!msg/cython-users/24tD1kwRY7A/pmoPuSmanM0J + + ctypedef struct bam_pileup1_t: + bam1_t *b + int32_t qpos + int indel, level + uint32_t is_del + uint32_t is_head + uint32_t is_tail + uint32_t is_refskip + uint32_t aux + bam_pileup_cd cd + + ctypedef int (*bam_plp_auto_f)(void *data, bam1_t *b) + ctypedef int (*bam_test_f)() + + ctypedef struct __bam_plp_t + ctypedef __bam_plp_t *bam_plp_t + + ctypedef struct __bam_mplp_t + ctypedef __bam_mplp_t *bam_mplp_t + + # bam_plp_init() - sets an iterator over multiple + # @func: see mplp_func in bam_plcmd.c in samtools for an example. Expected return + # status: 0 on success, -1 on end, < -1 on non-recoverable errors + # @data: user data to pass to @func + bam_plp_t bam_plp_init(bam_plp_auto_f func, void *data) + void bam_plp_destroy(bam_plp_t iter) + int bam_plp_push(bam_plp_t iter, const bam1_t *b) + const bam_pileup1_t *bam_plp_next(bam_plp_t iter, int *_tid, int *_pos, int *_n_plp) + const bam_pileup1_t *bam_plp_auto(bam_plp_t iter, int *_tid, int *_pos, int *_n_plp) + void bam_plp_set_maxcnt(bam_plp_t iter, int maxcnt) + void bam_plp_reset(bam_plp_t iter) + + bam_mplp_t bam_mplp_init(int n, bam_plp_auto_f func, void **data) + + # bam_mplp_init_overlaps() - if called, mpileup will detect overlapping + # read pairs and for each base pair set the base quality of the + # lower-quality base to zero, thus effectively discarding it from + # calling. If the two bases are identical, the quality of the other base + # is increased to the sum of their qualities (capped at 200), otherwise + # it is multiplied by 0.8. + void bam_mplp_init_overlaps(bam_mplp_t iter) + void bam_mplp_destroy(bam_mplp_t iter) + void bam_mplp_set_maxcnt(bam_mplp_t iter, int maxcnt) + int bam_mplp_auto(bam_mplp_t iter, int *_tid, int *_pos, int *n_plp, const bam_pileup1_t **plp) + void bam_mplp_reset(bam_mplp_t iter) + void bam_mplp_constructor(bam_mplp_t iter, + int (*func)(void *data, const bam1_t *b, bam_pileup_cd *cd)) + void bam_mplp_destructor(bam_mplp_t iter, + int (*func)(void *data, const bam1_t *b, bam_pileup_cd *cd)) + + # Added by AH + # ctypedef bam_pileup1_t * const_bam_pileup1_t_ptr "const bam_pileup1_t *" + + + + + # // --------------------------- + # // Base modification retrieval + + # /*! @typedef + # @abstract Holds a single base modification. + # @field modified_base The short base code (m, h, etc) or -ChEBI (negative) + # @field canonical_base The canonical base referred to in the MM tag. + # One of A, C, G, T or N. Note this may not be the + # explicit base recorded in the SEQ column (esp. if N). + # @field strand 0 or 1, indicating + or - strand from MM tag. + # @field qual Quality code (256*probability), or -1 if unknown + + # @discussion + # Note this doesn't hold any location data or information on which other + # modifications may be possible at this site. + ctypedef struct hts_base_mod: + int modified_base + int canonical_base + int strand + int qual + + # /// Allocates an hts_base_mode_state. + # /** + # * @return An hts_base_mode_state pointer on success, + # * NULL on failure. + # * + # * This just allocates the memory. The initialisation of the contents is + # * done using bam_parse_basemod. Successive calls may be made to that + # * without the need to free and allocate a new state. + # * + # * The state be destroyed using the hts_base_mode_state_free function. + # */ + ctypedef struct hts_base_mod_state + hts_base_mod_state *hts_base_mod_state_alloc() + + + # /// Destroys an hts_base_mode_state. + # /** + # * @param state The base modification state pointer. + # * + # * The should have previously been created by hts_base_mode_state_alloc. + # */ + void hts_base_mod_state_free(hts_base_mod_state *state) + + # /// Parses the Mm and Ml tags out of a bam record. + # /** + # * @param b BAM alignment record + # * @param state The base modification state pointer. + # * @return 0 on success, + # * -1 on failure. + # * + # * This fills out the contents of the modification state, resetting the + # * iterator location to the first sequence base. + # */ + int bam_parse_basemod(const bam1_t *b, hts_base_mod_state *state) + + # /// Finds the next location containing base modifications and returns them + # /** + # * @param b BAM alignment record + # * @param state The base modification state pointer. + # * @param mods A supplied array for returning base modifications + # * @param n_mods The size of the mods array + # * @return The number of modifications found on success, + # * 0 if no more modifications are present, + # * -1 on failure. + # * + # * Unlike bam_mods_at_next_pos this skips ahead to the next site + # * with modifications. + # * + # * If more than n_mods modifications are found, the total found is returned. + # * Note this means the caller needs to check whether this is higher than + # * n_mods. + # */ + + int bam_next_basemod(const bam1_t *b, hts_base_mod_state *state,hts_base_mod *mods, int n_mods, int *pos) + + # *********************************** + # * BAQ calculation and realignment * + # ***********************************/ + int sam_cap_mapq(bam1_t *b, const char *ref, int ref_len, int thres) + int sam_prob_realn(bam1_t *b, const char *ref, int ref_len, int flag) + + +cdef extern from "htslib/faidx.h" nogil: + + ctypedef struct faidx_t: + pass + + # /// Build index for a FASTA or bgzip-compressed FASTA file. + # /** @param fn FASTA file name + # @param fnfai Name of .fai file to build. + # @param fngzi Name of .gzi file to build (if fn is bgzip-compressed). + # @return 0 on success; or -1 on failure + + # If fnfai is NULL, ".fai" will be appended to fn to make the FAI file name. + # If fngzi is NULL, ".gzi" will be appended to fn for the GZI file. The GZI + # file will only be built if fn is bgzip-compressed. + # */ + int fai_build3(const char *fn, + const char *fnfai, + const char *fngzi) + + # /// Build index for a FASTA or bgzip-compressed FASTA file. + # /** @param fn FASTA file name + # @return 0 on success; or -1 on failure + # + # File "fn.fai" will be generated. This function is equivalent to + # fai_build3(fn, NULL, NULL); + # */ + int fai_build(char *fn) + + # /// Destroy a faidx_t struct + void fai_destroy(faidx_t *fai) + + # /// Load FASTA indexes. + # /** @param fn File name of the FASTA file (can be compressed with bgzip). + # @param fnfai File name of the FASTA index. + # @param fngzi File name of the bgzip index. + # @param flags Option flags to control index file caching and creation. + # @return Pointer to a faidx_t struct on success, NULL on failure. + + # If fnfai is NULL, ".fai" will be appended to fn to make the FAI file name. + # If fngzi is NULL, ".gzi" will be appended to fn for the bgzip index name. + # The bgzip index is only needed if fn is compressed. + + # If (flags & FAI_CREATE) is true, the index files will be built using + # fai_build3() if they are not already present. + # */ + faidx_t *fai_load3(const char *fn, + const char *fnfai, + const char *fngzi, + int flags) + + # /// Load index from "fn.fai". + # /** @param fn File name of the FASTA file + # @return Pointer to a faidx_t struct on success, NULL on failure. + # This function is equivalent to fai_load3(fn, NULL, NULL, FAI_CREATE|FAI_CACHE); + # */ + faidx_t *fai_load(char *fn) + + # /// Fetch the sequence in a region + # /** @param fai Pointer to the faidx_t struct + # @param reg Region in the format "chr2:20,000-30,000" + # @param len Length of the region; -2 if seq not present, -1 general error + # @return Pointer to the sequence; `NULL` on failure + # The returned sequence is allocated by `malloc()` family and should be destroyed + # by end users by calling `free()` on it. + # */ + char *fai_fetch(faidx_t *fai, + char *reg, + int *len) + + # /// Fetch the sequence in a region + # /** @param fai Pointer to the faidx_t struct + # @param c_name Region name + # @param p_beg_i Beginning position number (zero-based) + # @param p_end_i End position number (zero-based) + # @param len Length of the region; -2 if c_name not present, -1 general error + # @return Pointer to the sequence; null on failure + # The returned sequence is allocated by `malloc()` family and should be destroyed + # by end users by calling `free()` on it. + # */ + char *faidx_fetch_seq(faidx_t *fai, + char *c_name, + int p_beg_i, + int p_end_i, + int *len) + + # /// Query if sequence is present + # /** @param fai Pointer to the faidx_t struct + # @param seq Sequence name + # @return 1 if present or 0 if absent + # */ + int faidx_has_seq(faidx_t *fai, const char *seq) + + # /// Fetch the number of sequences + # /** @param fai Pointer to the faidx_t struct + # @return The number of sequences + # */ + int faidx_nseq(const faidx_t *fai) + + # /// Return name of i-th sequence + const char *faidx_iseq(const faidx_t *fai, int i) + + # /// Return sequence length, -1 if not present + int faidx_seq_len(faidx_t *fai, const char *seq) + +# tabix support +cdef extern from "htslib/tbx.h" nogil: + + # tbx.h definitions + int8_t TBX_MAX_SHIFT + int32_t TBX_GENERIC + int32_t TBX_SAM + int32_t TBX_VCF + int32_t TBX_UCSC + + ctypedef struct tbx_conf_t: + int32_t preset + int32_t sc, bc, ec # seq col., beg col. and end col. + int32_t meta_char, line_skip + + ctypedef struct tbx_t: + tbx_conf_t conf + hts_idx_t *idx + void * dict + + tbx_conf_t tbx_conf_gff + tbx_conf_t tbx_conf_bed + tbx_conf_t tbx_conf_psltbl + tbx_conf_t tbx_conf_sam + tbx_conf_t tbx_conf_vcf + + void tbx_itr_destroy(hts_itr_t * iter) + hts_itr_t * tbx_itr_queryi(tbx_t * t, int tid, int bed, int end) + hts_itr_t * tbx_itr_querys(tbx_t * t, char * s) + int tbx_itr_next(htsFile * fp, tbx_t * t, hts_itr_t * iter, void * data) + + int tbx_name2id(tbx_t *tbx, char *ss) + + int tbx_index_build(char *fn, int min_shift, tbx_conf_t *conf) + int tbx_index_build2(const char *fn, const char *fnidx, int min_shift, const tbx_conf_t *conf) + + tbx_t * tbx_index_load(char *fn) + tbx_t *tbx_index_load2(const char *fn, const char *fnidx) + + # free the array but not the values + char **tbx_seqnames(tbx_t *tbx, int *n) + + void tbx_destroy(tbx_t *tbx) + + +# VCF/BCF API +cdef extern from "htslib/vcf.h" nogil: + + # Header struct + + uint8_t BCF_HL_FLT # header line + uint8_t BCF_HL_INFO + uint8_t BCF_HL_FMT + uint8_t BCF_HL_CTG + uint8_t BCF_HL_STR # structured header line TAG= + uint8_t BCF_HL_GEN # generic header line + + uint8_t BCF_HT_FLAG # header type + uint8_t BCF_HT_INT + uint8_t BCF_HT_REAL + uint8_t BCF_HT_STR + + uint8_t BCF_VL_FIXED # variable length + uint8_t BCF_VL_VAR + uint8_t BCF_VL_A + uint8_t BCF_VL_G + uint8_t BCF_VL_R + + # === Dictionary === + # + # The header keeps three dictionaries. The first keeps IDs in the + # "FILTER/INFO/FORMAT" lines, the second keeps the sequence names and lengths + # in the "contig" lines and the last keeps the sample names. bcf_hdr_t::dict[] + # is the actual hash table, which is opaque to the end users. In the hash + # table, the key is the ID or sample name as a C string and the value is a + # bcf_idinfo_t struct. bcf_hdr_t::id[] points to key-value pairs in the hash + # table in the order that they appear in the VCF header. bcf_hdr_t::n[] is the + # size of the hash table or, equivalently, the length of the id[] arrays. + + uint8_t BCF_DT_ID # dictionary type + uint8_t BCF_DT_CTG + uint8_t BCF_DT_SAMPLE + + # Complete textual representation of a header line + ctypedef struct bcf_hrec_t: + int type # One of the BCF_HL_* type + char *key # The part before '=', i.e. FILTER/INFO/FORMAT/contig/fileformat etc. + char *value # Set only for generic lines, NULL for FILTER/INFO, etc. + int nkeys # Number of structured fields + char **keys # The key=value pairs + char **vals + + ctypedef struct bcf_idinfo_t: + uint32_t info[3] # stores Number:20, var:4, Type:4, ColType:4 in info[0..2] + bcf_hrec_t *hrec[3] # for BCF_HL_FLT,INFO,FMT and contig length in info[0] for BCF_HL_CTG + int id + + ctypedef struct bcf_idpair_t: + const char *key + const bcf_idinfo_t *val + + ctypedef struct bcf_hdr_t: + int32_t n[3] # n:the size of the dictionary block in use, (allocated size, m, is below to preserve ABI) + bcf_idpair_t *id[3] + void *dict[3] # ID dictionary, contig dict and sample dict + char **samples + bcf_hrec_t **hrec + int nhrec, dirty + int ntransl + int *transl[2] # for bcf_translate() + int nsamples_ori # for bcf_hdr_set_samples() + uint8_t *keep_samples + kstring_t mem + int32_t m[3] # m: allocated size of the dictionary block in use (see n above) + + uint8_t bcf_type_shift[] + + # * VCF record * + + uint8_t BCF_BT_NULL + uint8_t BCF_BT_INT8 + uint8_t BCF_BT_INT16 + uint8_t BCF_BT_INT32 + uint8_t BCF_BT_FLOAT + uint8_t BCF_BT_CHAR + + uint8_t VCF_REF + uint8_t VCF_SNP + uint8_t VCF_MNP + uint8_t VCF_INDEL + uint8_t VCF_OTHER + uint8_t VCF_BND + uint8_t VCF_OVERLAP + + + ctypedef struct variant_t: + int type, n # variant type and the number of bases affected, negative for deletions + + ctypedef struct bcf_fmt_t: + int id # id: numeric tag id, the corresponding string is bcf_hdr_t::id[BCF_DT_ID][$id].key + int n, size, type # n: number of values per-sample; size: number of bytes per-sample; type: one of BCF_BT_* types + uint8_t *p # same as vptr and vptr_* in bcf_info_t below + uint32_t p_len + uint32_t p_off + uint8_t p_free + + union bcf_info_union_t: + int32_t i # integer value + float f # float value + + ctypedef struct bcf_info_t: + int key # key: numeric tag id, the corresponding string is bcf_hdr_t::id[BCF_DT_ID][$key].key + int type, len # type: one of BCF_BT_* types; len: vector length, 1 for scalars + + # v1 union only set if $len==1; for easier access + bcf_info_union_t v1 + uint8_t *vptr # pointer to data array in bcf1_t->shared.s, excluding the size+type and tag id bytes + uint32_t vptr_len # length of the vptr block or, when set, of the vptr_mod block, excluding offset + uint32_t vptr_off # vptr offset, i.e., the size of the INFO key plus size+type bytes + uint8_t vptr_free # indicates that vptr-vptr_off must be freed; set only when modified and the new + # data block is bigger than the original + + uint8_t BCF1_DIRTY_ID + uint8_t BCF1_DIRTY_ALS + uint8_t BCF1_DIRTY_FLT + uint8_t BCF1_DIRTY_INF + + ctypedef struct bcf_dec_t: + int m_fmt, m_info, m_id, m_als, m_allele, m_flt # allocated size (high-water mark); do not change + int n_flt # Number of FILTER fields + int *flt # FILTER keys in the dictionary + char *id # ID + char *als # REF+ALT block (\0-seperated) + char **allele # allele[0] is the REF (allele[] pointers to the als block); all null terminated + bcf_info_t *info # INFO + bcf_fmt_t *fmt # FORMAT and individual sample + variant_t *var # $var and $var_type set only when set_variant_types called + int n_var, var_type + int shared_dirty # if set, shared.s must be recreated on BCF output + int indiv_dirty # if set, indiv.s must be recreated on BCF output + + uint8_t BCF_ERR_CTG_UNDEF + uint8_t BCF_ERR_TAG_UNDEF + uint8_t BCF_ERR_NCOLS + uint8_t BCF_ERR_LIMITS + uint8_t BCF_ERR_CHAR + uint8_t BCF_ERR_CTG_INVALID + uint8_t BCF_ERR_TAG_INVALID + + # The bcf1_t structure corresponds to one VCF/BCF line. Reading from VCF file + # is slower because the string is first to be parsed, packed into BCF line + # (done in vcf_parse), then unpacked into internal bcf1_t structure. If it + # is known in advance that some of the fields will not be required (notably + # the sample columns), parsing of these can be skipped by setting max_unpack + # appropriately. + # Similarly, it is fast to output a BCF line because the columns (kept in + # shared.s, indiv.s, etc.) are written directly by bcf_write, whereas a VCF + # line must be formatted in vcf_format. + + ctypedef struct bcf1_t: + int32_t rid # CHROM + int32_t pos # POS + int32_t rlen # length of REF + float qual # QUAL + uint32_t n_info, n_allele + uint32_t n_fmt, n_sample + kstring_t shared, indiv + bcf_dec_t d # lazy evaluation: $d is not generated by bcf_read(), but by explicitly calling bcf_unpack() + int max_unpack # Set to BCF_UN_STR, BCF_UN_FLT, or BCF_UN_INFO to boost performance of vcf_parse when some of the fields won't be needed + int unpacked # remember what has been unpacked to allow calling bcf_unpack() repeatedly without redoing the work + int unpack_size[3] # the original block size of ID, REF+ALT and FILTER + int errcode # one of BCF_ERR_* codes + + ####### API ####### + + # BCF and VCF I/O + # + # A note about naming conventions: htslib internally represents VCF + # records as bcf1_t data structures, therefore most functions are + # prefixed with bcf_. There are a few exceptions where the functions must + # be aware of both BCF and VCF worlds, such as bcf_parse vs vcf_parse. In + # these cases, functions prefixed with bcf_ are more general and work + # with both BCF and VCF. + + # bcf_hdr_init() - create an empty BCF header. + # @param mode "r" or "w" + # + # When opened for writing, the mandatory fileFormat and + # FILTER=PASS lines are added automatically. + bcf_hdr_t *bcf_hdr_init(const char *mode) + + # Destroy a BCF header struct + void bcf_hdr_destroy(bcf_hdr_t *h) + + # Initialize a bcf1_t object; equivalent to calloc(1, sizeof(bcf1_t)) + bcf1_t *bcf_init() + + # Deallocate a bcf1_t object + void bcf_destroy(bcf1_t *v) + + # Same as bcf_destroy() but frees only the memory allocated by bcf1_t, + # not the bcf1_t object itself. + void bcf_empty(bcf1_t *v) + + # Make the bcf1_t object ready for next read. Intended mostly for + # internal use, the user should rarely need to call this function + # directly. + void bcf_clear(bcf1_t *v) + + # Reads VCF or BCF header + bcf_hdr_t *bcf_hdr_read(htsFile *fp) + + # bcf_hdr_set_samples() - for more efficient VCF parsing when only one/few samples are needed + # @samples: samples to include or exclude from file or as a comma-separated string. + # LIST|FILE .. select samples in list/file + # ^LIST|FILE .. exclude samples from list/file + # - .. include all samples + # NULL .. exclude all samples + # @is_file: @samples is a file (1) or a comma-separated list (0) + # + # The bottleneck of VCF reading is parsing of genotype fields. If the + # reader knows in advance that only subset of samples is needed (possibly + # no samples at all), the performance of bcf_read() can be significantly + # improved by calling bcf_hdr_set_samples after bcf_hdr_read(). + # The function bcf_read() will subset the VCF/BCF records automatically + # with the notable exception when reading records via bcf_itr_next(). + # In this case, bcf_subset_format() must be called explicitly, because + # bcf_readrec() does not see the header. + # + # Returns 0 on success, -1 on error or a positive integer if the list + # contains samples not present in the VCF header. In such a case, the + # return value is the index of the offending sample. + # + int bcf_hdr_set_samples(bcf_hdr_t *hdr, const char *samples, int is_file) + int bcf_subset_format(const bcf_hdr_t *hdr, bcf1_t *rec) + + # Writes VCF or BCF header + int bcf_hdr_write(htsFile *fp, bcf_hdr_t *h) + + # Parse VCF line contained in kstring and populate the bcf1_t struct + int vcf_parse(kstring_t *s, const bcf_hdr_t *h, bcf1_t *v) + + # The opposite of vcf_parse. It should rarely be called directly, see vcf_write + int vcf_format(const bcf_hdr_t *h, const bcf1_t *v, kstring_t *s) + + # bcf_read() - read next VCF or BCF record + # + # Returns -1 on critical errors, 0 otherwise. On errors which are not + # critical for reading, such as missing header definitions, v->errcode is + # set to one of BCF_ERR* code and must be checked before calling + # vcf_write(). + int bcf_read(htsFile *fp, const bcf_hdr_t *h, bcf1_t *v) + + # bcf_unpack() - unpack/decode a BCF record (fills the bcf1_t::d field) + # + # Note that bcf_unpack() must be called even when reading VCF. It is safe + # to call the function repeatedly, it will not unpack the same field + # twice. + uint8_t BCF_UN_STR # up to ALT inclusive + uint8_t BCF_UN_FLT # up to FILTER + uint8_t BCF_UN_INFO # up to INFO + uint8_t BCF_UN_SHR # all shared information + uint8_t BCF_UN_FMT # unpack format and each sample + uint8_t BCF_UN_IND # a synonymo of BCF_UN_FMT + uint8_t BCF_UN_ALL # everything + + int bcf_unpack(bcf1_t *b, int which) + + # bcf_dup() - create a copy of BCF record. + # + # Note that bcf_unpack() must be called on the returned copy as if it was + # obtained from bcf_read(). Also note that bcf_dup() calls bcf_sync1(src) + # internally to reflect any changes made by bcf_update_* functions. + bcf1_t *bcf_dup(bcf1_t *src) + bcf1_t *bcf_copy(bcf1_t *dst, bcf1_t *src) + + # bcf_write() - write one VCF or BCF record. The type is determined at the open() call. + int bcf_write(htsFile *fp, bcf_hdr_t *h, bcf1_t *v) + + # The following functions work only with VCFs and should rarely be called + # directly. Usually one wants to use their bcf_* alternatives, which work + # transparently with both VCFs and BCFs. + bcf_hdr_t *vcf_hdr_read(htsFile *fp) + int vcf_hdr_write(htsFile *fp, const bcf_hdr_t *h) + int vcf_read(htsFile *fp, const bcf_hdr_t *h, bcf1_t *v) + int vcf_write(htsFile *fp, const bcf_hdr_t *h, bcf1_t *v) + + #************************************************************************ + # Header querying and manipulation routines + #************************************************************************ + + # Create a new header using the supplied template + bcf_hdr_t *bcf_hdr_dup(const bcf_hdr_t *hdr) + + # Copy header lines from src to dst if not already present in dst. See also bcf_translate(). + # Returns 0 on success or sets a bit on error: + # 1 .. conflicting definitions of tag length + # # todo + int bcf_hdr_combine(bcf_hdr_t *dst, const bcf_hdr_t *src) + + # bcf_hdr_merge() - copy header lines from src to dst, see also bcf_translate() + # @param dst: the destination header to be merged into, NULL on the first pass + # @param src: the source header + # + # Notes: + # - use as: + # bcf_hdr_t *dst = NULL; + # for (i=0; i 0 ) + # for (i=0; i=0 + # + # The returned values are: + # bcf_hdr_id2length .. whether the number of values is fixed or variable, one of BCF_VL_* + # bcf_hdr_id2number .. the number of values, 0xfffff for variable length fields + # bcf_hdr_id2type .. the field type, one of BCF_HT_* + # bcf_hdr_id2coltype .. the column type, one of BCF_HL_* + # + # Notes: Prior to using the macros, the presence of the info should be + # tested with bcf_hdr_idinfo_exists(). + # + int bcf_hdr_id2length(const bcf_hdr_t *hdr, int type, int int_id) + int bcf_hdr_id2number(const bcf_hdr_t *hdr, int type, int int_id) + int bcf_hdr_id2type(const bcf_hdr_t *hdr, int type, int int_id) + int bcf_hdr_id2coltype(const bcf_hdr_t *hdr, int type, int int_id) + int bcf_hdr_idinfo_exists(const bcf_hdr_t *hdr, int type, int int_id) + bcf_hrec_t *bcf_hdr_id2hrec(const bcf_hdr_t *hdr, int type, int col_type, int int_id) + + void bcf_fmt_array(kstring_t *s, int n, int type, void *data) + uint8_t *bcf_fmt_sized_array(kstring_t *s, uint8_t *ptr) + + void bcf_enc_vchar(kstring_t *s, int l, const char *a) + void bcf_enc_vint(kstring_t *s, int n, int32_t *a, int wsize) + void bcf_enc_vfloat(kstring_t *s, int n, float *a) + + #************************************************************************ + # BCF index + # + # Note that these functions work with BCFs only. See synced_bcf_reader.h + # which provides (amongst other things) an API to work transparently with + # both indexed BCFs and VCFs. + #************************************************************************ + + hts_idx_t *bcf_index_load2(const char *fn, const char *fnidx) + int bcf_index_build(const char *fn, int min_shift) + int bcf_index_build2(const char *fn, const char *fnidx, int min_shift) + + #******************* + # Typed value I/O * + #****************** + + # Note that in contrast with BCFv2.1 specification, HTSlib implementation + # allows missing values in vectors. For integer types, the values 0x80, + # 0x8000, 0x80000000 are interpreted as missing values and 0x81, 0x8001, + # 0x80000001 as end-of-vector indicators. Similarly for floats, the value of + # 0x7F800001 is interpreted as a missing value and 0x7F800002 as an + # end-of-vector indicator. + # Note that the end-of-vector byte is not part of the vector. + + # This trial BCF version (v2.2) is compatible with the VCF specification and + # enables to handle correctly vectors with different ploidy in presence of + # missing values. + + int32_t bcf_int8_vector_end + int32_t bcf_int16_vector_end + int32_t bcf_int32_vector_end + int32_t bcf_str_vector_end + int32_t bcf_int8_missing + int32_t bcf_int16_missing + int32_t bcf_int32_missing + int32_t bcf_str_missing + + uint32_t bcf_float_vector_end + uint32_t bcf_float_missing + + void bcf_float_set(float *ptr, uint32_t value) + void bcf_float_set_vector_end(float *x) + void bcf_float_set_missing(float *x) + + int bcf_float_is_missing(float f) + int bcf_float_is_vector_end(float f) + void bcf_format_gt(bcf_fmt_t *fmt, int isample, kstring_t *str) + void bcf_enc_size(kstring_t *s, int size, int type) + int bcf_enc_inttype(long x) + void bcf_enc_int1(kstring_t *s, int32_t x) + int32_t bcf_dec_int1(const uint8_t *p, int type, uint8_t **q) + int32_t bcf_dec_typed_int1(const uint8_t *p, uint8_t **q) + int32_t bcf_dec_size(const uint8_t *p, uint8_t **q, int *type) + + # These trivial wrappers are defined only for consistency with other parts of htslib + bcf1_t *bcf_init1() + int bcf_read1(htsFile *fp, const bcf_hdr_t *h, bcf1_t *v) + int vcf_read1(htsFile *fp, const bcf_hdr_t *h, bcf1_t *v) + int bcf_write1(htsFile *fp, const bcf_hdr_t *h, bcf1_t *v) + int vcf_write1(htsFile *fp, const bcf_hdr_t *h, bcf1_t *v) + void bcf_destroy1(bcf1_t *v) + void bcf_empty1(bcf1_t *v) + int vcf_parse1(kstring_t *s, const bcf_hdr_t *h, bcf1_t *v) + void bcf_clear1(bcf1_t *v) + int vcf_format1(const bcf_hdr_t *h, const bcf1_t *v, kstring_t *s) + + # Other nice wrappers + void bcf_itr_destroy(hts_itr_t *iter) + hts_itr_t *bcf_itr_queryi(const hts_idx_t *idx, int tid, int beg, int end) + hts_itr_t *bcf_itr_querys(const hts_idx_t *idx, const bcf_hdr_t *hdr, char *s) + int bcf_itr_next(htsFile *fp, hts_itr_t *iter, void *r) + hts_idx_t *bcf_index_load(const char *fn) + const char **bcf_index_seqnames(const hts_idx_t *idx, const bcf_hdr_t *hdr, int *nptr) + + +# VCF/BCF utility functions +cdef extern from "htslib/vcfutils.h" nogil: + struct kbitset_t + + # bcf_trim_alleles() - remove ALT alleles unused in genotype fields + # @header: for access to BCF_DT_ID dictionary + # @line: VCF line obtain from vcf_parse1 + # + # Returns the number of removed alleles on success or negative + # on error: + # -1 .. some allele index is out of bounds + int bcf_trim_alleles(const bcf_hdr_t *header, bcf1_t *line) + + # bcf_remove_alleles() - remove ALT alleles according to bitmask @mask + # @header: for access to BCF_DT_ID dictionary + # @line: VCF line obtained from vcf_parse1 + # @mask: alleles to remove + # + # If you have more than 31 alleles, then the integer bit mask will + # overflow, so use bcf_remove_allele_set instead + void bcf_remove_alleles(const bcf_hdr_t *header, bcf1_t *line, int mask) + + # bcf_remove_allele_set() - remove ALT alleles according to bitset @rm_set + # @header: for access to BCF_DT_ID dictionary + # @line: VCF line obtained from vcf_parse1 + # @rm_set: pointer to kbitset_t object with bits set for allele + # indexes to remove + # + # Number=A,R,G INFO and FORMAT fields will be updated accordingly. + void bcf_remove_allele_set(const bcf_hdr_t *header, bcf1_t *line, kbitset_t *rm_set) + + # bcf_calc_ac() - calculate the number of REF and ALT alleles + # @header: for access to BCF_DT_ID dictionary + # @line: VCF line obtained from vcf_parse1 + # @ac: array of length line->n_allele + # @which: determine if INFO/AN,AC and indv fields be used + # + # Returns 1 if the call succeeded, or 0 if the value could not + # be determined. + # + # The value of @which determines if existing INFO/AC,AN can be + # used (BCF_UN_INFO) and and if indv fields can be split (BCF_UN_FMT). + int bcf_calc_ac(const bcf_hdr_t *header, bcf1_t *line, int *ac, int which) + + # bcf_gt_type() - determines type of the genotype + # @fmt_ptr: the GT format field as set for example by set_fmt_ptr + # @isample: sample index (starting from 0) + # @ial: index of the 1st non-reference allele (starting from 1) + # @jal: index of the 2nd non-reference allele (starting from 1) + # + # Returns the type of the genotype (one of GT_HOM_RR, GT_HET_RA, + # GT_HOM_AA, GT_HET_AA, GT_HAPL_R, GT_HAPL_A or GT_UNKN). If $ial + # is not NULL and the genotype has one or more non-reference + # alleles, $ial will be set. In case of GT_HET_AA, $ial is the + # position of the allele which appeared first in ALT. If $jal is + # not null and the genotype is GT_HET_AA, $jal will be set and is + # the position of the second allele in ALT. + uint8_t GT_HOM_RR # note: the actual value of GT_* matters, used in dosage r2 calculation + uint8_t GT_HOM_AA + uint8_t GT_HET_RA + uint8_t GT_HET_AA + uint8_t GT_HAPL_R + uint8_t GT_HAPL_A + uint8_t GT_UNKN + int bcf_gt_type(bcf_fmt_t *fmt_ptr, int isample, int *ial, int *jal) + + int bcf_acgt2int(char c) + char bcf_int2acgt(int i) + + # bcf_ij2G() - common task: allele indexes to Number=G index (diploid) + # @i,j: allele indexes, 0-based, i<=j + # Returns index to the Number=G diploid array + uint32_t bcf_ij2G(uint32_t i, uint32_t j) + + +cdef extern from "htslib/cram.h" nogil: + + enum cram_block_method: + ERROR + RAW + GZIP + BZIP2 + LZMA + RANS + RANS0 + RANS1 + GZIP_RLE + + enum cram_content_type: + CT_ERROR + FILE_HEADER + COMPRESSION_HEADER + MAPPED_SLICE + UNMAPPED_SLICE + EXTERNAL + CORE + + # Opaque data types, see cram_structs for the fully fledged versions. + ctypedef struct SAM_hdr + ctypedef struct cram_file_def + ctypedef struct cram_fd + ctypedef struct cram_container + ctypedef struct cram_block + ctypedef struct cram_slice + ctypedef struct cram_metrics + ctypedef struct cram_block_slice_hdr + ctypedef struct cram_block_compression_hdr + ctypedef struct refs_t + + # Accessor functions + + # + #----------------------------------------------------------------------------- + # cram_fd + # + SAM_hdr *cram_fd_get_header(cram_fd *fd) + void cram_fd_set_header(cram_fd *fd, SAM_hdr *hdr) + + int cram_fd_get_version(cram_fd *fd) + void cram_fd_set_version(cram_fd *fd, int vers) + + int cram_major_vers(cram_fd *fd) + int cram_minor_vers(cram_fd *fd) + + hFILE *cram_fd_get_fp(cram_fd *fd) + void cram_fd_set_fp(cram_fd *fd, hFILE *fp) + + # + #----------------------------------------------------------------------------- + # cram_container + # + int32_t cram_container_get_length(cram_container *c) + void cram_container_set_length(cram_container *c, int32_t length) + int32_t cram_container_get_num_blocks(cram_container *c) + void cram_container_set_num_blocks(cram_container *c, int32_t num_blocks) + int32_t *cram_container_get_landmarks(cram_container *c, int32_t *num_landmarks) + void cram_container_set_landmarks(cram_container *c, int32_t num_landmarks, + int32_t *landmarks) + + # Returns true if the container is empty (EOF marker) */ + int cram_container_is_empty(cram_fd *fd) + + + # + #----------------------------------------------------------------------------- + # cram_block + # + int32_t cram_block_get_content_id(cram_block *b) + int32_t cram_block_get_comp_size(cram_block *b) + int32_t cram_block_get_uncomp_size(cram_block *b) + int32_t cram_block_get_crc32(cram_block *b) + void * cram_block_get_data(cram_block *b) + + cram_content_type cram_block_get_content_type(cram_block *b) + + void cram_block_set_content_id(cram_block *b, int32_t id) + void cram_block_set_comp_size(cram_block *b, int32_t size) + void cram_block_set_uncomp_size(cram_block *b, int32_t size) + void cram_block_set_crc32(cram_block *b, int32_t crc) + void cram_block_set_data(cram_block *b, void *data) + + int cram_block_append(cram_block *b, void *data, int size) + void cram_block_update_size(cram_block *b) + + # Offset is known as "size" internally, but it can be confusing. + size_t cram_block_get_offset(cram_block *b) + void cram_block_set_offset(cram_block *b, size_t offset) + + # + # Computes the size of a cram block, including the block + # header itself. + # + uint32_t cram_block_size(cram_block *b) + + # + # Renumbers RG numbers in a cram compression header. + # + # CRAM stores RG as the Nth number in the header, rather than a + # string holding the ID: tag. This is smaller in space, but means + # "samtools cat" to join files together that contain single but + # different RG lines needs a way of renumbering them. + # + # The file descriptor is expected to be immediately after the + # cram_container structure (ie before the cram compression header). + # Due to the nature of the CRAM format, this needs to read and write + # the blocks itself. Note that there may be multiple slices within + # the container, meaning multiple compression headers to manipulate. + # Changing RG may change the size of the compression header and + # therefore the length field in the container. Hence we rewrite all + # blocks just in case and also emit the adjusted container. + # + # The current implementation can only cope with renumbering a single + # RG (and only then if it is using HUFFMAN or BETA codecs). In + # theory it *may* be possible to renumber multiple RGs if they use + # HUFFMAN to the CORE block or use an external block unshared by any + # other data series. So we have an API that can be upgraded to + # support this, but do not implement it for now. An example + # implementation of RG as an EXTERNAL block would be to find that + # block and rewrite it, returning the number of blocks consumed. + # + # Returns 0 on success; + # -1 if unable to edit; + # -2 on other errors (eg I/O). + # + int cram_transcode_rg(cram_fd *input, cram_fd *output, + cram_container *c, + int nrg, int *in_rg, int *out_rg) + + # + # Copies the blocks representing the next num_slice slices from a + # container from 'in' to 'out'. It is expected that the file pointer + # is just after the read of the cram_container and cram compression + # header. + # + # Returns 0 on success + # -1 on failure + # + int cram_copy_slice(cram_fd *input, cram_fd *output, int32_t num_slice) + + # + #----------------------------------------------------------------------------- + # SAM_hdr + # + + # Tokenises a SAM header into a hash table. + # + # Also extracts a few bits on specific data types, such as @RG lines. + # + # @return + # Returns a SAM_hdr struct on success (free with sam_hdr_free()) + # NULL on failure + # + SAM_hdr *sam_hdr_parse_(const char *hdr, int len) + + + # + #----------------------------------------------------------------------------- + # cram_io basics + # + + # CRAM blocks - the dynamically growable data block. We have code to + # create, update, (un)compress and read/write. + # + # These are derived from the deflate_interlaced.c blocks, but with the + # CRAM extension of content types and IDs. + # + + # Allocates a new cram_block structure with a specified content_type and + # id. + # + # @return + # Returns block pointer on success; + # NULL on failure + # + cram_block *cram_new_block(cram_content_type content_type, + int content_id) + + # Reads a block from a cram file. + # + # @return + # Returns cram_block pointer on success; + # NULL on failure + # + cram_block *cram_read_block(cram_fd *fd) + + # Writes a CRAM block. + # + # @return + # Returns 0 on success; + # -1 on failure + # + int cram_write_block(cram_fd *fd, cram_block *b) + + # Frees a CRAM block, deallocating internal data too. + # + void cram_free_block(cram_block *b) + + # Uncompresses a CRAM block, if compressed. + # + # @return + # Returns 0 on success; + # -1 on failure + # + int cram_uncompress_block(cram_block *b) + + # Compresses a block. + # + # Compresses a block using one of two different zlib strategies. If we only + # want one choice set strat2 to be -1. + # + # The logic here is that sometimes Z_RLE does a better job than Z_FILTERED + # or Z_DEFAULT_STRATEGY on quality data. If so, we'd rather use it as it is + # significantly faster. + # + # @return + # Returns 0 on success; + # -1 on failure + # + int cram_compress_block(cram_fd *fd, cram_block *b, cram_metrics *metrics, + int method, int level) + + # Containers + # + + # Creates a new container, specifying the maximum number of slices + # and records permitted. + # + # @return + # Returns cram_container ptr on success; + # NULL on failure + # + cram_container *cram_new_container(int nrec, int nslice) + void cram_free_container(cram_container *c) + + # Reads a container header. + # + # @return + # Returns cram_container on success; + # NULL on failure or no container left (fd->err == 0). + # + cram_container *cram_read_container(cram_fd *fd) + + # Writes a container structure. + # + # @return + # Returns 0 on success; + # -1 on failure + # + int cram_write_container(cram_fd *fd, cram_container *h) + + # + # Stores the container structure in dat and returns *size as the + # number of bytes written to dat[]. The input size of dat is also + # held in *size and should be initialised to cram_container_size(c). + # + # Returns 0 on success; + # -1 on failure + # + int cram_store_container(cram_fd *fd, cram_container *c, char *dat, int *size) + + int cram_container_size(cram_container *c) + + # The top-level cram opening, closing and option handling + # + + # Opens a CRAM file for read (mode "rb") or write ("wb"). + # + # The filename may be "-" to indicate stdin or stdout. + # + # @return + # Returns file handle on success; + # NULL on failure. + # + cram_fd *cram_open(const char *filename, const char *mode) + + # Opens an existing stream for reading or writing. + # + # @return + # Returns file handle on success; + # NULL on failure. + # + cram_fd *cram_dopen(hFILE *fp, const char *filename, const char *mode) + + # Closes a CRAM file. + # + # @return + # Returns 0 on success; + # -1 on failure + # + int cram_close(cram_fd *fd) + + # + # Seek within a CRAM file. + # + # Returns 0 on success + # -1 on failure + # + int cram_seek(cram_fd *fd, off_t offset, int whence) + + # + # Flushes a CRAM file. + # Useful for when writing to stdout without wishing to close the stream. + # + # Returns 0 on success + # -1 on failure + # + int cram_flush(cram_fd *fd) + + # Checks for end of file on a cram_fd stream. + # + # @return + # Returns 0 if not at end of file + # 1 if we hit an expected EOF (end of range or EOF block) + # 2 for other EOF (end of stream without EOF block) + # + int cram_eof(cram_fd *fd) + + # Sets options on the cram_fd. + # + # See CRAM_OPT_* definitions in hts.h. + # Use this immediately after opening. + # + # @return + # Returns 0 on success; + # -1 on failure + # + int cram_set_option(cram_fd *fd, hts_fmt_option opt, ...) + + # Sets options on the cram_fd. + # + # See CRAM_OPT_* definitions in hts.h. + # Use this immediately after opening. + # + # @return + # Returns 0 on success; + # -1 on failure + # + int cram_set_voption(cram_fd *fd, hts_fmt_option opt, va_list args) + + # + # Attaches a header to a cram_fd. + # + # This should be used when creating a new cram_fd for writing where + # we have an SAM_hdr already constructed (eg from a file we've read + # in). + # + # @return + # Returns 0 on success; + # -1 on failure + # + int cram_set_header(cram_fd *fd, SAM_hdr *hdr) + + # Check if this file has a proper EOF block + # + # @return + # Returns 3 if the file is a version of CRAM that does not contain EOF blocks + # 2 if the file is a stream and thus unseekable + # 1 if the file contains an EOF block + # 0 if the file does not contain an EOF block + # -1 if an error occurred whilst reading the file or we could not seek back to where we were + # + # + int cram_check_EOF(cram_fd *fd) + + # As int32_decoded/encode, but from/to blocks instead of cram_fd */ + int int32_put_blk(cram_block *b, int32_t val) + + # Deallocates all storage used by a SAM_hdr struct. + # + # This also decrements the header reference count. If after decrementing + # it is still non-zero then the header is assumed to be in use by another + # caller and the free is not done. + # + # This is a synonym for sam_hdr_dec_ref(). + # + void sam_hdr_free(SAM_hdr *hdr) + + # Returns the current length of the SAM_hdr in text form. + # + # Call sam_hdr_rebuild() first if editing has taken place. + # + int sam_hdr_length(SAM_hdr *hdr) + + # Returns the string form of the SAM_hdr. + # + # Call sam_hdr_rebuild() first if editing has taken place. + # + char *sam_hdr_str(SAM_hdr *hdr) + + # Appends a formatted line to an existing SAM header. + # + # Line is a full SAM header record, eg "@SQ\tSN:foo\tLN:100", with + # optional new-line. If it contains more than 1 line then multiple lines + # will be added in order. + # + # Len is the length of the text data, or 0 if unknown (in which case + # it should be null terminated). + # + # @return + # Returns 0 on success; + # -1 on failure + # + + # Add an @PG line. + # + # If we wish complete control over this use sam_hdr_add() directly. This + # function uses that, but attempts to do a lot of tedious house work for + # you too. + # + # - It will generate a suitable ID if the supplied one clashes. + # - It will generate multiple @PG records if we have multiple PG chains. + # + # Call it as per sam_hdr_add() with a series of key,value pairs ending + # in NULL. + # + # @return + # Returns 0 on success; + # -1 on failure + # + int sam_hdr_add_PG(SAM_hdr *sh, const char *name, ...) + + # + # A function to help with construction of CL tags in @PG records. + # Takes an argc, argv pair and returns a single space-separated string. + # This string should be deallocated by the calling function. + # + # @return + # Returns malloced char * on success; + # NULL on failure + # + char *stringify_argv(int argc, char *argv[]) + + # + # Returns the refs_t structure used by a cram file handle. + # + # This may be used in conjunction with option CRAM_OPT_SHARED_REF to + # share reference memory between multiple file handles. + # + # @return + # Returns NULL if none exists or the file handle is not a CRAM file. + # + refs_t *cram_get_refs(htsFile *fd) + + +cdef class HTSFile(object): + cdef htsFile *htsfile # pointer to htsFile structure + cdef int64_t start_offset # BGZF offset of first record + + cdef readonly object filename # filename as supplied by user + cdef readonly object mode # file opening mode + cdef readonly object threads # number of threads to use + cdef readonly object index_filename # filename of index, if supplied by user + + cdef readonly bint is_stream # Is htsfile a non-seekable stream + cdef readonly bint is_remote # Is htsfile a remote stream + cdef readonly bint duplicate_filehandle # Duplicate filehandle when opening via fh + + cdef htsFile *_open_htsfile(self) except? NULL diff --git a/pysam/libchtslib.pyi b/pysam/libchtslib.pyi new file mode 100644 index 0000000..925828b --- /dev/null +++ b/pysam/libchtslib.pyi @@ -0,0 +1,115 @@ +import sys +from typing import List, Union, NoReturn, Iterable, Any, Tuple, Optional, TypeVar + +if sys.version_info < (3, 8): + from typing_extensions import Protocol +else: + from typing import Protocol + +class _HasFileNo(Protocol): + def fileno(self) -> int: ... + +def get_verbosity() -> int: ... +def set_verbosity(level: int): ... + +THFile = TypeVar("THFile", bound="HFile") + +class HFile: + def __init__(self, name: Union[int, str], mode: str = ...) -> None: ... + def __enter__(self: THFile) -> THFile: ... + def __exit__(self, type, value, tb): ... + def __iter__(self) -> Any: ... + def __next__(self) -> str: ... + @property + def closed(self) -> bool: ... + @property + def mode(self) -> str: ... + @property + def name(self) -> Union[int, str]: ... + def close(self) -> None: ... + def fileno(self) -> int: ... + def flush(self) -> None: ... + def isatty(self) -> bool: ... + def readable(self) -> bool: ... + def read(self, size: int = ...) -> bytes: ... + def readall(self) -> bytes: ... + def readinto(self, buf: Any) -> bytes: ... + def readline(self, size: int = ...) -> bytes: ... + def readlines(self) -> List[bytes]: ... + def seek(self, offset: int, whence: int = ...) -> int: ... + def seekable(self) -> bool: ... + def tell(self) -> int: ... + def truncate(self, *args) -> NoReturn: ... + def writable(self) -> bool: ... + def write(self, b: bytes) -> int: ... + def writelines(self, lines: Iterable[bytes]) -> None: ... + +THTSFile = TypeVar("THTSFile", bound="HTSFile") + +class HTSFile: + def __enter__(self: THTSFile) -> THTSFile: ... + def __exit__(self, type, value, traceback) -> Any: ... + @property + def filename(self) -> Any: ... + @property + def mode(self) -> str: ... + @property + def threads(self) -> int: ... + @property + def index_filename(self) -> Optional[str]: ... + @property + def is_stream(self) -> bool: ... + @property + def is_remote(self) -> bool: ... + @property + def duplicate_filehandle(self) -> bool: ... + def close(self) -> None: ... + def check_truncation(self, ignore_truncation: bool = ...) -> None: ... + @property + def category(self) -> str: ... + @property + def format(self) -> str: ... + @property + def version(self) -> Tuple[int, int]: ... + @property + def compression(self) -> str: ... + @property + def description(self) -> str: ... + @property + def is_open(self) -> bool: ... + @property + def is_closed(self) -> bool: ... + @property + def closed(self) -> bool: ... + @property + def is_write(self) -> bool: ... + @property + def is_read(self) -> bool: ... + @property + def is_sam(self) -> bool: ... + @property + def is_bam(self) -> bool: ... + @property + def is_cram(self) -> bool: ... + @property + def is_vcf(self) -> bool: ... + @property + def is_bcf(self) -> bool: ... + def reset(self) -> None: ... + def seek(self, offset: int) -> int: ... + def tell(self) -> int: ... + def add_hts_options(self, format_options: Optional[List[str]] = ...) -> None: ... + def parse_region( + self, + contig: Optional[str] = ..., + start: Optional[int] = ..., + stop: Optional[int] = ..., + region: Optional[str] = ..., + tid: Optional[int] = ..., + reference: Optional[str] = ..., + end: Optional[int] = ..., + ) -> Tuple[int, int, int, int]: ... + def is_valid_tid(self, tid: int) -> bool: ... + def is_valid_reference_name(self, contig: str) -> bool: ... + def get_tid(self, contig: str) -> int: ... + def get_reference_name(self, tid: int) -> Optional[str]: ... diff --git a/pysam/libchtslib.pyx b/pysam/libchtslib.pyx new file mode 100644 index 0000000..3a9bbd2 --- /dev/null +++ b/pysam/libchtslib.pyx @@ -0,0 +1,723 @@ +# cython: embedsignature=True +# cython: profile=True +# adds doc-strings for sphinx + +######################################################################## +######################################################################## +## Cython cimports +######################################################################## + +from posix.unistd cimport dup +from libc.errno cimport errno +from libc.stdint cimport INT32_MAX +from cpython cimport PyBytes_FromStringAndSize +from pysam.libchtslib cimport * +from pysam.libcutils cimport force_bytes, force_str, charptr_to_str, charptr_to_str_w_len +from pysam.libcutils cimport encode_filename, from_string_and_size + + +######################################################################## +######################################################################## +## Python imports +######################################################################## + +import os +import io +import re +from warnings import warn + + +######################################################################## +######################################################################## +## Constants +######################################################################## + +__all__ = ['get_verbosity', 'set_verbosity', 'HFile', 'HTSFile'] + +# defines imported from samtools +DEF SEEK_SET = 0 +DEF SEEK_CUR = 1 +DEF SEEK_END = 2 + +# maximum genomic coordinace +cdef int MAX_POS = (1 << 31) - 1 + +cdef tuple FORMAT_CATEGORIES = ('UNKNOWN', 'ALIGNMENTS', 'VARIANTS', 'INDEX', 'REGIONS') +cdef tuple FORMATS = ('UNKNOWN', 'BINARY_FORMAT', 'TEXT_FORMAT', 'SAM', 'BAM', 'BAI', 'CRAM', 'CRAI', + 'VCF', 'BCF', 'CSI', 'GZI', 'TBI', 'BED') +cdef tuple COMPRESSION = ('NONE', 'GZIP', 'BGZF', 'CUSTOM') + + +######################################################################## +######################################################################## +## Verbosity functions +######################################################################## + + +cpdef set_verbosity(int verbosity): + """Set htslib's hts_verbose global variable to the specified value.""" + return hts_set_verbosity(verbosity) + +cpdef get_verbosity(): + """Return the value of htslib's hts_verbose global variable.""" + return hts_get_verbosity() + + +######################################################################## +######################################################################## +## HFile wrapper class +######################################################################## + +cdef class HFile(object): + cdef hFILE *fp + cdef readonly object name, mode + + def __init__(self, name, mode='r', closefd=True): + self._open(name, mode, closefd=True) + + def __dealloc__(self): + self.close() + + @property + def closed(self): + return self.fp == NULL + + cdef _open(self, name, mode, closefd=True): + self.name = name + self.mode = mode + + mode = force_bytes(mode) + + if isinstance(name, int): + if self.fp != NULL: + name = dup(name) + self.fp = hdopen(name, mode) + else: + name = encode_filename(name) + self.fp = hopen(name, mode) + + if not self.fp: + raise IOError(errno, 'failed to open HFile', self.name) + + def close(self): + if self.fp == NULL: + return + + cdef hFILE *fp = self.fp + self.fp = NULL + + if hclose(fp) != 0: + raise IOError(herrno(self.fp), 'failed to close HFile', self.name) + + def fileno(self): + if self.fp == NULL: + raise IOError('operation on closed HFile') + if isinstance(self.name, int): + return self.name + else: + raise AttributeError('fileno not available') + + def __enter__(self): + return self + + def __exit__(self, type, value, tb): + self.close() + + def __iter__(self): + return self + + def __next__(self): + line = self.readline() + if not line: + raise StopIteration() + return line + + def flush(self): + if self.fp == NULL: + raise IOError('operation on closed HFile') + if hflush(self.fp) != 0: + raise IOError(herrno(self.fp), 'failed to flush HFile', self.name) + + def isatty(self): + if self.fp == NULL: + raise IOError('operation on closed HFile') + return False + + def readable(self): + return self.fp != NULL and 'r' in self.mode + + def read(self, Py_ssize_t size=-1): + if self.fp == NULL: + raise IOError('operation on closed HFile') + + if size == 0: + return b'' + + cdef list parts = [] + cdef bytes part + cdef Py_ssize_t chunk_size, ret, bytes_read = 0 + cdef char *cpart + + while size == -1 or bytes_read < size: + chunk_size = 4096 + if size != -1: + chunk_size = min(chunk_size, size - bytes_read) + + part = PyBytes_FromStringAndSize(NULL, chunk_size) + cpart = part + ret = hread(self.fp, cpart, chunk_size) + + if ret < 0: + IOError(herrno(self.fp), 'failed to read HFile', self.name) + elif not ret: + break + + bytes_read += ret + + if ret < chunk_size: + part = cpart[:ret] + + parts.append(part) + + return b''.join(parts) + + def readall(self): + return self.read() + + def readinto(self, buf): + if self.fp == NULL: + raise IOError('operation on closed HFile') + + size = len(buf) + + if size == 0: + return size + + mv = memoryview(buf) + ret = hread(self.fp, mv, size) + + if ret < 0: + IOError(herrno(self.fp), 'failed to read HFile', self.name) + + return ret + + def readline(self, Py_ssize_t size=-1): + if self.fp == NULL: + raise IOError('operation on closed HFile') + + if size == 0: + return b'' + + cdef list parts = [] + cdef bytes part + cdef Py_ssize_t chunk_size, ret, bytes_read = 0 + cdef char *cpart + + while size == -1 or bytes_read < size: + chunk_size = 4096 + if size != -1: + chunk_size = min(chunk_size, size - bytes_read) + + part = PyBytes_FromStringAndSize(NULL, chunk_size) + cpart = part + + # Python bytes objects allocate an extra byte for a null terminator + ret = hgetln(cpart, chunk_size+1, self.fp) + + if ret < 0: + IOError(herrno(self.fp), 'failed to read HFile', self.name) + elif not ret: + break + + bytes_read += ret + + if ret < chunk_size: + part = cpart[:ret] + cpart = part + + parts.append(part) + + if cpart[ret-1] == b'\n': + break + + return b''.join(parts) + + def readlines(self): + return list(self) + + def seek(self, Py_ssize_t offset, int whence=SEEK_SET): + if self.fp == NULL: + raise IOError('operation on closed HFile') + + cdef Py_ssize_t off = hseek(self.fp, offset, whence) + + if off < 0: + raise IOError(herrno(self.fp), 'seek failed on HFile', self.name) + + return off + + def tell(self): + if self.fp == NULL: + raise IOError('operation on closed HFile') + + ret = htell(self.fp) + + if ret < 0: + raise IOError(herrno(self.fp), 'tell failed on HFile', self.name) + + return ret + + def seekable(self): + return self.fp != NULL + + def truncate(self, size=None): + raise NotImplementedError() + + def writable(self): + return self.fp != NULL and 'w' in self.mode + + def write(self, bytes b): + if self.fp == NULL: + raise IOError('operation on closed HFile') + + got = hwrite(self.fp, b, len(b)) + + if got < 0: + raise IOError(herrno(self.fp), 'write failed on HFile', self.name) + + return got + + def writelines(self, lines): + for line in lines: + self.write(line) + + +######################################################################## +######################################################################## +## Helpers for backward compatibility to hide the difference between +## boolean properties and methods +######################################################################## + +class CallableValue(object): + def __init__(self, value): + self.value = value + def __call__(self): + return self.value + def __bool__(self): + return self.value + def __nonzero__(self): + return self.value + def __eq__(self, other): + return self.value == other + def __ne__(self, other): + return self.value != other + + +CTrue = CallableValue(True) +CFalse = CallableValue(False) + + +######################################################################## +######################################################################## +## HTSFile wrapper class (base class for AlignmentFile and VariantFile) +######################################################################## + +cdef class HTSFile(object): + """ + Base class for HTS file types + """ + + def __cinit__(self, *args, **kwargs): + self.htsfile = NULL + self.threads = 1 + self.duplicate_filehandle = True + + def close(self): + if self.htsfile: + hts_close(self.htsfile) + self.htsfile = NULL + + def __dealloc__(self): + if self.htsfile: + hts_close(self.htsfile) + self.htsfile = NULL + + def check_truncation(self, ignore_truncation=False): + """Check if file is truncated.""" + if not self.htsfile: + return + + if self.htsfile.format.compression != bgzf: + return + + cdef BGZF *bgzfp = hts_get_bgzfp(self.htsfile) + if not bgzfp: + return + + cdef int ret = bgzf_check_EOF(bgzfp) + if ret < 0: + raise IOError(errno, 'error checking for EOF marker') + elif ret == 0: + msg = 'no BGZF EOF marker; file may be truncated'.format(self.filename) + if ignore_truncation: + warn(msg) + else: + raise IOError(msg) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + return False + + @property + def category(self): + """General file format category. One of UNKNOWN, ALIGNMENTS, + VARIANTS, INDEX, REGIONS""" + if not self.htsfile: + raise ValueError('metadata not available on closed file') + return FORMAT_CATEGORIES[self.htsfile.format.category] + + @property + def format(self): + """File format. + + One of UNKNOWN, BINARY_FORMAT, TEXT_FORMAT, SAM, BAM, + BAI, CRAM, CRAI, VCF, BCF, CSI, GZI, TBI, BED. + """ + if not self.htsfile: + raise ValueError('metadata not available on closed file') + return FORMATS[self.htsfile.format.format] + + @property + def version(self): + """Tuple of file format version numbers (major, minor)""" + if not self.htsfile: + raise ValueError('metadata not available on closed file') + return self.htsfile.format.version.major, self.htsfile.format.version.minor + + @property + def compression(self): + """File compression. + + One of NONE, GZIP, BGZF, CUSTOM.""" + if not self.htsfile: + raise ValueError('metadata not available on closed file') + return COMPRESSION[self.htsfile.format.compression] + + @property + def description(self): + """Vaguely human readable description of the file format""" + if not self.htsfile: + raise ValueError('metadata not available on closed file') + cdef char *desc = hts_format_description(&self.htsfile.format) + try: + return charptr_to_str(desc) + finally: + free(desc) + + @property + def is_open(self): + """return True if HTSFile is open and in a valid state.""" + return CTrue if self.htsfile != NULL else CFalse + + @property + def is_closed(self): + """return True if HTSFile is closed.""" + return self.htsfile == NULL + + @property + def closed(self): + """return True if HTSFile is closed.""" + return self.htsfile == NULL + + @property + def is_write(self): + """return True if HTSFile is open for writing""" + return self.htsfile != NULL and self.htsfile.is_write != 0 + + @property + def is_read(self): + """return True if HTSFile is open for reading""" + return self.htsfile != NULL and self.htsfile.is_write == 0 + + @property + def is_sam(self): + """return True if HTSFile is reading or writing a SAM alignment file""" + return self.htsfile != NULL and self.htsfile.format.format == sam + + @property + def is_bam(self): + """return True if HTSFile is reading or writing a BAM alignment file""" + return self.htsfile != NULL and self.htsfile.format.format == bam + + @property + def is_cram(self): + """return True if HTSFile is reading or writing a BAM alignment file""" + return self.htsfile != NULL and self.htsfile.format.format == cram + + @property + def is_vcf(self): + """return True if HTSFile is reading or writing a VCF variant file""" + return self.htsfile != NULL and self.htsfile.format.format == vcf + + @property + def is_bcf(self): + """return True if HTSFile is reading or writing a BCF variant file""" + return self.htsfile != NULL and self.htsfile.format.format == bcf + + def reset(self): + """reset file position to beginning of file just after the header. + + Returns + ------- + + The file position after moving the file pointer. : pointer + + """ + return self.seek(self.start_offset) + + def seek(self, uint64_t offset): + """move file pointer to position *offset*, see :meth:`pysam.HTSFile.tell`.""" + if not self.is_open: + raise ValueError('I/O operation on closed file') + if self.is_stream: + raise IOError('seek not available in streams') + + cdef int64_t ret + if self.htsfile.format.compression == bgzf: + with nogil: + ret = bgzf_seek(hts_get_bgzfp(self.htsfile), offset, SEEK_SET) + elif self.htsfile.format.compression == no_compression: + ret = 0 if (hseek(self.htsfile.fp.hfile, offset, SEEK_SET) >= 0) else -1 + else: + raise NotImplementedError("seek not implemented in files compressed by method {}".format( + self.htsfile.format.compression)) + return ret + + def tell(self): + """return current file position, see :meth:`pysam.HTSFile.seek`.""" + if not self.is_open: + raise ValueError('I/O operation on closed file') + if self.is_stream: + raise IOError('tell not available in streams') + + cdef int64_t ret + if self.htsfile.format.compression == bgzf: + with nogil: + ret = bgzf_tell(hts_get_bgzfp(self.htsfile)) + elif self.htsfile.format.compression == no_compression: + ret = htell(self.htsfile.fp.hfile) + elif self.htsfile.format.format == cram: + with nogil: + ret = htell(cram_fd_get_fp(self.htsfile.fp.cram)) + else: + raise NotImplementedError("seek not implemented in files compressed by method {}".format( + self.htsfile.format.compression)) + + return ret + + cdef htsFile *_open_htsfile(self) except? NULL: + cdef char *cfilename + cdef char *cmode = self.mode + cdef int fd, dup_fd, threads + + threads = self.threads - 1 + if isinstance(self.filename, bytes): + cfilename = self.filename + with nogil: + htsfile = hts_open(cfilename, cmode) + if htsfile != NULL: + hts_set_threads(htsfile, threads) + return htsfile + else: + if isinstance(self.filename, int): + fd = self.filename + else: + fd = self.filename.fileno() + + if self.duplicate_filehandle: + dup_fd = dup(fd) + else: + dup_fd = fd + + # Replicate mode normalization done in hts_open_format + smode = self.mode.replace(b'b', b'').replace(b'c', b'') + if b'b' in self.mode: + smode += b'b' + elif b'c' in self.mode: + smode += b'c' + cmode = smode + + hfile = hdopen(dup_fd, cmode) + if hfile == NULL: + raise IOError('Cannot create hfile') + + try: + # filename.name can be an int + filename = str(self.filename.name) + except AttributeError: + filename = ''.format(fd) + + filename = encode_filename(filename) + cfilename = filename + with nogil: + htsfile = hts_hopen(hfile, cfilename, cmode) + if htsfile != NULL: + hts_set_threads(htsfile, threads) + return htsfile + + def add_hts_options(self, format_options=None): + """Given a list of key=value format option strings, add them to an open htsFile + """ + cdef int rval + cdef hts_opt *opts = NULL + + if format_options: + for format_option in format_options: + rval = hts_opt_add(&opts, format_option) + if rval != 0: + if opts != NULL: + hts_opt_free(opts) + raise RuntimeError('Invalid format option ({}) specified'.format(format_option)) + if opts != NULL: + rval = hts_opt_apply(self.htsfile, opts) + if rval != 0: + hts_opt_free(opts) + raise RuntimeError('An error occurred while applying the requested format options') + hts_opt_free(opts) + + def parse_region(self, contig=None, start=None, stop=None, + region=None, tid=None, + reference=None, end=None): + """parse alternative ways to specify a genomic region. A region can + either be specified by :term:`contig`, `start` and + `stop`. `start` and `stop` denote 0-based, half-open + intervals. :term:`reference` and `end` are also accepted for + backward compatibility as synonyms for :term:`contig` and + `stop`, respectively. + + Alternatively, a samtools :term:`region` string can be + supplied. + + If any of the coordinates are missing they will be replaced by + the minimum (`start`) or maximum (`stop`) coordinate. + + Note that region strings are 1-based inclusive, while `start` + and `stop` denote an interval in 0-based, half-open + coordinates (like BED files and Python slices). + + If `contig` or `region` or are ``*``, unmapped reads at the end + of a BAM file will be returned. Setting either to ``.`` will + iterate from the beginning of the file. + + Returns + ------- + + tuple : + a tuple of `flag`, :term:`tid`, `start` and + `stop`. The flag indicates whether no coordinates were + supplied and the genomic region is the complete genomic space. + + Raises + ------ + + ValueError + for invalid or out of bounds regions. + + """ + cdef int rtid + cdef int32_t rstart + cdef int32_t rstop + + if reference is not None: + if contig is not None: + raise ValueError('contig and reference should not both be specified') + contig = reference + + if end is not None: + if stop is not None: + raise ValueError('stop and end should not both be specified') + stop = end + + if contig is None and tid is None and region is None: + return 0, 0, 0, MAX_POS + + rtid = -1 + rstart = 0 + rstop = MAX_POS + if start is not None: + try: + rstart = start + except OverflowError: + raise ValueError('start out of range (%i)' % start) + + if stop is not None: + try: + rstop = stop + except OverflowError: + raise ValueError('stop out of range (%i)' % stop) + + if region: + region = force_str(region) + if ":" in region: + contig, coord = region.split(":") + parts = coord.split("-") + rstart = int(parts[0]) - 1 + if len(parts) >= 1: + rstop = int(parts[1]) + else: + contig = region + + if tid is not None: + if not self.is_valid_tid(tid): + raise IndexError('invalid tid') + rtid = tid + else: + if contig == "*": + rtid = HTS_IDX_NOCOOR + elif contig == ".": + rtid = HTS_IDX_START + else: + rtid = self.get_tid(contig) + if rtid < 0: + raise ValueError('invalid contig `%s`' % contig) + + if rstart > rstop: + raise ValueError('invalid coordinates: start (%i) > stop (%i)' % (rstart, rstop)) + if not 0 <= rstart < MAX_POS: + raise ValueError('start out of range (%i)' % rstart) + if not 0 <= rstop <= MAX_POS: + raise ValueError('stop out of range (%i)' % rstop) + + return 1, rtid, rstart, rstop + + def is_valid_tid(self, tid): + """ + return True if the numerical :term:`tid` is valid; False otherwise. + + returns -1 if contig is not known. + """ + raise NotImplementedError() + + def is_valid_reference_name(self, contig): + """ + return True if the contig name :term:`contig` is valid; False otherwise. + """ + return self.get_tid(contig) != -1 + + def get_tid(self, contig): + """ + return the numerical :term:`tid` corresponding to + :term:`contig` + + returns -1 if contig is not known. + """ + raise NotImplementedError() + + def get_reference_name(self, tid): + """ + return :term:`contig` name corresponding to numerical :term:`tid` + """ + raise NotImplementedError() diff --git a/pysam/libcsamfile.pxd b/pysam/libcsamfile.pxd new file mode 100644 index 0000000..dff1345 --- /dev/null +++ b/pysam/libcsamfile.pxd @@ -0,0 +1,45 @@ +from pysam.libcalignmentfile cimport AlignedSegment, AlignmentFile + +################################################# +# Compatibility Layer for pysam < 0.8 + +# import all declarations from htslib +from pysam.libchtslib cimport * + +cdef class AlignedRead(AlignedSegment): + pass + +cdef class Samfile(AlignmentFile): + pass + +# import the conversion functions +cdef extern from "htslib_util.h": + + # add *nbytes* into the variable length data of *src* at *pos* + bam1_t * pysam_bam_update(bam1_t * b, + size_t nbytes_old, + size_t nbytes_new, + uint8_t * pos) + + # now: static + int aux_type2size(int) + + char * pysam_bam_get_qname(bam1_t * b) + uint32_t * pysam_bam_get_cigar(bam1_t * b) + uint8_t * pysam_bam_get_seq(bam1_t * b) + uint8_t * pysam_bam_get_qual(bam1_t * b) + uint8_t * pysam_bam_get_aux(bam1_t * b) + int pysam_bam_get_l_aux(bam1_t * b) + char pysam_bam_seqi(uint8_t * s, int i) + + uint16_t pysam_get_bin(bam1_t * b) + uint8_t pysam_get_qual(bam1_t * b) + uint8_t pysam_get_l_qname(bam1_t * b) + uint16_t pysam_get_flag(bam1_t * b) + uint32_t pysam_get_n_cigar(bam1_t * b) + void pysam_set_bin(bam1_t * b, uint16_t v) + void pysam_set_qual(bam1_t * b, uint8_t v) + void pysam_set_l_qname(bam1_t * b, uint8_t v) + void pysam_set_flag(bam1_t * b, uint16_t v) + void pysam_set_n_cigar(bam1_t * b, uint32_t v) + void pysam_update_flag(bam1_t * b, uint16_t v, uint16_t flag) diff --git a/pysam/libcsamfile.pyi b/pysam/libcsamfile.pyi new file mode 100644 index 0000000..e9b5a25 --- /dev/null +++ b/pysam/libcsamfile.pyi @@ -0,0 +1,5 @@ +from pysam.libcalignedsegment import AlignedSegment +from pysam.libcalignmentfile import AlignmentFile + +class AlignedRead(AlignedSegment): ... +class Samfile(AlignmentFile): ... diff --git a/pysam/libcsamfile.pyx b/pysam/libcsamfile.pyx new file mode 100644 index 0000000..bde93d8 --- /dev/null +++ b/pysam/libcsamfile.pyx @@ -0,0 +1,43 @@ +# cython: embedsignature=True +# cython: profile=True +# adds doc-strings for sphinx +import tempfile +import os +import sys +import types +import itertools +import struct +import ctypes +import collections +import re +import platform +import warnings +from cpython cimport PyErr_SetString, \ + PyBytes_Check, \ + PyUnicode_Check, \ + PyBytes_FromStringAndSize + +from cpython.version cimport PY_MAJOR_VERSION + +from pysam.libcalignmentfile cimport AlignmentFile, AlignedSegment + + +cdef class Samfile(AlignmentFile): + '''Deprecated alternative for :class:`~pysam.AlignmentFile` + + Added for backwards compatibility with pysam <= 0.8.0 + ''' + pass + + +cdef class AlignedRead(AlignedSegment): + '''Deprecated alternative for :class:`~pysam.AlignedSegment` + + Added for backwards compatibility with pysam <= 0.8.0 + ''' + pass + + +__all__ = ['Samfile', 'AlignedRead'] + + diff --git a/pysam/libcsamtools.pxd b/pysam/libcsamtools.pxd new file mode 100644 index 0000000..628d9a5 --- /dev/null +++ b/pysam/libcsamtools.pxd @@ -0,0 +1,8 @@ +cdef extern from "samtools.pysam.h": + + int samtools_dispatch(int argc, char *argv[]) + void samtools_set_stderr(int fd) + void samtools_close_stderr() + void samtools_set_stdout(int fd) + void samtools_set_stdout_fn(const char *) + void samtools_close_stdout() diff --git a/pysam/libcsamtools.pyi b/pysam/libcsamtools.pyi new file mode 100644 index 0000000..fe158dd --- /dev/null +++ b/pysam/libcsamtools.pyi @@ -0,0 +1 @@ +def py_samtools() -> None: ... diff --git a/pysam/libcsamtools.pyx b/pysam/libcsamtools.pyx new file mode 100644 index 0000000..cc60ace --- /dev/null +++ b/pysam/libcsamtools.pyx @@ -0,0 +1,2 @@ +def py_samtools(): + pass diff --git a/pysam/libctabix.pxd b/pysam/libctabix.pxd new file mode 100644 index 0000000..c986f03 --- /dev/null +++ b/pysam/libctabix.pxd @@ -0,0 +1,127 @@ +from libc.stdint cimport int8_t, int16_t, int32_t, int64_t +from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t +from libc.stdlib cimport malloc, calloc, realloc, free +from libc.string cimport memcpy, memcmp, strncpy, strlen, strdup +from libc.stdio cimport FILE, printf + +# Note: this replaces python "open"! +cdef extern from "fcntl.h": + int open(char *pathname, int flags) + +cdef extern from "unistd.h" nogil: + ctypedef int ssize_t + ssize_t read(int fd, void *buf, size_t count) + int close(int fd) + +from pysam.libchtslib cimport hts_idx_t, hts_itr_t, htsFile, \ + tbx_t, kstring_t, BGZF, HTSFile + + +# These functions are put here and not in chtslib.pxd in order +# to avoid warnings for unused functions. +cdef extern from "pysam_stream.h" nogil: + + ctypedef struct kstream_t: + pass + + ctypedef struct kseq_t: + kstring_t name + kstring_t comment + kstring_t seq + kstring_t qual + + kseq_t *kseq_init(BGZF *) + int kseq_read(kseq_t *) + void kseq_destroy(kseq_t *) + kstream_t *ks_init(BGZF *) + void ks_destroy(kstream_t *) + + # Retrieve characters from stream until delimiter + # is reached placing results in str. + int ks_getuntil(kstream_t *, + int delimiter, + kstring_t * str, + int * dret) + + +cdef class tabix_file_iterator: + cdef BGZF * fh + cdef kstream_t * kstream + cdef kstring_t buffer + cdef size_t size + cdef Parser parser + cdef int fd + cdef int duplicated_fd + cdef infile + + cdef __cnext__(self) + + +cdef class TabixFile(HTSFile): + # pointer to index structure + cdef tbx_t * index + + cdef readonly object filename_index + + cdef Parser parser + + cdef encoding + + +cdef class Parser: + cdef encoding + cdef parse(self, char * buffer, int len) + + +cdef class asTuple(Parser): + cdef parse(self, char * buffer, int len) + + +cdef class asGTF(Parser): + pass + + +cdef class asGFF3(Parser): + pass + + +cdef class asBed(Parser): + pass + + +cdef class asVCF(Parser): + pass + + +cdef class TabixIterator: + cdef hts_itr_t * iterator + cdef TabixFile tabixfile + cdef kstring_t buffer + cdef encoding + cdef int __cnext__(self) + + +cdef class TabixIteratorParsed(TabixIterator): + cdef Parser parser + + +cdef class GZIterator: + cdef object _filename + cdef BGZF * gzipfile + cdef kstream_t * kstream + cdef kstring_t buffer + cdef int __cnext__(self) + cdef encoding + + +cdef class GZIteratorHead(GZIterator): + pass + + +cdef class GZIteratorParsed(GZIterator): + cdef Parser parser + + +# Compatibility Layer for pysam < 0.8 +cdef class Tabixfile(TabixFile): + pass diff --git a/pysam/libctabix.pyi b/pysam/libctabix.pyi new file mode 100644 index 0000000..e1ba211 --- /dev/null +++ b/pysam/libctabix.pyi @@ -0,0 +1,103 @@ +from typing import Optional, Literal, List, Any + +from pysam.libchtslib import HTSFile + +_ParseResult = Any + +class Parser: + def __init__(self, encoding: str = ...) -> None: ... + def get_encoding(self) -> str: ... + def set_encoding(self, encoding: str) -> None: ... + def __call__(self, buffer: str, length: int) -> _ParseResult: ... + +class asTuple(Parser): ... +class asGFF3(Parser): ... +class asGTF(Parser): ... +class asBed(Parser): ... +class asVCF(Parser): ... + +class TabixFile(HTSFile): + filename_index: bytes = ... + @property + def header(self) -> List[str]: ... + @property + def contigs(self) -> List[str]: ... + def __init__( + self, + filename: str, + mode: str = ..., + parser: Parser = ..., + index: Optional[str] = ..., + encoding: str = ..., + threads: int = ..., + *args, + **kwargs + ) -> None: ... + def fetch( + self, + reference: Optional[str] = ..., + start: Optional[int] = ..., + end: Optional[int] = ..., + region: Optional[str] = ..., + parser: Optional[Parser] = ..., + multiple_iterators: bool = ..., + ) -> Any: ... + def close(self) -> None: ... + +class TabixIterator: + def __init__(self, encoding: str = ...) -> None: ... + def __iter__(self) -> TabixIterator: ... + def __next__(self) -> str: ... + +class EmptyIterator: + def __iter__(self) -> Any: ... + def __next__(self) -> Any: ... + +class TabixIteratorParsed(TabixIterator): + def __init__(self, parser: Parser) -> None: ... + def __next__(self) -> Any: ... + +class GZIterator: + def __init__( + self, filename: str, bufer_size: int = ..., encoding: str = ... + ) -> None: ... + def __iter__(self) -> GZIterator: ... + def __next__(self) -> str: ... + +class GZIteratorHead(GZIterator): ... + +class GZIteratorParsed(GZIterator): + def __init__(self, parser: Parser) -> None: ... + def __next__(self) -> _ParseResult: ... + +def tabix_compress(filename_in: str, filename_out: str, force: bool = ...) -> None: ... +def tabix_index( + filename: str, + force: bool = ..., + seq_col: Optional[int] = ..., + start_col: Optional[int] = ..., + end_col: Optional[int] = ..., + preset: Optional[Literal["gff", "bed", "sam", "vcf", "psltbl", "pileup"]] = ..., + meta_char: str = ..., + line_skip: int = ..., + zerobased: bool = ..., + min_shift: int = ..., + index: Optional[str] = ..., + keep_original: bool = ..., + csi: bool = ..., +) -> str: ... + +class tabix_file_iterator: + def __init__(self, infile: str, parser: Parser, buffer_size: int = ...) -> None: ... + def __iter__(self) -> tabix_file_iterator: ... + def __next__(self) -> _ParseResult: ... + +class tabix_generic_iterator: + def __init__(self, infile: str, parser: Parser) -> None: ... + def __iter__(self) -> tabix_generic_iterator: ... + def __next__(self) -> _ParseResult: ... + +def tabix_iterator(infile: str, parser: Optional[Parser]) -> _ParseResult: ... + +# backwards compatibility +class Tabixfile(TabixFile): ... diff --git a/pysam/libctabix.pyx b/pysam/libctabix.pyx new file mode 100644 index 0000000..4436420 --- /dev/null +++ b/pysam/libctabix.pyx @@ -0,0 +1,1302 @@ +# cython: embedsignature=True +# cython: profile=True +############################################################################### +############################################################################### +# Cython wrapper for access to tabix indexed files in bgzf format +############################################################################### +# The principal classes and functions defined in this module are: +# +# class TabixFile class wrapping tabix indexed files in bgzf format +# +# class asTuple Parser class for tuples +# class asGTF Parser class for GTF formatted rows +# class asGFF3 Parser class for GFF3 formatted rows +# class asBed Parser class for Bed formatted rows +# class asVCF Parser class for VCF formatted rows +# +# class tabix_generic_iterator Streamed iterator of bgzf formatted files +# +# Additionally this module defines several additional classes that are part +# of the internal API. These are: +# +# class Parser base class for parsers of tab-separated rows +# class tabix_file_iterator +# class TabixIterator iterator class over rows in bgzf file +# class EmptyIterator +# +# For backwards compatibility, the following classes are also defined: +# +# class Tabixfile equivalent to TabixFile +# +############################################################################### +# +# The MIT License +# +# Copyright (c) 2015 Andreas Heger +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# +############################################################################### +import os +import sys + +from libc.stdio cimport printf, fprintf, stderr +from libc.string cimport strerror +from libc.errno cimport errno +from posix.unistd cimport dup + +from cpython cimport PyErr_SetString, PyBytes_Check, \ + PyUnicode_Check, PyBytes_FromStringAndSize, \ + PyObject_AsFileDescriptor + +from cpython.version cimport PY_MAJOR_VERSION + +cimport pysam.libctabixproxies as ctabixproxies + +from pysam.libchtslib cimport htsFile, hts_open, hts_close, HTS_IDX_START,\ + BGZF, bgzf_open, bgzf_dopen, bgzf_close, bgzf_write, \ + tbx_index_build2, tbx_index_load2, tbx_itr_queryi, tbx_itr_querys, \ + tbx_conf_t, tbx_seqnames, tbx_itr_next, tbx_itr_destroy, \ + tbx_destroy, hisremote, region_list, hts_getline, \ + TBX_GENERIC, TBX_SAM, TBX_VCF, TBX_UCSC, hts_get_format, htsFormat, \ + no_compression, bcf, bcf_index_build2 + +from pysam.libcutils cimport force_bytes, force_str, charptr_to_str +from pysam.libcutils cimport encode_filename, from_string_and_size + +cdef class Parser: + + def __init__(self, encoding="ascii"): + self.encoding = encoding + + def set_encoding(self, encoding): + self.encoding = encoding + + def get_encoding(self): + return self.encoding + + cdef parse(self, char * buffer, int length): + raise NotImplementedError( + 'parse method of %s not implemented' % str(self)) + + def __call__(self, char * buffer, int length): + return self.parse(buffer, length) + + +cdef class asTuple(Parser): + '''converts a :term:`tabix row` into a python tuple. + + A field in a row is accessed by numeric index. + ''' + cdef parse(self, char * buffer, int len): + cdef ctabixproxies.TupleProxy r + r = ctabixproxies.TupleProxy(self.encoding) + # need to copy - there were some + # persistence issues with "present" + r.copy(buffer, len) + return r + + +cdef class asGFF3(Parser): + '''converts a :term:`tabix row` into a GFF record with the following + fields: + + +----------+----------+-------------------------------+ + |*Column* |*Name* |*Content* | + +----------+----------+-------------------------------+ + |1 |contig |the chromosome name | + +----------+----------+-------------------------------+ + |2 |feature |The feature type | + +----------+----------+-------------------------------+ + |3 |source |The feature source | + +----------+----------+-------------------------------+ + |4 |start |genomic start coordinate | + | | |(0-based) | + +----------+----------+-------------------------------+ + |5 |end |genomic end coordinate | + | | |(0-based) | + +----------+----------+-------------------------------+ + |6 |score |feature score | + +----------+----------+-------------------------------+ + |7 |strand |strand | + +----------+----------+-------------------------------+ + |8 |frame |frame | + +----------+----------+-------------------------------+ + |9 |attributes|the attribute field | + +----------+----------+-------------------------------+ + + ''' + cdef parse(self, char * buffer, int len): + cdef ctabixproxies.GFF3Proxy r + r = ctabixproxies.GFF3Proxy(self.encoding) + r.copy(buffer, len) + return r + + +cdef class asGTF(Parser): + '''converts a :term:`tabix row` into a GTF record with the following + fields: + + +----------+----------+-------------------------------+ + |*Column* |*Name* |*Content* | + +----------+----------+-------------------------------+ + |1 |contig |the chromosome name | + +----------+----------+-------------------------------+ + |2 |feature |The feature type | + +----------+----------+-------------------------------+ + |3 |source |The feature source | + +----------+----------+-------------------------------+ + |4 |start |genomic start coordinate | + | | |(0-based) | + +----------+----------+-------------------------------+ + |5 |end |genomic end coordinate | + | | |(0-based) | + +----------+----------+-------------------------------+ + |6 |score |feature score | + +----------+----------+-------------------------------+ + |7 |strand |strand | + +----------+----------+-------------------------------+ + |8 |frame |frame | + +----------+----------+-------------------------------+ + |9 |attributes|the attribute field | + +----------+----------+-------------------------------+ + + GTF formatted entries also define the following fields that + are derived from the attributes field: + + +--------------------+------------------------------+ + |*Name* |*Content* | + +--------------------+------------------------------+ + |gene_id |the gene identifier | + +--------------------+------------------------------+ + |transcript_id |the transcript identifier | + +--------------------+------------------------------+ + + ''' + cdef parse(self, char * buffer, int len): + cdef ctabixproxies.GTFProxy r + r = ctabixproxies.GTFProxy(self.encoding) + r.copy(buffer, len) + return r + + +cdef class asBed(Parser): + '''converts a :term:`tabix row` into a bed record + with the following fields: + + +-----------+-----------+------------------------------------------+ + |*Column* |*Field* |*Contents* | + | | | | + +-----------+-----------+------------------------------------------+ + |1 |contig |contig | + | | | | + +-----------+-----------+------------------------------------------+ + |2 |start |genomic start coordinate (zero-based) | + +-----------+-----------+------------------------------------------+ + |3 |end |genomic end coordinate plus one | + | | |(zero-based) | + +-----------+-----------+------------------------------------------+ + |4 |name |name of feature. | + +-----------+-----------+------------------------------------------+ + |5 |score |score of feature | + +-----------+-----------+------------------------------------------+ + |6 |strand |strand of feature | + +-----------+-----------+------------------------------------------+ + |7 |thickStart |thickStart | + +-----------+-----------+------------------------------------------+ + |8 |thickEnd |thickEnd | + +-----------+-----------+------------------------------------------+ + |9 |itemRGB |itemRGB | + +-----------+-----------+------------------------------------------+ + |10 |blockCount |number of bocks | + +-----------+-----------+------------------------------------------+ + |11 |blockSizes |',' separated string of block sizes | + +-----------+-----------+------------------------------------------+ + |12 |blockStarts|',' separated string of block genomic | + | | |start positions | + +-----------+-----------+------------------------------------------+ + + Only the first three fields are required. Additional + fields are optional, but if one is defined, all the preceding + need to be defined as well. + + ''' + cdef parse(self, char * buffer, int len): + cdef ctabixproxies.BedProxy r + r = ctabixproxies.BedProxy(self.encoding) + r.copy(buffer, len) + return r + + +cdef class asVCF(Parser): + '''converts a :term:`tabix row` into a VCF record with + the following fields: + + +----------+---------+------------------------------------+ + |*Column* |*Field* |*Contents* | + | | | | + +----------+---------+------------------------------------+ + |1 |contig |chromosome | + +----------+---------+------------------------------------+ + |2 |pos |chromosomal position, zero-based | + +----------+---------+------------------------------------+ + |3 |id |id | + +----------+---------+------------------------------------+ + |4 |ref |reference allele | + +----------+---------+------------------------------------+ + |5 |alt |alternate alleles | + +----------+---------+------------------------------------+ + |6 |qual |quality | + +----------+---------+------------------------------------+ + |7 |filter |filter | + +----------+---------+------------------------------------+ + |8 |info |info | + +----------+---------+------------------------------------+ + |9 |format |format specifier. | + +----------+---------+------------------------------------+ + + Access to genotypes is via index:: + + contig = vcf.contig + first_sample_genotype = vcf[0] + second_sample_genotype = vcf[1] + + ''' + cdef parse(self, char * buffer, int len): + cdef ctabixproxies.VCFProxy r + r = ctabixproxies.VCFProxy(self.encoding) + r.copy(buffer, len) + return r + + +cdef class TabixFile: + """Random access to bgzf formatted files that + have been indexed by :term:`tabix`. + + The file is automatically opened. The index file of file + ```` is expected to be called ``.tbi`` + by default (see parameter `index`). + + Parameters + ---------- + + filename : string + Filename of bgzf file to be opened. + + index : string + The filename of the index. If not set, the default is to + assume that the index is called ``filename.tbi`` + + mode : char + The file opening mode. Currently, only ``r`` is permitted. + + parser : :class:`pysam.Parser` + + sets the default parser for this tabix file. If `parser` + is None, the results are returned as an unparsed string. + Otherwise, `parser` is assumed to be a functor that will return + parsed data (see for example :class:`~pysam.asTuple` and + :class:`~pysam.asGTF`). + + encoding : string + + The encoding passed to the parser + + threads: integer + Number of threads to use for decompressing Tabix files. + (Default=1) + + + Raises + ------ + + ValueError + if index file is missing. + + IOError + if file could not be opened + """ + def __cinit__(self, + filename, + mode='r', + parser=None, + index=None, + encoding="ascii", + threads=1, + *args, + **kwargs ): + + self.htsfile = NULL + self.is_remote = False + self.is_stream = False + self.parser = parser + self.threads = threads + self._open(filename, mode, index, *args, **kwargs) + self.encoding = encoding + + def _open( self, + filename, + mode='r', + index=None, + threads=1, + ): + '''open a :term:`tabix file` for reading.''' + + if mode != 'r': + raise ValueError("invalid file opening mode `%s`" % mode) + + if self.htsfile != NULL: + self.close() + self.htsfile = NULL + self.threads=threads + + filename_index = index or (filename + ".tbi") + # encode all the strings to pass to tabix + self.filename = encode_filename(filename) + self.filename_index = encode_filename(filename_index) + + self.is_stream = self.filename == b'-' + self.is_remote = hisremote(self.filename) + + if not self.is_remote: + if not os.path.exists(filename): + raise IOError("file `%s` not found" % filename) + + if not os.path.exists(filename_index): + raise IOError("index `%s` not found" % filename_index) + + # open file + cdef char *cfilename = self.filename + cdef char *cfilename_index = self.filename_index + with nogil: + self.htsfile = hts_open(cfilename, 'r') + + if self.htsfile == NULL: + raise IOError("could not open file `%s`" % filename) + + #if self.htsfile.format.category != region_list: + # raise ValueError("file does not contain region data") + + with nogil: + self.index = tbx_index_load2(cfilename, cfilename_index) + + if self.index == NULL: + raise IOError("could not open index for `%s`" % filename) + + if not self.is_stream: + self.start_offset = self.tell() + + def _dup(self): + '''return a copy of this tabix file. + + The file is being re-opened. + ''' + return TabixFile(self.filename, + mode="r", + threads=self.threads, + parser=self.parser, + index=self.filename_index, + encoding=self.encoding) + + def fetch(self, + reference=None, + start=None, + end=None, + region=None, + parser=None, + multiple_iterators=False): + '''fetch one or more rows in a :term:`region` using 0-based + indexing. The region is specified by :term:`reference`, + *start* and *end*. Alternatively, a samtools :term:`region` + string can be supplied. + + Without *reference* or *region* all entries will be fetched. + + If only *reference* is set, all reads matching on *reference* + will be fetched. + + If *parser* is None, the default parser will be used for + parsing. + + Set *multiple_iterators* to true if you will be using multiple + iterators on the same file at the same time. The iterator + returned will receive its own copy of a filehandle to the file + effectively re-opening the file. Re-opening a file creates + some overhead, so beware. + + ''' + if not self.is_open(): + raise ValueError("I/O operation on closed file") + + # convert coordinates to region string, which is one-based + if reference: + if end is not None: + if end < 0: + raise ValueError("end out of range (%i)" % end) + if start is None: + start = 0 + + if start < 0: + raise ValueError("start out of range (%i)" % end) + elif start > end: + raise ValueError( + 'start (%i) >= end (%i)' % (start, end)) + elif start == end: + return EmptyIterator() + else: + region = '%s:%i-%i' % (reference, start + 1, end) + elif start is not None: + if start < 0: + raise ValueError("start out of range (%i)" % end) + region = '%s:%i' % (reference, start + 1) + else: + region = reference + + # get iterator + cdef hts_itr_t * itr + cdef char *cstr + cdef TabixFile fileobj + + # reopen the same file if necessary + if multiple_iterators: + fileobj = self._dup() + else: + fileobj = self + + if region is None: + # without region or reference - iterate from start + with nogil: + itr = tbx_itr_queryi(fileobj.index, + HTS_IDX_START, + 0, + 0) + else: + s = force_bytes(region, encoding=fileobj.encoding) + cstr = s + with nogil: + itr = tbx_itr_querys(fileobj.index, cstr) + + if itr == NULL: + if region is None: + if len(self.contigs) > 0: + # when accessing a tabix file created prior tabix 1.0 + # the full-file iterator is empty. + raise ValueError( + "could not create iterator, possible " + "tabix version mismatch") + else: + # possible reason is that the file is empty - + # return an empty iterator + return EmptyIterator() + else: + raise ValueError( + "could not create iterator for region '%s'" % + region) + + # use default parser if no parser is specified + if parser is None: + parser = fileobj.parser + + cdef TabixIterator a + if parser is None: + a = TabixIterator(encoding=fileobj.encoding) + else: + parser.set_encoding(fileobj.encoding) + a = TabixIteratorParsed(parser) + + a.tabixfile = fileobj + a.iterator = itr + + return a + + ############################################################### + ############################################################### + ############################################################### + ## properties + ############################################################### + property header: + '''the file header. + + The file header consists of the lines at the beginning of a + file that are prefixed by the comment character ``#``. + + .. note:: + The header is returned as an iterator presenting lines + without the newline character. + ''' + + def __get__(self): + + cdef char *cfilename = self.filename + cdef char *cfilename_index = self.filename_index + + cdef kstring_t buffer + buffer.l = buffer.m = 0 + buffer.s = NULL + + cdef htsFile * fp = NULL + cdef int KS_SEP_LINE = 2 + cdef tbx_t * tbx = NULL + lines = [] + with nogil: + fp = hts_open(cfilename, 'r') + + if fp == NULL: + raise OSError("could not open {} for reading header".format(self.filename)) + + with nogil: + tbx = tbx_index_load2(cfilename, cfilename_index) + + if tbx == NULL: + raise OSError("could not load .tbi/.csi index of {}".format(self.filename)) + + while hts_getline(fp, KS_SEP_LINE, &buffer) >= 0: + if not buffer.l or buffer.s[0] != tbx.conf.meta_char: + break + lines.append(force_str(buffer.s, self.encoding)) + + with nogil: + hts_close(fp) + free(buffer.s) + + return lines + + property contigs: + '''list of chromosome names''' + def __get__(self): + cdef const char ** sequences + cdef int nsequences + + with nogil: + sequences = tbx_seqnames(self.index, &nsequences) + cdef int x + result = [] + for x from 0 <= x < nsequences: + result.append(force_str(sequences[x])) + + # htslib instructions: + # only free container, not the sequences themselves + free(sequences) + + return result + + def close(self): + ''' + closes the :class:`pysam.TabixFile`.''' + if self.htsfile != NULL: + hts_close(self.htsfile) + self.htsfile = NULL + if self.index != NULL: + tbx_destroy(self.index) + self.index = NULL + + def __dealloc__( self ): + # remember: dealloc cannot call other python methods + # note: no doc string + # note: __del__ is not called. + if self.htsfile != NULL: + hts_close(self.htsfile) + self.htsfile = NULL + if self.index != NULL: + tbx_destroy(self.index) + + +cdef class TabixIterator: + """iterates over rows in *tabixfile* in region + given by *tid*, *start* and *end*. + """ + + def __init__(self, encoding="ascii"): + self.encoding = encoding + + def __iter__(self): + self.buffer.s = NULL + self.buffer.l = 0 + self.buffer.m = 0 + + return self + + cdef int __cnext__(self): + '''iterate to next element. + + Return -5 if file has been closed when this function + was called. + ''' + if self.tabixfile.htsfile == NULL: + return -5 + + cdef int retval + + while 1: + with nogil: + retval = tbx_itr_next( + self.tabixfile.htsfile, + self.tabixfile.index, + self.iterator, + &self.buffer) + + if retval < 0: + break + + if self.buffer.s[0] != '#': + break + + return retval + + def __next__(self): + """python version of next(). + + pyrex uses this non-standard name instead of next() + """ + + cdef int retval = self.__cnext__() + if retval == -5: + raise IOError("iteration on closed file") + elif retval < 0: + raise StopIteration + + return charptr_to_str(self.buffer.s, self.encoding) + + def next(self): + return self.__next__() + + def __dealloc__(self): + if self.iterator != NULL: + tbx_itr_destroy(self.iterator) + if self.buffer.s != NULL: + free(self.buffer.s) + + +class EmptyIterator: + '''empty iterator''' + + def __iter__(self): + return self + + def next(self): + raise StopIteration() + + def __next__(self): + raise StopIteration() + + +cdef class TabixIteratorParsed(TabixIterator): + """iterates over mapped reads in a region. + + The *parser* determines the encoding. + + Returns parsed data. + """ + + def __init__(self, + Parser parser): + + TabixIterator.__init__(self) + self.parser = parser + + def __next__(self): + """python version of next(). + + pyrex uses this non-standard name instead of next() + """ + + cdef int retval = self.__cnext__() + if retval == -5: + raise IOError("iteration on closed file") + elif retval < 0: + raise StopIteration + + return self.parser.parse(self.buffer.s, + self.buffer.l) + + +cdef class GZIterator: + def __init__(self, filename, int buffer_size=65536, encoding="ascii"): + '''iterate line-by-line through gzip (or bgzip) + compressed file. + ''' + if not os.path.exists(filename): + raise IOError("No such file or directory: %s" % filename) + + filename = encode_filename(filename) + cdef char *cfilename = filename + with nogil: + self.gzipfile = bgzf_open(cfilename, "r") + self._filename = filename + self.kstream = ks_init(self.gzipfile) + self.encoding = encoding + + self.buffer.l = 0 + self.buffer.m = 0 + self.buffer.s = malloc(buffer_size) + + def __dealloc__(self): + '''close file.''' + if self.gzipfile != NULL: + bgzf_close(self.gzipfile) + self.gzipfile = NULL + if self.buffer.s != NULL: + free(self.buffer.s) + if self.kstream != NULL: + ks_destroy(self.kstream) + + def __iter__(self): + return self + + cdef int __cnext__(self): + cdef int dret = 0 + cdef int retval = 0 + while 1: + with nogil: + retval = ks_getuntil(self.kstream, '\n', &self.buffer, &dret) + + if retval < 0: + break + + return dret + return -1 + + def __next__(self): + """python version of next(). + """ + cdef int retval = self.__cnext__() + if retval < 0: + raise StopIteration + return force_str(self.buffer.s, self.encoding) + + +cdef class GZIteratorHead(GZIterator): + '''iterate line-by-line through gzip (or bgzip) + compressed file returning comments at top of file. + ''' + + def __next__(self): + """python version of next(). + """ + cdef int retval = self.__cnext__() + if retval < 0: + raise StopIteration + if self.buffer.s[0] == '#': + return self.buffer.s + else: + raise StopIteration + + +cdef class GZIteratorParsed(GZIterator): + '''iterate line-by-line through gzip (or bgzip) + compressed file returning comments at top of file. + ''' + + def __init__(self, parser): + self.parser = parser + + def __next__(self): + """python version of next(). + """ + cdef int retval = self.__cnext__() + if retval < 0: + raise StopIteration + + return self.parser.parse(self.buffer.s, + self.buffer.l) + + +def tabix_compress(filename_in, + filename_out, + force=False): + '''compress *filename_in* writing the output to *filename_out*. + + Raise an IOError if *filename_out* already exists, unless *force* + is set. + ''' + + if not force and os.path.exists(filename_out): + raise IOError( + "Filename '%s' already exists, use *force* to " + "overwrite" % filename_out) + + cdef int WINDOW_SIZE + cdef int c, r + cdef void * buffer + cdef BGZF * fp + cdef int fd_src + cdef bint is_empty = True + cdef int O_RDONLY + O_RDONLY = os.O_RDONLY + + WINDOW_SIZE = 64 * 1024 + + fn = encode_filename(filename_out) + cdef char *cfn = fn + with nogil: + fp = bgzf_open(cfn, "w") + if fp == NULL: + raise IOError("could not open '%s' for writing" % filename_out) + + fn = encode_filename(filename_in) + fd_src = open(fn, O_RDONLY) + if fd_src == 0: + raise IOError("could not open '%s' for reading" % filename_in) + + buffer = malloc(WINDOW_SIZE) + c = 1 + + while c > 0: + with nogil: + c = read(fd_src, buffer, WINDOW_SIZE) + if c > 0: + is_empty = False + r = bgzf_write(fp, buffer, c) + if r < 0: + free(buffer) + raise IOError("writing failed") + + free(buffer) + r = bgzf_close(fp) + if r < 0: + raise IOError("error %i when writing to file %s" % (r, filename_out)) + + r = close(fd_src) + # an empty file will return with -1, thus ignore this. + if r < 0: + if not (r == -1 and is_empty): + raise IOError("error %i when closing file %s" % (r, filename_in)) + + +def tabix_index(filename, + force=False, + seq_col=None, + start_col=None, + end_col=None, + preset=None, + meta_char="#", + int line_skip=0, + zerobased=False, + int min_shift=-1, + index=None, + keep_original=False, + csi=False, + ): + '''index tab-separated *filename* using tabix. + + An existing index will not be overwritten unless *force* is set. + + The index will be built from coordinates in columns *seq_col*, + *start_col* and *end_col*. + + The contents of *filename* have to be sorted by contig and + position - the method does not check if the file is sorted. + + Column indices are 0-based. Note that this is different from the + tabix command line utility where column indices start at 1. + + Coordinates in the file are assumed to be 1-based unless + *zerobased* is set. + + If *preset* is provided, the column coordinates are taken from a + preset. Valid values for preset are "gff", "bed", "sam", "vcf", + psltbl", "pileup". + + Lines beginning with *meta_char* and the first *line_skip* lines + will be skipped. + + If *filename* is not detected as a gzip file it will be automatically + compressed. The original file will be removed and only the compressed + file will be retained. + + By default or when *min_shift* is 0, creates a TBI index. If *min_shift* + is greater than zero and/or *csi* is True, creates a CSI index with a + minimal interval size of 1<<*min_shift* (1<<14 if only *csi* is set). + + *index* controls the filename which should be used for creating the index. + If not set, the default is to append ``.tbi`` to *filename*. + + When automatically compressing files, if *keep_original* is set the + uncompressed file will not be deleted. + + returns the filename of the compressed data + + ''' + + if preset is None and \ + (seq_col is None or start_col is None or end_col is None): + raise ValueError( + "neither preset nor seq_col,start_col and end_col given") + + fn = encode_filename(filename) + cdef char *cfn = fn + + cdef htsFile *fp = hts_open(cfn, "r") + if fp == NULL: + raise IOError("Could not open file '%s': %s" % (filename, force_str(strerror(errno)))) + + cdef htsFormat fmt = hts_get_format(fp)[0] + hts_close(fp) + + if fmt.compression == no_compression: + tabix_compress(filename, filename + ".gz", force=force) + if not keep_original: + os.unlink(filename) + filename += ".gz" + fn = encode_filename(filename) + cfn = fn + + # columns (1-based): + # preset-code, contig, start, end, metachar for + # comments, lines to ignore at beginning + # 0 is a missing column + preset2conf = { + 'gff' : (TBX_GENERIC, 1, 4, 5, ord('#'), 0), + 'bed' : (TBX_UCSC, 1, 2, 3, ord('#'), 0), + 'psltbl' : (TBX_UCSC, 15, 17, 18, ord('#'), 0), + 'sam' : (TBX_SAM, 3, 4, 0, ord('@'), 0), + 'vcf' : (TBX_VCF, 1, 2, 0, ord('#'), 0), + } + + conf_data = None + if preset == "bcf" or fmt.format == bcf: + csi = True + elif preset: + try: + conf_data = preset2conf[preset] + except KeyError: + raise KeyError( + "unknown preset '%s', valid presets are '%s'" % + (preset, ",".join(preset2conf.keys()))) + else: + if end_col is None: + end_col = -1 + + preset = 0 + # tabix internally works with 0-based coordinates and + # open/closed intervals. When using a preset, conversion is + # automatically taken care of. Otherwise, the coordinates are + # assumed to be 1-based closed intervals and -1 is subtracted + # from the start coordinate. To avoid doing this, set the + # TI_FLAG_UCSC=0x10000 flag: + if zerobased: + preset = preset | TBX_UCSC + + conf_data = (preset, seq_col + 1, start_col + 1, end_col + 1, ord(meta_char), line_skip) + + cdef tbx_conf_t conf + if conf_data: + conf.preset, conf.sc, conf.bc, conf.ec, conf.meta_char, conf.line_skip = conf_data + + if csi or min_shift > 0: + suffix = ".csi" + if min_shift <= 0: min_shift = 14 + else: + suffix = ".tbi" + min_shift = 0 + + index = index or filename + suffix + fn_index = encode_filename(index) + + if not force and os.path.exists(index): + raise IOError( + "filename '%s' already exists, use *force* to overwrite" % index) + + cdef char *fnidx = fn_index + cdef int retval = 0 + + if csi and fmt.format == bcf: + with nogil: + retval = bcf_index_build2(cfn, fnidx, min_shift) + else: + with nogil: + retval = tbx_index_build2(cfn, fnidx, min_shift, &conf) + + if retval != 0: + raise OSError("building of index for {} failed".format(filename)) + + return filename + +# ######################################################### +# cdef class tabix_file_iterator_old: +# '''iterate over ``infile``. + +# This iterator is not safe. If the :meth:`__next__()` method is called +# after ``infile`` is closed, the result is undefined (see ``fclose()``). + +# The iterator might either raise a StopIteration or segfault. +# ''' + + +# def __cinit__(self, +# infile, +# Parser parser, +# int buffer_size = 65536 ): + +# cdef int fd = PyObject_AsFileDescriptor( infile ) +# if fd == -1: raise ValueError( "I/O operation on closed file." ) +# self.infile = fdopen( fd, 'r') + +# if self.infile == NULL: raise ValueError( "I/O operation on closed file." ) + +# self.buffer = malloc( buffer_size ) +# self.size = buffer_size +# self.parser = parser + +# def __iter__(self): +# return self + +# cdef __cnext__(self): + +# cdef char * b +# cdef size_t nbytes +# b = self.buffer + +# while not feof( self.infile ): +# nbytes = getline( &b, &self.size, self.infile) + +# # stop at first error or eof +# if (nbytes == -1): break +# # skip comments +# if (b[0] == '#'): continue + +# # skip empty lines +# if b[0] == '\0' or b[0] == '\n' or b[0] == '\r': continue + +# # make sure that entry is complete +# if b[nbytes-1] != '\n' and b[nbytes-1] != '\r': +# result = b +# raise ValueError( "incomplete line at %s" % result ) + +# # make sure that this goes fully through C +# # otherwise buffer is copied to/from a +# # Python object causing segfaults as +# # the wrong memory is freed +# return self.parser.parse( b, nbytes ) + +# raise StopIteration + +# def __dealloc__(self): +# free(self.buffer) + +# def __next__(self): +# return self.__cnext__() + +######################################################### +######################################################### +######################################################### +## Iterators for parsing through unindexed files. +######################################################### +# cdef buildGzipError(void *gzfp): +# cdef int errnum = 0 +# cdef char *s = gzerror(gzfp, &errnum) +# return "error (%d): %s (%d: %s)" % (errno, strerror(errno), errnum, s) + + +cdef class tabix_file_iterator: + '''iterate over a compressed or uncompressed ``infile``. + ''' + + def __cinit__(self, + infile, + Parser parser, + int buffer_size=65536): + + if infile.closed: + raise ValueError("I/O operation on closed file.") + + self.infile = infile + + cdef int fd = PyObject_AsFileDescriptor(infile) + if fd == -1: + raise ValueError("I/O operation on closed file.") + + self.duplicated_fd = dup(fd) + + # From the manual: + # gzopen can be used to read a file which is not in gzip format; + # in this case gzread will directly read from the file without decompression. + # When reading, this will be detected automatically by looking + # for the magic two-byte gzip header. + self.fh = bgzf_dopen(self.duplicated_fd, 'r') + + if self.fh == NULL: + raise IOError('%s' % strerror(errno)) + + self.kstream = ks_init(self.fh) + + self.buffer.s = malloc(buffer_size) + #if self.buffer == NULL: + # raise MemoryError( "tabix_file_iterator: could not allocate %i bytes" % buffer_size) + #self.size = buffer_size + self.parser = parser + + def __iter__(self): + return self + + cdef __cnext__(self): + + cdef char * b + cdef int dret = 0 + cdef int retval = 0 + while 1: + with nogil: + retval = ks_getuntil(self.kstream, '\n', &self.buffer, &dret) + + if retval < 0: + break + #raise IOError('gzip error: %s' % buildGzipError( self.fh )) + + b = self.buffer.s + + # skip comments + if (b[0] == '#'): + continue + + # skip empty lines + if b[0] == '\0' or b[0] == '\n' or b[0] == '\r': + continue + + # gzgets terminates at \n, no need to test + + # parser creates a copy + return self.parser.parse(b, self.buffer.l) + + raise StopIteration + + def __dealloc__(self): + free(self.buffer.s) + ks_destroy(self.kstream) + bgzf_close(self.fh) + + def __next__(self): + return self.__cnext__() + + def next(self): + return self.__cnext__() + + +class tabix_generic_iterator: + '''iterate over ``infile``. + + Permits the use of file-like objects for example from the gzip module. + ''' + def __init__(self, infile, parser): + + self.infile = infile + if self.infile.closed: + raise ValueError("I/O operation on closed file.") + self.parser = parser + + def __iter__(self): + return self + + # cython version - required for python 3 + def __next__(self): + + cdef char * b + cdef char * cpy + cdef size_t nbytes + + encoding = self.parser.get_encoding() + + # note that GzipFile.close() does not close the file + # reading is still possible. + if self.infile.closed: + raise ValueError("I/O operation on closed file.") + + while 1: + + line = self.infile.readline() + if not line: + break + + s = force_bytes(line, encoding) + b = s + nbytes = len(line) + assert b[nbytes] == '\0' + + # skip comments + if b[0] == '#': + continue + + # skip empty lines + if b[0] == '\0' or b[0] == '\n' or b[0] == '\r': + continue + + # make sure that entry is complete + if b[nbytes-1] != '\n' and b[nbytes-1] != '\r': + raise ValueError("incomplete line at %s" % line) + + bytes_cpy = b + cpy = bytes_cpy + + return self.parser(cpy, nbytes) + + raise StopIteration + + # python version - required for python 2.7 + def next(self): + return self.__next__() + + +def tabix_iterator(infile, parser): + """return an iterator over all entries in a file. + + Results are returned parsed as specified by the *parser*. If + *parser* is None, the results are returned as an unparsed string. + Otherwise, *parser* is assumed to be a functor that will return + parsed data (see for example :class:`~pysam.asTuple` and + :class:`~pysam.asGTF`). + + """ + if PY_MAJOR_VERSION >= 3: + return tabix_generic_iterator(infile, parser) + else: + return tabix_file_iterator(infile, parser) + + # file objects can use C stdio + # used to be: isinstance( infile, file): + # if PY_MAJOR_VERSION >= 3: + # if isinstance( infile, io.IOBase ): + # return tabix_copy_iterator( infile, parser ) + # else: + # return tabix_generic_iterator( infile, parser ) + # else: +# if isinstance( infile, file ): +# return tabix_copy_iterator( infile, parser ) +# else: +# return tabix_generic_iterator( infile, parser ) + +cdef class Tabixfile(TabixFile): + """Tabixfile is deprecated: use TabixFile instead""" + pass + + +__all__ = [ + "tabix_index", + "tabix_compress", + "TabixFile", + "Tabixfile", + "asTuple", + "asGTF", + "asGFF3", + "asVCF", + "asBed", + "GZIterator", + "GZIteratorHead", + "tabix_iterator", + "tabix_generic_iterator", + "tabix_file_iterator", +] diff --git a/pysam/libctabixproxies.pxd b/pysam/libctabixproxies.pxd new file mode 100644 index 0000000..907b40d --- /dev/null +++ b/pysam/libctabixproxies.pxd @@ -0,0 +1,65 @@ +#cdef extern from "Python.h": +# ctypedef struct FILE + +from libc.stdint cimport uint8_t, int32_t, uint32_t, int64_t, uint64_t + +cdef class TupleProxy: + + cdef: + char * data + char ** fields + int nfields + int nbytes + int offset + bint is_modified + + cdef encoding + + cpdef int getMaxFields(self) + cpdef int getMinFields(self) +# cdef char * _getindex(self, int idx) + + cdef take(self, char * buffer, size_t nbytes) + cdef present(self, char * buffer, size_t nbytes) + cdef copy(self, char * buffer, size_t nbytes, bint reset=*) + cdef update(self, char * buffer, size_t nbytes) + + +cdef class TupleProxyIterator: + cdef TupleProxy proxy + cdef int index + + +cdef class NamedTupleProxy(TupleProxy): + pass + + +cdef class GTFProxy(NamedTupleProxy): + cdef object attribute_dict + cpdef int getMaxFields(self) + cpdef int getMinFields(self) + + +cdef class GFF3Proxy(GTFProxy): + pass + + +cdef class BedProxy(NamedTupleProxy): + + cdef: + char * contig + uint32_t start + uint32_t end + int bedfields + + cpdef int getMaxFields(self) + cpdef int getMinFields(self) + cdef update(self, char * buffer, size_t nbytes) + +cdef class VCFProxy(NamedTupleProxy) : + + cdef: + char * contig + uint32_t pos + + cdef update(self, char * buffer, size_t nbytes) diff --git a/pysam/libctabixproxies.pyi b/pysam/libctabixproxies.pyi new file mode 100644 index 0000000..f720c7e --- /dev/null +++ b/pysam/libctabixproxies.pyi @@ -0,0 +1,62 @@ +from typing import ( + Optional, + overload, + List, + Dict, + OrderedDict, + Tuple, + Iterable, + KeysView, + Any, +) + +class TupleProxyIterator: + def __init__(self, proxy: Any): ... + def __iter__(self) -> TupleProxyIterator: ... + def __next__(self) -> Optional[str]: ... + +class TupleProxy: + def __init__(self, encoding: str = ...) -> None: ... + def __copy__(self) -> TupleProxy: ... + def compare(self, other: TupleProxy) -> int: ... + def getMinFields(self) -> int: ... + def getMaxFields(self) -> int: ... + def _getindex(self, index: int) -> str: ... + @overload + def __getitem__(self, key: slice) -> List[str]: ... + @overload + def __getitem__(self, key: int) -> Any: ... + def _setindex(self, index: int, value: Optional[str]) -> None: ... + def __setitem__(self, index: int, value: Optional[str]) -> None: ... + def __len__(self) -> int: ... + def __iter__(self) -> TupleProxyIterator: ... + +class NamedTupleProxy(TupleProxy): + def __setattr__(self, key: str, value: str) -> None: ... + def __getattr__(self, key: str) -> str: ... + +class GTFProxy(NamedTupleProxy): + def to_dict(self) -> Dict[str, Any]: ... + def from_dict(self, d: Dict[str, Any]) -> None: ... + def invert(self, lcontig: int) -> None: ... + def keys(self) -> KeysView[str]: ... + def setAttribute(self, key: str, value: Any) -> None: ... + def attribute_string2dict(self, s: str) -> OrderedDict[str, Any]: ... + def dict2attribute_string(self, d: Dict[str, Any]) -> str: ... + def attribute_string2iterator(self, s: str) -> Iterable[Tuple[str, Any]]: ... + def __getattr__(self, key: str) -> Any: ... + def __setattr__(self, key: str, value: Any) -> None: ... + # deprecated: + # def asDict(self) -> Any: ... + # def as_dict(self) -> Any: ... + # def fromDict(self, *args, **kwargs) -> Any: ... + +class GFF3Proxy(GTFProxy): ... + +class BedProxy(NamedTupleProxy): + def __setattr__(self, key: str, value: Any) -> None: ... + +class VCFProxy(NamedTupleProxy): + @property + def pos(self) -> int: ... + def __setattr__(self, key: str, value: Any) -> None: ... diff --git a/pysam/libctabixproxies.pyx b/pysam/libctabixproxies.pyx new file mode 100644 index 0000000..10b3e5a --- /dev/null +++ b/pysam/libctabixproxies.pyx @@ -0,0 +1,836 @@ +from cpython cimport PyBytes_FromStringAndSize + +from libc.stdio cimport printf, feof, fgets +from libc.string cimport strcpy, strlen, memcmp, memcpy, memchr, strstr, strchr +from libc.stdlib cimport free, malloc, calloc, realloc +from libc.stdlib cimport atoi, atol, atof + +from pysam.libcutils cimport force_bytes, force_str, charptr_to_str +from pysam.libcutils cimport encode_filename, from_string_and_size + +import collections +import copy + + +cdef char *StrOrEmpty(char * buffer): + if buffer == NULL: + return "" + else: return buffer + + +cdef int isNew(char * p, char * buffer, size_t nbytes): + """return True if `p` is located within `buffer` of size + `nbytes` + """ + if p == NULL: + return 0 + + return not (buffer <= p <= buffer + nbytes) + + +cdef class TupleProxy: + '''Proxy class for access to parsed row as a tuple. + + This class represents a table row for fast read-access. + + Access to individual fields is via the [] operator. + + Only read-only access is implemented. + + ''' + + def __cinit__(self, encoding="ascii"): + self.data = NULL + self.fields = NULL + self.nbytes = 0 + self.is_modified = 0 + self.nfields = 0 + # start counting at field offset + self.offset = 0 + self.encoding = encoding + + def __dealloc__(self): + cdef int x + if self.is_modified: + for x from 0 <= x < self.nfields: + if isNew(self.fields[x], self.data, self.nbytes): + free(self.fields[x]) + self.fields[x] = NULL + + if self.data != NULL: + free(self.data) + if self.fields != NULL: + free(self.fields) + + def __copy__(self): + if self.is_modified: + raise NotImplementedError( + "copying modified tuples is not implemented") + cdef TupleProxy n = type(self)() + n.copy(self.data, self.nbytes, reset=True) + return n + + def compare(self, TupleProxy other): + '''return -1,0,1, if contents in this are binary + <,=,> to *other* + + ''' + if self.is_modified or other.is_modified: + raise NotImplementedError( + 'comparison of modified TupleProxies is not implemented') + if self.data == other.data: + return 0 + + if self.nbytes < other.nbytes: + return -1 + elif self.nbytes > other.nbytes: + return 1 + return memcmp(self.data, other.data, self.nbytes) + + def __richcmp__(self, TupleProxy other, int op): + if op == 2: # == operator + return self.compare(other) == 0 + elif op == 3: # != operator + return self.compare(other) != 0 + else: + err_msg = "op {0} isn't implemented yet".format(op) + raise NotImplementedError(err_msg) + + cdef take(self, char * buffer, size_t nbytes): + '''start presenting buffer. + + Take ownership of the pointer. + ''' + self.data = buffer + self.nbytes = nbytes + self.update(buffer, nbytes) + + cdef present(self, char * buffer, size_t nbytes): + '''start presenting buffer. + + Do not take ownership of the pointer. + ''' + self.update(buffer, nbytes) + + cdef copy(self, char * buffer, size_t nbytes, bint reset=False): + '''start presenting buffer of size *nbytes*. + + Buffer is a '\0'-terminated string without the '\n'. + + Take a copy of buffer. + ''' + # +1 for '\0' + cdef int s = sizeof(char) * (nbytes + 1) + self.data = malloc(s) + if self.data == NULL: + raise ValueError("out of memory in TupleProxy.copy()") + memcpy(self.data, buffer, s) + + if reset: + for x from 0 <= x < nbytes: + if self.data[x] == '\0': + self.data[x] = '\t' + + self.update(self.data, nbytes) + + cpdef int getMinFields(self): + '''return minimum number of fields.''' + # 1 is not a valid tabix entry, but TupleProxy + # could be more generic. + return 1 + + cpdef int getMaxFields(self): + '''return maximum number of fields. Return + 0 for unknown length.''' + return 0 + + cdef update(self, char * buffer, size_t nbytes): + '''update internal data. + + *buffer* is a \0 terminated string. + + *nbytes* is the number of bytes in buffer (excluding + the \0) + + Update starts work in buffer, thus can be used + to collect any number of fields until nbytes + is exhausted. + + If max_fields is set, the number of fields is initialized to + max_fields. + + ''' + cdef char * pos + cdef char * old_pos + cdef int field + cdef int max_fields, min_fields, x + + assert strlen(buffer) == nbytes, \ + "length of buffer (%i) != number of bytes (%i)" % ( + strlen(buffer), nbytes) + + if buffer[nbytes] != 0: + raise ValueError("incomplete line at %s" % buffer) + + ################################# + # remove line breaks and feeds and update number of bytes + x = nbytes - 1 + while x > 0 and (buffer[x] == '\n' or buffer[x] == '\r'): + buffer[x] = '\0' + x -= 1 + self.nbytes = x + 1 + + ################################# + # clear data + if self.fields != NULL: + free(self.fields) + + for field from 0 <= field < self.nfields: + if isNew(self.fields[field], self.data, self.nbytes): + free(self.fields[field]) + + self.is_modified = self.nfields = 0 + + ################################# + # allocate new + max_fields = self.getMaxFields() + # pre-count fields - better would be + # to guess or dynamically grow + if max_fields == 0: + for x from 0 <= x < nbytes: + if buffer[x] == '\t': + max_fields += 1 + max_fields += 1 + + self.fields = calloc(max_fields, sizeof(char *)) + if self.fields == NULL: + raise ValueError("out of memory in TupleProxy.update()") + + ################################# + # start filling + field = 0 + self.fields[field] = pos = buffer + field += 1 + old_pos = pos + while 1: + + pos = memchr(pos, '\t', nbytes) + if pos == NULL: + break + if field >= max_fields: + raise ValueError( + "parsing error: more than %i fields in line: %s" % + (max_fields, buffer)) + + pos[0] = '\0' + pos += 1 + self.fields[field] = pos + field += 1 + nbytes -= pos - old_pos + if nbytes < 0: + break + old_pos = pos + self.nfields = field + if self.nfields < self.getMinFields(): + raise ValueError( + "parsing error: fewer than %i fields in line: %s" % + (self.getMinFields(), buffer)) + + def _getindex(self, int index): + '''return item at idx index''' + cdef int i = index + if i < 0: + i += self.nfields + if i < 0: + raise IndexError("list index out of range") + # apply offset - separating a fixed number + # of fields from a variable number such as in VCF + i += self.offset + if i >= self.nfields: + raise IndexError( + "list index out of range %i >= %i" % + (i, self.nfields)) + return force_str(self.fields[i], self.encoding) + + def __getitem__(self, key): + if type(key) == int: + return self._getindex(key) + # slice object + start, end, step = key.indices(self.nfields) + result = [] + for index in range(start, end, step): + result.append(self._getindex(index)) + return result + + def _setindex(self, index, value): + '''set item at idx index.''' + cdef int idx = index + if idx < 0: + raise IndexError("list index out of range") + if idx >= self.nfields: + raise IndexError("list index out of range") + + if isNew(self.fields[idx], self.data, self.nbytes): + free(self.fields[idx]) + + self.is_modified = 1 + + if value is None: + self.fields[idx] = NULL + return + + # conversion with error checking + value = force_bytes(value) + cdef char * tmp = value + self.fields[idx] = malloc((strlen( tmp ) + 1) * sizeof(char)) + if self.fields[idx] == NULL: + raise ValueError("out of memory" ) + strcpy(self.fields[idx], tmp) + + def __setitem__(self, index, value): + '''set item at *index* to *value*''' + cdef int i = index + if i < 0: + i += self.nfields + i += self.offset + + self._setindex(i, value) + + def __len__(self): + return self.nfields + + def __iter__(self): + return TupleProxyIterator(self) + + def __str__(self): + '''return original data''' + # copy and replace \0 bytes with \t characters + cdef char * cpy + if self.is_modified: + # todo: treat NULL values + result = [] + for x in xrange(0, self.nfields): + result.append(StrOrEmpty(self.fields[x]).decode(self.encoding)) + return "\t".join(result) + else: + cpy = calloc(sizeof(char), self.nbytes+1) + if cpy == NULL: + raise ValueError("out of memory") + memcpy(cpy, self.data, self.nbytes+1) + for x from 0 <= x < self.nbytes: + if cpy[x] == '\0': + cpy[x] = '\t' + result = cpy[:self.nbytes] + free(cpy) + r = result.decode(self.encoding) + return r + + +cdef class TupleProxyIterator: + def __init__(self, proxy): + self.proxy = proxy + self.index = 0 + + def __iter__(self): + return self + + def __next__(self): + if self.index >= self.proxy.nfields: + raise StopIteration + cdef char *retval = self.proxy.fields[self.index] + self.index += 1 + return force_str(retval, self.proxy.encoding) if retval != NULL else None + + +def toDot(v): + '''convert value to '.' if None''' + if v is None: + return "." + else: + return str(v) + +def quote(v): + '''return a quoted attribute.''' + if isinstance(v, str): + return '"%s"' % v + else: + return str(v) + + +cdef class NamedTupleProxy(TupleProxy): + + map_key2field = {} + + def __setattr__(self, key, value): + '''set attribute.''' + cdef int idx + idx, f = self.map_key2field[key] + if self.nfields < idx: + raise KeyError("field %s not set" % key) + TupleProxy.__setitem__(self, idx, str(value)) + + def __getattr__(self, key): + cdef int idx + idx, f = self.map_key2field[key] + if self.nfields < idx: + raise KeyError("field %s not set" % key) + if f == str: + return force_str(self.fields[idx], + self.encoding) + return f(self.fields[idx]) + + +cdef dot_or_float(v): + if v == "" or v == b".": + return None + else: + try: + return int(v) + except ValueError: + return float(v) + + +cdef dot_or_int(v): + if v == "" or v == b".": + return None + else: + return int(v) + + +cdef dot_or_str(v): + if v == "" or v == b".": + return None + else: + return force_str(v) + + +cdef int from1based(v): + return atoi(v) - 1 + + +cdef str to1based(int v): + return str(v + 1) + + +cdef class GTFProxy(NamedTupleProxy): + '''Proxy class for access to GTF fields. + + This class represents a GTF entry for fast read-access. + Write-access has been added as well, though some care must + be taken. If any of the string fields (contig, source, ...) + are set, the new value is tied to the lifetime of the + argument that was supplied. + + The only exception is the attributes field when set from + a dictionary - this field will manage its own memory. + + ''' + separator = "; " + + # first value is field index, the tuple contains conversion + # functions for getting (converting internal string representation + # to pythonic value) and setting (converting pythonic value to + # interval string representation) + map_key2field = { + 'contig' : (0, (str, str)), + 'source' : (1, (dot_or_str, str)), + 'feature': (2, (dot_or_str, str)), + 'start' : (3, (from1based, to1based)), + 'end' : (4, (int, int)), + 'score' : (5, (dot_or_float, toDot)), + 'strand' : (6, (dot_or_str, str)), + 'frame' : (7, (dot_or_int, toDot)), + 'attributes': (8, (str, str))} + + def __cinit__(self): + # automatically calls TupleProxy.__cinit__ + self.attribute_dict = None + + cpdef int getMinFields(self): + '''return minimum number of fields.''' + return 9 + + cpdef int getMaxFields(self): + '''return max number of fields.''' + return 9 + + def to_dict(self): + """parse attributes - return as dict + + The dictionary can be modified to update attributes. + """ + if not self.attribute_dict: + self.attribute_dict = self.attribute_string2dict( + self.attributes) + self.is_modified = True + return self.attribute_dict + + def as_dict(self): + """deprecated: use :meth:`to_dict` + """ + return self.to_dict() + + def from_dict(self, d): + '''set attributes from a dictionary.''' + self.attribute_dict = None + attribute_string = force_bytes( + self.attribute_dict2string(d), + self.encoding) + self._setindex(8, attribute_string) + + def __str__(self): + cdef char * cpy + cdef int x + + if self.is_modified: + return "\t".join( + (self.contig, + toDot(self.source), + toDot(self.feature), + str(self.start + 1), + str(self.end), + toDot(self.score), + toDot(self.strand), + toDot(self.frame), + self.attributes)) + else: + return TupleProxy.__str__(self) + + def invert(self, int lcontig): + '''invert coordinates to negative strand coordinates + + This method will only act if the feature is on the + negative strand.''' + + if self.strand[0] == '-': + start = min(self.start, self.end) + end = max(self.start, self.end) + self.start, self.end = lcontig - end, lcontig - start + + def keys(self): + '''return a list of attributes defined in this entry.''' + if not self.attribute_dict: + self.attribute_dict = self.attribute_string2dict( + self.attributes) + return self.attribute_dict.keys() + + def __getitem__(self, key): + return self.__getattr__(key) + + def setAttribute(self, name, value): + '''convenience method to set an attribute. + ''' + if not self.attribute_dict: + self.attribute_dict = self.attribute_string2dict( + self.attributes) + self.attribute_dict[name] = value + self.is_modified = True + + def attribute_string2dict(self, s): + return collections.OrderedDict( + self.attribute_string2iterator(s)) + + def __cmp__(self, other): + return (self.contig, self.strand, self.start) < \ + (other.contig, other.strand, other.start) + + # python 3 compatibility + def __richcmp__(GTFProxy self, GTFProxy other, int op): + if op == 0: + return (self.contig, self.strand, self.start) < \ + (other.contig, other.strand, other.start) + elif op == 1: + return (self.contig, self.strand, self.start) <= \ + (other.contig, other.strand, other.start) + elif op == 2: + return self.compare(other) == 0 + elif op == 3: + return self.compare(other) != 0 + else: + err_msg = "op {0} isn't implemented yet".format(op) + raise NotImplementedError(err_msg) + + def dict2attribute_string(self, d): + """convert dictionary to attribute string in GTF format. + + """ + aa = [] + for k, v in d.items(): + if isinstance(v, str): + aa.append('{} "{}"'.format(k, v)) + else: + aa.append("{} {}".format(k, str(v))) + + return self.separator.join(aa) + ";" + + def attribute_string2iterator(self, s): + """convert attribute string in GTF format to records + and iterate over key, value pairs. + """ + + # remove comments + attributes = force_str(s, encoding=self.encoding) + + # separate into fields + # Fields might contain a ";", for example in ENSEMBL GTF file + # for mouse, v78: + # ...; transcript_name "TXNRD2;-001"; .... + # The current heuristic is to split on a semicolon followed by a + # space, see also http://mblab.wustl.edu/GTF22.html + + # Remove white space to prevent a last empty field. + fields = [x.strip() for x in attributes.strip().split("; ")] + for f in fields: + + # strip semicolon (GTF files without a space after the last semicolon) + if f.endswith(";"): + f = f[:-1] + + # split at most once in order to avoid separating + # multi-word values + d = [x.strip() for x in f.split(" ", 1)] + + n, v = d[0], d[1] + if len(d) > 2: + v = d[1:] + + if v[0] == '"' and v[-1] == '"': + v = v[1:-1] + else: + ## try to convert to a value + try: + v = float(v) + v = int(v) + except ValueError: + pass + except TypeError: + pass + + yield n, v + + def __getattr__(self, key): + """Generic lookup of attribute from GFF/GTF attributes + """ + + # Only called if there *isn't* an attribute with this name + cdef int idx + idx, f = self.map_key2field.get(key, (-1, None)) + if idx >= 0: + # deal with known attributes (fields 0-8) + if idx == 8: + # flush attributes if requested + if self.is_modified and self.attribute_dict is not None: + s = self.dict2attribute_string(self.attribute_dict) + TupleProxy._setindex(self, idx, s) + self.attribute_dict = None + return s + + if f[0] == str: + return force_str(self.fields[idx], + self.encoding) + else: + return f[0](self.fields[idx]) + else: + # deal with generic attributes (gene_id, ...) + if self.attribute_dict is None: + self.attribute_dict = self.attribute_string2dict( + self.attributes) + return self.attribute_dict[key] + + def __setattr__(self, key, value): + '''set attribute.''' + + # Note that __setattr__ is called before properties, so __setattr__ and + # properties don't mix well. This is different from __getattr__ which is + # called after any properties have been resolved. + cdef int idx + idx, f = self.map_key2field.get(key, (-1, None)) + + if idx >= 0: + if value is None: + s = "." + elif f[1] == str: + s = force_bytes(value, + self.encoding) + else: + s = str(f[1](value)) + TupleProxy._setindex(self, idx, s) + else: + if self.attribute_dict is None: + self.attribute_dict = self.attribute_string2dict( + self.attributes) + self.attribute_dict[key] = value + self.is_modified = True + + # for backwards compatibility + def asDict(self, *args, **kwargs): + return self.to_dict(*args, **kwargs) + + def fromDict(self, *args, **kwargs): + return self.from_dict(*args, **kwargs) + + +cdef class GFF3Proxy(GTFProxy): + + def dict2attribute_string(self, d): + """convert dictionary to attribute string.""" + return ";".join(["{}={}".format(k, v) for k, v in d.items()]) + + def attribute_string2iterator(self, s): + """convert attribute string in GFF3 format to records + and iterate over key, value pairs. + """ + + for f in (x.strip() for x in s.split(";")): + if not f: + continue + + key, value = f.split("=", 1) + value = value.strip() + + ## try to convert to a value + try: + value = float(value) + value = int(value) + except ValueError: + pass + except TypeError: + pass + + yield key.strip(), value + + +cdef class BedProxy(NamedTupleProxy): + '''Proxy class for access to Bed fields. + + This class represents a BED entry for fast read-access. + ''' + map_key2field = { + 'contig' : (0, str), + 'start' : (1, int), + 'end' : (2, int), + 'name' : (3, str), + 'score' : (4, float), + 'strand' : (5, str), + 'thickStart' : (6, int), + 'thickEnd' : (7, int), + 'itemRGB' : (8, str), + 'blockCount': (9, int), + 'blockSizes': (10, str), + 'blockStarts': (11, str), } + + cpdef int getMinFields(self): + '''return minimum number of fields.''' + return 3 + + cpdef int getMaxFields(self): + '''return max number of fields.''' + return 12 + + cdef update(self, char * buffer, size_t nbytes): + '''update internal data. + + nbytes does not include the terminal '\0'. + ''' + TupleProxy.update(self, buffer, nbytes) + + if self.nfields < 3: + raise ValueError( + "bed format requires at least three columns") + + # determines bed format + self.bedfields = self.nfields + + # do automatic conversion + self.contig = self.fields[0] + self.start = atoi(self.fields[1]) + self.end = atoi(self.fields[2]) + + # __setattr__ in base class seems to take precedence + # hence implement setters in __setattr__ + #property start: + # def __get__( self ): return self.start + #property end: + # def __get__( self ): return self.end + + def __str__(self): + + cdef int save_fields = self.nfields + # ensure fields to use correct format + self.nfields = self.bedfields + retval = TupleProxy.__str__(self) + self.nfields = save_fields + return retval + + def __setattr__(self, key, value): + '''set attribute.''' + if key == "start": + self.start = value + elif key == "end": + self.end = value + + cdef int idx + idx, f = self.map_key2field[key] + TupleProxy._setindex(self, idx, str(value)) + + +cdef class VCFProxy(NamedTupleProxy): + '''Proxy class for access to VCF fields. + + The genotypes are accessed via a numeric index. + Sample headers are not available. + ''' + map_key2field = { + 'contig' : (0, str), + 'pos' : (1, int), + 'id' : (2, str), + 'ref' : (3, str), + 'alt' : (4, str), + 'qual' : (5, str), + 'filter' : (6, str), + 'info' : (7, str), + 'format' : (8, str) } + + def __cinit__(self): + # automatically calls TupleProxy.__cinit__ + # start indexed access at genotypes + self.offset = 9 + + cdef update(self, char * buffer, size_t nbytes): + '''update internal data. + + nbytes does not include the terminal '\0'. + ''' + TupleProxy.update(self, buffer, nbytes) + + self.contig = self.fields[0] + # vcf counts from 1 - correct here + self.pos = atoi(self.fields[1]) - 1 + + def __len__(self): + '''return number of genotype fields.''' + return max(0, self.nfields - 9) + + property pos: + '''feature end (in 0-based open/closed coordinates).''' + def __get__(self): + return self.pos + + def __setattr__(self, key, value): + '''set attribute.''' + if key == "pos": + self.pos = value + value += 1 + + cdef int idx + idx, f = self.map_key2field[key] + TupleProxy._setindex(self, idx, str(value)) + + +__all__ = [ + "TupleProxy", + "NamedTupleProxy", + "GTFProxy", + "GFF3Proxy", + "BedProxy", + "VCFProxy"] diff --git a/pysam/libcutils.pxd b/pysam/libcutils.pxd new file mode 100644 index 0000000..d78b706 --- /dev/null +++ b/pysam/libcutils.pxd @@ -0,0 +1,34 @@ +######################################################################### +# Utility functions used across pysam +######################################################################### +cimport cython +from cpython cimport array as c_array + +cpdef parse_region(contig=*, start=*, stop=*, region=*, reference=*, end=*) + +######################################################################### +# Utility functions for quality string conversions + +cpdef c_array.array qualitystring_to_array(input_str, int offset=*) +cpdef array_to_qualitystring(c_array.array arr, int offset=*) +cpdef qualities_to_qualitystring(qualities, int offset=*) + +######################################################################## +## String encoding configuration facilities +######################################################################## + +cpdef get_encoding_error_handler() +cpdef set_encoding_error_handler(name) + +######################################################################## +## Python 3 compatibility functions +######################################################################## +cdef charptr_to_str(const char *s, encoding=*, errors=*) +cdef bytes charptr_to_bytes(const char *s, encoding=*, errors=*) +cdef charptr_to_str_w_len(const char* s, size_t n, encoding=*, errors=*) +cdef force_str(object s, encoding=*, errors=*) +cdef bytes force_bytes(object s, encoding=*, errors=*) +cdef decode_bytes(bytes s, encoding=*, errors=*) +cdef bytes encode_filename(object filename) +cdef from_string_and_size(const char *s, size_t length) + diff --git a/pysam/libcutils.pyi b/pysam/libcutils.pyi new file mode 100644 index 0000000..c82d2a6 --- /dev/null +++ b/pysam/libcutils.pyi @@ -0,0 +1,28 @@ +from array import array +from typing import Iterable, Optional, Tuple, Union + +def get_encoding_error_handler() -> str: ... +def set_encoding_error_handler(name: str) -> str: ... +def _pysam_dispatch( + collection: str, + method: str, + args: Optional[Iterable[str]], + catch_stdout: bool = ..., + is_usage: bool = ..., + save_stdout: Optional[str] = ..., +) -> Tuple[int, Union[bytes, str], Union[bytes, str]]: ... +def parse_region( + contig: Optional[str] = ..., + start: Optional[int] = ..., + stop: Optional[int] = ..., + region: Optional[str] = ..., + reference: Optional[str] = ..., + end: Optional[int] = ..., +) -> Tuple[str, int, int]: ... +def qualitystring_to_array( + input_str: Optional[str], offset: int = ... +) -> Optional[array]: ... +def array_to_qualitystring(qualities: array, offset: int = ...) -> Optional[str]: ... +def qualities_to_qualitystring( + qualities: Union[array, Iterable[str]], offset: int = ... +) -> Optional[str]: ... diff --git a/pysam/libcutils.pyx b/pysam/libcutils.pyx new file mode 100644 index 0000000..81a19d3 --- /dev/null +++ b/pysam/libcutils.pyx @@ -0,0 +1,457 @@ +import types +import sys +import string +import re +import tempfile +import os +import io +from contextlib import contextmanager +from codecs import register_error + +from cpython.version cimport PY_MAJOR_VERSION, PY_MINOR_VERSION +from cpython cimport PyBytes_Check, PyUnicode_Check +from cpython cimport array as c_array +from libc.stdlib cimport calloc, free +from libc.string cimport strncpy +from libc.stdint cimport INT32_MAX, int32_t +from libc.stdio cimport fprintf, stderr, fflush +from libc.stdio cimport stdout as c_stdout +from posix.fcntl cimport open as c_open, O_WRONLY + +from libcsamtools cimport samtools_dispatch, samtools_set_stdout, samtools_set_stderr, \ + samtools_close_stdout, samtools_close_stderr, samtools_set_stdout_fn + +from libcbcftools cimport bcftools_dispatch, bcftools_set_stdout, bcftools_set_stderr, \ + bcftools_close_stdout, bcftools_close_stderr, bcftools_set_stdout_fn + +##################################################################### +# hard-coded constants +cdef int MAX_POS = (1 << 31) - 1 + +################################################################# +# Utility functions for quality string conversions +cpdef c_array.array qualitystring_to_array(input_str, int offset=33): + """convert a qualitystring to an array of quality values.""" + if input_str is None: + return None + qs = force_bytes(input_str) + cdef char i + return c_array.array('B', [i - offset for i in qs]) + + +cpdef array_to_qualitystring(c_array.array qualities, int offset=33): + """convert an array of quality values to a string.""" + if qualities is None: + return None + cdef int x + + cdef c_array.array result + result = c_array.clone(qualities, len(qualities), zero=False) + + for x from 0 <= x < len(qualities): + result[x] = qualities[x] + offset + if IS_PYTHON3: + return force_str(result.tobytes()) + else: + return result.tostring() + + +cpdef qualities_to_qualitystring(qualities, int offset=33): + """convert a list or array of quality scores to the string + representation used in the SAM format. + + Parameters + ---------- + offset : int + offset to be added to the quality scores to arrive at + the characters of the quality string (default=33). + + Returns + ------- + string + a quality string + + """ + cdef char x + if qualities is None: + return None + elif isinstance(qualities, c_array.array): + return array_to_qualitystring(qualities, offset=offset) + else: + # tuples and lists + return force_str("".join([chr(x + offset) for x in qualities])) + + +######################################################################## +## String encoding configuration facilities +######################################################################## + +# Codec error handler that just interprets each bad byte as ISO-8859-1. +def latin1_replace(exception): + return (chr(exception.object[exception.start]), exception.end) + +register_error('pysam.latin1replace', latin1_replace) + + +cdef str ERROR_HANDLER = 'strict' + +cpdef get_encoding_error_handler(): + return ERROR_HANDLER + +cpdef set_encoding_error_handler(name): + global ERROR_HANDLER + previous = ERROR_HANDLER + ERROR_HANDLER = name + return previous + +######################################################################## +## Python 3 compatibility functions +######################################################################## + +cdef bint IS_PYTHON3 = PY_MAJOR_VERSION >= 3 + +cdef from_string_and_size(const char* s, size_t length): + if IS_PYTHON3: + return s[:length].decode('utf-8', ERROR_HANDLER) + else: + return s[:length] + + +# filename encoding (adapted from lxml.etree.pyx) +cdef str FILENAME_ENCODING = sys.getfilesystemencoding() or sys.getdefaultencoding() or 'ascii' +cdef str TEXT_ENCODING = 'utf-8' + +cdef bytes encode_filename(object filename): + """Make sure a filename is 8-bit encoded (or None).""" + if filename is None: + return None + elif PY_MAJOR_VERSION >= 3 and PY_MINOR_VERSION >= 2: + # Added to support path-like objects + return os.fsencode(filename) + elif PyBytes_Check(filename): + return filename + elif PyUnicode_Check(filename): + return filename.encode(FILENAME_ENCODING) + else: + raise TypeError("Argument must be string or unicode.") + + +cdef bytes force_bytes(object s, encoding=None, errors=None): + """convert string or unicode object to bytes, assuming + utf8 encoding. + """ + if s is None: + return None + elif PyBytes_Check(s): + return s + elif PyUnicode_Check(s): + return s.encode(encoding or TEXT_ENCODING, errors or ERROR_HANDLER) + else: + raise TypeError("Argument must be string, bytes or unicode.") + + +cdef charptr_to_str(const char* s, encoding=None, errors=None): + if s == NULL: + return None + if PY_MAJOR_VERSION < 3: + return s + else: + return s.decode(encoding or TEXT_ENCODING, errors or ERROR_HANDLER) + + +cdef charptr_to_str_w_len(const char* s, size_t n, encoding=None, errors=None): + if s == NULL: + return None + if PY_MAJOR_VERSION < 3: + return s[:n] + else: + return s[:n].decode(encoding or TEXT_ENCODING, errors or ERROR_HANDLER) + + +cdef bytes charptr_to_bytes(const char* s, encoding=None, errors=None): + if s == NULL: + return None + else: + return s + + +cdef force_str(object s, encoding=None, errors=None): + """Return s converted to str type of current Python + (bytes in Py2, unicode in Py3)""" + if s is None: + return None + if PY_MAJOR_VERSION < 3: + return s + elif PyBytes_Check(s): + return s.decode(encoding or TEXT_ENCODING, errors or ERROR_HANDLER) + else: + # assume unicode + return s + + +cdef decode_bytes(bytes s, encoding=None, errors=None): + """Return s converted to current Python's str type, + always decoding even in Python 2""" + if s is None: + return None + else: + return s.decode(encoding or TEXT_ENCODING, errors or ERROR_HANDLER) + + +cpdef parse_region(contig=None, + start=None, + stop=None, + region=None, + reference=None, + end=None): + """parse alternative ways to specify a genomic region. A region can + either be specified by :term:`reference`, `start` and + `end`. `start` and `end` denote 0-based, half-open intervals. + + :term:`reference` and `end` are also accepted for backward + compatibility as synonyms for :term:`contig` and `stop`, + respectively. + + Alternatively, a samtools :term:`region` string can be supplied. + + If any of the coordinates are missing they will be replaced by the + minimum (`start`) or maximum (`end`) coordinate. + + Note that region strings are 1-based, while `start` and `end` + denote an interval in python coordinates. + + Returns + ------- + + tuple : a tuple of `reference`, `start` and `end`. + + Raises + ------ + + ValueError + for invalid or out of bounds regions. + + """ + cdef int32_t rstart + cdef int32_t rstop + + + if reference is not None: + if contig is not None: + raise ValueError('contig and reference should not both be specified') + contig = reference + + if contig is not None and region is not None: + raise ValueError('contig/reference and region should not both be specified') + + if end is not None: + if stop is not None: + raise ValueError('stop and end should not both be specified') + stop = end + + if contig is None and region is None: + raise ValueError("neither contig nor region are given") + + rstart = 0 + rstop = MAX_POS + if start is not None: + try: + rstart = start + except OverflowError: + raise ValueError('start out of range (%i)' % start) + + if stop is not None: + try: + rstop = stop + except OverflowError: + raise ValueError('stop out of range (%i)' % stop) + + if region: + if ":" in region: + contig, coord = region.split(":") + parts = coord.split("-") + rstart = int(parts[0]) - 1 + if len(parts) >= 1: + rstop = int(parts[1]) + else: + contig = region + + if rstart > rstop: + raise ValueError('invalid coordinates: start (%i) > stop (%i)' % (rstart, rstop)) + if not 0 <= rstart < MAX_POS: + raise ValueError('start out of range (%i)' % rstart) + if not 0 <= rstop <= MAX_POS: + raise ValueError('stop out of range (%i)' % rstop) + + return contig, rstart, rstop + + +def _pysam_dispatch(collection, + method, + args=None, + catch_stdout=True, + is_usage=False, + save_stdout=None): + '''call ``method`` in samtools/bcftools providing arguments in args. + + By default, stdout is redirected to a temporary file using the patched + C sources except for a few commands that have an explicit output option + (typically: -o). In these commands (such as samtools view), this explicit + option is used. If *is_usage* is True, then these explicit output options + will not be used. + + Catching of stdout can be turned off by setting *catch_stdout* to + False. + ''' + + if method == "index" and args: + # We make sure that at least 1 input file exists, + # and if it doesn't we raise an IOError. + SIMPLE_FLAGS = ['-c', '--csi', '-f', '--force', '-t', '--tbi', '-n', '--nstats', '-s', '--stats'] + ARGUMENTS = ['-m', '--min-shift', '-o', '--output-file', '--threads', '-@'] + skip_next = False + for arg in args: + if skip_next: + skip_next = False + continue + if arg in SIMPLE_FLAGS or (len(arg) > 2 and force_bytes(arg).startswith(b'-@')): + continue + if arg in ARGUMENTS: + skip_next = True + continue + if not os.path.exists(arg): + raise IOError("No such file or directory: '%s'" % arg) + else: + break + + if args is None: + args = [] + else: + args = list(args) + + # redirect stderr to file + stderr_h, stderr_f = tempfile.mkstemp() + + # redirect stdout to file + if save_stdout: + stdout_f = save_stdout + stdout_h = c_open(force_bytes(stdout_f), + O_WRONLY) + if stdout_h == -1: + raise IOError("error while opening {} for writing".format(stdout_f)) + + samtools_set_stdout_fn(force_bytes(stdout_f)) + bcftools_set_stdout_fn(force_bytes(stdout_f)) + + elif catch_stdout: + stdout_h, stdout_f = tempfile.mkstemp() + MAP_STDOUT_OPTIONS = { + "samtools": { + "view": "-o {}", + "mpileup": "-o {}", + "depad": "-o {}", + "calmd": "", # uses pysam_stdout_fn + }, + "bcftools": {} + } + + stdout_option = None + if collection == "bcftools": + # in bcftools, most methods accept -o, the exceptions + # are below: + if method not in ("index", "roh", "stats"): + stdout_option = "-o {}" + elif method in MAP_STDOUT_OPTIONS[collection]: + # special case - samtools view -c outputs on stdout + if not(method == "view" and "-c" in args): + stdout_option = MAP_STDOUT_OPTIONS[collection][method] + + if stdout_option is not None and not is_usage: + os.close(stdout_h) + samtools_set_stdout_fn(force_bytes(stdout_f)) + bcftools_set_stdout_fn(force_bytes(stdout_f)) + args.extend(stdout_option.format(stdout_f).split(" ")) + stdout_h = c_open(b"/dev/null", O_WRONLY) + else: + samtools_set_stdout_fn("-") + bcftools_set_stdout_fn("-") + stdout_h = c_open(b"/dev/null", O_WRONLY) + + # setup the function call to samtools/bcftools main + cdef char ** cargs + cdef int i, n, retval, l + n = len(args) + method = force_bytes(method) + collection = force_bytes(collection) + args = [force_bytes(a) for a in args] + + # allocate two more for first (dummy) argument (contains command) + cdef int extra_args = 0 + if method == b"index": + extra_args = 1 + # add extra arguments for commands accepting optional arguments + # such as 'samtools index x.bam [out.index]' + cargs = calloc(n + 2 + extra_args, sizeof(char *)) + cargs[0] = collection + cargs[1] = method + + # create copies of strings - getopt for long options permutes + # arguments + for i from 0 <= i < n: + l = len(args[i]) + cargs[i + 2] = calloc(l + 1, sizeof(char)) + strncpy(cargs[i + 2], args[i], l) + + # call samtools/bcftools + if collection == b"samtools": + samtools_set_stdout(stdout_h) + samtools_set_stderr(stderr_h) + retval = samtools_dispatch(n + 2, cargs) + samtools_close_stdout() + samtools_close_stderr() + elif collection == b"bcftools": + bcftools_set_stdout(stdout_h) + bcftools_set_stderr(stderr_h) + retval = bcftools_dispatch(n + 2, cargs) + bcftools_close_stdout() + bcftools_close_stderr() + else: + # unknown -- just return a Unix shell's "command not found" exit status + retval = 127 + + for i from 0 <= i < n: + free(cargs[i + 2]) + free(cargs) + + # get error messages + def _collect(fn): + out = [] + try: + with open(fn, "r") as inf: + out = inf.read() + except UnicodeDecodeError: + with open(fn, "rb") as inf: + # read binary output + out = inf.read() + finally: + os.remove(fn) + return out + + out_stderr = _collect(stderr_f) + if save_stdout: + out_stdout = None + elif catch_stdout: + out_stdout = _collect(stdout_f) + else: + out_stdout = None + + return retval, out_stderr, out_stdout + + +__all__ = [ + "qualitystring_to_array", + "array_to_qualitystring", + "qualities_to_qualitystring", + "get_encoding_error_handler", + "set_encoding_error_handler", +] diff --git a/pysam/libcvcf.pxd b/pysam/libcvcf.pxd new file mode 100644 index 0000000..139597f --- /dev/null +++ b/pysam/libcvcf.pxd @@ -0,0 +1,2 @@ + + diff --git a/pysam/libcvcf.pyi b/pysam/libcvcf.pyi new file mode 100644 index 0000000..e69de29 diff --git a/pysam/libcvcf.pyx b/pysam/libcvcf.pyx new file mode 100644 index 0000000..956f8a5 --- /dev/null +++ b/pysam/libcvcf.pyx @@ -0,0 +1,1203 @@ +# cython: embedsignature=True +# +# Code to read, write and edit VCF files +# +# VCF lines are encoded as a dictionary with these keys (note: all lowercase): +# 'chrom': string +# 'pos': integer +# 'id': string +# 'ref': string +# 'alt': list of strings +# 'qual': integer +# 'filter': None (missing value), or list of keys (strings); empty list parsed as ["PASS"] +# 'info': dictionary of values (see below) +# 'format': list of keys (strings) +# sample keys: dictionary of values (see below) +# +# The sample keys are accessible through vcf.getsamples() +# +# A dictionary of values contains value keys (defined in ##INFO or +# ##FORMAT lines) which map to a list, containing integers, floats, +# strings, or characters. Missing values are replaced by a particular +# value, often -1 or . +# +# Genotypes are not stored as a string, but as a list of 1 or 3 +# elements (for haploid and diploid samples), the first (and last) the +# integer representing an allele, and the second the separation +# character. Note that there is just one genotype per sample, but for +# consistency the single element is stored in a list. +# +# Header lines other than ##INFO, ##FORMAT and ##FILTER are stored as +# (key, value) pairs and are accessible through getheader() +# +# The VCF class can be instantiated with a 'regions' variable +# consisting of tuples (chrom,start,end) encoding 0-based half-open +# segments. Only variants with a position inside the segment will be +# parsed. A regions parser is available under parse_regions. +# +# When instantiated, a reference can be passed to the VCF class. This +# may be any class that supports a fetch(chrom, start, end) method. +# +# NOTE: the position that is returned to Python is 0-based, NOT +# 1-based as in the VCF file. +# NOTE: There is also preliminary VCF functionality in the VariantFile class. +# +# TODO: +# only v4.0 writing is complete; alleles are not converted to v3.3 format +# + +from collections import namedtuple, defaultdict +from operator import itemgetter +import sys, re, copy, bisect + +from libc.stdlib cimport atoi +from libc.stdint cimport int8_t, int16_t, int32_t, int64_t +from libc.stdint cimport uint8_t, uint16_t, uint32_t, uint64_t + +cimport pysam.libctabix as libctabix +cimport pysam.libctabixproxies as libctabixproxies + +from pysam.libcutils cimport force_str + +import pysam + +gtsRegEx = re.compile("[|/\\\\]") +alleleRegEx = re.compile('^[ACGTN]+$') + +# Utility function. Uses 0-based coordinates +def get_sequence(chrom, start, end, fa): + # obtain sequence from .fa file, without truncation + if end<=start: return "" + if not fa: return "N"*(end-start) + if start<0: return "N"*(-start) + get_sequence(chrom, 0, end, fa).upper() + sequence = fa.fetch(chrom, start, end).upper() + if len(sequence) < end-start: sequence += "N"*(end-start-len(sequence)) + return sequence + +# Utility function. Parses a region string +def parse_regions( string ): + result = [] + for r in string.split(','): + elts = r.split(':') + chrom, start, end = elts[0], 0, 3000000000 + if len(elts)==1: pass + elif len(elts)==2: + if len(elts[1])>0: + ielts = elts[1].split('-') + if len(ielts) != 2: ValueError("Don't understand region string '%s'" % r) + try: start, end = int(ielts[0])-1, int(ielts[1]) + except: raise ValueError("Don't understand region string '%s'" % r) + else: + raise ValueError("Don't understand region string '%s'" % r) + result.append( (chrom,start,end) ) + return result + + +FORMAT = namedtuple('FORMAT','id numbertype number type description missingvalue') + +########################################################################################################### +# +# New class +# +########################################################################################################### + +cdef class VCFRecord(libctabixproxies.TupleProxy): + '''vcf record. + + initialized from data and vcf meta + ''' + + cdef vcf + cdef char * contig + cdef uint32_t pos + + def __init__(self, vcf): + self.vcf = vcf + self.encoding = vcf.encoding + + # if len(data) != len(self.vcf._samples): + # self.vcf.error(str(data), + # self.BAD_NUMBER_OF_COLUMNS, + # "expected %s for %s samples (%s), got %s" % \ + # (len(self.vcf._samples), + # len(self.vcf._samples), + # self.vcf._samples, + # len(data))) + + def __cinit__(self, vcf): + # start indexed access at genotypes + self.offset = 9 + + self.vcf = vcf + self.encoding = vcf.encoding + + def error(self, line, error, opt=None): + '''raise error.''' + # pass to vcf file for error handling + return self.vcf.error(line, error, opt) + + cdef update(self, char * buffer, size_t nbytes): + '''update internal data. + + nbytes does not include the terminal '\0'. + ''' + libctabixproxies.TupleProxy.update(self, buffer, nbytes) + + self.contig = self.fields[0] + # vcf counts from 1 - correct here + self.pos = atoi(self.fields[1]) - 1 + + def __len__(self): + return max(0, self.nfields - 9) + + property contig: + def __get__(self): return self.contig + + property pos: + def __get__(self): return self.pos + + property id: + def __get__(self): return self.fields[2] + + property ref: + def __get__(self): + return self.fields[3] + + property alt: + def __get__(self): + # convert v3.3 to v4.0 alleles below + alt = self.fields[4] + if alt == ".": alt = [] + else: alt = alt.upper().split(',') + return alt + + property qual: + def __get__(self): + qual = self.fields[5] + if qual == b".": qual = -1 + else: + try: qual = float(qual) + except: self.vcf.error(str(self),self.QUAL_NOT_NUMERICAL) + return qual + + property filter: + def __get__(self): + f = self.fields[6] + # postpone checking that filters exist. Encode missing filter or no filtering as empty list + if f == b"." or f == b"PASS" or f == b"0": return [] + else: return f.split(';') + + property info: + def __get__(self): + col = self.fields[7] + # dictionary of keys, and list of values + info = {} + if col != b".": + for blurp in col.split(';'): + elts = blurp.split('=') + if len(elts) == 1: v = None + elif len(elts) == 2: v = elts[1] + else: self.vcf.error(str(self),self.ERROR_INFO_STRING) + info[elts[0]] = self.vcf.parse_formatdata(elts[0], v, self.vcf._info, str(self.vcf)) + return info + + property format: + def __get__(self): + return self.fields[8].split(':') + + property samples: + def __get__(self): + return self.vcf._samples + + def __getitem__(self, key): + + # parse sample columns + values = self.fields[self.vcf._sample2column[key]].split(':') + alt = self.alt + format = self.format + + if len(values) > len(format): + self.vcf.error(str(self.line),self.BAD_NUMBER_OF_VALUES,"(found %s values in element %s; expected %s)" %\ + (len(values),key,len(format))) + + result = {} + for idx in range(len(format)): + expected = self.vcf.get_expected(format[idx], self.vcf._format, alt) + if idx < len(values): value = values[idx] + else: + if expected == -1: value = "." + else: value = ",".join(["."]*expected) + + result[format[idx]] = self.vcf.parse_formatdata(format[idx], value, self.vcf._format, str(self.data)) + if expected != -1 and len(result[format[idx]]) != expected: + self.vcf.error(str(self.data),self.BAD_NUMBER_OF_PARAMETERS, + "id=%s, expected %s parameters, got %s" % (format[idx],expected,result[format[idx]])) + if len(result[format[idx]] ) < expected: result[format[idx]] += [result[format[idx]][-1]]*(expected-len(result[format[idx]])) + result[format[idx]] = result[format[idx]][:expected] + + return result + + +cdef class asVCFRecord(libctabix.Parser): + '''converts a :term:`tabix row` into a VCF record.''' + cdef vcffile + def __init__(self, vcffile): + self.vcffile = vcffile + + cdef parse(self, char * buffer, int len): + cdef VCFRecord r + r = VCFRecord(self.vcffile) + r.copy(buffer, len) + return r + +class VCF(object): + + # types + NT_UNKNOWN = 0 + NT_NUMBER = 1 + NT_ALLELES = 2 + NT_NR_ALLELES = 3 + NT_GENOTYPES = 4 + NT_PHASED_GENOTYPES = 5 + + _errors = { 0:"UNKNOWN_FORMAT_STRING:Unknown file format identifier", + 1:"BADLY_FORMATTED_FORMAT_STRING:Formatting error in the format string", + 2:"BADLY_FORMATTED_HEADING:Did not find 9 required headings (CHROM, POS, ..., FORMAT) %s", + 3:"BAD_NUMBER_OF_COLUMNS:Wrong number of columns found (%s)", + 4:"POS_NOT_NUMERICAL:Position column is not numerical", + 5:"UNKNOWN_CHAR_IN_REF:Unknown character in reference field", + 6:"V33_BAD_REF:Reference should be single-character in v3.3 VCF", + 7:"V33_BAD_ALLELE:Cannot interpret allele for v3.3 VCF", + 8:"POS_NOT_POSITIVE:Position field must be >0", + 9:"QUAL_NOT_NUMERICAL:Quality field must be numerical, or '.'", + 10:"ERROR_INFO_STRING:Error while parsing info field", + 11:"ERROR_UNKNOWN_KEY:Unknown key (%s) found in formatted field (info; format; or filter)", + 12:"ERROR_FORMAT_NOT_NUMERICAL:Expected integer or float in formatted field; got %s", + 13:"ERROR_FORMAT_NOT_CHAR:Eexpected character in formatted field; got string", + 14:"FILTER_NOT_DEFINED:Identifier (%s) in filter found which was not defined in header", + 15:"FORMAT_NOT_DEFINED:Identifier (%s) in format found which was not defined in header", + 16:"BAD_NUMBER_OF_VALUES:Found too many of values in sample column (%s)", + 17:"BAD_NUMBER_OF_PARAMETERS:Found unexpected number of parameters (%s)", + 18:"BAD_GENOTYPE:Cannot parse genotype (%s)", + 19:"V40_BAD_ALLELE:Bad allele found for v4.0 VCF (%s)", + 20:"MISSING_REF:Reference allele missing", + 21:"V33_UNMATCHED_DELETION:Deleted sequence does not match reference (%s)", + 22:"V40_MISSING_ANGLE_BRACKETS:Format definition is not deliminted by angular brackets", + 23:"FORMAT_MISSING_QUOTES:Description field in format definition is not surrounded by quotes", + 24:"V40_FORMAT_MUST_HAVE_NAMED_FIELDS:Fields in v4.0 VCF format definition must have named fields", + 25:"HEADING_NOT_SEPARATED_BY_TABS:Heading line appears separated by spaces, not tabs", + 26:"WRONG_REF:Wrong reference %s", + 27:"ERROR_TRAILING_DATA:Numerical field ('%s') has semicolon-separated trailing data", + 28:"BAD_CHR_TAG:Error calculating chr tag for %s", + 29:"ZERO_LENGTH_ALLELE:Found zero-length allele", + 30:"MISSING_INDEL_ALLELE_REF_BASE:Indel alleles must begin with single reference base", + 31:"ZERO_FOR_NON_FLAG_FIELD: number set to 0, but type is not 'FLAG'", + 32:"ERROR_FORMAT_NOT_INTEGER:Expected integer in formatted field; got %s", + 33:"ERROR_FLAG_HAS_VALUE:Flag fields should not have a value", + } + + # tag-value pairs; tags are not unique; does not include fileformat, INFO, FILTER or FORMAT fields + _header = [] + + # version number; 33=v3.3; 40=v4.0 + _version = 40 + + # info, filter and format data + _info = {} + _filter = {} + _format = {} + + # header; and required columns + _required = ["CHROM","POS","ID","REF","ALT","QUAL","FILTER","INFO","FORMAT"] + _samples = [] + + # control behaviour + _ignored_errors = set([11,31]) # ERROR_UNKNOWN_KEY, ERROR_ZERO_FOR_NON_FLAG_FIELD + _warn_errors = set([]) + _leftalign = False + + # reference sequence + _reference = None + + # regions to include; None includes everything + _regions = None + + # statefull stuff + _lineno = -1 + _line = None + _lines = None + + def __init__(self, _copy=None, reference=None, regions=None, + lines=None, leftalign=False): + # make error identifiers accessible by name + for id in self._errors.keys(): + self.__dict__[self._errors[id].split(':')[0]] = id + if _copy != None: + self._leftalign = _copy._leftalign + self._header = _copy._header[:] + self._version = _copy._version + self._info = copy.deepcopy(_copy._info) + self._filter = copy.deepcopy(_copy._filter) + self._format = copy.deepcopy(_copy._format) + self._samples = _copy._samples[:] + self._sample2column = copy.deepcopy(_copy._sample2column) + self._ignored_errors = copy.deepcopy(_copy._ignored_errors) + self._warn_errors = copy.deepcopy(_copy._warn_errors) + self._reference = _copy._reference + self._regions = _copy._regions + if reference: self._reference = reference + if regions: self._regions = regions + if leftalign: self._leftalign = leftalign + self._lines = lines + self.encoding = "ascii" + self.tabixfile = None + + def error(self,line,error,opt=None): + if error in self._ignored_errors: return + errorlabel, errorstring = self._errors[error].split(':') + if opt: errorstring = errorstring % opt + errwarn = ["Error","Warning"][error in self._warn_errors] + errorstring += " in line %s: '%s'\n%s %s: %s\n" % (self._lineno,line,errwarn,errorlabel,errorstring) + if error in self._warn_errors: return + raise ValueError(errorstring) + + def parse_format(self,line,format,filter=False): + if self._version == 40: + if not format.startswith('<'): + self.error(line,self.V40_MISSING_ANGLE_BRACKETS) + format = "<"+format + if not format.endswith('>'): + self.error(line,self.V40_MISSING_ANGLE_BRACKETS) + format += ">" + format = format[1:-1] + data = {'id':None,'number':None,'type':None,'descr':None} + idx = 0 + while len(format.strip())>0: + elts = format.strip().split(',') + first, rest = elts[0], ','.join(elts[1:]) + if first.find('=') == -1 or (first.find('"')>=0 and first.find('=') > first.find('"')): + if self._version == 40: self.error(line,self.V40_FORMAT_MUST_HAVE_NAMED_FIELDS) + if idx == 4: self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + first = ["ID=","Number=","Type=","Description="][idx] + first + if first.startswith('ID='): data['id'] = first.split('=')[1] + elif first.startswith('Number='): data['number'] = first.split('=')[1] + elif first.startswith('Type='): data['type'] = first.split('=')[1] + elif first.startswith('Description='): + elts = format.split('"') + if len(elts)<3: + self.error(line,self.FORMAT_MISSING_QUOTES) + elts = first.split('=') + [rest] + data['descr'] = elts[1] + rest = '"'.join(elts[2:]) + if rest.startswith(','): rest = rest[1:] + else: + self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + format = rest + idx += 1 + if filter and idx==1: idx=3 # skip number and type fields for FILTER format strings + if not data['id']: self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + if 'descr' not in data: + # missing description + self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + data['descr'] = "" + if not data['type'] and not data['number']: + # fine, ##filter format + return FORMAT(data['id'],self.NT_NUMBER,0,"Flag",data['descr'],'.') + if not data['type'] in ["Integer","Float","Character","String","Flag"]: + self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + # I would like a missing-value field, but it isn't there + if data['type'] in ['Integer','Float']: data['missing'] = None # Do NOT use arbitrary int/float as missing value + else: data['missing'] = '.' + if not data['number']: self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + try: + n = int(data['number']) + t = self.NT_NUMBER + except ValueError: + n = -1 + if data['number'] == '.': t = self.NT_UNKNOWN + elif data['number'] == '#alleles': t = self.NT_ALLELES + elif data['number'] == '#nonref_alleles': t = self.NT_NR_ALLELES + elif data['number'] == '#genotypes': t = self.NT_GENOTYPES + elif data['number'] == '#phased_genotypes': t = self.NT_PHASED_GENOTYPES + elif data['number'] == '#phased_genotypes': t = self.NT_PHASED_GENOTYPES + # abbreviations added in VCF version v4.1 + elif data['number'] == 'A': t = self.NT_ALLELES + elif data['number'] == 'G': t = self.NT_GENOTYPES + else: + self.error(line,self.BADLY_FORMATTED_FORMAT_STRING) + # if number is 0 - type must be Flag + if n == 0 and data['type'] != 'Flag': + self.error( line, self.ZERO_FOR_NON_FLAG_FIELD) + # force type 'Flag' if no number + data['type'] = 'Flag' + + return FORMAT(data['id'],t,n,data['type'],data['descr'],data['missing']) + + def format_format( self, fmt, filter=False ): + values = [('ID',fmt.id)] + if fmt.number != None and not filter: + if fmt.numbertype == self.NT_UNKNOWN: nmb = "." + elif fmt.numbertype == self.NT_NUMBER: nmb = str(fmt.number) + elif fmt.numbertype == self.NT_ALLELES: nmb = "#alleles" + elif fmt.numbertype == self.NT_NR_ALLELES: nmb = "#nonref_alleles" + elif fmt.numbertype == self.NT_GENOTYPES: nmb = "#genotypes" + elif fmt.numbertype == self.NT_PHASED_GENOTYPES: nmb = "#phased_genotypes" + else: + raise ValueError("Unknown number type encountered: %s" % fmt.numbertype) + values.append( ('Number',nmb) ) + values.append( ('Type', fmt.type) ) + values.append( ('Description', '"' + fmt.description + '"') ) + if self._version == 33: + format = ",".join([v for k,v in values]) + else: + format = "<" + (",".join( ["%s=%s" % (k,v) for (k,v) in values] )) + ">" + return format + + def get_expected(self, format, formatdict, alt): + fmt = formatdict[format] + if fmt.numbertype == self.NT_UNKNOWN: return -1 + if fmt.numbertype == self.NT_NUMBER: return fmt.number + if fmt.numbertype == self.NT_ALLELES: return len(alt)+1 + if fmt.numbertype == self.NT_NR_ALLELES: return len(alt) + if fmt.numbertype == self.NT_GENOTYPES: return ((len(alt)+1)*(len(alt)+2)) // 2 + if fmt.numbertype == self.NT_PHASED_GENOTYPES: return (len(alt)+1)*(len(alt)+1) + return 0 + + + def _add_definition(self, formatdict, key, data, line ): + if key in formatdict: return + self.error(line,self.ERROR_UNKNOWN_KEY,key) + if data == None: + formatdict[key] = FORMAT(key,self.NT_NUMBER,0,"Flag","(Undefined tag)",".") + return + if data == []: data = [""] # unsure what type -- say string + if type(data[0]) == type(0.0): + formatdict[key] = FORMAT(key,self.NT_UNKNOWN,-1,"Float","(Undefined tag)",None) + return + if type(data[0]) == type(0): + formatdict[key] = FORMAT(key,self.NT_UNKNOWN,-1,"Integer","(Undefined tag)",None) + return + formatdict[key] = FORMAT(key,self.NT_UNKNOWN,-1,"String","(Undefined tag)",".") + + + # todo: trim trailing missing values + def format_formatdata( self, data, format, key=True, value=True, separator=":" ): + output, sdata = [], [] + if type(data) == type([]): # for FORMAT field, make data with dummy values + d = {} + for k in data: d[k] = [] + data = d + # convert missing values; and silently add definitions if required + for k in data: + self._add_definition( format, k, data[k], "(output)" ) + for idx,v in enumerate(data[k]): + if v == format[k].missingvalue: data[k][idx] = "." + # make sure GT comes first; and ensure fixed ordering; also convert GT data back to string + for k in data: + if k != 'GT': sdata.append( (k,data[k]) ) + sdata.sort() + if 'GT' in data: + sdata = [('GT',map(self.convertGTback,data['GT']))] + sdata + for k,v in sdata: + if v == []: v = None + if key and value: + if v != None: output.append( k+"="+','.join(map(str,v)) ) + else: output.append( k ) + elif key: output.append(k) + elif value: + if v != None: output.append( ','.join(map(str,v)) ) + else: output.append( "." ) # should not happen + # snip off trailing missing data + while len(output) > 1: + last = output[-1].replace(',','').replace('.','') + if len(last)>0: break + output = output[:-1] + return separator.join(output) + + + def enter_default_format(self): + for f in [FORMAT('GT',self.NT_NUMBER,1,'String','Genotype','.'), + FORMAT('DP',self.NT_NUMBER,1,'Integer','Read depth at this position for this sample',-1), + FORMAT('FT',self.NT_NUMBER,1,'String','Sample Genotype Filter','.'), + FORMAT('GL',self.NT_UNKNOWN,-1,'Float','Genotype likelihoods','.'), + FORMAT('GLE',self.NT_UNKNOWN,-1,'Float','Genotype likelihoods','.'), + FORMAT('GQ',self.NT_NUMBER,1,'Integer','Genotype Quality',-1), + FORMAT('PL',self.NT_GENOTYPES,-1,'Integer','Phred-scaled genotype likelihoods', '.'), + FORMAT('GP',self.NT_GENOTYPES,-1,'Float','Genotype posterior probabilities','.'), + FORMAT('GQ',self.NT_GENOTYPES,-1,'Integer','Conditional genotype quality','.'), + FORMAT('HQ',self.NT_UNKNOWN,-1,'Integer','Haplotype Quality',-1), # unknown number, since may be haploid + FORMAT('PS',self.NT_UNKNOWN,-1,'Integer','Phase set','.'), + FORMAT('PQ',self.NT_NUMBER,1,'Integer','Phasing quality',-1), + FORMAT('EC',self.NT_ALLELES,1,'Integer','Expected alternate allel counts',-1), + FORMAT('MQ',self.NT_NUMBER,1,'Integer','RMS mapping quality',-1), + ]: + if f.id not in self._format: + self._format[f.id] = f + + def parse_header(self, line): + + assert line.startswith('##') + elts = line[2:].split('=') + key = elts[0].strip() + value = '='.join(elts[1:]).strip() + if key == "fileformat": + if value == "VCFv3.3": + self._version = 33 + elif value == "VCFv4.0": + self._version = 40 + elif value == "VCFv4.1": + # AH - for testing + self._version = 40 + elif value == "VCFv4.2": + # AH - for testing + self._version = 40 + else: + self.error(line,self.UNKNOWN_FORMAT_STRING) + elif key == "INFO": + f = self.parse_format(line, value) + self._info[ f.id ] = f + elif key == "FILTER": + f = self.parse_format(line, value, filter=True) + self._filter[ f.id ] = f + elif key == "FORMAT": + f = self.parse_format(line, value) + self._format[ f.id ] = f + else: + # keep other keys in the header field + self._header.append( (key,value) ) + + + def write_header( self, stream ): + stream.write("##fileformat=VCFv%s.%s\n" % (self._version // 10, self._version % 10)) + for key,value in self._header: stream.write("##%s=%s\n" % (key,value)) + for var,label in [(self._info,"INFO"),(self._filter,"FILTER"),(self._format,"FORMAT")]: + for f in var.itervalues(): stream.write("##%s=%s\n" % (label,self.format_format(f,filter=(label=="FILTER")))) + + + def parse_heading( self, line ): + assert line.startswith('#') + assert not line.startswith('##') + headings = line[1:].split('\t') + # test for 8, as FORMAT field might be missing + if len(headings)==1 and len(line[1:].split()) >= 8: + self.error(line,self.HEADING_NOT_SEPARATED_BY_TABS) + headings = line[1:].split() + + for i,s in enumerate(self._required): + + if len(headings)<=i or headings[i] != s: + + if len(headings) <= i: + err = "(%sth entry not found)" % (i+1) + else: + err = "(found %s, expected %s)" % (headings[i],s) + + #self.error(line,self.BADLY_FORMATTED_HEADING,err) + # allow FORMAT column to be absent + if len(headings) == 8: + headings.append("FORMAT") + else: + self.error(line,self.BADLY_FORMATTED_HEADING,err) + + self._samples = headings[9:] + self._sample2column = dict( [(y,x+9) for x,y in enumerate( self._samples ) ] ) + + def write_heading( self, stream ): + stream.write("#" + "\t".join(self._required + self._samples) + "\n") + + def convertGT(self, GTstring): + if GTstring == ".": return ["."] + try: + gts = gtsRegEx.split(GTstring) + if len(gts) == 1: return [int(gts[0])] + if len(gts) != 2: raise ValueError() + if gts[0] == "." and gts[1] == ".": return [gts[0],GTstring[len(gts[0]):-len(gts[1])],gts[1]] + return [int(gts[0]),GTstring[len(gts[0]):-len(gts[1])],int(gts[1])] + except ValueError: + self.error(self._line,self.BAD_GENOTYPE,GTstring) + return [".","|","."] + + def convertGTback(self, GTdata): + return ''.join(map(str,GTdata)) + + def parse_formatdata( self, key, value, formatdict, line ): + # To do: check that the right number of values is present + f = formatdict.get(key,None) + if f == None: + self._add_definition(formatdict, key, value, line ) + f = formatdict[key] + if f.type == "Flag": + if value is not None: self.error(line,self.ERROR_FLAG_HAS_VALUE) + return [] + values = value.split(',') + # deal with trailing data in some early VCF files + if f.type in ["Float","Integer"] and len(values)>0 and values[-1].find(';') > -1: + self.error(line,self.ERROR_TRAILING_DATA,values[-1]) + values[-1] = values[-1].split(';')[0] + if f.type == "Integer": + for idx,v in enumerate(values): + try: + if v == ".": values[idx] = f.missingvalue + else: values[idx] = int(v) + except: + self.error(line,self.ERROR_FORMAT_NOT_INTEGER,"%s=%s" % (key, str(values))) + return [0] * len(values) + return values + elif f.type == "String": + self._line = line + if f.id == "GT": values = list(map( self.convertGT, values )) + return values + elif f.type == "Character": + for v in values: + if len(v) != 1: self.error(line,self.ERROR_FORMAT_NOT_CHAR) + return values + elif f.type == "Float": + for idx,v in enumerate(values): + if v == ".": values[idx] = f.missingvalue + try: return list(map(float,values)) + except: + self.error(line,self.ERROR_FORMAT_NOT_NUMERICAL,"%s=%s" % (key, str(values))) + return [0.0] * len(values) + else: + # can't happen + self.error(line,self.ERROR_INFO_STRING) + + def inregion(self, chrom, pos): + if not self._regions: return True + for r in self._regions: + if r[0] == chrom and r[1] <= pos < r[2]: return True + return False + + def parse_data( self, line, lineparse=False ): + cols = line.split('\t') + if len(cols) != len(self._samples)+9: + # gracefully deal with absent FORMAT column + # and those missing samples + if len(cols) == 8: + cols.append("") + else: + self.error(line, + self.BAD_NUMBER_OF_COLUMNS, + "expected %s for %s samples (%s), got %s" % (len(self._samples)+9, len(self._samples), self._samples, len(cols))) + + chrom = cols[0] + + # get 0-based position + try: pos = int(cols[1])-1 + except: self.error(line,self.POS_NOT_NUMERICAL) + if pos < 0: self.error(line,self.POS_NOT_POSITIVE) + + # implement filtering + if not self.inregion(chrom,pos): return None + + # end of first-pass parse for sortedVCF + if lineparse: return chrom, pos, line + + id = cols[2] + + ref = cols[3].upper() + if ref == ".": + self.error(line,self.MISSING_REF) + if self._version == 33: ref = get_sequence(chrom,pos,pos+1,self._reference) + else: ref = "" + else: + for c in ref: + if c not in "ACGTN": self.error(line,self.UNKNOWN_CHAR_IN_REF) + if "N" in ref: ref = get_sequence(chrom,pos,pos+len(ref),self._reference) + + # make sure reference is sane + if self._reference: + left = max(0,pos-100) + faref_leftflank = get_sequence(chrom,left,pos+len(ref),self._reference) + faref = faref_leftflank[pos-left:] + if faref != ref: self.error(line,self.WRONG_REF,"(reference is %s, VCF says %s)" % (faref,ref)) + ref = faref + + # convert v3.3 to v4.0 alleles below + if cols[4] == ".": alt = [] + else: alt = cols[4].upper().split(',') + + if cols[5] == ".": qual = -1 + else: + try: qual = float(cols[5]) + except: self.error(line,self.QUAL_NOT_NUMERICAL) + + # postpone checking that filters exist. Encode missing filter or no filtering as empty list + if cols[6] == "." or cols[6] == "PASS" or cols[6] == "0": filter = [] + else: filter = cols[6].split(';') + + # dictionary of keys, and list of values + info = {} + if cols[7] != ".": + for blurp in cols[7].split(';'): + elts = blurp.split('=') + if len(elts) == 1: v = None + elif len(elts) == 2: v = elts[1] + else: self.error(line,self.ERROR_INFO_STRING) + info[elts[0]] = self.parse_formatdata(elts[0], + v, + self._info, + line) + + # Gracefully deal with absent FORMAT column + if cols[8] == "": format = [] + else: format = cols[8].split(':') + + # check: all filters are defined + for f in filter: + if f not in self._filter: self.error(line,self.FILTER_NOT_DEFINED, f) + + # check: format fields are defined + if self._format: + for f in format: + if f not in self._format: self.error(line,self.FORMAT_NOT_DEFINED, f) + + # convert v3.3 alleles + if self._version == 33: + if len(ref) != 1: self.error(line,self.V33_BAD_REF) + newalts = [] + have_deletions = False + for a in alt: + if len(a) == 1: a = a + ref[1:] # SNP; add trailing reference + elif a.startswith('I'): a = ref[0] + a[1:] + ref[1:] # insertion just beyond pos; add first and trailing reference + elif a.startswith('D'): # allow D and D + have_deletions = True + try: + l = int(a[1:]) # throws ValueError if sequence + if len(ref) < l: # add to reference if necessary + addns = get_sequence(chrom,pos+len(ref),pos+l,self._reference) + ref += addns + for i,na in enumerate(newalts): newalts[i] = na+addns + a = ref[l:] # new deletion, deleting pos...pos+l + except ValueError: + s = a[1:] + if len(ref) < len(s): # add Ns to reference if necessary + addns = get_sequence(chrom,pos+len(ref),pos+len(s),self._reference) + if not s.endswith(addns) and addns != 'N'*len(addns): + self.error(line,self.V33_UNMATCHED_DELETION, + "(deletion is %s, reference is %s)" % (a,get_sequence(chrom,pos,pos+len(s),self._reference))) + ref += addns + for i,na in enumerate(newalts): newalts[i] = na+addns + a = ref[len(s):] # new deletion, deleting from pos + else: + self.error(line,self.V33_BAD_ALLELE) + newalts.append(a) + alt = newalts + # deletion alleles exist, add dummy 1st reference allele, and account for leading base + if have_deletions: + if pos == 0: + # Petr Danacek's: we can't have a leading nucleotide at (1-based) position 1 + addn = get_sequence(chrom,pos+len(ref),pos+len(ref)+1,self._reference) + ref += addn + alt = [allele+addn for allele in alt] + else: + addn = get_sequence(chrom,pos-1,pos,self._reference) + ref = addn + ref + alt = [addn + allele for allele in alt] + pos -= 1 + else: + # format v4.0 -- just check for nucleotides + for allele in alt: + if not alleleRegEx.match(allele): + self.error(line,self.V40_BAD_ALLELE,allele) + + # check for leading nucleotide in indel calls + for allele in alt: + if len(allele) != len(ref): + if len(allele) == 0: self.error(line,self.ZERO_LENGTH_ALLELE) + if ref[0].upper() != allele[0].upper() and "N" not in (ref[0]+allele[0]).upper(): + self.error(line,self.MISSING_INDEL_ALLELE_REF_BASE) + + # trim trailing bases in alleles + # AH: not certain why trimming this needs to be added + # disabled now for unit testing + # if alt: + # for i in range(1,min(len(ref),min(map(len,alt)))): + # if len(set(allele[-1].upper() for allele in alt)) > 1 or ref[-1].upper() != alt[0][-1].upper(): + # break + # ref, alt = ref[:-1], [allele[:-1] for allele in alt] + + # left-align alleles, if a reference is available + if self._leftalign and self._reference: + while left < pos: + movable = True + for allele in alt: + if len(allele) > len(ref): + longest, shortest = allele, ref + else: + longest, shortest = ref, allele + if len(longest) == len(shortest) or longest[:len(shortest)].upper() != shortest.upper(): + movable = False + if longest[-1].upper() != longest[len(shortest)-1].upper(): + movable = False + if not movable: + break + ref = ref[:-1] + alt = [allele[:-1] for allele in alt] + if min([len(allele) for allele in alt]) == 0 or len(ref) == 0: + ref = faref_leftflank[pos-left-1] + ref + alt = [faref_leftflank[pos-left-1] + allele for allele in alt] + pos -= 1 + + # parse sample columns + samples = [] + for sample in cols[9:]: + dict = {} + values = sample.split(':') + if len(values) > len(format): + self.error(line,self.BAD_NUMBER_OF_VALUES,"(found %s values in element %s; expected %s)" % (len(values),sample,len(format))) + for idx in range(len(format)): + expected = self.get_expected(format[idx], self._format, alt) + if idx < len(values): value = values[idx] + else: + if expected == -1: value = "." + else: value = ",".join(["."]*expected) + + dict[format[idx]] = self.parse_formatdata(format[idx], + value, + self._format, + line) + if expected != -1 and len(dict[format[idx]]) != expected: + self.error(line,self.BAD_NUMBER_OF_PARAMETERS, + "id=%s, expected %s parameters, got %s" % (format[idx],expected,dict[format[idx]])) + if len(dict[format[idx]] ) < expected: dict[format[idx]] += [dict[format[idx]][-1]]*(expected-len(dict[format[idx]])) + dict[format[idx]] = dict[format[idx]][:expected] + samples.append( dict ) + + # done + d = {'chrom':chrom, + 'pos':pos, # return 0-based position + 'id':id, + 'ref':ref, + 'alt':alt, + 'qual':qual, + 'filter':filter, + 'info':info, + 'format':format} + for key,value in zip(self._samples,samples): + d[key] = value + + return d + + + def write_data(self, stream, data): + required = ['chrom','pos','id','ref','alt','qual','filter','info','format'] + self._samples + for k in required: + if k not in data: raise ValueError("Required key %s not found in data" % str(k)) + if data['alt'] == []: alt = "." + else: alt = ",".join(data['alt']) + if data['filter'] == None: filter = "." + elif data['filter'] == []: + if self._version == 33: filter = "0" + else: filter = "PASS" + else: filter = ';'.join(data['filter']) + if data['qual'] == -1: qual = "." + else: qual = str(data['qual']) + + output = [data['chrom'], + str(data['pos']+1), # change to 1-based position + data['id'], + data['ref'], + alt, + qual, + filter, + self.format_formatdata( + data['info'], self._info, separator=";"), + self.format_formatdata( + data['format'], self._format, value=False)] + + for s in self._samples: + output.append(self.format_formatdata( + data[s], self._format, key=False)) + + stream.write( "\t".join(output) + "\n" ) + + def _parse_header(self, stream): + self._lineno = 0 + for line in stream: + line = force_str(line, self.encoding) + self._lineno += 1 + if line.startswith('##'): + self.parse_header(line.strip()) + elif line.startswith('#'): + self.parse_heading(line.strip()) + self.enter_default_format() + else: + break + return line + + def _parse(self, line, stream): + # deal with files with header only + if line.startswith("##"): return + if len(line.strip()) > 0: + d = self.parse_data( line.strip() ) + if d: yield d + for line in stream: + self._lineno += 1 + if self._lines and self._lineno > self._lines: raise StopIteration + d = self.parse_data( line.strip() ) + if d: yield d + + ###################################################################################################### + # + # API follows + # + ###################################################################################################### + + def getsamples(self): + """ List of samples in VCF file """ + return self._samples + + def setsamples(self,samples): + """ List of samples in VCF file """ + self._samples = samples + + def getheader(self): + """ List of header key-value pairs (strings) """ + return self._header + + def setheader(self,header): + """ List of header key-value pairs (strings) """ + self._header = header + + def getinfo(self): + """ Dictionary of ##INFO tags, as VCF.FORMAT values """ + return self._info + + def setinfo(self,info): + """ Dictionary of ##INFO tags, as VCF.FORMAT values """ + self._info = info + + def getformat(self): + """ Dictionary of ##FORMAT tags, as VCF.FORMAT values """ + return self._format + + def setformat(self,format): + """ Dictionary of ##FORMAT tags, as VCF.FORMAT values """ + self._format = format + + def getfilter(self): + """ Dictionary of ##FILTER tags, as VCF.FORMAT values """ + return self._filter + + def setfilter(self,filter): + """ Dictionary of ##FILTER tags, as VCF.FORMAT values """ + self._filter = filter + + def setversion(self, version): + if version != 33 and version != 40: raise ValueError("Can only handle v3.3 and v4.0 VCF files") + self._version = version + + def setregions(self, regions): + self._regions = regions + + def setreference(self, ref): + """ Provide a reference sequence; a Python class supporting a fetch(chromosome, start, end) method, e.g. PySam.FastaFile """ + self._reference = ref + + def ignoreerror(self, errorstring): + try: self._ignored_errors.add(self.__dict__[errorstring]) + except KeyError: raise ValueError("Invalid error string: %s" % errorstring) + + def warnerror(self, errorstring): + try: self._warn_errors.add(self.__dict__[errorstring]) + except KeyError: raise ValueError("Invalid error string: %s" % errorstring) + + def parse(self, stream): + """ Parse a stream of VCF-formatted lines. Initializes class instance and return generator """ + last_line = self._parse_header(stream) + # now return a generator that does the actual work. In this way the pre-processing is done + # before the first piece of data is yielded + return self._parse(last_line, stream) + + def write(self, stream, datagenerator): + """ Writes a VCF file to a stream, using a data generator (or list) """ + self.write_header(stream) + self.write_heading(stream) + for data in datagenerator: self.write_data(stream,data) + + def writeheader(self, stream): + """ Writes a VCF header """ + self.write_header(stream) + self.write_heading(stream) + + def compare_calls(self, pos1, ref1, alt1, pos2, ref2, alt2): + """ Utility function: compares two calls for equality """ + # a variant should always be assigned to a unique position, one base before + # the leftmost position of the alignment gap. If this rule is implemented + # correctly, the two positions must be equal for the calls to be identical. + if pos1 != pos2: return False + # from both calls, trim rightmost bases when identical. Do this safely, i.e. + # only when the reference bases are not Ns + while len(ref1)>0 and len(alt1)>0 and ref1[-1] == alt1[-1]: + ref1 = ref1[:-1] + alt1 = alt1[:-1] + while len(ref2)>0 and len(alt2)>0 and ref2[-1] == alt2[-1]: + ref2 = ref2[:-1] + alt2 = alt2[:-1] + # now, the alternative alleles must be identical + return alt1 == alt2 + +########################################################################################################### +########################################################################################################### +## API functions added by Andreas +########################################################################################################### + + def connect(self, filename, encoding="ascii"): + '''connect to tabix file.''' + self.encoding=encoding + self.tabixfile = pysam.Tabixfile(filename, encoding=encoding) + self._parse_header(self.tabixfile.header) + + def __del__(self): + self.close() + self.tabixfile = None + + def close(self): + if self.tabixfile: + self.tabixfile.close() + self.tabixfile = None + + def fetch(self, + reference=None, + start=None, + end=None, + region=None ): + """ Parse a stream of VCF-formatted lines. + Initializes class instance and return generator """ + return self.tabixfile.fetch( + reference, + start, + end, + region, + parser = asVCFRecord(self)) + + def validate(self, record): + '''validate vcf record. + + returns a validated record. + ''' + + raise NotImplementedError("needs to be checked") + + chrom, pos = record.chrom, record.pos + + # check reference + ref = record.ref + if ref == ".": + self.error(str(record),self.MISSING_REF) + if self._version == 33: ref = get_sequence(chrom,pos,pos+1,self._reference) + else: ref = "" + else: + for c in ref: + if c not in "ACGTN": self.error(str(record),self.UNKNOWN_CHAR_IN_REF) + if "N" in ref: ref = get_sequence(chrom, + pos, + pos+len(ref), + self._reference) + + # make sure reference is sane + if self._reference: + left = max(0,self.pos-100) + faref_leftflank = get_sequence(chrom,left,self.pos+len(ref),self._reference) + faref = faref_leftflank[pos-left:] + if faref != ref: self.error(str(record),self.WRONG_REF,"(reference is %s, VCF says %s)" % (faref,ref)) + ref = faref + + # check: format fields are defined + for f in record.format: + if f not in self._format: self.error(str(record),self.FORMAT_NOT_DEFINED, f) + + # check: all filters are defined + for f in record.filter: + if f not in self._filter: self.error(str(record),self.FILTER_NOT_DEFINED, f) + + # convert v3.3 alleles + if self._version == 33: + if len(ref) != 1: self.error(str(record),self.V33_BAD_REF) + newalts = [] + have_deletions = False + for a in alt: + if len(a) == 1: a = a + ref[1:] # SNP; add trailing reference + elif a.startswith('I'): a = ref[0] + a[1:] + ref[1:] # insertion just beyond pos; add first and trailing reference + elif a.startswith('D'): # allow D and D + have_deletions = True + try: + l = int(a[1:]) # throws ValueError if sequence + if len(ref) < l: # add to reference if necessary + addns = get_sequence(chrom,pos+len(ref),pos+l,self._reference) + ref += addns + for i,na in enumerate(newalts): newalts[i] = na+addns + a = ref[l:] # new deletion, deleting pos...pos+l + except ValueError: + s = a[1:] + if len(ref) < len(s): # add Ns to reference if necessary + addns = get_sequence(chrom,pos+len(ref),pos+len(s),self._reference) + if not s.endswith(addns) and addns != 'N'*len(addns): + self.error(str(record),self.V33_UNMATCHED_DELETION, + "(deletion is %s, reference is %s)" % (a,get_sequence(chrom,pos,pos+len(s),self._reference))) + ref += addns + for i,na in enumerate(newalts): newalts[i] = na+addns + a = ref[len(s):] # new deletion, deleting from pos + else: + self.error(str(record),self.V33_BAD_ALLELE) + newalts.append(a) + alt = newalts + # deletion alleles exist, add dummy 1st reference allele, and account for leading base + if have_deletions: + if pos == 0: + # Petr Danacek's: we can't have a leading nucleotide at (1-based) position 1 + addn = get_sequence(chrom,pos+len(ref),pos+len(ref)+1,self._reference) + ref += addn + alt = [allele+addn for allele in alt] + else: + addn = get_sequence(chrom,pos-1,pos,self._reference) + ref = addn + ref + alt = [addn + allele for allele in alt] + pos -= 1 + else: + # format v4.0 -- just check for nucleotides + for allele in alt: + if not alleleRegEx.match(allele): + self.error(str(record),self.V40_BAD_ALLELE,allele) + + + # check for leading nucleotide in indel calls + for allele in alt: + if len(allele) != len(ref): + if len(allele) == 0: self.error(str(record),self.ZERO_LENGTH_ALLELE) + if ref[0].upper() != allele[0].upper() and "N" not in (ref[0]+allele[0]).upper(): + self.error(str(record),self.MISSING_INDEL_ALLELE_REF_BASE) + + # trim trailing bases in alleles + # AH: not certain why trimming this needs to be added + # disabled now for unit testing + # for i in range(1,min(len(ref),min(map(len,alt)))): + # if len(set(allele[-1].upper() for allele in alt)) > 1 or ref[-1].upper() != alt[0][-1].upper(): + # break + # ref, alt = ref[:-1], [allele[:-1] for allele in alt] + + # left-align alleles, if a reference is available + if self._leftalign and self._reference: + while left < pos: + movable = True + for allele in alt: + if len(allele) > len(ref): + longest, shortest = allele, ref + else: + longest, shortest = ref, allele + if len(longest) == len(shortest) or longest[:len(shortest)].upper() != shortest.upper(): + movable = False + if longest[-1].upper() != longest[len(shortest)-1].upper(): + movable = False + if not movable: + break + ref = ref[:-1] + alt = [allele[:-1] for allele in alt] + if min([len(allele) for allele in alt]) == 0 or len(ref) == 0: + ref = faref_leftflank[pos-left-1] + ref + alt = [faref_leftflank[pos-left-1] + allele for allele in alt] + pos -= 1 + +__all__ = [ + "VCF", "VCFRecord", ] diff --git a/pysam/py.typed b/pysam/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/pysam/pysam_stream.h b/pysam/pysam_stream.h new file mode 100644 index 0000000..3a4eb16 --- /dev/null +++ b/pysam/pysam_stream.h @@ -0,0 +1,13 @@ +#ifndef PYSAM_STREAM_H +#define PYSAM_STREAM_H + +#include "htslib/kseq.h" + +// ####################################################### +// fastq parsing +// KSEQ_INIT(gzFile, gzread) +KSEQ_INIT(BGZF *, bgzf_read) + +//KSTREAM_INIT( gzFile, gzread, 16384) + +#endif diff --git a/pysam/pysam_util.c b/pysam/pysam_util.c new file mode 100644 index 0000000..349af44 --- /dev/null +++ b/pysam/pysam_util.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include + +#include "htslib/khash.h" +#include "htslib/ksort.h" +#include "htslib/knetfile.h" + +#if !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) +/* + * A rudimentary emulation of getline() for systems that dont support it + * natively. Since this is used for PPD file reading, it assumes (possibly + * falsely) that BUFSIZ is big enough. + */ +ssize_t +getline(char **line, size_t *linelen, FILE *fp) +{ + if (*linelen == 0) + { + *linelen = BUFSIZ; + *line = malloc(*linelen); + } + + memset(*line, 0, *linelen); + fgets(*line, *linelen, fp); + + return (strlen(*line)); + +} +#endif + + + diff --git a/pysam/pysam_util.h b/pysam/pysam_util.h new file mode 100644 index 0000000..789e9d0 --- /dev/null +++ b/pysam/pysam_util.h @@ -0,0 +1,5 @@ +#ifndef PYSAM_UTIL_H +#define PYSAM_UTIL_H + + +#endif diff --git a/pysam/samtools.py b/pysam/samtools.py new file mode 100644 index 0000000..a90d32c --- /dev/null +++ b/pysam/samtools.py @@ -0,0 +1,55 @@ +from pysam.utils import PysamDispatcher + +# samtools command line options to export in python +SAMTOOLS_DISPATCH = { + # samtools 'documented' commands + "view": ("view", None), + "head": ("head", None), + "sort": ("sort", None), + "mpileup": ("mpileup", None), + "consensus": ("consensus", None), + "depth": ("depth", None), + "faidx": ("faidx", None), + "fqidx": ("fqidx", None), + "tview": ("tview", None), + "index": ("index", None), + "idxstats": ("idxstats", None), + "fixmate": ("fixmate", None), + "flagstat": ("flagstat", None), + "calmd": ("calmd", None), + "merge": ("merge", None), + "markdup": ("markdup", None), + "rmdup": ("rmdup", None), + "reference": ("reference", None), + "reheader": ("reheader", None), + "cat": ("cat", None), + "targetcut": ("targetcut", None), + "phase": ("phase", None), + "bam2fq": ("bam2fq", None), + "dict": ("dict", None), + "addreplacerg": ("addreplacerg", None), + "pad2unpad": ("pad2unpad", None), + "depad": ("pad2unpad", None), + "bedcov": ("bedcov", None), + "coverage": ("coverage", None), + "bamshuf": ("bamshuf", None), + "collate": ("collate", None), + "stats": ("stats", None), + "fasta": ("fasta", None), + "fastq": ("fastq", None), + "quickcheck": ("quickcheck", None), + "split": ("split", None), + "flags": ("flags", None), + "ampliconclip": ("ampliconclip", None), + "ampliconstats": ("ampliconstats", None), + "version": ("version", None), + "fqimport": ("import", None), + "samples": ("samples", None), +} + +# instantiate samtools commands as python functions +for key, options in SAMTOOLS_DISPATCH.items(): + cmd, parser = options + globals()[key] = PysamDispatcher("samtools", cmd, parser) + +__all__ = list(SAMTOOLS_DISPATCH) diff --git a/pysam/utils.py b/pysam/utils.py new file mode 100644 index 0000000..fcc4434 --- /dev/null +++ b/pysam/utils.py @@ -0,0 +1,111 @@ +from pysam.libcutils import _pysam_dispatch + + +class SamtoolsError(Exception): + '''exception raised in case of an error incurred in the samtools + library.''' + + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + + +class PysamDispatcher(object): + '''The dispatcher emulates the samtools/bctools command line. + + Captures stdout and stderr. + + Raises a :class:`pysam.SamtoolsError` exception in case samtools + exits with an error code other than 0. + + Some command line options are associated with parsers. For + example, the samtools command "pileup -c" creates a tab-separated + table on standard output. In order to associate parsers with + options, an optional list of parsers can be supplied. The list + will be processed in order checking for the presence of each + option. + + If no parser is given or no appropriate parser is found, the + stdout output of samtools/bcftools commands will be returned. + + ''' + + dispatch = None + parsers = None + collection = None + + def __init__(self, collection, dispatch, parsers): + self.collection = collection + self.dispatch = dispatch + self.parsers = parsers + self.stderr = [] + + def __call__(self, *args, **kwargs): + '''execute a samtools command. + + Keyword arguments: + catch_stdout -- redirect stdout from the samtools command and + return as variable (default True) + save_stdout -- redirect stdout to a filename. + raw -- ignore any parsers associated with this samtools command. + split_lines -- return stdout (if catch_stdout is True and stderr + as a list of strings. + ''' + retval, stderr, stdout = _pysam_dispatch( + self.collection, + self.dispatch, + args, + catch_stdout=kwargs.get("catch_stdout", True), + save_stdout=kwargs.get("save_stdout", None)) + + if kwargs.get("split_lines", False): + stdout = stdout.splitlines() + if stderr: + stderr = stderr.splitlines() + + if retval: + raise SamtoolsError( + "%s returned with error %i: " + "stdout=%s, stderr=%s" % + (self.collection, + retval, + stdout, + stderr)) + + self.stderr = stderr + + # call parser for stdout: + if not kwargs.get("raw") and stdout and self.parsers: + for options, parser in self.parsers: + for option in options: + if option not in args: + break + else: + return parser(stdout) + + return stdout + + def get_messages(self): + return self.stderr + + def usage(self): + '''return the samtools usage information for this command''' + retval, stderr, stdout = _pysam_dispatch( + self.collection, + self.dispatch, + is_usage=True, + catch_stdout=True) + # some tools write usage to stderr, such as mpileup + if stderr: + return stderr + else: + return stdout + + +class unquoted_str(str): + '''Tag a value as an unquoted string. Meta-information in the VCF + header takes the form of key=value pairs. By default, pysam will + enclose the value in quotation marks. Tagging that value with + unquoted_str will prevent this quoting.''' diff --git a/pysam/version.h b/pysam/version.h new file mode 100644 index 0000000..dddd49c --- /dev/null +++ b/pysam/version.h @@ -0,0 +1,5 @@ +// Version information used while compiling samtools, bcftools, and htslib + +#define SAMTOOLS_VERSION "1.16.1 (pysam)" +#define BCFTOOLS_VERSION "1.16 (pysam)" +#define HTS_VERSION_TEXT "1.16 (pysam)" diff --git a/pysam/version.py b/pysam/version.py new file mode 100644 index 0000000..b6aede0 --- /dev/null +++ b/pysam/version.py @@ -0,0 +1,6 @@ +# pysam versioning information +__version__ = "0.20.0" + +__samtools_version__ = "1.16.1" +__bcftools_version__ = "1.16" +__htslib_version__ = "1.16" diff --git a/pysam/version.pyi b/pysam/version.pyi new file mode 100644 index 0000000..9d52128 --- /dev/null +++ b/pysam/version.pyi @@ -0,0 +1,4 @@ +__version__: str +__samtools_version__: str +__bcftools_version__: str +__htslib_version__: str diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f937d1c --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +cython>=0.29.12 diff --git a/samtools/LICENSE b/samtools/LICENSE new file mode 100644 index 0000000..a14e403 --- /dev/null +++ b/samtools/LICENSE @@ -0,0 +1,33 @@ +The MIT/Expat License + +Copyright (C) 2008-2022 Genome Research Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + +[The use of a range of years within a copyright notice in this distribution +should be interpreted as being equivalent to a list of years including the +first and last year specified and all consecutive years between them. + +For example, a copyright notice that reads "Copyright (C) 2005, 2007-2009, +2011-2012" should be interpreted as being identical to a notice that reads +"Copyright (C) 2005, 2007, 2008, 2009, 2011, 2012" and a copyright notice +that reads "Copyright (C) 2005-2012" should be interpreted as being identical +to a notice that reads "Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, +2011, 2012".] diff --git a/samtools/README b/samtools/README new file mode 100644 index 0000000..7be5383 --- /dev/null +++ b/samtools/README @@ -0,0 +1,126 @@ +Samtools implements various utilities for post-processing alignments in the +SAM, BAM, and CRAM formats, including indexing, variant calling (in conjunction +with bcftools), and a simple alignment viewer. + + +Building samtools +================= + +The typical simple case of building Samtools using the HTSlib bundled within +this Samtools release tarball is done as follows: + + cd .../samtools-1.16.1 # Within the unpacked release directory + ./configure + make + +You may wish to copy the resulting samtools executable into somewhere on your +$PATH, or run it where it is. + +Rather than running-in-place like that, the next simplest typical case is to +install samtools etc properly into a directory of your choosing. Building for +installation using the HTSlib bundled within this Samtools release tarball, +and building the various HTSlib utilities such as bgzip is done as follows: + + cd .../samtools-1.16.1 # Within the unpacked release directory + ./configure --prefix=/path/to/location + make all all-htslib + make install install-htslib + +You will likely wish to add /path/to/location/bin to your $PATH. + +See INSTALL for full building and installation instructions and details. + +Building with HTSlib plug-in support +==================================== + +Enabling plug-ins causes some parts of HTSlib to be built as separate modules. +There are two advantages to this: + + * The static library libhts.a has fewer dependencies, which makes linking + third-party code against it easier. + + * It is possible to build extra plug-ins in addition to the ones that are + bundled with HTSlib. For example, the hts-plugins repository + includes a module that + allows direct access to files stored in an iRODS data management + repository (see ). + +To build with plug-ins, you need to use the --enable-plugins configure option +as follows: + + cd .../samtools-1.16.1 # Within the unpacked release directory + ./configure --enable-plugins --prefix=/path/to/location + make all all-htslib + make install install-htslib + +There are two other configure options that affect plug-ins. These are: + --with-plugin-dir=DIR plug-in installation location + --with-plugin-path=PATH default plug-in search path + +The default for --with-plugin-dir is /libexec/htslib. +--with-plugin-path sets the built-in search path used to find the plug-ins. By +default this is the directory set by the --with-plugin-dir option. Multiple +directories should be separated by colons. + +Setting --with-plugin-path is useful if you want to run directly from +the source distribution instead of installing the package. In that case +you can use: + + cd .../samtools-1.16.1 # Within the unpacked release directory + ./configure --enable-plugins --with-plugin-path=$PWD/htslib-1.16 + make all all-htslib + +It is possible to override the built-in search path using the HTS_PATH +environment variable. Directories should be separated by colons. To +include the built-in path, add an empty entry to HTS_PATH: + + export HTS_PATH=:/my/path # Search built-in path first + export HTS_PATH=/my/path: # Search built-in path last + export HTS_PATH=/my/path1::/my/path2 # Search built-in path between others + +Using an optimised zlib library +=============================== + +Samtools has been minimally tested against both the Intel-optimised and +CloudFlare-optimised zlibs and shown to work. + +They can be downloaded from: + + https://github.com/jtkukunas/zlib # Intel + https://github.com/cloudflare/zlib # CloudFlare + +Neither Samtools nor HTSlib needs recompiling to use these optimised libraries, +but the LD_LIBRARY_PATH environment variable should be set to a directory +containing the libz.so.1 file. + +Benchmarks comparing the various zlibs are available at: + + http://www.htslib.org/benchmarks/zlib.html + +It is recommended that you perform your own rigorous tests for an entire +pipeline if you wish to switch to one of the optimised zlib implementations. + +Citing +====== + +Please cite this paper when using SAMtools for your publications: + +Twelve years of SAMtools and BCFtools +Petr Danecek, James K Bonfield, Jennifer Liddle, John Marshall, Valeriu Ohan, Martin O Pollard, Andrew Whitwham, Thomas Keane, Shane A McCarthy, Robert M Davies, Heng Li +GigaScience, Volume 10, Issue 2, February 2021, giab008, https://doi.org/10.1093/gigascience/giab008 + +@article{10.1093/gigascience/giab008, + author = {Danecek, Petr and Bonfield, James K and Liddle, Jennifer and Marshall, John and Ohan, Valeriu and Pollard, Martin O and Whitwham, Andrew and Keane, Thomas and McCarthy, Shane A and Davies, Robert M and Li, Heng}, + title = "{Twelve years of SAMtools and BCFtools}", + journal = {GigaScience}, + volume = {10}, + number = {2}, + year = {2021}, + month = {02}, + abstract = "{SAMtools and BCFtools are widely used programs for processing and analysing high-throughput sequencing data. They include tools for file format conversion and manipulation, sorting, querying, statistics, variant calling, and effect analysis amongst other methods.The first version appeared online 12 years ago and has been maintained and further developed ever since, with many new features and improvements added over the years. The SAMtools and BCFtools packages represent a unique collection of tools that have been used in numerous other software projects and countless genomic pipelines.Both SAMtools and BCFtools are freely available on GitHub under the permissive MIT licence, free for both non-commercial and commercial use. Both packages have been installed \\>1 million times via Bioconda. The source code and documentation are available from https://www.htslib.org.}", + issn = {2047-217X}, + doi = {10.1093/gigascience/giab008}, + url = {https://doi.org/10.1093/gigascience/giab008}, + note = {giab008}, + eprint = {https://academic.oup.com/gigascience/article-pdf/10/2/giab008/36332246/giab008.pdf}, +} diff --git a/samtools/amplicon_stats.c b/samtools/amplicon_stats.c new file mode 100644 index 0000000..62bb15c --- /dev/null +++ b/samtools/amplicon_stats.c @@ -0,0 +1,1754 @@ +/* stats.c -- This is the former bamcheck integrated into samtools/htslib. + + Copyright (C) 2020-2021 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* + * This tool is designed to give "samtools stats" style output, but dedicated + * to small amplicon sequencing projects. It gathers stats on the + * distribution of reads across amplicons. + */ + +/* + * TODO: + * - Cope with multiple references. What do we do here? Just request one? + * - Permit regions rather than consuming whole file (maybe solves above). + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "samtools.h" +#include "sam_opts.h" +#include "bam_ampliconclip.h" + +KHASH_MAP_INIT_INT64(tcoord, int64_t) +KHASH_MAP_INIT_STR(qname, int64_t) + +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + +#ifndef ABS +#define ABS(a) ((a)>=0?(a):-(a)) +#endif + +#define TCOORD_MIN_COUNT 10 +#define MAX_AMP 1000 // Default maximum number of amplicons +#define MAX_AMP_LEN 1000 // Default maximum length of any single amplicon +#define MAX_PRIMER_PER_AMPLICON 4 // Max primers per LEFT/RIGHT +#define MAX_DEPTH 5 // Number of different depths permitted + +typedef struct { + sam_global_args ga; + uint32_t flag_require; + uint32_t flag_filter; + int max_delta; // Used for matching read to amplicon primer loc + int min_depth[MAX_DEPTH]; // Used for coverage; must be >= min_depth deep + int use_sample_name; + int max_amp; // Total number of amplicons + int max_amp_len; // Maximum length of an individual amplicon + double depth_bin;// aggregate depth within this fraction + int tlen_adj; // Adjust tlen by this amount, due to clip but no fixmate + FILE *out_fp; + char *argv; + int tcoord_min_count; + int tcoord_bin; + int multi_ref; +} astats_args_t; + +typedef struct { + int nseq; // total sequence count + int nfiltered; // sequence filtered + int nfailprimer;// count of sequences not matching the primer locations + + // Sizes of memory allocated below, to permit reset + int max_amp, max_amp_len, max_len; + + // Summary across all samples, sum(x) plus sum(x^2) for s.d. calc + int64_t *nreads, *nreads2; // [max_amp] + double *nfull_reads; // [max_amp]; 0.5/read if paired. + double *nrperc, *nrperc2; // [max_amp] + int64_t *nbases, *nbases2; // [max_amp] + int64_t *coverage; // [max_amp][max_amp_len] + double (*covered_perc)[MAX_DEPTH]; // [max_amp][MAX_DEPTH] + double (*covered_perc2)[MAX_DEPTH];// [max_amp][MAX_DEPTH]; + khash_t(tcoord) **tcoord; // [max_amp+1] + + // 0 is correct pair, 1 is incorrect pair, 2 is unidentified + int (*amp_dist)[3]; // [MAX_AMP][3]; + + int *depth_valid; // [max_len] + int *depth_all; // [max_len] + khash_t(qname) *qend; // queryname end, for overlap removal +} astats_t; + +// We can have multiple primers for LEFT / RIGHT, so this +// permits detection by any compatible combination. +// One reference: +typedef struct { + int64_t left[MAX_PRIMER_PER_AMPLICON]; + int nleft; + int64_t right[MAX_PRIMER_PER_AMPLICON]; + int nright; + int64_t max_left, min_right; // inner dimensions + int64_t min_left, max_right; // outer dimensions +} amplicon_t; + +// Multiple references, we have an array of amplicons_t - one per used ref. +// We have per reference local and global stats here, as some of the stats +// are coordinate based. However we report them combined together as a single +// list across all references. +// "namp" is the number of amplicons in this reference, but they're +// numbered first_amp to first_amp+namp-1 inclusively. +typedef struct { + int tid, namp; + int64_t len; + bed_entry_list_t *sites; + amplicon_t *amp; + astats_t *lstats, *gstats; // local (1 file) and global (all file) stats + const char *ref; // ref name (pointer to the bed hash table key) + int first_amp; // first amplicon number for this ref +} amplicons_t; + +// Reinitialised for each new reference/chromosome. +// Counts from 1 to namp, -1 for no match and 0 for ?. +static int *pos2start = NULL; +static int *pos2end = NULL; +static int pos2size = 0; // allocated size of pos2start/end + +// Lookup table to go from position to amplicon based on +// read start / end. +static int initialise_amp_pos_lookup(astats_args_t *args, + amplicons_t *amps, + int ref) { + int64_t i, j; + amplicon_t *amp = amps[ref].amp; + int64_t max_len = amps[ref].len; + int namp = amps[ref].namp; + + if (max_len+1 > pos2size) { + if (!(pos2start = realloc(pos2start, (max_len+1)*sizeof(*pos2start)))) + return -1; + if (!(pos2end = realloc(pos2end, (max_len+1)*sizeof(*pos2end)))) + return -1; + pos2size = max_len; + } + for (i = 0; i < max_len; i++) + pos2start[i] = pos2end[i] = -1; + + for (i = 0; i < namp; i++) { + for (j = 0; j < amp[i].nleft; j++) { + int64_t p; + for (p = amp[i].left[j] - args->max_delta; + p <= amp[i].left[j] + args->max_delta; p++) { + if (p < 1 || p > max_len) + continue; + pos2start[p-1] = i; + } + } + for (j = 0; j < amp[i].nright; j++) { + int64_t p; + for (p = amp[i].right[j] - args->max_delta; + p <= amp[i].right[j] + args->max_delta; p++) { + if (p < 1 || p > max_len) + continue; + pos2end[p-1] = i; + } + } + } + + return 0; +} + +// Counts amplicons. +// Assumption: input BED file alternates between LEFT and RIGHT primers +// per amplicon, thus we can count the number based on the switching +// orientation. +static int count_amplicon(bed_entry_list_t *sites) { + int i, namp, last_rev = 0; + for (i = namp = 0; i < sites->length; i++) { + if (sites->bp[i].rev == 0 && last_rev) + namp++; + last_rev = sites->bp[i].rev; + } + + return ++namp; +} + +// We're only interest in the internal part of the amplicon. +// Our bed file has LEFT start/end followed by RIGHT start/end, +// so collapse these to LEFT end / RIGHT start. +// +// Returns right most amplicon position on success, +// < 0 on error +static int64_t bed2amplicon(astats_args_t *args, bed_entry_list_t *sites, + amplicon_t *amp, int *namp, int do_title, + const char *ref, int first_amp) { + int i, j; + int64_t max_right = 0; + FILE *ofp = args->out_fp; + + *namp = 0; + + // Assume all primers for the same amplicon are adjacent in BED + // with all + followed by all -. Thus - to + signifies next primer set. + int last_rev = 0; + amp[0].max_left = 0; + amp[0].min_right = INT64_MAX; + amp[0].min_left = INT64_MAX; + amp[0].max_right = 0; + if (do_title) { + fprintf(ofp, "# Amplicon locations from BED file.\n"); + fprintf(ofp, "# LEFT/RIGHT are - format and " + "comma-separated for alt-primers.\n"); + if (args->multi_ref) + fprintf(ofp, "#\n# AMPLICON\tREF\tNUMBER\tLEFT\tRIGHT\n"); + else + fprintf(ofp, "#\n# AMPLICON\tNUMBER\tLEFT\tRIGHT\n"); + } + for (i = j = 0; i < sites->length; i++) { + if (i == 0 && sites->bp[i].rev != 0) { + fprintf(stderr, "[ampliconstats] error: BED file should start" + " with the + strand primer\n"); + return -1; + } + if (sites->bp[i].rev == 0 && last_rev) { + j++; + if (j >= args->max_amp) { + fprintf(stderr, "[ampliconstats] error: too many amplicons" + " (%d). Use -a option to raise this.\n", j); + return -1; + } + amp[j].max_left = 0; + amp[j].min_right = INT64_MAX; + amp[j].min_left = INT64_MAX; + amp[j].max_right = 0; + } + if (sites->bp[i].rev == 0) { + if (i == 0 || last_rev) { + if (j>0) fprintf(ofp, "\n"); + if (args->multi_ref) + fprintf(ofp, "AMPLICON\t%s\t%d", ref, j+1 + first_amp); + else + fprintf(ofp, "AMPLICON\t%d", j+1); + } + if (amp[j].nleft >= MAX_PRIMER_PER_AMPLICON) { + print_error_errno("ampliconstats", + "too many primers per amplicon (%d).\n", + MAX_PRIMER_PER_AMPLICON); + return -1; + } + amp[j].left[amp[j].nleft++] = sites->bp[i].right; + if (amp[j].max_left < sites->bp[i].right+1) + amp[j].max_left = sites->bp[i].right+1; + if (amp[j].min_left > sites->bp[i].right+1) + amp[j].min_left = sites->bp[i].right+1; + // BED file, so left+1 as zero based. right(+1-1) as + // BED goes one beyond end (and we want inclusive range). + fprintf(ofp, "%c%"PRId64"-%"PRId64, "\t,"[amp[j].nleft > 1], + sites->bp[i].left+1, sites->bp[i].right); + } else { + if (amp[j].nright >= MAX_PRIMER_PER_AMPLICON) { + print_error_errno("ampliconstats", + "too many primers per amplicon (%d)", + MAX_PRIMER_PER_AMPLICON); + return -1; + } + amp[j].right[amp[j].nright++] = sites->bp[i].left; + if (amp[j].min_right > sites->bp[i].left-1) + amp[j].min_right = sites->bp[i].left-1; + if (amp[j].max_right < sites->bp[i].left-1) { + amp[j].max_right = sites->bp[i].left-1; + if (amp[j].max_right - amp[j].min_left + 1 >= + args->max_amp_len) { + fprintf(stderr, "[ampliconstats] error: amplicon " + "longer (%d) than max_amp_len option (%d)\n", + (int)(amp[j].max_right - amp[j].min_left + 2), + args->max_amp_len); + return -1; + } + if (max_right < amp[j].max_right) + max_right = amp[j].max_right; + } + fprintf(ofp, "%c%"PRId64"-%"PRId64, "\t,"[amp[j].nright > 1], + sites->bp[i].left+1, sites->bp[i].right); + } + last_rev = sites->bp[i].rev; + } + if (last_rev != 1) { + fprintf(ofp, "\n"); // useful if going to stdout + fprintf(stderr, "[ampliconstats] error: bed file does not end on" + " a reverse strand primer.\n"); + return -1; + } + *namp = ++j; + if (j) fprintf(ofp, "\n"); + + if (j >= args->max_amp) { + fprintf(stderr, "[ampliconstats] error: " + "too many amplicons (%d). Use -a option to raise this.", j); + return -1; + } + +// for (i = 0; i < *namp; i++) { +// printf("%d\t%ld", i, amp[i].length); +// for (j = 0; j < amp[i].nleft; j++) +// printf("%c%ld", "\t,"[j>0], amp[i].left[j]); +// for (j = 0; j < amp[i].nright; j++) +// printf("%c%ld", "\t,"[j>0], amp[i].right[j]); +// printf("\n"); +// } + + return max_right; +} + +void stats_free(astats_t *st) { + if (!st) + return; + + free(st->nreads); + free(st->nreads2); + free(st->nfull_reads); + free(st->nrperc); + free(st->nrperc2); + free(st->nbases); + free(st->nbases2); + free(st->coverage); + free(st->covered_perc); + free(st->covered_perc2); + free(st->amp_dist); + + free(st->depth_valid); + free(st->depth_all); + + if (st->tcoord) { + int i; + for (i = 0; i <= st->max_amp; i++) { + if (st->tcoord[i]) + kh_destroy(tcoord, st->tcoord[i]); + } + free(st->tcoord); + } + + khiter_t k; + for (k = kh_begin(st->qend); k != kh_end(st->qend); k++) + if (kh_exist(st->qend, k)) + free((void *)kh_key(st->qend, k)); + kh_destroy(qname, st->qend); + + free(st); +} + +astats_t *stats_alloc(int64_t max_len, int max_amp, int max_amp_len) { + astats_t *st = calloc(1, sizeof(*st)); + if (!st) + return NULL; + + st->max_amp = max_amp; + st->max_amp_len = max_amp_len; + st->max_len = max_len; + + if (!(st->nreads = calloc(max_amp, sizeof(*st->nreads)))) goto err; + if (!(st->nreads2 = calloc(max_amp, sizeof(*st->nreads2)))) goto err; + if (!(st->nrperc = calloc(max_amp, sizeof(*st->nrperc)))) goto err; + if (!(st->nrperc2 = calloc(max_amp, sizeof(*st->nrperc2)))) goto err; + if (!(st->nbases = calloc(max_amp, sizeof(*st->nbases)))) goto err; + if (!(st->nbases2 = calloc(max_amp, sizeof(*st->nbases2)))) goto err; + + if (!(st->nfull_reads = calloc(max_amp, sizeof(*st->nfull_reads)))) + goto err; + + if (!(st->coverage = calloc(max_amp*max_amp_len, sizeof(*st->coverage)))) + goto err; + + if (!(st->covered_perc = calloc(max_amp, sizeof(*st->covered_perc)))) + goto err; + if (!(st->covered_perc2 = calloc(max_amp, sizeof(*st->covered_perc2)))) + goto err; + + if (!(st->tcoord = calloc(max_amp+1, sizeof(*st->tcoord)))) goto err; + int i; + for (i = 0; i <= st->max_amp; i++) + if (!(st->tcoord[i] = kh_init(tcoord))) + goto err; + + if (!(st->qend = kh_init(qname))) + goto err; + + if (!(st->depth_valid = calloc(max_len, sizeof(*st->depth_valid)))) + goto err; + if (!(st->depth_all = calloc(max_len, sizeof(*st->depth_all)))) + goto err; + + if (!(st->amp_dist = calloc(max_amp, sizeof(*st->amp_dist)))) goto err; + + return st; + + err: + stats_free(st); + return NULL; +} + +static void stats_reset(astats_t *st) { + st->nseq = 0; + st->nfiltered = 0; + st->nfailprimer = 0; + + memset(st->nreads, 0, st->max_amp * sizeof(*st->nreads)); + memset(st->nreads2, 0, st->max_amp * sizeof(*st->nreads2)); + memset(st->nfull_reads, 0, st->max_amp * sizeof(*st->nfull_reads)); + + memset(st->nrperc, 0, st->max_amp * sizeof(*st->nrperc)); + memset(st->nrperc2, 0, st->max_amp * sizeof(*st->nrperc2)); + + memset(st->nbases, 0, st->max_amp * sizeof(*st->nbases)); + memset(st->nbases2, 0, st->max_amp * sizeof(*st->nbases2)); + + memset(st->coverage, 0, st->max_amp * st->max_amp_len + * sizeof(*st->coverage)); + memset(st->covered_perc, 0, st->max_amp * sizeof(*st->covered_perc)); + memset(st->covered_perc2, 0, st->max_amp * sizeof(*st->covered_perc2)); + + // Keep the allocated entries as it's likely all files will share + // the same keys. Instead we reset counters to zero for common ones + // and delete rare ones. + int i; + for (i = 0; i <= st->max_amp; i++) { + khiter_t k; + for (k = kh_begin(st->tcoord[i]); + k != kh_end(st->tcoord[i]); k++) + if (kh_exist(st->tcoord[i], k)) { + if (kh_value(st->tcoord[i], k) < 5) + kh_del(tcoord, st->tcoord[i], k); + else + kh_value(st->tcoord[i], k) = 0; + } + } + + khiter_t k; + for (k = kh_begin(st->qend); k != kh_end(st->qend); k++) + if (kh_exist(st->qend, k)) + free((void *)kh_key(st->qend, k)); + kh_clear(qname, st->qend); + + memset(st->depth_valid, 0, st->max_len * sizeof(*st->depth_valid)); + memset(st->depth_all, 0, st->max_len * sizeof(*st->depth_all)); + memset(st->amp_dist, 0, st->max_amp * sizeof(*st->amp_dist)); +} + +static void amp_stats_reset(amplicons_t *amps, int nref) { + int i; + for (i = 0; i < nref; i++) { + if (!amps[i].sites) + continue; + stats_reset(amps[i].lstats); + } +} + +static int accumulate_stats(astats_args_t *args, amplicons_t *amps, + bam1_t *b) { + int ref = b->core.tid; + amplicon_t *amp = amps[ref].amp; + astats_t *stats = amps[ref].lstats; + int len = amps[ref].len; + + if (!stats) + return 0; + + stats->nseq++; + if ((b->core.flag & args->flag_require) != args->flag_require || + (b->core.flag & args->flag_filter) != 0) { + stats->nfiltered++; + return 0; + } + + int64_t start = b->core.pos, mstart = start; // modified start + int64_t end = bam_endpos(b), i; + + // Compute all-template-depth and valid-template-depth. + // We track current end location per read name so we can remove overlaps. + // Potentially we could use this data for a better amplicon-depth + // count too, but for now it's purely for the per-base plots. + int ret; + khiter_t k; + int prev_start = 0, prev_end = 0; + if ((b->core.flag & BAM_FPAIRED) + && !(b->core.flag & (BAM_FSUPPLEMENTARY | BAM_FSECONDARY))) { + k = kh_put(qname, stats->qend, bam_get_qname(b), &ret); + if (ret == 0) { + prev_start = kh_value(stats->qend, k) & 0xffffffff; + prev_end = kh_value(stats->qend, k)>>32; + mstart = MAX(mstart, prev_end); + // Ideally we'd reuse strings so we don't thrash free/malloc. + // However let's see if the official way of doing that (malloc + // itself) is fast enough first. + free((void *)kh_key(stats->qend, k)); + kh_del(qname, stats->qend, k); + //fprintf(stderr, "remove overlap %d to %d\n", (int)start, (int)mstart); + } else { + if (!(kh_key(stats->qend, k) = strdup(bam_get_qname(b)))) + return -1; + + kh_value(stats->qend, k) = start | (end << 32); + } + } + for (i = mstart; i < end && i < len; i++) + stats->depth_all[i]++; + if (i < end) { + print_error("ampliconstats", "record %s overhangs end of reference", + bam_get_qname(b)); + // But keep going, as it's harmless. + } + + // On single ended runs, eg ONT or PacBio, we just use the start/end + // of the template to assign. + int anum = (b->core.flag & BAM_FREVERSE) || !(b->core.flag & BAM_FPAIRED) + ? (end-1 >= 0 && end-1 < len ? pos2end[end-1] : -1) + : (start >= 0 && start < len ? pos2start[start] : -1); + + // ivar sometimes soft-clips 100% of the bases. + // This is essentially unmapped + if (end == start && (args->flag_filter & BAM_FUNMAP)) { + stats->nfiltered++; + return 0; + } + + if (anum == -1) + stats->nfailprimer++; + + if (anum >= 0) { + int64_t c = MIN(end,amp[anum].min_right+1) - MAX(start,amp[anum].max_left); + if (c > 0) { + stats->nreads[anum]++; + // NB: ref bases rather than read bases + stats->nbases[anum] += c; + + int64_t i; + if (start < 0) start = 0; + if (end > len) end = len; + + int64_t ostart = MAX(start, amp[anum].min_left-1); + int64_t oend = MIN(end, amp[anum].max_right); + int64_t offset = amp[anum].min_left-1; + for (i = ostart; i < oend; i++) + stats->coverage[anum*stats->max_amp_len + i-offset]++; + } else { + stats->nfailprimer++; + } + } + + // Template length in terms of amplicon number to amplicon number. + // We expect left to right of same amplicon (len 0), but it may go + // to next amplicon (len 1) or prev (len -1), etc. + int64_t t_end; + int oth_anum = -1; + + if (b->core.flag & BAM_FPAIRED) { + t_end = (b->core.flag & BAM_FREVERSE ? end : start) + + b->core.isize; + + // If we've clipped the primers but not followed up with a fixmates + // then our start+TLEN will take us to a location which is + // length(LEFT_PRIMER) + length(RIGHT_PRIMER) too far away. + // + // The correct solution is to run samtools fixmate so TLEN is correct. + // The hacky solution is to fudge the expected tlen by double the + // average primer length (e.g. 50). + t_end += b->core.isize > 0 ? -args->tlen_adj : +args->tlen_adj; + + if (t_end > 0 && t_end < len && b->core.isize != 0) + oth_anum = (b->core.flag & BAM_FREVERSE) + ? pos2start[t_end] + : pos2end[t_end]; + } else { + // Not paired (see int anum = (REV || !PAIR) ?en :st expr above) + oth_anum = pos2start[start]; + t_end = end; + } + + // We don't want to count our pairs twice. + // If both left/right are known, count it on left only. + // If only one is known, we'll only get to this code once + // so we can also count it. + int astatus = 2; + if (anum != -1 && oth_anum != -1) { + astatus = oth_anum == anum ? 0 : 1; + if (start <= t_end) + stats->amp_dist[anum][astatus]++; + } else if (anum >= 0) { + stats->amp_dist[anum][astatus = 2]++; + } + + if (astatus == 0 && !(b->core.flag & (BAM_FUNMAP | BAM_FMUNMAP))) { + if (prev_end && mstart > prev_end) { + // 2nd read with gap to 1st; undo previous increment. + for (i = prev_start; i < prev_end; i++) + stats->depth_valid[i]--; + stats->nfull_reads[anum] -= (b->core.flag & BAM_FPAIRED) ? 0.5 : 1; + } else { + // 1st read, or 2nd read that overlaps 1st + for (i = mstart; i < end; i++) + stats->depth_valid[i]++; + stats->nfull_reads[anum] += (b->core.flag & BAM_FPAIRED) ? 0.5 : 1; + } + } + + // Track template start,end frequencies, so we can give stats on + // amplicon primer usage. + if ((b->core.flag & BAM_FPAIRED) && b->core.isize <= 0) + // left to right only, so we don't double count template positions. + return 0; + + start = b->core.pos; + t_end = b->core.flag & BAM_FPAIRED + ? start + b->core.isize-1 + : end; + uint64_t tcoord = MIN(start+1, UINT32_MAX) | (MIN(t_end+1, UINT32_MAX)<<32); + k = kh_put(tcoord, stats->tcoord[anum+1], tcoord, &ret); + if (ret < 0) + return -1; + if (ret == 0) + kh_value(stats->tcoord[anum+1], k)++; + else + kh_value(stats->tcoord[anum+1], k)=1; + kh_value(stats->tcoord[anum+1], k) |= ((int64_t)astatus<<32); + + return 0; +} + +// Append file local stats to global stats +int append_lstats(astats_t *lstats, astats_t *gstats, int namp, int all_nseq) { + gstats->nseq += lstats->nseq; + gstats->nfiltered += lstats->nfiltered; + gstats->nfailprimer += lstats->nfailprimer; + + int a; + for (a = -1; a < namp; a++) { + // Add khash local (kl) to khash global (kg) + khiter_t kl, kg; + for (kl = kh_begin(lstats->tcoord[a+1]); + kl != kh_end(lstats->tcoord[a+1]); kl++) { + if (!kh_exist(lstats->tcoord[a+1], kl) || + kh_value(lstats->tcoord[a+1], kl) == 0) + continue; + + int ret; + kg = kh_put(tcoord, gstats->tcoord[a+1], + kh_key(lstats->tcoord[a+1], kl), + &ret); + if (ret < 0) + return -1; + + kh_value(gstats->tcoord[a+1], kg) = + (ret == 0 + ? (kh_value(gstats->tcoord[a+1], kg) & 0xFFFFFFFF) + : 0) + + kh_value(lstats->tcoord[a+1], kl); + } + if (a == -1) continue; + + gstats->nreads[a] += lstats->nreads[a]; + gstats->nreads2[a] += lstats->nreads[a] * lstats->nreads[a]; + gstats->nfull_reads[a] += lstats->nfull_reads[a]; + + // To get mean & sd for amplicon read percentage, we need + // to do the divisions here as nseq differs for each sample. + double nrperc = all_nseq ? 100.0 * lstats->nreads[a] / all_nseq : 0; + gstats->nrperc[a] += nrperc; + gstats->nrperc2[a] += nrperc*nrperc; + + gstats->nbases[a] += lstats->nbases[a]; + gstats->nbases2[a] += lstats->nbases[a] * lstats->nbases[a]; + + int d; + for (d = 0; d < MAX_DEPTH; d++) { + gstats->covered_perc[a][d] += lstats->covered_perc[a][d]; + gstats->covered_perc2[a][d] += lstats->covered_perc[a][d] + * lstats->covered_perc[a][d]; + } + + for (d = 0; d < 3; d++) + gstats->amp_dist[a][d] += lstats->amp_dist[a][d]; + } + + for (a = 0; a < lstats->max_len; a++) { + gstats->depth_valid[a] += lstats->depth_valid[a]; + gstats->depth_all[a] += lstats->depth_all[a]; + } + + return 0; +} + +int append_stats(amplicons_t *amps, int nref) { + int i, r, all_nseq = 0; + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = amps[r].lstats; + all_nseq += stats->nseq - stats->nfiltered - stats->nfailprimer; + } + + for (i = 0; i < nref; i++) { + if (!amps[i].sites) + continue; + if (append_lstats(amps[i].lstats, amps[i].gstats, amps[i].namp, + all_nseq) < 0) + return -1; + } + + return 0; +} + +typedef struct { + int32_t start, end; + uint32_t freq; + uint32_t status; +} tcoord_t; + +// Sort tcoord by descending frequency and then ascending start and end. +static int tcoord_freq_sort(const void *vp1, const void *vp2) { + const tcoord_t *t1 = (const tcoord_t *)vp1; + const tcoord_t *t2 = (const tcoord_t *)vp2; + + if (t1->freq != t2->freq) + return t2->freq - t1->freq; + + if (t1->start != t2->start) + return t1->start - t2->start; + + return t1->end - t2->end; +} + + +/* + * Merges tcoord start,end,freq,status tuples if their coordinates are + * close together. We aim to keep the start,end for the most frequent + * value and assume that is the correct coordinate and all others are + * minor fluctuations due to errors or variants. + * + * We sort by frequency first and then merge later items in the list into + * the earlier more frequent ones. It's O(N^2), but sufficient for now + * given current scale of projects. + * + * If we ever need to resolve that then consider sorting by start + * coordinate and scanning the list to find all items within X, find + * the most frequent of those, and then cluster that way. (I'd have + * done that had I thought of it at the time!) + */ +static void aggregate_tcoord(astats_args_t *args, tcoord_t *tpos, size_t *np){ + size_t n = *np, j, j2, j3, k; + + // Sort by frequency and cluster infrequent coords into frequent + // ones provided they're close by. + // This is O(N^2), but we've already binned by tcoord_bin/2 so + // the list isn't intended to be vast at this point. + qsort(tpos, n, sizeof(*tpos), tcoord_freq_sort); + + // For frequency ties, find mid start coord, and then find mid end + // coord of those matching start. + // We make that the first item so we merge into that mid point. + for (j = 0; j < n; j++) { + for (j2 = j+1; j2 < n; j2++) { + if (tpos[j].freq != tpos[j2].freq) + break; + if (tpos[j2].start - tpos[j].start >= args->tcoord_bin) + break; + } + + // j to j2 all within bin of a common start, + // m is the mid start. + if (j2-1 > j) { + size_t m = (j2-1 + j)/2; + + // Find mid end for this same start + while (m > 1 && tpos[m].start == tpos[m-1].start) + m--; + for (j3 = m+1; j3 < j2; j3++) { + if (tpos[m].start != tpos[j3].start) + break; + if (tpos[m].end - tpos[j3].end >= args->tcoord_bin) + break; + } + if (j3-1 > m) + m = (j3-1 + m)/2; + + // Swap with first item. + tcoord_t tmp = tpos[j]; + tpos[j] = tpos[m]; + tpos[m] = tmp; + j = j2-1; + } + } + + // Now merge in coordinates. + // This bit is O(N^2), so consider binning first to reduce the + // size of the list if we have excessive positional variation. + for (k = j = 0; j < n; j++) { + if (!tpos[j].freq) + continue; + + if (k < j) + tpos[k] = tpos[j]; + + for (j2 = j+1; j2 < n; j2++) { + if (ABS(tpos[j].start-tpos[j2].start) < args->tcoord_bin/2 && + ABS(tpos[j].end -tpos[j2].end) < args->tcoord_bin/2 && + tpos[j].status == tpos[j2].status) { + tpos[k].freq += tpos[j2].freq; + tpos[j2].freq = 0; + } + } + k++; + } + + *np = k; +} + +int dump_stats(astats_args_t *args, char type, char *name, int nfile, + amplicons_t *amps, int nref, int local) { + int i, r; + FILE *ofp = args->out_fp; + tcoord_t *tpos = NULL; + size_t ntcoord = 0; + + // summary stats for this sample (or for all samples) + fprintf(ofp, "# Summary stats.\n"); + fprintf(ofp, "# Use 'grep ^%cSS | cut -f 2-' to extract this part.\n", type); + + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + int nmatch = stats->nseq - stats->nfiltered - stats->nfailprimer; + char *name_ref = malloc(strlen(name) + strlen(amps[r].ref) + 2); + if (!name_ref) + return -1; + if (args->multi_ref) + sprintf(name_ref, "%s\t%s", name, amps[r].ref); + else + sprintf(name_ref, "%s", name); + fprintf(ofp, "%cSS\t%s\traw total sequences:\t%d\n", + type, name_ref, stats->nseq); + fprintf(ofp, "%cSS\t%s\tfiltered sequences:\t%d\n", + type, name_ref, stats->nfiltered); + fprintf(ofp, "%cSS\t%s\tfailed primer match:\t%d\n", + type, name_ref, stats->nfailprimer); + fprintf(ofp, "%cSS\t%s\tmatching sequences:\t%d\n", + type, name_ref, nmatch); + + int d = 0; + do { + // From first to last amplicon only, so not entire consensus. + // If contig length is known, maybe we want to add the missing + // count to < DEPTH figures? + int64_t start = 0, covered = 0, total = 0; + amplicon_t *amp = amps[r].amp; + for (i = 0; i < amps[r].namp; i++) { + int64_t j, offset = amp[i].min_left-1; + if (amp[i].min_right - amp[i].min_left > stats->max_amp_len) { + fprintf(stderr, "[ampliconstats] error: " + "Maximum amplicon length (%d) exceeded for '%s'\n", + stats->max_amp, name); + return -1; + } + for (j = MAX(start, amp[i].max_left-1); + j < MAX(start, amp[i].min_right); j++) { + if (stats->coverage[i*stats->max_amp_len + j-offset] + >= args->min_depth[d]) + covered++; + total++; + } + start = MAX(start, amp[i].min_right); + } + fprintf(ofp, "%cSS\t%s\tconsensus depth count < %d and >= %d:\t%" + PRId64"\t%"PRId64"\n", type, name_ref, + args->min_depth[d], args->min_depth[d], + total-covered, covered); + } while (++d < MAX_DEPTH && args->min_depth[d]); + + free(name_ref); + } + + // Read count + fprintf(ofp, "# Absolute matching read counts per amplicon.\n"); + fprintf(ofp, "# Use 'grep ^%cREADS | cut -f 2-' to extract this part.\n", type); + fprintf(ofp, "%cREADS\t%s", type, name); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + fprintf(ofp, "\t%"PRId64, stats->nreads[i]); + } + } + fprintf(ofp, "\n"); + + // Valid depth is the number of full length reads (already divided + // by the number we expect to cover), so +0.5 per read in pair. + // A.k.a "usable depth" in the plots. + fprintf(ofp, "%cVDEPTH\t%s", type, name); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) + fprintf(ofp, "\t%d", (int)stats->nfull_reads[i]); + } + fprintf(ofp, "\n"); + + if (type == 'C') { + // For combined we can compute mean & standard deviation too + fprintf(ofp, "CREADS\tMEAN"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + fprintf(ofp, "\t%.1f", stats->nreads[i] / (double)nfile); + } + } + fprintf(ofp, "\n"); + + fprintf(ofp, "CREADS\tSTDDEV"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + double n1 = stats->nreads[i]; + fprintf(ofp, "\t%.1f", nfile > 1 && stats->nreads2[i] > 0 + ? sqrt(stats->nreads2[i]/(double)nfile + - (n1/nfile)*(n1/nfile)) + : 0); + } + } + fprintf(ofp, "\n"); + } + + fprintf(ofp, "# Read percentage of distribution between amplicons.\n"); + fprintf(ofp, "# Use 'grep ^%cRPERC | cut -f 2-' to extract this part.\n", type); + fprintf(ofp, "%cRPERC\t%s", type, name); + int all_nseq = 0; + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + all_nseq += stats->nseq - stats->nfiltered - stats->nfailprimer; + } + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + if (type == 'C') { + fprintf(ofp, "\t%.3f", (double)stats->nrperc[i] / nfile); + } else { + fprintf(ofp, "\t%.3f", + all_nseq ? 100.0 * stats->nreads[i] / all_nseq : 0); + } + } + } + fprintf(ofp, "\n"); + + if (type == 'C') { + // For combined we compute mean and standard deviation too + fprintf(ofp, "CRPERC\tMEAN"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + fprintf(ofp, "\t%.3f", stats->nrperc[i] / nfile); + } + } + fprintf(ofp, "\n"); + + fprintf(ofp, "CRPERC\tSTDDEV"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + // variance = SUM(X^2) - ((SUM(X)^2) / N) + double n1 = stats->nrperc[i]; + double v = stats->nrperc2[i]/nfile - (n1/nfile)*(n1/nfile); + fprintf(ofp, "\t%.3f", v>0?sqrt(v):0); + } + } + fprintf(ofp, "\n"); + } + + // Base depth + fprintf(ofp, "# Read depth per amplicon.\n"); + fprintf(ofp, "# Use 'grep ^%cDEPTH | cut -f 2-' to extract this part.\n", type); + fprintf(ofp, "%cDEPTH\t%s", type, name); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + amplicon_t *amp = amps[r].amp; + for (i = 0; i < amps[r].namp; i++) { + int nseq = stats->nseq - stats->nfiltered - stats->nfailprimer; + int64_t alen = amp[i].min_right - amp[i].max_left+1; + fprintf(ofp, "\t%.1f", nseq ? stats->nbases[i] / (double)alen : 0); + } + } + fprintf(ofp, "\n"); + + if (type == 'C') { + // For combined we can compute mean & standard deviation too + fprintf(ofp, "CDEPTH\tMEAN"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + amplicon_t *amp = amps[r].amp; + int nseq = stats->nseq - stats->nfiltered - stats->nfailprimer; + for (i = 0; i < amps[r].namp; i++) { + int64_t alen = amp[i].min_right - amp[i].max_left+1; + fprintf(ofp, "\t%.1f", nseq ? stats->nbases[i] / (double)alen / nfile : 0); + } + } + fprintf(ofp, "\n"); + + fprintf(ofp, "CDEPTH\tSTDDEV"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + amplicon_t *amp = amps[r].amp; + for (i = 0; i < amps[r].namp; i++) { + double alen = amp[i].min_right - amp[i].max_left+1; + double n1 = stats->nbases[i] / alen; + double v = stats->nbases2[i] / (alen*alen) /nfile + - (n1/nfile)*(n1/nfile); + fprintf(ofp, "\t%.1f", v>0?sqrt(v):0); + } + } + fprintf(ofp, "\n"); + } + + // Percent Coverage + if (type == 'F') { + fprintf(ofp, "# Percentage coverage per amplicon\n"); + fprintf(ofp, "# Use 'grep ^%cPCOV | cut -f 2-' to extract this part.\n", type); + int d = 0; + do { + fprintf(ofp, "%cPCOV-%d\t%s", type, args->min_depth[d], name); + + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + amplicon_t *amp = amps[r].amp; + for (i = 0; i < amps[r].namp; i++) { + int covered = 0; + if (amp[i].min_right - amp[i].min_left > stats->max_amp_len) { + fprintf(stderr, "[ampliconstats] error: " + "Maximum amplicon length (%d) exceeded for '%s'\n", + stats->max_amp, name); + return -1; + } + int64_t j, offset = amp[i].min_left-1; + for (j = amp[i].max_left-1; j < amp[i].min_right; j++) { + int apos = i*stats->max_amp_len + j-offset; + if (stats->coverage[apos] >= args->min_depth[d]) + covered++; + } + int64_t alen = amp[i].min_right - amp[i].max_left+1; + stats->covered_perc[i][d] = 100.0 * covered / alen; + fprintf(ofp, "\t%.2f", 100.0 * covered / alen); + } + } + fprintf(ofp, "\n"); + } while (++d < MAX_DEPTH && args->min_depth[d]); + + } else if (type == 'C') { + // For combined we can compute mean & standard deviation too + int d = 0; + do { + fprintf(ofp, "CPCOV-%d\tMEAN", args->min_depth[d]); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + fprintf(ofp, "\t%.1f", stats->covered_perc[i][d] / nfile); + } + } + fprintf(ofp, "\n"); + + fprintf(ofp, "CPCOV-%d\tSTDDEV", args->min_depth[d]); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + double n1 = stats->covered_perc[i][d] / nfile; + double v = stats->covered_perc2[i][d] / nfile - n1*n1; + fprintf(ofp, "\t%.1f", v>0?sqrt(v):0); + } + } + fprintf(ofp, "\n"); + } while (++d < MAX_DEPTH && args->min_depth[d]); + } + + // Plus base depth for all reads, irrespective of amplicon. + // This is post overlap removal, if reads in the read-pair overlap. + fprintf(ofp, "# Depth per reference base for ALL data.\n"); + fprintf(ofp, "# Use 'grep ^%cDP_ALL | cut -f 2-' to extract this part.\n", + type); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + if (args->multi_ref) + fprintf(ofp, "%cDP_ALL\t%s\t%s", type, name, amps[r].ref); + else + fprintf(ofp, "%cDP_ALL\t%s", type, name); + + for (i = 0; i < amps[r].len; i++) { + // Basic run-length encoding provided all values are within + // +- depth_bin fraction of the mid-point. + int dmin = stats->depth_all[i], dmax = stats->depth_all[i], j; + double dmid = (dmin + dmax)/2.0; + double low = dmid*(1-args->depth_bin); + double high = dmid*(1+args->depth_bin); + for (j = i+1; j < amps[r].len; j++) { + int d = stats->depth_all[j]; + if (d < low || d > high) + break; + if (dmin > d) { + dmin = d; + dmid = (dmin + dmax)/2.0; + low = dmid*(1-args->depth_bin); + high = dmid*(1+args->depth_bin); + } else if (dmax < d) { + dmax = d; + dmid = (dmin + dmax)/2.0; + low = dmid*(1-args->depth_bin); + high = dmid*(1+args->depth_bin); + } + } + fprintf(ofp, "\t%d,%d", (int)dmid, j-i); + i = j-1; + } + fprintf(ofp, "\n"); + } + + // And depth for only reads matching to a single amplicon for full + // length. This is post read overlap removal. + fprintf(ofp, "# Depth per reference base for full-length valid amplicon data.\n"); + fprintf(ofp, "# Use 'grep ^%cDP_VALID | cut -f 2-' to extract this " + "part.\n", type); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + if (args->multi_ref) + fprintf(ofp, "%cDP_VALID\t%s\t%s", type, name, amps[r].ref); + else + fprintf(ofp, "%cDP_VALID\t%s", type, name); + + for (i = 0; i < amps[r].len; i++) { + int dmin = stats->depth_valid[i], dmax = stats->depth_valid[i], j; + double dmid = (dmin + dmax)/2.0; + double low = dmid*(1-args->depth_bin); + double high = dmid*(1+args->depth_bin); + for (j = i+1; j < amps[r].len; j++) { + int d = stats->depth_valid[j]; + if (d < low || d > high) + break; + if (dmin > d) { + dmin = d; + dmid = (dmin + dmax)/2.0; + low = dmid*(1-args->depth_bin); + high = dmid*(1+args->depth_bin); + } else if (dmax < d) { + dmax = d; + dmid = (dmin + dmax)/2.0; + low = dmid*(1-args->depth_bin); + high = dmid*(1+args->depth_bin); + } + } + fprintf(ofp, "\t%d,%d", (int)dmid, j-i); + i = j-1; + } + fprintf(ofp, "\n"); + } + + // TCOORD (start to end) distribution + fprintf(ofp, "# Distribution of aligned template coordinates.\n"); + fprintf(ofp, "# Use 'grep ^%cTCOORD | cut -f 2-' to extract this part.\n", type); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0 - (nref==1); i < amps[r].namp; i++) { + if (ntcoord < kh_size(stats->tcoord[i+1])) { + ntcoord = kh_size(stats->tcoord[i+1]); + tcoord_t *tmp = realloc(tpos, ntcoord * sizeof(*tmp)); + if (!tmp) { + free(tpos); + return -1; + } + tpos = tmp; + } + + khiter_t k; + size_t n = 0, j; + for (k = kh_begin(stats->tcoord[i+1]); + k != kh_end(stats->tcoord[i+1]); k++) { + if (!kh_exist(stats->tcoord[i+1], k) || + (kh_value(stats->tcoord[i+1], k) & 0xFFFFFFFF) == 0) + continue; + // Key is start,end in 32-bit quantities. + // Yes this limits us to 4Gb references, but just how + // many primers are we planning on making? Not that many + // I hope. + tpos[n].start = kh_key(stats->tcoord[i+1], k)&0xffffffff; + tpos[n].end = kh_key(stats->tcoord[i+1], k)>>32; + + // Value is frequency (top 32-bits) and status (bottom 32). + tpos[n].freq = kh_value(stats->tcoord[i+1], k)&0xffffffff; + tpos[n].status = kh_value(stats->tcoord[i+1], k)>>32; + n++; + } + + if (args->tcoord_bin > 1) + aggregate_tcoord(args, tpos, &n); + + fprintf(ofp, "%cTCOORD\t%s\t%d", type, name, + i+1+amps[r].first_amp); // per amplicon + for (j = 0; j < n; j++) { + if (tpos[j].freq < args->tcoord_min_count) + continue; + fprintf(ofp, "\t%d,%d,%u,%u", + tpos[j].start, + tpos[j].end, + tpos[j].freq, + tpos[j].status); + } + fprintf(ofp, "\n"); + } + } + + + // AMP length distribution. + // 0 = both ends in this amplicon + // 1 = ends in different amplicons + // 2 = other end matching an unknown amplicon site + // (see tcoord for further analysis of where) + fprintf(ofp, "# Classification of amplicon status. Columns are\n"); + fprintf(ofp, "# number with both primers from this amplicon, number with\n"); + fprintf(ofp, "# primers from different amplicon, and number with a position\n"); + fprintf(ofp, "# not matching any valid amplicon primer site\n"); + fprintf(ofp, "# Use 'grep ^%cAMP | cut -f 2-' to extract this part.\n", type); + + fprintf(ofp, "%cAMP\t%s\t0", type, name); // all merged + int amp_dist[3] = {0}; + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { // accumulate for all amps + amp_dist[0] += stats->amp_dist[i][0]; + amp_dist[1] += stats->amp_dist[i][1]; + amp_dist[2] += stats->amp_dist[i][2]; + } + } + fprintf(ofp, "\t%d\t%d\t%d\n", amp_dist[0], amp_dist[1], amp_dist[2]); + + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + // per amplicon + fprintf(ofp, "%cAMP\t%s\t%d", type, name, i+1+amps[r].first_amp); + fprintf(ofp, "\t%d\t%d\t%d\n", stats->amp_dist[i][0], + stats->amp_dist[i][1], stats->amp_dist[i][2]); + } + } + + free(tpos); + return 0; +} + +int dump_lstats(astats_args_t *args, char type, char *name, int nfile, + amplicons_t *amps, int nref) { + return dump_stats(args, type, name, nfile, amps, nref, 1); +} + +int dump_gstats(astats_args_t *args, char type, char *name, int nfile, + amplicons_t *amps, int nref) { + return dump_stats(args, type, name, nfile, amps, nref, 0); +} + +char const *get_sample_name(sam_hdr_t *header, char *RG) { + kstring_t ks = {0}; + sam_hdr_find_tag_id(header, "RG", RG?"ID":NULL, RG, "SM", &ks); + return ks.s; +} + +// Return maximum reference length (SQ is NULL) or the length +// of the specified reference in SQ. +int64_t get_ref_len(sam_hdr_t *header, const char *SQ) { + if (SQ) { + int tid = SQ ? sam_hdr_name2tid(header, SQ) : 0; + return tid >= 0 ? sam_hdr_tid2len(header, tid) : -1; + } else { + int nref = sam_hdr_nref(header), tid;; + int64_t len = 0; + for (tid = 0; tid < nref; tid++) { + int64_t rl = sam_hdr_tid2len(header, tid); + if (len < rl) + len = rl; + } + return len; + } +} + +static int amplicon_stats(astats_args_t *args, + khash_t(bed_list_hash) *bed_hash, + char **filev, int filec) { + int i, ref = -1, ref_tid = -1, ret = -1, nref = 0; + samFile *fp = NULL; + sam_hdr_t *header = NULL; + bam1_t *b = bam_init1(); + FILE *ofp = args->out_fp; + char sname_[8192], *sname = NULL; + amplicons_t *amps = NULL; + + // Report initial SS header. We gather data from the bed_hash entries + // as well as from the first SAM header (with the requirement that all + // headers should be compatible). + if (filec) { + if (!(fp = sam_open_format(filev[0], "r", &args->ga.in))) { + print_error_errno("ampliconstats", + "Cannot open input file \"%s\"", + filev[0]); + goto err; + } + if (!(header = sam_hdr_read(fp))) + goto err; + + if (!amps) { + amps = calloc(nref=sam_hdr_nref(header), sizeof(*amps)); + if (!amps) + goto err; + fprintf(ofp, "# Summary statistics, used for scaling the plots.\n"); + fprintf(ofp, "SS\tSamtools version: %s\n", samtools_version()); + fprintf(ofp, "SS\tCommand line: %s\n", args->argv); + fprintf(ofp, "SS\tNumber of files:\t%d\n", filec); + + // Note: order of hash entries will be different to order of + // BED file which may also differ to order of SQ headers. + // SQ header is canonical ordering (pos sorted file). + khiter_t k; + int bam_nref = sam_hdr_nref(header); + for (i = 0; i < bam_nref; i++) { + k = kh_get(bed_list_hash, bed_hash, + sam_hdr_tid2name(header, i)); + if (!kh_exist(bed_hash, k)) + continue; + + bed_entry_list_t *sites = &kh_value(bed_hash, k); + + ref = i; + amps[ref].ref = kh_key(bed_hash, k); + amps[ref].sites = sites; + amps[ref].namp = count_amplicon(sites); + amps[ref].amp = calloc(sites->length, + sizeof(*amps[ref].amp)); + if (!amps[ref].amp) + goto err; + if (args->multi_ref) + fprintf(ofp, "SS\tNumber of amplicons:\t%s\t%d\n", + kh_key(bed_hash, k), amps[ref].namp); + else + fprintf(ofp, "SS\tNumber of amplicons:\t%d\n", + amps[ref].namp); + + amps[ref].tid = ref; + if (ref_tid == -1) + ref_tid = ref; + + int64_t len = get_ref_len(header, kh_key(bed_hash, k)); + amps[ref].len = len; + if (args->multi_ref) + fprintf(ofp, "SS\tReference length:\t%s\t%"PRId64"\n", + kh_key(bed_hash, k), len); + else + fprintf(ofp, "SS\tReference length:\t%"PRId64"\n", + len); + + amps[ref].lstats = stats_alloc(len, args->max_amp, + args->max_amp_len); + amps[ref].gstats = stats_alloc(len, args->max_amp, + args->max_amp_len); + if (!amps[ref].lstats || !amps[ref].gstats) + goto err; + } + } + + sam_hdr_destroy(header); + header = NULL; + if (sam_close(fp) < 0) { + fp = NULL; + goto err; + } + fp = NULL; + } + fprintf(ofp, "SS\tEnd of summary\n"); + + // Extract the bits of amplicon data we need from bed hash and turn + // it into a position-to-amplicon lookup table. + int offset = 0; + for (i = 0; i < nref; i++) { + if (!amps[i].sites) + continue; + + amps[i].first_amp = offset; + if (bed2amplicon(args, amps[i].sites, amps[i].amp, + &s[i].namp, i==0, amps[i].ref, offset) < 0) + goto err; + + offset += amps[i].namp; // cumulative amplicon number across refs + } + + // Now iterate over file contents, one at a time. + for (i = 0; i < filec; i++) { + char *nstart = filev[i]; + + fp = sam_open_format(filev[i], "r", &args->ga.in); + if (!fp) { + print_error_errno("ampliconstats", + "Cannot open input file \"%s\"", + filev[i]); + goto err; + } + + if (args->ga.nthreads > 0) + hts_set_threads(fp, args->ga.nthreads); + + if (!(header = sam_hdr_read(fp))) + goto err; + + if (nref != sam_hdr_nref(header)) { + print_error_errno("ampliconstats", + "SAM headers are not consistent across input files"); + goto err; + } + int r; + for (r = 0; r < nref; r++) { + if (!amps[r].ref || + strcmp(amps[r].ref, sam_hdr_tid2name(header, r)) != 0 || + amps[r].len != sam_hdr_tid2len(header, r)) { + print_error_errno("ampliconstats", + "SAM headers are not consistent across " + "input files"); + goto err; + } + } + + if (args->use_sample_name) + sname = (char *)get_sample_name(header, NULL); + + if (!sname) { + sname = sname_; + char *nend = filev[i] + strlen(filev[i]), *cp; + if ((cp = strrchr(filev[i], '/'))) + nstart = cp+1; + if ((cp = strrchr(nstart, '.')) && + (strcmp(cp, ".bam") == 0 || + strcmp(cp, ".sam") == 0 || + strcmp(cp, ".cram") == 0)) + nend = cp; + if (nend - nstart >= 8192) nend = nstart+8191; + memcpy(sname, nstart, nend-nstart); + sname[nend-nstart] = 0; + } + + // Stats local to this sample only + amp_stats_reset(amps, nref); + + int last_ref = -9; + while ((r = sam_read1(fp, header, b)) >= 0) { + // Other filter options useful here? + if (b->core.tid < 0) + continue; + + if (last_ref != b->core.tid) { + last_ref = b->core.tid; + if (initialise_amp_pos_lookup(args, amps, last_ref) < 0) + goto err; + } + + if (accumulate_stats(args, amps, b) < 0) + goto err; + } + + if (r < -1) { + print_error_errno("ampliconstats", "Fail reading record"); + goto err; + } + + sam_hdr_destroy(header); + if (sam_close(fp) < 0) { + fp = NULL; + goto err; + } + + fp = NULL; + header = NULL; + + if (dump_lstats(args, 'F', sname, filec, amps, nref) < 0) + goto err; + + if (append_stats(amps, nref) < 0) + goto err; + + if (sname && sname != sname_) + free(sname); + sname = NULL; + } + + if (dump_gstats(args, 'C', "COMBINED", filec, amps, nref) < 0) + goto err; + + ret = 0; + err: + bam_destroy1(b); + if (ret) { + if (header) + sam_hdr_destroy(header); + if (fp) + sam_close(fp); + } + for (i = 0; i < nref; i++) { + stats_free(amps[i].lstats); + stats_free(amps[i].gstats); + free(amps[i].amp); + } + free(amps); + free(pos2start); + free(pos2end); + if (ret) { + if (sname && sname != sname_) + free(sname); + } + + return ret; +} + +static int usage(astats_args_t *args, FILE *fp, int exit_status) { + fprintf(fp, +"\n" +"Usage: samtools ampliconstats [options] primers.bed *.bam > astats.txt\n" +"\n" +"Options:\n"); + fprintf(fp, " -f, --required-flag STR|INT\n" + " Only include reads with all of the FLAGs present [0x%X]\n",args->flag_require); + fprintf(fp, " -F, --filter-flag STR|INT\n" + " Only include reads with none of the FLAGs present [0x%X]\n",args->flag_filter & 0xffff); + fprintf(fp, " -a, --max-amplicons INT\n" + " Change the maximum number of amplicons permitted [%d]\n", MAX_AMP); + fprintf(fp, " -l, --max-amplicon-length INT\n" + " Change the maximum length of an individual amplicon [%d]\n", MAX_AMP_LEN); + fprintf(fp, " -d, --min-depth INT[,INT]...\n" + " Minimum base depth(s) to consider position covered [%d]\n", args->min_depth[0]); + fprintf(fp, " -m, --pos-margin INT\n" + " Margin of error for matching primer positions [%d]\n", args->max_delta); + fprintf(fp, " -o, --output FILE\n" + " Specify output file [stdout if unset]\n"); + fprintf(fp, " -s, --use-sample-name\n" + " Use the sample name from the first @RG header line\n"); + fprintf(fp, " -t, --tlen-adjust INT\n" + " Add/subtract from TLEN; use when clipping but no fixmate step\n"); + fprintf(fp, " -b, --tcoord-bin INT\n" + " Bin template start,end positions into multiples of INT[1]\n"); + fprintf(fp, " -c, --tcoord-min-count INT\n" + " Minimum template start,end frequency for recording [%d]\n", TCOORD_MIN_COUNT); + fprintf(fp, " -D, --depth-bin FRACTION\n" + " Merge FDP values within +/- FRACTION together\n"); + fprintf(fp, " -S, --single-ref\n" + " Force single-ref (<=1.12) output format\n"); + sam_global_opt_help(fp, "I.--.@"); + + return exit_status; +} + +int main_ampliconstats(int argc, char **argv) { + astats_args_t args = { + .ga = SAM_GLOBAL_ARGS_INIT, + .flag_require = 0, + .flag_filter = 0x10B04, + //.sites = BED_LIST_INIT, + .max_delta = 30, // large enough to cope with alt primers + .min_depth = {1}, + .use_sample_name = 0, + .max_amp = MAX_AMP, + .max_amp_len = MAX_AMP_LEN, + .tlen_adj = 0, + .out_fp = stdout, + .tcoord_min_count = TCOORD_MIN_COUNT, + .tcoord_bin = 1, + .depth_bin = 0.01, + .multi_ref = 1 + }, oargs = args; + + static const struct option loptions[] = + { + SAM_OPT_GLOBAL_OPTIONS('I', 0, '-', '-', 0, '@'), + {"help", no_argument, NULL, 'h'}, + {"flag-require", required_argument, NULL, 'f'}, + {"flag-filter", required_argument, NULL, 'F'}, + {"min-depth", required_argument, NULL, 'd'}, + {"output", required_argument, NULL, 'o'}, + {"pos-margin", required_argument, NULL, 'm'}, + {"use-sample-name", no_argument, NULL, 's'}, + {"max-amplicons", required_argument, NULL, 'a'}, + {"max-amplicon-length", required_argument, NULL, 'l'}, + {"tlen-adjust", required_argument, NULL, 't'}, + {"tcoord-min-count", required_argument, NULL, 'c'}, + {"tcoord-bin", required_argument, NULL, 'b'}, + {"depth-bin", required_argument, NULL, 'D'}, + {"single-ref", no_argument, NULL, 'S'}, + {NULL, 0, NULL, 0} + }; + int opt; + + while ( (opt=getopt_long(argc,argv,"?hf:F:@:p:m:d:sa:l:t:o:c:b:D:S",loptions,NULL))>0 ) { + switch (opt) { + case 'f': args.flag_require = bam_str2flag(optarg); break; + case 'F': + if (args.flag_filter & 0x10000) + args.flag_filter = 0; // strip default on first -F usage + args.flag_filter |= bam_str2flag(optarg); break; + + case 'm': args.max_delta = atoi(optarg); break; // margin + case 'D': args.depth_bin = atof(optarg); break; // depth bin fraction + case 'd': { + int d = 0; + char *cp = optarg, *ep; + do { + long n = strtol(cp, &ep, 10); + args.min_depth[d++] = n; + if (*ep != ',') + break; + cp = ep+1; + } while (d < MAX_DEPTH); + break; + } + + case 'a': args.max_amp = atoi(optarg)+1;break; + case 'l': args.max_amp_len = atoi(optarg)+1;break; + + case 'c': args.tcoord_min_count = atoi(optarg);break; + case 'b': + args.tcoord_bin = atoi(optarg); + if (args.tcoord_bin < 1) + args.tcoord_bin = 1; + break; + + case 't': args.tlen_adj = atoi(optarg);break; + + case 's': args.use_sample_name = 1;break; + + case 'o': + if (!(args.out_fp = fopen(optarg, "w"))) { + perror(optarg); + return 1; + } + break; + + case 'S': + args.multi_ref = 0; + break; + + case '?': return usage(&oargs, stderr, EXIT_FAILURE); + case 'h': return usage(&oargs, stdout, EXIT_SUCCESS); + + default: + if (parse_sam_global_opt(opt, optarg, loptions, &args.ga) != 0) + usage(&oargs,stderr, EXIT_FAILURE); + break; + } + } + + if (argc <= optind) + return usage(&oargs, stdout, EXIT_SUCCESS); + if (argc <= optind+1 && isatty(STDIN_FILENO)) + return usage(&oargs, stderr, EXIT_FAILURE); + + khash_t(bed_list_hash) *bed_hash = kh_init(bed_list_hash); + if (load_bed_file_multi_ref(argv[optind], 1, 0, bed_hash)) { + print_error_errno("ampliconstats", + "Could not read file \"%s\"", argv[optind]); + return 1; + + } + + khiter_t k, ref_count = 0; + for (k = kh_begin(bed_hash); k != kh_end(bed_hash); k++) { + if (!kh_exist(bed_hash, k)) + continue; + ref_count++; + } + if (ref_count == 0) + return 1; + if (ref_count > 1 && args.multi_ref == 0) { + print_error("ampliconstats", + "Single-ref mode is not permitted for BED files\n" + "containing more than one reference."); + return 1; + } + + args.argv = stringify_argv(argc, argv); + int ret; + if (argc == ++optind) { + char *av = "-"; + ret = amplicon_stats(&args, bed_hash, &av, 1); + } else { + ret = amplicon_stats(&args, bed_hash, &argv[optind], argc-optind); + } + + free(args.argv); + destroy_bed_hash(bed_hash); + + return ret; +} diff --git a/samtools/amplicon_stats.c.pysam.c b/samtools/amplicon_stats.c.pysam.c new file mode 100644 index 0000000..aa09459 --- /dev/null +++ b/samtools/amplicon_stats.c.pysam.c @@ -0,0 +1,1756 @@ +#include "samtools.pysam.h" + +/* stats.c -- This is the former bamcheck integrated into samtools/htslib. + + Copyright (C) 2020-2021 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* + * This tool is designed to give "samtools stats" style output, but dedicated + * to small amplicon sequencing projects. It gathers stats on the + * distribution of reads across amplicons. + */ + +/* + * TODO: + * - Cope with multiple references. What do we do here? Just request one? + * - Permit regions rather than consuming whole file (maybe solves above). + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "samtools.h" +#include "sam_opts.h" +#include "bam_ampliconclip.h" + +KHASH_MAP_INIT_INT64(tcoord, int64_t) +KHASH_MAP_INIT_STR(qname, int64_t) + +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + +#ifndef ABS +#define ABS(a) ((a)>=0?(a):-(a)) +#endif + +#define TCOORD_MIN_COUNT 10 +#define MAX_AMP 1000 // Default maximum number of amplicons +#define MAX_AMP_LEN 1000 // Default maximum length of any single amplicon +#define MAX_PRIMER_PER_AMPLICON 4 // Max primers per LEFT/RIGHT +#define MAX_DEPTH 5 // Number of different depths permitted + +typedef struct { + sam_global_args ga; + uint32_t flag_require; + uint32_t flag_filter; + int max_delta; // Used for matching read to amplicon primer loc + int min_depth[MAX_DEPTH]; // Used for coverage; must be >= min_depth deep + int use_sample_name; + int max_amp; // Total number of amplicons + int max_amp_len; // Maximum length of an individual amplicon + double depth_bin;// aggregate depth within this fraction + int tlen_adj; // Adjust tlen by this amount, due to clip but no fixmate + FILE *out_fp; + char *argv; + int tcoord_min_count; + int tcoord_bin; + int multi_ref; +} astats_args_t; + +typedef struct { + int nseq; // total sequence count + int nfiltered; // sequence filtered + int nfailprimer;// count of sequences not matching the primer locations + + // Sizes of memory allocated below, to permit reset + int max_amp, max_amp_len, max_len; + + // Summary across all samples, sum(x) plus sum(x^2) for s.d. calc + int64_t *nreads, *nreads2; // [max_amp] + double *nfull_reads; // [max_amp]; 0.5/read if paired. + double *nrperc, *nrperc2; // [max_amp] + int64_t *nbases, *nbases2; // [max_amp] + int64_t *coverage; // [max_amp][max_amp_len] + double (*covered_perc)[MAX_DEPTH]; // [max_amp][MAX_DEPTH] + double (*covered_perc2)[MAX_DEPTH];// [max_amp][MAX_DEPTH]; + khash_t(tcoord) **tcoord; // [max_amp+1] + + // 0 is correct pair, 1 is incorrect pair, 2 is unidentified + int (*amp_dist)[3]; // [MAX_AMP][3]; + + int *depth_valid; // [max_len] + int *depth_all; // [max_len] + khash_t(qname) *qend; // queryname end, for overlap removal +} astats_t; + +// We can have multiple primers for LEFT / RIGHT, so this +// permits detection by any compatible combination. +// One reference: +typedef struct { + int64_t left[MAX_PRIMER_PER_AMPLICON]; + int nleft; + int64_t right[MAX_PRIMER_PER_AMPLICON]; + int nright; + int64_t max_left, min_right; // inner dimensions + int64_t min_left, max_right; // outer dimensions +} amplicon_t; + +// Multiple references, we have an array of amplicons_t - one per used ref. +// We have per reference local and global stats here, as some of the stats +// are coordinate based. However we report them combined together as a single +// list across all references. +// "namp" is the number of amplicons in this reference, but they're +// numbered first_amp to first_amp+namp-1 inclusively. +typedef struct { + int tid, namp; + int64_t len; + bed_entry_list_t *sites; + amplicon_t *amp; + astats_t *lstats, *gstats; // local (1 file) and global (all file) stats + const char *ref; // ref name (pointer to the bed hash table key) + int first_amp; // first amplicon number for this ref +} amplicons_t; + +// Reinitialised for each new reference/chromosome. +// Counts from 1 to namp, -1 for no match and 0 for ?. +static int *pos2start = NULL; +static int *pos2end = NULL; +static int pos2size = 0; // allocated size of pos2start/end + +// Lookup table to go from position to amplicon based on +// read start / end. +static int initialise_amp_pos_lookup(astats_args_t *args, + amplicons_t *amps, + int ref) { + int64_t i, j; + amplicon_t *amp = amps[ref].amp; + int64_t max_len = amps[ref].len; + int namp = amps[ref].namp; + + if (max_len+1 > pos2size) { + if (!(pos2start = realloc(pos2start, (max_len+1)*sizeof(*pos2start)))) + return -1; + if (!(pos2end = realloc(pos2end, (max_len+1)*sizeof(*pos2end)))) + return -1; + pos2size = max_len; + } + for (i = 0; i < max_len; i++) + pos2start[i] = pos2end[i] = -1; + + for (i = 0; i < namp; i++) { + for (j = 0; j < amp[i].nleft; j++) { + int64_t p; + for (p = amp[i].left[j] - args->max_delta; + p <= amp[i].left[j] + args->max_delta; p++) { + if (p < 1 || p > max_len) + continue; + pos2start[p-1] = i; + } + } + for (j = 0; j < amp[i].nright; j++) { + int64_t p; + for (p = amp[i].right[j] - args->max_delta; + p <= amp[i].right[j] + args->max_delta; p++) { + if (p < 1 || p > max_len) + continue; + pos2end[p-1] = i; + } + } + } + + return 0; +} + +// Counts amplicons. +// Assumption: input BED file alternates between LEFT and RIGHT primers +// per amplicon, thus we can count the number based on the switching +// orientation. +static int count_amplicon(bed_entry_list_t *sites) { + int i, namp, last_rev = 0; + for (i = namp = 0; i < sites->length; i++) { + if (sites->bp[i].rev == 0 && last_rev) + namp++; + last_rev = sites->bp[i].rev; + } + + return ++namp; +} + +// We're only interest in the internal part of the amplicon. +// Our bed file has LEFT start/end followed by RIGHT start/end, +// so collapse these to LEFT end / RIGHT start. +// +// Returns right most amplicon position on success, +// < 0 on error +static int64_t bed2amplicon(astats_args_t *args, bed_entry_list_t *sites, + amplicon_t *amp, int *namp, int do_title, + const char *ref, int first_amp) { + int i, j; + int64_t max_right = 0; + FILE *ofp = args->out_fp; + + *namp = 0; + + // Assume all primers for the same amplicon are adjacent in BED + // with all + followed by all -. Thus - to + signifies next primer set. + int last_rev = 0; + amp[0].max_left = 0; + amp[0].min_right = INT64_MAX; + amp[0].min_left = INT64_MAX; + amp[0].max_right = 0; + if (do_title) { + fprintf(ofp, "# Amplicon locations from BED file.\n"); + fprintf(ofp, "# LEFT/RIGHT are - format and " + "comma-separated for alt-primers.\n"); + if (args->multi_ref) + fprintf(ofp, "#\n# AMPLICON\tREF\tNUMBER\tLEFT\tRIGHT\n"); + else + fprintf(ofp, "#\n# AMPLICON\tNUMBER\tLEFT\tRIGHT\n"); + } + for (i = j = 0; i < sites->length; i++) { + if (i == 0 && sites->bp[i].rev != 0) { + fprintf(samtools_stderr, "[ampliconstats] error: BED file should start" + " with the + strand primer\n"); + return -1; + } + if (sites->bp[i].rev == 0 && last_rev) { + j++; + if (j >= args->max_amp) { + fprintf(samtools_stderr, "[ampliconstats] error: too many amplicons" + " (%d). Use -a option to raise this.\n", j); + return -1; + } + amp[j].max_left = 0; + amp[j].min_right = INT64_MAX; + amp[j].min_left = INT64_MAX; + amp[j].max_right = 0; + } + if (sites->bp[i].rev == 0) { + if (i == 0 || last_rev) { + if (j>0) fprintf(ofp, "\n"); + if (args->multi_ref) + fprintf(ofp, "AMPLICON\t%s\t%d", ref, j+1 + first_amp); + else + fprintf(ofp, "AMPLICON\t%d", j+1); + } + if (amp[j].nleft >= MAX_PRIMER_PER_AMPLICON) { + print_error_errno("ampliconstats", + "too many primers per amplicon (%d).\n", + MAX_PRIMER_PER_AMPLICON); + return -1; + } + amp[j].left[amp[j].nleft++] = sites->bp[i].right; + if (amp[j].max_left < sites->bp[i].right+1) + amp[j].max_left = sites->bp[i].right+1; + if (amp[j].min_left > sites->bp[i].right+1) + amp[j].min_left = sites->bp[i].right+1; + // BED file, so left+1 as zero based. right(+1-1) as + // BED goes one beyond end (and we want inclusive range). + fprintf(ofp, "%c%"PRId64"-%"PRId64, "\t,"[amp[j].nleft > 1], + sites->bp[i].left+1, sites->bp[i].right); + } else { + if (amp[j].nright >= MAX_PRIMER_PER_AMPLICON) { + print_error_errno("ampliconstats", + "too many primers per amplicon (%d)", + MAX_PRIMER_PER_AMPLICON); + return -1; + } + amp[j].right[amp[j].nright++] = sites->bp[i].left; + if (amp[j].min_right > sites->bp[i].left-1) + amp[j].min_right = sites->bp[i].left-1; + if (amp[j].max_right < sites->bp[i].left-1) { + amp[j].max_right = sites->bp[i].left-1; + if (amp[j].max_right - amp[j].min_left + 1 >= + args->max_amp_len) { + fprintf(samtools_stderr, "[ampliconstats] error: amplicon " + "longer (%d) than max_amp_len option (%d)\n", + (int)(amp[j].max_right - amp[j].min_left + 2), + args->max_amp_len); + return -1; + } + if (max_right < amp[j].max_right) + max_right = amp[j].max_right; + } + fprintf(ofp, "%c%"PRId64"-%"PRId64, "\t,"[amp[j].nright > 1], + sites->bp[i].left+1, sites->bp[i].right); + } + last_rev = sites->bp[i].rev; + } + if (last_rev != 1) { + fprintf(ofp, "\n"); // useful if going to samtools_stdout + fprintf(samtools_stderr, "[ampliconstats] error: bed file does not end on" + " a reverse strand primer.\n"); + return -1; + } + *namp = ++j; + if (j) fprintf(ofp, "\n"); + + if (j >= args->max_amp) { + fprintf(samtools_stderr, "[ampliconstats] error: " + "too many amplicons (%d). Use -a option to raise this.", j); + return -1; + } + +// for (i = 0; i < *namp; i++) { +// fprintf(samtools_stdout, "%d\t%ld", i, amp[i].length); +// for (j = 0; j < amp[i].nleft; j++) +// fprintf(samtools_stdout, "%c%ld", "\t,"[j>0], amp[i].left[j]); +// for (j = 0; j < amp[i].nright; j++) +// fprintf(samtools_stdout, "%c%ld", "\t,"[j>0], amp[i].right[j]); +// fprintf(samtools_stdout, "\n"); +// } + + return max_right; +} + +void stats_free(astats_t *st) { + if (!st) + return; + + free(st->nreads); + free(st->nreads2); + free(st->nfull_reads); + free(st->nrperc); + free(st->nrperc2); + free(st->nbases); + free(st->nbases2); + free(st->coverage); + free(st->covered_perc); + free(st->covered_perc2); + free(st->amp_dist); + + free(st->depth_valid); + free(st->depth_all); + + if (st->tcoord) { + int i; + for (i = 0; i <= st->max_amp; i++) { + if (st->tcoord[i]) + kh_destroy(tcoord, st->tcoord[i]); + } + free(st->tcoord); + } + + khiter_t k; + for (k = kh_begin(st->qend); k != kh_end(st->qend); k++) + if (kh_exist(st->qend, k)) + free((void *)kh_key(st->qend, k)); + kh_destroy(qname, st->qend); + + free(st); +} + +astats_t *stats_alloc(int64_t max_len, int max_amp, int max_amp_len) { + astats_t *st = calloc(1, sizeof(*st)); + if (!st) + return NULL; + + st->max_amp = max_amp; + st->max_amp_len = max_amp_len; + st->max_len = max_len; + + if (!(st->nreads = calloc(max_amp, sizeof(*st->nreads)))) goto err; + if (!(st->nreads2 = calloc(max_amp, sizeof(*st->nreads2)))) goto err; + if (!(st->nrperc = calloc(max_amp, sizeof(*st->nrperc)))) goto err; + if (!(st->nrperc2 = calloc(max_amp, sizeof(*st->nrperc2)))) goto err; + if (!(st->nbases = calloc(max_amp, sizeof(*st->nbases)))) goto err; + if (!(st->nbases2 = calloc(max_amp, sizeof(*st->nbases2)))) goto err; + + if (!(st->nfull_reads = calloc(max_amp, sizeof(*st->nfull_reads)))) + goto err; + + if (!(st->coverage = calloc(max_amp*max_amp_len, sizeof(*st->coverage)))) + goto err; + + if (!(st->covered_perc = calloc(max_amp, sizeof(*st->covered_perc)))) + goto err; + if (!(st->covered_perc2 = calloc(max_amp, sizeof(*st->covered_perc2)))) + goto err; + + if (!(st->tcoord = calloc(max_amp+1, sizeof(*st->tcoord)))) goto err; + int i; + for (i = 0; i <= st->max_amp; i++) + if (!(st->tcoord[i] = kh_init(tcoord))) + goto err; + + if (!(st->qend = kh_init(qname))) + goto err; + + if (!(st->depth_valid = calloc(max_len, sizeof(*st->depth_valid)))) + goto err; + if (!(st->depth_all = calloc(max_len, sizeof(*st->depth_all)))) + goto err; + + if (!(st->amp_dist = calloc(max_amp, sizeof(*st->amp_dist)))) goto err; + + return st; + + err: + stats_free(st); + return NULL; +} + +static void stats_reset(astats_t *st) { + st->nseq = 0; + st->nfiltered = 0; + st->nfailprimer = 0; + + memset(st->nreads, 0, st->max_amp * sizeof(*st->nreads)); + memset(st->nreads2, 0, st->max_amp * sizeof(*st->nreads2)); + memset(st->nfull_reads, 0, st->max_amp * sizeof(*st->nfull_reads)); + + memset(st->nrperc, 0, st->max_amp * sizeof(*st->nrperc)); + memset(st->nrperc2, 0, st->max_amp * sizeof(*st->nrperc2)); + + memset(st->nbases, 0, st->max_amp * sizeof(*st->nbases)); + memset(st->nbases2, 0, st->max_amp * sizeof(*st->nbases2)); + + memset(st->coverage, 0, st->max_amp * st->max_amp_len + * sizeof(*st->coverage)); + memset(st->covered_perc, 0, st->max_amp * sizeof(*st->covered_perc)); + memset(st->covered_perc2, 0, st->max_amp * sizeof(*st->covered_perc2)); + + // Keep the allocated entries as it's likely all files will share + // the same keys. Instead we reset counters to zero for common ones + // and delete rare ones. + int i; + for (i = 0; i <= st->max_amp; i++) { + khiter_t k; + for (k = kh_begin(st->tcoord[i]); + k != kh_end(st->tcoord[i]); k++) + if (kh_exist(st->tcoord[i], k)) { + if (kh_value(st->tcoord[i], k) < 5) + kh_del(tcoord, st->tcoord[i], k); + else + kh_value(st->tcoord[i], k) = 0; + } + } + + khiter_t k; + for (k = kh_begin(st->qend); k != kh_end(st->qend); k++) + if (kh_exist(st->qend, k)) + free((void *)kh_key(st->qend, k)); + kh_clear(qname, st->qend); + + memset(st->depth_valid, 0, st->max_len * sizeof(*st->depth_valid)); + memset(st->depth_all, 0, st->max_len * sizeof(*st->depth_all)); + memset(st->amp_dist, 0, st->max_amp * sizeof(*st->amp_dist)); +} + +static void amp_stats_reset(amplicons_t *amps, int nref) { + int i; + for (i = 0; i < nref; i++) { + if (!amps[i].sites) + continue; + stats_reset(amps[i].lstats); + } +} + +static int accumulate_stats(astats_args_t *args, amplicons_t *amps, + bam1_t *b) { + int ref = b->core.tid; + amplicon_t *amp = amps[ref].amp; + astats_t *stats = amps[ref].lstats; + int len = amps[ref].len; + + if (!stats) + return 0; + + stats->nseq++; + if ((b->core.flag & args->flag_require) != args->flag_require || + (b->core.flag & args->flag_filter) != 0) { + stats->nfiltered++; + return 0; + } + + int64_t start = b->core.pos, mstart = start; // modified start + int64_t end = bam_endpos(b), i; + + // Compute all-template-depth and valid-template-depth. + // We track current end location per read name so we can remove overlaps. + // Potentially we could use this data for a better amplicon-depth + // count too, but for now it's purely for the per-base plots. + int ret; + khiter_t k; + int prev_start = 0, prev_end = 0; + if ((b->core.flag & BAM_FPAIRED) + && !(b->core.flag & (BAM_FSUPPLEMENTARY | BAM_FSECONDARY))) { + k = kh_put(qname, stats->qend, bam_get_qname(b), &ret); + if (ret == 0) { + prev_start = kh_value(stats->qend, k) & 0xffffffff; + prev_end = kh_value(stats->qend, k)>>32; + mstart = MAX(mstart, prev_end); + // Ideally we'd reuse strings so we don't thrash free/malloc. + // However let's see if the official way of doing that (malloc + // itself) is fast enough first. + free((void *)kh_key(stats->qend, k)); + kh_del(qname, stats->qend, k); + //fprintf(samtools_stderr, "remove overlap %d to %d\n", (int)start, (int)mstart); + } else { + if (!(kh_key(stats->qend, k) = strdup(bam_get_qname(b)))) + return -1; + + kh_value(stats->qend, k) = start | (end << 32); + } + } + for (i = mstart; i < end && i < len; i++) + stats->depth_all[i]++; + if (i < end) { + print_error("ampliconstats", "record %s overhangs end of reference", + bam_get_qname(b)); + // But keep going, as it's harmless. + } + + // On single ended runs, eg ONT or PacBio, we just use the start/end + // of the template to assign. + int anum = (b->core.flag & BAM_FREVERSE) || !(b->core.flag & BAM_FPAIRED) + ? (end-1 >= 0 && end-1 < len ? pos2end[end-1] : -1) + : (start >= 0 && start < len ? pos2start[start] : -1); + + // ivar sometimes soft-clips 100% of the bases. + // This is essentially unmapped + if (end == start && (args->flag_filter & BAM_FUNMAP)) { + stats->nfiltered++; + return 0; + } + + if (anum == -1) + stats->nfailprimer++; + + if (anum >= 0) { + int64_t c = MIN(end,amp[anum].min_right+1) - MAX(start,amp[anum].max_left); + if (c > 0) { + stats->nreads[anum]++; + // NB: ref bases rather than read bases + stats->nbases[anum] += c; + + int64_t i; + if (start < 0) start = 0; + if (end > len) end = len; + + int64_t ostart = MAX(start, amp[anum].min_left-1); + int64_t oend = MIN(end, amp[anum].max_right); + int64_t offset = amp[anum].min_left-1; + for (i = ostart; i < oend; i++) + stats->coverage[anum*stats->max_amp_len + i-offset]++; + } else { + stats->nfailprimer++; + } + } + + // Template length in terms of amplicon number to amplicon number. + // We expect left to right of same amplicon (len 0), but it may go + // to next amplicon (len 1) or prev (len -1), etc. + int64_t t_end; + int oth_anum = -1; + + if (b->core.flag & BAM_FPAIRED) { + t_end = (b->core.flag & BAM_FREVERSE ? end : start) + + b->core.isize; + + // If we've clipped the primers but not followed up with a fixmates + // then our start+TLEN will take us to a location which is + // length(LEFT_PRIMER) + length(RIGHT_PRIMER) too far away. + // + // The correct solution is to run samtools fixmate so TLEN is correct. + // The hacky solution is to fudge the expected tlen by double the + // average primer length (e.g. 50). + t_end += b->core.isize > 0 ? -args->tlen_adj : +args->tlen_adj; + + if (t_end > 0 && t_end < len && b->core.isize != 0) + oth_anum = (b->core.flag & BAM_FREVERSE) + ? pos2start[t_end] + : pos2end[t_end]; + } else { + // Not paired (see int anum = (REV || !PAIR) ?en :st expr above) + oth_anum = pos2start[start]; + t_end = end; + } + + // We don't want to count our pairs twice. + // If both left/right are known, count it on left only. + // If only one is known, we'll only get to this code once + // so we can also count it. + int astatus = 2; + if (anum != -1 && oth_anum != -1) { + astatus = oth_anum == anum ? 0 : 1; + if (start <= t_end) + stats->amp_dist[anum][astatus]++; + } else if (anum >= 0) { + stats->amp_dist[anum][astatus = 2]++; + } + + if (astatus == 0 && !(b->core.flag & (BAM_FUNMAP | BAM_FMUNMAP))) { + if (prev_end && mstart > prev_end) { + // 2nd read with gap to 1st; undo previous increment. + for (i = prev_start; i < prev_end; i++) + stats->depth_valid[i]--; + stats->nfull_reads[anum] -= (b->core.flag & BAM_FPAIRED) ? 0.5 : 1; + } else { + // 1st read, or 2nd read that overlaps 1st + for (i = mstart; i < end; i++) + stats->depth_valid[i]++; + stats->nfull_reads[anum] += (b->core.flag & BAM_FPAIRED) ? 0.5 : 1; + } + } + + // Track template start,end frequencies, so we can give stats on + // amplicon primer usage. + if ((b->core.flag & BAM_FPAIRED) && b->core.isize <= 0) + // left to right only, so we don't double count template positions. + return 0; + + start = b->core.pos; + t_end = b->core.flag & BAM_FPAIRED + ? start + b->core.isize-1 + : end; + uint64_t tcoord = MIN(start+1, UINT32_MAX) | (MIN(t_end+1, UINT32_MAX)<<32); + k = kh_put(tcoord, stats->tcoord[anum+1], tcoord, &ret); + if (ret < 0) + return -1; + if (ret == 0) + kh_value(stats->tcoord[anum+1], k)++; + else + kh_value(stats->tcoord[anum+1], k)=1; + kh_value(stats->tcoord[anum+1], k) |= ((int64_t)astatus<<32); + + return 0; +} + +// Append file local stats to global stats +int append_lstats(astats_t *lstats, astats_t *gstats, int namp, int all_nseq) { + gstats->nseq += lstats->nseq; + gstats->nfiltered += lstats->nfiltered; + gstats->nfailprimer += lstats->nfailprimer; + + int a; + for (a = -1; a < namp; a++) { + // Add khash local (kl) to khash global (kg) + khiter_t kl, kg; + for (kl = kh_begin(lstats->tcoord[a+1]); + kl != kh_end(lstats->tcoord[a+1]); kl++) { + if (!kh_exist(lstats->tcoord[a+1], kl) || + kh_value(lstats->tcoord[a+1], kl) == 0) + continue; + + int ret; + kg = kh_put(tcoord, gstats->tcoord[a+1], + kh_key(lstats->tcoord[a+1], kl), + &ret); + if (ret < 0) + return -1; + + kh_value(gstats->tcoord[a+1], kg) = + (ret == 0 + ? (kh_value(gstats->tcoord[a+1], kg) & 0xFFFFFFFF) + : 0) + + kh_value(lstats->tcoord[a+1], kl); + } + if (a == -1) continue; + + gstats->nreads[a] += lstats->nreads[a]; + gstats->nreads2[a] += lstats->nreads[a] * lstats->nreads[a]; + gstats->nfull_reads[a] += lstats->nfull_reads[a]; + + // To get mean & sd for amplicon read percentage, we need + // to do the divisions here as nseq differs for each sample. + double nrperc = all_nseq ? 100.0 * lstats->nreads[a] / all_nseq : 0; + gstats->nrperc[a] += nrperc; + gstats->nrperc2[a] += nrperc*nrperc; + + gstats->nbases[a] += lstats->nbases[a]; + gstats->nbases2[a] += lstats->nbases[a] * lstats->nbases[a]; + + int d; + for (d = 0; d < MAX_DEPTH; d++) { + gstats->covered_perc[a][d] += lstats->covered_perc[a][d]; + gstats->covered_perc2[a][d] += lstats->covered_perc[a][d] + * lstats->covered_perc[a][d]; + } + + for (d = 0; d < 3; d++) + gstats->amp_dist[a][d] += lstats->amp_dist[a][d]; + } + + for (a = 0; a < lstats->max_len; a++) { + gstats->depth_valid[a] += lstats->depth_valid[a]; + gstats->depth_all[a] += lstats->depth_all[a]; + } + + return 0; +} + +int append_stats(amplicons_t *amps, int nref) { + int i, r, all_nseq = 0; + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = amps[r].lstats; + all_nseq += stats->nseq - stats->nfiltered - stats->nfailprimer; + } + + for (i = 0; i < nref; i++) { + if (!amps[i].sites) + continue; + if (append_lstats(amps[i].lstats, amps[i].gstats, amps[i].namp, + all_nseq) < 0) + return -1; + } + + return 0; +} + +typedef struct { + int32_t start, end; + uint32_t freq; + uint32_t status; +} tcoord_t; + +// Sort tcoord by descending frequency and then ascending start and end. +static int tcoord_freq_sort(const void *vp1, const void *vp2) { + const tcoord_t *t1 = (const tcoord_t *)vp1; + const tcoord_t *t2 = (const tcoord_t *)vp2; + + if (t1->freq != t2->freq) + return t2->freq - t1->freq; + + if (t1->start != t2->start) + return t1->start - t2->start; + + return t1->end - t2->end; +} + + +/* + * Merges tcoord start,end,freq,status tuples if their coordinates are + * close together. We aim to keep the start,end for the most frequent + * value and assume that is the correct coordinate and all others are + * minor fluctuations due to errors or variants. + * + * We sort by frequency first and then merge later items in the list into + * the earlier more frequent ones. It's O(N^2), but sufficient for now + * given current scale of projects. + * + * If we ever need to resolve that then consider sorting by start + * coordinate and scanning the list to find all items within X, find + * the most frequent of those, and then cluster that way. (I'd have + * done that had I thought of it at the time!) + */ +static void aggregate_tcoord(astats_args_t *args, tcoord_t *tpos, size_t *np){ + size_t n = *np, j, j2, j3, k; + + // Sort by frequency and cluster infrequent coords into frequent + // ones provided they're close by. + // This is O(N^2), but we've already binned by tcoord_bin/2 so + // the list isn't intended to be vast at this point. + qsort(tpos, n, sizeof(*tpos), tcoord_freq_sort); + + // For frequency ties, find mid start coord, and then find mid end + // coord of those matching start. + // We make that the first item so we merge into that mid point. + for (j = 0; j < n; j++) { + for (j2 = j+1; j2 < n; j2++) { + if (tpos[j].freq != tpos[j2].freq) + break; + if (tpos[j2].start - tpos[j].start >= args->tcoord_bin) + break; + } + + // j to j2 all within bin of a common start, + // m is the mid start. + if (j2-1 > j) { + size_t m = (j2-1 + j)/2; + + // Find mid end for this same start + while (m > 1 && tpos[m].start == tpos[m-1].start) + m--; + for (j3 = m+1; j3 < j2; j3++) { + if (tpos[m].start != tpos[j3].start) + break; + if (tpos[m].end - tpos[j3].end >= args->tcoord_bin) + break; + } + if (j3-1 > m) + m = (j3-1 + m)/2; + + // Swap with first item. + tcoord_t tmp = tpos[j]; + tpos[j] = tpos[m]; + tpos[m] = tmp; + j = j2-1; + } + } + + // Now merge in coordinates. + // This bit is O(N^2), so consider binning first to reduce the + // size of the list if we have excessive positional variation. + for (k = j = 0; j < n; j++) { + if (!tpos[j].freq) + continue; + + if (k < j) + tpos[k] = tpos[j]; + + for (j2 = j+1; j2 < n; j2++) { + if (ABS(tpos[j].start-tpos[j2].start) < args->tcoord_bin/2 && + ABS(tpos[j].end -tpos[j2].end) < args->tcoord_bin/2 && + tpos[j].status == tpos[j2].status) { + tpos[k].freq += tpos[j2].freq; + tpos[j2].freq = 0; + } + } + k++; + } + + *np = k; +} + +int dump_stats(astats_args_t *args, char type, char *name, int nfile, + amplicons_t *amps, int nref, int local) { + int i, r; + FILE *ofp = args->out_fp; + tcoord_t *tpos = NULL; + size_t ntcoord = 0; + + // summary stats for this sample (or for all samples) + fprintf(ofp, "# Summary stats.\n"); + fprintf(ofp, "# Use 'grep ^%cSS | cut -f 2-' to extract this part.\n", type); + + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + int nmatch = stats->nseq - stats->nfiltered - stats->nfailprimer; + char *name_ref = malloc(strlen(name) + strlen(amps[r].ref) + 2); + if (!name_ref) + return -1; + if (args->multi_ref) + sprintf(name_ref, "%s\t%s", name, amps[r].ref); + else + sprintf(name_ref, "%s", name); + fprintf(ofp, "%cSS\t%s\traw total sequences:\t%d\n", + type, name_ref, stats->nseq); + fprintf(ofp, "%cSS\t%s\tfiltered sequences:\t%d\n", + type, name_ref, stats->nfiltered); + fprintf(ofp, "%cSS\t%s\tfailed primer match:\t%d\n", + type, name_ref, stats->nfailprimer); + fprintf(ofp, "%cSS\t%s\tmatching sequences:\t%d\n", + type, name_ref, nmatch); + + int d = 0; + do { + // From first to last amplicon only, so not entire consensus. + // If contig length is known, maybe we want to add the missing + // count to < DEPTH figures? + int64_t start = 0, covered = 0, total = 0; + amplicon_t *amp = amps[r].amp; + for (i = 0; i < amps[r].namp; i++) { + int64_t j, offset = amp[i].min_left-1; + if (amp[i].min_right - amp[i].min_left > stats->max_amp_len) { + fprintf(samtools_stderr, "[ampliconstats] error: " + "Maximum amplicon length (%d) exceeded for '%s'\n", + stats->max_amp, name); + return -1; + } + for (j = MAX(start, amp[i].max_left-1); + j < MAX(start, amp[i].min_right); j++) { + if (stats->coverage[i*stats->max_amp_len + j-offset] + >= args->min_depth[d]) + covered++; + total++; + } + start = MAX(start, amp[i].min_right); + } + fprintf(ofp, "%cSS\t%s\tconsensus depth count < %d and >= %d:\t%" + PRId64"\t%"PRId64"\n", type, name_ref, + args->min_depth[d], args->min_depth[d], + total-covered, covered); + } while (++d < MAX_DEPTH && args->min_depth[d]); + + free(name_ref); + } + + // Read count + fprintf(ofp, "# Absolute matching read counts per amplicon.\n"); + fprintf(ofp, "# Use 'grep ^%cREADS | cut -f 2-' to extract this part.\n", type); + fprintf(ofp, "%cREADS\t%s", type, name); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + fprintf(ofp, "\t%"PRId64, stats->nreads[i]); + } + } + fprintf(ofp, "\n"); + + // Valid depth is the number of full length reads (already divided + // by the number we expect to cover), so +0.5 per read in pair. + // A.k.a "usable depth" in the plots. + fprintf(ofp, "%cVDEPTH\t%s", type, name); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) + fprintf(ofp, "\t%d", (int)stats->nfull_reads[i]); + } + fprintf(ofp, "\n"); + + if (type == 'C') { + // For combined we can compute mean & standard deviation too + fprintf(ofp, "CREADS\tMEAN"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + fprintf(ofp, "\t%.1f", stats->nreads[i] / (double)nfile); + } + } + fprintf(ofp, "\n"); + + fprintf(ofp, "CREADS\tSTDDEV"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + double n1 = stats->nreads[i]; + fprintf(ofp, "\t%.1f", nfile > 1 && stats->nreads2[i] > 0 + ? sqrt(stats->nreads2[i]/(double)nfile + - (n1/nfile)*(n1/nfile)) + : 0); + } + } + fprintf(ofp, "\n"); + } + + fprintf(ofp, "# Read percentage of distribution between amplicons.\n"); + fprintf(ofp, "# Use 'grep ^%cRPERC | cut -f 2-' to extract this part.\n", type); + fprintf(ofp, "%cRPERC\t%s", type, name); + int all_nseq = 0; + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + all_nseq += stats->nseq - stats->nfiltered - stats->nfailprimer; + } + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + if (type == 'C') { + fprintf(ofp, "\t%.3f", (double)stats->nrperc[i] / nfile); + } else { + fprintf(ofp, "\t%.3f", + all_nseq ? 100.0 * stats->nreads[i] / all_nseq : 0); + } + } + } + fprintf(ofp, "\n"); + + if (type == 'C') { + // For combined we compute mean and standard deviation too + fprintf(ofp, "CRPERC\tMEAN"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + fprintf(ofp, "\t%.3f", stats->nrperc[i] / nfile); + } + } + fprintf(ofp, "\n"); + + fprintf(ofp, "CRPERC\tSTDDEV"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + // variance = SUM(X^2) - ((SUM(X)^2) / N) + double n1 = stats->nrperc[i]; + double v = stats->nrperc2[i]/nfile - (n1/nfile)*(n1/nfile); + fprintf(ofp, "\t%.3f", v>0?sqrt(v):0); + } + } + fprintf(ofp, "\n"); + } + + // Base depth + fprintf(ofp, "# Read depth per amplicon.\n"); + fprintf(ofp, "# Use 'grep ^%cDEPTH | cut -f 2-' to extract this part.\n", type); + fprintf(ofp, "%cDEPTH\t%s", type, name); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + amplicon_t *amp = amps[r].amp; + for (i = 0; i < amps[r].namp; i++) { + int nseq = stats->nseq - stats->nfiltered - stats->nfailprimer; + int64_t alen = amp[i].min_right - amp[i].max_left+1; + fprintf(ofp, "\t%.1f", nseq ? stats->nbases[i] / (double)alen : 0); + } + } + fprintf(ofp, "\n"); + + if (type == 'C') { + // For combined we can compute mean & standard deviation too + fprintf(ofp, "CDEPTH\tMEAN"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + amplicon_t *amp = amps[r].amp; + int nseq = stats->nseq - stats->nfiltered - stats->nfailprimer; + for (i = 0; i < amps[r].namp; i++) { + int64_t alen = amp[i].min_right - amp[i].max_left+1; + fprintf(ofp, "\t%.1f", nseq ? stats->nbases[i] / (double)alen / nfile : 0); + } + } + fprintf(ofp, "\n"); + + fprintf(ofp, "CDEPTH\tSTDDEV"); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + amplicon_t *amp = amps[r].amp; + for (i = 0; i < amps[r].namp; i++) { + double alen = amp[i].min_right - amp[i].max_left+1; + double n1 = stats->nbases[i] / alen; + double v = stats->nbases2[i] / (alen*alen) /nfile + - (n1/nfile)*(n1/nfile); + fprintf(ofp, "\t%.1f", v>0?sqrt(v):0); + } + } + fprintf(ofp, "\n"); + } + + // Percent Coverage + if (type == 'F') { + fprintf(ofp, "# Percentage coverage per amplicon\n"); + fprintf(ofp, "# Use 'grep ^%cPCOV | cut -f 2-' to extract this part.\n", type); + int d = 0; + do { + fprintf(ofp, "%cPCOV-%d\t%s", type, args->min_depth[d], name); + + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + amplicon_t *amp = amps[r].amp; + for (i = 0; i < amps[r].namp; i++) { + int covered = 0; + if (amp[i].min_right - amp[i].min_left > stats->max_amp_len) { + fprintf(samtools_stderr, "[ampliconstats] error: " + "Maximum amplicon length (%d) exceeded for '%s'\n", + stats->max_amp, name); + return -1; + } + int64_t j, offset = amp[i].min_left-1; + for (j = amp[i].max_left-1; j < amp[i].min_right; j++) { + int apos = i*stats->max_amp_len + j-offset; + if (stats->coverage[apos] >= args->min_depth[d]) + covered++; + } + int64_t alen = amp[i].min_right - amp[i].max_left+1; + stats->covered_perc[i][d] = 100.0 * covered / alen; + fprintf(ofp, "\t%.2f", 100.0 * covered / alen); + } + } + fprintf(ofp, "\n"); + } while (++d < MAX_DEPTH && args->min_depth[d]); + + } else if (type == 'C') { + // For combined we can compute mean & standard deviation too + int d = 0; + do { + fprintf(ofp, "CPCOV-%d\tMEAN", args->min_depth[d]); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + fprintf(ofp, "\t%.1f", stats->covered_perc[i][d] / nfile); + } + } + fprintf(ofp, "\n"); + + fprintf(ofp, "CPCOV-%d\tSTDDEV", args->min_depth[d]); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + double n1 = stats->covered_perc[i][d] / nfile; + double v = stats->covered_perc2[i][d] / nfile - n1*n1; + fprintf(ofp, "\t%.1f", v>0?sqrt(v):0); + } + } + fprintf(ofp, "\n"); + } while (++d < MAX_DEPTH && args->min_depth[d]); + } + + // Plus base depth for all reads, irrespective of amplicon. + // This is post overlap removal, if reads in the read-pair overlap. + fprintf(ofp, "# Depth per reference base for ALL data.\n"); + fprintf(ofp, "# Use 'grep ^%cDP_ALL | cut -f 2-' to extract this part.\n", + type); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + if (args->multi_ref) + fprintf(ofp, "%cDP_ALL\t%s\t%s", type, name, amps[r].ref); + else + fprintf(ofp, "%cDP_ALL\t%s", type, name); + + for (i = 0; i < amps[r].len; i++) { + // Basic run-length encoding provided all values are within + // +- depth_bin fraction of the mid-point. + int dmin = stats->depth_all[i], dmax = stats->depth_all[i], j; + double dmid = (dmin + dmax)/2.0; + double low = dmid*(1-args->depth_bin); + double high = dmid*(1+args->depth_bin); + for (j = i+1; j < amps[r].len; j++) { + int d = stats->depth_all[j]; + if (d < low || d > high) + break; + if (dmin > d) { + dmin = d; + dmid = (dmin + dmax)/2.0; + low = dmid*(1-args->depth_bin); + high = dmid*(1+args->depth_bin); + } else if (dmax < d) { + dmax = d; + dmid = (dmin + dmax)/2.0; + low = dmid*(1-args->depth_bin); + high = dmid*(1+args->depth_bin); + } + } + fprintf(ofp, "\t%d,%d", (int)dmid, j-i); + i = j-1; + } + fprintf(ofp, "\n"); + } + + // And depth for only reads matching to a single amplicon for full + // length. This is post read overlap removal. + fprintf(ofp, "# Depth per reference base for full-length valid amplicon data.\n"); + fprintf(ofp, "# Use 'grep ^%cDP_VALID | cut -f 2-' to extract this " + "part.\n", type); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + if (args->multi_ref) + fprintf(ofp, "%cDP_VALID\t%s\t%s", type, name, amps[r].ref); + else + fprintf(ofp, "%cDP_VALID\t%s", type, name); + + for (i = 0; i < amps[r].len; i++) { + int dmin = stats->depth_valid[i], dmax = stats->depth_valid[i], j; + double dmid = (dmin + dmax)/2.0; + double low = dmid*(1-args->depth_bin); + double high = dmid*(1+args->depth_bin); + for (j = i+1; j < amps[r].len; j++) { + int d = stats->depth_valid[j]; + if (d < low || d > high) + break; + if (dmin > d) { + dmin = d; + dmid = (dmin + dmax)/2.0; + low = dmid*(1-args->depth_bin); + high = dmid*(1+args->depth_bin); + } else if (dmax < d) { + dmax = d; + dmid = (dmin + dmax)/2.0; + low = dmid*(1-args->depth_bin); + high = dmid*(1+args->depth_bin); + } + } + fprintf(ofp, "\t%d,%d", (int)dmid, j-i); + i = j-1; + } + fprintf(ofp, "\n"); + } + + // TCOORD (start to end) distribution + fprintf(ofp, "# Distribution of aligned template coordinates.\n"); + fprintf(ofp, "# Use 'grep ^%cTCOORD | cut -f 2-' to extract this part.\n", type); + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0 - (nref==1); i < amps[r].namp; i++) { + if (ntcoord < kh_size(stats->tcoord[i+1])) { + ntcoord = kh_size(stats->tcoord[i+1]); + tcoord_t *tmp = realloc(tpos, ntcoord * sizeof(*tmp)); + if (!tmp) { + free(tpos); + return -1; + } + tpos = tmp; + } + + khiter_t k; + size_t n = 0, j; + for (k = kh_begin(stats->tcoord[i+1]); + k != kh_end(stats->tcoord[i+1]); k++) { + if (!kh_exist(stats->tcoord[i+1], k) || + (kh_value(stats->tcoord[i+1], k) & 0xFFFFFFFF) == 0) + continue; + // Key is start,end in 32-bit quantities. + // Yes this limits us to 4Gb references, but just how + // many primers are we planning on making? Not that many + // I hope. + tpos[n].start = kh_key(stats->tcoord[i+1], k)&0xffffffff; + tpos[n].end = kh_key(stats->tcoord[i+1], k)>>32; + + // Value is frequency (top 32-bits) and status (bottom 32). + tpos[n].freq = kh_value(stats->tcoord[i+1], k)&0xffffffff; + tpos[n].status = kh_value(stats->tcoord[i+1], k)>>32; + n++; + } + + if (args->tcoord_bin > 1) + aggregate_tcoord(args, tpos, &n); + + fprintf(ofp, "%cTCOORD\t%s\t%d", type, name, + i+1+amps[r].first_amp); // per amplicon + for (j = 0; j < n; j++) { + if (tpos[j].freq < args->tcoord_min_count) + continue; + fprintf(ofp, "\t%d,%d,%u,%u", + tpos[j].start, + tpos[j].end, + tpos[j].freq, + tpos[j].status); + } + fprintf(ofp, "\n"); + } + } + + + // AMP length distribution. + // 0 = both ends in this amplicon + // 1 = ends in different amplicons + // 2 = other end matching an unknown amplicon site + // (see tcoord for further analysis of where) + fprintf(ofp, "# Classification of amplicon status. Columns are\n"); + fprintf(ofp, "# number with both primers from this amplicon, number with\n"); + fprintf(ofp, "# primers from different amplicon, and number with a position\n"); + fprintf(ofp, "# not matching any valid amplicon primer site\n"); + fprintf(ofp, "# Use 'grep ^%cAMP | cut -f 2-' to extract this part.\n", type); + + fprintf(ofp, "%cAMP\t%s\t0", type, name); // all merged + int amp_dist[3] = {0}; + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { // accumulate for all amps + amp_dist[0] += stats->amp_dist[i][0]; + amp_dist[1] += stats->amp_dist[i][1]; + amp_dist[2] += stats->amp_dist[i][2]; + } + } + fprintf(ofp, "\t%d\t%d\t%d\n", amp_dist[0], amp_dist[1], amp_dist[2]); + + for (r = 0; r < nref; r++) { + if (!amps[r].sites) + continue; + astats_t *stats = local ? amps[r].lstats : amps[r].gstats; + for (i = 0; i < amps[r].namp; i++) { + // per amplicon + fprintf(ofp, "%cAMP\t%s\t%d", type, name, i+1+amps[r].first_amp); + fprintf(ofp, "\t%d\t%d\t%d\n", stats->amp_dist[i][0], + stats->amp_dist[i][1], stats->amp_dist[i][2]); + } + } + + free(tpos); + return 0; +} + +int dump_lstats(astats_args_t *args, char type, char *name, int nfile, + amplicons_t *amps, int nref) { + return dump_stats(args, type, name, nfile, amps, nref, 1); +} + +int dump_gstats(astats_args_t *args, char type, char *name, int nfile, + amplicons_t *amps, int nref) { + return dump_stats(args, type, name, nfile, amps, nref, 0); +} + +char const *get_sample_name(sam_hdr_t *header, char *RG) { + kstring_t ks = {0}; + sam_hdr_find_tag_id(header, "RG", RG?"ID":NULL, RG, "SM", &ks); + return ks.s; +} + +// Return maximum reference length (SQ is NULL) or the length +// of the specified reference in SQ. +int64_t get_ref_len(sam_hdr_t *header, const char *SQ) { + if (SQ) { + int tid = SQ ? sam_hdr_name2tid(header, SQ) : 0; + return tid >= 0 ? sam_hdr_tid2len(header, tid) : -1; + } else { + int nref = sam_hdr_nref(header), tid;; + int64_t len = 0; + for (tid = 0; tid < nref; tid++) { + int64_t rl = sam_hdr_tid2len(header, tid); + if (len < rl) + len = rl; + } + return len; + } +} + +static int amplicon_stats(astats_args_t *args, + khash_t(bed_list_hash) *bed_hash, + char **filev, int filec) { + int i, ref = -1, ref_tid = -1, ret = -1, nref = 0; + samFile *fp = NULL; + sam_hdr_t *header = NULL; + bam1_t *b = bam_init1(); + FILE *ofp = args->out_fp; + char sname_[8192], *sname = NULL; + amplicons_t *amps = NULL; + + // Report initial SS header. We gather data from the bed_hash entries + // as well as from the first SAM header (with the requirement that all + // headers should be compatible). + if (filec) { + if (!(fp = sam_open_format(filev[0], "r", &args->ga.in))) { + print_error_errno("ampliconstats", + "Cannot open input file \"%s\"", + filev[0]); + goto err; + } + if (!(header = sam_hdr_read(fp))) + goto err; + + if (!amps) { + amps = calloc(nref=sam_hdr_nref(header), sizeof(*amps)); + if (!amps) + goto err; + fprintf(ofp, "# Summary statistics, used for scaling the plots.\n"); + fprintf(ofp, "SS\tSamtools version: %s\n", samtools_version()); + fprintf(ofp, "SS\tCommand line: %s\n", args->argv); + fprintf(ofp, "SS\tNumber of files:\t%d\n", filec); + + // Note: order of hash entries will be different to order of + // BED file which may also differ to order of SQ headers. + // SQ header is canonical ordering (pos sorted file). + khiter_t k; + int bam_nref = sam_hdr_nref(header); + for (i = 0; i < bam_nref; i++) { + k = kh_get(bed_list_hash, bed_hash, + sam_hdr_tid2name(header, i)); + if (!kh_exist(bed_hash, k)) + continue; + + bed_entry_list_t *sites = &kh_value(bed_hash, k); + + ref = i; + amps[ref].ref = kh_key(bed_hash, k); + amps[ref].sites = sites; + amps[ref].namp = count_amplicon(sites); + amps[ref].amp = calloc(sites->length, + sizeof(*amps[ref].amp)); + if (!amps[ref].amp) + goto err; + if (args->multi_ref) + fprintf(ofp, "SS\tNumber of amplicons:\t%s\t%d\n", + kh_key(bed_hash, k), amps[ref].namp); + else + fprintf(ofp, "SS\tNumber of amplicons:\t%d\n", + amps[ref].namp); + + amps[ref].tid = ref; + if (ref_tid == -1) + ref_tid = ref; + + int64_t len = get_ref_len(header, kh_key(bed_hash, k)); + amps[ref].len = len; + if (args->multi_ref) + fprintf(ofp, "SS\tReference length:\t%s\t%"PRId64"\n", + kh_key(bed_hash, k), len); + else + fprintf(ofp, "SS\tReference length:\t%"PRId64"\n", + len); + + amps[ref].lstats = stats_alloc(len, args->max_amp, + args->max_amp_len); + amps[ref].gstats = stats_alloc(len, args->max_amp, + args->max_amp_len); + if (!amps[ref].lstats || !amps[ref].gstats) + goto err; + } + } + + sam_hdr_destroy(header); + header = NULL; + if (sam_close(fp) < 0) { + fp = NULL; + goto err; + } + fp = NULL; + } + fprintf(ofp, "SS\tEnd of summary\n"); + + // Extract the bits of amplicon data we need from bed hash and turn + // it into a position-to-amplicon lookup table. + int offset = 0; + for (i = 0; i < nref; i++) { + if (!amps[i].sites) + continue; + + amps[i].first_amp = offset; + if (bed2amplicon(args, amps[i].sites, amps[i].amp, + &s[i].namp, i==0, amps[i].ref, offset) < 0) + goto err; + + offset += amps[i].namp; // cumulative amplicon number across refs + } + + // Now iterate over file contents, one at a time. + for (i = 0; i < filec; i++) { + char *nstart = filev[i]; + + fp = sam_open_format(filev[i], "r", &args->ga.in); + if (!fp) { + print_error_errno("ampliconstats", + "Cannot open input file \"%s\"", + filev[i]); + goto err; + } + + if (args->ga.nthreads > 0) + hts_set_threads(fp, args->ga.nthreads); + + if (!(header = sam_hdr_read(fp))) + goto err; + + if (nref != sam_hdr_nref(header)) { + print_error_errno("ampliconstats", + "SAM headers are not consistent across input files"); + goto err; + } + int r; + for (r = 0; r < nref; r++) { + if (!amps[r].ref || + strcmp(amps[r].ref, sam_hdr_tid2name(header, r)) != 0 || + amps[r].len != sam_hdr_tid2len(header, r)) { + print_error_errno("ampliconstats", + "SAM headers are not consistent across " + "input files"); + goto err; + } + } + + if (args->use_sample_name) + sname = (char *)get_sample_name(header, NULL); + + if (!sname) { + sname = sname_; + char *nend = filev[i] + strlen(filev[i]), *cp; + if ((cp = strrchr(filev[i], '/'))) + nstart = cp+1; + if ((cp = strrchr(nstart, '.')) && + (strcmp(cp, ".bam") == 0 || + strcmp(cp, ".sam") == 0 || + strcmp(cp, ".cram") == 0)) + nend = cp; + if (nend - nstart >= 8192) nend = nstart+8191; + memcpy(sname, nstart, nend-nstart); + sname[nend-nstart] = 0; + } + + // Stats local to this sample only + amp_stats_reset(amps, nref); + + int last_ref = -9; + while ((r = sam_read1(fp, header, b)) >= 0) { + // Other filter options useful here? + if (b->core.tid < 0) + continue; + + if (last_ref != b->core.tid) { + last_ref = b->core.tid; + if (initialise_amp_pos_lookup(args, amps, last_ref) < 0) + goto err; + } + + if (accumulate_stats(args, amps, b) < 0) + goto err; + } + + if (r < -1) { + print_error_errno("ampliconstats", "Fail reading record"); + goto err; + } + + sam_hdr_destroy(header); + if (sam_close(fp) < 0) { + fp = NULL; + goto err; + } + + fp = NULL; + header = NULL; + + if (dump_lstats(args, 'F', sname, filec, amps, nref) < 0) + goto err; + + if (append_stats(amps, nref) < 0) + goto err; + + if (sname && sname != sname_) + free(sname); + sname = NULL; + } + + if (dump_gstats(args, 'C', "COMBINED", filec, amps, nref) < 0) + goto err; + + ret = 0; + err: + bam_destroy1(b); + if (ret) { + if (header) + sam_hdr_destroy(header); + if (fp) + sam_close(fp); + } + for (i = 0; i < nref; i++) { + stats_free(amps[i].lstats); + stats_free(amps[i].gstats); + free(amps[i].amp); + } + free(amps); + free(pos2start); + free(pos2end); + if (ret) { + if (sname && sname != sname_) + free(sname); + } + + return ret; +} + +static int usage(astats_args_t *args, FILE *fp, int exit_status) { + fprintf(fp, +"\n" +"Usage: samtools ampliconstats [options] primers.bed *.bam > astats.txt\n" +"\n" +"Options:\n"); + fprintf(fp, " -f, --required-flag STR|INT\n" + " Only include reads with all of the FLAGs present [0x%X]\n",args->flag_require); + fprintf(fp, " -F, --filter-flag STR|INT\n" + " Only include reads with none of the FLAGs present [0x%X]\n",args->flag_filter & 0xffff); + fprintf(fp, " -a, --max-amplicons INT\n" + " Change the maximum number of amplicons permitted [%d]\n", MAX_AMP); + fprintf(fp, " -l, --max-amplicon-length INT\n" + " Change the maximum length of an individual amplicon [%d]\n", MAX_AMP_LEN); + fprintf(fp, " -d, --min-depth INT[,INT]...\n" + " Minimum base depth(s) to consider position covered [%d]\n", args->min_depth[0]); + fprintf(fp, " -m, --pos-margin INT\n" + " Margin of error for matching primer positions [%d]\n", args->max_delta); + fprintf(fp, " -o, --output FILE\n" + " Specify output file [samtools_stdout if unset]\n"); + fprintf(fp, " -s, --use-sample-name\n" + " Use the sample name from the first @RG header line\n"); + fprintf(fp, " -t, --tlen-adjust INT\n" + " Add/subtract from TLEN; use when clipping but no fixmate step\n"); + fprintf(fp, " -b, --tcoord-bin INT\n" + " Bin template start,end positions into multiples of INT[1]\n"); + fprintf(fp, " -c, --tcoord-min-count INT\n" + " Minimum template start,end frequency for recording [%d]\n", TCOORD_MIN_COUNT); + fprintf(fp, " -D, --depth-bin FRACTION\n" + " Merge FDP values within +/- FRACTION together\n"); + fprintf(fp, " -S, --single-ref\n" + " Force single-ref (<=1.12) output format\n"); + sam_global_opt_help(fp, "I.--.@"); + + return exit_status; +} + +int main_ampliconstats(int argc, char **argv) { + astats_args_t args = { + .ga = SAM_GLOBAL_ARGS_INIT, + .flag_require = 0, + .flag_filter = 0x10B04, + //.sites = BED_LIST_INIT, + .max_delta = 30, // large enough to cope with alt primers + .min_depth = {1}, + .use_sample_name = 0, + .max_amp = MAX_AMP, + .max_amp_len = MAX_AMP_LEN, + .tlen_adj = 0, + .out_fp = samtools_stdout, + .tcoord_min_count = TCOORD_MIN_COUNT, + .tcoord_bin = 1, + .depth_bin = 0.01, + .multi_ref = 1 + }, oargs = args; + + static const struct option loptions[] = + { + SAM_OPT_GLOBAL_OPTIONS('I', 0, '-', '-', 0, '@'), + {"help", no_argument, NULL, 'h'}, + {"flag-require", required_argument, NULL, 'f'}, + {"flag-filter", required_argument, NULL, 'F'}, + {"min-depth", required_argument, NULL, 'd'}, + {"output", required_argument, NULL, 'o'}, + {"pos-margin", required_argument, NULL, 'm'}, + {"use-sample-name", no_argument, NULL, 's'}, + {"max-amplicons", required_argument, NULL, 'a'}, + {"max-amplicon-length", required_argument, NULL, 'l'}, + {"tlen-adjust", required_argument, NULL, 't'}, + {"tcoord-min-count", required_argument, NULL, 'c'}, + {"tcoord-bin", required_argument, NULL, 'b'}, + {"depth-bin", required_argument, NULL, 'D'}, + {"single-ref", no_argument, NULL, 'S'}, + {NULL, 0, NULL, 0} + }; + int opt; + + while ( (opt=getopt_long(argc,argv,"?hf:F:@:p:m:d:sa:l:t:o:c:b:D:S",loptions,NULL))>0 ) { + switch (opt) { + case 'f': args.flag_require = bam_str2flag(optarg); break; + case 'F': + if (args.flag_filter & 0x10000) + args.flag_filter = 0; // strip default on first -F usage + args.flag_filter |= bam_str2flag(optarg); break; + + case 'm': args.max_delta = atoi(optarg); break; // margin + case 'D': args.depth_bin = atof(optarg); break; // depth bin fraction + case 'd': { + int d = 0; + char *cp = optarg, *ep; + do { + long n = strtol(cp, &ep, 10); + args.min_depth[d++] = n; + if (*ep != ',') + break; + cp = ep+1; + } while (d < MAX_DEPTH); + break; + } + + case 'a': args.max_amp = atoi(optarg)+1;break; + case 'l': args.max_amp_len = atoi(optarg)+1;break; + + case 'c': args.tcoord_min_count = atoi(optarg);break; + case 'b': + args.tcoord_bin = atoi(optarg); + if (args.tcoord_bin < 1) + args.tcoord_bin = 1; + break; + + case 't': args.tlen_adj = atoi(optarg);break; + + case 's': args.use_sample_name = 1;break; + + case 'o': + if (!(args.out_fp = fopen(optarg, "w"))) { + perror(optarg); + return 1; + } + break; + + case 'S': + args.multi_ref = 0; + break; + + case '?': return usage(&oargs, samtools_stderr, EXIT_FAILURE); + case 'h': return usage(&oargs, samtools_stdout, EXIT_SUCCESS); + + default: + if (parse_sam_global_opt(opt, optarg, loptions, &args.ga) != 0) + usage(&oargs,samtools_stderr, EXIT_FAILURE); + break; + } + } + + if (argc <= optind) + return usage(&oargs, samtools_stdout, EXIT_SUCCESS); + if (argc <= optind+1 && isatty(STDIN_FILENO)) + return usage(&oargs, samtools_stderr, EXIT_FAILURE); + + khash_t(bed_list_hash) *bed_hash = kh_init(bed_list_hash); + if (load_bed_file_multi_ref(argv[optind], 1, 0, bed_hash)) { + print_error_errno("ampliconstats", + "Could not read file \"%s\"", argv[optind]); + return 1; + + } + + khiter_t k, ref_count = 0; + for (k = kh_begin(bed_hash); k != kh_end(bed_hash); k++) { + if (!kh_exist(bed_hash, k)) + continue; + ref_count++; + } + if (ref_count == 0) + return 1; + if (ref_count > 1 && args.multi_ref == 0) { + print_error("ampliconstats", + "Single-ref mode is not permitted for BED files\n" + "containing more than one reference."); + return 1; + } + + args.argv = stringify_argv(argc, argv); + int ret; + if (argc == ++optind) { + char *av = "-"; + ret = amplicon_stats(&args, bed_hash, &av, 1); + } else { + ret = amplicon_stats(&args, bed_hash, &argv[optind], argc-optind); + } + + free(args.argv); + destroy_bed_hash(bed_hash); + + return ret; +} diff --git a/samtools/bam.c b/samtools/bam.c new file mode 100644 index 0000000..f847f89 --- /dev/null +++ b/samtools/bam.c @@ -0,0 +1,267 @@ +/* bam.c -- miscellaneous BAM functions. + + Copyright (C) 2008-2013, 2015, 2019-2020, 2022 Genome Research Ltd. + Portions copyright (C) 2009-2012 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include "bam.h" +#include "htslib/kstring.h" + +// FIXME: we should also check the LB tag associated with each alignment +const char *bam_get_library(sam_hdr_t *h, const bam1_t *b) +{ + const char *rg; + kstring_t lib = { 0, 0, NULL }; + rg = (char *)bam_aux_get(b, "RG"); + + if (!rg) + return NULL; + else + rg++; + + if (sam_hdr_find_tag_id(h, "RG", "ID", rg, "LB", &lib) < 0) + return NULL; + + static char LB_text[1024]; + int len = lib.l < sizeof(LB_text) - 1 ? lib.l : sizeof(LB_text) - 1; + + memcpy(LB_text, lib.s, len); + LB_text[len] = 0; + + free(lib.s); + + return LB_text; +} + +/************ + * Remove B * + ************/ + +#define bam1_seq_seti(s, i, c) ( (s)[(i)>>1] = ((s)[(i)>>1] & 0xf<<(((i)&1)<<2)) | (c)<<((~(i)&1)<<2) ) + +int bam_remove_B(bam1_t *b) +{ + int i, j, end_j, k, l, no_qual; + uint32_t *cigar, *new_cigar; + uint8_t *seq, *qual, *p; + // test if removal is necessary + if (b->core.flag & BAM_FUNMAP) return 0; // unmapped; do nothing + cigar = bam_get_cigar(b); + for (k = 0; k < b->core.n_cigar; ++k) + if (bam_cigar_op(cigar[k]) == BAM_CBACK) break; + if (k == b->core.n_cigar) return 0; // no 'B' + if (bam_cigar_op(cigar[0]) == BAM_CBACK) goto rmB_err; // cannot be removed + // allocate memory for the new CIGAR + if (b->l_data + (b->core.n_cigar + 1) * 4 > b->m_data) { // not enough memory + b->m_data = b->l_data + b->core.n_cigar * 4; + kroundup32(b->m_data); + b->data = (uint8_t*)realloc(b->data, b->m_data); + cigar = bam_get_cigar(b); // after realloc, cigar may be changed + } + new_cigar = (uint32_t*)(b->data + (b->m_data - b->core.n_cigar * 4)); // from the end of b->data + // the core loop + seq = bam_get_seq(b); qual = bam_get_qual(b); + no_qual = (qual[0] == 0xff); // test whether base quality is available + i = j = 0; end_j = -1; + for (k = l = 0; k < b->core.n_cigar; ++k) { + int op = bam_cigar_op(cigar[k]); + int len = bam_cigar_oplen(cigar[k]); + if (op == BAM_CBACK) { // the backward operation + int t, u; + if (k == b->core.n_cigar - 1) break; // ignore 'B' at the end of CIGAR + if (len > j) goto rmB_err; // an excessively long backward + for (t = l - 1, u = 0; t >= 0; --t) { // look back + int op1 = bam_cigar_op(new_cigar[t]); + int len1 = bam_cigar_oplen(new_cigar[t]); + if (bam_cigar_type(op1)&1) { // consume the query + if (u + len1 >= len) { // stop + new_cigar[t] -= (len - u) << BAM_CIGAR_SHIFT; + break; + } else u += len1; + } + } + if (bam_cigar_oplen(new_cigar[t]) == 0) --t; // squeeze out the zero-length operation + l = t + 1; + end_j = j; j -= len; + } else { // other CIGAR operations + new_cigar[l++] = cigar[k]; + if (bam_cigar_type(op)&1) { // consume the query + if (i != j) { // no need to copy if i == j + int u, c, c0; + for (u = 0; u < len; ++u) { // construct the consensus + c = bam_seqi(seq, i+u); + if (j + u < end_j) { // in an overlap + c0 = bam_seqi(seq, j+u); + if (c != c0) { // a mismatch; choose the better base + if (qual[j+u] < qual[i+u]) { // the base in the 2nd segment is better + bam1_seq_seti(seq, j+u, c); + qual[j+u] = qual[i+u] - qual[j+u]; + } else qual[j+u] -= qual[i+u]; // the 1st is better; reduce base quality + } else qual[j+u] = qual[j+u] > qual[i+u]? qual[j+u] : qual[i+u]; + } else { // not in an overlap; copy over + bam1_seq_seti(seq, j+u, c); + qual[j+u] = qual[i+u]; + } + } + } + i += len, j += len; + } + } + } + if (no_qual) qual[0] = 0xff; // in very rare cases, this may be modified + // merge adjacent operations if possible + for (k = 1; k < l; ++k) + if (bam_cigar_op(new_cigar[k]) == bam_cigar_op(new_cigar[k-1])) + new_cigar[k] += new_cigar[k-1] >> BAM_CIGAR_SHIFT << BAM_CIGAR_SHIFT, new_cigar[k-1] &= 0xf; + // kill zero length operations + for (k = i = 0; k < l; ++k) + if (new_cigar[k] >> BAM_CIGAR_SHIFT) + new_cigar[i++] = new_cigar[k]; + l = i; + // update b + memcpy(cigar, new_cigar, l * 4); // set CIGAR + p = b->data + b->core.l_qname + l * 4; + memmove(p, seq, (j+1)>>1); p += (j+1)>>1; // set SEQ + memmove(p, qual, j); p += j; // set QUAL + memmove(p, bam_get_aux(b), bam_get_l_aux(b)); p += bam_get_l_aux(b); // set optional fields + b->core.n_cigar = l, b->core.l_qseq = j; // update CIGAR length and query length + b->l_data = p - b->data; // update record length + return 0; + +rmB_err: + b->core.flag |= BAM_FUNMAP; + return -1; +} + +/* Calculate the current read's start based on the stored cigar string. */ +hts_pos_t unclipped_start(bam1_t *b) { + uint32_t *cigar = bam_get_cigar(b); + int64_t clipped = 0; + uint32_t i; + + for (i = 0; i < b->core.n_cigar; i++) { + char c = bam_cigar_opchr(cigar[i]); + + if (c == 'S' || c == 'H') { // clips + clipped += bam_cigar_oplen(cigar[i]); + } else { + break; + } + } + + return b->core.pos - clipped + 1; +} + +/* Calculate the mate's unclipped start based on position and cigar string from MC tag. */ +hts_pos_t unclipped_other_start(hts_pos_t op, char *cigar) { + char *c = cigar; + int64_t clipped = 0; + + while (*c && *c != '*') { + long num = 0; + + if (isdigit((int)*c)) { + num = strtol(c, &c, 10); + } else { + num = 1; + } + + if (*c == 'S' || *c == 'H') { // clips + clipped += num; + } else { + break; + } + + c++; + } + + return op - clipped + 1; +} + +/* Calculate the current read's end based on the stored cigar string. */ +hts_pos_t unclipped_end(bam1_t *b) { + uint32_t *cigar = bam_get_cigar(b); + hts_pos_t end_pos, clipped = 0; + int32_t i; + + end_pos = bam_endpos(b); + + // now get the clipped end bases (if any) + // if we get to the beginning of the cigar string + // without hitting a non-clip then the results are meaningless + for (i = b->core.n_cigar - 1; i >= 0; i--) { + char c = bam_cigar_opchr(cigar[i]); + + if (c == 'S' || c == 'H') { // clips + clipped += bam_cigar_oplen(cigar[i]); + } else { + break; + } + } + + return end_pos + clipped; +} + + +/* Calculate the mate's unclipped end based on start position and cigar string from MC tag.*/ +hts_pos_t unclipped_other_end(int64_t op, char *cigar) { + char *c = cigar; + int64_t refpos = 0; + int skip = 1; + + while (*c && *c != '*') { + long num = 0; + + if (isdigit((int)*c)) { + num = strtol(c, &c, 10); + } else { + num = 1; + } + + switch (*c) { + case 'M': + case 'D': + case 'N': + case '=': + case 'X': + refpos += num; + skip = 0; // ignore initial clips + break; + + case 'S': + case 'H': + if (!skip) { + refpos += num; + } + break; + } + + c++; + } + + return op + refpos; +} diff --git a/samtools/bam.c.pysam.c b/samtools/bam.c.pysam.c new file mode 100644 index 0000000..4f235ed --- /dev/null +++ b/samtools/bam.c.pysam.c @@ -0,0 +1,269 @@ +#include "samtools.pysam.h" + +/* bam.c -- miscellaneous BAM functions. + + Copyright (C) 2008-2013, 2015, 2019-2020, 2022 Genome Research Ltd. + Portions copyright (C) 2009-2012 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include "bam.h" +#include "htslib/kstring.h" + +// FIXME: we should also check the LB tag associated with each alignment +const char *bam_get_library(sam_hdr_t *h, const bam1_t *b) +{ + const char *rg; + kstring_t lib = { 0, 0, NULL }; + rg = (char *)bam_aux_get(b, "RG"); + + if (!rg) + return NULL; + else + rg++; + + if (sam_hdr_find_tag_id(h, "RG", "ID", rg, "LB", &lib) < 0) + return NULL; + + static char LB_text[1024]; + int len = lib.l < sizeof(LB_text) - 1 ? lib.l : sizeof(LB_text) - 1; + + memcpy(LB_text, lib.s, len); + LB_text[len] = 0; + + free(lib.s); + + return LB_text; +} + +/************ + * Remove B * + ************/ + +#define bam1_seq_seti(s, i, c) ( (s)[(i)>>1] = ((s)[(i)>>1] & 0xf<<(((i)&1)<<2)) | (c)<<((~(i)&1)<<2) ) + +int bam_remove_B(bam1_t *b) +{ + int i, j, end_j, k, l, no_qual; + uint32_t *cigar, *new_cigar; + uint8_t *seq, *qual, *p; + // test if removal is necessary + if (b->core.flag & BAM_FUNMAP) return 0; // unmapped; do nothing + cigar = bam_get_cigar(b); + for (k = 0; k < b->core.n_cigar; ++k) + if (bam_cigar_op(cigar[k]) == BAM_CBACK) break; + if (k == b->core.n_cigar) return 0; // no 'B' + if (bam_cigar_op(cigar[0]) == BAM_CBACK) goto rmB_err; // cannot be removed + // allocate memory for the new CIGAR + if (b->l_data + (b->core.n_cigar + 1) * 4 > b->m_data) { // not enough memory + b->m_data = b->l_data + b->core.n_cigar * 4; + kroundup32(b->m_data); + b->data = (uint8_t*)realloc(b->data, b->m_data); + cigar = bam_get_cigar(b); // after realloc, cigar may be changed + } + new_cigar = (uint32_t*)(b->data + (b->m_data - b->core.n_cigar * 4)); // from the end of b->data + // the core loop + seq = bam_get_seq(b); qual = bam_get_qual(b); + no_qual = (qual[0] == 0xff); // test whether base quality is available + i = j = 0; end_j = -1; + for (k = l = 0; k < b->core.n_cigar; ++k) { + int op = bam_cigar_op(cigar[k]); + int len = bam_cigar_oplen(cigar[k]); + if (op == BAM_CBACK) { // the backward operation + int t, u; + if (k == b->core.n_cigar - 1) break; // ignore 'B' at the end of CIGAR + if (len > j) goto rmB_err; // an excessively long backward + for (t = l - 1, u = 0; t >= 0; --t) { // look back + int op1 = bam_cigar_op(new_cigar[t]); + int len1 = bam_cigar_oplen(new_cigar[t]); + if (bam_cigar_type(op1)&1) { // consume the query + if (u + len1 >= len) { // stop + new_cigar[t] -= (len - u) << BAM_CIGAR_SHIFT; + break; + } else u += len1; + } + } + if (bam_cigar_oplen(new_cigar[t]) == 0) --t; // squeeze out the zero-length operation + l = t + 1; + end_j = j; j -= len; + } else { // other CIGAR operations + new_cigar[l++] = cigar[k]; + if (bam_cigar_type(op)&1) { // consume the query + if (i != j) { // no need to copy if i == j + int u, c, c0; + for (u = 0; u < len; ++u) { // construct the consensus + c = bam_seqi(seq, i+u); + if (j + u < end_j) { // in an overlap + c0 = bam_seqi(seq, j+u); + if (c != c0) { // a mismatch; choose the better base + if (qual[j+u] < qual[i+u]) { // the base in the 2nd segment is better + bam1_seq_seti(seq, j+u, c); + qual[j+u] = qual[i+u] - qual[j+u]; + } else qual[j+u] -= qual[i+u]; // the 1st is better; reduce base quality + } else qual[j+u] = qual[j+u] > qual[i+u]? qual[j+u] : qual[i+u]; + } else { // not in an overlap; copy over + bam1_seq_seti(seq, j+u, c); + qual[j+u] = qual[i+u]; + } + } + } + i += len, j += len; + } + } + } + if (no_qual) qual[0] = 0xff; // in very rare cases, this may be modified + // merge adjacent operations if possible + for (k = 1; k < l; ++k) + if (bam_cigar_op(new_cigar[k]) == bam_cigar_op(new_cigar[k-1])) + new_cigar[k] += new_cigar[k-1] >> BAM_CIGAR_SHIFT << BAM_CIGAR_SHIFT, new_cigar[k-1] &= 0xf; + // kill zero length operations + for (k = i = 0; k < l; ++k) + if (new_cigar[k] >> BAM_CIGAR_SHIFT) + new_cigar[i++] = new_cigar[k]; + l = i; + // update b + memcpy(cigar, new_cigar, l * 4); // set CIGAR + p = b->data + b->core.l_qname + l * 4; + memmove(p, seq, (j+1)>>1); p += (j+1)>>1; // set SEQ + memmove(p, qual, j); p += j; // set QUAL + memmove(p, bam_get_aux(b), bam_get_l_aux(b)); p += bam_get_l_aux(b); // set optional fields + b->core.n_cigar = l, b->core.l_qseq = j; // update CIGAR length and query length + b->l_data = p - b->data; // update record length + return 0; + +rmB_err: + b->core.flag |= BAM_FUNMAP; + return -1; +} + +/* Calculate the current read's start based on the stored cigar string. */ +hts_pos_t unclipped_start(bam1_t *b) { + uint32_t *cigar = bam_get_cigar(b); + int64_t clipped = 0; + uint32_t i; + + for (i = 0; i < b->core.n_cigar; i++) { + char c = bam_cigar_opchr(cigar[i]); + + if (c == 'S' || c == 'H') { // clips + clipped += bam_cigar_oplen(cigar[i]); + } else { + break; + } + } + + return b->core.pos - clipped + 1; +} + +/* Calculate the mate's unclipped start based on position and cigar string from MC tag. */ +hts_pos_t unclipped_other_start(hts_pos_t op, char *cigar) { + char *c = cigar; + int64_t clipped = 0; + + while (*c && *c != '*') { + long num = 0; + + if (isdigit((int)*c)) { + num = strtol(c, &c, 10); + } else { + num = 1; + } + + if (*c == 'S' || *c == 'H') { // clips + clipped += num; + } else { + break; + } + + c++; + } + + return op - clipped + 1; +} + +/* Calculate the current read's end based on the stored cigar string. */ +hts_pos_t unclipped_end(bam1_t *b) { + uint32_t *cigar = bam_get_cigar(b); + hts_pos_t end_pos, clipped = 0; + int32_t i; + + end_pos = bam_endpos(b); + + // now get the clipped end bases (if any) + // if we get to the beginning of the cigar string + // without hitting a non-clip then the results are meaningless + for (i = b->core.n_cigar - 1; i >= 0; i--) { + char c = bam_cigar_opchr(cigar[i]); + + if (c == 'S' || c == 'H') { // clips + clipped += bam_cigar_oplen(cigar[i]); + } else { + break; + } + } + + return end_pos + clipped; +} + + +/* Calculate the mate's unclipped end based on start position and cigar string from MC tag.*/ +hts_pos_t unclipped_other_end(int64_t op, char *cigar) { + char *c = cigar; + int64_t refpos = 0; + int skip = 1; + + while (*c && *c != '*') { + long num = 0; + + if (isdigit((int)*c)) { + num = strtol(c, &c, 10); + } else { + num = 1; + } + + switch (*c) { + case 'M': + case 'D': + case 'N': + case '=': + case 'X': + refpos += num; + skip = 0; // ignore initial clips + break; + + case 'S': + case 'H': + if (!skip) { + refpos += num; + } + break; + } + + c++; + } + + return op + refpos; +} diff --git a/samtools/bam.h b/samtools/bam.h new file mode 100644 index 0000000..c0b43d5 --- /dev/null +++ b/samtools/bam.h @@ -0,0 +1,39 @@ +/* bam.h -- miscellaneous BAM functions. + + Copyright (C) 2008-2014, 2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef BAM_BAM_H +#define BAM_BAM_H + +#include "htslib/sam.h" + +int bam_remove_B(bam1_t *b); + +const char *bam_get_library(sam_hdr_t *header, const bam1_t *b); + +hts_pos_t unclipped_start(bam1_t *b); +hts_pos_t unclipped_other_start(hts_pos_t op, char *cigar); +hts_pos_t unclipped_end(bam1_t *b); +hts_pos_t unclipped_other_end(int64_t op, char *cigar); + +#endif diff --git a/samtools/bam2depth.c b/samtools/bam2depth.c new file mode 100644 index 0000000..098d3ae --- /dev/null +++ b/samtools/bam2depth.c @@ -0,0 +1,973 @@ +/* bam2depth.c -- depth subcommand. + + Copyright (C) 2011, 2012 Broad Institute. + Copyright (C) 2012-2016, 2018, 2019-2022 Genome Research Ltd. + + Author: Heng Li (to 2020) + Author: James Bonfield (2021 rewrite) + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* This program demonstrates how to generate pileup from multiple BAMs + * simultaneously, to achieve random access and to use the BED interface. + * To compile this program separately, you may: + * + * gcc -g -O2 -Wall -o bam2depth -D_MAIN_BAM2DEPTH bam2depth.c -lhts -lz + */ + +#include + +#include +#include +#include +#include +#include +#include "htslib/sam.h" +#include "samtools.h" +#include "bedidx.h" +#include "sam_opts.h" +#include "htslib/khash.h" + +// From bam_plcmd.c +int read_file_list(const char *file_list, int *n, char **argv[]); + +// We accumulate to hist[pos & (size-1)]. This is a ring-buffer. +// We track where we last got to in output and what the biggest value +// we've written to so far (in absolute unmasked coordinates) in +// "last_output" and "end_pos" respectively. +// For each new record we just flush anything we haven't written yet +// already, between "last_output" and this read's start position, and +// initialise any newly seen positions between "end_pos" and this read's +// end position. +typedef struct { + size_t size; + int **hist; // hist[nfiles][size] + hts_pos_t *end_pos; // end_pos[nfiles] + hts_pos_t last_output; + int last_ref; + int nfiles; + const char *ref; + kstring_t ks; + hts_pos_t beg, end; // limit to region + int tid; +} depth_hist; + +typedef struct { + int header; + int flag; + int min_qual; + int min_mqual; + int min_len; + int skip_del; + int all_pos; + int remove_overlaps; + FILE *out; + char *reg; + void *bed; +} depth_opt; + +static void zero_region(depth_opt *opt, depth_hist *dh, + const char *name, hts_pos_t start, hts_pos_t end) { + hts_pos_t i; + kstring_t *ks = &dh->ks; + + kputs(name, ks_clear(ks)); + kputc('\t', ks); + size_t cur_l = ks->l; + if (dh->beg >= 0 && start < dh->beg) + start = dh->beg; + if (dh->end >= 0 && end > dh->end) + end = dh->end; + + for (i = start; i < end; i++) { + // Could be optimised, but needs better API to skip to next + // bed region. + if (opt->bed && bed_overlap(opt->bed, name, i, i+1) == 0) + continue; + + ks->l = cur_l; + kputll(i+1, ks); + int n; + for (n = 0; n < dh->nfiles; n++) { + kputc_('\t', ks); + kputc_('0', ks); + } + kputc('\n', ks); + fputs(ks->s, opt->out); + } + ks->l = cur_l; +} + +// A variation of bam_cigar2qlen which doesn't count soft-clips in to the +// equation. Basically it's the number of bases in query that are aligned +// in some way to the reference (including insertions, which are considered +// to be aligned by dint of being anchored either side). +hts_pos_t qlen_used(bam1_t *b) { + int n_cigar = b->core.n_cigar; + const uint32_t *cigar = bam_get_cigar(b); + + hts_pos_t l; + + if (b->core.l_qseq) { + // Known SEQ permits of short cut of l_qseq minus CSOFT_CLIPs. + // Full scan not needed, which helps on excessively long CIGARs. + l = b->core.l_qseq; + int kl, kr; + for (kl = 0; kl < n_cigar; kl++) + if (bam_cigar_op(cigar[kl]) == BAM_CSOFT_CLIP) + l -= bam_cigar_oplen(cigar[kl]); + else + break; + + for (kr = n_cigar-1; kr > kl; kr--) + if (bam_cigar_op(cigar[kr]) == BAM_CSOFT_CLIP) + l -= bam_cigar_oplen(cigar[kr]); + else + break; + } else { + // Unknown SEQ ("*") needs a full scan through the CIGAR string. + static int query[16] = { + //M I D N S H P = X B ? ? ? ? ? ? + 1,1,0,0, 0,0,0,1, 1,0,0,0, 0,0,0,0 + }; + int k; + for (k = l = 0; k < n_cigar; k++) + if (query[bam_cigar_op(cigar[k])]) + l += bam_cigar_oplen(cigar[k]); + } + return l; + +} + +// Adds the depth for a single read to a depth_hist struct. +// For just one file, this is easy. We just have a circular buffer +// where we increment values for bits that overlap existing data +// and initialise values for coordinates which we're seeing for the first +// time. This is tracked by "end_pos" to know where we've got to. +// +// As the input is sorted, we can flush output from "last_output" to +// b->core.pos. +// +// With multiple files, we must feed data in sorted order as if all files +// are merged, but track depth per file. This also means "end_pos" is per +// file too, but "last_output" is global as it corresponds to rows printed. +static int add_depth(depth_opt *opt, depth_hist *dh, sam_hdr_t *h, bam1_t *b, + int overlap_clip, int file) { + hts_pos_t i; + size_t hmask = dh->size-1; + int n; + + if (!b || b->core.tid != dh->last_ref) { + // New ref + if (dh->last_ref >= 0) { + // do end + size_t cur_l = dh->ks.l; + int nf = dh->nfiles; + i = dh->last_output; + for (i = dh->last_output; nf; i++) { + nf = 0; + for (n = 0; n < dh->nfiles; n++) { + if (i < dh->end_pos[n]) + nf++; + } + if (!nf) + break; + + if (opt->bed && bed_overlap(opt->bed, dh->ref, i, i+1) == 0) + continue; + + dh->ks.l = cur_l; + kputll(i+1, &dh->ks); + for (n = 0; n < dh->nfiles; n++) { + kputc_('\t', &dh->ks); + int d = i < dh->end_pos[n] + ? dh->hist[n][i & hmask] + : 0; + kputuw(d, &dh->ks); + } + kputc('\n', &dh->ks); + fputs(dh->ks.s, opt->out); + } + if (opt->all_pos) { + // End of last ref + zero_region(opt, dh, + sam_hdr_tid2name(h, dh->last_ref), + i, sam_hdr_tid2len(h, dh->last_ref)); + } + dh->ks.l = cur_l; + } + + if (opt->all_pos > 1 && !opt->reg) { + // Any previous unused refs + int lr = dh->last_ref < 0 ? 0 : dh->last_ref+1; + int rr = b ? b->core.tid : sam_hdr_nref(h), r; + for (r = lr; r < rr; r++) + zero_region(opt, dh, + sam_hdr_tid2name(h, r), + 0, sam_hdr_tid2len(h, r)); + } + + if (!b) { + // we're just flushing to end of file + if (opt->all_pos && opt->reg && dh->last_ref < 0) + // -a or -aa without a single read being output yet + zero_region(opt, dh, sam_hdr_tid2name(h, dh->tid), dh->beg, + MIN(dh->end, sam_hdr_tid2len(h, dh->tid))); + + return 0; + } + + for (n = 0; dh->end_pos && n < dh->nfiles; n++) + dh->end_pos[n] = 0; + dh->last_output = dh->beg >= 0 + ? MAX(b->core.pos, dh->beg) + : b->core.pos; + dh->last_ref = b->core.tid; + dh->ref = sam_hdr_tid2name(h, b->core.tid); + kputs(dh->ref, ks_clear(&dh->ks)); + kputc('\t', &dh->ks); + + if (opt->all_pos) + // Start of ref + zero_region(opt, dh, dh->ref, 0, b->core.pos); + } else { + if (dh->last_output < b->core.pos) { + // Flush any depth outputs up to start of new read + size_t cur_l = dh->ks.l; + int nf = dh->nfiles; + for (i = dh->last_output; i < b->core.pos; i++) { + nf = 0; + for (n = 0; n < dh->nfiles; n++) { + if (i < dh->end_pos[n]) + nf++; + } + if (!nf) + break; + + if (opt->bed && bed_overlap(opt->bed, dh->ref, i, i+1) == 0) + continue; + + dh->ks.l = cur_l; + kputll(i+1, &dh->ks); + for (n = 0; n < dh->nfiles; n++) { + kputc_('\t', &dh->ks); + int d = i < dh->end_pos[n] + ? dh->hist[n][i & hmask] + : 0; + kputuw(d, &dh->ks); + } + kputc('\n', &dh->ks); + fputs(dh->ks.s, opt->out); + } + if (opt->all_pos && i < b->core.pos) + // Hole in middle of ref + zero_region(opt, dh, dh->ref, i, b->core.pos); + + dh->ks.l = cur_l; + dh->last_output = b->core.pos; + } + } + + hts_pos_t end_pos = bam_endpos(b); // 0 based, 1 past end. + //printf("%d %d\n", (int)b->core.pos+1, (int)end_pos); + + if (b->core.tid < dh->last_ref || + (dh->last_ref == b->core.tid && end_pos < dh->last_output)) { + print_error_errno("depth", "Data is not position sorted"); + return -1; + } + + // If needed, grow the circular buffer. + if (end_pos+1 - b->core.pos >= dh->size) { + size_t old_size = dh->size; + size_t old_hmask = hmask; + while (end_pos+1 - b->core.pos >= dh->size) + dh->size = dh->size ? 2*dh->size : 2048; + hmask = dh->size-1; + if (!dh->hist) { + dh->hist = calloc(dh->nfiles, sizeof(*dh->hist)); + dh->end_pos = calloc(dh->nfiles, sizeof(*dh->end_pos)); + if (!dh->hist || !dh->end_pos) + return -1; + } + for (n = 0; n < dh->nfiles; n++) { + int *hist = calloc(dh->size, sizeof(*dh->hist[n])); + if (!hist) + return -1; + + // Simple approach for now; copy over old histogram verbatim. + for (i = dh->last_output; i < dh->last_output + old_size; i++) + hist[i & hmask] = dh->hist[n][i & old_hmask]; + free(dh->hist[n]); + dh->hist[n] = hist; + } + } + + // Accumulate depth, based on CIGAR + uint32_t *cig = bam_get_cigar(b); + int ncig = b->core.n_cigar, j, k, spos = 0; + + // Zero new (previously unseen) coordinates so increment works later. + hts_pos_t end = MAX(dh->end_pos[file], b->core.pos); + if (end_pos > end && (end & hmask) < (end_pos & hmask)) { + memset(&dh->hist[file][end & hmask], 0, + sizeof(**dh->hist) * (end_pos - end)); + } else { + for (i = end; i < end_pos; i++) + dh->hist[file][i & hmask] = 0; + } + + i = b->core.pos; + uint8_t *qual = bam_get_qual(b); + int min_qual = opt->min_qual; + for (j = 0; j < ncig; j++) { + int op = bam_cigar_op(cig[j]); + int oplen = bam_cigar_oplen(cig[j]); + + switch (op) { + case BAM_CDEL: + case BAM_CREF_SKIP: + if (op != BAM_CDEL || opt->skip_del) { + // don't increment reference location + if (i + oplen >= dh->end_pos[file]) { + for (k = 0; k < oplen; k++, i++) { + if (i >= dh->end_pos[file]) + // redundant due to zero new elements above? + dh->hist[file][i & hmask] = 0; + } + } else { + i += oplen; + } + } else { // op == BAM_CDEL and we count them (-J option), + // We don't incr spos here, but we still use qual. + // This doesn't make much sense, but it's for compatibility + // with the old code. Arguably DEL shouldn't have a min + // qual and should always pass (as we've explicitly asked to + // include them). + int *hist = dh->hist[file]; + k = 0; + if (overlap_clip) { + if (i+oplen < overlap_clip) { + i += oplen; + break; + } else if (i < overlap_clip) { + k = overlap_clip - i; + i = overlap_clip; + } + } + + // Question: should we even check quality values for DEL? + // We've explicitly asked to include them, and the quality + // is wrong anyway (it's the neighbouring base). We do this + // for now for compatibility with the old depth command. + + if (spos < b->core.l_qseq) + for (; k < oplen; k++, i++) + hist[i & hmask]+=qual[spos]>=min_qual; + else + for (; k < oplen; k++, i++) + hist[i & hmask]++; + } + break; + + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + if ((i & hmask) < ((i+oplen) & hmask)) { + // Optimisation when not wrapping around + + // Unrolling doesn't help clang, but helps gcc, + // especially when not using -O3. + int *hist = &dh->hist[file][i & hmask]; + if (min_qual || overlap_clip) { + k = 0; + if (overlap_clip) { + if (i+oplen < overlap_clip) { + i += oplen; + spos += oplen; + break; + } else if (i < overlap_clip) { + oplen -= overlap_clip - i; + spos += overlap_clip - i; + hist += overlap_clip - i; + i = overlap_clip; + } + } + + // approx 50% of this func cpu time in this loop + for (; k < (oplen & ~7); k+=8) { + hist[k+0]+=qual[spos+0]>=min_qual; + hist[k+1]+=qual[spos+1]>=min_qual; + hist[k+2]+=qual[spos+2]>=min_qual; + hist[k+3]+=qual[spos+3]>=min_qual; + hist[k+4]+=qual[spos+4]>=min_qual; + hist[k+5]+=qual[spos+5]>=min_qual; + hist[k+6]+=qual[spos+6]>=min_qual; + hist[k+7]+=qual[spos+7]>=min_qual; + spos += 8; + } + } else { + // easier to vectorize when no min_qual + for (k = 0; k < (oplen & ~7); k+=8) { + hist[k+0]++; + hist[k+1]++; + hist[k+2]++; + hist[k+3]++; + hist[k+4]++; + hist[k+5]++; + hist[k+6]++; + hist[k+7]++; + } + spos += k; + } + for (; k < oplen && spos < b->core.l_qseq; k++, spos++) + hist[k]+=qual[spos]>=min_qual; + for (; k < oplen; k++, spos++) + hist[k]++; + i += oplen; + } else { + // Simple to understand case, but slower. + // We use this only for reads with wrap-around. + int *hist = dh->hist[file]; + k = 0; + if (overlap_clip) { + if (i+oplen < overlap_clip) { + i += oplen; + break; + } else if (i < overlap_clip) { + oplen -= overlap_clip - i; + spos += overlap_clip - i; + i = overlap_clip; + } + } + for (; k < oplen && spos < b->core.l_qseq; k++, i++, spos++) + hist[i & hmask]+=qual[spos]>=min_qual; + for (; k < oplen; k++, i++, spos++) + hist[i & hmask]++; + } + break; + + case BAM_CINS: + case BAM_CSOFT_CLIP: + spos += oplen; + break; + + case BAM_CPAD: + case BAM_CHARD_CLIP: + // ignore + break; + + default: + print_error("depth", "Unsupported cigar op '%d'", op); + return -1; + } + } + + if (dh->end >= 0 && end_pos > dh->end) + end_pos = dh->end; + if (dh->end_pos[file] < end_pos) + dh->end_pos[file] = end_pos; + + return 0; +} + +// Hash on name -> alignment end pos. This permits a naive overlap removal. +// Note it cannot analyse the overlapping sequence and qualities, so the +// interaction of basecalls/qualities and the -Q parameter cannot be +// applied here (unlike the full mpileup algorithm). +KHASH_MAP_INIT_STR(olap_hash, hts_pos_t) +typedef khash_t(olap_hash) olap_hash_t; + +static int fastdepth_core(depth_opt *opt, uint32_t nfiles, char **fn, + samFile **fp, hts_itr_t **itr, sam_hdr_t **h) { + int ret = -1, err = 1, i; + olap_hash_t **overlaps = NULL; + depth_hist dh = {0}; + + // An array of bam structs, one per input file, to hold the next entry + bam1_t **b = calloc(nfiles, sizeof(*b)); + int *finished = calloc(nfiles, sizeof(*finished)), to_go = nfiles; + if (!b || !finished) + goto err; + + for (i = 0; i < nfiles; i++) + if (!(b[i] = bam_init1())) + goto err; + + // Do we need one overlap hash per file? Or shared? + if (opt->remove_overlaps) { + if (!(overlaps = calloc(nfiles, sizeof(*overlaps)))) + return -1; + for (i = 0; i < nfiles; i++) { + if (!(overlaps[i] = kh_init(olap_hash))) + return -1; + } + } + + // Create the initial histogram + dh.nfiles = nfiles; + dh.size = 0; + dh.hist = NULL; + dh.last_ref = -99; + dh.end_pos = NULL; + dh.last_output = itr && itr[0] ? itr[0]->beg : 0; + ks_initialize(&dh.ks); + + // Clip results to region if specified + dh.beg = -1; + dh.end = -1; + dh.tid = 0; + if (itr && itr[0]) { + dh.tid = itr[0]->tid; + dh.beg = itr[0]->beg; + dh.end = itr[0]->end; + } + + if (opt->header) { + fprintf(opt->out, "#CHROM\tPOS"); + for (i = 0; i < nfiles; i++) + fprintf(opt->out, "\t%s", fn[i]); + fputc('\n', opt->out); + } + + // Populate first record per file + for (i = 0; i < nfiles; i++) { + for(;;) { + ret = itr && itr[i] + ? sam_itr_next(fp[i], itr[i], b[i]) + : sam_read1(fp[i], h[i], b[i]); + if (ret < -1) + goto err; + if (ret == -1) { + to_go--; + finished[i] = 1; + break; + } + + if (b[i]->core.tid < 0) + continue; + if (b[i]->core.flag & opt->flag) + continue; + if (b[i]->core.qual < opt->min_mqual) + continue; + + // Original samtools depth used the total sequence (l_qseq) + // including soft-clips. This doesn't feel like a useful metric + // to be filtering on. We now only count sequence bases that + // form the used part of the alignment. + if (opt->min_len) { + if (qlen_used(b[i]) < opt->min_len) + continue; + } + + break; + } + } + + // Loop through input files, merging in order so we're + // always adding the next record in sequence + while (to_go) { + // Find next record in file list + int best_tid = INT_MAX, best_file = 0; + hts_pos_t best_pos = HTS_POS_MAX; + + for (i = 0; i < nfiles; i++) { + if (finished[i]) + continue; + if (best_tid > b[i]->core.tid) { + best_tid = b[i]->core.tid; + best_pos = b[i]->core.pos; + best_file = i; + } else if (best_tid == b[i]->core.tid && + best_pos > b[i]->core.pos) { + best_pos = b[i]->core.pos; + best_file = i; + } + } + i = best_file; + + hts_pos_t clip = 0; + if (overlaps && (b[i]->core.flag & BAM_FPAIRED) && + !(b[i]->core.flag & BAM_FMUNMAP)) { + khiter_t k = kh_get(olap_hash, overlaps[i], bam_get_qname(b[i])); + if (k == kh_end(overlaps[i])) { + // not seen before + hts_pos_t endpos = bam_endpos(b[i]); + + // Don't add if mate location is known and can't overlap. + if (b[i]->core.mpos == -1 || + (b[i]->core.tid == b[i]->core.mtid && + b[i]->core.mpos <= endpos)) { + k = kh_put(olap_hash, overlaps[i], bam_get_qname(b[i]), + &ret); + if (ret < 0) + return -1; + kh_key(overlaps[i], k) = strdup(bam_get_qname(b[i])); + kh_value(overlaps[i], k) = endpos; + } + } else { + // seen before + clip = kh_value(overlaps[i], k); + free((char *)kh_key(overlaps[i], k)); + kh_del(olap_hash, overlaps[i], k); + } + } + + // Add the next merged BAM record to the depth plot + if ((ret = add_depth(opt, &dh, h[i], b[i], clip, i)) < 0) { + ret = -1; + goto err; + } + + // Populate next record from this file + for(;!finished[i];) { + ret = itr && itr[i] + ? sam_itr_next(fp[i], itr[i], b[i]) + : sam_read1(fp[i], h[i], b[i]); + if (ret < -1) { + ret = -1; + goto err; + } + if (ret == -1) { + to_go--; + finished[i] = 1; + break; + } + + if (b[i]->core.tid < 0) + continue; + if (b[i]->core.flag & opt->flag) + continue; + if (b[i]->core.qual < opt->min_mqual) + continue; + + if (opt->min_len) { + if (qlen_used(b[i]) < opt->min_len) + continue; + } + + break; + } + } + + // Tidy up end. + ret = add_depth(opt, &dh, h[0], NULL, 0, 0); + err = 0; + + err: + if (ret == 0 && err) + ret = -1; + + for (i = 0; i < nfiles; i++) { + if (b[i]) + bam_destroy1(b[i]); + if (dh.hist && dh.hist[i]) + free(dh.hist[i]); + } + free(b); + free(finished); + ks_free(&dh.ks); + free(dh.hist); + free(dh.end_pos); + if (overlaps) { + khiter_t k; + for (i = 0; i < nfiles; i++) { + if (!overlaps[i]) + continue; + for (k = kh_begin(overlaps[i]); k < kh_end(overlaps[i]); k++) + if (kh_exist(overlaps[i], k)) + free((char *)kh_key(overlaps[i], k)); + kh_destroy(olap_hash, overlaps[i]); + } + free(overlaps); + } + + return ret; +} + +static void usage_exit(FILE *fp, int exit_status) +{ + fprintf(fp, "Usage: samtools depth [options] in.bam [in.bam ...]\n"); + fprintf(fp, "\nOptions:\n"); + fprintf(fp, " -a Output all positions (including zero depth)\n"); + fprintf(fp, " -a -a, -aa Output absolutely all positions, including unused ref seqs\n"); + fprintf(fp, " -r REG Specify a region in chr or chr:from-to syntax\n"); + fprintf(fp, " -b FILE Use bed FILE for list of regions\n"); + fprintf(fp, " -f FILE Specify list of input BAM/SAM/CRAM filenames\n"); + fprintf(fp, " -X Use custom index files (in -X *.bam *.bam.bai order)\n"); + fprintf(fp, " -g INT Remove specified flags from default flag filter\n"); + fprintf(fp, " -G INT Add specified flags to the default flag filter\n"); + fprintf(fp, " -H Print a file header line\n"); + fprintf(fp, " -l INT Minimum read length [0]\n"); + fprintf(fp, " -o FILE Write output to FILE [stdout]\n"); + fprintf(fp, " -q, --min-BQ INT\n" + " Filter bases with base quality smaller than INT [0]\n"); + fprintf(fp, " -Q, --min-MQ INT\n" + " Filter alignments with mapping quality smaller than INT [0]\n"); + fprintf(fp, " -H Print a file header\n"); + fprintf(fp, " -J Include reads with deletions in depth computation\n"); + fprintf(fp, " -s Do not count overlapping reads within a template\n"); + sam_global_opt_help(fp, "-.--.@-."); + exit(exit_status); +} + +int main_depth(int argc, char *argv[]) +{ + int nfiles, i; + samFile **fp; + sam_hdr_t **header; + int c, has_index_file = 0; + char *file_list = NULL, **fn = NULL; + char *out_file = NULL; + depth_opt opt = { + .flag = BAM_FUNMAP | BAM_FSECONDARY | BAM_FDUP | BAM_FQCFAIL, + .min_qual = 0, + .min_mqual = 0, + .skip_del = 1, + .header = 0, + .min_len = 0, + .out = stdout, + .all_pos = 0, + .remove_overlaps = 0, + .reg = NULL, + .bed = NULL, + }; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + {"min-MQ", required_argument, NULL, 'Q'}, + {"min-mq", required_argument, NULL, 'Q'}, + {"min-BQ", required_argument, NULL, 'q'}, + {"min-bq", required_argument, NULL, 'q'}, + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '@'), + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "@:q:Q:JHd:m:l:g:G:o:ar:Xf:b:s", + lopts, NULL)) >= 0) { + switch (c) { + case 'a': + opt.all_pos++; + break; + + case 'b': + opt.bed = bed_read(optarg); + if (!opt.bed) { + print_error_errno("depth", "Could not read file \"%s\"", + optarg); + return 1; + } + break; + + case 'f': + file_list = optarg; + break; + + case 'd': + case 'm': + // depth limit - now ignored + break; + + case 'g': + opt.flag &= ~bam_str2flag(optarg); + break; + case 'G': + opt.flag |= bam_str2flag(optarg); + break; + + case 'l': + opt.min_len = atoi(optarg); + break; + + case 'H': + opt.header = 1; + break; + + case 'q': + opt.min_qual = atoi(optarg); + break; + case 'Q': + opt.min_mqual = atoi(optarg); + break; + + case 'J': + opt.skip_del = 0; + break; + + case 'o': + if (opt.out != stdout) + break; + opt.out = fopen(out_file = optarg, "w"); + if (!opt.out) { + print_error_errno("depth", "Cannot open \"%s\" for writing.", + optarg); + return EXIT_FAILURE; + } + break; + + case 'r': + opt.reg = optarg; + break; + + case 's': + opt.remove_overlaps = 1; + break; + + case 'X': + has_index_file = 1; + break; + + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + usage_exit(stderr, EXIT_FAILURE); + } + } + + if (argc < optind+1 && !file_list) { + if (argc == optind) + usage_exit(stdout, EXIT_SUCCESS); + else + usage_exit(stderr, EXIT_FAILURE); + } + + if (file_list) { + if (has_index_file) { + print_error("depth", "The -f option cannot be combined with -X"); + return 1; + } + if (read_file_list(file_list, &nfiles, &fn)) + return 1; + argv = fn; + argc = nfiles; + optind = 0; + } else { + nfiles = argc - optind; + } + + if (has_index_file) { + if (nfiles%1) { + print_error("depth", "-X needs one index specified per bam file"); + return 1; + } + nfiles /= 2; + } + fp = malloc(nfiles * sizeof(*fp)); + header = malloc(nfiles * sizeof(*header)); + if (!fp || !header) { + print_error_errno("depth", "Out of memory"); + return 1; + } + + hts_itr_t **itr = NULL; + if (opt.reg) { + itr = calloc(nfiles, sizeof(*itr)); + if (!itr) + return 1; + } + + for (i = 0; i < nfiles; i++, optind++) { + fp[i] = sam_open_format(argv[optind], "r", &ga.in); + if (fp[i] == NULL) { + print_error_errno("depth", + "Cannot open input file \"%s\"", argv[optind]); + return 1; + } + + if (ga.nthreads > 0) + hts_set_threads(fp[i], ga.nthreads); + + if (hts_set_opt(fp[i], CRAM_OPT_REQUIRED_FIELDS, + SAM_FLAG | SAM_RNAME | SAM_POS | SAM_CIGAR + | (opt.remove_overlaps ? SAM_QNAME|SAM_RNEXT|SAM_PNEXT + : 0) + | (opt.min_mqual ? SAM_MAPQ : 0) + | (opt.min_len ? SAM_SEQ : 0) + | (opt.min_qual ? SAM_QUAL : 0))) { + fprintf(stderr, "Failed to set CRAM_OPT_REQUIRED_FIELDS value\n"); + return 1; + } + + if (hts_set_opt(fp[i], CRAM_OPT_DECODE_MD, 0)) { + fprintf(stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + return 1; + } + + // FIXME: what if headers differ? + header[i] = sam_hdr_read(fp[i]); + if (header == NULL) { + fprintf(stderr, "Failed to read header for \"%s\"\n", + argv[optind]); + return 1; + } + + if (opt.reg) { + hts_idx_t *idx = has_index_file + ? sam_index_load2(fp[i], argv[optind], argv[optind+nfiles]) + : sam_index_load(fp[i], argv[optind]); + if (!idx) { + print_error("depth", "cannot load index for \"%s\"", + argv[optind]); + return 1; + } + if (!(itr[i] = sam_itr_querys(idx, header[i], opt.reg))) { + print_error("depth", "cannot parse region \"%s\"", opt.reg); + return 1; + } + hts_idx_destroy(idx); + } + } + + int ret = fastdepth_core(&opt, nfiles, &argv[argc-nfiles], fp, itr, header) + ? 1 : 0; + + for (i = 0; i < nfiles; i++) { + sam_hdr_destroy(header[i]); + sam_close(fp[i]); + if (itr && itr[i]) + hts_itr_destroy(itr[i]); + } + free(header); + free(fp); + free(itr); + if (file_list) { + for (i=0; i (to 2020) + Author: James Bonfield (2021 rewrite) + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* This program demonstrates how to generate pileup from multiple BAMs + * simultaneously, to achieve random access and to use the BED interface. + * To compile this program separately, you may: + * + * gcc -g -O2 -Wall -o bam2depth -D_MAIN_BAM2DEPTH bam2depth.c -lhts -lz + */ + +#include + +#include +#include +#include +#include +#include +#include "htslib/sam.h" +#include "samtools.h" +#include "bedidx.h" +#include "sam_opts.h" +#include "htslib/khash.h" + +// From bam_plcmd.c +int read_file_list(const char *file_list, int *n, char **argv[]); + +// We accumulate to hist[pos & (size-1)]. This is a ring-buffer. +// We track where we last got to in output and what the biggest value +// we've written to so far (in absolute unmasked coordinates) in +// "last_output" and "end_pos" respectively. +// For each new record we just flush anything we haven't written yet +// already, between "last_output" and this read's start position, and +// initialise any newly seen positions between "end_pos" and this read's +// end position. +typedef struct { + size_t size; + int **hist; // hist[nfiles][size] + hts_pos_t *end_pos; // end_pos[nfiles] + hts_pos_t last_output; + int last_ref; + int nfiles; + const char *ref; + kstring_t ks; + hts_pos_t beg, end; // limit to region + int tid; +} depth_hist; + +typedef struct { + int header; + int flag; + int min_qual; + int min_mqual; + int min_len; + int skip_del; + int all_pos; + int remove_overlaps; + FILE *out; + char *reg; + void *bed; +} depth_opt; + +static void zero_region(depth_opt *opt, depth_hist *dh, + const char *name, hts_pos_t start, hts_pos_t end) { + hts_pos_t i; + kstring_t *ks = &dh->ks; + + kputs(name, ks_clear(ks)); + kputc('\t', ks); + size_t cur_l = ks->l; + if (dh->beg >= 0 && start < dh->beg) + start = dh->beg; + if (dh->end >= 0 && end > dh->end) + end = dh->end; + + for (i = start; i < end; i++) { + // Could be optimised, but needs better API to skip to next + // bed region. + if (opt->bed && bed_overlap(opt->bed, name, i, i+1) == 0) + continue; + + ks->l = cur_l; + kputll(i+1, ks); + int n; + for (n = 0; n < dh->nfiles; n++) { + kputc_('\t', ks); + kputc_('0', ks); + } + kputc('\n', ks); + fputs(ks->s, opt->out); + } + ks->l = cur_l; +} + +// A variation of bam_cigar2qlen which doesn't count soft-clips in to the +// equation. Basically it's the number of bases in query that are aligned +// in some way to the reference (including insertions, which are considered +// to be aligned by dint of being anchored either side). +hts_pos_t qlen_used(bam1_t *b) { + int n_cigar = b->core.n_cigar; + const uint32_t *cigar = bam_get_cigar(b); + + hts_pos_t l; + + if (b->core.l_qseq) { + // Known SEQ permits of short cut of l_qseq minus CSOFT_CLIPs. + // Full scan not needed, which helps on excessively long CIGARs. + l = b->core.l_qseq; + int kl, kr; + for (kl = 0; kl < n_cigar; kl++) + if (bam_cigar_op(cigar[kl]) == BAM_CSOFT_CLIP) + l -= bam_cigar_oplen(cigar[kl]); + else + break; + + for (kr = n_cigar-1; kr > kl; kr--) + if (bam_cigar_op(cigar[kr]) == BAM_CSOFT_CLIP) + l -= bam_cigar_oplen(cigar[kr]); + else + break; + } else { + // Unknown SEQ ("*") needs a full scan through the CIGAR string. + static int query[16] = { + //M I D N S H P = X B ? ? ? ? ? ? + 1,1,0,0, 0,0,0,1, 1,0,0,0, 0,0,0,0 + }; + int k; + for (k = l = 0; k < n_cigar; k++) + if (query[bam_cigar_op(cigar[k])]) + l += bam_cigar_oplen(cigar[k]); + } + return l; + +} + +// Adds the depth for a single read to a depth_hist struct. +// For just one file, this is easy. We just have a circular buffer +// where we increment values for bits that overlap existing data +// and initialise values for coordinates which we're seeing for the first +// time. This is tracked by "end_pos" to know where we've got to. +// +// As the input is sorted, we can flush output from "last_output" to +// b->core.pos. +// +// With multiple files, we must feed data in sorted order as if all files +// are merged, but track depth per file. This also means "end_pos" is per +// file too, but "last_output" is global as it corresponds to rows printed. +static int add_depth(depth_opt *opt, depth_hist *dh, sam_hdr_t *h, bam1_t *b, + int overlap_clip, int file) { + hts_pos_t i; + size_t hmask = dh->size-1; + int n; + + if (!b || b->core.tid != dh->last_ref) { + // New ref + if (dh->last_ref >= 0) { + // do end + size_t cur_l = dh->ks.l; + int nf = dh->nfiles; + i = dh->last_output; + for (i = dh->last_output; nf; i++) { + nf = 0; + for (n = 0; n < dh->nfiles; n++) { + if (i < dh->end_pos[n]) + nf++; + } + if (!nf) + break; + + if (opt->bed && bed_overlap(opt->bed, dh->ref, i, i+1) == 0) + continue; + + dh->ks.l = cur_l; + kputll(i+1, &dh->ks); + for (n = 0; n < dh->nfiles; n++) { + kputc_('\t', &dh->ks); + int d = i < dh->end_pos[n] + ? dh->hist[n][i & hmask] + : 0; + kputuw(d, &dh->ks); + } + kputc('\n', &dh->ks); + fputs(dh->ks.s, opt->out); + } + if (opt->all_pos) { + // End of last ref + zero_region(opt, dh, + sam_hdr_tid2name(h, dh->last_ref), + i, sam_hdr_tid2len(h, dh->last_ref)); + } + dh->ks.l = cur_l; + } + + if (opt->all_pos > 1 && !opt->reg) { + // Any previous unused refs + int lr = dh->last_ref < 0 ? 0 : dh->last_ref+1; + int rr = b ? b->core.tid : sam_hdr_nref(h), r; + for (r = lr; r < rr; r++) + zero_region(opt, dh, + sam_hdr_tid2name(h, r), + 0, sam_hdr_tid2len(h, r)); + } + + if (!b) { + // we're just flushing to end of file + if (opt->all_pos && opt->reg && dh->last_ref < 0) + // -a or -aa without a single read being output yet + zero_region(opt, dh, sam_hdr_tid2name(h, dh->tid), dh->beg, + MIN(dh->end, sam_hdr_tid2len(h, dh->tid))); + + return 0; + } + + for (n = 0; dh->end_pos && n < dh->nfiles; n++) + dh->end_pos[n] = 0; + dh->last_output = dh->beg >= 0 + ? MAX(b->core.pos, dh->beg) + : b->core.pos; + dh->last_ref = b->core.tid; + dh->ref = sam_hdr_tid2name(h, b->core.tid); + kputs(dh->ref, ks_clear(&dh->ks)); + kputc('\t', &dh->ks); + + if (opt->all_pos) + // Start of ref + zero_region(opt, dh, dh->ref, 0, b->core.pos); + } else { + if (dh->last_output < b->core.pos) { + // Flush any depth outputs up to start of new read + size_t cur_l = dh->ks.l; + int nf = dh->nfiles; + for (i = dh->last_output; i < b->core.pos; i++) { + nf = 0; + for (n = 0; n < dh->nfiles; n++) { + if (i < dh->end_pos[n]) + nf++; + } + if (!nf) + break; + + if (opt->bed && bed_overlap(opt->bed, dh->ref, i, i+1) == 0) + continue; + + dh->ks.l = cur_l; + kputll(i+1, &dh->ks); + for (n = 0; n < dh->nfiles; n++) { + kputc_('\t', &dh->ks); + int d = i < dh->end_pos[n] + ? dh->hist[n][i & hmask] + : 0; + kputuw(d, &dh->ks); + } + kputc('\n', &dh->ks); + fputs(dh->ks.s, opt->out); + } + if (opt->all_pos && i < b->core.pos) + // Hole in middle of ref + zero_region(opt, dh, dh->ref, i, b->core.pos); + + dh->ks.l = cur_l; + dh->last_output = b->core.pos; + } + } + + hts_pos_t end_pos = bam_endpos(b); // 0 based, 1 past end. + //printf("%d %d\n", (int)b->core.pos+1, (int)end_pos); + + if (b->core.tid < dh->last_ref || + (dh->last_ref == b->core.tid && end_pos < dh->last_output)) { + print_error_errno("depth", "Data is not position sorted"); + return -1; + } + + // If needed, grow the circular buffer. + if (end_pos+1 - b->core.pos >= dh->size) { + size_t old_size = dh->size; + size_t old_hmask = hmask; + while (end_pos+1 - b->core.pos >= dh->size) + dh->size = dh->size ? 2*dh->size : 2048; + hmask = dh->size-1; + if (!dh->hist) { + dh->hist = calloc(dh->nfiles, sizeof(*dh->hist)); + dh->end_pos = calloc(dh->nfiles, sizeof(*dh->end_pos)); + if (!dh->hist || !dh->end_pos) + return -1; + } + for (n = 0; n < dh->nfiles; n++) { + int *hist = calloc(dh->size, sizeof(*dh->hist[n])); + if (!hist) + return -1; + + // Simple approach for now; copy over old histogram verbatim. + for (i = dh->last_output; i < dh->last_output + old_size; i++) + hist[i & hmask] = dh->hist[n][i & old_hmask]; + free(dh->hist[n]); + dh->hist[n] = hist; + } + } + + // Accumulate depth, based on CIGAR + uint32_t *cig = bam_get_cigar(b); + int ncig = b->core.n_cigar, j, k, spos = 0; + + // Zero new (previously unseen) coordinates so increment works later. + hts_pos_t end = MAX(dh->end_pos[file], b->core.pos); + if (end_pos > end && (end & hmask) < (end_pos & hmask)) { + memset(&dh->hist[file][end & hmask], 0, + sizeof(**dh->hist) * (end_pos - end)); + } else { + for (i = end; i < end_pos; i++) + dh->hist[file][i & hmask] = 0; + } + + i = b->core.pos; + uint8_t *qual = bam_get_qual(b); + int min_qual = opt->min_qual; + for (j = 0; j < ncig; j++) { + int op = bam_cigar_op(cig[j]); + int oplen = bam_cigar_oplen(cig[j]); + + switch (op) { + case BAM_CDEL: + case BAM_CREF_SKIP: + if (op != BAM_CDEL || opt->skip_del) { + // don't increment reference location + if (i + oplen >= dh->end_pos[file]) { + for (k = 0; k < oplen; k++, i++) { + if (i >= dh->end_pos[file]) + // redundant due to zero new elements above? + dh->hist[file][i & hmask] = 0; + } + } else { + i += oplen; + } + } else { // op == BAM_CDEL and we count them (-J option), + // We don't incr spos here, but we still use qual. + // This doesn't make much sense, but it's for compatibility + // with the old code. Arguably DEL shouldn't have a min + // qual and should always pass (as we've explicitly asked to + // include them). + int *hist = dh->hist[file]; + k = 0; + if (overlap_clip) { + if (i+oplen < overlap_clip) { + i += oplen; + break; + } else if (i < overlap_clip) { + k = overlap_clip - i; + i = overlap_clip; + } + } + + // Question: should we even check quality values for DEL? + // We've explicitly asked to include them, and the quality + // is wrong anyway (it's the neighbouring base). We do this + // for now for compatibility with the old depth command. + + if (spos < b->core.l_qseq) + for (; k < oplen; k++, i++) + hist[i & hmask]+=qual[spos]>=min_qual; + else + for (; k < oplen; k++, i++) + hist[i & hmask]++; + } + break; + + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + if ((i & hmask) < ((i+oplen) & hmask)) { + // Optimisation when not wrapping around + + // Unrolling doesn't help clang, but helps gcc, + // especially when not using -O3. + int *hist = &dh->hist[file][i & hmask]; + if (min_qual || overlap_clip) { + k = 0; + if (overlap_clip) { + if (i+oplen < overlap_clip) { + i += oplen; + spos += oplen; + break; + } else if (i < overlap_clip) { + oplen -= overlap_clip - i; + spos += overlap_clip - i; + hist += overlap_clip - i; + i = overlap_clip; + } + } + + // approx 50% of this func cpu time in this loop + for (; k < (oplen & ~7); k+=8) { + hist[k+0]+=qual[spos+0]>=min_qual; + hist[k+1]+=qual[spos+1]>=min_qual; + hist[k+2]+=qual[spos+2]>=min_qual; + hist[k+3]+=qual[spos+3]>=min_qual; + hist[k+4]+=qual[spos+4]>=min_qual; + hist[k+5]+=qual[spos+5]>=min_qual; + hist[k+6]+=qual[spos+6]>=min_qual; + hist[k+7]+=qual[spos+7]>=min_qual; + spos += 8; + } + } else { + // easier to vectorize when no min_qual + for (k = 0; k < (oplen & ~7); k+=8) { + hist[k+0]++; + hist[k+1]++; + hist[k+2]++; + hist[k+3]++; + hist[k+4]++; + hist[k+5]++; + hist[k+6]++; + hist[k+7]++; + } + spos += k; + } + for (; k < oplen && spos < b->core.l_qseq; k++, spos++) + hist[k]+=qual[spos]>=min_qual; + for (; k < oplen; k++, spos++) + hist[k]++; + i += oplen; + } else { + // Simple to understand case, but slower. + // We use this only for reads with wrap-around. + int *hist = dh->hist[file]; + k = 0; + if (overlap_clip) { + if (i+oplen < overlap_clip) { + i += oplen; + break; + } else if (i < overlap_clip) { + oplen -= overlap_clip - i; + spos += overlap_clip - i; + i = overlap_clip; + } + } + for (; k < oplen && spos < b->core.l_qseq; k++, i++, spos++) + hist[i & hmask]+=qual[spos]>=min_qual; + for (; k < oplen; k++, i++, spos++) + hist[i & hmask]++; + } + break; + + case BAM_CINS: + case BAM_CSOFT_CLIP: + spos += oplen; + break; + + case BAM_CPAD: + case BAM_CHARD_CLIP: + // ignore + break; + + default: + print_error("depth", "Unsupported cigar op '%d'", op); + return -1; + } + } + + if (dh->end >= 0 && end_pos > dh->end) + end_pos = dh->end; + if (dh->end_pos[file] < end_pos) + dh->end_pos[file] = end_pos; + + return 0; +} + +// Hash on name -> alignment end pos. This permits a naive overlap removal. +// Note it cannot analyse the overlapping sequence and qualities, so the +// interaction of basecalls/qualities and the -Q parameter cannot be +// applied here (unlike the full mpileup algorithm). +KHASH_MAP_INIT_STR(olap_hash, hts_pos_t) +typedef khash_t(olap_hash) olap_hash_t; + +static int fastdepth_core(depth_opt *opt, uint32_t nfiles, char **fn, + samFile **fp, hts_itr_t **itr, sam_hdr_t **h) { + int ret = -1, err = 1, i; + olap_hash_t **overlaps = NULL; + depth_hist dh = {0}; + + // An array of bam structs, one per input file, to hold the next entry + bam1_t **b = calloc(nfiles, sizeof(*b)); + int *finished = calloc(nfiles, sizeof(*finished)), to_go = nfiles; + if (!b || !finished) + goto err; + + for (i = 0; i < nfiles; i++) + if (!(b[i] = bam_init1())) + goto err; + + // Do we need one overlap hash per file? Or shared? + if (opt->remove_overlaps) { + if (!(overlaps = calloc(nfiles, sizeof(*overlaps)))) + return -1; + for (i = 0; i < nfiles; i++) { + if (!(overlaps[i] = kh_init(olap_hash))) + return -1; + } + } + + // Create the initial histogram + dh.nfiles = nfiles; + dh.size = 0; + dh.hist = NULL; + dh.last_ref = -99; + dh.end_pos = NULL; + dh.last_output = itr && itr[0] ? itr[0]->beg : 0; + ks_initialize(&dh.ks); + + // Clip results to region if specified + dh.beg = -1; + dh.end = -1; + dh.tid = 0; + if (itr && itr[0]) { + dh.tid = itr[0]->tid; + dh.beg = itr[0]->beg; + dh.end = itr[0]->end; + } + + if (opt->header) { + fprintf(opt->out, "#CHROM\tPOS"); + for (i = 0; i < nfiles; i++) + fprintf(opt->out, "\t%s", fn[i]); + fputc('\n', opt->out); + } + + // Populate first record per file + for (i = 0; i < nfiles; i++) { + for(;;) { + ret = itr && itr[i] + ? sam_itr_next(fp[i], itr[i], b[i]) + : sam_read1(fp[i], h[i], b[i]); + if (ret < -1) + goto err; + if (ret == -1) { + to_go--; + finished[i] = 1; + break; + } + + if (b[i]->core.tid < 0) + continue; + if (b[i]->core.flag & opt->flag) + continue; + if (b[i]->core.qual < opt->min_mqual) + continue; + + // Original samtools depth used the total sequence (l_qseq) + // including soft-clips. This doesn't feel like a useful metric + // to be filtering on. We now only count sequence bases that + // form the used part of the alignment. + if (opt->min_len) { + if (qlen_used(b[i]) < opt->min_len) + continue; + } + + break; + } + } + + // Loop through input files, merging in order so we're + // always adding the next record in sequence + while (to_go) { + // Find next record in file list + int best_tid = INT_MAX, best_file = 0; + hts_pos_t best_pos = HTS_POS_MAX; + + for (i = 0; i < nfiles; i++) { + if (finished[i]) + continue; + if (best_tid > b[i]->core.tid) { + best_tid = b[i]->core.tid; + best_pos = b[i]->core.pos; + best_file = i; + } else if (best_tid == b[i]->core.tid && + best_pos > b[i]->core.pos) { + best_pos = b[i]->core.pos; + best_file = i; + } + } + i = best_file; + + hts_pos_t clip = 0; + if (overlaps && (b[i]->core.flag & BAM_FPAIRED) && + !(b[i]->core.flag & BAM_FMUNMAP)) { + khiter_t k = kh_get(olap_hash, overlaps[i], bam_get_qname(b[i])); + if (k == kh_end(overlaps[i])) { + // not seen before + hts_pos_t endpos = bam_endpos(b[i]); + + // Don't add if mate location is known and can't overlap. + if (b[i]->core.mpos == -1 || + (b[i]->core.tid == b[i]->core.mtid && + b[i]->core.mpos <= endpos)) { + k = kh_put(olap_hash, overlaps[i], bam_get_qname(b[i]), + &ret); + if (ret < 0) + return -1; + kh_key(overlaps[i], k) = strdup(bam_get_qname(b[i])); + kh_value(overlaps[i], k) = endpos; + } + } else { + // seen before + clip = kh_value(overlaps[i], k); + free((char *)kh_key(overlaps[i], k)); + kh_del(olap_hash, overlaps[i], k); + } + } + + // Add the next merged BAM record to the depth plot + if ((ret = add_depth(opt, &dh, h[i], b[i], clip, i)) < 0) { + ret = -1; + goto err; + } + + // Populate next record from this file + for(;!finished[i];) { + ret = itr && itr[i] + ? sam_itr_next(fp[i], itr[i], b[i]) + : sam_read1(fp[i], h[i], b[i]); + if (ret < -1) { + ret = -1; + goto err; + } + if (ret == -1) { + to_go--; + finished[i] = 1; + break; + } + + if (b[i]->core.tid < 0) + continue; + if (b[i]->core.flag & opt->flag) + continue; + if (b[i]->core.qual < opt->min_mqual) + continue; + + if (opt->min_len) { + if (qlen_used(b[i]) < opt->min_len) + continue; + } + + break; + } + } + + // Tidy up end. + ret = add_depth(opt, &dh, h[0], NULL, 0, 0); + err = 0; + + err: + if (ret == 0 && err) + ret = -1; + + for (i = 0; i < nfiles; i++) { + if (b[i]) + bam_destroy1(b[i]); + if (dh.hist && dh.hist[i]) + free(dh.hist[i]); + } + free(b); + free(finished); + ks_free(&dh.ks); + free(dh.hist); + free(dh.end_pos); + if (overlaps) { + khiter_t k; + for (i = 0; i < nfiles; i++) { + if (!overlaps[i]) + continue; + for (k = kh_begin(overlaps[i]); k < kh_end(overlaps[i]); k++) + if (kh_exist(overlaps[i], k)) + free((char *)kh_key(overlaps[i], k)); + kh_destroy(olap_hash, overlaps[i]); + } + free(overlaps); + } + + return ret; +} + +static void usage_exit(FILE *fp, int exit_status) +{ + fprintf(fp, "Usage: samtools depth [options] in.bam [in.bam ...]\n"); + fprintf(fp, "\nOptions:\n"); + fprintf(fp, " -a Output all positions (including zero depth)\n"); + fprintf(fp, " -a -a, -aa Output absolutely all positions, including unused ref seqs\n"); + fprintf(fp, " -r REG Specify a region in chr or chr:from-to syntax\n"); + fprintf(fp, " -b FILE Use bed FILE for list of regions\n"); + fprintf(fp, " -f FILE Specify list of input BAM/SAM/CRAM filenames\n"); + fprintf(fp, " -X Use custom index files (in -X *.bam *.bam.bai order)\n"); + fprintf(fp, " -g INT Remove specified flags from default flag filter\n"); + fprintf(fp, " -G INT Add specified flags to the default flag filter\n"); + fprintf(fp, " -H Print a file header line\n"); + fprintf(fp, " -l INT Minimum read length [0]\n"); + fprintf(fp, " -o FILE Write output to FILE [samtools_stdout]\n"); + fprintf(fp, " -q, --min-BQ INT\n" + " Filter bases with base quality smaller than INT [0]\n"); + fprintf(fp, " -Q, --min-MQ INT\n" + " Filter alignments with mapping quality smaller than INT [0]\n"); + fprintf(fp, " -H Print a file header\n"); + fprintf(fp, " -J Include reads with deletions in depth computation\n"); + fprintf(fp, " -s Do not count overlapping reads within a template\n"); + sam_global_opt_help(fp, "-.--.@-."); + samtools_exit(exit_status); +} + +int main_depth(int argc, char *argv[]) +{ + int nfiles, i; + samFile **fp; + sam_hdr_t **header; + int c, has_index_file = 0; + char *file_list = NULL, **fn = NULL; + char *out_file = NULL; + depth_opt opt = { + .flag = BAM_FUNMAP | BAM_FSECONDARY | BAM_FDUP | BAM_FQCFAIL, + .min_qual = 0, + .min_mqual = 0, + .skip_del = 1, + .header = 0, + .min_len = 0, + .out = samtools_stdout, + .all_pos = 0, + .remove_overlaps = 0, + .reg = NULL, + .bed = NULL, + }; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + {"min-MQ", required_argument, NULL, 'Q'}, + {"min-mq", required_argument, NULL, 'Q'}, + {"min-BQ", required_argument, NULL, 'q'}, + {"min-bq", required_argument, NULL, 'q'}, + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '@'), + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "@:q:Q:JHd:m:l:g:G:o:ar:Xf:b:s", + lopts, NULL)) >= 0) { + switch (c) { + case 'a': + opt.all_pos++; + break; + + case 'b': + opt.bed = bed_read(optarg); + if (!opt.bed) { + print_error_errno("depth", "Could not read file \"%s\"", + optarg); + return 1; + } + break; + + case 'f': + file_list = optarg; + break; + + case 'd': + case 'm': + // depth limit - now ignored + break; + + case 'g': + opt.flag &= ~bam_str2flag(optarg); + break; + case 'G': + opt.flag |= bam_str2flag(optarg); + break; + + case 'l': + opt.min_len = atoi(optarg); + break; + + case 'H': + opt.header = 1; + break; + + case 'q': + opt.min_qual = atoi(optarg); + break; + case 'Q': + opt.min_mqual = atoi(optarg); + break; + + case 'J': + opt.skip_del = 0; + break; + + case 'o': + if (opt.out != samtools_stdout) + break; + opt.out = fopen(out_file = optarg, "w"); + if (!opt.out) { + print_error_errno("depth", "Cannot open \"%s\" for writing.", + optarg); + return EXIT_FAILURE; + } + break; + + case 'r': + opt.reg = optarg; + break; + + case 's': + opt.remove_overlaps = 1; + break; + + case 'X': + has_index_file = 1; + break; + + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + usage_exit(samtools_stderr, EXIT_FAILURE); + } + } + + if (argc < optind+1 && !file_list) { + if (argc == optind) + usage_exit(samtools_stdout, EXIT_SUCCESS); + else + usage_exit(samtools_stderr, EXIT_FAILURE); + } + + if (file_list) { + if (has_index_file) { + print_error("depth", "The -f option cannot be combined with -X"); + return 1; + } + if (read_file_list(file_list, &nfiles, &fn)) + return 1; + argv = fn; + argc = nfiles; + optind = 0; + } else { + nfiles = argc - optind; + } + + if (has_index_file) { + if (nfiles%1) { + print_error("depth", "-X needs one index specified per bam file"); + return 1; + } + nfiles /= 2; + } + fp = malloc(nfiles * sizeof(*fp)); + header = malloc(nfiles * sizeof(*header)); + if (!fp || !header) { + print_error_errno("depth", "Out of memory"); + return 1; + } + + hts_itr_t **itr = NULL; + if (opt.reg) { + itr = calloc(nfiles, sizeof(*itr)); + if (!itr) + return 1; + } + + for (i = 0; i < nfiles; i++, optind++) { + fp[i] = sam_open_format(argv[optind], "r", &ga.in); + if (fp[i] == NULL) { + print_error_errno("depth", + "Cannot open input file \"%s\"", argv[optind]); + return 1; + } + + if (ga.nthreads > 0) + hts_set_threads(fp[i], ga.nthreads); + + if (hts_set_opt(fp[i], CRAM_OPT_REQUIRED_FIELDS, + SAM_FLAG | SAM_RNAME | SAM_POS | SAM_CIGAR + | (opt.remove_overlaps ? SAM_QNAME|SAM_RNEXT|SAM_PNEXT + : 0) + | (opt.min_mqual ? SAM_MAPQ : 0) + | (opt.min_len ? SAM_SEQ : 0) + | (opt.min_qual ? SAM_QUAL : 0))) { + fprintf(samtools_stderr, "Failed to set CRAM_OPT_REQUIRED_FIELDS value\n"); + return 1; + } + + if (hts_set_opt(fp[i], CRAM_OPT_DECODE_MD, 0)) { + fprintf(samtools_stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + return 1; + } + + // FIXME: what if headers differ? + header[i] = sam_hdr_read(fp[i]); + if (header == NULL) { + fprintf(samtools_stderr, "Failed to read header for \"%s\"\n", + argv[optind]); + return 1; + } + + if (opt.reg) { + hts_idx_t *idx = has_index_file + ? sam_index_load2(fp[i], argv[optind], argv[optind+nfiles]) + : sam_index_load(fp[i], argv[optind]); + if (!idx) { + print_error("depth", "cannot load index for \"%s\"", + argv[optind]); + return 1; + } + if (!(itr[i] = sam_itr_querys(idx, header[i], opt.reg))) { + print_error("depth", "cannot parse region \"%s\"", opt.reg); + return 1; + } + hts_idx_destroy(idx); + } + } + + int ret = fastdepth_core(&opt, nfiles, &argv[argc-nfiles], fp, itr, header) + ? 1 : 0; + + for (i = 0; i < nfiles; i++) { + sam_hdr_destroy(header[i]); + sam_close(fp[i]); + if (itr && itr[i]) + hts_itr_destroy(itr[i]); + } + free(header); + free(fp); + free(itr); + if (file_list) { + for (i=0; i + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include "samtools.h" +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include +#include +#include +#include +#include +#include +#include + +typedef enum { + overwrite_all, + orphan_only, +} rg_mode; + +struct parsed_opts { + char* input_name; + char* output_name; + char* rg_id; + char* rg_line; + int no_pg; + rg_mode mode; + sam_global_args ga; + htsThreadPool p; + int uncompressed; + int overwrite_hdr_rg; +}; + +struct state; +typedef struct parsed_opts parsed_opts_t; +typedef struct state state_t; + +struct state { + samFile* input_file; + sam_hdr_t* input_header; + samFile* output_file; + sam_hdr_t* output_header; + char* rg_id; + void (*mode_func)(const state_t*, bam1_t*); +}; + +static void cleanup_opts(parsed_opts_t* opts) +{ + if (!opts) return; + free(opts->rg_id); + free(opts->output_name); + free(opts->input_name); + free(opts->rg_line); + if (opts->p.pool) hts_tpool_destroy(opts->p.pool); + sam_global_args_free(&opts->ga); + free(opts); +} + +static void cleanup_state(state_t* state) +{ + if (!state) return; + free(state->rg_id); + if (state->output_file) sam_close(state->output_file); + sam_hdr_destroy(state->output_header); + if (state->input_file) sam_close(state->input_file); + sam_hdr_destroy(state->input_header); + free(state); +} + +// Converts \t and \n into real tabs and newlines +static char* basic_unescape(const char* in) +{ + assert(in); + char *ptr, *out; + out = ptr = malloc(strlen(in)+1); + size_t size = 0; + while (*in) { + if (*in == '\\') { + ++in; + if (*in == '\0') { + fprintf(stderr, "[%s] Unterminated escape sequence.\n", __func__); + free(out); + return NULL; + } + switch (*in) { + case '\\': + *ptr = '\\'; + break; + case 't': + *ptr = '\t'; + break; + case 'n': + fprintf(stderr, "[%s] \\n in escape sequence is not supported.\n", __func__); + free(out); + return NULL; + default: + fprintf(stderr, "[%s] Unsupported escape sequence.\n", __func__); + free(out); + return NULL; + } + } else { + *ptr = *in; + } + ++in; + ++ptr; + ++size; + } + *ptr = '\0'; + ++size; + char* tmp = (char*)realloc(out, size); + if (!tmp) { + free(out); + } + return tmp; +} + +// Malloc a string containing [s,slim) or to the end of s if slim is NULL. +// If lenp is non-NULL, stores the length of the resulting string there. +static char *dup_substring(const char *s, const char *slim, size_t *lenp) +{ + size_t len = slim? (slim - s) : strlen(s); + char *ns = malloc(len+1); + if (ns == NULL) return NULL; + memcpy(ns, s, len); + ns[len] = '\0'; + if (lenp) *lenp = len; + return ns; +} + + +// Given a @RG line return the id +static char* get_rg_id(const char *line) +{ + const char *id = strstr(line, "\tID:"); + if (! id) return NULL; + + id += 4; + return dup_substring(id, strchr(id, '\t'), NULL); +} + + +static void usage(FILE *fp) +{ + fprintf(fp, + "Usage: samtools addreplacerg [options] [-r <@RG line> | -R ] [-m orphan_only|overwrite_all] [-o ] \n" + "\n" + "Options:\n" + " -m MODE Set the mode of operation from one of overwrite_all, orphan_only [overwrite_all]\n" + " -o FILE Where to write output to [stdout]\n" + " -r STRING @RG line text\n" + " -R STRING ID of @RG line in existing header to use\n" + " -u Output uncompressed data\n" + " -w Overwrite an existing @RG line\n" + " --no-PG Do not add a PG line\n" + ); + sam_global_opt_help(fp, "..O..@.."); +} + +static bool parse_args(int argc, char** argv, parsed_opts_t** opts) +{ + *opts = NULL; + int n; + + if (argc == 1) { usage(stdout); return true; } + + parsed_opts_t* retval = calloc(1, sizeof(parsed_opts_t)); + if (! retval ) { + fprintf(stderr, "[%s] Out of memory allocating parsed_opts_t\n", __func__); + return false; + } + // Set defaults + retval->mode = overwrite_all; + sam_global_args_init(&retval->ga); + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS(0, 0, 'O', 0, 0, '@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + kstring_t rg_line = {0,0,NULL}; + + while ((n = getopt_long(argc, argv, "r:R:m:o:O:h@:uw", lopts, NULL)) >= 0) { + switch (n) { + case 'r': + // Are we adding to existing rg line? + if (ks_len(&rg_line) == 0) { + if (strlen(optarg)<3 || (optarg[0] != '@' && optarg[1] != 'R' && optarg[2] != 'G')) { + kputs("@RG\t", &rg_line); + } + } else { + kputs("\t", &rg_line); + } + kputs(optarg, &rg_line); + break; + case 'R': + retval->rg_id = strdup(optarg); + break; + case 'm': { + if (strcmp(optarg, "overwrite_all") == 0) { + retval->mode = overwrite_all; + } else if (strcmp(optarg, "orphan_only") == 0) { + retval->mode = orphan_only; + } else { + usage(stderr); + return false; + } + break; + } + case 'o': + retval->output_name = strdup(optarg); + break; + case 'h': + usage(stdout); + free(retval); + return true; + case 1: + retval->no_pg = 1; + break; + case 'u': + retval->uncompressed = 1; + break; + case 'w': + retval->overwrite_hdr_rg = 1; + break; + case '?': + usage(stderr); + free(retval); + return false; + case 'O': + default: + if (parse_sam_global_opt(n, optarg, lopts, &retval->ga) == 0) break; + usage(stderr); + free(retval); + return false; + } + } + retval->rg_line = ks_release(&rg_line); + + if (argc-optind < 1) { + fprintf(stderr, "You must specify an input file.\n"); + usage(stderr); + cleanup_opts(retval); + return false; + } + if (retval->rg_id && retval->rg_line) { + fprintf(stderr, "The options -r and -R are mutually exclusive.\n"); + cleanup_opts(retval); + return false; + } + + if (retval->rg_line) + { + char* tmp = basic_unescape(retval->rg_line); + + if ((retval->rg_id = get_rg_id(tmp)) == NULL) { + fprintf(stderr, "[%s] The supplied RG line lacks an ID tag.\n", __func__); + free(tmp); + cleanup_opts(retval); + return false; + } + free(retval->rg_line); + retval->rg_line = tmp; + } + retval->input_name = strdup(argv[optind+0]); + + if (retval->ga.nthreads > 0) { + if (!(retval->p.pool = hts_tpool_init(retval->ga.nthreads))) { + fprintf(stderr, "Error creating thread pool\n"); + return false; + } + } + + *opts = retval; + return true; +} + +static void overwrite_all_func(const state_t* state, bam1_t* file_read) +{ + uint8_t* data = (uint8_t*)strdup(state->rg_id); + int len = strlen(state->rg_id)+1; + // If the old exists delete it + uint8_t* old = bam_aux_get(file_read, "RG"); + if (old != NULL) { + bam_aux_del(file_read, old); + } + + bam_aux_append(file_read, "RG", 'Z', len, data); + free(data); +} + +static void orphan_only_func(const state_t* state, bam1_t* file_read) +{ + uint8_t* data = (uint8_t*)strdup(state->rg_id); + int len = strlen(state->rg_id)+1; + // If the old exists don't do anything + uint8_t* old = bam_aux_get(file_read, "RG"); + if (old == NULL) { + bam_aux_append(file_read, "RG",'Z',len,data); + } + free(data); +} + +static bool init(const parsed_opts_t* opts, state_t** state_out) { + char output_mode[9] = "w"; + state_t* retval = (state_t*) calloc(1, sizeof(state_t)); + + if (retval == NULL) { + fprintf(stderr, "[init] Out of memory allocating state struct.\n"); + return false; + } + *state_out = retval; + + // Open files + retval->input_file = sam_open_format(opts->input_name, "r", &opts->ga.in); + if (retval->input_file == NULL) { + print_error_errno("addreplacerg", "could not open \"%s\"", opts->input_name); + return false; + } + retval->input_header = sam_hdr_read(retval->input_file); + + retval->output_header = sam_hdr_dup(retval->input_header); + + if (opts->uncompressed) + strcat(output_mode, "0"); + if (opts->output_name) // File format auto-detection + sam_open_mode(output_mode + strlen(output_mode), + opts->output_name, NULL); + retval->output_file = sam_open_format(opts->output_name == NULL?"-":opts->output_name, output_mode, &opts->ga.out); + + if (retval->output_file == NULL) { + print_error_errno("addreplacerg", "could not create \"%s\"", opts->output_name); + return false; + } + + if (opts->p.pool) { + hts_set_opt(retval->input_file, HTS_OPT_THREAD_POOL, &opts->p); + hts_set_opt(retval->output_file, HTS_OPT_THREAD_POOL, &opts->p); + } + + if (opts->rg_line) { + // Append new RG line to header. + // Check does not already exist + kstring_t hdr_line = { 0, 0, NULL }; + if (sam_hdr_find_line_id(retval->output_header, "RG", "ID", opts->rg_id, &hdr_line) == 0) { + if (opts->overwrite_hdr_rg) { + if(-1 == sam_hdr_remove_line_id(retval->output_header, "RG", "ID", opts->rg_id)) { + fprintf(stderr, "[init] Error removing the RG line with ID:%s from the output header.\n", opts->rg_id); + ks_free(&hdr_line); + return false; + } + } else { + fprintf(stderr, "[init] RG line with ID:%s already present in the header. Use -w to overwrite.\n", opts->rg_id); + ks_free(&hdr_line); + return false; + } + } + ks_free(&hdr_line); + + if (-1 == sam_hdr_add_lines(retval->output_header, opts->rg_line, strlen(opts->rg_line))) { + fprintf(stderr, "[init] Error adding RG line with ID:%s to the output header.\n", opts->rg_id); + return false; + } + if (opts->mode == overwrite_all && + -1 == sam_hdr_remove_except(retval->output_header, "RG", "ID", opts->rg_id)) { + fprintf(stderr, "[init] Error removing the old RG lines from the output header.\n"); + return false; + } + retval->rg_id = strdup(opts->rg_id); + } else { + if (opts->rg_id) { + // Confirm what has been supplied exists + kstring_t hdr_line = { 0, 0, NULL }; + if (sam_hdr_find_line_id(retval->output_header, "RG", "ID", opts->rg_id, &hdr_line) < 0) { + fprintf(stderr, "RG ID supplied does not exist in header. Supply full @RG line with -r instead?\n"); + return false; + } + retval->rg_id = strdup(opts->rg_id); + ks_free(&hdr_line); + } else { + kstring_t rg_id = { 0, 0, NULL }; + if (sam_hdr_find_tag_id(retval->output_header, "RG", NULL, NULL, "ID", &rg_id) < 0) { + fprintf(stderr, "No RG specified on command line or in existing header.\n"); + return false; + } + retval->rg_id = ks_release(&rg_id); + } + } + + switch (opts->mode) { + case overwrite_all: + retval->mode_func = &overwrite_all_func; + break; + case orphan_only: + retval->mode_func = &orphan_only_func; + break; + } + + return true; +} + +static bool readgroupise(parsed_opts_t *opts, state_t* state, char *arg_list) +{ + if (!opts->no_pg && sam_hdr_add_pg(state->output_header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + return false; + + if (sam_hdr_write(state->output_file, state->output_header) != 0) { + print_error_errno("addreplacerg", "[%s] Could not write header to output file", __func__); + return false; + } + char *idx_fn = NULL; + if (opts->ga.write_index) { + if (!(idx_fn = auto_index(state->output_file, opts->output_name, state->output_header))) + return false; + } + + bam1_t* file_read = bam_init1(); + int ret; + while ((ret = sam_read1(state->input_file, state->input_header, file_read)) >= 0) { + state->mode_func(state, file_read); + + if (sam_write1(state->output_file, state->output_header, file_read) < 0) { + print_error_errno("addreplacerg", "[%s] Could not write read to output file", __func__); + bam_destroy1(file_read); + free(idx_fn); + return false; + } + } + bam_destroy1(file_read); + if (ret != -1) { + print_error_errno("addreplacerg", "[%s] Error reading from input file", __func__); + free(idx_fn); + return false; + } else { + + if (opts->ga.write_index) { + if (sam_idx_save(state->output_file) < 0) { + print_error_errno("addreplacerg", "[%s] Writing index failed", __func__); + free(idx_fn); + return false; + } + } + free(idx_fn); + return true; + } +} + +int main_addreplacerg(int argc, char** argv) +{ + parsed_opts_t* opts = NULL; + state_t* state = NULL; + char *arg_list = stringify_argv(argc+1, argv-1); + if (!arg_list) + return EXIT_FAILURE; + + if (!parse_args(argc, argv, &opts)) goto error; + if (opts) { // Not an error but user doesn't want us to proceed + if (!init(opts, &state) || !readgroupise(opts, state, arg_list)) + goto error; + } + + cleanup_state(state); + cleanup_opts(opts); + free(arg_list); + + return EXIT_SUCCESS; +error: + cleanup_state(state); + cleanup_opts(opts); + free(arg_list); + + return EXIT_FAILURE; +} diff --git a/samtools/bam_addrprg.c.pysam.c b/samtools/bam_addrprg.c.pysam.c new file mode 100644 index 0000000..88ce7e3 --- /dev/null +++ b/samtools/bam_addrprg.c.pysam.c @@ -0,0 +1,501 @@ +#include "samtools.pysam.h" + +/* bam_addrprg.c -- samtools command to add or replace readgroups. + + Copyright (c) 2013, 2015-2017, 2019-2021 Genome Research Limited. + + Author: Martin O. Pollard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include "samtools.h" +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include +#include +#include +#include +#include +#include +#include + +typedef enum { + overwrite_all, + orphan_only, +} rg_mode; + +struct parsed_opts { + char* input_name; + char* output_name; + char* rg_id; + char* rg_line; + int no_pg; + rg_mode mode; + sam_global_args ga; + htsThreadPool p; + int uncompressed; + int overwrite_hdr_rg; +}; + +struct state; +typedef struct parsed_opts parsed_opts_t; +typedef struct state state_t; + +struct state { + samFile* input_file; + sam_hdr_t* input_header; + samFile* output_file; + sam_hdr_t* output_header; + char* rg_id; + void (*mode_func)(const state_t*, bam1_t*); +}; + +static void cleanup_opts(parsed_opts_t* opts) +{ + if (!opts) return; + free(opts->rg_id); + free(opts->output_name); + free(opts->input_name); + free(opts->rg_line); + if (opts->p.pool) hts_tpool_destroy(opts->p.pool); + sam_global_args_free(&opts->ga); + free(opts); +} + +static void cleanup_state(state_t* state) +{ + if (!state) return; + free(state->rg_id); + if (state->output_file) sam_close(state->output_file); + sam_hdr_destroy(state->output_header); + if (state->input_file) sam_close(state->input_file); + sam_hdr_destroy(state->input_header); + free(state); +} + +// Converts \t and \n into real tabs and newlines +static char* basic_unescape(const char* in) +{ + assert(in); + char *ptr, *out; + out = ptr = malloc(strlen(in)+1); + size_t size = 0; + while (*in) { + if (*in == '\\') { + ++in; + if (*in == '\0') { + fprintf(samtools_stderr, "[%s] Unterminated escape sequence.\n", __func__); + free(out); + return NULL; + } + switch (*in) { + case '\\': + *ptr = '\\'; + break; + case 't': + *ptr = '\t'; + break; + case 'n': + fprintf(samtools_stderr, "[%s] \\n in escape sequence is not supported.\n", __func__); + free(out); + return NULL; + default: + fprintf(samtools_stderr, "[%s] Unsupported escape sequence.\n", __func__); + free(out); + return NULL; + } + } else { + *ptr = *in; + } + ++in; + ++ptr; + ++size; + } + *ptr = '\0'; + ++size; + char* tmp = (char*)realloc(out, size); + if (!tmp) { + free(out); + } + return tmp; +} + +// Malloc a string containing [s,slim) or to the end of s if slim is NULL. +// If lenp is non-NULL, stores the length of the resulting string there. +static char *dup_substring(const char *s, const char *slim, size_t *lenp) +{ + size_t len = slim? (slim - s) : strlen(s); + char *ns = malloc(len+1); + if (ns == NULL) return NULL; + memcpy(ns, s, len); + ns[len] = '\0'; + if (lenp) *lenp = len; + return ns; +} + + +// Given a @RG line return the id +static char* get_rg_id(const char *line) +{ + const char *id = strstr(line, "\tID:"); + if (! id) return NULL; + + id += 4; + return dup_substring(id, strchr(id, '\t'), NULL); +} + + +static void usage(FILE *fp) +{ + fprintf(fp, + "Usage: samtools addreplacerg [options] [-r <@RG line> | -R ] [-m orphan_only|overwrite_all] [-o ] \n" + "\n" + "Options:\n" + " -m MODE Set the mode of operation from one of overwrite_all, orphan_only [overwrite_all]\n" + " -o FILE Where to write output to [samtools_stdout]\n" + " -r STRING @RG line text\n" + " -R STRING ID of @RG line in existing header to use\n" + " -u Output uncompressed data\n" + " -w Overwrite an existing @RG line\n" + " --no-PG Do not add a PG line\n" + ); + sam_global_opt_help(fp, "..O..@.."); +} + +static bool parse_args(int argc, char** argv, parsed_opts_t** opts) +{ + *opts = NULL; + int n; + + if (argc == 1) { usage(samtools_stdout); return true; } + + parsed_opts_t* retval = calloc(1, sizeof(parsed_opts_t)); + if (! retval ) { + fprintf(samtools_stderr, "[%s] Out of memory allocating parsed_opts_t\n", __func__); + return false; + } + // Set defaults + retval->mode = overwrite_all; + sam_global_args_init(&retval->ga); + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS(0, 0, 'O', 0, 0, '@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + kstring_t rg_line = {0,0,NULL}; + + while ((n = getopt_long(argc, argv, "r:R:m:o:O:h@:uw", lopts, NULL)) >= 0) { + switch (n) { + case 'r': + // Are we adding to existing rg line? + if (ks_len(&rg_line) == 0) { + if (strlen(optarg)<3 || (optarg[0] != '@' && optarg[1] != 'R' && optarg[2] != 'G')) { + kputs("@RG\t", &rg_line); + } + } else { + kputs("\t", &rg_line); + } + kputs(optarg, &rg_line); + break; + case 'R': + retval->rg_id = strdup(optarg); + break; + case 'm': { + if (strcmp(optarg, "overwrite_all") == 0) { + retval->mode = overwrite_all; + } else if (strcmp(optarg, "orphan_only") == 0) { + retval->mode = orphan_only; + } else { + usage(samtools_stderr); + return false; + } + break; + } + case 'o': + retval->output_name = strdup(optarg); + break; + case 'h': + usage(samtools_stdout); + free(retval); + return true; + case 1: + retval->no_pg = 1; + break; + case 'u': + retval->uncompressed = 1; + break; + case 'w': + retval->overwrite_hdr_rg = 1; + break; + case '?': + usage(samtools_stderr); + free(retval); + return false; + case 'O': + default: + if (parse_sam_global_opt(n, optarg, lopts, &retval->ga) == 0) break; + usage(samtools_stderr); + free(retval); + return false; + } + } + retval->rg_line = ks_release(&rg_line); + + if (argc-optind < 1) { + fprintf(samtools_stderr, "You must specify an input file.\n"); + usage(samtools_stderr); + cleanup_opts(retval); + return false; + } + if (retval->rg_id && retval->rg_line) { + fprintf(samtools_stderr, "The options -r and -R are mutually exclusive.\n"); + cleanup_opts(retval); + return false; + } + + if (retval->rg_line) + { + char* tmp = basic_unescape(retval->rg_line); + + if ((retval->rg_id = get_rg_id(tmp)) == NULL) { + fprintf(samtools_stderr, "[%s] The supplied RG line lacks an ID tag.\n", __func__); + free(tmp); + cleanup_opts(retval); + return false; + } + free(retval->rg_line); + retval->rg_line = tmp; + } + retval->input_name = strdup(argv[optind+0]); + + if (retval->ga.nthreads > 0) { + if (!(retval->p.pool = hts_tpool_init(retval->ga.nthreads))) { + fprintf(samtools_stderr, "Error creating thread pool\n"); + return false; + } + } + + *opts = retval; + return true; +} + +static void overwrite_all_func(const state_t* state, bam1_t* file_read) +{ + uint8_t* data = (uint8_t*)strdup(state->rg_id); + int len = strlen(state->rg_id)+1; + // If the old exists delete it + uint8_t* old = bam_aux_get(file_read, "RG"); + if (old != NULL) { + bam_aux_del(file_read, old); + } + + bam_aux_append(file_read, "RG", 'Z', len, data); + free(data); +} + +static void orphan_only_func(const state_t* state, bam1_t* file_read) +{ + uint8_t* data = (uint8_t*)strdup(state->rg_id); + int len = strlen(state->rg_id)+1; + // If the old exists don't do anything + uint8_t* old = bam_aux_get(file_read, "RG"); + if (old == NULL) { + bam_aux_append(file_read, "RG",'Z',len,data); + } + free(data); +} + +static bool init(const parsed_opts_t* opts, state_t** state_out) { + char output_mode[9] = "w"; + state_t* retval = (state_t*) calloc(1, sizeof(state_t)); + + if (retval == NULL) { + fprintf(samtools_stderr, "[init] Out of memory allocating state struct.\n"); + return false; + } + *state_out = retval; + + // Open files + retval->input_file = sam_open_format(opts->input_name, "r", &opts->ga.in); + if (retval->input_file == NULL) { + print_error_errno("addreplacerg", "could not open \"%s\"", opts->input_name); + return false; + } + retval->input_header = sam_hdr_read(retval->input_file); + + retval->output_header = sam_hdr_dup(retval->input_header); + + if (opts->uncompressed) + strcat(output_mode, "0"); + if (opts->output_name) // File format auto-detection + sam_open_mode(output_mode + strlen(output_mode), + opts->output_name, NULL); + retval->output_file = sam_open_format(opts->output_name == NULL?"-":opts->output_name, output_mode, &opts->ga.out); + + if (retval->output_file == NULL) { + print_error_errno("addreplacerg", "could not create \"%s\"", opts->output_name); + return false; + } + + if (opts->p.pool) { + hts_set_opt(retval->input_file, HTS_OPT_THREAD_POOL, &opts->p); + hts_set_opt(retval->output_file, HTS_OPT_THREAD_POOL, &opts->p); + } + + if (opts->rg_line) { + // Append new RG line to header. + // Check does not already exist + kstring_t hdr_line = { 0, 0, NULL }; + if (sam_hdr_find_line_id(retval->output_header, "RG", "ID", opts->rg_id, &hdr_line) == 0) { + if (opts->overwrite_hdr_rg) { + if(-1 == sam_hdr_remove_line_id(retval->output_header, "RG", "ID", opts->rg_id)) { + fprintf(samtools_stderr, "[init] Error removing the RG line with ID:%s from the output header.\n", opts->rg_id); + ks_free(&hdr_line); + return false; + } + } else { + fprintf(samtools_stderr, "[init] RG line with ID:%s already present in the header. Use -w to overwrite.\n", opts->rg_id); + ks_free(&hdr_line); + return false; + } + } + ks_free(&hdr_line); + + if (-1 == sam_hdr_add_lines(retval->output_header, opts->rg_line, strlen(opts->rg_line))) { + fprintf(samtools_stderr, "[init] Error adding RG line with ID:%s to the output header.\n", opts->rg_id); + return false; + } + if (opts->mode == overwrite_all && + -1 == sam_hdr_remove_except(retval->output_header, "RG", "ID", opts->rg_id)) { + fprintf(samtools_stderr, "[init] Error removing the old RG lines from the output header.\n"); + return false; + } + retval->rg_id = strdup(opts->rg_id); + } else { + if (opts->rg_id) { + // Confirm what has been supplied exists + kstring_t hdr_line = { 0, 0, NULL }; + if (sam_hdr_find_line_id(retval->output_header, "RG", "ID", opts->rg_id, &hdr_line) < 0) { + fprintf(samtools_stderr, "RG ID supplied does not exist in header. Supply full @RG line with -r instead?\n"); + return false; + } + retval->rg_id = strdup(opts->rg_id); + ks_free(&hdr_line); + } else { + kstring_t rg_id = { 0, 0, NULL }; + if (sam_hdr_find_tag_id(retval->output_header, "RG", NULL, NULL, "ID", &rg_id) < 0) { + fprintf(samtools_stderr, "No RG specified on command line or in existing header.\n"); + return false; + } + retval->rg_id = ks_release(&rg_id); + } + } + + switch (opts->mode) { + case overwrite_all: + retval->mode_func = &overwrite_all_func; + break; + case orphan_only: + retval->mode_func = &orphan_only_func; + break; + } + + return true; +} + +static bool readgroupise(parsed_opts_t *opts, state_t* state, char *arg_list) +{ + if (!opts->no_pg && sam_hdr_add_pg(state->output_header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + return false; + + if (sam_hdr_write(state->output_file, state->output_header) != 0) { + print_error_errno("addreplacerg", "[%s] Could not write header to output file", __func__); + return false; + } + char *idx_fn = NULL; + if (opts->ga.write_index) { + if (!(idx_fn = auto_index(state->output_file, opts->output_name, state->output_header))) + return false; + } + + bam1_t* file_read = bam_init1(); + int ret; + while ((ret = sam_read1(state->input_file, state->input_header, file_read)) >= 0) { + state->mode_func(state, file_read); + + if (sam_write1(state->output_file, state->output_header, file_read) < 0) { + print_error_errno("addreplacerg", "[%s] Could not write read to output file", __func__); + bam_destroy1(file_read); + free(idx_fn); + return false; + } + } + bam_destroy1(file_read); + if (ret != -1) { + print_error_errno("addreplacerg", "[%s] Error reading from input file", __func__); + free(idx_fn); + return false; + } else { + + if (opts->ga.write_index) { + if (sam_idx_save(state->output_file) < 0) { + print_error_errno("addreplacerg", "[%s] Writing index failed", __func__); + free(idx_fn); + return false; + } + } + free(idx_fn); + return true; + } +} + +int main_addreplacerg(int argc, char** argv) +{ + parsed_opts_t* opts = NULL; + state_t* state = NULL; + char *arg_list = stringify_argv(argc+1, argv-1); + if (!arg_list) + return EXIT_FAILURE; + + if (!parse_args(argc, argv, &opts)) goto error; + if (opts) { // Not an error but user doesn't want us to proceed + if (!init(opts, &state) || !readgroupise(opts, state, arg_list)) + goto error; + } + + cleanup_state(state); + cleanup_opts(opts); + free(arg_list); + + return EXIT_SUCCESS; +error: + cleanup_state(state); + cleanup_opts(opts); + free(arg_list); + + return EXIT_FAILURE; +} diff --git a/samtools/bam_ampliconclip.c b/samtools/bam_ampliconclip.c new file mode 100644 index 0000000..2cf1ac1 --- /dev/null +++ b/samtools/bam_ampliconclip.c @@ -0,0 +1,1078 @@ +/* bam_ampliconclip.c -- loads amplicon primers from a BED file and cuts reads + from the 5' end. + + Copyright (C) 2020-2021 Genome Research Ltd. + + Authors: Andrew Whitwham + Rob Davies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include +#include "htslib/hfile.h" +#include "htslib/kstring.h" +#include "htslib/sam.h" +#include "samtools.h" +#include "bam_ampliconclip.h" + +typedef enum { + soft_clip, + hard_clip +} clipping_type; + +typedef struct { + int add_pg; + int use_strand; + int write_clipped; + int mark_fail; + int both; + int fail_len; + int filter_len; + int unmapped; + int oa_tag; + int del_tag; + int tol; + char *arg_list; + char *stats_file; + char *rejects_file; +} cl_param_t; + + +static int bed_entry_sort(const void *av, const void *bv) { + bed_entry_t *a = (bed_entry_t *) av; + bed_entry_t *b = (bed_entry_t *) bv; + return a->right < b->right ? -1 : (a->right == b->right ? 0 : 1); +} + + +int load_bed_file_multi_ref(char *infile, int get_strand, int sort_by_pos, khash_t(bed_list_hash) *bed_lists) { + hFILE *fp; + int line_count = 0, ret; + int64_t left, right; + kstring_t line = KS_INITIALIZE; + bed_entry_list_t *list; + khiter_t bed_itr; + + if ((fp = hopen(infile, "r")) == NULL) { + print_error_errno("amplicon", "unable to open file %s.", infile); + return 1; + } + + char ref[1024]; + + while (line.l = 0, kgetline(&line, (kgets_func *)hgets, fp) >= 0) { + line_count++; + int hret; + char strand; + + if (line.l == 0 || *line.s == '#') continue; + if (strncmp(line.s, "track ", 6) == 0) continue; + if (strncmp(line.s, "browser ", 8) == 0) continue; + + if (get_strand) { + if (sscanf(line.s, "%1023s %"SCNd64" %"SCNd64" %*s %*s %c", + ref, &left, &right, &strand) != 4) { + fprintf(stderr, "[amplicon] error: bad bed file format in line %d of %s.\n" + "(N.B. ref/chrom name limited to 1023 characters.)\n", + line_count, infile); + ret = 1; + goto error; + } + } else { + if (sscanf(line.s, "%1023s %"SCNd64" %"SCNd64, + ref, &left, &right) != 3) { + fprintf(stderr, "[amplicon] error: bad bed file format in line %d of %s\n" + "(N.B. ref/chrom name limited to 1023 characters.)\n", + line_count, infile); + ret = 1; + goto error; + } + } + + bed_itr = kh_get(bed_list_hash, bed_lists, ref); + + if (bed_itr == kh_end(bed_lists)) { // new ref entry + char *ref_name = strdup(ref); // need a copy for the hash key + + if (!ref_name) { + fprintf(stderr, "[amplicon] error: unable to allocate memory for ref name.\n"); + ret = 1; + goto error; + } + + bed_itr = kh_put(bed_list_hash, bed_lists, ref_name, &hret); + + if (hret > 0) { + list = &kh_val(bed_lists, bed_itr); + + // initialise the new hash entry + list->longest = 0; + list->size = 0; + list->length = 0; + list->bp = NULL; + } else { + fprintf(stderr, "[amplicon] error: ref hashing failure.\n"); + ret = 1; + goto error; + } + } else { // existing ref + list = &kh_val(bed_lists, bed_itr); + } + + if (list->length == list->size) { + bed_entry_t *tmp; + + list->size += list->size / 2 + 256; + + if ((tmp = realloc(list->bp, list->size * sizeof(bed_entry_t))) == NULL) { + fprintf(stderr, "[amplicon] error: unable to allocate more memory for bed data.\n"); + ret = 1; + goto error; + } + + list->bp = tmp; + } + + list->bp[list->length].left = left; + list->bp[list->length].right = right; + + if (get_strand) { + if (strand == '+') { + list->bp[list->length].rev = 0; + } else if (strand == '-') { + list->bp[list->length].rev = 1; + } else { + fprintf(stderr, "[amplicon] error: bad strand value in line %d, expecting '+' or '-', found '%c'.\n", + line_count, strand); + ret = 1; + goto error; + } + } + + if (right - left > list->longest) + list->longest = right - left; + + list->length++; + } + + if (sort_by_pos) { + for (bed_itr = kh_begin(bed_lists); bed_itr != kh_end(bed_lists); ++bed_itr) { + if (kh_exist(bed_lists, bed_itr)) { + list = &kh_val(bed_lists, bed_itr); + qsort(list->bp, list->length, sizeof(list->bp[0]), bed_entry_sort); + } + } + } + + if (kh_size(bed_lists) > 0) {// any entries + ret = 0; + } else { + ret = 1; + } + +error: + ks_free(&line); + + if (hclose(fp) != 0) { + fprintf(stderr, "[amplicon] warning: failed to close %s", infile); + } + + return ret; +} + + +void destroy_bed_hash(khash_t(bed_list_hash) *hash) { + khiter_t itr; + + for (itr = kh_begin(hash); itr != kh_end(hash); ++itr) { + if (kh_exist(hash, itr)) { + free(kh_val(hash, itr).bp); + free((char *)kh_key(hash, itr)); + kh_key(hash, itr) = NULL; + } + } + + kh_destroy(bed_list_hash, hash); +} + + +static int matching_clip_site(bed_entry_list_t *sites, hts_pos_t pos, + int is_rev, int use_strand, int64_t longest, + cl_param_t *param) { + int i, size; // may need this to be variable + int tol = param->tol; + int l = 0, mid = sites->length / 2, r = sites->length; + int pos_tol = is_rev ? (pos > tol ? pos - tol : 0) : pos; + + while (r - l > 1) { + if (sites->bp[mid].right <= pos_tol) { + l = mid; + } else { + r = mid; + } + mid = (l + r) / 2; + } + + size = 0; + + for (i = l; i < sites->length; i++) { + hts_pos_t mod_left, mod_right; + + if (use_strand && is_rev != sites->bp[i].rev) + continue; + + if (is_rev) { + mod_left = sites->bp[i].left; + mod_right = sites->bp[i].right + tol; + } else { + if (sites->bp[i].left > tol) { + mod_left = sites->bp[i].left - tol; + } else { + mod_left = 0; + } + mod_right = sites->bp[i].right; + } + + if (pos + longest + tol < mod_right) + break; + + if (pos >= mod_left && pos <= mod_right) { + if (is_rev) { + if (size < pos - sites->bp[i].left) { + size = pos - sites->bp[i].left; + } + } else { + if (size < sites->bp[i].right - pos) { + size = sites->bp[i].right - pos; + } + } + } + } + + return size; +} + + +static int bam_trim_left(bam1_t *rec, bam1_t *rec_out, uint32_t bases, + clipping_type clipping) { + uint32_t *orig_cigar = bam_get_cigar(rec); + uint8_t *orig_seq = bam_get_seq(rec); + uint8_t *orig_qual = bam_get_qual(rec); + uint8_t *orig_aux = bam_get_aux(rec); + uint32_t *new_cigar; + uint8_t *new_qual; + size_t orig_l_aux = bam_get_l_aux(rec); + uint32_t i, j; + uint32_t ref_remove = bases, qry_removed = 0, hardclip = 0; + hts_pos_t new_pos = rec->core.pos; + uint32_t cig_type, cig_op; + + if (rec->l_data + 8 > rec_out->m_data) { + uint8_t *new_data = realloc(rec_out->data, rec->l_data + 8); + if (!new_data) { + fprintf(stderr, "[ampliconclip] error: could not allocate memoy for new bam record\n"); + return 1; + } + rec_out->data = new_data; + rec_out->m_data = rec->l_data + 8; + } + + // Copy core data & name + memcpy(&rec_out->core, &rec->core, sizeof(rec->core)); + memcpy(rec_out->data, rec->data, rec->core.l_qname); + + if (clipping == hard_clip && bases >= rec->core.l_qseq) { + rec_out->core.l_qseq = 0; + rec_out->core.n_cigar = 0; + + if (orig_l_aux) + memcpy(bam_get_aux(rec_out), orig_aux, orig_l_aux); + + rec_out->l_data = bam_get_aux(rec_out) - rec_out->data + orig_l_aux; + + return 0; + } + + // Modify CIGAR + new_cigar = bam_get_cigar(rec_out); + + for (i = 0; i < rec->core.n_cigar; i++) { + cig_op = bam_cigar_op(orig_cigar[i]); + cig_type = bam_cigar_type(cig_op); + + if (cig_op == BAM_CHARD_CLIP) { + hardclip += bam_cigar_oplen(orig_cigar[i]); + } else { + if (cig_type & 2) { + if (bam_cigar_oplen(orig_cigar[i]) <= ref_remove) { + ref_remove -= bam_cigar_oplen(orig_cigar[i]); + } else { + break; + } + new_pos += bam_cigar_oplen(orig_cigar[i]); + } + if (cig_type & 1) { + qry_removed += bam_cigar_oplen(orig_cigar[i]); + } + } + } + + if (i < rec->core.n_cigar) { + cig_type = bam_cigar_type(bam_cigar_op(orig_cigar[i])); + + // account for the last operation + if (cig_type & 2) { + new_pos += ref_remove; + } + if (cig_type & 1) { + qry_removed += ref_remove; + } + } else { + qry_removed = rec->core.l_qseq; + } + + j = 0; + if (clipping == hard_clip && hardclip + qry_removed > 0) { + new_cigar[j++] = bam_cigar_gen(hardclip + qry_removed, BAM_CHARD_CLIP); + } + if (clipping == soft_clip) { + if (hardclip > 0) { + new_cigar[j++] = bam_cigar_gen(hardclip, BAM_CHARD_CLIP); + } + if (qry_removed > 0) { + new_cigar[j++] = bam_cigar_gen(qry_removed, BAM_CSOFT_CLIP); + } + } + + if (i < rec->core.n_cigar + && bam_cigar_oplen(orig_cigar[i]) > ref_remove) { + new_cigar[j++] = bam_cigar_gen(bam_cigar_oplen(orig_cigar[i]) - ref_remove, bam_cigar_op(orig_cigar[i])); + + // fill in the rest of the cigar + i++; + + for (; i < rec->core.n_cigar; i++) { + new_cigar[j++] = orig_cigar[i]; + } + } + + rec_out->core.n_cigar = j; + + if (clipping == soft_clip) { + qry_removed = 0; // Copy all the sequence and confidence values + } + + new_qual = bam_get_seq(rec_out) + (rec->core.l_qseq - qry_removed + 1) / 2; + // Copy remaining SEQ + if ((qry_removed & 1) == 0) { + memcpy(bam_get_seq(rec_out), orig_seq + (qry_removed / 2), + (rec->core.l_qseq - qry_removed + 1) / 2); // +1 to account for odd numbers + } else { + uint8_t *in = orig_seq + qry_removed / 2; + uint8_t *out = bam_get_seq(rec_out); + uint32_t i; + for (i = qry_removed; i < rec->core.l_qseq - 1; i += 2) { + *out++ = ((in[0] & 0x0f) << 4) | ((in[1] & 0xf0) >> 4); + in++; + } + if (i < rec->core.l_qseq) { + *out++ = (in[0] & 0x0f) << 4; + } + assert(out == new_qual); + } + + // Copy remaining QUAL + memmove(new_qual, orig_qual, rec->core.l_qseq - qry_removed); + + // Set new l_qseq + rec_out->core.l_qseq -= qry_removed; + + // Move AUX + if (orig_l_aux) + memcpy(bam_get_aux(rec_out), orig_aux, orig_l_aux); + + // Set new l_data + rec_out->l_data = bam_get_aux(rec_out) - rec_out->data + orig_l_aux; + + // put in new pos + rec_out->core.pos = new_pos; + + return 0; +} + + +static int bam_trim_right(bam1_t *rec, bam1_t *rec_out, uint32_t bases, + clipping_type clipping) { + uint32_t *orig_cigar = bam_get_cigar(rec); + uint8_t *orig_seq = bam_get_seq(rec); + uint8_t *orig_qual = bam_get_qual(rec); + uint8_t *orig_aux = bam_get_aux(rec); + uint32_t *new_cigar; + uint32_t new_n_cigar = 0; + uint8_t *new_qual; + size_t orig_l_aux = bam_get_l_aux(rec); + int32_t i; + int32_t j; + uint32_t ref_remove = bases, qry_removed = 0, hardclip = 0; + uint32_t cig_type, cig_op; + + if (rec->l_data + 8 > rec_out->m_data) { + uint8_t *new_data = realloc(rec_out->data, rec->l_data + 8); + if (!new_data) { + fprintf(stderr, "[ampliconclip] error: could not allocate memoy for new bam record\n"); + return 1; + } + rec_out->data = new_data; + rec_out->m_data = rec->l_data + 8; + } + + // Copy core data & name + memcpy(&rec_out->core, &rec->core, sizeof(rec->core)); + memcpy(rec_out->data, rec->data, rec->core.l_qname); + + if (clipping == hard_clip && bases >= rec->core.l_qseq) { + rec_out->core.l_qseq = 0; + rec_out->core.n_cigar = 0; + + if (orig_l_aux) + memcpy(bam_get_aux(rec_out), orig_aux, orig_l_aux); + + rec_out->l_data = bam_get_aux(rec_out) - rec_out->data + orig_l_aux; + return 0; + } + + // Modify CIGAR here + new_cigar = bam_get_cigar(rec_out); + + for (i = rec->core.n_cigar - 1; i >= 0; --i) { + cig_op = bam_cigar_op(orig_cigar[i]); + cig_type = bam_cigar_type(cig_op); + + if (cig_op == BAM_CHARD_CLIP) { + hardclip += bam_cigar_oplen(orig_cigar[i]); + } else { + if (cig_type & 2) { + if (bam_cigar_oplen(orig_cigar[i]) <= ref_remove) { + ref_remove -= bam_cigar_oplen(orig_cigar[i]); + } else { + break; + } + } + if (cig_type & 1) { + qry_removed += bam_cigar_oplen(orig_cigar[i]); + } + } + } + + if (i >= 0) { + cig_type = bam_cigar_type(bam_cigar_op(orig_cigar[i])); + if (cig_type & 1) { + qry_removed += ref_remove; + } + j = i; + if (qry_removed > 0) j++; + if (hardclip > 0 && (clipping == soft_clip || qry_removed == 0)) j++; + } else { + qry_removed = rec->core.l_qseq; + j = 0; + if (hardclip > 0 && clipping == soft_clip) j++; + } + + if (clipping == hard_clip && hardclip + qry_removed > 0) { + new_cigar[j] = bam_cigar_gen(hardclip + qry_removed, BAM_CHARD_CLIP); + new_n_cigar++; + } + if (clipping == soft_clip) { + if (hardclip > 0) { + new_cigar[j] = bam_cigar_gen(hardclip, BAM_CHARD_CLIP); + new_n_cigar++; + if (qry_removed > 0) --j; + } + if (qry_removed > 0) { + new_cigar[j] = bam_cigar_gen(qry_removed, BAM_CSOFT_CLIP); + new_n_cigar++; + } + } + + if (j > 0) { + new_cigar[--j] = bam_cigar_gen(bam_cigar_oplen(orig_cigar[i]) - ref_remove, bam_cigar_op(orig_cigar[i])); + new_n_cigar++; + } + + // fill in the rest of the cigar + while (j > 0) { + new_cigar[--j] = orig_cigar[--i]; + new_n_cigar++; + } + + rec_out->core.n_cigar = new_n_cigar; + + if (clipping == soft_clip) + qry_removed = 0; // Copy all the sequence and confidence values + + new_qual = bam_get_seq(rec_out) + (rec->core.l_qseq - qry_removed + 1) / 2; + // Copy remaining SEQ + memcpy(bam_get_seq(rec_out), orig_seq, (rec->core.l_qseq - qry_removed + 1) / 2); + + // Copy remaining QUAL + memcpy(new_qual, orig_qual, rec->core.l_qseq - qry_removed); + + // Set new l_qseq + rec_out->core.l_qseq -= qry_removed; + + // Copy AUX + if (orig_l_aux) + memcpy(bam_get_aux(rec_out), orig_aux, orig_l_aux); + + // Set new l_data + rec_out->l_data = bam_get_aux(rec_out) - rec_out->data + orig_l_aux; + + return 0; +} + + +static hts_pos_t active_query_len(bam1_t *b) { + uint32_t *cigar = bam_get_cigar(b); + uint32_t cig_type, cig_op; + hts_pos_t len = 0; + int i; + + for (i = 0; i < b->core.n_cigar; i++) { + cig_op = bam_cigar_op(cigar[i]); + cig_type = bam_cigar_type(cig_op); + + if ((cig_type & 1) && (cig_op != BAM_CSOFT_CLIP)) { + len += bam_cigar_oplen(cigar[i]); + } + } + + return len; +} + + +static inline void swap_bams(bam1_t **a, bam1_t **b) { + bam1_t *tmp = *a; + *a = *b; + *b = tmp; +} + + +// Format OA:Z:(RNAME,POS,strand,CIGAR,MAPQ,NM; +static inline int tag_original_data(bam1_t *orig, kstring_t *oa_tag) { + char strand; + uint8_t *nm_tag, *old_oa_tag; + uint32_t *cigar; + int64_t nm = 0; + int i, res = 0; + + ks_clear(oa_tag); + + // if there is an existing OA tag the new one gets appended to it + if ((old_oa_tag = bam_aux_get(orig, "OA"))) { + res |= ksprintf(oa_tag, "%s", bam_aux2Z(old_oa_tag)) < 0; + } + + if (orig->core.flag & BAM_FREVERSE) + strand = '-'; + else + strand = '+'; + + if ((nm_tag = bam_aux_get(orig, "NM"))) { + nm = bam_aux2i(nm_tag); + } + + res |= ksprintf(oa_tag, "%s,%"PRIhts_pos",%c,", bam_get_qname(orig), orig->core.pos + 1, strand) < 0; + + for (i = 0, cigar = bam_get_cigar(orig); i < orig->core.n_cigar && res == 0; ++i) { + res |= kputw(bam_cigar_oplen(cigar[i]), oa_tag) < 0; + res |= kputc(bam_cigar_opchr(cigar[i]), oa_tag) < 0; + } + + if (nm_tag) { + res |= ksprintf(oa_tag, ",%d,%"PRId64";", orig->core.qual, nm) < 0; + } else { + res |= ksprintf(oa_tag, "%d,;", orig->core.qual) < 0; + } + + return res; +} + + +static int bam_clip(samFile *in, samFile *out, samFile *reject, char *bedfile, + clipping_type clipping, cl_param_t *param) { + int ret = 1, r, file_open = 0; + + bam_hdr_t *header = NULL; + bam1_t *b = NULL, *b_tmp = NULL; + long f_count = 0, r_count = 0, n_count = 0, l_count = 0, l_exclude = 0, b_count = 0; + long filtered = 0, written = 0, failed = 0; + kstring_t str = KS_INITIALIZE; + kstring_t oat = KS_INITIALIZE; + bed_entry_list_t *sites; + FILE *stats_fp = stderr; + khash_t(bed_list_hash) *bed_hash = kh_init(bed_list_hash); + + if (load_bed_file_multi_ref(bedfile, param->use_strand, 1, bed_hash)) { + fprintf(stderr, "[ampliconclip] error: unable to load bed file.\n"); + goto fail; + } + + if ((header = sam_hdr_read(in)) == NULL) { + fprintf(stderr, "[ampliconclip] error: could not read header\n"); + goto fail; + } + + // changing pos can ruin coordinate sort order + if (sam_hdr_find_tag_hd(header, "SO", &str) == 0 && str.s && strcmp(str.s, "coordinate") == 0) { + const char *new_order = "unknown"; + + if (sam_hdr_update_hd(header, "SO", new_order) == -1) { + fprintf(stderr, "[ampliconclip] error: unable to change sort order to 'SO:%s'\n", new_order); + goto fail; + } + } + + ks_free(&str); + + if (param->add_pg && sam_hdr_add_pg(header, "samtools", "VN", samtools_version(), + param->arg_list ? "CL" : NULL, + param->arg_list ? param->arg_list : NULL, + NULL) != 0) { + fprintf(stderr, "[ampliconclip] warning: unable to add @PG line to header.\n"); + } + if (sam_hdr_write(out, header) < 0) { + fprintf(stderr, "[ampliconclip] error: could not write header.\n"); + goto fail; + } + + if (reject) { + if (sam_hdr_write(reject, header) < 0) { + fprintf(stderr, "[ampliconclip] error: could not write header to rejects file.\n"); + goto fail; + } + } + + b = bam_init1(); + b_tmp = bam_init1(); + if (!b || !b_tmp) { + fprintf(stderr, "[ampliconclip] error: out of memory when trying to create record.\n"); + goto fail; + } + + int32_t last_tid = -1; + int ref_found = 0; + + while ((r = sam_read1(in, header, b)) >= 0) { + hts_pos_t pos; + int is_rev; + int p_size; + int been_clipped = 0, filter = 0; + int exclude = (BAM_FUNMAP | BAM_FQCFAIL); + khiter_t itr; + + l_count++; + + if (b->core.tid != last_tid) { + const char *ref_name; + + ref_found = 0; + last_tid = b->core.tid; + + if ((ref_name = sam_hdr_tid2name(header, b->core.tid)) != NULL) { + itr = kh_get(bed_list_hash, bed_hash, ref_name); + + if (itr != kh_end(bed_hash)) { + sites = &kh_val(bed_hash, itr); + ref_found = 1; + } + } + } + + if (!(b->core.flag & exclude) && ref_found) { + if (param->oa_tag) + if (tag_original_data(b, &oat)) + goto fail; + + if (!param->both) { + if (bam_is_rev(b)) { + pos = bam_endpos(b); + is_rev = 1; + } else { + pos = b->core.pos; + is_rev = 0; + } + + if ((p_size = matching_clip_site(sites, pos, is_rev, param->use_strand, sites->longest, param))) { + if (is_rev) { + if (bam_trim_right(b, b_tmp, p_size, clipping) != 0) + goto fail; + + swap_bams(&b, &b_tmp); + r_count++; + } else { + if (bam_trim_left(b, b_tmp, p_size, clipping) != 0) + goto fail; + + swap_bams(&b, &b_tmp); + f_count++; + } + + if (param->oa_tag) { + if (bam_aux_update_str(b, "OA", oat.l + 1, (const char *)oat.s)) + goto fail; + } + + if (param->del_tag) { + uint8_t *tag; + + if ((tag = bam_aux_get(b, "NM"))) + bam_aux_del(b, tag); + + if ((tag = bam_aux_get(b, "MD"))) + bam_aux_del(b, tag); + } + + been_clipped = 1; + } else { + if (param->mark_fail) { + b->core.flag |= BAM_FQCFAIL; + } + + n_count++; + } + } else { + int left = 0, right = 0; + + // left first + pos = b->core.pos; + is_rev = 0; + + if ((p_size = matching_clip_site(sites, pos, is_rev, param->use_strand, sites->longest, param))) { + if (bam_trim_left(b, b_tmp, p_size, clipping) != 0) + goto fail; + + swap_bams(&b, &b_tmp); + f_count++; + left = 1; + been_clipped = 1; + } + + // the right + pos = bam_endpos(b); + is_rev = 1; + + if ((p_size = matching_clip_site(sites, pos, is_rev, param->use_strand, sites->longest, param))) { + if (bam_trim_right(b, b_tmp, p_size, clipping) != 0) + goto fail; + + swap_bams(&b, &b_tmp); + r_count++; + right = 1; + been_clipped = 1; + } + + if (left || right) { + uint8_t *tag; + + if (param->oa_tag) { + if (bam_aux_update_str(b, "OA", oat.l + 1, (const char *)oat.s)) + goto fail; + } + + if (param->del_tag) { + if ((tag = bam_aux_get(b, "NM"))) + bam_aux_del(b, tag); + + if ((tag = bam_aux_get(b, "MD"))) + bam_aux_del(b, tag); + } + } + + if (left && right) { + b_count++; + } else if (!left && !right) { + if (param->mark_fail) { + b->core.flag |= BAM_FQCFAIL; + } + + n_count++; + } + } + + if (param->fail_len >= 0 || param->filter_len >= 0) { + hts_pos_t aql = active_query_len(b); + + if (param->fail_len >= 0 && aql <= param->fail_len) { + b->core.flag |= BAM_FQCFAIL; + } + + if (param->filter_len >= 0 && aql <= param->filter_len) { + filter = 1; + } + } + + if (b->core.flag & BAM_FQCFAIL) { + failed++; + } + + if (param->write_clipped && !been_clipped) { + filter = 1; + } + + } else { + l_exclude++; + + if (param->unmapped) { + filter = 1; + } + } + + if (!filter) { + if (sam_write1(out, header, b) < 0) { + fprintf(stderr, "[ampliconclip] error: could not write line %ld.\n", l_count); + goto fail; + } + + written++; + } else { + if (reject) { + if (sam_write1(reject, header, b) < 0) { + fprintf(stderr, "[ampliconclip] error: could not write to reject file %s\n", + param->rejects_file); + goto fail; + } + } + + filtered++; + } + } + + if (r < -1) { + fprintf(stderr, "[ampliconclip] error: failed to read input.\n"); + goto fail; + } + + if (param->stats_file) { + if ((stats_fp = fopen(param->stats_file, "w")) == NULL) { + fprintf(stderr, "[ampliconclip] warning: cannot write stats to %s.\n", param->stats_file); + } else { + file_open = 1; + } + } + + fprintf(stats_fp, "COMMAND: %s\n" + "TOTAL READS: %ld\n" + "TOTAL CLIPPED: %ld\n" + "FORWARD CLIPPED: %ld\n" + "REVERSE CLIPPED: %ld\n" + "BOTH CLIPPED: %ld\n" + "NOT CLIPPED: %ld\n" + "EXCLUDED: %ld\n" + "FILTERED: %ld\n" + "FAILED: %ld\n" + "WRITTEN: %ld\n", param->arg_list, l_count, f_count + r_count, + f_count, r_count, b_count, n_count, l_exclude, + filtered, failed, written); + + if (file_open) { + fclose(stats_fp); + } + + ret = 0; + +fail: + destroy_bed_hash(bed_hash); + ks_free(&oat); + sam_hdr_destroy(header); + bam_destroy1(b); + bam_destroy1(b_tmp); + return ret; +} + + +static void usage(void) { + fprintf(stderr, "Usage: samtools ampliconclip -b BED file -o \n\n"); + fprintf(stderr, "Option: \n"); + fprintf(stderr, " -b FILE BED file of regions (eg amplicon primers) to be removed.\n"); + fprintf(stderr, " -o FILE output file name (default stdout).\n"); + fprintf(stderr, " -f FILE write stats to file name (default stderr)\n"); + fprintf(stderr, " -u Output uncompressed data\n"); + fprintf(stderr, " --soft-clip soft clip amplicon primers from reads (default)\n"); + fprintf(stderr, " --hard-clip hard clip amplicon primers from reads.\n"); + fprintf(stderr, " --both-ends clip on both 5' and 3' ends.\n"); + fprintf(stderr, " --strand use strand data from BED file to match read direction.\n"); + fprintf(stderr, " --clipped only output clipped reads.\n"); + fprintf(stderr, " --fail mark unclipped, mapped reads as QCFAIL.\n"); + fprintf(stderr, " --filter-len INT do not output reads INT size or shorter.\n"); + fprintf(stderr, " --fail-len INT mark as QCFAIL reads INT size or shorter.\n"); + fprintf(stderr, " --no-excluded do not write excluded reads (unmapped or QCFAIL).\n"); + fprintf(stderr, " --rejects-file FILE file to write filtered reads.\n"); + fprintf(stderr, " --original for clipped entries add an OA tag with original data.\n"); + fprintf(stderr, " --keep-tag for clipped entries keep the old NM and MD tags.\n"); + fprintf(stderr, " --tolerance match region within this number of bases, default 5.\n"); + fprintf(stderr, " --no-PG do not add an @PG line.\n"); + sam_global_opt_help(stderr, "-.O..@-."); + fprintf(stderr, "\nAbout: Soft clips read alignments where they match BED file defined regions.\n" + "Default clipping is only on the 5' end.\n\n"); +} + + +int amplicon_clip_main(int argc, char **argv) { + int c, ret; + char wmode[4] = {'w', 'b', 0, 0}; + char *bedfile = NULL, *fnout = "-"; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + htsThreadPool p = {NULL, 0}; + samFile *in = NULL, *out = NULL, *reject = NULL; + clipping_type clipping = soft_clip; + cl_param_t param = {1, 0, 0, 0, 0, -1, -1, 0, 0, 1, 5, NULL, NULL, NULL}; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + {"no-PG", no_argument, NULL, 1002}, + {"soft-clip", no_argument, NULL, 1003}, + {"hard-clip", no_argument, NULL, 1004}, + {"strand", no_argument, NULL, 1005}, + {"clipped", no_argument, NULL, 1006}, + {"fail", no_argument, NULL, 1007}, + {"both-ends", no_argument, NULL, 1008}, + {"filter-len", required_argument, NULL, 1009}, + {"fail-len", required_argument, NULL, 1010}, + {"no-excluded", no_argument, NULL, 1011}, + {"rejects-file", required_argument, NULL, 1012}, + {"original", no_argument, NULL, 1013}, + {"keep-tag", no_argument, NULL, 1014}, + {"tolerance", required_argument, NULL, 1015}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "b:@:o:O:f:u", lopts, NULL)) >= 0) { + switch (c) { + case 'b': bedfile = optarg; break; + case 'o': fnout = optarg; break; + case 'f': param.stats_file = optarg; break; + case 'u': wmode[2] = '0'; break; + case 1002: param.add_pg = 0; break; + case 1003: clipping = soft_clip; break; + case 1004: clipping = hard_clip; break; + case 1005: param.use_strand = 1; break; + case 1006: param.write_clipped = 1; break; + case 1007: param.mark_fail = 1; break; + case 1008: param.both = 1; break; + case 1009: param.filter_len = atoi(optarg); break; + case 1010: param.fail_len = atoi(optarg); break; + case 1011: param.unmapped = 1; break; + case 1012: param.rejects_file = optarg; break; + case 1013: param.oa_tag = 1; break; + case 1014: param.del_tag = 0; break; + case 1015: param.tol = atoi(optarg); break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage(); exit(1); + } + } + + if (!bedfile) { + usage(); + return 1; + } + + if (optind + 1 > argc) { + usage(); + return 1; + } + + if (param.tol < 0) { + fprintf(stderr, "[ampliconclip] warning: invalid tolerance of %d," + " reseting tolerance to default of 5.\n", param.tol); + param.tol = 5; + } + + if ((in = sam_open_format(argv[optind], "rb", &ga.in)) == NULL) { + print_error_errno("ampliconclip", "cannot open input file"); + return 1; + } + + sam_open_mode(wmode+1, fnout, NULL); + + if ((out = sam_open_format(fnout, wmode, &ga.out)) == NULL) { + print_error_errno("ampliconclip", "cannot open output file"); + return 1; + } + + if (param.rejects_file) { + sam_open_mode(wmode+1, param.rejects_file, NULL); + + if ((reject = sam_open_format(param.rejects_file, wmode, &ga.out)) == NULL) { + print_error_errno("ampliconclip", "cannot open rejects file"); + return 1; + } + } + + if (ga.nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(stderr, "[ampliconclip] error: cannot create thread pool.\n"); + return 1; + } + hts_set_opt(in, HTS_OPT_THREAD_POOL, &p); + hts_set_opt(out, HTS_OPT_THREAD_POOL, &p); + + if (reject) { + hts_set_opt(reject, HTS_OPT_THREAD_POOL, &p); + } + } + + param.arg_list = stringify_argv(argc + 1, argv - 1); + + ret = bam_clip(in, out, reject, bedfile, clipping, ¶m); + + // cleanup + sam_close(in); + + if (sam_close(out) < 0) { + fprintf(stderr, "[ampliconclip] error: error while closing output file %s.\n", argv[optind+1]); + ret = 1; + } + + if (reject) { + if (sam_close(reject) < 0) { + fprintf(stderr, "[ampliconclip] error: error while closing reject file %s.\n", param.rejects_file); + ret = 1; + } + } + + if (p.pool) hts_tpool_destroy(p.pool); + + sam_global_args_free(&ga); + free(param.arg_list); + + return ret; +} + diff --git a/samtools/bam_ampliconclip.c.pysam.c b/samtools/bam_ampliconclip.c.pysam.c new file mode 100644 index 0000000..1feda1d --- /dev/null +++ b/samtools/bam_ampliconclip.c.pysam.c @@ -0,0 +1,1080 @@ +#include "samtools.pysam.h" + +/* bam_ampliconclip.c -- loads amplicon primers from a BED file and cuts reads + from the 5' end. + + Copyright (C) 2020-2021 Genome Research Ltd. + + Authors: Andrew Whitwham + Rob Davies + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include +#include "htslib/hfile.h" +#include "htslib/kstring.h" +#include "htslib/sam.h" +#include "samtools.h" +#include "bam_ampliconclip.h" + +typedef enum { + soft_clip, + hard_clip +} clipping_type; + +typedef struct { + int add_pg; + int use_strand; + int write_clipped; + int mark_fail; + int both; + int fail_len; + int filter_len; + int unmapped; + int oa_tag; + int del_tag; + int tol; + char *arg_list; + char *stats_file; + char *rejects_file; +} cl_param_t; + + +static int bed_entry_sort(const void *av, const void *bv) { + bed_entry_t *a = (bed_entry_t *) av; + bed_entry_t *b = (bed_entry_t *) bv; + return a->right < b->right ? -1 : (a->right == b->right ? 0 : 1); +} + + +int load_bed_file_multi_ref(char *infile, int get_strand, int sort_by_pos, khash_t(bed_list_hash) *bed_lists) { + hFILE *fp; + int line_count = 0, ret; + int64_t left, right; + kstring_t line = KS_INITIALIZE; + bed_entry_list_t *list; + khiter_t bed_itr; + + if ((fp = hopen(infile, "r")) == NULL) { + print_error_errno("amplicon", "unable to open file %s.", infile); + return 1; + } + + char ref[1024]; + + while (line.l = 0, kgetline(&line, (kgets_func *)hgets, fp) >= 0) { + line_count++; + int hret; + char strand; + + if (line.l == 0 || *line.s == '#') continue; + if (strncmp(line.s, "track ", 6) == 0) continue; + if (strncmp(line.s, "browser ", 8) == 0) continue; + + if (get_strand) { + if (sscanf(line.s, "%1023s %"SCNd64" %"SCNd64" %*s %*s %c", + ref, &left, &right, &strand) != 4) { + fprintf(samtools_stderr, "[amplicon] error: bad bed file format in line %d of %s.\n" + "(N.B. ref/chrom name limited to 1023 characters.)\n", + line_count, infile); + ret = 1; + goto error; + } + } else { + if (sscanf(line.s, "%1023s %"SCNd64" %"SCNd64, + ref, &left, &right) != 3) { + fprintf(samtools_stderr, "[amplicon] error: bad bed file format in line %d of %s\n" + "(N.B. ref/chrom name limited to 1023 characters.)\n", + line_count, infile); + ret = 1; + goto error; + } + } + + bed_itr = kh_get(bed_list_hash, bed_lists, ref); + + if (bed_itr == kh_end(bed_lists)) { // new ref entry + char *ref_name = strdup(ref); // need a copy for the hash key + + if (!ref_name) { + fprintf(samtools_stderr, "[amplicon] error: unable to allocate memory for ref name.\n"); + ret = 1; + goto error; + } + + bed_itr = kh_put(bed_list_hash, bed_lists, ref_name, &hret); + + if (hret > 0) { + list = &kh_val(bed_lists, bed_itr); + + // initialise the new hash entry + list->longest = 0; + list->size = 0; + list->length = 0; + list->bp = NULL; + } else { + fprintf(samtools_stderr, "[amplicon] error: ref hashing failure.\n"); + ret = 1; + goto error; + } + } else { // existing ref + list = &kh_val(bed_lists, bed_itr); + } + + if (list->length == list->size) { + bed_entry_t *tmp; + + list->size += list->size / 2 + 256; + + if ((tmp = realloc(list->bp, list->size * sizeof(bed_entry_t))) == NULL) { + fprintf(samtools_stderr, "[amplicon] error: unable to allocate more memory for bed data.\n"); + ret = 1; + goto error; + } + + list->bp = tmp; + } + + list->bp[list->length].left = left; + list->bp[list->length].right = right; + + if (get_strand) { + if (strand == '+') { + list->bp[list->length].rev = 0; + } else if (strand == '-') { + list->bp[list->length].rev = 1; + } else { + fprintf(samtools_stderr, "[amplicon] error: bad strand value in line %d, expecting '+' or '-', found '%c'.\n", + line_count, strand); + ret = 1; + goto error; + } + } + + if (right - left > list->longest) + list->longest = right - left; + + list->length++; + } + + if (sort_by_pos) { + for (bed_itr = kh_begin(bed_lists); bed_itr != kh_end(bed_lists); ++bed_itr) { + if (kh_exist(bed_lists, bed_itr)) { + list = &kh_val(bed_lists, bed_itr); + qsort(list->bp, list->length, sizeof(list->bp[0]), bed_entry_sort); + } + } + } + + if (kh_size(bed_lists) > 0) {// any entries + ret = 0; + } else { + ret = 1; + } + +error: + ks_free(&line); + + if (hclose(fp) != 0) { + fprintf(samtools_stderr, "[amplicon] warning: failed to close %s", infile); + } + + return ret; +} + + +void destroy_bed_hash(khash_t(bed_list_hash) *hash) { + khiter_t itr; + + for (itr = kh_begin(hash); itr != kh_end(hash); ++itr) { + if (kh_exist(hash, itr)) { + free(kh_val(hash, itr).bp); + free((char *)kh_key(hash, itr)); + kh_key(hash, itr) = NULL; + } + } + + kh_destroy(bed_list_hash, hash); +} + + +static int matching_clip_site(bed_entry_list_t *sites, hts_pos_t pos, + int is_rev, int use_strand, int64_t longest, + cl_param_t *param) { + int i, size; // may need this to be variable + int tol = param->tol; + int l = 0, mid = sites->length / 2, r = sites->length; + int pos_tol = is_rev ? (pos > tol ? pos - tol : 0) : pos; + + while (r - l > 1) { + if (sites->bp[mid].right <= pos_tol) { + l = mid; + } else { + r = mid; + } + mid = (l + r) / 2; + } + + size = 0; + + for (i = l; i < sites->length; i++) { + hts_pos_t mod_left, mod_right; + + if (use_strand && is_rev != sites->bp[i].rev) + continue; + + if (is_rev) { + mod_left = sites->bp[i].left; + mod_right = sites->bp[i].right + tol; + } else { + if (sites->bp[i].left > tol) { + mod_left = sites->bp[i].left - tol; + } else { + mod_left = 0; + } + mod_right = sites->bp[i].right; + } + + if (pos + longest + tol < mod_right) + break; + + if (pos >= mod_left && pos <= mod_right) { + if (is_rev) { + if (size < pos - sites->bp[i].left) { + size = pos - sites->bp[i].left; + } + } else { + if (size < sites->bp[i].right - pos) { + size = sites->bp[i].right - pos; + } + } + } + } + + return size; +} + + +static int bam_trim_left(bam1_t *rec, bam1_t *rec_out, uint32_t bases, + clipping_type clipping) { + uint32_t *orig_cigar = bam_get_cigar(rec); + uint8_t *orig_seq = bam_get_seq(rec); + uint8_t *orig_qual = bam_get_qual(rec); + uint8_t *orig_aux = bam_get_aux(rec); + uint32_t *new_cigar; + uint8_t *new_qual; + size_t orig_l_aux = bam_get_l_aux(rec); + uint32_t i, j; + uint32_t ref_remove = bases, qry_removed = 0, hardclip = 0; + hts_pos_t new_pos = rec->core.pos; + uint32_t cig_type, cig_op; + + if (rec->l_data + 8 > rec_out->m_data) { + uint8_t *new_data = realloc(rec_out->data, rec->l_data + 8); + if (!new_data) { + fprintf(samtools_stderr, "[ampliconclip] error: could not allocate memoy for new bam record\n"); + return 1; + } + rec_out->data = new_data; + rec_out->m_data = rec->l_data + 8; + } + + // Copy core data & name + memcpy(&rec_out->core, &rec->core, sizeof(rec->core)); + memcpy(rec_out->data, rec->data, rec->core.l_qname); + + if (clipping == hard_clip && bases >= rec->core.l_qseq) { + rec_out->core.l_qseq = 0; + rec_out->core.n_cigar = 0; + + if (orig_l_aux) + memcpy(bam_get_aux(rec_out), orig_aux, orig_l_aux); + + rec_out->l_data = bam_get_aux(rec_out) - rec_out->data + orig_l_aux; + + return 0; + } + + // Modify CIGAR + new_cigar = bam_get_cigar(rec_out); + + for (i = 0; i < rec->core.n_cigar; i++) { + cig_op = bam_cigar_op(orig_cigar[i]); + cig_type = bam_cigar_type(cig_op); + + if (cig_op == BAM_CHARD_CLIP) { + hardclip += bam_cigar_oplen(orig_cigar[i]); + } else { + if (cig_type & 2) { + if (bam_cigar_oplen(orig_cigar[i]) <= ref_remove) { + ref_remove -= bam_cigar_oplen(orig_cigar[i]); + } else { + break; + } + new_pos += bam_cigar_oplen(orig_cigar[i]); + } + if (cig_type & 1) { + qry_removed += bam_cigar_oplen(orig_cigar[i]); + } + } + } + + if (i < rec->core.n_cigar) { + cig_type = bam_cigar_type(bam_cigar_op(orig_cigar[i])); + + // account for the last operation + if (cig_type & 2) { + new_pos += ref_remove; + } + if (cig_type & 1) { + qry_removed += ref_remove; + } + } else { + qry_removed = rec->core.l_qseq; + } + + j = 0; + if (clipping == hard_clip && hardclip + qry_removed > 0) { + new_cigar[j++] = bam_cigar_gen(hardclip + qry_removed, BAM_CHARD_CLIP); + } + if (clipping == soft_clip) { + if (hardclip > 0) { + new_cigar[j++] = bam_cigar_gen(hardclip, BAM_CHARD_CLIP); + } + if (qry_removed > 0) { + new_cigar[j++] = bam_cigar_gen(qry_removed, BAM_CSOFT_CLIP); + } + } + + if (i < rec->core.n_cigar + && bam_cigar_oplen(orig_cigar[i]) > ref_remove) { + new_cigar[j++] = bam_cigar_gen(bam_cigar_oplen(orig_cigar[i]) - ref_remove, bam_cigar_op(orig_cigar[i])); + + // fill in the rest of the cigar + i++; + + for (; i < rec->core.n_cigar; i++) { + new_cigar[j++] = orig_cigar[i]; + } + } + + rec_out->core.n_cigar = j; + + if (clipping == soft_clip) { + qry_removed = 0; // Copy all the sequence and confidence values + } + + new_qual = bam_get_seq(rec_out) + (rec->core.l_qseq - qry_removed + 1) / 2; + // Copy remaining SEQ + if ((qry_removed & 1) == 0) { + memcpy(bam_get_seq(rec_out), orig_seq + (qry_removed / 2), + (rec->core.l_qseq - qry_removed + 1) / 2); // +1 to account for odd numbers + } else { + uint8_t *in = orig_seq + qry_removed / 2; + uint8_t *out = bam_get_seq(rec_out); + uint32_t i; + for (i = qry_removed; i < rec->core.l_qseq - 1; i += 2) { + *out++ = ((in[0] & 0x0f) << 4) | ((in[1] & 0xf0) >> 4); + in++; + } + if (i < rec->core.l_qseq) { + *out++ = (in[0] & 0x0f) << 4; + } + assert(out == new_qual); + } + + // Copy remaining QUAL + memmove(new_qual, orig_qual, rec->core.l_qseq - qry_removed); + + // Set new l_qseq + rec_out->core.l_qseq -= qry_removed; + + // Move AUX + if (orig_l_aux) + memcpy(bam_get_aux(rec_out), orig_aux, orig_l_aux); + + // Set new l_data + rec_out->l_data = bam_get_aux(rec_out) - rec_out->data + orig_l_aux; + + // put in new pos + rec_out->core.pos = new_pos; + + return 0; +} + + +static int bam_trim_right(bam1_t *rec, bam1_t *rec_out, uint32_t bases, + clipping_type clipping) { + uint32_t *orig_cigar = bam_get_cigar(rec); + uint8_t *orig_seq = bam_get_seq(rec); + uint8_t *orig_qual = bam_get_qual(rec); + uint8_t *orig_aux = bam_get_aux(rec); + uint32_t *new_cigar; + uint32_t new_n_cigar = 0; + uint8_t *new_qual; + size_t orig_l_aux = bam_get_l_aux(rec); + int32_t i; + int32_t j; + uint32_t ref_remove = bases, qry_removed = 0, hardclip = 0; + uint32_t cig_type, cig_op; + + if (rec->l_data + 8 > rec_out->m_data) { + uint8_t *new_data = realloc(rec_out->data, rec->l_data + 8); + if (!new_data) { + fprintf(samtools_stderr, "[ampliconclip] error: could not allocate memoy for new bam record\n"); + return 1; + } + rec_out->data = new_data; + rec_out->m_data = rec->l_data + 8; + } + + // Copy core data & name + memcpy(&rec_out->core, &rec->core, sizeof(rec->core)); + memcpy(rec_out->data, rec->data, rec->core.l_qname); + + if (clipping == hard_clip && bases >= rec->core.l_qseq) { + rec_out->core.l_qseq = 0; + rec_out->core.n_cigar = 0; + + if (orig_l_aux) + memcpy(bam_get_aux(rec_out), orig_aux, orig_l_aux); + + rec_out->l_data = bam_get_aux(rec_out) - rec_out->data + orig_l_aux; + return 0; + } + + // Modify CIGAR here + new_cigar = bam_get_cigar(rec_out); + + for (i = rec->core.n_cigar - 1; i >= 0; --i) { + cig_op = bam_cigar_op(orig_cigar[i]); + cig_type = bam_cigar_type(cig_op); + + if (cig_op == BAM_CHARD_CLIP) { + hardclip += bam_cigar_oplen(orig_cigar[i]); + } else { + if (cig_type & 2) { + if (bam_cigar_oplen(orig_cigar[i]) <= ref_remove) { + ref_remove -= bam_cigar_oplen(orig_cigar[i]); + } else { + break; + } + } + if (cig_type & 1) { + qry_removed += bam_cigar_oplen(orig_cigar[i]); + } + } + } + + if (i >= 0) { + cig_type = bam_cigar_type(bam_cigar_op(orig_cigar[i])); + if (cig_type & 1) { + qry_removed += ref_remove; + } + j = i; + if (qry_removed > 0) j++; + if (hardclip > 0 && (clipping == soft_clip || qry_removed == 0)) j++; + } else { + qry_removed = rec->core.l_qseq; + j = 0; + if (hardclip > 0 && clipping == soft_clip) j++; + } + + if (clipping == hard_clip && hardclip + qry_removed > 0) { + new_cigar[j] = bam_cigar_gen(hardclip + qry_removed, BAM_CHARD_CLIP); + new_n_cigar++; + } + if (clipping == soft_clip) { + if (hardclip > 0) { + new_cigar[j] = bam_cigar_gen(hardclip, BAM_CHARD_CLIP); + new_n_cigar++; + if (qry_removed > 0) --j; + } + if (qry_removed > 0) { + new_cigar[j] = bam_cigar_gen(qry_removed, BAM_CSOFT_CLIP); + new_n_cigar++; + } + } + + if (j > 0) { + new_cigar[--j] = bam_cigar_gen(bam_cigar_oplen(orig_cigar[i]) - ref_remove, bam_cigar_op(orig_cigar[i])); + new_n_cigar++; + } + + // fill in the rest of the cigar + while (j > 0) { + new_cigar[--j] = orig_cigar[--i]; + new_n_cigar++; + } + + rec_out->core.n_cigar = new_n_cigar; + + if (clipping == soft_clip) + qry_removed = 0; // Copy all the sequence and confidence values + + new_qual = bam_get_seq(rec_out) + (rec->core.l_qseq - qry_removed + 1) / 2; + // Copy remaining SEQ + memcpy(bam_get_seq(rec_out), orig_seq, (rec->core.l_qseq - qry_removed + 1) / 2); + + // Copy remaining QUAL + memcpy(new_qual, orig_qual, rec->core.l_qseq - qry_removed); + + // Set new l_qseq + rec_out->core.l_qseq -= qry_removed; + + // Copy AUX + if (orig_l_aux) + memcpy(bam_get_aux(rec_out), orig_aux, orig_l_aux); + + // Set new l_data + rec_out->l_data = bam_get_aux(rec_out) - rec_out->data + orig_l_aux; + + return 0; +} + + +static hts_pos_t active_query_len(bam1_t *b) { + uint32_t *cigar = bam_get_cigar(b); + uint32_t cig_type, cig_op; + hts_pos_t len = 0; + int i; + + for (i = 0; i < b->core.n_cigar; i++) { + cig_op = bam_cigar_op(cigar[i]); + cig_type = bam_cigar_type(cig_op); + + if ((cig_type & 1) && (cig_op != BAM_CSOFT_CLIP)) { + len += bam_cigar_oplen(cigar[i]); + } + } + + return len; +} + + +static inline void swap_bams(bam1_t **a, bam1_t **b) { + bam1_t *tmp = *a; + *a = *b; + *b = tmp; +} + + +// Format OA:Z:(RNAME,POS,strand,CIGAR,MAPQ,NM; +static inline int tag_original_data(bam1_t *orig, kstring_t *oa_tag) { + char strand; + uint8_t *nm_tag, *old_oa_tag; + uint32_t *cigar; + int64_t nm = 0; + int i, res = 0; + + ks_clear(oa_tag); + + // if there is an existing OA tag the new one gets appended to it + if ((old_oa_tag = bam_aux_get(orig, "OA"))) { + res |= ksprintf(oa_tag, "%s", bam_aux2Z(old_oa_tag)) < 0; + } + + if (orig->core.flag & BAM_FREVERSE) + strand = '-'; + else + strand = '+'; + + if ((nm_tag = bam_aux_get(orig, "NM"))) { + nm = bam_aux2i(nm_tag); + } + + res |= ksprintf(oa_tag, "%s,%"PRIhts_pos",%c,", bam_get_qname(orig), orig->core.pos + 1, strand) < 0; + + for (i = 0, cigar = bam_get_cigar(orig); i < orig->core.n_cigar && res == 0; ++i) { + res |= kputw(bam_cigar_oplen(cigar[i]), oa_tag) < 0; + res |= kputc(bam_cigar_opchr(cigar[i]), oa_tag) < 0; + } + + if (nm_tag) { + res |= ksprintf(oa_tag, ",%d,%"PRId64";", orig->core.qual, nm) < 0; + } else { + res |= ksprintf(oa_tag, "%d,;", orig->core.qual) < 0; + } + + return res; +} + + +static int bam_clip(samFile *in, samFile *out, samFile *reject, char *bedfile, + clipping_type clipping, cl_param_t *param) { + int ret = 1, r, file_open = 0; + + bam_hdr_t *header = NULL; + bam1_t *b = NULL, *b_tmp = NULL; + long f_count = 0, r_count = 0, n_count = 0, l_count = 0, l_exclude = 0, b_count = 0; + long filtered = 0, written = 0, failed = 0; + kstring_t str = KS_INITIALIZE; + kstring_t oat = KS_INITIALIZE; + bed_entry_list_t *sites; + FILE *stats_fp = samtools_stderr; + khash_t(bed_list_hash) *bed_hash = kh_init(bed_list_hash); + + if (load_bed_file_multi_ref(bedfile, param->use_strand, 1, bed_hash)) { + fprintf(samtools_stderr, "[ampliconclip] error: unable to load bed file.\n"); + goto fail; + } + + if ((header = sam_hdr_read(in)) == NULL) { + fprintf(samtools_stderr, "[ampliconclip] error: could not read header\n"); + goto fail; + } + + // changing pos can ruin coordinate sort order + if (sam_hdr_find_tag_hd(header, "SO", &str) == 0 && str.s && strcmp(str.s, "coordinate") == 0) { + const char *new_order = "unknown"; + + if (sam_hdr_update_hd(header, "SO", new_order) == -1) { + fprintf(samtools_stderr, "[ampliconclip] error: unable to change sort order to 'SO:%s'\n", new_order); + goto fail; + } + } + + ks_free(&str); + + if (param->add_pg && sam_hdr_add_pg(header, "samtools", "VN", samtools_version(), + param->arg_list ? "CL" : NULL, + param->arg_list ? param->arg_list : NULL, + NULL) != 0) { + fprintf(samtools_stderr, "[ampliconclip] warning: unable to add @PG line to header.\n"); + } + if (sam_hdr_write(out, header) < 0) { + fprintf(samtools_stderr, "[ampliconclip] error: could not write header.\n"); + goto fail; + } + + if (reject) { + if (sam_hdr_write(reject, header) < 0) { + fprintf(samtools_stderr, "[ampliconclip] error: could not write header to rejects file.\n"); + goto fail; + } + } + + b = bam_init1(); + b_tmp = bam_init1(); + if (!b || !b_tmp) { + fprintf(samtools_stderr, "[ampliconclip] error: out of memory when trying to create record.\n"); + goto fail; + } + + int32_t last_tid = -1; + int ref_found = 0; + + while ((r = sam_read1(in, header, b)) >= 0) { + hts_pos_t pos; + int is_rev; + int p_size; + int been_clipped = 0, filter = 0; + int exclude = (BAM_FUNMAP | BAM_FQCFAIL); + khiter_t itr; + + l_count++; + + if (b->core.tid != last_tid) { + const char *ref_name; + + ref_found = 0; + last_tid = b->core.tid; + + if ((ref_name = sam_hdr_tid2name(header, b->core.tid)) != NULL) { + itr = kh_get(bed_list_hash, bed_hash, ref_name); + + if (itr != kh_end(bed_hash)) { + sites = &kh_val(bed_hash, itr); + ref_found = 1; + } + } + } + + if (!(b->core.flag & exclude) && ref_found) { + if (param->oa_tag) + if (tag_original_data(b, &oat)) + goto fail; + + if (!param->both) { + if (bam_is_rev(b)) { + pos = bam_endpos(b); + is_rev = 1; + } else { + pos = b->core.pos; + is_rev = 0; + } + + if ((p_size = matching_clip_site(sites, pos, is_rev, param->use_strand, sites->longest, param))) { + if (is_rev) { + if (bam_trim_right(b, b_tmp, p_size, clipping) != 0) + goto fail; + + swap_bams(&b, &b_tmp); + r_count++; + } else { + if (bam_trim_left(b, b_tmp, p_size, clipping) != 0) + goto fail; + + swap_bams(&b, &b_tmp); + f_count++; + } + + if (param->oa_tag) { + if (bam_aux_update_str(b, "OA", oat.l + 1, (const char *)oat.s)) + goto fail; + } + + if (param->del_tag) { + uint8_t *tag; + + if ((tag = bam_aux_get(b, "NM"))) + bam_aux_del(b, tag); + + if ((tag = bam_aux_get(b, "MD"))) + bam_aux_del(b, tag); + } + + been_clipped = 1; + } else { + if (param->mark_fail) { + b->core.flag |= BAM_FQCFAIL; + } + + n_count++; + } + } else { + int left = 0, right = 0; + + // left first + pos = b->core.pos; + is_rev = 0; + + if ((p_size = matching_clip_site(sites, pos, is_rev, param->use_strand, sites->longest, param))) { + if (bam_trim_left(b, b_tmp, p_size, clipping) != 0) + goto fail; + + swap_bams(&b, &b_tmp); + f_count++; + left = 1; + been_clipped = 1; + } + + // the right + pos = bam_endpos(b); + is_rev = 1; + + if ((p_size = matching_clip_site(sites, pos, is_rev, param->use_strand, sites->longest, param))) { + if (bam_trim_right(b, b_tmp, p_size, clipping) != 0) + goto fail; + + swap_bams(&b, &b_tmp); + r_count++; + right = 1; + been_clipped = 1; + } + + if (left || right) { + uint8_t *tag; + + if (param->oa_tag) { + if (bam_aux_update_str(b, "OA", oat.l + 1, (const char *)oat.s)) + goto fail; + } + + if (param->del_tag) { + if ((tag = bam_aux_get(b, "NM"))) + bam_aux_del(b, tag); + + if ((tag = bam_aux_get(b, "MD"))) + bam_aux_del(b, tag); + } + } + + if (left && right) { + b_count++; + } else if (!left && !right) { + if (param->mark_fail) { + b->core.flag |= BAM_FQCFAIL; + } + + n_count++; + } + } + + if (param->fail_len >= 0 || param->filter_len >= 0) { + hts_pos_t aql = active_query_len(b); + + if (param->fail_len >= 0 && aql <= param->fail_len) { + b->core.flag |= BAM_FQCFAIL; + } + + if (param->filter_len >= 0 && aql <= param->filter_len) { + filter = 1; + } + } + + if (b->core.flag & BAM_FQCFAIL) { + failed++; + } + + if (param->write_clipped && !been_clipped) { + filter = 1; + } + + } else { + l_exclude++; + + if (param->unmapped) { + filter = 1; + } + } + + if (!filter) { + if (sam_write1(out, header, b) < 0) { + fprintf(samtools_stderr, "[ampliconclip] error: could not write line %ld.\n", l_count); + goto fail; + } + + written++; + } else { + if (reject) { + if (sam_write1(reject, header, b) < 0) { + fprintf(samtools_stderr, "[ampliconclip] error: could not write to reject file %s\n", + param->rejects_file); + goto fail; + } + } + + filtered++; + } + } + + if (r < -1) { + fprintf(samtools_stderr, "[ampliconclip] error: failed to read input.\n"); + goto fail; + } + + if (param->stats_file) { + if ((stats_fp = fopen(param->stats_file, "w")) == NULL) { + fprintf(samtools_stderr, "[ampliconclip] warning: cannot write stats to %s.\n", param->stats_file); + } else { + file_open = 1; + } + } + + fprintf(stats_fp, "COMMAND: %s\n" + "TOTAL READS: %ld\n" + "TOTAL CLIPPED: %ld\n" + "FORWARD CLIPPED: %ld\n" + "REVERSE CLIPPED: %ld\n" + "BOTH CLIPPED: %ld\n" + "NOT CLIPPED: %ld\n" + "EXCLUDED: %ld\n" + "FILTERED: %ld\n" + "FAILED: %ld\n" + "WRITTEN: %ld\n", param->arg_list, l_count, f_count + r_count, + f_count, r_count, b_count, n_count, l_exclude, + filtered, failed, written); + + if (file_open) { + fclose(stats_fp); + } + + ret = 0; + +fail: + destroy_bed_hash(bed_hash); + ks_free(&oat); + sam_hdr_destroy(header); + bam_destroy1(b); + bam_destroy1(b_tmp); + return ret; +} + + +static void usage(void) { + fprintf(samtools_stderr, "Usage: samtools ampliconclip -b BED file -o \n\n"); + fprintf(samtools_stderr, "Option: \n"); + fprintf(samtools_stderr, " -b FILE BED file of regions (eg amplicon primers) to be removed.\n"); + fprintf(samtools_stderr, " -o FILE output file name (default samtools_stdout).\n"); + fprintf(samtools_stderr, " -f FILE write stats to file name (default samtools_stderr)\n"); + fprintf(samtools_stderr, " -u Output uncompressed data\n"); + fprintf(samtools_stderr, " --soft-clip soft clip amplicon primers from reads (default)\n"); + fprintf(samtools_stderr, " --hard-clip hard clip amplicon primers from reads.\n"); + fprintf(samtools_stderr, " --both-ends clip on both 5' and 3' ends.\n"); + fprintf(samtools_stderr, " --strand use strand data from BED file to match read direction.\n"); + fprintf(samtools_stderr, " --clipped only output clipped reads.\n"); + fprintf(samtools_stderr, " --fail mark unclipped, mapped reads as QCFAIL.\n"); + fprintf(samtools_stderr, " --filter-len INT do not output reads INT size or shorter.\n"); + fprintf(samtools_stderr, " --fail-len INT mark as QCFAIL reads INT size or shorter.\n"); + fprintf(samtools_stderr, " --no-excluded do not write excluded reads (unmapped or QCFAIL).\n"); + fprintf(samtools_stderr, " --rejects-file FILE file to write filtered reads.\n"); + fprintf(samtools_stderr, " --original for clipped entries add an OA tag with original data.\n"); + fprintf(samtools_stderr, " --keep-tag for clipped entries keep the old NM and MD tags.\n"); + fprintf(samtools_stderr, " --tolerance match region within this number of bases, default 5.\n"); + fprintf(samtools_stderr, " --no-PG do not add an @PG line.\n"); + sam_global_opt_help(samtools_stderr, "-.O..@-."); + fprintf(samtools_stderr, "\nAbout: Soft clips read alignments where they match BED file defined regions.\n" + "Default clipping is only on the 5' end.\n\n"); +} + + +int amplicon_clip_main(int argc, char **argv) { + int c, ret; + char wmode[4] = {'w', 'b', 0, 0}; + char *bedfile = NULL, *fnout = "-"; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + htsThreadPool p = {NULL, 0}; + samFile *in = NULL, *out = NULL, *reject = NULL; + clipping_type clipping = soft_clip; + cl_param_t param = {1, 0, 0, 0, 0, -1, -1, 0, 0, 1, 5, NULL, NULL, NULL}; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + {"no-PG", no_argument, NULL, 1002}, + {"soft-clip", no_argument, NULL, 1003}, + {"hard-clip", no_argument, NULL, 1004}, + {"strand", no_argument, NULL, 1005}, + {"clipped", no_argument, NULL, 1006}, + {"fail", no_argument, NULL, 1007}, + {"both-ends", no_argument, NULL, 1008}, + {"filter-len", required_argument, NULL, 1009}, + {"fail-len", required_argument, NULL, 1010}, + {"no-excluded", no_argument, NULL, 1011}, + {"rejects-file", required_argument, NULL, 1012}, + {"original", no_argument, NULL, 1013}, + {"keep-tag", no_argument, NULL, 1014}, + {"tolerance", required_argument, NULL, 1015}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "b:@:o:O:f:u", lopts, NULL)) >= 0) { + switch (c) { + case 'b': bedfile = optarg; break; + case 'o': fnout = optarg; break; + case 'f': param.stats_file = optarg; break; + case 'u': wmode[2] = '0'; break; + case 1002: param.add_pg = 0; break; + case 1003: clipping = soft_clip; break; + case 1004: clipping = hard_clip; break; + case 1005: param.use_strand = 1; break; + case 1006: param.write_clipped = 1; break; + case 1007: param.mark_fail = 1; break; + case 1008: param.both = 1; break; + case 1009: param.filter_len = atoi(optarg); break; + case 1010: param.fail_len = atoi(optarg); break; + case 1011: param.unmapped = 1; break; + case 1012: param.rejects_file = optarg; break; + case 1013: param.oa_tag = 1; break; + case 1014: param.del_tag = 0; break; + case 1015: param.tol = atoi(optarg); break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage(); samtools_exit(1); + } + } + + if (!bedfile) { + usage(); + return 1; + } + + if (optind + 1 > argc) { + usage(); + return 1; + } + + if (param.tol < 0) { + fprintf(samtools_stderr, "[ampliconclip] warning: invalid tolerance of %d," + " reseting tolerance to default of 5.\n", param.tol); + param.tol = 5; + } + + if ((in = sam_open_format(argv[optind], "rb", &ga.in)) == NULL) { + print_error_errno("ampliconclip", "cannot open input file"); + return 1; + } + + sam_open_mode(wmode+1, fnout, NULL); + + if ((out = sam_open_format(fnout, wmode, &ga.out)) == NULL) { + print_error_errno("ampliconclip", "cannot open output file"); + return 1; + } + + if (param.rejects_file) { + sam_open_mode(wmode+1, param.rejects_file, NULL); + + if ((reject = sam_open_format(param.rejects_file, wmode, &ga.out)) == NULL) { + print_error_errno("ampliconclip", "cannot open rejects file"); + return 1; + } + } + + if (ga.nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(samtools_stderr, "[ampliconclip] error: cannot create thread pool.\n"); + return 1; + } + hts_set_opt(in, HTS_OPT_THREAD_POOL, &p); + hts_set_opt(out, HTS_OPT_THREAD_POOL, &p); + + if (reject) { + hts_set_opt(reject, HTS_OPT_THREAD_POOL, &p); + } + } + + param.arg_list = stringify_argv(argc + 1, argv - 1); + + ret = bam_clip(in, out, reject, bedfile, clipping, ¶m); + + // cleanup + sam_close(in); + + if (sam_close(out) < 0) { + fprintf(samtools_stderr, "[ampliconclip] error: error while closing output file %s.\n", argv[optind+1]); + ret = 1; + } + + if (reject) { + if (sam_close(reject) < 0) { + fprintf(samtools_stderr, "[ampliconclip] error: error while closing reject file %s.\n", param.rejects_file); + ret = 1; + } + } + + if (p.pool) hts_tpool_destroy(p.pool); + + sam_global_args_free(&ga); + free(param.arg_list); + + return ret; +} + diff --git a/samtools/bam_ampliconclip.h b/samtools/bam_ampliconclip.h new file mode 100644 index 0000000..ef35357 --- /dev/null +++ b/samtools/bam_ampliconclip.h @@ -0,0 +1,54 @@ +/* bam_ampliconclip.h -- shared functions between amplicon clip/stats + + Copyright (C) 2020-2021 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef BAM_AMPLICONCLIP_H +#define BAM_AMPLICONCLIP_H + +#include "htslib/khash.h" + +typedef struct { + int64_t left; + int64_t right; + int rev; +} bed_entry_t; + +typedef struct { + bed_entry_t *bp; + int64_t longest; + int length; + int size; +} bed_entry_list_t; + +KHASH_MAP_INIT_STR(bed_list_hash, bed_entry_list_t); + +#define BED_LIST_INIT {NULL, 0, 0, 0, {0}} + + +int load_bed_file_multi_ref(char *infile, int get_strand, + int sort_by_pos, khash_t(bed_list_hash) *bed_lists); + +void destroy_bed_hash(khash_t(bed_list_hash) *hash); + + +#endif /* BAM_AMPLICONCLIP_H */ diff --git a/samtools/bam_aux.c b/samtools/bam_aux.c new file mode 100644 index 0000000..d11ee6e --- /dev/null +++ b/samtools/bam_aux.c @@ -0,0 +1,61 @@ +/* bam_aux.c -- remaining aux field handling. + + Copyright (C) 2008-2010, 2013, 2015, 2019 Genome Research Ltd. + Portions copyright (C) 2011 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include "htslib/sam.h" + +static inline int bam_aux_type2size(int x) +{ + if (x == 'C' || x == 'c' || x == 'A') return 1; + else if (x == 'S' || x == 's') return 2; + else if (x == 'I' || x == 'i' || x == 'f' || x == 'F') return 4; + else return 0; +} + +#define __skip_tag(s) do { \ + int type = toupper(*(s)); \ + ++(s); \ + if (type == 'Z' || type == 'H') { while (*(s)) ++(s); ++(s); } \ + else if (type == 'B') (s) += 5 + bam_aux_type2size(*(s)) * (*(int32_t*)((s)+1)); \ + else (s) += bam_aux_type2size(type); \ + } while(0) + + +int bam_aux_drop_other(bam1_t *b, uint8_t *s) +{ + if (s) { + uint8_t *p, *aux; + aux = bam_get_aux(b); + p = s - 2; + __skip_tag(s); + memmove(aux, p, s - p); + b->l_data -= bam_get_l_aux(b) - (s - p); + } else { + b->l_data -= bam_get_l_aux(b); + } + return 0; +} diff --git a/samtools/bam_aux.c.pysam.c b/samtools/bam_aux.c.pysam.c new file mode 100644 index 0000000..621589d --- /dev/null +++ b/samtools/bam_aux.c.pysam.c @@ -0,0 +1,63 @@ +#include "samtools.pysam.h" + +/* bam_aux.c -- remaining aux field handling. + + Copyright (C) 2008-2010, 2013, 2015, 2019 Genome Research Ltd. + Portions copyright (C) 2011 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include "htslib/sam.h" + +static inline int bam_aux_type2size(int x) +{ + if (x == 'C' || x == 'c' || x == 'A') return 1; + else if (x == 'S' || x == 's') return 2; + else if (x == 'I' || x == 'i' || x == 'f' || x == 'F') return 4; + else return 0; +} + +#define __skip_tag(s) do { \ + int type = toupper(*(s)); \ + ++(s); \ + if (type == 'Z' || type == 'H') { while (*(s)) ++(s); ++(s); } \ + else if (type == 'B') (s) += 5 + bam_aux_type2size(*(s)) * (*(int32_t*)((s)+1)); \ + else (s) += bam_aux_type2size(type); \ + } while(0) + + +int bam_aux_drop_other(bam1_t *b, uint8_t *s) +{ + if (s) { + uint8_t *p, *aux; + aux = bam_get_aux(b); + p = s - 2; + __skip_tag(s); + memmove(aux, p, s - p); + b->l_data -= bam_get_l_aux(b) - (s - p); + } else { + b->l_data -= bam_get_l_aux(b); + } + return 0; +} diff --git a/samtools/bam_cat.c b/samtools/bam_cat.c new file mode 100644 index 0000000..ed8cf58 --- /dev/null +++ b/samtools/bam_cat.c @@ -0,0 +1,587 @@ +/* bam_cat.c -- efficiently concatenates bam files. + + Copyright (C) 2008-2009, 2011-2013, 2015-2017, 2019, 2021 Genome Research Ltd. + Modified SAMtools work copyright (C) 2010 Illumina, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* +bam_cat can be used to concatenate BAM files. Under special +circumstances, it can be used as an alternative to 'samtools merge' to +concatenate multiple sorted files into a single sorted file. For this +to work each file must be sorted, and the sorted files must be given +as command line arguments in order such that the final read in file i +is less than or equal to the first read in file i+1. + +This code is derived from the bam_reheader function in samtools 0.1.8 +and modified to perform concatenation by Chris Saunders on behalf of +Illumina. +*/ + +#include + +#include +#include +#include +#include +#include + +#include "htslib/bgzf.h" +#include "htslib/sam.h" +#include "htslib/cram.h" +#include "htslib/kstring.h" +#include "samtools.h" +#include "sam_opts.h" + +/* + * Check the files are consistent and capable of being concatenated. + * Also fills out the version numbers and produces a new sam_hdr_t + * structure with merged RG lines. + * Note it is only a simple merge. + * + * Returns updated header on success; + * NULL on failure. + */ +static sam_hdr_t *cram_cat_check_hdr(int nfn, char * const *fn, const sam_hdr_t *h, + int *vers_maj_p, int *vers_min_p) { + int i, vers_maj = -1, vers_min = -1; + sam_hdr_t *new_h = NULL, *old_h = NULL; + samFile *in = NULL; + kstring_t ks = KS_INITIALIZE; + + if (h) { + new_h = sam_hdr_dup(h); + if (!new_h) { + fprintf(stderr, "[%s] ERROR: header duplication failed.\n", + __func__); + goto fail; + } + } + + for (i = 0; i < nfn; ++i) { + cram_fd *in_c; + int ki; + + in = sam_open(fn[i], "rc"); + if (in == 0) { + print_error_errno("cat", "fail to open file '%s'", fn[i]); + goto fail; + } + in_c = in->fp.cram; + + int vmaj = cram_major_vers(in_c); + int vmin = cram_minor_vers(in_c); + if ((vers_maj != -1 && vers_maj != vmaj) || + (vers_min != -1 && vers_min != vmin)) { + fprintf(stderr, "[%s] ERROR: input files have differing version numbers.\n", + __func__); + goto fail; + } + vers_maj = vmaj; + vers_min = vmin; + + old_h = sam_hdr_read(in); + if (!old_h) { + fprintf(stderr, "[%s] ERROR: header reading for file '%s' filed.\n", + __func__, fn[i]); + goto fail; + } + + if (!new_h) { + new_h = sam_hdr_dup(old_h); + if (!new_h) { + fprintf(stderr, "[%s] ERROR: header duplication for file '%s' failed.\n", + __func__, fn[i]); + goto fail; + } + sam_hdr_destroy(old_h); + sam_close(in); + continue; + } + + int old_count = sam_hdr_count_lines(old_h, "RG"); + for (ki = 0; ki < old_count; ki++) { + const char *old_name = sam_hdr_line_name(old_h, "RG", ki); + if (old_name) { + int new_i = sam_hdr_line_index(new_h, "RG", old_name); + if (-1 == new_i) { // line does not exist in the new header + if (sam_hdr_find_line_pos(old_h, "RG", ki, &ks) || + !ks.s || sam_hdr_add_lines(new_h, ks.s, ks.l)) { + fprintf(stderr, "[%s] ERROR: failed to add @RG line 'ID:%s' from file '%s'\n", + __func__, old_name, fn[i]); + goto fail; + } + ks_free(&ks); + } + } else { + fprintf(stderr, "[%s] ERROR: failed to read %d @RG line from file '%s'\n", + __func__, ki, fn[i]); + goto fail; + } + } + + if (old_count > 1 && sam_hdr_count_lines(new_h, "RG") == old_count) { + for (ki = 0; ki < old_count; ki++) { + const char *old_name = sam_hdr_line_name(old_h, "RG", ki); + const char *new_name = sam_hdr_line_name(new_h, "RG", ki); + if (!old_name || !new_name || strcmp(old_name, new_name)) { + fprintf(stderr, "[%s] ERROR: Same size @RG lists but differing order / contents\n", + __func__); + goto fail; + } + } + } + + sam_hdr_destroy(old_h); + sam_close(in); + } + + ks_free(&ks); + + *vers_maj_p = vers_maj; + *vers_min_p = vers_min; + + return new_h; + +fail: + ks_free(&ks); + if (old_h) sam_hdr_destroy(old_h); + if (new_h) sam_hdr_destroy(new_h); + if (in) sam_close(in); + + return NULL; +} + + +/* + * CRAM files don't store the RG:Z:ID per read in the aux field. + * Instead they have a numerical data series (RG) to point each read + * back to the Nth @RG line in the file. This means that we may need + * to edit the RG data series (if the files were produced from + * "samtools split" for example). + * + * The encoding method is stored in the compression header. Typical + * examples: + * + * RG => EXTERNAL {18} # Block content-id 18 holds RG values + * # as a series of ITF8 encoded values + * + * RG => HUFFMAN {1, 255, 255, 255, 255, 255, 1, 0} + * # One RG value #-1. (No RG) + * + * RG => HUFFMAN {1, 0, 1, 0} # One RG value #0 (always first RG) + * + * RG => HUFFMAN {2, 0, 1, 2, 1, 1} + * # Two RG values, #0 and #1, written + * # to the CORE block and possibly + * # mixed with other data series. + * + * A single value can (but may not be) implemented as a zero bit + * huffman code. In this situation we can change the meta-data in the + * compression header to renumber an RG value.. + */ +int cram_cat(int nfn, char * const *fn, const sam_hdr_t *h, const char* outcram, sam_global_args *ga, char *arg_list, int no_pg) +{ + samFile *out; + cram_fd *out_c; + int i, vers_maj, vers_min; + sam_hdr_t *new_h = NULL; + + /* Check consistent versioning and compatible headers */ + if (!(new_h = cram_cat_check_hdr(nfn, fn, h, &vers_maj, &vers_min))) + return -1; + + /* Open the file with cram_vers */ + char vers[100]; + sprintf(vers, "%d.%d", vers_maj, vers_min); + out = sam_open_format(outcram, "wc", &ga->out); + if (out == 0) { + print_error_errno("cat", "fail to open output file '%s'", outcram); + return -1; + } + out_c = out->fp.cram; + cram_set_option(out_c, CRAM_OPT_VERSION, vers); + //fprintf(stderr, "Creating cram vers %s\n", vers); + + if (!no_pg && sam_hdr_add_pg(new_h, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + return -1; + + if (sam_hdr_write(out, new_h) < 0) { + print_error_errno("cat", "Couldn't write header"); + return -1; + } + + for (i = 0; i < nfn; ++i) { + samFile *in; + cram_fd *in_c; + cram_container *c; + sam_hdr_t *old_h; + int new_rg = -1; + + in = sam_open(fn[i], "rc"); + if (in == 0) { + print_error_errno("cat", "fail to open file '%s'", fn[i]); + return -1; + } + in_c = in->fp.cram; + + old_h = sam_hdr_read(in); + if (!old_h) { + print_error("cat", "fail to read the header of file '%s'", fn[i]); + return -1; + } + + // Compute RG mapping if suitable for changing. + if (sam_hdr_count_lines(old_h, "RG") == 1) { + const char *old_name = sam_hdr_line_name(old_h, "RG", 0); + if (old_name) { + new_rg = sam_hdr_line_index(new_h, "RG", old_name); + if (new_rg < 0) { + print_error("cat", "fail to find @RG line '%s' in the new header", old_name); + return -1; + } + } else { + print_error("cat", "fail to find @RG line in file '%s'", fn[i]); + return -1; + } + } else { + new_rg = 0; + } + + // Copy contains and blocks within them + while ((c = cram_read_container(in_c))) { + if (cram_container_is_empty(in_c)) { + cram_block *blk; + // Container compression header + if (!(blk = cram_read_block(in_c))) + return -1; + cram_free_block(blk); + cram_free_container(c); + continue; + } + + // If we have just one RG key and new_rg != 0 then + // we need to edit the compression header. IF WE CAN. + if (new_rg) { + int zero = 0; + //fprintf(stderr, "Transcode RG %d to %d\n", 0, new_rg); + cram_transcode_rg(in_c, out_c, c, 1, &zero, &new_rg); + } else { + int32_t num_slices; + cram_block *blk; + + // Not switching rg so do the usual read/write loop + if (cram_write_container(out_c, c) != 0) + return -1; + + // Container compression header + if (!(blk = cram_read_block(in_c))) + return -1; + if (cram_write_block(out_c, blk) != 0) { + cram_free_block(blk); + return -1; + } + cram_free_block(blk); + + + // Container num_blocks can be invalid, due to a bug. + // Instead we iterate in slice context instead. + (void)cram_container_get_landmarks(c, &num_slices); + cram_copy_slice(in_c, out_c, num_slices); + } + + cram_free_container(c); + } + + sam_hdr_destroy(old_h); + sam_close(in); + } + sam_close(out); + sam_hdr_destroy(new_h); + + return 0; +} + + +#define BUF_SIZE 0x10000 + +#define GZIPID1 31 +#define GZIPID2 139 + +#define BGZF_EMPTY_BLOCK_SIZE 28 + +int bam_cat(int nfn, char * const *fn, sam_hdr_t *h, const char* outbam, char *arg_list, int no_pg) +{ + BGZF *fp, *in = NULL; + uint8_t *buf = NULL; + uint8_t ebuf[BGZF_EMPTY_BLOCK_SIZE]; + const int es=BGZF_EMPTY_BLOCK_SIZE; + int i; + + fp = strcmp(outbam, "-")? bgzf_open(outbam, "w") : bgzf_fdopen(fileno(stdout), "w"); + if (fp == 0) { + print_error_errno("cat", "fail to open output file '%s'", outbam); + return -1; + } + if (h) { + if (!no_pg && sam_hdr_add_pg(h, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto fail; + + if (bam_hdr_write(fp, h) < 0) { + print_error_errno("cat", "Couldn't write header"); + goto fail; + } + } + + buf = (uint8_t*) malloc(BUF_SIZE); + if (!buf) { + fprintf(stderr, "[%s] Couldn't allocate buffer\n", __func__); + goto fail; + } + for(i = 0; i < nfn; ++i){ + sam_hdr_t *old; + int len,j; + + in = strcmp(fn[i], "-")? bgzf_open(fn[i], "r") : bgzf_fdopen(fileno(stdin), "r"); + if (in == 0) { + print_error_errno("cat", "fail to open file '%s'", fn[i]); + goto fail; + } + if (in->is_write) return -1; + + old = bam_hdr_read(in); + if (old == NULL) { + fprintf(stderr, "[%s] ERROR: couldn't read header for '%s'.\n", + __func__, fn[i]); + goto fail; + } + if (h == 0 && i == 0) { + if (!no_pg && sam_hdr_add_pg(old, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto fail; + + if (bam_hdr_write(fp, old) < 0) { + print_error_errno("cat", "Couldn't write header"); + goto fail; + } + } + + if (in->block_offset < in->block_length) { + if (bgzf_write(fp, (char *)in->uncompressed_block + in->block_offset, in->block_length - in->block_offset) < 0) goto write_fail; + if (bgzf_flush(fp) != 0) goto write_fail; + } + + j=0; + while ((len = bgzf_raw_read(in, buf, BUF_SIZE)) > 0) { + if(len= 0) { + switch (c) { + case 'h': { + samFile *fph = sam_open(optarg, "r"); + if (fph == 0) { + fprintf(stderr, "[%s] ERROR: fail to read the header from '%s'.\n", __func__, optarg); + return 1; + } + h = sam_hdr_read(fph); + if (h == NULL) { + fprintf(stderr, + "[%s] ERROR: failed to read the header from '%s'.\n", + __func__, optarg); + return 1; + } + sam_close(fph); + break; + } + case 'o': outfn = strdup(optarg); break; + case 'b': { + // add file names in "optarg" to the list + // of files to concatenate + int nfns; + char **fns_read = hts_readlines(optarg, &nfns); + if (fns_read) { + infns = realloc(infns, (infns_size + nfns) * sizeof(char*)); + if (infns == NULL) { ret = 1; goto end; } + memcpy(infns+infns_size, fns_read, nfns * sizeof(char*)); + infns_size += nfns; + free(fns_read); + } else { + print_error("cat", "Invalid file list \"%s\"", optarg); + ret = 1; + } + break; + } + case 1: + no_pg = 1; + break; + default: + if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage=1; break; + } + } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("cat", "failed to create arg_list"); + return 1; + } + + // Append files specified in argv to the list. + int nargv_fns = argc - optind; + if (nargv_fns > 0) { + infns = realloc(infns, (infns_size + nargv_fns) * sizeof(char*)); + if (infns == NULL) { ret = 1; goto end; } + memcpy(infns + infns_size, argv + optind, nargv_fns * sizeof(char*)); + } + + // Require at least one input file + if (infns_size + nargv_fns == 0 || usage) { + fprintf(stderr, "Usage: samtools cat [options] [... ]\n"); + fprintf(stderr, " samtools cat [options] [... ]\n\n"); + fprintf(stderr, "Concatenate BAM or CRAM files, first those in , then those\non the command line.\n\n"); + fprintf(stderr, "Options: -b FILE list of input BAM/CRAM file names, one per line\n"); + fprintf(stderr, " -h FILE copy the header from FILE [default is 1st input file]\n"); + fprintf(stderr, " -o FILE output BAM/CRAM\n"); + fprintf(stderr, " --no-PG do not add a PG line\n"); + sam_global_opt_help(stderr, "--..-@-."); + return 1; + } + + in = sam_open(infns[0], "r"); + if (!in) { + print_error_errno("cat", "failed to open file '%s'", infns[0]); + return 1; + } + + switch (hts_get_format(in)->format) { + case bam: + sam_close(in); + if (bam_cat(infns_size+nargv_fns, infns, h, outfn? outfn : "-", arg_list, no_pg) < 0) + ret = 1; + break; + + case cram: + sam_close(in); + if (cram_cat(infns_size+nargv_fns, infns, h, outfn? outfn : "-", &ga, arg_list, no_pg) < 0) + ret = 1; + break; + + default: + sam_close(in); + fprintf(stderr, "[%s] ERROR: input is not BAM or CRAM\n", __func__); + return 1; + } + + end: + if (infns_size > 0) { + int i; + for (i=0; i + +#include +#include +#include +#include +#include + +#include "htslib/bgzf.h" +#include "htslib/sam.h" +#include "htslib/cram.h" +#include "htslib/kstring.h" +#include "samtools.h" +#include "sam_opts.h" + +/* + * Check the files are consistent and capable of being concatenated. + * Also fills out the version numbers and produces a new sam_hdr_t + * structure with merged RG lines. + * Note it is only a simple merge. + * + * Returns updated header on success; + * NULL on failure. + */ +static sam_hdr_t *cram_cat_check_hdr(int nfn, char * const *fn, const sam_hdr_t *h, + int *vers_maj_p, int *vers_min_p) { + int i, vers_maj = -1, vers_min = -1; + sam_hdr_t *new_h = NULL, *old_h = NULL; + samFile *in = NULL; + kstring_t ks = KS_INITIALIZE; + + if (h) { + new_h = sam_hdr_dup(h); + if (!new_h) { + fprintf(samtools_stderr, "[%s] ERROR: header duplication failed.\n", + __func__); + goto fail; + } + } + + for (i = 0; i < nfn; ++i) { + cram_fd *in_c; + int ki; + + in = sam_open(fn[i], "rc"); + if (in == 0) { + print_error_errno("cat", "fail to open file '%s'", fn[i]); + goto fail; + } + in_c = in->fp.cram; + + int vmaj = cram_major_vers(in_c); + int vmin = cram_minor_vers(in_c); + if ((vers_maj != -1 && vers_maj != vmaj) || + (vers_min != -1 && vers_min != vmin)) { + fprintf(samtools_stderr, "[%s] ERROR: input files have differing version numbers.\n", + __func__); + goto fail; + } + vers_maj = vmaj; + vers_min = vmin; + + old_h = sam_hdr_read(in); + if (!old_h) { + fprintf(samtools_stderr, "[%s] ERROR: header reading for file '%s' filed.\n", + __func__, fn[i]); + goto fail; + } + + if (!new_h) { + new_h = sam_hdr_dup(old_h); + if (!new_h) { + fprintf(samtools_stderr, "[%s] ERROR: header duplication for file '%s' failed.\n", + __func__, fn[i]); + goto fail; + } + sam_hdr_destroy(old_h); + sam_close(in); + continue; + } + + int old_count = sam_hdr_count_lines(old_h, "RG"); + for (ki = 0; ki < old_count; ki++) { + const char *old_name = sam_hdr_line_name(old_h, "RG", ki); + if (old_name) { + int new_i = sam_hdr_line_index(new_h, "RG", old_name); + if (-1 == new_i) { // line does not exist in the new header + if (sam_hdr_find_line_pos(old_h, "RG", ki, &ks) || + !ks.s || sam_hdr_add_lines(new_h, ks.s, ks.l)) { + fprintf(samtools_stderr, "[%s] ERROR: failed to add @RG line 'ID:%s' from file '%s'\n", + __func__, old_name, fn[i]); + goto fail; + } + ks_free(&ks); + } + } else { + fprintf(samtools_stderr, "[%s] ERROR: failed to read %d @RG line from file '%s'\n", + __func__, ki, fn[i]); + goto fail; + } + } + + if (old_count > 1 && sam_hdr_count_lines(new_h, "RG") == old_count) { + for (ki = 0; ki < old_count; ki++) { + const char *old_name = sam_hdr_line_name(old_h, "RG", ki); + const char *new_name = sam_hdr_line_name(new_h, "RG", ki); + if (!old_name || !new_name || strcmp(old_name, new_name)) { + fprintf(samtools_stderr, "[%s] ERROR: Same size @RG lists but differing order / contents\n", + __func__); + goto fail; + } + } + } + + sam_hdr_destroy(old_h); + sam_close(in); + } + + ks_free(&ks); + + *vers_maj_p = vers_maj; + *vers_min_p = vers_min; + + return new_h; + +fail: + ks_free(&ks); + if (old_h) sam_hdr_destroy(old_h); + if (new_h) sam_hdr_destroy(new_h); + if (in) sam_close(in); + + return NULL; +} + + +/* + * CRAM files don't store the RG:Z:ID per read in the aux field. + * Instead they have a numerical data series (RG) to point each read + * back to the Nth @RG line in the file. This means that we may need + * to edit the RG data series (if the files were produced from + * "samtools split" for example). + * + * The encoding method is stored in the compression header. Typical + * examples: + * + * RG => EXTERNAL {18} # Block content-id 18 holds RG values + * # as a series of ITF8 encoded values + * + * RG => HUFFMAN {1, 255, 255, 255, 255, 255, 1, 0} + * # One RG value #-1. (No RG) + * + * RG => HUFFMAN {1, 0, 1, 0} # One RG value #0 (always first RG) + * + * RG => HUFFMAN {2, 0, 1, 2, 1, 1} + * # Two RG values, #0 and #1, written + * # to the CORE block and possibly + * # mixed with other data series. + * + * A single value can (but may not be) implemented as a zero bit + * huffman code. In this situation we can change the meta-data in the + * compression header to renumber an RG value.. + */ +int cram_cat(int nfn, char * const *fn, const sam_hdr_t *h, const char* outcram, sam_global_args *ga, char *arg_list, int no_pg) +{ + samFile *out; + cram_fd *out_c; + int i, vers_maj, vers_min; + sam_hdr_t *new_h = NULL; + + /* Check consistent versioning and compatible headers */ + if (!(new_h = cram_cat_check_hdr(nfn, fn, h, &vers_maj, &vers_min))) + return -1; + + /* Open the file with cram_vers */ + char vers[100]; + sprintf(vers, "%d.%d", vers_maj, vers_min); + out = sam_open_format(outcram, "wc", &ga->out); + if (out == 0) { + print_error_errno("cat", "fail to open output file '%s'", outcram); + return -1; + } + out_c = out->fp.cram; + cram_set_option(out_c, CRAM_OPT_VERSION, vers); + //fprintf(samtools_stderr, "Creating cram vers %s\n", vers); + + if (!no_pg && sam_hdr_add_pg(new_h, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + return -1; + + if (sam_hdr_write(out, new_h) < 0) { + print_error_errno("cat", "Couldn't write header"); + return -1; + } + + for (i = 0; i < nfn; ++i) { + samFile *in; + cram_fd *in_c; + cram_container *c; + sam_hdr_t *old_h; + int new_rg = -1; + + in = sam_open(fn[i], "rc"); + if (in == 0) { + print_error_errno("cat", "fail to open file '%s'", fn[i]); + return -1; + } + in_c = in->fp.cram; + + old_h = sam_hdr_read(in); + if (!old_h) { + print_error("cat", "fail to read the header of file '%s'", fn[i]); + return -1; + } + + // Compute RG mapping if suitable for changing. + if (sam_hdr_count_lines(old_h, "RG") == 1) { + const char *old_name = sam_hdr_line_name(old_h, "RG", 0); + if (old_name) { + new_rg = sam_hdr_line_index(new_h, "RG", old_name); + if (new_rg < 0) { + print_error("cat", "fail to find @RG line '%s' in the new header", old_name); + return -1; + } + } else { + print_error("cat", "fail to find @RG line in file '%s'", fn[i]); + return -1; + } + } else { + new_rg = 0; + } + + // Copy contains and blocks within them + while ((c = cram_read_container(in_c))) { + if (cram_container_is_empty(in_c)) { + cram_block *blk; + // Container compression header + if (!(blk = cram_read_block(in_c))) + return -1; + cram_free_block(blk); + cram_free_container(c); + continue; + } + + // If we have just one RG key and new_rg != 0 then + // we need to edit the compression header. IF WE CAN. + if (new_rg) { + int zero = 0; + //fprintf(samtools_stderr, "Transcode RG %d to %d\n", 0, new_rg); + cram_transcode_rg(in_c, out_c, c, 1, &zero, &new_rg); + } else { + int32_t num_slices; + cram_block *blk; + + // Not switching rg so do the usual read/write loop + if (cram_write_container(out_c, c) != 0) + return -1; + + // Container compression header + if (!(blk = cram_read_block(in_c))) + return -1; + if (cram_write_block(out_c, blk) != 0) { + cram_free_block(blk); + return -1; + } + cram_free_block(blk); + + + // Container num_blocks can be invalid, due to a bug. + // Instead we iterate in slice context instead. + (void)cram_container_get_landmarks(c, &num_slices); + cram_copy_slice(in_c, out_c, num_slices); + } + + cram_free_container(c); + } + + sam_hdr_destroy(old_h); + sam_close(in); + } + sam_close(out); + sam_hdr_destroy(new_h); + + return 0; +} + + +#define BUF_SIZE 0x10000 + +#define GZIPID1 31 +#define GZIPID2 139 + +#define BGZF_EMPTY_BLOCK_SIZE 28 + +int bam_cat(int nfn, char * const *fn, sam_hdr_t *h, const char* outbam, char *arg_list, int no_pg) +{ + BGZF *fp, *in = NULL; + uint8_t *buf = NULL; + uint8_t ebuf[BGZF_EMPTY_BLOCK_SIZE]; + const int es=BGZF_EMPTY_BLOCK_SIZE; + int i; + + fp = strcmp(outbam, "-")? bgzf_open(outbam, "w") : bgzf_fdopen(fileno(samtools_stdout), "w"); + if (fp == 0) { + print_error_errno("cat", "fail to open output file '%s'", outbam); + return -1; + } + if (h) { + if (!no_pg && sam_hdr_add_pg(h, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto fail; + + if (bam_hdr_write(fp, h) < 0) { + print_error_errno("cat", "Couldn't write header"); + goto fail; + } + } + + buf = (uint8_t*) malloc(BUF_SIZE); + if (!buf) { + fprintf(samtools_stderr, "[%s] Couldn't allocate buffer\n", __func__); + goto fail; + } + for(i = 0; i < nfn; ++i){ + sam_hdr_t *old; + int len,j; + + in = strcmp(fn[i], "-")? bgzf_open(fn[i], "r") : bgzf_fdopen(fileno(stdin), "r"); + if (in == 0) { + print_error_errno("cat", "fail to open file '%s'", fn[i]); + goto fail; + } + if (in->is_write) return -1; + + old = bam_hdr_read(in); + if (old == NULL) { + fprintf(samtools_stderr, "[%s] ERROR: couldn't read header for '%s'.\n", + __func__, fn[i]); + goto fail; + } + if (h == 0 && i == 0) { + if (!no_pg && sam_hdr_add_pg(old, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto fail; + + if (bam_hdr_write(fp, old) < 0) { + print_error_errno("cat", "Couldn't write header"); + goto fail; + } + } + + if (in->block_offset < in->block_length) { + if (bgzf_write(fp, (char *)in->uncompressed_block + in->block_offset, in->block_length - in->block_offset) < 0) goto write_fail; + if (bgzf_flush(fp) != 0) goto write_fail; + } + + j=0; + while ((len = bgzf_raw_read(in, buf, BUF_SIZE)) > 0) { + if(len= 0) { + switch (c) { + case 'h': { + samFile *fph = sam_open(optarg, "r"); + if (fph == 0) { + fprintf(samtools_stderr, "[%s] ERROR: fail to read the header from '%s'.\n", __func__, optarg); + return 1; + } + h = sam_hdr_read(fph); + if (h == NULL) { + fprintf(samtools_stderr, + "[%s] ERROR: failed to read the header from '%s'.\n", + __func__, optarg); + return 1; + } + sam_close(fph); + break; + } + case 'o': outfn = strdup(optarg); break; + case 'b': { + // add file names in "optarg" to the list + // of files to concatenate + int nfns; + char **fns_read = hts_readlines(optarg, &nfns); + if (fns_read) { + infns = realloc(infns, (infns_size + nfns) * sizeof(char*)); + if (infns == NULL) { ret = 1; goto end; } + memcpy(infns+infns_size, fns_read, nfns * sizeof(char*)); + infns_size += nfns; + free(fns_read); + } else { + print_error("cat", "Invalid file list \"%s\"", optarg); + ret = 1; + } + break; + } + case 1: + no_pg = 1; + break; + default: + if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage=1; break; + } + } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("cat", "failed to create arg_list"); + return 1; + } + + // Append files specified in argv to the list. + int nargv_fns = argc - optind; + if (nargv_fns > 0) { + infns = realloc(infns, (infns_size + nargv_fns) * sizeof(char*)); + if (infns == NULL) { ret = 1; goto end; } + memcpy(infns + infns_size, argv + optind, nargv_fns * sizeof(char*)); + } + + // Require at least one input file + if (infns_size + nargv_fns == 0 || usage) { + fprintf(samtools_stderr, "Usage: samtools cat [options] [... ]\n"); + fprintf(samtools_stderr, " samtools cat [options] [... ]\n\n"); + fprintf(samtools_stderr, "Concatenate BAM or CRAM files, first those in , then those\non the command line.\n\n"); + fprintf(samtools_stderr, "Options: -b FILE list of input BAM/CRAM file names, one per line\n"); + fprintf(samtools_stderr, " -h FILE copy the header from FILE [default is 1st input file]\n"); + fprintf(samtools_stderr, " -o FILE output BAM/CRAM\n"); + fprintf(samtools_stderr, " --no-PG do not add a PG line\n"); + sam_global_opt_help(samtools_stderr, "--..-@-."); + return 1; + } + + in = sam_open(infns[0], "r"); + if (!in) { + print_error_errno("cat", "failed to open file '%s'", infns[0]); + return 1; + } + + switch (hts_get_format(in)->format) { + case bam: + sam_close(in); + if (bam_cat(infns_size+nargv_fns, infns, h, outfn? outfn : "-", arg_list, no_pg) < 0) + ret = 1; + break; + + case cram: + sam_close(in); + if (cram_cat(infns_size+nargv_fns, infns, h, outfn? outfn : "-", &ga, arg_list, no_pg) < 0) + ret = 1; + break; + + default: + sam_close(in); + fprintf(samtools_stderr, "[%s] ERROR: input is not BAM or CRAM\n", __func__); + return 1; + } + + end: + if (infns_size > 0) { + int i; + for (i=0; i + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include + +#include "htslib/sam.h" + +/*! + @abstract Get the color encoding the previous and current base + @param b pointer to an alignment + @param i The i-th position, 0-based + @return color + + @discussion Returns 0 no color information is found. + */ +char bam_aux_getCSi(bam1_t *b, int i) +{ + uint8_t *c = bam_aux_get(b, "CS"); + char *cs = NULL; + + // return the base if the tag was not found + if(0 == c) return 0; + + cs = bam_aux2Z(c); + // adjust for strandedness and leading adaptor + if(bam_is_rev(b)) { + i = strlen(cs) - 1 - i; + // adjust for leading hard clip + uint32_t cigar = bam_get_cigar(b)[0]; + if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) { + i -= cigar >> BAM_CIGAR_SHIFT; + } + } else { i++; } + return cs[i]; +} + +/*! + @abstract Get the color quality of the color encoding the previous and current base + @param b pointer to an alignment + @param i The i-th position, 0-based + @return color quality + + @discussion Returns 0 no color information is found. + */ +char bam_aux_getCQi(bam1_t *b, int i) +{ + uint8_t *c = bam_aux_get(b, "CQ"); + char *cq = NULL; + + // return the base if the tag was not found + if(0 == c) return 0; + + cq = bam_aux2Z(c); + // adjust for strandedness + if(bam_is_rev(b)) { + i = strlen(cq) - 1 - i; + // adjust for leading hard clip + uint32_t cigar = bam_get_cigar(b)[0]; + if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) { + i -= (cigar >> BAM_CIGAR_SHIFT); + } + } + return cq[i]; +} + +char bam_aux_nt2int(char a) +{ + switch(toupper(a)) { + case 'A': + return 0; + break; + case 'C': + return 1; + break; + case 'G': + return 2; + break; + case 'T': + return 3; + break; + default: + return 4; + break; + } +} + +char bam_aux_ntnt2cs(char a, char b) +{ + a = bam_aux_nt2int(a); + b = bam_aux_nt2int(b); + if(4 == a || 4 == b) return '4'; + return "0123"[(int)(a ^ b)]; +} + +/*! + @abstract Get the color error profile at the give position + @param b pointer to an alignment + @return the original color if the color was an error, '-' (dash) otherwise + + @discussion Returns 0 no color information is found. + */ +char bam_aux_getCEi(bam1_t *b, int i) +{ + int cs_i; + uint8_t *c = bam_aux_get(b, "CS"); + char *cs = NULL; + char prev_b, cur_b; + char cur_color, cor_color; + + // return the base if the tag was not found + if(0 == c) return 0; + + cs = bam_aux2Z(c); + + // adjust for strandedness and leading adaptor + if(bam_is_rev(b)) { //reverse strand + cs_i = strlen(cs) - 1 - i; + // adjust for leading hard clip + uint32_t cigar = bam_get_cigar(b)[0]; + if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) { + cs_i -= cigar >> BAM_CIGAR_SHIFT; + } + // get current color + cur_color = cs[cs_i]; + // get previous base. Note: must rc adaptor + prev_b = (cs_i == 1) ? "TGCAN"[(int)bam_aux_nt2int(cs[0])] : seq_nt16_str[bam_seqi(bam_get_seq(b), i+1)]; + // get current base + cur_b = seq_nt16_str[bam_seqi(bam_get_seq(b), i)]; + } + else { + cs_i=i+1; + // get current color + cur_color = cs[cs_i]; + // get previous base + prev_b = (0 == i) ? cs[0] : seq_nt16_str[bam_seqi(bam_get_seq(b), i-1)]; + // get current base + cur_b = seq_nt16_str[bam_seqi(bam_get_seq(b), i)]; + } + + // corrected color + cor_color = bam_aux_ntnt2cs(prev_b, cur_b); + + if(cur_color == cor_color) { + return '-'; + } + else { + return cur_color; + } +} diff --git a/samtools/bam_color.c.pysam.c b/samtools/bam_color.c.pysam.c new file mode 100644 index 0000000..105cc33 --- /dev/null +++ b/samtools/bam_color.c.pysam.c @@ -0,0 +1,175 @@ +#include "samtools.pysam.h" + +/* bam_color.c -- color-space support. + + Copyright (C) 2009, 2012 University of California - Los Angeles. + + Author: Nils Homer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include + +#include "htslib/sam.h" + +/*! + @abstract Get the color encoding the previous and current base + @param b pointer to an alignment + @param i The i-th position, 0-based + @return color + + @discussion Returns 0 no color information is found. + */ +char bam_aux_getCSi(bam1_t *b, int i) +{ + uint8_t *c = bam_aux_get(b, "CS"); + char *cs = NULL; + + // return the base if the tag was not found + if(0 == c) return 0; + + cs = bam_aux2Z(c); + // adjust for strandedness and leading adaptor + if(bam_is_rev(b)) { + i = strlen(cs) - 1 - i; + // adjust for leading hard clip + uint32_t cigar = bam_get_cigar(b)[0]; + if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) { + i -= cigar >> BAM_CIGAR_SHIFT; + } + } else { i++; } + return cs[i]; +} + +/*! + @abstract Get the color quality of the color encoding the previous and current base + @param b pointer to an alignment + @param i The i-th position, 0-based + @return color quality + + @discussion Returns 0 no color information is found. + */ +char bam_aux_getCQi(bam1_t *b, int i) +{ + uint8_t *c = bam_aux_get(b, "CQ"); + char *cq = NULL; + + // return the base if the tag was not found + if(0 == c) return 0; + + cq = bam_aux2Z(c); + // adjust for strandedness + if(bam_is_rev(b)) { + i = strlen(cq) - 1 - i; + // adjust for leading hard clip + uint32_t cigar = bam_get_cigar(b)[0]; + if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) { + i -= (cigar >> BAM_CIGAR_SHIFT); + } + } + return cq[i]; +} + +char bam_aux_nt2int(char a) +{ + switch(toupper(a)) { + case 'A': + return 0; + break; + case 'C': + return 1; + break; + case 'G': + return 2; + break; + case 'T': + return 3; + break; + default: + return 4; + break; + } +} + +char bam_aux_ntnt2cs(char a, char b) +{ + a = bam_aux_nt2int(a); + b = bam_aux_nt2int(b); + if(4 == a || 4 == b) return '4'; + return "0123"[(int)(a ^ b)]; +} + +/*! + @abstract Get the color error profile at the give position + @param b pointer to an alignment + @return the original color if the color was an error, '-' (dash) otherwise + + @discussion Returns 0 no color information is found. + */ +char bam_aux_getCEi(bam1_t *b, int i) +{ + int cs_i; + uint8_t *c = bam_aux_get(b, "CS"); + char *cs = NULL; + char prev_b, cur_b; + char cur_color, cor_color; + + // return the base if the tag was not found + if(0 == c) return 0; + + cs = bam_aux2Z(c); + + // adjust for strandedness and leading adaptor + if(bam_is_rev(b)) { //reverse strand + cs_i = strlen(cs) - 1 - i; + // adjust for leading hard clip + uint32_t cigar = bam_get_cigar(b)[0]; + if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) { + cs_i -= cigar >> BAM_CIGAR_SHIFT; + } + // get current color + cur_color = cs[cs_i]; + // get previous base. Note: must rc adaptor + prev_b = (cs_i == 1) ? "TGCAN"[(int)bam_aux_nt2int(cs[0])] : seq_nt16_str[bam_seqi(bam_get_seq(b), i+1)]; + // get current base + cur_b = seq_nt16_str[bam_seqi(bam_get_seq(b), i)]; + } + else { + cs_i=i+1; + // get current color + cur_color = cs[cs_i]; + // get previous base + prev_b = (0 == i) ? cs[0] : seq_nt16_str[bam_seqi(bam_get_seq(b), i-1)]; + // get current base + cur_b = seq_nt16_str[bam_seqi(bam_get_seq(b), i)]; + } + + // corrected color + cor_color = bam_aux_ntnt2cs(prev_b, cur_b); + + if(cur_color == cor_color) { + return '-'; + } + else { + return cur_color; + } +} diff --git a/samtools/bam_consensus.c b/samtools/bam_consensus.c new file mode 100644 index 0000000..072dcd3 --- /dev/null +++ b/samtools/bam_consensus.c @@ -0,0 +1,1712 @@ +/* bam_consensus.c -- consensus subcommand. + + Copyright (C) 1998-2001,2003 Medical Research Council (Gap4/5 source) + Copyright (C) 2003-2005,2007-2022 Genome Research Ltd. + + Author: James Bonfield + +The primary work here is GRL since 2021, under an MIT license. +Sections derived from Gap5, which include calculate_consensus_gap5() +associated functions, are mostly copyright Genome Research Limited from +2003 onwards. These were originally under a BSD license, but as GRL is +copyright holder these portions can be considered to also be under the +same MIT license below: + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* + * The Gap5 consensus algorithm was in turn derived from the earlier Gap4 + * tool, developed by the Medical Research Council as part of the + * Staden Package. It is unsure how much of this source code is still + * extant, without deep review, but the license used was a compatible + * modified BSD license, included below. + */ + +/* +Modified BSD license for any legacy components from the Staden Package: + +Copyright (c) 2003 MEDICAL RESEARCH COUNCIL +All rights reserved + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + . Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + + . Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + + . Neither the name of the MEDICAL RESEARCH COUNCIL, THE LABORATORY OF +MOLECULAR BIOLOGY nor the names of its contributors may be used to endorse or +promote products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +// FIXME: also use strand to spot possible basecalling errors. +// Specifically het calls where mods are predominantly on one +// strand. So maybe require + and - calls and check concordance +// before calling a het as confident. (Still call, but low qual?) + +// TODO: call by kmers rather than individual bases? Or use kmers to skew +// quality at least. It can identify variants that are low quality due to +// neighbouring edits that aren't consistently correlated. + +// TODO: pileup callback ought to know when it's the last in the region / +// chromosome. This means the caller code doesn't have to handle the +// termination phase and deduplicates the code. (Changing from +// one chr to the next is the same as ending the last.) +// +// TODO: track which reads contribute to multiple confirmed (HQ) differences +// vs which contribute to only one (LQ) difference. Correlated changes +// are more likely to be real. Ie consensus more of a path than solely +// isolated columns. +// +// Either that or a dummy "end of data" call is made to signify end to +// permit tidying up. Maybe add a "start of data" call too? + +// Eg 50T 20A seems T/A het, +// but 30T+ 20T- 18A+ 2A- seems like a consistent A miscall on one strand +// only, while T is spread evenly across both strands. + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "samtools.h" +#include "sam_opts.h" +#include "bam_plbuf.h" +#include "consensus_pileup.h" + +#ifdef __SSE__ +# include +#else +# define _mm_prefetch(a,b) +#endif + +#ifndef MIN +# define MIN(a,b) ((a)<(b)?(a):(b)) +#endif +#ifndef MAX +# define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + +// Minimum cutoff for storing mod data; => at least 10% chance +#define MOD_CUTOFF 0.46 + +enum format { + FASTQ, + FASTA, + PILEUP +}; + +typedef unsigned char uc; + +typedef struct { + // User options + char *reg; + int use_qual; + int min_qual; + int adj_qual; + int use_mqual; + double scale_mqual; + int nm_adjust; + int nm_halo; + int sc_cost; + int low_mqual; + int high_mqual; + int min_depth; + double call_fract; + double het_fract; + int gap5; + enum format fmt; + int cons_cutoff; + int ambig; + int line_len; + int default_qual; + int het_only; + int all_bases; + int show_del; + int show_ins; + int excl_flags; + int incl_flags; + int min_mqual; + double P_het; + + // Internal state + samFile *fp; + FILE *fp_out; + sam_hdr_t *h; + hts_idx_t *idx; + hts_itr_t *iter; + kstring_t ks_line; + kstring_t ks_ins_seq; + kstring_t ks_ins_qual; + int last_tid; + hts_pos_t last_pos; +} consensus_opts; + +/* -------------------------------------------------------------------------- + * A bayesian consensus algorithm that analyses the data to work out + * which hypothesis of pure A/C/G/T/absent and all combinations of two + * such bases meets the observations. + * + * This has its origins in Gap4 (homozygous) -> Gap5 (heterozygous) + * -> Crumble (tidied up to use htslib's pileup) -> here. + * + */ + +#define CONS_DISCREP 4 +#define CONS_ALL 15 + +#define CONS_MQUAL 16 + +typedef struct { + /* the most likely base call - we never call N here */ + /* A=0, C=1, G=2, T=3, *=4 */ + int call; + + /* The most likely heterozygous base call */ + /* Use "ACGT*"[het / 5] vs "ACGT*"[het % 5] for the combination */ + int het_call; + + /* Log-odds for het_call */ + int het_logodd; + + /* Single phred style call */ + int phred; + + /* Sequence depth */ + int depth; + + /* Discrepancy search score */ + float discrep; +} consensus_t; + +#define P_HET 1e-4 + +#define LOG10 2.30258509299404568401 +#define TENOVERLOG10 4.34294481903251827652 +#define TENLOG2OVERLOG10 3.0103 + +#ifdef __GNUC__ +#define ALIGNED(x) __attribute((aligned(x))) +#else +#define ALIGNED(x) +#endif + +static double prior[25] ALIGNED(16); /* Sum to 1.0 */ +static double lprior15[15] ALIGNED(16); /* 15 combinations of {ACGT*} */ + +/* Precomputed matrices for the consensus algorithm */ +static double pMM[101] ALIGNED(16); +static double p__[101] ALIGNED(16); +static double p_M[101] ALIGNED(16); + +static double e_tab_a[1002] ALIGNED(16); +static double *e_tab = &e_tab_a[500]; +static double e_tab2_a[1002] ALIGNED(16); +static double *e_tab2 = &e_tab2_a[500]; +static double e_log[501] ALIGNED(16); + +/* + * Lots of confusing matrix terms here, so some definitions will help. + * + * M = match base + * m = match pad + * _ = mismatch + * o = overcall + * u = undercall + * + * We need to distinguish between homozygous columns and heterozygous columns, + * done using a flat prior. This is implemented by treating every observation + * as coming from one of two alleles, giving us a 2D matrix of possibilities + * (the hypotheses) for each and every call (the observation). + * + * So pMM[] is the chance that given a call 'x' that it came from the + * x/x allele combination. Similarly p_o[] is the chance that call + * 'x' came from a mismatch (non-x) / overcall (consensus=*) combination. + * + * Examples with observation (call) C and * follows + * + * C | A C G T * * | A C G T * + * ----------------- ----------------- + * A | __ _M __ __ o_ A | uu uu uu uu um + * C | _M MM _M _M oM C | uu uu uu uu um + * G | __ _M __ __ o_ G | uu uu uu uu um + * T | __ _M __ __ o_ T | uu uu uu uu um + * * | o_ oM o_ o_ oo * | um um um um mm + * + * In calculation terms, the _M is half __ and half MM, similarly o_ and um. + * + * Relative weights of substitution vs overcall vs undercall are governed on a + * per base basis using the P_OVER and P_UNDER scores (subst is + * 1-P_OVER-P_UNDER). + * + * The heterozygosity weight though is a per column calculation as we're + * trying to model whether the column is pure or mixed. Hence this is done + * once via a prior and has no affect on the individual matrix cells. + */ + +static void consensus_init(double p_het) { + int i; + + for (i = -500; i <= 500; i++) + e_tab[i] = exp(i); + for (i = -500; i <= 500; i++) + e_tab2[i] = exp(i/10.); + for (i = 0; i <= 500; i++) + e_log[i] = log(i); + + // Heterozygous locations + for (i = 0; i < 25; i++) + prior[i] = p_het / 20; + prior[0] = prior[6] = prior[12] = prior[18] = prior[24] = (1-p_het)/5; + + lprior15[0] = log(prior[0]); + lprior15[1] = log(prior[1]*2); + lprior15[2] = log(prior[2]*2); + lprior15[3] = log(prior[3]*2); + lprior15[4] = log(prior[4]*2); + lprior15[5] = log(prior[6]); + lprior15[6] = log(prior[7]*2); + lprior15[7] = log(prior[8]*2); + lprior15[8] = log(prior[9]*2); + lprior15[9] = log(prior[12]); + lprior15[10] = log(prior[13]*2); + lprior15[11] = log(prior[14]*2); + lprior15[12] = log(prior[18]); + lprior15[13] = log(prior[19]*2); + lprior15[14] = log(prior[24]); + + + // Rewrite as new form + for (i = 1; i < 101; i++) { + double prob = 1 - pow(10, -i / 10.0); + + // May want to multiply all these by 5 so pMM[i] becomes close + // to -0 for most data. This makes the sums increment very slowly, + // keeping bit precision in the accumulator. + pMM[i] = log(prob/5); + p__[i] = log((1-prob)/20); + p_M[i] = log((exp(pMM[i]) + exp(p__[i]))/2); + } + + pMM[0] = pMM[1]; + p__[0] = p__[1]; + p_M[0] = p_M[1]; +} + +static inline double fast_exp(double y) { + if (y >= -50 && y <= 50) + return e_tab2[(int)(y*10)]; + + if (y < -500) + y = -500; + if (y > 500) + y = 500; + + return e_tab[(int)y]; +} + +/* Taylor (deg 3) implementation of the log */ +static inline double fast_log2(double val) +{ + // FP representation is exponent & mantissa, where + // value = 2^E * M. + // Hence log2(value) = log2(2^E * M) + // = log2(2^E)+ log2(M) + // = E + log2(M) + union { double d; uint64_t x; } u = {val}; + const int E = ((u.x >> 52) & 2047) - 1024; // exponent E + // Initial log2(M) based on mantissa + u.x &= ~(2047LL << 52); + u.x += 1023LL << 52; + + val = ((-1/3.) * u.d + 2) * u.d - 2/3.; + + return E + val; +} + +#define ph_log(x) (-TENLOG2OVERLOG10*fast_log2((x))) + + +int nins(const bam1_t *b){ + int i, indel = 0; + uint32_t *cig = bam_get_cigar(b); + for (i = 0; i < b->core.n_cigar; i++) { + int op = bam_cigar_op(cig[i]); + if (op == BAM_CINS || op == BAM_CDEL) + indel += bam_cigar_oplen(cig[i]); + } + return indel; +} + +// Return the local NM figure within halo (+/- HALO) of pos. +// This local NM is used as a way to modify MAPQ to get a localised MAPQ +// score via an adhoc fashion. +double nm_local(const pileup_t *p, const bam1_t *b, hts_pos_t pos) { + int *nm = (int *)p->cd; + if (!nm) + return 0; + pos -= b->core.pos; + if (pos < 0) + return nm[0]; + if (pos >= b->core.l_qseq) + return nm[b->core.l_qseq-1]; + + return nm[pos] / 10.0; +} + +/* + * Initialise a new sequence appearing in the pileup. We use this to + * precompute some metrics that we'll repeatedly use in the consensus + * caller; the localised NM score. + * + * We also directly amend the BAM record (which will be discarded later + * anyway) to modify qualities to account for local quality minima. + * + * Returns 0 (discard) or 1 (keep) on success, -1 on failure. + */ +int nm_init(void *client_data, samFile *fp, sam_hdr_t *h, pileup_t *p) { + consensus_opts *opts = (consensus_opts *)client_data; + if (!opts->use_mqual) + return 1; + + const bam1_t *b = &p->b; + int qlen = b->core.l_qseq, i; + int *local_nm = calloc(qlen, sizeof(*local_nm)); + if (!local_nm) + return -1; + p->cd = local_nm; + + if (opts->adj_qual) { +#if 0 + // Tweak by localised quality. + // Quality is reduced by a significant portion of the minimum quality + // in neighbouring bases, on the pretext that if the region is bad, then + // this base is bad even if it claims otherwise. + uint8_t *qual = bam_get_qual(b); + const int qhalo = 8; // 2? + int qmin = 50; // effectively caps PacBio qual too + for (i = 0; i < qlen && i < qhalo; i++) { + local_nm[i] = qual[i]; + if (qmin > qual[i]) + qmin = qual[i]; + } + for (;i < qlen-qhalo; i++) { + //int t = (qual[i]*1 + 3*qmin)/4; // good on 60x + int t = (qual[i] + 5*qmin)/4; // good on 15x + local_nm[i] = t < qual[i] ? t : qual[i]; + if (qmin > qual[i+qhalo]) + qmin = qual[i+qhalo]; + else if (qmin <= qual[i-qhalo]) { + int j; + qmin = 50; + for (j = i-qhalo+1; j <= i+qhalo; j++) + if (qmin > qual[j]) + qmin = qual[j]; + } + } + for (; i < qlen; i++) { + local_nm[i] = qual[i]; + local_nm[i] = (local_nm[i] + 6*qmin)/4; + } + + for (i = 0; i < qlen; i++) { + qual[i] = local_nm[i]; + + // Plus overall rescale. + // Lower becomes lower, very high becomes a little higher. + // Helps deep GIAB, but detrimental elsewhere. (What this really + // indicates is quality calibration differs per data set.) + // It's probably something best accounted for somewhere else. + + //qual[i] = qual[i]*qual[i]/40+1; + } + memset(local_nm, 0, qlen * sizeof(*local_nm)); +#else + // Skew local NM by qual vs min-qual delta + uint8_t *qual = bam_get_qual(b); + const int qhalo = 8; // 4 + int qmin = 99; + for (i = 0; i < qlen && i < qhalo; i++) { + if (qmin > qual[i]) + qmin = qual[i]; + } + for (;i < qlen-qhalo; i++) { + int t = (qual[i] + 5*qmin)/4; // good on 15x + local_nm[i] += t < qual[i] ? (qual[i]-t) : 0; + if (qmin > qual[i+qhalo]) + qmin = qual[i+qhalo]; + else if (qmin <= qual[i-qhalo]) { + int j; + qmin = 99; + for (j = i-qhalo+1; j <= i+qhalo; j++) + if (qmin > qual[j]) + qmin = qual[j]; + } + } + for (; i < qlen; i++) { + int t = (qual[i] + 5*qmin)/4; // good on 15x + local_nm[i] += t < qual[i] ? (qual[i]-t) : 0; + } +#endif + } + + // Adjust local_nm array by the number of edits within + // a defined region (pos +/- halo). + const int halo = opts->nm_halo; + const uint8_t *md = bam_aux_get(b, "MD"); + if (!md) + return 1; + md = (const uint8_t *)bam_aux2Z(md); + + // Handle cost of being near a soft-clip + uint32_t *cig = bam_get_cigar(b); + int ncig = b->core.n_cigar; + + if ( (cig[0] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP || + ((cig[0] & BAM_CIGAR_MASK) == BAM_CHARD_CLIP && ncig > 1 && + (cig[1] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP)) { + for (i = 0; i < halo && i < qlen; i++) + local_nm[i]+=opts->sc_cost; + for (; i < halo*2 && i < qlen; i++) + local_nm[i]+=opts->sc_cost>>1; + } + if ( (cig[ncig-1] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP || + ((cig[ncig-1] & BAM_CIGAR_MASK) == BAM_CHARD_CLIP && ncig > 1 && + (cig[ncig-2] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP)) { + for (i = qlen-1; i >= qlen-halo && i >= 0; i--) + local_nm[i]+=opts->sc_cost; + for (; i >= qlen-halo*2 && i >= 0; i--) + local_nm[i]+=opts->sc_cost>>1; + } + + // Now iterate over MD tag + int pos = 0; + while (*md) { + if (isdigit(*md)) { + uint8_t *endptr; + long i = strtol((char *)md, (char **)&endptr, 10); + md = endptr; + pos += i; + continue; + } + + // deletion. + // Should we bump local_nm here too? Maybe + if (*md == '^') { + while (*++md && !isdigit(*md)) + continue; + continue; + } + + // substitution + for (i = pos-halo*2 >= 0 ? pos-halo*2 : 0; i < pos-halo; i++) + local_nm[i]+=5; + for (; i < pos+halo && i < qlen; i++) + local_nm[i]+=10; + for (; i < pos+halo*2 && i < qlen; i++) + local_nm[i]+=5; + md++; + } + + return 1; +} + + +static +int calculate_consensus_gap5(hts_pos_t pos, int flags, int depth, + pileup_t *plp, consensus_opts *opts, + consensus_t *cons, int default_qual) { + int i, j; + static int init_done =0; + static double q2p[101], mqual_pow[256]; + double min_e_exp = DBL_MIN_EXP * log(2) + 1; + + double S[15] ALIGNED(16) = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + double sumsC[6] = {0,0,0,0,0,0}; // A C G T * N + + // Small hash on seq to check for uniqueness of surrounding bases. + // If it's frequent, then it's more likely to be correctly called than + // if it's rare. + // Helps a bit on deep data, especially with K2=3, but detrimental on + // shallow and (currently) quite a slow down. + +//#define K2 2 +#ifdef K2 + int hashN[1<<(K2*4+2)] = {0}; + int hash1[1<<2] = {0}; +#endif + + /* Map the 15 possible combinations to 1-base or 2-base encodings */ + static int map_sing[15] ALIGNED(16) = + {0, 5, 5, 5, 5, + 1, 5, 5, 5, + 2, 5, 5, + 3, 5, + 4}; + static int map_het[15] ALIGNED(16) = + {0, 1, 2, 3, 4, + 6, 7, 8, 9, + 12, 13, 14, + 18, 19, + 24}; + + if (!init_done) { + init_done = 1; + consensus_init(opts->P_het); + + for (i = 0; i <= 100; i++) { + q2p[i] = pow(10, -i/10.0); + } + + for (i = 0; i < 255; i++) { + //mqual_pow[i] = 1-pow(10, -(i+.01)/10.0); + mqual_pow[i] = 1-pow(10, -(i*.9)/10.0); + //mqual_pow[i] = 1-pow(10, -(i/3+.1)/10.0); + //mqual_pow[i] = 1-pow(10, -(i/2+.05)/10.0); + } + // unknown mqual + mqual_pow[255] = mqual_pow[10]; + } + + /* Initialise */ + int counts[6] = {0}; + + /* Accumulate */ + +#ifdef K2 + const pileup_t *ptmp = plp; + for (; ptmp; ptmp = ptmp->next) { + const pileup_t *p = ptmp; + if (p->qual < opts->min_qual) + continue; + + int hb = 0; +#define _ 0 + static int X[16] = {_,0,1,_,2,_,_,_,3,_,_,_,_,_,_,_}; +#undef _ + uint8_t *seq = bam_get_seq(&p->b); + int i, base1 = X[p->base4]; + hash1[base1]++; + for (i = p->seq_offset-K2; i <= p->seq_offset+K2; i++) { + int base = i >= 0 && i < p->b.core.l_qseq ? X[bam_seqi(seq,i)] : _; + hb = (hb<<2)|base; + } + hashN[hb]++; + } +#endif + + int td = depth; // original depth + depth = 0; + for (; plp; plp = plp->next) { + pileup_t *p = plp; + + if (p->next) + _mm_prefetch(p->next, _MM_HINT_T0); + + if (p->qual < opts->min_qual) + continue; + + if (p->ref_skip) + continue; + +#ifdef K2 + int hb = 0; +#define _ 0 + static int X[16] = {_,0,1,_,2,_,_,_,3,_,_,_,_,_,_,_}; + int i, base1 = X[p->base4]; + for (i = p->seq_offset-K2; i <= p->seq_offset+K2; i++) { + int base = i >= 0 && i < p->b.core.l_qseq ? X[bam_seqi(seq,i)] : _; + hb = (hb<<2)|base; + } + // fprintf(stderr, "%c: %d %d of %d\t%d %d\n", p->base, hashN[hb], hash1[base1], td, p->qual, p->qual * hashN[hb] / hash1[base1]); +#undef _ +#endif + + const bam1_t *b = &p->b; + uint8_t base = p->base4; + uint8_t *qual_arr = bam_get_qual(b); + uint8_t qual = p->qual; + //qual = qual*qual/40+1; + if (qual == 255 || (qual == 0 && *qual_arr == 255)) + qual = default_qual; + +#ifdef K2 + //qual = qual * hashN[hb] / hash1[base1]; + qual -= -TENOVERLOG10*log(hashN[hb] / (hash1[base1]+.1)); + if (qual < 1) + qual = 1; +#endif + + // =ACM GRSV TWYH KDBN * + static int L[32] = { + 5,0,1,5, 2,5,5,5, 3,5,5,5, 5,5,5,5, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + }; + + // convert from sam base to acgt*n order. + base = L[base]; + + double MM, __, _M, qe; + + // Correction for mapping quality. Maybe speed up via lookups? + // Cannot nullify mapping quality completely. Lots of (true) + // SNPs means low mapping quality. (Ideally need to know + // hamming distance to next best location.) + + if (flags & CONS_MQUAL) { + int mqual = b->core.qual; + if (opts->nm_adjust) { + mqual /= (nm_local(p, b, pos)+1); + mqual *= 1 + 2*(0.5-(td>30?30:td)/60.0); // depth fudge + } + + // higher => call more; +FP, -FN + // lower => call less; -FP, +FN + mqual *= opts->scale_mqual; + + // Drop these? They don't seem to ever help. + if (mqual < opts->low_mqual) + mqual = opts->low_mqual; + if (mqual > opts->high_mqual) + mqual = opts->high_mqual; + + double _p = 1-q2p[qual]; + double _m = mqual_pow[mqual]; + qual = ph_log(1-(_m * _p + (1 - _m)/4)); // CURRENT + //qual = ph_log(1-_p*_m); // testing + //qual *= 6/sqrt(td); + } + + /* Quality 0 should never be permitted as it breaks the maths */ + if (qual < 1) + qual = 1; + + __ = p__[qual]; // neither match + MM = pMM[qual] - __; // both match + _M = p_M[qual] - __; // one allele only (half match) + + if (flags & CONS_DISCREP) { + qe = q2p[qual]; + sumsC[base] += 1 - qe; + } + + counts[base]++; + + switch (base) { + case 0: // A + S[0] += MM; + S[1] += _M; + S[2] += _M; + S[3] += _M; + S[4] += _M; + break; + + case 1: // C + S[1] += _M; + S[5] += MM; + S[6] += _M; + S[7] += _M; + S[8] += _M; + break; + + case 2: // G + S[ 2] += _M; + S[ 6] += _M; + S[ 9] += MM; + S[10] += _M; + S[11] += _M; + break; + + case 3: // T + S[ 3] += _M; + S[ 7] += _M; + S[10] += _M; + S[12] += MM; + S[13] += _M; + + break; + + case 4: // * + S[ 4] += _M; + S[ 8] += _M; + S[11] += _M; + S[13] += _M; + S[14] += MM; + break; + + case 5: /* N => equal weight to all A,C,G,T but not a pad */ + S[ 0] += MM; + S[ 1] += MM; + S[ 2] += MM; + S[ 3] += MM; + S[ 4] += _M; + + S[ 5] += MM; + S[ 6] += MM; + S[ 7] += MM; + S[ 8] += _M; + + S[ 9] += MM; + S[10] += MM; + S[11] += _M; + + S[12] += MM; + S[13] += _M; + break; + } + + depth++; + + if (p->eof && p->cd) { + free(p->cd); + p->cd = NULL; + } + } + + /* We've accumulated stats, so now we speculate on the consensus call */ + double shift, max, max_het, norm[15]; + int call = 0, het_call = 0; + double tot1 = 0, tot2 = 0; + + /* + * Scale numbers so the maximum score is 0. This shift is essentially + * a multiplication in non-log scale to both numerator and denominator, + * so it cancels out. We do this to avoid calling exp(-large_num) and + * ending up with norm == 0 and hence a 0/0 error. + * + * Can also generate the base-call here too. + */ + shift = -DBL_MAX; + max = -DBL_MAX; + max_het = -DBL_MAX; + + for (j = 0; j < 15; j++) { + S[j] += lprior15[j]; + if (shift < S[j]) + shift = S[j]; + + /* Only call pure AA, CC, GG, TT, ** for now */ + if (j != 0 && j != 5 && j != 9 && j != 12 && j != 14) { + if (max_het < S[j]) { + max_het = S[j]; + het_call = j; + } + continue; + } + + if (max < S[j]) { + max = S[j]; + call = j; + } + } + + /* + * Shift and normalise. + * If call is, say, b we want p = b/(a+b+c+...+n), but then we do + * p/(1-p) later on and this has exceptions when p is very close + * to 1. + * + * Hence we compute b/(a+b+c+...+n - b) and + * rearrange (p/norm) / (1 - (p/norm)) to be p/norm2. + */ + for (j = 0; j < 15; j++) { + S[j] -= shift; + double e = fast_exp(S[j]); + S[j] = (S[j] > min_e_exp) ? e : DBL_MIN; + norm[j] = 0; + } + + for (j = 0; j < 15; j++) { + norm[j] += tot1; + norm[14-j] += tot2; + tot1 += S[j]; + tot2 += S[14-j]; + } + + /* And store result */ + if (!depth || depth == counts[5] /* all N */) { + cons->call = 4; /* N */ + cons->het_call = 0; + cons->het_logodd = 0; + cons->phred = 0; + cons->depth = 0; + cons->discrep = 0; + return 0; + } + + cons->depth = depth; + + /* Call */ + if (norm[call] == 0) norm[call] = DBL_MIN; + // Approximation of phred for when S[call] ~= 1 and norm[call] + // is small. Otherwise we need the full calculation. + int ph; + if (S[call] == 1 && norm[call] < .01) + ph = ph_log(norm[call]) + .5; + else + ph = ph_log(1-S[call]/(norm[call]+S[call])) + .5; + + cons->call = map_sing[call]; + cons->phred = ph < 0 ? 0 : ph; + + if (norm[het_call] == 0) norm[het_call] = DBL_MIN; + ph = TENLOG2OVERLOG10 * (fast_log2(S[het_call]) + - fast_log2(norm[het_call])) + .5; + + cons->het_call = map_het[het_call]; + cons->het_logodd = ph; + + /* Compute discrepancy score */ + if (flags & CONS_DISCREP) { + double m = sumsC[0]+sumsC[1]+sumsC[2]+sumsC[3]+sumsC[4]; + double c; + if (cons->het_logodd > 0) + c = sumsC[cons->het_call%5] + sumsC[cons->het_call/5]; + else + c = sumsC[cons->call]; + cons->discrep = (m-c)/sqrt(m); + } + + return 0; +} + + +/* -------------------------------------------------------------------------- + * Main processing logic + */ + +static void dump_fastq(consensus_opts *opts, + const char *name, + const char *seq, size_t seq_l, + const char *qual, size_t qual_l) { + enum format fmt = opts->fmt; + int line_len = opts->line_len; + FILE *fp = opts->fp_out; + + fprintf(fp, "%c%s\n", ">@"[fmt==FASTQ], name); + size_t i; + for (i = 0; i < seq_l; i += line_len) + fprintf(fp, "%.*s\n", (int)MIN(line_len, seq_l - i), seq+i); + + if (fmt == FASTQ) { + fprintf(fp, "+\n"); + for (i = 0; i < seq_l; i += line_len) + fprintf(fp, "%.*s\n", (int)MIN(line_len, seq_l - i), qual+i); + } +} + +//--------------------------------------------------------------------------- + +/* + * Reads a single alignment record, using either the iterator + * or a direct sam_read1 call. + */ +static int readaln2(void *dat, samFile *fp, sam_hdr_t *h, bam1_t *b) { + consensus_opts *opts = (consensus_opts *)dat; + + for (;;) { + int ret = opts->iter + ? sam_itr_next(fp, opts->iter, b) + : sam_read1(fp, h, b); + if (ret < 0) + return ret; + + // Apply hard filters + if (opts->incl_flags && !(b->core.flag & opts->incl_flags)) + continue; + if (opts->excl_flags && (b->core.flag & opts->excl_flags)) + continue; + if (b->core.qual < opts->min_mqual) + continue; + + return ret; + } +} + +/* -------------------------------------------------------------------------- + * A simple summing algorithm, either pure base frequency, or by + * weighting them according to their quality values. + * + * This is crude, but easy to understand and fits with several + * standard pileup criteria (eg COG-UK / CLIMB Covid-19 seq project). + * + * + * call1 / score1 / depth1 is the highest scoring allele. + * call2 / score2 / depth2 is the second highest scoring allele. + * + * Het_fract: score2/score1 + * Call_fract: score1 or score1+score2 over total score + * Min_depth: minimum total depth of utilised bases (depth1+depth2) + * Min_score: minimum total score of utilised bases (score1+score2) + * + * Eg het_fract 0.66, call_fract 0.75 and min_depth 10. + * 11A, 2C, 2G (14 total depth) is A. + * 9A, 2C, 2G (12 total depth) is N as depth(A) < 10. + * 11A, 5C, 5G (21 total depth) is N as 11/21 < 0.75 (call_fract) + * + * + * 6A, 5G, 1C (12 total depth) is AG het as depth(A)+depth(G) >= 10 + * and 5/6 >= 0.66 and 11/12 >= 0.75. + * + * 6A, 5G, 4C (15 total depth) is N as (6+5)/15 < 0.75 (call_fract). + * + * + * Note for the purpose of deletions, a base/del has an ambiguity + * code of lower-case base (otherwise it is uppercase). + */ +static int calculate_consensus_simple(const pileup_t *plp, + consensus_opts *opts, int *qual) { + int i, min_qual = opts->min_qual; + + // Map "seqi" nt16 to A,C,G,T compatibility with weights on pure bases. + // where seqi is A | (C<<1) | (G<<2) | (T<<3) + // * A C M G R S V T W Y H K D B N + static int seqi2A[16] = { 0,8,0,4, 0,4,0,2, 0,4,0,2, 0,2,0,1 }; + static int seqi2C[16] = { 0,0,8,4, 0,0,4,2, 0,0,4,2, 0,0,2,1 }; + static int seqi2G[16] = { 0,0,0,0, 8,4,4,1, 0,0,0,0, 4,2,2,1 }; + static int seqi2T[16] = { 0,0,0,0, 0,0,0,0, 8,4,4,2, 8,2,2,1 }; + + // Ignore ambiguous bases in seq for now, so we don't treat R, Y, etc + // as part of one base and part another. Based on BAM seqi values. + // We also use freq[16] as "*" for gap. + int freq[17] = {0}; // base frequency, aka depth + int score[17] = {0}; // summation of base qualities + + // Accumulate + for (; plp; plp = plp->next) { + const pileup_t *p = plp; + if (p->next) + _mm_prefetch(p->next, _MM_HINT_T0); + + int q = p->qual; + if (q < min_qual) + // Should we still record these in freq[] somewhere so + // we can use them in the fracts? + // Difference between >= X% of high-qual bases calling Y + // and >= X% of all bases are high-quality Y calls. + continue; + + //int b = p->is_del ? 16 : bam_seqi(bam_get_seq(&p->b), p->seq_offset); + int b = p->base4; + + // Map ambiguity codes to one or more component bases. + if (b < 16) { + int Q = seqi2A[b] * (opts->use_qual ? q : 1); + freq[1] += Q?1:0; + score[1] += Q?Q:0; + Q = seqi2C[b] * (opts->use_qual ? q : 1); + freq[2] += Q?1:0; + score[2] += Q?Q:0; + Q = seqi2G[b] * (opts->use_qual ? q : 1); + freq[4] += Q?1:0; + score[4] += Q?Q:0; + Q = seqi2T[b] * (opts->use_qual ? q : 1); + freq[8] += Q?1:0; + score[8] += Q?Q:0; + } else { /* * */ + freq[16] ++; + score[16]+=8 * (opts->use_qual ? q : 1); + } + } + + // Total usable depth + int tscore = 0; + for (i = 0; i < 5; i++) + tscore += score[1<= opts->het_fract * score1 && opts->ambig) { + used_base |= call2; + used_score += score2; + used_depth += depth2; + } + + // N is too shallow, or insufficient proportion of total + if (used_depth < opts->min_depth || + used_score < opts->call_fract * tscore) { + used_depth = 0; + // But note shallow gaps are still called gaps, not N, as + // we're still more confident there is no base than it is + // A, C, G or T. + used_base = call1 == 16 /*&& depth1 >= call_fract * depth*/ + ? 16 : 0; // * or N + } + + // Our final call. "?" shouldn't be possible to generate + const char *het = + "NACMGRSVTWYHKDBN" + "*ac?g???t???????"; + + //printf("%c %d\n", het[used_base], used_depth); + if (qual) + *qual = used_base ? 100.0 * used_score / tscore : 0; + + return het[used_base]; +} + +static int empty_pileup2(consensus_opts *opts, sam_hdr_t *h, int tid, + hts_pos_t start, hts_pos_t end) { + const char *name = sam_hdr_tid2name(h, tid); + hts_pos_t i; + + int err = 0; + for (i = start; i < end; i++) + err |= fprintf(opts->fp_out, "%s\t%"PRIhts_pos"\t0\t0\tN\t0\t*\t*\n", name, i+1) < 0; + + return err ? -1 : 0; +} + +/* + * Returns 0 on success + * -1 on failure + */ +static int basic_pileup(void *cd, samFile *fp, sam_hdr_t *h, pileup_t *p, + int depth, hts_pos_t pos, int nth, int is_insert) { + unsigned char *qp, *cp; + char *rp; + int ref, cb, cq; + consensus_opts *opts = (consensus_opts *)cd; + int tid = p->b.core.tid; + +// opts->show_ins=0; +// opts->show_del=1; + if (!opts->show_ins && nth) + return 0; + + if (opts->iter) { + if (opts->iter->beg >= pos || opts->iter->end < pos) + return 0; + } + + if (opts->all_bases) { + if (tid != opts->last_tid && opts->last_tid >= 0) { + hts_pos_t len = sam_hdr_tid2len(opts->h, opts->last_tid); + if (opts->iter) + len = MIN(opts->iter->end, len); + if (empty_pileup2(opts, opts->h, opts->last_tid, opts->last_pos, + len) < 0) + return -1; + if (tid >= 0) { + if (empty_pileup2(opts, opts->h, tid, + opts->iter ? opts->iter->beg : 0, + pos-1) < 0) + return -1; + } + } + if (opts->last_pos >= 0 && pos > opts->last_pos+1) { + if (empty_pileup2(opts, opts->h, p->b.core.tid, opts->last_pos, + pos-1) < 0) + return -1; + } else if (opts->last_pos < 0) { + if (empty_pileup2(opts, opts->h, p->b.core.tid, + opts->iter ? opts->iter->beg : 0, pos-1) < 0) + return -1; + } + } + + if (opts->gap5) { + consensus_t cons; + calculate_consensus_gap5(pos, opts->use_mqual ? CONS_MQUAL : 0, + depth, p, opts, &cons, opts->default_qual); + if (cons.het_logodd > 0 && opts->ambig) { + cb = "AMRWa" // 5x5 matrix with ACGT* per row / col + "MCSYc" + "RSGKg" + "WYKTt" + "acgt*"[cons.het_call]; + cq = cons.het_logodd; + } else{ + cb = "ACGT*"[cons.call]; + cq = cons.phred; + } + if (cq < opts->cons_cutoff && cb != '*') { + cb = 'N'; + cq = 0; + } + } else { + cb = calculate_consensus_simple(p, opts, &cq); + } + if (cb < 0) + return -1; + + if (!p) + return 0; + + if (!opts->show_del && cb == '*') + return 0; + + /* Ref, pos, nth, score, seq, qual */ + kstring_t *ks = &opts->ks_line; + ks->l = 0; + ref = p->b.core.tid; + rp = (char *)sam_hdr_tid2name(h, ref); + + int err = 0; + err |= kputs(rp, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputw(pos, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputw(nth, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputw(depth, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputc_(cb, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputw(cq, ks) < 0; + err |= kputc_('\t', ks) < 0; + if (err) + return -1; + + /* Seq + qual at predetermined offsets */ + if (ks_resize(ks, ks->l + depth*2 + 2) < 0) + return -1; + + cp = (unsigned char *)ks->s + ks->l; + ks->l += depth*2 + 2; + qp = cp+depth+1; + for (; p; p = p->next) { + // Too tight a loop to help much, but some benefit still + if (p->next && p->next->next) + _mm_prefetch(p->next->next, _MM_HINT_T0); + if (p->b_is_rev) { + *cp++ = p->base == '*' ? '#' : tolower(p->base); + } else { + *cp++ = p->base; + } + *qp++ = MIN(p->qual,93) + '!'; + } + *cp++ = '\t'; + *qp++ = '\n'; + if (fwrite(ks->s, 1, ks->l, opts->fp_out) != ks->l) + return -1; + + opts->last_pos = pos; + opts->last_tid = tid; + + return 0; +} + +static int basic_fasta(void *cd, samFile *fp, sam_hdr_t *h, pileup_t *p, + int depth, hts_pos_t pos, int nth, int is_insert) { + int cb, cq; + consensus_opts *opts = (consensus_opts *)cd; + int tid = p->b.core.tid; + kstring_t *seq = &opts->ks_ins_seq; + kstring_t *qual = &opts->ks_ins_qual; + + if (!opts->show_ins && nth) + return 0; + + if (opts->iter) { + if (opts->iter->beg >= pos || opts->iter->end < pos) + return 0; + } + + if (tid != opts->last_tid) { + if (opts->last_tid != -1) { + if (opts->all_bases) { + int i, N; + if (opts->iter) { + opts->last_pos = MAX(opts->last_pos, opts->iter->beg-1); + N = opts->iter->end; + } else { + N = INT_MAX; + } + N = MIN(N, sam_hdr_tid2len(opts->h, opts->last_tid)) + - opts->last_pos; + if (N > 0) { + if (ks_expand(seq, N+1) < 0) + return -1; + if (ks_expand(qual, N+1) < 0) + return -1; + for (i = 0; i < N; i++) { + seq->s[seq->l++] = 'N'; + qual->s[qual->l++] = '!'; + } + seq->s[seq->l] = 0; + qual->s[qual->l] = 0; + } + } + dump_fastq(opts, sam_hdr_tid2name(opts->h, opts->last_tid), + seq->s, seq->l, qual->s, qual->l); + } + + seq->l = 0; qual->l = 0; + opts->last_tid = tid; +// if (opts->all_bases) +// opts->last_pos = 0; + if (opts->iter) + opts->last_pos = opts->iter->beg; + else + opts->last_pos = opts->all_bases ? 0 : pos-1; + } + + // share this with basic_pileup + if (opts->gap5) { + consensus_t cons; + calculate_consensus_gap5(pos, opts->use_mqual ? CONS_MQUAL : 0, + depth, p, opts, &cons, opts->default_qual); + if (cons.het_logodd > 0 && opts->ambig) { + cb = "AMRWa" // 5x5 matrix with ACGT* per row / col + "MCSYc" + "RSGKg" + "WYKTt" + "acgt*"[cons.het_call]; + cq = cons.het_logodd; + } else{ + cb = "ACGT*"[cons.call]; + cq = cons.phred; + } + if (cq < opts->cons_cutoff && cb != '*' && + cons.het_call % 5 != 4 && cons.het_call / 5 != 4) { + // het base/* keeps base or * as most likely pure call, else N. + // This is because we don't have a traditional way of representing + // base or not-base ambiguity. + cb = 'N'; + cq = 0; + } + } else { + cb = calculate_consensus_simple(p, opts, &cq); + } + if (cb < 0) + return -1; + + if (!p) + return 0; + + if (!opts->show_del && cb == '*') { + opts->last_pos = pos; + opts->last_tid = tid; + return 0; + } + // end of share + + // Append consensus base/qual to seqs + if (pos > opts->last_pos) { + if (opts->last_pos >= 0 || opts->all_bases) { + // FIXME: don't expand qual if fasta + if (ks_expand(seq, pos - opts->last_pos) < 0 || + ks_expand(qual, pos - opts->last_pos) < 0) + return -1; + memset(seq->s + seq->l, 'N', pos - (opts->last_pos+1)); + memset(qual->s + qual->l, '!', pos - (opts->last_pos+1)); + seq->l += pos - (opts->last_pos+1); + qual->l += pos - (opts->last_pos+1); + } + } + if ((nth && opts->show_ins && cb != '*') + || cb != '*' || (pos > opts->last_pos && opts->show_del)) { + int err = 0; + err |= kputc(cb, seq) < 0; + err |= kputc(MIN(cq, '~'-'!')+'!', qual) < 0; + if (err) + return -1; + } + + opts->last_pos = pos; + opts->last_tid = tid; + + return 0; +} +// END OF NEW PILEUP +//--------------------------------------------------------------------------- + +static void usage_exit(FILE *fp, int exit_status) { + fprintf(fp, "Usage: samtools consensus [options] \n"); + fprintf(fp, "\nOptions:\n"); + fprintf(fp, " -r, --region REG Limit query to REG. Requires an index\n"); + fprintf(fp, " -f, --format FMT Output in format FASTA, FASTQ or PILEUP [FASTA]\n"); + fprintf(fp, " -l, --line-len INT Wrap FASTA/Q at line length INT [70]\n"); + fprintf(fp, " -o, --output FILE Output consensus to FILE\n"); + fprintf(fp, " -m, --mode STR Switch consensus mode to \"simple\"/\"bayesian\" [bayesian]\n"); + fprintf(fp, " -a Output all bases (start/end of reference)\n"); + fprintf(fp, " --rf, --incl-flags STR|INT\n"); + fprintf(fp, " Only include reads with any flag bit set [0]\n"); + fprintf(fp, " --ff, --excl-flags STR|INT\n"); + fprintf(fp, " Exclude reads with any flag bit set\n"); + fprintf(fp, " [UNMAP,SECONDARY,QCFAIL,DUP]\n"); + fprintf(fp, " --min-MQ INT Exclude reads with mapping quality below INT [0]\n"); + fprintf(fp, " --show-del yes/no Whether to show deletion as \"*\" [no]\n"); + fprintf(fp, " --show-ins yes/no Whether to show insertions [yes]\n"); + fprintf(fp, " -A, --ambig Enable IUPAC ambiguity codes [off]\n"); + fprintf(fp, "\nFor simple consensus mode:\n"); + fprintf(fp, " -q, --(no-)use-qual Use quality values in calculation [off]\n"); + fprintf(fp, " -c, --call-fract INT At least INT portion of bases must agree [0.75]\n"); + fprintf(fp, " -d, --min-depth INT Minimum depth of INT [1]\n"); + fprintf(fp, " -H, --het-fract INT Minimum fraction of 2nd-most to most common base [0.5]\n"); + fprintf(fp, "\nFor default \"Bayesian\" consensus mode:\n"); + fprintf(fp, " -C, --cutoff C Consensus cutoff quality C [10]\n"); + fprintf(fp, " --(no-)adj-qual Modify quality with local minima [on]\n"); + fprintf(fp, " --(no-)use-MQ Use mapping quality in calculation [on]\n"); + fprintf(fp, " --(no-)adj-MQ Modify mapping quality by local NM [on]\n"); + fprintf(fp, " --NM-halo INT Size of window for NM count in --adj-MQ [50]\n"); + fprintf(fp, " --scale-MQ FLOAT Scale mapping quality by FLOAT [1.00]\n"); + fprintf(fp, " --low-MQ INT Cap minimum mapping quality [1]\n"); + fprintf(fp, " --high-MQ INT Cap maximum mapping quality [60]\n"); + fprintf(fp, " --P-het FLOAT Probability of heterozygous site[%.1e]\n", + P_HET); + + fprintf(fp, "\nGlobal options:\n"); + sam_global_opt_help(fp, "-.---@-."); + exit(exit_status); +} + +int main_consensus(int argc, char **argv) { + int c, ret = 1; + + consensus_opts opts = { + // User options + .gap5 = 1, + .use_qual = 0, + .min_qual = 0, + .adj_qual = 1, + .use_mqual = 1, + .scale_mqual = 1.00, + .nm_adjust = 1, + .nm_halo = 50, + .sc_cost = 60, + .low_mqual = 1, + .high_mqual = 60, + .min_depth = 1, + .call_fract = 0.75, + .het_fract = 0.5, + .het_only = 0, + .fmt = FASTA, + .cons_cutoff = 10, + .ambig = 0, + .line_len = 70, + .default_qual = 10, + .all_bases = 0, + .show_del = 0, + .show_ins = 1, + .incl_flags = 0, + .excl_flags = BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP, + .min_mqual = 0, + .P_het = P_HET, + + // Internal state + .ks_line = {0,0}, + .ks_ins_seq = {0,0}, + .ks_ins_qual = {0,0}, + .fp = NULL, + .fp_out = stdout, + .iter = NULL, + .idx = NULL, + .last_tid = -1, + .last_pos = -1, + }; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', '-', '-', '@'), + {"use-qual", no_argument, NULL, 'q'}, + {"no-use-qual", no_argument, NULL, 'q'+1000}, + {"adj-qual", no_argument, NULL, 'q'+100}, + {"no-adj-qual", no_argument, NULL, 'q'+101}, + {"use-MQ", no_argument, NULL, 'm'+1000}, + {"no-use-MQ", no_argument, NULL, 'm'+1001}, + {"adj-MQ", no_argument, NULL, 'm'+100}, + {"no-adj-MQ", no_argument, NULL, 'm'+101}, + {"NM-halo", required_argument, NULL, 'h'+100}, + {"SC-cost", required_argument, NULL, 'h'+101}, + {"scale-MQ", required_argument, NULL, 14}, + {"low-MQ" , required_argument, NULL, 9}, + {"high-MQ", required_argument, NULL, 10}, + {"min-depth", required_argument, NULL, 'd'}, + {"call-fract", required_argument, NULL, 'c'}, + {"het-fract", required_argument, NULL, 'H'}, + {"region", required_argument, NULL, 'r'}, + {"format", required_argument, NULL, 'f'}, + {"cutoff", required_argument, NULL, 'C'}, + {"ambig", no_argument, NULL, 'A'}, + {"line-len", required_argument, NULL, 'l'}, + {"default-qual", required_argument, NULL, 1}, + {"het-only", no_argument, NULL, 6}, + {"show-del", required_argument, NULL, 7}, + {"show-ins", required_argument, NULL, 8}, + {"output", required_argument, NULL, 'o'}, + {"incl-flags", required_argument, NULL, 11}, + {"rf", required_argument, NULL, 11}, + {"excl-flags", required_argument, NULL, 12}, + {"ff", required_argument, NULL, 12}, + {"min-MQ", required_argument, NULL, 13}, + {"P-het", required_argument, NULL, 15}, + {"mode", required_argument, NULL, 'm'}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "@:qd:c:H:r:5f:C:aAl:o:m:", + lopts, NULL)) >= 0) { + switch (c) { + case 'a': opts.all_bases++; break; + case 'q': opts.use_qual=1; break; + case 'q'+1000: opts.use_qual=0; break; + case 'm'+1000: opts.use_mqual=1; break; + case 'm'+1001: opts.use_mqual=0; break; + case 14: opts.scale_mqual = atof(optarg); break; + case 9: opts.low_mqual = atoi(optarg); break; + case 10: opts.high_mqual = atoi(optarg); break; + case 'd': opts.min_depth = atoi(optarg); break; + case 'c': opts.call_fract = atof(optarg); break; + case 'H': opts.het_fract = atof(optarg); break; + case 'r': opts.reg = optarg; break; + case 'C': opts.cons_cutoff = atoi(optarg); break; + case 'A': opts.ambig = 1; break; + case 1: opts.default_qual = atoi(optarg); break; + case 6: opts.het_only = 1; break; + case 7: opts.show_del = (*optarg == 'y' || *optarg == 'Y'); break; + case 8: opts.show_ins = (*optarg == 'y' || *optarg == 'Y'); break; + case 13: opts.min_mqual = atoi(optarg); break; + case 15: opts.P_het = atof(optarg); break; + case 'q'+100: opts.adj_qual = 1; break; + case 'q'+101: opts.adj_qual = 0; break; + case 'm'+100: opts.nm_adjust = 1; break; + case 'm'+101: opts.nm_adjust = 0; break; + case 'h'+100: opts.nm_halo = atoi(optarg); break; + case 'h'+101: opts.sc_cost = atoi(optarg); break; + + case 'm': // mode + if (strcasecmp(optarg, "simple") == 0) { + opts.gap5 = 0; + } else if (strcasecmp(optarg, "bayesian") == 0) { + opts.gap5 = 1; + } else { + fprintf(stderr, "Unknown mode %s\n", optarg); + return 1; + } + break; + + case 'l': + if ((opts.line_len = atoi(optarg)) <= 0) + opts.line_len = INT_MAX; + break; + + case 'f': + if (strcasecmp(optarg, "fasta") == 0) { + opts.fmt = FASTA; + } else if (strcasecmp(optarg, "fastq") == 0) { + opts.fmt = FASTQ; + } else if (strcasecmp(optarg, "pileup") == 0) { + opts.fmt = PILEUP; + } else { + fprintf(stderr, "Unknown format %s\n", optarg); + return 1; + } + break; + + case 'o': + if (!(opts.fp_out = fopen(optarg, "w"))) { + perror(optarg); + return 1; + } + break; + + case 11: + if ((opts.incl_flags = bam_str2flag(optarg)) < 0) { + print_error("consensus", "could not parse --rf %s", optarg); + return 1; + } + break; + case 12: + if ((opts.excl_flags = bam_str2flag(optarg)) < 0) { + print_error("consensus", "could not parse --ff %s", optarg); + return 1; + } + break; + + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + usage_exit(stderr, EXIT_FAILURE); + } + } + + if (argc != optind+1) { + if (argc == optind) usage_exit(stdout, EXIT_SUCCESS); + else usage_exit(stderr, EXIT_FAILURE); + } + opts.fp = sam_open_format(argv[optind], "r", &ga.in); + if (opts.fp == NULL) { + print_error_errno("consensus", "Cannot open input file \"%s\"", + argv[optind]); + goto err; + } + if (ga.nthreads > 0) + hts_set_threads(opts.fp, ga.nthreads); + + if (hts_set_opt(opts.fp, CRAM_OPT_DECODE_MD, 0)) { + fprintf(stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + goto err; + } + + if (!(opts.h = sam_hdr_read(opts.fp))) { + fprintf(stderr, "Failed to read header for \"%s\"\n", argv[optind]); + goto err; + } + + if (opts.reg) { + opts.idx = sam_index_load(opts.fp, argv[optind]); + if (!opts.idx) { + print_error("consensus", "Cannot load index for input file \"%s\"", + argv[optind]); + goto err; + } + opts.iter = sam_itr_querys(opts.idx, opts.h, opts.reg); + if (!opts.iter) { + print_error("consensus", "Failed to parse region \"%s\"", + opts.reg); + goto err; + } + } + + if (opts.fmt == PILEUP) { + if (pileup_loop(opts.fp, opts.h, readaln2, opts.gap5 ? nm_init : NULL, + basic_pileup, &opts) < 0) + goto err; + + if (opts.all_bases) { + int tid = opts.iter ? opts.iter->tid : opts.last_tid; + int len = sam_hdr_tid2len(opts.h, tid); + int pos = opts.last_pos; + if (opts.iter) { + len = MIN(opts.iter->end, len); + pos = MAX(opts.iter->beg, pos); + } + if (empty_pileup2(&opts, opts.h, tid, pos, len) < 0) + goto err; + } + } else { + if (pileup_loop(opts.fp, opts.h, readaln2, opts.gap5 ? nm_init : NULL, + basic_fasta, + &opts) < 0) + goto err; + if (opts.all_bases) { + // fill out terminator + int tid = opts.iter ? opts.iter->tid : opts.last_tid; + int len = sam_hdr_tid2len(opts.h, tid); + int pos = opts.last_pos; + if (opts.iter) { + len = MIN(opts.iter->end, len); + pos = MAX(opts.iter->beg, pos); + opts.last_tid = opts.iter->tid; + } + if (pos < len) { + if (ks_expand(&opts.ks_ins_seq, len-pos+1) < 0) + goto err; + if (ks_expand(&opts.ks_ins_qual, len-pos+1) < 0) + goto err; + while (pos++ < len) { + opts.ks_ins_seq.s [opts.ks_ins_seq.l++] = 'N'; + opts.ks_ins_qual.s[opts.ks_ins_qual.l++] = '!'; + } + opts.ks_ins_seq.s [opts.ks_ins_seq.l] = 0; + opts.ks_ins_qual.s[opts.ks_ins_qual.l] = 0; + } + } + if (opts.last_tid >= 0) + dump_fastq(&opts, sam_hdr_tid2name(opts.h, opts.last_tid), + opts.ks_ins_seq.s, opts.ks_ins_seq.l, + opts.ks_ins_qual.s, opts.ks_ins_qual.l); +// if (consensus_loop(&opts) < 0) { +// print_error_errno("consensus", "Failed"); +// goto err; +// } + } + + ret = 0; + + err: + if (opts.iter) + hts_itr_destroy(opts.iter); + if (opts.idx) + hts_idx_destroy(opts.idx); + + if (opts.fp && sam_close(opts.fp) < 0) { + print_error_errno("consensus", "Closing input file \"%s\"", + argv[optind]); + ret = 1; + } + + if (opts.h) + sam_hdr_destroy(opts.h); + sam_global_args_free(&ga); + + if (opts.fp_out && opts.fp_out != stdout) + ret |= fclose(opts.fp_out) != 0; + else + ret |= fflush(stdout) != 0; + + ks_free(&opts.ks_line); + ks_free(&opts.ks_ins_seq); + ks_free(&opts.ks_ins_qual); + + if (ret) + print_error("consensus", "failed"); + + return ret; +} diff --git a/samtools/bam_consensus.c.pysam.c b/samtools/bam_consensus.c.pysam.c new file mode 100644 index 0000000..08536c6 --- /dev/null +++ b/samtools/bam_consensus.c.pysam.c @@ -0,0 +1,1714 @@ +#include "samtools.pysam.h" + +/* bam_consensus.c -- consensus subcommand. + + Copyright (C) 1998-2001,2003 Medical Research Council (Gap4/5 source) + Copyright (C) 2003-2005,2007-2022 Genome Research Ltd. + + Author: James Bonfield + +The primary work here is GRL since 2021, under an MIT license. +Sections derived from Gap5, which include calculate_consensus_gap5() +associated functions, are mostly copyright Genome Research Limited from +2003 onwards. These were originally under a BSD license, but as GRL is +copyright holder these portions can be considered to also be under the +same MIT license below: + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* + * The Gap5 consensus algorithm was in turn derived from the earlier Gap4 + * tool, developed by the Medical Research Council as part of the + * Staden Package. It is unsure how much of this source code is still + * extant, without deep review, but the license used was a compatible + * modified BSD license, included below. + */ + +/* +Modified BSD license for any legacy components from the Staden Package: + +Copyright (c) 2003 MEDICAL RESEARCH COUNCIL +All rights reserved + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + . Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + + . Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + + . Neither the name of the MEDICAL RESEARCH COUNCIL, THE LABORATORY OF +MOLECULAR BIOLOGY nor the names of its contributors may be used to endorse or +promote products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +// FIXME: also use strand to spot possible basecalling errors. +// Specifically het calls where mods are predominantly on one +// strand. So maybe require + and - calls and check concordance +// before calling a het as confident. (Still call, but low qual?) + +// TODO: call by kmers rather than individual bases? Or use kmers to skew +// quality at least. It can identify variants that are low quality due to +// neighbouring edits that aren't consistently correlated. + +// TODO: pileup callback ought to know when it's the last in the region / +// chromosome. This means the caller code doesn't have to handle the +// termination phase and deduplicates the code. (Changing from +// one chr to the next is the same as ending the last.) +// +// TODO: track which reads contribute to multiple confirmed (HQ) differences +// vs which contribute to only one (LQ) difference. Correlated changes +// are more likely to be real. Ie consensus more of a path than solely +// isolated columns. +// +// Either that or a dummy "end of data" call is made to signify end to +// permit tidying up. Maybe add a "start of data" call too? + +// Eg 50T 20A seems T/A het, +// but 30T+ 20T- 18A+ 2A- seems like a consistent A miscall on one strand +// only, while T is spread evenly across both strands. + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "samtools.h" +#include "sam_opts.h" +#include "bam_plbuf.h" +#include "consensus_pileup.h" + +#ifdef __SSE__ +# include +#else +# define _mm_prefetch(a,b) +#endif + +#ifndef MIN +# define MIN(a,b) ((a)<(b)?(a):(b)) +#endif +#ifndef MAX +# define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + +// Minimum cutoff for storing mod data; => at least 10% chance +#define MOD_CUTOFF 0.46 + +enum format { + FASTQ, + FASTA, + PILEUP +}; + +typedef unsigned char uc; + +typedef struct { + // User options + char *reg; + int use_qual; + int min_qual; + int adj_qual; + int use_mqual; + double scale_mqual; + int nm_adjust; + int nm_halo; + int sc_cost; + int low_mqual; + int high_mqual; + int min_depth; + double call_fract; + double het_fract; + int gap5; + enum format fmt; + int cons_cutoff; + int ambig; + int line_len; + int default_qual; + int het_only; + int all_bases; + int show_del; + int show_ins; + int excl_flags; + int incl_flags; + int min_mqual; + double P_het; + + // Internal state + samFile *fp; + FILE *fp_out; + sam_hdr_t *h; + hts_idx_t *idx; + hts_itr_t *iter; + kstring_t ks_line; + kstring_t ks_ins_seq; + kstring_t ks_ins_qual; + int last_tid; + hts_pos_t last_pos; +} consensus_opts; + +/* -------------------------------------------------------------------------- + * A bayesian consensus algorithm that analyses the data to work out + * which hypothesis of pure A/C/G/T/absent and all combinations of two + * such bases meets the observations. + * + * This has its origins in Gap4 (homozygous) -> Gap5 (heterozygous) + * -> Crumble (tidied up to use htslib's pileup) -> here. + * + */ + +#define CONS_DISCREP 4 +#define CONS_ALL 15 + +#define CONS_MQUAL 16 + +typedef struct { + /* the most likely base call - we never call N here */ + /* A=0, C=1, G=2, T=3, *=4 */ + int call; + + /* The most likely heterozygous base call */ + /* Use "ACGT*"[het / 5] vs "ACGT*"[het % 5] for the combination */ + int het_call; + + /* Log-odds for het_call */ + int het_logodd; + + /* Single phred style call */ + int phred; + + /* Sequence depth */ + int depth; + + /* Discrepancy search score */ + float discrep; +} consensus_t; + +#define P_HET 1e-4 + +#define LOG10 2.30258509299404568401 +#define TENOVERLOG10 4.34294481903251827652 +#define TENLOG2OVERLOG10 3.0103 + +#ifdef __GNUC__ +#define ALIGNED(x) __attribute((aligned(x))) +#else +#define ALIGNED(x) +#endif + +static double prior[25] ALIGNED(16); /* Sum to 1.0 */ +static double lprior15[15] ALIGNED(16); /* 15 combinations of {ACGT*} */ + +/* Precomputed matrices for the consensus algorithm */ +static double pMM[101] ALIGNED(16); +static double p__[101] ALIGNED(16); +static double p_M[101] ALIGNED(16); + +static double e_tab_a[1002] ALIGNED(16); +static double *e_tab = &e_tab_a[500]; +static double e_tab2_a[1002] ALIGNED(16); +static double *e_tab2 = &e_tab2_a[500]; +static double e_log[501] ALIGNED(16); + +/* + * Lots of confusing matrix terms here, so some definitions will help. + * + * M = match base + * m = match pad + * _ = mismatch + * o = overcall + * u = undercall + * + * We need to distinguish between homozygous columns and heterozygous columns, + * done using a flat prior. This is implemented by treating every observation + * as coming from one of two alleles, giving us a 2D matrix of possibilities + * (the hypotheses) for each and every call (the observation). + * + * So pMM[] is the chance that given a call 'x' that it came from the + * x/x allele combination. Similarly p_o[] is the chance that call + * 'x' came from a mismatch (non-x) / overcall (consensus=*) combination. + * + * Examples with observation (call) C and * follows + * + * C | A C G T * * | A C G T * + * ----------------- ----------------- + * A | __ _M __ __ o_ A | uu uu uu uu um + * C | _M MM _M _M oM C | uu uu uu uu um + * G | __ _M __ __ o_ G | uu uu uu uu um + * T | __ _M __ __ o_ T | uu uu uu uu um + * * | o_ oM o_ o_ oo * | um um um um mm + * + * In calculation terms, the _M is half __ and half MM, similarly o_ and um. + * + * Relative weights of substitution vs overcall vs undercall are governed on a + * per base basis using the P_OVER and P_UNDER scores (subst is + * 1-P_OVER-P_UNDER). + * + * The heterozygosity weight though is a per column calculation as we're + * trying to model whether the column is pure or mixed. Hence this is done + * once via a prior and has no affect on the individual matrix cells. + */ + +static void consensus_init(double p_het) { + int i; + + for (i = -500; i <= 500; i++) + e_tab[i] = exp(i); + for (i = -500; i <= 500; i++) + e_tab2[i] = exp(i/10.); + for (i = 0; i <= 500; i++) + e_log[i] = log(i); + + // Heterozygous locations + for (i = 0; i < 25; i++) + prior[i] = p_het / 20; + prior[0] = prior[6] = prior[12] = prior[18] = prior[24] = (1-p_het)/5; + + lprior15[0] = log(prior[0]); + lprior15[1] = log(prior[1]*2); + lprior15[2] = log(prior[2]*2); + lprior15[3] = log(prior[3]*2); + lprior15[4] = log(prior[4]*2); + lprior15[5] = log(prior[6]); + lprior15[6] = log(prior[7]*2); + lprior15[7] = log(prior[8]*2); + lprior15[8] = log(prior[9]*2); + lprior15[9] = log(prior[12]); + lprior15[10] = log(prior[13]*2); + lprior15[11] = log(prior[14]*2); + lprior15[12] = log(prior[18]); + lprior15[13] = log(prior[19]*2); + lprior15[14] = log(prior[24]); + + + // Rewrite as new form + for (i = 1; i < 101; i++) { + double prob = 1 - pow(10, -i / 10.0); + + // May want to multiply all these by 5 so pMM[i] becomes close + // to -0 for most data. This makes the sums increment very slowly, + // keeping bit precision in the accumulator. + pMM[i] = log(prob/5); + p__[i] = log((1-prob)/20); + p_M[i] = log((exp(pMM[i]) + exp(p__[i]))/2); + } + + pMM[0] = pMM[1]; + p__[0] = p__[1]; + p_M[0] = p_M[1]; +} + +static inline double fast_exp(double y) { + if (y >= -50 && y <= 50) + return e_tab2[(int)(y*10)]; + + if (y < -500) + y = -500; + if (y > 500) + y = 500; + + return e_tab[(int)y]; +} + +/* Taylor (deg 3) implementation of the log */ +static inline double fast_log2(double val) +{ + // FP representation is exponent & mantissa, where + // value = 2^E * M. + // Hence log2(value) = log2(2^E * M) + // = log2(2^E)+ log2(M) + // = E + log2(M) + union { double d; uint64_t x; } u = {val}; + const int E = ((u.x >> 52) & 2047) - 1024; // exponent E + // Initial log2(M) based on mantissa + u.x &= ~(2047LL << 52); + u.x += 1023LL << 52; + + val = ((-1/3.) * u.d + 2) * u.d - 2/3.; + + return E + val; +} + +#define ph_log(x) (-TENLOG2OVERLOG10*fast_log2((x))) + + +int nins(const bam1_t *b){ + int i, indel = 0; + uint32_t *cig = bam_get_cigar(b); + for (i = 0; i < b->core.n_cigar; i++) { + int op = bam_cigar_op(cig[i]); + if (op == BAM_CINS || op == BAM_CDEL) + indel += bam_cigar_oplen(cig[i]); + } + return indel; +} + +// Return the local NM figure within halo (+/- HALO) of pos. +// This local NM is used as a way to modify MAPQ to get a localised MAPQ +// score via an adhoc fashion. +double nm_local(const pileup_t *p, const bam1_t *b, hts_pos_t pos) { + int *nm = (int *)p->cd; + if (!nm) + return 0; + pos -= b->core.pos; + if (pos < 0) + return nm[0]; + if (pos >= b->core.l_qseq) + return nm[b->core.l_qseq-1]; + + return nm[pos] / 10.0; +} + +/* + * Initialise a new sequence appearing in the pileup. We use this to + * precompute some metrics that we'll repeatedly use in the consensus + * caller; the localised NM score. + * + * We also directly amend the BAM record (which will be discarded later + * anyway) to modify qualities to account for local quality minima. + * + * Returns 0 (discard) or 1 (keep) on success, -1 on failure. + */ +int nm_init(void *client_data, samFile *fp, sam_hdr_t *h, pileup_t *p) { + consensus_opts *opts = (consensus_opts *)client_data; + if (!opts->use_mqual) + return 1; + + const bam1_t *b = &p->b; + int qlen = b->core.l_qseq, i; + int *local_nm = calloc(qlen, sizeof(*local_nm)); + if (!local_nm) + return -1; + p->cd = local_nm; + + if (opts->adj_qual) { +#if 0 + // Tweak by localised quality. + // Quality is reduced by a significant portion of the minimum quality + // in neighbouring bases, on the pretext that if the region is bad, then + // this base is bad even if it claims otherwise. + uint8_t *qual = bam_get_qual(b); + const int qhalo = 8; // 2? + int qmin = 50; // effectively caps PacBio qual too + for (i = 0; i < qlen && i < qhalo; i++) { + local_nm[i] = qual[i]; + if (qmin > qual[i]) + qmin = qual[i]; + } + for (;i < qlen-qhalo; i++) { + //int t = (qual[i]*1 + 3*qmin)/4; // good on 60x + int t = (qual[i] + 5*qmin)/4; // good on 15x + local_nm[i] = t < qual[i] ? t : qual[i]; + if (qmin > qual[i+qhalo]) + qmin = qual[i+qhalo]; + else if (qmin <= qual[i-qhalo]) { + int j; + qmin = 50; + for (j = i-qhalo+1; j <= i+qhalo; j++) + if (qmin > qual[j]) + qmin = qual[j]; + } + } + for (; i < qlen; i++) { + local_nm[i] = qual[i]; + local_nm[i] = (local_nm[i] + 6*qmin)/4; + } + + for (i = 0; i < qlen; i++) { + qual[i] = local_nm[i]; + + // Plus overall rescale. + // Lower becomes lower, very high becomes a little higher. + // Helps deep GIAB, but detrimental elsewhere. (What this really + // indicates is quality calibration differs per data set.) + // It's probably something best accounted for somewhere else. + + //qual[i] = qual[i]*qual[i]/40+1; + } + memset(local_nm, 0, qlen * sizeof(*local_nm)); +#else + // Skew local NM by qual vs min-qual delta + uint8_t *qual = bam_get_qual(b); + const int qhalo = 8; // 4 + int qmin = 99; + for (i = 0; i < qlen && i < qhalo; i++) { + if (qmin > qual[i]) + qmin = qual[i]; + } + for (;i < qlen-qhalo; i++) { + int t = (qual[i] + 5*qmin)/4; // good on 15x + local_nm[i] += t < qual[i] ? (qual[i]-t) : 0; + if (qmin > qual[i+qhalo]) + qmin = qual[i+qhalo]; + else if (qmin <= qual[i-qhalo]) { + int j; + qmin = 99; + for (j = i-qhalo+1; j <= i+qhalo; j++) + if (qmin > qual[j]) + qmin = qual[j]; + } + } + for (; i < qlen; i++) { + int t = (qual[i] + 5*qmin)/4; // good on 15x + local_nm[i] += t < qual[i] ? (qual[i]-t) : 0; + } +#endif + } + + // Adjust local_nm array by the number of edits within + // a defined region (pos +/- halo). + const int halo = opts->nm_halo; + const uint8_t *md = bam_aux_get(b, "MD"); + if (!md) + return 1; + md = (const uint8_t *)bam_aux2Z(md); + + // Handle cost of being near a soft-clip + uint32_t *cig = bam_get_cigar(b); + int ncig = b->core.n_cigar; + + if ( (cig[0] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP || + ((cig[0] & BAM_CIGAR_MASK) == BAM_CHARD_CLIP && ncig > 1 && + (cig[1] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP)) { + for (i = 0; i < halo && i < qlen; i++) + local_nm[i]+=opts->sc_cost; + for (; i < halo*2 && i < qlen; i++) + local_nm[i]+=opts->sc_cost>>1; + } + if ( (cig[ncig-1] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP || + ((cig[ncig-1] & BAM_CIGAR_MASK) == BAM_CHARD_CLIP && ncig > 1 && + (cig[ncig-2] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP)) { + for (i = qlen-1; i >= qlen-halo && i >= 0; i--) + local_nm[i]+=opts->sc_cost; + for (; i >= qlen-halo*2 && i >= 0; i--) + local_nm[i]+=opts->sc_cost>>1; + } + + // Now iterate over MD tag + int pos = 0; + while (*md) { + if (isdigit(*md)) { + uint8_t *endptr; + long i = strtol((char *)md, (char **)&endptr, 10); + md = endptr; + pos += i; + continue; + } + + // deletion. + // Should we bump local_nm here too? Maybe + if (*md == '^') { + while (*++md && !isdigit(*md)) + continue; + continue; + } + + // substitution + for (i = pos-halo*2 >= 0 ? pos-halo*2 : 0; i < pos-halo; i++) + local_nm[i]+=5; + for (; i < pos+halo && i < qlen; i++) + local_nm[i]+=10; + for (; i < pos+halo*2 && i < qlen; i++) + local_nm[i]+=5; + md++; + } + + return 1; +} + + +static +int calculate_consensus_gap5(hts_pos_t pos, int flags, int depth, + pileup_t *plp, consensus_opts *opts, + consensus_t *cons, int default_qual) { + int i, j; + static int init_done =0; + static double q2p[101], mqual_pow[256]; + double min_e_exp = DBL_MIN_EXP * log(2) + 1; + + double S[15] ALIGNED(16) = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + double sumsC[6] = {0,0,0,0,0,0}; // A C G T * N + + // Small hash on seq to check for uniqueness of surrounding bases. + // If it's frequent, then it's more likely to be correctly called than + // if it's rare. + // Helps a bit on deep data, especially with K2=3, but detrimental on + // shallow and (currently) quite a slow down. + +//#define K2 2 +#ifdef K2 + int hashN[1<<(K2*4+2)] = {0}; + int hash1[1<<2] = {0}; +#endif + + /* Map the 15 possible combinations to 1-base or 2-base encodings */ + static int map_sing[15] ALIGNED(16) = + {0, 5, 5, 5, 5, + 1, 5, 5, 5, + 2, 5, 5, + 3, 5, + 4}; + static int map_het[15] ALIGNED(16) = + {0, 1, 2, 3, 4, + 6, 7, 8, 9, + 12, 13, 14, + 18, 19, + 24}; + + if (!init_done) { + init_done = 1; + consensus_init(opts->P_het); + + for (i = 0; i <= 100; i++) { + q2p[i] = pow(10, -i/10.0); + } + + for (i = 0; i < 255; i++) { + //mqual_pow[i] = 1-pow(10, -(i+.01)/10.0); + mqual_pow[i] = 1-pow(10, -(i*.9)/10.0); + //mqual_pow[i] = 1-pow(10, -(i/3+.1)/10.0); + //mqual_pow[i] = 1-pow(10, -(i/2+.05)/10.0); + } + // unknown mqual + mqual_pow[255] = mqual_pow[10]; + } + + /* Initialise */ + int counts[6] = {0}; + + /* Accumulate */ + +#ifdef K2 + const pileup_t *ptmp = plp; + for (; ptmp; ptmp = ptmp->next) { + const pileup_t *p = ptmp; + if (p->qual < opts->min_qual) + continue; + + int hb = 0; +#define _ 0 + static int X[16] = {_,0,1,_,2,_,_,_,3,_,_,_,_,_,_,_}; +#undef _ + uint8_t *seq = bam_get_seq(&p->b); + int i, base1 = X[p->base4]; + hash1[base1]++; + for (i = p->seq_offset-K2; i <= p->seq_offset+K2; i++) { + int base = i >= 0 && i < p->b.core.l_qseq ? X[bam_seqi(seq,i)] : _; + hb = (hb<<2)|base; + } + hashN[hb]++; + } +#endif + + int td = depth; // original depth + depth = 0; + for (; plp; plp = plp->next) { + pileup_t *p = plp; + + if (p->next) + _mm_prefetch(p->next, _MM_HINT_T0); + + if (p->qual < opts->min_qual) + continue; + + if (p->ref_skip) + continue; + +#ifdef K2 + int hb = 0; +#define _ 0 + static int X[16] = {_,0,1,_,2,_,_,_,3,_,_,_,_,_,_,_}; + int i, base1 = X[p->base4]; + for (i = p->seq_offset-K2; i <= p->seq_offset+K2; i++) { + int base = i >= 0 && i < p->b.core.l_qseq ? X[bam_seqi(seq,i)] : _; + hb = (hb<<2)|base; + } + // fprintf(samtools_stderr, "%c: %d %d of %d\t%d %d\n", p->base, hashN[hb], hash1[base1], td, p->qual, p->qual * hashN[hb] / hash1[base1]); +#undef _ +#endif + + const bam1_t *b = &p->b; + uint8_t base = p->base4; + uint8_t *qual_arr = bam_get_qual(b); + uint8_t qual = p->qual; + //qual = qual*qual/40+1; + if (qual == 255 || (qual == 0 && *qual_arr == 255)) + qual = default_qual; + +#ifdef K2 + //qual = qual * hashN[hb] / hash1[base1]; + qual -= -TENOVERLOG10*log(hashN[hb] / (hash1[base1]+.1)); + if (qual < 1) + qual = 1; +#endif + + // =ACM GRSV TWYH KDBN * + static int L[32] = { + 5,0,1,5, 2,5,5,5, 3,5,5,5, 5,5,5,5, + 4,4,4,4, 4,4,4,4, 4,4,4,4, 4,4,4,4, + }; + + // convert from sam base to acgt*n order. + base = L[base]; + + double MM, __, _M, qe; + + // Correction for mapping quality. Maybe speed up via lookups? + // Cannot nullify mapping quality completely. Lots of (true) + // SNPs means low mapping quality. (Ideally need to know + // hamming distance to next best location.) + + if (flags & CONS_MQUAL) { + int mqual = b->core.qual; + if (opts->nm_adjust) { + mqual /= (nm_local(p, b, pos)+1); + mqual *= 1 + 2*(0.5-(td>30?30:td)/60.0); // depth fudge + } + + // higher => call more; +FP, -FN + // lower => call less; -FP, +FN + mqual *= opts->scale_mqual; + + // Drop these? They don't seem to ever help. + if (mqual < opts->low_mqual) + mqual = opts->low_mqual; + if (mqual > opts->high_mqual) + mqual = opts->high_mqual; + + double _p = 1-q2p[qual]; + double _m = mqual_pow[mqual]; + qual = ph_log(1-(_m * _p + (1 - _m)/4)); // CURRENT + //qual = ph_log(1-_p*_m); // testing + //qual *= 6/sqrt(td); + } + + /* Quality 0 should never be permitted as it breaks the maths */ + if (qual < 1) + qual = 1; + + __ = p__[qual]; // neither match + MM = pMM[qual] - __; // both match + _M = p_M[qual] - __; // one allele only (half match) + + if (flags & CONS_DISCREP) { + qe = q2p[qual]; + sumsC[base] += 1 - qe; + } + + counts[base]++; + + switch (base) { + case 0: // A + S[0] += MM; + S[1] += _M; + S[2] += _M; + S[3] += _M; + S[4] += _M; + break; + + case 1: // C + S[1] += _M; + S[5] += MM; + S[6] += _M; + S[7] += _M; + S[8] += _M; + break; + + case 2: // G + S[ 2] += _M; + S[ 6] += _M; + S[ 9] += MM; + S[10] += _M; + S[11] += _M; + break; + + case 3: // T + S[ 3] += _M; + S[ 7] += _M; + S[10] += _M; + S[12] += MM; + S[13] += _M; + + break; + + case 4: // * + S[ 4] += _M; + S[ 8] += _M; + S[11] += _M; + S[13] += _M; + S[14] += MM; + break; + + case 5: /* N => equal weight to all A,C,G,T but not a pad */ + S[ 0] += MM; + S[ 1] += MM; + S[ 2] += MM; + S[ 3] += MM; + S[ 4] += _M; + + S[ 5] += MM; + S[ 6] += MM; + S[ 7] += MM; + S[ 8] += _M; + + S[ 9] += MM; + S[10] += MM; + S[11] += _M; + + S[12] += MM; + S[13] += _M; + break; + } + + depth++; + + if (p->eof && p->cd) { + free(p->cd); + p->cd = NULL; + } + } + + /* We've accumulated stats, so now we speculate on the consensus call */ + double shift, max, max_het, norm[15]; + int call = 0, het_call = 0; + double tot1 = 0, tot2 = 0; + + /* + * Scale numbers so the maximum score is 0. This shift is essentially + * a multiplication in non-log scale to both numerator and denominator, + * so it cancels out. We do this to avoid calling exp(-large_num) and + * ending up with norm == 0 and hence a 0/0 error. + * + * Can also generate the base-call here too. + */ + shift = -DBL_MAX; + max = -DBL_MAX; + max_het = -DBL_MAX; + + for (j = 0; j < 15; j++) { + S[j] += lprior15[j]; + if (shift < S[j]) + shift = S[j]; + + /* Only call pure AA, CC, GG, TT, ** for now */ + if (j != 0 && j != 5 && j != 9 && j != 12 && j != 14) { + if (max_het < S[j]) { + max_het = S[j]; + het_call = j; + } + continue; + } + + if (max < S[j]) { + max = S[j]; + call = j; + } + } + + /* + * Shift and normalise. + * If call is, say, b we want p = b/(a+b+c+...+n), but then we do + * p/(1-p) later on and this has exceptions when p is very close + * to 1. + * + * Hence we compute b/(a+b+c+...+n - b) and + * rearrange (p/norm) / (1 - (p/norm)) to be p/norm2. + */ + for (j = 0; j < 15; j++) { + S[j] -= shift; + double e = fast_exp(S[j]); + S[j] = (S[j] > min_e_exp) ? e : DBL_MIN; + norm[j] = 0; + } + + for (j = 0; j < 15; j++) { + norm[j] += tot1; + norm[14-j] += tot2; + tot1 += S[j]; + tot2 += S[14-j]; + } + + /* And store result */ + if (!depth || depth == counts[5] /* all N */) { + cons->call = 4; /* N */ + cons->het_call = 0; + cons->het_logodd = 0; + cons->phred = 0; + cons->depth = 0; + cons->discrep = 0; + return 0; + } + + cons->depth = depth; + + /* Call */ + if (norm[call] == 0) norm[call] = DBL_MIN; + // Approximation of phred for when S[call] ~= 1 and norm[call] + // is small. Otherwise we need the full calculation. + int ph; + if (S[call] == 1 && norm[call] < .01) + ph = ph_log(norm[call]) + .5; + else + ph = ph_log(1-S[call]/(norm[call]+S[call])) + .5; + + cons->call = map_sing[call]; + cons->phred = ph < 0 ? 0 : ph; + + if (norm[het_call] == 0) norm[het_call] = DBL_MIN; + ph = TENLOG2OVERLOG10 * (fast_log2(S[het_call]) + - fast_log2(norm[het_call])) + .5; + + cons->het_call = map_het[het_call]; + cons->het_logodd = ph; + + /* Compute discrepancy score */ + if (flags & CONS_DISCREP) { + double m = sumsC[0]+sumsC[1]+sumsC[2]+sumsC[3]+sumsC[4]; + double c; + if (cons->het_logodd > 0) + c = sumsC[cons->het_call%5] + sumsC[cons->het_call/5]; + else + c = sumsC[cons->call]; + cons->discrep = (m-c)/sqrt(m); + } + + return 0; +} + + +/* -------------------------------------------------------------------------- + * Main processing logic + */ + +static void dump_fastq(consensus_opts *opts, + const char *name, + const char *seq, size_t seq_l, + const char *qual, size_t qual_l) { + enum format fmt = opts->fmt; + int line_len = opts->line_len; + FILE *fp = opts->fp_out; + + fprintf(fp, "%c%s\n", ">@"[fmt==FASTQ], name); + size_t i; + for (i = 0; i < seq_l; i += line_len) + fprintf(fp, "%.*s\n", (int)MIN(line_len, seq_l - i), seq+i); + + if (fmt == FASTQ) { + fprintf(fp, "+\n"); + for (i = 0; i < seq_l; i += line_len) + fprintf(fp, "%.*s\n", (int)MIN(line_len, seq_l - i), qual+i); + } +} + +//--------------------------------------------------------------------------- + +/* + * Reads a single alignment record, using either the iterator + * or a direct sam_read1 call. + */ +static int readaln2(void *dat, samFile *fp, sam_hdr_t *h, bam1_t *b) { + consensus_opts *opts = (consensus_opts *)dat; + + for (;;) { + int ret = opts->iter + ? sam_itr_next(fp, opts->iter, b) + : sam_read1(fp, h, b); + if (ret < 0) + return ret; + + // Apply hard filters + if (opts->incl_flags && !(b->core.flag & opts->incl_flags)) + continue; + if (opts->excl_flags && (b->core.flag & opts->excl_flags)) + continue; + if (b->core.qual < opts->min_mqual) + continue; + + return ret; + } +} + +/* -------------------------------------------------------------------------- + * A simple summing algorithm, either pure base frequency, or by + * weighting them according to their quality values. + * + * This is crude, but easy to understand and fits with several + * standard pileup criteria (eg COG-UK / CLIMB Covid-19 seq project). + * + * + * call1 / score1 / depth1 is the highest scoring allele. + * call2 / score2 / depth2 is the second highest scoring allele. + * + * Het_fract: score2/score1 + * Call_fract: score1 or score1+score2 over total score + * Min_depth: minimum total depth of utilised bases (depth1+depth2) + * Min_score: minimum total score of utilised bases (score1+score2) + * + * Eg het_fract 0.66, call_fract 0.75 and min_depth 10. + * 11A, 2C, 2G (14 total depth) is A. + * 9A, 2C, 2G (12 total depth) is N as depth(A) < 10. + * 11A, 5C, 5G (21 total depth) is N as 11/21 < 0.75 (call_fract) + * + * + * 6A, 5G, 1C (12 total depth) is AG het as depth(A)+depth(G) >= 10 + * and 5/6 >= 0.66 and 11/12 >= 0.75. + * + * 6A, 5G, 4C (15 total depth) is N as (6+5)/15 < 0.75 (call_fract). + * + * + * Note for the purpose of deletions, a base/del has an ambiguity + * code of lower-case base (otherwise it is uppercase). + */ +static int calculate_consensus_simple(const pileup_t *plp, + consensus_opts *opts, int *qual) { + int i, min_qual = opts->min_qual; + + // Map "seqi" nt16 to A,C,G,T compatibility with weights on pure bases. + // where seqi is A | (C<<1) | (G<<2) | (T<<3) + // * A C M G R S V T W Y H K D B N + static int seqi2A[16] = { 0,8,0,4, 0,4,0,2, 0,4,0,2, 0,2,0,1 }; + static int seqi2C[16] = { 0,0,8,4, 0,0,4,2, 0,0,4,2, 0,0,2,1 }; + static int seqi2G[16] = { 0,0,0,0, 8,4,4,1, 0,0,0,0, 4,2,2,1 }; + static int seqi2T[16] = { 0,0,0,0, 0,0,0,0, 8,4,4,2, 8,2,2,1 }; + + // Ignore ambiguous bases in seq for now, so we don't treat R, Y, etc + // as part of one base and part another. Based on BAM seqi values. + // We also use freq[16] as "*" for gap. + int freq[17] = {0}; // base frequency, aka depth + int score[17] = {0}; // summation of base qualities + + // Accumulate + for (; plp; plp = plp->next) { + const pileup_t *p = plp; + if (p->next) + _mm_prefetch(p->next, _MM_HINT_T0); + + int q = p->qual; + if (q < min_qual) + // Should we still record these in freq[] somewhere so + // we can use them in the fracts? + // Difference between >= X% of high-qual bases calling Y + // and >= X% of all bases are high-quality Y calls. + continue; + + //int b = p->is_del ? 16 : bam_seqi(bam_get_seq(&p->b), p->seq_offset); + int b = p->base4; + + // Map ambiguity codes to one or more component bases. + if (b < 16) { + int Q = seqi2A[b] * (opts->use_qual ? q : 1); + freq[1] += Q?1:0; + score[1] += Q?Q:0; + Q = seqi2C[b] * (opts->use_qual ? q : 1); + freq[2] += Q?1:0; + score[2] += Q?Q:0; + Q = seqi2G[b] * (opts->use_qual ? q : 1); + freq[4] += Q?1:0; + score[4] += Q?Q:0; + Q = seqi2T[b] * (opts->use_qual ? q : 1); + freq[8] += Q?1:0; + score[8] += Q?Q:0; + } else { /* * */ + freq[16] ++; + score[16]+=8 * (opts->use_qual ? q : 1); + } + } + + // Total usable depth + int tscore = 0; + for (i = 0; i < 5; i++) + tscore += score[1<= opts->het_fract * score1 && opts->ambig) { + used_base |= call2; + used_score += score2; + used_depth += depth2; + } + + // N is too shallow, or insufficient proportion of total + if (used_depth < opts->min_depth || + used_score < opts->call_fract * tscore) { + used_depth = 0; + // But note shallow gaps are still called gaps, not N, as + // we're still more confident there is no base than it is + // A, C, G or T. + used_base = call1 == 16 /*&& depth1 >= call_fract * depth*/ + ? 16 : 0; // * or N + } + + // Our final call. "?" shouldn't be possible to generate + const char *het = + "NACMGRSVTWYHKDBN" + "*ac?g???t???????"; + + //printf("%c %d\n", het[used_base], used_depth); + if (qual) + *qual = used_base ? 100.0 * used_score / tscore : 0; + + return het[used_base]; +} + +static int empty_pileup2(consensus_opts *opts, sam_hdr_t *h, int tid, + hts_pos_t start, hts_pos_t end) { + const char *name = sam_hdr_tid2name(h, tid); + hts_pos_t i; + + int err = 0; + for (i = start; i < end; i++) + err |= fprintf(opts->fp_out, "%s\t%"PRIhts_pos"\t0\t0\tN\t0\t*\t*\n", name, i+1) < 0; + + return err ? -1 : 0; +} + +/* + * Returns 0 on success + * -1 on failure + */ +static int basic_pileup(void *cd, samFile *fp, sam_hdr_t *h, pileup_t *p, + int depth, hts_pos_t pos, int nth, int is_insert) { + unsigned char *qp, *cp; + char *rp; + int ref, cb, cq; + consensus_opts *opts = (consensus_opts *)cd; + int tid = p->b.core.tid; + +// opts->show_ins=0; +// opts->show_del=1; + if (!opts->show_ins && nth) + return 0; + + if (opts->iter) { + if (opts->iter->beg >= pos || opts->iter->end < pos) + return 0; + } + + if (opts->all_bases) { + if (tid != opts->last_tid && opts->last_tid >= 0) { + hts_pos_t len = sam_hdr_tid2len(opts->h, opts->last_tid); + if (opts->iter) + len = MIN(opts->iter->end, len); + if (empty_pileup2(opts, opts->h, opts->last_tid, opts->last_pos, + len) < 0) + return -1; + if (tid >= 0) { + if (empty_pileup2(opts, opts->h, tid, + opts->iter ? opts->iter->beg : 0, + pos-1) < 0) + return -1; + } + } + if (opts->last_pos >= 0 && pos > opts->last_pos+1) { + if (empty_pileup2(opts, opts->h, p->b.core.tid, opts->last_pos, + pos-1) < 0) + return -1; + } else if (opts->last_pos < 0) { + if (empty_pileup2(opts, opts->h, p->b.core.tid, + opts->iter ? opts->iter->beg : 0, pos-1) < 0) + return -1; + } + } + + if (opts->gap5) { + consensus_t cons; + calculate_consensus_gap5(pos, opts->use_mqual ? CONS_MQUAL : 0, + depth, p, opts, &cons, opts->default_qual); + if (cons.het_logodd > 0 && opts->ambig) { + cb = "AMRWa" // 5x5 matrix with ACGT* per row / col + "MCSYc" + "RSGKg" + "WYKTt" + "acgt*"[cons.het_call]; + cq = cons.het_logodd; + } else{ + cb = "ACGT*"[cons.call]; + cq = cons.phred; + } + if (cq < opts->cons_cutoff && cb != '*') { + cb = 'N'; + cq = 0; + } + } else { + cb = calculate_consensus_simple(p, opts, &cq); + } + if (cb < 0) + return -1; + + if (!p) + return 0; + + if (!opts->show_del && cb == '*') + return 0; + + /* Ref, pos, nth, score, seq, qual */ + kstring_t *ks = &opts->ks_line; + ks->l = 0; + ref = p->b.core.tid; + rp = (char *)sam_hdr_tid2name(h, ref); + + int err = 0; + err |= kputs(rp, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputw(pos, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputw(nth, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputw(depth, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputc_(cb, ks) < 0; + err |= kputc_('\t', ks) < 0; + err |= kputw(cq, ks) < 0; + err |= kputc_('\t', ks) < 0; + if (err) + return -1; + + /* Seq + qual at predetermined offsets */ + if (ks_resize(ks, ks->l + depth*2 + 2) < 0) + return -1; + + cp = (unsigned char *)ks->s + ks->l; + ks->l += depth*2 + 2; + qp = cp+depth+1; + for (; p; p = p->next) { + // Too tight a loop to help much, but some benefit still + if (p->next && p->next->next) + _mm_prefetch(p->next->next, _MM_HINT_T0); + if (p->b_is_rev) { + *cp++ = p->base == '*' ? '#' : tolower(p->base); + } else { + *cp++ = p->base; + } + *qp++ = MIN(p->qual,93) + '!'; + } + *cp++ = '\t'; + *qp++ = '\n'; + if (fwrite(ks->s, 1, ks->l, opts->fp_out) != ks->l) + return -1; + + opts->last_pos = pos; + opts->last_tid = tid; + + return 0; +} + +static int basic_fasta(void *cd, samFile *fp, sam_hdr_t *h, pileup_t *p, + int depth, hts_pos_t pos, int nth, int is_insert) { + int cb, cq; + consensus_opts *opts = (consensus_opts *)cd; + int tid = p->b.core.tid; + kstring_t *seq = &opts->ks_ins_seq; + kstring_t *qual = &opts->ks_ins_qual; + + if (!opts->show_ins && nth) + return 0; + + if (opts->iter) { + if (opts->iter->beg >= pos || opts->iter->end < pos) + return 0; + } + + if (tid != opts->last_tid) { + if (opts->last_tid != -1) { + if (opts->all_bases) { + int i, N; + if (opts->iter) { + opts->last_pos = MAX(opts->last_pos, opts->iter->beg-1); + N = opts->iter->end; + } else { + N = INT_MAX; + } + N = MIN(N, sam_hdr_tid2len(opts->h, opts->last_tid)) + - opts->last_pos; + if (N > 0) { + if (ks_expand(seq, N+1) < 0) + return -1; + if (ks_expand(qual, N+1) < 0) + return -1; + for (i = 0; i < N; i++) { + seq->s[seq->l++] = 'N'; + qual->s[qual->l++] = '!'; + } + seq->s[seq->l] = 0; + qual->s[qual->l] = 0; + } + } + dump_fastq(opts, sam_hdr_tid2name(opts->h, opts->last_tid), + seq->s, seq->l, qual->s, qual->l); + } + + seq->l = 0; qual->l = 0; + opts->last_tid = tid; +// if (opts->all_bases) +// opts->last_pos = 0; + if (opts->iter) + opts->last_pos = opts->iter->beg; + else + opts->last_pos = opts->all_bases ? 0 : pos-1; + } + + // share this with basic_pileup + if (opts->gap5) { + consensus_t cons; + calculate_consensus_gap5(pos, opts->use_mqual ? CONS_MQUAL : 0, + depth, p, opts, &cons, opts->default_qual); + if (cons.het_logodd > 0 && opts->ambig) { + cb = "AMRWa" // 5x5 matrix with ACGT* per row / col + "MCSYc" + "RSGKg" + "WYKTt" + "acgt*"[cons.het_call]; + cq = cons.het_logodd; + } else{ + cb = "ACGT*"[cons.call]; + cq = cons.phred; + } + if (cq < opts->cons_cutoff && cb != '*' && + cons.het_call % 5 != 4 && cons.het_call / 5 != 4) { + // het base/* keeps base or * as most likely pure call, else N. + // This is because we don't have a traditional way of representing + // base or not-base ambiguity. + cb = 'N'; + cq = 0; + } + } else { + cb = calculate_consensus_simple(p, opts, &cq); + } + if (cb < 0) + return -1; + + if (!p) + return 0; + + if (!opts->show_del && cb == '*') { + opts->last_pos = pos; + opts->last_tid = tid; + return 0; + } + // end of share + + // Append consensus base/qual to seqs + if (pos > opts->last_pos) { + if (opts->last_pos >= 0 || opts->all_bases) { + // FIXME: don't expand qual if fasta + if (ks_expand(seq, pos - opts->last_pos) < 0 || + ks_expand(qual, pos - opts->last_pos) < 0) + return -1; + memset(seq->s + seq->l, 'N', pos - (opts->last_pos+1)); + memset(qual->s + qual->l, '!', pos - (opts->last_pos+1)); + seq->l += pos - (opts->last_pos+1); + qual->l += pos - (opts->last_pos+1); + } + } + if ((nth && opts->show_ins && cb != '*') + || cb != '*' || (pos > opts->last_pos && opts->show_del)) { + int err = 0; + err |= kputc(cb, seq) < 0; + err |= kputc(MIN(cq, '~'-'!')+'!', qual) < 0; + if (err) + return -1; + } + + opts->last_pos = pos; + opts->last_tid = tid; + + return 0; +} +// END OF NEW PILEUP +//--------------------------------------------------------------------------- + +static void usage_exit(FILE *fp, int exit_status) { + fprintf(fp, "Usage: samtools consensus [options] \n"); + fprintf(fp, "\nOptions:\n"); + fprintf(fp, " -r, --region REG Limit query to REG. Requires an index\n"); + fprintf(fp, " -f, --format FMT Output in format FASTA, FASTQ or PILEUP [FASTA]\n"); + fprintf(fp, " -l, --line-len INT Wrap FASTA/Q at line length INT [70]\n"); + fprintf(fp, " -o, --output FILE Output consensus to FILE\n"); + fprintf(fp, " -m, --mode STR Switch consensus mode to \"simple\"/\"bayesian\" [bayesian]\n"); + fprintf(fp, " -a Output all bases (start/end of reference)\n"); + fprintf(fp, " --rf, --incl-flags STR|INT\n"); + fprintf(fp, " Only include reads with any flag bit set [0]\n"); + fprintf(fp, " --ff, --excl-flags STR|INT\n"); + fprintf(fp, " Exclude reads with any flag bit set\n"); + fprintf(fp, " [UNMAP,SECONDARY,QCFAIL,DUP]\n"); + fprintf(fp, " --min-MQ INT Exclude reads with mapping quality below INT [0]\n"); + fprintf(fp, " --show-del yes/no Whether to show deletion as \"*\" [no]\n"); + fprintf(fp, " --show-ins yes/no Whether to show insertions [yes]\n"); + fprintf(fp, " -A, --ambig Enable IUPAC ambiguity codes [off]\n"); + fprintf(fp, "\nFor simple consensus mode:\n"); + fprintf(fp, " -q, --(no-)use-qual Use quality values in calculation [off]\n"); + fprintf(fp, " -c, --call-fract INT At least INT portion of bases must agree [0.75]\n"); + fprintf(fp, " -d, --min-depth INT Minimum depth of INT [1]\n"); + fprintf(fp, " -H, --het-fract INT Minimum fraction of 2nd-most to most common base [0.5]\n"); + fprintf(fp, "\nFor default \"Bayesian\" consensus mode:\n"); + fprintf(fp, " -C, --cutoff C Consensus cutoff quality C [10]\n"); + fprintf(fp, " --(no-)adj-qual Modify quality with local minima [on]\n"); + fprintf(fp, " --(no-)use-MQ Use mapping quality in calculation [on]\n"); + fprintf(fp, " --(no-)adj-MQ Modify mapping quality by local NM [on]\n"); + fprintf(fp, " --NM-halo INT Size of window for NM count in --adj-MQ [50]\n"); + fprintf(fp, " --scale-MQ FLOAT Scale mapping quality by FLOAT [1.00]\n"); + fprintf(fp, " --low-MQ INT Cap minimum mapping quality [1]\n"); + fprintf(fp, " --high-MQ INT Cap maximum mapping quality [60]\n"); + fprintf(fp, " --P-het FLOAT Probability of heterozygous site[%.1e]\n", + P_HET); + + fprintf(fp, "\nGlobal options:\n"); + sam_global_opt_help(fp, "-.---@-."); + samtools_exit(exit_status); +} + +int main_consensus(int argc, char **argv) { + int c, ret = 1; + + consensus_opts opts = { + // User options + .gap5 = 1, + .use_qual = 0, + .min_qual = 0, + .adj_qual = 1, + .use_mqual = 1, + .scale_mqual = 1.00, + .nm_adjust = 1, + .nm_halo = 50, + .sc_cost = 60, + .low_mqual = 1, + .high_mqual = 60, + .min_depth = 1, + .call_fract = 0.75, + .het_fract = 0.5, + .het_only = 0, + .fmt = FASTA, + .cons_cutoff = 10, + .ambig = 0, + .line_len = 70, + .default_qual = 10, + .all_bases = 0, + .show_del = 0, + .show_ins = 1, + .incl_flags = 0, + .excl_flags = BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP, + .min_mqual = 0, + .P_het = P_HET, + + // Internal state + .ks_line = {0,0}, + .ks_ins_seq = {0,0}, + .ks_ins_qual = {0,0}, + .fp = NULL, + .fp_out = samtools_stdout, + .iter = NULL, + .idx = NULL, + .last_tid = -1, + .last_pos = -1, + }; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', '-', '-', '@'), + {"use-qual", no_argument, NULL, 'q'}, + {"no-use-qual", no_argument, NULL, 'q'+1000}, + {"adj-qual", no_argument, NULL, 'q'+100}, + {"no-adj-qual", no_argument, NULL, 'q'+101}, + {"use-MQ", no_argument, NULL, 'm'+1000}, + {"no-use-MQ", no_argument, NULL, 'm'+1001}, + {"adj-MQ", no_argument, NULL, 'm'+100}, + {"no-adj-MQ", no_argument, NULL, 'm'+101}, + {"NM-halo", required_argument, NULL, 'h'+100}, + {"SC-cost", required_argument, NULL, 'h'+101}, + {"scale-MQ", required_argument, NULL, 14}, + {"low-MQ" , required_argument, NULL, 9}, + {"high-MQ", required_argument, NULL, 10}, + {"min-depth", required_argument, NULL, 'd'}, + {"call-fract", required_argument, NULL, 'c'}, + {"het-fract", required_argument, NULL, 'H'}, + {"region", required_argument, NULL, 'r'}, + {"format", required_argument, NULL, 'f'}, + {"cutoff", required_argument, NULL, 'C'}, + {"ambig", no_argument, NULL, 'A'}, + {"line-len", required_argument, NULL, 'l'}, + {"default-qual", required_argument, NULL, 1}, + {"het-only", no_argument, NULL, 6}, + {"show-del", required_argument, NULL, 7}, + {"show-ins", required_argument, NULL, 8}, + {"output", required_argument, NULL, 'o'}, + {"incl-flags", required_argument, NULL, 11}, + {"rf", required_argument, NULL, 11}, + {"excl-flags", required_argument, NULL, 12}, + {"ff", required_argument, NULL, 12}, + {"min-MQ", required_argument, NULL, 13}, + {"P-het", required_argument, NULL, 15}, + {"mode", required_argument, NULL, 'm'}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "@:qd:c:H:r:5f:C:aAl:o:m:", + lopts, NULL)) >= 0) { + switch (c) { + case 'a': opts.all_bases++; break; + case 'q': opts.use_qual=1; break; + case 'q'+1000: opts.use_qual=0; break; + case 'm'+1000: opts.use_mqual=1; break; + case 'm'+1001: opts.use_mqual=0; break; + case 14: opts.scale_mqual = atof(optarg); break; + case 9: opts.low_mqual = atoi(optarg); break; + case 10: opts.high_mqual = atoi(optarg); break; + case 'd': opts.min_depth = atoi(optarg); break; + case 'c': opts.call_fract = atof(optarg); break; + case 'H': opts.het_fract = atof(optarg); break; + case 'r': opts.reg = optarg; break; + case 'C': opts.cons_cutoff = atoi(optarg); break; + case 'A': opts.ambig = 1; break; + case 1: opts.default_qual = atoi(optarg); break; + case 6: opts.het_only = 1; break; + case 7: opts.show_del = (*optarg == 'y' || *optarg == 'Y'); break; + case 8: opts.show_ins = (*optarg == 'y' || *optarg == 'Y'); break; + case 13: opts.min_mqual = atoi(optarg); break; + case 15: opts.P_het = atof(optarg); break; + case 'q'+100: opts.adj_qual = 1; break; + case 'q'+101: opts.adj_qual = 0; break; + case 'm'+100: opts.nm_adjust = 1; break; + case 'm'+101: opts.nm_adjust = 0; break; + case 'h'+100: opts.nm_halo = atoi(optarg); break; + case 'h'+101: opts.sc_cost = atoi(optarg); break; + + case 'm': // mode + if (strcasecmp(optarg, "simple") == 0) { + opts.gap5 = 0; + } else if (strcasecmp(optarg, "bayesian") == 0) { + opts.gap5 = 1; + } else { + fprintf(samtools_stderr, "Unknown mode %s\n", optarg); + return 1; + } + break; + + case 'l': + if ((opts.line_len = atoi(optarg)) <= 0) + opts.line_len = INT_MAX; + break; + + case 'f': + if (strcasecmp(optarg, "fasta") == 0) { + opts.fmt = FASTA; + } else if (strcasecmp(optarg, "fastq") == 0) { + opts.fmt = FASTQ; + } else if (strcasecmp(optarg, "pileup") == 0) { + opts.fmt = PILEUP; + } else { + fprintf(samtools_stderr, "Unknown format %s\n", optarg); + return 1; + } + break; + + case 'o': + if (!(opts.fp_out = fopen(optarg, "w"))) { + perror(optarg); + return 1; + } + break; + + case 11: + if ((opts.incl_flags = bam_str2flag(optarg)) < 0) { + print_error("consensus", "could not parse --rf %s", optarg); + return 1; + } + break; + case 12: + if ((opts.excl_flags = bam_str2flag(optarg)) < 0) { + print_error("consensus", "could not parse --ff %s", optarg); + return 1; + } + break; + + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + usage_exit(samtools_stderr, EXIT_FAILURE); + } + } + + if (argc != optind+1) { + if (argc == optind) usage_exit(samtools_stdout, EXIT_SUCCESS); + else usage_exit(samtools_stderr, EXIT_FAILURE); + } + opts.fp = sam_open_format(argv[optind], "r", &ga.in); + if (opts.fp == NULL) { + print_error_errno("consensus", "Cannot open input file \"%s\"", + argv[optind]); + goto err; + } + if (ga.nthreads > 0) + hts_set_threads(opts.fp, ga.nthreads); + + if (hts_set_opt(opts.fp, CRAM_OPT_DECODE_MD, 0)) { + fprintf(samtools_stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + goto err; + } + + if (!(opts.h = sam_hdr_read(opts.fp))) { + fprintf(samtools_stderr, "Failed to read header for \"%s\"\n", argv[optind]); + goto err; + } + + if (opts.reg) { + opts.idx = sam_index_load(opts.fp, argv[optind]); + if (!opts.idx) { + print_error("consensus", "Cannot load index for input file \"%s\"", + argv[optind]); + goto err; + } + opts.iter = sam_itr_querys(opts.idx, opts.h, opts.reg); + if (!opts.iter) { + print_error("consensus", "Failed to parse region \"%s\"", + opts.reg); + goto err; + } + } + + if (opts.fmt == PILEUP) { + if (pileup_loop(opts.fp, opts.h, readaln2, opts.gap5 ? nm_init : NULL, + basic_pileup, &opts) < 0) + goto err; + + if (opts.all_bases) { + int tid = opts.iter ? opts.iter->tid : opts.last_tid; + int len = sam_hdr_tid2len(opts.h, tid); + int pos = opts.last_pos; + if (opts.iter) { + len = MIN(opts.iter->end, len); + pos = MAX(opts.iter->beg, pos); + } + if (empty_pileup2(&opts, opts.h, tid, pos, len) < 0) + goto err; + } + } else { + if (pileup_loop(opts.fp, opts.h, readaln2, opts.gap5 ? nm_init : NULL, + basic_fasta, + &opts) < 0) + goto err; + if (opts.all_bases) { + // fill out terminator + int tid = opts.iter ? opts.iter->tid : opts.last_tid; + int len = sam_hdr_tid2len(opts.h, tid); + int pos = opts.last_pos; + if (opts.iter) { + len = MIN(opts.iter->end, len); + pos = MAX(opts.iter->beg, pos); + opts.last_tid = opts.iter->tid; + } + if (pos < len) { + if (ks_expand(&opts.ks_ins_seq, len-pos+1) < 0) + goto err; + if (ks_expand(&opts.ks_ins_qual, len-pos+1) < 0) + goto err; + while (pos++ < len) { + opts.ks_ins_seq.s [opts.ks_ins_seq.l++] = 'N'; + opts.ks_ins_qual.s[opts.ks_ins_qual.l++] = '!'; + } + opts.ks_ins_seq.s [opts.ks_ins_seq.l] = 0; + opts.ks_ins_qual.s[opts.ks_ins_qual.l] = 0; + } + } + if (opts.last_tid >= 0) + dump_fastq(&opts, sam_hdr_tid2name(opts.h, opts.last_tid), + opts.ks_ins_seq.s, opts.ks_ins_seq.l, + opts.ks_ins_qual.s, opts.ks_ins_qual.l); +// if (consensus_loop(&opts) < 0) { +// print_error_errno("consensus", "Failed"); +// goto err; +// } + } + + ret = 0; + + err: + if (opts.iter) + hts_itr_destroy(opts.iter); + if (opts.idx) + hts_idx_destroy(opts.idx); + + if (opts.fp && sam_close(opts.fp) < 0) { + print_error_errno("consensus", "Closing input file \"%s\"", + argv[optind]); + ret = 1; + } + + if (opts.h) + sam_hdr_destroy(opts.h); + sam_global_args_free(&ga); + + if (opts.fp_out && opts.fp_out != samtools_stdout) + ret |= fclose(opts.fp_out) != 0; + else + ret |= fflush(samtools_stdout) != 0; + + ks_free(&opts.ks_line); + ks_free(&opts.ks_ins_seq); + ks_free(&opts.ks_ins_qual); + + if (ret) + print_error("consensus", "failed"); + + return ret; +} diff --git a/samtools/bam_fastq.c b/samtools/bam_fastq.c new file mode 100644 index 0000000..c17821d --- /dev/null +++ b/samtools/bam_fastq.c @@ -0,0 +1,885 @@ +/* bam_fastq.c -- FASTA and FASTQ file generation + + Copyright (C) 2009-2017, 2019-2020 Genome Research Ltd. + Portions copyright (C) 2009, 2011, 2012 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "htslib/sam.h" +#include "htslib/klist.h" +#include "htslib/kstring.h" +#include "htslib/bgzf.h" +#include "htslib/thread_pool.h" +#include "samtools.h" +#include "sam_opts.h" + +#define DEFAULT_BARCODE_TAG "BC" +#define DEFAULT_QUALITY_TAG "QT" +#define INDEX_SEPARATOR "+" + +int8_t seq_comp_table[16] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }; +static void bam2fq_usage(FILE *to, const char *command) +{ + int fq = strcasecmp("fastq", command) == 0 || strcasecmp("bam2fq", command) == 0; + fprintf(to, +"Usage: samtools %s [options...] \n", command); + fprintf(to, +"\n" +"Description:\n" +"Converts a SAM, BAM or CRAM to %s format.\n" +"\n" +"Options:\n" +" -0 FILE write reads designated READ_OTHER to FILE\n" +" -1 FILE write reads designated READ1 to FILE\n" +" -2 FILE write reads designated READ2 to FILE\n" +" -o FILE write reads designated READ1 or READ2 to FILE\n" +" note: if a singleton file is specified with -s, only\n" +" paired reads will be written to the -1 and -2 files.\n" +" -f INT only include reads with all of the FLAGs in INT present [0]\n" // F&x == x +" -F INT only include reads with none of the FLAGS in INT present [0x900]\n" // F&x == 0 +" -G INT only EXCLUDE reads with all of the FLAGs in INT present [0]\n" // !(F&x == x) +" -n don't append /1 and /2 to the read name\n" +" -N always append /1 and /2 to the read name\n", + fq ? "FASTQ" : "FASTA"); + if (fq) fprintf(to, +" -O output quality in the OQ tag if present\n"); + fprintf(to, +" -s FILE write singleton reads designated READ1 or READ2 to FILE\n" +" -t copy RG, BC and QT tags to the %s header line\n", + fq ? "FASTQ" : "FASTA"); + fprintf(to, +" -T TAGLIST copy arbitrary tags to the %s header line, '*' for all\n", + fq ? "FASTQ" : "FASTA"); + if (fq) fprintf(to, +" -v INT default quality score if not given in file [1]\n" +" -i add Illumina Casava 1.8 format entry to header (eg 1:N:0:ATCACG)\n" +" -c INT compression level [0..9] to use when writing bgzf files [1]\n" +" --i1 FILE write first index reads to FILE\n" +" --i2 FILE write second index reads to FILE\n" +" --barcode-tag TAG\n" +" Barcode tag [" DEFAULT_BARCODE_TAG "]\n" +" --quality-tag TAG\n" +" Quality tag [" DEFAULT_QUALITY_TAG "]\n" +" --index-format STR\n" +" How to parse barcode and quality tags\n\n"); + sam_global_opt_help(to, "-.--.@-."); + fprintf(to, +"\n" +"The files will be automatically compressed if the file names have a .gz\n" +"or .bgzf extension. The input to this program must be collated by name.\n" +"Run 'samtools collate' or 'samtools sort -n' to achieve this.\n" +"\n" +"Reads are designated READ1 if FLAG READ1 is set and READ2 is not set.\n" +"Reads are designated READ2 if FLAG READ1 is not set and READ2 is set.\n" +"Otherwise reads are designated READ_OTHER (both flags set or both flags unset).\n" +"Run 'samtools flags' for more information on flag codes and meanings.\n"); + fprintf(to, +"\n" +"The index-format string describes how to parse the barcode and quality tags.\n" +"It is made up of 'i' or 'n' followed by a length or '*'. For example:\n" +" i14i8 The first 14 characters are index 1, the next 8 are index 2\n" +" n8i14 Ignore the first 8 characters, and use the next 14 for index 1\n\n" +"If the tag contains a separator, then the numeric part can be replaced with\n" +"'*' to mean 'read until the separator or end of tag', for example:\n" +" i*i* Break the tag at the separator into index 1 and index 2\n" +" n*i* Ignore the left part of the tag until the separator,\n" +" then use the second part of the tag as index 1\n"); + fprintf(to, +"\n" +"Examples:\n" +"To get just the paired reads in separate files, use:\n" +" samtools %s -1 pair1.%s -2 pair2.%s -0 /dev/null -s /dev/null -n in.bam\n" +"\nTo get all non-supplementary/secondary reads in a single file, redirect\n" +"the output:\n" +" samtools %s in.bam > all_reads.%s\n", + command, fq ? "fq" : "fa", fq ? "fq" : "fa", + command, fq ? "fq" : "fa"); +} + +typedef enum { READ_UNKNOWN = 0, READ_1 = 1, READ_2 = 2 } readpart; +typedef enum { FASTA, FASTQ } fastfile; +typedef struct bam2fq_opts { + char *fnse; + char *fnr[3]; + char *fn_input; // pointer to input filename in argv do not free + bool has12, has12always, use_oq, copy_tags, illumina_tag; + int flag_on, flag_off, flag_alloff; + sam_global_args ga; + fastfile filetype; + int def_qual; + char *barcode_tag; + char *quality_tag; + char *index_file[2]; + char *index_format; + char *extra_tags; + char compression_level; +} bam2fq_opts_t; + +typedef struct bam2fq_state { + samFile *fp; + samFile *fpse; + samFile *fpr[3]; + samFile *fpi[3]; + samFile *hstdout; + sam_hdr_t *h; + bool has12, use_oq, copy_tags, illumina_tag; + int flag_on, flag_off, flag_alloff; + fastfile filetype; + int def_qual; + char *index_sequence; + char compression_level; + htsThreadPool p; +} bam2fq_state_t; + +static readpart which_readpart(const bam1_t *b) +{ + if ((b->core.flag & BAM_FREAD1) && !(b->core.flag & BAM_FREAD2)) { + return READ_1; + } else if ((b->core.flag & BAM_FREAD2) && !(b->core.flag & BAM_FREAD1)) { + return READ_2; + } else { + return READ_UNKNOWN; + } +} + +static void free_opts(bam2fq_opts_t *opts) +{ + free(opts); +} + +// return true if valid +static bool parse_opts(int argc, char *argv[], bam2fq_opts_t** opts_out) +{ + // Parse args + bam2fq_opts_t* opts = calloc(1, sizeof(bam2fq_opts_t)); + opts->has12 = true; + opts->has12always = false; + opts->filetype = FASTQ; + opts->def_qual = 1; + opts->barcode_tag = NULL; + opts->quality_tag = NULL; + opts->index_format = NULL; + opts->index_file[0] = NULL; + opts->index_file[1] = NULL; + opts->extra_tags = NULL; + opts->compression_level = 1; + opts->flag_off = BAM_FSECONDARY|BAM_FSUPPLEMENTARY; + int flag_off_set = 0; + + int c; + sam_global_args_init(&opts->ga); + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '@'), + {"i1", required_argument, NULL, 1}, + {"I1", required_argument, NULL, 1}, + {"i2", required_argument, NULL, 2}, + {"I2", required_argument, NULL, 2}, + {"if", required_argument, NULL, 3}, + {"IF", required_argument, NULL, 3}, + {"index-format", required_argument, NULL, 3}, + {"barcode-tag", required_argument, NULL, 'b'}, + {"quality-tag", required_argument, NULL, 'q'}, + { NULL, 0, NULL, 0 } + }; + while ((c = getopt_long(argc, argv, "0:1:2:o:f:F:G:niNOs:c:tT:v:@:", + lopts, NULL)) > 0) { + switch (c) { + case 'b': opts->barcode_tag = optarg; break; + case 'q': opts->quality_tag = optarg; break; + case 1 : opts->index_file[0] = optarg; break; + case 2 : opts->index_file[1] = optarg; break; + case 3 : opts->index_format = optarg; break; + case '0': opts->fnr[0] = optarg; break; + case '1': opts->fnr[1] = optarg; break; + case '2': opts->fnr[2] = optarg; break; + case 'o': opts->fnr[1] = optarg; opts->fnr[2] = optarg; break; + case 'f': opts->flag_on |= strtol(optarg, 0, 0); break; + case 'F': + if (!flag_off_set) { + flag_off_set = 1; + opts->flag_off = 0; + } + opts->flag_off |= strtol(optarg, 0, 0); + break; + case 'G': opts->flag_alloff |= strtol(optarg, 0, 0); break; + case 'n': opts->has12 = false; break; + case 'N': opts->has12always = true; break; + case 'O': opts->use_oq = true; break; + case 's': opts->fnse = optarg; break; + case 't': opts->copy_tags = true; break; + case 'i': opts->illumina_tag = true; break; + case 'c': + opts->compression_level = atoi(optarg); + if (opts->compression_level < 0) + opts->compression_level = 0; + if (opts->compression_level > 9) + opts->compression_level = 9; + break; + case 'T': opts->extra_tags = optarg; break; + case 'v': opts->def_qual = atoi(optarg); break; + + case '?': + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + default: + if (parse_sam_global_opt(c, optarg, lopts, &opts->ga) != 0) { + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + } + break; + } + } + + if (opts->fnr[1] || opts->fnr[2]) opts->has12 = false; + if (opts->has12always) opts->has12 = true; + + if (!opts->barcode_tag) opts->barcode_tag = DEFAULT_BARCODE_TAG; + if (!opts->quality_tag) opts->quality_tag = DEFAULT_QUALITY_TAG; + + int nIndex = 0; + if (opts->index_format) { + char *s; + for (s = opts->index_format; *s; s++) { + if (*s == 'i') nIndex++; + } + } + if (nIndex>2) { + fprintf(stderr,"Invalid index format: more than 2 indexes\n"); + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + } + + if (opts->index_file[1] && !opts->index_file[0]) { + fprintf(stderr, "Index one specified, but index two not given\n"); + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + } + + if (opts->illumina_tag && !nIndex) { + fprintf(stderr, "You must specify an index format (--index-format) with the Illumina Casava (-i) option\n"); + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + } + + if (nIndex==0 && opts->index_file[0]) { + fprintf(stderr, "index_format not specified, but index file given\n"); + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + } + + if (opts->def_qual < 0 || 93 < opts->def_qual) { + fprintf(stderr, "Invalid -v default quality %i, allowed range 0 to 93\n", opts->def_qual); + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + } + + const char* type_str = argv[0]; + if (strcasecmp("fastq", type_str) == 0 || + strcasecmp("bam2fq", type_str) == 0) { + opts->filetype = FASTQ; + } else if (strcasecmp("fasta", type_str) == 0) { + opts->filetype = FASTA; + } else { + print_error("bam2fq", "Unrecognised type call \"%s\", this should be impossible... but you managed it!", type_str); + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + } + + if (argc == optind && isatty(STDIN_FILENO)) { + bam2fq_usage(stdout, argv[0]); + free_opts(opts); + return true; + } + + if (argc - optind > 1) { + fprintf(stderr, "Too many arguments.\n"); + bam2fq_usage(stderr, argv[0]); + free_opts(opts); + return false; + } + opts->fn_input = argc > optind ? argv[optind] : "-"; + *opts_out = opts; + return true; +} + +void set_sam_opts(samFile *fp, bam2fq_state_t *state, + const bam2fq_opts_t *opts) { + if (state->has12) + hts_set_opt(fp, FASTQ_OPT_RNUM, 1); + + if (state->illumina_tag) + hts_set_opt(fp, FASTQ_OPT_CASAVA, 1); + + hts_set_opt(fp, FASTQ_OPT_BARCODE, opts->barcode_tag); + + if (opts->extra_tags && (*opts->extra_tags == '*' || *opts->extra_tags == '\0')) + hts_set_opt(fp, FASTQ_OPT_AUX, NULL); + else { + kstring_t tag_list = {0,0}; + if (state->copy_tags) + kputs("RG,BC,QT", &tag_list); + if (opts->extra_tags) { + if (tag_list.l) + kputc(',', &tag_list); + kputs(opts->extra_tags, &tag_list); + } + if (tag_list.l) + hts_set_opt(fp, FASTQ_OPT_AUX, tag_list.s); + ks_free(&tag_list); + } +} + +// Open a file as normal or gzipped based on filename. +// Note we always use bgzf and don't bother to attempt non-blocked +// gzip streams. This is a departure from the old fastq code. +static samFile *sam_open_z(char *fn, char *mode, bam2fq_state_t *state) { + char modez[6]; + strcpy(modez, mode); + + size_t l = strlen(fn); + if ((l > 3 && strcmp(fn+l-3, ".gz") == 0) || + (l > 4 && strcmp(fn+l-4, ".bgz") == 0) || + (l > 5 && strcmp(fn+l-5, ".bgzf") == 0)) { + char m[3] = {'z', state->compression_level+'0', '\0'}; + strcat(modez, m); + } + + samFile *fp = sam_open(fn, modez); + if (!fp) + return NULL; + + if (state->p.pool) + hts_set_thread_pool(fp, &state->p); + + return fp; +} + +static bool init_state(const bam2fq_opts_t* opts, bam2fq_state_t** state_out) +{ + char *mode = opts->filetype == FASTA ? "wF" : "wf"; + + bam2fq_state_t* state = calloc(1, sizeof(bam2fq_state_t)); + if (!state) + return false; + state->flag_on = opts->flag_on; + state->flag_off = opts->flag_off; + state->flag_alloff = opts->flag_alloff; + state->has12 = opts->has12; + state->use_oq = opts->use_oq; + state->illumina_tag = opts->illumina_tag; + state->copy_tags = opts->copy_tags; + state->filetype = opts->filetype; + state->def_qual = opts->def_qual; + state->index_sequence = NULL; + state->hstdout = NULL; + state->compression_level = opts->compression_level; + + state->fp = sam_open(opts->fn_input, "r"); + if (state->fp == NULL) { + print_error_errno("bam2fq","Cannot read file \"%s\"", opts->fn_input); + free(state); + return false; + } + + state->p.pool = NULL; + if (opts->ga.nthreads > 0) { + if (!(state->p.pool = hts_tpool_init(opts->ga.nthreads))) { + fprintf(stderr, "Failed to create thread pool\n"); + free(state); + return false; + } + state->p.qsize = opts->ga.nthreads*2; + hts_set_thread_pool(state->fp, &state->p); + } + + uint32_t rf = SAM_QNAME | SAM_FLAG | SAM_SEQ | SAM_QUAL; + if (opts->use_oq || opts->extra_tags || opts->index_file[0]) rf |= SAM_AUX; + if (hts_set_opt(state->fp, CRAM_OPT_REQUIRED_FIELDS, rf)) { + fprintf(stderr, "Failed to set CRAM_OPT_REQUIRED_FIELDS value\n"); + free(state); + return false; + } + if (hts_set_opt(state->fp, CRAM_OPT_DECODE_MD, 0)) { + fprintf(stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + free(state); + return false; + } + if (opts->fnse) { + if (!(state->fpse = sam_open_z(opts->fnse, mode, state))) { + print_error_errno("bam2fq", "Cannot open singleton file \"%s\"", opts->fnse); + free(state); + return false; + } + set_sam_opts(state->fpse, state, opts); + } + + if (opts->ga.reference) { + if (hts_set_fai_filename(state->fp, opts->ga.reference) != 0) { + print_error_errno("bam2fq", "cannot load reference \"%s\"", opts->ga.reference); + free(state); + return false; + } + } + + // single, read1, read2 + int i, j; + for (i = 0; i < 3; ++i) { + if (opts->fnr[i]) { + for (j = 0; j < i; j++) + if (opts->fnr[j] && strcmp(opts->fnr[j], opts->fnr[i]) == 0) + break; + if (j == i) { + if (!(state->fpr[i] = sam_open_z(opts->fnr[i], mode, state))) { + print_error_errno("bam2fq", "Cannot open r%d file \"%s\"", + i, opts->fnr[i]); + free(state); + return false; + } + set_sam_opts(state->fpr[i], state, opts); + } else { + state->fpr[i] = state->fpr[j]; + } + } else { + if (!state->hstdout) { + if (!(state->hstdout = sam_open_z("-", mode, state))) { + print_error_errno("bam2fq", "Cannot open STDOUT"); + free(state); + return false; + } + set_sam_opts(state->hstdout, state, opts); + autoflush_if_stdout(state->hstdout, "-"); + } + state->fpr[i] = state->hstdout; + } + } + + // index 1, index 2 + for (i = 0; i < 2; i++) { + state->fpi[i] = NULL; + if (opts->index_file[i]) { + for (j = 0; j < 3; j++) + if (opts->fnr[j] && strcmp(opts->fnr[j], opts->index_file[i]) == 0) + break; + for (j -= 3; j >= 0 && j < i; j++) + if (opts->index_file[j] && strcmp(opts->index_file[j], opts->index_file[i]) == 0) + break; + if (i == j) { + if (!(state->fpi[i] = sam_open_z(opts->index_file[i], mode, + state))) { + print_error_errno("bam2fq", "Cannot open i%d file \"%s\"", + i+1, opts->index_file[i]); + free(state); + return false; + } + set_sam_opts(state->fpi[i], state, opts); + } else if (j < 0) { + state->fpi[i] = state->fpr[j+3]; + } else { + state->fpi[i] = state->fpi[j]; + } + } + } + + state->h = sam_hdr_read(state->fp); + if (state->h == NULL) { + fprintf(stderr, "Failed to read header for \"%s\"\n", opts->fn_input); + free(state); + return false; + } + + *state_out = state; + return true; +} + +static bool destroy_state(const bam2fq_opts_t *opts, bam2fq_state_t *state, int* status) +{ + bool valid = true; + sam_hdr_destroy(state->h); + check_sam_close("bam2fq", state->fp, opts->fn_input, "file", status); + if (state->fpse && sam_close(state->fpse) < 0) { + print_error_errno("bam2fq", "Error closing singleton file \"%s\"", opts->fnse); + valid = false; + } + + int i, j; + for (i = 0; i < 3; ++i) { + if (state->fpr[i] != state->hstdout) { + for (j = 0; j < i; j++) + if (state->fpr[i] == state->fpr[j]) + break; + if (j == i && sam_close(state->fpr[i])) { + print_error_errno("bam2fq", "Error closing r%d file \"%s\"", i, opts->fnr[i]); + valid = false; + } + } + } + if (state->hstdout) { + release_autoflush(state->hstdout); + if (sam_close(state->hstdout) < 0) { + print_error_errno("bam2fq", "Error closing STDOUT"); + valid = false; + } + } + for (i = 0; i < 2; i++) { + for (j = 0; j < 3; j++) + if (state->fpi[i] == state->fpr[j]) + break; + for (j -= 3; j >= 0 && j < i; j++) + if (state->fpi[i] == state->fpi[j]) + break; + if (j == i && state->fpi[i] && sam_close(state->fpi[i]) < 0) { + print_error_errno("bam2fq", "Error closing i%d file \"%s\"", i+1, opts->index_file[i]); + valid = false; + } + } + free(state->index_sequence); + if (state->p.pool) + hts_tpool_destroy(state->p.pool); + free(state); + return valid; +} + +static inline bool filter_it_out(const bam1_t *b, const bam2fq_state_t *state) +{ + return ((b->core.flag&(state->flag_on)) != state->flag_on // or reads indicated by filter flags + || (b->core.flag&(state->flag_off)) != 0 + || (b->core.flag&(state->flag_alloff) && (b->core.flag&(state->flag_alloff)) == state->flag_alloff)); + +} + +int write_index_rec(samFile *fp, bam1_t *b, bam2fq_state_t *state, + bam2fq_opts_t* opts, char *seq, int seq_len, + char *qual, int qual_len) { + if (!fp || !b || !seq_len) + return 0; + + int ret = -1; + bam1_t *b2 = bam_init1(); // FIXME: reuse + if (!b2) + return -1; + + size_t aux_len = b->data + b->l_data - bam_get_aux(b); + if (bam_set1(b2, b->core.l_qname, bam_get_qname(b), + (b->core.flag | BAM_FUNMAP) & ~BAM_FREVERSE, + -1, -1, 0, // refid, pos, mapq + 0, NULL, // cigar + -1, -1, 0, // rnext, pnext, tlen + seq_len, seq, qual, + aux_len) < 0) + goto err; + + uint8_t *q = bam_get_qual(b2); + if (qual) { + int i; + for (i = 0; i < seq_len; i++) + q[i] -= '!'; + } else { + memset(q, opts->def_qual, seq_len); + } + + memcpy(bam_get_aux(b2), bam_get_aux(b), aux_len); + b2->l_data += aux_len; + if (sam_write1(fp, state->h, b2) < 0) + goto err; + + ret = 0; + err: + if (b2) + bam_destroy1(b2); + return ret; +} + +int output_index(bam1_t *b1, bam1_t *b2, bam2fq_state_t *state, + bam2fq_opts_t* opts) { + bam1_t *b = b1 ? b1 : b2; + + char *ifmt = opts->index_format; + if (!ifmt) + ifmt = "i*i*"; + + // Get seq / qual elements + char *bc = NULL, *qt = NULL; + if (b1) + bc = (char *)bam_aux_get(b1, opts->barcode_tag); + if (b2 && !bc) + bc = (char *)bam_aux_get(b2, opts->barcode_tag); + if (!bc) + return 0; + else + bc++; // skip Z + + if (b1) + qt = (char *)bam_aux_get(b1, opts->quality_tag); + if (b2 && !qt) + qt = (char *)bam_aux_get(b2, opts->quality_tag); + if (qt && strlen(bc) != strlen(qt)-1) + qt = NULL; + else if (qt) + qt++; + + int inum = 0; + while (inum < 2) { + char fc = *ifmt++; + if (!fc) + break; // ran out of index-format + + long len, rem = 0; + if (isdigit(*ifmt)) { + rem = len = strtol(ifmt, &ifmt, 10); + } else { + ifmt++; + len = 0; + } + + char *bc_end = bc, *qt_end = qt; + while (len ? *bc_end && rem-- : isalpha(*bc_end)) + bc_end++, qt_end += qt != NULL; + + switch (fc) { + case 'n': + // skip + bc = bc_end + (len==0); + if (qt) + qt = qt_end + (len==0); + break; + + case 'i': + if (write_index_rec(state->fpi[inum], b, state, opts, + bc, bc_end-bc, qt, qt_end-qt) < 0) + return -1; + bc = bc_end + (len==0); + if (qt) + qt = qt_end + (len==0); + inum++; + break; + + default: + fprintf(stderr, "Unknown index-format code\n"); + return -1; + } + } + + return 0; +} + +static int flush_rec(bam2fq_state_t *state, bam2fq_opts_t* opts, + bam1_t *b[4], int score[3], int best[3], + int64_t *n_singletons) { + // Paired data, with 1 or 2 ends present. + if (score[1] > 0 && score[2] > 0) { + // If CASAVA tag is required and barcode is only on R1, + // copy it to R2 + if (state->illumina_tag) { + char *tag; + if ((tag = (char *)bam_aux_get(b[best[1]], + opts->barcode_tag))) + if (bam_aux_update_str(b[best[2]], + opts->barcode_tag, + strlen(tag), tag+1) < 0) + goto err; + if ((tag = (char *)bam_aux_get(b[best[1]], + opts->quality_tag))) + if (bam_aux_update_str(b[best[2]], + opts->quality_tag, + strlen(tag), tag+1) < 0) + goto err; + + } + if (sam_write1(state->fpr[1], state->h, b[best[1]]) < 0) + goto err; + if (sam_write1(state->fpr[2], state->h, b[best[2]]) < 0) + goto err; + + if (output_index(b[best[1]], b[best[2]], state, opts) < 0) + goto err; + } else if (score[1] > 0 || score[2] > 0) { + if (state->fpse) { + // print whichever one exists to fpse + if (score[1] > 0) { + if (sam_write1(state->fpse, state->h, b[best[1]]) < 0) + goto err; + } else { + if (sam_write1(state->fpse, state->h, b[best[2]]) < 0) + goto err; + } + ++(*n_singletons); + } else { + if (score[1] > 0) { + if (sam_write1(state->fpr[1], state->h, b[best[1]]) < 0) + goto err; + } else { + if (sam_write1(state->fpr[2], state->h, b[best[2]]) < 0) + goto err; + } + } + + if (output_index(score[1] > 0 ? b[best[1]] : NULL, + score[2] > 0 ? b[best[2]] : NULL, + state, opts) < 0) + goto err; + } + + if (score[0]) { // single ended data (neither READ1 nor READ2) + if (sam_write1(state->fpr[0], state->h, b[best[0]]) < 0) + goto err; + + if (output_index(b[best[0]], NULL, state, opts) < 0) + goto err; + } + + return 0; + + err: + return -1; +} + +static bool bam2fq_mainloop(bam2fq_state_t *state, bam2fq_opts_t* opts) +{ + int n; + char *current_qname = NULL; + int64_t n_reads = 0, n_singletons = 0; // Statistics + int score[3]; + int at_eof; + bool valid = false; + int best[3] = {-1, -1, -1}; // map R0, R1, single to b[] indices; + // indexed by [readpart] + bam1_t *b[4]; // 3 readparts, plus current record + + for (n = 0; n < 4; n++) { + if (!(b[n] = bam_init1())) { + perror("[bam2fq_mainloop] Malloc error for bam record buffer."); + return false; + } + } + + n = 0; + while (true) { + int res = sam_read1(state->fp, state->h, b[n]); + if (res < -1) { + print_error("bam2fq", "Failed to read bam record"); + goto err; + } + at_eof = res < 0; + + if (!at_eof && filter_it_out(b[n], state)) + continue; + if (!at_eof) { + ++n_reads; + + // Handle -O option: use OQ for qual + uint8_t *oq; + if (state->use_oq && (oq = bam_aux_get(b[n],"OQ")) && *oq == 'Z') { + int i, l = strlen((char *)++oq); + uint8_t *qual = bam_get_qual(b[n]); + for (i = 0; i < l && i < b[n]->core.l_qseq; i++) + qual[i] = oq[i] - '!'; + } + } + + if (at_eof + || !current_qname + || (strcmp(current_qname, bam_get_qname(b[n])) != 0)) { + // New name, so flush best examples of previous name. + if (current_qname) + if (flush_rec(state, opts, b, score, best, &n_singletons) < 0) + goto err; + + current_qname = bam_get_qname(b[n]); + score[0] = score[1] = score[2] = 0; + + if (at_eof) { break; } + } + + // Prefer a copy of the read that has base qualities + int b_score = bam_get_qual(b[n])[0] != 0xff? 2 : 1; + readpart rp = which_readpart(b[n]); + if (score[rp] < b_score) { + score[rp] = b_score; + // Record b[n] slot for best copy of readpair and find a new + // slot for next bam read + best[rp] = n; + int used_slot[4] = {0}, i; + for (i = 0; i < 3; i++) + if (best[i] >= 0) + used_slot[best[i]] = 1; + for (i = 0; i < 4 && used_slot[i]; i++) + ; + n = i; + } + } + + valid = true; + err: + if (!valid) + print_error_errno("bam2fq", "Error writing to FASTx files."); + + for (n = 0; n < 4; n++) + bam_destroy1(b[n]); + + fprintf(stderr, "[M::%s] discarded %" PRId64 " singletons\n", + __func__, n_singletons); + fprintf(stderr, "[M::%s] processed %" PRId64 " reads\n", + __func__, n_reads); + + return valid; +} + +int main_bam2fq(int argc, char *argv[]) +{ + int status = EXIT_FAILURE; + bam2fq_opts_t* opts = NULL; + bam2fq_state_t* state = NULL; + + bool valid = parse_opts(argc, argv, &opts); + if (!valid || opts == NULL) return valid ? EXIT_SUCCESS : EXIT_FAILURE; + + if (!init_state(opts, &state)) goto err; + + if (!bam2fq_mainloop(state,opts)) goto err; + + if (!destroy_state(opts, state, &status)) goto err; + + status = EXIT_SUCCESS; + err: + sam_global_args_free(&opts->ga); + free_opts(opts); + + return status; +} diff --git a/samtools/bam_fastq.c.pysam.c b/samtools/bam_fastq.c.pysam.c new file mode 100644 index 0000000..fbe65fb --- /dev/null +++ b/samtools/bam_fastq.c.pysam.c @@ -0,0 +1,887 @@ +#include "samtools.pysam.h" + +/* bam_fastq.c -- FASTA and FASTQ file generation + + Copyright (C) 2009-2017, 2019-2020 Genome Research Ltd. + Portions copyright (C) 2009, 2011, 2012 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "htslib/sam.h" +#include "htslib/klist.h" +#include "htslib/kstring.h" +#include "htslib/bgzf.h" +#include "htslib/thread_pool.h" +#include "samtools.h" +#include "sam_opts.h" + +#define DEFAULT_BARCODE_TAG "BC" +#define DEFAULT_QUALITY_TAG "QT" +#define INDEX_SEPARATOR "+" + +int8_t seq_comp_table[16] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }; +static void bam2fq_usage(FILE *to, const char *command) +{ + int fq = strcasecmp("fastq", command) == 0 || strcasecmp("bam2fq", command) == 0; + fprintf(to, +"Usage: samtools %s [options...] \n", command); + fprintf(to, +"\n" +"Description:\n" +"Converts a SAM, BAM or CRAM to %s format.\n" +"\n" +"Options:\n" +" -0 FILE write reads designated READ_OTHER to FILE\n" +" -1 FILE write reads designated READ1 to FILE\n" +" -2 FILE write reads designated READ2 to FILE\n" +" -o FILE write reads designated READ1 or READ2 to FILE\n" +" note: if a singleton file is specified with -s, only\n" +" paired reads will be written to the -1 and -2 files.\n" +" -f INT only include reads with all of the FLAGs in INT present [0]\n" // F&x == x +" -F INT only include reads with none of the FLAGS in INT present [0x900]\n" // F&x == 0 +" -G INT only EXCLUDE reads with all of the FLAGs in INT present [0]\n" // !(F&x == x) +" -n don't append /1 and /2 to the read name\n" +" -N always append /1 and /2 to the read name\n", + fq ? "FASTQ" : "FASTA"); + if (fq) fprintf(to, +" -O output quality in the OQ tag if present\n"); + fprintf(to, +" -s FILE write singleton reads designated READ1 or READ2 to FILE\n" +" -t copy RG, BC and QT tags to the %s header line\n", + fq ? "FASTQ" : "FASTA"); + fprintf(to, +" -T TAGLIST copy arbitrary tags to the %s header line, '*' for all\n", + fq ? "FASTQ" : "FASTA"); + if (fq) fprintf(to, +" -v INT default quality score if not given in file [1]\n" +" -i add Illumina Casava 1.8 format entry to header (eg 1:N:0:ATCACG)\n" +" -c INT compression level [0..9] to use when writing bgzf files [1]\n" +" --i1 FILE write first index reads to FILE\n" +" --i2 FILE write second index reads to FILE\n" +" --barcode-tag TAG\n" +" Barcode tag [" DEFAULT_BARCODE_TAG "]\n" +" --quality-tag TAG\n" +" Quality tag [" DEFAULT_QUALITY_TAG "]\n" +" --index-format STR\n" +" How to parse barcode and quality tags\n\n"); + sam_global_opt_help(to, "-.--.@-."); + fprintf(to, +"\n" +"The files will be automatically compressed if the file names have a .gz\n" +"or .bgzf extension. The input to this program must be collated by name.\n" +"Run 'samtools collate' or 'samtools sort -n' to achieve this.\n" +"\n" +"Reads are designated READ1 if FLAG READ1 is set and READ2 is not set.\n" +"Reads are designated READ2 if FLAG READ1 is not set and READ2 is set.\n" +"Otherwise reads are designated READ_OTHER (both flags set or both flags unset).\n" +"Run 'samtools flags' for more information on flag codes and meanings.\n"); + fprintf(to, +"\n" +"The index-format string describes how to parse the barcode and quality tags.\n" +"It is made up of 'i' or 'n' followed by a length or '*'. For example:\n" +" i14i8 The first 14 characters are index 1, the next 8 are index 2\n" +" n8i14 Ignore the first 8 characters, and use the next 14 for index 1\n\n" +"If the tag contains a separator, then the numeric part can be replaced with\n" +"'*' to mean 'read until the separator or end of tag', for example:\n" +" i*i* Break the tag at the separator into index 1 and index 2\n" +" n*i* Ignore the left part of the tag until the separator,\n" +" then use the second part of the tag as index 1\n"); + fprintf(to, +"\n" +"Examples:\n" +"To get just the paired reads in separate files, use:\n" +" samtools %s -1 pair1.%s -2 pair2.%s -0 /dev/null -s /dev/null -n in.bam\n" +"\nTo get all non-supplementary/secondary reads in a single file, redirect\n" +"the output:\n" +" samtools %s in.bam > all_reads.%s\n", + command, fq ? "fq" : "fa", fq ? "fq" : "fa", + command, fq ? "fq" : "fa"); +} + +typedef enum { READ_UNKNOWN = 0, READ_1 = 1, READ_2 = 2 } readpart; +typedef enum { FASTA, FASTQ } fastfile; +typedef struct bam2fq_opts { + char *fnse; + char *fnr[3]; + char *fn_input; // pointer to input filename in argv do not free + bool has12, has12always, use_oq, copy_tags, illumina_tag; + int flag_on, flag_off, flag_alloff; + sam_global_args ga; + fastfile filetype; + int def_qual; + char *barcode_tag; + char *quality_tag; + char *index_file[2]; + char *index_format; + char *extra_tags; + char compression_level; +} bam2fq_opts_t; + +typedef struct bam2fq_state { + samFile *fp; + samFile *fpse; + samFile *fpr[3]; + samFile *fpi[3]; + samFile *hstdout; + sam_hdr_t *h; + bool has12, use_oq, copy_tags, illumina_tag; + int flag_on, flag_off, flag_alloff; + fastfile filetype; + int def_qual; + char *index_sequence; + char compression_level; + htsThreadPool p; +} bam2fq_state_t; + +static readpart which_readpart(const bam1_t *b) +{ + if ((b->core.flag & BAM_FREAD1) && !(b->core.flag & BAM_FREAD2)) { + return READ_1; + } else if ((b->core.flag & BAM_FREAD2) && !(b->core.flag & BAM_FREAD1)) { + return READ_2; + } else { + return READ_UNKNOWN; + } +} + +static void free_opts(bam2fq_opts_t *opts) +{ + free(opts); +} + +// return true if valid +static bool parse_opts(int argc, char *argv[], bam2fq_opts_t** opts_out) +{ + // Parse args + bam2fq_opts_t* opts = calloc(1, sizeof(bam2fq_opts_t)); + opts->has12 = true; + opts->has12always = false; + opts->filetype = FASTQ; + opts->def_qual = 1; + opts->barcode_tag = NULL; + opts->quality_tag = NULL; + opts->index_format = NULL; + opts->index_file[0] = NULL; + opts->index_file[1] = NULL; + opts->extra_tags = NULL; + opts->compression_level = 1; + opts->flag_off = BAM_FSECONDARY|BAM_FSUPPLEMENTARY; + int flag_off_set = 0; + + int c; + sam_global_args_init(&opts->ga); + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '@'), + {"i1", required_argument, NULL, 1}, + {"I1", required_argument, NULL, 1}, + {"i2", required_argument, NULL, 2}, + {"I2", required_argument, NULL, 2}, + {"if", required_argument, NULL, 3}, + {"IF", required_argument, NULL, 3}, + {"index-format", required_argument, NULL, 3}, + {"barcode-tag", required_argument, NULL, 'b'}, + {"quality-tag", required_argument, NULL, 'q'}, + { NULL, 0, NULL, 0 } + }; + while ((c = getopt_long(argc, argv, "0:1:2:o:f:F:G:niNOs:c:tT:v:@:", + lopts, NULL)) > 0) { + switch (c) { + case 'b': opts->barcode_tag = optarg; break; + case 'q': opts->quality_tag = optarg; break; + case 1 : opts->index_file[0] = optarg; break; + case 2 : opts->index_file[1] = optarg; break; + case 3 : opts->index_format = optarg; break; + case '0': opts->fnr[0] = optarg; break; + case '1': opts->fnr[1] = optarg; break; + case '2': opts->fnr[2] = optarg; break; + case 'o': opts->fnr[1] = optarg; opts->fnr[2] = optarg; break; + case 'f': opts->flag_on |= strtol(optarg, 0, 0); break; + case 'F': + if (!flag_off_set) { + flag_off_set = 1; + opts->flag_off = 0; + } + opts->flag_off |= strtol(optarg, 0, 0); + break; + case 'G': opts->flag_alloff |= strtol(optarg, 0, 0); break; + case 'n': opts->has12 = false; break; + case 'N': opts->has12always = true; break; + case 'O': opts->use_oq = true; break; + case 's': opts->fnse = optarg; break; + case 't': opts->copy_tags = true; break; + case 'i': opts->illumina_tag = true; break; + case 'c': + opts->compression_level = atoi(optarg); + if (opts->compression_level < 0) + opts->compression_level = 0; + if (opts->compression_level > 9) + opts->compression_level = 9; + break; + case 'T': opts->extra_tags = optarg; break; + case 'v': opts->def_qual = atoi(optarg); break; + + case '?': + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + default: + if (parse_sam_global_opt(c, optarg, lopts, &opts->ga) != 0) { + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + } + break; + } + } + + if (opts->fnr[1] || opts->fnr[2]) opts->has12 = false; + if (opts->has12always) opts->has12 = true; + + if (!opts->barcode_tag) opts->barcode_tag = DEFAULT_BARCODE_TAG; + if (!opts->quality_tag) opts->quality_tag = DEFAULT_QUALITY_TAG; + + int nIndex = 0; + if (opts->index_format) { + char *s; + for (s = opts->index_format; *s; s++) { + if (*s == 'i') nIndex++; + } + } + if (nIndex>2) { + fprintf(samtools_stderr,"Invalid index format: more than 2 indexes\n"); + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + } + + if (opts->index_file[1] && !opts->index_file[0]) { + fprintf(samtools_stderr, "Index one specified, but index two not given\n"); + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + } + + if (opts->illumina_tag && !nIndex) { + fprintf(samtools_stderr, "You must specify an index format (--index-format) with the Illumina Casava (-i) option\n"); + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + } + + if (nIndex==0 && opts->index_file[0]) { + fprintf(samtools_stderr, "index_format not specified, but index file given\n"); + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + } + + if (opts->def_qual < 0 || 93 < opts->def_qual) { + fprintf(samtools_stderr, "Invalid -v default quality %i, allowed range 0 to 93\n", opts->def_qual); + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + } + + const char* type_str = argv[0]; + if (strcasecmp("fastq", type_str) == 0 || + strcasecmp("bam2fq", type_str) == 0) { + opts->filetype = FASTQ; + } else if (strcasecmp("fasta", type_str) == 0) { + opts->filetype = FASTA; + } else { + print_error("bam2fq", "Unrecognised type call \"%s\", this should be impossible... but you managed it!", type_str); + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + } + + if (argc == optind && isatty(STDIN_FILENO)) { + bam2fq_usage(samtools_stdout, argv[0]); + free_opts(opts); + return true; + } + + if (argc - optind > 1) { + fprintf(samtools_stderr, "Too many arguments.\n"); + bam2fq_usage(samtools_stderr, argv[0]); + free_opts(opts); + return false; + } + opts->fn_input = argc > optind ? argv[optind] : "-"; + *opts_out = opts; + return true; +} + +void set_sam_opts(samFile *fp, bam2fq_state_t *state, + const bam2fq_opts_t *opts) { + if (state->has12) + hts_set_opt(fp, FASTQ_OPT_RNUM, 1); + + if (state->illumina_tag) + hts_set_opt(fp, FASTQ_OPT_CASAVA, 1); + + hts_set_opt(fp, FASTQ_OPT_BARCODE, opts->barcode_tag); + + if (opts->extra_tags && (*opts->extra_tags == '*' || *opts->extra_tags == '\0')) + hts_set_opt(fp, FASTQ_OPT_AUX, NULL); + else { + kstring_t tag_list = {0,0}; + if (state->copy_tags) + kputs("RG,BC,QT", &tag_list); + if (opts->extra_tags) { + if (tag_list.l) + kputc(',', &tag_list); + kputs(opts->extra_tags, &tag_list); + } + if (tag_list.l) + hts_set_opt(fp, FASTQ_OPT_AUX, tag_list.s); + ks_free(&tag_list); + } +} + +// Open a file as normal or gzipped based on filename. +// Note we always use bgzf and don't bother to attempt non-blocked +// gzip streams. This is a departure from the old fastq code. +static samFile *sam_open_z(char *fn, char *mode, bam2fq_state_t *state) { + char modez[6]; + strcpy(modez, mode); + + size_t l = strlen(fn); + if ((l > 3 && strcmp(fn+l-3, ".gz") == 0) || + (l > 4 && strcmp(fn+l-4, ".bgz") == 0) || + (l > 5 && strcmp(fn+l-5, ".bgzf") == 0)) { + char m[3] = {'z', state->compression_level+'0', '\0'}; + strcat(modez, m); + } + + samFile *fp = sam_open(fn, modez); + if (!fp) + return NULL; + + if (state->p.pool) + hts_set_thread_pool(fp, &state->p); + + return fp; +} + +static bool init_state(const bam2fq_opts_t* opts, bam2fq_state_t** state_out) +{ + char *mode = opts->filetype == FASTA ? "wF" : "wf"; + + bam2fq_state_t* state = calloc(1, sizeof(bam2fq_state_t)); + if (!state) + return false; + state->flag_on = opts->flag_on; + state->flag_off = opts->flag_off; + state->flag_alloff = opts->flag_alloff; + state->has12 = opts->has12; + state->use_oq = opts->use_oq; + state->illumina_tag = opts->illumina_tag; + state->copy_tags = opts->copy_tags; + state->filetype = opts->filetype; + state->def_qual = opts->def_qual; + state->index_sequence = NULL; + state->hstdout = NULL; + state->compression_level = opts->compression_level; + + state->fp = sam_open(opts->fn_input, "r"); + if (state->fp == NULL) { + print_error_errno("bam2fq","Cannot read file \"%s\"", opts->fn_input); + free(state); + return false; + } + + state->p.pool = NULL; + if (opts->ga.nthreads > 0) { + if (!(state->p.pool = hts_tpool_init(opts->ga.nthreads))) { + fprintf(samtools_stderr, "Failed to create thread pool\n"); + free(state); + return false; + } + state->p.qsize = opts->ga.nthreads*2; + hts_set_thread_pool(state->fp, &state->p); + } + + uint32_t rf = SAM_QNAME | SAM_FLAG | SAM_SEQ | SAM_QUAL; + if (opts->use_oq || opts->extra_tags || opts->index_file[0]) rf |= SAM_AUX; + if (hts_set_opt(state->fp, CRAM_OPT_REQUIRED_FIELDS, rf)) { + fprintf(samtools_stderr, "Failed to set CRAM_OPT_REQUIRED_FIELDS value\n"); + free(state); + return false; + } + if (hts_set_opt(state->fp, CRAM_OPT_DECODE_MD, 0)) { + fprintf(samtools_stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + free(state); + return false; + } + if (opts->fnse) { + if (!(state->fpse = sam_open_z(opts->fnse, mode, state))) { + print_error_errno("bam2fq", "Cannot open singleton file \"%s\"", opts->fnse); + free(state); + return false; + } + set_sam_opts(state->fpse, state, opts); + } + + if (opts->ga.reference) { + if (hts_set_fai_filename(state->fp, opts->ga.reference) != 0) { + print_error_errno("bam2fq", "cannot load reference \"%s\"", opts->ga.reference); + free(state); + return false; + } + } + + // single, read1, read2 + int i, j; + for (i = 0; i < 3; ++i) { + if (opts->fnr[i]) { + for (j = 0; j < i; j++) + if (opts->fnr[j] && strcmp(opts->fnr[j], opts->fnr[i]) == 0) + break; + if (j == i) { + if (!(state->fpr[i] = sam_open_z(opts->fnr[i], mode, state))) { + print_error_errno("bam2fq", "Cannot open r%d file \"%s\"", + i, opts->fnr[i]); + free(state); + return false; + } + set_sam_opts(state->fpr[i], state, opts); + } else { + state->fpr[i] = state->fpr[j]; + } + } else { + if (!state->hstdout) { + if (!(state->hstdout = sam_open_z("-", mode, state))) { + print_error_errno("bam2fq", "Cannot open STDOUT"); + free(state); + return false; + } + set_sam_opts(state->hstdout, state, opts); + autoflush_if_stdout(state->hstdout, "-"); + } + state->fpr[i] = state->hstdout; + } + } + + // index 1, index 2 + for (i = 0; i < 2; i++) { + state->fpi[i] = NULL; + if (opts->index_file[i]) { + for (j = 0; j < 3; j++) + if (opts->fnr[j] && strcmp(opts->fnr[j], opts->index_file[i]) == 0) + break; + for (j -= 3; j >= 0 && j < i; j++) + if (opts->index_file[j] && strcmp(opts->index_file[j], opts->index_file[i]) == 0) + break; + if (i == j) { + if (!(state->fpi[i] = sam_open_z(opts->index_file[i], mode, + state))) { + print_error_errno("bam2fq", "Cannot open i%d file \"%s\"", + i+1, opts->index_file[i]); + free(state); + return false; + } + set_sam_opts(state->fpi[i], state, opts); + } else if (j < 0) { + state->fpi[i] = state->fpr[j+3]; + } else { + state->fpi[i] = state->fpi[j]; + } + } + } + + state->h = sam_hdr_read(state->fp); + if (state->h == NULL) { + fprintf(samtools_stderr, "Failed to read header for \"%s\"\n", opts->fn_input); + free(state); + return false; + } + + *state_out = state; + return true; +} + +static bool destroy_state(const bam2fq_opts_t *opts, bam2fq_state_t *state, int* status) +{ + bool valid = true; + sam_hdr_destroy(state->h); + check_sam_close("bam2fq", state->fp, opts->fn_input, "file", status); + if (state->fpse && sam_close(state->fpse) < 0) { + print_error_errno("bam2fq", "Error closing singleton file \"%s\"", opts->fnse); + valid = false; + } + + int i, j; + for (i = 0; i < 3; ++i) { + if (state->fpr[i] != state->hstdout) { + for (j = 0; j < i; j++) + if (state->fpr[i] == state->fpr[j]) + break; + if (j == i && sam_close(state->fpr[i])) { + print_error_errno("bam2fq", "Error closing r%d file \"%s\"", i, opts->fnr[i]); + valid = false; + } + } + } + if (state->hstdout) { + release_autoflush(state->hstdout); + if (sam_close(state->hstdout) < 0) { + print_error_errno("bam2fq", "Error closing STDOUT"); + valid = false; + } + } + for (i = 0; i < 2; i++) { + for (j = 0; j < 3; j++) + if (state->fpi[i] == state->fpr[j]) + break; + for (j -= 3; j >= 0 && j < i; j++) + if (state->fpi[i] == state->fpi[j]) + break; + if (j == i && state->fpi[i] && sam_close(state->fpi[i]) < 0) { + print_error_errno("bam2fq", "Error closing i%d file \"%s\"", i+1, opts->index_file[i]); + valid = false; + } + } + free(state->index_sequence); + if (state->p.pool) + hts_tpool_destroy(state->p.pool); + free(state); + return valid; +} + +static inline bool filter_it_out(const bam1_t *b, const bam2fq_state_t *state) +{ + return ((b->core.flag&(state->flag_on)) != state->flag_on // or reads indicated by filter flags + || (b->core.flag&(state->flag_off)) != 0 + || (b->core.flag&(state->flag_alloff) && (b->core.flag&(state->flag_alloff)) == state->flag_alloff)); + +} + +int write_index_rec(samFile *fp, bam1_t *b, bam2fq_state_t *state, + bam2fq_opts_t* opts, char *seq, int seq_len, + char *qual, int qual_len) { + if (!fp || !b || !seq_len) + return 0; + + int ret = -1; + bam1_t *b2 = bam_init1(); // FIXME: reuse + if (!b2) + return -1; + + size_t aux_len = b->data + b->l_data - bam_get_aux(b); + if (bam_set1(b2, b->core.l_qname, bam_get_qname(b), + (b->core.flag | BAM_FUNMAP) & ~BAM_FREVERSE, + -1, -1, 0, // refid, pos, mapq + 0, NULL, // cigar + -1, -1, 0, // rnext, pnext, tlen + seq_len, seq, qual, + aux_len) < 0) + goto err; + + uint8_t *q = bam_get_qual(b2); + if (qual) { + int i; + for (i = 0; i < seq_len; i++) + q[i] -= '!'; + } else { + memset(q, opts->def_qual, seq_len); + } + + memcpy(bam_get_aux(b2), bam_get_aux(b), aux_len); + b2->l_data += aux_len; + if (sam_write1(fp, state->h, b2) < 0) + goto err; + + ret = 0; + err: + if (b2) + bam_destroy1(b2); + return ret; +} + +int output_index(bam1_t *b1, bam1_t *b2, bam2fq_state_t *state, + bam2fq_opts_t* opts) { + bam1_t *b = b1 ? b1 : b2; + + char *ifmt = opts->index_format; + if (!ifmt) + ifmt = "i*i*"; + + // Get seq / qual elements + char *bc = NULL, *qt = NULL; + if (b1) + bc = (char *)bam_aux_get(b1, opts->barcode_tag); + if (b2 && !bc) + bc = (char *)bam_aux_get(b2, opts->barcode_tag); + if (!bc) + return 0; + else + bc++; // skip Z + + if (b1) + qt = (char *)bam_aux_get(b1, opts->quality_tag); + if (b2 && !qt) + qt = (char *)bam_aux_get(b2, opts->quality_tag); + if (qt && strlen(bc) != strlen(qt)-1) + qt = NULL; + else if (qt) + qt++; + + int inum = 0; + while (inum < 2) { + char fc = *ifmt++; + if (!fc) + break; // ran out of index-format + + long len, rem = 0; + if (isdigit(*ifmt)) { + rem = len = strtol(ifmt, &ifmt, 10); + } else { + ifmt++; + len = 0; + } + + char *bc_end = bc, *qt_end = qt; + while (len ? *bc_end && rem-- : isalpha(*bc_end)) + bc_end++, qt_end += qt != NULL; + + switch (fc) { + case 'n': + // skip + bc = bc_end + (len==0); + if (qt) + qt = qt_end + (len==0); + break; + + case 'i': + if (write_index_rec(state->fpi[inum], b, state, opts, + bc, bc_end-bc, qt, qt_end-qt) < 0) + return -1; + bc = bc_end + (len==0); + if (qt) + qt = qt_end + (len==0); + inum++; + break; + + default: + fprintf(samtools_stderr, "Unknown index-format code\n"); + return -1; + } + } + + return 0; +} + +static int flush_rec(bam2fq_state_t *state, bam2fq_opts_t* opts, + bam1_t *b[4], int score[3], int best[3], + int64_t *n_singletons) { + // Paired data, with 1 or 2 ends present. + if (score[1] > 0 && score[2] > 0) { + // If CASAVA tag is required and barcode is only on R1, + // copy it to R2 + if (state->illumina_tag) { + char *tag; + if ((tag = (char *)bam_aux_get(b[best[1]], + opts->barcode_tag))) + if (bam_aux_update_str(b[best[2]], + opts->barcode_tag, + strlen(tag), tag+1) < 0) + goto err; + if ((tag = (char *)bam_aux_get(b[best[1]], + opts->quality_tag))) + if (bam_aux_update_str(b[best[2]], + opts->quality_tag, + strlen(tag), tag+1) < 0) + goto err; + + } + if (sam_write1(state->fpr[1], state->h, b[best[1]]) < 0) + goto err; + if (sam_write1(state->fpr[2], state->h, b[best[2]]) < 0) + goto err; + + if (output_index(b[best[1]], b[best[2]], state, opts) < 0) + goto err; + } else if (score[1] > 0 || score[2] > 0) { + if (state->fpse) { + // print whichever one exists to fpse + if (score[1] > 0) { + if (sam_write1(state->fpse, state->h, b[best[1]]) < 0) + goto err; + } else { + if (sam_write1(state->fpse, state->h, b[best[2]]) < 0) + goto err; + } + ++(*n_singletons); + } else { + if (score[1] > 0) { + if (sam_write1(state->fpr[1], state->h, b[best[1]]) < 0) + goto err; + } else { + if (sam_write1(state->fpr[2], state->h, b[best[2]]) < 0) + goto err; + } + } + + if (output_index(score[1] > 0 ? b[best[1]] : NULL, + score[2] > 0 ? b[best[2]] : NULL, + state, opts) < 0) + goto err; + } + + if (score[0]) { // single ended data (neither READ1 nor READ2) + if (sam_write1(state->fpr[0], state->h, b[best[0]]) < 0) + goto err; + + if (output_index(b[best[0]], NULL, state, opts) < 0) + goto err; + } + + return 0; + + err: + return -1; +} + +static bool bam2fq_mainloop(bam2fq_state_t *state, bam2fq_opts_t* opts) +{ + int n; + char *current_qname = NULL; + int64_t n_reads = 0, n_singletons = 0; // Statistics + int score[3]; + int at_eof; + bool valid = false; + int best[3] = {-1, -1, -1}; // map R0, R1, single to b[] indices; + // indexed by [readpart] + bam1_t *b[4]; // 3 readparts, plus current record + + for (n = 0; n < 4; n++) { + if (!(b[n] = bam_init1())) { + perror("[bam2fq_mainloop] Malloc error for bam record buffer."); + return false; + } + } + + n = 0; + while (true) { + int res = sam_read1(state->fp, state->h, b[n]); + if (res < -1) { + print_error("bam2fq", "Failed to read bam record"); + goto err; + } + at_eof = res < 0; + + if (!at_eof && filter_it_out(b[n], state)) + continue; + if (!at_eof) { + ++n_reads; + + // Handle -O option: use OQ for qual + uint8_t *oq; + if (state->use_oq && (oq = bam_aux_get(b[n],"OQ")) && *oq == 'Z') { + int i, l = strlen((char *)++oq); + uint8_t *qual = bam_get_qual(b[n]); + for (i = 0; i < l && i < b[n]->core.l_qseq; i++) + qual[i] = oq[i] - '!'; + } + } + + if (at_eof + || !current_qname + || (strcmp(current_qname, bam_get_qname(b[n])) != 0)) { + // New name, so flush best examples of previous name. + if (current_qname) + if (flush_rec(state, opts, b, score, best, &n_singletons) < 0) + goto err; + + current_qname = bam_get_qname(b[n]); + score[0] = score[1] = score[2] = 0; + + if (at_eof) { break; } + } + + // Prefer a copy of the read that has base qualities + int b_score = bam_get_qual(b[n])[0] != 0xff? 2 : 1; + readpart rp = which_readpart(b[n]); + if (score[rp] < b_score) { + score[rp] = b_score; + // Record b[n] slot for best copy of readpair and find a new + // slot for next bam read + best[rp] = n; + int used_slot[4] = {0}, i; + for (i = 0; i < 3; i++) + if (best[i] >= 0) + used_slot[best[i]] = 1; + for (i = 0; i < 4 && used_slot[i]; i++) + ; + n = i; + } + } + + valid = true; + err: + if (!valid) + print_error_errno("bam2fq", "Error writing to FASTx files."); + + for (n = 0; n < 4; n++) + bam_destroy1(b[n]); + + fprintf(samtools_stderr, "[M::%s] discarded %" PRId64 " singletons\n", + __func__, n_singletons); + fprintf(samtools_stderr, "[M::%s] processed %" PRId64 " reads\n", + __func__, n_reads); + + return valid; +} + +int main_bam2fq(int argc, char *argv[]) +{ + int status = EXIT_FAILURE; + bam2fq_opts_t* opts = NULL; + bam2fq_state_t* state = NULL; + + bool valid = parse_opts(argc, argv, &opts); + if (!valid || opts == NULL) return valid ? EXIT_SUCCESS : EXIT_FAILURE; + + if (!init_state(opts, &state)) goto err; + + if (!bam2fq_mainloop(state,opts)) goto err; + + if (!destroy_state(opts, state, &status)) goto err; + + status = EXIT_SUCCESS; + err: + sam_global_args_free(&opts->ga); + free_opts(opts); + + return status; +} diff --git a/samtools/bam_flags.c b/samtools/bam_flags.c new file mode 100644 index 0000000..78312ee --- /dev/null +++ b/samtools/bam_flags.c @@ -0,0 +1,86 @@ +/* bam_flags.c -- flags subcommand. + + Copyright (C) 2013-2014, 2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "samtools.h" + +static void usage(FILE *fp) +{ + static const struct { int bit; const char *desc; } *fl, flags[] = { + { BAM_FPAIRED, "paired-end / multiple-segment sequencing technology" }, + { BAM_FPROPER_PAIR, "each segment properly aligned according to aligner" }, + { BAM_FUNMAP, "segment unmapped" }, + { BAM_FMUNMAP, "next segment in the template unmapped" }, + { BAM_FREVERSE, "SEQ is reverse complemented" }, + { BAM_FMREVERSE, "SEQ of next segment in template is rev.complemented" }, + { BAM_FREAD1, "the first segment in the template" }, + { BAM_FREAD2, "the last segment in the template" }, + { BAM_FSECONDARY, "secondary alignment" }, + { BAM_FQCFAIL, "not passing quality controls or other filters" }, + { BAM_FDUP, "PCR or optical duplicate" }, + { BAM_FSUPPLEMENTARY, "supplementary alignment" }, + { 0, NULL } + }; + + fprintf(fp, +"About: Convert between textual and numeric flag representation\n" +"Usage: samtools flags FLAGS...\n" +"\n" +"Each FLAGS argument is either an INT (in decimal/hexadecimal/octal) representing\n" +"a combination of the following numeric flag values, or a comma-separated string\n" +"NAME,...,NAME representing a combination of the following flag names:\n" +"\n"); + for (fl = flags; fl->desc; fl++) { + char *name = bam_flag2str(fl->bit); + fprintf(fp, "%#6x %5d %-15s%s\n", fl->bit, fl->bit, name, fl->desc); + free(name); + } +} + + +int main_flags(int argc, char *argv[]) +{ + if ( argc < 2 ) { usage(stdout); return 0; } + + int i; + for (i = 1; i < argc; i++) + { + int mask = bam_str2flag(argv[i]); + if ( mask<0 ) { print_error("flags", "Could not parse \"%s\"", argv[i]); usage(stderr); return 1; } + char *str = bam_flag2str(mask); + printf("0x%x\t%d\t%s\n", mask, mask, str); + free(str); + } + return 0; +} + diff --git a/samtools/bam_flags.c.pysam.c b/samtools/bam_flags.c.pysam.c new file mode 100644 index 0000000..b3a9d29 --- /dev/null +++ b/samtools/bam_flags.c.pysam.c @@ -0,0 +1,88 @@ +#include "samtools.pysam.h" + +/* bam_flags.c -- flags subcommand. + + Copyright (C) 2013-2014, 2021 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "samtools.h" + +static void usage(FILE *fp) +{ + static const struct { int bit; const char *desc; } *fl, flags[] = { + { BAM_FPAIRED, "paired-end / multiple-segment sequencing technology" }, + { BAM_FPROPER_PAIR, "each segment properly aligned according to aligner" }, + { BAM_FUNMAP, "segment unmapped" }, + { BAM_FMUNMAP, "next segment in the template unmapped" }, + { BAM_FREVERSE, "SEQ is reverse complemented" }, + { BAM_FMREVERSE, "SEQ of next segment in template is rev.complemented" }, + { BAM_FREAD1, "the first segment in the template" }, + { BAM_FREAD2, "the last segment in the template" }, + { BAM_FSECONDARY, "secondary alignment" }, + { BAM_FQCFAIL, "not passing quality controls or other filters" }, + { BAM_FDUP, "PCR or optical duplicate" }, + { BAM_FSUPPLEMENTARY, "supplementary alignment" }, + { 0, NULL } + }; + + fprintf(fp, +"About: Convert between textual and numeric flag representation\n" +"Usage: samtools flags FLAGS...\n" +"\n" +"Each FLAGS argument is either an INT (in decimal/hexadecimal/octal) representing\n" +"a combination of the following numeric flag values, or a comma-separated string\n" +"NAME,...,NAME representing a combination of the following flag names:\n" +"\n"); + for (fl = flags; fl->desc; fl++) { + char *name = bam_flag2str(fl->bit); + fprintf(fp, "%#6x %5d %-15s%s\n", fl->bit, fl->bit, name, fl->desc); + free(name); + } +} + + +int main_flags(int argc, char *argv[]) +{ + if ( argc < 2 ) { usage(samtools_stdout); return 0; } + + int i; + for (i = 1; i < argc; i++) + { + int mask = bam_str2flag(argv[i]); + if ( mask<0 ) { print_error("flags", "Could not parse \"%s\"", argv[i]); usage(samtools_stderr); return 1; } + char *str = bam_flag2str(mask); + fprintf(samtools_stdout, "0x%x\t%d\t%s\n", mask, mask, str); + free(str); + } + return 0; +} + diff --git a/samtools/bam_import.c b/samtools/bam_import.c new file mode 100644 index 0000000..47cb125 --- /dev/null +++ b/samtools/bam_import.c @@ -0,0 +1,503 @@ +/* bam_import -- Import of FASTQ files. + * + * samtools import -1 a_1.fq -2 a_2.fq --i1 a_i1.fq --i2 a_i2.fq + * samtools import a_1.fq a_2.fq + * samtools import a_interleaved.fq + * + * Copyright (C) 2020 Genome Research Ltd. + * + * Author: James Bonfield + */ + +/* +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +// TODO: Store other non-aux comments; in new sam tag? + +#include +#include + +#include "htslib/sam.h" +#include "htslib/thread_pool.h" + +#include "samtools.h" +#include "sam_opts.h" + +static int usage(FILE *fp, int exit_status) { + fprintf(fp, "Usage: samtools import [options] [file.fastq ...]\n"); + fprintf(fp, "\n"); + fprintf(fp, "Options:\n"); + fprintf(fp, " -s FILE Read paired-ended data from single FILE\n"); + fprintf(fp, " -0 FILE Read single-ended data from FILE\n"); + fprintf(fp, " -1 FILE Read-1 from FILE\n"); + fprintf(fp, " -2 FILE Read-2 from FILE\n"); + fprintf(fp, " --i1 FILE Index-1 from FILE\n"); + fprintf(fp, " --i2 FILE Index-2 from FILE\n"); + fprintf(fp, " -i Parse CASAVA identifier\n"); + fprintf(fp, " --barcode-tag TAG\n"); + fprintf(fp, " Tag to use with barcode sequences [BC]\n"); + fprintf(fp, " --quality-tag TAG\n"); + fprintf(fp, " Tag to use with barcode qualities [QT]\n"); + fprintf(fp, " -N, --name2 Use 2nd field as read name (SRA format)\n"); + fprintf(fp, " -r STRING Build up a complete @RG line\n"); + fprintf(fp, " -R STRING Add a simple RG line of \"@RG\\tID:STRING\"\n"); + fprintf(fp, " -T TAGLIST Parse tags in SAM format; list of '*' for all\n"); + fprintf(fp, " -o FILE Output to FILE instead of stdout\n"); + fprintf(fp, " -u Uncompressed output\n"); + fprintf(fp, " --order TAG Store Nth record count in TAG\n"); + fprintf(fp, "\n"); + sam_global_opt_help(fp, "-.O.-@--"); + + fprintf(fp, "\nA single fastq file will be interpreted as -s, -0 or -1 depending on\n"); + fprintf(fp, "file contents, and a pair of fastq files as \"-1 FILE1 -2 FILE2\".\n"); + + return exit_status; +} + +// Order matters here as we want to read index elements before main +// sequences so on reading the seqs we can emit a fully annotated record. +enum fileno { + FQ_I1, FQ_I2, // index seqs for R1 and R2 + FQ_R0, // single file and unpaired data (singled-ended tech). + FQ_R1, FQ_R2, // separate read1 and read2 files + FQ_SINGLE, // single file, but with read1 and/or read2 present. + FQ_END +}; + +typedef struct { + sam_global_args ga; + int no_pg; + char *fn[FQ_END], *fn_out; + int idx_both; // add index to READ2 too, not just READ1 + int casava; + char *barcode_seq; + char *barcode_qual; + char *aux; + char *rg; + char *rg_line; + char *order; + int compress_level; + htsThreadPool p; + int name2; +} opts_t; + +// Append a sequence and quality string from a BAM record to a BC:Z and +// QT:Z style aux tag string. +static int append_index(kstring_t *s, kstring_t *q, bam1_t *b) { + char *sp, *qp; + if (ks_resize(s, s->l + b->core.l_qseq+1 +1) < 0) + return -1; + if (ks_resize(q, q->l + b->core.l_qseq+1 +1) < 0) + return -1; + + sp = s->s + s->l - (s->l > 0); + qp = q->s + q->l - (q->l > 0); + + if (s->l) + *sp++ = '-'; + + if (q->l) + *qp++ = ' '; + + int i; + uint8_t *seq = bam_get_seq(b); + uint8_t *qual = bam_get_qual(b); + for (i = 0; i < b->core.l_qseq; i++) { + *sp++ = seq_nt16_str[bam_seqi(seq, i)]; + *qp++ = qual[i] + '!'; + } + *sp++ = 0; + *qp++ = 0; + + s->l = sp - s->s; + q->l = qp - q->s; + + return 0; +} + +static int import_fastq(int argc, char **argv, opts_t *opts) { + int i, n, ret = 0; + samFile *fp_in[FQ_END] = {NULL}; + bam1_t *b = bam_init1(); + int ids[FQ_END]; + samFile *fp_out = NULL; + sam_hdr_t *hdr_out = NULL; + kstring_t index_str = {0,0}; + kstring_t read_str = {0,0}; + char *rg = opts->rg; + kstring_t rg_line = {0,0}; + uint64_t read_num = 0; + kstring_t idx_seq = {0}; + kstring_t idx_qual = {0}; + + // Any additional arguments are assumed to be r1 r2, as a + // short cut. We support reading index tags out of those too (eg + // Illumina CASAVA format), but if we do that we lack the barcode + // quality string. + // + // We also consider a read name ending in /1 or /2 to be a single + // file containing interleaved fastq records for both ends. + // These will be labeled as fn[FQ_R1] but adjusted during reading. + if (argc == 1) + opts->fn[FQ_SINGLE] = argv[0]; + else + for (i = 0; i < 4; i++) + if (argc > i) + opts->fn[FQ_R1+i] = argv[i]; + + // Open all files + for (i = n = 0; i < FQ_END; i++) { + if (!opts->fn[i]) + continue; + fp_in[i] = sam_open_format(opts->fn[i], "r", &opts->ga.in); + if (!fp_in[i]) { + perror(opts->fn[i]); + ret = -1; + goto err; + } + if (opts->p.pool) + hts_set_thread_pool(fp_in[i], &opts->p); + ids[n++] = i; + + if (opts->name2) + hts_set_opt(fp_in[i], FASTQ_OPT_NAME2, 1); + if (opts->casava) + hts_set_opt(fp_in[i], FASTQ_OPT_CASAVA, 1); + if (opts->barcode_seq) // for auto-CASAVA parsing + hts_set_opt(fp_in[i], FASTQ_OPT_BARCODE, opts->barcode_seq); + if (opts->aux) + hts_set_opt(fp_in[i], FASTQ_OPT_AUX, + *opts->aux == '*' || *opts->aux == '\0' + ? NULL : opts->aux); + + switch (i) { + case FQ_I1: + kputs("--i1 I1.fastq ", &read_str); + kputs("i*", &index_str); + break; + case FQ_I2: + kputs("--i2 I2.fastq ", &read_str); + kputs("i*", &index_str); + break; + + case FQ_R0: + kputs("-0 unpaired.fastq ", &read_str); + break; + + case FQ_R1: + kputs("-1 R1.fastq ", &read_str); + break; + + case FQ_R2: + kputs("-2 R2.fastq ", &read_str); + break; + + case FQ_SINGLE: + kputs("-N -o paired.fastq ", &read_str); + break; + + default: + ks_clear(&read_str); // not reversible + kputs("", &read_str); + } + } + if (n == 0) { + bam_destroy1(b); + return usage(stdout, EXIT_SUCCESS); + } + + char out_mode[10] = {'w', 0, 0}; + if (opts->compress_level != -1) + out_mode[1] = '0' + opts->compress_level; + sam_open_mode(out_mode+strlen(out_mode), opts->fn_out, NULL); + fp_out = sam_open_format(opts->fn_out, out_mode, &opts->ga.out); + if (!fp_out) { + perror(opts->fn_out); + goto err; + } + autoflush_if_stdout(fp_out, opts->fn_out); + if (opts->p.pool) + hts_set_thread_pool(fp_out, &opts->p); + + // Create header + if (ks_len(&read_str)) { + char CO[2100]; + if (ks_len(&index_str)) + snprintf(CO, sizeof(CO), "@CO\tReverse with: samtools fastq %s " + "--index-format=\"%s\"\n", + ks_str(&read_str), ks_str(&index_str)); + else + snprintf(CO, sizeof(CO), "@CO\tReverse with: samtools fastq %s\n", + ks_str(&read_str)); + + hdr_out = sam_hdr_parse(strlen(CO), CO); + } else { + hdr_out = sam_hdr_init(); + } + + // Add a version line with the sort order to the output header + if (sam_hdr_add_line(hdr_out, "HD", "VN", SAM_FORMAT_VERSION, "SO", "unsorted", "GO", "query", NULL) < 0) { + fprintf(stderr, "Could not set SO and GO in the header.\n"); + goto err; + } + + // Read group + if (opts->rg_line) { + if (*opts->rg_line != '@') + ksprintf(&rg_line, "@RG\t%s", opts->rg_line); + else + kputs(opts->rg_line, &rg_line); + } else if (opts->rg) { + ksprintf(&rg_line, "@RG\tID:%s", opts->rg); + } + + if (ks_len(&rg_line)) { + if (sam_hdr_add_lines(hdr_out, ks_str(&rg_line), 0) < 0) + goto err; + rg = strstr(ks_str(&rg_line), "\tID:"); + if (!rg) { + fprintf(stderr, "\"-r RG-LINE\" option contained no ID field\n"); + goto err; + } + rg += 4; + + i = 0; + while (rg[i] != '\t' && rg[i] != '\0') + i++; + rg[i] = 0; + } + + if ((ret = sam_hdr_write(fp_out, hdr_out)) < 0) + goto err; + + + // Interleave / combine from n files (ids[0..n-1]). + int res; + int eof = 0; + do { + idx_seq.l = idx_qual.l = 0; + for (i = 0; i < n; i++) { + if ((res = sam_read1(fp_in[ids[i]], NULL, b)) < 0) { + if (res == -1) { + eof++; + continue; + } else + break; + } + + // index + if (ids[i] == FQ_I1 || ids[i] == FQ_I2) { + if (append_index(&idx_seq, &idx_qual, b) < 0) { + res = -1; + break; + } + continue; + } + + // full read + if (idx_seq.l) { + if (opts->idx_both || ids[i] == FQ_SINGLE || + ids[i] == FQ_R0 || ids[i] == FQ_R1) { + if (bam_aux_append(b, opts->barcode_seq, 'Z', idx_seq.l, + (uint8_t *)idx_seq.s) || + bam_aux_append(b, opts->barcode_qual, 'Z', idx_qual.l, + (uint8_t *)idx_qual.s)) { + res = -1; + break; + } + } + } + + switch(ids[i]) { + case FQ_R0: + // unpaired; no flags to declare + break; + case FQ_SINGLE: + // paired (but don't know if R1 or R2) or unpaired. + // We rely on the /1 and /2 read suffix parsing in htslib + // to distinguish the two cases, or CASAVA tags if + // explicitly enabled. + break; + case FQ_R1: + if ((b->core.flag & (BAM_FREAD1 | BAM_FREAD2)) == 0) + b->core.flag |= BAM_FREAD1; + b->core.flag |= BAM_FPAIRED; + if (i+1 < n && ids[i+1] == FQ_R2) + b->core.flag |= BAM_FMUNMAP; + break; + case FQ_R2: + b->core.flag |= BAM_FPAIRED | BAM_FREAD2; + if (i > 0 && ids[i-1] == FQ_R1) + b->core.flag |= BAM_FMUNMAP; + break; + } + + if (rg) { + if (bam_aux_append(b, "RG", 'Z', strlen(rg)+1, + (uint8_t *)rg) < 0) { + ret = -1; + goto err; + } + } + + if (opts->order) { + if (bam_aux_update_int(b, opts->order, read_num++) < 0) { + ret = -1; + goto err; + } + } + + res = sam_write1(fp_out, hdr_out, b); + } + } while (res >= 0); + + if (res != -1) { + print_error("import", "truncated file. Aborting"); + ret = res; + goto err; + } + + if (eof != n) { + print_error("import", "input files with differing number of records"); + ret = -1; + goto err; + } + + // Close and return + ret = 0; +err: + bam_destroy1(b); + sam_hdr_destroy(hdr_out); + ks_free(&rg_line); + ks_free(&index_str); + ks_free(&read_str); + if (fp_out) { + release_autoflush(fp_out); + if (sam_close(fp_out) < 0) { + perror(opts->fn_out); + ret |= -1; + } + } + for (i = 0; i < FQ_END; i++) { + if (fp_in[i] && sam_close(fp_in[i]) < 0) { + perror(opts->fn[i]); + ret |= -1; + } + } + ks_free(&idx_seq); + ks_free(&idx_qual); + + return ret; +} + +int main_import(int argc, char *argv[]) { + int c; + opts_t opts = { + .no_pg = 0, + .ga = SAM_GLOBAL_ARGS_INIT, + .fn = {NULL}, + .fn_out = "-", + .casava = 0, + .barcode_seq = "BC", + .barcode_qual = "QT", + .aux = NULL, + .rg = NULL, + .rg_line = NULL, + .order = NULL, + .compress_level = -1, + .name2 = 0, + }; + kstring_t rg = {0}; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, '-', '@'), + {"no-PG", no_argument, NULL, 9}, + {"i1", required_argument, NULL, 1}, + {"i2", required_argument, NULL, 2}, + {"r1", required_argument, NULL, '1'}, + {"r2", required_argument, NULL, '2'}, + {"rg", required_argument, NULL, 'R'}, + {"rg-line", required_argument, NULL, 'r'}, + {"order", required_argument, NULL, 3}, + {"barcode-tag", required_argument, NULL, 4}, + {"quality-tag", required_argument, NULL, 5}, + {"name2", no_argument, NULL, 'N'}, + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "1:2:s:0:bhiT:r:R:o:O:u@:N", lopts, NULL)) >= 0) { + switch (c) { + case 'b': opts.idx_both = 1; break; + case '0': opts.fn[FQ_R0] = optarg; break; + case '1': opts.fn[FQ_R1] = optarg; break; + case '2': opts.fn[FQ_R2] = optarg; break; + case 1: opts.fn[FQ_I1] = optarg; break; + case 2: opts.fn[FQ_I2] = optarg; break; + case 's': opts.fn[FQ_SINGLE] = optarg; break; + case 'o': opts.fn_out = optarg; break; + case 'i': opts.casava = 1; break; + case 4: opts.barcode_seq = optarg; break; + case 5: opts.barcode_qual = optarg; break; + case 'T': opts.aux = optarg; break; + case 'u': opts.compress_level = 0; break; + case 'R': opts.rg = optarg; break; + case 'r': + if (*optarg != '@' && ks_len(&rg) == 0) + kputs("@RG", &rg); + if (ks_len(&rg)) + kputc_('\t', &rg); + kputs(optarg, &rg); + opts.rg_line = rg.s; + break; + + case 'N': opts.name2 = 1; break; + + case 9: opts.no_pg = 1; break; + case 3: opts.order = optarg; break; + + case 'h': return usage(stdout, EXIT_SUCCESS); + case '?': return usage(stderr, EXIT_FAILURE); + + default: + if (parse_sam_global_opt(c, optarg, lopts, &opts.ga) != 0) + return usage(stderr, EXIT_FAILURE); + break; + } + } + + if (opts.ga.nthreads > 0) { + if (!(opts.p.pool = hts_tpool_init(opts.ga.nthreads))) { + fprintf(stderr, "Failed to create thread pool\n"); + if (rg.s) + free(rg.s); + return -1;; + } + } + + int ret = import_fastq(argc-optind, argv+optind, &opts) ? 1 : 0; + + if (rg.s) + free(rg.s); + + if (opts.p.pool) + hts_tpool_destroy(opts.p.pool); + + return ret; +} diff --git a/samtools/bam_import.c.pysam.c b/samtools/bam_import.c.pysam.c new file mode 100644 index 0000000..76b61a4 --- /dev/null +++ b/samtools/bam_import.c.pysam.c @@ -0,0 +1,505 @@ +#include "samtools.pysam.h" + +/* bam_import -- Import of FASTQ files. + * + * samtools import -1 a_1.fq -2 a_2.fq --i1 a_i1.fq --i2 a_i2.fq + * samtools import a_1.fq a_2.fq + * samtools import a_interleaved.fq + * + * Copyright (C) 2020 Genome Research Ltd. + * + * Author: James Bonfield + */ + +/* +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + +// TODO: Store other non-aux comments; in new sam tag? + +#include +#include + +#include "htslib/sam.h" +#include "htslib/thread_pool.h" + +#include "samtools.h" +#include "sam_opts.h" + +static int usage(FILE *fp, int exit_status) { + fprintf(fp, "Usage: samtools import [options] [file.fastq ...]\n"); + fprintf(fp, "\n"); + fprintf(fp, "Options:\n"); + fprintf(fp, " -s FILE Read paired-ended data from single FILE\n"); + fprintf(fp, " -0 FILE Read single-ended data from FILE\n"); + fprintf(fp, " -1 FILE Read-1 from FILE\n"); + fprintf(fp, " -2 FILE Read-2 from FILE\n"); + fprintf(fp, " --i1 FILE Index-1 from FILE\n"); + fprintf(fp, " --i2 FILE Index-2 from FILE\n"); + fprintf(fp, " -i Parse CASAVA identifier\n"); + fprintf(fp, " --barcode-tag TAG\n"); + fprintf(fp, " Tag to use with barcode sequences [BC]\n"); + fprintf(fp, " --quality-tag TAG\n"); + fprintf(fp, " Tag to use with barcode qualities [QT]\n"); + fprintf(fp, " -N, --name2 Use 2nd field as read name (SRA format)\n"); + fprintf(fp, " -r STRING Build up a complete @RG line\n"); + fprintf(fp, " -R STRING Add a simple RG line of \"@RG\\tID:STRING\"\n"); + fprintf(fp, " -T TAGLIST Parse tags in SAM format; list of '*' for all\n"); + fprintf(fp, " -o FILE Output to FILE instead of samtools_stdout\n"); + fprintf(fp, " -u Uncompressed output\n"); + fprintf(fp, " --order TAG Store Nth record count in TAG\n"); + fprintf(fp, "\n"); + sam_global_opt_help(fp, "-.O.-@--"); + + fprintf(fp, "\nA single fastq file will be interpreted as -s, -0 or -1 depending on\n"); + fprintf(fp, "file contents, and a pair of fastq files as \"-1 FILE1 -2 FILE2\".\n"); + + return exit_status; +} + +// Order matters here as we want to read index elements before main +// sequences so on reading the seqs we can emit a fully annotated record. +enum fileno { + FQ_I1, FQ_I2, // index seqs for R1 and R2 + FQ_R0, // single file and unpaired data (singled-ended tech). + FQ_R1, FQ_R2, // separate read1 and read2 files + FQ_SINGLE, // single file, but with read1 and/or read2 present. + FQ_END +}; + +typedef struct { + sam_global_args ga; + int no_pg; + char *fn[FQ_END], *fn_out; + int idx_both; // add index to READ2 too, not just READ1 + int casava; + char *barcode_seq; + char *barcode_qual; + char *aux; + char *rg; + char *rg_line; + char *order; + int compress_level; + htsThreadPool p; + int name2; +} opts_t; + +// Append a sequence and quality string from a BAM record to a BC:Z and +// QT:Z style aux tag string. +static int append_index(kstring_t *s, kstring_t *q, bam1_t *b) { + char *sp, *qp; + if (ks_resize(s, s->l + b->core.l_qseq+1 +1) < 0) + return -1; + if (ks_resize(q, q->l + b->core.l_qseq+1 +1) < 0) + return -1; + + sp = s->s + s->l - (s->l > 0); + qp = q->s + q->l - (q->l > 0); + + if (s->l) + *sp++ = '-'; + + if (q->l) + *qp++ = ' '; + + int i; + uint8_t *seq = bam_get_seq(b); + uint8_t *qual = bam_get_qual(b); + for (i = 0; i < b->core.l_qseq; i++) { + *sp++ = seq_nt16_str[bam_seqi(seq, i)]; + *qp++ = qual[i] + '!'; + } + *sp++ = 0; + *qp++ = 0; + + s->l = sp - s->s; + q->l = qp - q->s; + + return 0; +} + +static int import_fastq(int argc, char **argv, opts_t *opts) { + int i, n, ret = 0; + samFile *fp_in[FQ_END] = {NULL}; + bam1_t *b = bam_init1(); + int ids[FQ_END]; + samFile *fp_out = NULL; + sam_hdr_t *hdr_out = NULL; + kstring_t index_str = {0,0}; + kstring_t read_str = {0,0}; + char *rg = opts->rg; + kstring_t rg_line = {0,0}; + uint64_t read_num = 0; + kstring_t idx_seq = {0}; + kstring_t idx_qual = {0}; + + // Any additional arguments are assumed to be r1 r2, as a + // short cut. We support reading index tags out of those too (eg + // Illumina CASAVA format), but if we do that we lack the barcode + // quality string. + // + // We also consider a read name ending in /1 or /2 to be a single + // file containing interleaved fastq records for both ends. + // These will be labeled as fn[FQ_R1] but adjusted during reading. + if (argc == 1) + opts->fn[FQ_SINGLE] = argv[0]; + else + for (i = 0; i < 4; i++) + if (argc > i) + opts->fn[FQ_R1+i] = argv[i]; + + // Open all files + for (i = n = 0; i < FQ_END; i++) { + if (!opts->fn[i]) + continue; + fp_in[i] = sam_open_format(opts->fn[i], "r", &opts->ga.in); + if (!fp_in[i]) { + perror(opts->fn[i]); + ret = -1; + goto err; + } + if (opts->p.pool) + hts_set_thread_pool(fp_in[i], &opts->p); + ids[n++] = i; + + if (opts->name2) + hts_set_opt(fp_in[i], FASTQ_OPT_NAME2, 1); + if (opts->casava) + hts_set_opt(fp_in[i], FASTQ_OPT_CASAVA, 1); + if (opts->barcode_seq) // for auto-CASAVA parsing + hts_set_opt(fp_in[i], FASTQ_OPT_BARCODE, opts->barcode_seq); + if (opts->aux) + hts_set_opt(fp_in[i], FASTQ_OPT_AUX, + *opts->aux == '*' || *opts->aux == '\0' + ? NULL : opts->aux); + + switch (i) { + case FQ_I1: + kputs("--i1 I1.fastq ", &read_str); + kputs("i*", &index_str); + break; + case FQ_I2: + kputs("--i2 I2.fastq ", &read_str); + kputs("i*", &index_str); + break; + + case FQ_R0: + kputs("-0 unpaired.fastq ", &read_str); + break; + + case FQ_R1: + kputs("-1 R1.fastq ", &read_str); + break; + + case FQ_R2: + kputs("-2 R2.fastq ", &read_str); + break; + + case FQ_SINGLE: + kputs("-N -o paired.fastq ", &read_str); + break; + + default: + ks_clear(&read_str); // not reversible + kputs("", &read_str); + } + } + if (n == 0) { + bam_destroy1(b); + return usage(samtools_stdout, EXIT_SUCCESS); + } + + char out_mode[10] = {'w', 0, 0}; + if (opts->compress_level != -1) + out_mode[1] = '0' + opts->compress_level; + sam_open_mode(out_mode+strlen(out_mode), opts->fn_out, NULL); + fp_out = sam_open_format(opts->fn_out, out_mode, &opts->ga.out); + if (!fp_out) { + perror(opts->fn_out); + goto err; + } + autoflush_if_stdout(fp_out, opts->fn_out); + if (opts->p.pool) + hts_set_thread_pool(fp_out, &opts->p); + + // Create header + if (ks_len(&read_str)) { + char CO[2100]; + if (ks_len(&index_str)) + snprintf(CO, sizeof(CO), "@CO\tReverse with: samtools fastq %s " + "--index-format=\"%s\"\n", + ks_str(&read_str), ks_str(&index_str)); + else + snprintf(CO, sizeof(CO), "@CO\tReverse with: samtools fastq %s\n", + ks_str(&read_str)); + + hdr_out = sam_hdr_parse(strlen(CO), CO); + } else { + hdr_out = sam_hdr_init(); + } + + // Add a version line with the sort order to the output header + if (sam_hdr_add_line(hdr_out, "HD", "VN", SAM_FORMAT_VERSION, "SO", "unsorted", "GO", "query", NULL) < 0) { + fprintf(samtools_stderr, "Could not set SO and GO in the header.\n"); + goto err; + } + + // Read group + if (opts->rg_line) { + if (*opts->rg_line != '@') + ksprintf(&rg_line, "@RG\t%s", opts->rg_line); + else + kputs(opts->rg_line, &rg_line); + } else if (opts->rg) { + ksprintf(&rg_line, "@RG\tID:%s", opts->rg); + } + + if (ks_len(&rg_line)) { + if (sam_hdr_add_lines(hdr_out, ks_str(&rg_line), 0) < 0) + goto err; + rg = strstr(ks_str(&rg_line), "\tID:"); + if (!rg) { + fprintf(samtools_stderr, "\"-r RG-LINE\" option contained no ID field\n"); + goto err; + } + rg += 4; + + i = 0; + while (rg[i] != '\t' && rg[i] != '\0') + i++; + rg[i] = 0; + } + + if ((ret = sam_hdr_write(fp_out, hdr_out)) < 0) + goto err; + + + // Interleave / combine from n files (ids[0..n-1]). + int res; + int eof = 0; + do { + idx_seq.l = idx_qual.l = 0; + for (i = 0; i < n; i++) { + if ((res = sam_read1(fp_in[ids[i]], NULL, b)) < 0) { + if (res == -1) { + eof++; + continue; + } else + break; + } + + // index + if (ids[i] == FQ_I1 || ids[i] == FQ_I2) { + if (append_index(&idx_seq, &idx_qual, b) < 0) { + res = -1; + break; + } + continue; + } + + // full read + if (idx_seq.l) { + if (opts->idx_both || ids[i] == FQ_SINGLE || + ids[i] == FQ_R0 || ids[i] == FQ_R1) { + if (bam_aux_append(b, opts->barcode_seq, 'Z', idx_seq.l, + (uint8_t *)idx_seq.s) || + bam_aux_append(b, opts->barcode_qual, 'Z', idx_qual.l, + (uint8_t *)idx_qual.s)) { + res = -1; + break; + } + } + } + + switch(ids[i]) { + case FQ_R0: + // unpaired; no flags to declare + break; + case FQ_SINGLE: + // paired (but don't know if R1 or R2) or unpaired. + // We rely on the /1 and /2 read suffix parsing in htslib + // to distinguish the two cases, or CASAVA tags if + // explicitly enabled. + break; + case FQ_R1: + if ((b->core.flag & (BAM_FREAD1 | BAM_FREAD2)) == 0) + b->core.flag |= BAM_FREAD1; + b->core.flag |= BAM_FPAIRED; + if (i+1 < n && ids[i+1] == FQ_R2) + b->core.flag |= BAM_FMUNMAP; + break; + case FQ_R2: + b->core.flag |= BAM_FPAIRED | BAM_FREAD2; + if (i > 0 && ids[i-1] == FQ_R1) + b->core.flag |= BAM_FMUNMAP; + break; + } + + if (rg) { + if (bam_aux_append(b, "RG", 'Z', strlen(rg)+1, + (uint8_t *)rg) < 0) { + ret = -1; + goto err; + } + } + + if (opts->order) { + if (bam_aux_update_int(b, opts->order, read_num++) < 0) { + ret = -1; + goto err; + } + } + + res = sam_write1(fp_out, hdr_out, b); + } + } while (res >= 0); + + if (res != -1) { + print_error("import", "truncated file. Aborting"); + ret = res; + goto err; + } + + if (eof != n) { + print_error("import", "input files with differing number of records"); + ret = -1; + goto err; + } + + // Close and return + ret = 0; +err: + bam_destroy1(b); + sam_hdr_destroy(hdr_out); + ks_free(&rg_line); + ks_free(&index_str); + ks_free(&read_str); + if (fp_out) { + release_autoflush(fp_out); + if (sam_close(fp_out) < 0) { + perror(opts->fn_out); + ret |= -1; + } + } + for (i = 0; i < FQ_END; i++) { + if (fp_in[i] && sam_close(fp_in[i]) < 0) { + perror(opts->fn[i]); + ret |= -1; + } + } + ks_free(&idx_seq); + ks_free(&idx_qual); + + return ret; +} + +int main_import(int argc, char *argv[]) { + int c; + opts_t opts = { + .no_pg = 0, + .ga = SAM_GLOBAL_ARGS_INIT, + .fn = {NULL}, + .fn_out = "-", + .casava = 0, + .barcode_seq = "BC", + .barcode_qual = "QT", + .aux = NULL, + .rg = NULL, + .rg_line = NULL, + .order = NULL, + .compress_level = -1, + .name2 = 0, + }; + kstring_t rg = {0}; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, '-', '@'), + {"no-PG", no_argument, NULL, 9}, + {"i1", required_argument, NULL, 1}, + {"i2", required_argument, NULL, 2}, + {"r1", required_argument, NULL, '1'}, + {"r2", required_argument, NULL, '2'}, + {"rg", required_argument, NULL, 'R'}, + {"rg-line", required_argument, NULL, 'r'}, + {"order", required_argument, NULL, 3}, + {"barcode-tag", required_argument, NULL, 4}, + {"quality-tag", required_argument, NULL, 5}, + {"name2", no_argument, NULL, 'N'}, + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "1:2:s:0:bhiT:r:R:o:O:u@:N", lopts, NULL)) >= 0) { + switch (c) { + case 'b': opts.idx_both = 1; break; + case '0': opts.fn[FQ_R0] = optarg; break; + case '1': opts.fn[FQ_R1] = optarg; break; + case '2': opts.fn[FQ_R2] = optarg; break; + case 1: opts.fn[FQ_I1] = optarg; break; + case 2: opts.fn[FQ_I2] = optarg; break; + case 's': opts.fn[FQ_SINGLE] = optarg; break; + case 'o': opts.fn_out = optarg; break; + case 'i': opts.casava = 1; break; + case 4: opts.barcode_seq = optarg; break; + case 5: opts.barcode_qual = optarg; break; + case 'T': opts.aux = optarg; break; + case 'u': opts.compress_level = 0; break; + case 'R': opts.rg = optarg; break; + case 'r': + if (*optarg != '@' && ks_len(&rg) == 0) + kputs("@RG", &rg); + if (ks_len(&rg)) + kputc_('\t', &rg); + kputs(optarg, &rg); + opts.rg_line = rg.s; + break; + + case 'N': opts.name2 = 1; break; + + case 9: opts.no_pg = 1; break; + case 3: opts.order = optarg; break; + + case 'h': return usage(samtools_stdout, EXIT_SUCCESS); + case '?': return usage(samtools_stderr, EXIT_FAILURE); + + default: + if (parse_sam_global_opt(c, optarg, lopts, &opts.ga) != 0) + return usage(samtools_stderr, EXIT_FAILURE); + break; + } + } + + if (opts.ga.nthreads > 0) { + if (!(opts.p.pool = hts_tpool_init(opts.ga.nthreads))) { + fprintf(samtools_stderr, "Failed to create thread pool\n"); + if (rg.s) + free(rg.s); + return -1;; + } + } + + int ret = import_fastq(argc-optind, argv+optind, &opts) ? 1 : 0; + + if (rg.s) + free(rg.s); + + if (opts.p.pool) + hts_tpool_destroy(opts.p.pool); + + return ret; +} diff --git a/samtools/bam_index.c b/samtools/bam_index.c new file mode 100644 index 0000000..f7c3358 --- /dev/null +++ b/samtools/bam_index.c @@ -0,0 +1,280 @@ +/* bam_index.c -- index and idxstats subcommands. + + Copyright (C) 2008-2011, 2013-2016, 2018, 2019 Genome Research Ltd. + Portions copyright (C) 2010 Broad Institute. + Portions copyright (C) 2013 Peter Cock, The James Hutton Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "samtools.h" +#include "sam_opts.h" + +#define BAM_LIDX_SHIFT 14 + +static void index_usage(FILE *fp) +{ + fprintf(fp, +"Usage: samtools index -M [-bc] [-m INT] ...\n" +" or: samtools index [-bc] [-m INT] [out.index]\n" +"Options:\n" +" -b Generate BAI-format index for BAM files [default]\n" +" -c Generate CSI-format index for BAM files\n" +" -m INT Set minimum interval size for CSI indices to 2^INT [%d]\n" +" -M Interpret all filename arguments as files to be indexed\n" +" -o FILE Write index to FILE [alternative to as an argument]\n" +" -@ INT Sets the number of threads [none]\n", BAM_LIDX_SHIFT); +} + +// Returns 1 if the file does not exist or can be positively +// identified as an index file. +static int nonexistent_or_index(const char *fn) +{ + int ret1, ret2; + htsFormat fmt; + hFILE *fp = hopen(fn, "r"); + if (fp == NULL) return 1; + + ret1 = hts_detect_format2(fp, fn, &fmt); + ret2 = hclose(fp); + if (ret1 < 0 || ret2 < 0) return 0; + + return fmt.category == index_file; +} + +int bam_index(int argc, char *argv[]) +{ + int csi = 0; + int min_shift = BAM_LIDX_SHIFT; + int multiple = 0; + int n_threads = 0; + int n_files, c, i, ret; + const char *fn_idx = NULL; + + while ((c = getopt(argc, argv, "bcm:Mo:@:")) >= 0) + switch (c) { + case 'b': csi = 0; break; + case 'c': csi = 1; break; + case 'm': csi = 1; min_shift = atoi(optarg); break; + case 'M': multiple = 1; break; + case 'o': fn_idx = optarg; break; + case '@': n_threads = atoi(optarg); break; + default: + index_usage(stderr); + return 1; + } + + n_files = argc - optind; + + if (n_files == 0) { + index_usage(stdout); + return 0; + } + + // Handle legacy synopsis + if (n_files == 2 && !fn_idx && nonexistent_or_index(argv[optind+1])) { + n_files = 1; + fn_idx = argv[optind+1]; + } + + if (n_files > 1 && !multiple) { + print_error("index", "use -M to enable indexing more than one alignment file"); + return EXIT_FAILURE; + } + + if (fn_idx && n_files > 1) { + // TODO In future we may allow %* placeholders or similar + print_error("index", "can't use -o with multiple input alignment files"); + return EXIT_FAILURE; + } + + for (i = optind; i < optind + n_files; i++) { + ret = sam_index_build3(argv[i], fn_idx, csi? min_shift : 0, n_threads); + if (ret < 0) { + if (ret == -2) + print_error_errno("index", "failed to open \"%s\"", argv[i]); + else if (ret == -3) + print_error("index", "\"%s\" is in a format that cannot be usefully indexed", argv[i]); + else if (ret == -4 && fn_idx) + print_error("index", "failed to create or write index \"%s\"", fn_idx); + else if (ret == -4) + print_error("index", "failed to create or write index"); + else + print_error_errno("index", "failed to create index for \"%s\"", argv[i]); + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} + +/* + * Cram indices do not contain mapped/unmapped record counts, so we have to + * decode each record and count. However we can speed this up as much as + * possible by using the required fields parameter. + * + * This prints the stats to stdout in the same manner than the BAM function + * does. + * + * Returns 0 on success, + * -1 on failure. + */ +int slow_idxstats(samFile *fp, sam_hdr_t *header) { + int ret, last_tid = -2; + bam1_t *b = bam_init1(); + + if (hts_set_opt(fp, CRAM_OPT_REQUIRED_FIELDS, SAM_RNAME | SAM_FLAG)) + return -1; + + uint64_t (*count0)[2] = calloc(sam_hdr_nref(header)+1, sizeof(*count0)); + uint64_t (*counts)[2] = count0+1; + if (!count0) + return -1; + + while ((ret = sam_read1(fp, header, b)) >= 0) { + if (b->core.tid >= sam_hdr_nref(header) || b->core.tid < -1) { + free(count0); + return -1; + } + + if (b->core.tid != last_tid) { + if (last_tid >= -1) { + if (counts[b->core.tid][0] + counts[b->core.tid][1]) { + print_error("idxstats", "file is not position sorted"); + free(count0); + return -1; + } + } + last_tid = b->core.tid; + } + + counts[b->core.tid][(b->core.flag & BAM_FUNMAP) ? 1 : 0]++; + } + + if (ret == -1) { + int i; + for (i = 0; i < sam_hdr_nref(header); i++) { + printf("%s\t%"PRId64"\t%"PRIu64"\t%"PRIu64"\n", + sam_hdr_tid2name(header, i), + (int64_t) sam_hdr_tid2len(header, i), + counts[i][0], counts[i][1]); + } + printf("*\t0\t%"PRIu64"\t%"PRIu64"\n", counts[-1][0], counts[-1][1]); + } + + free(count0); + + bam_destroy1(b); + + return (ret == -1) ? 0 : -1; +} + +static void usage_exit(FILE *fp, int exit_status) +{ + fprintf(fp, "Usage: samtools idxstats [options] \n"); + sam_global_opt_help(fp, "-.---@-."); + exit(exit_status); +} + +int bam_idxstats(int argc, char *argv[]) +{ + hts_idx_t* idx; + sam_hdr_t* header; + samFile* fp; + int c; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', '-', '@'), + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "@:", lopts, NULL)) >= 0) { + switch (c) { + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + usage_exit(stderr, EXIT_FAILURE); + } + } + + if (argc != optind+1) { + if (argc == optind) usage_exit(stdout, EXIT_SUCCESS); + else usage_exit(stderr, EXIT_FAILURE); + } + + fp = sam_open_format(argv[optind], "r", &ga.in); + if (fp == NULL) { + print_error_errno("idxstats", "failed to open \"%s\"", argv[optind]); + return 1; + } + header = sam_hdr_read(fp); + if (header == NULL) { + print_error("idxstats", "failed to read header for \"%s\"", argv[optind]); + return 1; + } + + if (hts_get_format(fp)->format != bam) { + slow_method: + if (ga.nthreads) + hts_set_threads(fp, ga.nthreads); + + if (slow_idxstats(fp, header) < 0) { + print_error("idxstats", "failed to process \"%s\"", argv[optind]); + return 1; + } + } else { + idx = sam_index_load(fp, argv[optind]); + if (idx == NULL) { + print_error("idxstats", "fail to load index for \"%s\", " + "reverting to slow method", argv[optind]); + goto slow_method; + } + + int i; + for (i = 0; i < sam_hdr_nref(header); ++i) { + // Print out contig name and length + printf("%s\t%"PRId64, sam_hdr_tid2name(header, i), (int64_t) sam_hdr_tid2len(header, i)); + // Now fetch info about it from the meta bin + uint64_t u, v; + hts_idx_get_stat(idx, i, &u, &v); + printf("\t%" PRIu64 "\t%" PRIu64 "\n", u, v); + } + // Dump information about unmapped reads + printf("*\t0\t0\t%" PRIu64 "\n", hts_idx_get_n_no_coor(idx)); + hts_idx_destroy(idx); + } + + sam_hdr_destroy(header); + sam_close(fp); + return 0; +} diff --git a/samtools/bam_index.c.pysam.c b/samtools/bam_index.c.pysam.c new file mode 100644 index 0000000..6627cfa --- /dev/null +++ b/samtools/bam_index.c.pysam.c @@ -0,0 +1,282 @@ +#include "samtools.pysam.h" + +/* bam_index.c -- index and idxstats subcommands. + + Copyright (C) 2008-2011, 2013-2016, 2018, 2019 Genome Research Ltd. + Portions copyright (C) 2010 Broad Institute. + Portions copyright (C) 2013 Peter Cock, The James Hutton Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "samtools.h" +#include "sam_opts.h" + +#define BAM_LIDX_SHIFT 14 + +static void index_usage(FILE *fp) +{ + fprintf(fp, +"Usage: samtools index -M [-bc] [-m INT] ...\n" +" or: samtools index [-bc] [-m INT] [out.index]\n" +"Options:\n" +" -b Generate BAI-format index for BAM files [default]\n" +" -c Generate CSI-format index for BAM files\n" +" -m INT Set minimum interval size for CSI indices to 2^INT [%d]\n" +" -M Interpret all filename arguments as files to be indexed\n" +" -o FILE Write index to FILE [alternative to as an argument]\n" +" -@ INT Sets the number of threads [none]\n", BAM_LIDX_SHIFT); +} + +// Returns 1 if the file does not exist or can be positively +// identified as an index file. +static int nonexistent_or_index(const char *fn) +{ + int ret1, ret2; + htsFormat fmt; + hFILE *fp = hopen(fn, "r"); + if (fp == NULL) return 1; + + ret1 = hts_detect_format2(fp, fn, &fmt); + ret2 = hclose(fp); + if (ret1 < 0 || ret2 < 0) return 0; + + return fmt.category == index_file; +} + +int bam_index(int argc, char *argv[]) +{ + int csi = 0; + int min_shift = BAM_LIDX_SHIFT; + int multiple = 0; + int n_threads = 0; + int n_files, c, i, ret; + const char *fn_idx = NULL; + + while ((c = getopt(argc, argv, "bcm:Mo:@:")) >= 0) + switch (c) { + case 'b': csi = 0; break; + case 'c': csi = 1; break; + case 'm': csi = 1; min_shift = atoi(optarg); break; + case 'M': multiple = 1; break; + case 'o': fn_idx = optarg; break; + case '@': n_threads = atoi(optarg); break; + default: + index_usage(samtools_stderr); + return 1; + } + + n_files = argc - optind; + + if (n_files == 0) { + index_usage(samtools_stdout); + return 0; + } + + // Handle legacy synopsis + if (n_files == 2 && !fn_idx && nonexistent_or_index(argv[optind+1])) { + n_files = 1; + fn_idx = argv[optind+1]; + } + + if (n_files > 1 && !multiple) { + print_error("index", "use -M to enable indexing more than one alignment file"); + return EXIT_FAILURE; + } + + if (fn_idx && n_files > 1) { + // TODO In future we may allow %* placeholders or similar + print_error("index", "can't use -o with multiple input alignment files"); + return EXIT_FAILURE; + } + + for (i = optind; i < optind + n_files; i++) { + ret = sam_index_build3(argv[i], fn_idx, csi? min_shift : 0, n_threads); + if (ret < 0) { + if (ret == -2) + print_error_errno("index", "failed to open \"%s\"", argv[i]); + else if (ret == -3) + print_error("index", "\"%s\" is in a format that cannot be usefully indexed", argv[i]); + else if (ret == -4 && fn_idx) + print_error("index", "failed to create or write index \"%s\"", fn_idx); + else if (ret == -4) + print_error("index", "failed to create or write index"); + else + print_error_errno("index", "failed to create index for \"%s\"", argv[i]); + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} + +/* + * Cram indices do not contain mapped/unmapped record counts, so we have to + * decode each record and count. However we can speed this up as much as + * possible by using the required fields parameter. + * + * This prints the stats to samtools_stdout in the same manner than the BAM function + * does. + * + * Returns 0 on success, + * -1 on failure. + */ +int slow_idxstats(samFile *fp, sam_hdr_t *header) { + int ret, last_tid = -2; + bam1_t *b = bam_init1(); + + if (hts_set_opt(fp, CRAM_OPT_REQUIRED_FIELDS, SAM_RNAME | SAM_FLAG)) + return -1; + + uint64_t (*count0)[2] = calloc(sam_hdr_nref(header)+1, sizeof(*count0)); + uint64_t (*counts)[2] = count0+1; + if (!count0) + return -1; + + while ((ret = sam_read1(fp, header, b)) >= 0) { + if (b->core.tid >= sam_hdr_nref(header) || b->core.tid < -1) { + free(count0); + return -1; + } + + if (b->core.tid != last_tid) { + if (last_tid >= -1) { + if (counts[b->core.tid][0] + counts[b->core.tid][1]) { + print_error("idxstats", "file is not position sorted"); + free(count0); + return -1; + } + } + last_tid = b->core.tid; + } + + counts[b->core.tid][(b->core.flag & BAM_FUNMAP) ? 1 : 0]++; + } + + if (ret == -1) { + int i; + for (i = 0; i < sam_hdr_nref(header); i++) { + fprintf(samtools_stdout, "%s\t%"PRId64"\t%"PRIu64"\t%"PRIu64"\n", + sam_hdr_tid2name(header, i), + (int64_t) sam_hdr_tid2len(header, i), + counts[i][0], counts[i][1]); + } + fprintf(samtools_stdout, "*\t0\t%"PRIu64"\t%"PRIu64"\n", counts[-1][0], counts[-1][1]); + } + + free(count0); + + bam_destroy1(b); + + return (ret == -1) ? 0 : -1; +} + +static void usage_exit(FILE *fp, int exit_status) +{ + fprintf(fp, "Usage: samtools idxstats [options] \n"); + sam_global_opt_help(fp, "-.---@-."); + samtools_exit(exit_status); +} + +int bam_idxstats(int argc, char *argv[]) +{ + hts_idx_t* idx; + sam_hdr_t* header; + samFile* fp; + int c; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', '-', '@'), + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "@:", lopts, NULL)) >= 0) { + switch (c) { + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + usage_exit(samtools_stderr, EXIT_FAILURE); + } + } + + if (argc != optind+1) { + if (argc == optind) usage_exit(samtools_stdout, EXIT_SUCCESS); + else usage_exit(samtools_stderr, EXIT_FAILURE); + } + + fp = sam_open_format(argv[optind], "r", &ga.in); + if (fp == NULL) { + print_error_errno("idxstats", "failed to open \"%s\"", argv[optind]); + return 1; + } + header = sam_hdr_read(fp); + if (header == NULL) { + print_error("idxstats", "failed to read header for \"%s\"", argv[optind]); + return 1; + } + + if (hts_get_format(fp)->format != bam) { + slow_method: + if (ga.nthreads) + hts_set_threads(fp, ga.nthreads); + + if (slow_idxstats(fp, header) < 0) { + print_error("idxstats", "failed to process \"%s\"", argv[optind]); + return 1; + } + } else { + idx = sam_index_load(fp, argv[optind]); + if (idx == NULL) { + print_error("idxstats", "fail to load index for \"%s\", " + "reverting to slow method", argv[optind]); + goto slow_method; + } + + int i; + for (i = 0; i < sam_hdr_nref(header); ++i) { + // Print out contig name and length + fprintf(samtools_stdout, "%s\t%"PRId64, sam_hdr_tid2name(header, i), (int64_t) sam_hdr_tid2len(header, i)); + // Now fetch info about it from the meta bin + uint64_t u, v; + hts_idx_get_stat(idx, i, &u, &v); + fprintf(samtools_stdout, "\t%" PRIu64 "\t%" PRIu64 "\n", u, v); + } + // Dump information about unmapped reads + fprintf(samtools_stdout, "*\t0\t0\t%" PRIu64 "\n", hts_idx_get_n_no_coor(idx)); + hts_idx_destroy(idx); + } + + sam_hdr_destroy(header); + sam_close(fp); + return 0; +} diff --git a/samtools/bam_lpileup.c b/samtools/bam_lpileup.c new file mode 100644 index 0000000..58c428f --- /dev/null +++ b/samtools/bam_lpileup.c @@ -0,0 +1,225 @@ +/* bam_lpileup.c -- lplbuf routines. + + Copyright (C) 2008, 2009, 2013 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include "bam_plbuf.h" +#include "bam_lpileup.h" +#include "splaysort.h" + +#define TV_GAP 2 + +typedef struct __freenode_t { + uint32_t level:28, cnt:4; + struct __freenode_t *next; +} freenode_t, *freenode_p; + +#define freenode_lt(a,b) ((a)->cnt < (b)->cnt || ((a)->cnt == (b)->cnt && (a)->level < (b)->level)) +SPLAYSORT_INIT(node, freenode_p, freenode_lt) + +/* Memory pool, similar to the one in bam_pileup.c */ +typedef struct { + int cnt, n, max; + freenode_t **buf; +} mempool_t; + +static mempool_t *mp_init(void) +{ + return (mempool_t*)calloc(1, sizeof(mempool_t)); +} +static void mp_destroy(mempool_t *mp) +{ + int k; + for (k = 0; k < mp->n; ++k) free(mp->buf[k]); + free(mp->buf); free(mp); +} +static inline freenode_t *mp_alloc(mempool_t *mp) +{ + ++mp->cnt; + if (mp->n == 0) return (freenode_t*)calloc(1, sizeof(freenode_t)); + else return mp->buf[--mp->n]; +} +static inline void mp_free(mempool_t *mp, freenode_t *p) +{ + --mp->cnt; p->next = 0; p->cnt = TV_GAP; + if (mp->n == mp->max) { + mp->max = mp->max? mp->max<<1 : 256; + mp->buf = (freenode_t**)realloc(mp->buf, sizeof(freenode_t*) * mp->max); + } + mp->buf[mp->n++] = p; +} + +/* core part */ +struct __bam_lplbuf_t { + int max, n_cur, n_pre; + int max_level, *cur_level, *pre_level; + mempool_t *mp; + freenode_t **aux, *head, *tail; + int n_nodes, m_aux; + bam_pileup_f func; + void *user_data; + bam_plbuf_t *plbuf; +}; + +void bam_lplbuf_reset(bam_lplbuf_t *buf) +{ + freenode_t *p, *q; + bam_plbuf_reset(buf->plbuf); + for (p = buf->head; p->next;) { + q = p->next; + mp_free(buf->mp, p); + p = q; + } + buf->head = buf->tail; + buf->max_level = 0; + buf->n_cur = buf->n_pre = 0; + buf->n_nodes = 0; +} + +static int tview_func(uint32_t tid, hts_pos_t pos, int n, const bam_pileup1_t *pl, void *data) +{ + bam_lplbuf_t *tv = (bam_lplbuf_t*)data; + freenode_t *p; + int i, l, max_level; + // allocate memory if necessary + if (tv->max < n) { // enlarge + tv->max = n; + kroundup32(tv->max); + tv->cur_level = (int*)realloc(tv->cur_level, sizeof(int) * tv->max); + tv->pre_level = (int*)realloc(tv->pre_level, sizeof(int) * tv->max); + } + tv->n_cur = n; + // update cnt + for (p = tv->head; p->next; p = p->next) + if (p->cnt > 0) --p->cnt; + // calculate cur_level[] + max_level = 0; + for (i = l = 0; i < n; ++i) { + const bam_pileup1_t *p = pl + i; + if (p->is_head) { + if (tv->head->next && tv->head->cnt == 0) { // then take a free slot + freenode_t *p = tv->head->next; + tv->cur_level[i] = tv->head->level; + mp_free(tv->mp, tv->head); + tv->head = p; + --tv->n_nodes; + } else tv->cur_level[i] = ++tv->max_level; + } else { + tv->cur_level[i] = tv->pre_level[l++]; + if (p->is_tail) { // then return a free slot + tv->tail->level = tv->cur_level[i]; + tv->tail->next = mp_alloc(tv->mp); + tv->tail = tv->tail->next; + ++tv->n_nodes; + } + } + if (tv->cur_level[i] > max_level) max_level = tv->cur_level[i]; + ((bam_pileup1_t*)p)->level = tv->cur_level[i]; + } + assert(l == tv->n_pre); + tv->func(tid, pos, n, pl, tv->user_data); + // sort the linked list + if (tv->n_nodes) { + freenode_t *q; + if (tv->n_nodes + 1 > tv->m_aux) { // enlarge + tv->m_aux = tv->n_nodes + 1; + kroundup32(tv->m_aux); + tv->aux = (freenode_t**)realloc(tv->aux, sizeof(freenode_t*) * tv->m_aux); + } + for (p = tv->head, i = l = 0; p->next;) { + if (p->level > max_level) { // then discard this entry + q = p->next; + mp_free(tv->mp, p); + p = q; + } else { + tv->aux[i++] = p; + p = p->next; + } + } + tv->aux[i] = tv->tail; // add a proper tail for the loop below + tv->n_nodes = i; + if (tv->n_nodes) { + splaysort(node, tv->n_nodes, tv->aux); + for (i = 0; i < tv->n_nodes; ++i) tv->aux[i]->next = tv->aux[i+1]; + tv->head = tv->aux[0]; + } else tv->head = tv->tail; + } + // clean up + tv->max_level = max_level; + memcpy(tv->pre_level, tv->cur_level, tv->n_cur * 4); + // squeeze out terminated levels + for (i = l = 0; i < n; ++i) { + const bam_pileup1_t *p = pl + i; + if (!p->is_tail) + tv->pre_level[l++] = tv->pre_level[i]; + } + tv->n_pre = l; +/* + fprintf(stderr, "%d\t", pos+1); + for (i = 0; i < n; ++i) { + const bam_pileup1_t *p = pl + i; + if (p->is_head) fprintf(stderr, "^"); + if (p->is_tail) fprintf(stderr, "$"); + fprintf(stderr, "%d,", p->level); + } + fprintf(stderr, "\n"); +*/ + return 0; +} + +bam_lplbuf_t *bam_lplbuf_init(bam_pileup_f func, void *data) +{ + bam_lplbuf_t *tv; + tv = (bam_lplbuf_t*)calloc(1, sizeof(bam_lplbuf_t)); + tv->mp = mp_init(); + tv->head = tv->tail = mp_alloc(tv->mp); + tv->func = func; + tv->user_data = data; + tv->plbuf = bam_plbuf_init(tview_func, tv); + return (bam_lplbuf_t*)tv; +} + +void bam_lplbuf_destroy(bam_lplbuf_t *tv) +{ + freenode_t *p, *q; + free(tv->cur_level); free(tv->pre_level); + bam_plbuf_destroy(tv->plbuf); + free(tv->aux); + for (p = tv->head; p->next;) { + q = p->next; + mp_free(tv->mp, p); p = q; + } + mp_free(tv->mp, p); + assert(tv->mp->cnt == 0); + mp_destroy(tv->mp); + free(tv); +} + +int bam_lplbuf_push(const bam1_t *b, bam_lplbuf_t *tv) +{ + return bam_plbuf_push(b, tv->plbuf); +} diff --git a/samtools/bam_lpileup.c.pysam.c b/samtools/bam_lpileup.c.pysam.c new file mode 100644 index 0000000..ea76417 --- /dev/null +++ b/samtools/bam_lpileup.c.pysam.c @@ -0,0 +1,227 @@ +#include "samtools.pysam.h" + +/* bam_lpileup.c -- lplbuf routines. + + Copyright (C) 2008, 2009, 2013 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include "bam_plbuf.h" +#include "bam_lpileup.h" +#include "splaysort.h" + +#define TV_GAP 2 + +typedef struct __freenode_t { + uint32_t level:28, cnt:4; + struct __freenode_t *next; +} freenode_t, *freenode_p; + +#define freenode_lt(a,b) ((a)->cnt < (b)->cnt || ((a)->cnt == (b)->cnt && (a)->level < (b)->level)) +SPLAYSORT_INIT(node, freenode_p, freenode_lt) + +/* Memory pool, similar to the one in bam_pileup.c */ +typedef struct { + int cnt, n, max; + freenode_t **buf; +} mempool_t; + +static mempool_t *mp_init(void) +{ + return (mempool_t*)calloc(1, sizeof(mempool_t)); +} +static void mp_destroy(mempool_t *mp) +{ + int k; + for (k = 0; k < mp->n; ++k) free(mp->buf[k]); + free(mp->buf); free(mp); +} +static inline freenode_t *mp_alloc(mempool_t *mp) +{ + ++mp->cnt; + if (mp->n == 0) return (freenode_t*)calloc(1, sizeof(freenode_t)); + else return mp->buf[--mp->n]; +} +static inline void mp_free(mempool_t *mp, freenode_t *p) +{ + --mp->cnt; p->next = 0; p->cnt = TV_GAP; + if (mp->n == mp->max) { + mp->max = mp->max? mp->max<<1 : 256; + mp->buf = (freenode_t**)realloc(mp->buf, sizeof(freenode_t*) * mp->max); + } + mp->buf[mp->n++] = p; +} + +/* core part */ +struct __bam_lplbuf_t { + int max, n_cur, n_pre; + int max_level, *cur_level, *pre_level; + mempool_t *mp; + freenode_t **aux, *head, *tail; + int n_nodes, m_aux; + bam_pileup_f func; + void *user_data; + bam_plbuf_t *plbuf; +}; + +void bam_lplbuf_reset(bam_lplbuf_t *buf) +{ + freenode_t *p, *q; + bam_plbuf_reset(buf->plbuf); + for (p = buf->head; p->next;) { + q = p->next; + mp_free(buf->mp, p); + p = q; + } + buf->head = buf->tail; + buf->max_level = 0; + buf->n_cur = buf->n_pre = 0; + buf->n_nodes = 0; +} + +static int tview_func(uint32_t tid, hts_pos_t pos, int n, const bam_pileup1_t *pl, void *data) +{ + bam_lplbuf_t *tv = (bam_lplbuf_t*)data; + freenode_t *p; + int i, l, max_level; + // allocate memory if necessary + if (tv->max < n) { // enlarge + tv->max = n; + kroundup32(tv->max); + tv->cur_level = (int*)realloc(tv->cur_level, sizeof(int) * tv->max); + tv->pre_level = (int*)realloc(tv->pre_level, sizeof(int) * tv->max); + } + tv->n_cur = n; + // update cnt + for (p = tv->head; p->next; p = p->next) + if (p->cnt > 0) --p->cnt; + // calculate cur_level[] + max_level = 0; + for (i = l = 0; i < n; ++i) { + const bam_pileup1_t *p = pl + i; + if (p->is_head) { + if (tv->head->next && tv->head->cnt == 0) { // then take a free slot + freenode_t *p = tv->head->next; + tv->cur_level[i] = tv->head->level; + mp_free(tv->mp, tv->head); + tv->head = p; + --tv->n_nodes; + } else tv->cur_level[i] = ++tv->max_level; + } else { + tv->cur_level[i] = tv->pre_level[l++]; + if (p->is_tail) { // then return a free slot + tv->tail->level = tv->cur_level[i]; + tv->tail->next = mp_alloc(tv->mp); + tv->tail = tv->tail->next; + ++tv->n_nodes; + } + } + if (tv->cur_level[i] > max_level) max_level = tv->cur_level[i]; + ((bam_pileup1_t*)p)->level = tv->cur_level[i]; + } + assert(l == tv->n_pre); + tv->func(tid, pos, n, pl, tv->user_data); + // sort the linked list + if (tv->n_nodes) { + freenode_t *q; + if (tv->n_nodes + 1 > tv->m_aux) { // enlarge + tv->m_aux = tv->n_nodes + 1; + kroundup32(tv->m_aux); + tv->aux = (freenode_t**)realloc(tv->aux, sizeof(freenode_t*) * tv->m_aux); + } + for (p = tv->head, i = l = 0; p->next;) { + if (p->level > max_level) { // then discard this entry + q = p->next; + mp_free(tv->mp, p); + p = q; + } else { + tv->aux[i++] = p; + p = p->next; + } + } + tv->aux[i] = tv->tail; // add a proper tail for the loop below + tv->n_nodes = i; + if (tv->n_nodes) { + splaysort(node, tv->n_nodes, tv->aux); + for (i = 0; i < tv->n_nodes; ++i) tv->aux[i]->next = tv->aux[i+1]; + tv->head = tv->aux[0]; + } else tv->head = tv->tail; + } + // clean up + tv->max_level = max_level; + memcpy(tv->pre_level, tv->cur_level, tv->n_cur * 4); + // squeeze out terminated levels + for (i = l = 0; i < n; ++i) { + const bam_pileup1_t *p = pl + i; + if (!p->is_tail) + tv->pre_level[l++] = tv->pre_level[i]; + } + tv->n_pre = l; +/* + fprintf(samtools_stderr, "%d\t", pos+1); + for (i = 0; i < n; ++i) { + const bam_pileup1_t *p = pl + i; + if (p->is_head) fprintf(samtools_stderr, "^"); + if (p->is_tail) fprintf(samtools_stderr, "$"); + fprintf(samtools_stderr, "%d,", p->level); + } + fprintf(samtools_stderr, "\n"); +*/ + return 0; +} + +bam_lplbuf_t *bam_lplbuf_init(bam_pileup_f func, void *data) +{ + bam_lplbuf_t *tv; + tv = (bam_lplbuf_t*)calloc(1, sizeof(bam_lplbuf_t)); + tv->mp = mp_init(); + tv->head = tv->tail = mp_alloc(tv->mp); + tv->func = func; + tv->user_data = data; + tv->plbuf = bam_plbuf_init(tview_func, tv); + return (bam_lplbuf_t*)tv; +} + +void bam_lplbuf_destroy(bam_lplbuf_t *tv) +{ + freenode_t *p, *q; + free(tv->cur_level); free(tv->pre_level); + bam_plbuf_destroy(tv->plbuf); + free(tv->aux); + for (p = tv->head; p->next;) { + q = p->next; + mp_free(tv->mp, p); p = q; + } + mp_free(tv->mp, p); + assert(tv->mp->cnt == 0); + mp_destroy(tv->mp); + free(tv); +} + +int bam_lplbuf_push(const bam1_t *b, bam_lplbuf_t *tv) +{ + return bam_plbuf_push(b, tv->plbuf); +} diff --git a/samtools/bam_lpileup.h b/samtools/bam_lpileup.h new file mode 100644 index 0000000..97c7324 --- /dev/null +++ b/samtools/bam_lpileup.h @@ -0,0 +1,57 @@ +/* bam_lpileup.h -- lplbuf routines (declarations copied from bam.h). + + Copyright (C) 2008, 2013 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef BAM_LPILEUP_H +#define BAM_LPILEUP_H + + +#include + +struct __bam_lplbuf_t; +typedef struct __bam_lplbuf_t bam_lplbuf_t; + +#ifndef BAM_PILEUP_F_DEFINED +#define BAM_PILEUP_F_DEFINED +typedef int (*bam_pileup_f)(uint32_t tid, hts_pos_t pos, int n, const bam_pileup1_t *pl, void *data); +#endif //BAM_PILEUP_F_DEFINED + + +#ifdef __cplusplus +extern "C" { +#endif + void bam_lplbuf_reset(bam_lplbuf_t *buf); + + /*! @abstract bam_plbuf_init() equivalent with level calculated. */ + bam_lplbuf_t *bam_lplbuf_init(bam_pileup_f func, void *data); + + /*! @abstract bam_plbuf_destroy() equivalent with level calculated. */ + void bam_lplbuf_destroy(bam_lplbuf_t *tv); + + /*! @abstract bam_plbuf_push() equivalent with level calculated. */ + int bam_lplbuf_push(const bam1_t *b, bam_lplbuf_t *buf); +#ifdef __cplusplus +} +#endif + +#endif // BAM_LPILEUP_H diff --git a/samtools/bam_markdup.c b/samtools/bam_markdup.c new file mode 100644 index 0000000..be9b195 --- /dev/null +++ b/samtools/bam_markdup.c @@ -0,0 +1,2280 @@ +/* bam_markdup.c -- Mark duplicates from a coord sorted file that has gone + through fixmates with the mate scoring option on. + + Copyright (C) 2017-2022 Genome Research Ltd. + + Author: Andrew Whitwham + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE + +Estimate library size derived from Picard DuplicationMetrics.java +Copyright (c) 2009,2018 The Broad Institute. MIT license. +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "htslib/thread_pool.h" +#include "htslib/sam.h" +#include "sam_opts.h" +#include "samtools.h" +#include "htslib/khash.h" +#include "htslib/klist.h" +#include "htslib/kstring.h" +#include "tmp_file.h" +#include "bam.h" + + +typedef struct { + samFile *in; + samFile *out; + char *prefix; + int remove_dups; + int32_t max_length; + int do_stats; + int supp; + int tag; + int opt_dist; + int no_pg; + int clear; + int mode; + int write_index; + int include_fails; + int check_chain; + char *stats_file; + char *arg_list; + char *out_fn; + regex_t *rgx; + int rgx_x; + int rgx_y; + int rgx_t; + char *barcode; + regex_t *bc_rgx; +} md_param_t; + +typedef struct { + hts_pos_t this_coord; + hts_pos_t other_coord; + int32_t this_ref; + int32_t other_ref; + int32_t barcode; + int8_t single; + int8_t leftmost; + int8_t orientation; +} key_data_t; + +typedef struct read_queue_s { + key_data_t pair_key; + key_data_t single_key; + bam1_t *b; + struct read_queue_s *duplicate; + hts_pos_t pos; + int dup_checked; +} read_queue_t; + +typedef struct { + read_queue_t *p; +} in_hash_t; + +typedef struct { + char *name; + char type; +} dup_map_t; + +typedef struct { + bam1_t *b; + int64_t score; + int64_t mate_score; + long x; + long y; + int opt; + int beg; + int end; +} check_t; + + +typedef struct { + check_t *c; + size_t size; + size_t length; +} check_list_t; + +static khint32_t do_hash(unsigned char *key, khint32_t len); + +static khint_t hash_key(key_data_t key) { + int i = 0; + khint_t hash; + + if (key.single) { + unsigned char sig[17]; + + memcpy(sig + i, &key.this_ref, 4); i += 4; + memcpy(sig + i, &key.this_coord, 8); i += 8; + memcpy(sig + i, &key.orientation, 1); i += 1; + memcpy(sig + i, &key.barcode, 4); i += 4; + + hash = do_hash(sig, i); + } else { + unsigned char sig[30]; + + memcpy(sig + i, &key.this_ref, 4); i += 4; + memcpy(sig + i, &key.this_coord, 8); i += 8; + memcpy(sig + i, &key.other_ref, 4); i += 4; + memcpy(sig + i, &key.other_coord, 8); i += 8; + memcpy(sig + i, &key.leftmost, 1); i += 1; + memcpy(sig + i, &key.orientation, 1); i += 1; + memcpy(sig + i, &key.barcode, 4); i += 4; + + hash = do_hash(sig, i); + } + + return hash; +} + + +static int key_equal(key_data_t a, key_data_t b) { + int match = 1; + + if (a.this_coord != b.this_coord) + match = 0; + else if (a.orientation != b.orientation) + match = 0; + else if (a.this_ref != b.this_ref) + match = 0; + else if (a.single != b.single) + match = 0; + else if (a.barcode != b.barcode) + match = 0; + + if (!a.single) { + if (a.other_coord != b.other_coord) + match = 0; + else if (a.leftmost != b.leftmost) + match = 0; + else if (a.other_ref != b.other_ref) + match = 0; + } + + return match; +} + + +#define __free_queue_element(p) + +// Orientations (prime numbers to feed to hashing algorithm) +#define O_FF 2 +#define O_RR 3 +#define O_FR 5 +#define O_RF 7 + +// Left or rightmost +#define R_LE 11 +#define R_RI 13 + +#define BMD_WARNING_MAX 10 + +#define MD_MIN_QUALITY 15 + +// Duplicate finding mode +#define MD_MODE_TEMPLATE 0 +#define MD_MODE_SEQUENCE 1 + +KHASH_INIT(reads, key_data_t, in_hash_t, 1, hash_key, key_equal) // read map hash +KLIST_INIT(read_queue, read_queue_t, __free_queue_element) // the reads buffer +KHASH_MAP_INIT_STR(duplicates, dup_map_t) // map of duplicates for supplementary dup id + +/* The Bob Jenkins one_at_a_time hash to reduce the key to a 32 bit value. */ + +static khint32_t do_hash(unsigned char *key, khint32_t len) { + khint32_t hash, i; + + for (hash = 0, i = 0; i < len; ++i) { + hash += key[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + + return hash; +} + + +/* Get mate score from tag. */ + +static int64_t get_mate_score(bam1_t *b) { + uint8_t *data; + int64_t score; + + if ((data = bam_aux_get(b, "ms"))) { + score = bam_aux2i(data); + } else { + fprintf(stderr, "[markdup] error: no ms score tag. Please run samtools fixmate on file first.\n"); + return -1; + } + + return score; +} + + +/* Calc current score from quality. */ + +static int64_t calc_score(bam1_t *b) +{ + int64_t score = 0; + uint8_t *qual = bam_get_qual(b); + int i; + + for (i = 0; i < b->core.l_qseq; i++) { + if (qual[i] >= MD_MIN_QUALITY) score += qual[i]; + } + + return score; +} + + +/* Create a signature hash of the current read and its pair. + Uses the unclipped start (or end depending on orientation), + the reference id, orientation and whether the current + read is leftmost of the pair. */ + + +static int make_pair_key(md_param_t *param, key_data_t *key, bam1_t *bam, long *warnings) { + hts_pos_t this_coord, this_end, other_coord, other_end, leftmost; + int32_t this_ref, other_ref, barcode = 0; + int8_t orientation, left_read; + uint8_t *data; + char *cig, *bar; + long incoming_warnings = *warnings; + + this_ref = bam->core.tid + 1; // avoid a 0 being put into the hash + other_ref = bam->core.mtid + 1; + + this_coord = unclipped_start(bam); + this_end = unclipped_end(bam); + + if ((data = bam_aux_get(bam, "MC"))) { + if (!(cig = bam_aux2Z(data))) { + fprintf(stderr, "[markdup] error: MC tag wrong type. Please use the MC tag provided by samtools fixmate.\n"); + return 1; + } + + other_end = unclipped_other_end(bam->core.mpos, cig); + other_coord = unclipped_other_start(bam->core.mpos, cig); + } else { + fprintf(stderr, "[markdup] error: no MC tag. Please run samtools fixmate on file first.\n"); + return 1; + } + + // work out orientations + if (param->mode == MD_MODE_TEMPLATE) { + + if (this_ref != other_ref) { + leftmost = this_ref < other_ref; + } else { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + if (!bam_is_rev(bam)) { + leftmost = this_coord <= other_coord; + } else { + leftmost = this_end <= other_end; + } + } else { + if (bam_is_rev(bam)) { + leftmost = this_end <= other_coord; + } else { + leftmost = this_coord <= other_end; + } + } + } + + // pair orientation + if (leftmost) { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + other_coord = other_end; + + if (!bam_is_rev(bam)) { + if (bam->core.flag & BAM_FREAD1) { + orientation = O_FF; + } else { + orientation = O_RR; + } + } else { + if (bam->core.flag & BAM_FREAD1) { + orientation = O_RR; + } else { + orientation = O_FF; + } + } + } else { + if (!bam_is_rev(bam)) { + orientation = O_FR; + other_coord = other_end; + } else { + orientation = O_RF; + this_coord = this_end; + } + } + } else { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + this_coord = this_end; + + if (!bam_is_rev(bam)) { + if (bam->core.flag & BAM_FREAD1) { + orientation = O_RR; + } else { + orientation = O_FF; + } + } else { + if (bam->core.flag & BAM_FREAD1) { + orientation = O_FF; + } else { + orientation = O_RR; + } + } + } else { + if (!bam_is_rev(bam)) { + orientation = O_RF; + other_coord = other_end; + } else { + orientation = O_FR; + this_coord = this_end; + } + } + } + } else { // MD_MODE_SEQUENCE + + if (this_ref != other_ref) { + leftmost = this_ref - other_ref; + } else { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + if (!bam_is_rev(bam)) { + leftmost = this_coord - other_coord; + } else { + leftmost = this_end - other_end; + } + } else { + if (bam_is_rev(bam)) { + leftmost = this_end - other_coord; + } else { + leftmost = this_coord - other_end; + } + } + } + + if (leftmost < 0) { + leftmost = 1; + } else if (leftmost > 0) { + leftmost = 0; + } else { + // tie breaks + + if (bam->core.pos == bam->core.mpos) { + if (bam->core.flag & BAM_FREAD1) { + leftmost = 1; + } else { + leftmost = 0; + } + } else if (bam->core.pos < bam->core.mpos) { + leftmost = 1; + } else { + leftmost = 0; + } + } + + // pair orientation + if (leftmost) { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + + if (!bam_is_rev(bam)) { + orientation = O_FF; + } else { + orientation = O_RR; + } + } else { + if (!bam_is_rev(bam)) { + orientation = O_FR; + } else { + orientation = O_RF; + } + } + } else { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + + if (!bam_is_rev(bam)) { + orientation = O_RR; + } else { + orientation = O_FF; + } + } else { + if (!bam_is_rev(bam)) { + orientation = O_RF; + } else { + orientation = O_FR; + } + } + } + + if (!bam_is_rev(bam)) { + this_coord = unclipped_start(bam); + } else { + this_coord = unclipped_end(bam); + } + + if (!bam_is_mrev(bam)) { + other_coord = unclipped_other_start(bam->core.mpos, cig); + } else { + other_coord = unclipped_other_end(bam->core.mpos, cig); + } + } + + if (!leftmost) + left_read = R_RI; + else + left_read = R_LE; + + if (param->barcode) { + if ((data = bam_aux_get(bam, param->barcode))) { + if (!(bar = bam_aux2Z(data))) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: %s tag wrong type. Aux tag needs to be a string type.\n", param->barcode); + } + } else { + barcode = do_hash((unsigned char *)bar, strlen(bar)); + } + } + } else if (param->bc_rgx) { + int result; + regmatch_t matches[3]; + size_t max_matches = 2; + char *qname = bam_get_qname(bam); + + if ((result = regexec(param->bc_rgx, qname, max_matches, matches, 0)) == 0) { + int bc_start, bc_end; + + bc_start = matches[1].rm_so; + bc_end = matches[1].rm_eo; + + if (bc_start != -1) { + barcode = do_hash((unsigned char *)qname + bc_start, bc_end - bc_start); + } else { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: barcode regex unable to match substring on %s.\n", qname); + } + } + } else { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + char warn_msg[256]; + + regerror(result, param->bc_rgx, warn_msg, 256); + fprintf(stderr, "[markdup] warning: barcode regex match error \"%s\" on %s.\n", warn_msg, qname); + } + } + } + + if ((*warnings == BMD_WARNING_MAX) && (incoming_warnings != *warnings)) { + fprintf(stderr, "[markdup] warning: %ld barcode read warnings. New warnings will not be reported.\n", + *warnings); + } + + key->single = 0; + key->this_ref = this_ref; + key->this_coord = this_coord; + key->other_ref = other_ref; + key->other_coord = other_coord; + key->leftmost = left_read; + key->orientation = orientation; + key->barcode = barcode; + + return 0; +} + + +/* Create a signature hash of single read (or read with an unmatched pair). + Uses unclipped start (or end depending on orientation), reference id, + and orientation. */ + +static void make_single_key(md_param_t *param, key_data_t *key, bam1_t *bam, long *warnings) { + hts_pos_t this_coord; + int32_t this_ref, barcode = 0; + int8_t orientation; + uint8_t *data; + char *bar; + long incoming_warnings = *warnings; + + this_ref = bam->core.tid + 1; // avoid a 0 being put into the hash + + if (bam_is_rev(bam)) { + this_coord = unclipped_end(bam); + orientation = O_RR; + } else { + this_coord = unclipped_start(bam); + orientation = O_FF; + } + + if (param->barcode) { + if ((data = bam_aux_get(bam, param->barcode))) { + if (!(bar = bam_aux2Z(data))) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: %s tag wrong type. Aux tag needs to be a string type.\n", param->barcode); + } + } else { + barcode = do_hash((unsigned char *)bar, strlen(bar)); + } + } + } else if (param->bc_rgx) { + int result; + regmatch_t matches[3]; + size_t max_matches = 2; + char *qname = bam_get_qname(bam); + + if ((result = regexec(param->bc_rgx, qname, max_matches, matches, 0)) == 0) { + int bc_start, bc_end; + + bc_start = matches[1].rm_so; + bc_end = matches[1].rm_eo; + + if (bc_start != -1) { + barcode = do_hash((unsigned char *)qname + bc_start, bc_end - bc_start); + } else { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: barcode regex unable to match substring on %s.\n", qname); + } + } + } else { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + char warn_msg[256]; + + regerror(result, param->bc_rgx, warn_msg, 256); + fprintf(stderr, "[markdup] warning: barcode regex match error \"%s\" on %s.\n", warn_msg, qname); + } + } + } + + if ((*warnings == BMD_WARNING_MAX) && (incoming_warnings != *warnings)) { + fprintf(stderr, "[markdup] warning: %ld barcode read warnings. New warnings will not be reported.\n", + *warnings); + } + + key->single = 1; + key->this_ref = this_ref; + key->this_coord = this_coord; + key->orientation = orientation; + key->barcode = barcode; +} + + +/* Add the duplicate name to a hash if it does not exist. */ + +static int add_duplicate(khash_t(duplicates) *d_hash, bam1_t *dupe, char *orig_name, char type) { + khiter_t d; + int ret; + + d = kh_get(duplicates, d_hash, bam_get_qname(dupe)); + + if (d == kh_end(d_hash)) { + char *name = strdup(bam_get_qname(dupe)); + if (name) { + d = kh_put(duplicates, d_hash, name, &ret); + } else { + ret = -1; + } + + if (ret >= 0) { + if (orig_name) { + if (ret == 0) { + // replace old name + free(kh_value(d_hash, d).name); + free(name); + } + + kh_value(d_hash, d).name = strdup(orig_name); + + if (kh_value(d_hash, d).name == NULL) { + fprintf(stderr, "[markdup] error: unable to allocate memory for duplicate original name.\n"); + return 1; + } + } else { + kh_value(d_hash, d).name = NULL; + } + + kh_value(d_hash, d).type = type; + } else { + fprintf(stderr, "[markdup] error: unable to store supplementary duplicates.\n"); + free(name); + return 1; + } + } + + return 0; +} + + +/* Get coordinates from the standard Illumina style read names. + Returned values are of the x and y coordinates and a section of + the read name to test (t) for string equality e.g. lane and tile part. */ + +static int get_coordinates_colons(md_param_t *param, const char *qname, int *t_beg, int *t_end, long *x_coord, long *y_coord, long *warnings) { + int sep = 0; + int pos = 0; + int xpos = 0, ypos = 0; + char *end; + + while (qname[pos]) { + if (qname[pos] == ':') { + sep++; + + if (sep == 2) { + xpos = pos + 1; + } else if (sep == 3) { + ypos = pos + 1; + } else if (sep == 4) { // HiSeq style names + xpos = ypos; + ypos = pos + 1; + } else if (sep == 5) { // Newer Illumina format + xpos = pos + 1; + } else if (sep == 6) { + ypos = pos + 1; + } + } + + pos++; + } + + /* The most current Illumina read format at time of writing is: + @machine:run:flowcell:lane:tile:x:y:UMI or + @machine:run:flowcell:lane:tile:x:y + + Counting the separating colons gives us a quick format check. + Older name formats have fewer elements. + */ + + if (!(sep == 3 || sep == 4 || sep == 6 || sep == 7)) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: cannot decipher read name %s for optical duplicate marking.\n", qname); + } + + return 1; + } else { + *x_coord = strtol(qname + xpos, &end, 10); + + if ((qname + xpos) == end) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: cannot decipher x coordinate in %s .\n", qname); + } + + return 1; + } + + *y_coord = strtol(qname + ypos, &end, 10); + + if ((qname + ypos) == end) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: cannot decipher y coordinate in %s .\n", qname); + } + + return 1; + } + + *t_beg = 0; + *t_end = xpos; + } + + return 0; +} + +/* Get the coordinates from the read name. + Returned values are of the x and y coordinates and an optional section of + the read name to test (t) for string equality e.g. lane and tile part. */ + +static inline int get_coordinates_regex(md_param_t *param, const char *qname, int *t_beg, int *t_end, long *x_coord, long *y_coord, long *warnings) { + regmatch_t matches[5]; + size_t max_matches = 5; + int xpos, ypos, xend, yend, xlen, ylen; + char coord[255]; + char *end; + + if (!param->rgx_t) + max_matches = 4; + + if (regexec(param->rgx, qname, max_matches, matches, 0)) + return -1; + + xpos = matches[param->rgx_x].rm_so; + ypos = matches[param->rgx_y].rm_so; + + if (param->rgx_t) { + *t_beg = matches[param->rgx_t].rm_so; + *t_end = matches[param->rgx_t].rm_eo; + } else { + *t_beg = *t_end = 0; + } + + if (xpos == -1 || ypos == -1 || *t_beg == -1) + return -1; + + xend = matches[param->rgx_x].rm_eo; + yend = matches[param->rgx_y].rm_eo; + + if ((xlen = xend - xpos) > 254) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: x coordinate string longer than allowed qname length in %s (%d long).\n", qname, xlen); + } + + return 1; + } + + strncpy(coord, qname + xpos, xlen); + coord[xlen] = '\0'; + *x_coord = strtol(coord, &end, 10); + + if (coord == end) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: cannot decipher x coordinate in %s (%s).\n", qname, coord); + } + + return 1; + } + + if ((ylen = yend - ypos) > 254) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: y coordinate string longer than allowed qname length in %s (%d long).\n", qname, ylen); + } + + return 1; + } + + strncpy(coord, qname + ypos, ylen); + coord[ylen] = '\0'; + *y_coord = strtol(coord, &end, 10); + + if (coord == end) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(stderr, "[markdup] warning: cannot decipher y coordinate in %s (%s).\n", qname, coord); + } + + return 1; + } + + return 0; +} + + +static int get_coordinates(md_param_t *param, const char *name, int *t_beg, int *t_end, long *x_coord, long *y_coord, long *warnings) { + int ret = 1; + + if (param->rgx == NULL) { + ret = get_coordinates_colons(param, name, t_beg, t_end, x_coord, y_coord, warnings); + } else { + ret = get_coordinates_regex(param, name, t_beg, t_end, x_coord, y_coord, warnings); + } + + return ret; +} + + +/* Using the coordinates from the read name, see whether the duplicated read is + close enough (set by max_dist) to the original to be counted as optical.*/ + +static int is_optical_duplicate(md_param_t *param, bam1_t *ori, bam1_t *dup, long max_dist, long *warnings) { + int ret = 0; + char *original, *duplicate; + long ox, oy, dx, dy; + int o_beg = 0, o_end = 0, d_beg = 0, d_end = 0; + + original = bam_get_qname(ori); + duplicate = bam_get_qname(dup); + + if (get_coordinates(param, original, &o_beg, &o_end, &ox, &oy, warnings)) { + return ret; + } + + if (get_coordinates(param, duplicate, &d_beg, &d_end, &dx, &dy, warnings)) { + return ret; + } + + if (strncmp(original + o_beg, duplicate + d_beg, o_end - o_beg) == 0) { + long xdiff, ydiff; + + if (ox > dx) { + xdiff = ox - dx; + } else { + xdiff = dx - ox; + } + + if (xdiff <= max_dist) { + // still might be optical + + if (oy > dy) { + ydiff = oy - dy; + } else { + ydiff = dy - oy; + } + + if (ydiff <= max_dist) ret = 1; + } + } + + return ret; +} + + +/* Using the coordinates from the Illumina read name, see whether the duplicated read is + close enough (set by max_dist) to the original to be counted as optical. + + This function needs the values from the first read to be already calculated. */ + +static int optical_duplicate_partial(md_param_t *param, const char *name, const int o_beg, const int o_end, const long ox, const long oy, bam1_t *dup, check_t *c, long max_dist, long *warnings) { + int ret = 0; + char *duplicate; + int d_beg = 0, d_end = 0; + long dx, dy; + + duplicate = bam_get_qname(dup); + + if (get_coordinates(param, duplicate, &d_beg, &d_end, &dx, &dy, warnings)) { + return ret; + } + + if (strncmp(name + o_beg, duplicate + d_beg, o_end - o_beg) == 0) { + // the initial parts match, look at the numbers + long xdiff, ydiff; + + if (ox > dx) { + xdiff = ox - dx; + } else { + xdiff = dx - ox; + } + + if (xdiff <= max_dist) { + // still might be optical + + if (oy > dy) { + ydiff = oy - dy; + } else { + ydiff = dy - oy; + } + + if (ydiff <= max_dist) ret = 1; + } + } + + c->x = dx; + c->y = dy; + c->beg = d_beg; + c->end = d_end; + + return ret; +} + + +/* Mark the read as a duplicate and update the duplicate hash (if needed) */ +static int mark_duplicates(md_param_t *param, khash_t(duplicates) *dup_hash, bam1_t *ori, bam1_t *dup, + long *optical, long *warn) { + char dup_type = 0; + long incoming_warnings = *warn; + + dup->core.flag |= BAM_FDUP; + + if (param->tag) { + if (bam_aux_update_str(dup, "do", strlen(bam_get_qname(ori)) + 1, bam_get_qname(ori))) { + fprintf(stderr, "[markdup] error: unable to append 'do' tag.\n"); + return -1; + } + } + + if (param->opt_dist) { // mark optical duplicates + if (is_optical_duplicate(param, ori, dup, param->opt_dist, warn)) { + bam_aux_update_str(dup, "dt", 3, "SQ"); + dup_type = 'O'; + (*optical)++; + } else { + // not an optical duplicate + bam_aux_update_str(dup, "dt", 3, "LB"); + } + } + + if ((*warn == BMD_WARNING_MAX) && (incoming_warnings != *warn)) { + fprintf(stderr, "[markdup] warning: %ld decipher read name warnings. New warnings will not be reported.\n", + *warn); + } + + if (param->supp) { + if (bam_aux_get(dup, "SA") || (dup->core.flag & BAM_FMUNMAP) || bam_aux_get(dup, "XA")) { + char *original = NULL; + + if (param->tag) { + original = bam_get_qname(ori); + } + + if (add_duplicate(dup_hash, dup, original, dup_type)) + return -1; + } + } + + return 0; +} + + +/* If the duplicate type has changed to optical then retag and duplicate hash. */ +static inline int optical_retag(md_param_t *param, khash_t(duplicates) *dup_hash, bam1_t *b, int paired, long *optical_single, long *optical_pair) { + int ret = 0; + + if (bam_aux_update_str(b, "dt", 3, "SQ")) { + fprintf(stderr, "[markdup] error: unable to update 'dt' tag.\n"); + ret = -1; + } + + if (paired) { + (*optical_pair)++; + } else { + (*optical_single)++; + } + + if (param->supp) { + // Change the duplicate type + + if (bam_aux_get(b, "SA") || (b->core.flag & BAM_FMUNMAP) + || bam_aux_get(b, "XA")) { + khiter_t d; + + d = kh_get(duplicates, dup_hash, bam_get_qname(b)); + + if (d == kh_end(dup_hash)) { + // error, name should already be in dup hash + fprintf(stderr, "[markdup] error: duplicate name %s not found in hash.\n", + bam_get_qname(b)); + ret = -1; + } else { + kh_value(dup_hash, d).type = 'O'; + } + } + } + + return ret; +} + + +/* Check all duplicates of the highest quality read (the "original") for consistancy. Also + pre-calculate any values for use in check_duplicate_chain later. + Returns 0 on success, >0 on coordinate reading error (program can continue) or + <0 on an error (program should not continue. */ +static int check_chain_against_original(md_param_t *param, khash_t(duplicates) *dup_hash, read_queue_t *ori, + check_list_t *list, long *warn, long *optical_single, long *optical_pair) { + + int ret = 0, coord_fail = 0; + char *ori_name = bam_get_qname(ori->b); + read_queue_t *current = ori->duplicate; + int t_beg = 0, t_end = 0; + long x, y; + + if (param->opt_dist) { + coord_fail = get_coordinates(param, ori_name, &t_beg, &t_end, &x, &y, warn); + } + + list->length = 0; + + while (current) { + check_t *c; + + if (list->length >= list->size) { + check_t *tmp; + + list->size *= 2; + + if (!(tmp = realloc(list->c, list->size * sizeof(check_t)))) { + fprintf(stderr, "[markdup] error: Unable to expand opt check list.\n"); + return -1; + } + + list->c = tmp; + } + + c = &list->c[list->length]; + + c->b = current->b; + c->x = -1; + c->y = -1; + c->opt = 0; + c->score = 0; + c->mate_score = 0; + current->dup_checked = 1; + + if (param->tag) { + uint8_t *data; + + // at this stage all duplicates should have a do tag + if ((data = bam_aux_get(current->b, "do")) != NULL) { + // see if we need to change the tag + char *old_name = bam_aux2Z(data); + + if (old_name) { + if (strcmp(old_name, ori_name) != 0) { + if (bam_aux_update_str(current->b, "do", strlen(ori_name) + 1, (const char *)ori_name)) { + fprintf(stderr, "[markdup] error: unable to update 'do' tag.\n"); + ret = -1; + break; + } + } + } else { + fprintf(stderr, "[markdup] error: 'do' tag has wrong type for read %s.\n", bam_get_qname(current->b)); + ret = -1; + break; + } + } + } + + if (param->opt_dist && !coord_fail) { + uint8_t *data; + char *dup_type; + int is_opt = 0; + int current_paired = (current->b->core.flag & BAM_FPAIRED) && !(current->b->core.flag & BAM_FMUNMAP); + + if ((data = bam_aux_get(current->b, "dt"))) { + if ((dup_type = bam_aux2Z(data))) { + if (strcmp(dup_type, "SQ") == 0) { + c->opt = 1; + } + } + } + + // need to run this to get the duplicates x and y scores + is_opt = optical_duplicate_partial(param, ori_name, t_beg, t_end, x, y, current->b, c, param->opt_dist, warn); + + if (!c->opt && is_opt) { + if (optical_retag(param, dup_hash, current->b, current_paired, optical_single, optical_pair)) { + ret = -1; + break; + } + + c->opt = 1; + } + + c->score = calc_score(current->b); + + if (current_paired) { + if ((c->mate_score = get_mate_score(current->b)) == -1) { + fprintf(stderr, "[markdup] error: no ms score tag. Please run samtools fixmate on file first.\n"); + ret = -1; + break; + } + } + } + + current = current->duplicate; + list->length++; + } + + if (!ret && coord_fail) + ret = coord_fail; + + return ret; +} + + +static int xcoord_sort(const void *a, const void *b) { + check_t *ac = (check_t *) a; + check_t *bc = (check_t *) b; + + return (ac->x - bc->x); +} + + +/* Check all the duplicates against each other to see if they are optical duplicates. */ +static int check_duplicate_chain(md_param_t *param, khash_t(duplicates) *dup_hash, check_list_t *list, + long *warn, long *optical_single, long *optical_pair) { + int ret = 0; + size_t curr = 0; + + qsort(list->c, list->length, sizeof(list->c[0]), xcoord_sort); + + while (curr < list->length - 1) { + check_t *current = &list->c[curr]; + size_t count = curr; + char *cur_name = bam_get_qname(current->b); + int current_paired = (current->b->core.flag & BAM_FPAIRED) && !(current->b->core.flag & BAM_FMUNMAP); + + while (++count < list->length && (list->c[count].x - current->x <= param->opt_dist)) { + // while close enough along the x coordinate + check_t *chk = &list->c[count]; + + if (current->opt && chk->opt) + continue; + + // if both are already optical duplicates there is no need to check again, otherwise... + + long ydiff; + + if (current->y > chk->y) { + ydiff = current->y - chk->y; + } else { + ydiff = chk->y - current->y; + } + + if (ydiff > param->opt_dist) + continue; + + // the number are right, check the names + if (strncmp(cur_name + current->beg, bam_get_qname(chk->b) + chk->beg, current->end - current->beg) != 0) + continue; + + // optical duplicates + int chk_dup = 0; + int chk_paired = (chk->b->core.flag & BAM_FPAIRED) && !(chk->b->core.flag & BAM_FMUNMAP); + + if (current_paired != chk_paired) { + if (!chk_paired) { + // chk is single vs pair, this is a dup. + chk_dup = 1; + } + } else { + // do it by scores + int64_t cur_score, chk_score; + + if ((current->b->core.flag & BAM_FQCFAIL) != (chk->b->core.flag & BAM_FQCFAIL)) { + if (current->b->core.flag & BAM_FQCFAIL) { + cur_score = 0; + chk_score = 1; + } else { + cur_score = 1; + chk_score = 0; + } + } else { + cur_score = current->score; + chk_score = chk->score; + + if (current_paired) { + // they are pairs so add mate scores. + chk_score += chk->mate_score; + cur_score += current->mate_score; + } + } + + if (cur_score == chk_score) { + if (strcmp(bam_get_qname(chk->b), cur_name) < 0) { + chk_score++; + } else { + chk_score--; + } + } + + if (cur_score > chk_score) { + chk_dup = 1; + } + } + + if (chk_dup) { + // the duplicate is the optical duplicate + if (!chk->opt) { // only change if not already an optical duplicate + if (optical_retag(param, dup_hash, chk->b, chk_paired, optical_single, optical_pair)) { + ret = -1; + goto fail; + } + + chk->opt = 1; + } + } else { + if (!current->opt) { + if (optical_retag(param, dup_hash, current->b, current_paired, optical_single, optical_pair)) { + ret = -1; + goto fail; + } + + current->opt = 1; + } + } + } + + curr++; + } + + fail: + return ret; +} + + +/* Where there is more than one duplicate go down the list and check for optical duplicates and change + do tags (where used) to point to original (non-duplicate) read. */ +static int find_duplicate_chains(md_param_t *param, klist_t(read_queue) *read_buffer, khash_t(duplicates) *dup_hash, check_list_t *dup_list, + const hts_pos_t prev_coord, const int32_t prev_tid, long *warn, long *optical_single, + long *optical_pair, const int check_range) { + int ret = 0; + kliter_t(read_queue) *rq; + + rq = kl_begin(read_buffer); + + while (rq != kl_end(read_buffer)) { + read_queue_t *in_read = &kl_val(rq); + + if (check_range) { + /* Just check against the moving window of reads based on coordinates and max read length. */ + if (in_read->pos + param->max_length > prev_coord && in_read->b->core.tid == prev_tid && (prev_tid != -1 || prev_coord != -1)) { + break; + } + } else { + // this is the last set of results and the end entry will be blank + if (!bam_get_qname(in_read->b)) { + break; + } + } + + if (!(in_read->b->core.flag & BAM_FDUP) && in_read->duplicate) { // is the head of a duplicate chain + + // check against the original for tagging and optical duplication + if ((ret = check_chain_against_original(param, dup_hash, in_read, dup_list, warn, optical_single, optical_pair))) { + if (ret < 0) { // real error + ret = -1; + break; + } else { // coordinate decoding error + ret = 0; + in_read->duplicate = NULL; + continue; + } + } + + // check the rest of the duplicates against each other for optical duplication + if (param->opt_dist && check_duplicate_chain(param, dup_hash, dup_list, warn, optical_single, optical_pair)) { + ret = -1; + break; + } + + in_read->duplicate = NULL; + } + + rq = kl_next(rq); + } + + return ret; +} + + +/* + Function to use when estimating library size. + + This is based on an approximate formula for the coverage of a set + obtained after sampling it a given number of times with replacement. + + x = number of items in the set (the number of unique fragments in the library) + + c = number of unique items (unique read pairs observed) + + n = number of items samples (total number of read pairs) + + c and n are known; x is unknown. + + As n -> infinity, the coverage (c/x) can be given as: + + c / x = 1 - exp(-n / x) (see https://math.stackexchange.com/questions/32800) + + This needs to be solved for x, so it is rearranged to put both terms on the + left side and estimate_library_size() finds a value of x which gives a + result of zero (or as close as it can get). + */ +static inline double coverage_equation(double x, double c, double n) { + return c / x - 1 + exp(-n / x); +} + + +/* estimate the library size, based on the Picard code in DuplicationMetrics.java*/ +static unsigned long estimate_library_size(unsigned long paired_reads, unsigned long paired_duplicate_reads, unsigned long optical) { + unsigned long estimated_size = 0; + unsigned long non_optical_pairs = (paired_reads - optical) / 2; + unsigned long unique_pairs = (paired_reads - paired_duplicate_reads) / 2; + unsigned long duplicate_pairs = (paired_duplicate_reads - optical) / 2; + + if ((non_optical_pairs && duplicate_pairs && unique_pairs) && (non_optical_pairs > duplicate_pairs)) { + double m = 1; + double M = 100; + int i; + + if (coverage_equation(m * (double)unique_pairs, (double)unique_pairs, (double)non_optical_pairs) < 0) { + fprintf(stderr, "[markdup] warning: unable to calculate estimated library size.\n"); + return estimated_size; + } + + while (coverage_equation(M * (double)unique_pairs, (double)unique_pairs, (double)non_optical_pairs) > 0) { + M *= 10; + } + + for (i = 0; i < 40; i++) { + double r = (m + M) / 2; + double u = coverage_equation(r * (double)unique_pairs, (double)unique_pairs, (double)non_optical_pairs); + + if (u > 0) { + m = r; + } else if (u < 0) { + M = r; + } else { + break; + } + } + + estimated_size = (unsigned long)(unique_pairs * (m + M) / 2); + } else { + fprintf(stderr, "[markdup] warning: unable to calculate estimated library size." + " Read pairs %ld should be greater than duplicate pairs %ld," + " which should both be non zero.\n", + non_optical_pairs, duplicate_pairs); + } + + return estimated_size; +} + + +/* Compare the reads near each other (coordinate sorted) and try to spot the duplicates. + Generally the highest quality scoring is chosen as the original and all others the duplicates. + The score is based on the sum of the quality values (<= 15) of the read and its mate (if any). + While single reads are compared to only one read of a pair, the pair will chosen as the original. + The comparison is done on position and orientation, see above for details. + + Marking the supplementary reads of a duplicate as also duplicates takes an extra file read/write + step. This is because the duplicate can occur before the primary read.*/ + +static int bam_mark_duplicates(md_param_t *param) { + bam_hdr_t *header = NULL; + khiter_t k; + khash_t(reads) *pair_hash = kh_init(reads); + khash_t(reads) *single_hash = kh_init(reads); + klist_t(read_queue) *read_buffer = kl_init(read_queue); + kliter_t(read_queue) *rq; + khash_t(duplicates) *dup_hash = kh_init(duplicates); + int32_t prev_tid; + hts_pos_t prev_coord; + read_queue_t *in_read; + int ret; + long reading, writing, excluded, duplicate, single, pair, single_dup, examined, optical, single_optical; + long np_duplicate, np_opt_duplicate; + long opt_warnings = 0, bc_warnings = 0; + tmp_file_t temp; + char *idx_fn = NULL; + int exclude = 0; + check_list_t dup_list = {NULL, 0, 0}; + + if (!pair_hash || !single_hash || !read_buffer || !dup_hash) { + fprintf(stderr, "[markdup] out of memory\n"); + goto fail; + } + + if ((header = sam_hdr_read(param->in)) == NULL) { + fprintf(stderr, "[markdup] error reading header\n"); + goto fail; + } + + // accept unknown, unsorted or coordinate sort order, but error on queryname sorted. + // only really works on coordinate sorted files. + kstring_t str = KS_INITIALIZE; + if (!sam_hdr_find_tag_hd(header, "SO", &str) && str.s && !strcmp(str.s, "queryname")) { + fprintf(stderr, "[markdup] error: queryname sorted, must be sorted by coordinate.\n"); + ks_free(&str); + goto fail; + } + ks_free(&str); + + if (!param->no_pg && sam_hdr_add_pg(header, "samtools", "VN", samtools_version(), + param->arg_list ? "CL" : NULL, + param->arg_list ? param->arg_list : NULL, + NULL) != 0) { + fprintf(stderr, "[markdup] warning: unable to add @PG line to header.\n"); + } + + if (sam_hdr_write(param->out, header) < 0) { + fprintf(stderr, "[markdup] error writing header.\n"); + goto fail; + } + if (param->write_index) { + if (!(idx_fn = auto_index(param->out, param->out_fn, header))) + goto fail; + } + + // used for coordinate order checks + prev_tid = prev_coord = 0; + + // get the buffer going + in_read = kl_pushp(read_queue, read_buffer); + if (!in_read) { + fprintf(stderr, "[markdup] out of memory\n"); + goto fail; + } + + // handling supplementary reads needs a temporary file + if (param->supp) { + if (tmp_file_open_write(&temp, param->prefix, 1)) { + fprintf(stderr, "[markdup] error: unable to open tmp file %s.\n", param->prefix); + goto fail; + } + } + + if ((in_read->b = bam_init1()) == NULL) { + fprintf(stderr, "[markdup] error: unable to allocate memory for alignment.\n"); + goto fail; + } + + if (param->check_chain && !(param->tag || param->opt_dist)) + param->check_chain = 0; + + if (param->check_chain) { + dup_list.size = 128; + dup_list.c = NULL; + + if ((dup_list.c = malloc(dup_list.size * sizeof(check_t))) == NULL) { + fprintf(stderr, "[markdup] error: unable to allocate memory for dup_list.\n"); + goto fail; + } + } + + reading = writing = excluded = single_dup = duplicate = examined = pair = single = optical = single_optical = 0; + np_duplicate = np_opt_duplicate = 0; + + while ((ret = sam_read1(param->in, header, in_read->b)) >= 0) { + int dup_checked = 0; + + // do some basic coordinate order checks + if (in_read->b->core.tid >= 0) { // -1 for unmapped reads + if (in_read->b->core.tid < prev_tid || + ((in_read->b->core.tid == prev_tid) && (in_read->b->core.pos < prev_coord))) { + fprintf(stderr, "[markdup] error: not in coordinate sorted order.\n"); + goto fail; + } + } + + prev_coord = in_read->pos = in_read->b->core.pos; + prev_tid = in_read->b->core.tid; + in_read->pair_key.single = 1; + in_read->single_key.single = 0; + in_read->duplicate = NULL; + in_read->dup_checked = 0; + + reading++; + + if (param->clear && (in_read->b->core.flag & BAM_FDUP)) { + uint8_t *data; + + in_read->b->core.flag ^= BAM_FDUP; + + if ((data = bam_aux_get(in_read->b, "dt")) != NULL) { + bam_aux_del(in_read->b, data); + } + + if ((data = bam_aux_get(in_read->b, "do")) != NULL) { + bam_aux_del(in_read->b, data); + } + } + + if (param->include_fails) { + exclude |= (BAM_FSECONDARY | BAM_FSUPPLEMENTARY | BAM_FUNMAP); + } else { + exclude |= (BAM_FSECONDARY | BAM_FSUPPLEMENTARY | BAM_FUNMAP | BAM_FQCFAIL); + } + + // read must not be secondary, supplementary, unmapped or (possibly) failed QC + if (!(in_read->b->core.flag & exclude)) { + examined++; + + + // look at the pairs first + if ((in_read->b->core.flag & BAM_FPAIRED) && !(in_read->b->core.flag & BAM_FMUNMAP)) { + int ret, mate_tmp; + key_data_t pair_key; + key_data_t single_key; + in_hash_t *bp; + + if (make_pair_key(param, &pair_key, in_read->b, &bc_warnings)) { + fprintf(stderr, "[markdup] error: unable to assign pair hash key.\n"); + goto fail; + } + + make_single_key(param, &single_key, in_read->b, &bc_warnings); + + pair++; + in_read->pos = single_key.this_coord; // cigar/orientation modified pos + + // put in singles hash for checking against non paired reads + k = kh_put(reads, single_hash, single_key, &ret); + + if (ret > 0) { // new + // add to single duplicate hash + bp = &kh_val(single_hash, k); + bp->p = in_read; + in_read->single_key = single_key; + } else if (ret == 0) { // exists + // look at singles only for duplication marking + bp = &kh_val(single_hash, k); + + if (!(bp->p->b->core.flag & BAM_FPAIRED) || (bp->p->b->core.flag & BAM_FMUNMAP)) { + // singleton will always be marked duplicate even if + // scores more than one read of the pair + bam1_t *dup = bp->p->b; + + if (param->check_chain) + in_read->duplicate = bp->p; + + bp->p = in_read; + + if (mark_duplicates(param, dup_hash, bp->p->b, dup, &single_optical, &opt_warnings)) + goto fail; + + single_dup++; + } + } else { + fprintf(stderr, "[markdup] error: single hashing failure.\n"); + goto fail; + } + + // now do the pair + k = kh_put(reads, pair_hash, pair_key, &ret); + + if (ret > 0) { // new + // add to the pair hash + bp = &kh_val(pair_hash, k); + bp->p = in_read; + in_read->pair_key = pair_key; + } else if (ret == 0) { + int64_t old_score, new_score, tie_add = 0; + bam1_t *dup = NULL; + + bp = &kh_val(pair_hash, k); + + if ((bp->p->b->core.flag & BAM_FQCFAIL) != (in_read->b->core.flag & BAM_FQCFAIL)) { + if (bp->p->b->core.flag & BAM_FQCFAIL) { + old_score = 0; + new_score = 1; + } else { + old_score = 1; + new_score = 0; + } + } else { + if ((mate_tmp = get_mate_score(bp->p->b)) == -1) { + fprintf(stderr, "[markdup] error: no ms score tag. Please run samtools fixmate on file first.\n"); + goto fail; + } else { + old_score = calc_score(bp->p->b) + mate_tmp; + } + + if ((mate_tmp = get_mate_score(in_read->b)) == -1) { + fprintf(stderr, "[markdup] error: no ms score tag. Please run samtools fixmate on file first.\n"); + goto fail; + } else { + new_score = calc_score(in_read->b) + mate_tmp; + } + } + + // choose the highest score as the original + // and add it to the pair hash, mark the other as duplicate + + if (new_score == old_score) { + if (strcmp(bam_get_qname(in_read->b), bam_get_qname(bp->p->b)) < 0) { + tie_add = 1; + } else { + tie_add = -1; + } + } + + if (new_score + tie_add > old_score) { // swap reads + dup = bp->p->b; + + if (param->check_chain) { + + if (in_read->duplicate) { + read_queue_t *current = in_read->duplicate; + + while (current->duplicate) { + current = current->duplicate; + } + + current->duplicate = bp->p; + } else { + in_read->duplicate = bp->p; + } + } + + bp->p = in_read; + } else { + if (param->check_chain) { + if (bp->p->duplicate) { + if (in_read->duplicate) { + read_queue_t *current = bp->p->duplicate; + + while (current->duplicate) { + current = current->duplicate; + } + + current->duplicate = in_read->duplicate; + } + + in_read->duplicate = bp->p->duplicate; + } + + bp->p->duplicate = in_read; + } + + dup = in_read->b; + } + + if (mark_duplicates(param, dup_hash, bp->p->b, dup, &optical, &opt_warnings)) + goto fail; + + duplicate++; + } else { + fprintf(stderr, "[markdup] error: pair hashing failure.\n"); + goto fail; + } + } else { // do the single (or effectively single) reads + int ret; + key_data_t single_key; + in_hash_t *bp; + + make_single_key(param, &single_key, in_read->b, &bc_warnings); + + single++; + in_read->pos = single_key.this_coord; // cigar/orientation modified pos + + k = kh_put(reads, single_hash, single_key, &ret); + + if (ret > 0) { // new + bp = &kh_val(single_hash, k); + bp->p = in_read; + in_read->single_key = single_key; + } else if (ret == 0) { // exists + bp = &kh_val(single_hash, k); + + if ((bp->p->b->core.flag & BAM_FPAIRED) && !(bp->p->b->core.flag & BAM_FMUNMAP)) { + // if matched against one of a pair just mark as duplicate + + if (param->check_chain) { + if (bp->p->duplicate) { + in_read->duplicate = bp->p->duplicate; + } + + bp->p->duplicate = in_read; + } + + if (mark_duplicates(param, dup_hash, bp->p->b, in_read->b, &single_optical, &opt_warnings)) + goto fail; + + } else { + int64_t old_score, new_score; + bam1_t *dup = NULL; + + old_score = calc_score(bp->p->b); + new_score = calc_score(in_read->b); + + // choose the highest score as the original, add it + // to the single hash and mark the other as duplicate + if (new_score > old_score) { // swap reads + dup = bp->p->b; + + if (param->check_chain) + in_read->duplicate = bp->p; + + bp->p = in_read; + } else { + if (param->check_chain) { + if (bp->p->duplicate) { + in_read->duplicate = bp->p->duplicate; + } + + bp->p->duplicate = in_read; + } + + dup = in_read->b; + } + + if (mark_duplicates(param, dup_hash, bp->p->b, dup, &single_optical, &opt_warnings)) + goto fail; + } + + single_dup++; + } else { + fprintf(stderr, "[markdup] error: single hashing failure.\n"); + goto fail; + } + } + } else { + excluded++; + } + + // loop through the stored reads and write out those we + // no longer need + rq = kl_begin(read_buffer); + while (rq != kl_end(read_buffer)) { + in_read = &kl_val(rq); + + /* keep a moving window of reads based on coordinates and max read length. Any unaligned reads + should just be written as they cannot be matched as duplicates. */ + if (in_read->pos + param->max_length > prev_coord && in_read->b->core.tid == prev_tid && (prev_tid != -1 || prev_coord != -1)) { + break; + } + + if (!dup_checked && param->check_chain) { + // check for multiple optical duplicates of the same original read + + if (find_duplicate_chains(param, read_buffer, dup_hash, &dup_list, prev_coord, prev_tid, &opt_warnings, &single_optical, &optical, 1)) { + fprintf(stderr, "[markdup] error: duplicate checking failed.\n"); + goto fail; + } + + dup_checked = 1; + } + + + if (param->check_chain && (in_read->b->core.flag & BAM_FDUP) && !in_read->dup_checked && !(in_read->b->core.flag & exclude)) { + break; + } + + if (!param->remove_dups || !(in_read->b->core.flag & BAM_FDUP)) { + if (param->supp) { + if (tmp_file_write(&temp, in_read->b)) { + fprintf(stderr, "[markdup] error: writing temp output failed.\n"); + goto fail; + } + } else { + if (sam_write1(param->out, header, in_read->b) < 0) { + fprintf(stderr, "[markdup] error: writing output failed.\n"); + goto fail; + } + } + + writing++; + } + + // remove from hash + if (in_read->pair_key.single == 0) { + k = kh_get(reads, pair_hash, in_read->pair_key); + kh_del(reads, pair_hash, k); + } + + if (in_read->single_key.single == 1) { + k = kh_get(reads, single_hash, in_read->single_key); + kh_del(reads, single_hash, k); + } + + kl_shift(read_queue, read_buffer, NULL); + bam_destroy1(in_read->b); + rq = kl_begin(read_buffer); + } + + // set the next one up for reading + in_read = kl_pushp(read_queue, read_buffer); + if (!in_read) { + fprintf(stderr, "[markdup] out of memory\n"); + goto fail; + } + + if ((in_read->b = bam_init1()) == NULL) { + fprintf(stderr, "[markdup] error: unable to allocate memory for alignment.\n"); + goto fail; + } + } + + if (ret < -1) { + fprintf(stderr, "[markdup] error: truncated input file.\n"); + goto fail; + } + + // one last check + if (param->tag || param->opt_dist) { + if (find_duplicate_chains(param, read_buffer, dup_hash, &dup_list, prev_coord, prev_tid, &opt_warnings, &single_optical, &optical, 0)) { + fprintf(stderr, "[markdup] error: duplicate checking failed.\n"); + goto fail; + } + } + + // write out the end of the list + rq = kl_begin(read_buffer); + while (rq != kl_end(read_buffer)) { + in_read = &kl_val(rq); + + if (bam_get_qname(in_read->b)) { // last entry will be blank + if (!param->remove_dups || !(in_read->b->core.flag & BAM_FDUP)) { + if (param->supp) { + if (tmp_file_write(&temp, in_read->b)) { + fprintf(stderr, "[markdup] error: writing temp output failed.\n"); + goto fail; + } + } else { + if (sam_write1(param->out, header, in_read->b) < 0) { + fprintf(stderr, "[markdup] error: writing output failed.\n"); + goto fail; + } + } + + writing++; + } + } + + kl_shift(read_queue, read_buffer, NULL); + bam_destroy1(in_read->b); + rq = kl_begin(read_buffer); + } + + if (param->supp) { + bam1_t *b; + + if (tmp_file_end_write(&temp)) { + fprintf(stderr, "[markdup] error: unable to end tmp writing.\n"); + goto fail; + } + + // read data from temp file and mark duplicate supplementary alignments + + if (tmp_file_begin_read(&temp)) { + goto fail; + } + + b = bam_init1(); + + while ((ret = tmp_file_read(&temp, b)) > 0) { + + if ((b->core.flag & BAM_FSUPPLEMENTARY) || (b->core.flag & BAM_FUNMAP) || (b->core.flag & BAM_FSECONDARY)) { + + k = kh_get(duplicates, dup_hash, bam_get_qname(b)); + + if (k != kh_end(dup_hash)) { + + b->core.flag |= BAM_FDUP; + np_duplicate++; + + if (param->tag && kh_val(dup_hash, k).name) { + if (bam_aux_update_str(b, "do", strlen(kh_val(dup_hash, k).name) + 1, (char*)kh_val(dup_hash, k).name)) { + fprintf(stderr, "[markdup] error: unable to append supplementary 'do' tag.\n"); + goto fail; + } + } + + if (param->opt_dist) { + if (kh_val(dup_hash, k).type) { + bam_aux_update_str(b, "dt", 3, "SQ"); + np_opt_duplicate++; + } else { + bam_aux_update_str(b, "dt", 3, "LB"); + } + } + } + } + + if (!param->remove_dups || !(b->core.flag & BAM_FDUP)) { + if (sam_write1(param->out, header, b) < 0) { + fprintf(stderr, "[markdup] error: writing final output failed.\n"); + goto fail; + } + } + } + + if (ret == -1) { + fprintf(stderr, "[markdup] error: failed to read tmp file.\n"); + goto fail; + } + + for (k = kh_begin(dup_hash); k != kh_end(dup_hash); ++k) { + if (kh_exist(dup_hash, k)) { + free(kh_val(dup_hash, k).name); + free((char *)kh_key(dup_hash, k)); + kh_key(dup_hash, k) = NULL; + } + } + + tmp_file_destroy(&temp); + bam_destroy1(b); + } + + if (opt_warnings) { + fprintf(stderr, "[markdup] warning: number of failed attempts to get coordinates from read names = %ld\n", + opt_warnings); + } + + if (bc_warnings) { + fprintf(stderr, "[markdup] warning: number of failed attempts to get barcodes = %ld\n", bc_warnings); + } + + if (param->do_stats) { + FILE *fp; + int file_open = 0; + unsigned long els; + + if (param->stats_file) { + if (NULL == (fp = fopen(param->stats_file, "w"))) { + fprintf(stderr, "[markdup] warning: cannot write stats to %s.\n", param->stats_file); + fp = stderr; + } else { + file_open = 1; + } + } else { + fp = stderr; + } + + els = estimate_library_size(pair, duplicate, optical); + + fprintf(fp, + "COMMAND: %s\n" + "READ: %ld\n" + "WRITTEN: %ld\n" + "EXCLUDED: %ld\n" + "EXAMINED: %ld\n" + "PAIRED: %ld\n" + "SINGLE: %ld\n" + "DUPLICATE PAIR: %ld\n" + "DUPLICATE SINGLE: %ld\n" + "DUPLICATE PAIR OPTICAL: %ld\n" + "DUPLICATE SINGLE OPTICAL: %ld\n" + "DUPLICATE NON PRIMARY: %ld\n" + "DUPLICATE NON PRIMARY OPTICAL: %ld\n" + "DUPLICATE PRIMARY TOTAL: %ld\n" + "DUPLICATE TOTAL: %ld\n" + "ESTIMATED_LIBRARY_SIZE: %ld\n", param->arg_list, reading, writing, excluded, examined, pair, single, + duplicate, single_dup, optical, single_optical, np_duplicate, np_opt_duplicate, + single_dup + duplicate, single_dup + duplicate + np_duplicate, els); + + if (file_open) { + fclose(fp); + } + } + + if (param->write_index) { + if (sam_idx_save(param->out) < 0) { + print_error_errno("markdup", "writing index failed"); + goto fail; + } + } + + if (param->check_chain && (param->tag || param->opt_dist)) + free(dup_list.c); + + kh_destroy(reads, pair_hash); + kh_destroy(reads, single_hash); + kl_destroy(read_queue, read_buffer); + kh_destroy(duplicates, dup_hash); + sam_hdr_destroy(header); + + return 0; + + fail: + for (rq = kl_begin(read_buffer); rq != kl_end(read_buffer); rq = kl_next(rq)) + bam_destroy1(kl_val(rq).b); + kl_destroy(read_queue, read_buffer); + + for (k = kh_begin(dup_hash); k != kh_end(dup_hash); ++k) { + if (kh_exist(dup_hash, k)) { + free((char *)kh_key(dup_hash, k)); + } + } + kh_destroy(duplicates, dup_hash); + + if (param->check_chain && (param->tag || param->opt_dist)) + free(dup_list.c); + + kh_destroy(reads, pair_hash); + kh_destroy(reads, single_hash); + sam_hdr_destroy(header); + return 1; +} + + +static int markdup_usage(void) { + fprintf(stderr, "\n"); + fprintf(stderr, "Usage: samtools markdup \n\n"); + fprintf(stderr, "Option: \n"); + fprintf(stderr, " -r Remove duplicate reads\n"); + fprintf(stderr, " -l INT Max read length (default 300 bases)\n"); + fprintf(stderr, " -S Mark supplementary alignments of duplicates as duplicates (slower).\n"); + fprintf(stderr, " -s Report stats.\n"); + fprintf(stderr, " -f NAME Write stats to named file. Implies -s.\n"); + fprintf(stderr, " -T PREFIX Write temporary files to PREFIX.samtools.nnnn.nnnn.tmp.\n"); + fprintf(stderr, " -d INT Optical distance (if set, marks with dt tag)\n"); + fprintf(stderr, " -c Clear previous duplicate settings and tags.\n"); + fprintf(stderr, " -m --mode TYPE Duplicate decision method for paired reads.\n" + " TYPE = t measure positions based on template start/end (default).\n" + " s measure positions based on sequence start.\n"); + fprintf(stderr, " -u Output uncompressed data\n"); + fprintf(stderr, " --include-fails Include quality check failed reads.\n"); + fprintf(stderr, " --no-PG Do not add a PG line\n"); + fprintf(stderr, " --no-multi-dup Reduced duplicates of duplicates checking.\n"); + fprintf(stderr, " --read-coords STR Regex for coords from read name.\n"); + fprintf(stderr, " --coords-order STR Order of regex elements. txy (default). With t being a part of\n" + " the read names that must be equal and x/y being coordinates.\n"); + fprintf(stderr, " --barcode-tag STR Use barcode a tag that duplicates much match.\n"); + fprintf(stderr, " --barcode-name Use the UMI/barcode in the read name (eigth colon delimited part).\n"); + fprintf(stderr, " --barcode-rgx STR Regex for barcode in the readname (alternative to --barcode-name).\n"); + fprintf(stderr, " -t Mark primary duplicates with the name of the original in a \'do\' tag." + " Mainly for information and debugging.\n"); + + sam_global_opt_help(stderr, "-.O..@.."); + + fprintf(stderr, "\nThe input file must be coordinate sorted and must have gone" + " through fixmates with the mate scoring option on.\n"); + + return 1; +} + + +int bam_markdup(int argc, char **argv) { + int c, ret, bc_name = 0; + char wmode[4] = {'w', 'b', 0, 0}; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + htsThreadPool p = {NULL, 0}; + kstring_t tmpprefix = {0, 0, NULL}; + struct stat st; + unsigned int t; + char *regex = NULL, *bc_regex = NULL; + char *regex_order = "txy"; + md_param_t param = {NULL, NULL, NULL, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL}; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + {"include-fails", no_argument, NULL, 1001}, + {"no-PG", no_argument, NULL, 1002}, + {"mode", required_argument, NULL, 'm'}, + {"no-multi-dup", no_argument, NULL, 1003}, + {"read-coords", required_argument, NULL, 1004}, + {"coords-order", required_argument, NULL, 1005}, + {"barcode-tag", required_argument, NULL, 1006}, + {"barcode-name", no_argument, NULL, 1007}, + {"barcode-rgx", required_argument, NULL, 1008}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "rsl:StT:O:@:f:d:cm:u", lopts, NULL)) >= 0) { + switch (c) { + case 'r': param.remove_dups = 1; break; + case 'l': param.max_length = atoi(optarg); break; + case 's': param.do_stats = 1; break; + case 'T': kputs(optarg, &tmpprefix); break; + case 'S': param.supp = 1; break; + case 't': param.tag = 1; break; + case 'f': param.stats_file = optarg; param.do_stats = 1; break; + case 'd': param.opt_dist = atoi(optarg); break; + case 'c': param.clear = 1; break; + case 'm': + if (strcmp(optarg, "t") == 0) { + param.mode = MD_MODE_TEMPLATE; + } else if (strcmp(optarg, "s") == 0) { + param.mode = MD_MODE_SEQUENCE; + } else { + fprintf(stderr, "[markdup] error: unknown mode '%s'.\n", optarg); + return markdup_usage(); + } + + break; + case 'u': wmode[2] = '0'; break; + case 1001: param.include_fails = 1; break; + case 1002: param.no_pg = 1; break; + case 1003: param.check_chain = 0; break; + case 1004: regex = optarg; break; + case 1005: regex_order = optarg; break; + case 1006: param.barcode = optarg; break; + case 1007: bc_name = 1; break; + case 1008: bc_name = 1, bc_regex = optarg; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': return markdup_usage(); + } + } + + if (optind + 2 > argc) + return markdup_usage(); + + if (param.barcode && bc_name) { + fprintf(stderr, "[markdup] Error: cannot specify --barcode-tag and " + "--barcode-name (or --barcode-rgx) at same time.\n"); + return 1; + } + + if (param.opt_dist < 0) param.opt_dist = 0; + if (param.max_length < 0) param.max_length = 300; + + if (regex) { + int result; + + // set the order the elements of the regex are assigned to. + // x and y being coordinates, t being any other important part of the read + // e.g. tile and lane + // x and y order does not matter as long as it is consistent + + if ((strncmp(regex_order, "txy", 3) == 0) || (strncmp(regex_order, "tyx", 3) == 0)) { + param.rgx_t = 1; + param.rgx_x = 2; + param.rgx_y = 3; + } else if ((strncmp(regex_order, "xyt", 3) == 0) || (strncmp(regex_order, "yxt", 3) == 0)) { + param.rgx_x = 1; + param.rgx_y = 2; + param.rgx_t = 3; + } else if ((strncmp(regex_order, "xty", 3) == 0) || (strncmp(regex_order, "ytx", 3) == 0)) { + param.rgx_x = 1; + param.rgx_t = 2; + param.rgx_y = 3; + } else if ((strncmp(regex_order, "xy", 2) == 0) || (strncmp(regex_order, "yx", 2) == 0)) { + param.rgx_x = 1; + param.rgx_y = 2; + param.rgx_t = 0; + } else { + fprintf(stderr, "[markdup] error: could not recognise regex coordinate order \"%s\".\n", regex_order); + return 1; + } + + if ((param.rgx = malloc(sizeof(regex_t))) == NULL) { + fprintf(stderr, "[markdup] error: could not allocate memory for regex.\n"); + return 1; + } + + if ((result = regcomp(param.rgx, regex, REG_EXTENDED))) { + char err_msg[256]; + + regerror(result, param.rgx, err_msg, 256); + fprintf(stderr, "[markdup] error: regex error \"%s\"\n", err_msg); + free(param.rgx); + return 1; + } + } + + if (bc_name) { + int result; + + /* From Illumina UMI documentation: "The UMI sequence is located in the + eighth colon-delimited field of the read name (QNAME)". */ + char *rgx = "[0-9A-Za-z]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+:([!-?A-~]+)"; + + if ((param.bc_rgx = malloc(sizeof(regex_t))) == NULL) { + fprintf(stderr, "[markdup] error: could not allocate memory for barcode regex.\n"); + return 1; + } + + if (bc_regex) { + rgx = bc_regex; + } + + if ((result = regcomp(param.bc_rgx, rgx, REG_EXTENDED))) { + char err_msg[256]; + + regerror(result, param.bc_rgx, err_msg, 256); + fprintf(stderr, "[markdup] error: barcode regex error \"%s\"\n", err_msg); + free(param.bc_rgx); + return 1; + } + } + + param.in = sam_open_format(argv[optind], "r", &ga.in); + + if (!param.in) { + print_error_errno("markdup", "failed to open \"%s\" for input", argv[optind]); + return 1; + } + + sam_open_mode(wmode + 1, argv[optind + 1], NULL); + param.out = sam_open_format(argv[optind + 1], wmode, &ga.out); + + if (!param.out) { + print_error_errno("markdup", "failed to open \"%s\" for output", argv[optind + 1]); + return 1; + } + + if (ga.nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(stderr, "[markdup] error creating thread pool\n"); + return 1; + } + + hts_set_opt(param.in, HTS_OPT_THREAD_POOL, &p); + hts_set_opt(param.out, HTS_OPT_THREAD_POOL, &p); + } + + // actual stuff happens here + + // we need temp files so fix up the name here + if (tmpprefix.l == 0) { + + if (strcmp(argv[optind + 1], "-") != 0) + ksprintf(&tmpprefix, "%s.", argv[optind + 1]); + else + kputc('.', &tmpprefix); + } + + if (stat(tmpprefix.s, &st) == 0 && S_ISDIR(st.st_mode)) { + if (tmpprefix.s[tmpprefix.l-1] != '/') kputc('/', &tmpprefix); + } + + t = ((unsigned) time(NULL)) ^ ((unsigned) clock()); + ksprintf(&tmpprefix, "samtools.%d.%u.tmp", (int) getpid(), t % 10000); + param.prefix = tmpprefix.s; + + param.arg_list = stringify_argv(argc + 1, argv - 1); + param.write_index = ga.write_index; + param.out_fn = argv[optind + 1]; + + ret = bam_mark_duplicates(¶m); + + sam_close(param.in); + + if (sam_close(param.out) < 0) { + fprintf(stderr, "[markdup] error closing output file\n"); + ret = 1; + } + + if (p.pool) hts_tpool_destroy(p.pool); + + if (param.rgx) { + regfree(param.rgx); + free(param.rgx); + } + + if (param.bc_rgx) { + regfree(param.bc_rgx); + free(param.bc_rgx); + } + + free(param.arg_list); + free(tmpprefix.s); + sam_global_args_free(&ga); + + return ret; +} diff --git a/samtools/bam_markdup.c.pysam.c b/samtools/bam_markdup.c.pysam.c new file mode 100644 index 0000000..3c14d8b --- /dev/null +++ b/samtools/bam_markdup.c.pysam.c @@ -0,0 +1,2282 @@ +#include "samtools.pysam.h" + +/* bam_markdup.c -- Mark duplicates from a coord sorted file that has gone + through fixmates with the mate scoring option on. + + Copyright (C) 2017-2022 Genome Research Ltd. + + Author: Andrew Whitwham + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE + +Estimate library size derived from Picard DuplicationMetrics.java +Copyright (c) 2009,2018 The Broad Institute. MIT license. +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "htslib/thread_pool.h" +#include "htslib/sam.h" +#include "sam_opts.h" +#include "samtools.h" +#include "htslib/khash.h" +#include "htslib/klist.h" +#include "htslib/kstring.h" +#include "tmp_file.h" +#include "bam.h" + + +typedef struct { + samFile *in; + samFile *out; + char *prefix; + int remove_dups; + int32_t max_length; + int do_stats; + int supp; + int tag; + int opt_dist; + int no_pg; + int clear; + int mode; + int write_index; + int include_fails; + int check_chain; + char *stats_file; + char *arg_list; + char *out_fn; + regex_t *rgx; + int rgx_x; + int rgx_y; + int rgx_t; + char *barcode; + regex_t *bc_rgx; +} md_param_t; + +typedef struct { + hts_pos_t this_coord; + hts_pos_t other_coord; + int32_t this_ref; + int32_t other_ref; + int32_t barcode; + int8_t single; + int8_t leftmost; + int8_t orientation; +} key_data_t; + +typedef struct read_queue_s { + key_data_t pair_key; + key_data_t single_key; + bam1_t *b; + struct read_queue_s *duplicate; + hts_pos_t pos; + int dup_checked; +} read_queue_t; + +typedef struct { + read_queue_t *p; +} in_hash_t; + +typedef struct { + char *name; + char type; +} dup_map_t; + +typedef struct { + bam1_t *b; + int64_t score; + int64_t mate_score; + long x; + long y; + int opt; + int beg; + int end; +} check_t; + + +typedef struct { + check_t *c; + size_t size; + size_t length; +} check_list_t; + +static khint32_t do_hash(unsigned char *key, khint32_t len); + +static khint_t hash_key(key_data_t key) { + int i = 0; + khint_t hash; + + if (key.single) { + unsigned char sig[17]; + + memcpy(sig + i, &key.this_ref, 4); i += 4; + memcpy(sig + i, &key.this_coord, 8); i += 8; + memcpy(sig + i, &key.orientation, 1); i += 1; + memcpy(sig + i, &key.barcode, 4); i += 4; + + hash = do_hash(sig, i); + } else { + unsigned char sig[30]; + + memcpy(sig + i, &key.this_ref, 4); i += 4; + memcpy(sig + i, &key.this_coord, 8); i += 8; + memcpy(sig + i, &key.other_ref, 4); i += 4; + memcpy(sig + i, &key.other_coord, 8); i += 8; + memcpy(sig + i, &key.leftmost, 1); i += 1; + memcpy(sig + i, &key.orientation, 1); i += 1; + memcpy(sig + i, &key.barcode, 4); i += 4; + + hash = do_hash(sig, i); + } + + return hash; +} + + +static int key_equal(key_data_t a, key_data_t b) { + int match = 1; + + if (a.this_coord != b.this_coord) + match = 0; + else if (a.orientation != b.orientation) + match = 0; + else if (a.this_ref != b.this_ref) + match = 0; + else if (a.single != b.single) + match = 0; + else if (a.barcode != b.barcode) + match = 0; + + if (!a.single) { + if (a.other_coord != b.other_coord) + match = 0; + else if (a.leftmost != b.leftmost) + match = 0; + else if (a.other_ref != b.other_ref) + match = 0; + } + + return match; +} + + +#define __free_queue_element(p) + +// Orientations (prime numbers to feed to hashing algorithm) +#define O_FF 2 +#define O_RR 3 +#define O_FR 5 +#define O_RF 7 + +// Left or rightmost +#define R_LE 11 +#define R_RI 13 + +#define BMD_WARNING_MAX 10 + +#define MD_MIN_QUALITY 15 + +// Duplicate finding mode +#define MD_MODE_TEMPLATE 0 +#define MD_MODE_SEQUENCE 1 + +KHASH_INIT(reads, key_data_t, in_hash_t, 1, hash_key, key_equal) // read map hash +KLIST_INIT(read_queue, read_queue_t, __free_queue_element) // the reads buffer +KHASH_MAP_INIT_STR(duplicates, dup_map_t) // map of duplicates for supplementary dup id + +/* The Bob Jenkins one_at_a_time hash to reduce the key to a 32 bit value. */ + +static khint32_t do_hash(unsigned char *key, khint32_t len) { + khint32_t hash, i; + + for (hash = 0, i = 0; i < len; ++i) { + hash += key[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + + return hash; +} + + +/* Get mate score from tag. */ + +static int64_t get_mate_score(bam1_t *b) { + uint8_t *data; + int64_t score; + + if ((data = bam_aux_get(b, "ms"))) { + score = bam_aux2i(data); + } else { + fprintf(samtools_stderr, "[markdup] error: no ms score tag. Please run samtools fixmate on file first.\n"); + return -1; + } + + return score; +} + + +/* Calc current score from quality. */ + +static int64_t calc_score(bam1_t *b) +{ + int64_t score = 0; + uint8_t *qual = bam_get_qual(b); + int i; + + for (i = 0; i < b->core.l_qseq; i++) { + if (qual[i] >= MD_MIN_QUALITY) score += qual[i]; + } + + return score; +} + + +/* Create a signature hash of the current read and its pair. + Uses the unclipped start (or end depending on orientation), + the reference id, orientation and whether the current + read is leftmost of the pair. */ + + +static int make_pair_key(md_param_t *param, key_data_t *key, bam1_t *bam, long *warnings) { + hts_pos_t this_coord, this_end, other_coord, other_end, leftmost; + int32_t this_ref, other_ref, barcode = 0; + int8_t orientation, left_read; + uint8_t *data; + char *cig, *bar; + long incoming_warnings = *warnings; + + this_ref = bam->core.tid + 1; // avoid a 0 being put into the hash + other_ref = bam->core.mtid + 1; + + this_coord = unclipped_start(bam); + this_end = unclipped_end(bam); + + if ((data = bam_aux_get(bam, "MC"))) { + if (!(cig = bam_aux2Z(data))) { + fprintf(samtools_stderr, "[markdup] error: MC tag wrong type. Please use the MC tag provided by samtools fixmate.\n"); + return 1; + } + + other_end = unclipped_other_end(bam->core.mpos, cig); + other_coord = unclipped_other_start(bam->core.mpos, cig); + } else { + fprintf(samtools_stderr, "[markdup] error: no MC tag. Please run samtools fixmate on file first.\n"); + return 1; + } + + // work out orientations + if (param->mode == MD_MODE_TEMPLATE) { + + if (this_ref != other_ref) { + leftmost = this_ref < other_ref; + } else { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + if (!bam_is_rev(bam)) { + leftmost = this_coord <= other_coord; + } else { + leftmost = this_end <= other_end; + } + } else { + if (bam_is_rev(bam)) { + leftmost = this_end <= other_coord; + } else { + leftmost = this_coord <= other_end; + } + } + } + + // pair orientation + if (leftmost) { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + other_coord = other_end; + + if (!bam_is_rev(bam)) { + if (bam->core.flag & BAM_FREAD1) { + orientation = O_FF; + } else { + orientation = O_RR; + } + } else { + if (bam->core.flag & BAM_FREAD1) { + orientation = O_RR; + } else { + orientation = O_FF; + } + } + } else { + if (!bam_is_rev(bam)) { + orientation = O_FR; + other_coord = other_end; + } else { + orientation = O_RF; + this_coord = this_end; + } + } + } else { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + this_coord = this_end; + + if (!bam_is_rev(bam)) { + if (bam->core.flag & BAM_FREAD1) { + orientation = O_RR; + } else { + orientation = O_FF; + } + } else { + if (bam->core.flag & BAM_FREAD1) { + orientation = O_FF; + } else { + orientation = O_RR; + } + } + } else { + if (!bam_is_rev(bam)) { + orientation = O_RF; + other_coord = other_end; + } else { + orientation = O_FR; + this_coord = this_end; + } + } + } + } else { // MD_MODE_SEQUENCE + + if (this_ref != other_ref) { + leftmost = this_ref - other_ref; + } else { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + if (!bam_is_rev(bam)) { + leftmost = this_coord - other_coord; + } else { + leftmost = this_end - other_end; + } + } else { + if (bam_is_rev(bam)) { + leftmost = this_end - other_coord; + } else { + leftmost = this_coord - other_end; + } + } + } + + if (leftmost < 0) { + leftmost = 1; + } else if (leftmost > 0) { + leftmost = 0; + } else { + // tie breaks + + if (bam->core.pos == bam->core.mpos) { + if (bam->core.flag & BAM_FREAD1) { + leftmost = 1; + } else { + leftmost = 0; + } + } else if (bam->core.pos < bam->core.mpos) { + leftmost = 1; + } else { + leftmost = 0; + } + } + + // pair orientation + if (leftmost) { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + + if (!bam_is_rev(bam)) { + orientation = O_FF; + } else { + orientation = O_RR; + } + } else { + if (!bam_is_rev(bam)) { + orientation = O_FR; + } else { + orientation = O_RF; + } + } + } else { + if (bam_is_rev(bam) == bam_is_mrev(bam)) { + + if (!bam_is_rev(bam)) { + orientation = O_RR; + } else { + orientation = O_FF; + } + } else { + if (!bam_is_rev(bam)) { + orientation = O_RF; + } else { + orientation = O_FR; + } + } + } + + if (!bam_is_rev(bam)) { + this_coord = unclipped_start(bam); + } else { + this_coord = unclipped_end(bam); + } + + if (!bam_is_mrev(bam)) { + other_coord = unclipped_other_start(bam->core.mpos, cig); + } else { + other_coord = unclipped_other_end(bam->core.mpos, cig); + } + } + + if (!leftmost) + left_read = R_RI; + else + left_read = R_LE; + + if (param->barcode) { + if ((data = bam_aux_get(bam, param->barcode))) { + if (!(bar = bam_aux2Z(data))) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: %s tag wrong type. Aux tag needs to be a string type.\n", param->barcode); + } + } else { + barcode = do_hash((unsigned char *)bar, strlen(bar)); + } + } + } else if (param->bc_rgx) { + int result; + regmatch_t matches[3]; + size_t max_matches = 2; + char *qname = bam_get_qname(bam); + + if ((result = regexec(param->bc_rgx, qname, max_matches, matches, 0)) == 0) { + int bc_start, bc_end; + + bc_start = matches[1].rm_so; + bc_end = matches[1].rm_eo; + + if (bc_start != -1) { + barcode = do_hash((unsigned char *)qname + bc_start, bc_end - bc_start); + } else { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: barcode regex unable to match substring on %s.\n", qname); + } + } + } else { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + char warn_msg[256]; + + regerror(result, param->bc_rgx, warn_msg, 256); + fprintf(samtools_stderr, "[markdup] warning: barcode regex match error \"%s\" on %s.\n", warn_msg, qname); + } + } + } + + if ((*warnings == BMD_WARNING_MAX) && (incoming_warnings != *warnings)) { + fprintf(samtools_stderr, "[markdup] warning: %ld barcode read warnings. New warnings will not be reported.\n", + *warnings); + } + + key->single = 0; + key->this_ref = this_ref; + key->this_coord = this_coord; + key->other_ref = other_ref; + key->other_coord = other_coord; + key->leftmost = left_read; + key->orientation = orientation; + key->barcode = barcode; + + return 0; +} + + +/* Create a signature hash of single read (or read with an unmatched pair). + Uses unclipped start (or end depending on orientation), reference id, + and orientation. */ + +static void make_single_key(md_param_t *param, key_data_t *key, bam1_t *bam, long *warnings) { + hts_pos_t this_coord; + int32_t this_ref, barcode = 0; + int8_t orientation; + uint8_t *data; + char *bar; + long incoming_warnings = *warnings; + + this_ref = bam->core.tid + 1; // avoid a 0 being put into the hash + + if (bam_is_rev(bam)) { + this_coord = unclipped_end(bam); + orientation = O_RR; + } else { + this_coord = unclipped_start(bam); + orientation = O_FF; + } + + if (param->barcode) { + if ((data = bam_aux_get(bam, param->barcode))) { + if (!(bar = bam_aux2Z(data))) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: %s tag wrong type. Aux tag needs to be a string type.\n", param->barcode); + } + } else { + barcode = do_hash((unsigned char *)bar, strlen(bar)); + } + } + } else if (param->bc_rgx) { + int result; + regmatch_t matches[3]; + size_t max_matches = 2; + char *qname = bam_get_qname(bam); + + if ((result = regexec(param->bc_rgx, qname, max_matches, matches, 0)) == 0) { + int bc_start, bc_end; + + bc_start = matches[1].rm_so; + bc_end = matches[1].rm_eo; + + if (bc_start != -1) { + barcode = do_hash((unsigned char *)qname + bc_start, bc_end - bc_start); + } else { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: barcode regex unable to match substring on %s.\n", qname); + } + } + } else { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + char warn_msg[256]; + + regerror(result, param->bc_rgx, warn_msg, 256); + fprintf(samtools_stderr, "[markdup] warning: barcode regex match error \"%s\" on %s.\n", warn_msg, qname); + } + } + } + + if ((*warnings == BMD_WARNING_MAX) && (incoming_warnings != *warnings)) { + fprintf(samtools_stderr, "[markdup] warning: %ld barcode read warnings. New warnings will not be reported.\n", + *warnings); + } + + key->single = 1; + key->this_ref = this_ref; + key->this_coord = this_coord; + key->orientation = orientation; + key->barcode = barcode; +} + + +/* Add the duplicate name to a hash if it does not exist. */ + +static int add_duplicate(khash_t(duplicates) *d_hash, bam1_t *dupe, char *orig_name, char type) { + khiter_t d; + int ret; + + d = kh_get(duplicates, d_hash, bam_get_qname(dupe)); + + if (d == kh_end(d_hash)) { + char *name = strdup(bam_get_qname(dupe)); + if (name) { + d = kh_put(duplicates, d_hash, name, &ret); + } else { + ret = -1; + } + + if (ret >= 0) { + if (orig_name) { + if (ret == 0) { + // replace old name + free(kh_value(d_hash, d).name); + free(name); + } + + kh_value(d_hash, d).name = strdup(orig_name); + + if (kh_value(d_hash, d).name == NULL) { + fprintf(samtools_stderr, "[markdup] error: unable to allocate memory for duplicate original name.\n"); + return 1; + } + } else { + kh_value(d_hash, d).name = NULL; + } + + kh_value(d_hash, d).type = type; + } else { + fprintf(samtools_stderr, "[markdup] error: unable to store supplementary duplicates.\n"); + free(name); + return 1; + } + } + + return 0; +} + + +/* Get coordinates from the standard Illumina style read names. + Returned values are of the x and y coordinates and a section of + the read name to test (t) for string equality e.g. lane and tile part. */ + +static int get_coordinates_colons(md_param_t *param, const char *qname, int *t_beg, int *t_end, long *x_coord, long *y_coord, long *warnings) { + int sep = 0; + int pos = 0; + int xpos = 0, ypos = 0; + char *end; + + while (qname[pos]) { + if (qname[pos] == ':') { + sep++; + + if (sep == 2) { + xpos = pos + 1; + } else if (sep == 3) { + ypos = pos + 1; + } else if (sep == 4) { // HiSeq style names + xpos = ypos; + ypos = pos + 1; + } else if (sep == 5) { // Newer Illumina format + xpos = pos + 1; + } else if (sep == 6) { + ypos = pos + 1; + } + } + + pos++; + } + + /* The most current Illumina read format at time of writing is: + @machine:run:flowcell:lane:tile:x:y:UMI or + @machine:run:flowcell:lane:tile:x:y + + Counting the separating colons gives us a quick format check. + Older name formats have fewer elements. + */ + + if (!(sep == 3 || sep == 4 || sep == 6 || sep == 7)) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: cannot decipher read name %s for optical duplicate marking.\n", qname); + } + + return 1; + } else { + *x_coord = strtol(qname + xpos, &end, 10); + + if ((qname + xpos) == end) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: cannot decipher x coordinate in %s .\n", qname); + } + + return 1; + } + + *y_coord = strtol(qname + ypos, &end, 10); + + if ((qname + ypos) == end) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: cannot decipher y coordinate in %s .\n", qname); + } + + return 1; + } + + *t_beg = 0; + *t_end = xpos; + } + + return 0; +} + +/* Get the coordinates from the read name. + Returned values are of the x and y coordinates and an optional section of + the read name to test (t) for string equality e.g. lane and tile part. */ + +static inline int get_coordinates_regex(md_param_t *param, const char *qname, int *t_beg, int *t_end, long *x_coord, long *y_coord, long *warnings) { + regmatch_t matches[5]; + size_t max_matches = 5; + int xpos, ypos, xend, yend, xlen, ylen; + char coord[255]; + char *end; + + if (!param->rgx_t) + max_matches = 4; + + if (regexec(param->rgx, qname, max_matches, matches, 0)) + return -1; + + xpos = matches[param->rgx_x].rm_so; + ypos = matches[param->rgx_y].rm_so; + + if (param->rgx_t) { + *t_beg = matches[param->rgx_t].rm_so; + *t_end = matches[param->rgx_t].rm_eo; + } else { + *t_beg = *t_end = 0; + } + + if (xpos == -1 || ypos == -1 || *t_beg == -1) + return -1; + + xend = matches[param->rgx_x].rm_eo; + yend = matches[param->rgx_y].rm_eo; + + if ((xlen = xend - xpos) > 254) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: x coordinate string longer than allowed qname length in %s (%d long).\n", qname, xlen); + } + + return 1; + } + + strncpy(coord, qname + xpos, xlen); + coord[xlen] = '\0'; + *x_coord = strtol(coord, &end, 10); + + if (coord == end) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: cannot decipher x coordinate in %s (%s).\n", qname, coord); + } + + return 1; + } + + if ((ylen = yend - ypos) > 254) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: y coordinate string longer than allowed qname length in %s (%d long).\n", qname, ylen); + } + + return 1; + } + + strncpy(coord, qname + ypos, ylen); + coord[ylen] = '\0'; + *y_coord = strtol(coord, &end, 10); + + if (coord == end) { + (*warnings)++; + + if (*warnings <= BMD_WARNING_MAX) { + fprintf(samtools_stderr, "[markdup] warning: cannot decipher y coordinate in %s (%s).\n", qname, coord); + } + + return 1; + } + + return 0; +} + + +static int get_coordinates(md_param_t *param, const char *name, int *t_beg, int *t_end, long *x_coord, long *y_coord, long *warnings) { + int ret = 1; + + if (param->rgx == NULL) { + ret = get_coordinates_colons(param, name, t_beg, t_end, x_coord, y_coord, warnings); + } else { + ret = get_coordinates_regex(param, name, t_beg, t_end, x_coord, y_coord, warnings); + } + + return ret; +} + + +/* Using the coordinates from the read name, see whether the duplicated read is + close enough (set by max_dist) to the original to be counted as optical.*/ + +static int is_optical_duplicate(md_param_t *param, bam1_t *ori, bam1_t *dup, long max_dist, long *warnings) { + int ret = 0; + char *original, *duplicate; + long ox, oy, dx, dy; + int o_beg = 0, o_end = 0, d_beg = 0, d_end = 0; + + original = bam_get_qname(ori); + duplicate = bam_get_qname(dup); + + if (get_coordinates(param, original, &o_beg, &o_end, &ox, &oy, warnings)) { + return ret; + } + + if (get_coordinates(param, duplicate, &d_beg, &d_end, &dx, &dy, warnings)) { + return ret; + } + + if (strncmp(original + o_beg, duplicate + d_beg, o_end - o_beg) == 0) { + long xdiff, ydiff; + + if (ox > dx) { + xdiff = ox - dx; + } else { + xdiff = dx - ox; + } + + if (xdiff <= max_dist) { + // still might be optical + + if (oy > dy) { + ydiff = oy - dy; + } else { + ydiff = dy - oy; + } + + if (ydiff <= max_dist) ret = 1; + } + } + + return ret; +} + + +/* Using the coordinates from the Illumina read name, see whether the duplicated read is + close enough (set by max_dist) to the original to be counted as optical. + + This function needs the values from the first read to be already calculated. */ + +static int optical_duplicate_partial(md_param_t *param, const char *name, const int o_beg, const int o_end, const long ox, const long oy, bam1_t *dup, check_t *c, long max_dist, long *warnings) { + int ret = 0; + char *duplicate; + int d_beg = 0, d_end = 0; + long dx, dy; + + duplicate = bam_get_qname(dup); + + if (get_coordinates(param, duplicate, &d_beg, &d_end, &dx, &dy, warnings)) { + return ret; + } + + if (strncmp(name + o_beg, duplicate + d_beg, o_end - o_beg) == 0) { + // the initial parts match, look at the numbers + long xdiff, ydiff; + + if (ox > dx) { + xdiff = ox - dx; + } else { + xdiff = dx - ox; + } + + if (xdiff <= max_dist) { + // still might be optical + + if (oy > dy) { + ydiff = oy - dy; + } else { + ydiff = dy - oy; + } + + if (ydiff <= max_dist) ret = 1; + } + } + + c->x = dx; + c->y = dy; + c->beg = d_beg; + c->end = d_end; + + return ret; +} + + +/* Mark the read as a duplicate and update the duplicate hash (if needed) */ +static int mark_duplicates(md_param_t *param, khash_t(duplicates) *dup_hash, bam1_t *ori, bam1_t *dup, + long *optical, long *warn) { + char dup_type = 0; + long incoming_warnings = *warn; + + dup->core.flag |= BAM_FDUP; + + if (param->tag) { + if (bam_aux_update_str(dup, "do", strlen(bam_get_qname(ori)) + 1, bam_get_qname(ori))) { + fprintf(samtools_stderr, "[markdup] error: unable to append 'do' tag.\n"); + return -1; + } + } + + if (param->opt_dist) { // mark optical duplicates + if (is_optical_duplicate(param, ori, dup, param->opt_dist, warn)) { + bam_aux_update_str(dup, "dt", 3, "SQ"); + dup_type = 'O'; + (*optical)++; + } else { + // not an optical duplicate + bam_aux_update_str(dup, "dt", 3, "LB"); + } + } + + if ((*warn == BMD_WARNING_MAX) && (incoming_warnings != *warn)) { + fprintf(samtools_stderr, "[markdup] warning: %ld decipher read name warnings. New warnings will not be reported.\n", + *warn); + } + + if (param->supp) { + if (bam_aux_get(dup, "SA") || (dup->core.flag & BAM_FMUNMAP) || bam_aux_get(dup, "XA")) { + char *original = NULL; + + if (param->tag) { + original = bam_get_qname(ori); + } + + if (add_duplicate(dup_hash, dup, original, dup_type)) + return -1; + } + } + + return 0; +} + + +/* If the duplicate type has changed to optical then retag and duplicate hash. */ +static inline int optical_retag(md_param_t *param, khash_t(duplicates) *dup_hash, bam1_t *b, int paired, long *optical_single, long *optical_pair) { + int ret = 0; + + if (bam_aux_update_str(b, "dt", 3, "SQ")) { + fprintf(samtools_stderr, "[markdup] error: unable to update 'dt' tag.\n"); + ret = -1; + } + + if (paired) { + (*optical_pair)++; + } else { + (*optical_single)++; + } + + if (param->supp) { + // Change the duplicate type + + if (bam_aux_get(b, "SA") || (b->core.flag & BAM_FMUNMAP) + || bam_aux_get(b, "XA")) { + khiter_t d; + + d = kh_get(duplicates, dup_hash, bam_get_qname(b)); + + if (d == kh_end(dup_hash)) { + // error, name should already be in dup hash + fprintf(samtools_stderr, "[markdup] error: duplicate name %s not found in hash.\n", + bam_get_qname(b)); + ret = -1; + } else { + kh_value(dup_hash, d).type = 'O'; + } + } + } + + return ret; +} + + +/* Check all duplicates of the highest quality read (the "original") for consistancy. Also + pre-calculate any values for use in check_duplicate_chain later. + Returns 0 on success, >0 on coordinate reading error (program can continue) or + <0 on an error (program should not continue. */ +static int check_chain_against_original(md_param_t *param, khash_t(duplicates) *dup_hash, read_queue_t *ori, + check_list_t *list, long *warn, long *optical_single, long *optical_pair) { + + int ret = 0, coord_fail = 0; + char *ori_name = bam_get_qname(ori->b); + read_queue_t *current = ori->duplicate; + int t_beg = 0, t_end = 0; + long x, y; + + if (param->opt_dist) { + coord_fail = get_coordinates(param, ori_name, &t_beg, &t_end, &x, &y, warn); + } + + list->length = 0; + + while (current) { + check_t *c; + + if (list->length >= list->size) { + check_t *tmp; + + list->size *= 2; + + if (!(tmp = realloc(list->c, list->size * sizeof(check_t)))) { + fprintf(samtools_stderr, "[markdup] error: Unable to expand opt check list.\n"); + return -1; + } + + list->c = tmp; + } + + c = &list->c[list->length]; + + c->b = current->b; + c->x = -1; + c->y = -1; + c->opt = 0; + c->score = 0; + c->mate_score = 0; + current->dup_checked = 1; + + if (param->tag) { + uint8_t *data; + + // at this stage all duplicates should have a do tag + if ((data = bam_aux_get(current->b, "do")) != NULL) { + // see if we need to change the tag + char *old_name = bam_aux2Z(data); + + if (old_name) { + if (strcmp(old_name, ori_name) != 0) { + if (bam_aux_update_str(current->b, "do", strlen(ori_name) + 1, (const char *)ori_name)) { + fprintf(samtools_stderr, "[markdup] error: unable to update 'do' tag.\n"); + ret = -1; + break; + } + } + } else { + fprintf(samtools_stderr, "[markdup] error: 'do' tag has wrong type for read %s.\n", bam_get_qname(current->b)); + ret = -1; + break; + } + } + } + + if (param->opt_dist && !coord_fail) { + uint8_t *data; + char *dup_type; + int is_opt = 0; + int current_paired = (current->b->core.flag & BAM_FPAIRED) && !(current->b->core.flag & BAM_FMUNMAP); + + if ((data = bam_aux_get(current->b, "dt"))) { + if ((dup_type = bam_aux2Z(data))) { + if (strcmp(dup_type, "SQ") == 0) { + c->opt = 1; + } + } + } + + // need to run this to get the duplicates x and y scores + is_opt = optical_duplicate_partial(param, ori_name, t_beg, t_end, x, y, current->b, c, param->opt_dist, warn); + + if (!c->opt && is_opt) { + if (optical_retag(param, dup_hash, current->b, current_paired, optical_single, optical_pair)) { + ret = -1; + break; + } + + c->opt = 1; + } + + c->score = calc_score(current->b); + + if (current_paired) { + if ((c->mate_score = get_mate_score(current->b)) == -1) { + fprintf(samtools_stderr, "[markdup] error: no ms score tag. Please run samtools fixmate on file first.\n"); + ret = -1; + break; + } + } + } + + current = current->duplicate; + list->length++; + } + + if (!ret && coord_fail) + ret = coord_fail; + + return ret; +} + + +static int xcoord_sort(const void *a, const void *b) { + check_t *ac = (check_t *) a; + check_t *bc = (check_t *) b; + + return (ac->x - bc->x); +} + + +/* Check all the duplicates against each other to see if they are optical duplicates. */ +static int check_duplicate_chain(md_param_t *param, khash_t(duplicates) *dup_hash, check_list_t *list, + long *warn, long *optical_single, long *optical_pair) { + int ret = 0; + size_t curr = 0; + + qsort(list->c, list->length, sizeof(list->c[0]), xcoord_sort); + + while (curr < list->length - 1) { + check_t *current = &list->c[curr]; + size_t count = curr; + char *cur_name = bam_get_qname(current->b); + int current_paired = (current->b->core.flag & BAM_FPAIRED) && !(current->b->core.flag & BAM_FMUNMAP); + + while (++count < list->length && (list->c[count].x - current->x <= param->opt_dist)) { + // while close enough along the x coordinate + check_t *chk = &list->c[count]; + + if (current->opt && chk->opt) + continue; + + // if both are already optical duplicates there is no need to check again, otherwise... + + long ydiff; + + if (current->y > chk->y) { + ydiff = current->y - chk->y; + } else { + ydiff = chk->y - current->y; + } + + if (ydiff > param->opt_dist) + continue; + + // the number are right, check the names + if (strncmp(cur_name + current->beg, bam_get_qname(chk->b) + chk->beg, current->end - current->beg) != 0) + continue; + + // optical duplicates + int chk_dup = 0; + int chk_paired = (chk->b->core.flag & BAM_FPAIRED) && !(chk->b->core.flag & BAM_FMUNMAP); + + if (current_paired != chk_paired) { + if (!chk_paired) { + // chk is single vs pair, this is a dup. + chk_dup = 1; + } + } else { + // do it by scores + int64_t cur_score, chk_score; + + if ((current->b->core.flag & BAM_FQCFAIL) != (chk->b->core.flag & BAM_FQCFAIL)) { + if (current->b->core.flag & BAM_FQCFAIL) { + cur_score = 0; + chk_score = 1; + } else { + cur_score = 1; + chk_score = 0; + } + } else { + cur_score = current->score; + chk_score = chk->score; + + if (current_paired) { + // they are pairs so add mate scores. + chk_score += chk->mate_score; + cur_score += current->mate_score; + } + } + + if (cur_score == chk_score) { + if (strcmp(bam_get_qname(chk->b), cur_name) < 0) { + chk_score++; + } else { + chk_score--; + } + } + + if (cur_score > chk_score) { + chk_dup = 1; + } + } + + if (chk_dup) { + // the duplicate is the optical duplicate + if (!chk->opt) { // only change if not already an optical duplicate + if (optical_retag(param, dup_hash, chk->b, chk_paired, optical_single, optical_pair)) { + ret = -1; + goto fail; + } + + chk->opt = 1; + } + } else { + if (!current->opt) { + if (optical_retag(param, dup_hash, current->b, current_paired, optical_single, optical_pair)) { + ret = -1; + goto fail; + } + + current->opt = 1; + } + } + } + + curr++; + } + + fail: + return ret; +} + + +/* Where there is more than one duplicate go down the list and check for optical duplicates and change + do tags (where used) to point to original (non-duplicate) read. */ +static int find_duplicate_chains(md_param_t *param, klist_t(read_queue) *read_buffer, khash_t(duplicates) *dup_hash, check_list_t *dup_list, + const hts_pos_t prev_coord, const int32_t prev_tid, long *warn, long *optical_single, + long *optical_pair, const int check_range) { + int ret = 0; + kliter_t(read_queue) *rq; + + rq = kl_begin(read_buffer); + + while (rq != kl_end(read_buffer)) { + read_queue_t *in_read = &kl_val(rq); + + if (check_range) { + /* Just check against the moving window of reads based on coordinates and max read length. */ + if (in_read->pos + param->max_length > prev_coord && in_read->b->core.tid == prev_tid && (prev_tid != -1 || prev_coord != -1)) { + break; + } + } else { + // this is the last set of results and the end entry will be blank + if (!bam_get_qname(in_read->b)) { + break; + } + } + + if (!(in_read->b->core.flag & BAM_FDUP) && in_read->duplicate) { // is the head of a duplicate chain + + // check against the original for tagging and optical duplication + if ((ret = check_chain_against_original(param, dup_hash, in_read, dup_list, warn, optical_single, optical_pair))) { + if (ret < 0) { // real error + ret = -1; + break; + } else { // coordinate decoding error + ret = 0; + in_read->duplicate = NULL; + continue; + } + } + + // check the rest of the duplicates against each other for optical duplication + if (param->opt_dist && check_duplicate_chain(param, dup_hash, dup_list, warn, optical_single, optical_pair)) { + ret = -1; + break; + } + + in_read->duplicate = NULL; + } + + rq = kl_next(rq); + } + + return ret; +} + + +/* + Function to use when estimating library size. + + This is based on an approximate formula for the coverage of a set + obtained after sampling it a given number of times with replacement. + + x = number of items in the set (the number of unique fragments in the library) + + c = number of unique items (unique read pairs observed) + + n = number of items samples (total number of read pairs) + + c and n are known; x is unknown. + + As n -> infinity, the coverage (c/x) can be given as: + + c / x = 1 - exp(-n / x) (see https://math.stackexchange.com/questions/32800) + + This needs to be solved for x, so it is rearranged to put both terms on the + left side and estimate_library_size() finds a value of x which gives a + result of zero (or as close as it can get). + */ +static inline double coverage_equation(double x, double c, double n) { + return c / x - 1 + exp(-n / x); +} + + +/* estimate the library size, based on the Picard code in DuplicationMetrics.java*/ +static unsigned long estimate_library_size(unsigned long paired_reads, unsigned long paired_duplicate_reads, unsigned long optical) { + unsigned long estimated_size = 0; + unsigned long non_optical_pairs = (paired_reads - optical) / 2; + unsigned long unique_pairs = (paired_reads - paired_duplicate_reads) / 2; + unsigned long duplicate_pairs = (paired_duplicate_reads - optical) / 2; + + if ((non_optical_pairs && duplicate_pairs && unique_pairs) && (non_optical_pairs > duplicate_pairs)) { + double m = 1; + double M = 100; + int i; + + if (coverage_equation(m * (double)unique_pairs, (double)unique_pairs, (double)non_optical_pairs) < 0) { + fprintf(samtools_stderr, "[markdup] warning: unable to calculate estimated library size.\n"); + return estimated_size; + } + + while (coverage_equation(M * (double)unique_pairs, (double)unique_pairs, (double)non_optical_pairs) > 0) { + M *= 10; + } + + for (i = 0; i < 40; i++) { + double r = (m + M) / 2; + double u = coverage_equation(r * (double)unique_pairs, (double)unique_pairs, (double)non_optical_pairs); + + if (u > 0) { + m = r; + } else if (u < 0) { + M = r; + } else { + break; + } + } + + estimated_size = (unsigned long)(unique_pairs * (m + M) / 2); + } else { + fprintf(samtools_stderr, "[markdup] warning: unable to calculate estimated library size." + " Read pairs %ld should be greater than duplicate pairs %ld," + " which should both be non zero.\n", + non_optical_pairs, duplicate_pairs); + } + + return estimated_size; +} + + +/* Compare the reads near each other (coordinate sorted) and try to spot the duplicates. + Generally the highest quality scoring is chosen as the original and all others the duplicates. + The score is based on the sum of the quality values (<= 15) of the read and its mate (if any). + While single reads are compared to only one read of a pair, the pair will chosen as the original. + The comparison is done on position and orientation, see above for details. + + Marking the supplementary reads of a duplicate as also duplicates takes an extra file read/write + step. This is because the duplicate can occur before the primary read.*/ + +static int bam_mark_duplicates(md_param_t *param) { + bam_hdr_t *header = NULL; + khiter_t k; + khash_t(reads) *pair_hash = kh_init(reads); + khash_t(reads) *single_hash = kh_init(reads); + klist_t(read_queue) *read_buffer = kl_init(read_queue); + kliter_t(read_queue) *rq; + khash_t(duplicates) *dup_hash = kh_init(duplicates); + int32_t prev_tid; + hts_pos_t prev_coord; + read_queue_t *in_read; + int ret; + long reading, writing, excluded, duplicate, single, pair, single_dup, examined, optical, single_optical; + long np_duplicate, np_opt_duplicate; + long opt_warnings = 0, bc_warnings = 0; + tmp_file_t temp; + char *idx_fn = NULL; + int exclude = 0; + check_list_t dup_list = {NULL, 0, 0}; + + if (!pair_hash || !single_hash || !read_buffer || !dup_hash) { + fprintf(samtools_stderr, "[markdup] out of memory\n"); + goto fail; + } + + if ((header = sam_hdr_read(param->in)) == NULL) { + fprintf(samtools_stderr, "[markdup] error reading header\n"); + goto fail; + } + + // accept unknown, unsorted or coordinate sort order, but error on queryname sorted. + // only really works on coordinate sorted files. + kstring_t str = KS_INITIALIZE; + if (!sam_hdr_find_tag_hd(header, "SO", &str) && str.s && !strcmp(str.s, "queryname")) { + fprintf(samtools_stderr, "[markdup] error: queryname sorted, must be sorted by coordinate.\n"); + ks_free(&str); + goto fail; + } + ks_free(&str); + + if (!param->no_pg && sam_hdr_add_pg(header, "samtools", "VN", samtools_version(), + param->arg_list ? "CL" : NULL, + param->arg_list ? param->arg_list : NULL, + NULL) != 0) { + fprintf(samtools_stderr, "[markdup] warning: unable to add @PG line to header.\n"); + } + + if (sam_hdr_write(param->out, header) < 0) { + fprintf(samtools_stderr, "[markdup] error writing header.\n"); + goto fail; + } + if (param->write_index) { + if (!(idx_fn = auto_index(param->out, param->out_fn, header))) + goto fail; + } + + // used for coordinate order checks + prev_tid = prev_coord = 0; + + // get the buffer going + in_read = kl_pushp(read_queue, read_buffer); + if (!in_read) { + fprintf(samtools_stderr, "[markdup] out of memory\n"); + goto fail; + } + + // handling supplementary reads needs a temporary file + if (param->supp) { + if (tmp_file_open_write(&temp, param->prefix, 1)) { + fprintf(samtools_stderr, "[markdup] error: unable to open tmp file %s.\n", param->prefix); + goto fail; + } + } + + if ((in_read->b = bam_init1()) == NULL) { + fprintf(samtools_stderr, "[markdup] error: unable to allocate memory for alignment.\n"); + goto fail; + } + + if (param->check_chain && !(param->tag || param->opt_dist)) + param->check_chain = 0; + + if (param->check_chain) { + dup_list.size = 128; + dup_list.c = NULL; + + if ((dup_list.c = malloc(dup_list.size * sizeof(check_t))) == NULL) { + fprintf(samtools_stderr, "[markdup] error: unable to allocate memory for dup_list.\n"); + goto fail; + } + } + + reading = writing = excluded = single_dup = duplicate = examined = pair = single = optical = single_optical = 0; + np_duplicate = np_opt_duplicate = 0; + + while ((ret = sam_read1(param->in, header, in_read->b)) >= 0) { + int dup_checked = 0; + + // do some basic coordinate order checks + if (in_read->b->core.tid >= 0) { // -1 for unmapped reads + if (in_read->b->core.tid < prev_tid || + ((in_read->b->core.tid == prev_tid) && (in_read->b->core.pos < prev_coord))) { + fprintf(samtools_stderr, "[markdup] error: not in coordinate sorted order.\n"); + goto fail; + } + } + + prev_coord = in_read->pos = in_read->b->core.pos; + prev_tid = in_read->b->core.tid; + in_read->pair_key.single = 1; + in_read->single_key.single = 0; + in_read->duplicate = NULL; + in_read->dup_checked = 0; + + reading++; + + if (param->clear && (in_read->b->core.flag & BAM_FDUP)) { + uint8_t *data; + + in_read->b->core.flag ^= BAM_FDUP; + + if ((data = bam_aux_get(in_read->b, "dt")) != NULL) { + bam_aux_del(in_read->b, data); + } + + if ((data = bam_aux_get(in_read->b, "do")) != NULL) { + bam_aux_del(in_read->b, data); + } + } + + if (param->include_fails) { + exclude |= (BAM_FSECONDARY | BAM_FSUPPLEMENTARY | BAM_FUNMAP); + } else { + exclude |= (BAM_FSECONDARY | BAM_FSUPPLEMENTARY | BAM_FUNMAP | BAM_FQCFAIL); + } + + // read must not be secondary, supplementary, unmapped or (possibly) failed QC + if (!(in_read->b->core.flag & exclude)) { + examined++; + + + // look at the pairs first + if ((in_read->b->core.flag & BAM_FPAIRED) && !(in_read->b->core.flag & BAM_FMUNMAP)) { + int ret, mate_tmp; + key_data_t pair_key; + key_data_t single_key; + in_hash_t *bp; + + if (make_pair_key(param, &pair_key, in_read->b, &bc_warnings)) { + fprintf(samtools_stderr, "[markdup] error: unable to assign pair hash key.\n"); + goto fail; + } + + make_single_key(param, &single_key, in_read->b, &bc_warnings); + + pair++; + in_read->pos = single_key.this_coord; // cigar/orientation modified pos + + // put in singles hash for checking against non paired reads + k = kh_put(reads, single_hash, single_key, &ret); + + if (ret > 0) { // new + // add to single duplicate hash + bp = &kh_val(single_hash, k); + bp->p = in_read; + in_read->single_key = single_key; + } else if (ret == 0) { // exists + // look at singles only for duplication marking + bp = &kh_val(single_hash, k); + + if (!(bp->p->b->core.flag & BAM_FPAIRED) || (bp->p->b->core.flag & BAM_FMUNMAP)) { + // singleton will always be marked duplicate even if + // scores more than one read of the pair + bam1_t *dup = bp->p->b; + + if (param->check_chain) + in_read->duplicate = bp->p; + + bp->p = in_read; + + if (mark_duplicates(param, dup_hash, bp->p->b, dup, &single_optical, &opt_warnings)) + goto fail; + + single_dup++; + } + } else { + fprintf(samtools_stderr, "[markdup] error: single hashing failure.\n"); + goto fail; + } + + // now do the pair + k = kh_put(reads, pair_hash, pair_key, &ret); + + if (ret > 0) { // new + // add to the pair hash + bp = &kh_val(pair_hash, k); + bp->p = in_read; + in_read->pair_key = pair_key; + } else if (ret == 0) { + int64_t old_score, new_score, tie_add = 0; + bam1_t *dup = NULL; + + bp = &kh_val(pair_hash, k); + + if ((bp->p->b->core.flag & BAM_FQCFAIL) != (in_read->b->core.flag & BAM_FQCFAIL)) { + if (bp->p->b->core.flag & BAM_FQCFAIL) { + old_score = 0; + new_score = 1; + } else { + old_score = 1; + new_score = 0; + } + } else { + if ((mate_tmp = get_mate_score(bp->p->b)) == -1) { + fprintf(samtools_stderr, "[markdup] error: no ms score tag. Please run samtools fixmate on file first.\n"); + goto fail; + } else { + old_score = calc_score(bp->p->b) + mate_tmp; + } + + if ((mate_tmp = get_mate_score(in_read->b)) == -1) { + fprintf(samtools_stderr, "[markdup] error: no ms score tag. Please run samtools fixmate on file first.\n"); + goto fail; + } else { + new_score = calc_score(in_read->b) + mate_tmp; + } + } + + // choose the highest score as the original + // and add it to the pair hash, mark the other as duplicate + + if (new_score == old_score) { + if (strcmp(bam_get_qname(in_read->b), bam_get_qname(bp->p->b)) < 0) { + tie_add = 1; + } else { + tie_add = -1; + } + } + + if (new_score + tie_add > old_score) { // swap reads + dup = bp->p->b; + + if (param->check_chain) { + + if (in_read->duplicate) { + read_queue_t *current = in_read->duplicate; + + while (current->duplicate) { + current = current->duplicate; + } + + current->duplicate = bp->p; + } else { + in_read->duplicate = bp->p; + } + } + + bp->p = in_read; + } else { + if (param->check_chain) { + if (bp->p->duplicate) { + if (in_read->duplicate) { + read_queue_t *current = bp->p->duplicate; + + while (current->duplicate) { + current = current->duplicate; + } + + current->duplicate = in_read->duplicate; + } + + in_read->duplicate = bp->p->duplicate; + } + + bp->p->duplicate = in_read; + } + + dup = in_read->b; + } + + if (mark_duplicates(param, dup_hash, bp->p->b, dup, &optical, &opt_warnings)) + goto fail; + + duplicate++; + } else { + fprintf(samtools_stderr, "[markdup] error: pair hashing failure.\n"); + goto fail; + } + } else { // do the single (or effectively single) reads + int ret; + key_data_t single_key; + in_hash_t *bp; + + make_single_key(param, &single_key, in_read->b, &bc_warnings); + + single++; + in_read->pos = single_key.this_coord; // cigar/orientation modified pos + + k = kh_put(reads, single_hash, single_key, &ret); + + if (ret > 0) { // new + bp = &kh_val(single_hash, k); + bp->p = in_read; + in_read->single_key = single_key; + } else if (ret == 0) { // exists + bp = &kh_val(single_hash, k); + + if ((bp->p->b->core.flag & BAM_FPAIRED) && !(bp->p->b->core.flag & BAM_FMUNMAP)) { + // if matched against one of a pair just mark as duplicate + + if (param->check_chain) { + if (bp->p->duplicate) { + in_read->duplicate = bp->p->duplicate; + } + + bp->p->duplicate = in_read; + } + + if (mark_duplicates(param, dup_hash, bp->p->b, in_read->b, &single_optical, &opt_warnings)) + goto fail; + + } else { + int64_t old_score, new_score; + bam1_t *dup = NULL; + + old_score = calc_score(bp->p->b); + new_score = calc_score(in_read->b); + + // choose the highest score as the original, add it + // to the single hash and mark the other as duplicate + if (new_score > old_score) { // swap reads + dup = bp->p->b; + + if (param->check_chain) + in_read->duplicate = bp->p; + + bp->p = in_read; + } else { + if (param->check_chain) { + if (bp->p->duplicate) { + in_read->duplicate = bp->p->duplicate; + } + + bp->p->duplicate = in_read; + } + + dup = in_read->b; + } + + if (mark_duplicates(param, dup_hash, bp->p->b, dup, &single_optical, &opt_warnings)) + goto fail; + } + + single_dup++; + } else { + fprintf(samtools_stderr, "[markdup] error: single hashing failure.\n"); + goto fail; + } + } + } else { + excluded++; + } + + // loop through the stored reads and write out those we + // no longer need + rq = kl_begin(read_buffer); + while (rq != kl_end(read_buffer)) { + in_read = &kl_val(rq); + + /* keep a moving window of reads based on coordinates and max read length. Any unaligned reads + should just be written as they cannot be matched as duplicates. */ + if (in_read->pos + param->max_length > prev_coord && in_read->b->core.tid == prev_tid && (prev_tid != -1 || prev_coord != -1)) { + break; + } + + if (!dup_checked && param->check_chain) { + // check for multiple optical duplicates of the same original read + + if (find_duplicate_chains(param, read_buffer, dup_hash, &dup_list, prev_coord, prev_tid, &opt_warnings, &single_optical, &optical, 1)) { + fprintf(samtools_stderr, "[markdup] error: duplicate checking failed.\n"); + goto fail; + } + + dup_checked = 1; + } + + + if (param->check_chain && (in_read->b->core.flag & BAM_FDUP) && !in_read->dup_checked && !(in_read->b->core.flag & exclude)) { + break; + } + + if (!param->remove_dups || !(in_read->b->core.flag & BAM_FDUP)) { + if (param->supp) { + if (tmp_file_write(&temp, in_read->b)) { + fprintf(samtools_stderr, "[markdup] error: writing temp output failed.\n"); + goto fail; + } + } else { + if (sam_write1(param->out, header, in_read->b) < 0) { + fprintf(samtools_stderr, "[markdup] error: writing output failed.\n"); + goto fail; + } + } + + writing++; + } + + // remove from hash + if (in_read->pair_key.single == 0) { + k = kh_get(reads, pair_hash, in_read->pair_key); + kh_del(reads, pair_hash, k); + } + + if (in_read->single_key.single == 1) { + k = kh_get(reads, single_hash, in_read->single_key); + kh_del(reads, single_hash, k); + } + + kl_shift(read_queue, read_buffer, NULL); + bam_destroy1(in_read->b); + rq = kl_begin(read_buffer); + } + + // set the next one up for reading + in_read = kl_pushp(read_queue, read_buffer); + if (!in_read) { + fprintf(samtools_stderr, "[markdup] out of memory\n"); + goto fail; + } + + if ((in_read->b = bam_init1()) == NULL) { + fprintf(samtools_stderr, "[markdup] error: unable to allocate memory for alignment.\n"); + goto fail; + } + } + + if (ret < -1) { + fprintf(samtools_stderr, "[markdup] error: truncated input file.\n"); + goto fail; + } + + // one last check + if (param->tag || param->opt_dist) { + if (find_duplicate_chains(param, read_buffer, dup_hash, &dup_list, prev_coord, prev_tid, &opt_warnings, &single_optical, &optical, 0)) { + fprintf(samtools_stderr, "[markdup] error: duplicate checking failed.\n"); + goto fail; + } + } + + // write out the end of the list + rq = kl_begin(read_buffer); + while (rq != kl_end(read_buffer)) { + in_read = &kl_val(rq); + + if (bam_get_qname(in_read->b)) { // last entry will be blank + if (!param->remove_dups || !(in_read->b->core.flag & BAM_FDUP)) { + if (param->supp) { + if (tmp_file_write(&temp, in_read->b)) { + fprintf(samtools_stderr, "[markdup] error: writing temp output failed.\n"); + goto fail; + } + } else { + if (sam_write1(param->out, header, in_read->b) < 0) { + fprintf(samtools_stderr, "[markdup] error: writing output failed.\n"); + goto fail; + } + } + + writing++; + } + } + + kl_shift(read_queue, read_buffer, NULL); + bam_destroy1(in_read->b); + rq = kl_begin(read_buffer); + } + + if (param->supp) { + bam1_t *b; + + if (tmp_file_end_write(&temp)) { + fprintf(samtools_stderr, "[markdup] error: unable to end tmp writing.\n"); + goto fail; + } + + // read data from temp file and mark duplicate supplementary alignments + + if (tmp_file_begin_read(&temp)) { + goto fail; + } + + b = bam_init1(); + + while ((ret = tmp_file_read(&temp, b)) > 0) { + + if ((b->core.flag & BAM_FSUPPLEMENTARY) || (b->core.flag & BAM_FUNMAP) || (b->core.flag & BAM_FSECONDARY)) { + + k = kh_get(duplicates, dup_hash, bam_get_qname(b)); + + if (k != kh_end(dup_hash)) { + + b->core.flag |= BAM_FDUP; + np_duplicate++; + + if (param->tag && kh_val(dup_hash, k).name) { + if (bam_aux_update_str(b, "do", strlen(kh_val(dup_hash, k).name) + 1, (char*)kh_val(dup_hash, k).name)) { + fprintf(samtools_stderr, "[markdup] error: unable to append supplementary 'do' tag.\n"); + goto fail; + } + } + + if (param->opt_dist) { + if (kh_val(dup_hash, k).type) { + bam_aux_update_str(b, "dt", 3, "SQ"); + np_opt_duplicate++; + } else { + bam_aux_update_str(b, "dt", 3, "LB"); + } + } + } + } + + if (!param->remove_dups || !(b->core.flag & BAM_FDUP)) { + if (sam_write1(param->out, header, b) < 0) { + fprintf(samtools_stderr, "[markdup] error: writing final output failed.\n"); + goto fail; + } + } + } + + if (ret == -1) { + fprintf(samtools_stderr, "[markdup] error: failed to read tmp file.\n"); + goto fail; + } + + for (k = kh_begin(dup_hash); k != kh_end(dup_hash); ++k) { + if (kh_exist(dup_hash, k)) { + free(kh_val(dup_hash, k).name); + free((char *)kh_key(dup_hash, k)); + kh_key(dup_hash, k) = NULL; + } + } + + tmp_file_destroy(&temp); + bam_destroy1(b); + } + + if (opt_warnings) { + fprintf(samtools_stderr, "[markdup] warning: number of failed attempts to get coordinates from read names = %ld\n", + opt_warnings); + } + + if (bc_warnings) { + fprintf(samtools_stderr, "[markdup] warning: number of failed attempts to get barcodes = %ld\n", bc_warnings); + } + + if (param->do_stats) { + FILE *fp; + int file_open = 0; + unsigned long els; + + if (param->stats_file) { + if (NULL == (fp = fopen(param->stats_file, "w"))) { + fprintf(samtools_stderr, "[markdup] warning: cannot write stats to %s.\n", param->stats_file); + fp = samtools_stderr; + } else { + file_open = 1; + } + } else { + fp = samtools_stderr; + } + + els = estimate_library_size(pair, duplicate, optical); + + fprintf(fp, + "COMMAND: %s\n" + "READ: %ld\n" + "WRITTEN: %ld\n" + "EXCLUDED: %ld\n" + "EXAMINED: %ld\n" + "PAIRED: %ld\n" + "SINGLE: %ld\n" + "DUPLICATE PAIR: %ld\n" + "DUPLICATE SINGLE: %ld\n" + "DUPLICATE PAIR OPTICAL: %ld\n" + "DUPLICATE SINGLE OPTICAL: %ld\n" + "DUPLICATE NON PRIMARY: %ld\n" + "DUPLICATE NON PRIMARY OPTICAL: %ld\n" + "DUPLICATE PRIMARY TOTAL: %ld\n" + "DUPLICATE TOTAL: %ld\n" + "ESTIMATED_LIBRARY_SIZE: %ld\n", param->arg_list, reading, writing, excluded, examined, pair, single, + duplicate, single_dup, optical, single_optical, np_duplicate, np_opt_duplicate, + single_dup + duplicate, single_dup + duplicate + np_duplicate, els); + + if (file_open) { + fclose(fp); + } + } + + if (param->write_index) { + if (sam_idx_save(param->out) < 0) { + print_error_errno("markdup", "writing index failed"); + goto fail; + } + } + + if (param->check_chain && (param->tag || param->opt_dist)) + free(dup_list.c); + + kh_destroy(reads, pair_hash); + kh_destroy(reads, single_hash); + kl_destroy(read_queue, read_buffer); + kh_destroy(duplicates, dup_hash); + sam_hdr_destroy(header); + + return 0; + + fail: + for (rq = kl_begin(read_buffer); rq != kl_end(read_buffer); rq = kl_next(rq)) + bam_destroy1(kl_val(rq).b); + kl_destroy(read_queue, read_buffer); + + for (k = kh_begin(dup_hash); k != kh_end(dup_hash); ++k) { + if (kh_exist(dup_hash, k)) { + free((char *)kh_key(dup_hash, k)); + } + } + kh_destroy(duplicates, dup_hash); + + if (param->check_chain && (param->tag || param->opt_dist)) + free(dup_list.c); + + kh_destroy(reads, pair_hash); + kh_destroy(reads, single_hash); + sam_hdr_destroy(header); + return 1; +} + + +static int markdup_usage(void) { + fprintf(samtools_stderr, "\n"); + fprintf(samtools_stderr, "Usage: samtools markdup \n\n"); + fprintf(samtools_stderr, "Option: \n"); + fprintf(samtools_stderr, " -r Remove duplicate reads\n"); + fprintf(samtools_stderr, " -l INT Max read length (default 300 bases)\n"); + fprintf(samtools_stderr, " -S Mark supplementary alignments of duplicates as duplicates (slower).\n"); + fprintf(samtools_stderr, " -s Report stats.\n"); + fprintf(samtools_stderr, " -f NAME Write stats to named file. Implies -s.\n"); + fprintf(samtools_stderr, " -T PREFIX Write temporary files to PREFIX.samtools.nnnn.nnnn.tmp.\n"); + fprintf(samtools_stderr, " -d INT Optical distance (if set, marks with dt tag)\n"); + fprintf(samtools_stderr, " -c Clear previous duplicate settings and tags.\n"); + fprintf(samtools_stderr, " -m --mode TYPE Duplicate decision method for paired reads.\n" + " TYPE = t measure positions based on template start/end (default).\n" + " s measure positions based on sequence start.\n"); + fprintf(samtools_stderr, " -u Output uncompressed data\n"); + fprintf(samtools_stderr, " --include-fails Include quality check failed reads.\n"); + fprintf(samtools_stderr, " --no-PG Do not add a PG line\n"); + fprintf(samtools_stderr, " --no-multi-dup Reduced duplicates of duplicates checking.\n"); + fprintf(samtools_stderr, " --read-coords STR Regex for coords from read name.\n"); + fprintf(samtools_stderr, " --coords-order STR Order of regex elements. txy (default). With t being a part of\n" + " the read names that must be equal and x/y being coordinates.\n"); + fprintf(samtools_stderr, " --barcode-tag STR Use barcode a tag that duplicates much match.\n"); + fprintf(samtools_stderr, " --barcode-name Use the UMI/barcode in the read name (eigth colon delimited part).\n"); + fprintf(samtools_stderr, " --barcode-rgx STR Regex for barcode in the readname (alternative to --barcode-name).\n"); + fprintf(samtools_stderr, " -t Mark primary duplicates with the name of the original in a \'do\' tag." + " Mainly for information and debugging.\n"); + + sam_global_opt_help(samtools_stderr, "-.O..@.."); + + fprintf(samtools_stderr, "\nThe input file must be coordinate sorted and must have gone" + " through fixmates with the mate scoring option on.\n"); + + return 1; +} + + +int bam_markdup(int argc, char **argv) { + int c, ret, bc_name = 0; + char wmode[4] = {'w', 'b', 0, 0}; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + htsThreadPool p = {NULL, 0}; + kstring_t tmpprefix = {0, 0, NULL}; + struct stat st; + unsigned int t; + char *regex = NULL, *bc_regex = NULL; + char *regex_order = "txy"; + md_param_t param = {NULL, NULL, NULL, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL}; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + {"include-fails", no_argument, NULL, 1001}, + {"no-PG", no_argument, NULL, 1002}, + {"mode", required_argument, NULL, 'm'}, + {"no-multi-dup", no_argument, NULL, 1003}, + {"read-coords", required_argument, NULL, 1004}, + {"coords-order", required_argument, NULL, 1005}, + {"barcode-tag", required_argument, NULL, 1006}, + {"barcode-name", no_argument, NULL, 1007}, + {"barcode-rgx", required_argument, NULL, 1008}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "rsl:StT:O:@:f:d:cm:u", lopts, NULL)) >= 0) { + switch (c) { + case 'r': param.remove_dups = 1; break; + case 'l': param.max_length = atoi(optarg); break; + case 's': param.do_stats = 1; break; + case 'T': kputs(optarg, &tmpprefix); break; + case 'S': param.supp = 1; break; + case 't': param.tag = 1; break; + case 'f': param.stats_file = optarg; param.do_stats = 1; break; + case 'd': param.opt_dist = atoi(optarg); break; + case 'c': param.clear = 1; break; + case 'm': + if (strcmp(optarg, "t") == 0) { + param.mode = MD_MODE_TEMPLATE; + } else if (strcmp(optarg, "s") == 0) { + param.mode = MD_MODE_SEQUENCE; + } else { + fprintf(samtools_stderr, "[markdup] error: unknown mode '%s'.\n", optarg); + return markdup_usage(); + } + + break; + case 'u': wmode[2] = '0'; break; + case 1001: param.include_fails = 1; break; + case 1002: param.no_pg = 1; break; + case 1003: param.check_chain = 0; break; + case 1004: regex = optarg; break; + case 1005: regex_order = optarg; break; + case 1006: param.barcode = optarg; break; + case 1007: bc_name = 1; break; + case 1008: bc_name = 1, bc_regex = optarg; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': return markdup_usage(); + } + } + + if (optind + 2 > argc) + return markdup_usage(); + + if (param.barcode && bc_name) { + fprintf(samtools_stderr, "[markdup] Error: cannot specify --barcode-tag and " + "--barcode-name (or --barcode-rgx) at same time.\n"); + return 1; + } + + if (param.opt_dist < 0) param.opt_dist = 0; + if (param.max_length < 0) param.max_length = 300; + + if (regex) { + int result; + + // set the order the elements of the regex are assigned to. + // x and y being coordinates, t being any other important part of the read + // e.g. tile and lane + // x and y order does not matter as long as it is consistent + + if ((strncmp(regex_order, "txy", 3) == 0) || (strncmp(regex_order, "tyx", 3) == 0)) { + param.rgx_t = 1; + param.rgx_x = 2; + param.rgx_y = 3; + } else if ((strncmp(regex_order, "xyt", 3) == 0) || (strncmp(regex_order, "yxt", 3) == 0)) { + param.rgx_x = 1; + param.rgx_y = 2; + param.rgx_t = 3; + } else if ((strncmp(regex_order, "xty", 3) == 0) || (strncmp(regex_order, "ytx", 3) == 0)) { + param.rgx_x = 1; + param.rgx_t = 2; + param.rgx_y = 3; + } else if ((strncmp(regex_order, "xy", 2) == 0) || (strncmp(regex_order, "yx", 2) == 0)) { + param.rgx_x = 1; + param.rgx_y = 2; + param.rgx_t = 0; + } else { + fprintf(samtools_stderr, "[markdup] error: could not recognise regex coordinate order \"%s\".\n", regex_order); + return 1; + } + + if ((param.rgx = malloc(sizeof(regex_t))) == NULL) { + fprintf(samtools_stderr, "[markdup] error: could not allocate memory for regex.\n"); + return 1; + } + + if ((result = regcomp(param.rgx, regex, REG_EXTENDED))) { + char err_msg[256]; + + regerror(result, param.rgx, err_msg, 256); + fprintf(samtools_stderr, "[markdup] error: regex error \"%s\"\n", err_msg); + free(param.rgx); + return 1; + } + } + + if (bc_name) { + int result; + + /* From Illumina UMI documentation: "The UMI sequence is located in the + eighth colon-delimited field of the read name (QNAME)". */ + char *rgx = "[0-9A-Za-z]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+:([!-?A-~]+)"; + + if ((param.bc_rgx = malloc(sizeof(regex_t))) == NULL) { + fprintf(samtools_stderr, "[markdup] error: could not allocate memory for barcode regex.\n"); + return 1; + } + + if (bc_regex) { + rgx = bc_regex; + } + + if ((result = regcomp(param.bc_rgx, rgx, REG_EXTENDED))) { + char err_msg[256]; + + regerror(result, param.bc_rgx, err_msg, 256); + fprintf(samtools_stderr, "[markdup] error: barcode regex error \"%s\"\n", err_msg); + free(param.bc_rgx); + return 1; + } + } + + param.in = sam_open_format(argv[optind], "r", &ga.in); + + if (!param.in) { + print_error_errno("markdup", "failed to open \"%s\" for input", argv[optind]); + return 1; + } + + sam_open_mode(wmode + 1, argv[optind + 1], NULL); + param.out = sam_open_format(argv[optind + 1], wmode, &ga.out); + + if (!param.out) { + print_error_errno("markdup", "failed to open \"%s\" for output", argv[optind + 1]); + return 1; + } + + if (ga.nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(samtools_stderr, "[markdup] error creating thread pool\n"); + return 1; + } + + hts_set_opt(param.in, HTS_OPT_THREAD_POOL, &p); + hts_set_opt(param.out, HTS_OPT_THREAD_POOL, &p); + } + + // actual stuff happens here + + // we need temp files so fix up the name here + if (tmpprefix.l == 0) { + + if (strcmp(argv[optind + 1], "-") != 0) + ksprintf(&tmpprefix, "%s.", argv[optind + 1]); + else + kputc('.', &tmpprefix); + } + + if (stat(tmpprefix.s, &st) == 0 && S_ISDIR(st.st_mode)) { + if (tmpprefix.s[tmpprefix.l-1] != '/') kputc('/', &tmpprefix); + } + + t = ((unsigned) time(NULL)) ^ ((unsigned) clock()); + ksprintf(&tmpprefix, "samtools.%d.%u.tmp", (int) getpid(), t % 10000); + param.prefix = tmpprefix.s; + + param.arg_list = stringify_argv(argc + 1, argv - 1); + param.write_index = ga.write_index; + param.out_fn = argv[optind + 1]; + + ret = bam_mark_duplicates(¶m); + + sam_close(param.in); + + if (sam_close(param.out) < 0) { + fprintf(samtools_stderr, "[markdup] error closing output file\n"); + ret = 1; + } + + if (p.pool) hts_tpool_destroy(p.pool); + + if (param.rgx) { + regfree(param.rgx); + free(param.rgx); + } + + if (param.bc_rgx) { + regfree(param.bc_rgx); + free(param.bc_rgx); + } + + free(param.arg_list); + free(tmpprefix.s); + sam_global_args_free(&ga); + + return ret; +} diff --git a/samtools/bam_mate.c b/samtools/bam_mate.c new file mode 100644 index 0000000..4239fd1 --- /dev/null +++ b/samtools/bam_mate.c @@ -0,0 +1,507 @@ +/* bam_mate.c -- fix mate pairing information and clean up flags. + + Copyright (C) 2009, 2011-2017, 2019 Genome Research Ltd. + Portions copyright (C) 2011 Broad Institute. + Portions copyright (C) 2012 Peter Cock, The James Hutton Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include "htslib/kstring.h" +#include "htslib/sam.h" +#include "samtools.h" + + +#define MD_MIN_QUALITY 15 + +/* + * This function calculates ct tag for two bams, it assumes they are from the same template and + * writes the tag to the first read in position terms. + */ +static void bam_template_cigar(bam1_t *b1, bam1_t *b2, kstring_t *str) +{ + bam1_t *swap; + int i; + hts_pos_t end; + uint32_t *cigar; + str->l = 0; + if (b1->core.tid != b2->core.tid || b1->core.tid < 0 || b1->core.pos < 0 || b2->core.pos < 0 || b1->core.flag&BAM_FUNMAP || b2->core.flag&BAM_FUNMAP) return; // coordinateless or not on the same chr; skip + if (b1->core.pos > b2->core.pos) swap = b1, b1 = b2, b2 = swap; // make sure b1 has a smaller coordinate + kputc((b1->core.flag & BAM_FREAD1)? '1' : '2', str); // segment index + kputc((b1->core.flag & BAM_FREVERSE)? 'R' : 'F', str); // strand + for (i = 0, cigar = bam_get_cigar(b1); i < b1->core.n_cigar; ++i) { + kputw(bam_cigar_oplen(cigar[i]), str); + kputc(bam_cigar_opchr(cigar[i]), str); + } + end = bam_endpos(b1); + kputw(b2->core.pos - end, str); + kputc('T', str); + kputc((b2->core.flag & BAM_FREAD1)? '1' : '2', str); // segment index + kputc((b2->core.flag & BAM_FREVERSE)? 'R' : 'F', str); // strand + for (i = 0, cigar = bam_get_cigar(b2); i < b2->core.n_cigar; ++i) { + kputw(bam_cigar_oplen(cigar[i]), str); + kputc(bam_cigar_opchr(cigar[i]), str); + } + + uint8_t* data; + if ((data = bam_aux_get(b1,"ct")) != NULL) bam_aux_del(b1, data); + if ((data = bam_aux_get(b2,"ct")) != NULL) bam_aux_del(b2, data); + + bam_aux_append(b1, "ct", 'Z', str->l+1, (uint8_t*)str->s); +} + +/* + * What This Program is Supposed To Do: + * Fill in mate coordinates, ISIZE and mate related flags from a name-sorted + * alignment. + * + * How We Handle Input + * + * Secondary and supplementary Reads: + * -write to output unchanged + * All Reads: + * -if pos == 0 (1 based), tid == -1 set UNMAPPED flag + * single Reads: + * -if pos == 0 (1 based), tid == -1, or UNMAPPED then set UNMAPPED, pos = 0, + * tid = -1 + * -clear bad flags (PAIRED, MREVERSE, PROPER_PAIR) + * -set mpos = 0 (1 based), mtid = -1 and isize = 0 + * -write to output + * Paired Reads: + * -if read is unmapped and mate is not, set pos and tid to equal that of mate + * -sync mate flags (MREVERSE, MUNMAPPED), mpos, mtid + * -recalculate ISIZE if possible, otherwise set it to 0 + * -optionally clear PROPER_PAIR flag from reads where mapping or orientation + * indicate this is not possible (Illumina orientation only) + * -calculate ct and apply to lowest positioned read + * -write to output + * Limitations + * -Does not handle tandem reads + * -Should mark supplementary reads the same as primary. + * Notes + * -CT definition appears to be something else in spec, this was in here before + * I started tampering with it, anyone know what is going on here? To work + * around this I have demoted the CT this tool generates to ct. + */ + +static void sync_unmapped_pos_inner(bam1_t* src, bam1_t* dest) { + if ((dest->core.flag & BAM_FUNMAP) && !(src->core.flag & BAM_FUNMAP)) { + // Set unmapped read's RNAME and POS to those of its mapped mate + // (recommended best practice, ensures if coord sort will be together) + dest->core.tid = src->core.tid; + dest->core.pos = src->core.pos; + } +} + +static void sync_mate_inner(bam1_t* src, bam1_t* dest) +{ + // sync mate pos information + dest->core.mtid = src->core.tid; dest->core.mpos = src->core.pos; + // sync flag info + if (src->core.flag&BAM_FREVERSE) + dest->core.flag |= BAM_FMREVERSE; + else + dest->core.flag &= ~BAM_FMREVERSE; + if (src->core.flag & BAM_FUNMAP) { + dest->core.flag |= BAM_FMUNMAP; + } +} + +// Is it plausible that these reads are properly paired? +// Can't really give definitive answer without checking isize +static bool plausibly_properly_paired(bam1_t* a, bam1_t* b) +{ + if ((a->core.flag & BAM_FUNMAP) || (b->core.flag & BAM_FUNMAP)) return false; + assert(a->core.tid >= 0); // This should never happen if FUNMAP is set correctly + + if (a->core.tid != b->core.tid) return false; + + bam1_t* first = a; + bam1_t* second = b; + hts_pos_t a_pos = a->core.flag&BAM_FREVERSE ? bam_endpos(a) : a->core.pos; + hts_pos_t b_pos = b->core.flag&BAM_FREVERSE ? bam_endpos(b) : b->core.pos; + if (a_pos > b_pos) { + first = b; + second = a; + } else { + first = a; + second = b; + } + + if (!(first->core.flag&BAM_FREVERSE) && (second->core.flag&BAM_FREVERSE)) + return true; + else + return false; +} + +// Returns 0 on success, -1 on failure. +static int bam_format_cigar(const bam1_t* b, kstring_t* str) +{ + // An empty cigar is a special case return "*" rather than "" + if (b->core.n_cigar == 0) { + return (kputc('*', str) == EOF) ? -1 : 0; + } + + const uint32_t *cigar = bam_get_cigar(b); + uint32_t i; + + for (i = 0; i < b->core.n_cigar; ++i) { + if (kputw(bam_cigar_oplen(cigar[i]), str) == EOF) return -1; + if (kputc(bam_cigar_opchr(cigar[i]), str) == EOF) return -1; + } + + return 0; +} + +// Returns 0 on success, -1 on failure. +static int sync_mq_mc(bam1_t* src, bam1_t* dest) +{ + if ( (src->core.flag & BAM_FUNMAP) == 0 ) { // If mapped + // Copy Mate Mapping Quality + uint32_t mq = src->core.qual; + uint8_t* data; + if ((data = bam_aux_get(dest,"MQ")) != NULL) { + bam_aux_del(dest, data); + } + + bam_aux_append(dest, "MQ", 'i', sizeof(uint32_t), (uint8_t*)&mq); + } + // Copy mate cigar if either read is mapped + if ( (src->core.flag & BAM_FUNMAP) == 0 || (dest->core.flag & BAM_FUNMAP) == 0 ) { + uint8_t* data_mc; + if ((data_mc = bam_aux_get(dest,"MC")) != NULL) { + bam_aux_del(dest, data_mc); + } + + // Convert cigar to string + kstring_t mc = { 0, 0, NULL }; + if (bam_format_cigar(src, &mc) < 0) return -1; + + bam_aux_append(dest, "MC", 'Z', ks_len(&mc)+1, (uint8_t*)ks_str(&mc)); + free(mc.s); + } + return 0; +} + +// Copy flags. +// Returns 0 on success, -1 on failure. +static int sync_mate(bam1_t* a, bam1_t* b) +{ + sync_unmapped_pos_inner(a,b); + sync_unmapped_pos_inner(b,a); + sync_mate_inner(a,b); + sync_mate_inner(b,a); + if (sync_mq_mc(a,b) < 0) return -1; + if (sync_mq_mc(b,a) < 0) return -1; + return 0; +} + + +static uint32_t calc_mate_score(bam1_t *b) +{ + uint32_t score = 0; + uint8_t *qual = bam_get_qual(b); + int i; + + for (i = 0; i < b->core.l_qseq; i++) { + if (qual[i] >= MD_MIN_QUALITY) score += qual[i]; + } + + return score; +} + + +static int add_mate_score(bam1_t *src, bam1_t *dest) +{ + uint8_t *data_ms; + uint32_t mate_score = calc_mate_score(src); + + if ((data_ms = bam_aux_get(dest, "ms")) != NULL) { + bam_aux_del(dest, data_ms); + } + + if (bam_aux_append(dest, "ms", 'i', sizeof(uint32_t), (uint8_t*)&mate_score) == -1) { + return -1; + } + + return 0; +} + +// currently, this function ONLY works if each read has one hit +static int bam_mating_core(samFile *in, samFile *out, int remove_reads, int proper_pair_check, int add_ct, int do_mate_scoring, char *arg_list, int no_pg) +{ + sam_hdr_t *header; + bam1_t *b[2] = { NULL, NULL }; + int curr, has_prev, result; + hts_pos_t pre_end = 0, cur_end = 0; + kstring_t str = KS_INITIALIZE; + + header = sam_hdr_read(in); + if (header == NULL) { + fprintf(stderr, "[bam_mating_core] ERROR: Couldn't read header\n"); + return 1; + } + + // Accept unknown, unsorted, or queryname sort order, but error on coordinate sorted. + if (!sam_hdr_find_tag_hd(header, "SO", &str) && str.s && !strcmp(str.s, "coordinate")) { + fprintf(stderr, "[bam_mating_core] ERROR: Coordinate sorted, require grouped/sorted by queryname.\n"); + goto fail; + } + ks_free(&str); + + if (!no_pg && sam_hdr_add_pg(header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto fail; + + if (sam_hdr_write(out, header) < 0) goto write_fail; + + b[0] = bam_init1(); + b[1] = bam_init1(); + curr = 0; has_prev = 0; + while ((result = sam_read1(in, header, b[curr])) >= 0) { + bam1_t *cur = b[curr], *pre = b[1-curr]; + if (cur->core.flag & BAM_FSECONDARY) + { + if ( !remove_reads ) { + if (sam_write1(out, header, cur) < 0) goto write_fail; + } + continue; // skip secondary alignments + } + if (cur->core.flag & BAM_FSUPPLEMENTARY) + { + if (sam_write1(out, header, cur) < 0) goto write_fail; + continue; // pass supplementary alignments through unchanged (TODO:make them match read they came from) + } + if (cur->core.tid < 0 || cur->core.pos < 0) // If unmapped set the flag + { + cur->core.flag |= BAM_FUNMAP; + } + if ((cur->core.flag&BAM_FUNMAP) == 0) // If mapped calculate end + { + cur_end = bam_endpos(cur); + + // Check cur_end isn't past the end of the contig we're on, if it is set the UNMAP'd flag + if (cur_end > sam_hdr_tid2len(header, cur->core.tid)) cur->core.flag |= BAM_FUNMAP; + } + if (has_prev) { // do we have a pair of reads to examine? + if (strcmp(bam_get_qname(cur), bam_get_qname(pre)) == 0) { // identical pair name + pre->core.flag |= BAM_FPAIRED; + cur->core.flag |= BAM_FPAIRED; + if (sync_mate(pre, cur)) goto fail; + + if (pre->core.tid == cur->core.tid && !(cur->core.flag&(BAM_FUNMAP|BAM_FMUNMAP)) + && !(pre->core.flag&(BAM_FUNMAP|BAM_FMUNMAP))) // if safe set TLEN/ISIZE + { + hts_pos_t cur5, pre5; + cur5 = (cur->core.flag&BAM_FREVERSE)? cur_end : cur->core.pos; + pre5 = (pre->core.flag&BAM_FREVERSE)? pre_end : pre->core.pos; + cur->core.isize = pre5 - cur5; pre->core.isize = cur5 - pre5; + } else cur->core.isize = pre->core.isize = 0; + if (add_ct) bam_template_cigar(pre, cur, &str); + // TODO: Add code to properly check if read is in a proper pair based on ISIZE distribution + if (proper_pair_check && !plausibly_properly_paired(pre,cur)) { + pre->core.flag &= ~BAM_FPROPER_PAIR; + cur->core.flag &= ~BAM_FPROPER_PAIR; + } + + if (do_mate_scoring) { + if ((add_mate_score(pre, cur) == -1) || (add_mate_score(cur, pre) == -1)) { + fprintf(stderr, "[bam_mating_core] ERROR: unable to add mate score.\n"); + goto fail; + } + } + + // Write out result + if ( !remove_reads ) { + if (sam_write1(out, header, pre) < 0) goto write_fail; + if (sam_write1(out, header, cur) < 0) goto write_fail; + } else { + // If we have to remove reads make sure we do it in a way that doesn't create orphans with bad flags + if(pre->core.flag&BAM_FUNMAP) cur->core.flag &= ~(BAM_FPAIRED|BAM_FMREVERSE|BAM_FPROPER_PAIR); + if(cur->core.flag&BAM_FUNMAP) pre->core.flag &= ~(BAM_FPAIRED|BAM_FMREVERSE|BAM_FPROPER_PAIR); + if(!(pre->core.flag&BAM_FUNMAP)) { + if (sam_write1(out, header, pre) < 0) goto write_fail; + } + if(!(cur->core.flag&BAM_FUNMAP)) { + if (sam_write1(out, header, cur) < 0) goto write_fail; + } + } + has_prev = 0; + } else { // unpaired? clear bad info and write it out + if (pre->core.tid < 0 || pre->core.pos < 0 || pre->core.flag&BAM_FUNMAP) { // If unmapped + pre->core.flag |= BAM_FUNMAP; + pre->core.tid = -1; + pre->core.pos = -1; + } + pre->core.mtid = -1; pre->core.mpos = -1; pre->core.isize = 0; + pre->core.flag &= ~(BAM_FPAIRED|BAM_FMREVERSE|BAM_FPROPER_PAIR); + if ( !remove_reads || !(pre->core.flag&BAM_FUNMAP) ) { + if (sam_write1(out, header, pre) < 0) goto write_fail; + } + } + } else has_prev = 1; + curr = 1 - curr; + pre_end = cur_end; + } + if (result < -1) goto read_fail; + if (has_prev && !remove_reads) { // If we still have a BAM in the buffer it must be unpaired + bam1_t *pre = b[1-curr]; + if (pre->core.tid < 0 || pre->core.pos < 0 || pre->core.flag&BAM_FUNMAP) { // If unmapped + pre->core.flag |= BAM_FUNMAP; + pre->core.tid = -1; + pre->core.pos = -1; + } + pre->core.mtid = -1; pre->core.mpos = -1; pre->core.isize = 0; + pre->core.flag &= ~(BAM_FPAIRED|BAM_FMREVERSE|BAM_FPROPER_PAIR); + + if (sam_write1(out, header, pre) < 0) goto write_fail; + } + sam_hdr_destroy(header); + bam_destroy1(b[0]); + bam_destroy1(b[1]); + ks_free(&str); + return 0; + + read_fail: + print_error("fixmate", "Couldn't read from input file"); + goto fail; + + write_fail: + print_error_errno("fixmate", "Couldn't write to output file"); + fail: + sam_hdr_destroy(header); + bam_destroy1(b[0]); + bam_destroy1(b[1]); + ks_free(&str); + return 1; +} + +void usage(FILE* where) +{ + fprintf(where, +"Usage: samtools fixmate \n" +"Options:\n" +" -r Remove unmapped reads and secondary alignments\n" +" -p Disable FR proper pair check\n" +" -c Add template cigar ct tag\n" +" -m Add mate score tag\n" +" -u Uncompressed output\n" +" --no-PG do not add a PG line\n"); + + sam_global_opt_help(where, "-.O..@-."); + + fprintf(where, +"\n" +"As elsewhere in samtools, use '-' as the filename for stdin/stdout. The input\n" +"file must be grouped by read name (e.g. sorted by name). Coordinated sorted\n" +"input is not accepted.\n"); +} + +int bam_mating(int argc, char *argv[]) +{ + htsThreadPool p = {NULL, 0}; + samFile *in = NULL, *out = NULL; + int c, remove_reads = 0, proper_pair_check = 1, add_ct = 0, res = 1, mate_score = 0, no_pg = 0; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + char wmode[4] = {'w', 'b', 0, 0}; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + char *arg_list = NULL; + + // parse args + if (argc == 1) { usage(stdout); return 0; } + while ((c = getopt_long(argc, argv, "rpcmO:@:u", lopts, NULL)) >= 0) { + switch (c) { + case 'r': remove_reads = 1; break; + case 'p': proper_pair_check = 0; break; + case 'c': add_ct = 1; break; + case 'm': mate_score = 1; break; + case 'u': wmode[2] = '0'; break; + case 1: no_pg = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage(stderr); goto fail; + } + } + if (optind+1 >= argc) { usage(stderr); goto fail; } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) + goto fail; + + // init + if ((in = sam_open_format(argv[optind], "rb", &ga.in)) == NULL) { + print_error_errno("fixmate", "cannot open input file"); + goto fail; + } + sam_open_mode(wmode+1, argv[optind+1], NULL); + if ((out = sam_open_format(argv[optind+1], wmode, &ga.out)) == NULL) { + print_error_errno("fixmate", "cannot open output file"); + goto fail; + } + + if (ga.nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(stderr, "Error creating thread pool\n"); + goto fail; + } + hts_set_opt(in, HTS_OPT_THREAD_POOL, &p); + hts_set_opt(out, HTS_OPT_THREAD_POOL, &p); + } + + // run + res = bam_mating_core(in, out, remove_reads, proper_pair_check, add_ct, mate_score, arg_list, no_pg); + + // cleanup + sam_close(in); + if (sam_close(out) < 0) { + fprintf(stderr, "[bam_mating] error while closing output file\n"); + res = 1; + } + + if (p.pool) hts_tpool_destroy(p.pool); + free(arg_list); + sam_global_args_free(&ga); + return res; + + fail: + if (in) sam_close(in); + if (out) sam_close(out); + if (p.pool) hts_tpool_destroy(p.pool); + free(arg_list); + sam_global_args_free(&ga); + return 1; +} + + diff --git a/samtools/bam_mate.c.pysam.c b/samtools/bam_mate.c.pysam.c new file mode 100644 index 0000000..0aa83ec --- /dev/null +++ b/samtools/bam_mate.c.pysam.c @@ -0,0 +1,509 @@ +#include "samtools.pysam.h" + +/* bam_mate.c -- fix mate pairing information and clean up flags. + + Copyright (C) 2009, 2011-2017, 2019 Genome Research Ltd. + Portions copyright (C) 2011 Broad Institute. + Portions copyright (C) 2012 Peter Cock, The James Hutton Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include "htslib/kstring.h" +#include "htslib/sam.h" +#include "samtools.h" + + +#define MD_MIN_QUALITY 15 + +/* + * This function calculates ct tag for two bams, it assumes they are from the same template and + * writes the tag to the first read in position terms. + */ +static void bam_template_cigar(bam1_t *b1, bam1_t *b2, kstring_t *str) +{ + bam1_t *swap; + int i; + hts_pos_t end; + uint32_t *cigar; + str->l = 0; + if (b1->core.tid != b2->core.tid || b1->core.tid < 0 || b1->core.pos < 0 || b2->core.pos < 0 || b1->core.flag&BAM_FUNMAP || b2->core.flag&BAM_FUNMAP) return; // coordinateless or not on the same chr; skip + if (b1->core.pos > b2->core.pos) swap = b1, b1 = b2, b2 = swap; // make sure b1 has a smaller coordinate + kputc((b1->core.flag & BAM_FREAD1)? '1' : '2', str); // segment index + kputc((b1->core.flag & BAM_FREVERSE)? 'R' : 'F', str); // strand + for (i = 0, cigar = bam_get_cigar(b1); i < b1->core.n_cigar; ++i) { + kputw(bam_cigar_oplen(cigar[i]), str); + kputc(bam_cigar_opchr(cigar[i]), str); + } + end = bam_endpos(b1); + kputw(b2->core.pos - end, str); + kputc('T', str); + kputc((b2->core.flag & BAM_FREAD1)? '1' : '2', str); // segment index + kputc((b2->core.flag & BAM_FREVERSE)? 'R' : 'F', str); // strand + for (i = 0, cigar = bam_get_cigar(b2); i < b2->core.n_cigar; ++i) { + kputw(bam_cigar_oplen(cigar[i]), str); + kputc(bam_cigar_opchr(cigar[i]), str); + } + + uint8_t* data; + if ((data = bam_aux_get(b1,"ct")) != NULL) bam_aux_del(b1, data); + if ((data = bam_aux_get(b2,"ct")) != NULL) bam_aux_del(b2, data); + + bam_aux_append(b1, "ct", 'Z', str->l+1, (uint8_t*)str->s); +} + +/* + * What This Program is Supposed To Do: + * Fill in mate coordinates, ISIZE and mate related flags from a name-sorted + * alignment. + * + * How We Handle Input + * + * Secondary and supplementary Reads: + * -write to output unchanged + * All Reads: + * -if pos == 0 (1 based), tid == -1 set UNMAPPED flag + * single Reads: + * -if pos == 0 (1 based), tid == -1, or UNMAPPED then set UNMAPPED, pos = 0, + * tid = -1 + * -clear bad flags (PAIRED, MREVERSE, PROPER_PAIR) + * -set mpos = 0 (1 based), mtid = -1 and isize = 0 + * -write to output + * Paired Reads: + * -if read is unmapped and mate is not, set pos and tid to equal that of mate + * -sync mate flags (MREVERSE, MUNMAPPED), mpos, mtid + * -recalculate ISIZE if possible, otherwise set it to 0 + * -optionally clear PROPER_PAIR flag from reads where mapping or orientation + * indicate this is not possible (Illumina orientation only) + * -calculate ct and apply to lowest positioned read + * -write to output + * Limitations + * -Does not handle tandem reads + * -Should mark supplementary reads the same as primary. + * Notes + * -CT definition appears to be something else in spec, this was in here before + * I started tampering with it, anyone know what is going on here? To work + * around this I have demoted the CT this tool generates to ct. + */ + +static void sync_unmapped_pos_inner(bam1_t* src, bam1_t* dest) { + if ((dest->core.flag & BAM_FUNMAP) && !(src->core.flag & BAM_FUNMAP)) { + // Set unmapped read's RNAME and POS to those of its mapped mate + // (recommended best practice, ensures if coord sort will be together) + dest->core.tid = src->core.tid; + dest->core.pos = src->core.pos; + } +} + +static void sync_mate_inner(bam1_t* src, bam1_t* dest) +{ + // sync mate pos information + dest->core.mtid = src->core.tid; dest->core.mpos = src->core.pos; + // sync flag info + if (src->core.flag&BAM_FREVERSE) + dest->core.flag |= BAM_FMREVERSE; + else + dest->core.flag &= ~BAM_FMREVERSE; + if (src->core.flag & BAM_FUNMAP) { + dest->core.flag |= BAM_FMUNMAP; + } +} + +// Is it plausible that these reads are properly paired? +// Can't really give definitive answer without checking isize +static bool plausibly_properly_paired(bam1_t* a, bam1_t* b) +{ + if ((a->core.flag & BAM_FUNMAP) || (b->core.flag & BAM_FUNMAP)) return false; + assert(a->core.tid >= 0); // This should never happen if FUNMAP is set correctly + + if (a->core.tid != b->core.tid) return false; + + bam1_t* first = a; + bam1_t* second = b; + hts_pos_t a_pos = a->core.flag&BAM_FREVERSE ? bam_endpos(a) : a->core.pos; + hts_pos_t b_pos = b->core.flag&BAM_FREVERSE ? bam_endpos(b) : b->core.pos; + if (a_pos > b_pos) { + first = b; + second = a; + } else { + first = a; + second = b; + } + + if (!(first->core.flag&BAM_FREVERSE) && (second->core.flag&BAM_FREVERSE)) + return true; + else + return false; +} + +// Returns 0 on success, -1 on failure. +static int bam_format_cigar(const bam1_t* b, kstring_t* str) +{ + // An empty cigar is a special case return "*" rather than "" + if (b->core.n_cigar == 0) { + return (kputc('*', str) == EOF) ? -1 : 0; + } + + const uint32_t *cigar = bam_get_cigar(b); + uint32_t i; + + for (i = 0; i < b->core.n_cigar; ++i) { + if (kputw(bam_cigar_oplen(cigar[i]), str) == EOF) return -1; + if (kputc(bam_cigar_opchr(cigar[i]), str) == EOF) return -1; + } + + return 0; +} + +// Returns 0 on success, -1 on failure. +static int sync_mq_mc(bam1_t* src, bam1_t* dest) +{ + if ( (src->core.flag & BAM_FUNMAP) == 0 ) { // If mapped + // Copy Mate Mapping Quality + uint32_t mq = src->core.qual; + uint8_t* data; + if ((data = bam_aux_get(dest,"MQ")) != NULL) { + bam_aux_del(dest, data); + } + + bam_aux_append(dest, "MQ", 'i', sizeof(uint32_t), (uint8_t*)&mq); + } + // Copy mate cigar if either read is mapped + if ( (src->core.flag & BAM_FUNMAP) == 0 || (dest->core.flag & BAM_FUNMAP) == 0 ) { + uint8_t* data_mc; + if ((data_mc = bam_aux_get(dest,"MC")) != NULL) { + bam_aux_del(dest, data_mc); + } + + // Convert cigar to string + kstring_t mc = { 0, 0, NULL }; + if (bam_format_cigar(src, &mc) < 0) return -1; + + bam_aux_append(dest, "MC", 'Z', ks_len(&mc)+1, (uint8_t*)ks_str(&mc)); + free(mc.s); + } + return 0; +} + +// Copy flags. +// Returns 0 on success, -1 on failure. +static int sync_mate(bam1_t* a, bam1_t* b) +{ + sync_unmapped_pos_inner(a,b); + sync_unmapped_pos_inner(b,a); + sync_mate_inner(a,b); + sync_mate_inner(b,a); + if (sync_mq_mc(a,b) < 0) return -1; + if (sync_mq_mc(b,a) < 0) return -1; + return 0; +} + + +static uint32_t calc_mate_score(bam1_t *b) +{ + uint32_t score = 0; + uint8_t *qual = bam_get_qual(b); + int i; + + for (i = 0; i < b->core.l_qseq; i++) { + if (qual[i] >= MD_MIN_QUALITY) score += qual[i]; + } + + return score; +} + + +static int add_mate_score(bam1_t *src, bam1_t *dest) +{ + uint8_t *data_ms; + uint32_t mate_score = calc_mate_score(src); + + if ((data_ms = bam_aux_get(dest, "ms")) != NULL) { + bam_aux_del(dest, data_ms); + } + + if (bam_aux_append(dest, "ms", 'i', sizeof(uint32_t), (uint8_t*)&mate_score) == -1) { + return -1; + } + + return 0; +} + +// currently, this function ONLY works if each read has one hit +static int bam_mating_core(samFile *in, samFile *out, int remove_reads, int proper_pair_check, int add_ct, int do_mate_scoring, char *arg_list, int no_pg) +{ + sam_hdr_t *header; + bam1_t *b[2] = { NULL, NULL }; + int curr, has_prev, result; + hts_pos_t pre_end = 0, cur_end = 0; + kstring_t str = KS_INITIALIZE; + + header = sam_hdr_read(in); + if (header == NULL) { + fprintf(samtools_stderr, "[bam_mating_core] ERROR: Couldn't read header\n"); + return 1; + } + + // Accept unknown, unsorted, or queryname sort order, but error on coordinate sorted. + if (!sam_hdr_find_tag_hd(header, "SO", &str) && str.s && !strcmp(str.s, "coordinate")) { + fprintf(samtools_stderr, "[bam_mating_core] ERROR: Coordinate sorted, require grouped/sorted by queryname.\n"); + goto fail; + } + ks_free(&str); + + if (!no_pg && sam_hdr_add_pg(header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto fail; + + if (sam_hdr_write(out, header) < 0) goto write_fail; + + b[0] = bam_init1(); + b[1] = bam_init1(); + curr = 0; has_prev = 0; + while ((result = sam_read1(in, header, b[curr])) >= 0) { + bam1_t *cur = b[curr], *pre = b[1-curr]; + if (cur->core.flag & BAM_FSECONDARY) + { + if ( !remove_reads ) { + if (sam_write1(out, header, cur) < 0) goto write_fail; + } + continue; // skip secondary alignments + } + if (cur->core.flag & BAM_FSUPPLEMENTARY) + { + if (sam_write1(out, header, cur) < 0) goto write_fail; + continue; // pass supplementary alignments through unchanged (TODO:make them match read they came from) + } + if (cur->core.tid < 0 || cur->core.pos < 0) // If unmapped set the flag + { + cur->core.flag |= BAM_FUNMAP; + } + if ((cur->core.flag&BAM_FUNMAP) == 0) // If mapped calculate end + { + cur_end = bam_endpos(cur); + + // Check cur_end isn't past the end of the contig we're on, if it is set the UNMAP'd flag + if (cur_end > sam_hdr_tid2len(header, cur->core.tid)) cur->core.flag |= BAM_FUNMAP; + } + if (has_prev) { // do we have a pair of reads to examine? + if (strcmp(bam_get_qname(cur), bam_get_qname(pre)) == 0) { // identical pair name + pre->core.flag |= BAM_FPAIRED; + cur->core.flag |= BAM_FPAIRED; + if (sync_mate(pre, cur)) goto fail; + + if (pre->core.tid == cur->core.tid && !(cur->core.flag&(BAM_FUNMAP|BAM_FMUNMAP)) + && !(pre->core.flag&(BAM_FUNMAP|BAM_FMUNMAP))) // if safe set TLEN/ISIZE + { + hts_pos_t cur5, pre5; + cur5 = (cur->core.flag&BAM_FREVERSE)? cur_end : cur->core.pos; + pre5 = (pre->core.flag&BAM_FREVERSE)? pre_end : pre->core.pos; + cur->core.isize = pre5 - cur5; pre->core.isize = cur5 - pre5; + } else cur->core.isize = pre->core.isize = 0; + if (add_ct) bam_template_cigar(pre, cur, &str); + // TODO: Add code to properly check if read is in a proper pair based on ISIZE distribution + if (proper_pair_check && !plausibly_properly_paired(pre,cur)) { + pre->core.flag &= ~BAM_FPROPER_PAIR; + cur->core.flag &= ~BAM_FPROPER_PAIR; + } + + if (do_mate_scoring) { + if ((add_mate_score(pre, cur) == -1) || (add_mate_score(cur, pre) == -1)) { + fprintf(samtools_stderr, "[bam_mating_core] ERROR: unable to add mate score.\n"); + goto fail; + } + } + + // Write out result + if ( !remove_reads ) { + if (sam_write1(out, header, pre) < 0) goto write_fail; + if (sam_write1(out, header, cur) < 0) goto write_fail; + } else { + // If we have to remove reads make sure we do it in a way that doesn't create orphans with bad flags + if(pre->core.flag&BAM_FUNMAP) cur->core.flag &= ~(BAM_FPAIRED|BAM_FMREVERSE|BAM_FPROPER_PAIR); + if(cur->core.flag&BAM_FUNMAP) pre->core.flag &= ~(BAM_FPAIRED|BAM_FMREVERSE|BAM_FPROPER_PAIR); + if(!(pre->core.flag&BAM_FUNMAP)) { + if (sam_write1(out, header, pre) < 0) goto write_fail; + } + if(!(cur->core.flag&BAM_FUNMAP)) { + if (sam_write1(out, header, cur) < 0) goto write_fail; + } + } + has_prev = 0; + } else { // unpaired? clear bad info and write it out + if (pre->core.tid < 0 || pre->core.pos < 0 || pre->core.flag&BAM_FUNMAP) { // If unmapped + pre->core.flag |= BAM_FUNMAP; + pre->core.tid = -1; + pre->core.pos = -1; + } + pre->core.mtid = -1; pre->core.mpos = -1; pre->core.isize = 0; + pre->core.flag &= ~(BAM_FPAIRED|BAM_FMREVERSE|BAM_FPROPER_PAIR); + if ( !remove_reads || !(pre->core.flag&BAM_FUNMAP) ) { + if (sam_write1(out, header, pre) < 0) goto write_fail; + } + } + } else has_prev = 1; + curr = 1 - curr; + pre_end = cur_end; + } + if (result < -1) goto read_fail; + if (has_prev && !remove_reads) { // If we still have a BAM in the buffer it must be unpaired + bam1_t *pre = b[1-curr]; + if (pre->core.tid < 0 || pre->core.pos < 0 || pre->core.flag&BAM_FUNMAP) { // If unmapped + pre->core.flag |= BAM_FUNMAP; + pre->core.tid = -1; + pre->core.pos = -1; + } + pre->core.mtid = -1; pre->core.mpos = -1; pre->core.isize = 0; + pre->core.flag &= ~(BAM_FPAIRED|BAM_FMREVERSE|BAM_FPROPER_PAIR); + + if (sam_write1(out, header, pre) < 0) goto write_fail; + } + sam_hdr_destroy(header); + bam_destroy1(b[0]); + bam_destroy1(b[1]); + ks_free(&str); + return 0; + + read_fail: + print_error("fixmate", "Couldn't read from input file"); + goto fail; + + write_fail: + print_error_errno("fixmate", "Couldn't write to output file"); + fail: + sam_hdr_destroy(header); + bam_destroy1(b[0]); + bam_destroy1(b[1]); + ks_free(&str); + return 1; +} + +void usage(FILE* where) +{ + fprintf(where, +"Usage: samtools fixmate \n" +"Options:\n" +" -r Remove unmapped reads and secondary alignments\n" +" -p Disable FR proper pair check\n" +" -c Add template cigar ct tag\n" +" -m Add mate score tag\n" +" -u Uncompressed output\n" +" --no-PG do not add a PG line\n"); + + sam_global_opt_help(where, "-.O..@-."); + + fprintf(where, +"\n" +"As elsewhere in samtools, use '-' as the filename for stdin/samtools_stdout. The input\n" +"file must be grouped by read name (e.g. sorted by name). Coordinated sorted\n" +"input is not accepted.\n"); +} + +int bam_mating(int argc, char *argv[]) +{ + htsThreadPool p = {NULL, 0}; + samFile *in = NULL, *out = NULL; + int c, remove_reads = 0, proper_pair_check = 1, add_ct = 0, res = 1, mate_score = 0, no_pg = 0; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + char wmode[4] = {'w', 'b', 0, 0}; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + char *arg_list = NULL; + + // parse args + if (argc == 1) { usage(samtools_stdout); return 0; } + while ((c = getopt_long(argc, argv, "rpcmO:@:u", lopts, NULL)) >= 0) { + switch (c) { + case 'r': remove_reads = 1; break; + case 'p': proper_pair_check = 0; break; + case 'c': add_ct = 1; break; + case 'm': mate_score = 1; break; + case 'u': wmode[2] = '0'; break; + case 1: no_pg = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage(samtools_stderr); goto fail; + } + } + if (optind+1 >= argc) { usage(samtools_stderr); goto fail; } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) + goto fail; + + // init + if ((in = sam_open_format(argv[optind], "rb", &ga.in)) == NULL) { + print_error_errno("fixmate", "cannot open input file"); + goto fail; + } + sam_open_mode(wmode+1, argv[optind+1], NULL); + if ((out = sam_open_format(argv[optind+1], wmode, &ga.out)) == NULL) { + print_error_errno("fixmate", "cannot open output file"); + goto fail; + } + + if (ga.nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(samtools_stderr, "Error creating thread pool\n"); + goto fail; + } + hts_set_opt(in, HTS_OPT_THREAD_POOL, &p); + hts_set_opt(out, HTS_OPT_THREAD_POOL, &p); + } + + // run + res = bam_mating_core(in, out, remove_reads, proper_pair_check, add_ct, mate_score, arg_list, no_pg); + + // cleanup + sam_close(in); + if (sam_close(out) < 0) { + fprintf(samtools_stderr, "[bam_mating] error while closing output file\n"); + res = 1; + } + + if (p.pool) hts_tpool_destroy(p.pool); + free(arg_list); + sam_global_args_free(&ga); + return res; + + fail: + if (in) sam_close(in); + if (out) sam_close(out); + if (p.pool) hts_tpool_destroy(p.pool); + free(arg_list); + sam_global_args_free(&ga); + return 1; +} + + diff --git a/samtools/bam_md.c b/samtools/bam_md.c new file mode 100644 index 0000000..7d5aeaa --- /dev/null +++ b/samtools/bam_md.c @@ -0,0 +1,418 @@ +/* bam_md.c -- calmd subcommand. + + Copyright (C) 2009-2011, 2014-2015, 2019-2020 Genome Research Ltd. + Portions copyright (C) 2009-2011 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include "htslib/faidx.h" +#include "htslib/sam.h" +#include "htslib/kstring.h" +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include "samtools.h" + +#define USE_EQUAL 1 +#define DROP_TAG 2 +#define BIN_QUAL 4 +#define UPDATE_NM 8 +#define UPDATE_MD 16 +#define HASH_QNM 32 + +int bam_aux_drop_other(bam1_t *b, uint8_t *s); + +static int bam_fillmd1_core(const char *ref_name, bam1_t *b, char *ref, + hts_pos_t ref_len, int flag, int max_nm, + int quiet_mode, uint32_t *skipped) +{ + uint8_t *seq = bam_get_seq(b); + uint32_t *cigar = bam_get_cigar(b); + bam1_core_t *c = &b->core; + int i, qpos, matched = 0; + hts_pos_t rpos; + kstring_t str = KS_INITIALIZE; + int32_t old_nm_i = -1, nm = 0; + uint32_t err = 0; + + if (c->l_qseq == 0) { + if (!quiet_mode) { + if (ref_name) { + fprintf(stderr, "[bam_fillmd1] no sequence in alignment " + "record for '%s' at %s:%"PRIhts_pos", skipped\n", + bam_get_qname(b), ref_name, c->pos + 1); + } else { + fprintf(stderr, "[bam_fillmd1] no sequence in alignment " + "record for '%s', skipped", bam_get_qname(b)); + } + } + if (skipped) (*skipped)++; + return 0; + } + + for (i = qpos = 0, rpos = c->pos; i < c->n_cigar; ++i) { + int j, oplen = cigar[i]>>4, op = cigar[i]&0xf; + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + for (j = 0; j < oplen; ++j) { + int c1, c2, z = qpos + j; + if (rpos+j >= ref_len || z >= c->l_qseq || ref[rpos+j] == '\0') + break; // out of bounds + c1 = bam_seqi(seq, z); + c2 = seq_nt16_table[(uint8_t)ref[rpos+j]]; + if ((c1 == c2 && c1 != 15 && c2 != 15) || c1 == 0) { // a match + if (flag&USE_EQUAL) seq[z/2] &= (z&1)? 0xf0 : 0x0f; + ++matched; + } else { + err |= kputw(matched, &str) < 0; + err |= kputc(toupper(ref[rpos+j]), &str) < 0; + matched = 0; ++nm; + } + } + if (j < oplen) break; + rpos += oplen; qpos += oplen; + } else if (op == BAM_CDEL) { + err |= kputw(matched, &str) < 0; + err |= kputc('^', &str) < 0; + for (j = 0; j < oplen; ++j) { + if (rpos+j >= ref_len || ref[rpos+j] == '\0') break; + err |= kputc(toupper(ref[rpos+j]), &str) < 0; + } + matched = 0; + rpos += j; nm += j; + if (j < oplen) break; + } else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) { + qpos += oplen; + if (op == BAM_CINS) nm += oplen; + } else if (op == BAM_CREF_SKIP) { + rpos += oplen; + } + } + err |= kputw(matched, &str) < 0; + if (err) { + print_error_errno("calmd", "Couldn't build new MD string"); + goto fail; + } + // apply max_nm + if (max_nm > 0 && nm >= max_nm) { + for (i = qpos = 0, rpos = c->pos; i < c->n_cigar; ++i) { + int j, oplen = cigar[i]>>4, op = cigar[i]&0xf; + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + for (j = 0; j < oplen; ++j) { + int c1, c2, z = qpos + j; + if (rpos+j >= ref_len || z >= c->l_qseq || ref[rpos+j] == '\0') + break; // out of bounds + c1 = bam_seqi(seq, z); + c2 = seq_nt16_table[(uint8_t)ref[rpos+j]]; + if ((c1 == c2 && c1 != 15 && c2 != 15) || c1 == 0) { // a match + seq[z/2] |= (z&1)? 0x0f : 0xf0; + bam_get_qual(b)[z] = 0; + } + } + if (j < oplen) break; + rpos += oplen; qpos += oplen; + } else if (op == BAM_CDEL || op == BAM_CREF_SKIP) rpos += oplen; + else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) qpos += oplen; + } + } + // update NM + if ((flag & UPDATE_NM) && !(c->flag & BAM_FUNMAP)) { + uint8_t *old_nm = bam_aux_get(b, "NM"); + if (old_nm) old_nm_i = bam_aux2i(old_nm); + if (!old_nm) { + if (bam_aux_append(b, "NM", 'i', 4, (uint8_t*)&nm) < 0) + goto aux_fail; + } + else if (nm != old_nm_i) { + if (!quiet_mode) { + fprintf(stderr, "[bam_fillmd1] different NM for read '%s': %d -> %d\n", bam_get_qname(b), old_nm_i, nm); + } + if (bam_aux_del(b, old_nm) < 0) goto aux_fail; + if (bam_aux_append(b, "NM", 'i', 4, (uint8_t*)&nm) < 0) + goto aux_fail; + } + } + // update MD + if ((flag & UPDATE_MD) && !(c->flag & BAM_FUNMAP)) { + uint8_t *old_md = bam_aux_get(b, "MD"); + if (!old_md) { + if (bam_aux_append(b, "MD", 'Z', str.l + 1, (uint8_t*)str.s) < 0) + goto aux_fail; + } else { + int is_diff = 0; + if (strlen((char*)old_md+1) == str.l) { + for (i = 0; i < str.l; ++i) + if (toupper(old_md[i+1]) != toupper(str.s[i])) + break; + if (i < str.l) is_diff = 1; + } else is_diff = 1; + if (is_diff) { + if (!quiet_mode) { + fprintf(stderr, "[bam_fillmd1] different MD for read '%s': '%s' -> '%s'\n", bam_get_qname(b), old_md+1, str.s); + } + if (bam_aux_del(b, old_md) < 0) goto aux_fail; + if (bam_aux_append(b, "MD", 'Z', str.l + 1, (uint8_t*)str.s) < 0) + goto aux_fail; + } + } + } + + // drop all tags but RG + if (flag&DROP_TAG) { + uint8_t *q = bam_aux_get(b, "RG"); + bam_aux_drop_other(b, q); + } + // reduce the resolution of base quality + if (flag&BIN_QUAL) { + uint8_t *qual = bam_get_qual(b); + for (i = 0; i < b->core.l_qseq; ++i) + if (qual[i] >= 3) qual[i] = qual[i]/10*10 + 7; + } + + free(str.s); + return 0; + + aux_fail: + if (errno == ENOMEM) { + print_error("calmd", "Couldn't add aux tag (too long)"); + } else if (errno == EINVAL) { + print_error("calmd", "Corrupt aux data"); + } else { + print_error_errno("calmd", "Couldn't add aux tag"); + } + fail: + free(str.s); + return -1; +} + +int bam_fillmd1(bam1_t *b, char *ref, int flag, int quiet_mode) +{ + return bam_fillmd1_core(NULL, b, ref, INT_MAX, flag, 0, quiet_mode, NULL); +} + +int calmd_usage() { + fprintf(stderr, +"Usage: samtools calmd [-eubrAESQ] \n" +"Options:\n" +" -e change identical bases to '='\n" +" -u uncompressed BAM output (for piping)\n" +" -b compressed BAM output\n" +" -S ignored (input format is auto-detected)\n" +" -A modify the quality string\n" +" -Q use quiet mode to output less debug info to stdout\n" +" -r compute the BQ tag (without -A) or cap baseQ by BAQ (with -A)\n" +" -E extended BAQ for better sensitivity but lower specificity\n" +" --no-PG do not add a PG line\n"); + + sam_global_opt_help(stderr, "-....@-."); + return 1; +} + +int bam_fillmd(int argc, char *argv[]) +{ + int c, flt_flag, tid = -2, ret, is_bam_out, is_uncompressed, max_nm, is_realn, capQ, baq_flag, quiet_mode, no_pg = 0; + hts_pos_t len; + htsThreadPool p = {NULL, 0}; + samFile *fp = NULL, *fpout = NULL; + sam_hdr_t *header = NULL; + faidx_t *fai = NULL; + char *ref = NULL, mode_w[8], *ref_file, *arg_list = NULL; + const char *ref_name = NULL; + bam1_t *b = NULL; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + uint32_t skipped = 0; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0,'@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + flt_flag = UPDATE_NM | UPDATE_MD; + is_bam_out = is_uncompressed = is_realn = max_nm = capQ = baq_flag = quiet_mode = 0; + strcpy(mode_w, "w"); + while ((c = getopt_long(argc, argv, "EqQreuNhbSC:n:Ad@:", lopts, NULL)) >= 0) { + switch (c) { + case 'r': is_realn = 1; break; + case 'e': flt_flag |= USE_EQUAL; break; + case 'd': flt_flag |= DROP_TAG; break; + case 'q': flt_flag |= BIN_QUAL; break; + case 'h': flt_flag |= HASH_QNM; break; + case 'N': flt_flag &= ~(UPDATE_MD|UPDATE_NM); break; + case 'b': is_bam_out = 1; break; + case 'u': is_uncompressed = is_bam_out = 1; break; + case 'S': break; + case 'n': max_nm = atoi(optarg); break; + case 'C': capQ = atoi(optarg); break; + case 'A': baq_flag |= 1; break; + case 'E': baq_flag |= 2; break; + case 'Q': quiet_mode = 1; break; + case 1: no_pg = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + fprintf(stderr, "[bam_fillmd] unrecognized option '-%c'\n\n", c); + /* else fall-through */ + case '?': return calmd_usage(); + } + } + if (is_bam_out) strcat(mode_w, "b"); + else strcat(mode_w, "h"); + if (is_uncompressed) strcat(mode_w, "0"); + if (optind + (ga.reference == NULL) >= argc) + return calmd_usage(); + fp = sam_open_format(argv[optind], "r", &ga.in); + if (fp == NULL) { + print_error_errno("calmd", "Failed to open input file '%s'", argv[optind]); + return 1; + } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("calmd", "failed to create arg_list"); + return 1; + } + + header = sam_hdr_read(fp); + if (header == NULL || sam_hdr_nref(header) == 0) { + fprintf(stderr, "[bam_fillmd] input SAM does not have header. Abort!\n"); + goto fail; + } + + fpout = sam_open_format("-", mode_w, &ga.out); + if (fpout == NULL) { + print_error_errno("calmd", "Failed to open output"); + goto fail; + } + if (!no_pg && sam_hdr_add_pg(header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error("calmd", "failed to add PG line to header"); + goto fail; + } + if (sam_hdr_write(fpout, header) < 0) { + print_error_errno("calmd", "Failed to write sam header"); + goto fail; + } + + if (ga.nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(stderr, "Error creating thread pool\n"); + goto fail; + } + hts_set_opt(fp, HTS_OPT_THREAD_POOL, &p); + hts_set_opt(fpout, HTS_OPT_THREAD_POOL, &p); + } + + ref_file = argc > optind + 1 ? argv[optind+1] : ga.reference; + fai = fai_load(ref_file); + + if (!fai) { + print_error_errno("calmd", "Failed to open reference file '%s'", ref_file); + goto fail; + } + + b = bam_init1(); + if (!b) { + fprintf(stderr, "[bam_fillmd] Failed to allocate bam struct\n"); + goto fail; + } + while ((ret = sam_read1(fp, header, b)) >= 0) { + if (b->core.tid >= 0) { + if (tid != b->core.tid) { + free(ref); + ref = NULL; + len = 0; + ref_name = sam_hdr_tid2name(header, b->core.tid); + if (ref_name) { + ref = fai_fetch64(fai, ref_name, &len); + } + tid = b->core.tid; + if (ref == 0) { // FIXME: Should this always be fatal? + fprintf(stderr, "[bam_fillmd] fail to find sequence '%s' in the reference.\n", + ref_name ? ref_name : "(unknown)"); + if (is_realn || capQ > 10) goto fail; // Would otherwise crash + } + } + if (is_realn) { + if (sam_prob_realn(b, ref, len, baq_flag) < -3) { + print_error_errno("calmd", "BAQ alignment failed"); + goto fail; + } + } + if (capQ > 10) { + int q = sam_cap_mapq(b, ref, len, capQ); + if (b->core.qual > q) b->core.qual = q; + } + if (ref) { + if (bam_fillmd1_core(ref_name, b, ref, len, flt_flag, max_nm, + quiet_mode, &skipped) < 0) + goto fail; + } + } + if (sam_write1(fpout, header, b) < 0) { + print_error_errno("calmd", "failed to write to output file"); + goto fail; + } + } + if (ret < -1) { + fprintf(stderr, "[bam_fillmd] Error reading input.\n"); + goto fail; + } + + if (skipped) { + fprintf(stderr, "[calmd] Warning: %"PRIu32" records skipped due " + "to no query sequence\n", + skipped); + } + + bam_destroy1(b); + sam_hdr_destroy(header); + + free(arg_list); + free(ref); + fai_destroy(fai); + sam_close(fp); + if (sam_close(fpout) < 0) { + fprintf(stderr, "[bam_fillmd] error when closing output file\n"); + return 1; + } + if (p.pool) hts_tpool_destroy(p.pool); + + return 0; + + fail: + free(arg_list); + free(ref); + if (b) bam_destroy1(b); + if (header) sam_hdr_destroy(header); + if (fai) fai_destroy(fai); + if (fp) sam_close(fp); + if (fpout) sam_close(fpout); + if (p.pool) hts_tpool_destroy(p.pool); + + return 1; +} diff --git a/samtools/bam_md.c.pysam.c b/samtools/bam_md.c.pysam.c new file mode 100644 index 0000000..b71e77c --- /dev/null +++ b/samtools/bam_md.c.pysam.c @@ -0,0 +1,420 @@ +#include "samtools.pysam.h" + +/* bam_md.c -- calmd subcommand. + + Copyright (C) 2009-2011, 2014-2015, 2019-2020 Genome Research Ltd. + Portions copyright (C) 2009-2011 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include "htslib/faidx.h" +#include "htslib/sam.h" +#include "htslib/kstring.h" +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include "samtools.h" + +#define USE_EQUAL 1 +#define DROP_TAG 2 +#define BIN_QUAL 4 +#define UPDATE_NM 8 +#define UPDATE_MD 16 +#define HASH_QNM 32 + +int bam_aux_drop_other(bam1_t *b, uint8_t *s); + +static int bam_fillmd1_core(const char *ref_name, bam1_t *b, char *ref, + hts_pos_t ref_len, int flag, int max_nm, + int quiet_mode, uint32_t *skipped) +{ + uint8_t *seq = bam_get_seq(b); + uint32_t *cigar = bam_get_cigar(b); + bam1_core_t *c = &b->core; + int i, qpos, matched = 0; + hts_pos_t rpos; + kstring_t str = KS_INITIALIZE; + int32_t old_nm_i = -1, nm = 0; + uint32_t err = 0; + + if (c->l_qseq == 0) { + if (!quiet_mode) { + if (ref_name) { + fprintf(samtools_stderr, "[bam_fillmd1] no sequence in alignment " + "record for '%s' at %s:%"PRIhts_pos", skipped\n", + bam_get_qname(b), ref_name, c->pos + 1); + } else { + fprintf(samtools_stderr, "[bam_fillmd1] no sequence in alignment " + "record for '%s', skipped", bam_get_qname(b)); + } + } + if (skipped) (*skipped)++; + return 0; + } + + for (i = qpos = 0, rpos = c->pos; i < c->n_cigar; ++i) { + int j, oplen = cigar[i]>>4, op = cigar[i]&0xf; + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + for (j = 0; j < oplen; ++j) { + int c1, c2, z = qpos + j; + if (rpos+j >= ref_len || z >= c->l_qseq || ref[rpos+j] == '\0') + break; // out of bounds + c1 = bam_seqi(seq, z); + c2 = seq_nt16_table[(uint8_t)ref[rpos+j]]; + if ((c1 == c2 && c1 != 15 && c2 != 15) || c1 == 0) { // a match + if (flag&USE_EQUAL) seq[z/2] &= (z&1)? 0xf0 : 0x0f; + ++matched; + } else { + err |= kputw(matched, &str) < 0; + err |= kputc(toupper(ref[rpos+j]), &str) < 0; + matched = 0; ++nm; + } + } + if (j < oplen) break; + rpos += oplen; qpos += oplen; + } else if (op == BAM_CDEL) { + err |= kputw(matched, &str) < 0; + err |= kputc('^', &str) < 0; + for (j = 0; j < oplen; ++j) { + if (rpos+j >= ref_len || ref[rpos+j] == '\0') break; + err |= kputc(toupper(ref[rpos+j]), &str) < 0; + } + matched = 0; + rpos += j; nm += j; + if (j < oplen) break; + } else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) { + qpos += oplen; + if (op == BAM_CINS) nm += oplen; + } else if (op == BAM_CREF_SKIP) { + rpos += oplen; + } + } + err |= kputw(matched, &str) < 0; + if (err) { + print_error_errno("calmd", "Couldn't build new MD string"); + goto fail; + } + // apply max_nm + if (max_nm > 0 && nm >= max_nm) { + for (i = qpos = 0, rpos = c->pos; i < c->n_cigar; ++i) { + int j, oplen = cigar[i]>>4, op = cigar[i]&0xf; + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + for (j = 0; j < oplen; ++j) { + int c1, c2, z = qpos + j; + if (rpos+j >= ref_len || z >= c->l_qseq || ref[rpos+j] == '\0') + break; // out of bounds + c1 = bam_seqi(seq, z); + c2 = seq_nt16_table[(uint8_t)ref[rpos+j]]; + if ((c1 == c2 && c1 != 15 && c2 != 15) || c1 == 0) { // a match + seq[z/2] |= (z&1)? 0x0f : 0xf0; + bam_get_qual(b)[z] = 0; + } + } + if (j < oplen) break; + rpos += oplen; qpos += oplen; + } else if (op == BAM_CDEL || op == BAM_CREF_SKIP) rpos += oplen; + else if (op == BAM_CINS || op == BAM_CSOFT_CLIP) qpos += oplen; + } + } + // update NM + if ((flag & UPDATE_NM) && !(c->flag & BAM_FUNMAP)) { + uint8_t *old_nm = bam_aux_get(b, "NM"); + if (old_nm) old_nm_i = bam_aux2i(old_nm); + if (!old_nm) { + if (bam_aux_append(b, "NM", 'i', 4, (uint8_t*)&nm) < 0) + goto aux_fail; + } + else if (nm != old_nm_i) { + if (!quiet_mode) { + fprintf(samtools_stderr, "[bam_fillmd1] different NM for read '%s': %d -> %d\n", bam_get_qname(b), old_nm_i, nm); + } + if (bam_aux_del(b, old_nm) < 0) goto aux_fail; + if (bam_aux_append(b, "NM", 'i', 4, (uint8_t*)&nm) < 0) + goto aux_fail; + } + } + // update MD + if ((flag & UPDATE_MD) && !(c->flag & BAM_FUNMAP)) { + uint8_t *old_md = bam_aux_get(b, "MD"); + if (!old_md) { + if (bam_aux_append(b, "MD", 'Z', str.l + 1, (uint8_t*)str.s) < 0) + goto aux_fail; + } else { + int is_diff = 0; + if (strlen((char*)old_md+1) == str.l) { + for (i = 0; i < str.l; ++i) + if (toupper(old_md[i+1]) != toupper(str.s[i])) + break; + if (i < str.l) is_diff = 1; + } else is_diff = 1; + if (is_diff) { + if (!quiet_mode) { + fprintf(samtools_stderr, "[bam_fillmd1] different MD for read '%s': '%s' -> '%s'\n", bam_get_qname(b), old_md+1, str.s); + } + if (bam_aux_del(b, old_md) < 0) goto aux_fail; + if (bam_aux_append(b, "MD", 'Z', str.l + 1, (uint8_t*)str.s) < 0) + goto aux_fail; + } + } + } + + // drop all tags but RG + if (flag&DROP_TAG) { + uint8_t *q = bam_aux_get(b, "RG"); + bam_aux_drop_other(b, q); + } + // reduce the resolution of base quality + if (flag&BIN_QUAL) { + uint8_t *qual = bam_get_qual(b); + for (i = 0; i < b->core.l_qseq; ++i) + if (qual[i] >= 3) qual[i] = qual[i]/10*10 + 7; + } + + free(str.s); + return 0; + + aux_fail: + if (errno == ENOMEM) { + print_error("calmd", "Couldn't add aux tag (too long)"); + } else if (errno == EINVAL) { + print_error("calmd", "Corrupt aux data"); + } else { + print_error_errno("calmd", "Couldn't add aux tag"); + } + fail: + free(str.s); + return -1; +} + +int bam_fillmd1(bam1_t *b, char *ref, int flag, int quiet_mode) +{ + return bam_fillmd1_core(NULL, b, ref, INT_MAX, flag, 0, quiet_mode, NULL); +} + +int calmd_usage() { + fprintf(samtools_stderr, +"Usage: samtools calmd [-eubrAESQ] \n" +"Options:\n" +" -e change identical bases to '='\n" +" -u uncompressed BAM output (for piping)\n" +" -b compressed BAM output\n" +" -S ignored (input format is auto-detected)\n" +" -A modify the quality string\n" +" -Q use quiet mode to output less debug info to samtools_stdout\n" +" -r compute the BQ tag (without -A) or cap baseQ by BAQ (with -A)\n" +" -E extended BAQ for better sensitivity but lower specificity\n" +" --no-PG do not add a PG line\n"); + + sam_global_opt_help(samtools_stderr, "-....@-."); + return 1; +} + +int bam_fillmd(int argc, char *argv[]) +{ + int c, flt_flag, tid = -2, ret, is_bam_out, is_uncompressed, max_nm, is_realn, capQ, baq_flag, quiet_mode, no_pg = 0; + hts_pos_t len; + htsThreadPool p = {NULL, 0}; + samFile *fp = NULL, *fpout = NULL; + sam_hdr_t *header = NULL; + faidx_t *fai = NULL; + char *ref = NULL, mode_w[8], *ref_file, *arg_list = NULL; + const char *ref_name = NULL; + bam1_t *b = NULL; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + uint32_t skipped = 0; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0,'@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + flt_flag = UPDATE_NM | UPDATE_MD; + is_bam_out = is_uncompressed = is_realn = max_nm = capQ = baq_flag = quiet_mode = 0; + strcpy(mode_w, "w"); + while ((c = getopt_long(argc, argv, "EqQreuNhbSC:n:Ad@:", lopts, NULL)) >= 0) { + switch (c) { + case 'r': is_realn = 1; break; + case 'e': flt_flag |= USE_EQUAL; break; + case 'd': flt_flag |= DROP_TAG; break; + case 'q': flt_flag |= BIN_QUAL; break; + case 'h': flt_flag |= HASH_QNM; break; + case 'N': flt_flag &= ~(UPDATE_MD|UPDATE_NM); break; + case 'b': is_bam_out = 1; break; + case 'u': is_uncompressed = is_bam_out = 1; break; + case 'S': break; + case 'n': max_nm = atoi(optarg); break; + case 'C': capQ = atoi(optarg); break; + case 'A': baq_flag |= 1; break; + case 'E': baq_flag |= 2; break; + case 'Q': quiet_mode = 1; break; + case 1: no_pg = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + fprintf(samtools_stderr, "[bam_fillmd] unrecognized option '-%c'\n\n", c); + /* else fall-through */ + case '?': return calmd_usage(); + } + } + if (is_bam_out) strcat(mode_w, "b"); + else strcat(mode_w, "h"); + if (is_uncompressed) strcat(mode_w, "0"); + if (optind + (ga.reference == NULL) >= argc) + return calmd_usage(); + fp = sam_open_format(argv[optind], "r", &ga.in); + if (fp == NULL) { + print_error_errno("calmd", "Failed to open input file '%s'", argv[optind]); + return 1; + } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("calmd", "failed to create arg_list"); + return 1; + } + + header = sam_hdr_read(fp); + if (header == NULL || sam_hdr_nref(header) == 0) { + fprintf(samtools_stderr, "[bam_fillmd] input SAM does not have header. Abort!\n"); + goto fail; + } + + fpout = sam_open_format(samtools_stdout_fn, mode_w, &ga.out); + if (fpout == NULL) { + print_error_errno("calmd", "Failed to open output"); + goto fail; + } + if (!no_pg && sam_hdr_add_pg(header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error("calmd", "failed to add PG line to header"); + goto fail; + } + if (sam_hdr_write(fpout, header) < 0) { + print_error_errno("calmd", "Failed to write sam header"); + goto fail; + } + + if (ga.nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(samtools_stderr, "Error creating thread pool\n"); + goto fail; + } + hts_set_opt(fp, HTS_OPT_THREAD_POOL, &p); + hts_set_opt(fpout, HTS_OPT_THREAD_POOL, &p); + } + + ref_file = argc > optind + 1 ? argv[optind+1] : ga.reference; + fai = fai_load(ref_file); + + if (!fai) { + print_error_errno("calmd", "Failed to open reference file '%s'", ref_file); + goto fail; + } + + b = bam_init1(); + if (!b) { + fprintf(samtools_stderr, "[bam_fillmd] Failed to allocate bam struct\n"); + goto fail; + } + while ((ret = sam_read1(fp, header, b)) >= 0) { + if (b->core.tid >= 0) { + if (tid != b->core.tid) { + free(ref); + ref = NULL; + len = 0; + ref_name = sam_hdr_tid2name(header, b->core.tid); + if (ref_name) { + ref = fai_fetch64(fai, ref_name, &len); + } + tid = b->core.tid; + if (ref == 0) { // FIXME: Should this always be fatal? + fprintf(samtools_stderr, "[bam_fillmd] fail to find sequence '%s' in the reference.\n", + ref_name ? ref_name : "(unknown)"); + if (is_realn || capQ > 10) goto fail; // Would otherwise crash + } + } + if (is_realn) { + if (sam_prob_realn(b, ref, len, baq_flag) < -3) { + print_error_errno("calmd", "BAQ alignment failed"); + goto fail; + } + } + if (capQ > 10) { + int q = sam_cap_mapq(b, ref, len, capQ); + if (b->core.qual > q) b->core.qual = q; + } + if (ref) { + if (bam_fillmd1_core(ref_name, b, ref, len, flt_flag, max_nm, + quiet_mode, &skipped) < 0) + goto fail; + } + } + if (sam_write1(fpout, header, b) < 0) { + print_error_errno("calmd", "failed to write to output file"); + goto fail; + } + } + if (ret < -1) { + fprintf(samtools_stderr, "[bam_fillmd] Error reading input.\n"); + goto fail; + } + + if (skipped) { + fprintf(samtools_stderr, "[calmd] Warning: %"PRIu32" records skipped due " + "to no query sequence\n", + skipped); + } + + bam_destroy1(b); + sam_hdr_destroy(header); + + free(arg_list); + free(ref); + fai_destroy(fai); + sam_close(fp); + if (sam_close(fpout) < 0) { + fprintf(samtools_stderr, "[bam_fillmd] error when closing output file\n"); + return 1; + } + if (p.pool) hts_tpool_destroy(p.pool); + + return 0; + + fail: + free(arg_list); + free(ref); + if (b) bam_destroy1(b); + if (header) sam_hdr_destroy(header); + if (fai) fai_destroy(fai); + if (fp) sam_close(fp); + if (fpout) sam_close(fpout); + if (p.pool) hts_tpool_destroy(p.pool); + + return 1; +} diff --git a/samtools/bam_plbuf.c b/samtools/bam_plbuf.c new file mode 100644 index 0000000..5541d55 --- /dev/null +++ b/samtools/bam_plbuf.c @@ -0,0 +1,69 @@ +/* bam_plbuf.c -- plbuf routines (previously in bam_pileup.c). + + Copyright (C) 2008-2010, 2013 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include "bam_plbuf.h" + +/***************** + * callback APIs * + *****************/ + +void bam_plbuf_reset(bam_plbuf_t *buf) +{ + bam_plp_reset(buf->iter); +} + +bam_plbuf_t *bam_plbuf_init(bam_pileup_f func, void *data) +{ + bam_plbuf_t *buf; + buf = calloc(1, sizeof(bam_plbuf_t)); + buf->iter = bam_plp_init(0, 0); + buf->func = func; + buf->data = data; + return buf; +} + +void bam_plbuf_destroy(bam_plbuf_t *buf) +{ + bam_plp_destroy(buf->iter); + free(buf); +} + +int bam_plbuf_push(const bam1_t *b, bam_plbuf_t *buf) +{ + int ret, n_plp, tid; + hts_pos_t pos; + const bam_pileup1_t *plp; + ret = bam_plp_push(buf->iter, b); + if (ret < 0) return ret; + while ((plp = bam_plp64_next(buf->iter, &tid, &pos, &n_plp)) != 0) + buf->func(tid, pos, n_plp, plp, buf->data); + return 0; +} diff --git a/samtools/bam_plbuf.c.pysam.c b/samtools/bam_plbuf.c.pysam.c new file mode 100644 index 0000000..9fc8528 --- /dev/null +++ b/samtools/bam_plbuf.c.pysam.c @@ -0,0 +1,71 @@ +#include "samtools.pysam.h" + +/* bam_plbuf.c -- plbuf routines (previously in bam_pileup.c). + + Copyright (C) 2008-2010, 2013 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include "bam_plbuf.h" + +/***************** + * callback APIs * + *****************/ + +void bam_plbuf_reset(bam_plbuf_t *buf) +{ + bam_plp_reset(buf->iter); +} + +bam_plbuf_t *bam_plbuf_init(bam_pileup_f func, void *data) +{ + bam_plbuf_t *buf; + buf = calloc(1, sizeof(bam_plbuf_t)); + buf->iter = bam_plp_init(0, 0); + buf->func = func; + buf->data = data; + return buf; +} + +void bam_plbuf_destroy(bam_plbuf_t *buf) +{ + bam_plp_destroy(buf->iter); + free(buf); +} + +int bam_plbuf_push(const bam1_t *b, bam_plbuf_t *buf) +{ + int ret, n_plp, tid; + hts_pos_t pos; + const bam_pileup1_t *plp; + ret = bam_plp_push(buf->iter, b); + if (ret < 0) return ret; + while ((plp = bam_plp64_next(buf->iter, &tid, &pos, &n_plp)) != 0) + buf->func(tid, pos, n_plp, plp, buf->data); + return 0; +} diff --git a/samtools/bam_plbuf.h b/samtools/bam_plbuf.h new file mode 100644 index 0000000..9a718e0 --- /dev/null +++ b/samtools/bam_plbuf.h @@ -0,0 +1,62 @@ +/* bam_plbuf.h -- plbuf routines (declarations copied from bam.h). + + Copyright (C) 2008, 2013, 2021 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef BAM_PLBUF_H +#define BAM_PLBUF_H + +#include + +#ifndef BAM_PILEUP_F_DEFINED +#define BAM_PILEUP_F_DEFINED +typedef int (*bam_pileup_f)(uint32_t tid, hts_pos_t pos, int n, const bam_pileup1_t *pl, void *data); +#endif //BAM_PILEUP_F_DEFINED + +typedef struct { + bam_plp_t iter; + bam_pileup_f func; + void *data; +} bam_plbuf_t; + +#ifdef __cplusplus +extern "C" { +#endif +/* Exported from bam_plbuf.c */ +void bam_plbuf_reset(bam_plbuf_t *buf); + +bam_plbuf_t *bam_plbuf_init(bam_pileup_f func, void *data); + +void bam_plbuf_destroy(bam_plbuf_t *buf); + +int bam_plbuf_push(const bam1_t *b, bam_plbuf_t *buf); + +/* Exported from bam_plcmd.c */ +int pileup_seq(FILE *fp, const bam_pileup1_t *p, hts_pos_t pos, + hts_pos_t ref_len, const char *ref, kstring_t *ks, + int rev_del, int no_ins, int no_ins_mods, + int no_del, int no_ends); +#ifdef __cplusplus +} +#endif + +#endif // BAM_PLBUF_H diff --git a/samtools/bam_plcmd.c b/samtools/bam_plcmd.c new file mode 100644 index 0000000..c73bf89 --- /dev/null +++ b/samtools/bam_plcmd.c @@ -0,0 +1,1189 @@ +/* bam_plcmd.c -- mpileup subcommand. + + Copyright (C) 2008-2015, 2019-2021 Genome Research Ltd. + Portions copyright (C) 2009-2012 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "samtools.h" +#include "bedidx.h" +#include "sam_opts.h" +#include "bam_plbuf.h" + +#define dummy_free(p) +KLIST_INIT(auxlist, char *, dummy_free) + +static inline int printw(int c, FILE *fp) +{ + char buf[16]; + int l, x; + if (c == 0) return fputc('0', fp); + for (l = 0, x = c < 0? -c : c; x > 0; x /= 10) buf[l++] = x%10 + '0'; + if (c < 0) buf[l++] = '-'; + buf[l] = 0; + for (x = 0; x < l/2; ++x) { + int y = buf[x]; buf[x] = buf[l-1-x]; buf[l-1-x] = y; + } + fputs(buf, fp); + return 0; +} + +int pileup_seq(FILE *fp, const bam_pileup1_t *p, hts_pos_t pos, + hts_pos_t ref_len, const char *ref, kstring_t *ks, + int rev_del, int no_ins, int no_ins_mods, + int no_del, int no_ends) +{ + no_ins_mods |= no_ins; + int j; + hts_base_mod_state *m = p->cd.p; + if (!no_ends && p->is_head) { + putc('^', fp); + putc(p->b->core.qual > 93? 126 : p->b->core.qual + 33, fp); + } + if (!p->is_del) { + int c = p->qpos < p->b->core.l_qseq + ? seq_nt16_str[bam_seqi(bam_get_seq(p->b), p->qpos)] + : 'N'; + if (ref) { + int rb = pos < ref_len? ref[pos] : 'N'; + if (c == '=' || seq_nt16_table[c] == seq_nt16_table[rb]) c = bam_is_rev(p->b)? ',' : '.'; + else c = bam_is_rev(p->b)? tolower(c) : toupper(c); + } else { + if (c == '=') c = bam_is_rev(p->b)? ',' : '.'; + else c = bam_is_rev(p->b)? tolower(c) : toupper(c); + } + putc(c, fp); + if (m) { + int nm; + hts_base_mod mod[256]; + if ((nm = bam_mods_at_qpos(p->b, p->qpos, m, mod, 256)) > 0) { + putc('[', fp); + int j; + for (j = 0; j < nm && j < 256; j++) { + char qual[20]; + if (mod[j].qual >= 0) + sprintf(qual, "%d", mod[j].qual); + else + *qual = 0; + if (mod[j].modified_base < 0) + // ChEBI + fprintf(fp, "%c(%d)%s", "+-"[mod[j].strand], + -mod[j].modified_base, qual); + else + fprintf(fp, "%c%c%s", "+-"[mod[j].strand], + mod[j].modified_base, qual); + } + putc(']', fp); + } + } + } else putc(p->is_refskip? (bam_is_rev(p->b)? '<' : '>') : ((bam_is_rev(p->b) && rev_del) ? '#' : '*'), fp); + int del_len = -p->indel; + if (p->indel > 0) { + int len = bam_plp_insertion_mod(p, m && !no_ins_mods ? m : NULL, + ks, &del_len); + if (len < 0) { + print_error("mpileup", "bam_plp_insertion() failed"); + return -1; + } + if (no_ins < 2) { + putc('+', fp); + printw(len, fp); + } + if (!no_ins) { + if (bam_is_rev(p->b)) { + char pad = rev_del ? '#' : '*'; + int in_mod = 0; + for (j = 0; j < ks->l; j++) { + if (ks->s[j] == '[') in_mod = 1; + else if (ks->s[j] == ']') in_mod = 0; + putc(ks->s[j] != '*' + ? (in_mod ? ks->s[j] : tolower(ks->s[j])) + : pad, fp); + } + } else { + int in_mod = 0; + for (j = 0; j < ks->l; j++) { + if (ks->s[j] == '[') in_mod = 1; + if (ks->s[j] == ']') in_mod = 0; + putc(in_mod ? ks->s[j] : toupper(ks->s[j]), fp); + } + } + } + } + if (del_len > 0) { + if (no_del < 2) + printw(-del_len, fp); + if (!no_del) { + for (j = 1; j <= del_len; ++j) { + int c = (ref && (int)pos+j < ref_len)? ref[pos+j] : 'N'; + putc(bam_is_rev(p->b)? tolower(c) : toupper(c), fp); + } + } + } + if (!no_ends && p->is_tail) putc('$', fp); + return 0; +} + +#include "sample.h" + +#define MPLP_NO_COMP (1<<2) +#define MPLP_NO_ORPHAN (1<<3) +#define MPLP_REALN (1<<4) +#define MPLP_NO_INDEL (1<<5) +#define MPLP_REDO_BAQ (1<<6) +#define MPLP_ILLUMINA13 (1<<7) +#define MPLP_IGNORE_RG (1<<8) +#define MPLP_SMART_OVERLAPS (1<<10) + +#define MPLP_PRINT_MAPQ_CHAR (1<<11) +#define MPLP_PRINT_QPOS (1<<12) +#define MPLP_PRINT_QNAME (1<<13) +#define MPLP_PRINT_FLAG (1<<14) +#define MPLP_PRINT_RNAME (1<<15) +#define MPLP_PRINT_POS (1<<16) +#define MPLP_PRINT_MAPQ (1<<17) +#define MPLP_PRINT_CIGAR (1<<18) +#define MPLP_PRINT_RNEXT (1<<19) +#define MPLP_PRINT_PNEXT (1<<20) +#define MPLP_PRINT_TLEN (1<<21) +#define MPLP_PRINT_SEQ (1<<22) +#define MPLP_PRINT_QUAL (1<<23) +#define MPLP_PRINT_MODS (1<<24) +#define MPLP_PRINT_QPOS5 (1<<25) + +#define MPLP_PRINT_LAST (1<<26) // terminator for loop + +#define MPLP_MAX_DEPTH 8000 +#define MPLP_MAX_INDEL_DEPTH 250 + +typedef struct { + int min_mq, flag, min_baseQ, capQ_thres, max_depth, max_indel_depth, all, rev_del; + int rflag_require, rflag_filter; + char *reg, *pl_list, *fai_fname, *output_fname; + faidx_t *fai; + void *bed, *rghash, *auxlist; + int argc; + char **argv; + char sep, empty, no_ins, no_ins_mods, no_del, no_ends; + sam_global_args ga; +} mplp_conf_t; + +typedef struct { + char *ref[2]; + int ref_id[2]; + hts_pos_t ref_len[2]; +} mplp_ref_t; + +#define MPLP_REF_INIT {{NULL,NULL},{-1,-1},{0,0}} + +typedef struct { + samFile *fp; + hts_itr_t *iter; + sam_hdr_t *h; + mplp_ref_t *ref; + const mplp_conf_t *conf; +} mplp_aux_t; + +typedef struct { + int n; + int *n_plp, *m_plp; + bam_pileup1_t **plp; +} mplp_pileup_t; + +static int build_auxlist(mplp_conf_t *conf, char *optstring) { + if (!optstring) + return 0; + + void *colhash = khash_str2int_init(); + if (!colhash) + return 1; + + struct active_cols { + char *name; + int supported; + }; + + const struct active_cols colnames[11] = { + {"QNAME", 1}, {"FLAG", 1}, {"RNAME", 1}, {"POS", 1}, {"MAPQ", 1}, {"CIGAR", 0}, {"RNEXT", 1}, {"PNEXT", 1}, {"TLEN", 0}, {"SEQ", 0}, {"QUAL", 0} + }; + + int i, f = MPLP_PRINT_QNAME, colno = 11; + for (i = 0; i < colno; i++, f <<= 1) + if (colnames[i].supported) + khash_str2int_set(colhash, colnames[i].name, f); + + conf->auxlist = kl_init(auxlist); + if (!conf->auxlist) + return 1; + + char *save_p; + char *tag = strtok_r(optstring, ",", &save_p); + while (tag) { + if (khash_str2int_get(colhash, tag, &f) == 0) { + conf->flag |= f; + } else { + if (strlen(tag) != 2) { + fprintf(stderr, "[%s] tag '%s' has more than two characters or not supported\n", __func__, tag); + } else { + char **tag_p = kl_pushp(auxlist, conf->auxlist); + *tag_p = tag; + } + } + tag = strtok_r(NULL, ",", &save_p); + } + + khash_str2int_destroy(colhash); + + return 0; +} + +static int mplp_get_ref(mplp_aux_t *ma, int tid, char **ref, hts_pos_t *ref_len) { + mplp_ref_t *r = ma->ref; + + //printf("get ref %d {%d/%p, %d/%p}\n", tid, r->ref_id[0], r->ref[0], r->ref_id[1], r->ref[1]); + + if (!r || !ma->conf->fai) { + *ref = NULL; + return 0; + } + + // Do we need to reference count this so multiple mplp_aux_t can + // track which references are in use? + // For now we just cache the last two. Sufficient? + if (tid == r->ref_id[0]) { + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; + } + if (tid == r->ref_id[1]) { + // Last, swap over + int tmp_id; + hts_pos_t tmp_len; + tmp_id = r->ref_id[0]; r->ref_id[0] = r->ref_id[1]; r->ref_id[1] = tmp_id; + tmp_len = r->ref_len[0]; r->ref_len[0] = r->ref_len[1]; r->ref_len[1] = tmp_len; + + char *tc; + tc = r->ref[0]; r->ref[0] = r->ref[1]; r->ref[1] = tc; + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; + } + + // New, so migrate to old and load new + free(r->ref[1]); + r->ref[1] = r->ref[0]; + r->ref_id[1] = r->ref_id[0]; + r->ref_len[1] = r->ref_len[0]; + + r->ref_id[0] = tid; + r->ref[0] = faidx_fetch_seq64(ma->conf->fai, + sam_hdr_tid2name(ma->h, r->ref_id[0]), + 0, + HTS_POS_MAX, + &r->ref_len[0]); + + if (!r->ref[0]) { + r->ref[0] = NULL; + r->ref_id[0] = -1; + r->ref_len[0] = 0; + *ref = NULL; + return 0; + } + + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; +} + +// Initialise and destroy the base modifier state data. This is called +// as each new read is added or removed from the pileups. +static +int pileup_cd_create(void *data, const bam1_t *b, bam_pileup_cd *cd) { + int ret; + hts_base_mod_state *m = hts_base_mod_state_alloc(); + ret = bam_parse_basemod(b, m); + cd->p = m; + return ret; +} + +static +int pileup_cd_destroy(void *data, const bam1_t *b, bam_pileup_cd *cd) { + hts_base_mod_state_free(cd->p); + return 0; +} + +static void +print_empty_pileup(FILE *fp, const mplp_conf_t *conf, const char *tname, + hts_pos_t pos, int n, const char *ref, hts_pos_t ref_len) +{ + int i; + fprintf(fp, "%s\t%"PRIhts_pos"\t%c", tname, pos+1, (ref && pos < ref_len)? ref[pos] : 'N'); + for (i = 0; i < n; ++i) { + fputs("\t0\t*\t*", fp); + int flag_value = MPLP_PRINT_MAPQ_CHAR; + while(flag_value < MPLP_PRINT_LAST) { + if (flag_value != MPLP_PRINT_MODS && (conf->flag & flag_value)) + fputs("\t*", fp); + flag_value <<= 1; + } + if (conf->auxlist) { + int t = 0; + while(t++ < ((klist_t(auxlist) *)conf->auxlist)->size) + fputs("\t*", fp); + } + } + putc('\n', fp); +} + +static int mplp_func(void *data, bam1_t *b) +{ + char *ref; + mplp_aux_t *ma = (mplp_aux_t*)data; + int ret, skip = 0; + hts_pos_t ref_len; + + do { + int has_ref; + ret = ma->iter? sam_itr_next(ma->fp, ma->iter, b) : sam_read1(ma->fp, ma->h, b); + if (ret < 0) break; + // The 'B' cigar operation is not part of the specification, considering as obsolete. + // bam_remove_B(b); + if (b->core.tid < 0 || (b->core.flag&BAM_FUNMAP)) { // exclude unmapped reads + skip = 1; + continue; + } + if (ma->conf->rflag_require && !(ma->conf->rflag_require&b->core.flag)) { skip = 1; continue; } + if (ma->conf->rflag_filter && ma->conf->rflag_filter&b->core.flag) { skip = 1; continue; } + if (ma->conf->bed && ma->conf->all == 0) { // test overlap + skip = !bed_overlap(ma->conf->bed, sam_hdr_tid2name(ma->h, b->core.tid), b->core.pos, bam_endpos(b)); + if (skip) continue; + } + if (ma->conf->rghash) { // exclude read groups + uint8_t *rg = bam_aux_get(b, "RG"); + skip = (rg && khash_str2int_get(ma->conf->rghash, (const char*)(rg+1), NULL)==0); + if (skip) continue; + } + if (ma->conf->flag & MPLP_ILLUMINA13) { + int i; + uint8_t *qual = bam_get_qual(b); + for (i = 0; i < b->core.l_qseq; ++i) + qual[i] = qual[i] > 31? qual[i] - 31 : 0; + } + + if (ma->conf->fai && b->core.tid >= 0) { + has_ref = mplp_get_ref(ma, b->core.tid, &ref, &ref_len); + if (has_ref && ref_len <= b->core.pos) { // exclude reads outside of the reference sequence + fprintf(stderr,"[%s] Skipping because %"PRIhts_pos" is outside of %"PRIhts_pos" [ref:%d]\n", + __func__, (int64_t) b->core.pos, ref_len, b->core.tid); + skip = 1; + continue; + } + } else { + has_ref = 0; + } + + skip = 0; + if (has_ref && (ma->conf->flag&MPLP_REALN)) sam_prob_realn(b, ref, ref_len, (ma->conf->flag & MPLP_REDO_BAQ)? 7 : 3); + if (has_ref && ma->conf->capQ_thres > 10) { + int q = sam_cap_mapq(b, ref, ref_len, ma->conf->capQ_thres); + if (q < 0) skip = 1; + else if (b->core.qual > q) b->core.qual = q; + } + if (b->core.qual < ma->conf->min_mq) skip = 1; + else if ((ma->conf->flag&MPLP_NO_ORPHAN) && (b->core.flag&BAM_FPAIRED) && !(b->core.flag&BAM_FPROPER_PAIR)) skip = 1; + } while (skip); + return ret; +} + +/* + * Performs pileup + * @param conf configuration for this pileup + * @param n number of files specified in fn + * @param fn filenames + * @param fn_idx index filenames + */ +static int mpileup(mplp_conf_t *conf, int n, char **fn, char **fn_idx) +{ + mplp_aux_t **data; + int i, tid, *n_plp, tid0 = 0, max_depth; + hts_pos_t pos, beg0 = 0, end0 = HTS_POS_MAX, ref_len; + const bam_pileup1_t **plp; + mplp_ref_t mp_ref = MPLP_REF_INIT; + bam_mplp_t iter; + sam_hdr_t *h = NULL; /* header of first file in input list */ + char *ref; + FILE *pileup_fp = NULL; + + bam_sample_t *sm = NULL; + kstring_t buf; + mplp_pileup_t gplp; + + memset(&gplp, 0, sizeof(mplp_pileup_t)); + memset(&buf, 0, sizeof(kstring_t)); + data = calloc(n, sizeof(mplp_aux_t*)); + plp = calloc(n, sizeof(bam_pileup1_t*)); + n_plp = calloc(n, sizeof(int)); + sm = bam_smpl_init(); + + if (n == 0) { + fprintf(stderr,"[%s] no input file/data given\n", __func__); + exit(EXIT_FAILURE); + } + + // read the header of each file in the list and initialize data + refs_t *refs = NULL; + for (i = 0; i < n; ++i) { + sam_hdr_t *h_tmp; + data[i] = calloc(1, sizeof(mplp_aux_t)); + data[i]->fp = sam_open_format(fn[i], "rb", &conf->ga.in); + if ( !data[i]->fp ) + { + fprintf(stderr, "[%s] failed to open %s: %s\n", __func__, fn[i], strerror(errno)); + exit(EXIT_FAILURE); + } + if (hts_set_opt(data[i]->fp, CRAM_OPT_DECODE_MD, 0)) { + fprintf(stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + exit(EXIT_FAILURE); + } + + if (!refs && conf->fai_fname) { + if (hts_set_fai_filename(data[i]->fp, conf->fai_fname) != 0) { + fprintf(stderr, "[%s] failed to process %s: %s\n", + __func__, conf->fai_fname, strerror(errno)); + exit(EXIT_FAILURE); + } + refs = cram_get_refs(data[i]->fp); + } else if (conf->fai_fname) { + if (hts_set_opt(data[i]->fp, CRAM_OPT_SHARED_REF, refs) != 0) { + fprintf(stderr, "[%s] failed to process %s: %s\n", + __func__, conf->fai_fname, strerror(errno)); + exit(EXIT_FAILURE); + } + } + + data[i]->conf = conf; + data[i]->ref = &mp_ref; + h_tmp = sam_hdr_read(data[i]->fp); + if ( !h_tmp ) { + fprintf(stderr,"[%s] fail to read the header of %s\n", __func__, fn[i]); + exit(EXIT_FAILURE); + } + bam_smpl_add(sm, fn[i], (conf->flag&MPLP_IGNORE_RG)? 0 : sam_hdr_str(h_tmp)); + if (conf->reg) { + hts_idx_t *idx = NULL; + // If index filename has not been specfied, look in BAM folder + if (fn_idx != NULL) { + idx = sam_index_load2(data[i]->fp, fn[i], fn_idx[i]); + } else { + idx = sam_index_load(data[i]->fp, fn[i]); + } + + if (idx == NULL) { + fprintf(stderr, "[%s] fail to load index for %s\n", __func__, fn[i]); + exit(EXIT_FAILURE); + } + if ( (data[i]->iter=sam_itr_querys(idx, h_tmp, conf->reg)) == 0) { + fprintf(stderr, "[E::%s] fail to parse region '%s' with %s\n", __func__, conf->reg, fn[i]); + exit(EXIT_FAILURE); + } + if (i == 0) beg0 = data[i]->iter->beg, end0 = data[i]->iter->end, tid0 = data[i]->iter->tid; + hts_idx_destroy(idx); + } + else + data[i]->iter = NULL; + + if (i == 0) h = data[i]->h = h_tmp; // save the header of the first file + else { + // FIXME: check consistency between h and h_tmp + sam_hdr_destroy(h_tmp); + + // we store only the first file's header; it's (alleged to be) + // compatible with the i-th file's target_name lookup needs + data[i]->h = h; + } + } + fprintf(stderr, "[%s] %d samples in %d input files\n", __func__, sm->n, n); + + pileup_fp = conf->output_fname? fopen(conf->output_fname, "w") : stdout; + + if (pileup_fp == NULL) { + fprintf(stderr, "[%s] failed to write to %s: %s\n", __func__, conf->output_fname, strerror(errno)); + exit(EXIT_FAILURE); + } + + // init pileup + iter = bam_mplp_init(n, mplp_func, (void**)data); + if (conf->flag & MPLP_PRINT_MODS) { + bam_mplp_constructor(iter, pileup_cd_create); + bam_mplp_destructor(iter, pileup_cd_destroy); + } + if ( conf->flag & MPLP_SMART_OVERLAPS ) bam_mplp_init_overlaps(iter); + if ( !conf->max_depth ) { + max_depth = INT_MAX; + fprintf(stderr, "[%s] Max depth set to maximum value (%d)\n", __func__, INT_MAX); + } else { + max_depth = conf->max_depth; + if ( max_depth * n > 1<<20 ) + fprintf(stderr, "[%s] Combined max depth is above 1M. Potential memory hog!\n", __func__); + } + + + bam_mplp_set_maxcnt(iter, max_depth); + int ret; + int last_tid = -1; + hts_pos_t last_pos = -1; + + // begin pileup + while ( (ret=bam_mplp64_auto(iter, &tid, &pos, n_plp, plp)) > 0) { + if (conf->reg && (pos < beg0 || pos >= end0)) continue; // out of the region requested + mplp_get_ref(data[0], tid, &ref, &ref_len); + //printf("tid=%d len=%d ref=%p/%s\n", tid, ref_len, ref, ref); + if (conf->all) { + // Deal with missing portions of previous tids + while (tid > last_tid) { + if (last_tid >= 0 && !conf->reg) { + while (++last_pos < sam_hdr_tid2len(h, last_tid)) { + if (conf->bed && bed_overlap(conf->bed, sam_hdr_tid2name(h, last_tid), last_pos, last_pos + 1) == 0) + continue; + print_empty_pileup(pileup_fp, conf, sam_hdr_tid2name(h, last_tid), last_pos, n, ref, ref_len); + } + } + last_tid++; + last_pos = -1; + if (conf->all < 2) + break; + } + } + if (conf->all) { + // Deal with missing portion of current tid + while (++last_pos < pos) { + if (conf->reg && last_pos < beg0) continue; // out of range; skip + if (conf->bed && bed_overlap(conf->bed, sam_hdr_tid2name(h, tid), last_pos, last_pos + 1) == 0) + continue; + print_empty_pileup(pileup_fp, conf, sam_hdr_tid2name(h, tid), last_pos, n, ref, ref_len); + } + last_tid = tid; + last_pos = pos; + } + if (conf->bed && tid >= 0 && !bed_overlap(conf->bed, sam_hdr_tid2name(h, tid), pos, pos+1)) continue; + + fprintf(pileup_fp, "%s\t%"PRIhts_pos"\t%c", sam_hdr_tid2name(h, tid), pos + 1, (ref && pos < ref_len)? ref[pos] : 'N'); + for (i = 0; i < n; ++i) { + int j, cnt; + for (j = cnt = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = plp[i] + j; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if (c >= conf->min_baseQ) ++cnt; + } + fprintf(pileup_fp, "\t%d\t", cnt); + if (n_plp[i] == 0) { + fputs("*\t*", pileup_fp); + int flag_value = MPLP_PRINT_MAPQ_CHAR; + while(flag_value < MPLP_PRINT_LAST) { + if (flag_value != MPLP_PRINT_MODS + && (conf->flag & flag_value)) + fputs("\t*", pileup_fp); + flag_value <<= 1; + } + if (conf->auxlist) { + int t = 0; + while(t++ < ((klist_t(auxlist) *)conf->auxlist)->size) + fputs("\t*", pileup_fp); + } + } else { + int n = 0; + kstring_t ks = KS_INITIALIZE; + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = plp[i] + j; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if (c >= conf->min_baseQ) { + n++; + if (pileup_seq(pileup_fp, plp[i] + j, pos, ref_len, + ref, &ks, conf->rev_del, + conf->no_ins, conf->no_ins_mods, + conf->no_del, conf->no_ends) < 0) { + ret = 1; + goto fail; + } + } + } + if (!n) putc('*', pileup_fp); + + /* Print base qualities */ + n = 0; + ks_free(&ks); + putc('\t', pileup_fp); + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = plp[i] + j; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if (c >= conf->min_baseQ) { + c = c + 33 < 126? c + 33 : 126; + putc(c, pileup_fp); + n++; + } + } + if (!n) putc('*', pileup_fp); + + /* Print selected columns */ + int flag_value = MPLP_PRINT_MAPQ_CHAR; + while(flag_value < MPLP_PRINT_LAST) { + if (flag_value != MPLP_PRINT_MODS + && (conf->flag & flag_value)) { + n = 0; + putc('\t', pileup_fp); + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = &plp[i][j]; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if ( c < conf->min_baseQ ) continue; + if (n > 0 && flag_value != MPLP_PRINT_MAPQ_CHAR) putc(',', pileup_fp); + n++; + + switch (flag_value) { + case MPLP_PRINT_MAPQ_CHAR: + c = p->b->core.qual + 33; + if (c > 126) c = 126; + putc(c, pileup_fp); + break; + case MPLP_PRINT_QPOS: + // query position in current orientation + fprintf(pileup_fp, "%d", p->qpos + 1); + break; + case MPLP_PRINT_QPOS5: { + // query position in 5' to 3' orientation + int pos5 = bam_is_rev(p->b) + ? p->b->core.l_qseq-p->qpos + p->is_del + : p->qpos + 1; + fprintf(pileup_fp, "%d", pos5); + break; + } + case MPLP_PRINT_QNAME: + fputs(bam_get_qname(p->b), pileup_fp); + break; + case MPLP_PRINT_FLAG: + fprintf(pileup_fp, "%d", p->b->core.flag); + break; + case MPLP_PRINT_RNAME: + if (p->b->core.tid >= 0) + fputs(sam_hdr_tid2name(h, p->b->core.tid), pileup_fp); + else + putc('*', pileup_fp); + break; + case MPLP_PRINT_POS: + fprintf(pileup_fp, "%"PRId64, (int64_t) p->b->core.pos + 1); + break; + case MPLP_PRINT_MAPQ: + fprintf(pileup_fp, "%d", p->b->core.qual); + break; + case MPLP_PRINT_RNEXT: + if (p->b->core.mtid >= 0) + fputs(sam_hdr_tid2name(h, p->b->core.mtid), pileup_fp); + else + putc('*', pileup_fp); + break; + case MPLP_PRINT_PNEXT: + fprintf(pileup_fp, "%"PRId64, (int64_t) p->b->core.mpos + 1); + break; + } + } + if (!n) putc('*', pileup_fp); + } + flag_value <<= 1; + } + + /* Print selected tags */ + klist_t(auxlist) *auxlist_p = ((klist_t(auxlist) *)conf->auxlist); + if (auxlist_p && auxlist_p->size) { + kliter_t(auxlist) *aux; + for (aux = kl_begin(auxlist_p); aux != kl_end(auxlist_p); aux = kl_next(aux)) { + n = 0; + putc('\t', pileup_fp); + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = &plp[i][j]; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if ( c < conf->min_baseQ ) continue; + + if (n > 0) putc(conf->sep, pileup_fp); + n++; + uint8_t* tag_u = bam_aux_get(p->b, kl_val(aux)); + if (!tag_u) { + putc(conf->empty , pileup_fp); + continue; + } + + int tag_supported = 0; + + /* Tag value is string */ + if (*tag_u == 'Z' || *tag_u == 'H') { + char *tag_s = bam_aux2Z(tag_u); + if (!tag_s) continue; + fputs(tag_s, pileup_fp); + tag_supported = 1; + } + + /* Tag value is integer */ + if (*tag_u == 'I' || *tag_u == 'i' || *tag_u == 'C' || *tag_u == 'c' || *tag_u == 'S' || *tag_u == 's') { + int64_t tag_i = bam_aux2i(tag_u); + fprintf(pileup_fp, "%" PRId64 "", tag_i); + tag_supported = 1; + } + + /* Tag value is float */ + if (*tag_u == 'd' || *tag_u == 'f') { + double tag_f = bam_aux2f(tag_u); + fprintf(pileup_fp, "%lf", tag_f); + tag_supported = 1; + } + + /* Tag value is character */ + if (*tag_u == 'A') { + char tag_c = bam_aux2A(tag_u); + putc(tag_c, pileup_fp); + tag_supported = 1; + } + + if (!tag_supported) putc('*', pileup_fp); + } + if (!n) putc('*', pileup_fp); + } + } + } + } + putc('\n', pileup_fp); + } + + if (ret < 0) { + print_error("mpileup", "error reading from input file"); + ret = EXIT_FAILURE; + goto fail; + } + + if (conf->all) { + // Handle terminating region + if (last_tid < 0 && conf->reg && conf->all > 1) { + last_tid = tid0; + last_pos = beg0-1; + mplp_get_ref(data[0], tid0, &ref, &ref_len); + } + while (last_tid >= 0 && last_tid < sam_hdr_nref(h)) { + while (++last_pos < sam_hdr_tid2len(h, last_tid)) { + if (last_pos >= end0) break; + if (conf->bed && bed_overlap(conf->bed, sam_hdr_tid2name(h, last_tid), last_pos, last_pos + 1) == 0) + continue; + print_empty_pileup(pileup_fp, conf, sam_hdr_tid2name(h, last_tid), last_pos, n, ref, ref_len); + } + last_tid++; + last_pos = -1; + if (conf->all < 2 || conf->reg) + break; + } + } + +fail: + // clean up + if (pileup_fp && conf->output_fname) fclose(pileup_fp); + bam_smpl_destroy(sm); free(buf.s); + for (i = 0; i < gplp.n; ++i) free(gplp.plp[i]); + free(gplp.plp); free(gplp.n_plp); free(gplp.m_plp); + bam_mplp_destroy(iter); + sam_hdr_destroy(h); + for (i = 0; i < n; ++i) { + sam_close(data[i]->fp); + if (data[i]->iter) hts_itr_destroy(data[i]->iter); + free(data[i]); + } + free(data); free(plp); free(n_plp); + free(mp_ref.ref[0]); + free(mp_ref.ref[1]); + return ret; +} + +static int is_url(const char *s) +{ + static const char uri_scheme_chars[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+.-"; + return s[strspn(s, uri_scheme_chars)] == ':'; +} + +#define MAX_PATH_LEN 1024 +int read_file_list(const char *file_list,int *n,char **argv[]) +{ + char buf[MAX_PATH_LEN]; + int len, nfiles = 0; + char **files = NULL; + struct stat sb; + + *n = 0; + *argv = NULL; + + FILE *fh = fopen(file_list,"r"); + if ( !fh ) + { + fprintf(stderr,"%s: %s\n", file_list,strerror(errno)); + return 1; + } + + files = calloc(nfiles,sizeof(char*)); + nfiles = 0; + while ( fgets(buf,MAX_PATH_LEN,fh) ) + { + // allow empty lines and trailing spaces + len = strlen(buf); + while ( len>0 && isspace(buf[len-1]) ) len--; + if ( !len ) continue; + + // check sanity of the file list + buf[len] = 0; + if (! (is_url(buf) || stat(buf, &sb) == 0)) + { + // no such file, check if it is safe to print its name + int i, safe_to_print = 1; + for (i=0; irflag_require); + char *tmp_filter = bam_flag2str(mplp->rflag_filter); + + // Display usage information, formatted for the standard 80 columns. + // (The unusual string formatting here aids the readability of this + // source code in 80 columns, to the extent that's possible.) + + fprintf(fp, +"\n" +"Usage: samtools mpileup [options] in1.bam [in2.bam [...]]\n" +"\n" +"Input options:\n" +" -6, --illumina1.3+ quality is in the Illumina-1.3+ encoding\n" +" -A, --count-orphans do not discard anomalous read pairs\n" +" -b, --bam-list FILE list of input BAM filenames, one per line\n" +" -B, --no-BAQ disable BAQ (per-Base Alignment Quality)\n" +" -C, --adjust-MQ INT adjust mapping quality; recommended:50, disable:0 [0]\n" +" -d, --max-depth INT max per-file depth; avoids excessive memory usage [%d]\n", mplp->max_depth); + fprintf(fp, +" -E, --redo-BAQ recalculate BAQ on the fly, ignore existing BQs\n" +" -f, --fasta-ref FILE faidx indexed reference sequence file\n" +" -G, --exclude-RG FILE exclude read groups listed in FILE\n" +" -l, --positions FILE skip unlisted positions (chr pos) or regions (BED)\n" +" -q, --min-MQ INT skip alignments with mapQ smaller than INT [%d]\n", mplp->min_mq); + fprintf(fp, +" -Q, --min-BQ INT skip bases with baseQ/BAQ smaller than INT [%d]\n", mplp->min_baseQ); + fprintf(fp, +" -r, --region REG region in which pileup is generated\n" +" -R, --ignore-RG ignore RG tags (one BAM = one sample)\n" +" --rf, --incl-flags STR|INT required flags: include reads with any of the mask bits set [%s]\n", tmp_require); + fprintf(fp, +" --ff, --excl-flags STR|INT filter flags: skip reads with any of the mask bits set\n" +" [%s]\n", tmp_filter); + fprintf(fp, +" -x, --ignore-overlaps-removal, --disable-overlap-removal\n" +" disable read-pair overlap detection and removal\n" +" -X, --customized-index use customized index files\n" // -X flag for index filename +"\n" +"Output options:\n" +" -o, --output FILE write output to FILE [standard output]\n" +" -O, --output-BP output base positions on reads, current orientation\n" +" --output-BP-5 output base positions on reads, 5' to 3' orientation\n" +" -M, --output-mods output base modifications\n" +" -s, --output-MQ output mapping quality\n" +" --output-QNAME output read names\n" +" --output-extra STR output extra read fields and read tag values\n" +" --output-sep CHAR set the separator character for tag lists [,]\n" +" --output-empty CHAR set the no value character for tag lists [*]\n" +" --no-output-ins skip insertion sequence after +NUM\n" +" Use twice for complete insertion removal\n" +" --no-output-ins-mods don't display base modifications within insertions\n" +" --no-output-del skip deletion sequence after -NUM\n" +" Use twice for complete deletion removal\n" +" --no-output-ends remove ^MQUAL and $ markup in sequence column\n" +" --reverse-del use '#' character for deletions on the reverse strand\n" +" -a output all positions (including zero depth)\n" +" -a -a (or -aa) output absolutely all positions, including unused ref. sequences\n" +"\n" +"Generic options:\n"); + sam_global_opt_help(fp, "-.--.--."); + + fprintf(fp, "\n" +"Note that using \"samtools mpileup\" to generate BCF or VCF files has been\n" +"removed. To output these formats, please use \"bcftools mpileup\" instead.\n"); + + free(tmp_require); + free(tmp_filter); +} + +int bam_mpileup(int argc, char *argv[]) +{ + int c; + const char *file_list = NULL; + char **fn = NULL; + int nfiles = 0, use_orphan = 0, has_index_file = 0; + mplp_conf_t mplp; + memset(&mplp, 0, sizeof(mplp_conf_t)); + mplp.min_baseQ = 13; + mplp.capQ_thres = 0; + mplp.max_depth = MPLP_MAX_DEPTH; + mplp.flag = MPLP_NO_ORPHAN | MPLP_REALN | MPLP_SMART_OVERLAPS; + mplp.argc = argc; mplp.argv = argv; + mplp.rflag_filter = BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP; + mplp.output_fname = NULL; + mplp.all = 0; + mplp.rev_del = 0; + mplp.sep = ','; + mplp.empty = '*'; + sam_global_args_init(&mplp.ga); + + static const struct option lopts[] = + { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '-'), + {"rf", required_argument, NULL, 1}, // require flag + {"ff", required_argument, NULL, 2}, // filter flag + {"incl-flags", required_argument, NULL, 1}, + {"excl-flags", required_argument, NULL, 2}, + {"output", required_argument, NULL, 3}, + {"output-QNAME", no_argument, NULL, 5}, + {"output-qname", no_argument, NULL, 5}, + {"illumina1.3+", no_argument, NULL, '6'}, + {"count-orphans", no_argument, NULL, 'A'}, + {"bam-list", required_argument, NULL, 'b'}, + {"no-BAQ", no_argument, NULL, 'B'}, + {"no-baq", no_argument, NULL, 'B'}, + {"adjust-MQ", required_argument, NULL, 'C'}, + {"adjust-mq", required_argument, NULL, 'C'}, + {"max-depth", required_argument, NULL, 'd'}, + {"redo-BAQ", no_argument, NULL, 'E'}, + {"redo-baq", no_argument, NULL, 'E'}, + {"fasta-ref", required_argument, NULL, 'f'}, + {"exclude-RG", required_argument, NULL, 'G'}, + {"exclude-rg", required_argument, NULL, 'G'}, + {"positions", required_argument, NULL, 'l'}, + {"region", required_argument, NULL, 'r'}, + {"ignore-RG", no_argument, NULL, 'R'}, + {"ignore-rg", no_argument, NULL, 'R'}, + {"min-MQ", required_argument, NULL, 'q'}, + {"min-mq", required_argument, NULL, 'q'}, + {"min-BQ", required_argument, NULL, 'Q'}, + {"min-bq", required_argument, NULL, 'Q'}, + // NB: old "--ignore-overlaps" auto-completes to this + {"ignore-overlaps-removal", no_argument, NULL, 'x'}, + {"disable-overlap-removal", no_argument, NULL, 'x'}, + {"output-mods", no_argument, NULL, 'M'}, + {"output-BP", no_argument, NULL, 'O'}, + {"output-bp", no_argument, NULL, 'O'}, + {"output-BP-5", no_argument, NULL, 14}, + {"output-bp-5", no_argument, NULL, 14}, + {"output-MQ", no_argument, NULL, 's'}, + {"output-mq", no_argument, NULL, 's'}, + {"ext-prob", required_argument, NULL, 'e'}, + {"gap-frac", required_argument, NULL, 'F'}, + {"tandem-qual", required_argument, NULL, 'h'}, + {"skip-indels", no_argument, NULL, 'I'}, + {"max-idepth", required_argument, NULL, 'L'}, + {"min-ireads ", required_argument, NULL, 'm'}, + {"per-sample-mF", no_argument, NULL, 'p'}, + {"per-sample-mf", no_argument, NULL, 'p'}, + {"platforms", required_argument, NULL, 'P'}, + {"customized-index", no_argument, NULL, 'X'}, + {"reverse-del", no_argument, NULL, 6}, + {"output-extra", required_argument, NULL, 7}, + {"output-sep", required_argument, NULL, 8}, + {"output-empty", required_argument, NULL, 9}, + {"no-output-ins", no_argument, NULL, 10}, + {"no-output-ins-mods", no_argument, NULL, 11}, + {"no-output-del", no_argument, NULL, 12}, + {"no-output-ends", no_argument, NULL, 13}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "Af:r:l:q:Q:RC:Bd:b:o:EG:6OsxXaM",lopts,NULL)) >= 0) { + switch (c) { + case 'x': mplp.flag &= ~MPLP_SMART_OVERLAPS; break; + case 1 : + mplp.rflag_require = bam_str2flag(optarg); + if ( mplp.rflag_require<0 ) { fprintf(stderr,"Could not parse --rf %s\n", optarg); return 1; } + break; + case 2 : + mplp.rflag_filter = bam_str2flag(optarg); + if ( mplp.rflag_filter<0 ) { fprintf(stderr,"Could not parse --ff %s\n", optarg); return 1; } + break; + case 3 : mplp.output_fname = optarg; break; + case 5 : mplp.flag |= MPLP_PRINT_QNAME; break; + case 6 : mplp.rev_del = 1; break; + case 7 : + if (build_auxlist(&mplp, optarg) != 0) { + fprintf(stderr,"Could not build aux list using '%s'\n", optarg); + return 1; + } + break; + case 8: mplp.sep = optarg[0]; break; + case 9: mplp.empty = optarg[0]; break; + case 10: mplp.no_ins++; break; + case 11: mplp.no_ins_mods = 1; break; + case 12: mplp.no_del++; break; + case 13: mplp.no_ends = 1; break; + case 'f': + mplp.fai = fai_load(optarg); + if (mplp.fai == NULL) return 1; + mplp.fai_fname = optarg; + break; + case 'd': mplp.max_depth = atoi(optarg); break; + case 'r': mplp.reg = strdup(optarg); break; + case 'l': + // In the original version the whole BAM was streamed which is inefficient + // with few BED intervals and big BAMs. Todo: devise a heuristic to determine + // best strategy, that is streaming or jumping. + mplp.bed = bed_read(optarg); + if (!mplp.bed) { print_error_errno("mpileup", "Could not read file \"%s\"", optarg); return 1; } + break; + case 'B': mplp.flag &= ~MPLP_REALN; break; + case 'X': has_index_file = 1; break; + case 'E': mplp.flag |= MPLP_REDO_BAQ; break; + case '6': mplp.flag |= MPLP_ILLUMINA13; break; + case 'R': mplp.flag |= MPLP_IGNORE_RG; break; + case 's': mplp.flag |= MPLP_PRINT_MAPQ_CHAR; break; + case 'O': mplp.flag |= MPLP_PRINT_QPOS; break; + case 14: mplp.flag |= MPLP_PRINT_QPOS5; break; + case 'M': mplp.flag |= MPLP_PRINT_MODS; break; + case 'C': mplp.capQ_thres = atoi(optarg); break; + case 'q': mplp.min_mq = atoi(optarg); break; + case 'Q': mplp.min_baseQ = atoi(optarg); break; + case 'b': file_list = optarg; break; + case 'o': mplp.output_fname = optarg; break; + case 'A': use_orphan = 1; break; + case 'G': { + FILE *fp_rg; + char buf[1024]; + mplp.rghash = khash_str2int_init(); + if ((fp_rg = fopen(optarg, "r")) == NULL) + fprintf(stderr, "[%s] Fail to open file %s. Continue anyway.\n", __func__, optarg); + while (!feof(fp_rg) && fscanf(fp_rg, "%s", buf) > 0) // this is not a good style, but forgive me... + khash_str2int_inc(mplp.rghash, strdup(buf)); + fclose(fp_rg); + } + break; + case 'a': mplp.all++; break; + default: + if (parse_sam_global_opt(c, optarg, lopts, &mplp.ga) == 0) break; + /* else fall-through */ + case '?': + print_usage(stderr, &mplp); + return 1; + } + } + if (!mplp.fai && mplp.ga.reference) { + mplp.fai_fname = mplp.ga.reference; + mplp.fai = fai_load(mplp.fai_fname); + if (mplp.fai == NULL) return 1; + } + + if ( !(mplp.flag&MPLP_REALN) && mplp.flag&MPLP_REDO_BAQ ) + { + fprintf(stderr,"Error: The -B option cannot be combined with -E\n"); + return 1; + } + if (use_orphan) mplp.flag &= ~MPLP_NO_ORPHAN; + if (argc == 1) + { + print_usage(stderr, &mplp); + return 1; + } + int ret; + if (file_list) { + if (has_index_file) { + fprintf(stderr,"Error: The -b option cannot be combined with -X\n"); // No customize index loc in file list mode + return 1; + } + if ( read_file_list(file_list,&nfiles,&fn) ) return 1; + ret = mpileup(&mplp,nfiles,fn,NULL); + for (c=0; c + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "samtools.h" +#include "bedidx.h" +#include "sam_opts.h" +#include "bam_plbuf.h" + +#define dummy_free(p) +KLIST_INIT(auxlist, char *, dummy_free) + +static inline int printw(int c, FILE *fp) +{ + char buf[16]; + int l, x; + if (c == 0) return fputc('0', fp); + for (l = 0, x = c < 0? -c : c; x > 0; x /= 10) buf[l++] = x%10 + '0'; + if (c < 0) buf[l++] = '-'; + buf[l] = 0; + for (x = 0; x < l/2; ++x) { + int y = buf[x]; buf[x] = buf[l-1-x]; buf[l-1-x] = y; + } + fputs(buf, fp); + return 0; +} + +int pileup_seq(FILE *fp, const bam_pileup1_t *p, hts_pos_t pos, + hts_pos_t ref_len, const char *ref, kstring_t *ks, + int rev_del, int no_ins, int no_ins_mods, + int no_del, int no_ends) +{ + no_ins_mods |= no_ins; + int j; + hts_base_mod_state *m = p->cd.p; + if (!no_ends && p->is_head) { + putc('^', fp); + putc(p->b->core.qual > 93? 126 : p->b->core.qual + 33, fp); + } + if (!p->is_del) { + int c = p->qpos < p->b->core.l_qseq + ? seq_nt16_str[bam_seqi(bam_get_seq(p->b), p->qpos)] + : 'N'; + if (ref) { + int rb = pos < ref_len? ref[pos] : 'N'; + if (c == '=' || seq_nt16_table[c] == seq_nt16_table[rb]) c = bam_is_rev(p->b)? ',' : '.'; + else c = bam_is_rev(p->b)? tolower(c) : toupper(c); + } else { + if (c == '=') c = bam_is_rev(p->b)? ',' : '.'; + else c = bam_is_rev(p->b)? tolower(c) : toupper(c); + } + putc(c, fp); + if (m) { + int nm; + hts_base_mod mod[256]; + if ((nm = bam_mods_at_qpos(p->b, p->qpos, m, mod, 256)) > 0) { + putc('[', fp); + int j; + for (j = 0; j < nm && j < 256; j++) { + char qual[20]; + if (mod[j].qual >= 0) + sprintf(qual, "%d", mod[j].qual); + else + *qual = 0; + if (mod[j].modified_base < 0) + // ChEBI + fprintf(fp, "%c(%d)%s", "+-"[mod[j].strand], + -mod[j].modified_base, qual); + else + fprintf(fp, "%c%c%s", "+-"[mod[j].strand], + mod[j].modified_base, qual); + } + putc(']', fp); + } + } + } else putc(p->is_refskip? (bam_is_rev(p->b)? '<' : '>') : ((bam_is_rev(p->b) && rev_del) ? '#' : '*'), fp); + int del_len = -p->indel; + if (p->indel > 0) { + int len = bam_plp_insertion_mod(p, m && !no_ins_mods ? m : NULL, + ks, &del_len); + if (len < 0) { + print_error("mpileup", "bam_plp_insertion() failed"); + return -1; + } + if (no_ins < 2) { + putc('+', fp); + printw(len, fp); + } + if (!no_ins) { + if (bam_is_rev(p->b)) { + char pad = rev_del ? '#' : '*'; + int in_mod = 0; + for (j = 0; j < ks->l; j++) { + if (ks->s[j] == '[') in_mod = 1; + else if (ks->s[j] == ']') in_mod = 0; + putc(ks->s[j] != '*' + ? (in_mod ? ks->s[j] : tolower(ks->s[j])) + : pad, fp); + } + } else { + int in_mod = 0; + for (j = 0; j < ks->l; j++) { + if (ks->s[j] == '[') in_mod = 1; + if (ks->s[j] == ']') in_mod = 0; + putc(in_mod ? ks->s[j] : toupper(ks->s[j]), fp); + } + } + } + } + if (del_len > 0) { + if (no_del < 2) + printw(-del_len, fp); + if (!no_del) { + for (j = 1; j <= del_len; ++j) { + int c = (ref && (int)pos+j < ref_len)? ref[pos+j] : 'N'; + putc(bam_is_rev(p->b)? tolower(c) : toupper(c), fp); + } + } + } + if (!no_ends && p->is_tail) putc('$', fp); + return 0; +} + +#include "sample.h" + +#define MPLP_NO_COMP (1<<2) +#define MPLP_NO_ORPHAN (1<<3) +#define MPLP_REALN (1<<4) +#define MPLP_NO_INDEL (1<<5) +#define MPLP_REDO_BAQ (1<<6) +#define MPLP_ILLUMINA13 (1<<7) +#define MPLP_IGNORE_RG (1<<8) +#define MPLP_SMART_OVERLAPS (1<<10) + +#define MPLP_PRINT_MAPQ_CHAR (1<<11) +#define MPLP_PRINT_QPOS (1<<12) +#define MPLP_PRINT_QNAME (1<<13) +#define MPLP_PRINT_FLAG (1<<14) +#define MPLP_PRINT_RNAME (1<<15) +#define MPLP_PRINT_POS (1<<16) +#define MPLP_PRINT_MAPQ (1<<17) +#define MPLP_PRINT_CIGAR (1<<18) +#define MPLP_PRINT_RNEXT (1<<19) +#define MPLP_PRINT_PNEXT (1<<20) +#define MPLP_PRINT_TLEN (1<<21) +#define MPLP_PRINT_SEQ (1<<22) +#define MPLP_PRINT_QUAL (1<<23) +#define MPLP_PRINT_MODS (1<<24) +#define MPLP_PRINT_QPOS5 (1<<25) + +#define MPLP_PRINT_LAST (1<<26) // terminator for loop + +#define MPLP_MAX_DEPTH 8000 +#define MPLP_MAX_INDEL_DEPTH 250 + +typedef struct { + int min_mq, flag, min_baseQ, capQ_thres, max_depth, max_indel_depth, all, rev_del; + int rflag_require, rflag_filter; + char *reg, *pl_list, *fai_fname, *output_fname; + faidx_t *fai; + void *bed, *rghash, *auxlist; + int argc; + char **argv; + char sep, empty, no_ins, no_ins_mods, no_del, no_ends; + sam_global_args ga; +} mplp_conf_t; + +typedef struct { + char *ref[2]; + int ref_id[2]; + hts_pos_t ref_len[2]; +} mplp_ref_t; + +#define MPLP_REF_INIT {{NULL,NULL},{-1,-1},{0,0}} + +typedef struct { + samFile *fp; + hts_itr_t *iter; + sam_hdr_t *h; + mplp_ref_t *ref; + const mplp_conf_t *conf; +} mplp_aux_t; + +typedef struct { + int n; + int *n_plp, *m_plp; + bam_pileup1_t **plp; +} mplp_pileup_t; + +static int build_auxlist(mplp_conf_t *conf, char *optstring) { + if (!optstring) + return 0; + + void *colhash = khash_str2int_init(); + if (!colhash) + return 1; + + struct active_cols { + char *name; + int supported; + }; + + const struct active_cols colnames[11] = { + {"QNAME", 1}, {"FLAG", 1}, {"RNAME", 1}, {"POS", 1}, {"MAPQ", 1}, {"CIGAR", 0}, {"RNEXT", 1}, {"PNEXT", 1}, {"TLEN", 0}, {"SEQ", 0}, {"QUAL", 0} + }; + + int i, f = MPLP_PRINT_QNAME, colno = 11; + for (i = 0; i < colno; i++, f <<= 1) + if (colnames[i].supported) + khash_str2int_set(colhash, colnames[i].name, f); + + conf->auxlist = kl_init(auxlist); + if (!conf->auxlist) + return 1; + + char *save_p; + char *tag = strtok_r(optstring, ",", &save_p); + while (tag) { + if (khash_str2int_get(colhash, tag, &f) == 0) { + conf->flag |= f; + } else { + if (strlen(tag) != 2) { + fprintf(samtools_stderr, "[%s] tag '%s' has more than two characters or not supported\n", __func__, tag); + } else { + char **tag_p = kl_pushp(auxlist, conf->auxlist); + *tag_p = tag; + } + } + tag = strtok_r(NULL, ",", &save_p); + } + + khash_str2int_destroy(colhash); + + return 0; +} + +static int mplp_get_ref(mplp_aux_t *ma, int tid, char **ref, hts_pos_t *ref_len) { + mplp_ref_t *r = ma->ref; + + //printf("get ref %d {%d/%p, %d/%p}\n", tid, r->ref_id[0], r->ref[0], r->ref_id[1], r->ref[1]); + + if (!r || !ma->conf->fai) { + *ref = NULL; + return 0; + } + + // Do we need to reference count this so multiple mplp_aux_t can + // track which references are in use? + // For now we just cache the last two. Sufficient? + if (tid == r->ref_id[0]) { + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; + } + if (tid == r->ref_id[1]) { + // Last, swap over + int tmp_id; + hts_pos_t tmp_len; + tmp_id = r->ref_id[0]; r->ref_id[0] = r->ref_id[1]; r->ref_id[1] = tmp_id; + tmp_len = r->ref_len[0]; r->ref_len[0] = r->ref_len[1]; r->ref_len[1] = tmp_len; + + char *tc; + tc = r->ref[0]; r->ref[0] = r->ref[1]; r->ref[1] = tc; + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; + } + + // New, so migrate to old and load new + free(r->ref[1]); + r->ref[1] = r->ref[0]; + r->ref_id[1] = r->ref_id[0]; + r->ref_len[1] = r->ref_len[0]; + + r->ref_id[0] = tid; + r->ref[0] = faidx_fetch_seq64(ma->conf->fai, + sam_hdr_tid2name(ma->h, r->ref_id[0]), + 0, + HTS_POS_MAX, + &r->ref_len[0]); + + if (!r->ref[0]) { + r->ref[0] = NULL; + r->ref_id[0] = -1; + r->ref_len[0] = 0; + *ref = NULL; + return 0; + } + + *ref = r->ref[0]; + *ref_len = r->ref_len[0]; + return 1; +} + +// Initialise and destroy the base modifier state data. This is called +// as each new read is added or removed from the pileups. +static +int pileup_cd_create(void *data, const bam1_t *b, bam_pileup_cd *cd) { + int ret; + hts_base_mod_state *m = hts_base_mod_state_alloc(); + ret = bam_parse_basemod(b, m); + cd->p = m; + return ret; +} + +static +int pileup_cd_destroy(void *data, const bam1_t *b, bam_pileup_cd *cd) { + hts_base_mod_state_free(cd->p); + return 0; +} + +static void +print_empty_pileup(FILE *fp, const mplp_conf_t *conf, const char *tname, + hts_pos_t pos, int n, const char *ref, hts_pos_t ref_len) +{ + int i; + fprintf(fp, "%s\t%"PRIhts_pos"\t%c", tname, pos+1, (ref && pos < ref_len)? ref[pos] : 'N'); + for (i = 0; i < n; ++i) { + fputs("\t0\t*\t*", fp); + int flag_value = MPLP_PRINT_MAPQ_CHAR; + while(flag_value < MPLP_PRINT_LAST) { + if (flag_value != MPLP_PRINT_MODS && (conf->flag & flag_value)) + fputs("\t*", fp); + flag_value <<= 1; + } + if (conf->auxlist) { + int t = 0; + while(t++ < ((klist_t(auxlist) *)conf->auxlist)->size) + fputs("\t*", fp); + } + } + putc('\n', fp); +} + +static int mplp_func(void *data, bam1_t *b) +{ + char *ref; + mplp_aux_t *ma = (mplp_aux_t*)data; + int ret, skip = 0; + hts_pos_t ref_len; + + do { + int has_ref; + ret = ma->iter? sam_itr_next(ma->fp, ma->iter, b) : sam_read1(ma->fp, ma->h, b); + if (ret < 0) break; + // The 'B' cigar operation is not part of the specification, considering as obsolete. + // bam_remove_B(b); + if (b->core.tid < 0 || (b->core.flag&BAM_FUNMAP)) { // exclude unmapped reads + skip = 1; + continue; + } + if (ma->conf->rflag_require && !(ma->conf->rflag_require&b->core.flag)) { skip = 1; continue; } + if (ma->conf->rflag_filter && ma->conf->rflag_filter&b->core.flag) { skip = 1; continue; } + if (ma->conf->bed && ma->conf->all == 0) { // test overlap + skip = !bed_overlap(ma->conf->bed, sam_hdr_tid2name(ma->h, b->core.tid), b->core.pos, bam_endpos(b)); + if (skip) continue; + } + if (ma->conf->rghash) { // exclude read groups + uint8_t *rg = bam_aux_get(b, "RG"); + skip = (rg && khash_str2int_get(ma->conf->rghash, (const char*)(rg+1), NULL)==0); + if (skip) continue; + } + if (ma->conf->flag & MPLP_ILLUMINA13) { + int i; + uint8_t *qual = bam_get_qual(b); + for (i = 0; i < b->core.l_qseq; ++i) + qual[i] = qual[i] > 31? qual[i] - 31 : 0; + } + + if (ma->conf->fai && b->core.tid >= 0) { + has_ref = mplp_get_ref(ma, b->core.tid, &ref, &ref_len); + if (has_ref && ref_len <= b->core.pos) { // exclude reads outside of the reference sequence + fprintf(samtools_stderr,"[%s] Skipping because %"PRIhts_pos" is outside of %"PRIhts_pos" [ref:%d]\n", + __func__, (int64_t) b->core.pos, ref_len, b->core.tid); + skip = 1; + continue; + } + } else { + has_ref = 0; + } + + skip = 0; + if (has_ref && (ma->conf->flag&MPLP_REALN)) sam_prob_realn(b, ref, ref_len, (ma->conf->flag & MPLP_REDO_BAQ)? 7 : 3); + if (has_ref && ma->conf->capQ_thres > 10) { + int q = sam_cap_mapq(b, ref, ref_len, ma->conf->capQ_thres); + if (q < 0) skip = 1; + else if (b->core.qual > q) b->core.qual = q; + } + if (b->core.qual < ma->conf->min_mq) skip = 1; + else if ((ma->conf->flag&MPLP_NO_ORPHAN) && (b->core.flag&BAM_FPAIRED) && !(b->core.flag&BAM_FPROPER_PAIR)) skip = 1; + } while (skip); + return ret; +} + +/* + * Performs pileup + * @param conf configuration for this pileup + * @param n number of files specified in fn + * @param fn filenames + * @param fn_idx index filenames + */ +static int mpileup(mplp_conf_t *conf, int n, char **fn, char **fn_idx) +{ + mplp_aux_t **data; + int i, tid, *n_plp, tid0 = 0, max_depth; + hts_pos_t pos, beg0 = 0, end0 = HTS_POS_MAX, ref_len; + const bam_pileup1_t **plp; + mplp_ref_t mp_ref = MPLP_REF_INIT; + bam_mplp_t iter; + sam_hdr_t *h = NULL; /* header of first file in input list */ + char *ref; + FILE *pileup_fp = NULL; + + bam_sample_t *sm = NULL; + kstring_t buf; + mplp_pileup_t gplp; + + memset(&gplp, 0, sizeof(mplp_pileup_t)); + memset(&buf, 0, sizeof(kstring_t)); + data = calloc(n, sizeof(mplp_aux_t*)); + plp = calloc(n, sizeof(bam_pileup1_t*)); + n_plp = calloc(n, sizeof(int)); + sm = bam_smpl_init(); + + if (n == 0) { + fprintf(samtools_stderr,"[%s] no input file/data given\n", __func__); + samtools_exit(EXIT_FAILURE); + } + + // read the header of each file in the list and initialize data + refs_t *refs = NULL; + for (i = 0; i < n; ++i) { + sam_hdr_t *h_tmp; + data[i] = calloc(1, sizeof(mplp_aux_t)); + data[i]->fp = sam_open_format(fn[i], "rb", &conf->ga.in); + if ( !data[i]->fp ) + { + fprintf(samtools_stderr, "[%s] failed to open %s: %s\n", __func__, fn[i], strerror(errno)); + samtools_exit(EXIT_FAILURE); + } + if (hts_set_opt(data[i]->fp, CRAM_OPT_DECODE_MD, 0)) { + fprintf(samtools_stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + samtools_exit(EXIT_FAILURE); + } + + if (!refs && conf->fai_fname) { + if (hts_set_fai_filename(data[i]->fp, conf->fai_fname) != 0) { + fprintf(samtools_stderr, "[%s] failed to process %s: %s\n", + __func__, conf->fai_fname, strerror(errno)); + samtools_exit(EXIT_FAILURE); + } + refs = cram_get_refs(data[i]->fp); + } else if (conf->fai_fname) { + if (hts_set_opt(data[i]->fp, CRAM_OPT_SHARED_REF, refs) != 0) { + fprintf(samtools_stderr, "[%s] failed to process %s: %s\n", + __func__, conf->fai_fname, strerror(errno)); + samtools_exit(EXIT_FAILURE); + } + } + + data[i]->conf = conf; + data[i]->ref = &mp_ref; + h_tmp = sam_hdr_read(data[i]->fp); + if ( !h_tmp ) { + fprintf(samtools_stderr,"[%s] fail to read the header of %s\n", __func__, fn[i]); + samtools_exit(EXIT_FAILURE); + } + bam_smpl_add(sm, fn[i], (conf->flag&MPLP_IGNORE_RG)? 0 : sam_hdr_str(h_tmp)); + if (conf->reg) { + hts_idx_t *idx = NULL; + // If index filename has not been specfied, look in BAM folder + if (fn_idx != NULL) { + idx = sam_index_load2(data[i]->fp, fn[i], fn_idx[i]); + } else { + idx = sam_index_load(data[i]->fp, fn[i]); + } + + if (idx == NULL) { + fprintf(samtools_stderr, "[%s] fail to load index for %s\n", __func__, fn[i]); + samtools_exit(EXIT_FAILURE); + } + if ( (data[i]->iter=sam_itr_querys(idx, h_tmp, conf->reg)) == 0) { + fprintf(samtools_stderr, "[E::%s] fail to parse region '%s' with %s\n", __func__, conf->reg, fn[i]); + samtools_exit(EXIT_FAILURE); + } + if (i == 0) beg0 = data[i]->iter->beg, end0 = data[i]->iter->end, tid0 = data[i]->iter->tid; + hts_idx_destroy(idx); + } + else + data[i]->iter = NULL; + + if (i == 0) h = data[i]->h = h_tmp; // save the header of the first file + else { + // FIXME: check consistency between h and h_tmp + sam_hdr_destroy(h_tmp); + + // we store only the first file's header; it's (alleged to be) + // compatible with the i-th file's target_name lookup needs + data[i]->h = h; + } + } + fprintf(samtools_stderr, "[%s] %d samples in %d input files\n", __func__, sm->n, n); + + pileup_fp = conf->output_fname? fopen(conf->output_fname, "w") : samtools_stdout; + + if (pileup_fp == NULL) { + fprintf(samtools_stderr, "[%s] failed to write to %s: %s\n", __func__, conf->output_fname, strerror(errno)); + samtools_exit(EXIT_FAILURE); + } + + // init pileup + iter = bam_mplp_init(n, mplp_func, (void**)data); + if (conf->flag & MPLP_PRINT_MODS) { + bam_mplp_constructor(iter, pileup_cd_create); + bam_mplp_destructor(iter, pileup_cd_destroy); + } + if ( conf->flag & MPLP_SMART_OVERLAPS ) bam_mplp_init_overlaps(iter); + if ( !conf->max_depth ) { + max_depth = INT_MAX; + fprintf(samtools_stderr, "[%s] Max depth set to maximum value (%d)\n", __func__, INT_MAX); + } else { + max_depth = conf->max_depth; + if ( max_depth * n > 1<<20 ) + fprintf(samtools_stderr, "[%s] Combined max depth is above 1M. Potential memory hog!\n", __func__); + } + + + bam_mplp_set_maxcnt(iter, max_depth); + int ret; + int last_tid = -1; + hts_pos_t last_pos = -1; + + // begin pileup + while ( (ret=bam_mplp64_auto(iter, &tid, &pos, n_plp, plp)) > 0) { + if (conf->reg && (pos < beg0 || pos >= end0)) continue; // out of the region requested + mplp_get_ref(data[0], tid, &ref, &ref_len); + //printf("tid=%d len=%d ref=%p/%s\n", tid, ref_len, ref, ref); + if (conf->all) { + // Deal with missing portions of previous tids + while (tid > last_tid) { + if (last_tid >= 0 && !conf->reg) { + while (++last_pos < sam_hdr_tid2len(h, last_tid)) { + if (conf->bed && bed_overlap(conf->bed, sam_hdr_tid2name(h, last_tid), last_pos, last_pos + 1) == 0) + continue; + print_empty_pileup(pileup_fp, conf, sam_hdr_tid2name(h, last_tid), last_pos, n, ref, ref_len); + } + } + last_tid++; + last_pos = -1; + if (conf->all < 2) + break; + } + } + if (conf->all) { + // Deal with missing portion of current tid + while (++last_pos < pos) { + if (conf->reg && last_pos < beg0) continue; // out of range; skip + if (conf->bed && bed_overlap(conf->bed, sam_hdr_tid2name(h, tid), last_pos, last_pos + 1) == 0) + continue; + print_empty_pileup(pileup_fp, conf, sam_hdr_tid2name(h, tid), last_pos, n, ref, ref_len); + } + last_tid = tid; + last_pos = pos; + } + if (conf->bed && tid >= 0 && !bed_overlap(conf->bed, sam_hdr_tid2name(h, tid), pos, pos+1)) continue; + + fprintf(pileup_fp, "%s\t%"PRIhts_pos"\t%c", sam_hdr_tid2name(h, tid), pos + 1, (ref && pos < ref_len)? ref[pos] : 'N'); + for (i = 0; i < n; ++i) { + int j, cnt; + for (j = cnt = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = plp[i] + j; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if (c >= conf->min_baseQ) ++cnt; + } + fprintf(pileup_fp, "\t%d\t", cnt); + if (n_plp[i] == 0) { + fputs("*\t*", pileup_fp); + int flag_value = MPLP_PRINT_MAPQ_CHAR; + while(flag_value < MPLP_PRINT_LAST) { + if (flag_value != MPLP_PRINT_MODS + && (conf->flag & flag_value)) + fputs("\t*", pileup_fp); + flag_value <<= 1; + } + if (conf->auxlist) { + int t = 0; + while(t++ < ((klist_t(auxlist) *)conf->auxlist)->size) + fputs("\t*", pileup_fp); + } + } else { + int n = 0; + kstring_t ks = KS_INITIALIZE; + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = plp[i] + j; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if (c >= conf->min_baseQ) { + n++; + if (pileup_seq(pileup_fp, plp[i] + j, pos, ref_len, + ref, &ks, conf->rev_del, + conf->no_ins, conf->no_ins_mods, + conf->no_del, conf->no_ends) < 0) { + ret = 1; + goto fail; + } + } + } + if (!n) putc('*', pileup_fp); + + /* Print base qualities */ + n = 0; + ks_free(&ks); + putc('\t', pileup_fp); + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = plp[i] + j; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if (c >= conf->min_baseQ) { + c = c + 33 < 126? c + 33 : 126; + putc(c, pileup_fp); + n++; + } + } + if (!n) putc('*', pileup_fp); + + /* Print selected columns */ + int flag_value = MPLP_PRINT_MAPQ_CHAR; + while(flag_value < MPLP_PRINT_LAST) { + if (flag_value != MPLP_PRINT_MODS + && (conf->flag & flag_value)) { + n = 0; + putc('\t', pileup_fp); + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = &plp[i][j]; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if ( c < conf->min_baseQ ) continue; + if (n > 0 && flag_value != MPLP_PRINT_MAPQ_CHAR) putc(',', pileup_fp); + n++; + + switch (flag_value) { + case MPLP_PRINT_MAPQ_CHAR: + c = p->b->core.qual + 33; + if (c > 126) c = 126; + putc(c, pileup_fp); + break; + case MPLP_PRINT_QPOS: + // query position in current orientation + fprintf(pileup_fp, "%d", p->qpos + 1); + break; + case MPLP_PRINT_QPOS5: { + // query position in 5' to 3' orientation + int pos5 = bam_is_rev(p->b) + ? p->b->core.l_qseq-p->qpos + p->is_del + : p->qpos + 1; + fprintf(pileup_fp, "%d", pos5); + break; + } + case MPLP_PRINT_QNAME: + fputs(bam_get_qname(p->b), pileup_fp); + break; + case MPLP_PRINT_FLAG: + fprintf(pileup_fp, "%d", p->b->core.flag); + break; + case MPLP_PRINT_RNAME: + if (p->b->core.tid >= 0) + fputs(sam_hdr_tid2name(h, p->b->core.tid), pileup_fp); + else + putc('*', pileup_fp); + break; + case MPLP_PRINT_POS: + fprintf(pileup_fp, "%"PRId64, (int64_t) p->b->core.pos + 1); + break; + case MPLP_PRINT_MAPQ: + fprintf(pileup_fp, "%d", p->b->core.qual); + break; + case MPLP_PRINT_RNEXT: + if (p->b->core.mtid >= 0) + fputs(sam_hdr_tid2name(h, p->b->core.mtid), pileup_fp); + else + putc('*', pileup_fp); + break; + case MPLP_PRINT_PNEXT: + fprintf(pileup_fp, "%"PRId64, (int64_t) p->b->core.mpos + 1); + break; + } + } + if (!n) putc('*', pileup_fp); + } + flag_value <<= 1; + } + + /* Print selected tags */ + klist_t(auxlist) *auxlist_p = ((klist_t(auxlist) *)conf->auxlist); + if (auxlist_p && auxlist_p->size) { + kliter_t(auxlist) *aux; + for (aux = kl_begin(auxlist_p); aux != kl_end(auxlist_p); aux = kl_next(aux)) { + n = 0; + putc('\t', pileup_fp); + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = &plp[i][j]; + int c = p->qpos < p->b->core.l_qseq + ? bam_get_qual(p->b)[p->qpos] + : 0; + if ( c < conf->min_baseQ ) continue; + + if (n > 0) putc(conf->sep, pileup_fp); + n++; + uint8_t* tag_u = bam_aux_get(p->b, kl_val(aux)); + if (!tag_u) { + putc(conf->empty , pileup_fp); + continue; + } + + int tag_supported = 0; + + /* Tag value is string */ + if (*tag_u == 'Z' || *tag_u == 'H') { + char *tag_s = bam_aux2Z(tag_u); + if (!tag_s) continue; + fputs(tag_s, pileup_fp); + tag_supported = 1; + } + + /* Tag value is integer */ + if (*tag_u == 'I' || *tag_u == 'i' || *tag_u == 'C' || *tag_u == 'c' || *tag_u == 'S' || *tag_u == 's') { + int64_t tag_i = bam_aux2i(tag_u); + fprintf(pileup_fp, "%" PRId64 "", tag_i); + tag_supported = 1; + } + + /* Tag value is float */ + if (*tag_u == 'd' || *tag_u == 'f') { + double tag_f = bam_aux2f(tag_u); + fprintf(pileup_fp, "%lf", tag_f); + tag_supported = 1; + } + + /* Tag value is character */ + if (*tag_u == 'A') { + char tag_c = bam_aux2A(tag_u); + putc(tag_c, pileup_fp); + tag_supported = 1; + } + + if (!tag_supported) putc('*', pileup_fp); + } + if (!n) putc('*', pileup_fp); + } + } + } + } + putc('\n', pileup_fp); + } + + if (ret < 0) { + print_error("mpileup", "error reading from input file"); + ret = EXIT_FAILURE; + goto fail; + } + + if (conf->all) { + // Handle terminating region + if (last_tid < 0 && conf->reg && conf->all > 1) { + last_tid = tid0; + last_pos = beg0-1; + mplp_get_ref(data[0], tid0, &ref, &ref_len); + } + while (last_tid >= 0 && last_tid < sam_hdr_nref(h)) { + while (++last_pos < sam_hdr_tid2len(h, last_tid)) { + if (last_pos >= end0) break; + if (conf->bed && bed_overlap(conf->bed, sam_hdr_tid2name(h, last_tid), last_pos, last_pos + 1) == 0) + continue; + print_empty_pileup(pileup_fp, conf, sam_hdr_tid2name(h, last_tid), last_pos, n, ref, ref_len); + } + last_tid++; + last_pos = -1; + if (conf->all < 2 || conf->reg) + break; + } + } + +fail: + // clean up + if (pileup_fp && conf->output_fname) fclose(pileup_fp); + bam_smpl_destroy(sm); free(buf.s); + for (i = 0; i < gplp.n; ++i) free(gplp.plp[i]); + free(gplp.plp); free(gplp.n_plp); free(gplp.m_plp); + bam_mplp_destroy(iter); + sam_hdr_destroy(h); + for (i = 0; i < n; ++i) { + sam_close(data[i]->fp); + if (data[i]->iter) hts_itr_destroy(data[i]->iter); + free(data[i]); + } + free(data); free(plp); free(n_plp); + free(mp_ref.ref[0]); + free(mp_ref.ref[1]); + return ret; +} + +static int is_url(const char *s) +{ + static const char uri_scheme_chars[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+.-"; + return s[strspn(s, uri_scheme_chars)] == ':'; +} + +#define MAX_PATH_LEN 1024 +int read_file_list(const char *file_list,int *n,char **argv[]) +{ + char buf[MAX_PATH_LEN]; + int len, nfiles = 0; + char **files = NULL; + struct stat sb; + + *n = 0; + *argv = NULL; + + FILE *fh = fopen(file_list,"r"); + if ( !fh ) + { + fprintf(samtools_stderr,"%s: %s\n", file_list,strerror(errno)); + return 1; + } + + files = calloc(nfiles,sizeof(char*)); + nfiles = 0; + while ( fgets(buf,MAX_PATH_LEN,fh) ) + { + // allow empty lines and trailing spaces + len = strlen(buf); + while ( len>0 && isspace(buf[len-1]) ) len--; + if ( !len ) continue; + + // check sanity of the file list + buf[len] = 0; + if (! (is_url(buf) || stat(buf, &sb) == 0)) + { + // no such file, check if it is safe to print its name + int i, safe_to_print = 1; + for (i=0; irflag_require); + char *tmp_filter = bam_flag2str(mplp->rflag_filter); + + // Display usage information, formatted for the standard 80 columns. + // (The unusual string formatting here aids the readability of this + // source code in 80 columns, to the extent that's possible.) + + fprintf(fp, +"\n" +"Usage: samtools mpileup [options] in1.bam [in2.bam [...]]\n" +"\n" +"Input options:\n" +" -6, --illumina1.3+ quality is in the Illumina-1.3+ encoding\n" +" -A, --count-orphans do not discard anomalous read pairs\n" +" -b, --bam-list FILE list of input BAM filenames, one per line\n" +" -B, --no-BAQ disable BAQ (per-Base Alignment Quality)\n" +" -C, --adjust-MQ INT adjust mapping quality; recommended:50, disable:0 [0]\n" +" -d, --max-depth INT max per-file depth; avoids excessive memory usage [%d]\n", mplp->max_depth); + fprintf(fp, +" -E, --redo-BAQ recalculate BAQ on the fly, ignore existing BQs\n" +" -f, --fasta-ref FILE faidx indexed reference sequence file\n" +" -G, --exclude-RG FILE exclude read groups listed in FILE\n" +" -l, --positions FILE skip unlisted positions (chr pos) or regions (BED)\n" +" -q, --min-MQ INT skip alignments with mapQ smaller than INT [%d]\n", mplp->min_mq); + fprintf(fp, +" -Q, --min-BQ INT skip bases with baseQ/BAQ smaller than INT [%d]\n", mplp->min_baseQ); + fprintf(fp, +" -r, --region REG region in which pileup is generated\n" +" -R, --ignore-RG ignore RG tags (one BAM = one sample)\n" +" --rf, --incl-flags STR|INT required flags: include reads with any of the mask bits set [%s]\n", tmp_require); + fprintf(fp, +" --ff, --excl-flags STR|INT filter flags: skip reads with any of the mask bits set\n" +" [%s]\n", tmp_filter); + fprintf(fp, +" -x, --ignore-overlaps-removal, --disable-overlap-removal\n" +" disable read-pair overlap detection and removal\n" +" -X, --customized-index use customized index files\n" // -X flag for index filename +"\n" +"Output options:\n" +" -o, --output FILE write output to FILE [standard output]\n" +" -O, --output-BP output base positions on reads, current orientation\n" +" --output-BP-5 output base positions on reads, 5' to 3' orientation\n" +" -M, --output-mods output base modifications\n" +" -s, --output-MQ output mapping quality\n" +" --output-QNAME output read names\n" +" --output-extra STR output extra read fields and read tag values\n" +" --output-sep CHAR set the separator character for tag lists [,]\n" +" --output-empty CHAR set the no value character for tag lists [*]\n" +" --no-output-ins skip insertion sequence after +NUM\n" +" Use twice for complete insertion removal\n" +" --no-output-ins-mods don't display base modifications within insertions\n" +" --no-output-del skip deletion sequence after -NUM\n" +" Use twice for complete deletion removal\n" +" --no-output-ends remove ^MQUAL and $ markup in sequence column\n" +" --reverse-del use '#' character for deletions on the reverse strand\n" +" -a output all positions (including zero depth)\n" +" -a -a (or -aa) output absolutely all positions, including unused ref. sequences\n" +"\n" +"Generic options:\n"); + sam_global_opt_help(fp, "-.--.--."); + + fprintf(fp, "\n" +"Note that using \"samtools mpileup\" to generate BCF or VCF files has been\n" +"removed. To output these formats, please use \"bcftools mpileup\" instead.\n"); + + free(tmp_require); + free(tmp_filter); +} + +int bam_mpileup(int argc, char *argv[]) +{ + int c; + const char *file_list = NULL; + char **fn = NULL; + int nfiles = 0, use_orphan = 0, has_index_file = 0; + mplp_conf_t mplp; + memset(&mplp, 0, sizeof(mplp_conf_t)); + mplp.min_baseQ = 13; + mplp.capQ_thres = 0; + mplp.max_depth = MPLP_MAX_DEPTH; + mplp.flag = MPLP_NO_ORPHAN | MPLP_REALN | MPLP_SMART_OVERLAPS; + mplp.argc = argc; mplp.argv = argv; + mplp.rflag_filter = BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP; + mplp.output_fname = NULL; + mplp.all = 0; + mplp.rev_del = 0; + mplp.sep = ','; + mplp.empty = '*'; + sam_global_args_init(&mplp.ga); + + static const struct option lopts[] = + { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '-'), + {"rf", required_argument, NULL, 1}, // require flag + {"ff", required_argument, NULL, 2}, // filter flag + {"incl-flags", required_argument, NULL, 1}, + {"excl-flags", required_argument, NULL, 2}, + {"output", required_argument, NULL, 3}, + {"output-QNAME", no_argument, NULL, 5}, + {"output-qname", no_argument, NULL, 5}, + {"illumina1.3+", no_argument, NULL, '6'}, + {"count-orphans", no_argument, NULL, 'A'}, + {"bam-list", required_argument, NULL, 'b'}, + {"no-BAQ", no_argument, NULL, 'B'}, + {"no-baq", no_argument, NULL, 'B'}, + {"adjust-MQ", required_argument, NULL, 'C'}, + {"adjust-mq", required_argument, NULL, 'C'}, + {"max-depth", required_argument, NULL, 'd'}, + {"redo-BAQ", no_argument, NULL, 'E'}, + {"redo-baq", no_argument, NULL, 'E'}, + {"fasta-ref", required_argument, NULL, 'f'}, + {"exclude-RG", required_argument, NULL, 'G'}, + {"exclude-rg", required_argument, NULL, 'G'}, + {"positions", required_argument, NULL, 'l'}, + {"region", required_argument, NULL, 'r'}, + {"ignore-RG", no_argument, NULL, 'R'}, + {"ignore-rg", no_argument, NULL, 'R'}, + {"min-MQ", required_argument, NULL, 'q'}, + {"min-mq", required_argument, NULL, 'q'}, + {"min-BQ", required_argument, NULL, 'Q'}, + {"min-bq", required_argument, NULL, 'Q'}, + // NB: old "--ignore-overlaps" auto-completes to this + {"ignore-overlaps-removal", no_argument, NULL, 'x'}, + {"disable-overlap-removal", no_argument, NULL, 'x'}, + {"output-mods", no_argument, NULL, 'M'}, + {"output-BP", no_argument, NULL, 'O'}, + {"output-bp", no_argument, NULL, 'O'}, + {"output-BP-5", no_argument, NULL, 14}, + {"output-bp-5", no_argument, NULL, 14}, + {"output-MQ", no_argument, NULL, 's'}, + {"output-mq", no_argument, NULL, 's'}, + {"ext-prob", required_argument, NULL, 'e'}, + {"gap-frac", required_argument, NULL, 'F'}, + {"tandem-qual", required_argument, NULL, 'h'}, + {"skip-indels", no_argument, NULL, 'I'}, + {"max-idepth", required_argument, NULL, 'L'}, + {"min-ireads ", required_argument, NULL, 'm'}, + {"per-sample-mF", no_argument, NULL, 'p'}, + {"per-sample-mf", no_argument, NULL, 'p'}, + {"platforms", required_argument, NULL, 'P'}, + {"customized-index", no_argument, NULL, 'X'}, + {"reverse-del", no_argument, NULL, 6}, + {"output-extra", required_argument, NULL, 7}, + {"output-sep", required_argument, NULL, 8}, + {"output-empty", required_argument, NULL, 9}, + {"no-output-ins", no_argument, NULL, 10}, + {"no-output-ins-mods", no_argument, NULL, 11}, + {"no-output-del", no_argument, NULL, 12}, + {"no-output-ends", no_argument, NULL, 13}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "Af:r:l:q:Q:RC:Bd:b:o:EG:6OsxXaM",lopts,NULL)) >= 0) { + switch (c) { + case 'x': mplp.flag &= ~MPLP_SMART_OVERLAPS; break; + case 1 : + mplp.rflag_require = bam_str2flag(optarg); + if ( mplp.rflag_require<0 ) { fprintf(samtools_stderr,"Could not parse --rf %s\n", optarg); return 1; } + break; + case 2 : + mplp.rflag_filter = bam_str2flag(optarg); + if ( mplp.rflag_filter<0 ) { fprintf(samtools_stderr,"Could not parse --ff %s\n", optarg); return 1; } + break; + case 3 : mplp.output_fname = optarg; break; + case 5 : mplp.flag |= MPLP_PRINT_QNAME; break; + case 6 : mplp.rev_del = 1; break; + case 7 : + if (build_auxlist(&mplp, optarg) != 0) { + fprintf(samtools_stderr,"Could not build aux list using '%s'\n", optarg); + return 1; + } + break; + case 8: mplp.sep = optarg[0]; break; + case 9: mplp.empty = optarg[0]; break; + case 10: mplp.no_ins++; break; + case 11: mplp.no_ins_mods = 1; break; + case 12: mplp.no_del++; break; + case 13: mplp.no_ends = 1; break; + case 'f': + mplp.fai = fai_load(optarg); + if (mplp.fai == NULL) return 1; + mplp.fai_fname = optarg; + break; + case 'd': mplp.max_depth = atoi(optarg); break; + case 'r': mplp.reg = strdup(optarg); break; + case 'l': + // In the original version the whole BAM was streamed which is inefficient + // with few BED intervals and big BAMs. Todo: devise a heuristic to determine + // best strategy, that is streaming or jumping. + mplp.bed = bed_read(optarg); + if (!mplp.bed) { print_error_errno("mpileup", "Could not read file \"%s\"", optarg); return 1; } + break; + case 'B': mplp.flag &= ~MPLP_REALN; break; + case 'X': has_index_file = 1; break; + case 'E': mplp.flag |= MPLP_REDO_BAQ; break; + case '6': mplp.flag |= MPLP_ILLUMINA13; break; + case 'R': mplp.flag |= MPLP_IGNORE_RG; break; + case 's': mplp.flag |= MPLP_PRINT_MAPQ_CHAR; break; + case 'O': mplp.flag |= MPLP_PRINT_QPOS; break; + case 14: mplp.flag |= MPLP_PRINT_QPOS5; break; + case 'M': mplp.flag |= MPLP_PRINT_MODS; break; + case 'C': mplp.capQ_thres = atoi(optarg); break; + case 'q': mplp.min_mq = atoi(optarg); break; + case 'Q': mplp.min_baseQ = atoi(optarg); break; + case 'b': file_list = optarg; break; + case 'o': mplp.output_fname = optarg; break; + case 'A': use_orphan = 1; break; + case 'G': { + FILE *fp_rg; + char buf[1024]; + mplp.rghash = khash_str2int_init(); + if ((fp_rg = fopen(optarg, "r")) == NULL) + fprintf(samtools_stderr, "[%s] Fail to open file %s. Continue anyway.\n", __func__, optarg); + while (!feof(fp_rg) && fscanf(fp_rg, "%s", buf) > 0) // this is not a good style, but forgive me... + khash_str2int_inc(mplp.rghash, strdup(buf)); + fclose(fp_rg); + } + break; + case 'a': mplp.all++; break; + default: + if (parse_sam_global_opt(c, optarg, lopts, &mplp.ga) == 0) break; + /* else fall-through */ + case '?': + print_usage(samtools_stderr, &mplp); + return 1; + } + } + if (!mplp.fai && mplp.ga.reference) { + mplp.fai_fname = mplp.ga.reference; + mplp.fai = fai_load(mplp.fai_fname); + if (mplp.fai == NULL) return 1; + } + + if ( !(mplp.flag&MPLP_REALN) && mplp.flag&MPLP_REDO_BAQ ) + { + fprintf(samtools_stderr,"Error: The -B option cannot be combined with -E\n"); + return 1; + } + if (use_orphan) mplp.flag &= ~MPLP_NO_ORPHAN; + if (argc == 1) + { + print_usage(samtools_stderr, &mplp); + return 1; + } + int ret; + if (file_list) { + if (has_index_file) { + fprintf(samtools_stderr,"Error: The -b option cannot be combined with -X\n"); // No customize index loc in file list mode + return 1; + } + if ( read_file_list(file_list,&nfiles,&fn) ) return 1; + ret = mpileup(&mplp,nfiles,fn,NULL); + for (c=0; c + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include + +/* File status flags (zero means OK). It's possible for more than one to be + * set on a single file. The final exit status is the bitwise-or of the + * status of all the files. */ +#define QC_FAIL_OPEN 2 +#define QC_NOT_SEQUENCE 4 +#define QC_BAD_HEADER 8 +#define QC_NO_EOF_BLOCK 16 +#define QC_FAIL_CLOSE 32 + +static void usage_quickcheck(FILE *write_to) +{ + fprintf(write_to, +"Usage: samtools quickcheck [options] [...]\n" +"Options:\n" +" -v verbose output (repeat for more verbosity)\n" +" -q suppress warning messages\n" +" -u unmapped input (do not require targets in header)\n" +"\n" +"Notes:\n" +"\n" +"1. By default quickcheck will emit a warning message if and only if a file\n" +" fails the checks, in which case the exit status is non-zero. Under normal\n" +" behaviour with valid data it will be silent and has a zero exit status.\n" +" The warning messages are purely for manual inspection and should not be \n" +" parsed by scripts.\n" +"\n" +"2. In order to use this command programmatically, you should check its exit\n" +" status. One way to use quickcheck might be as a check that all BAM files in\n" +" a directory are okay:\n" +"\n" +"\tsamtools quickcheck *.bam && echo 'all ok' \\\n" +"\t || echo 'fail!'\n" +"\n" +" The first level of verbosity lists only files that fail to stdout.\n" +" To obtain a parsable list of files that have failed, use this option:\n" +"\n" +"\tsamtools quickcheck -qv *.bam > bad_bams.fofn \\\n" +"\t && echo 'all ok' \\\n" +"\t || echo 'some files failed check, see bad_bams.fofn'\n" + ); +} + +#define QC_ERR(state, v, msg, arg1) \ + file_state |= (state); \ + if (!quiet || verbose >= (v)) fprintf(stderr, (msg), (arg1)) + +int main_quickcheck(int argc, char** argv) +{ + int verbose = 0, quiet = 0, unmapped = 0; + hts_verbose = 0; + + const char* optstring = "vqu"; + int opt; + while ((opt = getopt(argc, argv, optstring)) != -1) { + switch (opt) { + case 'u': + unmapped = 1; + break; + case 'v': + verbose++; + break; + case 'q': + quiet = 1; + break; + default: + usage_quickcheck(stderr); + return 1; + } + } + + argc -= optind; + argv += optind; + + if (argc < 1) { + usage_quickcheck(stdout); + return 1; + } + + if (verbose >= 2) { + fprintf(stderr, "verbosity set to %d\n", verbose); + } + + if (verbose >= 4) { + hts_verbose = 3; + } + + int ret = 0; + int i; + + for (i = 0; i < argc; i++) { + char* fn = argv[i]; + int file_state = 0; + + if (verbose >= 3) fprintf(stderr, "checking %s\n", fn); + + // attempt to open + htsFile *hts_fp = hts_open(fn, "r"); + if (hts_fp == NULL) { + QC_ERR(QC_FAIL_OPEN, 2, "%s could not be opened for reading.\n", fn); + } + else { + if (verbose >= 3) fprintf(stderr, "opened %s\n", fn); + // make sure we have sequence data + const htsFormat *fmt = hts_get_format(hts_fp); + if (fmt->category != sequence_data ) { + QC_ERR(QC_NOT_SEQUENCE, 2, "%s was not identified as sequence data.\n", fn); + } + else { + if (verbose >= 3) fprintf(stderr, "%s is sequence data\n", fn); + // check header + sam_hdr_t *header = sam_hdr_read(hts_fp); + if (header == NULL) { + QC_ERR(QC_BAD_HEADER, 2, "%s caused an error whilst reading its header.\n", fn); + } else { + if (!unmapped && sam_hdr_nref(header) <= 0) { + QC_ERR(QC_BAD_HEADER, 2, "%s had no targets in header.\n", fn); + } + else { + if (verbose >= 3) fprintf(stderr, "%s has %d targets in header.\n", fn, sam_hdr_nref(header)); + } + sam_hdr_destroy(header); + } + } + // check EOF on formats that support this + int ret; + if ((ret = hts_check_EOF(hts_fp)) < 0) { + QC_ERR(QC_NO_EOF_BLOCK, 2, "%s caused an error whilst checking for EOF block.\n", fn); + } + else { + switch (ret) { + case 0: + QC_ERR(QC_NO_EOF_BLOCK, 2, "%s was missing EOF block when one should be present.\n", fn); + break; + case 1: + if (verbose >= 3) fprintf(stderr, "%s has good EOF block.\n", fn); + break; + case 2: + if (verbose >= 3) fprintf(stderr, "%s cannot be checked for EOF block as it is not seekable.\n", fn); + break; + case 3: + if (verbose >= 3) fprintf(stderr, "%s cannot be checked for EOF block because its filetype does not contain one.\n", fn); + break; + } + } + + if (hts_close(hts_fp) < 0) { + QC_ERR(QC_FAIL_CLOSE, 2, "%s did not close cleanly.\n", fn); + } + } + + if (file_state > 0 && verbose >= 1) { + fprintf(stdout, "%s\n", fn); + } + ret |= file_state; + } + + return ret; +} diff --git a/samtools/bam_quickcheck.c.pysam.c b/samtools/bam_quickcheck.c.pysam.c new file mode 100644 index 0000000..15ea8f6 --- /dev/null +++ b/samtools/bam_quickcheck.c.pysam.c @@ -0,0 +1,192 @@ +#include "samtools.pysam.h" + +/* bam_quickcheck.c -- quickcheck subcommand. + + Copyright (C) 2015-2017 Genome Research Ltd. + + Author: Joshua C. Randall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include + +/* File status flags (zero means OK). It's possible for more than one to be + * set on a single file. The final exit status is the bitwise-or of the + * status of all the files. */ +#define QC_FAIL_OPEN 2 +#define QC_NOT_SEQUENCE 4 +#define QC_BAD_HEADER 8 +#define QC_NO_EOF_BLOCK 16 +#define QC_FAIL_CLOSE 32 + +static void usage_quickcheck(FILE *write_to) +{ + fprintf(write_to, +"Usage: samtools quickcheck [options] [...]\n" +"Options:\n" +" -v verbose output (repeat for more verbosity)\n" +" -q suppress warning messages\n" +" -u unmapped input (do not require targets in header)\n" +"\n" +"Notes:\n" +"\n" +"1. By default quickcheck will emit a warning message if and only if a file\n" +" fails the checks, in which case the exit status is non-zero. Under normal\n" +" behaviour with valid data it will be silent and has a zero exit status.\n" +" The warning messages are purely for manual inspection and should not be \n" +" parsed by scripts.\n" +"\n" +"2. In order to use this command programmatically, you should check its exit\n" +" status. One way to use quickcheck might be as a check that all BAM files in\n" +" a directory are okay:\n" +"\n" +"\tsamtools quickcheck *.bam && echo 'all ok' \\\n" +"\t || echo 'fail!'\n" +"\n" +" The first level of verbosity lists only files that fail to samtools_stdout.\n" +" To obtain a parsable list of files that have failed, use this option:\n" +"\n" +"\tsamtools quickcheck -qv *.bam > bad_bams.fofn \\\n" +"\t && echo 'all ok' \\\n" +"\t || echo 'some files failed check, see bad_bams.fofn'\n" + ); +} + +#define QC_ERR(state, v, msg, arg1) \ + file_state |= (state); \ + if (!quiet || verbose >= (v)) fprintf(samtools_stderr, (msg), (arg1)) + +int main_quickcheck(int argc, char** argv) +{ + int verbose = 0, quiet = 0, unmapped = 0; + hts_verbose = 0; + + const char* optstring = "vqu"; + int opt; + while ((opt = getopt(argc, argv, optstring)) != -1) { + switch (opt) { + case 'u': + unmapped = 1; + break; + case 'v': + verbose++; + break; + case 'q': + quiet = 1; + break; + default: + usage_quickcheck(samtools_stderr); + return 1; + } + } + + argc -= optind; + argv += optind; + + if (argc < 1) { + usage_quickcheck(samtools_stdout); + return 1; + } + + if (verbose >= 2) { + fprintf(samtools_stderr, "verbosity set to %d\n", verbose); + } + + if (verbose >= 4) { + hts_verbose = 3; + } + + int ret = 0; + int i; + + for (i = 0; i < argc; i++) { + char* fn = argv[i]; + int file_state = 0; + + if (verbose >= 3) fprintf(samtools_stderr, "checking %s\n", fn); + + // attempt to open + htsFile *hts_fp = hts_open(fn, "r"); + if (hts_fp == NULL) { + QC_ERR(QC_FAIL_OPEN, 2, "%s could not be opened for reading.\n", fn); + } + else { + if (verbose >= 3) fprintf(samtools_stderr, "opened %s\n", fn); + // make sure we have sequence data + const htsFormat *fmt = hts_get_format(hts_fp); + if (fmt->category != sequence_data ) { + QC_ERR(QC_NOT_SEQUENCE, 2, "%s was not identified as sequence data.\n", fn); + } + else { + if (verbose >= 3) fprintf(samtools_stderr, "%s is sequence data\n", fn); + // check header + sam_hdr_t *header = sam_hdr_read(hts_fp); + if (header == NULL) { + QC_ERR(QC_BAD_HEADER, 2, "%s caused an error whilst reading its header.\n", fn); + } else { + if (!unmapped && sam_hdr_nref(header) <= 0) { + QC_ERR(QC_BAD_HEADER, 2, "%s had no targets in header.\n", fn); + } + else { + if (verbose >= 3) fprintf(samtools_stderr, "%s has %d targets in header.\n", fn, sam_hdr_nref(header)); + } + sam_hdr_destroy(header); + } + } + // check EOF on formats that support this + int ret; + if ((ret = hts_check_EOF(hts_fp)) < 0) { + QC_ERR(QC_NO_EOF_BLOCK, 2, "%s caused an error whilst checking for EOF block.\n", fn); + } + else { + switch (ret) { + case 0: + QC_ERR(QC_NO_EOF_BLOCK, 2, "%s was missing EOF block when one should be present.\n", fn); + break; + case 1: + if (verbose >= 3) fprintf(samtools_stderr, "%s has good EOF block.\n", fn); + break; + case 2: + if (verbose >= 3) fprintf(samtools_stderr, "%s cannot be checked for EOF block as it is not seekable.\n", fn); + break; + case 3: + if (verbose >= 3) fprintf(samtools_stderr, "%s cannot be checked for EOF block because its filetype does not contain one.\n", fn); + break; + } + } + + if (hts_close(hts_fp) < 0) { + QC_ERR(QC_FAIL_CLOSE, 2, "%s did not close cleanly.\n", fn); + } + } + + if (file_state > 0 && verbose >= 1) { + fprintf(samtools_stdout, "%s\n", fn); + } + ret |= file_state; + } + + return ret; +} diff --git a/samtools/bam_reheader.c b/samtools/bam_reheader.c new file mode 100644 index 0000000..0ad308a --- /dev/null +++ b/samtools/bam_reheader.c @@ -0,0 +1,629 @@ +/* bam_reheader.c -- reheader subcommand. + + Copyright (C) 2010 Broad Institute. + Copyright (C) 2012-2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include + +#include "htslib/bgzf.h" +#include "htslib/sam.h" +#include "htslib/hfile.h" +#include "htslib/cram.h" +#include "samtools.h" + +#define BUF_SIZE 0x10000 + +/* + * Reads a file and outputs a new BAM file to fd with 'h' replaced as + * the header. No checks are made to the validity. + */ +int bam_reheader(BGZF *in, sam_hdr_t *h, int fd, + const char *arg_list, int no_pg, int skip_header) +{ + BGZF *fp = NULL; + ssize_t len; + uint8_t *buf = NULL; + sam_hdr_t *tmp; + if (!h) + return -1; + + if (in->is_write) return -1; + buf = malloc(BUF_SIZE); + if (!buf) { + fprintf(stderr, "Out of memory\n"); + return -1; + } + + if (!skip_header) { + if ((tmp = bam_hdr_read(in)) == NULL) { + fprintf(stderr, "Couldn't read header\n"); + goto fail; + } + sam_hdr_destroy(tmp); + } + + fp = bgzf_fdopen(fd, "w"); + if (!fp) { + print_error_errno("reheader", "Couldn't open output file"); + goto fail; + } + + if (!no_pg && sam_hdr_add_pg(h, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL) != 0) + goto fail; + + if (bam_hdr_write(fp, h) < 0) { + print_error_errno("reheader", "Couldn't write header"); + goto fail; + } + if (in->block_offset < in->block_length) { + if (bgzf_write(fp, (char *)in->uncompressed_block + in->block_offset, in->block_length - in->block_offset) < 0) goto write_fail; + if (bgzf_flush(fp) < 0) goto write_fail; + } + while ((len = bgzf_raw_read(in, buf, BUF_SIZE)) > 0) { + if (bgzf_raw_write(fp, buf, len) < 0) goto write_fail; + } + if (len < 0) { + fprintf(stderr, "[%s] Error reading input file\n", __func__); + goto fail; + } + free(buf); + fp->block_offset = in->block_offset = 0; + if (bgzf_close(fp) < 0) { + fprintf(stderr, "[%s] Error closing output file\n", __func__); + return -1; + } + return 0; + + write_fail: + print_error_errno("reheader", "Error writing to output file"); + fail: + bgzf_close(fp); + free(buf); + return -1; +} + +/* + * Reads a file and outputs a new CRAM file to stdout with 'h' + * replaced as the header. No checks are made to the validity. + * + * FIXME: error checking + */ +int cram_reheader(cram_fd *in, sam_hdr_t *h, const char *arg_list, int no_pg) +{ + htsFile *h_out = hts_open("-", "wc"); + cram_fd *out = h_out->fp.cram; + cram_container *c = NULL; + int ret = -1; + if (!h) + return ret; + + // Attempt to fill out a cram->refs[] array from @SQ headers + sam_hdr_t *cram_h = sam_hdr_dup(h); + if (!cram_h) + return -1; + cram_fd_set_header(out, cram_h); + if (!no_pg && sam_hdr_add_pg(cram_fd_get_header(out), "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto err; + + if (sam_hdr_write(h_out, cram_h) != 0) + goto err; + cram_set_option(out, CRAM_OPT_REFERENCE, NULL); + + while ((c = cram_read_container(in))) { + int32_t i, num_blocks = cram_container_get_num_blocks(c); + if (cram_write_container(out, c) != 0) + goto err; + + for (i = 0; i < num_blocks; i++) { + cram_block *blk = cram_read_block(in); + if (!blk || cram_write_block(out, blk) != 0) { + if (blk) cram_free_block(blk); + goto err; + } + cram_free_block(blk); + } + cram_free_container(c); + } + + ret = 0; + + err: + if (hts_close(h_out) != 0) + ret = -1; + + return ret; +} + + + +/* + * Reads a version 2 CRAM file and replaces the header in-place, + * provided the header is small enough to fit without growing the + * entire file. + * + * Version 2 format has an uncompressed SAM header with multiple nul + * termination bytes to permit inline header editing. + * + * Returns 0 on success; + * -1 on general failure; + * -2 on failure due to insufficient size + */ +int cram_reheader_inplace2(cram_fd *fd, sam_hdr_t *h, const char *arg_list, + int no_pg) +{ + cram_container *c = NULL; + cram_block *b = NULL; + sam_hdr_t *cram_h = NULL; + off_t start; + int ret = -1; + if (!h) + goto err; + + if (cram_major_vers(fd) < 2 || + cram_major_vers(fd) > 3) { + fprintf(stderr, "[%s] unsupported CRAM version %d\n", __func__, + cram_major_vers(fd)); + goto err; + } + + cram_h = sam_hdr_dup(h); + if (!cram_h) + goto err; + + if (!no_pg && sam_hdr_add_pg(cram_h, "samtools", "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto err; + + int header_len = sam_hdr_length(cram_h); + /* Fix M5 strings? Maybe out of scope for this tool */ + + // Load the existing header + if ((start = hseek(cram_fd_get_fp(fd), 26, SEEK_SET)) != 26) + goto err; + + if (!(c = cram_read_container(fd))) + goto err; + + // Version 2.1 has a single uncompressed block which is nul + // terminated with many nuls to permit growth. + // + // So load old block and keep all contents identical bar the + // header text itself + if (!(b = cram_read_block(fd))) + goto err; + + if (cram_block_get_uncomp_size(b) < header_len+4) { + fprintf(stderr, "New header will not fit. Use non-inplace version (%d > %d)\n", + header_len+4, cram_block_get_uncomp_size(b)); + ret = -2; + goto err; + } + + cram_block_set_offset(b, 0); // rewind block + int32_put_blk(b, header_len); + cram_block_append(b, (void *)sam_hdr_str(cram_h), header_len); + // Zero the remaining block + memset((char *)cram_block_get_data(b)+cram_block_get_offset(b), 0, + cram_block_get_uncomp_size(b) - cram_block_get_offset(b)); + // Make sure all sizes and byte-offsets are consistent after memset + cram_block_set_offset(b, cram_block_get_uncomp_size(b)); + cram_block_set_comp_size(b, cram_block_get_uncomp_size(b)); + + if (hseek(cram_fd_get_fp(fd), start, SEEK_SET) != start) + goto err; + + if (cram_write_container(fd, c) == -1) + goto err; + + if (cram_write_block(fd, b) == -1) + goto err; + + ret = 0; + err: + if (c) cram_free_container(c); + if (b) cram_free_block(b); + if (cram_h) sam_hdr_destroy(cram_h); + + return ret; +} + + +/* + * Reads a version 3 CRAM file and replaces the header in-place, + * provided the header is small enough to fit without growing the + * entire file. + * + * Version 3 format has a SAM header held as an (optionally) + * compressed block within the header container. Additional + * uncompressed blocks or simply unallocated space (the difference + * between total block sizes and the container size) are used to + * provide room for growth or contraction of the compressed header. + * + * Returns 0 on success; + * -1 on general failure; + * -2 on failure due to insufficient size + */ +int cram_reheader_inplace3(cram_fd *fd, sam_hdr_t *h, const char *arg_list, + int no_pg) +{ + cram_container *c = NULL; + cram_block *b = NULL; + sam_hdr_t *cram_h = NULL; + off_t start, sz, end; + int container_sz, max_container_sz; + char *buf = NULL; + int ret = -1; + if (!h) + goto err; + + if (cram_major_vers(fd) < 2 || + cram_major_vers(fd) > 3) { + fprintf(stderr, "[%s] unsupported CRAM version %d\n", __func__, + cram_major_vers(fd)); + goto err; + } + + cram_h = sam_hdr_dup(h); + if (!cram_h) + goto err; + + if (!no_pg && sam_hdr_add_pg(cram_h, "samtools", "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto err; + + int header_len = sam_hdr_length(cram_h); + /* Fix M5 strings? Maybe out of scope for this tool */ + + // Find current size of SAM header block + if ((start = hseek(cram_fd_get_fp(fd), 26, SEEK_SET)) != 26) + goto err; + + if (!(c = cram_read_container(fd))) + goto err; + + // +5 allows num_landmarks to increase from 0 to 1 (Cramtools) + max_container_sz = cram_container_size(c)+5; + + sz = htell(cram_fd_get_fp(fd)) + cram_container_get_length(c) - start; + end = htell(cram_fd_get_fp(fd)) + cram_container_get_length(c); + + // We force 1 block instead of (optionally) 2. C CRAM + // implementations for v3 were writing 1 compressed block followed + // by 1 uncompressed block. However this is tricky to deal with + // as changing block sizes can mean the block header also changes + // size due to itf8 and variable size integers. + // + // If we had 1 block, this doesn't change anything. + // If we had 2 blocks, the new container header will be smaller by + // 1+ bytes, requiring the cram_container_get_length(c) to be larger in value. + // However this is an int32 instead of itf8 so the container + // header structure stays the same size. This means we can always + // reduce the number of blocks without running into size problems. + cram_container_set_num_blocks(c, 1); + int32_t *landmark; + int32_t num_landmarks; + landmark = cram_container_get_landmarks(c, &num_landmarks); + if (num_landmarks && landmark) { + num_landmarks = 1; + landmark[0] = 0; + } else { + num_landmarks = 0; + } + cram_container_set_landmarks(c, num_landmarks, landmark); + + buf = malloc(max_container_sz); + container_sz = max_container_sz; + if (cram_store_container(fd, c, buf, &container_sz) != 0) + goto err; + + if (!buf) + goto err; + + // Proposed new length, but changing cram_container_get_length(c) may change the + // container_sz and thus the remainder (cram_container_get_length(c) itself). + cram_container_set_length(c, sz - container_sz); + + int old_container_sz = container_sz; + container_sz = max_container_sz; + if (cram_store_container(fd, c, buf, &container_sz) != 0) + goto err; + + if (old_container_sz != container_sz) { + fprintf(stderr, "Quirk of fate makes this troublesome! " + "Please use non-inplace version.\n"); + goto err; + } + + + + // Version 3.0 supports compressed header + b = cram_new_block(FILE_HEADER, 0); + int32_put_blk(b, header_len); + cram_block_append(b, (void *)sam_hdr_str(cram_h), header_len); + cram_block_update_size(b); + + cram_compress_block(fd, b, NULL, -1, 9); + + if (hseek(cram_fd_get_fp(fd), 26, SEEK_SET) != 26) + goto err; + + if (cram_block_size(b) > cram_container_get_length(c)) { + fprintf(stderr, "New header will not fit. Use non-inplace version" + " (%d > %d)\n", + (int)cram_block_size(b), cram_container_get_length(c)); + ret = -2; + goto err; + } + + if (cram_write_container(fd, c) == -1) + goto err; + + if (cram_write_block(fd, b) == -1) + goto err; + + // Blank out the remainder + int rsz = end - htell(cram_fd_get_fp(fd)); + assert(rsz >= 0); + if (rsz) { + char *rem = calloc(1, rsz); + ret = hwrite(cram_fd_get_fp(fd), rem, rsz) == rsz ? 0 : -1; + free(rem); + } + + err: + if (c) cram_free_container(c); + if (buf) free(buf); + if (b) cram_free_block(b); + if (cram_h) sam_hdr_destroy(cram_h); + + return ret; +} + +int cram_reheader_inplace(cram_fd *fd, sam_hdr_t *h, const char *arg_list, + int no_pg) +{ + switch (cram_major_vers(fd)) { + case 2: return cram_reheader_inplace2(fd, h, arg_list, no_pg); + case 3: return cram_reheader_inplace3(fd, h, arg_list, no_pg); + default: + fprintf(stderr, "[%s] unsupported CRAM version %d\n", __func__, + cram_major_vers(fd)); + return -1; + } +} + +static void usage(FILE *fp, int ret) { + fprintf(fp, + "Usage: samtools reheader [-P] in.header.sam in.bam > out.bam\n" + " or samtools reheader [-P] -i in.header.sam file.cram\n" + " or samtools reheader -c CMD in.bam\n" + " or samtools reheader -c CMD in.cram\n" + "\n" + "Options:\n" + " -P, --no-PG Do not generate a @PG header line.\n" + " -i, --in-place Modify the CRAM file directly, if possible.\n" + " (Defaults to outputting to stdout.)\n" + " -c, --command CMD Pass the header in SAM format to external program CMD.\n"); + exit(ret); +} + +static sam_hdr_t* external_reheader(samFile* in, const char* external) { + char *command = NULL; + sam_hdr_t* h = NULL; + sam_hdr_t* ih = sam_hdr_read(in); + if (ih == NULL) { + fprintf(stderr, "[%s] failed to read the header for '%s'.\n", __func__, in->fn); + return NULL; + } + char tmp_fn[] = "reheaderXXXXXX"; + int tmp_fd = mkstemp(tmp_fn); + if (tmp_fd < 0) { + print_error_errno("reheader", "fail to open temp file '%s'", tmp_fn); + return NULL; + } + hFILE* tmp_hf = hdopen(tmp_fd, "w"); + if (!tmp_hf) { + fprintf(stderr, "[%s] failed to convert to hFILE.\n", __func__); + goto cleanup; + } + samFile* tmp_sf = hts_hopen(tmp_hf, tmp_fn, "w"); + if (!tmp_sf) { + fprintf(stderr, "[%s] failed to convert to samFile.\n", __func__); + goto cleanup; + } + if (-1 == sam_hdr_write(tmp_sf, ih)) { + fprintf(stderr, "[%s] failed to write the header to the temp file.\n", __func__); + goto cleanup; + } + sam_close(tmp_sf); + sam_hdr_destroy(ih); + int comm_len = strlen(external) + strlen(tmp_fn) + 8; + command = calloc(comm_len, 1); + if (!command || snprintf(command, comm_len, "( %s ) < %s", external, tmp_fn) != comm_len - 1) { + fprintf(stderr, "[%s] failed to create command string.\n", __func__); + goto cleanup; + } + FILE* nh = popen(command, "r"); + if (!nh) { + print_error_errno("reheader", "[%s] failed to run external command '%s'.\n", __func__, command); + goto cleanup; + } + + int nh_fd = dup(fileno(nh)); + if (nh_fd < 0) { + fprintf(stderr, "[%s] failed to get the file descriptor.\n", __func__); + goto cleanup; + } + hFILE* nh_hf = hdopen(nh_fd, "r"); + if (!nh_hf) { + fprintf(stderr, "[%s] failed to convert to hFILE.\n", __func__); + goto cleanup; + } + samFile* nh_sf = hts_hopen(nh_hf, tmp_fn, "r"); + if (!nh_sf) { + fprintf(stderr, "[%s] failed to convert to samFile.\n", __func__); + goto cleanup; + } + + h = sam_hdr_read(nh_sf); + sam_close(nh_sf); + if (h == NULL) { + fprintf(stderr, "[%s] failed to read the header from the temp file.\n", __func__); + } + int res = pclose(nh); + if (res != 0) { + if (res < 0) { + print_error_errno("reheader", + "Error on closing pipe from command '%s'.\n", + command); + } else { + print_error("reheader", + "Non-zero exit code returned by command '%s'\n", + command); + } + if (h) sam_hdr_destroy(h); + h = NULL; + } +cleanup: + free(command); + if (unlink(tmp_fn) != 0) { + print_error_errno("reheader", "failed to remove the temp file '%s'", tmp_fn); + } + + return h; +} + +int main_reheader(int argc, char *argv[]) +{ + int inplace = 0, r, no_pg = 0, c, skip_header = 0; + sam_hdr_t *h; + samFile *in; + char *arg_list = NULL, *external = NULL; + + static const struct option lopts[] = { + {"help", no_argument, NULL, 'h'}, + {"in-place", no_argument, NULL, 'i'}, + {"no-PG", no_argument, NULL, 'P'}, + {"command", required_argument, NULL, 'c'}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "hiPc:", lopts, NULL)) >= 0) { + switch (c) { + case 'P': no_pg = 1; break; + case 'i': inplace = 1; break; + case 'c': external = optarg; break; + case 'h': usage(stdout, 0); break; + default: + fprintf(stderr, "Invalid option '%c'\n", c); + usage(stderr, 1); + } + } + + if ((argc - optind != 2 || external) && (argc - optind != 1 || !external)) + usage(stderr, 1); + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("reheader", "failed to create arg_list"); + return 1; + } + + if (external) { + skip_header = 1; + in = sam_open(argv[optind], inplace?"r+":"r"); + if (in == 0) { + print_error_errno("reheader", "fail to open file '%s'", argv[optind]); + return 1; + } + + h = external_reheader(in, external); + if (h == NULL) { + fprintf(stderr, "[%s] failed to read the header from '%s'.\n", __func__, external); + sam_close(in); + return 1; + } + } else { // read the header from a separate file + samFile *fph = sam_open(argv[optind], "r"); + if (fph == 0) { + print_error_errno("reheader", "fail to read the header from '%s'", argv[optind]); + return 1; + } + h = sam_hdr_read(fph); + sam_close(fph); + if (h == NULL) { + fprintf(stderr, "[%s] failed to read the header for '%s'.\n", + __func__, argv[1]); + return 1; + } + in = sam_open(argv[optind+1], inplace?"r+":"r"); + if (in == 0) { + print_error_errno("reheader", "fail to open file '%s'", argv[optind+1]); + return 1; + } + } + + if (hts_get_format(in)->format == bam) { + if (inplace) { + print_error("reheader", "cannot reheader BAM '%s' in-place", argv[optind+1]); + r = -1; + } else { + r = bam_reheader(in->fp.bgzf, h, fileno(stdout), arg_list, no_pg, skip_header); + } + } else if (hts_get_format(in)->format == cram) { + if (inplace) + r = cram_reheader_inplace(in->fp.cram, h, arg_list, no_pg); + else + r = cram_reheader(in->fp.cram, h, arg_list, no_pg); + } else { + print_error("reheader", "input file '%s' must be BAM or CRAM", argv[optind+1]); + r = -1; + } + + if (sam_close(in) != 0) + r = -1; + + sam_hdr_destroy(h); + + if (arg_list) + free(arg_list); + + return -r; +} diff --git a/samtools/bam_reheader.c.pysam.c b/samtools/bam_reheader.c.pysam.c new file mode 100644 index 0000000..22a6cd9 --- /dev/null +++ b/samtools/bam_reheader.c.pysam.c @@ -0,0 +1,631 @@ +#include "samtools.pysam.h" + +/* bam_reheader.c -- reheader subcommand. + + Copyright (C) 2010 Broad Institute. + Copyright (C) 2012-2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include + +#include "htslib/bgzf.h" +#include "htslib/sam.h" +#include "htslib/hfile.h" +#include "htslib/cram.h" +#include "samtools.h" + +#define BUF_SIZE 0x10000 + +/* + * Reads a file and outputs a new BAM file to fd with 'h' replaced as + * the header. No checks are made to the validity. + */ +int bam_reheader(BGZF *in, sam_hdr_t *h, int fd, + const char *arg_list, int no_pg, int skip_header) +{ + BGZF *fp = NULL; + ssize_t len; + uint8_t *buf = NULL; + sam_hdr_t *tmp; + if (!h) + return -1; + + if (in->is_write) return -1; + buf = malloc(BUF_SIZE); + if (!buf) { + fprintf(samtools_stderr, "Out of memory\n"); + return -1; + } + + if (!skip_header) { + if ((tmp = bam_hdr_read(in)) == NULL) { + fprintf(samtools_stderr, "Couldn't read header\n"); + goto fail; + } + sam_hdr_destroy(tmp); + } + + fp = bgzf_fdopen(fd, "w"); + if (!fp) { + print_error_errno("reheader", "Couldn't open output file"); + goto fail; + } + + if (!no_pg && sam_hdr_add_pg(h, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL) != 0) + goto fail; + + if (bam_hdr_write(fp, h) < 0) { + print_error_errno("reheader", "Couldn't write header"); + goto fail; + } + if (in->block_offset < in->block_length) { + if (bgzf_write(fp, (char *)in->uncompressed_block + in->block_offset, in->block_length - in->block_offset) < 0) goto write_fail; + if (bgzf_flush(fp) < 0) goto write_fail; + } + while ((len = bgzf_raw_read(in, buf, BUF_SIZE)) > 0) { + if (bgzf_raw_write(fp, buf, len) < 0) goto write_fail; + } + if (len < 0) { + fprintf(samtools_stderr, "[%s] Error reading input file\n", __func__); + goto fail; + } + free(buf); + fp->block_offset = in->block_offset = 0; + if (bgzf_close(fp) < 0) { + fprintf(samtools_stderr, "[%s] Error closing output file\n", __func__); + return -1; + } + return 0; + + write_fail: + print_error_errno("reheader", "Error writing to output file"); + fail: + bgzf_close(fp); + free(buf); + return -1; +} + +/* + * Reads a file and outputs a new CRAM file to samtools_stdout with 'h' + * replaced as the header. No checks are made to the validity. + * + * FIXME: error checking + */ +int cram_reheader(cram_fd *in, sam_hdr_t *h, const char *arg_list, int no_pg) +{ + htsFile *h_out = hts_open("-", "wc"); + cram_fd *out = h_out->fp.cram; + cram_container *c = NULL; + int ret = -1; + if (!h) + return ret; + + // Attempt to fill out a cram->refs[] array from @SQ headers + sam_hdr_t *cram_h = sam_hdr_dup(h); + if (!cram_h) + return -1; + cram_fd_set_header(out, cram_h); + if (!no_pg && sam_hdr_add_pg(cram_fd_get_header(out), "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto err; + + if (sam_hdr_write(h_out, cram_h) != 0) + goto err; + cram_set_option(out, CRAM_OPT_REFERENCE, NULL); + + while ((c = cram_read_container(in))) { + int32_t i, num_blocks = cram_container_get_num_blocks(c); + if (cram_write_container(out, c) != 0) + goto err; + + for (i = 0; i < num_blocks; i++) { + cram_block *blk = cram_read_block(in); + if (!blk || cram_write_block(out, blk) != 0) { + if (blk) cram_free_block(blk); + goto err; + } + cram_free_block(blk); + } + cram_free_container(c); + } + + ret = 0; + + err: + if (hts_close(h_out) != 0) + ret = -1; + + return ret; +} + + + +/* + * Reads a version 2 CRAM file and replaces the header in-place, + * provided the header is small enough to fit without growing the + * entire file. + * + * Version 2 format has an uncompressed SAM header with multiple nul + * termination bytes to permit inline header editing. + * + * Returns 0 on success; + * -1 on general failure; + * -2 on failure due to insufficient size + */ +int cram_reheader_inplace2(cram_fd *fd, sam_hdr_t *h, const char *arg_list, + int no_pg) +{ + cram_container *c = NULL; + cram_block *b = NULL; + sam_hdr_t *cram_h = NULL; + off_t start; + int ret = -1; + if (!h) + goto err; + + if (cram_major_vers(fd) < 2 || + cram_major_vers(fd) > 3) { + fprintf(samtools_stderr, "[%s] unsupported CRAM version %d\n", __func__, + cram_major_vers(fd)); + goto err; + } + + cram_h = sam_hdr_dup(h); + if (!cram_h) + goto err; + + if (!no_pg && sam_hdr_add_pg(cram_h, "samtools", "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto err; + + int header_len = sam_hdr_length(cram_h); + /* Fix M5 strings? Maybe out of scope for this tool */ + + // Load the existing header + if ((start = hseek(cram_fd_get_fp(fd), 26, SEEK_SET)) != 26) + goto err; + + if (!(c = cram_read_container(fd))) + goto err; + + // Version 2.1 has a single uncompressed block which is nul + // terminated with many nuls to permit growth. + // + // So load old block and keep all contents identical bar the + // header text itself + if (!(b = cram_read_block(fd))) + goto err; + + if (cram_block_get_uncomp_size(b) < header_len+4) { + fprintf(samtools_stderr, "New header will not fit. Use non-inplace version (%d > %d)\n", + header_len+4, cram_block_get_uncomp_size(b)); + ret = -2; + goto err; + } + + cram_block_set_offset(b, 0); // rewind block + int32_put_blk(b, header_len); + cram_block_append(b, (void *)sam_hdr_str(cram_h), header_len); + // Zero the remaining block + memset((char *)cram_block_get_data(b)+cram_block_get_offset(b), 0, + cram_block_get_uncomp_size(b) - cram_block_get_offset(b)); + // Make sure all sizes and byte-offsets are consistent after memset + cram_block_set_offset(b, cram_block_get_uncomp_size(b)); + cram_block_set_comp_size(b, cram_block_get_uncomp_size(b)); + + if (hseek(cram_fd_get_fp(fd), start, SEEK_SET) != start) + goto err; + + if (cram_write_container(fd, c) == -1) + goto err; + + if (cram_write_block(fd, b) == -1) + goto err; + + ret = 0; + err: + if (c) cram_free_container(c); + if (b) cram_free_block(b); + if (cram_h) sam_hdr_destroy(cram_h); + + return ret; +} + + +/* + * Reads a version 3 CRAM file and replaces the header in-place, + * provided the header is small enough to fit without growing the + * entire file. + * + * Version 3 format has a SAM header held as an (optionally) + * compressed block within the header container. Additional + * uncompressed blocks or simply unallocated space (the difference + * between total block sizes and the container size) are used to + * provide room for growth or contraction of the compressed header. + * + * Returns 0 on success; + * -1 on general failure; + * -2 on failure due to insufficient size + */ +int cram_reheader_inplace3(cram_fd *fd, sam_hdr_t *h, const char *arg_list, + int no_pg) +{ + cram_container *c = NULL; + cram_block *b = NULL; + sam_hdr_t *cram_h = NULL; + off_t start, sz, end; + int container_sz, max_container_sz; + char *buf = NULL; + int ret = -1; + if (!h) + goto err; + + if (cram_major_vers(fd) < 2 || + cram_major_vers(fd) > 3) { + fprintf(samtools_stderr, "[%s] unsupported CRAM version %d\n", __func__, + cram_major_vers(fd)); + goto err; + } + + cram_h = sam_hdr_dup(h); + if (!cram_h) + goto err; + + if (!no_pg && sam_hdr_add_pg(cram_h, "samtools", "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) + goto err; + + int header_len = sam_hdr_length(cram_h); + /* Fix M5 strings? Maybe out of scope for this tool */ + + // Find current size of SAM header block + if ((start = hseek(cram_fd_get_fp(fd), 26, SEEK_SET)) != 26) + goto err; + + if (!(c = cram_read_container(fd))) + goto err; + + // +5 allows num_landmarks to increase from 0 to 1 (Cramtools) + max_container_sz = cram_container_size(c)+5; + + sz = htell(cram_fd_get_fp(fd)) + cram_container_get_length(c) - start; + end = htell(cram_fd_get_fp(fd)) + cram_container_get_length(c); + + // We force 1 block instead of (optionally) 2. C CRAM + // implementations for v3 were writing 1 compressed block followed + // by 1 uncompressed block. However this is tricky to deal with + // as changing block sizes can mean the block header also changes + // size due to itf8 and variable size integers. + // + // If we had 1 block, this doesn't change anything. + // If we had 2 blocks, the new container header will be smaller by + // 1+ bytes, requiring the cram_container_get_length(c) to be larger in value. + // However this is an int32 instead of itf8 so the container + // header structure stays the same size. This means we can always + // reduce the number of blocks without running into size problems. + cram_container_set_num_blocks(c, 1); + int32_t *landmark; + int32_t num_landmarks; + landmark = cram_container_get_landmarks(c, &num_landmarks); + if (num_landmarks && landmark) { + num_landmarks = 1; + landmark[0] = 0; + } else { + num_landmarks = 0; + } + cram_container_set_landmarks(c, num_landmarks, landmark); + + buf = malloc(max_container_sz); + container_sz = max_container_sz; + if (cram_store_container(fd, c, buf, &container_sz) != 0) + goto err; + + if (!buf) + goto err; + + // Proposed new length, but changing cram_container_get_length(c) may change the + // container_sz and thus the remainder (cram_container_get_length(c) itself). + cram_container_set_length(c, sz - container_sz); + + int old_container_sz = container_sz; + container_sz = max_container_sz; + if (cram_store_container(fd, c, buf, &container_sz) != 0) + goto err; + + if (old_container_sz != container_sz) { + fprintf(samtools_stderr, "Quirk of fate makes this troublesome! " + "Please use non-inplace version.\n"); + goto err; + } + + + + // Version 3.0 supports compressed header + b = cram_new_block(FILE_HEADER, 0); + int32_put_blk(b, header_len); + cram_block_append(b, (void *)sam_hdr_str(cram_h), header_len); + cram_block_update_size(b); + + cram_compress_block(fd, b, NULL, -1, 9); + + if (hseek(cram_fd_get_fp(fd), 26, SEEK_SET) != 26) + goto err; + + if (cram_block_size(b) > cram_container_get_length(c)) { + fprintf(samtools_stderr, "New header will not fit. Use non-inplace version" + " (%d > %d)\n", + (int)cram_block_size(b), cram_container_get_length(c)); + ret = -2; + goto err; + } + + if (cram_write_container(fd, c) == -1) + goto err; + + if (cram_write_block(fd, b) == -1) + goto err; + + // Blank out the remainder + int rsz = end - htell(cram_fd_get_fp(fd)); + assert(rsz >= 0); + if (rsz) { + char *rem = calloc(1, rsz); + ret = hwrite(cram_fd_get_fp(fd), rem, rsz) == rsz ? 0 : -1; + free(rem); + } + + err: + if (c) cram_free_container(c); + if (buf) free(buf); + if (b) cram_free_block(b); + if (cram_h) sam_hdr_destroy(cram_h); + + return ret; +} + +int cram_reheader_inplace(cram_fd *fd, sam_hdr_t *h, const char *arg_list, + int no_pg) +{ + switch (cram_major_vers(fd)) { + case 2: return cram_reheader_inplace2(fd, h, arg_list, no_pg); + case 3: return cram_reheader_inplace3(fd, h, arg_list, no_pg); + default: + fprintf(samtools_stderr, "[%s] unsupported CRAM version %d\n", __func__, + cram_major_vers(fd)); + return -1; + } +} + +static void usage(FILE *fp, int ret) { + fprintf(fp, + "Usage: samtools reheader [-P] in.header.sam in.bam > out.bam\n" + " or samtools reheader [-P] -i in.header.sam file.cram\n" + " or samtools reheader -c CMD in.bam\n" + " or samtools reheader -c CMD in.cram\n" + "\n" + "Options:\n" + " -P, --no-PG Do not generate a @PG header line.\n" + " -i, --in-place Modify the CRAM file directly, if possible.\n" + " (Defaults to outputting to samtools_stdout.)\n" + " -c, --command CMD Pass the header in SAM format to external program CMD.\n"); + samtools_exit(ret); +} + +static sam_hdr_t* external_reheader(samFile* in, const char* external) { + char *command = NULL; + sam_hdr_t* h = NULL; + sam_hdr_t* ih = sam_hdr_read(in); + if (ih == NULL) { + fprintf(samtools_stderr, "[%s] failed to read the header for '%s'.\n", __func__, in->fn); + return NULL; + } + char tmp_fn[] = "reheaderXXXXXX"; + int tmp_fd = mkstemp(tmp_fn); + if (tmp_fd < 0) { + print_error_errno("reheader", "fail to open temp file '%s'", tmp_fn); + return NULL; + } + hFILE* tmp_hf = hdopen(tmp_fd, "w"); + if (!tmp_hf) { + fprintf(samtools_stderr, "[%s] failed to convert to hFILE.\n", __func__); + goto cleanup; + } + samFile* tmp_sf = hts_hopen(tmp_hf, tmp_fn, "w"); + if (!tmp_sf) { + fprintf(samtools_stderr, "[%s] failed to convert to samFile.\n", __func__); + goto cleanup; + } + if (-1 == sam_hdr_write(tmp_sf, ih)) { + fprintf(samtools_stderr, "[%s] failed to write the header to the temp file.\n", __func__); + goto cleanup; + } + sam_close(tmp_sf); + sam_hdr_destroy(ih); + int comm_len = strlen(external) + strlen(tmp_fn) + 8; + command = calloc(comm_len, 1); + if (!command || snprintf(command, comm_len, "( %s ) < %s", external, tmp_fn) != comm_len - 1) { + fprintf(samtools_stderr, "[%s] failed to create command string.\n", __func__); + goto cleanup; + } + FILE* nh = popen(command, "r"); + if (!nh) { + print_error_errno("reheader", "[%s] failed to run external command '%s'.\n", __func__, command); + goto cleanup; + } + + int nh_fd = dup(fileno(nh)); + if (nh_fd < 0) { + fprintf(samtools_stderr, "[%s] failed to get the file descriptor.\n", __func__); + goto cleanup; + } + hFILE* nh_hf = hdopen(nh_fd, "r"); + if (!nh_hf) { + fprintf(samtools_stderr, "[%s] failed to convert to hFILE.\n", __func__); + goto cleanup; + } + samFile* nh_sf = hts_hopen(nh_hf, tmp_fn, "r"); + if (!nh_sf) { + fprintf(samtools_stderr, "[%s] failed to convert to samFile.\n", __func__); + goto cleanup; + } + + h = sam_hdr_read(nh_sf); + sam_close(nh_sf); + if (h == NULL) { + fprintf(samtools_stderr, "[%s] failed to read the header from the temp file.\n", __func__); + } + int res = pclose(nh); + if (res != 0) { + if (res < 0) { + print_error_errno("reheader", + "Error on closing pipe from command '%s'.\n", + command); + } else { + print_error("reheader", + "Non-zero exit code returned by command '%s'\n", + command); + } + if (h) sam_hdr_destroy(h); + h = NULL; + } +cleanup: + free(command); + if (unlink(tmp_fn) != 0) { + print_error_errno("reheader", "failed to remove the temp file '%s'", tmp_fn); + } + + return h; +} + +int main_reheader(int argc, char *argv[]) +{ + int inplace = 0, r, no_pg = 0, c, skip_header = 0; + sam_hdr_t *h; + samFile *in; + char *arg_list = NULL, *external = NULL; + + static const struct option lopts[] = { + {"help", no_argument, NULL, 'h'}, + {"in-place", no_argument, NULL, 'i'}, + {"no-PG", no_argument, NULL, 'P'}, + {"command", required_argument, NULL, 'c'}, + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "hiPc:", lopts, NULL)) >= 0) { + switch (c) { + case 'P': no_pg = 1; break; + case 'i': inplace = 1; break; + case 'c': external = optarg; break; + case 'h': usage(samtools_stdout, 0); break; + default: + fprintf(samtools_stderr, "Invalid option '%c'\n", c); + usage(samtools_stderr, 1); + } + } + + if ((argc - optind != 2 || external) && (argc - optind != 1 || !external)) + usage(samtools_stderr, 1); + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("reheader", "failed to create arg_list"); + return 1; + } + + if (external) { + skip_header = 1; + in = sam_open(argv[optind], inplace?"r+":"r"); + if (in == 0) { + print_error_errno("reheader", "fail to open file '%s'", argv[optind]); + return 1; + } + + h = external_reheader(in, external); + if (h == NULL) { + fprintf(samtools_stderr, "[%s] failed to read the header from '%s'.\n", __func__, external); + sam_close(in); + return 1; + } + } else { // read the header from a separate file + samFile *fph = sam_open(argv[optind], "r"); + if (fph == 0) { + print_error_errno("reheader", "fail to read the header from '%s'", argv[optind]); + return 1; + } + h = sam_hdr_read(fph); + sam_close(fph); + if (h == NULL) { + fprintf(samtools_stderr, "[%s] failed to read the header for '%s'.\n", + __func__, argv[1]); + return 1; + } + in = sam_open(argv[optind+1], inplace?"r+":"r"); + if (in == 0) { + print_error_errno("reheader", "fail to open file '%s'", argv[optind+1]); + return 1; + } + } + + if (hts_get_format(in)->format == bam) { + if (inplace) { + print_error("reheader", "cannot reheader BAM '%s' in-place", argv[optind+1]); + r = -1; + } else { + r = bam_reheader(in->fp.bgzf, h, fileno(samtools_stdout), arg_list, no_pg, skip_header); + } + } else if (hts_get_format(in)->format == cram) { + if (inplace) + r = cram_reheader_inplace(in->fp.cram, h, arg_list, no_pg); + else + r = cram_reheader(in->fp.cram, h, arg_list, no_pg); + } else { + print_error("reheader", "input file '%s' must be BAM or CRAM", argv[optind+1]); + r = -1; + } + + if (sam_close(in) != 0) + r = -1; + + sam_hdr_destroy(h); + + if (arg_list) + free(arg_list); + + return -r; +} diff --git a/samtools/bam_rmdup.c b/samtools/bam_rmdup.c new file mode 100644 index 0000000..293a140 --- /dev/null +++ b/samtools/bam_rmdup.c @@ -0,0 +1,325 @@ +/* bam_rmdup.c -- duplicate read detection. + + Copyright (C) 2009, 2015, 2016, 2019 Genome Research Ltd. + Portions copyright (C) 2009 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include "htslib/sam.h" +#include "sam_opts.h" +#include "samtools.h" +#include "bam.h" // for bam_get_library + +typedef bam1_t *bam1_p; + +#include "htslib/khash.h" +KHASH_SET_INIT_STR(name) +KHASH_MAP_INIT_INT64(pos, bam1_p) + +#define BUFFER_SIZE 0x40000 + +typedef struct { + uint64_t n_checked, n_removed; + khash_t(pos) *best_hash; +} lib_aux_t; +KHASH_MAP_INIT_STR(lib, lib_aux_t) + +typedef struct { + int n, max; + bam1_t **a; +} tmp_stack_t; + +static inline void stack_insert(tmp_stack_t *stack, bam1_t *b) +{ + if (stack->n == stack->max) { + stack->max = stack->max? stack->max<<1 : 0x10000; + stack->a = (bam1_t**)realloc(stack->a, sizeof(bam1_t*) * stack->max); + } + stack->a[stack->n++] = b; +} + +static inline int dump_best(tmp_stack_t *stack, samFile *out, sam_hdr_t *hdr) +{ + int i; + for (i = 0; i != stack->n; ++i) { + if (sam_write1(out, hdr, stack->a[i]) < 0) return -1; + bam_destroy1(stack->a[i]); + stack->a[i] = NULL; + } + stack->n = 0; + return 0; +} + +static inline void clear_stack(tmp_stack_t *stack) { + int i; + if (!stack->a) return; + for (i = 0; i != stack->n; ++i) { + bam_destroy1(stack->a[i]); + } +} + +static void clear_del_set(khash_t(name) *del_set) +{ + khint_t k; + for (k = kh_begin(del_set); k < kh_end(del_set); ++k) + if (kh_exist(del_set, k)) + free((char*)kh_key(del_set, k)); + kh_clear(name, del_set); +} + +static lib_aux_t *get_aux(khash_t(lib) *aux, const char *lib) +{ + khint_t k = kh_get(lib, aux, lib); + if (k == kh_end(aux)) { + int ret; + char *p = strdup(lib); + lib_aux_t *q; + k = kh_put(lib, aux, p, &ret); + q = &kh_val(aux, k); + q->n_checked = q->n_removed = 0; + q->best_hash = kh_init(pos); + return q; + } else return &kh_val(aux, k); +} + +static void clear_best(khash_t(lib) *aux, int max) +{ + khint_t k; + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + if (kh_size(q->best_hash) >= max) + kh_clear(pos, q->best_hash); + } + } +} + +static inline int sum_qual(const bam1_t *b) +{ + int i, q; + uint8_t *qual = bam_get_qual(b); + for (i = q = 0; i < b->core.l_qseq; ++i) q += qual[i]; + return q; +} + +int bam_rmdup_core(samFile *in, sam_hdr_t *hdr, samFile *out) +{ + bam1_t *b = NULL; + int last_tid = -1, last_pos = -1, r; + tmp_stack_t stack; + khint_t k; + khash_t(lib) *aux = NULL; + khash_t(name) *del_set = NULL; + + memset(&stack, 0, sizeof(tmp_stack_t)); + aux = kh_init(lib); + del_set = kh_init(name); + b = bam_init1(); + if (!aux || !del_set || !b) { + perror(__func__); + goto fail; + } + + kh_resize(name, del_set, 4 * BUFFER_SIZE); + while ((r = sam_read1(in, hdr, b)) >= 0) { + bam1_core_t *c = &b->core; + if (c->tid != last_tid || last_pos != c->pos) { + if (dump_best(&stack, out, hdr) < 0) goto write_fail; // write the result + clear_best(aux, BUFFER_SIZE); + if (c->tid != last_tid) { + clear_best(aux, 0); + if (kh_size(del_set)) { // check + fprintf(stderr, "[bam_rmdup_core] %llu unmatched pairs\n", (long long)kh_size(del_set)); + clear_del_set(del_set); + } + if ((int)c->tid == -1) { // append unmapped reads + if (sam_write1(out, hdr, b) < 0) goto write_fail; + while ((r = sam_read1(in, hdr, b)) >= 0) { + if (sam_write1(out, hdr, b) < 0) goto write_fail; + } + break; + } + last_tid = c->tid; + fprintf(stderr, "[bam_rmdup_core] processing reference %s...\n", sam_hdr_tid2name(hdr, c->tid)); + } + } + if (!(c->flag&BAM_FPAIRED) || (c->flag&(BAM_FUNMAP|BAM_FMUNMAP)) || (c->mtid >= 0 && c->tid != c->mtid)) { + if (sam_write1(out, hdr, b) < 0) goto write_fail; + } else if (c->isize > 0) { // paired, head + uint64_t key = (uint64_t)c->pos<<32 | c->isize; + const char *lib; + lib_aux_t *q; + int ret; + lib = bam_get_library(hdr, b); + q = lib? get_aux(aux, lib) : get_aux(aux, "\t"); + ++q->n_checked; + k = kh_put(pos, q->best_hash, key, &ret); + if (ret < 0) goto fail; + if (ret == 0) { // found in best_hash + bam1_t *p = kh_val(q->best_hash, k); + ++q->n_removed; + if (sum_qual(p) < sum_qual(b)) { // the current alignment is better; this can be accelerated in principle + kh_put(name, del_set, strdup(bam_get_qname(p)), &ret); // p will be removed + if (ret < 0) goto fail; + if (bam_copy1(p, b) == NULL) goto fail; // replaced as b + } else kh_put(name, del_set, strdup(bam_get_qname(b)), &ret); // b will be removed + if (ret < 0) goto fail; + if (ret == 0) + fprintf(stderr, "[bam_rmdup_core] inconsistent BAM file for pair '%s'. Continue anyway.\n", bam_get_qname(b)); + } else { // not found in best_hash + kh_val(q->best_hash, k) = bam_dup1(b); + stack_insert(&stack, kh_val(q->best_hash, k)); + } + } else { // paired, tail + k = kh_get(name, del_set, bam_get_qname(b)); + if (k != kh_end(del_set)) { + free((char*)kh_key(del_set, k)); + kh_del(name, del_set, k); + } else { + if (sam_write1(out, hdr, b) < 0) goto write_fail; + } + } + last_pos = c->pos; + } + if (r < -1) { + fprintf(stderr, "[%s] failed to read input file\n", __func__); + goto fail; + } + + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + if (dump_best(&stack, out, hdr) < 0) goto write_fail; + fprintf(stderr, "[bam_rmdup_core] %lld / %lld = %.4lf in library '%s'\n", (long long)q->n_removed, + (long long)q->n_checked, (double)q->n_removed/q->n_checked, kh_key(aux, k)); + kh_destroy(pos, q->best_hash); + free((char*)kh_key(aux, k)); + kh_del(lib, aux, k); + } + } + kh_destroy(lib, aux); + + clear_del_set(del_set); + kh_destroy(name, del_set); + free(stack.a); + bam_destroy1(b); + return 0; + + write_fail: + print_error_errno("rmdup", "failed to write record"); + fail: + clear_stack(&stack); + free(stack.a); + if (aux) { + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + kh_destroy(pos, q->best_hash); + free((char*)kh_key(aux, k)); + } + } + kh_destroy(lib, aux); + } + if (del_set) { + clear_del_set(del_set); + kh_destroy(name, del_set); + } + bam_destroy1(b); + return 1; +} + +int bam_rmdupse_core(samFile *in, sam_hdr_t *hdr, samFile *out, int force_se); + +static int rmdup_usage(void) { + fprintf(stderr, "\n"); + fprintf(stderr, "Usage: samtools rmdup [-sS] \n\n"); + fprintf(stderr, "Option: -s rmdup for SE reads\n"); + fprintf(stderr, " -S treat PE reads as SE in rmdup (force -s)\n"); + + sam_global_opt_help(stderr, "-....--."); + return 1; +} + +int bam_rmdup(int argc, char *argv[]) +{ + int c, ret, is_se = 0, force_se = 0; + samFile *in, *out; + sam_hdr_t *header; + char wmode[3] = {'w', 'b', 0}; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0, '-'), + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "sS", lopts, NULL)) >= 0) { + switch (c) { + case 's': is_se = 1; break; + case 'S': force_se = is_se = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': return rmdup_usage(); + } + } + if (optind + 2 > argc) + return rmdup_usage(); + + in = sam_open_format(argv[optind], "r", &ga.in); + if (!in) { + print_error_errno("rmdup", "failed to open \"%s\" for input", argv[optind]); + return 1; + } + header = sam_hdr_read(in); + if (header == NULL || sam_hdr_nref(header) == 0) { + fprintf(stderr, "[bam_rmdup] input SAM does not have header. Abort!\n"); + return 1; + } + + sam_open_mode(wmode+1, argv[optind+1], NULL); + out = sam_open_format(argv[optind+1], wmode, &ga.out); + if (!out) { + print_error_errno("rmdup", "failed to open \"%s\" for output", argv[optind+1]); + return 1; + } + if (sam_hdr_write(out, header) < 0) { + print_error_errno("rmdup", "failed to write header"); + return 1; + } + + if (is_se) ret = bam_rmdupse_core(in, header, out, force_se); + else ret = bam_rmdup_core(in, header, out); + + sam_hdr_destroy(header); + sam_close(in); + if (sam_close(out) < 0) { + fprintf(stderr, "[bam_rmdup] error closing output file\n"); + ret = 1; + } + return ret; +} diff --git a/samtools/bam_rmdup.c.pysam.c b/samtools/bam_rmdup.c.pysam.c new file mode 100644 index 0000000..a748e47 --- /dev/null +++ b/samtools/bam_rmdup.c.pysam.c @@ -0,0 +1,327 @@ +#include "samtools.pysam.h" + +/* bam_rmdup.c -- duplicate read detection. + + Copyright (C) 2009, 2015, 2016, 2019 Genome Research Ltd. + Portions copyright (C) 2009 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include "htslib/sam.h" +#include "sam_opts.h" +#include "samtools.h" +#include "bam.h" // for bam_get_library + +typedef bam1_t *bam1_p; + +#include "htslib/khash.h" +KHASH_SET_INIT_STR(name) +KHASH_MAP_INIT_INT64(pos, bam1_p) + +#define BUFFER_SIZE 0x40000 + +typedef struct { + uint64_t n_checked, n_removed; + khash_t(pos) *best_hash; +} lib_aux_t; +KHASH_MAP_INIT_STR(lib, lib_aux_t) + +typedef struct { + int n, max; + bam1_t **a; +} tmp_stack_t; + +static inline void stack_insert(tmp_stack_t *stack, bam1_t *b) +{ + if (stack->n == stack->max) { + stack->max = stack->max? stack->max<<1 : 0x10000; + stack->a = (bam1_t**)realloc(stack->a, sizeof(bam1_t*) * stack->max); + } + stack->a[stack->n++] = b; +} + +static inline int dump_best(tmp_stack_t *stack, samFile *out, sam_hdr_t *hdr) +{ + int i; + for (i = 0; i != stack->n; ++i) { + if (sam_write1(out, hdr, stack->a[i]) < 0) return -1; + bam_destroy1(stack->a[i]); + stack->a[i] = NULL; + } + stack->n = 0; + return 0; +} + +static inline void clear_stack(tmp_stack_t *stack) { + int i; + if (!stack->a) return; + for (i = 0; i != stack->n; ++i) { + bam_destroy1(stack->a[i]); + } +} + +static void clear_del_set(khash_t(name) *del_set) +{ + khint_t k; + for (k = kh_begin(del_set); k < kh_end(del_set); ++k) + if (kh_exist(del_set, k)) + free((char*)kh_key(del_set, k)); + kh_clear(name, del_set); +} + +static lib_aux_t *get_aux(khash_t(lib) *aux, const char *lib) +{ + khint_t k = kh_get(lib, aux, lib); + if (k == kh_end(aux)) { + int ret; + char *p = strdup(lib); + lib_aux_t *q; + k = kh_put(lib, aux, p, &ret); + q = &kh_val(aux, k); + q->n_checked = q->n_removed = 0; + q->best_hash = kh_init(pos); + return q; + } else return &kh_val(aux, k); +} + +static void clear_best(khash_t(lib) *aux, int max) +{ + khint_t k; + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + if (kh_size(q->best_hash) >= max) + kh_clear(pos, q->best_hash); + } + } +} + +static inline int sum_qual(const bam1_t *b) +{ + int i, q; + uint8_t *qual = bam_get_qual(b); + for (i = q = 0; i < b->core.l_qseq; ++i) q += qual[i]; + return q; +} + +int bam_rmdup_core(samFile *in, sam_hdr_t *hdr, samFile *out) +{ + bam1_t *b = NULL; + int last_tid = -1, last_pos = -1, r; + tmp_stack_t stack; + khint_t k; + khash_t(lib) *aux = NULL; + khash_t(name) *del_set = NULL; + + memset(&stack, 0, sizeof(tmp_stack_t)); + aux = kh_init(lib); + del_set = kh_init(name); + b = bam_init1(); + if (!aux || !del_set || !b) { + perror(__func__); + goto fail; + } + + kh_resize(name, del_set, 4 * BUFFER_SIZE); + while ((r = sam_read1(in, hdr, b)) >= 0) { + bam1_core_t *c = &b->core; + if (c->tid != last_tid || last_pos != c->pos) { + if (dump_best(&stack, out, hdr) < 0) goto write_fail; // write the result + clear_best(aux, BUFFER_SIZE); + if (c->tid != last_tid) { + clear_best(aux, 0); + if (kh_size(del_set)) { // check + fprintf(samtools_stderr, "[bam_rmdup_core] %llu unmatched pairs\n", (long long)kh_size(del_set)); + clear_del_set(del_set); + } + if ((int)c->tid == -1) { // append unmapped reads + if (sam_write1(out, hdr, b) < 0) goto write_fail; + while ((r = sam_read1(in, hdr, b)) >= 0) { + if (sam_write1(out, hdr, b) < 0) goto write_fail; + } + break; + } + last_tid = c->tid; + fprintf(samtools_stderr, "[bam_rmdup_core] processing reference %s...\n", sam_hdr_tid2name(hdr, c->tid)); + } + } + if (!(c->flag&BAM_FPAIRED) || (c->flag&(BAM_FUNMAP|BAM_FMUNMAP)) || (c->mtid >= 0 && c->tid != c->mtid)) { + if (sam_write1(out, hdr, b) < 0) goto write_fail; + } else if (c->isize > 0) { // paired, head + uint64_t key = (uint64_t)c->pos<<32 | c->isize; + const char *lib; + lib_aux_t *q; + int ret; + lib = bam_get_library(hdr, b); + q = lib? get_aux(aux, lib) : get_aux(aux, "\t"); + ++q->n_checked; + k = kh_put(pos, q->best_hash, key, &ret); + if (ret < 0) goto fail; + if (ret == 0) { // found in best_hash + bam1_t *p = kh_val(q->best_hash, k); + ++q->n_removed; + if (sum_qual(p) < sum_qual(b)) { // the current alignment is better; this can be accelerated in principle + kh_put(name, del_set, strdup(bam_get_qname(p)), &ret); // p will be removed + if (ret < 0) goto fail; + if (bam_copy1(p, b) == NULL) goto fail; // replaced as b + } else kh_put(name, del_set, strdup(bam_get_qname(b)), &ret); // b will be removed + if (ret < 0) goto fail; + if (ret == 0) + fprintf(samtools_stderr, "[bam_rmdup_core] inconsistent BAM file for pair '%s'. Continue anyway.\n", bam_get_qname(b)); + } else { // not found in best_hash + kh_val(q->best_hash, k) = bam_dup1(b); + stack_insert(&stack, kh_val(q->best_hash, k)); + } + } else { // paired, tail + k = kh_get(name, del_set, bam_get_qname(b)); + if (k != kh_end(del_set)) { + free((char*)kh_key(del_set, k)); + kh_del(name, del_set, k); + } else { + if (sam_write1(out, hdr, b) < 0) goto write_fail; + } + } + last_pos = c->pos; + } + if (r < -1) { + fprintf(samtools_stderr, "[%s] failed to read input file\n", __func__); + goto fail; + } + + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + if (dump_best(&stack, out, hdr) < 0) goto write_fail; + fprintf(samtools_stderr, "[bam_rmdup_core] %lld / %lld = %.4lf in library '%s'\n", (long long)q->n_removed, + (long long)q->n_checked, (double)q->n_removed/q->n_checked, kh_key(aux, k)); + kh_destroy(pos, q->best_hash); + free((char*)kh_key(aux, k)); + kh_del(lib, aux, k); + } + } + kh_destroy(lib, aux); + + clear_del_set(del_set); + kh_destroy(name, del_set); + free(stack.a); + bam_destroy1(b); + return 0; + + write_fail: + print_error_errno("rmdup", "failed to write record"); + fail: + clear_stack(&stack); + free(stack.a); + if (aux) { + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + kh_destroy(pos, q->best_hash); + free((char*)kh_key(aux, k)); + } + } + kh_destroy(lib, aux); + } + if (del_set) { + clear_del_set(del_set); + kh_destroy(name, del_set); + } + bam_destroy1(b); + return 1; +} + +int bam_rmdupse_core(samFile *in, sam_hdr_t *hdr, samFile *out, int force_se); + +static int rmdup_usage(void) { + fprintf(samtools_stderr, "\n"); + fprintf(samtools_stderr, "Usage: samtools rmdup [-sS] \n\n"); + fprintf(samtools_stderr, "Option: -s rmdup for SE reads\n"); + fprintf(samtools_stderr, " -S treat PE reads as SE in rmdup (force -s)\n"); + + sam_global_opt_help(samtools_stderr, "-....--."); + return 1; +} + +int bam_rmdup(int argc, char *argv[]) +{ + int c, ret, is_se = 0, force_se = 0; + samFile *in, *out; + sam_hdr_t *header; + char wmode[3] = {'w', 'b', 0}; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0, '-'), + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "sS", lopts, NULL)) >= 0) { + switch (c) { + case 's': is_se = 1; break; + case 'S': force_se = is_se = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': return rmdup_usage(); + } + } + if (optind + 2 > argc) + return rmdup_usage(); + + in = sam_open_format(argv[optind], "r", &ga.in); + if (!in) { + print_error_errno("rmdup", "failed to open \"%s\" for input", argv[optind]); + return 1; + } + header = sam_hdr_read(in); + if (header == NULL || sam_hdr_nref(header) == 0) { + fprintf(samtools_stderr, "[bam_rmdup] input SAM does not have header. Abort!\n"); + return 1; + } + + sam_open_mode(wmode+1, argv[optind+1], NULL); + out = sam_open_format(argv[optind+1], wmode, &ga.out); + if (!out) { + print_error_errno("rmdup", "failed to open \"%s\" for output", argv[optind+1]); + return 1; + } + if (sam_hdr_write(out, header) < 0) { + print_error_errno("rmdup", "failed to write header"); + return 1; + } + + if (is_se) ret = bam_rmdupse_core(in, header, out, force_se); + else ret = bam_rmdup_core(in, header, out); + + sam_hdr_destroy(header); + sam_close(in); + if (sam_close(out) < 0) { + fprintf(samtools_stderr, "[bam_rmdup] error closing output file\n"); + ret = 1; + } + return ret; +} diff --git a/samtools/bam_rmdupse.c b/samtools/bam_rmdupse.c new file mode 100644 index 0000000..1812136 --- /dev/null +++ b/samtools/bam_rmdupse.c @@ -0,0 +1,230 @@ +/* bam_rmdupse.c -- duplicate read detection for unpaired reads. + + Copyright (C) 2009, 2015, 2016, 2019 Genome Research Ltd. + Portions copyright (C) 2009 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include "bam.h" // for bam_get_library +#include "htslib/sam.h" +#include "htslib/khash.h" +#include "htslib/klist.h" +#include "samtools.h" + +#define QUEUE_CLEAR_SIZE 0x100000 +#define MAX_POS 0x7fffffff + +typedef struct { + int endpos; + uint32_t score:31, discarded:1; + bam1_t *b; +} elem_t, *elem_p; +#define __free_elem(p) bam_destroy1((p)->data.b) +KLIST_INIT(q, elem_t, __free_elem) +typedef klist_t(q) queue_t; + +KHASH_MAP_INIT_INT(best, elem_p) +typedef khash_t(best) besthash_t; + +typedef struct { + uint64_t n_checked, n_removed; + besthash_t *left, *rght; +} lib_aux_t; +KHASH_MAP_INIT_STR(lib, lib_aux_t) + +static lib_aux_t *get_aux(khash_t(lib) *aux, const char *lib) +{ + khint_t k = kh_get(lib, aux, lib); + if (k == kh_end(aux)) { + int ret; + char *p = strdup(lib); + lib_aux_t *q; + k = kh_put(lib, aux, p, &ret); + q = &kh_val(aux, k); + q->left = kh_init(best); + q->rght = kh_init(best); + q->n_checked = q->n_removed = 0; + return q; + } else return &kh_val(aux, k); +} + +static inline int sum_qual(const bam1_t *b) +{ + int i, q; + uint8_t *qual = bam_get_qual(b); + for (i = q = 0; i < b->core.l_qseq; ++i) q += qual[i]; + return q; +} + +static inline elem_t *push_queue(queue_t *queue, const bam1_t *b, int endpos, int score) +{ + elem_t *p = kl_pushp(q, queue); + p->discarded = 0; + p->endpos = endpos; p->score = score; + if (p->b == 0) p->b = bam_init1(); + if (!p->b) { perror(NULL); exit(EXIT_FAILURE); } + if (bam_copy1(p->b, b) == NULL) { perror(NULL); exit(EXIT_FAILURE); } + return p; +} + +static void clear_besthash(besthash_t *h, int32_t pos) +{ + khint_t k; + for (k = kh_begin(h); k != kh_end(h); ++k) + if (kh_exist(h, k) && kh_val(h, k)->endpos <= pos) + kh_del(best, h, k); +} + +static int dump_alignment(samFile *out, sam_hdr_t *hdr, + queue_t *queue, int32_t pos, khash_t(lib) *h) +{ + if (queue->size > QUEUE_CLEAR_SIZE || pos == MAX_POS) { + khint_t k; + while (1) { + elem_t *q; + if (queue->head == queue->tail) break; + q = &kl_val(queue->head); + if (q->discarded) { + q->b->l_data = 0; + kl_shift(q, queue, 0); + continue; + } + if ((q->b->core.flag&BAM_FREVERSE) && q->endpos > pos) break; + if (sam_write1(out, hdr, q->b) < 0) return -1; + q->b->l_data = 0; + kl_shift(q, queue, 0); + } + for (k = kh_begin(h); k != kh_end(h); ++k) { + if (kh_exist(h, k)) { + clear_besthash(kh_val(h, k).left, pos); + clear_besthash(kh_val(h, k).rght, pos); + } + } + } + return 0; +} + +int bam_rmdupse_core(samFile *in, sam_hdr_t *hdr, samFile *out, int force_se) +{ + bam1_t *b = NULL; + queue_t *queue = NULL; + khint_t k; + int last_tid = -2, r; + khash_t(lib) *aux = NULL; + + aux = kh_init(lib); + b = bam_init1(); + queue = kl_init(q); + if (!aux || !b || !queue) { + perror(__func__); + goto fail; + } + + while ((r = sam_read1(in, hdr, b)) >= 0) { + bam1_core_t *c = &b->core; + int endpos = bam_endpos(b); + int score = sum_qual(b); + + if (last_tid != c->tid) { + if (last_tid >= 0) { + if (dump_alignment(out, hdr, queue, MAX_POS, aux) < 0) + goto write_fail; + } + last_tid = c->tid; + } else { + if (dump_alignment(out, hdr, queue, c->pos, aux) < 0) + goto write_fail; + } + if ((c->flag&BAM_FUNMAP) || ((c->flag&BAM_FPAIRED) && !force_se)) { + push_queue(queue, b, endpos, score); + } else { + const char *lib; + lib_aux_t *q; + besthash_t *h; + uint32_t key; + int ret; + lib = bam_get_library(hdr, b); + q = lib? get_aux(aux, lib) : get_aux(aux, "\t"); + ++q->n_checked; + h = (c->flag&BAM_FREVERSE)? q->rght : q->left; + key = (c->flag&BAM_FREVERSE)? endpos : c->pos; + k = kh_put(best, h, key, &ret); + if (ret == 0) { // in the hash table + elem_t *p = kh_val(h, k); + ++q->n_removed; + if (p->score < score) { + if (c->flag&BAM_FREVERSE) { // mark "discarded" and push the queue + p->discarded = 1; + kh_val(h, k) = push_queue(queue, b, endpos, score); + } else { // replace + p->score = score; p->endpos = endpos; + if (bam_copy1(p->b, b) == NULL) { + perror(NULL); exit(EXIT_FAILURE); + } + } + } // otherwise, discard the alignment + } else kh_val(h, k) = push_queue(queue, b, endpos, score); + } + } + if (r < -1) { + fprintf(stderr, "[%s] error reading input file\n", __func__); + goto fail; + } + + if (dump_alignment(out, hdr, queue, MAX_POS, aux) < 0) goto write_fail; + + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + fprintf(stderr, "[bam_rmdupse_core] %lld / %lld = %.4lf in library '%s'\n", (long long)q->n_removed, + (long long)q->n_checked, (double)q->n_removed/q->n_checked, kh_key(aux, k)); + kh_destroy(best, q->left); kh_destroy(best, q->rght); + free((char*)kh_key(aux, k)); + kh_del(lib, aux, k); + } + } + kh_destroy(lib, aux); + bam_destroy1(b); + kl_destroy(q, queue); + return 0; + + write_fail: + print_error_errno("rmdup", "failed to write record"); + fail: + if (aux) { + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + kh_destroy(best, q->left); + kh_destroy(best, q->rght); + free((char*)kh_key(aux, k)); + } + } + kh_destroy(lib, aux); + } + bam_destroy1(b); + kl_destroy(q, queue); + return 1; +} diff --git a/samtools/bam_rmdupse.c.pysam.c b/samtools/bam_rmdupse.c.pysam.c new file mode 100644 index 0000000..65689d7 --- /dev/null +++ b/samtools/bam_rmdupse.c.pysam.c @@ -0,0 +1,232 @@ +#include "samtools.pysam.h" + +/* bam_rmdupse.c -- duplicate read detection for unpaired reads. + + Copyright (C) 2009, 2015, 2016, 2019 Genome Research Ltd. + Portions copyright (C) 2009 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include "bam.h" // for bam_get_library +#include "htslib/sam.h" +#include "htslib/khash.h" +#include "htslib/klist.h" +#include "samtools.h" + +#define QUEUE_CLEAR_SIZE 0x100000 +#define MAX_POS 0x7fffffff + +typedef struct { + int endpos; + uint32_t score:31, discarded:1; + bam1_t *b; +} elem_t, *elem_p; +#define __free_elem(p) bam_destroy1((p)->data.b) +KLIST_INIT(q, elem_t, __free_elem) +typedef klist_t(q) queue_t; + +KHASH_MAP_INIT_INT(best, elem_p) +typedef khash_t(best) besthash_t; + +typedef struct { + uint64_t n_checked, n_removed; + besthash_t *left, *rght; +} lib_aux_t; +KHASH_MAP_INIT_STR(lib, lib_aux_t) + +static lib_aux_t *get_aux(khash_t(lib) *aux, const char *lib) +{ + khint_t k = kh_get(lib, aux, lib); + if (k == kh_end(aux)) { + int ret; + char *p = strdup(lib); + lib_aux_t *q; + k = kh_put(lib, aux, p, &ret); + q = &kh_val(aux, k); + q->left = kh_init(best); + q->rght = kh_init(best); + q->n_checked = q->n_removed = 0; + return q; + } else return &kh_val(aux, k); +} + +static inline int sum_qual(const bam1_t *b) +{ + int i, q; + uint8_t *qual = bam_get_qual(b); + for (i = q = 0; i < b->core.l_qseq; ++i) q += qual[i]; + return q; +} + +static inline elem_t *push_queue(queue_t *queue, const bam1_t *b, int endpos, int score) +{ + elem_t *p = kl_pushp(q, queue); + p->discarded = 0; + p->endpos = endpos; p->score = score; + if (p->b == 0) p->b = bam_init1(); + if (!p->b) { perror(NULL); samtools_exit(EXIT_FAILURE); } + if (bam_copy1(p->b, b) == NULL) { perror(NULL); samtools_exit(EXIT_FAILURE); } + return p; +} + +static void clear_besthash(besthash_t *h, int32_t pos) +{ + khint_t k; + for (k = kh_begin(h); k != kh_end(h); ++k) + if (kh_exist(h, k) && kh_val(h, k)->endpos <= pos) + kh_del(best, h, k); +} + +static int dump_alignment(samFile *out, sam_hdr_t *hdr, + queue_t *queue, int32_t pos, khash_t(lib) *h) +{ + if (queue->size > QUEUE_CLEAR_SIZE || pos == MAX_POS) { + khint_t k; + while (1) { + elem_t *q; + if (queue->head == queue->tail) break; + q = &kl_val(queue->head); + if (q->discarded) { + q->b->l_data = 0; + kl_shift(q, queue, 0); + continue; + } + if ((q->b->core.flag&BAM_FREVERSE) && q->endpos > pos) break; + if (sam_write1(out, hdr, q->b) < 0) return -1; + q->b->l_data = 0; + kl_shift(q, queue, 0); + } + for (k = kh_begin(h); k != kh_end(h); ++k) { + if (kh_exist(h, k)) { + clear_besthash(kh_val(h, k).left, pos); + clear_besthash(kh_val(h, k).rght, pos); + } + } + } + return 0; +} + +int bam_rmdupse_core(samFile *in, sam_hdr_t *hdr, samFile *out, int force_se) +{ + bam1_t *b = NULL; + queue_t *queue = NULL; + khint_t k; + int last_tid = -2, r; + khash_t(lib) *aux = NULL; + + aux = kh_init(lib); + b = bam_init1(); + queue = kl_init(q); + if (!aux || !b || !queue) { + perror(__func__); + goto fail; + } + + while ((r = sam_read1(in, hdr, b)) >= 0) { + bam1_core_t *c = &b->core; + int endpos = bam_endpos(b); + int score = sum_qual(b); + + if (last_tid != c->tid) { + if (last_tid >= 0) { + if (dump_alignment(out, hdr, queue, MAX_POS, aux) < 0) + goto write_fail; + } + last_tid = c->tid; + } else { + if (dump_alignment(out, hdr, queue, c->pos, aux) < 0) + goto write_fail; + } + if ((c->flag&BAM_FUNMAP) || ((c->flag&BAM_FPAIRED) && !force_se)) { + push_queue(queue, b, endpos, score); + } else { + const char *lib; + lib_aux_t *q; + besthash_t *h; + uint32_t key; + int ret; + lib = bam_get_library(hdr, b); + q = lib? get_aux(aux, lib) : get_aux(aux, "\t"); + ++q->n_checked; + h = (c->flag&BAM_FREVERSE)? q->rght : q->left; + key = (c->flag&BAM_FREVERSE)? endpos : c->pos; + k = kh_put(best, h, key, &ret); + if (ret == 0) { // in the hash table + elem_t *p = kh_val(h, k); + ++q->n_removed; + if (p->score < score) { + if (c->flag&BAM_FREVERSE) { // mark "discarded" and push the queue + p->discarded = 1; + kh_val(h, k) = push_queue(queue, b, endpos, score); + } else { // replace + p->score = score; p->endpos = endpos; + if (bam_copy1(p->b, b) == NULL) { + perror(NULL); samtools_exit(EXIT_FAILURE); + } + } + } // otherwise, discard the alignment + } else kh_val(h, k) = push_queue(queue, b, endpos, score); + } + } + if (r < -1) { + fprintf(samtools_stderr, "[%s] error reading input file\n", __func__); + goto fail; + } + + if (dump_alignment(out, hdr, queue, MAX_POS, aux) < 0) goto write_fail; + + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + fprintf(samtools_stderr, "[bam_rmdupse_core] %lld / %lld = %.4lf in library '%s'\n", (long long)q->n_removed, + (long long)q->n_checked, (double)q->n_removed/q->n_checked, kh_key(aux, k)); + kh_destroy(best, q->left); kh_destroy(best, q->rght); + free((char*)kh_key(aux, k)); + kh_del(lib, aux, k); + } + } + kh_destroy(lib, aux); + bam_destroy1(b); + kl_destroy(q, queue); + return 0; + + write_fail: + print_error_errno("rmdup", "failed to write record"); + fail: + if (aux) { + for (k = kh_begin(aux); k != kh_end(aux); ++k) { + if (kh_exist(aux, k)) { + lib_aux_t *q = &kh_val(aux, k); + kh_destroy(best, q->left); + kh_destroy(best, q->rght); + free((char*)kh_key(aux, k)); + } + } + kh_destroy(lib, aux); + } + bam_destroy1(b); + kl_destroy(q, queue); + return 1; +} diff --git a/samtools/bam_samples.c b/samtools/bam_samples.c new file mode 100644 index 0000000..f72ca6e --- /dev/null +++ b/samtools/bam_samples.c @@ -0,0 +1,433 @@ +/* bam_samples -- print samples in a set of BAM files + + Copyright (C) 2021 Pierre Lindenbaum + Institut du Thorax. u1087 Nantes. France. + @yokofakun + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +KHASH_MAP_INIT_STR(sm, int) + +/** and chained struct containing the faidx and the fasta filename + will be compared with the @SQ lines in the SAM header + */ +typedef struct FaidxPath { + /** path to reference */ + char* filename; + /** fasta index */ + faidx_t* faidx; + struct FaidxPath* next; +} FaidxPath; + +/** program parameters */ +typedef struct Params { + /** output stream */ + FILE* out; + /** tag in @RG line. default is "SM" */ + char tag[3]; + /** first faidx/path in chained list */ + FaidxPath* faidx; + /** show whether the bam is indexed */ + int test_index; +} Params; + +/** print usage */ +static void usage_samples(FILE *write_to) { + fprintf(write_to, + "Usage: samtools samples [options] [...]\n" + " samtools samples [options] -X f1.bam f2.bam f1.bam.bai f2.bai \n" + " find dir1 dir2 -type f \\(-name \"*.bam\" -o -name \"*.cram\" \\) | samtools samples [options]\n" + " find dir1 dir2 -type f \\(-name \"*.bam\" -o -name \"*.bai\" \\) | sort | paste - - | samtools samples -X [options]\n" + "\n" + "Options:\n" + " -? print help and exit\n" + " -h add the columns header before printing the results\n" + " -i test if the file is indexed.\n" + " -T provide the sample tag name from the @RG line [SM].\n" + " -o output file [stdout].\n" + " -f load an indexed fasta file in the collection of references. Can be used multiple times.\n" + " -F read a file containing the paths to indexed fasta files. One path per line.\n" + " -X use a custom index file.\n" + "\n" + " Using -f or -F will add a column containing the path to the reference or \".\" if the reference was not found.\n" + "\n" + ); +} + + +/** loads fasta fai file into FaidxPath, add it to params->faidx */ +static int load_dictionary(struct Params* params, const char* filename) { + FaidxPath* head = params->faidx; + FaidxPath* ptr = (FaidxPath*)malloc(sizeof(FaidxPath)); + if (ptr == NULL) { + print_error_errno("samples", "Out of memory"); + return EXIT_FAILURE; + } + ptr->filename = strdup(filename); + if (ptr->filename == NULL) { + free(ptr); + print_error_errno("samples", "Out of memory"); + return EXIT_FAILURE; + } + ptr->faidx = fai_load(filename); + if (ptr->faidx == NULL) { + free(ptr->filename); + free(ptr); + print_error_errno("samples", "Cannot load index from \"%s\"", filename); + return EXIT_FAILURE; + } + /* insert at the beginning of the linked list */ + params->faidx = ptr; + ptr->next = head; + return EXIT_SUCCESS; +} + +/** load a faidx file and append it to params */ +static int load_dictionaries(Params* params, const char* filename) { + int ret; + htsFile* in; + int status = EXIT_SUCCESS; + + in = hts_open(filename, "r"); + if (in == NULL) { + print_error_errno("samples", "Cannot open \"%s\"", filename); + status = EXIT_FAILURE; + } else { + kstring_t ks = KS_INITIALIZE; + while ((ret = hts_getline(in, KS_SEP_LINE, &ks)) >= 0) { + if (load_dictionary(params, ks_str(&ks)) != EXIT_SUCCESS) { + status = EXIT_FAILURE; + break; + } + } + ks_free(&ks); + hts_close(in); + } + return status; +} + +/** print the sample information, search for a reference */ +static int print_sample( + Params* params, + sam_hdr_t *header, + int has_index, + const char* sample, + const char* fname) { + fputs(sample, params->out); + fputc('\t', params->out); + fputs(fname, params->out); + if (params->test_index) { + fprintf(params->out, "\t%c", has_index ? 'Y' : 'N'); + } + if (params->faidx != NULL) { + FaidxPath* ref = NULL; + FaidxPath* curr = params->faidx; + while (curr != NULL) { + /** check names and length are the same in the same order */ + if (faidx_nseq(curr->faidx) == header->n_targets) { + int i; + for (i = 0; i < faidx_nseq(curr->faidx); i++) { + /** check name is the same */ + if (strcmp(faidx_iseq(curr->faidx, i), header->target_name[i]) != 0) break; + /** check length is the same */ + if (faidx_seq_len(curr->faidx, faidx_iseq(curr->faidx, i)) != header->target_len[i]) break; + } + /* the ref was found */ + if (i == faidx_nseq(curr->faidx)) { + ref = curr; + break; + } + } + curr = curr->next; + } + fputc('\t', params->out); + if (ref == NULL) { + fputc('.', params->out); + } else { + fputs(curr->filename, params->out); + } + } + fputc('\n', params->out); + return 0; +} + +/** open a sam file. Search for all samples in the @RG lines */ +static int print_samples(Params* params, const char* fname, const char* baifname) { + samFile *in = 0; + sam_hdr_t *header = NULL; + int n_rg; + int status = EXIT_SUCCESS; + khash_t(sm) *sample_set = NULL; + khint_t k; + int count_samples = 0; + int has_index = 0; + + if ((sample_set = kh_init(sm)) == NULL) { + print_error("samples", "Failed to initialise sample hash"); + status = EXIT_FAILURE; + goto end_print; + } + + if ((in = sam_open_format(fname, "r", NULL)) == 0) { + print_error_errno("samples", "Failed to open \"%s\" for reading", fname); + status = EXIT_FAILURE; + goto end_print; + } + if ((header = sam_hdr_read(in)) == 0) { + print_error("samples", "Failed to read the header from \"%s\"", fname); + status = EXIT_FAILURE; + goto end_print; + } + + /* try to load index if required */ + if (params->test_index) { + hts_idx_t *bam_idx; + /* path to bam index was specified */ + if (baifname != NULL) { + bam_idx = sam_index_load3(in, fname, baifname, HTS_IDX_SILENT_FAIL); + } + /* get default index */ + else { + bam_idx = sam_index_load3(in, fname, NULL, HTS_IDX_SILENT_FAIL); + } + has_index = bam_idx != NULL; + if (bam_idx != NULL) hts_idx_destroy(bam_idx); + /* and we continue... we have tested the index file but we always test for the samples and the references */ + } + + /* get the RG lines */ + n_rg = sam_hdr_count_lines(header, "RG"); + if (n_rg > 0) { + int i, r, ret; + char* sample; + kstring_t sm_val = KS_INITIALIZE; + for (i = 0; i < n_rg; i++) { + r = sam_hdr_find_tag_pos(header, "RG", i, params->tag, &sm_val); + if (r < 0) continue; + k = kh_get(sm, sample_set, ks_str(&sm_val)); + if (k != kh_end(sample_set)) continue; + sample = strdup(ks_str(&sm_val)); + if (sample == NULL) { + print_error_errno("samples", "Out of memory"); + status = EXIT_FAILURE; + goto end_print; + } + kh_put(sm, sample_set, sample, &ret); + if (ret < 0) { + print_error("samples", "Failed to insert key '%s' into sample_set", sample); + free(sample); + status = EXIT_FAILURE; + goto end_print; + } + ++count_samples; + } + ks_free(&sm_val); + } + if (count_samples == 0) { + print_sample(params, header, has_index, ".", fname); + } else { + for (k = kh_begin(sample_set); k != kh_end(sample_set); ++k) { + if (kh_exist(sample_set, k)) { + char* sample = (char*)kh_key(sample_set, k); + print_sample(params, header, has_index, sample, fname); + } + } + } + +end_print: + if (sample_set != NULL) { + for (k = kh_begin(sample_set); k != kh_end(sample_set); ++k) { + if (kh_exist(sample_set, k)) { + char* sample = (char*)kh_key(sample_set, k); + free(sample); + } + } + kh_destroy(sm, sample_set); + } + if (header != NULL) sam_hdr_destroy(header); + if (in != NULL) sam_close(in); + + return status; +} + + +int main_samples(int argc, char** argv) { + int status = EXIT_SUCCESS; + int print_header = 0; + int has_index_file = 0; + Params params; + char* out_filename = NULL; + FaidxPath* fai; + + strcpy(params.tag, "SM"); + params.faidx = NULL; + params.test_index =0; + + int opt; + while ((opt = getopt_long(argc, argv, "?hiXo:f:F:T:", NULL, NULL)) != -1) { + switch (opt) { + case 'h': + print_header = 1; + break; + case 'o': + out_filename = optarg; + break; + case 'i': + params.test_index = 1; + break; + case 'f': + if (load_dictionary(¶ms, optarg) != EXIT_SUCCESS) { + return EXIT_FAILURE; + } + break; + case 'F': + if (load_dictionaries(¶ms, optarg) != EXIT_SUCCESS) { + return EXIT_FAILURE; + } + break; + case 'T': + if (strlen(optarg) != 2) { + print_error("samples", "Length of tag \"%s\" is not 2.", optarg); + return EXIT_FAILURE; + } + strcpy(params.tag, optarg); + break; + case '?': + usage_samples(stdout); + return EXIT_SUCCESS; + case 'X': + has_index_file = 1; + break; + default: + usage_samples(stderr); + return EXIT_FAILURE; + } + } + + /* if no file was provided and input is the terminal, print the usage and exit */ + if (argc == optind && isatty(STDIN_FILENO)) { + usage_samples(stderr); + return EXIT_FAILURE; + } + + if (out_filename != NULL) { + params.out = fopen(out_filename, "w"); + if (params.out == NULL) { + print_error_errno("samples", "Cannot open \"%s\" for writing", out_filename); + return EXIT_FAILURE; + } + } else { + params.out = stdout; + } + + if (print_header) { + fprintf(params.out, "#%s\tPATH", params.tag); + if (params.test_index) fprintf(params.out, "\tINDEX"); + if (params.faidx != NULL) fprintf(params.out, "\tREFERENCE"); + fprintf(params.out, "\n"); + } + + /* no file was provided, input is stdin, each line contains the path to a bam file */ + if (argc == optind) { + htsFile* fp = hts_open("-", "r"); + if (fp == NULL) { + print_error_errno("samples", "Cannot read from stdin"); + status = EXIT_FAILURE; + } else { + kstring_t ks = KS_INITIALIZE; + int ret; + while ((ret = hts_getline(fp, KS_SEP_LINE, &ks)) >= 0) { + char* bai_path = NULL; + if (has_index_file) { + /* bam path and bam index file are separated by a tab */ + char* tab = strchr(ks_str(&ks), '\t'); + if (tab == NULL || *(tab+1) == '\0') { + print_error_errno("samples", "Expected path-to-bam(tab)path-to-index but got \"%s\"", ks_str(&ks)); + status = EXIT_FAILURE; + break; + } + *tab=0; + bai_path = (tab + 1); + } + if (print_samples(¶ms, ks_str(&ks), bai_path) != EXIT_SUCCESS) { + status = EXIT_FAILURE; + break; + } + } + ks_free(&ks); + hts_close(fp); + } + } + /* loop over each file in argc/argv bam index provided */ + else if (has_index_file) { + /* calculate number of input BAM files */ + if ((argc - optind) % 2 != 0) { + print_error("samples","Odd number of filenames detected! Each BAM file should have an index file"); + status = EXIT_FAILURE; + } else { + int i; + int n = (argc - optind ) / 2; + for (i = 0; i < n; i++) { + if (print_samples(¶ms, argv[optind+i], argv[optind+i+n]) != EXIT_SUCCESS) { + status = EXIT_FAILURE; + break; + } + } + } + } else { + int i; + for (i = optind; i < argc; i++) { + if (print_samples(¶ms, argv[i], NULL) != EXIT_SUCCESS) { + status = EXIT_FAILURE; + break; + } + } + } + + fai = params.faidx; + while (fai != NULL) { + FaidxPath* next = fai -> next; + free(fai->filename); + fai_destroy(fai->faidx); + free(fai); + fai = next; + } + + if (fflush(params.out) != 0) { + print_error_errno("samples", "Cannot flush output"); + status = EXIT_FAILURE; + } + if (out_filename != NULL) { + fclose(params.out); + } + + return status; +} diff --git a/samtools/bam_samples.c.pysam.c b/samtools/bam_samples.c.pysam.c new file mode 100644 index 0000000..891f875 --- /dev/null +++ b/samtools/bam_samples.c.pysam.c @@ -0,0 +1,435 @@ +#include "samtools.pysam.h" + +/* bam_samples -- print samples in a set of BAM files + + Copyright (C) 2021 Pierre Lindenbaum + Institut du Thorax. u1087 Nantes. France. + @yokofakun + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +KHASH_MAP_INIT_STR(sm, int) + +/** and chained struct containing the faidx and the fasta filename + will be compared with the @SQ lines in the SAM header + */ +typedef struct FaidxPath { + /** path to reference */ + char* filename; + /** fasta index */ + faidx_t* faidx; + struct FaidxPath* next; +} FaidxPath; + +/** program parameters */ +typedef struct Params { + /** output stream */ + FILE* out; + /** tag in @RG line. default is "SM" */ + char tag[3]; + /** first faidx/path in chained list */ + FaidxPath* faidx; + /** show whether the bam is indexed */ + int test_index; +} Params; + +/** print usage */ +static void usage_samples(FILE *write_to) { + fprintf(write_to, + "Usage: samtools samples [options] [...]\n" + " samtools samples [options] -X f1.bam f2.bam f1.bam.bai f2.bai \n" + " find dir1 dir2 -type f \\(-name \"*.bam\" -o -name \"*.cram\" \\) | samtools samples [options]\n" + " find dir1 dir2 -type f \\(-name \"*.bam\" -o -name \"*.bai\" \\) | sort | paste - - | samtools samples -X [options]\n" + "\n" + "Options:\n" + " -? print help and exit\n" + " -h add the columns header before printing the results\n" + " -i test if the file is indexed.\n" + " -T provide the sample tag name from the @RG line [SM].\n" + " -o output file [samtools_stdout].\n" + " -f load an indexed fasta file in the collection of references. Can be used multiple times.\n" + " -F read a file containing the paths to indexed fasta files. One path per line.\n" + " -X use a custom index file.\n" + "\n" + " Using -f or -F will add a column containing the path to the reference or \".\" if the reference was not found.\n" + "\n" + ); +} + + +/** loads fasta fai file into FaidxPath, add it to params->faidx */ +static int load_dictionary(struct Params* params, const char* filename) { + FaidxPath* head = params->faidx; + FaidxPath* ptr = (FaidxPath*)malloc(sizeof(FaidxPath)); + if (ptr == NULL) { + print_error_errno("samples", "Out of memory"); + return EXIT_FAILURE; + } + ptr->filename = strdup(filename); + if (ptr->filename == NULL) { + free(ptr); + print_error_errno("samples", "Out of memory"); + return EXIT_FAILURE; + } + ptr->faidx = fai_load(filename); + if (ptr->faidx == NULL) { + free(ptr->filename); + free(ptr); + print_error_errno("samples", "Cannot load index from \"%s\"", filename); + return EXIT_FAILURE; + } + /* insert at the beginning of the linked list */ + params->faidx = ptr; + ptr->next = head; + return EXIT_SUCCESS; +} + +/** load a faidx file and append it to params */ +static int load_dictionaries(Params* params, const char* filename) { + int ret; + htsFile* in; + int status = EXIT_SUCCESS; + + in = hts_open(filename, "r"); + if (in == NULL) { + print_error_errno("samples", "Cannot open \"%s\"", filename); + status = EXIT_FAILURE; + } else { + kstring_t ks = KS_INITIALIZE; + while ((ret = hts_getline(in, KS_SEP_LINE, &ks)) >= 0) { + if (load_dictionary(params, ks_str(&ks)) != EXIT_SUCCESS) { + status = EXIT_FAILURE; + break; + } + } + ks_free(&ks); + hts_close(in); + } + return status; +} + +/** print the sample information, search for a reference */ +static int print_sample( + Params* params, + sam_hdr_t *header, + int has_index, + const char* sample, + const char* fname) { + fputs(sample, params->out); + fputc('\t', params->out); + fputs(fname, params->out); + if (params->test_index) { + fprintf(params->out, "\t%c", has_index ? 'Y' : 'N'); + } + if (params->faidx != NULL) { + FaidxPath* ref = NULL; + FaidxPath* curr = params->faidx; + while (curr != NULL) { + /** check names and length are the same in the same order */ + if (faidx_nseq(curr->faidx) == header->n_targets) { + int i; + for (i = 0; i < faidx_nseq(curr->faidx); i++) { + /** check name is the same */ + if (strcmp(faidx_iseq(curr->faidx, i), header->target_name[i]) != 0) break; + /** check length is the same */ + if (faidx_seq_len(curr->faidx, faidx_iseq(curr->faidx, i)) != header->target_len[i]) break; + } + /* the ref was found */ + if (i == faidx_nseq(curr->faidx)) { + ref = curr; + break; + } + } + curr = curr->next; + } + fputc('\t', params->out); + if (ref == NULL) { + fputc('.', params->out); + } else { + fputs(curr->filename, params->out); + } + } + fputc('\n', params->out); + return 0; +} + +/** open a sam file. Search for all samples in the @RG lines */ +static int print_samples(Params* params, const char* fname, const char* baifname) { + samFile *in = 0; + sam_hdr_t *header = NULL; + int n_rg; + int status = EXIT_SUCCESS; + khash_t(sm) *sample_set = NULL; + khint_t k; + int count_samples = 0; + int has_index = 0; + + if ((sample_set = kh_init(sm)) == NULL) { + print_error("samples", "Failed to initialise sample hash"); + status = EXIT_FAILURE; + goto end_print; + } + + if ((in = sam_open_format(fname, "r", NULL)) == 0) { + print_error_errno("samples", "Failed to open \"%s\" for reading", fname); + status = EXIT_FAILURE; + goto end_print; + } + if ((header = sam_hdr_read(in)) == 0) { + print_error("samples", "Failed to read the header from \"%s\"", fname); + status = EXIT_FAILURE; + goto end_print; + } + + /* try to load index if required */ + if (params->test_index) { + hts_idx_t *bam_idx; + /* path to bam index was specified */ + if (baifname != NULL) { + bam_idx = sam_index_load3(in, fname, baifname, HTS_IDX_SILENT_FAIL); + } + /* get default index */ + else { + bam_idx = sam_index_load3(in, fname, NULL, HTS_IDX_SILENT_FAIL); + } + has_index = bam_idx != NULL; + if (bam_idx != NULL) hts_idx_destroy(bam_idx); + /* and we continue... we have tested the index file but we always test for the samples and the references */ + } + + /* get the RG lines */ + n_rg = sam_hdr_count_lines(header, "RG"); + if (n_rg > 0) { + int i, r, ret; + char* sample; + kstring_t sm_val = KS_INITIALIZE; + for (i = 0; i < n_rg; i++) { + r = sam_hdr_find_tag_pos(header, "RG", i, params->tag, &sm_val); + if (r < 0) continue; + k = kh_get(sm, sample_set, ks_str(&sm_val)); + if (k != kh_end(sample_set)) continue; + sample = strdup(ks_str(&sm_val)); + if (sample == NULL) { + print_error_errno("samples", "Out of memory"); + status = EXIT_FAILURE; + goto end_print; + } + kh_put(sm, sample_set, sample, &ret); + if (ret < 0) { + print_error("samples", "Failed to insert key '%s' into sample_set", sample); + free(sample); + status = EXIT_FAILURE; + goto end_print; + } + ++count_samples; + } + ks_free(&sm_val); + } + if (count_samples == 0) { + print_sample(params, header, has_index, ".", fname); + } else { + for (k = kh_begin(sample_set); k != kh_end(sample_set); ++k) { + if (kh_exist(sample_set, k)) { + char* sample = (char*)kh_key(sample_set, k); + print_sample(params, header, has_index, sample, fname); + } + } + } + +end_print: + if (sample_set != NULL) { + for (k = kh_begin(sample_set); k != kh_end(sample_set); ++k) { + if (kh_exist(sample_set, k)) { + char* sample = (char*)kh_key(sample_set, k); + free(sample); + } + } + kh_destroy(sm, sample_set); + } + if (header != NULL) sam_hdr_destroy(header); + if (in != NULL) sam_close(in); + + return status; +} + + +int main_samples(int argc, char** argv) { + int status = EXIT_SUCCESS; + int print_header = 0; + int has_index_file = 0; + Params params; + char* out_filename = NULL; + FaidxPath* fai; + + strcpy(params.tag, "SM"); + params.faidx = NULL; + params.test_index =0; + + int opt; + while ((opt = getopt_long(argc, argv, "?hiXo:f:F:T:", NULL, NULL)) != -1) { + switch (opt) { + case 'h': + print_header = 1; + break; + case 'o': + out_filename = optarg; + break; + case 'i': + params.test_index = 1; + break; + case 'f': + if (load_dictionary(¶ms, optarg) != EXIT_SUCCESS) { + return EXIT_FAILURE; + } + break; + case 'F': + if (load_dictionaries(¶ms, optarg) != EXIT_SUCCESS) { + return EXIT_FAILURE; + } + break; + case 'T': + if (strlen(optarg) != 2) { + print_error("samples", "Length of tag \"%s\" is not 2.", optarg); + return EXIT_FAILURE; + } + strcpy(params.tag, optarg); + break; + case '?': + usage_samples(samtools_stdout); + return EXIT_SUCCESS; + case 'X': + has_index_file = 1; + break; + default: + usage_samples(samtools_stderr); + return EXIT_FAILURE; + } + } + + /* if no file was provided and input is the terminal, print the usage and exit */ + if (argc == optind && isatty(STDIN_FILENO)) { + usage_samples(samtools_stderr); + return EXIT_FAILURE; + } + + if (out_filename != NULL) { + params.out = fopen(out_filename, "w"); + if (params.out == NULL) { + print_error_errno("samples", "Cannot open \"%s\" for writing", out_filename); + return EXIT_FAILURE; + } + } else { + params.out = samtools_stdout; + } + + if (print_header) { + fprintf(params.out, "#%s\tPATH", params.tag); + if (params.test_index) fprintf(params.out, "\tINDEX"); + if (params.faidx != NULL) fprintf(params.out, "\tREFERENCE"); + fprintf(params.out, "\n"); + } + + /* no file was provided, input is stdin, each line contains the path to a bam file */ + if (argc == optind) { + htsFile* fp = hts_open("-", "r"); + if (fp == NULL) { + print_error_errno("samples", "Cannot read from stdin"); + status = EXIT_FAILURE; + } else { + kstring_t ks = KS_INITIALIZE; + int ret; + while ((ret = hts_getline(fp, KS_SEP_LINE, &ks)) >= 0) { + char* bai_path = NULL; + if (has_index_file) { + /* bam path and bam index file are separated by a tab */ + char* tab = strchr(ks_str(&ks), '\t'); + if (tab == NULL || *(tab+1) == '\0') { + print_error_errno("samples", "Expected path-to-bam(tab)path-to-index but got \"%s\"", ks_str(&ks)); + status = EXIT_FAILURE; + break; + } + *tab=0; + bai_path = (tab + 1); + } + if (print_samples(¶ms, ks_str(&ks), bai_path) != EXIT_SUCCESS) { + status = EXIT_FAILURE; + break; + } + } + ks_free(&ks); + hts_close(fp); + } + } + /* loop over each file in argc/argv bam index provided */ + else if (has_index_file) { + /* calculate number of input BAM files */ + if ((argc - optind) % 2 != 0) { + print_error("samples","Odd number of filenames detected! Each BAM file should have an index file"); + status = EXIT_FAILURE; + } else { + int i; + int n = (argc - optind ) / 2; + for (i = 0; i < n; i++) { + if (print_samples(¶ms, argv[optind+i], argv[optind+i+n]) != EXIT_SUCCESS) { + status = EXIT_FAILURE; + break; + } + } + } + } else { + int i; + for (i = optind; i < argc; i++) { + if (print_samples(¶ms, argv[i], NULL) != EXIT_SUCCESS) { + status = EXIT_FAILURE; + break; + } + } + } + + fai = params.faidx; + while (fai != NULL) { + FaidxPath* next = fai -> next; + free(fai->filename); + fai_destroy(fai->faidx); + free(fai); + fai = next; + } + + if (fflush(params.out) != 0) { + print_error_errno("samples", "Cannot flush output"); + status = EXIT_FAILURE; + } + if (out_filename != NULL) { + fclose(params.out); + } + + return status; +} diff --git a/samtools/bam_sort.c b/samtools/bam_sort.c new file mode 100644 index 0000000..58ecdfd --- /dev/null +++ b/samtools/bam_sort.c @@ -0,0 +1,3263 @@ +/* bam_sort.c -- sorting and merging. + + Copyright (C) 2008-2022 Genome Research Ltd. + Portions copyright (C) 2009-2012 Broad Institute. + + Author: Heng Li + Author: Martin Pollard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "htslib/ksort.h" +#include "htslib/hts_os.h" +#include "htslib/khash.h" +#include "htslib/klist.h" +#include "htslib/kstring.h" +#include "htslib/sam.h" +#include "htslib/hts_endian.h" +#include "htslib/cram.h" +#include "sam_opts.h" +#include "samtools.h" +#include "bedidx.h" +#include "bam.h" + + +// Struct which contains the sorting key for TemplateCoordinate sort. +typedef struct { + int tid1; + int tid2; + hts_pos_t pos1; + hts_pos_t pos2; + bool neg1; + bool neg2; + const char *library; + char *mid; + char *name; + bool is_upper_of_pair; +} template_coordinate_key_t; + +// Struct to store fixed buffers of template coordinate keys +typedef struct { + size_t n; // the # of keys stored + size_t m; // the # of buffers allocated + size_t buffer_size; // # the fixed size of each buffer + template_coordinate_key_t **buffers; // the list of buffers +} template_coordinate_keys_t; + +// Gets the idx'th key; does not OOB check +static template_coordinate_key_t* template_coordinate_keys_get(template_coordinate_keys_t *keys, size_t idx) { + size_t buffer_idx = idx / keys->buffer_size; // the index of the buffer to retrieve in buffer + size_t buffer_offset = idx % keys->buffer_size; // the offset into the given buffer to retrieve + //assert(buffer_idx < keys->m); + //assert(buffer_offset < keys->buffer_size); + return &keys->buffers[buffer_idx][buffer_offset]; +} + +// Rellocates the buffers to hold at least max_k entries +static int template_coordinate_keys_realloc(template_coordinate_keys_t *keys, int max_k) { + size_t cur_m = keys->m; + keys->m += 0x100; + //assert(keys->m > cur_m); + //assert(keys->m * keys->buffer_size >= max_k); + if ((keys->buffers = realloc(keys->buffers, keys->m * sizeof(template_coordinate_key_t*))) == NULL) { + print_error("sort", "couldn't reallocate memory for template coordinate key buffers"); + return -1; + } + // allocate space for new buffers + int j; + for (j = cur_m; j < keys->m; ++j) { + if ((keys->buffers[j]= malloc(sizeof(template_coordinate_key_t) * keys->buffer_size)) == NULL) { + print_error("sort", "couldn't allocate memory for template coordinate key buffer"); + return -1; + } + } + return 0; +} + + +// Struct which contains the a record, and the pointer to the sort tag (if any) or +// a combined ref / position / strand. +// Used to speed up sorts (coordinate, by-tag, and template-coordinate). +typedef struct bam1_tag { + bam1_t *bam_record; + union { + const uint8_t *tag; + uint8_t pos_tid[12]; + template_coordinate_key_t *key; + } u; +} bam1_tag; + +/* Minimum memory required in megabytes before sort will attempt to run. This + is to prevent accidents where failing to use the -m option correctly results + in the creation of a temporary file for each read in the input file. + Don't forget to update the man page if you change this. */ +const size_t SORT_MIN_MEGS_PER_THREAD = 1; + +/* Default per-thread memory for sort. Must be >= SORT_MIN_MEGS_PER_THREAD. + Don't forget to update the man page if you change this. */ +const size_t SORT_DEFAULT_MEGS_PER_THREAD = 768; + +#if !defined(__DARWIN_C_LEVEL) || __DARWIN_C_LEVEL < 900000L +#define NEED_MEMSET_PATTERN4 +#endif + +#ifdef NEED_MEMSET_PATTERN4 +void memset_pattern4(void *target, const void *pattern, size_t size) { + uint32_t* target_iter = target; + size_t loops = size/4; + size_t i; + for (i = 0; i < loops; ++i) { + memcpy(target_iter, pattern, 4); + ++target_iter; + } + if (size%4 != 0) + memcpy(target_iter, pattern, size%4); +} +#endif + +KHASH_INIT(c2c, char*, char*, 1, kh_str_hash_func, kh_str_hash_equal) +KHASH_INIT(cset, char*, char, 0, kh_str_hash_func, kh_str_hash_equal) +KHASH_MAP_INIT_STR(c2i, int) +KHASH_MAP_INIT_STR(const_c2c, char *) + +#define hdrln_free_char(p) +KLIST_INIT(hdrln, char*, hdrln_free_char) + +static template_coordinate_key_t* template_coordinate_key(bam1_t *b, template_coordinate_key_t *key, sam_hdr_t *hdr, khash_t(const_c2c) *lib_lookup); + +typedef enum {Coordinate, QueryName, TagCoordinate, TagQueryName, MinHash, TemplateCoordinate} SamOrder; +static SamOrder g_sam_order = Coordinate; +static char g_sort_tag[2] = {0,0}; + +static int strnum_cmp(const char *_a, const char *_b) +{ + const unsigned char *a = (const unsigned char*)_a, *b = (const unsigned char*)_b; + const unsigned char *pa = a, *pb = b; + while (*pa && *pb) { + if (isdigit(*pa) && isdigit(*pb)) { + while (*pa == '0') ++pa; + while (*pb == '0') ++pb; + while (isdigit(*pa) && isdigit(*pb) && *pa == *pb) ++pa, ++pb; + if (isdigit(*pa) && isdigit(*pb)) { + int i = 0; + while (isdigit(pa[i]) && isdigit(pb[i])) ++i; + return isdigit(pa[i])? 1 : isdigit(pb[i])? -1 : (int)*pa - (int)*pb; + } else if (isdigit(*pa)) return 1; + else if (isdigit(*pb)) return -1; + else if (pa - a != pb - b) return pa - a < pb - b? 1 : -1; + } else { + if (*pa != *pb) return (int)*pa - (int)*pb; + ++pa; ++pb; + } + } + return *pa? 1 : *pb? -1 : 0; +} + +#define HEAP_EMPTY (UINT64_MAX >> 1) + +typedef struct { + int i; + uint32_t tid; + uint64_t pos:63, rev:1, idx; + bam1_tag entry; +} heap1_t; + +static inline int bam1_cmp_by_tag(const bam1_tag a, const bam1_tag b); +static inline int bam1_cmp_by_minhash(const bam1_tag a, const bam1_tag b); +static inline int bam1_cmp_template_coordinate(const bam1_tag a, const bam1_tag b); +static khash_t(const_c2c) * lookup_libraries(sam_hdr_t *header); +static void lib_lookup_destroy(khash_t(const_c2c) *lib_lookup); + +// Function to compare reads in the heap and determine which one is < the other +// Note, unlike the bam1_cmp_by_X functions which return <0, 0, >0 this +// is strictly 0 or 1 only. +static inline int heap_lt(const heap1_t a, const heap1_t b) +{ + if (!a.entry.bam_record) + return 1; + if (!b.entry.bam_record) + return 0; + + int t, fa, fb; + switch (g_sam_order) { + case Coordinate: + if (a.tid != b.tid) return a.tid > b.tid; + if (a.pos != b.pos) return a.pos > b.pos; + if (a.rev != b.rev) return a.rev > b.rev; + break; + case QueryName: + t = strnum_cmp(bam_get_qname(a.entry.bam_record), bam_get_qname(b.entry.bam_record)); + if (t != 0) return t > 0; + fa = a.entry.bam_record->core.flag & 0xc0; + fb = b.entry.bam_record->core.flag & 0xc0; + if (fa != fb) return fa > fb; + break; + case TagQueryName: + case TagCoordinate: + t = bam1_cmp_by_tag(a.entry, b.entry); + if (t != 0) return t > 0; + break; + case MinHash: + t = bam1_cmp_by_minhash(a.entry, b.entry); + if (t != 0) return t > 0; + break; + case TemplateCoordinate: + t = bam1_cmp_template_coordinate(a.entry, b.entry); + if (t != 0) return t > 0; + break; + default: + print_error("heap_lt", "unknown sort order: %d", g_sam_order); + break; + } + + // This compares by position in the input file(s) + if (a.i != b.i) return a.i > b.i; + return a.idx > b.idx; +} + +KSORT_INIT(heap, heap1_t, heap_lt) + +typedef struct merged_header { + sam_hdr_t *hdr; + kstring_t out_rg; + kstring_t out_pg; + kstring_t out_co; + char **target_name; + uint32_t *target_len; + size_t n_targets; + size_t targets_sz; + khash_t(c2i) *sq_tids; + khash_t(cset) *rg_ids; + khash_t(cset) *pg_ids; + bool have_hd; +} merged_header_t; + +typedef struct trans_tbl { + int32_t n_targets; + int* tid_trans; + kh_c2c_t* rg_trans; + kh_c2c_t* pg_trans; + bool lost_coord_sort; +} trans_tbl_t; + +static void trans_tbl_destroy(trans_tbl_t *tbl) { + khiter_t iter; + + free(tbl->tid_trans); + + /* + * The values for the tbl->rg_trans and tbl->pg_trans hashes are pointers + * to keys in the rg_ids and pg_ids sets of the merged_header_t, so + * they should not be freed here. + * + * The keys are unique to each hash entry, so they do have to go. + */ + + for (iter = kh_begin(tbl->rg_trans); iter != kh_end(tbl->rg_trans); ++iter) { + if (kh_exist(tbl->rg_trans, iter)) { + free(kh_key(tbl->rg_trans, iter)); + } + } + for (iter = kh_begin(tbl->pg_trans); iter != kh_end(tbl->pg_trans); ++iter) { + if (kh_exist(tbl->pg_trans, iter)) { + free(kh_key(tbl->pg_trans, iter)); + } + } + + kh_destroy(c2c,tbl->rg_trans); + kh_destroy(c2c,tbl->pg_trans); +} + +/* + * Create a merged_header_t struct. + */ + +static merged_header_t * init_merged_header() { + merged_header_t *merged_hdr; + + merged_hdr = calloc(1, sizeof(*merged_hdr)); + if (merged_hdr == NULL) return NULL; + + merged_hdr->hdr = sam_hdr_init(); + if (!merged_hdr->hdr) goto fail; + + merged_hdr->targets_sz = 16; + merged_hdr->target_name = malloc(merged_hdr->targets_sz + * sizeof(*merged_hdr->target_name)); + if (NULL == merged_hdr->target_name) goto fail; + + merged_hdr->target_len = malloc(merged_hdr->targets_sz + * sizeof(*merged_hdr->target_len)); + if (NULL == merged_hdr->target_len) goto fail; + + merged_hdr->sq_tids = kh_init(c2i); + if (merged_hdr->sq_tids == NULL) goto fail; + + merged_hdr->rg_ids = kh_init(cset); + if (merged_hdr->rg_ids == NULL) goto fail; + + merged_hdr->pg_ids = kh_init(cset); + if (merged_hdr->pg_ids == NULL) goto fail; + + return merged_hdr; + + fail: + perror("[init_merged_header]"); + kh_destroy(cset, merged_hdr->pg_ids); + kh_destroy(cset, merged_hdr->rg_ids); + kh_destroy(c2i, merged_hdr->sq_tids); + free(merged_hdr->target_name); + free(merged_hdr->target_len); + sam_hdr_destroy(merged_hdr->hdr); + free(merged_hdr); + return NULL; +} + +/* Some handy kstring manipulating functions */ + +// Append char range to kstring +static inline int range_to_ks(const char *src, int from, int to, + kstring_t *dest) { + return kputsn(src + from, to - from, dest) != to - from; +} + +// Append a kstring to a kstring +static inline int ks_to_ks(kstring_t *src, kstring_t *dest) { + return kputsn(ks_str(src), ks_len(src), dest) != ks_len(src); +} + +/* + * Generate a unique ID by appending a random suffix to a given prefix. + * existing_ids is the set of IDs that are already in use. + * If always_add_suffix is true, the suffix will always be included. + * If false, prefix will be returned unchanged if it isn't in existing_ids. + */ + +static int gen_unique_id(char *prefix, khash_t(cset) *existing_ids, + bool always_add_suffix, kstring_t *dest) { + khiter_t iter; + + if (!always_add_suffix) { + // Try prefix on its own first + iter = kh_get(cset, existing_ids, prefix); + if (iter == kh_end(existing_ids)) { // prefix isn't used yet + dest->l = 0; + if (kputs(prefix, dest) == EOF) return -1; + return 0; + } + } + + do { + dest->l = 0; + ksprintf(dest, "%s-%0lX", prefix, lrand48()); + iter = kh_get(cset, existing_ids, ks_str(dest)); + } while (iter != kh_end(existing_ids)); + + return 0; +} + +/* + * Add the @HD line to the new header + * In practice the @HD line will come from the first input header. + */ + +static int trans_tbl_add_hd(merged_header_t* merged_hdr, + sam_hdr_t *translate) { + kstring_t hd_line = { 0, 0, NULL }; + int res; + + // TODO: handle case when @HD needs merging. + if (merged_hdr->have_hd) return 0; + + res = sam_hdr_find_hd(translate, &hd_line); + if (res < -1) { + print_error("merge", "failed to get @HD line from header"); + return -1; + } + + if (res < 0) // Not found + return 0; + + if (sam_hdr_add_lines(merged_hdr->hdr, hd_line.s, hd_line.l) < 0) { + print_error("merge", "failed to add @HD line to new header"); + free(hd_line.s); + return -1; + } + + free(hd_line.s); + merged_hdr->have_hd = true; + + return 0; +} + +/* + * Add @SQ records to the translation table. + * + * Go through the target list for the input header. Any new targets found + * are added to the output header target list. At the same time, a mapping + * from the input to output target ids is stored in tbl. + * + * If any new targets are found, the header text is scanned to find the + * corresponding @SQ records. They are then copied into the + * merged_hdr->out_text kstring (which will eventually become the + * output header text). + * + * Returns 0 on success, -1 on failure. + */ + +static int trans_tbl_add_sq(merged_header_t* merged_hdr, sam_hdr_t *translate, + trans_tbl_t* tbl) { + int32_t i; + int min_tid = -1, res; + kstring_t sq_line = { 0, 0, NULL }, sq_sn = { 0, 0, NULL }; + + // Fill in the tid part of the translation table, adding new targets + // to the merged header as we go. + + for (i = 0; i < sam_hdr_nref(translate); ++i) { + int trans_tid; + sq_sn.l = 0; + res = sam_hdr_find_tag_pos(translate, "SQ", i, "SN", &sq_sn); + if (res < 0) { + print_error("merge", "failed to get @SQ SN #%d from header", i + 1); + goto fail; + } + + trans_tid = sam_hdr_name2tid(merged_hdr->hdr, sq_sn.s); + if (trans_tid < -1) { + print_error("merge", "failed to lookup ref"); + goto fail; + } + + if (trans_tid < 0) { + // Append missing entries to out_hdr + sq_line.l = 0; + res = sam_hdr_find_line_id(translate, "SQ", "SN", sq_sn.s, &sq_line); + if (res < 0) { + print_error("merge", "failed to get @SQ SN:%s from header", sq_sn.s); + goto fail; + } + + trans_tid = sam_hdr_nref(merged_hdr->hdr); + + res = sam_hdr_add_lines(merged_hdr->hdr, sq_line.s, sq_line.l); + if (res < 0) { + print_error("merge", "failed to add @SQ SN:%s to new header", sq_sn.s); + goto fail; + } + } + tbl->tid_trans[i] = trans_tid; + + if (tbl->tid_trans[i] > min_tid) { + min_tid = tbl->tid_trans[i]; + } else { + tbl->lost_coord_sort = true; + } + } + + free(sq_line.s); + free(sq_sn.s); + + return 0; + + fail: + free(sq_line.s); + free(sq_sn.s); + return -1; +} + +/* + * Common code for setting up RG and PG record ID tag translation. + * + * is_rg is true for RG translation, false for PG. + * translate is the input bam header + * merge is true if tags with the same ID are to be merged. + * known_ids is the set of IDs already in the output header. + * id_map is the translation map from input header IDs to output header IDs + * If override is set, it will be used to replace the existing ID (RG only) + * + * known_ids and id_map have entries for the new IDs added to them. + * + * Return value is a linked list of header lines with the translated IDs, + * or NULL if something went wrong (probably out of memory). + * + */ + +static klist_t(hdrln) * trans_rg_pg(bool is_rg, sam_hdr_t *translate, + bool merge, khash_t(cset)* known_ids, + khash_t(c2c)* id_map, char *override) { + khiter_t iter; + int num_ids, i; + const char *rec_type = is_rg ? "RG" : "PG"; + klist_t(hdrln) *hdr_lines; + + hdr_lines = kl_init(hdrln); + + // Search through translate's header + num_ids = sam_hdr_count_lines(translate, rec_type); + if (num_ids < 0) + goto fail; + + for (i = 0; i < num_ids; i++) { + kstring_t orig_id = { 0, 0, NULL }; // ID in original header + kstring_t transformed_id = { 0, 0, NULL }; // ID in output header + char *map_value; // Value to store in id_map + bool id_changed; // Have we changed the ID? + bool not_found_in_output; // ID isn't in the output header (yet) + + if (sam_hdr_find_tag_pos(translate, rec_type, i, "ID", &orig_id) < 0) + goto fail; + + // is our matched ID in our output ID set already? + iter = kh_get(cset, known_ids, ks_str(&orig_id)); + not_found_in_output = (iter == kh_end(known_ids)); + + if (override) { + // Override original ID (RG only) +#ifdef OVERRIDE_DOES_NOT_MERGE + if (gen_unique_id(override, known_ids, false, &transformed_id)) + goto memfail; + not_found_in_output = true; // As ID now unique +#else + if (kputs(override, &transformed_id) == EOF) goto memfail; + // Know about override already? + iter = kh_get(cset, known_ids, ks_str(&transformed_id)); + not_found_in_output = (iter == kh_end(known_ids)); +#endif + id_changed = true; + } else { + if ( not_found_in_output || merge) { + // Not in there or merging so can add it as 1-1 mapping + if (ks_to_ks(&orig_id, &transformed_id)) goto memfail; + id_changed = false; + } else { + // It's in there so we need to transform it by appending + // a random number to the id + if (gen_unique_id(ks_str(&orig_id), known_ids, + true, &transformed_id)) + goto memfail; + id_changed = true; + not_found_in_output = true; // As ID now unique + } + } + + // Does this line need to go into our output header? + if (not_found_in_output) { + // Take matched line and replace ID with transformed_id + kstring_t new_hdr_line = { 0, 0, NULL }; + if (sam_hdr_find_line_id(translate, rec_type, + "ID", ks_str(&orig_id), &new_hdr_line) < 0){ + goto fail; + } + + if (id_changed) { + char *idp = strstr(ks_str(&new_hdr_line), "\tID:"), *id_end; + ptrdiff_t id_offset, id_len; + if (!idp) { + print_error("merge", "failed to find ID in \"%s\"\n", + ks_str(&new_hdr_line)); + goto fail; + } + idp += 4; + for (id_end = idp; *id_end >= '\n'; id_end++) {} + + id_offset = idp - new_hdr_line.s; + id_len = id_end - idp; + + if (id_len < transformed_id.l) { + if (ks_resize(&new_hdr_line, new_hdr_line.l + + transformed_id.l - id_len + 1/*nul*/)) + goto fail; + } + if (id_len != transformed_id.l) { + memmove(new_hdr_line.s + id_offset + transformed_id.l, + new_hdr_line.s + id_offset + id_len, + new_hdr_line.l - id_offset - id_len + 1); + } + memcpy(new_hdr_line.s + id_offset, transformed_id.s, + transformed_id.l); + } + + // append line to output linked list + char** ln = kl_pushp(hdrln, hdr_lines); + *ln = ks_release(&new_hdr_line); // Give away to linked list + + // Need to add it to known_ids set + int in_there = 0; + iter = kh_put(cset, known_ids, ks_str(&transformed_id), &in_there); + if (in_there < 0) goto memfail; + assert(in_there > 0); // Should not already be in the map + map_value = ks_release(&transformed_id); + } else { + // Use existing string in id_map + assert(kh_exist(known_ids, iter)); + map_value = kh_key(known_ids, iter); + free(ks_release(&transformed_id)); + } + + // Insert it into our translation map + int in_there = 0; + iter = kh_put(c2c, id_map, ks_release(&orig_id), &in_there); + kh_value(id_map, iter) = map_value; + } + + // If there are no RG lines in the file and we are overriding add one + if (is_rg && override && hdr_lines->size == 0) { + kstring_t new_id = {0, 0, NULL}; + kstring_t line = {0, 0, NULL}; + kstring_t empty = {0, 0, NULL}; + int in_there = 0; + char** ln; + + // Get the new ID + if (gen_unique_id(override, known_ids, false, &new_id)) + goto memfail; + + // Make into a header line and add to linked list + ksprintf(&line, "@RG\tID:%s", ks_str(&new_id)); + ln = kl_pushp(hdrln, hdr_lines); + *ln = ks_release(&line); + + // Put into known_ids set + iter = kh_put(cset, known_ids, ks_str(&new_id), &in_there); + if (in_there < 0) goto memfail; + assert(in_there > 0); // Should be a new entry + + // Put into translation map (key is empty string) + if (kputs("", &empty) == EOF) goto memfail; + iter = kh_put(c2c, id_map, ks_release(&empty), &in_there); + if (in_there < 0) goto memfail; + assert(in_there > 0); // Should be a new entry + kh_value(id_map, iter) = ks_release(&new_id); + } + + return hdr_lines; + + memfail: + perror(__func__); + fail: + if (hdr_lines) kl_destroy(hdrln, hdr_lines); + return NULL; +} + +/* + * Common code for completing RG and PG record translation. + * + * Input is a list of header lines, and the mapping from input to + * output @PG record IDs. + * + * RG and PG records can contain tags that cross-reference to other @PG + * records. This fixes the tags to contain the new IDs before adding + * them to the output header text. + */ + +static int finish_rg_pg(bool is_rg, klist_t(hdrln) *hdr_lines, + khash_t(c2c)* pg_map, kstring_t *out_text) { + const char *search = is_rg ? "\tPG:" : "\tPP:"; + khiter_t idx; + char *line = NULL; + + while ((kl_shift(hdrln, hdr_lines, &line)) == 0) { + char *id = strstr(line, search); // Look for tag to fix + int pos1 = 0, pos2 = 0; + char *new_id = NULL; + + if (id) { + // Found a tag. Look up the value in the translation map + // to see what it should be changed to in the output file. + char *end, tmp; + + id += 4; // Point to value + end = strchr(id, '\t'); // Find end of tag + if (!end) end = id + strlen(id); + + tmp = *end; + *end = '\0'; // Temporarily get the value on its own. + + // Look-up in translation table + idx = kh_get(c2c, pg_map, id); + if (idx == kh_end(pg_map)) { + // Not found, warn. + fprintf(stderr, "[W::%s] Tag %s%s not found in @PG records\n", + __func__, search + 1, id); + } else { + // Remember new id and splice points on original string + new_id = kh_value(pg_map, idx); + pos1 = id - line; + pos2 = end - line; + } + + *end = tmp; // Restore string + } + + // Copy line to output: + // line[0..pos1), new_id (if not NULL), line[pos2..end), '\n' + + if (pos1 && range_to_ks(line, 0, pos1, out_text)) goto memfail; + if (new_id && kputs(new_id, out_text) == EOF) goto memfail; + if (kputs(line + pos2, out_text) == EOF) goto memfail; + if (kputc('\n', out_text) == EOF) goto memfail; + free(line); // No longer needed + line = NULL; + } + + return 0; + + memfail: + perror(__func__); + free(line); // Prevent leakage as no longer on list + return -1; +} + +/* + * Build the translation table for an input *am file. This stores mappings + * which allow IDs to be converted from those used in the input file + * to the ones which will be used in the output. The mappings are for: + * Reference sequence IDs (for @SQ records) + * @RG record ID tags + * @PG record ID tags + * + * At the same time, new header text is built up by copying records + * from the input bam file. This will eventually become the header for + * the output file. When copied, the ID tags for @RG and @PG records + * are replaced with their values. The @PG PP: and @RG PG: tags + * are also modified if necessary. + * + * merged_hdr holds state on the output header (which IDs are present, etc.) + * translate is the input header + * tbl is the translation table that gets filled in. + * merge_rg controls merging of @RG records + * merge_pg controls merging of @PG records + * If rg_override is not NULL, it will be used to replace the existing @RG ID + * + * Returns 0 on success, -1 on failure. + */ + +static int trans_tbl_init(merged_header_t* merged_hdr, sam_hdr_t* translate, + trans_tbl_t* tbl, bool merge_rg, bool merge_pg, + bool copy_co, char* rg_override) +{ + kstring_t lines = { 0, 0, NULL }; + klist_t(hdrln) *rg_list = NULL; + klist_t(hdrln) *pg_list = NULL; + + tbl->n_targets = sam_hdr_nref(translate); + tbl->rg_trans = tbl->pg_trans = NULL; + tbl->tid_trans = (int*)calloc(tbl->n_targets ? tbl->n_targets : 1, + sizeof(int)); + if (tbl->tid_trans == NULL) goto memfail; + tbl->rg_trans = kh_init(c2c); + if (tbl->rg_trans == NULL) goto memfail; + tbl->pg_trans = kh_init(c2c); + if (tbl->pg_trans == NULL) goto memfail; + + tbl->lost_coord_sort = false; + + // Get the @HD record (if not there already). + if (trans_tbl_add_hd(merged_hdr, translate)) goto fail; + + // Fill in map and add header lines for @SQ records + if (trans_tbl_add_sq(merged_hdr, translate, tbl)) goto fail; + + // Get translated header lines and fill in map for @RG records + rg_list = trans_rg_pg(true, translate, merge_rg, merged_hdr->rg_ids, + tbl->rg_trans, rg_override); + if (!rg_list) goto fail; + + // Get translated header lines and fill in map for @PG records + pg_list = trans_rg_pg(false, translate, merge_pg, merged_hdr->pg_ids, + tbl->pg_trans, NULL); + if (!pg_list) goto fail; + + // Fix-up PG: tags in the new @RG records and add to output + if (finish_rg_pg(true, rg_list, tbl->pg_trans, &merged_hdr->out_rg)) + goto fail; + + // Fix-up PP: tags in the new @PG records and add to output + lines.l = 0; + if (finish_rg_pg(false, pg_list, tbl->pg_trans, &merged_hdr->out_pg)) + goto fail; + + kl_destroy(hdrln, rg_list); rg_list = NULL; + kl_destroy(hdrln, pg_list); pg_list = NULL; + + if (copy_co) { + // Just append @CO headers without translation + int num_co = sam_hdr_count_lines(translate, "CO"), i; + if (num_co < 0) + goto fail; + + for (i = 0; i < num_co; i++) { + if (sam_hdr_find_line_pos(translate, "CO", i, &lines) < 0) + goto fail; + if (ks_to_ks(&lines, &merged_hdr->out_co)) + goto fail; + if (kputc('\n', &merged_hdr->out_co) < 0) + goto fail; + } + } + + free(lines.s); + + return 0; + + memfail: + perror(__func__); + fail: + trans_tbl_destroy(tbl); + if (rg_list) kl_destroy(hdrln, rg_list); + if (pg_list) kl_destroy(hdrln, pg_list); + free(lines.s); + return -1; +} + +static int finish_merged_header(merged_header_t *merged_hdr) { + if (sam_hdr_add_lines(merged_hdr->hdr, ks_c_str(&merged_hdr->out_rg), + ks_len(&merged_hdr->out_rg)) < 0) + return -1; + if (sam_hdr_add_lines(merged_hdr->hdr, ks_c_str(&merged_hdr->out_pg), + ks_len(&merged_hdr->out_pg)) < 0) + return -1; + if (sam_hdr_add_lines(merged_hdr->hdr, ks_c_str(&merged_hdr->out_co), + ks_len(&merged_hdr->out_co)) < 0) + return -1; + + return 0; +} + +/* + * Free a merged_header_t struct and all associated data. + * + * Note that the keys to the rg_ids and pg_ids sets are also used as + * values in the translation tables. This function should therefore not + * be called until the translation tables are no longer needed. + */ + +static void free_merged_header(merged_header_t *merged_hdr) { + size_t i; + khiter_t iter; + if (!merged_hdr) return; + free(ks_release(&merged_hdr->out_rg)); + free(ks_release(&merged_hdr->out_pg)); + free(ks_release(&merged_hdr->out_co)); + if (merged_hdr->target_name) { + for (i = 0; i < merged_hdr->n_targets; i++) { + free(merged_hdr->target_name[i]); + } + free(merged_hdr->target_name); + } + free(merged_hdr->target_len); + kh_destroy(c2i, merged_hdr->sq_tids); + + if (merged_hdr->rg_ids) { + for (iter = kh_begin(merged_hdr->rg_ids); + iter != kh_end(merged_hdr->rg_ids); ++iter) { + if (kh_exist(merged_hdr->rg_ids, iter)) + free(kh_key(merged_hdr->rg_ids, iter)); + } + kh_destroy(cset, merged_hdr->rg_ids); + } + + if (merged_hdr->pg_ids) { + for (iter = kh_begin(merged_hdr->pg_ids); + iter != kh_end(merged_hdr->pg_ids); ++iter) { + if (kh_exist(merged_hdr->pg_ids, iter)) + free(kh_key(merged_hdr->pg_ids, iter)); + } + kh_destroy(cset, merged_hdr->pg_ids); + } + + free(merged_hdr); +} + +static void bam_translate(bam1_t* b, trans_tbl_t* tbl) +{ + // Update target id if not unmapped tid + if ( b->core.tid >= 0 ) { b->core.tid = tbl->tid_trans[b->core.tid]; } + if ( b->core.mtid >= 0 ) { b->core.mtid = tbl->tid_trans[b->core.mtid]; } + + // If we have a RG update it + uint8_t *rg = bam_aux_get(b, "RG"); + if (rg) { + char* decoded_rg = bam_aux2Z(rg); + khiter_t k = kh_get(c2c, tbl->rg_trans, decoded_rg); + if (k != kh_end(tbl->rg_trans)) { + char* translate_rg = kh_value(tbl->rg_trans,k); + bam_aux_del(b, rg); + if (translate_rg) { + bam_aux_append(b, "RG", 'Z', strlen(translate_rg) + 1, + (uint8_t*)translate_rg); + } + } else { + char *tmp = strdup(decoded_rg); + fprintf(stderr, + "[bam_translate] RG tag \"%s\" on read \"%s\" encountered " + "with no corresponding entry in header, tag lost. " + "Unknown tags are only reported once per input file for " + "each tag ID.\n", + decoded_rg, bam_get_qname(b)); + bam_aux_del(b, rg); + // Prevent future whinges + if (tmp) { + int in_there = 0; + k = kh_put(c2c, tbl->rg_trans, tmp, &in_there); + if (in_there > 0) kh_value(tbl->rg_trans, k) = NULL; + } + } + } + + // If we have a PG update it + uint8_t *pg = bam_aux_get(b, "PG"); + if (pg) { + char* decoded_pg = bam_aux2Z(pg); + khiter_t k = kh_get(c2c, tbl->pg_trans, decoded_pg); + if (k != kh_end(tbl->pg_trans)) { + char* translate_pg = kh_value(tbl->pg_trans,k); + bam_aux_del(b, pg); + if (translate_pg) { + bam_aux_append(b, "PG", 'Z', strlen(translate_pg) + 1, + (uint8_t*)translate_pg); + } + } else { + char *tmp = strdup(decoded_pg); + fprintf(stderr, + "[bam_translate] PG tag \"%s\" on read \"%s\" encountered " + "with no corresponding entry in header, tag lost. " + "Unknown tags are only reported once per input file for " + "each tag ID.\n", + decoded_pg, bam_get_qname(b)); + bam_aux_del(b, pg); + // Prevent future whinges + if (tmp) { + int in_there = 0; + k = kh_put(c2c, tbl->pg_trans, tmp, &in_there); + if (in_there > 0) kh_value(tbl->pg_trans, k) = NULL; + } + } + } +} + +int* rtrans_build(int n, int n_targets, trans_tbl_t* translation_tbl) +{ + // Create reverse translation table for tids + int* rtrans = (int*)malloc(sizeof(int32_t)*n*n_targets); + const int32_t NOTID = INT32_MIN; + if (!rtrans) return NULL; + memset_pattern4((void*)rtrans, &NOTID, sizeof(int32_t)*n*n_targets); + int i; + for (i = 0; i < n; ++i) { + int j; + for (j = 0; j < (translation_tbl+i)->n_targets; ++j) { + if ((translation_tbl+i)->tid_trans[j] != -1) { + rtrans[i*n_targets + (translation_tbl+i)->tid_trans[j]] = j; + } + } + } + + return rtrans; +} + +#define MERGE_RG 1 // Attach RG tag based on filename +#define MERGE_UNCOMP 2 // Generate uncompressed BAM +#define MERGE_LEVEL1 4 // Compress the BAM at level 1 (fast) mode +#define MERGE_FORCE 8 // Overwrite output BAM if it exists +#define MERGE_COMBINE_RG 16 // Combine RG tags frather than redefining them +#define MERGE_COMBINE_PG 32 // Combine PG tags frather than redefining them +#define MERGE_FIRST_CO 64 // Use only first file's @CO headers (sort cmd only) + + +static hts_reglist_t *duplicate_reglist(const hts_reglist_t *rl, int rn) { + if (!rl) + return NULL; + + hts_reglist_t *new_rl = calloc(rn, sizeof(hts_reglist_t)); + if (!new_rl) + return NULL; + + int i; + for (i=0; i < rn; i++) { + new_rl[i].tid = rl[i].tid; + new_rl[i].count = rl[i].count; + new_rl[i].min_beg = rl[i].min_beg; + new_rl[i].max_end = rl[i].max_end; + + new_rl[i].reg = rl[i].reg; + new_rl[i].intervals = malloc(new_rl[i].count * sizeof(hts_pair_pos_t)); + if (!new_rl[i].intervals) { + hts_reglist_free(new_rl, i); + return NULL; + } + memcpy(new_rl[i].intervals, rl[i].intervals, new_rl[i].count * sizeof(hts_pair_pos_t)); + } + + return new_rl; +} + +/* + * How merging is handled + * + * If a header is defined use we will use that as our output header + * otherwise we use the first header from the first input file. + * + * Now go through each file and create a translation table for that file for: + * -RG + * -tid + * -PG tags + * + * Then whenever we read a record from a bam we translate that read before + * stashing it in the hash. + * + * In the actual merge, a read is read from each input file, translated and + * stashed in the hash. This assumes that all input files are sorted in the + * same way. Next we just extract the next position ordered read from the + * hash, and replace it if there are still reads left in it's source input + * file. Finally we write our chosen read it to the output file. + */ + +/*! + @abstract Merge multiple sorted BAM. + @param sam_order the order in which the data was sorted + @param sort_tag if non-null, the tag that data was sorted by + @param out output BAM file name + @param mode sam_open() mode to be used to create the final output file + (overrides level settings from UNCOMP and LEVEL1 flags) + @param headers name of SAM file from which to copy '@' header lines, + or NULL to copy them from the first file to be merged + @param n number of files to be merged + @param fn names of files to be merged + @param flag flags that control how the merge is undertaken + @param reg region to merge + @param n_threads number of threads to use (passed to htslib) + @param cmd command name (used in print_error() etc) + @param in_fmt format options for input files + @param out_fmt output file format and options + @param write_index create the index, together with the output file + @param arg_list command string for PG line + @param no_pg if 1, do not add a new PG line + @discussion Padding information may NOT correctly maintained. This + function is NOT thread safe. + */ +int bam_merge_core2(SamOrder sam_order, char* sort_tag, const char *out, const char *mode, + const char *headers, int n, char * const *fn, char * const *fn_idx, + const char *fn_bed, int flag, const char *reg, int n_threads, + const char *cmd, const htsFormat *in_fmt, const htsFormat *out_fmt, + int write_index, char *arg_list, int no_pg) +{ + samFile *fpout, **fp = NULL; + heap1_t *heap = NULL; + sam_hdr_t *hout = NULL; + sam_hdr_t *hin = NULL; + int i, j, *RG_len = NULL; + uint64_t idx = 0; + char **RG = NULL; + hts_itr_t **iter = NULL; + sam_hdr_t **hdr = NULL; + trans_tbl_t *translation_tbl = NULL; + int *rtrans = NULL; + char *out_idx_fn = NULL; + void *hreg = NULL; + hts_reglist_t *lreg = NULL; + merged_header_t *merged_hdr = init_merged_header(); + if (!merged_hdr) return -1; + refs_t *refs = NULL; + template_coordinate_keys_t *keys = NULL; + khash_t(const_c2c) *lib_lookup = NULL; + + // Is there a specified pre-prepared header to use for output? + if (headers) { + samFile* fpheaders = sam_open(headers, "r"); + if (fpheaders == NULL) { + print_error_errno(cmd, "cannot open \"%s\"", headers); + return -1; + } + hin = sam_hdr_read(fpheaders); + sam_close(fpheaders); + if (hin == NULL) { + print_error(cmd, "couldn't read headers from \"%s\"", headers); + goto mem_fail; + } + } + + g_sam_order = sam_order; + if (sam_order == TagQueryName || sam_order == TagCoordinate) { + g_sort_tag[0] = sort_tag[0]; + g_sort_tag[1] = sort_tag[0] ? sort_tag[1] : '\0'; + } + + fp = (samFile**)calloc(n, sizeof(samFile*)); + if (!fp) goto mem_fail; + heap = (heap1_t*)calloc(n, sizeof(heap1_t)); + if (!heap) goto mem_fail; + iter = (hts_itr_t**)calloc(n, sizeof(hts_itr_t*)); + if (!iter) goto mem_fail; + hdr = (sam_hdr_t**)calloc(n, sizeof(sam_hdr_t*)); + if (!hdr) goto mem_fail; + translation_tbl = (trans_tbl_t*)calloc(n, sizeof(trans_tbl_t)); + if (!translation_tbl) goto mem_fail; + RG = (char**)calloc(n, sizeof(char*)); + if (!RG) goto mem_fail; + + // prepare RG tag from file names + if (flag & MERGE_RG) { + RG_len = (int*)calloc(n, sizeof(int)); + if (!RG_len) goto mem_fail; + for (i = 0; i != n; ++i) { + int l = strlen(fn[i]); + const char *s = fn[i]; + if (l > 4 && (strcmp(s + l - 4, ".bam") == 0 || strcmp(s + l - 4, ".sam") == 0)) l -= 4; + if (l > 5 && strcmp(s + l - 5, ".cram") == 0) l -= 5; + for (j = l - 1; j >= 0; --j) if (s[j] == '/') break; + ++j; l -= j; + RG[i] = (char*)calloc(l + 1, 1); + if (!RG[i]) goto mem_fail; + RG_len[i] = l; + strncpy(RG[i], s + j, l); + } + } + + if (hin) { + // Populate merged_hdr from the pre-prepared header + trans_tbl_t dummy; + int res; + res = trans_tbl_init(merged_hdr, hin, &dummy, flag & MERGE_COMBINE_RG, + flag & MERGE_COMBINE_PG, true, NULL); + trans_tbl_destroy(&dummy); + if (res) return -1; // FIXME: memory leak + } + + // open and read the header from each file + for (i = 0; i < n; ++i) { + sam_hdr_t *hin; + fp[i] = sam_open_format(fn[i], "r", in_fmt); + if (fp[i] == NULL) { + print_error_errno(cmd, "fail to open \"%s\"", fn[i]); + goto fail; + } + hin = sam_hdr_read(fp[i]); + if (hin == NULL) { + print_error(cmd, "failed to read header from \"%s\"", fn[i]); + goto fail; + } + + if (trans_tbl_init(merged_hdr, hin, translation_tbl+i, + flag & MERGE_COMBINE_RG, flag & MERGE_COMBINE_PG, + (flag & MERGE_FIRST_CO)? (i == 0) : true, + RG[i])) + goto fail; + + hdr[i] = hin; + + int order_ok = 1; + if ((translation_tbl+i)->lost_coord_sort && (sam_order == Coordinate || sam_order == MinHash)) { + fprintf(stderr, "[bam_merge_core] Order of targets in file %s caused coordinate sort to be lost\n", fn[i]); + order_ok = 0; + } + + if (!refs) + refs = cram_get_refs(fp[i]); + + if (order_ok && refs && hts_set_opt(fp[i], CRAM_OPT_SHARED_REF, refs)) + goto fail; + } + + // Did we get an @HD line? + if (!merged_hdr->have_hd) { + fprintf(stderr, "[W::%s] No @HD tag found.\n", __func__); + /* FIXME: Should we add an @HD line here, and if so what should + we put in it? Ideally we want a way of getting htslib to tell + us the SAM version number to assume given no @HD line. Is + it also safe to assume that the output is coordinate sorted? + SO: is optional so we don't have to have it.*/ + /* ksprintf(&merged_hdr->out_hd, "@HD\tVN:1.5\tSO:coordinate\n"); */ + } + + // Transform the header into standard form + if (finish_merged_header(merged_hdr) < 0) + goto fail; + + hout = merged_hdr->hdr; + if (!hout) + goto fail; + + // If we're only merging a specified region move our iters to start at that point + int tid, nreg; + hts_pos_t beg, end; + + if (fn_bed) { + hreg = bed_read(fn_bed); + if (!hreg) { + fprintf(stderr, "[%s] Could not read BED file: \"%s\"\n", __func__, fn_bed); + goto fail; + } + bed_unify(hreg); + lreg = bed_reglist(hreg, ALL, &nreg); + if (!lreg || !nreg) { + fprintf(stderr, "[%s] Null or empty region list\n", __func__); + goto fail; + } + } else if (reg) { + rtrans = rtrans_build(n, sam_hdr_nref(hout), translation_tbl); + if (!rtrans) goto mem_fail; + + if (!sam_parse_region(hout, reg, &tid, &beg, &end, 0)) { + fprintf(stderr, "[%s] Badly formatted region or unknown reference name: \"%s\"\n", __func__, reg); + goto fail; + } + + } + + if (reg || fn_bed) { + hts_idx_t *reg_idx = NULL; + for (i = 0; i < n; ++i) { + + // If index filename has not been specified, look in the BAM folder + if (fn_idx != NULL) { + reg_idx = sam_index_load2(fp[i], fn[i], fn_idx[i]); + } else { + reg_idx = sam_index_load(fp[i], fn[i]); + } + if (reg_idx == NULL) { + fprintf(stderr, "[%s] failed to load index for %s. Random alignment retrieval only works for indexed BAM or CRAM files.\n", + __func__, fn[i]); + free(rtrans); + rtrans = NULL; + goto fail; + } + + int mapped_tid = INT32_MIN; + if (fn_bed) { + hts_reglist_t *rl = duplicate_reglist(lreg, nreg); + iter[i] = sam_itr_regions(reg_idx, hdr[i], rl, nreg); + } else { + // (rtrans[i*n+tid]) Look up what hout tid translates to in input tid space + mapped_tid = rtrans[i*sam_hdr_nref(hout)+tid]; + if (mapped_tid != INT32_MIN) { + iter[i] = sam_itr_queryi(reg_idx, mapped_tid, beg, end); + } else { + iter[i] = sam_itr_queryi(reg_idx, HTS_IDX_NONE, 0, 0); + } + } + + if (iter[i] == NULL) { + if (fn_bed) { + fprintf(stderr, "[%s] failed to get multi-region iterator " + "{%s, %s}\n", __func__, fn[i], fn_bed); + } else { + if (mapped_tid != INT32_MIN) { + fprintf(stderr, + "[%s] failed to get iterator over " + "{%s, %d, %"PRIhts_pos", %"PRIhts_pos"}\n", + __func__, fn[i], mapped_tid, beg, end); + } else { + fprintf(stderr, + "[%s] failed to get iterator over " + "{%s, HTS_IDX_NONE, 0, 0}\n", + __func__, fn[i]); + } + } + hts_idx_destroy(reg_idx); + free(rtrans); + rtrans = NULL; + goto fail; + } + + hts_idx_destroy(reg_idx); + } + + free(rtrans); + rtrans = NULL; + } + + // Make sure that there's enough memory for template coordinate keys, one per file to read + if (sam_order == TemplateCoordinate) { + if ((keys = malloc(sizeof(template_coordinate_keys_t))) == NULL) { + print_error("sort", "could not allocate memory for the top-level keys"); + goto mem_fail; + } + keys->n = 0; + keys->m = 0; + keys->buffer_size = 0x10000; + keys->buffers = NULL; + // Make sure that there's enough memory for template coordinate keys, one per file to read + if (keys->n + n >= keys->m * keys->buffer_size) { + if (template_coordinate_keys_realloc(keys, keys->n + n) < 0) goto mem_fail; + } + lib_lookup = lookup_libraries(hout); + if (!lib_lookup) { + goto mem_fail; + } + } + + // Load the first read from each file into the heap + for (i = 0; i < n; ++i) { + heap1_t *h = heap + i; + int res; + h->i = i; + h->entry.bam_record = bam_init1(); + h->entry.u.tag = NULL; + if (!h->entry.bam_record) goto mem_fail; + res = iter[i] ? sam_itr_next(fp[i], iter[i], h->entry.bam_record) : sam_read1(fp[i], hdr[i], h->entry.bam_record); + if (res >= 0) { + bam_translate(h->entry.bam_record, translation_tbl + i); + h->tid = h->entry.bam_record->core.tid; + h->pos = (uint64_t)(h->entry.bam_record->core.pos + 1); + h->rev = bam_is_rev(h->entry.bam_record); + h->idx = idx++; + if (g_sam_order == TagQueryName || g_sam_order == TagCoordinate) { + h->entry.u.tag = bam_aux_get(h->entry.bam_record, g_sort_tag); + } else if (g_sam_order == TemplateCoordinate) { + template_coordinate_key_t *key = template_coordinate_keys_get(keys, i); // get the next key to use + h->entry.u.key = template_coordinate_key(heap->entry.bam_record, key, hout, lib_lookup); // update the key + if (heap->entry.u.key == NULL) goto mem_fail; // key could not be created, error out + } else { + h->entry.u.tag = NULL; + } + } + else if (res == -1 && (!iter[i] || iter[i]->finished)) { + h->pos = HEAP_EMPTY; + bam_destroy1(h->entry.bam_record); + h->entry.bam_record = NULL; + h->entry.u.tag = NULL; + h->entry.u.key = NULL; + } else { + print_error(cmd, "failed to read first record from \"%s\"", fn[i]); + goto fail; + } + } + + // Open output file and write header + if ((fpout = sam_open_format(out, mode, out_fmt)) == 0) { + print_error_errno(cmd, "failed to create \"%s\"", out); + return -1; + } + if (!no_pg && sam_hdr_add_pg(hout, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error(cmd, "failed to add PG line to the header of \"%s\"", out); + sam_close(fpout); + return -1; + } + if (sam_hdr_write(fpout, hout) != 0) { + print_error_errno(cmd, "failed to write header to \"%s\"", out); + sam_close(fpout); + return -1; + } + if (write_index) { + if (!(out_idx_fn = auto_index(fpout, out, hout))){ + sam_close(fpout); + return -1; + } + } + if (!(flag & MERGE_UNCOMP)) hts_set_threads(fpout, n_threads); + + if (refs && hts_set_opt(fpout, CRAM_OPT_SHARED_REF, refs)) + goto fail; + + // Begin the actual merge + ks_heapmake(heap, n, heap); + while (heap->pos != HEAP_EMPTY) { + bam1_t *b = heap->entry.bam_record; + if (flag & MERGE_RG) { + uint8_t *rg = bam_aux_get(b, "RG"); + if (rg) bam_aux_del(b, rg); + bam_aux_append(b, "RG", 'Z', RG_len[heap->i] + 1, (uint8_t*)RG[heap->i]); + } + if (sam_write1(fpout, hout, b) < 0) { + print_error_errno(cmd, "failed writing to \"%s\"", out); + sam_close(fpout); + free(out_idx_fn); + return -1; + } + if ((j = (iter[heap->i]? sam_itr_next(fp[heap->i], iter[heap->i], b) : sam_read1(fp[heap->i], hdr[heap->i], b))) >= 0) { + bam_translate(b, translation_tbl + heap->i); + heap->tid = b->core.tid; + heap->pos = (uint64_t)(b->core.pos + 1); + heap->rev = bam_is_rev(b); + heap->idx = idx++; + if (g_sam_order == TagQueryName || g_sam_order == TagCoordinate) { + heap->entry.u.tag = bam_aux_get(heap->entry.bam_record, g_sort_tag); + } else if (g_sam_order == TemplateCoordinate) { + template_coordinate_key_t *key = template_coordinate_keys_get(keys, heap->i); // get the next key to use + heap->entry.u.key = template_coordinate_key(heap->entry.bam_record, key, hout, lib_lookup); // update the key + if (heap->entry.u.key == NULL) goto mem_fail; // key could not be created, error out + } else { + heap->entry.u.tag = NULL; + } + } else if (j == -1 && (!iter[heap->i] || iter[heap->i]->finished)) { + heap->pos = HEAP_EMPTY; + bam_destroy1(heap->entry.bam_record); + heap->entry.bam_record = NULL; + heap->entry.u.tag = NULL; + } else { + print_error(cmd, "\"%s\" is truncated", fn[heap->i]); + goto fail; + } + ks_heapadjust(heap, 0, n, heap); + } + + if (write_index) { + if (sam_idx_save(fpout) < 0) { + print_error_errno("merge", "writing index failed"); + goto fail; + } + } + free(out_idx_fn); + + // Clean up and close + if (flag & MERGE_RG) { + for (i = 0; i != n; ++i) free(RG[i]); + free(RG_len); + } + for (i = 0; i < n; ++i) { + trans_tbl_destroy(translation_tbl + i); + hts_itr_destroy(iter[i]); + sam_hdr_destroy(hdr[i]); + sam_close(fp[i]); + } + sam_hdr_destroy(hin); + sam_hdr_destroy(hout); + free_merged_header(merged_hdr); + hts_reglist_free(lreg, nreg); + bed_destroy(hreg); + free(RG); free(translation_tbl); free(fp); free(heap); free(iter); free(hdr); + if (sam_close(fpout) < 0) { + print_error(cmd, "error closing output file"); + return -1; + } + return 0; + + mem_fail: + print_error(cmd, "Out of memory"); + + fail: + if (flag & MERGE_RG) { + if (RG) { + for (i = 0; i != n; ++i) free(RG[i]); + } + free(RG_len); + } + for (i = 0; i < n; ++i) { + if (translation_tbl && translation_tbl[i].tid_trans) trans_tbl_destroy(translation_tbl + i); + if (iter && iter[i]) hts_itr_destroy(iter[i]); + if (hdr && hdr[i]) sam_hdr_destroy(hdr[i]); + if (fp && fp[i]) sam_close(fp[i]); + if (heap && heap[i].entry.bam_record) bam_destroy1(heap[i].entry.bam_record); + } + if (hout) sam_hdr_destroy(hout); + free(RG); + free(translation_tbl); + free(hdr); + hts_reglist_free(lreg, nreg); + bed_destroy(hreg); + free(iter); + free(heap); + free(fp); + free(rtrans); + free(out_idx_fn); + if (keys != NULL) { + for (i = 0; i < keys->m; ++i) { + free(keys->buffers[i]); + } + free(keys->buffers); + free(keys); + } + lib_lookup_destroy(lib_lookup); + return -1; +} + +// Unused here but may be used by legacy samtools-using third-party code +int bam_merge_core(int by_qname, const char *out, const char *headers, int n, char * const *fn, int flag, const char *reg) +{ + char mode[12]; + strcpy(mode, "wb"); + if (flag & MERGE_UNCOMP) strcat(mode, "0"); + else if (flag & MERGE_LEVEL1) strcat(mode, "1"); + SamOrder sam_order = by_qname ? QueryName : Coordinate; + return bam_merge_core2(sam_order, NULL, out, mode, headers, n, fn, NULL, NULL, flag, reg, 0, "merge", NULL, NULL, 0, NULL, 1); +} + +static void merge_usage(FILE *to) +{ + fprintf(to, +"Usage: samtools merge [options] -o [options] ... \n" +" or: samtools merge [options] ... \n" +"\n" +"Options:\n" +" -n Input files are sorted by read name\n" +" -t TAG Input files are sorted by TAG value\n" +" -r Attach RG tag (inferred from file names)\n" +" -u Uncompressed BAM output\n" +" -f Overwrite the output BAM if exist\n" +" -o FILE Specify output file via option instead of argument\n" +" -1 Compress level 1\n" +" -l INT Compression level, from 0 to 9 [-1]\n" +" -R STR Merge file in the specified region STR [all]\n" +" -h FILE Copy the header in FILE to [in1.bam]\n" +" -c Combine @RG headers with colliding IDs [alter IDs to be distinct]\n" +" -p Combine @PG headers with colliding IDs [alter IDs to be distinct]\n" +" -s VALUE Override random seed\n" +" -b FILE List of input BAM filenames, one per line [null]\n" +" -X Use customized index files\n" +" -L FILE Specify a BED file for multiple region filtering [null]\n" +" --no-PG do not add a PG line\n" +" --template-coordinate Input files are sorted by template-coordinate\n"); + sam_global_opt_help(to, "-.O..@.."); +} + +int bam_merge(int argc, char *argv[]) +{ + int c, flag = 0, ret = 0, level = -1, has_index_file = 0; + char *fn_headers = NULL, *reg = NULL, mode[12]; + char *sort_tag = NULL, *fnout = NULL, *arg_list = NULL; + long random_seed = (long)time(NULL); + char** fn = NULL; + char** fn_idx = NULL, *fn_bed = NULL; + int fn_size = 0, no_pg = 0; + SamOrder sam_order = Coordinate; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + { "threads", required_argument, NULL, '@' }, + {"no-PG", no_argument, NULL, 1}, + { "template-coordinate", no_argument, NULL, 2}, + { NULL, 0, NULL, 0 } + }; + + if (argc == 1) { + merge_usage(stdout); + return 0; + } + + while ((c = getopt_long(argc, argv, "h:nru1R:o:f@:l:cps:b:O:t:XL:", lopts, NULL)) >= 0) { + switch (c) { + case 'r': flag |= MERGE_RG; break; + case 'f': flag |= MERGE_FORCE; break; + case 'h': fn_headers = optarg; break; + case 'n': sam_order = QueryName; break; + case 'o': fnout = optarg; break; + case 't': sort_tag = optarg; break; + case '1': flag |= MERGE_LEVEL1; level = 1; break; + case 'u': flag |= MERGE_UNCOMP; level = 0; break; + case 'R': reg = strdup(optarg); break; + case 'l': level = atoi(optarg); break; + case 'c': flag |= MERGE_COMBINE_RG; break; + case 'p': flag |= MERGE_COMBINE_PG; break; + case 's': random_seed = atol(optarg); break; + case 'X': has_index_file = 1; break; // -X flag for index filename + case 'L': fn_bed = optarg; break; + case 'b': { + // load the list of files to read + if (has_index_file) { + fprintf(stderr,"Error: The -b option cannot be combined with -X\n"); + ret = 1; goto end; + } + int nfiles; + char **fn_read = hts_readlines(optarg, &nfiles); + if (fn_read) { + // Append to end of array + fn = realloc(fn, (fn_size+nfiles) * sizeof(char*)); + if (fn == NULL) { ret = 1; goto end; } + memcpy(fn+fn_size, fn_read, nfiles * sizeof(char*)); + fn_size += nfiles; + free(fn_read); + } + else { + print_error("merge", "Invalid file list \"%s\"", optarg); + ret = 1; + } + break; + } + case 1: no_pg = 1; break; + case 2: sam_order = TemplateCoordinate; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': merge_usage(stderr); return 1; + } + } + + if (sort_tag != NULL) { + sam_order = sam_order == QueryName ? TagQueryName : TagCoordinate; + } + + if (fnout == NULL && argc - optind >= 1) { + fnout = argv[optind]; + optind++; + } + if (fnout == NULL) { + print_error("merge", "You must at least specify the output file"); + merge_usage(stderr); + return 1; + } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("merge", "failed to create arg_list"); + return 1; + } + + hts_srand48(random_seed); + if (!(flag & MERGE_FORCE) && strcmp(fnout, "-") != 0) { + struct stat sbuf; + if (stat(fnout, &sbuf) == 0 && S_ISREG(sbuf.st_mode)) { + fprintf(stderr, "[%s] File '%s' exists. Please apply '-f' to overwrite. Abort.\n", __func__, fnout); + ret = 1; + goto end; + } + } + + int nargcfiles = 0; + if (has_index_file) { // Calculate # of input BAM files + if ((argc - optind) % 2 != 0) { + fprintf(stderr, "Odd number of filenames detected! Each BAM file should have an index file\n"); + ret = 1; + goto end; + } + nargcfiles = (argc - optind) / 2; + } else { + nargcfiles = argc - optind; + } + + if (nargcfiles > 0) { + // Add argc files to end of array + fn = realloc(fn, (fn_size+nargcfiles) * sizeof(char*)); + if (fn == NULL) { ret = 1; goto end; } + memcpy(fn+fn_size, argv + optind, nargcfiles * sizeof(char*)); + + if(has_index_file) { + fn_idx = realloc(fn_idx, nargcfiles * sizeof(char*)); + if (fn_idx == NULL) { ret = 1; goto end; } + memcpy(fn_idx+fn_size, argv + nargcfiles + optind, nargcfiles * sizeof(char*)); + } + } + if (fn_size+nargcfiles < 1) { + print_error("merge", "You must specify at least one (and usually two or more) input files"); + merge_usage(stderr); + ret = 1; + goto end; + } + + if (reg && fn_bed) { + print_error("merge", "You must specify either a BED file or a region"); + ret = 1; + goto end; + } + strcpy(mode, "wb"); + sam_open_mode(mode+1, fnout, NULL); + if (level >= 0) sprintf(strchr(mode, '\0'), "%d", level < 9? level : 9); + if (bam_merge_core2(sam_order, sort_tag, fnout, mode, fn_headers, + fn_size+nargcfiles, fn, fn_idx, fn_bed, flag, reg, ga.nthreads, + "merge", &ga.in, &ga.out, ga.write_index, arg_list, no_pg) < 0) + ret = 1; + +end: + if (fn_size > 0) { + int i; + for (i=0; ii, res; + if (i < nfiles) { // read from file + res = sam_read1(fp[i], hout, heap->entry.bam_record); + if (res >= 0 && g_sam_order == TemplateCoordinate) { // file read OK and TemplateCoordinate order + // It is assumed that there are nfiles more keys allocated than keys->n; see allocation in bam_merge_simple + template_coordinate_key_t *key = template_coordinate_keys_get(keys, keys->n + i); // get the next key to use + heap->entry.u.key = template_coordinate_key(heap->entry.bam_record, key, hout, lib_lookup); // update the key + if (heap->entry.u.key == NULL) res = -1; // key could not be created, error out + } + } else { // read from memory + if (in_mem[i - nfiles].from < in_mem[i - nfiles].to) { + size_t from = in_mem[i - nfiles].from; + heap->entry.bam_record = buf[from].bam_record; + if (g_sam_order == TemplateCoordinate) heap->entry.u.key = buf[from].u.key; + in_mem[i - nfiles].from++; + res = 0; + } else { + res = -1; + } + } + if (res >= 0) { + heap->tid = heap->entry.bam_record->core.tid; + heap->pos = (uint64_t)(heap->entry.bam_record->core.pos + 1); + heap->rev = bam_is_rev(heap->entry.bam_record); + heap->idx = (*idx)++; + if (g_sam_order == TagQueryName || g_sam_order == TagCoordinate) { + heap->entry.u.tag = bam_aux_get(heap->entry.bam_record, g_sort_tag); + } else if (g_sam_order != TemplateCoordinate) { + heap->entry.u.tag = NULL; + heap->entry.u.key = NULL; + } + } else if (res == -1) { + heap->pos = HEAP_EMPTY; + if (i < nfiles) bam_destroy1(heap->entry.bam_record); + heap->entry.bam_record = NULL; + heap->entry.u.tag = NULL; + heap->entry.u.key = NULL; + } else { + return -1; + } + return 0; +} + +static int bam_merge_simple(SamOrder sam_order, char *sort_tag, const char *out, + const char *mode, sam_hdr_t *hout, + int n, char * const *fn, int num_in_mem, + buf_region *in_mem, bam1_tag *buf, + template_coordinate_keys_t *keys, + khash_t(const_c2c) *lib_lookup, int n_threads, + const char *cmd, const htsFormat *in_fmt, + const htsFormat *out_fmt, char *arg_list, int no_pg, + int write_index) { + samFile *fpout = NULL, **fp = NULL; + heap1_t *heap = NULL; + uint64_t idx = 0; + int i, heap_size = n + num_in_mem; + char *out_idx_fn = NULL; + + if (sam_order == TagQueryName || sam_order == TagCoordinate) { + g_sort_tag[0] = sort_tag[0]; + g_sort_tag[1] = sort_tag[0] ? sort_tag[1] : '\0'; + } + if (n > 0) { + fp = (samFile**)calloc(n, sizeof(samFile*)); + if (!fp) goto mem_fail; + } + heap = (heap1_t*)calloc(heap_size, sizeof(heap1_t)); + if (!heap) goto mem_fail; + + // Make sure that there's enough memory for template coordinate keys, one per file to read + if (keys && keys->n + n >= keys->m * keys->buffer_size) { + if (template_coordinate_keys_realloc(keys, keys->n + n) < 0) goto mem_fail; + } + + // Open each file, read the header and put the first read into the heap + for (i = 0; i < heap_size; i++) { + sam_hdr_t *hin; + heap1_t *h = &heap[i]; + + if (i < n) { + fp[i] = sam_open_format(fn[i], "r", in_fmt); + if (fp[i] == NULL) { + print_error_errno(cmd, "fail to open \"%s\"", fn[i]); + goto fail; + } + + // Read header ... + hin = sam_hdr_read(fp[i]); + if (hin == NULL) { + print_error(cmd, "failed to read header from \"%s\"", fn[i]); + goto fail; + } + // ... and throw it away as we don't really need it + sam_hdr_destroy(hin); + } + + // Get a read into the heap + h->i = i; + h->entry.u.tag = NULL; + h->entry.u.key = NULL; + if (i < n) { + h->entry.bam_record = bam_init1(); + if (!h->entry.bam_record) goto mem_fail; + } + if (heap_add_read(h, n, fp, num_in_mem, in_mem, buf, keys, &idx, hout, + lib_lookup) < 0) { + assert(i < n); + print_error(cmd, "failed to read first record from \"%s\"", fn[i]); + goto fail; + } + } + + // Open output file and write header + if ((fpout = sam_open_format(out, mode, out_fmt)) == 0) { + print_error_errno(cmd, "failed to create \"%s\"", out); + return -1; + } + + if (!no_pg && sam_hdr_add_pg(hout, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error(cmd, "failed to add PG line to the header of \"%s\"", out); + sam_close(fpout); + return -1; + } + + if (n_threads > 1) hts_set_threads(fpout, n_threads); + + if (sam_hdr_write(fpout, hout) != 0) { + print_error_errno(cmd, "failed to write header to \"%s\"", out); + sam_close(fpout); + return -1; + } + + if (write_index) { + if (!(out_idx_fn = auto_index(fpout, out, hout))){ + sam_close(fpout); + return -1; + } + } + + // Now do the merge + ks_heapmake(heap, heap_size, heap); + while (heap->pos != HEAP_EMPTY) { + bam1_t *b = heap->entry.bam_record; + if (g_sam_order == MinHash && b->core.tid == -1) { + // Remove the cached minhash value + b->core.pos = -1; + b->core.mpos = -1; + b->core.isize = 0; + } + if (sam_write1(fpout, hout, b) < 0) { + print_error_errno(cmd, "failed writing to \"%s\"", out); + goto fail; + } + if (heap_add_read(heap, n, fp, num_in_mem, in_mem, buf, keys, &idx, + hout, lib_lookup) < 0) { + assert(heap->i < n); + print_error(cmd, "Error reading \"%s\" : %s", + fn[heap->i], strerror(errno)); + goto fail; + } + ks_heapadjust(heap, 0, heap_size, heap); + } + // Clean up and close + for (i = 0; i < n; i++) { + if (sam_close(fp[i]) != 0) { + print_error(cmd, "Error on closing \"%s\" : %s", + fn[i], strerror(errno)); + } + } + free(fp); + free(heap); + + if (write_index) { + if (sam_idx_save(fpout) < 0) { + print_error_errno("merge", "writing index failed"); + goto fail; + } + free(out_idx_fn); + } + + if (sam_close(fpout) < 0) { + print_error(cmd, "error closing output file"); + return -1; + } + return 0; + mem_fail: + print_error(cmd, "Out of memory"); + + fail: + for (i = 0; i < n; i++) { + if (fp && fp[i]) sam_close(fp[i]); + } + for (i = 0; i < heap_size; i++) { + if (heap && heap[i].i < n && heap[i].entry.bam_record) + bam_destroy1(heap[i].entry.bam_record); + } + free(fp); + free(heap); + if (fpout) sam_close(fpout); + free(out_idx_fn); + return -1; +} + +// Function to compare reads and determine which one is < or > the other +// Handle sort-by-pos and sort-by-name. Used as the secondary sort in bam1_lt_by_tag, if reads are equivalent by tag. +// Returns a value less than, equal to or greater than zero if a is less than, +// equal to or greater than b, respectively. +static inline int bam1_cmp_core(const bam1_tag a, const bam1_tag b) +{ + uint64_t pa, pb; + if (!a.bam_record) return 1; + if (!b.bam_record) return 0; + + if (g_sam_order == QueryName || g_sam_order == TagQueryName) { + int t = strnum_cmp(bam_get_qname(a.bam_record), bam_get_qname(b.bam_record)); + if (t != 0) return t; + return (int) (a.bam_record->core.flag&0xc0) - (int) (b.bam_record->core.flag&0xc0); + } else { + pa = a.bam_record->core.tid; + pb = b.bam_record->core.tid; + + if (pa == pb) { + pa = (uint64_t)(a.bam_record->core.pos+1); + pb = (uint64_t)(b.bam_record->core.pos+1); + } + + if (pa == pb) { + pa = bam_is_rev(a.bam_record); + pb = bam_is_rev(b.bam_record); + } + + return pa < pb ? -1 : (pa > pb ? 1 : 0); + } +} + +uint8_t normalize_type(const uint8_t* aux) { + if (*aux == 'c' || *aux == 'C' || *aux == 's' || *aux == 'S' || *aux == 'i' || *aux == 'I') { + return 'c'; + } else if (*aux == 'f' || *aux == 'd') { + return 'f'; + } else if (*aux == 'H' || *aux == 'Z') { + return 'H'; + } else { + return *aux; + } +} + +// Sort record by tag, using pos or read name as a secondary key if tags are identical. Reads not carrying the tag sort first. +// Tags are first sorted by the type character (in case the types differ), or by the appropriate comparator for that type if they agree. +// Returns a value less than, equal to or greater than zero if a is less than, +// equal to or greater than b, respectively. +static inline int bam1_cmp_by_tag(const bam1_tag a, const bam1_tag b) +{ + const uint8_t* aux_a = a.u.tag; + const uint8_t* aux_b = b.u.tag; + + if (aux_a == NULL && aux_b != NULL) { + return -1; + } else if (aux_a != NULL && aux_b == NULL) { + return 1; + } else if (aux_a == NULL && aux_b == NULL) { + return bam1_cmp_core(a,b); + } + + // 'Normalize' the letters of the datatypes to a canonical letter, + // so that comparison of different types + // forms a correct total ordering. + uint8_t a_type = normalize_type(aux_a); + uint8_t b_type = normalize_type(aux_b); + + if (a_type != b_type) { + // Fix int to float comparisons by using bam_aux2f() to read the int + if (a_type == 'c' && b_type == 'f') { + a_type = 'f'; + } else if (a_type == 'f' && b_type == 'c') { + b_type = 'f'; + } else { + // Unfixable mismatched types + return a_type < b_type ? -1 : 1; + } + } + + if (a_type == 'c') { + int64_t va = bam_aux2i(aux_a); + int64_t vb = bam_aux2i(aux_b); + if (va != vb) return va < vb ? -1 : 1; + return bam1_cmp_core(a, b); + } else if (a_type == 'f') { + double va = bam_aux2f(aux_a); + double vb = bam_aux2f(aux_b); + if (va != vb) return va < vb ? -1 : 1; + return bam1_cmp_core(a, b); + } else if (a_type == 'A') { + unsigned char va = bam_aux2A(aux_a); + unsigned char vb = bam_aux2A(aux_b); + if (va != vb) return va < vb ? -1 : 1; + return bam1_cmp_core(a, b); + } else if (a_type == 'H') { + int t = strcmp(bam_aux2Z(aux_a), bam_aux2Z(aux_b)); + if (t) return t; + return bam1_cmp_core(a, b); + } else { + return bam1_cmp_core(a,b); + } +} + +// Sort by minimiser (stored in bam1_tag.u.pos). +// If equal, sort by position. +// +// The 64-bit sort key is split over the bam pos and isize fields. +// This permits it to survive writing to temporary file and coming back. +static inline int bam1_cmp_by_minhash(const bam1_tag a, const bam1_tag b) +{ + const bam1_t *A = a.bam_record; + const bam1_t *B = b.bam_record; + + if (!A) return 1; + if (!B) return 0; + + if (A->core.tid != -1 || B->core.tid != -1) return bam1_cmp_core(a,b); + + const uint64_t m_a = (((uint64_t)A->core.pos)<<32)|(uint32_t)A->core.mpos; + const uint64_t m_b = (((uint64_t)B->core.pos)<<32)|(uint32_t)B->core.mpos; + + if (m_a < m_b) // by hash + return -1; + else if (m_a > m_b) + return 1; + else if (A->core.isize < B->core.isize) // by hash location in seq + return -1; + else if (A->core.isize > B->core.isize) + return 1; + else + return bam1_cmp_core(a,b); +} + +// compares to molecular identifiers, ignoring any trailing slash and subsequent single-character +// * if mid1 is less than mid2, then -1 will be returned +// * if mid1 is greater than mid2, then 1 will be returned +static inline int template_coordinate_key_compare_mid(const char* mid1, const char* mid2) { + size_t i = 0; + size_t len1 = strlen(mid1); + size_t len2 = strlen(mid2); + size_t shortest; + + // Snip off trailing slash followed by a single character, if present + if (len1 >= 2 && mid1[len1-2] == '/') len1 -= 2; + if (len2 >= 2 && mid2[len2-2] == '/') len2 -= 2; + shortest = len1 < len2 ? len1 : len2; + + // find first mismatching character + while (i < shortest && mid1[i] == mid2[i]) i++; + + // compare last characters + if (i == len1 && i < len2) return -1; // mid1 shorter + if (i == len2 && i < len1) return 1; // mid2 shorter + if (i == len1 && i == len2) return 0; // all characters match + if (mid1[i] < mid2[i]) return -1; // mid1 earlier + else return 1; +} + + +// Builds a key use to sort in TemplateCoordinate order. Returns NULL if the key could not be created (e.g. MC +// tag is missing), otherwise the pointer to the provided key. +static template_coordinate_key_t* template_coordinate_key(bam1_t *b, template_coordinate_key_t *key, sam_hdr_t *hdr, khash_t(const_c2c) *lib_lookup) { + uint8_t *data; + char *rg; + khiter_t k; + + // defaults + key->tid1 = key->tid2 = INT32_MAX; + key->pos1 = key->pos2 = HTS_POS_MAX; + key->neg1 = key->neg2 = false; + key->mid = ""; + + // update values + rg = (char *)bam_aux_get(b, "RG"); + if (rg && rg[0] == 'Z' + &&(k = kh_get(const_c2c, lib_lookup, rg + 1)) < kh_end(lib_lookup)) { + key->library = kh_value(lib_lookup, k); + } else { + key->library = ""; + } + key->name = bam_get_qname(b); + if (!(b->core.flag & BAM_FUNMAP)) { // read is mapped, update coordinates + key->tid1 = b->core.tid; + key->neg1 = bam_is_rev(b); + key->pos1 = (key->neg1) ? unclipped_end(b) : unclipped_start(b); + } + if (b->core.flag & BAM_FPAIRED && !(b->core.flag & BAM_FMUNMAP)) { // mate is mapped, update coordinates + char *cigar; + if ((data = bam_aux_get(b, "MC"))) { + if (!(cigar = bam_aux2Z(data))) { + fprintf(stderr, "[bam_sort] error: MC tag wrong type. Please use the MC tag provided by samtools fixmate.\n"); + return NULL; + } + } else { + fprintf(stderr, "[bam_sort] error: no MC tag. Please run samtools fixmate on file first.\n"); + return NULL; + } + key->tid2 = b->core.mtid; + key->neg2 = bam_is_mrev(b); + key->pos2 = (key->neg2) ? unclipped_other_end(b->core.mpos, cigar) : unclipped_other_start(b->core.mpos, cigar); + } + + if ((data = bam_aux_get(b, "MI"))) { + if (!(key->mid=bam_aux2Z(data))) { + fprintf(stderr, "[bam_sort] error: MI tag wrong type (not a string).\n"); + return NULL; + } + } + + // set is_upper_of_pair, and swap if we get the same key regardless of which end + // of the pair it is + if (key->tid1 < key->tid2 + || (key->tid1 == key->tid2 && key->pos1 < key->pos2) + || (key->tid1 == key->tid2 && key->pos1 == key->pos2 && !key->neg1)) { + key->is_upper_of_pair = false; + } else { + key->is_upper_of_pair = true; + // swap + int tmp_tid; + hts_pos_t tmp_pos; + bool tmp_neg; + tmp_tid = key->tid1; + key->tid1 = key->tid2; + key->tid2 = tmp_tid; + tmp_pos = key->pos1; + key->pos1 = key->pos2; + key->pos2 = tmp_pos; + tmp_neg = key->neg1; + key->neg1 = key->neg2; + key->neg2 = tmp_neg; + } + + return key; +} + +// Function to compare reads and determine which one is < or > the other +// Handles template-coordinate, which sorts by: +// 1. the earlier unclipped 5' coordinate of the read pair +// 2. the higher unclipped 5' coordinate of the read pair +// 3. library (from read group) +// 4. the molecular identifier (if present) +// 5. read name +// 6. if unpaired, or if R1 has the lower coordinates of the pair +// Returns a value less than, equal to or greater than zero if a is less than, +// equal to or greater than b, respectively. +static inline int bam1_cmp_template_coordinate(const bam1_tag a, const bam1_tag b) +{ + if (!a.bam_record) return 1; + if (!b.bam_record) return 0; + + const template_coordinate_key_t* key_a = a.u.key; + const template_coordinate_key_t* key_b = b.u.key; + + int retval = 0; + if (0 == retval) retval = key_a->tid1 - key_b->tid1; + if (0 == retval) retval = key_a->tid2 - key_b->tid2; + if (0 == retval) retval = key_a->pos1 < key_b->pos1 ? -1 : (key_a->pos1 > key_b->pos1 ? 1 : 0); + if (0 == retval) retval = key_a->pos2 < key_b->pos2 ? -1 : (key_a->pos2 > key_b->pos2 ? 1 : 0); + if (0 == retval) retval = key_a->neg1 == key_b->neg1 ? 0 : (key_a->neg1 ? -1 : 1); + if (0 == retval) retval = key_a->neg2 == key_b->neg2 ? 0 : (key_a->neg2 ? -1 : 1); + if (0 == retval) retval = strcmp(key_a->library, key_b->library); + if (0 == retval) retval = template_coordinate_key_compare_mid(key_a->mid, key_b->mid); + if (0 == retval) retval = strcmp(key_a->name, key_b->name); + if (0 == retval) retval = key_a->is_upper_of_pair == key_b->is_upper_of_pair ? 0 : (key_a->is_upper_of_pair ? 1 : -1); + return retval < 0 ? -1 : (retval > 0 ? 1 : 0); +} + + +// Function to compare reads and determine which one is < the other +// Handle sort-by-pos, sort-by-name, sort-by-tag, or sort-by-template-coordinate. +static inline int bam1_lt(const bam1_tag a, const bam1_tag b) +{ + switch (g_sam_order) { + case Coordinate: + case QueryName: + return bam1_cmp_core(a, b) < 0; + case TagQueryName: + case TagCoordinate: + return bam1_cmp_by_tag(a, b) < 0; + case MinHash: + return bam1_cmp_by_minhash(a, b) < 0; + case TemplateCoordinate: + return bam1_cmp_template_coordinate(a, b) < 0; + default: + return bam1_cmp_core(a,b) < 0; + } +} + + + +KSORT_INIT(sort, bam1_tag, bam1_lt) + +typedef struct { + size_t buf_len; + const char *prefix; + bam1_tag *buf; + const sam_hdr_t *h; + char *tmpfile_name; + int index; + int error; + int no_save; + int large_pos; + int minimiser_kmer; +} worker_t; + +// Returns 0 for success +// -1 for failure +static int write_buffer(const char *fn, const char *mode, size_t l, bam1_tag *buf, + const sam_hdr_t *h, int n_threads, const htsFormat *fmt, + int clear_minhash, char *arg_list, int no_pg, int write_index) +{ + size_t i; + samFile* fp; + char *out_idx_fn = NULL; + + fp = sam_open_format(fn, mode, fmt); + if (fp == NULL) return -1; + if (!no_pg && sam_hdr_add_pg((sam_hdr_t *)h, "samtools", "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + goto fail; + } + if (sam_hdr_write(fp, h) != 0) goto fail; + + if (write_index) + if (!(out_idx_fn = auto_index(fp, fn, (sam_hdr_t *)h))) goto fail; + + if (n_threads > 1) hts_set_threads(fp, n_threads); + for (i = 0; i < l; ++i) { + bam1_t *b = buf[i].bam_record; + if (clear_minhash && b->core.tid == -1) { + // Remove the cached minhash value + b->core.pos = -1; + b->core.mpos = -1; + b->core.isize = 0; + } + if (sam_write1(fp, h, b) < 0) goto fail; + } + + if (write_index) { + if (sam_idx_save(fp) < 0) { + print_error_errno("merge", "writing index failed"); + goto fail; + } + free(out_idx_fn); + } + + + if (sam_close(fp) < 0) return -1; + return 0; + fail: + sam_close(fp); + free(out_idx_fn); + return -1; +} + +#define NUMBASE 256 + +static int ks_radixsort(size_t n, bam1_tag *buf, const sam_hdr_t *h) +{ + int curr = 0, ret = -1; + ssize_t i; + bam1_tag *buf_ar2[2], *bam_a, *bam_b; + uint64_t max_pos = 1; + uint32_t max_tid = 1, tid_bytes = 0, pos_bytes = 0, byte = 0; + uint32_t tid_shift_l, tid_shift_r; + int nref = sam_hdr_nref(h); + + // Count number of bytes needed for biggest tid and pos + // Notes: Add 1 to core.pos so always positive. + // Convert unmapped tid (-1) to number of references so unmapped + // sort to the end. + for (i = 0; i < n; i++) { + bam1_t *b = buf[i].bam_record; + uint32_t tid = b->core.tid == -1 ? nref : b->core.tid; + uint64_t pos = ((uint64_t)(b->core.pos + 1) << 1) | bam_is_rev(b); + if (max_tid < tid) + max_tid = tid; + if (max_pos < pos) + max_pos = pos; + } + + for (; max_pos > 0; max_pos >>= 8) pos_bytes++; + for (; max_tid > 0; max_tid >>= 8) tid_bytes++; + assert(pos_bytes + tid_bytes < sizeof(buf[0].u.pos_tid)); + + tid_shift_l = pos_bytes * 8; + tid_shift_r = 64 - tid_shift_l; + + // Write position and tid into bam1_tag::u::pos_tid using minimum number + // of bytes required. Values are stored little-endian so that we + // get a least-significant digit (byte) radix sort. + for (i = 0; i < n; i++) { + bam1_t *b = buf[i].bam_record; + uint32_t tid = b->core.tid == -1 ? nref : b->core.tid; + // 'pos' here includes as many bytes of tid as will fit + // in the space remaining above pos_bytes. The rest of tid + // is written out separately. + uint64_t pos = (bam_is_rev(b) | + ((uint64_t)(b->core.pos + 1) << 1) | + (tid_shift_l < 64 ? (uint64_t) tid << tid_shift_l : 0)); + u64_to_le(pos, buf[i].u.pos_tid); + u32_to_le(tid_shift_r < 32 ? tid >> tid_shift_r : 0, + &buf[i].u.pos_tid[8]); + } + + buf_ar2[0] = buf; + buf_ar2[1] = (bam1_tag *)malloc(sizeof(bam1_tag) * n); + if (buf_ar2[1] == NULL) { + print_error("sort", "couldn't allocate memory for temporary buf"); + goto err; + } + + // Least-significant digit radix sort (where "digits" are bytes) + for (byte = 0; byte < pos_bytes + tid_bytes; byte++) { + size_t remainders[NUMBASE] = { 0 }; + bam_a = buf_ar2[curr]; bam_b = buf_ar2[1-curr]; + for (i = 0; i < n; ++i) + remainders[bam_a[i].u.pos_tid[byte]]++; + for (i = 1; i < NUMBASE; ++i) + remainders[i] += remainders[i - 1]; + for (i = n - 1; i >= 0; i--) { + size_t j = --remainders[bam_a[i].u.pos_tid[byte]]; + bam_b[j] = bam_a[i]; + } + curr = 1 - curr; + } + if (curr == 1) { + bam1_tag *end = buf + n; + bam_a = buf_ar2[0]; bam_b = buf_ar2[1]; + while (bam_a < end) *bam_a++ = *bam_b++; + } + + ret = 0; +err: + free(buf_ar2[1]); + return ret; +} + +/* + * Computes the minhash of a sequence using both forward and reverse strands. + * + * This is used as a sort key for unmapped data, to collate like sequences + * together and to improve compression ratio. + * + * The minhash is returned and *pos filled out with location of this hash + * key in the sequence if pos != NULL. + */ +static uint64_t minhash(bam1_t *b, int kmer, int *pos, int *rev) { + uint64_t hashf = 0, minhashf = UINT64_MAX; + uint64_t hashr = 0, minhashr = UINT64_MAX; + int minhashpf = 0, minhashpr = 0, i; + uint64_t mask = (1L<<(2*kmer))-1; + unsigned char *seq = bam_get_seq(b); + int len = b->core.l_qseq; + + // Lookup tables for bam_seqi to 0123 fwd/rev hashes + // =ACM GRSV TWYH KDBN +#define X 0 + unsigned char L[16] = { + X,0,1,X, 2,X,X,X, 3,X,X,X, X,X,X,X, + }; + uint64_t R[16] = { + X,3,2,X, 1,X,X,X, 0,X,X,X, X,X,X,X, + }; + for (i = 0; i < 16; i++) + R[i] <<= 2*(kmer-1); + + // Punt homopolymers somewhere central in the hash space +#define XOR (0xdead7878beef7878 & mask) + + // Initialise hash keys + for (i = 0; i < kmer-1 && i < len; i++) { + int base = bam_seqi(seq, i); + hashf = (hashf<<2) | L[base]; + hashr = (hashr>>2) | R[base]; + } + + // Loop to find minimum + for (; i < len; i++) { + int base = bam_seqi(seq, i); + + hashf = ((hashf<<2) | L[base]) & mask; + hashr = (hashr>>2) | R[base]; + + if (minhashf > (hashf^XOR)) + minhashf = (hashf^XOR), minhashpf = i; + if (minhashr > (hashr^XOR)) + minhashr = (hashr^XOR), minhashpr = len-i+kmer-2; + + } + + if (minhashf <= minhashr) { + if (rev) *rev = 0; + if (pos) *pos = minhashpf; + return minhashf; + } else { + if (rev) *rev = 1; + if (pos) *pos = minhashpr; + return minhashr; + } +} + +//--- Start of candidates to punt to htslib +/*! + * @abstract + * Extracts the sequence (in current alignment orientation) from + * a bam record and places it in buf, which is nul terminated. + * + * @param b The bam structure + * @param buf A buffer at least b->core.l_qseq+1 bytes long + */ +static void bam_to_seq(bam1_t *b, char *buf) { + int i; + uint8_t *seq = bam_get_seq(b); + for (i = 0; i < b->core.l_qseq; i++) + buf[i] = seq_nt16_str[bam_seqi(seq, i)]; + buf[i] = 0; +} + +/*! + * @abstract + * Writes a new sequence, of length b->core.l_qseq, to a BAM record. + * + * If a sequence of a new length is required the caller must first make + * room for it by updating the bam1_t struct. + * + * @param b The bam structure + * @param buf A buffer at least b->core.l_qseq bytes long + */ +static void seq_to_bam(bam1_t *b, char *buf) { + int i; + uint8_t *seq = bam_get_seq(b); + for (i = 0; i < b->core.l_qseq; i++) + bam_set_seqi(seq, i, seq_nt16_table[(unsigned char)buf[i]]); +} + +/*! + * @abstract Reverse complements a BAM record. + * + * It's possible to do this inline, but complex due to the 4-bit sequence + * encoding. For now I take the dumb approach. + * + * @param b Pointer to a BAM alignment + * + * @return 0 on success, -1 on failure (ENOMEM) + */ +static int reverse_complement(bam1_t *b) { + static char comp[256] = { + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//00 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//10 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//20 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//30 + + // * * * * E F * * I J * L * * O + '@','T','V','G', 'H','E','F','C', 'D','I','H','M', 'L','K','N','O',//40 + //P Q * * * * * * X Y Z [ \ ] ^ _ + 'P','Q','Y','S', 'A','A','B','W', 'X','Y','Z','[','\\','[','^','_',//50 + //` * * * * E F * * I J * L * * O + '`','t','v','g', 'h','e','f','c', 'd','i','j','m', 'l','k','n','o',//60 + //P Q * * * * * * X Y Z { | } ~ DEL + 'p','q','y','s', 'a','a','b','w', 'x','y','z','{', '|','}','~',127,//70 + + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//80 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//90 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//A0 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//B0 + + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//C0 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//D0 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//E0 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//F0 + }; + char seq_[10000], *seq = seq_; + uint8_t *qual = bam_get_qual(b); + int i, j; + + if (b->core.l_qseq >= 10000) + if (!(seq = malloc(b->core.l_qseq+1))) + return -1; + + bam_to_seq(b, seq); + + for (i = 0, j = b->core.l_qseq-1; i < j; i++, j--) { + unsigned char tmp = seq[i]; + seq[i] = comp[(unsigned char)seq[j]]; + seq[j] = comp[tmp]; + tmp = qual[i]; + qual[i] = qual[j]; + qual[j] = tmp; + } + if (i ==j) + seq[i] = comp[(unsigned char)seq[i]]; + + seq_to_bam(b, seq); + + if (seq != seq_) + free(seq); + + b->core.flag ^= 0x10; + + return 0; +} +//--- End of candidates to punt to htslib + + +static inline void worker_minhash(worker_t *w) { + int i; + for (i = 0; i < w->buf_len; i++) { + bam1_t *b = w->buf[i].bam_record; + if (b->core.tid != -1) + continue; + + int pos = 0, rev = 0; + uint64_t mh = minhash(b, w->minimiser_kmer, &pos, &rev); + if (rev) + reverse_complement(b); + + // Store 64-bit hash in unmapped pos and mpos fields. + // The position of hash is in isize, which we use for + // resolving ties when sorting by hash key. + // These are unused for completely unmapped data and + // will be reset during final output. + b->core.pos = mh>>31; + b->core.mpos = mh&0x7fffffff; + b->core.isize = 65535-pos >=0 ? 65535-pos : 0; + } +} + +static void *worker(void *data) +{ + worker_t *w = (worker_t*)data; + char *name; + size_t name_len; + w->error = 0; + w->tmpfile_name = NULL; + + switch (g_sam_order) { + case Coordinate: + if (ks_radixsort(w->buf_len, w->buf, w->h) < 0) { + w->error = errno; + return NULL; + } + break; + case MinHash: + worker_minhash(w); + // no break, go to merge sort + default: + ks_mergesort(sort, w->buf_len, w->buf, 0); + } + + if (w->no_save) + return 0; + + name_len = strlen(w->prefix) + 30; + name = (char*)calloc(name_len, 1); + if (!name) { w->error = errno; return 0; } + const int MAX_TRIES = 1000; + int tries = 0; + for (;;) { + if (tries) { + snprintf(name, name_len, "%s.%.4d-%.3d.bam", + w->prefix, w->index, tries); + } else { + snprintf(name, name_len, "%s.%.4d.bam", w->prefix, w->index); + } + + if (write_buffer(name, w->large_pos ? "wzx1" : "wbx1", + w->buf_len, w->buf, w->h, 0, NULL, 0, NULL, 1, 0) == 0) { + break; + } + if (errno == EEXIST && tries < MAX_TRIES) { + tries++; + } else { + w->error = errno; + break; + } + } + + if (w->error) { + free(name); + } else { + w->tmpfile_name = name; + } + return 0; +} + +static int sort_blocks(int n_files, size_t k, bam1_tag *buf, const char *prefix, + const sam_hdr_t *h, int n_threads, buf_region *in_mem, + int large_pos, int minimiser_kmer, char **fns, size_t fns_size) +{ + int i; + size_t pos, rest; + pthread_t *tid; + pthread_attr_t attr; + worker_t *w; + int n_failed = 0; + + if (n_threads < 1) n_threads = 1; + if (k < n_threads * 64) n_threads = 1; // use a single thread if we only sort a small batch of records + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + w = (worker_t*)calloc(n_threads, sizeof(worker_t)); + if (!w) return -1; + tid = (pthread_t*)calloc(n_threads, sizeof(pthread_t)); + if (!tid) { free(w); return -1; } + pos = 0; rest = k; + for (i = 0; i < n_threads; ++i) { + w[i].buf_len = rest / (n_threads - i); + w[i].buf = &buf[pos]; + w[i].prefix = prefix; + w[i].h = h; + w[i].index = n_files + i; + w[i].tmpfile_name = NULL; + w[i].large_pos = large_pos; + w[i].minimiser_kmer = minimiser_kmer; + if (in_mem) { + w[i].no_save = 1; + in_mem[i].from = pos; + in_mem[i].to = pos + w[i].buf_len; + } else { + w[i].no_save = 0; + } + pos += w[i].buf_len; rest -= w[i].buf_len; + pthread_create(&tid[i], &attr, worker, &w[i]); + } + for (i = 0; i < n_threads; ++i) { + pthread_join(tid[i], 0); + if (!in_mem) { + assert(w[i].index >= 0 && w[i].index < fns_size); + fns[w[i].index] = w[i].tmpfile_name; + } + if (w[i].error != 0) { + errno = w[i].error; + print_error_errno("sort", "failed to create temporary file \"%s.%.4d.bam\"", prefix, w[i].index); + n_failed++; + } + } + if (n_failed && !in_mem) { + // Clean up any temporary files that did get made, as we're + // about to lose track of them + for (i = 0; i < n_threads; ++i) { + if (fns[w[i].index]) { + unlink(fns[w[i].index]); + free(fns[w[i].index]); + fns[w[i].index] = NULL; + } + } + } + free(tid); free(w); + if (n_failed) return -1; + if (in_mem) return n_threads; + return n_files + n_threads; +} + +static void lib_lookup_destroy(khash_t(const_c2c) *lib_lookup) { + khiter_t k; + if (lib_lookup == NULL) + return; + for (k = kh_begin(lib_lookup); k < kh_end(lib_lookup); k++) { + if (kh_exist(lib_lookup, k)) + free(kh_value(lib_lookup, k)); + } + kh_destroy(const_c2c, lib_lookup); +} + +// Build an RG to LB lookup table, for the template coordinate sort. +// Returns a populated hash table (which may be empty) on success; +// NULL on failure. +static khash_t(const_c2c) * lookup_libraries(sam_hdr_t *header) +{ + khash_t(const_c2c) *lib_lookup = kh_init(const_c2c); + kstring_t lib_name = KS_INITIALIZE; + int num_rg, i, res; + if (!lib_lookup) + return NULL; + + // Iterate through any RG lines and look for library information + num_rg = sam_hdr_count_lines(header, "RG"); + if (num_rg < 0) + goto fail; + + for (i = 0; i < num_rg; i++) { + const char *rg_id = sam_hdr_line_name(header, "RG", i); + khiter_t k; + if (!rg_id) + goto fail; + res = sam_hdr_find_tag_pos(header, "RG", i, "LB", &lib_name); + if (res < -1) // Error + goto fail; + if (res < 0 || !lib_name.s) // No LB tag + continue; + // Add to lookup table + k = kh_put(const_c2c, lib_lookup, rg_id, &res); + if (res < 0) // Error + goto fail; + if (res > 0) { // Inserted + kh_value(lib_lookup, k) = ks_release(&lib_name); + } + } + + free(lib_name.s); + + return lib_lookup; + + fail: + lib_lookup_destroy(lib_lookup); + free(lib_name.s); + return NULL; +} + +/*! + @abstract Sort an unsorted BAM file based on the provided sort order + + @param sam_order the order in which the sort should occur + @param sort_tag the tag to use if sorting by Tag + @param minimiser_kmer the kmer size when sorting by MinHash + @param fn name of the file to be sorted + @param prefix prefix of the temporary files (prefix.NNNN.bam are written) + @param fnout name of the final output file to be written + @param modeout sam_open() mode to be used to create the final output file + @param max_mem approxiate maximum memory (very inaccurate) + @param in_fmt input file format options + @param out_fmt output file format and options + @param arg_list command string for PG line + @param no_pg if 1, do not add a new PG line + @paran write_index create index for the output file + @return 0 for successful sorting, negative on errors + + @discussion It may create multiple temporary subalignment files + and then merge them by calling bam_merge_simple(). This function is + NOT thread safe. + */ +int bam_sort_core_ext(SamOrder sam_order, char* sort_tag, int minimiser_kmer, + const char *fn, const char *prefix, + const char *fnout, const char *modeout, + size_t _max_mem, int n_threads, + const htsFormat *in_fmt, const htsFormat *out_fmt, + char *arg_list, int no_pg, int write_index) +{ + int ret = -1, res, i, nref, n_files = 0; + size_t max_k, k, max_mem, bam_mem_offset; + sam_hdr_t *header = NULL; + samFile *fp = NULL; + bam1_tag *buf = NULL; + template_coordinate_keys_t *keys = NULL; + bam1_t *b = bam_init1(); + uint8_t *bam_mem = NULL; + char **fns = NULL; + size_t fns_size = 0; + const char *new_so = NULL; + const char *new_go = NULL; + const char *new_ss = NULL; + buf_region *in_mem = NULL; + khash_t(const_c2c) *lib_lookup = NULL; + int num_in_mem = 0; + int large_pos = 0; + + if (!b) { + print_error("sort", "couldn't allocate memory for bam record"); + return -1; + } + + if (n_threads < 2) n_threads = 1; + g_sam_order = sam_order; + if (g_sam_order == TagQueryName || g_sam_order == TagCoordinate) { + g_sort_tag[0] = sort_tag[0]; + g_sort_tag[1] = sort_tag[0] ? sort_tag[1] : '\0'; + } + + if (sam_order == TemplateCoordinate) { + if ((keys = malloc(sizeof(template_coordinate_keys_t))) == NULL) { + print_error("sort", "could not allocate memory for the top-level keys"); + goto err; + } + keys->n = 0; + keys->m = 0; + keys->buffer_size = 0x10000; + keys->buffers = NULL; + } + + max_mem = _max_mem * n_threads; + buf = NULL; + fp = sam_open_format(fn, "r", in_fmt); + if (fp == NULL) { + print_error_errno("sort", "can't open \"%s\"", fn); + goto err; + } + header = sam_hdr_read(fp); + if (header == NULL) { + print_error("sort", "failed to read header from \"%s\"", fn); + goto err; + } + + // Inspect the header looking for long chromosomes + // If there is one, we need to write temporary files in SAM format + nref = sam_hdr_nref(header); + for (i = 0; i < nref; i++) { + if (sam_hdr_tid2len(header, i) > INT32_MAX) + large_pos = 1; + } + + // Also check the output format is large position compatible + if (large_pos) { + int compatible = (out_fmt->format == sam + || (out_fmt->format == cram + && out_fmt->version.major >= 4) + || (out_fmt->format == unknown_format + && modeout[0] == 'w' + && (modeout[1] == 'z' || modeout[1] == '\0'))); + if (!compatible) { + print_error("sort", "output format is not compatible with very large references"); + goto err; + } + } + + if (g_sam_order == TemplateCoordinate) { + lib_lookup = lookup_libraries(header); + if (!lib_lookup) + goto err; + } + + switch (g_sam_order) { + case Coordinate: + new_so = "coordinate"; + break; + case QueryName: + new_so = "queryname"; + break; + case MinHash: + new_so = "coordinate"; + new_ss = "coordinate:minhash"; + break; + case TagQueryName: + case TagCoordinate: + new_so = "unknown"; + break; + case TemplateCoordinate: + new_so = "unsorted"; + new_go = "query"; + new_ss = "unsorted:template-coordinate"; + break; + default: + new_so = "unknown"; + break; + } + + if (new_ss == NULL && new_go == NULL) { // just SO + if ((-1 == sam_hdr_update_hd(header, "SO", new_so)) + && (-1 == sam_hdr_add_line(header, "HD", "VN", SAM_FORMAT_VERSION, "SO", new_so, NULL)) + ) { + print_error("sort", "failed to change sort order header to 'SO:%s'\n", new_so); + goto err; + } + } else if (new_ss != NULL && new_go == NULL) { // update SO and SS, but not GO + if ((-1 == sam_hdr_update_hd(header, "SO", new_so, "SS", new_ss)) + && (-1 == sam_hdr_add_line(header, "HD", "VN", SAM_FORMAT_VERSION, + "SO", new_so, "SS", new_ss, NULL)) + ) { + print_error("sort", "failed to change sort order header to 'SO:%s SS:%s'\n", + new_so, new_ss); + goto err; + } + } else if (new_ss == NULL && new_go != NULL) { // update SO and GO, but not SS + if ((-1 == sam_hdr_update_hd(header, "SO", new_so, "GO", new_go)) + && (-1 == sam_hdr_add_line(header, "HD", "VN", SAM_FORMAT_VERSION, + "SO", new_so, "GO", new_go, NULL)) + ) { + print_error("sort", "failed to change sort order header to 'SO:%s GO:%s'\n", + new_so, new_go); + goto err; + } + } else { // update SO, GO, and SS + if ((-1 == sam_hdr_update_hd(header, "SO", new_so, "GO", new_go, "SS", new_ss)) + && (-1 == sam_hdr_add_line(header, "HD", "VN", SAM_FORMAT_VERSION, + "SO", new_so, "GO", new_go, "SS", new_ss, NULL)) + ) { + print_error("sort", "failed to change sort order header to 'SO:%s GO:%s SS:%s'\n", + new_so, new_go, new_ss); + goto err; + } + } + + if (new_go == NULL) { + if (-1 == sam_hdr_remove_tag_hd(header, "GO")) { + print_error("sort", "failed to delete group order in header\n"); + goto err; + } + } + if (new_ss == NULL) { + if (-1 == sam_hdr_remove_tag_hd(header, "SS")) { + print_error("sort", "failed to delete sub sort in header\n"); + goto err; + } + } + + // No gain to using the thread pool here as the flow of this code + // is such that we are *either* reading *or* sorting. Hence a shared + // pool makes no real difference except to reduce the thread count a little. + if (n_threads > 1) + hts_set_threads(fp, n_threads); + + if ((bam_mem = malloc(max_mem)) == NULL) { + print_error("sort", "couldn't allocate memory for bam_mem"); + goto err; + } + + // write sub files + k = max_k = bam_mem_offset = 0; + while ((res = sam_read1(fp, header, b)) >= 0) { + int mem_full = 0; + + if (k == max_k) { + bam1_tag *new_buf; + max_k = max_k? max_k<<1 : 0x10000; + if ((new_buf = realloc(buf, max_k * sizeof(bam1_tag))) == NULL) { + print_error("sort", "couldn't allocate memory for buf"); + goto err; + } + buf = new_buf; + } + if (sam_order == TemplateCoordinate && k >= keys->m * keys->buffer_size) { + if (template_coordinate_keys_realloc(keys, k + 1) == -1) { + goto err; + } + } + + // Check if the BAM record will fit in the memory limit + if (bam_mem_offset + sizeof(*b) + b->l_data < max_mem) { + // Copy record into the memory block + buf[k].bam_record = (bam1_t *)(bam_mem + bam_mem_offset); + *buf[k].bam_record = *b; + buf[k].bam_record->data = (uint8_t *)((char *)buf[k].bam_record + sizeof(bam1_t)); + memcpy(buf[k].bam_record->data, b->data, b->l_data); + // store next BAM record in next 8-byte-aligned address after + // current one + bam_mem_offset = (bam_mem_offset + sizeof(*b) + b->l_data + 8 - 1) & ~((size_t)(8 - 1)); + } else { + // Add a pointer to the remaining record + buf[k].bam_record = b; + mem_full = 1; + } + + // Set the tag if sorting by tag, or the key for template cooridinate sorting + switch (g_sam_order) { + case TagQueryName: + case TagCoordinate: + buf[k].u.tag = bam_aux_get(buf[k].bam_record, g_sort_tag); + break; + case TemplateCoordinate: + ++keys->n; + template_coordinate_key_t *key = template_coordinate_keys_get(keys, k); + buf[k].u.key = template_coordinate_key(buf[k].bam_record, key, header, lib_lookup); + if (buf[k].u.key == NULL) goto err; + break; + default: + buf[k].u.tag = NULL; + buf[k].u.key = NULL; + } + ++k; + + if (mem_full) { + if (hts_resize(char *, n_files + (n_threads > 0 ? n_threads : 1), + &fns_size, &fns, 0) < 0) + goto err; + int new_n = sort_blocks(n_files, k, buf, prefix, header, n_threads, + NULL, large_pos, minimiser_kmer, fns, fns_size); + if (new_n < 0) { + goto err; + } else { + n_files = new_n; + } + k = 0; + if (keys != NULL) keys->n = 0; + bam_mem_offset = 0; + } + } + if (res != -1) { + print_error("sort", "truncated file. Aborting"); + goto err; + } + + // Sort last records + if (k > 0) { + in_mem = calloc(n_threads > 0 ? n_threads : 1, sizeof(in_mem[0])); + if (!in_mem) goto err; + num_in_mem = sort_blocks(n_files, k, buf, prefix, header, n_threads, + in_mem, large_pos, minimiser_kmer, fns, fns_size); + if (num_in_mem < 0) goto err; + } else { + num_in_mem = 0; + } + + // write the final output + if (n_files == 0 && num_in_mem < 2) { // a single block + if (write_buffer(fnout, modeout, k, buf, header, n_threads, out_fmt, + minimiser_kmer, arg_list, no_pg, write_index) != 0) { + print_error_errno("sort", "failed to create \"%s\"", fnout); + goto err; + } + } else { // then merge + fprintf(stderr, + "[bam_sort_core] merging from %d files and %d in-memory blocks...\n", + n_files, num_in_mem); + // Paranoia check - all temporary files should have a name + for (i = 0; i < n_files; ++i) { + if (!fns[i]) { + print_error("sort", + "BUG: no name stored for temporary file %d", i); + abort(); + } + } + char *sort_by_tag = (sam_order == TagQueryName || sam_order == TagCoordinate) ? sort_tag : NULL; + if (bam_merge_simple(sam_order, sort_by_tag, fnout, modeout, header, + n_files, fns, num_in_mem, in_mem, buf, keys, + lib_lookup, n_threads, "sort", in_fmt, out_fmt, + arg_list, no_pg, write_index) < 0) { + // Propagate bam_merge_simple() failure; it has already emitted a + // message explaining the failure, so no further message is needed. + goto err; + } + } + + ret = 0; + + err: + // free + if (fns) { + for (i = 0; i < n_files; ++i) { + if (fns[i]) { + unlink(fns[i]); + free(fns[i]); + } + } + free(fns); + } + bam_destroy1(b); + free(buf); + if (keys != NULL) { + for (i = 0; i < keys->m; ++i) { + free(keys->buffers[i]); + } + free(keys->buffers); + free(keys); + } + free(bam_mem); + free(in_mem); + lib_lookup_destroy(lib_lookup); + sam_hdr_destroy(header); + if (fp) sam_close(fp); + return ret; +} + +// Unused here but may be used by legacy samtools-using third-party code +int bam_sort_core(int is_by_qname, const char *fn, const char *prefix, size_t max_mem) +{ + int ret; + char *fnout = calloc(strlen(prefix) + 4 + 1, 1); + if (!fnout) return -1; + sprintf(fnout, "%s.bam", prefix); + SamOrder sam_order = is_by_qname ? QueryName : Coordinate; + g_sam_order = sam_order; + ret = bam_sort_core_ext(sam_order, NULL, 0, fn, prefix, fnout, "wb", max_mem, 0, NULL, NULL, NULL, 1, 0); + free(fnout); + return ret; +} + +static void sort_usage(FILE *fp) +{ + fprintf(fp, +"Usage: samtools sort [options...] [in.bam]\n" +"Options:\n" +" -l INT Set compression level, from 0 (uncompressed) to 9 (best)\n" +" -u Output uncompressed data (equivalent to -l 0)\n" +" -m INT Set maximum memory per thread; suffix K/M/G recognized [768M]\n" +" -M Use minimiser for clustering unaligned/unplaced reads\n" +" -K INT Kmer size to use for minimiser [20]\n" +" -n Sort by read name (not compatible with samtools index command)\n" +" -t TAG Sort by value of TAG. Uses position as secondary index (or read name if -n is set)\n" +" -o FILE Write final output to FILE rather than standard output\n" +" -T PREFIX Write temporary files to PREFIX.nnnn.bam\n" +" --no-PG\n" +" Do not add a PG line\n" +" --template-coordinate\n" +" Sort by template-coordinate\n"); + sam_global_opt_help(fp, "-.O..@.."); +} + +static void complain_about_memory_setting(size_t max_mem) { + char *suffix = ""; + const size_t nine_k = 9<<10; + if (max_mem > nine_k) { max_mem >>= 10; suffix = "K"; } + if (max_mem > nine_k) { max_mem >>= 10; suffix = "M"; } + + fprintf(stderr, +"[bam_sort] -m setting (%zu%s bytes) is less than the minimum required (%zuM).\n\n" +"Trying to run with -m too small can lead to the creation of a very large number\n" +"of temporary files. This may make sort fail due to it exceeding limits on the\n" +"number of files it can have open at the same time.\n\n" +"Please check your -m parameter. It should be an integer followed by one of the\n" +"letters K (for kilobytes), M (megabytes) or G (gigabytes). You should ensure it\n" +"is at least the minimum above, and much higher if you are sorting a large file.\n", + max_mem, suffix, SORT_MIN_MEGS_PER_THREAD); +} + +int bam_sort(int argc, char *argv[]) +{ + size_t max_mem = SORT_DEFAULT_MEGS_PER_THREAD << 20; + int c, nargs, ret, o_seen = 0, level = -1, no_pg = 0; + SamOrder sam_order = Coordinate; + bool by_tag = false; + int minimiser_kmer = 20; + char* sort_tag = NULL, *arg_list = NULL; + char *fnout = "-", modeout[12]; + kstring_t tmpprefix = { 0, 0, NULL }; + struct stat st; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + { "threads", required_argument, NULL, '@' }, + {"no-PG", no_argument, NULL, 1}, + { "template-coordinate", no_argument, NULL, 2}, + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "l:m:no:O:T:@:t:MK:u", lopts, NULL)) >= 0) { + switch (c) { + case 'o': fnout = optarg; o_seen = 1; break; + case 'n': sam_order = QueryName; break; + case 't': by_tag = true; sort_tag = optarg; break; + case 'm': { + char *q; + max_mem = strtol(optarg, &q, 0); + if (*q == 'k' || *q == 'K') max_mem <<= 10; + else if (*q == 'm' || *q == 'M') max_mem <<= 20; + else if (*q == 'g' || *q == 'G') max_mem <<= 30; + break; + } + case 'T': kputs(optarg, &tmpprefix); break; + case 'l': level = atoi(optarg); break; + case 'u': level = 0; break; + case 1: no_pg = 1; break; + case 2: sam_order = TemplateCoordinate; break; + case 'M': sam_order = MinHash; break; + case 'K': + minimiser_kmer = atoi(optarg); + if (minimiser_kmer < 1) + minimiser_kmer = 1; + else if (minimiser_kmer > 31) + minimiser_kmer = 31; + break; + + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': sort_usage(stderr); ret = EXIT_FAILURE; goto sort_end; + } + } + + // Change sort order if tag sorting is requested. Must update based on secondary index + if (by_tag) { + sam_order = sam_order == QueryName ? TagQueryName : TagCoordinate; + } + + nargs = argc - optind; + if (nargs == 0 && isatty(STDIN_FILENO)) { + sort_usage(stdout); + ret = EXIT_SUCCESS; + goto sort_end; + } + else if (nargs >= 2) { + // If exactly two, user probably tried to specify legacy + if (nargs == 2) + fprintf(stderr, "[bam_sort] Use -T PREFIX / -o FILE to specify temporary and final output files\n"); + + sort_usage(stderr); + ret = EXIT_FAILURE; + goto sort_end; + } + + if (ga.write_index && (sam_order == QueryName || sam_order == TagQueryName || sam_order == TagCoordinate || sam_order == TemplateCoordinate)) { + fprintf(stderr, "[W::bam_sort] Ignoring --write-index as it only works for position sorted files.\n"); + ga.write_index = 0; + } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("sort", "failed to create arg_list"); + return 1; + } + + if (max_mem < (SORT_MIN_MEGS_PER_THREAD << 20)) { + complain_about_memory_setting(max_mem); + ret = EXIT_FAILURE; + goto sort_end; + } + + strcpy(modeout, "wb"); + sam_open_mode(modeout+1, fnout, NULL); + if (level >= 0) sprintf(strchr(modeout, '\0'), "%d", level < 9? level : 9); + + if (tmpprefix.l == 0) { + if (strcmp(fnout, "-") != 0) { + char *idx = strstr(fnout, HTS_IDX_DELIM); + kputsn(fnout, idx ? idx - fnout : strlen(fnout), &tmpprefix); + kputs(".tmp", &tmpprefix); + } else { + kputc('.', &tmpprefix); + } + } + if (stat(tmpprefix.s, &st) == 0 && S_ISDIR(st.st_mode)) { + unsigned t = ((unsigned) time(NULL)) ^ ((unsigned) clock()); + if (tmpprefix.s[tmpprefix.l-1] != '/') kputc('/', &tmpprefix); + ksprintf(&tmpprefix, "samtools.%d.%u.tmp", (int) getpid(), t % 10000); + } + + ret = bam_sort_core_ext(sam_order, sort_tag, (sam_order == MinHash) ? minimiser_kmer : 0, + (nargs > 0) ? argv[optind] : "-", + tmpprefix.s, fnout, modeout, max_mem, ga.nthreads, + &ga.in, &ga.out, arg_list, no_pg, ga.write_index); + if (ret >= 0) + ret = EXIT_SUCCESS; + else { + char dummy[4]; + // If we failed on opening the input file & it has no .bam/.cram/etc + // extension, the user probably tried legacy -o + if (ret == -2 && o_seen && nargs > 0 && sam_open_mode(dummy, argv[optind], NULL) < 0) + fprintf(stderr, "[bam_sort] Note the argument has been replaced by -T/-o options\n"); + + ret = EXIT_FAILURE; + } + +sort_end: + free(tmpprefix.s); + free(arg_list); + sam_global_args_free(&ga); + + return ret; +} diff --git a/samtools/bam_sort.c.pysam.c b/samtools/bam_sort.c.pysam.c new file mode 100644 index 0000000..3489044 --- /dev/null +++ b/samtools/bam_sort.c.pysam.c @@ -0,0 +1,3265 @@ +#include "samtools.pysam.h" + +/* bam_sort.c -- sorting and merging. + + Copyright (C) 2008-2022 Genome Research Ltd. + Portions copyright (C) 2009-2012 Broad Institute. + + Author: Heng Li + Author: Martin Pollard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "htslib/ksort.h" +#include "htslib/hts_os.h" +#include "htslib/khash.h" +#include "htslib/klist.h" +#include "htslib/kstring.h" +#include "htslib/sam.h" +#include "htslib/hts_endian.h" +#include "htslib/cram.h" +#include "sam_opts.h" +#include "samtools.h" +#include "bedidx.h" +#include "bam.h" + + +// Struct which contains the sorting key for TemplateCoordinate sort. +typedef struct { + int tid1; + int tid2; + hts_pos_t pos1; + hts_pos_t pos2; + bool neg1; + bool neg2; + const char *library; + char *mid; + char *name; + bool is_upper_of_pair; +} template_coordinate_key_t; + +// Struct to store fixed buffers of template coordinate keys +typedef struct { + size_t n; // the # of keys stored + size_t m; // the # of buffers allocated + size_t buffer_size; // # the fixed size of each buffer + template_coordinate_key_t **buffers; // the list of buffers +} template_coordinate_keys_t; + +// Gets the idx'th key; does not OOB check +static template_coordinate_key_t* template_coordinate_keys_get(template_coordinate_keys_t *keys, size_t idx) { + size_t buffer_idx = idx / keys->buffer_size; // the index of the buffer to retrieve in buffer + size_t buffer_offset = idx % keys->buffer_size; // the offset into the given buffer to retrieve + //assert(buffer_idx < keys->m); + //assert(buffer_offset < keys->buffer_size); + return &keys->buffers[buffer_idx][buffer_offset]; +} + +// Rellocates the buffers to hold at least max_k entries +static int template_coordinate_keys_realloc(template_coordinate_keys_t *keys, int max_k) { + size_t cur_m = keys->m; + keys->m += 0x100; + //assert(keys->m > cur_m); + //assert(keys->m * keys->buffer_size >= max_k); + if ((keys->buffers = realloc(keys->buffers, keys->m * sizeof(template_coordinate_key_t*))) == NULL) { + print_error("sort", "couldn't reallocate memory for template coordinate key buffers"); + return -1; + } + // allocate space for new buffers + int j; + for (j = cur_m; j < keys->m; ++j) { + if ((keys->buffers[j]= malloc(sizeof(template_coordinate_key_t) * keys->buffer_size)) == NULL) { + print_error("sort", "couldn't allocate memory for template coordinate key buffer"); + return -1; + } + } + return 0; +} + + +// Struct which contains the a record, and the pointer to the sort tag (if any) or +// a combined ref / position / strand. +// Used to speed up sorts (coordinate, by-tag, and template-coordinate). +typedef struct bam1_tag { + bam1_t *bam_record; + union { + const uint8_t *tag; + uint8_t pos_tid[12]; + template_coordinate_key_t *key; + } u; +} bam1_tag; + +/* Minimum memory required in megabytes before sort will attempt to run. This + is to prevent accidents where failing to use the -m option correctly results + in the creation of a temporary file for each read in the input file. + Don't forget to update the man page if you change this. */ +const size_t SORT_MIN_MEGS_PER_THREAD = 1; + +/* Default per-thread memory for sort. Must be >= SORT_MIN_MEGS_PER_THREAD. + Don't forget to update the man page if you change this. */ +const size_t SORT_DEFAULT_MEGS_PER_THREAD = 768; + +#if !defined(__DARWIN_C_LEVEL) || __DARWIN_C_LEVEL < 900000L +#define NEED_MEMSET_PATTERN4 +#endif + +#ifdef NEED_MEMSET_PATTERN4 +void memset_pattern4(void *target, const void *pattern, size_t size) { + uint32_t* target_iter = target; + size_t loops = size/4; + size_t i; + for (i = 0; i < loops; ++i) { + memcpy(target_iter, pattern, 4); + ++target_iter; + } + if (size%4 != 0) + memcpy(target_iter, pattern, size%4); +} +#endif + +KHASH_INIT(c2c, char*, char*, 1, kh_str_hash_func, kh_str_hash_equal) +KHASH_INIT(cset, char*, char, 0, kh_str_hash_func, kh_str_hash_equal) +KHASH_MAP_INIT_STR(c2i, int) +KHASH_MAP_INIT_STR(const_c2c, char *) + +#define hdrln_free_char(p) +KLIST_INIT(hdrln, char*, hdrln_free_char) + +static template_coordinate_key_t* template_coordinate_key(bam1_t *b, template_coordinate_key_t *key, sam_hdr_t *hdr, khash_t(const_c2c) *lib_lookup); + +typedef enum {Coordinate, QueryName, TagCoordinate, TagQueryName, MinHash, TemplateCoordinate} SamOrder; +static SamOrder g_sam_order = Coordinate; +static char g_sort_tag[2] = {0,0}; + +static int strnum_cmp(const char *_a, const char *_b) +{ + const unsigned char *a = (const unsigned char*)_a, *b = (const unsigned char*)_b; + const unsigned char *pa = a, *pb = b; + while (*pa && *pb) { + if (isdigit(*pa) && isdigit(*pb)) { + while (*pa == '0') ++pa; + while (*pb == '0') ++pb; + while (isdigit(*pa) && isdigit(*pb) && *pa == *pb) ++pa, ++pb; + if (isdigit(*pa) && isdigit(*pb)) { + int i = 0; + while (isdigit(pa[i]) && isdigit(pb[i])) ++i; + return isdigit(pa[i])? 1 : isdigit(pb[i])? -1 : (int)*pa - (int)*pb; + } else if (isdigit(*pa)) return 1; + else if (isdigit(*pb)) return -1; + else if (pa - a != pb - b) return pa - a < pb - b? 1 : -1; + } else { + if (*pa != *pb) return (int)*pa - (int)*pb; + ++pa; ++pb; + } + } + return *pa? 1 : *pb? -1 : 0; +} + +#define HEAP_EMPTY (UINT64_MAX >> 1) + +typedef struct { + int i; + uint32_t tid; + uint64_t pos:63, rev:1, idx; + bam1_tag entry; +} heap1_t; + +static inline int bam1_cmp_by_tag(const bam1_tag a, const bam1_tag b); +static inline int bam1_cmp_by_minhash(const bam1_tag a, const bam1_tag b); +static inline int bam1_cmp_template_coordinate(const bam1_tag a, const bam1_tag b); +static khash_t(const_c2c) * lookup_libraries(sam_hdr_t *header); +static void lib_lookup_destroy(khash_t(const_c2c) *lib_lookup); + +// Function to compare reads in the heap and determine which one is < the other +// Note, unlike the bam1_cmp_by_X functions which return <0, 0, >0 this +// is strictly 0 or 1 only. +static inline int heap_lt(const heap1_t a, const heap1_t b) +{ + if (!a.entry.bam_record) + return 1; + if (!b.entry.bam_record) + return 0; + + int t, fa, fb; + switch (g_sam_order) { + case Coordinate: + if (a.tid != b.tid) return a.tid > b.tid; + if (a.pos != b.pos) return a.pos > b.pos; + if (a.rev != b.rev) return a.rev > b.rev; + break; + case QueryName: + t = strnum_cmp(bam_get_qname(a.entry.bam_record), bam_get_qname(b.entry.bam_record)); + if (t != 0) return t > 0; + fa = a.entry.bam_record->core.flag & 0xc0; + fb = b.entry.bam_record->core.flag & 0xc0; + if (fa != fb) return fa > fb; + break; + case TagQueryName: + case TagCoordinate: + t = bam1_cmp_by_tag(a.entry, b.entry); + if (t != 0) return t > 0; + break; + case MinHash: + t = bam1_cmp_by_minhash(a.entry, b.entry); + if (t != 0) return t > 0; + break; + case TemplateCoordinate: + t = bam1_cmp_template_coordinate(a.entry, b.entry); + if (t != 0) return t > 0; + break; + default: + print_error("heap_lt", "unknown sort order: %d", g_sam_order); + break; + } + + // This compares by position in the input file(s) + if (a.i != b.i) return a.i > b.i; + return a.idx > b.idx; +} + +KSORT_INIT(heap, heap1_t, heap_lt) + +typedef struct merged_header { + sam_hdr_t *hdr; + kstring_t out_rg; + kstring_t out_pg; + kstring_t out_co; + char **target_name; + uint32_t *target_len; + size_t n_targets; + size_t targets_sz; + khash_t(c2i) *sq_tids; + khash_t(cset) *rg_ids; + khash_t(cset) *pg_ids; + bool have_hd; +} merged_header_t; + +typedef struct trans_tbl { + int32_t n_targets; + int* tid_trans; + kh_c2c_t* rg_trans; + kh_c2c_t* pg_trans; + bool lost_coord_sort; +} trans_tbl_t; + +static void trans_tbl_destroy(trans_tbl_t *tbl) { + khiter_t iter; + + free(tbl->tid_trans); + + /* + * The values for the tbl->rg_trans and tbl->pg_trans hashes are pointers + * to keys in the rg_ids and pg_ids sets of the merged_header_t, so + * they should not be freed here. + * + * The keys are unique to each hash entry, so they do have to go. + */ + + for (iter = kh_begin(tbl->rg_trans); iter != kh_end(tbl->rg_trans); ++iter) { + if (kh_exist(tbl->rg_trans, iter)) { + free(kh_key(tbl->rg_trans, iter)); + } + } + for (iter = kh_begin(tbl->pg_trans); iter != kh_end(tbl->pg_trans); ++iter) { + if (kh_exist(tbl->pg_trans, iter)) { + free(kh_key(tbl->pg_trans, iter)); + } + } + + kh_destroy(c2c,tbl->rg_trans); + kh_destroy(c2c,tbl->pg_trans); +} + +/* + * Create a merged_header_t struct. + */ + +static merged_header_t * init_merged_header() { + merged_header_t *merged_hdr; + + merged_hdr = calloc(1, sizeof(*merged_hdr)); + if (merged_hdr == NULL) return NULL; + + merged_hdr->hdr = sam_hdr_init(); + if (!merged_hdr->hdr) goto fail; + + merged_hdr->targets_sz = 16; + merged_hdr->target_name = malloc(merged_hdr->targets_sz + * sizeof(*merged_hdr->target_name)); + if (NULL == merged_hdr->target_name) goto fail; + + merged_hdr->target_len = malloc(merged_hdr->targets_sz + * sizeof(*merged_hdr->target_len)); + if (NULL == merged_hdr->target_len) goto fail; + + merged_hdr->sq_tids = kh_init(c2i); + if (merged_hdr->sq_tids == NULL) goto fail; + + merged_hdr->rg_ids = kh_init(cset); + if (merged_hdr->rg_ids == NULL) goto fail; + + merged_hdr->pg_ids = kh_init(cset); + if (merged_hdr->pg_ids == NULL) goto fail; + + return merged_hdr; + + fail: + perror("[init_merged_header]"); + kh_destroy(cset, merged_hdr->pg_ids); + kh_destroy(cset, merged_hdr->rg_ids); + kh_destroy(c2i, merged_hdr->sq_tids); + free(merged_hdr->target_name); + free(merged_hdr->target_len); + sam_hdr_destroy(merged_hdr->hdr); + free(merged_hdr); + return NULL; +} + +/* Some handy kstring manipulating functions */ + +// Append char range to kstring +static inline int range_to_ks(const char *src, int from, int to, + kstring_t *dest) { + return kputsn(src + from, to - from, dest) != to - from; +} + +// Append a kstring to a kstring +static inline int ks_to_ks(kstring_t *src, kstring_t *dest) { + return kputsn(ks_str(src), ks_len(src), dest) != ks_len(src); +} + +/* + * Generate a unique ID by appending a random suffix to a given prefix. + * existing_ids is the set of IDs that are already in use. + * If always_add_suffix is true, the suffix will always be included. + * If false, prefix will be returned unchanged if it isn't in existing_ids. + */ + +static int gen_unique_id(char *prefix, khash_t(cset) *existing_ids, + bool always_add_suffix, kstring_t *dest) { + khiter_t iter; + + if (!always_add_suffix) { + // Try prefix on its own first + iter = kh_get(cset, existing_ids, prefix); + if (iter == kh_end(existing_ids)) { // prefix isn't used yet + dest->l = 0; + if (kputs(prefix, dest) == EOF) return -1; + return 0; + } + } + + do { + dest->l = 0; + ksprintf(dest, "%s-%0lX", prefix, lrand48()); + iter = kh_get(cset, existing_ids, ks_str(dest)); + } while (iter != kh_end(existing_ids)); + + return 0; +} + +/* + * Add the @HD line to the new header + * In practice the @HD line will come from the first input header. + */ + +static int trans_tbl_add_hd(merged_header_t* merged_hdr, + sam_hdr_t *translate) { + kstring_t hd_line = { 0, 0, NULL }; + int res; + + // TODO: handle case when @HD needs merging. + if (merged_hdr->have_hd) return 0; + + res = sam_hdr_find_hd(translate, &hd_line); + if (res < -1) { + print_error("merge", "failed to get @HD line from header"); + return -1; + } + + if (res < 0) // Not found + return 0; + + if (sam_hdr_add_lines(merged_hdr->hdr, hd_line.s, hd_line.l) < 0) { + print_error("merge", "failed to add @HD line to new header"); + free(hd_line.s); + return -1; + } + + free(hd_line.s); + merged_hdr->have_hd = true; + + return 0; +} + +/* + * Add @SQ records to the translation table. + * + * Go through the target list for the input header. Any new targets found + * are added to the output header target list. At the same time, a mapping + * from the input to output target ids is stored in tbl. + * + * If any new targets are found, the header text is scanned to find the + * corresponding @SQ records. They are then copied into the + * merged_hdr->out_text kstring (which will eventually become the + * output header text). + * + * Returns 0 on success, -1 on failure. + */ + +static int trans_tbl_add_sq(merged_header_t* merged_hdr, sam_hdr_t *translate, + trans_tbl_t* tbl) { + int32_t i; + int min_tid = -1, res; + kstring_t sq_line = { 0, 0, NULL }, sq_sn = { 0, 0, NULL }; + + // Fill in the tid part of the translation table, adding new targets + // to the merged header as we go. + + for (i = 0; i < sam_hdr_nref(translate); ++i) { + int trans_tid; + sq_sn.l = 0; + res = sam_hdr_find_tag_pos(translate, "SQ", i, "SN", &sq_sn); + if (res < 0) { + print_error("merge", "failed to get @SQ SN #%d from header", i + 1); + goto fail; + } + + trans_tid = sam_hdr_name2tid(merged_hdr->hdr, sq_sn.s); + if (trans_tid < -1) { + print_error("merge", "failed to lookup ref"); + goto fail; + } + + if (trans_tid < 0) { + // Append missing entries to out_hdr + sq_line.l = 0; + res = sam_hdr_find_line_id(translate, "SQ", "SN", sq_sn.s, &sq_line); + if (res < 0) { + print_error("merge", "failed to get @SQ SN:%s from header", sq_sn.s); + goto fail; + } + + trans_tid = sam_hdr_nref(merged_hdr->hdr); + + res = sam_hdr_add_lines(merged_hdr->hdr, sq_line.s, sq_line.l); + if (res < 0) { + print_error("merge", "failed to add @SQ SN:%s to new header", sq_sn.s); + goto fail; + } + } + tbl->tid_trans[i] = trans_tid; + + if (tbl->tid_trans[i] > min_tid) { + min_tid = tbl->tid_trans[i]; + } else { + tbl->lost_coord_sort = true; + } + } + + free(sq_line.s); + free(sq_sn.s); + + return 0; + + fail: + free(sq_line.s); + free(sq_sn.s); + return -1; +} + +/* + * Common code for setting up RG and PG record ID tag translation. + * + * is_rg is true for RG translation, false for PG. + * translate is the input bam header + * merge is true if tags with the same ID are to be merged. + * known_ids is the set of IDs already in the output header. + * id_map is the translation map from input header IDs to output header IDs + * If override is set, it will be used to replace the existing ID (RG only) + * + * known_ids and id_map have entries for the new IDs added to them. + * + * Return value is a linked list of header lines with the translated IDs, + * or NULL if something went wrong (probably out of memory). + * + */ + +static klist_t(hdrln) * trans_rg_pg(bool is_rg, sam_hdr_t *translate, + bool merge, khash_t(cset)* known_ids, + khash_t(c2c)* id_map, char *override) { + khiter_t iter; + int num_ids, i; + const char *rec_type = is_rg ? "RG" : "PG"; + klist_t(hdrln) *hdr_lines; + + hdr_lines = kl_init(hdrln); + + // Search through translate's header + num_ids = sam_hdr_count_lines(translate, rec_type); + if (num_ids < 0) + goto fail; + + for (i = 0; i < num_ids; i++) { + kstring_t orig_id = { 0, 0, NULL }; // ID in original header + kstring_t transformed_id = { 0, 0, NULL }; // ID in output header + char *map_value; // Value to store in id_map + bool id_changed; // Have we changed the ID? + bool not_found_in_output; // ID isn't in the output header (yet) + + if (sam_hdr_find_tag_pos(translate, rec_type, i, "ID", &orig_id) < 0) + goto fail; + + // is our matched ID in our output ID set already? + iter = kh_get(cset, known_ids, ks_str(&orig_id)); + not_found_in_output = (iter == kh_end(known_ids)); + + if (override) { + // Override original ID (RG only) +#ifdef OVERRIDE_DOES_NOT_MERGE + if (gen_unique_id(override, known_ids, false, &transformed_id)) + goto memfail; + not_found_in_output = true; // As ID now unique +#else + if (kputs(override, &transformed_id) == EOF) goto memfail; + // Know about override already? + iter = kh_get(cset, known_ids, ks_str(&transformed_id)); + not_found_in_output = (iter == kh_end(known_ids)); +#endif + id_changed = true; + } else { + if ( not_found_in_output || merge) { + // Not in there or merging so can add it as 1-1 mapping + if (ks_to_ks(&orig_id, &transformed_id)) goto memfail; + id_changed = false; + } else { + // It's in there so we need to transform it by appending + // a random number to the id + if (gen_unique_id(ks_str(&orig_id), known_ids, + true, &transformed_id)) + goto memfail; + id_changed = true; + not_found_in_output = true; // As ID now unique + } + } + + // Does this line need to go into our output header? + if (not_found_in_output) { + // Take matched line and replace ID with transformed_id + kstring_t new_hdr_line = { 0, 0, NULL }; + if (sam_hdr_find_line_id(translate, rec_type, + "ID", ks_str(&orig_id), &new_hdr_line) < 0){ + goto fail; + } + + if (id_changed) { + char *idp = strstr(ks_str(&new_hdr_line), "\tID:"), *id_end; + ptrdiff_t id_offset, id_len; + if (!idp) { + print_error("merge", "failed to find ID in \"%s\"\n", + ks_str(&new_hdr_line)); + goto fail; + } + idp += 4; + for (id_end = idp; *id_end >= '\n'; id_end++) {} + + id_offset = idp - new_hdr_line.s; + id_len = id_end - idp; + + if (id_len < transformed_id.l) { + if (ks_resize(&new_hdr_line, new_hdr_line.l + + transformed_id.l - id_len + 1/*nul*/)) + goto fail; + } + if (id_len != transformed_id.l) { + memmove(new_hdr_line.s + id_offset + transformed_id.l, + new_hdr_line.s + id_offset + id_len, + new_hdr_line.l - id_offset - id_len + 1); + } + memcpy(new_hdr_line.s + id_offset, transformed_id.s, + transformed_id.l); + } + + // append line to output linked list + char** ln = kl_pushp(hdrln, hdr_lines); + *ln = ks_release(&new_hdr_line); // Give away to linked list + + // Need to add it to known_ids set + int in_there = 0; + iter = kh_put(cset, known_ids, ks_str(&transformed_id), &in_there); + if (in_there < 0) goto memfail; + assert(in_there > 0); // Should not already be in the map + map_value = ks_release(&transformed_id); + } else { + // Use existing string in id_map + assert(kh_exist(known_ids, iter)); + map_value = kh_key(known_ids, iter); + free(ks_release(&transformed_id)); + } + + // Insert it into our translation map + int in_there = 0; + iter = kh_put(c2c, id_map, ks_release(&orig_id), &in_there); + kh_value(id_map, iter) = map_value; + } + + // If there are no RG lines in the file and we are overriding add one + if (is_rg && override && hdr_lines->size == 0) { + kstring_t new_id = {0, 0, NULL}; + kstring_t line = {0, 0, NULL}; + kstring_t empty = {0, 0, NULL}; + int in_there = 0; + char** ln; + + // Get the new ID + if (gen_unique_id(override, known_ids, false, &new_id)) + goto memfail; + + // Make into a header line and add to linked list + ksprintf(&line, "@RG\tID:%s", ks_str(&new_id)); + ln = kl_pushp(hdrln, hdr_lines); + *ln = ks_release(&line); + + // Put into known_ids set + iter = kh_put(cset, known_ids, ks_str(&new_id), &in_there); + if (in_there < 0) goto memfail; + assert(in_there > 0); // Should be a new entry + + // Put into translation map (key is empty string) + if (kputs("", &empty) == EOF) goto memfail; + iter = kh_put(c2c, id_map, ks_release(&empty), &in_there); + if (in_there < 0) goto memfail; + assert(in_there > 0); // Should be a new entry + kh_value(id_map, iter) = ks_release(&new_id); + } + + return hdr_lines; + + memfail: + perror(__func__); + fail: + if (hdr_lines) kl_destroy(hdrln, hdr_lines); + return NULL; +} + +/* + * Common code for completing RG and PG record translation. + * + * Input is a list of header lines, and the mapping from input to + * output @PG record IDs. + * + * RG and PG records can contain tags that cross-reference to other @PG + * records. This fixes the tags to contain the new IDs before adding + * them to the output header text. + */ + +static int finish_rg_pg(bool is_rg, klist_t(hdrln) *hdr_lines, + khash_t(c2c)* pg_map, kstring_t *out_text) { + const char *search = is_rg ? "\tPG:" : "\tPP:"; + khiter_t idx; + char *line = NULL; + + while ((kl_shift(hdrln, hdr_lines, &line)) == 0) { + char *id = strstr(line, search); // Look for tag to fix + int pos1 = 0, pos2 = 0; + char *new_id = NULL; + + if (id) { + // Found a tag. Look up the value in the translation map + // to see what it should be changed to in the output file. + char *end, tmp; + + id += 4; // Point to value + end = strchr(id, '\t'); // Find end of tag + if (!end) end = id + strlen(id); + + tmp = *end; + *end = '\0'; // Temporarily get the value on its own. + + // Look-up in translation table + idx = kh_get(c2c, pg_map, id); + if (idx == kh_end(pg_map)) { + // Not found, warn. + fprintf(samtools_stderr, "[W::%s] Tag %s%s not found in @PG records\n", + __func__, search + 1, id); + } else { + // Remember new id and splice points on original string + new_id = kh_value(pg_map, idx); + pos1 = id - line; + pos2 = end - line; + } + + *end = tmp; // Restore string + } + + // Copy line to output: + // line[0..pos1), new_id (if not NULL), line[pos2..end), '\n' + + if (pos1 && range_to_ks(line, 0, pos1, out_text)) goto memfail; + if (new_id && kputs(new_id, out_text) == EOF) goto memfail; + if (kputs(line + pos2, out_text) == EOF) goto memfail; + if (kputc('\n', out_text) == EOF) goto memfail; + free(line); // No longer needed + line = NULL; + } + + return 0; + + memfail: + perror(__func__); + free(line); // Prevent leakage as no longer on list + return -1; +} + +/* + * Build the translation table for an input *am file. This stores mappings + * which allow IDs to be converted from those used in the input file + * to the ones which will be used in the output. The mappings are for: + * Reference sequence IDs (for @SQ records) + * @RG record ID tags + * @PG record ID tags + * + * At the same time, new header text is built up by copying records + * from the input bam file. This will eventually become the header for + * the output file. When copied, the ID tags for @RG and @PG records + * are replaced with their values. The @PG PP: and @RG PG: tags + * are also modified if necessary. + * + * merged_hdr holds state on the output header (which IDs are present, etc.) + * translate is the input header + * tbl is the translation table that gets filled in. + * merge_rg controls merging of @RG records + * merge_pg controls merging of @PG records + * If rg_override is not NULL, it will be used to replace the existing @RG ID + * + * Returns 0 on success, -1 on failure. + */ + +static int trans_tbl_init(merged_header_t* merged_hdr, sam_hdr_t* translate, + trans_tbl_t* tbl, bool merge_rg, bool merge_pg, + bool copy_co, char* rg_override) +{ + kstring_t lines = { 0, 0, NULL }; + klist_t(hdrln) *rg_list = NULL; + klist_t(hdrln) *pg_list = NULL; + + tbl->n_targets = sam_hdr_nref(translate); + tbl->rg_trans = tbl->pg_trans = NULL; + tbl->tid_trans = (int*)calloc(tbl->n_targets ? tbl->n_targets : 1, + sizeof(int)); + if (tbl->tid_trans == NULL) goto memfail; + tbl->rg_trans = kh_init(c2c); + if (tbl->rg_trans == NULL) goto memfail; + tbl->pg_trans = kh_init(c2c); + if (tbl->pg_trans == NULL) goto memfail; + + tbl->lost_coord_sort = false; + + // Get the @HD record (if not there already). + if (trans_tbl_add_hd(merged_hdr, translate)) goto fail; + + // Fill in map and add header lines for @SQ records + if (trans_tbl_add_sq(merged_hdr, translate, tbl)) goto fail; + + // Get translated header lines and fill in map for @RG records + rg_list = trans_rg_pg(true, translate, merge_rg, merged_hdr->rg_ids, + tbl->rg_trans, rg_override); + if (!rg_list) goto fail; + + // Get translated header lines and fill in map for @PG records + pg_list = trans_rg_pg(false, translate, merge_pg, merged_hdr->pg_ids, + tbl->pg_trans, NULL); + if (!pg_list) goto fail; + + // Fix-up PG: tags in the new @RG records and add to output + if (finish_rg_pg(true, rg_list, tbl->pg_trans, &merged_hdr->out_rg)) + goto fail; + + // Fix-up PP: tags in the new @PG records and add to output + lines.l = 0; + if (finish_rg_pg(false, pg_list, tbl->pg_trans, &merged_hdr->out_pg)) + goto fail; + + kl_destroy(hdrln, rg_list); rg_list = NULL; + kl_destroy(hdrln, pg_list); pg_list = NULL; + + if (copy_co) { + // Just append @CO headers without translation + int num_co = sam_hdr_count_lines(translate, "CO"), i; + if (num_co < 0) + goto fail; + + for (i = 0; i < num_co; i++) { + if (sam_hdr_find_line_pos(translate, "CO", i, &lines) < 0) + goto fail; + if (ks_to_ks(&lines, &merged_hdr->out_co)) + goto fail; + if (kputc('\n', &merged_hdr->out_co) < 0) + goto fail; + } + } + + free(lines.s); + + return 0; + + memfail: + perror(__func__); + fail: + trans_tbl_destroy(tbl); + if (rg_list) kl_destroy(hdrln, rg_list); + if (pg_list) kl_destroy(hdrln, pg_list); + free(lines.s); + return -1; +} + +static int finish_merged_header(merged_header_t *merged_hdr) { + if (sam_hdr_add_lines(merged_hdr->hdr, ks_c_str(&merged_hdr->out_rg), + ks_len(&merged_hdr->out_rg)) < 0) + return -1; + if (sam_hdr_add_lines(merged_hdr->hdr, ks_c_str(&merged_hdr->out_pg), + ks_len(&merged_hdr->out_pg)) < 0) + return -1; + if (sam_hdr_add_lines(merged_hdr->hdr, ks_c_str(&merged_hdr->out_co), + ks_len(&merged_hdr->out_co)) < 0) + return -1; + + return 0; +} + +/* + * Free a merged_header_t struct and all associated data. + * + * Note that the keys to the rg_ids and pg_ids sets are also used as + * values in the translation tables. This function should therefore not + * be called until the translation tables are no longer needed. + */ + +static void free_merged_header(merged_header_t *merged_hdr) { + size_t i; + khiter_t iter; + if (!merged_hdr) return; + free(ks_release(&merged_hdr->out_rg)); + free(ks_release(&merged_hdr->out_pg)); + free(ks_release(&merged_hdr->out_co)); + if (merged_hdr->target_name) { + for (i = 0; i < merged_hdr->n_targets; i++) { + free(merged_hdr->target_name[i]); + } + free(merged_hdr->target_name); + } + free(merged_hdr->target_len); + kh_destroy(c2i, merged_hdr->sq_tids); + + if (merged_hdr->rg_ids) { + for (iter = kh_begin(merged_hdr->rg_ids); + iter != kh_end(merged_hdr->rg_ids); ++iter) { + if (kh_exist(merged_hdr->rg_ids, iter)) + free(kh_key(merged_hdr->rg_ids, iter)); + } + kh_destroy(cset, merged_hdr->rg_ids); + } + + if (merged_hdr->pg_ids) { + for (iter = kh_begin(merged_hdr->pg_ids); + iter != kh_end(merged_hdr->pg_ids); ++iter) { + if (kh_exist(merged_hdr->pg_ids, iter)) + free(kh_key(merged_hdr->pg_ids, iter)); + } + kh_destroy(cset, merged_hdr->pg_ids); + } + + free(merged_hdr); +} + +static void bam_translate(bam1_t* b, trans_tbl_t* tbl) +{ + // Update target id if not unmapped tid + if ( b->core.tid >= 0 ) { b->core.tid = tbl->tid_trans[b->core.tid]; } + if ( b->core.mtid >= 0 ) { b->core.mtid = tbl->tid_trans[b->core.mtid]; } + + // If we have a RG update it + uint8_t *rg = bam_aux_get(b, "RG"); + if (rg) { + char* decoded_rg = bam_aux2Z(rg); + khiter_t k = kh_get(c2c, tbl->rg_trans, decoded_rg); + if (k != kh_end(tbl->rg_trans)) { + char* translate_rg = kh_value(tbl->rg_trans,k); + bam_aux_del(b, rg); + if (translate_rg) { + bam_aux_append(b, "RG", 'Z', strlen(translate_rg) + 1, + (uint8_t*)translate_rg); + } + } else { + char *tmp = strdup(decoded_rg); + fprintf(samtools_stderr, + "[bam_translate] RG tag \"%s\" on read \"%s\" encountered " + "with no corresponding entry in header, tag lost. " + "Unknown tags are only reported once per input file for " + "each tag ID.\n", + decoded_rg, bam_get_qname(b)); + bam_aux_del(b, rg); + // Prevent future whinges + if (tmp) { + int in_there = 0; + k = kh_put(c2c, tbl->rg_trans, tmp, &in_there); + if (in_there > 0) kh_value(tbl->rg_trans, k) = NULL; + } + } + } + + // If we have a PG update it + uint8_t *pg = bam_aux_get(b, "PG"); + if (pg) { + char* decoded_pg = bam_aux2Z(pg); + khiter_t k = kh_get(c2c, tbl->pg_trans, decoded_pg); + if (k != kh_end(tbl->pg_trans)) { + char* translate_pg = kh_value(tbl->pg_trans,k); + bam_aux_del(b, pg); + if (translate_pg) { + bam_aux_append(b, "PG", 'Z', strlen(translate_pg) + 1, + (uint8_t*)translate_pg); + } + } else { + char *tmp = strdup(decoded_pg); + fprintf(samtools_stderr, + "[bam_translate] PG tag \"%s\" on read \"%s\" encountered " + "with no corresponding entry in header, tag lost. " + "Unknown tags are only reported once per input file for " + "each tag ID.\n", + decoded_pg, bam_get_qname(b)); + bam_aux_del(b, pg); + // Prevent future whinges + if (tmp) { + int in_there = 0; + k = kh_put(c2c, tbl->pg_trans, tmp, &in_there); + if (in_there > 0) kh_value(tbl->pg_trans, k) = NULL; + } + } + } +} + +int* rtrans_build(int n, int n_targets, trans_tbl_t* translation_tbl) +{ + // Create reverse translation table for tids + int* rtrans = (int*)malloc(sizeof(int32_t)*n*n_targets); + const int32_t NOTID = INT32_MIN; + if (!rtrans) return NULL; + memset_pattern4((void*)rtrans, &NOTID, sizeof(int32_t)*n*n_targets); + int i; + for (i = 0; i < n; ++i) { + int j; + for (j = 0; j < (translation_tbl+i)->n_targets; ++j) { + if ((translation_tbl+i)->tid_trans[j] != -1) { + rtrans[i*n_targets + (translation_tbl+i)->tid_trans[j]] = j; + } + } + } + + return rtrans; +} + +#define MERGE_RG 1 // Attach RG tag based on filename +#define MERGE_UNCOMP 2 // Generate uncompressed BAM +#define MERGE_LEVEL1 4 // Compress the BAM at level 1 (fast) mode +#define MERGE_FORCE 8 // Overwrite output BAM if it exists +#define MERGE_COMBINE_RG 16 // Combine RG tags frather than redefining them +#define MERGE_COMBINE_PG 32 // Combine PG tags frather than redefining them +#define MERGE_FIRST_CO 64 // Use only first file's @CO headers (sort cmd only) + + +static hts_reglist_t *duplicate_reglist(const hts_reglist_t *rl, int rn) { + if (!rl) + return NULL; + + hts_reglist_t *new_rl = calloc(rn, sizeof(hts_reglist_t)); + if (!new_rl) + return NULL; + + int i; + for (i=0; i < rn; i++) { + new_rl[i].tid = rl[i].tid; + new_rl[i].count = rl[i].count; + new_rl[i].min_beg = rl[i].min_beg; + new_rl[i].max_end = rl[i].max_end; + + new_rl[i].reg = rl[i].reg; + new_rl[i].intervals = malloc(new_rl[i].count * sizeof(hts_pair_pos_t)); + if (!new_rl[i].intervals) { + hts_reglist_free(new_rl, i); + return NULL; + } + memcpy(new_rl[i].intervals, rl[i].intervals, new_rl[i].count * sizeof(hts_pair_pos_t)); + } + + return new_rl; +} + +/* + * How merging is handled + * + * If a header is defined use we will use that as our output header + * otherwise we use the first header from the first input file. + * + * Now go through each file and create a translation table for that file for: + * -RG + * -tid + * -PG tags + * + * Then whenever we read a record from a bam we translate that read before + * stashing it in the hash. + * + * In the actual merge, a read is read from each input file, translated and + * stashed in the hash. This assumes that all input files are sorted in the + * same way. Next we just extract the next position ordered read from the + * hash, and replace it if there are still reads left in it's source input + * file. Finally we write our chosen read it to the output file. + */ + +/*! + @abstract Merge multiple sorted BAM. + @param sam_order the order in which the data was sorted + @param sort_tag if non-null, the tag that data was sorted by + @param out output BAM file name + @param mode sam_open() mode to be used to create the final output file + (overrides level settings from UNCOMP and LEVEL1 flags) + @param headers name of SAM file from which to copy '@' header lines, + or NULL to copy them from the first file to be merged + @param n number of files to be merged + @param fn names of files to be merged + @param flag flags that control how the merge is undertaken + @param reg region to merge + @param n_threads number of threads to use (passed to htslib) + @param cmd command name (used in print_error() etc) + @param in_fmt format options for input files + @param out_fmt output file format and options + @param write_index create the index, together with the output file + @param arg_list command string for PG line + @param no_pg if 1, do not add a new PG line + @discussion Padding information may NOT correctly maintained. This + function is NOT thread safe. + */ +int bam_merge_core2(SamOrder sam_order, char* sort_tag, const char *out, const char *mode, + const char *headers, int n, char * const *fn, char * const *fn_idx, + const char *fn_bed, int flag, const char *reg, int n_threads, + const char *cmd, const htsFormat *in_fmt, const htsFormat *out_fmt, + int write_index, char *arg_list, int no_pg) +{ + samFile *fpout, **fp = NULL; + heap1_t *heap = NULL; + sam_hdr_t *hout = NULL; + sam_hdr_t *hin = NULL; + int i, j, *RG_len = NULL; + uint64_t idx = 0; + char **RG = NULL; + hts_itr_t **iter = NULL; + sam_hdr_t **hdr = NULL; + trans_tbl_t *translation_tbl = NULL; + int *rtrans = NULL; + char *out_idx_fn = NULL; + void *hreg = NULL; + hts_reglist_t *lreg = NULL; + merged_header_t *merged_hdr = init_merged_header(); + if (!merged_hdr) return -1; + refs_t *refs = NULL; + template_coordinate_keys_t *keys = NULL; + khash_t(const_c2c) *lib_lookup = NULL; + + // Is there a specified pre-prepared header to use for output? + if (headers) { + samFile* fpheaders = sam_open(headers, "r"); + if (fpheaders == NULL) { + print_error_errno(cmd, "cannot open \"%s\"", headers); + return -1; + } + hin = sam_hdr_read(fpheaders); + sam_close(fpheaders); + if (hin == NULL) { + print_error(cmd, "couldn't read headers from \"%s\"", headers); + goto mem_fail; + } + } + + g_sam_order = sam_order; + if (sam_order == TagQueryName || sam_order == TagCoordinate) { + g_sort_tag[0] = sort_tag[0]; + g_sort_tag[1] = sort_tag[0] ? sort_tag[1] : '\0'; + } + + fp = (samFile**)calloc(n, sizeof(samFile*)); + if (!fp) goto mem_fail; + heap = (heap1_t*)calloc(n, sizeof(heap1_t)); + if (!heap) goto mem_fail; + iter = (hts_itr_t**)calloc(n, sizeof(hts_itr_t*)); + if (!iter) goto mem_fail; + hdr = (sam_hdr_t**)calloc(n, sizeof(sam_hdr_t*)); + if (!hdr) goto mem_fail; + translation_tbl = (trans_tbl_t*)calloc(n, sizeof(trans_tbl_t)); + if (!translation_tbl) goto mem_fail; + RG = (char**)calloc(n, sizeof(char*)); + if (!RG) goto mem_fail; + + // prepare RG tag from file names + if (flag & MERGE_RG) { + RG_len = (int*)calloc(n, sizeof(int)); + if (!RG_len) goto mem_fail; + for (i = 0; i != n; ++i) { + int l = strlen(fn[i]); + const char *s = fn[i]; + if (l > 4 && (strcmp(s + l - 4, ".bam") == 0 || strcmp(s + l - 4, ".sam") == 0)) l -= 4; + if (l > 5 && strcmp(s + l - 5, ".cram") == 0) l -= 5; + for (j = l - 1; j >= 0; --j) if (s[j] == '/') break; + ++j; l -= j; + RG[i] = (char*)calloc(l + 1, 1); + if (!RG[i]) goto mem_fail; + RG_len[i] = l; + strncpy(RG[i], s + j, l); + } + } + + if (hin) { + // Populate merged_hdr from the pre-prepared header + trans_tbl_t dummy; + int res; + res = trans_tbl_init(merged_hdr, hin, &dummy, flag & MERGE_COMBINE_RG, + flag & MERGE_COMBINE_PG, true, NULL); + trans_tbl_destroy(&dummy); + if (res) return -1; // FIXME: memory leak + } + + // open and read the header from each file + for (i = 0; i < n; ++i) { + sam_hdr_t *hin; + fp[i] = sam_open_format(fn[i], "r", in_fmt); + if (fp[i] == NULL) { + print_error_errno(cmd, "fail to open \"%s\"", fn[i]); + goto fail; + } + hin = sam_hdr_read(fp[i]); + if (hin == NULL) { + print_error(cmd, "failed to read header from \"%s\"", fn[i]); + goto fail; + } + + if (trans_tbl_init(merged_hdr, hin, translation_tbl+i, + flag & MERGE_COMBINE_RG, flag & MERGE_COMBINE_PG, + (flag & MERGE_FIRST_CO)? (i == 0) : true, + RG[i])) + goto fail; + + hdr[i] = hin; + + int order_ok = 1; + if ((translation_tbl+i)->lost_coord_sort && (sam_order == Coordinate || sam_order == MinHash)) { + fprintf(samtools_stderr, "[bam_merge_core] Order of targets in file %s caused coordinate sort to be lost\n", fn[i]); + order_ok = 0; + } + + if (!refs) + refs = cram_get_refs(fp[i]); + + if (order_ok && refs && hts_set_opt(fp[i], CRAM_OPT_SHARED_REF, refs)) + goto fail; + } + + // Did we get an @HD line? + if (!merged_hdr->have_hd) { + fprintf(samtools_stderr, "[W::%s] No @HD tag found.\n", __func__); + /* FIXME: Should we add an @HD line here, and if so what should + we put in it? Ideally we want a way of getting htslib to tell + us the SAM version number to assume given no @HD line. Is + it also safe to assume that the output is coordinate sorted? + SO: is optional so we don't have to have it.*/ + /* ksprintf(&merged_hdr->out_hd, "@HD\tVN:1.5\tSO:coordinate\n"); */ + } + + // Transform the header into standard form + if (finish_merged_header(merged_hdr) < 0) + goto fail; + + hout = merged_hdr->hdr; + if (!hout) + goto fail; + + // If we're only merging a specified region move our iters to start at that point + int tid, nreg; + hts_pos_t beg, end; + + if (fn_bed) { + hreg = bed_read(fn_bed); + if (!hreg) { + fprintf(samtools_stderr, "[%s] Could not read BED file: \"%s\"\n", __func__, fn_bed); + goto fail; + } + bed_unify(hreg); + lreg = bed_reglist(hreg, ALL, &nreg); + if (!lreg || !nreg) { + fprintf(samtools_stderr, "[%s] Null or empty region list\n", __func__); + goto fail; + } + } else if (reg) { + rtrans = rtrans_build(n, sam_hdr_nref(hout), translation_tbl); + if (!rtrans) goto mem_fail; + + if (!sam_parse_region(hout, reg, &tid, &beg, &end, 0)) { + fprintf(samtools_stderr, "[%s] Badly formatted region or unknown reference name: \"%s\"\n", __func__, reg); + goto fail; + } + + } + + if (reg || fn_bed) { + hts_idx_t *reg_idx = NULL; + for (i = 0; i < n; ++i) { + + // If index filename has not been specified, look in the BAM folder + if (fn_idx != NULL) { + reg_idx = sam_index_load2(fp[i], fn[i], fn_idx[i]); + } else { + reg_idx = sam_index_load(fp[i], fn[i]); + } + if (reg_idx == NULL) { + fprintf(samtools_stderr, "[%s] failed to load index for %s. Random alignment retrieval only works for indexed BAM or CRAM files.\n", + __func__, fn[i]); + free(rtrans); + rtrans = NULL; + goto fail; + } + + int mapped_tid = INT32_MIN; + if (fn_bed) { + hts_reglist_t *rl = duplicate_reglist(lreg, nreg); + iter[i] = sam_itr_regions(reg_idx, hdr[i], rl, nreg); + } else { + // (rtrans[i*n+tid]) Look up what hout tid translates to in input tid space + mapped_tid = rtrans[i*sam_hdr_nref(hout)+tid]; + if (mapped_tid != INT32_MIN) { + iter[i] = sam_itr_queryi(reg_idx, mapped_tid, beg, end); + } else { + iter[i] = sam_itr_queryi(reg_idx, HTS_IDX_NONE, 0, 0); + } + } + + if (iter[i] == NULL) { + if (fn_bed) { + fprintf(samtools_stderr, "[%s] failed to get multi-region iterator " + "{%s, %s}\n", __func__, fn[i], fn_bed); + } else { + if (mapped_tid != INT32_MIN) { + fprintf(samtools_stderr, + "[%s] failed to get iterator over " + "{%s, %d, %"PRIhts_pos", %"PRIhts_pos"}\n", + __func__, fn[i], mapped_tid, beg, end); + } else { + fprintf(samtools_stderr, + "[%s] failed to get iterator over " + "{%s, HTS_IDX_NONE, 0, 0}\n", + __func__, fn[i]); + } + } + hts_idx_destroy(reg_idx); + free(rtrans); + rtrans = NULL; + goto fail; + } + + hts_idx_destroy(reg_idx); + } + + free(rtrans); + rtrans = NULL; + } + + // Make sure that there's enough memory for template coordinate keys, one per file to read + if (sam_order == TemplateCoordinate) { + if ((keys = malloc(sizeof(template_coordinate_keys_t))) == NULL) { + print_error("sort", "could not allocate memory for the top-level keys"); + goto mem_fail; + } + keys->n = 0; + keys->m = 0; + keys->buffer_size = 0x10000; + keys->buffers = NULL; + // Make sure that there's enough memory for template coordinate keys, one per file to read + if (keys->n + n >= keys->m * keys->buffer_size) { + if (template_coordinate_keys_realloc(keys, keys->n + n) < 0) goto mem_fail; + } + lib_lookup = lookup_libraries(hout); + if (!lib_lookup) { + goto mem_fail; + } + } + + // Load the first read from each file into the heap + for (i = 0; i < n; ++i) { + heap1_t *h = heap + i; + int res; + h->i = i; + h->entry.bam_record = bam_init1(); + h->entry.u.tag = NULL; + if (!h->entry.bam_record) goto mem_fail; + res = iter[i] ? sam_itr_next(fp[i], iter[i], h->entry.bam_record) : sam_read1(fp[i], hdr[i], h->entry.bam_record); + if (res >= 0) { + bam_translate(h->entry.bam_record, translation_tbl + i); + h->tid = h->entry.bam_record->core.tid; + h->pos = (uint64_t)(h->entry.bam_record->core.pos + 1); + h->rev = bam_is_rev(h->entry.bam_record); + h->idx = idx++; + if (g_sam_order == TagQueryName || g_sam_order == TagCoordinate) { + h->entry.u.tag = bam_aux_get(h->entry.bam_record, g_sort_tag); + } else if (g_sam_order == TemplateCoordinate) { + template_coordinate_key_t *key = template_coordinate_keys_get(keys, i); // get the next key to use + h->entry.u.key = template_coordinate_key(heap->entry.bam_record, key, hout, lib_lookup); // update the key + if (heap->entry.u.key == NULL) goto mem_fail; // key could not be created, error out + } else { + h->entry.u.tag = NULL; + } + } + else if (res == -1 && (!iter[i] || iter[i]->finished)) { + h->pos = HEAP_EMPTY; + bam_destroy1(h->entry.bam_record); + h->entry.bam_record = NULL; + h->entry.u.tag = NULL; + h->entry.u.key = NULL; + } else { + print_error(cmd, "failed to read first record from \"%s\"", fn[i]); + goto fail; + } + } + + // Open output file and write header + if ((fpout = sam_open_format(out, mode, out_fmt)) == 0) { + print_error_errno(cmd, "failed to create \"%s\"", out); + return -1; + } + if (!no_pg && sam_hdr_add_pg(hout, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error(cmd, "failed to add PG line to the header of \"%s\"", out); + sam_close(fpout); + return -1; + } + if (sam_hdr_write(fpout, hout) != 0) { + print_error_errno(cmd, "failed to write header to \"%s\"", out); + sam_close(fpout); + return -1; + } + if (write_index) { + if (!(out_idx_fn = auto_index(fpout, out, hout))){ + sam_close(fpout); + return -1; + } + } + if (!(flag & MERGE_UNCOMP)) hts_set_threads(fpout, n_threads); + + if (refs && hts_set_opt(fpout, CRAM_OPT_SHARED_REF, refs)) + goto fail; + + // Begin the actual merge + ks_heapmake(heap, n, heap); + while (heap->pos != HEAP_EMPTY) { + bam1_t *b = heap->entry.bam_record; + if (flag & MERGE_RG) { + uint8_t *rg = bam_aux_get(b, "RG"); + if (rg) bam_aux_del(b, rg); + bam_aux_append(b, "RG", 'Z', RG_len[heap->i] + 1, (uint8_t*)RG[heap->i]); + } + if (sam_write1(fpout, hout, b) < 0) { + print_error_errno(cmd, "failed writing to \"%s\"", out); + sam_close(fpout); + free(out_idx_fn); + return -1; + } + if ((j = (iter[heap->i]? sam_itr_next(fp[heap->i], iter[heap->i], b) : sam_read1(fp[heap->i], hdr[heap->i], b))) >= 0) { + bam_translate(b, translation_tbl + heap->i); + heap->tid = b->core.tid; + heap->pos = (uint64_t)(b->core.pos + 1); + heap->rev = bam_is_rev(b); + heap->idx = idx++; + if (g_sam_order == TagQueryName || g_sam_order == TagCoordinate) { + heap->entry.u.tag = bam_aux_get(heap->entry.bam_record, g_sort_tag); + } else if (g_sam_order == TemplateCoordinate) { + template_coordinate_key_t *key = template_coordinate_keys_get(keys, heap->i); // get the next key to use + heap->entry.u.key = template_coordinate_key(heap->entry.bam_record, key, hout, lib_lookup); // update the key + if (heap->entry.u.key == NULL) goto mem_fail; // key could not be created, error out + } else { + heap->entry.u.tag = NULL; + } + } else if (j == -1 && (!iter[heap->i] || iter[heap->i]->finished)) { + heap->pos = HEAP_EMPTY; + bam_destroy1(heap->entry.bam_record); + heap->entry.bam_record = NULL; + heap->entry.u.tag = NULL; + } else { + print_error(cmd, "\"%s\" is truncated", fn[heap->i]); + goto fail; + } + ks_heapadjust(heap, 0, n, heap); + } + + if (write_index) { + if (sam_idx_save(fpout) < 0) { + print_error_errno("merge", "writing index failed"); + goto fail; + } + } + free(out_idx_fn); + + // Clean up and close + if (flag & MERGE_RG) { + for (i = 0; i != n; ++i) free(RG[i]); + free(RG_len); + } + for (i = 0; i < n; ++i) { + trans_tbl_destroy(translation_tbl + i); + hts_itr_destroy(iter[i]); + sam_hdr_destroy(hdr[i]); + sam_close(fp[i]); + } + sam_hdr_destroy(hin); + sam_hdr_destroy(hout); + free_merged_header(merged_hdr); + hts_reglist_free(lreg, nreg); + bed_destroy(hreg); + free(RG); free(translation_tbl); free(fp); free(heap); free(iter); free(hdr); + if (sam_close(fpout) < 0) { + print_error(cmd, "error closing output file"); + return -1; + } + return 0; + + mem_fail: + print_error(cmd, "Out of memory"); + + fail: + if (flag & MERGE_RG) { + if (RG) { + for (i = 0; i != n; ++i) free(RG[i]); + } + free(RG_len); + } + for (i = 0; i < n; ++i) { + if (translation_tbl && translation_tbl[i].tid_trans) trans_tbl_destroy(translation_tbl + i); + if (iter && iter[i]) hts_itr_destroy(iter[i]); + if (hdr && hdr[i]) sam_hdr_destroy(hdr[i]); + if (fp && fp[i]) sam_close(fp[i]); + if (heap && heap[i].entry.bam_record) bam_destroy1(heap[i].entry.bam_record); + } + if (hout) sam_hdr_destroy(hout); + free(RG); + free(translation_tbl); + free(hdr); + hts_reglist_free(lreg, nreg); + bed_destroy(hreg); + free(iter); + free(heap); + free(fp); + free(rtrans); + free(out_idx_fn); + if (keys != NULL) { + for (i = 0; i < keys->m; ++i) { + free(keys->buffers[i]); + } + free(keys->buffers); + free(keys); + } + lib_lookup_destroy(lib_lookup); + return -1; +} + +// Unused here but may be used by legacy samtools-using third-party code +int bam_merge_core(int by_qname, const char *out, const char *headers, int n, char * const *fn, int flag, const char *reg) +{ + char mode[12]; + strcpy(mode, "wb"); + if (flag & MERGE_UNCOMP) strcat(mode, "0"); + else if (flag & MERGE_LEVEL1) strcat(mode, "1"); + SamOrder sam_order = by_qname ? QueryName : Coordinate; + return bam_merge_core2(sam_order, NULL, out, mode, headers, n, fn, NULL, NULL, flag, reg, 0, "merge", NULL, NULL, 0, NULL, 1); +} + +static void merge_usage(FILE *to) +{ + fprintf(to, +"Usage: samtools merge [options] -o [options] ... \n" +" or: samtools merge [options] ... \n" +"\n" +"Options:\n" +" -n Input files are sorted by read name\n" +" -t TAG Input files are sorted by TAG value\n" +" -r Attach RG tag (inferred from file names)\n" +" -u Uncompressed BAM output\n" +" -f Overwrite the output BAM if exist\n" +" -o FILE Specify output file via option instead of argument\n" +" -1 Compress level 1\n" +" -l INT Compression level, from 0 to 9 [-1]\n" +" -R STR Merge file in the specified region STR [all]\n" +" -h FILE Copy the header in FILE to [in1.bam]\n" +" -c Combine @RG headers with colliding IDs [alter IDs to be distinct]\n" +" -p Combine @PG headers with colliding IDs [alter IDs to be distinct]\n" +" -s VALUE Override random seed\n" +" -b FILE List of input BAM filenames, one per line [null]\n" +" -X Use customized index files\n" +" -L FILE Specify a BED file for multiple region filtering [null]\n" +" --no-PG do not add a PG line\n" +" --template-coordinate Input files are sorted by template-coordinate\n"); + sam_global_opt_help(to, "-.O..@.."); +} + +int bam_merge(int argc, char *argv[]) +{ + int c, flag = 0, ret = 0, level = -1, has_index_file = 0; + char *fn_headers = NULL, *reg = NULL, mode[12]; + char *sort_tag = NULL, *fnout = NULL, *arg_list = NULL; + long random_seed = (long)time(NULL); + char** fn = NULL; + char** fn_idx = NULL, *fn_bed = NULL; + int fn_size = 0, no_pg = 0; + SamOrder sam_order = Coordinate; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + { "threads", required_argument, NULL, '@' }, + {"no-PG", no_argument, NULL, 1}, + { "template-coordinate", no_argument, NULL, 2}, + { NULL, 0, NULL, 0 } + }; + + if (argc == 1) { + merge_usage(samtools_stdout); + return 0; + } + + while ((c = getopt_long(argc, argv, "h:nru1R:o:f@:l:cps:b:O:t:XL:", lopts, NULL)) >= 0) { + switch (c) { + case 'r': flag |= MERGE_RG; break; + case 'f': flag |= MERGE_FORCE; break; + case 'h': fn_headers = optarg; break; + case 'n': sam_order = QueryName; break; + case 'o': fnout = optarg; break; + case 't': sort_tag = optarg; break; + case '1': flag |= MERGE_LEVEL1; level = 1; break; + case 'u': flag |= MERGE_UNCOMP; level = 0; break; + case 'R': reg = strdup(optarg); break; + case 'l': level = atoi(optarg); break; + case 'c': flag |= MERGE_COMBINE_RG; break; + case 'p': flag |= MERGE_COMBINE_PG; break; + case 's': random_seed = atol(optarg); break; + case 'X': has_index_file = 1; break; // -X flag for index filename + case 'L': fn_bed = optarg; break; + case 'b': { + // load the list of files to read + if (has_index_file) { + fprintf(samtools_stderr,"Error: The -b option cannot be combined with -X\n"); + ret = 1; goto end; + } + int nfiles; + char **fn_read = hts_readlines(optarg, &nfiles); + if (fn_read) { + // Append to end of array + fn = realloc(fn, (fn_size+nfiles) * sizeof(char*)); + if (fn == NULL) { ret = 1; goto end; } + memcpy(fn+fn_size, fn_read, nfiles * sizeof(char*)); + fn_size += nfiles; + free(fn_read); + } + else { + print_error("merge", "Invalid file list \"%s\"", optarg); + ret = 1; + } + break; + } + case 1: no_pg = 1; break; + case 2: sam_order = TemplateCoordinate; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': merge_usage(samtools_stderr); return 1; + } + } + + if (sort_tag != NULL) { + sam_order = sam_order == QueryName ? TagQueryName : TagCoordinate; + } + + if (fnout == NULL && argc - optind >= 1) { + fnout = argv[optind]; + optind++; + } + if (fnout == NULL) { + print_error("merge", "You must at least specify the output file"); + merge_usage(samtools_stderr); + return 1; + } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("merge", "failed to create arg_list"); + return 1; + } + + hts_srand48(random_seed); + if (!(flag & MERGE_FORCE) && strcmp(fnout, "-") != 0) { + struct stat sbuf; + if (stat(fnout, &sbuf) == 0 && S_ISREG(sbuf.st_mode)) { + fprintf(samtools_stderr, "[%s] File '%s' exists. Please apply '-f' to overwrite. Abort.\n", __func__, fnout); + ret = 1; + goto end; + } + } + + int nargcfiles = 0; + if (has_index_file) { // Calculate # of input BAM files + if ((argc - optind) % 2 != 0) { + fprintf(samtools_stderr, "Odd number of filenames detected! Each BAM file should have an index file\n"); + ret = 1; + goto end; + } + nargcfiles = (argc - optind) / 2; + } else { + nargcfiles = argc - optind; + } + + if (nargcfiles > 0) { + // Add argc files to end of array + fn = realloc(fn, (fn_size+nargcfiles) * sizeof(char*)); + if (fn == NULL) { ret = 1; goto end; } + memcpy(fn+fn_size, argv + optind, nargcfiles * sizeof(char*)); + + if(has_index_file) { + fn_idx = realloc(fn_idx, nargcfiles * sizeof(char*)); + if (fn_idx == NULL) { ret = 1; goto end; } + memcpy(fn_idx+fn_size, argv + nargcfiles + optind, nargcfiles * sizeof(char*)); + } + } + if (fn_size+nargcfiles < 1) { + print_error("merge", "You must specify at least one (and usually two or more) input files"); + merge_usage(samtools_stderr); + ret = 1; + goto end; + } + + if (reg && fn_bed) { + print_error("merge", "You must specify either a BED file or a region"); + ret = 1; + goto end; + } + strcpy(mode, "wb"); + sam_open_mode(mode+1, fnout, NULL); + if (level >= 0) sprintf(strchr(mode, '\0'), "%d", level < 9? level : 9); + if (bam_merge_core2(sam_order, sort_tag, fnout, mode, fn_headers, + fn_size+nargcfiles, fn, fn_idx, fn_bed, flag, reg, ga.nthreads, + "merge", &ga.in, &ga.out, ga.write_index, arg_list, no_pg) < 0) + ret = 1; + +end: + if (fn_size > 0) { + int i; + for (i=0; ii, res; + if (i < nfiles) { // read from file + res = sam_read1(fp[i], hout, heap->entry.bam_record); + if (res >= 0 && g_sam_order == TemplateCoordinate) { // file read OK and TemplateCoordinate order + // It is assumed that there are nfiles more keys allocated than keys->n; see allocation in bam_merge_simple + template_coordinate_key_t *key = template_coordinate_keys_get(keys, keys->n + i); // get the next key to use + heap->entry.u.key = template_coordinate_key(heap->entry.bam_record, key, hout, lib_lookup); // update the key + if (heap->entry.u.key == NULL) res = -1; // key could not be created, error out + } + } else { // read from memory + if (in_mem[i - nfiles].from < in_mem[i - nfiles].to) { + size_t from = in_mem[i - nfiles].from; + heap->entry.bam_record = buf[from].bam_record; + if (g_sam_order == TemplateCoordinate) heap->entry.u.key = buf[from].u.key; + in_mem[i - nfiles].from++; + res = 0; + } else { + res = -1; + } + } + if (res >= 0) { + heap->tid = heap->entry.bam_record->core.tid; + heap->pos = (uint64_t)(heap->entry.bam_record->core.pos + 1); + heap->rev = bam_is_rev(heap->entry.bam_record); + heap->idx = (*idx)++; + if (g_sam_order == TagQueryName || g_sam_order == TagCoordinate) { + heap->entry.u.tag = bam_aux_get(heap->entry.bam_record, g_sort_tag); + } else if (g_sam_order != TemplateCoordinate) { + heap->entry.u.tag = NULL; + heap->entry.u.key = NULL; + } + } else if (res == -1) { + heap->pos = HEAP_EMPTY; + if (i < nfiles) bam_destroy1(heap->entry.bam_record); + heap->entry.bam_record = NULL; + heap->entry.u.tag = NULL; + heap->entry.u.key = NULL; + } else { + return -1; + } + return 0; +} + +static int bam_merge_simple(SamOrder sam_order, char *sort_tag, const char *out, + const char *mode, sam_hdr_t *hout, + int n, char * const *fn, int num_in_mem, + buf_region *in_mem, bam1_tag *buf, + template_coordinate_keys_t *keys, + khash_t(const_c2c) *lib_lookup, int n_threads, + const char *cmd, const htsFormat *in_fmt, + const htsFormat *out_fmt, char *arg_list, int no_pg, + int write_index) { + samFile *fpout = NULL, **fp = NULL; + heap1_t *heap = NULL; + uint64_t idx = 0; + int i, heap_size = n + num_in_mem; + char *out_idx_fn = NULL; + + if (sam_order == TagQueryName || sam_order == TagCoordinate) { + g_sort_tag[0] = sort_tag[0]; + g_sort_tag[1] = sort_tag[0] ? sort_tag[1] : '\0'; + } + if (n > 0) { + fp = (samFile**)calloc(n, sizeof(samFile*)); + if (!fp) goto mem_fail; + } + heap = (heap1_t*)calloc(heap_size, sizeof(heap1_t)); + if (!heap) goto mem_fail; + + // Make sure that there's enough memory for template coordinate keys, one per file to read + if (keys && keys->n + n >= keys->m * keys->buffer_size) { + if (template_coordinate_keys_realloc(keys, keys->n + n) < 0) goto mem_fail; + } + + // Open each file, read the header and put the first read into the heap + for (i = 0; i < heap_size; i++) { + sam_hdr_t *hin; + heap1_t *h = &heap[i]; + + if (i < n) { + fp[i] = sam_open_format(fn[i], "r", in_fmt); + if (fp[i] == NULL) { + print_error_errno(cmd, "fail to open \"%s\"", fn[i]); + goto fail; + } + + // Read header ... + hin = sam_hdr_read(fp[i]); + if (hin == NULL) { + print_error(cmd, "failed to read header from \"%s\"", fn[i]); + goto fail; + } + // ... and throw it away as we don't really need it + sam_hdr_destroy(hin); + } + + // Get a read into the heap + h->i = i; + h->entry.u.tag = NULL; + h->entry.u.key = NULL; + if (i < n) { + h->entry.bam_record = bam_init1(); + if (!h->entry.bam_record) goto mem_fail; + } + if (heap_add_read(h, n, fp, num_in_mem, in_mem, buf, keys, &idx, hout, + lib_lookup) < 0) { + assert(i < n); + print_error(cmd, "failed to read first record from \"%s\"", fn[i]); + goto fail; + } + } + + // Open output file and write header + if ((fpout = sam_open_format(out, mode, out_fmt)) == 0) { + print_error_errno(cmd, "failed to create \"%s\"", out); + return -1; + } + + if (!no_pg && sam_hdr_add_pg(hout, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error(cmd, "failed to add PG line to the header of \"%s\"", out); + sam_close(fpout); + return -1; + } + + if (n_threads > 1) hts_set_threads(fpout, n_threads); + + if (sam_hdr_write(fpout, hout) != 0) { + print_error_errno(cmd, "failed to write header to \"%s\"", out); + sam_close(fpout); + return -1; + } + + if (write_index) { + if (!(out_idx_fn = auto_index(fpout, out, hout))){ + sam_close(fpout); + return -1; + } + } + + // Now do the merge + ks_heapmake(heap, heap_size, heap); + while (heap->pos != HEAP_EMPTY) { + bam1_t *b = heap->entry.bam_record; + if (g_sam_order == MinHash && b->core.tid == -1) { + // Remove the cached minhash value + b->core.pos = -1; + b->core.mpos = -1; + b->core.isize = 0; + } + if (sam_write1(fpout, hout, b) < 0) { + print_error_errno(cmd, "failed writing to \"%s\"", out); + goto fail; + } + if (heap_add_read(heap, n, fp, num_in_mem, in_mem, buf, keys, &idx, + hout, lib_lookup) < 0) { + assert(heap->i < n); + print_error(cmd, "Error reading \"%s\" : %s", + fn[heap->i], strerror(errno)); + goto fail; + } + ks_heapadjust(heap, 0, heap_size, heap); + } + // Clean up and close + for (i = 0; i < n; i++) { + if (sam_close(fp[i]) != 0) { + print_error(cmd, "Error on closing \"%s\" : %s", + fn[i], strerror(errno)); + } + } + free(fp); + free(heap); + + if (write_index) { + if (sam_idx_save(fpout) < 0) { + print_error_errno("merge", "writing index failed"); + goto fail; + } + free(out_idx_fn); + } + + if (sam_close(fpout) < 0) { + print_error(cmd, "error closing output file"); + return -1; + } + return 0; + mem_fail: + print_error(cmd, "Out of memory"); + + fail: + for (i = 0; i < n; i++) { + if (fp && fp[i]) sam_close(fp[i]); + } + for (i = 0; i < heap_size; i++) { + if (heap && heap[i].i < n && heap[i].entry.bam_record) + bam_destroy1(heap[i].entry.bam_record); + } + free(fp); + free(heap); + if (fpout) sam_close(fpout); + free(out_idx_fn); + return -1; +} + +// Function to compare reads and determine which one is < or > the other +// Handle sort-by-pos and sort-by-name. Used as the secondary sort in bam1_lt_by_tag, if reads are equivalent by tag. +// Returns a value less than, equal to or greater than zero if a is less than, +// equal to or greater than b, respectively. +static inline int bam1_cmp_core(const bam1_tag a, const bam1_tag b) +{ + uint64_t pa, pb; + if (!a.bam_record) return 1; + if (!b.bam_record) return 0; + + if (g_sam_order == QueryName || g_sam_order == TagQueryName) { + int t = strnum_cmp(bam_get_qname(a.bam_record), bam_get_qname(b.bam_record)); + if (t != 0) return t; + return (int) (a.bam_record->core.flag&0xc0) - (int) (b.bam_record->core.flag&0xc0); + } else { + pa = a.bam_record->core.tid; + pb = b.bam_record->core.tid; + + if (pa == pb) { + pa = (uint64_t)(a.bam_record->core.pos+1); + pb = (uint64_t)(b.bam_record->core.pos+1); + } + + if (pa == pb) { + pa = bam_is_rev(a.bam_record); + pb = bam_is_rev(b.bam_record); + } + + return pa < pb ? -1 : (pa > pb ? 1 : 0); + } +} + +uint8_t normalize_type(const uint8_t* aux) { + if (*aux == 'c' || *aux == 'C' || *aux == 's' || *aux == 'S' || *aux == 'i' || *aux == 'I') { + return 'c'; + } else if (*aux == 'f' || *aux == 'd') { + return 'f'; + } else if (*aux == 'H' || *aux == 'Z') { + return 'H'; + } else { + return *aux; + } +} + +// Sort record by tag, using pos or read name as a secondary key if tags are identical. Reads not carrying the tag sort first. +// Tags are first sorted by the type character (in case the types differ), or by the appropriate comparator for that type if they agree. +// Returns a value less than, equal to or greater than zero if a is less than, +// equal to or greater than b, respectively. +static inline int bam1_cmp_by_tag(const bam1_tag a, const bam1_tag b) +{ + const uint8_t* aux_a = a.u.tag; + const uint8_t* aux_b = b.u.tag; + + if (aux_a == NULL && aux_b != NULL) { + return -1; + } else if (aux_a != NULL && aux_b == NULL) { + return 1; + } else if (aux_a == NULL && aux_b == NULL) { + return bam1_cmp_core(a,b); + } + + // 'Normalize' the letters of the datatypes to a canonical letter, + // so that comparison of different types + // forms a correct total ordering. + uint8_t a_type = normalize_type(aux_a); + uint8_t b_type = normalize_type(aux_b); + + if (a_type != b_type) { + // Fix int to float comparisons by using bam_aux2f() to read the int + if (a_type == 'c' && b_type == 'f') { + a_type = 'f'; + } else if (a_type == 'f' && b_type == 'c') { + b_type = 'f'; + } else { + // Unfixable mismatched types + return a_type < b_type ? -1 : 1; + } + } + + if (a_type == 'c') { + int64_t va = bam_aux2i(aux_a); + int64_t vb = bam_aux2i(aux_b); + if (va != vb) return va < vb ? -1 : 1; + return bam1_cmp_core(a, b); + } else if (a_type == 'f') { + double va = bam_aux2f(aux_a); + double vb = bam_aux2f(aux_b); + if (va != vb) return va < vb ? -1 : 1; + return bam1_cmp_core(a, b); + } else if (a_type == 'A') { + unsigned char va = bam_aux2A(aux_a); + unsigned char vb = bam_aux2A(aux_b); + if (va != vb) return va < vb ? -1 : 1; + return bam1_cmp_core(a, b); + } else if (a_type == 'H') { + int t = strcmp(bam_aux2Z(aux_a), bam_aux2Z(aux_b)); + if (t) return t; + return bam1_cmp_core(a, b); + } else { + return bam1_cmp_core(a,b); + } +} + +// Sort by minimiser (stored in bam1_tag.u.pos). +// If equal, sort by position. +// +// The 64-bit sort key is split over the bam pos and isize fields. +// This permits it to survive writing to temporary file and coming back. +static inline int bam1_cmp_by_minhash(const bam1_tag a, const bam1_tag b) +{ + const bam1_t *A = a.bam_record; + const bam1_t *B = b.bam_record; + + if (!A) return 1; + if (!B) return 0; + + if (A->core.tid != -1 || B->core.tid != -1) return bam1_cmp_core(a,b); + + const uint64_t m_a = (((uint64_t)A->core.pos)<<32)|(uint32_t)A->core.mpos; + const uint64_t m_b = (((uint64_t)B->core.pos)<<32)|(uint32_t)B->core.mpos; + + if (m_a < m_b) // by hash + return -1; + else if (m_a > m_b) + return 1; + else if (A->core.isize < B->core.isize) // by hash location in seq + return -1; + else if (A->core.isize > B->core.isize) + return 1; + else + return bam1_cmp_core(a,b); +} + +// compares to molecular identifiers, ignoring any trailing slash and subsequent single-character +// * if mid1 is less than mid2, then -1 will be returned +// * if mid1 is greater than mid2, then 1 will be returned +static inline int template_coordinate_key_compare_mid(const char* mid1, const char* mid2) { + size_t i = 0; + size_t len1 = strlen(mid1); + size_t len2 = strlen(mid2); + size_t shortest; + + // Snip off trailing slash followed by a single character, if present + if (len1 >= 2 && mid1[len1-2] == '/') len1 -= 2; + if (len2 >= 2 && mid2[len2-2] == '/') len2 -= 2; + shortest = len1 < len2 ? len1 : len2; + + // find first mismatching character + while (i < shortest && mid1[i] == mid2[i]) i++; + + // compare last characters + if (i == len1 && i < len2) return -1; // mid1 shorter + if (i == len2 && i < len1) return 1; // mid2 shorter + if (i == len1 && i == len2) return 0; // all characters match + if (mid1[i] < mid2[i]) return -1; // mid1 earlier + else return 1; +} + + +// Builds a key use to sort in TemplateCoordinate order. Returns NULL if the key could not be created (e.g. MC +// tag is missing), otherwise the pointer to the provided key. +static template_coordinate_key_t* template_coordinate_key(bam1_t *b, template_coordinate_key_t *key, sam_hdr_t *hdr, khash_t(const_c2c) *lib_lookup) { + uint8_t *data; + char *rg; + khiter_t k; + + // defaults + key->tid1 = key->tid2 = INT32_MAX; + key->pos1 = key->pos2 = HTS_POS_MAX; + key->neg1 = key->neg2 = false; + key->mid = ""; + + // update values + rg = (char *)bam_aux_get(b, "RG"); + if (rg && rg[0] == 'Z' + &&(k = kh_get(const_c2c, lib_lookup, rg + 1)) < kh_end(lib_lookup)) { + key->library = kh_value(lib_lookup, k); + } else { + key->library = ""; + } + key->name = bam_get_qname(b); + if (!(b->core.flag & BAM_FUNMAP)) { // read is mapped, update coordinates + key->tid1 = b->core.tid; + key->neg1 = bam_is_rev(b); + key->pos1 = (key->neg1) ? unclipped_end(b) : unclipped_start(b); + } + if (b->core.flag & BAM_FPAIRED && !(b->core.flag & BAM_FMUNMAP)) { // mate is mapped, update coordinates + char *cigar; + if ((data = bam_aux_get(b, "MC"))) { + if (!(cigar = bam_aux2Z(data))) { + fprintf(samtools_stderr, "[bam_sort] error: MC tag wrong type. Please use the MC tag provided by samtools fixmate.\n"); + return NULL; + } + } else { + fprintf(samtools_stderr, "[bam_sort] error: no MC tag. Please run samtools fixmate on file first.\n"); + return NULL; + } + key->tid2 = b->core.mtid; + key->neg2 = bam_is_mrev(b); + key->pos2 = (key->neg2) ? unclipped_other_end(b->core.mpos, cigar) : unclipped_other_start(b->core.mpos, cigar); + } + + if ((data = bam_aux_get(b, "MI"))) { + if (!(key->mid=bam_aux2Z(data))) { + fprintf(samtools_stderr, "[bam_sort] error: MI tag wrong type (not a string).\n"); + return NULL; + } + } + + // set is_upper_of_pair, and swap if we get the same key regardless of which end + // of the pair it is + if (key->tid1 < key->tid2 + || (key->tid1 == key->tid2 && key->pos1 < key->pos2) + || (key->tid1 == key->tid2 && key->pos1 == key->pos2 && !key->neg1)) { + key->is_upper_of_pair = false; + } else { + key->is_upper_of_pair = true; + // swap + int tmp_tid; + hts_pos_t tmp_pos; + bool tmp_neg; + tmp_tid = key->tid1; + key->tid1 = key->tid2; + key->tid2 = tmp_tid; + tmp_pos = key->pos1; + key->pos1 = key->pos2; + key->pos2 = tmp_pos; + tmp_neg = key->neg1; + key->neg1 = key->neg2; + key->neg2 = tmp_neg; + } + + return key; +} + +// Function to compare reads and determine which one is < or > the other +// Handles template-coordinate, which sorts by: +// 1. the earlier unclipped 5' coordinate of the read pair +// 2. the higher unclipped 5' coordinate of the read pair +// 3. library (from read group) +// 4. the molecular identifier (if present) +// 5. read name +// 6. if unpaired, or if R1 has the lower coordinates of the pair +// Returns a value less than, equal to or greater than zero if a is less than, +// equal to or greater than b, respectively. +static inline int bam1_cmp_template_coordinate(const bam1_tag a, const bam1_tag b) +{ + if (!a.bam_record) return 1; + if (!b.bam_record) return 0; + + const template_coordinate_key_t* key_a = a.u.key; + const template_coordinate_key_t* key_b = b.u.key; + + int retval = 0; + if (0 == retval) retval = key_a->tid1 - key_b->tid1; + if (0 == retval) retval = key_a->tid2 - key_b->tid2; + if (0 == retval) retval = key_a->pos1 < key_b->pos1 ? -1 : (key_a->pos1 > key_b->pos1 ? 1 : 0); + if (0 == retval) retval = key_a->pos2 < key_b->pos2 ? -1 : (key_a->pos2 > key_b->pos2 ? 1 : 0); + if (0 == retval) retval = key_a->neg1 == key_b->neg1 ? 0 : (key_a->neg1 ? -1 : 1); + if (0 == retval) retval = key_a->neg2 == key_b->neg2 ? 0 : (key_a->neg2 ? -1 : 1); + if (0 == retval) retval = strcmp(key_a->library, key_b->library); + if (0 == retval) retval = template_coordinate_key_compare_mid(key_a->mid, key_b->mid); + if (0 == retval) retval = strcmp(key_a->name, key_b->name); + if (0 == retval) retval = key_a->is_upper_of_pair == key_b->is_upper_of_pair ? 0 : (key_a->is_upper_of_pair ? 1 : -1); + return retval < 0 ? -1 : (retval > 0 ? 1 : 0); +} + + +// Function to compare reads and determine which one is < the other +// Handle sort-by-pos, sort-by-name, sort-by-tag, or sort-by-template-coordinate. +static inline int bam1_lt(const bam1_tag a, const bam1_tag b) +{ + switch (g_sam_order) { + case Coordinate: + case QueryName: + return bam1_cmp_core(a, b) < 0; + case TagQueryName: + case TagCoordinate: + return bam1_cmp_by_tag(a, b) < 0; + case MinHash: + return bam1_cmp_by_minhash(a, b) < 0; + case TemplateCoordinate: + return bam1_cmp_template_coordinate(a, b) < 0; + default: + return bam1_cmp_core(a,b) < 0; + } +} + + + +KSORT_INIT(sort, bam1_tag, bam1_lt) + +typedef struct { + size_t buf_len; + const char *prefix; + bam1_tag *buf; + const sam_hdr_t *h; + char *tmpfile_name; + int index; + int error; + int no_save; + int large_pos; + int minimiser_kmer; +} worker_t; + +// Returns 0 for success +// -1 for failure +static int write_buffer(const char *fn, const char *mode, size_t l, bam1_tag *buf, + const sam_hdr_t *h, int n_threads, const htsFormat *fmt, + int clear_minhash, char *arg_list, int no_pg, int write_index) +{ + size_t i; + samFile* fp; + char *out_idx_fn = NULL; + + fp = sam_open_format(fn, mode, fmt); + if (fp == NULL) return -1; + if (!no_pg && sam_hdr_add_pg((sam_hdr_t *)h, "samtools", "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + goto fail; + } + if (sam_hdr_write(fp, h) != 0) goto fail; + + if (write_index) + if (!(out_idx_fn = auto_index(fp, fn, (sam_hdr_t *)h))) goto fail; + + if (n_threads > 1) hts_set_threads(fp, n_threads); + for (i = 0; i < l; ++i) { + bam1_t *b = buf[i].bam_record; + if (clear_minhash && b->core.tid == -1) { + // Remove the cached minhash value + b->core.pos = -1; + b->core.mpos = -1; + b->core.isize = 0; + } + if (sam_write1(fp, h, b) < 0) goto fail; + } + + if (write_index) { + if (sam_idx_save(fp) < 0) { + print_error_errno("merge", "writing index failed"); + goto fail; + } + free(out_idx_fn); + } + + + if (sam_close(fp) < 0) return -1; + return 0; + fail: + sam_close(fp); + free(out_idx_fn); + return -1; +} + +#define NUMBASE 256 + +static int ks_radixsort(size_t n, bam1_tag *buf, const sam_hdr_t *h) +{ + int curr = 0, ret = -1; + ssize_t i; + bam1_tag *buf_ar2[2], *bam_a, *bam_b; + uint64_t max_pos = 1; + uint32_t max_tid = 1, tid_bytes = 0, pos_bytes = 0, byte = 0; + uint32_t tid_shift_l, tid_shift_r; + int nref = sam_hdr_nref(h); + + // Count number of bytes needed for biggest tid and pos + // Notes: Add 1 to core.pos so always positive. + // Convert unmapped tid (-1) to number of references so unmapped + // sort to the end. + for (i = 0; i < n; i++) { + bam1_t *b = buf[i].bam_record; + uint32_t tid = b->core.tid == -1 ? nref : b->core.tid; + uint64_t pos = ((uint64_t)(b->core.pos + 1) << 1) | bam_is_rev(b); + if (max_tid < tid) + max_tid = tid; + if (max_pos < pos) + max_pos = pos; + } + + for (; max_pos > 0; max_pos >>= 8) pos_bytes++; + for (; max_tid > 0; max_tid >>= 8) tid_bytes++; + assert(pos_bytes + tid_bytes < sizeof(buf[0].u.pos_tid)); + + tid_shift_l = pos_bytes * 8; + tid_shift_r = 64 - tid_shift_l; + + // Write position and tid into bam1_tag::u::pos_tid using minimum number + // of bytes required. Values are stored little-endian so that we + // get a least-significant digit (byte) radix sort. + for (i = 0; i < n; i++) { + bam1_t *b = buf[i].bam_record; + uint32_t tid = b->core.tid == -1 ? nref : b->core.tid; + // 'pos' here includes as many bytes of tid as will fit + // in the space remaining above pos_bytes. The rest of tid + // is written out separately. + uint64_t pos = (bam_is_rev(b) | + ((uint64_t)(b->core.pos + 1) << 1) | + (tid_shift_l < 64 ? (uint64_t) tid << tid_shift_l : 0)); + u64_to_le(pos, buf[i].u.pos_tid); + u32_to_le(tid_shift_r < 32 ? tid >> tid_shift_r : 0, + &buf[i].u.pos_tid[8]); + } + + buf_ar2[0] = buf; + buf_ar2[1] = (bam1_tag *)malloc(sizeof(bam1_tag) * n); + if (buf_ar2[1] == NULL) { + print_error("sort", "couldn't allocate memory for temporary buf"); + goto err; + } + + // Least-significant digit radix sort (where "digits" are bytes) + for (byte = 0; byte < pos_bytes + tid_bytes; byte++) { + size_t remainders[NUMBASE] = { 0 }; + bam_a = buf_ar2[curr]; bam_b = buf_ar2[1-curr]; + for (i = 0; i < n; ++i) + remainders[bam_a[i].u.pos_tid[byte]]++; + for (i = 1; i < NUMBASE; ++i) + remainders[i] += remainders[i - 1]; + for (i = n - 1; i >= 0; i--) { + size_t j = --remainders[bam_a[i].u.pos_tid[byte]]; + bam_b[j] = bam_a[i]; + } + curr = 1 - curr; + } + if (curr == 1) { + bam1_tag *end = buf + n; + bam_a = buf_ar2[0]; bam_b = buf_ar2[1]; + while (bam_a < end) *bam_a++ = *bam_b++; + } + + ret = 0; +err: + free(buf_ar2[1]); + return ret; +} + +/* + * Computes the minhash of a sequence using both forward and reverse strands. + * + * This is used as a sort key for unmapped data, to collate like sequences + * together and to improve compression ratio. + * + * The minhash is returned and *pos filled out with location of this hash + * key in the sequence if pos != NULL. + */ +static uint64_t minhash(bam1_t *b, int kmer, int *pos, int *rev) { + uint64_t hashf = 0, minhashf = UINT64_MAX; + uint64_t hashr = 0, minhashr = UINT64_MAX; + int minhashpf = 0, minhashpr = 0, i; + uint64_t mask = (1L<<(2*kmer))-1; + unsigned char *seq = bam_get_seq(b); + int len = b->core.l_qseq; + + // Lookup tables for bam_seqi to 0123 fwd/rev hashes + // =ACM GRSV TWYH KDBN +#define X 0 + unsigned char L[16] = { + X,0,1,X, 2,X,X,X, 3,X,X,X, X,X,X,X, + }; + uint64_t R[16] = { + X,3,2,X, 1,X,X,X, 0,X,X,X, X,X,X,X, + }; + for (i = 0; i < 16; i++) + R[i] <<= 2*(kmer-1); + + // Punt homopolymers somewhere central in the hash space +#define XOR (0xdead7878beef7878 & mask) + + // Initialise hash keys + for (i = 0; i < kmer-1 && i < len; i++) { + int base = bam_seqi(seq, i); + hashf = (hashf<<2) | L[base]; + hashr = (hashr>>2) | R[base]; + } + + // Loop to find minimum + for (; i < len; i++) { + int base = bam_seqi(seq, i); + + hashf = ((hashf<<2) | L[base]) & mask; + hashr = (hashr>>2) | R[base]; + + if (minhashf > (hashf^XOR)) + minhashf = (hashf^XOR), minhashpf = i; + if (minhashr > (hashr^XOR)) + minhashr = (hashr^XOR), minhashpr = len-i+kmer-2; + + } + + if (minhashf <= minhashr) { + if (rev) *rev = 0; + if (pos) *pos = minhashpf; + return minhashf; + } else { + if (rev) *rev = 1; + if (pos) *pos = minhashpr; + return minhashr; + } +} + +//--- Start of candidates to punt to htslib +/*! + * @abstract + * Extracts the sequence (in current alignment orientation) from + * a bam record and places it in buf, which is nul terminated. + * + * @param b The bam structure + * @param buf A buffer at least b->core.l_qseq+1 bytes long + */ +static void bam_to_seq(bam1_t *b, char *buf) { + int i; + uint8_t *seq = bam_get_seq(b); + for (i = 0; i < b->core.l_qseq; i++) + buf[i] = seq_nt16_str[bam_seqi(seq, i)]; + buf[i] = 0; +} + +/*! + * @abstract + * Writes a new sequence, of length b->core.l_qseq, to a BAM record. + * + * If a sequence of a new length is required the caller must first make + * room for it by updating the bam1_t struct. + * + * @param b The bam structure + * @param buf A buffer at least b->core.l_qseq bytes long + */ +static void seq_to_bam(bam1_t *b, char *buf) { + int i; + uint8_t *seq = bam_get_seq(b); + for (i = 0; i < b->core.l_qseq; i++) + bam_set_seqi(seq, i, seq_nt16_table[(unsigned char)buf[i]]); +} + +/*! + * @abstract Reverse complements a BAM record. + * + * It's possible to do this inline, but complex due to the 4-bit sequence + * encoding. For now I take the dumb approach. + * + * @param b Pointer to a BAM alignment + * + * @return 0 on success, -1 on failure (ENOMEM) + */ +static int reverse_complement(bam1_t *b) { + static char comp[256] = { + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//00 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//10 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//20 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//30 + + // * * * * E F * * I J * L * * O + '@','T','V','G', 'H','E','F','C', 'D','I','H','M', 'L','K','N','O',//40 + //P Q * * * * * * X Y Z [ \ ] ^ _ + 'P','Q','Y','S', 'A','A','B','W', 'X','Y','Z','[','\\','[','^','_',//50 + //` * * * * E F * * I J * L * * O + '`','t','v','g', 'h','e','f','c', 'd','i','j','m', 'l','k','n','o',//60 + //P Q * * * * * * X Y Z { | } ~ DEL + 'p','q','y','s', 'a','a','b','w', 'x','y','z','{', '|','}','~',127,//70 + + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//80 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//90 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//A0 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//B0 + + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//C0 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//D0 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//E0 + 'N','N','N','N', 'N','N','N','N', 'N','N','N','N', 'N','N','N','N',//F0 + }; + char seq_[10000], *seq = seq_; + uint8_t *qual = bam_get_qual(b); + int i, j; + + if (b->core.l_qseq >= 10000) + if (!(seq = malloc(b->core.l_qseq+1))) + return -1; + + bam_to_seq(b, seq); + + for (i = 0, j = b->core.l_qseq-1; i < j; i++, j--) { + unsigned char tmp = seq[i]; + seq[i] = comp[(unsigned char)seq[j]]; + seq[j] = comp[tmp]; + tmp = qual[i]; + qual[i] = qual[j]; + qual[j] = tmp; + } + if (i ==j) + seq[i] = comp[(unsigned char)seq[i]]; + + seq_to_bam(b, seq); + + if (seq != seq_) + free(seq); + + b->core.flag ^= 0x10; + + return 0; +} +//--- End of candidates to punt to htslib + + +static inline void worker_minhash(worker_t *w) { + int i; + for (i = 0; i < w->buf_len; i++) { + bam1_t *b = w->buf[i].bam_record; + if (b->core.tid != -1) + continue; + + int pos = 0, rev = 0; + uint64_t mh = minhash(b, w->minimiser_kmer, &pos, &rev); + if (rev) + reverse_complement(b); + + // Store 64-bit hash in unmapped pos and mpos fields. + // The position of hash is in isize, which we use for + // resolving ties when sorting by hash key. + // These are unused for completely unmapped data and + // will be reset during final output. + b->core.pos = mh>>31; + b->core.mpos = mh&0x7fffffff; + b->core.isize = 65535-pos >=0 ? 65535-pos : 0; + } +} + +static void *worker(void *data) +{ + worker_t *w = (worker_t*)data; + char *name; + size_t name_len; + w->error = 0; + w->tmpfile_name = NULL; + + switch (g_sam_order) { + case Coordinate: + if (ks_radixsort(w->buf_len, w->buf, w->h) < 0) { + w->error = errno; + return NULL; + } + break; + case MinHash: + worker_minhash(w); + // no break, go to merge sort + default: + ks_mergesort(sort, w->buf_len, w->buf, 0); + } + + if (w->no_save) + return 0; + + name_len = strlen(w->prefix) + 30; + name = (char*)calloc(name_len, 1); + if (!name) { w->error = errno; return 0; } + const int MAX_TRIES = 1000; + int tries = 0; + for (;;) { + if (tries) { + snprintf(name, name_len, "%s.%.4d-%.3d.bam", + w->prefix, w->index, tries); + } else { + snprintf(name, name_len, "%s.%.4d.bam", w->prefix, w->index); + } + + if (write_buffer(name, w->large_pos ? "wzx1" : "wbx1", + w->buf_len, w->buf, w->h, 0, NULL, 0, NULL, 1, 0) == 0) { + break; + } + if (errno == EEXIST && tries < MAX_TRIES) { + tries++; + } else { + w->error = errno; + break; + } + } + + if (w->error) { + free(name); + } else { + w->tmpfile_name = name; + } + return 0; +} + +static int sort_blocks(int n_files, size_t k, bam1_tag *buf, const char *prefix, + const sam_hdr_t *h, int n_threads, buf_region *in_mem, + int large_pos, int minimiser_kmer, char **fns, size_t fns_size) +{ + int i; + size_t pos, rest; + pthread_t *tid; + pthread_attr_t attr; + worker_t *w; + int n_failed = 0; + + if (n_threads < 1) n_threads = 1; + if (k < n_threads * 64) n_threads = 1; // use a single thread if we only sort a small batch of records + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + w = (worker_t*)calloc(n_threads, sizeof(worker_t)); + if (!w) return -1; + tid = (pthread_t*)calloc(n_threads, sizeof(pthread_t)); + if (!tid) { free(w); return -1; } + pos = 0; rest = k; + for (i = 0; i < n_threads; ++i) { + w[i].buf_len = rest / (n_threads - i); + w[i].buf = &buf[pos]; + w[i].prefix = prefix; + w[i].h = h; + w[i].index = n_files + i; + w[i].tmpfile_name = NULL; + w[i].large_pos = large_pos; + w[i].minimiser_kmer = minimiser_kmer; + if (in_mem) { + w[i].no_save = 1; + in_mem[i].from = pos; + in_mem[i].to = pos + w[i].buf_len; + } else { + w[i].no_save = 0; + } + pos += w[i].buf_len; rest -= w[i].buf_len; + pthread_create(&tid[i], &attr, worker, &w[i]); + } + for (i = 0; i < n_threads; ++i) { + pthread_join(tid[i], 0); + if (!in_mem) { + assert(w[i].index >= 0 && w[i].index < fns_size); + fns[w[i].index] = w[i].tmpfile_name; + } + if (w[i].error != 0) { + errno = w[i].error; + print_error_errno("sort", "failed to create temporary file \"%s.%.4d.bam\"", prefix, w[i].index); + n_failed++; + } + } + if (n_failed && !in_mem) { + // Clean up any temporary files that did get made, as we're + // about to lose track of them + for (i = 0; i < n_threads; ++i) { + if (fns[w[i].index]) { + unlink(fns[w[i].index]); + free(fns[w[i].index]); + fns[w[i].index] = NULL; + } + } + } + free(tid); free(w); + if (n_failed) return -1; + if (in_mem) return n_threads; + return n_files + n_threads; +} + +static void lib_lookup_destroy(khash_t(const_c2c) *lib_lookup) { + khiter_t k; + if (lib_lookup == NULL) + return; + for (k = kh_begin(lib_lookup); k < kh_end(lib_lookup); k++) { + if (kh_exist(lib_lookup, k)) + free(kh_value(lib_lookup, k)); + } + kh_destroy(const_c2c, lib_lookup); +} + +// Build an RG to LB lookup table, for the template coordinate sort. +// Returns a populated hash table (which may be empty) on success; +// NULL on failure. +static khash_t(const_c2c) * lookup_libraries(sam_hdr_t *header) +{ + khash_t(const_c2c) *lib_lookup = kh_init(const_c2c); + kstring_t lib_name = KS_INITIALIZE; + int num_rg, i, res; + if (!lib_lookup) + return NULL; + + // Iterate through any RG lines and look for library information + num_rg = sam_hdr_count_lines(header, "RG"); + if (num_rg < 0) + goto fail; + + for (i = 0; i < num_rg; i++) { + const char *rg_id = sam_hdr_line_name(header, "RG", i); + khiter_t k; + if (!rg_id) + goto fail; + res = sam_hdr_find_tag_pos(header, "RG", i, "LB", &lib_name); + if (res < -1) // Error + goto fail; + if (res < 0 || !lib_name.s) // No LB tag + continue; + // Add to lookup table + k = kh_put(const_c2c, lib_lookup, rg_id, &res); + if (res < 0) // Error + goto fail; + if (res > 0) { // Inserted + kh_value(lib_lookup, k) = ks_release(&lib_name); + } + } + + free(lib_name.s); + + return lib_lookup; + + fail: + lib_lookup_destroy(lib_lookup); + free(lib_name.s); + return NULL; +} + +/*! + @abstract Sort an unsorted BAM file based on the provided sort order + + @param sam_order the order in which the sort should occur + @param sort_tag the tag to use if sorting by Tag + @param minimiser_kmer the kmer size when sorting by MinHash + @param fn name of the file to be sorted + @param prefix prefix of the temporary files (prefix.NNNN.bam are written) + @param fnout name of the final output file to be written + @param modeout sam_open() mode to be used to create the final output file + @param max_mem approxiate maximum memory (very inaccurate) + @param in_fmt input file format options + @param out_fmt output file format and options + @param arg_list command string for PG line + @param no_pg if 1, do not add a new PG line + @paran write_index create index for the output file + @return 0 for successful sorting, negative on errors + + @discussion It may create multiple temporary subalignment files + and then merge them by calling bam_merge_simple(). This function is + NOT thread safe. + */ +int bam_sort_core_ext(SamOrder sam_order, char* sort_tag, int minimiser_kmer, + const char *fn, const char *prefix, + const char *fnout, const char *modeout, + size_t _max_mem, int n_threads, + const htsFormat *in_fmt, const htsFormat *out_fmt, + char *arg_list, int no_pg, int write_index) +{ + int ret = -1, res, i, nref, n_files = 0; + size_t max_k, k, max_mem, bam_mem_offset; + sam_hdr_t *header = NULL; + samFile *fp = NULL; + bam1_tag *buf = NULL; + template_coordinate_keys_t *keys = NULL; + bam1_t *b = bam_init1(); + uint8_t *bam_mem = NULL; + char **fns = NULL; + size_t fns_size = 0; + const char *new_so = NULL; + const char *new_go = NULL; + const char *new_ss = NULL; + buf_region *in_mem = NULL; + khash_t(const_c2c) *lib_lookup = NULL; + int num_in_mem = 0; + int large_pos = 0; + + if (!b) { + print_error("sort", "couldn't allocate memory for bam record"); + return -1; + } + + if (n_threads < 2) n_threads = 1; + g_sam_order = sam_order; + if (g_sam_order == TagQueryName || g_sam_order == TagCoordinate) { + g_sort_tag[0] = sort_tag[0]; + g_sort_tag[1] = sort_tag[0] ? sort_tag[1] : '\0'; + } + + if (sam_order == TemplateCoordinate) { + if ((keys = malloc(sizeof(template_coordinate_keys_t))) == NULL) { + print_error("sort", "could not allocate memory for the top-level keys"); + goto err; + } + keys->n = 0; + keys->m = 0; + keys->buffer_size = 0x10000; + keys->buffers = NULL; + } + + max_mem = _max_mem * n_threads; + buf = NULL; + fp = sam_open_format(fn, "r", in_fmt); + if (fp == NULL) { + print_error_errno("sort", "can't open \"%s\"", fn); + goto err; + } + header = sam_hdr_read(fp); + if (header == NULL) { + print_error("sort", "failed to read header from \"%s\"", fn); + goto err; + } + + // Inspect the header looking for long chromosomes + // If there is one, we need to write temporary files in SAM format + nref = sam_hdr_nref(header); + for (i = 0; i < nref; i++) { + if (sam_hdr_tid2len(header, i) > INT32_MAX) + large_pos = 1; + } + + // Also check the output format is large position compatible + if (large_pos) { + int compatible = (out_fmt->format == sam + || (out_fmt->format == cram + && out_fmt->version.major >= 4) + || (out_fmt->format == unknown_format + && modeout[0] == 'w' + && (modeout[1] == 'z' || modeout[1] == '\0'))); + if (!compatible) { + print_error("sort", "output format is not compatible with very large references"); + goto err; + } + } + + if (g_sam_order == TemplateCoordinate) { + lib_lookup = lookup_libraries(header); + if (!lib_lookup) + goto err; + } + + switch (g_sam_order) { + case Coordinate: + new_so = "coordinate"; + break; + case QueryName: + new_so = "queryname"; + break; + case MinHash: + new_so = "coordinate"; + new_ss = "coordinate:minhash"; + break; + case TagQueryName: + case TagCoordinate: + new_so = "unknown"; + break; + case TemplateCoordinate: + new_so = "unsorted"; + new_go = "query"; + new_ss = "unsorted:template-coordinate"; + break; + default: + new_so = "unknown"; + break; + } + + if (new_ss == NULL && new_go == NULL) { // just SO + if ((-1 == sam_hdr_update_hd(header, "SO", new_so)) + && (-1 == sam_hdr_add_line(header, "HD", "VN", SAM_FORMAT_VERSION, "SO", new_so, NULL)) + ) { + print_error("sort", "failed to change sort order header to 'SO:%s'\n", new_so); + goto err; + } + } else if (new_ss != NULL && new_go == NULL) { // update SO and SS, but not GO + if ((-1 == sam_hdr_update_hd(header, "SO", new_so, "SS", new_ss)) + && (-1 == sam_hdr_add_line(header, "HD", "VN", SAM_FORMAT_VERSION, + "SO", new_so, "SS", new_ss, NULL)) + ) { + print_error("sort", "failed to change sort order header to 'SO:%s SS:%s'\n", + new_so, new_ss); + goto err; + } + } else if (new_ss == NULL && new_go != NULL) { // update SO and GO, but not SS + if ((-1 == sam_hdr_update_hd(header, "SO", new_so, "GO", new_go)) + && (-1 == sam_hdr_add_line(header, "HD", "VN", SAM_FORMAT_VERSION, + "SO", new_so, "GO", new_go, NULL)) + ) { + print_error("sort", "failed to change sort order header to 'SO:%s GO:%s'\n", + new_so, new_go); + goto err; + } + } else { // update SO, GO, and SS + if ((-1 == sam_hdr_update_hd(header, "SO", new_so, "GO", new_go, "SS", new_ss)) + && (-1 == sam_hdr_add_line(header, "HD", "VN", SAM_FORMAT_VERSION, + "SO", new_so, "GO", new_go, "SS", new_ss, NULL)) + ) { + print_error("sort", "failed to change sort order header to 'SO:%s GO:%s SS:%s'\n", + new_so, new_go, new_ss); + goto err; + } + } + + if (new_go == NULL) { + if (-1 == sam_hdr_remove_tag_hd(header, "GO")) { + print_error("sort", "failed to delete group order in header\n"); + goto err; + } + } + if (new_ss == NULL) { + if (-1 == sam_hdr_remove_tag_hd(header, "SS")) { + print_error("sort", "failed to delete sub sort in header\n"); + goto err; + } + } + + // No gain to using the thread pool here as the flow of this code + // is such that we are *either* reading *or* sorting. Hence a shared + // pool makes no real difference except to reduce the thread count a little. + if (n_threads > 1) + hts_set_threads(fp, n_threads); + + if ((bam_mem = malloc(max_mem)) == NULL) { + print_error("sort", "couldn't allocate memory for bam_mem"); + goto err; + } + + // write sub files + k = max_k = bam_mem_offset = 0; + while ((res = sam_read1(fp, header, b)) >= 0) { + int mem_full = 0; + + if (k == max_k) { + bam1_tag *new_buf; + max_k = max_k? max_k<<1 : 0x10000; + if ((new_buf = realloc(buf, max_k * sizeof(bam1_tag))) == NULL) { + print_error("sort", "couldn't allocate memory for buf"); + goto err; + } + buf = new_buf; + } + if (sam_order == TemplateCoordinate && k >= keys->m * keys->buffer_size) { + if (template_coordinate_keys_realloc(keys, k + 1) == -1) { + goto err; + } + } + + // Check if the BAM record will fit in the memory limit + if (bam_mem_offset + sizeof(*b) + b->l_data < max_mem) { + // Copy record into the memory block + buf[k].bam_record = (bam1_t *)(bam_mem + bam_mem_offset); + *buf[k].bam_record = *b; + buf[k].bam_record->data = (uint8_t *)((char *)buf[k].bam_record + sizeof(bam1_t)); + memcpy(buf[k].bam_record->data, b->data, b->l_data); + // store next BAM record in next 8-byte-aligned address after + // current one + bam_mem_offset = (bam_mem_offset + sizeof(*b) + b->l_data + 8 - 1) & ~((size_t)(8 - 1)); + } else { + // Add a pointer to the remaining record + buf[k].bam_record = b; + mem_full = 1; + } + + // Set the tag if sorting by tag, or the key for template cooridinate sorting + switch (g_sam_order) { + case TagQueryName: + case TagCoordinate: + buf[k].u.tag = bam_aux_get(buf[k].bam_record, g_sort_tag); + break; + case TemplateCoordinate: + ++keys->n; + template_coordinate_key_t *key = template_coordinate_keys_get(keys, k); + buf[k].u.key = template_coordinate_key(buf[k].bam_record, key, header, lib_lookup); + if (buf[k].u.key == NULL) goto err; + break; + default: + buf[k].u.tag = NULL; + buf[k].u.key = NULL; + } + ++k; + + if (mem_full) { + if (hts_resize(char *, n_files + (n_threads > 0 ? n_threads : 1), + &fns_size, &fns, 0) < 0) + goto err; + int new_n = sort_blocks(n_files, k, buf, prefix, header, n_threads, + NULL, large_pos, minimiser_kmer, fns, fns_size); + if (new_n < 0) { + goto err; + } else { + n_files = new_n; + } + k = 0; + if (keys != NULL) keys->n = 0; + bam_mem_offset = 0; + } + } + if (res != -1) { + print_error("sort", "truncated file. Aborting"); + goto err; + } + + // Sort last records + if (k > 0) { + in_mem = calloc(n_threads > 0 ? n_threads : 1, sizeof(in_mem[0])); + if (!in_mem) goto err; + num_in_mem = sort_blocks(n_files, k, buf, prefix, header, n_threads, + in_mem, large_pos, minimiser_kmer, fns, fns_size); + if (num_in_mem < 0) goto err; + } else { + num_in_mem = 0; + } + + // write the final output + if (n_files == 0 && num_in_mem < 2) { // a single block + if (write_buffer(fnout, modeout, k, buf, header, n_threads, out_fmt, + minimiser_kmer, arg_list, no_pg, write_index) != 0) { + print_error_errno("sort", "failed to create \"%s\"", fnout); + goto err; + } + } else { // then merge + fprintf(samtools_stderr, + "[bam_sort_core] merging from %d files and %d in-memory blocks...\n", + n_files, num_in_mem); + // Paranoia check - all temporary files should have a name + for (i = 0; i < n_files; ++i) { + if (!fns[i]) { + print_error("sort", + "BUG: no name stored for temporary file %d", i); + abort(); + } + } + char *sort_by_tag = (sam_order == TagQueryName || sam_order == TagCoordinate) ? sort_tag : NULL; + if (bam_merge_simple(sam_order, sort_by_tag, fnout, modeout, header, + n_files, fns, num_in_mem, in_mem, buf, keys, + lib_lookup, n_threads, "sort", in_fmt, out_fmt, + arg_list, no_pg, write_index) < 0) { + // Propagate bam_merge_simple() failure; it has already emitted a + // message explaining the failure, so no further message is needed. + goto err; + } + } + + ret = 0; + + err: + // free + if (fns) { + for (i = 0; i < n_files; ++i) { + if (fns[i]) { + unlink(fns[i]); + free(fns[i]); + } + } + free(fns); + } + bam_destroy1(b); + free(buf); + if (keys != NULL) { + for (i = 0; i < keys->m; ++i) { + free(keys->buffers[i]); + } + free(keys->buffers); + free(keys); + } + free(bam_mem); + free(in_mem); + lib_lookup_destroy(lib_lookup); + sam_hdr_destroy(header); + if (fp) sam_close(fp); + return ret; +} + +// Unused here but may be used by legacy samtools-using third-party code +int bam_sort_core(int is_by_qname, const char *fn, const char *prefix, size_t max_mem) +{ + int ret; + char *fnout = calloc(strlen(prefix) + 4 + 1, 1); + if (!fnout) return -1; + sprintf(fnout, "%s.bam", prefix); + SamOrder sam_order = is_by_qname ? QueryName : Coordinate; + g_sam_order = sam_order; + ret = bam_sort_core_ext(sam_order, NULL, 0, fn, prefix, fnout, "wb", max_mem, 0, NULL, NULL, NULL, 1, 0); + free(fnout); + return ret; +} + +static void sort_usage(FILE *fp) +{ + fprintf(fp, +"Usage: samtools sort [options...] [in.bam]\n" +"Options:\n" +" -l INT Set compression level, from 0 (uncompressed) to 9 (best)\n" +" -u Output uncompressed data (equivalent to -l 0)\n" +" -m INT Set maximum memory per thread; suffix K/M/G recognized [768M]\n" +" -M Use minimiser for clustering unaligned/unplaced reads\n" +" -K INT Kmer size to use for minimiser [20]\n" +" -n Sort by read name (not compatible with samtools index command)\n" +" -t TAG Sort by value of TAG. Uses position as secondary index (or read name if -n is set)\n" +" -o FILE Write final output to FILE rather than standard output\n" +" -T PREFIX Write temporary files to PREFIX.nnnn.bam\n" +" --no-PG\n" +" Do not add a PG line\n" +" --template-coordinate\n" +" Sort by template-coordinate\n"); + sam_global_opt_help(fp, "-.O..@.."); +} + +static void complain_about_memory_setting(size_t max_mem) { + char *suffix = ""; + const size_t nine_k = 9<<10; + if (max_mem > nine_k) { max_mem >>= 10; suffix = "K"; } + if (max_mem > nine_k) { max_mem >>= 10; suffix = "M"; } + + fprintf(samtools_stderr, +"[bam_sort] -m setting (%zu%s bytes) is less than the minimum required (%zuM).\n\n" +"Trying to run with -m too small can lead to the creation of a very large number\n" +"of temporary files. This may make sort fail due to it exceeding limits on the\n" +"number of files it can have open at the same time.\n\n" +"Please check your -m parameter. It should be an integer followed by one of the\n" +"letters K (for kilobytes), M (megabytes) or G (gigabytes). You should ensure it\n" +"is at least the minimum above, and much higher if you are sorting a large file.\n", + max_mem, suffix, SORT_MIN_MEGS_PER_THREAD); +} + +int bam_sort(int argc, char *argv[]) +{ + size_t max_mem = SORT_DEFAULT_MEGS_PER_THREAD << 20; + int c, nargs, ret, o_seen = 0, level = -1, no_pg = 0; + SamOrder sam_order = Coordinate; + bool by_tag = false; + int minimiser_kmer = 20; + char* sort_tag = NULL, *arg_list = NULL; + char *fnout = "-", modeout[12]; + kstring_t tmpprefix = { 0, 0, NULL }; + struct stat st; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 0, '@'), + { "threads", required_argument, NULL, '@' }, + {"no-PG", no_argument, NULL, 1}, + { "template-coordinate", no_argument, NULL, 2}, + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "l:m:no:O:T:@:t:MK:u", lopts, NULL)) >= 0) { + switch (c) { + case 'o': fnout = optarg; o_seen = 1; break; + case 'n': sam_order = QueryName; break; + case 't': by_tag = true; sort_tag = optarg; break; + case 'm': { + char *q; + max_mem = strtol(optarg, &q, 0); + if (*q == 'k' || *q == 'K') max_mem <<= 10; + else if (*q == 'm' || *q == 'M') max_mem <<= 20; + else if (*q == 'g' || *q == 'G') max_mem <<= 30; + break; + } + case 'T': kputs(optarg, &tmpprefix); break; + case 'l': level = atoi(optarg); break; + case 'u': level = 0; break; + case 1: no_pg = 1; break; + case 2: sam_order = TemplateCoordinate; break; + case 'M': sam_order = MinHash; break; + case 'K': + minimiser_kmer = atoi(optarg); + if (minimiser_kmer < 1) + minimiser_kmer = 1; + else if (minimiser_kmer > 31) + minimiser_kmer = 31; + break; + + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': sort_usage(samtools_stderr); ret = EXIT_FAILURE; goto sort_end; + } + } + + // Change sort order if tag sorting is requested. Must update based on secondary index + if (by_tag) { + sam_order = sam_order == QueryName ? TagQueryName : TagCoordinate; + } + + nargs = argc - optind; + if (nargs == 0 && isatty(STDIN_FILENO)) { + sort_usage(samtools_stdout); + ret = EXIT_SUCCESS; + goto sort_end; + } + else if (nargs >= 2) { + // If exactly two, user probably tried to specify legacy + if (nargs == 2) + fprintf(samtools_stderr, "[bam_sort] Use -T PREFIX / -o FILE to specify temporary and final output files\n"); + + sort_usage(samtools_stderr); + ret = EXIT_FAILURE; + goto sort_end; + } + + if (ga.write_index && (sam_order == QueryName || sam_order == TagQueryName || sam_order == TagCoordinate || sam_order == TemplateCoordinate)) { + fprintf(samtools_stderr, "[W::bam_sort] Ignoring --write-index as it only works for position sorted files.\n"); + ga.write_index = 0; + } + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("sort", "failed to create arg_list"); + return 1; + } + + if (max_mem < (SORT_MIN_MEGS_PER_THREAD << 20)) { + complain_about_memory_setting(max_mem); + ret = EXIT_FAILURE; + goto sort_end; + } + + strcpy(modeout, "wb"); + sam_open_mode(modeout+1, fnout, NULL); + if (level >= 0) sprintf(strchr(modeout, '\0'), "%d", level < 9? level : 9); + + if (tmpprefix.l == 0) { + if (strcmp(fnout, "-") != 0) { + char *idx = strstr(fnout, HTS_IDX_DELIM); + kputsn(fnout, idx ? idx - fnout : strlen(fnout), &tmpprefix); + kputs(".tmp", &tmpprefix); + } else { + kputc('.', &tmpprefix); + } + } + if (stat(tmpprefix.s, &st) == 0 && S_ISDIR(st.st_mode)) { + unsigned t = ((unsigned) time(NULL)) ^ ((unsigned) clock()); + if (tmpprefix.s[tmpprefix.l-1] != '/') kputc('/', &tmpprefix); + ksprintf(&tmpprefix, "samtools.%d.%u.tmp", (int) getpid(), t % 10000); + } + + ret = bam_sort_core_ext(sam_order, sort_tag, (sam_order == MinHash) ? minimiser_kmer : 0, + (nargs > 0) ? argv[optind] : "-", + tmpprefix.s, fnout, modeout, max_mem, ga.nthreads, + &ga.in, &ga.out, arg_list, no_pg, ga.write_index); + if (ret >= 0) + ret = EXIT_SUCCESS; + else { + char dummy[4]; + // If we failed on opening the input file & it has no .bam/.cram/etc + // extension, the user probably tried legacy -o + if (ret == -2 && o_seen && nargs > 0 && sam_open_mode(dummy, argv[optind], NULL) < 0) + fprintf(samtools_stderr, "[bam_sort] Note the argument has been replaced by -T/-o options\n"); + + ret = EXIT_FAILURE; + } + +sort_end: + free(tmpprefix.s); + free(arg_list); + sam_global_args_free(&ga); + + return ret; +} diff --git a/samtools/bam_split.c b/samtools/bam_split.c new file mode 100644 index 0000000..72a6298 --- /dev/null +++ b/samtools/bam_split.c @@ -0,0 +1,611 @@ +/* bam_split.c -- split subcommand. + + Copyright (C) 2013-2016,2018-2019 Genome Research Ltd. + + Author: Martin Pollard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include "samtools.h" + + +KHASH_MAP_INIT_STR(c2i, int) + +struct parsed_opts { + const char *merged_input_name; + const char *unaccounted_header_name; + const char *unaccounted_name; + const char *output_format_string; + bool verbose; + int no_pg; + sam_global_args ga; +}; + +typedef struct parsed_opts parsed_opts_t; + +struct state { + samFile* merged_input_file; + sam_hdr_t* merged_input_header; + samFile* unaccounted_file; + sam_hdr_t* unaccounted_header; + size_t output_count; + char** rg_id; + char **rg_index_file_name; + char **rg_output_file_name; + samFile** rg_output_file; + sam_hdr_t** rg_output_header; + kh_c2i_t* rg_hash; + htsThreadPool p; + int write_index; +}; + +typedef struct state state_t; + +static int cleanup_state(state_t* status, bool check_close); +static void cleanup_opts(parsed_opts_t* opts); + +static void usage(FILE *write_to) +{ + fprintf(write_to, +"Usage: samtools split [-u ] [-h ]\n" +" [-f ] [-v] \n" +"Options:\n" +" -f STRING output filename format string [\"%%*_%%#.%%.\"]\n" +" -u FILE1 put reads with no RG tag or an unrecognised RG tag in FILE1\n" +" -h FILE2 ... and override the header with FILE2 (-u file only)\n" +" -v verbose output\n" +" --no-PG do not add a PG line\n"); + sam_global_opt_help(write_to, "-....@.."); + fprintf(write_to, +"\n" +"Format string expansions:\n" +" %%%% %%\n" +" %%* basename\n" +" %%# @RG index\n" +" %%! @RG ID\n" +" %%. filename extension for output format\n" + ); +} + +// Takes the command line options and turns them into something we can understand +static parsed_opts_t* parse_args(int argc, char** argv) +{ + if (argc == 1) { usage(stdout); return NULL; } + + const char *optstring = "vf:h:u:@:"; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0, '@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + parsed_opts_t* retval = calloc(sizeof(parsed_opts_t), 1); + if (! retval ) { perror("cannot allocate option parsing memory"); return NULL; } + + sam_global_args_init(&retval->ga); + + int opt; + while ((opt = getopt_long(argc, argv, optstring, lopts, NULL)) != -1) { + switch (opt) { + case 'f': + retval->output_format_string = optarg; + break; + case 'h': + retval->unaccounted_header_name = optarg; + break; + case 'v': + retval->verbose = true; + break; + case 'u': + retval->unaccounted_name = optarg; + break; + case 1: + retval->no_pg = 1; + break; + default: + if (parse_sam_global_opt(opt, optarg, lopts, &retval->ga) == 0) break; + /* else fall-through */ + case '?': + usage(stdout); + free(retval); + return NULL; + } + } + + if (retval->output_format_string == NULL) retval->output_format_string = "%*_%#.%."; + + argc -= optind; + argv += optind; + + if (argc != 1) { + print_error("split", "Invalid number of arguments: %d", argc); + usage(stderr); + free(retval); + return NULL; + } + + retval->merged_input_name = argv[0]; + + return retval; +} + +// Expands a output filename format string +static char* expand_format_string(const char* format_string, const char* basename, const char* rg_id, const int rg_idx, const htsFormat *format) +{ + kstring_t str = { 0, 0, NULL }; + const char* pointer = format_string; + const char* next; + while ((next = strchr(pointer, '%')) != NULL) { + if (kputsn(pointer, next-pointer, &str) < 0) goto memfail; + ++next; + switch (*next) { + case '%': + if (kputc('%', &str) < 0) goto memfail; + break; + case '*': + if (kputs(basename, &str) < 0) goto memfail; + break; + case '#': + if (kputl(rg_idx, &str) < 0) goto memfail; + break; + case '!': + if (kputs(rg_id, &str) < 0) goto memfail; + break; + case '.': + // Only really need to cope with sam, bam, cram + if (format->format != unknown_format) { + if (kputs(hts_format_file_extension(format), &str) < 0) + goto memfail; + } else { + if (kputs("bam", &str) < 0) goto memfail; + } + break; + case '\0': + print_error("split", "Trailing %% in filename format string"); + goto fail; + default: + // Error is: fprintf(stderr, "bad format string, unknown format specifier\n"); + print_error("split", "Unknown specifier %%%c in filename format string", *next); + goto fail; + } + pointer = next + 1; + } + if (kputs(pointer, &str) < 0) goto memfail; + return ks_release(&str); + + memfail: + print_error_errno("split", "Couldn't build output filename"); + fail: + free(str.s); + return NULL; +} + +// Parse the header, count the number of RG tags and return a list of their names +static bool count_RG(sam_hdr_t* hdr, size_t* count, char*** output_name) +{ + char **names = NULL; + kstring_t id_val = KS_INITIALIZE; + int i, n_rg = sam_hdr_count_lines(hdr, "RG"); + + if (n_rg < 0) { + print_error("split", "Failed to get @RG IDs"); + *count = 0; + *output_name = NULL; + return false; + } + + if (n_rg == 0) { + *count = 0; + *output_name = NULL; + return true; + } + + names = calloc(n_rg, sizeof(names[0])); + if (!names) goto memfail; + + for (i = 0; i < n_rg; i++) { + if (sam_hdr_find_tag_pos(hdr, "RG", i, "ID", &id_val) < 0) goto memfail; + names[i] = ks_release(&id_val); + } + + *count = n_rg; + *output_name = names; + return true; + + memfail: + print_error_errno("split", "Failed to get @RG IDs"); + *count = 0; + *output_name = NULL; + ks_free(&id_val); + free(names); + return false; +} + +static int header_compatible(sam_hdr_t *hdr1, sam_hdr_t *hdr2) +{ + size_t n; + if (sam_hdr_nref(hdr1) != sam_hdr_nref(hdr2)) { + print_error("split", + "Unaccounted header contains wrong number of references"); + return -1; + } + for (n = 0; n < sam_hdr_nref(hdr1); n++) { + hts_pos_t h1_len = sam_hdr_tid2len(hdr1, n); + hts_pos_t h2_len = sam_hdr_tid2len(hdr2, n); + if (h1_len != h2_len) { + print_error("split", + "Unaccounted header reference %zu \"%s\" is not the same length as in the input file", + n + 1, sam_hdr_tid2name(hdr2, n)); + return -1; + } + } + return 0; +} + +// Set the initial state +static state_t* init(parsed_opts_t* opts, const char *arg_list) +{ + state_t* retval = calloc(sizeof(state_t), 1); + if (!retval) { + print_error_errno("split", "Initialisation failed"); + return NULL; + } + + if (opts->ga.nthreads > 0) { + if (!(retval->p.pool = hts_tpool_init(opts->ga.nthreads))) { + fprintf(stderr, "Error creating thread pool\n"); + cleanup_state(retval, false); + return NULL; + } + } + + retval->merged_input_file = sam_open_format(opts->merged_input_name, "rb", &opts->ga.in); + if (!retval->merged_input_file) { + print_error_errno("split", "Could not open \"%s\"", opts->merged_input_name); + cleanup_state(retval, false); + return NULL; + } + if (retval->p.pool) + hts_set_opt(retval->merged_input_file, HTS_OPT_THREAD_POOL, &retval->p); + retval->merged_input_header = sam_hdr_read(retval->merged_input_file); + if (retval->merged_input_header == NULL) { + print_error("split", "Could not read header from \"%s\"", opts->merged_input_name); + cleanup_state(retval, false); + return NULL; + } + + if (opts->unaccounted_name) { + if (opts->unaccounted_header_name) { + samFile* hdr_load = sam_open_format(opts->unaccounted_header_name, "r", &opts->ga.in); + if (!hdr_load) { + print_error_errno("split", "Could not open unaccounted header file \"%s\"", opts->unaccounted_header_name); + cleanup_state(retval, false); + return NULL; + } + retval->unaccounted_header = sam_hdr_read(hdr_load); + if (retval->unaccounted_header == NULL) { + print_error("split", "Could not read header from \"%s\"", opts->unaccounted_header_name); + cleanup_state(retval, false); + sam_close(hdr_load); + return NULL; + } + sam_close(hdr_load); + if (header_compatible(retval->merged_input_header, + retval->unaccounted_header) != 0) { + cleanup_state(retval, false); + return NULL; + } + } else { + retval->unaccounted_header = sam_hdr_dup(retval->merged_input_header); + if (!opts->no_pg && sam_hdr_add_pg(retval->unaccounted_header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error("split", "Could not rewrite header for \"%s\"", opts->unaccounted_name); + cleanup_state(retval, false); + return NULL; + } + } + + retval->unaccounted_file = sam_open_format(opts->unaccounted_name, "wb", &opts->ga.out); + if (retval->unaccounted_file == NULL) { + print_error_errno("split", "Could not open unaccounted output file \"%s\"", opts->unaccounted_name); + cleanup_state(retval, false); + return NULL; + } + if (retval->p.pool) + hts_set_opt(retval->unaccounted_file, HTS_OPT_THREAD_POOL, &retval->p); + } + + // Open output files for RGs + if (!count_RG(retval->merged_input_header, &retval->output_count, &retval->rg_id)) return NULL; + if (opts->verbose) fprintf(stderr, "@RG's found %zu\n",retval->output_count); + // Prevent calloc(0, size); + size_t num = retval->output_count ? retval->output_count : 1; + retval->rg_index_file_name = (char **)calloc(num, sizeof(char *)); + retval->rg_output_file_name = (char **)calloc(num, sizeof(char *)); + retval->rg_output_file = (samFile**)calloc(num, sizeof(samFile*)); + retval->rg_output_header = (sam_hdr_t**)calloc(num, sizeof(sam_hdr_t*)); + retval->rg_hash = kh_init_c2i(); + if (!retval->rg_output_file_name || !retval->rg_output_file || !retval->rg_output_header || + !retval->rg_hash || !retval->rg_index_file_name) { + print_error_errno("split", "Could not initialise output file array"); + cleanup_state(retval, false); + return NULL; + } + + char* dirsep = strrchr(opts->merged_input_name, '/'); + char* input_base_name = strdup(dirsep? dirsep+1 : opts->merged_input_name); + if (!input_base_name) { + print_error_errno("split", "Filename manipulation failed"); + cleanup_state(retval, false); + return NULL; + } + char* extension = strrchr(input_base_name, '.'); + if (extension) *extension = '\0'; + + size_t i; + for (i = 0; i < retval->output_count; i++) { + char* output_filename = NULL; + + output_filename = expand_format_string(opts->output_format_string, + input_base_name, + retval->rg_id[i], i, + &opts->ga.out); + + if ( output_filename == NULL ) { + cleanup_state(retval, false); + free(input_base_name); + return NULL; + } + + retval->rg_output_file_name[i] = output_filename; + retval->rg_output_file[i] = sam_open_format(output_filename, "wb", &opts->ga.out); + if (retval->rg_output_file[i] == NULL) { + print_error_errno("split", "Could not open \"%s\"", output_filename); + cleanup_state(retval, false); + free(input_base_name); + return NULL; + } + if (retval->p.pool) + hts_set_opt(retval->rg_output_file[i], HTS_OPT_THREAD_POOL, &retval->p); + + // Record index in hash + int ret; + khiter_t iter = kh_put_c2i(retval->rg_hash, retval->rg_id[i], &ret); + if (ret < 0) { + print_error_errno("split", "Couldn't add @RG ID to look-up table"); + cleanup_state(retval, false); + free(input_base_name); + return NULL; + } + kh_val(retval->rg_hash,iter) = i; + + // Set and edit header + retval->rg_output_header[i] = sam_hdr_dup(retval->merged_input_header); + if (sam_hdr_remove_except(retval->rg_output_header[i], "RG", "ID", retval->rg_id[i]) || + (!opts->no_pg && + sam_hdr_add_pg(retval->rg_output_header[i], "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL))) { + print_error("split", "Could not rewrite header for \"%s\"", output_filename); + cleanup_state(retval, false); + free(input_base_name); + return NULL; + } + } + + free(input_base_name); + retval->write_index = opts->ga.write_index; + + return retval; +} + +static bool split(state_t* state) +{ + if (state->unaccounted_file && sam_hdr_write(state->unaccounted_file, state->unaccounted_header) != 0) { + print_error_errno("split", "Could not write output file header"); + return false; + } + size_t i; + for (i = 0; i < state->output_count; i++) { + if (sam_hdr_write(state->rg_output_file[i], state->rg_output_header[i]) != 0) { + print_error_errno("split", "Could not write file header to \"%s\"", state->rg_output_file_name[i]); + return false; + } + if (state->write_index) { + state->rg_index_file_name[i] = auto_index(state->rg_output_file[i], + state->rg_output_file_name[i], + state->rg_output_header[i]); + if (!state->rg_index_file_name[i]) { + print_error_errno("split", "Could not create index for file \"%s\"", state->rg_output_file_name[i]); + return false; + } + } + } + + bam1_t* file_read = bam_init1(); + // Read the first record + int r; + if ((r=sam_read1(state->merged_input_file, state->merged_input_header, file_read)) < 0) { + // Nothing more to read? Ignore this file + bam_destroy1(file_read); + file_read = NULL; + if (r < -1) { + print_error("split", "Could not read first input record"); + return false; + } + } + + while (file_read != NULL) { + // Get RG tag from read and look it up in hash to find file to output it to + uint8_t* tag = bam_aux_get(file_read, "RG"); + khiter_t iter; + if ( tag != NULL ) { + char* rg = bam_aux2Z(tag); + iter = kh_get_c2i(state->rg_hash, rg); + } else { + iter = kh_end(state->rg_hash); + } + + // Write the read out to correct file + if (iter != kh_end(state->rg_hash)) { + // if found write to the appropriate untangled bam + int i = kh_val(state->rg_hash,iter); + if (sam_write1(state->rg_output_file[i], state->rg_output_header[i], file_read) < 0) { + print_error_errno("split", "Could not write to \"%s\"", state->rg_output_file_name[i]); + bam_destroy1(file_read); + return false; + } + } else { + // otherwise write to the unaccounted bam if there is one or fail + if (state->unaccounted_file == NULL) { + if (tag) { + fprintf(stderr, "Read \"%s\" with unaccounted for tag \"%s\".\n", bam_get_qname(file_read), bam_aux2Z(tag)); + } else { + fprintf(stderr, "Read \"%s\" has no RG tag.\n", bam_get_qname(file_read)); + } + bam_destroy1(file_read); + return false; + } else { + if (sam_write1(state->unaccounted_file, state->unaccounted_header, file_read) < 0) { + print_error_errno("split", "Could not write to unaccounted output file"); + bam_destroy1(file_read); + return false; + } + } + } + + // Replace written read with the next one to process + if ((r=sam_read1(state->merged_input_file, state->merged_input_header, file_read)) < 0) { + // Nothing more to read? Ignore this file in future + bam_destroy1(file_read); + file_read = NULL; + if (r < -1) { + print_error("split", "Could not read input record"); + return false; + } + } + } + + if (state->write_index) { + for (i = 0; i < state->output_count; i++) { + if (sam_idx_save(state->rg_output_file[i]) < 0) { + print_error_errno("split", "writing index failed"); + return false; + } + free(state->rg_index_file_name[i]); + } + } + + return true; +} + +static int cleanup_state(state_t* status, bool check_close) +{ + int ret = 0; + + if (!status) return 0; + if (status->unaccounted_header) sam_hdr_destroy(status->unaccounted_header); + if (status->unaccounted_file) { + if (sam_close(status->unaccounted_file) < 0 && check_close) { + print_error("split", "Error on closing unaccounted file"); + ret = -1; + } + } + sam_close(status->merged_input_file); + size_t i; + for (i = 0; i < status->output_count; i++) { + if (status->rg_output_header && status->rg_output_header[i]) + sam_hdr_destroy(status->rg_output_header[i]); + if (status->rg_output_file && status->rg_output_file[i]) { + if (sam_close(status->rg_output_file[i]) < 0 && check_close) { + print_error("split", "Error on closing output file \"%s\"", status->rg_output_file_name[i]); + ret = -1; + } + } + if (status->rg_id) free(status->rg_id[i]); + if (status->rg_output_file_name) free(status->rg_output_file_name[i]); + } + if (status->merged_input_header) + sam_hdr_destroy(status->merged_input_header); + free(status->rg_output_header); + free(status->rg_output_file); + free(status->rg_output_file_name); + free(status->rg_index_file_name); + kh_destroy_c2i(status->rg_hash); + free(status->rg_id); + if (status->p.pool) + hts_tpool_destroy(status->p.pool); + free(status); + + return ret; +} + +static void cleanup_opts(parsed_opts_t* opts) +{ + if (!opts) return; + sam_global_args_free(&opts->ga); + free(opts); +} + +int main_split(int argc, char** argv) +{ + int ret = 1; + char *arg_list = NULL; + parsed_opts_t* opts = parse_args(argc, argv); + if (!opts) goto cleanup_opts; + if (!opts->no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) + goto cleanup_opts; + state_t* status = init(opts, arg_list); + if (!status) goto cleanup_opts; + + if (!split(status)) { + cleanup_state(status, false); + goto cleanup_opts; + } + + ret = cleanup_state(status, true); + +cleanup_opts: + cleanup_opts(opts); + free(arg_list); + + return ret; +} diff --git a/samtools/bam_split.c.pysam.c b/samtools/bam_split.c.pysam.c new file mode 100644 index 0000000..1015234 --- /dev/null +++ b/samtools/bam_split.c.pysam.c @@ -0,0 +1,613 @@ +#include "samtools.pysam.h" + +/* bam_split.c -- split subcommand. + + Copyright (C) 2013-2016,2018-2019 Genome Research Ltd. + + Author: Martin Pollard + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include "samtools.h" + + +KHASH_MAP_INIT_STR(c2i, int) + +struct parsed_opts { + const char *merged_input_name; + const char *unaccounted_header_name; + const char *unaccounted_name; + const char *output_format_string; + bool verbose; + int no_pg; + sam_global_args ga; +}; + +typedef struct parsed_opts parsed_opts_t; + +struct state { + samFile* merged_input_file; + sam_hdr_t* merged_input_header; + samFile* unaccounted_file; + sam_hdr_t* unaccounted_header; + size_t output_count; + char** rg_id; + char **rg_index_file_name; + char **rg_output_file_name; + samFile** rg_output_file; + sam_hdr_t** rg_output_header; + kh_c2i_t* rg_hash; + htsThreadPool p; + int write_index; +}; + +typedef struct state state_t; + +static int cleanup_state(state_t* status, bool check_close); +static void cleanup_opts(parsed_opts_t* opts); + +static void usage(FILE *write_to) +{ + fprintf(write_to, +"Usage: samtools split [-u ] [-h ]\n" +" [-f ] [-v] \n" +"Options:\n" +" -f STRING output filename format string [\"%%*_%%#.%%.\"]\n" +" -u FILE1 put reads with no RG tag or an unrecognised RG tag in FILE1\n" +" -h FILE2 ... and override the header with FILE2 (-u file only)\n" +" -v verbose output\n" +" --no-PG do not add a PG line\n"); + sam_global_opt_help(write_to, "-....@.."); + fprintf(write_to, +"\n" +"Format string expansions:\n" +" %%%% %%\n" +" %%* basename\n" +" %%# @RG index\n" +" %%! @RG ID\n" +" %%. filename extension for output format\n" + ); +} + +// Takes the command line options and turns them into something we can understand +static parsed_opts_t* parse_args(int argc, char** argv) +{ + if (argc == 1) { usage(samtools_stdout); return NULL; } + + const char *optstring = "vf:h:u:@:"; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0, '@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + parsed_opts_t* retval = calloc(sizeof(parsed_opts_t), 1); + if (! retval ) { perror("cannot allocate option parsing memory"); return NULL; } + + sam_global_args_init(&retval->ga); + + int opt; + while ((opt = getopt_long(argc, argv, optstring, lopts, NULL)) != -1) { + switch (opt) { + case 'f': + retval->output_format_string = optarg; + break; + case 'h': + retval->unaccounted_header_name = optarg; + break; + case 'v': + retval->verbose = true; + break; + case 'u': + retval->unaccounted_name = optarg; + break; + case 1: + retval->no_pg = 1; + break; + default: + if (parse_sam_global_opt(opt, optarg, lopts, &retval->ga) == 0) break; + /* else fall-through */ + case '?': + usage(samtools_stdout); + free(retval); + return NULL; + } + } + + if (retval->output_format_string == NULL) retval->output_format_string = "%*_%#.%."; + + argc -= optind; + argv += optind; + + if (argc != 1) { + print_error("split", "Invalid number of arguments: %d", argc); + usage(samtools_stderr); + free(retval); + return NULL; + } + + retval->merged_input_name = argv[0]; + + return retval; +} + +// Expands a output filename format string +static char* expand_format_string(const char* format_string, const char* basename, const char* rg_id, const int rg_idx, const htsFormat *format) +{ + kstring_t str = { 0, 0, NULL }; + const char* pointer = format_string; + const char* next; + while ((next = strchr(pointer, '%')) != NULL) { + if (kputsn(pointer, next-pointer, &str) < 0) goto memfail; + ++next; + switch (*next) { + case '%': + if (kputc('%', &str) < 0) goto memfail; + break; + case '*': + if (kputs(basename, &str) < 0) goto memfail; + break; + case '#': + if (kputl(rg_idx, &str) < 0) goto memfail; + break; + case '!': + if (kputs(rg_id, &str) < 0) goto memfail; + break; + case '.': + // Only really need to cope with sam, bam, cram + if (format->format != unknown_format) { + if (kputs(hts_format_file_extension(format), &str) < 0) + goto memfail; + } else { + if (kputs("bam", &str) < 0) goto memfail; + } + break; + case '\0': + print_error("split", "Trailing %% in filename format string"); + goto fail; + default: + // Error is: fprintf(samtools_stderr, "bad format string, unknown format specifier\n"); + print_error("split", "Unknown specifier %%%c in filename format string", *next); + goto fail; + } + pointer = next + 1; + } + if (kputs(pointer, &str) < 0) goto memfail; + return ks_release(&str); + + memfail: + print_error_errno("split", "Couldn't build output filename"); + fail: + free(str.s); + return NULL; +} + +// Parse the header, count the number of RG tags and return a list of their names +static bool count_RG(sam_hdr_t* hdr, size_t* count, char*** output_name) +{ + char **names = NULL; + kstring_t id_val = KS_INITIALIZE; + int i, n_rg = sam_hdr_count_lines(hdr, "RG"); + + if (n_rg < 0) { + print_error("split", "Failed to get @RG IDs"); + *count = 0; + *output_name = NULL; + return false; + } + + if (n_rg == 0) { + *count = 0; + *output_name = NULL; + return true; + } + + names = calloc(n_rg, sizeof(names[0])); + if (!names) goto memfail; + + for (i = 0; i < n_rg; i++) { + if (sam_hdr_find_tag_pos(hdr, "RG", i, "ID", &id_val) < 0) goto memfail; + names[i] = ks_release(&id_val); + } + + *count = n_rg; + *output_name = names; + return true; + + memfail: + print_error_errno("split", "Failed to get @RG IDs"); + *count = 0; + *output_name = NULL; + ks_free(&id_val); + free(names); + return false; +} + +static int header_compatible(sam_hdr_t *hdr1, sam_hdr_t *hdr2) +{ + size_t n; + if (sam_hdr_nref(hdr1) != sam_hdr_nref(hdr2)) { + print_error("split", + "Unaccounted header contains wrong number of references"); + return -1; + } + for (n = 0; n < sam_hdr_nref(hdr1); n++) { + hts_pos_t h1_len = sam_hdr_tid2len(hdr1, n); + hts_pos_t h2_len = sam_hdr_tid2len(hdr2, n); + if (h1_len != h2_len) { + print_error("split", + "Unaccounted header reference %zu \"%s\" is not the same length as in the input file", + n + 1, sam_hdr_tid2name(hdr2, n)); + return -1; + } + } + return 0; +} + +// Set the initial state +static state_t* init(parsed_opts_t* opts, const char *arg_list) +{ + state_t* retval = calloc(sizeof(state_t), 1); + if (!retval) { + print_error_errno("split", "Initialisation failed"); + return NULL; + } + + if (opts->ga.nthreads > 0) { + if (!(retval->p.pool = hts_tpool_init(opts->ga.nthreads))) { + fprintf(samtools_stderr, "Error creating thread pool\n"); + cleanup_state(retval, false); + return NULL; + } + } + + retval->merged_input_file = sam_open_format(opts->merged_input_name, "rb", &opts->ga.in); + if (!retval->merged_input_file) { + print_error_errno("split", "Could not open \"%s\"", opts->merged_input_name); + cleanup_state(retval, false); + return NULL; + } + if (retval->p.pool) + hts_set_opt(retval->merged_input_file, HTS_OPT_THREAD_POOL, &retval->p); + retval->merged_input_header = sam_hdr_read(retval->merged_input_file); + if (retval->merged_input_header == NULL) { + print_error("split", "Could not read header from \"%s\"", opts->merged_input_name); + cleanup_state(retval, false); + return NULL; + } + + if (opts->unaccounted_name) { + if (opts->unaccounted_header_name) { + samFile* hdr_load = sam_open_format(opts->unaccounted_header_name, "r", &opts->ga.in); + if (!hdr_load) { + print_error_errno("split", "Could not open unaccounted header file \"%s\"", opts->unaccounted_header_name); + cleanup_state(retval, false); + return NULL; + } + retval->unaccounted_header = sam_hdr_read(hdr_load); + if (retval->unaccounted_header == NULL) { + print_error("split", "Could not read header from \"%s\"", opts->unaccounted_header_name); + cleanup_state(retval, false); + sam_close(hdr_load); + return NULL; + } + sam_close(hdr_load); + if (header_compatible(retval->merged_input_header, + retval->unaccounted_header) != 0) { + cleanup_state(retval, false); + return NULL; + } + } else { + retval->unaccounted_header = sam_hdr_dup(retval->merged_input_header); + if (!opts->no_pg && sam_hdr_add_pg(retval->unaccounted_header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error("split", "Could not rewrite header for \"%s\"", opts->unaccounted_name); + cleanup_state(retval, false); + return NULL; + } + } + + retval->unaccounted_file = sam_open_format(opts->unaccounted_name, "wb", &opts->ga.out); + if (retval->unaccounted_file == NULL) { + print_error_errno("split", "Could not open unaccounted output file \"%s\"", opts->unaccounted_name); + cleanup_state(retval, false); + return NULL; + } + if (retval->p.pool) + hts_set_opt(retval->unaccounted_file, HTS_OPT_THREAD_POOL, &retval->p); + } + + // Open output files for RGs + if (!count_RG(retval->merged_input_header, &retval->output_count, &retval->rg_id)) return NULL; + if (opts->verbose) fprintf(samtools_stderr, "@RG's found %zu\n",retval->output_count); + // Prevent calloc(0, size); + size_t num = retval->output_count ? retval->output_count : 1; + retval->rg_index_file_name = (char **)calloc(num, sizeof(char *)); + retval->rg_output_file_name = (char **)calloc(num, sizeof(char *)); + retval->rg_output_file = (samFile**)calloc(num, sizeof(samFile*)); + retval->rg_output_header = (sam_hdr_t**)calloc(num, sizeof(sam_hdr_t*)); + retval->rg_hash = kh_init_c2i(); + if (!retval->rg_output_file_name || !retval->rg_output_file || !retval->rg_output_header || + !retval->rg_hash || !retval->rg_index_file_name) { + print_error_errno("split", "Could not initialise output file array"); + cleanup_state(retval, false); + return NULL; + } + + char* dirsep = strrchr(opts->merged_input_name, '/'); + char* input_base_name = strdup(dirsep? dirsep+1 : opts->merged_input_name); + if (!input_base_name) { + print_error_errno("split", "Filename manipulation failed"); + cleanup_state(retval, false); + return NULL; + } + char* extension = strrchr(input_base_name, '.'); + if (extension) *extension = '\0'; + + size_t i; + for (i = 0; i < retval->output_count; i++) { + char* output_filename = NULL; + + output_filename = expand_format_string(opts->output_format_string, + input_base_name, + retval->rg_id[i], i, + &opts->ga.out); + + if ( output_filename == NULL ) { + cleanup_state(retval, false); + free(input_base_name); + return NULL; + } + + retval->rg_output_file_name[i] = output_filename; + retval->rg_output_file[i] = sam_open_format(output_filename, "wb", &opts->ga.out); + if (retval->rg_output_file[i] == NULL) { + print_error_errno("split", "Could not open \"%s\"", output_filename); + cleanup_state(retval, false); + free(input_base_name); + return NULL; + } + if (retval->p.pool) + hts_set_opt(retval->rg_output_file[i], HTS_OPT_THREAD_POOL, &retval->p); + + // Record index in hash + int ret; + khiter_t iter = kh_put_c2i(retval->rg_hash, retval->rg_id[i], &ret); + if (ret < 0) { + print_error_errno("split", "Couldn't add @RG ID to look-up table"); + cleanup_state(retval, false); + free(input_base_name); + return NULL; + } + kh_val(retval->rg_hash,iter) = i; + + // Set and edit header + retval->rg_output_header[i] = sam_hdr_dup(retval->merged_input_header); + if (sam_hdr_remove_except(retval->rg_output_header[i], "RG", "ID", retval->rg_id[i]) || + (!opts->no_pg && + sam_hdr_add_pg(retval->rg_output_header[i], "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL))) { + print_error("split", "Could not rewrite header for \"%s\"", output_filename); + cleanup_state(retval, false); + free(input_base_name); + return NULL; + } + } + + free(input_base_name); + retval->write_index = opts->ga.write_index; + + return retval; +} + +static bool split(state_t* state) +{ + if (state->unaccounted_file && sam_hdr_write(state->unaccounted_file, state->unaccounted_header) != 0) { + print_error_errno("split", "Could not write output file header"); + return false; + } + size_t i; + for (i = 0; i < state->output_count; i++) { + if (sam_hdr_write(state->rg_output_file[i], state->rg_output_header[i]) != 0) { + print_error_errno("split", "Could not write file header to \"%s\"", state->rg_output_file_name[i]); + return false; + } + if (state->write_index) { + state->rg_index_file_name[i] = auto_index(state->rg_output_file[i], + state->rg_output_file_name[i], + state->rg_output_header[i]); + if (!state->rg_index_file_name[i]) { + print_error_errno("split", "Could not create index for file \"%s\"", state->rg_output_file_name[i]); + return false; + } + } + } + + bam1_t* file_read = bam_init1(); + // Read the first record + int r; + if ((r=sam_read1(state->merged_input_file, state->merged_input_header, file_read)) < 0) { + // Nothing more to read? Ignore this file + bam_destroy1(file_read); + file_read = NULL; + if (r < -1) { + print_error("split", "Could not read first input record"); + return false; + } + } + + while (file_read != NULL) { + // Get RG tag from read and look it up in hash to find file to output it to + uint8_t* tag = bam_aux_get(file_read, "RG"); + khiter_t iter; + if ( tag != NULL ) { + char* rg = bam_aux2Z(tag); + iter = kh_get_c2i(state->rg_hash, rg); + } else { + iter = kh_end(state->rg_hash); + } + + // Write the read out to correct file + if (iter != kh_end(state->rg_hash)) { + // if found write to the appropriate untangled bam + int i = kh_val(state->rg_hash,iter); + if (sam_write1(state->rg_output_file[i], state->rg_output_header[i], file_read) < 0) { + print_error_errno("split", "Could not write to \"%s\"", state->rg_output_file_name[i]); + bam_destroy1(file_read); + return false; + } + } else { + // otherwise write to the unaccounted bam if there is one or fail + if (state->unaccounted_file == NULL) { + if (tag) { + fprintf(samtools_stderr, "Read \"%s\" with unaccounted for tag \"%s\".\n", bam_get_qname(file_read), bam_aux2Z(tag)); + } else { + fprintf(samtools_stderr, "Read \"%s\" has no RG tag.\n", bam_get_qname(file_read)); + } + bam_destroy1(file_read); + return false; + } else { + if (sam_write1(state->unaccounted_file, state->unaccounted_header, file_read) < 0) { + print_error_errno("split", "Could not write to unaccounted output file"); + bam_destroy1(file_read); + return false; + } + } + } + + // Replace written read with the next one to process + if ((r=sam_read1(state->merged_input_file, state->merged_input_header, file_read)) < 0) { + // Nothing more to read? Ignore this file in future + bam_destroy1(file_read); + file_read = NULL; + if (r < -1) { + print_error("split", "Could not read input record"); + return false; + } + } + } + + if (state->write_index) { + for (i = 0; i < state->output_count; i++) { + if (sam_idx_save(state->rg_output_file[i]) < 0) { + print_error_errno("split", "writing index failed"); + return false; + } + free(state->rg_index_file_name[i]); + } + } + + return true; +} + +static int cleanup_state(state_t* status, bool check_close) +{ + int ret = 0; + + if (!status) return 0; + if (status->unaccounted_header) sam_hdr_destroy(status->unaccounted_header); + if (status->unaccounted_file) { + if (sam_close(status->unaccounted_file) < 0 && check_close) { + print_error("split", "Error on closing unaccounted file"); + ret = -1; + } + } + sam_close(status->merged_input_file); + size_t i; + for (i = 0; i < status->output_count; i++) { + if (status->rg_output_header && status->rg_output_header[i]) + sam_hdr_destroy(status->rg_output_header[i]); + if (status->rg_output_file && status->rg_output_file[i]) { + if (sam_close(status->rg_output_file[i]) < 0 && check_close) { + print_error("split", "Error on closing output file \"%s\"", status->rg_output_file_name[i]); + ret = -1; + } + } + if (status->rg_id) free(status->rg_id[i]); + if (status->rg_output_file_name) free(status->rg_output_file_name[i]); + } + if (status->merged_input_header) + sam_hdr_destroy(status->merged_input_header); + free(status->rg_output_header); + free(status->rg_output_file); + free(status->rg_output_file_name); + free(status->rg_index_file_name); + kh_destroy_c2i(status->rg_hash); + free(status->rg_id); + if (status->p.pool) + hts_tpool_destroy(status->p.pool); + free(status); + + return ret; +} + +static void cleanup_opts(parsed_opts_t* opts) +{ + if (!opts) return; + sam_global_args_free(&opts->ga); + free(opts); +} + +int main_split(int argc, char** argv) +{ + int ret = 1; + char *arg_list = NULL; + parsed_opts_t* opts = parse_args(argc, argv); + if (!opts) goto cleanup_opts; + if (!opts->no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) + goto cleanup_opts; + state_t* status = init(opts, arg_list); + if (!status) goto cleanup_opts; + + if (!split(status)) { + cleanup_state(status, false); + goto cleanup_opts; + } + + ret = cleanup_state(status, true); + +cleanup_opts: + cleanup_opts(opts); + free(arg_list); + + return ret; +} diff --git a/samtools/bam_stat.c b/samtools/bam_stat.c new file mode 100644 index 0000000..31dc8fe --- /dev/null +++ b/samtools/bam_stat.c @@ -0,0 +1,346 @@ +/* bam_stat.c -- flagstat subcommand. + + Copyright (C) 2009, 2011, 2013-2015, 2019, 2021 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "htslib/sam.h" +#include "samtools.h" +#include "sam_opts.h" + +typedef struct { + long long n_reads[2], n_mapped[2], n_pair_all[2], n_pair_map[2], n_pair_good[2]; + long long n_sgltn[2], n_read1[2], n_read2[2]; + long long n_dup[2]; + long long n_diffchr[2], n_diffhigh[2]; + long long n_secondary[2], n_supp[2]; + long long n_primary[2], n_pmapped[2], n_pdup[2]; +} bam_flagstat_t; + +inline static void flagstat_loop(bam_flagstat_t *s, bam1_core_t *c) +{ + int w = (c->flag & BAM_FQCFAIL)? 1 : 0; + ++s->n_reads[w]; + if (c->flag & BAM_FSECONDARY ) { + ++s->n_secondary[w]; + } else if (c->flag & BAM_FSUPPLEMENTARY ) { + ++s->n_supp[w]; + } else { + ++s->n_primary[w]; + + if (c->flag & BAM_FPAIRED) { + ++s->n_pair_all[w]; + if ((c->flag & BAM_FPROPER_PAIR) && !(c->flag & BAM_FUNMAP) ) ++s->n_pair_good[w]; + if (c->flag & BAM_FREAD1) ++s->n_read1[w]; + if (c->flag & BAM_FREAD2) ++s->n_read2[w]; + if ((c->flag & BAM_FMUNMAP) && !(c->flag & BAM_FUNMAP)) ++s->n_sgltn[w]; + if (!(c->flag & BAM_FUNMAP) && !(c->flag & BAM_FMUNMAP)) { + ++s->n_pair_map[w]; + if (c->mtid != c->tid) { + ++s->n_diffchr[w]; + if (c->qual >= 5) ++s->n_diffhigh[w]; + } + } + } + + if (!(c->flag & BAM_FUNMAP)) ++s->n_pmapped[w]; + if (c->flag & BAM_FDUP) ++s->n_pdup[w]; + } + if (!(c->flag & BAM_FUNMAP)) ++s->n_mapped[w]; + if (c->flag & BAM_FDUP) ++s->n_dup[w]; +} + +bam_flagstat_t *bam_flagstat_core(samFile *fp, sam_hdr_t *h) +{ + bam_flagstat_t *s; + bam1_t *b; + bam1_core_t *c; + int ret; + s = (bam_flagstat_t*)calloc(1, sizeof(bam_flagstat_t)); + b = bam_init1(); + c = &b->core; + while ((ret = sam_read1(fp, h, b)) >= 0) + flagstat_loop(s, c); + bam_destroy1(b); + if (ret != -1) { + free(s); + return NULL; + } + return s; +} + +static const char *percent(char *buffer, long long n, long long total) +{ + if (total != 0) sprintf(buffer, "%.2f%%", (float)n / total * 100.0); + else strcpy(buffer, "N/A"); + return buffer; +} + +static const char *percent_json(char *buffer, long long n, long long total) +{ + if (total != 0) sprintf(buffer, "%.2f", (float)n / total * 100.0); + else strcpy(buffer, "null"); + return buffer; +} + +static void usage_exit(FILE *fp, int exit_status) +{ + fprintf(fp, "Usage: samtools flagstat [options] \n"); + sam_global_opt_help(fp, "-.---@-."); + fprintf(fp, " -O, --"); + fprintf(fp, "output-fmt FORMAT[,OPT[=VAL]]...\n" + " Specify output format (json, tsv)\n"); + exit(exit_status); +} + +static void out_fmt_default(bam_flagstat_t *s) +{ + char b0[16], b1[16]; + printf("%lld + %lld in total (QC-passed reads + QC-failed reads)\n", s->n_reads[0], s->n_reads[1]); + printf("%lld + %lld primary\n", s->n_primary[0], s->n_primary[1]); + printf("%lld + %lld secondary\n", s->n_secondary[0], s->n_secondary[1]); + printf("%lld + %lld supplementary\n", s->n_supp[0], s->n_supp[1]); + printf("%lld + %lld duplicates\n", s->n_dup[0], s->n_dup[1]); + printf("%lld + %lld primary duplicates\n", s->n_pdup[0], s->n_pdup[1]); + printf("%lld + %lld mapped (%s : %s)\n", s->n_mapped[0], s->n_mapped[1], percent(b0, s->n_mapped[0], s->n_reads[0]), percent(b1, s->n_mapped[1], s->n_reads[1])); + printf("%lld + %lld primary mapped (%s : %s)\n", s->n_pmapped[0], s->n_pmapped[1], percent(b0, s->n_pmapped[0], s->n_primary[0]), percent(b1, s->n_pmapped[1], s->n_primary[1])); + printf("%lld + %lld paired in sequencing\n", s->n_pair_all[0], s->n_pair_all[1]); + printf("%lld + %lld read1\n", s->n_read1[0], s->n_read1[1]); + printf("%lld + %lld read2\n", s->n_read2[0], s->n_read2[1]); + printf("%lld + %lld properly paired (%s : %s)\n", s->n_pair_good[0], s->n_pair_good[1], percent(b0, s->n_pair_good[0], s->n_pair_all[0]), percent(b1, s->n_pair_good[1], s->n_pair_all[1])); + printf("%lld + %lld with itself and mate mapped\n", s->n_pair_map[0], s->n_pair_map[1]); + printf("%lld + %lld singletons (%s : %s)\n", s->n_sgltn[0], s->n_sgltn[1], percent(b0, s->n_sgltn[0], s->n_pair_all[0]), percent(b1, s->n_sgltn[1], s->n_pair_all[1])); + printf("%lld + %lld with mate mapped to a different chr\n", s->n_diffchr[0], s->n_diffchr[1]); + printf("%lld + %lld with mate mapped to a different chr (mapQ>=5)\n", s->n_diffhigh[0], s->n_diffhigh[1]); +} + +static void out_fmt_json(bam_flagstat_t *s) { + char b0[16], b1[16], p0[16], p1[16], pp0[16], pp1[16], s0[16], s1[16]; + printf("{\n \"QC-passed reads\": { \n" + " \"total\": %lld, \n" + " \"primary\": %lld, \n" + " \"secondary\": %lld, \n" + " \"supplementary\": %lld, \n" + " \"duplicates\": %lld, \n" + " \"primary duplicates\": %lld, \n" + " \"mapped\": %lld, \n" + " \"mapped %%\": %s, \n" + " \"primary mapped\": %lld, \n" + " \"primary mapped %%\": %s, \n" + " \"paired in sequencing\": %lld, \n" + " \"read1\": %lld, \n" + " \"read2\": %lld, \n" + " \"properly paired\": %lld, \n" + " \"properly paired %%\": %s, \n" + " \"with itself and mate mapped\": %lld, \n" + " \"singletons\": %lld, \n" + " \"singletons %%\": %s, \n" + " \"with mate mapped to a different chr\": %lld, \n" + " \"with mate mapped to a different chr (mapQ >= 5)\": %lld \n" + " }," + "\n \"QC-failed reads\": { \n" + " \"total\": %lld, \n" + " \"primary\": %lld, \n" + " \"secondary\": %lld, \n" + " \"supplementary\": %lld, \n" + " \"duplicates\": %lld, \n" + " \"primary duplicates\": %lld, \n" + " \"mapped\": %lld, \n" + " \"mapped %%\": %s, \n" + " \"primary mapped\": %lld, \n" + " \"primary mapped %%\": %s, \n" + " \"paired in sequencing\": %lld, \n" + " \"read1\": %lld, \n" + " \"read2\": %lld, \n" + " \"properly paired\": %lld, \n" + " \"properly paired %%\": %s, \n" + " \"with itself and mate mapped\": %lld, \n" + " \"singletons\": %lld, \n" + " \"singletons %%\": %s, \n" + " \"with mate mapped to a different chr\": %lld, \n" + " \"with mate mapped to a different chr (mapQ >= 5)\": %lld \n" + " }\n" + "}\n", + s->n_reads[0], + s->n_primary[0], + s->n_secondary[0], + s->n_supp[0], + s->n_dup[0], + s->n_pdup[0], + s->n_mapped[0], + percent_json(b0, s->n_mapped[0], s->n_reads[0]), + s->n_pmapped[0], + percent_json(p0, s->n_pmapped[0], s->n_primary[0]), + s->n_pair_all[0], + s->n_read1[0], + s->n_read2[0], + s->n_pair_good[0], + percent_json(pp0, s->n_pair_good[0], s->n_pair_all[0]), + s->n_pair_map[0], + s->n_sgltn[0], + percent_json(s0, s->n_sgltn[0], s->n_pair_all[0]), + s->n_diffchr[0], + s->n_diffhigh[0], + s->n_reads[1], + s->n_primary[1], + s->n_secondary[1], + s->n_supp[1], + s->n_dup[1], + s->n_pdup[1], + s->n_mapped[1], + percent_json(b1, s->n_mapped[1], s->n_reads[1]), + s->n_pmapped[1], + percent_json(p1, s->n_pmapped[1], s->n_primary[1]), + s->n_pair_all[1], + s->n_read1[1], + s->n_read2[1], + s->n_pair_good[1], + percent_json(pp1, s->n_pair_good[1], s->n_pair_all[1]), + s->n_pair_map[1], + s->n_sgltn[1], + percent_json(s1, s->n_sgltn[1], s->n_pair_all[1]), + s->n_diffchr[1], + s->n_diffhigh[1] + ); +} + +static void out_fmt_tsv(bam_flagstat_t *s) { + char b0[16], b1[16]; + printf("%lld\t%lld\ttotal (QC-passed reads + QC-failed reads)\n", s->n_reads[0], s->n_reads[1]); + printf("%lld\t%lld\tprimary\n", s->n_primary[0], s->n_primary[1]); + printf("%lld\t%lld\tsecondary\n", s->n_secondary[0], s->n_secondary[1]); + printf("%lld\t%lld\tsupplementary\n", s->n_supp[0], s->n_supp[1]); + printf("%lld\t%lld\tduplicates\n", s->n_dup[0], s->n_dup[1]); + printf("%lld\t%lld\tprimary duplicates\n", s->n_pdup[0], s->n_pdup[1]); + printf("%lld\t%lld\tmapped\n", s->n_mapped[0], s->n_mapped[1]); + printf("%s\t%s\tmapped %%\n", percent(b0, s->n_mapped[0], s->n_reads[0]), percent(b1, s->n_mapped[1], s->n_reads[1])); + printf("%lld\t%lld\tprimary mapped\n", s->n_pmapped[0], s->n_pmapped[1]); + printf("%s\t%s\tprimary mapped %%\n", percent(b0, s->n_pmapped[0], s->n_primary[0]), percent(b1, s->n_pmapped[1], s->n_primary[1])); + printf("%lld\t%lld\tpaired in sequencing\n", s->n_pair_all[0], s->n_pair_all[1]); + printf("%lld\t%lld\tread1\n", s->n_read1[0], s->n_read1[1]); + printf("%lld\t%lld\tread2\n", s->n_read2[0], s->n_read2[1]); + printf("%lld\t%lld\tproperly paired\n", s->n_pair_good[0], s->n_pair_good[1]); + printf("%s\t%s\tproperly paired %%\n", percent(b0, s->n_pair_good[0], s->n_pair_all[0]), percent(b1, s->n_pair_good[1], s->n_pair_all[1])); + printf("%lld\t%lld\twith itself and mate mapped\n", s->n_pair_map[0], s->n_pair_map[1]); + printf("%lld\t%lld\tsingletons\n", s->n_sgltn[0], s->n_sgltn[1]); + printf("%s\t%s\tsingletons %%\n", percent(b0, s->n_sgltn[0], s->n_pair_all[0]), percent(b1, s->n_sgltn[1], s->n_pair_all[1])); + printf("%lld\t%lld\twith mate mapped to a different chr\n", s->n_diffchr[0], s->n_diffchr[1]); + printf("%lld\t%lld\twith mate mapped to a different chr (mapQ>=5)\n", s->n_diffhigh[0], s->n_diffhigh[1]); +} + +/* + * Select flagstats output format to print. + */ +static void output_fmt(bam_flagstat_t *s, const char *out_fmt) +{ + if (strcmp(out_fmt, "json") == 0 || strcmp(out_fmt, "JSON") == 0) { + out_fmt_json(s); + } else if (strcmp(out_fmt, "tsv") == 0 || strcmp(out_fmt, "TSV") == 0) { + out_fmt_tsv(s); + } else { + out_fmt_default(s); + } +} + +int bam_flagstat(int argc, char *argv[]) +{ + samFile *fp; + sam_hdr_t *header; + bam_flagstat_t *s; + const char *out_fmt = "default"; + int c, status = EXIT_SUCCESS; + + enum { + INPUT_FMT_OPTION = CHAR_MAX+1, + }; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', '-', '-', '@'), + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "@:O:", lopts, NULL)) >= 0) { + switch (c) { + case 'O': + out_fmt = optarg; + break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + usage_exit(stderr, EXIT_FAILURE); + } + } + + if (argc != optind+1) { + if (argc == optind) usage_exit(stdout, EXIT_SUCCESS); + else usage_exit(stderr, EXIT_FAILURE); + } + fp = sam_open_format(argv[optind], "r", &ga.in); + if (fp == NULL) { + print_error_errno("flagstat", "Cannot open input file \"%s\"", argv[optind]); + return 1; + } + if (ga.nthreads > 0) + hts_set_threads(fp, ga.nthreads); + + if (hts_set_opt(fp, CRAM_OPT_REQUIRED_FIELDS, + SAM_FLAG | SAM_MAPQ | SAM_RNEXT)) { + fprintf(stderr, "Failed to set CRAM_OPT_REQUIRED_FIELDS value\n"); + return 1; + } + + if (hts_set_opt(fp, CRAM_OPT_DECODE_MD, 0)) { + fprintf(stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + return 1; + } + + header = sam_hdr_read(fp); + if (header == NULL) { + fprintf(stderr, "Failed to read header for \"%s\"\n", argv[optind]); + return 1; + } + + s = bam_flagstat_core(fp, header); + if (s) { + output_fmt(s, out_fmt); + free(s); + } + else { + print_error("flagstat", "error reading from \"%s\"", argv[optind]); + status = EXIT_FAILURE; + } + + sam_hdr_destroy(header); + sam_close(fp); + sam_global_args_free(&ga); + return status; +} diff --git a/samtools/bam_stat.c.pysam.c b/samtools/bam_stat.c.pysam.c new file mode 100644 index 0000000..bd6f4ca --- /dev/null +++ b/samtools/bam_stat.c.pysam.c @@ -0,0 +1,348 @@ +#include "samtools.pysam.h" + +/* bam_stat.c -- flagstat subcommand. + + Copyright (C) 2009, 2011, 2013-2015, 2019, 2021 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "htslib/sam.h" +#include "samtools.h" +#include "sam_opts.h" + +typedef struct { + long long n_reads[2], n_mapped[2], n_pair_all[2], n_pair_map[2], n_pair_good[2]; + long long n_sgltn[2], n_read1[2], n_read2[2]; + long long n_dup[2]; + long long n_diffchr[2], n_diffhigh[2]; + long long n_secondary[2], n_supp[2]; + long long n_primary[2], n_pmapped[2], n_pdup[2]; +} bam_flagstat_t; + +inline static void flagstat_loop(bam_flagstat_t *s, bam1_core_t *c) +{ + int w = (c->flag & BAM_FQCFAIL)? 1 : 0; + ++s->n_reads[w]; + if (c->flag & BAM_FSECONDARY ) { + ++s->n_secondary[w]; + } else if (c->flag & BAM_FSUPPLEMENTARY ) { + ++s->n_supp[w]; + } else { + ++s->n_primary[w]; + + if (c->flag & BAM_FPAIRED) { + ++s->n_pair_all[w]; + if ((c->flag & BAM_FPROPER_PAIR) && !(c->flag & BAM_FUNMAP) ) ++s->n_pair_good[w]; + if (c->flag & BAM_FREAD1) ++s->n_read1[w]; + if (c->flag & BAM_FREAD2) ++s->n_read2[w]; + if ((c->flag & BAM_FMUNMAP) && !(c->flag & BAM_FUNMAP)) ++s->n_sgltn[w]; + if (!(c->flag & BAM_FUNMAP) && !(c->flag & BAM_FMUNMAP)) { + ++s->n_pair_map[w]; + if (c->mtid != c->tid) { + ++s->n_diffchr[w]; + if (c->qual >= 5) ++s->n_diffhigh[w]; + } + } + } + + if (!(c->flag & BAM_FUNMAP)) ++s->n_pmapped[w]; + if (c->flag & BAM_FDUP) ++s->n_pdup[w]; + } + if (!(c->flag & BAM_FUNMAP)) ++s->n_mapped[w]; + if (c->flag & BAM_FDUP) ++s->n_dup[w]; +} + +bam_flagstat_t *bam_flagstat_core(samFile *fp, sam_hdr_t *h) +{ + bam_flagstat_t *s; + bam1_t *b; + bam1_core_t *c; + int ret; + s = (bam_flagstat_t*)calloc(1, sizeof(bam_flagstat_t)); + b = bam_init1(); + c = &b->core; + while ((ret = sam_read1(fp, h, b)) >= 0) + flagstat_loop(s, c); + bam_destroy1(b); + if (ret != -1) { + free(s); + return NULL; + } + return s; +} + +static const char *percent(char *buffer, long long n, long long total) +{ + if (total != 0) sprintf(buffer, "%.2f%%", (float)n / total * 100.0); + else strcpy(buffer, "N/A"); + return buffer; +} + +static const char *percent_json(char *buffer, long long n, long long total) +{ + if (total != 0) sprintf(buffer, "%.2f", (float)n / total * 100.0); + else strcpy(buffer, "null"); + return buffer; +} + +static void usage_exit(FILE *fp, int exit_status) +{ + fprintf(fp, "Usage: samtools flagstat [options] \n"); + sam_global_opt_help(fp, "-.---@-."); + fprintf(fp, " -O, --"); + fprintf(fp, "output-fmt FORMAT[,OPT[=VAL]]...\n" + " Specify output format (json, tsv)\n"); + samtools_exit(exit_status); +} + +static void out_fmt_default(bam_flagstat_t *s) +{ + char b0[16], b1[16]; + fprintf(samtools_stdout, "%lld + %lld in total (QC-passed reads + QC-failed reads)\n", s->n_reads[0], s->n_reads[1]); + fprintf(samtools_stdout, "%lld + %lld primary\n", s->n_primary[0], s->n_primary[1]); + fprintf(samtools_stdout, "%lld + %lld secondary\n", s->n_secondary[0], s->n_secondary[1]); + fprintf(samtools_stdout, "%lld + %lld supplementary\n", s->n_supp[0], s->n_supp[1]); + fprintf(samtools_stdout, "%lld + %lld duplicates\n", s->n_dup[0], s->n_dup[1]); + fprintf(samtools_stdout, "%lld + %lld primary duplicates\n", s->n_pdup[0], s->n_pdup[1]); + fprintf(samtools_stdout, "%lld + %lld mapped (%s : %s)\n", s->n_mapped[0], s->n_mapped[1], percent(b0, s->n_mapped[0], s->n_reads[0]), percent(b1, s->n_mapped[1], s->n_reads[1])); + fprintf(samtools_stdout, "%lld + %lld primary mapped (%s : %s)\n", s->n_pmapped[0], s->n_pmapped[1], percent(b0, s->n_pmapped[0], s->n_primary[0]), percent(b1, s->n_pmapped[1], s->n_primary[1])); + fprintf(samtools_stdout, "%lld + %lld paired in sequencing\n", s->n_pair_all[0], s->n_pair_all[1]); + fprintf(samtools_stdout, "%lld + %lld read1\n", s->n_read1[0], s->n_read1[1]); + fprintf(samtools_stdout, "%lld + %lld read2\n", s->n_read2[0], s->n_read2[1]); + fprintf(samtools_stdout, "%lld + %lld properly paired (%s : %s)\n", s->n_pair_good[0], s->n_pair_good[1], percent(b0, s->n_pair_good[0], s->n_pair_all[0]), percent(b1, s->n_pair_good[1], s->n_pair_all[1])); + fprintf(samtools_stdout, "%lld + %lld with itself and mate mapped\n", s->n_pair_map[0], s->n_pair_map[1]); + fprintf(samtools_stdout, "%lld + %lld singletons (%s : %s)\n", s->n_sgltn[0], s->n_sgltn[1], percent(b0, s->n_sgltn[0], s->n_pair_all[0]), percent(b1, s->n_sgltn[1], s->n_pair_all[1])); + fprintf(samtools_stdout, "%lld + %lld with mate mapped to a different chr\n", s->n_diffchr[0], s->n_diffchr[1]); + fprintf(samtools_stdout, "%lld + %lld with mate mapped to a different chr (mapQ>=5)\n", s->n_diffhigh[0], s->n_diffhigh[1]); +} + +static void out_fmt_json(bam_flagstat_t *s) { + char b0[16], b1[16], p0[16], p1[16], pp0[16], pp1[16], s0[16], s1[16]; + fprintf(samtools_stdout, "{\n \"QC-passed reads\": { \n" + " \"total\": %lld, \n" + " \"primary\": %lld, \n" + " \"secondary\": %lld, \n" + " \"supplementary\": %lld, \n" + " \"duplicates\": %lld, \n" + " \"primary duplicates\": %lld, \n" + " \"mapped\": %lld, \n" + " \"mapped %%\": %s, \n" + " \"primary mapped\": %lld, \n" + " \"primary mapped %%\": %s, \n" + " \"paired in sequencing\": %lld, \n" + " \"read1\": %lld, \n" + " \"read2\": %lld, \n" + " \"properly paired\": %lld, \n" + " \"properly paired %%\": %s, \n" + " \"with itself and mate mapped\": %lld, \n" + " \"singletons\": %lld, \n" + " \"singletons %%\": %s, \n" + " \"with mate mapped to a different chr\": %lld, \n" + " \"with mate mapped to a different chr (mapQ >= 5)\": %lld \n" + " }," + "\n \"QC-failed reads\": { \n" + " \"total\": %lld, \n" + " \"primary\": %lld, \n" + " \"secondary\": %lld, \n" + " \"supplementary\": %lld, \n" + " \"duplicates\": %lld, \n" + " \"primary duplicates\": %lld, \n" + " \"mapped\": %lld, \n" + " \"mapped %%\": %s, \n" + " \"primary mapped\": %lld, \n" + " \"primary mapped %%\": %s, \n" + " \"paired in sequencing\": %lld, \n" + " \"read1\": %lld, \n" + " \"read2\": %lld, \n" + " \"properly paired\": %lld, \n" + " \"properly paired %%\": %s, \n" + " \"with itself and mate mapped\": %lld, \n" + " \"singletons\": %lld, \n" + " \"singletons %%\": %s, \n" + " \"with mate mapped to a different chr\": %lld, \n" + " \"with mate mapped to a different chr (mapQ >= 5)\": %lld \n" + " }\n" + "}\n", + s->n_reads[0], + s->n_primary[0], + s->n_secondary[0], + s->n_supp[0], + s->n_dup[0], + s->n_pdup[0], + s->n_mapped[0], + percent_json(b0, s->n_mapped[0], s->n_reads[0]), + s->n_pmapped[0], + percent_json(p0, s->n_pmapped[0], s->n_primary[0]), + s->n_pair_all[0], + s->n_read1[0], + s->n_read2[0], + s->n_pair_good[0], + percent_json(pp0, s->n_pair_good[0], s->n_pair_all[0]), + s->n_pair_map[0], + s->n_sgltn[0], + percent_json(s0, s->n_sgltn[0], s->n_pair_all[0]), + s->n_diffchr[0], + s->n_diffhigh[0], + s->n_reads[1], + s->n_primary[1], + s->n_secondary[1], + s->n_supp[1], + s->n_dup[1], + s->n_pdup[1], + s->n_mapped[1], + percent_json(b1, s->n_mapped[1], s->n_reads[1]), + s->n_pmapped[1], + percent_json(p1, s->n_pmapped[1], s->n_primary[1]), + s->n_pair_all[1], + s->n_read1[1], + s->n_read2[1], + s->n_pair_good[1], + percent_json(pp1, s->n_pair_good[1], s->n_pair_all[1]), + s->n_pair_map[1], + s->n_sgltn[1], + percent_json(s1, s->n_sgltn[1], s->n_pair_all[1]), + s->n_diffchr[1], + s->n_diffhigh[1] + ); +} + +static void out_fmt_tsv(bam_flagstat_t *s) { + char b0[16], b1[16]; + fprintf(samtools_stdout, "%lld\t%lld\ttotal (QC-passed reads + QC-failed reads)\n", s->n_reads[0], s->n_reads[1]); + fprintf(samtools_stdout, "%lld\t%lld\tprimary\n", s->n_primary[0], s->n_primary[1]); + fprintf(samtools_stdout, "%lld\t%lld\tsecondary\n", s->n_secondary[0], s->n_secondary[1]); + fprintf(samtools_stdout, "%lld\t%lld\tsupplementary\n", s->n_supp[0], s->n_supp[1]); + fprintf(samtools_stdout, "%lld\t%lld\tduplicates\n", s->n_dup[0], s->n_dup[1]); + fprintf(samtools_stdout, "%lld\t%lld\tprimary duplicates\n", s->n_pdup[0], s->n_pdup[1]); + fprintf(samtools_stdout, "%lld\t%lld\tmapped\n", s->n_mapped[0], s->n_mapped[1]); + fprintf(samtools_stdout, "%s\t%s\tmapped %%\n", percent(b0, s->n_mapped[0], s->n_reads[0]), percent(b1, s->n_mapped[1], s->n_reads[1])); + fprintf(samtools_stdout, "%lld\t%lld\tprimary mapped\n", s->n_pmapped[0], s->n_pmapped[1]); + fprintf(samtools_stdout, "%s\t%s\tprimary mapped %%\n", percent(b0, s->n_pmapped[0], s->n_primary[0]), percent(b1, s->n_pmapped[1], s->n_primary[1])); + fprintf(samtools_stdout, "%lld\t%lld\tpaired in sequencing\n", s->n_pair_all[0], s->n_pair_all[1]); + fprintf(samtools_stdout, "%lld\t%lld\tread1\n", s->n_read1[0], s->n_read1[1]); + fprintf(samtools_stdout, "%lld\t%lld\tread2\n", s->n_read2[0], s->n_read2[1]); + fprintf(samtools_stdout, "%lld\t%lld\tproperly paired\n", s->n_pair_good[0], s->n_pair_good[1]); + fprintf(samtools_stdout, "%s\t%s\tproperly paired %%\n", percent(b0, s->n_pair_good[0], s->n_pair_all[0]), percent(b1, s->n_pair_good[1], s->n_pair_all[1])); + fprintf(samtools_stdout, "%lld\t%lld\twith itself and mate mapped\n", s->n_pair_map[0], s->n_pair_map[1]); + fprintf(samtools_stdout, "%lld\t%lld\tsingletons\n", s->n_sgltn[0], s->n_sgltn[1]); + fprintf(samtools_stdout, "%s\t%s\tsingletons %%\n", percent(b0, s->n_sgltn[0], s->n_pair_all[0]), percent(b1, s->n_sgltn[1], s->n_pair_all[1])); + fprintf(samtools_stdout, "%lld\t%lld\twith mate mapped to a different chr\n", s->n_diffchr[0], s->n_diffchr[1]); + fprintf(samtools_stdout, "%lld\t%lld\twith mate mapped to a different chr (mapQ>=5)\n", s->n_diffhigh[0], s->n_diffhigh[1]); +} + +/* + * Select flagstats output format to print. + */ +static void output_fmt(bam_flagstat_t *s, const char *out_fmt) +{ + if (strcmp(out_fmt, "json") == 0 || strcmp(out_fmt, "JSON") == 0) { + out_fmt_json(s); + } else if (strcmp(out_fmt, "tsv") == 0 || strcmp(out_fmt, "TSV") == 0) { + out_fmt_tsv(s); + } else { + out_fmt_default(s); + } +} + +int bam_flagstat(int argc, char *argv[]) +{ + samFile *fp; + sam_hdr_t *header; + bam_flagstat_t *s; + const char *out_fmt = "default"; + int c, status = EXIT_SUCCESS; + + enum { + INPUT_FMT_OPTION = CHAR_MAX+1, + }; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', '-', '-', '@'), + {NULL, 0, NULL, 0} + }; + + while ((c = getopt_long(argc, argv, "@:O:", lopts, NULL)) >= 0) { + switch (c) { + case 'O': + out_fmt = optarg; + break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + usage_exit(samtools_stderr, EXIT_FAILURE); + } + } + + if (argc != optind+1) { + if (argc == optind) usage_exit(samtools_stdout, EXIT_SUCCESS); + else usage_exit(samtools_stderr, EXIT_FAILURE); + } + fp = sam_open_format(argv[optind], "r", &ga.in); + if (fp == NULL) { + print_error_errno("flagstat", "Cannot open input file \"%s\"", argv[optind]); + return 1; + } + if (ga.nthreads > 0) + hts_set_threads(fp, ga.nthreads); + + if (hts_set_opt(fp, CRAM_OPT_REQUIRED_FIELDS, + SAM_FLAG | SAM_MAPQ | SAM_RNEXT)) { + fprintf(samtools_stderr, "Failed to set CRAM_OPT_REQUIRED_FIELDS value\n"); + return 1; + } + + if (hts_set_opt(fp, CRAM_OPT_DECODE_MD, 0)) { + fprintf(samtools_stderr, "Failed to set CRAM_OPT_DECODE_MD value\n"); + return 1; + } + + header = sam_hdr_read(fp); + if (header == NULL) { + fprintf(samtools_stderr, "Failed to read header for \"%s\"\n", argv[optind]); + return 1; + } + + s = bam_flagstat_core(fp, header); + if (s) { + output_fmt(s, out_fmt); + free(s); + } + else { + print_error("flagstat", "error reading from \"%s\"", argv[optind]); + status = EXIT_FAILURE; + } + + sam_hdr_destroy(header); + sam_close(fp); + sam_global_args_free(&ga); + return status; +} diff --git a/samtools/bamshuf.c b/samtools/bamshuf.c new file mode 100644 index 0000000..53e382d --- /dev/null +++ b/samtools/bamshuf.c @@ -0,0 +1,635 @@ +/* bamshuf.c -- collate subcommand. + + Copyright (C) 2012 Broad Institute. + Copyright (C) 2013, 2015-2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +# define WIN32_LEAN_AND_MEAN +# include +#endif +#include "htslib/sam.h" +#include "htslib/hts.h" +#include "htslib/ksort.h" +#include "samtools.h" +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include "htslib/khash.h" + +#define DEF_CLEVEL 1 + +static inline unsigned hash_Wang(unsigned key) +{ + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); + return key; +} + +static inline unsigned hash_X31_Wang(const char *s) +{ + unsigned h = *s; + if (h) { + for (++s ; *s; ++s) h = (h << 5) - h + *s; + return hash_Wang(h); + } else return 0; +} + +typedef struct { + unsigned key; + bam1_t *b; +} elem_t; + +static inline int elem_lt(elem_t x, elem_t y) +{ + if (x.key < y.key) return 1; + if (x.key == y.key) { + int t; + t = strcmp(bam_get_qname(x.b), bam_get_qname(y.b)); + if (t < 0) return 1; + return (t == 0 && ((x.b->core.flag>>6&3) < (y.b->core.flag>>6&3))); + } else return 0; +} + +KSORT_INIT(bamshuf, elem_t, elem_lt) + + +typedef struct { + int written; + bam1_t *b; +} bam_item_t; + +typedef struct { + bam1_t *bam_pool; + bam_item_t *items; + size_t size; + size_t index; +} bam_list_t; + +typedef struct { + bam_item_t *bi; +} store_item_t; + +KHASH_MAP_INIT_STR(bam_store, store_item_t) + + +static bam_item_t *store_bam(bam_list_t *list) { + size_t old_index = list->index; + + list->items[list->index++].written = 0; + + if (list->index >= list->size) + list->index = 0; + + return &list->items[old_index]; +} + + +static int write_bam_needed(bam_list_t *list) { + return !list->items[list->index].written; +} + + +static void mark_bam_as_written(bam_list_t *list) { + list->items[list->index].written = 1; +} + + +static int create_bam_list(bam_list_t *list, size_t max_size) { + size_t i; + + list->size = list->index = 0; + list->items = NULL; + list->bam_pool = NULL; + + if ((list->items = malloc(max_size * sizeof(bam_item_t))) == NULL) { + return 1; + } + + if ((list->bam_pool = calloc(max_size, sizeof(bam1_t))) == NULL) { + return 1; + } + + for (i = 0; i < max_size; i++) { + list->items[i].b = &list->bam_pool[i]; + list->items[i].written = 1; + } + + list->size = max_size; + list->index = 0; + + return 0; +} + + +static void destroy_bam_list(bam_list_t *list) { + size_t i; + + for (i = 0; i < list->size; i++) { + free(list->bam_pool[i].data); + } + + free(list->bam_pool); + free(list->items); +} + + +static inline int write_to_bin_file(bam1_t *bam, int64_t *count, samFile **bin_files, char **names, sam_hdr_t *header, int files) { + uint32_t x; + + x = hash_X31_Wang(bam_get_qname(bam)) % files; + + if (sam_write1(bin_files[x], header, bam) < 0) { + print_error_errno("collate", "Couldn't write to intermediate file \"%s\"", names[x]); + return 1; + } + + ++count[x]; + + return 0; +} + + +static int bamshuf(const char *fn, int n_files, const char *pre, int clevel, + int is_stdout, const char *output_file, int fast, int store_max, sam_global_args *ga, char *arg_list, int no_pg) +{ + samFile *fp, *fpw = NULL, **fpt = NULL; + char **fnt = NULL, modew[8]; + bam1_t *b = NULL; + int i, counter, l, r; + sam_hdr_t *h = NULL; + int64_t j, max_cnt = 0, *cnt = NULL; + elem_t *a = NULL; + htsThreadPool p = {NULL, 0}; + + if (ga->nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga->nthreads))) { + print_error_errno("collate", "Error creating thread pool\n"); + return 1; + } + } + + // Read input, distribute reads pseudo-randomly into n_files temporary + // files. + fp = sam_open_format(fn, "r", &ga->in); + if (fp == NULL) { + print_error_errno("collate", "Cannot open input file \"%s\"", fn); + return 1; + } + if (p.pool) hts_set_opt(fp, HTS_OPT_THREAD_POOL, &p); + + h = sam_hdr_read(fp); + if (h == NULL) { + fprintf(stderr, "Couldn't read header for '%s'\n", fn); + goto fail; + } + + if ((-1 == sam_hdr_update_hd(h, "SO", "unsorted", "GO", "query")) + && (-1 == sam_hdr_add_line(h, "HD", "VN", SAM_FORMAT_VERSION, "SO", "unsorted", "GO", "query", NULL)) + ) { + print_error("collate", "failed to update HD line\n"); + goto fail; + } + + // open final output file + l = strlen(pre); + + sprintf(modew, "wb%d", (clevel >= 0 && clevel <= 9)? clevel : DEF_CLEVEL); + + if (!is_stdout && !output_file) { // output to a file (name based on prefix) + char *fnw = (char*)calloc(l + 5, 1); + if (!fnw) goto mem_fail; + if (ga->out.format == unknown_format) + sprintf(fnw, "%s.bam", pre); // "wb" above makes BAM the default + else + sprintf(fnw, "%s.%s", pre, hts_format_file_extension(&ga->out)); + fpw = sam_open_format(fnw, modew, &ga->out); + free(fnw); + } else if (output_file) { // output to a given file + modew[0] = 'w'; modew[1] = '\0'; + sam_open_mode(modew + 1, output_file, NULL); + j = strlen(modew); + snprintf(modew + j, sizeof(modew) - j, "%d", + (clevel >= 0 && clevel <= 9)? clevel : DEF_CLEVEL); + fpw = sam_open_format(output_file, modew, &ga->out); + } else fpw = sam_open_format("-", modew, &ga->out); // output to stdout + if (fpw == NULL) { + if (is_stdout) print_error_errno("collate", "Cannot open standard output"); + else print_error_errno("collate", "Cannot open output file \"%s.bam\"", pre); + goto fail; + } + if (p.pool) hts_set_opt(fpw, HTS_OPT_THREAD_POOL, &p); + + if (!no_pg && sam_hdr_add_pg(h, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error("collate", "failed to add PG line to header of \"%s\"", output_file); + goto fail; + } + + if (sam_hdr_write(fpw, h) < 0) { + print_error_errno("collate", "Couldn't write header"); + goto fail; + } + + fnt = (char**)calloc(n_files, sizeof(char*)); + if (!fnt) goto mem_fail; + fpt = (samFile**)calloc(n_files, sizeof(samFile*)); + if (!fpt) goto mem_fail; + cnt = (int64_t*)calloc(n_files, 8); + if (!cnt) goto mem_fail; + + for (i = counter = 0; i < n_files; ++i) { + fnt[i] = (char*)calloc(l + 20, 1); + if (!fnt[i]) goto mem_fail; + do { + sprintf(fnt[i], "%s.%04d.bam", pre, counter++); + fpt[i] = sam_open(fnt[i], "wxb1"); + } while (!fpt[i] && errno == EEXIST); + if (fpt[i] == NULL) { + print_error_errno("collate", "Cannot open intermediate file \"%s\"", fnt[i]); + goto fail; + } + if (p.pool) hts_set_opt(fpt[i], HTS_OPT_THREAD_POOL, &p); + if (sam_hdr_write(fpt[i], h) < 0) { + print_error_errno("collate", "Couldn't write header to intermediate file \"%s\"", fnt[i]); + goto fail; + } + } + + if (fast) { + khash_t(bam_store) *stored = kh_init(bam_store); + khiter_t itr; + bam_list_t list; + int err = 0; + if (!stored) goto mem_fail; + + if (store_max < 2) store_max = 2; + + if (create_bam_list(&list, store_max)) { + fprintf(stderr, "[collate[ ERROR: unable to create bam list.\n"); + err = 1; + goto fast_fail; + } + + while ((r = sam_read1(fp, h, list.items[list.index].b)) >= 0) { + int ret; + bam1_t *b = list.items[list.index].b; + int readflag = b->core.flag & (BAM_FREAD1 | BAM_FREAD2); + + // strictly paired reads only + if (!(b->core.flag & (BAM_FSECONDARY | BAM_FSUPPLEMENTARY)) && (readflag == BAM_FREAD1 || readflag == BAM_FREAD2)) { + + itr = kh_get(bam_store, stored, bam_get_qname(b)); + + if (itr == kh_end(stored)) { + // new read + itr = kh_put(bam_store, stored, bam_get_qname(b), &ret); + + if (ret > 0) { // okay to go ahead store it + kh_value(stored, itr).bi = store_bam(&list); + + // see if the next one on the list needs to be written out + if (write_bam_needed(&list)) { + if (write_to_bin_file(list.items[list.index].b, cnt, fpt, fnt, h, n_files) < 0) { + fprintf(stderr, "[collate] ERROR: could not write line.\n"); + err = 1; + goto fast_fail; + } else { + mark_bam_as_written(&list); + + itr = kh_get(bam_store, stored, bam_get_qname(list.items[list.index].b)); + + if (itr != kh_end(stored)) { + kh_del(bam_store, stored, itr); + } else { + fprintf(stderr, "[collate] ERROR: stored value not in hash.\n"); + err = 1; + goto fast_fail; + } + } + } + } else if (ret == 0) { + fprintf(stderr, "[collate] ERROR: value already in hash.\n"); + err = 1; + goto fast_fail; + } else { + fprintf(stderr, "[collate] ERROR: unable to store in hash.\n"); + err = 1; + goto fast_fail; + } + } else { // we have a match + // write out the reads in R1 R2 order + bam1_t *r1, *r2; + + if (b->core.flag & BAM_FREAD1) { + r1 = b; + r2 = kh_value(stored, itr).bi->b; + } else { + r1 = kh_value(stored, itr).bi->b; + r2 = b; + } + + if (sam_write1(fpw, h, r1) < 0) { + fprintf(stderr, "[collate] ERROR: could not write r1 alignment.\n"); + err = 1; + goto fast_fail; + } + + if (sam_write1(fpw, h, r2) < 0) { + fprintf(stderr, "[collate] ERROR: could not write r2 alignment.\n"); + err = 1; + goto fast_fail; + } + + mark_bam_as_written(&list); + + // remove stored read + kh_value(stored, itr).bi->written = 1; + kh_del(bam_store, stored, itr); + } + } + } + + for (list.index = 0; list.index < list.size; list.index++) { + if (write_bam_needed(&list)) { + bam1_t *b = list.items[list.index].b; + + if (write_to_bin_file(b, cnt, fpt, fnt, h, n_files)) { + err = 1; + goto fast_fail; + } else { + itr = kh_get(bam_store, stored, bam_get_qname(b)); + kh_del(bam_store, stored, itr); + } + } + } + + fast_fail: + if (err) { + for (itr = kh_begin(stored); itr != kh_end(stored); ++itr) { + if (kh_exist(stored, itr)) { + kh_del(bam_store, stored, itr); + } + } + + kh_destroy(bam_store, stored); + destroy_bam_list(&list); + goto fail; + } else { + kh_destroy(bam_store, stored); + destroy_bam_list(&list); + } + + } else { + b = bam_init1(); + if (!b) goto mem_fail; + + while ((r = sam_read1(fp, h, b)) >= 0) { + if (write_to_bin_file(b, cnt, fpt, fnt, h, n_files)) { + bam_destroy1(b); + goto fail; + } + } + + bam_destroy1(b); + } + + if (r < -1) { + fprintf(stderr, "Error reading input file\n"); + goto fail; + } + for (i = 0; i < n_files; ++i) { + // Close split output + r = sam_close(fpt[i]); + fpt[i] = NULL; + if (r < 0) { + fprintf(stderr, "Error on closing '%s'\n", fnt[i]); + return 1; + } + + // Find biggest count + if (max_cnt < cnt[i]) max_cnt = cnt[i]; + } + free(fpt); + fpt = NULL; + sam_close(fp); + fp = NULL; + + // merge + a = malloc(max_cnt * sizeof(elem_t)); + if (!a) goto mem_fail; + for (j = 0; j < max_cnt; ++j) { + a[j].b = bam_init1(); + if (!a[j].b) { max_cnt = j; goto mem_fail; } + } + + for (i = 0; i < n_files; ++i) { + int64_t c = cnt[i]; + fp = sam_open_format(fnt[i], "r", &ga->in); + if (NULL == fp) { + print_error_errno("collate", "Couldn't open \"%s\"", fnt[i]); + goto fail; + } + if (p.pool) hts_set_opt(fp, HTS_OPT_THREAD_POOL, &p); + sam_hdr_destroy(sam_hdr_read(fp)); // Skip over header + + // Slurp in one of the split files + for (j = 0; j < c; ++j) { + if (sam_read1(fp, h, a[j].b) < 0) { + fprintf(stderr, "Error reading '%s'\n", fnt[i]); + goto fail; + } + a[j].key = hash_X31_Wang(bam_get_qname(a[j].b)); + } + sam_close(fp); + unlink(fnt[i]); + free(fnt[i]); + fnt[i] = NULL; + + ks_introsort(bamshuf, c, a); // Shuffle all the reads + + // Write them out again + for (j = 0; j < c; ++j) { + if (sam_write1(fpw, h, a[j].b) < 0) { + print_error_errno("collate", "Error writing to output"); + goto fail; + } + } + } + + sam_hdr_destroy(h); + for (j = 0; j < max_cnt; ++j) bam_destroy1(a[j].b); + free(a); free(fnt); free(cnt); + sam_global_args_free(ga); + if (sam_close(fpw) < 0) { + fprintf(stderr, "Error on closing output\n"); + return 1; + } + + if (p.pool) hts_tpool_destroy(p.pool); + return 0; + + mem_fail: + fprintf(stderr, "Out of memory\n"); + + fail: + if (fp) sam_close(fp); + if (fpw) sam_close(fpw); + if (h) sam_hdr_destroy(h); + for (i = 0; i < n_files; ++i) { + if (fnt) free(fnt[i]); + if (fpt && fpt[i]) sam_close(fpt[i]); + } + if (a) { + for (j = 0; j < max_cnt; ++j) bam_destroy1(a[j].b); + free(a); + } + free(fnt); + free(fpt); + free(cnt); + if (p.pool) hts_tpool_destroy(p.pool); + sam_global_args_free(ga); + return 1; +} + +static int usage(FILE *fp, int n_files, int reads_store) { + fprintf(fp, + "Usage: samtools collate [-Ou] [-o ] [-n nFiles] [-l cLevel] []\n\n" + "Options:\n" + " -O output to stdout\n" + " -o output file name (use prefix if not set)\n" + " -u uncompressed BAM output\n" + " -f fast (only primary alignments)\n" + " -r working reads stored (with -f) [%d]\n" // reads_store + " -l INT compression level [%d]\n" // DEF_CLEVEL + " -n INT number of temporary files [%d]\n" // n_files + " --no-PG do not add a PG line\n", + reads_store, DEF_CLEVEL, n_files); + + sam_global_opt_help(fp, "-....@-."); + fprintf(fp, + " is required unless the -o or -O options are used.\n"); + + return 1; +} + +char * generate_prefix() { + char *prefix; + unsigned int pid = getpid(); +#ifdef _WIN32 +# define PREFIX_LEN (MAX_PATH + 16) + DWORD ret; + prefix = calloc(PREFIX_LEN, sizeof(*prefix)); + if (!prefix) { + perror("collate"); + return NULL; + } + ret = GetTempPathA(MAX_PATH, prefix); + if (ret > MAX_PATH || ret == 0) { + fprintf(stderr, + "[E::collate] Couldn't get path for temporary files.\n"); + free(prefix); + return NULL; + } + snprintf(prefix + ret, PREFIX_LEN - ret, "\\%x", pid); + return prefix; +#else +# define PREFIX_LEN 64 + prefix = malloc(PREFIX_LEN); + if (!prefix) { + perror("collate"); + return NULL; + } + snprintf(prefix, PREFIX_LEN, "/tmp/collate%x", pid); + return prefix; +#endif +} + +int main_bamshuf(int argc, char *argv[]) +{ + int c, n_files = 64, clevel = DEF_CLEVEL, is_stdout = 0, is_un = 0, fast_coll = 0, reads_store = 10000, ret, pre_mem = 0, no_pg = 0; + const char *output_file = NULL; + char *prefix = NULL, *arg_list = NULL; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0, '@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "n:l:uOo:@:fr:", lopts, NULL)) >= 0) { + switch (c) { + case 'n': n_files = atoi(optarg); break; + case 'l': clevel = atoi(optarg); break; + case 'u': is_un = 1; break; + case 'O': is_stdout = 1; break; + case 'o': output_file = optarg; break; + case 'f': fast_coll = 1; break; + case 'r': reads_store = atoi(optarg); break; + case 1: no_pg = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': return usage(stderr, n_files, reads_store); + } + } + if (is_un) clevel = 0; + if (argc >= optind + 2) prefix = argv[optind+1]; + if (!(prefix || is_stdout || output_file)) + return usage(stderr, n_files, reads_store); + if (is_stdout && output_file) { + fprintf(stderr, "collate: -o and -O options cannot be used together.\n"); + return usage(stderr, n_files, reads_store); + } + if (!prefix) { + prefix = generate_prefix(); + pre_mem = 1; + } + + if (!prefix) return EXIT_FAILURE; + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("collate", "failed to create arg_list"); + return 1; + } + + ret = bamshuf(argv[optind], n_files, prefix, clevel, is_stdout, + output_file, fast_coll, reads_store, &ga, arg_list, no_pg); + + if (pre_mem) free(prefix); + free(arg_list); + + return ret; +} diff --git a/samtools/bamshuf.c.pysam.c b/samtools/bamshuf.c.pysam.c new file mode 100644 index 0000000..d075a93 --- /dev/null +++ b/samtools/bamshuf.c.pysam.c @@ -0,0 +1,637 @@ +#include "samtools.pysam.h" + +/* bamshuf.c -- collate subcommand. + + Copyright (C) 2012 Broad Institute. + Copyright (C) 2013, 2015-2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +# define WIN32_LEAN_AND_MEAN +# include +#endif +#include "htslib/sam.h" +#include "htslib/hts.h" +#include "htslib/ksort.h" +#include "samtools.h" +#include "htslib/thread_pool.h" +#include "sam_opts.h" +#include "htslib/khash.h" + +#define DEF_CLEVEL 1 + +static inline unsigned hash_Wang(unsigned key) +{ + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); + return key; +} + +static inline unsigned hash_X31_Wang(const char *s) +{ + unsigned h = *s; + if (h) { + for (++s ; *s; ++s) h = (h << 5) - h + *s; + return hash_Wang(h); + } else return 0; +} + +typedef struct { + unsigned key; + bam1_t *b; +} elem_t; + +static inline int elem_lt(elem_t x, elem_t y) +{ + if (x.key < y.key) return 1; + if (x.key == y.key) { + int t; + t = strcmp(bam_get_qname(x.b), bam_get_qname(y.b)); + if (t < 0) return 1; + return (t == 0 && ((x.b->core.flag>>6&3) < (y.b->core.flag>>6&3))); + } else return 0; +} + +KSORT_INIT(bamshuf, elem_t, elem_lt) + + +typedef struct { + int written; + bam1_t *b; +} bam_item_t; + +typedef struct { + bam1_t *bam_pool; + bam_item_t *items; + size_t size; + size_t index; +} bam_list_t; + +typedef struct { + bam_item_t *bi; +} store_item_t; + +KHASH_MAP_INIT_STR(bam_store, store_item_t) + + +static bam_item_t *store_bam(bam_list_t *list) { + size_t old_index = list->index; + + list->items[list->index++].written = 0; + + if (list->index >= list->size) + list->index = 0; + + return &list->items[old_index]; +} + + +static int write_bam_needed(bam_list_t *list) { + return !list->items[list->index].written; +} + + +static void mark_bam_as_written(bam_list_t *list) { + list->items[list->index].written = 1; +} + + +static int create_bam_list(bam_list_t *list, size_t max_size) { + size_t i; + + list->size = list->index = 0; + list->items = NULL; + list->bam_pool = NULL; + + if ((list->items = malloc(max_size * sizeof(bam_item_t))) == NULL) { + return 1; + } + + if ((list->bam_pool = calloc(max_size, sizeof(bam1_t))) == NULL) { + return 1; + } + + for (i = 0; i < max_size; i++) { + list->items[i].b = &list->bam_pool[i]; + list->items[i].written = 1; + } + + list->size = max_size; + list->index = 0; + + return 0; +} + + +static void destroy_bam_list(bam_list_t *list) { + size_t i; + + for (i = 0; i < list->size; i++) { + free(list->bam_pool[i].data); + } + + free(list->bam_pool); + free(list->items); +} + + +static inline int write_to_bin_file(bam1_t *bam, int64_t *count, samFile **bin_files, char **names, sam_hdr_t *header, int files) { + uint32_t x; + + x = hash_X31_Wang(bam_get_qname(bam)) % files; + + if (sam_write1(bin_files[x], header, bam) < 0) { + print_error_errno("collate", "Couldn't write to intermediate file \"%s\"", names[x]); + return 1; + } + + ++count[x]; + + return 0; +} + + +static int bamshuf(const char *fn, int n_files, const char *pre, int clevel, + int is_stdout, const char *output_file, int fast, int store_max, sam_global_args *ga, char *arg_list, int no_pg) +{ + samFile *fp, *fpw = NULL, **fpt = NULL; + char **fnt = NULL, modew[8]; + bam1_t *b = NULL; + int i, counter, l, r; + sam_hdr_t *h = NULL; + int64_t j, max_cnt = 0, *cnt = NULL; + elem_t *a = NULL; + htsThreadPool p = {NULL, 0}; + + if (ga->nthreads > 0) { + if (!(p.pool = hts_tpool_init(ga->nthreads))) { + print_error_errno("collate", "Error creating thread pool\n"); + return 1; + } + } + + // Read input, distribute reads pseudo-randomly into n_files temporary + // files. + fp = sam_open_format(fn, "r", &ga->in); + if (fp == NULL) { + print_error_errno("collate", "Cannot open input file \"%s\"", fn); + return 1; + } + if (p.pool) hts_set_opt(fp, HTS_OPT_THREAD_POOL, &p); + + h = sam_hdr_read(fp); + if (h == NULL) { + fprintf(samtools_stderr, "Couldn't read header for '%s'\n", fn); + goto fail; + } + + if ((-1 == sam_hdr_update_hd(h, "SO", "unsorted", "GO", "query")) + && (-1 == sam_hdr_add_line(h, "HD", "VN", SAM_FORMAT_VERSION, "SO", "unsorted", "GO", "query", NULL)) + ) { + print_error("collate", "failed to update HD line\n"); + goto fail; + } + + // open final output file + l = strlen(pre); + + sprintf(modew, "wb%d", (clevel >= 0 && clevel <= 9)? clevel : DEF_CLEVEL); + + if (!is_stdout && !output_file) { // output to a file (name based on prefix) + char *fnw = (char*)calloc(l + 5, 1); + if (!fnw) goto mem_fail; + if (ga->out.format == unknown_format) + sprintf(fnw, "%s.bam", pre); // "wb" above makes BAM the default + else + sprintf(fnw, "%s.%s", pre, hts_format_file_extension(&ga->out)); + fpw = sam_open_format(fnw, modew, &ga->out); + free(fnw); + } else if (output_file) { // output to a given file + modew[0] = 'w'; modew[1] = '\0'; + sam_open_mode(modew + 1, output_file, NULL); + j = strlen(modew); + snprintf(modew + j, sizeof(modew) - j, "%d", + (clevel >= 0 && clevel <= 9)? clevel : DEF_CLEVEL); + fpw = sam_open_format(output_file, modew, &ga->out); + } else fpw = sam_open_format("-", modew, &ga->out); // output to samtools_stdout + if (fpw == NULL) { + if (is_stdout) print_error_errno("collate", "Cannot open standard output"); + else print_error_errno("collate", "Cannot open output file \"%s.bam\"", pre); + goto fail; + } + if (p.pool) hts_set_opt(fpw, HTS_OPT_THREAD_POOL, &p); + + if (!no_pg && sam_hdr_add_pg(h, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error("collate", "failed to add PG line to header of \"%s\"", output_file); + goto fail; + } + + if (sam_hdr_write(fpw, h) < 0) { + print_error_errno("collate", "Couldn't write header"); + goto fail; + } + + fnt = (char**)calloc(n_files, sizeof(char*)); + if (!fnt) goto mem_fail; + fpt = (samFile**)calloc(n_files, sizeof(samFile*)); + if (!fpt) goto mem_fail; + cnt = (int64_t*)calloc(n_files, 8); + if (!cnt) goto mem_fail; + + for (i = counter = 0; i < n_files; ++i) { + fnt[i] = (char*)calloc(l + 20, 1); + if (!fnt[i]) goto mem_fail; + do { + sprintf(fnt[i], "%s.%04d.bam", pre, counter++); + fpt[i] = sam_open(fnt[i], "wxb1"); + } while (!fpt[i] && errno == EEXIST); + if (fpt[i] == NULL) { + print_error_errno("collate", "Cannot open intermediate file \"%s\"", fnt[i]); + goto fail; + } + if (p.pool) hts_set_opt(fpt[i], HTS_OPT_THREAD_POOL, &p); + if (sam_hdr_write(fpt[i], h) < 0) { + print_error_errno("collate", "Couldn't write header to intermediate file \"%s\"", fnt[i]); + goto fail; + } + } + + if (fast) { + khash_t(bam_store) *stored = kh_init(bam_store); + khiter_t itr; + bam_list_t list; + int err = 0; + if (!stored) goto mem_fail; + + if (store_max < 2) store_max = 2; + + if (create_bam_list(&list, store_max)) { + fprintf(samtools_stderr, "[collate[ ERROR: unable to create bam list.\n"); + err = 1; + goto fast_fail; + } + + while ((r = sam_read1(fp, h, list.items[list.index].b)) >= 0) { + int ret; + bam1_t *b = list.items[list.index].b; + int readflag = b->core.flag & (BAM_FREAD1 | BAM_FREAD2); + + // strictly paired reads only + if (!(b->core.flag & (BAM_FSECONDARY | BAM_FSUPPLEMENTARY)) && (readflag == BAM_FREAD1 || readflag == BAM_FREAD2)) { + + itr = kh_get(bam_store, stored, bam_get_qname(b)); + + if (itr == kh_end(stored)) { + // new read + itr = kh_put(bam_store, stored, bam_get_qname(b), &ret); + + if (ret > 0) { // okay to go ahead store it + kh_value(stored, itr).bi = store_bam(&list); + + // see if the next one on the list needs to be written out + if (write_bam_needed(&list)) { + if (write_to_bin_file(list.items[list.index].b, cnt, fpt, fnt, h, n_files) < 0) { + fprintf(samtools_stderr, "[collate] ERROR: could not write line.\n"); + err = 1; + goto fast_fail; + } else { + mark_bam_as_written(&list); + + itr = kh_get(bam_store, stored, bam_get_qname(list.items[list.index].b)); + + if (itr != kh_end(stored)) { + kh_del(bam_store, stored, itr); + } else { + fprintf(samtools_stderr, "[collate] ERROR: stored value not in hash.\n"); + err = 1; + goto fast_fail; + } + } + } + } else if (ret == 0) { + fprintf(samtools_stderr, "[collate] ERROR: value already in hash.\n"); + err = 1; + goto fast_fail; + } else { + fprintf(samtools_stderr, "[collate] ERROR: unable to store in hash.\n"); + err = 1; + goto fast_fail; + } + } else { // we have a match + // write out the reads in R1 R2 order + bam1_t *r1, *r2; + + if (b->core.flag & BAM_FREAD1) { + r1 = b; + r2 = kh_value(stored, itr).bi->b; + } else { + r1 = kh_value(stored, itr).bi->b; + r2 = b; + } + + if (sam_write1(fpw, h, r1) < 0) { + fprintf(samtools_stderr, "[collate] ERROR: could not write r1 alignment.\n"); + err = 1; + goto fast_fail; + } + + if (sam_write1(fpw, h, r2) < 0) { + fprintf(samtools_stderr, "[collate] ERROR: could not write r2 alignment.\n"); + err = 1; + goto fast_fail; + } + + mark_bam_as_written(&list); + + // remove stored read + kh_value(stored, itr).bi->written = 1; + kh_del(bam_store, stored, itr); + } + } + } + + for (list.index = 0; list.index < list.size; list.index++) { + if (write_bam_needed(&list)) { + bam1_t *b = list.items[list.index].b; + + if (write_to_bin_file(b, cnt, fpt, fnt, h, n_files)) { + err = 1; + goto fast_fail; + } else { + itr = kh_get(bam_store, stored, bam_get_qname(b)); + kh_del(bam_store, stored, itr); + } + } + } + + fast_fail: + if (err) { + for (itr = kh_begin(stored); itr != kh_end(stored); ++itr) { + if (kh_exist(stored, itr)) { + kh_del(bam_store, stored, itr); + } + } + + kh_destroy(bam_store, stored); + destroy_bam_list(&list); + goto fail; + } else { + kh_destroy(bam_store, stored); + destroy_bam_list(&list); + } + + } else { + b = bam_init1(); + if (!b) goto mem_fail; + + while ((r = sam_read1(fp, h, b)) >= 0) { + if (write_to_bin_file(b, cnt, fpt, fnt, h, n_files)) { + bam_destroy1(b); + goto fail; + } + } + + bam_destroy1(b); + } + + if (r < -1) { + fprintf(samtools_stderr, "Error reading input file\n"); + goto fail; + } + for (i = 0; i < n_files; ++i) { + // Close split output + r = sam_close(fpt[i]); + fpt[i] = NULL; + if (r < 0) { + fprintf(samtools_stderr, "Error on closing '%s'\n", fnt[i]); + return 1; + } + + // Find biggest count + if (max_cnt < cnt[i]) max_cnt = cnt[i]; + } + free(fpt); + fpt = NULL; + sam_close(fp); + fp = NULL; + + // merge + a = malloc(max_cnt * sizeof(elem_t)); + if (!a) goto mem_fail; + for (j = 0; j < max_cnt; ++j) { + a[j].b = bam_init1(); + if (!a[j].b) { max_cnt = j; goto mem_fail; } + } + + for (i = 0; i < n_files; ++i) { + int64_t c = cnt[i]; + fp = sam_open_format(fnt[i], "r", &ga->in); + if (NULL == fp) { + print_error_errno("collate", "Couldn't open \"%s\"", fnt[i]); + goto fail; + } + if (p.pool) hts_set_opt(fp, HTS_OPT_THREAD_POOL, &p); + sam_hdr_destroy(sam_hdr_read(fp)); // Skip over header + + // Slurp in one of the split files + for (j = 0; j < c; ++j) { + if (sam_read1(fp, h, a[j].b) < 0) { + fprintf(samtools_stderr, "Error reading '%s'\n", fnt[i]); + goto fail; + } + a[j].key = hash_X31_Wang(bam_get_qname(a[j].b)); + } + sam_close(fp); + unlink(fnt[i]); + free(fnt[i]); + fnt[i] = NULL; + + ks_introsort(bamshuf, c, a); // Shuffle all the reads + + // Write them out again + for (j = 0; j < c; ++j) { + if (sam_write1(fpw, h, a[j].b) < 0) { + print_error_errno("collate", "Error writing to output"); + goto fail; + } + } + } + + sam_hdr_destroy(h); + for (j = 0; j < max_cnt; ++j) bam_destroy1(a[j].b); + free(a); free(fnt); free(cnt); + sam_global_args_free(ga); + if (sam_close(fpw) < 0) { + fprintf(samtools_stderr, "Error on closing output\n"); + return 1; + } + + if (p.pool) hts_tpool_destroy(p.pool); + return 0; + + mem_fail: + fprintf(samtools_stderr, "Out of memory\n"); + + fail: + if (fp) sam_close(fp); + if (fpw) sam_close(fpw); + if (h) sam_hdr_destroy(h); + for (i = 0; i < n_files; ++i) { + if (fnt) free(fnt[i]); + if (fpt && fpt[i]) sam_close(fpt[i]); + } + if (a) { + for (j = 0; j < max_cnt; ++j) bam_destroy1(a[j].b); + free(a); + } + free(fnt); + free(fpt); + free(cnt); + if (p.pool) hts_tpool_destroy(p.pool); + sam_global_args_free(ga); + return 1; +} + +static int usage(FILE *fp, int n_files, int reads_store) { + fprintf(fp, + "Usage: samtools collate [-Ou] [-o ] [-n nFiles] [-l cLevel] []\n\n" + "Options:\n" + " -O output to samtools_stdout\n" + " -o output file name (use prefix if not set)\n" + " -u uncompressed BAM output\n" + " -f fast (only primary alignments)\n" + " -r working reads stored (with -f) [%d]\n" // reads_store + " -l INT compression level [%d]\n" // DEF_CLEVEL + " -n INT number of temporary files [%d]\n" // n_files + " --no-PG do not add a PG line\n", + reads_store, DEF_CLEVEL, n_files); + + sam_global_opt_help(fp, "-....@-."); + fprintf(fp, + " is required unless the -o or -O options are used.\n"); + + return 1; +} + +char * generate_prefix() { + char *prefix; + unsigned int pid = getpid(); +#ifdef _WIN32 +# define PREFIX_LEN (MAX_PATH + 16) + DWORD ret; + prefix = calloc(PREFIX_LEN, sizeof(*prefix)); + if (!prefix) { + perror("collate"); + return NULL; + } + ret = GetTempPathA(MAX_PATH, prefix); + if (ret > MAX_PATH || ret == 0) { + fprintf(samtools_stderr, + "[E::collate] Couldn't get path for temporary files.\n"); + free(prefix); + return NULL; + } + snprintf(prefix + ret, PREFIX_LEN - ret, "\\%x", pid); + return prefix; +#else +# define PREFIX_LEN 64 + prefix = malloc(PREFIX_LEN); + if (!prefix) { + perror("collate"); + return NULL; + } + snprintf(prefix, PREFIX_LEN, "/tmp/collate%x", pid); + return prefix; +#endif +} + +int main_bamshuf(int argc, char *argv[]) +{ + int c, n_files = 64, clevel = DEF_CLEVEL, is_stdout = 0, is_un = 0, fast_coll = 0, reads_store = 10000, ret, pre_mem = 0, no_pg = 0; + const char *output_file = NULL; + char *prefix = NULL, *arg_list = NULL; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0, '@'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "n:l:uOo:@:fr:", lopts, NULL)) >= 0) { + switch (c) { + case 'n': n_files = atoi(optarg); break; + case 'l': clevel = atoi(optarg); break; + case 'u': is_un = 1; break; + case 'O': is_stdout = 1; break; + case 'o': output_file = optarg; break; + case 'f': fast_coll = 1; break; + case 'r': reads_store = atoi(optarg); break; + case 1: no_pg = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': return usage(samtools_stderr, n_files, reads_store); + } + } + if (is_un) clevel = 0; + if (argc >= optind + 2) prefix = argv[optind+1]; + if (!(prefix || is_stdout || output_file)) + return usage(samtools_stderr, n_files, reads_store); + if (is_stdout && output_file) { + fprintf(samtools_stderr, "collate: -o and -O options cannot be used together.\n"); + return usage(samtools_stderr, n_files, reads_store); + } + if (!prefix) { + prefix = generate_prefix(); + pre_mem = 1; + } + + if (!prefix) return EXIT_FAILURE; + + if (!no_pg && !(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("collate", "failed to create arg_list"); + return 1; + } + + ret = bamshuf(argv[optind], n_files, prefix, clevel, is_stdout, + output_file, fast_coll, reads_store, &ga, arg_list, no_pg); + + if (pre_mem) free(prefix); + free(arg_list); + + return ret; +} diff --git a/samtools/bamtk.c b/samtools/bamtk.c new file mode 100644 index 0000000..e690c1d --- /dev/null +++ b/samtools/bamtk.c @@ -0,0 +1,301 @@ +/* bamtk.c -- main samtools command front-end. + + Copyright (C) 2008-2022 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include + +#include "htslib/hts.h" +#include "htslib/hfile.h" +#include "samtools.h" +#include "version.h" + +int bam_taf2baf(int argc, char *argv[]); +int bam_mpileup(int argc, char *argv[]); +int bam_merge(int argc, char *argv[]); +int bam_index(int argc, char *argv[]); +int bam_sort(int argc, char *argv[]); +int bam_tview_main(int argc, char *argv[]); +int bam_mating(int argc, char *argv[]); +int bam_rmdup(int argc, char *argv[]); +int bam_flagstat(int argc, char *argv[]); +int bam_fillmd(int argc, char *argv[]); +int bam_idxstats(int argc, char *argv[]); +int bam_markdup(int argc, char *argv[]); +int main_samview(int argc, char *argv[]); +int main_head(int argc, char *argv[]); +int main_reheader(int argc, char *argv[]); +int main_cut_target(int argc, char *argv[]); +int main_phase(int argc, char *argv[]); +int main_cat(int argc, char *argv[]); +int main_depth(int argc, char *argv[]); +int main_coverage(int argc, char *argv[]); +int main_bam2fq(int argc, char *argv[]); +int main_pad2unpad(int argc, char *argv[]); +int main_bedcov(int argc, char *argv[]); +int main_bamshuf(int argc, char *argv[]); +int main_stats(int argc, char *argv[]); +int main_flags(int argc, char *argv[]); +int main_split(int argc, char *argv[]); +int main_quickcheck(int argc, char *argv[]); +int main_addreplacerg(int argc, char *argv[]); +int faidx_main(int argc, char *argv[]); +int dict_main(int argc, char *argv[]); +int fqidx_main(int argc, char *argv[]); +int amplicon_clip_main(int argc, char *argv[]); +int main_ampliconstats(int argc, char *argv[]); +int main_import(int argc, char *argv[]); +int main_samples(int argc, char *argv[]); +int main_consensus(int argc, char *argv[]); +int main_reference(int argc, char *argv[]); + +const char *samtools_version() +{ + return SAMTOOLS_VERSION; +} + +// These come out of the config.h file built by autoconf or Makefile +const char *samtools_feature_string(void) { + const char *fmt = + +#ifdef PACKAGE_URL + "build=configure " +#else + "build=Makefile " +#endif + +#ifdef HAVE_CURSES + "curses=yes " +#else + "curses=no " +#endif + ; + + return fmt; +} + +static void long_version(void) { + printf("samtools %s\n" + "Using htslib %s\n" + "Copyright (C) 2022 Genome Research Ltd.\n", + samtools_version(), hts_version()); + + printf("\nSamtools compilation details:\n"); + printf(" Features: %s\n", samtools_feature_string()); + printf(" CC: %s\n", SAMTOOLS_CC); + printf(" CPPFLAGS: %s\n", SAMTOOLS_CPPFLAGS); + printf(" CFLAGS: %s\n", SAMTOOLS_CFLAGS); + printf(" LDFLAGS: %s\n", SAMTOOLS_LDFLAGS); + printf(" HTSDIR: %s\n", SAMTOOLS_HTSDIR); + printf(" LIBS: %s\n", SAMTOOLS_LIBS); + printf(" CURSES_LIB: %s\n", SAMTOOLS_CURSES_LIB); + + printf("\nHTSlib compilation details:\n"); + printf(" Features: %s\n", hts_feature_string()); + printf(" CC: %s\n", hts_test_feature(HTS_FEATURE_CC)); + printf(" CPPFLAGS: %s\n", hts_test_feature(HTS_FEATURE_CPPFLAGS)); + printf(" CFLAGS: %s\n", hts_test_feature(HTS_FEATURE_CFLAGS)); + printf(" LDFLAGS: %s\n", hts_test_feature(HTS_FEATURE_LDFLAGS)); + + // Plugins and schemes + printf("\nHTSlib URL scheme handlers present:\n"); + const char *plugins[100]; + int np = 100, i, j; + + if (hfile_list_plugins(plugins, &np) < 0) + return; + + for (i = 0; i < np; i++) { + const char *sc_list[100]; + int nschemes = 100; + if (hfile_list_schemes(plugins[i], sc_list, &nschemes) < 0) + return; + + printf(" %s:\t", plugins[i]); + for (j = 0; j < nschemes; j++) + printf(" %s%c", sc_list[j], ",\n"[j+1==nschemes]); + } +} + +static void usage(FILE *fp) +{ + /* Please improve the grouping */ + + fprintf(fp, +"\n" +"Program: samtools (Tools for alignments in the SAM format)\n" +"Version: %s (using htslib %s)\n\n", samtools_version(), hts_version()); + fprintf(fp, +"Usage: samtools [options]\n" +"\n" +"Commands:\n" +" -- Indexing\n" +" dict create a sequence dictionary file\n" +" faidx index/extract FASTA\n" +" fqidx index/extract FASTQ\n" +" index index alignment\n" +"\n" +" -- Editing\n" +" calmd recalculate MD/NM tags and '=' bases\n" +" fixmate fix mate information\n" +" reheader replace BAM header\n" +" targetcut cut fosmid regions (for fosmid pool only)\n" +" addreplacerg adds or replaces RG tags\n" +" markdup mark duplicates\n" +" ampliconclip clip oligos from the end of reads\n" +"\n" +" -- File operations\n" +" collate shuffle and group alignments by name\n" +" cat concatenate BAMs\n" +" consensus produce a consensus Pileup/FASTA/FASTQ\n" +" merge merge sorted alignments\n" +" mpileup multi-way pileup\n" +" sort sort alignment file\n" +" split splits a file by read group\n" +" quickcheck quickly check if SAM/BAM/CRAM file appears intact\n" +" fastq converts a BAM to a FASTQ\n" +" fasta converts a BAM to a FASTA\n" +" import Converts FASTA or FASTQ files to SAM/BAM/CRAM\n" +" reference Generates a reference from aligned data\n" +"\n" +" -- Statistics\n" +" bedcov read depth per BED region\n" +" coverage alignment depth and percent coverage\n" +" depth compute the depth\n" +" flagstat simple stats\n" +" idxstats BAM index stats\n" +" phase phase heterozygotes\n" +" stats generate stats (former bamcheck)\n" +" ampliconstats generate amplicon specific stats\n" +"\n" +" -- Viewing\n" +" flags explain BAM flags\n" +" head header viewer\n" +" tview text alignment viewer\n" +" view SAM<->BAM<->CRAM conversion\n" +" depad convert padded BAM to unpadded BAM\n" +" samples list the samples in a set of SAM/BAM/CRAM files\n" +"\n" +" -- Misc\n" +" help [cmd] display this help message or help for [cmd]\n" +" version detailed version information\n" +"\n"); +} + +// This is a tricky one, but on Windows the filename wildcard expansion is done by +// the application and not by the shell, as traditionally it never had a "shell". +// Even now, DOS and Powershell do not do this expansion (but bash does). +// +// This means that Mingw/Msys implements code before main() that takes e.g. "*" and +// expands it up to a list of matching filenames. This in turn breaks things like +// specifying "*" as a region (all the unmapped reads). We take a hard line here - +// filename expansion is the task of the shell, not our application! +#ifdef _WIN32 +int _CRT_glob = 0; +#endif + +int main(int argc, char *argv[]) +{ +#ifdef _WIN32 + setmode(fileno(stdout), O_BINARY); + setmode(fileno(stdin), O_BINARY); +#endif + if (argc < 2) { usage(stderr); return 1; } + + if (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "--help") == 0) { + if (argc == 2) { usage(stdout); return 0; } + + // Otherwise change "samtools help COMMAND [...]" to "samtools COMMAND"; + // main_xyz() functions by convention display the subcommand's usage + // when invoked without any arguments. + argv++; + argc = 2; + } + + int ret = 0; + if (strcmp(argv[1], "view") == 0) ret = main_samview(argc-1, argv+1); + else if (strcmp(argv[1], "import") == 0) ret = main_import(argc-1, argv+1); + else if (strcmp(argv[1], "mpileup") == 0) ret = bam_mpileup(argc-1, argv+1); + else if (strcmp(argv[1], "merge") == 0) ret = bam_merge(argc-1, argv+1); + else if (strcmp(argv[1], "sort") == 0) ret = bam_sort(argc-1, argv+1); + else if (strcmp(argv[1], "index") == 0) ret = bam_index(argc-1, argv+1); + else if (strcmp(argv[1], "idxstat") == 0 || + strcmp(argv[1], "idxstats") == 0) ret = bam_idxstats(argc-1, argv+1); + else if (strcmp(argv[1], "faidx") == 0) ret = faidx_main(argc-1, argv+1); + else if (strcmp(argv[1], "fqidx") == 0) ret = fqidx_main(argc-1, argv+1); + else if (strcmp(argv[1], "dict") == 0) ret = dict_main(argc-1, argv+1); + else if (strcmp(argv[1], "head") == 0) ret = main_head(argc-1, argv+1); + else if (strcmp(argv[1], "fixmate") == 0) ret = bam_mating(argc-1, argv+1); + else if (strcmp(argv[1], "rmdup") == 0) ret = bam_rmdup(argc-1, argv+1); + else if (strcmp(argv[1], "markdup") == 0) ret = bam_markdup(argc-1, argv+1); + else if (strcmp(argv[1], "ampliconclip") == 0) ret = amplicon_clip_main(argc-1, argv+1); + else if (strcmp(argv[1], "flagstat") == 0 || + strcmp(argv[1], "flagstats") == 0) ret = bam_flagstat(argc-1, argv+1); + else if (strcmp(argv[1], "calmd") == 0) ret = bam_fillmd(argc-1, argv+1); + else if (strcmp(argv[1], "fillmd") == 0) ret = bam_fillmd(argc-1, argv+1); + else if (strcmp(argv[1], "reheader") == 0) ret = main_reheader(argc-1, argv+1); + else if (strcmp(argv[1], "cat") == 0) ret = main_cat(argc-1, argv+1); + else if (strcmp(argv[1], "targetcut") == 0) ret = main_cut_target(argc-1, argv+1); + else if (strcmp(argv[1], "phase") == 0) ret = main_phase(argc-1, argv+1); + else if (strcmp(argv[1], "depth") == 0) ret = main_depth(argc-1, argv+1); + else if (strcmp(argv[1], "coverage") == 0) ret = main_coverage(argc-1, argv+1); + else if (strcmp(argv[1], "bam2fq") == 0 || + strcmp(argv[1], "fastq") == 0 || + strcmp(argv[1], "fasta") == 0) ret = main_bam2fq(argc-1, argv+1); + else if (strcmp(argv[1], "pad2unpad") == 0) ret = main_pad2unpad(argc-1, argv+1); + else if (strcmp(argv[1], "depad") == 0) ret = main_pad2unpad(argc-1, argv+1); + else if (strcmp(argv[1], "bedcov") == 0) ret = main_bedcov(argc-1, argv+1); + else if (strcmp(argv[1], "bamshuf") == 0) ret = main_bamshuf(argc-1, argv+1); + else if (strcmp(argv[1], "collate") == 0) ret = main_bamshuf(argc-1, argv+1); + else if (strcmp(argv[1], "stat") == 0 || + strcmp(argv[1], "stats") == 0) ret = main_stats(argc-1, argv+1); + else if (strcmp(argv[1], "flag") == 0 || + strcmp(argv[1], "flags") == 0) ret = main_flags(argc-1, argv+1); + else if (strcmp(argv[1], "split") == 0) ret = main_split(argc-1, argv+1); + else if (strcmp(argv[1], "quickcheck") == 0) ret = main_quickcheck(argc-1, argv+1); + else if (strcmp(argv[1], "addreplacerg") == 0) ret = main_addreplacerg(argc-1, argv+1); + else if (strcmp(argv[1], "pileup") == 0) { + fprintf(stderr, "[main] The `pileup' command has been removed. Please use `mpileup' instead.\n"); + return 1; + } + else if (strcmp(argv[1], "tview") == 0) ret = bam_tview_main(argc-1, argv+1); + else if (strcmp(argv[1], "ampliconstats") == 0) ret = main_ampliconstats(argc-1, argv+1); + else if (strcmp(argv[1], "samples") == 0) ret = main_samples(argc-1, argv+1); + else if (strcmp(argv[1], "consensus") == 0) ret = main_consensus(argc-1, argv+1); + else if (strcmp(argv[1], "reference") == 0) ret = main_reference(argc-1, argv+1); + else if (strcmp(argv[1], "version") == 0 || \ + strcmp(argv[1], "--version") == 0) + long_version(); + else if (strcmp(argv[1], "--version-only") == 0) { + printf("%s+htslib-%s\n", samtools_version(), hts_version()); + } + else { + fprintf(stderr, "[main] unrecognized command '%s'\n", argv[1]); + return 1; + } + return ret; +} diff --git a/samtools/bamtk.c.pysam.c b/samtools/bamtk.c.pysam.c new file mode 100644 index 0000000..b798658 --- /dev/null +++ b/samtools/bamtk.c.pysam.c @@ -0,0 +1,304 @@ +#include "samtools.pysam.h" + +/* bamtk.c -- main samtools command front-end. + + Copyright (C) 2008-2022 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include + +#include "htslib/hts.h" +#include "htslib/hfile.h" +#include "samtools.h" +#include "version.h" +#include "samtools_config_vars.h" + +int bam_taf2baf(int argc, char *argv[]); +int bam_mpileup(int argc, char *argv[]); +int bam_merge(int argc, char *argv[]); +int bam_index(int argc, char *argv[]); +int bam_sort(int argc, char *argv[]); +int bam_tview_main(int argc, char *argv[]); +int bam_mating(int argc, char *argv[]); +int bam_rmdup(int argc, char *argv[]); +int bam_flagstat(int argc, char *argv[]); +int bam_fillmd(int argc, char *argv[]); +int bam_idxstats(int argc, char *argv[]); +int bam_markdup(int argc, char *argv[]); +int main_samview(int argc, char *argv[]); +int main_head(int argc, char *argv[]); +int main_reheader(int argc, char *argv[]); +int main_cut_target(int argc, char *argv[]); +int main_phase(int argc, char *argv[]); +int main_cat(int argc, char *argv[]); +int main_depth(int argc, char *argv[]); +int main_coverage(int argc, char *argv[]); +int main_bam2fq(int argc, char *argv[]); +int main_pad2unpad(int argc, char *argv[]); +int main_bedcov(int argc, char *argv[]); +int main_bamshuf(int argc, char *argv[]); +int main_stats(int argc, char *argv[]); +int main_flags(int argc, char *argv[]); +int main_split(int argc, char *argv[]); +int main_quickcheck(int argc, char *argv[]); +int main_addreplacerg(int argc, char *argv[]); +int faidx_main(int argc, char *argv[]); +int dict_main(int argc, char *argv[]); +int fqidx_main(int argc, char *argv[]); +int amplicon_clip_main(int argc, char *argv[]); +int main_ampliconstats(int argc, char *argv[]); +int main_import(int argc, char *argv[]); +int main_samples(int argc, char *argv[]); +int main_consensus(int argc, char *argv[]); +int main_reference(int argc, char *argv[]); + +const char *samtools_version() +{ + return SAMTOOLS_VERSION; +} + +// These come out of the config.h file built by autoconf or Makefile +const char *samtools_feature_string(void) { + const char *fmt = + +#ifdef PACKAGE_URL + "build=configure " +#else + "build=Makefile " +#endif + +#ifdef HAVE_CURSES + "curses=yes " +#else + "curses=no " +#endif + ; + + return fmt; +} + +static void long_version(void) { + fprintf(samtools_stdout, "samtools %s\n" + "Using htslib %s\n" + "Copyright (C) 2022 Genome Research Ltd.\n", + samtools_version(), hts_version()); + + fprintf(samtools_stdout, "\nSamtools compilation details:\n"); + fprintf(samtools_stdout, " Features: %s\n", samtools_feature_string()); + fprintf(samtools_stdout, " CC: %s\n", SAMTOOLS_CC); + fprintf(samtools_stdout, " CPPFLAGS: %s\n", SAMTOOLS_CPPFLAGS); + fprintf(samtools_stdout, " CFLAGS: %s\n", SAMTOOLS_CFLAGS); + fprintf(samtools_stdout, " LDFLAGS: %s\n", SAMTOOLS_LDFLAGS); + fprintf(samtools_stdout, " HTSDIR: %s\n", SAMTOOLS_HTSDIR); + fprintf(samtools_stdout, " LIBS: %s\n", SAMTOOLS_LIBS); + fprintf(samtools_stdout, " CURSES_LIB: %s\n", SAMTOOLS_CURSES_LIB); + + fprintf(samtools_stdout, "\nHTSlib compilation details:\n"); + fprintf(samtools_stdout, " Features: %s\n", hts_feature_string()); + fprintf(samtools_stdout, " CC: %s\n", hts_test_feature(HTS_FEATURE_CC)); + fprintf(samtools_stdout, " CPPFLAGS: %s\n", hts_test_feature(HTS_FEATURE_CPPFLAGS)); + fprintf(samtools_stdout, " CFLAGS: %s\n", hts_test_feature(HTS_FEATURE_CFLAGS)); + fprintf(samtools_stdout, " LDFLAGS: %s\n", hts_test_feature(HTS_FEATURE_LDFLAGS)); + + // Plugins and schemes + fprintf(samtools_stdout, "\nHTSlib URL scheme handlers present:\n"); + const char *plugins[100]; + int np = 100, i, j; + + if (hfile_list_plugins(plugins, &np) < 0) + return; + + for (i = 0; i < np; i++) { + const char *sc_list[100]; + int nschemes = 100; + if (hfile_list_schemes(plugins[i], sc_list, &nschemes) < 0) + return; + + fprintf(samtools_stdout, " %s:\t", plugins[i]); + for (j = 0; j < nschemes; j++) + fprintf(samtools_stdout, " %s%c", sc_list[j], ",\n"[j+1==nschemes]); + } +} + +static void usage(FILE *fp) +{ + /* Please improve the grouping */ + + fprintf(fp, +"\n" +"Program: samtools (Tools for alignments in the SAM format)\n" +"Version: %s (using htslib %s)\n\n", samtools_version(), hts_version()); + fprintf(fp, +"Usage: samtools [options]\n" +"\n" +"Commands:\n" +" -- Indexing\n" +" dict create a sequence dictionary file\n" +" faidx index/extract FASTA\n" +" fqidx index/extract FASTQ\n" +" index index alignment\n" +"\n" +" -- Editing\n" +" calmd recalculate MD/NM tags and '=' bases\n" +" fixmate fix mate information\n" +" reheader replace BAM header\n" +" targetcut cut fosmid regions (for fosmid pool only)\n" +" addreplacerg adds or replaces RG tags\n" +" markdup mark duplicates\n" +" ampliconclip clip oligos from the end of reads\n" +"\n" +" -- File operations\n" +" collate shuffle and group alignments by name\n" +" cat concatenate BAMs\n" +" consensus produce a consensus Pileup/FASTA/FASTQ\n" +" merge merge sorted alignments\n" +" mpileup multi-way pileup\n" +" sort sort alignment file\n" +" split splits a file by read group\n" +" quickcheck quickly check if SAM/BAM/CRAM file appears intact\n" +" fastq converts a BAM to a FASTQ\n" +" fasta converts a BAM to a FASTA\n" +" import Converts FASTA or FASTQ files to SAM/BAM/CRAM\n" +" reference Generates a reference from aligned data\n" +"\n" +" -- Statistics\n" +" bedcov read depth per BED region\n" +" coverage alignment depth and percent coverage\n" +" depth compute the depth\n" +" flagstat simple stats\n" +" idxstats BAM index stats\n" +" phase phase heterozygotes\n" +" stats generate stats (former bamcheck)\n" +" ampliconstats generate amplicon specific stats\n" +"\n" +" -- Viewing\n" +" flags explain BAM flags\n" +" head header viewer\n" +" tview text alignment viewer\n" +" view SAM<->BAM<->CRAM conversion\n" +" depad convert padded BAM to unpadded BAM\n" +" samples list the samples in a set of SAM/BAM/CRAM files\n" +"\n" +" -- Misc\n" +" help [cmd] display this help message or help for [cmd]\n" +" version detailed version information\n" +"\n"); +} + +// This is a tricky one, but on Windows the filename wildcard expansion is done by +// the application and not by the shell, as traditionally it never had a "shell". +// Even now, DOS and Powershell do not do this expansion (but bash does). +// +// This means that Mingw/Msys implements code before main() that takes e.g. "*" and +// expands it up to a list of matching filenames. This in turn breaks things like +// specifying "*" as a region (all the unmapped reads). We take a hard line here - +// filename expansion is the task of the shell, not our application! +#ifdef _WIN32 +int _CRT_glob = 0; +#endif + +int samtools_main(int argc, char *argv[]) +{ +#ifdef _WIN32 + setmode(fileno(samtools_stdout), O_BINARY); + setmode(fileno(stdin), O_BINARY); +#endif + if (argc < 2) { usage(samtools_stderr); return 1; } + + if (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "--help") == 0) { + if (argc == 2) { usage(samtools_stdout); return 0; } + + // Otherwise change "samtools help COMMAND [...]" to "samtools COMMAND"; + // main_xyz() functions by convention display the subcommand's usage + // when invoked without any arguments. + argv++; + argc = 2; + } + + int ret = 0; + if (strcmp(argv[1], "view") == 0) ret = main_samview(argc-1, argv+1); + else if (strcmp(argv[1], "import") == 0) ret = main_import(argc-1, argv+1); + else if (strcmp(argv[1], "mpileup") == 0) ret = bam_mpileup(argc-1, argv+1); + else if (strcmp(argv[1], "merge") == 0) ret = bam_merge(argc-1, argv+1); + else if (strcmp(argv[1], "sort") == 0) ret = bam_sort(argc-1, argv+1); + else if (strcmp(argv[1], "index") == 0) ret = bam_index(argc-1, argv+1); + else if (strcmp(argv[1], "idxstat") == 0 || + strcmp(argv[1], "idxstats") == 0) ret = bam_idxstats(argc-1, argv+1); + else if (strcmp(argv[1], "faidx") == 0) ret = faidx_main(argc-1, argv+1); + else if (strcmp(argv[1], "fqidx") == 0) ret = fqidx_main(argc-1, argv+1); + else if (strcmp(argv[1], "dict") == 0) ret = dict_main(argc-1, argv+1); + else if (strcmp(argv[1], "head") == 0) ret = main_head(argc-1, argv+1); + else if (strcmp(argv[1], "fixmate") == 0) ret = bam_mating(argc-1, argv+1); + else if (strcmp(argv[1], "rmdup") == 0) ret = bam_rmdup(argc-1, argv+1); + else if (strcmp(argv[1], "markdup") == 0) ret = bam_markdup(argc-1, argv+1); + else if (strcmp(argv[1], "ampliconclip") == 0) ret = amplicon_clip_main(argc-1, argv+1); + else if (strcmp(argv[1], "flagstat") == 0 || + strcmp(argv[1], "flagstats") == 0) ret = bam_flagstat(argc-1, argv+1); + else if (strcmp(argv[1], "calmd") == 0) ret = bam_fillmd(argc-1, argv+1); + else if (strcmp(argv[1], "fillmd") == 0) ret = bam_fillmd(argc-1, argv+1); + else if (strcmp(argv[1], "reheader") == 0) ret = main_reheader(argc-1, argv+1); + else if (strcmp(argv[1], "cat") == 0) ret = main_cat(argc-1, argv+1); + else if (strcmp(argv[1], "targetcut") == 0) ret = main_cut_target(argc-1, argv+1); + else if (strcmp(argv[1], "phase") == 0) ret = main_phase(argc-1, argv+1); + else if (strcmp(argv[1], "depth") == 0) ret = main_depth(argc-1, argv+1); + else if (strcmp(argv[1], "coverage") == 0) ret = main_coverage(argc-1, argv+1); + else if (strcmp(argv[1], "bam2fq") == 0 || + strcmp(argv[1], "fastq") == 0 || + strcmp(argv[1], "fasta") == 0) ret = main_bam2fq(argc-1, argv+1); + else if (strcmp(argv[1], "pad2unpad") == 0) ret = main_pad2unpad(argc-1, argv+1); + else if (strcmp(argv[1], "depad") == 0) ret = main_pad2unpad(argc-1, argv+1); + else if (strcmp(argv[1], "bedcov") == 0) ret = main_bedcov(argc-1, argv+1); + else if (strcmp(argv[1], "bamshuf") == 0) ret = main_bamshuf(argc-1, argv+1); + else if (strcmp(argv[1], "collate") == 0) ret = main_bamshuf(argc-1, argv+1); + else if (strcmp(argv[1], "stat") == 0 || + strcmp(argv[1], "stats") == 0) ret = main_stats(argc-1, argv+1); + else if (strcmp(argv[1], "flag") == 0 || + strcmp(argv[1], "flags") == 0) ret = main_flags(argc-1, argv+1); + else if (strcmp(argv[1], "split") == 0) ret = main_split(argc-1, argv+1); + else if (strcmp(argv[1], "quickcheck") == 0) ret = main_quickcheck(argc-1, argv+1); + else if (strcmp(argv[1], "addreplacerg") == 0) ret = main_addreplacerg(argc-1, argv+1); + else if (strcmp(argv[1], "pileup") == 0) { + fprintf(samtools_stderr, "[main] The `pileup' command has been removed. Please use `mpileup' instead.\n"); + return 1; + } + //else if (strcmp(argv[1], "tview") == 0) ret = bam_tview_main(argc-1, argv+1); + else if (strcmp(argv[1], "ampliconstats") == 0) ret = main_ampliconstats(argc-1, argv+1); + else if (strcmp(argv[1], "samples") == 0) ret = main_samples(argc-1, argv+1); + else if (strcmp(argv[1], "consensus") == 0) ret = main_consensus(argc-1, argv+1); + else if (strcmp(argv[1], "reference") == 0) ret = main_reference(argc-1, argv+1); + else if (strcmp(argv[1], "version") == 0 || \ + strcmp(argv[1], "--version") == 0) + long_version(); + else if (strcmp(argv[1], "--version-only") == 0) { + fprintf(samtools_stdout, "%s+htslib-%s\n", samtools_version(), hts_version()); + } + else { + fprintf(samtools_stderr, "[main] unrecognized command '%s'\n", argv[1]); + return 1; + } + return ret; +} diff --git a/samtools/bedcov.c b/samtools/bedcov.c new file mode 100644 index 0000000..1bd46a0 --- /dev/null +++ b/samtools/bedcov.c @@ -0,0 +1,298 @@ +/* bedcov.c -- bedcov subcommand. + + Copyright (C) 2012 Broad Institute. + Copyright (C) 2013-2014, 2018-2022 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include "htslib/kstring.h" +#include "htslib/sam.h" +#include "htslib/thread_pool.h" +#include "samtools.h" +#include "sam_opts.h" + +#include "htslib/kseq.h" +KSTREAM_INIT(gzFile, gzread, 16384) + +#define DEFAULT_DEPTH 64000 + +typedef struct { + htsFile *fp; + sam_hdr_t *header; + hts_itr_t *iter; + int min_mapQ; + uint32_t flags; // read filtering flags + int64_t rcnt; +} aux_t; + +static int read_bam(void *data, bam1_t *b) +{ + aux_t *aux = (aux_t*)data; // data in fact is a pointer to an auxiliary structure + int ret; + while (1) + { + ret = aux->iter? sam_itr_next(aux->fp, aux->iter, b) : sam_read1(aux->fp, aux->header, b); + if ( ret<0 ) break; + if ( b->core.flag & aux->flags ) continue; + if ( (int)b->core.qual < aux->min_mapQ ) continue; + break; + } + return ret; +} + +static int incr_rcnt(void *data, const bam1_t *b, bam_pileup_cd *cd) { + aux_t *aux = (aux_t *)data; + aux->rcnt++; + return 0; +} + +int main_bedcov(int argc, char *argv[]) +{ + gzFile fp; + kstring_t str; + kstream_t *ks; + hts_idx_t **idx; + aux_t **aux; + int *n_plp, dret, i, j, m, n, c, ret, status = 0, min_mapQ = 0; + int skip_DN = 0, do_rcount = 0; + int64_t *cnt, *pcov = NULL; + const bam_pileup1_t **plp; + int usage = 0, has_index_file = 0; + uint32_t flags = (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP); + int tflags = 0, min_depth = -1; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + {"min-MQ", required_argument, NULL, 'Q'}, + {"min-mq", required_argument, NULL, 'Q'}, + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '-'), + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "Q:Xg:G:jd:c", lopts, NULL)) >= 0) { + switch (c) { + case 'Q': min_mapQ = atoi(optarg); break; + case 'X': has_index_file = 1; break; + case 'c': do_rcount = 1; break; + case 'g': + tflags = bam_str2flag(optarg); + if (tflags < 0 || tflags > ((BAM_FSUPPLEMENTARY << 1) - 1)) { + print_error("bedcov", "Flag value \"%s\" is not supported", optarg); + return 1; + } + flags &= ~tflags; + break; + case 'G': + tflags = bam_str2flag(optarg); + if (tflags < 0 || tflags > ((BAM_FSUPPLEMENTARY << 1) - 1)) { + print_error("bedcov", "Flag value \"%s\" is not supported", optarg); + return 1; + } + flags |= tflags; + break; + case 'j': skip_DN = 1; break; + case 'd': min_depth = atoi(optarg); break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage = 1; break; + } + if (usage) break; + } + if (usage || optind + 2 > argc) { + fprintf(stderr, "Usage: samtools bedcov [options] [...]\n\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -Q, --min-MQ mapping quality threshold [0]\n"); + fprintf(stderr, " -X use customized index files\n"); + fprintf(stderr, " -g remove the specified flags from the set used to filter out reads\n"); + fprintf(stderr, " -G add the specified flags to the set used to filter out reads\n" + " The default set is UNMAP,SECONDARY,QCFAIL,DUP or 0x704\n"); + fprintf(stderr, " -j do not include deletions (D) and ref skips (N) in bedcov computation\n"); + fprintf(stderr, " -d depth threshold. Number of reference bases with coverage above and" + " including this value will be displayed in a separate column\n"); + fprintf(stderr, " -c add an additional column showing read count\n"); + sam_global_opt_help(stderr, "-.--.--."); + return 1; + } + if (has_index_file) { + if ((argc - optind - 1) % 2 != 0) { // Calculate # of input BAM files + fprintf(stderr, "ERROR: odd number of filenames detected! Each BAM file should have an index file\n"); + return 1; + } + n = (argc - optind - 1) / 2; + } else { + n = argc - optind - 1; + } + + memset(&str, 0, sizeof(kstring_t)); + aux = calloc(n, sizeof(aux_t*)); + idx = calloc(n, sizeof(hts_idx_t*)); + for (i = 0; i < n; ++i) { + aux[i] = calloc(1, sizeof(aux_t)); + aux[i]->min_mapQ = min_mapQ; + aux[i]->fp = sam_open_format(argv[i+optind+1], "r", &ga.in); + if (aux[i]->fp) { + // If index filename has not been specfied, look in BAM folder + if (has_index_file) { + idx[i] = sam_index_load2(aux[i]->fp, argv[i+optind+1], argv[i+optind+n+1]); + } else { + idx[i] = sam_index_load(aux[i]->fp, argv[i+optind+1]); + } + } + if (aux[i]->fp == 0 || idx[i] == 0) { + fprintf(stderr, "ERROR: fail to open index BAM file '%s'\n", argv[i+optind+1]); + return 2; + } + // TODO bgzf_set_cache_size(aux[i]->fp, 20); + aux[i]->header = sam_hdr_read(aux[i]->fp); + if (aux[i]->header == NULL) { + fprintf(stderr, "ERROR: failed to read header for '%s'\n", + argv[i+optind+1]); + return 2; + } + aux[i]->flags = flags; + } + cnt = calloc(n, sizeof(*cnt)); + + if (min_depth >= 0) pcov = calloc(n, sizeof(*pcov)); + if (!cnt || (min_depth >= 0 && !pcov)) { + print_error_errno("bedcov", "failed to allocate memory"); + return 2; + } + + fp = gzopen(argv[optind], "rb"); + if (fp == NULL) { + print_error_errno("bedcov", "can't open BED file '%s'", argv[optind]); + return 2; + } + ks = ks_init(fp); + n_plp = calloc(n, sizeof(int)); + plp = calloc(n, sizeof(bam_pileup1_t*)); + while (ks_getuntil(ks, KS_SEP_LINE, &str, &dret) >= 0) { + char *p, *q; + int tid, pos, num = 0; + int64_t beg = 0, end = 0; + bam_mplp_t mplp; + + if (str.l == 0 || *str.s == '#') continue; /* empty or comment line */ + /* Track and browser lines. Also look for a trailing *space* in + case someone has badly-chosen a chromosome name (it would + be followed by a tab in that case). */ + if (strncmp(str.s, "track ", 6) == 0) continue; + if (strncmp(str.s, "browser ", 8) == 0) continue; + for (p = q = str.s; *p && !isspace(*p); ++p); + if (*p == 0) goto bed_error; + char c = *p; + *p = 0; tid = bam_name2id(aux[0]->header, q); *p = c; + if (tid < 0) goto bed_error; + num = sscanf(p + 1, "%"SCNd64" %"SCNd64, &beg, &end); + if (num < 2 || end < beg) goto bed_error; + + for (i = 0; i < n; ++i) { + if (aux[i]->iter) hts_itr_destroy(aux[i]->iter); + aux[i]->iter = sam_itr_queryi(idx[i], tid, beg, end); + aux[i]->rcnt = 0; + } + + mplp = bam_mplp_init(n, read_bam, (void**)aux); + if (min_depth > DEFAULT_DEPTH) + bam_mplp_set_maxcnt(mplp, min_depth); + else + bam_mplp_set_maxcnt(mplp, DEFAULT_DEPTH); + + memset(cnt, 0, sizeof(*cnt) * n); + if (min_depth >= 0) memset(pcov, 0, sizeof(*pcov) * n); + + if (do_rcount) + bam_mplp_constructor(mplp, incr_rcnt); + + while ((ret = bam_mplp_auto(mplp, &tid, &pos, n_plp, plp)) > 0) + if (pos >= beg && pos < end) { + for (i = 0; i < n; ++i) { + m = 0; + if (skip_DN || min_depth >= 0) { + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *pi = plp[i] + j; + if (pi->is_del || pi->is_refskip) ++m; + } + } + int pd = n_plp[i] - m; + cnt[i] += pd; + if (min_depth >= 0 && pd >= min_depth) pcov[i]++; + } + } + + if (ret < 0) { + print_error("bedcov", "error reading from input file"); + status = 2; + bam_mplp_destroy(mplp); + break; + } + + for (i = 0; i < n; ++i) { + kputc('\t', &str); + kputl(cnt[i], &str); + } + if (min_depth >= 0) { + for (i = 0; i < n; ++i) { + kputc('\t', &str); + kputl(pcov[i], &str); + } + } + if (do_rcount) { + for (i = 0; i < n; ++i) { + kputc('\t', &str); + kputl(aux[i]->rcnt, &str); + } + } + puts(str.s); + bam_mplp_destroy(mplp); + continue; + +bed_error: + fprintf(stderr, "Errors in BED line '%s'\n", str.s); + status = 2; + } + free(n_plp); free(plp); + ks_destroy(ks); + gzclose(fp); + + free(cnt); + free(pcov); + for (i = 0; i < n; ++i) { + if (aux[i]->iter) hts_itr_destroy(aux[i]->iter); + hts_idx_destroy(idx[i]); + sam_hdr_destroy(aux[i]->header); + sam_close(aux[i]->fp); + free(aux[i]); + } + free(aux); free(idx); + free(str.s); + sam_global_args_free(&ga); + return status; +} diff --git a/samtools/bedcov.c.pysam.c b/samtools/bedcov.c.pysam.c new file mode 100644 index 0000000..f259cb1 --- /dev/null +++ b/samtools/bedcov.c.pysam.c @@ -0,0 +1,300 @@ +#include "samtools.pysam.h" + +/* bedcov.c -- bedcov subcommand. + + Copyright (C) 2012 Broad Institute. + Copyright (C) 2013-2014, 2018-2022 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include "htslib/kstring.h" +#include "htslib/sam.h" +#include "htslib/thread_pool.h" +#include "samtools.h" +#include "sam_opts.h" + +#include "htslib/kseq.h" +KSTREAM_INIT(gzFile, gzread, 16384) + +#define DEFAULT_DEPTH 64000 + +typedef struct { + htsFile *fp; + sam_hdr_t *header; + hts_itr_t *iter; + int min_mapQ; + uint32_t flags; // read filtering flags + int64_t rcnt; +} aux_t; + +static int read_bam(void *data, bam1_t *b) +{ + aux_t *aux = (aux_t*)data; // data in fact is a pointer to an auxiliary structure + int ret; + while (1) + { + ret = aux->iter? sam_itr_next(aux->fp, aux->iter, b) : sam_read1(aux->fp, aux->header, b); + if ( ret<0 ) break; + if ( b->core.flag & aux->flags ) continue; + if ( (int)b->core.qual < aux->min_mapQ ) continue; + break; + } + return ret; +} + +static int incr_rcnt(void *data, const bam1_t *b, bam_pileup_cd *cd) { + aux_t *aux = (aux_t *)data; + aux->rcnt++; + return 0; +} + +int main_bedcov(int argc, char *argv[]) +{ + gzFile fp; + kstring_t str; + kstream_t *ks; + hts_idx_t **idx; + aux_t **aux; + int *n_plp, dret, i, j, m, n, c, ret, status = 0, min_mapQ = 0; + int skip_DN = 0, do_rcount = 0; + int64_t *cnt, *pcov = NULL; + const bam_pileup1_t **plp; + int usage = 0, has_index_file = 0; + uint32_t flags = (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP); + int tflags = 0, min_depth = -1; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + {"min-MQ", required_argument, NULL, 'Q'}, + {"min-mq", required_argument, NULL, 'Q'}, + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '-'), + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "Q:Xg:G:jd:c", lopts, NULL)) >= 0) { + switch (c) { + case 'Q': min_mapQ = atoi(optarg); break; + case 'X': has_index_file = 1; break; + case 'c': do_rcount = 1; break; + case 'g': + tflags = bam_str2flag(optarg); + if (tflags < 0 || tflags > ((BAM_FSUPPLEMENTARY << 1) - 1)) { + print_error("bedcov", "Flag value \"%s\" is not supported", optarg); + return 1; + } + flags &= ~tflags; + break; + case 'G': + tflags = bam_str2flag(optarg); + if (tflags < 0 || tflags > ((BAM_FSUPPLEMENTARY << 1) - 1)) { + print_error("bedcov", "Flag value \"%s\" is not supported", optarg); + return 1; + } + flags |= tflags; + break; + case 'j': skip_DN = 1; break; + case 'd': min_depth = atoi(optarg); break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage = 1; break; + } + if (usage) break; + } + if (usage || optind + 2 > argc) { + fprintf(samtools_stderr, "Usage: samtools bedcov [options] [...]\n\n"); + fprintf(samtools_stderr, "Options:\n"); + fprintf(samtools_stderr, " -Q, --min-MQ mapping quality threshold [0]\n"); + fprintf(samtools_stderr, " -X use customized index files\n"); + fprintf(samtools_stderr, " -g remove the specified flags from the set used to filter out reads\n"); + fprintf(samtools_stderr, " -G add the specified flags to the set used to filter out reads\n" + " The default set is UNMAP,SECONDARY,QCFAIL,DUP or 0x704\n"); + fprintf(samtools_stderr, " -j do not include deletions (D) and ref skips (N) in bedcov computation\n"); + fprintf(samtools_stderr, " -d depth threshold. Number of reference bases with coverage above and" + " including this value will be displayed in a separate column\n"); + fprintf(samtools_stderr, " -c add an additional column showing read count\n"); + sam_global_opt_help(samtools_stderr, "-.--.--."); + return 1; + } + if (has_index_file) { + if ((argc - optind - 1) % 2 != 0) { // Calculate # of input BAM files + fprintf(samtools_stderr, "ERROR: odd number of filenames detected! Each BAM file should have an index file\n"); + return 1; + } + n = (argc - optind - 1) / 2; + } else { + n = argc - optind - 1; + } + + memset(&str, 0, sizeof(kstring_t)); + aux = calloc(n, sizeof(aux_t*)); + idx = calloc(n, sizeof(hts_idx_t*)); + for (i = 0; i < n; ++i) { + aux[i] = calloc(1, sizeof(aux_t)); + aux[i]->min_mapQ = min_mapQ; + aux[i]->fp = sam_open_format(argv[i+optind+1], "r", &ga.in); + if (aux[i]->fp) { + // If index filename has not been specfied, look in BAM folder + if (has_index_file) { + idx[i] = sam_index_load2(aux[i]->fp, argv[i+optind+1], argv[i+optind+n+1]); + } else { + idx[i] = sam_index_load(aux[i]->fp, argv[i+optind+1]); + } + } + if (aux[i]->fp == 0 || idx[i] == 0) { + fprintf(samtools_stderr, "ERROR: fail to open index BAM file '%s'\n", argv[i+optind+1]); + return 2; + } + // TODO bgzf_set_cache_size(aux[i]->fp, 20); + aux[i]->header = sam_hdr_read(aux[i]->fp); + if (aux[i]->header == NULL) { + fprintf(samtools_stderr, "ERROR: failed to read header for '%s'\n", + argv[i+optind+1]); + return 2; + } + aux[i]->flags = flags; + } + cnt = calloc(n, sizeof(*cnt)); + + if (min_depth >= 0) pcov = calloc(n, sizeof(*pcov)); + if (!cnt || (min_depth >= 0 && !pcov)) { + print_error_errno("bedcov", "failed to allocate memory"); + return 2; + } + + fp = gzopen(argv[optind], "rb"); + if (fp == NULL) { + print_error_errno("bedcov", "can't open BED file '%s'", argv[optind]); + return 2; + } + ks = ks_init(fp); + n_plp = calloc(n, sizeof(int)); + plp = calloc(n, sizeof(bam_pileup1_t*)); + while (ks_getuntil(ks, KS_SEP_LINE, &str, &dret) >= 0) { + char *p, *q; + int tid, pos, num = 0; + int64_t beg = 0, end = 0; + bam_mplp_t mplp; + + if (str.l == 0 || *str.s == '#') continue; /* empty or comment line */ + /* Track and browser lines. Also look for a trailing *space* in + case someone has badly-chosen a chromosome name (it would + be followed by a tab in that case). */ + if (strncmp(str.s, "track ", 6) == 0) continue; + if (strncmp(str.s, "browser ", 8) == 0) continue; + for (p = q = str.s; *p && !isspace(*p); ++p); + if (*p == 0) goto bed_error; + char c = *p; + *p = 0; tid = bam_name2id(aux[0]->header, q); *p = c; + if (tid < 0) goto bed_error; + num = sscanf(p + 1, "%"SCNd64" %"SCNd64, &beg, &end); + if (num < 2 || end < beg) goto bed_error; + + for (i = 0; i < n; ++i) { + if (aux[i]->iter) hts_itr_destroy(aux[i]->iter); + aux[i]->iter = sam_itr_queryi(idx[i], tid, beg, end); + aux[i]->rcnt = 0; + } + + mplp = bam_mplp_init(n, read_bam, (void**)aux); + if (min_depth > DEFAULT_DEPTH) + bam_mplp_set_maxcnt(mplp, min_depth); + else + bam_mplp_set_maxcnt(mplp, DEFAULT_DEPTH); + + memset(cnt, 0, sizeof(*cnt) * n); + if (min_depth >= 0) memset(pcov, 0, sizeof(*pcov) * n); + + if (do_rcount) + bam_mplp_constructor(mplp, incr_rcnt); + + while ((ret = bam_mplp_auto(mplp, &tid, &pos, n_plp, plp)) > 0) + if (pos >= beg && pos < end) { + for (i = 0; i < n; ++i) { + m = 0; + if (skip_DN || min_depth >= 0) { + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *pi = plp[i] + j; + if (pi->is_del || pi->is_refskip) ++m; + } + } + int pd = n_plp[i] - m; + cnt[i] += pd; + if (min_depth >= 0 && pd >= min_depth) pcov[i]++; + } + } + + if (ret < 0) { + print_error("bedcov", "error reading from input file"); + status = 2; + bam_mplp_destroy(mplp); + break; + } + + for (i = 0; i < n; ++i) { + kputc('\t', &str); + kputl(cnt[i], &str); + } + if (min_depth >= 0) { + for (i = 0; i < n; ++i) { + kputc('\t', &str); + kputl(pcov[i], &str); + } + } + if (do_rcount) { + for (i = 0; i < n; ++i) { + kputc('\t', &str); + kputl(aux[i]->rcnt, &str); + } + } + samtools_puts(str.s); + bam_mplp_destroy(mplp); + continue; + +bed_error: + fprintf(samtools_stderr, "Errors in BED line '%s'\n", str.s); + status = 2; + } + free(n_plp); free(plp); + ks_destroy(ks); + gzclose(fp); + + free(cnt); + free(pcov); + for (i = 0; i < n; ++i) { + if (aux[i]->iter) hts_itr_destroy(aux[i]->iter); + hts_idx_destroy(idx[i]); + sam_hdr_destroy(aux[i]->header); + sam_close(aux[i]->fp); + free(aux[i]); + } + free(aux); free(idx); + free(str.s); + sam_global_args_free(&ga); + return status; +} diff --git a/samtools/bedidx.c b/samtools/bedidx.c new file mode 100644 index 0000000..6b22d4e --- /dev/null +++ b/samtools/bedidx.c @@ -0,0 +1,637 @@ +/* bedidx.c -- BED file indexing. + + Copyright (C) 2011 Broad Institute. + Copyright (C) 2014, 2017-2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include "bedidx.h" + +#include "htslib/ksort.h" + +#include "htslib/kseq.h" +KSTREAM_INIT(gzFile, gzread, 8192) + +static inline int lt_pair_pos(hts_pair_pos_t a, hts_pair_pos_t b) { + if (a.beg == b.beg) return a.end < b.end; + return a.beg < b.beg; +} +KSORT_INIT_STATIC(hts_pair_pos_t, hts_pair_pos_t, lt_pair_pos) + +/*! @typedef + * @abstract bed_reglist_t - value type of the BED hash table + * This structure encodes the list of intervals (ranges) for the regions provided via BED file or + * command line arguments. + * @field *a pointer to the array of intervals. + * @field n actual number of elements contained by a + * @field m number of allocated elements to a (n <= m) + * @field *idx index array for computing the minimum offset + */ +typedef struct { + int n, m; + hts_pair_pos_t *a; + int *idx; + int filter; +} bed_reglist_t; + +#include "htslib/khash.h" +KHASH_MAP_INIT_STR(reg, bed_reglist_t) + +typedef kh_reg_t reghash_t; + +#if 0 +// Debug function +static void bed_print(void *reg_hash) { + reghash_t *h = (reghash_t *)reg_hash; + bed_reglist_t *p; + khint_t k; + int i; + const char *reg; + + if (!h) { + printf("Hash table is empty!\n"); + return; + } + for (k = kh_begin(h); k < kh_end(h); k++) { + if (kh_exist(h,k)) { + reg = kh_key(h,k); + printf("Region: '%s'\n", reg); + if ((p = &kh_val(h,k)) != NULL && p->n > 0) { + printf("Filter: %d\n", p->filter); + for (i=0; in; i++) { + printf("\tinterval[%d]: %"PRIhts_pos"-%"PRIhts_pos"\n", + i,p->a[i].beg,p->a[i].end); + } + } else { + printf("Region '%s' has no intervals!\n", reg); + } + } + } +} +#endif + +static int *bed_index_core(int n, hts_pair_pos_t *a) +{ + int i, j, l, *idx, *new_idx; + l = 0; idx = 0; + for (i = 0; i < n; ++i) { + hts_pos_t beg, end; + beg = a[i].beg >> LIDX_SHIFT; end = a[i].end >> LIDX_SHIFT; + if (l < end + 1) { + int old_l = l; + l = end + 1; + kroundup32(l); + new_idx = realloc(idx, l * sizeof(*idx)); + if (!new_idx) { + free(idx); + return NULL; + } + idx = new_idx; + + for (j = old_l; j < l; ++j) + idx[j] = -1; + } + + for (j = beg; j < end+1; ++j) + if (idx[j] < 0) + idx[j] = i; + } + return idx; +} + +static void bed_index(void *_h) +{ + reghash_t *h = (reghash_t*)_h; + khint_t k; + for (k = 0; k < kh_end(h); ++k) { + if (kh_exist(h, k)) { + bed_reglist_t *p = &kh_val(h, k); + if (p->idx) free(p->idx); + ks_introsort(hts_pair_pos_t, p->n, p->a); + p->idx = bed_index_core(p->n, p->a); + } + } +} + +static int bed_minoff(const bed_reglist_t *p, hts_pos_t beg, hts_pos_t end) { + int i, min_off=0; + + if (p && p->idx) { + min_off = (beg>>LIDX_SHIFT >= p->n)? p->idx[p->n-1] : p->idx[beg>>LIDX_SHIFT]; + if (min_off < 0) { // TODO: this block can be improved, but speed should not matter too much here + hts_pos_t n = beg>>LIDX_SHIFT; + if (n > p->n) + n = p->n; + for (i = n - 1; i >= 0; --i) + if (p->idx[i] >= 0) + break; + min_off = i >= 0? p->idx[i] : 0; + } + } + + return min_off; +} + +static int bed_overlap_core(const bed_reglist_t *p, hts_pos_t beg, hts_pos_t end) +{ + int i, min_off; + if (p->n == 0) return 0; + min_off = bed_minoff(p, beg, end); + + for (i = min_off; i < p->n; ++i) { + if (p->a[i].beg >= end) break; // out of range; no need to proceed + if (p->a[i].end > beg && p->a[i].beg < end) + return 1; // find the overlap; return + } + return 0; +} + +int bed_overlap(const void *_h, const char *chr, hts_pos_t beg, hts_pos_t end) +{ + const reghash_t *h = (const reghash_t*)_h; + khint_t k; + if (!h) return 0; + k = kh_get(reg, h, chr); + if (k == kh_end(h)) return 0; + return bed_overlap_core(&kh_val(h, k), beg, end); +} + +/** @brief Trim a sorted interval list, inside a region hash table, + * by removing completely contained intervals and merging adjacent or + * overlapping intervals. + * @param reg_hash the region hash table with interval lists as values + */ + +void bed_unify(void *reg_hash) { + + int i, j, new_n; + reghash_t *h; + bed_reglist_t *p; + + if (!reg_hash) + return; + + h = (reghash_t *)reg_hash; + + for (i = kh_begin(h); i < kh_end(h); i++) { + if (!kh_exist(h,i) || !(p = &kh_val(h,i)) || !(p->n)) + continue; + + for (new_n = 0, j = 1; j < p->n; j++) { + if (p->a[new_n].end < p->a[j].beg) { + p->a[++new_n] = p->a[j]; + } else { + if (p->a[new_n].end < p->a[j].end) + p->a[new_n].end = p->a[j].end; + } + } + + p->n = ++new_n; + } +} + +/* "BED" file reader, which actually reads two different formats. + + BED files contain between three and nine fields per line, of which + only the first three (reference, start, end) are of interest to us. + BED counts positions from base 0, and the end is the base after the + region of interest. While not properly documented in the specification, + it is also possible to have 'browser' and 'track' lines in BED files that + do not follow the standard format and should be ignored. Examination + of the BED file reading code in + http://genome-source.cse.ucsc.edu/gitweb/?p=kent.git shows that BED + files can also have comment lines starting with '#', leading whitespace + is stripped, and that fields are separated by one or more consecutive + whitespace characters. + + The alternative format was originally for reading positions in VCF + format. This expects two columns, which indicate the reference and + a position. The position corresponds to a single base, and unlike + BED counts from 1. + + Which format is in use is determined based on whether one or two + numbers can be decoded on the line. As this choice is made line-by-line + in this implementation, it is possible (but probably a bad idea) to mix + both formats in the same file. If trying to read a VCF file by this + method, it would be important to ensure that the third column (ID) does + not contain any entries that start with a digit, to avoid the line + erroneously being parsed as a BED file entry. + + The BED specification is at http://www.genome.ucsc.edu/FAQ/FAQformat.html + The VCF specification is at https://github.com/samtools/hts-specs + */ + +void *bed_read(const char *fn) +{ + reghash_t *h = kh_init(reg); + gzFile fp; + kstream_t *ks = NULL; + int dret; + unsigned int line = 0, save_errno; + kstring_t str = { 0, 0, NULL }; + + if (NULL == h) return NULL; + // read the list + fp = strcmp(fn, "-")? gzopen(fn, "r") : gzdopen(fileno(stdin), "r"); + if (fp == 0) return 0; + ks = ks_init(fp); + if (NULL == ks) goto fail; // In case ks_init ever gets error checking... + int ks_len; + while ((ks_len = ks_getuntil(ks, KS_SEP_LINE, &str, &dret)) >= 0) { // read a line + char *ref = str.s, *ref_end; + uint64_t beg = 0, end = 0; + int num = 0; + khint_t k; + bed_reglist_t *p; + + if (ks_len == 0) + continue; // skip blank lines + + line++; + while (*ref && isspace(*ref)) ref++; + if ('\0' == *ref) continue; // Skip blank lines + if ('#' == *ref) continue; // Skip BED file comments + ref_end = ref; // look for the end of the reference name + while (*ref_end && !isspace(*ref_end)) ref_end++; + if ('\0' != *ref_end) { + *ref_end = '\0'; // terminate ref and look for start, end + num = sscanf(ref_end + 1, "%"SCNu64" %"SCNu64, &beg, &end); + } + if (1 == num) { // VCF-style format + end = beg--; // Counts from 1 instead of 0 for BED files + } + if (num < 1 || end < beg) { + // These two are special lines that can occur in BED files. + // Check for them here instead of earlier in case someone really + // has called their reference "browser" or "track". + if (0 == strcmp(ref, "browser")) continue; + if (0 == strcmp(ref, "track")) continue; + if (num < 1) { + fprintf(stderr, + "[bed_read] Parse error reading \"%s\" at line %u\n", + fn, line); + } else { + fprintf(stderr, + "[bed_read] Parse error reading \"%s\" at line %u : " + "end (%"PRIu64") must not be less " + "than start (%"PRIu64")\n", + fn, line, end, beg); + } + errno = 0; // Prevent caller from printing misleading error messages + goto fail; + } + + // Put reg in the hash table if not already there + k = kh_get(reg, h, ref); + if (k == kh_end(h)) { // absent from the hash table + int ret; + char *s = strdup(ref); + if (NULL == s) goto fail; + k = kh_put(reg, h, s, &ret); + if (-1 == ret) { + free(s); + goto fail; + } + memset(&kh_val(h, k), 0, sizeof(bed_reglist_t)); + } + p = &kh_val(h, k); + + // Add begin,end to the list + if (p->n == p->m) { + p->m = p->m ? p->m<<1 : 4; + hts_pair_pos_t *new_a = realloc(p->a, p->m * sizeof(p->a[0])); + if (NULL == new_a) goto fail; + p->a = new_a; + } + p->a[p->n].beg = beg; + p->a[p->n++].end = end; + } + // FIXME: Need to check for errors in ks_getuntil. At the moment it + // doesn't look like it can return one. Possibly use gzgets instead? + + if (gzclose(fp) != Z_OK) { + fp = NULL; + goto fail; + } + ks_destroy(ks); + free(str.s); + bed_index(h); + //bed_unify(h); + return h; + fail: + save_errno = errno; + if (ks) ks_destroy(ks); + if (fp) gzclose(fp); + free(str.s); + bed_destroy(h); + errno = save_errno; + return NULL; +} + +void bed_destroy(void *_h) +{ + reghash_t *h; + khint_t k; + + if (!_h) + return; + + h = (reghash_t*)_h; + for (k = 0; k < kh_end(h); ++k) { + if (kh_exist(h, k)) { + free(kh_val(h, k).a); + free(kh_val(h, k).idx); + free((char*)kh_key(h, k)); + } + } + kh_destroy(reg, h); +} + +static void *bed_insert(void *reg_hash, char *reg, hts_pos_t beg, hts_pos_t end) { + + reghash_t *h; + khint_t k; + bed_reglist_t *p; + + if (!reg_hash) + return NULL; + + h = (reghash_t *)reg_hash; + + // Put reg in the hash table if not already there + k = kh_get(reg, h, reg); //looks strange, but only the second reg is the actual region name. + if (k == kh_end(h)) { // absent from the hash table + int ret; + char *s = strdup(reg); + if (NULL == s) goto fail; + k = kh_put(reg, h, s, &ret); + if (-1 == ret) { + free(s); + goto fail; + } + memset(&kh_val(h, k), 0, sizeof(bed_reglist_t)); + } + p = &kh_val(h, k); + + // Add beg and end to the list + if (p->n == p->m) { + p->m = p->m ? p->m<<1 : 4; + hts_pair_pos_t *new_a = realloc(p->a, p->m * sizeof(p->a[0])); + if (NULL == new_a) goto fail; + p->a = new_a; + } + p->a[p->n].beg = beg; + p->a[p->n++].end = end; + +fail: + return h; +} + +/* @brief Filter a region hash table (coming from the BED file) by another + * region hash table (coming from CLI), so that only intervals contained in + * both hash tables are kept. + * @param reg_hash the target region hash table + * @param tmp_hash the filter region hash table + * @return pointer to the filtered hash table + */ + +static void *bed_filter(void *reg_hash, void *tmp_hash) { + + reghash_t *h; + reghash_t *t; + bed_reglist_t *p, *q; + khint_t l, k; + hts_pair_pos_t *new_a; + int i, j, new_n, min_off; + const char *reg; + hts_pos_t beg, end; + + h = (reghash_t *)reg_hash; + t = (reghash_t *)tmp_hash; + if (!h) + return NULL; + if (!t) + return h; + + for (l = kh_begin(t); l < kh_end(t); l++) { + if (!kh_exist(t,l) || !(q = &kh_val(t,l)) || !(q->n)) + continue; + + reg = kh_key(t,l); + k = kh_get(reg, h, reg); //looks strange, but only the second reg is a proper argument. + if (k == kh_end(h) || !(p = &kh_val(h, k)) || !(p->n)) + continue; + + new_a = calloc(q->n + p->n, sizeof(new_a[0])); + if (!new_a) + return NULL; + new_n = 0; + + for (i = 0; i < q->n; i++) { + beg = q->a[i].beg; + end = q->a[i].end; + + min_off = bed_minoff(p, beg, end); + for (j = min_off; j < p->n; ++j) { + if (p->a[j].beg >= end) break; // out of range; no need to proceed + if (p->a[j].end > beg && p->a[j].beg < end) { + new_a[new_n].beg = MAX(p->a[j].beg, beg); + new_a[new_n++].end = MIN(p->a[j].end, end); + } + } + } + + if (new_n > 0) { + free(p->a); + p->a = new_a; + p->n = new_n; + p->m = new_n; + p->filter = FILTERED; + } else { + free(new_a); + p->filter = ALL; + } + } + + return h; +} + +void *bed_hash_regions(void *reg_hash, char **regs, int first, int last, int *op) { + + reghash_t *h = (reghash_t *)reg_hash; + reghash_t *t = NULL; + + int i; + char reg[1024]; + const char *q; + int beg, end; + + if (h) { + t = kh_init(reg); + if (!t) { + fprintf(stderr, "Error when creating the temporary region hash table!\n"); + return NULL; + } + } else { + h = kh_init(reg); + if (!h) { + fprintf(stderr, "Error when creating the region hash table!\n"); + return NULL; + } + *op = 1; + } + + for (i=first; i 1024) { + fprintf(stderr, "Region name '%s' is too long (bigger than %d).\n", regs[i], 1024); + continue; + } + strncpy(reg, regs[i], q - regs[i]); + reg[q - regs[i]] = 0; + } else { + // not parsable as a region, but possibly a sequence named "foo:a" + if (strlen(regs[i]) + 1 > 1024) { + fprintf(stderr, "Region name '%s' is too long (bigger than %d).\n", regs[i], 1024); + continue; + } + strcpy(reg, regs[i]); + beg = 0; end = INT_MAX; + } + + //if op==1 insert reg to the bed hash table + if (*op && !(bed_insert(h, reg, beg, end))) { + fprintf(stderr, "Error when inserting region='%s' in the bed hash table at address=%p!\n", regs[i], h); + } + //if op==0, first insert the regions in the temporary hash table, + //then filter the bed hash table using it + if (!(*op) && !(bed_insert(t, reg, beg, end))) { + fprintf(stderr, "Error when inserting region='%s' in the temporary hash table at address=%p!\n", regs[i], t); + } + } + + if (!(*op)) { + bed_index(t); + bed_unify(t); + h = bed_filter(h, t); + bed_destroy(t); + } + + if (h) { + bed_index(h); + bed_unify(h); + } + + return h; +} + +const char* bed_get(void *reg_hash, int i, int filter) { + + reghash_t *h; + bed_reglist_t *p; + + if (!reg_hash) + return NULL; + + h = (reghash_t *)reg_hash; + if (!kh_exist(h,i) || !(p = &kh_val(h,i)) || (p->filter < filter)) + return NULL; + + return kh_key(h, i); +} + +/** + * Create a region list from a the region hash table + * @param reg_hash The region hash table + * @param filter 0 - allow all regions, 1 - allow only selected regions + * @param n_reg Pointer to the returned region number + * @return The regions list as a hts_reglist_t + */ + +hts_reglist_t *bed_reglist(void *reg_hash, int filter, int *n_reg) { + + reghash_t *h; + bed_reglist_t *p; + khint_t i; + hts_reglist_t *reglist = NULL; + int count = 0; + int j; + + if (!reg_hash) + return NULL; + + h = (reghash_t *)reg_hash; + + for (i = kh_begin(h); i < kh_end(h); i++) { + if (!kh_exist(h,i) || !(p = &kh_val(h,i)) || (p->filter < filter)) + continue; + count++; + } + if (!count) + return NULL; + + reglist = (hts_reglist_t *)calloc(count, sizeof(hts_reglist_t)); + if (!reglist) + return NULL; + + *n_reg = count; + count = 0; + + for (i = kh_begin(h); i < kh_end(h) && count < *n_reg; i++) { + if (!kh_exist(h,i) || !(p = &kh_val(h,i)) || (p->filter < filter)) + continue; + + reglist[count].reg = kh_key(h,i); + reglist[count].intervals = (hts_pair32_t *)calloc(p->n, sizeof(hts_pair32_t)); + if(!(reglist[count].intervals)) { + hts_reglist_free(reglist, count); + return NULL; + } + reglist[count].count = p->n; + reglist[count].max_end = 0; + + for (j = 0; j < p->n; j++) { + reglist[count].intervals[j].beg = p->a[j].beg; + reglist[count].intervals[j].end = p->a[j].end; + + if (reglist[count].intervals[j].end > reglist[count].max_end) + reglist[count].max_end = reglist[count].intervals[j].end; + } + count++; + } + + return reglist; +} diff --git a/samtools/bedidx.c.pysam.c b/samtools/bedidx.c.pysam.c new file mode 100644 index 0000000..533b42a --- /dev/null +++ b/samtools/bedidx.c.pysam.c @@ -0,0 +1,639 @@ +#include "samtools.pysam.h" + +/* bedidx.c -- BED file indexing. + + Copyright (C) 2011 Broad Institute. + Copyright (C) 2014, 2017-2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include "bedidx.h" + +#include "htslib/ksort.h" + +#include "htslib/kseq.h" +KSTREAM_INIT(gzFile, gzread, 8192) + +static inline int lt_pair_pos(hts_pair_pos_t a, hts_pair_pos_t b) { + if (a.beg == b.beg) return a.end < b.end; + return a.beg < b.beg; +} +KSORT_INIT_STATIC(hts_pair_pos_t, hts_pair_pos_t, lt_pair_pos) + +/*! @typedef + * @abstract bed_reglist_t - value type of the BED hash table + * This structure encodes the list of intervals (ranges) for the regions provided via BED file or + * command line arguments. + * @field *a pointer to the array of intervals. + * @field n actual number of elements contained by a + * @field m number of allocated elements to a (n <= m) + * @field *idx index array for computing the minimum offset + */ +typedef struct { + int n, m; + hts_pair_pos_t *a; + int *idx; + int filter; +} bed_reglist_t; + +#include "htslib/khash.h" +KHASH_MAP_INIT_STR(reg, bed_reglist_t) + +typedef kh_reg_t reghash_t; + +#if 0 +// Debug function +static void bed_print(void *reg_hash) { + reghash_t *h = (reghash_t *)reg_hash; + bed_reglist_t *p; + khint_t k; + int i; + const char *reg; + + if (!h) { + fprintf(samtools_stdout, "Hash table is empty!\n"); + return; + } + for (k = kh_begin(h); k < kh_end(h); k++) { + if (kh_exist(h,k)) { + reg = kh_key(h,k); + fprintf(samtools_stdout, "Region: '%s'\n", reg); + if ((p = &kh_val(h,k)) != NULL && p->n > 0) { + fprintf(samtools_stdout, "Filter: %d\n", p->filter); + for (i=0; in; i++) { + fprintf(samtools_stdout, "\tinterval[%d]: %"PRIhts_pos"-%"PRIhts_pos"\n", + i,p->a[i].beg,p->a[i].end); + } + } else { + fprintf(samtools_stdout, "Region '%s' has no intervals!\n", reg); + } + } + } +} +#endif + +static int *bed_index_core(int n, hts_pair_pos_t *a) +{ + int i, j, l, *idx, *new_idx; + l = 0; idx = 0; + for (i = 0; i < n; ++i) { + hts_pos_t beg, end; + beg = a[i].beg >> LIDX_SHIFT; end = a[i].end >> LIDX_SHIFT; + if (l < end + 1) { + int old_l = l; + l = end + 1; + kroundup32(l); + new_idx = realloc(idx, l * sizeof(*idx)); + if (!new_idx) { + free(idx); + return NULL; + } + idx = new_idx; + + for (j = old_l; j < l; ++j) + idx[j] = -1; + } + + for (j = beg; j < end+1; ++j) + if (idx[j] < 0) + idx[j] = i; + } + return idx; +} + +static void bed_index(void *_h) +{ + reghash_t *h = (reghash_t*)_h; + khint_t k; + for (k = 0; k < kh_end(h); ++k) { + if (kh_exist(h, k)) { + bed_reglist_t *p = &kh_val(h, k); + if (p->idx) free(p->idx); + ks_introsort(hts_pair_pos_t, p->n, p->a); + p->idx = bed_index_core(p->n, p->a); + } + } +} + +static int bed_minoff(const bed_reglist_t *p, hts_pos_t beg, hts_pos_t end) { + int i, min_off=0; + + if (p && p->idx) { + min_off = (beg>>LIDX_SHIFT >= p->n)? p->idx[p->n-1] : p->idx[beg>>LIDX_SHIFT]; + if (min_off < 0) { // TODO: this block can be improved, but speed should not matter too much here + hts_pos_t n = beg>>LIDX_SHIFT; + if (n > p->n) + n = p->n; + for (i = n - 1; i >= 0; --i) + if (p->idx[i] >= 0) + break; + min_off = i >= 0? p->idx[i] : 0; + } + } + + return min_off; +} + +static int bed_overlap_core(const bed_reglist_t *p, hts_pos_t beg, hts_pos_t end) +{ + int i, min_off; + if (p->n == 0) return 0; + min_off = bed_minoff(p, beg, end); + + for (i = min_off; i < p->n; ++i) { + if (p->a[i].beg >= end) break; // out of range; no need to proceed + if (p->a[i].end > beg && p->a[i].beg < end) + return 1; // find the overlap; return + } + return 0; +} + +int bed_overlap(const void *_h, const char *chr, hts_pos_t beg, hts_pos_t end) +{ + const reghash_t *h = (const reghash_t*)_h; + khint_t k; + if (!h) return 0; + k = kh_get(reg, h, chr); + if (k == kh_end(h)) return 0; + return bed_overlap_core(&kh_val(h, k), beg, end); +} + +/** @brief Trim a sorted interval list, inside a region hash table, + * by removing completely contained intervals and merging adjacent or + * overlapping intervals. + * @param reg_hash the region hash table with interval lists as values + */ + +void bed_unify(void *reg_hash) { + + int i, j, new_n; + reghash_t *h; + bed_reglist_t *p; + + if (!reg_hash) + return; + + h = (reghash_t *)reg_hash; + + for (i = kh_begin(h); i < kh_end(h); i++) { + if (!kh_exist(h,i) || !(p = &kh_val(h,i)) || !(p->n)) + continue; + + for (new_n = 0, j = 1; j < p->n; j++) { + if (p->a[new_n].end < p->a[j].beg) { + p->a[++new_n] = p->a[j]; + } else { + if (p->a[new_n].end < p->a[j].end) + p->a[new_n].end = p->a[j].end; + } + } + + p->n = ++new_n; + } +} + +/* "BED" file reader, which actually reads two different formats. + + BED files contain between three and nine fields per line, of which + only the first three (reference, start, end) are of interest to us. + BED counts positions from base 0, and the end is the base after the + region of interest. While not properly documented in the specification, + it is also possible to have 'browser' and 'track' lines in BED files that + do not follow the standard format and should be ignored. Examination + of the BED file reading code in + http://genome-source.cse.ucsc.edu/gitweb/?p=kent.git shows that BED + files can also have comment lines starting with '#', leading whitespace + is stripped, and that fields are separated by one or more consecutive + whitespace characters. + + The alternative format was originally for reading positions in VCF + format. This expects two columns, which indicate the reference and + a position. The position corresponds to a single base, and unlike + BED counts from 1. + + Which format is in use is determined based on whether one or two + numbers can be decoded on the line. As this choice is made line-by-line + in this implementation, it is possible (but probably a bad idea) to mix + both formats in the same file. If trying to read a VCF file by this + method, it would be important to ensure that the third column (ID) does + not contain any entries that start with a digit, to avoid the line + erroneously being parsed as a BED file entry. + + The BED specification is at http://www.genome.ucsc.edu/FAQ/FAQformat.html + The VCF specification is at https://github.com/samtools/hts-specs + */ + +void *bed_read(const char *fn) +{ + reghash_t *h = kh_init(reg); + gzFile fp; + kstream_t *ks = NULL; + int dret; + unsigned int line = 0, save_errno; + kstring_t str = { 0, 0, NULL }; + + if (NULL == h) return NULL; + // read the list + fp = strcmp(fn, "-")? gzopen(fn, "r") : gzdopen(fileno(stdin), "r"); + if (fp == 0) return 0; + ks = ks_init(fp); + if (NULL == ks) goto fail; // In case ks_init ever gets error checking... + int ks_len; + while ((ks_len = ks_getuntil(ks, KS_SEP_LINE, &str, &dret)) >= 0) { // read a line + char *ref = str.s, *ref_end; + uint64_t beg = 0, end = 0; + int num = 0; + khint_t k; + bed_reglist_t *p; + + if (ks_len == 0) + continue; // skip blank lines + + line++; + while (*ref && isspace(*ref)) ref++; + if ('\0' == *ref) continue; // Skip blank lines + if ('#' == *ref) continue; // Skip BED file comments + ref_end = ref; // look for the end of the reference name + while (*ref_end && !isspace(*ref_end)) ref_end++; + if ('\0' != *ref_end) { + *ref_end = '\0'; // terminate ref and look for start, end + num = sscanf(ref_end + 1, "%"SCNu64" %"SCNu64, &beg, &end); + } + if (1 == num) { // VCF-style format + end = beg--; // Counts from 1 instead of 0 for BED files + } + if (num < 1 || end < beg) { + // These two are special lines that can occur in BED files. + // Check for them here instead of earlier in case someone really + // has called their reference "browser" or "track". + if (0 == strcmp(ref, "browser")) continue; + if (0 == strcmp(ref, "track")) continue; + if (num < 1) { + fprintf(samtools_stderr, + "[bed_read] Parse error reading \"%s\" at line %u\n", + fn, line); + } else { + fprintf(samtools_stderr, + "[bed_read] Parse error reading \"%s\" at line %u : " + "end (%"PRIu64") must not be less " + "than start (%"PRIu64")\n", + fn, line, end, beg); + } + errno = 0; // Prevent caller from printing misleading error messages + goto fail; + } + + // Put reg in the hash table if not already there + k = kh_get(reg, h, ref); + if (k == kh_end(h)) { // absent from the hash table + int ret; + char *s = strdup(ref); + if (NULL == s) goto fail; + k = kh_put(reg, h, s, &ret); + if (-1 == ret) { + free(s); + goto fail; + } + memset(&kh_val(h, k), 0, sizeof(bed_reglist_t)); + } + p = &kh_val(h, k); + + // Add begin,end to the list + if (p->n == p->m) { + p->m = p->m ? p->m<<1 : 4; + hts_pair_pos_t *new_a = realloc(p->a, p->m * sizeof(p->a[0])); + if (NULL == new_a) goto fail; + p->a = new_a; + } + p->a[p->n].beg = beg; + p->a[p->n++].end = end; + } + // FIXME: Need to check for errors in ks_getuntil. At the moment it + // doesn't look like it can return one. Possibly use gzgets instead? + + if (gzclose(fp) != Z_OK) { + fp = NULL; + goto fail; + } + ks_destroy(ks); + free(str.s); + bed_index(h); + //bed_unify(h); + return h; + fail: + save_errno = errno; + if (ks) ks_destroy(ks); + if (fp) gzclose(fp); + free(str.s); + bed_destroy(h); + errno = save_errno; + return NULL; +} + +void bed_destroy(void *_h) +{ + reghash_t *h; + khint_t k; + + if (!_h) + return; + + h = (reghash_t*)_h; + for (k = 0; k < kh_end(h); ++k) { + if (kh_exist(h, k)) { + free(kh_val(h, k).a); + free(kh_val(h, k).idx); + free((char*)kh_key(h, k)); + } + } + kh_destroy(reg, h); +} + +static void *bed_insert(void *reg_hash, char *reg, hts_pos_t beg, hts_pos_t end) { + + reghash_t *h; + khint_t k; + bed_reglist_t *p; + + if (!reg_hash) + return NULL; + + h = (reghash_t *)reg_hash; + + // Put reg in the hash table if not already there + k = kh_get(reg, h, reg); //looks strange, but only the second reg is the actual region name. + if (k == kh_end(h)) { // absent from the hash table + int ret; + char *s = strdup(reg); + if (NULL == s) goto fail; + k = kh_put(reg, h, s, &ret); + if (-1 == ret) { + free(s); + goto fail; + } + memset(&kh_val(h, k), 0, sizeof(bed_reglist_t)); + } + p = &kh_val(h, k); + + // Add beg and end to the list + if (p->n == p->m) { + p->m = p->m ? p->m<<1 : 4; + hts_pair_pos_t *new_a = realloc(p->a, p->m * sizeof(p->a[0])); + if (NULL == new_a) goto fail; + p->a = new_a; + } + p->a[p->n].beg = beg; + p->a[p->n++].end = end; + +fail: + return h; +} + +/* @brief Filter a region hash table (coming from the BED file) by another + * region hash table (coming from CLI), so that only intervals contained in + * both hash tables are kept. + * @param reg_hash the target region hash table + * @param tmp_hash the filter region hash table + * @return pointer to the filtered hash table + */ + +static void *bed_filter(void *reg_hash, void *tmp_hash) { + + reghash_t *h; + reghash_t *t; + bed_reglist_t *p, *q; + khint_t l, k; + hts_pair_pos_t *new_a; + int i, j, new_n, min_off; + const char *reg; + hts_pos_t beg, end; + + h = (reghash_t *)reg_hash; + t = (reghash_t *)tmp_hash; + if (!h) + return NULL; + if (!t) + return h; + + for (l = kh_begin(t); l < kh_end(t); l++) { + if (!kh_exist(t,l) || !(q = &kh_val(t,l)) || !(q->n)) + continue; + + reg = kh_key(t,l); + k = kh_get(reg, h, reg); //looks strange, but only the second reg is a proper argument. + if (k == kh_end(h) || !(p = &kh_val(h, k)) || !(p->n)) + continue; + + new_a = calloc(q->n + p->n, sizeof(new_a[0])); + if (!new_a) + return NULL; + new_n = 0; + + for (i = 0; i < q->n; i++) { + beg = q->a[i].beg; + end = q->a[i].end; + + min_off = bed_minoff(p, beg, end); + for (j = min_off; j < p->n; ++j) { + if (p->a[j].beg >= end) break; // out of range; no need to proceed + if (p->a[j].end > beg && p->a[j].beg < end) { + new_a[new_n].beg = MAX(p->a[j].beg, beg); + new_a[new_n++].end = MIN(p->a[j].end, end); + } + } + } + + if (new_n > 0) { + free(p->a); + p->a = new_a; + p->n = new_n; + p->m = new_n; + p->filter = FILTERED; + } else { + free(new_a); + p->filter = ALL; + } + } + + return h; +} + +void *bed_hash_regions(void *reg_hash, char **regs, int first, int last, int *op) { + + reghash_t *h = (reghash_t *)reg_hash; + reghash_t *t = NULL; + + int i; + char reg[1024]; + const char *q; + int beg, end; + + if (h) { + t = kh_init(reg); + if (!t) { + fprintf(samtools_stderr, "Error when creating the temporary region hash table!\n"); + return NULL; + } + } else { + h = kh_init(reg); + if (!h) { + fprintf(samtools_stderr, "Error when creating the region hash table!\n"); + return NULL; + } + *op = 1; + } + + for (i=first; i 1024) { + fprintf(samtools_stderr, "Region name '%s' is too long (bigger than %d).\n", regs[i], 1024); + continue; + } + strncpy(reg, regs[i], q - regs[i]); + reg[q - regs[i]] = 0; + } else { + // not parsable as a region, but possibly a sequence named "foo:a" + if (strlen(regs[i]) + 1 > 1024) { + fprintf(samtools_stderr, "Region name '%s' is too long (bigger than %d).\n", regs[i], 1024); + continue; + } + strcpy(reg, regs[i]); + beg = 0; end = INT_MAX; + } + + //if op==1 insert reg to the bed hash table + if (*op && !(bed_insert(h, reg, beg, end))) { + fprintf(samtools_stderr, "Error when inserting region='%s' in the bed hash table at address=%p!\n", regs[i], h); + } + //if op==0, first insert the regions in the temporary hash table, + //then filter the bed hash table using it + if (!(*op) && !(bed_insert(t, reg, beg, end))) { + fprintf(samtools_stderr, "Error when inserting region='%s' in the temporary hash table at address=%p!\n", regs[i], t); + } + } + + if (!(*op)) { + bed_index(t); + bed_unify(t); + h = bed_filter(h, t); + bed_destroy(t); + } + + if (h) { + bed_index(h); + bed_unify(h); + } + + return h; +} + +const char* bed_get(void *reg_hash, int i, int filter) { + + reghash_t *h; + bed_reglist_t *p; + + if (!reg_hash) + return NULL; + + h = (reghash_t *)reg_hash; + if (!kh_exist(h,i) || !(p = &kh_val(h,i)) || (p->filter < filter)) + return NULL; + + return kh_key(h, i); +} + +/** + * Create a region list from a the region hash table + * @param reg_hash The region hash table + * @param filter 0 - allow all regions, 1 - allow only selected regions + * @param n_reg Pointer to the returned region number + * @return The regions list as a hts_reglist_t + */ + +hts_reglist_t *bed_reglist(void *reg_hash, int filter, int *n_reg) { + + reghash_t *h; + bed_reglist_t *p; + khint_t i; + hts_reglist_t *reglist = NULL; + int count = 0; + int j; + + if (!reg_hash) + return NULL; + + h = (reghash_t *)reg_hash; + + for (i = kh_begin(h); i < kh_end(h); i++) { + if (!kh_exist(h,i) || !(p = &kh_val(h,i)) || (p->filter < filter)) + continue; + count++; + } + if (!count) + return NULL; + + reglist = (hts_reglist_t *)calloc(count, sizeof(hts_reglist_t)); + if (!reglist) + return NULL; + + *n_reg = count; + count = 0; + + for (i = kh_begin(h); i < kh_end(h) && count < *n_reg; i++) { + if (!kh_exist(h,i) || !(p = &kh_val(h,i)) || (p->filter < filter)) + continue; + + reglist[count].reg = kh_key(h,i); + reglist[count].intervals = (hts_pair32_t *)calloc(p->n, sizeof(hts_pair32_t)); + if(!(reglist[count].intervals)) { + hts_reglist_free(reglist, count); + return NULL; + } + reglist[count].count = p->n; + reglist[count].max_end = 0; + + for (j = 0; j < p->n; j++) { + reglist[count].intervals[j].beg = p->a[j].beg; + reglist[count].intervals[j].end = p->a[j].end; + + if (reglist[count].intervals[j].end > reglist[count].max_end) + reglist[count].max_end = reglist[count].intervals[j].end; + } + count++; + } + + return reglist; +} diff --git a/samtools/bedidx.h b/samtools/bedidx.h new file mode 100644 index 0000000..05ab48f --- /dev/null +++ b/samtools/bedidx.h @@ -0,0 +1,45 @@ +/* bedidx.h -- BED file indexing header file. + + Copyright (C) 2017 Genome Research Ltd. + + Author: Valeriu Ohan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef BEDIDX_H +#define BEDIDX_H + +#include "htslib/hts.h" + +#define LIDX_SHIFT 13 +#define ALL 0 +#define FILTERED 1 + +#define MIN(A,B) ( ( (A) < (B) ) ? (A) : (B) ) +#define MAX(A,B) ( ( (A) > (B) ) ? (A) : (B) ) + +void *bed_read(const char *fn); +void bed_destroy(void *_h); +int bed_overlap(const void *_h, const char *chr, hts_pos_t beg, hts_pos_t end); +void *bed_hash_regions(void *reg_hash, char **regs, int first, int last, int *op); +const char* bed_get(void *reg_hash, int index, int filter); +hts_reglist_t *bed_reglist(void *reg_hash, int filter, int *count_regs); +void bed_unify(void *_h); + +#endif diff --git a/samtools/consensus_pileup.c b/samtools/consensus_pileup.c new file mode 100644 index 0000000..935cbdc --- /dev/null +++ b/samtools/consensus_pileup.c @@ -0,0 +1,595 @@ +/* consensus__pileup.h -- Pileup orientated data per consensus column + + Copyright (C) 2013-2016, 2020-2021 Genome Research Ltd. + + Author: James Bonfied + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include + +#ifdef __SSE__ +# include +#else +# define _mm_prefetch(a,b) +#endif + +#include "consensus_pileup.h" + +#define MIN(a,b) ((a)<(b)?(a):(b)) +#define bam_strand(b) (((b)->core.flag & BAM_FREVERSE) != 0) + +/* + * START_WITH_DEL is the mode that Gap5 uses when building this. It prepends + * all cigar strings with 1D and decrements the position by one. (And then + * has code to reverse this operation in the pileup handler.) + * + * The reason for this is that it means reads starting with an insertion work. + * Otherwise the inserted bases are silently lost. (Try it with "samtools + * mpileup" and you can see it has the same issue.) + * + * However it's probably not want most people expect. + */ +//#define START_WITH_DEL + +/* -------------------------------------------------------------------------- + * The pileup code itself. + * + * This consists of the external pileup_loop() function, which takes a + * sam/bam samfile_t pointer and a callback function. The callback function + * is called once per column of aligned data (so once per base in an + * insertion). + * + * Current known issues. + * 1) zero length matches, ie 2S2S cause failures. + * 2) Insertions at starts of sequences get included in the soft clip, so + * 2S2I2M is treated as if it's 4S2M + * 3) From 1 and 2 above, 1S1I2S becomes 2S2S which fails. + */ + + +/* + * Fetches the next base => the nth base at unpadded position pos. (Nth can + * be greater than 0 if we have an insertion in this column). Do not call this + * with pos/nth lower than the previous query, although higher is better. + * (This allows it to be initialised at base 0.) + * + * Stores the result in base and also updates is_insert to indicate that + * this sequence still has more bases in this position beyond the current + * nth parameter. + * + * Returns 1 if a base was fetched + * 0 if not (eg ran off the end of sequence) + */ +static int get_next_base(pileup_t *p, hts_pos_t pos, int nth, int *is_insert) { + bam1_t *b = &p->b; + int op = p->cigar_op; + + p->start -= p->start>0; + if (p->first_del && op != BAM_CPAD) + p->first_del = 0; + + *is_insert = 0; + + /* Find pos first */ + while (p->pos < pos) { + p->nth = 0; + + if (p->cigar_len == 0) { + if (p->cigar_ind >= b->core.n_cigar) { + p->eof = 1; + return 0; + } + + op=p->cigar_op = p->b_cigar[p->cigar_ind] & BAM_CIGAR_MASK; + p->cigar_len = p->b_cigar[p->cigar_ind] >> BAM_CIGAR_SHIFT; + p->cigar_ind++; + } + + if ((op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) + && p->cigar_len <= pos - p->pos) { + p->seq_offset += p->cigar_len; + p->pos += p->cigar_len; + p->cigar_len = 0; + } else { + switch (op) { + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + p->seq_offset++; + /* Fall through */ + case BAM_CDEL: + case BAM_CREF_SKIP: + p->pos++; + p->cigar_len--; + break; + + case BAM_CINS: + case BAM_CSOFT_CLIP: + p->seq_offset += p->cigar_len; + /* Fall through */ + case BAM_CPAD: + case BAM_CHARD_CLIP: + p->cigar_len = 0; + break; + + default: + fprintf(stderr, "Unhandled cigar_op %d\n", op); + return -1; + } + } + } + + /* Now at pos, find nth base */ + while (p->nth < nth) { + if (p->cigar_len == 0) { + if (p->cigar_ind >= b->core.n_cigar) { + p->eof = 1; + return 0; /* off end of seq */ + } + + op=p->cigar_op = p->b_cigar[p->cigar_ind] & BAM_CIGAR_MASK; + p->cigar_len = p->b_cigar[p->cigar_ind] >> BAM_CIGAR_SHIFT; + p->cigar_ind++; + } + + switch (op) { + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + case BAM_CSOFT_CLIP: + case BAM_CDEL: + case BAM_CREF_SKIP: + goto at_nth; /* sorry, but it's fast! */ + + case BAM_CINS: + p->seq_offset++; + /* Fall through */ + case BAM_CPAD: + p->cigar_len--; + p->nth++; + break; + + case BAM_CHARD_CLIP: + p->cigar_len = 0; + break; + + default: + fprintf(stderr, "Unhandled cigar_op %d\n", op); + return -1; + } + } + at_nth: + + /* Fill out base & qual fields */ + p->ref_skip = 0; + if (p->nth < nth && op != BAM_CINS) { + //p->base = '-'; + p->base = '*'; + p->base4 = 16; + p->padding = 1; + if (p->seq_offset < b->core.l_qseq) + p->qual = (p->qual + p->b_qual[p->seq_offset+1])/2; + else + p->qual = 0; + } else { + p->padding = 0; + switch(op) { + case BAM_CDEL: + p->base = '*'; + p->base4 = 16; + if (p->seq_offset+1 < b->core.l_qseq) + p->qual = (p->qual + p->b_qual[p->seq_offset+1])/2; + else + p->qual = (p->qual + p->b_qual[p->seq_offset])/2; + break; + + case BAM_CPAD: + //p->base = '+'; + p->base = '*'; + p->base4 = 16; + if (p->seq_offset+1 < b->core.l_qseq) + p->qual = (p->qual + p->b_qual[p->seq_offset+1])/2; + else + p->qual = (p->qual + p->b_qual[p->seq_offset])/2; + break; + + case BAM_CREF_SKIP: + p->base = '.'; + p->base4 = 0; + p->qual = 0; + /* end of fragment, but not sequence */ + p->eof = p->eof ? 2 : 3; + p->ref_skip = 1; + break; + + default: + if (p->seq_offset < b->core.l_qseq) { + p->qual = p->b_qual[p->seq_offset]; + p->base4 = p->b_seq[p->seq_offset/2] >> + ((~p->seq_offset&1)<<2) & 0xf; + p->base = "NACMGRSVTWYHKDBN"[p->base4]; + } else { + p->base = 'N'; + p->base4 = 15; + p->qual = 0xff; + } + + break; + } + } + + /* Handle moving out of N (skip) into sequence again */ + if (p->eof && p->base != '.') { + p->start = 1; + p->ref_skip = 1; + p->eof = 0; + } + + /* Starting with an indel needs a minor fudge */ + if (p->start && p->cigar_op == BAM_CDEL) { + p->first_del = 1; + } + + /* Check if next op is an insertion of some sort */ + if (p->cigar_len == 0) { + if (p->cigar_ind < b->core.n_cigar) { + op=p->cigar_op = p->b_cigar[p->cigar_ind] & BAM_CIGAR_MASK; + p->cigar_len = p->b_cigar[p->cigar_ind] >> BAM_CIGAR_SHIFT; + p->cigar_ind++; + if (op == BAM_CREF_SKIP) { + p->eof = 3; + p->ref_skip = 1; + } + } else { + p->eof = 1; + } + } + + switch (op) { + case BAM_CPAD: + case BAM_CINS: + *is_insert = p->cigar_len; + break; + + case BAM_CSOFT_CLIP: + /* Last op 'S' => eof */ + p->eof = (p->cigar_ind == b->core.n_cigar || + (p->cigar_ind+1 == b->core.n_cigar && + (p->b_cigar[p->cigar_ind] & BAM_CIGAR_MASK) + == BAM_CHARD_CLIP)) + ? 1 + : 0; + break; + + case BAM_CHARD_CLIP: + p->eof = 1; + break; + + default: + break; + } + + return 1; +} + +/* + * Loops through a set of supplied ranges producing columns of data. + * When found, it calls func with clientdata as a callback. Func should + * return 0 for success and non-zero for failure. seq_init() is called + * on each new entry before we start processing it. It should return 0 or 1 + * to indicate reject or accept status (eg to filter unmapped data). + * If seq_init() returns -1 we abort the pileup_loop with an error. + * seq_init may be NULL. + * + * Returns 0 on success + * -1 on failure + */ +int pileup_loop(samFile *fp, + sam_hdr_t *h, + int (*seq_fetch)(void *client_data, + samFile *fp, + sam_hdr_t *h, + bam1_t *b), + int (*seq_init)(void *client_data, + samFile *fp, + sam_hdr_t *h, + pileup_t *p), + int (*seq_add)(void *client_data, + samFile *fp, + sam_hdr_t *h, + pileup_t *p, + int depth, + hts_pos_t pos, + int nth, + int is_insert), + void *client_data) { + int ret = -1; + pileup_t *phead = NULL, *p, *pfree = NULL, *last, *next, *ptail = NULL; + pileup_t *pnew = NULL; + int is_insert, nth = 0, r; + hts_pos_t col = 0; + int last_ref = -1; + + /* FIXME: allow for start/stop boundaries rather than consuming all data */ + + if (NULL == (pnew = calloc(1, sizeof(*p)))) + return -1; + + do { + bam1_t *b; + hts_pos_t pos; + + r = seq_fetch(client_data, fp, h, &pnew->b); + if (r < -1) { + fprintf(stderr, "bam_next_seq() failure.\n"); + goto error; + } + + b = &pnew->b; + + /* Force realloc */ + //fp->bs = NULL; + //fp->bs_size = 0; + + //r = samread(fp, pnew->b); + if (r >= 0) { + if (b->core.flag & BAM_FUNMAP) + continue; + + if (b->core.tid == -1) { + /* Another indicator for unmapped */ + continue; + } else if (b->core.tid == last_ref) { + pos = b->core.pos+1; + //printf("New seq at pos %d @ %d %s\n", pos, b->core.tid, + // bam_name(b)); + } else { + //printf("New ctg at pos %ld @ %d\n",b->core.pos+1,b->core.tid); + pos = HTS_POS_MAX; + } + } else { + pos = HTS_POS_MAX; + } + + if (col > pos) { + fprintf(stderr, "BAM/SAM file is not sorted by position. " + "Aborting\n"); + goto error; + } + + /* Process data between the last column and our latest addition */ + while (col < pos && phead) { + struct pileup *eof_head = NULL, *eofp = NULL; + int v, ins, depth = 0; + //printf("Col=%ld pos=%ld nth=%d\n", col, pos, nth); + + /* Pileup */ + is_insert = 0; + pileup_t *pnext = phead ? phead->next : NULL; + for (p = phead, last = NULL; p; p = pnext) { +#if 0 + // Simple prefetching + pnext = p->next; + if (pnext) + _mm_prefetch(pnext, _MM_HINT_T0); +#else + // More complex prefetching => more instructions, but + // usually faster. + pnext = p->next; + if (pnext) { + // start memory fetches; a big help on very deep data + if (pnext->next) + // struct 2 ahead + _mm_prefetch(pnext->next, _MM_HINT_T0); + // seq/qual 1 ahead + _mm_prefetch(pnext->b_qual + pnext->seq_offset, + _MM_HINT_T0); + _mm_prefetch(pnext->b_seq + pnext->seq_offset/2, + _MM_HINT_T0); + } +#endif + + if (!get_next_base(p, col, nth, &ins)) + p->eof = 1; + if (p->eof == 1) { + if (eofp) + eofp->eofn = p; + eofp = p; + eofp->eofl = last; + if (!eof_head) + eof_head = eofp; + } else { + last = p; + } + + if (is_insert < ins) + is_insert = ins; + + depth++; + } + if ((ptail = last) == NULL) + ptail = phead; + + /* Call our function on phead linked list */ + v = seq_add(client_data, fp, h, phead, depth, +#ifdef START_WITH_DEL + col-1, +#else + col, +#endif + nth, is_insert); + + /* Remove dead seqs */ + for (p = eof_head ; p; p = p->eofn) { + if (p->eofl) + p->eofl->next = p->next; + else + phead = p->next; + + p->next = pfree; + pfree = p; + } + + if (v == 1) + break; /* early abort */ + + if (v != 0) + goto error; + + /* Next column */ + if (is_insert) { + nth++; + } else { + nth = 0; + col++; + } + } + + /* May happen if we have a hole in the contig */ + col = pos; + + /* New contig */ + if (b && b->core.tid != last_ref) { + last_ref = b->core.tid; + pos = b->core.pos+1; + nth = 0; + col = pos; + } + + /* + * Add this seq. + * Note: cigars starting with I or P ops (eg 2P3I10M) mean we have + * alignment instructions that take place before the designated + * starting location listed in the SAM file. They won't get included + * in the callback function until they officially start, which is + * already too late. + * + * So to workaround this, we prefix all CIGAR with 1D, move the + * position by 1bp, and then force the callback code to remove + * leaving pads (either P or D generated). + * + * Ie it's a level 10 hack! + */ + if (r >= 0) { + p = pnew; + p->next = NULL; + p->cd = NULL; + p->eofn = NULL; + p->eofl = NULL; + p->start = 2; + p->eof = 0; +#ifdef START_WITH_DEL + p->pos = pos-1; + p->cigar_ind = 0; + p->b_cigar = bam_get_cigar(&p->b); + if ((p->b_cigar[0] & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) { + p->cigar_len = p->b_cigar[0] >> BAM_CIGAR_SHIFT; + p->cigar_op = BAM_CHARD_CLIP; + if ((p->b_cigar[1] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP) { + /* xHxS... => xHxS1D... */ + p->b_cigar[0] = p->b_cigar[1]; + p->b_cigar[1] = (1 << BAM_CIGAR_SHIFT) | BAM_CDEL; + } else { + /* xH... => xH1D... */ + p->b_cigar[0] = (1 << BAM_CIGAR_SHIFT) | BAM_CDEL; + } + } else { + if ((p->b_cigar[0] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP) { + /* xS... => xS1D... */ + p->cigar_len = p->b_cigar[0] >> BAM_CIGAR_SHIFT; + p->cigar_op = BAM_CSOFT_CLIP; + p->b_cigar[0] = (1 << BAM_CIGAR_SHIFT) | BAM_CDEL; + } else { + /* ... => 1D... */ + p->cigar_len = 1; /* was 0 */ + p->cigar_op = BAM_CDEL; /* was 'X' */ + } + } + p->seq_offset = -1; + p->first_del = 1; +#else + p->pos = pos-1; + p->cigar_ind = 0; + p->b_cigar = bam_get_cigar(&p->b); + p->cigar_len = 0; + p->cigar_op = -1; + p->seq_offset = -1; + p->first_del = 0; +#endif + p->b_is_rev = bam_is_rev(&p->b); + p->b_qual = (uint8_t *)bam_get_qual(&p->b); + p->b_seq = (uint8_t *)bam_get_seq(&p->b); + + if (seq_init) { + int v; + v = seq_init(client_data, fp, h, p); + if (v == -1) + goto error; + + if (v == 1) { + /* Keep this seq */ + if (phead) { + ptail->next = p; + } else { + phead = p; + } + ptail = p; + } else { + /* Push back on free list */ + p->next = pfree; + pfree = p; + } + } else { + if (phead) + ptail->next = p; + else + phead = p; + ptail = p; + } + + /* Allocate the next pileup rec */ + if (pfree) { + pnew = pfree; + pfree = pfree->next; + } else { + if (NULL == (pnew = calloc(1, sizeof(*pnew)))) + goto error; + } + } + } while (r >= 0); + + ret = 0; + error: + + if (pnew) { + free(pnew->b.data); + free(pnew); + } + + /* Tidy up */ + for (p = pfree; p; p = next) { + next = p->next; + free(p->b.data); + free(p); + } + + return ret; +} diff --git a/samtools/consensus_pileup.c.pysam.c b/samtools/consensus_pileup.c.pysam.c new file mode 100644 index 0000000..dde0ad0 --- /dev/null +++ b/samtools/consensus_pileup.c.pysam.c @@ -0,0 +1,597 @@ +#include "samtools.pysam.h" + +/* consensus__pileup.h -- Pileup orientated data per consensus column + + Copyright (C) 2013-2016, 2020-2021 Genome Research Ltd. + + Author: James Bonfied + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include + +#ifdef __SSE__ +# include +#else +# define _mm_prefetch(a,b) +#endif + +#include "consensus_pileup.h" + +#define MIN(a,b) ((a)<(b)?(a):(b)) +#define bam_strand(b) (((b)->core.flag & BAM_FREVERSE) != 0) + +/* + * START_WITH_DEL is the mode that Gap5 uses when building this. It prepends + * all cigar strings with 1D and decrements the position by one. (And then + * has code to reverse this operation in the pileup handler.) + * + * The reason for this is that it means reads starting with an insertion work. + * Otherwise the inserted bases are silently lost. (Try it with "samtools + * mpileup" and you can see it has the same issue.) + * + * However it's probably not want most people expect. + */ +//#define START_WITH_DEL + +/* -------------------------------------------------------------------------- + * The pileup code itself. + * + * This consists of the external pileup_loop() function, which takes a + * sam/bam samfile_t pointer and a callback function. The callback function + * is called once per column of aligned data (so once per base in an + * insertion). + * + * Current known issues. + * 1) zero length matches, ie 2S2S cause failures. + * 2) Insertions at starts of sequences get included in the soft clip, so + * 2S2I2M is treated as if it's 4S2M + * 3) From 1 and 2 above, 1S1I2S becomes 2S2S which fails. + */ + + +/* + * Fetches the next base => the nth base at unpadded position pos. (Nth can + * be greater than 0 if we have an insertion in this column). Do not call this + * with pos/nth lower than the previous query, although higher is better. + * (This allows it to be initialised at base 0.) + * + * Stores the result in base and also updates is_insert to indicate that + * this sequence still has more bases in this position beyond the current + * nth parameter. + * + * Returns 1 if a base was fetched + * 0 if not (eg ran off the end of sequence) + */ +static int get_next_base(pileup_t *p, hts_pos_t pos, int nth, int *is_insert) { + bam1_t *b = &p->b; + int op = p->cigar_op; + + p->start -= p->start>0; + if (p->first_del && op != BAM_CPAD) + p->first_del = 0; + + *is_insert = 0; + + /* Find pos first */ + while (p->pos < pos) { + p->nth = 0; + + if (p->cigar_len == 0) { + if (p->cigar_ind >= b->core.n_cigar) { + p->eof = 1; + return 0; + } + + op=p->cigar_op = p->b_cigar[p->cigar_ind] & BAM_CIGAR_MASK; + p->cigar_len = p->b_cigar[p->cigar_ind] >> BAM_CIGAR_SHIFT; + p->cigar_ind++; + } + + if ((op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) + && p->cigar_len <= pos - p->pos) { + p->seq_offset += p->cigar_len; + p->pos += p->cigar_len; + p->cigar_len = 0; + } else { + switch (op) { + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + p->seq_offset++; + /* Fall through */ + case BAM_CDEL: + case BAM_CREF_SKIP: + p->pos++; + p->cigar_len--; + break; + + case BAM_CINS: + case BAM_CSOFT_CLIP: + p->seq_offset += p->cigar_len; + /* Fall through */ + case BAM_CPAD: + case BAM_CHARD_CLIP: + p->cigar_len = 0; + break; + + default: + fprintf(samtools_stderr, "Unhandled cigar_op %d\n", op); + return -1; + } + } + } + + /* Now at pos, find nth base */ + while (p->nth < nth) { + if (p->cigar_len == 0) { + if (p->cigar_ind >= b->core.n_cigar) { + p->eof = 1; + return 0; /* off end of seq */ + } + + op=p->cigar_op = p->b_cigar[p->cigar_ind] & BAM_CIGAR_MASK; + p->cigar_len = p->b_cigar[p->cigar_ind] >> BAM_CIGAR_SHIFT; + p->cigar_ind++; + } + + switch (op) { + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + case BAM_CSOFT_CLIP: + case BAM_CDEL: + case BAM_CREF_SKIP: + goto at_nth; /* sorry, but it's fast! */ + + case BAM_CINS: + p->seq_offset++; + /* Fall through */ + case BAM_CPAD: + p->cigar_len--; + p->nth++; + break; + + case BAM_CHARD_CLIP: + p->cigar_len = 0; + break; + + default: + fprintf(samtools_stderr, "Unhandled cigar_op %d\n", op); + return -1; + } + } + at_nth: + + /* Fill out base & qual fields */ + p->ref_skip = 0; + if (p->nth < nth && op != BAM_CINS) { + //p->base = '-'; + p->base = '*'; + p->base4 = 16; + p->padding = 1; + if (p->seq_offset < b->core.l_qseq) + p->qual = (p->qual + p->b_qual[p->seq_offset+1])/2; + else + p->qual = 0; + } else { + p->padding = 0; + switch(op) { + case BAM_CDEL: + p->base = '*'; + p->base4 = 16; + if (p->seq_offset+1 < b->core.l_qseq) + p->qual = (p->qual + p->b_qual[p->seq_offset+1])/2; + else + p->qual = (p->qual + p->b_qual[p->seq_offset])/2; + break; + + case BAM_CPAD: + //p->base = '+'; + p->base = '*'; + p->base4 = 16; + if (p->seq_offset+1 < b->core.l_qseq) + p->qual = (p->qual + p->b_qual[p->seq_offset+1])/2; + else + p->qual = (p->qual + p->b_qual[p->seq_offset])/2; + break; + + case BAM_CREF_SKIP: + p->base = '.'; + p->base4 = 0; + p->qual = 0; + /* end of fragment, but not sequence */ + p->eof = p->eof ? 2 : 3; + p->ref_skip = 1; + break; + + default: + if (p->seq_offset < b->core.l_qseq) { + p->qual = p->b_qual[p->seq_offset]; + p->base4 = p->b_seq[p->seq_offset/2] >> + ((~p->seq_offset&1)<<2) & 0xf; + p->base = "NACMGRSVTWYHKDBN"[p->base4]; + } else { + p->base = 'N'; + p->base4 = 15; + p->qual = 0xff; + } + + break; + } + } + + /* Handle moving out of N (skip) into sequence again */ + if (p->eof && p->base != '.') { + p->start = 1; + p->ref_skip = 1; + p->eof = 0; + } + + /* Starting with an indel needs a minor fudge */ + if (p->start && p->cigar_op == BAM_CDEL) { + p->first_del = 1; + } + + /* Check if next op is an insertion of some sort */ + if (p->cigar_len == 0) { + if (p->cigar_ind < b->core.n_cigar) { + op=p->cigar_op = p->b_cigar[p->cigar_ind] & BAM_CIGAR_MASK; + p->cigar_len = p->b_cigar[p->cigar_ind] >> BAM_CIGAR_SHIFT; + p->cigar_ind++; + if (op == BAM_CREF_SKIP) { + p->eof = 3; + p->ref_skip = 1; + } + } else { + p->eof = 1; + } + } + + switch (op) { + case BAM_CPAD: + case BAM_CINS: + *is_insert = p->cigar_len; + break; + + case BAM_CSOFT_CLIP: + /* Last op 'S' => eof */ + p->eof = (p->cigar_ind == b->core.n_cigar || + (p->cigar_ind+1 == b->core.n_cigar && + (p->b_cigar[p->cigar_ind] & BAM_CIGAR_MASK) + == BAM_CHARD_CLIP)) + ? 1 + : 0; + break; + + case BAM_CHARD_CLIP: + p->eof = 1; + break; + + default: + break; + } + + return 1; +} + +/* + * Loops through a set of supplied ranges producing columns of data. + * When found, it calls func with clientdata as a callback. Func should + * return 0 for success and non-zero for failure. seq_init() is called + * on each new entry before we start processing it. It should return 0 or 1 + * to indicate reject or accept status (eg to filter unmapped data). + * If seq_init() returns -1 we abort the pileup_loop with an error. + * seq_init may be NULL. + * + * Returns 0 on success + * -1 on failure + */ +int pileup_loop(samFile *fp, + sam_hdr_t *h, + int (*seq_fetch)(void *client_data, + samFile *fp, + sam_hdr_t *h, + bam1_t *b), + int (*seq_init)(void *client_data, + samFile *fp, + sam_hdr_t *h, + pileup_t *p), + int (*seq_add)(void *client_data, + samFile *fp, + sam_hdr_t *h, + pileup_t *p, + int depth, + hts_pos_t pos, + int nth, + int is_insert), + void *client_data) { + int ret = -1; + pileup_t *phead = NULL, *p, *pfree = NULL, *last, *next, *ptail = NULL; + pileup_t *pnew = NULL; + int is_insert, nth = 0, r; + hts_pos_t col = 0; + int last_ref = -1; + + /* FIXME: allow for start/stop boundaries rather than consuming all data */ + + if (NULL == (pnew = calloc(1, sizeof(*p)))) + return -1; + + do { + bam1_t *b; + hts_pos_t pos; + + r = seq_fetch(client_data, fp, h, &pnew->b); + if (r < -1) { + fprintf(samtools_stderr, "bam_next_seq() failure.\n"); + goto error; + } + + b = &pnew->b; + + /* Force realloc */ + //fp->bs = NULL; + //fp->bs_size = 0; + + //r = samread(fp, pnew->b); + if (r >= 0) { + if (b->core.flag & BAM_FUNMAP) + continue; + + if (b->core.tid == -1) { + /* Another indicator for unmapped */ + continue; + } else if (b->core.tid == last_ref) { + pos = b->core.pos+1; + //printf("New seq at pos %d @ %d %s\n", pos, b->core.tid, + // bam_name(b)); + } else { + //printf("New ctg at pos %ld @ %d\n",b->core.pos+1,b->core.tid); + pos = HTS_POS_MAX; + } + } else { + pos = HTS_POS_MAX; + } + + if (col > pos) { + fprintf(samtools_stderr, "BAM/SAM file is not sorted by position. " + "Aborting\n"); + goto error; + } + + /* Process data between the last column and our latest addition */ + while (col < pos && phead) { + struct pileup *eof_head = NULL, *eofp = NULL; + int v, ins, depth = 0; + //printf("Col=%ld pos=%ld nth=%d\n", col, pos, nth); + + /* Pileup */ + is_insert = 0; + pileup_t *pnext = phead ? phead->next : NULL; + for (p = phead, last = NULL; p; p = pnext) { +#if 0 + // Simple prefetching + pnext = p->next; + if (pnext) + _mm_prefetch(pnext, _MM_HINT_T0); +#else + // More complex prefetching => more instructions, but + // usually faster. + pnext = p->next; + if (pnext) { + // start memory fetches; a big help on very deep data + if (pnext->next) + // struct 2 ahead + _mm_prefetch(pnext->next, _MM_HINT_T0); + // seq/qual 1 ahead + _mm_prefetch(pnext->b_qual + pnext->seq_offset, + _MM_HINT_T0); + _mm_prefetch(pnext->b_seq + pnext->seq_offset/2, + _MM_HINT_T0); + } +#endif + + if (!get_next_base(p, col, nth, &ins)) + p->eof = 1; + if (p->eof == 1) { + if (eofp) + eofp->eofn = p; + eofp = p; + eofp->eofl = last; + if (!eof_head) + eof_head = eofp; + } else { + last = p; + } + + if (is_insert < ins) + is_insert = ins; + + depth++; + } + if ((ptail = last) == NULL) + ptail = phead; + + /* Call our function on phead linked list */ + v = seq_add(client_data, fp, h, phead, depth, +#ifdef START_WITH_DEL + col-1, +#else + col, +#endif + nth, is_insert); + + /* Remove dead seqs */ + for (p = eof_head ; p; p = p->eofn) { + if (p->eofl) + p->eofl->next = p->next; + else + phead = p->next; + + p->next = pfree; + pfree = p; + } + + if (v == 1) + break; /* early abort */ + + if (v != 0) + goto error; + + /* Next column */ + if (is_insert) { + nth++; + } else { + nth = 0; + col++; + } + } + + /* May happen if we have a hole in the contig */ + col = pos; + + /* New contig */ + if (b && b->core.tid != last_ref) { + last_ref = b->core.tid; + pos = b->core.pos+1; + nth = 0; + col = pos; + } + + /* + * Add this seq. + * Note: cigars starting with I or P ops (eg 2P3I10M) mean we have + * alignment instructions that take place before the designated + * starting location listed in the SAM file. They won't get included + * in the callback function until they officially start, which is + * already too late. + * + * So to workaround this, we prefix all CIGAR with 1D, move the + * position by 1bp, and then force the callback code to remove + * leaving pads (either P or D generated). + * + * Ie it's a level 10 hack! + */ + if (r >= 0) { + p = pnew; + p->next = NULL; + p->cd = NULL; + p->eofn = NULL; + p->eofl = NULL; + p->start = 2; + p->eof = 0; +#ifdef START_WITH_DEL + p->pos = pos-1; + p->cigar_ind = 0; + p->b_cigar = bam_get_cigar(&p->b); + if ((p->b_cigar[0] & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) { + p->cigar_len = p->b_cigar[0] >> BAM_CIGAR_SHIFT; + p->cigar_op = BAM_CHARD_CLIP; + if ((p->b_cigar[1] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP) { + /* xHxS... => xHxS1D... */ + p->b_cigar[0] = p->b_cigar[1]; + p->b_cigar[1] = (1 << BAM_CIGAR_SHIFT) | BAM_CDEL; + } else { + /* xH... => xH1D... */ + p->b_cigar[0] = (1 << BAM_CIGAR_SHIFT) | BAM_CDEL; + } + } else { + if ((p->b_cigar[0] & BAM_CIGAR_MASK) == BAM_CSOFT_CLIP) { + /* xS... => xS1D... */ + p->cigar_len = p->b_cigar[0] >> BAM_CIGAR_SHIFT; + p->cigar_op = BAM_CSOFT_CLIP; + p->b_cigar[0] = (1 << BAM_CIGAR_SHIFT) | BAM_CDEL; + } else { + /* ... => 1D... */ + p->cigar_len = 1; /* was 0 */ + p->cigar_op = BAM_CDEL; /* was 'X' */ + } + } + p->seq_offset = -1; + p->first_del = 1; +#else + p->pos = pos-1; + p->cigar_ind = 0; + p->b_cigar = bam_get_cigar(&p->b); + p->cigar_len = 0; + p->cigar_op = -1; + p->seq_offset = -1; + p->first_del = 0; +#endif + p->b_is_rev = bam_is_rev(&p->b); + p->b_qual = (uint8_t *)bam_get_qual(&p->b); + p->b_seq = (uint8_t *)bam_get_seq(&p->b); + + if (seq_init) { + int v; + v = seq_init(client_data, fp, h, p); + if (v == -1) + goto error; + + if (v == 1) { + /* Keep this seq */ + if (phead) { + ptail->next = p; + } else { + phead = p; + } + ptail = p; + } else { + /* Push back on free list */ + p->next = pfree; + pfree = p; + } + } else { + if (phead) + ptail->next = p; + else + phead = p; + ptail = p; + } + + /* Allocate the next pileup rec */ + if (pfree) { + pnew = pfree; + pfree = pfree->next; + } else { + if (NULL == (pnew = calloc(1, sizeof(*pnew)))) + goto error; + } + } + } while (r >= 0); + + ret = 0; + error: + + if (pnew) { + free(pnew->b.data); + free(pnew); + } + + /* Tidy up */ + for (p = pfree; p; p = next) { + next = p->next; + free(p->b.data); + free(p); + } + + return ret; +} diff --git a/samtools/consensus_pileup.h b/samtools/consensus_pileup.h new file mode 100644 index 0000000..6eafdbb --- /dev/null +++ b/samtools/consensus_pileup.h @@ -0,0 +1,79 @@ +/* consensus_pileup.h -- Pileup orientated data per consensus column + + Copyright (C) 2013-2016, 2020-2021 Genome Research Ltd. + + Author: James Bonfied + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +typedef struct pileup { + // commonly used things together, to fit in a cache line (64 bytes) + struct pileup *next; // A link list, for active seqs + void *cd; // General purpose per-seq client-data + int eof; // True if this sequence has finished + int qual; // Current qual (for active seq only) + char start; // True if this is a new sequence + char base; // Current base (for active seq only) in ASCII + char ref_skip; // True if the cause of eof or start is cigar N + char padding; // True if the base was added due to another seq + int base4; // Base in 4-bit notation (0-15) + hts_pos_t pos; // Current unpadded position in seq + int nth; // nth base at unpadded position 'pos' + int b_is_rev; // 0 => fwd, 1 => rev + int seq_offset; // Current base position in s->seq[] array. + + unsigned char *b_qual;// cached bam_qual + unsigned char *b_seq; // cached bam_seq + + // --- 64 bytes + struct pileup *eofn; // p->eof set, next eof member + struct pileup *eofl; // last non-eof that points to p with p->eof + + uint32_t *b_cigar; // cached bam_cigar + + int cigar_ind; // Current location in s->alignment cigar str + int cigar_op; // Current cigar operation + int cigar_len; // Remaining length of this cigar op + + int first_del; // Used when first base is a deletion + + bam1_t b; // Bam entry associated with struct +} pileup_t; + +int pileup_loop(samFile *fp, + sam_hdr_t *h, + int (*seq_fetch)(void *client_data, + samFile *fp, + sam_hdr_t *h, + bam1_t *b), + int (*seq_init)(void *client_data, + samFile *fp, + sam_hdr_t *h, + pileup_t *p), + int (*seq_add)(void *client_data, + samFile *fp, + sam_hdr_t *h, + pileup_t *p, + int depth, + hts_pos_t pos, + int nth, + int is_insert), + void *client_data); diff --git a/samtools/coverage.c b/samtools/coverage.c new file mode 100644 index 0000000..dedaa8e --- /dev/null +++ b/samtools/coverage.c @@ -0,0 +1,683 @@ +/* coverage.c -- samtools coverage subcommand + + Copyright (C) 2018,2019 Florian Breitwieser + Portions copyright (C) 2019-2021 Genome Research Ltd. + + Author: Florian P Breitwieser + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* This program calculates coverage from multiple BAMs + * simultaneously, to achieve random access and to use the BED interface. + * To compile this program separately, you may: + * + * gcc -g -O2 -Wall -o bamcov -D_MAIN_BAMCOV coverage.c -lhts -lz + */ + +// C headers +#include + +#include +#include +#include +#include // variadic functions +#include // INT_MAX +#include // round +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "htslib/sam.h" +#include "htslib/hts.h" +#include "samtools.h" +#include "sam_opts.h" + +typedef struct { // auxiliary data structure to hold stats on coverage + unsigned long long n_covered_bases; + unsigned long long summed_coverage; + unsigned long long summed_baseQ; + unsigned long long summed_mapQ; + unsigned int n_reads; + unsigned int n_selected_reads; + bool covered; + hts_pos_t beg; + hts_pos_t end; + int64_t bin_width; +} stats_aux_t; + +typedef struct { // auxiliary data structure to hold a BAM file + samFile *fp; // file handle + sam_hdr_t *hdr; // file header + hts_itr_t *iter; // iterator to a region - NULL for us by default + int min_mapQ; // mapQ filter + int min_len; // length filter + int fail_flags; + int required_flags; + stats_aux_t *stats; +} bam_aux_t; + +#if __STDC_VERSION__ >= 199901L +#define VERTICAL_LINE "\u2502" // BOX DRAWINGS LIGHT VERTICAL + +// UTF8 specifies block characters in eights going from \u2581 (lower one eight block) to \u2588 (full block) +// https://en.wikipedia.org/wiki/Block_Elements +// LOWER ONE EIGHTH BLOCK … FULL BLOCK +static const char *const BLOCK_CHARS8[8] = {"\u2581", "\u2582", "\u2583", "\u2584", "\u2585", "\u2586", "\u2587", "\u2588"}; +// In some terminals / with some fonts not all UTF8 block characters are supported (e.g. Putty). Use only half and full block for those +static const char *const BLOCK_CHARS2[2] = {".", ":"}; + +#else + +// Fall back to explicit UTF-8 encodings of the same characters +#define VERTICAL_LINE "\xE2\x94\x82" + +static const char *const BLOCK_CHARS8[8] = { + "\xE2\x96\x81", "\xE2\x96\x82", "\xE2\x96\x83", "\xE2\x96\x84", + "\xE2\x96\x85", "\xE2\x96\x86", "\xE2\x96\x87", "\xE2\x96\x88" }; + +static const char *const BLOCK_CHARS2[2] = {".", ":"}; + +#endif + +// in bam_plcmd.c +int read_file_list(const char *file_list, int *n, char **argv[]); + +static int usage() { + fprintf(stdout, "Usage: samtools coverage [options] in1.bam [in2.bam [...]]\n\n" + "Input options:\n" + " -b, --bam-list FILE list of input BAM filenames, one per line\n" + " -l, --min-read-len INT ignore reads shorter than INT bp [0]\n" + " -q, --min-MQ INT mapping quality threshold [0]\n" + " -Q, --min-BQ INT base quality threshold [0]\n" + " --rf required flags: skip reads with mask bits unset []\n" + " --ff filter flags: skip reads with mask bits set \n" + " [UNMAP,SECONDARY,QCFAIL,DUP]\n" + " -d, --depth INT maximum allowed coverage depth [1000000].\n" + " If 0, depth is set to the maximum integer value,\n" + " effectively removing any depth limit.\n" + "Output options:\n" + " -m, --histogram show histogram instead of tabular output\n" + " -A, --ascii show only ASCII characters in histogram\n" + " -o, --output FILE write output to FILE [stdout]\n" + " -H, --no-header don't print a header in tabular mode\n" + " -w, --n-bins INT number of bins in histogram [terminal width - 40]\n" + " -r, --region REG show specified region. Format: chr:start-end. \n" + " -h, --help help (this page)\n"); + + fprintf(stdout, "\nGeneric options:\n"); + sam_global_opt_help(stdout, "-.--.--."); + + fprintf(stdout, + "\nSee manpage for additional details.\n" + " rname Reference name / chromosome\n" + " startpos Start position\n" + " endpos End position (or sequence length)\n" + " numreads Number reads aligned to the region (after filtering)\n" + " covbases Number of covered bases with depth >= 1\n" + " coverage Percentage of covered bases [0..100]\n" + " meandepth Mean depth of coverage\n" + " meanbaseq Mean baseQ in covered region\n" + " meanmapq Mean mapQ of selected reads\n" + ); + + return EXIT_SUCCESS; +} + +static char* center_text(char *text, char *buf, int width) { + int len = strlen(text); + assert(len <= width); + int padding = (width - len) / 2; + int padding_ex = (width - len) % 2; + if (padding >= 1) + sprintf(buf, " %*s%*s", len+padding, text, padding-1+padding_ex, " "); + else + sprintf(buf, "%s", text); + + return buf; +} + +static char* readable_bps(double base_pairs, char *buf) { + const char* units[] = {"", "K", "M", "G", "T"}; + int i = 0; + while (base_pairs >= 1000 && i < (sizeof(units)/sizeof(units[0]) - 1)) { + base_pairs /= 1000; + i++; + } + sprintf(buf, "%.*f%s", i, base_pairs, units[i]); + return buf; +} + +// read one alignment from one BAM file +static int read_bam(void *data, bam1_t *b) { + bam_aux_t *aux = (bam_aux_t*)data; // data in fact is a pointer to an auxiliary structure + int nref = sam_hdr_nref(aux->hdr); + int ret; + while (1) { + if((ret = aux->iter? sam_itr_next(aux->fp, aux->iter, b) : sam_read1(aux->fp, aux->hdr, b)) < 0) break; + if (b->core.tid >= 0 && b->core.tid < nref) + aux->stats[b->core.tid].n_reads++; + + if ( aux->fail_flags && (b->core.flag & aux->fail_flags) ) continue; + if ( aux->required_flags && !(b->core.flag & aux->required_flags) ) continue; + if ( b->core.qual < aux->min_mapQ ) continue; + if ( aux->min_len && bam_cigar2qlen(b->core.n_cigar, bam_get_cigar(b)) < aux->min_len ) continue; + if (b->core.tid >= 0 && b->core.tid < nref) { + aux->stats[b->core.tid].n_selected_reads++; + aux->stats[b->core.tid].summed_mapQ += b->core.qual; + } + break; + } + return ret; +} + +void print_tabular_line(FILE *file_out, const sam_hdr_t *h, const stats_aux_t *stats, int tid) { + fputs(sam_hdr_tid2name(h, tid), file_out); + double region_len = (double) stats[tid].end - stats[tid].beg; + fprintf(file_out, "\t%"PRId64"\t%"PRId64"\t%u\t%llu\t%g\t%g\t%.3g\t%.3g\n", + stats[tid].beg+1, + stats[tid].end, + stats[tid].n_selected_reads, + stats[tid].n_covered_bases, + 100.0 * stats[tid].n_covered_bases / region_len, + stats[tid].summed_coverage / region_len, + stats[tid].summed_coverage > 0? stats[tid].summed_baseQ/(double) stats[tid].summed_coverage : 0, + stats[tid].n_selected_reads > 0? stats[tid].summed_mapQ/(double) stats[tid].n_selected_reads : 0 + ); +} + +void print_hist(FILE *file_out, const sam_hdr_t *h, const stats_aux_t *stats, int tid, const uint32_t *hist, + const int hist_size, const bool full_utf) { + int i, col; + bool show_percentiles = false; + const int n_rows = 10; + const char * const * BLOCK_CHARS = full_utf? BLOCK_CHARS8 : BLOCK_CHARS2; + const int blockchar_len = full_utf? 8 : 2; + double region_len = stats[tid].end - stats[tid].beg; + + // Calculate histogram that contains percent covered + double hist_data[hist_size]; + double max_val = 0.0; + for (i = 0; i < hist_size; ++i) { + hist_data[i] = 100 * hist[i] / (double) stats[tid].bin_width; + if (hist_data[i] > max_val) max_val = hist_data[i]; + } + + char buf[30]; + fprintf(file_out, "%s (%sbp)\n", sam_hdr_tid2name(h, tid), readable_bps(sam_hdr_tid2len(h, tid), buf)); + + double row_bin_size = max_val / (double) n_rows; + for (i = n_rows-1; i >= 0; --i) { + double current_bin = row_bin_size * i; + if (show_percentiles) { + fprintf(file_out, ">%3i%% ", i*10); + } else { + fprintf(file_out, ">%7.2f%% ", current_bin); + } + fprintf(file_out, full_utf ? VERTICAL_LINE : "|"); + for (col = 0; col < hist_size; ++col) { + // get the difference in eights, or halfs when full UTF8 is not supported + int cur_val_diff = round(blockchar_len * (hist_data[col] - current_bin) / row_bin_size) - 1; + if (cur_val_diff < 0) { + fputc(' ', file_out); + } else { + if (cur_val_diff >= blockchar_len) + cur_val_diff = blockchar_len - 1; + + fprintf(file_out, "%s", BLOCK_CHARS[cur_val_diff]); + } + } + fprintf(file_out, full_utf ? VERTICAL_LINE : "|"); + fputc(' ', file_out); + switch (i) { + case 9: fprintf(file_out, "Number of reads: %u", stats[tid].n_selected_reads); break; + case 8: if (stats[tid].n_reads - stats[tid].n_selected_reads > 0) fprintf(file_out, " (%i filtered)", stats[tid].n_reads - stats[tid].n_selected_reads); break; + case 7: fprintf(file_out, "Covered bases: %sbp", readable_bps(stats[tid].n_covered_bases, buf)); break; + case 6: fprintf(file_out, "Percent covered: %.4g%%", + 100.0 * stats[tid].n_covered_bases / region_len); break; + case 5: fprintf(file_out, "Mean coverage: %.3gx", + stats[tid].summed_coverage / region_len); break; + case 4: fprintf(file_out, "Mean baseQ: %.3g", + stats[tid].summed_baseQ/(double) stats[tid].summed_coverage); break; + case 3: fprintf(file_out, "Mean mapQ: %.3g", + stats[tid].summed_mapQ/(double) stats[tid].n_selected_reads); break; + case 1: fprintf(file_out, "Histo bin width: %sbp", + readable_bps(stats[tid].bin_width, buf)); break; + case 0: fprintf(file_out, "Histo max bin: %.5g%%", max_val); break; + }; + fputc('\n', file_out); + } + + // print x axis. Could be made pretty for widths that are not divisible + // by 10 by variable spacing of the labels, instead of placing a label every 10 characters + char buf2[50]; + fprintf(file_out, " %s", center_text(readable_bps(stats[tid].beg + 1, buf), buf2, 10)); + int rest; + for (rest = 10; rest < 10*(hist_size/10); rest += 10) { + fprintf(file_out, "%s", center_text(readable_bps(stats[tid].beg + stats[tid].bin_width*rest, buf), buf2, 10)); + } + int last_padding = hist_size%10; + fprintf(file_out, "%*s%s", last_padding, " ", center_text(readable_bps(stats[tid].end, buf), buf2, 10)); + fprintf(file_out, "\n"); +} + +int main_coverage(int argc, char *argv[]) { + int status = EXIT_SUCCESS; + + int ret, tid = -1, old_tid = -1, pos, i, j; + + int max_depth = 1000000; + int opt_min_baseQ = 0; + int opt_min_mapQ = 0; + int opt_min_len = 0; + int opt_n_bins = 50; + bool opt_full_width = true; + char *opt_output_file = NULL; + bam_aux_t **data = NULL; + bam_mplp_t mplp = NULL; + const bam_pileup1_t **plp = NULL; + uint32_t *hist = NULL; + stats_aux_t *stats = NULL; + char *opt_reg = 0; // specified region + char *opt_file_list = NULL; + int n_bam_files = 0; + char **fn = NULL; + int fail_flags = (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP); // Default fail flags + int required_flags = 0; + + int *n_plp = NULL; + sam_hdr_t *h = NULL; // BAM header of the 1st input + + bool opt_print_header = true; + bool opt_print_tabular = true; + bool opt_print_histogram = false; + bool opt_full_utf = true; + + FILE *file_out = stdout; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '-'), + {"rf", required_argument, NULL, 1}, // require flag + {"ff", required_argument, NULL, 2}, // filter flag + {"incl-flags", required_argument, NULL, 1}, // require flag + {"excl-flags", required_argument, NULL, 2}, // filter flag + {"bam-list", required_argument, NULL, 'b'}, + {"min-read-len", required_argument, NULL, 'l'}, + {"min-MQ", required_argument, NULL, 'q'}, + {"min-mq", required_argument, NULL, 'q'}, + {"min-BQ", required_argument, NULL, 'Q'}, + {"min-bq", required_argument, NULL, 'Q'}, + {"histogram", no_argument, NULL, 'm'}, + {"ascii", no_argument, NULL, 'A'}, + {"output", required_argument, NULL, 'o'}, + {"no-header", no_argument, NULL, 'H'}, + {"n-bins", required_argument, NULL, 'w'}, + {"region", required_argument, NULL, 'r'}, + {"help", no_argument, NULL, 'h'}, + {"depth", required_argument, NULL, 'd'}, + { NULL, 0, NULL, 0 } + }; + + // parse the command line + int c; + opterr = 0; + while ((c = getopt_long(argc, argv, "Ao:l:q:Q:hHw:r:b:md:", lopts, NULL)) != -1) { + switch (c) { + case 1: + if ((required_flags = bam_str2flag(optarg)) < 0) { + fprintf(stderr,"Could not parse --rf %s\n", optarg); return EXIT_FAILURE; + }; break; + case 2: + if ((fail_flags = bam_str2flag(optarg)) < 0) { + fprintf(stderr,"Could not parse --ff %s\n", optarg); return EXIT_FAILURE; + }; break; + case 'o': opt_output_file = optarg; opt_full_width = false; break; + case 'l': opt_min_len = atoi(optarg); break; + case 'q': opt_min_mapQ = atoi(optarg); break; + case 'Q': opt_min_baseQ = atoi(optarg); break; + case 'd': max_depth = atoi(optarg); break; // maximum coverage depth + case 'w': opt_n_bins = atoi(optarg); opt_full_width = false; + opt_print_histogram = true; opt_print_tabular = false; + break; + case 'r': opt_reg = optarg; break; // parsing a region requires a BAM header (strdup unnecessary) + case 'b': opt_file_list = optarg; break; + case 'm': opt_print_histogram = true; opt_print_tabular = false; break; + case 'A': opt_full_utf = false; + opt_print_histogram = true; opt_print_tabular = false; + break; + case 'H': opt_print_header = false; break; + case 'h': return usage(); + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + if (optopt != '?') { // '-?' appeared on command line + if (optopt) { // Bad short option + print_error("coverage", "invalid option -- '%c'", optopt); + } else { // Bad long option + // Do our best. There is no good solution to finding + // out what the bad option was. + // See, e.g. https://stackoverflow.com/questions/2723888/where-does-getopt-long-store-an-unrecognized-option + if (optind > 0 && strncmp(argv[optind - 1], "--", 2) == 0) { + print_error("coverage", "unrecognised option '%s'", + argv[optind - 1]); + } + } + } + return usage(); + } + } + if (optind == argc && !opt_file_list) + return usage(); + + // output file provided by user + if (opt_output_file != NULL && strcmp(opt_output_file,"-")!=0) { + file_out = fopen( opt_output_file, "w" ); + if (file_out == NULL) { + print_error_errno("coverage", "Cannot open \"%s\" for writing.", opt_output_file); + return EXIT_FAILURE; + } + } + + if (opt_n_bins <= 0 || opt_full_width) { + // get number of columns of terminal + const char* env_columns = getenv("COLUMNS"); + int columns = 0; + if (env_columns == NULL) { +#ifdef _WIN32 + CONSOLE_SCREEN_BUFFER_INFO csbi; + if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) { + columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; + } +#elif defined TIOCGWINSZ + struct winsize w; + if (ioctl(2, TIOCGWINSZ, &w) == 0) + columns = w.ws_col; +#endif + } else { + columns = atoi(env_columns); // atoi(NULL) returns 0 + } + + if (columns > 60) { + opt_n_bins = columns - 40; + } else { + opt_n_bins = 40; + } + } + + // setvbuf(file_out, NULL, _IONBF, 0); //turn off buffering + + // Open all BAM files + if (opt_file_list) { + // Read file names from opt_file_list into argv, and record the number of files in n_bam_files + if (read_file_list(opt_file_list, &n_bam_files, &fn)) { + print_error_errno("coverage", "Cannot open file list \"%s\".", opt_file_list); + return EXIT_FAILURE; + } + argv = fn; + optind = 0; + } else { + n_bam_files = argc - optind; // the number of BAMs on the command line + } + + data = (bam_aux_t **)calloc(n_bam_files, sizeof(bam_aux_t*)); // data[i] for the i-th BAM file + if (!data) { + print_error_errno("coverage", "Failed to allocate memory"); + status = EXIT_FAILURE; + goto coverage_end; + } + + for (i = 0; i < n_bam_files; ++i) { + int rf; + data[i] = (bam_aux_t *) calloc(1, sizeof(bam_aux_t)); + if (!data[i]) { + print_error_errno("coverage", "Failed to allocate memory"); + status = EXIT_FAILURE; + goto coverage_end; + } + data[i]->fp = sam_open_format(argv[optind+i], "r", &ga.in); // open BAM + + if (data[i]->fp == NULL) { + print_error_errno("coverage", "Could not open \"%s\"", argv[optind+i]); + status = EXIT_FAILURE; + goto coverage_end; + } + rf = SAM_FLAG | SAM_RNAME | SAM_POS | SAM_MAPQ | SAM_CIGAR | SAM_SEQ; + if (opt_min_baseQ) rf |= SAM_QUAL; + + // Set CRAM options on file handle - returns 0 on success + if (hts_set_opt(data[i]->fp, CRAM_OPT_REQUIRED_FIELDS, rf)) { + print_error("coverage", "Failed to set CRAM_OPT_REQUIRED_FIELDS value"); + status = EXIT_FAILURE; + goto coverage_end; + } + if (hts_set_opt(data[i]->fp, CRAM_OPT_DECODE_MD, 0)) { + print_error("coverage", "Failed to set CRAM_OPT_DECODE_MD value"); + status = EXIT_FAILURE; + goto coverage_end; + } + data[i]->min_mapQ = opt_min_mapQ; // set the mapQ filter + data[i]->min_len = opt_min_len; // set the qlen filter + data[i]->hdr = sam_hdr_read(data[i]->fp); // read the BAM header + data[i]->fail_flags = fail_flags; + data[i]->required_flags = required_flags; + if (data[i]->hdr == NULL) { + print_error_errno("coverage", "Could not read header for \"%s\"", argv[optind+i]); + status = EXIT_FAILURE; + goto coverage_end; + } + + // Lookup region if specified + if (opt_reg) { // if a region is specified + hts_idx_t *idx = sam_index_load(data[i]->fp, argv[optind+i]); // load the index + if (idx == NULL) { + print_error_errno("coverage", "Failed to load index for \"%s\"", argv[optind+i]); + status = EXIT_FAILURE; + goto coverage_end; + } + data[i]->iter = sam_itr_querys(idx, data[i]->hdr, opt_reg); // set the iterator + hts_idx_destroy(idx); // the index is not needed any more; free the memory + if (data[i]->iter == NULL) { + print_error("coverage", "Failed to parse region \"%s\". Check the region format or region name presence in the file \"%s\"", opt_reg, argv[optind+i]); + status = EXIT_FAILURE; + goto coverage_end; + } + } + } + + if (opt_print_tabular && opt_print_header) + fputs("#rname\tstartpos\tendpos\tnumreads\tcovbases\tcoverage\tmeandepth\tmeanbaseq\tmeanmapq\n", file_out); + + h = data[0]->hdr; // easy access to the header of the 1st BAM + int n_targets = sam_hdr_nref(h); + stats = calloc(n_targets, sizeof(stats_aux_t)); + if (!stats) { + print_error_errno("coverage", "Failed to allocate memory"); + status = EXIT_FAILURE; + goto coverage_end; + } + + int64_t n_bins = opt_n_bins; + if (opt_reg) { + stats_aux_t *s = stats + data[0]->iter->tid; + s->beg = data[0]->iter->beg; // and to the parsed region coordinates + s->end = data[0]->iter->end; + if (s->end == HTS_POS_MAX) { + s->end = sam_hdr_tid2len(h, data[0]->iter->tid); + } + if (opt_n_bins > s->end - s->beg) { + n_bins = s->end - s->beg; + } + s->bin_width = (s->end-s->beg) / (n_bins > 0 ? n_bins : 1); + } + + for (i=0; istats = stats; + + int64_t current_bin = 0; + + // the core multi-pileup loop + mplp = bam_mplp_init(n_bam_files, read_bam, (void**)data); // initialization + if (max_depth > 0) + bam_mplp_set_maxcnt(mplp, max_depth); // set maximum coverage depth + else if (!max_depth) + bam_mplp_set_maxcnt(mplp, INT_MAX); + + + // Extra info for histogram and coverage counting + hist = (uint32_t*) calloc(opt_n_bins, sizeof(uint32_t)); + n_plp = (int*) calloc(n_bam_files, sizeof(int*)); // n_plp[i] is the number of covering reads from the i-th BAM + plp = (const bam_pileup1_t**) calloc(n_bam_files, sizeof(bam_pileup1_t*)); // plp[i] points to the array of covering reads (internal in mplp) + if (!hist || !n_plp || !plp) { + print_error_errno("coverage", "Failed to allocate memory"); + status = EXIT_FAILURE; + goto coverage_end; + } + while ((ret=bam_mplp_auto(mplp, &tid, &pos, n_plp, plp)) > 0) { // come to the next covered position + + if (tid != old_tid) { // Next target sequence + if (old_tid >= 0) { + if (opt_print_histogram) { + print_hist(file_out, h, stats, old_tid, hist, n_bins, opt_full_utf); + fputc('\n', file_out); + } else if (opt_print_tabular) { + print_tabular_line(file_out, h, stats, old_tid); + } + + if (opt_print_histogram) + memset(hist, 0, n_bins*sizeof(uint32_t)); + } + + stats[tid].covered = true; + if (!opt_reg) + stats[tid].end = sam_hdr_tid2len(h, tid); + + if (opt_print_histogram) { + n_bins = opt_n_bins > stats[tid].end-stats[tid].beg? stats[tid].end-stats[tid].beg : opt_n_bins; + stats[tid].bin_width = (stats[tid].end-stats[tid].beg) / n_bins; + } + + old_tid = tid; + } + if (pos < stats[tid].beg || pos >= stats[tid].end) continue; // out of range; skip + if (tid >= n_targets) continue; // diff number of @SQ lines per file? + + if (opt_print_histogram) { + current_bin = (pos - stats[tid].beg) / stats[tid].bin_width; + } + + bool count_base = false; + for (i = 0; i < n_bam_files; ++i) { // base level filters have to go here + int depth_at_pos = n_plp[i]; + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = plp[i] + j; // DON'T modify plp[][] unless you really know + + if (p->is_del || p->is_refskip) --depth_at_pos; // having dels or refskips at tid:pos + else if (p->qpos < p->b->core.l_qseq && + bam_get_qual(p->b)[p->qpos] < opt_min_baseQ) --depth_at_pos; // low base quality + else + stats[tid].summed_baseQ += bam_get_qual(p->b)[p->qpos]; + } + if (depth_at_pos > 0) { + count_base = true; + stats[tid].summed_coverage += depth_at_pos; + } + // hist[current_bin] += depth_at_pos; // Add counts to the histogram here to have one based on coverage + //fprintf(file_out, "\t%d", n_plp[i] - m); // this the depth to output + } + if (count_base) { + stats[tid].n_covered_bases++; + if (opt_print_histogram && current_bin < n_bins) + ++(hist[current_bin]); // Histogram based on breadth of coverage + } + } + + if (tid == -1 && opt_reg && *opt_reg != '*') + // Region specified but no data covering it. + tid = data[0]->iter->tid; + + if (tid < n_targets && tid >=0) { + if (opt_print_histogram) { + print_hist(file_out, h, stats, tid, hist, n_bins, opt_full_utf); + } else if (opt_print_tabular) { + print_tabular_line(file_out, h, stats, tid); + } + } + + + if (!opt_reg && opt_print_tabular) { + for (i = 0; i < n_targets; ++i) { + if (!stats[i].covered) { + stats[i].end = sam_hdr_tid2len(h, i); + print_tabular_line(file_out, h, stats, i); + } + } + } + + if (ret < 0) status = EXIT_FAILURE; + +coverage_end: + if (n_plp) free(n_plp); + if (plp) free(plp); + if (mplp) bam_mplp_destroy(mplp); + + if (hist) free(hist); + if (stats) free(stats); + + // Close files and free data structures + if (!(file_out == stdout || fclose(file_out) == 0)) { + if (status == EXIT_SUCCESS) { + print_error_errno("coverage", "error on closing \"%s\"", + (opt_output_file && strcmp(opt_output_file, "-") != 0? + opt_output_file : "stdout")); + status = EXIT_FAILURE; + } + } + + if (data) { + for (i = 0; i < n_bam_files && data[i]; ++i) { + sam_hdr_destroy(data[i]->hdr); + if (data[i]->fp) sam_close(data[i]->fp); + hts_itr_destroy(data[i]->iter); + free(data[i]); + } + free(data); + } + + if (opt_file_list && fn) { + for (i = 0; i < n_bam_files; ++i) + free(fn[i]); + free(fn); + } + sam_global_args_free(&ga); + + return status; +} + +#ifdef _MAIN_BAMCOV +int main(int argc, char *argv[]) { + return main_coverage(argc, argv); +} +#endif diff --git a/samtools/coverage.c.pysam.c b/samtools/coverage.c.pysam.c new file mode 100644 index 0000000..894f4ac --- /dev/null +++ b/samtools/coverage.c.pysam.c @@ -0,0 +1,685 @@ +#include "samtools.pysam.h" + +/* coverage.c -- samtools coverage subcommand + + Copyright (C) 2018,2019 Florian Breitwieser + Portions copyright (C) 2019-2021 Genome Research Ltd. + + Author: Florian P Breitwieser + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* This program calculates coverage from multiple BAMs + * simultaneously, to achieve random access and to use the BED interface. + * To compile this program separately, you may: + * + * gcc -g -O2 -Wall -o bamcov -D_MAIN_BAMCOV coverage.c -lhts -lz + */ + +// C headers +#include + +#include +#include +#include +#include // variadic functions +#include // INT_MAX +#include // round +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "htslib/sam.h" +#include "htslib/hts.h" +#include "samtools.h" +#include "sam_opts.h" + +typedef struct { // auxiliary data structure to hold stats on coverage + unsigned long long n_covered_bases; + unsigned long long summed_coverage; + unsigned long long summed_baseQ; + unsigned long long summed_mapQ; + unsigned int n_reads; + unsigned int n_selected_reads; + bool covered; + hts_pos_t beg; + hts_pos_t end; + int64_t bin_width; +} stats_aux_t; + +typedef struct { // auxiliary data structure to hold a BAM file + samFile *fp; // file handle + sam_hdr_t *hdr; // file header + hts_itr_t *iter; // iterator to a region - NULL for us by default + int min_mapQ; // mapQ filter + int min_len; // length filter + int fail_flags; + int required_flags; + stats_aux_t *stats; +} bam_aux_t; + +#if __STDC_VERSION__ >= 199901L +#define VERTICAL_LINE "\u2502" // BOX DRAWINGS LIGHT VERTICAL + +// UTF8 specifies block characters in eights going from \u2581 (lower one eight block) to \u2588 (full block) +// https://en.wikipedia.org/wiki/Block_Elements +// LOWER ONE EIGHTH BLOCK … FULL BLOCK +static const char *const BLOCK_CHARS8[8] = {"\u2581", "\u2582", "\u2583", "\u2584", "\u2585", "\u2586", "\u2587", "\u2588"}; +// In some terminals / with some fonts not all UTF8 block characters are supported (e.g. Putty). Use only half and full block for those +static const char *const BLOCK_CHARS2[2] = {".", ":"}; + +#else + +// Fall back to explicit UTF-8 encodings of the same characters +#define VERTICAL_LINE "\xE2\x94\x82" + +static const char *const BLOCK_CHARS8[8] = { + "\xE2\x96\x81", "\xE2\x96\x82", "\xE2\x96\x83", "\xE2\x96\x84", + "\xE2\x96\x85", "\xE2\x96\x86", "\xE2\x96\x87", "\xE2\x96\x88" }; + +static const char *const BLOCK_CHARS2[2] = {".", ":"}; + +#endif + +// in bam_plcmd.c +int read_file_list(const char *file_list, int *n, char **argv[]); + +static int usage() { + fprintf(samtools_stdout, "Usage: samtools coverage [options] in1.bam [in2.bam [...]]\n\n" + "Input options:\n" + " -b, --bam-list FILE list of input BAM filenames, one per line\n" + " -l, --min-read-len INT ignore reads shorter than INT bp [0]\n" + " -q, --min-MQ INT mapping quality threshold [0]\n" + " -Q, --min-BQ INT base quality threshold [0]\n" + " --rf required flags: skip reads with mask bits unset []\n" + " --ff filter flags: skip reads with mask bits set \n" + " [UNMAP,SECONDARY,QCFAIL,DUP]\n" + " -d, --depth INT maximum allowed coverage depth [1000000].\n" + " If 0, depth is set to the maximum integer value,\n" + " effectively removing any depth limit.\n" + "Output options:\n" + " -m, --histogram show histogram instead of tabular output\n" + " -A, --ascii show only ASCII characters in histogram\n" + " -o, --output FILE write output to FILE [samtools_stdout]\n" + " -H, --no-header don't print a header in tabular mode\n" + " -w, --n-bins INT number of bins in histogram [terminal width - 40]\n" + " -r, --region REG show specified region. Format: chr:start-end. \n" + " -h, --help help (this page)\n"); + + fprintf(samtools_stdout, "\nGeneric options:\n"); + sam_global_opt_help(samtools_stdout, "-.--.--."); + + fprintf(samtools_stdout, + "\nSee manpage for additional details.\n" + " rname Reference name / chromosome\n" + " startpos Start position\n" + " endpos End position (or sequence length)\n" + " numreads Number reads aligned to the region (after filtering)\n" + " covbases Number of covered bases with depth >= 1\n" + " coverage Percentage of covered bases [0..100]\n" + " meandepth Mean depth of coverage\n" + " meanbaseq Mean baseQ in covered region\n" + " meanmapq Mean mapQ of selected reads\n" + ); + + return EXIT_SUCCESS; +} + +static char* center_text(char *text, char *buf, int width) { + int len = strlen(text); + assert(len <= width); + int padding = (width - len) / 2; + int padding_ex = (width - len) % 2; + if (padding >= 1) + sprintf(buf, " %*s%*s", len+padding, text, padding-1+padding_ex, " "); + else + sprintf(buf, "%s", text); + + return buf; +} + +static char* readable_bps(double base_pairs, char *buf) { + const char* units[] = {"", "K", "M", "G", "T"}; + int i = 0; + while (base_pairs >= 1000 && i < (sizeof(units)/sizeof(units[0]) - 1)) { + base_pairs /= 1000; + i++; + } + sprintf(buf, "%.*f%s", i, base_pairs, units[i]); + return buf; +} + +// read one alignment from one BAM file +static int read_bam(void *data, bam1_t *b) { + bam_aux_t *aux = (bam_aux_t*)data; // data in fact is a pointer to an auxiliary structure + int nref = sam_hdr_nref(aux->hdr); + int ret; + while (1) { + if((ret = aux->iter? sam_itr_next(aux->fp, aux->iter, b) : sam_read1(aux->fp, aux->hdr, b)) < 0) break; + if (b->core.tid >= 0 && b->core.tid < nref) + aux->stats[b->core.tid].n_reads++; + + if ( aux->fail_flags && (b->core.flag & aux->fail_flags) ) continue; + if ( aux->required_flags && !(b->core.flag & aux->required_flags) ) continue; + if ( b->core.qual < aux->min_mapQ ) continue; + if ( aux->min_len && bam_cigar2qlen(b->core.n_cigar, bam_get_cigar(b)) < aux->min_len ) continue; + if (b->core.tid >= 0 && b->core.tid < nref) { + aux->stats[b->core.tid].n_selected_reads++; + aux->stats[b->core.tid].summed_mapQ += b->core.qual; + } + break; + } + return ret; +} + +void print_tabular_line(FILE *file_out, const sam_hdr_t *h, const stats_aux_t *stats, int tid) { + fputs(sam_hdr_tid2name(h, tid), file_out); + double region_len = (double) stats[tid].end - stats[tid].beg; + fprintf(file_out, "\t%"PRId64"\t%"PRId64"\t%u\t%llu\t%g\t%g\t%.3g\t%.3g\n", + stats[tid].beg+1, + stats[tid].end, + stats[tid].n_selected_reads, + stats[tid].n_covered_bases, + 100.0 * stats[tid].n_covered_bases / region_len, + stats[tid].summed_coverage / region_len, + stats[tid].summed_coverage > 0? stats[tid].summed_baseQ/(double) stats[tid].summed_coverage : 0, + stats[tid].n_selected_reads > 0? stats[tid].summed_mapQ/(double) stats[tid].n_selected_reads : 0 + ); +} + +void print_hist(FILE *file_out, const sam_hdr_t *h, const stats_aux_t *stats, int tid, const uint32_t *hist, + const int hist_size, const bool full_utf) { + int i, col; + bool show_percentiles = false; + const int n_rows = 10; + const char * const * BLOCK_CHARS = full_utf? BLOCK_CHARS8 : BLOCK_CHARS2; + const int blockchar_len = full_utf? 8 : 2; + double region_len = stats[tid].end - stats[tid].beg; + + // Calculate histogram that contains percent covered + double hist_data[hist_size]; + double max_val = 0.0; + for (i = 0; i < hist_size; ++i) { + hist_data[i] = 100 * hist[i] / (double) stats[tid].bin_width; + if (hist_data[i] > max_val) max_val = hist_data[i]; + } + + char buf[30]; + fprintf(file_out, "%s (%sbp)\n", sam_hdr_tid2name(h, tid), readable_bps(sam_hdr_tid2len(h, tid), buf)); + + double row_bin_size = max_val / (double) n_rows; + for (i = n_rows-1; i >= 0; --i) { + double current_bin = row_bin_size * i; + if (show_percentiles) { + fprintf(file_out, ">%3i%% ", i*10); + } else { + fprintf(file_out, ">%7.2f%% ", current_bin); + } + fprintf(file_out, full_utf ? VERTICAL_LINE : "|"); + for (col = 0; col < hist_size; ++col) { + // get the difference in eights, or halfs when full UTF8 is not supported + int cur_val_diff = round(blockchar_len * (hist_data[col] - current_bin) / row_bin_size) - 1; + if (cur_val_diff < 0) { + fputc(' ', file_out); + } else { + if (cur_val_diff >= blockchar_len) + cur_val_diff = blockchar_len - 1; + + fprintf(file_out, "%s", BLOCK_CHARS[cur_val_diff]); + } + } + fprintf(file_out, full_utf ? VERTICAL_LINE : "|"); + fputc(' ', file_out); + switch (i) { + case 9: fprintf(file_out, "Number of reads: %u", stats[tid].n_selected_reads); break; + case 8: if (stats[tid].n_reads - stats[tid].n_selected_reads > 0) fprintf(file_out, " (%i filtered)", stats[tid].n_reads - stats[tid].n_selected_reads); break; + case 7: fprintf(file_out, "Covered bases: %sbp", readable_bps(stats[tid].n_covered_bases, buf)); break; + case 6: fprintf(file_out, "Percent covered: %.4g%%", + 100.0 * stats[tid].n_covered_bases / region_len); break; + case 5: fprintf(file_out, "Mean coverage: %.3gx", + stats[tid].summed_coverage / region_len); break; + case 4: fprintf(file_out, "Mean baseQ: %.3g", + stats[tid].summed_baseQ/(double) stats[tid].summed_coverage); break; + case 3: fprintf(file_out, "Mean mapQ: %.3g", + stats[tid].summed_mapQ/(double) stats[tid].n_selected_reads); break; + case 1: fprintf(file_out, "Histo bin width: %sbp", + readable_bps(stats[tid].bin_width, buf)); break; + case 0: fprintf(file_out, "Histo max bin: %.5g%%", max_val); break; + }; + fputc('\n', file_out); + } + + // print x axis. Could be made pretty for widths that are not divisible + // by 10 by variable spacing of the labels, instead of placing a label every 10 characters + char buf2[50]; + fprintf(file_out, " %s", center_text(readable_bps(stats[tid].beg + 1, buf), buf2, 10)); + int rest; + for (rest = 10; rest < 10*(hist_size/10); rest += 10) { + fprintf(file_out, "%s", center_text(readable_bps(stats[tid].beg + stats[tid].bin_width*rest, buf), buf2, 10)); + } + int last_padding = hist_size%10; + fprintf(file_out, "%*s%s", last_padding, " ", center_text(readable_bps(stats[tid].end, buf), buf2, 10)); + fprintf(file_out, "\n"); +} + +int main_coverage(int argc, char *argv[]) { + int status = EXIT_SUCCESS; + + int ret, tid = -1, old_tid = -1, pos, i, j; + + int max_depth = 1000000; + int opt_min_baseQ = 0; + int opt_min_mapQ = 0; + int opt_min_len = 0; + int opt_n_bins = 50; + bool opt_full_width = true; + char *opt_output_file = NULL; + bam_aux_t **data = NULL; + bam_mplp_t mplp = NULL; + const bam_pileup1_t **plp = NULL; + uint32_t *hist = NULL; + stats_aux_t *stats = NULL; + char *opt_reg = 0; // specified region + char *opt_file_list = NULL; + int n_bam_files = 0; + char **fn = NULL; + int fail_flags = (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP); // Default fail flags + int required_flags = 0; + + int *n_plp = NULL; + sam_hdr_t *h = NULL; // BAM header of the 1st input + + bool opt_print_header = true; + bool opt_print_tabular = true; + bool opt_print_histogram = false; + bool opt_full_utf = true; + + FILE *file_out = samtools_stdout; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '-'), + {"rf", required_argument, NULL, 1}, // require flag + {"ff", required_argument, NULL, 2}, // filter flag + {"incl-flags", required_argument, NULL, 1}, // require flag + {"excl-flags", required_argument, NULL, 2}, // filter flag + {"bam-list", required_argument, NULL, 'b'}, + {"min-read-len", required_argument, NULL, 'l'}, + {"min-MQ", required_argument, NULL, 'q'}, + {"min-mq", required_argument, NULL, 'q'}, + {"min-BQ", required_argument, NULL, 'Q'}, + {"min-bq", required_argument, NULL, 'Q'}, + {"histogram", no_argument, NULL, 'm'}, + {"ascii", no_argument, NULL, 'A'}, + {"output", required_argument, NULL, 'o'}, + {"no-header", no_argument, NULL, 'H'}, + {"n-bins", required_argument, NULL, 'w'}, + {"region", required_argument, NULL, 'r'}, + {"help", no_argument, NULL, 'h'}, + {"depth", required_argument, NULL, 'd'}, + { NULL, 0, NULL, 0 } + }; + + // parse the command line + int c; + opterr = 0; + while ((c = getopt_long(argc, argv, "Ao:l:q:Q:hHw:r:b:md:", lopts, NULL)) != -1) { + switch (c) { + case 1: + if ((required_flags = bam_str2flag(optarg)) < 0) { + fprintf(samtools_stderr,"Could not parse --rf %s\n", optarg); return EXIT_FAILURE; + }; break; + case 2: + if ((fail_flags = bam_str2flag(optarg)) < 0) { + fprintf(samtools_stderr,"Could not parse --ff %s\n", optarg); return EXIT_FAILURE; + }; break; + case 'o': opt_output_file = optarg; opt_full_width = false; break; + case 'l': opt_min_len = atoi(optarg); break; + case 'q': opt_min_mapQ = atoi(optarg); break; + case 'Q': opt_min_baseQ = atoi(optarg); break; + case 'd': max_depth = atoi(optarg); break; // maximum coverage depth + case 'w': opt_n_bins = atoi(optarg); opt_full_width = false; + opt_print_histogram = true; opt_print_tabular = false; + break; + case 'r': opt_reg = optarg; break; // parsing a region requires a BAM header (strdup unnecessary) + case 'b': opt_file_list = optarg; break; + case 'm': opt_print_histogram = true; opt_print_tabular = false; break; + case 'A': opt_full_utf = false; + opt_print_histogram = true; opt_print_tabular = false; + break; + case 'H': opt_print_header = false; break; + case 'h': return usage(); + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + if (optopt != '?') { // '-?' appeared on command line + if (optopt) { // Bad short option + print_error("coverage", "invalid option -- '%c'", optopt); + } else { // Bad long option + // Do our best. There is no good solution to finding + // out what the bad option was. + // See, e.g. https://stackoverflow.com/questions/2723888/where-does-getopt-long-store-an-unrecognized-option + if (optind > 0 && strncmp(argv[optind - 1], "--", 2) == 0) { + print_error("coverage", "unrecognised option '%s'", + argv[optind - 1]); + } + } + } + return usage(); + } + } + if (optind == argc && !opt_file_list) + return usage(); + + // output file provided by user + if (opt_output_file != NULL && strcmp(opt_output_file,"-")!=0) { + file_out = fopen( opt_output_file, "w" ); + if (file_out == NULL) { + print_error_errno("coverage", "Cannot open \"%s\" for writing.", opt_output_file); + return EXIT_FAILURE; + } + } + + if (opt_n_bins <= 0 || opt_full_width) { + // get number of columns of terminal + const char* env_columns = getenv("COLUMNS"); + int columns = 0; + if (env_columns == NULL) { +#ifdef _WIN32 + CONSOLE_SCREEN_BUFFER_INFO csbi; + if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) { + columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; + } +#elif defined TIOCGWINSZ + struct winsize w; + if (ioctl(2, TIOCGWINSZ, &w) == 0) + columns = w.ws_col; +#endif + } else { + columns = atoi(env_columns); // atoi(NULL) returns 0 + } + + if (columns > 60) { + opt_n_bins = columns - 40; + } else { + opt_n_bins = 40; + } + } + + // setvbuf(file_out, NULL, _IONBF, 0); //turn off buffering + + // Open all BAM files + if (opt_file_list) { + // Read file names from opt_file_list into argv, and record the number of files in n_bam_files + if (read_file_list(opt_file_list, &n_bam_files, &fn)) { + print_error_errno("coverage", "Cannot open file list \"%s\".", opt_file_list); + return EXIT_FAILURE; + } + argv = fn; + optind = 0; + } else { + n_bam_files = argc - optind; // the number of BAMs on the command line + } + + data = (bam_aux_t **)calloc(n_bam_files, sizeof(bam_aux_t*)); // data[i] for the i-th BAM file + if (!data) { + print_error_errno("coverage", "Failed to allocate memory"); + status = EXIT_FAILURE; + goto coverage_end; + } + + for (i = 0; i < n_bam_files; ++i) { + int rf; + data[i] = (bam_aux_t *) calloc(1, sizeof(bam_aux_t)); + if (!data[i]) { + print_error_errno("coverage", "Failed to allocate memory"); + status = EXIT_FAILURE; + goto coverage_end; + } + data[i]->fp = sam_open_format(argv[optind+i], "r", &ga.in); // open BAM + + if (data[i]->fp == NULL) { + print_error_errno("coverage", "Could not open \"%s\"", argv[optind+i]); + status = EXIT_FAILURE; + goto coverage_end; + } + rf = SAM_FLAG | SAM_RNAME | SAM_POS | SAM_MAPQ | SAM_CIGAR | SAM_SEQ; + if (opt_min_baseQ) rf |= SAM_QUAL; + + // Set CRAM options on file handle - returns 0 on success + if (hts_set_opt(data[i]->fp, CRAM_OPT_REQUIRED_FIELDS, rf)) { + print_error("coverage", "Failed to set CRAM_OPT_REQUIRED_FIELDS value"); + status = EXIT_FAILURE; + goto coverage_end; + } + if (hts_set_opt(data[i]->fp, CRAM_OPT_DECODE_MD, 0)) { + print_error("coverage", "Failed to set CRAM_OPT_DECODE_MD value"); + status = EXIT_FAILURE; + goto coverage_end; + } + data[i]->min_mapQ = opt_min_mapQ; // set the mapQ filter + data[i]->min_len = opt_min_len; // set the qlen filter + data[i]->hdr = sam_hdr_read(data[i]->fp); // read the BAM header + data[i]->fail_flags = fail_flags; + data[i]->required_flags = required_flags; + if (data[i]->hdr == NULL) { + print_error_errno("coverage", "Could not read header for \"%s\"", argv[optind+i]); + status = EXIT_FAILURE; + goto coverage_end; + } + + // Lookup region if specified + if (opt_reg) { // if a region is specified + hts_idx_t *idx = sam_index_load(data[i]->fp, argv[optind+i]); // load the index + if (idx == NULL) { + print_error_errno("coverage", "Failed to load index for \"%s\"", argv[optind+i]); + status = EXIT_FAILURE; + goto coverage_end; + } + data[i]->iter = sam_itr_querys(idx, data[i]->hdr, opt_reg); // set the iterator + hts_idx_destroy(idx); // the index is not needed any more; free the memory + if (data[i]->iter == NULL) { + print_error("coverage", "Failed to parse region \"%s\". Check the region format or region name presence in the file \"%s\"", opt_reg, argv[optind+i]); + status = EXIT_FAILURE; + goto coverage_end; + } + } + } + + if (opt_print_tabular && opt_print_header) + fputs("#rname\tstartpos\tendpos\tnumreads\tcovbases\tcoverage\tmeandepth\tmeanbaseq\tmeanmapq\n", file_out); + + h = data[0]->hdr; // easy access to the header of the 1st BAM + int n_targets = sam_hdr_nref(h); + stats = calloc(n_targets, sizeof(stats_aux_t)); + if (!stats) { + print_error_errno("coverage", "Failed to allocate memory"); + status = EXIT_FAILURE; + goto coverage_end; + } + + int64_t n_bins = opt_n_bins; + if (opt_reg) { + stats_aux_t *s = stats + data[0]->iter->tid; + s->beg = data[0]->iter->beg; // and to the parsed region coordinates + s->end = data[0]->iter->end; + if (s->end == HTS_POS_MAX) { + s->end = sam_hdr_tid2len(h, data[0]->iter->tid); + } + if (opt_n_bins > s->end - s->beg) { + n_bins = s->end - s->beg; + } + s->bin_width = (s->end-s->beg) / (n_bins > 0 ? n_bins : 1); + } + + for (i=0; istats = stats; + + int64_t current_bin = 0; + + // the core multi-pileup loop + mplp = bam_mplp_init(n_bam_files, read_bam, (void**)data); // initialization + if (max_depth > 0) + bam_mplp_set_maxcnt(mplp, max_depth); // set maximum coverage depth + else if (!max_depth) + bam_mplp_set_maxcnt(mplp, INT_MAX); + + + // Extra info for histogram and coverage counting + hist = (uint32_t*) calloc(opt_n_bins, sizeof(uint32_t)); + n_plp = (int*) calloc(n_bam_files, sizeof(int*)); // n_plp[i] is the number of covering reads from the i-th BAM + plp = (const bam_pileup1_t**) calloc(n_bam_files, sizeof(bam_pileup1_t*)); // plp[i] points to the array of covering reads (internal in mplp) + if (!hist || !n_plp || !plp) { + print_error_errno("coverage", "Failed to allocate memory"); + status = EXIT_FAILURE; + goto coverage_end; + } + while ((ret=bam_mplp_auto(mplp, &tid, &pos, n_plp, plp)) > 0) { // come to the next covered position + + if (tid != old_tid) { // Next target sequence + if (old_tid >= 0) { + if (opt_print_histogram) { + print_hist(file_out, h, stats, old_tid, hist, n_bins, opt_full_utf); + fputc('\n', file_out); + } else if (opt_print_tabular) { + print_tabular_line(file_out, h, stats, old_tid); + } + + if (opt_print_histogram) + memset(hist, 0, n_bins*sizeof(uint32_t)); + } + + stats[tid].covered = true; + if (!opt_reg) + stats[tid].end = sam_hdr_tid2len(h, tid); + + if (opt_print_histogram) { + n_bins = opt_n_bins > stats[tid].end-stats[tid].beg? stats[tid].end-stats[tid].beg : opt_n_bins; + stats[tid].bin_width = (stats[tid].end-stats[tid].beg) / n_bins; + } + + old_tid = tid; + } + if (pos < stats[tid].beg || pos >= stats[tid].end) continue; // out of range; skip + if (tid >= n_targets) continue; // diff number of @SQ lines per file? + + if (opt_print_histogram) { + current_bin = (pos - stats[tid].beg) / stats[tid].bin_width; + } + + bool count_base = false; + for (i = 0; i < n_bam_files; ++i) { // base level filters have to go here + int depth_at_pos = n_plp[i]; + for (j = 0; j < n_plp[i]; ++j) { + const bam_pileup1_t *p = plp[i] + j; // DON'T modify plp[][] unless you really know + + if (p->is_del || p->is_refskip) --depth_at_pos; // having dels or refskips at tid:pos + else if (p->qpos < p->b->core.l_qseq && + bam_get_qual(p->b)[p->qpos] < opt_min_baseQ) --depth_at_pos; // low base quality + else + stats[tid].summed_baseQ += bam_get_qual(p->b)[p->qpos]; + } + if (depth_at_pos > 0) { + count_base = true; + stats[tid].summed_coverage += depth_at_pos; + } + // hist[current_bin] += depth_at_pos; // Add counts to the histogram here to have one based on coverage + //fprintf(file_out, "\t%d", n_plp[i] - m); // this the depth to output + } + if (count_base) { + stats[tid].n_covered_bases++; + if (opt_print_histogram && current_bin < n_bins) + ++(hist[current_bin]); // Histogram based on breadth of coverage + } + } + + if (tid == -1 && opt_reg && *opt_reg != '*') + // Region specified but no data covering it. + tid = data[0]->iter->tid; + + if (tid < n_targets && tid >=0) { + if (opt_print_histogram) { + print_hist(file_out, h, stats, tid, hist, n_bins, opt_full_utf); + } else if (opt_print_tabular) { + print_tabular_line(file_out, h, stats, tid); + } + } + + + if (!opt_reg && opt_print_tabular) { + for (i = 0; i < n_targets; ++i) { + if (!stats[i].covered) { + stats[i].end = sam_hdr_tid2len(h, i); + print_tabular_line(file_out, h, stats, i); + } + } + } + + if (ret < 0) status = EXIT_FAILURE; + +coverage_end: + if (n_plp) free(n_plp); + if (plp) free(plp); + if (mplp) bam_mplp_destroy(mplp); + + if (hist) free(hist); + if (stats) free(stats); + + // Close files and free data structures + if (!(file_out == samtools_stdout || fclose(file_out) == 0)) { + if (status == EXIT_SUCCESS) { + print_error_errno("coverage", "error on closing \"%s\"", + (opt_output_file && strcmp(opt_output_file, "-") != 0? + opt_output_file : "samtools_stdout")); + status = EXIT_FAILURE; + } + } + + if (data) { + for (i = 0; i < n_bam_files && data[i]; ++i) { + sam_hdr_destroy(data[i]->hdr); + if (data[i]->fp) sam_close(data[i]->fp); + hts_itr_destroy(data[i]->iter); + free(data[i]); + } + free(data); + } + + if (opt_file_list && fn) { + for (i = 0; i < n_bam_files; ++i) + free(fn[i]); + free(fn); + } + sam_global_args_free(&ga); + + return status; +} + +#ifdef _MAIN_BAMCOV +int samtools_coverage_main(int argc, char *argv[]) { + return main_coverage(argc, argv); +} +#endif diff --git a/samtools/cut_target.c b/samtools/cut_target.c new file mode 100644 index 0000000..7c8387c --- /dev/null +++ b/samtools/cut_target.c @@ -0,0 +1,257 @@ +/* cut_target.c -- targetcut subcommand. + + Copyright (C) 2011 Broad Institute. + Copyright (C) 2012-2013, 2015, 2016, 2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include "htslib/hts.h" +#include "htslib/sam.h" +#include "htslib/faidx.h" +#include "samtools.h" +#include "sam_opts.h" + +#define ERR_DEP 0.83 + +typedef struct { + int e[2][3], p[2][2]; +} score_param_t; + +/* Note that although the two matrics have 10 parameters in total, only 4 + * (probably 3) are free. Changing the scoring matrices in a sort of symmetric + * way will not change the result. */ +static score_param_t g_param = { {{0,0,0},{-4,1,6}}, {{0,-14000}, {0,0}} }; + +typedef struct { + int min_baseQ, tid, max_bases; + uint16_t *bases; + samFile *fp; + sam_hdr_t *h; + char *ref; + hts_pos_t len; + faidx_t *fai; + errmod_t *em; +} ct_t; + +static uint16_t gencns(ct_t *g, int n, const bam_pileup1_t *plp) +{ + int i, j, ret, tmp, k, sum[4], qual; + float q[16]; + if (n > g->max_bases) { // enlarge g->bases + g->max_bases = n; + kroundup32(g->max_bases); + g->bases = realloc(g->bases, (size_t) g->max_bases * 2); + } + for (i = k = 0; i < n; ++i) { + const bam_pileup1_t *p = plp + i; + uint8_t *seq; + int q, baseQ, b; + if (p->is_refskip || p->is_del) continue; + baseQ = bam_get_qual(p->b)[p->qpos]; + if (baseQ < g->min_baseQ) continue; + seq = bam_get_seq(p->b); + b = seq_nt16_int[bam_seqi(seq, p->qpos)]; + if (b > 3) continue; + q = baseQ < p->b->core.qual? baseQ : p->b->core.qual; + if (q < 4) q = 4; + if (q > 63) q = 63; + g->bases[k++] = q<<5 | bam_is_rev(p->b)<<4 | b; + } + if (k == 0) return 0; + errmod_cal(g->em, k, 4, g->bases, q); + for (i = 0; i < 4; ++i) sum[i] = (int)(q[i<<2|i] + .499) << 2 | i; + for (i = 1; i < 4; ++i) // insertion sort + for (j = i; j > 0 && sum[j] < sum[j-1]; --j) + tmp = sum[j], sum[j] = sum[j-1], sum[j-1] = tmp; + qual = (sum[1]>>2) - (sum[0]>>2); + k = k < 256? k : 255; + ret = (qual < 63? qual : 63) << 2 | (sum[0]&3); + return ret<<8|k; +} + +static void process_cns(sam_hdr_t *h, int tid, hts_pos_t l, uint16_t *cns) +{ + int64_t i, s; + int f[2][2], *prev, *curr, *swap_tmp; + uint8_t *b; // backtrack array + b = calloc(l, 1); + f[0][0] = f[0][1] = 0; + prev = f[0]; curr = f[1]; + // fill the backtrack matrix + for (i = 0; i < l; ++i) { + int c = (cns[i] == 0)? 0 : (cns[i]>>8 == 0)? 1 : 2; + int tmp0, tmp1; + // compute f[0] + tmp0 = prev[0] + g_param.e[0][c] + g_param.p[0][0]; // (s[i+1],s[i])=(0,0) + tmp1 = prev[1] + g_param.e[0][c] + g_param.p[1][0]; // (0,1) + if (tmp0 > tmp1) curr[0] = tmp0, b[i] = 0; + else curr[0] = tmp1, b[i] = 1; + // compute f[1] + tmp0 = prev[0] + g_param.e[1][c] + g_param.p[0][1]; // (s[i+1],s[i])=(1,0) + tmp1 = prev[1] + g_param.e[1][c] + g_param.p[1][1]; // (1,1) + if (tmp0 > tmp1) curr[1] = tmp0, b[i] |= 0<<1; + else curr[1] = tmp1, b[i] |= 1<<1; + // swap + swap_tmp = prev; prev = curr; curr = swap_tmp; + } + // backtrack + s = prev[0] > prev[1]? 0 : 1; + for (i = l - 1; i > 0; --i) { + b[i] |= s<<2; + s = b[i]>>s&1; + } + // print + for (i = 0, s = -1; i < INT64_MAX && i <= l; ++i) { + if (i == l || ((b[i]>>2&3) == 0 && s >= 0)) { + if (s >= 0) { + int64_t j; + printf("%s:%"PRId64"-%"PRId64"\t0\t%s\t%"PRId64"\t60\t%"PRId64"M\t*\t0\t0\t", sam_hdr_tid2name(h, tid), s+1, i, sam_hdr_tid2name(h, tid), s+1, i-s); + for (j = s; j < i; ++j) { + int c = cns[j]>>8; + if (c == 0) putchar('N'); + else putchar("ACGT"[c&3]); + } + putchar('\t'); + for (j = s; j < i; ++j) + putchar(33 + (cns[j]>>8>>2)); + putchar('\n'); + } + //if (s >= 0) printf("%s\t%d\t%d\t%d\n", h->target_name[tid], s, i, i - s); + s = -1; + } else if ((b[i]>>2&3) && s < 0) s = i; + } + free(b); +} + +static int read_aln(void *data, bam1_t *b) +{ + ct_t *g = (ct_t*)data; + int ret; + while (1) + { + ret = sam_read1(g->fp, g->h, b); + if ( ret<0 ) break; + if ( b->core.flag & (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP) ) continue; + if ( g->fai && b->core.tid >= 0 ) { + if (b->core.tid != g->tid) { // then load the sequence + free(g->ref); + g->ref = fai_fetch64(g->fai, sam_hdr_tid2name(g->h, b->core.tid), &g->len); + g->tid = b->core.tid; + } + sam_prob_realn(b, g->ref, g->len, 1<<1|1); + } + break; + } + return ret; +} + +int main_cut_target(int argc, char *argv[]) +{ + int c, tid, pos, n, lasttid = -1, usage = 0, status = EXIT_SUCCESS; + hts_pos_t l, max_l; + const bam_pileup1_t *p; + bam_plp_t plp; + uint16_t *cns; + ct_t g; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 'f', '-'), + { NULL, 0, NULL, 0 } + }; + + memset(&g, 0, sizeof(ct_t)); + g.min_baseQ = 13; g.tid = -1; + while ((c = getopt_long(argc, argv, "f:Q:i:o:0:1:2:", lopts, NULL)) >= 0) { + switch (c) { + case 'Q': g.min_baseQ = atoi(optarg); break; // quality cutoff + case 'i': g_param.p[0][1] = -atoi(optarg); break; // 0->1 transition (in) PENALTY + case '0': g_param.e[1][0] = atoi(optarg); break; // emission SCORE + case '1': g_param.e[1][1] = atoi(optarg); break; + case '2': g_param.e[1][2] = atoi(optarg); break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage=1; break; + } + } + if (ga.reference) { + g.fai = fai_load(ga.reference); + if (g.fai == 0) fprintf(stderr, "[%s] fail to load the fasta index.\n", __func__); + } + if (usage || argc == optind) { + fprintf(stderr, "Usage: samtools targetcut [-Q minQ] [-i inPen] [-0 em0] [-1 em1] [-2 em2] \n"); + sam_global_opt_help(stderr, "-.--f--."); + return 1; + } + l = max_l = 0; cns = 0; + g.fp = sam_open_format(argv[optind], "r", &ga.in); + if (g.fp == NULL) { + print_error_errno("targetcut", "can't open \"%s\"", argv[optind]); + return 1; + } + + g.h = sam_hdr_read(g.fp); + if (g.h == NULL) { + print_error("targetcut", "couldn't read header for \"%s\"", argv[optind]); + sam_close(g.fp); + return 1; + } + g.em = errmod_init(1. - ERR_DEP); + plp = bam_plp_init(read_aln, &g); + while ((p = bam_plp_auto(plp, &tid, &pos, &n)) != 0) { + if (tid < 0) break; + if (tid != lasttid) { // change of chromosome + if (cns) process_cns(g.h, lasttid, l, cns); + if (max_l < sam_hdr_tid2len(g.h, tid)) { + max_l = sam_hdr_tid2len(g.h, tid); + kroundup32(max_l); + cns = realloc(cns, max_l * 2); + } + l = sam_hdr_tid2len(g.h, tid); + memset(cns, 0, max_l * 2); + lasttid = tid; + } + cns[pos] = gencns(&g, n, p); + } + process_cns(g.h, lasttid, l, cns); + + if (n < 0) { + print_error("targetcut", "error reading from \"%s\"", argv[optind]); + status = EXIT_FAILURE; + } + + free(cns); + sam_hdr_destroy(g.h); + bam_plp_destroy(plp); + sam_close(g.fp); + if (g.fai) { + fai_destroy(g.fai); free(g.ref); + } + errmod_destroy(g.em); + free(g.bases); + sam_global_args_free(&ga); + return status; +} diff --git a/samtools/cut_target.c.pysam.c b/samtools/cut_target.c.pysam.c new file mode 100644 index 0000000..babe42b --- /dev/null +++ b/samtools/cut_target.c.pysam.c @@ -0,0 +1,259 @@ +#include "samtools.pysam.h" + +/* cut_target.c -- targetcut subcommand. + + Copyright (C) 2011 Broad Institute. + Copyright (C) 2012-2013, 2015, 2016, 2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include "htslib/hts.h" +#include "htslib/sam.h" +#include "htslib/faidx.h" +#include "samtools.h" +#include "sam_opts.h" + +#define ERR_DEP 0.83 + +typedef struct { + int e[2][3], p[2][2]; +} score_param_t; + +/* Note that although the two matrics have 10 parameters in total, only 4 + * (probably 3) are free. Changing the scoring matrices in a sort of symmetric + * way will not change the result. */ +static score_param_t g_param = { {{0,0,0},{-4,1,6}}, {{0,-14000}, {0,0}} }; + +typedef struct { + int min_baseQ, tid, max_bases; + uint16_t *bases; + samFile *fp; + sam_hdr_t *h; + char *ref; + hts_pos_t len; + faidx_t *fai; + errmod_t *em; +} ct_t; + +static uint16_t gencns(ct_t *g, int n, const bam_pileup1_t *plp) +{ + int i, j, ret, tmp, k, sum[4], qual; + float q[16]; + if (n > g->max_bases) { // enlarge g->bases + g->max_bases = n; + kroundup32(g->max_bases); + g->bases = realloc(g->bases, (size_t) g->max_bases * 2); + } + for (i = k = 0; i < n; ++i) { + const bam_pileup1_t *p = plp + i; + uint8_t *seq; + int q, baseQ, b; + if (p->is_refskip || p->is_del) continue; + baseQ = bam_get_qual(p->b)[p->qpos]; + if (baseQ < g->min_baseQ) continue; + seq = bam_get_seq(p->b); + b = seq_nt16_int[bam_seqi(seq, p->qpos)]; + if (b > 3) continue; + q = baseQ < p->b->core.qual? baseQ : p->b->core.qual; + if (q < 4) q = 4; + if (q > 63) q = 63; + g->bases[k++] = q<<5 | bam_is_rev(p->b)<<4 | b; + } + if (k == 0) return 0; + errmod_cal(g->em, k, 4, g->bases, q); + for (i = 0; i < 4; ++i) sum[i] = (int)(q[i<<2|i] + .499) << 2 | i; + for (i = 1; i < 4; ++i) // insertion sort + for (j = i; j > 0 && sum[j] < sum[j-1]; --j) + tmp = sum[j], sum[j] = sum[j-1], sum[j-1] = tmp; + qual = (sum[1]>>2) - (sum[0]>>2); + k = k < 256? k : 255; + ret = (qual < 63? qual : 63) << 2 | (sum[0]&3); + return ret<<8|k; +} + +static void process_cns(sam_hdr_t *h, int tid, hts_pos_t l, uint16_t *cns) +{ + int64_t i, s; + int f[2][2], *prev, *curr, *swap_tmp; + uint8_t *b; // backtrack array + b = calloc(l, 1); + f[0][0] = f[0][1] = 0; + prev = f[0]; curr = f[1]; + // fill the backtrack matrix + for (i = 0; i < l; ++i) { + int c = (cns[i] == 0)? 0 : (cns[i]>>8 == 0)? 1 : 2; + int tmp0, tmp1; + // compute f[0] + tmp0 = prev[0] + g_param.e[0][c] + g_param.p[0][0]; // (s[i+1],s[i])=(0,0) + tmp1 = prev[1] + g_param.e[0][c] + g_param.p[1][0]; // (0,1) + if (tmp0 > tmp1) curr[0] = tmp0, b[i] = 0; + else curr[0] = tmp1, b[i] = 1; + // compute f[1] + tmp0 = prev[0] + g_param.e[1][c] + g_param.p[0][1]; // (s[i+1],s[i])=(1,0) + tmp1 = prev[1] + g_param.e[1][c] + g_param.p[1][1]; // (1,1) + if (tmp0 > tmp1) curr[1] = tmp0, b[i] |= 0<<1; + else curr[1] = tmp1, b[i] |= 1<<1; + // swap + swap_tmp = prev; prev = curr; curr = swap_tmp; + } + // backtrack + s = prev[0] > prev[1]? 0 : 1; + for (i = l - 1; i > 0; --i) { + b[i] |= s<<2; + s = b[i]>>s&1; + } + // print + for (i = 0, s = -1; i < INT64_MAX && i <= l; ++i) { + if (i == l || ((b[i]>>2&3) == 0 && s >= 0)) { + if (s >= 0) { + int64_t j; + fprintf(samtools_stdout, "%s:%"PRId64"-%"PRId64"\t0\t%s\t%"PRId64"\t60\t%"PRId64"M\t*\t0\t0\t", sam_hdr_tid2name(h, tid), s+1, i, sam_hdr_tid2name(h, tid), s+1, i-s); + for (j = s; j < i; ++j) { + int c = cns[j]>>8; + if (c == 0) fputc('N', samtools_stdout); + else fputc("ACGT"[c&3], samtools_stdout); + } + fputc('\t', samtools_stdout); + for (j = s; j < i; ++j) + fputc(33 + (cns[j]>>8>>2), samtools_stdout); + fputc('\n', samtools_stdout); + } + //if (s >= 0) fprintf(samtools_stdout, "%s\t%d\t%d\t%d\n", h->target_name[tid], s, i, i - s); + s = -1; + } else if ((b[i]>>2&3) && s < 0) s = i; + } + free(b); +} + +static int read_aln(void *data, bam1_t *b) +{ + ct_t *g = (ct_t*)data; + int ret; + while (1) + { + ret = sam_read1(g->fp, g->h, b); + if ( ret<0 ) break; + if ( b->core.flag & (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP) ) continue; + if ( g->fai && b->core.tid >= 0 ) { + if (b->core.tid != g->tid) { // then load the sequence + free(g->ref); + g->ref = fai_fetch64(g->fai, sam_hdr_tid2name(g->h, b->core.tid), &g->len); + g->tid = b->core.tid; + } + sam_prob_realn(b, g->ref, g->len, 1<<1|1); + } + break; + } + return ret; +} + +int main_cut_target(int argc, char *argv[]) +{ + int c, tid, pos, n, lasttid = -1, usage = 0, status = EXIT_SUCCESS; + hts_pos_t l, max_l; + const bam_pileup1_t *p; + bam_plp_t plp; + uint16_t *cns; + ct_t g; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 'f', '-'), + { NULL, 0, NULL, 0 } + }; + + memset(&g, 0, sizeof(ct_t)); + g.min_baseQ = 13; g.tid = -1; + while ((c = getopt_long(argc, argv, "f:Q:i:o:0:1:2:", lopts, NULL)) >= 0) { + switch (c) { + case 'Q': g.min_baseQ = atoi(optarg); break; // quality cutoff + case 'i': g_param.p[0][1] = -atoi(optarg); break; // 0->1 transition (in) PENALTY + case '0': g_param.e[1][0] = atoi(optarg); break; // emission SCORE + case '1': g_param.e[1][1] = atoi(optarg); break; + case '2': g_param.e[1][2] = atoi(optarg); break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage=1; break; + } + } + if (ga.reference) { + g.fai = fai_load(ga.reference); + if (g.fai == 0) fprintf(samtools_stderr, "[%s] fail to load the fasta index.\n", __func__); + } + if (usage || argc == optind) { + fprintf(samtools_stderr, "Usage: samtools targetcut [-Q minQ] [-i inPen] [-0 em0] [-1 em1] [-2 em2] \n"); + sam_global_opt_help(samtools_stderr, "-.--f--."); + return 1; + } + l = max_l = 0; cns = 0; + g.fp = sam_open_format(argv[optind], "r", &ga.in); + if (g.fp == NULL) { + print_error_errno("targetcut", "can't open \"%s\"", argv[optind]); + return 1; + } + + g.h = sam_hdr_read(g.fp); + if (g.h == NULL) { + print_error("targetcut", "couldn't read header for \"%s\"", argv[optind]); + sam_close(g.fp); + return 1; + } + g.em = errmod_init(1. - ERR_DEP); + plp = bam_plp_init(read_aln, &g); + while ((p = bam_plp_auto(plp, &tid, &pos, &n)) != 0) { + if (tid < 0) break; + if (tid != lasttid) { // change of chromosome + if (cns) process_cns(g.h, lasttid, l, cns); + if (max_l < sam_hdr_tid2len(g.h, tid)) { + max_l = sam_hdr_tid2len(g.h, tid); + kroundup32(max_l); + cns = realloc(cns, max_l * 2); + } + l = sam_hdr_tid2len(g.h, tid); + memset(cns, 0, max_l * 2); + lasttid = tid; + } + cns[pos] = gencns(&g, n, p); + } + process_cns(g.h, lasttid, l, cns); + + if (n < 0) { + print_error("targetcut", "error reading from \"%s\"", argv[optind]); + status = EXIT_FAILURE; + } + + free(cns); + sam_hdr_destroy(g.h); + bam_plp_destroy(plp); + sam_close(g.fp); + if (g.fai) { + fai_destroy(g.fai); free(g.ref); + } + errmod_destroy(g.em); + free(g.bases); + sam_global_args_free(&ga); + return status; +} diff --git a/samtools/dict.c b/samtools/dict.c new file mode 100644 index 0000000..47cb842 --- /dev/null +++ b/samtools/dict.c @@ -0,0 +1,229 @@ +/* dict.c -- create a sequence dictionary file. + + Copyright (C) 2015, 2020 Genome Research Ltd. + + Author: Shane McCarthy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include "htslib/khash.h" +#include "htslib/kseq.h" +#include "htslib/hts.h" +#include "samtools.h" + +KHASH_SET_INIT_STR(str) +KSEQ_INIT(gzFile, gzread) + +typedef struct _args_t +{ + char *output_fname, *alt_fname; + char *assembly, *species, *uri; + int alias, header; + khash_t(str) *is_alt; +} +args_t; + +static void write_dict(const char *fn, args_t *args) +{ + hts_md5_context *md5; + int l, i, k; + gzFile fp; + kseq_t *seq; + unsigned char digest[16]; + char hex[33]; + + fp = strcmp(fn, "-") ? gzopen(fn, "r") : gzdopen(fileno(stdin), "r"); + if (fp == 0) { + print_error_errno("dict", "Cannot open %s", fn); + exit(1); + } + FILE *out = stdout; + if (args->output_fname) { + out = fopen(args->output_fname, "w"); + if (out == NULL) { + print_error_errno("dict", "Cannot open %s for writing", args->output_fname); + exit(1); + } + } + + if (!(md5 = hts_md5_init())) + exit(1); + + seq = kseq_init(fp); + if (args->header) fprintf(out, "@HD\tVN:1.0\tSO:unsorted\n"); + while ((l = kseq_read(seq)) >= 0) { + for (i = k = 0; i < seq->seq.l; ++i) { + if (seq->seq.s[i] >= '!' && seq->seq.s[i] <= '~') + seq->seq.s[k++] = toupper(seq->seq.s[i]); + } + hts_md5_reset(md5); + hts_md5_update(md5, (unsigned char*)seq->seq.s, k); + hts_md5_final(digest, md5); + hts_md5_hex(hex, digest); + fprintf(out, "@SQ\tSN:%s\tLN:%d\tM5:%s", seq->name.s, k, hex); + if (args->is_alt && kh_get(str, args->is_alt, seq->name.s) != kh_end(args->is_alt)) + fprintf(out, "\tAH:*"); + if (args->alias) { + const char *name = seq->name.s; + if (strncmp(name, "chr", 3) == 0) { + name += 3; + fprintf(out, "\tAN:%s", name); + } + else + fprintf(out, "\tAN:chr%s", name); + + if (strcmp(name, "M") == 0) + fprintf(out, ",chrMT,MT"); + else if (strcmp(name, "MT") == 0) + fprintf(out, ",chrM,M"); + } + if (args->uri) + fprintf(out, "\tUR:%s", args->uri); + else if (strcmp(fn, "-") != 0) { +#ifdef _WIN32 + char *real_path = _fullpath(NULL, fn, PATH_MAX); +#else + char *real_path = realpath(fn, NULL); +#endif + fprintf(out, "\tUR:file://%s", real_path); + free(real_path); + } + if (args->assembly) fprintf(out, "\tAS:%s", args->assembly); + if (args->species) fprintf(out, "\tSP:%s", args->species); + fprintf(out, "\n"); + } + kseq_destroy(seq); + hts_md5_destroy(md5); + + if (args->output_fname) fclose(out); + gzclose(fp); +} + +static void read_alt_file(khash_t(str) *is_alt, const char *fname) +{ + htsFile *fp = hts_open(fname, "r"); + if (fp == NULL) { + print_error_errno("dict", "Cannot open %s", fname); + exit(1); + } + + // .alt files are in a SAM-like format, but we don't use sam_read1() + // as these files may not have a complete set of @SQ headers. + + kstring_t str = KS_INITIALIZE; + while (hts_getline(fp, KS_SEP_LINE, &str) >= 0) { + if (str.l == 0 || str.s[0] == '@') continue; + + char *tab = strchr(str.s, '\t'); + if (tab) *tab = '\0'; + + int ret; + char *seqname = strdup(str.s); + kh_put(str, is_alt, seqname, &ret); + if (ret == 0) free(seqname); // Already present + } + + ks_free(&str); + hts_close(fp); +} + +static int dict_usage(void) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "About: Create a sequence dictionary file from a fasta file\n"); + fprintf(stderr, "Usage: samtools dict [options] \n\n"); + fprintf(stderr, "Options: -a, --assembly STR assembly\n"); + fprintf(stderr, " -A, --alias, --alternative-name\n"); + fprintf(stderr, " add AN tag by adding/removing 'chr'\n"); + fprintf(stderr, " -H, --no-header do not print @HD line\n"); + fprintf(stderr, " -l, --alt FILE add AH:* tag to alternate locus sequences\n"); + fprintf(stderr, " -o, --output FILE file to write out dict file [stdout]\n"); + fprintf(stderr, " -s, --species STR species\n"); + fprintf(stderr, " -u, --uri STR URI [file:///abs/path/to/file.fa]\n"); + fprintf(stderr, "\n"); + return 1; +} + +int dict_main(int argc, char *argv[]) +{ + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->header = 1; + + static const struct option loptions[] = + { + {"help", no_argument, NULL, 'h'}, + {"no-header", no_argument, NULL, 'H'}, + {"alias", no_argument, NULL, 'A'}, + {"alt", required_argument, NULL, 'l'}, + {"alternative-name", no_argument, NULL, 'A'}, + {"assembly", required_argument, NULL, 'a'}, + {"species", required_argument, NULL, 's'}, + {"uri", required_argument, NULL, 'u'}, + {"output", required_argument, NULL, 'o'}, + {NULL, 0, NULL, 0} + }; + int c; + while ( (c=getopt_long(argc,argv,"?AhHa:l:s:u:o:",loptions,NULL))>0 ) + { + switch (c) + { + case 'A': args->alias = 1; break; + case 'a': args->assembly = optarg; break; + case 'l': args->alt_fname = optarg; break; + case 's': args->species = optarg; break; + case 'u': args->uri = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'H': args->header = 0; break; + case 'h': return dict_usage(); + default: return dict_usage(); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(STDIN_FILENO) ) fname = "-"; // reading from stdin + else return dict_usage(); + } + else fname = argv[optind]; + + if (args->alt_fname) { + args->is_alt = kh_init(str); + read_alt_file(args->is_alt, args->alt_fname); + } + + write_dict(fname, args); + + if (args->is_alt) { + khint_t k; + for (k = 0; k < kh_end(args->is_alt); ++k) + if (kh_exist(args->is_alt, k)) free((char *) kh_key(args->is_alt, k)); + kh_destroy(str, args->is_alt); + } + + free(args); + return 0; +} diff --git a/samtools/dict.c.pysam.c b/samtools/dict.c.pysam.c new file mode 100644 index 0000000..6b2f2ba --- /dev/null +++ b/samtools/dict.c.pysam.c @@ -0,0 +1,231 @@ +#include "samtools.pysam.h" + +/* dict.c -- create a sequence dictionary file. + + Copyright (C) 2015, 2020 Genome Research Ltd. + + Author: Shane McCarthy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include "htslib/khash.h" +#include "htslib/kseq.h" +#include "htslib/hts.h" +#include "samtools.h" + +KHASH_SET_INIT_STR(str) +KSEQ_INIT(gzFile, gzread) + +typedef struct _args_t +{ + char *output_fname, *alt_fname; + char *assembly, *species, *uri; + int alias, header; + khash_t(str) *is_alt; +} +args_t; + +static void write_dict(const char *fn, args_t *args) +{ + hts_md5_context *md5; + int l, i, k; + gzFile fp; + kseq_t *seq; + unsigned char digest[16]; + char hex[33]; + + fp = strcmp(fn, "-") ? gzopen(fn, "r") : gzdopen(fileno(stdin), "r"); + if (fp == 0) { + print_error_errno("dict", "Cannot open %s", fn); + samtools_exit(1); + } + FILE *out = samtools_stdout; + if (args->output_fname) { + out = fopen(args->output_fname, "w"); + if (out == NULL) { + print_error_errno("dict", "Cannot open %s for writing", args->output_fname); + samtools_exit(1); + } + } + + if (!(md5 = hts_md5_init())) + samtools_exit(1); + + seq = kseq_init(fp); + if (args->header) fprintf(out, "@HD\tVN:1.0\tSO:unsorted\n"); + while ((l = kseq_read(seq)) >= 0) { + for (i = k = 0; i < seq->seq.l; ++i) { + if (seq->seq.s[i] >= '!' && seq->seq.s[i] <= '~') + seq->seq.s[k++] = toupper(seq->seq.s[i]); + } + hts_md5_reset(md5); + hts_md5_update(md5, (unsigned char*)seq->seq.s, k); + hts_md5_final(digest, md5); + hts_md5_hex(hex, digest); + fprintf(out, "@SQ\tSN:%s\tLN:%d\tM5:%s", seq->name.s, k, hex); + if (args->is_alt && kh_get(str, args->is_alt, seq->name.s) != kh_end(args->is_alt)) + fprintf(out, "\tAH:*"); + if (args->alias) { + const char *name = seq->name.s; + if (strncmp(name, "chr", 3) == 0) { + name += 3; + fprintf(out, "\tAN:%s", name); + } + else + fprintf(out, "\tAN:chr%s", name); + + if (strcmp(name, "M") == 0) + fprintf(out, ",chrMT,MT"); + else if (strcmp(name, "MT") == 0) + fprintf(out, ",chrM,M"); + } + if (args->uri) + fprintf(out, "\tUR:%s", args->uri); + else if (strcmp(fn, "-") != 0) { +#ifdef _WIN32 + char *real_path = _fullpath(NULL, fn, PATH_MAX); +#else + char *real_path = realpath(fn, NULL); +#endif + fprintf(out, "\tUR:file://%s", real_path); + free(real_path); + } + if (args->assembly) fprintf(out, "\tAS:%s", args->assembly); + if (args->species) fprintf(out, "\tSP:%s", args->species); + fprintf(out, "\n"); + } + kseq_destroy(seq); + hts_md5_destroy(md5); + + if (args->output_fname) fclose(out); + gzclose(fp); +} + +static void read_alt_file(khash_t(str) *is_alt, const char *fname) +{ + htsFile *fp = hts_open(fname, "r"); + if (fp == NULL) { + print_error_errno("dict", "Cannot open %s", fname); + samtools_exit(1); + } + + // .alt files are in a SAM-like format, but we don't use sam_read1() + // as these files may not have a complete set of @SQ headers. + + kstring_t str = KS_INITIALIZE; + while (hts_getline(fp, KS_SEP_LINE, &str) >= 0) { + if (str.l == 0 || str.s[0] == '@') continue; + + char *tab = strchr(str.s, '\t'); + if (tab) *tab = '\0'; + + int ret; + char *seqname = strdup(str.s); + kh_put(str, is_alt, seqname, &ret); + if (ret == 0) free(seqname); // Already present + } + + ks_free(&str); + hts_close(fp); +} + +static int dict_usage(void) +{ + fprintf(samtools_stderr, "\n"); + fprintf(samtools_stderr, "About: Create a sequence dictionary file from a fasta file\n"); + fprintf(samtools_stderr, "Usage: samtools dict [options] \n\n"); + fprintf(samtools_stderr, "Options: -a, --assembly STR assembly\n"); + fprintf(samtools_stderr, " -A, --alias, --alternative-name\n"); + fprintf(samtools_stderr, " add AN tag by adding/removing 'chr'\n"); + fprintf(samtools_stderr, " -H, --no-header do not print @HD line\n"); + fprintf(samtools_stderr, " -l, --alt FILE add AH:* tag to alternate locus sequences\n"); + fprintf(samtools_stderr, " -o, --output FILE file to write out dict file [samtools_stdout]\n"); + fprintf(samtools_stderr, " -s, --species STR species\n"); + fprintf(samtools_stderr, " -u, --uri STR URI [file:///abs/path/to/file.fa]\n"); + fprintf(samtools_stderr, "\n"); + return 1; +} + +int dict_main(int argc, char *argv[]) +{ + args_t *args = (args_t*) calloc(1,sizeof(args_t)); + args->header = 1; + + static const struct option loptions[] = + { + {"help", no_argument, NULL, 'h'}, + {"no-header", no_argument, NULL, 'H'}, + {"alias", no_argument, NULL, 'A'}, + {"alt", required_argument, NULL, 'l'}, + {"alternative-name", no_argument, NULL, 'A'}, + {"assembly", required_argument, NULL, 'a'}, + {"species", required_argument, NULL, 's'}, + {"uri", required_argument, NULL, 'u'}, + {"output", required_argument, NULL, 'o'}, + {NULL, 0, NULL, 0} + }; + int c; + while ( (c=getopt_long(argc,argv,"?AhHa:l:s:u:o:",loptions,NULL))>0 ) + { + switch (c) + { + case 'A': args->alias = 1; break; + case 'a': args->assembly = optarg; break; + case 'l': args->alt_fname = optarg; break; + case 's': args->species = optarg; break; + case 'u': args->uri = optarg; break; + case 'o': args->output_fname = optarg; break; + case 'H': args->header = 0; break; + case 'h': return dict_usage(); + default: return dict_usage(); + } + } + + char *fname = NULL; + if ( optind>=argc ) + { + if ( !isatty(STDIN_FILENO) ) fname = "-"; // reading from stdin + else return dict_usage(); + } + else fname = argv[optind]; + + if (args->alt_fname) { + args->is_alt = kh_init(str); + read_alt_file(args->is_alt, args->alt_fname); + } + + write_dict(fname, args); + + if (args->is_alt) { + khint_t k; + for (k = 0; k < kh_end(args->is_alt); ++k) + if (kh_exist(args->is_alt, k)) free((char *) kh_key(args->is_alt, k)); + kh_destroy(str, args->is_alt); + } + + free(args); + return 0; +} diff --git a/samtools/faidx.c b/samtools/faidx.c new file mode 100644 index 0000000..03b5d65 --- /dev/null +++ b/samtools/faidx.c @@ -0,0 +1,415 @@ +/* faidx.c -- faidx subcommand. + + Copyright (C) 2008, 2009, 2013, 2016, 2018-2020 Genome Research Ltd. + Portions copyright (C) 2011 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +History: + + * 2016-01-12: Pierre Lindenbaum @yokofakun : added options -o -n + +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "samtools.h" + +#define DEFAULT_FASTA_LINE_LEN 60 + +static unsigned char comp_base[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, '!', '"', '#', '$', '%', '&', '\'','(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', +'@', 'T', 'V', 'G', 'H', 'E', 'F', 'C', 'D', 'I', 'J', 'M', 'L', 'K', 'N', 'O', +'P', 'Q', 'Y', 'S', 'A', 'A', 'B', 'W', 'X', 'R', 'Z', '[', '\\',']', '^', '_', +'`', 't', 'v', 'g', 'h', 'e', 'f', 'c', 'd', 'i', 'j', 'm', 'l', 'k', 'n', 'o', +'p', 'q', 'y', 's', 'a', 'a', 'b', 'w', 'x', 'r', 'z', '{', '|', '}', '~', 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, +176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, +192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, +224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static void reverse_complement(char *str, const hts_pos_t len) { + char c; + hts_pos_t i = 0, j = len - 1; + + while (i <= j) { + c = str[i]; + str[i] = comp_base[(unsigned char)str[j]]; + str[j] = comp_base[(unsigned char)c]; + i++; + j--; + } +} + +static void reverse(char *str, const hts_pos_t len) { + char c; + hts_pos_t i = 0, j = len - 1; + + while (i < j) { + c = str[i]; + str[i] = str[j]; + str[j] = c; + i++; + j--; + } +} + + +static int write_line(faidx_t *faid, FILE *file, const char *line, const char *name, + const int ignore, const int length, const hts_pos_t seq_len) { + int id; + hts_pos_t beg, end; + + if (seq_len < 0) { + fprintf(stderr, "[faidx] Failed to fetch sequence in %s\n", name); + + if (ignore && seq_len == -2) { + return EXIT_SUCCESS; + } else { + return EXIT_FAILURE; + } + } else if (seq_len == 0) { + fprintf(stderr, "[faidx] Zero length sequence: %s\n", name); + } else if (fai_parse_region(faid, name, &id, &beg, &end, 0) + && (end < INT_MAX) && (seq_len != end - beg)) { + fprintf(stderr, "[faidx] Truncated sequence: %s\n", name); + } + + hts_pos_t i, seq_sz = seq_len; + + for (i = 0; i < seq_sz; i += length) + { + hts_pos_t len = i + length < seq_sz ? length : seq_sz - i; + if (fwrite(line + i, 1, len, file) < len || + fputc('\n', file) == EOF) { + print_error_errno("faidx", "failed to write output"); + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} + + +static int write_output(faidx_t *faid, FILE *file, const char *name, const int ignore, + const int length, const int rev, + const char *pos_strand_name, const char *neg_strand_name, + enum fai_format_options format) { + hts_pos_t seq_len; + char *seq = fai_fetch64(faid, name, &seq_len); + + if (format == FAI_FASTA) { + fprintf(file, ">%s%s\n", name, rev ? neg_strand_name : pos_strand_name); + } else { + fprintf(file, "@%s%s\n", name, rev ? neg_strand_name : pos_strand_name); + } + + if (rev && seq_len > 0) { + reverse_complement(seq, seq_len); + } + + if (write_line(faid, file, seq, name, ignore, length, seq_len) + == EXIT_FAILURE) { + free(seq); + return EXIT_FAILURE; + } + + free(seq); + + if (format == FAI_FASTQ) { + fprintf(file, "+\n"); + + char *qual = fai_fetchqual64(faid, name, &seq_len); + + if (rev && seq_len > 0) { + reverse(qual, seq_len); + } + + if (write_line(faid, file, qual, name, ignore, length, seq_len) + == EXIT_FAILURE) { + free(qual); + return EXIT_FAILURE; + } + + free(qual); + } + + return EXIT_SUCCESS; +} + + +static int read_regions_from_file(faidx_t *faid, hFILE *in_file, FILE *file, const int ignore, + const int length, const int rev, + const char *pos_strand_name, + const char *neg_strand_name, + enum fai_format_options format) { + kstring_t line = {0, 0, NULL}; + int ret = EXIT_FAILURE; + + while (line.l = 0, kgetline(&line, (kgets_func *)hgets, in_file) >= 0) { + if ((ret = write_output(faid, file, line.s, ignore, length, rev, pos_strand_name, neg_strand_name, format)) == EXIT_FAILURE) { + break; + } + } + + free(line.s); + + return ret; +} + +static int usage(FILE *fp, enum fai_format_options format, int exit_status) +{ + char *tool, *file_type, *index_name; + + if (format == FAI_FASTA) { + tool = "faidx "; + file_type = "FASTA"; + index_name = "file.fa"; + } else { + tool = "fqidx "; + file_type = "FASTQ"; + index_name = "file.fq"; + } + + fprintf(fp, "Usage: samtools %s [ [...]]\n", tool); + fprintf(fp, "Option: \n" + " -o, --output FILE Write %s to file.\n" + " -n, --length INT Length of %s sequence line. [60]\n" + " -c, --continue Continue after trying to retrieve missing region.\n" + " -r, --region-file FILE File of regions. Format is chr:from-to. One per line.\n" + " -i, --reverse-complement Reverse complement sequences.\n" + " --mark-strand TYPE Add strand indicator to sequence name\n" + " TYPE = rc for /rc on negative strand (default)\n" + " no for no strand indicator\n" + " sign for (+) / (-)\n" + " custom,, for custom indicator\n" + " --fai-idx FILE name of the index file (default %s.fai).\n" + " --gzi-idx FILE name of compressed file index (default %s.gz.gzi).\n", + file_type, file_type, index_name, index_name); + + + if (format == FAI_FASTA) { + fprintf(fp, " -f, --fastq File and index in FASTQ format.\n"); + } + + fprintf(fp, " -h, --help This message.\n"); + + return exit_status; +} + +int faidx_core(int argc, char *argv[], enum fai_format_options format) +{ + int c, ignore_error = 0, rev = 0; + int line_len = DEFAULT_FASTA_LINE_LEN ;/* fasta line len */ + char* output_file = NULL; /* output file (default is stdout ) */ + char *region_file = NULL; // list of regions from file, one per line + char *pos_strand_name = ""; // Extension to add to name for +ve strand + char *neg_strand_name = "/rc"; // Extension to add to name for -ve strand + char *strand_names = NULL; // Used for custom strand annotation + char *fai_name = NULL; // specified index name + char *gzi_name = NULL; // specified compressed index name + FILE* file_out = stdout;/* output stream */ + + static const struct option lopts[] = { + { "output", required_argument, NULL, 'o' }, + { "help", no_argument, NULL, 'h' }, + { "length", required_argument, NULL, 'n' }, + { "continue", no_argument, NULL, 'c' }, + { "region-file", required_argument, NULL, 'r' }, + { "fastq", no_argument, NULL, 'f' }, + { "reverse-complement", no_argument, NULL, 'i' }, + { "mark-strand", required_argument, NULL, 1000 }, + { "fai-idx", required_argument, NULL, 1001 }, + { "gzi-idx", required_argument, NULL, 1002 }, + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "ho:n:cr:fi", lopts, NULL)) >= 0) { + switch (c) { + case 'o': output_file = optarg; break; + case 'n': line_len = atoi(optarg); + if(line_len<1) { + fprintf(stderr,"[faidx] bad line length '%s', using default:%d\n",optarg,DEFAULT_FASTA_LINE_LEN); + line_len= DEFAULT_FASTA_LINE_LEN ; + } + break; + case 'c': ignore_error = 1; break; + case 'r': region_file = optarg; break; + case 'f': format = FAI_FASTQ; break; + case 'i': rev = 1; break; + case '?': return usage(stderr, format, EXIT_FAILURE); + case 'h': return usage(stdout, format, EXIT_SUCCESS); + case 1000: + if (strcmp(optarg, "no") == 0) { + pos_strand_name = neg_strand_name = ""; + } else if (strcmp(optarg, "sign") == 0) { + pos_strand_name = "(+)"; + neg_strand_name = "(-)"; + } else if (strcmp(optarg, "rc") == 0) { + pos_strand_name = ""; + neg_strand_name = "/rc"; + } else if (strncmp(optarg, "custom,", 7) == 0) { + size_t len = strlen(optarg + 7); + size_t comma = strcspn(optarg + 7, ","); + free(strand_names); + strand_names = pos_strand_name = malloc(len + 2); + if (!strand_names) { + fprintf(stderr, "[faidx] Out of memory\n"); + return EXIT_FAILURE; + } + neg_strand_name = pos_strand_name + comma + 1; + memcpy(pos_strand_name, optarg + 7, comma); + pos_strand_name[comma] = '\0'; + if (comma < len) + memcpy(neg_strand_name, optarg + 7 + comma + 1, + len - comma); + neg_strand_name[len - comma] = '\0'; + } else { + fprintf(stderr, "[faidx] Unknown --mark-strand option \"%s\"\n", optarg); + return usage(stderr, format, EXIT_FAILURE); + } + break; + case 1001: fai_name = optarg; break; + case 1002: gzi_name = optarg; break; + default: break; + } + } + + if ( argc==optind ) + return usage(stdout, format, EXIT_SUCCESS); + + if (optind+1 == argc && !region_file) { + if (output_file && !fai_name) + fai_name = output_file; + + if (fai_build3(argv[optind], fai_name, gzi_name) != 0) { + if (fai_name) + fprintf(stderr, "[faidx] Could not build fai index %s", fai_name); + else + fprintf(stderr, "[faidx] Could not build fai index %s.fai", argv[optind]); + + if (gzi_name) + fprintf(stderr, " or compressed index %s\n", gzi_name); + else + fprintf(stderr, "\n"); + + return EXIT_FAILURE; + } + + return 0; + } + + faidx_t *fai = fai_load3_format(argv[optind], fai_name, gzi_name, FAI_CREATE, format); + + if (!fai) { + if (fai_name) + fprintf(stderr, "[faidx] Could not load fai index %s", fai_name); + else + fprintf(stderr, "[faidx] Could not build fai index %s.fai", argv[optind]); + + if (gzi_name) + fprintf(stderr, " or compressed index %s\n", gzi_name); + else + fprintf(stderr, "\n"); + + return EXIT_FAILURE; + } + + /** output file provided by user */ + if( output_file != NULL ) { + if( strcmp( output_file, argv[optind] ) == 0 ) { + fprintf(stderr,"[faidx] Same input/output : %s\n", output_file); + return EXIT_FAILURE; + } + + file_out = fopen( output_file, "w" ); + + if( file_out == NULL) { + fprintf(stderr,"[faidx] Cannot open \"%s\" for writing :%s.\n", output_file, strerror(errno) ); + return EXIT_FAILURE; + } + } + + int exit_status = EXIT_SUCCESS; + + if (region_file) { + hFILE *rf; + + if ((rf = hopen(region_file, "r"))) { + exit_status = read_regions_from_file(fai, rf, file_out, ignore_error, line_len, rev, pos_strand_name, neg_strand_name, format); + + if (hclose(rf) != 0) { + fprintf(stderr, "[faidx] Warning: failed to close %s", region_file); + } + } else { + fprintf(stderr, "[faidx] Failed to open \"%s\" for reading.\n", region_file); + exit_status = EXIT_FAILURE; + } + } + + while ( ++optind + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +History: + + * 2016-01-12: Pierre Lindenbaum @yokofakun : added options -o -n + +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "samtools.h" + +#define DEFAULT_FASTA_LINE_LEN 60 + +static unsigned char comp_base[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, '!', '"', '#', '$', '%', '&', '\'','(', ')', '*', '+', ',', '-', '.', '/', +'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', +'@', 'T', 'V', 'G', 'H', 'E', 'F', 'C', 'D', 'I', 'J', 'M', 'L', 'K', 'N', 'O', +'P', 'Q', 'Y', 'S', 'A', 'A', 'B', 'W', 'X', 'R', 'Z', '[', '\\',']', '^', '_', +'`', 't', 'v', 'g', 'h', 'e', 'f', 'c', 'd', 'i', 'j', 'm', 'l', 'k', 'n', 'o', +'p', 'q', 'y', 's', 'a', 'a', 'b', 'w', 'x', 'r', 'z', '{', '|', '}', '~', 127, +128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, +144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, +160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, +176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, +192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, +208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, +224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, +240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, +}; + +static void reverse_complement(char *str, const hts_pos_t len) { + char c; + hts_pos_t i = 0, j = len - 1; + + while (i <= j) { + c = str[i]; + str[i] = comp_base[(unsigned char)str[j]]; + str[j] = comp_base[(unsigned char)c]; + i++; + j--; + } +} + +static void reverse(char *str, const hts_pos_t len) { + char c; + hts_pos_t i = 0, j = len - 1; + + while (i < j) { + c = str[i]; + str[i] = str[j]; + str[j] = c; + i++; + j--; + } +} + + +static int write_line(faidx_t *faid, FILE *file, const char *line, const char *name, + const int ignore, const int length, const hts_pos_t seq_len) { + int id; + hts_pos_t beg, end; + + if (seq_len < 0) { + fprintf(samtools_stderr, "[faidx] Failed to fetch sequence in %s\n", name); + + if (ignore && seq_len == -2) { + return EXIT_SUCCESS; + } else { + return EXIT_FAILURE; + } + } else if (seq_len == 0) { + fprintf(samtools_stderr, "[faidx] Zero length sequence: %s\n", name); + } else if (fai_parse_region(faid, name, &id, &beg, &end, 0) + && (end < INT_MAX) && (seq_len != end - beg)) { + fprintf(samtools_stderr, "[faidx] Truncated sequence: %s\n", name); + } + + hts_pos_t i, seq_sz = seq_len; + + for (i = 0; i < seq_sz; i += length) + { + hts_pos_t len = i + length < seq_sz ? length : seq_sz - i; + if (fwrite(line + i, 1, len, file) < len || + fputc('\n', file) == EOF) { + print_error_errno("faidx", "failed to write output"); + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} + + +static int write_output(faidx_t *faid, FILE *file, const char *name, const int ignore, + const int length, const int rev, + const char *pos_strand_name, const char *neg_strand_name, + enum fai_format_options format) { + hts_pos_t seq_len; + char *seq = fai_fetch64(faid, name, &seq_len); + + if (format == FAI_FASTA) { + fprintf(file, ">%s%s\n", name, rev ? neg_strand_name : pos_strand_name); + } else { + fprintf(file, "@%s%s\n", name, rev ? neg_strand_name : pos_strand_name); + } + + if (rev && seq_len > 0) { + reverse_complement(seq, seq_len); + } + + if (write_line(faid, file, seq, name, ignore, length, seq_len) + == EXIT_FAILURE) { + free(seq); + return EXIT_FAILURE; + } + + free(seq); + + if (format == FAI_FASTQ) { + fprintf(file, "+\n"); + + char *qual = fai_fetchqual64(faid, name, &seq_len); + + if (rev && seq_len > 0) { + reverse(qual, seq_len); + } + + if (write_line(faid, file, qual, name, ignore, length, seq_len) + == EXIT_FAILURE) { + free(qual); + return EXIT_FAILURE; + } + + free(qual); + } + + return EXIT_SUCCESS; +} + + +static int read_regions_from_file(faidx_t *faid, hFILE *in_file, FILE *file, const int ignore, + const int length, const int rev, + const char *pos_strand_name, + const char *neg_strand_name, + enum fai_format_options format) { + kstring_t line = {0, 0, NULL}; + int ret = EXIT_FAILURE; + + while (line.l = 0, kgetline(&line, (kgets_func *)hgets, in_file) >= 0) { + if ((ret = write_output(faid, file, line.s, ignore, length, rev, pos_strand_name, neg_strand_name, format)) == EXIT_FAILURE) { + break; + } + } + + free(line.s); + + return ret; +} + +static int usage(FILE *fp, enum fai_format_options format, int exit_status) +{ + char *tool, *file_type, *index_name; + + if (format == FAI_FASTA) { + tool = "faidx "; + file_type = "FASTA"; + index_name = "file.fa"; + } else { + tool = "fqidx "; + file_type = "FASTQ"; + index_name = "file.fq"; + } + + fprintf(fp, "Usage: samtools %s [ [...]]\n", tool); + fprintf(fp, "Option: \n" + " -o, --output FILE Write %s to file.\n" + " -n, --length INT Length of %s sequence line. [60]\n" + " -c, --continue Continue after trying to retrieve missing region.\n" + " -r, --region-file FILE File of regions. Format is chr:from-to. One per line.\n" + " -i, --reverse-complement Reverse complement sequences.\n" + " --mark-strand TYPE Add strand indicator to sequence name\n" + " TYPE = rc for /rc on negative strand (default)\n" + " no for no strand indicator\n" + " sign for (+) / (-)\n" + " custom,, for custom indicator\n" + " --fai-idx FILE name of the index file (default %s.fai).\n" + " --gzi-idx FILE name of compressed file index (default %s.gz.gzi).\n", + file_type, file_type, index_name, index_name); + + + if (format == FAI_FASTA) { + fprintf(fp, " -f, --fastq File and index in FASTQ format.\n"); + } + + fprintf(fp, " -h, --help This message.\n"); + + return exit_status; +} + +int faidx_core(int argc, char *argv[], enum fai_format_options format) +{ + int c, ignore_error = 0, rev = 0; + int line_len = DEFAULT_FASTA_LINE_LEN ;/* fasta line len */ + char* output_file = NULL; /* output file (default is samtools_stdout ) */ + char *region_file = NULL; // list of regions from file, one per line + char *pos_strand_name = ""; // Extension to add to name for +ve strand + char *neg_strand_name = "/rc"; // Extension to add to name for -ve strand + char *strand_names = NULL; // Used for custom strand annotation + char *fai_name = NULL; // specified index name + char *gzi_name = NULL; // specified compressed index name + FILE* file_out = samtools_stdout;/* output stream */ + + static const struct option lopts[] = { + { "output", required_argument, NULL, 'o' }, + { "help", no_argument, NULL, 'h' }, + { "length", required_argument, NULL, 'n' }, + { "continue", no_argument, NULL, 'c' }, + { "region-file", required_argument, NULL, 'r' }, + { "fastq", no_argument, NULL, 'f' }, + { "reverse-complement", no_argument, NULL, 'i' }, + { "mark-strand", required_argument, NULL, 1000 }, + { "fai-idx", required_argument, NULL, 1001 }, + { "gzi-idx", required_argument, NULL, 1002 }, + { NULL, 0, NULL, 0 } + }; + + while ((c = getopt_long(argc, argv, "ho:n:cr:fi", lopts, NULL)) >= 0) { + switch (c) { + case 'o': output_file = optarg; break; + case 'n': line_len = atoi(optarg); + if(line_len<1) { + fprintf(samtools_stderr,"[faidx] bad line length '%s', using default:%d\n",optarg,DEFAULT_FASTA_LINE_LEN); + line_len= DEFAULT_FASTA_LINE_LEN ; + } + break; + case 'c': ignore_error = 1; break; + case 'r': region_file = optarg; break; + case 'f': format = FAI_FASTQ; break; + case 'i': rev = 1; break; + case '?': return usage(samtools_stderr, format, EXIT_FAILURE); + case 'h': return usage(samtools_stdout, format, EXIT_SUCCESS); + case 1000: + if (strcmp(optarg, "no") == 0) { + pos_strand_name = neg_strand_name = ""; + } else if (strcmp(optarg, "sign") == 0) { + pos_strand_name = "(+)"; + neg_strand_name = "(-)"; + } else if (strcmp(optarg, "rc") == 0) { + pos_strand_name = ""; + neg_strand_name = "/rc"; + } else if (strncmp(optarg, "custom,", 7) == 0) { + size_t len = strlen(optarg + 7); + size_t comma = strcspn(optarg + 7, ","); + free(strand_names); + strand_names = pos_strand_name = malloc(len + 2); + if (!strand_names) { + fprintf(samtools_stderr, "[faidx] Out of memory\n"); + return EXIT_FAILURE; + } + neg_strand_name = pos_strand_name + comma + 1; + memcpy(pos_strand_name, optarg + 7, comma); + pos_strand_name[comma] = '\0'; + if (comma < len) + memcpy(neg_strand_name, optarg + 7 + comma + 1, + len - comma); + neg_strand_name[len - comma] = '\0'; + } else { + fprintf(samtools_stderr, "[faidx] Unknown --mark-strand option \"%s\"\n", optarg); + return usage(samtools_stderr, format, EXIT_FAILURE); + } + break; + case 1001: fai_name = optarg; break; + case 1002: gzi_name = optarg; break; + default: break; + } + } + + if ( argc==optind ) + return usage(samtools_stdout, format, EXIT_SUCCESS); + + if (optind+1 == argc && !region_file) { + if (output_file && !fai_name) + fai_name = output_file; + + if (fai_build3(argv[optind], fai_name, gzi_name) != 0) { + if (fai_name) + fprintf(samtools_stderr, "[faidx] Could not build fai index %s", fai_name); + else + fprintf(samtools_stderr, "[faidx] Could not build fai index %s.fai", argv[optind]); + + if (gzi_name) + fprintf(samtools_stderr, " or compressed index %s\n", gzi_name); + else + fprintf(samtools_stderr, "\n"); + + return EXIT_FAILURE; + } + + return 0; + } + + faidx_t *fai = fai_load3_format(argv[optind], fai_name, gzi_name, FAI_CREATE, format); + + if (!fai) { + if (fai_name) + fprintf(samtools_stderr, "[faidx] Could not load fai index %s", fai_name); + else + fprintf(samtools_stderr, "[faidx] Could not build fai index %s.fai", argv[optind]); + + if (gzi_name) + fprintf(samtools_stderr, " or compressed index %s\n", gzi_name); + else + fprintf(samtools_stderr, "\n"); + + return EXIT_FAILURE; + } + + /** output file provided by user */ + if( output_file != NULL ) { + if( strcmp( output_file, argv[optind] ) == 0 ) { + fprintf(samtools_stderr,"[faidx] Same input/output : %s\n", output_file); + return EXIT_FAILURE; + } + + file_out = fopen( output_file, "w" ); + + if( file_out == NULL) { + fprintf(samtools_stderr,"[faidx] Cannot open \"%s\" for writing :%s.\n", output_file, strerror(errno) ); + return EXIT_FAILURE; + } + } + + int exit_status = EXIT_SUCCESS; + + if (region_file) { + hFILE *rf; + + if ((rf = hopen(region_file, "r"))) { + exit_status = read_regions_from_file(fai, rf, file_out, ignore_error, line_len, rev, pos_strand_name, neg_strand_name, format); + + if (hclose(rf) != 0) { + fprintf(samtools_stderr, "[faidx] Warning: failed to close %s", region_file); + } + } else { + fprintf(samtools_stderr, "[faidx] Failed to open \"%s\" for reading.\n", region_file); + exit_status = EXIT_FAILURE; + } + } + + while ( ++optind 1 > 2) + */ +#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ +# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) +# define LZ4_FORCE_MEMORY_ACCESS 2 +# elif defined(__INTEL_COMPILER) || defined(__GNUC__) +# define LZ4_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +/* + * LZ4_FORCE_SW_BITCOUNT + * Define this parameter if your target system or compiler does not support hardware bit count + */ +#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for Windows CE does not support Hardware bit count */ +# define LZ4_FORCE_SW_BITCOUNT +#endif + + +/*-************************************ +* Dependency +**************************************/ +#include "lz4.h" +/* see also "memory routines" below */ + + +/*-************************************ +* Compiler Options +**************************************/ +#ifdef _MSC_VER /* Visual Studio */ +# include +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 4293) /* disable: C4293: too large shift (32-bits) */ +#endif /* _MSC_VER */ + +#ifndef FORCE_INLINE +# ifdef _MSC_VER /* Visual Studio */ +# define FORCE_INLINE static __forceinline +# else +# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ +# ifdef __GNUC__ +# define FORCE_INLINE static inline __attribute__((always_inline)) +# else +# define FORCE_INLINE static inline +# endif +# else +# define FORCE_INLINE static +# endif /* __STDC_VERSION__ */ +# endif /* _MSC_VER */ +#endif /* FORCE_INLINE */ + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#define likely(expr) expect((expr) != 0, 1) +#define unlikely(expr) expect((expr) != 0, 0) + + +/*-************************************ +* Memory routines +**************************************/ +#include /* malloc, calloc, free */ +#define ALLOCATOR(n,s) calloc(n,s) +#define FREEMEM free +#include /* memset, memcpy */ +#define MEM_INIT memset + + +/*-************************************ +* Basic Types +**************************************/ +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef uint8_t BYTE; + typedef uint16_t U16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef uintptr_t uptrval; +#else + typedef unsigned char BYTE; + typedef unsigned short U16; + typedef unsigned int U32; + typedef signed int S32; + typedef unsigned long long U64; + typedef size_t uptrval; /* generally true, except OpenVMS-64 */ +#endif + +#if defined(__x86_64__) + typedef U64 reg_t; /* 64-bits in x32 mode */ +#else + typedef size_t reg_t; /* 32-bits in x32 mode */ +#endif + +/*-************************************ +* Reading and writing into memory +**************************************/ +static unsigned LZ4_isLittleEndian(void) +{ + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +} + + +#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) +/* lie to the compiler about data alignment; use with caution */ + +static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } +static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } +static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } + +static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } + +#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) + +/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ +/* currently only defined for gcc and icc */ +typedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) unalign; + +static U16 LZ4_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } +static U32 LZ4_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } +static reg_t LZ4_read_ARCH(const void* ptr) { return ((const unalign*)ptr)->uArch; } + +static void LZ4_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } +static void LZ4_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; } + +#else /* safe and portable access through memcpy() */ + +static U16 LZ4_read16(const void* memPtr) +{ + U16 val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static U32 LZ4_read32(const void* memPtr) +{ + U32 val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static reg_t LZ4_read_ARCH(const void* memPtr) +{ + reg_t val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static void LZ4_write16(void* memPtr, U16 value) +{ + memcpy(memPtr, &value, sizeof(value)); +} + +static void LZ4_write32(void* memPtr, U32 value) +{ + memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* LZ4_FORCE_MEMORY_ACCESS */ + + +static U16 LZ4_readLE16(const void* memPtr) +{ + if (LZ4_isLittleEndian()) { + return LZ4_read16(memPtr); + } else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)((U16)p[0] + (p[1]<<8)); + } +} + +static void LZ4_writeLE16(void* memPtr, U16 value) +{ + if (LZ4_isLittleEndian()) { + LZ4_write16(memPtr, value); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE) value; + p[1] = (BYTE)(value>>8); + } +} + +static void LZ4_copy8(void* dst, const void* src) +{ + memcpy(dst,src,8); +} + +/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ +static void LZ4_wildCopy(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_copy8(d,s); d+=8; s+=8; } while (d=2) +# include +# define DEBUGLOG(l, ...) { \ + if (l<=LZ4_DEBUG) { \ + fprintf(stderr, __FILE__ ": "); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, " \n"); \ + } } +#else +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + + +/*-************************************ +* Common functions +**************************************/ +static unsigned LZ4_NbCommonBytes (register reg_t val) +{ + if (LZ4_isLittleEndian()) { + if (sizeof(val)==8) { +# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanForward64( &r, (U64)val ); + return (int)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_ctzll((U64)val) >> 3); +# else + static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, 0, 2, 3, 6, 1, 5, 3, 5, 1, 3, 4, 4, 2, 5, 6, 7, 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, 7, 2, 6, 5, 7, 6, 7, 7 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r; + _BitScanForward( &r, (U32)val ); + return (int)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_ctz((U32)val) >> 3); +# else + static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; +# endif + } + } else /* Big Endian CPU */ { + if (sizeof(val)==8) { +# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanReverse64( &r, val ); + return (unsigned)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_clzll((U64)val) >> 3); +# else + unsigned r; + if (!(val>>32)) { r=4; } else { r=0; val>>=32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanReverse( &r, (unsigned long)val ); + return (unsigned)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_clz((U32)val) >> 3); +# else + unsigned r; + if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } + r += (!val); + return r; +# endif + } + } +} + +#define STEPSIZE sizeof(reg_t) +static unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) +{ + const BYTE* const pStart = pIn; + + while (likely(pIn compression run slower on incompressible data */ + + +/*-************************************ +* Local Structures and types +**************************************/ +typedef enum { notLimited = 0, limitedOutput = 1 } limitedOutput_directive; +typedef enum { byPtr, byU32, byU16 } tableType_t; + +typedef enum { noDict = 0, withPrefix64k, usingExtDict } dict_directive; +typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; + +typedef enum { endOnOutputSize = 0, endOnInputSize = 1 } endCondition_directive; +typedef enum { full = 0, partial = 1 } earlyEnd_directive; + + +/*-************************************ +* Local Utils +**************************************/ +int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } +const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } +int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } +int LZ4_sizeofState() { return LZ4_STREAMSIZE; } + + +/*-****************************** +* Compression functions +********************************/ +static U32 LZ4_hash4(U32 sequence, tableType_t const tableType) +{ + if (tableType == byU16) + return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + else + return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); +} + +static U32 LZ4_hash5(U64 sequence, tableType_t const tableType) +{ + static const U64 prime5bytes = 889523592379ULL; + static const U64 prime8bytes = 11400714785074694791ULL; + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; + if (LZ4_isLittleEndian()) + return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); + else + return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); +} + +FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) +{ + if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); + return LZ4_hash4(LZ4_read32(p), tableType); +} + +static void LZ4_putPositionOnHash(const BYTE* p, U32 h, void* tableBase, tableType_t const tableType, const BYTE* srcBase) +{ + switch (tableType) + { + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; } + } +} + +FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); +} + +static const BYTE* LZ4_getPositionOnHash(U32 h, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + if (tableType == byPtr) { const BYTE** hashTable = (const BYTE**) tableBase; return hashTable[h]; } + if (tableType == byU32) { const U32* const hashTable = (U32*) tableBase; return hashTable[h] + srcBase; } + { const U16* const hashTable = (U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ +} + +FORCE_INLINE const BYTE* LZ4_getPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); +} + + +/** LZ4_compress_generic() : + inlined, to ensure branches are decided at compilation time */ +FORCE_INLINE int LZ4_compress_generic( + LZ4_stream_t_internal* const cctx, + const char* const source, + char* const dest, + const int inputSize, + const int maxOutputSize, + const limitedOutput_directive outputLimited, + const tableType_t tableType, + const dict_directive dict, + const dictIssue_directive dictIssue, + const U32 acceleration) +{ + const BYTE* ip = (const BYTE*) source; + const BYTE* base; + const BYTE* lowLimit; + const BYTE* const lowRefLimit = ip - cctx->dictSize; + const BYTE* const dictionary = cctx->dictionary; + const BYTE* const dictEnd = dictionary + cctx->dictSize; + const ptrdiff_t dictDelta = dictEnd - (const BYTE*)source; + const BYTE* anchor = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = iend - LASTLITERALS; + + BYTE* op = (BYTE*) dest; + BYTE* const olimit = op + maxOutputSize; + + U32 forwardH; + + /* Init conditions */ + if ((U32)inputSize > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported inputSize, too large (or negative) */ + switch(dict) + { + case noDict: + default: + base = (const BYTE*)source; + lowLimit = (const BYTE*)source; + break; + case withPrefix64k: + base = (const BYTE*)source - cctx->currentOffset; + lowLimit = (const BYTE*)source - cctx->dictSize; + break; + case usingExtDict: + base = (const BYTE*)source - cctx->currentOffset; + lowLimit = (const BYTE*)source; + break; + } + if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) return 0; /* Size too large (not within 64K limit) */ + if (inputSizehashTable, tableType, base); + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + ptrdiff_t refDelta = 0; + const BYTE* match; + BYTE* token; + + /* Find a match */ + { const BYTE* forwardIp = ip; + unsigned step = 1; + unsigned searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimit)) goto _last_literals; + + match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType, base); + if (dict==usingExtDict) { + if (match < (const BYTE*)source) { + refDelta = dictDelta; + lowLimit = dictionary; + } else { + refDelta = 0; + lowLimit = (const BYTE*)source; + } } + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType, base); + + } while ( ((dictIssue==dictSmall) ? (match < lowRefLimit) : 0) + || ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip)) + || (LZ4_read32(match+refDelta) != LZ4_read32(ip)) ); + } + + /* Catch up */ + while (((ip>anchor) & (match+refDelta > lowLimit)) && (unlikely(ip[-1]==match[refDelta-1]))) { ip--; match--; } + + /* Encode Literals */ + { unsigned const litLength = (unsigned)(ip - anchor); + token = op++; + if ((outputLimited) && /* Check output buffer overflow */ + (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit))) + return 0; + if (litLength >= RUN_MASK) { + int len = (int)litLength-RUN_MASK; + *token = (RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< matchlimit) limit = matchlimit; + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + ip += MINMATCH + matchCode; + if (ip==limit) { + unsigned const more = LZ4_count(ip, (const BYTE*)source, matchlimit); + matchCode += more; + ip += more; + } + } else { + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + ip += MINMATCH + matchCode; + } + + if ( outputLimited && /* Check output buffer overflow */ + (unlikely(op + (1 + LASTLITERALS) + (matchCode>>8) > olimit)) ) + return 0; + if (matchCode >= ML_MASK) { + *token += ML_MASK; + matchCode -= ML_MASK; + LZ4_write32(op, 0xFFFFFFFF); + while (matchCode >= 4*255) op+=4, LZ4_write32(op, 0xFFFFFFFF), matchCode -= 4*255; + op += matchCode / 255; + *op++ = (BYTE)(matchCode % 255); + } else + *token += (BYTE)(matchCode); + } + + anchor = ip; + + /* Test end of chunk */ + if (ip > mflimit) break; + + /* Fill table */ + LZ4_putPosition(ip-2, cctx->hashTable, tableType, base); + + /* Test next position */ + match = LZ4_getPosition(ip, cctx->hashTable, tableType, base); + if (dict==usingExtDict) { + if (match < (const BYTE*)source) { + refDelta = dictDelta; + lowLimit = dictionary; + } else { + refDelta = 0; + lowLimit = (const BYTE*)source; + } } + LZ4_putPosition(ip, cctx->hashTable, tableType, base); + if ( ((dictIssue==dictSmall) ? (match>=lowRefLimit) : 1) + && (match+MAX_DISTANCE>=ip) + && (LZ4_read32(match+refDelta)==LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + } + +_last_literals: + /* Encode Last Literals */ + { size_t const lastRun = (size_t)(iend - anchor); + if ( (outputLimited) && /* Check output buffer overflow */ + ((op - (BYTE*)dest) + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > (U32)maxOutputSize) ) + return 0; + if (lastRun >= RUN_MASK) { + size_t accumulator = lastRun - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRun<internal_donotuse; + LZ4_resetStream((LZ4_stream_t*)state); + if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; + + if (maxOutputSize >= LZ4_compressBound(inputSize)) { + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(ctx, source, dest, inputSize, 0, notLimited, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(ctx, source, dest, inputSize, 0, notLimited, (sizeof(void*)==8) ? byU32 : byPtr, noDict, noDictIssue, acceleration); + } else { + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(ctx, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(ctx, source, dest, inputSize, maxOutputSize, limitedOutput, (sizeof(void*)==8) ? byU32 : byPtr, noDict, noDictIssue, acceleration); + } +} + + +int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ +#if (LZ4_HEAPMODE) + void* ctxPtr = ALLOCATOR(1, sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ +#else + LZ4_stream_t ctx; + void* const ctxPtr = &ctx; +#endif + + int const result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration); + +#if (LZ4_HEAPMODE) + FREEMEM(ctxPtr); +#endif + return result; +} + + +int LZ4_compress_default(const char* source, char* dest, int inputSize, int maxOutputSize) +{ + return LZ4_compress_fast(source, dest, inputSize, maxOutputSize, 1); +} + + +/* hidden debug function */ +/* strangely enough, gcc generates faster code when this function is uncommented, even if unused */ +int LZ4_compress_fast_force(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t ctx; + LZ4_resetStream(&ctx); + + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(&ctx.internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(&ctx.internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, sizeof(void*)==8 ? byU32 : byPtr, noDict, noDictIssue, acceleration); +} + + +/*-****************************** +* *_destSize() variant +********************************/ + +static int LZ4_compress_destSize_generic( + LZ4_stream_t_internal* const ctx, + const char* const src, + char* const dst, + int* const srcSizePtr, + const int targetDstSize, + const tableType_t tableType) +{ + const BYTE* ip = (const BYTE*) src; + const BYTE* base = (const BYTE*) src; + const BYTE* lowLimit = (const BYTE*) src; + const BYTE* anchor = ip; + const BYTE* const iend = ip + *srcSizePtr; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = iend - LASTLITERALS; + + BYTE* op = (BYTE*) dst; + BYTE* const oend = op + targetDstSize; + BYTE* const oMaxLit = op + targetDstSize - 2 /* offset */ - 8 /* because 8+MINMATCH==MFLIMIT */ - 1 /* token */; + BYTE* const oMaxMatch = op + targetDstSize - (LASTLITERALS + 1 /* token */); + BYTE* const oMaxSeq = oMaxLit - 1 /* token */; + + U32 forwardH; + + + /* Init conditions */ + if (targetDstSize < 1) return 0; /* Impossible to store anything */ + if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size, too large (or negative) */ + if ((tableType == byU16) && (*srcSizePtr>=LZ4_64Klimit)) return 0; /* Size too large (not within 64K limit) */ + if (*srcSizePtrhashTable, tableType, base); + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + const BYTE* match; + BYTE* token; + + /* Find a match */ + { const BYTE* forwardIp = ip; + unsigned step = 1; + unsigned searchMatchNb = 1 << LZ4_skipTrigger; + + do { + U32 h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimit)) goto _last_literals; + + match = LZ4_getPositionOnHash(h, ctx->hashTable, tableType, base); + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, ctx->hashTable, tableType, base); + + } while ( ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip)) + || (LZ4_read32(match) != LZ4_read32(ip)) ); + } + + /* Catch up */ + while ((ip>anchor) && (match > lowLimit) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } + + /* Encode Literal length */ + { unsigned litLength = (unsigned)(ip - anchor); + token = op++; + if (op + ((litLength+240)/255) + litLength > oMaxLit) { + /* Not enough space for a last match */ + op--; + goto _last_literals; + } + if (litLength>=RUN_MASK) { + unsigned len = litLength - RUN_MASK; + *token=(RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< oMaxMatch) { + /* Match description too long : reduce it */ + matchLength = (15-1) + (oMaxMatch-op) * 255; + } + ip += MINMATCH + matchLength; + + if (matchLength>=ML_MASK) { + *token += ML_MASK; + matchLength -= ML_MASK; + while (matchLength >= 255) { matchLength-=255; *op++ = 255; } + *op++ = (BYTE)matchLength; + } + else *token += (BYTE)(matchLength); + } + + anchor = ip; + + /* Test end of block */ + if (ip > mflimit) break; + if (op > oMaxSeq) break; + + /* Fill table */ + LZ4_putPosition(ip-2, ctx->hashTable, tableType, base); + + /* Test next position */ + match = LZ4_getPosition(ip, ctx->hashTable, tableType, base); + LZ4_putPosition(ip, ctx->hashTable, tableType, base); + if ( (match+MAX_DISTANCE>=ip) + && (LZ4_read32(match)==LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + } + +_last_literals: + /* Encode Last Literals */ + { size_t lastRunSize = (size_t)(iend - anchor); + if (op + 1 /* token */ + ((lastRunSize+240)/255) /* litLength */ + lastRunSize /* literals */ > oend) { + /* adapt lastRunSize to fill 'dst' */ + lastRunSize = (oend-op) - 1; + lastRunSize -= (lastRunSize+240)/255; + } + ip = anchor + lastRunSize; + + if (lastRunSize >= RUN_MASK) { + size_t accumulator = lastRunSize - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRunSize<= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ + return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); + } else { + if (*srcSizePtr < LZ4_64Klimit) + return LZ4_compress_destSize_generic(&state->internal_donotuse, src, dst, srcSizePtr, targetDstSize, byU16); + else + return LZ4_compress_destSize_generic(&state->internal_donotuse, src, dst, srcSizePtr, targetDstSize, sizeof(void*)==8 ? byU32 : byPtr); + } +} + + +int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ +#if (LZ4_HEAPMODE) + LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOCATOR(1, sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ +#else + LZ4_stream_t ctxBody; + LZ4_stream_t* ctx = &ctxBody; +#endif + + int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); + +#if (LZ4_HEAPMODE) + FREEMEM(ctx); +#endif + return result; +} + + + +/*-****************************** +* Streaming functions +********************************/ + +LZ4_stream_t* LZ4_createStream(void) +{ + LZ4_stream_t* lz4s = (LZ4_stream_t*)ALLOCATOR(8, LZ4_STREAMSIZE_U64); + LZ4_STATIC_ASSERT(LZ4_STREAMSIZE >= sizeof(LZ4_stream_t_internal)); /* A compilation error here means LZ4_STREAMSIZE is not large enough */ + LZ4_resetStream(lz4s); + return lz4s; +} + +void LZ4_resetStream (LZ4_stream_t* LZ4_stream) +{ + MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t)); +} + +int LZ4_freeStream (LZ4_stream_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + FREEMEM(LZ4_stream); + return (0); +} + + +#define HASH_UNIT sizeof(reg_t) +int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + LZ4_stream_t_internal* dict = &LZ4_dict->internal_donotuse; + const BYTE* p = (const BYTE*)dictionary; + const BYTE* const dictEnd = p + dictSize; + const BYTE* base; + + if ((dict->initCheck) || (dict->currentOffset > 1 GB)) /* Uninitialized structure, or reuse overflow */ + LZ4_resetStream(LZ4_dict); + + if (dictSize < (int)HASH_UNIT) { + dict->dictionary = NULL; + dict->dictSize = 0; + return 0; + } + + if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; + dict->currentOffset += 64 KB; + base = p - dict->currentOffset; + dict->dictionary = p; + dict->dictSize = (U32)(dictEnd - p); + dict->currentOffset += dict->dictSize; + + while (p <= dictEnd-HASH_UNIT) { + LZ4_putPosition(p, dict->hashTable, byU32, base); + p+=3; + } + + return dict->dictSize; +} + + +static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, const BYTE* src) +{ + if ((LZ4_dict->currentOffset > 0x80000000) || + ((uptrval)LZ4_dict->currentOffset > (uptrval)src)) { /* address space overflow */ + /* rescale hash table */ + U32 const delta = LZ4_dict->currentOffset - 64 KB; + const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + int i; + for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; + else LZ4_dict->hashTable[i] -= delta; + } + LZ4_dict->currentOffset = 64 KB; + if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; + LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; + } +} + + +int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t_internal* streamPtr = &LZ4_stream->internal_donotuse; + const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize; + + const BYTE* smallest = (const BYTE*) source; + if (streamPtr->initCheck) return 0; /* Uninitialized structure detected */ + if ((streamPtr->dictSize>0) && (smallest>dictEnd)) smallest = dictEnd; + LZ4_renormDictT(streamPtr, smallest); + if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; + + /* Check overlapping input/dictionary space */ + { const BYTE* sourceEnd = (const BYTE*) source + inputSize; + if ((sourceEnd > streamPtr->dictionary) && (sourceEnd < dictEnd)) { + streamPtr->dictSize = (U32)(dictEnd - sourceEnd); + if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; + if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; + streamPtr->dictionary = dictEnd - streamPtr->dictSize; + } + } + + /* prefix mode : source data follows dictionary */ + if (dictEnd == (const BYTE*)source) { + int result; + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, dictSmall, acceleration); + else + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, noDictIssue, acceleration); + streamPtr->dictSize += (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + return result; + } + + /* external dictionary mode */ + { int result; + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, dictSmall, acceleration); + else + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, noDictIssue, acceleration); + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + return result; + } +} + + +/* Hidden debug function, to force external dictionary mode */ +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int inputSize) +{ + LZ4_stream_t_internal* streamPtr = &LZ4_dict->internal_donotuse; + int result; + const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize; + + const BYTE* smallest = dictEnd; + if (smallest > (const BYTE*) source) smallest = (const BYTE*) source; + LZ4_renormDictT(streamPtr, smallest); + + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); + + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + + return result; +} + + +/*! LZ4_saveDict() : + * If previously compressed data block is not guaranteed to remain available at its memory location, + * save it into a safer place (char* safeBuffer). + * Note : you don't need to call LZ4_loadDict() afterwards, + * dictionary is immediately usable, you can therefore call LZ4_compress_fast_continue(). + * Return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. + */ +int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; + + if ((U32)dictSize > 64 KB) dictSize = 64 KB; /* useless to define a dictionary > 64 KB */ + if ((U32)dictSize > dict->dictSize) dictSize = dict->dictSize; + + memmove(safeBuffer, previousDictEnd - dictSize, dictSize); + + dict->dictionary = (const BYTE*)safeBuffer; + dict->dictSize = (U32)dictSize; + + return dictSize; +} + + + +/*-***************************** +* Decompression functions +*******************************/ +/*! LZ4_decompress_generic() : + * This generic decompression function cover all use cases. + * It shall be instantiated several times, using different sets of directives + * Note that it is important this generic function is really inlined, + * in order to remove useless branches during compilation optimization. + */ +FORCE_INLINE int LZ4_decompress_generic( + const char* const source, + char* const dest, + int inputSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is the max size of Output Buffer. */ + + int endOnInput, /* endOnOutputSize, endOnInputSize */ + int partialDecoding, /* full, partial */ + int targetOutputSize, /* only used if partialDecoding==partial */ + int dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE* const lowPrefix, /* == dest when no prefix */ + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ + ) +{ + /* Local Variables */ + const BYTE* ip = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + + BYTE* op = (BYTE*) dest; + BYTE* const oend = op + outputSize; + BYTE* cpy; + BYTE* oexit = op + targetOutputSize; + const BYTE* const lowLimit = lowPrefix - dictSize; + + const BYTE* const dictEnd = (const BYTE*)dictStart + dictSize; + const unsigned dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; + const int dec64table[] = {0, 0, 0, -1, 0, 1, 2, 3}; + + const int safeDecode = (endOnInput==endOnInputSize); + const int checkOffset = ((safeDecode) && (dictSize < (int)(64 KB))); + + + /* Special cases */ + if ((partialDecoding) && (oexit > oend-MFLIMIT)) oexit = oend-MFLIMIT; /* targetOutputSize too high => decode everything */ + if ((endOnInput) && (unlikely(outputSize==0))) return ((inputSize==1) && (*ip==0)) ? 0 : -1; /* Empty output buffer */ + if ((!endOnInput) && (unlikely(outputSize==0))) return (*ip==0?1:-1); + + /* Main Loop : decode sequences */ + while (1) { + size_t length; + const BYTE* match; + size_t offset; + + /* get literal length */ + unsigned const token = *ip++; + if ((length=(token>>ML_BITS)) == RUN_MASK) { + unsigned s; + do { + s = *ip++; + length += s; + } while ( likely(endOnInput ? ip(partialDecoding?oexit:oend-MFLIMIT)) || (ip+length>iend-(2+1+LASTLITERALS))) ) + || ((!endOnInput) && (cpy>oend-WILDCOPYLENGTH)) ) + { + if (partialDecoding) { + if (cpy > oend) goto _output_error; /* Error : write attempt beyond end of output buffer */ + if ((endOnInput) && (ip+length > iend)) goto _output_error; /* Error : read attempt beyond end of input buffer */ + } else { + if ((!endOnInput) && (cpy != oend)) goto _output_error; /* Error : block decoding must stop exactly there */ + if ((endOnInput) && ((ip+length != iend) || (cpy > oend))) goto _output_error; /* Error : input must be consumed */ + } + memcpy(op, ip, length); + ip += length; + op += length; + break; /* Necessarily EOF, due to parsing restrictions */ + } + LZ4_wildCopy(op, ip, cpy); + ip += length; op = cpy; + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + if ((checkOffset) && (unlikely(match < lowLimit))) goto _output_error; /* Error : offset outside buffers */ + LZ4_write32(op, (U32)offset); /* costs ~1%; silence an msan warning when offset==0 */ + + /* get matchlength */ + length = token & ML_MASK; + if (length == ML_MASK) { + unsigned s; + do { + s = *ip++; + if ((endOnInput) && (ip > iend-LASTLITERALS)) goto _output_error; + length += s; + } while (s==255); + if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ + } + length += MINMATCH; + + /* check external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + if (unlikely(op+length > oend-LASTLITERALS)) goto _output_error; /* doesn't respect parsing restriction */ + + if (length <= (size_t)(lowPrefix-match)) { + /* match can be copied as a single segment from external dictionary */ + memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match encompass external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix-match); + size_t const restSize = length - copySize; + memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op-lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) *op++ = *copyFrom++; + } else { + memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + + /* copy match within block */ + cpy = op + length; + if (unlikely(offset<8)) { + const int dec64 = dec64table[offset]; + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += dec32table[offset]; + memcpy(op+4, match, 4); + match -= dec64; + } else { LZ4_copy8(op, match); match+=8; } + op += 8; + + if (unlikely(cpy>oend-12)) { + BYTE* const oCopyLimit = oend-(WILDCOPYLENGTH-1); + if (cpy > oend-LASTLITERALS) goto _output_error; /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ + if (op < oCopyLimit) { + LZ4_wildCopy(op, match, oCopyLimit); + match += oCopyLimit - op; + op = oCopyLimit; + } + while (op16) LZ4_wildCopy(op+8, match+8, cpy); + } + op=cpy; /* correction */ + } + + /* end of decoding */ + if (endOnInput) + return (int) (((char*)op)-dest); /* Nb of output bytes decoded */ + else + return (int) (((const char*)ip)-source); /* Nb of input bytes read */ + + /* Overflow error detected */ +_output_error: + return (int) (-(((const char*)ip)-source))-1; +} + + +int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, endOnInputSize, full, 0, noDict, (BYTE*)dest, NULL, 0); +} + +int LZ4_decompress_safe_partial(const char* source, char* dest, int compressedSize, int targetOutputSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, endOnInputSize, partial, targetOutputSize, noDict, (BYTE*)dest, NULL, 0); +} + +int LZ4_decompress_fast(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, withPrefix64k, (BYTE*)(dest - 64 KB), NULL, 64 KB); +} + + +/*===== streaming decompression functions =====*/ + +LZ4_streamDecode_t* LZ4_createStreamDecode(void) +{ + LZ4_streamDecode_t* lz4s = (LZ4_streamDecode_t*) ALLOCATOR(1, sizeof(LZ4_streamDecode_t)); + return lz4s; +} + +int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + FREEMEM(LZ4_stream); + return 0; +} + +/*! + * LZ4_setStreamDecode() : + * Use this function to instruct where to find the dictionary. + * This function is not necessary if previous data is still available where it was decoded. + * Loading a size of 0 is allowed (same effect as no dictionary). + * Return : 1 if OK, 0 if error + */ +int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + lz4sd->prefixSize = (size_t) dictSize; + lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + lz4sd->externalDict = NULL; + lz4sd->extDictSize = 0; + return 1; +} + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks must still be available at the memory position where they were decoded. + If it's not possible, save the relevant part of decoded data into a safe buffer, + and indicate where it stands using LZ4_setStreamDecode() +*/ +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixEnd == (BYTE*)dest) { + result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, full, 0, + usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += result; + lz4sd->prefixEnd += result; + } else { + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, full, 0, + usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } + + return result; +} + +int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixEnd == (BYTE*)dest) { + result = LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, full, 0, + usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += originalSize; + lz4sd->prefixEnd += originalSize; + } else { + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, full, 0, + usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } + + return result; +} + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as "_continue" ones, + the dictionary must be explicitly provided within parameters +*/ + +FORCE_INLINE int LZ4_decompress_usingDict_generic(const char* source, char* dest, int compressedSize, int maxOutputSize, int safe, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest, NULL, 0); + if (dictStart+dictSize == dest) { + if (dictSize >= (int)(64 KB - 1)) + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, withPrefix64k, (BYTE*)dest-64 KB, NULL, 0); + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest-dictSize, NULL, 0); + } + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_usingDict_generic(source, dest, compressedSize, maxOutputSize, 1, dictStart, dictSize); +} + +int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_usingDict_generic(source, dest, 0, originalSize, 0, dictStart, dictSize); +} + +/* debug function */ +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + + +/*=************************************************* +* Obsolete Functions +***************************************************/ +/* obsolete compression functions */ +int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) { return LZ4_compress_default(source, dest, inputSize, maxOutputSize); } +int LZ4_compress(const char* source, char* dest, int inputSize) { return LZ4_compress_default(source, dest, inputSize, LZ4_compressBound(inputSize)); } +int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); } +int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); } +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, maxDstSize, 1); } +int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) { return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); } + +/* +These function names are deprecated and should no longer be used. +They are only provided here for compatibility with older user programs. +- LZ4_uncompress is totally equivalent to LZ4_decompress_fast +- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe +*/ +int LZ4_uncompress (const char* source, char* dest, int outputSize) { return LZ4_decompress_fast(source, dest, outputSize); } +int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) { return LZ4_decompress_safe(source, dest, isize, maxOutputSize); } + + +/* Obsolete Streaming functions */ + +int LZ4_sizeofStreamState() { return LZ4_STREAMSIZE; } + +static void LZ4_init(LZ4_stream_t* lz4ds, BYTE* base) +{ + MEM_INIT(lz4ds, 0, sizeof(LZ4_stream_t)); + lz4ds->internal_donotuse.bufferStart = base; +} + +int LZ4_resetStreamState(void* state, char* inputBuffer) +{ + if ((((uptrval)state) & 3) != 0) return 1; /* Error : pointer is not aligned on 4-bytes boundary */ + LZ4_init((LZ4_stream_t*)state, (BYTE*)inputBuffer); + return 0; +} + +void* LZ4_create (char* inputBuffer) +{ + LZ4_stream_t* lz4ds = (LZ4_stream_t*)ALLOCATOR(8, sizeof(LZ4_stream_t)); + LZ4_init (lz4ds, (BYTE*)inputBuffer); + return lz4ds; +} + +char* LZ4_slideInputBuffer (void* LZ4_Data) +{ + LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)LZ4_Data)->internal_donotuse; + int dictSize = LZ4_saveDict((LZ4_stream_t*)LZ4_Data, (char*)ctx->bufferStart, 64 KB); + return (char*)(ctx->bufferStart + dictSize); +} + +/* Obsolete streaming decompression functions */ + +int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB); +} + +int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB); +} + +#endif /* LZ4_COMMONDEFS_ONLY */ diff --git a/samtools/lz4/lz4.c.pysam.c b/samtools/lz4/lz4.c.pysam.c new file mode 100644 index 0000000..a4a8ab4 --- /dev/null +++ b/samtools/lz4/lz4.c.pysam.c @@ -0,0 +1,1480 @@ +#include "samtools.pysam.h" + +/* + LZ4 - Fast LZ compression algorithm + Copyright (C) 2011-2017, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ + + +/*-************************************ +* Tuning parameters +**************************************/ +/* + * LZ4_HEAPMODE : + * Select how default compression functions will allocate memory for their hash table, + * in memory stack (0:default, fastest), or in memory heap (1:requires malloc()). + */ +#ifndef LZ4_HEAPMODE +# define LZ4_HEAPMODE 0 +#endif + +/* + * ACCELERATION_DEFAULT : + * Select "acceleration" for LZ4_compress_fast() when parameter value <= 0 + */ +#define ACCELERATION_DEFAULT 1 + + +/*-************************************ +* CPU Feature Detection +**************************************/ +/* LZ4_FORCE_MEMORY_ACCESS + * By default, access to unaligned memory is controlled by `memcpy()`, which is safe and portable. + * Unfortunately, on some target/compiler combinations, the generated assembly is sub-optimal. + * The below switch allow to select different access method for improved performance. + * Method 0 (default) : use `memcpy()`. Safe and portable. + * Method 1 : `__packed` statement. It depends on compiler extension (ie, not portable). + * This method is safe if your compiler supports it, and *generally* as fast or faster than `memcpy`. + * Method 2 : direct access. This method is portable but violate C standard. + * It can generate buggy code on targets which assembly generation depends on alignment. + * But in some circumstances, it's the only known way to get the most performance (ie GCC + ARMv6) + * See https://fastcompression.blogspot.fr/2015/08/accessing-unaligned-memory.html for details. + * Prefer these methods in priority order (0 > 1 > 2) + */ +#ifndef LZ4_FORCE_MEMORY_ACCESS /* can be defined externally */ +# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) ) +# define LZ4_FORCE_MEMORY_ACCESS 2 +# elif defined(__INTEL_COMPILER) || defined(__GNUC__) +# define LZ4_FORCE_MEMORY_ACCESS 1 +# endif +#endif + +/* + * LZ4_FORCE_SW_BITCOUNT + * Define this parameter if your target system or compiler does not support hardware bit count + */ +#if defined(_MSC_VER) && defined(_WIN32_WCE) /* Visual Studio for Windows CE does not support Hardware bit count */ +# define LZ4_FORCE_SW_BITCOUNT +#endif + + +/*-************************************ +* Dependency +**************************************/ +#include "lz4.h" +/* see also "memory routines" below */ + + +/*-************************************ +* Compiler Options +**************************************/ +#ifdef _MSC_VER /* Visual Studio */ +# include +# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ +# pragma warning(disable : 4293) /* disable: C4293: too large shift (32-bits) */ +#endif /* _MSC_VER */ + +#ifndef FORCE_INLINE +# ifdef _MSC_VER /* Visual Studio */ +# define FORCE_INLINE static __forceinline +# else +# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ +# ifdef __GNUC__ +# define FORCE_INLINE static inline __attribute__((always_inline)) +# else +# define FORCE_INLINE static inline +# endif +# else +# define FORCE_INLINE static +# endif /* __STDC_VERSION__ */ +# endif /* _MSC_VER */ +#endif /* FORCE_INLINE */ + +#if (defined(__GNUC__) && (__GNUC__ >= 3)) || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) || defined(__clang__) +# define expect(expr,value) (__builtin_expect ((expr),(value)) ) +#else +# define expect(expr,value) (expr) +#endif + +#define likely(expr) expect((expr) != 0, 1) +#define unlikely(expr) expect((expr) != 0, 0) + + +/*-************************************ +* Memory routines +**************************************/ +#include /* malloc, calloc, free */ +#define ALLOCATOR(n,s) calloc(n,s) +#define FREEMEM free +#include /* memset, memcpy */ +#define MEM_INIT memset + + +/*-************************************ +* Basic Types +**************************************/ +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef uint8_t BYTE; + typedef uint16_t U16; + typedef uint32_t U32; + typedef int32_t S32; + typedef uint64_t U64; + typedef uintptr_t uptrval; +#else + typedef unsigned char BYTE; + typedef unsigned short U16; + typedef unsigned int U32; + typedef signed int S32; + typedef unsigned long long U64; + typedef size_t uptrval; /* generally true, except OpenVMS-64 */ +#endif + +#if defined(__x86_64__) + typedef U64 reg_t; /* 64-bits in x32 mode */ +#else + typedef size_t reg_t; /* 32-bits in x32 mode */ +#endif + +/*-************************************ +* Reading and writing into memory +**************************************/ +static unsigned LZ4_isLittleEndian(void) +{ + const union { U32 u; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */ + return one.c[0]; +} + + +#if defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==2) +/* lie to the compiler about data alignment; use with caution */ + +static U16 LZ4_read16(const void* memPtr) { return *(const U16*) memPtr; } +static U32 LZ4_read32(const void* memPtr) { return *(const U32*) memPtr; } +static reg_t LZ4_read_ARCH(const void* memPtr) { return *(const reg_t*) memPtr; } + +static void LZ4_write16(void* memPtr, U16 value) { *(U16*)memPtr = value; } +static void LZ4_write32(void* memPtr, U32 value) { *(U32*)memPtr = value; } + +#elif defined(LZ4_FORCE_MEMORY_ACCESS) && (LZ4_FORCE_MEMORY_ACCESS==1) + +/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */ +/* currently only defined for gcc and icc */ +typedef union { U16 u16; U32 u32; reg_t uArch; } __attribute__((packed)) unalign; + +static U16 LZ4_read16(const void* ptr) { return ((const unalign*)ptr)->u16; } +static U32 LZ4_read32(const void* ptr) { return ((const unalign*)ptr)->u32; } +static reg_t LZ4_read_ARCH(const void* ptr) { return ((const unalign*)ptr)->uArch; } + +static void LZ4_write16(void* memPtr, U16 value) { ((unalign*)memPtr)->u16 = value; } +static void LZ4_write32(void* memPtr, U32 value) { ((unalign*)memPtr)->u32 = value; } + +#else /* safe and portable access through memcpy() */ + +static U16 LZ4_read16(const void* memPtr) +{ + U16 val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static U32 LZ4_read32(const void* memPtr) +{ + U32 val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static reg_t LZ4_read_ARCH(const void* memPtr) +{ + reg_t val; memcpy(&val, memPtr, sizeof(val)); return val; +} + +static void LZ4_write16(void* memPtr, U16 value) +{ + memcpy(memPtr, &value, sizeof(value)); +} + +static void LZ4_write32(void* memPtr, U32 value) +{ + memcpy(memPtr, &value, sizeof(value)); +} + +#endif /* LZ4_FORCE_MEMORY_ACCESS */ + + +static U16 LZ4_readLE16(const void* memPtr) +{ + if (LZ4_isLittleEndian()) { + return LZ4_read16(memPtr); + } else { + const BYTE* p = (const BYTE*)memPtr; + return (U16)((U16)p[0] + (p[1]<<8)); + } +} + +static void LZ4_writeLE16(void* memPtr, U16 value) +{ + if (LZ4_isLittleEndian()) { + LZ4_write16(memPtr, value); + } else { + BYTE* p = (BYTE*)memPtr; + p[0] = (BYTE) value; + p[1] = (BYTE)(value>>8); + } +} + +static void LZ4_copy8(void* dst, const void* src) +{ + memcpy(dst,src,8); +} + +/* customized variant of memcpy, which can overwrite up to 8 bytes beyond dstEnd */ +static void LZ4_wildCopy(void* dstPtr, const void* srcPtr, void* dstEnd) +{ + BYTE* d = (BYTE*)dstPtr; + const BYTE* s = (const BYTE*)srcPtr; + BYTE* const e = (BYTE*)dstEnd; + + do { LZ4_copy8(d,s); d+=8; s+=8; } while (d=2) +# include +# define DEBUGLOG(l, ...) { \ + if (l<=LZ4_DEBUG) { \ + fprintf(samtools_stderr, __FILE__ ": "); \ + fprintf(samtools_stderr, __VA_ARGS__); \ + fprintf(samtools_stderr, " \n"); \ + } } +#else +# define DEBUGLOG(l, ...) {} /* disabled */ +#endif + + +/*-************************************ +* Common functions +**************************************/ +static unsigned LZ4_NbCommonBytes (register reg_t val) +{ + if (LZ4_isLittleEndian()) { + if (sizeof(val)==8) { +# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanForward64( &r, (U64)val ); + return (int)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_ctzll((U64)val) >> 3); +# else + static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2, 0, 3, 1, 3, 1, 4, 2, 7, 0, 2, 3, 6, 1, 5, 3, 5, 1, 3, 4, 4, 2, 5, 6, 7, 7, 0, 1, 2, 3, 3, 4, 6, 2, 6, 5, 5, 3, 4, 5, 6, 7, 1, 2, 4, 6, 4, 4, 5, 7, 2, 6, 5, 7, 6, 7, 7 }; + return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58]; +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r; + _BitScanForward( &r, (U32)val ); + return (int)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_ctz((U32)val) >> 3); +# else + static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0, 3, 2, 2, 1, 3, 2, 0, 1, 3, 3, 1, 2, 2, 2, 2, 0, 3, 1, 2, 0, 1, 0, 1, 1 }; + return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27]; +# endif + } + } else /* Big Endian CPU */ { + if (sizeof(val)==8) { +# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanReverse64( &r, val ); + return (unsigned)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_clzll((U64)val) >> 3); +# else + unsigned r; + if (!(val>>32)) { r=4; } else { r=0; val>>=32; } + if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; } + r += (!val); + return r; +# endif + } else /* 32 bits */ { +# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) + unsigned long r = 0; + _BitScanReverse( &r, (unsigned long)val ); + return (unsigned)(r>>3); +# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT) + return (__builtin_clz((U32)val) >> 3); +# else + unsigned r; + if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; } + r += (!val); + return r; +# endif + } + } +} + +#define STEPSIZE sizeof(reg_t) +static unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* pInLimit) +{ + const BYTE* const pStart = pIn; + + while (likely(pIn compression run slower on incompressible data */ + + +/*-************************************ +* Local Structures and types +**************************************/ +typedef enum { notLimited = 0, limitedOutput = 1 } limitedOutput_directive; +typedef enum { byPtr, byU32, byU16 } tableType_t; + +typedef enum { noDict = 0, withPrefix64k, usingExtDict } dict_directive; +typedef enum { noDictIssue = 0, dictSmall } dictIssue_directive; + +typedef enum { endOnOutputSize = 0, endOnInputSize = 1 } endCondition_directive; +typedef enum { full = 0, partial = 1 } earlyEnd_directive; + + +/*-************************************ +* Local Utils +**************************************/ +int LZ4_versionNumber (void) { return LZ4_VERSION_NUMBER; } +const char* LZ4_versionString(void) { return LZ4_VERSION_STRING; } +int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize); } +int LZ4_sizeofState() { return LZ4_STREAMSIZE; } + + +/*-****************************** +* Compression functions +********************************/ +static U32 LZ4_hash4(U32 sequence, tableType_t const tableType) +{ + if (tableType == byU16) + return ((sequence * 2654435761U) >> ((MINMATCH*8)-(LZ4_HASHLOG+1))); + else + return ((sequence * 2654435761U) >> ((MINMATCH*8)-LZ4_HASHLOG)); +} + +static U32 LZ4_hash5(U64 sequence, tableType_t const tableType) +{ + static const U64 prime5bytes = 889523592379ULL; + static const U64 prime8bytes = 11400714785074694791ULL; + const U32 hashLog = (tableType == byU16) ? LZ4_HASHLOG+1 : LZ4_HASHLOG; + if (LZ4_isLittleEndian()) + return (U32)(((sequence << 24) * prime5bytes) >> (64 - hashLog)); + else + return (U32)(((sequence >> 24) * prime8bytes) >> (64 - hashLog)); +} + +FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType) +{ + if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType); + return LZ4_hash4(LZ4_read32(p), tableType); +} + +static void LZ4_putPositionOnHash(const BYTE* p, U32 h, void* tableBase, tableType_t const tableType, const BYTE* srcBase) +{ + switch (tableType) + { + case byPtr: { const BYTE** hashTable = (const BYTE**)tableBase; hashTable[h] = p; return; } + case byU32: { U32* hashTable = (U32*) tableBase; hashTable[h] = (U32)(p-srcBase); return; } + case byU16: { U16* hashTable = (U16*) tableBase; hashTable[h] = (U16)(p-srcBase); return; } + } +} + +FORCE_INLINE void LZ4_putPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + LZ4_putPositionOnHash(p, h, tableBase, tableType, srcBase); +} + +static const BYTE* LZ4_getPositionOnHash(U32 h, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + if (tableType == byPtr) { const BYTE** hashTable = (const BYTE**) tableBase; return hashTable[h]; } + if (tableType == byU32) { const U32* const hashTable = (U32*) tableBase; return hashTable[h] + srcBase; } + { const U16* const hashTable = (U16*) tableBase; return hashTable[h] + srcBase; } /* default, to ensure a return */ +} + +FORCE_INLINE const BYTE* LZ4_getPosition(const BYTE* p, void* tableBase, tableType_t tableType, const BYTE* srcBase) +{ + U32 const h = LZ4_hashPosition(p, tableType); + return LZ4_getPositionOnHash(h, tableBase, tableType, srcBase); +} + + +/** LZ4_compress_generic() : + inlined, to ensure branches are decided at compilation time */ +FORCE_INLINE int LZ4_compress_generic( + LZ4_stream_t_internal* const cctx, + const char* const source, + char* const dest, + const int inputSize, + const int maxOutputSize, + const limitedOutput_directive outputLimited, + const tableType_t tableType, + const dict_directive dict, + const dictIssue_directive dictIssue, + const U32 acceleration) +{ + const BYTE* ip = (const BYTE*) source; + const BYTE* base; + const BYTE* lowLimit; + const BYTE* const lowRefLimit = ip - cctx->dictSize; + const BYTE* const dictionary = cctx->dictionary; + const BYTE* const dictEnd = dictionary + cctx->dictSize; + const ptrdiff_t dictDelta = dictEnd - (const BYTE*)source; + const BYTE* anchor = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = iend - LASTLITERALS; + + BYTE* op = (BYTE*) dest; + BYTE* const olimit = op + maxOutputSize; + + U32 forwardH; + + /* Init conditions */ + if ((U32)inputSize > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported inputSize, too large (or negative) */ + switch(dict) + { + case noDict: + default: + base = (const BYTE*)source; + lowLimit = (const BYTE*)source; + break; + case withPrefix64k: + base = (const BYTE*)source - cctx->currentOffset; + lowLimit = (const BYTE*)source - cctx->dictSize; + break; + case usingExtDict: + base = (const BYTE*)source - cctx->currentOffset; + lowLimit = (const BYTE*)source; + break; + } + if ((tableType == byU16) && (inputSize>=LZ4_64Klimit)) return 0; /* Size too large (not within 64K limit) */ + if (inputSizehashTable, tableType, base); + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + ptrdiff_t refDelta = 0; + const BYTE* match; + BYTE* token; + + /* Find a match */ + { const BYTE* forwardIp = ip; + unsigned step = 1; + unsigned searchMatchNb = acceleration << LZ4_skipTrigger; + do { + U32 const h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimit)) goto _last_literals; + + match = LZ4_getPositionOnHash(h, cctx->hashTable, tableType, base); + if (dict==usingExtDict) { + if (match < (const BYTE*)source) { + refDelta = dictDelta; + lowLimit = dictionary; + } else { + refDelta = 0; + lowLimit = (const BYTE*)source; + } } + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, cctx->hashTable, tableType, base); + + } while ( ((dictIssue==dictSmall) ? (match < lowRefLimit) : 0) + || ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip)) + || (LZ4_read32(match+refDelta) != LZ4_read32(ip)) ); + } + + /* Catch up */ + while (((ip>anchor) & (match+refDelta > lowLimit)) && (unlikely(ip[-1]==match[refDelta-1]))) { ip--; match--; } + + /* Encode Literals */ + { unsigned const litLength = (unsigned)(ip - anchor); + token = op++; + if ((outputLimited) && /* Check output buffer overflow */ + (unlikely(op + litLength + (2 + 1 + LASTLITERALS) + (litLength/255) > olimit))) + return 0; + if (litLength >= RUN_MASK) { + int len = (int)litLength-RUN_MASK; + *token = (RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< matchlimit) limit = matchlimit; + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, limit); + ip += MINMATCH + matchCode; + if (ip==limit) { + unsigned const more = LZ4_count(ip, (const BYTE*)source, matchlimit); + matchCode += more; + ip += more; + } + } else { + matchCode = LZ4_count(ip+MINMATCH, match+MINMATCH, matchlimit); + ip += MINMATCH + matchCode; + } + + if ( outputLimited && /* Check output buffer overflow */ + (unlikely(op + (1 + LASTLITERALS) + (matchCode>>8) > olimit)) ) + return 0; + if (matchCode >= ML_MASK) { + *token += ML_MASK; + matchCode -= ML_MASK; + LZ4_write32(op, 0xFFFFFFFF); + while (matchCode >= 4*255) op+=4, LZ4_write32(op, 0xFFFFFFFF), matchCode -= 4*255; + op += matchCode / 255; + *op++ = (BYTE)(matchCode % 255); + } else + *token += (BYTE)(matchCode); + } + + anchor = ip; + + /* Test end of chunk */ + if (ip > mflimit) break; + + /* Fill table */ + LZ4_putPosition(ip-2, cctx->hashTable, tableType, base); + + /* Test next position */ + match = LZ4_getPosition(ip, cctx->hashTable, tableType, base); + if (dict==usingExtDict) { + if (match < (const BYTE*)source) { + refDelta = dictDelta; + lowLimit = dictionary; + } else { + refDelta = 0; + lowLimit = (const BYTE*)source; + } } + LZ4_putPosition(ip, cctx->hashTable, tableType, base); + if ( ((dictIssue==dictSmall) ? (match>=lowRefLimit) : 1) + && (match+MAX_DISTANCE>=ip) + && (LZ4_read32(match+refDelta)==LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + } + +_last_literals: + /* Encode Last Literals */ + { size_t const lastRun = (size_t)(iend - anchor); + if ( (outputLimited) && /* Check output buffer overflow */ + ((op - (BYTE*)dest) + lastRun + 1 + ((lastRun+255-RUN_MASK)/255) > (U32)maxOutputSize) ) + return 0; + if (lastRun >= RUN_MASK) { + size_t accumulator = lastRun - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRun<internal_donotuse; + LZ4_resetStream((LZ4_stream_t*)state); + if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; + + if (maxOutputSize >= LZ4_compressBound(inputSize)) { + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(ctx, source, dest, inputSize, 0, notLimited, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(ctx, source, dest, inputSize, 0, notLimited, (sizeof(void*)==8) ? byU32 : byPtr, noDict, noDictIssue, acceleration); + } else { + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(ctx, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(ctx, source, dest, inputSize, maxOutputSize, limitedOutput, (sizeof(void*)==8) ? byU32 : byPtr, noDict, noDictIssue, acceleration); + } +} + + +int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ +#if (LZ4_HEAPMODE) + void* ctxPtr = ALLOCATOR(1, sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ +#else + LZ4_stream_t ctx; + void* const ctxPtr = &ctx; +#endif + + int const result = LZ4_compress_fast_extState(ctxPtr, source, dest, inputSize, maxOutputSize, acceleration); + +#if (LZ4_HEAPMODE) + FREEMEM(ctxPtr); +#endif + return result; +} + + +int LZ4_compress_default(const char* source, char* dest, int inputSize, int maxOutputSize) +{ + return LZ4_compress_fast(source, dest, inputSize, maxOutputSize, 1); +} + + +/* hidden debug function */ +/* strangely enough, gcc generates faster code when this function is uncommented, even if unused */ +int LZ4_compress_fast_force(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t ctx; + LZ4_resetStream(&ctx); + + if (inputSize < LZ4_64Klimit) + return LZ4_compress_generic(&ctx.internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, byU16, noDict, noDictIssue, acceleration); + else + return LZ4_compress_generic(&ctx.internal_donotuse, source, dest, inputSize, maxOutputSize, limitedOutput, sizeof(void*)==8 ? byU32 : byPtr, noDict, noDictIssue, acceleration); +} + + +/*-****************************** +* *_destSize() variant +********************************/ + +static int LZ4_compress_destSize_generic( + LZ4_stream_t_internal* const ctx, + const char* const src, + char* const dst, + int* const srcSizePtr, + const int targetDstSize, + const tableType_t tableType) +{ + const BYTE* ip = (const BYTE*) src; + const BYTE* base = (const BYTE*) src; + const BYTE* lowLimit = (const BYTE*) src; + const BYTE* anchor = ip; + const BYTE* const iend = ip + *srcSizePtr; + const BYTE* const mflimit = iend - MFLIMIT; + const BYTE* const matchlimit = iend - LASTLITERALS; + + BYTE* op = (BYTE*) dst; + BYTE* const oend = op + targetDstSize; + BYTE* const oMaxLit = op + targetDstSize - 2 /* offset */ - 8 /* because 8+MINMATCH==MFLIMIT */ - 1 /* token */; + BYTE* const oMaxMatch = op + targetDstSize - (LASTLITERALS + 1 /* token */); + BYTE* const oMaxSeq = oMaxLit - 1 /* token */; + + U32 forwardH; + + + /* Init conditions */ + if (targetDstSize < 1) return 0; /* Impossible to store anything */ + if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size, too large (or negative) */ + if ((tableType == byU16) && (*srcSizePtr>=LZ4_64Klimit)) return 0; /* Size too large (not within 64K limit) */ + if (*srcSizePtrhashTable, tableType, base); + ip++; forwardH = LZ4_hashPosition(ip, tableType); + + /* Main Loop */ + for ( ; ; ) { + const BYTE* match; + BYTE* token; + + /* Find a match */ + { const BYTE* forwardIp = ip; + unsigned step = 1; + unsigned searchMatchNb = 1 << LZ4_skipTrigger; + + do { + U32 h = forwardH; + ip = forwardIp; + forwardIp += step; + step = (searchMatchNb++ >> LZ4_skipTrigger); + + if (unlikely(forwardIp > mflimit)) goto _last_literals; + + match = LZ4_getPositionOnHash(h, ctx->hashTable, tableType, base); + forwardH = LZ4_hashPosition(forwardIp, tableType); + LZ4_putPositionOnHash(ip, h, ctx->hashTable, tableType, base); + + } while ( ((tableType==byU16) ? 0 : (match + MAX_DISTANCE < ip)) + || (LZ4_read32(match) != LZ4_read32(ip)) ); + } + + /* Catch up */ + while ((ip>anchor) && (match > lowLimit) && (unlikely(ip[-1]==match[-1]))) { ip--; match--; } + + /* Encode Literal length */ + { unsigned litLength = (unsigned)(ip - anchor); + token = op++; + if (op + ((litLength+240)/255) + litLength > oMaxLit) { + /* Not enough space for a last match */ + op--; + goto _last_literals; + } + if (litLength>=RUN_MASK) { + unsigned len = litLength - RUN_MASK; + *token=(RUN_MASK<= 255 ; len-=255) *op++ = 255; + *op++ = (BYTE)len; + } + else *token = (BYTE)(litLength< oMaxMatch) { + /* Match description too long : reduce it */ + matchLength = (15-1) + (oMaxMatch-op) * 255; + } + ip += MINMATCH + matchLength; + + if (matchLength>=ML_MASK) { + *token += ML_MASK; + matchLength -= ML_MASK; + while (matchLength >= 255) { matchLength-=255; *op++ = 255; } + *op++ = (BYTE)matchLength; + } + else *token += (BYTE)(matchLength); + } + + anchor = ip; + + /* Test end of block */ + if (ip > mflimit) break; + if (op > oMaxSeq) break; + + /* Fill table */ + LZ4_putPosition(ip-2, ctx->hashTable, tableType, base); + + /* Test next position */ + match = LZ4_getPosition(ip, ctx->hashTable, tableType, base); + LZ4_putPosition(ip, ctx->hashTable, tableType, base); + if ( (match+MAX_DISTANCE>=ip) + && (LZ4_read32(match)==LZ4_read32(ip)) ) + { token=op++; *token=0; goto _next_match; } + + /* Prepare next loop */ + forwardH = LZ4_hashPosition(++ip, tableType); + } + +_last_literals: + /* Encode Last Literals */ + { size_t lastRunSize = (size_t)(iend - anchor); + if (op + 1 /* token */ + ((lastRunSize+240)/255) /* litLength */ + lastRunSize /* literals */ > oend) { + /* adapt lastRunSize to fill 'dst' */ + lastRunSize = (oend-op) - 1; + lastRunSize -= (lastRunSize+240)/255; + } + ip = anchor + lastRunSize; + + if (lastRunSize >= RUN_MASK) { + size_t accumulator = lastRunSize - RUN_MASK; + *op++ = RUN_MASK << ML_BITS; + for(; accumulator >= 255 ; accumulator-=255) *op++ = 255; + *op++ = (BYTE) accumulator; + } else { + *op++ = (BYTE)(lastRunSize<= LZ4_compressBound(*srcSizePtr)) { /* compression success is guaranteed */ + return LZ4_compress_fast_extState(state, src, dst, *srcSizePtr, targetDstSize, 1); + } else { + if (*srcSizePtr < LZ4_64Klimit) + return LZ4_compress_destSize_generic(&state->internal_donotuse, src, dst, srcSizePtr, targetDstSize, byU16); + else + return LZ4_compress_destSize_generic(&state->internal_donotuse, src, dst, srcSizePtr, targetDstSize, sizeof(void*)==8 ? byU32 : byPtr); + } +} + + +int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize) +{ +#if (LZ4_HEAPMODE) + LZ4_stream_t* ctx = (LZ4_stream_t*)ALLOCATOR(1, sizeof(LZ4_stream_t)); /* malloc-calloc always properly aligned */ +#else + LZ4_stream_t ctxBody; + LZ4_stream_t* ctx = &ctxBody; +#endif + + int result = LZ4_compress_destSize_extState(ctx, src, dst, srcSizePtr, targetDstSize); + +#if (LZ4_HEAPMODE) + FREEMEM(ctx); +#endif + return result; +} + + + +/*-****************************** +* Streaming functions +********************************/ + +LZ4_stream_t* LZ4_createStream(void) +{ + LZ4_stream_t* lz4s = (LZ4_stream_t*)ALLOCATOR(8, LZ4_STREAMSIZE_U64); + LZ4_STATIC_ASSERT(LZ4_STREAMSIZE >= sizeof(LZ4_stream_t_internal)); /* A compilation error here means LZ4_STREAMSIZE is not large enough */ + LZ4_resetStream(lz4s); + return lz4s; +} + +void LZ4_resetStream (LZ4_stream_t* LZ4_stream) +{ + MEM_INIT(LZ4_stream, 0, sizeof(LZ4_stream_t)); +} + +int LZ4_freeStream (LZ4_stream_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + FREEMEM(LZ4_stream); + return (0); +} + + +#define HASH_UNIT sizeof(reg_t) +int LZ4_loadDict (LZ4_stream_t* LZ4_dict, const char* dictionary, int dictSize) +{ + LZ4_stream_t_internal* dict = &LZ4_dict->internal_donotuse; + const BYTE* p = (const BYTE*)dictionary; + const BYTE* const dictEnd = p + dictSize; + const BYTE* base; + + if ((dict->initCheck) || (dict->currentOffset > 1 GB)) /* Uninitialized structure, or reuse overflow */ + LZ4_resetStream(LZ4_dict); + + if (dictSize < (int)HASH_UNIT) { + dict->dictionary = NULL; + dict->dictSize = 0; + return 0; + } + + if ((dictEnd - p) > 64 KB) p = dictEnd - 64 KB; + dict->currentOffset += 64 KB; + base = p - dict->currentOffset; + dict->dictionary = p; + dict->dictSize = (U32)(dictEnd - p); + dict->currentOffset += dict->dictSize; + + while (p <= dictEnd-HASH_UNIT) { + LZ4_putPosition(p, dict->hashTable, byU32, base); + p+=3; + } + + return dict->dictSize; +} + + +static void LZ4_renormDictT(LZ4_stream_t_internal* LZ4_dict, const BYTE* src) +{ + if ((LZ4_dict->currentOffset > 0x80000000) || + ((uptrval)LZ4_dict->currentOffset > (uptrval)src)) { /* address space overflow */ + /* rescale hash table */ + U32 const delta = LZ4_dict->currentOffset - 64 KB; + const BYTE* dictEnd = LZ4_dict->dictionary + LZ4_dict->dictSize; + int i; + for (i=0; ihashTable[i] < delta) LZ4_dict->hashTable[i]=0; + else LZ4_dict->hashTable[i] -= delta; + } + LZ4_dict->currentOffset = 64 KB; + if (LZ4_dict->dictSize > 64 KB) LZ4_dict->dictSize = 64 KB; + LZ4_dict->dictionary = dictEnd - LZ4_dict->dictSize; + } +} + + +int LZ4_compress_fast_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration) +{ + LZ4_stream_t_internal* streamPtr = &LZ4_stream->internal_donotuse; + const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize; + + const BYTE* smallest = (const BYTE*) source; + if (streamPtr->initCheck) return 0; /* Uninitialized structure detected */ + if ((streamPtr->dictSize>0) && (smallest>dictEnd)) smallest = dictEnd; + LZ4_renormDictT(streamPtr, smallest); + if (acceleration < 1) acceleration = ACCELERATION_DEFAULT; + + /* Check overlapping input/dictionary space */ + { const BYTE* sourceEnd = (const BYTE*) source + inputSize; + if ((sourceEnd > streamPtr->dictionary) && (sourceEnd < dictEnd)) { + streamPtr->dictSize = (U32)(dictEnd - sourceEnd); + if (streamPtr->dictSize > 64 KB) streamPtr->dictSize = 64 KB; + if (streamPtr->dictSize < 4) streamPtr->dictSize = 0; + streamPtr->dictionary = dictEnd - streamPtr->dictSize; + } + } + + /* prefix mode : source data follows dictionary */ + if (dictEnd == (const BYTE*)source) { + int result; + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, dictSmall, acceleration); + else + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, withPrefix64k, noDictIssue, acceleration); + streamPtr->dictSize += (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + return result; + } + + /* external dictionary mode */ + { int result; + if ((streamPtr->dictSize < 64 KB) && (streamPtr->dictSize < streamPtr->currentOffset)) + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, dictSmall, acceleration); + else + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, maxOutputSize, limitedOutput, byU32, usingExtDict, noDictIssue, acceleration); + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + return result; + } +} + + +/* Hidden debug function, to force external dictionary mode */ +int LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_dict, const char* source, char* dest, int inputSize) +{ + LZ4_stream_t_internal* streamPtr = &LZ4_dict->internal_donotuse; + int result; + const BYTE* const dictEnd = streamPtr->dictionary + streamPtr->dictSize; + + const BYTE* smallest = dictEnd; + if (smallest > (const BYTE*) source) smallest = (const BYTE*) source; + LZ4_renormDictT(streamPtr, smallest); + + result = LZ4_compress_generic(streamPtr, source, dest, inputSize, 0, notLimited, byU32, usingExtDict, noDictIssue, 1); + + streamPtr->dictionary = (const BYTE*)source; + streamPtr->dictSize = (U32)inputSize; + streamPtr->currentOffset += (U32)inputSize; + + return result; +} + + +/*! LZ4_saveDict() : + * If previously compressed data block is not guaranteed to remain available at its memory location, + * save it into a safer place (char* safeBuffer). + * Note : you don't need to call LZ4_loadDict() afterwards, + * dictionary is immediately usable, you can therefore call LZ4_compress_fast_continue(). + * Return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. + */ +int LZ4_saveDict (LZ4_stream_t* LZ4_dict, char* safeBuffer, int dictSize) +{ + LZ4_stream_t_internal* const dict = &LZ4_dict->internal_donotuse; + const BYTE* const previousDictEnd = dict->dictionary + dict->dictSize; + + if ((U32)dictSize > 64 KB) dictSize = 64 KB; /* useless to define a dictionary > 64 KB */ + if ((U32)dictSize > dict->dictSize) dictSize = dict->dictSize; + + memmove(safeBuffer, previousDictEnd - dictSize, dictSize); + + dict->dictionary = (const BYTE*)safeBuffer; + dict->dictSize = (U32)dictSize; + + return dictSize; +} + + + +/*-***************************** +* Decompression functions +*******************************/ +/*! LZ4_decompress_generic() : + * This generic decompression function cover all use cases. + * It shall be instantiated several times, using different sets of directives + * Note that it is important this generic function is really inlined, + * in order to remove useless branches during compilation optimization. + */ +FORCE_INLINE int LZ4_decompress_generic( + const char* const source, + char* const dest, + int inputSize, + int outputSize, /* If endOnInput==endOnInputSize, this value is the max size of Output Buffer. */ + + int endOnInput, /* endOnOutputSize, endOnInputSize */ + int partialDecoding, /* full, partial */ + int targetOutputSize, /* only used if partialDecoding==partial */ + int dict, /* noDict, withPrefix64k, usingExtDict */ + const BYTE* const lowPrefix, /* == dest when no prefix */ + const BYTE* const dictStart, /* only if dict==usingExtDict */ + const size_t dictSize /* note : = 0 if noDict */ + ) +{ + /* Local Variables */ + const BYTE* ip = (const BYTE*) source; + const BYTE* const iend = ip + inputSize; + + BYTE* op = (BYTE*) dest; + BYTE* const oend = op + outputSize; + BYTE* cpy; + BYTE* oexit = op + targetOutputSize; + const BYTE* const lowLimit = lowPrefix - dictSize; + + const BYTE* const dictEnd = (const BYTE*)dictStart + dictSize; + const unsigned dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; + const int dec64table[] = {0, 0, 0, -1, 0, 1, 2, 3}; + + const int safeDecode = (endOnInput==endOnInputSize); + const int checkOffset = ((safeDecode) && (dictSize < (int)(64 KB))); + + + /* Special cases */ + if ((partialDecoding) && (oexit > oend-MFLIMIT)) oexit = oend-MFLIMIT; /* targetOutputSize too high => decode everything */ + if ((endOnInput) && (unlikely(outputSize==0))) return ((inputSize==1) && (*ip==0)) ? 0 : -1; /* Empty output buffer */ + if ((!endOnInput) && (unlikely(outputSize==0))) return (*ip==0?1:-1); + + /* Main Loop : decode sequences */ + while (1) { + size_t length; + const BYTE* match; + size_t offset; + + /* get literal length */ + unsigned const token = *ip++; + if ((length=(token>>ML_BITS)) == RUN_MASK) { + unsigned s; + do { + s = *ip++; + length += s; + } while ( likely(endOnInput ? ip(partialDecoding?oexit:oend-MFLIMIT)) || (ip+length>iend-(2+1+LASTLITERALS))) ) + || ((!endOnInput) && (cpy>oend-WILDCOPYLENGTH)) ) + { + if (partialDecoding) { + if (cpy > oend) goto _output_error; /* Error : write attempt beyond end of output buffer */ + if ((endOnInput) && (ip+length > iend)) goto _output_error; /* Error : read attempt beyond end of input buffer */ + } else { + if ((!endOnInput) && (cpy != oend)) goto _output_error; /* Error : block decoding must stop exactly there */ + if ((endOnInput) && ((ip+length != iend) || (cpy > oend))) goto _output_error; /* Error : input must be consumed */ + } + memcpy(op, ip, length); + ip += length; + op += length; + break; /* Necessarily EOF, due to parsing restrictions */ + } + LZ4_wildCopy(op, ip, cpy); + ip += length; op = cpy; + + /* get offset */ + offset = LZ4_readLE16(ip); ip+=2; + match = op - offset; + if ((checkOffset) && (unlikely(match < lowLimit))) goto _output_error; /* Error : offset outside buffers */ + LZ4_write32(op, (U32)offset); /* costs ~1%; silence an msan warning when offset==0 */ + + /* get matchlength */ + length = token & ML_MASK; + if (length == ML_MASK) { + unsigned s; + do { + s = *ip++; + if ((endOnInput) && (ip > iend-LASTLITERALS)) goto _output_error; + length += s; + } while (s==255); + if ((safeDecode) && unlikely((uptrval)(op)+length<(uptrval)op)) goto _output_error; /* overflow detection */ + } + length += MINMATCH; + + /* check external dictionary */ + if ((dict==usingExtDict) && (match < lowPrefix)) { + if (unlikely(op+length > oend-LASTLITERALS)) goto _output_error; /* doesn't respect parsing restriction */ + + if (length <= (size_t)(lowPrefix-match)) { + /* match can be copied as a single segment from external dictionary */ + memmove(op, dictEnd - (lowPrefix-match), length); + op += length; + } else { + /* match encompass external dictionary and current block */ + size_t const copySize = (size_t)(lowPrefix-match); + size_t const restSize = length - copySize; + memcpy(op, dictEnd - copySize, copySize); + op += copySize; + if (restSize > (size_t)(op-lowPrefix)) { /* overlap copy */ + BYTE* const endOfMatch = op + restSize; + const BYTE* copyFrom = lowPrefix; + while (op < endOfMatch) *op++ = *copyFrom++; + } else { + memcpy(op, lowPrefix, restSize); + op += restSize; + } } + continue; + } + + /* copy match within block */ + cpy = op + length; + if (unlikely(offset<8)) { + const int dec64 = dec64table[offset]; + op[0] = match[0]; + op[1] = match[1]; + op[2] = match[2]; + op[3] = match[3]; + match += dec32table[offset]; + memcpy(op+4, match, 4); + match -= dec64; + } else { LZ4_copy8(op, match); match+=8; } + op += 8; + + if (unlikely(cpy>oend-12)) { + BYTE* const oCopyLimit = oend-(WILDCOPYLENGTH-1); + if (cpy > oend-LASTLITERALS) goto _output_error; /* Error : last LASTLITERALS bytes must be literals (uncompressed) */ + if (op < oCopyLimit) { + LZ4_wildCopy(op, match, oCopyLimit); + match += oCopyLimit - op; + op = oCopyLimit; + } + while (op16) LZ4_wildCopy(op+8, match+8, cpy); + } + op=cpy; /* correction */ + } + + /* end of decoding */ + if (endOnInput) + return (int) (((char*)op)-dest); /* Nb of output bytes decoded */ + else + return (int) (((const char*)ip)-source); /* Nb of input bytes read */ + + /* Overflow error detected */ +_output_error: + return (int) (-(((const char*)ip)-source))-1; +} + + +int LZ4_decompress_safe(const char* source, char* dest, int compressedSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, endOnInputSize, full, 0, noDict, (BYTE*)dest, NULL, 0); +} + +int LZ4_decompress_safe_partial(const char* source, char* dest, int compressedSize, int targetOutputSize, int maxDecompressedSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxDecompressedSize, endOnInputSize, partial, targetOutputSize, noDict, (BYTE*)dest, NULL, 0); +} + +int LZ4_decompress_fast(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, withPrefix64k, (BYTE*)(dest - 64 KB), NULL, 64 KB); +} + + +/*===== streaming decompression functions =====*/ + +LZ4_streamDecode_t* LZ4_createStreamDecode(void) +{ + LZ4_streamDecode_t* lz4s = (LZ4_streamDecode_t*) ALLOCATOR(1, sizeof(LZ4_streamDecode_t)); + return lz4s; +} + +int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream) +{ + if (!LZ4_stream) return 0; /* support free on NULL */ + FREEMEM(LZ4_stream); + return 0; +} + +/*! + * LZ4_setStreamDecode() : + * Use this function to instruct where to find the dictionary. + * This function is not necessary if previous data is still available where it was decoded. + * Loading a size of 0 is allowed (same effect as no dictionary). + * Return : 1 if OK, 0 if error + */ +int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + lz4sd->prefixSize = (size_t) dictSize; + lz4sd->prefixEnd = (const BYTE*) dictionary + dictSize; + lz4sd->externalDict = NULL; + lz4sd->extDictSize = 0; + return 1; +} + +/* +*_continue() : + These decoding functions allow decompression of multiple blocks in "streaming" mode. + Previously decoded blocks must still be available at the memory position where they were decoded. + If it's not possible, save the relevant part of decoded data into a safe buffer, + and indicate where it stands using LZ4_setStreamDecode() +*/ +int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixEnd == (BYTE*)dest) { + result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, full, 0, + usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += result; + lz4sd->prefixEnd += result; + } else { + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, + endOnInputSize, full, 0, + usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = result; + lz4sd->prefixEnd = (BYTE*)dest + result; + } + + return result; +} + +int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize) +{ + LZ4_streamDecode_t_internal* lz4sd = &LZ4_streamDecode->internal_donotuse; + int result; + + if (lz4sd->prefixEnd == (BYTE*)dest) { + result = LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, full, 0, + usingExtDict, lz4sd->prefixEnd - lz4sd->prefixSize, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize += originalSize; + lz4sd->prefixEnd += originalSize; + } else { + lz4sd->extDictSize = lz4sd->prefixSize; + lz4sd->externalDict = lz4sd->prefixEnd - lz4sd->extDictSize; + result = LZ4_decompress_generic(source, dest, 0, originalSize, + endOnOutputSize, full, 0, + usingExtDict, (BYTE*)dest, lz4sd->externalDict, lz4sd->extDictSize); + if (result <= 0) return result; + lz4sd->prefixSize = originalSize; + lz4sd->prefixEnd = (BYTE*)dest + originalSize; + } + + return result; +} + + +/* +Advanced decoding functions : +*_usingDict() : + These decoding functions work the same as "_continue" ones, + the dictionary must be explicitly provided within parameters +*/ + +FORCE_INLINE int LZ4_decompress_usingDict_generic(const char* source, char* dest, int compressedSize, int maxOutputSize, int safe, const char* dictStart, int dictSize) +{ + if (dictSize==0) + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest, NULL, 0); + if (dictStart+dictSize == dest) { + if (dictSize >= (int)(64 KB - 1)) + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, withPrefix64k, (BYTE*)dest-64 KB, NULL, 0); + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, noDict, (BYTE*)dest-dictSize, NULL, 0); + } + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, safe, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + +int LZ4_decompress_safe_usingDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_usingDict_generic(source, dest, compressedSize, maxOutputSize, 1, dictStart, dictSize); +} + +int LZ4_decompress_fast_usingDict(const char* source, char* dest, int originalSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_usingDict_generic(source, dest, 0, originalSize, 0, dictStart, dictSize); +} + +/* debug function */ +int LZ4_decompress_safe_forceExtDict(const char* source, char* dest, int compressedSize, int maxOutputSize, const char* dictStart, int dictSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, usingExtDict, (BYTE*)dest, (const BYTE*)dictStart, dictSize); +} + + +/*=************************************************* +* Obsolete Functions +***************************************************/ +/* obsolete compression functions */ +int LZ4_compress_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize) { return LZ4_compress_default(source, dest, inputSize, maxOutputSize); } +int LZ4_compress(const char* source, char* dest, int inputSize) { return LZ4_compress_default(source, dest, inputSize, LZ4_compressBound(inputSize)); } +int LZ4_compress_limitedOutput_withState (void* state, const char* src, char* dst, int srcSize, int dstSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, dstSize, 1); } +int LZ4_compress_withState (void* state, const char* src, char* dst, int srcSize) { return LZ4_compress_fast_extState(state, src, dst, srcSize, LZ4_compressBound(srcSize), 1); } +int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_stream, const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_fast_continue(LZ4_stream, src, dst, srcSize, maxDstSize, 1); } +int LZ4_compress_continue (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize) { return LZ4_compress_fast_continue(LZ4_stream, source, dest, inputSize, LZ4_compressBound(inputSize), 1); } + +/* +These function names are deprecated and should no longer be used. +They are only provided here for compatibility with older user programs. +- LZ4_uncompress is totally equivalent to LZ4_decompress_fast +- LZ4_uncompress_unknownOutputSize is totally equivalent to LZ4_decompress_safe +*/ +int LZ4_uncompress (const char* source, char* dest, int outputSize) { return LZ4_decompress_fast(source, dest, outputSize); } +int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize) { return LZ4_decompress_safe(source, dest, isize, maxOutputSize); } + + +/* Obsolete Streaming functions */ + +int LZ4_sizeofStreamState() { return LZ4_STREAMSIZE; } + +static void LZ4_init(LZ4_stream_t* lz4ds, BYTE* base) +{ + MEM_INIT(lz4ds, 0, sizeof(LZ4_stream_t)); + lz4ds->internal_donotuse.bufferStart = base; +} + +int LZ4_resetStreamState(void* state, char* inputBuffer) +{ + if ((((uptrval)state) & 3) != 0) return 1; /* Error : pointer is not aligned on 4-bytes boundary */ + LZ4_init((LZ4_stream_t*)state, (BYTE*)inputBuffer); + return 0; +} + +void* LZ4_create (char* inputBuffer) +{ + LZ4_stream_t* lz4ds = (LZ4_stream_t*)ALLOCATOR(8, sizeof(LZ4_stream_t)); + LZ4_init (lz4ds, (BYTE*)inputBuffer); + return lz4ds; +} + +char* LZ4_slideInputBuffer (void* LZ4_Data) +{ + LZ4_stream_t_internal* ctx = &((LZ4_stream_t*)LZ4_Data)->internal_donotuse; + int dictSize = LZ4_saveDict((LZ4_stream_t*)LZ4_Data, (char*)ctx->bufferStart, 64 KB); + return (char*)(ctx->bufferStart + dictSize); +} + +/* Obsolete streaming decompression functions */ + +int LZ4_decompress_safe_withPrefix64k(const char* source, char* dest, int compressedSize, int maxOutputSize) +{ + return LZ4_decompress_generic(source, dest, compressedSize, maxOutputSize, endOnInputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB); +} + +int LZ4_decompress_fast_withPrefix64k(const char* source, char* dest, int originalSize) +{ + return LZ4_decompress_generic(source, dest, 0, originalSize, endOnOutputSize, full, 0, withPrefix64k, (BYTE*)dest - 64 KB, NULL, 64 KB); +} + +#endif /* LZ4_COMMONDEFS_ONLY */ diff --git a/samtools/lz4/lz4.h b/samtools/lz4/lz4.h new file mode 100644 index 0000000..86ca0d5 --- /dev/null +++ b/samtools/lz4/lz4.h @@ -0,0 +1,463 @@ +/* + * LZ4 - Fast LZ compression algorithm + * Header File + * Copyright (C) 2011-2017, Yann Collet. + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 homepage : http://www.lz4.org + - LZ4 source repository : https://github.com/lz4/lz4 +*/ +#if defined (__cplusplus) +extern "C" { +#endif + +#ifndef LZ4_H_2983827168210 +#define LZ4_H_2983827168210 + +/* --- Dependency --- */ +#include /* size_t */ + + +/** + Introduction + + LZ4 is lossless compression algorithm, providing compression speed at 400 MB/s per core, + scalable with multi-cores CPU. It features an extremely fast decoder, with speed in + multiple GB/s per core, typically reaching RAM speed limits on multi-core systems. + + The LZ4 compression library provides in-memory compression and decompression functions. + Compression can be done in: + - a single step (described as Simple Functions) + - a single step, reusing a context (described in Advanced Functions) + - unbounded multiple steps (described as Streaming compression) + + lz4.h provides block compression functions. It gives full buffer control to user. + Decompressing an lz4-compressed block also requires metadata (such as compressed size). + Each application is free to encode such metadata in whichever way it wants. + + An additional format, called LZ4 frame specification (doc/lz4_Frame_format.md), + take care of encoding standard metadata alongside LZ4-compressed blocks. + If your application requires interoperability, it's recommended to use it. + A library is provided to take care of it, see lz4frame.h. +*/ + +/*^*************************************************************** +* Export parameters +*****************************************************************/ +/* +* LZ4_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +* LZ4LIB_API : +* Control library symbols visibility. +*/ +#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) +# define LZ4LIB_API __declspec(dllexport) +#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) +# define LZ4LIB_API __declspec(dllimport) /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#elif defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4LIB_API __attribute__ ((__visibility__ ("default"))) +#else +# define LZ4LIB_API +#endif + + +/*------ Version ------*/ +#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ +#define LZ4_VERSION_MINOR 8 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 0 /* for tweaks, bug-fixes, or development */ + +#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) + +#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +#define LZ4_QUOTE(str) #str +#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) +#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) + +LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; to be used when checking dll version */ +LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; to be used when checking dll version */ + + +/*-************************************ +* Tuning parameter +**************************************/ +/*! + * LZ4_MEMORY_USAGE : + * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.) + * Increasing memory usage improves compression ratio + * Reduced memory usage can improve speed, due to cache effect + * Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache + */ +#ifndef LZ4_MEMORY_USAGE +# define LZ4_MEMORY_USAGE 14 +#endif + +/*-************************************ +* Simple Functions +**************************************/ +/*! LZ4_compress_default() : + Compresses 'sourceSize' bytes from buffer 'source' + into already allocated 'dest' buffer of size 'maxDestSize'. + Compression is guaranteed to succeed if 'maxDestSize' >= LZ4_compressBound(sourceSize). + It also runs faster, so it's a recommended setting. + If the function cannot compress 'source' into a more limited 'dest' budget, + compression stops *immediately*, and the function result is zero. + As a consequence, 'dest' content is not valid. + This function never writes outside 'dest' buffer, nor read outside 'source' buffer. + sourceSize : Max supported value is LZ4_MAX_INPUT_VALUE + maxDestSize : full or partial size of buffer 'dest' (which must be already allocated) + return : the number of bytes written into buffer 'dest' (necessarily <= maxOutputSize) + or 0 if compression fails */ +LZ4LIB_API int LZ4_compress_default(const char* source, char* dest, int sourceSize, int maxDestSize); + +/*! LZ4_decompress_safe() : + compressedSize : is the precise full size of the compressed block. + maxDecompressedSize : is the size of destination buffer, which must be already allocated. + return : the number of bytes decompressed into destination buffer (necessarily <= maxDecompressedSize) + If destination buffer is not large enough, decoding will stop and output an error code (<0). + If the source stream is detected malformed, the function will stop decoding and return a negative result. + This function is protected against buffer overflow exploits, including malicious data packets. + It never writes outside output buffer, nor reads outside input buffer. +*/ +LZ4LIB_API int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize); + + +/*-************************************ +* Advanced Functions +**************************************/ +#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */ +#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16) + +/*! +LZ4_compressBound() : + Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible) + This function is primarily useful for memory allocation purposes (destination buffer size). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compress faster when dest buffer size is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is too large ( > LZ4_MAX_INPUT_SIZE) +*/ +LZ4LIB_API int LZ4_compressBound(int inputSize); + +/*! +LZ4_compress_fast() : + Same as LZ4_compress_default(), but allows to select an "acceleration" factor. + The larger the acceleration value, the faster the algorithm, but also the lesser the compression. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by ACCELERATION_DEFAULT (see lz4.c), which is 1. +*/ +LZ4LIB_API int LZ4_compress_fast (const char* source, char* dest, int sourceSize, int maxDestSize, int acceleration); + + +/*! +LZ4_compress_fast_extState() : + Same compression function, just using an externally allocated memory space to store compression state. + Use LZ4_sizeofState() to know how much memory must be allocated, + and allocate it on 8-bytes boundaries (using malloc() typically). + Then, provide it as 'void* state' to compression function. +*/ +LZ4LIB_API int LZ4_sizeofState(void); +LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* source, char* dest, int inputSize, int maxDestSize, int acceleration); + + +/*! +LZ4_compress_destSize() : + Reverse the logic, by compressing as much data as possible from 'source' buffer + into already allocated buffer 'dest' of size 'targetDestSize'. + This function either compresses the entire 'source' content into 'dest' if it's large enough, + or fill 'dest' buffer completely with as much data as possible from 'source'. + *sourceSizePtr : will be modified to indicate how many bytes where read from 'source' to fill 'dest'. + New value is necessarily <= old value. + return : Nb bytes written into 'dest' (necessarily <= targetDestSize) + or 0 if compression fails +*/ +LZ4LIB_API int LZ4_compress_destSize (const char* source, char* dest, int* sourceSizePtr, int targetDestSize); + + +/*! +LZ4_decompress_fast() : + originalSize : is the original and therefore uncompressed size + return : the number of bytes read from the source buffer (in other words, the compressed size) + If the source stream is detected malformed, the function will stop decoding and return a negative result. + Destination buffer must be already allocated. Its size must be a minimum of 'originalSize' bytes. + note : This function fully respect memory boundaries for properly formed compressed data. + It is a bit faster than LZ4_decompress_safe(). + However, it does not provide any protection against intentionally modified data stream (malicious input). + Use this function in trusted environment only (data to decode comes from a trusted source). +*/ +LZ4LIB_API int LZ4_decompress_fast (const char* source, char* dest, int originalSize); + +/*! +LZ4_decompress_safe_partial() : + This function decompress a compressed block of size 'compressedSize' at position 'source' + into destination buffer 'dest' of size 'maxDecompressedSize'. + The function tries to stop decompressing operation as soon as 'targetOutputSize' has been reached, + reducing decompression time. + return : the number of bytes decoded in the destination buffer (necessarily <= maxDecompressedSize) + Note : this number can be < 'targetOutputSize' should the compressed block to decode be smaller. + Always control how many bytes were decoded. + If the source stream is detected malformed, the function will stop decoding and return a negative result. + This function never writes outside of output buffer, and never reads outside of input buffer. It is therefore protected against malicious data packets +*/ +LZ4LIB_API int LZ4_decompress_safe_partial (const char* source, char* dest, int compressedSize, int targetOutputSize, int maxDecompressedSize); + + +/*-********************************************* +* Streaming Compression Functions +***********************************************/ +typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ + +/*! LZ4_createStream() and LZ4_freeStream() : + * LZ4_createStream() will allocate and initialize an `LZ4_stream_t` structure. + * LZ4_freeStream() releases its memory. + */ +LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); +LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); + +/*! LZ4_resetStream() : + * An LZ4_stream_t structure can be allocated once and re-used multiple times. + * Use this function to init an allocated `LZ4_stream_t` structure and start a new compression. + */ +LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr); + +/*! LZ4_loadDict() : + * Use this function to load a static dictionary into LZ4_stream. + * Any previous data will be forgotten, only 'dictionary' will remain in memory. + * Loading a size of 0 is allowed. + * Return : dictionary size, in bytes (necessarily <= 64 KB) + */ +LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_compress_fast_continue() : + * Compress buffer content 'src', using data from previously compressed blocks as dictionary to improve compression ratio. + * Important : Previous data blocks are assumed to remain present and unmodified ! + * 'dst' buffer must be already allocated. + * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * If not, and if compressed data cannot fit into 'dst' buffer size, compression stops, and function @return==0. + * After an error, the stream status is invalid, it can only be reset or freed. + */ +LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_saveDict() : + * If previously compressed data block is not guaranteed to remain available at its current memory location, + * save it into a safer place (char* safeBuffer). + * Note : it's not necessary to call LZ4_loadDict() after LZ4_saveDict(), dictionary is immediately usable. + * @return : saved dictionary size in bytes (necessarily <= dictSize), or 0 if error. + */ +LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int dictSize); + + +/*-********************************************** +* Streaming Decompression Functions +* Bufferless synchronous API +************************************************/ +typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* incomplete type (defined later) */ + +/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : + * creation / destruction of streaming decompression tracking structure */ +LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); +LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); + +/*! LZ4_setStreamDecode() : + * Use this function to instruct where to find the dictionary. + * Setting a size of 0 is allowed (same effect as reset). + * @return : 1 if OK, 0 if error + */ +LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); + +/*! LZ4_decompress_*_continue() : + * These decoding functions allow decompression of multiple blocks in "streaming" mode. + * Previously decoded blocks *must* remain available at the memory position where they were decoded (up to 64 KB) + * In the case of a ring buffers, decoding buffer must be either : + * - Exactly same size as encoding buffer, with same update rule (block boundaries at same positions) + * In which case, the decoding & encoding ring buffer can have any size, including very small ones ( < 64 KB). + * - Larger than encoding buffer, by a minimum of maxBlockSize more bytes. + * maxBlockSize is implementation dependent. It's the maximum size you intend to compress into a single block. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including small ones ( < 64 KB). + * - _At least_ 64 KB + 8 bytes + maxBlockSize. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including larger than decoding buffer. + * Whenever these conditions are not possible, save the last 64KB of decoded data into a safe buffer, + * and indicate where it is saved using LZ4_setStreamDecode() +*/ +LZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int compressedSize, int maxDecompressedSize); +LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* source, char* dest, int originalSize); + + +/*! LZ4_decompress_*_usingDict() : + * These decoding functions work the same as + * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_*_continue() + * They are stand-alone, and don't need an LZ4_streamDecode_t structure. + */ +LZ4LIB_API int LZ4_decompress_safe_usingDict (const char* source, char* dest, int compressedSize, int maxDecompressedSize, const char* dictStart, int dictSize); +LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* source, char* dest, int originalSize, const char* dictStart, int dictSize); + + +/*^********************************************** + * !!!!!! STATIC LINKING ONLY !!!!!! + ***********************************************/ +/*-************************************ + * Private definitions + ************************************** + * Do not use these definitions. + * They are exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. + * Using these definitions will expose code to API and/or ABI break in future versions of the library. + **************************************/ +#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) +#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) +#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ + +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +#include + +typedef struct { + uint32_t hashTable[LZ4_HASH_SIZE_U32]; + uint32_t currentOffset; + uint32_t initCheck; + const uint8_t* dictionary; + uint8_t* bufferStart; /* obsolete, used for slideInputBuffer */ + uint32_t dictSize; +} LZ4_stream_t_internal; + +typedef struct { + const uint8_t* externalDict; + size_t extDictSize; + const uint8_t* prefixEnd; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#else + +typedef struct { + unsigned int hashTable[LZ4_HASH_SIZE_U32]; + unsigned int currentOffset; + unsigned int initCheck; + const unsigned char* dictionary; + unsigned char* bufferStart; /* obsolete, used for slideInputBuffer */ + unsigned int dictSize; +} LZ4_stream_t_internal; + +typedef struct { + const unsigned char* externalDict; + size_t extDictSize; + const unsigned char* prefixEnd; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#endif + +/*! + * LZ4_stream_t : + * information structure to track an LZ4 stream. + * init this structure before first use. + * note : only use in association with static linking ! + * this definition is not API/ABI safe, + * it may change in a future version ! + */ +#define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4) +#define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(unsigned long long)) +union LZ4_stream_u { + unsigned long long table[LZ4_STREAMSIZE_U64]; + LZ4_stream_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_stream_t */ + + +/*! + * LZ4_streamDecode_t : + * information structure to track an LZ4 stream during decompression. + * init this structure using LZ4_setStreamDecode (or memset()) before first use + * note : only use in association with static linking ! + * this definition is not API/ABI safe, + * and may change in a future version ! + */ +#define LZ4_STREAMDECODESIZE_U64 4 +#define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long)) +union LZ4_streamDecode_u { + unsigned long long table[LZ4_STREAMDECODESIZE_U64]; + LZ4_streamDecode_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_streamDecode_t */ + + +/*-************************************ +* Obsolete Functions +**************************************/ + +/*! Deprecation warnings + Should deprecation warnings be a problem, + it is generally possible to disable them, + typically with -Wno-deprecated-declarations for gcc + or _CRT_SECURE_NO_WARNINGS in Visual. + Otherwise, it's also possible to define LZ4_DISABLE_DEPRECATE_WARNINGS */ +#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS +# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ +#else +# define LZ4_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define LZ4_DEPRECATED(message) [[deprecated(message)]] +# elif (LZ4_GCC_VERSION >= 405) || defined(__clang__) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif (LZ4_GCC_VERSION >= 301) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# else +# pragma message("WARNING: You need to implement LZ4_DEPRECATED for this compiler") +# define LZ4_DEPRECATED(message) +# endif +#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ + +/* Obsolete compression functions */ +LZ4LIB_API LZ4_DEPRECATED("use LZ4_compress_default() instead") int LZ4_compress (const char* source, char* dest, int sourceSize); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_compress_default() instead") int LZ4_compress_limitedOutput (const char* source, char* dest, int sourceSize, int maxOutputSize); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") int LZ4_compress_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/* Obsolete decompression functions */ +LZ4LIB_API LZ4_DEPRECATED("use LZ4_decompress_fast() instead") int LZ4_uncompress (const char* source, char* dest, int outputSize); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_decompress_safe() instead") int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); + +/* Obsolete streaming functions; use new streaming interface whenever possible */ +LZ4LIB_API LZ4_DEPRECATED("use LZ4_createStream() instead") void* LZ4_create (char* inputBuffer); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_createStream() instead") int LZ4_sizeofStreamState(void); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_resetStream() instead") int LZ4_resetStreamState(void* state, char* inputBuffer); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_saveDict() instead") char* LZ4_slideInputBuffer (void* state); + +/* Obsolete streaming decoding functions */ +LZ4LIB_API LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize); +LZ4LIB_API LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize); + +#endif /* LZ4_H_2983827168210 */ + + +#if defined (__cplusplus) +} +#endif diff --git a/samtools/padding.c b/samtools/padding.c new file mode 100644 index 0000000..11b098e --- /dev/null +++ b/samtools/padding.c @@ -0,0 +1,623 @@ +/* padding.c -- depad subcommand. + + Copyright (C) 2011, 2012 Broad Institute. + Copyright (C) 2014-2016, 2019-2020 Genome Research Ltd. + Portions copyright (C) 2012, 2013 Peter Cock, The James Hutton Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include "sam_opts.h" +#include "samtools.h" + +#define bam_reg2bin(b,e) hts_reg2bin((b),(e), 14, 5) + +static int replace_cigar(bam1_t *b, uint32_t n, uint32_t *cigar) +{ + int diff = 0; + if (n != b->core.n_cigar) { + int o = b->core.l_qname + b->core.n_cigar * 4; + if (n > b->core.n_cigar) { + diff = (n - b->core.n_cigar) * 4; + if ((INT_MAX - b->l_data)/4 < (n - b->core.n_cigar)) { + fprintf(stderr, "[depad] ERROR: BAM record too big\n"); + return -1; + } + if (b->l_data + diff > b->m_data) { + b->m_data = b->l_data + diff; + kroundup32(b->m_data); + uint8_t *tmp = (uint8_t*)realloc(b->data, b->m_data); + if (!tmp) { + fprintf(stderr, "[depad] ERROR: Memory allocation failure.\n"); + return -1; + } + b->data = tmp; + } + } else { + diff = -(int)((b->core.n_cigar - n) * 4); + } + memmove(b->data + b->core.l_qname + n * 4, b->data + o, b->l_data - o); + b->core.n_cigar = n; + } + + memcpy(b->data + b->core.l_qname, cigar, n * 4); + b->l_data += diff; + + return 0; +} + +#define write_cigar(_c, _n, _m, _v) do { \ + if (_n == _m) { \ + _m = _m? _m<<1 : 4; \ + _c = (uint32_t*)realloc(_c, _m * 4); \ + if (!(_c)) { \ + fprintf(stderr, "[depad] ERROR: Memory allocation failure.\n"); \ + return -1; \ + } \ + } \ + _c[_n++] = (_v); \ + } while (0) + +static int unpad_seq(bam1_t *b, kstring_t *s) +{ + // Returns 0 on success, -1 on an error + int k, j, i; + int length; + int cigar_n_warning = 0; /* Make this a global and limit to one CIGAR N warning? */ + uint32_t *cigar = bam_get_cigar(b); + uint8_t *seq = bam_get_seq(b); + + // b->core.l_qseq gives length of the SEQ entry (including soft clips, S) + // We need the padded length after alignment from the CIGAR (excluding + // soft clips S, but including pads from CIGAR D operations) + length = bam_cigar2rlen(b->core.n_cigar, cigar); + ks_resize(s, length); + for (k = 0, s->l = 0, j = 0; k < b->core.n_cigar; ++k) { + int op, ol; + op = bam_cigar_op(cigar[k]); + ol = bam_cigar_oplen(cigar[k]); + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + for (i = 0; i < ol; ++i, ++j) s->s[s->l++] = bam_seqi(seq, j); + } else if (op == BAM_CSOFT_CLIP) { + j += ol; + } else if (op == BAM_CHARD_CLIP) { + /* do nothing */ + } else if (op == BAM_CDEL) { + for (i = 0; i < ol; ++i) s->s[s->l++] = 0; + } else if (op == BAM_CREF_SKIP) { + /* Treat CIGAR N as D (not ideal, but better than ignoring it) */ + for (i = 0; i < ol; ++i) s->s[s->l++] = 0; + if (0 == cigar_n_warning) { + cigar_n_warning = -1; + fprintf(stderr, "[depad] WARNING: CIGAR op N treated as op D in read %s\n", bam_get_qname(b)); + } + } else { + fprintf(stderr, "[depad] ERROR: Didn't expect CIGAR op %c in read %s\n", BAM_CIGAR_STR[op], bam_get_qname(b)); + return -1; + } + } + return length != s->l; +} + +int load_unpadded_ref(faidx_t *fai, const char *ref_name, hts_pos_t ref_len, kstring_t *seq) +{ + char base; + char *fai_ref = 0; + hts_pos_t fai_ref_len = 0, k; + + fai_ref = fai_fetch64(fai, ref_name, &fai_ref_len); + if (fai_ref_len != ref_len) { + fprintf(stderr, "[depad] ERROR: FASTA sequence %s length %"PRIhts_pos", expected %"PRIhts_pos"\n", ref_name, fai_ref_len, ref_len); + free(fai_ref); + return -1; + } + ks_resize(seq, ref_len); + seq->l = 0; + for (k = 0; k < ref_len; ++k) { + base = fai_ref[k]; + if (base == '-' || base == '*') { + // Map gaps to null to match unpad_seq function + seq->s[seq->l++] = 0; + } else { + int i = seq_nt16_table[(int)base]; + if (i == 0 || i==16) { // Equals maps to 0, anything unexpected to 16 + fprintf(stderr, "[depad] ERROR: Invalid character %c (ASCII %i) in FASTA sequence %s\n", base, (int)base, ref_name); + free(fai_ref); + return -1; + } + seq->s[seq->l++] = i; + } + } + assert(ref_len == seq->l); + free(fai_ref); + return 0; +} + +hts_pos_t get_unpadded_len(faidx_t *fai, const char *ref_name, hts_pos_t padded_len) +{ + char base; + char *fai_ref = 0; + hts_pos_t fai_ref_len = 0, k; + hts_pos_t bases=0, gaps=0; + + fai_ref = fai_fetch64(fai, ref_name, &fai_ref_len); + if (fai_ref_len != padded_len) { + fprintf(stderr, "[depad] ERROR: FASTA sequence '%s' length %"PRIhts_pos", expected %"PRIhts_pos"\n", ref_name, fai_ref_len, padded_len); + free(fai_ref); + return -1; + } + for (k = 0; k < padded_len; ++k) { + //fprintf(stderr, "[depad] checking base %i of %i or %i\n", k+1, ref_len, strlen(fai_ref)); + base = fai_ref[k]; + if (base == '-' || base == '*') { + gaps += 1; + } else { + int i = seq_nt16_table[(int)base]; + if (i == 0 || i==16) { // Equals maps to 0, anything unexpected to 16 + fprintf(stderr, "[depad] ERROR: Invalid character %c (ASCII %i) in FASTA sequence '%s'\n", base, (int)base, ref_name); + free(fai_ref); + return -1; + } + bases += 1; + } + } + free(fai_ref); + assert (padded_len == bases + gaps); + return bases; +} + +static inline int * update_posmap(int *posmap, kstring_t ref) +{ + int i, k; + posmap = realloc(posmap, ref.m * sizeof(int)); + for (i = k = 0; i < ref.l; ++i) { + posmap[i] = k; + if (ref.s[i]) ++k; + } + return posmap; +} + +int bam_pad2unpad(samFile *in, samFile *out, sam_hdr_t *h, faidx_t *fai) +{ + bam1_t *b = 0; + kstring_t r, q; + int r_tid = -1; + uint32_t *cigar2 = 0; + int ret = 0, *posmap = 0; + uint32_t n2 = 0, m2 = 0; + + b = bam_init1(); + if (!b) { + fprintf(stderr, "[depad] Couldn't allocate bam struct\n"); + return -1; + } + r.l = r.m = q.l = q.m = 0; r.s = q.s = 0; + int read_ret; + while ((read_ret = sam_read1(in, h, b)) >= 0) { // read one alignment from `in' + // Cannot depad unmapped CRAM data + if (b->core.flag & BAM_FUNMAP) + goto next_seq; + + uint32_t *cigar = bam_get_cigar(b); + n2 = 0; + if (b->core.pos == 0 && b->core.tid >= 0 && strcmp(bam_get_qname(b), sam_hdr_tid2name(h, b->core.tid)) == 0) { + // fprintf(stderr, "[depad] Found embedded reference '%s'\n", bam_get_qname(b)); + r_tid = b->core.tid; + if (0!=unpad_seq(b, &r)) { + fprintf(stderr, "[depad] ERROR: Problem parsing SEQ and/or CIGAR in reference %s\n", bam_get_qname(b)); + return -1; + }; + if (sam_hdr_tid2len(h, r_tid) != r.l) { + fprintf(stderr, "[depad] ERROR: (Padded) length of '%s' is %"PRId64" in BAM header, but %zu in embedded reference\n", bam_get_qname(b), (int64_t) sam_hdr_tid2len(h, r_tid), r.l); + return -1; + } + if (fai) { + // Check the embedded reference matches the FASTA file + if (load_unpadded_ref(fai, sam_hdr_tid2name(h, b->core.tid), sam_hdr_tid2len(h, b->core.tid), &q)) { + fprintf(stderr, "[depad] ERROR: Failed to load embedded reference '%s' from FASTA\n", sam_hdr_tid2name(h, b->core.tid)); + return -1; + } + assert(r.l == q.l); + int i; + for (i = 0; i < r.l; ++i) { + if (r.s[i] != q.s[i]) { + // Show gaps as ASCII 45 + fprintf(stderr, "[depad] ERROR: Embedded sequence and reference FASTA don't match for %s base %i, '%c' vs '%c'\n", + sam_hdr_tid2name(h, b->core.tid), i+1, + r.s[i] ? seq_nt16_str[(int)r.s[i]] : 45, + q.s[i] ? seq_nt16_str[(int)q.s[i]] : 45); + return -1; + } + } + } + write_cigar(cigar2, n2, m2, bam_cigar_gen(b->core.l_qseq, BAM_CMATCH)); + if (replace_cigar(b, n2, cigar2) < 0) + return -1; + posmap = update_posmap(posmap, r); + } else if (b->core.n_cigar > 0) { + int i, k, op; + if (b->core.tid < 0) { + fprintf(stderr, "[depad] ERROR: Read '%s' has CIGAR but no RNAME\n", bam_get_qname(b)); + return -1; + } else if (b->core.tid == r_tid) { + ; // good case, reference available + //fprintf(stderr, "[depad] Have ref '%s' for read '%s'\n", h->target_name[b->core.tid], bam_get_qname(b)); + } else if (fai) { + if (load_unpadded_ref(fai, sam_hdr_tid2name(h, b->core.tid), sam_hdr_tid2len(h, b->core.tid), &r)) { + fprintf(stderr, "[depad] ERROR: Failed to load '%s' from reference FASTA\n", sam_hdr_tid2name(h, b->core.tid)); + return -1; + } + posmap = update_posmap(posmap, r); + r_tid = b->core.tid; + // fprintf(stderr, "[depad] Loaded %s from FASTA file\n", h->target_name[b->core.tid]); + } else { + fprintf(stderr, "[depad] ERROR: Missing %s embedded reference sequence (and no FASTA file)\n", sam_hdr_tid2name(h, b->core.tid)); + return -1; + } + if (0!=unpad_seq(b, &q)) { + fprintf(stderr, "[depad] ERROR: Problem parsing SEQ and/or CIGAR in read %s\n", bam_get_qname(b)); + return -1; + }; + if (bam_cigar_op(cigar[0]) == BAM_CSOFT_CLIP) { + write_cigar(cigar2, n2, m2, cigar[0]); + } else if (bam_cigar_op(cigar[0]) == BAM_CHARD_CLIP) { + write_cigar(cigar2, n2, m2, cigar[0]); + if (b->core.n_cigar > 2 && bam_cigar_op(cigar[1]) == BAM_CSOFT_CLIP) { + write_cigar(cigar2, n2, m2, cigar[1]); + } + } + /* Determine CIGAR operator for each base in the aligned read */ + for (i = 0, k = b->core.pos; i < q.l; ++i, ++k) + q.s[i] = q.s[i]? (r.s[k]? BAM_CMATCH : BAM_CINS) : (r.s[k]? BAM_CDEL : BAM_CPAD); + /* Include any pads if starts with an insert */ + if (q.s[0] == BAM_CINS) { + for (k = 0; k+1 < b->core.pos && !r.s[b->core.pos - k - 1]; ++k); + if (k) write_cigar(cigar2, n2, m2, bam_cigar_gen(k, BAM_CPAD)); + k = 0; + } else if (q.s[0] == BAM_CPAD) { + // Join 'k' CPAD to our first cigar op CPAD too. + for (k = 0; k+1 < b->core.pos && !r.s[b->core.pos - k - 1]; ++k); + } else { + k = 0; + } + /* Count consecutive CIGAR operators to turn into a CIGAR string */ + for (i = 1, k++, op = q.s[0]; i < q.l; ++i) { + if (op != q.s[i]) { + write_cigar(cigar2, n2, m2, bam_cigar_gen(k, op)); + op = q.s[i]; k = 1; + } else ++k; + } + write_cigar(cigar2, n2, m2, bam_cigar_gen(k, op)); + if (bam_cigar_op(cigar[b->core.n_cigar-1]) == BAM_CSOFT_CLIP) { + write_cigar(cigar2, n2, m2, cigar[b->core.n_cigar-1]); + } else if (bam_cigar_op(cigar[b->core.n_cigar-1]) == BAM_CHARD_CLIP) { + if (b->core.n_cigar > 2 && bam_cigar_op(cigar[b->core.n_cigar-2]) == BAM_CSOFT_CLIP) { + write_cigar(cigar2, n2, m2, cigar[b->core.n_cigar-2]); + } + write_cigar(cigar2, n2, m2, cigar[b->core.n_cigar-1]); + } + /* Remove redundant P operators between M/X/=/D operators, e.g. 5M2P10M -> 15M */ + int pre_op, post_op; + for (i = 2; i < n2; ++i) + if (bam_cigar_op(cigar2[i-1]) == BAM_CPAD) { + pre_op = bam_cigar_op(cigar2[i-2]); + post_op = bam_cigar_op(cigar2[i]); + /* Note don't need to check for X/= as code above will use M only */ + if ((pre_op == BAM_CMATCH || pre_op == BAM_CDEL) && (post_op == BAM_CMATCH || post_op == BAM_CDEL)) { + /* This is a redundant P operator */ + cigar2[i-1] = 0; // i.e. 0M + /* If had same operator either side, combine them in post_op */ + if (pre_op == post_op) { + /* If CIGAR M, could treat as simple integers since BAM_CMATCH is zero*/ + cigar2[i] = bam_cigar_gen(bam_cigar_oplen(cigar2[i-2]) + bam_cigar_oplen(cigar2[i]), post_op); + cigar2[i-2] = 0; // i.e. 0M + } + } + } + /* Remove the zero'd operators (0M) */ + for (i = k = 0; i < n2; ++i) + if (cigar2[i]) cigar2[k++] = cigar2[i]; + n2 = k; + if (replace_cigar(b, n2, cigar2) < 0) + return -1; + } + /* Even unmapped reads can have a POS value, e.g. if their mate was mapped */ + if (b->core.pos != -1) b->core.pos = posmap[b->core.pos]; + if (b->core.mtid < 0 || b->core.mpos < 0) { + /* Nice case, no mate to worry about*/ + // fprintf(stderr, "[depad] Read '%s' mate not mapped\n", bam_get_qname(b)); + /* TODO - Warning if FLAG says mate should be mapped? */ + /* Clean up funny input where mate position is given but mate reference is missing: */ + b->core.mtid = -1; + b->core.mpos = -1; + } else if (b->core.mtid == b->core.tid) { + /* Nice case, same reference */ + // fprintf(stderr, "[depad] Read '%s' mate mapped to same ref\n", bam_get_qname(b)); + b->core.mpos = posmap[b->core.mpos]; + } else { + /* Nasty case, Must load alternative posmap */ + // fprintf(stderr, "[depad] Loading reference '%s' temporarily\n", h->target_name[b->core.mtid]); + if (!fai) { + fprintf(stderr, "[depad] ERROR: Needed reference %s sequence for mate (and no FASTA file)\n", sam_hdr_tid2name(h, b->core.mtid)); + return -1; + } + /* Temporarily load the other reference sequence */ + if (load_unpadded_ref(fai, sam_hdr_tid2name(h, b->core.mtid), sam_hdr_tid2len(h, b->core.mtid), &r)) { + fprintf(stderr, "[depad] ERROR: Failed to load '%s' from reference FASTA\n", sam_hdr_tid2name(h, b->core.mtid)); + return -1; + } + posmap = update_posmap(posmap, r); + b->core.mpos = posmap[b->core.mpos]; + /* Restore the reference and posmap*/ + if (load_unpadded_ref(fai, sam_hdr_tid2name(h, b->core.tid), sam_hdr_tid2len(h, b->core.tid), &r)) { + fprintf(stderr, "[depad] ERROR: Failed to load '%s' from reference FASTA\n", sam_hdr_tid2name(h, b->core.tid)); + return -1; + } + posmap = update_posmap(posmap, r); + } + /* Most reads will have been moved so safest to always recalculate the BIN value */ + b->core.bin = bam_reg2bin(b->core.pos, bam_endpos(b)); + + next_seq: + if (sam_write1(out, h, b) < 0) { + print_error_errno("depad", "error writing to output"); + return -1; + } + } + if (read_ret < -1) { + fprintf(stderr, "[depad] truncated file.\n"); + ret = 1; + } + free(r.s); free(q.s); free(posmap); + free(cigar2); + bam_destroy1(b); + return ret; +} + +sam_hdr_t * fix_header(sam_hdr_t *old, faidx_t *fai) +{ + int i = 0, ret = 0; + hts_pos_t unpadded_len = 0; + sam_hdr_t *header = sam_hdr_dup(old); + if (!header) + return NULL; + + int nref = sam_hdr_nref(old); + char len_buf[64]; + + for (i = 0; i < nref; ++i) { + unpadded_len = get_unpadded_len(fai, sam_hdr_tid2name(old, i), sam_hdr_tid2len(old, i)); + if (unpadded_len < 0) { + fprintf(stderr, "[depad] ERROR getting unpadded length of '%s', padded length %"PRIhts_pos"\n", sam_hdr_tid2name(old, i), (hts_pos_t) sam_hdr_tid2len(old, i)); + } else if (unpadded_len > sam_hdr_tid2len(old, i)) { + fprintf(stderr, "[depad] New unpadded length of '%s' is larger than the padded length (%"PRIhts_pos" > %"PRIhts_pos")\n", + sam_hdr_tid2name(old, i), unpadded_len, + (hts_pos_t) sam_hdr_tid2len(old, i)); + ret = 1; + } else { + sprintf(len_buf, "%"PRIhts_pos"", unpadded_len); + if ((ret |= sam_hdr_update_line(header, "SQ", "SN", sam_hdr_tid2name(header, i), "LN", len_buf, NULL))) + fprintf(stderr, "[depad] Error updating length of '%s' from %"PRIhts_pos" to %"PRIhts_pos"\n", + sam_hdr_tid2name(header, i), + (hts_pos_t) sam_hdr_tid2len(header, i), + unpadded_len); + //fprintf(stderr, "[depad] Recalculating '%s' length %i -> %i\n", old->target_name[i], old->target_len[i], header->target_len[i]); + } + } + + if (ret) { + sam_hdr_destroy(header); + return NULL; + } + + return header; +} + +static int usage(int is_long_help); + +int main_pad2unpad(int argc, char *argv[]) +{ + samFile *in = 0, *out = 0; + sam_hdr_t *h = 0, *h_fix = 0; + faidx_t *fai = 0; + int c, compress_level = -1, is_long_help = 0, no_pg = 0; + char in_mode[5], out_mode[6], *fn_out = 0, *fn_fai = 0, *fn_out_idx = NULL; + int ret=0; + char *arg_list = NULL; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 'T', '-'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + /* parse command-line options */ + strcpy(in_mode, "r"); strcpy(out_mode, "w"); + while ((c = getopt_long(argc, argv, "SCso:u1T:?", lopts, NULL)) >= 0) { + switch (c) { + case 'S': break; + case 'C': hts_parse_format(&ga.out, "cram"); break; + case 's': assert(compress_level == -1); hts_parse_format(&ga.out, "sam"); break; + case 'o': fn_out = strdup(optarg); break; + case 'u': + compress_level = 0; + if (ga.out.format == unknown_format) + hts_parse_format(&ga.out, "bam"); + break; + case '1': + compress_level = 1; + if (ga.out.format == unknown_format) + hts_parse_format(&ga.out, "bam"); + break; + case 1: no_pg = 1; break; + case '?': is_long_help = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + fprintf(stderr, "[bam_fillmd] unrecognized option '-%c'\n\n", c); + return usage(is_long_help); + } + } + if (argc == optind) return usage(is_long_help); + + strcat(out_mode, "h"); + if (compress_level >= 0) { + char tmp[2]; + tmp[0] = compress_level + '0'; tmp[1] = '\0'; + strcat(out_mode, tmp); + } + + // Load FASTA reference (also needed for SAM -> BAM if missing header) + if (ga.reference) { + fn_fai = fai_path(ga.reference); + fai = fai_load3(ga.reference, fn_fai, NULL, FAI_CREATE); + } + // open file handlers + if ((in = sam_open_format(argv[optind], in_mode, &ga.in)) == 0) { + print_error_errno("depad", "failed to open \"%s\" for reading", argv[optind]); + ret = 1; + goto depad_end; + } + if (fn_fai && hts_set_fai_filename(in, fn_fai) != 0) { + fprintf(stderr, "[depad] failed to load reference file \"%s\".\n", fn_fai); + ret = 1; + goto depad_end; + } + if ((h = sam_hdr_read(in)) == 0) { + fprintf(stderr, "[depad] failed to read the header from \"%s\".\n", argv[optind]); + ret = 1; + goto depad_end; + } + if (fai) { + if (!(h_fix = fix_header(h, fai))){ + fprintf(stderr, "[depad] failed to fix the header from\n"); + ret = 1; + goto depad_end; + } + } else { + fprintf(stderr, "[depad] Warning - reference lengths will not be corrected without FASTA reference\n"); + h_fix = h; + } + char wmode[2]; + strcat(out_mode, sam_open_mode(wmode, fn_out, NULL)==0 ? wmode : "b"); + if ((out = sam_open_format(fn_out? fn_out : "-", out_mode, &ga.out)) == 0) { + print_error_errno("depad", "failed to open \"%s\" for writing", fn_out? fn_out : "standard output"); + ret = 1; + goto depad_end; + } + + // Reference-based CRAM won't work unless we also create a new reference. + // We could embed this, but for now we take the easy option. + if (ga.out.format == cram) + hts_set_opt(out, CRAM_OPT_NO_REF, 1); + + if (!no_pg) { + if(!(arg_list = stringify_argv(argc+1, argv-1))) { + fprintf(stderr, "[depad] failed to create arg_list\n"); + ret = 1; + goto depad_end; + } + + if (sam_hdr_add_pg(h_fix, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + fprintf(stderr, "[depad] failed to add PG line to header\n"); + ret = 1; + goto depad_end; + } + } + + if (sam_hdr_write(out, h_fix) != 0) { + fprintf(stderr, "[depad] failed to write header.\n"); + ret = 1; + goto depad_end; + } + if (ga.write_index) { + if (!(fn_out_idx = auto_index(out, fn_out, h_fix))) { + ret = 1; + goto depad_end; + } + } + + // Do the depad + if (bam_pad2unpad(in, out, h, fai) != 0) ret = 1; + + if (ga.write_index) { + if (sam_idx_save(out) < 0) { + print_error_errno("depad", "writing index failed"); + ret = 1; + } + } + +depad_end: + // close files, free and return + free(arg_list); + if (fai) fai_destroy(fai); + if (h) sam_hdr_destroy(h); + if (h_fix && h_fix != h) sam_hdr_destroy(h_fix); + if (in) sam_close(in); + if (out && sam_close(out) < 0) { + fprintf(stderr, "[depad] error on closing output file.\n"); + ret = 1; + } + free(fn_fai); free(fn_out); + if (fn_out_idx) + free(fn_out_idx); + sam_global_args_free(&ga); + return ret; +} + +static int usage(int is_long_help) +{ + fprintf(stderr, "\n"); + fprintf(stderr, "Usage: samtools depad \n\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -s Output is SAM (default is BAM)\n"); + fprintf(stderr, " -S Input is SAM (default is BAM)\n"); + fprintf(stderr, " -u Uncompressed BAM output (can't use with -s)\n"); + fprintf(stderr, " -1 Fast compression BAM output (can't use with -s)\n"); + fprintf(stderr, " -T, --reference FILE\n"); + fprintf(stderr, " Padded reference sequence file [null]\n"); + fprintf(stderr, " -o FILE Output file name [stdout]\n"); + fprintf(stderr, " --no-PG do not add a PG line\n"); + fprintf(stderr, " -? Longer help\n"); + sam_global_opt_help(stderr, "-...--.."); + + if (is_long_help) + fprintf(stderr, +"Notes:\n" +"\n" +"1. Requires embedded reference sequences (before the reads for that reference),\n" +" or ideally a FASTA file of the padded reference sequences (via a -T option).\n" +"\n" +"2. Input padded alignment reads' CIGAR strings must not use P or I operators.\n" +"\n"); + return 1; +} diff --git a/samtools/padding.c.pysam.c b/samtools/padding.c.pysam.c new file mode 100644 index 0000000..e90255f --- /dev/null +++ b/samtools/padding.c.pysam.c @@ -0,0 +1,625 @@ +#include "samtools.pysam.h" + +/* padding.c -- depad subcommand. + + Copyright (C) 2011, 2012 Broad Institute. + Copyright (C) 2014-2016, 2019-2020 Genome Research Ltd. + Portions copyright (C) 2012, 2013 Peter Cock, The James Hutton Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include "sam_opts.h" +#include "samtools.h" + +#define bam_reg2bin(b,e) hts_reg2bin((b),(e), 14, 5) + +static int replace_cigar(bam1_t *b, uint32_t n, uint32_t *cigar) +{ + int diff = 0; + if (n != b->core.n_cigar) { + int o = b->core.l_qname + b->core.n_cigar * 4; + if (n > b->core.n_cigar) { + diff = (n - b->core.n_cigar) * 4; + if ((INT_MAX - b->l_data)/4 < (n - b->core.n_cigar)) { + fprintf(samtools_stderr, "[depad] ERROR: BAM record too big\n"); + return -1; + } + if (b->l_data + diff > b->m_data) { + b->m_data = b->l_data + diff; + kroundup32(b->m_data); + uint8_t *tmp = (uint8_t*)realloc(b->data, b->m_data); + if (!tmp) { + fprintf(samtools_stderr, "[depad] ERROR: Memory allocation failure.\n"); + return -1; + } + b->data = tmp; + } + } else { + diff = -(int)((b->core.n_cigar - n) * 4); + } + memmove(b->data + b->core.l_qname + n * 4, b->data + o, b->l_data - o); + b->core.n_cigar = n; + } + + memcpy(b->data + b->core.l_qname, cigar, n * 4); + b->l_data += diff; + + return 0; +} + +#define write_cigar(_c, _n, _m, _v) do { \ + if (_n == _m) { \ + _m = _m? _m<<1 : 4; \ + _c = (uint32_t*)realloc(_c, _m * 4); \ + if (!(_c)) { \ + fprintf(samtools_stderr, "[depad] ERROR: Memory allocation failure.\n"); \ + return -1; \ + } \ + } \ + _c[_n++] = (_v); \ + } while (0) + +static int unpad_seq(bam1_t *b, kstring_t *s) +{ + // Returns 0 on success, -1 on an error + int k, j, i; + int length; + int cigar_n_warning = 0; /* Make this a global and limit to one CIGAR N warning? */ + uint32_t *cigar = bam_get_cigar(b); + uint8_t *seq = bam_get_seq(b); + + // b->core.l_qseq gives length of the SEQ entry (including soft clips, S) + // We need the padded length after alignment from the CIGAR (excluding + // soft clips S, but including pads from CIGAR D operations) + length = bam_cigar2rlen(b->core.n_cigar, cigar); + ks_resize(s, length); + for (k = 0, s->l = 0, j = 0; k < b->core.n_cigar; ++k) { + int op, ol; + op = bam_cigar_op(cigar[k]); + ol = bam_cigar_oplen(cigar[k]); + if (op == BAM_CMATCH || op == BAM_CEQUAL || op == BAM_CDIFF) { + for (i = 0; i < ol; ++i, ++j) s->s[s->l++] = bam_seqi(seq, j); + } else if (op == BAM_CSOFT_CLIP) { + j += ol; + } else if (op == BAM_CHARD_CLIP) { + /* do nothing */ + } else if (op == BAM_CDEL) { + for (i = 0; i < ol; ++i) s->s[s->l++] = 0; + } else if (op == BAM_CREF_SKIP) { + /* Treat CIGAR N as D (not ideal, but better than ignoring it) */ + for (i = 0; i < ol; ++i) s->s[s->l++] = 0; + if (0 == cigar_n_warning) { + cigar_n_warning = -1; + fprintf(samtools_stderr, "[depad] WARNING: CIGAR op N treated as op D in read %s\n", bam_get_qname(b)); + } + } else { + fprintf(samtools_stderr, "[depad] ERROR: Didn't expect CIGAR op %c in read %s\n", BAM_CIGAR_STR[op], bam_get_qname(b)); + return -1; + } + } + return length != s->l; +} + +int load_unpadded_ref(faidx_t *fai, const char *ref_name, hts_pos_t ref_len, kstring_t *seq) +{ + char base; + char *fai_ref = 0; + hts_pos_t fai_ref_len = 0, k; + + fai_ref = fai_fetch64(fai, ref_name, &fai_ref_len); + if (fai_ref_len != ref_len) { + fprintf(samtools_stderr, "[depad] ERROR: FASTA sequence %s length %"PRIhts_pos", expected %"PRIhts_pos"\n", ref_name, fai_ref_len, ref_len); + free(fai_ref); + return -1; + } + ks_resize(seq, ref_len); + seq->l = 0; + for (k = 0; k < ref_len; ++k) { + base = fai_ref[k]; + if (base == '-' || base == '*') { + // Map gaps to null to match unpad_seq function + seq->s[seq->l++] = 0; + } else { + int i = seq_nt16_table[(int)base]; + if (i == 0 || i==16) { // Equals maps to 0, anything unexpected to 16 + fprintf(samtools_stderr, "[depad] ERROR: Invalid character %c (ASCII %i) in FASTA sequence %s\n", base, (int)base, ref_name); + free(fai_ref); + return -1; + } + seq->s[seq->l++] = i; + } + } + assert(ref_len == seq->l); + free(fai_ref); + return 0; +} + +hts_pos_t get_unpadded_len(faidx_t *fai, const char *ref_name, hts_pos_t padded_len) +{ + char base; + char *fai_ref = 0; + hts_pos_t fai_ref_len = 0, k; + hts_pos_t bases=0, gaps=0; + + fai_ref = fai_fetch64(fai, ref_name, &fai_ref_len); + if (fai_ref_len != padded_len) { + fprintf(samtools_stderr, "[depad] ERROR: FASTA sequence '%s' length %"PRIhts_pos", expected %"PRIhts_pos"\n", ref_name, fai_ref_len, padded_len); + free(fai_ref); + return -1; + } + for (k = 0; k < padded_len; ++k) { + //fprintf(samtools_stderr, "[depad] checking base %i of %i or %i\n", k+1, ref_len, strlen(fai_ref)); + base = fai_ref[k]; + if (base == '-' || base == '*') { + gaps += 1; + } else { + int i = seq_nt16_table[(int)base]; + if (i == 0 || i==16) { // Equals maps to 0, anything unexpected to 16 + fprintf(samtools_stderr, "[depad] ERROR: Invalid character %c (ASCII %i) in FASTA sequence '%s'\n", base, (int)base, ref_name); + free(fai_ref); + return -1; + } + bases += 1; + } + } + free(fai_ref); + assert (padded_len == bases + gaps); + return bases; +} + +static inline int * update_posmap(int *posmap, kstring_t ref) +{ + int i, k; + posmap = realloc(posmap, ref.m * sizeof(int)); + for (i = k = 0; i < ref.l; ++i) { + posmap[i] = k; + if (ref.s[i]) ++k; + } + return posmap; +} + +int bam_pad2unpad(samFile *in, samFile *out, sam_hdr_t *h, faidx_t *fai) +{ + bam1_t *b = 0; + kstring_t r, q; + int r_tid = -1; + uint32_t *cigar2 = 0; + int ret = 0, *posmap = 0; + uint32_t n2 = 0, m2 = 0; + + b = bam_init1(); + if (!b) { + fprintf(samtools_stderr, "[depad] Couldn't allocate bam struct\n"); + return -1; + } + r.l = r.m = q.l = q.m = 0; r.s = q.s = 0; + int read_ret; + while ((read_ret = sam_read1(in, h, b)) >= 0) { // read one alignment from `in' + // Cannot depad unmapped CRAM data + if (b->core.flag & BAM_FUNMAP) + goto next_seq; + + uint32_t *cigar = bam_get_cigar(b); + n2 = 0; + if (b->core.pos == 0 && b->core.tid >= 0 && strcmp(bam_get_qname(b), sam_hdr_tid2name(h, b->core.tid)) == 0) { + // fprintf(samtools_stderr, "[depad] Found embedded reference '%s'\n", bam_get_qname(b)); + r_tid = b->core.tid; + if (0!=unpad_seq(b, &r)) { + fprintf(samtools_stderr, "[depad] ERROR: Problem parsing SEQ and/or CIGAR in reference %s\n", bam_get_qname(b)); + return -1; + }; + if (sam_hdr_tid2len(h, r_tid) != r.l) { + fprintf(samtools_stderr, "[depad] ERROR: (Padded) length of '%s' is %"PRId64" in BAM header, but %zu in embedded reference\n", bam_get_qname(b), (int64_t) sam_hdr_tid2len(h, r_tid), r.l); + return -1; + } + if (fai) { + // Check the embedded reference matches the FASTA file + if (load_unpadded_ref(fai, sam_hdr_tid2name(h, b->core.tid), sam_hdr_tid2len(h, b->core.tid), &q)) { + fprintf(samtools_stderr, "[depad] ERROR: Failed to load embedded reference '%s' from FASTA\n", sam_hdr_tid2name(h, b->core.tid)); + return -1; + } + assert(r.l == q.l); + int i; + for (i = 0; i < r.l; ++i) { + if (r.s[i] != q.s[i]) { + // Show gaps as ASCII 45 + fprintf(samtools_stderr, "[depad] ERROR: Embedded sequence and reference FASTA don't match for %s base %i, '%c' vs '%c'\n", + sam_hdr_tid2name(h, b->core.tid), i+1, + r.s[i] ? seq_nt16_str[(int)r.s[i]] : 45, + q.s[i] ? seq_nt16_str[(int)q.s[i]] : 45); + return -1; + } + } + } + write_cigar(cigar2, n2, m2, bam_cigar_gen(b->core.l_qseq, BAM_CMATCH)); + if (replace_cigar(b, n2, cigar2) < 0) + return -1; + posmap = update_posmap(posmap, r); + } else if (b->core.n_cigar > 0) { + int i, k, op; + if (b->core.tid < 0) { + fprintf(samtools_stderr, "[depad] ERROR: Read '%s' has CIGAR but no RNAME\n", bam_get_qname(b)); + return -1; + } else if (b->core.tid == r_tid) { + ; // good case, reference available + //fprintf(samtools_stderr, "[depad] Have ref '%s' for read '%s'\n", h->target_name[b->core.tid], bam_get_qname(b)); + } else if (fai) { + if (load_unpadded_ref(fai, sam_hdr_tid2name(h, b->core.tid), sam_hdr_tid2len(h, b->core.tid), &r)) { + fprintf(samtools_stderr, "[depad] ERROR: Failed to load '%s' from reference FASTA\n", sam_hdr_tid2name(h, b->core.tid)); + return -1; + } + posmap = update_posmap(posmap, r); + r_tid = b->core.tid; + // fprintf(samtools_stderr, "[depad] Loaded %s from FASTA file\n", h->target_name[b->core.tid]); + } else { + fprintf(samtools_stderr, "[depad] ERROR: Missing %s embedded reference sequence (and no FASTA file)\n", sam_hdr_tid2name(h, b->core.tid)); + return -1; + } + if (0!=unpad_seq(b, &q)) { + fprintf(samtools_stderr, "[depad] ERROR: Problem parsing SEQ and/or CIGAR in read %s\n", bam_get_qname(b)); + return -1; + }; + if (bam_cigar_op(cigar[0]) == BAM_CSOFT_CLIP) { + write_cigar(cigar2, n2, m2, cigar[0]); + } else if (bam_cigar_op(cigar[0]) == BAM_CHARD_CLIP) { + write_cigar(cigar2, n2, m2, cigar[0]); + if (b->core.n_cigar > 2 && bam_cigar_op(cigar[1]) == BAM_CSOFT_CLIP) { + write_cigar(cigar2, n2, m2, cigar[1]); + } + } + /* Determine CIGAR operator for each base in the aligned read */ + for (i = 0, k = b->core.pos; i < q.l; ++i, ++k) + q.s[i] = q.s[i]? (r.s[k]? BAM_CMATCH : BAM_CINS) : (r.s[k]? BAM_CDEL : BAM_CPAD); + /* Include any pads if starts with an insert */ + if (q.s[0] == BAM_CINS) { + for (k = 0; k+1 < b->core.pos && !r.s[b->core.pos - k - 1]; ++k); + if (k) write_cigar(cigar2, n2, m2, bam_cigar_gen(k, BAM_CPAD)); + k = 0; + } else if (q.s[0] == BAM_CPAD) { + // Join 'k' CPAD to our first cigar op CPAD too. + for (k = 0; k+1 < b->core.pos && !r.s[b->core.pos - k - 1]; ++k); + } else { + k = 0; + } + /* Count consecutive CIGAR operators to turn into a CIGAR string */ + for (i = 1, k++, op = q.s[0]; i < q.l; ++i) { + if (op != q.s[i]) { + write_cigar(cigar2, n2, m2, bam_cigar_gen(k, op)); + op = q.s[i]; k = 1; + } else ++k; + } + write_cigar(cigar2, n2, m2, bam_cigar_gen(k, op)); + if (bam_cigar_op(cigar[b->core.n_cigar-1]) == BAM_CSOFT_CLIP) { + write_cigar(cigar2, n2, m2, cigar[b->core.n_cigar-1]); + } else if (bam_cigar_op(cigar[b->core.n_cigar-1]) == BAM_CHARD_CLIP) { + if (b->core.n_cigar > 2 && bam_cigar_op(cigar[b->core.n_cigar-2]) == BAM_CSOFT_CLIP) { + write_cigar(cigar2, n2, m2, cigar[b->core.n_cigar-2]); + } + write_cigar(cigar2, n2, m2, cigar[b->core.n_cigar-1]); + } + /* Remove redundant P operators between M/X/=/D operators, e.g. 5M2P10M -> 15M */ + int pre_op, post_op; + for (i = 2; i < n2; ++i) + if (bam_cigar_op(cigar2[i-1]) == BAM_CPAD) { + pre_op = bam_cigar_op(cigar2[i-2]); + post_op = bam_cigar_op(cigar2[i]); + /* Note don't need to check for X/= as code above will use M only */ + if ((pre_op == BAM_CMATCH || pre_op == BAM_CDEL) && (post_op == BAM_CMATCH || post_op == BAM_CDEL)) { + /* This is a redundant P operator */ + cigar2[i-1] = 0; // i.e. 0M + /* If had same operator either side, combine them in post_op */ + if (pre_op == post_op) { + /* If CIGAR M, could treat as simple integers since BAM_CMATCH is zero*/ + cigar2[i] = bam_cigar_gen(bam_cigar_oplen(cigar2[i-2]) + bam_cigar_oplen(cigar2[i]), post_op); + cigar2[i-2] = 0; // i.e. 0M + } + } + } + /* Remove the zero'd operators (0M) */ + for (i = k = 0; i < n2; ++i) + if (cigar2[i]) cigar2[k++] = cigar2[i]; + n2 = k; + if (replace_cigar(b, n2, cigar2) < 0) + return -1; + } + /* Even unmapped reads can have a POS value, e.g. if their mate was mapped */ + if (b->core.pos != -1) b->core.pos = posmap[b->core.pos]; + if (b->core.mtid < 0 || b->core.mpos < 0) { + /* Nice case, no mate to worry about*/ + // fprintf(samtools_stderr, "[depad] Read '%s' mate not mapped\n", bam_get_qname(b)); + /* TODO - Warning if FLAG says mate should be mapped? */ + /* Clean up funny input where mate position is given but mate reference is missing: */ + b->core.mtid = -1; + b->core.mpos = -1; + } else if (b->core.mtid == b->core.tid) { + /* Nice case, same reference */ + // fprintf(samtools_stderr, "[depad] Read '%s' mate mapped to same ref\n", bam_get_qname(b)); + b->core.mpos = posmap[b->core.mpos]; + } else { + /* Nasty case, Must load alternative posmap */ + // fprintf(samtools_stderr, "[depad] Loading reference '%s' temporarily\n", h->target_name[b->core.mtid]); + if (!fai) { + fprintf(samtools_stderr, "[depad] ERROR: Needed reference %s sequence for mate (and no FASTA file)\n", sam_hdr_tid2name(h, b->core.mtid)); + return -1; + } + /* Temporarily load the other reference sequence */ + if (load_unpadded_ref(fai, sam_hdr_tid2name(h, b->core.mtid), sam_hdr_tid2len(h, b->core.mtid), &r)) { + fprintf(samtools_stderr, "[depad] ERROR: Failed to load '%s' from reference FASTA\n", sam_hdr_tid2name(h, b->core.mtid)); + return -1; + } + posmap = update_posmap(posmap, r); + b->core.mpos = posmap[b->core.mpos]; + /* Restore the reference and posmap*/ + if (load_unpadded_ref(fai, sam_hdr_tid2name(h, b->core.tid), sam_hdr_tid2len(h, b->core.tid), &r)) { + fprintf(samtools_stderr, "[depad] ERROR: Failed to load '%s' from reference FASTA\n", sam_hdr_tid2name(h, b->core.tid)); + return -1; + } + posmap = update_posmap(posmap, r); + } + /* Most reads will have been moved so safest to always recalculate the BIN value */ + b->core.bin = bam_reg2bin(b->core.pos, bam_endpos(b)); + + next_seq: + if (sam_write1(out, h, b) < 0) { + print_error_errno("depad", "error writing to output"); + return -1; + } + } + if (read_ret < -1) { + fprintf(samtools_stderr, "[depad] truncated file.\n"); + ret = 1; + } + free(r.s); free(q.s); free(posmap); + free(cigar2); + bam_destroy1(b); + return ret; +} + +sam_hdr_t * fix_header(sam_hdr_t *old, faidx_t *fai) +{ + int i = 0, ret = 0; + hts_pos_t unpadded_len = 0; + sam_hdr_t *header = sam_hdr_dup(old); + if (!header) + return NULL; + + int nref = sam_hdr_nref(old); + char len_buf[64]; + + for (i = 0; i < nref; ++i) { + unpadded_len = get_unpadded_len(fai, sam_hdr_tid2name(old, i), sam_hdr_tid2len(old, i)); + if (unpadded_len < 0) { + fprintf(samtools_stderr, "[depad] ERROR getting unpadded length of '%s', padded length %"PRIhts_pos"\n", sam_hdr_tid2name(old, i), (hts_pos_t) sam_hdr_tid2len(old, i)); + } else if (unpadded_len > sam_hdr_tid2len(old, i)) { + fprintf(samtools_stderr, "[depad] New unpadded length of '%s' is larger than the padded length (%"PRIhts_pos" > %"PRIhts_pos")\n", + sam_hdr_tid2name(old, i), unpadded_len, + (hts_pos_t) sam_hdr_tid2len(old, i)); + ret = 1; + } else { + sprintf(len_buf, "%"PRIhts_pos"", unpadded_len); + if ((ret |= sam_hdr_update_line(header, "SQ", "SN", sam_hdr_tid2name(header, i), "LN", len_buf, NULL))) + fprintf(samtools_stderr, "[depad] Error updating length of '%s' from %"PRIhts_pos" to %"PRIhts_pos"\n", + sam_hdr_tid2name(header, i), + (hts_pos_t) sam_hdr_tid2len(header, i), + unpadded_len); + //fprintf(samtools_stderr, "[depad] Recalculating '%s' length %i -> %i\n", old->target_name[i], old->target_len[i], header->target_len[i]); + } + } + + if (ret) { + sam_hdr_destroy(header); + return NULL; + } + + return header; +} + +static int usage(int is_long_help); + +int main_pad2unpad(int argc, char *argv[]) +{ + samFile *in = 0, *out = 0; + sam_hdr_t *h = 0, *h_fix = 0; + faidx_t *fai = 0; + int c, compress_level = -1, is_long_help = 0, no_pg = 0; + char in_mode[5], out_mode[6], *fn_out = 0, *fn_fai = 0, *fn_out_idx = NULL; + int ret=0; + char *arg_list = NULL; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 'T', '-'), + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + /* parse command-line options */ + strcpy(in_mode, "r"); strcpy(out_mode, "w"); + while ((c = getopt_long(argc, argv, "SCso:u1T:?", lopts, NULL)) >= 0) { + switch (c) { + case 'S': break; + case 'C': hts_parse_format(&ga.out, "cram"); break; + case 's': assert(compress_level == -1); hts_parse_format(&ga.out, "sam"); break; + case 'o': fn_out = strdup(optarg); break; + case 'u': + compress_level = 0; + if (ga.out.format == unknown_format) + hts_parse_format(&ga.out, "bam"); + break; + case '1': + compress_level = 1; + if (ga.out.format == unknown_format) + hts_parse_format(&ga.out, "bam"); + break; + case 1: no_pg = 1; break; + case '?': is_long_help = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + fprintf(samtools_stderr, "[bam_fillmd] unrecognized option '-%c'\n\n", c); + return usage(is_long_help); + } + } + if (argc == optind) return usage(is_long_help); + + strcat(out_mode, "h"); + if (compress_level >= 0) { + char tmp[2]; + tmp[0] = compress_level + '0'; tmp[1] = '\0'; + strcat(out_mode, tmp); + } + + // Load FASTA reference (also needed for SAM -> BAM if missing header) + if (ga.reference) { + fn_fai = fai_path(ga.reference); + fai = fai_load3(ga.reference, fn_fai, NULL, FAI_CREATE); + } + // open file handlers + if ((in = sam_open_format(argv[optind], in_mode, &ga.in)) == 0) { + print_error_errno("depad", "failed to open \"%s\" for reading", argv[optind]); + ret = 1; + goto depad_end; + } + if (fn_fai && hts_set_fai_filename(in, fn_fai) != 0) { + fprintf(samtools_stderr, "[depad] failed to load reference file \"%s\".\n", fn_fai); + ret = 1; + goto depad_end; + } + if ((h = sam_hdr_read(in)) == 0) { + fprintf(samtools_stderr, "[depad] failed to read the header from \"%s\".\n", argv[optind]); + ret = 1; + goto depad_end; + } + if (fai) { + if (!(h_fix = fix_header(h, fai))){ + fprintf(samtools_stderr, "[depad] failed to fix the header from\n"); + ret = 1; + goto depad_end; + } + } else { + fprintf(samtools_stderr, "[depad] Warning - reference lengths will not be corrected without FASTA reference\n"); + h_fix = h; + } + char wmode[2]; + strcat(out_mode, sam_open_mode(wmode, fn_out, NULL)==0 ? wmode : "b"); + if ((out = sam_open_format(fn_out? fn_out : "-", out_mode, &ga.out)) == 0) { + print_error_errno("depad", "failed to open \"%s\" for writing", fn_out? fn_out : "standard output"); + ret = 1; + goto depad_end; + } + + // Reference-based CRAM won't work unless we also create a new reference. + // We could embed this, but for now we take the easy option. + if (ga.out.format == cram) + hts_set_opt(out, CRAM_OPT_NO_REF, 1); + + if (!no_pg) { + if(!(arg_list = stringify_argv(argc+1, argv-1))) { + fprintf(samtools_stderr, "[depad] failed to create arg_list\n"); + ret = 1; + goto depad_end; + } + + if (sam_hdr_add_pg(h_fix, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + fprintf(samtools_stderr, "[depad] failed to add PG line to header\n"); + ret = 1; + goto depad_end; + } + } + + if (sam_hdr_write(out, h_fix) != 0) { + fprintf(samtools_stderr, "[depad] failed to write header.\n"); + ret = 1; + goto depad_end; + } + if (ga.write_index) { + if (!(fn_out_idx = auto_index(out, fn_out, h_fix))) { + ret = 1; + goto depad_end; + } + } + + // Do the depad + if (bam_pad2unpad(in, out, h, fai) != 0) ret = 1; + + if (ga.write_index) { + if (sam_idx_save(out) < 0) { + print_error_errno("depad", "writing index failed"); + ret = 1; + } + } + +depad_end: + // close files, free and return + free(arg_list); + if (fai) fai_destroy(fai); + if (h) sam_hdr_destroy(h); + if (h_fix && h_fix != h) sam_hdr_destroy(h_fix); + if (in) sam_close(in); + if (out && sam_close(out) < 0) { + fprintf(samtools_stderr, "[depad] error on closing output file.\n"); + ret = 1; + } + free(fn_fai); free(fn_out); + if (fn_out_idx) + free(fn_out_idx); + sam_global_args_free(&ga); + return ret; +} + +static int usage(int is_long_help) +{ + fprintf(samtools_stderr, "\n"); + fprintf(samtools_stderr, "Usage: samtools depad \n\n"); + fprintf(samtools_stderr, "Options:\n"); + fprintf(samtools_stderr, " -s Output is SAM (default is BAM)\n"); + fprintf(samtools_stderr, " -S Input is SAM (default is BAM)\n"); + fprintf(samtools_stderr, " -u Uncompressed BAM output (can't use with -s)\n"); + fprintf(samtools_stderr, " -1 Fast compression BAM output (can't use with -s)\n"); + fprintf(samtools_stderr, " -T, --reference FILE\n"); + fprintf(samtools_stderr, " Padded reference sequence file [null]\n"); + fprintf(samtools_stderr, " -o FILE Output file name [samtools_stdout]\n"); + fprintf(samtools_stderr, " --no-PG do not add a PG line\n"); + fprintf(samtools_stderr, " -? Longer help\n"); + sam_global_opt_help(samtools_stderr, "-...--.."); + + if (is_long_help) + fprintf(samtools_stderr, +"Notes:\n" +"\n" +"1. Requires embedded reference sequences (before the reads for that reference),\n" +" or ideally a FASTA file of the padded reference sequences (via a -T option).\n" +"\n" +"2. Input padded alignment reads' CIGAR strings must not use P or I operators.\n" +"\n"); + return 1; +} diff --git a/samtools/phase.c b/samtools/phase.c new file mode 100644 index 0000000..a4a7351 --- /dev/null +++ b/samtools/phase.c @@ -0,0 +1,823 @@ +/* phase.c -- phase subcommand. + + Copyright (C) 2011 Broad Institute. + Copyright (C) 2013-2016, 2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include "htslib/hts.h" +#include "htslib/sam.h" +#include "htslib/kstring.h" +#include "sam_opts.h" +#include "samtools.h" +#include "htslib/hts_os.h" + +#include "htslib/kseq.h" +KSTREAM_INIT(gzFile, gzread, 16384) + +#define MAX_VARS 256 +#define FLIP_PENALTY 2 +#define FLIP_THRES 4 +#define MASK_THRES 3 + +#define FLAG_FIX_CHIMERA 0x1 +#define FLAG_LIST_EXCL 0x4 +#define FLAG_DROP_AMBI 0x8 + +typedef struct { + // configurations, initialized in the main function + int flag, k, min_baseQ, min_varLOD, max_depth, no_pg; + // other global variables + int vpos_shift; + samFile* fp; + sam_hdr_t* fp_hdr; + char *pre, *arg_list; + char *out_name[3]; + samFile* out[3]; + sam_hdr_t* out_hdr[3]; + // alignment queue + int n, m; + bam1_t **b; +} phaseg_t; + +typedef struct { + int8_t seq[MAX_VARS]; // TODO: change to dynamic memory allocation! + int vpos, beg, end; + uint32_t vlen:16, single:1, flip:1, phase:1, phased:1, ambig:1; + uint32_t in:16, out:16; // in-phase and out-phase +} frag_t, *frag_p; + +#define rseq_lt(a,b) ((a)->vpos < (b)->vpos) + +#include "htslib/khash.h" +KHASH_SET_INIT_INT64(set64) +KHASH_MAP_INIT_INT64(64, frag_t) + +typedef khash_t(64) nseq_t; + +#include "htslib/ksort.h" +KSORT_INIT(rseq, frag_p, rseq_lt) + +static inline uint64_t X31_hash_string(const char *s) +{ + uint64_t h = *s; + if (h) for (++s ; *s; ++s) h = (h << 5) - h + *s; + return h; +} + +static void count1(int l, const uint8_t *seq, int *cnt) +{ + int i, j, n_ambi; + uint32_t z, x; + if (seq[l-1] == 0) return; // do nothing is the last base is ambiguous + for (i = n_ambi = 0; i < l; ++i) // collect ambiguous bases + if (seq[i] == 0) ++n_ambi; + if (l - n_ambi <= 1) return; // only one SNP + for (x = 0; x < 1u<>j&1; + ++j; + } + z = z<<1 | c; + } + ++cnt[z]; + } +} + +static int **count_all(int l, int vpos, nseq_t *hash) +{ + khint_t k; + int i, j, **cnt; + uint8_t *seq; + seq = calloc(l, 1); + cnt = calloc(vpos, sizeof(int*)); + for (i = 0; i < vpos; ++i) cnt[i] = calloc(1<vpos >= vpos || f->single) continue; // out of region; or singleton + if (f->vlen == 1) { // such reads should be flagged as deleted previously if everything is right + f->single = 1; + continue; + } + for (j = 1; j < f->vlen; ++j) { + for (i = 0; i < l; ++i) + seq[i] = j < l - 1 - i? 0 : f->seq[j - (l - 1 - i)]; + count1(l, seq, cnt[f->vpos + j]); + } + } + } + free(seq); + return cnt; +} + +// phasing +static int8_t *dynaprog(int l, int vpos, int **w) +{ + int *f[2], *curr, *prev, max, i; + int8_t **b, *h = 0; + uint32_t x, z = 1u<<(l-1), mask = (1u<>1; y1 = xc>>1; + c0 = prev[y0] + wi[x] + wi[xc]; + c1 = prev[y1] + wi[x] + wi[xc]; + if (c0 > c1) bi[x] = 0, curr[x] = c0; + else bi[x] = 1, curr[x] = c1; + } + tmp = prev; prev = curr; curr = tmp; // swap + } + { // backtrack + uint32_t max_x = 0; + int which = 0; + h = calloc(vpos, 1); + for (x = 0, max = 0, max_x = 0; x < z; ++x) + if (prev[x] > max) max = prev[x], max_x = x; + for (i = vpos - 1, x = max_x; i >= 0; --i) { + h[i] = which? (~x&1) : (x&1); + which = b[i][x]? !which : which; + x = b[i][x]? (~x&mask)>>1 : x>>1; + } + } + // free + for (i = 0; i < vpos; ++i) free(b[i]); + free(f[0]); free(f[1]); free(b); + return h; +} + +// phase each fragment +static uint64_t *fragphase(int vpos, const int8_t *path, nseq_t *hash, int flip) +{ + khint_t k; + uint64_t *pcnt; + uint32_t *left, *rght, max; + left = rght = 0; max = 0; + pcnt = calloc(vpos, 8); + for (k = 0; k < kh_end(hash); ++k) { + if (kh_exist(hash, k)) { + int i, c[2]; + frag_t *f = &kh_val(hash, k); + if (f->vpos >= vpos) continue; + // get the phase + c[0] = c[1] = 0; + for (i = 0; i < f->vlen; ++i) { + if (f->seq[i] == 0) continue; + ++c[f->seq[i] == path[f->vpos + i] + 1? 0 : 1]; + } + f->phase = c[0] > c[1]? 0 : 1; + f->in = c[f->phase]; f->out = c[1 - f->phase]; + f->phased = f->in == f->out? 0 : 1; + f->ambig = (f->in && f->out && f->out < 3 && f->in <= f->out + 1)? 1 : 0; + // fix chimera + f->flip = 0; + if (flip && c[0] >= 3 && c[1] >= 3) { + int sum[2], m, mi, md; + if (f->vlen > max) { // enlarge the array + max = f->vlen; + kroundup32(max); + left = realloc(left, max * 4); + rght = realloc(rght, max * 4); + } + for (i = 0, sum[0] = sum[1] = 0; i < f->vlen; ++i) { // get left counts + if (f->seq[i]) { + int c = f->phase? 2 - f->seq[i] : f->seq[i] - 1; + ++sum[c == path[f->vpos + i]? 0 : 1]; + } + left[i] = sum[1]<<16 | sum[0]; + } + for (i = f->vlen - 1, sum[0] = sum[1] = 0; i >= 0; --i) { // get right counts + if (f->seq[i]) { + int c = f->phase? 2 - f->seq[i] : f->seq[i] - 1; + ++sum[c == path[f->vpos + i]? 0 : 1]; + } + rght[i] = sum[1]<<16 | sum[0]; + } + // find the best flip point + for (i = m = 0, mi = -1, md = -1; i < f->vlen - 1; ++i) { + int a[2]; + a[0] = (left[i]&0xffff) + (rght[i+1]>>16&0xffff) - (rght[i+1]&0xffff) * FLIP_PENALTY; + a[1] = (left[i]>>16&0xffff) + (rght[i+1]&0xffff) - (rght[i+1]>>16&0xffff) * FLIP_PENALTY; + if (a[0] > a[1]) { + if (a[0] > m) m = a[0], md = 0, mi = i; + } else { + if (a[1] > m) m = a[1], md = 1, mi = i; + } + } + if (m - c[0] >= FLIP_THRES && m - c[1] >= FLIP_THRES) { // then flip + f->flip = 1; + if (md == 0) { // flip the tail + for (i = mi + 1; i < f->vlen; ++i) + if (f->seq[i] == 1) f->seq[i] = 2; + else if (f->seq[i] == 2) f->seq[i] = 1; + } else { // flip the head + for (i = 0; i <= mi; ++i) + if (f->seq[i] == 1) f->seq[i] = 2; + else if (f->seq[i] == 2) f->seq[i] = 1; + } + } + } + // update pcnt[] + if (!f->single) { + for (i = 0; i < f->vlen; ++i) { + int c; + if (f->seq[i] == 0) continue; + c = f->phase? 2 - f->seq[i] : f->seq[i] - 1; + if (c == path[f->vpos + i]) { + if (f->phase == 0) ++pcnt[f->vpos + i]; + else pcnt[f->vpos + i] += 1ull<<32; + } else { + if (f->phase == 0) pcnt[f->vpos + i] += 1<<16; + else pcnt[f->vpos + i] += 1ull<<48; + } + } + } + } + } + free(left); free(rght); + return pcnt; +} + +static uint64_t *genmask(int vpos, const uint64_t *pcnt, int *_n) +{ + int i, max = 0, max_i = -1, m = 0, n = 0, beg = 0, score = 0; + uint64_t *list = 0; + for (i = 0; i < vpos; ++i) { + uint64_t x = pcnt[i]; + int c[4], pre = score, s; + c[0] = x&0xffff; c[1] = x>>16&0xffff; c[2] = x>>32&0xffff; c[3] = x>>48&0xffff; + s = (c[1] + c[3] == 0)? -(c[0] + c[2]) : (c[1] + c[3] - 1); + if (c[3] > c[2]) s += c[3] - c[2]; + if (c[1] > c[0]) s += c[1] - c[0]; + score += s; + if (score < 0) score = 0; + if (pre == 0 && score > 0) beg = i; // change from zero to non-zero + if ((i == vpos - 1 || score == 0) && max >= MASK_THRES) { + if (n == m) { + m = m? m<<1 : 4; + list = realloc(list, m * 8); + } + list[n++] = (uint64_t)beg<<32 | max_i; + i = max_i; // reset i to max_i + score = 0; + } else if (score > max) max = score, max_i = i; + if (score == 0) max = 0; + } + *_n = n; + return list; +} + +// trim heading and tailing ambiguous bases; mark deleted and remove sequence +static int clean_seqs(int vpos, nseq_t *hash) +{ + khint_t k; + int ret = 0; + for (k = 0; k < kh_end(hash); ++k) { + if (kh_exist(hash, k)) { + frag_t *f = &kh_val(hash, k); + int beg, end, i; + if (f->vpos >= vpos) { + ret = 1; + continue; + } + for (i = 0; i < f->vlen; ++i) + if (f->seq[i] != 0) break; + beg = i; + for (i = f->vlen - 1; i >= 0; --i) + if (f->seq[i] != 0) break; + end = i + 1; + if (end - beg <= 0) kh_del(64, hash, k); + else { + if (beg != 0) memmove(f->seq, f->seq + beg, end - beg); + f->vpos += beg; f->vlen = end - beg; + f->single = f->vlen == 1? 1 : 0; + } + } + } + return ret; +} + +static int dump_aln(phaseg_t *g, int min_pos, const nseq_t *hash) +{ + int i, is_flip, drop_ambi; + drop_ambi = g->flag & FLAG_DROP_AMBI; + is_flip = (drand48() < 0.5); + for (i = 0; i < g->n; ++i) { + int end, which; + uint64_t key; + khint_t k; + bam1_t *b = g->b[i]; + key = X31_hash_string(bam_get_qname(b)); + end = bam_endpos(b); + if (end > min_pos) break; + k = kh_get(64, hash, key); + if (k == kh_end(hash)) which = 3; + else { + frag_t *f = &kh_val(hash, k); + if (f->ambig) which = drop_ambi? 2 : 3; + else if (f->phased && f->flip) which = 2; + else if (f->phased == 0) which = 3; + else { // phased and not flipped + char c = 'Y'; + which = f->phase; + bam_aux_append(b, "ZP", 'A', 1, (uint8_t*)&c); + } + if (which < 2 && is_flip) which = 1 - which; // increase the randomness + } + if (which == 3) which = (drand48() < 0.5); + if (sam_write1(g->out[which], g->out_hdr[which], b) < 0) { + print_error_errno("phase", "error writing to '%s'", g->out_name[which]); + return -1; + } + bam_destroy1(b); + g->b[i] = 0; + } + memmove(g->b, g->b + i, (g->n - i) * sizeof(void*)); + g->n -= i; + return 0; +} + +static int phase(phaseg_t *g, const char *chr, int vpos, uint64_t *cns, nseq_t *hash) +{ + int i, j, n_seqs = kh_size(hash), n_masked = 0, min_pos; + khint_t k; + frag_t **seqs; + int8_t *path, *sitemask; + uint64_t *pcnt, *regmask; + + if (vpos == 0) return 0; + i = clean_seqs(vpos, hash); // i is true if hash has an element with its vpos >= vpos + min_pos = i? cns[vpos]>>32 : 0x7fffffff; + if (vpos == 1) { + printf("PS\t%s\t%d\t%d\n", chr, (int)(cns[0]>>32) + 1, (int)(cns[0]>>32) + 1); + printf("M0\t%s\t%d\t%d\t%c\t%c\t%d\t0\t0\t0\t0\n//\n", chr, (int)(cns[0]>>32) + 1, (int)(cns[0]>>32) + 1, + "ACGTX"[cns[0]&3], "ACGTX"[cns[0]>>16&3], g->vpos_shift + 1); + for (k = 0; k < kh_end(hash); ++k) { + if (kh_exist(hash, k)) { + frag_t *f = &kh_val(hash, k); + if (f->vpos) continue; + f->flip = 0; + if (f->seq[0] == 0) f->phased = 0; + else f->phased = 1, f->phase = f->seq[0] - 1; + } + } + if (dump_aln(g, min_pos, hash) < 0) return -1; + ++g->vpos_shift; + return 1; + } + { // phase + int **cnt; + uint64_t *mask; + printf("PS\t%s\t%d\t%d\n", chr, (int)(cns[0]>>32) + 1, (int)(cns[vpos-1]>>32) + 1); + sitemask = calloc(vpos, 1); + cnt = count_all(g->k, vpos, hash); + path = dynaprog(g->k, vpos, cnt); + for (i = 0; i < vpos; ++i) free(cnt[i]); + free(cnt); + pcnt = fragphase(vpos, path, hash, 0); // do not fix chimeras when masking + mask = genmask(vpos, pcnt, &n_masked); + regmask = calloc(n_masked, 8); + for (i = 0; i < n_masked; ++i) { + regmask[i] = cns[mask[i]>>32]>>32<<32 | cns[(uint32_t)mask[i]]>>32; + for (j = mask[i]>>32; j <= (int32_t)mask[i]; ++j) + sitemask[j] = 1; + } + free(mask); + if (g->flag & FLAG_FIX_CHIMERA) { + free(pcnt); + pcnt = fragphase(vpos, path, hash, 1); + } + } + for (i = 0; i < n_masked; ++i) + printf("FL\t%s\t%d\t%d\n", chr, (int)(regmask[i]>>32) + 1, (int)regmask[i] + 1); + for (i = 0; i < vpos; ++i) { + uint64_t x = pcnt[i]; + int8_t c[2]; + c[0] = (cns[i]&0xffff)>>2 == 0? 4 : (cns[i]&3); + c[1] = (cns[i]>>16&0xffff)>>2 == 0? 4 : (cns[i]>>16&3); + printf("M%d\t%s\t%d\t%d\t%c\t%c\t%d\t%d\t%d\t%d\t%d\n", sitemask[i]+1, chr, (int)(cns[0]>>32) + 1, (int)(cns[i]>>32) + 1, "ACGTX"[c[path[i]]], "ACGTX"[c[1-path[i]]], + i + g->vpos_shift + 1, (int)(x&0xffff), (int)(x>>16&0xffff), (int)(x>>32&0xffff), (int)(x>>48&0xffff)); + } + free(path); free(pcnt); free(regmask); free(sitemask); + seqs = calloc(n_seqs, sizeof(frag_t*)); + for (k = 0, i = 0; k < kh_end(hash); ++k) + if (kh_exist(hash, k) && kh_val(hash, k).vpos < vpos && !kh_val(hash, k).single) + seqs[i++] = &kh_val(hash, k); + n_seqs = i; + ks_introsort_rseq(n_seqs, seqs); + for (i = 0; i < n_seqs; ++i) { + frag_t *f = seqs[i]; + printf("EV\t0\t%s\t%d\t40\t%dM\t*\t0\t0\t", chr, f->vpos + 1 + g->vpos_shift, f->vlen); + for (j = 0; j < f->vlen; ++j) { + uint32_t c = cns[f->vpos + j]; + if (f->seq[j] == 0) putchar('N'); + else putchar("ACGT"[f->seq[j] == 1? (c&3) : (c>>16&3)]); + } + printf("\t*\tYP:i:%d\tYF:i:%d\tYI:i:%d\tYO:i:%d\tYS:i:%d\n", f->phase, f->flip, f->in, f->out, f->beg+1); + } + free(seqs); + printf("//\n"); + fflush(stdout); + g->vpos_shift += vpos; + if (dump_aln(g, min_pos, hash) < 0) return -1; + return vpos; +} + +static void update_vpos(int vpos, nseq_t *hash) +{ + khint_t k; + for (k = 0; k < kh_end(hash); ++k) { + if (kh_exist(hash, k)) { + frag_t *f = &kh_val(hash, k); + if (f->vpos < vpos) kh_del(64, hash, k); // TODO: if frag_t::seq is allocated dynamically, free it + else f->vpos -= vpos; + } + } +} + +static nseq_t *shrink_hash(nseq_t *hash) // TODO: to implement +{ + return hash; +} + +static int readaln(void *data, bam1_t *b) +{ + phaseg_t *g = (phaseg_t*)data; + int ret; + while (1) + { + ret = sam_read1(g->fp, g->fp_hdr, b); + if (ret < 0) break; + if ( b->core.flag & (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP) ) continue; + if ( g->pre ) { + if (g->n == g->m) { + g->m = g->m? g->m<<1 : 16; + g->b = realloc(g->b, g->m * sizeof(bam1_t*)); + } + g->b[g->n++] = bam_dup1(b); + } + break; + } + return ret; +} + +static khash_t(set64) *loadpos(const char *fn, sam_hdr_t *h) +{ + gzFile fp; + kstream_t *ks; + int ret, dret; + kstring_t *str; + khash_t(set64) *hash; + + fp = strcmp(fn, "-")? gzopen(fn, "r") : gzdopen(fileno(stdin), "r"); + if (fp == NULL) { + print_error_errno("phase", "Couldn't open site file '%s'", fn); + return NULL; + } + + hash = kh_init(set64); + str = calloc(1, sizeof(kstring_t)); + + ks = ks_init(fp); + while (ks_getuntil(ks, 0, str, &dret) >= 0) { + int tid = bam_name2id(h, str->s); + if (tid >= 0 && dret != '\n') { + if (ks_getuntil(ks, 0, str, &dret) >= 0) { + uint64_t x = (uint64_t)tid<<32 | (atoi(str->s) - 1); + kh_put(set64, hash, x, &ret); + } else break; + } + if (dret != '\n') while ((dret = ks_getc(ks)) > 0 && dret != '\n'); + if (dret < 0) break; + } + ks_destroy(ks); + gzclose(fp); + free(str->s); free(str); + return hash; +} + +static int gl2cns(float q[16]) +{ + int i, j, min_ij; + float min, min2; + min = min2 = 1e30; min_ij = -1; + for (i = 0; i < 4; ++i) { + for (j = i; j < 4; ++j) { + if (q[i<<2|j] < min) min_ij = i<<2|j, min2 = min, min = q[i<<2|j]; + else if (q[i<<2|j] < min2) min2 = q[i<<2|j]; + } + } + return (min_ij>>2&3) == (min_ij&3)? 0 : 1<<18 | (min_ij>>2&3)<<16 | (min_ij&3) | (int)(min2 - min + .499) << 2; +} + +static int start_output(phaseg_t *g, int c, const char *middle, const htsFormat *fmt) +{ + kstring_t s = { 0, 0, NULL }; + ksprintf(&s, "%s.%s.%s", g->pre, middle, hts_format_file_extension(fmt)); + g->out_name[c] = ks_release(&s); + g->out[c] = sam_open_format(g->out_name[c], "wb", fmt); + if (! g->out[c]) { + print_error_errno("phase", "Failed to open output file '%s'", g->out_name[c]); + return -1; + } + + g->out_hdr[c] = sam_hdr_dup(g->fp_hdr); + if (!g->no_pg && sam_hdr_add_pg(g->out_hdr[c], "samtools", + "VN", samtools_version(), + g->arg_list ? "CL": NULL, + g->arg_list ? g->arg_list : NULL, + NULL)) { + print_error("phase", "failed to add PG line to header"); + return -1; + } + if (sam_hdr_write(g->out[c], g->out_hdr[c]) < 0) { + print_error_errno("phase", "Failed to write header for '%s'", g->out_name[c]); + return -1; + } + + return 0; +} + +int main_phase(int argc, char *argv[]) +{ + int c, tid, pos, vpos = 0, n, lasttid = -1, max_vpos = 0, usage = 0; + int status = EXIT_SUCCESS; + const bam_pileup1_t *plp; + bam_plp_t iter; + nseq_t *seqs; + uint64_t *cns = 0; + phaseg_t g; + char *fn_list = 0; + khash_t(set64) *set = 0; + errmod_t *em; + uint16_t *bases; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0, '-'), + {"min-BQ", required_argument, NULL, 'Q'}, + {"min-bq", required_argument, NULL, 'Q'}, + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + // FIXME Leaks galore in the case of error returns + + memset(&g, 0, sizeof(phaseg_t)); + g.flag = FLAG_FIX_CHIMERA; + g.min_varLOD = 37; g.k = 13; g.min_baseQ = 13; g.max_depth = 256; + while ((c = getopt_long(argc, argv, "Q:eFq:k:b:l:D:A", lopts, NULL)) >= 0) { + switch (c) { + case 'D': g.max_depth = atoi(optarg); break; + case 'q': g.min_varLOD = atoi(optarg); break; + case 'Q': g.min_baseQ = atoi(optarg); break; + case 'k': g.k = atoi(optarg); break; + case 'F': g.flag &= ~FLAG_FIX_CHIMERA; break; + case 'e': g.flag |= FLAG_LIST_EXCL; break; + case 'A': g.flag |= FLAG_DROP_AMBI; break; + case 'b': g.pre = strdup(optarg); break; + case 'l': fn_list = strdup(optarg); break; + case 1: g.no_pg = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage=1; break; + } + if (usage) break; + } + if (usage || argc == optind) { + fprintf(stderr, "\n"); + fprintf(stderr, "Usage: samtools phase [options] \n\n"); + fprintf(stderr, "Options: -k INT block length [%d]\n", g.k); + fprintf(stderr, " -b STR prefix of BAMs to output [null]\n"); + fprintf(stderr, " -q INT min het phred-LOD [%d]\n", g.min_varLOD); + fprintf(stderr, " -Q, --min-BQ INT\n" + " min base quality in het calling [%d]\n", g.min_baseQ); + fprintf(stderr, " -D INT max read depth [%d]\n", g.max_depth); +// fprintf(stderr, " -l FILE list of sites to phase [null]\n"); + fprintf(stderr, " -F do not attempt to fix chimeras\n"); + fprintf(stderr, " -A drop reads with ambiguous phase\n"); + fprintf(stderr, " --no-PG do not add a PG line\n"); +// fprintf(stderr, " -e do not discover SNPs (effective with -l)\n"); + fprintf(stderr, "\n"); + + sam_global_opt_help(stderr, "-....--."); + + return 1; + } + g.fp = sam_open_format(argv[optind], "r", &ga.in); + if (!g.fp) { + print_error_errno("phase", "Couldn't open '%s'", argv[optind]); + return 1; + } + g.fp_hdr = sam_hdr_read(g.fp); + if (g.fp_hdr == NULL) { + fprintf(stderr, "[%s] Failed to read header for '%s'\n", + __func__, argv[optind]); + return 1; + } + if (!g.no_pg && !(g.arg_list = stringify_argv(argc+1, argv-1))) { + print_error("phase", "failed to create arg_list"); + return 1; + } + if (fn_list) { // read the list of sites to phase + set = loadpos(fn_list, g.fp_hdr); + if (set == NULL) return 1; + free(fn_list); + } else g.flag &= ~FLAG_LIST_EXCL; + if (g.pre) { // open BAMs to write + if (ga.out.format == unknown_format) + ga.out.format = bam; // default via "wb". + + // Open each output file g.out[0..2], dupping and writing the header + if (start_output(&g, 0, "0", &ga.out) < 0 || + start_output(&g, 1, "1", &ga.out) < 0 || + start_output(&g, 2, "chimera", &ga.out) < 0) return 1; + } + + iter = bam_plp_init(readaln, &g); + g.vpos_shift = 0; + seqs = kh_init(64); + em = errmod_init(1. - 0.83); + bases = calloc(g.max_depth, 2); + printf("CC\n"); + printf("CC\tDescriptions:\nCC\n"); + printf("CC\t CC comments\n"); + printf("CC\t PS start of a phase set\n"); + printf("CC\t FL filtered region\n"); + printf("CC\t M[012] markers; 0 for singletons, 1 for phased and 2 for filtered\n"); + printf("CC\t EV supporting reads; SAM format\n"); + printf("CC\t // end of a phase set\nCC\n"); + printf("CC\tFormats of PS, FL and M[012] lines (1-based coordinates):\nCC\n"); + printf("CC\t PS chr phaseSetStart phaseSetEnd\n"); + printf("CC\t FL chr filterStart filterEnd\n"); + printf("CC\t M? chr PS pos allele0 allele1 hetIndex #supports0 #errors0 #supp1 #err1\n"); + printf("CC\nCC\n"); + fflush(stdout); + while ((plp = bam_plp_auto(iter, &tid, &pos, &n)) != 0) { + int i, k, c, tmp, dophase = 1, in_set = 0; + float q[16]; + if (tid < 0) break; + if (tid != lasttid) { // change of chromosome + g.vpos_shift = 0; + if (lasttid >= 0) { + seqs = shrink_hash(seqs); + if (phase(&g, sam_hdr_tid2name(g.fp_hdr, lasttid), + vpos, cns, seqs) < 0) { + return 1; + } + update_vpos(0x7fffffff, seqs); + } + lasttid = tid; + vpos = 0; + } + if (set && kh_get(set64, set, (uint64_t)tid<<32 | pos) != kh_end(set)) in_set = 1; + if (n > g.max_depth) continue; // do not proceed if the depth is too high + // fill the bases array and check if there is a variant + for (i = k = 0; i < n; ++i) { + const bam_pileup1_t *p = plp + i; + uint8_t *seq; + int q, baseQ, b; + if (p->is_del || p->is_refskip) continue; + baseQ = bam_get_qual(p->b)[p->qpos]; + if (baseQ < g.min_baseQ) continue; + seq = bam_get_seq(p->b); + b = seq_nt16_int[bam_seqi(seq, p->qpos)]; + if (b > 3) continue; + q = baseQ < p->b->core.qual? baseQ : p->b->core.qual; + if (q < 4) q = 4; + if (q > 63) q = 63; + bases[k++] = q<<5 | (int)bam_is_rev(p->b)<<4 | b; + } + if (k == 0) continue; + errmod_cal(em, k, 4, bases, q); // compute genotype likelihood + c = gl2cns(q); // get the consensus + // tell if to proceed + if (set && (g.flag&FLAG_LIST_EXCL) && !in_set) continue; // not in the list + if (!in_set && (c&0xffff)>>2 < g.min_varLOD) continue; // not a variant + // add the variant + if (vpos == max_vpos) { + max_vpos = max_vpos? max_vpos<<1 : 128; + cns = realloc(cns, max_vpos * 8); + } + cns[vpos] = (uint64_t)pos<<32 | c; + for (i = 0; i < n; ++i) { + const bam_pileup1_t *p = plp + i; + uint64_t key; + khint_t k; + uint8_t *seq = bam_get_seq(p->b); + frag_t *f; + if (p->is_del || p->is_refskip) continue; + if (p->b->core.qual == 0) continue; + // get the base code + c = seq_nt16_int[bam_seqi(seq, p->qpos)]; + if (c == (cns[vpos]&3)) c = 1; + else if (c == (cns[vpos]>>16&3)) c = 2; + else c = 0; + // write to seqs + key = X31_hash_string(bam_get_qname(p->b)); + k = kh_put(64, seqs, key, &tmp); + f = &kh_val(seqs, k); + if (tmp == 0) { // present in the hash table + if (vpos - f->vpos + 1 < MAX_VARS) { + f->vlen = vpos - f->vpos + 1; + f->seq[f->vlen-1] = c; + f->end = bam_endpos(p->b); + } + dophase = 0; + } else { // absent + memset(f->seq, 0, MAX_VARS); + f->beg = p->b->core.pos; + f->end = bam_endpos(p->b); + f->vpos = vpos, f->vlen = 1, f->seq[0] = c, f->single = f->phased = f->flip = f->ambig = 0; + } + } + if (dophase) { + seqs = shrink_hash(seqs); + if (phase(&g, sam_hdr_tid2name(g.fp_hdr, tid), vpos, cns, seqs) < 0) { + return 1; + } + update_vpos(vpos, seqs); + cns[0] = cns[vpos]; + vpos = 0; + } + ++vpos; + } + if (tid >= 0) { + if (phase(&g, sam_hdr_tid2name(g.fp_hdr, tid), vpos, cns, seqs) < 0) { + return 1; + } + } + + if (n < 0) { + print_error("phase", "error reading from '%s'", argv[optind]); + status = EXIT_FAILURE; + } + + sam_hdr_destroy(g.fp_hdr); + bam_plp_destroy(iter); + sam_close(g.fp); + kh_destroy(64, seqs); + kh_destroy(set64, set); + free(cns); + errmod_destroy(em); + free(bases); + if (g.pre) { + int res = 0; + for (c = 0; c <= 2; ++c) { + if (sam_close(g.out[c]) < 0) { + fprintf(stderr, "[%s] error on closing '%s'\n", + __func__, g.out_name[c]); + res = 1; + } + sam_hdr_destroy(g.out_hdr[c]); + free(g.out_name[c]); + } + free(g.pre); free(g.b); + if (res) return 1; + } + free(g.arg_list); + sam_global_args_free(&ga); + return status; +} diff --git a/samtools/phase.c.pysam.c b/samtools/phase.c.pysam.c new file mode 100644 index 0000000..b0b5257 --- /dev/null +++ b/samtools/phase.c.pysam.c @@ -0,0 +1,825 @@ +#include "samtools.pysam.h" + +/* phase.c -- phase subcommand. + + Copyright (C) 2011 Broad Institute. + Copyright (C) 2013-2016, 2019 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include "htslib/hts.h" +#include "htslib/sam.h" +#include "htslib/kstring.h" +#include "sam_opts.h" +#include "samtools.h" +#include "htslib/hts_os.h" + +#include "htslib/kseq.h" +KSTREAM_INIT(gzFile, gzread, 16384) + +#define MAX_VARS 256 +#define FLIP_PENALTY 2 +#define FLIP_THRES 4 +#define MASK_THRES 3 + +#define FLAG_FIX_CHIMERA 0x1 +#define FLAG_LIST_EXCL 0x4 +#define FLAG_DROP_AMBI 0x8 + +typedef struct { + // configurations, initialized in the main function + int flag, k, min_baseQ, min_varLOD, max_depth, no_pg; + // other global variables + int vpos_shift; + samFile* fp; + sam_hdr_t* fp_hdr; + char *pre, *arg_list; + char *out_name[3]; + samFile* out[3]; + sam_hdr_t* out_hdr[3]; + // alignment queue + int n, m; + bam1_t **b; +} phaseg_t; + +typedef struct { + int8_t seq[MAX_VARS]; // TODO: change to dynamic memory allocation! + int vpos, beg, end; + uint32_t vlen:16, single:1, flip:1, phase:1, phased:1, ambig:1; + uint32_t in:16, out:16; // in-phase and out-phase +} frag_t, *frag_p; + +#define rseq_lt(a,b) ((a)->vpos < (b)->vpos) + +#include "htslib/khash.h" +KHASH_SET_INIT_INT64(set64) +KHASH_MAP_INIT_INT64(64, frag_t) + +typedef khash_t(64) nseq_t; + +#include "htslib/ksort.h" +KSORT_INIT(rseq, frag_p, rseq_lt) + +static inline uint64_t X31_hash_string(const char *s) +{ + uint64_t h = *s; + if (h) for (++s ; *s; ++s) h = (h << 5) - h + *s; + return h; +} + +static void count1(int l, const uint8_t *seq, int *cnt) +{ + int i, j, n_ambi; + uint32_t z, x; + if (seq[l-1] == 0) return; // do nothing is the last base is ambiguous + for (i = n_ambi = 0; i < l; ++i) // collect ambiguous bases + if (seq[i] == 0) ++n_ambi; + if (l - n_ambi <= 1) return; // only one SNP + for (x = 0; x < 1u<>j&1; + ++j; + } + z = z<<1 | c; + } + ++cnt[z]; + } +} + +static int **count_all(int l, int vpos, nseq_t *hash) +{ + khint_t k; + int i, j, **cnt; + uint8_t *seq; + seq = calloc(l, 1); + cnt = calloc(vpos, sizeof(int*)); + for (i = 0; i < vpos; ++i) cnt[i] = calloc(1<vpos >= vpos || f->single) continue; // out of region; or singleton + if (f->vlen == 1) { // such reads should be flagged as deleted previously if everything is right + f->single = 1; + continue; + } + for (j = 1; j < f->vlen; ++j) { + for (i = 0; i < l; ++i) + seq[i] = j < l - 1 - i? 0 : f->seq[j - (l - 1 - i)]; + count1(l, seq, cnt[f->vpos + j]); + } + } + } + free(seq); + return cnt; +} + +// phasing +static int8_t *dynaprog(int l, int vpos, int **w) +{ + int *f[2], *curr, *prev, max, i; + int8_t **b, *h = 0; + uint32_t x, z = 1u<<(l-1), mask = (1u<>1; y1 = xc>>1; + c0 = prev[y0] + wi[x] + wi[xc]; + c1 = prev[y1] + wi[x] + wi[xc]; + if (c0 > c1) bi[x] = 0, curr[x] = c0; + else bi[x] = 1, curr[x] = c1; + } + tmp = prev; prev = curr; curr = tmp; // swap + } + { // backtrack + uint32_t max_x = 0; + int which = 0; + h = calloc(vpos, 1); + for (x = 0, max = 0, max_x = 0; x < z; ++x) + if (prev[x] > max) max = prev[x], max_x = x; + for (i = vpos - 1, x = max_x; i >= 0; --i) { + h[i] = which? (~x&1) : (x&1); + which = b[i][x]? !which : which; + x = b[i][x]? (~x&mask)>>1 : x>>1; + } + } + // free + for (i = 0; i < vpos; ++i) free(b[i]); + free(f[0]); free(f[1]); free(b); + return h; +} + +// phase each fragment +static uint64_t *fragphase(int vpos, const int8_t *path, nseq_t *hash, int flip) +{ + khint_t k; + uint64_t *pcnt; + uint32_t *left, *rght, max; + left = rght = 0; max = 0; + pcnt = calloc(vpos, 8); + for (k = 0; k < kh_end(hash); ++k) { + if (kh_exist(hash, k)) { + int i, c[2]; + frag_t *f = &kh_val(hash, k); + if (f->vpos >= vpos) continue; + // get the phase + c[0] = c[1] = 0; + for (i = 0; i < f->vlen; ++i) { + if (f->seq[i] == 0) continue; + ++c[f->seq[i] == path[f->vpos + i] + 1? 0 : 1]; + } + f->phase = c[0] > c[1]? 0 : 1; + f->in = c[f->phase]; f->out = c[1 - f->phase]; + f->phased = f->in == f->out? 0 : 1; + f->ambig = (f->in && f->out && f->out < 3 && f->in <= f->out + 1)? 1 : 0; + // fix chimera + f->flip = 0; + if (flip && c[0] >= 3 && c[1] >= 3) { + int sum[2], m, mi, md; + if (f->vlen > max) { // enlarge the array + max = f->vlen; + kroundup32(max); + left = realloc(left, max * 4); + rght = realloc(rght, max * 4); + } + for (i = 0, sum[0] = sum[1] = 0; i < f->vlen; ++i) { // get left counts + if (f->seq[i]) { + int c = f->phase? 2 - f->seq[i] : f->seq[i] - 1; + ++sum[c == path[f->vpos + i]? 0 : 1]; + } + left[i] = sum[1]<<16 | sum[0]; + } + for (i = f->vlen - 1, sum[0] = sum[1] = 0; i >= 0; --i) { // get right counts + if (f->seq[i]) { + int c = f->phase? 2 - f->seq[i] : f->seq[i] - 1; + ++sum[c == path[f->vpos + i]? 0 : 1]; + } + rght[i] = sum[1]<<16 | sum[0]; + } + // find the best flip point + for (i = m = 0, mi = -1, md = -1; i < f->vlen - 1; ++i) { + int a[2]; + a[0] = (left[i]&0xffff) + (rght[i+1]>>16&0xffff) - (rght[i+1]&0xffff) * FLIP_PENALTY; + a[1] = (left[i]>>16&0xffff) + (rght[i+1]&0xffff) - (rght[i+1]>>16&0xffff) * FLIP_PENALTY; + if (a[0] > a[1]) { + if (a[0] > m) m = a[0], md = 0, mi = i; + } else { + if (a[1] > m) m = a[1], md = 1, mi = i; + } + } + if (m - c[0] >= FLIP_THRES && m - c[1] >= FLIP_THRES) { // then flip + f->flip = 1; + if (md == 0) { // flip the tail + for (i = mi + 1; i < f->vlen; ++i) + if (f->seq[i] == 1) f->seq[i] = 2; + else if (f->seq[i] == 2) f->seq[i] = 1; + } else { // flip the head + for (i = 0; i <= mi; ++i) + if (f->seq[i] == 1) f->seq[i] = 2; + else if (f->seq[i] == 2) f->seq[i] = 1; + } + } + } + // update pcnt[] + if (!f->single) { + for (i = 0; i < f->vlen; ++i) { + int c; + if (f->seq[i] == 0) continue; + c = f->phase? 2 - f->seq[i] : f->seq[i] - 1; + if (c == path[f->vpos + i]) { + if (f->phase == 0) ++pcnt[f->vpos + i]; + else pcnt[f->vpos + i] += 1ull<<32; + } else { + if (f->phase == 0) pcnt[f->vpos + i] += 1<<16; + else pcnt[f->vpos + i] += 1ull<<48; + } + } + } + } + } + free(left); free(rght); + return pcnt; +} + +static uint64_t *genmask(int vpos, const uint64_t *pcnt, int *_n) +{ + int i, max = 0, max_i = -1, m = 0, n = 0, beg = 0, score = 0; + uint64_t *list = 0; + for (i = 0; i < vpos; ++i) { + uint64_t x = pcnt[i]; + int c[4], pre = score, s; + c[0] = x&0xffff; c[1] = x>>16&0xffff; c[2] = x>>32&0xffff; c[3] = x>>48&0xffff; + s = (c[1] + c[3] == 0)? -(c[0] + c[2]) : (c[1] + c[3] - 1); + if (c[3] > c[2]) s += c[3] - c[2]; + if (c[1] > c[0]) s += c[1] - c[0]; + score += s; + if (score < 0) score = 0; + if (pre == 0 && score > 0) beg = i; // change from zero to non-zero + if ((i == vpos - 1 || score == 0) && max >= MASK_THRES) { + if (n == m) { + m = m? m<<1 : 4; + list = realloc(list, m * 8); + } + list[n++] = (uint64_t)beg<<32 | max_i; + i = max_i; // reset i to max_i + score = 0; + } else if (score > max) max = score, max_i = i; + if (score == 0) max = 0; + } + *_n = n; + return list; +} + +// trim heading and tailing ambiguous bases; mark deleted and remove sequence +static int clean_seqs(int vpos, nseq_t *hash) +{ + khint_t k; + int ret = 0; + for (k = 0; k < kh_end(hash); ++k) { + if (kh_exist(hash, k)) { + frag_t *f = &kh_val(hash, k); + int beg, end, i; + if (f->vpos >= vpos) { + ret = 1; + continue; + } + for (i = 0; i < f->vlen; ++i) + if (f->seq[i] != 0) break; + beg = i; + for (i = f->vlen - 1; i >= 0; --i) + if (f->seq[i] != 0) break; + end = i + 1; + if (end - beg <= 0) kh_del(64, hash, k); + else { + if (beg != 0) memmove(f->seq, f->seq + beg, end - beg); + f->vpos += beg; f->vlen = end - beg; + f->single = f->vlen == 1? 1 : 0; + } + } + } + return ret; +} + +static int dump_aln(phaseg_t *g, int min_pos, const nseq_t *hash) +{ + int i, is_flip, drop_ambi; + drop_ambi = g->flag & FLAG_DROP_AMBI; + is_flip = (drand48() < 0.5); + for (i = 0; i < g->n; ++i) { + int end, which; + uint64_t key; + khint_t k; + bam1_t *b = g->b[i]; + key = X31_hash_string(bam_get_qname(b)); + end = bam_endpos(b); + if (end > min_pos) break; + k = kh_get(64, hash, key); + if (k == kh_end(hash)) which = 3; + else { + frag_t *f = &kh_val(hash, k); + if (f->ambig) which = drop_ambi? 2 : 3; + else if (f->phased && f->flip) which = 2; + else if (f->phased == 0) which = 3; + else { // phased and not flipped + char c = 'Y'; + which = f->phase; + bam_aux_append(b, "ZP", 'A', 1, (uint8_t*)&c); + } + if (which < 2 && is_flip) which = 1 - which; // increase the randomness + } + if (which == 3) which = (drand48() < 0.5); + if (sam_write1(g->out[which], g->out_hdr[which], b) < 0) { + print_error_errno("phase", "error writing to '%s'", g->out_name[which]); + return -1; + } + bam_destroy1(b); + g->b[i] = 0; + } + memmove(g->b, g->b + i, (g->n - i) * sizeof(void*)); + g->n -= i; + return 0; +} + +static int phase(phaseg_t *g, const char *chr, int vpos, uint64_t *cns, nseq_t *hash) +{ + int i, j, n_seqs = kh_size(hash), n_masked = 0, min_pos; + khint_t k; + frag_t **seqs; + int8_t *path, *sitemask; + uint64_t *pcnt, *regmask; + + if (vpos == 0) return 0; + i = clean_seqs(vpos, hash); // i is true if hash has an element with its vpos >= vpos + min_pos = i? cns[vpos]>>32 : 0x7fffffff; + if (vpos == 1) { + fprintf(samtools_stdout, "PS\t%s\t%d\t%d\n", chr, (int)(cns[0]>>32) + 1, (int)(cns[0]>>32) + 1); + fprintf(samtools_stdout, "M0\t%s\t%d\t%d\t%c\t%c\t%d\t0\t0\t0\t0\n//\n", chr, (int)(cns[0]>>32) + 1, (int)(cns[0]>>32) + 1, + "ACGTX"[cns[0]&3], "ACGTX"[cns[0]>>16&3], g->vpos_shift + 1); + for (k = 0; k < kh_end(hash); ++k) { + if (kh_exist(hash, k)) { + frag_t *f = &kh_val(hash, k); + if (f->vpos) continue; + f->flip = 0; + if (f->seq[0] == 0) f->phased = 0; + else f->phased = 1, f->phase = f->seq[0] - 1; + } + } + if (dump_aln(g, min_pos, hash) < 0) return -1; + ++g->vpos_shift; + return 1; + } + { // phase + int **cnt; + uint64_t *mask; + fprintf(samtools_stdout, "PS\t%s\t%d\t%d\n", chr, (int)(cns[0]>>32) + 1, (int)(cns[vpos-1]>>32) + 1); + sitemask = calloc(vpos, 1); + cnt = count_all(g->k, vpos, hash); + path = dynaprog(g->k, vpos, cnt); + for (i = 0; i < vpos; ++i) free(cnt[i]); + free(cnt); + pcnt = fragphase(vpos, path, hash, 0); // do not fix chimeras when masking + mask = genmask(vpos, pcnt, &n_masked); + regmask = calloc(n_masked, 8); + for (i = 0; i < n_masked; ++i) { + regmask[i] = cns[mask[i]>>32]>>32<<32 | cns[(uint32_t)mask[i]]>>32; + for (j = mask[i]>>32; j <= (int32_t)mask[i]; ++j) + sitemask[j] = 1; + } + free(mask); + if (g->flag & FLAG_FIX_CHIMERA) { + free(pcnt); + pcnt = fragphase(vpos, path, hash, 1); + } + } + for (i = 0; i < n_masked; ++i) + fprintf(samtools_stdout, "FL\t%s\t%d\t%d\n", chr, (int)(regmask[i]>>32) + 1, (int)regmask[i] + 1); + for (i = 0; i < vpos; ++i) { + uint64_t x = pcnt[i]; + int8_t c[2]; + c[0] = (cns[i]&0xffff)>>2 == 0? 4 : (cns[i]&3); + c[1] = (cns[i]>>16&0xffff)>>2 == 0? 4 : (cns[i]>>16&3); + fprintf(samtools_stdout, "M%d\t%s\t%d\t%d\t%c\t%c\t%d\t%d\t%d\t%d\t%d\n", sitemask[i]+1, chr, (int)(cns[0]>>32) + 1, (int)(cns[i]>>32) + 1, "ACGTX"[c[path[i]]], "ACGTX"[c[1-path[i]]], + i + g->vpos_shift + 1, (int)(x&0xffff), (int)(x>>16&0xffff), (int)(x>>32&0xffff), (int)(x>>48&0xffff)); + } + free(path); free(pcnt); free(regmask); free(sitemask); + seqs = calloc(n_seqs, sizeof(frag_t*)); + for (k = 0, i = 0; k < kh_end(hash); ++k) + if (kh_exist(hash, k) && kh_val(hash, k).vpos < vpos && !kh_val(hash, k).single) + seqs[i++] = &kh_val(hash, k); + n_seqs = i; + ks_introsort_rseq(n_seqs, seqs); + for (i = 0; i < n_seqs; ++i) { + frag_t *f = seqs[i]; + fprintf(samtools_stdout, "EV\t0\t%s\t%d\t40\t%dM\t*\t0\t0\t", chr, f->vpos + 1 + g->vpos_shift, f->vlen); + for (j = 0; j < f->vlen; ++j) { + uint32_t c = cns[f->vpos + j]; + if (f->seq[j] == 0) fputc('N', samtools_stdout); + else fputc("ACGT"[f->seq[j] == 1? (c&3) : (c>>16&3)], samtools_stdout); + } + fprintf(samtools_stdout, "\t*\tYP:i:%d\tYF:i:%d\tYI:i:%d\tYO:i:%d\tYS:i:%d\n", f->phase, f->flip, f->in, f->out, f->beg+1); + } + free(seqs); + fprintf(samtools_stdout, "//\n"); + fflush(samtools_stdout); + g->vpos_shift += vpos; + if (dump_aln(g, min_pos, hash) < 0) return -1; + return vpos; +} + +static void update_vpos(int vpos, nseq_t *hash) +{ + khint_t k; + for (k = 0; k < kh_end(hash); ++k) { + if (kh_exist(hash, k)) { + frag_t *f = &kh_val(hash, k); + if (f->vpos < vpos) kh_del(64, hash, k); // TODO: if frag_t::seq is allocated dynamically, free it + else f->vpos -= vpos; + } + } +} + +static nseq_t *shrink_hash(nseq_t *hash) // TODO: to implement +{ + return hash; +} + +static int readaln(void *data, bam1_t *b) +{ + phaseg_t *g = (phaseg_t*)data; + int ret; + while (1) + { + ret = sam_read1(g->fp, g->fp_hdr, b); + if (ret < 0) break; + if ( b->core.flag & (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP) ) continue; + if ( g->pre ) { + if (g->n == g->m) { + g->m = g->m? g->m<<1 : 16; + g->b = realloc(g->b, g->m * sizeof(bam1_t*)); + } + g->b[g->n++] = bam_dup1(b); + } + break; + } + return ret; +} + +static khash_t(set64) *loadpos(const char *fn, sam_hdr_t *h) +{ + gzFile fp; + kstream_t *ks; + int ret, dret; + kstring_t *str; + khash_t(set64) *hash; + + fp = strcmp(fn, "-")? gzopen(fn, "r") : gzdopen(fileno(stdin), "r"); + if (fp == NULL) { + print_error_errno("phase", "Couldn't open site file '%s'", fn); + return NULL; + } + + hash = kh_init(set64); + str = calloc(1, sizeof(kstring_t)); + + ks = ks_init(fp); + while (ks_getuntil(ks, 0, str, &dret) >= 0) { + int tid = bam_name2id(h, str->s); + if (tid >= 0 && dret != '\n') { + if (ks_getuntil(ks, 0, str, &dret) >= 0) { + uint64_t x = (uint64_t)tid<<32 | (atoi(str->s) - 1); + kh_put(set64, hash, x, &ret); + } else break; + } + if (dret != '\n') while ((dret = ks_getc(ks)) > 0 && dret != '\n'); + if (dret < 0) break; + } + ks_destroy(ks); + gzclose(fp); + free(str->s); free(str); + return hash; +} + +static int gl2cns(float q[16]) +{ + int i, j, min_ij; + float min, min2; + min = min2 = 1e30; min_ij = -1; + for (i = 0; i < 4; ++i) { + for (j = i; j < 4; ++j) { + if (q[i<<2|j] < min) min_ij = i<<2|j, min2 = min, min = q[i<<2|j]; + else if (q[i<<2|j] < min2) min2 = q[i<<2|j]; + } + } + return (min_ij>>2&3) == (min_ij&3)? 0 : 1<<18 | (min_ij>>2&3)<<16 | (min_ij&3) | (int)(min2 - min + .499) << 2; +} + +static int start_output(phaseg_t *g, int c, const char *middle, const htsFormat *fmt) +{ + kstring_t s = { 0, 0, NULL }; + ksprintf(&s, "%s.%s.%s", g->pre, middle, hts_format_file_extension(fmt)); + g->out_name[c] = ks_release(&s); + g->out[c] = sam_open_format(g->out_name[c], "wb", fmt); + if (! g->out[c]) { + print_error_errno("phase", "Failed to open output file '%s'", g->out_name[c]); + return -1; + } + + g->out_hdr[c] = sam_hdr_dup(g->fp_hdr); + if (!g->no_pg && sam_hdr_add_pg(g->out_hdr[c], "samtools", + "VN", samtools_version(), + g->arg_list ? "CL": NULL, + g->arg_list ? g->arg_list : NULL, + NULL)) { + print_error("phase", "failed to add PG line to header"); + return -1; + } + if (sam_hdr_write(g->out[c], g->out_hdr[c]) < 0) { + print_error_errno("phase", "Failed to write header for '%s'", g->out_name[c]); + return -1; + } + + return 0; +} + +int main_phase(int argc, char *argv[]) +{ + int c, tid, pos, vpos = 0, n, lasttid = -1, max_vpos = 0, usage = 0; + int status = EXIT_SUCCESS; + const bam_pileup1_t *plp; + bam_plp_t iter; + nseq_t *seqs; + uint64_t *cns = 0; + phaseg_t g; + char *fn_list = 0; + khash_t(set64) *set = 0; + errmod_t *em; + uint16_t *bases; + + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 0, 0, 0, '-'), + {"min-BQ", required_argument, NULL, 'Q'}, + {"min-bq", required_argument, NULL, 'Q'}, + {"no-PG", no_argument, NULL, 1}, + { NULL, 0, NULL, 0 } + }; + + // FIXME Leaks galore in the case of error returns + + memset(&g, 0, sizeof(phaseg_t)); + g.flag = FLAG_FIX_CHIMERA; + g.min_varLOD = 37; g.k = 13; g.min_baseQ = 13; g.max_depth = 256; + while ((c = getopt_long(argc, argv, "Q:eFq:k:b:l:D:A", lopts, NULL)) >= 0) { + switch (c) { + case 'D': g.max_depth = atoi(optarg); break; + case 'q': g.min_varLOD = atoi(optarg); break; + case 'Q': g.min_baseQ = atoi(optarg); break; + case 'k': g.k = atoi(optarg); break; + case 'F': g.flag &= ~FLAG_FIX_CHIMERA; break; + case 'e': g.flag |= FLAG_LIST_EXCL; break; + case 'A': g.flag |= FLAG_DROP_AMBI; break; + case 'b': g.pre = strdup(optarg); break; + case 'l': fn_list = strdup(optarg); break; + case 1: g.no_pg = 1; break; + default: if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage=1; break; + } + if (usage) break; + } + if (usage || argc == optind) { + fprintf(samtools_stderr, "\n"); + fprintf(samtools_stderr, "Usage: samtools phase [options] \n\n"); + fprintf(samtools_stderr, "Options: -k INT block length [%d]\n", g.k); + fprintf(samtools_stderr, " -b STR prefix of BAMs to output [null]\n"); + fprintf(samtools_stderr, " -q INT min het phred-LOD [%d]\n", g.min_varLOD); + fprintf(samtools_stderr, " -Q, --min-BQ INT\n" + " min base quality in het calling [%d]\n", g.min_baseQ); + fprintf(samtools_stderr, " -D INT max read depth [%d]\n", g.max_depth); +// fprintf(samtools_stderr, " -l FILE list of sites to phase [null]\n"); + fprintf(samtools_stderr, " -F do not attempt to fix chimeras\n"); + fprintf(samtools_stderr, " -A drop reads with ambiguous phase\n"); + fprintf(samtools_stderr, " --no-PG do not add a PG line\n"); +// fprintf(samtools_stderr, " -e do not discover SNPs (effective with -l)\n"); + fprintf(samtools_stderr, "\n"); + + sam_global_opt_help(samtools_stderr, "-....--."); + + return 1; + } + g.fp = sam_open_format(argv[optind], "r", &ga.in); + if (!g.fp) { + print_error_errno("phase", "Couldn't open '%s'", argv[optind]); + return 1; + } + g.fp_hdr = sam_hdr_read(g.fp); + if (g.fp_hdr == NULL) { + fprintf(samtools_stderr, "[%s] Failed to read header for '%s'\n", + __func__, argv[optind]); + return 1; + } + if (!g.no_pg && !(g.arg_list = stringify_argv(argc+1, argv-1))) { + print_error("phase", "failed to create arg_list"); + return 1; + } + if (fn_list) { // read the list of sites to phase + set = loadpos(fn_list, g.fp_hdr); + if (set == NULL) return 1; + free(fn_list); + } else g.flag &= ~FLAG_LIST_EXCL; + if (g.pre) { // open BAMs to write + if (ga.out.format == unknown_format) + ga.out.format = bam; // default via "wb". + + // Open each output file g.out[0..2], dupping and writing the header + if (start_output(&g, 0, "0", &ga.out) < 0 || + start_output(&g, 1, "1", &ga.out) < 0 || + start_output(&g, 2, "chimera", &ga.out) < 0) return 1; + } + + iter = bam_plp_init(readaln, &g); + g.vpos_shift = 0; + seqs = kh_init(64); + em = errmod_init(1. - 0.83); + bases = calloc(g.max_depth, 2); + fprintf(samtools_stdout, "CC\n"); + fprintf(samtools_stdout, "CC\tDescriptions:\nCC\n"); + fprintf(samtools_stdout, "CC\t CC comments\n"); + fprintf(samtools_stdout, "CC\t PS start of a phase set\n"); + fprintf(samtools_stdout, "CC\t FL filtered region\n"); + fprintf(samtools_stdout, "CC\t M[012] markers; 0 for singletons, 1 for phased and 2 for filtered\n"); + fprintf(samtools_stdout, "CC\t EV supporting reads; SAM format\n"); + fprintf(samtools_stdout, "CC\t // end of a phase set\nCC\n"); + fprintf(samtools_stdout, "CC\tFormats of PS, FL and M[012] lines (1-based coordinates):\nCC\n"); + fprintf(samtools_stdout, "CC\t PS chr phaseSetStart phaseSetEnd\n"); + fprintf(samtools_stdout, "CC\t FL chr filterStart filterEnd\n"); + fprintf(samtools_stdout, "CC\t M? chr PS pos allele0 allele1 hetIndex #supports0 #errors0 #supp1 #err1\n"); + fprintf(samtools_stdout, "CC\nCC\n"); + fflush(samtools_stdout); + while ((plp = bam_plp_auto(iter, &tid, &pos, &n)) != 0) { + int i, k, c, tmp, dophase = 1, in_set = 0; + float q[16]; + if (tid < 0) break; + if (tid != lasttid) { // change of chromosome + g.vpos_shift = 0; + if (lasttid >= 0) { + seqs = shrink_hash(seqs); + if (phase(&g, sam_hdr_tid2name(g.fp_hdr, lasttid), + vpos, cns, seqs) < 0) { + return 1; + } + update_vpos(0x7fffffff, seqs); + } + lasttid = tid; + vpos = 0; + } + if (set && kh_get(set64, set, (uint64_t)tid<<32 | pos) != kh_end(set)) in_set = 1; + if (n > g.max_depth) continue; // do not proceed if the depth is too high + // fill the bases array and check if there is a variant + for (i = k = 0; i < n; ++i) { + const bam_pileup1_t *p = plp + i; + uint8_t *seq; + int q, baseQ, b; + if (p->is_del || p->is_refskip) continue; + baseQ = bam_get_qual(p->b)[p->qpos]; + if (baseQ < g.min_baseQ) continue; + seq = bam_get_seq(p->b); + b = seq_nt16_int[bam_seqi(seq, p->qpos)]; + if (b > 3) continue; + q = baseQ < p->b->core.qual? baseQ : p->b->core.qual; + if (q < 4) q = 4; + if (q > 63) q = 63; + bases[k++] = q<<5 | (int)bam_is_rev(p->b)<<4 | b; + } + if (k == 0) continue; + errmod_cal(em, k, 4, bases, q); // compute genotype likelihood + c = gl2cns(q); // get the consensus + // tell if to proceed + if (set && (g.flag&FLAG_LIST_EXCL) && !in_set) continue; // not in the list + if (!in_set && (c&0xffff)>>2 < g.min_varLOD) continue; // not a variant + // add the variant + if (vpos == max_vpos) { + max_vpos = max_vpos? max_vpos<<1 : 128; + cns = realloc(cns, max_vpos * 8); + } + cns[vpos] = (uint64_t)pos<<32 | c; + for (i = 0; i < n; ++i) { + const bam_pileup1_t *p = plp + i; + uint64_t key; + khint_t k; + uint8_t *seq = bam_get_seq(p->b); + frag_t *f; + if (p->is_del || p->is_refskip) continue; + if (p->b->core.qual == 0) continue; + // get the base code + c = seq_nt16_int[bam_seqi(seq, p->qpos)]; + if (c == (cns[vpos]&3)) c = 1; + else if (c == (cns[vpos]>>16&3)) c = 2; + else c = 0; + // write to seqs + key = X31_hash_string(bam_get_qname(p->b)); + k = kh_put(64, seqs, key, &tmp); + f = &kh_val(seqs, k); + if (tmp == 0) { // present in the hash table + if (vpos - f->vpos + 1 < MAX_VARS) { + f->vlen = vpos - f->vpos + 1; + f->seq[f->vlen-1] = c; + f->end = bam_endpos(p->b); + } + dophase = 0; + } else { // absent + memset(f->seq, 0, MAX_VARS); + f->beg = p->b->core.pos; + f->end = bam_endpos(p->b); + f->vpos = vpos, f->vlen = 1, f->seq[0] = c, f->single = f->phased = f->flip = f->ambig = 0; + } + } + if (dophase) { + seqs = shrink_hash(seqs); + if (phase(&g, sam_hdr_tid2name(g.fp_hdr, tid), vpos, cns, seqs) < 0) { + return 1; + } + update_vpos(vpos, seqs); + cns[0] = cns[vpos]; + vpos = 0; + } + ++vpos; + } + if (tid >= 0) { + if (phase(&g, sam_hdr_tid2name(g.fp_hdr, tid), vpos, cns, seqs) < 0) { + return 1; + } + } + + if (n < 0) { + print_error("phase", "error reading from '%s'", argv[optind]); + status = EXIT_FAILURE; + } + + sam_hdr_destroy(g.fp_hdr); + bam_plp_destroy(iter); + sam_close(g.fp); + kh_destroy(64, seqs); + kh_destroy(set64, set); + free(cns); + errmod_destroy(em); + free(bases); + if (g.pre) { + int res = 0; + for (c = 0; c <= 2; ++c) { + if (sam_close(g.out[c]) < 0) { + fprintf(samtools_stderr, "[%s] error on closing '%s'\n", + __func__, g.out_name[c]); + res = 1; + } + sam_hdr_destroy(g.out_hdr[c]); + free(g.out_name[c]); + } + free(g.pre); free(g.b); + if (res) return 1; + } + free(g.arg_list); + sam_global_args_free(&ga); + return status; +} diff --git a/samtools/reference.c b/samtools/reference.c new file mode 100644 index 0000000..2d95d64 --- /dev/null +++ b/samtools/reference.c @@ -0,0 +1,598 @@ +/* bam_reference.c -- extracts an embedded reference from a CRAM file, + or creates it from alignments plus MD:Z tags. + + Copyright (C) 2022 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include + +#include "htslib/sam.h" +#include "htslib/cram.h" +#include "samtools.h" +#include "sam_opts.h" + + +/* + * There are two main modes of operation. + * + * 1. Extracting the reference from the CRAM file embed_ref blocks. + * 2. Generation of reference by analysing consensus plus patches applied + * via MD tags. + * + * The first is very rapid, but only applies to a CRAM files generated with + * the specific options (not commonly used and not the default). The second + * is a slow operation, but applies to any data type. + * + * This is also a testing ground for a future CRAM auto-embed-ref option that + * permits the use of an embedded reference without having to first extract + * the reference. (Note this may require the creation of MD tags during + * decode by use of an existing embedded reference, if the records don't + * have an MD tag themselves, but that's an issue for htslib when we get + * there.) + */ + +/* + * --------------------------------------------------------------------------- + * Shared utility functions by both methods. + */ + +#define haszero(x) (((x)-0x0101010101010101UL)&~(x)&0x8080808080808080UL) +#define MIN(a,b) ((a)<(b)?(a):(b)) +static int dump_ref(sam_hdr_t *h, hts_itr_t *iter, int ref_id, + char *ref, uint64_t ref_len, FILE *fp, int verbose) { + int N = 0; + if (iter && iter->end >= HTS_POS_MAX) + iter->end = ref_len; + if (iter && (iter->beg > 0 || iter->end < ref_len)) { + fprintf(fp, ">%s:%"PRIhts_pos"-%"PRIhts_pos"\n", + sam_hdr_tid2name(h, ref_id), iter->beg+1, iter->end); + ref += iter->beg; + ref_len = MIN(ref_len, iter->end) - iter->beg; + } else { + fprintf(fp, ">%s\n", sam_hdr_tid2name(h, ref_id)); + } + + int i, j; + uint64_t rem = ref_len; + + // Count coverage, purely for information purposes. + // About 90% of dump_ref CPU is here, so maybe this isn't useful, + // but this is still 3-4x faster than the obvious naive loop. + // + // Overall though it's only about 5% overhead of the entire process + // (was ~20%). + if (verbose) { + int n4[8] = {0}; + for (j = 0; j < ref_len && (((uintptr_t) &ref[j] & 7) != 0); j++) + N += ref[j] == 'N'; + uint64_t fast_end = ((ref_len - j) & ~7) + j; + for (; j < fast_end; j+=8) { + uint64_t i64 = *(uint64_t *)&ref[j]; + if (!haszero(i64 ^ 0x4e4e4e4e4e4e4e4eUL)) // 'N' <-> 0 + continue; + + n4[0] += ref[j+0] == 'N'; + n4[1] += ref[j+1] == 'N'; + n4[2] += ref[j+2] == 'N'; + n4[3] += ref[j+3] == 'N'; + n4[4] += ref[j+4] == 'N'; + n4[5] += ref[j+5] == 'N'; + n4[6] += ref[j+6] == 'N'; + n4[7] += ref[j+7] == 'N'; + } + for (; j < ref_len; j++) + N += ref[j] == 'N'; + N += n4[0]+n4[1]+n4[2]+n4[3]+ + n4[4]+n4[5]+n4[6]+n4[7]; + } + + // Format reference + for (i = 0; i < ref_len; i += 60, rem -= 60) { + int len = (int)(rem < 60 ? rem : 60); + if (fwrite(ref, 1, len, fp) != len) + return -1; + putc('\n', fp); + ref += 60; + } + + if (verbose) + fprintf(stderr, "Dump ref %d len %"PRId64", coverage %.2f%%\n", + ref_id, ref_len, 100 - N*100.0 / ref_len); + + return 0; +} + +/* + * --------------------------------------------------------------------------- + * CRAM embedded reference method of reference construction + */ + +/* + * Extracts an embedded reference from a sorted CRAM file. + * Modelled on the CRAM container copy loop from bam_cat.c. + */ +static int cram2ref(samFile *in, sam_hdr_t *h, hts_idx_t *idx, char *reg, + FILE *outfp, int verbose) { + cram_fd *in_c; + cram_container *c = NULL; + cram_block *blk = NULL; + cram_block_slice_hdr *shdr = NULL; + + int curr_ref_id = -99; + char *ref = NULL; + uint64_t ref_len = 0; + + // We have no direct public API for seeking in CRAM to a specific + // location by genome coordinates. The sam_itr_query API is + // designed for fetching records, rather than seeks to specific + // file locations. + // + // TODO: consider exposing cram_range and cram_seek_to_refpos API. + // After a sam_index_load which will add the index to infp, these + // functions should seek direct to the start of a container. + // Or use cram_index *e =cram_index_query(cram, tid, beg, NULL); + // + // However, fortuitously(?) sam_itr_querys calls cram_seek_to_refpos + // so we can do a region query and let that do the initial seek. + // We still need to do our own end-range detection though. + + hts_itr_t *iter = NULL; + if (reg) { + iter = sam_itr_querys(idx, h, reg); + if (!iter) { + print_error("reference", "failed to parse region '%s'", reg); + goto err; + } + } + + in_c = in->fp.cram; // low level htslib abuse? + int eor = 0; + while (!eor && (c = cram_read_container(in_c))) { + if (cram_container_is_empty(in_c)) { + cram_block *blk; + // Container compression header + if (!(blk = cram_read_block(in_c))) + goto err; + cram_free_block(blk); + cram_free_container(c); + c = NULL; blk = NULL; + continue; + } + + // Container compression header; read and discard + int32_t num_slices; + if (!(blk = cram_read_block(in_c))) + goto err; + cram_free_block(blk); + blk = NULL; + + // Container num_blocks can be invalid, due to a bug. + // Instead we iterate in slice context instead. + (void)cram_container_get_landmarks(c, &num_slices); + int i, j; + for (i = 0; i < num_slices; i++) { + // Slice header + if (!(blk = cram_read_block(in_c))) + goto err; + if (!(shdr = cram_decode_slice_header(in_c, blk))) + goto err; + cram_free_block(blk); + blk = NULL; + + int num_blocks = cram_slice_hdr_get_num_blocks(shdr); + int embed_id = cram_slice_hdr_get_embed_ref_id(shdr); + int ref_id; + hts_pos_t ref_start, ref_span; + cram_slice_hdr_get_coords(shdr, &ref_id, &ref_start, &ref_span); + + if (iter) { + if (iter->tid != ref_id || ref_start > iter->end) { + // Beyond end of specified region. + cram_free_slice_header(shdr); + eor = 1; + break; + } + } + + if (embed_id < 0 && ref_id != -1) { + fprintf(stderr, "CRAM file has slice without embedded " + "reference\n"); + goto err; + } + + if (ref_id != curr_ref_id) { + if (curr_ref_id >= 0) { + if (dump_ref(h, iter, curr_ref_id, ref, ref_len, + outfp, verbose) < 0) + goto err; + } + + ref_len = sam_hdr_tid2len(h, ref_id); + if (ref_len) { + char *ref2 = realloc(ref, ref_len); + if (!ref2) + goto err; + else + ref = ref2; + memset(ref, 'N', ref_len); + } + curr_ref_id = ref_id; + } + + // Slice data blocks + for (j = 0; j < num_blocks; j++) { + // read and discard, unless it's the ref-ID block + if (!(blk = cram_read_block(in_c))) + goto err; + if (cram_block_get_content_id(blk) == embed_id) { + cram_uncompress_block(blk); + //printf("%.*s\n", blk->uncomp_size, blk->data); + + int32_t usize = cram_block_get_uncomp_size(blk); + int ref_end = ref_start + usize; + if (ref_end > ref_len+1) + ref_end = ref_len+1; + if (ref_end > ref_start) + memcpy(ref + ref_start-1, cram_block_get_data(blk), + ref_end - ref_start); + } + cram_free_block(blk); + blk = NULL; + } + cram_free_slice_header(shdr); + shdr = NULL; + } + + cram_free_container(c); + c = NULL; + } + + int ret = 0; + if (curr_ref_id >= 0) { + ret = dump_ref(h, iter, curr_ref_id, ref, ref_len, outfp, verbose); + } else if (reg) { + // no data present + // no data present, but we explicitly asked for the reference so + // report it still as Ns. + ref_len = MIN(iter->end, sam_hdr_tid2len(h, iter->tid)); + ref = malloc(ref_len); + memset(ref, 'N', ref_len); + if (!ref) + goto err; + ret = dump_ref(h, iter, iter->tid, ref, ref_len, outfp, verbose); + } + + free(ref); + if (iter) + hts_itr_destroy(iter); + + return ret; + + err: + free(ref); + if (blk) + cram_free_block(blk); + if (shdr) + cram_free_slice_header(shdr); + if (c) + cram_free_container(c); + if (iter) + hts_itr_destroy(iter); + + return -1; +} + +/* + * --------------------------------------------------------------------------- + * MD method of reference construction + */ + +// Returns the next cigar op code: one of the BAM_C* codes, +// or -1 if no more are present. +static inline +int next_cigar_op(uint32_t *cigar, int *ncigar, int *skip, int *spos, + uint32_t *cig_ind, uint32_t *cig_op, uint32_t *cig_len) { + for(;;) { + while (*cig_len == 0) { + if (*cig_ind < *ncigar) { + *cig_op = cigar[*cig_ind] & BAM_CIGAR_MASK; + *cig_len = cigar[*cig_ind] >> BAM_CIGAR_SHIFT; + (*cig_ind)++; + } else { + return -1; + } + } + + if (skip[*cig_op]) { + *spos += (bam_cigar_type(*cig_op)&1) * *cig_len; + *cig_len = 0; + continue; + } + + (*cig_len)--; + break; + } + + return *cig_op; +} + +// Converts a bam object with SEQ, POS/CIGAR and MD:Z to a reference. +// Updates ref[] array. +// +// Returns >0 on success, +// 0 on no-MD found, +// -1 on failure (eg inconsistent data) +static int build_ref(bam1_t *b, char *ref, size_t ref_len) { + uint8_t *seq = bam_get_seq(b); + uint32_t *cigar = bam_get_cigar(b); + int ncigar = b->core.n_cigar; + uint32_t cig_op = 0, cig_len = 0, cig_ind = 0; + + const uint8_t *MD = bam_aux_get(b, "MD"); + if (!MD || *MD != 'Z') + return 0; + MD++; + + // Walk through MD + seq to generate ref + int iseq = 0, iref = b->core.pos, next_op; + int cig_skip[16] = {0,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1}; + while (iseq < b->core.l_qseq && *MD) { + if (isdigit(*MD)) { + // match + int len = strtol((char *)MD, (char **)&MD, 10); + while (iseq < b->core.l_qseq && len) { + if ((next_op = next_cigar_op(cigar, &ncigar, cig_skip, + &iseq, &cig_ind, &cig_op, + &cig_len)) < 0) + return -1; + + if (next_op != BAM_CMATCH && + next_op != BAM_CEQUAL) { + print_error("MD2ref", + "MD:Z and CIGAR are incompatible"); + return -1; + } + + if (iref < ref_len) + ref[iref] = seq_nt16_str[bam_seqi(seq, iseq)]; + iseq++; + iref++; + len--; + } + } else if (*MD == '^') { + // deletion + MD++; + while (*MD && isalpha(*MD)) { + if ((next_op = next_cigar_op(cigar, &ncigar, cig_skip, + &iseq, &cig_ind, &cig_op, + &cig_len)) < 0) + return -1; + + if (next_op != BAM_CDEL) { + print_error("MD2ref", + "MD:Z and CIGAR are incompatible"); + return -1; + } + + if (iref < ref_len) + ref[iref] = *MD; + + MD++; + iref++; + } + } else { + // substitution + if ((next_op = next_cigar_op(cigar, &ncigar, cig_skip, + &iseq, &cig_ind, &cig_op, + &cig_len)) < 0) + return -1; + + if (next_op != BAM_CMATCH && next_op != BAM_CDIFF) { + print_error("MD2ref", "MD:Z and CIGAR are incompatible"); + return -1; + } + if (iref < ref_len) + ref[iref] = *MD; + + MD++; + iref++; + iseq++; + } + } + + return 1; +} + +static int MD2ref(samFile *in, sam_hdr_t *h, hts_idx_t *idx, char *reg, + FILE *outfp, int verbose) { + bam1_t *b = bam_init1(); + int r, last_tid = -99; + size_t ref_len = 0; + char *ref = NULL; + int ret = -1; + + hts_itr_t *iter = NULL; + if (idx && reg) { + iter = sam_itr_querys(idx, h, reg); + if (!iter) { + print_error("reference", "failed to parse region '%s'", reg); + goto err; + } + } + + while ((r = iter + ? sam_itr_next(in, iter, b) + : sam_read1(in, h, b)) >= 0) { + // check b->core.tid and flush old seq. + if (b->core.tid != last_tid) { + if (last_tid >= 0) + if (dump_ref(h, iter, last_tid, ref, ref_len, outfp, + verbose) < 0) + goto err; + + last_tid = b->core.tid; + ref_len = sam_hdr_tid2len(h, last_tid); + if (ref_len) { + char *ref2 = realloc(ref, ref_len); + if (!ref2) + goto err; + else + ref = ref2; + memset(ref, 'N', ref_len); + } + } + + if (build_ref(b, ref, ref_len) < 0) + goto err; + } + + if (last_tid >= 0) { + if (dump_ref(h, iter, last_tid, ref, ref_len, outfp, verbose) < 0) + goto err; + } else if (reg) { + // no data present, but we explicitly asked for the reference so + // report it still as Ns. + ref_len = MIN(iter->end, sam_hdr_tid2len(h, iter->tid)); + ref = malloc(ref_len); + memset(ref, 'N', ref_len); + if (!ref) + goto err; + if (dump_ref(h, iter, iter->tid, ref, ref_len, outfp, verbose) < 0) + goto err; + } + + if (r < -1) + goto err; + + ret = 0; + + err: + if (iter) + hts_itr_destroy(iter); + bam_destroy1(b); + free(ref); + return ret; +} + +int main_reference(int argc, char *argv[]) +{ + int c, usage = 0, verbose = 1, use_embedded = 0; + sam_hdr_t *h = 0; + samFile *in = NULL; + hts_idx_t *idx = NULL; + sam_global_args ga; + FILE *outfp = stdout; + char *reg = NULL; + + static const struct option lopts[] = { + {"output", required_argument, NULL, 'o'}, + {"quiet", no_argument, NULL, 'q'}, + {"embedded", no_argument, NULL, 'e'}, + {"region", required_argument, NULL, 'r'}, + SAM_OPT_GLOBAL_OPTIONS('-', '-', '-', '-', '-', '@'), + { NULL, 0, NULL, 0 } + }; + + sam_global_args_init(&ga); + + while ((c = getopt_long(argc, argv, "@:qo:er:", lopts, NULL)) >= 0) { + switch (c) { + case 'o': + if (!(outfp = fopen(optarg, "w"))) { + perror(optarg); + goto err; + } + break; + + case 'q': + verbose = 0; + break; + + case 'e': + use_embedded = 1; + break; + + case 'r': + reg = optarg; + break; + + default: + if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage=1; break; + } + } + + if ((optind == argc && isatty(0)) || usage) { + printf("Usage: samtools reference [-@ N] [-r region] [-e] [-q] [-o out.fa] [in.cram]\n"); + return 0; + } + + char *fn = optind < argc ? argv[optind] : "-"; + if (!(in = sam_open(fn, "r"))) { + print_error_errno("reference", "failed to open file '%s'", fn); + return 1; + } + + if (ga.nthreads > 0) + hts_set_threads(in, ga.nthreads); + + if (!(h = sam_hdr_read(in))) + goto err; + + if (reg) { + idx = sam_index_load(in, fn); + if (!idx) { + print_error_errno("reference", "Failed to load the index"); + goto err; + } + } + + int ret = use_embedded + ? cram2ref(in, h, idx, reg, outfp, verbose) + : MD2ref(in, h, idx, reg, outfp, verbose); + + sam_hdr_destroy(h); + if (outfp != stdout) + fclose(outfp); + if (idx) + hts_idx_destroy(idx); + sam_close(in); + + return ret; + + err: + if (idx) + hts_idx_destroy(idx); + if (in) + sam_close(in); + if (h) + sam_hdr_destroy(h); + + return 1; +} diff --git a/samtools/reference.c.pysam.c b/samtools/reference.c.pysam.c new file mode 100644 index 0000000..fe8025f --- /dev/null +++ b/samtools/reference.c.pysam.c @@ -0,0 +1,600 @@ +#include "samtools.pysam.h" + +/* bam_reference.c -- extracts an embedded reference from a CRAM file, + or creates it from alignments plus MD:Z tags. + + Copyright (C) 2022 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include + +#include "htslib/sam.h" +#include "htslib/cram.h" +#include "samtools.h" +#include "sam_opts.h" + + +/* + * There are two main modes of operation. + * + * 1. Extracting the reference from the CRAM file embed_ref blocks. + * 2. Generation of reference by analysing consensus plus patches applied + * via MD tags. + * + * The first is very rapid, but only applies to a CRAM files generated with + * the specific options (not commonly used and not the default). The second + * is a slow operation, but applies to any data type. + * + * This is also a testing ground for a future CRAM auto-embed-ref option that + * permits the use of an embedded reference without having to first extract + * the reference. (Note this may require the creation of MD tags during + * decode by use of an existing embedded reference, if the records don't + * have an MD tag themselves, but that's an issue for htslib when we get + * there.) + */ + +/* + * --------------------------------------------------------------------------- + * Shared utility functions by both methods. + */ + +#define haszero(x) (((x)-0x0101010101010101UL)&~(x)&0x8080808080808080UL) +#define MIN(a,b) ((a)<(b)?(a):(b)) +static int dump_ref(sam_hdr_t *h, hts_itr_t *iter, int ref_id, + char *ref, uint64_t ref_len, FILE *fp, int verbose) { + int N = 0; + if (iter && iter->end >= HTS_POS_MAX) + iter->end = ref_len; + if (iter && (iter->beg > 0 || iter->end < ref_len)) { + fprintf(fp, ">%s:%"PRIhts_pos"-%"PRIhts_pos"\n", + sam_hdr_tid2name(h, ref_id), iter->beg+1, iter->end); + ref += iter->beg; + ref_len = MIN(ref_len, iter->end) - iter->beg; + } else { + fprintf(fp, ">%s\n", sam_hdr_tid2name(h, ref_id)); + } + + int i, j; + uint64_t rem = ref_len; + + // Count coverage, purely for information purposes. + // About 90% of dump_ref CPU is here, so maybe this isn't useful, + // but this is still 3-4x faster than the obvious naive loop. + // + // Overall though it's only about 5% overhead of the entire process + // (was ~20%). + if (verbose) { + int n4[8] = {0}; + for (j = 0; j < ref_len && (((uintptr_t) &ref[j] & 7) != 0); j++) + N += ref[j] == 'N'; + uint64_t fast_end = ((ref_len - j) & ~7) + j; + for (; j < fast_end; j+=8) { + uint64_t i64 = *(uint64_t *)&ref[j]; + if (!haszero(i64 ^ 0x4e4e4e4e4e4e4e4eUL)) // 'N' <-> 0 + continue; + + n4[0] += ref[j+0] == 'N'; + n4[1] += ref[j+1] == 'N'; + n4[2] += ref[j+2] == 'N'; + n4[3] += ref[j+3] == 'N'; + n4[4] += ref[j+4] == 'N'; + n4[5] += ref[j+5] == 'N'; + n4[6] += ref[j+6] == 'N'; + n4[7] += ref[j+7] == 'N'; + } + for (; j < ref_len; j++) + N += ref[j] == 'N'; + N += n4[0]+n4[1]+n4[2]+n4[3]+ + n4[4]+n4[5]+n4[6]+n4[7]; + } + + // Format reference + for (i = 0; i < ref_len; i += 60, rem -= 60) { + int len = (int)(rem < 60 ? rem : 60); + if (fwrite(ref, 1, len, fp) != len) + return -1; + putc('\n', fp); + ref += 60; + } + + if (verbose) + fprintf(samtools_stderr, "Dump ref %d len %"PRId64", coverage %.2f%%\n", + ref_id, ref_len, 100 - N*100.0 / ref_len); + + return 0; +} + +/* + * --------------------------------------------------------------------------- + * CRAM embedded reference method of reference construction + */ + +/* + * Extracts an embedded reference from a sorted CRAM file. + * Modelled on the CRAM container copy loop from bam_cat.c. + */ +static int cram2ref(samFile *in, sam_hdr_t *h, hts_idx_t *idx, char *reg, + FILE *outfp, int verbose) { + cram_fd *in_c; + cram_container *c = NULL; + cram_block *blk = NULL; + cram_block_slice_hdr *shdr = NULL; + + int curr_ref_id = -99; + char *ref = NULL; + uint64_t ref_len = 0; + + // We have no direct public API for seeking in CRAM to a specific + // location by genome coordinates. The sam_itr_query API is + // designed for fetching records, rather than seeks to specific + // file locations. + // + // TODO: consider exposing cram_range and cram_seek_to_refpos API. + // After a sam_index_load which will add the index to infp, these + // functions should seek direct to the start of a container. + // Or use cram_index *e =cram_index_query(cram, tid, beg, NULL); + // + // However, fortuitously(?) sam_itr_querys calls cram_seek_to_refpos + // so we can do a region query and let that do the initial seek. + // We still need to do our own end-range detection though. + + hts_itr_t *iter = NULL; + if (reg) { + iter = sam_itr_querys(idx, h, reg); + if (!iter) { + print_error("reference", "failed to parse region '%s'", reg); + goto err; + } + } + + in_c = in->fp.cram; // low level htslib abuse? + int eor = 0; + while (!eor && (c = cram_read_container(in_c))) { + if (cram_container_is_empty(in_c)) { + cram_block *blk; + // Container compression header + if (!(blk = cram_read_block(in_c))) + goto err; + cram_free_block(blk); + cram_free_container(c); + c = NULL; blk = NULL; + continue; + } + + // Container compression header; read and discard + int32_t num_slices; + if (!(blk = cram_read_block(in_c))) + goto err; + cram_free_block(blk); + blk = NULL; + + // Container num_blocks can be invalid, due to a bug. + // Instead we iterate in slice context instead. + (void)cram_container_get_landmarks(c, &num_slices); + int i, j; + for (i = 0; i < num_slices; i++) { + // Slice header + if (!(blk = cram_read_block(in_c))) + goto err; + if (!(shdr = cram_decode_slice_header(in_c, blk))) + goto err; + cram_free_block(blk); + blk = NULL; + + int num_blocks = cram_slice_hdr_get_num_blocks(shdr); + int embed_id = cram_slice_hdr_get_embed_ref_id(shdr); + int ref_id; + hts_pos_t ref_start, ref_span; + cram_slice_hdr_get_coords(shdr, &ref_id, &ref_start, &ref_span); + + if (iter) { + if (iter->tid != ref_id || ref_start > iter->end) { + // Beyond end of specified region. + cram_free_slice_header(shdr); + eor = 1; + break; + } + } + + if (embed_id < 0 && ref_id != -1) { + fprintf(samtools_stderr, "CRAM file has slice without embedded " + "reference\n"); + goto err; + } + + if (ref_id != curr_ref_id) { + if (curr_ref_id >= 0) { + if (dump_ref(h, iter, curr_ref_id, ref, ref_len, + outfp, verbose) < 0) + goto err; + } + + ref_len = sam_hdr_tid2len(h, ref_id); + if (ref_len) { + char *ref2 = realloc(ref, ref_len); + if (!ref2) + goto err; + else + ref = ref2; + memset(ref, 'N', ref_len); + } + curr_ref_id = ref_id; + } + + // Slice data blocks + for (j = 0; j < num_blocks; j++) { + // read and discard, unless it's the ref-ID block + if (!(blk = cram_read_block(in_c))) + goto err; + if (cram_block_get_content_id(blk) == embed_id) { + cram_uncompress_block(blk); + //printf("%.*s\n", blk->uncomp_size, blk->data); + + int32_t usize = cram_block_get_uncomp_size(blk); + int ref_end = ref_start + usize; + if (ref_end > ref_len+1) + ref_end = ref_len+1; + if (ref_end > ref_start) + memcpy(ref + ref_start-1, cram_block_get_data(blk), + ref_end - ref_start); + } + cram_free_block(blk); + blk = NULL; + } + cram_free_slice_header(shdr); + shdr = NULL; + } + + cram_free_container(c); + c = NULL; + } + + int ret = 0; + if (curr_ref_id >= 0) { + ret = dump_ref(h, iter, curr_ref_id, ref, ref_len, outfp, verbose); + } else if (reg) { + // no data present + // no data present, but we explicitly asked for the reference so + // report it still as Ns. + ref_len = MIN(iter->end, sam_hdr_tid2len(h, iter->tid)); + ref = malloc(ref_len); + memset(ref, 'N', ref_len); + if (!ref) + goto err; + ret = dump_ref(h, iter, iter->tid, ref, ref_len, outfp, verbose); + } + + free(ref); + if (iter) + hts_itr_destroy(iter); + + return ret; + + err: + free(ref); + if (blk) + cram_free_block(blk); + if (shdr) + cram_free_slice_header(shdr); + if (c) + cram_free_container(c); + if (iter) + hts_itr_destroy(iter); + + return -1; +} + +/* + * --------------------------------------------------------------------------- + * MD method of reference construction + */ + +// Returns the next cigar op code: one of the BAM_C* codes, +// or -1 if no more are present. +static inline +int next_cigar_op(uint32_t *cigar, int *ncigar, int *skip, int *spos, + uint32_t *cig_ind, uint32_t *cig_op, uint32_t *cig_len) { + for(;;) { + while (*cig_len == 0) { + if (*cig_ind < *ncigar) { + *cig_op = cigar[*cig_ind] & BAM_CIGAR_MASK; + *cig_len = cigar[*cig_ind] >> BAM_CIGAR_SHIFT; + (*cig_ind)++; + } else { + return -1; + } + } + + if (skip[*cig_op]) { + *spos += (bam_cigar_type(*cig_op)&1) * *cig_len; + *cig_len = 0; + continue; + } + + (*cig_len)--; + break; + } + + return *cig_op; +} + +// Converts a bam object with SEQ, POS/CIGAR and MD:Z to a reference. +// Updates ref[] array. +// +// Returns >0 on success, +// 0 on no-MD found, +// -1 on failure (eg inconsistent data) +static int build_ref(bam1_t *b, char *ref, size_t ref_len) { + uint8_t *seq = bam_get_seq(b); + uint32_t *cigar = bam_get_cigar(b); + int ncigar = b->core.n_cigar; + uint32_t cig_op = 0, cig_len = 0, cig_ind = 0; + + const uint8_t *MD = bam_aux_get(b, "MD"); + if (!MD || *MD != 'Z') + return 0; + MD++; + + // Walk through MD + seq to generate ref + int iseq = 0, iref = b->core.pos, next_op; + int cig_skip[16] = {0,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1}; + while (iseq < b->core.l_qseq && *MD) { + if (isdigit(*MD)) { + // match + int len = strtol((char *)MD, (char **)&MD, 10); + while (iseq < b->core.l_qseq && len) { + if ((next_op = next_cigar_op(cigar, &ncigar, cig_skip, + &iseq, &cig_ind, &cig_op, + &cig_len)) < 0) + return -1; + + if (next_op != BAM_CMATCH && + next_op != BAM_CEQUAL) { + print_error("MD2ref", + "MD:Z and CIGAR are incompatible"); + return -1; + } + + if (iref < ref_len) + ref[iref] = seq_nt16_str[bam_seqi(seq, iseq)]; + iseq++; + iref++; + len--; + } + } else if (*MD == '^') { + // deletion + MD++; + while (*MD && isalpha(*MD)) { + if ((next_op = next_cigar_op(cigar, &ncigar, cig_skip, + &iseq, &cig_ind, &cig_op, + &cig_len)) < 0) + return -1; + + if (next_op != BAM_CDEL) { + print_error("MD2ref", + "MD:Z and CIGAR are incompatible"); + return -1; + } + + if (iref < ref_len) + ref[iref] = *MD; + + MD++; + iref++; + } + } else { + // substitution + if ((next_op = next_cigar_op(cigar, &ncigar, cig_skip, + &iseq, &cig_ind, &cig_op, + &cig_len)) < 0) + return -1; + + if (next_op != BAM_CMATCH && next_op != BAM_CDIFF) { + print_error("MD2ref", "MD:Z and CIGAR are incompatible"); + return -1; + } + if (iref < ref_len) + ref[iref] = *MD; + + MD++; + iref++; + iseq++; + } + } + + return 1; +} + +static int MD2ref(samFile *in, sam_hdr_t *h, hts_idx_t *idx, char *reg, + FILE *outfp, int verbose) { + bam1_t *b = bam_init1(); + int r, last_tid = -99; + size_t ref_len = 0; + char *ref = NULL; + int ret = -1; + + hts_itr_t *iter = NULL; + if (idx && reg) { + iter = sam_itr_querys(idx, h, reg); + if (!iter) { + print_error("reference", "failed to parse region '%s'", reg); + goto err; + } + } + + while ((r = iter + ? sam_itr_next(in, iter, b) + : sam_read1(in, h, b)) >= 0) { + // check b->core.tid and flush old seq. + if (b->core.tid != last_tid) { + if (last_tid >= 0) + if (dump_ref(h, iter, last_tid, ref, ref_len, outfp, + verbose) < 0) + goto err; + + last_tid = b->core.tid; + ref_len = sam_hdr_tid2len(h, last_tid); + if (ref_len) { + char *ref2 = realloc(ref, ref_len); + if (!ref2) + goto err; + else + ref = ref2; + memset(ref, 'N', ref_len); + } + } + + if (build_ref(b, ref, ref_len) < 0) + goto err; + } + + if (last_tid >= 0) { + if (dump_ref(h, iter, last_tid, ref, ref_len, outfp, verbose) < 0) + goto err; + } else if (reg) { + // no data present, but we explicitly asked for the reference so + // report it still as Ns. + ref_len = MIN(iter->end, sam_hdr_tid2len(h, iter->tid)); + ref = malloc(ref_len); + memset(ref, 'N', ref_len); + if (!ref) + goto err; + if (dump_ref(h, iter, iter->tid, ref, ref_len, outfp, verbose) < 0) + goto err; + } + + if (r < -1) + goto err; + + ret = 0; + + err: + if (iter) + hts_itr_destroy(iter); + bam_destroy1(b); + free(ref); + return ret; +} + +int main_reference(int argc, char *argv[]) +{ + int c, usage = 0, verbose = 1, use_embedded = 0; + sam_hdr_t *h = 0; + samFile *in = NULL; + hts_idx_t *idx = NULL; + sam_global_args ga; + FILE *outfp = samtools_stdout; + char *reg = NULL; + + static const struct option lopts[] = { + {"output", required_argument, NULL, 'o'}, + {"quiet", no_argument, NULL, 'q'}, + {"embedded", no_argument, NULL, 'e'}, + {"region", required_argument, NULL, 'r'}, + SAM_OPT_GLOBAL_OPTIONS('-', '-', '-', '-', '-', '@'), + { NULL, 0, NULL, 0 } + }; + + sam_global_args_init(&ga); + + while ((c = getopt_long(argc, argv, "@:qo:er:", lopts, NULL)) >= 0) { + switch (c) { + case 'o': + if (!(outfp = fopen(optarg, "w"))) { + perror(optarg); + goto err; + } + break; + + case 'q': + verbose = 0; + break; + + case 'e': + use_embedded = 1; + break; + + case 'r': + reg = optarg; + break; + + default: + if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': usage=1; break; + } + } + + if ((optind == argc && isatty(0)) || usage) { + fprintf(samtools_stdout, "Usage: samtools reference [-@ N] [-r region] [-e] [-q] [-o out.fa] [in.cram]\n"); + return 0; + } + + char *fn = optind < argc ? argv[optind] : "-"; + if (!(in = sam_open(fn, "r"))) { + print_error_errno("reference", "failed to open file '%s'", fn); + return 1; + } + + if (ga.nthreads > 0) + hts_set_threads(in, ga.nthreads); + + if (!(h = sam_hdr_read(in))) + goto err; + + if (reg) { + idx = sam_index_load(in, fn); + if (!idx) { + print_error_errno("reference", "Failed to load the index"); + goto err; + } + } + + int ret = use_embedded + ? cram2ref(in, h, idx, reg, outfp, verbose) + : MD2ref(in, h, idx, reg, outfp, verbose); + + sam_hdr_destroy(h); + if (outfp != samtools_stdout) + fclose(outfp); + if (idx) + hts_idx_destroy(idx); + sam_close(in); + + return ret; + + err: + if (idx) + hts_idx_destroy(idx); + if (in) + sam_close(in); + if (h) + sam_hdr_destroy(h); + + return 1; +} diff --git a/samtools/sam_opts.c b/samtools/sam_opts.c new file mode 100644 index 0000000..6d146de --- /dev/null +++ b/samtools/sam_opts.c @@ -0,0 +1,194 @@ +/* sam_opts.c -- utilities to aid parsing common command line options. + + Copyright (C) 2015, 2019 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include "sam_opts.h" + +/* + * Processes a standard "global" samtools long option. + * + * The 'c' value is the return value from a getopt_long() call. It is checked + * against the lopt[] array to find the corresponding value as this may have + * been reassigned by the individual subcommand. + * + * Having found the entry, the corresponding long form is used to apply the + * option, storing the setting in sam_global_args *ga. + * + * Returns 0 on success, + * -1 on failure. + */ +int parse_sam_global_opt(int c, const char *optarg, const struct option *lopt, + sam_global_args *ga) { + int r = 0; + + while (lopt->name) { + if (c != lopt->val) { + lopt++; + continue; + } + + if (strcmp(lopt->name, "input-fmt") == 0) { + r = hts_parse_format(&ga->in, optarg); + break; + } else if (strcmp(lopt->name, "input-fmt-option") == 0) { + r = hts_opt_add((hts_opt **)&ga->in.specific, optarg); + break; + } else if (strcmp(lopt->name, "output-fmt") == 0) { + r = hts_parse_format(&ga->out, optarg); + break; + } else if (strcmp(lopt->name, "output-fmt-option") == 0) { + r = hts_opt_add((hts_opt **)&ga->out.specific, optarg); + break; + } else if (strcmp(lopt->name, "reference") == 0) { + char *ref = malloc(10 + strlen(optarg) + 1); + + if (!ref) { + fprintf(stderr, "Unable to allocate memory in " + "parse_sam_global_opt.\n"); + + return -1; + } + + sprintf(ref, "reference=%s", optarg); + + if (!(ga->reference = strdup(optarg))) { + fprintf(stderr, "Unable to allocate memory in " + "parse_sam_global_opt.\n"); + + return -1; + } + + r = hts_opt_add((hts_opt **)&ga->in.specific, ref); + r |= hts_opt_add((hts_opt **)&ga->out.specific, ref); + free(ref); + break; + } else if (strcmp(lopt->name, "threads") == 0) { + ga->nthreads = atoi(optarg); + break; + } else if (strcmp(lopt->name, "write-index") == 0) { + ga->write_index = 1; + break; + } else if (strcmp(lopt->name, "verbosity") == 0) { + hts_verbose = atoi(optarg); + break; + } + } + + if (!lopt->name) { + fprintf(stderr, "Unexpected global option.\n"); + return -1; + } + + /* + * SAM format with compression enabled implies SAM.bgzf + */ + if (ga->out.format == sam) { + hts_opt *opts = (hts_opt *)ga->out.specific; + while (opts) { + if (opts->opt == HTS_OPT_COMPRESSION_LEVEL) + ga->out.compression = bgzf; + opts = opts->next; + } + } + + return r; +} + +/* + * Report the usage for global options. + * + * This accepts a string with one character per SAM_OPT_GLOBAL_OPTIONS option + * to determine which options need to be printed and how. + * Each character should be one of: + * '.' No short option has been assigned. Use --long-opt only. + * '-' The long (and short) option has been disabled. + * Otherwise the short option is character . + */ +void sam_global_opt_help(FILE *fp, const char *shortopts) { + int i = 0; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS(0,0,0,0,0,0), + { NULL, 0, NULL, 0 } + }; + + for (i = 0; shortopts && shortopts[i] && lopts[i].name; i++) { + if (shortopts[i] == '-') + continue; + + if (shortopts[i] == '.') + fprintf(fp, " --"); + else + fprintf(fp, " -%c, --", shortopts[i]); + + if (strcmp(lopts[i].name, "input-fmt") == 0) + fprintf(fp,"input-fmt FORMAT[,OPT[=VAL]]...\n" + " Specify input format (SAM, BAM, CRAM)\n"); + else if (strcmp(lopts[i].name, "input-fmt-option") == 0) + fprintf(fp,"input-fmt-option OPT[=VAL]\n" + " Specify a single input file format option in the form\n" + " of OPTION or OPTION=VALUE\n"); + else if (strcmp(lopts[i].name, "output-fmt") == 0) + fprintf(fp,"output-fmt FORMAT[,OPT[=VAL]]...\n" + " Specify output format (SAM, BAM, CRAM)\n"); + else if (strcmp(lopts[i].name, "output-fmt-option") == 0) + fprintf(fp,"output-fmt-option OPT[=VAL]\n" + " Specify a single output file format option in the form\n" + " of OPTION or OPTION=VALUE\n"); + else if (strcmp(lopts[i].name, "reference") == 0) + fprintf(fp,"reference FILE\n" + " Reference sequence FASTA FILE [null]\n"); + else if (strcmp(lopts[i].name, "threads") == 0) + fprintf(fp,"threads INT\n" + " Number of additional threads to use [0]\n"); + else if (strcmp(lopts[i].name, "write-index") == 0) + fprintf(fp,"write-index\n" + " Automatically index the output files [off]\n"); + else if (strcmp(lopts[i].name, "verbosity") == 0) + fprintf(fp,"verbosity INT\n" + " Set level of verbosity\n"); + } +} + +void sam_global_args_init(sam_global_args *ga) { + if (!ga) + return; + + memset(ga, 0, sizeof(*ga)); +} + +void sam_global_args_free(sam_global_args *ga) { + if (ga->in.specific) + hts_opt_free(ga->in.specific); + + if (ga->out.specific) + hts_opt_free(ga->out.specific); + + if (ga->reference) + free(ga->reference); +} diff --git a/samtools/sam_opts.c.pysam.c b/samtools/sam_opts.c.pysam.c new file mode 100644 index 0000000..99bb169 --- /dev/null +++ b/samtools/sam_opts.c.pysam.c @@ -0,0 +1,196 @@ +#include "samtools.pysam.h" + +/* sam_opts.c -- utilities to aid parsing common command line options. + + Copyright (C) 2015, 2019 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include "sam_opts.h" + +/* + * Processes a standard "global" samtools long option. + * + * The 'c' value is the return value from a getopt_long() call. It is checked + * against the lopt[] array to find the corresponding value as this may have + * been reassigned by the individual subcommand. + * + * Having found the entry, the corresponding long form is used to apply the + * option, storing the setting in sam_global_args *ga. + * + * Returns 0 on success, + * -1 on failure. + */ +int parse_sam_global_opt(int c, const char *optarg, const struct option *lopt, + sam_global_args *ga) { + int r = 0; + + while (lopt->name) { + if (c != lopt->val) { + lopt++; + continue; + } + + if (strcmp(lopt->name, "input-fmt") == 0) { + r = hts_parse_format(&ga->in, optarg); + break; + } else if (strcmp(lopt->name, "input-fmt-option") == 0) { + r = hts_opt_add((hts_opt **)&ga->in.specific, optarg); + break; + } else if (strcmp(lopt->name, "output-fmt") == 0) { + r = hts_parse_format(&ga->out, optarg); + break; + } else if (strcmp(lopt->name, "output-fmt-option") == 0) { + r = hts_opt_add((hts_opt **)&ga->out.specific, optarg); + break; + } else if (strcmp(lopt->name, "reference") == 0) { + char *ref = malloc(10 + strlen(optarg) + 1); + + if (!ref) { + fprintf(samtools_stderr, "Unable to allocate memory in " + "parse_sam_global_opt.\n"); + + return -1; + } + + sprintf(ref, "reference=%s", optarg); + + if (!(ga->reference = strdup(optarg))) { + fprintf(samtools_stderr, "Unable to allocate memory in " + "parse_sam_global_opt.\n"); + + return -1; + } + + r = hts_opt_add((hts_opt **)&ga->in.specific, ref); + r |= hts_opt_add((hts_opt **)&ga->out.specific, ref); + free(ref); + break; + } else if (strcmp(lopt->name, "threads") == 0) { + ga->nthreads = atoi(optarg); + break; + } else if (strcmp(lopt->name, "write-index") == 0) { + ga->write_index = 1; + break; + } else if (strcmp(lopt->name, "verbosity") == 0) { + hts_verbose = atoi(optarg); + break; + } + } + + if (!lopt->name) { + fprintf(samtools_stderr, "Unexpected global option.\n"); + return -1; + } + + /* + * SAM format with compression enabled implies SAM.bgzf + */ + if (ga->out.format == sam) { + hts_opt *opts = (hts_opt *)ga->out.specific; + while (opts) { + if (opts->opt == HTS_OPT_COMPRESSION_LEVEL) + ga->out.compression = bgzf; + opts = opts->next; + } + } + + return r; +} + +/* + * Report the usage for global options. + * + * This accepts a string with one character per SAM_OPT_GLOBAL_OPTIONS option + * to determine which options need to be printed and how. + * Each character should be one of: + * '.' No short option has been assigned. Use --long-opt only. + * '-' The long (and short) option has been disabled. + * Otherwise the short option is character . + */ +void sam_global_opt_help(FILE *fp, const char *shortopts) { + int i = 0; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS(0,0,0,0,0,0), + { NULL, 0, NULL, 0 } + }; + + for (i = 0; shortopts && shortopts[i] && lopts[i].name; i++) { + if (shortopts[i] == '-') + continue; + + if (shortopts[i] == '.') + fprintf(fp, " --"); + else + fprintf(fp, " -%c, --", shortopts[i]); + + if (strcmp(lopts[i].name, "input-fmt") == 0) + fprintf(fp,"input-fmt FORMAT[,OPT[=VAL]]...\n" + " Specify input format (SAM, BAM, CRAM)\n"); + else if (strcmp(lopts[i].name, "input-fmt-option") == 0) + fprintf(fp,"input-fmt-option OPT[=VAL]\n" + " Specify a single input file format option in the form\n" + " of OPTION or OPTION=VALUE\n"); + else if (strcmp(lopts[i].name, "output-fmt") == 0) + fprintf(fp,"output-fmt FORMAT[,OPT[=VAL]]...\n" + " Specify output format (SAM, BAM, CRAM)\n"); + else if (strcmp(lopts[i].name, "output-fmt-option") == 0) + fprintf(fp,"output-fmt-option OPT[=VAL]\n" + " Specify a single output file format option in the form\n" + " of OPTION or OPTION=VALUE\n"); + else if (strcmp(lopts[i].name, "reference") == 0) + fprintf(fp,"reference FILE\n" + " Reference sequence FASTA FILE [null]\n"); + else if (strcmp(lopts[i].name, "threads") == 0) + fprintf(fp,"threads INT\n" + " Number of additional threads to use [0]\n"); + else if (strcmp(lopts[i].name, "write-index") == 0) + fprintf(fp,"write-index\n" + " Automatically index the output files [off]\n"); + else if (strcmp(lopts[i].name, "verbosity") == 0) + fprintf(fp,"verbosity INT\n" + " Set level of verbosity\n"); + } +} + +void sam_global_args_init(sam_global_args *ga) { + if (!ga) + return; + + memset(ga, 0, sizeof(*ga)); +} + +void sam_global_args_free(sam_global_args *ga) { + if (ga->in.specific) + hts_opt_free(ga->in.specific); + + if (ga->out.specific) + hts_opt_free(ga->out.specific); + + if (ga->reference) + free(ga->reference); +} diff --git a/samtools/sam_opts.h b/samtools/sam_opts.h new file mode 100644 index 0000000..7543c33 --- /dev/null +++ b/samtools/sam_opts.h @@ -0,0 +1,104 @@ +/* sam_opts.h -- utilities to aid parsing common command line options. + + Copyright (C) 2015, 2019 Genome Research Ltd. + + Author: James Bonfield + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef SAM_OPTS_H +#define SAM_OPTS_H + +#include +#include +#include +#include + +typedef struct sam_global_args { + htsFormat in; + htsFormat out; + char *reference; + int nthreads; + int write_index; +} sam_global_args; + +#define SAM_GLOBAL_ARGS_INIT {{0},{0}} + +enum { + SAM_OPT_INPUT_FMT = CHAR_MAX+1, + SAM_OPT_INPUT_FMT_OPTION, + SAM_OPT_OUTPUT_FMT, + SAM_OPT_OUTPUT_FMT_OPTION, + SAM_OPT_REFERENCE, + SAM_OPT_NTHREADS, + SAM_OPT_WRITE_INDEX, + SAM_OPT_VERBOSITY, +}; + +#define SAM_OPT_VAL(val, defval) ((val) == '-')? '?' : (val)? (val) : (defval) + +// Use this within struct option lopts[] = {...} to add the standard global +// options. The arguments determine whether the corresponding option is +// enabled and, if so, whether it has a short option equivalent: +// 0 No short option has been assigned. Use --long-opt only. +// '-' Both long and short options are disabled. +// Otherwise the equivalent short option is character . +#define SAM_OPT_GLOBAL_OPTIONS(o1, o2, o3, o4, o5, o6) \ + {"input-fmt", required_argument, NULL, SAM_OPT_VAL(o1, SAM_OPT_INPUT_FMT)}, \ + {"input-fmt-option", required_argument, NULL, SAM_OPT_VAL(o2, SAM_OPT_INPUT_FMT_OPTION)}, \ + {"output-fmt", required_argument, NULL, SAM_OPT_VAL(o3, SAM_OPT_OUTPUT_FMT)}, \ + {"output-fmt-option", required_argument, NULL, SAM_OPT_VAL(o4, SAM_OPT_OUTPUT_FMT_OPTION)}, \ + {"reference", required_argument, NULL, SAM_OPT_VAL(o5, SAM_OPT_REFERENCE)}, \ + {"threads", required_argument, NULL, SAM_OPT_VAL(o6, SAM_OPT_NTHREADS)}, \ + {"write-index", no_argument, NULL, SAM_OPT_WRITE_INDEX}, \ + {"verbosity", required_argument, NULL, SAM_OPT_VERBOSITY} + +/* + * Processes a standard "global" samtools long option. + * + * The 'c' value is the return value from a getopt_long() call. It is checked + * against the lopt[] array to find the corresponding value as this may have + * been reassigned by the individual subcommand. + * + * Having found the entry, the corresponding long form is used to apply the + * option, storing the setting in sam_global_args *ga. + * + * Returns 0 on success, + * -1 on failure. + */ +int parse_sam_global_opt(int c, const char *optarg, const struct option *lopt, + sam_global_args *ga); + +/* + * Report the usage for global options. + * + * This accepts a string with one character per SAM_OPT_GLOBAL_OPTIONS option + * to determine which options need to be printed and how. + * Each character should be one of: + * '.' No short option has been assigned. Use --long-opt only. + * '-' The long (and short) option has been disabled. + * Otherwise the short option is character . + */ +void sam_global_opt_help(FILE *fp, const char *shortopts); + + +void sam_global_args_init(sam_global_args *ga); +void sam_global_args_free(sam_global_args *ga); + +#endif diff --git a/samtools/sam_utils.c b/samtools/sam_utils.c new file mode 100644 index 0000000..f105687 --- /dev/null +++ b/samtools/sam_utils.c @@ -0,0 +1,151 @@ +/* sam_utils.c -- various utilities internal to samtools. + + Copyright (C) 2014-2016, 2018, 2019 Genome Research Ltd. + + Author: John Marshall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include + +#include +#include +#include +#include + +#include "samtools.h" + +static htsFile *samtools_stdout = NULL; + +void autoflush_if_stdout(htsFile *fp, const char *fname) { + if (fname == NULL || strcmp(fname, "-") == 0) samtools_stdout = fp; +} + +void release_autoflush(htsFile *fp) { + if (samtools_stdout == fp) samtools_stdout = NULL; +} + +static void vprint_error_core(const char *subcommand, const char *format, va_list args, const char *extra) +{ + fflush(stdout); + if (samtools_stdout) hts_flush(samtools_stdout); + + if (subcommand && *subcommand) fprintf(stderr, "samtools %s: ", subcommand); + else fprintf(stderr, "samtools: "); + vfprintf(stderr, format, args); + if (extra) fprintf(stderr, ": %s\n", extra); + else fprintf(stderr, "\n"); + fflush(stderr); +} + +void print_error(const char *subcommand, const char *format, ...) +{ + va_list args; + va_start(args, format); + vprint_error_core(subcommand, format, args, NULL); + va_end(args); +} + +void print_error_errno(const char *subcommand, const char *format, ...) +{ + int err = errno; + va_list args; + va_start(args, format); + vprint_error_core(subcommand, format, args, err? strerror(err) : NULL); + va_end(args); +} + +void check_sam_close(const char *subcmd, samFile *fp, const char *fname, const char *null_fname, int *retp) +{ + release_autoflush(fp); + int r = sam_close(fp); + if (r >= 0) return; + + // TODO Need error infrastructure so we can print a message instead of r + if (fname) print_error(subcmd, "error closing \"%s\": %d", fname, r); + else print_error(subcmd, "error closing %s: %d", null_fname, r); + + *retp = EXIT_FAILURE; +} + +/* Pick an index suffix based on the output file descriptor type. */ +static char *idx_suffix(htsFile *fp) { + switch (fp->format.format) { + case sam: + case bam: + // Tough cheese if you wanted bai! + // New feature => mandatory new index too, for simplicity of CLI. + return "csi"; + + case cram: + return "crai"; + + default: + return NULL; + } +} + +/* + * Utility function to add an index to a file we've opened for write. + * NB: Call this after writing the header and before writing sequences. + * + * The returned index filename should be freed by the caller, but only + * after sam_idx_save has been called. + * + * Returns index filename on success, + * NULL on failure. + */ +char *auto_index(htsFile *fp, const char *fn, bam_hdr_t *header) { + char *fn_idx; + int min_shift = 14; /* CSI */ + if (!fn || !*fn || strcmp(fn, "-") == 0) + return NULL; + + char *delim = strstr(fn, HTS_IDX_DELIM); + if (delim != NULL) { + delim += strlen(HTS_IDX_DELIM); + + fn_idx = strdup(delim); + if (!fn_idx) + return NULL; + + size_t l = strlen(fn_idx); + if (l >= 4 && strcmp(fn_idx + l - 4, ".bai") == 0) + min_shift = 0; + } else { + char *suffix = idx_suffix(fp); + if (!suffix) + return NULL; + + fn_idx = malloc(strlen(fn)+6); + if (!fn_idx) + return NULL; + + sprintf(fn_idx, "%s.%s", fn, suffix); + } + + if (sam_idx_init(fp, header, min_shift, fn_idx) < 0) { + print_error_errno("auto_index", "failed to open index \"%s\" for writing", fn_idx); + free(fn_idx); + return NULL; + } + + return fn_idx; +} diff --git a/samtools/sam_utils.c.pysam.c b/samtools/sam_utils.c.pysam.c new file mode 100644 index 0000000..a5f08a9 --- /dev/null +++ b/samtools/sam_utils.c.pysam.c @@ -0,0 +1,153 @@ +#include "samtools.pysam.h" + +/* sam_utils.c -- various utilities internal to samtools. + + Copyright (C) 2014-2016, 2018, 2019 Genome Research Ltd. + + Author: John Marshall + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include + +#include +#include +#include +#include + +#include "samtools.h" + +static htsFile *samtools_stdout_internal = NULL; + +void autoflush_if_stdout(htsFile *fp, const char *fname) { + if (fname == NULL || strcmp(fname, "-") == 0) samtools_stdout_internal = fp; +} + +void release_autoflush(htsFile *fp) { + if (samtools_stdout_internal == fp) samtools_stdout_internal = NULL; +} + +static void vprint_error_core(const char *subcommand, const char *format, va_list args, const char *extra) +{ + fflush(samtools_stdout); + if (samtools_stdout_internal) hts_flush(samtools_stdout_internal); + + if (subcommand && *subcommand) fprintf(samtools_stderr, "samtools %s: ", subcommand); + else fprintf(samtools_stderr, "samtools: "); + vfprintf(samtools_stderr, format, args); + if (extra) fprintf(samtools_stderr, ": %s\n", extra); + else fprintf(samtools_stderr, "\n"); + fflush(samtools_stderr); +} + +void print_error(const char *subcommand, const char *format, ...) +{ + va_list args; + va_start(args, format); + vprint_error_core(subcommand, format, args, NULL); + va_end(args); +} + +void print_error_errno(const char *subcommand, const char *format, ...) +{ + int err = errno; + va_list args; + va_start(args, format); + vprint_error_core(subcommand, format, args, err? strerror(err) : NULL); + va_end(args); +} + +void check_sam_close(const char *subcmd, samFile *fp, const char *fname, const char *null_fname, int *retp) +{ + release_autoflush(fp); + int r = sam_close(fp); + if (r >= 0) return; + + // TODO Need error infrastructure so we can print a message instead of r + if (fname) print_error(subcmd, "error closing \"%s\": %d", fname, r); + else print_error(subcmd, "error closing %s: %d", null_fname, r); + + *retp = EXIT_FAILURE; +} + +/* Pick an index suffix based on the output file descriptor type. */ +static char *idx_suffix(htsFile *fp) { + switch (fp->format.format) { + case sam: + case bam: + // Tough cheese if you wanted bai! + // New feature => mandatory new index too, for simplicity of CLI. + return "csi"; + + case cram: + return "crai"; + + default: + return NULL; + } +} + +/* + * Utility function to add an index to a file we've opened for write. + * NB: Call this after writing the header and before writing sequences. + * + * The returned index filename should be freed by the caller, but only + * after sam_idx_save has been called. + * + * Returns index filename on success, + * NULL on failure. + */ +char *auto_index(htsFile *fp, const char *fn, bam_hdr_t *header) { + char *fn_idx; + int min_shift = 14; /* CSI */ + if (!fn || !*fn || strcmp(fn, "-") == 0) + return NULL; + + char *delim = strstr(fn, HTS_IDX_DELIM); + if (delim != NULL) { + delim += strlen(HTS_IDX_DELIM); + + fn_idx = strdup(delim); + if (!fn_idx) + return NULL; + + size_t l = strlen(fn_idx); + if (l >= 4 && strcmp(fn_idx + l - 4, ".bai") == 0) + min_shift = 0; + } else { + char *suffix = idx_suffix(fp); + if (!suffix) + return NULL; + + fn_idx = malloc(strlen(fn)+6); + if (!fn_idx) + return NULL; + + sprintf(fn_idx, "%s.%s", fn, suffix); + } + + if (sam_idx_init(fp, header, min_shift, fn_idx) < 0) { + print_error_errno("auto_index", "failed to open index \"%s\" for writing", fn_idx); + free(fn_idx); + return NULL; + } + + return fn_idx; +} diff --git a/samtools/sam_view.c b/samtools/sam_view.c new file mode 100644 index 0000000..d60d8f7 --- /dev/null +++ b/samtools/sam_view.c @@ -0,0 +1,1596 @@ +/* sam_view.c -- SAM<->BAM<->CRAM conversion. + + Copyright (C) 2009-2022 Genome Research Ltd. + Portions copyright (C) 2009, 2011, 2012 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "htslib/sam.h" +#include "htslib/faidx.h" +#include "htslib/khash.h" +#include "htslib/kstring.h" +#include "htslib/thread_pool.h" +#include "htslib/hts_expr.h" +#include "samtools.h" +#include "sam_opts.h" +#include "bam.h" // for bam_get_library and bam_remove_B +#include "bedidx.h" + +KHASH_SET_INIT_STR(str) +typedef khash_t(str) *strhash_t; + +KHASH_SET_INIT_INT(aux_exists) +typedef khash_t(aux_exists) *auxhash_t; + +// This structure contains the settings for a samview run +typedef struct samview_settings { + strhash_t rghash; + strhash_t rnhash; + strhash_t tvhash; + int min_mapQ; + + // Described here in the same terms as the usage statement. + // The code however always negates to "reject if" keep if: + int flag_on; // keep if (FLAG & N) == N (all on) + int flag_off; // keep if (FLAG & N) == 0 (all off) + int flag_anyon; // keep if (FLAG & N) != 0 (any on) + int flag_alloff; // reject if (FLAG & N) == N (any off) + + int min_qlen; + int remove_B; + uint32_t subsam_seed; + double subsam_frac; + char* library; + void* bed; + size_t remove_aux_len; + char** remove_aux; + int multi_region; + char* tag; + hts_filter_t *filter; + int remove_flag; + int add_flag; + int unmap; + auxhash_t remove_tag; + auxhash_t keep_tag; + + hts_idx_t *hts_idx; + sam_hdr_t *header; + samFile *in, *out, *un_out; + int64_t count; + int is_count; + char *fn_in, *fn_idx_in, *fn_out, *fn_fai, *fn_un_out, *fn_out_idx, *fn_un_out_idx; + int fetch_pairs, nreglist; + hts_reglist_t *reglist; +} samview_settings_t; + +// Copied from htslib/sam.c. +// TODO: we need a proper interface to find the length of an aux tag, +// or at the very make exportable versions of these in htslib. +static inline int aux_type2size(uint8_t type) +{ + switch (type) { + case 'A': case 'c': case 'C': + return 1; + case 's': case 'S': + return 2; + case 'i': case 'I': case 'f': + return 4; + case 'd': + return 8; + case 'Z': case 'H': case 'B': + return type; + default: + return 0; + } +} + +// Copied from htslib/sam.c. +static inline uint8_t *skip_aux(uint8_t *s, uint8_t *end) +{ + int size; + uint32_t n; + if (s >= end) return end; + size = aux_type2size(*s); ++s; // skip type + switch (size) { + case 'Z': + case 'H': + while (s < end && *s) ++s; + return s < end ? s + 1 : end; + case 'B': + if (end - s < 5) return NULL; + size = aux_type2size(*s); ++s; + n = le_to_u32(s); + s += 4; + if (size == 0 || end - s < size * n) return NULL; + return s + size * n; + case 0: + return NULL; + default: + if (end - s < size) return NULL; + return s + size; + } +} + +// Returns 0 to indicate read should be output 1 otherwise +static int process_aln(const sam_hdr_t *h, bam1_t *b, samview_settings_t* settings) +{ + if (settings->filter && sam_passes_filter(h, b, settings->filter) < 1) + return 1; + + if (settings->remove_B) bam_remove_B(b); + if (settings->min_qlen > 0) { + int k, qlen = 0; + uint32_t *cigar = bam_get_cigar(b); + for (k = 0; k < b->core.n_cigar; ++k) + if ((bam_cigar_type(bam_cigar_op(cigar[k]))&1) || bam_cigar_op(cigar[k]) == BAM_CHARD_CLIP) + qlen += bam_cigar_oplen(cigar[k]); + if (qlen < settings->min_qlen) return 1; + } + if (b->core.qual < settings->min_mapQ || ((b->core.flag & settings->flag_on) != settings->flag_on) || (b->core.flag & settings->flag_off)) + return 1; + if (settings->flag_alloff && ((b->core.flag & settings->flag_alloff) == settings->flag_alloff)) + return 1; + if (settings->flag_anyon && ((b->core.flag & settings->flag_anyon) == 0)) + return 1; + if (!settings->multi_region && settings->bed && (b->core.tid < 0 || !bed_overlap(settings->bed, sam_hdr_tid2name(h, b->core.tid), b->core.pos, bam_endpos(b)))) + return 1; + if (settings->subsam_frac > 0.) { + uint32_t k = __ac_Wang_hash(__ac_X31_hash_string(bam_get_qname(b)) ^ settings->subsam_seed); + if ((double)(k&0xffffff) / 0x1000000 >= settings->subsam_frac) return 1; + } + if (settings->rghash) { + uint8_t *s = bam_aux_get(b, "RG"); + if (s) { + khint_t k = kh_get(str, settings->rghash, (char*)(s + 1)); + if (k == kh_end(settings->rghash)) return 1; + } + } + if (settings->tag) { + uint8_t *s = bam_aux_get(b, settings->tag); + if (s) { + if (settings->tvhash) { + char t[32], *val; + if (*s == 'i' || *s == 'I' || *s == 's' || *s == 'S' || *s == 'c' || *s == 'C') { + int ret = snprintf(t, 32, "%"PRId64, bam_aux2i(s)); + if (ret > 0) val = t; + else return 1; + } else if (*s == 'A') { + t[0] = *(s+1); + t[1] = 0; + val = t; + } else { + val = (char *)(s+1); + } + khint_t k = kh_get(str, settings->tvhash, val); + if (k == kh_end(settings->tvhash)) return 1; + } + } else { + return 1; + } + } + if (settings->rnhash) { + const char* rn = bam_get_qname(b); + if (!rn || kh_get(str, settings->rnhash, rn) == kh_end(settings->rnhash)) { + return 1; + } + } + if (settings->library) { + const char *p = bam_get_library((sam_hdr_t*)h, b); + if (!p || strcmp(p, settings->library) != 0) return 1; + } + return 0; +} + +static int adjust_tags(const sam_hdr_t *h, bam1_t *b, + samview_settings_t* settings) { + if (settings->keep_tag) { + uint8_t *s_from, *s_to, *end = b->data + b->l_data; + auxhash_t h = settings->keep_tag; + + s_from = s_to = bam_get_aux(b); + while (s_from < end) { + int x = (int)s_from[0]<<8 | s_from[1]; + uint8_t *s = skip_aux(s_from+2, end); + if (s == NULL) { + print_error("view", "malformed aux data for record \"%s\"", + bam_get_qname(b)); + return -1; + } + + if (kh_get(aux_exists, h, x) != kh_end(h) ) { + if (s_to != s_from) memmove(s_to, s_from, s - s_from); + s_to += s - s_from; + } + s_from = s; + } + b->l_data = s_to - b->data; + + } else if (settings->remove_tag) { + uint8_t *s_from, *s_to, *end = b->data + b->l_data; + auxhash_t h = settings->remove_tag; + + s_from = s_to = bam_get_aux(b); + while (s_from < end) { + int x = (int)s_from[0]<<8 | s_from[1]; + uint8_t *s = skip_aux(s_from+2, end); + if (s == NULL) { + print_error("view", "malformed aux data for record \"%s\"", + bam_get_qname(b)); + return -1; + } + + if (kh_get(aux_exists, h, x) == kh_end(h) ) { + if (s_to != s_from) memmove(s_to, s_from, s - s_from); + s_to += s - s_from; + } + s_from = s; + } + b->l_data = s_to - b->data; + } + + return 0; +} + +static int usage(FILE *fp, int exit_status, int is_long_help); + +static int populate_lookup_from_file(const char *subcmd, strhash_t lookup, char *fn) +{ + FILE *fp; + char buf[1024]; + int ret = 0; + fp = fopen(fn, "r"); + if (fp == NULL) { + print_error_errno(subcmd, "failed to open \"%s\" for reading", fn); + return -1; + } + + while (ret != -1 && !feof(fp) && fscanf(fp, "%1023s", buf) > 0) { + char *d = strdup(buf); + if (d != NULL) { + kh_put(str, lookup, d, &ret); + if (ret == 0) free(d); /* Duplicate */ + } else { + ret = -1; + } + } + if (ferror(fp)) ret = -1; + if (ret == -1) { + print_error_errno(subcmd, "failed to read \"%s\"", fn); + } + fclose(fp); + return (ret != -1) ? 0 : -1; +} + +static int add_read_group_single(const char *subcmd, samview_settings_t *settings, char *name) +{ + char *d = strdup(name); + int ret = 0; + + if (d == NULL) goto err; + + if (settings->rghash == NULL) { + settings->rghash = kh_init(str); + if (settings->rghash == NULL) goto err; + } + + kh_put(str, settings->rghash, d, &ret); + if (ret == -1) goto err; + if (ret == 0) free(d); /* Duplicate */ + return 0; + + err: + print_error(subcmd, "Couldn't add \"%s\" to read group list: memory exhausted?", name); + free(d); + return -1; +} + +static int add_read_names_file(const char *subcmd, samview_settings_t *settings, char *fn) +{ + if (settings->rnhash == NULL) { + settings->rnhash = kh_init(str); + if (settings->rnhash == NULL) { + perror(NULL); + return -1; + } + } + return populate_lookup_from_file(subcmd, settings->rnhash, fn); +} + +static int add_read_groups_file(const char *subcmd, samview_settings_t *settings, char *fn) +{ + if (settings->rghash == NULL) { + settings->rghash = kh_init(str); + if (settings->rghash == NULL) { + perror(NULL); + return -1; + } + } + return populate_lookup_from_file(subcmd, settings->rghash, fn); +} + +static int add_tag_value_single(const char *subcmd, samview_settings_t *settings, char *name) +{ + char *d = strdup(name); + int ret = 0; + + if (d == NULL) goto err; + + if (settings->tvhash == NULL) { + settings->tvhash = kh_init(str); + if (settings->tvhash == NULL) goto err; + } + + kh_put(str, settings->tvhash, d, &ret); + if (ret == -1) goto err; + if (ret == 0) free(d); /* Duplicate */ + return 0; + + err: + print_error(subcmd, "Couldn't add \"%s\" to tag values list: memory exhausted?", name); + free(d); + return -1; +} + +static int add_tag_values_file(const char *subcmd, samview_settings_t *settings, char *fn) +{ + if (settings->tvhash == NULL) { + settings->tvhash = kh_init(str); + if (settings->tvhash == NULL) { + perror(NULL); + return -1; + } + } + return populate_lookup_from_file(subcmd, settings->tvhash, fn); +} + +static inline int check_sam_write1(samFile *fp, const sam_hdr_t *h, const bam1_t *b, const char *fname, int *retp) +{ + int r = sam_write1(fp, h, b); + if (r >= 0) return r; + + if (fname) print_error_errno("view", "writing to \"%s\" failed", fname); + else print_error_errno("view", "writing to standard output failed"); + + *retp = EXIT_FAILURE; + return r; +} + +static inline void change_flag(bam1_t *b, samview_settings_t *settings) +{ + if (settings->add_flag) + b->core.flag |= settings->add_flag; + + if (settings->remove_flag) + b->core.flag &= ~settings->remove_flag; +} + +int parse_aux_list(auxhash_t *h, char *optarg) { + if (!*h) + *h = kh_init(aux_exists); + + while (strlen(optarg) >= 2) { + int x = optarg[0]<<8 | optarg[1]; + int ret = 0; + kh_put(aux_exists, *h, x, &ret); + if (ret < 0) + return -1; + + optarg += 2; + if (*optarg == ',') // allow white-space too for easy `cat file`? + optarg++; + else if (*optarg != 0) + break; + } + + if (strlen(optarg) != 0) { + fprintf(stderr, "main_samview: Error parsing option, " + "auxiliary tags should be exactly two characters long.\n"); + return -1; + } + + return 0; +} + +static int cmp_reglist_intervals(const void *aptr, const void *bptr) +{ + hts_pair_pos_t *a = (hts_pair_pos_t*)aptr; + hts_pair_pos_t *b = (hts_pair_pos_t*)bptr; + if ( a->beg < b->beg ) return -1; + if ( a->beg > b->beg ) return 1; + if ( a->end < b->end ) return -1; + if ( a->end > b->end ) return 1; + return 0; +} +static int cmp_reglist_tids(const void *aptr, const void *bptr) +{ + hts_reglist_t *a = (hts_reglist_t*)aptr; + hts_reglist_t *b = (hts_reglist_t*)bptr; + if ( b->tid==HTS_IDX_NOCOOR || a->tid < b->tid ) return -1; + if ( a->tid==HTS_IDX_NOCOOR || a->tid > b->tid ) return 1; + return 0; +} + +static hts_reglist_t *_reglist_dup(sam_hdr_t *hdr, hts_reglist_t *src, int nsrc) +{ + int i,j; + hts_reglist_t *dst = (hts_reglist_t*)calloc(nsrc,sizeof(hts_reglist_t)); + if ( !dst ) { + print_error_errno("view", "[%s:%d] could not allocate region list" + ,__FILE__ ,__LINE__); + return NULL; + } + for (i=0; i tid ) imax = i - 1; + else break; + } + if ( i<0 || reg[i].tid < tid ) i++; // not found, i will be the index of the inserted element + return i; +} +static int _reglist_push(hts_reglist_t **_reg, int *_nreg, int tid, hts_pos_t beg, hts_pos_t end) +{ + hts_reglist_t *reg = *_reg; + int nreg = *_nreg; + int i = _reglist_find_tid(reg,nreg,tid); + if ( i>=nreg || reg[i].tid!=tid ) { + nreg++; + reg = (hts_reglist_t*)realloc(reg,sizeof(hts_reglist_t)*nreg); + if ( !reg ) { + print_error_errno("view", "[%s:%d] could not extend region list", + __FILE__, __LINE__); + return -1; + } + if ( i+1 < nreg ) + memmove(reg + i + 1, reg + i, sizeof(hts_reglist_t)*(nreg - i - 1)); + reg[i].reg = NULL; + reg[i].tid = tid; + reg[i].min_beg = beg; + reg[i].max_end = end; + reg[i].intervals = NULL; + reg[i].count = 0; + } + *_reg = reg; + *_nreg = nreg; + if ( reg[i].count > 0 + && reg[i].intervals[reg[i].count - 1].beg==beg + && reg[i].intervals[reg[i].count - 1].end==end ) { + return 0; + } + hts_pair_pos_t *new_intervals = realloc(reg[i].intervals, sizeof(hts_pair_pos_t)*(reg[i].count + 1)); + if (!new_intervals) { + print_error_errno("view", "[%s:%d] could not extend region list", + __FILE__, __LINE__); + return -1; + } + reg[i].intervals = new_intervals; + reg[i].intervals[reg[i].count].beg = beg; + reg[i].intervals[reg[i].count].end = end; + reg[i].count++; + return 0; +} + +static void _reglist_merge(hts_reglist_t *reg, int nreg) +{ + int i,j; + for (i=0; ibed = bed_hash_regions(conf->bed, regs, 0, nregs, &filter_op); // insert(1) or filter out(0) the regions from the command line in the same hash table as the bed file + if ( !filter_op ) + filter_state = FILTERED; + } + else + bed_unify(conf->bed); + if ( !conf->bed) { // index is unavailable or no regions have been specified + print_error("view", "No regions or BED file have been provided. Aborting."); + return NULL; + } + + int regcount = 0; + hts_reglist_t *reglist = bed_reglist(conf->bed, filter_state, ®count); + if (!reglist) { + print_error("view", "Region list is empty or could not be created. Aborting."); + return NULL; + } + + if ( conf->fetch_pairs ) { + conf->reglist = _reglist_dup(conf->header,reglist,regcount); + if (!conf->reglist) + return NULL; + conf->nreglist = regcount; + } + + iter = sam_itr_regions(conf->hts_idx, conf->header, reglist, regcount); + if ( !iter ) { + print_error("view", "Iterator could not be created. Aborting."); + return NULL; + } + return iter; +} + +KHASH_SET_INIT_STR(names) + +static int fetch_pairs_collect_mates(samview_settings_t *conf, hts_itr_multi_t *iter) +{ + khint_t k; + int nunmap = 0, r = 0, nmates = 0, write_error = 0, retval = EXIT_FAILURE; + kh_names_t *mate_names = kh_init(names); + bam1_t *rec = bam_init1(); + + if (!mate_names) { + print_error_errno("view", "could not allocate mate names table"); + goto out; + } + if (!rec) { + print_error_errno("view", "could not allocate bam record"); + goto out; + } + + while ((r =sam_itr_multi_next(conf->in, iter, rec))>=0) { + if ( (rec->core.flag & BAM_FPAIRED) == 0 ) continue; + if ( rec->core.mtid>=0 && bed_overlap(conf->bed, sam_hdr_tid2name(conf->header,rec->core.mtid), rec->core.mpos, rec->core.mpos) ) continue; + if ( process_aln(conf->header, rec, conf) ) continue; + + nmates++; + + k = kh_get(names,mate_names,bam_get_qname(rec)); + if ( k == kh_end(mate_names) ) { + int ret = 0; + char *name_copy = strdup(bam_get_qname(rec)); + if (!name_copy) { + print_error_errno("view", "[%s:%d] could not store sample name, %d elements", __FILE__,__LINE__,nmates); + goto out; + } + kh_put(names, mate_names, name_copy, &ret); + if ( ret<0 ) { + print_error_errno("view", "[%s:%d] could not store sample name, %d elements",__FILE__,__LINE__,nmates); + free(name_copy); + goto out; + } + } + + if ( rec->core.mtid < 0 || (rec->core.flag & BAM_FMUNMAP) ) nunmap = 1; + if ( rec->core.mtid >= 0 ) { + if (_reglist_push(&conf->reglist, &conf->nreglist, rec->core.mtid, rec->core.mpos,rec->core.mpos+1) != 0) + goto out; + } + } + + if (r < -1) { + print_error_errno("view", "error reading file \"%s\"", conf->fn_in); + goto out; + } + + _reglist_merge(conf->reglist, conf->nreglist); + if ( nunmap ) { + if (_reglist_push(&conf->reglist,&conf->nreglist,HTS_IDX_NOCOOR,0,HTS_POS_MAX) != 0) + goto out; + } + hts_itr_multi_destroy(iter); + iter = sam_itr_regions(conf->hts_idx, conf->header, conf->reglist, conf->nreglist); + if ( !iter ) { + print_error_errno("view", "[%s:%d] iterator could not be created",__FILE__,__LINE__); + goto out; + } + while ((r = sam_itr_multi_next(conf->in, iter, rec))>=0) { + int drop = 1; + if (rec->core.tid >=0 && + bed_overlap(conf->bed, sam_hdr_tid2name(conf->header,rec->core.tid), rec->core.pos, bam_endpos(rec))) drop = 0; + if ( drop ) { + k = kh_get(names,mate_names,bam_get_qname(rec)); + if ( k != kh_end(mate_names) ) drop = 0; + } + if (!drop && process_aln(conf->header, rec, conf) == 0) { + if (adjust_tags(conf->header, rec, conf) != 0) + goto out; + if (check_sam_write1(conf->out, conf->header, rec, conf->fn_out, + &write_error) < 0) + goto out; + } + } + + if (r < -1) { + print_error_errno("view", "error reading file \"%s\"", conf->fn_in); + goto out; + } + + retval = EXIT_SUCCESS; + + out: + hts_itr_multi_destroy(iter); + hts_idx_destroy(conf->hts_idx); // destroy the BAM index + conf->hts_idx = NULL; + if (mate_names) { + // free khash keys + for (k = 0; k < kh_end(mate_names); ++k) + if ( kh_exist(mate_names,k) ) free((char*)kh_key(mate_names, k)); + kh_destroy(names,mate_names); + } + bam_destroy1(rec); + return retval; +} + +// Common code for processing and writing a record +static inline int process_one_record(samview_settings_t *conf, bam1_t *b, + int *write_error) { + if (!process_aln(conf->header, b, conf)) { + if (!conf->is_count) { + change_flag(b, conf); + if (adjust_tags(conf->header, b, conf) != 0) + return -1; + if (check_sam_write1(conf->out, conf->header, + b, conf->fn_out, write_error) < 0) { + return -1; + } + } + conf->count++; + } else if (conf->unmap) { + b->core.flag |= BAM_FUNMAP; + b->core.qual = 0; + b->core.isize = 0; + + // remove CIGAR + if (b->core.n_cigar) { + memmove(bam_get_cigar(b), bam_get_seq(b), + b->data + b->l_data - bam_get_seq(b)); + b->l_data -= 4*b->core.n_cigar; + b->core.n_cigar = 0; + } + + if (check_sam_write1(conf->out, conf->header, + b, conf->fn_out, write_error) < 0) { + return -1; + } + } else { + if (conf->un_out) { + if (check_sam_write1(conf->un_out, conf->header, + b, conf->fn_un_out, write_error) < 0) { + return -1; + } + } + } + return 0; +} + +static int stream_view(samview_settings_t *conf) { + bam1_t *b = bam_init1(); + int write_error = 0, r; + if (!b) { + print_error_errno("view", "could not allocate bam record"); + return 1; + } + errno = 0; // prevent false error messages. + while ((r = sam_read1(conf->in, conf->header, b)) >= 0) { + if (process_one_record(conf, b, &write_error) < 0) break; + } + bam_destroy1(b); + if (r < -1) { + print_error_errno("view", "error reading file \"%s\"", conf->fn_in); + return 1; + } + return write_error; +} + +static int multi_region_view(samview_settings_t *conf, hts_itr_multi_t *iter) +{ + bam1_t *b = bam_init1(); + int write_error = 0, result; + if (!b) { + print_error_errno("view", "could not allocate bam record"); + return 1; + } + // fetch alignments + while ((result = sam_itr_multi_next(conf->in, iter, b)) >= 0) { + if (process_one_record(conf, b, &write_error) < 0) break; + } + hts_itr_multi_destroy(iter); + bam_destroy1(b); + + if (result < -1) { + print_error("view", "retrieval of region #%d failed", iter->curr_tid); + return 1; + } + return write_error; +} + +// Make mnemonic distinct values for longoption-only options +#define LONGOPT(c) ((c) + 128) + +// Check for ".sam" filenames as sam_open_mode cannot distinguish between +// foo.sam and foo.unknown, both getting mode "". +static int is_sam(const char *fn) { + if (!fn) + return 0; + size_t l = strlen(fn); + return (l >= 4 && strcasecmp(fn + l-4, ".sam") == 0); +} + +int main_samview(int argc, char *argv[]) +{ + samview_settings_t settings; + int c, is_header = 0, is_header_only = 0, ret = 0, compress_level = -1, has_index_file = 0, no_pg = 0; + FILE *fp_out = NULL; + char out_mode[6] = {0}, out_un_mode[6] = {0}; + char *out_format = ""; + char *arg_list = NULL; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + htsThreadPool p = {NULL, 0}; + + memset(&settings,0,sizeof(settings)); + settings.subsam_frac = -1.0; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 'T', '@'), + {"add-flags", required_argument, NULL, LONGOPT('a')}, + {"bam", no_argument, NULL, 'b'}, + {"count", no_argument, NULL, 'c'}, + {"cram", no_argument, NULL, 'C'}, + {"customised-index", no_argument, NULL, 'X'}, + {"customized-index", no_argument, NULL, 'X'}, + {"excl-flags", required_argument, NULL, 'F'}, + {"exclude-flags", required_argument, NULL, 'F'}, + {"expr", required_argument, NULL, 'e'}, + {"expression", required_argument, NULL, 'e'}, + {"fai-reference", required_argument, NULL, 't'}, + {"fast", no_argument, NULL, '1'}, + {"fetch-pairs", no_argument, NULL, 'P'}, + {"header-only", no_argument, NULL, 'H'}, + {"help", no_argument, NULL, LONGOPT('?')}, + {"incl-flags", required_argument, NULL, LONGOPT('g')}, + {"include-flags", required_argument, NULL, LONGOPT('g')}, + {"rf", required_argument, NULL, LONGOPT('g')}, // aka incl-flags + {"keep-tag", required_argument, NULL, LONGOPT('x') }, + {"library", required_argument, NULL, 'l'}, + {"min-mapq", required_argument, NULL, 'q'}, + {"min-MQ", required_argument, NULL, 'q'}, + {"min-mq", required_argument, NULL, 'q'}, + {"min-qlen", required_argument, NULL, 'm'}, + {"no-header", no_argument, NULL, LONGOPT('H')}, + {"no-PG", no_argument, NULL, LONGOPT('P')}, + {"output", required_argument, NULL, 'o'}, + {"output-unselected", required_argument, NULL, 'U'}, + {"QNAME-file", required_argument, NULL, 'N'}, + {"qname-file", required_argument, NULL, 'N'}, + {"read-group", required_argument, NULL, 'r'}, + {"read-group-file", required_argument, NULL, 'R'}, + {"readgroup", required_argument, NULL, 'r'}, + {"readgroup-file", required_argument, NULL, 'R'}, + {"region-file", required_argument, NULL, LONGOPT('L')}, + {"regions-file", required_argument, NULL, LONGOPT('L')}, + {"remove-B", no_argument, NULL, 'B'}, + {"remove-flags", required_argument, NULL, LONGOPT('r')}, + {"remove-tag", required_argument, NULL, 'x'}, + {"require-flags", required_argument, NULL, 'f'}, + {"subsample", required_argument, NULL, LONGOPT('s')}, + {"subsample-seed", required_argument, NULL, LONGOPT('S')}, + {"tag", required_argument, NULL, 'd'}, + {"tag-file", required_argument, NULL, 'D'}, + {"target-file", required_argument, NULL, 'L'}, + {"targets-file", required_argument, NULL, 'L'}, + {"uncompressed", no_argument, NULL, 'u'}, + {"unmap", no_argument, NULL, 'p'}, + {"unoutput", required_argument, NULL, 'U'}, + {"use-index", no_argument, NULL, 'M'}, + {"with-header", no_argument, NULL, 'h'}, + }; + + /* parse command-line options */ + strcpy(out_mode, "w"); + strcpy(out_un_mode, "w"); + if (argc == 1 && isatty(STDIN_FILENO)) + return usage(stdout, EXIT_SUCCESS, 0); + + // Suppress complaints about '?' being an unrecognised option. Without + // this we have to put '?' in the options list, which makes it hard to + // tell a bad long option from the use of '-?' (both return '?' and + // set optopt to '\0'). + opterr = 0; + + char *tmp; + while ((c = getopt_long(argc, argv, + "SbBcCt:h1Ho:O:q:f:F:G:ul:r:T:R:N:d:D:L:s:@:m:x:U:MXe:pP", + lopts, NULL)) >= 0) { + switch (c) { + case 's': + settings.subsam_seed = strtol(optarg, &tmp, 10); + if (tmp && *tmp == '.') { + settings.subsam_frac = strtod(tmp, &tmp); + if (*tmp) ret = 1; + } else { + ret = 1; + } + + if (ret == 1) { + print_error("view", "Incorrect sampling argument \"%s\"", optarg); + goto view_end; + } + break; + case LONGOPT('s'): + settings.subsam_frac = strtod(optarg, &tmp); + if (*tmp || settings.subsam_frac < 0.0 || settings.subsam_frac > 1.0) { + print_error("view", "Incorrect sampling argument \"%s\"", optarg); + goto view_end; + } + break; + case LONGOPT('S'): settings.subsam_seed = atoi(optarg); break; + case 'm': settings.min_qlen = atoi(optarg); break; + case 'c': settings.is_count = 1; break; + case 'S': break; + case 'b': out_format = "b"; break; + case 'C': out_format = "c"; break; + case 't': settings.fn_fai = strdup(optarg); break; + case 'h': is_header = 1; break; + case 'H': is_header_only = 1; break; + case LONGOPT('H'): is_header = is_header_only = 0; break; + case 'o': settings.fn_out = strdup(optarg); break; + case 'U': settings.fn_un_out = strdup(optarg); break; + case 'X': has_index_file = 1; break; + case 'f': settings.flag_on |= bam_str2flag(optarg); break; + case 'F': settings.flag_off |= bam_str2flag(optarg); break; + case LONGOPT('g'): + settings.flag_anyon |= bam_str2flag(optarg); break; + case 'G': settings.flag_alloff |= bam_str2flag(optarg); break; + case 'q': settings.min_mapQ = atoi(optarg); break; + case 'u': compress_level = 0; break; + case '1': compress_level = 1; break; + case 'l': settings.library = strdup(optarg); break; + case 'p': settings.unmap = 1; break; + case 'P': settings.fetch_pairs = 1; settings.multi_region = 1; break; + case LONGOPT('L'): + settings.multi_region = 1; + // fall through + case 'L': + if ((settings.bed = bed_read(optarg)) == NULL) { + print_error_errno("view", "Could not read file \"%s\"", optarg); + ret = 1; + goto view_end; + } + break; + case 'r': + if (add_read_group_single("view", &settings, optarg) != 0) { + ret = 1; + goto view_end; + } + break; + case 'R': + if (add_read_groups_file("view", &settings, optarg) != 0) { + ret = 1; + goto view_end; + } + break; + case 'N': + if (add_read_names_file("view", &settings, optarg) != 0) { + ret = 1; + goto view_end; + } + break; + case 'd': + if (strlen(optarg) < 2 || (strlen(optarg) > 2 && optarg[2] != ':')) { + print_error_errno("view", "Invalid \"tag:value\" option: \"%s\"", optarg); + ret = 1; + goto view_end; + } + + if (settings.tag) { + if (settings.tag[0] != optarg[0] || settings.tag[1] != optarg[1]) { + print_error("view", "Different tag \"%s\" was specified before: \"%s\"", settings.tag, optarg); + ret = 1; + goto view_end; + } + } else { + if (!(settings.tag = calloc(3, 1))) { + print_error("view", "Could not allocate memory for tag: \"%s\"", optarg); + ret = 1; + goto view_end; + } + memcpy(settings.tag, optarg, 2); + } + + if (strlen(optarg) > 3 && add_tag_value_single("view", &settings, optarg+3) != 0) { + print_error("view", "Could not add tag:value \"%s\"", optarg); + ret = 1; + goto view_end; + } + break; + case 'D': + // Allow ";" as delimiter besides ":" to support MinGW CLI POSIX + // path translation as described at: + // http://www.mingw.org/wiki/Posix_path_conversion + if (strlen(optarg) < 4 || (optarg[2] != ':' && optarg[2] != ';')) { + print_error_errno("view", "Invalid \"tag:file\" option: \"%s\"", optarg); + ret = 1; + goto view_end; + } + + if (settings.tag) { + if (settings.tag[0] != optarg[0] || settings.tag[1] != optarg[1]) { + print_error("view", "Different tag \"%s\" was specified before: \"%s\"", settings.tag, optarg); + ret = 1; + goto view_end; + } + } else { + if (!(settings.tag = calloc(3, 1))) { + print_error("view", "Could not allocate memory for tag: \"%s\"", optarg); + ret = 1; + goto view_end; + } + memcpy(settings.tag, optarg, 2); + } + + if (add_tag_values_file("view", &settings, optarg+3) != 0) { + ret = 1; + goto view_end; + } + break; + case LONGOPT('?'): + return usage(stdout, EXIT_SUCCESS, 1); + case '?': + if (optopt == '?') { // '-?' appeared on command line + return usage(stdout, EXIT_SUCCESS, 1); + } else { + if (optopt) { // Bad short option + print_error("view", "invalid option -- '%c'", optopt); + } else { // Bad long option + // Do our best. There is no good solution to finding + // out what the bad option was. + // See, e.g. https://stackoverflow.com/questions/2723888/where-does-getopt-long-store-an-unrecognized-option + if (optind > 0 && strncmp(argv[optind - 1], "--", 2) == 0) { + print_error("view", "unrecognised option '%s'", + argv[optind - 1]); + } + } + return usage(stderr, EXIT_FAILURE, 0); + } + case 'B': settings.remove_B = 1; break; + + case 'M': settings.multi_region = 1; break; + case LONGOPT('P'): no_pg = 1; break; + case 'e': + if (!(settings.filter = hts_filter_init(optarg))) { + print_error("main_samview", "Couldn't initialise filter"); + return 1; + } + break; + case LONGOPT('r'): settings.remove_flag |= bam_str2flag(optarg); break; + case LONGOPT('a'): settings.add_flag |= bam_str2flag(optarg); break; + + case 'x': + if (*optarg == '^') { + if (parse_aux_list(&settings.keep_tag, optarg+1)) + return usage(stderr, EXIT_FAILURE, 0); + } else { + if (parse_aux_list(&settings.remove_tag, optarg)) + return usage(stderr, EXIT_FAILURE, 0); + } + break; + + case LONGOPT('x'): + if (parse_aux_list(&settings.keep_tag, optarg)) + return usage(stderr, EXIT_FAILURE, 0); + break; + + default: + if (parse_sam_global_opt(c, optarg, lopts, &ga) != 0) + return usage(stderr, EXIT_FAILURE, 0); + break; + } + } + if (settings.is_count && settings.fetch_pairs) + { + print_error("view","The options -P and -c cannot be combined\n"); + return 1; + } + if (settings.fn_fai == 0 && ga.reference) settings.fn_fai = fai_path(ga.reference); + if (is_header_only) is_header = 1; + // File format auto-detection first + if (settings.fn_out) sam_open_mode(out_mode+1, settings.fn_out, NULL); + if (settings.fn_un_out) sam_open_mode(out_un_mode+1, settings.fn_un_out, NULL); + + // -1 or -u without an explicit format (-b, -C) => check fn extensions + if (!*out_format && compress_level >= 0) { + if (compress_level == 0 && + (out_mode[strlen(out_mode)-1] == 'z' || + out_un_mode[strlen(out_un_mode)-1] == 'z')) + // z, fz, Fz sanity check + fprintf(stderr, "[view] Warning option -u ignored due to" + " filename suffix\n"); + + // If known extension, use it, otherwise BAM + if (!(out_mode[1] || is_sam(settings.fn_out))) + out_mode[1] = 'b'; + + if (!(out_un_mode[1] || is_sam(settings.fn_un_out))) + out_un_mode[1] = 'b'; + } else if (*out_format) { + out_mode[1] = out_un_mode[1] = *out_format; + } + + if (compress_level >= 0) { + char tmp[2]; + tmp[0] = compress_level + '0'; tmp[1] = '\0'; + strcat(out_mode, tmp); + strcat(out_un_mode, tmp); + } + if (argc == optind && isatty(STDIN_FILENO)) { + print_error("view", "No input provided or missing option argument."); + return usage(stderr, EXIT_FAILURE, 0); // potential memory leak... + } + + if (settings.unmap && settings.fn_un_out) { + print_error("view", "Options --unoutput and --unmap are mutually exclusive."); + ret = 1; + goto view_end; + } + + if (settings.subsam_seed != 0) { + // Convert likely user input 1,2,... to pseudo-random + // values with more entropy and more bits set + srand(settings.subsam_seed); + settings.subsam_seed = rand(); + } + + settings.fn_in = (optind < argc)? argv[optind] : "-"; + if ((settings.in = sam_open_format(settings.fn_in, "r", &ga.in)) == 0) { + print_error_errno("view", "failed to open \"%s\" for reading", settings.fn_in); + ret = 1; + goto view_end; + } + + if (settings.fn_fai) { + if (hts_set_fai_filename(settings.in, settings.fn_fai) != 0) { + fprintf(stderr, "[main_samview] failed to use reference \"%s\".\n", settings.fn_fai); + ret = 1; + goto view_end; + } + } + if ((settings.header = sam_hdr_read(settings.in)) == 0) { + fprintf(stderr, "[main_samview] fail to read the header from \"%s\".\n", settings.fn_in); + ret = 1; + goto view_end; + } + if (settings.rghash) { + sam_hdr_remove_lines(settings.header, "RG", "ID", settings.rghash); + } + if (!settings.is_count) { + if ((settings.out = sam_open_format(settings.fn_out? settings.fn_out : "-", out_mode, &ga.out)) == 0) { + print_error_errno("view", "failed to open \"%s\" for writing", settings.fn_out? settings.fn_out : "standard output"); + ret = 1; + goto view_end; + } + if (settings.fn_fai) { + if (hts_set_fai_filename(settings.out, settings.fn_fai) != 0) { + fprintf(stderr, "[main_samview] failed to use reference \"%s\".\n", settings.fn_fai); + ret = 1; + goto view_end; + } + } + autoflush_if_stdout(settings.out, settings.fn_out); + + if (!no_pg) { + if (!(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("view", "failed to create arg_list"); + ret = 1; + goto view_end; + } + if (sam_hdr_add_pg(settings.header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error("view", "failed to add PG line to the header"); + ret = 1; + goto view_end; + } + } + + if (ga.write_index || is_header || + out_mode[1] == 'b' || out_mode[1] == 'c' || + (ga.out.format != sam && ga.out.format != unknown_format)) { + if (sam_hdr_write(settings.out, settings.header) != 0) { + fprintf(stderr, "[main_samview] failed to write the SAM header\n"); + ret = 1; + goto view_end; + } + } + if (ga.write_index) { + if (!(settings.fn_out_idx = auto_index(settings.out, settings.fn_out, settings.header))) { + ret = 1; + goto view_end; + } + } + + if (settings.fn_un_out) { + if ((settings.un_out = sam_open_format(settings.fn_un_out, out_un_mode, &ga.out)) == 0) { + print_error_errno("view", "failed to open \"%s\" for writing", settings.fn_un_out); + ret = 1; + goto view_end; + } + if (settings.fn_fai) { + if (hts_set_fai_filename(settings.un_out, settings.fn_fai) != 0) { + fprintf(stderr, "[main_samview] failed to use reference \"%s\".\n", settings.fn_fai); + ret = 1; + goto view_end; + } + } + autoflush_if_stdout(settings.un_out, settings.fn_un_out); + if (ga.write_index || is_header || + out_un_mode[1] == 'b' || out_un_mode[1] == 'c' || + (ga.out.format != sam && ga.out.format != unknown_format)) { + if (sam_hdr_write(settings.un_out, settings.header) != 0) { + fprintf(stderr, "[main_samview] failed to write the SAM header\n"); + ret = 1; + goto view_end; + } + } + if (ga.write_index) { + if (!(settings.fn_un_out_idx = auto_index(settings.un_out, settings.fn_un_out, settings.header))) { + ret = 1; + goto view_end; + } + } + } + } + else { + if (settings.fn_out) { + fp_out = fopen(settings.fn_out, "w"); + if (fp_out == NULL) { + print_error_errno("view", "can't create \"%s\"", settings.fn_out); + ret = EXIT_FAILURE; + goto view_end; + } + } + settings.unmap = 0; // Not valid in counting mode + } + + if (ga.nthreads > 1) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(stderr, "Error creating thread pool\n"); + ret = 1; + goto view_end; + } + hts_set_opt(settings.in, HTS_OPT_THREAD_POOL, &p); + if (settings.out) hts_set_opt(settings.out, HTS_OPT_THREAD_POOL, &p); + } + if (is_header_only) goto view_end; // no need to print alignments + + + // Initialize BAM/CRAM index + char **regs = NULL; + int nregs = 0; + if ( has_index_file && optind < argc - 2 ) regs = &argv[optind+2], nregs = argc - optind - 2, settings.fn_idx_in = argv[optind+1]; + else if ( !has_index_file && optind < argc - 1 ) regs = &argv[optind+1], nregs = argc - optind - 1; + else if ( has_index_file ) + { + print_error("view", "Incorrect number of arguments for -X option. Aborting."); + return 1; + } + if ( settings.fn_idx_in || nregs || settings.multi_region ) + { + settings.hts_idx = settings.fn_idx_in ? sam_index_load2(settings.in, settings.fn_in, settings.fn_idx_in) : sam_index_load(settings.in, settings.fn_in); + if ( !settings.hts_idx ) + { + print_error("view", "Random alignment retrieval only works for indexed SAM.gz, BAM or CRAM files."); + return 1; + } + } + + if ( settings.fetch_pairs ) + { + hts_itr_multi_t *iter = multi_region_init(&settings, regs, nregs); + ret = iter ? fetch_pairs_collect_mates(&settings, iter) : 1; + if (ret) goto view_end; + } + else if ( settings.multi_region ) + { + hts_itr_multi_t *iter = multi_region_init(&settings, regs, nregs); + ret = iter ? multi_region_view(&settings, iter) : 1; + if (ret) goto view_end; + } + else if ( !settings.hts_idx ) // stream through the entire file + { + ret = stream_view(&settings); + if (ret) goto view_end; + } else { // retrieve alignments in specified regions + int i; + for (i = (has_index_file)? optind+2 : optind+1; i < argc; ++i) { + hts_itr_t *iter = sam_itr_querys(settings.hts_idx, settings.header, argv[i]); // parse a region in the format like `chr2:100-200' + if (iter == NULL) { // region invalid or reference name not found + fprintf(stderr, "[main_samview] region \"%s\" specifies an invalid region or unknown reference. Continue anyway.\n", argv[i]); + continue; + } + // fetch alignments + ret = multi_region_view(&settings, iter); + if (ret) goto view_end; + } + } + + if ( settings.hts_idx ) hts_idx_destroy(settings.hts_idx); + + if (ga.write_index) { + if (sam_idx_save(settings.out) < 0) { + print_error_errno("view", "writing index failed"); + ret = 1; + } + if (settings.un_out && sam_idx_save(settings.un_out) < 0) { + print_error_errno("view", "writing index failed"); + ret = 1; + } + } + +view_end: + if (settings.is_count && ret == 0) { + if (fprintf(settings.fn_out? fp_out : stdout, "%" PRId64 "\n", settings.count) < 0) { + if (settings.fn_out) print_error_errno("view", "writing to \"%s\" failed", settings.fn_out); + else print_error_errno("view", "writing to standard output failed"); + ret = EXIT_FAILURE; + } + } + + // close files, free and return + if (settings.in) check_sam_close("view", settings.in, settings.fn_in, "standard input", &ret); + if (settings.out) check_sam_close("view", settings.out, settings.fn_out, "standard output", &ret); + if (settings.un_out) check_sam_close("view", settings.un_out, settings.fn_un_out, "file", &ret); + if (fp_out) fclose(fp_out); + + free(settings.fn_fai); free(settings.fn_out); free(settings.library); free(settings.fn_un_out); + sam_global_args_free(&ga); + if ( settings.header ) sam_hdr_destroy(settings.header); + if (settings.bed) bed_destroy(settings.bed); + if (settings.rghash) { + khint_t k; + for (k = 0; k < kh_end(settings.rghash); ++k) + if (kh_exist(settings.rghash, k)) free((char*)kh_key(settings.rghash, k)); + kh_destroy(str, settings.rghash); + } + if (settings.rnhash) { + khint_t k; + for (k = 0; k < kh_end(settings.rnhash); ++k) + if (kh_exist(settings.rnhash, k)) free((char*)kh_key(settings.rnhash, k)); + kh_destroy(str, settings.rnhash); + } + if (settings.tvhash) { + khint_t k; + for (k = 0; k < kh_end(settings.tvhash); ++k) + if (kh_exist(settings.tvhash, k)) free((char*)kh_key(settings.tvhash, k)); + kh_destroy(str, settings.tvhash); + } + + if (settings.remove_aux_len) { + free(settings.remove_aux); + } + if (settings.tag) { + free(settings.tag); + } + if (settings.filter) + hts_filter_free(settings.filter); + + if (p.pool) + hts_tpool_destroy(p.pool); + + if (settings.fn_out_idx) + free(settings.fn_out_idx); + if (settings.fn_un_out_idx) + free(settings.fn_un_out_idx); + free(arg_list); + + if (settings.keep_tag) + kh_destroy(aux_exists, settings.keep_tag); + if (settings.remove_tag) + kh_destroy(aux_exists, settings.remove_tag); + + return ret; +} + +static int usage(FILE *fp, int exit_status, int is_long_help) +{ + fprintf(fp, +"\n" +"Usage: samtools view [options] || [region ...]\n" +"\n" + +"Output options:\n" +" -b, --bam Output BAM\n" +" -C, --cram Output CRAM (requires -T)\n" +" -1, --fast Use fast BAM compression (and default to --bam)\n" +" -u, --uncompressed Uncompressed BAM output (and default to --bam)\n" +" -h, --with-header Include header in SAM output\n" +" -H, --header-only Print SAM header only (no alignments)\n" +" --no-header Print SAM alignment records only [default]\n" +" -c, --count Print only the count of matching records\n" +" -o, --output FILE Write output to FILE [standard output]\n" +" -U, --unoutput FILE, --output-unselected FILE\n" +" Output reads not selected by filters to FILE\n" +" -p, --unmap Set flag to UNMAP on reads not selected\n" +" then write to output file.\n" +" -P, --fetch-pairs Retrieve complete pairs even when outside of region\n" +"Input options:\n" +" -t, --fai-reference FILE FILE listing reference names and lengths\n" +" -M, --use-index Use index and multi-region iterator for regions\n" +" --region[s]-file FILE Use index to include only reads overlapping FILE\n" +" -X, --customized-index Expect extra index file argument after \n" +"\n" +"Filtering options (Only include in output reads that...):\n" +" -L, --target[s]-file FILE ...overlap (BED) regions in FILE\n" +" -r, --read-group STR ...are in read group STR\n" +" -R, --read-group-file FILE ...are in a read group listed in FILE\n" +" -N, --qname-file FILE ...whose read name is listed in FILE\n" +" -d, --tag STR1[:STR2] ...have a tag STR1 (with associated value STR2)\n" +" -D, --tag-file STR:FILE ...have a tag STR whose value is listed in FILE\n" +" -q, --min-MQ INT ...have mapping quality >= INT\n" +" -l, --library STR ...are in library STR\n" +" -m, --min-qlen INT ...cover >= INT query bases (as measured via CIGAR)\n" +" -e, --expr STR ...match the filter expression STR\n" +" -f, --require-flags FLAG ...have all of the FLAGs present\n" // F&x == x +" -F, --excl[ude]-flags FLAG ...have none of the FLAGs present\n" // F&x == 0 +" --rf, --incl-flags, --include-flags FLAG\n" +" ...have some of the FLAGs present\n" +" -G FLAG EXCLUDE reads with all of the FLAGs present\n" // !(F&x == x) TODO long option +" --subsample FLOAT Keep only FLOAT fraction of templates/read pairs\n" +" --subsample-seed INT Influence WHICH reads are kept in subsampling [0]\n" +" -s INT.FRAC Same as --subsample 0.FRAC --subsample-seed INT\n" +"\n" +"Processing options:\n" +" --add-flags FLAG Add FLAGs to reads\n" +" --remove-flags FLAG Remove FLAGs from reads\n" +" -x, --remove-tag STR\n" +" Comma-separated read tags to strip (repeatable) [null]\n" +" --keep-tag STR\n" +" Comma-separated read tags to preserve (repeatable) [null].\n" +" Equivalent to \"-x ^STR\"\n" +" -B, --remove-B Collapse the backward CIGAR operation\n" +"\n" +"General options:\n" +" -?, --help Print long help, including note about region specification\n" +" -S Ignored (input format is auto-detected)\n" +" --no-PG Do not add a PG line\n"); + + sam_global_opt_help(fp, "-.O.T@.."); + fprintf(fp, "\n"); + + if (is_long_help) + fprintf(fp, +"Notes:\n" +"\n" +"1. This command now auto-detects the input format (BAM/CRAM/SAM).\n" +" Further control over the CRAM format can be specified by using the\n" +" --output-fmt-option, e.g. to specify the number of sequences per slice\n" +" and to use avoid reference based compression:\n" +"\n" +"\tsamtools view -C --output-fmt-option seqs_per_slice=5000 \\\n" +"\t --output-fmt-option no_ref -o out.cram in.bam\n" +"\n" +" Options can also be specified as a comma separated list within the\n" +" --output-fmt value too. For example this is equivalent to the above\n" +"\n" +"\tsamtools view --output-fmt cram,seqs_per_slice=5000,no_ref \\\n" +"\t -o out.cram in.bam\n" +"\n" +"2. The file supplied with `-t' is SPACE/TAB delimited with the first\n" +" two fields of each line consisting of the reference name and the\n" +" corresponding sequence length. The `.fai' file generated by \n" +" `samtools faidx' is suitable for use as this file. This may be an\n" +" empty file if reads are unaligned.\n" +"\n" +"3. SAM->BAM conversion: samtools view -bT ref.fa in.sam.gz\n" +"\n" +"4. BAM->SAM conversion: samtools view -h in.bam\n" +"\n" +"5. A region should be presented in one of the following formats:\n" +" `chr1', `chr2:1,000' and `chr3:1000-2,000'. When a region is\n" +" specified, the input alignment file must be a sorted and indexed\n" +" alignment (BAM/CRAM) file.\n" +"\n" +"6. Option `-u' is preferred over `-b' when the output is piped to\n" +" another samtools command.\n" +"\n" +"7. Option `-M`/`--use-index` causes overlaps with `-L` BED file regions and\n" +" command-line region arguments to be computed using the multi-region iterator\n" +" and an index. This increases speed, omits duplicates, and outputs the reads\n" +" as they are ordered in the input SAM/BAM/CRAM file.\n" +"\n" +"8. Options `-L`/`--target[s]-file` and `--region[s]-file` may not be used\n" +" together. `--region[s]-file FILE` is simply equivalent to `-M -L FILE`,\n" +" so using both causes one of the specified BED files to be ignored.\n" +"\n"); + + return exit_status; +} + +static int head_usage(FILE *fp, int exit_status) +{ + fprintf(fp, +"Usage: samtools head [OPTION]... [FILE]\n" +"Options:\n" +" -h, --headers INT Display INT header lines [all]\n" +" -n, --records INT Display INT alignment record lines [none]\n" +); + sam_global_opt_help(fp, "-.--T@-."); + return exit_status; +} + +int main_head(int argc, char *argv[]) +{ + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 'T', '@'), + { "headers", required_argument, NULL, 'h' }, + { "records", required_argument, NULL, 'n' }, + { NULL, 0, NULL, 0 } + }; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + int all_headers = 1; + uint64_t nheaders = 0; + uint64_t nrecords = 0; + + int c, nargs; + while ((c = getopt_long(argc, argv, "h:n:T:@:", lopts, NULL)) >= 0) + switch (c) { + case 'h': all_headers = 0; nheaders = strtoull(optarg, NULL, 0); break; + case 'n': nrecords = strtoull(optarg, NULL, 0); break; + default: + if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + return head_usage(stderr, EXIT_FAILURE); + } + + nargs = argc - optind; + if (nargs == 0 && isatty(STDIN_FILENO)) + return head_usage(stdout, EXIT_SUCCESS); + else if (nargs > 1) + return head_usage(stderr, EXIT_FAILURE); + + samFile *fp = NULL; + sam_hdr_t *hdr = NULL; + kstring_t str = KS_INITIALIZE; + bam1_t *b = NULL; + + const char *fname = (nargs == 1)? argv[optind] : "-"; + fp = sam_open_format(fname, "r", &ga.in); + if (fp == NULL) { + if (strcmp(fname, "-") != 0) + print_error_errno("head", "failed to open \"%s\" for reading", fname); + else + print_error_errno("head", "failed to open standard input for reading"); + goto err; + } + + if (ga.nthreads > 0) hts_set_threads(fp, ga.nthreads); + + hdr = sam_hdr_read(fp); + if (hdr == NULL) { + if (strcmp(fname, "-") != 0) + print_error("head", "failed to read the header from \"%s\"", fname); + else + print_error("head", "failed to read the header"); + goto err; + } + + if (all_headers) { + fputs(sam_hdr_str(hdr), stdout); + } + else if (nheaders > 0) { + const char *text = sam_hdr_str(hdr); + const char *lim = text; + uint64_t n; + for (n = 0; n < nheaders; n++) { + lim = strchr(lim, '\n'); + if (lim) lim++; + else break; + } + if (lim) fwrite(text, lim - text, 1, stdout); + else fputs(text, stdout); + } + + if (nrecords > 0) { + b = bam_init1(); + uint64_t n; + int r; + for (n = 0; n < nrecords && (r = sam_read1(fp, hdr, b)) >= 0; n++) { + if (sam_format1(hdr, b, &str) < 0) { + print_error_errno("head", "couldn't format record"); + goto err; + } + puts(ks_str(&str)); + } + if (r < -1) { + print_error("head", "\"%s\" is truncated", fname); + goto err; + } + bam_destroy1(b); + ks_free(&str); + } + + sam_hdr_destroy(hdr); + sam_close(fp); + sam_global_args_free(&ga); + + return EXIT_SUCCESS; + +err: + if (fp) sam_close(fp); + sam_hdr_destroy(hdr); + bam_destroy1(b); + ks_free(&str); + sam_global_args_free(&ga); + return EXIT_FAILURE; +} diff --git a/samtools/sam_view.c.pysam.c b/samtools/sam_view.c.pysam.c new file mode 100644 index 0000000..bb61059 --- /dev/null +++ b/samtools/sam_view.c.pysam.c @@ -0,0 +1,1598 @@ +#include "samtools.pysam.h" + +/* sam_view.c -- SAM<->BAM<->CRAM conversion. + + Copyright (C) 2009-2022 Genome Research Ltd. + Portions copyright (C) 2009, 2011, 2012 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notices and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include "htslib/sam.h" +#include "htslib/faidx.h" +#include "htslib/khash.h" +#include "htslib/kstring.h" +#include "htslib/thread_pool.h" +#include "htslib/hts_expr.h" +#include "samtools.h" +#include "sam_opts.h" +#include "bam.h" // for bam_get_library and bam_remove_B +#include "bedidx.h" + +KHASH_SET_INIT_STR(str) +typedef khash_t(str) *strhash_t; + +KHASH_SET_INIT_INT(aux_exists) +typedef khash_t(aux_exists) *auxhash_t; + +// This structure contains the settings for a samview run +typedef struct samview_settings { + strhash_t rghash; + strhash_t rnhash; + strhash_t tvhash; + int min_mapQ; + + // Described here in the same terms as the usage statement. + // The code however always negates to "reject if" keep if: + int flag_on; // keep if (FLAG & N) == N (all on) + int flag_off; // keep if (FLAG & N) == 0 (all off) + int flag_anyon; // keep if (FLAG & N) != 0 (any on) + int flag_alloff; // reject if (FLAG & N) == N (any off) + + int min_qlen; + int remove_B; + uint32_t subsam_seed; + double subsam_frac; + char* library; + void* bed; + size_t remove_aux_len; + char** remove_aux; + int multi_region; + char* tag; + hts_filter_t *filter; + int remove_flag; + int add_flag; + int unmap; + auxhash_t remove_tag; + auxhash_t keep_tag; + + hts_idx_t *hts_idx; + sam_hdr_t *header; + samFile *in, *out, *un_out; + int64_t count; + int is_count; + char *fn_in, *fn_idx_in, *fn_out, *fn_fai, *fn_un_out, *fn_out_idx, *fn_un_out_idx; + int fetch_pairs, nreglist; + hts_reglist_t *reglist; +} samview_settings_t; + +// Copied from htslib/sam.c. +// TODO: we need a proper interface to find the length of an aux tag, +// or at the very make exportable versions of these in htslib. +static inline int aux_type2size(uint8_t type) +{ + switch (type) { + case 'A': case 'c': case 'C': + return 1; + case 's': case 'S': + return 2; + case 'i': case 'I': case 'f': + return 4; + case 'd': + return 8; + case 'Z': case 'H': case 'B': + return type; + default: + return 0; + } +} + +// Copied from htslib/sam.c. +static inline uint8_t *skip_aux(uint8_t *s, uint8_t *end) +{ + int size; + uint32_t n; + if (s >= end) return end; + size = aux_type2size(*s); ++s; // skip type + switch (size) { + case 'Z': + case 'H': + while (s < end && *s) ++s; + return s < end ? s + 1 : end; + case 'B': + if (end - s < 5) return NULL; + size = aux_type2size(*s); ++s; + n = le_to_u32(s); + s += 4; + if (size == 0 || end - s < size * n) return NULL; + return s + size * n; + case 0: + return NULL; + default: + if (end - s < size) return NULL; + return s + size; + } +} + +// Returns 0 to indicate read should be output 1 otherwise +static int process_aln(const sam_hdr_t *h, bam1_t *b, samview_settings_t* settings) +{ + if (settings->filter && sam_passes_filter(h, b, settings->filter) < 1) + return 1; + + if (settings->remove_B) bam_remove_B(b); + if (settings->min_qlen > 0) { + int k, qlen = 0; + uint32_t *cigar = bam_get_cigar(b); + for (k = 0; k < b->core.n_cigar; ++k) + if ((bam_cigar_type(bam_cigar_op(cigar[k]))&1) || bam_cigar_op(cigar[k]) == BAM_CHARD_CLIP) + qlen += bam_cigar_oplen(cigar[k]); + if (qlen < settings->min_qlen) return 1; + } + if (b->core.qual < settings->min_mapQ || ((b->core.flag & settings->flag_on) != settings->flag_on) || (b->core.flag & settings->flag_off)) + return 1; + if (settings->flag_alloff && ((b->core.flag & settings->flag_alloff) == settings->flag_alloff)) + return 1; + if (settings->flag_anyon && ((b->core.flag & settings->flag_anyon) == 0)) + return 1; + if (!settings->multi_region && settings->bed && (b->core.tid < 0 || !bed_overlap(settings->bed, sam_hdr_tid2name(h, b->core.tid), b->core.pos, bam_endpos(b)))) + return 1; + if (settings->subsam_frac > 0.) { + uint32_t k = __ac_Wang_hash(__ac_X31_hash_string(bam_get_qname(b)) ^ settings->subsam_seed); + if ((double)(k&0xffffff) / 0x1000000 >= settings->subsam_frac) return 1; + } + if (settings->rghash) { + uint8_t *s = bam_aux_get(b, "RG"); + if (s) { + khint_t k = kh_get(str, settings->rghash, (char*)(s + 1)); + if (k == kh_end(settings->rghash)) return 1; + } + } + if (settings->tag) { + uint8_t *s = bam_aux_get(b, settings->tag); + if (s) { + if (settings->tvhash) { + char t[32], *val; + if (*s == 'i' || *s == 'I' || *s == 's' || *s == 'S' || *s == 'c' || *s == 'C') { + int ret = snprintf(t, 32, "%"PRId64, bam_aux2i(s)); + if (ret > 0) val = t; + else return 1; + } else if (*s == 'A') { + t[0] = *(s+1); + t[1] = 0; + val = t; + } else { + val = (char *)(s+1); + } + khint_t k = kh_get(str, settings->tvhash, val); + if (k == kh_end(settings->tvhash)) return 1; + } + } else { + return 1; + } + } + if (settings->rnhash) { + const char* rn = bam_get_qname(b); + if (!rn || kh_get(str, settings->rnhash, rn) == kh_end(settings->rnhash)) { + return 1; + } + } + if (settings->library) { + const char *p = bam_get_library((sam_hdr_t*)h, b); + if (!p || strcmp(p, settings->library) != 0) return 1; + } + return 0; +} + +static int adjust_tags(const sam_hdr_t *h, bam1_t *b, + samview_settings_t* settings) { + if (settings->keep_tag) { + uint8_t *s_from, *s_to, *end = b->data + b->l_data; + auxhash_t h = settings->keep_tag; + + s_from = s_to = bam_get_aux(b); + while (s_from < end) { + int x = (int)s_from[0]<<8 | s_from[1]; + uint8_t *s = skip_aux(s_from+2, end); + if (s == NULL) { + print_error("view", "malformed aux data for record \"%s\"", + bam_get_qname(b)); + return -1; + } + + if (kh_get(aux_exists, h, x) != kh_end(h) ) { + if (s_to != s_from) memmove(s_to, s_from, s - s_from); + s_to += s - s_from; + } + s_from = s; + } + b->l_data = s_to - b->data; + + } else if (settings->remove_tag) { + uint8_t *s_from, *s_to, *end = b->data + b->l_data; + auxhash_t h = settings->remove_tag; + + s_from = s_to = bam_get_aux(b); + while (s_from < end) { + int x = (int)s_from[0]<<8 | s_from[1]; + uint8_t *s = skip_aux(s_from+2, end); + if (s == NULL) { + print_error("view", "malformed aux data for record \"%s\"", + bam_get_qname(b)); + return -1; + } + + if (kh_get(aux_exists, h, x) == kh_end(h) ) { + if (s_to != s_from) memmove(s_to, s_from, s - s_from); + s_to += s - s_from; + } + s_from = s; + } + b->l_data = s_to - b->data; + } + + return 0; +} + +static int usage(FILE *fp, int exit_status, int is_long_help); + +static int populate_lookup_from_file(const char *subcmd, strhash_t lookup, char *fn) +{ + FILE *fp; + char buf[1024]; + int ret = 0; + fp = fopen(fn, "r"); + if (fp == NULL) { + print_error_errno(subcmd, "failed to open \"%s\" for reading", fn); + return -1; + } + + while (ret != -1 && !feof(fp) && fscanf(fp, "%1023s", buf) > 0) { + char *d = strdup(buf); + if (d != NULL) { + kh_put(str, lookup, d, &ret); + if (ret == 0) free(d); /* Duplicate */ + } else { + ret = -1; + } + } + if (ferror(fp)) ret = -1; + if (ret == -1) { + print_error_errno(subcmd, "failed to read \"%s\"", fn); + } + fclose(fp); + return (ret != -1) ? 0 : -1; +} + +static int add_read_group_single(const char *subcmd, samview_settings_t *settings, char *name) +{ + char *d = strdup(name); + int ret = 0; + + if (d == NULL) goto err; + + if (settings->rghash == NULL) { + settings->rghash = kh_init(str); + if (settings->rghash == NULL) goto err; + } + + kh_put(str, settings->rghash, d, &ret); + if (ret == -1) goto err; + if (ret == 0) free(d); /* Duplicate */ + return 0; + + err: + print_error(subcmd, "Couldn't add \"%s\" to read group list: memory exhausted?", name); + free(d); + return -1; +} + +static int add_read_names_file(const char *subcmd, samview_settings_t *settings, char *fn) +{ + if (settings->rnhash == NULL) { + settings->rnhash = kh_init(str); + if (settings->rnhash == NULL) { + perror(NULL); + return -1; + } + } + return populate_lookup_from_file(subcmd, settings->rnhash, fn); +} + +static int add_read_groups_file(const char *subcmd, samview_settings_t *settings, char *fn) +{ + if (settings->rghash == NULL) { + settings->rghash = kh_init(str); + if (settings->rghash == NULL) { + perror(NULL); + return -1; + } + } + return populate_lookup_from_file(subcmd, settings->rghash, fn); +} + +static int add_tag_value_single(const char *subcmd, samview_settings_t *settings, char *name) +{ + char *d = strdup(name); + int ret = 0; + + if (d == NULL) goto err; + + if (settings->tvhash == NULL) { + settings->tvhash = kh_init(str); + if (settings->tvhash == NULL) goto err; + } + + kh_put(str, settings->tvhash, d, &ret); + if (ret == -1) goto err; + if (ret == 0) free(d); /* Duplicate */ + return 0; + + err: + print_error(subcmd, "Couldn't add \"%s\" to tag values list: memory exhausted?", name); + free(d); + return -1; +} + +static int add_tag_values_file(const char *subcmd, samview_settings_t *settings, char *fn) +{ + if (settings->tvhash == NULL) { + settings->tvhash = kh_init(str); + if (settings->tvhash == NULL) { + perror(NULL); + return -1; + } + } + return populate_lookup_from_file(subcmd, settings->tvhash, fn); +} + +static inline int check_sam_write1(samFile *fp, const sam_hdr_t *h, const bam1_t *b, const char *fname, int *retp) +{ + int r = sam_write1(fp, h, b); + if (r >= 0) return r; + + if (fname) print_error_errno("view", "writing to \"%s\" failed", fname); + else print_error_errno("view", "writing to standard output failed"); + + *retp = EXIT_FAILURE; + return r; +} + +static inline void change_flag(bam1_t *b, samview_settings_t *settings) +{ + if (settings->add_flag) + b->core.flag |= settings->add_flag; + + if (settings->remove_flag) + b->core.flag &= ~settings->remove_flag; +} + +int parse_aux_list(auxhash_t *h, char *optarg) { + if (!*h) + *h = kh_init(aux_exists); + + while (strlen(optarg) >= 2) { + int x = optarg[0]<<8 | optarg[1]; + int ret = 0; + kh_put(aux_exists, *h, x, &ret); + if (ret < 0) + return -1; + + optarg += 2; + if (*optarg == ',') // allow white-space too for easy `cat file`? + optarg++; + else if (*optarg != 0) + break; + } + + if (strlen(optarg) != 0) { + fprintf(samtools_stderr, "main_samview: Error parsing option, " + "auxiliary tags should be exactly two characters long.\n"); + return -1; + } + + return 0; +} + +static int cmp_reglist_intervals(const void *aptr, const void *bptr) +{ + hts_pair_pos_t *a = (hts_pair_pos_t*)aptr; + hts_pair_pos_t *b = (hts_pair_pos_t*)bptr; + if ( a->beg < b->beg ) return -1; + if ( a->beg > b->beg ) return 1; + if ( a->end < b->end ) return -1; + if ( a->end > b->end ) return 1; + return 0; +} +static int cmp_reglist_tids(const void *aptr, const void *bptr) +{ + hts_reglist_t *a = (hts_reglist_t*)aptr; + hts_reglist_t *b = (hts_reglist_t*)bptr; + if ( b->tid==HTS_IDX_NOCOOR || a->tid < b->tid ) return -1; + if ( a->tid==HTS_IDX_NOCOOR || a->tid > b->tid ) return 1; + return 0; +} + +static hts_reglist_t *_reglist_dup(sam_hdr_t *hdr, hts_reglist_t *src, int nsrc) +{ + int i,j; + hts_reglist_t *dst = (hts_reglist_t*)calloc(nsrc,sizeof(hts_reglist_t)); + if ( !dst ) { + print_error_errno("view", "[%s:%d] could not allocate region list" + ,__FILE__ ,__LINE__); + return NULL; + } + for (i=0; i tid ) imax = i - 1; + else break; + } + if ( i<0 || reg[i].tid < tid ) i++; // not found, i will be the index of the inserted element + return i; +} +static int _reglist_push(hts_reglist_t **_reg, int *_nreg, int tid, hts_pos_t beg, hts_pos_t end) +{ + hts_reglist_t *reg = *_reg; + int nreg = *_nreg; + int i = _reglist_find_tid(reg,nreg,tid); + if ( i>=nreg || reg[i].tid!=tid ) { + nreg++; + reg = (hts_reglist_t*)realloc(reg,sizeof(hts_reglist_t)*nreg); + if ( !reg ) { + print_error_errno("view", "[%s:%d] could not extend region list", + __FILE__, __LINE__); + return -1; + } + if ( i+1 < nreg ) + memmove(reg + i + 1, reg + i, sizeof(hts_reglist_t)*(nreg - i - 1)); + reg[i].reg = NULL; + reg[i].tid = tid; + reg[i].min_beg = beg; + reg[i].max_end = end; + reg[i].intervals = NULL; + reg[i].count = 0; + } + *_reg = reg; + *_nreg = nreg; + if ( reg[i].count > 0 + && reg[i].intervals[reg[i].count - 1].beg==beg + && reg[i].intervals[reg[i].count - 1].end==end ) { + return 0; + } + hts_pair_pos_t *new_intervals = realloc(reg[i].intervals, sizeof(hts_pair_pos_t)*(reg[i].count + 1)); + if (!new_intervals) { + print_error_errno("view", "[%s:%d] could not extend region list", + __FILE__, __LINE__); + return -1; + } + reg[i].intervals = new_intervals; + reg[i].intervals[reg[i].count].beg = beg; + reg[i].intervals[reg[i].count].end = end; + reg[i].count++; + return 0; +} + +static void _reglist_merge(hts_reglist_t *reg, int nreg) +{ + int i,j; + for (i=0; ibed = bed_hash_regions(conf->bed, regs, 0, nregs, &filter_op); // insert(1) or filter out(0) the regions from the command line in the same hash table as the bed file + if ( !filter_op ) + filter_state = FILTERED; + } + else + bed_unify(conf->bed); + if ( !conf->bed) { // index is unavailable or no regions have been specified + print_error("view", "No regions or BED file have been provided. Aborting."); + return NULL; + } + + int regcount = 0; + hts_reglist_t *reglist = bed_reglist(conf->bed, filter_state, ®count); + if (!reglist) { + print_error("view", "Region list is empty or could not be created. Aborting."); + return NULL; + } + + if ( conf->fetch_pairs ) { + conf->reglist = _reglist_dup(conf->header,reglist,regcount); + if (!conf->reglist) + return NULL; + conf->nreglist = regcount; + } + + iter = sam_itr_regions(conf->hts_idx, conf->header, reglist, regcount); + if ( !iter ) { + print_error("view", "Iterator could not be created. Aborting."); + return NULL; + } + return iter; +} + +KHASH_SET_INIT_STR(names) + +static int fetch_pairs_collect_mates(samview_settings_t *conf, hts_itr_multi_t *iter) +{ + khint_t k; + int nunmap = 0, r = 0, nmates = 0, write_error = 0, retval = EXIT_FAILURE; + kh_names_t *mate_names = kh_init(names); + bam1_t *rec = bam_init1(); + + if (!mate_names) { + print_error_errno("view", "could not allocate mate names table"); + goto out; + } + if (!rec) { + print_error_errno("view", "could not allocate bam record"); + goto out; + } + + while ((r =sam_itr_multi_next(conf->in, iter, rec))>=0) { + if ( (rec->core.flag & BAM_FPAIRED) == 0 ) continue; + if ( rec->core.mtid>=0 && bed_overlap(conf->bed, sam_hdr_tid2name(conf->header,rec->core.mtid), rec->core.mpos, rec->core.mpos) ) continue; + if ( process_aln(conf->header, rec, conf) ) continue; + + nmates++; + + k = kh_get(names,mate_names,bam_get_qname(rec)); + if ( k == kh_end(mate_names) ) { + int ret = 0; + char *name_copy = strdup(bam_get_qname(rec)); + if (!name_copy) { + print_error_errno("view", "[%s:%d] could not store sample name, %d elements", __FILE__,__LINE__,nmates); + goto out; + } + kh_put(names, mate_names, name_copy, &ret); + if ( ret<0 ) { + print_error_errno("view", "[%s:%d] could not store sample name, %d elements",__FILE__,__LINE__,nmates); + free(name_copy); + goto out; + } + } + + if ( rec->core.mtid < 0 || (rec->core.flag & BAM_FMUNMAP) ) nunmap = 1; + if ( rec->core.mtid >= 0 ) { + if (_reglist_push(&conf->reglist, &conf->nreglist, rec->core.mtid, rec->core.mpos,rec->core.mpos+1) != 0) + goto out; + } + } + + if (r < -1) { + print_error_errno("view", "error reading file \"%s\"", conf->fn_in); + goto out; + } + + _reglist_merge(conf->reglist, conf->nreglist); + if ( nunmap ) { + if (_reglist_push(&conf->reglist,&conf->nreglist,HTS_IDX_NOCOOR,0,HTS_POS_MAX) != 0) + goto out; + } + hts_itr_multi_destroy(iter); + iter = sam_itr_regions(conf->hts_idx, conf->header, conf->reglist, conf->nreglist); + if ( !iter ) { + print_error_errno("view", "[%s:%d] iterator could not be created",__FILE__,__LINE__); + goto out; + } + while ((r = sam_itr_multi_next(conf->in, iter, rec))>=0) { + int drop = 1; + if (rec->core.tid >=0 && + bed_overlap(conf->bed, sam_hdr_tid2name(conf->header,rec->core.tid), rec->core.pos, bam_endpos(rec))) drop = 0; + if ( drop ) { + k = kh_get(names,mate_names,bam_get_qname(rec)); + if ( k != kh_end(mate_names) ) drop = 0; + } + if (!drop && process_aln(conf->header, rec, conf) == 0) { + if (adjust_tags(conf->header, rec, conf) != 0) + goto out; + if (check_sam_write1(conf->out, conf->header, rec, conf->fn_out, + &write_error) < 0) + goto out; + } + } + + if (r < -1) { + print_error_errno("view", "error reading file \"%s\"", conf->fn_in); + goto out; + } + + retval = EXIT_SUCCESS; + + out: + hts_itr_multi_destroy(iter); + hts_idx_destroy(conf->hts_idx); // destroy the BAM index + conf->hts_idx = NULL; + if (mate_names) { + // free khash keys + for (k = 0; k < kh_end(mate_names); ++k) + if ( kh_exist(mate_names,k) ) free((char*)kh_key(mate_names, k)); + kh_destroy(names,mate_names); + } + bam_destroy1(rec); + return retval; +} + +// Common code for processing and writing a record +static inline int process_one_record(samview_settings_t *conf, bam1_t *b, + int *write_error) { + if (!process_aln(conf->header, b, conf)) { + if (!conf->is_count) { + change_flag(b, conf); + if (adjust_tags(conf->header, b, conf) != 0) + return -1; + if (check_sam_write1(conf->out, conf->header, + b, conf->fn_out, write_error) < 0) { + return -1; + } + } + conf->count++; + } else if (conf->unmap) { + b->core.flag |= BAM_FUNMAP; + b->core.qual = 0; + b->core.isize = 0; + + // remove CIGAR + if (b->core.n_cigar) { + memmove(bam_get_cigar(b), bam_get_seq(b), + b->data + b->l_data - bam_get_seq(b)); + b->l_data -= 4*b->core.n_cigar; + b->core.n_cigar = 0; + } + + if (check_sam_write1(conf->out, conf->header, + b, conf->fn_out, write_error) < 0) { + return -1; + } + } else { + if (conf->un_out) { + if (check_sam_write1(conf->un_out, conf->header, + b, conf->fn_un_out, write_error) < 0) { + return -1; + } + } + } + return 0; +} + +static int stream_view(samview_settings_t *conf) { + bam1_t *b = bam_init1(); + int write_error = 0, r; + if (!b) { + print_error_errno("view", "could not allocate bam record"); + return 1; + } + errno = 0; // prevent false error messages. + while ((r = sam_read1(conf->in, conf->header, b)) >= 0) { + if (process_one_record(conf, b, &write_error) < 0) break; + } + bam_destroy1(b); + if (r < -1) { + print_error_errno("view", "error reading file \"%s\"", conf->fn_in); + return 1; + } + return write_error; +} + +static int multi_region_view(samview_settings_t *conf, hts_itr_multi_t *iter) +{ + bam1_t *b = bam_init1(); + int write_error = 0, result; + if (!b) { + print_error_errno("view", "could not allocate bam record"); + return 1; + } + // fetch alignments + while ((result = sam_itr_multi_next(conf->in, iter, b)) >= 0) { + if (process_one_record(conf, b, &write_error) < 0) break; + } + hts_itr_multi_destroy(iter); + bam_destroy1(b); + + if (result < -1) { + print_error("view", "retrieval of region #%d failed", iter->curr_tid); + return 1; + } + return write_error; +} + +// Make mnemonic distinct values for longoption-only options +#define LONGOPT(c) ((c) + 128) + +// Check for ".sam" filenames as sam_open_mode cannot distinguish between +// foo.sam and foo.unknown, both getting mode "". +static int is_sam(const char *fn) { + if (!fn) + return 0; + size_t l = strlen(fn); + return (l >= 4 && strcasecmp(fn + l-4, ".sam") == 0); +} + +int main_samview(int argc, char *argv[]) +{ + samview_settings_t settings; + int c, is_header = 0, is_header_only = 0, ret = 0, compress_level = -1, has_index_file = 0, no_pg = 0; + FILE *fp_out = NULL; + char out_mode[6] = {0}, out_un_mode[6] = {0}; + char *out_format = ""; + char *arg_list = NULL; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + htsThreadPool p = {NULL, 0}; + + memset(&settings,0,sizeof(settings)); + settings.subsam_frac = -1.0; + + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, 'O', 0, 'T', '@'), + {"add-flags", required_argument, NULL, LONGOPT('a')}, + {"bam", no_argument, NULL, 'b'}, + {"count", no_argument, NULL, 'c'}, + {"cram", no_argument, NULL, 'C'}, + {"customised-index", no_argument, NULL, 'X'}, + {"customized-index", no_argument, NULL, 'X'}, + {"excl-flags", required_argument, NULL, 'F'}, + {"exclude-flags", required_argument, NULL, 'F'}, + {"expr", required_argument, NULL, 'e'}, + {"expression", required_argument, NULL, 'e'}, + {"fai-reference", required_argument, NULL, 't'}, + {"fast", no_argument, NULL, '1'}, + {"fetch-pairs", no_argument, NULL, 'P'}, + {"header-only", no_argument, NULL, 'H'}, + {"help", no_argument, NULL, LONGOPT('?')}, + {"incl-flags", required_argument, NULL, LONGOPT('g')}, + {"include-flags", required_argument, NULL, LONGOPT('g')}, + {"rf", required_argument, NULL, LONGOPT('g')}, // aka incl-flags + {"keep-tag", required_argument, NULL, LONGOPT('x') }, + {"library", required_argument, NULL, 'l'}, + {"min-mapq", required_argument, NULL, 'q'}, + {"min-MQ", required_argument, NULL, 'q'}, + {"min-mq", required_argument, NULL, 'q'}, + {"min-qlen", required_argument, NULL, 'm'}, + {"no-header", no_argument, NULL, LONGOPT('H')}, + {"no-PG", no_argument, NULL, LONGOPT('P')}, + {"output", required_argument, NULL, 'o'}, + {"output-unselected", required_argument, NULL, 'U'}, + {"QNAME-file", required_argument, NULL, 'N'}, + {"qname-file", required_argument, NULL, 'N'}, + {"read-group", required_argument, NULL, 'r'}, + {"read-group-file", required_argument, NULL, 'R'}, + {"readgroup", required_argument, NULL, 'r'}, + {"readgroup-file", required_argument, NULL, 'R'}, + {"region-file", required_argument, NULL, LONGOPT('L')}, + {"regions-file", required_argument, NULL, LONGOPT('L')}, + {"remove-B", no_argument, NULL, 'B'}, + {"remove-flags", required_argument, NULL, LONGOPT('r')}, + {"remove-tag", required_argument, NULL, 'x'}, + {"require-flags", required_argument, NULL, 'f'}, + {"subsample", required_argument, NULL, LONGOPT('s')}, + {"subsample-seed", required_argument, NULL, LONGOPT('S')}, + {"tag", required_argument, NULL, 'd'}, + {"tag-file", required_argument, NULL, 'D'}, + {"target-file", required_argument, NULL, 'L'}, + {"targets-file", required_argument, NULL, 'L'}, + {"uncompressed", no_argument, NULL, 'u'}, + {"unmap", no_argument, NULL, 'p'}, + {"unoutput", required_argument, NULL, 'U'}, + {"use-index", no_argument, NULL, 'M'}, + {"with-header", no_argument, NULL, 'h'}, + }; + + /* parse command-line options */ + strcpy(out_mode, "w"); + strcpy(out_un_mode, "w"); + if (argc == 1 && isatty(STDIN_FILENO)) + return usage(samtools_stdout, EXIT_SUCCESS, 0); + + // Suppress complaints about '?' being an unrecognised option. Without + // this we have to put '?' in the options list, which makes it hard to + // tell a bad long option from the use of '-?' (both return '?' and + // set optopt to '\0'). + opterr = 0; + + char *tmp; + while ((c = getopt_long(argc, argv, + "SbBcCt:h1Ho:O:q:f:F:G:ul:r:T:R:N:d:D:L:s:@:m:x:U:MXe:pP", + lopts, NULL)) >= 0) { + switch (c) { + case 's': + settings.subsam_seed = strtol(optarg, &tmp, 10); + if (tmp && *tmp == '.') { + settings.subsam_frac = strtod(tmp, &tmp); + if (*tmp) ret = 1; + } else { + ret = 1; + } + + if (ret == 1) { + print_error("view", "Incorrect sampling argument \"%s\"", optarg); + goto view_end; + } + break; + case LONGOPT('s'): + settings.subsam_frac = strtod(optarg, &tmp); + if (*tmp || settings.subsam_frac < 0.0 || settings.subsam_frac > 1.0) { + print_error("view", "Incorrect sampling argument \"%s\"", optarg); + goto view_end; + } + break; + case LONGOPT('S'): settings.subsam_seed = atoi(optarg); break; + case 'm': settings.min_qlen = atoi(optarg); break; + case 'c': settings.is_count = 1; break; + case 'S': break; + case 'b': out_format = "b"; break; + case 'C': out_format = "c"; break; + case 't': settings.fn_fai = strdup(optarg); break; + case 'h': is_header = 1; break; + case 'H': is_header_only = 1; break; + case LONGOPT('H'): is_header = is_header_only = 0; break; + case 'o': settings.fn_out = strdup(optarg); break; + case 'U': settings.fn_un_out = strdup(optarg); break; + case 'X': has_index_file = 1; break; + case 'f': settings.flag_on |= bam_str2flag(optarg); break; + case 'F': settings.flag_off |= bam_str2flag(optarg); break; + case LONGOPT('g'): + settings.flag_anyon |= bam_str2flag(optarg); break; + case 'G': settings.flag_alloff |= bam_str2flag(optarg); break; + case 'q': settings.min_mapQ = atoi(optarg); break; + case 'u': compress_level = 0; break; + case '1': compress_level = 1; break; + case 'l': settings.library = strdup(optarg); break; + case 'p': settings.unmap = 1; break; + case 'P': settings.fetch_pairs = 1; settings.multi_region = 1; break; + case LONGOPT('L'): + settings.multi_region = 1; + // fall through + case 'L': + if ((settings.bed = bed_read(optarg)) == NULL) { + print_error_errno("view", "Could not read file \"%s\"", optarg); + ret = 1; + goto view_end; + } + break; + case 'r': + if (add_read_group_single("view", &settings, optarg) != 0) { + ret = 1; + goto view_end; + } + break; + case 'R': + if (add_read_groups_file("view", &settings, optarg) != 0) { + ret = 1; + goto view_end; + } + break; + case 'N': + if (add_read_names_file("view", &settings, optarg) != 0) { + ret = 1; + goto view_end; + } + break; + case 'd': + if (strlen(optarg) < 2 || (strlen(optarg) > 2 && optarg[2] != ':')) { + print_error_errno("view", "Invalid \"tag:value\" option: \"%s\"", optarg); + ret = 1; + goto view_end; + } + + if (settings.tag) { + if (settings.tag[0] != optarg[0] || settings.tag[1] != optarg[1]) { + print_error("view", "Different tag \"%s\" was specified before: \"%s\"", settings.tag, optarg); + ret = 1; + goto view_end; + } + } else { + if (!(settings.tag = calloc(3, 1))) { + print_error("view", "Could not allocate memory for tag: \"%s\"", optarg); + ret = 1; + goto view_end; + } + memcpy(settings.tag, optarg, 2); + } + + if (strlen(optarg) > 3 && add_tag_value_single("view", &settings, optarg+3) != 0) { + print_error("view", "Could not add tag:value \"%s\"", optarg); + ret = 1; + goto view_end; + } + break; + case 'D': + // Allow ";" as delimiter besides ":" to support MinGW CLI POSIX + // path translation as described at: + // http://www.mingw.org/wiki/Posix_path_conversion + if (strlen(optarg) < 4 || (optarg[2] != ':' && optarg[2] != ';')) { + print_error_errno("view", "Invalid \"tag:file\" option: \"%s\"", optarg); + ret = 1; + goto view_end; + } + + if (settings.tag) { + if (settings.tag[0] != optarg[0] || settings.tag[1] != optarg[1]) { + print_error("view", "Different tag \"%s\" was specified before: \"%s\"", settings.tag, optarg); + ret = 1; + goto view_end; + } + } else { + if (!(settings.tag = calloc(3, 1))) { + print_error("view", "Could not allocate memory for tag: \"%s\"", optarg); + ret = 1; + goto view_end; + } + memcpy(settings.tag, optarg, 2); + } + + if (add_tag_values_file("view", &settings, optarg+3) != 0) { + ret = 1; + goto view_end; + } + break; + case LONGOPT('?'): + return usage(samtools_stdout, EXIT_SUCCESS, 1); + case '?': + if (optopt == '?') { // '-?' appeared on command line + return usage(samtools_stdout, EXIT_SUCCESS, 1); + } else { + if (optopt) { // Bad short option + print_error("view", "invalid option -- '%c'", optopt); + } else { // Bad long option + // Do our best. There is no good solution to finding + // out what the bad option was. + // See, e.g. https://stackoverflow.com/questions/2723888/where-does-getopt-long-store-an-unrecognized-option + if (optind > 0 && strncmp(argv[optind - 1], "--", 2) == 0) { + print_error("view", "unrecognised option '%s'", + argv[optind - 1]); + } + } + return usage(samtools_stderr, EXIT_FAILURE, 0); + } + case 'B': settings.remove_B = 1; break; + + case 'M': settings.multi_region = 1; break; + case LONGOPT('P'): no_pg = 1; break; + case 'e': + if (!(settings.filter = hts_filter_init(optarg))) { + print_error("main_samview", "Couldn't initialise filter"); + return 1; + } + break; + case LONGOPT('r'): settings.remove_flag |= bam_str2flag(optarg); break; + case LONGOPT('a'): settings.add_flag |= bam_str2flag(optarg); break; + + case 'x': + if (*optarg == '^') { + if (parse_aux_list(&settings.keep_tag, optarg+1)) + return usage(samtools_stderr, EXIT_FAILURE, 0); + } else { + if (parse_aux_list(&settings.remove_tag, optarg)) + return usage(samtools_stderr, EXIT_FAILURE, 0); + } + break; + + case LONGOPT('x'): + if (parse_aux_list(&settings.keep_tag, optarg)) + return usage(samtools_stderr, EXIT_FAILURE, 0); + break; + + default: + if (parse_sam_global_opt(c, optarg, lopts, &ga) != 0) + return usage(samtools_stderr, EXIT_FAILURE, 0); + break; + } + } + if (settings.is_count && settings.fetch_pairs) + { + print_error("view","The options -P and -c cannot be combined\n"); + return 1; + } + if (settings.fn_fai == 0 && ga.reference) settings.fn_fai = fai_path(ga.reference); + if (is_header_only) is_header = 1; + // File format auto-detection first + if (settings.fn_out) sam_open_mode(out_mode+1, settings.fn_out, NULL); + if (settings.fn_un_out) sam_open_mode(out_un_mode+1, settings.fn_un_out, NULL); + + // -1 or -u without an explicit format (-b, -C) => check fn extensions + if (!*out_format && compress_level >= 0) { + if (compress_level == 0 && + (out_mode[strlen(out_mode)-1] == 'z' || + out_un_mode[strlen(out_un_mode)-1] == 'z')) + // z, fz, Fz sanity check + fprintf(samtools_stderr, "[view] Warning option -u ignored due to" + " filename suffix\n"); + + // If known extension, use it, otherwise BAM + if (!(out_mode[1] || is_sam(settings.fn_out))) + out_mode[1] = 'b'; + + if (!(out_un_mode[1] || is_sam(settings.fn_un_out))) + out_un_mode[1] = 'b'; + } else if (*out_format) { + out_mode[1] = out_un_mode[1] = *out_format; + } + + if (compress_level >= 0) { + char tmp[2]; + tmp[0] = compress_level + '0'; tmp[1] = '\0'; + strcat(out_mode, tmp); + strcat(out_un_mode, tmp); + } + if (argc == optind && isatty(STDIN_FILENO)) { + print_error("view", "No input provided or missing option argument."); + return usage(samtools_stderr, EXIT_FAILURE, 0); // potential memory leak... + } + + if (settings.unmap && settings.fn_un_out) { + print_error("view", "Options --unoutput and --unmap are mutually exclusive."); + ret = 1; + goto view_end; + } + + if (settings.subsam_seed != 0) { + // Convert likely user input 1,2,... to pseudo-random + // values with more entropy and more bits set + srand(settings.subsam_seed); + settings.subsam_seed = rand(); + } + + settings.fn_in = (optind < argc)? argv[optind] : "-"; + if ((settings.in = sam_open_format(settings.fn_in, "r", &ga.in)) == 0) { + print_error_errno("view", "failed to open \"%s\" for reading", settings.fn_in); + ret = 1; + goto view_end; + } + + if (settings.fn_fai) { + if (hts_set_fai_filename(settings.in, settings.fn_fai) != 0) { + fprintf(samtools_stderr, "[main_samview] failed to use reference \"%s\".\n", settings.fn_fai); + ret = 1; + goto view_end; + } + } + if ((settings.header = sam_hdr_read(settings.in)) == 0) { + fprintf(samtools_stderr, "[main_samview] fail to read the header from \"%s\".\n", settings.fn_in); + ret = 1; + goto view_end; + } + if (settings.rghash) { + sam_hdr_remove_lines(settings.header, "RG", "ID", settings.rghash); + } + if (!settings.is_count) { + if ((settings.out = sam_open_format(settings.fn_out? settings.fn_out : "-", out_mode, &ga.out)) == 0) { + print_error_errno("view", "failed to open \"%s\" for writing", settings.fn_out? settings.fn_out : "standard output"); + ret = 1; + goto view_end; + } + if (settings.fn_fai) { + if (hts_set_fai_filename(settings.out, settings.fn_fai) != 0) { + fprintf(samtools_stderr, "[main_samview] failed to use reference \"%s\".\n", settings.fn_fai); + ret = 1; + goto view_end; + } + } + autoflush_if_stdout(settings.out, settings.fn_out); + + if (!no_pg) { + if (!(arg_list = stringify_argv(argc+1, argv-1))) { + print_error("view", "failed to create arg_list"); + ret = 1; + goto view_end; + } + if (sam_hdr_add_pg(settings.header, "samtools", + "VN", samtools_version(), + arg_list ? "CL": NULL, + arg_list ? arg_list : NULL, + NULL)) { + print_error("view", "failed to add PG line to the header"); + ret = 1; + goto view_end; + } + } + + if (ga.write_index || is_header || + out_mode[1] == 'b' || out_mode[1] == 'c' || + (ga.out.format != sam && ga.out.format != unknown_format)) { + if (sam_hdr_write(settings.out, settings.header) != 0) { + fprintf(samtools_stderr, "[main_samview] failed to write the SAM header\n"); + ret = 1; + goto view_end; + } + } + if (ga.write_index) { + if (!(settings.fn_out_idx = auto_index(settings.out, settings.fn_out, settings.header))) { + ret = 1; + goto view_end; + } + } + + if (settings.fn_un_out) { + if ((settings.un_out = sam_open_format(settings.fn_un_out, out_un_mode, &ga.out)) == 0) { + print_error_errno("view", "failed to open \"%s\" for writing", settings.fn_un_out); + ret = 1; + goto view_end; + } + if (settings.fn_fai) { + if (hts_set_fai_filename(settings.un_out, settings.fn_fai) != 0) { + fprintf(samtools_stderr, "[main_samview] failed to use reference \"%s\".\n", settings.fn_fai); + ret = 1; + goto view_end; + } + } + autoflush_if_stdout(settings.un_out, settings.fn_un_out); + if (ga.write_index || is_header || + out_un_mode[1] == 'b' || out_un_mode[1] == 'c' || + (ga.out.format != sam && ga.out.format != unknown_format)) { + if (sam_hdr_write(settings.un_out, settings.header) != 0) { + fprintf(samtools_stderr, "[main_samview] failed to write the SAM header\n"); + ret = 1; + goto view_end; + } + } + if (ga.write_index) { + if (!(settings.fn_un_out_idx = auto_index(settings.un_out, settings.fn_un_out, settings.header))) { + ret = 1; + goto view_end; + } + } + } + } + else { + if (settings.fn_out) { + fp_out = fopen(settings.fn_out, "w"); + if (fp_out == NULL) { + print_error_errno("view", "can't create \"%s\"", settings.fn_out); + ret = EXIT_FAILURE; + goto view_end; + } + } + settings.unmap = 0; // Not valid in counting mode + } + + if (ga.nthreads > 1) { + if (!(p.pool = hts_tpool_init(ga.nthreads))) { + fprintf(samtools_stderr, "Error creating thread pool\n"); + ret = 1; + goto view_end; + } + hts_set_opt(settings.in, HTS_OPT_THREAD_POOL, &p); + if (settings.out) hts_set_opt(settings.out, HTS_OPT_THREAD_POOL, &p); + } + if (is_header_only) goto view_end; // no need to print alignments + + + // Initialize BAM/CRAM index + char **regs = NULL; + int nregs = 0; + if ( has_index_file && optind < argc - 2 ) regs = &argv[optind+2], nregs = argc - optind - 2, settings.fn_idx_in = argv[optind+1]; + else if ( !has_index_file && optind < argc - 1 ) regs = &argv[optind+1], nregs = argc - optind - 1; + else if ( has_index_file ) + { + print_error("view", "Incorrect number of arguments for -X option. Aborting."); + return 1; + } + if ( settings.fn_idx_in || nregs || settings.multi_region ) + { + settings.hts_idx = settings.fn_idx_in ? sam_index_load2(settings.in, settings.fn_in, settings.fn_idx_in) : sam_index_load(settings.in, settings.fn_in); + if ( !settings.hts_idx ) + { + print_error("view", "Random alignment retrieval only works for indexed SAM.gz, BAM or CRAM files."); + return 1; + } + } + + if ( settings.fetch_pairs ) + { + hts_itr_multi_t *iter = multi_region_init(&settings, regs, nregs); + ret = iter ? fetch_pairs_collect_mates(&settings, iter) : 1; + if (ret) goto view_end; + } + else if ( settings.multi_region ) + { + hts_itr_multi_t *iter = multi_region_init(&settings, regs, nregs); + ret = iter ? multi_region_view(&settings, iter) : 1; + if (ret) goto view_end; + } + else if ( !settings.hts_idx ) // stream through the entire file + { + ret = stream_view(&settings); + if (ret) goto view_end; + } else { // retrieve alignments in specified regions + int i; + for (i = (has_index_file)? optind+2 : optind+1; i < argc; ++i) { + hts_itr_t *iter = sam_itr_querys(settings.hts_idx, settings.header, argv[i]); // parse a region in the format like `chr2:100-200' + if (iter == NULL) { // region invalid or reference name not found + fprintf(samtools_stderr, "[main_samview] region \"%s\" specifies an invalid region or unknown reference. Continue anyway.\n", argv[i]); + continue; + } + // fetch alignments + ret = multi_region_view(&settings, iter); + if (ret) goto view_end; + } + } + + if ( settings.hts_idx ) hts_idx_destroy(settings.hts_idx); + + if (ga.write_index) { + if (sam_idx_save(settings.out) < 0) { + print_error_errno("view", "writing index failed"); + ret = 1; + } + if (settings.un_out && sam_idx_save(settings.un_out) < 0) { + print_error_errno("view", "writing index failed"); + ret = 1; + } + } + +view_end: + if (settings.is_count && ret == 0) { + if (fprintf(settings.fn_out? fp_out : samtools_stdout, "%" PRId64 "\n", settings.count) < 0) { + if (settings.fn_out) print_error_errno("view", "writing to \"%s\" failed", settings.fn_out); + else print_error_errno("view", "writing to standard output failed"); + ret = EXIT_FAILURE; + } + } + + // close files, free and return + if (settings.in) check_sam_close("view", settings.in, settings.fn_in, "standard input", &ret); + if (settings.out) check_sam_close("view", settings.out, settings.fn_out, "standard output", &ret); + if (settings.un_out) check_sam_close("view", settings.un_out, settings.fn_un_out, "file", &ret); + if (fp_out) fclose(fp_out); + + free(settings.fn_fai); free(settings.fn_out); free(settings.library); free(settings.fn_un_out); + sam_global_args_free(&ga); + if ( settings.header ) sam_hdr_destroy(settings.header); + if (settings.bed) bed_destroy(settings.bed); + if (settings.rghash) { + khint_t k; + for (k = 0; k < kh_end(settings.rghash); ++k) + if (kh_exist(settings.rghash, k)) free((char*)kh_key(settings.rghash, k)); + kh_destroy(str, settings.rghash); + } + if (settings.rnhash) { + khint_t k; + for (k = 0; k < kh_end(settings.rnhash); ++k) + if (kh_exist(settings.rnhash, k)) free((char*)kh_key(settings.rnhash, k)); + kh_destroy(str, settings.rnhash); + } + if (settings.tvhash) { + khint_t k; + for (k = 0; k < kh_end(settings.tvhash); ++k) + if (kh_exist(settings.tvhash, k)) free((char*)kh_key(settings.tvhash, k)); + kh_destroy(str, settings.tvhash); + } + + if (settings.remove_aux_len) { + free(settings.remove_aux); + } + if (settings.tag) { + free(settings.tag); + } + if (settings.filter) + hts_filter_free(settings.filter); + + if (p.pool) + hts_tpool_destroy(p.pool); + + if (settings.fn_out_idx) + free(settings.fn_out_idx); + if (settings.fn_un_out_idx) + free(settings.fn_un_out_idx); + free(arg_list); + + if (settings.keep_tag) + kh_destroy(aux_exists, settings.keep_tag); + if (settings.remove_tag) + kh_destroy(aux_exists, settings.remove_tag); + + return ret; +} + +static int usage(FILE *fp, int exit_status, int is_long_help) +{ + fprintf(fp, +"\n" +"Usage: samtools view [options] || [region ...]\n" +"\n" + +"Output options:\n" +" -b, --bam Output BAM\n" +" -C, --cram Output CRAM (requires -T)\n" +" -1, --fast Use fast BAM compression (and default to --bam)\n" +" -u, --uncompressed Uncompressed BAM output (and default to --bam)\n" +" -h, --with-header Include header in SAM output\n" +" -H, --header-only Print SAM header only (no alignments)\n" +" --no-header Print SAM alignment records only [default]\n" +" -c, --count Print only the count of matching records\n" +" -o, --output FILE Write output to FILE [standard output]\n" +" -U, --unoutput FILE, --output-unselected FILE\n" +" Output reads not selected by filters to FILE\n" +" -p, --unmap Set flag to UNMAP on reads not selected\n" +" then write to output file.\n" +" -P, --fetch-pairs Retrieve complete pairs even when outside of region\n" +"Input options:\n" +" -t, --fai-reference FILE FILE listing reference names and lengths\n" +" -M, --use-index Use index and multi-region iterator for regions\n" +" --region[s]-file FILE Use index to include only reads overlapping FILE\n" +" -X, --customized-index Expect extra index file argument after \n" +"\n" +"Filtering options (Only include in output reads that...):\n" +" -L, --target[s]-file FILE ...overlap (BED) regions in FILE\n" +" -r, --read-group STR ...are in read group STR\n" +" -R, --read-group-file FILE ...are in a read group listed in FILE\n" +" -N, --qname-file FILE ...whose read name is listed in FILE\n" +" -d, --tag STR1[:STR2] ...have a tag STR1 (with associated value STR2)\n" +" -D, --tag-file STR:FILE ...have a tag STR whose value is listed in FILE\n" +" -q, --min-MQ INT ...have mapping quality >= INT\n" +" -l, --library STR ...are in library STR\n" +" -m, --min-qlen INT ...cover >= INT query bases (as measured via CIGAR)\n" +" -e, --expr STR ...match the filter expression STR\n" +" -f, --require-flags FLAG ...have all of the FLAGs present\n" // F&x == x +" -F, --excl[ude]-flags FLAG ...have none of the FLAGs present\n" // F&x == 0 +" --rf, --incl-flags, --include-flags FLAG\n" +" ...have some of the FLAGs present\n" +" -G FLAG EXCLUDE reads with all of the FLAGs present\n" // !(F&x == x) TODO long option +" --subsample FLOAT Keep only FLOAT fraction of templates/read pairs\n" +" --subsample-seed INT Influence WHICH reads are kept in subsampling [0]\n" +" -s INT.FRAC Same as --subsample 0.FRAC --subsample-seed INT\n" +"\n" +"Processing options:\n" +" --add-flags FLAG Add FLAGs to reads\n" +" --remove-flags FLAG Remove FLAGs from reads\n" +" -x, --remove-tag STR\n" +" Comma-separated read tags to strip (repeatable) [null]\n" +" --keep-tag STR\n" +" Comma-separated read tags to preserve (repeatable) [null].\n" +" Equivalent to \"-x ^STR\"\n" +" -B, --remove-B Collapse the backward CIGAR operation\n" +"\n" +"General options:\n" +" -?, --help Print long help, including note about region specification\n" +" -S Ignored (input format is auto-detected)\n" +" --no-PG Do not add a PG line\n"); + + sam_global_opt_help(fp, "-.O.T@.."); + fprintf(fp, "\n"); + + if (is_long_help) + fprintf(fp, +"Notes:\n" +"\n" +"1. This command now auto-detects the input format (BAM/CRAM/SAM).\n" +" Further control over the CRAM format can be specified by using the\n" +" --output-fmt-option, e.g. to specify the number of sequences per slice\n" +" and to use avoid reference based compression:\n" +"\n" +"\tsamtools view -C --output-fmt-option seqs_per_slice=5000 \\\n" +"\t --output-fmt-option no_ref -o out.cram in.bam\n" +"\n" +" Options can also be specified as a comma separated list within the\n" +" --output-fmt value too. For example this is equivalent to the above\n" +"\n" +"\tsamtools view --output-fmt cram,seqs_per_slice=5000,no_ref \\\n" +"\t -o out.cram in.bam\n" +"\n" +"2. The file supplied with `-t' is SPACE/TAB delimited with the first\n" +" two fields of each line consisting of the reference name and the\n" +" corresponding sequence length. The `.fai' file generated by \n" +" `samtools faidx' is suitable for use as this file. This may be an\n" +" empty file if reads are unaligned.\n" +"\n" +"3. SAM->BAM conversion: samtools view -bT ref.fa in.sam.gz\n" +"\n" +"4. BAM->SAM conversion: samtools view -h in.bam\n" +"\n" +"5. A region should be presented in one of the following formats:\n" +" `chr1', `chr2:1,000' and `chr3:1000-2,000'. When a region is\n" +" specified, the input alignment file must be a sorted and indexed\n" +" alignment (BAM/CRAM) file.\n" +"\n" +"6. Option `-u' is preferred over `-b' when the output is piped to\n" +" another samtools command.\n" +"\n" +"7. Option `-M`/`--use-index` causes overlaps with `-L` BED file regions and\n" +" command-line region arguments to be computed using the multi-region iterator\n" +" and an index. This increases speed, omits duplicates, and outputs the reads\n" +" as they are ordered in the input SAM/BAM/CRAM file.\n" +"\n" +"8. Options `-L`/`--target[s]-file` and `--region[s]-file` may not be used\n" +" together. `--region[s]-file FILE` is simply equivalent to `-M -L FILE`,\n" +" so using both causes one of the specified BED files to be ignored.\n" +"\n"); + + return exit_status; +} + +static int head_usage(FILE *fp, int exit_status) +{ + fprintf(fp, +"Usage: samtools head [OPTION]... [FILE]\n" +"Options:\n" +" -h, --headers INT Display INT header lines [all]\n" +" -n, --records INT Display INT alignment record lines [none]\n" +); + sam_global_opt_help(fp, "-.--T@-."); + return exit_status; +} + +int main_head(int argc, char *argv[]) +{ + static const struct option lopts[] = { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 'T', '@'), + { "headers", required_argument, NULL, 'h' }, + { "records", required_argument, NULL, 'n' }, + { NULL, 0, NULL, 0 } + }; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + int all_headers = 1; + uint64_t nheaders = 0; + uint64_t nrecords = 0; + + int c, nargs; + while ((c = getopt_long(argc, argv, "h:n:T:@:", lopts, NULL)) >= 0) + switch (c) { + case 'h': all_headers = 0; nheaders = strtoull(optarg, NULL, 0); break; + case 'n': nrecords = strtoull(optarg, NULL, 0); break; + default: + if (parse_sam_global_opt(c, optarg, lopts, &ga) == 0) break; + /* else fall-through */ + case '?': + return head_usage(samtools_stderr, EXIT_FAILURE); + } + + nargs = argc - optind; + if (nargs == 0 && isatty(STDIN_FILENO)) + return head_usage(samtools_stdout, EXIT_SUCCESS); + else if (nargs > 1) + return head_usage(samtools_stderr, EXIT_FAILURE); + + samFile *fp = NULL; + sam_hdr_t *hdr = NULL; + kstring_t str = KS_INITIALIZE; + bam1_t *b = NULL; + + const char *fname = (nargs == 1)? argv[optind] : "-"; + fp = sam_open_format(fname, "r", &ga.in); + if (fp == NULL) { + if (strcmp(fname, "-") != 0) + print_error_errno("head", "failed to open \"%s\" for reading", fname); + else + print_error_errno("head", "failed to open standard input for reading"); + goto err; + } + + if (ga.nthreads > 0) hts_set_threads(fp, ga.nthreads); + + hdr = sam_hdr_read(fp); + if (hdr == NULL) { + if (strcmp(fname, "-") != 0) + print_error("head", "failed to read the header from \"%s\"", fname); + else + print_error("head", "failed to read the header"); + goto err; + } + + if (all_headers) { + fputs(sam_hdr_str(hdr), samtools_stdout); + } + else if (nheaders > 0) { + const char *text = sam_hdr_str(hdr); + const char *lim = text; + uint64_t n; + for (n = 0; n < nheaders; n++) { + lim = strchr(lim, '\n'); + if (lim) lim++; + else break; + } + if (lim) fwrite(text, lim - text, 1, samtools_stdout); + else fputs(text, samtools_stdout); + } + + if (nrecords > 0) { + b = bam_init1(); + uint64_t n; + int r; + for (n = 0; n < nrecords && (r = sam_read1(fp, hdr, b)) >= 0; n++) { + if (sam_format1(hdr, b, &str) < 0) { + print_error_errno("head", "couldn't format record"); + goto err; + } + samtools_puts(ks_str(&str)); + } + if (r < -1) { + print_error("head", "\"%s\" is truncated", fname); + goto err; + } + bam_destroy1(b); + ks_free(&str); + } + + sam_hdr_destroy(hdr); + sam_close(fp); + sam_global_args_free(&ga); + + return EXIT_SUCCESS; + +err: + if (fp) sam_close(fp); + sam_hdr_destroy(hdr); + bam_destroy1(b); + ks_free(&str); + sam_global_args_free(&ga); + return EXIT_FAILURE; +} diff --git a/samtools/sample.c b/samtools/sample.c new file mode 100644 index 0000000..4cc89ce --- /dev/null +++ b/samtools/sample.c @@ -0,0 +1,134 @@ +/* sample.c -- group data by sample. + + Copyright (C) 2010, 2011 Broad Institute. + Copyright (C) 2013 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include "sample.h" +#include "htslib/khash.h" +KHASH_MAP_INIT_STR(sm, int) + +bam_sample_t *bam_smpl_init(void) +{ + bam_sample_t *s; + s = calloc(1, sizeof(bam_sample_t)); + s->rg2smid = kh_init(sm); + s->sm2id = kh_init(sm); + return s; +} + +void bam_smpl_destroy(bam_sample_t *sm) +{ + int i; + khint_t k; + khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid; + if (sm == 0) return; + for (i = 0; i < sm->n; ++i) free(sm->smpl[i]); + free(sm->smpl); + for (k = kh_begin(rg2smid); k != kh_end(rg2smid); ++k) + if (kh_exist(rg2smid, k)) free((char*)kh_key(rg2smid, k)); + kh_destroy(sm, sm->rg2smid); + kh_destroy(sm, sm->sm2id); + free(sm); +} + +static void add_pair(bam_sample_t *sm, khash_t(sm) *sm2id, const char *key, const char *val) +{ + khint_t k_rg, k_sm; + int ret; + khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid; + k_rg = kh_get(sm, rg2smid, key); + if (k_rg != kh_end(rg2smid)) return; // duplicated @RG-ID + k_rg = kh_put(sm, rg2smid, strdup(key), &ret); + k_sm = kh_get(sm, sm2id, val); + if (k_sm == kh_end(sm2id)) { // absent + if (sm->n == sm->m) { + sm->m = sm->m? sm->m<<1 : 1; + sm->smpl = realloc(sm->smpl, sizeof(char*) * sm->m); + } + sm->smpl[sm->n] = strdup(val); + k_sm = kh_put(sm, sm2id, sm->smpl[sm->n], &ret); + kh_val(sm2id, k_sm) = sm->n++; + } + kh_val(rg2smid, k_rg) = kh_val(sm2id, k_sm); +} + +int bam_smpl_add(bam_sample_t *sm, const char *fn, const char *txt) +{ + const char *p = txt, *q, *r; + kstring_t buf, first_sm; + int n = 0; + khash_t(sm) *sm2id = (khash_t(sm)*)sm->sm2id; + if (txt == 0) { + add_pair(sm, sm2id, fn, fn); + return 0; + } + memset(&buf, 0, sizeof(kstring_t)); + memset(&first_sm, 0, sizeof(kstring_t)); + while ((q = strstr(p, "@RG")) != 0) { + p = q + 3; + r = q = 0; + if ((q = strstr(p, "\tID:")) != 0) q += 4; + if ((r = strstr(p, "\tSM:")) != 0) r += 4; + if (r && q) { + char *u, *v; + int oq, or; + for (u = (char*)q; *u && *u != '\t' && *u != '\n'; ++u); + for (v = (char*)r; *v && *v != '\t' && *v != '\n'; ++v); + oq = *u; or = *v; *u = *v = '\0'; + buf.l = 0; kputs(fn, &buf); kputc('/', &buf); kputs(q, &buf); + add_pair(sm, sm2id, buf.s, r); + if ( !first_sm.s ) + kputs(r,&first_sm); + *u = oq; *v = or; + } else break; + p = q > r? q : r; + ++n; + } + if (n == 0) add_pair(sm, sm2id, fn, fn); + // If there is only one RG tag present in the header and reads are not annotated, don't refuse to work but + // use the tag instead. + else if ( n==1 && first_sm.s ) + add_pair(sm,sm2id,fn,first_sm.s); + if ( first_sm.s ) + free(first_sm.s); + +// add_pair(sm, sm2id, fn, fn); + free(buf.s); + return 0; +} + +int bam_smpl_rg2smid(const bam_sample_t *sm, const char *fn, const char *rg, kstring_t *str) +{ + khint_t k; + khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid; + if (rg) { + str->l = 0; + kputs(fn, str); kputc('/', str); kputs(rg, str); + k = kh_get(sm, rg2smid, str->s); + } else k = kh_get(sm, rg2smid, fn); + return k == kh_end(rg2smid)? -1 : kh_val(rg2smid, k); +} diff --git a/samtools/sample.c.pysam.c b/samtools/sample.c.pysam.c new file mode 100644 index 0000000..8b39a90 --- /dev/null +++ b/samtools/sample.c.pysam.c @@ -0,0 +1,136 @@ +#include "samtools.pysam.h" + +/* sample.c -- group data by sample. + + Copyright (C) 2010, 2011 Broad Institute. + Copyright (C) 2013 Genome Research Ltd. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include +#include "sample.h" +#include "htslib/khash.h" +KHASH_MAP_INIT_STR(sm, int) + +bam_sample_t *bam_smpl_init(void) +{ + bam_sample_t *s; + s = calloc(1, sizeof(bam_sample_t)); + s->rg2smid = kh_init(sm); + s->sm2id = kh_init(sm); + return s; +} + +void bam_smpl_destroy(bam_sample_t *sm) +{ + int i; + khint_t k; + khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid; + if (sm == 0) return; + for (i = 0; i < sm->n; ++i) free(sm->smpl[i]); + free(sm->smpl); + for (k = kh_begin(rg2smid); k != kh_end(rg2smid); ++k) + if (kh_exist(rg2smid, k)) free((char*)kh_key(rg2smid, k)); + kh_destroy(sm, sm->rg2smid); + kh_destroy(sm, sm->sm2id); + free(sm); +} + +static void add_pair(bam_sample_t *sm, khash_t(sm) *sm2id, const char *key, const char *val) +{ + khint_t k_rg, k_sm; + int ret; + khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid; + k_rg = kh_get(sm, rg2smid, key); + if (k_rg != kh_end(rg2smid)) return; // duplicated @RG-ID + k_rg = kh_put(sm, rg2smid, strdup(key), &ret); + k_sm = kh_get(sm, sm2id, val); + if (k_sm == kh_end(sm2id)) { // absent + if (sm->n == sm->m) { + sm->m = sm->m? sm->m<<1 : 1; + sm->smpl = realloc(sm->smpl, sizeof(char*) * sm->m); + } + sm->smpl[sm->n] = strdup(val); + k_sm = kh_put(sm, sm2id, sm->smpl[sm->n], &ret); + kh_val(sm2id, k_sm) = sm->n++; + } + kh_val(rg2smid, k_rg) = kh_val(sm2id, k_sm); +} + +int bam_smpl_add(bam_sample_t *sm, const char *fn, const char *txt) +{ + const char *p = txt, *q, *r; + kstring_t buf, first_sm; + int n = 0; + khash_t(sm) *sm2id = (khash_t(sm)*)sm->sm2id; + if (txt == 0) { + add_pair(sm, sm2id, fn, fn); + return 0; + } + memset(&buf, 0, sizeof(kstring_t)); + memset(&first_sm, 0, sizeof(kstring_t)); + while ((q = strstr(p, "@RG")) != 0) { + p = q + 3; + r = q = 0; + if ((q = strstr(p, "\tID:")) != 0) q += 4; + if ((r = strstr(p, "\tSM:")) != 0) r += 4; + if (r && q) { + char *u, *v; + int oq, or; + for (u = (char*)q; *u && *u != '\t' && *u != '\n'; ++u); + for (v = (char*)r; *v && *v != '\t' && *v != '\n'; ++v); + oq = *u; or = *v; *u = *v = '\0'; + buf.l = 0; kputs(fn, &buf); kputc('/', &buf); kputs(q, &buf); + add_pair(sm, sm2id, buf.s, r); + if ( !first_sm.s ) + kputs(r,&first_sm); + *u = oq; *v = or; + } else break; + p = q > r? q : r; + ++n; + } + if (n == 0) add_pair(sm, sm2id, fn, fn); + // If there is only one RG tag present in the header and reads are not annotated, don't refuse to work but + // use the tag instead. + else if ( n==1 && first_sm.s ) + add_pair(sm,sm2id,fn,first_sm.s); + if ( first_sm.s ) + free(first_sm.s); + +// add_pair(sm, sm2id, fn, fn); + free(buf.s); + return 0; +} + +int bam_smpl_rg2smid(const bam_sample_t *sm, const char *fn, const char *rg, kstring_t *str) +{ + khint_t k; + khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid; + if (rg) { + str->l = 0; + kputs(fn, str); kputc('/', str); kputs(rg, str); + k = kh_get(sm, rg2smid, str->s); + } else k = kh_get(sm, rg2smid, fn); + return k == kh_end(rg2smid)? -1 : kh_val(rg2smid, k); +} diff --git a/samtools/sample.h b/samtools/sample.h new file mode 100644 index 0000000..8e8efa5 --- /dev/null +++ b/samtools/sample.h @@ -0,0 +1,41 @@ +/* sample.h -- group data by sample. + + Copyright (C) 2010 Broad Institute. + + Author: Heng Li + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef BAM_SAMPLE_H +#define BAM_SAMPLE_H + +#include "htslib/kstring.h" + +typedef struct { + int n, m; + char **smpl; + void *rg2smid, *sm2id; +} bam_sample_t; + +bam_sample_t *bam_smpl_init(void); +int bam_smpl_add(bam_sample_t *sm, const char *abs, const char *txt); +int bam_smpl_rg2smid(const bam_sample_t *sm, const char *fn, const char *rg, kstring_t *str); +void bam_smpl_destroy(bam_sample_t *sm); + +#endif diff --git a/samtools/samtools.h b/samtools/samtools.h new file mode 100644 index 0000000..e0f99c2 --- /dev/null +++ b/samtools/samtools.h @@ -0,0 +1,62 @@ +/* samtools.h -- utility routines. + + Copyright (C) 2013-2015, 2019 Genome Research Ltd. + + Author: Petr Danecek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#ifndef SAMTOOLS_H +#define SAMTOOLS_H + +#include "htslib/hts_defs.h" +#include "htslib/sam.h" + +const char *samtools_version(void); + +#define CHECK_PRINTF(fmt,args) HTS_FORMAT(HTS_PRINTF_FMT, (fmt), (args)) + +void print_error(const char *subcommand, const char *format, ...) CHECK_PRINTF(2, 3); +void print_error_errno(const char *subcommand, const char *format, ...) CHECK_PRINTF(2, 3); + +void check_sam_close(const char *subcmd, samFile *fp, const char *fname, const char *null_fname, int *retp); + +/* Utility functions to register an output htsFile/samFile/vcfFile that + * might be stdout. If FNAME is "-" or NULL, records FP so that print_error() + * et al can automatically flush it before printing an error message. + */ +void autoflush_if_stdout(htsFile *fp, const char *fname); + +/* Call this before closing FP; check_sam_close() does this automatically. + */ +void release_autoflush(htsFile *fp); + +/* + * Utility function to add an index to a file we've opened for write. + * NB: Call this after writing the header and before writing sequences. + * + * The returned index filename should be freed by the caller, but only + * after sam_idx_save has been called. + * + * Returns index filename on success, + * NULL on failure. + */ +char *auto_index(htsFile *fp, const char *fn, bam_hdr_t *header); + +#endif diff --git a/samtools/samtools.pysam.c b/samtools/samtools.pysam.c new file mode 100644 index 0000000..10740a4 --- /dev/null +++ b/samtools/samtools.pysam.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include + +#include "samtools.pysam.h" + +FILE * samtools_stderr = NULL; +FILE * samtools_stdout = NULL; +const char * samtools_stdout_fn = NULL; + + +FILE * samtools_set_stderr(int fd) +{ + if (samtools_stderr != NULL) + fclose(samtools_stderr); + samtools_stderr = fdopen(fd, "w"); + return samtools_stderr; +} + +void samtools_close_stderr(void) +{ + fclose(samtools_stderr); + samtools_stderr = NULL; +} + +FILE * samtools_set_stdout(int fd) +{ + if (samtools_stdout != NULL) + fclose(samtools_stdout); + samtools_stdout = fdopen(fd, "w"); + if (samtools_stdout == NULL) + { + fprintf(samtools_stderr, "could not set stdout to fd %i", fd); + } + return samtools_stdout; +} + +void samtools_set_stdout_fn(const char *fn) +{ + samtools_stdout_fn = fn; +} + +void samtools_close_stdout(void) +{ + fclose(samtools_stdout); + samtools_stdout = NULL; +} + +int samtools_puts(const char *s) +{ + if (fputs(s, samtools_stdout) == EOF) return EOF; + return putc('\n', samtools_stdout); +} + + +static jmp_buf samtools_jmpbuf; +static int samtools_status = 0; + +int samtools_dispatch(int argc, char *argv[]) +{ + /* Reset getopt()/getopt_long() processing. */ +#if defined __GLIBC__ + optind = 0; +#elif defined _OPTRESET || defined _OPTRESET_DECLARED + optreset = optind = 1; +#else + optind = 1; +#endif + + if (setjmp(samtools_jmpbuf) == 0) + return samtools_main(argc, argv); + else + return samtools_status; +} + +void samtools_exit(int status) +{ + samtools_status = status; + longjmp(samtools_jmpbuf, 1); +} diff --git a/samtools/samtools.pysam.h b/samtools/samtools.pysam.h new file mode 100644 index 0000000..cb63b60 --- /dev/null +++ b/samtools/samtools.pysam.h @@ -0,0 +1,74 @@ +#ifndef samtools_PYSAM_H +#define samtools_PYSAM_H + +#include + +#ifndef __has_attribute +#define __has_attribute(attribute) 0 +#endif +#ifndef PYSAM_NORETURN +#if __has_attribute(__noreturn__) || __GNUC__ >= 3 +#define PYSAM_NORETURN __attribute__((__noreturn__)) +#else +#define PYSAM_NORETURN +#endif +#endif + +extern FILE * samtools_stderr; + +extern FILE * samtools_stdout; + +extern const char * samtools_stdout_fn; + +/*! set pysam standard error to point to file descriptor + + Setting the stderr will close the previous stderr. + */ +FILE * samtools_set_stderr(int fd); + +/*! set pysam standard output to point to file descriptor + + Setting the stdout will close the previous stdout. + */ +FILE * samtools_set_stdout(int fd); + +/*! set pysam standard output to point to filename + + */ +void samtools_set_stdout_fn(const char * fn); + +/*! close pysam standard error and set to NULL + + */ +void samtools_close_stderr(void); + +/*! close pysam standard output and set to NULL + + */ +void samtools_close_stdout(void); + +int samtools_puts(const char *s); + +int samtools_dispatch(int argc, char *argv[]); + +void PYSAM_NORETURN samtools_exit(int status); + +extern int samtools_main(int argc, char *argv[]); + +/* Define these only in samtools/bcftools C source, not Cython code. */ +#if !(defined CYTHON_ABI || defined CYTHON_HEX_VERSION) + +/*! Several non-static function names are used in both samtools and bcftools. + Both libcsamtools.so and libcbcftools.so are loaded simultaneously, leading + to collisions and wrong functions being called. #define these names so the + actual symbol names include distinct prefixes to avoid collisions. + */ +#define main_consensus samtools_main_consensus +#define main_reheader samtools_main_reheader +#define bam_smpl_init samtools_bam_smpl_init +#define bam_smpl_destroy samtools_bam_smpl_destroy +#define read_file_list samtools_read_file_list + +#endif + +#endif diff --git a/samtools/splaysort.h b/samtools/splaysort.h new file mode 100644 index 0000000..af83533 --- /dev/null +++ b/samtools/splaysort.h @@ -0,0 +1,200 @@ +/* The MIT License + + Copyright (c) 2021 Genome Research Ltd (GRL). + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef SPLAYSORT_H +#define SPLAYSORT_H + +#define SPLAYSORT_INIT(name, type_t, __sort_lt) \ + typedef struct splaynode_##name { \ + type_t value; \ + struct splaynode_##name *left; \ + struct splaynode_##name *right; \ + struct splaynode_##name *parent; \ + } splaynode_##name; \ + \ + void rotate_left_##name(splaynode_##name *node); \ + void rotate_right_##name(splaynode_##name *node); \ + int splay_sort_##name(size_t n, type_t array[] ); \ + int splay_flatten_##name(splaynode_##name *node, type_t dest[], size_t n);\ + splaynode_##name *splay_tree_##name(splaynode_##name *node); \ + splaynode_##name *splay_insert_##name(splaynode_##name *node, \ + type_t value, \ + splaynode_##name *node_ptr); \ + \ + void rotate_left_##name(splaynode_##name *node) { \ + splaynode_##name *parent = node->parent; \ + splaynode_##name *grandparent = parent->parent; \ + parent->right = node->left; \ + if (node->left != NULL) { \ + node->left->parent = parent; \ + } \ + node->left = parent; \ + parent->parent = node; \ + node->parent = grandparent; \ + \ + if (grandparent != NULL) { \ + if (grandparent->left == parent) { \ + grandparent->left = node; \ + } else { \ + grandparent->right = node; \ + } \ + } \ + } \ + \ + void rotate_right_##name(splaynode_##name *node) { \ + splaynode_##name *parent = node->parent; \ + splaynode_##name *grandparent = parent->parent; \ + parent->left = node->right; \ + \ + if (node->right != NULL) { \ + node->right->parent = parent; \ + } \ + node->right = parent; \ + parent->parent = node; \ + node->parent = grandparent; \ + \ + if (grandparent != NULL) { \ + if (grandparent->left == parent) { \ + grandparent->left = node; \ + } else { \ + grandparent->right = node; \ + } \ + } \ + } \ + int splay_sort_##name(size_t n, type_t array[] ) { \ + if (n < 1) { \ + return 0; \ + } \ + int i; \ + splaynode_##name *node_pool = malloc(sizeof(splaynode_##name) * n); \ + if (node_pool == NULL) return -1; \ + splaynode_##name *head = node_pool; \ + head->value = array[0]; \ + head->left = NULL; head->right = NULL; head->parent = NULL; \ + for (i = 1; i < n; i++) { \ + head = splay_insert_##name(head, array[i], node_pool + i ); \ + } \ + \ + if (splay_flatten_##name(head, array, n) == -1) { \ + free(node_pool); \ + return -1; \ + } \ + free(node_pool); \ + return 0; \ + } \ + \ + int splay_flatten_##name(splaynode_##name *head, type_t *dest, size_t n) {\ + int sp = 0, i = 0; \ + splaynode_##name *current = head; \ + splaynode_##name **stack = malloc(sizeof(current)*n); \ + if (stack == NULL) return -1; \ + \ + do { \ + while (current != NULL && sp < n) { \ + stack[sp++] = current; \ + current = current->left; \ + } \ + if (sp != 0) { \ + sp--; \ + dest[i++] = stack[sp]->value; \ + current = stack[sp]->right; \ + } \ + } while (!(current == NULL && sp == 0)); \ + \ + free(stack); \ + return 0; \ + } \ + splaynode_##name *splay_insert_##name(splaynode_##name *head, \ + type_t value, \ + splaynode_##name *node_ptr) { \ + splaynode_##name *parent = NULL; \ + while (head != NULL) { \ + parent = head; \ + if (__sort_lt(value, head->value)) { \ + head = head->left; \ + } else { \ + head = head->right; \ + } \ + } \ + splaynode_##name *new_node = node_ptr; \ + new_node->value = value; \ + new_node->left = NULL; \ + new_node->right = NULL; \ + new_node->parent = parent; \ + if (parent) { \ + if (__sort_lt(value, parent->value)) { \ + parent->left = new_node; \ + } else { \ + parent->right = new_node; \ + } \ + } \ + new_node = splay_tree_##name(new_node); \ + return new_node; \ + } \ + \ + splaynode_##name *splay_tree_##name(splaynode_##name *node) { \ + splaynode_##name *parent = node->parent; \ + \ + if (node->parent == NULL) { \ + return node; \ + } \ + if (node == parent->left) { \ + if (parent->parent == NULL) { \ + /* zig */ \ + rotate_right_##name(node); \ + } else if (parent->parent->left == parent) { \ + /* left zig zig */ \ + rotate_right_##name(node); \ + rotate_right_##name(node); \ + } else { \ + /* right left zig zag */ \ + rotate_right_##name(node); \ + rotate_left_##name(node); \ + } \ + } else { \ + if (parent->parent == NULL) { \ + /* zig */ \ + rotate_left_##name(node); \ + } else if (parent->parent->right == parent) { \ + /* right zig zig */ \ + rotate_left_##name(node); \ + rotate_left_##name(node); \ + } else { \ + /* left right zig zag */ \ + rotate_left_##name(node); \ + rotate_right_##name(node); \ + } \ + } \ + \ + if (node->parent != NULL) { \ + return splay_tree_##name(node); \ + } \ + return node; \ + } \ + + +#define splaysort(name, n, array) splay_sort_##name(n, array) + +#endif diff --git a/samtools/stats.c b/samtools/stats.c new file mode 100644 index 0000000..55a6465 --- /dev/null +++ b/samtools/stats.c @@ -0,0 +1,2578 @@ +/* stats.c -- This is the former bamcheck integrated into samtools/htslib. + + Copyright (C) 2012-2021 Genome Research Ltd. + + Author: Petr Danecek + Author: Sam Nicholls + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* Assumptions, approximations and other issues: + - GC-depth graph does not split reads, the starting position determines which bin is incremented. + There are small overlaps between bins (max readlen-1). However, the bins are big (20k). + - coverage distribution ignores softclips and deletions + - some stats require sorted BAMs + - GC content graph can have an untidy, step-like pattern when BAM contains multiple read lengths. + - 'bases mapped' (stats->nbases_mapped) is calculated from read lengths given by BAM (core.l_qseq) + - With the -t option, the whole reads are used. Except for the number of mapped bases (cigar) + counts, no splicing is done, no indels or soft clips are considered, even small overlap is + good enough to include the read in the stats. + - GC content of reads not calculated for "=" sequences + +*/ + +#include + +#include // for isatty() +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // for crc32 +#include +#include +#include +#include +#include "samtools.h" +#include +#include +#include "stats_isize.h" +#include "sam_opts.h" +#include "bedidx.h" + +#define BWA_MIN_RDLEN 35 +#define DEFAULT_CHUNK_NO 8 +#define DEFAULT_PAIR_MAX 10000 +#define ERROR_LIMIT 200 +// From the spec +// If 0x4 is set, no assumptions can be made about RNAME, POS, CIGAR, MAPQ, bits 0x2, 0x10, 0x100 and 0x800, and the bit 0x20 of the previous read in the template. +#define IS_PAIRED(bam) ((bam)->core.flag&BAM_FPAIRED) +#define IS_PAIRED_AND_MAPPED(bam) (((bam)->core.flag&BAM_FPAIRED) && !((bam)->core.flag&BAM_FUNMAP) && !((bam)->core.flag&BAM_FMUNMAP)) +#define IS_PROPERLYPAIRED(bam) (((bam)->core.flag&(BAM_FPAIRED|BAM_FPROPER_PAIR)) == (BAM_FPAIRED|BAM_FPROPER_PAIR) && !((bam)->core.flag&BAM_FUNMAP)) +#define IS_UNMAPPED(bam) ((bam)->core.flag&BAM_FUNMAP) +#define IS_REVERSE(bam) ((bam)->core.flag&BAM_FREVERSE) +#define IS_MATE_REVERSE(bam) ((bam)->core.flag&BAM_FMREVERSE) +#define IS_READ1(bam) ((bam)->core.flag&BAM_FREAD1) +#define IS_READ2(bam) ((bam)->core.flag&BAM_FREAD2) +#define IS_DUP(bam) ((bam)->core.flag&BAM_FDUP) +#define IS_ORIGINAL(bam) (((bam)->core.flag&(BAM_FSECONDARY|BAM_FSUPPLEMENTARY)) == 0) + +#define READ_ORDER_NONE 0 +#define READ_ORDER_FIRST 1 +#define READ_ORDER_LAST 2 +#define READ_ORDER_MIDDLE 3 + +#define REG_INC 100 +#define POS_INC 1000 + +// The GC-depth graph works as follows: split the reference sequence into +// segments and calculate GC content and depth in each bin. Then sort +// these segments by their GC and plot the depth distribution by means +// of 10th, 25th, etc. depth percentiles. +typedef struct +{ + float gc; + uint32_t depth; +} +gc_depth_t; + +// For coverage distribution, a simple pileup +typedef struct +{ + hts_pos_t pos; + int size, start; + int *buffer; +} +round_buffer_t; + +typedef struct +{ + int npos, mpos, cpos; + hts_pair_pos_t *pos; +} +regions_t; + +typedef struct +{ + uint64_t a; + uint64_t c; + uint64_t g; + uint64_t t; + uint64_t n; + uint64_t other; +} +acgtno_count_t; + +typedef struct +{ + char tag_name[3]; + char qual_name[3]; + uint32_t nbases; + int32_t tag_sep; // Index of the separator (if present) + int32_t max_qual; + uint32_t offset; // Where the tag stats info is located in the allocated memory +} +barcode_info_t; + +typedef struct +{ + // Auxiliary data + int flag_require, flag_filter; + faidx_t *fai; // Reference sequence for GC-depth graph + int argc; // Command line arguments to be printed on the output + char **argv; + int gcd_bin_size; // The size of GC-depth bin + int nisize; // The maximum insert size that the allocated array can hold - 0 indicates no limit + int trim_qual; // bwa trim quality + float isize_main_bulk; // There are always some unrealistically big insert sizes, report only the main part + int cov_min,cov_max,cov_step; // Minimum, maximum coverage and size of the coverage bins + samFile* sam; + sam_hdr_t* sam_header; + + // Filters + int filter_readlen; + + // Misc + char *split_tag; // Tag on which to perform stats splitting + char *split_prefix; // Path or string prefix for filenames created when splitting + int remove_overlaps; + int cov_threshold; +} +stats_info_t; + +typedef struct +{ + // Dimensions of the quality histogram holder (quals_1st,quals_2nd), GC content holder (gc_1st,gc_2nd), + // insert size histogram holder + int nquals; // The number of quality bins + int nbases; // The maximum sequence length the allocated array can hold + int ngc; // The size of gc_1st and gc_2nd + int nindels; // The maximum indel length for indel distribution + + // Arrays for the histogram data + uint64_t *quals_1st, *quals_2nd; + uint64_t *gc_1st, *gc_2nd; + acgtno_count_t *acgtno_cycles_1st, *acgtno_cycles_2nd; + acgtno_count_t *acgtno_revcomp; + uint64_t *read_lengths, *read_lengths_1st, *read_lengths_2nd; + uint64_t *insertions, *deletions; + uint64_t *ins_cycles_1st, *ins_cycles_2nd, *del_cycles_1st, *del_cycles_2nd; + isize_t *isize; + + // The extremes encountered + int max_len; // Maximum read length + int max_len_1st; // Maximum read length for forward reads + int max_len_2nd; // Maximum read length for reverse reads + int max_qual; // Maximum quality + int is_sorted; + + // Summary numbers + uint64_t total_len; + uint64_t total_len_1st; + uint64_t total_len_2nd; + uint64_t total_len_dup; + uint64_t nreads_1st; + uint64_t nreads_2nd; + uint64_t nreads_other; + uint64_t nreads_filtered; + uint64_t nreads_dup; + uint64_t nreads_unmapped; + uint64_t nreads_single_mapped; + uint64_t nreads_paired_and_mapped; + uint64_t nreads_properly_paired; + uint64_t nreads_paired_tech; + uint64_t nreads_anomalous; + uint64_t nreads_mq0; + uint64_t nbases_mapped; + uint64_t nbases_mapped_cigar; + uint64_t nbases_trimmed; // bwa trimmed bases + uint64_t nmismatches; + uint64_t nreads_QCfailed, nreads_secondary, nreads_supplementary; + struct { + uint32_t names, reads, quals; + } checksum; + + // GC-depth related data + uint32_t ngcd, igcd; // The maximum number of GC depth bins and index of the current bin + gc_depth_t *gcd; // The GC-depth bins holder + int32_t tid; // Position of the current bin + hts_pos_t gcd_pos, pos; // Position of the last read + + // Coverage distribution related data + int ncov; // The number of coverage bins + uint64_t *cov; // The coverage frequencies + round_buffer_t cov_rbuf; // Pileup round buffer + + // Mismatches by read cycle + uint8_t *rseq_buf; // A buffer for reference sequence to check the mismatches against + int mrseq_buf; // The size of the buffer + hts_pos_t rseq_pos; // The coordinate of the first base in the buffer + int64_t nrseq_buf; // The used part of the buffer + uint64_t *mpc_buf; // Mismatches per cycle + + // Target regions + int nregions; + hts_pos_t reg_from, reg_to; + regions_t *regions; + + // Auxiliary data + double sum_qual; // For calculating average quality value + void *rg_hash; // Read groups to include, the array is null-terminated + + // Split + char* split_name; + + stats_info_t* info; // Pointer to options and settings struct + hts_pair_pos_t *chunks; + uint32_t nchunks; + + uint32_t pair_count; // Number of active pairs in the pairing hash table + uint64_t target_count; // Number of bases covered by the target file + uint32_t last_pair_tid; + uint32_t last_read_flush; + + // Barcode statistics + acgtno_count_t *acgtno_barcode; + uint64_t *quals_barcode; + barcode_info_t *tags_barcode; + uint32_t ntags; + uint32_t error_number; +} +stats_t; +KHASH_MAP_INIT_STR(c2stats, stats_t*) + +typedef struct { + uint32_t first; // 1 - first read, 2 - second read + uint32_t n, m; // number of chunks, allocated chunks + hts_pair_pos_t *chunks; // chunk array of size m +} pair_t; +KHASH_MAP_INIT_STR(qn2pair, pair_t*) + +KHASH_SET_INIT_STR(rg) + + +static void HTS_NORETURN error(const char *format, ...); +int is_in_regions(bam1_t *bam_line, stats_t *stats); +void realloc_buffers(stats_t *stats, int seq_len); + +static int regions_lt(const void *r1, const void *r2) { + int64_t from_diff = ((hts_pair_pos_t *)r1)->beg - ((hts_pair_pos_t *)r2)->beg; + int64_t to_diff = ((hts_pair_pos_t *)r1)->end - ((hts_pair_pos_t *)r2)->end; + + return from_diff > 0 ? 1 : from_diff < 0 ? -1 : to_diff > 0 ? 1 : to_diff < 0 ? -1 : 0; +} + +// Coverage distribution methods +static inline int coverage_idx(int min, int max, int n, int step, int depth) +{ + if ( depth < min ) + return 0; + + if ( depth > max ) + return n-1; + + return 1 + (depth - min) / step; +} + +static inline int round_buffer_lidx2ridx(int offset, int size, hts_pos_t refpos, hts_pos_t pos) +{ + return (offset + (pos-refpos) % size) % size; +} + +void round_buffer_flush(stats_t *stats, hts_pos_t pos) +{ + int ibuf,idp; + + if ( pos==stats->cov_rbuf.pos ) + return; + + hts_pos_t new_pos = pos; + if ( pos==-1 || pos - stats->cov_rbuf.pos >= stats->cov_rbuf.size ) + { + // Flush the whole buffer, but in sequential order, + pos = stats->cov_rbuf.pos + stats->cov_rbuf.size - 1; + } + + if ( pos < stats->cov_rbuf.pos ) + error("Expected coordinates in ascending order, got %"PRIhts_pos" after %"PRIhts_pos"\n", pos, stats->cov_rbuf.pos); + + int ifrom = stats->cov_rbuf.start; + int ito = round_buffer_lidx2ridx(stats->cov_rbuf.start, stats->cov_rbuf.size, stats->cov_rbuf.pos, pos-1); + if ( ifrom>ito ) + { + for (ibuf=ifrom; ibufcov_rbuf.size; ibuf++) + { + if ( !stats->cov_rbuf.buffer[ibuf] ) + continue; + idp = coverage_idx(stats->info->cov_min,stats->info->cov_max,stats->ncov,stats->info->cov_step,stats->cov_rbuf.buffer[ibuf]); + stats->cov[idp]++; + stats->cov_rbuf.buffer[ibuf] = 0; + } + ifrom = 0; + } + for (ibuf=ifrom; ibuf<=ito; ibuf++) + { + if ( !stats->cov_rbuf.buffer[ibuf] ) + continue; + idp = coverage_idx(stats->info->cov_min,stats->info->cov_max,stats->ncov,stats->info->cov_step,stats->cov_rbuf.buffer[ibuf]); + stats->cov[idp]++; + stats->cov_rbuf.buffer[ibuf] = 0; + } + stats->cov_rbuf.start = (new_pos==-1) ? 0 : round_buffer_lidx2ridx(stats->cov_rbuf.start, stats->cov_rbuf.size, stats->cov_rbuf.pos, pos); + stats->cov_rbuf.pos = new_pos; +} + +/** + * [from, to) - 0 based half-open + */ +static void round_buffer_insert_read(round_buffer_t *rbuf, hts_pos_t from, hts_pos_t to) +{ + if ( to-from > rbuf->size ) + error("The read length too big (%"PRIhts_pos"), please increase the buffer length (currently %d)\n", to-from, rbuf->size); + if ( from < rbuf->pos ) + error("The reads are not sorted (%"PRIhts_pos" comes after %"PRIhts_pos").\n", from, rbuf->pos); + + int ifrom, ito, ibuf; + ifrom = round_buffer_lidx2ridx(rbuf->start, rbuf->size, rbuf->pos, from); + ito = round_buffer_lidx2ridx(rbuf->start, rbuf->size, rbuf->pos, to); + if ( ifrom>ito ) + { + for (ibuf=ifrom; ibufsize; ibuf++) + rbuf->buffer[ibuf]++; + ifrom = 0; + } + for (ibuf=ifrom; ibufbuffer[ibuf]++; +} + +// Calculate the number of bases in the read trimmed by BWA +int bwa_trim_read(int trim_qual, uint8_t *quals, int len, int reverse) +{ + if ( lenmax_sum ) + { + max_sum = sum; + // This is the correct way, but bwa clips from some reason one base less + // max_l = l+1; + max_l = l; + } + } + return max_l; +} + + +void count_indels(stats_t *stats,bam1_t *bam_line) +{ + int is_fwd = IS_REVERSE(bam_line) ? 0 : 1; + uint32_t order = IS_PAIRED(bam_line) ? (IS_READ1(bam_line) ? READ_ORDER_FIRST : 0) + (IS_READ2(bam_line) ? READ_ORDER_LAST : 0) : READ_ORDER_FIRST; + int icig; + int icycle = 0; + int read_len = bam_line->core.l_qseq; + for (icig=0; icigcore.n_cigar; icig++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[icig]); + int ncig = bam_cigar_oplen(bam_get_cigar(bam_line)[icig]); + if ( !ncig ) continue; // curiously, this can happen: 0D + + if ( cig==BAM_CINS ) + { + int idx = is_fwd ? icycle : read_len-icycle-ncig; + if ( idx<0 ) + error("FIXME: read_len=%d vs icycle=%d\n", read_len,icycle); + if ( idx >= stats->nbases || idx<0 ) error("FIXME: %d vs %d, %s:%"PRIhts_pos" %s\n", idx, stats->nbases, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + if ( order == READ_ORDER_FIRST ) + stats->ins_cycles_1st[idx]++; + if ( order == READ_ORDER_LAST ) + stats->ins_cycles_2nd[idx]++; + icycle += ncig; + if ( ncig<=stats->nindels ) + stats->insertions[ncig-1]++; + continue; + } + if ( cig==BAM_CDEL ) + { + int idx = is_fwd ? icycle-1 : read_len-icycle-1; + if ( idx<0 ) continue; // discard meaningless deletions + if ( idx >= stats->nbases ) error("FIXME: %d vs %d\n", idx,stats->nbases); + if ( order == READ_ORDER_FIRST ) + stats->del_cycles_1st[idx]++; + if ( order == READ_ORDER_LAST ) + stats->del_cycles_2nd[idx]++; + if ( ncig<=stats->nindels ) + stats->deletions[ncig-1]++; + continue; + } + if ( cig!=BAM_CREF_SKIP && cig!=BAM_CHARD_CLIP && cig!=BAM_CPAD ) + icycle += ncig; + } +} + +int unclipped_length(bam1_t *bam_line) +{ + int icig, read_len = bam_line->core.l_qseq; + for (icig=0; icigcore.n_cigar; icig++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[icig]); + if ( cig==BAM_CHARD_CLIP ) + read_len += bam_cigar_oplen(bam_get_cigar(bam_line)[icig]); + } + return read_len; +} + +void count_mismatches_per_cycle(stats_t *stats, bam1_t *bam_line, int read_len) +{ + int is_fwd = IS_REVERSE(bam_line) ? 0 : 1; + int icig, iread=0, icycle=0; + hts_pos_t iref = bam_line->core.pos - stats->rseq_pos; + uint8_t *read = bam_get_seq(bam_line); + uint8_t *quals = bam_get_qual(bam_line); + uint64_t *mpc_buf = stats->mpc_buf; + for (icig=0; icigcore.n_cigar; icig++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[icig]); + int ncig = bam_cigar_oplen(bam_get_cigar(bam_line)[icig]); + if ( cig==BAM_CINS ) + { + iread += ncig; + icycle += ncig; + continue; + } + if ( cig==BAM_CDEL ) + { + iref += ncig; + continue; + } + if ( cig==BAM_CSOFT_CLIP ) + { + icycle += ncig; + // Soft-clips are present in the sequence, but the position of the read marks a start of the sequence after clipping + // iref += ncig; + iread += ncig; + continue; + } + if ( cig==BAM_CHARD_CLIP ) + { + icycle += ncig; + continue; + } + // Ignore H and N CIGARs. The letter are inserted e.g. by TopHat and often require very large + // chunk of refseq in memory. Not very frequent and not noticeable in the stats. + if ( cig==BAM_CREF_SKIP || cig==BAM_CHARD_CLIP || cig==BAM_CPAD ) continue; + if ( cig!=BAM_CMATCH && cig!=BAM_CEQUAL && cig!=BAM_CDIFF ) // not relying on precalculated diffs + error("TODO: cigar %d, %s:%"PRIhts_pos" %s\n", cig, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + + if ( ncig+iref > stats->nrseq_buf ) + error("FIXME: %d+%"PRIhts_pos" > %"PRId64", %s, %s:%"PRIhts_pos"\n", ncig, iref, stats->nrseq_buf, bam_get_qname(bam_line), sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1); + + int im; + for (im=0; imrseq_buf[iref]; + + // ---------------15 + // =ACMGRSVTWYHKDBN + if ( cread==15 ) + { + int idx = is_fwd ? icycle : read_len-icycle-1; + if ( idx>stats->max_len ) + error("mpc: %d>%d\n",idx,stats->max_len); + idx = idx*stats->nquals; + if ( idx>=stats->nquals*stats->nbases ) + error("FIXME: mpc_buf overflow\n"); + mpc_buf[idx]++; + } + else if ( cref && cread && cref!=cread ) + { + uint8_t qual = quals[iread] + 1; + if ( qual>=stats->nquals ) + error("TODO: quality too high %d>=%d (%s %"PRIhts_pos" %s)\n", qual, stats->nquals, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + + int idx = is_fwd ? icycle : read_len-icycle-1; + if ( idx>stats->max_len ) + error("mpc: %d>%d (%s %"PRIhts_pos" %s)\n", idx, stats->max_len, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + + idx = idx*stats->nquals + qual; + if ( idx>=stats->nquals*stats->nbases ) + error("FIXME: mpc_buf overflow\n"); + mpc_buf[idx]++; + } + + iref++; + iread++; + icycle++; + } + } +} + +void read_ref_seq(stats_t *stats, int32_t tid, hts_pos_t pos) +{ + int i; + hts_pos_t fai_ref_len; + char *fai_ref = faidx_fetch_seq64(stats->info->fai, sam_hdr_tid2name(stats->info->sam_header, tid), pos, pos+stats->mrseq_buf-1, &fai_ref_len); + if ( fai_ref_len < 0 ) error("Failed to fetch the sequence \"%s\"\n", sam_hdr_tid2name(stats->info->sam_header, tid)); + + uint8_t *ptr = stats->rseq_buf; + for (i=0; imrseq_buf ) memset(ptr,0, stats->mrseq_buf - fai_ref_len); + stats->nrseq_buf = fai_ref_len; + stats->rseq_pos = pos; + stats->tid = tid; +} + +float fai_gc_content(stats_t *stats, hts_pos_t pos, int len) +{ + uint32_t gc,count,c; + hts_pos_t i = pos - stats->rseq_pos, ito = i + len; + assert( i>=0 ); + + if ( ito > stats->nrseq_buf ) ito = stats->nrseq_buf; + + // Count GC content + gc = count = 0; + for (; irseq_buf[i]; + if ( c==2 || c==4 ) + { + gc++; + count++; + } + else if ( c==1 || c==8 ) + count++; + } + return count ? (float)gc/count : 0; +} + +void realloc_rseq_buffer(stats_t *stats) +{ + int n = stats->nbases*10; + if ( stats->info->gcd_bin_size > n ) n = stats->info->gcd_bin_size; + if ( stats->mrseq_bufrseq_buf = realloc(stats->rseq_buf,sizeof(uint8_t)*n); + if (!stats->rseq_buf) { + error("Could not reallocate reference sequence buffer"); + } + stats->mrseq_buf = n; + } +} + +void realloc_gcd_buffer(stats_t *stats, int seq_len) +{ + hts_expand0(gc_depth_t,stats->igcd+1,stats->ngcd,stats->gcd); + realloc_rseq_buffer(stats); +} + +void realloc_buffers(stats_t *stats, int seq_len) +{ + int n = 2*(1 + seq_len - stats->nbases) + stats->nbases; + + stats->quals_1st = realloc(stats->quals_1st, n*stats->nquals*sizeof(uint64_t)); + if ( !stats->quals_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*stats->nquals*sizeof(uint64_t)); + memset(stats->quals_1st + stats->nbases*stats->nquals, 0, (n-stats->nbases)*stats->nquals*sizeof(uint64_t)); + + stats->quals_2nd = realloc(stats->quals_2nd, n*stats->nquals*sizeof(uint64_t)); + if ( !stats->quals_2nd ) + error("Could not realloc buffers, the sequence too long: %d (2x%ld)\n", seq_len,n*stats->nquals*sizeof(uint64_t)); + memset(stats->quals_2nd + stats->nbases*stats->nquals, 0, (n-stats->nbases)*stats->nquals*sizeof(uint64_t)); + + if ( stats->mpc_buf ) + { + stats->mpc_buf = realloc(stats->mpc_buf, n*stats->nquals*sizeof(uint64_t)); + if ( !stats->mpc_buf ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*stats->nquals*sizeof(uint64_t)); + memset(stats->mpc_buf + stats->nbases*stats->nquals, 0, (n-stats->nbases)*stats->nquals*sizeof(uint64_t)); + } + + stats->acgtno_cycles_1st = realloc(stats->acgtno_cycles_1st, n*sizeof(acgtno_count_t)); + if ( !stats->acgtno_cycles_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len, n*sizeof(acgtno_count_t)); + memset(stats->acgtno_cycles_1st + stats->nbases, 0, (n-stats->nbases)*sizeof(acgtno_count_t)); + + stats->acgtno_cycles_2nd = realloc(stats->acgtno_cycles_2nd, n*sizeof(acgtno_count_t)); + if ( !stats->acgtno_cycles_2nd ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len, n*sizeof(acgtno_count_t)); + memset(stats->acgtno_cycles_2nd + stats->nbases, 0, (n-stats->nbases)*sizeof(acgtno_count_t)); + + stats->acgtno_revcomp = realloc(stats->acgtno_revcomp, n*sizeof(acgtno_count_t)); + if ( !stats->acgtno_revcomp ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len, n*sizeof(acgtno_count_t)); + memset(stats->acgtno_revcomp + stats->nbases, 0, (n-stats->nbases)*sizeof(acgtno_count_t)); + + stats->read_lengths = realloc(stats->read_lengths, n*sizeof(uint64_t)); + if ( !stats->read_lengths ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->read_lengths + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->read_lengths_1st = realloc(stats->read_lengths_1st, n*sizeof(uint64_t)); + if ( !stats->read_lengths_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->read_lengths_1st + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->read_lengths_2nd = realloc(stats->read_lengths_2nd, n*sizeof(uint64_t)); + if ( !stats->read_lengths_2nd ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->read_lengths_2nd + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->insertions = realloc(stats->insertions, n*sizeof(uint64_t)); + if ( !stats->insertions ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->insertions + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->deletions = realloc(stats->deletions, n*sizeof(uint64_t)); + if ( !stats->deletions ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->deletions + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->ins_cycles_1st = realloc(stats->ins_cycles_1st, (n+1)*sizeof(uint64_t)); + if ( !stats->ins_cycles_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,(n+1)*sizeof(uint64_t)); + memset(stats->ins_cycles_1st + stats->nbases + 1, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->ins_cycles_2nd = realloc(stats->ins_cycles_2nd, (n+1)*sizeof(uint64_t)); + if ( !stats->ins_cycles_2nd ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,(n+1)*sizeof(uint64_t)); + memset(stats->ins_cycles_2nd + stats->nbases + 1, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->del_cycles_1st = realloc(stats->del_cycles_1st, (n+1)*sizeof(uint64_t)); + if ( !stats->del_cycles_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,(n+1)*sizeof(uint64_t)); + memset(stats->del_cycles_1st + stats->nbases + 1, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->del_cycles_2nd = realloc(stats->del_cycles_2nd, (n+1)*sizeof(uint64_t)); + if ( !stats->del_cycles_2nd ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,(n+1)*sizeof(uint64_t)); + memset(stats->del_cycles_2nd + stats->nbases + 1, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->nbases = n; + + // Realloc the coverage distribution buffer + int *rbuffer = calloc(sizeof(int),seq_len*5); + if (!rbuffer) { + error("Could not allocate coverage distribution buffer"); + } + n = stats->cov_rbuf.size-stats->cov_rbuf.start; + memcpy(rbuffer,stats->cov_rbuf.buffer+stats->cov_rbuf.start,n); + if ( stats->cov_rbuf.start>1 ) + memcpy(rbuffer+n,stats->cov_rbuf.buffer,stats->cov_rbuf.start); + stats->cov_rbuf.start = 0; + free(stats->cov_rbuf.buffer); + stats->cov_rbuf.buffer = rbuffer; + stats->cov_rbuf.size = seq_len*5; + + realloc_rseq_buffer(stats); +} + +void update_checksum(bam1_t *bam_line, stats_t *stats) +{ + uint8_t *name = (uint8_t*) bam_get_qname(bam_line); + int len = 0; + while ( name[len] ) len++; + stats->checksum.names += crc32(0L, name, len); + + int seq_len = bam_line->core.l_qseq; + if ( !seq_len ) return; + + uint8_t *seq = bam_get_seq(bam_line); + stats->checksum.reads += crc32(0L, seq, (seq_len+1)/2); + + uint8_t *qual = bam_get_qual(bam_line); + stats->checksum.quals += crc32(0L, qual, (seq_len+1)/2); +} + +// Collect statistics about the barcode tags specified by init_barcode_tags method +static void collect_barcode_stats(bam1_t* bam_line, stats_t* stats) { + uint32_t nbases, tag, i; + acgtno_count_t *acgtno; + uint64_t *quals; + int32_t *separator, *maxqual; + + for (tag = 0; tag < stats->ntags; tag++) { + const char *barcode_tag = stats->tags_barcode[tag].tag_name, *qual_tag = stats->tags_barcode[tag].qual_name; + uint8_t* bc = bam_aux_get(bam_line, barcode_tag); + if (!bc) + continue; + + char* barcode = bam_aux2Z(bc); + if (!barcode) + continue; + + uint32_t barcode_len = strlen(barcode); + if (!stats->tags_barcode[tag].nbases) { // tag seen for the first time + uint32_t offset = 0; + for (i = 0; i < stats->ntags; i++) + offset += stats->tags_barcode[i].nbases; + + stats->tags_barcode[tag].offset = offset; + stats->tags_barcode[tag].nbases = barcode_len; + stats->acgtno_barcode = realloc(stats->acgtno_barcode, (offset + barcode_len) * sizeof(acgtno_count_t)); + stats->quals_barcode = realloc(stats->quals_barcode, (offset + barcode_len) * stats->nquals * sizeof(uint64_t)); + + if (!stats->acgtno_barcode || !stats->quals_barcode) + error("Error allocating memory. Aborting!\n"); + + memset(stats->acgtno_barcode + offset, 0, barcode_len*sizeof(acgtno_count_t)); + memset(stats->quals_barcode + offset*stats->nquals, 0, barcode_len*stats->nquals*sizeof(uint64_t)); + } + + nbases = stats->tags_barcode[tag].nbases; + if (barcode_len > nbases) { + fprintf(stderr, "Barcodes with tag %s differ in length at sequence '%s'\n", barcode_tag, bam_get_qname(bam_line)); + continue; + } + + acgtno = stats->acgtno_barcode + stats->tags_barcode[tag].offset; + quals = stats->quals_barcode + stats->tags_barcode[tag].offset*stats->nquals; + maxqual = &stats->tags_barcode[tag].max_qual; + separator = &stats->tags_barcode[tag].tag_sep; + int error_flag = 0; + + for (i = 0; i < barcode_len; i++) { + switch (barcode[i]) { + case 'A': + acgtno[i].a++; + break; + case 'C': + acgtno[i].c++; + break; + case 'G': + acgtno[i].g++; + break; + case 'T': + acgtno[i].t++; + break; + case 'N': + acgtno[i].n++; + break; + default: + if (*separator >= 0) { + if (*separator != i) { + if (stats->error_number < ERROR_LIMIT) { + fprintf(stderr, "Barcode separator for tag %s is in a different position or wrong barcode content('%s') at sequence '%s'\n", barcode_tag, barcode, bam_get_qname(bam_line)); + stats->error_number++; + } + error_flag = 1; + } + } else { + *separator = i; + } + } + + /* don't process the rest of the tag bases */ + if (error_flag) + break; + } + + /* skip to the next tag */ + if (error_flag) + continue; + + uint8_t* qt = bam_aux_get(bam_line, qual_tag); + if (!qt) + continue; + + char* barqual = bam_aux2Z(qt); + if (!barqual) + continue; + + uint32_t barqual_len = strlen(barqual); + if (barqual_len == barcode_len) { + for (i = 0; i < barcode_len; i++) { + int32_t qual = (int32_t)barqual[i] - '!'; // Phred + 33 + if (qual >= 0 && qual < stats->nquals) { + quals[i * stats->nquals + qual]++; + if (qual > *maxqual) + *maxqual = qual; + } + } + } else { + if (stats->error_number++ < ERROR_LIMIT) { + fprintf(stderr, "%s length and %s length don't match for sequence '%s'\n", barcode_tag, qual_tag, bam_get_qname(bam_line)); + } + } + } +} + +// These stats should only be calculated for the original reads ignoring +// supplementary artificial reads otherwise we'll accidentally double count +void collect_orig_read_stats(bam1_t *bam_line, stats_t *stats, int* gc_count_out) +{ + int seq_len = bam_line->core.l_qseq; + stats->total_len += seq_len; // This ignores clipping so only count primary + + if ( bam_line->core.flag & BAM_FQCFAIL ) stats->nreads_QCfailed++; + if ( bam_line->core.flag & BAM_FPAIRED ) stats->nreads_paired_tech++; + + uint32_t order = IS_PAIRED(bam_line) ? (IS_READ1(bam_line) ? READ_ORDER_FIRST : 0) + (IS_READ2(bam_line) ? READ_ORDER_LAST : 0) : READ_ORDER_FIRST; + + // Count GC and ACGT per cycle. Note that cycle is approximate, clipping is ignored + uint8_t *seq = bam_get_seq(bam_line); + int i, read_cycle, gc_count = 0, reverse = IS_REVERSE(bam_line); + + acgtno_count_t *acgtno_cycles = (order == READ_ORDER_FIRST) ? stats->acgtno_cycles_1st : (order == READ_ORDER_LAST) ? stats->acgtno_cycles_2nd : NULL ; + if (acgtno_cycles) { + for (i=0; iacgtno_revcomp[ read_cycle ].t++ : stats->acgtno_revcomp[ read_cycle ].a++; + break; + case 2: + acgtno_cycles[ read_cycle ].c++; + reverse ? stats->acgtno_revcomp[ read_cycle ].g++ : stats->acgtno_revcomp[ read_cycle ].c++; + gc_count++; + break; + case 4: + acgtno_cycles[ read_cycle ].g++; + reverse ? stats->acgtno_revcomp[ read_cycle ].c++ : stats->acgtno_revcomp[ read_cycle ].g++; + gc_count++; + break; + case 8: + reverse ? stats->acgtno_revcomp[ read_cycle ].a++ : stats->acgtno_revcomp[ read_cycle ].t++; + acgtno_cycles[ read_cycle ].t++; + break; + case 15: + acgtno_cycles[ read_cycle ].n++; + break; + default: + /* + * count "=" sequences in "other" along + * with MRSVWYHKDB ambiguity codes + */ + acgtno_cycles[ read_cycle ].other++; + break; + } + } + } + int gc_idx_min = gc_count*(stats->ngc-1)/seq_len; + int gc_idx_max = (gc_count+1)*(stats->ngc-1)/seq_len; + if ( gc_idx_max >= stats->ngc ) gc_idx_max = stats->ngc - 1; + + // Determine which array (1st or 2nd read) will these stats go to, + // trim low quality bases from end the same way BWA does, + // fill GC histogram + uint64_t *quals = NULL; + uint8_t *bam_quals = bam_get_qual(bam_line); + + switch (order) { + case READ_ORDER_FIRST: + quals = stats->quals_1st; + stats->nreads_1st++; + stats->total_len_1st += seq_len; + for (i=gc_idx_min; igc_1st[i]++; + break; + case READ_ORDER_LAST: + quals = stats->quals_2nd; + stats->nreads_2nd++; + stats->total_len_2nd += seq_len; + for (i=gc_idx_min; igc_2nd[i]++; + break; + default: + stats->nreads_other++; + } + if ( stats->info->trim_qual>0 ) + stats->nbases_trimmed += bwa_trim_read(stats->info->trim_qual, bam_quals, seq_len, reverse); + + // Quality histogram and average quality. Clipping is neglected. + if (quals) { + for (i=0; i=stats->nquals ) + error("TODO: quality too high %d>=%d (%s %"PRIhts_pos" %s)\n", qual, stats->nquals, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + if ( qual>stats->max_qual ) + stats->max_qual = qual; + + quals[ i*stats->nquals+qual ]++; + stats->sum_qual += qual; + } + } + + // Barcode statistics + if (order == READ_ORDER_FIRST) { + collect_barcode_stats(bam_line, stats); + } + + // Look at the flags and increment appropriate counters (mapped, paired, etc) + if ( IS_UNMAPPED(bam_line) ) + { + stats->nreads_unmapped++; + } + else + { + stats->nbases_mapped += seq_len; // This ignores clipping so only count primary + + if ( !bam_line->core.qual ) + stats->nreads_mq0++; + if ( !IS_PAIRED_AND_MAPPED(bam_line) ) + stats->nreads_single_mapped++; + else + { + stats->nreads_paired_and_mapped++; + + if (IS_PROPERLYPAIRED(bam_line)) stats->nreads_properly_paired++; + + if ( bam_line->core.tid!=bam_line->core.mtid ) + stats->nreads_anomalous++; + } + } + *gc_count_out = gc_count; +} + +static int cleanup_overlaps(khash_t(qn2pair) *read_pairs, hts_pos_t max) { + if ( !read_pairs ) + return 0; + + int count = 0; + khint_t k; + for (k = kh_begin(read_pairs); k < kh_end(read_pairs); k++) { + if ( kh_exist(read_pairs, k) ) { + char *key = (char *)kh_key(read_pairs, k); + pair_t *val = kh_val(read_pairs, k); + if ( val && val->chunks ) { + if ( val->chunks[val->n-1].end < max ) { + free(val->chunks); + free(val); + free(key); + kh_del(qn2pair, read_pairs, k); + count++; + } + } else { + free(key); + kh_del(qn2pair, read_pairs, k); + count++; + } + } + } + if ( max == INT64_MAX ) + kh_destroy(qn2pair, read_pairs); + + return count; +} + +/** + * [pmin, pmax) - 0 based half-open + */ +static void remove_overlaps(bam1_t *bam_line, khash_t(qn2pair) *read_pairs, stats_t *stats, hts_pos_t pmin, hts_pos_t pmax) { + if ( !bam_line || !read_pairs || !stats ) + return; + + uint32_t order = (IS_READ1(bam_line) ? READ_ORDER_FIRST : 0) + (IS_READ2(bam_line) ? READ_ORDER_LAST : 0); + if ( !(bam_line->core.flag & BAM_FPAIRED) || + (bam_line->core.flag & BAM_FMUNMAP) || + (llabs(bam_line->core.isize) >= 2*bam_line->core.l_qseq) || + (order != READ_ORDER_FIRST && order != READ_ORDER_LAST) ) { + if ( pmin >= 0 ) + round_buffer_insert_read(&(stats->cov_rbuf), pmin, pmax); + return; + } + + char *qname = bam_get_qname(bam_line); + if ( !qname ) { + fprintf(stderr, "Error retrieving qname for line starting at pos %"PRIhts_pos"\n", bam_line->core.pos); + return; + } + + khint_t k = kh_get(qn2pair, read_pairs, qname); + if ( k == kh_end(read_pairs) ) { //first chunk from this template + if ( pmin == -1 ) + return; + + int ret; + char *s = strdup(qname); + if ( !s ) { + fprintf(stderr, "Error allocating memory\n"); + return; + } + + k = kh_put(qn2pair, read_pairs, s, &ret); + if ( -1 == ret ) { + error("Error inserting read '%s' in pair hash table\n", qname); + } + + pair_t *pc = calloc(1, sizeof(pair_t)); + if ( !pc ) { + fprintf(stderr, "Error allocating memory\n"); + return; + } + + pc->m = DEFAULT_CHUNK_NO; + pc->chunks = calloc(pc->m, sizeof(hts_pair_pos_t)); + if ( !pc->chunks ) { + fprintf(stderr, "Error allocating memory\n"); + free(pc); + return; + } + + pc->chunks[0].beg = pmin; + pc->chunks[0].end = pmax; + pc->n = 1; + pc->first = order; + + kh_val(read_pairs, k) = pc; + stats->pair_count++; + } else { //template already present + pair_t *pc = kh_val(read_pairs, k); + if ( !pc ) { + fprintf(stderr, "Invalid hash table entry\n"); + return; + } + + if ( order == pc->first ) { //chunk from an existing line + if ( pmin == -1 ) + return; + + if ( pc->n == pc->m ) { + hts_pair_pos_t *tmp = realloc(pc->chunks, (pc->m<<1)*sizeof(hts_pair_pos_t)); + if ( !tmp ) { + fprintf(stderr, "Error allocating memory\n"); + return; + } + pc->chunks = tmp; + pc->m<<=1; + } + + pc->chunks[pc->n].beg = pmin; + pc->chunks[pc->n].end = pmax; + pc->n++; + } else { //the other line, check for overlapping + if ( pmin == -1 && kh_exist(read_pairs, k) ) { //job done, delete entry + char *key = (char *)kh_key(read_pairs, k); + pair_t *val = kh_val(read_pairs, k); + if ( val) { + free(val->chunks); + free(val); + } + free(key); + kh_del(qn2pair, read_pairs, k); + stats->pair_count--; + return; + } + + int i; + for (i=0; in; i++) { + if ( pmin >= pc->chunks[i].end ) + continue; + + if ( pmax <= pc->chunks[i].beg ) //no overlap + break; + + if ( pmin < pc->chunks[i].beg ) { //overlap at the beginning + round_buffer_insert_read(&(stats->cov_rbuf), pmin, pc->chunks[i].beg); + pmin = pc->chunks[i].beg; + } + + if ( pmax <= pc->chunks[i].end ) { //completely contained + stats->nbases_mapped_cigar -= (pmax - pmin); + return; + } else { //overlap at the end + stats->nbases_mapped_cigar -= (pc->chunks[i].end - pmin); + pmin = pc->chunks[i].end; + } + } + } + } + round_buffer_insert_read(&(stats->cov_rbuf), pmin, pmax); +} + +void collect_stats(bam1_t *bam_line, stats_t *stats, khash_t(qn2pair) *read_pairs) +{ + if ( !is_in_regions(bam_line,stats) ) + return; + if ( stats->rg_hash ) + { + const uint8_t *rg = bam_aux_get(bam_line, "RG"); + if ( !rg ) return; // certain read groups were requested but this record has none + khint_t k = kh_get(rg, stats->rg_hash, (const char*)(rg + 1)); + if ( k == kh_end((kh_rg_t *)stats->rg_hash) ) return; + } + if ( stats->info->flag_require && (bam_line->core.flag & stats->info->flag_require)!=stats->info->flag_require ) + { + stats->nreads_filtered++; + return; + } + if ( stats->info->flag_filter && (bam_line->core.flag & stats->info->flag_filter) ) + { + stats->nreads_filtered++; + return; + } + if ( stats->info->filter_readlen!=-1 && bam_line->core.l_qseq!=stats->info->filter_readlen ) + return; + + update_checksum(bam_line, stats); + + // Secondary reads don't count for most stats purposes + if ( bam_line->core.flag & BAM_FSECONDARY ) + { + stats->nreads_secondary++; + return; + } + + if ( bam_line->core.flag & BAM_FSUPPLEMENTARY ) + { + stats->nreads_supplementary++; + } + + // If line has no sequence cannot continue + int seq_len = bam_line->core.l_qseq; + if ( !seq_len ) return; + + if ( IS_DUP(bam_line) ) + { + stats->total_len_dup += seq_len; + stats->nreads_dup++; + } + + uint32_t order = IS_PAIRED(bam_line) ? (IS_READ1(bam_line) ? READ_ORDER_FIRST : 0) + (IS_READ2(bam_line) ? READ_ORDER_LAST : 0) : READ_ORDER_FIRST; + + int read_len = unclipped_length(bam_line); + if ( read_len >= stats->nbases ) + realloc_buffers(stats,read_len); + // Update max_len observed + if ( stats->max_lenmax_len = read_len; + if ( order == READ_ORDER_FIRST && stats->max_len_1st < read_len ) + stats->max_len_1st = read_len; + if ( order == READ_ORDER_LAST && stats->max_len_2nd < read_len ) + stats->max_len_2nd = read_len; + + int i; + int gc_count = 0; + + // These stats should only be calculated for the original reads ignoring supplementary artificial reads + // otherwise we'll accidentally double count + if ( IS_ORIGINAL(bam_line) ) { + stats->read_lengths[read_len]++; + if ( order == READ_ORDER_FIRST ) stats->read_lengths_1st[read_len]++; + if ( order == READ_ORDER_LAST ) stats->read_lengths_2nd[read_len]++; + collect_orig_read_stats(bam_line, stats, &gc_count); + } + + // Look at the flags and increment appropriate counters (mapped, paired, etc) + if ( IS_UNMAPPED(bam_line) ) return; + + count_indels(stats, bam_line); + + if ( IS_PAIRED_AND_MAPPED(bam_line) && IS_ORIGINAL(bam_line) ) + { + // The insert size is tricky, because for long inserts the libraries are + // prepared differently and the pairs point in other direction. BWA does + // not set the paired flag for them. Similar thing is true also for 454 + // reads. Mates mapped to different chromosomes have isize==0. + int32_t isize = bam_line->core.isize; + if ( isize<0 ) isize = -isize; + if ( stats->info->nisize > 0 && isize > stats->info->nisize ) + isize = stats->info->nisize; + if ( isize>0 || bam_line->core.tid==bam_line->core.mtid ) + { + hts_pos_t pos_fst = bam_line->core.mpos - bam_line->core.pos; + int is_fst = IS_READ1(bam_line) ? 1 : -1; + int is_fwd = IS_REVERSE(bam_line) ? -1 : 1; + int is_mfwd = IS_MATE_REVERSE(bam_line) ? -1 : 1; + + if ( is_fwd*is_mfwd>0 ) + stats->isize->inc_other(stats->isize->data, isize); + else if ( is_fst*pos_fst>=0 ) + { + if ( is_fst*is_fwd>0 ) + stats->isize->inc_inward(stats->isize->data, isize); + else + stats->isize->inc_outward(stats->isize->data, isize); + } + else if ( is_fst*pos_fst<0 ) + { + if ( is_fst*is_fwd>0 ) + stats->isize->inc_outward(stats->isize->data, isize); + else + stats->isize->inc_inward(stats->isize->data, isize); + } + } + } + + // Number of mismatches + uint8_t *nm = bam_aux_get(bam_line,"NM"); + if (nm) + stats->nmismatches += bam_aux2i(nm); + + // Number of mapped bases from cigar + if ( bam_line->core.n_cigar == 0) + error("FIXME: mapped read with no cigar?\n"); + int readlen=seq_len; + if ( stats->regions ) + { + // Count only on-target bases + hts_pos_t iref = bam_line->core.pos + 1; + for (i=0; icore.n_cigar; i++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[i]); + int ncig = bam_cigar_oplen(bam_get_cigar(bam_line)[i]); + if ( !ncig ) continue; // curiously, this can happen: 0D + if ( cig==BAM_CDEL ) readlen += ncig; + else if ( cig==BAM_CMATCH || cig==BAM_CEQUAL || cig==BAM_CDIFF ) + { + if ( iref < stats->reg_from ) ncig -= stats->reg_from-iref; + else if ( iref+ncig-1 > stats->reg_to ) ncig -= iref+ncig-1 - stats->reg_to; + if ( ncig<0 ) ncig = 0; + stats->nbases_mapped_cigar += ncig; + iref += bam_cigar_oplen(bam_get_cigar(bam_line)[i]); + } + else if ( cig==BAM_CINS ) + { + iref += ncig; + if ( iref>=stats->reg_from && iref<=stats->reg_to ) + stats->nbases_mapped_cigar += ncig; + } + } + } + else + { + // Count the whole read + for (i=0; icore.n_cigar; i++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[i]); + if ( cig==BAM_CMATCH || cig==BAM_CINS || cig==BAM_CEQUAL || cig==BAM_CDIFF ) + stats->nbases_mapped_cigar += bam_cigar_oplen(bam_get_cigar(bam_line)[i]); + if ( cig==BAM_CDEL ) + readlen += bam_cigar_oplen(bam_get_cigar(bam_line)[i]); + } + } + + if ( stats->tid==bam_line->core.tid && bam_line->core.pospos ) + stats->is_sorted = 0; + stats->pos = bam_line->core.pos; + + if ( stats->is_sorted ) + { + if ( stats->tid==-1 || stats->tid!=bam_line->core.tid ) { + round_buffer_flush(stats, -1); + } + + //cleanup the pair hash table to free memory + stats->last_read_flush++; + if ( stats->pair_count > DEFAULT_PAIR_MAX && stats->last_read_flush > DEFAULT_PAIR_MAX) { + stats->pair_count -= cleanup_overlaps(read_pairs, bam_line->core.pos); + stats->last_read_flush = 0; + } + + if ( stats->last_pair_tid != bam_line->core.tid) { + stats->pair_count -= cleanup_overlaps(read_pairs, INT64_MAX-1); + stats->last_pair_tid = bam_line->core.tid; + stats->last_read_flush = 0; + } + + // Mismatches per cycle and GC-depth graph. For simplicity, reads overlapping GCD bins + // are not splitted which results in up to seq_len-1 overlaps. The default bin size is + // 20kbp, so the effect is negligible. + if ( stats->info->fai ) + { + int inc_ref = 0, inc_gcd = 0; + // First pass or new chromosome + if ( stats->rseq_pos==-1 || stats->tid != bam_line->core.tid ) { inc_ref=1; inc_gcd=1; } + // Read goes beyond the end of the rseq buffer + else if ( stats->rseq_pos+stats->nrseq_buf < bam_line->core.pos+readlen ) { inc_ref=1; inc_gcd=1; } + // Read overlaps the next gcd bin + else if ( stats->gcd_pos+stats->info->gcd_bin_size < bam_line->core.pos+readlen ) + { + inc_gcd = 1; + if ( stats->rseq_pos+stats->nrseq_buf < bam_line->core.pos+stats->info->gcd_bin_size ) inc_ref = 1; + } + if ( inc_gcd ) + { + stats->igcd++; + if ( stats->igcd >= stats->ngcd ) + realloc_gcd_buffer(stats, readlen); + if ( inc_ref ) + read_ref_seq(stats,bam_line->core.tid,bam_line->core.pos); + stats->gcd_pos = bam_line->core.pos; + stats->gcd[ stats->igcd ].gc = fai_gc_content(stats, stats->gcd_pos, stats->info->gcd_bin_size); + } + + count_mismatches_per_cycle(stats,bam_line,read_len); + } + // No reference and first pass, new chromosome or sequence going beyond the end of the gcd bin + else if ( stats->gcd_pos==-1 || stats->tid != bam_line->core.tid || bam_line->core.pos - stats->gcd_pos > stats->info->gcd_bin_size ) + { + // First pass or a new chromosome + stats->tid = bam_line->core.tid; + stats->gcd_pos = bam_line->core.pos; + stats->igcd++; + if ( stats->igcd >= stats->ngcd ) + realloc_gcd_buffer(stats, readlen); + } + stats->gcd[ stats->igcd ].depth++; + // When no reference sequence is given, approximate the GC from the read (much shorter window, but otherwise OK) + if ( !stats->info->fai ) + stats->gcd[ stats->igcd ].gc += (float) gc_count / seq_len; + + // Coverage distribution graph + round_buffer_flush(stats,bam_line->core.pos); + if ( stats->regions ) { + hts_pos_t p = bam_line->core.pos, pnew, pmin = 0, pmax = 0; + uint32_t j = 0; + i = 0; + while ( j < bam_line->core.n_cigar && i < stats->nchunks ) { + int op = bam_cigar_op(bam_get_cigar(bam_line)[j]); + int oplen = bam_cigar_oplen(bam_get_cigar(bam_line)[j]); + switch(op) { + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + pmin = MAX(p, stats->chunks[i].beg-1); // 0 based + pmax = MIN(p+oplen, stats->chunks[i].end); // 1 based + if ( pmax > pmin ) { + if ( stats->info->remove_overlaps ) + remove_overlaps(bam_line, read_pairs, stats, pmin, pmax); + else + round_buffer_insert_read(&(stats->cov_rbuf), pmin, pmax); + } + break; + case BAM_CDEL: + break; + } + pnew = p + (bam_cigar_type(op)&2 ? oplen : 0); // consumes reference + + if ( pnew >= stats->chunks[i].end ) { + // go to the next chunk + i++; + } else { + // go to the next CIGAR op + j++; + p = pnew; + } + } + } else { + hts_pos_t p = bam_line->core.pos; + uint32_t j; + for (j = 0; j < bam_line->core.n_cigar; j++) { + int op = bam_cigar_op(bam_get_cigar(bam_line)[j]); + int oplen = bam_cigar_oplen(bam_get_cigar(bam_line)[j]); + switch(op) { + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + if ( stats->info->remove_overlaps ) + remove_overlaps(bam_line, read_pairs, stats, p, p+oplen); + else + round_buffer_insert_read(&(stats->cov_rbuf), p, p+oplen); + break; + case BAM_CDEL: + break; + } + p += bam_cigar_type(op)&2 ? oplen : 0; // consumes reference + } + } + if ( stats->info->remove_overlaps ) + remove_overlaps(bam_line, read_pairs, stats, -1LL, -1LL); //remove the line from the hash table + } +} + +// Sort by GC and depth +#define GCD_t(x) ((gc_depth_t *)x) +static int gcd_cmp(const void *a, const void *b) +{ + if ( GCD_t(a)->gc < GCD_t(b)->gc ) return -1; + if ( GCD_t(a)->gc > GCD_t(b)->gc ) return 1; + if ( GCD_t(a)->depth < GCD_t(b)->depth ) return -1; + if ( GCD_t(a)->depth > GCD_t(b)->depth ) return 1; + return 0; +} +#undef GCD_t + +float gcd_percentile(gc_depth_t *gcd, int N, int p) +{ + float n,d; + int k; + + n = (float)p*(N+1)/100; + k = n; + if ( k<=0 ) + return gcd[0].depth; + if ( k>=N ) + return gcd[N-1].depth; + + d = n - k; + return gcd[k-1].depth + d*(gcd[k].depth - gcd[k-1].depth); +} + +void output_stats(FILE *to, stats_t *stats, int sparse) +{ + // Calculate average insert size and standard deviation (from the main bulk data only) + int isize, ibulk=0, icov; + uint64_t nisize=0, nisize_inward=0, nisize_outward=0, nisize_other=0, cov_sum=0; + double bulk=0, avg_isize=0, sd_isize=0; + for (isize=0; isizeisize->nitems(stats->isize->data); isize++) + { + // Each pair was counted twice + stats->isize->set_inward(stats->isize->data, isize, stats->isize->inward(stats->isize->data, isize) * 0.5); + stats->isize->set_outward(stats->isize->data, isize, stats->isize->outward(stats->isize->data, isize) * 0.5); + stats->isize->set_other(stats->isize->data, isize, stats->isize->other(stats->isize->data, isize) * 0.5); + + nisize_inward += stats->isize->inward(stats->isize->data, isize); + nisize_outward += stats->isize->outward(stats->isize->data, isize); + nisize_other += stats->isize->other(stats->isize->data, isize); + nisize += stats->isize->inward(stats->isize->data, isize) + stats->isize->outward(stats->isize->data, isize) + stats->isize->other(stats->isize->data, isize); + } + + for (isize=0; isizeisize->nitems(stats->isize->data); isize++) + { + uint64_t num = stats->isize->inward(stats->isize->data, isize) + stats->isize->outward(stats->isize->data, isize) + stats->isize->other(stats->isize->data, isize); + if (num > 0) ibulk = isize + 1; + bulk += num; + avg_isize += isize * (stats->isize->inward(stats->isize->data, isize) + stats->isize->outward(stats->isize->data, isize) + stats->isize->other(stats->isize->data, isize)); + + if ( bulk/nisize > stats->info->isize_main_bulk ) + { + ibulk = isize+1; + nisize = bulk; + break; + } + } + avg_isize /= nisize ? nisize : 1; + for (isize=1; isizeisize->inward(stats->isize->data, isize) + stats->isize->outward(stats->isize->data, isize) +stats->isize->other(stats->isize->data, isize)) * (isize-avg_isize)*(isize-avg_isize) / (nisize ? nisize : 1); + sd_isize = sqrt(sd_isize); + + fprintf(to, "# This file was produced by samtools stats (%s+htslib-%s) and can be plotted using plot-bamstats\n", samtools_version(), hts_version()); + if( stats->split_name != NULL ){ + fprintf(to, "# This file contains statistics only for reads with tag: %s=%s\n", stats->info->split_tag, stats->split_name); + } + else{ + fprintf(to, "# This file contains statistics for all reads.\n"); + } + fprintf(to, "# The command line was: %s",stats->info->argv[0]); + int i; + for (i=1; iinfo->argc; i++) + fprintf(to, " %s", stats->info->argv[i]); + fprintf(to, "\n"); + fprintf(to, "# CHK, Checksum\t[2]Read Names\t[3]Sequences\t[4]Qualities\n"); + fprintf(to, "# CHK, CRC32 of reads which passed filtering followed by addition (32bit overflow)\n"); + fprintf(to, "CHK\t%08x\t%08x\t%08x\n", stats->checksum.names,stats->checksum.reads,stats->checksum.quals); + fprintf(to, "# Summary Numbers. Use `grep ^SN | cut -f 2-` to extract this part.\n"); + fprintf(to, "SN\traw total sequences:\t%ld\t# excluding supplementary and secondary reads\n", (long)(stats->nreads_filtered+stats->nreads_1st+stats->nreads_2nd+stats->nreads_other)); // not counting excluded seqs (and none of the below) + fprintf(to, "SN\tfiltered sequences:\t%ld\n", (long)stats->nreads_filtered); + fprintf(to, "SN\tsequences:\t%ld\n", (long)(stats->nreads_1st+stats->nreads_2nd+stats->nreads_other)); + fprintf(to, "SN\tis sorted:\t%d\n", stats->is_sorted ? 1 : 0); + fprintf(to, "SN\t1st fragments:\t%ld\n", (long)stats->nreads_1st); + fprintf(to, "SN\tlast fragments:\t%ld\n", (long)stats->nreads_2nd); + fprintf(to, "SN\treads mapped:\t%ld\n", (long)(stats->nreads_paired_and_mapped+stats->nreads_single_mapped)); + fprintf(to, "SN\treads mapped and paired:\t%ld\t# paired-end technology bit set + both mates mapped\n", (long)stats->nreads_paired_and_mapped); + fprintf(to, "SN\treads unmapped:\t%ld\n", (long)stats->nreads_unmapped); + fprintf(to, "SN\treads properly paired:\t%ld\t# proper-pair bit set\n", (long)stats->nreads_properly_paired); + fprintf(to, "SN\treads paired:\t%ld\t# paired-end technology bit set\n", (long)stats->nreads_paired_tech); + fprintf(to, "SN\treads duplicated:\t%ld\t# PCR or optical duplicate bit set\n", (long)stats->nreads_dup); + fprintf(to, "SN\treads MQ0:\t%ld\t# mapped and MQ=0\n", (long)stats->nreads_mq0); + fprintf(to, "SN\treads QC failed:\t%ld\n", (long)stats->nreads_QCfailed); + fprintf(to, "SN\tnon-primary alignments:\t%ld\n", (long)stats->nreads_secondary); + fprintf(to, "SN\tsupplementary alignments:\t%ld\n", (long)stats->nreads_supplementary); + fprintf(to, "SN\ttotal length:\t%ld\t# ignores clipping\n", (long)stats->total_len); + fprintf(to, "SN\ttotal first fragment length:\t%ld\t# ignores clipping\n", (long)stats->total_len_1st); + fprintf(to, "SN\ttotal last fragment length:\t%ld\t# ignores clipping\n", (long)stats->total_len_2nd); + fprintf(to, "SN\tbases mapped:\t%ld\t# ignores clipping\n", (long)stats->nbases_mapped); // the length of the whole read goes here, including soft-clips etc. + fprintf(to, "SN\tbases mapped (cigar):\t%ld\t# more accurate\n", (long)stats->nbases_mapped_cigar); // only matched and inserted bases are counted here + fprintf(to, "SN\tbases trimmed:\t%ld\n", (long)stats->nbases_trimmed); + fprintf(to, "SN\tbases duplicated:\t%ld\n", (long)stats->total_len_dup); + fprintf(to, "SN\tmismatches:\t%ld\t# from NM fields\n", (long)stats->nmismatches); + fprintf(to, "SN\terror rate:\t%e\t# mismatches / bases mapped (cigar)\n", stats->nbases_mapped_cigar ? (float)stats->nmismatches/stats->nbases_mapped_cigar : 0); + float avg_read_length = (stats->nreads_1st+stats->nreads_2nd+stats->nreads_other)?stats->total_len/(stats->nreads_1st+stats->nreads_2nd+stats->nreads_other):0; + fprintf(to, "SN\taverage length:\t%.0f\n", avg_read_length); + fprintf(to, "SN\taverage first fragment length:\t%.0f\n", stats->nreads_1st? (float)stats->total_len_1st/stats->nreads_1st:0); + fprintf(to, "SN\taverage last fragment length:\t%.0f\n", stats->nreads_2nd? (float)stats->total_len_2nd/stats->nreads_2nd:0); + fprintf(to, "SN\tmaximum length:\t%d\n", stats->max_len); + fprintf(to, "SN\tmaximum first fragment length:\t%d\n", stats->max_len_1st); + fprintf(to, "SN\tmaximum last fragment length:\t%d\n", stats->max_len_2nd); + fprintf(to, "SN\taverage quality:\t%.1f\n", stats->total_len?stats->sum_qual/stats->total_len:0); + fprintf(to, "SN\tinsert size average:\t%.1f\n", avg_isize); + fprintf(to, "SN\tinsert size standard deviation:\t%.1f\n", sd_isize); + fprintf(to, "SN\tinward oriented pairs:\t%ld\n", (long)nisize_inward); + fprintf(to, "SN\toutward oriented pairs:\t%ld\n", (long)nisize_outward); + fprintf(to, "SN\tpairs with other orientation:\t%ld\n", (long)nisize_other); + fprintf(to, "SN\tpairs on different chromosomes:\t%ld\n", (long)stats->nreads_anomalous/2); + fprintf(to, "SN\tpercentage of properly paired reads (%%):\t%.1f\n", (stats->nreads_1st+stats->nreads_2nd+stats->nreads_other)? (float)(100*stats->nreads_properly_paired)/(stats->nreads_1st+stats->nreads_2nd+stats->nreads_other):0); + if ( stats->target_count ) { + fprintf(to, "SN\tbases inside the target:\t%" PRIu64 "\n", stats->target_count); + for (icov=stats->info->cov_threshold+1; icovncov; icov++) + cov_sum += stats->cov[icov]; + fprintf(to, "SN\tpercentage of target genome with coverage > %d (%%):\t%.2f\n", stats->info->cov_threshold, (float)(100*cov_sum)/stats->target_count); + } + + int ibase,iqual; + if ( stats->max_lennbases ) stats->max_len++; + if ( stats->max_qual+1nquals ) stats->max_qual++; + fprintf(to, "# First Fragment Qualities. Use `grep ^FFQ | cut -f 2-` to extract this part.\n"); + fprintf(to, "# Columns correspond to qualities and rows to cycles. First column is the cycle number.\n"); + for (ibase=0; ibasemax_len_1st; ibase++) + { + fprintf(to, "FFQ\t%d",ibase+1); + for (iqual=0; iqual<=stats->max_qual; iqual++) + { + fprintf(to, "\t%ld", (long)stats->quals_1st[ibase*stats->nquals+iqual]); + } + fprintf(to, "\n"); + } + fprintf(to, "# Last Fragment Qualities. Use `grep ^LFQ | cut -f 2-` to extract this part.\n"); + fprintf(to, "# Columns correspond to qualities and rows to cycles. First column is the cycle number.\n"); + for (ibase=0; ibasemax_len_2nd; ibase++) + { + fprintf(to, "LFQ\t%d",ibase+1); + for (iqual=0; iqual<=stats->max_qual; iqual++) + { + fprintf(to, "\t%ld", (long)stats->quals_2nd[ibase*stats->nquals+iqual]); + } + fprintf(to, "\n"); + } + if ( stats->mpc_buf ) + { + fprintf(to, "# Mismatches per cycle and quality. Use `grep ^MPC | cut -f 2-` to extract this part.\n"); + fprintf(to, "# Columns correspond to qualities, rows to cycles. First column is the cycle number, second\n"); + fprintf(to, "# is the number of N's and the rest is the number of mismatches\n"); + for (ibase=0; ibasemax_len; ibase++) + { + fprintf(to, "MPC\t%d",ibase+1); + for (iqual=0; iqual<=stats->max_qual; iqual++) + { + fprintf(to, "\t%ld", (long)stats->mpc_buf[ibase*stats->nquals+iqual]); + } + fprintf(to, "\n"); + } + } + fprintf(to, "# GC Content of first fragments. Use `grep ^GCF | cut -f 2-` to extract this part.\n"); + int ibase_prev = 0; + for (ibase=0; ibasengc; ibase++) + { + if ( stats->gc_1st[ibase]==stats->gc_1st[ibase_prev] ) continue; + fprintf(to, "GCF\t%.2f\t%ld\n", (ibase+ibase_prev)*0.5*100./(stats->ngc-1), (long)stats->gc_1st[ibase_prev]); + ibase_prev = ibase; + } + fprintf(to, "# GC Content of last fragments. Use `grep ^GCL | cut -f 2-` to extract this part.\n"); + ibase_prev = 0; + for (ibase=0; ibasengc; ibase++) + { + if ( stats->gc_2nd[ibase]==stats->gc_2nd[ibase_prev] ) continue; + fprintf(to, "GCL\t%.2f\t%ld\n", (ibase+ibase_prev)*0.5*100./(stats->ngc-1), (long)stats->gc_2nd[ibase_prev]); + ibase_prev = ibase; + } + fprintf(to, "# ACGT content per cycle. Use `grep ^GCC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N and O counts as a percentage of all A/C/G/T bases [%%]\n"); + for (ibase=0; ibasemax_len; ibase++) + { + acgtno_count_t *acgtno_count_1st = &(stats->acgtno_cycles_1st[ibase]); + acgtno_count_t *acgtno_count_2nd = &(stats->acgtno_cycles_2nd[ibase]); + uint64_t acgt_sum = acgtno_count_1st->a + acgtno_count_1st->c + acgtno_count_1st->g + acgtno_count_1st->t + + acgtno_count_2nd->a + acgtno_count_2nd->c + acgtno_count_2nd->g + acgtno_count_2nd->t; + if ( ! acgt_sum ) continue; + fprintf(to, "GCC\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", ibase+1, + 100.*(acgtno_count_1st->a + acgtno_count_2nd->a)/acgt_sum, + 100.*(acgtno_count_1st->c + acgtno_count_2nd->c)/acgt_sum, + 100.*(acgtno_count_1st->g + acgtno_count_2nd->g)/acgt_sum, + 100.*(acgtno_count_1st->t + acgtno_count_2nd->t)/acgt_sum, + 100.*(acgtno_count_1st->n + acgtno_count_2nd->n)/acgt_sum, + 100.*(acgtno_count_1st->other + acgtno_count_2nd->other)/acgt_sum); + } + fprintf(to, "# ACGT content per cycle, read oriented. Use `grep ^GCT | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]\n"); + for (ibase=0; ibasemax_len; ibase++) + { + acgtno_count_t *acgtno_count = &(stats->acgtno_revcomp[ibase]); + uint64_t acgt_sum = acgtno_count->a + acgtno_count->c + acgtno_count->g + acgtno_count->t; + if ( ! acgt_sum ) continue; + fprintf(to, "GCT\t%d\t%.2f\t%.2f\t%.2f\t%.2f\n", ibase+1, + 100.*(acgtno_count->a)/acgt_sum, + 100.*(acgtno_count->c)/acgt_sum, + 100.*(acgtno_count->g)/acgt_sum, + 100.*(acgtno_count->t)/acgt_sum); + } + + uint64_t tA=0, tC=0, tG=0, tT=0, tN=0; + fprintf(to, "# ACGT content per cycle for first fragments. Use `grep ^FBC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N and O counts as a percentage of all A/C/G/T bases [%%]\n"); + for (ibase=0; ibasemax_len; ibase++) + { + acgtno_count_t *acgtno_count_1st = &(stats->acgtno_cycles_1st[ibase]); + uint64_t acgt_sum_1st = acgtno_count_1st->a + acgtno_count_1st->c + acgtno_count_1st->g + acgtno_count_1st->t; + tA += acgtno_count_1st->a; + tC += acgtno_count_1st->c; + tG += acgtno_count_1st->g; + tT += acgtno_count_1st->t; + tN += acgtno_count_1st->n; + + if ( acgt_sum_1st ) + fprintf(to, "FBC\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", ibase+1, + 100.*acgtno_count_1st->a/acgt_sum_1st, + 100.*acgtno_count_1st->c/acgt_sum_1st, + 100.*acgtno_count_1st->g/acgt_sum_1st, + 100.*acgtno_count_1st->t/acgt_sum_1st, + 100.*acgtno_count_1st->n/acgt_sum_1st, + 100.*acgtno_count_1st->other/acgt_sum_1st); + + } + fprintf(to, "# ACGT raw counters for first fragments. Use `grep ^FTC | cut -f 2-` to extract this part. The columns are: A,C,G,T,N base counters\n"); + fprintf(to, "FTC\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\n", tA, tC, tG, tT, tN); + tA=0, tC=0, tG=0, tT=0, tN=0; + fprintf(to, "# ACGT content per cycle for last fragments. Use `grep ^LBC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N and O counts as a percentage of all A/C/G/T bases [%%]\n"); + for (ibase=0; ibasemax_len; ibase++) + { + acgtno_count_t *acgtno_count_2nd = &(stats->acgtno_cycles_2nd[ibase]); + uint64_t acgt_sum_2nd = acgtno_count_2nd->a + acgtno_count_2nd->c + acgtno_count_2nd->g + acgtno_count_2nd->t; + tA += acgtno_count_2nd->a; + tC += acgtno_count_2nd->c; + tG += acgtno_count_2nd->g; + tT += acgtno_count_2nd->t; + tN += acgtno_count_2nd->n; + + if ( acgt_sum_2nd ) + fprintf(to, "LBC\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", ibase+1, + 100.*acgtno_count_2nd->a/acgt_sum_2nd, + 100.*acgtno_count_2nd->c/acgt_sum_2nd, + 100.*acgtno_count_2nd->g/acgt_sum_2nd, + 100.*acgtno_count_2nd->t/acgt_sum_2nd, + 100.*acgtno_count_2nd->n/acgt_sum_2nd, + 100.*acgtno_count_2nd->other/acgt_sum_2nd); + + } + fprintf(to, "# ACGT raw counters for last fragments. Use `grep ^LTC | cut -f 2-` to extract this part. The columns are: A,C,G,T,N base counters\n"); + fprintf(to, "LTC\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\n", tA, tC, tG, tT, tN); + + int tag; + for (tag=0; tagntags; tag++) { + if (stats->tags_barcode[tag].nbases) { + fprintf(to, "# ACGT content per cycle for barcodes. Use `grep ^%sC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N counts as a percentage of all A/C/G/T bases [%%]\n", + stats->tags_barcode[tag].tag_name); + for (ibase=0; ibasetags_barcode[tag].nbases; ibase++) + { + if (ibase == stats->tags_barcode[tag].tag_sep) + continue; + + acgtno_count_t *acgtno_count = stats->acgtno_barcode + stats->tags_barcode[tag].offset + ibase; + uint64_t acgt_sum = acgtno_count->a + acgtno_count->c + acgtno_count->g + acgtno_count->t; + + if ( acgt_sum ) + fprintf(to, "%sC%d\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", stats->tags_barcode[tag].tag_name, + stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? 1 : 2, + stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? ibase+1 : ibase-stats->tags_barcode[tag].tag_sep, + 100.*acgtno_count->a/acgt_sum, + 100.*acgtno_count->c/acgt_sum, + 100.*acgtno_count->g/acgt_sum, + 100.*acgtno_count->t/acgt_sum, + 100.*acgtno_count->n/acgt_sum); + } + + fprintf(to, "# Barcode Qualities. Use `grep ^%sQ | cut -f 2-` to extract this part.\n", stats->tags_barcode[tag].qual_name); + fprintf(to, "# Columns correspond to qualities and rows to barcode cycles. First column is the cycle number.\n"); + for (ibase=0; ibasetags_barcode[tag].nbases; ibase++) + { + if (ibase == stats->tags_barcode[tag].tag_sep) + continue; + + fprintf(to, "%sQ%d\t%d", stats->tags_barcode[tag].qual_name, + stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? 1 : 2, + stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? ibase+1 : ibase-stats->tags_barcode[tag].tag_sep); + for (iqual=0; iqual<=stats->tags_barcode[tag].max_qual; iqual++) + { + fprintf(to, "\t%ld", (long)stats->quals_barcode[(stats->tags_barcode[tag].offset + ibase)*stats->nquals+iqual]); + } + fprintf(to, "\n"); + } + } + } + + fprintf(to, "# Insert sizes. Use `grep ^IS | cut -f 2-` to extract this part. The columns are: insert size, pairs total, inward oriented pairs, outward oriented pairs, other pairs\n"); + for (isize=0; isizeisize->inward(stats->isize->data, isize)); + long out = (long)(stats->isize->outward(stats->isize->data, isize)); + long other = (long)(stats->isize->other(stats->isize->data, isize)); + if (!sparse || in + out + other > 0) { + fprintf(to, "IS\t%d\t%ld\t%ld\t%ld\t%ld\n", isize, in+out+other, + in , out, other); + } + } + + fprintf(to, "# Read lengths. Use `grep ^RL | cut -f 2-` to extract this part. The columns are: read length, count\n"); + int ilen; + for (ilen=0; ilenmax_len; ilen++) + { + if ( stats->read_lengths[ilen+1]>0 ) + fprintf(to, "RL\t%d\t%ld\n", ilen+1, (long)stats->read_lengths[ilen+1]); + } + + fprintf(to, "# Read lengths - first fragments. Use `grep ^FRL | cut -f 2-` to extract this part. The columns are: read length, count\n"); + for (ilen=0; ilenmax_len_1st; ilen++) + { + if ( stats->read_lengths_1st[ilen+1]>0 ) + fprintf(to, "FRL\t%d\t%ld\n", ilen+1, (long)stats->read_lengths_1st[ilen+1]); + } + + fprintf(to, "# Read lengths - last fragments. Use `grep ^LRL | cut -f 2-` to extract this part. The columns are: read length, count\n"); + for (ilen=0; ilenmax_len_2nd; ilen++) + { + if ( stats->read_lengths_2nd[ilen+1]>0 ) + fprintf(to, "LRL\t%d\t%ld\n", ilen+1, (long)stats->read_lengths_2nd[ilen+1]); + } + + fprintf(to, "# Indel distribution. Use `grep ^ID | cut -f 2-` to extract this part. The columns are: length, number of insertions, number of deletions\n"); + + for (ilen=0; ilennindels; ilen++) + { + if ( stats->insertions[ilen]>0 || stats->deletions[ilen]>0 ) + fprintf(to, "ID\t%d\t%ld\t%ld\n", ilen+1, (long)stats->insertions[ilen], (long)stats->deletions[ilen]); + } + + fprintf(to, "# Indels per cycle. Use `grep ^IC | cut -f 2-` to extract this part. The columns are: cycle, number of insertions (fwd), .. (rev) , number of deletions (fwd), .. (rev)\n"); + for (ilen=0; ilen<=stats->nbases; ilen++) + { + // For deletions we print the index of the cycle before the deleted base (1-based) and for insertions + // the index of the cycle of the first inserted base (also 1-based) + if ( stats->ins_cycles_1st[ilen]>0 || stats->ins_cycles_2nd[ilen]>0 || stats->del_cycles_1st[ilen]>0 || stats->del_cycles_2nd[ilen]>0 ) + fprintf(to, "IC\t%d\t%ld\t%ld\t%ld\t%ld\n", ilen+1, (long)stats->ins_cycles_1st[ilen], (long)stats->ins_cycles_2nd[ilen], (long)stats->del_cycles_1st[ilen], (long)stats->del_cycles_2nd[ilen]); + } + + fprintf(to, "# Coverage distribution. Use `grep ^COV | cut -f 2-` to extract this part.\n"); + if ( stats->cov[0] ) + fprintf(to, "COV\t[<%d]\t%d\t%ld\n",stats->info->cov_min,stats->info->cov_min-1, (long)stats->cov[0]); + for (icov=1; icovncov-1; icov++) + if ( stats->cov[icov] ) + fprintf(to, "COV\t[%d-%d]\t%d\t%ld\n",stats->info->cov_min + (icov-1)*stats->info->cov_step, stats->info->cov_min + icov*stats->info->cov_step-1,stats->info->cov_min + icov*stats->info->cov_step-1, (long)stats->cov[icov]); + if ( stats->cov[stats->ncov-1] ) + fprintf(to, "COV\t[%d<]\t%d\t%ld\n",stats->info->cov_min + (stats->ncov-2)*stats->info->cov_step-1,stats->info->cov_min + (stats->ncov-2)*stats->info->cov_step-1, (long)stats->cov[stats->ncov-1]); + + // Calculate average GC content, then sort by GC and depth + fprintf(to, "# GC-depth. Use `grep ^GCD | cut -f 2-` to extract this part. The columns are: GC%%, unique sequence percentiles, 10th, 25th, 50th, 75th and 90th depth percentile\n"); + uint32_t igcd; + for (igcd=0; igcdigcd; igcd++) + { + if ( stats->info->fai ) + stats->gcd[igcd].gc = rint(100. * stats->gcd[igcd].gc); + else + if ( stats->gcd[igcd].depth ) + stats->gcd[igcd].gc = rint(100. * stats->gcd[igcd].gc / stats->gcd[igcd].depth); + } + if ( stats->ngcd ) + qsort(stats->gcd, stats->igcd+1, sizeof(gc_depth_t), gcd_cmp); + igcd = 0; + while ( igcd < stats->igcd ) + { + // Calculate percentiles (10,25,50,75,90th) for the current GC content and print + uint32_t nbins=0, itmp=igcd; + float gc = stats->gcd[igcd].gc; + while ( itmpigcd && fabs(stats->gcd[itmp].gc-gc)<0.1 ) + { + nbins++; + itmp++; + } + fprintf(to, "GCD\t%.1f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", gc, (igcd+nbins+1)*100./(stats->igcd+1), + gcd_percentile(&(stats->gcd[igcd]),nbins,10) *avg_read_length/stats->info->gcd_bin_size, + gcd_percentile(&(stats->gcd[igcd]),nbins,25) *avg_read_length/stats->info->gcd_bin_size, + gcd_percentile(&(stats->gcd[igcd]),nbins,50) *avg_read_length/stats->info->gcd_bin_size, + gcd_percentile(&(stats->gcd[igcd]),nbins,75) *avg_read_length/stats->info->gcd_bin_size, + gcd_percentile(&(stats->gcd[igcd]),nbins,90) *avg_read_length/stats->info->gcd_bin_size + ); + igcd += nbins; + } +} + +static void init_regions(stats_t *stats, const char *file, stats_info_t* info) +{ + FILE *fp = fopen(file,"r"); + if ( !fp ) error("%s: %s\n",file,strerror(errno)); + + kstring_t line = { 0, 0, NULL }; + int warned = 0, r, p, new_p; + int prev_tid=-1; + hts_pos_t prev_pos=-1LL; + while (line.l = 0, kgetline(&line, (kgets_func *)fgets, fp) >= 0) + { + if ( line.s[0] == '#' ) continue; + + int i = 0; + while ( i=line.l ) error("Could not parse the file: %s [%s]\n", file, line.s); + line.s[i] = '\0'; + + int tid = bam_name2id(stats->info->sam_header, line.s); + if ( tid < 0 ) + { + if ( !warned ) + fprintf(stderr,"Warning: Some sequences not present in the BAM, e.g. \"%s\". This message is printed only once.\n", line.s); + warned = 1; + continue; + } + + if ( tid >= stats->nregions ) + { + if(!(stats->regions = realloc(stats->regions,sizeof(regions_t)*(tid+REG_INC)))) + error("Could not allocate memory for region.\n"); + + int j; + for (j=stats->nregions; jregions[j].npos = stats->regions[j].mpos = stats->regions[j].cpos = 0; + stats->regions[j].pos = NULL; + } + stats->nregions = tid+REG_INC; + } + int npos = stats->regions[tid].npos; + if ( npos >= stats->regions[tid].mpos ) + { + stats->regions[tid].mpos = npos+POS_INC; + if (!(stats->regions[tid].pos = realloc(stats->regions[tid].pos, sizeof(hts_pair_pos_t)*stats->regions[tid].mpos))) + error("Could not allocate memory for interval.\n"); + } + + if ( (sscanf(&line.s[i+1],"%"SCNd64" %"SCNd64, &stats->regions[tid].pos[npos].beg, &stats->regions[tid].pos[npos].end))!=2 ) error("Could not parse the region [%s]\n", &line.s[i+1]); + if ( prev_tid==-1 || prev_tid!=tid ) + { + prev_tid = tid; + prev_pos = stats->regions[tid].pos[npos].beg; + } + if ( prev_pos>stats->regions[tid].pos[npos].beg ) + error("The positions are not in chromosomal order (%s:%"PRIhts_pos" comes after %"PRIhts_pos")\n", line.s, stats->regions[tid].pos[npos].beg, prev_pos); + stats->regions[tid].npos++; + if ( stats->regions[tid].npos > stats->nchunks ) + stats->nchunks = stats->regions[tid].npos; + } + free(line.s); + if ( !stats->regions ) error("Unable to map the -t sequences to the BAM sequences.\n"); + fclose(fp); + + // sort region intervals and remove duplicates + for (r = 0; r < stats->nregions; r++) { + regions_t *reg = &stats->regions[r]; + if ( reg->npos > 1 ) { + qsort(reg->pos, reg->npos, sizeof(hts_pair_pos_t), regions_lt); + for (new_p = 0, p = 1; p < reg->npos; p++) { + if ( reg->pos[new_p].end < reg->pos[p].beg ) + reg->pos[++new_p] = reg->pos[p]; + else if ( reg->pos[new_p].end < reg->pos[p].end ) + reg->pos[new_p].end = reg->pos[p].end; + } + reg->npos = ++new_p; + } + for (p = 0; p < reg->npos; p++) { + if (reg->pos[p].end < HTS_POS_MAX) { + stats->target_count += (reg->pos[p].end - reg->pos[p].beg + 1); + } else { + uint64_t hdr_end = sam_hdr_tid2len(info->sam_header, r); + if (hdr_end) + stats->target_count += (hdr_end - reg->pos[p].beg + 1); + } + } + } + + if (!(stats->chunks = calloc(stats->nchunks, sizeof(hts_pair_pos_t)))) + error("Could not allocate memory for chunk.\n"); +} + +void destroy_regions(stats_t *stats) +{ + int i; + for (i=0; inregions; i++) + { + if ( !stats->regions[i].mpos ) continue; + free(stats->regions[i].pos); + } + if ( stats->regions ) free(stats->regions); + if ( stats->chunks ) free(stats->chunks); +} + +void reset_regions(stats_t *stats) +{ + int i; + for (i=0; inregions; i++) + stats->regions[i].cpos = 0; +} + +int is_in_regions(bam1_t *bam_line, stats_t *stats) +{ + if ( !stats->regions ) return 1; + + if ( bam_line->core.tid >= stats->nregions || bam_line->core.tid<0 ) return 0; + if ( !stats->is_sorted ) error("The BAM must be sorted in order for -t to work.\n"); + + regions_t *reg = &stats->regions[bam_line->core.tid]; + if ( reg->cpos==reg->npos ) return 0; // done for this chr + + // Find a matching interval or skip this read. No splicing of reads is done, no indels or soft clips considered, + // even small overlap is enough to include the read in the stats. + int i = reg->cpos; + while ( inpos && reg->pos[i].end<=bam_line->core.pos ) i++; + if ( i>=reg->npos ) { reg->cpos = reg->npos; return 0; } + int64_t endpos = bam_endpos(bam_line); + if ( endpos < reg->pos[i].beg ) return 0; + + //found a read overlapping a region + reg->cpos = i; + stats->reg_from = reg->pos[i].beg; + stats->reg_to = reg->pos[i].end; + + //now find all the overlapping chunks + stats->nchunks = 0; + while (i < reg->npos) { + if (bam_line->core.pos < reg->pos[i].end && endpos >= reg->pos[i].beg) { + stats->chunks[stats->nchunks].beg = MAX(bam_line->core.pos+1, reg->pos[i].beg); + stats->chunks[stats->nchunks].end = MIN(endpos, reg->pos[i].end); + stats->nchunks++; + } + i++; + } + + return 1; +} + +int replicate_regions(stats_t *stats, hts_itr_multi_t *iter, stats_info_t *info) { + if ( !stats || !iter) + return 1; + + int i, j, tid; + stats->nregions = iter->n_reg; + stats->regions = calloc(stats->nregions, sizeof(regions_t)); + stats->chunks = calloc(stats->nchunks, sizeof(hts_pair_pos_t)); + if ( !stats->regions || !stats->chunks ) + return 1; + + for (i = 0; i < iter->n_reg; i++) { + tid = iter->reg_list[i].tid; + if ( tid < 0 ) + continue; + + if ( tid >= stats->nregions ) { + regions_t *tmp = realloc(stats->regions, (tid+10) * sizeof(regions_t)); + if ( !tmp ) + return 1; + stats->regions = tmp; + memset(stats->regions + stats->nregions, 0, + (tid+10-stats->nregions) * sizeof(regions_t)); + stats->nregions = tid+10; + } + + stats->regions[tid].mpos = stats->regions[tid].npos = iter->reg_list[i].count; + stats->regions[tid].pos = calloc(stats->regions[tid].mpos, sizeof(hts_pair_pos_t)); + if ( !stats->regions[tid].pos ) + return 1; + + for (j = 0; j < stats->regions[tid].npos; j++) { + stats->regions[tid].pos[j].beg = iter->reg_list[i].intervals[j].beg+1; + stats->regions[tid].pos[j].end = iter->reg_list[i].intervals[j].end; + if (stats->regions[tid].pos[j].end < HTS_POS_MAX) { + stats->target_count += (stats->regions[tid].pos[j].end - stats->regions[tid].pos[j].beg + 1); + } else { + uint64_t hdr_end = sam_hdr_tid2len(info->sam_header, tid); + if (hdr_end) + stats->target_count += (hdr_end - stats->regions[tid].pos[j].beg + 1); + } + } + } + + return 0; +} + +static void init_group_id(stats_t *stats, stats_info_t *info, const char *id) +{ + stats->rg_hash = kh_init(rg); + if (!stats->rg_hash) error("Could not initialise RG set\n"); + sam_hdr_t *hdr = info->sam_header; + const char *key; + kstring_t sm = KS_INITIALIZE; + int i, ret, nrg = sam_hdr_count_lines(hdr, "RG"); + if (nrg < 0) error("Could not parse header\n"); + + for (i=0; irg_hash, key, &ret); + if (ret == -1) { ks_free(&sm); error("Could not add key \"%s\" to RG set\n", key); } + } else { /* Check for SM name, as per manual */ + if (!sam_hdr_find_tag_pos(hdr, "RG", i, "SM", &sm)) { + if (!strcmp(ks_c_str(&sm), id)) { + kh_put(rg, stats->rg_hash, key, &ret); + if (ret == -1) { ks_free(&sm); error("Could not add key \"%s\" to RG set\n", key); } + } + } + } + } + + ks_free(&sm); +} + + +static void HTS_NORETURN error(const char *format, ...) +{ + if ( !format ) + { + printf("About: The program collects statistics from BAM files. The output can be visualized using plot-bamstats.\n"); + printf("Usage: samtools stats [OPTIONS] file.bam\n"); + printf(" samtools stats [OPTIONS] file.bam chr:from-to\n"); + printf("Options:\n"); + printf(" -c, --coverage ,, Coverage distribution min,max,step [1,1000,1]\n"); + printf(" -d, --remove-dups Exclude from statistics reads marked as duplicates\n"); + printf(" -X, --customized-index-file Use a customized index file\n"); + printf(" -f, --required-flag Required flag, 0 for unset. See also `samtools flags` [0]\n"); + printf(" -F, --filtering-flag Filtering flag, 0 for unset. See also `samtools flags` [0]\n"); + printf(" --GC-depth the size of GC-depth bins (decreasing bin size increases memory requirement) [2e4]\n"); + printf(" -h, --help This help message\n"); + printf(" -i, --insert-size Maximum insert size [8000]\n"); + printf(" -I, --id Include only listed read group or sample name\n"); + printf(" -l, --read-length Include in the statistics only reads with the given read length [-1]\n"); + printf(" -m, --most-inserts Report only the main part of inserts [0.99]\n"); + printf(" -P, --split-prefix Path or string prefix for filepaths output by -S (default is input filename)\n"); + printf(" -q, --trim-quality The BWA trimming parameter [0]\n"); + printf(" -r, --ref-seq Reference sequence (required for GC-depth and mismatches-per-cycle calculation).\n"); + printf(" -s, --sam Ignored (input format is auto-detected).\n"); + printf(" -S, --split Also write statistics to separate files split by tagged field.\n"); + printf(" -t, --target-regions Do stats in these regions only. Tab-delimited file chr,from,to, 1-based, inclusive.\n"); + printf(" -x, --sparse Suppress outputting IS rows where there are no insertions.\n"); + printf(" -p, --remove-overlaps Remove overlaps of paired-end reads from coverage and base count computations.\n"); + printf(" -g, --cov-threshold Only bases with coverage above this value will be included in the target percentage computation [0]\n"); + sam_global_opt_help(stdout, "-.--.@-."); + printf("\n"); + } + else + { + va_list ap; + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); + } + exit(1); +} + +void cleanup_stats_info(stats_info_t* info){ + if (info->fai) fai_destroy(info->fai); + sam_close(info->sam); + free(info); +} + +void cleanup_stats(stats_t* stats) +{ + free(stats->cov_rbuf.buffer); free(stats->cov); + free(stats->quals_1st); free(stats->quals_2nd); + free(stats->gc_1st); free(stats->gc_2nd); + stats->isize->isize_free(stats->isize->data); + free(stats->isize); + free(stats->gcd); + free(stats->rseq_buf); + free(stats->mpc_buf); + free(stats->acgtno_cycles_1st); + free(stats->acgtno_cycles_2nd); + free(stats->acgtno_revcomp); + free(stats->read_lengths); + free(stats->read_lengths_1st); + free(stats->read_lengths_2nd); + free(stats->insertions); + free(stats->deletions); + free(stats->ins_cycles_1st); + free(stats->ins_cycles_2nd); + free(stats->del_cycles_1st); + free(stats->del_cycles_2nd); + if (stats->acgtno_barcode) free(stats->acgtno_barcode); + if (stats->quals_barcode) free(stats->quals_barcode); + free(stats->tags_barcode); + destroy_regions(stats); + if ( stats->rg_hash ) kh_destroy(rg, stats->rg_hash); + free(stats->split_name); + free(stats); +} + +void output_split_stats(khash_t(c2stats) *split_hash, char* bam_fname, int sparse) +{ + int i = 0; + kstring_t output_filename = { 0, 0, NULL }; + stats_t *curr_stats = NULL; + for(i = kh_begin(split_hash); i != kh_end(split_hash); ++i){ + if(!kh_exist(split_hash, i)) continue; + curr_stats = kh_value(split_hash, i); + round_buffer_flush(curr_stats, -1); + + output_filename.l = 0; + if (curr_stats->info->split_prefix) + kputs(curr_stats->info->split_prefix, &output_filename); + else + kputs(bam_fname, &output_filename); + kputc('_', &output_filename); + kputs(curr_stats->split_name, &output_filename); + kputs(".bamstat", &output_filename); + + FILE *to = fopen(output_filename.s, "w"); + if(to == NULL){ + error("Could not open '%s' for writing.\n", output_filename.s); + } + output_stats(to, curr_stats, sparse); + fclose(to); + } + + free(output_filename.s); +} + +void destroy_split_stats(khash_t(c2stats) *split_hash) +{ + if (!split_hash) + return; + + int i = 0; + stats_t *curr_stats = NULL; + for(i = kh_begin(split_hash); i != kh_end(split_hash); ++i){ + if(!kh_exist(split_hash, i)) continue; + curr_stats = kh_value(split_hash, i); + cleanup_stats(curr_stats); + } + kh_destroy(c2stats, split_hash); +} + +stats_info_t* stats_info_init(int argc, char *argv[]) +{ + stats_info_t* info = calloc(1, sizeof(stats_info_t)); + if (!info) { + return NULL; + } + + info->nisize = 8000; + info->isize_main_bulk = 0.99; // There are always outliers at the far end + info->gcd_bin_size = 20e3; + info->cov_min = 1; + info->cov_max = 1000; + info->cov_step = 1; + info->filter_readlen = -1; + info->argc = argc; + info->argv = argv; + info->remove_overlaps = 0; + info->cov_threshold = 0; + + return info; +} + +int init_stat_info_fname(stats_info_t* info, const char* bam_fname, const htsFormat* in_fmt) +{ + // .. bam + samFile* sam; + if ((sam = sam_open_format(bam_fname, "r", in_fmt)) == 0) { + print_error_errno("stats", "failed to open \"%s\"", bam_fname); + return 1; + } + info->sam = sam; + info->sam_header = sam_hdr_read(sam); + if (info->sam_header == NULL) { + print_error("stats", "failed to read header for \"%s\"", bam_fname); + return 1; + } + return 0; +} + +stats_t* stats_init() +{ + stats_t *stats = calloc(1,sizeof(stats_t)); + if (!stats) + return NULL; + + stats->ngc = 200; + stats->nquals = 256; + stats->nbases = 300; + stats->rseq_pos = -1; + stats->tid = -1; + stats->gcd_pos = -1LL; + stats->igcd = 0; + stats->is_sorted = 1; + stats->nindels = stats->nbases; + stats->split_name = NULL; + stats->nchunks = 0; + stats->pair_count = 0; + stats->last_pair_tid = -2; + stats->last_read_flush = 0; + stats->target_count = 0; + + return stats; +} + +static int init_barcode_tags(stats_t* stats) { + stats->ntags = 4; + stats->tags_barcode = calloc(stats->ntags, sizeof(barcode_info_t)); + if (!stats->tags_barcode) + return -1; + stats->tags_barcode[0] = (barcode_info_t){"BC", "QT", 0, -1, -1, 0}; + stats->tags_barcode[1] = (barcode_info_t){"CR", "CY", 0, -1, -1, 0}; + stats->tags_barcode[2] = (barcode_info_t){"OX", "BZ", 0, -1, -1, 0}; + stats->tags_barcode[3] = (barcode_info_t){"RX", "QX", 0, -1, -1, 0}; + return 0; +} + +static void init_stat_structs(stats_t* stats, stats_info_t* info, const char* group_id, const char* targets) +{ + // Give stats_t a pointer to the info struct + // This saves us having to pass the stats_info_t to every function + stats->info = info; + + // Init structures + // .. coverage bins and round buffer + if ( info->cov_step > info->cov_max - info->cov_min + 1 ) + { + info->cov_step = info->cov_max - info->cov_min; + if ( info->cov_step <= 0 ) + info->cov_step = 1; + } + stats->ncov = 3 + (info->cov_max-info->cov_min) / info->cov_step; + info->cov_max = info->cov_min + ((info->cov_max-info->cov_min)/info->cov_step +1)*info->cov_step - 1; + stats->cov = calloc(sizeof(uint64_t),stats->ncov); + if (!stats->cov) goto nomem; + stats->cov_rbuf.size = stats->nbases*5; + stats->cov_rbuf.buffer = calloc(sizeof(int32_t),stats->cov_rbuf.size); + if (!stats->cov_rbuf.buffer) goto nomem; + if ( group_id ) init_group_id(stats, info, group_id); + // .. arrays + stats->quals_1st = calloc(stats->nquals*stats->nbases,sizeof(uint64_t)); + if (!stats->quals_1st) goto nomem; + stats->quals_2nd = calloc(stats->nquals*stats->nbases,sizeof(uint64_t)); + if (!stats->quals_2nd) goto nomem; + stats->gc_1st = calloc(stats->ngc,sizeof(uint64_t)); + if (!stats->gc_1st) goto nomem; + stats->gc_2nd = calloc(stats->ngc,sizeof(uint64_t)); + if (!stats->gc_2nd) goto nomem; + stats->isize = init_isize_t(info->nisize ?info->nisize+1 :0); + if (!stats->isize) goto nomem; + stats->gcd = calloc(stats->ngcd,sizeof(gc_depth_t)); + if (!stats->gcd) goto nomem; + if (info->fai) { + stats->mpc_buf = calloc(stats->nquals*stats->nbases,sizeof(uint64_t)); + if (!stats->mpc_buf) goto nomem; + } else { + stats->mpc_buf = NULL; + } + stats->acgtno_cycles_1st = calloc(stats->nbases,sizeof(acgtno_count_t)); + if (!stats->acgtno_cycles_1st) goto nomem; + stats->acgtno_cycles_2nd = calloc(stats->nbases,sizeof(acgtno_count_t)); + if (!stats->acgtno_cycles_2nd) goto nomem; + stats->acgtno_revcomp = calloc(stats->nbases,sizeof(acgtno_count_t)); + if (!stats->acgtno_revcomp) goto nomem; + stats->read_lengths = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->read_lengths) goto nomem; + stats->read_lengths_1st = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->read_lengths_1st) goto nomem; + stats->read_lengths_2nd = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->read_lengths_2nd) goto nomem; + stats->insertions = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->insertions) goto nomem; + stats->deletions = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->deletions) goto nomem; + stats->ins_cycles_1st = calloc(stats->nbases+1,sizeof(uint64_t)); + if (!stats->ins_cycles_1st) goto nomem; + stats->ins_cycles_2nd = calloc(stats->nbases+1,sizeof(uint64_t)); + if (!stats->ins_cycles_2nd) goto nomem; + stats->del_cycles_1st = calloc(stats->nbases+1,sizeof(uint64_t)); + if (!stats->del_cycles_1st) goto nomem; + stats->del_cycles_2nd = calloc(stats->nbases+1,sizeof(uint64_t)); + if (!stats->del_cycles_2nd) goto nomem; + if (init_barcode_tags(stats) < 0) + goto nomem; + realloc_rseq_buffer(stats); + if ( targets ) + init_regions(stats, targets, info); + return; + nomem: + error("Out of memory"); +} + +static stats_t* get_curr_split_stats(bam1_t* bam_line, khash_t(c2stats)* split_hash, stats_info_t* info, char* targets) +{ + stats_t *curr_stats = NULL; + const uint8_t *tag_val = bam_aux_get(bam_line, info->split_tag); + if(tag_val == 0){ + error("Tag '%s' not found in bam_line.\n", info->split_tag); + } + char* split_name = strdup(bam_aux2Z(tag_val)); + + // New stats object, under split + khiter_t k = kh_get(c2stats, split_hash, split_name); + if(k == kh_end(split_hash)){ + curr_stats = stats_init(); // mallocs new instance + if (!curr_stats) { + error("Couldn't allocate split stats"); + } + init_stat_structs(curr_stats, info, NULL, targets); + curr_stats->split_name = split_name; + + // Record index in hash + int ret = 0; + khiter_t iter = kh_put(c2stats, split_hash, split_name, &ret); + if( ret < 0 ){ + error("Failed to insert key '%s' into split_hash", split_name); + } + kh_val(split_hash, iter) = curr_stats; // store pointer to stats + } + else{ + curr_stats = kh_value(split_hash, k); + free(split_name); // don't need to hold on to this if it wasn't new + } + return curr_stats; +} + +int main_stats(int argc, char *argv[]) +{ + char *targets = NULL; + char *bam_fname = NULL; + char *bam_idx_fname = NULL; + char *group_id = NULL; + int sparse = 0, has_index_file = 0, ret = 1; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + stats_info_t *info = stats_info_init(argc, argv); + if (!info) { + fprintf(stderr, "Could not allocate memory for info.\n"); + return 1; + } + + static const struct option loptions[] = + { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '@'), + {"help", no_argument, NULL, 'h'}, + {"remove-dups", no_argument, NULL, 'd'}, + {"sam", no_argument, NULL, 's'}, + {"customized-index-file", required_argument, NULL, 'X'}, + {"ref-seq", required_argument, NULL, 'r'}, + {"coverage", required_argument, NULL, 'c'}, + {"read-length", required_argument, NULL, 'l'}, + {"insert-size", required_argument, NULL, 'i'}, + {"most-inserts", required_argument, NULL, 'm'}, + {"trim-quality", required_argument, NULL, 'q'}, + {"target-regions", required_argument, NULL, 't'}, + {"required-flag", required_argument, NULL, 'f'}, + {"filtering-flag", required_argument, NULL, 'F'}, + {"id", required_argument, NULL, 'I'}, + {"GC-depth", required_argument, NULL, 1}, + {"sparse", no_argument, NULL, 'x'}, + {"split", required_argument, NULL, 'S'}, + {"split-prefix", required_argument, NULL, 'P'}, + {"remove-overlaps", no_argument, NULL, 'p'}, + {"cov-threshold", required_argument, NULL, 'g'}, + {NULL, 0, NULL, 0} + }; + int opt; + + while ( (opt=getopt_long(argc,argv,"?hdsXxpr:c:l:i:t:m:q:f:F:g:I:S:P:@:",loptions,NULL))>0 ) + { + switch (opt) + { + case 'f': info->flag_require = bam_str2flag(optarg); break; + case 'F': info->flag_filter |= bam_str2flag(optarg); break; + case 'd': info->flag_filter |= BAM_FDUP; break; + case 'X': has_index_file = 1; break; + case 's': break; + case 'r': info->fai = fai_load(optarg); + if (info->fai==NULL) + error("Could not load faidx: %s\n", optarg); + break; + case 1 : info->gcd_bin_size = atof(optarg); break; + case 'c': if ( sscanf(optarg,"%d,%d,%d",&info->cov_min,&info->cov_max,&info->cov_step)!= 3 ) + error("Unable to parse -c %s\n", optarg); + break; + case 'l': info->filter_readlen = atoi(optarg); break; + case 'i': info->nisize = atoi(optarg); break; + case 'm': info->isize_main_bulk = atof(optarg); break; + case 'q': info->trim_qual = atoi(optarg); break; + case 't': targets = optarg; break; + case 'I': group_id = optarg; break; + case 'x': sparse = 1; break; + case 'S': info->split_tag = optarg; break; + case 'P': info->split_prefix = optarg; break; + case 'p': info->remove_overlaps = 1; break; + case 'g': info->cov_threshold = atoi(optarg); + if ( info->cov_threshold < 0 || info->cov_threshold == INT_MAX ) + error("Unsupported value for coverage threshold %d\n", info->cov_threshold); + break; + case '?': + case 'h': error(NULL); + /* no break */ + default: + if (parse_sam_global_opt(opt, optarg, loptions, &ga) != 0) + error("Unknown argument: %s\n", optarg); + break; + } + } + + bam_fname = argv[optind++]; + if ( !bam_fname ) + { + if ( isatty(STDIN_FILENO) ) + error(NULL); + bam_fname = "-"; + } + + if (init_stat_info_fname(info, bam_fname, &ga.in)) { + cleanup_stats_info(info); + return 1; + } + + if (has_index_file && !(bam_idx_fname = argv[optind++])) { + fprintf(stderr, "No index file provided\n"); + cleanup_stats_info(info); + return 1; + } + + if (ga.nthreads > 0) + hts_set_threads(info->sam, ga.nthreads); + + stats_t *all_stats = stats_init(); + if (!all_stats) { + fprintf(stderr, "Could not allocate memory for stats.\n"); + cleanup_stats_info(info); + return 1; + } + stats_t *curr_stats = NULL; + init_stat_structs(all_stats, info, group_id, targets); + // Init + // .. hash + khash_t(c2stats)* split_hash = kh_init(c2stats); + if (!split_hash) goto cleanup_all_stats; + + khash_t(qn2pair)* read_pairs = kh_init(qn2pair); + if (!read_pairs) goto cleanup_split_hash; + + // Collect statistics + bam1_t *bam_line = bam_init1(); + if (!bam_line) goto cleanup_read_pairs; + + if (optind < argc) { + // Region:interval arguments in the command line + hts_idx_t *bam_idx = NULL; + if (has_index_file) { + bam_idx = sam_index_load2(info->sam, bam_fname, bam_idx_fname); + } else { + // If an index filename has not been specified, look alongside the alignment file + bam_idx = sam_index_load(info->sam, bam_fname); + } + + if (bam_idx) { + hts_itr_multi_t *iter = sam_itr_regarray(bam_idx, info->sam_header, &argv[optind], argc - optind); + if (iter) { + if (!targets) { + all_stats->nchunks = argc-optind; + if (replicate_regions(all_stats, iter, info)) + fprintf(stderr, "Replications of the regions failed\n"); + } + + if ( all_stats->nregions && all_stats->regions ) { + while ((ret = sam_itr_next(info->sam, iter, bam_line)) >= 0) { + if (info->split_tag) { + curr_stats = get_curr_split_stats(bam_line, split_hash, info, targets); + collect_stats(bam_line, curr_stats, read_pairs); + } + collect_stats(bam_line, all_stats, read_pairs); + } + + if (ret < -1) { + fprintf(stderr, "Failure while running the iterator\n"); + hts_itr_multi_destroy(iter); + hts_idx_destroy(bam_idx); + goto cleanup; + } + } + hts_itr_multi_destroy(iter); + } else { + fprintf(stderr, "Multi-region iterator could not be created\n"); + hts_idx_destroy(bam_idx); + goto cleanup; + } + hts_idx_destroy(bam_idx); + } else { + if (has_index_file) + fprintf(stderr, "Invalid index file '%s'\n", bam_idx_fname); + fprintf(stderr, "Random alignment retrieval only works for indexed files\n"); + goto cleanup; + } + } else { + if ( info->cov_threshold > 0 && !targets ) { + fprintf(stderr, "Coverage percentage calculation requires a list of target regions\n"); + goto cleanup; + } + + // Stream through the entire BAM ignoring off-target regions if -t is given + while ((ret = sam_read1(info->sam, info->sam_header, bam_line)) >= 0) { + if (info->split_tag) { + curr_stats = get_curr_split_stats(bam_line, split_hash, info, targets); + collect_stats(bam_line, curr_stats, read_pairs); + } + collect_stats(bam_line, all_stats, read_pairs); + } + + if (ret < -1) { + fprintf(stderr, "Failure while decoding file\n"); + goto cleanup; + } + } + + round_buffer_flush(all_stats, -1); + output_stats(stdout, all_stats, sparse); + if (info->split_tag) + output_split_stats(split_hash, bam_fname, sparse); + + ret = 0; +cleanup: + bam_destroy1(bam_line); + sam_hdr_destroy(info->sam_header); + sam_global_args_free(&ga); + +cleanup_read_pairs: + cleanup_overlaps(read_pairs, INT64_MAX); +cleanup_split_hash: + destroy_split_stats(split_hash); +cleanup_all_stats: + cleanup_stats(all_stats); + cleanup_stats_info(info); + + return ret; +} diff --git a/samtools/stats.c.pysam.c b/samtools/stats.c.pysam.c new file mode 100644 index 0000000..5158827 --- /dev/null +++ b/samtools/stats.c.pysam.c @@ -0,0 +1,2580 @@ +#include "samtools.pysam.h" + +/* stats.c -- This is the former bamcheck integrated into samtools/htslib. + + Copyright (C) 2012-2021 Genome Research Ltd. + + Author: Petr Danecek + Author: Sam Nicholls + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +/* Assumptions, approximations and other issues: + - GC-depth graph does not split reads, the starting position determines which bin is incremented. + There are small overlaps between bins (max readlen-1). However, the bins are big (20k). + - coverage distribution ignores softclips and deletions + - some stats require sorted BAMs + - GC content graph can have an untidy, step-like pattern when BAM contains multiple read lengths. + - 'bases mapped' (stats->nbases_mapped) is calculated from read lengths given by BAM (core.l_qseq) + - With the -t option, the whole reads are used. Except for the number of mapped bases (cigar) + counts, no splicing is done, no indels or soft clips are considered, even small overlap is + good enough to include the read in the stats. + - GC content of reads not calculated for "=" sequences + +*/ + +#include + +#include // for isatty() +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // for crc32 +#include +#include +#include +#include +#include "samtools.h" +#include +#include +#include "stats_isize.h" +#include "sam_opts.h" +#include "bedidx.h" + +#define BWA_MIN_RDLEN 35 +#define DEFAULT_CHUNK_NO 8 +#define DEFAULT_PAIR_MAX 10000 +#define ERROR_LIMIT 200 +// From the spec +// If 0x4 is set, no assumptions can be made about RNAME, POS, CIGAR, MAPQ, bits 0x2, 0x10, 0x100 and 0x800, and the bit 0x20 of the previous read in the template. +#define IS_PAIRED(bam) ((bam)->core.flag&BAM_FPAIRED) +#define IS_PAIRED_AND_MAPPED(bam) (((bam)->core.flag&BAM_FPAIRED) && !((bam)->core.flag&BAM_FUNMAP) && !((bam)->core.flag&BAM_FMUNMAP)) +#define IS_PROPERLYPAIRED(bam) (((bam)->core.flag&(BAM_FPAIRED|BAM_FPROPER_PAIR)) == (BAM_FPAIRED|BAM_FPROPER_PAIR) && !((bam)->core.flag&BAM_FUNMAP)) +#define IS_UNMAPPED(bam) ((bam)->core.flag&BAM_FUNMAP) +#define IS_REVERSE(bam) ((bam)->core.flag&BAM_FREVERSE) +#define IS_MATE_REVERSE(bam) ((bam)->core.flag&BAM_FMREVERSE) +#define IS_READ1(bam) ((bam)->core.flag&BAM_FREAD1) +#define IS_READ2(bam) ((bam)->core.flag&BAM_FREAD2) +#define IS_DUP(bam) ((bam)->core.flag&BAM_FDUP) +#define IS_ORIGINAL(bam) (((bam)->core.flag&(BAM_FSECONDARY|BAM_FSUPPLEMENTARY)) == 0) + +#define READ_ORDER_NONE 0 +#define READ_ORDER_FIRST 1 +#define READ_ORDER_LAST 2 +#define READ_ORDER_MIDDLE 3 + +#define REG_INC 100 +#define POS_INC 1000 + +// The GC-depth graph works as follows: split the reference sequence into +// segments and calculate GC content and depth in each bin. Then sort +// these segments by their GC and plot the depth distribution by means +// of 10th, 25th, etc. depth percentiles. +typedef struct +{ + float gc; + uint32_t depth; +} +gc_depth_t; + +// For coverage distribution, a simple pileup +typedef struct +{ + hts_pos_t pos; + int size, start; + int *buffer; +} +round_buffer_t; + +typedef struct +{ + int npos, mpos, cpos; + hts_pair_pos_t *pos; +} +regions_t; + +typedef struct +{ + uint64_t a; + uint64_t c; + uint64_t g; + uint64_t t; + uint64_t n; + uint64_t other; +} +acgtno_count_t; + +typedef struct +{ + char tag_name[3]; + char qual_name[3]; + uint32_t nbases; + int32_t tag_sep; // Index of the separator (if present) + int32_t max_qual; + uint32_t offset; // Where the tag stats info is located in the allocated memory +} +barcode_info_t; + +typedef struct +{ + // Auxiliary data + int flag_require, flag_filter; + faidx_t *fai; // Reference sequence for GC-depth graph + int argc; // Command line arguments to be printed on the output + char **argv; + int gcd_bin_size; // The size of GC-depth bin + int nisize; // The maximum insert size that the allocated array can hold - 0 indicates no limit + int trim_qual; // bwa trim quality + float isize_main_bulk; // There are always some unrealistically big insert sizes, report only the main part + int cov_min,cov_max,cov_step; // Minimum, maximum coverage and size of the coverage bins + samFile* sam; + sam_hdr_t* sam_header; + + // Filters + int filter_readlen; + + // Misc + char *split_tag; // Tag on which to perform stats splitting + char *split_prefix; // Path or string prefix for filenames created when splitting + int remove_overlaps; + int cov_threshold; +} +stats_info_t; + +typedef struct +{ + // Dimensions of the quality histogram holder (quals_1st,quals_2nd), GC content holder (gc_1st,gc_2nd), + // insert size histogram holder + int nquals; // The number of quality bins + int nbases; // The maximum sequence length the allocated array can hold + int ngc; // The size of gc_1st and gc_2nd + int nindels; // The maximum indel length for indel distribution + + // Arrays for the histogram data + uint64_t *quals_1st, *quals_2nd; + uint64_t *gc_1st, *gc_2nd; + acgtno_count_t *acgtno_cycles_1st, *acgtno_cycles_2nd; + acgtno_count_t *acgtno_revcomp; + uint64_t *read_lengths, *read_lengths_1st, *read_lengths_2nd; + uint64_t *insertions, *deletions; + uint64_t *ins_cycles_1st, *ins_cycles_2nd, *del_cycles_1st, *del_cycles_2nd; + isize_t *isize; + + // The extremes encountered + int max_len; // Maximum read length + int max_len_1st; // Maximum read length for forward reads + int max_len_2nd; // Maximum read length for reverse reads + int max_qual; // Maximum quality + int is_sorted; + + // Summary numbers + uint64_t total_len; + uint64_t total_len_1st; + uint64_t total_len_2nd; + uint64_t total_len_dup; + uint64_t nreads_1st; + uint64_t nreads_2nd; + uint64_t nreads_other; + uint64_t nreads_filtered; + uint64_t nreads_dup; + uint64_t nreads_unmapped; + uint64_t nreads_single_mapped; + uint64_t nreads_paired_and_mapped; + uint64_t nreads_properly_paired; + uint64_t nreads_paired_tech; + uint64_t nreads_anomalous; + uint64_t nreads_mq0; + uint64_t nbases_mapped; + uint64_t nbases_mapped_cigar; + uint64_t nbases_trimmed; // bwa trimmed bases + uint64_t nmismatches; + uint64_t nreads_QCfailed, nreads_secondary, nreads_supplementary; + struct { + uint32_t names, reads, quals; + } checksum; + + // GC-depth related data + uint32_t ngcd, igcd; // The maximum number of GC depth bins and index of the current bin + gc_depth_t *gcd; // The GC-depth bins holder + int32_t tid; // Position of the current bin + hts_pos_t gcd_pos, pos; // Position of the last read + + // Coverage distribution related data + int ncov; // The number of coverage bins + uint64_t *cov; // The coverage frequencies + round_buffer_t cov_rbuf; // Pileup round buffer + + // Mismatches by read cycle + uint8_t *rseq_buf; // A buffer for reference sequence to check the mismatches against + int mrseq_buf; // The size of the buffer + hts_pos_t rseq_pos; // The coordinate of the first base in the buffer + int64_t nrseq_buf; // The used part of the buffer + uint64_t *mpc_buf; // Mismatches per cycle + + // Target regions + int nregions; + hts_pos_t reg_from, reg_to; + regions_t *regions; + + // Auxiliary data + double sum_qual; // For calculating average quality value + void *rg_hash; // Read groups to include, the array is null-terminated + + // Split + char* split_name; + + stats_info_t* info; // Pointer to options and settings struct + hts_pair_pos_t *chunks; + uint32_t nchunks; + + uint32_t pair_count; // Number of active pairs in the pairing hash table + uint64_t target_count; // Number of bases covered by the target file + uint32_t last_pair_tid; + uint32_t last_read_flush; + + // Barcode statistics + acgtno_count_t *acgtno_barcode; + uint64_t *quals_barcode; + barcode_info_t *tags_barcode; + uint32_t ntags; + uint32_t error_number; +} +stats_t; +KHASH_MAP_INIT_STR(c2stats, stats_t*) + +typedef struct { + uint32_t first; // 1 - first read, 2 - second read + uint32_t n, m; // number of chunks, allocated chunks + hts_pair_pos_t *chunks; // chunk array of size m +} pair_t; +KHASH_MAP_INIT_STR(qn2pair, pair_t*) + +KHASH_SET_INIT_STR(rg) + + +static void HTS_NORETURN error(const char *format, ...); +int is_in_regions(bam1_t *bam_line, stats_t *stats); +void realloc_buffers(stats_t *stats, int seq_len); + +static int regions_lt(const void *r1, const void *r2) { + int64_t from_diff = ((hts_pair_pos_t *)r1)->beg - ((hts_pair_pos_t *)r2)->beg; + int64_t to_diff = ((hts_pair_pos_t *)r1)->end - ((hts_pair_pos_t *)r2)->end; + + return from_diff > 0 ? 1 : from_diff < 0 ? -1 : to_diff > 0 ? 1 : to_diff < 0 ? -1 : 0; +} + +// Coverage distribution methods +static inline int coverage_idx(int min, int max, int n, int step, int depth) +{ + if ( depth < min ) + return 0; + + if ( depth > max ) + return n-1; + + return 1 + (depth - min) / step; +} + +static inline int round_buffer_lidx2ridx(int offset, int size, hts_pos_t refpos, hts_pos_t pos) +{ + return (offset + (pos-refpos) % size) % size; +} + +void round_buffer_flush(stats_t *stats, hts_pos_t pos) +{ + int ibuf,idp; + + if ( pos==stats->cov_rbuf.pos ) + return; + + hts_pos_t new_pos = pos; + if ( pos==-1 || pos - stats->cov_rbuf.pos >= stats->cov_rbuf.size ) + { + // Flush the whole buffer, but in sequential order, + pos = stats->cov_rbuf.pos + stats->cov_rbuf.size - 1; + } + + if ( pos < stats->cov_rbuf.pos ) + error("Expected coordinates in ascending order, got %"PRIhts_pos" after %"PRIhts_pos"\n", pos, stats->cov_rbuf.pos); + + int ifrom = stats->cov_rbuf.start; + int ito = round_buffer_lidx2ridx(stats->cov_rbuf.start, stats->cov_rbuf.size, stats->cov_rbuf.pos, pos-1); + if ( ifrom>ito ) + { + for (ibuf=ifrom; ibufcov_rbuf.size; ibuf++) + { + if ( !stats->cov_rbuf.buffer[ibuf] ) + continue; + idp = coverage_idx(stats->info->cov_min,stats->info->cov_max,stats->ncov,stats->info->cov_step,stats->cov_rbuf.buffer[ibuf]); + stats->cov[idp]++; + stats->cov_rbuf.buffer[ibuf] = 0; + } + ifrom = 0; + } + for (ibuf=ifrom; ibuf<=ito; ibuf++) + { + if ( !stats->cov_rbuf.buffer[ibuf] ) + continue; + idp = coverage_idx(stats->info->cov_min,stats->info->cov_max,stats->ncov,stats->info->cov_step,stats->cov_rbuf.buffer[ibuf]); + stats->cov[idp]++; + stats->cov_rbuf.buffer[ibuf] = 0; + } + stats->cov_rbuf.start = (new_pos==-1) ? 0 : round_buffer_lidx2ridx(stats->cov_rbuf.start, stats->cov_rbuf.size, stats->cov_rbuf.pos, pos); + stats->cov_rbuf.pos = new_pos; +} + +/** + * [from, to) - 0 based half-open + */ +static void round_buffer_insert_read(round_buffer_t *rbuf, hts_pos_t from, hts_pos_t to) +{ + if ( to-from > rbuf->size ) + error("The read length too big (%"PRIhts_pos"), please increase the buffer length (currently %d)\n", to-from, rbuf->size); + if ( from < rbuf->pos ) + error("The reads are not sorted (%"PRIhts_pos" comes after %"PRIhts_pos").\n", from, rbuf->pos); + + int ifrom, ito, ibuf; + ifrom = round_buffer_lidx2ridx(rbuf->start, rbuf->size, rbuf->pos, from); + ito = round_buffer_lidx2ridx(rbuf->start, rbuf->size, rbuf->pos, to); + if ( ifrom>ito ) + { + for (ibuf=ifrom; ibufsize; ibuf++) + rbuf->buffer[ibuf]++; + ifrom = 0; + } + for (ibuf=ifrom; ibufbuffer[ibuf]++; +} + +// Calculate the number of bases in the read trimmed by BWA +int bwa_trim_read(int trim_qual, uint8_t *quals, int len, int reverse) +{ + if ( lenmax_sum ) + { + max_sum = sum; + // This is the correct way, but bwa clips from some reason one base less + // max_l = l+1; + max_l = l; + } + } + return max_l; +} + + +void count_indels(stats_t *stats,bam1_t *bam_line) +{ + int is_fwd = IS_REVERSE(bam_line) ? 0 : 1; + uint32_t order = IS_PAIRED(bam_line) ? (IS_READ1(bam_line) ? READ_ORDER_FIRST : 0) + (IS_READ2(bam_line) ? READ_ORDER_LAST : 0) : READ_ORDER_FIRST; + int icig; + int icycle = 0; + int read_len = bam_line->core.l_qseq; + for (icig=0; icigcore.n_cigar; icig++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[icig]); + int ncig = bam_cigar_oplen(bam_get_cigar(bam_line)[icig]); + if ( !ncig ) continue; // curiously, this can happen: 0D + + if ( cig==BAM_CINS ) + { + int idx = is_fwd ? icycle : read_len-icycle-ncig; + if ( idx<0 ) + error("FIXME: read_len=%d vs icycle=%d\n", read_len,icycle); + if ( idx >= stats->nbases || idx<0 ) error("FIXME: %d vs %d, %s:%"PRIhts_pos" %s\n", idx, stats->nbases, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + if ( order == READ_ORDER_FIRST ) + stats->ins_cycles_1st[idx]++; + if ( order == READ_ORDER_LAST ) + stats->ins_cycles_2nd[idx]++; + icycle += ncig; + if ( ncig<=stats->nindels ) + stats->insertions[ncig-1]++; + continue; + } + if ( cig==BAM_CDEL ) + { + int idx = is_fwd ? icycle-1 : read_len-icycle-1; + if ( idx<0 ) continue; // discard meaningless deletions + if ( idx >= stats->nbases ) error("FIXME: %d vs %d\n", idx,stats->nbases); + if ( order == READ_ORDER_FIRST ) + stats->del_cycles_1st[idx]++; + if ( order == READ_ORDER_LAST ) + stats->del_cycles_2nd[idx]++; + if ( ncig<=stats->nindels ) + stats->deletions[ncig-1]++; + continue; + } + if ( cig!=BAM_CREF_SKIP && cig!=BAM_CHARD_CLIP && cig!=BAM_CPAD ) + icycle += ncig; + } +} + +int unclipped_length(bam1_t *bam_line) +{ + int icig, read_len = bam_line->core.l_qseq; + for (icig=0; icigcore.n_cigar; icig++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[icig]); + if ( cig==BAM_CHARD_CLIP ) + read_len += bam_cigar_oplen(bam_get_cigar(bam_line)[icig]); + } + return read_len; +} + +void count_mismatches_per_cycle(stats_t *stats, bam1_t *bam_line, int read_len) +{ + int is_fwd = IS_REVERSE(bam_line) ? 0 : 1; + int icig, iread=0, icycle=0; + hts_pos_t iref = bam_line->core.pos - stats->rseq_pos; + uint8_t *read = bam_get_seq(bam_line); + uint8_t *quals = bam_get_qual(bam_line); + uint64_t *mpc_buf = stats->mpc_buf; + for (icig=0; icigcore.n_cigar; icig++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[icig]); + int ncig = bam_cigar_oplen(bam_get_cigar(bam_line)[icig]); + if ( cig==BAM_CINS ) + { + iread += ncig; + icycle += ncig; + continue; + } + if ( cig==BAM_CDEL ) + { + iref += ncig; + continue; + } + if ( cig==BAM_CSOFT_CLIP ) + { + icycle += ncig; + // Soft-clips are present in the sequence, but the position of the read marks a start of the sequence after clipping + // iref += ncig; + iread += ncig; + continue; + } + if ( cig==BAM_CHARD_CLIP ) + { + icycle += ncig; + continue; + } + // Ignore H and N CIGARs. The letter are inserted e.g. by TopHat and often require very large + // chunk of refseq in memory. Not very frequent and not noticeable in the stats. + if ( cig==BAM_CREF_SKIP || cig==BAM_CHARD_CLIP || cig==BAM_CPAD ) continue; + if ( cig!=BAM_CMATCH && cig!=BAM_CEQUAL && cig!=BAM_CDIFF ) // not relying on precalculated diffs + error("TODO: cigar %d, %s:%"PRIhts_pos" %s\n", cig, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + + if ( ncig+iref > stats->nrseq_buf ) + error("FIXME: %d+%"PRIhts_pos" > %"PRId64", %s, %s:%"PRIhts_pos"\n", ncig, iref, stats->nrseq_buf, bam_get_qname(bam_line), sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1); + + int im; + for (im=0; imrseq_buf[iref]; + + // ---------------15 + // =ACMGRSVTWYHKDBN + if ( cread==15 ) + { + int idx = is_fwd ? icycle : read_len-icycle-1; + if ( idx>stats->max_len ) + error("mpc: %d>%d\n",idx,stats->max_len); + idx = idx*stats->nquals; + if ( idx>=stats->nquals*stats->nbases ) + error("FIXME: mpc_buf overflow\n"); + mpc_buf[idx]++; + } + else if ( cref && cread && cref!=cread ) + { + uint8_t qual = quals[iread] + 1; + if ( qual>=stats->nquals ) + error("TODO: quality too high %d>=%d (%s %"PRIhts_pos" %s)\n", qual, stats->nquals, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + + int idx = is_fwd ? icycle : read_len-icycle-1; + if ( idx>stats->max_len ) + error("mpc: %d>%d (%s %"PRIhts_pos" %s)\n", idx, stats->max_len, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + + idx = idx*stats->nquals + qual; + if ( idx>=stats->nquals*stats->nbases ) + error("FIXME: mpc_buf overflow\n"); + mpc_buf[idx]++; + } + + iref++; + iread++; + icycle++; + } + } +} + +void read_ref_seq(stats_t *stats, int32_t tid, hts_pos_t pos) +{ + int i; + hts_pos_t fai_ref_len; + char *fai_ref = faidx_fetch_seq64(stats->info->fai, sam_hdr_tid2name(stats->info->sam_header, tid), pos, pos+stats->mrseq_buf-1, &fai_ref_len); + if ( fai_ref_len < 0 ) error("Failed to fetch the sequence \"%s\"\n", sam_hdr_tid2name(stats->info->sam_header, tid)); + + uint8_t *ptr = stats->rseq_buf; + for (i=0; imrseq_buf ) memset(ptr,0, stats->mrseq_buf - fai_ref_len); + stats->nrseq_buf = fai_ref_len; + stats->rseq_pos = pos; + stats->tid = tid; +} + +float fai_gc_content(stats_t *stats, hts_pos_t pos, int len) +{ + uint32_t gc,count,c; + hts_pos_t i = pos - stats->rseq_pos, ito = i + len; + assert( i>=0 ); + + if ( ito > stats->nrseq_buf ) ito = stats->nrseq_buf; + + // Count GC content + gc = count = 0; + for (; irseq_buf[i]; + if ( c==2 || c==4 ) + { + gc++; + count++; + } + else if ( c==1 || c==8 ) + count++; + } + return count ? (float)gc/count : 0; +} + +void realloc_rseq_buffer(stats_t *stats) +{ + int n = stats->nbases*10; + if ( stats->info->gcd_bin_size > n ) n = stats->info->gcd_bin_size; + if ( stats->mrseq_bufrseq_buf = realloc(stats->rseq_buf,sizeof(uint8_t)*n); + if (!stats->rseq_buf) { + error("Could not reallocate reference sequence buffer"); + } + stats->mrseq_buf = n; + } +} + +void realloc_gcd_buffer(stats_t *stats, int seq_len) +{ + hts_expand0(gc_depth_t,stats->igcd+1,stats->ngcd,stats->gcd); + realloc_rseq_buffer(stats); +} + +void realloc_buffers(stats_t *stats, int seq_len) +{ + int n = 2*(1 + seq_len - stats->nbases) + stats->nbases; + + stats->quals_1st = realloc(stats->quals_1st, n*stats->nquals*sizeof(uint64_t)); + if ( !stats->quals_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*stats->nquals*sizeof(uint64_t)); + memset(stats->quals_1st + stats->nbases*stats->nquals, 0, (n-stats->nbases)*stats->nquals*sizeof(uint64_t)); + + stats->quals_2nd = realloc(stats->quals_2nd, n*stats->nquals*sizeof(uint64_t)); + if ( !stats->quals_2nd ) + error("Could not realloc buffers, the sequence too long: %d (2x%ld)\n", seq_len,n*stats->nquals*sizeof(uint64_t)); + memset(stats->quals_2nd + stats->nbases*stats->nquals, 0, (n-stats->nbases)*stats->nquals*sizeof(uint64_t)); + + if ( stats->mpc_buf ) + { + stats->mpc_buf = realloc(stats->mpc_buf, n*stats->nquals*sizeof(uint64_t)); + if ( !stats->mpc_buf ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*stats->nquals*sizeof(uint64_t)); + memset(stats->mpc_buf + stats->nbases*stats->nquals, 0, (n-stats->nbases)*stats->nquals*sizeof(uint64_t)); + } + + stats->acgtno_cycles_1st = realloc(stats->acgtno_cycles_1st, n*sizeof(acgtno_count_t)); + if ( !stats->acgtno_cycles_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len, n*sizeof(acgtno_count_t)); + memset(stats->acgtno_cycles_1st + stats->nbases, 0, (n-stats->nbases)*sizeof(acgtno_count_t)); + + stats->acgtno_cycles_2nd = realloc(stats->acgtno_cycles_2nd, n*sizeof(acgtno_count_t)); + if ( !stats->acgtno_cycles_2nd ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len, n*sizeof(acgtno_count_t)); + memset(stats->acgtno_cycles_2nd + stats->nbases, 0, (n-stats->nbases)*sizeof(acgtno_count_t)); + + stats->acgtno_revcomp = realloc(stats->acgtno_revcomp, n*sizeof(acgtno_count_t)); + if ( !stats->acgtno_revcomp ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len, n*sizeof(acgtno_count_t)); + memset(stats->acgtno_revcomp + stats->nbases, 0, (n-stats->nbases)*sizeof(acgtno_count_t)); + + stats->read_lengths = realloc(stats->read_lengths, n*sizeof(uint64_t)); + if ( !stats->read_lengths ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->read_lengths + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->read_lengths_1st = realloc(stats->read_lengths_1st, n*sizeof(uint64_t)); + if ( !stats->read_lengths_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->read_lengths_1st + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->read_lengths_2nd = realloc(stats->read_lengths_2nd, n*sizeof(uint64_t)); + if ( !stats->read_lengths_2nd ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->read_lengths_2nd + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->insertions = realloc(stats->insertions, n*sizeof(uint64_t)); + if ( !stats->insertions ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->insertions + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->deletions = realloc(stats->deletions, n*sizeof(uint64_t)); + if ( !stats->deletions ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,n*sizeof(uint64_t)); + memset(stats->deletions + stats->nbases, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->ins_cycles_1st = realloc(stats->ins_cycles_1st, (n+1)*sizeof(uint64_t)); + if ( !stats->ins_cycles_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,(n+1)*sizeof(uint64_t)); + memset(stats->ins_cycles_1st + stats->nbases + 1, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->ins_cycles_2nd = realloc(stats->ins_cycles_2nd, (n+1)*sizeof(uint64_t)); + if ( !stats->ins_cycles_2nd ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,(n+1)*sizeof(uint64_t)); + memset(stats->ins_cycles_2nd + stats->nbases + 1, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->del_cycles_1st = realloc(stats->del_cycles_1st, (n+1)*sizeof(uint64_t)); + if ( !stats->del_cycles_1st ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,(n+1)*sizeof(uint64_t)); + memset(stats->del_cycles_1st + stats->nbases + 1, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->del_cycles_2nd = realloc(stats->del_cycles_2nd, (n+1)*sizeof(uint64_t)); + if ( !stats->del_cycles_2nd ) + error("Could not realloc buffers, the sequence too long: %d (%ld)\n", seq_len,(n+1)*sizeof(uint64_t)); + memset(stats->del_cycles_2nd + stats->nbases + 1, 0, (n-stats->nbases)*sizeof(uint64_t)); + + stats->nbases = n; + + // Realloc the coverage distribution buffer + int *rbuffer = calloc(sizeof(int),seq_len*5); + if (!rbuffer) { + error("Could not allocate coverage distribution buffer"); + } + n = stats->cov_rbuf.size-stats->cov_rbuf.start; + memcpy(rbuffer,stats->cov_rbuf.buffer+stats->cov_rbuf.start,n); + if ( stats->cov_rbuf.start>1 ) + memcpy(rbuffer+n,stats->cov_rbuf.buffer,stats->cov_rbuf.start); + stats->cov_rbuf.start = 0; + free(stats->cov_rbuf.buffer); + stats->cov_rbuf.buffer = rbuffer; + stats->cov_rbuf.size = seq_len*5; + + realloc_rseq_buffer(stats); +} + +void update_checksum(bam1_t *bam_line, stats_t *stats) +{ + uint8_t *name = (uint8_t*) bam_get_qname(bam_line); + int len = 0; + while ( name[len] ) len++; + stats->checksum.names += crc32(0L, name, len); + + int seq_len = bam_line->core.l_qseq; + if ( !seq_len ) return; + + uint8_t *seq = bam_get_seq(bam_line); + stats->checksum.reads += crc32(0L, seq, (seq_len+1)/2); + + uint8_t *qual = bam_get_qual(bam_line); + stats->checksum.quals += crc32(0L, qual, (seq_len+1)/2); +} + +// Collect statistics about the barcode tags specified by init_barcode_tags method +static void collect_barcode_stats(bam1_t* bam_line, stats_t* stats) { + uint32_t nbases, tag, i; + acgtno_count_t *acgtno; + uint64_t *quals; + int32_t *separator, *maxqual; + + for (tag = 0; tag < stats->ntags; tag++) { + const char *barcode_tag = stats->tags_barcode[tag].tag_name, *qual_tag = stats->tags_barcode[tag].qual_name; + uint8_t* bc = bam_aux_get(bam_line, barcode_tag); + if (!bc) + continue; + + char* barcode = bam_aux2Z(bc); + if (!barcode) + continue; + + uint32_t barcode_len = strlen(barcode); + if (!stats->tags_barcode[tag].nbases) { // tag seen for the first time + uint32_t offset = 0; + for (i = 0; i < stats->ntags; i++) + offset += stats->tags_barcode[i].nbases; + + stats->tags_barcode[tag].offset = offset; + stats->tags_barcode[tag].nbases = barcode_len; + stats->acgtno_barcode = realloc(stats->acgtno_barcode, (offset + barcode_len) * sizeof(acgtno_count_t)); + stats->quals_barcode = realloc(stats->quals_barcode, (offset + barcode_len) * stats->nquals * sizeof(uint64_t)); + + if (!stats->acgtno_barcode || !stats->quals_barcode) + error("Error allocating memory. Aborting!\n"); + + memset(stats->acgtno_barcode + offset, 0, barcode_len*sizeof(acgtno_count_t)); + memset(stats->quals_barcode + offset*stats->nquals, 0, barcode_len*stats->nquals*sizeof(uint64_t)); + } + + nbases = stats->tags_barcode[tag].nbases; + if (barcode_len > nbases) { + fprintf(samtools_stderr, "Barcodes with tag %s differ in length at sequence '%s'\n", barcode_tag, bam_get_qname(bam_line)); + continue; + } + + acgtno = stats->acgtno_barcode + stats->tags_barcode[tag].offset; + quals = stats->quals_barcode + stats->tags_barcode[tag].offset*stats->nquals; + maxqual = &stats->tags_barcode[tag].max_qual; + separator = &stats->tags_barcode[tag].tag_sep; + int error_flag = 0; + + for (i = 0; i < barcode_len; i++) { + switch (barcode[i]) { + case 'A': + acgtno[i].a++; + break; + case 'C': + acgtno[i].c++; + break; + case 'G': + acgtno[i].g++; + break; + case 'T': + acgtno[i].t++; + break; + case 'N': + acgtno[i].n++; + break; + default: + if (*separator >= 0) { + if (*separator != i) { + if (stats->error_number < ERROR_LIMIT) { + fprintf(samtools_stderr, "Barcode separator for tag %s is in a different position or wrong barcode content('%s') at sequence '%s'\n", barcode_tag, barcode, bam_get_qname(bam_line)); + stats->error_number++; + } + error_flag = 1; + } + } else { + *separator = i; + } + } + + /* don't process the rest of the tag bases */ + if (error_flag) + break; + } + + /* skip to the next tag */ + if (error_flag) + continue; + + uint8_t* qt = bam_aux_get(bam_line, qual_tag); + if (!qt) + continue; + + char* barqual = bam_aux2Z(qt); + if (!barqual) + continue; + + uint32_t barqual_len = strlen(barqual); + if (barqual_len == barcode_len) { + for (i = 0; i < barcode_len; i++) { + int32_t qual = (int32_t)barqual[i] - '!'; // Phred + 33 + if (qual >= 0 && qual < stats->nquals) { + quals[i * stats->nquals + qual]++; + if (qual > *maxqual) + *maxqual = qual; + } + } + } else { + if (stats->error_number++ < ERROR_LIMIT) { + fprintf(samtools_stderr, "%s length and %s length don't match for sequence '%s'\n", barcode_tag, qual_tag, bam_get_qname(bam_line)); + } + } + } +} + +// These stats should only be calculated for the original reads ignoring +// supplementary artificial reads otherwise we'll accidentally double count +void collect_orig_read_stats(bam1_t *bam_line, stats_t *stats, int* gc_count_out) +{ + int seq_len = bam_line->core.l_qseq; + stats->total_len += seq_len; // This ignores clipping so only count primary + + if ( bam_line->core.flag & BAM_FQCFAIL ) stats->nreads_QCfailed++; + if ( bam_line->core.flag & BAM_FPAIRED ) stats->nreads_paired_tech++; + + uint32_t order = IS_PAIRED(bam_line) ? (IS_READ1(bam_line) ? READ_ORDER_FIRST : 0) + (IS_READ2(bam_line) ? READ_ORDER_LAST : 0) : READ_ORDER_FIRST; + + // Count GC and ACGT per cycle. Note that cycle is approximate, clipping is ignored + uint8_t *seq = bam_get_seq(bam_line); + int i, read_cycle, gc_count = 0, reverse = IS_REVERSE(bam_line); + + acgtno_count_t *acgtno_cycles = (order == READ_ORDER_FIRST) ? stats->acgtno_cycles_1st : (order == READ_ORDER_LAST) ? stats->acgtno_cycles_2nd : NULL ; + if (acgtno_cycles) { + for (i=0; iacgtno_revcomp[ read_cycle ].t++ : stats->acgtno_revcomp[ read_cycle ].a++; + break; + case 2: + acgtno_cycles[ read_cycle ].c++; + reverse ? stats->acgtno_revcomp[ read_cycle ].g++ : stats->acgtno_revcomp[ read_cycle ].c++; + gc_count++; + break; + case 4: + acgtno_cycles[ read_cycle ].g++; + reverse ? stats->acgtno_revcomp[ read_cycle ].c++ : stats->acgtno_revcomp[ read_cycle ].g++; + gc_count++; + break; + case 8: + reverse ? stats->acgtno_revcomp[ read_cycle ].a++ : stats->acgtno_revcomp[ read_cycle ].t++; + acgtno_cycles[ read_cycle ].t++; + break; + case 15: + acgtno_cycles[ read_cycle ].n++; + break; + default: + /* + * count "=" sequences in "other" along + * with MRSVWYHKDB ambiguity codes + */ + acgtno_cycles[ read_cycle ].other++; + break; + } + } + } + int gc_idx_min = gc_count*(stats->ngc-1)/seq_len; + int gc_idx_max = (gc_count+1)*(stats->ngc-1)/seq_len; + if ( gc_idx_max >= stats->ngc ) gc_idx_max = stats->ngc - 1; + + // Determine which array (1st or 2nd read) will these stats go to, + // trim low quality bases from end the same way BWA does, + // fill GC histogram + uint64_t *quals = NULL; + uint8_t *bam_quals = bam_get_qual(bam_line); + + switch (order) { + case READ_ORDER_FIRST: + quals = stats->quals_1st; + stats->nreads_1st++; + stats->total_len_1st += seq_len; + for (i=gc_idx_min; igc_1st[i]++; + break; + case READ_ORDER_LAST: + quals = stats->quals_2nd; + stats->nreads_2nd++; + stats->total_len_2nd += seq_len; + for (i=gc_idx_min; igc_2nd[i]++; + break; + default: + stats->nreads_other++; + } + if ( stats->info->trim_qual>0 ) + stats->nbases_trimmed += bwa_trim_read(stats->info->trim_qual, bam_quals, seq_len, reverse); + + // Quality histogram and average quality. Clipping is neglected. + if (quals) { + for (i=0; i=stats->nquals ) + error("TODO: quality too high %d>=%d (%s %"PRIhts_pos" %s)\n", qual, stats->nquals, sam_hdr_tid2name(stats->info->sam_header, bam_line->core.tid), bam_line->core.pos+1, bam_get_qname(bam_line)); + if ( qual>stats->max_qual ) + stats->max_qual = qual; + + quals[ i*stats->nquals+qual ]++; + stats->sum_qual += qual; + } + } + + // Barcode statistics + if (order == READ_ORDER_FIRST) { + collect_barcode_stats(bam_line, stats); + } + + // Look at the flags and increment appropriate counters (mapped, paired, etc) + if ( IS_UNMAPPED(bam_line) ) + { + stats->nreads_unmapped++; + } + else + { + stats->nbases_mapped += seq_len; // This ignores clipping so only count primary + + if ( !bam_line->core.qual ) + stats->nreads_mq0++; + if ( !IS_PAIRED_AND_MAPPED(bam_line) ) + stats->nreads_single_mapped++; + else + { + stats->nreads_paired_and_mapped++; + + if (IS_PROPERLYPAIRED(bam_line)) stats->nreads_properly_paired++; + + if ( bam_line->core.tid!=bam_line->core.mtid ) + stats->nreads_anomalous++; + } + } + *gc_count_out = gc_count; +} + +static int cleanup_overlaps(khash_t(qn2pair) *read_pairs, hts_pos_t max) { + if ( !read_pairs ) + return 0; + + int count = 0; + khint_t k; + for (k = kh_begin(read_pairs); k < kh_end(read_pairs); k++) { + if ( kh_exist(read_pairs, k) ) { + char *key = (char *)kh_key(read_pairs, k); + pair_t *val = kh_val(read_pairs, k); + if ( val && val->chunks ) { + if ( val->chunks[val->n-1].end < max ) { + free(val->chunks); + free(val); + free(key); + kh_del(qn2pair, read_pairs, k); + count++; + } + } else { + free(key); + kh_del(qn2pair, read_pairs, k); + count++; + } + } + } + if ( max == INT64_MAX ) + kh_destroy(qn2pair, read_pairs); + + return count; +} + +/** + * [pmin, pmax) - 0 based half-open + */ +static void remove_overlaps(bam1_t *bam_line, khash_t(qn2pair) *read_pairs, stats_t *stats, hts_pos_t pmin, hts_pos_t pmax) { + if ( !bam_line || !read_pairs || !stats ) + return; + + uint32_t order = (IS_READ1(bam_line) ? READ_ORDER_FIRST : 0) + (IS_READ2(bam_line) ? READ_ORDER_LAST : 0); + if ( !(bam_line->core.flag & BAM_FPAIRED) || + (bam_line->core.flag & BAM_FMUNMAP) || + (llabs(bam_line->core.isize) >= 2*bam_line->core.l_qseq) || + (order != READ_ORDER_FIRST && order != READ_ORDER_LAST) ) { + if ( pmin >= 0 ) + round_buffer_insert_read(&(stats->cov_rbuf), pmin, pmax); + return; + } + + char *qname = bam_get_qname(bam_line); + if ( !qname ) { + fprintf(samtools_stderr, "Error retrieving qname for line starting at pos %"PRIhts_pos"\n", bam_line->core.pos); + return; + } + + khint_t k = kh_get(qn2pair, read_pairs, qname); + if ( k == kh_end(read_pairs) ) { //first chunk from this template + if ( pmin == -1 ) + return; + + int ret; + char *s = strdup(qname); + if ( !s ) { + fprintf(samtools_stderr, "Error allocating memory\n"); + return; + } + + k = kh_put(qn2pair, read_pairs, s, &ret); + if ( -1 == ret ) { + error("Error inserting read '%s' in pair hash table\n", qname); + } + + pair_t *pc = calloc(1, sizeof(pair_t)); + if ( !pc ) { + fprintf(samtools_stderr, "Error allocating memory\n"); + return; + } + + pc->m = DEFAULT_CHUNK_NO; + pc->chunks = calloc(pc->m, sizeof(hts_pair_pos_t)); + if ( !pc->chunks ) { + fprintf(samtools_stderr, "Error allocating memory\n"); + free(pc); + return; + } + + pc->chunks[0].beg = pmin; + pc->chunks[0].end = pmax; + pc->n = 1; + pc->first = order; + + kh_val(read_pairs, k) = pc; + stats->pair_count++; + } else { //template already present + pair_t *pc = kh_val(read_pairs, k); + if ( !pc ) { + fprintf(samtools_stderr, "Invalid hash table entry\n"); + return; + } + + if ( order == pc->first ) { //chunk from an existing line + if ( pmin == -1 ) + return; + + if ( pc->n == pc->m ) { + hts_pair_pos_t *tmp = realloc(pc->chunks, (pc->m<<1)*sizeof(hts_pair_pos_t)); + if ( !tmp ) { + fprintf(samtools_stderr, "Error allocating memory\n"); + return; + } + pc->chunks = tmp; + pc->m<<=1; + } + + pc->chunks[pc->n].beg = pmin; + pc->chunks[pc->n].end = pmax; + pc->n++; + } else { //the other line, check for overlapping + if ( pmin == -1 && kh_exist(read_pairs, k) ) { //job done, delete entry + char *key = (char *)kh_key(read_pairs, k); + pair_t *val = kh_val(read_pairs, k); + if ( val) { + free(val->chunks); + free(val); + } + free(key); + kh_del(qn2pair, read_pairs, k); + stats->pair_count--; + return; + } + + int i; + for (i=0; in; i++) { + if ( pmin >= pc->chunks[i].end ) + continue; + + if ( pmax <= pc->chunks[i].beg ) //no overlap + break; + + if ( pmin < pc->chunks[i].beg ) { //overlap at the beginning + round_buffer_insert_read(&(stats->cov_rbuf), pmin, pc->chunks[i].beg); + pmin = pc->chunks[i].beg; + } + + if ( pmax <= pc->chunks[i].end ) { //completely contained + stats->nbases_mapped_cigar -= (pmax - pmin); + return; + } else { //overlap at the end + stats->nbases_mapped_cigar -= (pc->chunks[i].end - pmin); + pmin = pc->chunks[i].end; + } + } + } + } + round_buffer_insert_read(&(stats->cov_rbuf), pmin, pmax); +} + +void collect_stats(bam1_t *bam_line, stats_t *stats, khash_t(qn2pair) *read_pairs) +{ + if ( !is_in_regions(bam_line,stats) ) + return; + if ( stats->rg_hash ) + { + const uint8_t *rg = bam_aux_get(bam_line, "RG"); + if ( !rg ) return; // certain read groups were requested but this record has none + khint_t k = kh_get(rg, stats->rg_hash, (const char*)(rg + 1)); + if ( k == kh_end((kh_rg_t *)stats->rg_hash) ) return; + } + if ( stats->info->flag_require && (bam_line->core.flag & stats->info->flag_require)!=stats->info->flag_require ) + { + stats->nreads_filtered++; + return; + } + if ( stats->info->flag_filter && (bam_line->core.flag & stats->info->flag_filter) ) + { + stats->nreads_filtered++; + return; + } + if ( stats->info->filter_readlen!=-1 && bam_line->core.l_qseq!=stats->info->filter_readlen ) + return; + + update_checksum(bam_line, stats); + + // Secondary reads don't count for most stats purposes + if ( bam_line->core.flag & BAM_FSECONDARY ) + { + stats->nreads_secondary++; + return; + } + + if ( bam_line->core.flag & BAM_FSUPPLEMENTARY ) + { + stats->nreads_supplementary++; + } + + // If line has no sequence cannot continue + int seq_len = bam_line->core.l_qseq; + if ( !seq_len ) return; + + if ( IS_DUP(bam_line) ) + { + stats->total_len_dup += seq_len; + stats->nreads_dup++; + } + + uint32_t order = IS_PAIRED(bam_line) ? (IS_READ1(bam_line) ? READ_ORDER_FIRST : 0) + (IS_READ2(bam_line) ? READ_ORDER_LAST : 0) : READ_ORDER_FIRST; + + int read_len = unclipped_length(bam_line); + if ( read_len >= stats->nbases ) + realloc_buffers(stats,read_len); + // Update max_len observed + if ( stats->max_lenmax_len = read_len; + if ( order == READ_ORDER_FIRST && stats->max_len_1st < read_len ) + stats->max_len_1st = read_len; + if ( order == READ_ORDER_LAST && stats->max_len_2nd < read_len ) + stats->max_len_2nd = read_len; + + int i; + int gc_count = 0; + + // These stats should only be calculated for the original reads ignoring supplementary artificial reads + // otherwise we'll accidentally double count + if ( IS_ORIGINAL(bam_line) ) { + stats->read_lengths[read_len]++; + if ( order == READ_ORDER_FIRST ) stats->read_lengths_1st[read_len]++; + if ( order == READ_ORDER_LAST ) stats->read_lengths_2nd[read_len]++; + collect_orig_read_stats(bam_line, stats, &gc_count); + } + + // Look at the flags and increment appropriate counters (mapped, paired, etc) + if ( IS_UNMAPPED(bam_line) ) return; + + count_indels(stats, bam_line); + + if ( IS_PAIRED_AND_MAPPED(bam_line) && IS_ORIGINAL(bam_line) ) + { + // The insert size is tricky, because for long inserts the libraries are + // prepared differently and the pairs point in other direction. BWA does + // not set the paired flag for them. Similar thing is true also for 454 + // reads. Mates mapped to different chromosomes have isize==0. + int32_t isize = bam_line->core.isize; + if ( isize<0 ) isize = -isize; + if ( stats->info->nisize > 0 && isize > stats->info->nisize ) + isize = stats->info->nisize; + if ( isize>0 || bam_line->core.tid==bam_line->core.mtid ) + { + hts_pos_t pos_fst = bam_line->core.mpos - bam_line->core.pos; + int is_fst = IS_READ1(bam_line) ? 1 : -1; + int is_fwd = IS_REVERSE(bam_line) ? -1 : 1; + int is_mfwd = IS_MATE_REVERSE(bam_line) ? -1 : 1; + + if ( is_fwd*is_mfwd>0 ) + stats->isize->inc_other(stats->isize->data, isize); + else if ( is_fst*pos_fst>=0 ) + { + if ( is_fst*is_fwd>0 ) + stats->isize->inc_inward(stats->isize->data, isize); + else + stats->isize->inc_outward(stats->isize->data, isize); + } + else if ( is_fst*pos_fst<0 ) + { + if ( is_fst*is_fwd>0 ) + stats->isize->inc_outward(stats->isize->data, isize); + else + stats->isize->inc_inward(stats->isize->data, isize); + } + } + } + + // Number of mismatches + uint8_t *nm = bam_aux_get(bam_line,"NM"); + if (nm) + stats->nmismatches += bam_aux2i(nm); + + // Number of mapped bases from cigar + if ( bam_line->core.n_cigar == 0) + error("FIXME: mapped read with no cigar?\n"); + int readlen=seq_len; + if ( stats->regions ) + { + // Count only on-target bases + hts_pos_t iref = bam_line->core.pos + 1; + for (i=0; icore.n_cigar; i++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[i]); + int ncig = bam_cigar_oplen(bam_get_cigar(bam_line)[i]); + if ( !ncig ) continue; // curiously, this can happen: 0D + if ( cig==BAM_CDEL ) readlen += ncig; + else if ( cig==BAM_CMATCH || cig==BAM_CEQUAL || cig==BAM_CDIFF ) + { + if ( iref < stats->reg_from ) ncig -= stats->reg_from-iref; + else if ( iref+ncig-1 > stats->reg_to ) ncig -= iref+ncig-1 - stats->reg_to; + if ( ncig<0 ) ncig = 0; + stats->nbases_mapped_cigar += ncig; + iref += bam_cigar_oplen(bam_get_cigar(bam_line)[i]); + } + else if ( cig==BAM_CINS ) + { + iref += ncig; + if ( iref>=stats->reg_from && iref<=stats->reg_to ) + stats->nbases_mapped_cigar += ncig; + } + } + } + else + { + // Count the whole read + for (i=0; icore.n_cigar; i++) + { + int cig = bam_cigar_op(bam_get_cigar(bam_line)[i]); + if ( cig==BAM_CMATCH || cig==BAM_CINS || cig==BAM_CEQUAL || cig==BAM_CDIFF ) + stats->nbases_mapped_cigar += bam_cigar_oplen(bam_get_cigar(bam_line)[i]); + if ( cig==BAM_CDEL ) + readlen += bam_cigar_oplen(bam_get_cigar(bam_line)[i]); + } + } + + if ( stats->tid==bam_line->core.tid && bam_line->core.pospos ) + stats->is_sorted = 0; + stats->pos = bam_line->core.pos; + + if ( stats->is_sorted ) + { + if ( stats->tid==-1 || stats->tid!=bam_line->core.tid ) { + round_buffer_flush(stats, -1); + } + + //cleanup the pair hash table to free memory + stats->last_read_flush++; + if ( stats->pair_count > DEFAULT_PAIR_MAX && stats->last_read_flush > DEFAULT_PAIR_MAX) { + stats->pair_count -= cleanup_overlaps(read_pairs, bam_line->core.pos); + stats->last_read_flush = 0; + } + + if ( stats->last_pair_tid != bam_line->core.tid) { + stats->pair_count -= cleanup_overlaps(read_pairs, INT64_MAX-1); + stats->last_pair_tid = bam_line->core.tid; + stats->last_read_flush = 0; + } + + // Mismatches per cycle and GC-depth graph. For simplicity, reads overlapping GCD bins + // are not splitted which results in up to seq_len-1 overlaps. The default bin size is + // 20kbp, so the effect is negligible. + if ( stats->info->fai ) + { + int inc_ref = 0, inc_gcd = 0; + // First pass or new chromosome + if ( stats->rseq_pos==-1 || stats->tid != bam_line->core.tid ) { inc_ref=1; inc_gcd=1; } + // Read goes beyond the end of the rseq buffer + else if ( stats->rseq_pos+stats->nrseq_buf < bam_line->core.pos+readlen ) { inc_ref=1; inc_gcd=1; } + // Read overlaps the next gcd bin + else if ( stats->gcd_pos+stats->info->gcd_bin_size < bam_line->core.pos+readlen ) + { + inc_gcd = 1; + if ( stats->rseq_pos+stats->nrseq_buf < bam_line->core.pos+stats->info->gcd_bin_size ) inc_ref = 1; + } + if ( inc_gcd ) + { + stats->igcd++; + if ( stats->igcd >= stats->ngcd ) + realloc_gcd_buffer(stats, readlen); + if ( inc_ref ) + read_ref_seq(stats,bam_line->core.tid,bam_line->core.pos); + stats->gcd_pos = bam_line->core.pos; + stats->gcd[ stats->igcd ].gc = fai_gc_content(stats, stats->gcd_pos, stats->info->gcd_bin_size); + } + + count_mismatches_per_cycle(stats,bam_line,read_len); + } + // No reference and first pass, new chromosome or sequence going beyond the end of the gcd bin + else if ( stats->gcd_pos==-1 || stats->tid != bam_line->core.tid || bam_line->core.pos - stats->gcd_pos > stats->info->gcd_bin_size ) + { + // First pass or a new chromosome + stats->tid = bam_line->core.tid; + stats->gcd_pos = bam_line->core.pos; + stats->igcd++; + if ( stats->igcd >= stats->ngcd ) + realloc_gcd_buffer(stats, readlen); + } + stats->gcd[ stats->igcd ].depth++; + // When no reference sequence is given, approximate the GC from the read (much shorter window, but otherwise OK) + if ( !stats->info->fai ) + stats->gcd[ stats->igcd ].gc += (float) gc_count / seq_len; + + // Coverage distribution graph + round_buffer_flush(stats,bam_line->core.pos); + if ( stats->regions ) { + hts_pos_t p = bam_line->core.pos, pnew, pmin = 0, pmax = 0; + uint32_t j = 0; + i = 0; + while ( j < bam_line->core.n_cigar && i < stats->nchunks ) { + int op = bam_cigar_op(bam_get_cigar(bam_line)[j]); + int oplen = bam_cigar_oplen(bam_get_cigar(bam_line)[j]); + switch(op) { + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + pmin = MAX(p, stats->chunks[i].beg-1); // 0 based + pmax = MIN(p+oplen, stats->chunks[i].end); // 1 based + if ( pmax > pmin ) { + if ( stats->info->remove_overlaps ) + remove_overlaps(bam_line, read_pairs, stats, pmin, pmax); + else + round_buffer_insert_read(&(stats->cov_rbuf), pmin, pmax); + } + break; + case BAM_CDEL: + break; + } + pnew = p + (bam_cigar_type(op)&2 ? oplen : 0); // consumes reference + + if ( pnew >= stats->chunks[i].end ) { + // go to the next chunk + i++; + } else { + // go to the next CIGAR op + j++; + p = pnew; + } + } + } else { + hts_pos_t p = bam_line->core.pos; + uint32_t j; + for (j = 0; j < bam_line->core.n_cigar; j++) { + int op = bam_cigar_op(bam_get_cigar(bam_line)[j]); + int oplen = bam_cigar_oplen(bam_get_cigar(bam_line)[j]); + switch(op) { + case BAM_CMATCH: + case BAM_CEQUAL: + case BAM_CDIFF: + if ( stats->info->remove_overlaps ) + remove_overlaps(bam_line, read_pairs, stats, p, p+oplen); + else + round_buffer_insert_read(&(stats->cov_rbuf), p, p+oplen); + break; + case BAM_CDEL: + break; + } + p += bam_cigar_type(op)&2 ? oplen : 0; // consumes reference + } + } + if ( stats->info->remove_overlaps ) + remove_overlaps(bam_line, read_pairs, stats, -1LL, -1LL); //remove the line from the hash table + } +} + +// Sort by GC and depth +#define GCD_t(x) ((gc_depth_t *)x) +static int gcd_cmp(const void *a, const void *b) +{ + if ( GCD_t(a)->gc < GCD_t(b)->gc ) return -1; + if ( GCD_t(a)->gc > GCD_t(b)->gc ) return 1; + if ( GCD_t(a)->depth < GCD_t(b)->depth ) return -1; + if ( GCD_t(a)->depth > GCD_t(b)->depth ) return 1; + return 0; +} +#undef GCD_t + +float gcd_percentile(gc_depth_t *gcd, int N, int p) +{ + float n,d; + int k; + + n = (float)p*(N+1)/100; + k = n; + if ( k<=0 ) + return gcd[0].depth; + if ( k>=N ) + return gcd[N-1].depth; + + d = n - k; + return gcd[k-1].depth + d*(gcd[k].depth - gcd[k-1].depth); +} + +void output_stats(FILE *to, stats_t *stats, int sparse) +{ + // Calculate average insert size and standard deviation (from the main bulk data only) + int isize, ibulk=0, icov; + uint64_t nisize=0, nisize_inward=0, nisize_outward=0, nisize_other=0, cov_sum=0; + double bulk=0, avg_isize=0, sd_isize=0; + for (isize=0; isizeisize->nitems(stats->isize->data); isize++) + { + // Each pair was counted twice + stats->isize->set_inward(stats->isize->data, isize, stats->isize->inward(stats->isize->data, isize) * 0.5); + stats->isize->set_outward(stats->isize->data, isize, stats->isize->outward(stats->isize->data, isize) * 0.5); + stats->isize->set_other(stats->isize->data, isize, stats->isize->other(stats->isize->data, isize) * 0.5); + + nisize_inward += stats->isize->inward(stats->isize->data, isize); + nisize_outward += stats->isize->outward(stats->isize->data, isize); + nisize_other += stats->isize->other(stats->isize->data, isize); + nisize += stats->isize->inward(stats->isize->data, isize) + stats->isize->outward(stats->isize->data, isize) + stats->isize->other(stats->isize->data, isize); + } + + for (isize=0; isizeisize->nitems(stats->isize->data); isize++) + { + uint64_t num = stats->isize->inward(stats->isize->data, isize) + stats->isize->outward(stats->isize->data, isize) + stats->isize->other(stats->isize->data, isize); + if (num > 0) ibulk = isize + 1; + bulk += num; + avg_isize += isize * (stats->isize->inward(stats->isize->data, isize) + stats->isize->outward(stats->isize->data, isize) + stats->isize->other(stats->isize->data, isize)); + + if ( bulk/nisize > stats->info->isize_main_bulk ) + { + ibulk = isize+1; + nisize = bulk; + break; + } + } + avg_isize /= nisize ? nisize : 1; + for (isize=1; isizeisize->inward(stats->isize->data, isize) + stats->isize->outward(stats->isize->data, isize) +stats->isize->other(stats->isize->data, isize)) * (isize-avg_isize)*(isize-avg_isize) / (nisize ? nisize : 1); + sd_isize = sqrt(sd_isize); + + fprintf(to, "# This file was produced by samtools stats (%s+htslib-%s) and can be plotted using plot-bamstats\n", samtools_version(), hts_version()); + if( stats->split_name != NULL ){ + fprintf(to, "# This file contains statistics only for reads with tag: %s=%s\n", stats->info->split_tag, stats->split_name); + } + else{ + fprintf(to, "# This file contains statistics for all reads.\n"); + } + fprintf(to, "# The command line was: %s",stats->info->argv[0]); + int i; + for (i=1; iinfo->argc; i++) + fprintf(to, " %s", stats->info->argv[i]); + fprintf(to, "\n"); + fprintf(to, "# CHK, Checksum\t[2]Read Names\t[3]Sequences\t[4]Qualities\n"); + fprintf(to, "# CHK, CRC32 of reads which passed filtering followed by addition (32bit overflow)\n"); + fprintf(to, "CHK\t%08x\t%08x\t%08x\n", stats->checksum.names,stats->checksum.reads,stats->checksum.quals); + fprintf(to, "# Summary Numbers. Use `grep ^SN | cut -f 2-` to extract this part.\n"); + fprintf(to, "SN\traw total sequences:\t%ld\t# excluding supplementary and secondary reads\n", (long)(stats->nreads_filtered+stats->nreads_1st+stats->nreads_2nd+stats->nreads_other)); // not counting excluded seqs (and none of the below) + fprintf(to, "SN\tfiltered sequences:\t%ld\n", (long)stats->nreads_filtered); + fprintf(to, "SN\tsequences:\t%ld\n", (long)(stats->nreads_1st+stats->nreads_2nd+stats->nreads_other)); + fprintf(to, "SN\tis sorted:\t%d\n", stats->is_sorted ? 1 : 0); + fprintf(to, "SN\t1st fragments:\t%ld\n", (long)stats->nreads_1st); + fprintf(to, "SN\tlast fragments:\t%ld\n", (long)stats->nreads_2nd); + fprintf(to, "SN\treads mapped:\t%ld\n", (long)(stats->nreads_paired_and_mapped+stats->nreads_single_mapped)); + fprintf(to, "SN\treads mapped and paired:\t%ld\t# paired-end technology bit set + both mates mapped\n", (long)stats->nreads_paired_and_mapped); + fprintf(to, "SN\treads unmapped:\t%ld\n", (long)stats->nreads_unmapped); + fprintf(to, "SN\treads properly paired:\t%ld\t# proper-pair bit set\n", (long)stats->nreads_properly_paired); + fprintf(to, "SN\treads paired:\t%ld\t# paired-end technology bit set\n", (long)stats->nreads_paired_tech); + fprintf(to, "SN\treads duplicated:\t%ld\t# PCR or optical duplicate bit set\n", (long)stats->nreads_dup); + fprintf(to, "SN\treads MQ0:\t%ld\t# mapped and MQ=0\n", (long)stats->nreads_mq0); + fprintf(to, "SN\treads QC failed:\t%ld\n", (long)stats->nreads_QCfailed); + fprintf(to, "SN\tnon-primary alignments:\t%ld\n", (long)stats->nreads_secondary); + fprintf(to, "SN\tsupplementary alignments:\t%ld\n", (long)stats->nreads_supplementary); + fprintf(to, "SN\ttotal length:\t%ld\t# ignores clipping\n", (long)stats->total_len); + fprintf(to, "SN\ttotal first fragment length:\t%ld\t# ignores clipping\n", (long)stats->total_len_1st); + fprintf(to, "SN\ttotal last fragment length:\t%ld\t# ignores clipping\n", (long)stats->total_len_2nd); + fprintf(to, "SN\tbases mapped:\t%ld\t# ignores clipping\n", (long)stats->nbases_mapped); // the length of the whole read goes here, including soft-clips etc. + fprintf(to, "SN\tbases mapped (cigar):\t%ld\t# more accurate\n", (long)stats->nbases_mapped_cigar); // only matched and inserted bases are counted here + fprintf(to, "SN\tbases trimmed:\t%ld\n", (long)stats->nbases_trimmed); + fprintf(to, "SN\tbases duplicated:\t%ld\n", (long)stats->total_len_dup); + fprintf(to, "SN\tmismatches:\t%ld\t# from NM fields\n", (long)stats->nmismatches); + fprintf(to, "SN\terror rate:\t%e\t# mismatches / bases mapped (cigar)\n", stats->nbases_mapped_cigar ? (float)stats->nmismatches/stats->nbases_mapped_cigar : 0); + float avg_read_length = (stats->nreads_1st+stats->nreads_2nd+stats->nreads_other)?stats->total_len/(stats->nreads_1st+stats->nreads_2nd+stats->nreads_other):0; + fprintf(to, "SN\taverage length:\t%.0f\n", avg_read_length); + fprintf(to, "SN\taverage first fragment length:\t%.0f\n", stats->nreads_1st? (float)stats->total_len_1st/stats->nreads_1st:0); + fprintf(to, "SN\taverage last fragment length:\t%.0f\n", stats->nreads_2nd? (float)stats->total_len_2nd/stats->nreads_2nd:0); + fprintf(to, "SN\tmaximum length:\t%d\n", stats->max_len); + fprintf(to, "SN\tmaximum first fragment length:\t%d\n", stats->max_len_1st); + fprintf(to, "SN\tmaximum last fragment length:\t%d\n", stats->max_len_2nd); + fprintf(to, "SN\taverage quality:\t%.1f\n", stats->total_len?stats->sum_qual/stats->total_len:0); + fprintf(to, "SN\tinsert size average:\t%.1f\n", avg_isize); + fprintf(to, "SN\tinsert size standard deviation:\t%.1f\n", sd_isize); + fprintf(to, "SN\tinward oriented pairs:\t%ld\n", (long)nisize_inward); + fprintf(to, "SN\toutward oriented pairs:\t%ld\n", (long)nisize_outward); + fprintf(to, "SN\tpairs with other orientation:\t%ld\n", (long)nisize_other); + fprintf(to, "SN\tpairs on different chromosomes:\t%ld\n", (long)stats->nreads_anomalous/2); + fprintf(to, "SN\tpercentage of properly paired reads (%%):\t%.1f\n", (stats->nreads_1st+stats->nreads_2nd+stats->nreads_other)? (float)(100*stats->nreads_properly_paired)/(stats->nreads_1st+stats->nreads_2nd+stats->nreads_other):0); + if ( stats->target_count ) { + fprintf(to, "SN\tbases inside the target:\t%" PRIu64 "\n", stats->target_count); + for (icov=stats->info->cov_threshold+1; icovncov; icov++) + cov_sum += stats->cov[icov]; + fprintf(to, "SN\tpercentage of target genome with coverage > %d (%%):\t%.2f\n", stats->info->cov_threshold, (float)(100*cov_sum)/stats->target_count); + } + + int ibase,iqual; + if ( stats->max_lennbases ) stats->max_len++; + if ( stats->max_qual+1nquals ) stats->max_qual++; + fprintf(to, "# First Fragment Qualities. Use `grep ^FFQ | cut -f 2-` to extract this part.\n"); + fprintf(to, "# Columns correspond to qualities and rows to cycles. First column is the cycle number.\n"); + for (ibase=0; ibasemax_len_1st; ibase++) + { + fprintf(to, "FFQ\t%d",ibase+1); + for (iqual=0; iqual<=stats->max_qual; iqual++) + { + fprintf(to, "\t%ld", (long)stats->quals_1st[ibase*stats->nquals+iqual]); + } + fprintf(to, "\n"); + } + fprintf(to, "# Last Fragment Qualities. Use `grep ^LFQ | cut -f 2-` to extract this part.\n"); + fprintf(to, "# Columns correspond to qualities and rows to cycles. First column is the cycle number.\n"); + for (ibase=0; ibasemax_len_2nd; ibase++) + { + fprintf(to, "LFQ\t%d",ibase+1); + for (iqual=0; iqual<=stats->max_qual; iqual++) + { + fprintf(to, "\t%ld", (long)stats->quals_2nd[ibase*stats->nquals+iqual]); + } + fprintf(to, "\n"); + } + if ( stats->mpc_buf ) + { + fprintf(to, "# Mismatches per cycle and quality. Use `grep ^MPC | cut -f 2-` to extract this part.\n"); + fprintf(to, "# Columns correspond to qualities, rows to cycles. First column is the cycle number, second\n"); + fprintf(to, "# is the number of N's and the rest is the number of mismatches\n"); + for (ibase=0; ibasemax_len; ibase++) + { + fprintf(to, "MPC\t%d",ibase+1); + for (iqual=0; iqual<=stats->max_qual; iqual++) + { + fprintf(to, "\t%ld", (long)stats->mpc_buf[ibase*stats->nquals+iqual]); + } + fprintf(to, "\n"); + } + } + fprintf(to, "# GC Content of first fragments. Use `grep ^GCF | cut -f 2-` to extract this part.\n"); + int ibase_prev = 0; + for (ibase=0; ibasengc; ibase++) + { + if ( stats->gc_1st[ibase]==stats->gc_1st[ibase_prev] ) continue; + fprintf(to, "GCF\t%.2f\t%ld\n", (ibase+ibase_prev)*0.5*100./(stats->ngc-1), (long)stats->gc_1st[ibase_prev]); + ibase_prev = ibase; + } + fprintf(to, "# GC Content of last fragments. Use `grep ^GCL | cut -f 2-` to extract this part.\n"); + ibase_prev = 0; + for (ibase=0; ibasengc; ibase++) + { + if ( stats->gc_2nd[ibase]==stats->gc_2nd[ibase_prev] ) continue; + fprintf(to, "GCL\t%.2f\t%ld\n", (ibase+ibase_prev)*0.5*100./(stats->ngc-1), (long)stats->gc_2nd[ibase_prev]); + ibase_prev = ibase; + } + fprintf(to, "# ACGT content per cycle. Use `grep ^GCC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N and O counts as a percentage of all A/C/G/T bases [%%]\n"); + for (ibase=0; ibasemax_len; ibase++) + { + acgtno_count_t *acgtno_count_1st = &(stats->acgtno_cycles_1st[ibase]); + acgtno_count_t *acgtno_count_2nd = &(stats->acgtno_cycles_2nd[ibase]); + uint64_t acgt_sum = acgtno_count_1st->a + acgtno_count_1st->c + acgtno_count_1st->g + acgtno_count_1st->t + + acgtno_count_2nd->a + acgtno_count_2nd->c + acgtno_count_2nd->g + acgtno_count_2nd->t; + if ( ! acgt_sum ) continue; + fprintf(to, "GCC\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", ibase+1, + 100.*(acgtno_count_1st->a + acgtno_count_2nd->a)/acgt_sum, + 100.*(acgtno_count_1st->c + acgtno_count_2nd->c)/acgt_sum, + 100.*(acgtno_count_1st->g + acgtno_count_2nd->g)/acgt_sum, + 100.*(acgtno_count_1st->t + acgtno_count_2nd->t)/acgt_sum, + 100.*(acgtno_count_1st->n + acgtno_count_2nd->n)/acgt_sum, + 100.*(acgtno_count_1st->other + acgtno_count_2nd->other)/acgt_sum); + } + fprintf(to, "# ACGT content per cycle, read oriented. Use `grep ^GCT | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]\n"); + for (ibase=0; ibasemax_len; ibase++) + { + acgtno_count_t *acgtno_count = &(stats->acgtno_revcomp[ibase]); + uint64_t acgt_sum = acgtno_count->a + acgtno_count->c + acgtno_count->g + acgtno_count->t; + if ( ! acgt_sum ) continue; + fprintf(to, "GCT\t%d\t%.2f\t%.2f\t%.2f\t%.2f\n", ibase+1, + 100.*(acgtno_count->a)/acgt_sum, + 100.*(acgtno_count->c)/acgt_sum, + 100.*(acgtno_count->g)/acgt_sum, + 100.*(acgtno_count->t)/acgt_sum); + } + + uint64_t tA=0, tC=0, tG=0, tT=0, tN=0; + fprintf(to, "# ACGT content per cycle for first fragments. Use `grep ^FBC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N and O counts as a percentage of all A/C/G/T bases [%%]\n"); + for (ibase=0; ibasemax_len; ibase++) + { + acgtno_count_t *acgtno_count_1st = &(stats->acgtno_cycles_1st[ibase]); + uint64_t acgt_sum_1st = acgtno_count_1st->a + acgtno_count_1st->c + acgtno_count_1st->g + acgtno_count_1st->t; + tA += acgtno_count_1st->a; + tC += acgtno_count_1st->c; + tG += acgtno_count_1st->g; + tT += acgtno_count_1st->t; + tN += acgtno_count_1st->n; + + if ( acgt_sum_1st ) + fprintf(to, "FBC\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", ibase+1, + 100.*acgtno_count_1st->a/acgt_sum_1st, + 100.*acgtno_count_1st->c/acgt_sum_1st, + 100.*acgtno_count_1st->g/acgt_sum_1st, + 100.*acgtno_count_1st->t/acgt_sum_1st, + 100.*acgtno_count_1st->n/acgt_sum_1st, + 100.*acgtno_count_1st->other/acgt_sum_1st); + + } + fprintf(to, "# ACGT raw counters for first fragments. Use `grep ^FTC | cut -f 2-` to extract this part. The columns are: A,C,G,T,N base counters\n"); + fprintf(to, "FTC\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\n", tA, tC, tG, tT, tN); + tA=0, tC=0, tG=0, tT=0, tN=0; + fprintf(to, "# ACGT content per cycle for last fragments. Use `grep ^LBC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N and O counts as a percentage of all A/C/G/T bases [%%]\n"); + for (ibase=0; ibasemax_len; ibase++) + { + acgtno_count_t *acgtno_count_2nd = &(stats->acgtno_cycles_2nd[ibase]); + uint64_t acgt_sum_2nd = acgtno_count_2nd->a + acgtno_count_2nd->c + acgtno_count_2nd->g + acgtno_count_2nd->t; + tA += acgtno_count_2nd->a; + tC += acgtno_count_2nd->c; + tG += acgtno_count_2nd->g; + tT += acgtno_count_2nd->t; + tN += acgtno_count_2nd->n; + + if ( acgt_sum_2nd ) + fprintf(to, "LBC\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", ibase+1, + 100.*acgtno_count_2nd->a/acgt_sum_2nd, + 100.*acgtno_count_2nd->c/acgt_sum_2nd, + 100.*acgtno_count_2nd->g/acgt_sum_2nd, + 100.*acgtno_count_2nd->t/acgt_sum_2nd, + 100.*acgtno_count_2nd->n/acgt_sum_2nd, + 100.*acgtno_count_2nd->other/acgt_sum_2nd); + + } + fprintf(to, "# ACGT raw counters for last fragments. Use `grep ^LTC | cut -f 2-` to extract this part. The columns are: A,C,G,T,N base counters\n"); + fprintf(to, "LTC\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\t%" PRId64 "\n", tA, tC, tG, tT, tN); + + int tag; + for (tag=0; tagntags; tag++) { + if (stats->tags_barcode[tag].nbases) { + fprintf(to, "# ACGT content per cycle for barcodes. Use `grep ^%sC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N counts as a percentage of all A/C/G/T bases [%%]\n", + stats->tags_barcode[tag].tag_name); + for (ibase=0; ibasetags_barcode[tag].nbases; ibase++) + { + if (ibase == stats->tags_barcode[tag].tag_sep) + continue; + + acgtno_count_t *acgtno_count = stats->acgtno_barcode + stats->tags_barcode[tag].offset + ibase; + uint64_t acgt_sum = acgtno_count->a + acgtno_count->c + acgtno_count->g + acgtno_count->t; + + if ( acgt_sum ) + fprintf(to, "%sC%d\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", stats->tags_barcode[tag].tag_name, + stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? 1 : 2, + stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? ibase+1 : ibase-stats->tags_barcode[tag].tag_sep, + 100.*acgtno_count->a/acgt_sum, + 100.*acgtno_count->c/acgt_sum, + 100.*acgtno_count->g/acgt_sum, + 100.*acgtno_count->t/acgt_sum, + 100.*acgtno_count->n/acgt_sum); + } + + fprintf(to, "# Barcode Qualities. Use `grep ^%sQ | cut -f 2-` to extract this part.\n", stats->tags_barcode[tag].qual_name); + fprintf(to, "# Columns correspond to qualities and rows to barcode cycles. First column is the cycle number.\n"); + for (ibase=0; ibasetags_barcode[tag].nbases; ibase++) + { + if (ibase == stats->tags_barcode[tag].tag_sep) + continue; + + fprintf(to, "%sQ%d\t%d", stats->tags_barcode[tag].qual_name, + stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? 1 : 2, + stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? ibase+1 : ibase-stats->tags_barcode[tag].tag_sep); + for (iqual=0; iqual<=stats->tags_barcode[tag].max_qual; iqual++) + { + fprintf(to, "\t%ld", (long)stats->quals_barcode[(stats->tags_barcode[tag].offset + ibase)*stats->nquals+iqual]); + } + fprintf(to, "\n"); + } + } + } + + fprintf(to, "# Insert sizes. Use `grep ^IS | cut -f 2-` to extract this part. The columns are: insert size, pairs total, inward oriented pairs, outward oriented pairs, other pairs\n"); + for (isize=0; isizeisize->inward(stats->isize->data, isize)); + long out = (long)(stats->isize->outward(stats->isize->data, isize)); + long other = (long)(stats->isize->other(stats->isize->data, isize)); + if (!sparse || in + out + other > 0) { + fprintf(to, "IS\t%d\t%ld\t%ld\t%ld\t%ld\n", isize, in+out+other, + in , out, other); + } + } + + fprintf(to, "# Read lengths. Use `grep ^RL | cut -f 2-` to extract this part. The columns are: read length, count\n"); + int ilen; + for (ilen=0; ilenmax_len; ilen++) + { + if ( stats->read_lengths[ilen+1]>0 ) + fprintf(to, "RL\t%d\t%ld\n", ilen+1, (long)stats->read_lengths[ilen+1]); + } + + fprintf(to, "# Read lengths - first fragments. Use `grep ^FRL | cut -f 2-` to extract this part. The columns are: read length, count\n"); + for (ilen=0; ilenmax_len_1st; ilen++) + { + if ( stats->read_lengths_1st[ilen+1]>0 ) + fprintf(to, "FRL\t%d\t%ld\n", ilen+1, (long)stats->read_lengths_1st[ilen+1]); + } + + fprintf(to, "# Read lengths - last fragments. Use `grep ^LRL | cut -f 2-` to extract this part. The columns are: read length, count\n"); + for (ilen=0; ilenmax_len_2nd; ilen++) + { + if ( stats->read_lengths_2nd[ilen+1]>0 ) + fprintf(to, "LRL\t%d\t%ld\n", ilen+1, (long)stats->read_lengths_2nd[ilen+1]); + } + + fprintf(to, "# Indel distribution. Use `grep ^ID | cut -f 2-` to extract this part. The columns are: length, number of insertions, number of deletions\n"); + + for (ilen=0; ilennindels; ilen++) + { + if ( stats->insertions[ilen]>0 || stats->deletions[ilen]>0 ) + fprintf(to, "ID\t%d\t%ld\t%ld\n", ilen+1, (long)stats->insertions[ilen], (long)stats->deletions[ilen]); + } + + fprintf(to, "# Indels per cycle. Use `grep ^IC | cut -f 2-` to extract this part. The columns are: cycle, number of insertions (fwd), .. (rev) , number of deletions (fwd), .. (rev)\n"); + for (ilen=0; ilen<=stats->nbases; ilen++) + { + // For deletions we print the index of the cycle before the deleted base (1-based) and for insertions + // the index of the cycle of the first inserted base (also 1-based) + if ( stats->ins_cycles_1st[ilen]>0 || stats->ins_cycles_2nd[ilen]>0 || stats->del_cycles_1st[ilen]>0 || stats->del_cycles_2nd[ilen]>0 ) + fprintf(to, "IC\t%d\t%ld\t%ld\t%ld\t%ld\n", ilen+1, (long)stats->ins_cycles_1st[ilen], (long)stats->ins_cycles_2nd[ilen], (long)stats->del_cycles_1st[ilen], (long)stats->del_cycles_2nd[ilen]); + } + + fprintf(to, "# Coverage distribution. Use `grep ^COV | cut -f 2-` to extract this part.\n"); + if ( stats->cov[0] ) + fprintf(to, "COV\t[<%d]\t%d\t%ld\n",stats->info->cov_min,stats->info->cov_min-1, (long)stats->cov[0]); + for (icov=1; icovncov-1; icov++) + if ( stats->cov[icov] ) + fprintf(to, "COV\t[%d-%d]\t%d\t%ld\n",stats->info->cov_min + (icov-1)*stats->info->cov_step, stats->info->cov_min + icov*stats->info->cov_step-1,stats->info->cov_min + icov*stats->info->cov_step-1, (long)stats->cov[icov]); + if ( stats->cov[stats->ncov-1] ) + fprintf(to, "COV\t[%d<]\t%d\t%ld\n",stats->info->cov_min + (stats->ncov-2)*stats->info->cov_step-1,stats->info->cov_min + (stats->ncov-2)*stats->info->cov_step-1, (long)stats->cov[stats->ncov-1]); + + // Calculate average GC content, then sort by GC and depth + fprintf(to, "# GC-depth. Use `grep ^GCD | cut -f 2-` to extract this part. The columns are: GC%%, unique sequence percentiles, 10th, 25th, 50th, 75th and 90th depth percentile\n"); + uint32_t igcd; + for (igcd=0; igcdigcd; igcd++) + { + if ( stats->info->fai ) + stats->gcd[igcd].gc = rint(100. * stats->gcd[igcd].gc); + else + if ( stats->gcd[igcd].depth ) + stats->gcd[igcd].gc = rint(100. * stats->gcd[igcd].gc / stats->gcd[igcd].depth); + } + if ( stats->ngcd ) + qsort(stats->gcd, stats->igcd+1, sizeof(gc_depth_t), gcd_cmp); + igcd = 0; + while ( igcd < stats->igcd ) + { + // Calculate percentiles (10,25,50,75,90th) for the current GC content and print + uint32_t nbins=0, itmp=igcd; + float gc = stats->gcd[igcd].gc; + while ( itmpigcd && fabs(stats->gcd[itmp].gc-gc)<0.1 ) + { + nbins++; + itmp++; + } + fprintf(to, "GCD\t%.1f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", gc, (igcd+nbins+1)*100./(stats->igcd+1), + gcd_percentile(&(stats->gcd[igcd]),nbins,10) *avg_read_length/stats->info->gcd_bin_size, + gcd_percentile(&(stats->gcd[igcd]),nbins,25) *avg_read_length/stats->info->gcd_bin_size, + gcd_percentile(&(stats->gcd[igcd]),nbins,50) *avg_read_length/stats->info->gcd_bin_size, + gcd_percentile(&(stats->gcd[igcd]),nbins,75) *avg_read_length/stats->info->gcd_bin_size, + gcd_percentile(&(stats->gcd[igcd]),nbins,90) *avg_read_length/stats->info->gcd_bin_size + ); + igcd += nbins; + } +} + +static void init_regions(stats_t *stats, const char *file, stats_info_t* info) +{ + FILE *fp = fopen(file,"r"); + if ( !fp ) error("%s: %s\n",file,strerror(errno)); + + kstring_t line = { 0, 0, NULL }; + int warned = 0, r, p, new_p; + int prev_tid=-1; + hts_pos_t prev_pos=-1LL; + while (line.l = 0, kgetline(&line, (kgets_func *)fgets, fp) >= 0) + { + if ( line.s[0] == '#' ) continue; + + int i = 0; + while ( i=line.l ) error("Could not parse the file: %s [%s]\n", file, line.s); + line.s[i] = '\0'; + + int tid = bam_name2id(stats->info->sam_header, line.s); + if ( tid < 0 ) + { + if ( !warned ) + fprintf(samtools_stderr,"Warning: Some sequences not present in the BAM, e.g. \"%s\". This message is printed only once.\n", line.s); + warned = 1; + continue; + } + + if ( tid >= stats->nregions ) + { + if(!(stats->regions = realloc(stats->regions,sizeof(regions_t)*(tid+REG_INC)))) + error("Could not allocate memory for region.\n"); + + int j; + for (j=stats->nregions; jregions[j].npos = stats->regions[j].mpos = stats->regions[j].cpos = 0; + stats->regions[j].pos = NULL; + } + stats->nregions = tid+REG_INC; + } + int npos = stats->regions[tid].npos; + if ( npos >= stats->regions[tid].mpos ) + { + stats->regions[tid].mpos = npos+POS_INC; + if (!(stats->regions[tid].pos = realloc(stats->regions[tid].pos, sizeof(hts_pair_pos_t)*stats->regions[tid].mpos))) + error("Could not allocate memory for interval.\n"); + } + + if ( (sscanf(&line.s[i+1],"%"SCNd64" %"SCNd64, &stats->regions[tid].pos[npos].beg, &stats->regions[tid].pos[npos].end))!=2 ) error("Could not parse the region [%s]\n", &line.s[i+1]); + if ( prev_tid==-1 || prev_tid!=tid ) + { + prev_tid = tid; + prev_pos = stats->regions[tid].pos[npos].beg; + } + if ( prev_pos>stats->regions[tid].pos[npos].beg ) + error("The positions are not in chromosomal order (%s:%"PRIhts_pos" comes after %"PRIhts_pos")\n", line.s, stats->regions[tid].pos[npos].beg, prev_pos); + stats->regions[tid].npos++; + if ( stats->regions[tid].npos > stats->nchunks ) + stats->nchunks = stats->regions[tid].npos; + } + free(line.s); + if ( !stats->regions ) error("Unable to map the -t sequences to the BAM sequences.\n"); + fclose(fp); + + // sort region intervals and remove duplicates + for (r = 0; r < stats->nregions; r++) { + regions_t *reg = &stats->regions[r]; + if ( reg->npos > 1 ) { + qsort(reg->pos, reg->npos, sizeof(hts_pair_pos_t), regions_lt); + for (new_p = 0, p = 1; p < reg->npos; p++) { + if ( reg->pos[new_p].end < reg->pos[p].beg ) + reg->pos[++new_p] = reg->pos[p]; + else if ( reg->pos[new_p].end < reg->pos[p].end ) + reg->pos[new_p].end = reg->pos[p].end; + } + reg->npos = ++new_p; + } + for (p = 0; p < reg->npos; p++) { + if (reg->pos[p].end < HTS_POS_MAX) { + stats->target_count += (reg->pos[p].end - reg->pos[p].beg + 1); + } else { + uint64_t hdr_end = sam_hdr_tid2len(info->sam_header, r); + if (hdr_end) + stats->target_count += (hdr_end - reg->pos[p].beg + 1); + } + } + } + + if (!(stats->chunks = calloc(stats->nchunks, sizeof(hts_pair_pos_t)))) + error("Could not allocate memory for chunk.\n"); +} + +void destroy_regions(stats_t *stats) +{ + int i; + for (i=0; inregions; i++) + { + if ( !stats->regions[i].mpos ) continue; + free(stats->regions[i].pos); + } + if ( stats->regions ) free(stats->regions); + if ( stats->chunks ) free(stats->chunks); +} + +void reset_regions(stats_t *stats) +{ + int i; + for (i=0; inregions; i++) + stats->regions[i].cpos = 0; +} + +int is_in_regions(bam1_t *bam_line, stats_t *stats) +{ + if ( !stats->regions ) return 1; + + if ( bam_line->core.tid >= stats->nregions || bam_line->core.tid<0 ) return 0; + if ( !stats->is_sorted ) error("The BAM must be sorted in order for -t to work.\n"); + + regions_t *reg = &stats->regions[bam_line->core.tid]; + if ( reg->cpos==reg->npos ) return 0; // done for this chr + + // Find a matching interval or skip this read. No splicing of reads is done, no indels or soft clips considered, + // even small overlap is enough to include the read in the stats. + int i = reg->cpos; + while ( inpos && reg->pos[i].end<=bam_line->core.pos ) i++; + if ( i>=reg->npos ) { reg->cpos = reg->npos; return 0; } + int64_t endpos = bam_endpos(bam_line); + if ( endpos < reg->pos[i].beg ) return 0; + + //found a read overlapping a region + reg->cpos = i; + stats->reg_from = reg->pos[i].beg; + stats->reg_to = reg->pos[i].end; + + //now find all the overlapping chunks + stats->nchunks = 0; + while (i < reg->npos) { + if (bam_line->core.pos < reg->pos[i].end && endpos >= reg->pos[i].beg) { + stats->chunks[stats->nchunks].beg = MAX(bam_line->core.pos+1, reg->pos[i].beg); + stats->chunks[stats->nchunks].end = MIN(endpos, reg->pos[i].end); + stats->nchunks++; + } + i++; + } + + return 1; +} + +int replicate_regions(stats_t *stats, hts_itr_multi_t *iter, stats_info_t *info) { + if ( !stats || !iter) + return 1; + + int i, j, tid; + stats->nregions = iter->n_reg; + stats->regions = calloc(stats->nregions, sizeof(regions_t)); + stats->chunks = calloc(stats->nchunks, sizeof(hts_pair_pos_t)); + if ( !stats->regions || !stats->chunks ) + return 1; + + for (i = 0; i < iter->n_reg; i++) { + tid = iter->reg_list[i].tid; + if ( tid < 0 ) + continue; + + if ( tid >= stats->nregions ) { + regions_t *tmp = realloc(stats->regions, (tid+10) * sizeof(regions_t)); + if ( !tmp ) + return 1; + stats->regions = tmp; + memset(stats->regions + stats->nregions, 0, + (tid+10-stats->nregions) * sizeof(regions_t)); + stats->nregions = tid+10; + } + + stats->regions[tid].mpos = stats->regions[tid].npos = iter->reg_list[i].count; + stats->regions[tid].pos = calloc(stats->regions[tid].mpos, sizeof(hts_pair_pos_t)); + if ( !stats->regions[tid].pos ) + return 1; + + for (j = 0; j < stats->regions[tid].npos; j++) { + stats->regions[tid].pos[j].beg = iter->reg_list[i].intervals[j].beg+1; + stats->regions[tid].pos[j].end = iter->reg_list[i].intervals[j].end; + if (stats->regions[tid].pos[j].end < HTS_POS_MAX) { + stats->target_count += (stats->regions[tid].pos[j].end - stats->regions[tid].pos[j].beg + 1); + } else { + uint64_t hdr_end = sam_hdr_tid2len(info->sam_header, tid); + if (hdr_end) + stats->target_count += (hdr_end - stats->regions[tid].pos[j].beg + 1); + } + } + } + + return 0; +} + +static void init_group_id(stats_t *stats, stats_info_t *info, const char *id) +{ + stats->rg_hash = kh_init(rg); + if (!stats->rg_hash) error("Could not initialise RG set\n"); + sam_hdr_t *hdr = info->sam_header; + const char *key; + kstring_t sm = KS_INITIALIZE; + int i, ret, nrg = sam_hdr_count_lines(hdr, "RG"); + if (nrg < 0) error("Could not parse header\n"); + + for (i=0; irg_hash, key, &ret); + if (ret == -1) { ks_free(&sm); error("Could not add key \"%s\" to RG set\n", key); } + } else { /* Check for SM name, as per manual */ + if (!sam_hdr_find_tag_pos(hdr, "RG", i, "SM", &sm)) { + if (!strcmp(ks_c_str(&sm), id)) { + kh_put(rg, stats->rg_hash, key, &ret); + if (ret == -1) { ks_free(&sm); error("Could not add key \"%s\" to RG set\n", key); } + } + } + } + } + + ks_free(&sm); +} + + +static void HTS_NORETURN error(const char *format, ...) +{ + if ( !format ) + { + fprintf(samtools_stdout, "About: The program collects statistics from BAM files. The output can be visualized using plot-bamstats.\n"); + fprintf(samtools_stdout, "Usage: samtools stats [OPTIONS] file.bam\n"); + fprintf(samtools_stdout, " samtools stats [OPTIONS] file.bam chr:from-to\n"); + fprintf(samtools_stdout, "Options:\n"); + fprintf(samtools_stdout, " -c, --coverage ,, Coverage distribution min,max,step [1,1000,1]\n"); + fprintf(samtools_stdout, " -d, --remove-dups Exclude from statistics reads marked as duplicates\n"); + fprintf(samtools_stdout, " -X, --customized-index-file Use a customized index file\n"); + fprintf(samtools_stdout, " -f, --required-flag Required flag, 0 for unset. See also `samtools flags` [0]\n"); + fprintf(samtools_stdout, " -F, --filtering-flag Filtering flag, 0 for unset. See also `samtools flags` [0]\n"); + fprintf(samtools_stdout, " --GC-depth the size of GC-depth bins (decreasing bin size increases memory requirement) [2e4]\n"); + fprintf(samtools_stdout, " -h, --help This help message\n"); + fprintf(samtools_stdout, " -i, --insert-size Maximum insert size [8000]\n"); + fprintf(samtools_stdout, " -I, --id Include only listed read group or sample name\n"); + fprintf(samtools_stdout, " -l, --read-length Include in the statistics only reads with the given read length [-1]\n"); + fprintf(samtools_stdout, " -m, --most-inserts Report only the main part of inserts [0.99]\n"); + fprintf(samtools_stdout, " -P, --split-prefix Path or string prefix for filepaths output by -S (default is input filename)\n"); + fprintf(samtools_stdout, " -q, --trim-quality The BWA trimming parameter [0]\n"); + fprintf(samtools_stdout, " -r, --ref-seq Reference sequence (required for GC-depth and mismatches-per-cycle calculation).\n"); + fprintf(samtools_stdout, " -s, --sam Ignored (input format is auto-detected).\n"); + fprintf(samtools_stdout, " -S, --split Also write statistics to separate files split by tagged field.\n"); + fprintf(samtools_stdout, " -t, --target-regions Do stats in these regions only. Tab-delimited file chr,from,to, 1-based, inclusive.\n"); + fprintf(samtools_stdout, " -x, --sparse Suppress outputting IS rows where there are no insertions.\n"); + fprintf(samtools_stdout, " -p, --remove-overlaps Remove overlaps of paired-end reads from coverage and base count computations.\n"); + fprintf(samtools_stdout, " -g, --cov-threshold Only bases with coverage above this value will be included in the target percentage computation [0]\n"); + sam_global_opt_help(samtools_stdout, "-.--.@-."); + fprintf(samtools_stdout, "\n"); + } + else + { + va_list ap; + va_start(ap, format); + vfprintf(samtools_stderr, format, ap); + va_end(ap); + } + samtools_exit(1); +} + +void cleanup_stats_info(stats_info_t* info){ + if (info->fai) fai_destroy(info->fai); + sam_close(info->sam); + free(info); +} + +void cleanup_stats(stats_t* stats) +{ + free(stats->cov_rbuf.buffer); free(stats->cov); + free(stats->quals_1st); free(stats->quals_2nd); + free(stats->gc_1st); free(stats->gc_2nd); + stats->isize->isize_free(stats->isize->data); + free(stats->isize); + free(stats->gcd); + free(stats->rseq_buf); + free(stats->mpc_buf); + free(stats->acgtno_cycles_1st); + free(stats->acgtno_cycles_2nd); + free(stats->acgtno_revcomp); + free(stats->read_lengths); + free(stats->read_lengths_1st); + free(stats->read_lengths_2nd); + free(stats->insertions); + free(stats->deletions); + free(stats->ins_cycles_1st); + free(stats->ins_cycles_2nd); + free(stats->del_cycles_1st); + free(stats->del_cycles_2nd); + if (stats->acgtno_barcode) free(stats->acgtno_barcode); + if (stats->quals_barcode) free(stats->quals_barcode); + free(stats->tags_barcode); + destroy_regions(stats); + if ( stats->rg_hash ) kh_destroy(rg, stats->rg_hash); + free(stats->split_name); + free(stats); +} + +void output_split_stats(khash_t(c2stats) *split_hash, char* bam_fname, int sparse) +{ + int i = 0; + kstring_t output_filename = { 0, 0, NULL }; + stats_t *curr_stats = NULL; + for(i = kh_begin(split_hash); i != kh_end(split_hash); ++i){ + if(!kh_exist(split_hash, i)) continue; + curr_stats = kh_value(split_hash, i); + round_buffer_flush(curr_stats, -1); + + output_filename.l = 0; + if (curr_stats->info->split_prefix) + kputs(curr_stats->info->split_prefix, &output_filename); + else + kputs(bam_fname, &output_filename); + kputc('_', &output_filename); + kputs(curr_stats->split_name, &output_filename); + kputs(".bamstat", &output_filename); + + FILE *to = fopen(output_filename.s, "w"); + if(to == NULL){ + error("Could not open '%s' for writing.\n", output_filename.s); + } + output_stats(to, curr_stats, sparse); + fclose(to); + } + + free(output_filename.s); +} + +void destroy_split_stats(khash_t(c2stats) *split_hash) +{ + if (!split_hash) + return; + + int i = 0; + stats_t *curr_stats = NULL; + for(i = kh_begin(split_hash); i != kh_end(split_hash); ++i){ + if(!kh_exist(split_hash, i)) continue; + curr_stats = kh_value(split_hash, i); + cleanup_stats(curr_stats); + } + kh_destroy(c2stats, split_hash); +} + +stats_info_t* stats_info_init(int argc, char *argv[]) +{ + stats_info_t* info = calloc(1, sizeof(stats_info_t)); + if (!info) { + return NULL; + } + + info->nisize = 8000; + info->isize_main_bulk = 0.99; // There are always outliers at the far end + info->gcd_bin_size = 20e3; + info->cov_min = 1; + info->cov_max = 1000; + info->cov_step = 1; + info->filter_readlen = -1; + info->argc = argc; + info->argv = argv; + info->remove_overlaps = 0; + info->cov_threshold = 0; + + return info; +} + +int init_stat_info_fname(stats_info_t* info, const char* bam_fname, const htsFormat* in_fmt) +{ + // .. bam + samFile* sam; + if ((sam = sam_open_format(bam_fname, "r", in_fmt)) == 0) { + print_error_errno("stats", "failed to open \"%s\"", bam_fname); + return 1; + } + info->sam = sam; + info->sam_header = sam_hdr_read(sam); + if (info->sam_header == NULL) { + print_error("stats", "failed to read header for \"%s\"", bam_fname); + return 1; + } + return 0; +} + +stats_t* stats_init() +{ + stats_t *stats = calloc(1,sizeof(stats_t)); + if (!stats) + return NULL; + + stats->ngc = 200; + stats->nquals = 256; + stats->nbases = 300; + stats->rseq_pos = -1; + stats->tid = -1; + stats->gcd_pos = -1LL; + stats->igcd = 0; + stats->is_sorted = 1; + stats->nindels = stats->nbases; + stats->split_name = NULL; + stats->nchunks = 0; + stats->pair_count = 0; + stats->last_pair_tid = -2; + stats->last_read_flush = 0; + stats->target_count = 0; + + return stats; +} + +static int init_barcode_tags(stats_t* stats) { + stats->ntags = 4; + stats->tags_barcode = calloc(stats->ntags, sizeof(barcode_info_t)); + if (!stats->tags_barcode) + return -1; + stats->tags_barcode[0] = (barcode_info_t){"BC", "QT", 0, -1, -1, 0}; + stats->tags_barcode[1] = (barcode_info_t){"CR", "CY", 0, -1, -1, 0}; + stats->tags_barcode[2] = (barcode_info_t){"OX", "BZ", 0, -1, -1, 0}; + stats->tags_barcode[3] = (barcode_info_t){"RX", "QX", 0, -1, -1, 0}; + return 0; +} + +static void init_stat_structs(stats_t* stats, stats_info_t* info, const char* group_id, const char* targets) +{ + // Give stats_t a pointer to the info struct + // This saves us having to pass the stats_info_t to every function + stats->info = info; + + // Init structures + // .. coverage bins and round buffer + if ( info->cov_step > info->cov_max - info->cov_min + 1 ) + { + info->cov_step = info->cov_max - info->cov_min; + if ( info->cov_step <= 0 ) + info->cov_step = 1; + } + stats->ncov = 3 + (info->cov_max-info->cov_min) / info->cov_step; + info->cov_max = info->cov_min + ((info->cov_max-info->cov_min)/info->cov_step +1)*info->cov_step - 1; + stats->cov = calloc(sizeof(uint64_t),stats->ncov); + if (!stats->cov) goto nomem; + stats->cov_rbuf.size = stats->nbases*5; + stats->cov_rbuf.buffer = calloc(sizeof(int32_t),stats->cov_rbuf.size); + if (!stats->cov_rbuf.buffer) goto nomem; + if ( group_id ) init_group_id(stats, info, group_id); + // .. arrays + stats->quals_1st = calloc(stats->nquals*stats->nbases,sizeof(uint64_t)); + if (!stats->quals_1st) goto nomem; + stats->quals_2nd = calloc(stats->nquals*stats->nbases,sizeof(uint64_t)); + if (!stats->quals_2nd) goto nomem; + stats->gc_1st = calloc(stats->ngc,sizeof(uint64_t)); + if (!stats->gc_1st) goto nomem; + stats->gc_2nd = calloc(stats->ngc,sizeof(uint64_t)); + if (!stats->gc_2nd) goto nomem; + stats->isize = init_isize_t(info->nisize ?info->nisize+1 :0); + if (!stats->isize) goto nomem; + stats->gcd = calloc(stats->ngcd,sizeof(gc_depth_t)); + if (!stats->gcd) goto nomem; + if (info->fai) { + stats->mpc_buf = calloc(stats->nquals*stats->nbases,sizeof(uint64_t)); + if (!stats->mpc_buf) goto nomem; + } else { + stats->mpc_buf = NULL; + } + stats->acgtno_cycles_1st = calloc(stats->nbases,sizeof(acgtno_count_t)); + if (!stats->acgtno_cycles_1st) goto nomem; + stats->acgtno_cycles_2nd = calloc(stats->nbases,sizeof(acgtno_count_t)); + if (!stats->acgtno_cycles_2nd) goto nomem; + stats->acgtno_revcomp = calloc(stats->nbases,sizeof(acgtno_count_t)); + if (!stats->acgtno_revcomp) goto nomem; + stats->read_lengths = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->read_lengths) goto nomem; + stats->read_lengths_1st = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->read_lengths_1st) goto nomem; + stats->read_lengths_2nd = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->read_lengths_2nd) goto nomem; + stats->insertions = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->insertions) goto nomem; + stats->deletions = calloc(stats->nbases,sizeof(uint64_t)); + if (!stats->deletions) goto nomem; + stats->ins_cycles_1st = calloc(stats->nbases+1,sizeof(uint64_t)); + if (!stats->ins_cycles_1st) goto nomem; + stats->ins_cycles_2nd = calloc(stats->nbases+1,sizeof(uint64_t)); + if (!stats->ins_cycles_2nd) goto nomem; + stats->del_cycles_1st = calloc(stats->nbases+1,sizeof(uint64_t)); + if (!stats->del_cycles_1st) goto nomem; + stats->del_cycles_2nd = calloc(stats->nbases+1,sizeof(uint64_t)); + if (!stats->del_cycles_2nd) goto nomem; + if (init_barcode_tags(stats) < 0) + goto nomem; + realloc_rseq_buffer(stats); + if ( targets ) + init_regions(stats, targets, info); + return; + nomem: + error("Out of memory"); +} + +static stats_t* get_curr_split_stats(bam1_t* bam_line, khash_t(c2stats)* split_hash, stats_info_t* info, char* targets) +{ + stats_t *curr_stats = NULL; + const uint8_t *tag_val = bam_aux_get(bam_line, info->split_tag); + if(tag_val == 0){ + error("Tag '%s' not found in bam_line.\n", info->split_tag); + } + char* split_name = strdup(bam_aux2Z(tag_val)); + + // New stats object, under split + khiter_t k = kh_get(c2stats, split_hash, split_name); + if(k == kh_end(split_hash)){ + curr_stats = stats_init(); // mallocs new instance + if (!curr_stats) { + error("Couldn't allocate split stats"); + } + init_stat_structs(curr_stats, info, NULL, targets); + curr_stats->split_name = split_name; + + // Record index in hash + int ret = 0; + khiter_t iter = kh_put(c2stats, split_hash, split_name, &ret); + if( ret < 0 ){ + error("Failed to insert key '%s' into split_hash", split_name); + } + kh_val(split_hash, iter) = curr_stats; // store pointer to stats + } + else{ + curr_stats = kh_value(split_hash, k); + free(split_name); // don't need to hold on to this if it wasn't new + } + return curr_stats; +} + +int main_stats(int argc, char *argv[]) +{ + char *targets = NULL; + char *bam_fname = NULL; + char *bam_idx_fname = NULL; + char *group_id = NULL; + int sparse = 0, has_index_file = 0, ret = 1; + sam_global_args ga = SAM_GLOBAL_ARGS_INIT; + + stats_info_t *info = stats_info_init(argc, argv); + if (!info) { + fprintf(samtools_stderr, "Could not allocate memory for info.\n"); + return 1; + } + + static const struct option loptions[] = + { + SAM_OPT_GLOBAL_OPTIONS('-', 0, '-', '-', 0, '@'), + {"help", no_argument, NULL, 'h'}, + {"remove-dups", no_argument, NULL, 'd'}, + {"sam", no_argument, NULL, 's'}, + {"customized-index-file", required_argument, NULL, 'X'}, + {"ref-seq", required_argument, NULL, 'r'}, + {"coverage", required_argument, NULL, 'c'}, + {"read-length", required_argument, NULL, 'l'}, + {"insert-size", required_argument, NULL, 'i'}, + {"most-inserts", required_argument, NULL, 'm'}, + {"trim-quality", required_argument, NULL, 'q'}, + {"target-regions", required_argument, NULL, 't'}, + {"required-flag", required_argument, NULL, 'f'}, + {"filtering-flag", required_argument, NULL, 'F'}, + {"id", required_argument, NULL, 'I'}, + {"GC-depth", required_argument, NULL, 1}, + {"sparse", no_argument, NULL, 'x'}, + {"split", required_argument, NULL, 'S'}, + {"split-prefix", required_argument, NULL, 'P'}, + {"remove-overlaps", no_argument, NULL, 'p'}, + {"cov-threshold", required_argument, NULL, 'g'}, + {NULL, 0, NULL, 0} + }; + int opt; + + while ( (opt=getopt_long(argc,argv,"?hdsXxpr:c:l:i:t:m:q:f:F:g:I:S:P:@:",loptions,NULL))>0 ) + { + switch (opt) + { + case 'f': info->flag_require = bam_str2flag(optarg); break; + case 'F': info->flag_filter |= bam_str2flag(optarg); break; + case 'd': info->flag_filter |= BAM_FDUP; break; + case 'X': has_index_file = 1; break; + case 's': break; + case 'r': info->fai = fai_load(optarg); + if (info->fai==NULL) + error("Could not load faidx: %s\n", optarg); + break; + case 1 : info->gcd_bin_size = atof(optarg); break; + case 'c': if ( sscanf(optarg,"%d,%d,%d",&info->cov_min,&info->cov_max,&info->cov_step)!= 3 ) + error("Unable to parse -c %s\n", optarg); + break; + case 'l': info->filter_readlen = atoi(optarg); break; + case 'i': info->nisize = atoi(optarg); break; + case 'm': info->isize_main_bulk = atof(optarg); break; + case 'q': info->trim_qual = atoi(optarg); break; + case 't': targets = optarg; break; + case 'I': group_id = optarg; break; + case 'x': sparse = 1; break; + case 'S': info->split_tag = optarg; break; + case 'P': info->split_prefix = optarg; break; + case 'p': info->remove_overlaps = 1; break; + case 'g': info->cov_threshold = atoi(optarg); + if ( info->cov_threshold < 0 || info->cov_threshold == INT_MAX ) + error("Unsupported value for coverage threshold %d\n", info->cov_threshold); + break; + case '?': + case 'h': error(NULL); + /* no break */ + default: + if (parse_sam_global_opt(opt, optarg, loptions, &ga) != 0) + error("Unknown argument: %s\n", optarg); + break; + } + } + + bam_fname = argv[optind++]; + if ( !bam_fname ) + { + if ( isatty(STDIN_FILENO) ) + error(NULL); + bam_fname = "-"; + } + + if (init_stat_info_fname(info, bam_fname, &ga.in)) { + cleanup_stats_info(info); + return 1; + } + + if (has_index_file && !(bam_idx_fname = argv[optind++])) { + fprintf(samtools_stderr, "No index file provided\n"); + cleanup_stats_info(info); + return 1; + } + + if (ga.nthreads > 0) + hts_set_threads(info->sam, ga.nthreads); + + stats_t *all_stats = stats_init(); + if (!all_stats) { + fprintf(samtools_stderr, "Could not allocate memory for stats.\n"); + cleanup_stats_info(info); + return 1; + } + stats_t *curr_stats = NULL; + init_stat_structs(all_stats, info, group_id, targets); + // Init + // .. hash + khash_t(c2stats)* split_hash = kh_init(c2stats); + if (!split_hash) goto cleanup_all_stats; + + khash_t(qn2pair)* read_pairs = kh_init(qn2pair); + if (!read_pairs) goto cleanup_split_hash; + + // Collect statistics + bam1_t *bam_line = bam_init1(); + if (!bam_line) goto cleanup_read_pairs; + + if (optind < argc) { + // Region:interval arguments in the command line + hts_idx_t *bam_idx = NULL; + if (has_index_file) { + bam_idx = sam_index_load2(info->sam, bam_fname, bam_idx_fname); + } else { + // If an index filename has not been specified, look alongside the alignment file + bam_idx = sam_index_load(info->sam, bam_fname); + } + + if (bam_idx) { + hts_itr_multi_t *iter = sam_itr_regarray(bam_idx, info->sam_header, &argv[optind], argc - optind); + if (iter) { + if (!targets) { + all_stats->nchunks = argc-optind; + if (replicate_regions(all_stats, iter, info)) + fprintf(samtools_stderr, "Replications of the regions failed\n"); + } + + if ( all_stats->nregions && all_stats->regions ) { + while ((ret = sam_itr_next(info->sam, iter, bam_line)) >= 0) { + if (info->split_tag) { + curr_stats = get_curr_split_stats(bam_line, split_hash, info, targets); + collect_stats(bam_line, curr_stats, read_pairs); + } + collect_stats(bam_line, all_stats, read_pairs); + } + + if (ret < -1) { + fprintf(samtools_stderr, "Failure while running the iterator\n"); + hts_itr_multi_destroy(iter); + hts_idx_destroy(bam_idx); + goto cleanup; + } + } + hts_itr_multi_destroy(iter); + } else { + fprintf(samtools_stderr, "Multi-region iterator could not be created\n"); + hts_idx_destroy(bam_idx); + goto cleanup; + } + hts_idx_destroy(bam_idx); + } else { + if (has_index_file) + fprintf(samtools_stderr, "Invalid index file '%s'\n", bam_idx_fname); + fprintf(samtools_stderr, "Random alignment retrieval only works for indexed files\n"); + goto cleanup; + } + } else { + if ( info->cov_threshold > 0 && !targets ) { + fprintf(samtools_stderr, "Coverage percentage calculation requires a list of target regions\n"); + goto cleanup; + } + + // Stream through the entire BAM ignoring off-target regions if -t is given + while ((ret = sam_read1(info->sam, info->sam_header, bam_line)) >= 0) { + if (info->split_tag) { + curr_stats = get_curr_split_stats(bam_line, split_hash, info, targets); + collect_stats(bam_line, curr_stats, read_pairs); + } + collect_stats(bam_line, all_stats, read_pairs); + } + + if (ret < -1) { + fprintf(samtools_stderr, "Failure while decoding file\n"); + goto cleanup; + } + } + + round_buffer_flush(all_stats, -1); + output_stats(samtools_stdout, all_stats, sparse); + if (info->split_tag) + output_split_stats(split_hash, bam_fname, sparse); + + ret = 0; +cleanup: + bam_destroy1(bam_line); + sam_hdr_destroy(info->sam_header); + sam_global_args_free(&ga); + +cleanup_read_pairs: + cleanup_overlaps(read_pairs, INT64_MAX); +cleanup_split_hash: + destroy_split_stats(split_hash); +cleanup_all_stats: + cleanup_stats(all_stats); + cleanup_stats_info(info); + + return ret; +} diff --git a/samtools/stats_isize.c b/samtools/stats_isize.c new file mode 100644 index 0000000..8dc690a --- /dev/null +++ b/samtools/stats_isize.c @@ -0,0 +1,239 @@ +/* stats_isize.c -- generalised insert size calculation for samtools stats. + + Copyright (C) 2014, 2018 Genome Research Ltd. + + Author: Nicholas Clarke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include "stats_isize.h" +#include + +typedef enum {IN,OUT,OTHER} isize_insert_t; + +static int max(int a, int b) { + if (a < b) { + return b; + } else { + return a; + } +} + +static isize_sparse_record_t * sparse_get_f(isize_data_t data, int at) { + isize_sparse_data_t *a = data.sparse; + khash_t(m32) *h = a->array; + + khint_t k = kh_get(m32, h, at); + if (k != kh_end(h)) { + return kh_value(h, k); + } else { + return NULL; + } +} + +static uint64_t sparse_in_f(isize_data_t data, int at) { + isize_sparse_record_t* a = sparse_get_f(data, at); + if (a != NULL) { + return a->isize_inward; + } else { + return 0; + } +} +static uint64_t sparse_out_f(isize_data_t data, int at) { + isize_sparse_record_t* a = sparse_get_f(data, at); + if (a != NULL) { + return a->isize_outward; + } else { + return 0; + } +} +static uint64_t sparse_other_f(isize_data_t data, int at) { + isize_sparse_record_t* a = sparse_get_f(data, at); + if (a != NULL) { + return a->isize_other; + } else { + return 0; + } +} + +static void sparse_set_f(isize_data_t data, int at, isize_insert_t field, uint64_t value) { + isize_sparse_data_t *a = data.sparse; + khash_t(m32) *h = a->array; + + khint_t k = kh_get(m32, h, at); + isize_sparse_record_t *rec; + if (k != kh_end(h)) { + rec = kh_value(h, k); + } else if (value != 0) { + rec = malloc(sizeof(isize_sparse_record_t)); + if (rec != NULL) { + rec->isize_inward = 0; + rec->isize_outward = 0; + rec->isize_other = 0; + int stupid = 0; + khint_t it = kh_put(m32, h, at, & stupid); + kh_value(h, it) = rec; + a->max = max(at, a->max); + } else { + fprintf(stderr, "%s\n", "Failed to allocate memory for isize_sparse_record_t"); + exit(11); + } + } else { + return; + } + if (field == IN) { + rec->isize_inward = value; + } else if (field == OUT) { + rec->isize_outward = value; + } else { + rec->isize_other = value; + } + +} + +static void sparse_set_in_f(isize_data_t data, int at, uint64_t value) { sparse_set_f(data, at, IN, value); } +static void sparse_set_out_f(isize_data_t data, int at, uint64_t value) { sparse_set_f(data, at, OUT, value); } +static void sparse_set_other_f(isize_data_t data, int at, uint64_t value) { sparse_set_f(data, at, OTHER, value); } + +static void sparse_inc_in_f(isize_data_t data, int at) { sparse_set_in_f(data, at, sparse_in_f(data, at) + 1); } +static void sparse_inc_out_f(isize_data_t data, int at) { sparse_set_out_f(data, at, sparse_out_f(data, at) + 1); } +static void sparse_inc_other_f(isize_data_t data, int at) { sparse_set_other_f(data, at, sparse_other_f(data, at) + 1); } + +static void sparse_isize_free(isize_data_t data) { + isize_sparse_data_t *a = data.sparse; + khint_t k; + for (k = 0; k < kh_end(a->array); ++k) + if (kh_exist(a->array, k)) free(kh_val(a->array, k)); + kh_destroy(m32, a->array); + free(a); +} + +static int sparse_nitems(isize_data_t data) { + isize_sparse_data_t *a = data.sparse; + return a->max + 1; +} + +static uint64_t dense_in_f(isize_data_t data, int at) { return data.dense->isize_inward[at]; } +static uint64_t dense_out_f(isize_data_t data, int at) { return data.dense->isize_outward[at]; } +static uint64_t dense_other_f(isize_data_t data, int at) { return data.dense->isize_other[at]; } + +static void dense_set_in_f(isize_data_t data, int at, uint64_t value) { data.dense->isize_inward[at] = value; } +static void dense_set_out_f(isize_data_t data, int at, uint64_t value) { data.dense->isize_outward[at] = value; } +static void dense_set_other_f(isize_data_t data, int at, uint64_t value) { data.dense->isize_other[at] = value; } + +static void dense_inc_in_f(isize_data_t data, int at) { data.dense->isize_inward[at] += 1; } +static void dense_inc_out_f(isize_data_t data, int at) { data.dense->isize_outward[at] += 1; } +static void dense_inc_other_f(isize_data_t data, int at) { data.dense->isize_other[at] += 1; } + +static void dense_isize_free(isize_data_t data) { + isize_dense_data_t *a = data.dense; + free(a->isize_inward); + free(a->isize_outward); + free(a->isize_other); + free(a); +} + +static int dense_nitems(isize_data_t data) { + isize_dense_data_t *a = data.dense; + return a->total; +} + +// Construct a relevant isize_t given the bound. +isize_t *init_isize_t(int bound) { + if (bound <= 0) { + // Use sparse data structure. + isize_sparse_data_t *data = (isize_sparse_data_t *) malloc(sizeof(isize_sparse_data_t)); + if (!data) + return NULL; + + // Initialise + data->max = 0; + data->array = kh_init(m32); + if (!data->array) { + free(data); + return NULL; + } + + isize_t *isize = (isize_t *)malloc(sizeof(isize_t)); + if (!isize) { + kh_destroy(m32, data->array); + free(data); + return NULL; + } + + isize->data.sparse = data; + isize->nitems = & sparse_nitems; + + isize->inward = & sparse_in_f; + isize->outward = & sparse_out_f; + isize->other = & sparse_other_f; + + isize->set_inward = & sparse_set_in_f; + isize->set_outward = & sparse_set_out_f; + isize->set_other = & sparse_set_other_f; + + isize->inc_inward = & sparse_inc_in_f; + isize->inc_outward = & sparse_inc_out_f; + isize->inc_other = & sparse_inc_other_f; + + isize->isize_free = & sparse_isize_free; + + return isize; + } else { + uint64_t* in = calloc(bound,sizeof(uint64_t)); + uint64_t* out = calloc(bound,sizeof(uint64_t)); + uint64_t* other = calloc(bound,sizeof(uint64_t)); + isize_dense_data_t *rec = (isize_dense_data_t *)malloc(sizeof(isize_dense_data_t)); + isize_t *isize = (isize_t *)malloc(sizeof(isize_t)); + if (!in || !out || !other || !rec || !isize) { + free(in); + free(out); + free(other); + free(rec); + free(isize); + return NULL; + } + rec->isize_inward = in; + rec->isize_outward = out; + rec->isize_other = other; + rec->total=bound; + + isize->data.dense = rec; + isize->nitems = & dense_nitems; + + isize->inward = & dense_in_f; + isize->outward = & dense_out_f; + isize->other = & dense_other_f; + + isize->set_inward = & dense_set_in_f; + isize->set_outward = & dense_set_out_f; + isize->set_other = & dense_set_other_f; + + isize->inc_inward = & dense_inc_in_f; + isize->inc_outward = & dense_inc_out_f; + isize->inc_other = & dense_inc_other_f; + + isize->isize_free = & dense_isize_free; + + return isize; + } +} diff --git a/samtools/stats_isize.c.pysam.c b/samtools/stats_isize.c.pysam.c new file mode 100644 index 0000000..1bb2bd4 --- /dev/null +++ b/samtools/stats_isize.c.pysam.c @@ -0,0 +1,241 @@ +#include "samtools.pysam.h" + +/* stats_isize.c -- generalised insert size calculation for samtools stats. + + Copyright (C) 2014, 2018 Genome Research Ltd. + + Author: Nicholas Clarke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include + +#include +#include "stats_isize.h" +#include + +typedef enum {IN,OUT,OTHER} isize_insert_t; + +static int max(int a, int b) { + if (a < b) { + return b; + } else { + return a; + } +} + +static isize_sparse_record_t * sparse_get_f(isize_data_t data, int at) { + isize_sparse_data_t *a = data.sparse; + khash_t(m32) *h = a->array; + + khint_t k = kh_get(m32, h, at); + if (k != kh_end(h)) { + return kh_value(h, k); + } else { + return NULL; + } +} + +static uint64_t sparse_in_f(isize_data_t data, int at) { + isize_sparse_record_t* a = sparse_get_f(data, at); + if (a != NULL) { + return a->isize_inward; + } else { + return 0; + } +} +static uint64_t sparse_out_f(isize_data_t data, int at) { + isize_sparse_record_t* a = sparse_get_f(data, at); + if (a != NULL) { + return a->isize_outward; + } else { + return 0; + } +} +static uint64_t sparse_other_f(isize_data_t data, int at) { + isize_sparse_record_t* a = sparse_get_f(data, at); + if (a != NULL) { + return a->isize_other; + } else { + return 0; + } +} + +static void sparse_set_f(isize_data_t data, int at, isize_insert_t field, uint64_t value) { + isize_sparse_data_t *a = data.sparse; + khash_t(m32) *h = a->array; + + khint_t k = kh_get(m32, h, at); + isize_sparse_record_t *rec; + if (k != kh_end(h)) { + rec = kh_value(h, k); + } else if (value != 0) { + rec = malloc(sizeof(isize_sparse_record_t)); + if (rec != NULL) { + rec->isize_inward = 0; + rec->isize_outward = 0; + rec->isize_other = 0; + int stupid = 0; + khint_t it = kh_put(m32, h, at, & stupid); + kh_value(h, it) = rec; + a->max = max(at, a->max); + } else { + fprintf(samtools_stderr, "%s\n", "Failed to allocate memory for isize_sparse_record_t"); + samtools_exit(11); + } + } else { + return; + } + if (field == IN) { + rec->isize_inward = value; + } else if (field == OUT) { + rec->isize_outward = value; + } else { + rec->isize_other = value; + } + +} + +static void sparse_set_in_f(isize_data_t data, int at, uint64_t value) { sparse_set_f(data, at, IN, value); } +static void sparse_set_out_f(isize_data_t data, int at, uint64_t value) { sparse_set_f(data, at, OUT, value); } +static void sparse_set_other_f(isize_data_t data, int at, uint64_t value) { sparse_set_f(data, at, OTHER, value); } + +static void sparse_inc_in_f(isize_data_t data, int at) { sparse_set_in_f(data, at, sparse_in_f(data, at) + 1); } +static void sparse_inc_out_f(isize_data_t data, int at) { sparse_set_out_f(data, at, sparse_out_f(data, at) + 1); } +static void sparse_inc_other_f(isize_data_t data, int at) { sparse_set_other_f(data, at, sparse_other_f(data, at) + 1); } + +static void sparse_isize_free(isize_data_t data) { + isize_sparse_data_t *a = data.sparse; + khint_t k; + for (k = 0; k < kh_end(a->array); ++k) + if (kh_exist(a->array, k)) free(kh_val(a->array, k)); + kh_destroy(m32, a->array); + free(a); +} + +static int sparse_nitems(isize_data_t data) { + isize_sparse_data_t *a = data.sparse; + return a->max + 1; +} + +static uint64_t dense_in_f(isize_data_t data, int at) { return data.dense->isize_inward[at]; } +static uint64_t dense_out_f(isize_data_t data, int at) { return data.dense->isize_outward[at]; } +static uint64_t dense_other_f(isize_data_t data, int at) { return data.dense->isize_other[at]; } + +static void dense_set_in_f(isize_data_t data, int at, uint64_t value) { data.dense->isize_inward[at] = value; } +static void dense_set_out_f(isize_data_t data, int at, uint64_t value) { data.dense->isize_outward[at] = value; } +static void dense_set_other_f(isize_data_t data, int at, uint64_t value) { data.dense->isize_other[at] = value; } + +static void dense_inc_in_f(isize_data_t data, int at) { data.dense->isize_inward[at] += 1; } +static void dense_inc_out_f(isize_data_t data, int at) { data.dense->isize_outward[at] += 1; } +static void dense_inc_other_f(isize_data_t data, int at) { data.dense->isize_other[at] += 1; } + +static void dense_isize_free(isize_data_t data) { + isize_dense_data_t *a = data.dense; + free(a->isize_inward); + free(a->isize_outward); + free(a->isize_other); + free(a); +} + +static int dense_nitems(isize_data_t data) { + isize_dense_data_t *a = data.dense; + return a->total; +} + +// Construct a relevant isize_t given the bound. +isize_t *init_isize_t(int bound) { + if (bound <= 0) { + // Use sparse data structure. + isize_sparse_data_t *data = (isize_sparse_data_t *) malloc(sizeof(isize_sparse_data_t)); + if (!data) + return NULL; + + // Initialise + data->max = 0; + data->array = kh_init(m32); + if (!data->array) { + free(data); + return NULL; + } + + isize_t *isize = (isize_t *)malloc(sizeof(isize_t)); + if (!isize) { + kh_destroy(m32, data->array); + free(data); + return NULL; + } + + isize->data.sparse = data; + isize->nitems = & sparse_nitems; + + isize->inward = & sparse_in_f; + isize->outward = & sparse_out_f; + isize->other = & sparse_other_f; + + isize->set_inward = & sparse_set_in_f; + isize->set_outward = & sparse_set_out_f; + isize->set_other = & sparse_set_other_f; + + isize->inc_inward = & sparse_inc_in_f; + isize->inc_outward = & sparse_inc_out_f; + isize->inc_other = & sparse_inc_other_f; + + isize->isize_free = & sparse_isize_free; + + return isize; + } else { + uint64_t* in = calloc(bound,sizeof(uint64_t)); + uint64_t* out = calloc(bound,sizeof(uint64_t)); + uint64_t* other = calloc(bound,sizeof(uint64_t)); + isize_dense_data_t *rec = (isize_dense_data_t *)malloc(sizeof(isize_dense_data_t)); + isize_t *isize = (isize_t *)malloc(sizeof(isize_t)); + if (!in || !out || !other || !rec || !isize) { + free(in); + free(out); + free(other); + free(rec); + free(isize); + return NULL; + } + rec->isize_inward = in; + rec->isize_outward = out; + rec->isize_other = other; + rec->total=bound; + + isize->data.dense = rec; + isize->nitems = & dense_nitems; + + isize->inward = & dense_in_f; + isize->outward = & dense_out_f; + isize->other = & dense_other_f; + + isize->set_inward = & dense_set_in_f; + isize->set_outward = & dense_set_out_f; + isize->set_other = & dense_set_other_f; + + isize->inc_inward = & dense_inc_in_f; + isize->inc_outward = & dense_inc_out_f; + isize->inc_other = & dense_inc_other_f; + + isize->isize_free = & dense_isize_free; + + return isize; + } +} diff --git a/samtools/stats_isize.h b/samtools/stats_isize.h new file mode 100644 index 0000000..3243222 --- /dev/null +++ b/samtools/stats_isize.h @@ -0,0 +1,83 @@ +/* stats_isize.h -- generalised insert size calculation for samtools stats. + + Copyright (C) 2014 Genome Research Ltd. + + Author: Nicholas Clarke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. */ + +#include +#include + +typedef struct +{ + int total; + uint64_t *isize_inward, *isize_outward, *isize_other; +} +isize_dense_data_t; + +typedef struct +{ + uint64_t isize_inward, isize_outward, isize_other; +} +isize_sparse_record_t; + +KHASH_MAP_INIT_INT(m32, isize_sparse_record_t *) + +typedef struct +{ + int max; + khash_t(m32) *array; +} +isize_sparse_data_t; + +typedef union { + isize_sparse_data_t *sparse; + isize_dense_data_t *dense; +} isize_data_t; + +// Insert size structure +typedef struct +{ + isize_data_t data; + + // Maximum + int (*nitems)(isize_data_t); + + // Fetch the number of inserts of a given size + uint64_t (*inward)(isize_data_t, int); + uint64_t (*outward)(isize_data_t, int); + uint64_t (*other)(isize_data_t, int); + + // Set the number of inserts of a given size + void (*set_inward)(isize_data_t, int, uint64_t); + void (*set_outward)(isize_data_t, int, uint64_t); + void (*set_other)(isize_data_t, int, uint64_t); + + // Increment the number of inserts of a given size + void (*inc_inward)(isize_data_t, int); + void (*inc_outward)(isize_data_t, int); + void (*inc_other)(isize_data_t, int); + + // Free this structure + void (*isize_free)(isize_data_t); +} +isize_t; + +isize_t *init_isize_t(int bound); diff --git a/samtools/tmp_file.c b/samtools/tmp_file.c new file mode 100644 index 0000000..123f425 --- /dev/null +++ b/samtools/tmp_file.c @@ -0,0 +1,438 @@ +/* + tmp_file.c - write to and read from a temporary binary file + for fast storage plus added compression. + + Copyright (C) 2017, 2018 Genome Research Ltd. + + Author: Andrew Whitwham + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif /* _WIN32 */ + +#include "tmp_file.h" +#include "htslib/sam.h" + + +static void tmp_print_error(tmp_file_t *tmp, const char *fmt, ...) { + va_list argp; + + if (tmp->verbose) { + va_start(argp, fmt); + vfprintf(stderr, fmt, argp); + va_end(argp); + } +} + + +static int tmp_file_init(tmp_file_t *tmp, int verbose) { + tmp->stream = LZ4_createStream(); + tmp->data_size = 0; + tmp->group_size = TMP_SAM_GROUP_SIZE; + tmp->input_size = 0; + tmp->read_size = 0; + tmp->output_size = 0; + tmp->entry_number = 0; + tmp->offset = 0; + tmp->max_data_size = TMP_SAM_MAX_DATA + sizeof(bam1_t); // arbitrary but growable + tmp->ring_buffer_size = TMP_SAM_RING_SIZE; // arbitrary (min 64K) but growable + tmp->comp_buffer_size = LZ4_COMPRESSBOUND(tmp->max_data_size * tmp->group_size); + tmp->ring_buffer = malloc(sizeof(uint8_t) * tmp->ring_buffer_size); + tmp->ring_index = tmp->ring_buffer; + tmp->comp_buffer = malloc(tmp->comp_buffer_size); + tmp->verbose = verbose; + tmp->dict = NULL; + tmp->groups_written = 0; + + if (!tmp->ring_buffer || !tmp->comp_buffer || !tmp->stream) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate compression buffers.\n"); + return TMP_SAM_MEM_ERROR; + } + + return TMP_SAM_OK; +} + + +/* + * Opens the temp file and initialises memory. + * Verbose mode prints out error messages to stderr. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_open_write(tmp_file_t *tmp, char *tmp_name, int verbose) { + int ret; + unsigned int count = 1; + const unsigned int max_count = 100000; // more tries than this then something else is wrong + int fd; + + if ((ret = tmp_file_init(tmp, verbose))) { + return ret; + } + + // make space to write extended file name + if ((tmp->name = malloc(strlen(tmp_name) + 7)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate memory for %s.\n", tmp_name); + return TMP_SAM_MEM_ERROR; + } + + // make sure temp file has a unique name + while (count < max_count) { + sprintf(tmp->name, "%s.%d", tmp_name, count); + + + #ifdef _WIN32 + if ((fd = _open(tmp->name, O_RDWR|O_CREAT|O_EXCL|O_BINARY|O_TEMPORARY, 0600)) == -1) { + #else + if ((fd = open(tmp->name, O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) { + #endif /* _WIN32 */ + + if (errno != EEXIST) { + tmp_print_error(tmp, "[tmp_file] Error: unable to create tmp file %s.\n", tmp->name); + return TMP_SAM_FILE_ERROR; + } + + count++; + continue; + } + + break; + } + + if (count >= max_count) { + tmp_print_error(tmp, "[tmp_file] Error: unable to create unique temp file.\n"); + return TMP_SAM_FILE_ERROR; + } + + if ((tmp->fp = fdopen(fd, "w+b")) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to open write file %s.\n", tmp->name); + return TMP_SAM_FILE_ERROR; + } + + #ifndef _WIN32 + unlink(tmp->name); // should auto delete when closed on linux + #endif + + return TMP_SAM_OK; +} + + +/* + * The ring buffer stores precompressionn/post decompression data. LZ4 requires that + * previous data (64K worth) be available for efficient compression. This function grows + * the ring buffer when needed. + * Returns 0 on success, a negative number on failure. + */ +static int tmp_file_grow_ring_buffer(tmp_file_t *tmp, size_t new_size) { + // save the dictionary so lz4 can continue to function + int dict_size = 64 * 1024; // 64K max size + + if (tmp->groups_written) { + // if compression has been done then there is a dictionary to save + + if (tmp->dict == NULL) { + + if ((tmp->dict = malloc(sizeof(char) * dict_size)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate memory for compression dictionary.\n"); + return TMP_SAM_MEM_ERROR; + } + } + + if (LZ4_saveDict(tmp->stream, tmp->dict, dict_size) == 0) { + tmp_print_error(tmp, "[tmp_file] Error: unable to save compression dictionary.\n"); + return TMP_SAM_LZ4_ERROR; + } + } + + if ((tmp->ring_buffer = realloc(tmp->ring_buffer, sizeof(char) * new_size)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to reallocate ring buffer.\n"); + return TMP_SAM_MEM_ERROR; + } + + tmp->ring_buffer_size = new_size; + + return TMP_SAM_OK; +} + + +/* + * This does the actual compression and writing to a file. The file format consists of a + * single size_t for the size of the compressed data followed by the data itself. + * Returns 0 on success, a negative number on failure. + */ +static int tmp_file_write_to_file(tmp_file_t *tmp) { + size_t comp_size; + + if (tmp->input_size > tmp->max_data_size) { + tmp->max_data_size += tmp->input_size + sizeof(bam1_t); + tmp->comp_buffer_size = LZ4_COMPRESSBOUND(tmp->max_data_size); + + if ((tmp->comp_buffer = realloc(tmp->comp_buffer, sizeof(char) * tmp->comp_buffer_size)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to reallocate compression buffer.\n"); + return TMP_SAM_MEM_ERROR; + } + + // make sure the ring buffer is big enough to accommodate the new max_data_size + if (tmp->ring_buffer_size < tmp->max_data_size * 5) { + int ret; + if ((ret = tmp_file_grow_ring_buffer(tmp, tmp->max_data_size * 5))) { + return ret; + } + } + } + + tmp->ring_index = tmp->ring_buffer + tmp->offset; + + comp_size = LZ4_compress_fast_continue(tmp->stream, (const char *)tmp->ring_index, + tmp->comp_buffer, tmp->input_size, tmp->comp_buffer_size, 1); + + if (comp_size == 0) { + tmp_print_error(tmp, "[tmp_file] Error: compression failed.\n"); + return TMP_SAM_LZ4_ERROR; + } + + if (fwrite(&comp_size, sizeof(size_t), 1, tmp->fp) < 1) { + tmp_print_error(tmp, "[tmp_file] Error: tmp file write size failed.\n"); + return TMP_SAM_FILE_ERROR; + } + + if (fwrite(tmp->comp_buffer, sizeof(char), comp_size, tmp->fp) < comp_size) { + tmp_print_error(tmp, "[tmp_file] Error: tmp file write data failed.\n"); + return TMP_SAM_FILE_ERROR; + } + + tmp->offset += tmp->input_size; + + if (tmp->offset >= tmp->ring_buffer_size - tmp->max_data_size) + tmp->offset = 0; + + tmp->input_size = 0; + tmp->entry_number = 0; + tmp->groups_written++; + + return TMP_SAM_OK; +} + + +/* + * Stores an in memory bam structure for writing and if enough are gathered together writes + * it to a file. Multiple alignments compress better that single ones though after a certain number + * there is a law of diminishing returns. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_write(tmp_file_t *tmp, bam1_t *inbam) { + + if ((tmp->offset + tmp->input_size + sizeof(bam1_t) + inbam->l_data) >= tmp->ring_buffer_size) { + int ret; + + if ((ret = tmp_file_grow_ring_buffer(tmp, (tmp->offset + tmp->input_size + sizeof(bam1_t) + inbam->l_data) * 2))) { + tmp_print_error(tmp, "[tmp_file] Error: input line too big. (%ld).\n", + (tmp->input_size + inbam->l_data)); + + return ret; + } + } + + tmp->ring_index = tmp->ring_buffer + tmp->offset + tmp->input_size; + + // copy data into the ring buffer + memcpy(tmp->ring_index, inbam, sizeof(bam1_t)); + memcpy(tmp->ring_index + sizeof(bam1_t) , inbam->data, inbam->l_data); + tmp->input_size += sizeof(bam1_t) + inbam->l_data; + tmp->entry_number++; + + if (tmp->entry_number == tmp->group_size) { + // actually write out the data + int ret; + + if ((ret = tmp_file_write_to_file(tmp))) { + return ret; + } + } + + return TMP_SAM_OK; +} + + +/* + * Marks the end of file writing. Adds a size_t 0 to mark the end of + * the file. Companion function to tmp_file_begin_read below. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_end_write(tmp_file_t *tmp) { + size_t terminator = 0; + + if (tmp->entry_number) { + int ret; + + if ((ret = tmp_file_write_to_file(tmp))) { + return ret; + } + } + + if (fwrite(&terminator, sizeof(size_t), 1, tmp->fp) < 1) { + tmp_print_error(tmp, "[tmp_file] Error: tmp file write terminator failed.\n"); + return TMP_SAM_FILE_ERROR; + } + + fflush(tmp->fp); + + LZ4_freeStream(tmp->stream); + + return TMP_SAM_OK; +} + + +/* + * Prepares the file for reading. + * Companion function to tmp_file_end_write above. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_begin_read(tmp_file_t *tmp) { + + rewind(tmp->fp); + + tmp->dstream = LZ4_createStreamDecode(); + tmp->offset = 0; + tmp->entry_number = tmp->group_size; + + if (!tmp->dstream) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate compression stream.\n"); + return TMP_SAM_MEM_ERROR; + } + + return TMP_SAM_OK; +} + + +/* + * Read the next alignment, either from memory or from a file. + * Returns size of entry on success, 0 on end of file or a negative on error. + */ +int tmp_file_read(tmp_file_t *tmp, bam1_t *inbam) { + int entry_size; + uint8_t *data = inbam->data; + + /* while tmp_file_read assumes that the same bam1_t variable + is being used in each call, this may not be the case. So + default to the lowest memory size for safety. */ + if (tmp->data_size > inbam->m_data) { + tmp->data_size = inbam->m_data; + } + + if (tmp->entry_number == tmp->group_size) { + // read more data + size_t comp_size; + + if (fread(&comp_size, sizeof(size_t), 1, tmp->fp) == 0 || comp_size == 0) { + return TMP_SAM_OK; + } + + if (tmp->offset >= tmp->ring_buffer_size - tmp->max_data_size) + tmp->offset = 0; + + tmp->ring_index = tmp->ring_buffer + tmp->offset; + + if (fread(tmp->comp_buffer, sizeof(char), comp_size, tmp->fp) > comp_size) { + tmp_print_error(tmp, "[tmp_file] Error: error reading compressed data.\n"); + return TMP_SAM_FILE_ERROR; + } + + tmp->output_size = LZ4_decompress_safe_continue(tmp->dstream, tmp->comp_buffer, + (char *)tmp->ring_index, comp_size, tmp->max_data_size); + + if (tmp->output_size == 0) { + tmp_print_error(tmp, "[tmp_file] Error: decompression failed.\n"); + return TMP_SAM_LZ4_ERROR; + } + + tmp->entry_number = 0; + tmp->read_size = 0; + } + + tmp->ring_index = tmp->ring_buffer + tmp->offset; + memcpy(inbam, tmp->ring_index, sizeof(bam1_t)); + inbam->data = data; // put the pointer to real bam data back + + if ((unsigned int)inbam->l_data > tmp->data_size) { + uint8_t *tmp_data; + tmp->data_size = inbam->l_data; kroundup32(tmp->data_size); + + if ((tmp_data = realloc(inbam->data, sizeof(uint8_t) * tmp->data_size)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate tmp bam data memory.\n"); + return TMP_SAM_MEM_ERROR; + } + + inbam->data = tmp_data; + } + + inbam->m_data = tmp->data_size; // set to the actual data size + + entry_size = sizeof(bam1_t); + + memcpy(inbam->data, tmp->ring_index + entry_size, inbam->l_data); + entry_size += inbam->l_data; + + tmp->offset += entry_size; + tmp->read_size += entry_size; + tmp->entry_number++; + + if (tmp->read_size > tmp->output_size) { + tmp_print_error(tmp, "[tmp_file] Error: wrong size of data returned RS:%ld OS:%ld EN:%ld GS:%ld.\n", + tmp->read_size, tmp->output_size, tmp->entry_number, tmp->group_size); + return TMP_SAM_LZ4_ERROR; + } + + if (tmp->read_size == tmp->output_size && tmp->entry_number != tmp->group_size) { + // hopefully the last entries in the read file + tmp->entry_number = tmp->group_size; + } + + return entry_size; +} + + +/* + * Frees up memory, closes the file and deletes it. + * Returns 0 on success or EOF on failure. + */ +int tmp_file_destroy(tmp_file_t *tmp) { + int ret = 0; + + ret = fclose(tmp->fp); + + LZ4_freeStreamDecode(tmp->dstream); + free(tmp->ring_buffer); + free(tmp->comp_buffer); + free(tmp->name); + free(tmp->dict); + + return ret; +} diff --git a/samtools/tmp_file.c.pysam.c b/samtools/tmp_file.c.pysam.c new file mode 100644 index 0000000..0969332 --- /dev/null +++ b/samtools/tmp_file.c.pysam.c @@ -0,0 +1,440 @@ +#include "samtools.pysam.h" + +/* + tmp_file.c - write to and read from a temporary binary file + for fast storage plus added compression. + + Copyright (C) 2017, 2018 Genome Research Ltd. + + Author: Andrew Whitwham + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif /* _WIN32 */ + +#include "tmp_file.h" +#include "htslib/sam.h" + + +static void tmp_print_error(tmp_file_t *tmp, const char *fmt, ...) { + va_list argp; + + if (tmp->verbose) { + va_start(argp, fmt); + vfprintf(samtools_stderr, fmt, argp); + va_end(argp); + } +} + + +static int tmp_file_init(tmp_file_t *tmp, int verbose) { + tmp->stream = LZ4_createStream(); + tmp->data_size = 0; + tmp->group_size = TMP_SAM_GROUP_SIZE; + tmp->input_size = 0; + tmp->read_size = 0; + tmp->output_size = 0; + tmp->entry_number = 0; + tmp->offset = 0; + tmp->max_data_size = TMP_SAM_MAX_DATA + sizeof(bam1_t); // arbitrary but growable + tmp->ring_buffer_size = TMP_SAM_RING_SIZE; // arbitrary (min 64K) but growable + tmp->comp_buffer_size = LZ4_COMPRESSBOUND(tmp->max_data_size * tmp->group_size); + tmp->ring_buffer = malloc(sizeof(uint8_t) * tmp->ring_buffer_size); + tmp->ring_index = tmp->ring_buffer; + tmp->comp_buffer = malloc(tmp->comp_buffer_size); + tmp->verbose = verbose; + tmp->dict = NULL; + tmp->groups_written = 0; + + if (!tmp->ring_buffer || !tmp->comp_buffer || !tmp->stream) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate compression buffers.\n"); + return TMP_SAM_MEM_ERROR; + } + + return TMP_SAM_OK; +} + + +/* + * Opens the temp file and initialises memory. + * Verbose mode prints out error messages to samtools_stderr. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_open_write(tmp_file_t *tmp, char *tmp_name, int verbose) { + int ret; + unsigned int count = 1; + const unsigned int max_count = 100000; // more tries than this then something else is wrong + int fd; + + if ((ret = tmp_file_init(tmp, verbose))) { + return ret; + } + + // make space to write extended file name + if ((tmp->name = malloc(strlen(tmp_name) + 7)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate memory for %s.\n", tmp_name); + return TMP_SAM_MEM_ERROR; + } + + // make sure temp file has a unique name + while (count < max_count) { + sprintf(tmp->name, "%s.%d", tmp_name, count); + + + #ifdef _WIN32 + if ((fd = _open(tmp->name, O_RDWR|O_CREAT|O_EXCL|O_BINARY|O_TEMPORARY, 0600)) == -1) { + #else + if ((fd = open(tmp->name, O_RDWR|O_CREAT|O_EXCL, 0600)) == -1) { + #endif /* _WIN32 */ + + if (errno != EEXIST) { + tmp_print_error(tmp, "[tmp_file] Error: unable to create tmp file %s.\n", tmp->name); + return TMP_SAM_FILE_ERROR; + } + + count++; + continue; + } + + break; + } + + if (count >= max_count) { + tmp_print_error(tmp, "[tmp_file] Error: unable to create unique temp file.\n"); + return TMP_SAM_FILE_ERROR; + } + + if ((tmp->fp = fdopen(fd, "w+b")) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to open write file %s.\n", tmp->name); + return TMP_SAM_FILE_ERROR; + } + + #ifndef _WIN32 + unlink(tmp->name); // should auto delete when closed on linux + #endif + + return TMP_SAM_OK; +} + + +/* + * The ring buffer stores precompressionn/post decompression data. LZ4 requires that + * previous data (64K worth) be available for efficient compression. This function grows + * the ring buffer when needed. + * Returns 0 on success, a negative number on failure. + */ +static int tmp_file_grow_ring_buffer(tmp_file_t *tmp, size_t new_size) { + // save the dictionary so lz4 can continue to function + int dict_size = 64 * 1024; // 64K max size + + if (tmp->groups_written) { + // if compression has been done then there is a dictionary to save + + if (tmp->dict == NULL) { + + if ((tmp->dict = malloc(sizeof(char) * dict_size)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate memory for compression dictionary.\n"); + return TMP_SAM_MEM_ERROR; + } + } + + if (LZ4_saveDict(tmp->stream, tmp->dict, dict_size) == 0) { + tmp_print_error(tmp, "[tmp_file] Error: unable to save compression dictionary.\n"); + return TMP_SAM_LZ4_ERROR; + } + } + + if ((tmp->ring_buffer = realloc(tmp->ring_buffer, sizeof(char) * new_size)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to reallocate ring buffer.\n"); + return TMP_SAM_MEM_ERROR; + } + + tmp->ring_buffer_size = new_size; + + return TMP_SAM_OK; +} + + +/* + * This does the actual compression and writing to a file. The file format consists of a + * single size_t for the size of the compressed data followed by the data itself. + * Returns 0 on success, a negative number on failure. + */ +static int tmp_file_write_to_file(tmp_file_t *tmp) { + size_t comp_size; + + if (tmp->input_size > tmp->max_data_size) { + tmp->max_data_size += tmp->input_size + sizeof(bam1_t); + tmp->comp_buffer_size = LZ4_COMPRESSBOUND(tmp->max_data_size); + + if ((tmp->comp_buffer = realloc(tmp->comp_buffer, sizeof(char) * tmp->comp_buffer_size)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to reallocate compression buffer.\n"); + return TMP_SAM_MEM_ERROR; + } + + // make sure the ring buffer is big enough to accommodate the new max_data_size + if (tmp->ring_buffer_size < tmp->max_data_size * 5) { + int ret; + if ((ret = tmp_file_grow_ring_buffer(tmp, tmp->max_data_size * 5))) { + return ret; + } + } + } + + tmp->ring_index = tmp->ring_buffer + tmp->offset; + + comp_size = LZ4_compress_fast_continue(tmp->stream, (const char *)tmp->ring_index, + tmp->comp_buffer, tmp->input_size, tmp->comp_buffer_size, 1); + + if (comp_size == 0) { + tmp_print_error(tmp, "[tmp_file] Error: compression failed.\n"); + return TMP_SAM_LZ4_ERROR; + } + + if (fwrite(&comp_size, sizeof(size_t), 1, tmp->fp) < 1) { + tmp_print_error(tmp, "[tmp_file] Error: tmp file write size failed.\n"); + return TMP_SAM_FILE_ERROR; + } + + if (fwrite(tmp->comp_buffer, sizeof(char), comp_size, tmp->fp) < comp_size) { + tmp_print_error(tmp, "[tmp_file] Error: tmp file write data failed.\n"); + return TMP_SAM_FILE_ERROR; + } + + tmp->offset += tmp->input_size; + + if (tmp->offset >= tmp->ring_buffer_size - tmp->max_data_size) + tmp->offset = 0; + + tmp->input_size = 0; + tmp->entry_number = 0; + tmp->groups_written++; + + return TMP_SAM_OK; +} + + +/* + * Stores an in memory bam structure for writing and if enough are gathered together writes + * it to a file. Multiple alignments compress better that single ones though after a certain number + * there is a law of diminishing returns. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_write(tmp_file_t *tmp, bam1_t *inbam) { + + if ((tmp->offset + tmp->input_size + sizeof(bam1_t) + inbam->l_data) >= tmp->ring_buffer_size) { + int ret; + + if ((ret = tmp_file_grow_ring_buffer(tmp, (tmp->offset + tmp->input_size + sizeof(bam1_t) + inbam->l_data) * 2))) { + tmp_print_error(tmp, "[tmp_file] Error: input line too big. (%ld).\n", + (tmp->input_size + inbam->l_data)); + + return ret; + } + } + + tmp->ring_index = tmp->ring_buffer + tmp->offset + tmp->input_size; + + // copy data into the ring buffer + memcpy(tmp->ring_index, inbam, sizeof(bam1_t)); + memcpy(tmp->ring_index + sizeof(bam1_t) , inbam->data, inbam->l_data); + tmp->input_size += sizeof(bam1_t) + inbam->l_data; + tmp->entry_number++; + + if (tmp->entry_number == tmp->group_size) { + // actually write out the data + int ret; + + if ((ret = tmp_file_write_to_file(tmp))) { + return ret; + } + } + + return TMP_SAM_OK; +} + + +/* + * Marks the end of file writing. Adds a size_t 0 to mark the end of + * the file. Companion function to tmp_file_begin_read below. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_end_write(tmp_file_t *tmp) { + size_t terminator = 0; + + if (tmp->entry_number) { + int ret; + + if ((ret = tmp_file_write_to_file(tmp))) { + return ret; + } + } + + if (fwrite(&terminator, sizeof(size_t), 1, tmp->fp) < 1) { + tmp_print_error(tmp, "[tmp_file] Error: tmp file write terminator failed.\n"); + return TMP_SAM_FILE_ERROR; + } + + fflush(tmp->fp); + + LZ4_freeStream(tmp->stream); + + return TMP_SAM_OK; +} + + +/* + * Prepares the file for reading. + * Companion function to tmp_file_end_write above. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_begin_read(tmp_file_t *tmp) { + + rewind(tmp->fp); + + tmp->dstream = LZ4_createStreamDecode(); + tmp->offset = 0; + tmp->entry_number = tmp->group_size; + + if (!tmp->dstream) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate compression stream.\n"); + return TMP_SAM_MEM_ERROR; + } + + return TMP_SAM_OK; +} + + +/* + * Read the next alignment, either from memory or from a file. + * Returns size of entry on success, 0 on end of file or a negative on error. + */ +int tmp_file_read(tmp_file_t *tmp, bam1_t *inbam) { + int entry_size; + uint8_t *data = inbam->data; + + /* while tmp_file_read assumes that the same bam1_t variable + is being used in each call, this may not be the case. So + default to the lowest memory size for safety. */ + if (tmp->data_size > inbam->m_data) { + tmp->data_size = inbam->m_data; + } + + if (tmp->entry_number == tmp->group_size) { + // read more data + size_t comp_size; + + if (fread(&comp_size, sizeof(size_t), 1, tmp->fp) == 0 || comp_size == 0) { + return TMP_SAM_OK; + } + + if (tmp->offset >= tmp->ring_buffer_size - tmp->max_data_size) + tmp->offset = 0; + + tmp->ring_index = tmp->ring_buffer + tmp->offset; + + if (fread(tmp->comp_buffer, sizeof(char), comp_size, tmp->fp) > comp_size) { + tmp_print_error(tmp, "[tmp_file] Error: error reading compressed data.\n"); + return TMP_SAM_FILE_ERROR; + } + + tmp->output_size = LZ4_decompress_safe_continue(tmp->dstream, tmp->comp_buffer, + (char *)tmp->ring_index, comp_size, tmp->max_data_size); + + if (tmp->output_size == 0) { + tmp_print_error(tmp, "[tmp_file] Error: decompression failed.\n"); + return TMP_SAM_LZ4_ERROR; + } + + tmp->entry_number = 0; + tmp->read_size = 0; + } + + tmp->ring_index = tmp->ring_buffer + tmp->offset; + memcpy(inbam, tmp->ring_index, sizeof(bam1_t)); + inbam->data = data; // put the pointer to real bam data back + + if ((unsigned int)inbam->l_data > tmp->data_size) { + uint8_t *tmp_data; + tmp->data_size = inbam->l_data; kroundup32(tmp->data_size); + + if ((tmp_data = realloc(inbam->data, sizeof(uint8_t) * tmp->data_size)) == NULL) { + tmp_print_error(tmp, "[tmp_file] Error: unable to allocate tmp bam data memory.\n"); + return TMP_SAM_MEM_ERROR; + } + + inbam->data = tmp_data; + } + + inbam->m_data = tmp->data_size; // set to the actual data size + + entry_size = sizeof(bam1_t); + + memcpy(inbam->data, tmp->ring_index + entry_size, inbam->l_data); + entry_size += inbam->l_data; + + tmp->offset += entry_size; + tmp->read_size += entry_size; + tmp->entry_number++; + + if (tmp->read_size > tmp->output_size) { + tmp_print_error(tmp, "[tmp_file] Error: wrong size of data returned RS:%ld OS:%ld EN:%ld GS:%ld.\n", + tmp->read_size, tmp->output_size, tmp->entry_number, tmp->group_size); + return TMP_SAM_LZ4_ERROR; + } + + if (tmp->read_size == tmp->output_size && tmp->entry_number != tmp->group_size) { + // hopefully the last entries in the read file + tmp->entry_number = tmp->group_size; + } + + return entry_size; +} + + +/* + * Frees up memory, closes the file and deletes it. + * Returns 0 on success or EOF on failure. + */ +int tmp_file_destroy(tmp_file_t *tmp) { + int ret = 0; + + ret = fclose(tmp->fp); + + LZ4_freeStreamDecode(tmp->dstream); + free(tmp->ring_buffer); + free(tmp->comp_buffer); + free(tmp->name); + free(tmp->dict); + + return ret; +} diff --git a/samtools/tmp_file.h b/samtools/tmp_file.h new file mode 100644 index 0000000..4f2647c --- /dev/null +++ b/samtools/tmp_file.h @@ -0,0 +1,124 @@ +/* + tmp_file.h - write to and read from a temporary binary file + for fast storage plus added compression. + + Copyright (C) 2017, 2018 Genome Research Ltd. + + Author: Andrew Whitwham + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE +*/ + +#ifndef _TMP_SAM_FILE_H_ +#define _TMP_SAM_FILE_H_ + +#include +#include "htslib/sam.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Group size that seems to give reasonable compression. +#define TMP_SAM_GROUP_SIZE 100 + +// Arbitrary initial size values but growable. +#define TMP_SAM_MAX_DATA 1024 +#define TMP_SAM_RING_SIZE 1048576 + +// Error numbers. +#define TMP_SAM_OK 0 +#define TMP_SAM_MEM_ERROR -1 +#define TMP_SAM_FILE_ERROR -2 +#define TMP_SAM_LZ4_ERROR -3 +#define TMP_SAM_INPUT_ERROR -4 + +typedef struct { + FILE *fp; + LZ4_stream_t *stream; + LZ4_streamDecode_t *dstream; + size_t data_size; + size_t max_data_size; + size_t ring_buffer_size; + size_t comp_buffer_size; + size_t offset; + uint8_t *ring_buffer; + uint8_t *ring_index; + char *comp_buffer; + char *name; + size_t group_size; + size_t input_size; + size_t read_size; + size_t output_size; + size_t entry_number; + int verbose; + char *dict; + size_t groups_written; +} tmp_file_t; + + +/* + * Opens the temp file and initialises memory. + * Verbose mode prints out error messages to stderr. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_open_write(tmp_file_t *tmp, char *tmp_name, int verbose); + + +/* + * Stores an in memory bam structure for writing and if enough are gathered together writes + * it to a file. Multiple alignments compress better that single ones though after a certain number + * there is a law of diminishing returns. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_write(tmp_file_t *tmp, bam1_t *inbam); + + +/* + * Marks the end of file writing. Adds a size_t 0 to mark the end of + * the file. Companion function to tmp_file_begin_read below. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_end_write(tmp_file_t *tmp); + +/* + * Prepares the file for reading. + * Companion function to tmp_file_end_write above. + * Returns 0 on success, a negative number on failure. + */ +int tmp_file_begin_read(tmp_file_t *tmp); + +/* + * Read the next alignment, either from memory or from a file. + * Returns size of entry on success, 0 on end of file or a negative on error. + */ +int tmp_file_read(tmp_file_t *tmp, bam1_t *inbam); + + +/* + * Frees up memory, closes the file and deletes it. + * Returns 0 on success or EOF on failure. + */ +int tmp_file_destroy(tmp_file_t *tmp); + +#ifdef __cplusplus +} +#endif + +#endif /* _TMP_SAM_FILE_H_ */ diff --git a/samtools/version.sh b/samtools/version.sh new file mode 100755 index 0000000..5327353 --- /dev/null +++ b/samtools/version.sh @@ -0,0 +1,36 @@ +#!/bin/sh +# version.sh -- Script to build the htslib version string +# +# Author : James Bonfield +# +# Copyright (C) 2017, 2019 Genome Research Ltd. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +# Master version, for use in tarballs or non-git source copies +VERSION=1.16.1 + +# If we have a git clone, then check against the current tag +if [ -e .git ] +then + # If we ever get to 10.x this will need to be more liberal + VERSION=`git describe --match '[0-9].[0-9]*' --dirty --always` +fi + +echo $VERSION diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..ef3f511 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,43 @@ +[bdist_wheel] +universal = 0 + +[tool:pytest] +# -s: do not capture stdout, conflicts with pysam.dispatch +# -v: verbose output +addopts = -s -v +testpaths = pysam tests + +[flake8] +max-line-length = 100 +max-complexity = 23 +extend-ignore = E117, E124, E125, E201, E202, E211, E225, E231, E265, E266, E302, E303, E305, E402, E501, E701, E713, E722, E741, F403, F405, F811, F821, F841, W291, W293, W391, W605 +per-file-ignores = __init__.py:F401 + +# E117 over-indented +# E124 closing bracket does not match visual indentation +# E125 continuation line with same indent as next logical line +# E201 whitespace after '{' +# E202 whitespace before '}' +# E211 whitespace before '(' +# E225 missing whitespace around operator +# E231 missing whitespace after ':' +# E265 block comment should start with '# ' +# E266 too many leading '#' for block comment +# E302 expected 2 blank lines, found 1 +# E303 too many blank lines +# E305 expected 2 blank lines after class or function definition, found 1 +# E402 module level import not at top of file +# E501 line too long +# E701 multiple statements on one line (colon) +# E713 test for membership should be 'not in' +# E722 do not use bare 'except' +# E741 ambiguous variable name '...' +# F403 'from ... import *' used; unable to detect undefined names +# F405 '...' may be undefined, or defined from star imports: ... +# F811 redefinition of unused '...' from line ... +# F821 undefined name '...' +# F841 local variable '...' is assigned to but never used +# W291 trailing whitespace +# W293 blank line contains whitespace +# W391 blank line at end of file +# W605 invalid escape sequence '...' diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..890b90a --- /dev/null +++ b/setup.py @@ -0,0 +1,631 @@ +#! /usr/bin/python + +'''pysam - a python module for reading, manipulating and writing +genomic data sets. + +pysam is a lightweight wrapper of the htslib C-API and provides +facilities to read and write SAM/BAM/VCF/BCF/BED/GFF/GTF/FASTA/FASTQ +files as well as access to the command line functionality of the +samtools and bcftools packages. The module supports compression and +random access through indexing. + +This module provides a low-level wrapper around the htslib C-API as +using cython and a high-level API for convenient access to the data +within standard genomic file formats. + +See: +http://www.htslib.org +https://github.com/pysam-developers/pysam +http://pysam.readthedocs.org/en/stable + +''' + +import collections +import glob +import os +import platform +import re +import subprocess +import sys +import sysconfig +from contextlib import contextmanager +from distutils import log +from setuptools import setup, Command +from distutils.command.build import build +from setuptools.command.sdist import sdist +from distutils.errors import LinkError + +from cy_build import CyExtension as Extension, cy_build_ext as build_ext +try: + import cython # noqa + HAVE_CYTHON = True +except ImportError: + HAVE_CYTHON = False + +IS_PYTHON3 = sys.version_info.major >= 3 +IS_DARWIN = platform.system() == 'Darwin' + + +@contextmanager +def changedir(path): + save_dir = os.getcwd() + os.chdir(path) + try: + yield + finally: + os.chdir(save_dir) + + +def run_configure(option): + sys.stdout.flush() + try: + retcode = subprocess.call( + " ".join(("./configure", option)), + shell=True) + if retcode != 0: + return False + else: + return True + except OSError as e: + return False + + +def run_make(targets): + sys.stdout.flush() + subprocess.check_call([os.environ.get("MAKE", "make")] + targets) + + +def run_make_print_config(): + stdout = subprocess.check_output(["make", "-s", "print-config"]) + if IS_PYTHON3: + stdout = stdout.decode("ascii") + + make_print_config = {} + for line in stdout.splitlines(): + if "=" in line: + row = line.split("=") + if len(row) == 2: + make_print_config.update( + {row[0].strip(): row[1].strip()}) + return make_print_config + + +def run_nm_defined_symbols(objfile): + stdout = subprocess.check_output(["nm", "-g", "-P", objfile]) + if IS_PYTHON3: + stdout = stdout.decode("ascii") + + symbols = set() + for line in stdout.splitlines(): + (sym, symtype) = line.split()[:2] + if symtype not in "UFNWw": + if IS_DARWIN: + # On macOS, all symbols have a leading underscore + symbols.add(sym.lstrip('_')) + else: + # Ignore symbols such as _edata (present in all shared objects) + if sym[0] not in "_$.@": symbols.add(sym) + + return symbols + + +# This function emulates the way distutils combines settings from sysconfig, +# environment variables, and the extension being built. It returns a dictionary +# representing the usual set of variables, suitable for writing to a generated +# file or for running configure (provided the returned LIBS is ignored). +def build_config_dict(ext): + def env(var): + return [os.environ[var]] if var in os.environ else [] + + def sc(var): + value = sysconfig.get_config_var(var) + return [value] if value is not None else [] + + def optionise(option, valuelist): + def quote(s): return "'"+s+"'" if " " in s else s + return list(quote(option+v) for v in valuelist) + + def kvtuples(pairlist): + def appendoptvalue(t): return t[0] if t[1] is None else t[0]+"="+t[1] + return map(appendoptvalue, pairlist) + + # For CC, select the first of these that is set + cc = (env('CC') + sc('CC') + ['gcc'])[0] + + # distutils ignores sysconfig for CPPFLAGS + cppflags = " ".join(env('CPPFLAGS') + optionise('-I', ext.include_dirs) + + optionise('-D', kvtuples(ext.define_macros)) + + optionise('-U', ext.undef_macros)) + + cflags = " ".join(sc('CFLAGS') + env('CFLAGS') + sc('CCSHARED') + + ext.extra_compile_args) + + # distutils actually includes $CPPFLAGS here too, but that's weird and + # unnecessary for us as we know the output LDFLAGS will be used correctly + ldflags = " ".join(sc('LDFLAGS') + env('LDFLAGS') + env('CFLAGS') + + optionise('-L', ext.library_dirs) + + ext.extra_link_args) + + # ext.libraries is computed (incorporating $LIBS etc) during configure + libs = " ".join(optionise('-l', ext.libraries)) + + return { 'CC': cc, 'CPPFLAGS': cppflags, 'CFLAGS': cflags, + 'LDFLAGS': ldflags, 'LIBS': libs } + + +def write_configvars_header(filename, ext, prefix): + config = build_config_dict(ext) + if prefix != 'HTS': + config['HTSDIR'] = '(unused)' + config['CURSES_LIB'] = '(unused)' + + log.info("creating %s for '%s' extension", filename, ext.name) + with open(filename, "w") as outf: + for var, value in config.items(): + outf.write('#define {}_{} "{}"\n'.format(prefix, var, value)) + + +@contextmanager +def set_compiler_envvars(): + tmp_vars = [] + for var in ['CC', 'CFLAGS', 'LDFLAGS']: + if var in os.environ: + print("# pysam: (env) {}={}".format(var, os.environ[var])) + elif var in sysconfig.get_config_vars(): + value = sysconfig.get_config_var(var) + if var == 'CFLAGS' and 'CCSHARED' in sysconfig.get_config_vars(): + value += ' ' + sysconfig.get_config_var('CCSHARED') + print("# pysam: (sysconfig) {}={}".format(var, value)) + os.environ[var] = value + tmp_vars += [var] + + try: + yield + finally: + for var in tmp_vars: + del os.environ[var] + + +def configure_library(library_dir, env_options=None, options=[]): + + configure_script = os.path.join(library_dir, "configure") + + on_rtd = os.environ.get("READTHEDOCS") == "True" + # RTD has no bzip2 development libraries installed: + if on_rtd: + env_options = "--disable-bz2" + + if not os.path.exists(configure_script): + raise ValueError( + "configure script {} does not exist".format(configure_script)) + + with changedir(library_dir), set_compiler_envvars(): + if env_options is not None: + if run_configure(env_options): + return env_options + + for option in options: + if run_configure(option): + return option + + return None + + +def get_pysam_version(): + sys.path.insert(0, "pysam") + import version + return version.__version__ + + +# Override sdist command to ensure Cythonized *.c files are included. +class cythonize_sdist(sdist): + # Remove when setuptools (as installed on GH runners) has these options + if not any(opt[0] == 'owner=' for opt in sdist.user_options): + sdist.user_options.append(('owner=', 'u', 'Specify owner inside tar')) + if not any(opt[0] == 'group=' for opt in sdist.user_options): + sdist.user_options.append(('group=', 'g', 'Specify group inside tar')) + + def run(self): + from Cython.Build import cythonize + cythonize(self.distribution.ext_modules) + sdist.run(self) + + +# Override build command to add extra build steps. +class extra_build(build): + def check_ext_symbol_conflicts(self): + """Checks for symbols defined in multiple extension modules, + which can lead to crashes due to incorrect functions being invoked. + Avoid by adding an appropriate #define to import/pysam.h or in + unusual cases adding another rewrite rule to devtools/import.py. + """ + build_ext_obj = self.distribution.get_command_obj('build_ext') + + symbols = dict() + for ext in self.distribution.ext_modules: + for sym in run_nm_defined_symbols(build_ext_obj.get_ext_fullpath(ext.name)): + symbols.setdefault(sym, []).append(ext.name.lstrip('pysam.')) + + errors = 0 + for (sym, objs) in symbols.items(): + if (len(objs) > 1): + log.error("conflicting symbol (%s): %s", " ".join(objs), sym) + errors += 1 + + if errors > 0: raise LinkError("symbols defined in multiple extensions") + + def run(self): + build.run(self) + try: + if HTSLIB_MODE != 'separate': + self.check_ext_symbol_conflicts() + except OSError as e: + log.warn("skipping symbol collision check (invoking nm failed: %s)", e) + except subprocess.CalledProcessError: + log.warn("skipping symbol collision check (invoking nm failed)") + + +class clean_ext(Command): + description = "clean up Cython temporary files" + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + objs = glob.glob(os.path.join("pysam", "libc*.c")) + if objs: + log.info("removing 'pysam/libc*.c' (%s Cython objects)", len(objs)) + for obj in objs: + os.remove(obj) + + headers = (glob.glob(os.path.join("htslib", "*config*.h")) + + glob.glob(os.path.join("samtools", "*config*.h")) + + glob.glob(os.path.join("bcftools", "*config*.h"))) + if headers: + log.info("removing '*/*config*.h' (%s generated headers)", len(headers)) + for header in headers: + os.remove(header) + + objects = (glob.glob(os.path.join("htslib", "*.[oa]")) + + glob.glob(os.path.join("htslib", "cram", "*.o")) + + glob.glob(os.path.join("htslib", "htscodecs", "htscodecs", "*.o"))) + if objects: + log.info("removing 'htslib/**/*.o' and libhts.a (%s objects)", len(objects)) + for obj in objects: + os.remove(obj) + + +# How to link against HTSLIB +# shared: build shared chtslib from builtin htslib code. +# external: use shared libhts.so compiled outside of +# pysam +# separate: use included htslib and include in each extension +# module. No dependencies between modules and works with +# setup.py install, but wasteful in terms of memory and +# compilation time. Fallback if shared module compilation +# fails. + +HTSLIB_MODE = os.environ.get("HTSLIB_MODE", "shared") +HTSLIB_LIBRARY_DIR = os.environ.get("HTSLIB_LIBRARY_DIR", None) +HTSLIB_INCLUDE_DIR = os.environ.get("HTSLIB_INCLUDE_DIR", None) +HTSLIB_CONFIGURE_OPTIONS = os.environ.get("HTSLIB_CONFIGURE_OPTIONS", None) +HTSLIB_SOURCE = None + +package_list = ['pysam', + 'pysam.include', + 'pysam.include.samtools', + 'pysam.include.bcftools'] +package_dirs = {'pysam': 'pysam', + 'pysam.include.samtools': 'samtools', + 'pysam.include.bcftools': 'bcftools'} + +# list of config files that will be automatically generated should +# they not already exist or be created by configure scripts in the +# subpackages. +config_headers = ["samtools/config.h", + "bcftools/config.h"] + +# If cython is available, the pysam will be built using cython from +# the .pyx files. If no cython is available, the C-files included in the +# distribution will be used. +if HAVE_CYTHON: + print("# pysam: cython is available - using cythonize if necessary") + source_pattern = "pysam/libc%s.pyx" +else: + print("# pysam: no cython available - using pre-compiled C") + source_pattern = "pysam/libc%s.c" + +# Exit if there are no pre-compiled files and no cython available +fn = source_pattern % "htslib" +if not os.path.exists(fn): + raise ValueError( + "no cython installed, but can not find {}." + "Make sure that cython is installed when building " + "from the repository" + .format(fn)) + +print("# pysam: htslib mode is {}".format(HTSLIB_MODE)) +print("# pysam: HTSLIB_CONFIGURE_OPTIONS={}".format( + HTSLIB_CONFIGURE_OPTIONS)) +htslib_configure_options = None + +if HTSLIB_MODE in ['shared', 'separate']: + package_list += ['pysam.include.htslib', + 'pysam.include.htslib.htslib'] + package_dirs.update({'pysam.include.htslib':'htslib'}) + + htslib_configure_options = configure_library( + "htslib", + HTSLIB_CONFIGURE_OPTIONS, + ["--enable-libcurl", + "--disable-libcurl"]) + + HTSLIB_SOURCE = "builtin" + print("# pysam: htslib configure options: {}".format( + str(htslib_configure_options))) + + config_headers += ["htslib/config.h"] + if htslib_configure_options is None: + # create empty config.h file + with open("htslib/config.h", "w") as outf: + outf.write( + "/* empty config.h created by pysam */\n") + outf.write( + "/* conservative compilation options */\n") + + with changedir("htslib"): + htslib_make_options = run_make_print_config() + + for key, value in htslib_make_options.items(): + print("# pysam: htslib_config {}={}".format(key, value)) + + external_htslib_libraries = ['z'] + if "LIBS" in htslib_make_options: + external_htslib_libraries.extend( + [re.sub("^-l", "", x) for x in htslib_make_options["LIBS"].split(" ") if x.strip()]) + +if HTSLIB_LIBRARY_DIR: + # linking against a shared, externally installed htslib version, + # no sources or built libhts.a required for htslib + htslib_objects = [] + separate_htslib_objects = [] + chtslib_sources = [] + htslib_library_dirs = [HTSLIB_LIBRARY_DIR] + htslib_include_dirs = [HTSLIB_INCLUDE_DIR] + external_htslib_libraries = ['z', 'hts'] +elif HTSLIB_MODE == 'separate': + # add to each pysam component a separately compiled + # htslib + htslib_objects = ['htslib/libhts.a'] + separate_htslib_objects = ['htslib/libhts.a'] + htslib_library_dirs = [] + htslib_include_dirs = ['htslib'] +elif HTSLIB_MODE == 'shared': + # link each pysam component against the same + # htslib built from sources included in the pysam + # package. + + # Link with the object files rather than the final htslib/libhts.a, to ensure that + # all object files are pulled into the link, even those not used by htslib itself. + htslib_objects = [os.path.join("htslib", x) + for x in htslib_make_options["LIBHTS_OBJS"].split(" ")] + separate_htslib_objects = [] + + htslib_library_dirs = ["."] # when using setup.py develop? + htslib_include_dirs = ['htslib'] +else: + raise ValueError("unknown HTSLIB value '%s'" % HTSLIB_MODE) + +# build config.py +with open(os.path.join("pysam", "config.py"), "w") as outf: + outf.write('HTSLIB = "{}"\n'.format(HTSLIB_SOURCE)) + config_values = collections.defaultdict(int) + + if HTSLIB_SOURCE == "builtin": + with open(os.path.join("htslib", "config.h")) as inf: + for line in inf: + if line.startswith("#define"): + key, value = re.match( + "#define (\S+)\s+(\S+)", line).groups() + config_values[key] = value + for key in ["ENABLE_GCS", + "ENABLE_PLUGINS", + "ENABLE_S3", + "HAVE_COMMONCRYPTO", + "HAVE_HMAC", + "HAVE_LIBBZ2", + "HAVE_LIBCURL", + "HAVE_LIBDEFLATE", + "HAVE_LIBLZMA", + "HAVE_MMAP"]: + outf.write("{} = {}\n".format(key, config_values[key])) + print("# pysam: config_option: {}={}".format(key, config_values[key])) + +# create empty config.h files if they have not been created automatically +# or created by the user: +for fn in config_headers: + if not os.path.exists(fn): + with open(fn, "w") as outf: + outf.write( + "/* empty config.h created by pysam */\n") + outf.write( + "/* conservative compilation options */\n") + +####################################################### +# Windows compatibility - untested +if platform.system() == 'Windows': + include_os = ['win32'] + os_c_files = ['win32/getopt.c'] + extra_compile_args = [] +else: + include_os = [] + os_c_files = [] + # for python 3.4, see for example + # http://stackoverflow.com/questions/25587039/ + # error-compiling-rpy2-on-python3-4-due-to-werror- + # declaration-after-statement + extra_compile_args = [ + "-Wno-unused", + "-Wno-strict-prototypes", + "-Wno-sign-compare", + "-Wno-error=declaration-after-statement"] + +define_macros = [] + +suffix = sysconfig.get_config_var('EXT_SUFFIX') +if not suffix: + suffix = sysconfig.get_config_var('SO') + +internal_htslib_libraries = [ + os.path.splitext("chtslib{}".format(suffix))[0]] +internal_samtools_libraries = [ + os.path.splitext("csamtools{}".format(suffix))[0], + os.path.splitext("cbcftools{}".format(suffix))[0], + ] +internal_pysamutil_libraries = [ + os.path.splitext("cutils{}".format(suffix))[0]] + +libraries_for_pysam_module = external_htslib_libraries + internal_htslib_libraries + internal_pysamutil_libraries + +# Order of modules matters in order to make sure that dependencies are resolved. +# The structures of dependencies is as follows: +# libchtslib: htslib utility functions and htslib itself if builtin is set. +# libcsamtools: samtools code (builtin) +# libcbcftools: bcftools code (builtin) +# libcutils: General utility functions, depends on all of the above +# libcXXX (pysam module): depends on libchtslib and libcutils + +# The list below uses the union of include_dirs and library_dirs for +# reasons of simplicity. + +def prebuild_libchtslib(ext, force): + if HTSLIB_MODE not in ['shared', 'separate']: return + + write_configvars_header("htslib/config_vars.h", ext, "HTS") + + if force or not os.path.exists("htslib/libhts.a"): + log.info("building 'libhts.a'") + with changedir("htslib"): + # TODO Eventually by running configure here, we can set these + # extra flags for configure instead of hacking on ALL_CPPFLAGS. + args = " ".join(ext.extra_compile_args) + run_make(["ALL_CPPFLAGS=-I. " + args + " $(CPPFLAGS)", "lib-static"]) + else: + log.warn("skipping 'libhts.a' (already built)") + + +def prebuild_libcsamtools(ext, force): + write_configvars_header("samtools/samtools_config_vars.h", ext, "SAMTOOLS") + + +modules = [ + dict(name="pysam.libchtslib", + prebuild_func=prebuild_libchtslib, + sources=[source_pattern % "htslib", "pysam/htslib_util.c"] + os_c_files, + extra_objects=htslib_objects, + libraries=external_htslib_libraries), + dict(name="pysam.libcsamtools", + prebuild_func=prebuild_libcsamtools, + sources=[source_pattern % "samtools"] + glob.glob(os.path.join("samtools", "*.pysam.c")) + + [os.path.join("samtools", "lz4", "lz4.c")] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=external_htslib_libraries + internal_htslib_libraries), + dict(name="pysam.libcbcftools", + sources=[source_pattern % "bcftools"] + glob.glob(os.path.join("bcftools", "*.pysam.c")) + os_c_files, + extra_objects=separate_htslib_objects, + libraries=external_htslib_libraries + internal_htslib_libraries), + dict(name="pysam.libcutils", + sources=[source_pattern % "utils", "pysam/pysam_util.c"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=external_htslib_libraries + internal_htslib_libraries + internal_samtools_libraries), + dict(name="pysam.libcalignmentfile", + sources=[source_pattern % "alignmentfile"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), + dict(name="pysam.libcsamfile", + sources=[source_pattern % "samfile"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), + dict(name="pysam.libcalignedsegment", + sources=[source_pattern % "alignedsegment"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), + dict(name="pysam.libctabix", + sources=[source_pattern % "tabix"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), + dict(name="pysam.libcfaidx", + sources=[source_pattern % "faidx"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), + dict(name="pysam.libcbcf", + sources=[source_pattern % "bcf"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), + dict(name="pysam.libcbgzf", + sources=[source_pattern % "bgzf"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), + dict(name="pysam.libctabixproxies", + sources=[source_pattern % "tabixproxies"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), + dict(name="pysam.libcvcf", + sources=[source_pattern % "vcf"] + os_c_files, + extra_objects=separate_htslib_objects, + libraries=libraries_for_pysam_module), +] + +common_options = dict( + language="c", + extra_compile_args=extra_compile_args, + define_macros=define_macros, + # for out-of-tree compilation, use absolute paths + library_dirs=[os.path.abspath(x) for x in ["pysam"] + htslib_library_dirs], + include_dirs=[os.path.abspath(x) for x in ["pysam"] + htslib_include_dirs + \ + ["samtools", "samtools/lz4", "bcftools", "."] + include_os]) + +# add common options (in python >3.5, could use n = {**a, **b} +for module in modules: + module.update(**common_options) + +classifiers = """ +Development Status :: 4 - Beta +Intended Audience :: Science/Research +Intended Audience :: Developers +License :: OSI Approved +Programming Language :: Python +Topic :: Software Development +Topic :: Scientific/Engineering +Operating System :: POSIX +Operating System :: Unix +Operating System :: MacOS +""" + +metadata = { + 'name': "pysam", + 'version': get_pysam_version(), + 'description': "pysam", + 'long_description': __doc__, + 'author': "Andreas Heger", + 'author_email': "andreas.heger@gmail.com", + 'license': "MIT", + 'platforms': ["POSIX", "UNIX", "MacOS"], + 'classifiers': [_f for _f in classifiers.split("\n") if _f], + 'url': "https://github.com/pysam-developers/pysam", + 'packages': package_list, + 'requires': ['cython (>=0.29.12)'], + 'ext_modules': [Extension(**opts) for opts in modules], + 'cmdclass': {'build': extra_build, 'build_ext': build_ext, 'clean_ext': clean_ext, 'sdist': cythonize_sdist}, + 'package_dir': package_dirs, + 'package_data': {'': ['*.pxd', '*.h', 'py.typed', '*.pyi'], }, + # do not pack in order to permit linking to csamtools.so + 'zip_safe': False, +} + +if __name__ == '__main__': + dist = setup(**metadata) diff --git a/tests/00README.txt b/tests/00README.txt new file mode 100644 index 0000000..6e60917 --- /dev/null +++ b/tests/00README.txt @@ -0,0 +1,23 @@ +File ex1.fa contains two sequences cut from the human genome +build36. They were extracted with command: + + samtools faidx human_b36.fa 2:2043966-2045540 20:67967-69550 + +Sequence names were changed manually for simplicity. File ex1.sam.gz +contains MAQ alignments extracted with: + + (samtools view NA18507_maq.bam 2:2044001-2045500; + samtools view NA18507_maq.bam 20:68001-69500) + +and processed with `samtools fixmate' to make it self-consistent as a +standalone alignment. + +In order for the script pysam_test.py to work, you will need pysam +in your PYTHONPATH. + +In order for the script example.py to work, you will need pysam +in your PYTHONPATH and run + + make all + +beforehand. diff --git a/tests/AlignedSegment_bench.py b/tests/AlignedSegment_bench.py new file mode 100644 index 0000000..f5bccd6 --- /dev/null +++ b/tests/AlignedSegment_bench.py @@ -0,0 +1,30 @@ +"""Benchmarking module for AlignedSegment functionality""" +import os +import array +import pysam + + +from TestUtils import BAM_DATADIR + + +def set_binary_tag(): + read = pysam.AlignedSegment() + read.set_tag('FZ', array.array('H', range(1000))) + return len(read.get_tag('FZ')) + + +def read_binary_tag(fn): + with pysam.AlignmentFile(fn) as inf: + read = next(inf.fetch()) + return len(read.get_tag('FZ')) + + +def test_set_binary_tag(benchmark): + result = benchmark(set_binary_tag) + assert result == 1000 + + +def test_read_binary_tag(benchmark): + result = benchmark(read_binary_tag, os.path.join( + BAM_DATADIR, "example_btag.bam")) + assert result == 260 diff --git a/tests/AlignedSegment_test.py b/tests/AlignedSegment_test.py new file mode 100644 index 0000000..400425f --- /dev/null +++ b/tests/AlignedSegment_test.py @@ -0,0 +1,1766 @@ +import os +import pysam +import unittest +import json +import collections +import string +import struct +import copy +import array + +from TestUtils import ( + checkFieldEqual, + make_data_files, + BAM_DATADIR, + get_temp_filename, + get_temp_context, + IS_PYTHON3, +) + + +if IS_PYTHON3: + maketrans = str.maketrans +else: + maketrans = string.maketrans + + +def setUpModule(): + make_data_files(BAM_DATADIR) + + +class ReadTest(unittest.TestCase): + def build_read(self): + """build an example read.""" + + header = pysam.AlignmentHeader.from_references( + ["chr1", "chr2"], [10000000, 10000000] + ) + + a = pysam.AlignedSegment(header) + a.query_name = "read_12345" + a.query_sequence = "ATGC" * 10 + a.flag = 0 + a.reference_id = 0 + a.reference_start = 20 + a.mapping_quality = 20 + a.cigartuples = ((0, 10), (2, 1), (0, 9), (1, 1), (0, 20)) + a.next_reference_id = 0 + a.next_reference_start = 200 + a.template_length = 167 + a.query_qualities = pysam.qualitystring_to_array("1234") * 10 + return a + + +class TestAlignedSegment(ReadTest): + + """tests to check if aligned read can be constructed + and manipulated. + """ + + def testEmpty(self): + + a = pysam.AlignedSegment() + self.assertEqual(a.query_name, None) + self.assertEqual(a.query_sequence, None) + self.assertEqual(pysam.qualities_to_qualitystring(a.query_qualities), None) + self.assertEqual(a.flag, 0) + self.assertEqual(a.reference_id, -1) + self.assertEqual(a.mapping_quality, 0) + self.assertEqual(a.cigartuples, None) + self.assertEqual(a.get_tags(), []) + self.assertEqual(a.next_reference_id, -1) + self.assertEqual(a.next_reference_start, -1) + self.assertEqual(a.template_length, 0) + + def testStrOfEmptyRead(self): + a = pysam.AlignedSegment() + s = str(a) + self.assertEqual("None\t0\t*\t0\t0\tNone\t*\t0\t0\tNone\tNone\t[]", s) + + def testSettingTagInEmptyRead(self): + """see issue 62""" + a = pysam.AlignedSegment() + a.tags = (("NM", 1),) + a.query_qualities = None + self.assertEqual(a.tags, [("NM", 1),]) + + def testCompare(self): + """check comparison functions.""" + a = self.build_read() + b = None + + self.assertFalse(a is b) + self.assertFalse(a == b) + self.assertEqual(-1, a.compare(b)) + + b = self.build_read() + + self.assertEqual(0, a.compare(b)) + self.assertEqual(0, b.compare(a)) + self.assertTrue(a == b) + self.assertTrue(b == a) + self.assertFalse(a != b) + self.assertFalse(b != a) + + b.tid = 1 + self.assertFalse(a == b) + self.assertFalse(b == a) + self.assertTrue(a != b) + self.assertTrue(b != a) + + def testHashing(self): + a = self.build_read() + b = self.build_read() + self.assertEqual(hash(a), hash(b)) + b.tid = 1 + self.assertNotEqual(hash(a), hash(b)) + + def testUpdate(self): + """check if updating fields affects other variable length data + """ + a = self.build_read() + b = self.build_read() + + # check qname + b.query_name = "read_123" + checkFieldEqual(self, a, b, "query_name") + b.query_name = "read_12345678" + checkFieldEqual(self, a, b, "query_name") + b.query_name = "read_12345" + checkFieldEqual(self, a, b) + + # check cigar + b.cigartuples = ((0, 10),) + checkFieldEqual(self, a, b, "cigartuples") + b.cigartuples = ((0, 10), (2, 1), (0, 10)) + checkFieldEqual(self, a, b, "cigartuples") + b.cigartuples = ((0, 10), (2, 1), (0, 9), (1, 1), (0, 20)) + checkFieldEqual(self, a, b) + + # check seq + b.query_sequence = "ATGC" + checkFieldEqual( + self, a, b, ("query_sequence", "query_qualities", "query_length") + ) + b.query_sequence = "ATGC" * 3 + checkFieldEqual( + self, a, b, ("query_sequence", "query_qualities", "query_length") + ) + b.query_sequence = "ATGC" * 10 + checkFieldEqual(self, a, b, ("query_qualities",)) + + # reset qual + b = self.build_read() + + def dual(name): + if name.endswith('is_unmapped'): return name.replace('unmapped', 'mapped') + elif name.endswith('is_mapped'): return name.replace('mapped', 'unmapped') + elif name.endswith('is_reverse'): return name.replace('reverse', 'forward') + elif name.endswith('is_forward'): return name.replace('forward', 'reverse') + else: return name + + # check flags: + for x in ( + "is_paired", + "is_proper_pair", + "is_unmapped", + "mate_is_unmapped", + "is_reverse", + "mate_is_reverse", + "is_read1", + "is_read2", + "is_secondary", + "is_qcfail", + "is_duplicate", + "is_supplementary", + ): + setattr(b, x, True) + self.assertEqual(getattr(b, x), True) + checkFieldEqual(self, a, b, ("flag", x, dual(x),)) + setattr(b, x, False) + self.assertEqual(getattr(b, x), False) + checkFieldEqual(self, a, b) + + for x in ( + "is_mapped", + "mate_is_mapped", + "is_forward", + "mate_is_forward", + ): + setattr(b, x, False) + self.assertEqual(getattr(b, x), False) + checkFieldEqual(self, a, b, ("flag", x, dual(x),)) + setattr(b, x, True) + self.assertEqual(getattr(b, x), True) + checkFieldEqual(self, a, b) + + def testUpdate2(self): + """issue 135: inplace update of sequence and quality score. + + This does not work as setting the sequence will erase + the quality scores. + """ + a = self.build_read() + a.query_sequence = a.query_sequence[5:10] + self.assertEqual(pysam.qualities_to_qualitystring(a.query_qualities), None) + + a = self.build_read() + s = pysam.qualities_to_qualitystring(a.query_qualities) + a.query_sequence = a.query_sequence[5:10] + a.query_qualities = pysam.qualitystring_to_array(s[5:10]) + + self.assertEqual(pysam.qualities_to_qualitystring(a.query_qualities), s[5:10]) + + def testUpdateQual(self): + """Ensure SEQ and QUAL updates leading to absent QUAL set all bytes to 0xff""" + + a = self.build_read() + with get_temp_context("absent_qual.bam") as fname: + with pysam.AlignmentFile(fname, "wb", header=a.header) as outf: + a.query_sequence = "ATGC" + outf.write(a) + + a.query_sequence = "ATGCATGCATGC" + outf.write(a) + + a.query_sequence = "ATGCATGC" + a.query_qualities = pysam.qualitystring_to_array("<<<<<<<<") + a.query_qualities = None + outf.write(a) + + with pysam.BGZFile(fname) as f: + # Skip BAM header + (l_text,) = struct.unpack("<4xL", f.read(8)) + f.read(l_text) + (n_ref,) = struct.unpack(" /dev/null | wc -l".format(fn)).read() + return int(retval.strip()) + + +def build_fetch_with_samtoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "view", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + return len(proc.stdout.readlines()) + + +def build_fetch_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + return len(list(inf.fetch())) + + +def build_query_sequences_with_samtoolsshell(fn): + retval = os.popen("samtools view {} 2> /dev/null | cut -f 11".format(fn)).read() + return force_str(retval).splitlines() + + +def build_query_sequences_with_samtoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "view", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + data = [force_str(x).split()[10] for x in proc.stdout.readlines()] + return data + + +def build_query_sequences_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + data = [x.query_sequence for x in inf] + return data + + +def build_query_qualities_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + data = [x.query_qualities for x in inf] + return data + + +def build_query_sequences_flagfilter_with_samtoolsshell(fn): + retval = os.popen("samtools view -f 2 {} 2> /dev/null | cut -f 11".format(fn)).read() + return force_str(retval).splitlines() + + +def build_query_sequences_flagfilter_with_samtoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "view", "-f", "2", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + data = [force_str(x).split()[10] for x in proc.stdout.readlines()] + return data + +def build_query_sequences_flagfilter_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + data = [x.query_sequence for x in inf if x.is_proper_pair] + return data + + +def build_query_sequences_directflagfilter_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + data = [x.query_sequence for x in inf if x.flag & 2] + return data + + +def build_aligned_pairs_with_pysam(*args, **kwargs): + matches_only = kwargs.pop("matches_only", False) + with_seq = kwargs.pop("with_seq", False) + with pysam.AlignmentFile(*args, **kwargs) as inf: + data = [x.get_aligned_pairs(matches_only=matches_only, with_seq=with_seq) + for x in inf if x.is_mapped] + return data + diff --git a/tests/AlignmentFileFetch_bench.py b/tests/AlignmentFileFetch_bench.py new file mode 100644 index 0000000..9fd8b83 --- /dev/null +++ b/tests/AlignmentFileFetch_bench.py @@ -0,0 +1,97 @@ +"""Benchmarking module for AlignmentFile functionality""" +import pytest + + +from TestUtils import BAM_DATADIR +from AlignmentFileFetchTestUtils import * + + +def test_build_fetch_from_bam_with_samtoolsshell(benchmark): + result = benchmark(build_fetch_with_samtoolsshell, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 3270 + + +def test_build_fetch_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_fetch_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 3270 + + +def test_build_fetch_from_bam_with_pysam(benchmark): + result = benchmark(build_fetch_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 3270 + + +def test_build_query_sequences_from_bam_with_samtoolsshell(benchmark): + result = benchmark(build_query_sequences_with_samtoolsshell, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len(result) == 3270 + + +def test_build_query_sequences_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_query_sequences_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len(result) == 3270 + + +def test_build_query_sequences_from_bam_with_pysam(benchmark): + result = benchmark(build_query_sequences_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len(result) == 3270 + + +def test_build_query_qualities_from_bam_with_pysam(benchmark): + result = benchmark(build_query_qualities_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len(result) == 3270 + + +def test_build_query_sequences_from_bam_flagfilter_with_samtoolsshell(benchmark): + result = benchmark(build_query_sequences_flagfilter_with_samtoolsshell, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len(result) == 3124 + + +def test_build_query_sequences_from_bam_flagfilter_with_samtoolspipe(benchmark): + result = benchmark(build_query_sequences_flagfilter_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len(result) == 3124 + + +def test_build_query_sequences_from_bam_flagfilter_with_pysam(benchmark): + result = benchmark(build_query_sequences_flagfilter_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len(result) == 3124 + + +def test_build_query_sequences_from_bam_directflagfilter_with_pysam(benchmark): + result = benchmark(build_query_sequences_flagfilter_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len(result) == 3124 + + +@pytest.mark.aligned_pairs +def test_build_aligned_pairs_default_with_pysam(benchmark): + result = benchmark(build_aligned_pairs_with_pysam, + os.path.join(BAM_DATADIR, "with_md.bam")) + assert len(result) == 3235 + + +@pytest.mark.aligned_pairs +def test_build_aligned_pairs_matchesonly_with_pysam(benchmark): + result = benchmark(build_aligned_pairs_with_pysam, + os.path.join(BAM_DATADIR, "with_md.bam"), + matches_only=True) + assert len(result) == 3235 + + +@pytest.mark.aligned_pairs +def test_build_aligned_pairs_withseq_with_pysam(benchmark): + result = benchmark(build_aligned_pairs_with_pysam, + os.path.join(BAM_DATADIR, "with_md.bam"), + with_seq=True) + assert len(result) == 3235 + + diff --git a/tests/AlignmentFileHeader_test.py b/tests/AlignmentFileHeader_test.py new file mode 100644 index 0000000..3d9e2e4 --- /dev/null +++ b/tests/AlignmentFileHeader_test.py @@ -0,0 +1,328 @@ +#!/usr/bin/env python +'''unit testing code for pysam. + +Execute in the :file:`tests` directory as it requires the Makefile +and data files located there. +''' + +import unittest +import os +import re +import copy +from collections import OrderedDict as odict +import pysam +import pysam.samtools +from TestUtils import get_temp_filename, make_data_files, BAM_DATADIR + + +def setUpModule(): + make_data_files(BAM_DATADIR) + + +class TestHeaderConstruction(unittest.TestCase): + """testing header construction.""" + + header_dict = odict( + [('SQ', [odict([('LN', 1575), ('SN', 'chr1'), ('AH', 'chr1:5000000-5010000')]), + odict([('LN', 1584), ('SN', 'chr2'), ('AH', '*')])]), + ('RG', [odict([('LB', 'SC_1'), ('ID', 'L1'), ('SM', 'NA12891'), + ('PU', 'SC_1_10'), ("CN", "name:with:colon")]), + odict([('LB', 'SC_2'), ('ID', 'L2'), ('SM', 'NA12891'), + ('PU', 'SC_2_12'), ("CN", "name:with:colon")])]), + ('PG', [odict([('ID', 'P1'), ('VN', '1.0')]), + odict([('ID', 'P2'), ('VN', '1.1')])]), + ('HD', odict([('VN', '1.0')])), + ('CO', ['this is a comment', 'this is another comment']), + ]) + + header_text = ("@HD\tVN:1.0\n" + "@SQ\tSN:chr1\tLN:1575\tAH:chr1:5000000-5010000\n" + "@SQ\tSN:chr2\tLN:1584\tAH:*\n" + "@RG\tID:L1\tPU:SC_1_10\tLB:SC_1\tSM:NA12891\tCN:name:with:colon\n" + "@RG\tID:L2\tPU:SC_2_12\tLB:SC_2\tSM:NA12891\tCN:name:with:colon\n" + "@PG\tID:P1\tVN:1.0\n" + "@PG\tID:P2\tVN:1.1\n" + "@CO\tthis is a comment\n" + "@CO\tthis is another comment\n") + + + header_from_references = odict( + [('SQ', [odict([('LN', 1575), ('SN', 'chr1')]), + odict([('LN', 1584), ('SN', 'chr2')])]), + ('RG', [odict([('LB', 'SC_1'), ('ID', 'L1'), ('SM', 'NA12891'), + ('PU', 'SC_1_10'), ("CN", "name:with:colon")]), + odict([('LB', 'SC_2'), ('ID', 'L2'), ('SM', 'NA12891'), + ('PU', 'SC_2_12'), ("CN", "name:with:colon")])]), + ('PG', [odict([('ID', 'P1'), ('VN', '1.0')]), + odict([('ID', 'P2'), ('VN', '1.1')])]), + ('HD', odict([('VN', '1.0')])), + ('CO', ['this is a comment', 'this is another comment']), + ]) + + header_without_text = odict( + [('SQ', [odict([('LN', 1575), ('SN', 'chr1')]), + odict([('LN', 1584), ('SN', 'chr2')])]), + ]) + + def compare_headers(self, test_header, ref_header=None): + '''compare two headers a and b.''' + test_header_dict = test_header.as_dict() + if ref_header is None: + ref_header = self.header_dict + + for ak, av in test_header_dict.items(): + self.assertTrue(ak in self.header_dict, "key '%s' not in '%s' " % (ak, ref_header)) + self.assertEqual(av, ref_header[ak]) + for ak, av in ref_header.items(): + self.assertTrue(ak in test_header_dict, "key '%s' not in '%s' " % (ak, test_header_dict)) + self.assertEqual(av, test_header_dict[ak]) + + def check_name_mapping(self, test_header): + for x, y in enumerate(("chr1", "chr2")): + tid = test_header.get_tid(y) + ref = test_header.get_reference_name(x) + self.assertEqual(tid, x) + self.assertEqual(ref, y) + + self.assertEqual(test_header.get_tid("chr?"), -1) + self.assertRaises(ValueError, test_header.get_reference_name, 2) + + def test_header_constructed_from_dict(self): + header = pysam.AlignmentHeader.from_dict(self.header_dict) + self.compare_headers(header) + self.check_name_mapping(header) + + def test_header_constructed_from_text(self): + header = pysam.AlignmentHeader.from_text(self.header_text) + self.compare_headers(header) + self.check_name_mapping(header) + + def test_header_constructed_from_header(self): + header = pysam.AlignmentHeader.from_text(self.header_text) + self.compare_headers(header.copy()) + self.check_name_mapping(header) + + def test_header_constructed_from_references(self): + text = re.sub("@SQ[^\n]+\n", "", self.header_text) + assert "@SQ" not in text + header = pysam.AlignmentHeader.from_references( + reference_names=["chr1", "chr2"], + reference_lengths=[1575, 1584], + text=text) + self.compare_headers(header, self.header_from_references) + self.check_name_mapping(header) + + def test_header_constructed_from_references_without_text(self): + header = pysam.AlignmentHeader.from_references( + reference_names=["chr1", "chr2"], + reference_lengths=[1575, 1584]) + self.compare_headers(header, self.header_without_text) + self.check_name_mapping(header) + + +class TestHeaderSAM(unittest.TestCase): + """testing header manipulation""" + + header = {'SQ': [{'LN': 1575, 'SN': 'chr1', 'AH': 'chr1:5000000-5010000'}, + {'LN': 1584, 'SN': 'chr2', 'AH': '*'}], + 'RG': [{'LB': 'SC_1', 'ID': 'L1', 'SM': 'NA12891', + 'PU': 'SC_1_10', "CN": "name:with:colon"}, + {'LB': 'SC_2', 'ID': 'L2', 'SM': 'NA12891', + 'PU': 'SC_2_12', "CN": "name:with:colon"}], + 'PG': [{'ID': 'P1', 'VN': '1.0'}, {'ID': 'P2', 'VN': '1.1'}], + 'HD': {'VN': '1.0'}, + 'CO': ['this is a comment', 'this is another comment'], + } + + def compare_headers(self, a, b): + '''compare two headers a and b.''' + for ak, av in a.items(): + self.assertTrue(ak in b, "key '%s' not in '%s' " % (ak, b)) + self.assertEqual(av, b[ak]) + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.sam"), + "r") + + def test_header_content_is_as_expected(self): + self.compare_headers(self.header, self.samfile.header.to_dict()) + self.compare_headers(self.samfile.header.to_dict(), self.header) + + def test_text_access_works(self): + self.assertEqual(self.samfile.text, self.samfile.header.__str__()) + + def test_name_mapping(self): + for x, y in enumerate(("chr1", "chr2")): + tid = self.samfile.gettid(y) + ref = self.samfile.getrname(x) + self.assertEqual(tid, x) + self.assertEqual(ref, y) + + self.assertEqual(self.samfile.gettid("chr?"), -1) + self.assertRaises(ValueError, self.samfile.getrname, 2) + + def test_dictionary_access_works(self): + for key in self.header.keys(): + self.compare_headers({key: self.header[key]}, + {key: self.samfile.header[key]}) + + def test_dictionary_setting_raises_error(self): + self.assertRaises(TypeError, + self.samfile.header.__setitem__, + "CO", + ["This is a final comment"]) + + def test_dictionary_len_works(self): + self.assertEqual(len(self.header), len(self.samfile.header)) + + def test_dictionary_keys_works(self): + # sort for py2.7 + self.assertEqual(sorted(self.header.keys()), + sorted(self.samfile.header.keys())) + + def test_dictionary_values_works(self): + self.assertEqual(len(self.header.values()), len(self.samfile.header.values())) + + def test_dictionary_get_works(self): + self.assertEqual(self.header.get("HD"), {'VN': '1.0'}) + self.assertEqual(self.header.get("UK", "xyz"), "xyz") + self.assertEqual(self.header.get("UK"), None) + + def test_dictionary_contains_works(self): + self.assertTrue("HD" in self.header) + self.assertFalse("UK" in self.header) + + def tearDown(self): + self.samfile.close() + + +class TestHeaderBAM(TestHeaderSAM): + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.bam"), + "rb") + + +class TestHeaderCRAM(TestHeaderSAM): + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.cram"), + "rc") + + def compare_headers(self, a, b): + '''compare two headers a and b.''' + def _strip(dd): + for x in dd: + for y in ("M5", "UR"): + if y in x: + del x[y] + for ak, av in a.items(): + _strip(av) + self.assertTrue(ak in b, "key '%s' not in '%s' " % (ak, b)) + _strip(b[ak]) + + self.assertEqual(av, b[ak]) + + +class TestHeaderFromRefs(unittest.TestCase): + '''see issue 144 + + reference names need to be converted to string for python 3 + ''' + + # def testHeader( self ): + # refs = ['chr1', 'chr2'] + # tmpfile = "tmp_%i" % id(self) + # s = pysam.AlignmentFile(tmpfile, 'wb', + # referencenames=refs, + # referencelengths=[100]*len(refs)) + # s.close() + + # self.assertTrue( checkBinaryEqual( 'issue144.bam', tmpfile ), + # 'bam files differ') + # os.unlink( tmpfile ) + + + +class TestHeaderWriteRead(unittest.TestCase): + header = {'SQ': [{'LN': 1575, 'SN': 'chr1'}, + {'LN': 1584, 'SN': 'chr2'}], + 'RG': [{'LB': 'SC_1', 'ID': 'L1', 'SM': 'NA12891', + 'PU': 'SC_1_10', "CN": "name:with:colon"}, + {'LB': 'SC_2', 'ID': 'L2', 'SM': 'NA12891', + 'PU': 'SC_2_12', "CN": "name:with:colon"}], + 'PG': [{'ID': 'P1', 'VN': '1.0', 'CL': 'tool'}, + {'ID': 'P2', 'VN': '1.1', 'CL': 'tool with in option -R a\tb', + 'PP': 'P1'}], + 'HD': {'VN': '1.0'}, + 'CO': ['this is a comment', 'this is another comment'], + } + + def compare_headers(self, a, header_b): + '''compare two headers a and b. + + Ignore M5 and UR field as they are set application specific. + ''' + b = header_b.to_dict() + for ak, av in a.items(): + self.assertTrue(ak in b, "key '%s' not in '%s' " % (ak, b)) + self.assertEqual( + len(av), len(b[ak]), + "unequal number of entries for key {}: {} vs {}" + .format(ak, av, b[ak])) + + for row_a, row_b in zip(av, b[ak]): + if isinstance(row_b, dict): + for x in ["M5", "UR"]: + try: + del row_b[x] + except KeyError: + pass + self.assertEqual(row_a, row_b) + + def check_read_write(self, flag_write, header): + + fn = get_temp_filename() + print(fn) + with pysam.AlignmentFile( + fn, + flag_write, + header=header, + reference_filename=os.path.join(BAM_DATADIR, "ex1.fa")) as outf: + a = pysam.AlignedSegment() + a.query_name = "abc" + outf.write(a) + + with pysam.AlignmentFile(fn) as inf: + read_header = inf.header + + # os.unlink(fn) + self.compare_headers(header, read_header) + expected_lengths = dict([(x["SN"], x["LN"]) for x in header["SQ"]]) + self.assertEqual(expected_lengths, + dict(zip(read_header.references, + read_header.lengths))) + + def test_SAM(self): + self.check_read_write("wh", self.header) + + def test_BAM(self): + self.check_read_write("wb", self.header) + + def test_CRAM(self): + header = copy.copy(self.header) + if "PG" in header: + # for CRAM, \t needs to be quoted: + header['PG'][1]['CL'] = re.sub(r"\t", r"\\\\t", header['PG'][1]['CL']) + self.check_read_write("wc", header) + + +class TestHeaderLargeContigs(TestHeaderWriteRead): + """see issue 741""" + + header = {'SQ': [{'LN': 2147483647, 'SN': 'chr1'}, + {'LN': 1584, 'SN': 'chr2'}], + 'HD': {'VN': '1.0'}} diff --git a/tests/AlignmentFilePileup_bench.py b/tests/AlignmentFilePileup_bench.py new file mode 100644 index 0000000..d165e52 --- /dev/null +++ b/tests/AlignmentFilePileup_bench.py @@ -0,0 +1,145 @@ +"""Benchmarking module for AlignmentFile functionality""" +from TestUtils import BAM_DATADIR, flatten_nested_list +from PileupTestUtils import * + + +def test_build_pileup_from_bam_with_samtoolsshell(benchmark): + result = benchmark(build_pileup_with_samtoolsshell, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 2998 + + +def test_build_pileup_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_pileup_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 2998 + + +def test_build_pileup_from_bam_with_pysam(benchmark): + result = benchmark(build_pileup_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 2998 + + +def test_build_depth_from_bam_with_samtoolsshell(benchmark): + result = benchmark(build_depth_with_samtoolsshell, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 107241 + + +def test_build_depth_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_depth_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert sum(result) == 107241 + + +def test_build_depth_from_bam_with_pysam(benchmark): + result = benchmark(build_depth_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + # different value, as samtools filters with a minimum + # base quality of 13 + assert sum(result) == 110015 + + +def test_build_depth_with_filter_from_bam_with_pysam(benchmark): + result = benchmark(build_depth_with_filter_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert sum(result) == 107241 + + +def test_build_query_bases_from_bam_with_samtoolsshell(benchmark): + result = benchmark(build_query_bases_with_samtoolsshell, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 116308 + + +def test_build_query_bases_from_bam_with_samtoolspysam(benchmark): + result = benchmark(build_query_bases_with_samtoolspysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len("".join(flatten_nested_list(result))) == 116308 + + +def test_build_query_bases_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_query_bases_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len("".join(flatten_nested_list(result))) == 116308 + + +def test_build_query_bases_from_bam_with_pysam_pileups(benchmark): + # note that there is no overlap detection here + result = benchmark(build_query_bases_with_pysam_pileups, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len("".join(flatten_nested_list(result))) == 107241 + + +def test_build_query_bases_from_bam_with_pysam(benchmark): + result = benchmark(build_query_bases_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len("".join(flatten_nested_list(result))) == 116308 + + +# note that pileups with/without reference sequence will differ due to +# realignment. +def test_build_query_bases_with_reference_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_query_bases_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam"), + "-f", os.path.join(BAM_DATADIR, "ex1.fa")) + assert len("".join(flatten_nested_list(result))) == 115924 + + +def test_build_query_bases_with_reference_from_bam_with_pysam(benchmark): + with pysam.FastaFile(os.path.join(BAM_DATADIR, "ex1.fa")) as fasta: + result = benchmark(build_query_bases_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam"), + fastafile=fasta) + assert len("".join(flatten_nested_list(result))) == 115924 + + +def test_build_query_bases_with_reference_from_bam_with_samtoolspysam(benchmark): + result = benchmark(build_query_bases_with_samtoolspysam, + os.path.join(BAM_DATADIR, "ex2.bam"), + "-f", os.path.join(BAM_DATADIR, "ex1.fa")) + assert len("".join(flatten_nested_list(result))) == 115924 + + +def test_build_query_qualities_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_query_qualities_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len("".join(result)) == 107241 + + +def test_build_query_qualities_from_bam_with_pysam(benchmark): + result = benchmark(build_query_qualities_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert sum([len(x) for x in result]) == 107241 + + +def test_build_query_names_from_bam_with_pysam(benchmark): + result = benchmark(build_query_names_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len("".join([x for column in result for x in column])) == 2307343 + + +def test_build_mapping_qualities_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_mapping_qualities_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert len("".join(result)) == 107241 + + +def test_build_mapping_qualities_from_bam_with_pysam(benchmark): + result = benchmark(build_mapping_qualities_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert sum([len(x) for x in result]) == 107241 + + +def test_build_query_positions_from_bam_with_samtoolspipe(benchmark): + result = benchmark(build_query_positions_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + # positions output by samtools are 1-based + assert sum([sum(x) - len(x) for x in result]) == 1841699 + + +def test_build_query_positions_from_bam_with_pysam(benchmark): + result = benchmark(build_query_positions_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert sum([sum(x) for x in result]) == 1841699 diff --git a/tests/AlignmentFilePileup_test.py b/tests/AlignmentFilePileup_test.py new file mode 100644 index 0000000..8e75a52 --- /dev/null +++ b/tests/AlignmentFilePileup_test.py @@ -0,0 +1,405 @@ +"""Benchmarking module for AlignmentFile functionality""" +import os +import pysam +import unittest +from TestUtils import make_data_files, BAM_DATADIR, IS_PYTHON3, force_str, flatten_nested_list +import PileupTestUtils + + +def setUpModule(): + make_data_files(BAM_DATADIR) + + +class TestPileupReadSelection(unittest.TestCase): + '''test pileup functionality.''' + + samfilename = os.path.join(BAM_DATADIR, "ex1.bam") + fastafilename = os.path.join(BAM_DATADIR, "ex1.fa") + + def setUp(self): + + self.samfile = pysam.AlignmentFile(self.samfilename) + self.fastafile = pysam.FastaFile(self.fastafilename) + + def tearDown(self): + self.samfile.close() + self.fastafile.close() + + def check_equal(self, references, iterator): + + for x, column in enumerate(iterator): + v = references[x][:-1].split("\t") + self.assertEqual( + len(v), 6, + "expected 6 values, got {}".format(v)) + (contig, pos, reference_base, + read_bases, read_qualities, alignment_mapping_qualities) \ + = v + self.assertEqual(int(pos) - 1, column.reference_pos) + + def test_samtools_stepper(self): + refs = force_str( + pysam.samtools.mpileup( + "-f", self.fastafilename, + self.samfilename)).splitlines(True) + iterator = self.samfile.pileup( + stepper="samtools", + fastafile=self.fastafile) + self.check_equal(refs, iterator) + + def test_all_stepper(self): + refs = force_str( + pysam.samtools.mpileup( + "-f", self.fastafilename, + "-A", "-B", + self.samfilename)).splitlines(True) + + iterator = self.samfile.pileup( + stepper="all", + fastafile=self.fastafile) + self.check_equal(refs, iterator) + + def test_ignore_overlaps(self): + refs = force_str( + pysam.samtools.mpileup( + "-f", self.fastafilename, + "-A", "-B", "-x", + self.samfilename)).splitlines(True) + + iterator = self.samfile.pileup( + stepper="all", + fastafile=self.fastafile, + ignore_overlaps=False) + self.check_equal(refs, iterator) + + def test_samtools_stepper_mapping_quality_threshold(self): + refs = force_str( + pysam.samtools.mpileup( + "-f", self.fastafilename, + "--min-MQ", "15", + self.samfilename)).splitlines(True) + iterator = self.samfile.pileup( + stepper="samtools", + fastafile=self.fastafile, + min_mapping_quality=15) + self.check_equal(refs, iterator) + + def test_samtools_stepper_base_quality_threshold(self): + refs = force_str( + pysam.samtools.mpileup( + "-f", self.fastafilename, + "--min-BQ", "20", + self.samfilename)).splitlines(True) + iterator = self.samfile.pileup( + stepper="samtools", + fastafile=self.fastafile, + min_base_quality=20) + self.check_equal(refs, iterator) + + def test_samtools_stepper_ignore_orphans(self): + refs = force_str( + pysam.samtools.mpileup( + "-f", self.fastafilename, + "--count-orphans", + self.samfilename)).splitlines(True) + iterator = self.samfile.pileup( + stepper="samtools", + fastafile=self.fastafile, + ignore_orphans=False) + self.check_equal(refs, iterator) + + def test_samtools_stepper_redo_baq(self): + refs = force_str( + pysam.samtools.mpileup( + "-f", self.fastafilename, + "--redo-BAQ", + self.samfilename)).splitlines(True) + iterator = self.samfile.pileup( + stepper="samtools", + fastafile=self.fastafile, + redo_baq=True) + self.check_equal(refs, iterator) + + +class TestPileupReadSelectionFastafile(TestPileupReadSelection): + '''test pileup functionality - backwards compatibility''' + + samfilename = os.path.join(BAM_DATADIR, "ex1.bam") + fastafilename = os.path.join(BAM_DATADIR, "ex1.fa") + + def setUp(self): + + self.samfile = pysam.AlignmentFile(self.samfilename) + self.fastafile = pysam.Fastafile(self.fastafilename) + + +class TestPileupQueryPosition(unittest.TestCase): + + filename = "test_query_position.bam" + + def testPileup(self): + last = {} + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, self.filename)) as inf: + for col in inf.pileup(): + for r in col.pileups: + # print r.alignment.query_name + # print r.query_position, r.query_position_or_next, r.is_del + if r.is_del: + self.assertEqual(r.query_position, None) + self.assertEqual(r.query_position_or_next, + last[r.alignment.query_name] + 1) + else: + self.assertNotEqual(r.query_position, None) + last[r.alignment.query_name] = r.query_position + + +class TestPileupObjects(unittest.TestCase): + + def setUp(self): + self.samfile = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") + + def testPileupColumn(self): + for pcolumn1 in self.samfile.pileup(region="chr1:105-106"): + if pcolumn1.reference_pos == 104: + self.assertEqual( + pcolumn1.reference_id, 0, + "chromosome/target id mismatch in position 1: %s != %s" % + (pcolumn1.reference_id, 0)) + self.assertEqual( + pcolumn1.reference_name, "chr1", + "chromosome mismatch in position 1: %s != %s" % + (pcolumn1.reference_name, "chr1")) + self.assertEqual( + pcolumn1.reference_pos, 105 - 1, + "position mismatch in position 1: %s != %s" % + (pcolumn1.reference_pos, 105 - 1)) + self.assertEqual( + pcolumn1.nsegments, 1, + "# reads mismatch in position 1: %s != %s" % + (pcolumn1.nsegments, 1)) + self.assertEqual( + len(pcolumn1.pileups), 1, + "# reads aligned to column mismatch in position 1" + ": %s != %s" % + (len(pcolumn1.pileups), 1)) + + for pcolumn2 in self.samfile.pileup(region="chr2:1480-1481"): + if pcolumn2.reference_pos == 1479: + self.assertEqual( + pcolumn2.reference_id, 1, + "chromosome/target id mismatch in position 1: %s != %s" % + (pcolumn2.reference_id, 1)) + self.assertEqual( + pcolumn2.reference_name, "chr2", + "chromosome mismatch in position 1: %s != %s" % + (pcolumn2.reference_name, "chr2")) + self.assertEqual( + pcolumn2.reference_pos, 1480 - 1, + "position mismatch in position 1: %s != %s" % + (pcolumn2.reference_pos, 1480 - 1)) + self.assertEqual( + pcolumn2.nsegments, 12, + "# reads mismatch in position 1: %s != %s" % + (pcolumn2.nsegments, 12)) + + def tearDown(self): + self.samfile.close() + + def testIteratorOutOfScope(self): + '''test if exception is raised if pileup col is accessed after + iterator is exhausted.''' + + max_n = 0 + for pileupcol in self.samfile.pileup(): + if max_n < pileupcol.n: + max_col = pileupcol + max_n = pileupcol.n + + self.assertRaises(ValueError, getattr, max_col, "pileups") + self.assertRaises(ValueError, max_col.get_query_sequences) + self.assertRaises(ValueError, max_col.get_num_aligned) + self.assertRaises(ValueError, max_col.get_query_qualities) + self.assertRaises(ValueError, max_col.get_mapping_qualities) + self.assertRaises(ValueError, max_col.get_query_positions) + self.assertRaises(ValueError, max_col.get_query_names) + + +class TestIteratorColumnBAM(unittest.TestCase): + + '''test iterator column against contents of ex4.bam.''' + + # note that samfile contains 1-based coordinates + # 1D means deletion with respect to reference sequence + # + mCoverages = {'chr1': [0] * 20 + [1] * 36 + [0] * (100 - 20 - 35), + 'chr2': [0] * 20 + [1] * 35 + [0] * (100 - 20 - 35), + } + + def setUp(self): + self.samfile = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex4.bam"), + "rb") + + def checkRange(self, contig, start=None, end=None, truncate=False): + '''compare results from iterator with those from samtools.''' + # check if the same reads are returned and in the same order + for column in self.samfile.pileup( + contig, start, end, truncate=truncate, min_base_quality=0): + if truncate: + self.assertGreaterEqual(column.reference_pos, start) + self.assertLess(column.reference_pos, end) + thiscov = len(column.pileups) + refcov = self.mCoverages[ + self.samfile.getrname(column.reference_id)][column.reference_pos] + self.assertEqual(thiscov, refcov, + "wrong coverage at pos %s:%i %i should be %i" % ( + self.samfile.getrname(column.reference_id), + column.reference_pos, thiscov, refcov)) + + def testIterateAll(self): + '''check random access per contig''' + self.checkRange(None) + + def testIteratePerContig(self): + '''check random access per contig''' + for contig in self.samfile.references: + self.checkRange(contig) + + def testIterateRanges(self): + '''check random access per range''' + for contig, length in zip( + self.samfile.references, self.samfile.lengths): + for start in range(1, length, 90): + # this includes empty ranges + self.checkRange(contig, start, start + 90) + + def testInverse(self): + '''test the inverse, is point-wise pileup accurate.''' + for contig, refseq in list(self.mCoverages.items()): + refcolumns = sum(refseq) + for pos, refcov in enumerate(refseq): + columns = list(self.samfile.pileup(contig, pos, pos + 1)) + if refcov == 0: + # if no read, no coverage + self.assertEqual( + len(columns), + refcov, + "wrong number of pileup columns returned for position %s:%i, %i should be %i" % ( + contig, pos, + len(columns), refcov)) + elif refcov == 1: + # one read, all columns of the read are returned + self.assertEqual( + len(columns), + refcolumns, + "pileup incomplete at position %i: got %i, expected %i " % + (pos, len(columns), refcolumns)) + + def testIterateTruncate(self): + '''check random access per range''' + for contig, length in zip(self.samfile.references, + self.samfile.lengths): + for start in range(1, length, 90): + # this includes empty ranges + self.checkRange(contig, start, start + 90, truncate=True) + + def tearDown(self): + self.samfile.close() + + +class TestIteratorColumn2(unittest.TestCase): + + '''test iterator column against contents of ex1.bam.''' + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") + + def testStart(self): + # print self.samfile.fetch().next().reference_start + # print self.samfile.pileup().next().reference_start + pass + + def testTruncate(self): + '''see issue 107.''' + # note that ranges in regions start from 1 + p = self.samfile.pileup(region='chr1:170-172', truncate=True) + columns = [x.reference_pos for x in p] + self.assertEqual(len(columns), 3) + self.assertEqual(columns, [169, 170, 171]) + + p = self.samfile.pileup('chr1', 169, 172, truncate=True) + columns = [x.reference_pos for x in p] + + self.assertEqual(len(columns), 3) + self.assertEqual(columns, [169, 170, 171]) + + def testAccessOnClosedIterator(self): + '''see issue 131 + + Accessing pileup data after iterator has closed. + ''' + pcolumn = self.samfile.pileup('chr1', 170, 180).__next__() + self.assertRaises(ValueError, getattr, pcolumn, "pileups") + + def testStr(self): + '''test if PileupRead can be printed.''' + iter = self.samfile.pileup('chr1', 170, 180) + pcolumn = iter.__next__() + s = str(pcolumn) + self.assertEqual(len(s.split("\n")), 2) + + +@unittest.skipIf(not IS_PYTHON3, + "tests requires at least python3 for subprocess context manager") +class PileUpColumnTests(unittest.TestCase): + + fn = os.path.join(BAM_DATADIR, "ex2.bam") + fn_fasta = os.path.join(BAM_DATADIR, "ex1.fa") + + def test_pileup_depths_are_equal(self): + samtools_result = PileupTestUtils.build_depth_with_samtoolspipe(self.fn) + pysam_result = PileupTestUtils.build_depth_with_filter_with_pysam(self.fn) + self.assertEqual(pysam_result, samtools_result) + + def test_pileup_query_bases_without_reference_are_equal(self): + samtools_result = PileupTestUtils.build_query_bases_with_samtoolspipe(self.fn) + pysam_result = PileupTestUtils.build_query_bases_with_pysam(self.fn) + self.assertEqual(["".join(x) for x in pysam_result], samtools_result) + + def test_pileup_query_bases_with_reference_are_equal(self): + samtools_result = PileupTestUtils.build_query_bases_with_samtoolspipe(self.fn, "-f", self.fn_fasta) + with pysam.FastaFile(self.fn_fasta) as fasta: + pysam_result = PileupTestUtils.build_query_bases_with_pysam(self.fn, fastafile=fasta, stepper="samtools") + self.assertEqual(["".join(x) for x in pysam_result], samtools_result) + + def test_pileup_query_qualities_are_equal(self): + samtools_result = PileupTestUtils.build_query_qualities_with_samtoolspipe(self.fn) + pysam_result = PileupTestUtils.build_query_qualities_with_pysam(self.fn) + pysam_result = [ + [chr(min(126, x + 33)) for x in l] for l in pysam_result] + self.assertEqual("".join(flatten_nested_list(pysam_result)), + "".join(flatten_nested_list(samtools_result))) + + def test_pileup_mapping_qualities_are_equal(self): + samtools_result = PileupTestUtils.build_mapping_qualities_with_samtoolspipe(self.fn) + pysam_result = PileupTestUtils.build_mapping_qualities_with_pysam(self.fn) + # convert to chars + pysam_result = [ + [chr(min(126, x + 33)) for x in l] for l in pysam_result] + + self.assertEqual("".join(flatten_nested_list(pysam_result)), + "".join(flatten_nested_list(samtools_result))) + + def test_pileup_query_qualities_from_pileups_are_equal(self): + samtools_result = PileupTestUtils.build_query_qualities_with_samtoolspipe(self.fn) + pysam_result = PileupTestUtils.build_query_qualities_with_pysam_pileups(self.fn) + pysam_result = [ + "".join([chr(min(126, x + 33)) for x in l]) for l in pysam_result] + + self.assertEqual(pysam_result, samtools_result) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/AlignmentFile_bench.py b/tests/AlignmentFile_bench.py new file mode 100644 index 0000000..275a5fb --- /dev/null +++ b/tests/AlignmentFile_bench.py @@ -0,0 +1,60 @@ +"""Benchmarking module for AlignmentFile functionality""" +import os +import subprocess +import pysam + + +from TestUtils import BAM_DATADIR + + +def count_number_lines_with_samtools(fn): + os.system("samtools view {} | wc -l > /dev/null".format(fn)) + return 3270 + + +def count_number_lines_with_samtoolspipe(fn): + with subprocess.Popen(["samtools", "view", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE) as proc: + return len(proc.stdout.readlines()) + + +def count_number_lines_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + return len(list(inf.fetch())) + + +def test_count_number_lines_from_sam_with_samtools(benchmark): + result = benchmark(count_number_lines_with_samtools, + os.path.join(BAM_DATADIR, "ex2.sam")) + assert result == 3270 + + +def test_count_number_lines_from_sam_with_samtoolspipe(benchmark): + result = benchmark(count_number_lines_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.sam")) + assert result == 3270 + + +def test_count_number_lines_from_sam_with_pysam(benchmark): + result = benchmark(count_number_lines_with_pysam, + os.path.join(BAM_DATADIR, "ex2.sam"), "r") + assert result == 3270 + + +def test_count_number_lines_from_bam_with_samtools(benchmark): + result = benchmark(count_number_lines_with_samtools, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 3270 + + +def test_count_number_lines_from_bam_with_samtoolspipe(benchmark): + result = benchmark(count_number_lines_with_samtoolspipe, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 3270 + + +def test_count_number_lines_from_bam_with_pysam(benchmark): + result = benchmark(count_number_lines_with_pysam, + os.path.join(BAM_DATADIR, "ex2.bam")) + assert result == 3270 diff --git a/tests/AlignmentFile_test.py b/tests/AlignmentFile_test.py new file mode 100644 index 0000000..61531f4 --- /dev/null +++ b/tests/AlignmentFile_test.py @@ -0,0 +1,2431 @@ +#!/usr/bin/env python +'''unit testing code for pysam. + +Execute in the :file:`tests` directory as it requires the Makefile +and data files located there. +''' + +import unittest +import pytest +import os +import shutil +import sys +import collections +import subprocess +import logging +import array +if sys.version_info.major >= 3: + from io import StringIO +else: + from StringIO import StringIO + +from functools import partial + +import pysam +import pysam.samtools +from TestUtils import checkBinaryEqual, checkGZBinaryEqual, check_url, \ + check_samtools_view_equal, checkFieldEqual, force_str, \ + get_temp_filename, make_data_files, BAM_DATADIR + + +def setUpModule(): + make_data_files(BAM_DATADIR) + + +################################################## +# +# Detailed test of file contents +# +# Data are read either through file based iterator +# access (BasicTestBAMFromFile) or by calling fetch +# without coordinates (BasicTestBAMFromFetch) +################################################## +class BasicTestBAMFromFetch(unittest.TestCase): + + '''basic first test - detailed testing + if information in file is consistent + with information in AlignedSegment object.''' + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.bam"), + "rb") + self.reads = list(self.samfile.fetch()) + + def tearDown(self): + self.samfile.close() + + def testARqname(self): + self.assertEqual(self.reads[0].query_name, + "read_28833_29006_6945") + self.assertEqual(self.reads[1].query_name, + "read_28701_28881_323b") + + def testARflag(self): + self.assertEqual(self.reads[0].flag, 99) + self.assertEqual(self.reads[1].flag, 147) + + def testARrname(self): + self.assertEqual(self.reads[0].reference_id, 0) + self.assertEqual(self.reads[1].reference_id, 1) + + def testARpos(self): + self.assertEqual(self.reads[0].reference_start, 33 - 1) + self.assertEqual(self.reads[1].reference_start, 88 - 1) + + def testARmapq(self): + self.assertEqual(self.reads[0].mapping_quality, 20) + self.assertEqual(self.reads[1].mapping_quality, 30) + + def testARcigar(self): + self.assertEqual(self.reads[0].cigartuples, [(0, 10), (2, 1), (0, 25)]) + self.assertEqual(self.reads[1].cigartuples, [(0, 35)]) + + def testARcigarstring(self): + self.assertEqual(self.reads[0].cigarstring, '10M1D25M') + self.assertEqual(self.reads[1].cigarstring, '35M') + + def testARmrnm(self): + self.assertEqual(self.reads[0].next_reference_id, 0) + self.assertEqual(self.reads[1].next_reference_id, 1) + self.assertEqual(self.reads[0].next_reference_id, 0) + self.assertEqual(self.reads[1].next_reference_id, 1) + + def testARmpos(self): + self.assertEqual(self.reads[0].next_reference_start, 200 - 1) + self.assertEqual(self.reads[1].next_reference_start, 500 - 1) + self.assertEqual(self.reads[0].next_reference_start, 200 - 1) + self.assertEqual(self.reads[1].next_reference_start, 500 - 1) + + def testARQueryLength(self): + self.assertEqual( + self.reads[0].query_length, 35, + "insert size mismatch in read 1: %s != %s" % + (self.reads[0].query_length, 35)) + self.assertEqual( + self.reads[1].query_length, 35, + "insert size mismatch in read 2: %s != %s" % + (self.reads[1].query_length, 35)) + self.assertEqual( + self.reads[0].query_length, 35, + "insert size mismatch in read 1: %s != %s" % + (self.reads[0].query_length, 35)) + self.assertEqual( + self.reads[1].query_length, 35, + "insert size mismatch in read 2: %s != %s" % + (self.reads[1].query_length, 35)) + + def testARseq(self): + self.assertEqual( + self.reads[0].query_sequence, + "AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG") + self.assertEqual( + self.reads[1].query_sequence, + "ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA") + self.assertEqual( + self.reads[3].query_sequence, + "AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG") + + def testARqual(self): + self.assertEqual( + pysam.qualities_to_qualitystring(self.reads[0].query_qualities), + "<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<") + self.assertEqual( + pysam.qualities_to_qualitystring(self.reads[1].query_qualities), + "<<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<<") + self.assertEqual( + pysam.qualities_to_qualitystring(self.reads[3].query_qualities), + "<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<") + + def testARquery(self): + self.assertEqual( + self.reads[0].query_alignment_sequence, + "AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG", + "query mismatch in read 1: %s != %s" % + (self.reads[0].query_alignment_sequence, + "AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG")) + self.assertEqual( + self.reads[1].query_alignment_sequence, + "ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA", + "query size mismatch in read 2: %s != %s" % + (self.reads[1].query_alignment_sequence, + "ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA")) + self.assertEqual( + self.reads[3].query_alignment_sequence, + "TAGCTAGCTACCTATATCTTGGTCTT", + "query mismatch in read 4: %s != %s" % + (self.reads[3].query_alignment_sequence, + "TAGCTAGCTACCTATATCTTGGTCTT")) + + def testARqqual(self): + self.assertEqual( + pysam.qualities_to_qualitystring( + self.reads[0].query_alignment_qualities), + "<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<", + "qquality string mismatch in read 1: %s != %s" % + (pysam.qualities_to_qualitystring(self.reads[0].query_alignment_qualities), + "<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<")) + self.assertEqual( + pysam.qualities_to_qualitystring( + self.reads[1].query_alignment_qualities), + "<<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<<", + "qquality string mismatch in read 2: %s != %s" % + (pysam.qualities_to_qualitystring(self.reads[1].query_alignment_qualities), + "<<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<<")) + self.assertEqual( + pysam.qualities_to_qualitystring( + self.reads[3].query_alignment_qualities), + "<<<<<<<<<<<<<<<<<:<9/,&,22", + "qquality string mismatch in read 3: %s != %s" % + (pysam.qualities_to_qualitystring(self.reads[3].query_alignment_qualities), + "<<<<<<<<<<<<<<<<<:<9/,&,22")) + + def testPresentOptionalFields(self): + self.assertEqual( + self.reads[0].opt('NM'), 22, + "optional field mismatch in read 1, NM: %s != %s" % + (self.reads[0].opt('NM'), 22)) + self.assertEqual( + self.reads[0].opt('RG'), 'L1', + "optional field mismatch in read 1, RG: %s != %s" % + (self.reads[0].opt('RG'), 'L1')) + self.assertEqual( + self.reads[1].opt('RG'), 'L2', + "optional field mismatch in read 2, RG: %s != %s" % + (self.reads[1].opt('RG'), 'L2')) + self.assertEqual( + self.reads[1].opt('MF'), 18, + "optional field mismatch in read 2, MF: %s != %s" % + (self.reads[1].opt('MF'), 18)) + + def testPairedBools(self): + self.assertEqual(self.reads[0].is_paired, True, "is paired mismatch in read 1: %s != %s" % ( + self.reads[0].is_paired, True)) + self.assertEqual(self.reads[1].is_paired, True, "is paired mismatch in read 2: %s != %s" % ( + self.reads[1].is_paired, True)) + self.assertEqual(self.reads[0].is_proper_pair, True, "is proper pair mismatch in read 1: %s != %s" % ( + self.reads[0].is_proper_pair, True)) + self.assertEqual(self.reads[1].is_proper_pair, True, "is proper pair mismatch in read 2: %s != %s" % ( + self.reads[1].is_proper_pair, True)) + + def testTags(self): + self.assertEqual(self.reads[0].tags, + [('NM', 22), ('RG', 'L1'), + ('PG', 'P1'), ('XT', 'U')]) + self.assertEqual(self.reads[1].tags, + [('MF', 18), ('RG', 'L2'), + ('PG', 'P2'), ('XT', 'R')]) + + def testOpt(self): + self.assertEqual(self.reads[0].opt("XT"), "U") + self.assertEqual(self.reads[1].opt("XT"), "R") + + +class BasicTestSAMFromFetch(BasicTestBAMFromFetch): + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.sam"), + "r") + self.reads = list(self.samfile.fetch()) + + +class BasicTestCRAMFromFetch(BasicTestBAMFromFetch): + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.cram"), + "rc") + self.reads = list(self.samfile.fetch()) + + def testTags(self): + self.assertEqual( + sorted(self.reads[0].tags), + sorted([('RG', 'L1'), + ('NM', 22), + ('MD', '0C0T1G1C0C0A1G0^G0C1C1G1A0T2G0G0G0A1C1G1G1A2C0'), + ('PG', 'P1'), + ('XT', 'U'), + ])) + self.assertEqual( + sorted(self.reads[1].tags), + sorted([('RG', 'L2'), + ('NM', 26), + ('MD', + '1G0A0A1G1G0G2C0A0G0A0A0C0T0T0G0A0A0G0A0C0A0A1T2C0T0T1'), + ('MF', 18), + ('PG', 'P2'), + ('XT', 'R')])) + + def testPresentOptionalFields(self): + self.assertEqual( + self.reads[0].opt('NM'), 22, + "optional field mismatch in read 1, NM: %s != %s" % + (self.reads[0].opt('NM'), 22)) + self.assertEqual( + self.reads[0].opt('RG'), 'L1', + "optional field mismatch in read 1, RG: %s != %s" % + (self.reads[0].opt('RG'), 'L1')) + self.assertEqual( + self.reads[1].opt('RG'), 'L2', + "optional field mismatch in read 2, RG: %s != %s" % + (self.reads[1].opt('RG'), 'L2')) + self.assertEqual( + self.reads[1].opt('MF'), 18, + "optional field mismatch in read 2, MF: %s != %s" % + (self.reads[1].opt('MF'), 18)) + + +class BasicTestSAMFromFilename(BasicTestBAMFromFetch): + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.sam"), + "r") + self.reads = [r for r in self.samfile] + + +class BasicTestCRAMFromFilename(BasicTestCRAMFromFetch): + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.cram"), + "rc") + self.reads = [r for r in self.samfile] + + +class BasicTestBAMFromFilename(BasicTestBAMFromFetch): + + def setUp(self): + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.bam"), + "rb") + self.reads = [r for r in self.samfile] + + +class BasicTestBAMFromFile(BasicTestBAMFromFetch): + + def setUp(self): + with open(os.path.join(BAM_DATADIR, "ex3.bam")) as f: + self.samfile = pysam.AlignmentFile( + f, "rb") + self.reads = [r for r in self.samfile] + + +class BasicTestBAMFromFileNo(BasicTestBAMFromFetch): + + def setUp(self): + with open(os.path.join(BAM_DATADIR, "ex3.bam")) as f: + self.samfile = pysam.AlignmentFile( + f.fileno(), "rb") + self.reads = [r for r in self.samfile] + + +class BasicTestSAMFromFile(BasicTestBAMFromFetch): + + def setUp(self): + with open(os.path.join(BAM_DATADIR, "ex3.sam")) as f: + self.samfile = pysam.AlignmentFile( + f, "r") + self.reads = [r for r in self.samfile] + + +class BasicTestSAMFromFileNo(BasicTestBAMFromFetch): + + def setUp(self): + with open(os.path.join(BAM_DATADIR, "ex3.sam")) as f: + self.samfile = pysam.AlignmentFile( + f.fileno(), "r") + self.reads = [r for r in self.samfile] + + +class BasicTestCRAMFromFile(BasicTestCRAMFromFetch): + + def setUp(self): + with open(os.path.join(BAM_DATADIR, "ex3.cram")) as f: + self.samfile = pysam.AlignmentFile(f, "rc") + self.reads = [r for r in self.samfile] + + +class BasicTestCRAMFromFileNo(BasicTestCRAMFromFetch): + + def setUp(self): + with open(os.path.join(BAM_DATADIR, "ex3.cram")) as f: + self.samfile = pysam.AlignmentFile( + f.fileno(), "rc") + self.reads = [r for r in self.samfile] + + +class BasicTestSAMFromStringIO(BasicTestBAMFromFetch): + + def testRaises(self): + statement = "samtools view -h {}".format( + os.path.join(BAM_DATADIR, "ex3.bam")) + stdout = subprocess.check_output(statement.split(" ")) + bam = StringIO() + if sys.version_info.major >= 3: + bam.write(stdout.decode('ascii')) + else: + bam.write(stdout) + bam.seek(0) + self.assertRaises(NotImplementedError, + pysam.AlignmentFile, bam) + # self.reads = [r for r in samfile] + + +################################################## +# +# Test of basic File I/O +# +# * format conversions +# * reading with/without index +# * reading from closed files +# +################################################## +class TestIO(unittest.TestCase): + + '''check if reading samfile and writing a samfile + are consistent.''' + + def checkEcho(self, + input_filename, + reference_filename, + output_filename, + input_mode, + output_mode, + sequence_filename=None, + use_template=True, + checkf=checkBinaryEqual, + **kwargs): + '''iterate through *input_filename* writing to + *output_filename* and comparing the output to + *reference_filename*. + + The files are opened according to the *input_mode* and + *output_mode*. + + If *use_template* is set, the header is copied from infile + using the template mechanism, otherwise target names and + lengths are passed explicitly. + + The *checkf* is used to determine if the files are + equal. + ''' + + with pysam.AlignmentFile( + os.path.join(BAM_DATADIR, input_filename), + input_mode) as infile: + + if "b" in input_mode: + self.assertTrue(infile.is_bam) + self.assertFalse(infile.is_cram) + elif "c" in input_mode: + self.assertFalse(infile.is_bam) + self.assertTrue(infile.is_cram) + else: + self.assertFalse(infile.is_cram) + self.assertFalse(infile.is_bam) + + if use_template: + outfile = pysam.AlignmentFile( + output_filename, + output_mode, + reference_filename=sequence_filename, + template=infile, **kwargs) + else: + outfile = pysam.AlignmentFile( + output_filename, + output_mode, + reference_names=infile.references, + reference_lengths=infile.lengths, + reference_filename=sequence_filename, + add_sq_text=False, + **kwargs) + + iter = infile.fetch() + + for x in iter: + outfile.write(x) + + outfile.close() + + self.assertTrue(checkf( + os.path.join(BAM_DATADIR, reference_filename), + output_filename), + "files %s and %s are not the same" % + (reference_filename, + output_filename)) + + os.unlink(output_filename) + + def testSAM2SAM(self): + self.checkEcho("ex2.sam", + "ex2.sam", + "tmp_ex2.sam", + "r", "wh") + + def testSAM2SAMWithoutHeader(self): + self.checkEcho("ex2.sam", + "ex1.sam", + "tmp_ex2.sam", + "r", "w", + add_sam_header=False) + + def testBAM2BAM(self): + self.checkEcho("ex2.bam", + "ex2.bam", + "tmp_ex2.bam", + "rb", "wb", + checkf=checkGZBinaryEqual) + + def testCRAM2CRAM(self): + # in some systems different reference sequence paths might be + # embedded in the CRAM files which will result in different headers + # see #542 + self.checkEcho("ex2.cram", + "ex2.cram", + "tmp_ex2.cram", + "rc", "wc", + sequence_filename=os.path.join(BAM_DATADIR, "ex1.fa"), + checkf=partial( + check_samtools_view_equal, + without_header=True)) + + def testSAM2BAM(self): + self.checkEcho("ex2.sam", + "ex2.bam", + "tmp_ex2.bam", + "r", "wb", + checkf=checkGZBinaryEqual) + + def testBAM2SAM(self): + self.checkEcho("ex2.bam", + "ex2.sam", + "tmp_ex2.sam", + "rb", "wh") + + def testBAM2CRAM(self): + # ignore header (md5 sum) + self.checkEcho("ex2.bam", + "ex2.cram", + "tmp_ex2.cram", + "rb", "wc", + sequence_filename=os.path.join(BAM_DATADIR, "ex1.fa"), + checkf=partial( + check_samtools_view_equal, + without_header=True)) + + def testCRAM2BAM(self): + # ignore header (md5 sum) + self.checkEcho("ex2.cram", + "ex2.bam", + "tmp_ex2.bam", + "rc", "wb", + sequence_filename=os.path.join(BAM_DATADIR, "ex1.fa"), + checkf=partial( + check_samtools_view_equal, + without_header=True)) + + def testSAM2CRAM(self): + self.checkEcho("ex2.sam", + "ex2.cram", + "tmp_ex2.cram", + "r", "wc", + sequence_filename=os.path.join(BAM_DATADIR, "ex1.fa"), + checkf=partial( + check_samtools_view_equal, + without_header=True)) + + def testCRAM2SAM(self): + self.checkEcho("ex2.cram", + "ex2.sam", + "tmp_ex2.sam", + "rc", "wh", + sequence_filename=os.path.join(BAM_DATADIR, "ex1.fa"), + checkf=partial( + check_samtools_view_equal, + without_header=True)) + + # Disabled - should work, files are not binary equal, but are + # non-binary equal: + # diff <(samtools view pysam_ex1.bam) <(samtools view pysam_data/ex1.bam) + # def testReadWriteBamWithTargetNames(self): + # input_filename = "ex1.bam" + # output_filename = "pysam_ex1.bam" + # reference_filename = "ex1.bam" + + # self.checkEcho(input_filename, reference_filename, output_filename, + # "rb", "wb", use_template=False) + + def testReadSamWithoutTargetNames(self): + '''see issue 104.''' + input_filename = os.path.join( + BAM_DATADIR, + "example_unmapped_reads_no_sq.sam") + + # raise exception in default mode + self.assertRaises(ValueError, + pysam.AlignmentFile, + input_filename, + "r") + + # raise exception if no SQ files + self.assertRaises(ValueError, + pysam.AlignmentFile, + input_filename, "r", + check_header=True) + + with pysam.AlignmentFile( + input_filename, + check_header=False, + check_sq=False) as infile: + result = list(infile.fetch(until_eof=True)) + self.assertEqual(2, len(result)) + + def testReadBamWithoutTargetNames(self): + '''see issue 104.''' + input_filename = os.path.join( + BAM_DATADIR, "example_unmapped_reads_no_sq.bam") + + # raise exception in default mode + self.assertRaises(ValueError, + pysam.AlignmentFile, + input_filename, + "r") + + # raise exception if no SQ files + self.assertRaises(ValueError, + pysam.AlignmentFile, + input_filename, + "r", + check_header=True) + + with pysam.AlignmentFile( + input_filename, check_sq=False) as infile: + result = list(infile.fetch(until_eof=True)) + + def test_fail_read_sam_without_header(self): + input_filename = os.path.join(BAM_DATADIR, "ex1.sam") + + self.assertRaises(ValueError, + pysam.AlignmentFile, + input_filename, + "r") + + def test_pass_read_sam_without_header_with_refs(self): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.sam"), + "r", + reference_names=["chr1", "chr2"], + reference_lengths=[1575, 1584]) as samfile: + self.assertEqual(len(list(samfile.fetch(until_eof=True))), 3270) + + def test_pass_read_sam_with_header_without_header_check(self): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex2.sam"), + "r", check_header=False) as samfile: + self.assertEqual(len(list(samfile.fetch(until_eof=True))), 3270) + + def test_fail_when_reading_unformatted_files(self): + '''test reading from a file that is not bam/sam formatted''' + input_filename = os.path.join(BAM_DATADIR, 'Makefile') + + self.assertRaises(ValueError, + pysam.AlignmentFile, + input_filename, + "rb") + + self.assertRaises(ValueError, + pysam.AlignmentFile, + input_filename, + "r") + + def testBAMWithoutAlignedSegments(self): + '''see issue 117''' + input_filename = os.path.join(BAM_DATADIR, "test_unaligned.bam") + samfile = pysam.AlignmentFile(input_filename, + "rb", + check_sq=False) + samfile.fetch(until_eof=True) + + def testBAMWithShortBAI(self): + '''see issue 116''' + input_filename = os.path.join(BAM_DATADIR, "example_bai.bam") + samfile = pysam.AlignmentFile(input_filename, + "rb", + check_sq=False) + samfile.fetch('chr2') + + def testFetchFromClosedFile(self): + + samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") + samfile.close() + self.assertRaises(ValueError, samfile.fetch, 'chr1', 100, 120) + + def testFetchFromClosedFileObject(self): + + f = open(os.path.join(BAM_DATADIR, "ex1.bam")) + samfile = pysam.AlignmentFile(f, "rb") + f.close() + self.assertTrue(f.closed) + # access to Samfile still works + self.checkEcho("ex1.bam", + "ex1.bam", + "tmp_ex1.bam", + "rb", "wb", + checkf=checkGZBinaryEqual) + + f = open(os.path.join(BAM_DATADIR, "ex1.bam")) + samfile = pysam.AlignmentFile(f, "rb") + self.assertFalse(f.closed) + samfile.close() + # python file needs to be closed separately + self.assertFalse(f.closed) + + def test_accessing_attributes_in_closed_file_raises_errors(self): + '''test that access to a closed samfile raises ValueError.''' + + samfile = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") + samfile.close() + + self.assertRaises(ValueError, samfile.fetch, 'chr1', 100, 120) + self.assertRaises(ValueError, samfile.pileup, 'chr1', 100, 120) + self.assertRaises(ValueError, samfile.getrname, 0) + # TODO + self.assertRaises(ValueError, samfile.tell) + self.assertRaises(ValueError, samfile.seek, 0) + self.assertRaises(ValueError, getattr, samfile, "nreferences") + self.assertRaises(ValueError, getattr, samfile, "references") + self.assertRaises(ValueError, getattr, samfile, "lengths") + + self.assertEqual(samfile.header, None) + # write on closed file + self.assertEqual(0, samfile.write(None)) + + def test_header_available_after_closing_file(self): + + def load_bam(): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), "rb") as inf: + header = inf.header + return header + + header = load_bam() + self.assertTrue(header) + self.assertEqual(header.nreferences, 2) + self.assertEqual(header.references, ("chr1", "chr2")) + + def test_reference_name_available_after_closing_file(self): + """read tids can be mapped to references after AlignmentFile has been closed. + + see issue #517""" + + def load_bam(): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), "rb") as inf: + read = next(inf) + return read + + read = load_bam() + self.assertEqual(read.reference_name, "chr1") + + # TODO + # def testReadingFromSamFileWithoutHeader(self): + # '''read from samfile without header. + # ''' + # samfile = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex7.sam"), + # check_header=False, + # check_sq=False) + # self.assertRaises(NotImplementedError, samfile.__iter__) + + def testReadingFromFileWithoutIndex(self): + '''read from bam file without index.''' + + dest = get_temp_filename("tmp_ex2.bam") + shutil.copyfile(os.path.join(BAM_DATADIR, "ex2.bam"), + dest) + samfile = pysam.AlignmentFile(dest, + "rb") + self.assertRaises(ValueError, samfile.fetch) + self.assertEqual( + len(list(samfile.fetch(until_eof=True))), + 3270) + os.unlink(dest) + + # def testReadingUniversalFileMode(self): + # '''read from samfile without header. + # ''' + + # input_filename = "ex2.sam" + # output_filename = "pysam_ex2.sam" + # reference_filename = "ex1.sam" + + # self.checkEcho(input_filename, + # reference_filename, + # output_filename, + # "rU", "w") + + def testHead(self): + '''test IteratorRowHead''' + samfile = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") + l10 = list(samfile.head(10)) + l100 = list(samfile.head(100)) + self.assertEqual(len(l10), 10) + self.assertEqual(len(l100), 100) + self.assertEqual(list(map(str, l10)), + list(map(str, l100[:10]))) + + def testWriteUncompressedBAMFile(self): + '''read from uncompressed BAM file, see issue #43''' + + input_filename = "ex2.sam" + output_filename = "pysam_uncompressed.bam" + reference_filename = "uncompressed.bam" + + self.checkEcho(input_filename, + reference_filename, + output_filename, + "r", "wb0") + + self.checkEcho(input_filename, + reference_filename, + output_filename, + "r", "wbu") + + def testEmptyBAM(self): + samfile = pysam.Samfile(os.path.join(BAM_DATADIR, "empty.bam"), + "rb") + self.assertEqual(samfile.mapped, 0) + self.assertEqual(samfile.unmapped, 0) + self.assertEqual(samfile.nocoordinate, 0) + + def testEmptyWithHeaderBAM(self): + self.assertRaises( + ValueError, + pysam.Samfile, + os.path.join(BAM_DATADIR, "example_empty_with_header.bam"), + "rb") + + samfile = pysam.Samfile( + os.path.join(BAM_DATADIR, "example_empty_with_header.bam"), + "rb", + check_sq=False) + self.assertEqual(samfile.mapped, 0) + self.assertEqual(samfile.unmapped, 0) + self.assertEqual(samfile.nocoordinate, 0) + self.assertEqual([], list(samfile.fetch())) + + def testOpenFromFilename(self): + + samfile = pysam.AlignmentFile( + filename=os.path.join(BAM_DATADIR, "ex1.bam"), + mode="rb") + self.assertEqual(len(list(samfile.fetch())), 3270) + + def testBAMWithCSIIndex(self): + '''see issue 116''' + input_filename = os.path.join(BAM_DATADIR, "ex1_csi.bam") + samfile = pysam.AlignmentFile(input_filename, + "rb", + check_sq=False) + samfile.fetch('chr2') + + def test_fetch_by_tid(self): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), "rb") as samfile: + self.assertEqual(len(list(samfile.fetch('chr1'))), + len(list(samfile.fetch(tid=0)))) + self.assertEqual(len(list(samfile.fetch('chr2'))), + len(list(samfile.fetch(tid=1)))) + self.assertRaises( + IndexError, + samfile.fetch, + tid=2) + self.assertRaises( + IndexError, + samfile.fetch, + tid=-1) + self.assertEqual(len(list(samfile.fetch('chr1', start=1000, end=2000))), + len(list(samfile.fetch(tid=0, start=1000, end=2000)))) + + def test_write_bam_to_unknown_path_fails(self): + '''see issue 116''' + input_filename = os.path.join(BAM_DATADIR, "ex1.bam") + with pysam.AlignmentFile(input_filename) as inf: + self.assertRaises(IOError, + pysam.AlignmentFile, + "missing_directory/new_file.bam", + "wb", + template=inf) + + +class TestAutoDetect(unittest.TestCase): + + def testSAM(self): + """test SAM autodetection.""" + + with pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.sam")) as inf: + self.assertFalse(inf.is_bam) + self.assertFalse(inf.is_cram) + + self.assertRaises(ValueError, inf.fetch, 'chr1') + + def testBAM(self): + """test BAM autodetection.""" + + with pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.bam")) as inf: + self.assertTrue(inf.is_bam) + self.assertFalse(inf.is_cram) + self.assertEqual(len(list(inf.fetch('chr1'))), 1) + self.assertEqual(len(list(inf.fetch('chr2'))), 3) + + def testCRAM(self): + """test CRAM autodetection.""" + + with pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex3.cram")) as inf: + self.assertFalse(inf.is_bam) + self.assertTrue(inf.is_cram) + self.assertEqual(len(list(inf.fetch('chr1'))), 1) + self.assertEqual(len(list(inf.fetch('chr2'))), 3) + + +################################################## +# +# Random access iterator tests +# +################################################## +class TestIteratorRowBAM(unittest.TestCase): + + filename = os.path.join(BAM_DATADIR, "ex2.bam") + mode = "rb" + reference_filename = None + + def setUp(self): + self.samfile = pysam.AlignmentFile( + self.filename, + self.mode, + reference_filename=self.reference_filename, + ) + + def tearDown(self): + self.samfile.close() + + def checkRange(self, rnge): + '''compare results from iterator with those from samtools.''' + ps = list(self.samfile.fetch(region=rnge)) + sa = force_str( + pysam.samtools.view( + self.filename, + rnge, + raw=True)).splitlines(True) + self.assertEqual( + len(ps), len(sa), + "unequal number of results for range %s: %i != %i" % + (rnge, len(ps), len(sa))) + # check if the same reads are returned and in the same order + for line, (a, b) in enumerate(list(zip(ps, sa))): + d = b.split("\t") + self.assertEqual( + a.query_name, d[0], + "line %i: read id mismatch: %s != %s" % + (line, a.reference_id, d[0])) + self.assertEqual( + a.reference_start, + int(d[3]) - 1, + "line %i: read position mismatch: %s != %s, \n%s\n%s\n" % + (line, a.reference_start, int(d[3]) - 1, + str(a), str(d))) + qual = d[10] + self.assertEqual( + pysam.qualities_to_qualitystring(a.query_qualities), + qual, + "line %i: quality mismatch: %s != %s, \n%s\n%s\n" % + (line, pysam.qualities_to_qualitystring(a.query_qualities), qual, + str(a), str(d))) + + def testIteratePerContig(self): + '''check random access per contig''' + for contig in self.samfile.references: + self.checkRange(contig) + + def testIterateRanges(self): + '''check random access per range''' + for contig, length in zip(self.samfile.references, + self.samfile.lengths): + for start in range(1, length, 90): + # this includes empty ranges + self.checkRange("%s:%i-%i" % + (contig, start, start + 90)) + + +class TestIteratorRowAllBAM(unittest.TestCase): + + filename = os.path.join(BAM_DATADIR, "ex2.bam") + mode = "rb" + + def setUp(self): + self.samfile = pysam.AlignmentFile( + self.filename, + self.mode) + + def testIterate(self): + '''compare results from iterator with those from samtools.''' + ps = list(self.samfile.fetch()) + sa = pysam.samtools.view(self.filename, + raw=True).splitlines() + self.assertEqual( + len(ps), len(sa), + "unequal number of results: %i != %i" % + (len(ps), len(sa))) + # check if the same reads are returned + for line, pair in enumerate(list(zip(ps, sa))): + data = force_str(pair[1]).split("\t") + self.assertEqual( + pair[0].query_name, + data[0], + "read id mismatch in line %i: %s != %s" % + (line, pair[0].reference_id, data[0])) + + def tearDown(self): + self.samfile.close() + + +class TestIteratorRowCRAM(TestIteratorRowBAM): + filename = os.path.join(BAM_DATADIR, "ex2.cram") + mode = "rc" + + +class TestIteratorRowCRAMWithReferenceFilename(TestIteratorRowCRAM): + reference_filename = os.path.join(BAM_DATADIR, "ex1.fa") + + +# needs to be implemented +# class TestAlignedSegmentFromSamWithoutHeader(TestAlignedSegmentFromBam): +# +# def setUp(self): +# self.samfile=pysam.AlignmentFile( "ex7.sam","r" ) +# self.reads=list(self.samfile.fetch()) + + +class TestFloatTagBug(unittest.TestCase): + + '''see issue 71''' + + def testFloatTagBug(self): + '''a float tag before another exposed a parsing bug in bam_aux_get. + + Fixed in 0.1.19 + ''' + samfile = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "tag_bug.bam")) + read = next(samfile.fetch(until_eof=True)) + self.assertTrue(('XC', 1) in read.tags) + self.assertEqual(read.opt('XC'), 1) + + +class TestLargeFieldBug(unittest.TestCase): + + '''see issue 100''' + + def testLargeFileBug(self): + '''when creating a read with a large entry in the tag field + causes an error: + NotImplementedError: tags field too large + ''' + samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "issue100.bam")) + read = next(samfile.fetch(until_eof=True)) + new_read = pysam.AlignedSegment() + new_read.tags = read.tags + self.assertEqual(new_read.tags, read.tags) + + +class TestClipping(unittest.TestCase): + + def testClipping(self): + + self.samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "softclip.bam"), + "rb") + + for read in self.samfile: + + if read.query_name == "r001": + self.assertEqual(read.query_sequence, 'AAAAGATAAGGATA') + self.assertEqual(read.query_alignment_sequence, 'AGATAAGGATA') + self.assertEqual(pysam.qualities_to_qualitystring(read.query_qualities), + None) + self.assertEqual( + pysam.qualities_to_qualitystring( + read.query_alignment_qualities), + None) + + elif read.query_name == "r002": + + self.assertEqual(read.query_sequence, 'GCCTAAGCTAA') + self.assertEqual(read.query_alignment_sequence, 'AGCTAA') + self.assertEqual( + pysam.qualities_to_qualitystring(read.query_qualities), + '01234567890') + self.assertEqual( + pysam.qualities_to_qualitystring( + read.query_alignment_qualities), + '567890') + + elif read.query_name == "r003": + + self.assertEqual(read.query_sequence, 'GCCTAAGCTAA') + self.assertEqual(read.query_alignment_sequence, 'GCCTAA') + self.assertEqual( + pysam.qualities_to_qualitystring(read.query_qualities), + '01234567890') + self.assertEqual( + pysam.qualities_to_qualitystring( + read.query_alignment_qualities), + '012345') + + elif read.query_name == "r004": + + self.assertEqual(read.query_sequence, 'TAGGC') + self.assertEqual(read.query_alignment_sequence, 'TAGGC') + self.assertEqual( + pysam.qualities_to_qualitystring(read.query_qualities), + '01234') + self.assertEqual( + pysam.qualities_to_qualitystring( + read.query_alignment_qualities), + '01234') + + +class TestUnmappedReadsRetrieval(unittest.TestCase): + + def test_fetch_from_sam_with_until_eof_reads_unmapped_reads(self): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex5.sam"), + "rb") as samfile: + self.assertEqual(len(list(samfile.fetch(until_eof=True))), 2) + + def test_fetch_from_bam_with_until_eof_reads_unmapped_reads(self): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex5.bam"), + "rb") as samfile: + self.assertEqual(len(list(samfile.fetch(until_eof=True))), 2) + + def test_fetch_with_asterisk_only_returns_unmapped_reads(self): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "test_mapped_unmapped.bam"), + "rb") as samfile: + self.assertEqual(len(list(samfile.fetch(region="*"))), 4) + + def test_fetch_with_asterisk_only_returns_unmapped_reads_by_contig(self): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "test_mapped_unmapped.bam"), + "rb") as samfile: + self.assertEqual(len(list(samfile.fetch(contig="*"))), 4) + + +class TestContextManager(unittest.TestCase): + + def testManager(self): + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, 'ex1.bam'), + 'rb') as samfile: + samfile.fetch() + self.assertEqual(samfile.closed, True) + + +class TestMultiThread(unittest.TestCase): + + def testSingleThreadEqualsMultithread(self): + input_bam = os.path.join(BAM_DATADIR, 'ex1.bam') + single_thread_out = get_temp_filename("tmp_single.bam") + multi_thread_out = get_temp_filename("tmp_multi.bam") + with pysam.AlignmentFile(input_bam, + 'rb') as samfile: + reads = [r for r in samfile] + with pysam.AlignmentFile(single_thread_out, + mode='wb', + template=samfile, + threads=1) as single_out: + [single_out.write(r) for r in reads] + with pysam.AlignmentFile(multi_thread_out, + mode='wb', + template=samfile, + threads=2) as multi_out: + [single_out.write(r) for r in reads] + with pysam.AlignmentFile(input_bam) as inp, \ + pysam.AlignmentFile(single_thread_out) as single, \ + pysam.AlignmentFile(multi_thread_out) as multi: + for r1, r2, r3 in zip(inp, single, multi): + assert r1.to_string == r2.to_string == r3.to_string + + def TestNoMultiThreadingWithIgnoreTruncation(self): + self.assertRaises( + ValueError, pysam.AlignmentFile(os.path.join(BAM_DATADIR, 'ex1.bam'), + threads=2, + ignore_truncation=True) + ) + + +class TestExceptions(unittest.TestCase): + + def setUp(self): + self.samfile = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") + + def testMissingFile(self): + + self.assertRaises( + IOError, pysam.AlignmentFile, "exdoesntexist.bam", "rb") + self.assertRaises( + IOError, pysam.AlignmentFile, "exdoesntexist.sam", "r") + self.assertRaises( + IOError, pysam.AlignmentFile, "exdoesntexist.bam", "r") + self.assertRaises( + IOError, pysam.AlignmentFile, "exdoesntexist.sam", "rb") + + def testBadContig(self): + self.assertRaises(ValueError, self.samfile.fetch, "chr88") + + def testMeaninglessCrap(self): + self.assertRaises(ValueError, self.samfile.fetch, "skljf") + + def testBackwardsOrderNewFormat(self): + self.assertRaises(ValueError, self.samfile.fetch, 'chr1', 100, 10) + + def testBackwardsOrderOldFormat(self): + self.assertRaises(ValueError, self.samfile.fetch, region="chr1:100-10") + + def testOutOfRangeNegativeNewFormat(self): + self.assertRaises(ValueError, self.samfile.fetch, "chr1", 5, -10) + self.assertRaises(ValueError, self.samfile.fetch, "chr1", 5, 0) + self.assertRaises(ValueError, self.samfile.fetch, "chr1", -5, -10) + + self.assertRaises(ValueError, self.samfile.count, "chr1", 5, -10) + self.assertRaises(ValueError, self.samfile.count, "chr1", 5, 0) + self.assertRaises(ValueError, self.samfile.count, "chr1", -5, -10) + + def testOutOfRangeNegativeOldFormat(self): + self.assertRaises(ValueError, self.samfile.fetch, region="chr1:-5-10") + self.assertRaises(ValueError, self.samfile.fetch, region="chr1:-5-0") + self.assertRaises(ValueError, self.samfile.fetch, region="chr1:-5--10") + + self.assertRaises(ValueError, self.samfile.count, region="chr1:-5-10") + self.assertRaises(ValueError, self.samfile.count, region="chr1:-5-0") + self.assertRaises(ValueError, self.samfile.count, region="chr1:-5--10") + + def testOutOfRangNewFormat(self): + self.assertRaises( + ValueError, self.samfile.fetch, "chr1", 9999999999, 99999999999) + self.assertRaises( + ValueError, self.samfile.count, "chr1", 9999999999, 99999999999) + + def testOutOfRangeLargeNewFormat(self): + self.assertRaises(ValueError, self.samfile.fetch, "chr1", + 9999999999999999999999999999999, 9999999999999999999999999999999999999999) + self.assertRaises(ValueError, self.samfile.count, "chr1", + 9999999999999999999999999999999, 9999999999999999999999999999999999999999) + + def testOutOfRangeLargeOldFormat(self): + self.assertRaises( + ValueError, self.samfile.fetch, "chr1:99999999999999999-999999999999999999") + self.assertRaises( + ValueError, self.samfile.count, "chr1:99999999999999999-999999999999999999") + + def testZeroToZero(self): + '''see issue 44''' + self.assertEqual(len(list(self.samfile.fetch('chr1', 0, 0))), 0) + + def tearDown(self): + self.samfile.close() + + +class TestWrongFormat(unittest.TestCase): + + '''test cases for opening files not in bam/sam format.''' + + def testOpenSamAsBam(self): + self.assertRaises(ValueError, + pysam.AlignmentFile, + os.path.join(BAM_DATADIR, 'ex1.sam'), + 'rb') + + def testOpenBamAsSam(self): + # test fails, needs to be implemented. + # sam.fetch() fails on reading, not on opening + # self.assertRaises(ValueError, pysam.AlignmentFile, + # os.path.join(BAM_DATADIR, 'ex1.bam'), + # 'r') + pass + + def testOpenFastaAsSam(self): + # test fails, needs to be implemented. + # sam.fetch() fails on reading, not on opening + # self.assertRaises( ValueError, pysam.AlignmentFile, 'ex1.fa', 'r' ) + pass + + def testOpenFastaAsBam(self): + self.assertRaises(ValueError, + pysam.AlignmentFile, + os.path.join(BAM_DATADIR, 'ex1.fa'), + 'rb') + + +class TestRegionParsing(unittest.TestCase): + + def test_dash_in_chr(self): + with pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "example_dash_in_chr.bam")) as inf: + self.assertEqual(len(list(inf.fetch(contig="chr-1"))), 1) + self.assertEqual(len(list(inf.fetch(contig="chr2"))), 1) + self.assertEqual(len(list(inf.fetch(region="chr-1"))), 1) + self.assertEqual(len(list(inf.fetch(region="chr2"))), 1) + + +class TestDeNovoConstruction(unittest.TestCase): + + '''check BAM/SAM file construction using ex6.sam + + (note these are +1 coordinates): + + read_28833_29006_6945 99 chr1 33 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 RG:Z:L1 + read_28701_28881_323b 147 chr2 88 30 35M = 500 412 ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA <<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<< MF:i:18 RG:Z:L2 + ''' # noqa + + header = {'HD': {'VN': '1.0'}, + 'SQ': [{'LN': 1575, 'SN': 'chr1'}, + {'LN': 1584, 'SN': 'chr2'}], } + + bamfile = os.path.join(BAM_DATADIR, "ex6.bam") + samfile = os.path.join(BAM_DATADIR, "ex6.sam") + + def setUp(self): + + header = pysam.AlignmentHeader.from_dict(self.header) + + a = pysam.AlignedSegment(header) + a.query_name = "read_28833_29006_6945" + a.query_sequence = "AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG" + a.flag = 99 + a.reference_id = 0 + a.reference_start = 32 + a.mapping_quality = 20 + a.cigartuples = ((0, 10), (2, 1), (0, 25)) + a.next_reference_id = 0 + a.next_reference_start = 199 + a.template_length = 167 + a.query_qualities = pysam.qualitystring_to_array( + "<<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<<") + a.tags = (("NM", 1), + ("RG", "L1")) + + b = pysam.AlignedSegment(header) + b.query_name = "read_28701_28881_323b" + b.query_sequence = "ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA" + b.flag = 147 + b.reference_id = 1 + b.reference_start = 87 + b.mapping_quality = 30 + b.cigartuples = ((0, 35), ) + b.next_reference_id = 1 + b.next_reference_start = 499 + b.template_length = 412 + b.query_qualities = pysam.qualitystring_to_array( + "<<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<<") + b.tags = (("MF", 18), + ("RG", "L2")) + + self.reads = (a, b) + + # TODO + # def testSAMWholeFile(self): + + # tmpfilename = "tmp_%i.sam" % id(self) + + # outfile = pysam.AlignmentFile(tmpfilename, + # "wh", + # header=self.header) + + # for x in self.reads: + # outfile.write(x) + # outfile.close() + # self.assertTrue(checkBinaryEqual(tmpfilename, self.samfile), + # "mismatch when construction SAM file, see %s %s" % (tmpfilename, self.samfile)) + + # os.unlink(tmpfilename) + + def test_pass_if_reads_binary_equal(self): + '''check if individual reads are binary equal.''' + infile = pysam.AlignmentFile(self.bamfile, "rb") + + references = list(infile) + for denovo, reference in zip(references, self.reads): + checkFieldEqual(self, reference, denovo) + self.assertEqual(reference.compare(denovo), 0) + + # TODO + # def testSAMPerRead(self): + # '''check if individual reads are binary equal.''' + # infile = pysam.AlignmentFile(self.samfile, "r") + + # others = list(infile) + # for denovo, other in zip(others, self.reads): + # checkFieldEqual(self, other, denovo) + # self.assertEqual(other.compare(denovo), 0) + + def testBAMWholeFile(self): + + tmpfilename = "tmp_%i.bam" % id(self) + + outfile = pysam.AlignmentFile(tmpfilename, "wb", header=self.header) + + for x in self.reads: + outfile.write(x) + outfile.close() + + self.assertTrue( + checkGZBinaryEqual(tmpfilename, self.bamfile), + "mismatch when construction BAM file, see %s %s" % + (tmpfilename, self.bamfile)) + + os.unlink(tmpfilename) + + +class TestEmptyHeader(unittest.TestCase): + '''see issue 84.''' + + def testEmptyHeader(self): + s = pysam.AlignmentFile(os.path.join(BAM_DATADIR, + 'example_empty_header.bam')) + self.assertEqual(s.header.to_dict(), {'SQ': [{'LN': 1000, 'SN': 'chr1'}]}) + + def test_bam_without_seq_in_header(self): + s = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "0example_no_seq_in_header.bam")) + self.assertTrue("SQ" in s.header.to_dict()) + self.assertTrue("@SQ" in str(s.header)) + + def test_bam_without_seq_with_null_bytes_in_header(self): + s = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "0example_no_seq_in_header_null_bytes.bam")) + self.assertTrue("SQ" in s.header.to_dict()) + self.assertTrue("@SQ" in str(s.header)) + + +class TestMismatchingHeader(unittest.TestCase): + '''see issue 716.''' + + def testMismatchingHeader(self): + # Note: no chr2 + header = { + 'SQ': [{'SN': 'chr1', 'LN': 1575}], + 'PG': [{'ID': 'bwa', 'PN': 'bwa', 'VN': '0.7.15', 'CL': 'bwa mem xx -'}], + } + + dest = get_temp_filename("tmp_ex3.bam") + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, 'ex3.bam')) as inf: + with pysam.AlignmentFile(dest, mode="wb", header=header) as outf: + for read in inf: + if read.reference_name == "chr1": + outf.write(read) + else: + self.assertRaises(ValueError, + outf.write, + read) + os.unlink(dest) + + +class TestHeaderWithProgramOptions(unittest.TestCase): + + '''see issue 39.''' + + def testHeader(self): + s = pysam.AlignmentFile(os.path.join(BAM_DATADIR, + 'rg_with_tab.bam')) + self.assertEqual( + s.header.to_dict(), + {'SQ': [{'LN': 1575, 'SN': 'chr1'}, + {'LN': 1584, 'SN': 'chr2'}], + 'PG': [{'PN': 'bwa', + 'ID': 'bwa', + 'VN': '0.7.9a-r786', + 'CL': 'bwa mem -p -t 8 -M -R ' + '@RG ID:None SM:None /mnt/data/hg19.fa ' + '/mnt/analysis/default-0.fastq'}]}) + + +class TestTruncatedBAM(unittest.TestCase): + + '''see pull request 50.''' + + def testTruncatedBam2(self): + self.assertRaises(IOError, + pysam.AlignmentFile, + os.path.join(BAM_DATADIR, 'ex2_truncated.bam')) + + @pytest.mark.filterwarnings('ignore:no BGZF EOF marker') + def testTruncatedBamIterator(self): + s = pysam.AlignmentFile(os.path.join(BAM_DATADIR, 'ex2_truncated.bam'), + ignore_truncation=True) + + def iterall(x): + return len([a for a in x]) + self.assertRaises(IOError, iterall, s) + + # Ignore closing errors, as s is now in an error state + try: + s.close() + except IOError: + pass + + +class TestCorruptBAM(unittest.TestCase): + """See pull request 1035.""" + + def testCorruptBamIterator(self): + s = pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex2_corrupt.bam")) + + def iterall(x): + return len([a for a in x]) + + self.assertRaises(IOError, iterall, s) + + +COMPARE_BTAG = [100, 1, 91, 0, 7, 101, 0, 201, 96, 204, + 0, 0, 87, 109, 0, 7, 97, 112, 1, 12, 78, + 197, 0, 7, 100, 95, 101, 202, 0, 6, 0, 1, + 186, 0, 84, 0, 244, 0, 0, 324, 0, 107, 195, + 101, 113, 0, 102, 0, 104, 3, 0, 101, 1, 0, + 212, 6, 0, 0, 1, 0, 74, 1, 11, 0, 196, 2, + 197, 103, 0, 108, 98, 2, 7, 0, 1, 2, 194, + 0, 180, 0, 108, 0, 203, 104, 16, 5, 205, + 0, 0, 0, 1, 1, 100, 98, 0, 0, 204, 6, 0, + 79, 0, 0, 101, 7, 109, 90, 265, 1, 27, 10, + 109, 102, 9, 0, 292, 0, 110, 0, 0, 102, + 112, 0, 0, 84, 100, 103, 2, 81, 126, 0, 2, + 90, 0, 15, 96, 15, 1, 0, 2, 0, 107, 92, 0, + 0, 101, 3, 98, 15, 102, 13, 116, 116, 90, 93, + 198, 0, 0, 0, 199, 92, 26, 495, 100, 5, 0, + 100, 5, 209, 0, 92, 107, 90, 0, 0, 0, 0, 109, + 194, 7, 94, 200, 0, 40, 197, 0, 11, 0, 0, 112, + 110, 6, 4, 200, 28, 0, 196, 0, 203, 1, 129, + 0, 0, 1, 0, 94, 0, 1, 0, 107, 5, 201, 3, 3, 100, + 0, 121, 0, 7, 0, 1, 105, 306, 3, 86, 8, 183, 0, + 12, 163, 17, 83, 22, 0, 0, 1, 8, 109, 103, 0, 0, + 295, 0, 200, 16, 172, 3, 16, 182, 3, 11, 0, 0, + 223, 111, 103, 0, 5, 225, 0, 95] + + +class TestBTagSam(unittest.TestCase): + + '''see issue 81.''' + + compare = [COMPARE_BTAG, + [-100, 200, -300, -400], + [-100, 12], + [12, 15], + [-1.0, 5.0, 2.5]] + + filename = os.path.join(BAM_DATADIR, 'example_btag.sam') + + read0 = [('RG', 'QW85I'), + ('PG', 'tmap'), + ('MD', '140'), + ('NM', 0), + ('AS', 140), + ('FZ', array.array('H', COMPARE_BTAG)), + ('XA', 'map2-1'), + ('XS', 53), + ('XT', 38), + ('XF', 1), + ('XE', 0)] + + def testReadTags(self): + + s = pysam.AlignmentFile(self.filename) + for x, read in enumerate(s): + tags = read.tags + if x == 0: + self.assertEqual(tags, self.read0) + + fz = list(dict(tags)["FZ"]) + self.assertEqual(fz, self.compare[x]) + self.assertEqual(list(read.opt("FZ")), self.compare[x]) + self.assertEqual(tags, read.get_tags()) + for tag, value in tags: + self.assertEqual(value, read.get_tag(tag)) + + def testReadWriteTags(self): + + s = pysam.AlignmentFile(self.filename) + for read in s: + before = read.tags + read.tags = before + self.assertEqual(read.tags, before) + + read.set_tags(before) + self.assertEqual(read.tags, before) + + for tag, value in before: + read.set_tag(tag, value) + self.assertEqual(value, read.get_tag(tag)) + + +class TestBTagBam(TestBTagSam): + filename = os.path.join(BAM_DATADIR, 'example_btag.bam') + + +class TestDoubleFetchBAM(unittest.TestCase): + '''check if two iterators on the same bamfile are independent.''' + + filename = os.path.join(BAM_DATADIR, 'ex1.bam') + mode = "rb" + + def testDoubleFetch(self): + + with pysam.AlignmentFile(self.filename, self.mode) as samfile1: + for a, b in zip(samfile1.fetch(multiple_iterators=True), + samfile1.fetch(multiple_iterators=True)): + self.assertEqual(a.compare(b), 0) + + def testDoubleFetchWithRegionTrueTrue(self): + + with pysam.AlignmentFile(self.filename, self.mode) as samfile1: + contig, start, stop = 'chr2', 200, 3000000 + # just making sure the test has something to catch + self.assertTrue(len(list(samfile1.fetch(contig, start, stop))) > 0) + + for a, b in zip(samfile1.fetch(contig, start, stop, + multiple_iterators=True), + samfile1.fetch(contig, start, stop, + multiple_iterators=True)): + self.assertEqual(a.compare(b), 0) + + def testDoubleFetchWithRegionFalseTrue(self): + with pysam.AlignmentFile(self.filename, self.mode) as samfile1: + contig, start, stop = 'chr2', 200, 3000000 + # just making sure the test has something to catch + self.assertTrue(len(list(samfile1.fetch(contig, start, stop))) > 0) + + for a, b in zip(samfile1.fetch(contig, start, stop, + multiple_iterators=False), + samfile1.fetch(contig, start, stop, + multiple_iterators=True)): + self.assertEqual(a.compare(b), 0) + + def testDoubleFetchWithRegionTrueFalse(self): + with pysam.AlignmentFile(self.filename, self.mode) as samfile1: + contig, start, stop = 'chr2', 200, 3000000 + # just making sure the test has something to catch + self.assertTrue(len(list(samfile1.fetch(contig, start, stop))) > 0) + + for a, b in zip(samfile1.fetch(contig, start, stop, + multiple_iterators=True), + samfile1.fetch(contig, start, stop, + multiple_iterators=False)): + self.assertEqual(a.compare(b), 0) + + def testDoubleFetchUntilEOF(self): + + with pysam.AlignmentFile(self.filename, self.mode) as samfile1: + + for a, b in zip(samfile1.fetch(until_eof=True), + samfile1.fetch(until_eof=True, + multiple_iterators=True)): + self.assertEqual(a.compare(b), 0) + + +class TestDoubleFetchCRAM(TestDoubleFetchBAM): + filename = os.path.join(BAM_DATADIR, 'ex2.cram') + mode = "rc" + + +class TestDoubleFetchCRAMWithReference(TestDoubleFetchBAM): + filename = os.path.join(BAM_DATADIR, 'ex2.cram') + mode = "rc" + reference_filename = os.path.join(BAM_DATADIR, 'ex1.fa') + + +class TestRemoteFileFTP(unittest.TestCase): + + '''test remote access. + + ''' + + # Need to find an ftp server without password on standard + # port. + + url = "ftp://ftp.sanger.ac.uk/pub/rd/humanSequences/CV.bam" + region = "1:1-1000" + + def testFTPView(self): + return + if not check_url(self.url): + return + + result = pysam.samtools.view(self.url, self.region) + self.assertEqual(len(result), 36) + + def testFTPFetch(self): + return + if not check_url(self.url): + return + + samfile = pysam.AlignmentFile(self.url, "rb") + result = list(samfile.fetch(region=self.region)) + self.assertEqual(len(result), 36) + + +class TestRemoteFileHTTP(unittest.TestCase): + + url = "http://genserv.anat.ox.ac.uk/downloads/pysam/test/ex1.bam" + region = "chr1:1-1000" + local = os.path.join(BAM_DATADIR, "ex1.bam") + + def testView(self): + if not check_url(self.url): + return + + samfile_local = pysam.AlignmentFile(self.local, "rb") + ref = list(samfile_local.fetch(region=self.region)) + + result = pysam.samtools.view(self.url, self.region) + self.assertEqual(len(result.splitlines()), len(ref)) + + def testFetch(self): + if not check_url(self.url): + return + + with pysam.AlignmentFile(self.url, "rb") as samfile: + result = list(samfile.fetch(region=self.region)) + + with pysam.AlignmentFile(self.local, "rb") as samfile_local: + ref = list(samfile_local.fetch(region=self.region)) + + self.assertEqual(len(ref), len(result)) + for x, y in zip(result, ref): + self.assertEqual(x.compare(y), 0) + + def testFetchAll(self): + if not check_url(self.url): + return + + with pysam.AlignmentFile(self.url, "rb") as samfile: + result = list(samfile.fetch()) + + with pysam.AlignmentFile(self.local, "rb") as samfile_local: + ref = list(samfile_local.fetch()) + + self.assertEqual(len(ref), len(result)) + for x, y in zip(result, ref): + self.assertEqual(x.compare(y), 0) + + +class TestLargeOptValues(unittest.TestCase): + + ints = (65536, 214748, 2147484, 2147483647) + floats = (65536.0, 214748.0, 2147484.0) + + def check(self, samfile): + + i = samfile.fetch() + for exp in self.ints: + rr = next(i) + obs = rr.opt("ZP") + self.assertEqual(exp, obs, + "expected %s, got %s\n%s" % + (str(exp), str(obs), str(rr))) + + for exp in [-x for x in self.ints]: + rr = next(i) + obs = rr.opt("ZP") + self.assertEqual(exp, obs, + "expected %s, got %s\n%s" % + (str(exp), str(obs), str(rr))) + + for exp in self.floats: + rr = next(i) + obs = rr.opt("ZP") + self.assertEqual(exp, obs, + "expected %s, got %s\n%s" % + (str(exp), str(obs), str(rr))) + + for exp in [-x for x in self.floats]: + rr = next(i) + obs = rr.opt("ZP") + self.assertEqual(exp, obs, "expected %s, got %s\n%s" % + (str(exp), str(obs), str(rr))) + + def testSAM(self): + samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex10.sam"), + "r") + self.check(samfile) + + def testBAM(self): + samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex10.bam"), + "rb") + self.check(samfile) + + +class TestCountCoverage(unittest.TestCase): + + samfilename = os.path.join(BAM_DATADIR, "ex1.bam") + fastafilename = os.path.join(BAM_DATADIR, "ex1.fa") + + def setUp(self): + + self.fastafile = pysam.Fastafile(self.fastafilename) + self.tmpfilename = get_temp_filename(".bam") + + with pysam.AlignmentFile(self.samfilename) as inf: + with pysam.AlignmentFile( + self.tmpfilename, + 'wb', + template=inf) as outf: + for ii, read in enumerate(inf.fetch()): + # if ii % 2 == 0: # setting BFUNMAP makes no sense... + #read.flag = read.flag | 0x4 + if ii % 3 == 0: + read.flag = read.flag | 0x100 + if ii % 5 == 0: + read.flag = read.flag | 0x200 + if ii % 7 == 0: + read.flag = read.flag | 0x400 + outf.write(read) + pysam.samtools.index(self.tmpfilename) + + def tearDown(self): + self.fastafile.close() + os.unlink(self.tmpfilename) + os.unlink(self.tmpfilename + ".bai") + + def count_coverage_python(self, + bam, chrom, start, stop, + read_callback, + quality_threshold=15): + stop = min(stop, bam.get_reference_length(chrom)) + l = stop - start + count_a = array.array('L', [0] * l) + count_c = array.array('L', [0] * l) + count_g = array.array('L', [0] * l) + count_t = array.array('L', [0] * l) + for p in bam.pileup(chrom, start, stop, + truncate=True, + stepper='nofilter', + min_base_quality=quality_threshold, + ignore_overlaps=False): + rpos = p.reference_pos - start + for read in p.pileups: + if not read.is_del and not read.is_refskip and \ + read_callback(read.alignment): + try: + if read.alignment.query_qualities[read.query_position] \ + >= quality_threshold: + letter = read.alignment.query[read.query_position] + if letter == 'A': + count_a[rpos] += 1 + elif letter == 'C': + count_c[rpos] += 1 + elif letter == 'G': + count_g[rpos] += 1 + elif letter == 'T': + count_t[rpos] += 1 + except IndexError: + pass + return count_a, count_c, count_g, count_t + + def test_count_coverage_with_coordinates_works(self): + + with pysam.AlignmentFile(self.samfilename) as inf: + c = inf.count_coverage("chr1") + self.assertEqual(len(c[0]), inf.get_reference_length("chr1")) + self.assertEqual(len(c[0]), 1575) + + c = inf.count_coverage("chr1", 100) + self.assertEqual(len(c[0]), inf.get_reference_length("chr1") - 100) + + c = inf.count_coverage("chr1", 100, 200) + self.assertEqual(len(c[0]), 200 - 100) + + c = inf.count_coverage("chr1", None, 200) + self.assertEqual(len(c[0]), 200) + + c = inf.count_coverage("chr1", None, inf.get_reference_length("chr1") + 10000) + self.assertEqual(len(c[0]), inf.get_reference_length("chr1")) + + def test_count_coverage_without_coordinates_fails(self): + with pysam.AlignmentFile(self.samfilename) as inf: + self.assertRaises(TypeError, inf.count_coverage) + + def test_count_coverage_wrong_coordinates_fails(self): + with pysam.AlignmentFile(self.samfilename) as inf: + self.assertRaises(ValueError, inf.count_coverage, "chr1", 200, 100) + self.assertRaises(KeyError, inf.count_coverage, "chrUnknown", 100, 200) + + def test_counting_the_same_region_works(self): + + with pysam.AlignmentFile(self.samfilename) as inf: + c1 = inf.count_coverage("chr1") + c2 = inf.count_coverage("chr1") + self.assertEqual(c1, c2) + + def test_count_coverage_counts_as_expected(self): + chrom = 'chr1' + start = 0 + stop = 1000 + + with pysam.AlignmentFile(self.samfilename) as inf: + manual_counts = self.count_coverage_python( + inf, chrom, start, stop, + lambda read: True, + quality_threshold=0) + + fast_counts = inf.count_coverage( + chrom, start, stop, + read_callback=lambda read: True, + quality_threshold=0) + + self.assertEqual(list(fast_counts[0]), list(manual_counts[0])) + self.assertEqual(list(fast_counts[1]), list(manual_counts[1])) + self.assertEqual(list(fast_counts[2]), list(manual_counts[2])) + self.assertEqual(list(fast_counts[3]), list(manual_counts[3])) + + def test_count_coverage_quality_filter(self): + chrom = 'chr1' + start = 0 + stop = 1000 + with pysam.AlignmentFile(self.samfilename) as inf: + manual_counts = self.count_coverage_python( + inf, chrom, start, stop, + lambda read: True, + quality_threshold=0) + fast_counts = inf.count_coverage( + chrom, start, stop, + read_callback=lambda read: True, + quality_threshold=15) + + # we filtered harder, should be less + for i in range(4): + for r in range(start, stop): + self.assertTrue(fast_counts[i][r] <= manual_counts[i][r]) + + def test_count_coverage_read_callback(self): + chrom = 'chr1' + start = 0 + stop = 1000 + with pysam.AlignmentFile(self.samfilename) as inf: + manual_counts = self.count_coverage_python( + inf, chrom, start, stop, + lambda read: read.flag & 0x10, + quality_threshold=0) + fast_counts = inf.count_coverage( + chrom, start, stop, + read_callback=lambda read: True, + quality_threshold=0) + + for i in range(4): + for r in range(start, stop): + self.assertTrue(fast_counts[i][r] >= manual_counts[i][r]) + + fast_counts = inf.count_coverage( + chrom, start, stop, + read_callback=lambda read: read.flag & 0x10, + quality_threshold=0) + + self.assertEqual(fast_counts[0], manual_counts[0]) + self.assertEqual(fast_counts[1], manual_counts[1]) + self.assertEqual(fast_counts[2], manual_counts[2]) + self.assertEqual(fast_counts[3], manual_counts[3]) + + def test_count_coverage_read_all(self): + + chrom = 'chr1' + start = 0 + stop = 1000 + + def filter(read): + return not (read.flag & (0x4 | 0x100 | 0x200 | 0x400)) + + with pysam.AlignmentFile(self.tmpfilename) as samfile: + fast_counts = samfile.count_coverage( + chrom, start, stop, + read_callback='all', + # read_callback = lambda read: ~(read.flag & (0x4 | 0x100 | 0x200 | 0x400)), + quality_threshold=0) + manual_counts = samfile.count_coverage( + chrom, start, stop, + read_callback=lambda read: not( + read.flag & (0x4 | 0x100 | 0x200 | 0x400)), + quality_threshold=0) + + self.assertEqual(fast_counts[0], manual_counts[0]) + self.assertEqual(fast_counts[1], manual_counts[1]) + self.assertEqual(fast_counts[2], manual_counts[2]) + self.assertEqual(fast_counts[3], manual_counts[3]) + + def test_count_coverage_nofilter(self): + + with pysam.AlignmentFile(self.samfilename) as inf: + with pysam.AlignmentFile( + self.tmpfilename, 'wb', template=inf) as outf: + + for ii, read in enumerate(inf.fetch()): + # if ii % 2 == 0: # setting BFUNMAP makes no sense... + # read.flag = read.flag | 0x4 + if ii % 3 == 0: + read.flag = read.flag | 0x100 + if ii % 5 == 0: + read.flag = read.flag | 0x200 + if ii % 7 == 0: + read.flag = read.flag | 0x400 + outf.write(read) + + pysam.samtools.index(self.tmpfilename) + chr = 'chr1' + start = 0 + stop = 1000 + + with pysam.AlignmentFile(self.tmpfilename) as inf: + fast_counts = inf.count_coverage(chr, start, stop, + read_callback='nofilter', + quality_threshold=0) + + manual_counts = self.count_coverage_python(inf, chr, start, stop, + read_callback=lambda x: True, + quality_threshold=0) + + self.assertEqual(fast_counts[0], manual_counts[0]) + self.assertEqual(fast_counts[1], manual_counts[1]) + self.assertEqual(fast_counts[2], manual_counts[2]) + self.assertEqual(fast_counts[3], manual_counts[3]) + + +class TestFindIntrons(unittest.TestCase): + samfilename = os.path.join(BAM_DATADIR, "ex_spliced.bam") + + def setUp(self): + self.samfile = pysam.AlignmentFile(self.samfilename) + + def tearDown(self): + self.samfile.close() + + def test_total(self): + all_read_counts = self.samfile.count() + splice_sites = self.samfile.find_introns(self.samfile.fetch()) + # there is a single unspliced read in there + self.assertEqual(sum(splice_sites.values()), all_read_counts - 1) + + def test_first(self): + reads = list(self.samfile.fetch())[:10] + splice_sites = self.samfile.find_introns(reads) + starts = [14792 + 38 - 1] + stops = [14792 + 38 + 140 - 1] + self.assertEqual(len(splice_sites), 1) + self.assertTrue((starts[0], stops[0]) in splice_sites) + # first one is the unspliced read + self.assertEqual(splice_sites[(starts[0], stops[0])], 9) + + def test_all(self): + reads = list(self.samfile.fetch()) + splice_sites = self.samfile.find_introns(reads) + should = collections.Counter({ + (14829, 14969): 33, + (15038, 15795): 24, + (15947, 16606): 3, + (16765, 16857): 9, + (16765, 16875): 1, + (17055, 17232): 19, + (17055, 17605): 3, + (17055, 17914): 1, + (17368, 17605): 7, + }) + self.assertEqual(should, splice_sites) + + +class TestLogging(unittest.TestCase): + + '''test around bug issue 42, + + failed in versions < 0.4 + ''' + + def check(self, bamfile, log): + + if log: + logger = logging.getLogger('franklin') + logger.setLevel(logging.INFO) + formatter = logging.Formatter( + '%(asctime)s %(levelname)s %(message)s') + log_hand = logging.FileHandler('log.txt') + log_hand.setFormatter(formatter) + logger.addHandler(log_hand) + + with pysam.AlignmentFile(bamfile, 'rb') as bam: + cols = bam.pileup() + self.assertTrue(True) + + def tearDown(self): + if os.path.exists('log.txt'): + os.unlink('log.txt') + + def testFail1(self): + self.check(os.path.join(BAM_DATADIR, "ex9_fail.bam"), + False) + self.check(os.path.join(BAM_DATADIR, "ex9_fail.bam"), + True) + + def testNoFail1(self): + self.check(os.path.join(BAM_DATADIR, "ex9_nofail.bam"), + False) + self.check(os.path.join(BAM_DATADIR, "ex9_nofail.bam"), + True) + + def testNoFail2(self): + self.check(os.path.join(BAM_DATADIR, "ex9_nofail.bam"), + True) + self.check(os.path.join(BAM_DATADIR, "ex9_nofail.bam"), + True) + +# TODOS +# 1. finish testing all properties within pileup objects +# 2. check exceptions and bad input problems (missing files, optional fields that aren't present, etc...) +# 3. check: presence of sequence + + +class TestAlignmentFileUtilityFunctions(unittest.TestCase): + + def testCount(self): + + with pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") as samfile: + + for contig in ("chr1", "chr2"): + for start in range(0, 2000, 100): + end = start + 1 + self.assertEqual( + len(list(samfile.fetch(contig, start, end))), + samfile.count(contig, start, end), + 'number mismatch for %s:%i-%i %i != %i' % ( + contig, start, end, + len(list(samfile.fetch(contig, start, end))), + samfile.count(contig, start, end))) + + # test empty intervals + self.assertEqual( + len(list(samfile.fetch(contig, start, start))), + samfile.count(contig, start, start), + 'number mismatch for %s:%i-%i %i != %i' % ( + contig, start, start, + len(list(samfile.fetch(contig, start, start))), + samfile.count(contig, start, start))) + + # test half empty intervals + self.assertEqual(len(list(samfile.fetch(contig, start))), + samfile.count(contig, start)) + + self.assertEqual( + len(list(samfile.fetch(contig, start))), + samfile.count(contig, start), + 'number mismatch for %s:%i %i != %i' % ( + contig, start, + len(list(samfile.fetch(contig, start))), + samfile.count(contig, start))) + + def testMate(self): + '''test mate access.''' + + with open(os.path.join(BAM_DATADIR, "ex1.sam"), "rb") as inf: + readnames = [x.split(b"\t")[0] for x in inf.readlines()] + if sys.version_info[0] >= 3: + readnames = [name.decode('ascii') for name in readnames] + + counts = collections.defaultdict(int) + for x in readnames: + counts[x] += 1 + + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") as samfile: + + for read in samfile.fetch(): + if not read.is_paired: + self.assertRaises(ValueError, samfile.mate, read) + elif read.mate_is_unmapped: + self.assertRaises(ValueError, samfile.mate, read) + else: + if counts[read.query_name] == 1: + self.assertRaises(ValueError, samfile.mate, read) + else: + mate = samfile.mate(read) + self.assertEqual(read.query_name, mate.query_name) + self.assertEqual(read.is_read1, mate.is_read2) + self.assertEqual(read.is_read2, mate.is_read1) + self.assertEqual( + read.reference_start, mate.next_reference_start) + self.assertEqual( + read.next_reference_start, mate.reference_start) + + def testIndexStats(self): + '''test if total number of mapped/unmapped reads is correct.''' + + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") as samfile: + self.assertEqual(samfile.mapped, 3235) + self.assertEqual(samfile.unmapped, 35) + self.assertEqual(samfile.nocoordinate, 0) + + +class TestMappedUnmapped(unittest.TestCase): + filename = "test_mapped_unmapped.bam" + + def test_counts_of_mapped_and_unmapped_are_correct(self): + + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, + self.filename)) as inf: + unmapped_flag = 0 + unmapped_nopos = 0 + mapped_flag = 0 + for x in inf.fetch(until_eof=True): + if x.is_unmapped: + if x.reference_id < 0: + unmapped_nopos += 1 + else: + unmapped_flag += 1 + else: + mapped_flag += 1 + + self.assertEqual(inf.mapped, mapped_flag) + self.assertEqual(inf.unmapped, unmapped_flag + unmapped_nopos) + + inf.reset() + self.assertEqual(inf.count(), + inf.mapped + unmapped_flag) + + inf.reset() + self.assertEqual(inf.count(until_eof=True), + inf.mapped + unmapped_flag + unmapped_nopos) + + inf.reset() + self.assertEqual(inf.count(read_callback="all"), + inf.mapped) + + inf.reset() + self.assertEqual(inf.count(until_eof=True, read_callback="all"), + inf.mapped) + + def test_counts_of_mapped_and_unmapped_are_correct_per_chromosome(self): + + with pysam.AlignmentFile(os.path.join(BAM_DATADIR, + self.filename)) as inf: + + counts = inf.get_index_statistics() + + counts_contigs = [x.contig for x in counts] + self.assertEqual(sorted(counts_contigs), + sorted(inf.references)) + + for contig in inf.references: + unmapped_flag = 0 + unmapped_nopos = 0 + mapped_flag = 0 + for x in inf.fetch(contig=contig): + if x.is_unmapped: + unmapped_flag += 1 + else: + mapped_flag += 1 + + cc = [c for c in counts if c.contig == contig][0] + self.assertEqual(cc.mapped, mapped_flag) + self.assertEqual(cc.unmapped, unmapped_flag) + self.assertEqual(cc.total, mapped_flag + unmapped_flag) + + +class TestSamtoolsProxy(unittest.TestCase): + + '''tests for sanity checking access to samtools functions.''' + + def testIndex(self): + self.assertRaises(IOError, pysam.samtools.index, "missing_file") + + def testView(self): + # note that view still echos "open: No such file or directory" + self.assertRaises(pysam.SamtoolsError, + pysam.samtools.view, + "missing_file") + + def testSort(self): + self.assertRaises(pysam.SamtoolsError, + pysam.samtools.sort, + "missing_file") + + +class TestAlignmentFileIndex(unittest.TestCase): + + def testIndex(self): + samfile = pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "ex1.bam"), + "rb") + index = pysam.IndexedReads(samfile) + index.build() + reads = collections.defaultdict(int) + + for read in samfile: + reads[read.query_name] += 1 + + for qname, counts in reads.items(): + found = list(index.find(qname)) + self.assertEqual(len(found), counts) + for x in found: + self.assertEqual(x.query_name, qname) + + +class TestExplicitIndex(unittest.TestCase): + + def testExplicitIndexBAM(self): + with pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "explicit_index.bam"), + "rb", + filepath_index=os.path.join(BAM_DATADIR, 'ex1.bam.bai')) as samfile: + samfile.fetch("chr1") + + def testExplicitIndexCRAM(self): + with pysam.AlignmentFile( + os.path.join(BAM_DATADIR, "explicit_index.cram"), + "rc", + filepath_index=os.path.join(BAM_DATADIR, 'ex1.cram.crai')) as samfile: + samfile.fetch("chr1") + + def testRemoteExplicitIndexBAM(self): + if not check_url( + "http://genserv.anat.ox.ac.uk/downloads/pysam/test/noindex.bam"): + return + + with pysam.AlignmentFile( + "http://genserv.anat.ox.ac.uk/downloads/pysam/test/noindex.bam", + "rb", + filepath_index=os.path.join(BAM_DATADIR, 'ex1.bam.bai')) as samfile: + samfile.fetch("chr1") + + +class TestVerbosity(unittest.TestCase): + + '''test if setting/getting of verbosity works.''' + + def testVerbosity(self): + self.assertEqual(pysam.get_verbosity(), 3) + old = pysam.set_verbosity(0) + self.assertEqual(pysam.get_verbosity(), 0) + new = pysam.set_verbosity(old) + self.assertEqual(new, 0) + self.assertEqual(pysam.get_verbosity(), 3) + + +class TestSanityCheckingBAM(unittest.TestCase): + + mode = "wb" + + def check_write(self, read): + + fn = "tmp_test_sanity_check.bam" + names = ["chr1"] + lengths = [10000] + with pysam.AlignmentFile( + fn, + self.mode, + reference_names=names, + reference_lengths=lengths) as outf: + outf.write(read) + + if os.path.exists(fn): + os.unlink(fn) + + def test_empty_read_gives_value_error(self): + read = pysam.AlignedSegment() + self.check_write(read) + + +class TestLargeCigar(unittest.TestCase): + + def setUp(self): + self.read_length = 70000 + self.header = pysam.AlignmentHeader.from_references( + ["chr1", "chr2"], + [self.read_length * 2, self.read_length * 2]) + + def build_read(self): + '''build an example read.''' + + a = pysam.AlignedSegment(self.header) + l = self.read_length + a.query_name = "read_12345" + a.query_sequence = "A" * (l + 1) + a.flag = 0 + a.reference_id = 0 + a.reference_start = 20 + a.mapping_quality = 20 + a.cigarstring = "1M1D" * l + "1M" + self.assertEqual(len(a.cigartuples), 2 * l + 1) + a.next_reference_id = 0 + a.next_reference_start = 0 + a.template_length = l + a.query_qualities = pysam.qualitystring_to_array("1") * (l + 1) + return a + + def check_read(self, read, mode="bam"): + fn = get_temp_filename("tmp_largecigar.{}".format(mode)) + fn_reference = get_temp_filename("tmp_largecigar.fa") + + nrows = int(self.read_length * 2 / 80) + + s = "\n".join(["A" * 80 for x in range(nrows)]) + with open(fn_reference, "w") as outf: + outf.write(">chr1\n{seq}\n>chr2\n{seq}\n".format( + seq=s)) + + if mode == "bam": + write_mode = "wb" + elif mode == "sam": + write_mode = "w" + elif mode == "cram": + write_mode = "wc" + + with pysam.AlignmentFile(fn, write_mode, + header=self.header, + reference_filename=fn_reference) as outf: + outf.write(read) + with pysam.AlignmentFile(fn) as inf: + ref_read = next(inf) + + if mode == "cram": + # in CRAM, the tag field is kept, while it is emptied by the BAM/SAM reader + self.assertEqual(read.cigarstring, ref_read.cigarstring) + else: + self.assertEqual(read, ref_read) + + os.unlink(fn) + os.unlink(fn_reference) + + def test_reading_writing_sam(self): + read = self.build_read() + self.check_read(read, mode="sam") + + def test_reading_writing_bam(self): + read = self.build_read() + self.check_read(read, mode="bam") + + @unittest.skip("fails on linux - https issue?") + def test_reading_writing_cram(self): + # The following test fails with htslib 1.9, but worked with previous versions. + # Error is: + # [W::find_file_url] Failed to open reference "https://www.ebi.ac.uk/ena/cram/md5/ac9fac7c3e9c476f74f1d0e47abc8be2": Input/output error + # Error can be reproduced using samtools 1.9 command line. + # Could be a conda configuration issue, see + # https://github.com/bioconda/bioconda-recipes/issues/9056 + return + read = self.build_read() + self.check_read(read, mode="cram") + +# SAM writing fails, as query length is 0 +# class TestSanityCheckingSAM(TestSanityCheckingSAM): +# mode = "w" + +if __name__ == "__main__": + print("starting tests") + unittest.main() + print("completed tests") diff --git a/tests/PileupTestUtils.py b/tests/PileupTestUtils.py new file mode 100644 index 0000000..33acc9e --- /dev/null +++ b/tests/PileupTestUtils.py @@ -0,0 +1,161 @@ +import os +import subprocess +import pysam + +from TestUtils import force_str + + +def build_pileup_with_samtoolsshell(fn): + os.system("samtools mpileup {} 2> /dev/null | wc -l > /dev/null".format(fn)) + return 2998 + + +def build_pileup_with_samtoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "mpileup", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + return len(proc.stdout.readlines()) + + +def build_pileup_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + return len(list(inf.pileup(stepper="samtools"))) + + +def build_depth_with_samtoolsshell(fn): + os.system( + "samtools mpileup {} 2> /dev/null | awk '{{a += $4}} END {{print a}}' > /dev/null".format(fn)) + return 107241 + + +def build_depth_with_samtoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "mpileup", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + data = [x.split() for x in proc.stdout.readlines()] + return [int(x[3]) for x in data] + + +def build_depth_with_filter_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + return [x.get_num_aligned() for x in inf.pileup(stepper="samtools")] + + +def build_depth_with_pysam(*args, **kwargs): + with pysam.AlignmentFile(*args, **kwargs) as inf: + return [x.nsegments for x in inf.pileup(stepper="samtools")] + + +def build_query_bases_with_samtoolsshell(fn): + os.system("samtools mpileup {} 2> /dev/null | awk '{{a = a $5}} END {{print a}}' | wc -c > /dev/null".format(fn)) + return 116308 + + +def build_query_bases_with_samtoolspipe(fn, *args, **kwargs): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "mpileup", fn] + list(args), + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + stdout = proc.stdout.read().decode() + return [x.split()[4] for x in stdout.splitlines()] + + +def build_query_bases_with_samtoolspysam(fn, *args): + return [x.split()[4] for x in pysam.samtools.mpileup(fn, *args).splitlines()] + + +def build_query_bases_with_pysam_pileups(*args, **kwargs): + total_pileup = [] + with pysam.AlignmentFile(*args, **kwargs) as inf: + total_pileup = [ + [r.alignment.query_sequence[r.query_position_or_next] + for r in column.pileups if r.query_position_or_next is not None] + for column in inf.pileup(stepper="samtools")] + return total_pileup + + +def build_query_qualities_with_pysam_pileups(*args, **kwargs): + total_pileup = [] + with pysam.AlignmentFile(*args, **kwargs) as inf: + total_pileup = [ + [r.alignment.query_qualities[r.query_position_or_next] + for r in column.pileups if r.query_position_or_next is not None] + for column in inf.pileup(stepper="samtools")] + return total_pileup + + +def build_query_bases_with_pysam(fn, *args, **kwargs): + total_pileup = [] + with pysam.AlignmentFile(fn) as inf: + total_pileup = [column.get_query_sequences( + mark_ends=True, add_indels=True, mark_matches=True) for column in + inf.pileup(*args, **kwargs)] + return total_pileup + + +def build_query_names_with_pysam(*args, **kwargs): + total_pileup = [] + with pysam.AlignmentFile(*args, **kwargs) as inf: + total_pileup = [column.get_query_names() for column in + inf.pileup(stepper="samtools")] + return total_pileup + + +def build_query_qualities_with_samtoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "mpileup", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + data = [force_str(x).split()[5] for x in proc.stdout.readlines()] + return data + + +def build_query_qualities_with_pysam(*args, **kwargs): + total_pileup = [] + with pysam.AlignmentFile(*args, **kwargs) as inf: + total_pileup = [column.get_query_qualities() for column in + inf.pileup(stepper="samtools")] + return total_pileup + + +def build_mapping_qualities_with_samtoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "mpileup", "-s", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + data = [force_str(x).split()[6] for x in proc.stdout.readlines()] + return data + + +def build_mapping_qualities_with_pysam(*args, **kwargs): + total_pileup = [] + with pysam.AlignmentFile(*args, **kwargs) as inf: + total_pileup = [column.get_mapping_qualities() for column in + inf.pileup(stepper="samtools")] + return total_pileup + + +def build_query_positions_with_samtoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen(["samtools", "mpileup", "-O", fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + data = [list(map(int, force_str(x).split()[6].split(","))) + for x in proc.stdout.readlines()] + return data + + +def build_query_positions_with_pysam(*args, **kwargs): + total_pileup = [] + with pysam.AlignmentFile(*args, **kwargs) as inf: + total_pileup = [column.get_query_positions() for column in + inf.pileup(stepper="samtools")] + return total_pileup diff --git a/tests/StreamFiledescriptors_test.py b/tests/StreamFiledescriptors_test.py new file mode 100644 index 0000000..07adea8 --- /dev/null +++ b/tests/StreamFiledescriptors_test.py @@ -0,0 +1,93 @@ +import os +import sys +import subprocess +import threading +import errno +import unittest +from pysam import AlignmentFile +from TestUtils import make_data_files, BAM_DATADIR + +IS_PYTHON2 = sys.version_info[0] == 2 + + +def setUpModule(): + make_data_files(BAM_DATADIR) + + +def alignmentfile_writer_thread(infile, outfile): + def _writer_thread(infile, outfile): + """read from infile and write to outfile""" + try: + i = 0 + for record in infile: + outfile.write(record) + i += 1 + except IOError as e: + if e.errno != errno.EPIPE: + pass + finally: + outfile.close() + + writer = threading.Thread(target=_writer_thread, args=(infile, outfile)) + writer.daemon = True + writer.start() + return writer + + +class StreamTest(unittest.TestCase): + + def stream_process(self, proc, in_stream, out_stream, writer): + + with AlignmentFile(proc.stdout) as infile: + read = 0 + for record in infile: + read += 1 + return 0, read + + @unittest.skipIf(IS_PYTHON2, "no context manager in py2") + def test_text_processing(self): + + with subprocess.Popen('head -n200', + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + shell=True) as proc: + + in_stream = AlignmentFile(os.path.join(BAM_DATADIR, 'ex1.bam')) + out_stream = AlignmentFile( + proc.stdin, 'wh', header=in_stream.header) + writer = alignmentfile_writer_thread(in_stream, + out_stream) + + written, read = self.stream_process(proc, + in_stream, + out_stream, + writer) + self.assertEqual(read, 198) + + @unittest.skip("test contains bug") + def test_samtools_processing(self): + + # The following test causes the suite to hang + # as the stream_processor raises: + # ValueError: file has no sequences defined (mode='r') - is it SAM/BAM format? + # The whole setup then hangs during exception handling. + with subprocess.Popen('samtools view -b -f 4', + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + shell=True) as proc: + + in_stream = AlignmentFile(os.path.join(BAM_DATADIR, 'ex1.bam')) + out_stream = AlignmentFile( + proc.stdin, 'wb', header=in_stream.header) + writer = alignmentfile_writer_thread(in_stream, + out_stream) + + written, read = self.stream_process(proc, + in_stream, + out_stream, + writer) + self.assertEqual(read, 35) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/TestUtils.py b/tests/TestUtils.py new file mode 100644 index 0000000..e5dee6c --- /dev/null +++ b/tests/TestUtils.py @@ -0,0 +1,294 @@ +import sys +import os +import glob +import gzip +import contextlib +import inspect +import subprocess +import tempfile +import pysam + +WORKDIR = os.path.abspath(os.path.join(os.path.dirname(__file__), + "pysam_test_work")) + +BAM_DATADIR = os.path.abspath(os.path.join(os.path.dirname(__file__), + "pysam_data")) + +TABIX_DATADIR = os.path.abspath(os.path.join(os.path.dirname(__file__), + "tabix_data")) + +CBCF_DATADIR = os.path.abspath(os.path.join(os.path.dirname(__file__), + "cbcf_data")) + +LINKDIR = os.path.abspath(os.path.join( + os.path.dirname(__file__), "..", "linker_tests")) + + +TESTS_TEMPDIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "tmp")) + + +IS_PYTHON3 = sys.version_info[0] >= 3 + + +if IS_PYTHON3: + from itertools import zip_longest + from urllib.request import urlopen +else: + from itertools import izip as zip_longest + from urllib2 import urlopen + + +if IS_PYTHON3: + def force_str(s): + try: + return s.decode('ascii') + except AttributeError: + return s + + def force_bytes(s): + try: + return s.encode('ascii') + except AttributeError: + return s +else: + def force_str(s): + return s + + def force_bytes(s): + return s + + +def openfile(fn): + if fn.endswith(".gz"): + try: + return gzip.open(fn, "rt", encoding="utf-8") + except TypeError: + return gzip.open(fn, "r") + else: + return open(fn) + + +def checkBinaryEqual(filename1, filename2): + '''return true if the two files are binary equal. + ''' + if os.path.getsize(filename1) != os.path.getsize(filename2): + return False + + infile1 = open(filename1, "rb") + infile2 = open(filename2, "rb") + + def chariter(infile): + while 1: + c = infile.read(1) + if c == b"": + break + yield c + + found = False + for c1, c2 in zip_longest(chariter(infile1), chariter(infile2)): + if c1 != c2: + break + else: + found = True + + infile1.close() + infile2.close() + return found + + +def checkGZBinaryEqual(filename1, filename2): + '''return true if the decompressed contents of the two files + are binary equal. + ''' + with gzip.open(filename1, "rb") as infile1: + d1 = infile1.read() + with gzip.open(filename2, "rb") as infile2: + d2 = infile2.read() + if d1 == d2: + return True + return False + + +def check_samtools_view_equal( + filename1, filename2, + without_header=False): + '''return true if the two files are equal in their + content through samtools view. + ''' + # strip MD and NM tags, as not preserved in CRAM files + args = ["-x", "MD", "-x", "NM"] + if not without_header: + args.append("-h") + + lines1 = pysam.samtools.view(*(args + [filename1])) + lines2 = pysam.samtools.view(*(args + [filename2])) + + if len(lines1) != len(lines2): + return False + + if lines1 != lines2: + # line by line comparison + # sort each line, as tags get rearranged between + # BAM/CRAM + for n, pair in enumerate(zip(lines1, lines2)): + l1, l2 = pair + l1 = sorted(l1[:-1].split("\t")) + l2 = sorted(l2[:-1].split("\t")) + if l1 != l2: + print("mismatch in line %i" % n) + print(l1) + print(l2) + return False + else: + return False + + return True + + +def check_url(url): + '''return True if URL is available. + + A URL might not be available if it is the wrong URL + or there is no connection to the URL. + ''' + try: + urlopen(url, timeout=1) + return True + except: + return False + + +def checkFieldEqual(cls, read1, read2, exclude=[]): + '''check if two reads are equal by comparing each field.''' + + # add the . for refactoring purposes. + for x in (".query_name", + ".query_sequence", + ".flag", + ".reference_id", + ".reference_start", + ".mapping_quality", + ".cigartuples", + ".next_reference_id", + ".next_reference_start", + ".template_length", + ".query_length", + ".query_qualities", + ".bin", + ".is_paired", ".is_proper_pair", + ".is_unmapped", ".is_mapped", + ".mate_is_unmapped", ".mate_is_mapped", + ".is_reverse", ".is_forward", + ".mate_is_reverse", ".mate_is_forward", + ".is_read1", ".is_read2", + ".is_secondary", ".is_qcfail", + ".is_duplicate"): + n = x[1:] + if n in exclude: + continue + cls.assertEqual(getattr(read1, n), getattr(read2, n), + "attribute mismatch for %s: %s != %s" % + (n, getattr(read1, n), getattr(read2, n))) + + +def check_lines_equal(cls, a, b, sort=False, filter_f=None, msg=None): + """check if contents of two files are equal comparing line-wise. + + sort: bool + sort contents of both files before comparing. + filter_f: + remover lines in both a and b where expression is True + """ + with openfile(a) as inf: + aa = inf.readlines() + with openfile(b) as inf: + bb = inf.readlines() + + if filter_f is not None: + aa = [x for x in aa if not filter_f(x)] + bb = [x for x in bb if not filter_f(x)] + + if sort: + cls.assertEqual(sorted(aa), sorted(bb), msg) + else: + cls.assertEqual(aa, bb, msg) + + +def get_temp_filename(suffix=""): + caller_name = inspect.getouterframes(inspect.currentframe(), 2)[1][3] + try: + os.makedirs(TESTS_TEMPDIR) + except OSError: + pass + + f = tempfile.NamedTemporaryFile( + prefix="pysamtests_tmp_{}_".format(caller_name), + suffix=suffix, + delete=False, + dir=TESTS_TEMPDIR) + + f.close() + return f.name + +@contextlib.contextmanager +def get_temp_context(suffix="", keep=False): + caller_name = inspect.getouterframes(inspect.currentframe(), 3)[1][3] + try: + os.makedirs(TESTS_TEMPDIR) + except OSError: + pass + + f = tempfile.NamedTemporaryFile( + prefix="pysamtests_tmp_{}_".format(caller_name), + suffix=suffix, + delete=False, + dir=TESTS_TEMPDIR) + + f.close() + yield f.name + + if not keep: + # clear up any indices as well + for f in glob.glob(f.name + "*"): + os.unlink(f) + + +def make_data_files(directory): + what = None + try: + if not os.path.exists(os.path.join(directory, "all.stamp")): + subprocess.check_output(["make", "-C", directory], stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as e: + what = "Making test data in '%s' failed:\n%s" % (directory, force_str(e.output)) + + if what is not None: + raise RuntimeError(what) + + +def load_and_convert(filename, encode=True): + '''load data from filename and convert all fields to string. + + Filename can be either plain or compressed (ending in .gz). + ''' + data = [] + if filename.endswith(".gz"): + with gzip.open(filename) as inf: + for line in inf: + line = line.decode("ascii") + if line.startswith("#"): + continue + d = line.strip().split("\t") + data.append(d) + else: + with open(filename) as f: + for line in f: + if line.startswith("#"): + continue + d = line.strip().split("\t") + data.append(d) + + return data + + +def flatten_nested_list(l): + return [i for ll in l for i in ll] diff --git a/tests/VariantFileFetchTestUtils.py b/tests/VariantFileFetchTestUtils.py new file mode 100644 index 0000000..4c16b97 --- /dev/null +++ b/tests/VariantFileFetchTestUtils.py @@ -0,0 +1,67 @@ +import os +import subprocess +import pysam + +try: + import cyvcf2 +except ImportError: + pass + + +def build_filter_from_vcf_with_samtoolsshell(fn): + retval = os.popen( + "bcftools filter -e \"N_ALT != 1 || QUAL < 20 || maf[0]>0.05\" {} | grep -cv ^# ".format(fn)).read() + return int(retval.strip()) + + +def build_filter_from_vcf_with_bcftoolspipe(fn): + FNULL = open(os.devnull, 'w') + with subprocess.Popen([ + "bcftools", + "filter", + "-e", + "N_ALT != 1 || QUAL < 20 || maf[0]>0.05", + fn], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=FNULL) as proc: + data = [line for line in proc.stdout.readlines() if not line.startswith(b"#")] + return len(data) + + +def build_filter_from_vcf_with_cyvcf2(fn): + n = 0 + try: + for v in cyvcf2.VCF(fn): + if len(v.ALT) > 1: + continue + if v.QUAL < 20: + continue + if v.aaf > 0.05: + continue + n += 1 + except NameError: + n = 9120 + return n + + +def build_filter_from_vcf_with_pysam(fn): + n = 0 + with pysam.VariantFile(fn) as vcf: + for v in vcf: + # the two commands below take >1s out of 19s total + if len(v.alts) > 1: + continue + if v.qual < 20: + continue + # this takes 12s out of 19s total + gts = [s['GT'] for s in v.samples.values()] + # the lines below take 6s out of 19s total + an = sum(len(gt) for gt in gts) + ac = sum(sum(gt) for gt in gts) + aaf = (float(ac) / float(an)) + if aaf > 0.05: + continue + n += 1 + return n + diff --git a/tests/VariantFile_bench.py b/tests/VariantFile_bench.py new file mode 100644 index 0000000..9663ea6 --- /dev/null +++ b/tests/VariantFile_bench.py @@ -0,0 +1,57 @@ +"""Benchmarking module for AlignmentFile functionality""" +import pytest + + +from VariantFileFetchTestUtils import * + + +GENOMES_URL = "ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/release/20130502/ALL.chr{chrom}.phase3_shapeit2_mvncall_integrated_v5a.20130502.genotypes.vcf.gz" + +CHROM = 22 + + +@pytest.fixture +def genomes_data(): + url = GENOMES_URL.format(chrom=CHROM) + fn = os.path.basename(url) + print(fn) + if not os.path.exists(fn): + os.system("wget {}".format(url)) + if not os.path.exists(fn + ".tbi"): + os.system("wget {}".format(url + ".tbi")) + + fn_small = "small.vcf.gz" + if not os.path.exists(fn_small): + os.system("bcftools view {} | head -n 10000 | bgzip > {}".format(fn, fn_small)) + os.system("tabix -p vcf {}".format(fn_small)) + + return fn_small + + +@pytest.mark.benchmark(min_rounds=1) +def test_build_filter_from_vcf_with_bcftoolsshell(benchmark, genomes_data): + result = benchmark(build_filter_from_vcf_with_samtoolsshell, genomes_data) + assert result == 9120 + + +@pytest.mark.benchmark(min_rounds=1) +def test_build_filter_from_vcf_with_bcftoolpipe(benchmark, genomes_data): + result = benchmark(build_filter_from_vcf_with_bcftoolspipe, genomes_data) + assert result == 9120 + + +@pytest.mark.benchmark(min_rounds=1) +def test_build_filter_from_vcf_with_cyvcf2(benchmark, genomes_data): + result = benchmark(build_filter_from_vcf_with_cyvcf2, genomes_data) + # note: inconsistent with bcftools + assert result == 9114 + + +@pytest.mark.benchmark(min_rounds=1) +def test_build_filter_from_vcf_with_pysam(benchmark, genomes_data): + result = benchmark(build_filter_from_vcf_with_pysam, genomes_data) + # note: inconsistent with bcftools + assert result == 9114 + + + diff --git a/tests/VariantFile_test.py b/tests/VariantFile_test.py new file mode 100644 index 0000000..6224f0c --- /dev/null +++ b/tests/VariantFile_test.py @@ -0,0 +1,703 @@ +# -*- coding: utf-8 -*- + +import os +import glob +import sys +import unittest +import pysam +import shutil +import gzip + +try: + from pathlib import Path +except ImportError: + Path = None + +from TestUtils import get_temp_filename, check_lines_equal, load_and_convert, make_data_files, CBCF_DATADIR, get_temp_context + + +def setUpModule(): + make_data_files(CBCF_DATADIR) + + +def read_header(filename): + data = [] + if filename.endswith(".gz"): + for line in gzip.open(filename): + line = line.decode("ascii") + if line.startswith("#"): + data.append(line) + else: + with open(filename) as f: + for line in f: + if line.startswith("#"): + data.append(line) + + return data + + +def read_index_header(filename): + with gzip.open(filename) as infile: + magic = infile.read(4) + return magic + + +class TestMissingGenotypes(unittest.TestCase): + + filename = "missing_genotypes.vcf" + + def setUp(self): + self.compare = load_and_convert( + os.path.join(CBCF_DATADIR, self.filename), + encode=False) + + def check(self, filename): + """see issue 203 - check for segmentation fault""" + fn = os.path.join(CBCF_DATADIR, filename) + self.assertEqual(True, os.path.exists(fn)) + v = pysam.VariantFile(fn) + for site in v: + for ss, rec in site.samples.items(): + a, b = ss, rec + + v = pysam.VariantFile(fn) + for x, site in enumerate(v): + for ss, rec in site.samples.items(): + a, b = ss, rec.alleles + a, b = ss, rec.allele_indices + + def testVCF(self): + self.check(self.filename) + + def testVCFGZ(self): + self.check(self.filename + ".gz") + + +class TestMissingSamples(unittest.TestCase): + + filename = "gnomad.vcf" + + def setUp(self): + self.compare = load_and_convert( + os.path.join(CBCF_DATADIR, self.filename), + encode=False) + + def check(self, filename): + """see issue #593""" + fn = os.path.join(CBCF_DATADIR, filename) + self.assertEqual(True, os.path.exists(fn)) + expect_fail = not "fixed" in self.filename + with pysam.VariantFile(fn) as inf: + rec = next(inf.fetch()) + if expect_fail: + self.assertRaises(ValueError, rec.info.__getitem__, "GC") + else: + self.assertEqual(rec.info["GC"], (27, 35, 16)) + + def testVCF(self): + self.check(self.filename) + + def testVCFGZ(self): + self.check(self.filename + ".gz") + + +class TestMissingSamplesFixed(TestMissingSamples): + # workaround for NUMBER=G in INFO records: + # perl 's/Number=G/Number=./ if (/INFO/)' + + filename = "gnomad_fixed.vcf" + + +class TestOpening(unittest.TestCase): + + def testMissingFile(self): + self.assertRaises(IOError, pysam.VariantFile, + "missing_file.vcf") + + def testMissingFileVCFGZ(self): + self.assertRaises(IOError, pysam.VariantFile, + "missing_file.vcf.gz") + + def testEmptyFileVCF(self): + with get_temp_context("tmp_testEmptyFile.vcf") as fn: + with open(fn, "w"): + pass + self.assertRaises(ValueError, pysam.VariantFile, fn) + + if Path and sys.version_info >= (3, 6): + def testEmptyFileVCFFromPath(self): + with get_temp_context("tmp_testEmptyFile.vcf") as fn: + with open(fn, "w"): + pass + self.assertRaises(ValueError, pysam.VariantFile, + Path(fn)) + + def testEmptyFileVCFGZWithIndex(self): + with get_temp_context("tmp_testEmptyFile.vcf") as fn: + with open(fn, "w"): + pass + # tabix_index will automatically compress + pysam.tabix_index(fn, + preset="vcf", + force=True) + + self.assertRaises(ValueError, pysam.VariantFile, fn + ".gz") + + def testEmptyFileVCFGZWithoutIndex(self): + with get_temp_context("tmp_testEmptyFileWithoutIndex.vcf") as fn: + with open(fn, "w"): + pass + + pysam.tabix_compress(fn, + fn + ".gz", + force=True) + + self.assertRaises(ValueError, pysam.VariantFile, fn + ".gz") + + def testEmptyFileVCFOnlyHeader(self): + with pysam.VariantFile(os.path.join( + CBCF_DATADIR, + "example_vcf42_only_header.vcf")) as inf: + self.assertEqual(len(list(inf.fetch())), 0) + + def testEmptyFileVCFGZOnlyHeader(self): + with pysam.VariantFile(os.path.join( + CBCF_DATADIR, + "example_vcf42_only_header.vcf")) as inf: + self.assertEqual(len(list(inf.fetch())), 0) + + def testDetectVCF(self): + with pysam.VariantFile(os.path.join(CBCF_DATADIR, + "example_vcf40.vcf")) as inf: + self.assertEqual(inf.category, 'VARIANTS') + self.assertEqual(inf.format, 'VCF') + self.assertEqual(inf.compression, 'NONE') + self.assertFalse(inf.is_remote) + self.assertFalse(inf.is_stream) + self.assertEqual(len(list(inf.fetch())), 5) + + def testDetectVCFGZ(self): + with pysam.VariantFile(os.path.join(CBCF_DATADIR, + "example_vcf40.vcf.gz")) as inf: + self.assertEqual(inf.category, 'VARIANTS') + self.assertEqual(inf.format, 'VCF') + self.assertEqual(inf.compression, 'BGZF') + self.assertFalse(inf.is_remote) + self.assertFalse(inf.is_stream) + self.assertEqual(len(list(inf.fetch())), 5) + + def testDetectBCF(self): + with pysam.VariantFile(os.path.join( + CBCF_DATADIR, + "example_vcf40.bcf")) as inf: + self.assertEqual(inf.category, 'VARIANTS') + self.assertEqual(inf.format, 'BCF') + self.assertEqual(inf.compression, 'BGZF') + self.assertFalse(inf.is_remote) + self.assertFalse(inf.is_stream) + self.assertEqual(len(list(inf.fetch())), 5) + + +class TestIndexFormatsVCF(unittest.TestCase): + + vcf_filename = os.path.join(CBCF_DATADIR, "example_vcf40.vcf") + bcf_filename = os.path.join(CBCF_DATADIR, "example_vcf40.bcf") + + def test_vcf_with_tbi_index(self): + with get_temp_context("tmp_fn.vcf") as fn: + shutil.copyfile(self.vcf_filename, fn) + pysam.tabix_index(fn, preset="vcf", force=True) + self.assertTrue(os.path.exists(fn + ".gz" + ".tbi")) + self.assertEqual(read_index_header(fn + ".gz.tbi"), b"TBI\1") + self.assertFalse(os.path.exists(fn + ".gz" + ".csi")) + + with pysam.VariantFile(fn + ".gz") as inf: + self.assertEqual(len(list(inf.fetch("20"))), 3) + + def test_vcf_with_csi_index(self): + with get_temp_context("tmp_fn.vcf") as fn: + shutil.copyfile(self.vcf_filename, fn) + + pysam.tabix_index(fn, preset="vcf", force=True, csi=True) + self.assertTrue(os.path.exists(fn + ".gz" + ".csi")) + self.assertEqual(read_index_header(fn + ".gz.csi"), b"CSI\1") + self.assertFalse(os.path.exists(fn + ".gz" + ".tbi")) + + with pysam.VariantFile(fn + ".gz") as inf: + self.assertEqual(len(list(inf.fetch("20"))), 3) + + def test_bcf_with_prebuilt_csi(self): + with get_temp_context("tmp_fn.bcf") as fn: + shutil.copyfile(self.bcf_filename, fn) + shutil.copyfile(self.bcf_filename + ".csi", fn + ".csi") + + self.assertTrue(os.path.exists(fn + ".csi")) + self.assertEqual(read_index_header(fn + ".csi"), b"CSI\1") + self.assertFalse(os.path.exists(fn + ".tbi")) + + with pysam.VariantFile(fn) as inf: + self.assertEqual(len(list(inf.fetch("20"))), 3) + + def test_bcf_with_tbi_index_will_produce_csi(self): + with get_temp_context("tmp_fn.bcf") as fn: + shutil.copyfile(self.bcf_filename, fn) + + pysam.tabix_index(fn, preset="bcf", force=True, csi=False) + self.assertTrue(os.path.exists(fn + ".csi")) + self.assertEqual(read_index_header(fn + ".csi"), b"CSI\1") + self.assertFalse(os.path.exists(fn + ".tbi")) + + with pysam.VariantFile(fn) as inf: + self.assertEqual(len(list(inf.fetch("20"))), 3) + + def test_bcf_with_csi_index(self): + with get_temp_context("tmp_fn.bcf") as fn: + shutil.copyfile(self.bcf_filename, fn) + + pysam.tabix_index(fn, preset="vcf", force=True, csi=True) + + self.assertTrue(os.path.exists(fn + ".csi")) + self.assertEqual(read_index_header(fn + ".csi"), b"CSI\1") + self.assertFalse(os.path.exists(fn + ".tbi")) + + with pysam.VariantFile(fn) as inf: + self.assertEqual(len(list(inf.fetch("20"))), 3) + + +class TestHeader(unittest.TestCase): + + filename = "example_vcf40.vcf" + + def testStr(self): + + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + + ref = read_header(fn) + comp = str(v.header).splitlines(True) + + self.assertEqual(sorted(ref), + sorted(comp)) + + def testIterator(self): + + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + + ref = read_header(fn) + # remove last header line starting with #CHROM + ref.pop() + ref = sorted(ref) + comp = sorted(str(x) for x in v.header.records) + + self.assertEqual(len(ref), len(comp)) + + for x, y in zip(ref, comp): + self.assertEqual(x, y) + + +# These tests need to be separate and start from newly opened files. This +# is because htslib's parser is lazy and the pysam API needs to trigger +# appropriate parsing when accessing each time of data. Failure to do so +# will result in crashes or return of incorrect data. Thus this test suite +# is testing both the triggering of the lazy parser and the results of the +# parser. +class TestParsing(unittest.TestCase): + + filename = "example_vcf40.vcf.gz" + + def testChrom(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + chrom = [rec.chrom for rec in v] + self.assertEqual(chrom, ['M', '17', '20', '20', '20']) + + if Path and sys.version_info >= (3, 6): + def testChromFromPath(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(Path(fn)) + chrom = [rec.chrom for rec in v] + self.assertEqual(chrom, ['M', '17', '20', '20', '20']) + + def testPos(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + pos = [rec.pos for rec in v] + self.assertEqual(pos, [1230237, 14370, 17330, 1110696, 1234567]) + + def testStart(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + start = [rec.start for rec in v] + self.assertEqual(start, [1230236, 14369, 17329, 1110695, 1234566]) + + def testStop(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + stop = [rec.stop for rec in v] + self.assertEqual(stop, [1230237, 14370, 17330, 1110696, 1234570]) + + def testId(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + ids = [rec.id for rec in v] + self.assertEqual( + ids, [None, 'rs6054257', None, 'rs6040355', 'microsat1']) + + def testRef(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + ref = [rec.ref for rec in v] + self.assertEqual(ref, ['T', 'G', 'T', 'A', 'GTCT']) + + def testAlt(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + alts = [rec.alts for rec in v] + self.assertEqual(alts, [None, ('A',), ('A',), + ('G', 'T'), ('G', 'GTACT')]) + + def testAlleles(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + alleles = [rec.alleles for rec in v] + self.assertEqual(alleles, [ + ('T',), ('G', 'A'), ('T', 'A'), ('A', 'G', 'T'), ('GTCT', 'G', 'GTACT')]) + + def testAllelesVariantTypes(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + rec = next(v) + + self.assertEqual(rec.alleles, ('T',)) + self.assertEqual(rec.alleles_variant_types, ("REF",)) + + rec.alleles = ("T", "C") + self.assertEqual(rec.alleles_variant_types, ("REF", "SNP")) + + rec.alts = ("TC",) + self.assertEqual(rec.alleles_variant_types, ("REF", "INDEL")) + + rec.ref = "AG" + self.assertEqual(rec.alleles_variant_types, ("REF", "MNP")) + + def testQual(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + qual = [rec.qual for rec in v] + self.assertEqual(qual, [47.0, 29.0, 3.0, 67.0, 50.0]) + + def testFilter(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + filter = [rec.filter.keys() for rec in v] + self.assertEqual(filter, [['PASS'], ['PASS'], + ['q10'], ['PASS'], ['PASS']]) + + def testInfo(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + info = [rec.info.items() for rec in v] + self.assertEqual(info, [[('NS', 3), ('DP', 13), ('AA', 'T')], + [('NS', 3), ('DP', 14), ('AF', (0.5,)), + ('DB', True), ('H2', True)], + [('NS', 3), ('DP', 11), + ('AF', (0.017000000923871994,))], + [('NS', 2), ('DP', 10), ('AF', (0.3330000042915344, 0.6669999957084656)), + ('AA', 'T'), ('DB', True)], + [('NS', 3), ('DP', 9), ('AA', 'G')]]) + + def testFormat(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + format = [rec.format.keys() for rec in v] + self.assertEqual(format, [['GT', 'GQ', 'DP', 'HQ'], + ['GT', 'GQ', 'DP', 'HQ'], + ['GT', 'GQ', 'DP', 'HQ'], + ['GT', 'GQ', 'DP', 'HQ'], + ['GT', 'GQ', 'DP']]) + + def testSampleAlleles(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + alleles = [s.alleles for rec in v for s in rec.samples.values()] + self.assertEqual(alleles, [('T', 'T'), ('T', 'T'), ('T', 'T'), + ('G', 'G'), ('A', 'G'), ('A', 'A'), + ('T', 'T'), ('T', 'A'), ('T', 'T'), + ('G', 'T'), ('T', 'G'), ('T', 'T'), + ('GTCT', 'G'), ('GTCT', 'GTACT'), + ('G', 'G')]) + + def testSampleFormats(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + format = [s.items() for rec in v for s in rec.samples.values()] + self.assertEqual(format, [[('GT', (0, 0)), ('GQ', 54), ('DP', 7), ('HQ', (56, 60))], + [('GT', (0, 0)), ('GQ', 48), + ('DP', 4), ('HQ', (51, 51))], + [('GT', (0, 0)), ('GQ', 61), + ('DP', 2), ('HQ', (None,))], + [('GT', (0, 0)), ('GQ', 48), + ('DP', 1), ('HQ', (51, 51))], + [('GT', (1, 0)), ('GQ', 48), + ('DP', 8), ('HQ', (51, 51))], + [('GT', (1, 1)), ('GQ', 43), + ('DP', 5), ('HQ', (None, None))], + [('GT', (0, 0)), ('GQ', 49), + ('DP', 3), ('HQ', (58, 50))], + [('GT', (0, 1)), ('GQ', 3), + ('DP', 5), ('HQ', (65, 3))], + [('GT', (0, 0)), ('GQ', 41), + ('DP', 3), ('HQ', (None,))], + [('GT', (1, 2)), ('GQ', 21), + ('DP', 6), ('HQ', (23, 27))], + [('GT', (2, 1)), ('GQ', 2), + ('DP', 0), ('HQ', (18, 2))], + [('GT', (2, 2)), ('GQ', 35), + ('DP', 4), ('HQ', (None,))], + [('GT', (0, 1)), ('GQ', 35), ('DP', 4)], + [('GT', (0, 2)), ('GQ', 17), ('DP', 2)], + [('GT', (1, 1)), ('GQ', 40), ('DP', 3)]]) + + def testSampleAlleleIndices(self): + fn = os.path.join(CBCF_DATADIR, self.filename) + v = pysam.VariantFile(fn) + indices = [s.allele_indices for rec in v for s in rec.samples.values()] + self.assertEqual(indices, [(0, 0), (0, 0), (0, 0), (0, 0), (1, 0), + (1, 1), (0, 0), (0, 1), (0, 0), (1, 2), + (2, 1), (2, 2), (0, 1), (0, 2), (1, 1)]) + + +class TestIndexFilename(unittest.TestCase): + + filenames = [('example_vcf40.vcf.gz', 'example_vcf40.vcf.gz.tbi'), + ('example_vcf40.vcf.gz', 'example_vcf40.vcf.gz.csi'), + ('example_vcf40.bcf', 'example_vcf40.bcf.csi')] + + def testOpen(self): + for fn, idx_fn in self.filenames: + fn = os.path.join(CBCF_DATADIR, fn) + idx_fn = os.path.join(CBCF_DATADIR, idx_fn) + + with pysam.VariantFile(fn, index_filename=idx_fn) as inf: + self.assertEqual(len(list(inf.fetch('20'))), 3) + + +class TestConstructionVCFWithContigs(unittest.TestCase): + """construct VariantFile from scratch.""" + + filename = "example_vcf42_withcontigs.vcf" + compression = 'NONE' + description = 'VCF version 4.2 variant calling text' + + def testBase(self): + with pysam.VariantFile(os.path.join(CBCF_DATADIR, self.filename)) as inf: + self.assertEqual(inf.category, 'VARIANTS') + self.assertEqual(inf.format, 'VCF') + self.assertEqual(inf.version, (4, 2)) + self.assertEqual(inf.compression, self.compression) + self.assertEqual(inf.description, self.description) + self.assertTrue(inf.is_open) + self.assertEqual(inf.is_read, True) + self.assertEqual(inf.is_write, False) + + def complete_check(self, fn_in, fn_out): + self.maxDiff = None + check_lines_equal( + self, fn_in, fn_out, sort=True, + filter_f=lambda x: x.startswith("##contig")) + os.unlink(fn_out) + + def testConstructionWithRecords(self): + + fn_in = os.path.join(CBCF_DATADIR, self.filename) + fn_out = get_temp_filename(suffix=".vcf") + vcf_in = pysam.VariantFile(fn_in) + + header = pysam.VariantHeader() + + for record in vcf_in.header.records: + header.add_record(record) + + for sample in vcf_in.header.samples: + header.add_sample(sample) + + vcf_out = pysam.VariantFile(fn_out, "w", header=header) + for record in vcf_in: + record.translate(header) + vcf_out.write(record) + + vcf_in.close() + vcf_out.close() + self.complete_check(fn_in, fn_out) + + def testConstructionFromCopy(self): + + fn_in = os.path.join(CBCF_DATADIR, self.filename) + fn_out = get_temp_filename(suffix=".vcf") + vcf_in = pysam.VariantFile(fn_in) + + vcf_out = pysam.VariantFile(fn_out, "w", header=vcf_in.header) + for record in vcf_in: + vcf_out.write(record) + + vcf_in.close() + vcf_out.close() + + self.complete_check(fn_in, fn_out) + + def testConstructionWithLines(self): + + fn_in = os.path.join(CBCF_DATADIR, self.filename) + fn_out = get_temp_filename(suffix=".vcf") + vcf_in = pysam.VariantFile(fn_in) + + header = pysam.VariantHeader() + header.add_samples(vcf_in.header.samples) + + for hr in vcf_in.header.records: + header.add_line(str(hr)) + + vcf_out = pysam.VariantFile(fn_out, "w", header=header) + + for record in vcf_in: + vcf_out.write(record) + + vcf_out.close() + vcf_in.close() + + self.complete_check(fn_in, fn_out) + + +# class TestConstructionVCFWithoutContigs(TestConstructionVCFWithContigs): +# """construct VariantFile from scratch.""" +# filename = "example_vcf40.vcf" + + +class TestConstructionVCFGZWithContigs(TestConstructionVCFWithContigs): + """construct VariantFile from scratch.""" + + filename = "example_vcf42_withcontigs.vcf.gz" + compression = 'BGZF' + description = 'VCF version 4.2 BGZF-compressed variant calling data' + + +class TestConstructionVCFGZWithoutContigs(TestConstructionVCFWithContigs): + """construct VariantFile from scratch.""" + + filename = "example_vcf42.vcf.gz" + compression = 'BGZF' + description = 'VCF version 4.2 BGZF-compressed variant calling data' + + +class TestSettingRecordValues(unittest.TestCase): + + filename = "example_vcf40.vcf" + + def testBase(self): + with pysam.VariantFile(os.path.join(CBCF_DATADIR, self.filename)) as inf: + self.assertEqual(inf.category, 'VARIANTS') + self.assertEqual(inf.format, 'VCF') + self.assertEqual(inf.version, (4, 0)) + self.assertEqual(inf.compression, 'NONE') + self.assertEqual( + inf.description, 'VCF version 4.0 variant calling text') + self.assertTrue(inf.is_open) + self.assertEqual(inf.is_read, True) + self.assertEqual(inf.is_write, False) + + def testSetQual(self): + with pysam.VariantFile(os.path.join(CBCF_DATADIR, self.filename)) as inf: + record = next(inf) + self.assertEqual(record.qual, 47) + record.qual = record.qual + self.assertEqual(record.qual, 47) + record.qual = 10 + self.assertEqual(record.qual, 10) + self.assertEqual(str(record).split("\t")[5], "10") + + def testGenotype(self): + with pysam.VariantFile(os.path.join(CBCF_DATADIR, self.filename)) as inf: + record = next(inf) + sample = record.samples["NA00001"] + print(sample["GT"]) + self.assertEqual(sample["GT"], (0, 0)) + sample["GT"] = sample["GT"] + + +class TestMultiThreading(unittest.TestCase): + + filename = os.path.join(CBCF_DATADIR, "example_vcf42.vcf.gz") + + def testSingleThreadEqualsMultithreadResult(self): + with pysam.VariantFile(self.filename) as inf: + header = inf.header + single = [r for r in inf] + with pysam.VariantFile(self.filename, threads=2) as inf: + multi = [r for r in inf] + for r1, r2 in zip(single, multi): + assert str(r1) == str(r2) + + bcf_out = get_temp_filename(suffix=".bcf") + with pysam.VariantFile(bcf_out, mode='wb', + header=header, + threads=2) as out: + for r in single: + out.write(r) + with pysam.VariantFile(bcf_out) as inf: + multi_out = [r for r in inf] + for r1, r2 in zip(single, multi_out): + assert str(r1) == str(r2) + + def testNoMultiThreadingWithIgnoreTruncation(self): + with self.assertRaises(ValueError): + pysam.VariantFile(self.filename, + threads=2, + ignore_truncation=True) + + +class TestSubsetting(unittest.TestCase): + + filename = "example_vcf42.vcf.gz" + + def testSubsetting(self): + with pysam.VariantFile(os.path.join(CBCF_DATADIR, + self.filename)) as inf: + inf.subset_samples(["NA00001"]) + + +class TestVCFVersions(unittest.TestCase): + + def setUp(self): + self.files_to_test = (glob.glob(os.path.join(CBCF_DATADIR, "example_v*.vcf.gz")) + + glob.glob(os.path.join(CBCF_DATADIR, "example_v*.vcf")) + + glob.glob(os.path.join(CBCF_DATADIR, "example_v*.bcf"))) + + def test_all_records_can_be_fetched(self): + + for fn in self.files_to_test: + with pysam.VariantFile(fn) as inf: + records = list(inf.fetch()) + + +class TestUnicode(unittest.TestCase): + filename = "example_vcf43_with_utf8.vcf.gz" + + def test_record_with_unicode(self): + with pysam.VariantFile(os.path.join(CBCF_DATADIR, + self.filename)) as inf: + records = list(inf.fetch("20", 2345677, 2345678)) + self.assertEqual(len(records), 1) + record = records.pop() + self.assertEqual( + record.info["CLNVI"], + ('Institute_of_Human_Genetics', u'Friedrich-Alexander-Universität_Erlangen-Nürnberg')) + self.assertEqual(record.samples[0]["AN"], "alpha") + self.assertEqual(record.samples[1]["AN"], u"ä") + self.assertEqual(record.samples[2]["AN"], u"ü") + + +if __name__ == "__main__": + print("starting tests") + unittest.main() + print("completed tests") diff --git a/tests/VariantRecord_test.py b/tests/VariantRecord_test.py new file mode 100644 index 0000000..c44d9a6 --- /dev/null +++ b/tests/VariantRecord_test.py @@ -0,0 +1,95 @@ +import pysam +import pytest + +try: + from pathlib import Path +except ImportError: + Path = None + +from TestUtils import make_data_files, CBCF_DATADIR + + +def setUpModule(): + make_data_files(CBCF_DATADIR) + + +@pytest.fixture +def vcf_header(): + vcf_header = pysam.VariantHeader() + vcf_header.add_samples("sample1", "sample2") + vcf_header.contigs.add("1") + return vcf_header + +## segfault without coordinates + +def test_ascii_annotation_can_be_added(vcf_header): + vcf_header.formats.add("AN", 1, "String", "An annotation") + record = vcf_header.new_record( + contig="1", + start=12, + stop=13, + samples=[ + {"AN": "anno1"}, + {"AN": "anno2"}]) + assert str(record)[:-1].split("\t")[-2:] == ["anno1", "anno2"] + + +def test_ascii_annotation_with_variable_length_can_be_added(vcf_header): + vcf_header.formats.add("AN", 1, "String", "An annotation") + record = vcf_header.new_record( + contig="1", + start=12, + stop=13, + samples=[ + {"AN": "anno1b"}, + {"AN": "anno1"}]) + assert str(record)[:-1].split("\t")[-2:] == ["anno1b", "anno1"] + record = vcf_header.new_record( + contig="1", + start=12, + stop=13, + samples=[ + {"AN": "anno2"}, + {"AN": "anno2b"}]) + assert str(record)[:-1].split("\t")[-2:] == ["anno2", "anno2b"] + + +def test_unicode_annotation_can_be_added(vcf_header): + vcf_header.formats.add("AN", 1, "String", "An annotation") + record = vcf_header.new_record( + contig="1", + start=12, + stop=13, + samples=[ + {"AN": "anno1"}, + {"AN": "Friedrich-Alexander-Universit\u00E4t_Erlangen-N\u00FCrnberg"}]) + assert str(record)[:-1].split("\t")[-2:] == [ + "anno1", + "Friedrich-Alexander-Universit\u00E4t_Erlangen-N\u00FCrnberg"] + +def test_set_sample_alleles(vcf_header): + vcf_header.formats.add('GT',1,'String',"Genotype") # id, number, type, description + record = vcf_header.new_record( + contig="1", + start=20, + stop=21, + alleles=('A','T') + ) + + record.samples['sample1'].alleles = ('T', 'A') + assert record.samples['sample1'].alleles == ('T','A') + + # Empty record: + record.samples['sample1'].alleles = (None, ) + assert record.samples['sample1'].alleles == tuple() + record.samples['sample1'].alleles = None + assert record.samples['sample1'].alleles == tuple() + record.samples['sample1'].alleles = tuple() + assert record.samples['sample1'].alleles == tuple() + + # check error conditions: + with pytest.raises(ValueError, match='One or more of the supplied sample alleles are not defined'): + record.samples['sample1'].alleles = ('C', 'A') + + with pytest.raises(ValueError, match='Use .allele_indices to set integer allele indices'): + record.samples['sample1'].alleles = (1, 0) diff --git a/tests/_compile_test.pyx b/tests/_compile_test.pyx new file mode 100644 index 0000000..dfe7937 --- /dev/null +++ b/tests/_compile_test.pyx @@ -0,0 +1,29 @@ +from pysam.libcalignmentfile cimport AlignmentFile, AlignedSegment +from pysam.libctabix cimport Tabixfile + +cdef AlignmentFile samfile +cdef Tabixfile tabixfile + + +def testCountBAM(AlignmentFile samfile): + '''test reading from a BAM file accessing + the flag field directly.''' + + cdef AlignedSegment read + cdef int n = 0 + + for read in samfile.fetch(): + flag = read._delegate.core.flag + n += 1 + + return n + +def testCountGTF(Tabixfile tabixfile): + '''test reading from a tabixfile.''' + + cdef int n = 0 + + for entry in tabixfile.fetch(): + n += 1 + + return n diff --git a/tests/_compile_test.pyxbld b/tests/_compile_test.pyxbld new file mode 100644 index 0000000..87dfb3e --- /dev/null +++ b/tests/_compile_test.pyxbld @@ -0,0 +1,8 @@ +# link against pysam +def make_ext(modname, pyxfilename): + from distutils.extension import Extension + import pysam + return Extension(name = modname, + sources = [pyxfilename], + include_dirs = pysam.get_include(), + define_macros = pysam.get_defines()) diff --git a/tests/_cython_flagstat.pyx b/tests/_cython_flagstat.pyx new file mode 100644 index 0000000..8e376b0 --- /dev/null +++ b/tests/_cython_flagstat.pyx @@ -0,0 +1,18 @@ +from pysam.libcalignmentfile cimport AlignmentFile, AlignedSegment +from pysam.libcalignmentfile cimport BAM_FPROPER_PAIR, BAM_FPAIRED +from pysam.libcalignedsegment cimport pysam_get_flag + +def count(AlignmentFile samfile): + cdef int is_proper = 0 + cdef int is_paired = 0 + cdef AlignedSegment read + cdef int f + + for read in samfile: + f = pysam_get_flag(read._delegate) + if f & BAM_FPAIRED: + is_paired += 1 + if f & BAM_FPROPER_PAIR: + is_proper += 1 + + return is_paired, is_proper diff --git a/tests/_cython_flagstat.pyxbld b/tests/_cython_flagstat.pyxbld new file mode 100644 index 0000000..0e05b76 --- /dev/null +++ b/tests/_cython_flagstat.pyxbld @@ -0,0 +1,8 @@ +def make_ext(modname, pyxfilename): + from distutils.extension import Extension + import pysam + return Extension(name=modname, + sources=[pyxfilename], + extra_link_args=pysam.get_libraries(), + include_dirs=pysam.get_include(), + define_macros=pysam.get_defines()) diff --git a/tests/cbcf_data/Makefile b/tests/cbcf_data/Makefile new file mode 100644 index 0000000..9c3fe75 --- /dev/null +++ b/tests/cbcf_data/Makefile @@ -0,0 +1,25 @@ +ALL_VCF=$(wildcard *.vcf) +VCF=$(filter-out example_empty.vcf,$(ALL_VCF)) + +VCFGZ=$(VCF:%.vcf=%.vcf.gz) +BCF=$(VCF:%.vcf=%.bcf) + +all: all.stamp + +all.stamp: $(VCFGZ) $(BCF) + touch $@ + +%.vcf.gz: %.vcf + bgzip < $< > $@ + tabix -p vcf $@ # create tbi index + bcftools index $@ # create csi index + +%.bcf: %.vcf.gz + bcftools view -O b $< -o $@ + bcftools index $@ + +example_empty.bcf: example_empty.vcf.gz + touch $@ + +clean: + -rm -f all.stamp *.gz *.tbi *.csi *.bcf diff --git a/tests/cbcf_data/example_empty.vcf b/tests/cbcf_data/example_empty.vcf new file mode 100644 index 0000000..e69de29 diff --git a/tests/cbcf_data/example_vcf40.vcf b/tests/cbcf_data/example_vcf40.vcf new file mode 100644 index 0000000..8dd9f20 --- /dev/null +++ b/tests/cbcf_data/example_vcf40.vcf @@ -0,0 +1,24 @@ +##fileformat=VCFv4.0 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=1000GenomesPilot-NCBI36 +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 +M 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2 +17 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,. +20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3 +20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4 +20 1234567 microsat1 GTCT G,GTACT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3 diff --git a/tests/cbcf_data/example_vcf42.vcf b/tests/cbcf_data/example_vcf42.vcf new file mode 100644 index 0000000..f103e1f --- /dev/null +++ b/tests/cbcf_data/example_vcf42.vcf @@ -0,0 +1,24 @@ +##fileformat=VCFv4.2 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=1000GenomesPilot-NCBI36 +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 +M 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2:. +17 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,. +20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3:. +20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4:. +20 1234567 microsat1 GTCT G,GTACT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3 diff --git a/tests/cbcf_data/example_vcf42_only_header.vcf b/tests/cbcf_data/example_vcf42_only_header.vcf new file mode 100644 index 0000000..ee0f8fa --- /dev/null +++ b/tests/cbcf_data/example_vcf42_only_header.vcf @@ -0,0 +1,19 @@ +##fileformat=VCFv4.2 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=1000GenomesPilot-NCBI36 +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 diff --git a/tests/cbcf_data/example_vcf42_withcontigs.vcf b/tests/cbcf_data/example_vcf42_withcontigs.vcf new file mode 100644 index 0000000..1d298eb --- /dev/null +++ b/tests/cbcf_data/example_vcf42_withcontigs.vcf @@ -0,0 +1,27 @@ +##fileformat=VCFv4.2 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=1000GenomesPilot-NCBI36 +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##contig= +##contig= +##contig= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 +M 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2:. +17 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,. +20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3:. +20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4:. +20 1234567 microsat1 GTCT G,GTACT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3 diff --git a/tests/cbcf_data/example_vcf43.vcf b/tests/cbcf_data/example_vcf43.vcf new file mode 100644 index 0000000..9010401 --- /dev/null +++ b/tests/cbcf_data/example_vcf43.vcf @@ -0,0 +1,24 @@ +##fileformat=VCFv4.3 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta +##contig= +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 +20 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,. +20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3 +20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4 +20 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2 +20 1234567 microsat1 GTC G,GTCT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3 diff --git a/tests/cbcf_data/example_vcf43_with_utf8.vcf b/tests/cbcf_data/example_vcf43_with_utf8.vcf new file mode 100644 index 0000000..4826fc4 --- /dev/null +++ b/tests/cbcf_data/example_vcf43_with_utf8.vcf @@ -0,0 +1,27 @@ +##fileformat=VCFv4.3 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta +##contig= +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 +20 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,. +20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3 +20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4 +20 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2 +20 1234567 microsat1 GTC G,GTCT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3 +20 2345678 rs123 G A 29 PASS NS=3;DP=14;AF=0.5;CLNVI=Institute_of_Human_Genetics,Friedrich-Alexander-Universität_Erlangen-Nürnberg;DB;H2 GT:GQ:DP:HQ:AN 0|0:48:1:51,51:alpha 1|0:48:8:51,51:ä 1/1:43:5:.,.:ü diff --git a/tests/cbcf_data/gnomad.vcf b/tests/cbcf_data/gnomad.vcf new file mode 100644 index 0000000..9875c03 --- /dev/null +++ b/tests/cbcf_data/gnomad.vcf @@ -0,0 +1,200 @@ +##fileformat=VCFv4.2 +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FILTER= +##FILTER== 20, DP >= 10, AB => 0.2 for het calls))"> +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##reference=file:///seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta +#CHROM POS ID REF ALT QUAL FILTER INFO +22 16050036 rs374742143 A C 442156.34 RF AC=67;AF=4.29487e-01;AN=156;BaseQRankSum=7.36000e-01;ClippingRankSum=2.96000e-01;DB;DP=50165;FS=7.05600e+00;InbreedingCoeff=3.82000e-01;MQ=2.71500e+01;MQRankSum=-1.02600e+00;QD=2.47500e+01;ReadPosRankSum=-2.11000e-01;SOR=1.26750e+01;VQSLOD=-9.58600e+02;VQSR_culprit=MQ;GQ_HIST_ALT=16|1279|299|254|155|24|16|28|50|135|78|4|6|11|32|43|6|4|3|35;DP_HIST_ALT=1769|653|51|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|2|5|24|36|11|89|2|125|31|61|85|24|60|34|8|3|7;GQ_HIST_ALL=2359|2810|730|651|296|51|34|33|53|135|78|4|6|11|32|43|6|4|3|35;DP_HIST_ALL=5518|1756|94|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|2|5|24|36|11|89|2|125|31|61|85|24|60|34|8|3|7;AC_AFR=3;AC_AMR=7;AC_ASJ=0;AC_EAS=0;AC_FIN=50;AC_NFE=3;AC_OTH=4;AC_Male=32;AC_Female=35;AN_AFR=14;AN_AMR=10;AN_ASJ=0;AN_EAS=0;AN_FIN=84;AN_NFE=42;AN_OTH=6;AN_Male=80;AN_Female=76;AF_AFR=2.14286e-01;AF_AMR=7.00000e-01;AF_ASJ=.;AF_EAS=.;AF_FIN=5.95238e-01;AF_NFE=7.14286e-02;AF_OTH=6.66667e-01;AF_Male=4.00000e-01;AF_Female=4.60526e-01;GC_AFR=4,3,0;GC_AMR=0,3,2;GC_ASJ=0,0,0;GC_EAS=0,0,0;GC_FIN=4,26,12;GC_NFE=18,3,0;GC_OTH=1,0,2;GC_Male=16,16,8;GC_Female=11,19,8;AC_raw=4349;AN_raw=14748;AF_raw=2.94887e-01;GC_raw=4896,607,1871;GC=27,35,16;Hom_AFR=0;Hom_AMR=2;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=12;Hom_NFE=0;Hom_OTH=2;Hom_Male=8;Hom_Female=8;Hom_raw=1871;Hom=16;POPMAX=AMR;AC_POPMAX=7;AN_POPMAX=10;AF_POPMAX=7.00000e-01;DP_MEDIAN=3;DREF_MEDIAN=5.60406e-10;GQ_MEDIAN=12;AB_MEDIAN=5.55556e-01;AS_RF=4.71609e-02;AS_FilterStatus=RF;CSQ=C|intergenic_variant|MODIFIER|||||||||||||||rs374742143|1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050068 . A G 82.46 RF;AC0 AC=0;AF=0.00000e+00;AN=2708;DP=111486;FS=0.00000e+00;InbreedingCoeff=-3.63000e-02;MQ=3.20200e+01;QD=1.64900e+01;SOR=3.61100e+00;VQSLOD=-9.28900e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;DP_HIST_ALT=0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;GQ_HIST_ALL=1227|4189|2184|3537|2071|618|693|346|97|92|61|9|18|0|7|4|4|0|0|0;DP_HIST_ALL=7502|6289|1163|169|26|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=0;AC_OTH=0;AC_Male=0;AC_Female=0;AN_AFR=280;AN_AMR=162;AN_ASJ=34;AN_EAS=74;AN_FIN=748;AN_NFE=1300;AN_OTH=110;AN_Male=1584;AN_Female=1124;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=0.00000e+00;AF_OTH=0.00000e+00;AF_Male=0.00000e+00;AF_Female=0.00000e+00;GC_AFR=140,0,0;GC_AMR=81,0,0;GC_ASJ=17,0,0;GC_EAS=37,0,0;GC_FIN=374,0,0;GC_NFE=650,0,0;GC_OTH=55,0,0;GC_Male=792,0,0;GC_Female=562,0,0;AC_raw=2;AN_raw=30314;AF_raw=6.59761e-05;GC_raw=15156,0,1;GC=1354,0,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=1;Hom=0;POPMAX=.;AC_POPMAX=.;AN_POPMAX=.;AF_POPMAX=.;DP_MEDIAN=5;DREF_MEDIAN=1.22034e-16;GQ_MEDIAN=15;AB_MEDIAN=5.00000e-01;AS_RF=5.87186e-02;AS_FilterStatus=RF|AC0;CSQ=G|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050069 . C T 43.44 RF;AC0 AC=0;AF=0.00000e+00;AN=2802;BaseQRankSum=7.20000e-01;ClippingRankSum=-1.38000e+00;DP=112972;FS=0.00000e+00;InbreedingCoeff=-3.70000e-02;MQ=3.67700e+01;MQRankSum=7.20000e-01;QD=7.24000e+00;ReadPosRankSum=1.38000e+00;SOR=1.32900e+00;VQSLOD=-3.27400e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0;DP_HIST_ALT=0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0;GQ_HIST_ALL=1200|4098|2219|3540|2117|622|710|352|104|101|64|10|20|1|8|3|4|0|0|0;DP_HIST_ALL=7405|6348|1203|181|28|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=0;AC_OTH=0;AC_Male=0;AC_Female=0;AN_AFR=296;AN_AMR=164;AN_ASJ=36;AN_EAS=70;AN_FIN=766;AN_NFE=1354;AN_OTH=116;AN_Male=1638;AN_Female=1164;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=0.00000e+00;AF_OTH=0.00000e+00;AF_Male=0.00000e+00;AF_Female=0.00000e+00;GC_AFR=148,0,0;GC_AMR=82,0,0;GC_ASJ=18,0,0;GC_EAS=35,0,0;GC_FIN=383,0,0;GC_NFE=677,0,0;GC_OTH=58,0,0;GC_Male=819,0,0;GC_Female=582,0,0;AC_raw=1;AN_raw=30346;AF_raw=3.29533e-05;GC_raw=15172,1,0;GC=1401,0,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=0;Hom=0;POPMAX=.;AC_POPMAX=.;AN_POPMAX=.;AF_POPMAX=.;DP_MEDIAN=6;DREF_MEDIAN=3.16178e-11;GQ_MEDIAN=38;AB_MEDIAN=6.66667e-01;AS_RF=9.22976e-02;AS_FilterStatus=RF|AC0;CSQ=T|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050098 . G A 242.82 RF AC=2;AF=2.40964e-04;AN=8300;BaseQRankSum=2.45000e+00;ClippingRankSum=1.03000e-01;DP=167171;FS=0.00000e+00;InbreedingCoeff=-1.46000e-02;MQ=3.06100e+01;MQRankSum=-9.35000e-01;QD=1.05600e+01;ReadPosRankSum=6.60000e-01;SOR=3.84000e-01;VQSLOD=-4.11500e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2;DP_HIST_ALT=0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0;GQ_HIST_ALL=350|1697|1483|3462|3106|1262|1746|994|348|436|237|88|141|14|39|5|22|4|8|7;DP_HIST_ALL=3368|7876|3165|776|212|33|16|3|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=2;AC_OTH=0;AC_Male=2;AC_Female=0;AN_AFR=1298;AN_AMR=334;AN_ASJ=84;AN_EAS=380;AN_FIN=1460;AN_NFE=4412;AN_OTH=332;AN_Male=4748;AN_Female=3552;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=4.53309e-04;AF_OTH=0.00000e+00;AF_Male=4.21230e-04;AF_Female=0.00000e+00;GC_AFR=649,0,0;GC_AMR=167,0,0;GC_ASJ=42,0,0;GC_EAS=190,0,0;GC_FIN=730,0,0;GC_NFE=2204,2,0;GC_OTH=166,0,0;GC_Male=2372,2,0;GC_Female=1776,0,0;AC_raw=2;AN_raw=30898;AF_raw=6.47291e-05;GC_raw=15447,2,0;GC=4148,2,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=0;Hom=0;POPMAX=NFE;AC_POPMAX=2;AN_POPMAX=4412;AF_POPMAX=4.53309e-04;DP_MEDIAN=11;DREF_MEDIAN=6.29479e-16;GQ_MEDIAN=99;AB_MEDIAN=4.80769e-01;AS_RF=3.30908e-01;AS_FilterStatus=RF;CSQ=A|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050115 rs587755077 G A 10684.53 RF AC=31;AF=2.54057e-03;AN=12202;BaseQRankSum=1.59000e+00;ClippingRankSum=6.70000e-02;DP=196906;FS=0.00000e+00;InbreedingCoeff=1.40000e-02;MQ=3.37700e+01;MQRankSum=4.06000e-01;QD=8.23000e+00;ReadPosRankSum=3.22000e-01;SOR=4.23100e+00;VQSLOD=-1.16300e+02;VQSR_culprit=MQ;GQ_HIST_ALT=3|6|10|5|3|3|6|13|17|16|2|3|9|12|8|11|5|3|3|14;DP_HIST_ALT=22|95|32|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|4|6|16|20|8|21|1|28|5|7|7|7|7|8|0|0|0;GQ_HIST_ALL=237|959|984|2740|3098|1328|2215|1483|527|685|442|163|289|52|79|25|61|6|27|39;DP_HIST_ALL=1972|7287|4327|1314|407|79|44|9|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|4|6|16|20|8|21|1|28|5|7|7|7|7|8|0|0|0;AC_AFR=30;AC_AMR=1;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=0;AC_OTH=0;AC_Male=16;AC_Female=15;AN_AFR=2236;AN_AMR=436;AN_ASJ=144;AN_EAS=640;AN_FIN=1862;AN_NFE=6410;AN_OTH=474;AN_Male=6874;AN_Female=5328;AF_AFR=1.34168e-02;AF_AMR=2.29358e-03;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=0.00000e+00;AF_OTH=0.00000e+00;AF_Male=2.32761e-03;AF_Female=2.81532e-03;GC_AFR=1088,30,0;GC_AMR=217,1,0;GC_ASJ=72,0,0;GC_EAS=320,0,0;GC_FIN=931,0,0;GC_NFE=3205,0,0;GC_OTH=237,0,0;GC_Male=3421,16,0;GC_Female=2649,15,0;AC_raw=159;AN_raw=30878;AF_raw=5.14930e-03;GC_raw=15287,145,7;GC=6070,31,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=7;Hom=0;POPMAX=AFR;AC_POPMAX=30;AN_POPMAX=2236;AF_POPMAX=1.34168e-02;DP_MEDIAN=7;DREF_MEDIAN=1.74246e-08;GQ_MEDIAN=48;AB_MEDIAN=4.44444e-01;AS_RF=5.02621e-02;AS_FilterStatus=RF;CSQ=A|intergenic_variant|MODIFIER|||||||||||||||rs587755077|1||||SNV|1||||||||||||||||A:0.0064|||||||||||||||||||||||||||| +22 16050116 . G C 28395.88 RF AC=246;AF=2.51431e-02;AN=9784;BaseQRankSum=2.48000e-01;ClippingRankSum=0.00000e+00;DP=201089;FS=0.00000e+00;InbreedingCoeff=-7.09000e-02;MQ=3.23400e+01;MQRankSum=-1.23100e+00;QD=3.27000e+00;ReadPosRankSum=2.48000e-01;SOR=7.16400e+00;VQSLOD=-3.11400e+02;VQSR_culprit=MQ;GQ_HIST_ALT=0|3|6|9|32|41|110|119|73|75|49|48|27|32|38|16|4|9|19|27;DP_HIST_ALT=21|356|285|60|12|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|11|105|184|174|98|40|64|2|30|5|11|8|2|2|0|0|0|0;GQ_HIST_ALL=2616|992|935|2244|2407|1109|1723|1219|458|593|382|175|259|62|105|27|46|11|38|55;DP_HIST_ALL=1838|7215|4403|1404|443|92|50|11|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|11|105|184|174|98|40|64|2|30|5|11|8|2|2|0|0|0|0;AC_AFR=18;AC_AMR=5;AC_ASJ=4;AC_EAS=3;AC_FIN=5;AC_NFE=202;AC_OTH=9;AC_Male=141;AC_Female=105;AN_AFR=2166;AN_AMR=402;AN_ASJ=88;AN_EAS=650;AN_FIN=1722;AN_NFE=4390;AN_OTH=366;AN_Male=5450;AN_Female=4334;AF_AFR=8.31025e-03;AF_AMR=1.24378e-02;AF_ASJ=4.54545e-02;AF_EAS=4.61538e-03;AF_FIN=2.90360e-03;AF_NFE=4.60137e-02;AF_OTH=2.45902e-02;AF_Male=2.58716e-02;AF_Female=2.42270e-02;GC_AFR=1065,18,0;GC_AMR=196,5,0;GC_ASJ=40,4,0;GC_EAS=322,3,0;GC_FIN=856,5,0;GC_NFE=1993,202,0;GC_OTH=174,9,0;GC_Male=2584,141,0;GC_Female=2062,105,0;AC_raw=738;AN_raw=30912;AF_raw=2.38742e-02;GC_raw=14719,736,1;GC=4646,246,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=1;Hom=0;POPMAX=NFE;AC_POPMAX=202;AN_POPMAX=4390;AF_POPMAX=4.60137e-02;DP_MEDIAN=9;DREF_MEDIAN=6.30918e-05;GQ_MEDIAN=42;AB_MEDIAN=2.50000e-01;AS_RF=8.65786e-03;AS_FilterStatus=RF;CSQ=C|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050129 . G GACA,C 1164.92 PASS AC=3,0;AF=1.81378e-04,0.00000e+00;AN=16540;BaseQRankSum=-2.24000e-01;ClippingRankSum=-2.63000e-01;DP=230703;FS=8.86700e+00;InbreedingCoeff=5.80000e-03;MQ=3.46800e+01;MQRankSum=1.43000e-01;QD=1.01300e+01;ReadPosRankSum=-2.13000e-01;SOR=3.30000e-02;VQSLOD=-1.37800e+00;VQSR_culprit=SOR;VQSR_NEGATIVE_TRAIN_SITE;GQ_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|4,0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0;DP_HIST_ALT=0|3|2|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0,0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|2|0|1|1|1|0|0|0|0|1|0|0|0|0,0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0;GQ_HIST_ALL=104|464|608|1985|2741|1441|2526|1859|721|1069|690|260|538|62|159|47|92|8|46|68;DP_HIST_ALL=1018|6123|5177|2097|791|161|97|24|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|2|0|1|1|1|0|1|0|0|1|0|0|0|0;AC_AFR=0,0;AC_AMR=0,0;AC_ASJ=0,0;AC_EAS=0,0;AC_FIN=0,0;AC_NFE=3,0;AC_OTH=0,0;AC_Male=3,0;AC_Female=0,0;AN_AFR=3614;AN_AMR=528;AN_ASJ=180;AN_EAS=892;AN_FIN=2256;AN_NFE=8466;AN_OTH=604;AN_Male=9308;AN_Female=7232;AF_AFR=0.00000e+00,0.00000e+00;AF_AMR=0.00000e+00,0.00000e+00;AF_ASJ=0.00000e+00,0.00000e+00;AF_EAS=0.00000e+00,0.00000e+00;AF_FIN=0.00000e+00,0.00000e+00;AF_NFE=3.54359e-04,0.00000e+00;AF_OTH=0.00000e+00,0.00000e+00;AF_Male=3.22303e-04,0.00000e+00;AF_Female=0.00000e+00,0.00000e+00;GC_AFR=1807,0,0,0,0,0;GC_AMR=264,0,0,0,0,0;GC_ASJ=90,0,0,0,0,0;GC_EAS=446,0,0,0,0,0;GC_FIN=1128,0,0,0,0,0;GC_NFE=4230,3,0,0,0,0;GC_OTH=302,0,0,0,0,0;GC_Male=4651,3,0,0,0,0;GC_Female=3616,0,0,0,0,0;AC_raw=6,1;AN_raw=30976;AF_raw=1.93698e-04,3.22831e-05;GC_raw=15481,6,0,1,0,0;GC=8267,3,0,0,0,0;Hom_AFR=0,0;Hom_AMR=0,0;Hom_ASJ=0,0;Hom_EAS=0,0;Hom_FIN=0,0;Hom_NFE=0,0;Hom_OTH=0,0;Hom_Male=0,0;Hom_Female=0,0;Hom_raw=0,0;Hom=0,0;POPMAX=NFE,.;AC_POPMAX=3,.;AN_POPMAX=8466,.;AF_POPMAX=3.54359e-04,.;DP_MEDIAN=10,8;DREF_MEDIAN=3.15558e-20,2.51189e-13;GQ_MEDIAN=99,72;AB_MEDIAN=4.41558e-01,6.25000e-01;AS_RF=5.16800e-01,3.29197e-01;AS_FilterStatus=PASS,RF|AC0;CSQ=C|intergenic_variant|MODIFIER||||||||||||||||2||||insertion|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050141 . C A 108.57 PASS AC=1;AF=5.09632e-05;AN=19622;BaseQRankSum=-7.51000e-01;ClippingRankSum=-1.43000e-01;DP=255559;FS=0.00000e+00;InbreedingCoeff=-4.70000e-03;MQ=3.40100e+01;MQRankSum=-3.32000e-01;QD=9.87000e+00;ReadPosRankSum=6.60000e-02;SOR=9.90000e-02;VQSLOD=-3.45100e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1;DP_HIST_ALT=0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0;GQ_HIST_ALL=90|295|443|1443|2398|1347|2546|2110|845|1318|842|356|727|79|237|59|159|7|90|99;DP_HIST_ALL=626|4935|5582|2741|1103|289|169|45|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=1;AC_OTH=0;AC_Male=1;AC_Female=0;AN_AFR=4696;AN_AMR=588;AN_ASJ=206;AN_EAS=1092;AN_FIN=2392;AN_NFE=9986;AN_OTH=662;AN_Male=10956;AN_Female=8666;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=1.00140e-04;AF_OTH=0.00000e+00;AF_Male=9.12742e-05;AF_Female=0.00000e+00;GC_AFR=2348,0,0;GC_AMR=294,0,0;GC_ASJ=103,0,0;GC_EAS=546,0,0;GC_FIN=1196,0,0;GC_NFE=4992,1,0;GC_OTH=331,0,0;GC_Male=5477,1,0;GC_Female=4333,0,0;AC_raw=1;AN_raw=30980;AF_raw=3.22789e-05;GC_raw=15489,1,0;GC=9810,1,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=0;Hom=0;POPMAX=NFE;AC_POPMAX=1;AN_POPMAX=9986;AF_POPMAX=1.00140e-04;DP_MEDIAN=11;DREF_MEDIAN=7.94328e-18;GQ_MEDIAN=99;AB_MEDIAN=5.45455e-01;AS_RF=4.14273e-01;AS_FilterStatus=PASS;CSQ=A|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050146 . A T 48.32 RF;AC0 AC=0;AF=0.00000e+00;AN=20636;BaseQRankSum=-3.54000e-01;ClippingRankSum=5.50000e-01;DP=264413;FS=2.76200e+00;InbreedingCoeff=-4.10000e-03;MQ=3.73000e+01;MQRankSum=2.00000e+00;QD=6.90000e+00;ReadPosRankSum=2.00000e+00;SOR=1.53600e+00;VQSLOD=-3.42700e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0;DP_HIST_ALT=0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0;GQ_HIST_ALL=84|258|359|1323|2262|1285|2499|2192|869|1402|937|374|819|84|270|69|176|10|92|126;DP_HIST_ALL=524|4533|5628|2926|1267|363|187|58|4|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=0;AC_OTH=0;AC_Male=0;AC_Female=0;AN_AFR=5074;AN_AMR=602;AN_ASJ=216;AN_EAS=1154;AN_FIN=2448;AN_NFE=10458;AN_OTH=684;AN_Male=11480;AN_Female=9156;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=0.00000e+00;AF_OTH=0.00000e+00;AF_Male=0.00000e+00;AF_Female=0.00000e+00;GC_AFR=2537,0,0;GC_AMR=301,0,0;GC_ASJ=108,0,0;GC_EAS=577,0,0;GC_FIN=1224,0,0;GC_NFE=5229,0,0;GC_OTH=342,0,0;GC_Male=5740,0,0;GC_Female=4578,0,0;AC_raw=1;AN_raw=30980;AF_raw=3.22789e-05;GC_raw=15489,1,0;GC=10318,0,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=0;Hom=0;POPMAX=.;AC_POPMAX=.;AN_POPMAX=.;AF_POPMAX=.;DP_MEDIAN=7;DREF_MEDIAN=1.00000e-11;GQ_MEDIAN=78;AB_MEDIAN=5.71429e-01;AS_RF=2.11047e-01;AS_FilterStatus=RF|AC0;CSQ=T|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| diff --git a/tests/cbcf_data/gnomad_fixed.vcf b/tests/cbcf_data/gnomad_fixed.vcf new file mode 100644 index 0000000..552a41a --- /dev/null +++ b/tests/cbcf_data/gnomad_fixed.vcf @@ -0,0 +1,200 @@ +##fileformat=VCFv4.2 +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FILTER= +##FILTER== 20, DP >= 10, AB => 0.2 for het calls))"> +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##reference=file:///seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta +#CHROM POS ID REF ALT QUAL FILTER INFO +22 16050036 rs374742143 A C 442156.34 RF AC=67;AF=4.29487e-01;AN=156;BaseQRankSum=7.36000e-01;ClippingRankSum=2.96000e-01;DB;DP=50165;FS=7.05600e+00;InbreedingCoeff=3.82000e-01;MQ=2.71500e+01;MQRankSum=-1.02600e+00;QD=2.47500e+01;ReadPosRankSum=-2.11000e-01;SOR=1.26750e+01;VQSLOD=-9.58600e+02;VQSR_culprit=MQ;GQ_HIST_ALT=16|1279|299|254|155|24|16|28|50|135|78|4|6|11|32|43|6|4|3|35;DP_HIST_ALT=1769|653|51|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|2|5|24|36|11|89|2|125|31|61|85|24|60|34|8|3|7;GQ_HIST_ALL=2359|2810|730|651|296|51|34|33|53|135|78|4|6|11|32|43|6|4|3|35;DP_HIST_ALL=5518|1756|94|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|2|5|24|36|11|89|2|125|31|61|85|24|60|34|8|3|7;AC_AFR=3;AC_AMR=7;AC_ASJ=0;AC_EAS=0;AC_FIN=50;AC_NFE=3;AC_OTH=4;AC_Male=32;AC_Female=35;AN_AFR=14;AN_AMR=10;AN_ASJ=0;AN_EAS=0;AN_FIN=84;AN_NFE=42;AN_OTH=6;AN_Male=80;AN_Female=76;AF_AFR=2.14286e-01;AF_AMR=7.00000e-01;AF_ASJ=.;AF_EAS=.;AF_FIN=5.95238e-01;AF_NFE=7.14286e-02;AF_OTH=6.66667e-01;AF_Male=4.00000e-01;AF_Female=4.60526e-01;GC_AFR=4,3,0;GC_AMR=0,3,2;GC_ASJ=0,0,0;GC_EAS=0,0,0;GC_FIN=4,26,12;GC_NFE=18,3,0;GC_OTH=1,0,2;GC_Male=16,16,8;GC_Female=11,19,8;AC_raw=4349;AN_raw=14748;AF_raw=2.94887e-01;GC_raw=4896,607,1871;GC=27,35,16;Hom_AFR=0;Hom_AMR=2;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=12;Hom_NFE=0;Hom_OTH=2;Hom_Male=8;Hom_Female=8;Hom_raw=1871;Hom=16;POPMAX=AMR;AC_POPMAX=7;AN_POPMAX=10;AF_POPMAX=7.00000e-01;DP_MEDIAN=3;DREF_MEDIAN=5.60406e-10;GQ_MEDIAN=12;AB_MEDIAN=5.55556e-01;AS_RF=4.71609e-02;AS_FilterStatus=RF;CSQ=C|intergenic_variant|MODIFIER|||||||||||||||rs374742143|1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050068 . A G 82.46 RF;AC0 AC=0;AF=0.00000e+00;AN=2708;DP=111486;FS=0.00000e+00;InbreedingCoeff=-3.63000e-02;MQ=3.20200e+01;QD=1.64900e+01;SOR=3.61100e+00;VQSLOD=-9.28900e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;DP_HIST_ALT=0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;GQ_HIST_ALL=1227|4189|2184|3537|2071|618|693|346|97|92|61|9|18|0|7|4|4|0|0|0;DP_HIST_ALL=7502|6289|1163|169|26|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=0;AC_OTH=0;AC_Male=0;AC_Female=0;AN_AFR=280;AN_AMR=162;AN_ASJ=34;AN_EAS=74;AN_FIN=748;AN_NFE=1300;AN_OTH=110;AN_Male=1584;AN_Female=1124;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=0.00000e+00;AF_OTH=0.00000e+00;AF_Male=0.00000e+00;AF_Female=0.00000e+00;GC_AFR=140,0,0;GC_AMR=81,0,0;GC_ASJ=17,0,0;GC_EAS=37,0,0;GC_FIN=374,0,0;GC_NFE=650,0,0;GC_OTH=55,0,0;GC_Male=792,0,0;GC_Female=562,0,0;AC_raw=2;AN_raw=30314;AF_raw=6.59761e-05;GC_raw=15156,0,1;GC=1354,0,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=1;Hom=0;POPMAX=.;AC_POPMAX=.;AN_POPMAX=.;AF_POPMAX=.;DP_MEDIAN=5;DREF_MEDIAN=1.22034e-16;GQ_MEDIAN=15;AB_MEDIAN=5.00000e-01;AS_RF=5.87186e-02;AS_FilterStatus=RF|AC0;CSQ=G|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050069 . C T 43.44 RF;AC0 AC=0;AF=0.00000e+00;AN=2802;BaseQRankSum=7.20000e-01;ClippingRankSum=-1.38000e+00;DP=112972;FS=0.00000e+00;InbreedingCoeff=-3.70000e-02;MQ=3.67700e+01;MQRankSum=7.20000e-01;QD=7.24000e+00;ReadPosRankSum=1.38000e+00;SOR=1.32900e+00;VQSLOD=-3.27400e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0;DP_HIST_ALT=0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0;GQ_HIST_ALL=1200|4098|2219|3540|2117|622|710|352|104|101|64|10|20|1|8|3|4|0|0|0;DP_HIST_ALL=7405|6348|1203|181|28|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=0;AC_OTH=0;AC_Male=0;AC_Female=0;AN_AFR=296;AN_AMR=164;AN_ASJ=36;AN_EAS=70;AN_FIN=766;AN_NFE=1354;AN_OTH=116;AN_Male=1638;AN_Female=1164;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=0.00000e+00;AF_OTH=0.00000e+00;AF_Male=0.00000e+00;AF_Female=0.00000e+00;GC_AFR=148,0,0;GC_AMR=82,0,0;GC_ASJ=18,0,0;GC_EAS=35,0,0;GC_FIN=383,0,0;GC_NFE=677,0,0;GC_OTH=58,0,0;GC_Male=819,0,0;GC_Female=582,0,0;AC_raw=1;AN_raw=30346;AF_raw=3.29533e-05;GC_raw=15172,1,0;GC=1401,0,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=0;Hom=0;POPMAX=.;AC_POPMAX=.;AN_POPMAX=.;AF_POPMAX=.;DP_MEDIAN=6;DREF_MEDIAN=3.16178e-11;GQ_MEDIAN=38;AB_MEDIAN=6.66667e-01;AS_RF=9.22976e-02;AS_FilterStatus=RF|AC0;CSQ=T|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050098 . G A 242.82 RF AC=2;AF=2.40964e-04;AN=8300;BaseQRankSum=2.45000e+00;ClippingRankSum=1.03000e-01;DP=167171;FS=0.00000e+00;InbreedingCoeff=-1.46000e-02;MQ=3.06100e+01;MQRankSum=-9.35000e-01;QD=1.05600e+01;ReadPosRankSum=6.60000e-01;SOR=3.84000e-01;VQSLOD=-4.11500e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2;DP_HIST_ALT=0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0;GQ_HIST_ALL=350|1697|1483|3462|3106|1262|1746|994|348|436|237|88|141|14|39|5|22|4|8|7;DP_HIST_ALL=3368|7876|3165|776|212|33|16|3|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=2;AC_OTH=0;AC_Male=2;AC_Female=0;AN_AFR=1298;AN_AMR=334;AN_ASJ=84;AN_EAS=380;AN_FIN=1460;AN_NFE=4412;AN_OTH=332;AN_Male=4748;AN_Female=3552;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=4.53309e-04;AF_OTH=0.00000e+00;AF_Male=4.21230e-04;AF_Female=0.00000e+00;GC_AFR=649,0,0;GC_AMR=167,0,0;GC_ASJ=42,0,0;GC_EAS=190,0,0;GC_FIN=730,0,0;GC_NFE=2204,2,0;GC_OTH=166,0,0;GC_Male=2372,2,0;GC_Female=1776,0,0;AC_raw=2;AN_raw=30898;AF_raw=6.47291e-05;GC_raw=15447,2,0;GC=4148,2,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=0;Hom=0;POPMAX=NFE;AC_POPMAX=2;AN_POPMAX=4412;AF_POPMAX=4.53309e-04;DP_MEDIAN=11;DREF_MEDIAN=6.29479e-16;GQ_MEDIAN=99;AB_MEDIAN=4.80769e-01;AS_RF=3.30908e-01;AS_FilterStatus=RF;CSQ=A|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050115 rs587755077 G A 10684.53 RF AC=31;AF=2.54057e-03;AN=12202;BaseQRankSum=1.59000e+00;ClippingRankSum=6.70000e-02;DP=196906;FS=0.00000e+00;InbreedingCoeff=1.40000e-02;MQ=3.37700e+01;MQRankSum=4.06000e-01;QD=8.23000e+00;ReadPosRankSum=3.22000e-01;SOR=4.23100e+00;VQSLOD=-1.16300e+02;VQSR_culprit=MQ;GQ_HIST_ALT=3|6|10|5|3|3|6|13|17|16|2|3|9|12|8|11|5|3|3|14;DP_HIST_ALT=22|95|32|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|4|6|16|20|8|21|1|28|5|7|7|7|7|8|0|0|0;GQ_HIST_ALL=237|959|984|2740|3098|1328|2215|1483|527|685|442|163|289|52|79|25|61|6|27|39;DP_HIST_ALL=1972|7287|4327|1314|407|79|44|9|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|4|6|16|20|8|21|1|28|5|7|7|7|7|8|0|0|0;AC_AFR=30;AC_AMR=1;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=0;AC_OTH=0;AC_Male=16;AC_Female=15;AN_AFR=2236;AN_AMR=436;AN_ASJ=144;AN_EAS=640;AN_FIN=1862;AN_NFE=6410;AN_OTH=474;AN_Male=6874;AN_Female=5328;AF_AFR=1.34168e-02;AF_AMR=2.29358e-03;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=0.00000e+00;AF_OTH=0.00000e+00;AF_Male=2.32761e-03;AF_Female=2.81532e-03;GC_AFR=1088,30,0;GC_AMR=217,1,0;GC_ASJ=72,0,0;GC_EAS=320,0,0;GC_FIN=931,0,0;GC_NFE=3205,0,0;GC_OTH=237,0,0;GC_Male=3421,16,0;GC_Female=2649,15,0;AC_raw=159;AN_raw=30878;AF_raw=5.14930e-03;GC_raw=15287,145,7;GC=6070,31,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=7;Hom=0;POPMAX=AFR;AC_POPMAX=30;AN_POPMAX=2236;AF_POPMAX=1.34168e-02;DP_MEDIAN=7;DREF_MEDIAN=1.74246e-08;GQ_MEDIAN=48;AB_MEDIAN=4.44444e-01;AS_RF=5.02621e-02;AS_FilterStatus=RF;CSQ=A|intergenic_variant|MODIFIER|||||||||||||||rs587755077|1||||SNV|1||||||||||||||||A:0.0064|||||||||||||||||||||||||||| +22 16050116 . G C 28395.88 RF AC=246;AF=2.51431e-02;AN=9784;BaseQRankSum=2.48000e-01;ClippingRankSum=0.00000e+00;DP=201089;FS=0.00000e+00;InbreedingCoeff=-7.09000e-02;MQ=3.23400e+01;MQRankSum=-1.23100e+00;QD=3.27000e+00;ReadPosRankSum=2.48000e-01;SOR=7.16400e+00;VQSLOD=-3.11400e+02;VQSR_culprit=MQ;GQ_HIST_ALT=0|3|6|9|32|41|110|119|73|75|49|48|27|32|38|16|4|9|19|27;DP_HIST_ALT=21|356|285|60|12|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|11|105|184|174|98|40|64|2|30|5|11|8|2|2|0|0|0|0;GQ_HIST_ALL=2616|992|935|2244|2407|1109|1723|1219|458|593|382|175|259|62|105|27|46|11|38|55;DP_HIST_ALL=1838|7215|4403|1404|443|92|50|11|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|11|105|184|174|98|40|64|2|30|5|11|8|2|2|0|0|0|0;AC_AFR=18;AC_AMR=5;AC_ASJ=4;AC_EAS=3;AC_FIN=5;AC_NFE=202;AC_OTH=9;AC_Male=141;AC_Female=105;AN_AFR=2166;AN_AMR=402;AN_ASJ=88;AN_EAS=650;AN_FIN=1722;AN_NFE=4390;AN_OTH=366;AN_Male=5450;AN_Female=4334;AF_AFR=8.31025e-03;AF_AMR=1.24378e-02;AF_ASJ=4.54545e-02;AF_EAS=4.61538e-03;AF_FIN=2.90360e-03;AF_NFE=4.60137e-02;AF_OTH=2.45902e-02;AF_Male=2.58716e-02;AF_Female=2.42270e-02;GC_AFR=1065,18,0;GC_AMR=196,5,0;GC_ASJ=40,4,0;GC_EAS=322,3,0;GC_FIN=856,5,0;GC_NFE=1993,202,0;GC_OTH=174,9,0;GC_Male=2584,141,0;GC_Female=2062,105,0;AC_raw=738;AN_raw=30912;AF_raw=2.38742e-02;GC_raw=14719,736,1;GC=4646,246,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=1;Hom=0;POPMAX=NFE;AC_POPMAX=202;AN_POPMAX=4390;AF_POPMAX=4.60137e-02;DP_MEDIAN=9;DREF_MEDIAN=6.30918e-05;GQ_MEDIAN=42;AB_MEDIAN=2.50000e-01;AS_RF=8.65786e-03;AS_FilterStatus=RF;CSQ=C|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050129 . G GACA,C 1164.92 PASS AC=3,0;AF=1.81378e-04,0.00000e+00;AN=16540;BaseQRankSum=-2.24000e-01;ClippingRankSum=-2.63000e-01;DP=230703;FS=8.86700e+00;InbreedingCoeff=5.80000e-03;MQ=3.46800e+01;MQRankSum=1.43000e-01;QD=1.01300e+01;ReadPosRankSum=-2.13000e-01;SOR=3.30000e-02;VQSLOD=-1.37800e+00;VQSR_culprit=SOR;VQSR_NEGATIVE_TRAIN_SITE;GQ_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|4,0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0;DP_HIST_ALT=0|3|2|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0,0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|2|0|1|1|1|0|0|0|0|1|0|0|0|0,0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0;GQ_HIST_ALL=104|464|608|1985|2741|1441|2526|1859|721|1069|690|260|538|62|159|47|92|8|46|68;DP_HIST_ALL=1018|6123|5177|2097|791|161|97|24|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|2|0|1|1|1|0|1|0|0|1|0|0|0|0;AC_AFR=0,0;AC_AMR=0,0;AC_ASJ=0,0;AC_EAS=0,0;AC_FIN=0,0;AC_NFE=3,0;AC_OTH=0,0;AC_Male=3,0;AC_Female=0,0;AN_AFR=3614;AN_AMR=528;AN_ASJ=180;AN_EAS=892;AN_FIN=2256;AN_NFE=8466;AN_OTH=604;AN_Male=9308;AN_Female=7232;AF_AFR=0.00000e+00,0.00000e+00;AF_AMR=0.00000e+00,0.00000e+00;AF_ASJ=0.00000e+00,0.00000e+00;AF_EAS=0.00000e+00,0.00000e+00;AF_FIN=0.00000e+00,0.00000e+00;AF_NFE=3.54359e-04,0.00000e+00;AF_OTH=0.00000e+00,0.00000e+00;AF_Male=3.22303e-04,0.00000e+00;AF_Female=0.00000e+00,0.00000e+00;GC_AFR=1807,0,0,0,0,0;GC_AMR=264,0,0,0,0,0;GC_ASJ=90,0,0,0,0,0;GC_EAS=446,0,0,0,0,0;GC_FIN=1128,0,0,0,0,0;GC_NFE=4230,3,0,0,0,0;GC_OTH=302,0,0,0,0,0;GC_Male=4651,3,0,0,0,0;GC_Female=3616,0,0,0,0,0;AC_raw=6,1;AN_raw=30976;AF_raw=1.93698e-04,3.22831e-05;GC_raw=15481,6,0,1,0,0;GC=8267,3,0,0,0,0;Hom_AFR=0,0;Hom_AMR=0,0;Hom_ASJ=0,0;Hom_EAS=0,0;Hom_FIN=0,0;Hom_NFE=0,0;Hom_OTH=0,0;Hom_Male=0,0;Hom_Female=0,0;Hom_raw=0,0;Hom=0,0;POPMAX=NFE,.;AC_POPMAX=3,.;AN_POPMAX=8466,.;AF_POPMAX=3.54359e-04,.;DP_MEDIAN=10,8;DREF_MEDIAN=3.15558e-20,2.51189e-13;GQ_MEDIAN=99,72;AB_MEDIAN=4.41558e-01,6.25000e-01;AS_RF=5.16800e-01,3.29197e-01;AS_FilterStatus=PASS,RF|AC0;CSQ=C|intergenic_variant|MODIFIER||||||||||||||||2||||insertion|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050141 . C A 108.57 PASS AC=1;AF=5.09632e-05;AN=19622;BaseQRankSum=-7.51000e-01;ClippingRankSum=-1.43000e-01;DP=255559;FS=0.00000e+00;InbreedingCoeff=-4.70000e-03;MQ=3.40100e+01;MQRankSum=-3.32000e-01;QD=9.87000e+00;ReadPosRankSum=6.60000e-02;SOR=9.90000e-02;VQSLOD=-3.45100e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1;DP_HIST_ALT=0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0;GQ_HIST_ALL=90|295|443|1443|2398|1347|2546|2110|845|1318|842|356|727|79|237|59|159|7|90|99;DP_HIST_ALL=626|4935|5582|2741|1103|289|169|45|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=1;AC_OTH=0;AC_Male=1;AC_Female=0;AN_AFR=4696;AN_AMR=588;AN_ASJ=206;AN_EAS=1092;AN_FIN=2392;AN_NFE=9986;AN_OTH=662;AN_Male=10956;AN_Female=8666;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=1.00140e-04;AF_OTH=0.00000e+00;AF_Male=9.12742e-05;AF_Female=0.00000e+00;GC_AFR=2348,0,0;GC_AMR=294,0,0;GC_ASJ=103,0,0;GC_EAS=546,0,0;GC_FIN=1196,0,0;GC_NFE=4992,1,0;GC_OTH=331,0,0;GC_Male=5477,1,0;GC_Female=4333,0,0;AC_raw=1;AN_raw=30980;AF_raw=3.22789e-05;GC_raw=15489,1,0;GC=9810,1,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=0;Hom=0;POPMAX=NFE;AC_POPMAX=1;AN_POPMAX=9986;AF_POPMAX=1.00140e-04;DP_MEDIAN=11;DREF_MEDIAN=7.94328e-18;GQ_MEDIAN=99;AB_MEDIAN=5.45455e-01;AS_RF=4.14273e-01;AS_FilterStatus=PASS;CSQ=A|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| +22 16050146 . A T 48.32 RF;AC0 AC=0;AF=0.00000e+00;AN=20636;BaseQRankSum=-3.54000e-01;ClippingRankSum=5.50000e-01;DP=264413;FS=2.76200e+00;InbreedingCoeff=-4.10000e-03;MQ=3.73000e+01;MQRankSum=2.00000e+00;QD=6.90000e+00;ReadPosRankSum=2.00000e+00;SOR=1.53600e+00;VQSLOD=-3.42700e+01;VQSR_culprit=MQ;GQ_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0;DP_HIST_ALT=0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALT=0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0;GQ_HIST_ALL=84|258|359|1323|2262|1285|2499|2192|869|1402|937|374|819|84|270|69|176|10|92|126;DP_HIST_ALL=524|4533|5628|2926|1267|363|187|58|4|0|0|0|0|0|0|0|0|0|0|0;AB_HIST_ALL=0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0;AC_AFR=0;AC_AMR=0;AC_ASJ=0;AC_EAS=0;AC_FIN=0;AC_NFE=0;AC_OTH=0;AC_Male=0;AC_Female=0;AN_AFR=5074;AN_AMR=602;AN_ASJ=216;AN_EAS=1154;AN_FIN=2448;AN_NFE=10458;AN_OTH=684;AN_Male=11480;AN_Female=9156;AF_AFR=0.00000e+00;AF_AMR=0.00000e+00;AF_ASJ=0.00000e+00;AF_EAS=0.00000e+00;AF_FIN=0.00000e+00;AF_NFE=0.00000e+00;AF_OTH=0.00000e+00;AF_Male=0.00000e+00;AF_Female=0.00000e+00;GC_AFR=2537,0,0;GC_AMR=301,0,0;GC_ASJ=108,0,0;GC_EAS=577,0,0;GC_FIN=1224,0,0;GC_NFE=5229,0,0;GC_OTH=342,0,0;GC_Male=5740,0,0;GC_Female=4578,0,0;AC_raw=1;AN_raw=30980;AF_raw=3.22789e-05;GC_raw=15489,1,0;GC=10318,0,0;Hom_AFR=0;Hom_AMR=0;Hom_ASJ=0;Hom_EAS=0;Hom_FIN=0;Hom_NFE=0;Hom_OTH=0;Hom_Male=0;Hom_Female=0;Hom_raw=0;Hom=0;POPMAX=.;AC_POPMAX=.;AN_POPMAX=.;AF_POPMAX=.;DP_MEDIAN=7;DREF_MEDIAN=1.00000e-11;GQ_MEDIAN=78;AB_MEDIAN=5.71429e-01;AS_RF=2.11047e-01;AS_FilterStatus=RF|AC0;CSQ=T|intergenic_variant|MODIFIER||||||||||||||||1||||SNV|1|||||||||||||||||||||||||||||||||||||||||||| diff --git a/tests/cbcf_data/missing_genotypes.vcf b/tests/cbcf_data/missing_genotypes.vcf new file mode 100644 index 0000000..a6f0dbc --- /dev/null +++ b/tests/cbcf_data/missing_genotypes.vcf @@ -0,0 +1,6 @@ +##fileformat=VCFv4.1 +##contig= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT sample1 sample2 +chr1 1 . A G 999 . . GT 0/0 1/1 +chr1 50 . T C 999 . . GT ./. 0/1 diff --git a/tests/compile_test.py b/tests/compile_test.py new file mode 100644 index 0000000..300ab92 --- /dev/null +++ b/tests/compile_test.py @@ -0,0 +1,54 @@ +''' +compile_test.py - check pyximport functionality with pysam +========================================================== + +test script for checking if compilation against +pysam and tabix works. +''' + +# clean up previous compilation +import os +import unittest +import pysam +from TestUtils import make_data_files, BAM_DATADIR, TABIX_DATADIR + + +def setUpModule(): + make_data_files(BAM_DATADIR) + make_data_files(TABIX_DATADIR) + + +try: + os.unlink('tests/_compile_test.c') + os.unlink('tests/_compile_test.pyxbldc') +except OSError: + pass + +import pyximport +pyximport.install(build_in_temp=False) +import _compile_test + + +class BAMTest(unittest.TestCase): + + input_filename = os.path.join(BAM_DATADIR, "ex1.bam") + + def testCount(self): + + nread = _compile_test.testCountBAM( + pysam.Samfile(self.input_filename)) + self.assertEqual(nread, 3270) + + +class GTFTest(unittest.TestCase): + + input_filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + + def testCount(self): + nread = _compile_test.testCountGTF( + pysam.Tabixfile(self.input_filename)) + self.assertEqual(nread, 237) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/faidx_bench.py b/tests/faidx_bench.py new file mode 100644 index 0000000..c167336 --- /dev/null +++ b/tests/faidx_bench.py @@ -0,0 +1,71 @@ +"""Benchmarking the cfaidx module. Usage:: + +pytest benchmark/faidx_bench.py +""" +import os +import pysam + + +from TestUtils import BAM_DATADIR + + +def iterate_over_fastx(fn, persist=True): + return len(list(pysam.FastxFile(fn, persist=persist))) + + +def iterate_over_fastx_as_file(fn): + with open(fn) as inf: + return len(inf.read()) + + +def test_fasta_iteration_short_sequences(benchmark): + result = benchmark(iterate_over_fastx, os.path.join( + BAM_DATADIR, "faidx_ex1.fa")) + assert result == 3270 + + +def test_fasta_iteration_long_sequences(benchmark): + result = benchmark(iterate_over_fastx, os.path.join(BAM_DATADIR, "ex1.fa")) + assert result == 2 + + +def test_fasta_iteration_short_sequences_without_persistence(benchmark): + result = benchmark(iterate_over_fastx, os.path.join( + BAM_DATADIR, "faidx_ex1.fa"), persist=False) + assert result == 3270 + + +def test_fasta_iteration_long_sequences_without_persistence(benchmark): + result = benchmark(iterate_over_fastx, os.path.join( + BAM_DATADIR, "ex1.fa"), persist=False) + assert result == 2 + + +def test_fasta_iteration_short_sequences_as_file(benchmark): + result = benchmark(iterate_over_fastx_as_file, + os.path.join(BAM_DATADIR, "faidx_ex1.fa")) + assert result == 195399 + + +def test_fasta_iteration_long_sequences_as_file(benchmark): + result = benchmark(iterate_over_fastx_as_file, + os.path.join(BAM_DATADIR, "ex1.fa")) + assert result == 3225 + + +def test_fastq_iteration_short_sequences(benchmark): + result = benchmark(iterate_over_fastx, os.path.join( + BAM_DATADIR, "faidx_ex1.fq")) + assert result == 3270 + + +def test_fastq_iteration_short_sequences_without_persistence(benchmark): + result = benchmark(iterate_over_fastx, os.path.join( + BAM_DATADIR, "faidx_ex1.fq"), persist=False) + assert result == 3270 + + +def test_fastq_iteration_short_sequences_as_file(benchmark): + result = benchmark(iterate_over_fastx_as_file, + os.path.join(BAM_DATADIR, "faidx_ex1.fq")) + assert result == 320458 diff --git a/tests/faidx_test.py b/tests/faidx_test.py new file mode 100644 index 0000000..8718f98 --- /dev/null +++ b/tests/faidx_test.py @@ -0,0 +1,344 @@ +import pysam +import unittest +import os +import gzip +import copy +import shutil + +from TestUtils import check_url, make_data_files, BAM_DATADIR, get_temp_filename + + +def setUpModule(): + make_data_files(BAM_DATADIR) + + +class TestFastaFile(unittest.TestCase): + + sequences = { + 'chr1': + "CACTAGTGGCTCATTGTAAATGTGTGGTTTAACTCGTCCATGGCCCAGCATTAGGGAGCTGTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTGGCTGAGGGGTGCAGAGCCGAGTCACGGGGTTGCCAGCACAGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTAATGAAAACTATATTTATGCTATTCAGTTCTAAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAACCTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGGACCTGTGATATCTGGATTCTGGGAAATTCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAGCCATCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCAACCTCATACACACACATGGTTTAGGGGTATAATACCTCTACATGGCTGATTATGAAAACAATGTTCCCCAGATACCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCCTACACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATACATGAGATTATTAGGAAATGCTTTACTGTCATAACTATGAAGAGACTATTGCCAGATGAACCACACATTAATACTATGTTTCTTATCTGCACATTACTACCCTGCAATTAATATAATTGTGTCCATGTACACACGCTGTCCTATGTACTTATCATGACTCTATCCCAAATTCCCAATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACATAATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGATTTTTAATGATTCCTCAATGTTAAAATGTCTATTTTTGTCTTGACACCCAACTAATATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGTCTTCTTA", # noqa + 'chr2': + "TTCAAATGAACTTCTGTAATTGAAAAATTCATTTAAGAAATTACAAAATATAGTTGAAAGCTCTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGAATTAACCCAGTCAGACAAAAATAAAGAAAAAAATTTTAAAAATGAACAGAGCTTTCAAGAAGTATGAGATTATGTAAAGTAACTGAACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCAAGACAGACTTCATCAAGATATGTAGTCATCAGACTATCTAAAGTCAACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGGAAATCCCATCAGAATAACAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAAGAGATTGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGTTATGCCCTGCTAAACTAAGCATCATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATAATTCATCATCACTAAACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAATACACACAAAAGTACAAAACTCACAGGTTTTATAAAACAATTGAGACTACAGAGCAACTAGGTAAAAAATTAACATTACAACAGGAACAAAACCTCATATATCAATATTAACTTTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAAAAACATGAACTAACTATATGCTGTTTACAAGAAACTCATTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAAACCAAATGAGAGAAGGAGTAGCTATACTTATATCAGATAAAGCACACTTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTCATCATACAATGATAAAAAGATCAATTCAGCAAGAAGATATAACCATCCTACTAAATACATATGCACCTAACACAAGACTACCCAGATTCATAAAACAAATACTACTAGACCTAAGAGGGATGAGAAATTACCTAATTGGTACAATGTACAATATTCTGATGATGGTTACACTAAAAGCCCATACTTTACTGCTACTCAATATATCCATGTAACAAATCTGCGCTTGTACTTCTAAATCTATAAAAAAATTAAAATTTAACAAAAGTAAATAAAACACATAGCTAAAACTAAAAAAGCAAAAACAAAAACTATGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTATAAATTGTTTTCCACTTTGGAAAACAATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTTGCATGCCAGAAAAAAATATTTACAGTAACT", # noqa + } + + def setUp(self): + self.file = pysam.FastaFile(os.path.join(BAM_DATADIR, "ex1.fa")) + + def testFetch(self): + for id, seq in list(self.sequences.items()): + self.assertEqual(seq, self.file.fetch(id)) + for x in range(0, len(seq), 10): + self.assertEqual(seq[x:x + 10], self.file.fetch(id, x, x + 10)) + # test x:end + self.assertEqual(seq[x:], self.file.fetch(id, x)) + # test 0:x + self.assertEqual(seq[:x], self.file.fetch(id, None, x)) + + # unknown sequence raises IndexError + self.assertRaises(KeyError, self.file.fetch, "chr12") + + def testOutOfRangeAccess(self): + '''test out of range access.''' + # out of range access returns an empty string + for contig, s in self.sequences.items(): + self.assertEqual(self.file.fetch(contig, len(s), len(s) + 1), "") + + def testFetchErrors(self): + self.assertRaises(ValueError, self.file.fetch) + self.assertRaises(ValueError, self.file.fetch, "chr1", -1, 10) + self.assertRaises(ValueError, self.file.fetch, "chr1", 20, 10) + self.assertRaises(KeyError, self.file.fetch, "chr3", 0, 100) + + def test_fetch_with_region_and_contig_raises_exception(self): + self.assertRaises(ValueError, self.file.fetch, "chr1", 10, 20, "chr1:11-20") + + def test_fetch_with_region_is_equivalent(self): + self.assertEqual(self.file.fetch("chr1", 10, 20), + self.file.fetch(region="chr1:11-20")) + + def testLength(self): + self.assertEqual(len(self.file), 2) + + def testSequenceLengths(self): + self.assertEqual(1575, self.file.get_reference_length("chr1")) + self.assertEqual(1584, self.file.get_reference_length("chr2")) + + def tearDown(self): + self.file.close() + + +class TestFastaFilePathIndex(unittest.TestCase): + + filename = os.path.join(BAM_DATADIR, "ex1.fa") + data_suffix = ".fa" + + def test_raise_exception_if_index_is_missing(self): + self.assertRaises(IOError, + pysam.FastaFile, + self.filename, + filepath_index="garbage" + self.data_suffix + ".fai") + + def test_open_file_without_index_succeeds(self): + with pysam.FastaFile(self.filename) as inf: + self.assertEqual(len(inf), 2) + + def test_open_file_with_explicit_index_succeeds(self): + with pysam.FastaFile(self.filename, + filepath_index=self.filename + ".fai") as inf: + self.assertEqual(len(inf), 2) + + def test_open_file_with_explicit_abritrarily_named_index_succeeds(self): + tmpfilename = get_temp_filename(self.data_suffix) + shutil.copyfile(self.filename, tmpfilename) + + filepath_index = self.filename + ".fai" + filepath_index_compressed = self.filename + ".gzi" + if not os.path.exists(filepath_index_compressed): + filepath_index_compressed = None + with pysam.FastaFile(tmpfilename, + filepath_index=filepath_index, + filepath_index_compressed=filepath_index_compressed) as inf: + self.assertEqual(len(inf), 2) + + # index should not be auto-generated + self.assertFalse(os.path.exists(tmpfilename + ".fai")) + os.unlink(tmpfilename) + + +class TestFastaFilePathIndexCompressed(TestFastaFilePathIndex): + + filename = os.path.join(BAM_DATADIR, "ex1.fa.gz") + data_suffix = ".fa.gz" + + +class TestFastxFileFastq(unittest.TestCase): + + filetype = pysam.FastxFile + filename = "faidx_ex1.fq" + persist = True + + def setUp(self): + self.file = self.filetype(os.path.join(BAM_DATADIR, self.filename), + persist=self.persist) + self.has_quality = self.filename.endswith('.fq') + + def tearDown(self): + self.file.close() + + def checkFirst(self, s): + # test first entry + self.assertEqual(s.sequence, "GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC") + self.assertEqual(s.name, "B7_589:1:101:825:28") + if self.has_quality: + self.assertEqual(s.quality, "<<86<<;<78<<<)<;4<67<;<;<74-7;,;8,;") + self.assertEqual(list(s.get_quality_array()), + [ord(x) - 33 for x in s.quality]) + self.assertEqual(str(s), + "@B7_589:1:101:825:28\n" + "GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC\n" + "+\n" + "<<86<<;<78<<<)<;4<67<;<;<74-7;,;8,;") + + else: + self.assertEqual(s.quality, None) + self.assertEqual(s.get_quality_array(), None) + self.assertEqual(str(s), + ">B7_589:1:101:825:28\n" + "GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC") + + def checkLast(self, s): + self.assertEqual(s.sequence, "TAATTGAAAAATTCATTTAAGAAATTACAAAATAT") + self.assertEqual(s.name, "EAS56_65:8:64:507:478") + if self.has_quality: + self.assertEqual(s.quality, "<<<<<;<<<<<<<<<<<<<<<;;;<<<;<<8;<;<") + self.assertEqual(list(s.get_quality_array()), + [ord(x) - 33 for x in s.quality]) + else: + self.assertEqual(s.quality, None) + self.assertEqual(s.get_quality_array(), None) + + def testCounts(self): + self.assertEqual(len([x for x in self.file]), 3270) + + def testMissingFile(self): + self.assertRaises(IOError, self.filetype, "nothere.fq") + + def testSequence(self): + first = self.file.__next__() + self.checkFirst(first) + for last in self.file: + pass + self.checkLast(last) + + # test for persistence + if self.persist: + self.checkFirst(first) + else: + self.checkLast(first) + + def testManager(self): + with self.filetype(os.path.join(BAM_DATADIR, self.filename), + persist=self.persist) as inf: + first = inf.__next__() + self.checkFirst(first) + for last in inf: + pass + self.checkLast(last) + + self.assertEqual(inf.closed, True) + + +# Test for backwards compatibility +class TestFastqFileFastq(TestFastxFileFastq): + filetype = pysam.FastqFile + + +# Test for backwards compatibility +class TestFastxFileFasta(TestFastxFileFastq): + filetype = pysam.FastqFile + filename = "faidx_ex1.fa" + + +class TestFastxFileFastqStream(TestFastxFileFastq): + persist = False + + +class TestFastxFileWithEmptySequence(unittest.TestCase): + """see issue 204: + + iteration over fastq file with empty sequence stops prematurely + """ + + filetype = pysam.FastxFile + filename = "faidx_empty_seq.fq.gz" + + def testIteration(self): + fn = os.path.join(BAM_DATADIR, self.filename) + + with gzip.open(fn) as inf: + ref_num = len(list(inf)) / 4 + + with self.filetype(fn) as f: + l = len(list(f)) + self.assertEqual(ref_num, l) + + +class TestRemoteFileFTP(unittest.TestCase): + '''test remote access. + ''' + + url = ("ftp://ftp-trace.ncbi.nih.gov/1000genomes/ftp/technical/reference/" + "GRCh38_reference_genome/GRCh38_full_analysis_set_plus_decoy_hla.fa") + + def testFTPView(self): + if not check_url(self.url): + return + + try: + with pysam.Fastafile(self.url) as f: + self.assertEqual( + len(f.fetch("chr1", 0, 1000)), + 1000) + except (OSError, IOError): + pass + + def test_sequence_lengths_are_available(self): + if not check_url(self.url): + return + + try: + with pysam.Fastafile(self.url) as f: + self.assertEqual(len(f.references), 3366) + self.assertTrue("chr1" in f.references) + self.assertEqual(f.lengths[0], + 248956422) + self.assertEqual(f.get_reference_length("chr1"), + 248956422) + except (OSError, IOError): + pass + + +class TestFastqRecord(unittest.TestCase): + + filetype = pysam.FastxFile + filename = "faidx_ex1.fq" + + def setUp(self): + + with self.filetype(os.path.join(BAM_DATADIR, self.filename), persist=True) as inf: + self.record = next(inf) + + def test_fastx_record_sequence_can_be_modified(self): + old_sequence = self.record.sequence + new_record = copy.copy(self.record) + new_sequence = "AAAC" + new_record.set_sequence(new_sequence) + self.assertEqual(str(new_record), ">{}\n{}".format( + self.record.name, new_sequence)) + self.assertEqual(self.record.sequence, old_sequence) + self.assertEqual(new_record.sequence, new_sequence) + + def test_fastx_record_name_can_be_modified(self): + old_name = self.record.name + new_name = "new_name" + new_record = copy.copy(self.record) + new_record.set_name(new_name) + self.assertEqual(new_record.name, new_name) + self.assertEqual(self.record.name, old_name) + + def test_fastx_record_fail_if_name_is_None(self): + self.assertRaises(ValueError, + self.record.set_name, + None) + + def test_fastx_record_comment_can_be_modified(self): + old_comment = self.record.comment + new_comment = "this is a new comment" + new_record = copy.copy(self.record) + new_record.set_comment(new_comment) + self.assertEqual(new_record.comment, new_comment) + self.assertEqual(self.record.comment, old_comment) + + def test_fastx_record_comment_can_be_None(self): + old_comment = self.record.comment + new_comment = None + new_record = copy.copy(self.record) + new_record.set_comment(new_comment) + self.assertEqual(new_record.comment, new_comment) + self.assertEqual(self.record.comment, old_comment) + + def test_fastx_record_quality_can_be_modified(self): + old_quality = self.record.quality + new_quality = "A" * len(old_quality) + new_record = copy.copy(self.record) + new_record.set_sequence(self.record.sequence, new_quality) + self.assertEqual(new_record.quality, new_quality) + self.assertEqual(self.record.quality, old_quality) + + def test_fastx_record_fail_if_quality_is_wrong_length(self): + self.assertRaises(ValueError, + self.record.set_sequence, + self.record.sequence, self.record.quality * 2) + + def test_fastx_record_can_be_created_from_scratch(self): + fastx_record = pysam.FastxRecord() + self.assertRaises(ValueError, + str, + fastx_record) + fastx_record.set_name("name") + self.assertRaises(ValueError, + str, + fastx_record) + fastx_record.set_sequence("sequence") + self.assertEqual(str(fastx_record), ">name\nsequence") + + +class TestFastqProxy(unittest.TestCase): + + def test_fastq_proxy_instantiation_raises_error(self): + self.assertRaises(ValueError, + pysam.FastqProxy) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/linking_test.py b/tests/linking_test.py new file mode 100644 index 0000000..15fd91a --- /dev/null +++ b/tests/linking_test.py @@ -0,0 +1,92 @@ +"""test linking against pysam. +""" + +import unittest +import os +import subprocess +import pysam + +from TestUtils import LINKDIR + + +def check_import(statement): + try: + output = subprocess.check_output( + statement, stderr=subprocess.STDOUT, shell=True) + except subprocess.CalledProcessError as exc: + if b"ImportError" in exc.output: + raise ImportError( + "module could not be imported: {}".format(str(exc.output))) + else: + raise + + +def check_pass(statement): + try: + output = subprocess.check_output( + statement, stderr=subprocess.STDOUT, shell=True) + except subprocess.CalledProcessError as exc: + raise ValueError("{}: {}".format(exc, exc.output)) + if b"FAILED" in output: + raise ValueError("module tests failed") + return True + + +@unittest.skipUnless( + os.environ.get("PYSAM_LINKING_TESTS", None), + "enable linking tests by setting PYSAM_LINKING_TESTS environment variable") +class TestLinking(unittest.TestCase): + + package_name = "link_with_rpath" + + def setUp(self): + self.workdir = os.path.join(LINKDIR, self.package_name) + + def test_package_can_be_installed(self): + subprocess.check_output( + "cd {} && rm -rf build && python setup.py install".format( + self.workdir), + shell=True) + + +@unittest.skipUnless( + os.environ.get("PYSAM_LINKING_TESTS", None), + "enable linking tests by setting PYSAM_LINKING_TESTS environment variable") +class TestLinkWithRpath(TestLinking): + + package_name = "link_with_rpath" + + def test_package_tests_pass(self): + self.assertTrue(check_pass( + "cd {} && python test_module.py".format(os.path.join(self.workdir, "tests")))) + + +@unittest.skipUnless( + os.environ.get("PYSAM_LINKING_TESTS", None), + "enable linking tests by setting PYSAM_LINKING_TESTS environment variable") +class TestLinkWithoutRpath(TestLinking): + + package_name = "link_without_rpath" + + def test_package_tests_fail_on_import(self): + + self.assertRaises( + ImportError, + check_import, + "cd {} && python test_module.py".format(os.path.join(self.workdir, "tests"))) + + def test_package_tests_pass_if_ld_library_path_set(self): + + pysam_libraries = pysam.get_libraries() + pysam_libdirs, pysam_libs = zip( + *[os.path.split(x) for x in pysam_libraries]) + pysam_libdir = pysam_libdirs[0] + + self.assertTrue(check_pass( + "export LD_LIBRARY_PATH={}:$PATH && cd {} && python test_module.py".format( + pysam_libdir, + os.path.join(self.workdir, "tests")))) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/pysam_data/0example_no_seq_in_header.bam b/tests/pysam_data/0example_no_seq_in_header.bam new file mode 100644 index 0000000000000000000000000000000000000000..72de636194cf09dae6b47ee000ff954c2751b9a2 GIT binary patch literal 953 zcmV;q14jHGiwFb&00000{{{d;LjnN60cFrTNW)MRfZ?O1t*MIO;?O1FprA<_oAeQ- zRxLijXMHOo(MDQmlQv1U)xp6*5eG+cbxK-mcZM0;b*#GoSbK4x@Cu?*AJ5}xRA57QS@#*A#QYLm~rC^23AijXuiny^&N zYl3ZLld3H&q;&Gia-3zPwSp@0elC|+(-zAa?1HJLbWRf`UglPdlFTE{vLW{WaVb5a z6@*MC{C{vswd@?fn72Lkzni;$pT(pp`k-O^%8ez$uCI$$3n&qVmLK*KP3~%}c~jLB zMg~s3E_#>*+4wRYkRc*Bxv&Djw>~&=Jb>f-HGjJV;pXy~k{}Yt9z#h8+G|rztS~&5 zA32<);OO(ZvWf%_kKEJ(0WGl7aqA)Bhr|92hG=@3(gC2Bpz)#`frKD#l_QX$v{i>d zM(}Jo5d`4Xe5oK21ZI+IdbRIOszdPAeCH-0gy8(M3PBilq8frQg0*`Wf&nPC1CZZ0 zuA}I#m_acGXHRdq#1w*$HZOu{m_2+40;UnnrPm!lGN?9x@&W(=ABzYC000000RIL6 zLPG)o+X1cAPixdb7zXf3^kB=@vRf6z-Rw^OOc$h(cV;rl40th@?V*dHAPBYxL3%8H zg1WSI>D{9r!INJ@K@=1`w%?=r&TazfCWk0KLx#BoemwIgCxnm=jk&J>L3OVCcy=0a(m zC;1@HUpylDlikj*4>!*W#}9P)Z5>>gL@90nAWhR%$=hDfpC7ZOB4m+WVH8DmNxzg# z_b=Rc6-m%mBC!&wgfgHqCE{kvHip?P++Kt=l=2@anE}qZG?2zxW_8N!@%;GqecB&* z-h)1M>nSK7G_7v^B+OY{NhTLME$_S#O4&(BY6SGoaLKh73!{`uk5#*~!np z>4ak^iI%Yet%ZhFN^k6s@p@QsE%ttJYQhG}W=VN?>D@Z3P+HHd1iT)|QX{0$wNkp& zN?0`!V>G-M+!+O4RnjRXdpIcPRmqL^Gb@F_X0k-<+MINkofL&I+!h-DdM6G_T$H>z zd;{8QUVlDv&i|zsg#(*GWAckRX!;lSHNs~wasg_aKvQ?2e=ta($_ zQ$`NX8eQ}-3G&GmIv_)r-0H&e1K;uJ#Bo24AJzTs5`f#QQ%V9z9ES`gK?v7poLC`v zsw_I3q@eh9Q(Z#>hevMffq-^cjox`k_~2wDgCO|SN|Lv;|o+wR>21QA?()gTDLendkMLa_PZLXdz`7=Zk~ zaUDgxY6is=oIk(g5>p61I~x&9!|cfi5HO8kF1zLU1w%s|Q1b!+03VA81ONa400936 z0763o0NVkr)K6>FKo|z_N%UaL*0Ng_#NF&p{!AC7kauP>$qaZgm+hg8pdbjg2SIu) zeuBERb?M!sAHkDfLqQZ2JhtDX`p#|w=_ZFLK0}7N1b#g8CMSfD4Sc?T+aV)Dwj4YU z@cCT?k7V+EcjxId4(cEV4kp0`u~4azAaxLvulUlu%w$f-{wVT77Ba>nyI}&ilIdRV zPAB;w&tE(u`IFtwuMaoR3daw0_-!3rm_#XV03c1%Rmt04&z~Q&r6OdJU11bObxFUJ zO!qI`cNIy{RwA(ysf041G9}_>$~K1CE!IURBa5C3`q1=T*s#_A@Jmz-F>U>)M=jmz@-aFx(az|9U45N?eq@ zI(!4#YF>Xna?byy7li|xL1sTAUjM6feXEI9(ljh ex2.sam.gz + +with_md.sam.gz: ex2.bam ex1.fa + samtools calmd $(NO_PG) --output-fmt BAM $^ > $@ + +#%.bam: %.sam ex1.fa.fai +# samtools view $(NO_PG) -bo $@ -t ex1.fa.fai $< + +uncompressed.bam: ex2.sam + samtools view $(NO_PG) -bu -o $@ $< + +%.bam: %.sam + samtools view $(NO_PG) -bo $@ $< + +%.cram: %.sam + samtools view $(NO_PG) -Co $@ -T ex1.fa $< + +%.cram.crai: %.cram + samtools index $< + +%.sam: %.sam.gz + gunzip < $< > $@ + +%.fa.fai: %.fa + samtools faidx $< + +%.fa.gz.fai %.fa.gz.gzi: %.fa.gz + samtools faidx $< + +ex1.bam:ex1.sam.gz ex1.fa.fai + samtools view $(NO_PG) -bo ex1.bam -t ex1.fa.fai ex1.sam.gz + +%.bam.bai:%.bam + samtools index $< + +ex1.pileup.gz:ex1.bam ex1.fa + samtools mpileup -f ex1.fa ex1.bam | gzip > ex1.pileup.gz + +ex2_truncated.bam: ex2.bam + dd if=ex2.bam of=ex2_truncated.bam bs=$$((`wc -c < ex2.bam`-512)) count=1 + +# Append a corrupt read with block_size < sizeof(bam_core_t fields) +ex2_corrupt.bam: ex2.bam + (bgzip -d < $<; printf '\37\0\0\0\1\0\0\0') | bgzip > $@ + +ex1_csi.bam: ex1.bam + cp ex1.bam ex1_csi.bam + samtools index -c ex1_csi.bam + +empty.bam: ex2.sam + grep "^@" $< | samtools view $(NO_PG) -bo $@ - + +example_unmapped_reads_no_sq.bam: example_unmapped_reads_no_sq.sam + touch tmp.list + samtools view $(NO_PG) -bo $@ -t tmp.list $< + rm -f tmp.list + +example_bai.bam: ex1.bam + cp ex1.bam $@ + samtools index $@ + mv $@.bai example_bai.bai + +explicit_index.bam: ex1.bam + cp ex1.bam $@ + +explicit_index.cram: ex1.cram + cp ex1.cram $@ + +clean: + rm -fr [a-z]*.bam *.bai *.csi *.fai *.gzi *.pileup* [a-z]*.cram *.crai \ + all.stamp *~ calDepth *.dSYM pysam_*.sam \ + ex2.sam ex2.sam.gz ex1.sam ex1.fa.gz \ + with_md.sam.gz \ + *.fq.gz + +%.fq.gz: %.fq + gzip < $< > $@ + +%.fa.gz: %.fa + bgzip < $< > $@ diff --git a/tests/pysam_data/ex1.bed b/tests/pysam_data/ex1.bed new file mode 100644 index 0000000..0d0f498 --- /dev/null +++ b/tests/pysam_data/ex1.bed @@ -0,0 +1,2 @@ +chr1 10 100 +chr1 100 1000 diff --git a/tests/pysam_data/ex1.fa b/tests/pysam_data/ex1.fa new file mode 100644 index 0000000..b4ed0cf --- /dev/null +++ b/tests/pysam_data/ex1.fa @@ -0,0 +1,56 @@ +>chr1 +CACTAGTGGCTCATTGTAAATGTGTGGTTTAACTCGTCCATGGCCCAGCATTAGGGAGCT +GTGGACCCTGCAGCCTGGCTGTGGGGGCCGCAGTGGCTGAGGGGTGCAGAGCCGAGTCAC +GGGGTTGCCAGCACAGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTGGCAAGCTAGAG +TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTAATGAAAACTATATTTATGCTATTC +AGTTCTAAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAA +CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAGTTACC +AAATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCCCT +CTTCTTCCAAAGATGAAACGCGTAACTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA +ATGGACCTGTGATATCTGGATTCTGGGAAATTCTTCATCCTGGACCCTGAGAGATTCTGC +AGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAGCCATCACAATGAAC +AACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCAACCTCATACACACAC +ATGGTTTAGGGGTATAATACCTCTACATGGCTGATTATGAAAACAATGTTCCCCAGATAC +CATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCT +TTTGGCATTTGCCTTCAGACCCTACACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTT +TCCCATCATGAAGCACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT +GCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAAT +ACATGAGATTATTAGGAAATGCTTTACTGTCATAACTATGAAGAGACTATTGCCAGATGA +ACCACACATTAATACTATGTTTCTTATCTGCACATTACTACCCTGCAATTAATATAATTG +TGTCCATGTACACACGCTGTCCTATGTACTTATCATGACTCTATCCCAAATTCCCAATTA +CGTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAG +TCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGC +TTGGGCTGTAATGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCATCTCTTGTAATCTC +TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTCTG +TTTCTTTGTTTGATTTGGTGGAAGACATAATCCCACGCTTCCTATGGAAAGGTTGTTGGG +AGATTTTTAATGATTCCTCAATGTTAAAATGTCTATTTTTGTCTTGACACCCAACTAATA +TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTC +TCCCTCGTCTTCTTA +>chr2 +TTCAAATGAACTTCTGTAATTGAAAAATTCATTTAAGAAATTACAAAATATAGTTGAAAG +CTCTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCT +TATGAATTAACCCAGTCAGACAAAAATAAAGAAAAAAATTTTAAAAATGAACAGAGCTTT +CAAGAAGTATGAGATTATGTAAAGTAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA +AAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT +AGTCTTGCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC +ATTGCAAGACAGACTTCATCAAGATATGTAGTCATCAGACTATCTAAAGTCAACATGAAG +GAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGGAAATCCCAT +CAGAATAACAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAAGAGATTGGATCTAATT +TTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGTTATGCCCTGCTAAACTA +AGCATCATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATA +ATTCATCATCACTAAACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT +TAAAGTTCAATACTCACCATCATAAATACACACAAAAGTACAAAACTCACAGGTTTTATA +AAACAATTGAGACTACAGAGCAACTAGGTAAAAAATTAACATTACAACAGGAACAAAACC +TCATATATCAATATTAACTTTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAGATATA +GATTGGCAGAACAGATTTAAAAACATGAACTAACTATATGCTGTTTACAAGAAACTCATT +AATAAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAAACCA +AATGAGAGAAGGAGTAGCTATACTTATATCAGATAAAGCACACTTTAAATCAACAACAGT +AAAATAAAACAAAGGAGGTCATCATACAATGATAAAAAGATCAATTCAGCAAGAAGATAT +AACCATCCTACTAAATACATATGCACCTAACACAAGACTACCCAGATTCATAAAACAAAT +ACTACTAGACCTAAGAGGGATGAGAAATTACCTAATTGGTACAATGTACAATATTCTGAT +GATGGTTACACTAAAAGCCCATACTTTACTGCTACTCAATATATCCATGTAACAAATCTG +CGCTTGTACTTCTAAATCTATAAAAAAATTAAAATTTAACAAAAGTAAATAAAACACATA +GCTAAAACTAAAAAAGCAAAAACAAAAACTATGCTAAGTATTGGTAAAGATGTGGGGAAA +AAAGTAAACTCTCAAATATTGCTAGTGGGAGTATAAATTGTTTTCCACTTTGGAAAACAA +TTTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTTGCATGC +CAGAAAAAAATATTTACAGTAACT diff --git a/tests/pysam_data/ex1.sam.gz b/tests/pysam_data/ex1.sam.gz new file mode 100644 index 0000000000000000000000000000000000000000..16044675f2473b5bccf026d374ac1ee04dfe6b40 GIT binary patch literal 109698 zcmV(&K;ge1iwFo7Ig4Kc17&zIE^}dR0JMF{lHaDV^;K$Wt)vY6HH-98AzC@ zQ}T^XAtjlrfB(1mzoXUF{r|x4b@i`*r{Dg^f1}_2OAWt?>c0s5=|BAES&Tw4kahLh zBYXg&JK;e{cLEG3f9~)H&-)$zFA=+BKkUdX9k?2 z<~R-D#O+)L_6??-~aYdwJ-u!Ro4-KdstmvSHgDt zDkQ@jL?wl;ifA8?IlKVWB;4(Q+w0{nuu4a; zg$Vo9T$_9rulVU2J{t`ytKXb{Ie*iCzff)fFx*nYP+p~<>UK-F{N?bQ#UEp$KeP50 zqwJPx+b#W1?r#%Zlu;-dbx<)#!PY4BYZP{^(R3SOv0SR*np)@Futu~0cD6#Hf}7B- z5F%Jzo5v5{-)i<>-+xHS`?%AN38DX1U_!u%spvw8#_|)7D`vYB@6nRDstB`Psx#TK z?gK)MwM#xZT}!Q}H`Er92CyViL@5m{u!%;i!IDUB@!*pbqAH^NS+sZo;Kr!D55Z4v zrYxR0cn#oP5McD+mlBSlv;#^72&Js65=8i?Yjzno-lYC<=unzX`yOC99hf@pqSt)a z{cwGyN4qSmBFg7H&f(Eb@1|*XzaQTJO}EIycQ61R{$Cl;z_%R^Zm?Au=juZTUkX7_ zfR>Nv-*DSu&jBVZYu@P$QVG862F_-viV(pZazO10!b^eJv<}TB2Dkf_Yi~OoOIS(= zm#B3WTA=I_sajUD1}jp6`Fs>slYFg1$FoNN1`nx#MYVFU-O6;fn?7x{-EJ0JKA*}Z zHG1D>0Sx9F{=KfViy1_5nObX;ranvSx#ZvXns4s5;A0H;1MY~?gTstS-65ofuRn!! zaGSSo>(AnoEUwoS(V-G=x^^G6JGtw4Tj>!2^NeQC!fWT4HBp{h6Yyt(s%WL2%PaNl z+`IG=V|2Tl()n$C{&jo)WnL}SE?1qGOJv`{z%}*ocP+t8vPT3wQtNx;4D07YwZ5CQ za%`zmzz2@*rBnU+7w7B5ocJxq8GU=_qXGB9I_^4X$<3YxYZ9s=%8}WFeQd}_jxNC) zhyJp>T>K^Nbsf5334B$p4A@D*meX;V9$?yP9U=a~2xhnKkv@0n)z2mWSn~DDogRVfJ|GC4UQt5kQfY@arC*^ih}ddx!?-I z7YX6rJjf@3#6N>SsZ!FgbZ7W=sYObs3;n?f-e&dje){~BZnE>>0PyP$|C;f2XXyk5 z&aDHe(z9^hj5$ZN#1Q4=FjY# z=<};hZw`Fe?cKt1DzNi1=xAW;y$@`h!L0uGh zjU>L`+%`Fu$5HTB;hkSZdCw@HFRyp%%#=+ZO$H%Z~v>#9R}pIb{zM*X~OeYTv;ef)}X{)KOisC2VHy}-absHhB{Rc@Rd zzf1;=ldIM?Jp-jBjs1lh+0vx(pPgS0sVFB=42In`gtZ1!WBieKW_m<1-C08UgLgh) zVnD)gUnyDLWn=65Q#9Jg^Ca#z5+!pkWDtgm@U>v-sG>ed@6;hfy1*tv9g z=esv_8r!%H-iSjRs_^QAcZZ(R0Mv`|JC7Ncb&U8AU`73cpRR3VwNL3++UwrI33VcR zJelCNdzgIom~C&JysgSG@2mNt?!fNPXOJ@r79Vbsw_w4- z3((%)W8QuP(2Bwiw%4!{u-*C5m)Rujbx6?M3wS|=R*~X4PcD6n6ReZ(H@>Y9zT$LN>0cvj3SKA58Bs6_TYmnyTrTQ#Qm4!1Tz{O-3M`LvA6KPRY-&5~c$=@E`S;8I z-w%uAz}irbfWY8NuqApkb<%4*3*$2v;k?AIHb^|;oU}vF*Ry>g9|wO<4O5IIG>(}6oF-q6oeB} zV(3#?P3B#sX-2Y*eP6u`Q{HxTf|LYv2uMc}FFI#z-yI#-BFN`_hF6Y|LyS3pKD+f) zizNt5bi`mGT=Vi3YrCZIXsZoamok@ugY~`fg?l5Sv0Yh1nyB%Z>41Ks{ehJNALdtt{evRI|QB`$e^gv^%%ow@%=9 zc(yT!SODrQS{IxEPgp3n^MPCXTzV>je9ara+R%93oki$F zUSXn99*mde3(A3Fao6tyN@p@3%s89@EJf|!d0qp6`z|o_0c%=AnB(W*f|GJVCvFSe zFi9ST;o8r?^c&LKxdsF<9p)1}AZ9*^C>N`GIr9q~eMaXU-oSp_VP$>is#}5E?y4e2 zctN%H+TUPztoXL}cKeU9xyAoz{~`zUufJZmU5afEo{kbCNonDCB?ey^fesxJ)Y`HI zW=NRjz--5dq}ofc`4qVRlI?9kn?vat${bPTPY>)ed)}#_TWA( z0yT>Am^*+bc5#QNTmV?t9J|7lW%DlJ$>TWr+Z`+cFT?yPR-5Ji+E14k@DTohw;mj~ zh<1ED(S6?n^S1caAK1MxrSLgviIF+@!NLi_fclAdiM7cR%$fCcBmYg#M7?fHR};X) z^nt~`NM^bDgI!k_>>4R!yjLEsvrnOauH&m?G8<+A5dWV6s$GYPNU{6O;QRLqYW?%C<{rzyu{OVWjR&drYpg-!1S*H z3&lDSFpb(n)exBD6SM*88r0Ng1`ou&9=qAFZtk!lA@C(t6SD*!&_DaOgw{TeHw)hv!l%+;% zS9^{#K#b7h1h?q|7Pl(HyjSM?!>a2ELRI%}w0^IRd9St6C+BKwthH`ho7UUvX_5-) z7R~C&NU>)WYpj@B+Jf`d83FT2zrhK(-CUZMrZ;wpVsn4n*QEn{?g6LMz4HY7E*;@~ z3^?y|I8XKzoYSW!S=VTNx@ao+IA-?eGqQ3ub8M+$$^ll0)PrU~6?^Z&`@3K+xxAh^ z?oH<*zg4!TW@CL)U_T!?C7Ai*sZKRYb!uvy*@E=jrre7}Uk*QC^N;us;GDiR2yb-n zF{*^)Y2Yp?=8p14W=;LUlu0VU96k5`C7pPJ->$pIU-}irb`-FwlC_|XaOU;&n{eiJ z#DN^^^2b0w<(DqJ1jO=~x;m~ws5A|hHXKfB-Zc>%I?NnKOu7w* zUa=sV{3nt9r*)i9j6=9bGBouxlhn-g>D-Vwl$hQIy9BPsu%ImZv?@DLWtddbf`?P5 z5ZU}<&de^@rL7H;HfHlFwBm_l4iu}gIX$ug=*yR9-*HOH?QT2F?i0L8aG9*bk`YdO z^hr5@3a30fQ20Z=1t>L=SJ=82aNP29QsWSD6hZHutC~mb8R9lUN1q5*X7sw>#M1){rdQ*Lw$}X?QIQDwK<*0@2e-NI#FYLj0_HzRvY%XS_?EWDQ4WEwoUYm zu_B0tR?nSz&C3EcHk7Ms!%18%U^R&nCC5sFm|B8h)A|@3D_v?kWZX4ac?^@+?@Au+ zbFKA(7$Xf~(FZsm=f<7Y`E8n{m3mwXwu^>H!`fr>7I+|mr*1U2M5>*eD?xocW-L+u zGW1r2){&`NHr|YCo+q4-b z)vl;t%-rCFmyXKR5KQxEqlIew%Y>s|#Ra8P>gW1C>O9Kac=Ot_pf(&+i|GcO?~?`s zWNa?(-*wIIJywP=?X(FgI3N=IH@G{OAoDQEx*sn#4YNyh=mcE;8jYzQw%?5EfvR&m z*I};CTDjI2(Yy0@?bIarl+imEwP%45;PhPu%TuDsY{D5@|2=VwpH>!B)LU;8xJWL< zU>Qi}cDj(gxdK3Z460ut1e@Mtx-^Np_HO;Rd5~)RV&Ytez-d6f>D)cWW}6^4;hcYt zTx(Ekd{+;J?KFFgPN&iclq2OvREE|%6>zQ$AFIv{J)h^1wt>6$D-S)aCU`DjcX{TH zBh7m+HzJMe&3;p)a*WiBdlCmf4!adJ&O4!>%#-zoB}26IWJVdxdxrTyn9mL-))e}9 zXb@S@@)y0)PA zN1h_uon3Z*>pUJOFB!IMDBdScb0dUp0PvyGoQue61!~eRrT5PY^d9YYP;*9g~0_4xF)29O!!ndsJ((ru8 zQ-t%RX+Pl(&JGKB9%6{PW-y(=U|#rtH~&>g!fG|u8|IAuPafRr;I8&7jt^{aS!dH@ z_3Md+d*yKJvGajH0{C{--HBC(0zUGmo_tO3le3D?+4EkV&bG0b1BC})z$J#2{0QI( zH{Ty{EaU}VgO6`#!@OtJz6NkG#-Q5@9(qiW5^*|+nyaE^E5-7raR_8`Emt;du>qV;A7jXLG3802HgU$dB8Ae-k@5RHB6`l9u z>g>G~fj*au<0;43$=T`Viy~5*+yw8{16qqCrc^Zu?x?V7J*#eZ0n9eV6ngUf@HeX_`87Y%I(drEkf_K9hmo^x=z-=nQ1lxK( zuepMLrZ==44|I0QfdAsaA>a{~=lLHTQUbqq#!JDEBb*%7)pah*1^&tfGW6qT9f6hN zeGXc&(Lhq8wd60>2q;d~NONRC%`2CVJ+h!Q4WPll2EWy6UL*57=WBG%O&4+A`K`B| zX@c)EUwZiZN{2c)FiYhO?7GDWo0S|#Kyhk8x=lc5SVYLFqCwb3>n7^mKxY`U`b!^J zjtbecF2tBsf=Q2PXqL+12PaHdC>IC3f(I_xZbX!ei1EGxmmdB2{r&A++=_QRuq5>I z3@6-s@KQA2|90+A=Vqgts=K8%T}b`4GzbaowtHzLmYYhs*!qaYM~zv329oEhd~V_qrY&qJ&!?S{@N_OZ*6?;npcnFqBc=tMaI4v%fHo6F?50C54^DM)Ue;uw&zd z({yE+_vHy7-My?~ccF(8DjJK84qi_!^de5x@ty3zIYWXFk&4dkwN2f&ON)Utg#NN# z0*Z6`wL1nB2Rz$xrLQQ`N3)yyV1_5m&%s2_u*=qscg_>0uzXPGSwu<;ivCg{PQPGz z-3+3R&^yg=`_U@>tBCWb`p4J#^E`ZYpFcl8;PdC_`Tg^A5|56%3G4acSwlW3vK|;7 z+y&nG=53V=JOzwT;t&}IXz+LHE7auJ`71R>?QScY;TRplB@PrBN2#TB3sUNRIH&i% zu9HfZNp7o|2_g{@9{CT36@@32ThNfF&`T(L3+gk`0r;N*mhysLs7K$idr=v{}gZ5MReZ%E>V|X21E!hskce%5x57q!59|xHBtlw)G!i z8M1DvgNETN#mT?Pxvw!PU4pq>hD=>Laz8H%_wWRcc?%8SB%2{nwdT_!iu%pUV2cEm zp>c;sTpR^VvPP~zeoRL$Nk?;30@+ujMv3S=-~cX@@~D)N~h8-UJ*NUhC>NXdpHBN?ycrJakX_=F(Rb6wDgmSH00 z;@(l5BjlxQ=RF6C#i!aA|0F6Qd=d=#Wxx*+3Na8s{CE3&y0lw1LuNPO!_w=h`UgfDO7U zFgXE1HwlV~B3RdN`5lR6{IgN-|D579est@@d};*AN4&?fuG8Ebm8SB2LL6H<12#!4 zg2bOPIgb0pKr>!{4Poc6#;RZT{0qFC&$qYp{Aj;vvyEydA^yr=$~K-~CaZDd@z$?w zInmkzQW3wKPn+rMy6+UuH(qA>gY^V%Jh57sr;S>Ig#onQ&Iil6!F7fFWk>~DoRm4dTQ%rtO7EhZa zq>C>|Z6?2yNIhb=AkDSKXd8a#e>*9jUwgRnwT#H$)Ybs{ip*{KIZ!H0Dv8C>|m4c_9Js9X<3-dl??n_8Jy( z!W(Mc)#9LBq)|IKTPYgM@=#`!9D!z@1bls%Sy0D@!3fV9ww{g;UFQb)GRPMuh{3l{ zNyAS8K26#5wb?etig^;aQ{b0aD_@Z6d`2aWGH+PU#g0wt-@YE0C7ENa9=6?a>r`iF zbi;yHKA_4{jzD!!PM`d;by5e2R+(|)K*>0T+y`9(8r~ZDA+Iv#QoWq90rR5|3$*{U zJkb4m@|hQ;b0hMC;^{;m4??%#(M7VY!_<81mUdxwJ|yP!7!#n?T? zHuIpGxg5l?cu7-NnZl`H#YulgP!0BLOTBGLUwIGzM3rHxPB5HN%_BRSXheO2BG5+_ z5>a!~U`Aff$U^&>2FML`!0oMfHW$K-=PN44uM*b2x8Q7(cNi^s-3H7aSp`3|4EV=> zH?>@sz6bLNw;r3F>=IDaB%w#C1a!`dCYBn9Q|nLjhjf{@I9Ei#zsCarFTU2yAsOLB zry2ftw=L+xBj0g?oXzedIzy^H+zk&;LHhjoZlu<0mj{#-IV4~+VV zJ>)gG_mbyvI8bsz>y0?M@982j(_ApIgI|r)?uDVmZcB@y`w8m_Z<6Jk?k6GgkQG}& z+42B%!A9!nKbqW_FX4x@Te7laww4OE9-=v8SaX{)qX*vQf#wp--pao=U}EdFw&4l|@mZCQOL<|8gsG7d#Br4_jffv&^uNsc zoX$e*I-zayj)v`FHSxaJFDUJR(riJwVm(dPDm4%yAERP+#6u-8LRO>m$rlu7$xx4C z^97Zbq(&MfoZucsXa$d>L=8D%>QBs$m0XRqnjdQicMo4V~bNi?{Ee4YZU z3g9=he7%)?-(^qSybg2O(vy$xRTB>^XRa)O-PFk1jHxkpi}=JfH4js1zJzlM6kC^F z9{)muH{|h&aqog+`Yz`gk$_Z0<9M(%0*b?mBo43_=-AQE-NT2v9TainY9b_Ka|_5{ zV*9eE*0k{@l#k9TC6-;fl61w{oTGS8BK@;@pSYsq@d~xrh$U&R${9GJfhX^*L9&uA zmiI(ou>usSik_q~`7yNI>NY>(d~JPve{0mIx8iG+cT%W%wbrTB%3zzgigax|Ph@S^ zi9EAv+v;bj5`Uw)?L`=G7HNJqrQC$nx!@pb4>zh5Mu8lz3s6D*(o>l1( zr|vIPopn&hFz>T4msK0d==;#@m;a(h7d)ULY8L65QeZYadyOr@|@c|nKa0L(RKH(uy3)NQ@gjXXCW z-(K!jTFJRvIGecp9v>*?lW+xGqkY%MUVypW%iKoKqM1HTn*^4o3U$mjxj~|iB2NtG zGX28@aNB4#AXa8#!=Cf+Kk7vwiA(mg27@bO6@Bnzd&t`}4v5rFHT zP+w2nC%pG%oO$Lu{aK({odxVY_BREh{Tu8P2a1XPuJgKtlTXz|Y9+{yw9gVfNj2B~ zQlF?Q5g@9^mK?<^b)LzI7?SFxQgQ+0cr@9QTve|~Dk+I)U*>@}lo{IA3_PX~Dyz{; z&sCZY4y`G*g7ncLowZGgF4IR4xVF<-|4EU-&sfnH(Wv2g%1H`0Yu#^H&-XfKK;2YO z!mWFv%cB-KCx*3oY{nwFo8fdy)`#V?M^fJQC9>Q^8Sy5{&;6Z(uhMjbRq~pzrfA8q zOKbUfz=5_mn}+mA<``d-V%jPqu8`mX-o;45*2C$v+z<8iau#7emdUW&&))fc6tuJI zLBr|fIa?{(A&Vl)Z7hGyZWhv4Ii@Mnyz{c&jI<(#{(;hM&Mnz3b>1=3dGJB4v51!4 zB*#i2$o?3_2*qai?hVtR^kHRs5~5O&$j;pMiFwI;|#i zkF;mJ2%IfIh5yxderW^LKYv_vKc2^^2>{|Z9*%INNcQzRK+~xE<>a(Tk+v^` zk5LHnd8=_Z3CC$%*0$UNb4e*MF3DePW1aW-+zT56DvEI0`7uzGd6jPadJeop@FX?) zi2`3TdHT4&<-X%0g$r*aM9zWty@Y9M986Rh=wpSCq;pbsXB~4D*s%{)}!R`esE+D5=%GSDT3lL8J;$Zj{`gcF zH5Q=iQ4NcWy#A8gsW6F6YF(9a-q*5v^sWYzj$}$F5_jE#;=o8BlHzMm!UG#%2Gixq ztm?94KG#E!Qc&ZAPnCwK1U~#M($k!h2CY6Z*fQYQ`l3`A`SDmzuv}3GgcU4NO|8Ii3Y+V_dxGUK<^cjHzuqx zynpn~L}{)6Ue6{?rgwg-c{Lo-5m4J^cZw?tOB%2y+Ka`(L#mo2;cuI|X3ZmEK6bll zWXD5ow%#e#HP>K8RuW>HEP=eQGWn%WL~g&BF|kd8AEgz%`o=Mwc3f@{9+OZdl#6X8 z_Js92fb=!>NzD<-reW8)rPq{;Kucdhi8wWLLT%3E`QLo*JLx##EV-qIy`w02#~%DT zbIliV;`mxkW2$Wa_xD-{7i3X}E6*u@P$Y#&G|E8n%G)N|Z@8fNH%|@;RP$|M zk2GmDiKAevPA49RPzP#h_@Ul}lZfxV(>O$>LpOA0xiC?HI zhAlfpLh0VRh;t^rjDA;AZt#AWWYJX{9<{XR&5S$t$O8_ z(i;Oz%qHPLH#qOi9U23*IbnAQC_0yIiVp40Wja@}QI%sV7{x9Le{M{j5?ox;VAHH3M?h^?^9YJ) z56d{K$unp|)6ya#<1u)#&Bvs#!EGd*7>ln>*E1*SGiQ_DvYtpd5fo;>RhrH$9A_As z(Og{Ed7s%4w(NZ8q&ZYJdgZr1ti(goCfNOLbhKQ`K#Ni30}m;9#N{P@AZ1sc^6Z8@ z|I{(X20?|B$O52pJIXs7yrAso7M#r@(}+i>L&IN36vL?Gr8VYhu=>H8ZO2H7tgYUJ zwBr(LT4@{Xv26l23P$+o;Drynlxo{lGD$-s^R_kY(#v}CEa9auK`a%#vZ(3qI?}5) zGMtl@7wBIU59I1U&&3b}X99hxsfJ%CrP%VhnI<(}|I@@HNmF!duK{$(K5?V#-$)a*RN*$bCQ;=;i^ z(ng>X+iWk>v7f&2YQKj!r)9`)6R#T@+uo)kR6L~dtqC8jF)aM9pjmEUwGrDxaW2g> zV?W~S!n2FT<08s@mjZt`u@KjCWu*N3ZspoJjop6p6_3|+N6A_Q3UScI`;eiboyNdua~Hj=D*5@Fvcf~&4hQFQK@yL_2-oLXh?nSVc=zy9B^OfQ>^ z5GYABx1INPk-&G;U%ymi(}(;3N3*$D5=lC{#+)Z}ag)HdeQu;!nwJ>sP!D%m>0!FO zJ$kC@ck`Zs-Y2_>e#YgJYHL#>Ham$lX6HtxJZ#u{pYux8a<(L}to1hB5?D^%)iIpR znIar7rzOqM__@on?Nrrx{#5_?NBTrE4XUhvcv5{M=PkxhNIO-HL)MwwF6vMPEC7qS}mD6e*CHOC-51KFK9{4}w8 zb9pPc9WAj|;x#D8S?k7Uj)>5)^AY7a!0|SYANpeeNW?tO4~8~d01Suz;5LE#*~OuF z(&a*czj>QFtpKFO0&|8eF6_+n${~Crj)xM+pJ%!ID(!A+niJLQ?XIqwYwAr)gIC1) zQw5aGOSj~5XK4CUg>D)}$5bt{bdr!>3shFl5ztTAallwY_$ZO@2XF{l0|G0ur}Gj! z*uc(-X!&GC+tk*%Pm=m>3lQ(w&WSkr>*VhmK1fi$$8#}bQqWZL)zLsQZK>R zLJyiXvrd*&P;9>g=%TvrOZ&}+GdiaOJz3J$)3SE+l4iaXdkz*nx8?*doeOcwl+`~m zM+hD!>W_mT%lWZTVv%&qHz2M~K{xv3uc!nJ$F`0T+D9UCYCh+y+{c8V8C1s0jk3@e zbcMDoZI!-LmL_~}-Y40}bhsU(n^M++^nXLm?G-0=vci%?&?cm-U(N^Pk4%7$HI@7G zYDl!YT~T5{6)3$@JgVeB`X=XZ7yHJJ%zcBU(oy0`^;C%9OFD|6UHb%-uT`O?6&~4i zOkodVe3S@6cZ%76!wPv;w^Oy-R*arAbhS2sSvjBn6}K zi{0G=c}5uw6VBB+;=E=-4nQ4h@re`qQD1$z|=67BK zjViXqrUizF*9_0A1m&=y`ej2Y9Z^`PpDKMI3s=8H>6NGL$kRC0@tw!%eeVC-f)giw zLJDcS>g*=QD{zT%W(I-`t}?G7ezT&r;fNny4ubexhWO}5IyLpDezqYte*OAv^acJ* zpBe~YRx?q0u~7}|4d(WUAED-8c~!wk>ZmL%Cmz8{4;7Cqa@W5nc+$UkMMHW+`|M5>r4-mLL#hsl~Cr?!ub!%CHCXd*h%TY%kYZTIxXwPuqHDE zmqC^l^WYF@f2im+)yf<;o`n~vn@L8rjFhClhOvY{#}ho&@g0Er$*a^}r28j@R$ zGIz3V&uKdLC^@B&s$0o|BF5Z%6}$ec0iye@3Sz7Bg*=?PMmBgk0@}Mml>5pTegjZ& zcV(t8?nK3Zx94+4wtKkpocu^;A{5Fj6>vT)p7TwAlE@mnS`=n{FlJ+KryB(pH4S!^ zaXzaqWA2)+XDEli-l7Bu_{cULahs-co@`0w%ORE9koG6k&(8Cv{YyG4?8u<9;6f3% zE%>5kq_F$nZFF`X$Rar*iZ~WrP(r~V`H_t+uVo9AIio20h>c=pm}v1sTY66|Z(vJx zM&B{3xSJompGCldIcKqlT8+*r&(#B8OhRr#@C$v-9cMjGRUB`LG3N z)wd2z6AO5)^mq79N2Ck7B9{RR%0zrSkSaUPmePm2ZcwZE6D>6knTx4wOr{>wptDHW z5|B8sR%|GGwB;5`fOhq z5K{VWWqFU4LkR&LN_t8*&c%UJ%AvNKaLy76<++8>b|D<`?`ZhQ;>@ALGAF<7a`JBa z%qp~w^U={*BUfbGcYx@eyQE|kp>_un#}i@P-gIK8eHY22NNy*QxegLcynZ{My-ycf zyyon)LGp3g#EX))8=6ieUv;F9X;{926CcSC^67lE!*Poksa`ys#dF@}I<3wsj46Vp zT~T>L3Jl_0=4Q#msqA*$+IIY-0CSi&Ov7YcY85iWS%HnWZ{PE#X<<407ZZ^RluE2w zo{96wST8d%R{`YDD=~EX9`yucXKSs-xo41G@IAFp-48kv(GYDC)JL}T@mJ(>ga`1Bv65Px7r6?c!k{h3LC&J)212Yg#Tt# z(%6D?B%LFv%MQ&vDLST8knq=mOueBg1*AQY4&EfzQja+M#9eUtzHb6*=qwuF#YX<+ zUd?NYZ)pDaj?`X!Fbf+`99P?Lwi8|y0GmL05L`+OK$BL^Iq#2TM6gLbuO{a0Ywjus z!;?(iC~6Vuv#OEHXjfH1Zs9$^+>Q5e@jY*^;Iur}TQW>#jFXze2rZ7n1O6|0BomgU z&ml;1H3UkY-*{X3J{v+ezTN_~*Lz7*3v~vsNd+)Yy54<6JAo3|{(u4yEGiCe61@vi zZH2ksw{~bE4OMf%gi;cWTza2GWZ3fhkj!GFL z)sNjYO=lYPnv;RWJxd7kCVrDJTScBQ1~H+|^axfBP{)oFrWVUkt2tG#l*?erdE-;^ zd+jI|KmP5ZYHCwMx-g;Po8%+tBe+<`f%jf-#2a62)7bv+ZLXbBB4a?=dyl$g7t$iz za0I-iafFyNPVJ2v2PFpr5#q2$Cfk6LnT&kX)P`k4jiKp^Ehly6%cWsK|9LPD8Hphe zCW_ZSwC+ee)-gV@r`pZEqQ6ZRIF-p9fO@{|Di2YVabnpsjR%I(h|4&nI1C7k`bnz*xNXjT??uuGh{r#+y$D#N^2K?moOb@&3vRv^sl#u0*{zH!YpbD7bkwj!mHqAxEmF?vudhv%IL^L4GH2KS*QL zz7&#Qky>*=Uz`EuL8$g^zOe+8m}ZbqC}95(s%U(MCeKnd0;R^)`K6e+sZ2*Bt>8Xk z&zR=MiPLxxF^b=Wawb}8OJSxhH>AA^I-L}m0!xZ)BTg+XCsG1a+wBIRrg1fZ0w=VQ z`f8>!I`Y82&xs=U@26lw04R{0X##&9&lQ-&?LtmI{O4aOe`jWy7YkCuZJ)5N=k?Rj zDV3<|ik;U?;?Hmj9}4t{!Ktvac>S+U6PrJnFzF4ILnq4FI=1=nj8pQux6ea9MUXte z_qorlpG%PROii^NHwSrR`O)F9auy%d_-scgiU%OGH@O2M)2kW~)XQAcR06E2;Xs-0 zPqzDbtF|0e?#aRTbf|-NP}?)=+8DpI_xGRb znyy!s{MAz`B4yGhH>x-7wx?~u0i`Mwc4Zmvmr7n&4moz-vZOCDooOPP0Tq8WPX7A% zOktI~+Rp7gajcV@4{w~S|)q1@l@0<;)CLSLFPpMUc zFDR3lx7ZZn^%kT!Uh}M`bil1Z6){(X7x31QGTpS*Z9~p9$iEfID!FJeHqqQok^04= z`l@&YV0FPF;R2`4U9KChRhx~p)URQKrcTG{$I&N$

D9eYS*nJM4m`AoORobNXJkYESODDcZX6N6iH_kz1jX-{sM@hZ+smnENW|$ z!k>bjm`XQh^JAI+{kX>%q&XVYMFn zM`d&@Zhl*43CHl+a};cT4Z;#T z0eXRO!B9+_^CcRvronZW3#=ElBa{J8h|R{`1w9)Th81Sk zO4h9=Tp8z*5Zv(PkByLEHv*hktn~9z?+B-8`?bplbyXzc2q`e{8!cA@ zG@56rt!#y?iYp4Qf9l&`|I}>jtT1_RtVT$2{F;QxGt&DSQrnYx_C07#ZQE!-lw&F( z7wxL0NpVy%@{GsXXvN+CkaKFqC1q8gmnb#1Y+Ci+1aMCOU_*kYqsseY4R|JYu>ZQ- zeCjyuaX!a5akZ<{85_$XWJu>z2)Lq2OVvo5SNRJ<*A^%yKT3M2Vd>`L84a08@}2q#(J{0V+>WJKatW7LmU6cAd*NUu{nOfIp34py0NYm!xsA zT}uzKit=Z!B;ALt-Y4YxI;PlwkEliY6V|#tLWxJ0yp!E1$Cp16sgB!EhK~cIf~Iq% zR}uLThPR%RdO2dCl2sY!b43F*q>r;mB3$Q%3fznG=R9+N00Vz7rK8~xUE4l1Xy8{SsM_2eZKH(AiHmX$D0 z;u5R2O^RbDA1o&3C!CcFK&8*qgL{DTF^%DrCK=-qO%a93GxYLMohPuD-oR(kTPBq` z@;aE$p9PqY2a?pe)A@AzK7D^XrN5EX794#%0*YE^)WUdHN0b?6XsM~O2mDcD29f0F zvD?HGeaK>>u-3D*oIivUo`Y%_g80H7ZkbST@8d(u<|I$=-vVBPNdTorNW-Fok2QV^ z_6c6mz=1j*J_j0aUElTx7J}~;vq`>to>Y#Zl{tSIlfKk`fxW449lQ3-kfMy;g+>TF zw)RDwkLuSi_v<_T5^uF8MX*oG?tEtA9XmHuq~=OJGg=7XJ=gFqp|+-H6<&^1Ico55 zRe41pNJQq~uT*cADOKBAxY6Fj2{1BOPWsIU=gaqTD6BMQqgHW}=tw@LPUQB}NV?>j z^bmxF7xbj;`R#3TpW4SsFAoyVYP}EJZ+V&5hfZ3vw5D)Q{g>aDI@jA4)svXAH#k7d z9(*e%Rv$LM4D-J7j_U3qnB07EKvcCqq?}v}1y*yvc@ZY=y^k~FFTY6*V<{HF^tmR$ z^FS35{NqsB2B2qGJ5?um^pRweYwm@G9_~Zp1Z$GCJY1GJTwaBVu{64*y=X3d8T`BXGNHMN zTXRaM7nvSA(Pvr~ICK;-840mSV1+1-RM8+Q3Mm&?^jYb6xtwa)C%RVb+Uw@%A9e-jUMxa70;L@4y!$8qM{kB+k*oiv;iJ zp{IVTNItA659&j!Bvr{hW~Di$%gug?uLPjz?_UnqN|HvzxbNNi_*myF8t#>1hJr3E4h#{Ipk@ znv<)cJh8;4E*^|H_{H~~phyYo z9d#&_KrREM#7-JT`0zvfMW1$QTQd4wiDQsD>YDfPaJD*UbgzN24)b1h9neiLWvlzk z1m-G)t2>}dM59{L;IIM4BYZ)57q^$~BU;4ytlsUpNoR|Mx!~_K!4!GG%vP2IkLq1S zt2o$EPN}CtE7fr?!n{{+=bN0#prN(q!< z0?yAs`+g!ywbNY0yt`=kDq=j`cg_XY8c<&qVS=%TlNg)Yd#uSmQA1?+Jg!inq$m^-wM6`Mc^S%u8@l(CuzQy@=inmiw71OLr zadj_}92dZ6Qlm8K?ma}IjCW^*)FDk_jUIDhJs<1EFlye9&Hhd;Y<|T{gq>QRx4^gj zYB?p2NyuQUBE|)|d6ACL)> z2h5xi5FD(mK~O#bs|ixdocZQRM`>mUvo$so^B|N{0%BY*ysfqz(>eOjCNeoT@4=-% zF!xHa2+k5paJu+{asoS?|G^i33(#Bn>j=*t(ryv8yHK$u2x@W4sg=s1$gXRjrUb<) z9SoV!@Vn@dFh;SwIH#|3M80IIGRWtWW1%5rfdIXZlUQ zr8I+7x^ibhH}Hz>na1MUnx#bz$d)gU@BTCKVX_ zt8;-Lz+e6*+O1@e(5O*qq7`S{HY191GpH0N4Idr}tc6e$M-Y0?MVJ`Zry0et^@bw5 zC7CA>A)E|YPWE^rGo0=(ebx!>l#*9bj+n3;Dt4EwXN@_tG1qjQM2_5|$!GG58|}OCxFt zDLPMJ|9*Q(X^Pw*VXmYhEQLHFU{JXvtgU&~4k8j9zbxbA@BHhuz&p_~xcTwR(oBmY z6%T`SF}$~Z1XN4Y4z+JU>PzP7!29X(j5>vbOi}y6X||kV&$*UMc^x21hR*GK7_9zG zwRS7*iX~<+kFwb61*XosZmGynhB@;jrF0(n;9e6?^>)23O#z+dlVRi443b)i4z6aQ z$griPj09%z&7reAhRI7d$hagi;aC9q=yg1nUFNjk&NH?J%;X8<`03<8efI9Q0DZxx zDca1`fZ3HgqEt~(Lo2wI%@x(lMIEWun&h-E=&;g8&R)JXuKL8AV^kYu);{V`v6RUKK* z#7m1FwZwMQ(+-tnWKhM*ci;;;%7@98PV>NeG8IWuz;b@?a&jJBLlPMhQESEF>dCr_ zP?fM|mGT!y#H7H9H;$zoBY)kK z3LYU7Z3&5QmvBB{?IEn{${|^V8!&!`Rsgd(KvzhwCtQ4GqS4rpRkQURIrT1!auzV& zfAT3!Ll!hlZ(_YQqc; zDvCub`HIRHn4&79d{m^iPL1KW>-#O-%sBi^uZ8cev}#yWG72?=hkkp@In_{s1E2XK zNc!ui7j~FdYa(5E@X(0{@WsDZVe62kz}-jIIv@DbYMyy$#lkmWu98XV#0wy)r&L)d z|JmS>qM35wloGM?a9HijDWI12(&AS3;ywINC7(PT2y3yZ>_bo(Em@c3YvZ8Us70YM z=a4zoxZUS;RoaMrUN@YAN*3ef1KPp3{TBIjg+yKjDGWQY+*foBq)oh0PjBs8qgIgB25DfIH=dyHEd||q20{3Z_bgxv4mTX z4%F*%>Mpv&(oz{`;dF*z-;bp2T_oD{+(k4%WN(v4rWZ6y#g!~3NHFWXyOljZO$Pg2 zoWZ6Het|O3{5W}`sn=lx(4YIWxS|=alU5#6O~9g^2ZzrFRs)$jB*(}*R`Gr-07jO=Fw)QdK1+JJNBqBHZ4SPyC1W5G_sO~TBP@Nb+)U4mZ5qd-~nn7Cs%G4TA3hi#Ig`s(J37rfW$dY5m$iVe>_7 zyrRrudwCk z=6w3c3p33N^@AQaXsFi)jTtRO4s}>ioB~EApYnSCfRE?F&9jyyB_lb`{x_#C@)!$h zAi|PbxPB}_%2~6#MuG}ml~Hz=-Z6SFaG5iAcCcXn;Q2q6DjUnM59Xe8W}$+3Zfh?B zy;pCd@kUUdF?h+ibGqh1bs$-ipCxKGanqbFERgKb3a#WrnYp_gPtE%K5?&G{THr_A!oxAKw&m~)9o`;yh)y`VHHU^9sd za^*=@T;v>2=<8t^QbakWNqiZt^het;iPjDLdu+<`e&~A`;mlV_sf|Dr;z_v;Z%gB# z*+%J#y<-k;y;r>QZJ4BkCZ1Gk6fVKUG)W|F!8So+X6YYxcWBTVrOs>AB87+99Fjc7b!E;dhlz_#<;4v!rzH{UvnO4=*kso) z9-39gHWK&+uBd{jNs11ptX$VHia*rVmRI||zfYCFIb@e#_T={xX zvqokcT=;VBSG$Tq4%Wt#*nvjXdg=J};Q3h^okPx^4eLZL3#+{R`#EN)Aiiqa`&|LR;kG&zVmgNy zGXVj-+>WweZpwmXHmAJtS*$VhCB(~`wuyxrYn+=d3H}pW*p31vPb7t8a1xnRWzI=h zj$kW7B!usCCf#doj!pSZc1B%Vz7i3J@ zf;6@B{4UORD<9X80?!@n060fV@j?=(!6WA#Gu|5xKqV8>hQoP{C~25lQsML`X3%wr z5)d0dG5{kFuBOSv@-dxyaAvZs(Y=NJrQ;T-q~}rPM$3LhIS-o7EK@W@wT|<7uRilt zvfFKHeMriD1hv;PM`81<%Tk8=Q~mn*MPK>1&tD&(AHU%5kB^V@7koJX`uzIGyzY@0 zfqiB18Ow$;tSrhz5mCx56@mV&R6Nq*iYNGSn4*gchkc2_iC-y*Rp6|5SIXyha6s~S z5(Or}eEe{jsM3n#4AuMj{PuP}pFh6NU+2#=eEa&ke0_eNzb>cC*ZFe3T&CR2?VU0i zsNYfO1k7 zQoSkyy=Pjq6jkuU+`MXDRhVa5GdAT#UKDu;$bmlrZEN@j#1(ORtWHxO(L1${hADBZ z4pVq63(m=hJdV@iuzz`B=Qz((8V2coO7Wm;MSK(rPAn2}4;RagQlTUkz747L(hr0) zG1B)m`a06Xu1%KaQ4;4q4M#f7F(SpshO>%nugHa%u*MyzfvElVdq{E6H|q$ZKo2*o zj_LAhqC&+r-E^raFh>7LbtHbj9m?k+8w{1euU2vpJh5(?WF)Sf4KQE(FYTY9Y&AF( zfPwtznHu2?F8fp4adQ3b(%_2Sl)97HLxfb#aHlHQFQ=|l$196J)YTN?&kMx9n5dJ> zox$3rQ@CD5vM1d*W0FX-(Xp5vr4;iRg<>Gv@R&aRkXpnKDcn&&3`nt&0DpVp-*A6! z4g!W-kT)l7B*=)a6E3tE@ zb$WLDcxQ|BLyPqDQ=RGSpYQMZh_kN~`#f=u#_#w)c|i)n@HI5CK7C`V z7^M}yuaos%o#7RFNu(O%41ta6HILlYKC4)J3(E>`tc#hjBja;}(8jJS z-#*%?s{v;euM_J6f)gNZe?aRhE2_O>MBqKfpAmCCB^L0xxi+Wlx4)-kuL~5hs*Quh zd`VbSA{K%SoQ>vGeAcU%jW<E4V~0&|Cff~vaTb}OfaClw7bz-@a!Q&#v?x+q^Njrn zsSsKFXA9CG8x?|0+o{3zmX`^QzDHVc&ka6LDpFpF-lwMn`bF;CcnvCYyIMZDZQ5p)Q2ZUekDPJg~PCnKhEMVlpx6}8um ziy$MIEjQOrm@gJJ&8CygwgG-rSHSKn9QR@EK%DW)n>^~X2=m_Wex_N~iqloCEFP4DPn_rvHJm2JpeFitoepL}b8Qp<6coSTrG z?wX$IQ%TsmqEP*5xJY4i;ccFoD*!AiyoY0nq?V-zo>A1O8a1nNm?jfm`5xzU1?Rh? z@oj2g5c4XZ>k_nfQHYv&8w@7smlxFM*}e@6y22fn=JSVc~|!tvw_vt)!cv*4+ajSwJ0A;C|?d};;go@naLe*5X?lj zE0r6)!O(LSYsU#Du=t&8hpQ|3Gqv-H)JQv#KkQRB-~hhw<`S~4mNPhbD3`5*=RkSW zKoC`?5-Q;YkD1RMWO%71K0~YO!}YpbH}OS=vcK>nnE5>l+i>omk+qv?lF~06Q_6s1 z>H)UhzXr|j&@^*Trl~2`OzXtx-UoV^HbAY`UZkV@KO>PnY`>6v``fOuEo)l8 zsYax$tCLbzB_+~u1k!DLIbMXdR6~zj;WLIZoj~J!I4NXY89tOIaa(SBl+ zzqe-{(MdU}kI&PjT`&|0!e?|y2TRJBaL}!yDUafEVzWqE5h7g3k-Cjtf)Yh&ArkR? z{?Ku$t=r2~#`&l+=Z)O~)Y`3ljM#pGBOiu!h_;2%?h(~3UyFAJ2dM=3=4DVISuE~*c-l_8Vu>IVY z5*v;n71|`L*dndVZ6z@dcnUg6MjQY{B>aLr8j|FKco zv2rFu%6(|728y9|pn%l*3rau#>t7FQWb4LFQ+>|A+1k~Y@Ls=%<{$qs zAGMhm_En=Nf6Bj15h;2o$b!YFTL`D?-={j4M=+uHc-~ib{!yLZPVxKvuI){`lM~<6 z43YgQ>ETi?>S^h5U&-7EDhdHf^i6q#sN;MSp>`xZUp%6ZSHIM=oIdnuhZrI{T$Cp`p{f1 zu&@`LnM^CA=NsEsEo#&eA(E~6F*W?LS8WoifHFI!sdGNZE@`kTp&uxAXG~s|-`Ilk zY$;KVz>Bg4sLkdRTs?mUcptCHvfT|(FG^*@RboCqYJpwwSt^5seIGPEd%dsNOuW(~ zN@W;0!EJ{S4g9*6#fy}*ZP9~gA;H5`D)y(bc zp{<`M++17kRNJ>-Q8TimGUuL48~@X_S=(RND{|kRX!FD5knU}F?Pb5v(SsOI1U@D| zhDwZ0atG91wFkG2!UNV6OQN-;-1D%eyl8K*h6m1c8E2c)4buev3Q%=SfO;OO6CLSc zM*3Vq3ehLTb{^9X4gBq6UmN%EX@)Rdm)|BNWJbn)i0|RrOO}4*xEr^%+;71USw9`cBJcZDyhV760eOA zyHIEut_w)tk`qFS_jfFZ1o?i(NGUZJ)%d36U!NCMTG2{=70Disr{>2~_bl=2C~52m z&R_(Or1=;GVSXd0)AkW6G)*X+sI+F=&b<-Lonmsli1DXY@{W>SbpZOAfBgLXR6B3` ztf2F-mfRO{KIg}_z)Z0j3;O;M{ht@Pw|Su0<&1J~TYy5)g&N-Q7Y;F`KO*gV~ePuQPPJG%JoW%?mTiWQvHv2z;f zFKnJ3SgGAp)PyQFDjF0o3e1hNtSW}bmk22yC76$DN|Hb%LDXgko71V)d{Sqm@yeD|3?i>4w89&-qR*8T z#k+*TdrO#QeIGEB_kUiS5N%ykZPy;qLBgoNOf9nmy`U&(l=(+WTmPuOMBA_7X6Vw6 zO*Xvp4OivirORY2x(YX~cjy z-}Sh$KX}=g1!s z?ekeiTHWA($0bL>y}PB%9}B-+S_<#wwplhswPi5qp~sZBWN-p%AsbW){HYcOnSP&dRFXC&fMqHxjc7gW78`rj&v3GOBhTvH2Z7hS=@=73v@QiAOU8b z(yNBnx}BFt#Js0anJXeUL9Ot?v=F&vWkQ+}48Pfp+gBEe)|y7wxxYMuN|6$Awk<=w zcTmrCM0Fk((*2wW{-WmRdc6#0mk1`Y&k3TBTn`znJttNOMrWnh4V#Yzg)CUpTd2>* z1VH@Jb!Hy0_EYs~wxD(z(_zm`5hu3cU(FS^y%(L={OZv#fm}ovs$;4u$a9FnH zRi%&tWh|H|0NA>s9nQxrP70!Nvc)=aauL~ePc><#f}ek4N!(N0p1IDgQZI#}V{u=C1+*3vB*TFMY z_)sBZoIqOcS)@4)q2xBC7FSd^eo-%AKUwRH6xgu&oVEgm!N{tXf!-_IptO4vE}PeM zb0?w2ZVe9ayXkhH*hf25miR`QeKG%qhxsLC*(6}b%`yM#Uya%18L-(1?z1lAi|m(rtp-QIGz?Qs|u0&OA^f@>SXblx~k- zeVq1oJK{V4Zx2;tt)7Shw8VVARts_7)HN2hN_&=mT5Zwu8x>l*oo|7*{=T6m_qr1Nia>1)MbeLqObtmB=3_2Zcm=-z+YWc|TZq{d5SP){Pr zC7@p9lK2szv6;}s>{d_j5|PMZ;G?fKL&=j8zMT;+ZhoJL47W+Mp1GxvwbxGbH-EXo zAaj>EYAn(oojulDG6ov5FwcflN*O-;%@>o*E379t7rybfQM(KGvi_U4Js_vJ5N2sT z!Slm{(*n!~hq++v<>0Hh^-)&0$f+gpErorJNSMYJlqF9@jpN}8=LCz_{-xvDw?`mT zZHU_~`rp>j9!x2xg28NR?s8wXOT_V8#l~EkkCf7%i$>-oHG5M!0;+9ph1dd=)VK6d z0C%s?=&`|Y9AFRB_9)d*8}ou2rqH!Nm0(Ut${IGq+C}^60K4a_QYG7Z?&X_0d(UN{ z_bOoPc=NW_{&tW%btIrZY`tc$D4kIfP%i>S4!dV1&A0!KjWev9ygRhsr{8h-vF+8E zXle|j3_AjDV)g5~+5nadvQWoCGKS8mc{jQB-Arci)FJtFb_Dz+7eNe5v}K;X8NMzn zfgJ~MXr<#YkwJHOPI01uD1nw>J~B+){M1~1Xu=hYX=q{)XRX~eeAW5{|2ywr)0x5Y zq;T&^q3$bczB#RBM4=AsI#z$^HE_#d#gyC#xvLH&|}|v(4OW*9j5lxz@F=s8`*kA6f3I$ z?`;>y1k}h`GHL23;s<@tTLP@h%wZ>k{%HMppl zEIX5DqVVHQWAaRWuG@Vx-)Kh4U5?cHP@#|Q|0uJE6yUk)IJ>6z4(PKF?o2Z-;tJI! zBAc)E5zL7>6$@(XgOTEGQO4wYUSaR4JQ{B?jl8?`2WV6$B6w`?c{dCxgJM%u2_zCJ zV)vt;n{!zpBi}mRCWx0-N${Kz1m1f|6U{}KC~C>5E1K~-Mxszo``chqu^v+- z7Skjnw}dl8h+2y-Nxq7aolicJk-r6snXV}v>ed~JUJl#dav9_+p9h4IIJtxpuDsX8 zU_mi)Bt76v_5KHh)+J)qu%w1h5{$6ImG^CFbOYAKlv8E|aoBx$K%(#G7q%KTNQshSuY> zV-L#ahp7N^A)}L88X)kb{Y*R}x6X|*)%yNj;y5i)XrgNU2As5TySfTDmvYcNd6e+s zMNzA!0UowLF5tZPII~OYUPdodo*H-52EE!)I!6K3lIcl&={4@YTSl5)z4D5_IL{=l zZW|x*kOrTu_34ODisQF9A+C^2QS+>$9lcHp(~iXZR{%Qeltv~w1r{|P=`G_DQ-f); z+=$Xh7Iu`EFk)F0Ofq(9j;PB1#1SR6a=c2)G1Fv6z9^Ec)NT{b*JbP;{dYK?F2(o# z`%cLcMGOWCR+idFhJE)VuO#dA6>*LW4Ly+>J@*N{_U6ScOI-UwSz4i%?ekW_68REcc!zsxC7 z0GiBq|1jZ5(HUR*RmBmz;Etg2^u(C#9qZ8IxqjRMduK);g?DcV0K;?W08INgFtGR^Z&PVgW^q41%o$|#4{5|{aX zlXFQmr}~1;qU(Him;{Dns8q6+}nLePHeR!5|KC1V( zCTfi0z#xeW1Rl=XR(Rx$p2v!U&()^ z)wJjw-`kx0ou5PMvaq?T3X4fdQ(7Gu+3k_E@4ThwQ#yP?S()C~Q_FnShVMls27vuD3K}^*YsXcw~i1o zr32#Y7$>V5wNSD$!hmy>%dsMNlN4d*gk#IA6WJiM4M+_Euj;#3y9vqya%T!`%9WF7 z-jA%P%MIBjjE~ZkV4CZ8tv8Qd!rK{;C*QC@c?=ZQZsCmnKG2A9{{DEWof0HB&&E(M zt|;lmyLF(CMWC@u>WI_3h;dy>(k!WnBITPPh0c*I?{rCRE{AMb(%u|>phAGf_}(HU8({$b)Y1}NP`y1ZqWKb3Fu;m)6%8#<)7Bo%yGrkoc?6nh5W$$O3z zM}vK+ia4>WplK7M>5tB}kr)or;=}f%*70zgM#&uH{u6E!P`5;{0*mak+{l3*GO96< z$}y6W*4)kWVUl*j!g3kt&;PG{&Q#^PKc#%!8dWB#Y*T~@kEn`Y%~$K+i}_Zv{Zh9b zI~}Tt;;ay#X#%9y3>K=UCEbFwYaYVvof=Z)pZT)}bM?79WSY?w8 zs;H^9h)%O#pn2UrcAEzrkOv677@ye-h9y)>Vj#xac;V`xq$rL&l)+gUfN7EggghY#o5_{|EVM1H{ZPN+6Ou3n<2ak*JEA|0H& zA89lD|3}-GELV;zORo7DW!*ZN($PT76IE?8Eo8muyVCys|6epB0FnVt04ZJFs?4l< z{a*V8F~s2Ez6BI~nv;ci1JFnRD1G8;1dDRdda0RxT8KQ4HFJ@Gsv;+KYI#{%u;{IB zf`f?vvi{#Bn=fI`iN{FA5LR}HG+uqVd0$1kb&ryA^t%b>e6qK65T8Fiv2Ox5@o~PT zdZ;@1(vR_P$aY~&3d<4kNrh7drm`e0b$0dX!Omk3=f`yTH{N`7 zY?a{=uiAC1QEbgLPbt)7i3IICIQT>p1PsGzaB7i_U%jB#Hba`A&XUyn{IuZG<$V0? z1xzq)eMxG>b(l&+*#rgaWcVe$g$)nk87T2(20!6sAYFrrMH8E9q!FqDtFgr>o`8Sx z6UjQT7vq9{`l7=O4);78HCB*rE9$v?nPMPto>c@1sfzov7x4dlx{omdh64@^cRTl-rHC2m!$};T2KNP8v-fi1X;=wq|U|hI>_an`7#YLA~PS1eHINI zaoW0P%0>#9;5>tUCInJ}dB5ME;@|)4jz7=${PX;Lf4;?E;rDIxo{={0+FWkuV`LVA z9*kgAmovWb+J+d5CDmygeoeSUBT%T0$Hf(r?$6?y$I(zAl6_Qw;x#XGfAI~furg$apID}#3jgrFnXL=zbNkj^QpF~pC8}<4O_V_kLzg%Fq%DqRADv} zt>BCgQ}NkDT{2sm3-+8dPI8Na1tu2Bt0-gK^cM4@*FnBcdVk*kSOz4u?N#Bn;S1F|w#-$t>OsRyH9GILHP=0@F|CYK6e>MuN!k`3CMn zKAEg2y-?Ad)%0DGPdq^R{n5R=-POzM?dH|pJN~YV-osWRqWPv}{H9H#fH`|m3834w zsPEV$T2xuh?~j)H&K0?Z)EAA(g0PvEJ6)x`Ut~?G$;PjMQYZ0bc5&bSqI*ich5)6~QHYGNu0Y5Ls&w3YUPVP?Q zbkwOWcgLTv*@i1zPz#ogTI~UaAiozsU(h6}d}={+{0yCDn7PCf2|4jas}W@M9qZ~S z_h4ep;T>Q9rM!FF90u5-IJ9cSq01SkAiN@mgX_R2tDyW^^l!)X>CdE}3nxpPiweI2 zA5h5fd%4C+ijLqvP{E3{$N8PNX@^>nrvk2X5PyZeEh+9=Rl8$jl{{v65g3^GP^86E z4?++r(yy%P2l~ooQTLG5hy#{%hJiuW|I+UeH){NnxJeaEU77->F2X#6X?-2#{C?Vv zn@JlUE|f}={zuI3U}hlR_LlDg?MKyDDd7i zI^YT3ub__iQ=evq>QHk_9GSU#ikq~F{}lf6xX^!{xghWfQ3-f-iX{0p!{h}_jnC3H z$ZxWqAEk9u2>GDj!VPP=;Vs<4DOdX~>!#@v6|_tOrmUDO)js;iR|l-&h-DZA(*x-; zn^{5YnwbYUwSj-EL$Ql_Ipyrp7njo|U;8@F;_bX8kzcs^dG_=XrzO49O^-wkZ(I`A zm|^N=F$W5yhaf>;QU-I z<_6ByMQZlSczbNu4P)#1;iO7B;K-Z|yFR}TzW4`NV0PaB2`~0BC&+9|DgBV6rFYJH zlF|WwyCknBg~`BT5V*s~8#BQy!#M{YE*LAB0Vgn^Cw|R=J4W>eULs&oqF^I(2p&kAMvBapW)u~xFKI}5!mbCL8Zvgeq-BH;0MZn*kb?*|M>!RSnurPxI;6XNi)O)M+`A^Nuls z<#{)rZ}Xep2-!>$1fN(uPL>}0LZpPT#LlY&T|S}nLZUpr*Mqm$ye5D?WaA!Xo>RwY zr;1Gq!}U;hs=?gXpG^7+=}*7mZEXqA$=ceWpa!x@z7wdAeV`zd9G-%Ey2BoLejc6& znN8b5{M~^%UjcNqwwC#V5^MRioF{{)pz}@wMYG>sRB4hVUHhWiP1RYrpe(y40Rd*b zpppxd1I6br`ineA&Q+j0p`Iu9jc=z3`5V51b_*wX4B~KT8%|UrG&sWcswc}nGZ#!R z88>J&8L=J=Z^&|*;=_w1J6^%~HO+=%`uR53ZFB9>gzy;7Ti~tzCFUDnS!#JIQfgPn z`O*2H)C~n*SQerTKka}gf!rAE;d2kEog=BTD#GWud2zO-0qMr}^dzc^TftxH+boQ_ z$db~a)Unb2u!i%S6vf5wid8`S8&Gl&3PkfR)%_wcK}L2J=xRyJFR#KCHA38_#^c05 z?=@AMcDi^(!Az6`5w`|&#A)u?UP3dK3s4Hl`2jxlrKwctGQ2m7e+<&O>!a6!7*d#;|E4y+x2Qbc%;c z&^D-6#Wk8da4Ik{xfg>Soj7089VINtyV`z;|9N~doF7kz@`I6v9z3Ny#2kA_V=9Ui z*Xn|<_h^_J4kqh=op0PEau!ZBfVu_0|H|BNMJ^*RIfkV5s)Qx;oIWZu_bq|KTOZ&*7S!j)q>CjW3hYq(Ewl zYg8+|@ar&-rBYwvujk8pPrL`wJQx+A$KDhdsY?Dbb)e&gZ^$|VdnjH|w*g#6v|s9D z8`d_>0@I8#=_Zn5i7BopZPF83g;^=(#&mz3hnmaQBJ;IRXg|8d#XDmu z*jO?FHW6f`aRV4qD>X$aU&_>Btm6Fc_5vtu#$L1 z;czt(>euF)hM7ium(UM6%OKsdy(`wW%%8AgwgCINv91o&`xkgY8^wxLRS;zDfkc3E zdZJ8H)H+(!&%CIN*#~Vv%l%nG5;@3!ecWd8REBVinbg0pVcP|1zplG>=-a`GgSU)# zEg!!SMm8-&ce3r|!{kkTQX%R$L~Oy?vbY2Kp72N=0EMBFokwb#Y7OY*bm%6yrBRlT zl!Cs!)z)iH4phM?gY*fhnY9(&nH%uq+4^f>;KyBPJtg@k+oQH?F~*v0o9KHAjItWk zPnfx!q?|P>7if@y^0+DZo4?0Rd?@@TcL>A^Nx5*TYE9UgRxNS%t~-K>KFAXjVq!ti zc?WTG_YnSuL!4@lmkV0%F?SZ;5iyu0PL@>4s$c%ABgXdQZ#EH%+_MPJ`mbYGro)kp zF9cYkXf(p1NR6H&lstyDh4gcQ6s53%dY}0Bs7iZ>UtdKCMwlgIW6^kG{l-nY<JfH8U4?`G!)ceUEmx@>qqz6bc6PJ8bJ;pP*CSjH&763u zX!+T#Qm8%&)E$BR-1Tm8`ByXWRT$kiy^e9T2IoWLr6dQcM5=PltO@B>Rqs9w%%Cxn zbLxU8iV-NA>X2jtxd&O(GKuQDT!-AdLeT;{&o!F)uk`hwLwLUb8SZa)=N|l@?E@tb zhTGOIvh$noR&PF(c55q|zrH&&F(ge}^8rLY6PZ->B-(dn7G)EQxCV3Dre@gY!FjkB zuDOZAxLEx74Ct?PmzLLlkK-+MoS$pyg5mLfkVF6eioM4m+3m2(qxPh0z_tVIxWR{b z4=2oK8d=A=m6qzPO`88HJn+L9O706L$1fiL25tlQXMhZ@N0pk4}d0 zHv2ZTJWhR^VHZnrzAT!!4#f24LoajDjH3J;IeIfns6`loF^PEv#oYVTYk0a1(n&Mi zq>;BL_w;vR*fpk3`63k?9p^2xV{(%^n&pYajHoVXjPz?l{ug)=lL`!wVkFeiC^g%; z#p{&RfL7Vk3h9DBJUnMvQY`jA#f6oxhs;+dn=C}=T#_Nabv=7pbX*@w%#3jIm1Jn2_(6~q0z%1-i7z zctgG4W5S7UoOFSV6sQrbSW!!hW)7rO`>u-e`}?!o?%)4RZ6h_y3@XDwIf|%1MySP8 z3hG~}t9KIVFEvY$Y!r__94Fe;LvKF%=~Y_Njp)9FNk4tAK%w4BzNAw9{8+=HZ}JqJ z4?aZ-27@ojx~aCH-yH;`d}NytIj#MKRJ0x^4#Rk$Tg3%kQ@%_~; zO&}l)mzW312@Tq1Hb$vt7b+C@P~X1^YI0pquTm&}d@wONb7yCsw%kwY4p_dXNlLi_ z6pp_iz{AP-LI0*M3>3|P3LBp^3;IQJ7c98CVQPYpo3_kj(Q(SFHv__1eVJot@yMxv6m39;*Rn24=Peinp}1U7HOi!=cQ0 z2?1S#e)}Ruu@2{PTadmd0jmI$FUoePPZeUoWfarB>T1HwxQ>sq4|_j;RpQl+##2z* zcW{js8_En}0c=<5 z|B(%9LSmSQ3nOJFv0@!GpB1BfR2OlSO2dR#mo%5AZ)ssK%#|!nW$7*@NWr@`F`^rg zF5JV3iMV~wb+z*g$}otI?^8@qoua3{5Q_j-6eRi;jHqcxTnWlQg}K3V-Uge0r5H+yM!#clq!`~Pn?)cO zApf%fNqePJ=kXty*$a0NRkp*OKilPP%FDKH-{#b8Dc0qZny$K_@y)j$_)x(cG^Pmt zKG|jcAkJTyO%j+yIUh_CUlNV0hVpy-^n=PzlCQgGXnDm_nqZ}EU7XHNvqe>?!!(rH zYSwHnm^IV8lny^?oi!_~KtDPkmlH(pCt*1J#il>7YxVt=IpVycROtYm5|bNl4JBwY zSPn*wFr{OrWHcPDXloxzBX?WE+=ifMzYt{r!civ09zsnYKg?oal8li{Y@vqx%FmB& z)_9kMcni}78mRlloiB@6Una^?eMP^?fPrt^q$kAIh)3QIRExejsu}9o7!Q+?TOqQ1 zVel27C&3&_s#`|GC`lW8Tqcp~0_OJ`X3^6RR6k(qMFw|PFKD*-0dGvKMmkY+%o5h@ z@sl1Y+0~Zx1DU+388u$_Ara;BQY(zC6zD;}N$bxRQAVzm1ceUtB~fe8Q%n_O>b?o| zVFfK*SJq#8=a5ZHuU3a{1vUxZ94~D*Jb+*j$XiU(>TTz%PV55B6Tv`f*X|+J**f7+lQxK(xIM)iR>CFwGQ8LYXKu{?bUy!P!I|6iAEr=gLT&rpmZ~jk zOsaq^2G42C!tY+a{zj)~%f)>@{{>Prrv42`bv#G$HW{97aIl`ApTHq^uC920q1vBk zPNYGuthGf32uSrD2tZd-ERlXrNIz$!c#qyE{{CM*gtxbNlI&j)iVnKBON|~?dev-9 z8;*=_1HIE8+*A1yD~VVw>Vmhd>c;n0iyqqf43H)Ha%EJ^!HdXRX?js{i;@i$jE4$M z18D4n63T6G_H-pZ=^P4(R!!Ukb_;7>Qs$EEx3XGSzT4EZKqlklTtE1 z0gCn{OQg)ArA`ady+yTnto${K-^z%X9DbTrC*dR0)p34yeh~h_ap$&o>FH}~%aM*= zr{w7e=QkWQuET_!+M{fw|3&wgm818(p1R1Yc;ZXeKtl8E_WJq+2FYxyOR86u1p2@; z`Q5AcYhtn3-&H*R%_zg85WnFlDI=PI?kUOSoGSc;j6&^n$j7H5DB!O10){#@pfJ5@ zjMgkAP9FZs%{1$C`z-!?wnznfoDwVkF-y@&L9m2sZSm|wdtw{vCxwa=@L{T(2b2|2 z!<(svs0aM>EoX1CRrT`dqt_?ZQindQ$NQfPph> zM6pe2CWUH;A`S6@#6*mrcb4=s9=}&-ZcaLPdtpz`J~0=6tbku%-OZULS9)aikGc(F zx1>_KCa=JznhF>OU@CpIs^1B0BKZ2=d&z{4r{DV?-)k?hWF144G~v-Rx2Jb|pf-So z3KSX-MGIO9BHAb3iJu@fbXk{ay5mT z?*Z2c)o&@X{-jT}(xA&H~tgn94Z-*4}C@&59@-K88e6|)mmbI|OvPy(9U=W(RVf{2e=hw=NeTX7cYoI7V4US=63V{{3IKe8)yndwQW@*l z!K!Ag=4sCOEku6?Fe{~pzefB$^oDZV)=1)`l+HK63u^SNk6h?M#`zz zDV0G#2F(q>#h~Rrygh6q&9}ecdqa~3$+JpWR2H4nz(T+c%0Eb=tnAe9BhKGoWC+4N z==*jOP!Yx{oi)j!Qp+n9%wpC!zl(1l7gZ^g69)Ms!1s3$?pErgxYMEE$VrA^)#?Q& z*%Z`7&~FAuz{=UjK~&*J{&B$nxXh-5Utiwu?=R+TUX=$D;<19!?wGNlc_DeI)S{n; z^6U**O9`~!neoERT4C=eChjp_DUVgLtSTvtHbNbUtX%dld>`UTc#ZkB8VTBrpwyiM^CG-gk@=BydAEh}r!4_X1U6!?2WY zQoB0((EqOijZuGaMhY`olx{>-r>Ut)46$e4@_73f3rh1SgR?!VtE2qx`q2OBM=`9? zdQ0R`)n1#L$O^b|qk4&Y9z7lHwEeP>9#_1MbX`(`=9!lvKKUVd8^A^Abk8ppD!7JT ze~kGH>W3}!D28uo9p|1H9@c-ngATBi7iW7k7JWgs(W*7l{OY3`o@+t6+3@waU!h_F zyTAu|#p(idg@H`tEJ&kKmJ$_1bUm6XyRHT5bC$loO?BdIXj57Wu;E8Qz|eC&gy9jt%~$({u*C&c-~{dSc$iM(LAHRNRt$5KJ%gp>biOA>B}F63(gG4 zoL5+mv@))%E*dCy89=93v<}q(8mN*C6WRC2wr1Fji0?gUcmapDsPTYgqnV#ka1sE4 z!G!XwK>0DE{D8jH=t_ONyC6X87=9VnLxC&JD2Fr; zP!tCd?1JY(p*j>kZ-ff{Jt&!^u1Om23Z;zKueg;{tVK!6q+?Zw`q3FCjQ3$vrGNWa zUGgiZP>Y&`&E`>6q#xbwCb+(Hfhx0ik98DCN#n!4Qz^ZOgr|FS}N5m1L8 zOnYou@6ruGp8#R=v_}I}8SZa)6B9pszrn;0N98#?@V%5zxwb0+Nb}%x=6N|m;fi<}@-> zV!W!UHX;?9bX=u`|9b=IM*;M+y9H9Okb=xi0~ zXZNc7v(|cej7JHEzO*jrzUG3@Vcr5dS+&G{z#SQ!E}+J1Rj0N@1Jon!si(AaubA*c zwBpby8cgh`y~?uUq$a0Ibybw`tlH(>A8O{2E#2M}0~+QnsJBa+{IS01OS?o!Z@_wV zS3Uj6lQHg8kWB!(r!Jw2F8;Tj(iM}n2|lpns*)Qk$q%RO|Yj{HSbhNSCoZ2fEO@h94)4buSt3-1;{j@ zif0U(rXc8yL#grLYo_&0Ki)NaeAH6k_3iQYaC?#R@sa&uQvO+tqwtK>JQ-MnC zi;ktz|9K?}?4N-q0g_U-pys=uk5%+4RG6E)&-1dm^kWNw+_P2mbWK6>7n5oQJTH2q z7M(twifL_2dV{)3Jom3b4SyocSEGmV0yy88%KbA59TXS;pp~Rsvy@cfQJ@p8KpYhqwB;35L{iqGSjy3gej?1xQy=>D$zN{Z)G5!~35{A_V8INbpC}_K z8lnoBg6aClkHIv!)(jSYgGDYr?uMEmS=36h6eQsw7L}V_7^c3wNjiZNZ6-=Rh z^btZRs(j-Nsy{M5yKw#EJ7r)5S%G4fF!V}|4=S6(DcPk5wF0wP&o?=yq<$(-gtt}A zhc`M4X|TOxwl~n|SH(7^kH75m)MPVOx6ed7Nkh!d$rw*TSt6!x6SE~!jqE<%gcRS+;}dn79t0_Y)3^&sR$)|9Gx#($7F+;s>OhCjzjnjCtEo0Ze}>h1N$hlgPq zs)~kzREGv*Hr`k9akX?wsRX4{W6}3`IYB$S6L+&CH2#B<@5)$^T&#jNs8NB+$gU1F zFR7v8=)W@Bm9&z0590VV_!qP~l@us#S4H_Xzf}iwXcy=E!MO=6Z$U6s5IS;!HNC6x zv1-BE4=H)FItdTlkoFTEMKD1t`6A82O;|NjX>43k4JCBc94D(vqrXuwvko)`D(3K- zG8aw8B#fX6#TT&(MH-L3!D*>hq~+!0rltxIYho62rQL%jL*R>IsE9igR3}TIoHOg{ zD0c>sLj3Ab0?I;f;)1e=$({(@;IJe;`O6kM^84#hJ7w)WEioy(`8TMl_<%*g^M)7> zscA8ylEy*)O>ccye0t!`qNLBICG}p9N_6p{=_^{!s6)UVQhuQGWH*sIJ(?h1MEa9U zD(8GLN(Ciny^tSevUo>9cxvuQ?}Ge-I_g{8i1u;rN`_bKVm4)l*8moCLg?*xv?e+Y zU0#^#wO(2p@GX$WC@SuaCZsE&4EXRb5<`}VUfT28vq+vnWqcLaR*+$t0;khz?DOPy z^a0NB8f1L#1zt-aGBu21xmcLo(DYpBq}Z+6l!Gd2yzQlh(gej>1STdspH`RiqYF>4 zZZUG=#<*?up=&NUFmx_c8O>0N52Grc&ge`>t0MjG%wrld)!R>$xWGk7v%DORQ%v}w z*zbxcN>b{avT5?X4mBoypoTKUbDE5Ue`f{(mKB(Y$);BrK{o)6qb!;=+O7`tqnpAe zx0^|yx4y+1I^3epI|(w0G?SKQ8ANlK<*gz80P-v(p<${?z6^!KISUidGpA2<+qhp6;rlD(QV*FdxR}Kq!SHF;(lLL8;v8 z&2nA+R{iRRFmmS`4HFthQ}Uq#qfzj2E6Dx}q`B(bf;2edj%8-+p;_DG{hFd1(34EO zr$CO->>)KG`E8070-idRiJSBPdoLV zT4}OkG-(=Tat(IWBrI<+LbJf?(&=x(3W{DH)6~~uukI^*vc|$MIE=%Nb+nYOmys1} zJ5*tUod4j@-BP@A^?lf}f;#;br<-;h6N=sTx1tLgHRqHT6n#yV6Y&{JY zG|f)NoLUx%s)i=|v_)-7R1(ndZJ^%>v>UV>l)J^pclaCs_-GzqwT+KGsAL(*2DY3< z7Nt5Omzz122DX<4#xzH7dAdbup~CPKNw+Pj8%o!in&F6OmPr=iE(>0hwmeR{GrD+7 zlaPOg`nd!3t9#L0>JXg4klLA%m=^!pg~wYE=9rbr`OdQ+@1~fV2<26L)k%C>2<3__ z>04dXucf2UXhTHm6o2iN5kE{+rA)5P1v5n#4Ii1le+yDvz~dYBY|J-~_X{1t_CWMs ztZGqI!SgS=I@FE$G!%dG?iyB*$B!>6$PdS~xd^2xRELw3y=#K%PKVO6c>@4R1zJC% zC{-0ozCvl#o~$F?$WUl9Z5f0tS9l4S_NjPT#WaN%%;ZAKweN9NbJ}+V^z))t)}? z59$<418)kI4kh)dL1%G<<{0SLNB8mqxk^BBtestOMT1VIHnnyr^s^7OcR6NhfC>w0 z4{4tlfSZH52q4@tPu8dI?H)i7W4~7QvFa%R!*~i@WF!68s_{U2`rlb6ly$Gd@Qcl zvHG#?ACjxXR7=&@U##rsq;cZI>!M6qX#4d^LnqPG4sn7~{;LXn@HT#K!;?~$K{wjB zAMw)#M=xinr=Y_lUDgsT)7f^s0qpQL1ZLsc3c;FToSzF;T(15m;+OD1sDnnUQhaw^ zSuOyyK!w>PKalVJTa;RjwyqGknqt(uP)!tZ@1uxH73gPoWaKEZ@BVhJy9(^I7+OPw zT^uW_L>L#bEY za}h{dwDgdMGHYDF{QRJyQH8nAu6(r;pj#g+245bv6N?bgl}~`qmL3gQAKlRN#{wJb zeBS1PfK&16Jnap&N}&GJ@~DtVauiUozuZ&7l0}SGI8ba*-J5>?q6i4% zG$Kjnwjf<6*e=^9!*KHLTFFA8v9s20;g+y~YS?s9)u7U=2?VoV@elreaPRQ>W30`u zIi-VLmO*tgQIabPWwKuM`Tnm$gn|RcxNg@hZwfiYFJ1+UkOhs(8KOXa)Fwwh@{8OP2Ix<7PdG z{EkVR?t&^*kk!6B|8gHZdqHz2FrvRBlQH-GRs!zpF6T`82IU48Dl{XqwT@%1;k6}!WLBwAx78V8q%*$KRiGsP{+;sl-)l3 zVc&hhyp?-WQ1N(yCp8DhXL862q?pBkQ2kdO=(Z(w%DJ`S#w10b<2iZeyuSlRQ`$ZA;BjZwR~I_N;b(p{l2f_eos z2p~B$1<>;0a#(Gt<6Iy9VPe_YAh(Kb&DI|r$PC~l%Y=~hOchY$H4XKb7N{nz-fKKX zIyr!N#5@m!g+VgOsN^z>Af&y`Nrgf*ZLxW@09JhXi4+zoHEQ3usB9`AuP zX_bL;QS4KZZ%6xW0!OxL!z{p zRo2pI_9)Q?Kye8&pyZY+kfzFjkWElQnd&)}SM$ja;TMMNM;A?nV`4JK0?gWC7wBRa zs3c!kgZtG$xb~-K?NezO{BvDgT&?NCn&MPt(aJhZoDFe>Xw`4{sIuhvra)#x(Oi(z zS!+D~5Wm)8CT=KvbHBy92$#?Q+L)5uRlK;XfO-Y3f(Epm;&1jPd6WH`KmCT|Bf%;P z=8aJ~4X7>a*Vov@&|w_46dL_2^5|tai*;^d#5dJ~WVxkwKmn=Gp8u?NX<@HO#LCOgvNf ze4(1*8UJ*DGnvTj6077f{1a_ZccudG=&0vyxFW1Qc3TAKEV>w}&{->93T?P#09ApB zWagtV#igM2LP(uN!C>AVy2G@-RsfaUA}in&(2%3)_y_+ka2!kzXjXeRrb=rH4)54$ zwNwF~i{j?jE~Qg-px>R2x1LSPHOd1yZ2eB1F0kP%g(XW=RcFN`RY-00IBA(Y>MBUT zI`GhvSd}o82taa{_baCKBG=dY7^~2kFfMyyP>7W()T*xn#p!U3uf81!lkIh?0@y1O zt5{x_s9b3Jn1dBZO43$$+He3qHUM-MXmAthg zw$JYh()+`+(Kc}`_?fA|+-@@macWr}*Uys|vurI0*Euw+V8uRFt9{x8wkurT zlX78J1V9Of;rUUYfBhX4{$hyYm_@}(^6iVXAI0DpP{M0#`rW89*{_BZ%l*tXp1%6G4BzRpmVrth3vK~>5BDCL=wVQ1 z^eI`m7+h&ouDrAQ-ZE zS{54nKdJ$&j26hs(zg}HabD19p^mn57Ci4=s#he+MM#69A^$hHw6ZI6HM+F4R1IEh zSOKgrY)r3kH~`1)eruLx!(*2$t05M(`&D(QpOCWr@q;mih}loWE3{XOm#aiGsNyXsUf47zo~A^Pal)cL$xwi_ z6tKPQSqI8{z_GD-wrGH*i}V_#Vf%Dr9Yg)<=-0jv!;45WVjO5pDS^Fjzgr7=nDs1M z%tyV!0c@fR4AX)j6_CSLU=E{c=@!iI8Rpg?OL8ld7{l~Ku>F1c5RCfeSt&rs&5?E> zuW2OQ1J#Ob09~f6G8KYqOPWU7-PTaEBNJ}d6zv$g)-nf_1yQal`TR0*K&l_V^}U7rGlMz>Yhp4)n7#Lb!+gI;D)-9t*86r1!RT zjFO}!EG9$(3Ial2g0-^DS-ENgJKW5$E5PdY9RRf88rJXbevd)BjZ3L*id5F)t*7^EDzSjW zHcSi&R_b90j)qveu6}>W2!#M{oqtL$(ES*^*qZp((a{<$VZjsJ#Rq}YB5R?+Aq6yp z!N%nH^QRnZ+LVF%z@m!q!w}dq3}{mc#PNIZT+#8~G6iwX6v35NXkJ@K`d<+V+;ZHS zH$Wj50`^-k$#LuW>yJ=V4)}V`aqDOUq?Qo4feUY8u(4=f7783vvkvG?)kR$|Ynr~BlY-B**UqjPL<$t&nbeRcwnpVLx7J~H`hC@nE zXtJW3SVFTt58sU-KcFwX1rpSPV!UF+|Nb-FRWMIL47m*=yX+>JTfcM&87-l6#=@4C z&{-!CbmHUV-+M!i0zinvO-~ib$70!P^Rs{D{{mQq?LZuYkbq5i?gt*8O#Eed!s!;d z-3}gKD!K7ejn+`$U97E_P8WBoEix94-sP1KpRtxHOIY6oXPXyWKBgoFEL0+}Xq8Ks znY{YBI!vjw{oR@H@bEC$7m14DW@}JP!->93QN@WSZz(!`7|DkCmtpdXAc)fa;OOlz9lx0YbL+vDRSf4NECM_7MeUclAj zC2_618MIn2Dmz}(ZJ%|DRTYImHCkD1UZm5aqFz``(^AfA-LJi>8?LMKbyZ?bqBgdx zZ2-jj*WoS=bM?(XM0e4RE&!cKnv7|_xCq*v$?P4OL^9&uSz=oUi3{*KC%>ryeV1o(4Y-YRK03Q_TW*#UedCt%fuE+-4b+T7& zaRsfab4{=eSaPf z-P#|-)tPA(BLE8tkE8{QLMevznH5-F(o355qSY@d;sBl<5E;m_x_FK1;!^FCMdT9b z*B1r)*-fF|^h*r2fEWZZ!DCEeU+>%IyJIVWZCq4|z6`>~&=Ca8RMdzU5-gx21U&oN znl2;OnYg(3<4!Cj&)03PF!Twpz(oCLVQh^)rL>ZQrRM0lnw@75D0QX^~%xdz(V7w z2jd8&UDx4u7Jib*Vf+>SH^Z?wfNu5W1NjY@Wno&=5Uao{HAm`Y3)GE6#mawvxT1B9 zM!ZPAiyKxK4{TWyikE}Mv8%INU@gk|dft|A!`PgB|02XjxfnDyuR{$%`4CVZpi$(w z87l9YXJ8_t%q~=DUqQjR1*!*8kobm54PY}~SA;L8&sFYT#ka~VrGi}14>BUD15{yN zd8lN|^$!LI@Y%hh=EkCDE10<&d<1g6NpEukpyK-82Y(OS{ooqyR-u@ck^+?&S4ibl zUWW>69cg7f`4v~|6s>YpVh49CxS{6DKO@cI>UjAdBL%K#s=Ze5KE!Q2IPX_l7OW<^ zGP+&B;zIwr*abyD$XHb5u5W^hE6W=)Z!WIx!s>7iSVYRW$811}#AB>tO_9QPr+s|3 zeUJ~q`N6nHyt)SXcLv>h@9|l1;ewk0GMdnm3u~E*GMYrcj9alkP>0;5VLKSU0}-}q z@G|~cyuUv?9sl{7QjCEMfeDy!1&c$vf6K@<>9e{}WVDwx9%$xgPi5BB%1&d##ut)xe3ZWfoehuW~{7f5;e{p}XgkK`m&Amt17 zg&wtT;}y#x+J5whr2*crGpxi9&=DsX$OGKHHI+agGWKU{s-`l*rB2quqSwy*l!k&V ziG|6o;TAZyXbG2+!4$S?bQ6)lX%wP3Q$;WsgIFL3G~8F+zM_FWuD8{sSz-DPOm7)0 za2Az8%SQ?6+O@j(`3v5lKmGmx2fM=x&7|U9B>|QwwAZ9H$wi`ya}2QTSX_C9BmXk` zNvCLgF)OGW6D;Ae;R?e1S{z{Q6FH~}YZyy{6O|!8POqpb@7$|1?!4HwNERZXXL5CG9QVw4~uZxYu_T-}xj95!UnVXU+K(4z+_aw}6y@75g-XfO1Y) zNB3wPzy8F2%lG%k<~Hq3xEtrg@Cd=)-EOd&x1ZB(+2F-UQ_NoC({Bwe1PVq+n#O(F zaHKX;LAfjoEtx?ll;RlJa-h($=$C6dZvvrnzpdd401Yndr*Sq%bdJYApHjSDXmG{b z6;wmesD%bBtO!_KO1J8(d!;|rD9UR<-!#6lw%iA{2v$MZ&~;UmV+g=O(b#5vi(I(U zHopu{S9Sqd2*o%BbXdXoU;&lO`MrWFyUtLP8*_sCjUz1x^&>&O^Bevr{q*tg_~#xb zjb6sTGE|_P(g7@$2l2N$S^tAxvY^BWPgaa*2~^$}uRxD7eAPAm{_Iu>3jW-tegZvPEfK{N>aSPUUfEtQh!Ta-}b@n`u_k4Wcgy(b`e}Ob!3DaI}M`{-( zOz{J?P?01fVA>+SvHc!W2(3`u>J(DGNfYVC`O;-7U4Y>=+TJlyCf2+t3?Wtwt}9T# zQRJc?%j@fgd#d-0@V#5`0g4#yt0_vMh3a9=z zI4x829W+@$q`&ZN&0zDcRVc{Yw_t?`jI1nC5(vdyPI$0>Z`baZGgDzmLlH|!n8_;E zw~S$U8p~@qX7K?-d?IicZ!J~NVzg*BY5;mmyli>7x+P0Mc3GUSinN@=Tvl8hcqE=i z3MFDNLIProUFaPPUX%r$NHVhZo2&CPP){zgFg+6HeCH(z^YVCIIg3Ia^hqdzW?|+A zprsu9`@4yeJQQ3lsB^`{=JnZR=EIR6sR=luW7=~kS(JPj%=!edr@uuU|T1Hu`qA+t+tXn*RuyE`6yT=&Lx0KoC z3BZ6`j0-?Kpv(!1g-vmmY+KiDAMB6}@Ian(m2I`njji0f?e@ZgKlTgk*Ot&Fge)Mj zUvNE5#~-a3WS^`$$_hatcnowWoON#6ui;JDM)5H|~+ z7*??xkZ!36E*dWjq^^~G0V8?b0LN97*_J6X7?VWLPi)tnDsi~5Ta)UULY|lbjlLp* zvCFg&EXJxhKe{8A`QaI&gU3^8;jDJt!yE>*;fq&Q^vfzHh#u8o?uM*^x*wc>17JN_ zj8g=(g%n}73sDT?fcH4I-)k`UIv9vkxh&2gP6yX1)7B7Bfoyz?s?-{6Uep->p%daU z*pk~CvbQk2rv_@n9wZQ6hj9D^FtL|k#eLexO{(Bb$z7;@YGX94>%p>y%kwR$&I)qp z@Rt)s@>-}}rxS(K_-DSq9-k>I<8Km-n|1vA@ocX>jkqIW-1Kp6wcSUW6~r&^)H%cs z!$~$nu403_5e#8~T`TQgi?V?s$D?0?Nk4s=|K0r#>#j*d7TFQHt zoVY~;-IFqq6aNbTd|sC?-=zkcm$KJDXWfOWc;Yd)LET7AhEbgzG@0#BEID8VKfYBk z*icpk7l2bteF^XizCZh-=BM9soDnFb?u01AX^}=7>o~tV=eMq>pSrbcbmf8M4?Hi* z++XNrrfPW;)cqtiXaCPvO?kM6ZX2k_6%nd1i+C#4SZhGHk-qV~xC(#{*9eW;3oyE2 zN!x%zb<2iOX5AhF{VFa2x}Y|72;*Nuo>q>ta08h5>N8#XbBaRhoJpS9;Z>Mme?H0E z2dc)0!D%>OOd}S!pm1fqwltKIeUVIa?6WuEJi7le=o`QT?KC+&lNUhT2*|8uG$og9 ztJJnQ#=1T-Jj?+PA1=s`Ltwz~E;HK;%>pugyu)N%pdh|c=V~6Lwn2ygSvYd5- z4p_lPlWf88WJYznS<%r!fu(www5-iN9IJrIZ95nVp62oTiSHy6G(;{1;hja}y6Sm8 zJkeleC@(SmN1(UX`WxoAAc7EbgzVNfH+V(oWD*@vy??)vr3dTDA1b zB!tRw59%1)QSMYB3J-=M>8h;3+~Z6nhUdcrjwqh)nvYUN;9VK-%D%YM%V5ssVr~uR z&IU+YtKt3=H?SCVLT|)stT@qcUql{)rJ?E?P!c2E=MGttGmnog{?5hh(20CEv>2AX5Ujer~U0WQ`<;V-%0 zAP4#pP9zs;rz|5*F%l3etNDGvLY~5q^W0t#(un^7$BOt!T1L;k>X)f}KfUHVK({Zb z#6~qq7#tat=1>7v?dktQxamMxn~b9gMXRFB=tP*Ut|!#*+$i?#n>_$!TfzaVZ#;f} zh>r!`qqD+(+M^9PyTt}g57h0RzW!~aG}2&Kl2MwJ8B1AwcuB^*z;6!?HEXMxaF(;D zV~XL2%^ovv?S*K8@>Hsr@D+vhJ60J+{r^LpWtE}OeZ_MGdqQ2JnrQTYP&&qY#XN`7 zi<5-yr3y@3(J*j_%Fk$^Jn$YuJT)!yeL03I)TZ~}nzaF>Q;7D!U4ssElnV9esuuH& z>XHIhzhIpG!q8-@GW6)C=WS6A(f#rswa^YfT+iLcJ*?+Te)I2kIF=`82UZm@jwpNM zsf1<;m6g!WXK*XzO!9|fkcN=5PH%;kDc$)8SD7gAAj}&=8|oAi+FD$F6LtVT$XC@ZmsW> zi;FS91A{`4a3P_SE+|m0&qf-x_1vs3{kXcA8{nYv>ta+0+8$~jtQ|S$4Pdii+GI}n z@B6!nf4hI*P5kq}@Ye#YZDW_9og&=(FxE|>(u4#`B`=^%UPt=fg=Zg>AGH4^y7@%d zfTEqZ3b=6eB`q|m6|kl)NTt+pE>9E{&x5@>+-}2ddp>60Ol=&FWso)lZG#%=3SDMS zD$zD;K=aqn)3N@2i2H!&ZNPm>P2SX{{*p$`EW?cFB~ZJ_MyGFoi1VY{qZQ%e-dj?ePL{PNMs%=X4J*(*M2a0mY#!DjE1y3#yzW3LR}A!n|O0 zs)`k5Q;aq7b@d^BKzvO#{+-@c?sV7|qiV1KR$%|(O7j;{3TZnrd4E)pg7=UARn71G zZW$atwaTEm+PrTIW$F|Lpb}LD=D{$J*8{{YZn#1)LXRQ_(Upu5OW~(fLS<-G1#ZO+ zSi=Ty@270@QSTGR4qzi#bAUAy&Rehw8+WF#_GLh}hRwYjO~UQ7G~>}q!JsA`z@??h zLh>89J4r~l26Vmwh^!B$sqx9d%tf=|d}};Yw;9JlIWz&K%PNatfG6RcI@a$l9()bD zISfQ-R7(q&x7AUB2?=w(3e1Y=&01hpA`#77pzgPCWBzZr6Bl}8SvXI`Th+#;b*>mW zF|N3+OmZnXhWUXC6n_|aiTxRj8eX3w(D+--s^gy=OO*>|&W<3C{Rx8x%V44d1E(1& zh+|B$4)9NS|9^g^;fJq}uMLoKtNwX@e7f=Be;e4Ke}+s7b8+D-F+ncK`gN^`G1Q?e@ps`JX@R{zo(R=ceIb-Cu9_ z_~)YIG{qy}?Ty+k2+1pG3fL_v>L zA>#%m^JGT&b%-_{LH?M${l`ym*5TG|AiiIt};xt*$y2_#= z*k{H5;#}sUB>lrK6vp`?!Zlc&r0ZJT0%EjLt|CRxjBQfsJic@Gx*EqxpmPE|Es~JP zLU9aA{7Kchf--eWU0hMUL3h4xLX;R~ppwo7aNo(-m%S)1E0Nq1MxdX&KrwK_sh4}J zd#>CrpqEnF1qlJ3Sq_6xw!~Z%sZh`{E^%#Xp`rqL(h&Mtb_NEYewLbSd8yAEffY%# zRN3qG5M>Njz~P4>|KzEl6P7{h1sNC1(x|xueI&*Aks@D{Hz5u25ZK_o5AX5!xqTkc z>tW+5P^~j1F$}OEkz{FFBH8-FLI(UU!tWdfb~32D4%9eP{%B--(i^e>G)4}(z)8iX z(zj=QSBD8pdVXTNNg1j1c_mom0?tOSU{H!)bZF$TM4F3f3F&uCN^W-}pZej?+iQ%C zv(2aZ^GCn2)b-PL$KqvF$rc;&{@Ols-m1l<9ynBDk@|2&ky3+6bk>`FA%ie_e^Rd= z3~qY;60D}c+NWbxhx&p3nNOx*PW-f>K2m%HG|w5(=4`PE?CJ{OeOHHyLSEtAc4e)X z6^lC{o0088O#_g+3Kfo)8U=m**zgaD5jnlJ;evJE7-0$29b?MK0&N+$V3-ZwdXM*(?bY*3(PLb`Y!Eg=KWfX7l1d-3)s;df`oqoCF-y@Su~Zdw(V#dxO2qjk1T76 z)$la8-GbFY(&FBoo3oZ-FQyho6M58>Xam0~EIaGAer6Rgr$7&`7W=;_Q#aTed9p=4F*dMqq3* zrmet)K%w)+;ScgR8rB>3P zq@Ufky2K9y*M)~B0Scn@eQ~UyG;|0NeLz3Dx5r-g!>ctZVg+$eH#h>@iEaJKbM{FD ztET=*;HHE(>j&zjLa92!`c9?w2_+<7(EWROiNV_7-)>Tex2G^XSs4%5pW*g2Y9}vs z=X9YvXEt>mH~fA}xQo{nYMF6@?)Y7jp8j=)Ax3fz9*e7%Zs(&B?IZ1EIe|EEW`Y6a_er$KyjM;GgQ`C{ctK(VUg zB4F81y#f@X0c`cZZ^(;;YnrJ$2E}_=!LJx|f)=bXE9BJc@olst_!)O;X;M!1YYDYa zJ|AsRf8V5h%k_`0YmvfQo6BuAs1a;@0OLgvf-tC>+9#RRNAP|hsg`Fs;9EWf6l?i# zskC3KNU@yx_$ILF`-J4mcpF$gyd`OOR3;tHIuUGGeeFR7KP_x&H9=hmE&hj^Q(N-> z3#`112TtvDgQf%JQUG~H8n46^R<=UX`dbU3G|woPhFv!6Yr938Y!bFO7gZ3xMN zWG5sHSGYhcbF%qrHB^r}y{;(mT!Z@cQBg>{m=$ih=`7J^+CbU^jcC81MmTw@zBt^h zZ+G`A#kaMa4&4p5*ta}S1=aC($KycPTnaaRKq=btniZ*A(6qRTVQCgwV)!9beC?z_ z&=&6X0z1dxrBDU?(ODf+8MLW0$**quu|aLVwfd6a@4R;t)^YFhF*dAY1#S+^FnXUw z6I}Sk9kC^-yt~5je}Y*Eq8tw2hm)>Kdsq{Zh&5p~5o<)H25)t7xWe$0l2PFRLvYgYK=k<~YuT|~NI_t_ z5yJ0Gj%?}D5U@pnAg~tCyB4fKw+0#kC6_O0z(5-Q8i;l z?)Z+qB1lY-$^xm(r@ww*bWb>NEn6`r zDbuuEt?|O=0kx<+5qJ%k1KDjiV6v)emCAq|X#>)&!uwCp)Y`0uE~-Yin(=|nvQ%}X zpJ{N+@Z#DB;P<_to2yo$Fmc!>i&`{doJ=a;ElA_tXEoFdQAj;rh4=VJNxW9IJ{<~d zXuK{~l^iRRyvkaznhlj#KNCl;sJyOiwJ1`v3b5iYb)erJGwknE-#_;u+=6*G<{jdy zzk&HtQ2YI?vDSu)9{K(SQURB0{8ueV-=M>-MT%CoyRsJ&g3`H~;4Ir3I;+uFVaChf zJU-s?`(y?Qv=Kuc)xtGm=F<6vKy}3U1#DnmK$9{d{T`7b3%^AA)hYX=UemzEb392; zPlM~9o*eZpS{!~^a$MwwPvM5!LxGhZDVA8o^;P}q;&B$UAIVt6Fh6vASW4&5NZso7 zN2JFnp_SD6FsY`g=@mUhdO_ru9DYY@1E5Wts)JRa0QH`chQu7%>KmT!!R^{Vtuc># zHV+RsVD5s6VW9RPPwKP?)Sx0vA4FQ^7684`>_+Sj9gOQ zq`XC!wJ2gpk)|7K+W?m}B(1+dgVk_U(oz@v9w=0|K3}e@BgJJE*;z5z-{Fp|-KwVV zuliMLja=d?&W|KgC+|ItSYLiNq_H7TxQA5cA^<`9v4=FKDlBHJe(Vlyj5i+A$F?Nm zR=U)CKodD%v@Pk~aPJ{r)&2PF>&aS=4Hu>!HYDliZMyvWHkGs6zP{nF{5fvZM?F$; z!VkXwrYJpG)1p=(`VnhbO^S{`CERa^!pcJF|$G`min?{FYq2S*5N+vl-ABt-M36DSL>SNfN?yd0cuQG zo#}&gA<67*Mgr$eE4M7F2wGm$S@}3xSOuHipk2_Q$`M{lZ=zqSyq9)>1hrT{2DWPe z-Hj~*Jwf%qK_M!2>gmQUA}nO*#`~aQbt6(AbL*)V^ghhL#-IOleayMEQ=nMOq>zn@ zZ1rvMa33D|ur*3@d01=HPKE3Mvn&drok|1N*9`^E#UC%2Eo%->0uWvukFQ;^2a4$z zY;bb{1|Y{kVY<*b$K1;@S|Jty7lz>022k^=mPpg^QzO!Tx?BxfuCBc-Pa)mZtEOvO z)Y_5r3<~fyoG2z#;}Bj_JX@I8k~QVU(}jtPYeCupRS2rVp_Q50svlU&s;{8Rd;z!| zWmTbeCIx*4-`McuRA5U&j-V_qf0%j!3AvUpKYHi<;v~t2Xy_hN>2gV+3F+^SXzlr_ z5v)b|0*^lC*EOiX!?3|YSD2KACOUDr8oF+H?9$^eR{;PXsw&!UXO{TK1+2nXg(6j} z0DxhowYsdUaz*%gShZHW+=ZGv>}7)bRY3h*LXD5V3xD4HpvG}Be^dT8*k^Rsxvijz zQdys|4bsqt$n8GZJ`caPtSgUUwffzmmz7>PMOuU^Qs$?shI7dodi|XTU~T_I?f|&3%zqYhdG{Z3#5Tq52-GqL zaOv|`k>blL7Zl8}WL}(3Rralw=su9kmRlZqs34AqONSx^c8fp1s}xGK7wZfmb)Tj|mk4WhJbb+?c7W8AUlFM~zjZF3lYZFsVa zHHl)luHkfbFs}`wxBh+i=Qk`*<{co)sK886E7t%_7X!D|#bDbt^2qy3mat@93s=xo z7z9&T!1{TFHC|dK1ao@{sk5y|55v0C>b@TGmIUT5RwG8XP;FgdzuJ?J7rS8BK%t7& zJBzbVHKZ|yWnf?F{f3NF_(cg!vR#Xiz+`G;9qD(c!3FG;mS6Lj7FEQi%UZ+)$#Ye7 zb*P_R{6K~H?Z%kS`8pQtRq3q+(ny~z*W%+fR$H>22#gd%goR6rQ@bcB4gV4x&456( z9)B)KBgw_%iY_8ts0@T~Bp7Y-1x9rOV`+Ipw`UlG0ktjFUqc9AIbKgO!3ODYH6hgc zB*MEe!~5_GjFs153{))ojBm6TNC@La(q>tQ?FO`#w5f_ zNf2IHL*OErsp?=f50jRa4w~7sw27nEs`I`{8^d3c9&VW29 z5Pt@-VhCpehv{Xoilc3WiO0t;0PQABg@ETd8iM;eIfjAOH07w zf6^$l4D#%uPUpqO|Ci8jb2$Az#j-J0v?as}!jH}lL`oo_?8RWGaZ&KcTNsS-qr01t zVIh+v9b^el5cT>)A0zxKthT)vatR2GkwoG)+ND&JtwBswRul6*FF*u|&xQ2L)i zPT~gB#Z$ou|MKgj+bEw0SM~$F2T`ljz4bJ3$!+`_Xp7JW)Z=$21!|6#^|ot(+b!O} zrAcSJGha_%Lx~5%kX0q1_@AbMC{CSlf}5CZ!THr4J=-BOn63?5N_3DhJZ@KzYMxfq z(G_)wwEgpMAx&}@@gYAEt+DB1R~}La!;=R3h*FX^HAhc#B-pP(eo&CKc5bIg+}_fk z6^P<{e^!Jgz2d;G_clhpQuWhUr=IrE@kc6UZ6!aeVWnDE_}$5|r9S3iAQ^<(oYSHf zaO1Vl^cA?iWGshxV~4YF^J^rqxWa7=kU&Ck0!j+Jpc#jv=QWt|*?h15^k=6*M1s+mOLdqB0Vj@F`Hdma<4`H5xj^?e;J(#sf{|9po#}A) zw+iv7qi6g}gejJpZbLYiSze$P>!7P=i(A*Y*i8N?9 z#A`lTZYGeXi=kqUK$sfe^$N!M0CBe@N@2Ggyv(FI9fFS9>l_9qdN7P2%Naqd>2_D? zc5eq-uu#KHn2rD1UcrefiyFjpLFa1b?K@ML=`8Y>C7Ib9P@a*E76+|%c?#Q$E}p5S5((kWc^s7ErRg&tXQxrJjU?YDksCX|JuQwG%9?=lP)n^Cy}S3?~s67$#zwg>vzbd zw0-K~$-$V5cDoRH#H6E#Uo?4*l68IJMPZE0vWLYH&J;A`#C; zDZh-C>wViyH&Pb6q99W`8wbP(P6LU=gQ*z|-RCWh5e|MEb>Ymi!l<6FI(4;9)c_es%~**c>KnK@xblw_F3xHtMEq>YDQ9{ILQ>53ga| zkm4+^Cx(ybb(q9wtF6w&m+~_y0tKsLE6HtNz=Rw$2~@YkT=QN8PIT!DiwPxeZ2f^9 znABo>F;$N_{ME&zfbVy40;L@9O@*`Zj^W(agi)1QCUd;2L;O6zD8{-?3r4Z3E5-B@ zxDW~)SIGxgi|4&}r(lL*gQbH_et#O~Xj6qF=D;8$kEUKE9Z1To!mM8JJ}7bF{Gg3W zyonU3eAARe)9XF1Exb@wkY5#;ept7N>ak~9PJ#7V8LxQ3$>yXmg}@T+k6~_Eel@_v z;sWT;L%kCj*&|BoM2;a{58dBGggEmaCTV<^e*^V=8Qd(He_jW1v`heM5ftas&_KdT z3rbq!#aV~BQA18iQ7~gD>Q3u9r$%~WU$VZ3fd^8bGs_qWbIn7LAG@F3y`;c1rA&($ z$+k{A#bj8*h-R;LU~1kaswJEDX5ZC8mV2{=3t}bs9G$KmBkRrL zYHEN@C2LjOPhi#d*?nx|lq1F>-(Ck)}c zkd>}d?IUZAr{~f+vr04DlulrK!o_4YIJr=m#!e9uT?VSL^uC z@XtU0;O~oUXf($$wlK%(_v|Mjzku#_%r)Fxi>F$bJZ=JbFRP3B`CoJHK=E@1;wGG< z3-P=`>75ieQ5tNo;G75BVQPhCNoE}{P4J_<`?t5jJPzA_uK7-~dkh+ghykb1qU>vw z5Z6PLR9(%=a)xVW4aj~J@enBi6%g_aS$cH>amAUgit%IlV1}~d?bGYYuW6ZR99sc` zJ(N7h<#hD&lqU6Hsxaw87J0QSoNwV&Wx2VUKYaQlpO(Ep?6NuTTnZ%hg2W{ab6g(dynqgXnCB!<& zkN?&c4;JViJkLNOkfv@0PQz1KwgG3Qa}D~-S7v~bt|S@g1H+2i9iR{^fxuP+(9@J9 zZ5p{X@tYe9q+PEac{81+_q@Y5vyStlr2)4Z{LyViS%W<|U`%Q~r^8fhmD`kXT*Mg` z6r0ocQanf~Sm40stVg}73Ffl605!xa%KhaGyF}x5rTE~&f{woqEIXK>FX)=wL5;-~fjFpmb$e>U{bpdTkeYg4M?Y|;D5WWqqh zx>hDP!j+eQJX;dX!(vXtGzChzl}=;5zG1(1nPKy^rBIT7-cDVtlRqy5rznAB!1?P_ z4KSGDNhpsGROZyWSzvqQSTg7q+dPJFf!YsLD`0(d1O51Ilu#f^5*ke?4>OS~O5kWB zu3})~RlKUKBsplgnsGNkf%z)VFw5!;;ryFFx&c9<5g8a{HH%m;;s@2AD#(xBE)wW~ zDX1{77y_+UKoaUB4*VkR9GNhXr()9ya>%JXhIri8#*5#e^uwa9ebi7;Mg0zj8l?o6 z6=eug)>%~`MT@`+(2p(z@`VTIll^MQzi$-q*ijAK%y)e<*OFjxtTc(9fpa(Um_Py= z40s99k8PmKHT9E1`EKIG`??NET2zKlKE`_>u1&CtaWWlFePXLt*ED%9`ka8g0m;hC zOt(txE3;bF&CjoML)H+e5~Rrl3KWyusle&%6r9v>jy#J*wpis(&Nz1p=S&F%Piro{ zWCWzd32U7$dV|EU9gP3^&xCP~^~@Vp_K;6dz(tu_wW`|pg)CveV{Fc2W^Wx9?m;Dw ze0JFxO@q>&clFi$>W+-8!@F5W&zs9B6HcLL@-L8U4LB+}dgK+f632&ACc<|W=n=wXb0(m`6?Q0sA#?3m#Q5a#RaoJ;(Rq}FJ@6WzP9aBJbA`SFI zX`Re0uOy2TX~z)DJAP$F5H>x&cw3iIp|CfHhA7>ghVD+C8cr3AA4k)jCe4I6y`p1@ z#zqcQ#^S>c)*fa2Ox@pwVz@tRIMFyOyynzH;IF!9?P#$|o3w22jqxPTVFWFaQKxUv zn1kX|6(md)rEr7R+FbU=Ua8ceuA^&Q7JX$?32eoHyN9^wwWV(tV_d;IR!D`DcQ zk_(iY5d&{HmvAdMKS&rtm2vG{D_e2gR2xwP3iy!S#aD?2__ny{S+0{+P{zAyb3?|+ zGyXE9WK^9PtDsyw823_+qpswDDAyglP*n48uqQ5@BD6*j3ayc}-a)A} z4*Xn4IsTDfDUIgcY2ZZ?kU01B`YeDNhZV9bKz)(Y*&u_zq=gMk4b@{kZzd4|@n00T z5{&$;5PnmHn8V$@aj)81!(Y9-dB@*gxpOgAcvJT`{U+XSi)e}Ug-x#95Ji|u;?|&6 z3(WjX>Pt?;pT{w2-KD*`vxxBWe|>L~b7YvpJ3T1nUr%cLZGnsr=Zv!No+gN2sU(Vg z>n{{KLi3K#^x}Vmms9tu?&h&~!{g)aIwgje*SFj4_W1X2xW|7n-bRjZ4U*gG z|8H{5$k9Z)xccL{wur@!{hL7!}(_6O6DNz*K+I+&1;JC#jLC21QQ0JcMB|TTfNA1 zHU8_fLI+!tHsiPF)RHr~M}n(G4JJ77rTg!B--_vqq)ohJz|Ab?l6WjYNw=M zop*LBa$Ac;mO9Rf6*m32=@0QwH`AZ%YZ1nc#vmx3c2jIl0rbidX6kL!Q63aDU5YIO zAGWC$RSr|U;;pw(H&T{-cQK0{2q#nXt%egz9AR_bd9<=Hx8+UG4+Y?7^-dj8!bGv9 zt68MFZW`A-T+4k@P~Ms@20;9xNo*;zHQn+fQa#?DP$_Ic`q5$KMd`2()2Bd3?@vkC?JAhf52%~%mXg<^?CN;CJ6eII?z@uThnS%>rymSNv+q~$M5jmgrf%R z`zfuhc?KGM>l{$ONgN7=4LjcV5+uPy8ab?N(eOqC&=Rf~RFq0g^CJar zP@@);oE|AecL=v*!=DK2_VD7fm4<$3l#JTEW*~>^3i~ zAFbem8G3gq8ChsXS&DNEqmmUMZ^G$E1C5tlQ84BQ5?oVM`u}Nrx8=NXENS$bk5Lh0 zRoSv+;tUW}?O&lC;n){{U+I3{|1CChfrkZtBmq)xSC`B7Om}C4IIKgiOsdEla)K1) zHO1J~8l7RSx`usPtmo5|F@^cIawa~E($vHJta0OESS=i^zt&O`VCp3*g>qb2VE%4} zIlr27a+e?fb5)idMp*U^utc$P+ND&qIQqOEi!i^>E_Ib--yNl(i}TBP{X*T7k6~xt zuYswZ%MbPYDIX=bW^-SaiQ~??!iB+NQdTfZfaDgSy3cui9p}Tx-*!X$1bH# zuw@WT_yjl?j-4V>m~FzDiFMGZTuF9A)FCqjz4KeK`M$Mf06MjTvK2c@+@@564y37} zRRQ^MgZkxXlKrMO_6^a7ty1l}KMS02B7;_K1J3X=ceTQi`R}E#zNdA=P_oXOMPW3^ zt_~8}-Tb1v*ktae`sPNa0I>$brG~$pQZh1N=qb}bMf#DEzJ(&^%!7Szq%ktQJ>eJT z>8ihsfh_hHdXx)oG78P z1yz~EP+iaMhRvjcQhnTfmE_?9oiLClvpcY?VwgJrnof)33dbA3<7vb&b6t6g0 z%bh&QNvF65lZLwEcy8!-wRN+j54a1{P{1sjV9tt_!|-Qd?n*+gC|UYpCd0ux$WN+@ zL*3aNOs9<3B_Xro5mdv(;B4BZvbgPeo)q$|bPLd9wu+eRCHJaMnC%)uKru(NV8pWe zgK+c*b(BT8?Di_TYTIRyx~+I$s<5r!orU$}K_6^ahxwa|xGyj64=F15`vTRwDD#!n zh%%(VUc{M1;H`kZuu51_dLGWh5t&#P6_8j<5&i5)80Hp8^b3h;E2rGzNBE!!xeL?k zY>C|h6XV*CH~ZHjyIoz~4boh0GSf>$%+qtEx!~{;qk0l$f{gjiX^gYdsyzM;)i(D$GC)aS2>QsWTLfc1CV)p!zTUcehzwL+8l=pnV?Z0q11_d zfSSKO#Uo8nJF>v>$0~ATym6OiLD=-Vr>5teWZg~oBSsJ3lXdvDqC=gvj62&W`Q2WQwTn**t%KUr?NycaGa)f#> zt}i4)*#>2geY%cmgVtegD~(fkDY$qzA=Pk_cJ%4j@6K>$>vP|PGyZvf@=V7fbs-@= z%8i~C#yC(##xw55f^MSvTqL_$%E62jq>Ev7$boX=7`ZrQSC>YD*r0P zpKcP2y_zaL`X?;kojYO~nZvv~$P_=tfpzJr#;|d18!z}Lu&D|7&I~$*rJm_97BF@1 zXOaIp%wsj}`LkawF7L=yZ&y>#b;fD(sP@U_dZ_gu3Pg5%d{&gAq=`;GK9#k+A$itD z6D2hS9QJ@RI3qc6k15?_;LLPYl)tG`&&f@*km>Z>fFF0{BGa1*yH&7qBs=GtQHO{^ z(2K5$u{s1x6t^+n>msH&9=v1;5za@XQ_)t>9uzgC-N_L$bo{lr>VGz;@fyT7^tpLe zMDwm}`ZlC}(tz^^j3P(p7Bcfc;HITtgkQhhXk_@c@o7``mSFXIkXR7nriOgmmj{tC zETgb-mSfB7>mID8S_G>ftVh-$gyW=om~6v2Sup;|$2~{MsNbZk9^*VbNY=bE0!4LH zm8&pM#T586FB2Az4KF}UVahnTtG%R2 z;>_a2TVc{cV!@r^!5!+O(^Y?p^7rrVM0!=G0Q6OReX9_@QT}H)lUcR@J(X*301Yi~ zr*Ew^KpQ&kQ&Vv6jN3%Z5L~XIJkhpegt4n{{QPtVR2M;LDlaF$O2*Nd$3RsTCjs^R zE%MQiQxAR&&))h=>4#uF*>rts8^9J~D2q8dMO5}W$WtwrDPE3u#Ofbpq1T&<$^QpC z-Ar|$AKg$=*Ww?E?(!%dqylNI-0)eDa!KVR&v0u=2bOmFM}hVB;V+d1)PfkDgd2056|Q#L+jZxM%vmM!*ST|ks26}*!U!VMSH(B+&4s(&%W0i(z;GaPbotOjZuUD06m?8@g zfVrrd2J{A}pXT`+aBf?0P@!;HYz_BS+)4pj)7sfaZe%@@e&{JLFfEs=CTYbg$iM!I zL#EDet2LW5v{4U{S1@{pF>8k~fceMo&z&F8`~GYG0X6@>9)JA&>*uN+QmACg6smdN zS+$!8eWp@1e#nEIY|m@LUY8ta*CB%m0rD4!DYfAAqgSzLU5sBQr_6Rzz0IsiV;8*| zSROgU{Ezys4zgk{qv@<%)T`M8x#-noU_Ta!|Ed4z{;K~d_S~LJlxP3_O93zt@t|d$ zx~JJvEl$Vt%c>>WatnoD42KVr+ndZNr}A`G^lJH3bHB9)A2728a2} z@TX4}MPwKgronrbEx1BbO;Fjg0dHk(LyW=Rl0+o!_`!KOXzu@7;#8BuoSz8ney`&H^?a&>dHqbc4ZJ_pq$<_GX3!5OeQ$3F|r@?}TecEM%^mtYVzN0ev zX!*R4l{zZ24XXFf`}i{sFN2&D?O`!I*~z<`C$Bd~EbCPj*4b;Aon+!f{qT2WwW4Fx zFK)(}{~l+G%4P94YWIpEq^%lKDAn`u#20N;L!xyJSJXaJD$e)6c-Alea=1r0!PLg= zL#ek=z$8Iobsgs8u}_JTx!OcsdMY66Lt9q!$=1o{-EyD}H~zsBg{RaHo=hzsMO)P! ztIhQ=agpZW=JI6=(iq2cw$$Zw&m^`|OoG8tF13@9=EpQIs%=5~IeYHO6Y?P)uSa{U z2C)F*O{K#hQecJRTPXHH(GsvEB;SDe+>l}P{(&%OWb0fBw|!^3fC2S(Y6>&}jq%Ti zR6Ew%es4ho7291S&d4RO;~&VQc088ZdYVlhC6S+0H)@w_?Ej7R+<3#TD{6T(O$7-w zE2~GU8&?u%w7IIO<2wKH2(?}Mle=xQHFX@R%QNFmXaDc3n^d)Rt|*%FH0;a|JukSM zEU8;Zx!Q$IYv|lld7fZPBar)i&{AXfvG{gPTHtLwm5t+~lT`g8>51X(AgL!q39|x2aM-726 zKEp8Z#!POYxlw4Jqj18%co1dMM8y3n%>8SAV0@29!)o1J{1oZt>;rL;{2op!mnn4{ z=NI4lJsapJ7x2-5EK!pm>{*GPs!GhX3%DeF8 z^&hN0ph=xBO;k%#>=YE!`wT@T3Uz1I)j+=QjcmkN@XZH*dBR|d@DqIN_)Lk`02|cc&YzDn>TkSFUVRg}lrS{8Yqg_SnT~z*mM)me>XU4@;MVXBez-Bn}ZMiI!JE;Ll z%wrBrZ9(-#-%e-Q@fyV6zyElkylbS)7E`a{iLh19vV>KbAKfqvQ4Qs(AHEiTX5uz( z`Sh-*Cy6IW0J^#5`zD+ZVu=r98=FK<`lgTWvN%ABK$#c4>iOf2A}NW@S1^JOy(K+Z zZl8_n$aOc`S$5ok$C83N@Az_Zpybvfn}A*)&+?7>-K%Xn+nsLpP0z^@jMJ+qAwww~ z1xUlw93cN)k?(I6tAbqOpmZQ}=k?VD*7Q+OTb^nm4KTA}=C7d~d5SIXr)Xq^36#Rn zu93YEY@_m^iOeQc3*zhFU%OVZTvTry8PxK9$}3^yE`#f-{{2t7HIsx{+_%fFa*mO9 zraRw3kMWPqut~c!ub!Fta(S+OcIy!| zeUG7W$(l8)@WXJqqu2npD+|bvvNaDmr#3AkFqTYyQ(!c}PRcJ!DlkuiC7ny4Ek}OQ z+OR9K_@!_;H$Cwx!HF1VJuIYG>2w!~aUCO7!iYRM91h-ZucT%VRm61Kfazw}`2v7k zwB8{9_(GzYO-L0sq6rj&JZF}}aP}zmZNDH{510+rlo#6~7rs&lAyILRvdY1%JaEN@x<%ILS6u~Q ze$8FHcEB67ke49|(L-(Y2qp>T!Gxy)=4GKg=^7t$*p}KMa0yQ}>2&8@!}hZ{3%Fo!+9t?7z6M2BT*y4rgdxJ%ZBF_6V1 z%jxP@ucg9a?*+2WKCmgz8BE#%O0nvKERuFHH?!+V<4&zREYs_^3ST}O07DT~_ZSOb z-=K61r|mhvK{bT9-hWIjg74$hWZy!*cyDGi4vfyg4iY8L0%1|%ZbP_rVHn2^eeF(# z8|Qnl@X{4L`AM0OHT+Y1-_=2Wc451Ej(*dR<7+?u7@YeVFOLZ3x(CKQ&|@b$wP4q~ zpX(mD-ur1RxDGWNc}MRiO$xJ&m&F}2!wsTxAj>V6MG~Qww><1n>E;i61K9K!{rk|z zdiz>7v?_~=ESmMNPl528eET>3@@M+%Uw?HS=hiiuuXwkTrvY%8ClusXCtMTC zVOlOd#6MSsC;4!lK!Ucyd%{Wy!kOzb>589J5v%8?JDwwjST~J*#LG`5b=RS#KuFw0>!<2+XGbX$dr2KMCSR|g|ittC9`)*F6WQFg;uQFaUMJRVkJH^(Qm$t8jC zH9#0IAQj>e?Nx~R{u##BHmeLx`GrJDMq@b*6Q%%BDflJBP_tZThWTFm-ciM;wU=Hg z6PrEXg{`|1u_}5`l{m|L>p;5Fs4VFW`mT9r#&{<7aifn#104YZSvW)dVFysX#Ke6z zd~CqE_EP5-t7rXHjCyRQjzX(=G!nJ|=?Byf7MP04npwUt{U(=QYp?luMo0AbC$USA z%OrLN_G5wgUz)_WhFp^jIXF_!+%f=63p`I}URfxQRk7=J6Nt|fW7z5gx4E`Ta#Kjb zq;WF6gpR$0JiEn^hDe{f4)iy&+n{YwOmBBa8@}jJk-lbn3}H{>SN@(-h9`|?lCZAh zJno*wGK07>?*zds8p~Dia}xzhmWqL8D4S6FF;lk|fec7@zzS23( z6I;R>0h4#OLAgnR%=*Aplns5paBv)Hs3wh z3mV9}DgRFUe!yVhdWgcN;6`HgRhaMH_h)h&Ou;w=106oR#y0RrkBlv!Lw{6dHRPQV zyc{f>as$xi_SWS1Ko+A_oHe0<>obEn3&*8|T#ST!IIAN8wQ{Me_Y+Iz4Cp5TbxV0o zrN7+k-!tRTjnA+BH~nMW5@3t<)F=E`sNJP(48{a&c)`sSgeBc_-_;lNqkEKoC z9PIi?^5y9g*eSi#S;eyluD7Ibh^J!Nq1>lHkVvf0b_ysHeSCZz!2ImQIDX4|u*P4i zwd#!1x}!z~eS7bRiE>il)XTe>h3;yrS*QucG1of$REH5}9PDM8yLom*c$MWM4RgH) zPQThunJ$ksAK?60mvdJS1O{JE=^yd!%{!4{R7h&*KoyJ&0uA!AYsI zn4f2Kj_gCXL*1)$b!UDy%vwQ_A!)XCgL35ssurnSeme)6Yr?^fXA$OALPvHXGMKg> zd*9a*kO{k&`U6Z0>tOLISvb1dr+@Z{PF~Lk^$uQSr{czn500V={QeE2^ z-V!o}d6LQ~>sz3kCy4y~xglRauk=egR9lHY>s#D#B@sNlf;bRgOs=(#7Xj8(4I8x^ z$|3Q=^F8aG_95QM>qsYG`|lA3gmV1+0M7^hE44<%)`aUeO@4 zA?^m}=LaQqB~J13?M2F`r|(Zf{CxWL^dy`eQB6*JeEeyDKFWhnsi>OlbnH$(LJb4l zP7sexV7VR~gt(cVqa})0bv>IH(ediHpQQm1>f`F~)e%l*Db&A;b9fMif;P->Z!8a* zRp_*)r8Qv#)D>G)wE_J>hp5L-&*MwN`ZR(bKJ@std>yt_W93?Tr?AXZeTt+7tLpFt z6(k1LxT5_SbXHhLe?7hXPwAhp%c8zMo_gO*JEb^Z!)k%AsN`Ezba|Mp0<+9X{9gC% zk*J~?$?%$VOC+X>*n;wRp1MY=5$B)=Zb$VecxgE&A;We7uUXJbw<|g&C0b|2=sMDz z^+yrfs z;=bZ75;F@}R#*5mMwtTD>mdpa!J+NoJpNuosRAWrHq{qV#>uAeqM6##@-oD!lb|E> zqs7Z7Zc+tm*sb03T+<2JFY&7aHd8$xV`b@DOK@e+7L(T`l&A6BwgYu42O8s@0Zll* zS>*TN0(q&AV5Y-QBA|7cag`=kZ(Ijhr{6dXnc6!lJ6TaTeR0gfIAz&a=cH-h&l9gr z3yN><`k%A>hD-l+%aiq>Rofhw!g&EDUGyHzkyM!RJ>)a6K8JuQ<8Xx3PFdLsy4+AhHxk-W=b2_P))}Kn^rH zZUn^PQ*KBNM)Z?6Cm(wd0CVL#ad=rm=>gd zu~MSBD7~%a-0)SJXWSjeat+p%&FVSU!ok4!LH5S0C=UUMQPH)8Rww6tSMxrR711n1Yfz%=a#S zAID$I0{+??CB9R1R{hLc6$9epU7)#?D{UK4dyv=1dqAfmzRt{ajG#CklceWVo251` ziS*XAP0zl&n-Y=hYD*+nm+q;Mz*;3rpo=OL>{M|DGyr|17!--fjzUo1mL3bjiQvg` zb63LY*|k5%PBom53R`oFAr6Q{U36EU&^dInD!mazc3jVU0TVVUy=#UUInJkPE+t+4 z&p>${CedHafB+v}xrMR`v?`Z~BrDMp#kRUV<8%Bcet&&^Q?KIf)upfQ(}y25+X0)x z`0l+VGf>HDd4j0bFiNpSrOC@pFe+qs>mcRo(%45$@#q6N&on-yOwStZ93oM7}Rv$ghBTmIk7Q4yGE zvUIpoldWwEFhm|(I;9*)*v?vJE#n2Yi&dL-!v2tA{g0q7E%I8?;@7M!~= z>4Sm71)&qeDvzL#_k-7%`YNImzb>k=S%0Yo>MjA&4AVdL+p~J!AQdf0i3mf)*Yx}| z4SL}8a{2f&>piys^(ticOUjXbjOvG_UWi|aFb^Mpw^pX6%Ssi}Yr#%_K3e+%>$*|J zqyyUe{T=JxR&9w-vHD`*T#G@23d8HpKCH7!=svw7lZPa6{P^>j?HA}g zcc+$Pe4@SEfOCFOH6Ou2zrpL$hn#TQ;?&ElIJc_00ZNOZNvO8KxpYPZVRVZ0`#?kIkX|d-bQyJUnO|~oP2)fp z(tv{niJ1|ZNgQvjDajOjI!^+V0&9d4SVAgEv$nTg9VldqZTRVqHHzbvukY5;CMulS z6!@U9!*HhfbioNKIp~j7l<(`?6qbz1zhV6R(7IFZRw8t9<j)%Tw_*IB1m%C0f{s}#dSM@@D($Ilfm0Ox zH;VWjXeO*4!PUvlq)uL6&$&0|xQfuPtZhes{Co&>cR}Sk@1RIZ3XBrVo8f`iNg=eE z{*QH-pWVKMI@_P&3Qn;O&C{fdkf7{1&zm`1{2P*XFI3vAB271`UHuOSBE3BrBVK^2 zW)3-ql2d?>F3CEHrJ+*omLN~gu~P+Oj-702<5Ll?mAd-jiKpkL-I)$QZbTa=(L;|wNCN9%|56r%5>nDNi33lmt7U(`)4PI=fREBGjE@j zT|c*d0^nD-Pb57qMl3?=*q{)X@$9bGT=*Mp@|Qe(Sx4%%4?dp$xGb?s>=#W#q862W z!FQ&mHhImjK52=o*Zkpd<|n<<&S|=rZdDrPbUHPuWty z&^52<7C@;d*2^}W)gQyvyPniXaK#5wS1>}c4azTiIi;Ur_i^rm=x4OlU?DM<)|R+rIs2akO6_c|pnrFlk(6H2~DF zr5rI)o$Elm`0LR;J{J9_%VE>>EGZ-*XpVTl@>{hKn=rHo8NXpY7q;!xx0@0Y>g7Zi zT)6CmHy3Ie|4lOf=gsuXH`I=frkM^GTY% zJV0yUOMv!mBidu(mz}5S^vV}3rPrW1qwi$-tQZ<3EPArpIHiV@co2hpTS29SY;)`X zJlX&o$>pARa4F6caQ1P~e&-q+n(Kh$=tCK+ww~|rmDfJ*2YEg$JQ`~= z32VAdd1N9rZ`xvyYSmRyE?m->6J{OvYI>Jx8{|Zj0HQ#q!GPn1T+L;TWmf4VsOLc8 zngksxmp?m5FpnL_@t$-6&D)B!MR{lBR+aFyHfor z91O3Mvhm=2%I!T%LlwV5-K42hTTIj&-NGwr6_IUKSV%E``tUlX_k1Y4Kne~Q=(#OG z%MNYaWO&3fx}m>p$Q02Mqs%+a7L>F)!~Yfkugn>qo2z6q)FY&y%))W3ku_#Vjs4@) z@2zUeMo0sSQ}qCsg(V>?Y**GUrz^w_q9OkQqpV#f_;ut zJ>bmRU#A~GE$Q2MmM!n?Q`>g#F>Ni<`;hi2*DNZK(i7SUv?fj`Zg_w!z7#}4u5Vz^HZyYGo>>LDbijtkvHH8JI`hm37^KijR-*X$p5OR(DnHhMu9^Mg z3!4AP-4|M7RS>2aQHy%TFKpnmS@UHX&V# zj$-+x8ed+B`jGy%TZWbiZ3@Jqw*%5Vn8+`Oo(sH6r*p@ljxz1g=iOMueZiM38=`_k zNd2aw^i<%qq@?AVaN4!b7`B?e)U8+Xx{{XYX|BolgM|gQ3LGg9o72mb(xyr2{tPEE zU*h7#uyC@^=1oO5&!VgNccOA>-lVyLKdw4&44NDI)Ae)vsx_wU!bwmB9R z1Lg!nKZKq=^IVBm`pNIDigN9O$6|Ayk?>7}niAE;9d&JeNPA@+vM+$<4{xsEJoa4K zTCNz~td_JEom(HZdXhCT3Y zZx0NQoFcO)lwRmiQ|%G9TIoi`3l%IoRJ@eyRkmTNZ-J>+vM=y>aHwQk$_y=HGNc@I zQG?*R$sj^b30?)~(RDhw$(Sb{s>`QpmW0sYmZ)?G1h$}#F^4I$SFRDK0V*d)BNDJ5 zQ=QbXUhbydV4EFA;5-Z6603W5O*wX^XhBsAP`*b4zedCKYn7q_b#+PSjzhpp3W|F{ z9S7ER`qucRUefgSL$`x7dL8bWn?!7rUHg_ zMrCh|_4600lb*)duYCRGLiOWHGjew{|K=_;awm`Sjw((*N19>?bnkB=EuYij#x`BJ z_%I*tdogHclAyU(wuL^K2wfHCl8w4`VkpkP1^ZQv81uav@lDbd7!AeOFLDyIZIGaz zTgUmH{-4J@fb%>@qc8e&Ow5KxPfcjOIS>qZkGa4ZMD97X;H2VcI6Y8z{C#Of;fWF~ zb;i~Y&-*ws_i>tVaz@bxuifo5incNYv=$(qmtK3GJQ?QVA%o4Gv4#!$KTjl&n&+5q zcfv(E)Iy56q^E?AJp;+}P>kE7ieF#M&o12^(WKLp{&S1+6AC(V&s@mXIgg%3glMY8 z2Oi)VRTjvy-|Hd9-x(v9t)Q$q0X8CzVu|>E8h@&!rT2|SvP*UkSE0c&Ih_)xa`{fG zu4V1=Bwf0DTDhYiZVT$PvdKN9b+N=L_&na zozpH0ucidj=#(zYBcQ=7B7Y4)V|<>K`nhRttN`6@*GkSL!UUUy9ZulodyW(#Q|7wX zfx626)OVjF1H~uZ`}A+%l_%r2XMUMlK7sjugZLubq<^6JW(Ea@f#DShE{Z?xQQg&n zrtI^(8hzTK-m>h@EhcOeR(MNxVfc}f z?t-r4W8D)&x2dM0HIjZN-yU8q;~T-M+!brwuYcMIY3_%@lG9uGy0Z;yi#&ul`KnuI zf)5wA8~b11iR+#h^81`TJsU%$l1HVgP*So_`~)EZ1kpEVSQKT80AFN})A|nRmT`tv zb9h+k8ead@!+x}P{^_U6vq$R06Hu-(Z(%jjhpu6t-uUpQ$)y^xD9U3)!Nj*LfKt7h zXyetx^f@(}hT#vw%=V!cw0@Hov{+2Nc}0mu)`Id}2tR$ht0KvBgOP|20=eA*Op#t! zFCJmOUxT^dy=n3lpc%1roubER9RKQ$e|0;DdFPAyvDU?2+P}JPYlM>Ak4s@*(0tgE z1GPp^CQYq4H-5|H799tWG+*N#Um1f2BWg}Qy-tAzB?V0ByNk=Yqn$+>>99Jz9OTUs z$qLhUkR?1^PC3)>n{k$7V#D;xV;CdckLAlCp_ddgN6|8?_*~7V_;OOu{r(oFCn< z^o+-Uyq^;~TNFs$PI#}{82BjUfISLT+;xj`oE8$K=|8pw=AkQB%rE?4#~U}j$<{3C zc9Nl#qtZ^4JunoV>Nu$$y4{v5VS_yS+)d44MW5b)g0EPOqy(C$LYshA($9xxT?=!N z2G-#Z?mXz?><)E2UNXyQ&^gNA2R7yd%jdN|9|;Tx3yNwZ`3FHA-AR^*aHV-ACiX)O zC@D}{=Za51)ZTehf9G?<1~*gszoRtDH)&CQ5HxmEh55k-!!omVnQ3`@hCs3wI>uA> zz4S*T!II`~gcU>~WA_ukNQ0Yej)&Vb14ZoQ)fmsEGVct7EAltR_t$dZ#ZeAa^?K4z z+5`H|Rx|;P9=*BruG^e34-Ym{+o3>Ts3)b%@NxJecWltGg95E!n-p5kbDLI4le(Hoq|Nk~>bFl| ziG3$14)OfG_eX+1O%YU<^_AdgrHGU_zqwAbQYesm*_|II;7qsa-zYs%pa;W_7Z+pX zvEDA6HTWI^gvRB9k6S;$Rt;hZzs%MDc-yB%rVxc z9SW=P>SurdV747P%-{M)ikiYGO!`fVTH>oY?cNA=NXPZ*ElZIz47%7{1J`t>tcjFL zYAXtvR8Ae)3#EUZpL{Jg2Wk;`lP)KBfnTMbIosyvN%URy!*7Bp|6tPdg+w&a+?Aka zt@Op`=iDqf@%7ZYJN@{F;ohv7DhEII!<}=Vod#gk1IJ)>1Qd2spgi3HIuwii?6*Wh z)i@Chs{tZr%3c&V6c0|aMz-pjKE6BgV7~e7^O|PLV>4sv$ zBsf{7vPoq)k)X6Idl-DD6q#lxvGpS5$*9TW7q!LY8Q#gszkZgoOe$#ODs56XKzfjU zd;hScrU`5GF+Sx>-a3BO$I6oKW0kxuCXnH$XgUa9itv200m6BLyco|v{qN(f#EpyG z=j9oUS#MmL6rq5mC)ot^1k^4qQ8*6Nm-L-%BQ=S*x>qp8-54KdMfYVOPH)pZ9Euq+ z4Rh9FUIYo%Ec9og_J$z3x~N!Hf1K#~@t-mMZ@#FTIPu&C#@B^GIL(4n==tg;jFQ^vPS9c*LbsoQhK3Q&w9O3-z+|&O& zKm8=ZZUSeQ{4SmXRl5})qt<4qCpiGp{oXsagA)sjh5y#_AR=Sw&&()*BkO49J-a z+D2er2ug*#qSeoidvvJi(lxE9n^sgZE`*>di~wcyH7Y@Ef1yGs?eYU!{qR|s__Gt= zhqR@LC?5PF;G- z&{sP=!e^ctWFH+d_(ZYLR+c+rvBEsvyT8Qv&8a6hiczIV9Yh)T%PFRx{g zPl)jPzZS{))wFZBARS7VPP3o)Q80~o%7X(fc{T;Gi-V7ax=EnH<|Jo95Oa8B=lYy$d|MCxGL1kudGhy8qfWCm)Frm?_1 zK%1NP@_hKQqfu`8mp5CWwrhHx3RJdaY*U-!mX|C| z4C4+ZZ7pNir%%6La%e3kg{9otO-O$qBTY;A^z$`-k59plUZ=009;2rm1dv6N*q8gA zE+}F59K^H36oP-)CG?7YdQR0&VG2k*^#wg;MGf~UkQRe30{$&2;R~Vo^t{sNvtL^k z<|EL^1FEe5d`n{og;R_U1?W_oz!tQqow=-ARE7E39Yv?{zTNTs-4%|!h6$cMz=?6k(^+XwpW6`UWx z&qQ7`%PhKZpt5rGBuztOg6tU$ZhNIUPR+l1e&Z|42~(e)1&yq-`}1eKW5$gPL`k^F z227E#KvXcj1x2<}(ozBX9A=7`-B@#SIGV@WJf3^3s04+IQA!8CrtI}}>7l@UaD7QD z3|LDY^2@I$U7?u241N0BIChlyi-h>pqe1$+x}ZCe$nwrx>h52gV4qs!0`hbU29l!q z@Jtjy!Ehprtkh6~YJ%B}Yad>=Df)v2>FH|H%u3Lt|CmM88xlcOj@Tmoy@T}mm;43( z=o4m!evJ}Q$Wu{;R{OEYu_VZ1DW;GjLyS1+66q2!8$VY|>uXAZ(jOeiV6+JM#zLr! zFDUCe<(iq)T^%Ln!u`3E+$|NwNitamq#x)$@~V#Hl+7UKguaUONSko9Q}xux8|q&e za)P;(L(8#W=^F)1rK$5EnsCPIdR`xOAdV3%xzl2%uql{+v!F{QC)jQR`av!TM?gQ` zJDbkVKnEyg^-qol++yxH45J@lCBCVUl*BFJ9*JAIpzlbQ5GF&)@FnH6Ej14fRaf-A z+l@zT@v2_FpJ>>g%6LA-qdjXnl{mFngvutI@5eYrzTq`pO2Y$duSVE3M-5!akAqnZ zCuUwBDFpJtHxA@DP+8AIvVmLI)?E#mxwMkNnhI?+JyCuSE#d&`lU##qvtyqKLgb?8 zT!OqOK2P&^DLgUk%9otCMJh18@9H3@UFyAG)ym?coVi~k@onL~CK9YQSXPFU6Jpe) zom#>8et4R`E}87|$f%cg6X0`^d`jpMmsDXs)^eWNCK&8JDG=)5Dw=85BHK7DVV(>; z7?m_jP>1<|lSzCP%BHSI+Nq&F-TM< zy1v)_q~_YwKhkf0EQX>^JRW)5)?e~)MA4|>OV3I{N&OIa#2^g8dRp%Y-|z6G~%n;&tgV4X)UseBvR@qj)u( zA60q$$5M`OFW;sJ4+7MR(Mw98Aasyt&qbi|QJC@(sA-Y*1=kr9P6MJ(c98tTL4x^q z4Q0BUyosdb?hb1ZmrwjccMpi~(7r!JO5(nz4Jj)#4NXXW>+1=|yTRDC(d@(XS4qyV zQVnLsz#;eUZmy_7yWY8MDYlCfX&p9b3(h>zILyP1--p3Za_QewUSgG3@^aKPnO|YX z1ydwk3C3_$=e(X7=Q&KgN%24y|1E9Z^egjr$6zrL22i(9u~2r~&Fn z=euMnX2 zQYEy&u%epJ4H?ag_sWo!U=`&D51ir{H_ov`gxsUQ8sJT&rxcT563ZhVWdx!ObYg1J zNkaRxjudQYs^mU{n(tV;6mv!r`JCHLp&hu2CD@?6vll80CTGa5&-q9r;Lk4B84yG| zxg7RU(;iI{2&|<;#$2(Ceuz)0ms3UDjnC0PQDt{{+_LeOisn2&2zO=)2l*m*=13hl zJZRdt03G)^&$D5U_ctsELY{Z>B(j6~;B`S=XDz=6NRsyaP9@>TrFUw))p{@0q~ z;U`^Tz{-=MyewZMX^1FAs*(jMIt3|yxdwcPGI`6nI*?pgf@r_ppwhMIQ#z>STZLW9 z2oR=-P^JQT!%;e|=#km&ohqp%+A~snWO_YQ_bq`!cLOqo4M6wYBg-s5T-G7RtOF{f zsF9)c%wBy{1SeD3xehahrgr1VJXU-s+7^`f#2`FL*y6CcW@Cy1DH(}U-dq8iZ&CM$ zl{9DOGYOCf3Z&SlXGon^^q#f=tz7jOdcMo{Bu)}$y=}iXe_BOFSCJ3 z7t?JsC}A(cbg}Iw70nu3D3=A2&E^+Wfz(V&CKr$fG8W3s#&XytUY~7Pdw4FZ*;xG4 z_iSbTHq}?6tHWI`seyNHo4C#mSHDJKKV7U|@RjA#E2K*;RaXa!WPd@!dk7vr|C8^=#GBc$?f!P#<* zOqzfy$HP7R=Po#ZKj4IW`0vmEbdk91L)Ocukr8C`!&4ZZ($0FaPe1tU(^Wl@QyeX4b-oc?^( zYHX&DW9Z((!O4cBCG~Pv2)Tr`(Y{BtwVMq#Y0z@uQh+8snv0r&Gcd);m;E`)I?VX+ z;On+diA_(u9Ekg@_-)U#(Jb-qn}A08;3+0sZ~MRF&*3Xo=-d@g_dTd(7!>8bQ4SO> z9g=u%TF_W-NKKtFNqY41NBWJwPAhVl6iTTQ_#2i@G^Nk)meP|!1)9RV3dX_$kx+`b z5{i6!_J2NazPeB?AT?P>Yq;_?Y8WXFiH}8mH)&L2M9|&{?oA5q6v)`= zPLh0_xsaiDRKIP-**{Y$Om7q{R%Pm|bAgKny~9U`5OooWuyQ`x43cn373k-YY873i z0)ikgZNq=(FbrRz>SftC+Nuo3_GUQcv>PBj7r7^)k(TV)V+?pfy~N z3!t161A|HAPxTe<#uNEpfnMKTHD%PxDB0ugx5jdj2#TErs-@L^&{52^OV^9>E3GnG z$H79yMiuMH6MRxuHBC4VM{%aNDQ?x2Wh*5{(?pKfAij%YMT1)2`$-Y31*yyZ=JiND zimPsriZ)^)fTlN!iV^&M@|*X`hpyoQIMkROeS@!VcXR?VG5~l#|&z={_I8IG! zg?$^&@l;gvs^l{-=b5yeDQQCMF-V5guBKD@sV8~?X}_KTO)HAl((p9Q!-DbgifY#{ zV&b2eX{3rCxcKW!51eLs>HQQr)z-6`h^8yxy1&Cj&rZRp1RaX2z8c5hPsA!&lKvd! z+H8#b-#vbJ+pc|UUN11f?p%OPC;RNhZEv$7cO53)PpA5Ia`}sz55vJt zdUc=91t4|Z<`mR`CvFF6k#6M zPS;sGKXi4Nzq{#%M|$V}1Z`twl_Jj57K6g;Y4Vx;4ht=OfA;rRVu1nJfW( z-G+khQFQLea!N~1(e?$oq|f(#%W@uZNk!VZc1Jkf*tS&JgGx@(Q;@}avfbHtIStvu z{QUrPm-19FpT~XA@Qqu>uHqN$PXjcmy=4rD^hSBZb9%VTRTuPkm%BFU2Q;%BI?XPU znr;kErw{L5?7oOv^>U)Fh&JiwPlw#873Y$I;x~O0%I5sj>MK;84M?FF%D(%tK!o5U z5gj3*^7)w^+;Rmfef$&Ym-&$@%rAqS*@5tg^g}S9+w#+)J1=-4xhD(0$|CJU5X&Cs)8nnVTG}t02!9mvOe-zU&E}`^7X&Yg5cF zTqrK6z}OcQwe?q!#=RA#8u)Mx>2!_CA&_feAuJihb~QzJj4&$?eja~w>{GmuW7rnC z8)Bi%vXoHuu@LcMn$0HUE{vw*p4GZlcYyM9Mww!a;lJPzN>wB=k?P@g<#EL?IHxC( ze)U;@6VG352AX+H8`pI%aH?l{L;0Zo|-=WlZ_t))9K}8 zI6vjHHIyfAh4UVC+Z<8XOv`dlEk!nP`GuyrUZb$I0hbFAzk%9S4P%|2FkFtpb}+6% z7~%S{AcVAC!kD&JI>p##099_nZQwmmA<*RESd=fO9XA)HP@TZ+6F-=&CWS1E^8M-} zQS|>r!M=M_tKNHji+=fCyfIWjPTc~1#}u(b@c#g)%OiR%Kz&tCbG$V|WHYbO^cW>w z&Ib69>=i~fCAuoe&pQU#w%H&Prj9!8Kc)y~`<}1oBv0Q4G}0>;_j|ebz2s5QM@I*v zS!_K8EAG;Ik{VnEW%WvgGxFunPJNQBx}wrk>;fzDSlm48ho9wP&QX5;7e4$HE~MiF ztJ##)IQG$b)D3MtxFc2}e!w(ikt3bd7P#ofJyv1fo$%`JNoPw5d4N>;>0W9;DrY~W z1nn2wlm07eueqCp!UP#2OToXpU2}cs1W9kS0KNX*T@&Y7lD?Lf{owd9;%o?#Q8is1 zWUVH#r@PVIdk{(tMxZF+*>`vRyHg4q+JL_9=G!OBshZStb^h>VmZH=FP|CGsBT%%K zpAM`icGE)Lwm~(tcAT}D0kscQ%G_)I`lr9w&dDS*a>15j@^M>Fl4m3{-;>#39p|3o zU}O_IYWV{Ust#9oE3dk!v<09ChdV$OcRx#NeQ#$fYz=s~s@Lp2q;5ytM70&Oa)Vs= zGW|Q)ttyH~e0y)hK9`u6;LHA)t4#7F|l9DbRj_xIi0FeJ^9IJ^KzMMT-c< zi6fx-opOypzeldZu%ifhOT~(`?x6nVTafOzn!@x?O;+uf$E_EI*N|1pjN(hGI_p@413_I4=kLmj z_CLSrf1ZDC%Kl}+${mkj2$xMoB{y%dT+Q95{h42$2b>?}m*2h6brF$7eOdq%;mGz@ zfC6C@tZ)LqC>c<#{UohX-J?|S59@f4Tp##wG}Y1^FQLhp;$(s2VM9$(tGsR?rSApeM)$LyzP^qM6sqjy8bCh?#aDTSY9R(MYOBl7R8Io$&auWgRgA+K8=qSSZG%LioasK zA!LBAB&h*G>=y}f0kmkN($jzUK*hx*Wv5bN8w(H`p7*l1XryzXyptMaH>r?UaDJSq z5)Z?hdBP*GiBU`=O%ony=>iC_$T9rw=cGbXfJ|>d3)GMTyZl4GNjJ4Q{(TzXex|VR zU;Xy)zi;;@Fg-m~1_sFPXi4eLmrXb;C9-r^`FjdWX_La6Gg#`{tSic09kf}h_cfr| z1?}HStz^h~QaqLRZ#YgQ4FEf&!3VNuXDiA*2L7o22P~8!J@r506Ry*6c>;G* z0CU-D3JyMOH5Fe?lcn9S;M~!D8e@oNtNm6l-;|Zc6zy9FPKsdt8;(|Mlb`!9z#XfO z9(AKB0U{EPlUjKcU{FoP8~Rmi@#a{C{IPhm_us$PZ6xc)WeoLII=Xd+b^hNDS9|}H z-D-MkGHZ)BJ7kd)yG1Xj1!pv#s9CdQM%=_lS99Ve)eJr*Z=n#(DS<+b1cjS6pmBdv z>1YzjwN6^3ph#qOOsji-k84)u%xkJzppy6?v`7M}b`L4Tv}17V_(j0KuIo91KqE=p zN8mkY8o5?-x~5k107D&VDU;&<1YL6qHPb6@K`R{49cGJa9_}5}wXNyY-B>iJDl=|zX#yZNKn|zg;oar@FPs^R?TwmAO;TVT#EF$m6Hr1&q=iZ-0SLc^Hpaz8C2<@^-|z;o8Bvp zt5spXcV4GlAUcS0`!<|?tIjYy?s}g>c=mi2IE~AXQVY)L@O<{GP5Ga3l~80^4ux3= zH;bbcB}>z^ML%h%>irz)lS+5~(>UvVxKo7mMA^g2^7h5jUc0FWoAnJwpX?;Vp zoy^qv5UQKBT`DMv^Zn87>t?u(1&$l;7`8x-1U`4^jso%0u-r*66xJUpZ|b`SxOGA7 zd0Ek)qzSvw7CS>hLs13H8|HXrxwnY#1C{C;R<$b^aVIa?E@y-F!7PRjMiT_QfVK_Du1I(>c38c8KiOQV$+*0Vl(u)Lza*-ywA@{xj=3tLdNCU`#W zTWEM*I!!wTn`JiVvZU9fEDlpPt%z{Lkn-L<3=qUb1-}Ed2&OkUrEOkPB%uMCeuhP* z+VPwj>7AlAJ%veR@MjWkhR$r(zg7XvYLKhlQ7YO>yR_sO=~I~E6|0%(u;mdbvbw7v z{eXrmIiBcdb<8FKI-Do8=0Lc$miK3Lkv^^J6g8mdpWffK+*TBvz*xYq!{630b1qz? zRQ0Z6uJx*oSc&~9SdHz4j_vR&vfu~u1;N8MoB3r=yvtT@(}&ufia z%U@AANKwzBVV@qH{^z-EGCah3^|AIWEDz@Y5K;u~xK5%4$!xv8px=ZflLPkTZ^|ZDk5Zzvd%_hTf?BL4Kzic}?&Og`%5IaTI3?TZ75y`OEwK$e;`X{V^H_Vvl}8>gU>yfsiK%?JZE9v(EWwCe<-F%+h1ipyGqFe5>My zroMxA7M7fRP1$qmNwb+6ITf5IYZ|8r`a#i8x3%Lf5ibMD{qX3Siy<4xt>gwt4d{FK z4GyPau`wKXEblIt^=L^Q`GY$n(^i!w(xq{)gUKC|7NqeYaQ;GJ4~eM6geuH80}SH% zo$t2a-ZbH?yC1~cZhR=|sxXA&H1UKv%ORsoUV%v=pAO52l8<{(HzA*F9sR^`k`|kY z4^p#w`SN{khu2V|iT7hT5*I#_#MNzFF-s%AUJcTeFwJt5MD~Vnff>cj(wH{t^Mf$* zWf8Iorh@u86rp@y09`J89pqFZZvg74S8v9V%Zr~iMfB@r%D@hS)u&gc0Wl>E}GroOSLrFt+#!m{4eoxHtxU_Sw z17-#=%7Ou_j4h|{`EqI^>(oJh=0b$0LWGE`Cqs{PZxm1c^S0k$Rbw~`Bh&QlajLlY zNr^N?d{Dt|K^mi7G;rEgNWQ|y|aC#I}sb3!_`8ja1Z#u`fclg}nK ziXql5%i6ER(Cv49(dM*?o$vaHVb=}h)(D9qz{F(Y*UQs)c9I{6ts`&PX zNu>7uDofFh^yi)fr+dusTg^n2!UQ-RTI|7+nygeQE&>gIY#x-%B0bd5gG+aR&vZVx zqNX9IhD^Dyo&9cp<)63Ajraw{oLquJ=N=B>}Mms_RG}m5O(6ds{X7|i!Po8&4;ZghbiRr;5Wg{V4jAbjT=<7G#WFT5Q1Zh z6?463J!Y@6C;SZZ_aVr1j?iC@{rLPWCc*CK81pZMJGZnvnXpMG$&mpgN)Zwbe2$fe zP^9gXj(l}Ja}9zDk4LidceLj6Xq}~U2?-Sx<&pv_$>OE$&;pf$yJ+;VHwgIezxe6S zTaPeG=(JCvjmK2R(J5J~poG4Jf>yUoM1Bt;xMX!_lP=53Bn1Bo#<8N{y4$hV*6prXTmE$;Q=pY(f{eW%O^* z7E>(F51grG1Ic97VXm*zL(mlMI8pPjQgw1m+#zW8>5?ig(V+O3_j%~I4)e3anY0J` z#QtW`oV$0HWFBD2q!quKIHSyF1B3>kb)wdtneRCm#V9?z<9a@aQ>o93RNv9*xlS(0e`Tq5u_&0+b>0Q*}Wbs^jr`3c9q#QpAk#J{VRc1x{DoPwA;| z0jk{Lym#C!K*`4U)2EoEC+?dn29yI2^RiN}?CL;2J3V81*-oX$TQ}(x=AqgghJ<9$ zyjl`ioafUrPw!_1WMR0vJ2Dt|7_W^@F-K1DQo9rwYIf{Bk4Ws)w67w4*rGp}B8A=i z^47I!;aPGZa4F6Yj)x?E8{&Zpa|3Ao(EH{B6b7lmC6>M4uIN;Of*8%@Szr71M9d%e z&6l^Q|Jw1N#Bc>UuNtJy%o*Hq4P+yhV6O_do8R~N2sM6%U}8yK*pVs;nx89D`Ed9t z%&#pgDrG;zTa0V5%;dtZxZS^<6*OEr`RI>H&pOQ;q?2J}3)14q$3GMBO+9gFXn5(! z-Eg_7@UpJwKfu49BqpmHbt#L-Tp=F{_oMX6zN+gVf9f;~l|DRb5q!L{Kx#xkJJ`3J zsbO$iXYj914bJv)VUXxT==Dl&6Kz7Kfw-rd_~3|LVElzUa8Ae z4k*PIi);Cc8pbXpA#7B1t3W3wPHnZodg}A*>Q==RWita;2(1Uh%KMHhVtXipU}(4w zxI3{2pL|m;)5#|fUSY}N1%gy7O3sS#VKQf{uIhhLY*-8mBkiyhbAca!#~&*}?UJ_d z-&WX%qrJa6@3_3LD4$q3W@)}_8Dyj9yR{WF01a8+VD0akKPBV~+Xk>?(CgEDnTse( z5bdl1aYqUaOLZdVUk9JZU#QOJZfyvVVilxb6%@$5U|W|X4T1)Xnvnh%gxu$CKn_Zn zGI(6lY3I7h1+Q%rv^4s#P28QL8mzO@XK?f`XjThwTqW6P($oxH%S}swULUgRFKt(% zpJf*ZEnK$hT#lIF;foB@U_{G}@cR0lNpi%Og~#o`GH`%R02wF)PgxzYHzB2u6QTJDn(RG72j5kpL_3&u-p&926w`VwRqUgqB1@1m( z-XZGG7L;GEBsosHuQiN&eiISnab)78?|FsC<1M{)1tbZyv(K! zf=0~@h*Lbz%2@Nk3NS~IrUfc#7k5?fCQ{ye9qx3}iPxQiSf@PZH~I4NSHMnA$Sv0Z zgzDn+q;<3})^g7kOG2(eLAQZvRhKw*KPyPpai(1L*Glh-k4&%Y1e&=QfaWizwu8|} zE2`#qwE-zci(@d8Npp56{Njq{0*1wisxX*4lgHm)&O(q4-yVF~IJMGW$Dej>wZxlO zYHkKV01{1A{KS353#dN$X~4V*>A26F`BGVc2F&4p?s2I)mK9FQTz1a2$fmM>`qS;N z=v@l<=k!vUF!eHigAa8qD|ZIYt$K4vxfR zTv22{kN#$gf;iSym3@zHkYu*R1<-&AK1I@8Rh-N$d2^lS;m8M0e{{jDZI*) z5syHTs|c@~fG#G2^o#hW-(sBp#J&mVULP(f(b!Ix>BiS7t?G+I&uJ8-C6sMkDloIa zp-<~(i?Yhs=8TEtMMCP3L142SfVoKi8{03kzwZF}o~KXtVGhs3-_K9u^WW)T@`?0R z<@onN@4wq2&B^Jz>kLzgfXT|3oq`!*= zrI5r9c6=IG=l}JzPFZTwrv=&3C(fgr9!&Wj?C$l;r>(MBrvwP|kVI{5K_{tD7jv)D zITzhO>8B{toBAzfJ@KdeXTRVx;nW8*|6qARD%3;bkh@a2%mJ8QCDMybD_Ys0@9#D1 zzIacZCnx)w=JynQa~OFJ-2fKnQKO2I{d1h@8hsj{evbZis`h!<&sSs+Y+XQXwv$a@ z)8EQ-pu8&K{FFq0)Np=4Y5&bA^7M&s1B*xFK|pGnxQI5vOJOs#j`)XXdN%>$)bN(9 zVg%LaY{Ib5k^`58cQp!Up47Ib{T|?a=S%u+{6|k_T|+UneK@@5TJ1dyc+%@)*z2C@ksnR6qXn zo0M<%(1vPfi^^RZ>Vy1&M;ej>W>3zyY@70ui7+|5ui~tWeLsvrw@nv&6ip$YAIQ{e zSy0ViCNCFn_X^C+!kZ7hV>(YPA zXJR1%3sU}$MQ^)ShCMLat7OiG|6b4h^-#^r$Yhx%o|hu3)+%Eb5`5aU1T=jVT- zd;LE5(9() zXa!TBo^w$OoIcDqQyu3pz9gLe85!k{kc0$Mh%@0`vi4v>t(iw+>OkG7(_a@9dD^6G z@g`}QqQQHH=gDS!*OPu!1?4*mIi^^~`ZHe_TSgfVjXWU-3nTHKl^u*IpH5u$b(D98 zb@dfn4-7z~^3<0e%>`VlJ5iX|fOo3fgytEuR!K`uhEqXROu0IMs#PC*t(*U}Toi1d9k(l}2L|N1(!XL^?) zu#4nP3OgeQqSWiHITV@A9IQMAjf+yQHHZDM9nV~3||HhR=4f>HEKGyWJ{LJ z<6SdMMY0@W8ZLC4g_btL2BuIAILU7a%2vU`UyvVnR=5w)UXz_-URHW&epvHM>D-sXlF)Z02m8HnK(L14Nt~?n`zy?q^94DD1 zsLo8QN+~D}me!#HtBZa=SB@Lqi#c%KFOc?oa$NAk4bY7AR+Vu5qIg52n@|(^tgozn z`uRge8?BAuALFDAGR5~UMEyO)V514o`-(SeTG^edbJpC2W?V}0(7R*R660xIr_|o& zFsfx)<1+MKQ@6aZs+00Tx~qbg1G7_dCZv#$w;18tT!*>qgZ=N@znIp{6PxSM=7LkV z;k0CgtuemqSTQ%S|DPu#dSD1kfpcE-qD+$H9a8zxw|ZD#MjTl|IAy8-iV@5$bdy#O(#J z|DN`bITZN|V>XUIRn~VY2@?)r^&0j=nyU)-cW0uh$=Gku>Za?83@l_yqo8#tiU<{e zJqH{h;pE%!GKyizGD2T>i19gHgd4oR?SRP?09q0b*4!7}r7RrGbPKrItqvpnBrH{h zn|8ym17i2_#bq1U7retkTe7ZW7easxH-j7WRG4f*d&J?Hp4rE}yWiFAccWHn=clFi z1zO08GPDq%3i1wGb{|Z@?G~+Z^}P`CK#Cr0N?SxxLwDr6k$@(&6dPF5MM?Kq9WA{L z@w|Kbc6lqzsuN@ghxr*%!cFVT;2J-vj@00OCb$k3W^>Z2cm*h@VEx0jyQNH+!_6Sk z^|3DPVav8ImRE7SAWopP+OoQpI~V1R?dq!PW}tc{+*i{7HkFJ2#b&_f09uzfgP4;p z4)=W*u6=WE73+Lz*$k#k6#QQ3<+G+VnDaJm2|oA5&N_yA^wzGQFAOq{UT$>+|i98!vUR?^PjyaAR?^wr8GGP#P>{RyRtQ3(!iS4S8{ATXjO4 zTdYL1dO-W$(KmOmSkKqjEg9rAYS`z5@GKIRJ!v;U8bEO;aF;F^Os(|^vJ|wy#?g3K zZFRx8K$9qN`Mjvp??cvi4$Au{w|y;KJ?cdsDFdwK(wXDDT1O(p2+*ZoW3pMC?hGmG zzq&I`+Urm8toI2oM92Uc*4%O)YwH+ZH667UxPCS{J{-TkwzfC@4z`%39SnZ zZE%tviVJJ|2vg-c_|7#JTHaxed!bi@Pf-KB64*oRp_sp-H6%(c^mVvzus}X)b4bB!6#JAF;6Nd>e8i0j245H8WDkCSw(|P`;VIyyChhcj8=2 zMNp_PpiVFQeWX_S>0q@W9mb2vZ*y`6Ngx!K(>>rBaR5-w^7S=!XPS`inDxfR?Io}o z;cN9T%!$jCMyj+83Nt-d+IYOAqN%P#2D9)X0Q-)W6tnni9$v9o z15mag%_3{haFr-Cv~G_;IbO()B#Bb_~X5#HE3F_Qh3Qz}=q7^EA z;y8^jBHk8xSilZ8g}w8`^IWX&vL|l!P<7AM8(`SiT{t2P zE|Ye`fPOnTu4ll-N`nbmXRmtji~J?F*>_$MF*C%xc7`t}@6_q3Q&$JtLV2+FWb~2A z+JJynVIt@O>ogIF0d^&tuzr3%41~_YA=522{hR{$;j%iwly50il+*G`%knM04J`bK zWN+H`!O-KZ>*?;V^IqzUJL~U&oMSM;dWbV*g@`7cngrB;#pTZLzdRTEzkz6j>GQ)J zvmg#~&05>f-rWtm)r(Um-mSUi|D}O2nIb@t?+wqh!EIk-KbODz@;tpCATmE#(Dal~MNbP#&L9wC&{!; zsbU`iEK;XZ$|uuj=Z|~XKJM9FxPtO` zmr0BkmLB1I?xFo0vnlTML+l^+nuIol{Rbb&ZEpGQzAs)Rk;}O?kaUiGYelc!u6cGr zMmXOasM3oq(y9DJd56qM-_Ma|(!F{ah8H)+=ON^>LyAIw4k;#kiNjPcr|RjsdxG4( zqjG?kHi1CBglQ}KUhvfovx8$5GBW#b*M!tWZ60ju0XrHH@pSdGYIy+_#|i<|={ESt zNM+szQch11ZPWBS`scS7T>txHwI`EnI=jrmF9nj?uoP!Nc>!wHD*dSLfv&Dkem%F( z>5@-}OQoopzxKY@+Y42YH)3t8cF~Q)^B){u;{8Yu@+As;YGno$Nb`dBZ9oyxTIA)>odbD1V~TmLP&c%h^wdoAvYJpSY@WUPp~5Eev?gY&{K6KXp!+ znqZ!aJKcfF2X3%Q;W`O&0vo9JTujxHsgueyigUQYJ2UR=kTrEh1#ioN%C0FAOcU(1bG`eG9>)^zhpwm~@fKufQDM-Xh3L&fk!E$@Os* za?*`2vWor+lqdFJxre^1+Ajc&xV(lt6KvpJ z!uj&#{-6r3Iu!wpNyGH|SHbF=M)Sf!Z)gDb3_mVBK z-|;1&S~HkwA;o^iuoVq_MP;txHbCvBURWQ-tmql%B5u6@h)&c9c>5R)A(i6P^ZFB{ zJ%eom`rkNA5K@2!v86d+Y1VAibM;x#_aK|NuI1BDc*27V0im>3Z=zNYRG#bV)CFLuTJjmu;9;}Wu`@2AA z+|uRbr{m*yd!v^xsfnIU7I^|wOm2T|)0r~!nYyvKV>|_Fo8Kpc@9zes`Ga3<0@5E> zcX6`PqrK&rL}rtQEW6XumsYYPr5`SR*EQ^bZc0JM!Sg=D7X#?rUcS%vLYzVke1CO8tPf0*Mg`ZpfNHx4pcU7DPVp6A}Miuz+w-4Vw zbPZ>}dzpEUi`1yyj{gzx`+ z#Vcbb6@jRS7>b)s0%)+yWiL=IF-=H!;(N!I)DK5oox17+x}rLzPfR1xPpa6N0!=b` zLUdJ>>1z51ikRb5>-LnpSE$S=?Yuo@3R?&7q1wwAQD16?M9p7yNZ{HVsw_S%yq3ms%*NCjK>iY=*ONvKv?E~^3PCraZ_d{FX>LN8{{ zmeZRQQr2Q1o4f#TK#;#&^IWYNaWmaZb&#LkQA{^!dhW2^PE~#s-=ZM8yDZhces^0O zB{4<#_2t~X--qH?S8-0|W{arFK+w??JCsQ%Oox6NLai)mJopjPUp6}Y*c_&CayLm+ z7-IHe@KUGjf#r7T3UF#U_9h?ukGWTW2=sS4_TZ5W3o)m0l+a z(ikrvNEfE7btVr@*Ozo|ie{dxZMyIK)3dZp!sS^9Ou`i-Bp%wm%bI3&Y2Q_GP7?$n zOZ~J3_u}mR6kHS+D#He%S!q+SzK9ZC`t5Y~A^jD|XRrb^J@sMpIK9lrK4ivw2wTIZ zeXP??4Qs-bH9Q?$ycCb`l}yR<5{>#P5ve1M)0_~oHvGhT?#Gb`kfU}F@2K#nhkqI+ z%RNS|;o!*^l$i^YGgfe29prmck?eBR44j%q$PB7GPB5HV-)Xw^14;BZz&r{|&Zy3( zI29juvtYTx5s~*oQ|y`k6P9SyP#SU_>7KjjhOE=KJfVt$5^pRf&e?jhM>PFE7_vR7 zgIqZq@sUk7#OY?eY<)HlIH5-7sl&`eQf13#XnydkPzkAAzWPcX9-m%_5ama80jOcO zlfVep;Cn%C^6VyM%FQ+lj-s4XUDWhEx#(S7T|3FPb6m=fJGIC9s%Co*O`M(d0u3+^ zTCr+gCG~ppn5^LZjdbMaCLkF?#a&i6do#%Z4Z?sFW_d`t+^i+pB$Aw{;r#4OW)KZ0 zhySYjAaC9Z;_6|DK!BY$fmQTCC9prbzQb%&4d#6CMSkl8{Zof925W^)_gq+TqKsWT z_zQK|3}kkg{=w9cJ(q8_zRzq|8XNxqYkRXL$#E=M@Yy~iMLI0Q-FzW-fMAr2i;rA? zntJm0{{O!i=mD1l8cBfWaU-*0Yw2z+5X)Kgs2*ZO_vSYI>k!-{(swsqr9hO@Zg#io zta_7xQmaYui&V2Qj1-hQdO>T8iBjL^=jTD0Y;ou#$H~Y1`84rKH8w!dY<2nEfVG)m zQd?T0Jm2DD!k$Os-IHstBIiqi(jGtm1=exKp<#6|gPq7(<-qVyJ-SF`9*zy57&^bR zs`&!2ZAce_UjMh`M~PPoMPJjabfuHFlxCfhcq&L4?*Ky= zYFhpPYu5#3O8tyjvb~Tsoc~K8|C>Sn_rDv5>eBy1ZJd8_ZcP8rKmD6?eXo@F-YP1_ zu4N8PIV*Z39Dq*`oq5g96W8+{zdZQ|){g&W4DR>&#OL)#C(Qt`-;_^RKmnBVpn}ab zgUS{4Ny-s_z=O&f^YPDn`qQL}^Jmz0Ix~%fc#ayl2Du4$mjG1cC1d2LY!=jq4o`RVz0`ZfLM_wVPY-z_o5}|A@f1jw-A>x z(b(YA-oV&fCUH|V9k8PO;UA&qBqgXUlHPQnVr8=VbT@a*`6X#!1({-L%_BgF`s?|s zf|6g#U>bmKDMrjVEzHF*__(^NM5{3$nz^FqHeCdC=|E|bTaO&*=LS#`V95iR{Y{Wq zfX^I>_y)TkZ+^$$E01uw!Wb z_4)ZlxIgjRvJ3GmMI@M7aBleRUV8Przsml1H$n_@=l^{Q=a&Efv#`bpq2+7R5fOff z6Ne;oheaO$j`MwEbxVS@nC;;tcTlNd8It80QkXQ)YZ#HnjnSGYl>&b<`bXNo9>b&plU$38%yzs;MUfm)d)BpL0gDQri!E@bZ!~4`X*H*EXay%! z0k#Ij?%p6co1Z9*7DHkNkolDq!O#DCU&mbrc`x3^Vy_42vP=D7Jv- zn^l?7#j?7xceM7Y=C~Lw$88&lnu{g+OH>wBo^!GQ)XhNCV~P3I7NEYIL~)J#{Z>EL$awJH|WEp1TKT_(TkR-A4{Zvyct4`IoZJ9G**C31`a7Jjiq zIR`t)Ec^BaMOrw4yCN6rRuIjca<@Ve%qGE?e2;9oqmv;rXS&y9I`q8hO z#NDw;S{%SF>HR>R(DmN15);SiFvv)b>Mc0A&p{l!iHDEAZrhZ5a-4e9-YU%`Jg(+4q}e`*TBq zv)85|Yd~oI@g&0)oiMdTQHLnMY7M&(Hz-fqw%qsh@hy_zbfg5&*d33fg3tY>2CSEt z1mz`trxY#Q@iG;hhaK-GLfu2g+6*dxL?t$=A4%htRYj>o{uw8%$TK4UlWipEH>YQ= zrXmyBu%%#%m+msq9H7vN$~DF+&`-Kh5t{b?YK$3PVtb9LDN2PhVY>L?2X1I|VA-_3 zxL1uBCEu!u4`lSnnsIoK@7oVRwcH@dKFX(chFI~k5xiK=m&^Jp;?lIX_U3LWFP^8a zZ|NVz(_s==3U^i9&^+mYWhJK$$8x`nb=nIq*Be`~Qj08IFt?}YLC3Xv^>GZ?HE&-C zM1ZG_jFc^~WJOZC6yR;!hB;+e*4}JdQ+uwiW7?)3Tn~$pE+vIVGxmX(eEUKMGQABg zTjC%O$m9bTPhAe<+mP;C1TpC%(=2QCiWka!&RSd675}U8p17wL(D8w=fSAReq?SPE zDCDa>mn%#w>WH@60<~%$`=Dlo$Rtw<&n|5kOMit_5ZCbMNFU;r=R6Pw$0@-E*;Gje zG(EPm1PU|3`aQ69kb2^xNQ*}|#<#Q0JP@`W4U&Mx1-)-}{);lc8{Ij#Kz_4>Kk2Nm zp}sdP=+ty>^|YT)RA8lN_}foyvcoHiBrW0^XRHR=wpD{gBA;|JJ#~CeBfU~AY1N~Z zK?BsIi!`@Q;@LjVY|`i;RtWP;w?ewQO}jRvFHp28bl_bWUQ7rtLwcnX+LZyCm2F9u zC)QCqS+d*3>BLwHI<=yK241OCVu{(KdWgc>2N?$%ae$BtmLZO~9C@2`&?wbIq}Mv9fh#5DBGk{A_@YDB+oT=O9rm2mV-}>57ZZHcbM50j}i2lQ^@;>c#TGR z%EMJD-I#FtVLOqfbs!s(ib(_H6lf{u?93tQ`;t?l9w3xVXNKloJYwdKBUK!!9s|+( z+FsHV{L;^~GO=1@d0NC|E>0@nD~0L7`3ef1=Fzeni5e~6-$Rr%9@5`VYeZz`BPN== zwEVgcLhuFEd_gB(aUJVLx+nqFaJR1`Ho0kMlY7~R6pactHyXGSm?Lr86fd=`sqtof zBLAMW_hjt>Gc~2i_DeFTjQ!?F2T~gFB`Qe2KEJ0ZUnrZA`Y1ikK>G7M(h#ViCsP98$+UDn@?3GnWgR2ZUpPkj zNlNdqE8Vj&{*mI6QN6|+C6we#YFPM}PE-2&x&`Wgzjh}HBa8q1@Q=`Y;h#8E-q9dF zBd^E7Vhz7?b&VKx^jlW9Uy0HGJXV=J=mf<61%wuPY@IGPJ5OkebkK0LYB*W*%(2pr zUH+=?u0wZNFg05}^nfcsf#ieBfX(KH^nXP#oR%sj+b};rzrR1Tk_ZhuQ#&WpFJUnG z0Z1?Q?KXtxUphXU75R0Y$5an$lcmVdq-9`-R;XWD)wM|A|!o(tPlb zm_B#PTcY~)Q$!_+<^u;RleQ_lqNH3D1RN$aF_%+?NmPBmcB1Yd=#a`gDcA(kr+D9Y zX`Awwv=oa9l61A}KtCI8Gb3STO-m{j zjPi;lHFvi@g47Dms(|5!167NFVL)0cI|)0 z3kUvbx+zMajMN)krb;yctvHU}fBH5VJD6#tj~>8_@r=g}DAH^0 z;#YvurQhFIB7e>|K+741Sx#eZ`8ygGaX@ECe672*;8Y2o8RrdJVp88si%1VBJU;@j z^Qvw|>x9c+6(wYi!Vnd{zT2(wJv1PLD?c51>!53m~*3~dJ9rTtb%ziW~({& z5StSM;FutXTvWO&7p75AqPX+rXh>B@gqavfT@^Oq{juZ@s2mLq)eWHoZ+7YO2=+jOS5CTQRSOeuIW zIeMyr{A`i5dhF0k+@jjzt5b%@pz`*EfEFyN8`O|~U-mW}539<=Bx(2t7_ zI>e$0&5r-`qg)6_Qeh?=Q8~rW6MIC{f(w#;Ke3{o=$Z3jGB`;7&EIuOtZ%c>K!A^T z9y&4n)9dbTm%=x#ww_;?ymVo+2w^A$h-aPX<^T#jXc7(aCDNq^*}?lKC_?%2W%BxFCBOK$f zP9|rjM?b_qj(-jTY@1EDv}36N2$@mGMDP-nF48-RUWva{5PsLK5)<6sJz_zoU{8Vj z)M9p*$4?3A{Dx9Gf<&|hX9A%pLOnkL~+As;+MHdqBFJ?p>^`)cb3yNEx(gP5V26Wgh37 zNBX4W(5^`VUwWf>iM&t-6H;EXC-Nc4k8zm5kw-U*qnO>Lf6`^|5TLyOitq8Pmm|}M zF~m7=i@nnXH1|jR+#jhOCPJ!5@$dNe#^B~>G$BQ2mzlf-Q@)~E4Y&=d8t#X*2>K20 zlzKm>3pd{Q3&W_!!)tUV5V399_H7@^tZl?&(GJ} z&~;Z5vNVIFiJZZ!EoE(0GGey$>n62wn;t0ia*6`EQN!aJvkM3G{d-0_Q>Ib@opF-!_u+G54HyDC}O!HMJ}#B_SaMrB$G5O@Bc^=mGQQ z+Tf_fC?*n;A}BRQP%1&+279Xp^Q&$~q#lw#AmuVe7k=qHIUyZal*Zq63(`wJiqs$U zn@^eLP5ma_le${MY57}U2BcWf&;;|m{-bQRZid#8LrGUL`*uKG2%9i|Knbb^>NOn~ zKh_~4P2@*Po~cKky#P*~rm?68<$u&2)0QqiJRflJHtU?#H|WPDo?cPiOxExE0HJbQ zyrD(tjPXV-t3W^2?2?$@O-naxZ(sYHxZO<^)J2tNT^`w`g9lM2%Qk6&R4Xb$v@Gdy zE8Jiz>+B|-EI%}gde)|})bFn8EK>R-q&pwqKjMfyA12Gf5});Mx=RHl*%VBj8~m!9 z`gi8M!}J1EbC_;wGuBW}V{PL!$@|}#D#)3AHvI6AC}$>QE2Lr$@~cRR>h3{uPnnqf z^CJD9KR*3O`m9=;Uj0*LvN^M-3tuQ3QgG50K(*ujJ1GML`hC2ld$YHj50fi3uGIZl zdlm|?)W1`jEFCSoOZlR@VDqF-^XHGli7vBiBWvpv;&&;AP1}{bJ_N2A>4F~P=PJ<&PpQz*%XEyP$UC19dso$E-08tCJ1S&;Q#kiZbyr_ezTS*N4%3>nI-_fu+ z$eTjTbVgy0xhyA(@?ezt3W8<}%;QnFhdJbH_tqVtCbJ$}fc~lfc*r~@kYg5LNr@ER2^t+^AD)kmc|EGywcvCo9X_;cj7J<<l1H(q2V9g1z}^gS&Y_ozDqL!->M3 zn(m`{RCsZA*?sdv+oy-X5-}fD$Jm6ftmNC=YOEjphV?XO+c^2iQyWJM(+BQ95?qmr znp}Epx}aj@m+98@(D{}FqCE#rHqubIrLYw(>f_Kb?@)o_I6pRUeq2g$@7y;LwJ81G z-;Q4?y*GlL_8vJ+8_y_L*PcA^zh>7EdpqS6{xZSORU}bdW&K z4=iiq+OSkD$*+D5=Enokb7&6pnRWLzP&tPAEkFZBOI6CVH(|K`a%$VJV&rXvJ*2)5kTHM+ zq+>xo2kM2+^G!`lx?ReRKM~oV`0g+qvneUzG(BH%UX7v4wBdTXYzc4lGwV^kUvK_= z^LBhlolW6^>d^;XR#c|p&j~^-Mcohs?V}Kl+Q#NSP{#hv1H-HRVXZfb`>Y`it*Ry6uTt z()GO`UTr^gR_fR1;rbfX>x;krzRu*_$raU>avN5!Xk~Nbo|<>IH+(ugA@gMiN5TQ5 zwxCc2ar5W^tY1X>_nDQ=#a$h$emRZ9O`vC*bd-!y1<m);&P z=8wG*=zFI~&%h;MNkTmnF7er(z+dVhF)?&2&bk4+tY2OIr}RL^0y*aHa65I`^I?s2 zsgs~a)`0YaVTL^q?DOkcs#l;ff>_jtU8JM7S_{%p0tN9QKll&6pK~CJxhB&=4~!FD z6X@Ar(kne$Q`A5GS2|1fzT9~D?OUepM~xM7C|QwU!d>hnQtZ@#bWhtkj!9D=)MGJo z+M-^OzM@ntXbuJ0*|^-uslmJtN8{c4o}U%WV&qwA!5Z`$-5yYB*#=EJJ zuF*mTEj&Ycoitn-AVE!kp7tqmHry7}uN739Wp<-6O*f=8&fdsP<&7t!t5n2ojSt+{ zaxotcZD)-fpRH;=>CvM<>FO%H`RS?B#oSOR#)L^SUABPD{9LB1n|^Q7KV+zB!Owkn+YGn{ z4T}I}ewjyUYIg9^!WKfuz<8(=p zzCTCmSA}v^P3k}^cWO^b>1kUk%11ShlU2k0;%oUmpa@)ZyYXiWy17Sfn_Q`)M9;xKOR-=-0kzXij)$`gO=0c;{o+8w5a5As zM{AGi)(>F^sPJXCakE9@(t<)yS)`E9^Uin(cV8Z(?6vj$IMjd5*Ht*}?yPe^JYAzS z%5Dvt!{b2x>_5;1w8!quv$swD1FCJPRZ&jj32fK_s>TGW1*nZ-a!D>k>REN~!FSZ4 zFY3|E@v3kW5%E^2yH}J0 zYVw|Xq-K^f6Gb9$60;d@3+vd;2{vo#*0Fx=iWG-jj*jOMf9-m3kD zg>DS>$4@Nm9*57LxAO@YBZ2%v+O>uSCkdwFYf5jFxYSUlzdn*x%g+pskM+MhpMNnUu=bz%5kM>*+#xlh+h&(aP~yCY?NH$N6sMX< zs+~b$tF}o$FKF0x$G!yHBg554N@R8fq&2xqT8Wh!dQjPF!5ZDp+msVNcQ=jMW~D)M zqXF`2f-2_4s(Lf8s>?RyEl8bL&Za#XsIEhf)HdccAF=-X-9;rr+tE*VD!Mul|JAOz z{>{30it*+uQX*`>%z2Z=Pfy2vh=vpzn%{<|@`8~ht;i0PTbHHq^4DP22Os+TmtQs; z&l#UizXJ8d@XyZ(5?FePmZ5MS0>(|d|)?1qhk@%M5eD4zeHPn8x=Wb+T9yIxCCY}KM? zPF@Q7a%x?hXG~g$a|QBLgUm|tunPKXmeV@Gkh+KYUBDds5`(*I@)Un@`cUO&w4&f& z!TUuOVU;ZJDnAQr@2=;fz_hQY{%ES24WFQ9r@%ufzJCfK?W|r3lu~9w{4r1<^*#>i z7$S+nfwIzu81!(}op`lYUgd)omGt3LNM&qq%k-}hfTstbYlF%o(^X+5hG6bvRo$)= zX23zBI;CRQ)e5SjQKPn1J$tHb+n52;zmP7Cw6fk6tE$%pfDU7jHKa#X-!Qh(&Nvmw zMS2hHXiuNND5^-qyJ$8$)YWl*PTu3Afv>)6q@S(+=_&uSBm$4lgi%GPl7KOK55gF) zTA)_68RES*!!}TrfvROHLQ|;a5@W;=r}t~HOWe{KN(frOZd9vAH8D?O zVjyajV8szw&lRmut%lllFiW;bss|cX-Ud8#K`5A?g9k5ypA!GF?0!H; zo!o%fnlgDdcmvWC+pwe`={jbTq5Y4eK~eY>%k+N?;QGt4!s_ov+MxcAEI*D*^O!DS)C8&3W8F^4U`3?xh4#>u3^>y8j zvS(9+=wKjmVh2bjd#4d(K~j!w0L&lHiK`X)g{^{2-`_D6R#!Gx#&>q@xZ&FL5fq9+ z0k>+WS=N$(x^Bq@HQlK#Kx@Y--Zd^nyNINNw_>^mbkVd1R=r?VG(6FQl?>kZet74C zJ8fe!kM=><91TIsPn4E0Fd8e@bfOSoRe_=ci^?^A99e2VR&2|C_Vf_I$Vdk`*B8&L zR;$aE+*j(DFW0P;VS3}cIP~4?e}?#<^mhLz4F7RxZ-saw))v!v0!UzFT^O|FJJv9( zHA!m6;nJ|MmxIhTo2`YWkVQ->!N>qbQBd_k!e)`b0r5oJpHi zbStFuOJ$I_kWow>=^t%VI%t?iLi&xHc#1;Yb=eNTy)103jP4Em0F_uFof20cCSS0Y zHMMGtsd}&~Tx2@(Zi`^kfRw61u2&eEOW~g^Z`H6M6`va05Pc_+VZe%OE z0jZ^^3gsX{Ln{2_7jM7JHn1&7kLeZ7c@;;Ri@}DvK>>za#;%YqYucg3-kn3b%>s%2 zI#+F5Qz{0fWHo5e*7!?h(5~Ql3TerHedMt3v&8v1;rzJhbX#ii?6iAM+cc!jiZ{#2 zc*D#G?bOZZX>x#e8}=&{`5~1Okdp0XxlfItA%*Gdce!hEw4yY@u*CjytGW6czrJiM zbC1uH+xYsE^O6Kl)ft+k@*L`Np^}O;IO?^J|1o(+fTmiw*oFPzU$s=NH7M%Tyh@QZ z4$ZPtjigsLn)B6wJ43NI(9%wCEi6*{nIFCC~h9SFC8B_^X2a`1-$b@^d{Ed`hIJ=_l)U zk!q1A=~|KYtM3jo^^lvxA-+CvM|tvJN^m>4Lt1w4!+OybuW5QpKC>_60nV?B8D#%I zXs9Z`7p5F$P->^MLV5`r6H1|Es$$^VOxy~o(_<>krM{wHYXkUx9__x46^fT3nun5U zs;5I0FDHgZ2o{zJ%aqTH9iG7akl==&BS23rq|56NY0gOX^zV<# zs?*b&wgJq`QxF&w&;7B9yW(n<@Zc+9W`rMnZ7*xm()BuT2b?(35B+AiItskVEw{kA z0_0Iy2j5cY66?~r%8`}4d^YU^#)+sCj`2`Fj<-2gB~R`wtM-=Vi4oF zMZ?BD?b%=(BNvBGfasjc*JR0~FM4yVkY-fqNN@_|7sN5>1jK=`!? zPGTArk`=qXXb}7u=w%%F>|5o~8zl%mR4M`}q1F`Z$>e7PDd>1}sc+QJ%b;%S9`LdH zgLG|FOM##j9OkYFuM$w}%R4|_?y|lOpl|qbrJrBkwtsAQt0u8Tu|c$?f`ucJ4M} zrpQI}K+wr`$V%D|HJHbdwZ)3Y^XbaOU59{DdIGc;{5WN(V+VkiREid;pCqc$rx&mn zvoyZg%C8=^>B@AQw7ed!(M2P$5KN`Eg_f5F$d?{u8`J;c_0`oM9-OUDuatsXZUE)R z6o*US9WK)Zc6TS}$5^b491Oe5tWv}_EvGRfbIok~`ZlQR5#CL(8Pz73>u7S>C9K*O zd@EO$E(|Sd1K7)vXyW+0NAzk8b%9_TkEoTi!_#}`7Us&RMf-zQjjSkmvay!OEfJxR z{L|=jx!`0g3i(7lS3m#y_j)xgrk4Q(Hs^Yh|I$U(s!;cocC?GH-c=1{i~hXw_}H>e z_d6M1O5g26g-~r!4?~SyS}%&TVd{8K84%b-2vlU{pFf}zJRhjsU8y7ez8qTL#f{J3 zHO(*k9wbXl-0~{0m+MU`NUi1&;%2`hhFOr-nTPD9X6Y}OokIR6@K7Zood>J}6MDQy z`gMo&K90UNgsD4CYVH^BLb~%YXRpgOwM(BGS|!0Wt*LOx?QXd-6%?i|iN7F-ed(M_ zZ{5iYYNmr{i=j|8|C+u1Ul|+wubxoSN-96ZRpt{ir zs{!mqm%(UXRsCzoP%~85E3p5dR#ZIs2`byC#*bX3I@B$zp=GqvKRCEXf?AeX3ZZ1u z_@Y^1@{Dc$^M7B|Eq3XjNdHMc%rw0c@E67z+nvt)hzV|};A1cr4owaA`Pow%Ceg<_ z(vP`9E26U>h}2pvb)vZ3@(tQskVhJGsXKBX%jsDe)6v;24y(8C}4p8MTm zZ%>MUr1ypCDz=_MFfJ|W(W>lycnI4e8Tk} zL)KO5E_IZ6^nKqCli1H@EA6xs;-sLfpsSRgeIr&#iwZg@3N1+E(8c~bkW7i&-UF-D zq-g*&&s92*J$t=6QEn-oj3Yn5Zu-1WNyhZ22bID&cslUriQsZ-<0d7W z!NbKwz@HvVyqEnho95J1f?8@Ppe8_~EQS26!3Usj8lehG<+&tE^>RsK7wB!c-qQNL zWNG(F(fwt-0_5(8pC&!@);uK~aUlJmpi$u!$0_)NhH)sVx}Ky(KE$Q&%ZtMf%Mi=)N6dHA_WO(k0~$CWi$7{^sJB zqPY`PKdA%7MWt!&qQ)zwhyFReP3hFTHy1*mUa8QZy{N`MuOmNk_zV|XDkAH?jVvF9 znPlCyK>a4WoQD0{_kECOotq~I1zZCiW|WH_Sy!KIWUC#!9vSF~&d2lGNifaG~P8Gm&ty*#weQ197T)ur9;CI>EHC z+nV2-NPS8BOz{vX-LqsHF@%mA_wTa(GxnftXLc0{&%^~gm) zYuXD3Lr>mG6GE&@sxT(1Z-UFNi|dlSoK-6tBSA86Pj7+a>6KvBKY9YPntpw+E)ImV z3e3+{WVuS$0`{^*RMQCM`w!$Q z6@<&LKoim;0*vu*T&&mXZi96$YF z&2#^nN9z~dcL{wQY_LOon}rmJJU#gHqWYjvjBAScwNu6E z=M`1e3GyFpx&LdrKMykf6iMqE3Ibr)%P!QS_8Uy$P4zg^E$*CYQY%Iw0OLRDcicuP zAx$roo{yAYxCNq;!ZV?|I|FKl0_A85~{5t#gPhg zgwMov<9HuL86Rn==Zz|%{D@HxsHyM=fXk`|iBqL~3tAF=d)t%Fc~Go;8vBPk8HRln zpZzPLDxX`GEl|e>n)q8~%aNfXvfW#XSh!b(ki4UsMOF2s{`J#}c5xk>##N&FNRyf< zlsNg`W0az(s}xwZ7^l1%uzIf?_!RxV@YAVdHOhTCNNA8NVKF@=B&ShnYOQ$EDLn#- znp#v>YX9}wtjPCO8dazos$_8jjCdIMzo?>J#gPgOsu4Y@vYbGA+AzCbrku4u!R`k^ zNfcAcBi3nz5(75G^R8mWu>D2=aF-4 z-BPBDKO%tS)dfQlQW~fO1bz>wj@7Jem`9Zx);8T)SBPg$i~0gjoo-HG!=tFj)lG3r zdJmwqUu@k%SC#Z3i2Gf|dpVk*Q9~a?^yi0D$hU%Y|5BiBi;4vYIz}y_5$Mtcdfy<_ zKClb&Y^uuns`o@z+=HsZ=v&hSwO_2&T3l+aZ=6n(MEwt@>x&YrlB>2wo=>T6*2|x3 zmV(ASTKx0J4yz%x`{6X*(z*m8peIq?j-%u;Ko))lU8#Osh3U|PrARrJ`zxcAh9Yb7 zQ4U2jSgBR560OUJ?$x4D@rvB~?3d5VKiLMxQFP75K7}eqy+R)Ks$WqR>VJI5uw>K# z7b*LLnyTg&07ALqZPi&)rHb=@N#p$=9-%Fem@+Z{FivgD%hYk?S@CHALSHR=jyDG z+N7KTrH_=TXd(G74MpkK&eKU%pvCNQzwS?^TdF@#roOk(ULGjTpHYk_kcIXL^J@nt zQLCIA;)@wxxO7&jQ+H^nxFw&EB`F}EkQJ&>G-02=!0Jq9D}Gj%6j*NxghE?p|F2Vz zeNt}6)Ys!P`dWJ!w?#n;rjSv$Fo6cS(a zO+P8A^#`3a*ND`BO0QCKqKXQ2fz(V6r7cKNMVlg%ev?sgT9z=7ej-kNdZaLy!nY~s zr@3)_HiJ6C`EmJWUS+)6Rgl;4@yGZi>gOy?mQ5NVD@>^TnQGWfD zN`0vV{T#`OrN{5_tM6L|Jx8l=(Sy#xH)&waJ{Kk;eGO*H^<M@!iP#^ zK&YSID9I}lg%UZgS+q|ZkX|YoX$(U+d+Sd+dEn1dnMeAKMIGaPl^N0{qr+!REb*J^;urG5B~NP z1q-6lgpVRx)mCCLY zRQ8&R&;qsEmJI!$$K*UM>CijSJ&P=gYo-TJp_I$w9B1p*;uk@5a#n^>v`S^W`_F+EK$8mbv{g~vJfg*+Wz0#QXD`t}t)>+mmoqj>h zh!(7o(-3k$k4BU!UwH@1?~xL}pCuBh)LS4e0#qX}QsvpCW1#l|YEe1EXz~yrNumXH zBSH#JyA*!$x`Zja5t2+u>Ol9C=-ZM6JP=CLKoTyh0Ff7^i!;Rui9zPBSrb%)bqhrF zSTE_rU9-{V)u)ICF0aKkRRn%8pUMU4W0+GbD*RRAY<^HZnL1hTU_)4}X;>F}gKdHu z#qjUH+DHAgko@ftBTb!CWJC6I+fF9(0{Z9!=t|wmy4_ZpmHUn0_ zyi?gVp#^JvidwyyE-KP=)1>JZUfo-KPQP0F?98c-#7sy^p_GDFI*(8-S4<%T8Wc~D z5t59j8{YeV8ARA(%{-z*qv=4UohqT6!?lMCsG{pM_Ni&Y`mC*RSVM&opsWx+@nj@yxuKKTI48#xO3XdJ+Q&#w7;O&Qe=>JyKzY=f0oN+WrCMQIg6- zfkHsr$*9$mT3aN2(p+Y%i36ZF0b2hRAm36X{hn`ux2lonsGK6*z9xYNTRM=WV^K&e zK0jUmQZ_B>^Ae==9bZD#n_)|3uaxD(2ZB!oSj|irD4{C6)518M#etJDAT`1 zfy&Q77x_H=Y)@UOBh=iHbUIzFC0}X<)l6OvO;97N?Ni3zAKFj0RZ=afdx7C$6c1Ap z(s>G1bkO-h_p|}(MU7cru)ButEmd?`+WA0vSQyex>PgM6MqXdDSBkGO}C^3c(vy@_0 z!(!(}IclDmu4AnW`LD=m;%HUHd{a4)P#sy0GXYxMN^Z%e;pBrl`Z30juifqh47`1| z_zSwlAA4F;QN+_ilD4BOn!OOGTQ;h-xslQW^|37;L*FQNqwJxhZ*Pc53{9*2-=&9o?*ZfYe*|K(>8ojZqP-$J$bMohjc(Hl$}MN!xRXy0o8l zI%NoD?f3P`Jw3HN|07aurl9)&e5y_uk;QWa8Ikg0l`qOF!e-UvHo$vR=s$4s!NVE? z$q{K;w9|Z1`X`?RG%0E@_wH3feoHA~dUWC=RccDBu%yoP(t4J5o*pGpUaB>(cc%RQ$t?PA!8S{rIO-pMQB- zEwNHjsrIH@!Ce$y$SG6VrgaTBGeo42~TX-vPn6L zaqht3(!?v za!cdmkuo*96atJ-aD7Gb@k4R-%gNdIqq8F4J}dTFKVy>`swoMu z>!6=p-2dS&1jw?aHL#mRig+ZRDjVldF)%0K?Ng{`1aZHt`clQ2kotl@^EdlHHhum+ z7@Ib?-G!Ph6I2^i$UA|T9{cq9`+#4eoDr7`YqbM(d-D%^DTq}H;Y^M-WG4#Q1l6Te z7$()JQ9iW?hid43+_ZAjtt48Lu79}BdfrjtHWVpL5M%GR3iN|TRQ;ry)*pU#cbpaJF_3cR4H&vW30;p-+Tcyf&`>{Yqxxu^LMU{H`{;g1ZUi1AM z3NP6pHGO;ot318JYTbg>P5SwS_3IF;(e61sU9av2Yd1IT1J&4A+b|@6#ET~{3YUQT zuF%d6MP&_cjxyMO_hDreQF{~75h^3qNE`3+EMAc)4%@roLf zOnCo$V_#$65>yc7e2+cJK>Om-lB1VG9W%WIeo-WCc(g*Bc~;5lE+@L>fEl_JkEdN*IJ?WPXj|Gm0?>fbf7lShQO!P`@q? zvc&ycwo9G#h!^_8edkh&rg0UR>1c(aO6fvzS@Ej1hC_uyEnoxa7YDkE1YlU30M^}^8p)Lh3;IcvRoa-Z zZrAo9K60kABc)4wHRS@j@cSUJORVCuh)M(2#R#u@Ysl zVyPL_vat22>LFcXG=!m~snE0F&sB;`ttjg&GEdgkR`ppvcN;!`>apiaaM=e8(+8if zRws%@mBpe4^7ySIJ#4b}Bka>=kH}gO1Sn6VD%WT(|-l)1EV0Bx`;AhuPtK1 zg1S^f?Xrgcsdeo)iMB32q)eODNfE0^sFRsuQC0B-7#ggu<7^TB2oD#oHM#-d1nc5z zRTrn1t5r;cfOV`P#b_>2F|DTvpwBgc?5TCuk=}Bhij)KfL@S*xzQ1N#ZzEJ9FI13z zKu610n(QZ{mD!g>0w|aOMl+TTzBSU7@c|%ZYImt&oE`wr$)EW*>91bV9+GKUU;PPB z8oSH_q{P}mmAH3>MIrbc6bIyHO0m0NcsgLMFr1Ja?N)EJvcOkt4PP` z>iE}Gip)Y@C4a&cv0!$Y^A@BmI5s*=^{Qi_OYd^(0yX&kNYzqXaTr=lPipUN5d%tl zakgC3EKYw6v;F|+_(&xfM8I^XrH}<{%I&j&l;>5T1ey~_0s^xsPNLCa#7hQ*YKW?Hh` zdll#R#hYKZNKJ~cceKuyt8!&UW4_WrM!QhfkX-0HeSJiKZUgDp9a3?(hOhl_vqM#x zawSbzbb>+_E3xn+>pkD4iWz7moSq!Xs_Xf+8&UPk18eOgY!K4?6E@J?iY@D^g}^s@ z?^25vu=QGXd`O}U&Y8Ui6O4;}qU&$j9i=HuX>!fC3Ce^L4qX z%Vny9o95M87FA7cNi}yU!wVXK@%kLq%iFdcQNvty=Ta7x{^N^BfA#&bO?4~ObC#q= zwH2uy^izGhR$(*Xw}Ez~>@P$U()6hfJ@oo-gnX>xc5;YP4*t4%MIG3Y&elH9uVJxLbC zW2=wz^&j+raIzc`?V$oF#0vJ}PTOU#58nd&GCa}I4}VdlbjtrFvMTh}e8;zKF}Uvh z=%H9&;L8(nD*N_zZLs_DWpK)dJHRTv#1sjvkQ&!2tp^z}aBM{} z3IM2TDXJNrla;S8;x3Po|JQ=`Yr*=ae)YFuc#hB5v|?+ox?evI)c_Ya;Mn*5sgQ8)TOb>RRayE^FvSW7 z=KIl2mI@7^FaQ2)e_3K!%+Kx9;cd`5#R3f*A0|I9sQ0f!RO-|d z%RE&rbpp~)g*{aXb$n&*NvwY_a+%4&3f+J{6t!zDSsdGWl@qRpOY3s`o8Mm)UWE?R zfe;8PVwVKfF2yS^Cn2jk)Zl~n(GinzankAMKZZ3Wq-zxeCs!3Y$}X_ITI5^G=DphZ z5cKyCK%b%kjiQF_?WufwE?hezh9{)xq_EFlaKqiyxT*q$Pko3J%_?qZ2B*27DBchY0(Yve(VQVfs*-C z7KR#3{P_hS7fOJm%8+w#D|fq4vj>c6g8FywDzS*|!uku13$9@(wWW68SZ7Vo7Wl$- zlrtrWX93f2NI&_PoIU=T4ghOHs8|Z4ix@jyS<9QMRhHapN4g_qkX?XJKdD3pPy)lY zU5ZyYaitJhC)NV0?p2sjT**@PD~|Qg%rvLbFjx~h+^XDBov_ZyfFKn^-!)-%PB@n? zE7{X^{~Oo+FyH?!o+AUy3=0p*4e-GW!39~UYoTZT~chS45k~PfciB;{r)7gy6ku(aaaBD^e*3r{=GqTPs@!2 z8=@NtW`O9P=u0-BDJv{p?yw%ODFHnqEREOdVli;L`QLX%{XCS(Qmu0ZQbR zf@2%+D7G=&^D9cDYH2sNDzya^aX}mj?yj)%`yT`MU@re`Q6F+FT5{@y79#=3smoeL zg2xk;QOBZ=_4AUpf8VE*^v<3t%KWcGFyRNa3h-=I$`&0sfqb)C&a(xn4Xm3g&;#q5 zQ6v^xymw_bQBA9G1;9re!VoE5%w)0TEY39Lh3&eUca42at_7%`v z+J8(Jq>HnbV!(uH zq#6;<%NXaRT0p}%pwp%cI$$BWO^lE(?SOMwbGnKxVSZ>`g?UiqDguom8TeM^GDd>* zcJl1vF-#B_!w?QP>gj=iMIIE@3YYHG1jQ{-{bliera!cxoU~v%ISlri)uG>S;XU~0 zAz1sa-bavWdo{dLn;2n9&Otse5I?^t3i%o{suVoqpYMzne@;iK7q@GS7E!+N@hQfq z{zZhh&_BIBr6>07s(z2_7-XUK1R2fr?yNjXWFh#gWymAc4Qn+Cd(OnZtoxxyj&h1j zPYJje_R@gXJiqmCh6{c4?40y+SDv);QX&CKfiwgvI3caj zCe{fyNEKC-6K%3kq+PPmaO=(8;GFgCff7{oaRU|22gl>2E{rldBi7FYtSPATBCESa zWJrsOx?j?~cuw?nrKJZCtsdg8eaMqYo6D;+->-Rj_Xbl1O{_m)Ph)7>8#1+U{qjZ3 z1Wz@$Jnv?d(+AYgufx@Sr$*_MjMm0?WXUPnPnSn}I~A%YA%rF|jr)qZ?>)^V^sADY zE1El6(KA$E)Foh!MHBs%$`NjW7f5`t5`|DiC=IP5vk#S?_pS+Q-1vdm)aT#1^kX}{ zZ?V%z8y0Mjf}H5eE`%iQ_bSfMmM&C0+lkKR?#S+RuN_)E#9 zi8;PER5g(>d@WhjuBb(sj>6_T(z{yJ*yRs0zqG+d5gt(~BK|~2qN)>y{$BvBN9;GB*|B&2GMCk=SMRb7$biA<-g zBZaDVx|_P5>6BH-v{p3vy@E*F2Q+v^xlxN)P~}*#j0s$x-#844@2sCE@8y{dQL9Bc_l77O(h)cRG` zqD}o>fs%$^gcU_9;ESlrDQcM4fgXH*J4?QtA4?t0Ng?*rY3S({P>c5;{)8RbzEzMO z?NoHqwzO$Xv+xtRUEX8vgYVT0btI*wKaMX|9qR{LE0@fU7)CXve$VoKy=y}omsS&X zD&Tj#dgA4(AOVe%2E>>8)c@&8>M?`XC`NQpDB)|XimP>GsyD3c1(S00kL8An@kbn= zk)3S1JW9zmU?o?pCI9zVk=}*s=l@Lc%1cZ!5NIchNJ%_o(uyX|uYod6PhQ%gK+5kc z6f4L}yACwP*0+>UzyPY5M(vw&Z0HpB)b1@0R^Z_(X(@R_Az%&Y(~~hzPd9l@v1&@G zUpi~tbOmgOtEx29wtFm3i_!(|00h%4v@Rup{phUmIm&(=VU@RM>HbiiKSkN;+fM>u zdnNv<7cqv`VNX_>#L69pDfRBx7Zj|hrmtTgQaOL3#z8u8{XzH+C2bNLKrg4?k7hLu zSjDRr{UFRppEDuUJRp2q4ge!<$SA@4wHQuK_vbQ5uSr!IT%;OO7FsV5U*;-?e~WKX zKR}y9k2j>`3O&9euL@o9{cWzWwE*?$Hi>Q;`3OJ${^QjTkxE0ObVVhwP*l#PX!Lig zFuyM$<@(F8M+3#9HCD~0S_%{NqL`;Ew10&jt*WX>Q?4SS{(VD5Uk~EvXG%>IpBSP; z3Sf#nrI4rc9JbmLU2&e7Ug{jB}qt6AaOppTA81^>p-WP}3vzJF=4X zPc4e&LPfAy^*0^;l89btlzBJ1KE2;2rjkoMCkQ(A!ynUY)D z4R8Klt9q$spDqYbwuMfoyCZD}QSj0OpZ5@IocCw}JMyU7Woo)+{XgopfKOwK8zC@7 z9caT*Yq|w$ApO6X?d$rnH59qx?)kZd5XcGwUFmd%bu1KAg;Z(24rC_$9m4#`+_e5U zba_NnPvbdAP`yUw3MOk(FtE$2;!j-@Qt#3~B&i=q%4eTV07g;8`8sIpP3{8q9O&4d z%)kAv|G4~9|53Il^Noao>9oY1qe9Pod5#};x{=VX@V;fW@OPUx(zIY>fC5jA*gwFL zq0*F3nP~@3H!t|8LXDJqe;vMX74eq9W1M+t!yotOu8Jnxa#Bq9rPNu&N71jK`q@EA z2SlY|59&9ET38X~!81X8jx71E-`Bk*`{3?rz z*?C{y>3aU1LR@wIecLvrnVi1WZoLQHzO=3~?H9qXB0lGx`+d5*v}{)@`bil>VD9O0 zt@brq79HBYY-y6_-j5}FB5y(OWsj07!Ql`iJaL^5A_?N&A{q$qo5_f-i46Q5-MMm(d~Q38aRN(1J9c*3TTZ-aYa@ zoBkK{2G%J-^D z)t_c|WpNTn)1(L$#cJ-QqEZ~XSk#HENhvPXd*EX-slMh|$>kEIi9L`1&gcE8P^Tpg zX%BS0D~JlJkk1sxO~TZb8w(=3ex8u?`o2kJc2lao9Wb6N6s5_c&aiw+39e3~Ns=%- z6d$hVeu5H;e&yLvU~(uz*Ed171-C{CwXXW+YqhqdAD28QIm`t~S8M$>$x>$lU4hvy z$P*S8MM{+UzZ(@wnie+3^7z*r)oi0PL4b5(dXx=6Q$_A?y39hXF6ngsb^3=&6>jUw zI=!e_Kv`l6T{xLeRv8Qmepeaj=aKQ>@q&Io@>VI^=1+()P*FH2_^C=Ui(7CC>QYwL zb2TizC!yy~U;kr#Ees7y!1sxN{-Q!H{b>Bx02N>TKT~M+ANF&jo8D$vHMY@Eny{Ff z6RTBS2Ii=sl8dP)R(1QKO8+Ge3DY|fphd1v%c{v(d3RZ}eyX}u_bIL_AJ^YL9y_SW zR?i=JzM`!Tdv|_Q6<9S@|GFlu@X)(WxcZiKU$qdXkqat{t6j(DdX?n5go4yl(xO&B zKN1(8Qd0~@x#?iJ;pdlCegSeJjSSU_*Gd*u6y>wlQv=%czh(o{mJk=pg8K_tA@>X6 zjI?8w;`4naRvj_{p!)r5F(6)tJFbFlBY-%N`!$H(=_YmyP&t+Ro-bYcrw(xrsn;*+ zL<{ya#&j{BQcz3>AJYepUV)+#kYKX=U#Kjd)38r>gQ?{&j-=G&j@JX3QgwpdiD9J1 zw`q~9lCTHllaAMPV${5*cR$Cfaq~=_=BbWJRSE-APz|1PiPiC3)p{nSI79tfEotV| zX#ML||29Jm?=SrTA@QN7ww2dYy0z_0F%5T$t>Mlb03xSG*|!*(QnGvj!epbg|M90_ zRmb=okGemP9REp&M3VKl?p@&Zpi-F@ePJl3R5ri|IerXr{wLd%GL}8nt zK|G(VW^o6Ha+L~c6Lgx#fQ91gc&t#ktRu~j|ND9V-@(MfB%uZmJ!5fYaj5z(uEPK6 z%EzBbm8zToIj*d&zrWobn}--hz{@JRwu^#--cqf|I#lX%yrN`bNF{(%8$h^rn_^@E z9@ILy!s^Rc03wQ&MI|i?dM~(Yr}lNZ{rk;_;P|4F+o?)ssW_dI z7T)VsqXf~IsyH=@P*q@(xJ#V$zK7coS9O(`uP=AnmuS`^=^#$-`!VcW&@Q$#^ipLv z?Hbqyk;l_2WK+98JyTG7SA4c#=^|Kl9k--7URB)wgemlUFV?AGb^QLLGo`a7rCyCX zMEv{XKCPex;p#F4)RDuCKgg;V2bFA6AM#M0|nhN|Ix#L(vSF` z|6Kp``k(Nh5Ow-B{dm#oPcMV`&nl{R)j{;!4wT^32pU%`I@k%Sb5lRi2tjsl$IJTp zG3ve4<-JD1pS~rwd-vx%CeYb9aP+58S>;cs+taQ0 z?EJ1i0&zVB;QL2aQ?fA)MF1UBDOaW|O2Fx_Je0`l=c*z``$$Md2+olfaddE5dAJS~`}0%VRMN8aRJiQE^fS+k=< z6#dwrR5Hb+>0iSXKa}Niu4oA7o_`JJ#yiS(?u{nt*23eh(;nR2mn~^1mQ-fd;VMqN zQFL{_+n}$p$VZwOiqo;uyZtmsJ&Y>Zs^onnz-+%ly1--Hvx@is zf}(%kubN1T3O292>{E&pP|&a3<+EX3F@@$|4#WP_L4PLGfmRDM;(Q0}VfCY|XA4$5 z`R27R$~^IB?^Py#L4BBlRX7mvS73#eCK7xT*4xsccx!X}5)YYtFY8(i)6)fxg zmb!!Uo091(A4uF3RytJn6}xh&g&{G6s@NDM-qlfoj{VpIn(nOs!KZ%}8RYX7VavCO7bR5^|DgE#vj+Dv zy;sAOy!1aVsg69wv{pUF1-U$be0>}O{h&dhXUa|NIa%MGng6lyhl?NPLm2ntZQo*;7IQU3QK+pa z-BaIw&sWgeZON3Y4 zFhh6hVwTHFb|a&5M*6*tG-1^lk{Z-C{Up+Lnl|kun=J7^df6sa91PgqdlE9FMXW;H z&rV!wOZo-(bOU{Y|4D}l*S>J>>LR04ZrlN`QH9#VgGi@)z!gZ#T9D0x`E{UKFWcb; z5Fw|jVTuFPw6dq7s=TJC0FeuY5f;7m;#3v&6=}0&UY4jig8Gr}fTt%ncqobzDHX&& zH``JU&+0D4*40wr+CQBGLdIi}BuvJ(k0CS7% z{ih|xtC~@MktZdPeSH-u@%~@KEroyAYj+*&@YWr$KPN-VDOT0vnd&wuHB@17S@8+d zADmF7i74vwF-$o$Y}VtdgU@V-wi3{2%{_m-gPeDwQ>h+n}mK znr@?4eacIF9IHw1DrhQQI$E+=Q+=^^wWe89_Yh_}R_0$ytgkOqdhLE%2immEVQX64 zRmNs#zbepNvhsNK^9W@E>Pj_@JE0P5TkMlPnWcHs{wdbf-G6-Osn&4j3TupKjMQaQ z&#LgtSyohb#frK~>EjqB`6Yf)Rm*u!eOZWGvMD_oGlp|?#l z7PXblwDqv7tM%x*-rMIct6FfuVNgp&;VMp~11TRq`1+?E>UZ2z8Pwu6&}xEO0s2LX zI!7=cx@5P!Uic0u3Yb=pwp4YnUzdEUCbgB=$60q}*sHauN3`qrRyMo6c1pFOD7W`FK?v%?J(BipreyU#8aE_^q-Co%7e{fn7;@+3GK)UpWrRLc%!;YWj!g$B6iRp zH`9TjvO80QhONtAK4eSCuay2g9qRY@rJvYV&3_dI5wO||v8(6#z{kT_1#?`UHuD!79q>7 zC@A96O{%+f%oiR0jib}jUTS-O2j5HYGpI$h?dh=DOT*$`Vpus_{d`q7O+pw}b+@cy zl;1ht2bbF5?ZYM^h4TvAw#ME=HJ9ps#Tn}d*H1D*TTOWPR~#*tRkdZl6~?B=%$9({O7%>Ky1#mZD_@CEk*{F-&|@kEZkYi43Zq;zc0eGr)zs< zPoJwhzc}{&?fo6AR1?yuoQ)lA*m1|cMn-Oq52)^M*n})=S{PcvGvqa^+8u$M8t`$? zsQ%Gz@s{d3gX%b2C``nb3FgNpO#FK3d;7=wKg09?#OFB=vc&g;a5?F8&FXtSw<;}n>{%AxmJlb~sRdgspQ&`_YCsVUC{Nn8{gy(|b`it1u$s6` z9LLFZ;uNtOXiY09@%4irJJ)|v6?jV|oTDwenncD0x3P*9_y5!UQu+R`)L%E`7ni+S zu$uB-#Y{=QzH<<(!W*Qe_y%8}tB!@g*k!boP9 z`^F1K(XBA+>r(7yS;q-4ZL>hED*(>Z%lkT?v!59!tCE2{DJEj#^p zpZ)H`Ym1}gbULT*c6D8F*I!pX8*=siuyeLnLQJyw@^A~p{J5t($`x)VBg{$PK(CQ* zu4Q_hf_#rAMS)MZ!8}-F{a1Z(!|%w-tOO#YXsU{d0vBEaAHpyuF% ze%>upmM6?5UXoaJK00Ptd3;r>vRADwfggerkI2Hg0J;6>;#V8cDttEyx+Rcd*8+Q zespGpZqoH+Z=PXsMCPFSOUrZO#x_WpW>G`;`asLMxTPnB7nuTIiMgqce{e#ob{6wK zhPbeRJj!@|9bSgp)PJT{>ES|_`IuWu-7u8{cxo@clKPh|ir5`TX|FsJH$} z+(J|;xF}pOrgJx?Onkc<@nkli+trSf>)6$#51BH(bVZY32fqQ2j>Ysj`TH_IcC)k8 z(`&@c%Tq|tUEo8nJ9&ZF$*$Kbf;__JCqtXeBW((_hEYdYqw`7@f;ak`c^0DSWQZbu z+0bMwu`WtdV-6!O^;jz(lDH(Un1X#EbCGwUYx?ei#K#Tfg!a{oF{fT;KO- z>f_}8n+^s8ICVA-!-!SY$}Jm|CWtWiWbQ$3ZO@%cn^w`zgkg<f6TD?G4~fK{r~TV@HUt? zlV3PN;j1?k#D=_l4GR0KRid~xg$lMOuWD1g9AR0ckP9WtdH9@vKOz1kkm29-?7BSf z=Ugs3&cARTRggOX*uxR{ZVK}{eIBlpr614sD$*}EtL^mTDyQEa?WVA|o6udRDMV7D z_{o=yF$H+(i~UX?O^9^AjT?wryR>{sSzKY#52gY%i11e+sMn&V~I^uj$orO@jr=hUtU zU8O6AU!-$=3WrGveZ7$PC_gq2P9|X;O3MCz>3;n_L@74{>}`!Hc6>ae5<_rmYz^&H zvGczCn%HeGqgm@2D)IE;$4Fc8yy;%Njm555-UTX2B6hoe!V^rQjNShI_uuy{(;06m zT-Y#~-;{4#)tA=R@+)cSWl>X@wkS*ID4V3Ew|fN((2t9Hd3hNd?`XgenMeG(--egl SRm?V3JD! literal 0 HcmV?d00001 diff --git a/tests/pysam_data/ex1.vcf.gz b/tests/pysam_data/ex1.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..64a453d396c4b1f0d9aec0f7607f85d9925d0122 GIT binary patch literal 16982 zcmV(vKn^W@2siGTT*Uv55J z|8jT#@#^!lzieOp-LK3){R@Bb`>W5_&#VD>3g#&Qe)Zw*%l+HyXBQu?KL7UV%fo;C z<@)~N=I-`C%nDWk|Nf`*7q6fF@1MSZ_RE*sx8I$A`S|no{WJJ(|J$eQXKy~=-`u|c z?)&S9xA!-nKI6AN`{x(D8yVS0AtEZ*u+L_|d=dlm39O#Sij}e&Ex) zUrs;&dVTu$tNWX)+t2g&-E7|edUgB$`WxPM^YP~P?sW6^=H01$&-|U<-rYX<_zmy# z=k1&AsgI`*pRV8DTtA%BH(uZW{fa;9!`r+2M{oRa{r=sTPmkXC#fQ7A&x7~H7k|9I z{d|hw@!{s};(LNI=Ka^-l3qqnH9~Ey!qwx*FVpjpI+=o%lY)le*K#-?mql>@$2=i9lpb_zkRs-1|wha z>qhVJ@yqA^*T4VOm(TK0_E!&hWJYiF^70$r2VXS$-WQkkTg~FP{_ybm1|7)tyVFm1 zpT2yMkF)SlFE9S`^*4NV{SFV-DISlTk6%8X{(SXtefnQtu0Gs+{_PZ<6@LM@&;8w( z+jrwr_)S0N^7`-S!mdvrKHp#A8-05E_p1+I9<6`BeQbcA&@;WizMsF<{_ZonvHSTO zzP-c$yn26qdi5Fo#m&R%hr7359_H`=^pry8G}EpYQ#b+tUx%x9>my z`pEA*|CS|h=*V3^{rTqVp{{pzy1&K;c>A7B`{C{%)uQe5KeEX0Fvu;xko@KS_0>D} zOrNjtsp1b~gAAYD#l_dxadAhR{RThqr~A8~uYSJaz43=nzux06e0Y2H;riVZ{1Mgg zbw%jR?yukDR(Qk3Ie6 z>gL0PnpIo@0zN!WkH7!w==WcBu4MfEKVQAOq$Q8v<>AYxPj~keHSTUd{C4{DZ)%@^ z;2vi;R6V|I{kI?P@DY8!JJ|H!ozm{Oy~D5EUq293L2Lhfhi@V)d{{mHT)%z-^JwpW zxVrsMdgATK=`MIU{Z(A=Zy#l^i0h>jiM|J&$yHnT>&sW0J-`3%Wqp#X#l1mi9AWe| zuJrxW4>$jbKxp zkAGIftWIB(J+D47Ui%@rxk9Y+0_5_pZPIF7y`}PPru^BcsG5P$8R$oz+>U; z{2(mgb|&-JXN!l0xAnu-$4?)w4?gQ-Z#4WN&BD5maGyM!UTA=*IA>;o_3q_*_owx= zhSjnu{_yA9ch|q%+~T`^zIy+J-;DOm&3nP_zuv=lvR9s2Uu-bZ!r^P|^cn}Hxa1CB z&;SD)n)V_Wg7e7_J`h0nB4c8J!RoqLm+t}d1m4OAInY$Plddnf4qGC>g3|}o0Ffu zKe_zj#mVO7{^U=8-n={!?|nkS@!wwKheTYzz6WToUBgvC)*P+?&M4|W-fW+3x4YdQf9?36-DbDLubl0-&%DKdzrc6J%;A{}XZy=% z)|?S_@a*RH^F0v>XGBRn+w3>ryUm#-y7_-Q`tIYy1&w>pR00gNECo zHPfQq3ckUi-CS=s$99Wkx1?svt5n!*WmPhNJDF`@wI#Db`MqXy&1}WH;-gu%8h#@g z#U}ieYBuw)(3uVJ{Q~~(5qROL=)z+$7A>nMEtsWs+f^~Mbw^sa)pdK`FlIVw!N|Jf3U>jm z8+WR&JBIekcC*{=@z-v@-){GH-T35b-RRF{;h7fh^WnmsODh|3Ngh9#{qAXmyb5k@ zP7hb!ewR@1$ zg3mmwlVRK0`pj{`o6U|N{f17@hSqMaleGuSYfnIHcja*HHro}(nWwmCd1Wb@736iW z_+)jj^b$D~DM$R4b;3gdp{*V=;s#v(7FTc0;-kkcPai)V+47lJ&s!efsQTC} zJ{Es;sE>ZnJDt|NrN@u^0H42XdC$w|9e~f=iMtqV`Mkn~;loV0yo`P7oJRZG1%e4-OA{r<`3@B%YmCO+#Wu6*DoBMGRRrSA066r z-)v~RZ)n~0;L!jZe(s2Gc;ODzQS!>s0kEUIeS3Mn5ij}b%^ohwnNY|W&h6>>)yL~+ zAMV~gLp0iX&oX(>)VwEvOJG8ZhZaScvO)y(G=#FsrByH(P(VzJ|xy*L;Y*kC!i+=n6VO9+O)vO^pJVn+I_9=QMA7}>#wrawo7}2P> z88P&Wi^4#k(eNH4J%X^O2n$wT{4+q?tpR_5*N7f^o7z>d&8BVzX4y$Wv#DqItYL{B zYIRY*ZdEkkmOb;1%u0c2F9AJ>MM0vHD`e4dxN^W4N72S%l*KdZ{Hmbe4QprBITb`h zxP@>R&`!dmT+nNy@0Jx?TryajIVA1rscs2TY)@jG9n>sw^aTeOgBt>O`)uvLt(hGY z1z=n=AQ*^s&AEnRKAIajm>Y7=xS#gom&7e6Ii2{ew2cOfPUx5LSpq)hkSNw-Kw1aC zPIhw15*Pm;pM&I1dw!u!!@b1cJ%No^8y?I5p$yIYRtp#Wgk0#^-1w@oi6sNd70GUe1vf z*Tjw~kBz&1{jzMV8Z)Ef*^A;KoxQ~Ns@pQGN+O>x zXBG%Wq0J!He8Of-WEm#xH+Ud1!B{q#3x^&kPNz^Hu@7xS7KMhKi|~d-YhgC9W3R*i zBkw~t%Zdym+bl{pF*t{~K+K(=ddyJhw4oEmGwAc$IoTf>u@deKTz2yG_hpqVpF&?z zq4yahVkwFbmLV~jazNv!qf{iPF2z4>8l?eprCoHvtGLYGwC5bn~JuLpdz{xI?6V};-t-AzG9gQ>d5 zxGk1Ln3Ophu(Jn4*hRroHCznAqZ6##Y|(DG@O+r6gYDhDC&LBaX6o+oxEFQzaZ1(q z;*aE?&Lep}U0J~r8Lo_7(#zM|L}XJDAB1VMb5Bk$F8{cBu5Kw=2<}O@6T2KfMjK&} z$O6W5+JeC75;r8eAu?ypW6?3CC@DN|L`&deT>xEKwP$wThv;=9IzIyou{5BB@t4ls zQB?1nhsTXc_Ouvh!U1a7Oa8iN2Tuo=!YF%qP^c7b4;uzx$kP*Av{a{5z4N|#%UQFPp*gaICKKEYD%u#s%-;I{D=`7l82^M z(--&zN%{)%yotZTe;=+og_W^P$VA%CB@xAkiI$DBXiOFiqeu3;n9Q0rCJj(GdBBZ@ z>3-B~;BoF6eOt1Zd@GH2xt(B4oaL@)WAz%jO!)xiRD0$s_-VHk%Sd!0mWx(hT%TiI z|MwJ~e!M)tJZti-XSe8kf5U(M_VMn^!|9vzznoQx)wA*~?4%kC2No zBRr2do;?z}Zo-*(2%=ph)+~);iK|2qgCP~Z!VshoA8&knUN+-b664L?iOb9Mnt|nv zn9rr-=N08-W;vO$f_j88p$8Kf8wp5J=0<;%T*f7%UP+#pHOw)U0n3t|FpC)hlyP(l z(I;b)MkG_Jyeh7fQ#>%VpXsb-bYF<42vQY0w?S4Lgt%-2dxTm&utA8GXNu*(1|t)Q z4Py1o>FYL#OtWW#_rxhBT(4V4F@g9fgjI;N$OMU?5t#rmz!c)7a0~S&@G*X!YjcPb za1DNZY#j$DcF=KlZZX_Ps|kp8jcj9YMF*GiXQkWNSt(9}tWH{xWf`1<0t9W)6~!p@ zI-aCemc$jKu$ZCH86dA_8Aw91=tl%rTT_u@L}y(>3>u*A;#oKVioUl&YTlZOW-BLw zesU#SUBij|)M*>=R@e#hVFRQNC;GG$qLQTY7zvoDAi{!jCkwJ{=Q%PV$m8F#C2!pk z87@Yjf^P)#;?6Jf)L|TzC6nN%?uB5MosWSLPsQUZ7NzhTP9P*MbB51MhLI5Elwal$ zHOQ_p6laW=xNeJ?nWHQkZOT;zFYERt^K-^5iC-AV`j{4&buhD~Ga#XdeXI~w!XcM2 zd)UBPl`301})tt&l zH|11drlbljUo!!lTuR_HV0W>)WLI#Da;(Pl^~2Mkk-Fgj^1wrRU}oB9Nwx5S7`sOB zP+3-sUYm|Fa85)u5lSWbkvTtmWVV*UjyPxx3H~tYpW&)9Ij33+$<;mQl`m7A#z(Z# z`j-^M1VKk7--0@4eq`wz9@#fNuVlCQye_Q2`1Q7A1T8XKskjkt1Y%Oqd#E8yrc4iVUO6h(qQwwR zWdamz26Gau#~ov9^&Z?J)n*^>!kOa;t$gpqafG@HjaQJ+p~a1qp9LdOPO}$uuNc8f zkOW2ugJ=;kW8vBbu0|vY26H$>KT(cfCZ-ve#7u?hN#n2C8V`7!xvx z6|O&ffmY2yGNqchJF5gzv=cnsaj2l*sBA>gh>?+%7-=O&+Jy>-S5`-sgw_P5poRMZ z&eL(910iTfTt>HIfG!~EQk!zqOv&Ku|6Ock^;v1{Nli7%r%QYma;I!cbX zYusufkZX6Efmn;Umku2Q653>38CTct)Yzm#3#n$zt_LEj#i$80W3YuPH}n4BrXs&{ z6@$feP~_+0nP@x6yHkmBuL6fk6S%I(KT>wkV|2nC61a?9>(}g3Ju8u6kx2q_Ji!x% zwvK77nHQXRS0E?jIPGA@j}jt6#3wG!>=2<9y+JUEe~d+IQAt*>xfcfR%YN4~$GDUA z?pV_zzZi2DsmDt0X_o3}o=6`;)&#Qfp~Q7&_$A0wd6U4rHL-wEXjK>MnlWpO8LTRK z{9=|-R@odLu6Yf5qQZP`I-YW{WMZPJQnA|zBTe{w-;qMT^CmFJGm2d$3>moHW6?mF zX`4?1CMl%?RaR-)2*1%Rwq_c<>YM`eLX=}KuR1<n6 zvFTW4;V$_66liI?JM`7GkC;{#l?eYMb`@uxWIuuD3Va+O!`GMj&u~ir{ziDn4m%)J zMu)w#Arqv3nd8e&v{*2EAK~wSA)i8jh-MWyEM~*1oWvZq5Cmv`GIcJB#eGRtiUtmv zv3<>Z`BH^BMD0!-0n;Q~Mm`iEX;aU3afn|NWP$J= zBy~vWiZc{~c3kn%N}5lqNAd!P(61vKT@tIV}*{&e)YFvcTZmdxH14(6z%1 zO!1#{EY%{|&&;;N&rUR=uTLFgA!bn}NWpb?EcwE$f9|t$2Z+3xmk=8_=4$e#CKLq7 zPn!!D42I~Gi4d*y%7@sM5a&t2o9(%K-T+Oqozlu@bRdJ!#-+l@aXkX3Nq((FB6qh;epOq@~@Bzt6qU9EJu_aZ5K(z5G+&eDG^UeR`&)-48j{N6g9jp z#bnWYkV1y`z_AmFKW)C_QbUVi8eDAUrB;>h;S;+a3UiE2S%EcA#{7gBVJLpszuIr1 zlMOk8Kzm%Trxb$NYyys$oNI0ln6m}Jm5v0pD^BOoE=kSe0CS7PpyU_}YaLtB|qMGXy9l zQ{{LpO1!8?&}c}K+{uqN1ZJ!8`S1w2j3{pq!|^0@y$@Vr>Ni9Lhq4K>9w5lLFPKOa zaEWeymC=Kzs;0LmF?h^pW3BfcPb%~drHiRnVIKKl~Co^TEoUzRsd6# zLUa#4XS7qE>pCNJI$<-fhN;l8Dqc*7?wqf*xRw;0<|y0g|N2WxV7+Z5&JVZJ=KPOu z;Q5FHa-y4~K!*!l8Rmde)l2iy!#HTTQ74jifg@b?D2R<+%E1aV!2;%uc)>^8#s^tryP2T5}9|AoA74N#aQ(XPGMY<5`%38(47bZb}IeabtqTSeHoK6sv9M|iZO%) zZa@MzVY5XSP&lSi(V4W)Sr6)v3U2KO56lYDLwzAjS$!kCeJ-S(+x0unzkN zse86xCF0dFMkO_z8sQ z91#+_e8UQ4i~%VV)^uL&TF`F>W0VKXl2S}U?<{K_cN{wK%-6^BjmqpA17l2{GM;38Xe+R|@$fPE&brG9H6YDv6 zP=A<3=ZVNc7i|>49fzpLu?ouj%Krp@jSq#3LqMIGxcHb`?&VLS_a){edXeo( zIl_NEQpmW2Jm0ilpAu_3BGf_{v^<|7$DSqU+?7XoTfAoO6f(l!4&l+8zn%Xu6^u*Y zyb)t^i_Hkc-(!A~xK^x9W_VueFG9j z+Ok_kJb-4Paq2GMfV$(HN}CJinTOQNh=lxtQQ;C3Ys+E?D~c05dwAA8so@k!AjI(8 zzASwL-gB=%SF&Wk2a2ZIrO-P678x*v0|N$ZmP$G|H3;|`0L)=3xe=wDz^AP!B?Ks| zj0l|c=UQI88&H2>rJ6;lfK`PQ0AeKke-(B|?J5bZ8Hx0JTxawH(AMsKv>~b|TyBmy z@PxCq`#IyOy%7nwdDf-7jt~~%oNDJbeBL<{Xdvi>-3#4XkKx42*W2i$DN)b*B(Rw5AQbIf4)DpimKe?>4PEg&HHhI~2G`vy(KXtKwD(>a(szm6N2wnq}4k zSQai}B=nwg!`f6LXDzdYkb2&v4w&m|qe&sTDsHih-OB}o%QCy{Csj2_8KTq_$%7Ir zp+R64c@U+%XDG~U(!TTMniP7W7zPSKOp8EjE{^+U(EW0O7%FF|aylr&LpYYVL{~Lj zf%qin4Ru{e6gyUkNMGwA2@@2OTsUJc+P}`RVH5{r(kZcyHqnQvRa2uRURA5(KY3)1_eKU8`WhzU!-0WvD zpLMOLIW8U(MMU-po?`nsNg!G)cgP2|)D2UPJ4vs3?un+>scv)fhYu#Sx3>ES=qw7Q| za2?M*N>^8fp%Zs=k?c(73Ms{n9*Hp(FtVo_N2GyDI#MW-e#O{0l&_2e{&<(sNS&U) zP{xY1SyjH0r#`RER?5cAVQ8kx0YCN5_-Mf2LcF{GCDmOP6HT#r_0whW`LEj1oC8ez z4DnJ2uY8(nXUTPezSt7Wh$Ryi%m}zLhAPpX)WOP<$+#Ghv^mMp7y<%nV~bftirVVC znF~38M@wPXR1`Z!r*FN!n3KuWC*cC5cWR?j>Futjg;Gb*L1kG~og+bBkyg6Q5=W2A z0#9=UQfv05$rH5oq;eE6C^-CUjD5Z?JV(fw7S;yu#f9g`eCSMyXB!m&zFT-~?Y_G3 ziYGbRtE`iosYEs%W+X_G!3?80Wx{3wyJ(uQkR$qKLOAM198W4KNm{P(v1doiR`MsF zIP}}b*`lei^)n{|y@2`KT({7`zK&P$hcqzdYf>tsM@^+uts426=avfL;*6`!-Qm#b@Pn4jjrkhRhB^WsP`mFb=9+`gY*j}uyN~rCBa(w3}{>$ zRqm+SI@cKtWLrcPLN9T{1sq9H;-GKd9v&tEQ~*l4qNh|JU8Z3lWLFN0tdwRKEz+}8 z`>C~5C7}_%$;5!0B!)v92h#IQ`3gWc-wG405gU<>N0>R{cF>e;YA=w@7ehr*YRhk6 zL|Ou=4~Q^qB;r#*Y>A!KQwd(doLgihTB`9#Tr_Um_Z7pMTxss9)rzx|9fLV7hbqmT zdbOWlDr`tEIHqWnhoq#Sy)+q3kPayF*n!Y4?Xr4+ee@=PHFdf3*$ibWYj|mGYNbHv z_gGi;g?=^zL5EuJ&Q!C{6GyVx(Jws=>j=H$G)7t`PXFO$OO)6alebI7(ho&U(@E}KmDd}?NWhcaV zF4_$0te188`7z~jSfY?D+?T%nAk}V@G9zudXs5bG(a*^cFVOx26^cc!hQ<+BZ$ujy zs5r;4gibaqHY@h?(QrZ2d&32b%!ABGEnku@K02F|PZjTnbc{+=u&7O&?m&cuT#h5@) z1gWiSU>6fBSEsHmqcPhJ$+DqR)u~F>bE|)I%pii57ziE}r3H!-`ZbGS9khk<%cqCW z_t#e+74v?7xrZhGg@oUsszl~=M%SC=hNtC_AWR*Zk5NvpF{2@8MNOwTc4=r$5rqhK zUh(u!B3CF?)>kQ|QxLubfUgZpM_c6QwOr^cnp0g*f}(cF<5N-8Bdo!Png{HcMW5|>;2g`xXdtsp3JbLhi3jkZ zu{i&6J~0OKmHddOmmHg9NLTTk}-Vm3s(u0YvMa$}^OiVh6GEz^%-DX=t4+#bxBj&H zqmA~m+hBGyq1W0}oF5FDFgY6hq&#Q>_r?!TV>f6bjV2wi@Y7}<4^1x!|6WbW-!S?LXf_i>QeG0}L&E>;1%vbupw*rNQ z$rc$$Rlc50Gf_reON8{j$^%*S8%SP5Gf`}n?NAAjf*s=F0_5t_ieycd2`z|<>6#Cd z6&c1O^;9@gw=j*vkb%BXiO^Cpl4;6Uf`Q`fD|b^*W$Kw5Awow*i^yx@DRAPJQ(9vV zRNXeENST%2iK89qDKH~M!_=o8Y)MIGif{{)S)@bV;}|y+M}|2aO5^|sIjE%jY_z@% zA{0Sa&xeBGn{oYf?zJ)XZ__bLnCODwC!JSU(TvFzb0}S?-8MYbkQz^>gqhlaNF6S; z3}Fcx>ldrte6leC)Tv2}mCROb7z!3(x{5(sne`3}JB_7JlMmO~jWQR4r?GDPRvRyR z(kvY(1J{5%o_p{`6dhL4b2mU86GnRYA~#P^#|@Qia$eJpV*hP1QqkyVO&imkhN`We zqJpKJlE=;)=0G?J2Zf&|wJPT17o;@6$ApJM)Cm}%(}{IPTqp}r*r7k*a+3}(_jLb; zC;4y{#N)OQzYslZ9|Jg2!t(VKFfF@;5w!`8`;n?%S!UnD+$|`z2~`gtg?jTxSDi}# zoJHC-0&@iXc}{8JtcLDa02)uwCKS*}N3UJ{K1t=s^VoN(#^IVV2!!k#fxoD2vMmJ~ zO(=--lC_((P2oV+B}2X?VdOG>6-;ZD#CCQ1!R`j&N%nYBsZWd-rmX-n@1$^Vw+CkY zsQp2-uTj^FK##|GtE~69ma9L{hpN`tu|TO#WY8v;(v4PP56IIewo3U6}WqW zd6X?O5loF>LFzhqP-r?{E&CghgHxs)rKti9n9XEBXBnY2as?J6L3mv8N&U{r^NE4@ zK7t!cRd@7i2Of6H@<*1maGpGqzzdi+3to|Q9TL>IhmeM0PH~S$Rf<^8O50`B?ps$^ z>)8T!lI19zsEgG9q)*d^%=DLK>GN zHs^o5{N9=8FSRruoPBb-ySQ|vj<5G7xv7X6yNfm;MmxLyY3iki5{etCN+Qkt@l+v= z-1(de&DElYtgHexy7Y#|rle$uzAMJ9!kU#4y}2RRisG`Y8llz^LAjLHBwOrnnxJ4` z%^kZNa70+kWmF#ct~X71ou+GD?MalzUbArV!efI+?;jc5l?cDv;MRr$Wwf;uSefya z5Djy8XGx)s&!;Y+8UQ_yMx_1~IodYGIvUpk^u`Y@3@(q^hsUgjJD|#4D`SV&H&m)R z&`cw%MZv_a4)Uj37MXFyqGVbafBwko)S~m)>d}O6vbyVX)R55X1Dj`%Uj3YSFgo2H zLc~Csrpi&$l|_KU^ED9n0EseO-Q_W6gHNZH+tOl9B2)qIa=ERO$mN=RrO>w>>Ky~;aYtM0bGFA_LvKc%kfcD znbQRt^FtT*1P#;(iqUK`w&p8sfTd0>9R_MMjg6RJC1z<7r8rX86w_Od(+qeB=!tl` z2en=2WvPi(be(5*<_YknA zSenXDo0+EaU-)dNsg5CZ5zXQb@NGt$KjdFC0tK&wehcxhbd$=@vc3cdI)1Jxn*gfb6P=RN#c&l zak(`?aJ2%xP`Xn%n%_dAQ_qSLx!to+S1D;wD+fsz_7#!i(DwBB3dC6?7?h)EPHc(J z6<3Gv9~-(plAsO*PS$s0*Ky?q`Yg0{k@5Vfoer+qRfT+!m1m_Pjr5fsil<*(?x0=K z6TtTvYFtwC#>6}vu1HgEh?Gm2jRd5q4uy)cU|KHf1r?yL1MSb1@eP=;N>duz60_kz zlUr*-f25Pj4^H?(d#-QusC-nu%1*hNl=-%rHj+B1ex=) z5l|q_of0Fo0#tm*^d9d)2%Kvq`dz1i)W#Jn^=oTo2xOwRJG~9XRRdU(!g+Q^_(4b! z-@Btw$Iod=WDc<>3^Zxrf~ul&y=b?Ghs=Jle0ARj|1817p)6=N-Y3z5yKD2jWWd(S zgQo#^T|E}p%B=~Kb!`sO-n?UFAPib4{%F7_znQw@@_WcS#EP2 z(Y#VzwmNH;Zq(puAd3138}VfqL~AF<*WpARYVA&9z(?<$2H3c`+|VS;qa^cDA6B$= zj(fI)B$G!sh~iBLIL>C<$Uq6R z$Jg3enbK5iHX}$esaN~UY-l2_viHzwmNbO!D?g{ zRdxLy+NIIQrdG`_!R+V%*)Rb}8L+H9!I)0kgXQajK(+q`e0&8Rj8L2OE|c3zS?s#-9nsG zy>!gFe%GtWk?&94Q4%X7#dot(hH98a$~(Hy{oT=Ig63@u7 zuC>CDn3ASzk#LhLY7}n-LHN=woV7VsQn9!ZeZ8}9Bpd8hPTHan#-;n}sZtsdr~o3vb!eR`o)v90EQ+M%k>`U*sho3If8s(e z_yFq>{913F86UwgO?a23XYH;-w>X&azLn8Hd@;8ChhWDnXHZ9~SwR$scdNg6`R^|H zkzm5&!{+iJ@Ze+I%v8LI(8fkb5Cv_Z8Ck?WQl(wwR892V{)D1?Pp7q07SI^>5cE^>@k6y%pUd91n%%zDR zsSaiJC&}0d$u`mSVp%z($3LVIXA|jR64|$^auXGq(gDkzG?kJEV5U_^vL4RL9yvYr zWWYBHQpclQm!ipcv@#hhb9*>p4^m68uL~!nmCjk8ah~7lYNiW5_3FTJ)YVOICsm`b zwToD_65LQwWY5c`ri3oHQmL!+;FVOf0xU~f8VH7fiw7;swE_e|9FH|9RV1#Xkw`;E zYfgom9VJKNC9 zSv9CxQ=PtBg}-u>m>cbKt4N9(`3YD>Zso)vR%N_&vkU8c3kwDdxOycN2%(DWr>PDe z+_)58F_!H4*_cp(1IEry`ID&C}!N_JH>GP_PYv>6t{n1{YwOm830 zvT!qJ&h<8JW+iI>(B##)fHJ=oT3BSAaV9L&(hUG!Q)CuIdBY>!ViN~xK(jL4EJ)gD zbv{uz2_7L(4n_xN%AGN!+&PJJZou?vu<`V}Swa9x3xbdaCIlb(o&6&b-B7k?OQx*O01=Z(|K7Lp3h-^Er0i;{^e#k8g*6@%pbn zO${Dys%XTV9E_k$SUG9u_cA#?bv0*%`=krCQl5xZwFsDfs%=v6m{sXe`R$QL*jPJx zhM{~SO;Xng8*>CfJ=+St-GJ+AC;K!GgGEg{ zp42lhgsN-PLZ~cv#GS~5Ix85I?)alwV$+y!%u$jI%pfP1X%NdgN4>Wrp4jM;iJ^^y zKXw7^k&8Pdh>4yncQdd^U{pcsBrww3x40RUl?5AZbOMlP9A(i#n6Z&ZH!|DA(@ZMj z^r`KJXUV-R^P8s2c-4 z)_^{WX<903G0jT-+tvEFR*8frtam-TzEUI-zEOs1S6uhzdLn6xvhOEB2O|_>67)is z;HIwgirT$XN(fx^ehk0(xTniJm+Oq|%PfaB-((K;vX*J~%Z?df8e}hbukG5sA$oBL zjro*zhay)ujU`>XKfif?;p=d>f*Hq?(?_Emr!u2+CWKLqgnHyXyTojGV}R#+^qQ&E zIyK1B%v+A5bcqDlRA|;4W_aW^iWrkvsN|!oLmQW`ji<|pXWPb)CF0QE8c%AxO7FA= zQGtF^X%u0cHi+s>3fnsk7=T|d>j@xTQZ^HTfv&R6drcylr^aB<4Ur^VW5u+(49rYI zDaM$p8`%r#GH07@yJ|#slO%4l(bp5`Hyy{^hMUnm(%KNft&MUcz-C)J9mQivgeVFI zbB7k@CD!NLmzx(&euY?Pq6#f$n%#hnfzhM~#!DSP8fqD%*=MaTEki6xdPM`5f~l9- zrMgvcGlrCS;s9SZZH~+ahQVH$X@)yUX<`kl-fCGI;tW#Cl>$6UV^eP&(SzqZk#rcA zrCuAj!AR`}+myHRitORUAu7cnOZGwGT@udRH` zciJE4A%%96vBZ!=cdI=jOM6%flBrYDjV#w@Yc)4j`dM2#TozwHl7iTzGpB9Bg%c%J zXr!bFm|dy`5uiQAiUwQgRwz&GByekjan%g8Q%$Ow+zh(=IzVc9qRC-vLhPYC@jG=a zb-T(&?vo|Sqg*Y!sbfAu?9v*!@gR;P-Noydm-gT5aMNPklhYTQS7`r@&N(wQ@N_uC zw3`YMt;cXbxEBaFmE)_grCS+&hb0}Ut+R@w4owgp4u+wSDK(H`o@CT$6Uomj_i^kx zi2yUsYnC2M>tC8sL{&&ouVEW^l{@L6jLYF3X6bp?25#lNirxWGcyEpR*2&3m+b=|; z)2%aI{u8Nt9ZD5!p@F5y9uYz@NJu$ReOa`kQ4N7{qga}|@in>H!6mlPPc@ZlH+2mIAPk!Rp8>&tIv{RV_b^=S)>qILK$@nduiR*xpq7cJjnzE8W;?8 zxi8Po5DZDfRIIhG_;0#S)zNdS2^r|_LQ?nU-!ShvVfpFx`SvRP) z&%4Cg!&;760jh(oV(Ljdq8YLu zmEcWCPpTl)jdbWHv4+TFFz2)r9SB{7j83A?AYvU34U8ZwZmTL8} zj>tVGH%rS+J(ls1omiE+g;@Po0nwy3la67%L{<)vQciMuYQv%Ej|aSpmAumx7AsN} z7}IT!ORt#&X^tabo06O~gcJ$Qv9zW8;1U>xg3Ikp2Z|Ips0^8@LKs_I4(&FviCmPT zVAZGWTQ^he+vTEJx+(#)AQl}s{*9`EbaQO0h7*63nOEd0&r3SAovbt>c$ zX@Wa4!SB%xYPGqPTFMT`BeHwsI-rbOt@U7?B;&dP(4!^u6DG>Y>Ubo#c4fL6!U=gC zS&&Y%=BPOyYG}axA|`9dIZ$e}pU*;eQU`E`raJT+@YIbjx(Tpi;Qid_sdVBUq={9N>sbi7pCuWqcUSr1qBU zQUEG^YULx}(=fH4ak_#{%4Wj1>u^}PGGtUQB`$>0U}6=SO++WB_0W1{77eu~$4~c3 z(vHX!B8X@gc?7N9+Z?sdus?~5qtTa`wqY6^OH~7uS}!!N_kD7)q%?5xyu7WUXaK@5)f?+w@hN-5%8k?A*6Z$YHYg{T?&5~0N_9j(3D=Y(O=|9 zpnu3#g|#|TlC$m|>&68Os$$&qx2D3FPBx6wm}Q`rL5yLE>)@IUI39l;MMmu{%_tFK zOPB0?vOG}j>$e~IVYgf_e=t+&q+VO&YYtR;7td8O)?M-i=;Y=3F_(I;;Mp{?ev}4a zxTZ~;{mM#9u1reuv1S0k^h!3O9w)$?>Ea`=tM(o+Z!Eb^L^;+)_Nd3i9hOZFz-w$# zK1w-!QugT}VxDxp+15+Xdp56Us}4q}pYP8%7w)-&{}PQ2%q`fom9OOl$>k@*k^HHj zI2rM)e$;*r(upDCw~7p;E$xDoBwaovr~;0Sp}%&xoFHh*bfx^)hm*Q`pUiTFLK>lF zJ*v@F(PZeSN$hK0rIhJTr*DDIV^YVFB{m+89o+osB3*oy=}ROm2t(zeO;W+c{FD%t zqb-ogod#1&m`>zbMk*7Y6ljuIgl4+pqAy=Jo%Wzk7`q(Y@|mZ6wA+=rrc{$Eg=36% z>u+ZFfLFX#de!Af`)yfMNg0#et4Cav$5c^$kV;cX0YL)3{q9OEA6?-r3r}7bo*j)b zHtqJgMLgxJT5g$-QYR!DECW^c9x5RL-K5H$-aNPG#c%4c>a6U#B2DSnIW`@_nvH9B zXJnuBN-~0pl>>~vo5_*83p8jh`s}n$^j|ngbAthn5FS(w^a#Y z?O61^R#e1;!~52E7n}Vgs}KEk^ys|?*GSFV@}VEiZl%lty5Z=aRuU;RSY=X5P`n~Z z8fdvYxPLuKl{BcKXmYjnOF(iK6MVg~1OcCIY_rT%-7>o129Mgdr06OsRTMiDJ$(9b z^Y-TUy++&3_Iv}+|DZE5A+O)ATrp4W(|_ap&qV1(OF8A2U~c3vKrFuM$wKjRn5r2% z+g63lneJ?2f+8!$ji;9fAd`@y@F3*KS6-|OmrnjlEI)pVTq?OeyNk%r=OFmOn2nmL zl{sUhR}pzvdmwwphEvmeQ}j-XM^cZIP~wj=HuaM1B#bSU#NS^uD75%HY%H0Pa{d3Wxc@80j;nLBT^lUJ>f zoBv4_B$w! znvYU8MqCZ(K5bK8US3iD*dCU8ss(t-Fw}PcS^YH}k5_XM^t_sw>46X+HY7CQ0c9dA zWi3soT})1(lZJ(ocsoOlXbo;Cc;rb^r3M4gVdt3?d3fY3xM?OX=bpCypLV+hg@$`A@ovW1h|UGN?L;^98RL1K}eer4Q97~S#2#KW2rWZcby>67#i?#*6c+s=qUvnQ4gT((+maMUNu1 z^}5YUz30vy6nB?No3aRjs+!!>Xl6{@elI99P^*XkM=3h|33@iD7o76~N1v-^F}STV zlzZ)urmfn!K^{KBvU)zW-k6+Cs^gT9W6Pp&TB4jo_G!9ruQ3`X4!grXP1+Gp{9d$& znRQ*-7#$I>Yp)f@+~V?H>7A+p6Fh$OBgs4Yzq;f3W(m!yC2~?ZIqfAemX~L}s0+C2 zyJ6*!rWYUq>1urpkR29$wfZMB_tk0Uy$3LsrtnK&G^^(vX-&4)v`G3X&RppmHU1?4 zKr5NE{k>&<{5tDznY3R!9{6jC! zVYXK}n;~ScjqMUo>TbQWq@)<4 z>jZgT6rZ}DgW6iAN7F!wvuZj^8CkF~YDya@*WbJxGsf~PikZVR3w5O-SM`D-_dB-b zw_bk5Ng%2lJP(bOXZ!x1TlyqpLybvnYg?7piU2DoN$c^gB)qarcOz&aWX6AX@5Du8LRT-t5 zwIIng_{m9gRD4{|!)a-)$iwlyB_c|6=&r@UhfJA3y+c3s(!3Vg+8QvU=|!zQwH#|~ zIo5#JnkyC?6o;&)Ec&igC`l3dn#JWSrVT9j1Vf6(jOJ=i{mgjz#t2piiP)#1QS3XA zsB1q%?Mqsi4w7Wb{>3&dYKy)ku9q1iDaZ`yug|pr76gY@wOl+=bW)#7GGHf0onh-_ zyUf)(dvHwKf_RSTDKO6v$i5}{L-=aZC<{OfF5w|_W*^WOgp2gYAUK7!zwy^B=dZFn zi&__;a7%)U;(F}&ty#(k)Qd>6Z6bTnm@ zs&eTy0Fc2l(O!xsWtUiekPV_pL4xSoyQrk5R`I@2ifccjO%(kLhYS&r2%-m>95~qP z$+te?v)(WbPKXD%o>zYu+qSI-KdG82i!410??d~@*H*i#h~NG)3uN5*NW93^ck(f= zI})0{tj?GZNTGeBY2k8QJer>|j$X3ZcXl~w?6o{{bJa$`y6%2GOVgbVn|^Y8se8xH z&rc`7;2Ncwp^8gqmE-;k2uRPEv`5OBEJL-yXHTO_j=DBCnC1#UJ^Wk`rHVw0@V z+|Q&Ach?QKm@njbD`(=Sc!4uXjg`{Vj;7gjaeKC_#HiX#bB6mN7Gs9>NZkQM)vY}$ zO3`PyB!@uF+)blGHQO8_{uuX=IU7B3kv`9{vpE+p|2A^#8wNDrF8LMP36%wY46FR! z(4r{wH^W`~h$u-mdv__6_|pIH$rl1JEewWwZHPHvA|7rwg>_`|L%~2syM*Kz7~?}uyV68z$*6%e2u3wt8sI*5&f&p&Y9bt8#gt`pWVuqY<}X&tEf0 zy}o+$+Ml)@-ySilyT#EQ1Eu_zD=)@JHb5W(`hE~;2<6iO1Et$S>s=@jJwDjGiB`+m zxkk1!9lkKX%NaUdwePI&`TLBc6RVF?B3CH~YKWBeesy?laFzc;zCyrxRE)X4Ia2Yu zlDB`#Yg_AW{=r&{qO}lGUHggvh{duU^TIKj5H}yrR$6$)h>o!4Ln_EBo%9e5ltFTn zsa0UGP8mHZLJga7lE({Mc55a&>68wQl~!7vGrU90z$5t7GUVToAHj{4))XTrXS8E} z$LGfgg{X7WQXhtmXUF3b*wHjTS7~?sc*}BBXvscn_B&s-kZt%ZcIaVro1S)CYOZlP z>tq3vvnwA_#H?~ybqnL&ay9Q-%%ABCC(y1Q^*_ZO? z2DFgSkr;Nylsa;r(h<{@*SecV9)xCUZTc8J`yaq!WX(Sb66qrc=Ek+(bo#DD9hepMT0dBTWTlv8J#@( zlpfPcZxhYXSvf;>NlB<;_iz3Y{Zm+WdRVbgm8YYan=T|YsZF#6(@%oIzZUw^(N(93 z)7^!7+=%Si#uI{?^f_F6t-u+mbHJ2VM&`qs1g5kON&i8-{oOhOQ)(=owx=7z+Cxu; zBKTyGPhxT9=K?NG2E%v%GKJbJQ|QxXPJfuIbNpUSuxuK_nNFZ3_Lq6e$s1?HF2|RG zJga^G+XbYv%fDfL((N4qdoPA4wK^Rim+Soj>vW{k`o{HbJD|?K<0`m>1SmMNpOK6Cn_rjJkhp~8{#8zVJ1!Y&?$b3u z1T*jyA}N6$xYv$g6y)U(6Mh9Pg&-sE&f0;gprkv{9BhkVc7HCam5a&d7T&GEW|~9K zNymLd>fJ(KisPAKrDMNwjfvbJc!4R|c&}+Pjt!sioj|cG%Y<-8{9v&Zb?U`nT4B8( zY$8Vg9dzr&%=!V9)d!a2u3AJ*@a42Z{}+Y+rs=RZQr`2cU1y1>}i?QzcIfX~0Tgs5qYhubgTd z_;H)7G&56tGqR+CRUhKghnyaOEW~vzw2dOd8o>Tqx>(}LGYq8#t)-p+KrXrnwCT;? zwVe06=Z^p#R=CQFLHCi)a;yDaM+nqsm!DeKZr~3q-SA8*{Z`vw?@Pai&IA*8^sy5< z9v$)YOF*ZSd_`~T=fYToR!B?z>_ms4rvK(EcWfk~4Cz2rtzheAHIv@pW^db7zQN4i z7Dhz}--;bCwTbRNFP-_NhKJXJAgc+8DhC%B-~hhPM;svn5o4e}LX<$#cA$z!7BR)> ztk1c+Eh8MV@}1v_Q0gv+zbDz-H)f=LPTibaH#WC_vIK~*ywD}uiytMuYVAZs^>RdE z%sEJ=T==WD1s777;EEGAAAEEIHHIIIIIIIIIIIIIIBBBIIIIH==<<<<>>D?1112544556::03---//25.22=;DD?;;;>BDDDEEEGGGA<8889>?999<0////8888>=??@DDDDFFFF???:;;;;AAA???DDDDFFFAAAAFFD8AAFFFC???CFFFFFFFFFFFFFFFFAAAAFFFFCCCF<<<=424226622....666=?==4466444@?4444==?;;;9688<0...:::9<:7988989????984444A@?AABBA=?==; AS:i:260 XS:i:239 XF:i:2 XE:i:3 XN:i:1 RG:Z:mu16_454_mu16 diff --git a/tests/pysam_data/ex9_nofail.sam b/tests/pysam_data/ex9_nofail.sam new file mode 100644 index 0000000..ee31dca --- /dev/null +++ b/tests/pysam_data/ex9_nofail.sam @@ -0,0 +1,1021 @@ +@HD VN:1.0 GO:none SO:coordinate +@SQ SN:CUTC000001 LN:810 +@SQ SN:CUTC000002 LN:1213 +@SQ SN:CUTC000003 LN:525 +@SQ SN:CUTC000004 LN:620 +@SQ SN:CUTC000005 LN:550 +@SQ SN:CUTC000006 LN:723 +@SQ SN:CUTC000007 LN:773 +@SQ SN:CUTC000008 LN:667 +@SQ SN:CUTC000009 LN:593 +@SQ SN:CUTC000010 LN:556 +@SQ SN:CUTC000011 LN:519 +@SQ SN:CUTC000012 LN:537 +@SQ SN:CUTC000013 LN:930 +@SQ SN:CUTC000014 LN:944 +@SQ SN:CUTC000015 LN:829 +@SQ SN:CUTC000016 LN:1109 +@SQ SN:CUTC000017 LN:513 +@SQ SN:CUTC000018 LN:1043 +@SQ SN:CUTC000019 LN:884 +@SQ SN:CUTC000020 LN:567 +@SQ SN:CUTC000021 LN:1001 +@SQ SN:CUTC000022 LN:754 +@SQ SN:CUTC000023 LN:1045 +@SQ SN:CUTC000024 LN:1091 +@SQ SN:CUTC000025 LN:606 +@SQ SN:CUTC000026 LN:635 +@SQ SN:CUTC000027 LN:563 +@SQ SN:CUTC000028 LN:830 +@SQ SN:CUTC000029 LN:1456 +@SQ SN:CUTC000030 LN:872 +@SQ SN:CUTC000031 LN:742 +@SQ SN:CUTC000032 LN:553 +@SQ SN:CUTC000033 LN:624 +@SQ SN:CUTC000034 LN:641 +@SQ SN:CUTC000035 LN:695 +@SQ SN:CUTC000036 LN:1519 +@SQ SN:CUTC000037 LN:536 +@SQ SN:CUTC000038 LN:619 +@SQ SN:CUTC000039 LN:643 +@SQ SN:CUTC000040 LN:650 +@SQ SN:CUTC000041 LN:571 +@SQ SN:CUTC000042 LN:1457 +@SQ SN:CUTC000043 LN:618 +@SQ SN:CUTC000044 LN:1261 +@SQ SN:CUTC000045 LN:544 +@SQ SN:CUTC000046 LN:1234 +@SQ SN:CUTC000047 LN:867 +@SQ SN:CUTC000048 LN:792 +@SQ SN:CUTC000049 LN:1076 +@SQ SN:CUTC000050 LN:479 +@SQ SN:CUTC000051 LN:584 +@SQ SN:CUTC000052 LN:841 +@SQ SN:CUTC000053 LN:518 +@SQ SN:CUTC000054 LN:1052 +@SQ SN:CUTC000055 LN:626 +@SQ SN:CUTC000056 LN:773 +@SQ SN:CUTC000057 LN:542 +@SQ SN:CUTC000058 LN:566 +@SQ SN:CUTC000059 LN:931 +@SQ SN:CUTC000060 LN:755 +@SQ SN:CUTC000061 LN:606 +@SQ SN:CUTC000062 LN:640 +@SQ SN:CUTC000063 LN:667 +@SQ SN:CUTC000064 LN:1717 +@SQ SN:CUTC000065 LN:695 +@SQ SN:CUTC000066 LN:1735 +@SQ SN:CUTC000067 LN:474 +@SQ SN:CUTC000068 LN:813 +@SQ SN:CUTC000069 LN:746 +@SQ SN:CUTC000070 LN:1141 +@SQ SN:CUTC000071 LN:624 +@SQ SN:CUTC000072 LN:1097 +@SQ SN:CUTC000073 LN:510 +@SQ SN:CUTC000074 LN:638 +@SQ SN:CUTC000075 LN:682 +@SQ SN:CUTC000076 LN:1043 +@SQ SN:CUTC000077 LN:727 +@SQ SN:CUTC000078 LN:1124 +@SQ SN:CUTC000079 LN:711 +@SQ SN:CUTC000080 LN:578 +@SQ SN:CUTC000081 LN:718 +@SQ SN:CUTC000082 LN:1779 +@SQ SN:CUTC000083 LN:630 +@SQ SN:CUTC000084 LN:850 +@SQ SN:CUTC000085 LN:590 +@SQ SN:CUTC000086 LN:578 +@SQ SN:CUTC000087 LN:727 +@SQ SN:CUTC000088 LN:582 +@SQ SN:CUTC000089 LN:632 +@SQ SN:CUTC000090 LN:792 +@SQ SN:CUTC000091 LN:553 +@SQ SN:CUTC000092 LN:606 +@SQ SN:CUTC000093 LN:1263 +@SQ SN:CUTC000094 LN:1119 +@SQ SN:CUTC000095 LN:1107 +@SQ SN:CUTC000096 LN:1240 +@SQ SN:CUTC000097 LN:578 +@SQ SN:CUTC000098 LN:739 +@SQ SN:CUTC000099 LN:959 +@SQ SN:CUTC000100 LN:701 +@SQ SN:CUTC000101 LN:1047 +@SQ SN:CUTC000102 LN:961 +@SQ SN:CUTC000103 LN:548 +@SQ SN:CUTC000104 LN:579 +@SQ SN:CUTC000105 LN:1376 +@SQ SN:CUTC000106 LN:1202 +@SQ SN:CUTC000107 LN:615 +@SQ SN:CUTC000108 LN:634 +@SQ SN:CUTC000109 LN:742 +@SQ SN:CUTC000110 LN:645 +@SQ SN:CUTC000111 LN:567 +@SQ SN:CUTC000112 LN:715 +@SQ SN:CUTC000113 LN:705 +@SQ SN:CUTC000114 LN:548 +@SQ SN:CUTC000115 LN:555 +@SQ SN:CUTC000116 LN:1370 +@SQ SN:CUTC000117 LN:715 +@SQ SN:CUTC000118 LN:737 +@SQ SN:CUTC000119 LN:595 +@SQ SN:CUTC000120 LN:674 +@SQ SN:CUTC000121 LN:858 +@SQ SN:CUTC000122 LN:571 +@SQ SN:CUTC000123 LN:656 +@SQ SN:CUTC000124 LN:923 +@SQ SN:CUTC000125 LN:487 +@SQ SN:CUTC000126 LN:488 +@SQ SN:CUTC000127 LN:548 +@SQ SN:CUTC000128 LN:547 +@SQ SN:CUTC000129 LN:593 +@SQ SN:CUTC000130 LN:980 +@SQ SN:CUTC000131 LN:605 +@SQ SN:CUTC000132 LN:942 +@SQ SN:CUTC000133 LN:599 +@SQ SN:CUTC000134 LN:755 +@SQ SN:CUTC000135 LN:544 +@SQ SN:CUTC000136 LN:623 +@SQ SN:CUTC000137 LN:680 +@SQ SN:CUTC000138 LN:633 +@SQ SN:CUTC000139 LN:4441 +@SQ SN:CUTC000140 LN:894 +@SQ SN:CUTC000141 LN:688 +@SQ SN:CUTC000142 LN:683 +@SQ SN:CUTC000143 LN:679 +@SQ SN:CUTC000144 LN:698 +@SQ SN:CUTC000145 LN:629 +@SQ SN:CUTC000146 LN:534 +@SQ SN:CUTC000147 LN:643 +@SQ SN:CUTC000148 LN:614 +@SQ SN:CUTC000149 LN:845 +@SQ SN:CUTC000150 LN:652 +@SQ SN:CUTC000151 LN:1332 +@SQ SN:CUTC000152 LN:1091 +@SQ SN:CUTC000153 LN:702 +@SQ SN:CUTC000154 LN:677 +@SQ SN:CUTC000155 LN:902 +@SQ SN:CUTC000156 LN:557 +@SQ SN:CUTC000157 LN:735 +@SQ SN:CUTC000158 LN:940 +@SQ SN:CUTC000159 LN:668 +@SQ SN:CUTC000160 LN:2002 +@SQ SN:CUTC000161 LN:665 +@SQ SN:CUTC000162 LN:907 +@SQ SN:CUTC000163 LN:497 +@SQ SN:CUTC000164 LN:966 +@SQ SN:CUTC000165 LN:645 +@SQ SN:CUTC000166 LN:595 +@SQ SN:CUTC000167 LN:651 +@SQ SN:CUTC000168 LN:410 +@SQ SN:CUTC000169 LN:1122 +@SQ SN:CUTC000170 LN:1021 +@SQ SN:CUTC000171 LN:804 +@SQ SN:CUTC000172 LN:972 +@SQ SN:CUTC000173 LN:1839 +@SQ SN:CUTC000174 LN:647 +@SQ SN:CUTC000175 LN:675 +@SQ SN:CUTC000176 LN:647 +@SQ SN:CUTC000177 LN:1713 +@SQ SN:CUTC000178 LN:911 +@SQ SN:CUTC000179 LN:664 +@SQ SN:CUTC000180 LN:765 +@SQ SN:CUTC000181 LN:950 +@SQ SN:CUTC000182 LN:914 +@SQ SN:CUTC000183 LN:1166 +@SQ SN:CUTC000184 LN:834 +@SQ SN:CUTC000185 LN:812 +@SQ SN:CUTC000186 LN:793 +@SQ SN:CUTC000187 LN:1148 +@SQ SN:CUTC000188 LN:1376 +@SQ SN:CUTC000189 LN:724 +@SQ SN:CUTC000190 LN:762 +@SQ SN:CUTC000191 LN:940 +@SQ SN:CUTC000192 LN:707 +@SQ SN:CUTC000193 LN:1596 +@SQ SN:CUTC000194 LN:557 +@SQ SN:CUTC000195 LN:596 +@SQ SN:CUTC000196 LN:930 +@SQ SN:CUTC000197 LN:1447 +@SQ SN:CUTC000198 LN:566 +@SQ SN:CUTC000199 LN:686 +@SQ SN:CUTC000200 LN:685 +@SQ SN:CUTC000201 LN:579 +@SQ SN:CUTC000202 LN:1282 +@SQ SN:CUTC000203 LN:1601 +@SQ SN:CUTC000204 LN:1034 +@SQ SN:CUTC000205 LN:1370 +@SQ SN:CUTC000206 LN:530 +@SQ SN:CUTC000207 LN:947 +@SQ SN:CUTC000208 LN:655 +@SQ SN:CUTC000209 LN:611 +@SQ SN:CUTC000210 LN:700 +@SQ SN:CUTC000211 LN:940 +@SQ SN:CUTC000212 LN:496 +@SQ SN:CUTC000213 LN:849 +@SQ SN:CUTC000214 LN:713 +@SQ SN:CUTC000215 LN:879 +@SQ SN:CUTC000216 LN:686 +@SQ SN:CUTC000217 LN:655 +@SQ SN:CUTC000218 LN:1139 +@SQ SN:CUTC000219 LN:712 +@SQ SN:CUTC000220 LN:987 +@SQ SN:CUTC000221 LN:581 +@SQ SN:CUTC000222 LN:867 +@SQ SN:CUTC000223 LN:1591 +@SQ SN:CUTC000224 LN:661 +@SQ SN:CUTC000225 LN:1490 +@SQ SN:CUTC000226 LN:1207 +@SQ SN:CUTC000227 LN:785 +@SQ SN:CUTC000228 LN:700 +@SQ SN:CUTC000229 LN:474 +@SQ SN:CUTC000230 LN:539 +@SQ SN:CUTC000231 LN:1095 +@SQ SN:CUTC000232 LN:556 +@SQ SN:CUTC000233 LN:609 +@SQ SN:CUTC000234 LN:1335 +@SQ SN:CUTC000235 LN:566 +@SQ SN:CUTC000236 LN:612 +@SQ SN:CUTC000237 LN:918 +@SQ SN:CUTC000238 LN:572 +@SQ SN:CUTC000239 LN:690 +@SQ SN:CUTC000240 LN:539 +@SQ SN:CUTC000241 LN:1861 +@SQ SN:CUTC000242 LN:730 +@SQ SN:CUTC000243 LN:775 +@SQ SN:CUTC000244 LN:1439 +@SQ SN:CUTC000245 LN:687 +@SQ SN:CUTC000246 LN:754 +@SQ SN:CUTC000247 LN:646 +@SQ SN:CUTC000248 LN:543 +@SQ SN:CUTC000249 LN:1182 +@SQ SN:CUTC000250 LN:650 +@SQ SN:CUTC000251 LN:732 +@SQ SN:CUTC000252 LN:1040 +@SQ SN:CUTC000253 LN:979 +@SQ SN:CUTC000254 LN:1055 +@SQ SN:CUTC000255 LN:971 +@SQ SN:CUTC000256 LN:817 +@SQ SN:CUTC000257 LN:606 +@SQ SN:CUTC000258 LN:624 +@SQ SN:CUTC000259 LN:516 +@SQ SN:CUTC000260 LN:987 +@SQ SN:CUTC000261 LN:1071 +@SQ SN:CUTC000262 LN:588 +@SQ SN:CUTC000263 LN:1389 +@SQ SN:CUTC000264 LN:672 +@SQ SN:CUTC000265 LN:954 +@SQ SN:CUTC000266 LN:1072 +@SQ SN:CUTC000267 LN:713 +@SQ SN:CUTC000268 LN:1192 +@SQ SN:CUTC000269 LN:540 +@SQ SN:CUTC000270 LN:592 +@SQ SN:CUTC000271 LN:901 +@SQ SN:CUTC000272 LN:420 +@SQ SN:CUTC000273 LN:670 +@SQ SN:CUTC000274 LN:1088 +@SQ SN:CUTC000275 LN:786 +@SQ SN:CUTC000276 LN:846 +@SQ SN:CUTC000277 LN:839 +@SQ SN:CUTC000278 LN:901 +@SQ SN:CUTC000279 LN:3005 +@SQ SN:CUTC000280 LN:727 +@SQ SN:CUTC000281 LN:982 +@SQ SN:CUTC000282 LN:553 +@SQ SN:CUTC000283 LN:513 +@SQ SN:CUTC000284 LN:666 +@SQ SN:CUTC000285 LN:480 +@SQ SN:CUTC000286 LN:726 +@SQ SN:CUTC000287 LN:1225 +@SQ SN:CUTC000288 LN:783 +@SQ SN:CUTC000289 LN:802 +@SQ SN:CUTC000290 LN:1190 +@SQ SN:CUTC000291 LN:1323 +@SQ SN:CUTC000292 LN:700 +@SQ SN:CUTC000293 LN:748 +@SQ SN:CUTC000294 LN:840 +@SQ SN:CUTC000295 LN:447 +@SQ SN:CUTC000296 LN:475 +@SQ SN:CUTC000297 LN:693 +@SQ SN:CUTC000298 LN:838 +@SQ SN:CUTC000299 LN:933 +@SQ SN:CUTC000300 LN:1175 +@SQ SN:CUTC000301 LN:795 +@SQ SN:CUTC000302 LN:514 +@SQ SN:CUTC000303 LN:650 +@SQ SN:CUTC000304 LN:1015 +@SQ SN:CUTC000305 LN:869 +@SQ SN:CUTC000306 LN:1218 +@SQ SN:CUTC000307 LN:943 +@SQ SN:CUTC000308 LN:879 +@SQ SN:CUTC000309 LN:758 +@SQ SN:CUTC000310 LN:895 +@SQ SN:CUTC000311 LN:1060 +@SQ SN:CUTC000312 LN:1414 +@SQ SN:CUTC000313 LN:1841 +@SQ SN:CUTC000314 LN:1040 +@SQ SN:CUTC000315 LN:769 +@SQ SN:CUTC000316 LN:1400 +@SQ SN:CUTC000317 LN:1097 +@SQ SN:CUTC000318 LN:953 +@SQ SN:CUTC000319 LN:793 +@SQ SN:CUTC000320 LN:840 +@SQ SN:CUTC000321 LN:734 +@SQ SN:CUTC000322 LN:528 +@SQ SN:CUTC000323 LN:492 +@SQ SN:CUTC000324 LN:737 +@SQ SN:CUTC000325 LN:681 +@SQ SN:CUTC000326 LN:446 +@SQ SN:CUTC000327 LN:836 +@SQ SN:CUTC000328 LN:745 +@SQ SN:CUTC000329 LN:1514 +@SQ SN:CUTC000330 LN:773 +@SQ SN:CUTC000331 LN:608 +@SQ SN:CUTC000332 LN:814 +@SQ SN:CUTC000333 LN:655 +@SQ SN:CUTC000334 LN:697 +@SQ SN:CUTC000335 LN:818 +@SQ SN:CUTC000336 LN:650 +@SQ SN:CUTC000337 LN:1787 +@SQ SN:CUTC000338 LN:695 +@SQ SN:CUTC000339 LN:1638 +@SQ SN:CUTC000340 LN:903 +@SQ SN:CUTC000341 LN:638 +@SQ SN:CUTC000342 LN:659 +@SQ SN:CUTC000343 LN:1335 +@SQ SN:CUTC000344 LN:775 +@SQ SN:CUTC000345 LN:834 +@SQ SN:CUTC000346 LN:1356 +@SQ SN:CUTC000347 LN:1566 +@SQ SN:CUTC000348 LN:1240 +@SQ SN:CUTC000349 LN:810 +@SQ SN:CUTC000350 LN:885 +@SQ SN:CUTC000351 LN:532 +@SQ SN:CUTC000352 LN:434 +@SQ SN:CUTC000353 LN:705 +@SQ SN:CUTC000354 LN:740 +@SQ SN:CUTC000355 LN:833 +@SQ SN:CUTC000356 LN:680 +@SQ SN:CUTC000357 LN:1362 +@SQ SN:CUTC000358 LN:621 +@SQ SN:CUTC000359 LN:1108 +@SQ SN:CUTC000360 LN:721 +@SQ SN:CUTC000361 LN:709 +@SQ SN:CUTC000362 LN:908 +@SQ SN:CUTC000363 LN:1044 +@SQ SN:CUTC000364 LN:701 +@SQ SN:CUTC000365 LN:798 +@SQ SN:CUTC000366 LN:550 +@SQ SN:CUTC000367 LN:1007 +@SQ SN:CUTC000368 LN:1355 +@SQ SN:CUTC000369 LN:469 +@SQ SN:CUTC000370 LN:629 +@SQ SN:CUTC000371 LN:1065 +@SQ SN:CUTC000372 LN:415 +@SQ SN:CUTC000373 LN:977 +@SQ SN:CUTC000374 LN:547 +@SQ SN:CUTC000375 LN:699 +@SQ SN:CUTC000376 LN:1150 +@SQ SN:CUTC000377 LN:576 +@SQ SN:CUTC000378 LN:626 +@SQ SN:CUTC000379 LN:1326 +@SQ SN:CUTC000380 LN:621 +@SQ SN:CUTC000381 LN:900 +@SQ SN:CUTC000382 LN:1573 +@SQ SN:CUTC000383 LN:634 +@SQ SN:CUTC000384 LN:1186 +@SQ SN:CUTC000385 LN:623 +@SQ SN:CUTC000386 LN:1082 +@SQ SN:CUTC000387 LN:948 +@SQ SN:CUTC000388 LN:912 +@SQ SN:CUTC000389 LN:1564 +@SQ SN:CUTC000390 LN:1046 +@SQ SN:CUTC000391 LN:1302 +@SQ SN:CUTC000392 LN:1070 +@SQ SN:CUTC000393 LN:519 +@SQ SN:CUTC000394 LN:558 +@SQ SN:CUTC000395 LN:802 +@SQ SN:CUTC000396 LN:592 +@SQ SN:CUTC000397 LN:903 +@SQ SN:CUTC000398 LN:926 +@SQ SN:CUTC000399 LN:1054 +@SQ SN:CUTC000400 LN:626 +@SQ SN:CUTC000401 LN:1078 +@SQ SN:CUTC000402 LN:1369 +@SQ SN:CUTC000403 LN:1616 +@SQ SN:CUTC000404 LN:608 +@SQ SN:CUTC000405 LN:1418 +@SQ SN:CUTC000406 LN:583 +@SQ SN:CUTC000407 LN:658 +@SQ SN:CUTC000408 LN:1265 +@SQ SN:CUTC000409 LN:745 +@SQ SN:CUTC000410 LN:690 +@SQ SN:CUTC000411 LN:609 +@SQ SN:CUTC000412 LN:1061 +@SQ SN:CUTC000413 LN:899 +@SQ SN:CUTC000414 LN:925 +@SQ SN:CUTC000415 LN:552 +@SQ SN:CUTC000416 LN:559 +@SQ SN:CUTC000417 LN:964 +@SQ SN:CUTC000418 LN:855 +@SQ SN:CUTC000419 LN:1045 +@SQ SN:CUTC000420 LN:1479 +@SQ SN:CUTC000421 LN:537 +@SQ SN:CUTC000422 LN:1080 +@SQ SN:CUTC000423 LN:792 +@SQ SN:CUTC000424 LN:1201 +@SQ SN:CUTC000425 LN:1332 +@SQ SN:CUTC000426 LN:929 +@SQ SN:CUTC000427 LN:606 +@SQ SN:CUTC000428 LN:727 +@SQ SN:CUTC000429 LN:1085 +@SQ SN:CUTC000430 LN:504 +@SQ SN:CUTC000431 LN:1231 +@SQ SN:CUTC000432 LN:859 +@SQ SN:CUTC000433 LN:728 +@SQ SN:CUTC000434 LN:553 +@SQ SN:CUTC000435 LN:1124 +@SQ SN:CUTC000436 LN:1430 +@SQ SN:CUTC000437 LN:1770 +@SQ SN:CUTC000438 LN:831 +@SQ SN:CUTC000439 LN:1062 +@SQ SN:CUTC000440 LN:945 +@SQ SN:CUTC000441 LN:1082 +@SQ SN:CUTC000442 LN:2057 +@SQ SN:CUTC000443 LN:1425 +@SQ SN:CUTC000444 LN:1133 +@SQ SN:CUTC000445 LN:1478 +@SQ SN:CUTC000446 LN:755 +@SQ SN:CUTC000447 LN:548 +@SQ SN:CUTC000448 LN:1087 +@SQ SN:CUTC000449 LN:594 +@SQ SN:CUTC000450 LN:1012 +@SQ SN:CUTC000451 LN:1777 +@SQ SN:CUTC000452 LN:631 +@SQ SN:CUTC000453 LN:914 +@SQ SN:CUTC000454 LN:1701 +@SQ SN:CUTC000455 LN:869 +@SQ SN:CUTC000456 LN:1024 +@SQ SN:CUTC000457 LN:802 +@SQ SN:CUTC000458 LN:663 +@SQ SN:CUTC000459 LN:951 +@SQ SN:CUTC000460 LN:739 +@SQ SN:CUTC000461 LN:658 +@SQ SN:CUTC000462 LN:1055 +@SQ SN:CUTC000463 LN:807 +@SQ SN:CUTC000464 LN:1157 +@SQ SN:CUTC000465 LN:1340 +@SQ SN:CUTC000466 LN:1016 +@SQ SN:CUTC000467 LN:646 +@SQ SN:CUTC000468 LN:998 +@SQ SN:CUTC000469 LN:687 +@SQ SN:CUTC000470 LN:919 +@SQ SN:CUTC000471 LN:1062 +@SQ SN:CUTC000472 LN:1454 +@SQ SN:CUTC000473 LN:875 +@SQ SN:CUTC000474 LN:774 +@SQ SN:CUTC000475 LN:671 +@SQ SN:CUTC000476 LN:880 +@SQ SN:CUTC000477 LN:1297 +@SQ SN:CUTC000478 LN:722 +@SQ SN:CUTC000479 LN:985 +@SQ SN:CUTC000480 LN:797 +@SQ SN:CUTC000481 LN:741 +@SQ SN:CUTC000482 LN:598 +@SQ SN:CUTC000483 LN:841 +@SQ SN:CUTC000484 LN:1193 +@SQ SN:CUTC000485 LN:856 +@SQ SN:CUTC000486 LN:1020 +@SQ SN:CUTC000487 LN:984 +@SQ SN:CUTC000488 LN:1145 +@SQ SN:CUTC000489 LN:862 +@SQ SN:CUTC000490 LN:558 +@SQ SN:CUTC000491 LN:484 +@SQ SN:CUTC000492 LN:1097 +@SQ SN:CUTC000493 LN:763 +@SQ SN:CUTC000494 LN:2369 +@SQ SN:CUTC000495 LN:993 +@SQ SN:CUTC000496 LN:716 +@SQ SN:CUTC000497 LN:590 +@SQ SN:CUTC000498 LN:992 +@SQ SN:CUTC000499 LN:1223 +@SQ SN:CUTC000500 LN:956 +@SQ SN:CUTC000501 LN:761 +@SQ SN:CUTC000502 LN:1533 +@SQ SN:CUTC000503 LN:951 +@SQ SN:CUTC000504 LN:1599 +@SQ SN:CUTC000505 LN:1393 +@SQ SN:CUTC000506 LN:1064 +@SQ SN:CUTC000507 LN:1198 +@SQ SN:CUTC000508 LN:650 +@SQ SN:CUTC000509 LN:1190 +@SQ SN:CUTC000510 LN:1168 +@SQ SN:CUTC000511 LN:926 +@SQ SN:CUTC000512 LN:1528 +@SQ SN:CUTC000513 LN:516 +@SQ SN:CUTC000514 LN:886 +@SQ SN:CUTC000515 LN:779 +@SQ SN:CUTC000516 LN:955 +@SQ SN:CUTC000517 LN:1795 +@SQ SN:CUTC000518 LN:1028 +@SQ SN:CUTC000519 LN:799 +@SQ SN:CUTC000520 LN:1170 +@SQ SN:CUTC000521 LN:1348 +@SQ SN:CUTC000522 LN:611 +@SQ SN:CUTC000523 LN:795 +@SQ SN:CUTC000524 LN:767 +@SQ SN:CUTC000525 LN:679 +@SQ SN:CUTC000526 LN:1216 +@SQ SN:CUTC000527 LN:1105 +@SQ SN:CUTC000528 LN:757 +@SQ SN:CUTC000529 LN:951 +@SQ SN:CUTC000530 LN:446 +@SQ SN:CUTC000531 LN:759 +@SQ SN:CUTC000532 LN:751 +@SQ SN:CUTC000533 LN:629 +@SQ SN:CUTC000534 LN:903 +@SQ SN:CUTC000535 LN:652 +@SQ SN:CUTC000536 LN:584 +@SQ SN:CUTC000537 LN:785 +@SQ SN:CUTC000538 LN:3820 +@SQ SN:CUTC000539 LN:582 +@SQ SN:CUTC000540 LN:980 +@SQ SN:CUTC000541 LN:613 +@SQ SN:CUTC000542 LN:978 +@SQ SN:CUTC000543 LN:1717 +@SQ SN:CUTC000544 LN:1069 +@SQ SN:CUTC000545 LN:770 +@SQ SN:CUTC000546 LN:1249 +@SQ SN:CUTC000547 LN:940 +@SQ SN:CUTC000548 LN:1018 +@SQ SN:CUTC000549 LN:962 +@SQ SN:CUTC000550 LN:768 +@SQ SN:CUTC000551 LN:576 +@SQ SN:CUTC000552 LN:687 +@SQ SN:CUTC000553 LN:1354 +@SQ SN:CUTC000554 LN:664 +@SQ SN:CUTC000555 LN:847 +@SQ SN:CUTC000556 LN:1580 +@SQ SN:CUTC000557 LN:950 +@SQ SN:CUTC000558 LN:877 +@SQ SN:CUTC000559 LN:857 +@SQ SN:CUTC000560 LN:802 +@SQ SN:CUTC000561 LN:1022 +@SQ SN:CUTC000562 LN:1082 +@SQ SN:CUTC000563 LN:623 +@SQ SN:CUTC000564 LN:1403 +@SQ SN:CUTC000565 LN:1766 +@SQ SN:CUTC000566 LN:891 +@SQ SN:CUTC000567 LN:864 +@SQ SN:CUTC000568 LN:1010 +@SQ SN:CUTC000569 LN:510 +@SQ SN:CUTC000570 LN:812 +@SQ SN:CUTC000571 LN:582 +@SQ SN:CUTC000572 LN:677 +@SQ SN:CUTC000573 LN:899 +@SQ SN:CUTC000574 LN:1121 +@SQ SN:CUTC000575 LN:601 +@SQ SN:CUTC000576 LN:1757 +@SQ SN:CUTC000577 LN:1015 +@SQ SN:CUTC000578 LN:1147 +@SQ SN:CUTC000579 LN:692 +@SQ SN:CUTC000580 LN:638 +@SQ SN:CUTC000581 LN:504 +@SQ SN:CUTC000582 LN:945 +@SQ SN:CUTC000583 LN:512 +@SQ SN:CUTC000584 LN:761 +@SQ SN:CUTC000585 LN:957 +@SQ SN:CUTC000586 LN:611 +@SQ SN:CUTC000587 LN:776 +@SQ SN:CUTC000588 LN:658 +@SQ SN:CUTC000589 LN:727 +@SQ SN:CUTC000590 LN:833 +@SQ SN:CUTC000591 LN:488 +@SQ SN:CUTC000592 LN:774 +@SQ SN:CUTC000593 LN:784 +@SQ SN:CUTC000594 LN:835 +@SQ SN:CUTC000595 LN:752 +@SQ SN:CUTC000596 LN:523 +@SQ SN:CUTC000597 LN:468 +@SQ SN:CUTC000598 LN:1021 +@SQ SN:CUTC000599 LN:982 +@SQ SN:CUTC000600 LN:671 +@SQ SN:CUTC000601 LN:1063 +@SQ SN:CUTC000602 LN:482 +@SQ SN:CUTC000603 LN:1087 +@SQ SN:CUTC000604 LN:1043 +@SQ SN:CUTC000605 LN:1176 +@SQ SN:CUTC000606 LN:897 +@SQ SN:CUTC000607 LN:764 +@SQ SN:CUTC000608 LN:1724 +@SQ SN:CUTC000609 LN:579 +@SQ SN:CUTC000610 LN:657 +@SQ SN:CUTC000611 LN:627 +@SQ SN:CUTC000612 LN:1110 +@SQ SN:CUTC000613 LN:1065 +@SQ SN:CUTC000614 LN:765 +@SQ SN:CUTC000615 LN:813 +@SQ SN:CUTC000616 LN:1510 +@SQ SN:CUTC000617 LN:906 +@SQ SN:CUTC000618 LN:1733 +@SQ SN:CUTC000619 LN:490 +@SQ SN:CUTC000620 LN:841 +@SQ SN:CUTC000621 LN:1331 +@SQ SN:CUTC000622 LN:1082 +@SQ SN:CUTC000623 LN:1310 +@SQ SN:CUTC000624 LN:977 +@SQ SN:CUTC000625 LN:1122 +@SQ SN:CUTC000626 LN:613 +@SQ SN:CUTC000627 LN:486 +@SQ SN:CUTC000628 LN:1411 +@SQ SN:CUTC000629 LN:1005 +@SQ SN:CUTC000630 LN:1090 +@SQ SN:CUTC000631 LN:715 +@SQ SN:CUTC000632 LN:1475 +@SQ SN:CUTC000633 LN:823 +@SQ SN:CUTC000634 LN:949 +@SQ SN:CUTC000635 LN:1125 +@SQ SN:CUTC000636 LN:904 +@SQ SN:CUTC000637 LN:472 +@SQ SN:CUTC000638 LN:668 +@SQ SN:CUTC000639 LN:788 +@SQ SN:CUTC000640 LN:1314 +@SQ SN:CUTC000641 LN:920 +@SQ SN:CUTC000642 LN:952 +@SQ SN:CUTC000643 LN:859 +@SQ SN:CUTC000644 LN:1001 +@SQ SN:CUTC000645 LN:1386 +@SQ SN:CUTC000646 LN:1109 +@SQ SN:CUTC000647 LN:708 +@SQ SN:CUTC000648 LN:1011 +@SQ SN:CUTC000649 LN:1061 +@SQ SN:CUTC000650 LN:1213 +@SQ SN:CUTC000651 LN:633 +@SQ SN:CUTC000652 LN:667 +@SQ SN:CUTC000653 LN:1364 +@SQ SN:CUTC000654 LN:593 +@SQ SN:CUTC000655 LN:1099 +@SQ SN:CUTC000656 LN:1155 +@SQ SN:CUTC000657 LN:482 +@SQ SN:CUTC000658 LN:1122 +@SQ SN:CUTC000659 LN:1060 +@SQ SN:CUTC000660 LN:558 +@SQ SN:CUTC000661 LN:957 +@SQ SN:CUTC000662 LN:851 +@SQ SN:CUTC000663 LN:1100 +@SQ SN:CUTC000664 LN:868 +@SQ SN:CUTC000665 LN:1147 +@SQ SN:CUTC000666 LN:572 +@SQ SN:CUTC000667 LN:1032 +@SQ SN:CUTC000668 LN:703 +@SQ SN:CUTC000669 LN:1411 +@SQ SN:CUTC000670 LN:1938 +@SQ SN:CUTC000671 LN:1586 +@SQ SN:CUTC000672 LN:1165 +@SQ SN:CUTC000673 LN:897 +@SQ SN:CUTC000674 LN:845 +@SQ SN:CUTC000675 LN:876 +@SQ SN:CUTC000676 LN:756 +@SQ SN:CUTC000677 LN:1253 +@SQ SN:CUTC000678 LN:812 +@SQ SN:CUTC000679 LN:581 +@SQ SN:CUTC000680 LN:753 +@SQ SN:CUTC000681 LN:1146 +@SQ SN:CUTC000682 LN:925 +@SQ SN:CUTC000683 LN:819 +@SQ SN:CUTC000684 LN:913 +@SQ SN:CUTC000685 LN:946 +@SQ SN:CUTC000686 LN:1112 +@SQ SN:CUTC000687 LN:1056 +@SQ SN:CUTC000688 LN:941 +@SQ SN:CUTC000689 LN:892 +@SQ SN:CUTC000690 LN:780 +@SQ SN:CUTC000691 LN:587 +@SQ SN:CUTC000692 LN:696 +@SQ SN:CUTC000693 LN:810 +@SQ SN:CUTC000694 LN:1198 +@SQ SN:CUTC000695 LN:1089 +@SQ SN:CUTC000696 LN:596 +@SQ SN:CUTC000697 LN:1100 +@SQ SN:CUTC000698 LN:639 +@SQ SN:CUTC000699 LN:1254 +@SQ SN:CUTC000700 LN:709 +@SQ SN:CUTC000701 LN:797 +@SQ SN:CUTC000702 LN:915 +@SQ SN:CUTC000703 LN:2222 +@SQ SN:CUTC000704 LN:772 +@SQ SN:CUTC000705 LN:1080 +@SQ SN:CUTC000706 LN:1421 +@SQ SN:CUTC000707 LN:1369 +@SQ SN:CUTC000708 LN:475 +@SQ SN:CUTC000709 LN:775 +@SQ SN:CUTC000710 LN:1192 +@SQ SN:CUTC000711 LN:1226 +@SQ SN:CUTC000712 LN:373 +@SQ SN:CUTC000713 LN:483 +@SQ SN:CUTC000714 LN:647 +@SQ SN:CUTC000715 LN:1087 +@SQ SN:CUTC000716 LN:1006 +@SQ SN:CUTC000717 LN:1179 +@SQ SN:CUTC000718 LN:1032 +@SQ SN:CUTC000719 LN:605 +@SQ SN:CUTC000720 LN:807 +@SQ SN:CUTC000721 LN:1042 +@SQ SN:CUTC000722 LN:970 +@SQ SN:CUTC000723 LN:831 +@SQ SN:CUTC000724 LN:1140 +@SQ SN:CUTC000725 LN:1293 +@SQ SN:CUTC000726 LN:923 +@SQ SN:CUTC000727 LN:754 +@SQ SN:CUTC000728 LN:1052 +@SQ SN:CUTC000729 LN:680 +@SQ SN:CUTC000730 LN:825 +@SQ SN:CUTC000731 LN:1366 +@SQ SN:CUTC000732 LN:2118 +@SQ SN:CUTC000733 LN:733 +@SQ SN:CUTC000734 LN:1328 +@SQ SN:CUTC000735 LN:1059 +@SQ SN:CUTC000736 LN:1025 +@SQ SN:CUTC000737 LN:964 +@SQ SN:CUTC000738 LN:776 +@SQ SN:CUTC000739 LN:1112 +@SQ SN:CUTC000740 LN:1200 +@SQ SN:CUTC000741 LN:634 +@SQ SN:CUTC000742 LN:840 +@SQ SN:CUTC000743 LN:1103 +@SQ SN:CUTC000744 LN:1714 +@SQ SN:CUTC000745 LN:612 +@SQ SN:CUTC000746 LN:512 +@SQ SN:CUTC000747 LN:1120 +@SQ SN:CUTC000748 LN:957 +@SQ SN:CUTC000749 LN:821 +@SQ SN:CUTC000750 LN:475 +@SQ SN:CUTC000751 LN:957 +@SQ SN:CUTC000752 LN:743 +@SQ SN:CUTC000753 LN:533 +@SQ SN:CUTC000754 LN:1345 +@SQ SN:CUTC000755 LN:476 +@SQ SN:CUTC000756 LN:871 +@SQ SN:CUTC000757 LN:843 +@SQ SN:CUTC000758 LN:513 +@SQ SN:CUTC000759 LN:775 +@SQ SN:CUTC000760 LN:1275 +@SQ SN:CUTC000761 LN:1375 +@SQ SN:CUTC000762 LN:1001 +@SQ SN:CUTC000763 LN:1114 +@SQ SN:CUTC000764 LN:974 +@SQ SN:CUTC000765 LN:398 +@SQ SN:CUTC000766 LN:974 +@SQ SN:CUTC000767 LN:689 +@SQ SN:CUTC000768 LN:853 +@SQ SN:CUTC000769 LN:1029 +@SQ SN:CUTC000770 LN:1400 +@SQ SN:CUTC000771 LN:667 +@SQ SN:CUTC000772 LN:939 +@SQ SN:CUTC000773 LN:1054 +@SQ SN:CUTC000774 LN:779 +@SQ SN:CUTC000775 LN:1247 +@SQ SN:CUTC000776 LN:1848 +@SQ SN:CUTC000777 LN:979 +@SQ SN:CUTC000778 LN:852 +@SQ SN:CUTC000779 LN:695 +@SQ SN:CUTC000780 LN:675 +@SQ SN:CUTC000781 LN:1312 +@SQ SN:CUTC000782 LN:895 +@SQ SN:CUTC000783 LN:451 +@SQ SN:CUTC000784 LN:1063 +@SQ SN:CUTC000785 LN:719 +@SQ SN:CUTC000786 LN:915 +@SQ SN:CUTC000787 LN:1050 +@SQ SN:CUTC000788 LN:1056 +@SQ SN:CUTC000789 LN:657 +@SQ SN:CUTC000790 LN:630 +@SQ SN:CUTC000791 LN:877 +@SQ SN:CUTC000792 LN:1279 +@SQ SN:CUTC000793 LN:875 +@SQ SN:CUTC000794 LN:1121 +@SQ SN:CUTC000795 LN:1009 +@SQ SN:CUTC000796 LN:785 +@SQ SN:CUTC000797 LN:546 +@SQ SN:CUTC000798 LN:578 +@SQ SN:CUTC000799 LN:854 +@SQ SN:CUTC000800 LN:987 +@SQ SN:CUTC000801 LN:604 +@SQ SN:CUTC000802 LN:919 +@SQ SN:CUTC000803 LN:1633 +@SQ SN:CUTC000804 LN:984 +@SQ SN:CUTC000805 LN:559 +@SQ SN:CUTC000806 LN:788 +@SQ SN:CUTC000807 LN:918 +@SQ SN:CUTC000808 LN:846 +@SQ SN:CUTC000809 LN:939 +@SQ SN:CUTC000810 LN:946 +@SQ SN:CUTC000811 LN:874 +@SQ SN:CUTC000812 LN:886 +@SQ SN:CUTC000813 LN:813 +@SQ SN:CUTC000814 LN:1369 +@SQ SN:CUTC000815 LN:827 +@SQ SN:CUTC000816 LN:867 +@SQ SN:CUTC000817 LN:1158 +@SQ SN:CUTC000818 LN:742 +@SQ SN:CUTC000819 LN:831 +@SQ SN:CUTC000820 LN:942 +@SQ SN:CUTC000821 LN:740 +@SQ SN:CUTC000822 LN:1191 +@SQ SN:CUTC000823 LN:2043 +@SQ SN:CUTC000824 LN:1642 +@SQ SN:CUTC000825 LN:1314 +@SQ SN:CUTC000826 LN:723 +@SQ SN:CUTC000827 LN:966 +@SQ SN:CUTC000828 LN:995 +@SQ SN:CUTC000829 LN:1118 +@SQ SN:CUTC000830 LN:546 +@SQ SN:CUTC000831 LN:995 +@SQ SN:CUTC000832 LN:860 +@SQ SN:CUTC000833 LN:970 +@SQ SN:CUTC000834 LN:862 +@SQ SN:CUTC000835 LN:458 +@SQ SN:CUTC000836 LN:774 +@SQ SN:CUTC000837 LN:824 +@SQ SN:CUTC000838 LN:1083 +@SQ SN:CUTC000839 LN:866 +@SQ SN:CUTC000840 LN:959 +@SQ SN:CUTC000841 LN:1275 +@SQ SN:CUTC000842 LN:1271 +@SQ SN:CUTC000843 LN:786 +@SQ SN:CUTC000844 LN:598 +@SQ SN:CUTC000845 LN:643 +@SQ SN:CUTC000846 LN:1263 +@SQ SN:CUTC000847 LN:968 +@SQ SN:CUTC000848 LN:1210 +@SQ SN:CUTC000849 LN:634 +@SQ SN:CUTC000850 LN:1085 +@SQ SN:CUTC000851 LN:792 +@SQ SN:CUTC000852 LN:1049 +@SQ SN:CUTC000853 LN:513 +@SQ SN:CUTC000854 LN:839 +@SQ SN:CUTC000855 LN:912 +@SQ SN:CUTC000856 LN:1127 +@SQ SN:CUTC000857 LN:796 +@SQ SN:CUTC000858 LN:769 +@SQ SN:CUTC000859 LN:455 +@SQ SN:CUTC000860 LN:1067 +@SQ SN:CUTC000861 LN:2816 +@SQ SN:CUTC000862 LN:1486 +@SQ SN:CUTC000863 LN:1037 +@SQ SN:CUTC000864 LN:699 +@SQ SN:CUTC000865 LN:1266 +@SQ SN:CUTC000866 LN:719 +@SQ SN:CUTC000867 LN:762 +@SQ SN:CUTC000868 LN:1182 +@SQ SN:CUTC000869 LN:825 +@SQ SN:CUTC000870 LN:1325 +@SQ SN:CUTC000871 LN:579 +@SQ SN:CUTC000872 LN:851 +@SQ SN:CUTC000873 LN:790 +@SQ SN:CUTC000874 LN:793 +@SQ SN:CUTC000875 LN:2194 +@SQ SN:CUTC000876 LN:1237 +@SQ SN:CUTC000877 LN:856 +@SQ SN:CUTC000878 LN:1438 +@SQ SN:CUTC000879 LN:2190 +@SQ SN:CUTC000880 LN:793 +@SQ SN:CUTC000881 LN:1844 +@SQ SN:CUTC000882 LN:1184 +@SQ SN:CUTC000883 LN:933 +@SQ SN:CUTC000884 LN:1372 +@SQ SN:CUTC000885 LN:373 +@SQ SN:CUTC000886 LN:1141 +@SQ SN:CUTC000887 LN:447 +@SQ SN:CUTC000888 LN:1789 +@SQ SN:CUTC000889 LN:593 +@SQ SN:CUTC000890 LN:1020 +@SQ SN:CUTC000891 LN:904 +@SQ SN:CUTC000892 LN:1417 +@SQ SN:CUTC000893 LN:823 +@SQ SN:CUTC000894 LN:1315 +@SQ SN:CUTC000895 LN:999 +@SQ SN:CUTC000896 LN:716 +@SQ SN:CUTC000897 LN:1244 +@SQ SN:CUTC000898 LN:1059 +@SQ SN:CUTC000899 LN:741 +@SQ SN:CUTC000900 LN:762 +@SQ SN:CUTC000901 LN:589 +@SQ SN:CUTC000902 LN:1199 +@SQ SN:CUTC000903 LN:1895 +@SQ SN:CUTC000904 LN:417 +@SQ SN:CUTC000905 LN:976 +@SQ SN:CUTC000906 LN:1405 +@SQ SN:CUTC000907 LN:1652 +@SQ SN:CUTC000908 LN:1138 +@SQ SN:CUTC000909 LN:1099 +@SQ SN:CUTC000910 LN:777 +@SQ SN:CUTC000911 LN:1057 +@SQ SN:CUTC000912 LN:1065 +@SQ SN:CUTC000913 LN:895 +@SQ SN:CUTC000914 LN:745 +@SQ SN:CUTC000915 LN:605 +@SQ SN:CUTC000916 LN:719 +@SQ SN:CUTC000917 LN:709 +@SQ SN:CUTC000918 LN:799 +@SQ SN:CUTC000919 LN:1057 +@SQ SN:CUTC000920 LN:867 +@SQ SN:CUTC000921 LN:629 +@SQ SN:CUTC000922 LN:780 +@SQ SN:CUTC000923 LN:856 +@SQ SN:CUTC000924 LN:814 +@SQ SN:CUTC000925 LN:786 +@SQ SN:CUTC000926 LN:1193 +@SQ SN:CUTC000927 LN:1094 +@SQ SN:CUTC000928 LN:987 +@SQ SN:CUTC000929 LN:1380 +@SQ SN:CUTC000930 LN:1039 +@SQ SN:CUTC000931 LN:487 +@SQ SN:CUTC000932 LN:1016 +@SQ SN:CUTC000933 LN:1449 +@SQ SN:CUTC000934 LN:2138 +@SQ SN:CUTC000935 LN:581 +@SQ SN:CUTC000936 LN:1100 +@SQ SN:CUTC000937 LN:1035 +@SQ SN:CUTC000938 LN:966 +@SQ SN:CUTC000939 LN:856 +@SQ SN:CUTC000940 LN:802 +@SQ SN:CUTC000941 LN:892 +@SQ SN:CUTC000942 LN:1122 +@SQ SN:CUTC000943 LN:923 +@SQ SN:CUTC000944 LN:1125 +@SQ SN:CUTC000945 LN:600 +@SQ SN:CUTC000946 LN:1718 +@SQ SN:CUTC000947 LN:856 +@SQ SN:CUTC000948 LN:1062 +@SQ SN:CUTC000949 LN:934 +@SQ SN:CUTC000950 LN:1006 +@SQ SN:CUTC000951 LN:1797 +@SQ SN:CUTC000952 LN:1347 +@SQ SN:CUTC000953 LN:930 +@SQ SN:CUTC000954 LN:639 +@SQ SN:CUTC000955 LN:776 +@SQ SN:CUTC000956 LN:807 +@SQ SN:CUTC000957 LN:1050 +@SQ SN:CUTC000958 LN:774 +@SQ SN:CUTC000959 LN:1496 +@SQ SN:CUTC000960 LN:497 +@SQ SN:CUTC000961 LN:1052 +@SQ SN:CUTC000962 LN:949 +@SQ SN:CUTC000963 LN:1105 +@SQ SN:CUTC000964 LN:1040 +@SQ SN:CUTC000965 LN:717 +@SQ SN:CUTC000966 LN:1341 +@SQ SN:CUTC000967 LN:866 +@SQ SN:CUTC000968 LN:925 +@SQ SN:CUTC000969 LN:1527 +@SQ SN:CUTC000970 LN:1437 +@SQ SN:CUTC000971 LN:1144 +@SQ SN:CUTC000972 LN:744 +@SQ SN:CUTC000973 LN:839 +@SQ SN:CUTC000974 LN:872 +@SQ SN:CUTC000975 LN:880 +@SQ SN:CUTC000976 LN:785 +@SQ SN:CUTC000977 LN:919 +@SQ SN:CUTC000978 LN:1153 +@SQ SN:CUTC000979 LN:844 +@SQ SN:CUTC000980 LN:919 +@SQ SN:CUTC000981 LN:902 +@SQ SN:CUTC000982 LN:861 +@SQ SN:CUTC000983 LN:1017 +@SQ SN:CUTC000984 LN:660 +@SQ SN:CUTC000985 LN:922 +@SQ SN:CUTC000986 LN:1119 +@SQ SN:CUTC000987 LN:359 +@SQ SN:CUTC000988 LN:1490 +@SQ SN:CUTC000989 LN:1621 +@SQ SN:CUTC000990 LN:789 +@SQ SN:CUTC000991 LN:1064 +@SQ SN:CUTC000992 LN:687 +@SQ SN:CUTC000993 LN:1092 +@SQ SN:CUTC000994 LN:843 +@SQ SN:CUTC000995 LN:1053 +@SQ SN:CUTC000996 LN:552 +@SQ SN:CUTC000997 LN:881 +@SQ SN:CUTC000998 LN:1067 +@SQ SN:CUTC000999 LN:817 +@SQ SN:CUTC001000 LN:641 +@SQ SN:CUTC001001 LN:901 +@SQ SN:CUTC001002 LN:1005 +@SQ SN:CUTC001003 LN:1411 +@SQ SN:CUTC001004 LN:853 +@SQ SN:CUTC001005 LN:621 +@SQ SN:CUTC001006 LN:1374 +@SQ SN:CUTC001007 LN:1122 +@SQ SN:CUTC001008 LN:1098 +@SQ SN:CUTC001009 LN:819 +@SQ SN:CUTC001010 LN:939 +@SQ SN:CUTC001011 LN:591 +@SQ SN:CUTC001012 LN:580 +@SQ SN:CUTC001013 LN:1057 +@SQ SN:CUTC001014 LN:1551 +@SQ SN:CUTC001015 LN:701 +@SQ SN:CUTC001016 LN:885 +@SQ SN:CUTC001017 LN:1209 +@RG ID:mu16_454_mu16 PL:454 LB:mu16 SM:mu16 +@RG ID:upv196_454_upv196 PL:454 LB:upv196 SM:upv196 +CUESOXRA74 0 CUTC000001 1 10 77M1I222M * 0 0 GCCTTTTATAATTATTATAAATTTCGGTTGACCCGACCCCATTAGACAGAGTCTATTAAAGCCCCGTGAAAGCCCGGCAAAACCCAGTAGCGCAGAGATCGGCGAGGGCGAATTTTCGATTGCATTTTCGTTCGTTTCTCTTCTGAATTTCTGTAATCTGTAACGATGTCTCAGACTACTGTCCTCAAGGTTGCTATGTCATGTCAGGGCTGTGTTGGAGCCGCCAAAAGGGTCTTGGGGAAACTGGAAGGTGTTGAAACATTTGACATCGACATAGATGCACAAAAGGTGACTGTGAAA 1BB@@BBHFHHHHHIIHIHFFF@@A@@>9>?999<0////8888>=??@DDDDFFFF???:;;;;AAA???DDDDFFFAAAAFFD8AAFFFC???CFFFFFFFFFFFFFFFFAAAAFFFFCCCF<<<=424226622....666=?==4466444@?4444==?;;;9688<0...:::9<:7988989????984444A@?AABBA=?==; AS:i:260 XS:i:239 XF:i:2 XE:i:3 XN:i:1 RG:Z:mu16_454_mu16 diff --git a/tests/pysam_data/ex_spliced.sam b/tests/pysam_data/ex_spliced.sam new file mode 100644 index 0000000..ae8086a --- /dev/null +++ b/tests/pysam_data/ex_spliced.sam @@ -0,0 +1,297 @@ +@HD VN:1.4 SO:coordinate +@SQ SN:1 LN:248956422 +@SQ SN:2 LN:242193529 +@SQ SN:3 LN:198295559 +@SQ SN:4 LN:190214555 +@SQ SN:5 LN:181538259 +@SQ SN:6 LN:170805979 +@SQ SN:7 LN:159345973 +@SQ SN:8 LN:145138636 +@SQ SN:9 LN:138394717 +@SQ SN:10 LN:133797422 +@SQ SN:11 LN:135086622 +@SQ SN:12 LN:133275309 +@SQ SN:13 LN:114364328 +@SQ SN:14 LN:107043718 +@SQ SN:15 LN:101991189 +@SQ SN:16 LN:90338345 +@SQ SN:17 LN:83257441 +@SQ SN:18 LN:80373285 +@SQ SN:19 LN:58617616 +@SQ SN:20 LN:64444167 +@SQ SN:21 LN:46709983 +@SQ SN:22 LN:50818468 +@SQ SN:X LN:156040895 +@SQ SN:Y LN:57227415 +@SQ SN:MT LN:16569 +@SQ SN:GL000008.2 LN:209709 +@SQ SN:GL000009.2 LN:201709 +@SQ SN:GL000194.1 LN:191469 +@SQ SN:GL000195.1 LN:182896 +@SQ SN:GL000205.2 LN:185591 +@SQ SN:GL000208.1 LN:92689 +@SQ SN:GL000213.1 LN:164239 +@SQ SN:GL000214.1 LN:137718 +@SQ SN:GL000216.2 LN:176608 +@SQ SN:GL000218.1 LN:161147 +@SQ SN:GL000219.1 LN:179198 +@SQ SN:GL000220.1 LN:161802 +@SQ SN:GL000221.1 LN:155397 +@SQ SN:GL000224.1 LN:179693 +@SQ SN:GL000225.1 LN:211173 +@SQ SN:GL000226.1 LN:15008 +@SQ SN:KI270302.1 LN:2274 +@SQ SN:KI270303.1 LN:1942 +@SQ SN:KI270304.1 LN:2165 +@SQ SN:KI270305.1 LN:1472 +@SQ SN:KI270310.1 LN:1201 +@SQ SN:KI270311.1 LN:12399 +@SQ SN:KI270312.1 LN:998 +@SQ SN:KI270315.1 LN:2276 +@SQ SN:KI270316.1 LN:1444 +@SQ SN:KI270317.1 LN:37690 +@SQ SN:KI270320.1 LN:4416 +@SQ SN:KI270322.1 LN:21476 +@SQ SN:KI270329.1 LN:1040 +@SQ SN:KI270330.1 LN:1652 +@SQ SN:KI270333.1 LN:2699 +@SQ SN:KI270334.1 LN:1368 +@SQ SN:KI270335.1 LN:1048 +@SQ SN:KI270336.1 LN:1026 +@SQ SN:KI270337.1 LN:1121 +@SQ SN:KI270338.1 LN:1428 +@SQ SN:KI270340.1 LN:1428 +@SQ SN:KI270362.1 LN:3530 +@SQ SN:KI270363.1 LN:1803 +@SQ SN:KI270364.1 LN:2855 +@SQ SN:KI270366.1 LN:8320 +@SQ SN:KI270371.1 LN:2805 +@SQ SN:KI270372.1 LN:1650 +@SQ SN:KI270373.1 LN:1451 +@SQ SN:KI270374.1 LN:2656 +@SQ SN:KI270375.1 LN:2378 +@SQ SN:KI270376.1 LN:1136 +@SQ SN:KI270378.1 LN:1048 +@SQ SN:KI270379.1 LN:1045 +@SQ SN:KI270381.1 LN:1930 +@SQ SN:KI270382.1 LN:4215 +@SQ SN:KI270383.1 LN:1750 +@SQ SN:KI270384.1 LN:1658 +@SQ SN:KI270385.1 LN:990 +@SQ SN:KI270386.1 LN:1788 +@SQ SN:KI270387.1 LN:1537 +@SQ SN:KI270388.1 LN:1216 +@SQ SN:KI270389.1 LN:1298 +@SQ SN:KI270390.1 LN:2387 +@SQ SN:KI270391.1 LN:1484 +@SQ SN:KI270392.1 LN:971 +@SQ SN:KI270393.1 LN:1308 +@SQ SN:KI270394.1 LN:970 +@SQ SN:KI270395.1 LN:1143 +@SQ SN:KI270396.1 LN:1880 +@SQ SN:KI270411.1 LN:2646 +@SQ SN:KI270412.1 LN:1179 +@SQ SN:KI270414.1 LN:2489 +@SQ SN:KI270417.1 LN:2043 +@SQ SN:KI270418.1 LN:2145 +@SQ SN:KI270419.1 LN:1029 +@SQ SN:KI270420.1 LN:2321 +@SQ SN:KI270422.1 LN:1445 +@SQ SN:KI270423.1 LN:981 +@SQ SN:KI270424.1 LN:2140 +@SQ SN:KI270425.1 LN:1884 +@SQ SN:KI270429.1 LN:1361 +@SQ SN:KI270435.1 LN:92983 +@SQ SN:KI270438.1 LN:112505 +@SQ SN:KI270442.1 LN:392061 +@SQ SN:KI270448.1 LN:7992 +@SQ SN:KI270465.1 LN:1774 +@SQ SN:KI270466.1 LN:1233 +@SQ SN:KI270467.1 LN:3920 +@SQ SN:KI270468.1 LN:4055 +@SQ SN:KI270507.1 LN:5353 +@SQ SN:KI270508.1 LN:1951 +@SQ SN:KI270509.1 LN:2318 +@SQ SN:KI270510.1 LN:2415 +@SQ SN:KI270511.1 LN:8127 +@SQ SN:KI270512.1 LN:22689 +@SQ SN:KI270515.1 LN:6361 +@SQ SN:KI270516.1 LN:1300 +@SQ SN:KI270517.1 LN:3253 +@SQ SN:KI270518.1 LN:2186 +@SQ SN:KI270519.1 LN:138126 +@SQ SN:KI270521.1 LN:7642 +@SQ SN:KI270522.1 LN:5674 +@SQ SN:KI270528.1 LN:2983 +@SQ SN:KI270529.1 LN:1899 +@SQ SN:KI270530.1 LN:2168 +@SQ SN:KI270538.1 LN:91309 +@SQ SN:KI270539.1 LN:993 +@SQ SN:KI270544.1 LN:1202 +@SQ SN:KI270548.1 LN:1599 +@SQ SN:KI270579.1 LN:31033 +@SQ SN:KI270580.1 LN:1553 +@SQ SN:KI270581.1 LN:7046 +@SQ SN:KI270582.1 LN:6504 +@SQ SN:KI270583.1 LN:1400 +@SQ SN:KI270584.1 LN:4513 +@SQ SN:KI270587.1 LN:2969 +@SQ SN:KI270588.1 LN:6158 +@SQ SN:KI270589.1 LN:44474 +@SQ SN:KI270590.1 LN:4685 +@SQ SN:KI270591.1 LN:5796 +@SQ SN:KI270593.1 LN:3041 +@SQ SN:KI270706.1 LN:175055 +@SQ SN:KI270707.1 LN:32032 +@SQ SN:KI270708.1 LN:127682 +@SQ SN:KI270709.1 LN:66860 +@SQ SN:KI270710.1 LN:40176 +@SQ SN:KI270711.1 LN:42210 +@SQ SN:KI270712.1 LN:176043 +@SQ SN:KI270713.1 LN:40745 +@SQ SN:KI270714.1 LN:41717 +@SQ SN:KI270715.1 LN:161471 +@SQ SN:KI270716.1 LN:153799 +@SQ SN:KI270717.1 LN:40062 +@SQ SN:KI270718.1 LN:38054 +@SQ SN:KI270719.1 LN:176845 +@SQ SN:KI270720.1 LN:39050 +@SQ SN:KI270721.1 LN:100316 +@SQ SN:KI270722.1 LN:194050 +@SQ SN:KI270723.1 LN:38115 +@SQ SN:KI270724.1 LN:39555 +@SQ SN:KI270725.1 LN:172810 +@SQ SN:KI270726.1 LN:43739 +@SQ SN:KI270727.1 LN:448248 +@SQ SN:KI270728.1 LN:1872759 +@SQ SN:KI270729.1 LN:280839 +@SQ SN:KI270730.1 LN:112551 +@SQ SN:KI270731.1 LN:150754 +@SQ SN:KI270732.1 LN:41543 +@SQ SN:KI270733.1 LN:179772 +@SQ SN:KI270734.1 LN:165050 +@SQ SN:KI270735.1 LN:42811 +@SQ SN:KI270736.1 LN:181920 +@SQ SN:KI270737.1 LN:103838 +@SQ SN:KI270738.1 LN:99375 +@SQ SN:KI270739.1 LN:73985 +@SQ SN:KI270740.1 LN:37240 +@SQ SN:KI270741.1 LN:157432 +@SQ SN:KI270742.1 LN:186739 +@SQ SN:KI270743.1 LN:210658 +@SQ SN:KI270744.1 LN:168472 +@SQ SN:KI270745.1 LN:41891 +@SQ SN:KI270746.1 LN:66486 +@SQ SN:KI270747.1 LN:198735 +@SQ SN:KI270748.1 LN:93321 +@SQ SN:KI270749.1 LN:158759 +@SQ SN:KI270750.1 LN:148850 +@SQ SN:KI270751.1 LN:150742 +@SQ SN:KI270752.1 LN:27745 +@SQ SN:KI270753.1 LN:62944 +@SQ SN:KI270754.1 LN:40191 +@SQ SN:KI270755.1 LN:36723 +@SQ SN:KI270756.1 LN:79590 +@SQ SN:KI270757.1 LN:71251 +@PG ID:STAR PN:STAR VN:STAR_2.4.1a +HWI-C00113:131:HMHYWADXX:1:2202:17748:47494 272 1 14792 0 51M * 0 0 GGGCCTCTCACCAGCCCCAGGTCCTTTCCCAGAGATGCCCTTGCGCCTCAT CCCFFFFFHHHHHFHIIJJIJAFHJJJJJGJIIHGIJGGIJJIIJIIJJJG NH:i:6 HI:i:3 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:1:2202:17748:47494 272 1 14792 0 38M140N13M * 0 0 GGGCCTCTCACCAGCCCCAGGTCCTTTCCCAGAGATGCCCTTGCGCCTCAT CCCFFFFFHHHHHFHIIJJIJAFHJJJJJGJIIHGIJGGIJJIIJIIJJJG NH:i:6 HI:i:3 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:2:1214:7658:35836 272 1 14792 0 38M140N13M * 0 0 GGGCCCCTCACCAGCCCCAGGTCTTTTCCCAGAGATGCCCTTGCGCCTCAT CCCFFFFFHHHHHJJJJJJJJCGHIJJIJJJJJJIJJGIJJIJIJIJJJJI NH:i:6 HI:i:3 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:1:2114:4116:44566 272 1 14794 0 36M140N15M * 0 0 GCCCCTCACCAGCCCCAGGTCTTTTCCCAGAGATGCCCTTGCGCCTCATGA <@@DDDDDDFHCFHEFGBE+2AFH@GIEGF=GGHII9FB?BFFDEE??BD?D@DADDDDBDDD@FGHFHFHIHGI@?DGC@CF NH:i:7 HI:i:4 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:1:1105:1515:82248 272 1 14802 0 28M140N23M * 0 0 CCAGCCCCAGGTCCTTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTG ??:ADBDDDDD:A<+C?AFDB@E?F4<*?:?1:??):??0009??9?(8BC NH:i:7 HI:i:4 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:1110:16355:5537 272 1 14802 0 28M140N23M * 0 0 CCAGCCCCAGGTCCTTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTG @CCFFFFFHH?ADHGIJIJJJJJIIEHIJJJJJIJIGIIJJIJJIIJIJJJ NH:i:7 HI:i:4 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1102:17802:20689 272 1 14805 0 25M140N26M * 0 0 GCTCCAGGTCCTTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTGTTG CCCFFFFFHHHHHJJJJJJIJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJI NH:i:7 HI:i:4 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:2:1104:7670:95815 272 1 14805 0 25M140N26M * 0 0 GCCCCAGGTCCTTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTGTTG @@@DBDDDHHBFDBFGEBBGHG@HIBHIDHBGGGEFBDDDFDGBBBGCHHI NH:i:7 HI:i:4 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1110:11368:101298 272 1 14805 0 25M140N26M * 0 0 GCCCCAGGTCCTTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTGTTG BCCFFFFFCFHHHJJJJJIJJJJJJJJJJJJJGJJJJJJJJJJJJJJJIJJ NH:i:7 HI:i:4 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1115:2363:85646 272 1 14805 0 25M140N26M * 0 0 GCTCCAGGTCCTTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTGTTG @C@FFFB?CFDFHDHGIIIIEGIIIIEDGIIIIIIIIIGGIIGIIGCGHIH NH:i:7 HI:i:4 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:2:2213:6044:80821 272 1 14805 0 25M140N26M * 0 0 GCTCCGGGTCCTTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTGTTG @@@FFFFFFFBFDGIIJIJGGFHIIIJIIJGIIEHICHIGEGFG?FGHGA>9B8BF@ NH:i:7 HI:i:4 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1215:4185:31561 272 1 14815 0 15M140N36M * 0 0 CTTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTGTTGAAGAGATCCG CCCFFFFFHHHHGJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIJJJH NH:i:7 HI:i:4 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:2108:1506:70629 272 1 14816 0 14M140N37M * 0 0 TTTCCCAGAGATGCCCTTGCGCCTCATGACCAGCTTGTTGAAGAGATCCGA ?@@;BDDD=DFFDDDFGGFCA?)1@F?F+AAEEEBFFIIF@DE4= NH:i:8 HI:i:2 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:1:1108:6828:32713 272 1 15003 0 36M757N15M * 0 0 CCGGCATCAAGTCCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT ?@@ADDDDD?CDD:CFB@:@G@ABGFGFGFBFEAFEEEFCFCF@F=)8=@> NH:i:8 HI:i:2 AS:i:45 nM:i:2 +HWI-C00113:131:HMHYWADXX:1:1111:7491:39504 272 1 15003 0 36M757N15M * 0 0 CCGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT CCCFFDFFFHHHFIGEGHIGIGGDGIJFHEHGGIJJJIJIJJJJJIIIIGI NH:i:8 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:1212:16079:85811 272 1 15003 0 36M757N15M * 0 0 CCGGCATCAAGTCCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT @CCFFFFFHGHHHJJJJJJJIIJJJJJIJIJJHIIJJJJIJJJJJJJIJJJ NH:i:8 HI:i:2 AS:i:45 nM:i:2 +HWI-C00113:131:HMHYWADXX:1:2101:7167:50357 272 1 15003 0 36M757N15M * 0 0 CCGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT @@@DD?DDFHHHD@?CG?FHGIIIIG@??BGHIE;8@BFEG NH:i:8 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1211:4828:84953 272 1 15003 0 36M757N15M * 0 0 CCGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT @BB?DFFFHHHHHIJIJJJJJJJJJJJHIJJIIJJJJJJIIIJJJJJJIJI NH:i:8 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:2107:20905:80208 272 1 15003 0 36M757N15M * 0 0 CCGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT @CCFFFFFHHHFBHIIEIIDIHGGGGG@GGHCFGHIIJIGGGGIJIGIGGH NH:i:8 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:2112:6263:84991 272 1 15003 0 36M757N15M * 0 0 CCGACATCAAGTCCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT @@@?DDDDFBH?FHIGIGIIGG;GHBGCD?DCGIIGHEGBBFHGGIHBFIG NH:i:8 HI:i:2 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:2:2202:10314:26844 272 1 15003 0 36M757N15M * 0 0 CCGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT CCCFFFFFHHHHHJJJJJJJJJJJJJJIJJJJIIJJJJJJJJJJJJJJJJJ NH:i:8 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:2213:21028:90280 272 1 15003 0 36M757N15M * 0 0 CCGACATCAAGTCCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCT @@@BDDDAD?FDF9GIBB@@FFG3CFF:DD)?BD*9D@@F4BDEEEFFF8= NH:i:8 HI:i:2 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:1:1216:14847:22529 272 1 15004 0 35M757N16M * 0 0 CGACATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCTT @@@FFFFDHHBDHIIIJJJJIIIIIIJJIJJGIJIFIJJIDHHGBEHIJJJ NH:i:8 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:2111:14281:81135 272 1 15007 0 32M757N19M * 0 0 CATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCTTCTG @@@DDDBD42=:ACFFIE?FFGAFF@FFFDGEAG>D@DBB9BC3D@EDFFA NH:i:8 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:2203:4824:93169 272 1 15008 0 31M757N20M * 0 0 ATCAAGTGCCCACCTTGGCTCGTGGCTCTCACTTGCTCCTGCTCCTTCTGC CCCFFFFFHHHHHJJJJIJJJJHIJIJJJJJJJJGIJJJJI?DFGFHIHJF NH:i:8 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:1112:17298:87937 272 1 15925 1 23M659N28M * 0 0 CACTTCCCTGGGAGCTCCCTGGACTGAAGGAGACGCGCTGCTGCTGCTGTC ?@;;BA;3ABC?C?6EGDGIIBA+AACACD>>:9:??2< NH:i:6 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:2109:14386:93817 272 1 16728 0 38M92N13M * 0 0 GGGCGGTGGGGGTGGTGTTAGTACCCCATCTTGTAGGTCTTGAGAGGCTCG @CCFFFDDHHHHDHIFHIJJJGHHIIJHHHHHHFFFFEFEEEECDDDDDDB NH:i:6 HI:i:2 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:2203:14322:7218 272 1 16741 0 25M110N26M * 0 0 GGTGTTAGTACCCCATCTTGTAGGTCTCAGTGTGGAAGGTGGGCAGTTCTG ?@?DDD?BFFHHFB7EFGGGEFHIHADB8D>822BDG?FHBGEH?FHGG3 NH:i:6 HI:i:1 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:2116:7403:96086 272 1 17020 0 36M177N15M * 0 0 GCCCAGGTCTGGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTG :?=DDD=AAAC:+BDIIIIIIA? NH:i:7 HI:i:5 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1209:11002:81132 272 1 17020 0 36M177N15M * 0 0 GCCCGGGTCTGGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTG @@@DD@A<@DDDF;BCGF<4CHCEG?EG@FGF9)?BB:?B?DBF>D?**9B NH:i:7 HI:i:4 AS:i:47 nM:i:1 +HWI-C00113:131:HMHYWADXX:2:1115:8064:78307 272 1 17021 0 35M177N16M * 0 0 CCCTGGTCTGGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGC 11844BBDD=FDFEFFFDFI?HEHAFBEHEEEFC?E:FDGDDDH9CBEHHHEEFB?F>GD@3?FB?BB@ NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1101:15891:42282 272 1 17028 0 28M177N23M * 0 0 CTGGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCT CCCFFFFFHHHHHJHHIIJJJJJJJJJJIIJJJJIJJJIJJJJJJJJJJJJ NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:1107:10929:6659 272 1 17030 0 26M177N25M * 0 0 GGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTG CCCFFFFFHHHHDHIHHJJGJJJJJJJIJJIJGIJJJIJJJIJJJJJIJJG NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:1114:7098:71178 272 1 17030 0 26M177N25M * 0 0 GGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTG =?@BDEEFHBDHFBGIEGIHEHIGDHGEIIJIIIEHIHIIGHDGHIGIIH@ NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:1209:3383:100724 272 1 17030 0 26M177N25M * 0 0 GGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTG ?@@ADDDDDHDH?EEFHEHIGIIGHGHIFII>BFIH? NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:2111:3771:31345 272 1 17030 0 26M177N25M * 0 0 GGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTG @@@DFFFFGHDHHHJGIHJJJJGIJJIJIJIIJJIIJJIGHIJJJIJJIJ< NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:2205:14794:36455 272 1 17030 0 26M177N25M * 0 0 GGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTG CCCFFFFFHHHHHIJJJJJJJJJJJJJJJJJJIJJJJIJJIJJJJJJJJJJ NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1107:19701:64552 272 1 17030 0 26M177N25M * 0 0 GGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTG CCCFFDFFHHHHDGIIJIJJJIIJDGHGJJJJJJIJJJJJJJGIJJJJJJF NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1210:18711:88303 272 1 17030 0 26M177N25M * 0 0 GGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTG CCCFFFFFHHHHHJJJJJJJJIJFIJJJEIIHIIJJIIJJGJJJIJJJJJE NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:2212:19113:15559 272 1 17030 0 26M177N25M * 0 0 GGCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTG @@@7B>DDC=@BFBGBAFCGBFDB@DHIHIDD>@@GHID NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1212:15591:47491 272 1 17031 0 25M177N26M * 0 0 GCACATAGAAGTAGTTCTCTGGGACCTGCTGTTCCAGCTGCTCTCTCTTGC @@C+ADDDDHFFDEGEGIIIDFHIFHIIIIIGEHIIBH>FGGGHGHFGGII NH:i:7 HI:i:6 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:2215:10125:81395 272 1 17031 0 25M859N26M * 0 0 GCACATAGAAGTAGTTCTCTGGGACCTGCAGGGCCCGCTCGTCCAGGGGGC CCCFFFFFGHHHHJJJJJJJJJHJJJJJJIJIIJJJHIJJJJJJJJJIJHE NH:i:6 HI:i:1 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:2102:9065:90529 16 1 17033 0 2S23M550N26M * 0 0 GTACATAGAAGTAGTTCTCTGGGACAGGTTCTCGGTGGTGTTGAAGAGCAG C@CFFFFFHHHHHJJJJJJJJJJJJJJJJJJJJJJFHIFHIJIJJJJJJJJ NH:i:5 HI:i:2 AS:i:47 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:2204:7767:77376 16 1 17033 0 2S23M550N26M * 0 0 GTACATAGAAGTAGTTCTCTGGGACAGGTTCTCGGTGGTGTTGAAGAGCAG @@@FDFDDBFHADEHEIGIGIJIGHIHG?EDGHGGCFH:B?BD@FGFHGIH NH:i:5 HI:i:2 AS:i:47 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1212:6793:42000 16 1 17033 0 2S23M550N26M * 0 0 GTACATAGAAGTAGTTCTCTGGGACAGGTTCTCGGTGGTGTTGAAGAGCAG @@?DADBD8CFADGFHIIIIE3A9?DH?FHGHH@EHGIEHGGIIIGGHIGHGFDEHGH=FHGIIH NH:i:3 HI:i:1 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:2207:3786:78354 16 1 17340 1 29M237N22M * 0 0 GGGGGTCCAGGAAGACATACTTCTTCTACAGGTTCTCGGTGGTGTTGAAGA CCCFFFFFHHHHHJJJJJIIJJJJJJJJJJJJHHIJIHHBFIHIIJJJJJI NH:i:3 HI:i:1 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:1:1115:8438:81914 16 1 17341 1 28M237N23M * 0 0 GGGGTCCAGGAAGACATACTTCTTCTACAGGTTCTCGGTGGTGTTGAAGAG @@CFFFFDHH?HDGGHIIGIGHIGHGIDIIIFGIIGHHDG:?DFHEHIIII NH:i:3 HI:i:1 AS:i:49 nM:i:0 +HWI-C00113:131:HMHYWADXX:2:1114:13486:49038 16 1 17341 1 28M237N23M * 0 0 GGGGTCCAGGAAGACATACTTCTTCTACAGGTTCTCGGTGGTGTTGAAGAG ?@@:D@DDFHAFFHGGFHFHH@CCHIIIII@:CFGFGGC?D)?8DHHGCGI NH:i:3 HI:i:1 AS:i:49 nM:i:0 diff --git a/tests/pysam_data/example_aligned_pairs.sam b/tests/pysam_data/example_aligned_pairs.sam new file mode 100644 index 0000000..e6f9830 --- /dev/null +++ b/tests/pysam_data/example_aligned_pairs.sam @@ -0,0 +1,81 @@ +@HD VN:1.0 GO:none SO:coordinate +@SQ SN:chrM LN:16571 +@SQ SN:chr1 LN:249250621 +@SQ SN:chr2 LN:243199373 +@SQ SN:chr3 LN:198022430 +@SQ SN:chr4 LN:191154276 +@SQ SN:chr5 LN:180915260 +@SQ SN:chr6 LN:171115067 +@SQ SN:chr7 LN:159138663 +@SQ SN:chr8 LN:146364022 +@SQ SN:chr9 LN:141213431 +@SQ SN:chr10 LN:135534747 +@SQ SN:chr11 LN:135006516 +@SQ SN:chr12 LN:133851895 +@SQ SN:chr13 LN:115169878 +@SQ SN:chr14 LN:107349540 +@SQ SN:chr15 LN:102531392 +@SQ SN:chr16 LN:90354753 +@SQ SN:chr17 LN:81195210 +@SQ SN:chr18 LN:78077248 +@SQ SN:chr19 LN:59128983 +@SQ SN:chr20 LN:63025520 +@SQ SN:chr21 LN:48129895 +@SQ SN:chr22 LN:51304566 +@SQ SN:chrX LN:155270560 +@SQ SN:chrY LN:59373566 +@RG ID:FC1_NA12892_03 PL:ILLUMINA SM:FC1_NA12892_03 +@PG ID:bwa PN:bwa VN:0.7.7-isis-1.0.0 +@PG ID:GATK IndelRealigner VN:1.6-23-gf0210b3 CL:knownAlleles=[] targetIntervals=/data/scratch/workspace/RunFolder/Data/Intensities/BaseCalls/Alignment/FC1-NA12892-03_S1_chrM.intervals LODThresholdForCleaning=5.0 consensusDeterminationModel=USE_READS entropyThreshold=0.15 maxReadsInMemory=150000 maxIsizeForMovement=3000 maxPositionalMoveAllowed=200 maxConsensuses=30 maxReadsForConsensuses=120 maxReadsForRealignment=20000 noOriginalAlignmentTags=false nWayOut=null generate_nWayOut_md5s=false check_early=false noPGTag=false keepPGTags=false indelsFileForDebugging=null statisticsFileForDebugging=null SNPsFileForDebugging=null +D0004:230:H08B1ADXX:1:1204:18619:71946 163 chr22 16084109 27 149M = 16084228 268 GTGCAGGCATGGAGATTCTGGGGTGAATCTGCTGAGTTTAAAAGCTTCCTTTGGAGATGCCCCTGGCCCCCTCCACCTGTCAAGAAGAGGCCATCCTATCTGCCTGTCAAGAAGAGGCCATCCTGGGCAGCACAGTAGAGGCAAATGGC BBBFFBFFFFFFFFFIFIFIFFI0BBFIFIIIIIFFFFIFIIIFFBIFIIIIFI>>>>>>====>=>>;:8,,((1*0536;;=<>;:;>>>>>>>>>>>>>>>>>>>><9=556.2<<<8===<<<9;9=>=>>>>>>>>>>>>>>>>.>>>===>>>>>>>4=>>==;<<896=>===<>>588-1.19<= RG:Z:QW85I PG:Z:tmap MD:Z:140 NM:i:0 AS:i:140 FZ:B:S,100,1,91,0,7,101,0,201,96,204,0,0,87,109,0,7,97,112,1,12,78,197,0,7,100,95,101,202,0,6,0,1,186,0,84,0,244,0,0,324,0,107,195,101,113,0,102,0,104,3,0,101,1,0,212,6,0,0,1,0,74,1,11,0,196,2,197,103,0,108,98,2,7,0,1,2,194,0,180,0,108,0,203,104,16,5,205,0,0,0,1,1,100,98,0,0,204,6,0,79,0,0,101,7,109,90,265,1,27,10,109,102,9,0,292,0,110,0,0,102,112,0,0,84,100,103,2,81,126,0,2,90,0,15,96,15,1,0,2,0,107,92,0,0,101,3,98,15,102,13,116,116,90,93,198,0,0,0,199,92,26,495,100,5,0,100,5,209,0,92,107,90,0,0,0,0,109,194,7,94,200,0,40,197,0,11,0,0,112,110,6,4,200,28,0,196,0,203,1,129,0,0,1,0,94,0,1,0,107,5,201,3,3,100,0,121,0,7,0,1,105,306,3,86,8,183,0,12,163,17,83,22,0,0,1,8,109,103,0,0,295,0,200,16,172,3,16,182,3,11,0,0,223,111,103,0,5,225,0,95 XA:Z:map2-1 XS:i:53 XT:i:38 XF:i:1 XE:i:0 +QW85I:468:729 0 chr1 156268499 63 140M15H * 0 0 GTCCAGTCTCCTGTAATTCTTGGGCTTGACTAGGCTTCCGACAACCTGGAGGCATTGCTCTTTCAGGGTATACACTGCAGTGTGATGTTGGCAAAAACAGGCTGTCCATTAACATTGGAAGATGGCACAAACAATTCAGT >>>>>>>====>=>>;:8,,((1*0536;;=<>;:;>>>>>>>>>>>>>>>>>>>><9=556.2<<<8===<<<9;9=>=>>>>>>>>>>>>>>>>.>>>===>>>>>>>4=>>==;<<896=>===<>>588-1.19<= RG:Z:QW85I PG:Z:tmap MD:Z:140 NM:i:0 AS:i:140 FZ:B:s,-100,200,-300,-400 XA:Z:map2-1 XS:i:53 XT:i:38 XF:i:1 XE:i:0 +QW85I:468:729 0 chr1 156268499 63 140M15H * 0 0 GTCCAGTCTCCTGTAATTCTTGGGCTTGACTAGGCTTCCGACAACCTGGAGGCATTGCTCTTTCAGGGTATACACTGCAGTGTGATGTTGGCAAAAACAGGCTGTCCATTAACATTGGAAGATGGCACAAACAATTCAGT >>>>>>>====>=>>;:8,,((1*0536;;=<>;:;>>>>>>>>>>>>>>>>>>>><9=556.2<<<8===<<<9;9=>=>>>>>>>>>>>>>>>>.>>>===>>>>>>>4=>>==;<<896=>===<>>588-1.19<= RG:Z:QW85I PG:Z:tmap MD:Z:140 NM:i:0 AS:i:140 FZ:B:c,-100,12 XA:Z:map2-1 XS:i:53 XT:i:38 XF:i:1 XE:i:0 +QW85I:468:729 0 chr1 156268499 63 140M15H * 0 0 GTCCAGTCTCCTGTAATTCTTGGGCTTGACTAGGCTTCCGACAACCTGGAGGCATTGCTCTTTCAGGGTATACACTGCAGTGTGATGTTGGCAAAAACAGGCTGTCCATTAACATTGGAAGATGGCACAAACAATTCAGT >>>>>>>====>=>>;:8,,((1*0536;;=<>;:;>>>>>>>>>>>>>>>>>>>><9=556.2<<<8===<<<9;9=>=>>>>>>>>>>>>>>>>.>>>===>>>>>>>4=>>==;<<896=>===<>>588-1.19<= RG:Z:QW85I PG:Z:tmap MD:Z:140 NM:i:0 AS:i:140 FZ:B:C,12,15 XA:Z:map2-1 XS:i:53 XT:i:38 XF:i:1 XE:i:0 +QW85I:468:729 0 chr1 156268499 63 140M15H * 0 0 GTCCAGTCTCCTGTAATTCTTGGGCTTGACTAGGCTTCCGACAACCTGGAGGCATTGCTCTTTCAGGGTATACACTGCAGTGTGATGTTGGCAAAAACAGGCTGTCCATTAACATTGGAAGATGGCACAAACAATTCAGT >>>>>>>====>=>>;:8,,((1*0536;;=<>;:;>>>>>>>>>>>>>>>>>>>><9=556.2<<<8===<<<9;9=>=>>>>>>>>>>>>>>>>.>>>===>>>>>>>4=>>==;<<896=>===<>>588-1.19<= RG:Z:QW85I PG:Z:tmap MD:Z:140 NM:i:0 AS:i:140 FZ:B:f,-1.0,5.0,2.5 XA:Z:map2-1 XS:i:53 XT:i:38 XF:i:1 XE:i:0 diff --git a/tests/pysam_data/example_dash_in_chr.sam b/tests/pysam_data/example_dash_in_chr.sam new file mode 100644 index 0000000..c2a0a1e --- /dev/null +++ b/tests/pysam_data/example_dash_in_chr.sam @@ -0,0 +1,7 @@ +@HD VN:1.0 +@SQ SN:chr-1 LN:1575 +@SQ SN:chr2 LN:1584 +@CO this is a comment +@CO this is another comment +read_28833_29006_6945 99 chr-1 33 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 RG:Z:L1 PG:Z:P1 XT:A:U +read_28701_28881_323b 147 chr2 88 30 35M = 500 412 ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA <<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<< MF:i:18 RG:Z:L2 PG:Z:P2 XT:A:R diff --git a/tests/pysam_data/example_empty_header.sam b/tests/pysam_data/example_empty_header.sam new file mode 100644 index 0000000..b1a3ca5 --- /dev/null +++ b/tests/pysam_data/example_empty_header.sam @@ -0,0 +1,321 @@ +@SQ SN:chr1 LN:1000 +XXX0000 0 chr1 100 170 171M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTC * AS:i:170 MS:i:50 +XXX0001 0 chr1 100 255 284M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGT * AS:i:283 MS:i:50 +XXX0002 0 chr1 100 205 206M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGA * AS:i:205 MS:i:50 +XXX0003 0 chr1 100 212 213M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCC * AS:i:212 MS:i:50 +XXX0004 0 chr1 100 208 209M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGG * AS:i:208 MS:i:50 +XXX0005 0 chr1 100 245 245M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGG * AS:i:245 MS:i:50 +XXX0006 0 chr1 100 251 251M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATC * AS:i:251 MS:i:50 +XXX0007 0 chr1 100 255 257M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAA * AS:i:257 MS:i:50 +XXX0008 0 chr1 100 255 285M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTT * AS:i:284 MS:i:50 +XXX0009 0 chr1 100 255 261M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTA * AS:i:261 MS:i:50 +XXX0010 0 chr1 100 255 289M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCG * AS:i:288 MS:i:50 +XXX0011 0 chr1 100 173 174M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCG * AS:i:173 MS:i:50 +XXX0012 0 chr1 100 255 265M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCC * AS:i:265 MS:i:50 +XXX0013 0 chr1 100 255 293M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATC * AS:i:292 MS:i:50 +XXX0014 0 chr1 100 166 167M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGA * AS:i:166 MS:i:50 +XXX0015 0 chr1 100 247 247M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAA * AS:i:247 MS:i:50 +XXX0016 0 chr1 100 255 295M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCA * AS:i:294 MS:i:50 +XXX0017 0 chr1 100 210 211M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTC * AS:i:210 MS:i:50 +XXX0018 0 chr1 100 235 236M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTG * AS:i:235 MS:i:50 +XXX0019 0 chr1 100 195 196M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCC * AS:i:195 MS:i:50 +XXX0020 0 chr1 100 178 179M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGG * AS:i:178 MS:i:50 +XXX0021 0 chr1 100 255 259M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGG * AS:i:259 MS:i:50 +XXX0022 0 chr1 100 238 239M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACT * AS:i:238 MS:i:50 +XXX0023 0 chr1 100 255 272M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCAC * AS:i:272 MS:i:50 +XXX0024 0 chr1 100 255 257M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAA * AS:i:257 MS:i:50 +XXX0025 0 chr1 100 255 268M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCA * AS:i:268 MS:i:50 +XXX0026 0 chr1 100 201 202M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGG * AS:i:201 MS:i:50 +XXX0027 0 chr1 100 180 181M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGT * AS:i:180 MS:i:50 +XXX0028 0 chr1 100 153 154M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCG * AS:i:153 MS:i:50 +XXX0029 0 chr1 100 255 280M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGA * AS:i:279 MS:i:50 +XXX0030 0 chr1 100 255 275M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCC * AS:i:274 MS:i:50 +XXX0031 0 chr1 100 255 259M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGG * AS:i:259 MS:i:50 +XXX0032 0 chr1 100 229 230M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCC * AS:i:229 MS:i:50 +XXX0033 0 chr1 100 229 230M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCC * AS:i:229 MS:i:50 +XXX0034 0 chr1 100 172 173M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGC * AS:i:172 MS:i:50 +XXX0035 0 chr1 100 246 246M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGA * AS:i:246 MS:i:50 +XXX0036 0 chr1 100 187 188M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACT * AS:i:187 MS:i:50 +XXX0037 0 chr1 100 189 190M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTG * AS:i:189 MS:i:50 +XXX0038 0 chr1 100 192 193M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTC * AS:i:192 MS:i:50 +XXX0039 0 chr1 100 221 222M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAA * AS:i:221 MS:i:50 +XXX0040 0 chr1 100 186 187M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCAC * AS:i:186 MS:i:50 +XXX0041 0 chr1 100 185 186M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCA * AS:i:185 MS:i:50 +XXX0042 0 chr1 100 255 299M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACT * AS:i:298 MS:i:50 +XXX0043 0 chr1 100 156 157M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTT * AS:i:156 MS:i:50 +XXX0044 0 chr1 100 255 270M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACC * AS:i:270 MS:i:50 +XXX0045 0 chr1 100 206 207M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGAC * AS:i:206 MS:i:50 +XXX0046 0 chr1 100 255 262M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAA * AS:i:262 MS:i:50 +XXX0047 0 chr1 100 249 249M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGA * AS:i:249 MS:i:50 +XXX0048 0 chr1 100 226 226M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGT * AS:i:226 MS:i:50 +XXX0049 0 chr1 100 233 234M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACG * AS:i:233 MS:i:50 +XXX0050 0 chr1 100 162 163M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGT * AS:i:162 MS:i:50 +XXX0051 0 chr1 100 242 242M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATA * AS:i:242 MS:i:50 +XXX0052 0 chr1 100 255 288M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCC * AS:i:287 MS:i:50 +XXX0053 0 chr1 100 255 267M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCC * AS:i:267 MS:i:50 +XXX0054 0 chr1 100 196 197M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCA * AS:i:196 MS:i:50 +XXX0055 0 chr1 100 236 237M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGA * AS:i:236 MS:i:50 +XXX0056 0 chr1 100 223 223M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAA * AS:i:223 MS:i:50 +XXX0057 0 chr1 100 171 172M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCG * AS:i:171 MS:i:50 +XXX0058 0 chr1 100 178 179M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGG * AS:i:178 MS:i:50 +XXX0059 0 chr1 100 255 269M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCAC * AS:i:269 MS:i:50 +XXX0060 0 chr1 100 195 196M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCC * AS:i:195 MS:i:50 +XXX0061 0 chr1 100 212 213M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCC * AS:i:212 MS:i:50 +XXX0062 0 chr1 100 255 258M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAG * AS:i:258 MS:i:50 +XXX0063 0 chr1 100 157 158M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTC * AS:i:157 MS:i:50 +XXX0064 0 chr1 100 173 174M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCG * AS:i:173 MS:i:50 +XXX0065 0 chr1 100 178 179M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGG * AS:i:178 MS:i:50 +XXX0066 0 chr1 100 186 187M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCAC * AS:i:186 MS:i:50 +XXX0067 0 chr1 100 255 290M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGG * AS:i:289 MS:i:50 +XXX0068 0 chr1 100 238 239M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACT * AS:i:238 MS:i:50 +XXX0069 0 chr1 100 176 177M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAG * AS:i:176 MS:i:50 +XXX0070 0 chr1 100 255 288M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCC * AS:i:287 MS:i:50 +XXX0071 0 chr1 100 206 207M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGAC * AS:i:206 MS:i:50 +XXX0072 0 chr1 100 224 224M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAA * AS:i:224 MS:i:50 +XXX0073 0 chr1 100 218 219M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTA * AS:i:218 MS:i:50 +XXX0074 0 chr1 100 237 238M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGAC * AS:i:237 MS:i:50 +XXX0075 0 chr1 100 250 250M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGAT * AS:i:250 MS:i:50 +XXX0076 0 chr1 100 255 265M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCC * AS:i:265 MS:i:50 +XXX0077 0 chr1 100 255 264M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGC * AS:i:264 MS:i:50 +XXX0078 0 chr1 100 242 242M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATA * AS:i:242 MS:i:50 +XXX0079 0 chr1 100 159 160M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTT * AS:i:159 MS:i:50 +XXX0080 0 chr1 100 248 248M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAG * AS:i:248 MS:i:50 +XXX0081 0 chr1 100 253 253M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCA * AS:i:253 MS:i:50 +XXX0082 0 chr1 100 199 200M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAA * AS:i:199 MS:i:50 +XXX0083 0 chr1 100 168 169M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATT * AS:i:168 MS:i:50 +XXX0084 0 chr1 100 249 249M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGA * AS:i:249 MS:i:50 +XXX0085 0 chr1 100 255 268M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCA * AS:i:268 MS:i:50 +XXX0086 0 chr1 100 255 298M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACAC * AS:i:297 MS:i:50 +XXX0087 0 chr1 100 229 230M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCC * AS:i:229 MS:i:50 +XXX0088 0 chr1 100 255 278M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCA * AS:i:277 MS:i:50 +XXX0089 0 chr1 100 198 199M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAA * AS:i:198 MS:i:50 +XXX0090 0 chr1 100 255 273M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACC * AS:i:272 MS:i:50 +XXX0091 0 chr1 100 182 183M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGA * AS:i:182 MS:i:50 +XXX0092 0 chr1 100 211 212M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCC * AS:i:211 MS:i:50 +XXX0093 0 chr1 100 207 208M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACG * AS:i:207 MS:i:50 +XXX0094 0 chr1 100 221 222M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAA * AS:i:221 MS:i:50 +XXX0095 0 chr1 100 177 178M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGG * AS:i:177 MS:i:50 +XXX0096 0 chr1 100 255 289M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCG * AS:i:288 MS:i:50 +XXX0097 0 chr1 100 255 276M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCT * AS:i:275 MS:i:50 +XXX0098 0 chr1 100 237 238M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGAC * AS:i:237 MS:i:50 +XXX0099 0 chr1 100 255 273M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACC * AS:i:272 MS:i:50 +XXX0100 0 chr1 100 255 264M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGC * AS:i:264 MS:i:50 +XXX0101 0 chr1 100 255 285M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTT * AS:i:284 MS:i:50 +XXX0102 0 chr1 100 233 234M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACG * AS:i:233 MS:i:50 +XXX0103 0 chr1 100 237 238M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGAC * AS:i:237 MS:i:50 +XXX0104 0 chr1 100 214 215M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCAT * AS:i:214 MS:i:50 +XXX0105 0 chr1 100 154 155M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGT * AS:i:154 MS:i:50 +XXX0106 0 chr1 100 181 182M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTG * AS:i:181 MS:i:50 +XXX0107 0 chr1 100 255 265M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCC * AS:i:265 MS:i:50 +XXX0108 0 chr1 100 255 259M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGG * AS:i:259 MS:i:50 +XXX0109 0 chr1 100 186 187M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCAC * AS:i:186 MS:i:50 +XXX0110 0 chr1 100 172 173M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGC * AS:i:172 MS:i:50 +XXX0111 0 chr1 100 155 156M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTT * AS:i:155 MS:i:50 +XXX0112 0 chr1 100 209 210M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGT * AS:i:209 MS:i:50 +XXX0113 0 chr1 100 255 257M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAA * AS:i:257 MS:i:50 +XXX0114 0 chr1 100 255 260M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGT * AS:i:260 MS:i:50 +XXX0115 0 chr1 100 195 196M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCC * AS:i:195 MS:i:50 +XXX0116 0 chr1 100 200 201M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAG * AS:i:200 MS:i:50 +XXX0117 0 chr1 100 255 271M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCA * AS:i:271 MS:i:50 +XXX0118 0 chr1 100 255 297M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACA * AS:i:296 MS:i:50 +XXX0119 0 chr1 100 163 164M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTA * AS:i:163 MS:i:50 +XXX0120 0 chr1 100 255 256M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGA * AS:i:256 MS:i:50 +XXX0121 0 chr1 100 255 284M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGT * AS:i:283 MS:i:50 +XXX0122 0 chr1 100 176 177M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAG * AS:i:176 MS:i:50 +XXX0123 0 chr1 100 251 251M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATC * AS:i:251 MS:i:50 +XXX0124 0 chr1 100 255 260M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGT * AS:i:260 MS:i:50 +XXX0125 0 chr1 100 255 285M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTT * AS:i:284 MS:i:50 +XXX0126 0 chr1 100 201 202M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGG * AS:i:201 MS:i:50 +XXX0127 0 chr1 100 165 166M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACG * AS:i:165 MS:i:50 +XXX0128 0 chr1 100 255 279M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAG * AS:i:278 MS:i:50 +XXX0129 0 chr1 100 165 166M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACG * AS:i:165 MS:i:50 +XXX0130 0 chr1 100 204 205M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGG * AS:i:204 MS:i:50 +XXX0131 0 chr1 100 199 200M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAA * AS:i:199 MS:i:50 +XXX0132 0 chr1 100 208 209M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGG * AS:i:208 MS:i:50 +XXX0133 0 chr1 100 209 210M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGT * AS:i:209 MS:i:50 +XXX0134 0 chr1 100 183 184M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGAT * AS:i:183 MS:i:50 +XXX0135 0 chr1 100 255 266M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCC * AS:i:266 MS:i:50 +XXX0136 0 chr1 100 255 293M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATC * AS:i:292 MS:i:50 +XXX0137 0 chr1 100 255 285M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTT * AS:i:284 MS:i:50 +XXX0138 0 chr1 100 219 220M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAG * AS:i:219 MS:i:50 +XXX0139 0 chr1 100 247 247M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAA * AS:i:247 MS:i:50 +XXX0140 0 chr1 100 192 193M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTC * AS:i:192 MS:i:50 +XXX0141 0 chr1 100 255 261M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTA * AS:i:261 MS:i:50 +XXX0142 0 chr1 100 212 213M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCC * AS:i:212 MS:i:50 +XXX0143 0 chr1 100 255 276M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCT * AS:i:275 MS:i:50 +XXX0144 0 chr1 100 177 178M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGG * AS:i:177 MS:i:50 +XXX0145 0 chr1 100 179 180M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGG * AS:i:179 MS:i:50 +XXX0146 0 chr1 100 255 263M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAG * AS:i:263 MS:i:50 +XXX0147 0 chr1 100 255 272M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCAC * AS:i:272 MS:i:50 +XXX0148 0 chr1 100 255 299M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACT * AS:i:298 MS:i:50 +XXX0149 0 chr1 100 255 274M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCC * AS:i:273 MS:i:50 +XXX0150 0 chr1 100 255 300M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTC * AS:i:299 MS:i:50 +XXX0151 0 chr1 100 157 158M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTC * AS:i:157 MS:i:50 +XXX0152 0 chr1 100 161 162M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTG * AS:i:161 MS:i:50 +XXX0153 0 chr1 100 202 203M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGC * AS:i:202 MS:i:50 +XXX0154 0 chr1 100 171 172M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCG * AS:i:171 MS:i:50 +XXX0155 0 chr1 100 183 184M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGAT * AS:i:183 MS:i:50 +XXX0156 0 chr1 100 255 286M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTG * AS:i:285 MS:i:50 +XXX0157 0 chr1 100 255 257M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAA * AS:i:257 MS:i:50 +XXX0158 0 chr1 100 255 275M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCC * AS:i:274 MS:i:50 +XXX0159 0 chr1 100 255 276M * 0 0 CCTCTTTTATAGCAGCATGAACCCGTCGGTTTTAAACACGGTGTCAGCGGTGGCCTCGGAAGTATGGCCCATTCGCGAACGATGCCGTCCCTTTCAAGACACCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCT * AS:i:275 MS:i:50 +XXX0174 16 chr1 201 255 300M * 0 0 CCTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:298 MS:i:50 +XXX0238 16 chr1 202 255 299M * 0 0 CTGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:297 MS:i:50 +XXX0286 16 chr1 203 255 298M * 0 0 TGAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:296 MS:i:50 +XXX0249 16 chr1 204 255 297M * 0 0 GAGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:295 MS:i:50 +XXX0201 16 chr1 205 255 296M * 0 0 AGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:294 MS:i:50 +XXX0225 16 chr1 205 255 296M * 0 0 AGACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:294 MS:i:50 +XXX0265 16 chr1 206 255 295M * 0 0 GACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:293 MS:i:50 +XXX0182 16 chr1 207 255 294M * 0 0 ACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:292 MS:i:50 +XXX0275 16 chr1 207 255 294M * 0 0 ACACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:292 MS:i:50 +XXX0168 16 chr1 209 255 292M * 0 0 ACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:290 MS:i:50 +XXX0208 16 chr1 209 255 292M * 0 0 ACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:290 MS:i:50 +XXX0264 16 chr1 209 255 292M * 0 0 ACGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:290 MS:i:50 +XXX0258 16 chr1 210 255 291M * 0 0 CGGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:289 MS:i:50 +XXX0226 16 chr1 211 255 290M * 0 0 GGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:288 MS:i:50 +XXX0228 16 chr1 211 255 290M * 0 0 GGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:288 MS:i:50 +XXX0263 16 chr1 211 255 290M * 0 0 GGGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:288 MS:i:50 +XXX0205 16 chr1 212 255 289M * 0 0 GGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:287 MS:i:50 +XXX0276 16 chr1 212 255 289M * 0 0 GGATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:287 MS:i:50 +XXX0192 16 chr1 213 255 288M * 0 0 GATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:286 MS:i:50 +XXX0298 16 chr1 213 255 288M * 0 0 GATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:286 MS:i:50 +XXX0196 16 chr1 214 255 287M * 0 0 ATCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:285 MS:i:50 +XXX0291 16 chr1 215 255 286M * 0 0 TCTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:284 MS:i:50 +XXX0245 16 chr1 216 255 285M * 0 0 CTTTATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:283 MS:i:50 +XXX0284 16 chr1 220 255 281M * 0 0 ATCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:278 MS:i:50 +XXX0227 16 chr1 221 255 280M * 0 0 TCGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:277 MS:i:50 +XXX0166 16 chr1 222 255 279M * 0 0 CGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:276 MS:i:50 +XXX0294 16 chr1 222 255 279M * 0 0 CGCCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:276 MS:i:50 +XXX0300 16 chr1 224 255 277M * 0 0 CCCGTGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:274 MS:i:50 +XXX0212 16 chr1 228 255 273M * 0 0 TGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:271 MS:i:50 +XXX0313 16 chr1 228 255 273M * 0 0 TGAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:271 MS:i:50 +XXX0318 16 chr1 229 255 272M * 0 0 GAGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:270 MS:i:50 +XXX0193 16 chr1 230 255 271M * 0 0 AGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:268 MS:i:50 +XXX0315 16 chr1 230 255 271M * 0 0 AGACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:268 MS:i:50 +XXX0211 16 chr1 231 255 270M * 0 0 GACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:267 MS:i:50 +XXX0295 16 chr1 231 255 270M * 0 0 GACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:267 MS:i:50 +XXX0235 16 chr1 232 255 269M * 0 0 ACCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:266 MS:i:50 +XXX0170 16 chr1 233 255 268M * 0 0 CCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:265 MS:i:50 +XXX0310 16 chr1 233 255 268M * 0 0 CCCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:265 MS:i:50 +XXX0252 16 chr1 234 255 267M * 0 0 CCACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:265 MS:i:50 +XXX0206 16 chr1 235 255 266M * 0 0 CACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:264 MS:i:50 +XXX0223 16 chr1 236 255 265M * 0 0 ACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:263 MS:i:50 +XXX0229 16 chr1 236 255 265M * 0 0 ACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:263 MS:i:50 +XXX0268 16 chr1 236 255 265M * 0 0 ACACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:263 MS:i:50 +XXX0189 16 chr1 237 255 264M * 0 0 CACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:262 MS:i:50 +XXX0299 16 chr1 237 255 264M * 0 0 CACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:262 MS:i:50 +XXX0316 16 chr1 238 255 263M * 0 0 ACACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:261 MS:i:50 +XXX0224 16 chr1 239 255 262M * 0 0 CACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:260 MS:i:50 +XXX0255 16 chr1 240 255 261M * 0 0 ACCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:259 MS:i:50 +XXX0278 16 chr1 241 255 260M * 0 0 CCACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:258 MS:i:50 +XXX0314 16 chr1 243 255 258M * 0 0 ACGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:257 MS:i:50 +XXX0282 16 chr1 244 255 257M * 0 0 CGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:256 MS:i:50 +XXX0311 16 chr1 244 255 257M * 0 0 CGCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:256 MS:i:50 +XXX0176 16 chr1 245 255 256M * 0 0 GCTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:255 MS:i:50 +XXX0188 16 chr1 246 254 255M * 0 0 CTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:254 MS:i:50 +XXX0290 16 chr1 246 254 255M * 0 0 CTTTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:254 MS:i:50 +XXX0187 16 chr1 248 252 253M * 0 0 TTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:252 MS:i:50 +XXX0259 16 chr1 248 252 253M * 0 0 TTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:252 MS:i:50 +XXX0292 16 chr1 248 252 253M * 0 0 TTCCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:252 MS:i:50 +XXX0222 16 chr1 250 249 251M * 0 0 CCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:249 MS:i:50 +XXX0256 16 chr1 250 249 251M * 0 0 CCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:249 MS:i:50 +XXX0296 16 chr1 250 249 251M * 0 0 CCCGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:249 MS:i:50 +XXX0281 16 chr1 252 248 249M * 0 0 CGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:248 MS:i:50 +XXX0289 16 chr1 252 248 249M * 0 0 CGTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:248 MS:i:50 +XXX0171 16 chr1 253 247 248M * 0 0 GTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:247 MS:i:50 +XXX0181 16 chr1 253 247 248M * 0 0 GTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:247 MS:i:50 +XXX0266 16 chr1 253 247 248M * 0 0 GTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:247 MS:i:50 +XXX0319 16 chr1 253 247 248M * 0 0 GTTTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:247 MS:i:50 +XXX0172 16 chr1 255 245 246M * 0 0 TTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:245 MS:i:50 +XXX0317 16 chr1 255 245 246M * 0 0 TTCTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:245 MS:i:50 +XXX0207 16 chr1 257 242 244M * 0 0 CTTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:242 MS:i:50 +XXX0240 16 chr1 258 242 243M * 0 0 TTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:242 MS:i:50 +XXX0246 16 chr1 258 242 243M * 0 0 TTTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:242 MS:i:50 +XXX0203 16 chr1 259 240 242M * 0 0 TTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:240 MS:i:50 +XXX0217 16 chr1 259 240 242M * 0 0 TTGTACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:240 MS:i:50 +XXX0216 16 chr1 262 237 239M * 0 0 TACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:237 MS:i:50 +XXX0230 16 chr1 262 237 239M * 0 0 TACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:237 MS:i:50 +XXX0277 16 chr1 263 236 238M * 0 0 ACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:236 MS:i:50 +XXX0308 16 chr1 263 236 238M * 0 0 ACGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:236 MS:i:50 +XXX0288 16 chr1 264 235 237M * 0 0 CGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:235 MS:i:50 +XXX0305 16 chr1 264 235 237M * 0 0 CGATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:235 MS:i:50 +XXX0210 16 chr1 265 234 236M * 0 0 GATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:234 MS:i:50 +XXX0164 16 chr1 266 233 235M * 0 0 ATTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:233 MS:i:50 +XXX0221 16 chr1 267 232 234M * 0 0 TTTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:232 MS:i:50 +XXX0163 16 chr1 268 231 233M * 0 0 TTCGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:231 MS:i:50 +XXX0244 16 chr1 270 228 231M * 0 0 CGCGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:228 MS:i:50 +XXX0237 16 chr1 272 226 229M * 0 0 CGCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:226 MS:i:50 +XXX0178 16 chr1 273 226 228M * 0 0 GCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:226 MS:i:50 +XXX0202 16 chr1 273 226 228M * 0 0 GCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:226 MS:i:50 +XXX0236 16 chr1 273 226 228M * 0 0 GCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:226 MS:i:50 +XXX0304 16 chr1 273 226 228M * 0 0 GCAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:226 MS:i:50 +XXX0270 16 chr1 274 225 227M * 0 0 CAGGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:225 MS:i:50 +XXX0161 16 chr1 276 223 225M * 0 0 GGGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:223 MS:i:50 +XXX0287 16 chr1 277 222 224M * 0 0 GGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:222 MS:i:50 +XXX0306 16 chr1 277 222 224M * 0 0 GGGTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:222 MS:i:50 +XXX0173 16 chr1 279 220 222M * 0 0 GTGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:220 MS:i:50 +XXX0269 16 chr1 280 219 221M * 0 0 TGATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:219 MS:i:50 +XXX0303 16 chr1 282 216 219M * 0 0 ATCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:216 MS:i:50 +XXX0220 16 chr1 283 215 218M * 0 0 TCACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:215 MS:i:50 +XXX0219 16 chr1 284 214 217M * 0 0 CACTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:214 MS:i:50 +XXX0177 16 chr1 286 212 215M * 0 0 CTTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:212 MS:i:50 +XXX0257 16 chr1 287 211 214M * 0 0 TTGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:211 MS:i:50 +XXX0241 16 chr1 288 210 213M * 0 0 TGGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:210 MS:i:50 +XXX0167 16 chr1 289 209 212M * 0 0 GGTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:209 MS:i:50 +XXX0261 16 chr1 290 208 211M * 0 0 GTCTCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:208 MS:i:50 +XXX0312 16 chr1 293 205 208M * 0 0 TCCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:205 MS:i:50 +XXX0272 16 chr1 294 204 207M * 0 0 CCAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:204 MS:i:50 +XXX0253 16 chr1 295 203 206M * 0 0 CAAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:203 MS:i:50 +XXX0254 16 chr1 296 202 205M * 0 0 AAAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:202 MS:i:50 +XXX0307 16 chr1 297 201 204M * 0 0 AAAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:201 MS:i:50 +XXX0169 16 chr1 298 200 203M * 0 0 AAGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:200 MS:i:50 +XXX0232 16 chr1 299 199 202M * 0 0 AGGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:199 MS:i:50 +XXX0195 16 chr1 300 198 201M * 0 0 GGCGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:198 MS:i:50 +XXX0179 16 chr1 302 196 199M * 0 0 CGGACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:196 MS:i:50 +XXX0160 16 chr1 305 193 196M * 0 0 ACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:193 MS:i:50 +XXX0271 16 chr1 305 193 196M * 0 0 ACGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:193 MS:i:50 +XXX0180 16 chr1 306 192 195M * 0 0 CGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:192 MS:i:50 +XXX0185 16 chr1 306 192 195M * 0 0 CGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:192 MS:i:50 +XXX0199 16 chr1 306 192 195M * 0 0 CGGTCCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:192 MS:i:50 +XXX0191 16 chr1 310 188 191M * 0 0 CCCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:188 MS:i:50 +XXX0250 16 chr1 311 187 190M * 0 0 CCATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:187 MS:i:50 +XXX0273 16 chr1 312 186 189M * 0 0 CATGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:186 MS:i:50 +XXX0239 16 chr1 314 184 187M * 0 0 TGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:184 MS:i:50 +XXX0301 16 chr1 314 184 187M * 0 0 TGTTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:184 MS:i:50 +XXX0197 16 chr1 316 182 185M * 0 0 TTAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:182 MS:i:50 +XXX0260 16 chr1 317 181 184M * 0 0 TAGAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:181 MS:i:50 +XXX0190 16 chr1 319 179 182M * 0 0 GAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:179 MS:i:50 +XXX0309 16 chr1 319 179 182M * 0 0 GAAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:179 MS:i:50 +XXX0285 16 chr1 320 178 181M * 0 0 AAAAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:178 MS:i:50 +XXX0214 16 chr1 322 176 179M * 0 0 AAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:176 MS:i:50 +XXX0279 16 chr1 322 176 179M * 0 0 AAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:176 MS:i:50 +XXX0280 16 chr1 322 176 179M * 0 0 AAGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:176 MS:i:50 +XXX0242 16 chr1 323 175 178M * 0 0 AGTTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:175 MS:i:50 +XXX0213 16 chr1 325 173 176M * 0 0 TTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:173 MS:i:50 +XXX0233 16 chr1 325 173 176M * 0 0 TTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:173 MS:i:50 +XXX0297 16 chr1 325 173 176M * 0 0 TTCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:173 MS:i:50 +XXX0183 16 chr1 326 172 175M * 0 0 TCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:172 MS:i:50 +XXX0194 16 chr1 326 172 175M * 0 0 TCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:172 MS:i:50 +XXX0283 16 chr1 326 172 175M * 0 0 TCCCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:172 MS:i:50 +XXX0215 16 chr1 328 170 173M * 0 0 CCTACGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:170 MS:i:50 +XXX0162 16 chr1 332 166 169M * 0 0 CGTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:166 MS:i:50 +XXX0262 16 chr1 333 165 168M * 0 0 GTGACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:165 MS:i:50 +XXX0200 16 chr1 335 163 166M * 0 0 GACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:163 MS:i:50 +XXX0234 16 chr1 336 161 165M * 0 0 ACTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:161 MS:i:50 +XXX0186 16 chr1 337 161 164M * 0 0 CTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:161 MS:i:50 +XXX0218 16 chr1 337 161 164M * 0 0 CTATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:161 MS:i:50 +XXX0248 16 chr1 338 160 163M * 0 0 TATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:160 MS:i:50 +XXX0267 16 chr1 338 160 163M * 0 0 TATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:160 MS:i:50 +XXX0247 16 chr1 339 158 162M * 0 0 ATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:158 MS:i:50 +XXX0274 16 chr1 339 158 162M * 0 0 ATATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:158 MS:i:50 +XXX0198 16 chr1 340 158 161M * 0 0 TATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:158 MS:i:50 +XXX0251 16 chr1 340 158 161M * 0 0 TATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:158 MS:i:50 +XXX0204 16 chr1 341 156 160M * 0 0 ATGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:156 MS:i:50 +XXX0175 16 chr1 342 155 159M * 0 0 TGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:155 MS:i:50 +XXX0209 16 chr1 342 155 159M * 0 0 TGGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:155 MS:i:50 +XXX0243 16 chr1 343 154 158M * 0 0 GGAAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:154 MS:i:50 +XXX0165 16 chr1 345 152 156M * 0 0 AAGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:152 MS:i:50 +XXX0231 16 chr1 346 151 155M * 0 0 AGATCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:151 MS:i:50 +XXX0293 16 chr1 349 148 152M * 0 0 TCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:148 MS:i:50 +XXX0302 16 chr1 349 148 152M * 0 0 TCCAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:148 MS:i:50 +XXX0184 16 chr1 351 146 150M * 0 0 CAGGAAGGTAAGCCCCACCACCCCTCAGATCGTTGCCGGATCCACACTCAGCAACTCGGGCTTACCATAACCCCCGTAGATACTAGTCCCCGCCCGACGACAACAGTTTCTGAGATCCAAAAGCCGCCTCAAGGTGCAGACATAGGGCTA * AS:i:146 MS:i:50 diff --git a/tests/pysam_data/example_empty_with_header.sam b/tests/pysam_data/example_empty_with_header.sam new file mode 100644 index 0000000..3764780 --- /dev/null +++ b/tests/pysam_data/example_empty_with_header.sam @@ -0,0 +1 @@ +@HD VN:1.3 SO:coordinate diff --git a/tests/pysam_data/example_reverse_complement.sam b/tests/pysam_data/example_reverse_complement.sam new file mode 100644 index 0000000..795d19c --- /dev/null +++ b/tests/pysam_data/example_reverse_complement.sam @@ -0,0 +1,28 @@ +@SQ SN:chr1 LN:249250621 +@SQ SN:chr10 LN:135534747 +@SQ SN:chr11 LN:135006516 +@SQ SN:chr12 LN:133851895 +@SQ SN:chr13 LN:115169878 +@SQ SN:chr14 LN:107349540 +@SQ SN:chr15 LN:102531392 +@SQ SN:chr16 LN:90354753 +@SQ SN:chr17 LN:81195210 +@SQ SN:chr18 LN:78077248 +@SQ SN:chr19 LN:59128983 +@SQ SN:chr2 LN:243199373 +@SQ SN:chr20 LN:63025520 +@SQ SN:chr21 LN:48129895 +@SQ SN:chr22 LN:51304566 +@SQ SN:chr3 LN:198022430 +@SQ SN:chr4 LN:191154276 +@SQ SN:chr5 LN:180915260 +@SQ SN:chr6 LN:171115067 +@SQ SN:chr7 LN:159138663 +@SQ SN:chr8 LN:146364022 +@SQ SN:chr9 LN:141213431 +@SQ SN:chrM LN:16571 +@SQ SN:chrX LN:155270560 +@SQ SN:chrY LN:59373566 +@PG ID:bwa PN:bwa VN:0.7.12-r1039 CL:bwa mem /ifs/mirror/genomes/bwa-0.7.5a/hg19 both.fq +chr22:25000000-25000500 0 chr22 25000000 60 501M * 0 0 GCTCTGTGCCGCAAGGGTGGAAACTGTGAGAGACAGATTCCAACTCCACGTCTGGGTAGTAAGCATCCAGTCCAGGGCTGTAGGCAGTCCTGGGGAAGACGCCAGAGATCTGTGCATTCTCATATCGAGGGATAGCGACTCCAGGCTGGGGGCTGGCAGGGTAAGGGGTGGGTGGGTCCTGGGCTTACCCGCAGGTCTGCAGACTTCCTGGGGCCAGCTGACCTCGTAAAATCCCTTTTGTCTAAGCTTCAGTTTCCTGCCTGTGAATGGGGTTGGGGCTGTGCTCTGGTTTCACCCTTGTGGCTCTGGGGTTGTGGTGACAAAGCCATCAAGCTGGGTTGAAGGATTAACCAGGAAACTTCAGACTGGCTGCCGTGTCTACCTCTTCCTCATACTCCTCTCTCTGCTGCATCCTGGGAAGCTGCTCTGCTCAGCCTAAATGAGGCTCAGTTGTGTGTGTGCGCACGTGCTTGCACGTGTGTTGGAAGTGGGTGATACTGA GCTCTGTGCCGCAAGGGTGGAAACTGTGAGAGACAGATTCCAACTCCACGTCTGGGTAGTAAGCATCCAGTCCAGGGCTGTAGGCAGTCCTGGGGAAGACGCCAGAGATCTGTGCATTCTCATATCGAGGGATAGCGACTCCAGGCTGGGGGCTGGCAGGGTAAGGGGTGGGTGGGTCCTGGGCTTACCCGCAGGTCTGCAGACTTCCTGGGGCCAGCTGACCTCGTAAAATCCCTTTTGTCTAAGCTTCAGTTTCCTGCCTGTGAATGGGGTTGGGGCTGTGCTCTGGTTTCACCCTTGTGGCTCTGGGGTTGTGGTGACAAAGCCATCAAGCTGGGTTGAAGGATTAACCAGGAAACTTCAGACTGGCTGCCGTGTCTACCTCTTCCTCATACTCCTCTCTCTGCTGCATCCTGGGAAGCTGCTCTGCTCAGCCTAAATGAGGCTCAGTTGTGTGTGTGCGCACGTGCTTGCACGTGTGTTGGAAGTGGGTGATACTGA NM:i:0 MD:Z:501 AS:i:501 XS:i:343 +chr22:25000000-25000500 16 chr22 25000000 60 501M * 0 0 GCTCTGTGCCGCAAGGGTGGAAACTGTGAGAGACAGATTCCAACTCCACGTCTGGGTAGTAAGCATCCAGTCCAGGGCTGTAGGCAGTCCTGGGGAAGACGCCAGAGATCTGTGCATTCTCATATCGAGGGATAGCGACTCCAGGCTGGGGGCTGGCAGGGTAAGGGGTGGGTGGGTCCTGGGCTTACCCGCAGGTCTGCAGACTTCCTGGGGCCAGCTGACCTCGTAAAATCCCTTTTGTCTAAGCTTCAGTTTCCTGCCTGTGAATGGGGTTGGGGCTGTGCTCTGGTTTCACCCTTGTGGCTCTGGGGTTGTGGTGACAAAGCCATCAAGCTGGGTTGAAGGATTAACCAGGAAACTTCAGACTGGCTGCCGTGTCTACCTCTTCCTCATACTCCTCTCTCTGCTGCATCCTGGGAAGCTGCTCTGCTCAGCCTAAATGAGGCTCAGTTGTGTGTGTGCGCACGTGCTTGCACGTGTGTTGGAAGTGGGTGATACTGA CGAGACACGGCGTTCCCACCTTTGACACTCTCTGTCTAAGGTTGAGGTGCAGACCCATCATTCGTAGGTCAGGTCCCGACATCCGTCAGGACCCCTTCTGCGGTCTCTAGACACGTAAGAGTATAGCTCCCTATCGCTGAGGTCCGACCCCCGACCGTCCCATTCCCCACCCACCCAGGACCCGAATGGGCGTCCAGACGTCTGAAGGACCCCGGTCGACTGGAGCATTTTAGGGAAAACAGATTCGAAGTCAAAGGACGGACACTTACCCCAACCCCGACACGAGACCAAAGTGGGAACACCGAGACCCCAACACCACTGTTTCGGTAGTTCGACCCAACTTCCTAATTGGTCCTTTGAAGTCTGACCGACGGCACAGATGGAGAAGGAGTATGAGGAGAGAGACGACGTAGGACCCTTCGACGAGACGAGTCGGATTTACTCCGAGTCAACACACACACGCGTGCACGAACGTGCACACAACCTTCACCCACTATGACT NM:i:0 MD:Z:501 AS:i:501 XS:i:343 diff --git a/tests/pysam_data/example_unmapped_reads_no_sq.sam b/tests/pysam_data/example_unmapped_reads_no_sq.sam new file mode 100644 index 0000000..4d9f100 --- /dev/null +++ b/tests/pysam_data/example_unmapped_reads_no_sq.sam @@ -0,0 +1,3 @@ +@HD VN:1.0 +read_28833_29006_6945 0 * 0 0 * * 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< +read_28701_28881_323b 0 * 0 0 * * 500 412 ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA <<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<< diff --git a/tests/pysam_data/faidx_empty_seq.fq b/tests/pysam_data/faidx_empty_seq.fq new file mode 100644 index 0000000..572bf2f --- /dev/null +++ b/tests/pysam_data/faidx_empty_seq.fq @@ -0,0 +1,40 @@ +@HISEQ2500-10:332:HCWLKBCXX:1:1101:6834:72051:TCGCTGTG +TACCTCTAAAGGGGAGCGCTTTGGA ++ +IBBBBBEEEEEEEEEEEEBBBBBII +@HISEQ2500-10:332:HCWLKBCXX:1:1101:6822:72067:TCGCTGTG +TGCTCTAGAATTACCACAGTTATGA ++ +@A<;BB<<0BA0B?A?B7_589:1:101:825:28 +GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC +>B7_589:1:101:825:28 +TGTGTCCATGTACACACGCTGTCCTATGTACTTAT +>B7_589:1:110:543:934 +AAGAATTGTAAAAGTCAAAATTAAAGTTCAATACT +>B7_589:1:110:543:934 +ACAAGCCAGAAGAGATTGGATCTAATTTTTGGACT +>B7_589:1:122:337:968 +ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT +>B7_589:1:122:337:968 +GCTTTACTGTCTAAACTATGAAGAGACTATTGCCA +>B7_589:1:122:77:789 +ACTATATTTATGCTATTCAGTTCTAAATATAGAAA +>B7_589:1:122:77:789 +GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA +>B7_589:1:168:69:249 +ATATGCTGTTTACAAGAAACTCATTAATAAAGACA +>B7_589:1:168:69:249 +TTCAGCAAGAAGATATAACCATCCTACTAAATACA +>B7_589:1:29:529:379 +CAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAAT +>B7_589:1:29:529:379 +GACTCTATCCCAAATTCCCAATTACGTCCTATCTT +>B7_589:2:30:644:942 +TACCTAATTGGTACAATGTACAATATTCTGATGAT +>B7_589:2:30:644:942 +TATATCAGATAAAGCACACTTTAAATCAACAACAG +>B7_589:2:73:730:487 +AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT +>B7_589:2:73:730:487 +TAGCCATTTCTTTTGGCATTTGCCTTCAGACCCTA +>B7_589:2:9:49:661 +TACACACAAAAGTACAAAACTCACAGGTTTTATAA +>B7_589:2:9:49:661 +TGCTAAACTAAGCATCATAAATGAAGCGGAAATAA +>B7_589:3:71:478:175 +ACAGAGCTTTCAAGAAGTATGAGATTATGTAAAGT +>B7_589:3:71:478:175 +TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA +>B7_589:3:82:13:897 +ATACAGTCATCTATAAAGGAAATCCCAGCAGAATA +>B7_589:3:82:13:897 +CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT +>B7_589:4:54:989:654 +ACTTATCATGACTCTATCCCAAATTCCCAATTACG +>B7_589:4:54:989:654 +TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT +>B7_589:5:147:405:738 +AGGGATTAAATTCCCCCACTTAAGAGATATAGATT +>B7_589:5:147:405:738 +ATCAGATAAAGCACACTTTAAATCAACAACAGTAA +>B7_589:5:198:564:731 +ACAAAGGAGGTCATCATACAATGATAAAAAGATCA +>B7_589:5:198:564:731 +ATAGATTGGCAGAACAGATTTAAAAACATGAACTA +>B7_589:5:50:950:562 +CTATTTTTGTCTTGACACCCTACTAATATTTGTCT +>B7_589:5:50:950:562 +GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGC +>B7_589:5:68:440:424 +ACACTTTAAATCAACAACAGTAAAATAAAACAAAG +>B7_589:5:68:440:424 +TGGTACAATGTACAATATTCTGATGATGGTTACAC +>B7_589:6:108:958:42 +AAAGTACAAAACTCACAGGTTTTATAAAACAATTA +>B7_589:6:108:958:42 +TATGCCCTGCTAAACTAAGCATCATAAATGAAGGG +>B7_589:6:114:714:317 +AACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGC +>B7_589:6:114:714:317 +TGCCAGCACAGGGGCTTAACCTCTGGTGACTGCCA +>B7_589:6:120:14:944 +CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA +>B7_589:6:120:14:944 +CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT +>B7_589:6:33:356:636 +TTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTT +>B7_589:7:112:203:90 +CCTGTCACCCAATGGACCTGTGATATCTGGATTCT +>B7_589:7:112:203:90 +CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA +>B7_589:7:154:26:712 +ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC +>B7_589:7:154:26:712 +TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA +>B7_589:7:72:916:763 +CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT +>B7_589:7:72:916:763 +GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT +>B7_589:7:76:306:561 +GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA +>B7_589:7:76:306:561 +TACAGAGCAACTAGGTAAAAAATTAACATTACAAC +>B7_589:7:93:634:323 +CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT +>B7_589:7:93:634:323 +TAAAGTTCAATACTCACCATCATAAATACACACAA +>B7_589:8:113:968:19 +GAAAACTATATTTATGCTATTCAGTTCTAAATATA +>B7_589:8:118:829:36 +AGTATTGGTAAAGATGTGGGGAAAAAAGTAAACTC +>B7_589:8:118:829:36 +TAATTGGTACAATGTACAATATTCTGATGATGGTT +>B7_589:8:139:727:808 +AAGTAAATAAAACACATAGCTAAAACTAAAAAAGC +>B7_589:8:139:727:808 +ACAAATACTACTAGACCTAAGAGGGATGAGAAATT +>B7_589:8:157:935:374 +CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA +>B7_589:8:157:935:374 +TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCA +>B7_589:8:2:434:715 +AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT +>B7_589:8:2:434:715 +CTTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTT +>B7_589:8:74:674:124 +CACTGAACTTCCACGTCTCATCTAGGGGAACAGGG +>B7_589:8:74:674:124 +TTCTTATCTGCACATTACTACCCTGCAATTAATAT +>B7_591:1:191:462:705 +CAGATCCAGATTGCTTGTGGTCTGACAGGCTGCAAC +>B7_591:1:191:462:705 +CATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAG +>B7_591:1:60:837:923 +CATCAACCGCATACACTCACATGGTTTAGGGGTATA +>B7_591:1:60:837:923 +TTCACGCCAGCTCCCTGTCACCCAATGGACCTCTGA +>B7_591:2:123:924:645 +TATATCAGATAAAGCACACTTTAAATCAACAACAGT +>B7_591:2:123:924:645 +TGAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA +>B7_591:2:134:868:252 +AAGAACTTTGATGCCCTCTTCTTCCAAAGATGAAAC +>B7_591:2:134:868:252 +ATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGA +>B7_591:2:13:100:876 +ACAGGGATTCCTGAGGAAAAAGAAAAAGTGAGAAGT +>B7_591:2:13:100:876 +AGAATATATAAAGTCAACATGAAGGAAAAAAATTCT +>B7_591:2:223:583:968 +AATATAGTTGAAAGCTCTAACAATAGACTAAACCAA +>B7_591:2:223:583:968 +TATGAGGCACAGGTATTCCTGAGGAAAAAGAAAAAG +>B7_591:2:240:603:890 +GCTCCCAAGAGGGAAAGCTTTCAACGCTTCTAGCCA +>B7_591:2:240:603:890 +TCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA +>B7_591:2:279:124:41 +GAATTAACCCAGTCAGACAAAAANNAAGAAAAAAGA +>B7_591:2:279:124:41 +GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA +>B7_591:2:27:280:592 +AATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC +>B7_591:2:27:280:592 +AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGA +>B7_591:2:309:798:997 +TTTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT +>B7_591:2:323:639:311 +AAGCCGTTCTATTTGTAATGAAAACTATATTTAGGC +>B7_591:2:323:639:311 +TACCAAATGTGTTTATTACCAGAGGGATGGAGGGAA +>B7_591:2:46:220:58 +CAAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA +>B7_591:2:46:220:58 +TTCCACTTTGGAAAACAATTTGGTAATTTCGTTTTT +>B7_591:3:168:69:605 +TACCCGAGGGATGGAGGGTAGAGGGACGCTGAAGTG +>B7_591:3:168:69:605 +TCTGACAGGCGGCAACTGTGAGCCATCACAATGAAC +>B7_591:3:179:496:161 +AAAAACATGAACTAACTATATGCTGTTTACAAGAAA +>B7_591:3:179:496:161 +AAGTACAAAACTCACAGGTTTTATAAAACAATTAAT +>B7_591:3:277:458:330 +AATGTCAGGGAAGGAGCCTTTTGTCAGTTACCAAAT +>B7_591:3:277:458:330 +TGATATCTGGATTCTGGGAAATTCTTCATCCTGGAC +>B7_591:3:291:404:199 +TATAAAACAATTAATTGAGACTACAGAGCAACTAGG +>B7_591:3:291:404:199 +TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC +>B7_591:3:305:565:952 +GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT +>B7_591:3:305:565:952 +TAATACTATGTTTCTTATCTGCACATTACTACCCTG +>B7_591:3:45:294:380 +ATAATTGTGTCCATGTACACACGATGTCATATGTAC +>B7_591:3:45:294:380 +CCTCGTCCACACTGGTTCGCTTGAAAGCTTGGGCTG +>B7_591:4:103:111:720 +CAGTTACCAAATGTGTTTATTACCAGAGGGATGGAG +>B7_591:4:103:111:720 +TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG +>B7_591:4:159:508:571 +CAAAACCTCATATATCAATATTAACTTTGAATAAAA +>B7_591:4:159:508:571 +TGGAAAAAGATGTTCTACGCAAACAGAAACCAAATG +>B7_591:4:216:650:516 +GAACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA +>B7_591:4:216:650:516 +TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT +>B7_591:4:329:339:408 +CAATCCAGAAGAGATTGGATCTAATTTTTGGACTTC +>B7_591:4:329:339:408 +TAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC +>B7_591:4:92:411:955 +GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG +>B7_591:4:92:411:955 +TACTAAATACATATGCACCTAACACAAGACTACCCA +>B7_591:5:124:978:501 +AATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTC +>B7_591:5:124:978:501 +ATGTAACAAATCTGCGCTTGTACTTCTAAATCTATA +>B7_591:5:134:751:831 +AGCTCCCTGTCACCCAATGGACCTGTGATATCTGGA +>B7_591:5:134:751:831 +ATACACACACATGGTTTAGGGGTATAATACCTCTAC +>B7_591:5:243:557:560 +AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA +>B7_591:5:243:557:560 +CTAAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT +>B7_591:5:254:542:848 +CCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAA +>B7_591:5:254:542:848 +CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC +>B7_591:5:289:132:526 +CACCCGGTCCCTGCCCCATCTCTTGTAATCTCTCTC +>B7_591:5:289:132:526 +TCTATTTTTGTCTTGACACCCAACTAATATTTGTCT +>B7_591:5:42:540:501 +CTATATTTATGCTATTCAGTTCTAAATATAGAAATT +>B7_591:5:90:828:633 +CTGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG +>B7_591:5:90:828:633 +GGATGGAGGGAAGAGGGACGCTGAAGAACTTTGATG +>B7_591:6:11:646:628 +GTACTTATCATGACTCTATCCCAAATTCCCAATTAC +>B7_591:6:11:646:628 +TTCTGCCCCCAGCATGGTTGTACTGGGCAATACATG +>B7_591:6:155:12:674 +CTATATTTATGCTATTCAGTTCTAAATATAGAAATT +>B7_591:6:181:191:418 +AAACTATATTTATGCTATTCAGTTCTAAATATAGAA +>B7_591:6:181:191:418 +AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTCT +>B7_591:6:190:42:671 +TATTGCCAGATGAACCACACATTAATACTATGTTTC +>B7_591:6:190:42:671 +TGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA +>B7_591:6:29:575:453 +TACTACCCTGCAATTAATATAATTGTGTCCATTTAC +>B7_591:6:29:575:453 +TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTTG +>B7_591:7:116:814:89 +ACTATGCTAAGTATTGGTAAAGATGTGGGGAAAAAA +>B7_591:7:116:814:89 +CCTAATTGGTACAATGTACAATATTCTGATGATGGT +>B7_591:7:129:956:115 +AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC +>B7_591:7:129:956:115 +GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCA +>B7_591:7:157:447:758 +AAAGATGTTCTACGCAAACAGAAACCAAATGAGAGA +>B7_591:7:157:447:758 +ACAAAACCTCATATATCAATATTAACTTTGAATAAA +>B7_591:7:200:192:373 +AGTGCCTTTGTTCACATAGACCCCCTTGCAACAACC +>B7_591:7:200:192:373 +CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC +>B7_591:7:22:632:176 +AAAGGAGGTCATCATACAATGATAAAAAGATCAATT +>B7_591:7:22:632:176 +AGATATAGATTGGCAGAACAGATTTAAAAACATGAA +>B7_591:7:68:242:834 +AAATAAAAAAGCAAAAACAAAAACTATGCTAAGTAT +>B7_591:7:68:242:834 +TACTACTAGACCTAAGAGGGATGAGAAATTACCTAA +>B7_591:7:89:67:709 +TTTTTTTTTTTGTCTTCTCTTTTTTTTTTTTTTTTT +>B7_591:8:4:841:340 +TTCAAATGAACTTCTGTAATTGAAAAATTCATTTAA +>B7_593:1:12:158:458 +CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT +>B7_593:1:12:158:458 +TAATAATGCTACATGGATGATTATGAAATCAATGTT +>B7_593:1:189:876:833 +CAAGACTACCCAGATTCATAAAACAAATACTACTAG +>B7_593:1:189:876:833 +TTAAAATTTAACAAAAGTAAATAAAACACATAGCTA +>B7_593:1:19:695:59 +AACAGGAACAAAACCTCATATATCAATATTAACTTT +>B7_593:1:19:695:59 +GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAAT +>B7_593:1:200:559:765 +GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTAT +>B7_593:1:200:559:765 +TGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT +>B7_593:1:215:861:605 +GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC +>B7_593:1:215:861:605 +NAAGACAAGTCTCTTATGAATTAACCCAGTCAGACA +>B7_593:1:36:485:632 +AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA +>B7_593:1:36:485:632 +GGCATTTGCCTTCAGACCCTACACGAATGCGTCTCT +>B7_593:1:85:361:418 +AGCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT +>B7_593:1:85:361:418 +GAAGATACATTGCAAGACAGACTTCATCAAGATATG +>B7_593:2:104:744:280 +CATATGGAAAGGTTGTTGGGATTTTTTTAATGATTC +>B7_593:2:104:744:280 +TGGGCTGTAATGATGCCCCTTGTCCATCACCCGGTC +>B7_593:2:125:875:553 +AACAGTAAAATAAAACAAAGGAGGTCATCATACAAT +>B7_593:2:125:875:553 +TAATTGGTACAATGTACAATATTCTGATGATGGTTA +>B7_593:2:128:555:941 +AACCAAAAGAGAGAAGGAGTAGTTATACACATATCA +>B7_593:2:133:460:542 +CCTATAAGCCGTTCTATTTGTAATGAAAACTATATT +>B7_593:2:133:460:542 +TTACCAAATGTGTTTATTACCAGAGGGATGGAGGGA +>B7_593:2:259:467:737 +CTATGTACTTATCATGACTCTATCCCAAATTCCCAA +>B7_593:2:259:467:737 +TCACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCA +>B7_593:2:270:430:269 +AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA +>B7_593:2:270:430:269 +CCAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA +>B7_593:2:273:348:37 +AGAAATGCGCAAAAGAATTGTAAAAGTCAAAATTAA +>B7_593:2:273:348:37 +GAATAACAATGGGCTTCTCAGCAGAAACCTTACACG +>B7_593:2:313:531:169 +GAAAGAGGTTCAGAACTTGAAGACAAGTCTCTTATG +>B7_593:2:313:531:169 +GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT +>B7_593:2:43:239:977 +TGAACTTCTGTAATTGAAAAATTCATTTAAGAAATT +>B7_593:2:68:140:542 +AAAAACAAAAACTATGCTAAGTATTGGTAAAGATGT +>B7_593:2:68:140:542 +GGGATGAGAAATTACCTAATTGGTACAATGTACAAT +>B7_593:2:68:692:347 +TATCAATTTGGTGTTCTGTGTAAAGTCTCATGGAGC +>B7_593:2:68:692:347 +TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCTT +>B7_593:2:81:435:410 +AGACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT +>B7_593:2:81:435:410 +ATTAATTGAGACTACAGAGCAACTAGGTAAAAAATT +>B7_593:3:102:856:670 +AAACCTCATATATCAATATTAACTTTGAATAAAAAG +>B7_593:3:102:856:670 +AGAGAAGGAGTAGCTATACTTATATCAGATAAAGCA +>B7_593:3:115:649:259 +ATTAATTGAGAATACAGAGCAACTAGGTAAAAAATT +>B7_593:3:115:649:259 +GGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG +>B7_593:3:148:437:481 +CGCTTCTAGCCATTTCTTTTGGCATTTGCCTTCAGA +>B7_593:3:148:437:481 +GTACTGGGCAATACATGAGATTATTAGGAAATGCTT +>B7_593:3:180:89:582 +ATGCTAAGATAATTCATCATCACTAAACCAGTCCTA +>B7_593:3:180:89:582 +TAAAAAATTAACATTACAACAGGAACAAAACCTCAT +>B7_593:3:194:168:684 +AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT +>B7_593:3:194:168:684 +CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGTT +>B7_593:3:196:11:27 +AAGACCCAGTTAGCCGTCCGTGTCCTCCCATCTGGC +>B7_593:3:196:11:27 +CTATGTTTCTTATCTGCNCATTACTACCCTGCAATT +>B7_593:3:303:131:673 +ACAAGAAACTCATTAATAAAGACATGAGTTCAGGTA +>B7_593:3:303:131:673 +ATAAAAAGATCAATTCAGCAAGAAGATATAACCATC +>B7_593:3:310:193:629 +CATACAATGATAAAAAGATCAATTCAGCAAGAAGAT +>B7_593:3:310:193:629 +TACACTAAAAGCCCATACTTTACTGCTACTCAATAT +>B7_593:4:104:153:698 +CCAGATACCATCCCTGTCTTACTTCCAGCTCCCCAG +>B7_593:4:104:153:698 +CTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTT +>B7_593:4:106:316:452 +CTATATTTATGCTATTCAGTTCTAAATATAGAAATT +>B7_593:4:142:63:937 +GAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC +>B7_593:4:142:63:937 +TTCTTTTGGCATTTGCCTTCAGACCCTACACGAATG +>B7_593:4:28:781:723 +AATACCTCTACATGGCTGATTATGAAAACAATGTTC +>B7_593:4:28:781:723 +ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG +>B7_593:4:29:794:282 +CACATTAATACTATGTTTCTTATCTGCACATTACTA +>B7_593:4:29:794:282 +TAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG +>B7_593:4:30:117:411 +TCTTGACACCCAACTAATATTTGTCTGAGCAAAACA +>B7_593:4:30:117:411 +TCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTC +>B7_593:4:30:812:345 +TATGTTTCTTATCTGCACATTACTACCCTGCAATTA +>B7_593:4:30:812:345 +TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCTC +>B7_593:4:315:201:673 +AAGATATGTAGTCATCAGACTATCTAAAGTCAACAT +>B7_593:4:315:201:673 +TTGGACTTATTAAAGAAAAAAAAACCTGTCAAACAC +>B7_593:5:171:343:758 +ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAGA +>B7_593:5:171:343:758 +GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG +>B7_593:5:267:71:603 +TTGGCCATCACCCAGTCCCTGCCCCATCTCTTGTAA +>B7_593:5:267:71:603 +TTTAATGATTCCTCAATGTTAAAATGTCTATTTTTG +>B7_593:5:299:743:762 +AAAATTAAAATTTAACAAAAGTAAATAAAACACATA +>B7_593:5:299:743:762 +CAAGACTACCCAGATTCATAAAACAAATACTACTAG +>B7_593:5:30:599:589 +CTACGCAAACAGAAACCAAATGAGAGAAGGAGCAGC +>B7_593:5:30:599:589 +TCATAAAACAAATACTACTAGACCTAAGAGGGATGA +>B7_593:6:118:121:760 +GAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA +>B7_593:6:119:428:415 +GCTATACTTATATCAGATAAAGCACACTTTAAATCA +>B7_593:6:119:428:415 +TAAATTCCCCCACTTAAGAGATATAGATTGGCAGAA +>B7_593:6:185:96:948 +CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATA +>B7_593:6:185:96:948 +TTTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT +>B7_593:6:38:332:54 +CCATCATAAATACACACAAAAGTACAAAACTCACAG +>B7_593:6:38:332:54 +TGGCAGAACAGATTTAAAAACATGAACTAACTATAT +>B7_593:6:61:628:681 +CAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCTT +>B7_593:6:61:628:681 +GCCATCACAATGAACAACAGGAAGAAAAGGTCTTTC +>B7_593:7:15:244:876 +AAAAGTAAACTCTCAAATATTGCTAGTGTGAGTATA +>B7_593:7:15:244:876 +GTACAATATTCTGATGATGGTTACACTAAAAGCCCA +>B7_593:7:189:530:40 +AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATAC +>B7_593:7:189:530:40 +CCCCACTTAAGAGATATAGATTGGCAGAACAGATTT +>B7_593:7:256:354:173 +CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGGA +>B7_593:7:256:354:173 +TCAATTCAGCAAGAAGATATAACCATCCTACTAAAT +>B7_593:7:283:186:707 +AATACATATGCACCTAACACAAGACTACCCAGATTC +>B7_593:7:283:186:707 +CGCTTGTACTTCTAAATCTATAACAAAATTAAAATT +>B7_593:7:307:481:625 +AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG +>B7_593:7:307:481:625 +TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA +>B7_593:7:67:302:762 +GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC +>B7_593:7:67:302:762 +TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA +>B7_593:7:6:585:132 +GCCCCTTGACCACCACCCAGTCCCTGCCCCATCTCT +>B7_593:7:6:585:132 +TGTACTTATCATGTTTCTTTCCTAATTTTTCAATTA +>B7_593:7:87:89:696 +TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCC +>B7_593:7:87:89:696 +TTCCTATGGAAAGGTTGTTGGGAGATTTTTAATGAT +>B7_595:1:209:345:87 +AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT +>B7_595:1:209:345:87 +TTACTTGTTGTTGGTTTTCTGTTTCTTTTTTTGAT +>B7_595:1:209:653:400 +AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA +>B7_595:1:209:653:400 +CTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCT +>B7_595:1:252:19:955 +AGCCAGTTCTTTTGGCATTTGCCTTCAGACCCTCC +>B7_595:1:252:19:955 +TGAACAAAAGGAAGAAAAGGTCTTTCAAAAGGTGA +>B7_595:1:81:1000:375 +ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGC +>B7_595:1:81:1000:375 +NATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAA +>B7_595:2:178:77:424 +CTACCCTGCAATTAATATAATTGTGTCCATGTACA +>B7_595:2:178:77:424 +TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG +>B7_595:2:251:121:479 +GGCTGCAACTGTGAGCCATCACAATGAACAACAGG +>B7_595:2:251:121:479 +GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG +>B7_595:2:29:729:70 +AAACAGAAACCAAATGAGAGAAGGAGTAGCTATAC +>B7_595:2:29:729:70 +ANTATTANCTTTGANNAAAAAGGGATTAAATTCCC +>B7_595:3:229:543:583 +ATAACCATCCTACTAAATACATATGCACCTAACAC +>B7_595:3:229:543:583 +TCAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAA +>B7_595:3:297:637:86 +CAATGTTCCCCAGATACCATCCCTGTCTTACTTCC +>B7_595:3:297:637:86 +TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG +>B7_595:3:57:735:151 +CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC +>B7_595:3:57:735:151 +TAAACTCTCACCTTATTGCTGCATCCCTGTCTTCC +>B7_595:3:85:964:950 +AACAGATTTAAAAACATGAACTAACTATATGCTGT +>B7_595:3:85:964:950 +GAGGTCATCATACAATGATAAAAAGATCAATTCAG +>B7_595:4:12:402:843 +AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC +>B7_595:4:12:402:843 +ATATAATTGTGTCCATGTACACACGCTGTCCTATG +>B7_595:4:319:250:718 +AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG +>B7_595:4:319:250:718 +AGTTGAAAGCTCTAACAATAGACTAAACCAAGCAG +>B7_595:4:58:703:72 +GTACACACGCTGTCCTATGTACTTATCATGACTCT +>B7_595:4:58:703:72 +TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC +>B7_595:4:84:802:737 +CATAGACCCCCTTGCAACAACCTTGAGAACCCCAG +>B7_595:4:84:802:737 +CTTAACCTCTGGTGACTGCCAGAGCTGCTGGCAAG +>B7_595:5:184:912:258 +ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT +>B7_595:5:184:912:258 +GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG +>B7_595:5:36:649:554 +AAGAGATTGGATCTAATTTTTGGACTTCTTAAAGA +>B7_595:5:36:649:554 +CAGGAAGATACATTGCAAGACAGACTTCATCAAGA +>B7_595:5:84:91:614 +GAACCACACATTAATACTATGTTTCTTATCTGCAC +>B7_595:5:84:91:614 +TTTCCCATCATGAAGCACTGATCTTCCACGTCTCA +>B7_595:6:119:730:190 +AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA +>B7_595:6:119:730:190 +AGTCTTGCTAGAGATTTAGACATCTAAATGAAAGA +>B7_595:6:137:811:130 +AAAATTTAACAAAAGTAAATAAAACACATAGCTAA +>B7_595:6:137:811:130 +AGACTACCCAGATTCATAAAACAAATACTACTAGA +>B7_595:6:290:270:557 +ACATTACTACCCTGCAATTAATATAATTGTGTCCA +>B7_595:6:290:270:557 +GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA +>B7_595:6:47:720:789 +CCCTTGGCCATCACCCGGTCCCGGCCCCTTCTCTT +>B7_595:6:47:720:789 +TCCTCAATGTTAAAATGTCTATTTTTGTCTTGACA +>B7_595:6:52:751:360 +AAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC +>B7_595:6:52:751:360 +AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC +>B7_595:6:99:557:427 +AACAAAATTAAAATTTAACAAAAGTAAATAAAACA +>B7_595:6:99:557:427 +ATTCATAAAACAAATACTACTAGACCTAAGAGGGA +>B7_595:7:123:610:472 +GTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTC +>B7_595:7:123:610:472 +TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT +>B7_595:7:149:123:265 +AAGAGGGATGAGAAATTACCTAATTGGTACAATGT +>B7_595:7:149:123:265 +AGCAAAAACAAAAACTATGCTAAGTATTGGTAAAG +>B7_595:7:166:203:416 +AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC +>B7_595:7:166:203:416 +ATGAGATTATTAGGAAATGCTTTACTGTCATAACT +>B7_595:7:188:802:71 +ATGCTATTCAGTTCTAAATATAGAAATTGAAACAG +>B7_595:7:188:802:71 +TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC +>B7_595:7:190:481:295 +GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG +>B7_595:7:190:481:295 +TCATAACTATGAAGAGACTATTGCCAGATGAACCA +>B7_595:7:242:4:593 +ATATACACACGCTGTCCTATGTACTTATCATGACT +>B7_595:7:242:4:593 +TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC +>B7_595:8:26:242:35 +ATAAAACAAAGGAGGTCATCATACAATGATAAAAA +>B7_595:8:26:242:35 +ATATTTTGATGATGGTTACACTAAAAGCCCATACT +>B7_597:2:100:563:301 +GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT +>B7_597:2:132:493:921 +ACGGGGTTGCCAGCACAGGGGCTTAACCTCTGGTG +>B7_597:2:132:493:921 +GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC +>B7_597:2:165:431:857 +GAACTTTGATGCCCTCTTCTTCCAAAGATGAAACG +>B7_597:2:165:431:857 +TTGGGGTCTGACAGGCTGCAACTGTGAGCCATCAC +>B7_597:2:168:829:88 +ACAGACTTCATCAAGATATGTAGTCATCAGACTAT +>B7_597:2:168:829:88 +TAACTGAACCTATGAGTCACAGGTATTCCTGAGGA +>B7_597:2:42:28:552 +AAGAAGATATAACCATCCTACTAAATACATATGCA +>B7_597:2:42:28:552 +ACTCAATATATCCATGTAACAAATCTGCGCTTGTA +>B7_597:3:10:394:392 +TCATCAAGATATGTAGTCATCAGACTATCTAAATT +>B7_597:3:10:394:392 +TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA +>B7_597:3:115:646:430 +CACAGGTTTTATAAAACAATTAATTGAGACTACAG +>B7_597:3:115:646:430 +GTTATGCCCTGCTAAACTTAGCATCATAAATGAAG +>B7_597:3:133:707:886 +ACCTAATAAATACATATGCACCTAACACAAGACTA +>B7_597:3:133:707:886 +AGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAAC +>B7_597:3:157:361:309 +CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT +>B7_597:3:157:361:309 +TACACACAAAAGTACAAAACTCACAGGTTTTATAA +>B7_597:3:39:966:551 +ACATTAATACTATGTTTCTTATCTGCACATTACTA +>B7_597:3:39:966:551 +AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC +>B7_597:3:46:981:766 +TCTTTTGGCATTTGCCTTCAGACCCTACACGAATG +>B7_597:3:46:981:766 +TGCCCCCAGCATGGTTGTACTGGGCAATACATGAG +>B7_597:3:53:616:842 +CTTATCATGACTCTATCCCAAATTCCCACTTACGT +>B7_597:3:53:616:842 +TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC +>B7_597:3:67:620:344 +AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT +>B7_597:3:67:620:344 +CCCCCGCCCAAGCCCTTCTCACAGTTTCTGCCCCC +>B7_597:3:73:273:488 +AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGG +>B7_597:3:73:273:488 +CTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTG +>B7_597:4:138:211:582 +CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG +>B7_597:4:138:211:582 +TGAGACTACAGAGCAAATAGGTAAAAAATTAACAT +>B7_597:4:144:492:61 +AAATACTCACCATCATAAATACACACAAAAGTACA +>B7_597:4:144:492:61 +AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC +>B7_597:4:146:961:63 +TACTTATATCAGATAAAGCACACTTTAAATCAACA +>B7_597:4:146:961:63 +TGAATAAAAAGGGCTTAAATTCCCCCACTTAAGGG +>B7_597:4:38:999:463 +GCGGAAACCTTACAAGCCAGAAGAGATTGGATCTA +>B7_597:4:38:999:463 +TAGACATCTAAATGAAAGNNGCNNNAAGAATGCCA +>B7_597:5:125:957:753 +TTTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTT +>B7_597:5:160:434:853 +ATATAATTGTGTCCATGTACACACGCTGTCCTATG +>B7_597:5:160:434:853 +GCTTGGGCTGTAATGATGCCCCTTGGCCATCACCC +>B7_597:5:58:684:520 +AGACAGACTTCATCAAGATATGTAGTCATCAGACT +>B7_597:5:58:684:520 +ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA +>B7_597:5:6:882:784 +CATGGCTGATTATGAAAACAATGTTCCCCAGATAC +>B7_597:5:6:882:784 +CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGA +>B7_597:5:98:995:929 +GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT +>B7_597:5:98:995:929 +TATAACAATATTAACTTTGAATAAAAAGGGATTAA +>B7_597:6:106:595:322 +GAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGC +>B7_597:6:106:595:322 +GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA +>B7_597:6:193:661:771 +AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG +>B7_597:6:193:661:771 +GCAAGAAGATATAACCATCCTACTAAATACATATG +>B7_597:6:20:592:496 +CTCAAAGAATGCCAGGAAGATACATTGCAAGACAG +>B7_597:6:20:592:496 +TCTCAGCGGAAACCTTACAAGCCAGAAGAGATTGG +>B7_597:6:29:249:878 +ATTGTGTCCATGTACACACGCTGTCCTATGTACTT +>B7_597:6:29:249:878 +TCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGG +>B7_597:6:73:420:812 +CTAAGTATTGGTAAAGATGTGGGGAAAAAAGTAAA +>B7_597:6:73:420:812 +CTAATTGGTACAATGTACAATATTCTGATGATGGT +>B7_597:7:103:731:697 +AATTAACCCAGTCAGACAAAAATAAAGAAAAAAGA +>B7_597:7:103:731:697 +CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC +>B7_597:7:113:408:211 +AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG +>B7_597:7:113:408:211 +GAGACTACAGAGCAACTAGGTAAAAAATTAACATT +>B7_597:7:31:948:254 +CCTCTACATGGCTGATTATGAAAACAATGTTCCCC +>B7_597:7:31:948:254 +TGAAGCACTGAACTTCCACGTCTCATCTAGGGGAA +>B7_597:7:41:34:211 +CACCTAACACAAGACTACCCAGATTCATAAAACAA +>B7_597:7:41:34:211 +GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG +>B7_597:7:5:753:806 +AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC +>B7_597:7:5:753:806 +ATGTAAAGTAACTGAACCTATGAGTCACAGGTATT +>B7_597:7:94:273:165 +AGAAAGAAGATATAACCATCCTACTAAATACATAT +>B7_597:7:94:273:165 +TTACAAGAAACTCATTAATAAAGACATGAGTTCAG +>B7_597:8:147:360:141 +TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA +>B7_597:8:147:360:141 +TTTGGTAATTTAGTTTTTTTTTTTTCTTTTCTCTT +>B7_597:8:186:850:838 +GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT +>B7_597:8:186:850:838 +GTTCTATTTGTAATGAAAACTATATTTATGCTATT +>B7_597:8:35:118:589 +TCATAAAACAAATACTACTAGACCTAAGAGGGATG +>B7_597:8:35:118:589 +TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA +>B7_597:8:48:805:860 +AAACCTGTCAAACACGAATGTTATGCCCTGCTAAA +>B7_597:8:48:805:860 +AAAGTACAAAACTCACAGGTTTTATAAAACAATTA +>B7_610:1:12:88:200 +ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT +>B7_610:1:12:88:200 +GAAGATATAACCATCCTACTAAATACATATGCACC +>B7_610:1:139:152:856 +AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT +>B7_610:1:139:152:856 +CTAAGCCGTTCTATTTGTAATGAAAACTATATTTA +>B7_610:1:37:652:403 +CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT +>B7_610:1:37:652:403 +TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG +>B7_610:2:189:831:878 +AGAAAAAAAAACCTGTCAAACACGAATGTTATGCC +>B7_610:2:189:831:878 +AGGAAGATACATTGCAAGACAGACTTCATCAAGAT +>B7_610:2:194:688:289 +TCAGACCCTACACGAATGCGTCTCTACCACAGGGG +>B7_610:2:194:688:289 +TGTGTGTTCTCATCAACCTCATACACACACATGGT +>B7_610:2:6:529:366 +CATACAATGATAAAAAGATCAATTCAGCAAGAAGA +>B7_610:2:6:529:366 +GCTACTCAATATATCCATGTAACAAATCTGCGCTT +>B7_610:2:75:887:149 +TACAACAGGAACAAAACCTCATATATCAATATTAA +>B7_610:2:75:887:149 +TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC +>B7_610:3:102:825:507 +TGCTGCATCCCTGTCTTCCTCTGTCTTGATTTACT +>B7_610:3:102:825:507 +TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC +>B7_610:3:120:63:653 +AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG +>B7_610:3:120:63:653 +TCTTCTTCCAAAGATGAAACGCGTAACTGCGCTCT +>B7_610:3:137:895:681 +CTTCCTATGGAAAGGTTGTTGGGAGATTTTTAATG +>B7_610:3:137:895:681 +GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC +>B7_610:3:148:340:479 +TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC +>B7_610:3:148:340:479 +TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG +>B7_610:3:182:23:585 +AGAACAGCTTAGGTATCAATTTGGTGTTCTGTGTA +>B7_610:3:182:23:585 +ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT +>B7_610:3:5:863:302 +ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT +>B7_610:3:5:863:302 +TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT +>B7_610:3:82:998:566 +ATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCT +>B7_610:3:82:998:566 +GCACATTACTACCCTGCAATTAATATAATTGTGTC +>B7_610:3:84:101:328 +AATGGACCTGTGATATCTGGATTCTGGGAAATTCT +>B7_610:3:84:101:328 +TATAATACCTCTACATGGCTGATTATGAAAACAAT +>B7_610:3:85:219:371 +GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT +>B7_610:3:85:219:371 +TAACATTACAACAGGAACAAAACCTCATATATCAA +>B7_610:4:139:989:144 +ACTAAAAAAGCAAAAACAAAAACTATGCTAAGTAT +>B7_610:4:139:989:144 +ACTACTAGACCTAAGAGGGATGAGAAATTACCTAA +>B7_610:4:15:805:420 +ATGAAGAGACTATTCACATGTGAACCACACATTTA +>B7_610:4:15:805:420 +GAACAGTTTAGGTATCAATTTGGTGTTCTTTGTAA +>B7_610:4:198:59:675 +AATCTGCGCTTGTACTTCTAAATCTATAACAAAAT +>B7_610:4:198:59:675 +ACTAAATACATATGCACCTAACACAAGACTATCCT +>B7_610:4:67:317:249 +CTACATGGCTGATTATGAAATCTATGTTCCCCATA +>B7_610:4:67:317:249 +TTCCCATCATGACGCACCGAACTTCCACGTCTCAT +>B7_610:5:102:915:87 +AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC +>B7_610:5:102:915:87 +CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA +>B7_610:5:120:596:847 +AACCTATGAGTCACAGGTATTCCTGAGGAAAAAGA +>B7_610:5:120:596:847 +TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAG +>B7_610:5:136:260:254 +AAATTAACATTACAACAGGAACAAAACCTCATATA +>B7_610:5:136:260:254 +GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA +>B7_610:5:147:68:353 +AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT +>B7_610:5:147:68:353 +CCTTTGATATCTGGATTCTGGGAAATTCTTCATCC +>B7_610:5:51:904:391 +ACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA +>B7_610:5:51:904:391 +TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA +>B7_610:5:7:761:623 +CCGGCATGGTTGTACTGGGCAATACATGAGATTAT +>B7_610:5:7:761:623 +CTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTG +>B7_610:6:107:252:533 +AGAGAAGGAGTAGCTATACTTATATCAGATAAAGC +>B7_610:6:107:252:533 +CAAGACTACCCAGATTCATAAAACAAATACTACTA +>B7_610:6:111:379:700 +ACACTAAAAGCCCATACTTTACTGCTACTCAATAT +>B7_610:6:111:379:700 +CGCACTGGCAATATTTGTGTGTTTACTTTTTTGCA +>B7_610:6:143:620:158 +ACTTTACTGCTACTCAATATATCCATGTAACAAAT +>B7_610:6:143:620:158 +CAATGATAAAAAGATCAATTCAGCAAGAAGATATA +>B7_610:6:148:776:486 +AACTGTGAGCCATCACAATGAACAACAGGAAGAAA +>B7_610:6:148:776:486 +AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT +>B7_610:7:116:157:612 +GTAAAAGTCAAAATTAAAGTTCAATACTCACCATC +>B7_610:7:116:157:612 +TTAAGAGATATAGATTGGCAGTACAGATTTAAAAA +>B7_610:7:117:857:942 +AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT +>B7_610:7:117:857:942 +GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC +>B7_610:7:158:943:467 +AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA +>B7_610:7:158:943:467 +AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT +>B7_610:7:15:696:693 +TCAAACACGAATGTTAATCCCTGCTAAACTAATCA +>B7_610:7:15:696:693 +TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT +>B7_610:7:177:469:800 +AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA +>B7_610:7:177:469:800 +TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA +>B7_610:7:26:749:174 +CAGATTCATAAAACAAATACTACTAGACCTAAGAG +>B7_610:7:26:749:174 +TAACAAAAGTAAATAAAACACATAGCTAAAACTAA +>B7_610:7:34:144:868 +AATTACCTAATTGGTACAATGTACAATATTCTGAT +>B7_610:7:34:144:868 +AGCTAAGGAATGGGAAAGGTGTGGGGAAAAAAGTA +>B7_610:7:35:378:681 +GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT +>B7_610:7:35:378:681 +GTGTGTTCTCATCAACCTCATACACACACATGGTT +>B7_610:8:163:757:432 +CCAGATGAACCACACATTAATACTATGTTTCTCAT +>B7_610:8:163:757:432 +GGTTTCCCATCATGAAGCACTGAACTTCCACGTCT +>B7_610:8:68:570:705 +AACAGATTTAAAAACATGAACTAACTATATGCTGT +>B7_610:8:68:570:705 +CATCATACAATGATAAAAAGATCAATTCAGCAAGA +>B7_610:8:95:426:791 +CCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG +>B7_610:8:95:426:791 +GNTCCAGATTGCTTGTGGTCTGACAGGCTGCAACT +>EAS112_32:7:113:809:364 +GATGCCCTCTTCTTCCAAAGATGAAACGCGTAACT +>EAS112_32:7:113:809:364 +TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG +>EAS112_32:7:135:401:735 +AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC +>EAS112_32:7:135:401:735 +CCTTACAAGCCAGAAGAGATTGGATCTAATTTTTG +>EAS112_32:7:168:117:441 +TCATAACTATGAAGAGACTATTGCCAGATGAACCA +>EAS112_32:7:168:117:441 +TCTTCTTAGGGAAGAACAGCTTAGGTATCAATTTG +>EAS112_32:7:272:328:400 +CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA +>EAS112_32:7:272:328:400 +CTAAATACATATGCACCTAACACAAGACTACCCAG +>EAS112_32:7:322:391:742 +ATCAATATTAACTTTGAATAAAAAGGGATTAAATT +>EAS112_32:7:322:391:742 +CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA +>EAS112_32:7:42:804:114 +ATACTTTACTGCTACTCAATATATCCATGTAACAA +>EAS112_32:7:42:804:114 +TCAAATATTGCTAGTGGGAGTATAAATTGTTTTCC +>EAS112_32:8:88:90:59 +ATAATACCTCTACATGTCTGATTATGAAAACAATG +>EAS112_32:8:88:90:59 +TGCACCTCCCTGTTCACCTAGATGCTAGGAGGACA +>EAS112_32:8:89:254:332 +AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT +>EAS112_32:8:89:254:332 +GAATTAACCCAGTCAGACAAAAATAAAGAAAAAAG +>EAS112_34:4:12:273:89 +AGTCTTTCCTGACAAGCAAATGCTAAGATAATTCA +>EAS112_34:4:12:273:89 +CCATCAGAATAACAATGGGCTTCTCAGCGGAAACC +>EAS112_34:4:17:989:186 +TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA +>EAS112_34:4:17:989:186 +TTATGAATTAACCCAGTCAGACAAAAATAAAGAAA +>EAS112_34:4:22:206:150 +AAAAAAGAGCAACTAGGTAAAAAATTAACATTACA +>EAS112_34:4:22:206:150 +GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC +>EAS112_34:4:74:570:695 +CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA +>EAS112_34:4:74:570:695 +TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT +>EAS112_34:4:92:412:435 +AGATTCATAAAACAAATACTACTAGACCTAAGAGG +>EAS112_34:4:92:412:435 +CTACGCAAACAGAAACCAANTGAGAGAAGGAGTAG +>EAS112_34:6:127:153:861 +CTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTC +>EAS112_34:6:127:153:861 +TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT +>EAS112_34:6:130:865:838 +AAAGCATACAGTCATCTATAAAGGAAATCCCATCA +>EAS112_34:6:130:865:838 +AATGCTAAGATAATTCATCATCACTAAACCAGTCC +>EAS112_34:6:145:144:263 +TTTCGTTTTTTTTTTTTTTTTTTCCCCTTTCTTTT +>EAS112_34:6:43:47:279 +AAAACTATGCTAAGTATTGGTAAAGATGTGGGGAA +>EAS112_34:6:43:47:279 +TAGACCTAAGAGGGATGAGAAGTTACCTAATTGGT +>EAS112_34:6:71:85:629 +CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA +>EAS112_34:6:71:85:629 +TTGACACCCAACTAATATTTGTCTGAGCAAAACAG +>EAS112_34:6:75:615:555 +AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG +>EAS112_34:6:75:615:555 +TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA +>EAS112_34:7:118:523:591 +GAGGGACGCTGAAGAACTTTGATGCCCTCTTCTTC +>EAS112_34:7:118:523:591 +GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG +>EAS112_34:7:141:80:875 +AGCCGAGTCACGGGGTTGCCAGCACAGGGGCTTAA +>EAS112_34:7:141:80:875 +AGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCA +>EAS112_34:7:142:457:584 +GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT +>EAS112_34:7:142:457:584 +TGAAGAGACTATTTCCAGATGAACCACACATTAAT +>EAS112_34:7:71:62:254 +AAAAAAGTAAACTCTCAAATATTGCTAGTGGGAGT +>EAS112_34:7:71:62:254 +GGTTACACTAAAAGCCCATACTTTCCTGCTACTCA +>EAS112_34:7:86:498:373 +CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG +>EAS112_34:7:86:498:373 +GATACCATCCCTGTCTTACTTCCAGCTCACCAGAG +>EAS112_34:7:96:489:453 +AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT +>EAS112_34:7:96:489:453 +AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA +>EAS112_34:8:103:812:255 +ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC +>EAS112_34:8:103:812:255 +TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCC +>EAS112_34:8:174:557:872 +GGTAAAGATGTGGGGAAAAAAGTAAACTCTCAAAT +>EAS112_34:8:174:557:872 +TGGTACAATGTACAATATTCTGATGATGGTTACAC +>EAS112_34:8:179:13:782 +GACAGTCTACAACTGTGAGCCATCACAATGAACAA +>EAS112_34:8:179:13:782 +TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC +>EAS112_34:8:30:816:90 +ACTACCCTGCAATTAATATAATTGTGTCCATGTAC +>EAS112_34:8:30:816:90 +AGGGAGGTGCACTAATGCGCTCCACGCCCCAGCCC +>EAS112_34:8:45:800:733 +ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA +>EAS112_34:8:45:800:733 +ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG +>EAS112_34:8:4:841:339 +ACCTCATACACACACATGGTTTAGGGGTATAATAC +>EAS112_34:8:4:841:339 +CTTCAGACCCTACACGAATGCGTCTCTACCACAGG +>EAS114_26:1:113:367:659 +AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA +>EAS114_26:1:113:367:659 +CACAGGTATTCCTGAGGAAAAAGAAAAAGCGAGAA +>EAS114_26:1:155:807:19 +AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG +>EAS114_26:1:155:807:19 +CAACAGTAAAATAAAACAAAGGAGGTCATCATACA +>EAS114_26:1:171:527:247 +AACAAATGCTACTAGACCTAAGAGGGATGAGAAAT +>EAS114_26:1:171:527:247 +AGAAGGAGTAGCTAGACTTATATCAGATAAAGCAC +>EAS114_26:1:324:238:736 +AGACAGACTTCATCAAGATATGTAGTCATCAGACT +>EAS114_26:1:324:238:736 +TCAAGAAGTATGAGATTATGTAAAGTAACTGAACC +>EAS114_26:1:35:522:294 +GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA +>EAS114_26:1:35:522:294 +TTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTT +>EAS114_26:1:99:212:522 +ACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTT +>EAS114_26:1:99:212:522 +AGAGACTATTGCCAGATGAACCACACATTAATACT +>EAS114_26:2:130:609:467 +AAATTCCCCCACTTAAGAGATATAGATTGGCAGAA +>EAS114_26:2:130:609:467 +CAATACTCACCATCATAAATACACACAAAAGTACA +>EAS114_26:2:214:950:32 +ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT +>EAS114_26:2:214:950:32 +AGAAGATATAACCATCCTACTAAATACATATGCAC +>EAS114_26:2:237:497:165 +GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC +>EAS114_26:2:237:497:165 +TACAGTCATCTATAAAGGAAATCCCATCAGAATAA +>EAS114_26:2:315:219:7 +GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG +>EAS114_26:2:329:458:365 +GTGTTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGT +>EAS114_26:2:329:458:365 +TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG +>EAS114_26:2:73:513:102 +GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC +>EAS114_26:2:73:513:102 +TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT +>EAS114_26:3:117:284:589 +ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA +>EAS114_26:3:117:284:589 +GAACCTATGAGTCACAGGTATTCCTGAGGAAAAAG +>EAS114_26:3:284:261:124 +ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG +>EAS114_26:3:287:665:495 +GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA +>EAS114_26:3:287:665:495 +TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA +>EAS114_26:4:100:238:596 +ATGAGAAATTACCTAATTGGTACAATGTACAATAT +>EAS114_26:4:100:238:596 +CAAAAACTATTCTAAGTATTGGTAAAGATGTGGGG +>EAS114_26:4:110:840:431 +CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA +>EAS114_26:4:110:840:431 +GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA +>EAS114_26:4:123:1001:580 +AGGTTTTATAAAACAATTAATTGAGACTACAGAGC +>EAS114_26:4:123:1001:580 +GGGAANTAAAGTCAAGTCTTTCCTGACAAGCAAAT +>EAS114_26:4:253:285:104 +CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA +>EAS114_26:4:253:285:104 +GTGATGTGTGTTCTCATCAACCTCATACACACACA +>EAS114_26:4:306:388:342 +CCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT +>EAS114_26:4:306:388:342 +GGGGAAGACATAATCCCACGCTTCCTATGGAAAGG +>EAS114_26:4:40:352:151 +ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT +>EAS114_26:4:40:352:151 +TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT +>EAS114_26:5:139:331:63 +GACACCCAACTAATATTTGTCTGAGCAAAACAGTC +>EAS114_26:5:139:331:63 +TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT +>EAS114_26:5:228:189:826 +AAGCCCTTCTCACAGTTTCTGCCCCCCGCATGGTT +>EAS114_26:5:228:189:826 +ATCATGACTCTATCCCAAATTCCCAATTACGTCCT +>EAS114_26:5:238:31:968 +ACACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG +>EAS114_26:5:238:31:968 +ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTG +>EAS114_26:5:43:114:617 +AATCATAAATACACACAAAAGTACAAAACTCACAG +>EAS114_26:5:43:114:617 +AATGTTATGCCCTGCTAAACTAAGCATCATAAATG +>EAS114_26:6:129:694:359 +CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT +>EAS114_26:6:129:694:359 +TGTCAGTTACCAAATGTGTTTATTACCCGAGGGAT +>EAS114_26:6:140:253:322 +AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC +>EAS114_26:6:140:253:322 +GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA +>EAS114_26:6:183:697:555 +AAAGAATGCCAGGAAGATACATTGCCAGACAGACT +>EAS114_26:6:183:697:555 +AGAAATCTTAGAAGCCAGAAGAGATTGGATCTAAT +>EAS114_26:6:46:13:880 +AAAACCTCTTTAGTCTTGCTAGAGATTTAGACATC +>EAS114_26:6:46:13:880 +AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA +>EAS114_26:7:13:172:720 +AATTCATTTAAGAAATTACAAAATATAGTTGAAAG +>EAS114_26:7:157:876:302 +AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA +>EAS114_26:7:157:876:302 +CAACTAGGTAAAAAATTAACATTACAACACGAACA +>EAS114_26:7:218:858:445 +AAAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT +>EAS114_26:7:218:858:445 +GAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATA +>EAS114_26:7:245:323:744 +ACCTCTACATGGCTGATTATGAAAACAATGTTCCC +>EAS114_26:7:245:323:744 +GATTCTGGGAAATTCTTCATCCTGGACCCTGAGAG +>EAS114_26:7:37:79:581 +TTAAAATTTAAAAAAAGTAAATAAAACACATAGCT +>EAS114_26:7:37:79:581 +TTTTTTTTTTTTTTTTTTTTTTTCATGCCAGAAAA +>EAS114_26:7:86:308:648 +GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG +>EAS114_26:7:86:308:648 +TATTAGGAAATGCTTTACTGTCATAACTATGAAGA +>EAS114_28:1:144:242:602 +ATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG +>EAS114_28:1:144:242:602 +ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG +>EAS114_28:1:168:389:889 +GAAATTACAAAATATAGTTGAAAGCTCTAACAATAG +>EAS114_28:1:168:389:889 +TAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA +>EAS114_28:1:168:609:646 +GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG +>EAS114_28:1:168:609:646 +GGTTACACTAAAAGCCCATACTTTACTGCTACTCAA +>EAS114_28:1:220:801:282 +AACCTCATATATCAATATTAACTTTGAATAAAAAGG +>EAS114_28:1:220:801:282 +AATTCATCATCACTAAACCAGTCCTATAAGAAATGC +>EAS114_28:1:232:351:909 +ACATGGCTGATTATGAAATCAATGTTCCCCAGATGC +>EAS114_28:1:232:351:909 +CCATCATGAAGCGCTGAACTTCCACGTCTCATCTAG +>EAS114_28:1:28:708:463 +CCCAATGGACCTGTGATATCTGGATTCTGGGAAATT +>EAS114_28:1:28:708:463 +GTATAATACCTCTACATGGCTGATTATGAAAACAAT +>EAS114_28:2:114:938:216 +CTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT +>EAS114_28:2:114:938:216 +GAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGA +>EAS114_28:2:141:7:963 +CACTTTAAATCAACAACAGTAAAATAAAACAAAGGA +>EAS114_28:2:141:7:963 +TACAATGTACAATATTCTGATGATGGTTACACTAAA +>EAS114_28:2:149:650:44 +CGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC +>EAS114_28:2:149:650:44 +CTGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC +>EAS114_28:2:167:905:852 +AGAAAAGCATACAGTCATCTATAAAGAAAATCCCAT +>EAS114_28:2:167:905:852 +CAAATGCTAAGATAATTCATCATCACTAAACCAGTC +>EAS114_28:2:251:819:772 +TCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT +>EAS114_28:2:251:819:772 +TTCAATACTCACCATCATAAATACACACAAAAGTAC +>EAS114_28:2:28:474:566 +ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG +>EAS114_28:2:28:474:566 +TGAACCACACATTAATACTATGTTTCTTATCTGCAC +>EAS114_28:2:329:437:643 +AAGATACATTGCAAGACAGACTTCATCAAGATATGT +>EAS114_28:2:329:437:643 +TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC +>EAS114_28:2:55:562:403 +CAACAGGAACAAAACCTCATATATCAATATTAACTT +>EAS114_28:2:55:562:403 +CAAGCAAATGCTAAGATAATTCATCATCACTAAACC +>EAS114_28:3:110:984:98 +AAGGAGGTCATCATACAATGATAAAAAGATCAATTC +>EAS114_28:3:110:984:98 +ACTAAAACCCCATACTTTACTGCTACTCAATATATC +>EAS114_28:3:173:627:465 +GTAAACTCTCAAATATTGCTAGTGGGAGTATAAATT +>EAS114_28:3:173:627:465 +TGATGGTTACACTAAAAGCCCATACTTTACTGCTAC +>EAS114_28:3:176:402:458 +AAATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA +>EAS114_28:3:176:402:458 +CCTAAGAGGGATGAGAAATTACCTAATTGGTACAAT +>EAS114_28:3:202:275:776 +CAAATACTACTAGACCTAAGAGGGATGAGAAATTAC +>EAS114_28:3:202:275:776 +TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTAG +>EAS114_28:3:250:628:423 +CAATGGGCTTCTCAGCGGAAACCTTACAAGCCAGAA +>EAS114_28:3:250:628:423 +CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG +>EAS114_28:3:279:763:945 +CTGCACATTACTACCCTGCAATTAATATAATTGTGT +>EAS114_28:3:279:763:945 +GCCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT +>EAS114_28:3:308:509:948 +AATATATCCATGTAACAAATCTGCGCTTGTACTTCT +>EAS114_28:3:308:509:948 +AATTCAGCAAGAAGATATAACCATCCTACTAAATAC +>EAS114_28:3:32:492:907 +CAAACACGAATGTTATGCCCTGCTAAACTAAGCATC +>EAS114_28:3:32:492:907 +TGTAGTCATCAGACTATCTAAAGTCAACATGAAGGA +>EAS114_28:3:78:773:660 +ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTGA +>EAS114_28:3:78:773:660 +CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC +>EAS114_28:4:13:701:55 +AAACCAAATGAGAGAAGGAGTAGCTATACTTATATC +>EAS114_28:4:13:701:55 +TTCATAAAACAAATACTACTAGACCTAAGAGGGATG +>EAS114_28:4:149:572:877 +ATGTAAAGTAACTGAACCTATGAGTCACAGGTATTC +>EAS114_28:4:149:572:877 +GAGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA +>EAS114_28:4:215:246:640 +AAAAGCATACAGTCATCTATAAAGGAAATCCCATCA +>EAS114_28:4:215:246:640 +AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT +>EAS114_28:4:305:707:258 +AAAAAGATGTTCTACGCAAGCAGAAACCAAATGAGA +>EAS114_28:4:305:707:258 +GAACAAAACCTCATATATCAATATTAACTTTGAATA +>EAS114_28:4:322:631:245 +CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC +>EAS114_28:4:322:631:245 +TATTTTTGTCTTGACACCCAACTAATATTTGTCTGA +>EAS114_28:4:9:55:730 +ATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGC +>EAS114_28:4:9:55:730 +CAGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT +>EAS114_28:5:104:350:749 +AAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT +>EAS114_28:5:104:350:749 +TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGCG +>EAS114_28:5:11:868:62 +TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGT +>EAS114_28:5:11:868:62 +TTTACTGTCATAACTATGAAGAGACTATTGCCAGAT +>EAS114_28:5:163:832:715 +TAAAAACATGAACTAACTATATGCTGTTTACAAGAA +>EAS114_28:5:163:832:715 +TAAAACAAAGGAGGTCATCATACAATGATAAAAAGA +>EAS114_28:5:206:671:49 +ACCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA +>EAS114_28:5:206:671:49 +GCTTGTGGTCTGACAGGCTGCAACTGTGAGCCATCA +>EAS114_28:5:209:778:588 +AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT +>EAS114_28:5:209:778:588 +TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT +>EAS114_28:5:23:944:377 +AATGTTATGCCCTGCTAAACTAAGCATCATAAATGA +>EAS114_28:5:23:944:377 +AGTACAAAACTCACAGGTTTTATAAAACAATTAATT +>EAS114_28:6:11:151:750 +GTTTTTATTTTTTTCCTCTCTCTTTTTTTTTTTTTT +>EAS114_28:6:155:68:326 +CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTAA +>EAS114_28:6:155:68:326 +GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGTG +>EAS114_28:6:175:705:982 +CATGGTTTAGGGGTATAATACCTCTACATGGCTGAT +>EAS114_28:6:175:705:982 +CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG +>EAS114_28:6:185:87:475 +AAGAAACTCATTAATAAAGACATGAGTTCAGGTAAA +>EAS114_28:6:185:87:475 +ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACA +>EAS114_28:6:187:996:432 +TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTTC +>EAS114_28:6:187:996:432 +TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG +>EAS114_28:6:51:506:878 +TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCT +>EAS114_28:6:51:506:878 +TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACT +>EAS114_28:6:54:263:585 +TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCATC +>EAS114_28:6:54:263:585 +TGTCCATGTACACACGCTGTCCTATGTACTTATCAT +>EAS114_28:7:133:514:754 +AGCTATACTTATATCAGATAAAGCACACTTTAAATC +>EAS114_28:7:133:514:754 +TAAATTTGAATAAAAAGGGATTAAATTCCCCCACTT +>EAS114_28:7:157:786:424 +GCTTTACTGTCATAACTATGAAGAGACTATTGCCAG +>EAS114_28:7:157:786:424 +TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG +>EAS114_28:7:178:276:693 +GTTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC +>EAS114_28:7:178:276:693 +TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAAC +>EAS114_28:7:215:863:521 +ACTCACCATCATAAATACACACAAAAGTACAAAACT +>EAS114_28:7:215:863:521 +TAAGAGATATAGATTGGCAGAACAGATTTAAAAACA +>EAS114_28:7:242:354:637 +AACTATATTTATGCTATTCAGTTCTAAATATAGAAA +>EAS114_28:7:242:354:637 +CCCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT +>EAS114_28:7:287:492:169 +CGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG +>EAS114_28:7:287:492:169 +GTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAAC +>EAS114_28:7:57:324:546 +GTCATCTATAAAGGAAATCCCATCAGAATAACAATG +>EAS114_28:7:57:324:546 +TAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT +>EAS114_30:1:134:379:893 +AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA +>EAS114_30:1:134:379:893 +CGCTGTCCTATGTACTTATCATGACTCTATCCCAA +>EAS114_30:1:154:818:165 +GAACAGGGAGGTGCACTAATGCGCTCCACGCCCAA +>EAS114_30:1:154:818:165 +TTCTTATCTGCACATTACTACCCTGCAATTAATAT +>EAS114_30:1:176:168:513 +ATTTGTAATGAAAACTATATTTATGCTATTCAGTT +>EAS114_30:1:176:168:513 +TTTGATGCCCTCTTCTTCCAAAGATGAAACGCGTA +>EAS114_30:1:188:863:790 +CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC +>EAS114_30:1:188:863:790 +TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT +>EAS114_30:1:243:10:911 +TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT +>EAS114_30:1:64:526:339 +ACATTACAACAGGAACAAAACCTCATATATCAATA +>EAS114_30:1:64:526:339 +CAAATGAGAGAAGGAGTATCTATACTTATATCAGA +>EAS114_30:2:111:142:21 +ATCAGAATAACAATGGGCTTCACAGCGGAAACCTT +>EAS114_30:2:111:142:21 +CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC +>EAS114_30:2:226:885:729 +AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG +>EAS114_30:2:226:885:729 +GCTGAACTTACATCAGATAAAGCACACTTTAAATC +>EAS114_30:2:272:750:698 +GTGTTTATTACCAGAGGGATGGAGGGATGACGGAC +>EAS114_30:2:272:750:698 +TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG +>EAS114_30:2:297:949:26 +ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA +>EAS114_30:2:297:949:26 +CATATATCAATATTAACTTTGAATAAAAAGGGATT +>EAS114_30:2:303:428:326 +AAAATTAAAATTTAACAAAAGTAAATAAAACACAT +>EAS114_30:2:303:428:326 +TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT +>EAS114_30:2:30:887:404 +CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG +>EAS114_30:2:30:887:404 +TTGCCTTCAGACCCTGCACGAATGCGTCTCTACCA +>EAS114_30:2:315:412:921 +GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATA +>EAS114_30:2:315:412:921 +TTCTGATGATGGTTACACTACAAGCCCATACTGTA +>EAS114_30:2:82:963:128 +ATTAAAGTTCAATACTCACCATCATAAATACACAC +>EAS114_30:2:82:963:128 +GGCAGAACAGATTTAAAAACATGAACTAACTATAT +>EAS114_30:3:139:117:262 +AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG +>EAS114_30:3:139:117:262 +GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC +>EAS114_30:3:14:697:541 +TAAAAGCAGCAAGAGAAAAGCATACAGTCATCTAT +>EAS114_30:3:14:697:541 +TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA +>EAS114_30:3:161:366:544 +CTTCTGTAATTGAAAAATTCATTTAAGAAATTACA +>EAS114_30:3:181:582:435 +CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT +>EAS114_30:3:181:582:435 +GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA +>EAS114_30:3:187:294:947 +ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT +>EAS114_30:3:187:294:947 +AGAGACTATTGCCAGATGAACCACACATTAATACT +>EAS114_30:3:215:840:760 +AAGTATTGGTAAAGATGTGGGGAAAAAAGTAAACT +>EAS114_30:3:215:840:760 +CTGATGATGGTTACACTAAAAGCCCATACTTTCCT +>EAS114_30:3:24:195:604 +TCACAGTTTCTGCCCCCAGCATGGTTGTACTGTGC +>EAS114_30:3:24:195:604 +TGTCCTATGTACTTATCATGACTCTATCCCAAATT +>EAS114_30:3:302:288:657 +AGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAGG +>EAS114_30:3:302:288:657 +CCAGATGAACCACACATTAATACTATGTTTCTTAT +>EAS114_30:3:35:361:546 +TGCACTAATGCGCTCCACGCCCAAGCCCTTCTCAC +>EAS114_30:3:35:361:546 +TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG +>EAS114_30:3:39:348:594 +AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC +>EAS114_30:3:39:348:594 +CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA +>EAS114_30:4:183:852:253 +ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT +>EAS114_30:4:183:852:253 +CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC +>EAS114_30:4:317:378:535 +AGCTTGGGCTGTAATGATGCCCCTTGGCCATCACC +>EAS114_30:4:317:378:535 +GCTGTCCTATGTACTTATCATGACTCTATCCCAAA +>EAS114_30:4:327:795:103 +AACCTTGAGAACCCCAGGGAATTTGTCAATGTCAG +>EAS114_30:4:327:795:103 +ACAGGGGCTTAACCTCTGGTGACTGCCAGAGCTGC +>EAS114_30:4:328:537:640 +AAGTATGAGATTATGTAAAGTAACTGAACCTATGA +>EAS114_30:4:328:537:640 +GGAAGATACATTGCAAGACAGACTTCATCAAGATA +>EAS114_30:5:327:991:508 +ACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGCA +>EAS114_30:5:327:991:508 +TCTGGATTCTGGGAAATTCTTCATCCTGGACCCTG +>EAS114_30:5:32:461:154 +ACAGGTTTTATAAAACAATTAATTGAGACTACAGA +>EAS114_30:5:32:461:154 +TTACAAGAAACTCATTAATAAAGACATGAGTTCAG +>EAS114_30:6:137:741:866 +ACACTAAAAGCCCATACTTTACTGCTACTCAATAT +>EAS114_30:6:137:741:866 +GATGAGGGGAAAAAAGTAAACTCTCAAATATTGCT +>EAS114_30:6:157:42:763 +TCTGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCG +>EAS114_30:6:157:42:763 +TTTCTTATCTGCACATTACTACCCTGCAATTATTA +>EAS114_30:6:163:312:891 +CCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTGC +>EAS114_30:6:163:312:891 +TTCCCCAGATACCGTCCCTGTCTTACTTCCAGCTC +>EAS114_30:6:214:565:337 +AAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC +>EAS114_30:6:214:565:337 +CAGAATAACAATGGGCTTCTCAGCAGAAACCTTAC +>EAS114_30:6:220:809:850 +GGGGGGAAAAAGATGTGCTACACAAAAAGATTCCA +>EAS114_30:6:220:809:850 +TTCATAAAACAAATACTACTAGACCTAAGAGGGAT +>EAS114_30:6:238:803:383 +ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA +>EAS114_30:6:238:803:383 +ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG +>EAS114_30:6:243:209:110 +AAAACATGAACTAACTATATGCTGTTTACAAGAAA +>EAS114_30:6:243:209:110 +CACAGGTTTTATAAAACAATTAATTGAGACTACAG +>EAS114_30:6:277:397:932 +TTTCTTTTCACTTTTTTTTTTTTTTTTTTTTACTT +>EAS114_30:6:290:146:36 +CTTTCCCATCCCCCGGTCCCTGCCCCATCTCTTGT +>EAS114_30:6:290:146:36 +TTATCATGACTCTATCCCAAATTCCCAATTACGTC +>EAS114_30:6:326:309:149 +CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA +>EAS114_30:6:326:309:149 +CTCCCTGTCACCCAATGGACCTGTGATATCTGGAT +>EAS114_30:6:41:461:436 +TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT +>EAS114_30:6:41:461:436 +TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA +>EAS114_30:6:49:656:507 +AAGGAAATCCCATCAGAATAACAATGGGCTTCTCA +>EAS114_30:6:49:656:507 +TCCTGACAAGCAAATGCTAAGATAATTCATCATCA +>EAS114_30:6:4:665:771 +GAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA +>EAS114_30:6:4:665:771 +GTGCTTTATCTGATATCAATGCCGATAAACTGCCT +>EAS114_30:6:62:386:959 +AAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC +>EAS114_30:6:62:386:959 +AATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGT +>EAS114_30:7:269:944:220 +ATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAA +>EAS114_30:7:269:944:220 +TGGGCAATACATGAGATTATTAGGAAATGCTTTAC +>EAS114_30:7:283:799:560 +ACATAGACCCCCTTGCAACAACCTTGAGAACCCCA +>EAS114_30:7:283:799:560 +GGGGTTGCCAGCACAGGGGCTTAACCTCTGGTGAC +>EAS114_30:7:310:155:312 +CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA +>EAS114_30:7:310:155:312 +CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT +>EAS114_30:7:319:11:255 +TACCCAGATTCATAAAACAAATACTACTAGACCTA +>EAS114_30:7:319:11:255 +TCTATAAAAAAATTAAAATTTAACAAAAGTAAATA +>EAS114_30:7:59:871:351 +GTAAAAAATTAACATTACAACAGGAACAAAACCTC +>EAS114_30:7:59:871:351 +TAAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAG +>EAS114_30:7:71:311:202 +TATGAGATTATGTAAAGTAACTGAACCTATGAGTC +>EAS114_30:7:71:311:202 +TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA +>EAS114_32:1:199:760:42 +ACCCAATTAATATTTTTCTTAGCAAAACAGTCTAG +>EAS114_32:1:199:760:42 +CTCTCTAATTTTTGCTGCTTCCATGTCTTACTCTG +>EAS114_32:1:208:971:600 +AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC +>EAS114_32:1:208:971:600 +AGATATGTAGTCATCAGACTATCTAAAGTCAACAT +>EAS114_32:2:163:618:570 +AGGCTGCAACTGTGAGCCATCACAATGAACAACAG +>EAS114_32:2:163:618:570 +GGAAAGCTGTCAACGCTTCTAGCCATTTCTTTTGG +>EAS114_32:2:197:170:559 +CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC +>EAS114_32:2:197:170:559 +TTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAACA +>EAS114_32:2:247:900:123 +AAAACATGAACTAACTATATGCTGTTTACAAGAAA +>EAS114_32:2:247:900:123 +AATTCAGCAAGAAGATATAACCATCCTACTAAATA +>EAS114_32:2:283:577:398 +ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG +>EAS114_32:2:283:577:398 +CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA +>EAS114_32:2:306:119:56 +CTTCTCACAGTTTCTGCCCCCAGCATGGTTGTACT +>EAS114_32:2:306:119:56 +TCCATGTACACACGCTGTCCTATGTACTTATCATG +>EAS114_32:3:236:475:254 +AGATAAAGCACACTTTAAATCAACAACAGTAAAAT +>EAS114_32:3:236:475:254 +TTCCCCCACTTAAGAGATATAGATTGGCAGAACAG +>EAS114_32:3:307:113:346 +AATTCAGCAAGAAGATATAACCATCCTACTAAATA +>EAS114_32:3:307:113:346 +ATGCTGTTTACAAGAAACTCATTAATAAAGACATG +>EAS114_32:4:156:21:69 +AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA +>EAS114_32:4:156:21:69 +TTGCAAGACAGACTTCATCAAGATATGTAGTCATC +>EAS114_32:4:20:41:138 +CATTTCTTTTGGCATTTGCCTTCAGACCCTACACG +>EAS114_32:4:20:41:138 +GTCTTTCAAAAGGTGATGTGTGTTCTCATCAACCT +>EAS114_32:4:228:587:504 +GCACATTACGACCCGGCAAGGTGTATAATTGTGTC +>EAS114_32:4:228:587:504 +GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA +>EAS114_32:4:246:647:765 +GATCAATTCAGCAAGAAGATATAACCATCCTACTA +>EAS114_32:4:246:647:765 +TATGCTGTTTACAAGAAACTCATTAATAAAGACAT +>EAS114_32:4:42:923:169 +ACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAA +>EAS114_32:4:42:923:169 +TTCCTATGTACTTATCATGAATCTATCCCAAATTC +>EAS114_32:4:5:396:292 +ATACATATGCACCTAACACAAGACTACCCAGATTC +>EAS114_32:4:5:396:292 +TAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGA +>EAS114_32:4:7:282:424 +CAAAAACAAAAACTATGCTAAGTATTGTTAAAGAT +>EAS114_32:4:7:282:424 +TAATTGGTACAATGTACAATATTCTGATGATGGTT +>EAS114_32:5:109:199:592 +ACGAATATTATGCCCTGCTAAACTAAGCATCATAA +>EAS114_32:5:109:199:592 +AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA +>EAS114_32:5:182:313:319 +AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT +>EAS114_32:5:182:313:319 +GATGAACCACACATTAATACTATGTTTCTTATCTG +>EAS114_32:5:267:170:250 +CATAAAACAAATACTACTAGACCTAAGAGGGATGA +>EAS114_32:5:267:170:250 +CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA +>EAS114_32:5:78:583:499 +TTTACGCTATTCAGTACTAAATATAGAAATTGAAA +>EAS114_32:6:122:342:296 +AAAGCTTGGGCTGTAATGATGCCCCTTGGCCATCA +>EAS114_32:6:122:342:296 +TCCTATGTACTTATCATGACTCTATCCCAAATTCC +>EAS114_32:6:178:342:866 +AACAAATCTGCGCTTGTACTTCTAAATCTATAAAA +>EAS114_32:6:178:342:866 +ATACATATGCACCTAACACAAGACTACCCAGATTC +>EAS114_32:6:179:735:569 +ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC +>EAS114_32:6:179:735:569 +CATCACCCGGTCCCTGCCCCATCTCTTGTAATCTC +>EAS114_32:6:199:818:124 +AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT +>EAS114_32:6:199:818:124 +ACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTTG +>EAS114_32:6:78:909:394 +ATTGCTTGGTGTCTGACAGGCTGCAACTGTGAGCC +>EAS114_32:6:78:909:394 +TACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGA +>EAS114_32:6:88:162:587 +GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC +>EAS114_32:6:88:162:587 +TTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCT +>EAS114_32:7:174:597:66 +TCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCT +>EAS114_32:7:174:597:66 +TCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAAT +>EAS114_32:7:201:959:19 +CTCTACATGGCTGATTATTAAAACAATGTTCCCCA +>EAS114_32:7:201:959:19 +TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC +>EAS114_32:7:256:407:470 +AACGCTTCTAGCCATTTCTTTTGGCATTTGCCTTC +>EAS114_32:7:256:407:470 +CAGCATGGTTGTACTGGGCAATACATGAGATTATT +>EAS114_39:1:12:884:219 +GAGCCATCACAATGAACAACAGGAAGAAAAGGTCT +>EAS114_39:1:12:884:219 +GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTT +>EAS114_39:1:28:350:895 +ATATAGTTGAAAGCTCTAACAATAGACTAAACCAA +>EAS114_39:1:28:350:895 +TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA +>EAS114_39:1:43:1120:878 +ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT +>EAS114_39:1:43:1120:878 +TAATTGTGTCCATGTACACACGCTGTCCTATGTAC +>EAS114_39:1:70:147:84 +ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG +>EAS114_39:1:70:147:84 +CCAGCACAGGGGCTTAACCTCTGGTGACTGCCAGA +>EAS114_39:1:71:636:533 +GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC +>EAS114_39:1:71:636:533 +GTGGAAGACATAATCCCACGCTTCCTATGGAAAGG +>EAS114_39:1:73:302:1574 +AAGGTTGTTGGGAGATTTTTAATGATTCCTCAATG +>EAS114_39:1:73:302:1574 +CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT +>EAS114_39:1:98:641:1040 +CAGAACAGATTTAAAAACATGAACTAACTATATGC +>EAS114_39:1:98:641:1040 +TAAAACAAAGGAGGTCATCATACAATGATAAAAAG +>EAS114_39:2:18:967:582 +AAGCCGTTCTATTTGTAATGAAAACTATATTTATG +>EAS114_39:2:18:967:582 +ACGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAG +>EAS114_39:2:38:670:564 +CAGGTTTTATAAAACAATTAATTGAGACTACAGAG +>EAS114_39:2:38:670:564 +CTAACTATATGCTGTTTACAAGAAACTCATTAATA +>EAS114_39:2:41:576:1016 +CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC +>EAS114_39:2:41:576:1016 +TGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTT +>EAS114_39:2:57:1064:925 +TGACAAGCAAATGCTAAGATAATTCATCATCACTA +>EAS114_39:2:5:1219:137 +AAAACTAAAAAAGCAAAAACAAAAACTATGCTAAG +>EAS114_39:2:5:1219:137 +ACCTAAGAGGGATGAGAAATTACATAATTGGTACA +>EAS114_39:3:11:1238:1728 +AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAG +>EAS114_39:3:11:1238:1728 +TCCCATCAGAATAACAATGGGCTTCTCAGCGGAAA +>EAS114_39:3:55:464:146 +AAAAAGATCAATTCAGCAAGAAGATATAACCATCC +>EAS114_39:3:55:464:146 +CTCAATATATCCATGTAACAAATCTGCGCTTGTAC +>EAS114_39:3:6:1064:1805 +TAAAATTTAACAAAAGTAAATAAAACACATAGCTA +>EAS114_39:3:6:1064:1805 +TTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTCTT +>EAS114_39:3:88:84:1558 +AGTAACTGAACCTATGAGTCACAGGTATTCCTGTG +>EAS114_39:3:88:84:1558 +ATCAGACTATCTAAAGTCAACATGAAGGAAAAAAA +>EAS114_39:4:10:1312:1558 +AACTAACTATATGCTGTTTACAAGAAACTCATTAA +>EAS114_39:4:10:1312:1558 +AGGTTTTATAAAACAATTAATTGAGACTACAGAGC +>EAS114_39:4:30:432:228 +ATCCTACTAAATACATATGCACCTAACACAAGACT +>EAS114_39:4:30:432:228 +GACATGAGTTCAGGGAAAGGGGTGGAAAAAGATGT +>EAS114_39:4:30:570:902 +AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA +>EAS114_39:4:30:570:902 +ATACTCACCATCATAAATACGCACAAAAGTACAAA +>EAS114_39:4:43:1047:1626 +GATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGT +>EAS114_39:4:43:1047:1626 +GTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAA +>EAS114_39:4:58:271:612 +AGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTA +>EAS114_39:4:58:271:612 +ATGAAGGAAAAAAATTCTAAAATCAGCAAGAGCAA +>EAS114_39:4:93:77:1338 +GCTGCTTACAAGAAGCGCATTAATAAAGACATGAG +>EAS114_39:4:93:77:1338 +GTCATCATACAATGAAAAAAAGATCAATTCAGCAA +>EAS114_39:5:17:1222:783 +AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCGT +>EAS114_39:5:17:1222:783 +TGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT +>EAS114_39:5:42:1223:1087 +CAGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTT +>EAS114_39:5:42:1223:1087 +TTGTCTTGACACCCAACTAATATTTGTCTGAGCAA +>EAS114_39:5:50:972:1286 +AGAGGGATGGAGGGAAGAGGGACGCTGAAGAACTT +>EAS114_39:5:50:972:1286 +TTGTGGTCTGACAGGCTGCAACTGTGAGCCATCAC +>EAS114_39:5:61:1000:1534 +CTTGAAGACAAGTCTCTTATGAATTAACCCAGTCA +>EAS114_39:5:61:1000:1534 +GGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGA +>EAS114_39:5:93:312:331 +AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG +>EAS114_39:5:93:312:331 +ATCCTACTAAATACATATGCACCTAACACAAGACT +>EAS114_39:6:13:1034:1144 +AAAGATGAAACGCGTAACTGCGCTCTCATTCACTC +>EAS114_39:6:13:1034:1144 +AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA +>EAS114_39:6:34:380:815 +AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA +>EAS114_39:6:34:380:815 +ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT +>EAS114_39:6:71:644:1792 +AAAAGTACAAAACTCACAGGTTTTATAAAACAATT +>EAS114_39:6:71:644:1792 +CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT +>EAS114_39:6:76:282:1668 +AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG +>EAS114_39:6:76:282:1668 +TACAATGTACAATATTCTGATGATGGTTACACTAA +>EAS114_39:6:7:492:1088 +ACAGGTTTTATAAAACAATTAATTGAGACTACAGA +>EAS114_39:6:7:492:1088 +TGAACTAACTATATGCTGTTTACAAGAAACTCATT +>EAS114_39:6:85:1224:625 +GAACTCCCCTGGAGGTCTGATGGCGTTTCTCCCTC +>EAS114_39:6:85:1224:625 +GCTGCATCCCTGTCTTCCTCTGTCTTGATTTCCTT +>EAS114_39:6:94:1273:1462 +AAGATGTTCTACGCAAACAGAAACCAAATGAGAGA +>EAS114_39:6:94:1273:1462 +CCTAACACAAGACTACCCAGATTCATAAAACAAAT +>EAS114_39:7:100:708:1984 +AGATGAACCACACATTAATACTATGTTTCTTATCT +>EAS114_39:7:100:708:1984 +TACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG +>EAS114_39:7:23:1126:1886 +ACACTAAAAGCCCATACTTTACTGCTACTCAATAT +>EAS114_39:7:23:1126:1886 +GGAGGTCATCATACAATGATAAAAAGATCAATTCA +>EAS114_39:7:32:562:1695 +GATGATGGTTACACTAAAAGCCCATACTTTACTGC +>EAS114_39:7:32:562:1695 +TAAAACAAAGGAGGTCATCATACAATGATAAAAAG +>EAS114_39:7:57:1114:2032 +TAACTATATGCTGTTTACAAGAAACTCATTAATAA +>EAS114_39:7:57:1114:2032 +TATTACAATGATAAAAAGATCAATTCAGCAAGAAG +>EAS114_39:7:90:406:631 +CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG +>EAS114_39:7:90:406:631 +TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTT +>EAS114_45:1:100:979:1863 +ATTACAAAACTCACAGGTTTTATAAAACAATTAAT +>EAS114_45:1:100:979:1863 +TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG +>EAS114_45:1:12:1296:358 +CTTGAAAGCTTGGTCTGTAATGATGCCCCTTGGCC +>EAS114_45:1:12:1296:358 +GTCCATGTACACACGCTGTCCTATGTACTTATCAT +>EAS114_45:1:2:1422:1820 +CACCTAACACAAGACTACCCAGATTCATAAAACAA +>EAS114_45:1:2:1422:1820 +TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC +>EAS114_45:1:30:1882:1210 +ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA +>EAS114_45:1:30:1882:1210 +GCAGAAACCTTACAAGCCAGAAGAGATTGGATCTA +>EAS114_45:1:33:1407:94 +TAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG +>EAS114_45:1:33:1407:94 +TTACTTGTTGTTGGTTTTCTGTTTCTTTGTTTGAT +>EAS114_45:1:77:1000:1780 +AGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAG +>EAS114_45:1:77:1000:1780 +TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA +>EAS114_45:1:84:275:1572 +AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC +>EAS114_45:1:84:275:1572 +TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC +>EAS114_45:1:95:1530:28 +AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA +>EAS114_45:1:95:1530:28 +AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA +>EAS114_45:1:9:1289:215 +AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC +>EAS114_45:1:9:1289:215 +TATGCTATTCAGTTCTAAATATAGAAATTGAAACA +>EAS114_45:2:13:1507:1146 +AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA +>EAS114_45:2:13:1507:1146 +CAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTCT +>EAS114_45:2:15:1497:1530 +AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC +>EAS114_45:2:15:1497:1530 +TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC +>EAS114_45:2:1:1140:1206 +TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT +>EAS114_45:2:1:1140:1206 +TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT +>EAS114_45:2:20:413:1334 +CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT +>EAS114_45:2:20:413:1334 +TTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAG +>EAS114_45:2:23:1754:796 +CTTCTAAATCTATAAAAAAATTAAAATTTAACAAA +>EAS114_45:2:23:1754:796 +CTTTGGAAAACAATTTGGTAATTTCGTTTTTTTTT +>EAS114_45:2:33:1445:1357 +TATGAATTAACCCAGTCAGACAAAAATAAAGAAAA +>EAS114_45:2:33:1445:1357 +TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA +>EAS114_45:2:41:199:388 +AGAAAAAGTGAGAAGTTTGGAAAAACTATTTGAGG +>EAS114_45:2:41:199:388 +TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT +>EAS114_45:2:49:163:904 +GCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG +>EAS114_45:2:49:163:904 +TCTTTCAAAAGGTGATGTGTGTTCTCATCAACCTC +>EAS114_45:2:54:1886:719 +CTGTTTACAAGAAACTCATTAATAAAGACATGAGT +>EAS114_45:2:54:1886:719 +TTCAGCAAGAAGATATAACCATCCTACTAAATACA +>EAS114_45:2:59:396:359 +GGGTATAATACCTCTACATGGCTGATTATGAAAAC +>EAS114_45:2:59:396:359 +TCACCCAATGGACCTGTGATATCTGGATTCTGGGA +>EAS114_45:2:76:1765:700 +AAAAAGGGATTAAATTCCCCCACTTAAGAGATATA +>EAS114_45:2:76:1765:700 +GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT +>EAS114_45:2:79:554:354 +AAATAAAACAAAGGAGGTCATCATACAATGATAAA +>EAS114_45:2:79:554:354 +CAATGTACAATATTCTGATGATGGTTACACTAAAA +>EAS114_45:3:26:1867:162 +ATATAACCATCCTACTAAATACATATGCACCTAAC +>EAS114_45:3:26:1867:162 +ATATATCCATGTAACAAATCTGCGCTTGTACTTCT +>EAS114_45:3:27:1881:486 +AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC +>EAS114_45:3:27:1881:486 +CCAAAGATGAAACGCGTAACTGCGCTCTCATTCAC +>EAS114_45:3:2:1200:1076 +CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA +>EAS114_45:3:2:1200:1076 +GATGTGTGTTCTCATCAACCTCATACACACACATG +>EAS114_45:3:32:1379:738 +TTAAGAAATTACAAAATATAGTTGAAAGCTCTAAC +>EAS114_45:3:35:896:1588 +CTAGACCTAAGAGGGATGAGAAATTACCTAATTGG +>EAS114_45:3:35:896:1588 +GAGTAGCTATACTTATATCAGATAAAGCACACTTT +>EAS114_45:3:39:208:644 +ATTGTAAAAGTCAAAATTAAAGTTCAATACTCACC +>EAS114_45:3:39:208:644 +TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG +>EAS114_45:3:3:1377:1663 +CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA +>EAS114_45:3:3:1377:1663 +GGTGATGTGTGTTCTCATCAACCTCATACACACAC +>EAS114_45:3:3:864:1888 +AATGTTATGCCCTGCTAAACTAAGCATCATAAATG +>EAS114_45:3:3:864:1888 +CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA +>EAS114_45:3:41:653:1568 +AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT +>EAS114_45:3:41:653:1568 +GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA +>EAS114_45:3:44:1578:1674 +CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT +>EAS114_45:3:44:1578:1674 +GCTGCAACTGTGAGCCATCACAATGAACAACAGGA +>EAS114_45:3:75:217:337 +GACAGGCTGCAACTGTGAGCCATCACAATGAACAA +>EAS114_45:3:75:217:337 +GAGGGAAGAGGGACGCTGAAGAACTTTGATGCCCT +>EAS114_45:3:90:1403:1635 +TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA +>EAS114_45:3:90:1403:1635 +TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT +>EAS114_45:4:48:310:473 +TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA +>EAS114_45:4:48:310:473 +TTTAGTCTTGCTAGAGATTTAGACATCTAAATGAA +>EAS114_45:4:73:1208:495 +AGATGAAACGCGTAACTGCGCTCTCATTCACTCCA +>EAS114_45:4:73:1208:495 +TAAATATAGAAATTGAAACAGCTGTGTTTAGTGCC +>EAS114_45:4:7:1347:375 +CTAAAAGCCCATACTTTACTGCTACTCAATATATC +>EAS114_45:4:7:1347:375 +GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA +>EAS114_45:4:87:323:895 +ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT +>EAS114_45:4:87:323:895 +GGTATAATACCTCTACATGGCTGATTATGAAAACA +>EAS114_45:4:88:55:1187 +GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG +>EAS114_45:4:88:55:1187 +GTCATCAGACTATCTAAAGTCAACATGAAGGAAAA +>EAS114_45:5:56:1757:1319 +CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG +>EAS114_45:5:56:1757:1319 +TTTATAAAACAATTAATTGAGACTACAGAGCAACT +>EAS114_45:5:62:841:1994 +ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA +>EAS114_45:5:62:841:1994 +TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT +>EAS114_45:5:66:959:1311 +CAGAGCTGCTGGCAAGCTAGAGGCCCATCTGGAGC +>EAS114_45:5:66:959:1311 +GGGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT +>EAS114_45:5:82:843:1838 +CTAGGTAAAAAATTAACATTACAACAGGAACAAAA +>EAS114_45:5:82:843:1838 +TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA +>EAS114_45:5:85:401:1190 +TACACACACATGGTTTAGGGGTATAATACCTCTAC +>EAS114_45:5:85:401:1190 +TCACTCCAGCTCCCTGTCACCCAATGGACCTGTGA +>EAS114_45:5:91:89:666 +GAAAACCTCTTTAGTCTTGCTAGAGATTTAGACAT +>EAS114_45:6:14:1211:1332 +AGGAAGATACATTGCAAGACAGACTTCATCAAGAT +>EAS114_45:6:14:1211:1332 +TTTCAAGAAGTATGAGATTATGTAAAGTAACTGAA +>EAS114_45:6:37:156:134 +AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC +>EAS114_45:6:37:156:134 +GGAAAAACTATTTGAGGAAGTAATTGGGGAAAACC +>EAS114_45:6:39:956:676 +TAAAACAAATACTACTAGACCTAAGAGGGATGAGA +>EAS114_45:6:39:956:676 +TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA +>EAS114_45:6:44:77:1255 +CTCATTAATAAAGACATGAGTTCAGGTAAAGGGGT +>EAS114_45:6:44:77:1255 +TAAAAAGATCAATTCAGCAAGAAGATATAACCATC +>EAS114_45:6:45:1769:1130 +ACCCAATGGACCTGTGATATCTGGATTCTGGGAAA +>EAS114_45:6:45:1769:1130 +TGTTCTCATCAACCTCATACACACACATGGTTTAG +>EAS114_45:6:47:1791:444 +AAGAGGGATGAGAAATTACCTAATTGGTACAATGT +>EAS114_45:6:47:1791:444 +TACTTATATCAGATAAAGCACACTTTAAATCAACA +>EAS114_45:6:59:1548:1096 +CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG +>EAS114_45:6:59:1548:1096 +GTCCTATGTACTTATCATGACTCTATCCCAAATTC +>EAS114_45:6:5:730:1436 +GAAGAACTTTGATGCCCTCTTCTTCCAAAGATGAA +>EAS114_45:6:5:730:1436 +TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT +>EAS114_45:6:86:693:234 +AAGTAACTGAACCTATGAGTCACAGGTATTCCTGA +>EAS114_45:6:86:693:234 +GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA +>EAS114_45:6:86:859:1779 +TTTTTTTCATTTCTCTTTTTTTTTTTTTTTTTTTT +>EAS114_45:6:90:561:850 +ACAGGAACAAAACCTCATATATCAATATTAACTTT +>EAS114_45:6:90:561:850 +TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC +>EAS114_45:6:93:1475:542 +TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCAT +>EAS114_45:6:93:1475:542 +TTATCATGACTCTATCCCAAATTCCCAATTACGTC +>EAS114_45:7:14:1256:204 +AAATGTCTATTTTTGTCTTGACACCCAACTAATAT +>EAS114_45:7:14:1256:204 +TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC +>EAS114_45:7:14:978:1296 +ATACAATGATAAAAAGATCAATTCAGCAAGAAGAT +>EAS114_45:7:14:978:1296 +CAATATTCTGATGATGGTTACACTAAAAGCCCATA +>EAS114_45:7:24:1374:211 +AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG +>EAS114_45:7:24:1374:211 +TGCAATTAATATAATTGTGTCCATGTACACACGCT +>EAS114_45:7:2:168:1878 +AAAAAACCTGGCAAACACGAATGTTATGACATGTN +>EAS114_45:7:2:168:1878 +TAAATACACACAAAAGTAGAAAACGCACCAGTTTT +>EAS114_45:7:33:1566:588 +ACAGCTTAGGCATCAATTTGGTGTTCTGTGTAAAG +>EAS114_45:7:33:1566:588 +TACTGTCATAACTATGAAGAGCCTATTGCCAGATG +>EAS114_45:7:35:538:1882 +TATGCACCTAACACAAGACTACCCAGATTCATAAA +>EAS114_45:7:35:538:1882 +TCTATAACAAAATTAAAATTTAACAAAAGTAAATA +>EAS114_45:7:37:763:1437 +AAAGATGTTCTACGCAAACAGAAACCAAATGAGAG +>EAS114_45:7:37:763:1437 +TAAAACAAATACTACTAGACCTAAGAGGGATGAGA +>EAS114_45:7:45:1339:1807 +GACATCTAAATGAAAGAGGCTCAAAGAATGCCAGG +>EAS114_45:7:69:1130:832 +ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC +>EAS114_45:7:69:1130:832 +TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA +>EAS114_45:7:6:758:988 +AAACAAAGGAGGTCATCATACAATGATAAAAAGAT +>EAS114_45:7:6:758:988 +ATTCTGATGATGGTTACACTAAAAGCCCATACTTT +>EAS114_45:7:88:451:1773 +ATAAATACACACAAAAGTACAAAACTCACAGGTTT +>EAS114_45:7:88:451:1773 +ATTGGCAGAACAGATTTAAAAACATGAACTAACTA +>EAS114_45:7:97:1584:777 +CCAGATGAACCACACATTAATACTATGTTTCTTAT +>EAS114_45:7:97:1584:777 +GTCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCC +>EAS114_45:7:9:512:826 +AACTTCCACGTCTCATCTAGGGGAACAGGGAGGTG +>EAS114_45:7:9:512:826 +ACCACACATTAATACTATGTTTCTTATCTGCACAT +>EAS139_11:1:35:631:594 +ATCATGACTCTATCCCAAATTCCCAATTACGTCCT +>EAS139_11:1:35:631:594 +ATGATGCCCCTTGGCCATCACCCGGTCCCTGCCCC +>EAS139_11:1:59:742:549 +ACAAGCAAATGCTAAGATAATTCATCATCACTAAA +>EAS139_11:1:59:742:549 +TTAACATTACAACAGGAACAAAACCTCATATATCA +>EAS139_11:1:81:1019:558 +ACAAAACTCACAGGTTTTATAAAACAATTAATTGA +>EAS139_11:1:81:1019:558 +TGAACTAACTATATGCTGTTTACAAGAAACTCATT +>EAS139_11:1:84:92:1246 +GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG +>EAS139_11:1:84:92:1246 +GTTACACTAAAAGCCCATACTTTACTGCTACTCAA +>EAS139_11:2:31:628:1820 +AACCAGTCCTATAAGAAATGCTCAAAAGAATTGTA +>EAS139_11:2:31:628:1820 +CAGGAACAAAACCTCATATATCAATATTAACTTTG +>EAS139_11:2:42:333:516 +AGACAAGTCTCTTATGAATTAACCCAGTCAGACAA +>EAS139_11:2:42:333:516 +TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG +>EAS139_11:2:55:296:1457 +CACTTTAAATCAACAACAGTAAAATAAAACAAAGG +>EAS139_11:2:55:296:1457 +CCCACTTAAGAGATATAGATTGGCAGAACAGATTT +>EAS139_11:2:63:816:921 +AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT +>EAS139_11:2:63:816:921 +TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGA +>EAS139_11:2:6:251:1557 +AAAACAATGTTCCCCAGATACCATCCCTGTCTTAC +>EAS139_11:2:6:251:1557 +CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT +>EAS139_11:2:71:83:58 +AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT +>EAS139_11:2:71:83:58 +CCAGGAAGATACATTGCAAGACAGACTTCATCAAG +>EAS139_11:3:34:970:1374 +ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG +>EAS139_11:3:34:970:1374 +CTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGA +>EAS139_11:3:43:1229:1855 +ATGTACAATATTCTGATGATGGTTACACTAAAAGC +>EAS139_11:3:43:1229:1855 +CAACAGTAAAATAAAACAAAGGAGGTCATCATACA +>EAS139_11:3:65:556:1505 +CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG +>EAS139_11:3:65:556:1505 +TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC +>EAS139_11:3:81:12:1231 +AAAAAGCAAAAACAAAAACTATGCTAAGTATTGGT +>EAS139_11:3:81:12:1231 +TTACCTAATTGGTACAATGTACAATATTCTGATGA +>EAS139_11:4:26:137:1382 +AATGTTATGCCCTGCTAAACTAAGCATCATAAATG +>EAS139_11:4:26:137:1382 +AGACTATCTAAAGTCAACATGAAGGAAAAAAATTC +>EAS139_11:4:36:1184:994 +GCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT +>EAS139_11:4:36:1184:994 +TACATTGCAAGACAGACTTCATCAAGATATGTAGT +>EAS139_11:4:36:1231:1381 +AAGAGATATAGATTGGCAGAACAGATTTAAAAACA +>EAS139_11:4:36:1231:1381 +TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA +>EAS139_11:4:38:557:1441 +GATAAAAATAAAAAAGCAAAAACAAAAACTATGCT +>EAS139_11:4:38:557:1441 +TAAGAGGGATGAGAAATTACCTAATTGGTACAATG +>EAS139_11:4:50:30:15 +AGATTATGTAAAGTAACTTAACCTATGAGTCCAAG +>EAS139_11:4:50:30:15 +TACATTGCAAGACAGTCGTCAGCAAGATATGTAGT +>EAS139_11:4:63:527:1923 +GCTTTACTGTCATAACCATGAAGAGACTATTGCCA +>EAS139_11:4:63:527:1923 +TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG +>EAS139_11:5:32:686:735 +AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG +>EAS139_11:5:32:686:735 +CAGAAGAAAGAGGTTCANANNNTGANGACAAGTCT +>EAS139_11:5:41:314:1173 +AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC +>EAS139_11:5:41:314:1173 +AATTAAAGTTCAATACTCACCATCATAAATACACA +>EAS139_11:5:52:1278:1478 +GCTTGTACTTCTAAATCTATAACAAAATTAAAATT +>EAS139_11:5:52:1278:1478 +GTTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTT +>EAS139_11:5:61:38:1182 +AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC +>EAS139_11:5:61:38:1182 +GTTTGATTTGGTGGAAGACATAATCCCACGCTTCC +>EAS139_11:5:64:199:1288 +GTAAAATAAAACAAAGGAGGTCATCATACAATGAT +>EAS139_11:5:64:199:1288 +TACAATGTACAATATTCTGATGATGGTTACACTAA +>EAS139_11:5:78:775:555 +AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG +>EAS139_11:5:78:775:555 +TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA +>EAS139_11:6:11:285:1567 +ACATGGCTGATTATGAAAACAATGTTCCCCAGATA +>EAS139_11:6:11:285:1567 +CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT +>EAS139_11:6:11:360:1577 +GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT +>EAS139_11:6:11:360:1577 +TTTGGCATTTGCCTTCAGACCCTACACGAATGCGT +>EAS139_11:6:13:682:680 +AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA +>EAS139_11:6:13:682:680 +ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA +>EAS139_11:6:17:1179:393 +CTAATTGGTACAATGTACAATATTCTGATGATGGT +>EAS139_11:6:17:1179:393 +TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA +>EAS139_11:6:19:306:982 +ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA +>EAS139_11:6:19:306:982 +GACAGACTTCATCAAGATATGTAGTCATCAGACTA +>EAS139_11:6:75:946:1035 +AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA +>EAS139_11:6:75:946:1035 +AATGGACCTGTGATATCTGGATTCTGGGAAATTCT +>EAS139_11:6:82:164:1924 +GAGGGATGGAGGGAAGAGGGACGCTGAAGAACTTT +>EAS139_11:6:82:164:1924 +GCCCAGCACCAGATTGCTTGTGGTCTGACAGGCTG +>EAS139_11:6:89:1151:1878 +CCATCACAATGAACAACAGGAAGAAAAGGTCTTTC +>EAS139_11:6:89:1151:1878 +CTTTCAACGATTCTAGCCATTTCTTTTGGCATTTG +>EAS139_11:7:24:1345:1627 +AGATTGGCAGAACAGATTTAAAAACATGAACTAAC +>EAS139_11:7:24:1345:1627 +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +>EAS139_11:7:42:1091:1726 +CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT +>EAS139_11:7:42:1091:1726 +TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT +>EAS139_11:7:46:695:738 +CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT +>EAS139_11:7:46:695:738 +TGAAACAGCTGAGTTTAGCGCCTGTGTTCACATAG +>EAS139_11:7:50:1229:1313 +ACATAGCTAAAACTAAAAAAGCAAAAACAAAAACT +>EAS139_11:7:50:1229:1313 +TTTTTTCTTTTTTTTTTTTTTTTTTTTGCATGCCA +>EAS139_11:7:53:458:581 +CTCAATTAATTGTTTTATAAAACCTGTGAGTTTTG +>EAS139_11:7:53:458:581 +TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG +>EAS139_11:7:60:163:1612 +AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA +>EAS139_11:7:60:163:1612 +GGGAACTAAAGTCAAGTCTTTCCTGACAAGCAAAT +>EAS139_11:7:74:213:877 +AGATGTTCTACGCAAACAGAAACCAAATGAGAGAA +>EAS139_11:7:74:213:877 +TTAACATTACAACAGGAACAAAACCTCATATATCA +>EAS139_11:7:92:367:1495 +ACCACAGGGGGCTGCGCGGTTTCCCATCATGAAGC +>EAS139_11:7:92:367:1495 +CTGTCATAACTATGAAGAGACTATTGCCAGATGAA +>EAS139_11:8:17:437:1378 +ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA +>EAS139_11:8:17:437:1378 +ATCAATATTAACTTTGAATAAAAAGGGATTAAATT +>EAS139_11:8:26:1221:222 +AAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCT +>EAS139_11:8:26:1221:222 +CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA +>EAS139_11:8:38:842:395 +GTAACTGCGCTCTCATTCACTCCAGCTCCCTGTCA +>EAS139_11:8:76:205:587 +GAATAACAATGGGCTTCTCAGCGGAAACCTTACGA +>EAS139_11:8:76:205:587 +TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC +>EAS139_11:8:82:566:1096 +CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA +>EAS139_11:8:82:566:1096 +CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA +>EAS139_11:8:96:1314:1448 +CCTATGAGTCACAGGTATTCCTGAGGAAAAATAAA +>EAS139_11:8:96:1314:1448 +GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA +>EAS139_19:1:14:420:712 +TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCC +>EAS139_19:1:14:420:712 +TGTTGGTTTTCTGTTTCTTTGTTTGATTTTTTTGAAGACA +>EAS139_19:1:1:1598:843 +TCAGCGGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT +>EAS139_19:1:1:1598:843 +TGCCAGGAAGATACATTGCAAGACAGACTTCATCAAGATA +>EAS139_19:1:36:481:1079 +GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA +>EAS139_19:1:36:481:1079 +TCCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAA +>EAS139_19:1:40:1596:1433 +CCATCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG +>EAS139_19:1:40:1596:1433 +GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT +>EAS139_19:1:47:352:1492 +AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGCCCACTA +>EAS139_19:1:47:352:1492 +TTTGTTTTGTATGGTGGAAGACATAATCCCACGCTTCCTA +>EAS139_19:1:53:463:1132 +ATGATAAAAAGATCAATTCAGCAAGAAGATATAACCATCC +>EAS139_19:1:53:463:1132 +ATTTAAAAACATGAACTAACTATATGCTGTTTACANGAAA +>EAS139_19:1:58:726:1746 +AGATTGGCAGAACAGATTTAAAAACATGAACTAACTATAT +>EAS139_19:1:58:726:1746 +CAATTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTC +>EAS139_19:1:82:946:392 +CAATATATCCATGTAACAAATCTGCGCTTGTACTTCAAAA +>EAS139_19:1:82:946:392 +GAAAACAATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTC +>EAS139_19:1:85:1521:58 +AAATTAACATTACAACAGGAACAAAACCTCATATATCAAT +>EAS139_19:1:85:1521:58 +CTGACAAGCAAATGCTAAGATAATTCATCATCACTAAACC +>EAS139_19:1:87:1222:878 +TATAGGGCCTTTGTTCAAACCCCTTGCAACAACCTTGAGA +>EAS139_19:1:87:1222:878 +TCAGCGCGTCACTCCGCTCTCATTCACCCCAGCTCCCTGT +>EAS139_19:1:99:1632:76 +AAAGAAAAAAAACCCTGTCAAACACGAATGTTATGCCCTG +>EAS139_19:1:99:1632:76 +TTGTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATA +>EAS139_19:2:12:1335:1372 +GAAGAACAGATTTAAAAACATGAACTAACTATATGCTGTT +>EAS139_19:2:12:1335:1372 +TAAAGTTCAATACTCACCATCATAAATACACACAAAAGTA +>EAS139_19:2:29:1822:1881 +AGAAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAGAAG +>EAS139_19:2:29:1822:1881 +ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA +>EAS139_19:2:2:1217:398 +CAATTAATTGAGACTACAGAGCAACTAGGTAAAAAATTAA +>EAS139_19:2:2:1217:398 +TAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC +>EAS139_19:2:33:1193:664 +GCCCCATCTCTTGTAATCTCTCTCCTTTTTTCTGCATCCC +>EAS139_19:2:33:1193:664 +TATTTTTGTCTTGACACCCAACTAATATTTGTCTGAGCAA +>EAS139_19:2:57:1672:1890 +CCCCCCCCCCCCCCCCCAGCCACTGCGGCCCCCCCAGCCA +>EAS139_19:2:57:1672:1890 +TATTCAGTTCTAAATATAGAAATTGAAACAGCTGTGTTTA +>EAS139_19:2:82:154:1333 +TTAAAATTTAACAAAAGTAAATAAAACACACAGCTAAAAC +>EAS139_19:2:82:154:1333 +TTTTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTTTTT +>EAS139_19:3:10:349:1147 +GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA +>EAS139_19:3:24:1135:563 +CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA +>EAS139_19:3:24:1135:563 +GCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAACC +>EAS139_19:3:4:1502:1911 +CTACACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTTT +>EAS139_19:3:4:1502:1911 +TACACACACATGGTTTAGGGGTATAATACCTCTACATGGC +>EAS139_19:3:58:923:1915 +GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA +>EAS139_19:3:58:923:1915 +TATCAATATTAACTTTGAATAAAAAGGGATTAAATTCCCC +>EAS139_19:3:5:538:401 +AAGGTGATGTGTGTTCTCATCAACCTCATACACACACATG +>EAS139_19:3:5:538:401 +TTTGCCTTCACACCCTACACGAATGCGTCTCTGCCACAGG +>EAS139_19:3:66:718:481 +AACAACAGTAAAATAAAACAAAGGAGGTCATCATACAATG +>EAS139_19:3:66:718:481 +AAGAGATATAGATTGGCAGAACAGATTTAAAAACATGAAC +>EAS139_19:3:73:1158:535 +AATAAAGATATGTAGTCATCAGACTATCTAAAGTCAACAT +>EAS139_19:3:73:1158:535 +CCTATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTG +>EAS139_19:3:73:936:1509 +CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTTATTT +>EAS139_19:3:73:936:1509 +TTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT +>EAS139_19:3:75:732:442 +CGGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC +>EAS139_19:3:75:732:442 +CTATCCCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG +>EAS139_19:3:87:133:930 +CAGTCTCAGGGCGCCGTCCGTTTCCTCCCATCTGGCCTCG +>EAS139_19:3:87:133:930 +TTATCTGCACATTACTACCCTGCAATTAATATAATTGTGT +>EAS139_19:3:88:1656:896 +AGGGAAGAGGGATGCTGAAGAACTTTGATGCCCTCTTCTT +>EAS139_19:3:88:1656:896 +TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCTGC +>EAS139_19:4:13:1155:631 +ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTG +>EAS139_19:4:13:1155:631 +AGGGGTATAATACCTCTACATGGCTGATTATGAAAACAAT +>EAS139_19:4:18:1335:1514 +ATTGGTACAATGTACAATATTCTGATGATGGTTACACTAA +>EAS139_19:4:18:1335:1514 +CTTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTCAT +>EAS139_19:4:1:156:196 +AAAAGGGATTAAATTCCCCCACTTAAGAGATATAGATTGG +>EAS139_19:4:1:156:196 +ACTTATATCAGATAAAGCACACTTTAAATCAACAACAGTA +>EAS139_19:4:26:1312:1400 +ACTGAACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA +>EAS139_19:4:26:1312:1400 +TATGTAGTCATCAGACTATCTAAAGTCAACATGAAGGAAA +>EAS139_19:4:26:274:1078 +AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC +>EAS139_19:4:26:274:1078 +GTCATCTATAAAGGAAATCCCATCAGAATAACAATGGGCT +>EAS139_19:4:68:1122:79 +ATGGCTGATTATGAAAACAATGTTCCCCAGATACCATCCC +>EAS139_19:4:68:1122:79 +TGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCT +>EAS139_19:4:69:1593:819 +ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACATTAC +>EAS139_19:4:69:1593:819 +CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA +>EAS139_19:4:77:1780:693 +GGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGAT +>EAS139_19:4:77:1780:693 +TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGACAAAA +>EAS139_19:4:78:806:800 +AAATTAAAGTTCAATACTCACCATCATAAATACACACAAA +>EAS139_19:4:78:806:800 +AACCTGTCAAACACGAATGTTATGCCCTGCTAAACTAAGC +>EAS139_19:5:29:411:1208 +AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC +>EAS139_19:5:29:411:1208 +CCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAAA +>EAS139_19:5:40:758:116 +GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG +>EAS139_19:5:40:758:116 +GTGTGTTCTCATCAACCTCATACACACACATGGTTTAGGG +>EAS139_19:5:4:939:2021 +AAATACTACTAGACCTAAGAGGGATGAGAAATTACCTAAT +>EAS139_19:5:4:939:2021 +GGAGTAGCTATACTTATATCAGATAAAGCACACTTTAAAT +>EAS139_19:5:57:366:844 +AAATTCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT +>EAS139_19:5:57:366:844 +TAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAAT +>EAS139_19:5:61:1885:163 +AGCAAGAAGATATAACCATCCTACTAAATACATATGCACC +>EAS139_19:5:61:1885:163 +ATACTTTACTGCTACTCAATATATCCATGTAACAAATCTG +>EAS139_19:5:66:1381:181 +GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT +>EAS139_19:5:66:1381:181 +TTGCAAGACAGACTTCATCAAGATATGTAGTCATCAGACT +>EAS139_19:5:68:306:409 +AACTTTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG +>EAS139_19:5:68:306:409 +CCTATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT +>EAS139_19:5:70:318:1631 +TAAGAAATTACAAAATATAGTTGAAAGCTCTAACAATAGA +>EAS139_19:5:74:668:424 +GACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT +>EAS139_19:5:74:668:424 +GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA +>EAS139_19:5:89:525:113 +GACGCTGAAGAACTTTGATTCCCTCTTCTTCCAAAGATGA +>EAS139_19:5:89:525:113 +TATTTATGCTATTCAGTTATAAATATAGAAATTGAAACAG +>EAS139_19:5:95:944:247 +GGTACAATGTACAATATTCTGATGATGGTTACACTAAAAG +>EAS139_19:5:95:944:247 +GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATATTGCT +>EAS139_19:6:21:1601:1666 +GAAAGCTCTAACAATAGACTAAACCAAGCAGAAGAAAGAG +>EAS139_19:6:21:1601:1666 +TATTACTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA +>EAS139_19:6:52:1455:1212 +CCATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGT +>EAS139_19:6:52:1455:1212 +TTCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTCT +>EAS139_19:6:72:308:839 +AGTTACCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG +>EAS139_19:6:72:308:839 +ATCGTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT +>EAS139_19:6:75:1503:1399 +CAAGAAGATATAACCATCCTACTAAATACATATGCACCTA +>EAS139_19:6:75:1503:1399 +CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC +>EAS139_19:6:78:1029:512 +AGATAATTCATCATCACTAAACCAGTCCTATAAGAAATGC +>EAS139_19:6:78:1029:512 +TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT +>EAS139_19:6:82:1051:921 +GCAAATAGGTAAAAAATTAACATTACAACAGGAACAAAAC +>EAS139_19:6:82:1051:921 +GGGGAAATAAAGTCAAGGCTTTCCTGACAAGCAAATGCTA +>EAS139_19:6:84:438:1505 +ATTAATATAATTGTGTCCATGTACACACTCTGTCCTATGT +>EAS139_19:6:84:438:1505 +GCACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTTC +>EAS139_19:7:44:1807:833 +ATATCCATGTAACAAATCTGCGCTTGTACTTCTAAATCTA +>EAS139_19:7:44:1807:833 +CTCTCAAATATTGCTAGTGGGAGTATAAATTGTTTTCCAC +>EAS139_19:7:85:262:751 +CCATGTAACAAATCTGCGCTTGTACTTCTAAATCTATAAC +>EAS139_19:7:85:262:751 +TACAATGATAAAAAGATCAATTCAGCAAGAAGATATAACC +>EAS139_19:7:92:288:1354 +TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT +>EAS139_19:7:92:288:1354 +TGTCTTGACACCCAACTAATATTTGTCTGAGCAAAACAGT +>EAS188_4:5:103:870:105 +AAACTAAGCATCATAAATGAAGGGGAAATAAAGTC +>EAS188_4:5:103:870:105 +ATAAAACAATTAATTGAGACTACAGAGCAACTAGG +>EAS188_4:5:166:776:590 +CTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGCC +>EAS188_4:5:166:776:590 +TAATTGTGTCCATGTACACACGCTGTCCTATGTAC +>EAS188_4:5:202:326:680 +ACTTATCATGACTCTATCCCAAATTCTCAATTACG +>EAS188_4:5:202:326:680 +GTAATGATGCCCCTTGGCCATCACCCGGTCCCTGC +>EAS188_4:5:295:547:216 +ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT +>EAS188_4:5:295:547:216 +TAAAAAATTAACATTACAACAGGAACAAAACCTCA +>EAS188_4:5:302:997:951 +ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA +>EAS188_4:5:308:552:77 +TTTTCTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT +>EAS188_4:5:8:377:655 +CTATTTTTGTCTTGACACCCAACTAATATTTGTCT +>EAS188_4:5:8:377:655 +CTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGCT +>EAS188_4:7:282:567:481 +GGAACAGGGAGGCGCACTAATGCGCTCCACGCCCA +>EAS188_4:7:282:567:481 +TGCAATTAATATAATTGTGTCCACGTACACACGCT +>EAS188_4:7:296:401:60 +AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA +>EAS188_4:7:35:408:348 +AAGAAACGCGTAACTGCGCTCTCATACACTCCAGC +>EAS188_4:7:35:408:348 +GGTTCTCAAGGTTGTTGCAATGGGGTCTATGTGAA +>EAS188_4:7:78:583:670 +CAGGGAATTTGTCAATGTCAGGGAAGGAGCATTTT +>EAS188_4:7:78:583:670 +TAACCTCTGGTGACTGCCAGAGCTGCTGGCAAGCT +>EAS188_4:7:96:899:106 +TCTATAAAGGAAATCCCATCAGAATAACAATGGGC +>EAS188_4:7:96:899:106 +TTCCTGACAAGCAAATGCTAAGATAATTCATCATC +>EAS188_7:1:115:683:296 +AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTC +>EAS188_7:1:115:683:296 +CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC +>EAS188_7:1:177:522:118 +TAAACTAAGCATCATAAATGAAGGGGAAATAAAGT +>EAS188_7:1:177:522:118 +TCTCAATTAATTGTTTTATAAAACCTGTGAGTTTT +>EAS188_7:1:290:286:763 +TTAAAATTTAACAAAAGTAAATAAAACACATAGCT +>EAS188_7:1:290:286:763 +TTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTTT +>EAS188_7:1:316:949:122 +TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT +>EAS188_7:1:316:949:122 +TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT +>EAS188_7:1:77:251:446 +CAGCATGGTTGTACTGGGCAATACATGAGATTATT +>EAS188_7:1:77:251:446 +TTATCATGACTCTATCCCAAATGCCCAATTACGTC +>EAS188_7:2:152:765:744 +ACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGT +>EAS188_7:2:152:765:744 +TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT +>EAS188_7:2:172:622:707 +ACATGGCTGATTATGAAAACAATGTTCCCCAGATA +>EAS188_7:2:172:622:707 +TTCTTCATCCTGGACCCTGAGAGATTCTGCAGCCC +>EAS188_7:2:187:227:818 +CAGCACAGGGGCTTAACCTCTGGTGACTGCCAGAG +>EAS188_7:2:187:227:818 +CCCCCTTGCAACAACCTTGAGAACCCCAGGGAATT +>EAS188_7:2:19:736:559 +AAGACTTCATCAAGATATGTAGTCATCAGACTATC +>EAS188_7:2:19:736:559 +TGAACCTATGAGTCACAGGTATTCCTGAGGAAAAA +>EAS188_7:2:218:877:489 +TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG +>EAS188_7:2:259:219:114 +GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA +>EAS188_7:2:259:219:114 +TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA +>EAS188_7:3:100:735:530 +GCACACTTTAAATCAACAACAGTAAAATAAAACAA +>EAS188_7:3:100:735:530 +TGATGATGGTTACACTAAAAGCCCATACTTTACTG +>EAS188_7:3:101:572:491 +CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG +>EAS188_7:3:101:572:491 +TTCCAAAGATGAAACGCGTAACTGCGCTCTCATTC +>EAS188_7:3:13:122:187 +AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA +>EAS188_7:3:13:122:187 +GACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCCTT +>EAS188_7:3:15:568:42 +TTTTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT +>EAS188_7:3:15:568:42 +TTTTTTTTTTTGTTTTTTTTTTTTTTTTTTTTATA +>EAS188_7:3:182:104:921 +ATCAAGATATGTAGTCATCAGACTATCTAAAGTCA +>EAS188_7:3:182:104:921 +CACGAATGTTATGCCCTGCTAAACTAAGCATCATA +>EAS188_7:3:200:712:439 +CGTCACCCGGTCCCTGCCCCATCTCTTGTAATCTC +>EAS188_7:3:200:712:439 +GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA +>EAS188_7:3:296:224:724 +ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC +>EAS188_7:3:296:224:724 +TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC +>EAS188_7:3:76:333:905 +AATTGTGTCCATGTACACACGCTGTCCTATGTACT +>EAS188_7:3:76:333:905 +TTTCTGCCCCCAGCATGGTTGTACTGGGCAATACA +>EAS188_7:4:164:719:947 +AAATTAACATTACAACAGGAACAAAACCTCATATA +>EAS188_7:4:164:719:947 +ACGCAAACAGAAACCAAATGAGAGAAGGAGTAGCT +>EAS188_7:4:171:104:398 +AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC +>EAS188_7:4:171:104:398 +CAATTAATATAATTGTGTCCATGTACACACGCTGT +>EAS188_7:4:21:443:404 +AGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCC +>EAS188_7:4:21:443:404 +TTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTCT +>EAS188_7:4:238:441:727 +GTAATTGAAAAATTCATTTAAGAAATTACAAAATA +>EAS188_7:4:259:869:641 +GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA +>EAS188_7:4:259:869:641 +TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCA +>EAS188_7:4:92:693:228 +AAGGTTTTATAAAAAAATTAATTGAGACTACAGAG +>EAS188_7:4:92:693:228 +AGCATCATAAATGAAGGGGAAATAAAGTCAAGTCT +>EAS188_7:5:112:51:128 +AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA +>EAS188_7:5:112:51:128 +CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT +>EAS188_7:5:115:249:673 +TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT +>EAS188_7:5:115:249:673 +TAAATACACACAAAAGTACAAAACTCACAGGTTTT +>EAS188_7:5:163:982:695 +CTCAGCAGAAACCTTACAAGCCAGAAGAGATTGGA +>EAS188_7:5:163:982:695 +TCAAAGAATGCCAGGAAGATACATTGCAAGACAGA +>EAS188_7:5:308:354:124 +GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTT +>EAS188_7:5:308:354:124 +TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT +>EAS188_7:5:74:329:459 +ACAGAGCAACTAGGTAAAAAATTAACATTACAACA +>EAS188_7:5:74:329:459 +TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG +>EAS188_7:6:107:447:488 +TAATTGGTACAATGTACAATATTCTGATGATGGTT +>EAS188_7:6:107:447:488 +TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA +>EAS188_7:6:107:636:642 +AAGTCTTTCCTGACAAGCAAATGCTAAGATAATTC +>EAS188_7:6:107:636:642 +GTCATCTATAAAGGAAATCCCATCAGAATAACAAT +>EAS188_7:6:11:994:584 +GAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAAG +>EAS188_7:6:11:994:584 +GGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTT +>EAS188_7:6:191:540:493 +AAAAGCCCATACTTTACTGCTACTCAATATATCCA +>EAS188_7:6:191:540:493 +GTGGGGAAAAAAGTAAACTCTCAAATATTGCTAGT +>EAS188_7:6:194:998:663 +ACCTAACACAAGACTACCCAGATTCATAAAACAAA +>EAS188_7:6:194:998:663 +TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA +>EAS188_7:6:205:873:464 +AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG +>EAS188_7:6:205:873:464 +CCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATT +>EAS188_7:6:46:122:479 +AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCTT +>EAS188_7:6:46:122:479 +AAGTGAGAAGTTTGGAAGAACTATTTGAGGAAGTA +>EAS188_7:7:19:886:279 +CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTA +>EAS188_7:7:19:886:279 +GAAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA +>EAS188_7:7:213:309:373 +TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA +>EAS188_7:7:213:309:373 +TTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT +>EAS188_7:7:243:876:758 +AGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCT +>EAS188_7:7:243:876:758 +CCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC +>EAS188_7:7:67:719:786 +GGATGAGAAATTACCTAATTGGTACACTGTACAAT +>EAS188_7:7:67:719:786 +TAAAAAAAAAAAAGCAAAAACAAAAACTATGCTAA +>EAS188_7:8:60:182:718 +GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT +>EAS188_7:8:60:182:718 +TGACACCCAACTAATATTTGTCTGAGCAAAACAGT +>EAS188_7:8:64:350:174 +CCTAACACAAGACTACCCAGATTCATAAAACAAAT +>EAS188_7:8:64:350:174 +GTTCTACGCAAACAGAAACCAAATGAGAGAAGGAG +>EAS192_3:1:114:19:769 +AAACACGAATGTTATGCCCTGCTAAACTAAGCATC +>EAS192_3:1:114:19:769 +TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA +>EAS192_3:1:225:195:543 +AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT +>EAS192_3:1:225:195:543 +GGTTGCCAGCACAGGGGCTTAACCTCTGGTGACTG +>EAS192_3:3:194:378:230 +AATACTACTAGACCTAAGAGGGATGAGAAATTACC +>EAS192_3:3:194:378:230 +ATGAGAGAAGGAGTAGCTATACTTATATCAGATAA +>EAS192_3:3:221:881:916 +TAACACAAGACTACCCAGATTCATAAAACAAATAC +>EAS192_3:3:221:881:916 +TAATTCTAAATCTAGAACAAAATTAAAATTTAACA +>EAS192_3:3:257:611:440 +ACCCTGAGAGATTCTGCAGCCCAGATCCAGATTGC +>EAS192_3:3:257:611:440 +GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC +>EAS192_3:3:27:973:518 +CTGATTATGAAAACAATGTTCCCCAGATACCATCC +>EAS192_3:3:27:973:518 +TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT +>EAS192_3:3:285:349:797 +ATCATAAATGAAGGGGAAATAAAGTCAAGTCTTTC +>EAS192_3:3:285:349:797 +GTTTTAAAAAACCAATAATTGAGACTACAGAGCAA +>EAS192_3:3:309:187:267 +ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC +>EAS192_3:3:309:187:267 +GGGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAA +>EAS192_3:3:88:866:774 +ATGTAACAAATCTGCTCTTGTACTTCTAAATCTAT +>EAS192_3:3:88:866:774 +TTGTTTTCCACTTTGGAAAACAATTTGGTAATTTC +>EAS192_3:4:184:237:476 +ATCATACAATGATAAAAAGATCAATTCAGCAAGAA +>EAS192_3:4:184:237:476 +ATGAACTAACTATATGCTGTTTACAAGAAACTCAT +>EAS192_3:4:255:549:422 +AAGTCATCTATAAAGGAAATCCCATCAGAATAACA +>EAS192_3:4:255:549:422 +CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT +>EAS192_3:4:293:168:240 +ATGAACAGAGCTTTCAAGAAGTATGAGATTATGTA +>EAS192_3:4:293:168:240 +CAAAGAATGCCAGGAAGATACATTGCAAGACAGAC +>EAS192_3:4:312:915:751 +AATAAAGTCAAGTCTTTCCTGACAAGCAAAAGCTA +>EAS192_3:4:312:915:751 +ATCTATAAAGGAAATCCCATCAGAATAACAATGGG +>EAS192_3:4:63:5:870 +AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT +>EAS192_3:4:63:5:870 +GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG +>EAS192_3:5:197:914:256 +ACTAGACCTAAGAGGGATGAGAAATTACCTAATTG +>EAS192_3:5:197:914:256 +TCAGATAAAGCACACTTTAAATCAACAACAGTAAA +>EAS192_3:5:223:142:410 +CTATTCAGTTCTAAATATAGAAATTGAAACAGCTG +>EAS192_3:5:27:577:849 +AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA +>EAS192_3:5:27:577:849 +TTAGACATCTAAATGAAAGAGGCTCAAAGAATGCC +>EAS192_3:5:287:334:110 +GATGAATACTAAGATTGATGTAGCAGCTTTTGCAA +>EAS192_3:5:287:334:110 +TATGTAAAGTAACTGAACCTATGAGTCACAGGTAT +>EAS192_3:6:116:464:261 +CAATGATAAAAAGATCAATTCAGCAAGAAGATATA +>EAS192_3:6:116:464:261 +CTATATGCTGTTTACAAGAAACTCATTAATAAAGA +>EAS192_3:6:170:169:57 +GGCTTGACCTCTGGTGACTGCCAGAGCTGCTGGCC +>EAS192_3:6:170:169:57 +TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA +>EAS192_3:6:175:437:950 +CCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG +>EAS192_3:6:175:437:950 +CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC +>EAS192_3:6:185:868:496 +CCCTTGGCCATCACCCAGTCCCTGCCCCATCTCTT +>EAS192_3:6:185:868:496 +GATTTTTAATGATTCCTCAATGTTAAAATGTCTAT +>EAS192_3:6:201:195:757 +CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC +>EAS192_3:6:201:195:757 +TATGTACTTATCATGACTCTATCCCAAATTCCCAA +>EAS192_3:6:216:292:528 +GGGAGATTTTTAATGATTCCTCAATGTTAAAATGT +>EAS192_3:6:216:292:528 +TAATGATGCCCCTTGGCCATCACCCAGTCCCTGCC +>EAS192_3:6:235:505:553 +GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA +>EAS192_3:6:235:505:553 +GTAAAAAATTAACATTACAACAGGAACAAAACCTC +>EAS192_3:6:326:887:180 +CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT +>EAS192_3:6:326:887:180 +TGGGCTTCTCAGCAGAAACCTTACAAGCCAGAAGC +>EAS192_3:6:45:183:25 +CAGCGGAAACCTTACAAGCCAGAAGAGATTGGATC +>EAS192_3:6:45:183:25 +CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT +>EAS192_3:7:149:354:667 +CTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCTT +>EAS192_3:7:149:354:667 +GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC +>EAS192_3:7:298:644:697 +CTATGTTTCTTATCTGCACATTACTACCCTGCAAT +>EAS192_3:7:298:644:697 +TCCACGTCTCATCTAGGGGAACAGGGAGGTGCACT +>EAS192_3:7:66:891:294 +AGCACACTTTAAATCAACAACAGTAAAATAAAACA +>EAS192_3:7:66:891:294 +TAATTGGTACAATGTACAATATTCTGATGATGGTT +>EAS192_3:7:78:692:671 +AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA +>EAS192_3:7:78:692:671 +CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA +>EAS192_3:7:93:945:176 +CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC +>EAS192_3:7:93:945:176 +GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT +>EAS192_3:8:6:104:118 +AAGAATTTTAAAAATGAACAGAGCTTTCAAGAAGT +>EAS192_3:8:6:104:118 +TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA +>EAS192_3:8:6:237:885 +AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA +>EAS192_3:8:6:237:885 +TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT +>EAS1_103:1:151:159:43 +AACCTCATACACACACATGGTTTAGGGGTATAATA +>EAS1_103:1:151:159:43 +TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC +>EAS1_103:1:228:736:747 +AAGATATGTAGTCATCAGACTATCTAAAGTCAACA +>EAS1_103:1:228:736:747 +TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA +>EAS1_103:1:274:176:479 +CCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTAT +>EAS1_103:1:274:176:479 +GAAATGCTTTACTGTCATAACTATGAAGAGACTAT +>EAS1_103:1:2:831:692 +GTGTTCTCATCAACCTCATACACACACATGGTTTA +>EAS1_103:1:2:831:692 +TCCAGCTCCCTGTCACCCAATGGACCTGTGATATC +>EAS1_103:2:184:980:396 +AAGGAGGTCATCATACAATGATAAAAAGATCAATT +>EAS1_103:2:184:980:396 +ACATGAACTAACTATATGCTGTTTACAAGAAACTC +>EAS1_103:2:226:302:758 +GGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGG +>EAS1_103:2:226:302:758 +TGCTTGTGGTCTGACAGGCTGCAACTTTGAGCGNT +>EAS1_103:2:234:167:381 +AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT +>EAS1_103:2:234:167:381 +AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC +>EAS1_103:2:235:805:373 +TATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCA +>EAS1_103:2:235:805:373 +TTTACTGTCATAACTATGAAGAGACTATTTCCAGA +>EAS1_103:2:307:252:632 +ACCATCCTGCTAAATACATATGCACCTAACACAAG +>EAS1_103:2:307:252:632 +ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG +>EAS1_103:3:253:175:31 +CAAACAGAAACCAAATGAGAGAAGGAGTAGCTATA +>EAS1_103:3:253:175:31 +TTCATAAAACAAATACTACTAGACCTAAGAGGGAT +>EAS1_103:3:277:921:474 +AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC +>EAS1_103:3:277:921:474 +AAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGA +>EAS1_103:3:320:505:814 +ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT +>EAS1_103:3:320:505:814 +CTGTCTTGATTTACTTGTTGTTGGTTTTCTTTTTC +>EAS1_103:3:323:196:855 +ACAAGCAAATGCTAAGATAATTCATCATCACTAAA +>EAS1_103:3:323:196:855 +TAAAAAATTAACATTACAACAGGAACAAAACCTCA +>EAS1_103:3:41:474:283 +TGAACCACACATTAATACTATGTTTCTTATCTGCA +>EAS1_103:3:41:474:283 +TTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTCC +>EAS1_103:4:143:560:194 +GTTGTACTGGGCAATACATGAGATTATTAGGAAAT +>EAS1_103:4:143:560:194 +TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC +>EAS1_103:4:164:79:134 +ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG +>EAS1_103:4:164:79:134 +AGATAATTCATCATCACTAAACCAGTCCTATAAGA +>EAS1_103:4:231:815:626 +GATCAATACAGCAAGAAGATATAACCATCCTACTA +>EAS1_103:4:231:815:626 +GCTGTTTACAAGAAACTCATTAATAAAGACATGAG +>EAS1_103:4:235:899:847 +AGAAACTCATTAATAAAGACATGAGTTCAGGTAAA +>EAS1_103:4:235:899:847 +ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT +>EAS1_103:4:294:525:849 +AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA +>EAS1_103:4:294:525:849 +CTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCTAA +>EAS1_103:4:61:433:385 +ACTGTGAGCCATCACAATGAACAACAGGAAGAAAA +>EAS1_103:4:61:433:385 +GGATGGAGGGAAGAGGGACGCTGAAGCACTTTGAT +>EAS1_103:5:141:711:813 +TATTACCAGAGGGATGGAGGGAAGAGGGACGCTGA +>EAS1_103:5:141:711:813 +TATTTGTAATGAAAACTATATTTATGCTATTCAGT +>EAS1_103:5:188:20:592 +CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT +>EAS1_103:5:188:20:592 +GAGTAGCTATACTTATATCAGATAAAGCACACTTT +>EAS1_103:5:285:241:560 +GAAATTACAAAATATAGTTGAAAGCTCTAACAATA +>EAS1_103:5:285:241:560 +TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT +>EAS1_103:5:319:165:698 +ATCACCCAGTCCCTGCCCCATATCTTGTAATCTCT +>EAS1_103:5:319:165:698 +TGACACCCAACTAATATTTGTCTGAGCAAAACAGT +>EAS1_103:6:7:858:437 +CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG +>EAS1_103:6:7:858:437 +CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC +>EAS1_103:7:112:578:782 +AAAATAAAACACATAGCTAAAACTAAAAAAGCAAA +>EAS1_103:7:112:578:782 +CAGATTCATAAAACAAATACTACTAGACCTAAGAG +>EAS1_103:7:139:578:951 +AAAAACATGAACTAACTATATGCTGTTTACAAGAA +>EAS1_103:7:139:578:951 +GAGGTCATCATACAATGATAAAAAGATCAATTCAG +>EAS1_103:7:166:84:766 +ATAACACAAGACTACCCAGATTCATAAAACAAATA +>EAS1_103:7:166:84:766 +GGAAAAAGATGTTCTACGCAAACAGAAACCAAATG +>EAS1_103:7:311:100:539 +AAATTCTTCATCCTGGACCCTGAGAGATTCTGCAG +>EAS1_103:7:311:100:539 +CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA +>EAS1_103:7:313:83:546 +TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT +>EAS1_103:7:313:83:546 +TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA +>EAS1_103:7:53:783:78 +AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA +>EAS1_103:7:53:783:78 +TGCAAGACAGACTTCATCAAGATATGTAGTCATCA +>EAS1_105:1:115:226:443 +AAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA +>EAS1_105:1:115:226:443 +ATATAACCATCCTACTAAATACATATGCACCTAAC +>EAS1_105:1:141:415:738 +AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA +>EAS1_105:1:141:415:738 +TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT +>EAS1_105:1:234:185:359 +AAGGAGTAGCTATACTTATATCAGATAAAGCACAC +>EAS1_105:1:234:185:359 +CAGATTCATAAAACAAATACTACTAGACCTAAGAG +>EAS1_105:1:28:745:352 +ATATGCACCTAACACAAGACTACCCAGATTCATAA +>EAS1_105:1:28:745:352 +CTTCTAAATCTATAACAAAATTAAAATTTAACAAA +>EAS1_105:1:297:283:948 +CCAGATTGCTTGTGGTCTGACAGGCTGCAACTGTG +>EAS1_105:1:297:283:948 +TGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC +>EAS1_105:1:329:407:872 +TTCGTTTTTTTTTTTTTTTTTTCCCTTTTTTTTTT +>EAS1_105:1:3:903:957 +AAGCCAGAAGAGATTGGATCTAATTTTTGGACTTC +>EAS1_105:1:3:903:957 +ATTCATCATCACTAAACCAGTCCTATAAGAAATGC +>EAS1_105:1:45:239:851 +CTAAGAGGGATGAGAAATTACCTAATTGGTACAAT +>EAS1_105:1:45:239:851 +TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA +>EAS1_105:1:87:430:995 +GAAAAGAGTTAAAAACATGAACTAACTATATGCTG +>EAS1_105:1:87:430:995 +TACTCACCATCATAAATACACACAAAATTACAAAA +>EAS1_105:2:110:584:649 +CCATGTACACACGCTGTCCTATGTACTTATCATGA +>EAS1_105:2:110:584:649 +CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT +>EAS1_105:2:146:374:692 +AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA +>EAS1_105:2:146:374:692 +ATTAAATTCCCCCACTTAAGAGATATAGATTGGCA +>EAS1_105:2:179:532:82 +CCATCACCCGGTCCCTGCCCCATCTCTTGTAATCT +>EAS1_105:2:179:532:82 +TGTACTTATCATGACTCTATCCCAAATTCCCAATT +>EAS1_105:2:280:662:939 +AAGAGAAAAGCATACAGTCATCTATAAAGGAAATC +>EAS1_105:2:280:662:939 +CCTCTTTAGTCTTGCTAGAGATTTAGACATCTAAA +>EAS1_105:2:299:360:220 +ATTCAGTTCTAAATATAGAAATTGAAACAGCTGTG +>EAS1_105:2:299:360:220 +GAAGAACTTAGATGCCCTCTTCTTCCAAAGATGAA +>EAS1_105:2:301:161:195 +ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT +>EAS1_105:2:301:161:195 +GTACAATGTACAATATTCTGATGATGGTTACACTA +>EAS1_105:3:176:431:647 +ATCATGACTCTATCCCAAATTCCCAATTACGTCCT +>EAS1_105:3:176:431:647 +CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT +>EAS1_105:3:182:404:693 +ACCTCATACACACACATGGTTTAGGGGTATAATAC +>EAS1_105:3:182:404:693 +GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT +>EAS1_105:3:232:364:583 +CAATTAATTGAGACTACAGAGCAACTAGGTAAAAA +>EAS1_105:3:232:364:583 +TCATTAATAAAGACATGAGTTCAGGTAAAGGGGTG +>EAS1_105:3:308:66:538 +CGCTTGTACTTCTAAATCTATAACAAAATTAAAAT +>EAS1_105:3:308:66:538 +TATAACCATCCTACTAAATACATATGCACCTAACA +>EAS1_105:3:329:177:267 +CATGAGATTATTAGGAAATGCTTTACTGTCATAAC +>EAS1_105:3:329:177:267 +TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA +>EAS1_105:3:7:35:528 +TTTTTTTTTTGTTCTTTACTCTTTTTTTTTTTTTT +>EAS1_105:3:86:823:683 +ACTTTGATGCCCTCTTCTTCCAAAGATGAAACGCG +>EAS1_105:3:86:823:683 +CAGTTCTAAATATAGAAATTGAAACAGCTGTGTTT +>EAS1_105:6:134:853:558 +AATATAATTGTGTCCATGTACACACGCTGTCCTAT +>EAS1_105:6:134:853:558 +GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA +>EAS1_105:6:162:594:858 +CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA +>EAS1_105:6:162:594:858 +GTGTTCTCATCAACCTCATACACACACATGGTTTA +>EAS1_105:6:172:827:592 +AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC +>EAS1_105:6:172:827:592 +TAGATTGGCAGAACAGATTTAAAAACATGAACTAA +>EAS1_105:6:23:885:274 +ACAAAGGAGGTCATCATACAATGATAAAAAGATCA +>EAS1_105:6:23:885:274 +CTACTACTCAATATATCCATGTAACAAATCTGCGC +>EAS1_105:6:267:953:459 +ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT +>EAS1_105:6:267:953:459 +CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA +>EAS1_105:7:110:355:323 +ACCTTGAGAACCCCAGGGAATTTGTCAATGTCAGG +>EAS1_105:7:110:355:323 +CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT +>EAS1_105:7:168:247:414 +AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA +>EAS1_105:7:168:247:414 +TAAATTCCCCCACTTAAGAGATATAGATTGGCAGA +>EAS1_105:7:289:472:86 +ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA +>EAS1_105:7:45:462:455 +TCCCTGTCTTACTTCCAGCTCCCCAGACGGAACGC +>EAS1_105:7:45:462:455 +TCTAGGGGAACAGGGAGGTGCACTAATGCGCTCCA +>EAS1_105:7:57:722:347 +ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT +>EAS1_105:7:57:722:347 +CGCGTAACTGCGCTCTCATTCACTCCAGCTCCCTG +>EAS1_105:8:160:130:351 +CAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAAT +>EAS1_105:8:160:130:351 +TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA +>EAS1_105:8:179:119:876 +ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT +>EAS1_105:8:179:119:876 +TTAAAAACATGAACTAACTATATGCTGTTTACCAG +>EAS1_105:8:24:718:322 +AACTCATTAATAATGTCATGAGTTCAGGTAAAGGG +>EAS1_105:8:24:718:322 +ACAATTAATTGAGACTACAGACCAATTATGTAAAA +>EAS1_105:8:254:617:73 +AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT +>EAS1_105:8:254:617:73 +GCAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTC +>EAS1_105:8:256:404:584 +ACTGTCCTATGTACTTATCATGACTCTATCCCAAA +>EAS1_105:8:256:404:584 +GTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC +>EAS1_105:8:96:720:940 +AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC +>EAS1_105:8:96:720:940 +TAAGATAATTCATCATCACTAAACCAGTCCTATAA +>EAS1_108:1:111:796:737 +ATCATGACTCTATCCCAAATTCCCAATTACGTCCT +>EAS1_108:1:111:796:737 +CCCCAGCATGGTTGTACTGGGCAATACATGTGATT +>EAS1_108:1:131:518:588 +AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA +>EAS1_108:1:131:518:588 +ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG +>EAS1_108:1:148:286:316 +AGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCT +>EAS1_108:1:148:286:316 +CCTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGT +>EAS1_108:1:155:809:543 +AAATTTAACAAAAGTAAATAAAACACATAGCTAAA +>EAS1_108:1:155:809:543 +TACATATGCACCTAACACAAGACTACCCAGATTCA +>EAS1_108:1:16:438:245 +TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA +>EAS1_108:1:189:863:213 +CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT +>EAS1_108:1:189:863:213 +TATACTTATATCAGATAAAGCACACTTTAAATCAA +>EAS1_108:1:242:419:512 +AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA +>EAS1_108:1:242:419:512 +CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT +>EAS1_108:1:277:194:143 +TGGGCTGTAATGATGCCCCTTGGCCATCACCCGGT +>EAS1_108:1:277:194:143 +TTTTTAATGATTCCTCAATGTTAAAATGTCTATTT +>EAS1_108:1:328:614:638 +AAAGGTTGTTGGGAGATTTTTAATGATTCCTCAAT +>EAS1_108:1:328:614:638 +ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGC +>EAS1_108:1:33:779:821 +AATGTTATGCCCTGCTAAACTAAGCATCATAAATG +>EAS1_108:1:33:779:821 +TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA +>EAS1_108:1:49:911:980 +ACAATGTACAATATTCTGATGATGGTTACACTAAA +>EAS1_108:1:49:911:980 +GGGGAAAAAAGTAAACTCTCAAATATTGCTAGTGG +>EAS1_108:1:65:787:74 +TGTAATGAAAACTATATTTATGCTATTCAGTTCTA +>EAS1_108:2:102:543:160 +CAACAGGAACAAAACCTCATATATCAATATTAACT +>EAS1_108:2:102:543:160 +CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA +>EAS1_108:2:116:966:193 +ATTAACATTACAACAGGAACAAAACCTCATATATC +>EAS1_108:2:116:966:193 +GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT +>EAS1_108:2:170:326:433 +CTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGTC +>EAS1_108:2:170:326:433 +TTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGG +>EAS1_108:2:176:653:957 +AAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA +>EAS1_108:2:176:653:957 +ACATTACAACAGGAACAAAACCTCATATATCAATA +>EAS1_108:2:204:737:61 +AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT +>EAS1_108:2:204:737:61 +TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG +>EAS1_108:2:240:593:842 +ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT +>EAS1_108:2:240:593:842 +CATGGTTTAGGGGTATAATACCTCTACATGGCTGA +>EAS1_108:2:266:994:429 +ACAGGTTTTATAAAACAATTAATTGAGACTACAGA +>EAS1_108:2:266:994:429 +TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG +>EAS1_108:2:316:176:543 +ATGTCTATTTTTGTCTTGACACCCAACTAATATTT +>EAS1_108:2:316:176:543 +CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC +>EAS1_108:2:49:271:588 +CACATGGTTTAGGGGTATAATACCTCTACATGGCT +>EAS1_108:2:49:271:588 +GCTGCGCGGTTTCCCATCATGAAGCACTGAACTTC +>EAS1_108:2:62:879:264 +AATGAAAACTATATTTATGCTATTCAGTTCTAAAT +>EAS1_108:2:62:879:264 +GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA +>EAS1_108:2:82:879:246 +AAGAGGGACGCTGAAGAATTTTGATGCCCTCTTCT +>EAS1_108:2:82:879:246 +ACAACTGTGAGCCATCACAATGAACAACAGGAAGA +>EAS1_108:2:85:580:481 +AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA +>EAS1_108:2:85:580:481 +CTAACACAAGACTACCCAGATTCATAAAACAAATA +>EAS1_108:3:216:988:883 +AAGCCAACACAATGAACAACAGGAAGAAAAGGTCT +>EAS1_108:3:216:988:883 +AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT +>EAS1_108:3:24:319:429 +GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG +>EAS1_108:3:24:319:429 +TAATAAATACACACAAAAGTACAAAACTCACAGGT +>EAS1_108:3:75:934:439 +AAGAGACTATTGCCAGATGAACCACACATTAATAC +>EAS1_108:3:75:934:439 +CCCATCATGAAGCACTGAACTTCCACGTCTCATCT +>EAS1_108:3:82:356:253 +AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA +>EAS1_108:3:82:356:253 +GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC +>EAS1_108:4:163:611:211 +TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA +>EAS1_108:4:163:611:211 +TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC +>EAS1_108:4:248:753:731 +TATGCTATTCAGTTCTAAATATAGAAATTGAAACA +>EAS1_108:4:248:753:731 +TGAAGAACTTTGATGCCCTCTTCTTCCAAAGATGA +>EAS1_108:4:31:622:216 +ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC +>EAS1_108:4:37:604:389 +ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG +>EAS1_108:4:37:604:389 +TCATAAAACAAATACTACTAGACCTAAGAGGGATG +>EAS1_108:4:75:166:463 +GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT +>EAS1_108:4:75:166:463 +TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT +>EAS1_108:4:91:521:517 +CCACACTGGTTCTCTTGAAAGCTTGGGCTGTAATG +>EAS1_108:4:91:521:517 +CCCTGCAATTAATATAATTGTGTCCATGTACACAC +>EAS1_108:5:115:193:231 +GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG +>EAS1_108:5:115:193:231 +TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA +>EAS1_108:5:11:555:330 +CGCTTGTACTTCTAAATCTATAAAAAAATTAAAAT +>EAS1_108:5:11:555:330 +GGAAAACAATTTGGTAATTTCGTTTTTTTTTTTTT +>EAS1_108:5:175:149:296 +AAAAATTAACATTACAACAGGAACAAAACCTCATA +>EAS1_108:5:175:149:296 +AAGGGGAAATAAAGTCAAGCCTTTCCTGACAAGCA +>EAS1_108:5:180:905:36 +CCTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG +>EAS1_108:5:180:905:36 +TACTATGTTTCTTATCTGCACATTACTACCCTGCA +>EAS1_108:5:229:717:121 +ACTATGAAGAGACTATTGCCAGATGAACCACACAC +>EAS1_108:5:229:717:121 +TTCTTCTGAGGGAAGAACAGCTTAGGTATCAATTT +>EAS1_108:5:321:712:224 +AGATAAAGCACACTTTAAATCAACAACAGAAAAAT +>EAS1_108:5:321:712:224 +ATGAGAAATTACCTAATTGGTACAATGTACAATAT +>EAS1_108:5:89:942:84 +AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA +>EAS1_108:5:89:942:84 +TACAAAACTCACAGGTTTTATAAAACAATTAATTG +>EAS1_108:6:159:493:275 +ACAAAACTCACAGGTTTTATAAAACAATTAATTGA +>EAS1_108:6:159:493:275 +TGCTGTTTACAAGAAACTCATTAATAAAGACATGA +>EAS1_108:6:165:464:123 +CATACACACACATGGTTTAGGGGTATAATACCTCT +>EAS1_108:6:165:464:123 +GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCA +>EAS1_108:6:222:579:961 +AGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAG +>EAS1_108:6:222:579:961 +CAGAAACCTTACAAGCCAGAAGAGATTGGATCTAA +>EAS1_108:6:71:187:824 +AGACAGACTTCATCAAGATATGTAGTCATCAGACT +>EAS1_108:6:71:187:824 +TCTAATTTTTGGACTTCTTAAAGAAAAAAAAACCT +>EAS1_108:6:73:735:329 +AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA +>EAS1_108:6:73:735:329 +TAGCTATACTTATATCAGATAAAGCACACTTTAAA +>EAS1_108:6:77:48:860 +CTCTGTCTTGATTTACTTGTTGTTTGTTTTCTGTT +>EAS1_108:6:77:48:860 +TAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC +>EAS1_108:6:94:294:387 +ACCATCATAAATACACACAAAAGTACAAAACTCAC +>EAS1_108:6:94:294:387 +GAATGTTATGCCCTGCTAAACTAAGCATCATAAAT +>EAS1_108:6:95:235:746 +CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG +>EAS1_108:6:95:235:746 +TCTAAAATCAGCAAGAGAAAAGCATACAGACATCT +>EAS1_108:7:108:440:208 +CCCATCCTACTAAATACATATGCACCTAACACAAG +>EAS1_108:7:108:440:208 +TTCAGGTAAAGGGGAGGAAAAAGATGTTCTACGCA +>EAS1_108:7:222:538:267 +ATAATTGTGTCCATGTACACACGCTGTCCTATTTA +>EAS1_108:7:222:538:267 +TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTT +>EAS1_108:7:266:556:252 +CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA +>EAS1_108:7:266:556:252 +GATTTGGTGGAAGACATAATCCCACGCTTCCTATG +>EAS1_108:7:82:926:112 +CAATGTCAGGGAAGGAGCATTTTGTCAGTTGCCAA +>EAS1_108:7:82:926:112 +CTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTC +>EAS1_108:8:118:440:850 +AATTGAAAAATTCATTTAAGAAATTACAAAATATA +>EAS1_108:8:129:477:427 +ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT +>EAS1_108:8:129:477:427 +TACACACACATGGTTTAGGGGTATAATACCTCTAC +>EAS1_108:8:19:929:765 +AAAAACATGAACTAACTATATGCTGTTTACAAGAA +>EAS1_108:8:19:929:765 +ATCAACAACAGTAAAATAAAACAAAGGAGGTCATC +>EAS1_93:1:131:946:353 +TCTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTG +>EAS1_93:1:131:946:353 +TGTACACACGCTGTCCTATGTACTTATCATGACTC +>EAS1_93:1:179:629:513 +GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA +>EAS1_93:1:179:629:513 +GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG +>EAS1_93:1:20:635:509 +CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT +>EAS1_93:1:20:635:509 +TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT +>EAS1_93:1:214:784:690 +AAATCCCATCAGAATAACAATGGGCTTCTCAGCGG +>EAS1_93:1:214:784:690 +GATAATTCATCATCACTAAACCAGTCCTATAAGAA +>EAS1_93:1:216:381:608 +TAATTGTGTCCATGTACACTCGCTGTCCTATGTAC +>EAS1_93:1:216:381:608 +TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG +>EAS1_93:1:253:59:242 +CCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGCA +>EAS1_93:1:253:59:242 +TTTGTCTTGACACCCAACTAATATTTGTCTGAGCA +>EAS1_93:1:264:988:663 +CGAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC +>EAS1_93:1:264:988:663 +TGGCTGATTATGAAAACAATGTTCCCCAGATACCA +>EAS1_93:1:92:213:217 +ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT +>EAS1_93:1:92:213:217 +TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT +>EAS1_93:2:173:995:93 +GCTGGAGGGAAGAGGGACGCTGAAGAACTTTGATG +>EAS1_93:2:173:995:93 +TAATGAAAACTATATTTATGCTATTCAGTTCTAAA +>EAS1_93:2:286:923:549 +TCAAATGAACTTCTGTAATTGAAAAATTCATTTAA +>EAS1_93:2:30:466:652 +AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA +>EAS1_93:2:30:466:652 +AAGAGGCTAAAAGAATGCCAGGAAGATACATTGCA +>EAS1_93:2:313:711:530 +ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT +>EAS1_93:2:313:711:530 +TAATTGAGACTACAGAGCAACTAGGTAAAAAATTA +>EAS1_93:3:181:93:694 +ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG +>EAS1_93:3:181:93:694 +TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT +>EAS1_93:3:79:879:15 +AGACTACAGAGCAACTAGGTAAAAAATTAACATTA +>EAS1_93:3:79:879:15 +AGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATA +>EAS1_93:4:160:896:275 +AAAACTATATTTATGCTATTCAGTTCTAAATATAG +>EAS1_93:4:160:896:275 +AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTC +>EAS1_93:4:321:271:138 +GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA +>EAS1_93:4:321:271:138 +TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA +>EAS1_93:4:325:352:67 +ATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAA +>EAS1_93:4:325:352:67 +TACAGAGCAACTAGGTAAAAAATTAACATTACAAC +>EAS1_93:5:197:52:58 +AAATGAACAGAGCTTTCAAGAAGTATGAGATTATG +>EAS1_93:5:197:52:58 +TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA +>EAS1_93:5:246:177:525 +CATCATAAATACACACAAAAGTAAAAAACTCACAG +>EAS1_93:5:246:177:525 +TCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT +>EAS1_93:5:256:444:399 +CTGCTACTCAATATATCCATGTAACAAATCTGCGC +>EAS1_93:5:256:444:399 +GAAGATATAACCATCCTACTAAATACATATGCACC +>EAS1_93:5:292:122:666 +GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG +>EAS1_93:5:292:122:666 +TACTGTCATAACTATGAAGAGACTATTGTCAGATG +>EAS1_93:5:62:969:12 +TATAAAGGAAATCCCATCAGAATAACAATGGGCTT +>EAS1_93:5:62:969:12 +TCTTGCTAGAGATTTAGACATCTAAATGAAAGAGG +>EAS1_93:5:66:372:343 +ATTACAAAATATAGTTGAAAGATCTAACAATAGAC +>EAS1_93:5:66:372:343 +TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG +>EAS1_93:6:132:717:233 +AGAGAACTTCCCTGGAGGTCTGATGGAGTTTCTCC +>EAS1_93:6:132:717:233 +TGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGA +>EAS1_93:6:159:273:253 +TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA +>EAS1_93:6:191:948:257 +AACTAATATTTGTCTGAGCAAAACAGTCTAGATGA +>EAS1_93:6:191:948:257 +CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT +>EAS1_93:6:216:47:302 +AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT +>EAS1_93:6:216:47:302 +AATACTCACCATCATAAATACACACAAAAGTACAA +>EAS1_93:6:218:144:794 +GGGTGCATTGCTATGTTGCGGTCGCTTTGCCTCCT +>EAS1_93:6:218:144:794 +TTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT +>EAS1_93:6:238:514:194 +AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT +>EAS1_93:6:238:514:194 +AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA +>EAS1_93:6:255:441:47 +AACAACAGTAAAATAAAACAAAGGAGGTCATCATA +>EAS1_93:6:255:441:47 +TGGTACAATGTACAATATTCTGATGATGGTTACAC +>EAS1_93:6:271:244:568 +ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT +>EAS1_93:6:271:244:568 +CTTGCAACAACCTTGAGAACCCCAGGGAATTTGTC +>EAS1_93:6:45:601:439 +AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG +>EAS1_93:6:45:601:439 +ATAAAAAGGGATTAAATTCCCCCACTTAAGAGATA +>EAS1_93:7:14:426:613 +AGGGAGGGAGGGAAGAGGGACGCTGAAGAACTTTG +>EAS1_93:7:14:426:613 +GTAATGAAAACTATATTTATGCTATTCAGTTCTAA +>EAS1_93:7:252:171:323 +GCTATTCAGTTCTAAATATAGAAATTGAAACAGCT +>EAS1_93:7:270:995:918 +AAAATTCATTTAAGAAATTACAAAATATAGTTGAA +>EAS1_93:7:319:280:57 +AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC +>EAS1_93:7:319:280:57 +TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC +>EAS1_93:8:13:325:483 +AAAAACATGAACTAACTATATGCTGTTTACAAGAA +>EAS1_93:8:13:325:483 +ATCATACAATGATAAAAAGATCAATTCAGCAAGAA +>EAS1_93:8:14:601:624 +AAAAGGTGATGTGTGTTCTCATCAACCTCATACAC +>EAS1_93:8:14:601:624 +CTGCGCTCTCATTCACTCCAGCTCCCTGTCAACCC +>EAS1_95:1:16:823:343 +AGACATAACCCCACGCTTCCTATGGAAAGGTTGTT +>EAS1_95:1:16:823:343 +TCCCATCTGGCCTCGTCCACACTGGTTCTCTTGAA +>EAS1_95:1:196:533:921 +AAATGTGTTTATTACCAGAGGGATGGAGGGAAGAG +>EAS1_95:1:196:533:921 +CCTGAGAGATTCTGCAGCCCAGATCCAGATTGCTT +>EAS1_95:1:202:341:984 +GGAGGTCATCATACAATGATAAAAAGATCAATTCA +>EAS1_95:1:202:341:984 +TGAACTAACTATATGCTGTTTACAAGAAACTCATT +>EAS1_95:1:249:986:224 +CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT +>EAS1_95:1:249:986:224 +TATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGA +>EAS1_95:1:261:504:780 +TCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGTT +>EAS1_95:1:261:504:780 +TTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAAC +>EAS1_95:1:301:54:240 +AACAGGGAGGTGCACTAATGCGCTCCACGCCCAAG +>EAS1_95:1:301:54:240 +CCCTGCAATTAATATAATTGTGTCCATGTACACAC +>EAS1_95:1:77:589:741 +AGTAAAATAAAACAAAGGAGGTCATCATACAATGA +>EAS1_95:1:77:589:741 +TGGTTACACTAAAAGCCCATACTTTACTGCTACTC +>EAS1_95:2:142:353:398 +CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA +>EAS1_95:2:142:353:398 +GGTAAAAAATTAACATTACAACAGGAACAAAACCT +>EAS1_95:2:162:503:769 +AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT +>EAS1_95:2:162:503:769 +AGGCTGCAACTGTGAGCCATCACAATGAACAACAG +>EAS1_95:2:198:691:595 +ACACACATGGTTTAGGGGTATAATACCTCTACATG +>EAS1_95:2:198:691:595 +CATGAAGCACTGAACTTCCACGTCTCATCTAGGGG +>EAS1_95:2:211:954:174 +AAAGAAAAAACAAAAACTATGCTAAGTATTGGTAA +>EAS1_95:2:211:954:174 +AGACCTAAGAGGGATGAGAAATTACCTAATTGGTA +>EAS1_95:2:228:915:631 +AAGATATGTAGTCATCAGACTATCTAAAGTCAACA +>EAS1_95:2:228:915:631 +ATTATTAAAGAAAAAAAAACCTGTCAAACACGAAT +>EAS1_95:2:278:918:892 +AGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT +>EAS1_95:2:278:918:892 +CCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA +>EAS1_95:2:40:918:950 +AATATAATTGTGTCCATGTACACACGCTTTCCTTT +>EAS1_95:2:40:918:950 +GTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCCT +>EAS1_95:3:268:523:511 +ACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGAT +>EAS1_95:3:268:523:511 +TGTCCATGTACACACGCTGTCCTATGTACTTATCA +>EAS1_95:3:303:970:243 +AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC +>EAS1_95:3:303:970:243 +CAGACTTCATCAAGATATGTAGTCATCAGACTATC +>EAS1_95:3:308:956:873 +ATAAAAATAAGTGTGTCCATGTACACACGCTGTCC +>EAS1_95:3:308:956:873 +CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC +>EAS1_95:4:174:157:573 +CAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA +>EAS1_95:4:174:157:573 +TAAAACAAATACTACTAGACCTAAGAGGGATGAGA +>EAS1_95:4:176:971:874 +TAAAATCAGAAGAGAAAAGCATACAGTCATCTATA +>EAS1_95:4:176:971:874 +TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG +>EAS1_95:4:184:17:636 +TACACACACATGGTTTAGGGGTATAATACCTCTAC +>EAS1_95:4:184:17:636 +TTTTTTTTTTTTTTTTTTTTTTTTTTTTCACAGGT +>EAS1_95:4:224:592:744 +GATATGTAGTCATCAGACTATCTAAAGTCAACATG +>EAS1_95:4:224:592:744 +TATGAGATTATGTAAAGTAACTGAACCTATGAGTC +>EAS1_95:4:238:124:196 +TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT +>EAS1_95:4:61:631:567 +AAGAAGATATAACCATCCTACTAAATACATATGCA +>EAS1_95:4:61:631:567 +CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG +>EAS1_95:4:66:179:118 +CCATGTACACACGCTGTCCTATGTACTTATCATGA +>EAS1_95:4:66:179:118 +TGGGCTGTAATGATGCCCCTTGGCCATCACCCAGT +>EAS1_95:4:71:517:742 +AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT +>EAS1_95:4:71:517:742 +AAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAAG +>EAS1_95:5:257:654:116 +TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT +>EAS1_95:5:257:654:116 +TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA +>EAS1_95:5:263:511:936 +CAAATAGGTAAAAAATTAACATTACAACAGGAACA +>EAS1_95:5:263:511:936 +CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT +>EAS1_95:5:284:212:932 +CTTTAAATCAACAACAATAAAAAAAAACAAAGGAG +>EAS1_95:5:284:212:932 +TGATGATGGTTACGCTAAAAGTCCATGCTTTACTG +>EAS1_95:6:174:650:125 +AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC +>EAS1_95:6:174:650:125 +CAGGTTTTATAAAACAATTAATTGAGACTACAGAG +>EAS1_95:6:185:312:167 +CTGAAGAACTTTGATGCCCTCTTCTTCCAAAGATG +>EAS1_95:6:185:312:167 +TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT +>EAS1_95:6:194:696:490 +ACATTAATACTATGTTTCTTATCTGCACATTACTA +>EAS1_95:6:194:696:490 +TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC +>EAS1_95:6:53:156:845 +ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT +>EAS1_95:6:53:156:845 +TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT +>EAS1_95:6:87:734:888 +ATACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG +>EAS1_95:6:87:734:888 +TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG +>EAS1_95:7:155:530:532 +AGCAAGAAGATATAACCATCCTACTAAATACATAT +>EAS1_95:7:155:530:532 +TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA +>EAS1_95:7:280:607:113 +ATCCATGTAACAAATCTGCGCTTGTACTTCTAAAT +>EAS1_95:7:280:607:113 +GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT +>EAS1_95:7:282:817:710 +TGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCC +>EAS1_95:7:282:817:710 +TTTGTAATGAAAACTATATTTATGCTATTCAGTTC +>EAS1_95:7:310:800:761 +AAAGCACACTTTAAATCAACAACAGTAAAATAAAA +>EAS1_95:7:310:800:761 +CAATATTCTGATGATGGTTACACTAAAAGCCCATA +>EAS1_95:7:46:522:426 +AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA +>EAS1_95:7:46:522:426 +GGTAAAAAATTAACATTACAACAGGAACAAAACCT +>EAS1_95:7:55:506:125 +CTTTACTGTCATAACTATGAAGAGACTACTGCCAG +>EAS1_95:7:55:506:125 +TCTACCACAGGGGGCTGCGCGGTTTCCCATCATGA +>EAS1_95:7:61:702:720 +ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA +>EAS1_95:7:61:702:720 +CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC +>EAS1_95:7:74:866:49 +CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC +>EAS1_95:7:74:866:49 +CCAACCTACTAAATACATATGCACCTAACACAAGA +>EAS1_97:2:128:629:484 +AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA +>EAS1_97:2:128:629:484 +GATTCATAAAACAAATACTACTAGACCTAAGAGGG +>EAS1_97:2:193:420:78 +ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG +>EAS1_97:2:193:420:78 +TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA +>EAS1_97:2:59:882:980 +AATATAATTGTGTCCATGTACACACGCTGTCCTAT +>EAS1_97:2:59:882:980 +GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC +>EAS1_97:2:96:419:327 +TACTAAATACATATGCACCTAACACAAGACTACCC +>EAS1_97:2:96:419:327 +TCTAAATCTATAACAAAATTAAAATTTAACAAAAG +>EAS1_97:2:9:203:653 +CACCCAACTAATATTTGTCTGAGCAAAACAGTCTA +>EAS1_97:2:9:203:653 +TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT +>EAS1_97:3:147:423:584 +GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG +>EAS1_97:3:147:423:584 +GCATACAGTCATCTATAAAGGAAATCCCATCAGAA +>EAS1_97:3:160:173:889 +TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA +>EAS1_97:3:160:173:889 +TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA +>EAS1_97:3:277:144:848 +TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT +>EAS1_97:3:277:144:848 +TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG +>EAS1_97:3:73:292:429 +GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTTGC +>EAS1_97:3:73:292:429 +TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG +>EAS1_97:4:261:267:597 +GGGTAATAAAGTCAAGTCTTTCCTGACAAGCAAAT +>EAS1_97:4:261:267:597 +TTGAGAATAAAGAGCAACTAGGTAAAAAATTAACA +>EAS1_97:4:274:287:423 +CTAAATCTATAAAAAAATTAAAATTTAACAAAAGT +>EAS1_97:4:274:287:423 +TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT +>EAS1_97:4:290:121:79 +ATTGGTAAAGATGTGGGGAAAAAAGTAAACTCTCA +>EAS1_97:4:290:121:79 +TGATGATGGTTACACTAAAAGCCCATACTTTACTG +>EAS1_97:4:77:29:126 +ACAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT +>EAS1_97:4:77:29:126 +GCACAGGGGCTTAACCTCTGGTGACTGCCAGAGCT +>EAS1_97:4:83:731:540 +CTAGGTAAAAAATTAACATTACAACAGGAACAAAA +>EAS1_97:4:83:731:540 +TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG +>EAS1_97:5:154:952:558 +AAAGACTACCCAGATTCATAAAACAAATACTACTA +>EAS1_97:5:154:952:558 +GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTAT +>EAS1_97:5:219:174:684 +AAAAAAACTGTCAAACACGAATGTTATGCCCTGCT +>EAS1_97:5:219:174:684 +AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA +>EAS1_97:5:28:538:148 +AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT +>EAS1_97:5:28:538:148 +TCATCAAGATATGTAGTCATCAGACTATCTAAAGT +>EAS1_97:5:318:177:383 +TACTACCCTGCAATTAATATAATTGTGTCCATGTA +>EAS1_97:5:318:177:383 +TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC +>EAS1_97:5:84:927:843 +CCAGCATGGTTGTACTGGGCAATACATGAGATTAT +>EAS1_97:5:84:927:843 +TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTT +>EAS1_97:6:222:305:337 +TTTTTTTTTTTTTTTTTTCCCTTTTTTTTTTTTTT +>EAS1_97:6:308:667:658 +AAAGATCACTTCAGCAATAAGATATAACCATCCTA +>EAS1_97:6:308:667:658 +TAAAAACATGAACTAACTATATCCTTCTTACAATA +>EAS1_97:6:93:334:858 +CTGCCCCCAGCATGGTTGTACTTGGCAATACATGA +>EAS1_97:6:93:334:858 +GTACTTATCATGACTCTATCCCAAATTCCCAATTA +>EAS1_97:7:20:979:96 +GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA +>EAS1_97:7:264:642:506 +AAATATAGAAATTGAAACAGCTGTGTTTATTGTAT +>EAS1_97:7:264:642:506 +ACTTCATCCAAAGATGAAACGCGTAACTGCGCTCT +>EAS1_97:7:28:979:519 +AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA +>EAS1_97:7:28:979:519 +CCCATACTTTACTGCTACTCAATATATCCATGTAA +>EAS1_97:7:63:727:203 +AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA +>EAS1_97:7:63:727:203 +AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA +>EAS1_97:7:9:648:712 +AAGAAGTATGAGATTATGTAAAGTAACTGAACCTA +>EAS1_97:7:9:648:712 +TACATTGCAAGACAGACTTCATCAAGATATGTAGT +>EAS1_97:8:36:927:478 +AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC +>EAS1_97:8:36:927:478 +GACCCTACACGAATGCGTCTCTACCACAGGGGGCT +>EAS1_99:1:17:595:863 +AAGCTACTCAATATATCCATGTAACAAATCTGCGC +>EAS1_99:1:17:595:863 +ATAACCATCCTACTAAATACACATGCACCTAACTC +>EAS1_99:1:187:715:521 +AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT +>EAS1_99:1:187:715:521 +GCATACAGTCATCTATAAAGGAAATCCCATCAGAA +>EAS1_99:1:34:649:318 +AAGAATAACAATGGGCTTCACAGCGGAACCCTTAC +>EAS1_99:1:34:649:318 +ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACAT +>EAS1_99:1:86:871:319 +GGCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGA +>EAS1_99:1:86:871:319 +TGCTAAGATAATTCATCATCACTAAACCAGTCCTA +>EAS1_99:2:152:355:962 +CAGTCATCTATAAAGGAAATCCCATCAGAATAACA +>EAS1_99:2:152:355:962 +TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT +>EAS1_99:2:162:257:203 +AAAAAGATCAATTCAGCAAGAAGATATAACCATCC +>EAS1_99:2:162:257:203 +ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA +>EAS1_99:2:188:782:483 +CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA +>EAS1_99:2:188:782:483 +GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG +>EAS1_99:3:118:851:285 +CCCAATTACGTCCTATCTTCTTCTTAGGGAAGAAC +>EAS1_99:3:118:851:285 +TGGGCAATACATGAGATTATTAGGAAATGCTTTAC +>EAS1_99:3:135:543:760 +ATTTGCCTTCAGACCCTACACGAATGCGTCTCTAC +>EAS1_99:3:135:543:760 +TTCAAAAGGTGATGTGTGTTCTCATCAACCTCATA +>EAS1_99:3:187:791:153 +AATACATGAGATTATTAGGAAATGCTTTACTGTCA +>EAS1_99:3:187:791:153 +TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG +>EAS1_99:3:21:423:169 +ACTAAAAGCCCATACTTTACTGCTACTCAATATAT +>EAS1_99:3:21:423:169 +GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT +>EAS1_99:3:61:183:767 +GTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATC +>EAS1_99:3:61:183:767 +TTGCCAGATGAACCACACCTTAATACTATGTTTCT +>EAS1_99:5:147:479:41 +CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTT +>EAS1_99:5:147:479:41 +TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA +>EAS1_99:5:191:885:623 +TGCAAGACAGACTTCATCAAGATATGTAGTCATCA +>EAS1_99:5:191:885:623 +TTAAAGAAAAAAAAACCTGTCAAACACGAATGTTA +>EAS1_99:6:135:354:66 +GATACATTGCAAGACAGACTTCATCAAGATATGTA +>EAS1_99:6:135:354:66 +TATGAGATTATGTAAAGTAACTGAACCTATGAGTC +>EAS1_99:6:177:562:806 +ACAGTGTAGATGAGAGAGACCTTCCCTGGAGGTCT +>EAS1_99:6:177:562:806 +TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTTTT +>EAS1_99:6:181:392:500 +GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC +>EAS1_99:6:181:392:500 +TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA +>EAS1_99:6:63:48:631 +CAATACATGAGATTATTAGGAAATGCTTTACTGTC +>EAS1_99:6:63:48:631 +TCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTA +>EAS1_99:7:126:361:250 +AAAAAATTAACATTACAACAGGAACAAAACCTCAT +>EAS1_99:7:126:361:250 +TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA +>EAS1_99:7:171:196:287 +ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC +>EAS1_99:7:171:196:287 +ATAATTCATCATCACTAAACCAGTCCTATAAGAAA +>EAS1_99:7:183:645:699 +GTGGCCCTCCCCCATTCCCTGCCCCATCTCTTGTA +>EAS1_99:7:183:645:699 +TATCCCAAATTCCCAATTACGTCCTATCTTCTTCT +>EAS1_99:7:37:400:627 +ACATGAGATTATTAGGAAATGCTTTACTGTCATAA +>EAS1_99:7:37:400:627 +TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTG +>EAS1_99:8:117:578:853 +AATGAACTTCTGTAATTGAAAAATTCATTTAAGAA +>EAS1_99:8:152:778:228 +ATCATAAATACACACAAAAGTACAAAACTCACAGG +>EAS1_99:8:152:778:228 +ATTTAAAAACATGAACTAACTATATGCTGTTTACA +>EAS1_99:8:187:199:369 +TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT +>EAS1_99:8:27:228:31 +AAATAAAACAAAGGAGGTCATCATACAATGATAAA +>EAS1_99:8:27:228:31 +GGTTACACTAAAAGCCCATACTTTACTGCTACTCA +>EAS1_99:8:99:756:130 +GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT +>EAS1_99:8:99:756:130 +GACCCTACACGAATGCGTCTCTACCACAGGGGGCT +>EAS218_1:2:10:686:1024 +ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT +>EAS218_1:2:10:686:1024 +CATACAATGATAAAAAGATCAATTCAGCAAGAAGA +>EAS218_1:2:15:1763:1143 +AAACAAATACTACTAGACCTAAGAGGGATGAGAAA +>EAS218_1:2:15:1763:1143 +TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA +>EAS218_1:2:18:1498:1475 +CTTGGGCTGTAATGATGCCCCTTGGCCATCACCCG +>EAS218_1:2:18:1498:1475 +GAAAGGTTGTTGGGAGATTTTTAATGATTCCTCAA +>EAS218_1:2:19:752:816 +CGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG +>EAS218_1:2:19:752:816 +TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA +>EAS218_1:2:26:211:481 +ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA +>EAS218_1:2:26:211:481 +CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA +>EAS218_1:2:40:1291:1045 +CTAACACAAGACTACCCAGATTCATAAAACAAATA +>EAS218_1:2:40:1291:1045 +GTAAAGGGGTGGAAAAAGATGTTCTACGCAACAAG +>EAS218_1:2:64:1318:1711 +GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT +>EAS218_1:2:64:1318:1711 +TGAAAACTATATTTATGCTATTCAGTTCTAAATAT +>EAS218_1:4:14:1872:1521 +TCAAAGAATGCCAGGAAGATACATTGCAAGTCAGA +>EAS218_1:4:14:1872:1521 +TCATCAAAAACCTTACAAGCCAGAAGAGATTGGAT +>EAS218_1:4:15:856:340 +CACGCTGTCCTATGTACTTATCATGACTCTATCCC +>EAS218_1:4:15:856:340 +CCCCAGCATGGTTGCACTGGGCAATACATGAGATT +>EAS218_1:4:28:315:310 +AAACTGTTCTCTTGAAAGCTTGGGCTGTAATGATG +>EAS218_1:4:28:315:310 +CATGTACACACGCTGTCCTATGTACTTATCATGAC +>EAS218_1:4:37:1626:862 +ACCCAACTAATATTTGTCTGAGCAAAACAGTCTAG +>EAS218_1:4:37:1626:862 +TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT +>EAS218_1:4:61:1369:440 +AAAGACATGATTTCAGGTAAAGGGGTGGAAAAAGA +>EAS218_1:4:61:1369:440 +CAGGTTTTATAAAACAATTAATTGAGACTACAGAG +>EAS218_1:4:62:561:531 +AGCTATACTTATATCAGATAAAGCACACTTTAAAT +>EAS218_1:4:62:561:531 +TACTAGACCTAAGAGGGATGAGAAATTACCTAATT +>EAS218_1:4:71:832:743 +ACCCAGTCCCTGCCCCATCTCTTGTAATCTCTCTC +>EAS218_1:4:71:832:743 +CTATGTACTTATCATGACTCTATCCCAAATTCCCA +>EAS218_1:4:73:42:1038 +AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT +>EAS218_1:4:73:42:1038 +TCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTTT +>EAS218_1:4:75:555:1591 +TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT +>EAS218_1:6:49:905:27 +CCACAGGGGGCTGCGCGGTTTCCCATCCTGAAGCA +>EAS218_1:6:49:905:27 +GAAGAGACTATTGCCAGTTGAACCACACATTAATA +>EAS218_1:6:66:1282:1215 +GTGATGTGTGTTCTCATCAACCTCATACACACACA +>EAS218_1:6:66:1282:1215 +TTCAGACCCTACACGAATGCGTCTCTACCACAGGG +>EAS218_1:6:77:1529:522 +AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA +>EAS218_1:6:77:1529:522 +AAAGTTCAATACTCACCATCATAAATACACACAAA +>EAS218_1:6:88:1413:14 +AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA +>EAS218_1:8:13:1729:1844 +ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA +>EAS218_1:8:16:1081:1894 +AAGGTGATGTGTGTTCTCATCAACCTCATACACAC +>EAS218_1:8:16:1081:1894 +AGATGAAACGCGTAACTGGGCTCTCATTCACTCCA +>EAS218_1:8:26:785:882 +CAGTTTCTGCCCCAAGCATGGTTGTACTGGGCAAT +>EAS218_1:8:26:785:882 +TACTTATCATGACTCTATCCCAAATTCCCAATTAC +>EAS218_1:8:61:1797:113 +CAGATAGCTTGTGGTCTGACAGGCTGCAACTGTGA +>EAS218_1:8:61:1797:113 +GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA +>EAS218_1:8:70:445:1289 +CTAATTTTTGGACTTCTTAAAGAAAAAAAAACCTG +>EAS218_1:8:70:445:1289 +GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA +>EAS218_1:8:82:1540:77 +ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC +>EAS218_1:8:82:1540:77 +GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC +>EAS218_1:8:90:706:1276 +AATTAACATTACAACAGGAACAAAACCTCATATAT +>EAS218_1:8:90:706:1276 +GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG +>EAS218_4:1:34:1614:558 +CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA +>EAS218_4:1:34:1614:558 +GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC +>EAS218_4:1:48:9:409 +CAGCTCCCTGTCACCCAATGGACCTGTGATATCTG +>EAS218_4:1:48:9:409 +GTTTAGTGCCTTTGTTCACATAGACCCCCTTGCAA +>EAS218_4:1:84:1505:1037 +GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA +>EAS218_4:1:84:1505:1037 +TGCCCTGCTAAACTAAGCATCATAAATGAAGGGGA +>EAS218_4:1:9:206:901 +AGTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGA +>EAS218_4:1:9:206:901 +CTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTC +>EAS218_4:3:12:630:707 +ATTTAAAAACATGAACTAACTATATGCTGTTTACA +>EAS218_4:3:12:630:707 +CACAAAAGTACAAAACTCACAGGTTTTATAAAACA +>EAS218_4:3:39:1671:1928 +AGCCCATACTTTACTGCTACTCAATATATCCATGT +>EAS218_4:3:39:1671:1928 +CAAATATTGCTAGTGGGAGTATAAATTGTTTTCCA +>EAS218_4:3:41:1281:1785 +ACTATCTAAAGTCAACATGAAGGAAAAAAATTCTA +>EAS218_4:3:41:1281:1785 +GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT +>EAS218_4:3:65:85:1547 +AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA +>EAS218_4:3:65:85:1547 +GTTTGGAAAAACTATTTGAGGAAGTAATTGGGGAA +>EAS218_4:5:41:118:1246 +ACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGAA +>EAS218_4:5:41:118:1246 +CTCCAGATTGCTTGTGGTCTGACAGGCTGCAACTG +>EAS218_4:5:63:875:1339 +CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCC +>EAS218_4:5:63:875:1339 +GGGAACAGGGAGGTGCACTAATGCGCTCCACGCCC +>EAS218_4:7:71:31:1973 +AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC +>EAS218_4:7:72:1288:1211 +ATTGGTACAATGTACAATATTCTGATGATGGTTAC +>EAS218_4:7:72:1288:1211 +GATAAAGCACACTTTAAATCAACAACAGTAAAATA +>EAS218_4:7:85:923:726 +ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA +>EAS218_4:7:85:923:726 +GTAAAGTAACTGAACCTATGAGTCACAGGTATTCC +>EAS218_4:7:87:964:826 +CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC +>EAS218_4:7:87:964:826 +TGAAGAGACTATTGCCAGATGAACCACACATTAAT +>EAS218_4:7:89:1487:520 +CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGT +>EAS218_4:7:89:1487:520 +TATGAAGAGACTATTGCCAGATGAACCACACATTA +>EAS218_4:7:90:1873:89 +GAGATTCTGCAGCCCAGATCCAGATTGCTTGTGGT +>EAS218_4:7:90:1873:89 +GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG +>EAS219_1:1:22:490:2011 +ATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC +>EAS219_1:1:22:490:2011 +GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCA +>EAS219_1:1:37:1004:1136 +CCAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT +>EAS219_1:1:37:1004:1136 +GTCACCCAATGGACCTGTGATATCTGGATTCTGGG +>EAS219_1:1:44:1466:425 +GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGG +>EAS219_1:1:44:1466:425 +TTATCTGCACATTACTACCCTGCAATTAATATAAT +>EAS219_1:1:50:257:341 +AAATTAACATTACAACAGGAACAAAACCTCATATA +>EAS219_1:1:50:257:341 +TGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTA +>EAS219_1:1:5:497:687 +AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC +>EAS219_1:1:5:497:687 +TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA +>EAS219_1:1:60:1420:660 +AATGCTAAGATAATTCATCATCACTAAACCAGTCC +>EAS219_1:1:60:1420:660 +GTAAAAAATTAACATTACAACAGGAACAAAACCTC +>EAS219_1:1:63:28:1549 +AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA +>EAS219_1:1:63:28:1549 +TACAATATTCTGATGATGGTTACACTAAAAGCCCA +>EAS219_1:1:67:191:668 +ACTATGAAGAGACTATTGCCAGATGAACCACACCT +>EAS219_1:1:67:191:668 +CCAATTACGTCCTATCTTCTTCTTAGGGAAGAACA +>EAS219_1:3:11:706:1030 +ATCTCTTGTAATCTCTCTCATCTTTGCTGCATCCC +>EAS219_1:3:11:706:1030 +ATGTCTATTTTTGTCTTGACACCCAACTAATATTT +>EAS219_1:3:33:1168:1762 +AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG +>EAS219_1:3:33:1168:1762 +GTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCA +>EAS219_1:3:4:1620:413 +CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA +>EAS219_1:3:4:1620:413 +TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC +>EAS219_1:3:62:603:1552 +AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT +>EAS219_1:3:62:603:1552 +GAACCACACATTAATACTATGTTTCTTATCTGCAC +>EAS219_1:3:88:465:1877 +AAAGCACACTTTAAATCAACAACAGTAAAATAAAA +>EAS219_1:3:88:465:1877 +TAAGAGGGATGAGAAATTACCTAATTGGTACAATG +>EAS219_1:3:90:219:528 +ACGAATGTTATGCCCTGCTAAACTAAGCATCATAA +>EAS219_1:3:90:219:528 +GTACAAAACTCACAGGTTTTATAAAACAATTAATT +>EAS219_1:5:5:259:250 +GTCTCTTATGAATTAACCCAGTCAGACAAAAATAA +>EAS219_1:5:5:259:250 +TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT +>EAS219_1:5:6:1067:91 +CTTGACACCCAACTAATATTTGTCTGAGCAAAACA +>EAS219_1:5:6:1067:91 +CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT +>EAS219_1:7:16:1343:1621 +AAATTCTAAAATCAGCAAGAGAAAAGCATACAGTC +>EAS219_1:7:16:1343:1621 +AAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGTA +>EAS219_1:7:18:571:1110 +GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC +>EAS219_1:7:18:571:1110 +TAATATAATTGTGTCCATGTACACACGCTGTCCTA +>EAS219_1:7:20:1444:328 +AAAAGATGTTCTACGCAAACAGAAACCAAATGAGA +>EAS219_1:7:20:1444:328 +TACTAAATACATATGCACCTAACACAAGACTACCC +>EAS219_1:7:35:392:2042 +ATAAATCTATAAAAAAATTAAAATTTAACAAAAGT +>EAS219_1:7:35:392:2042 +TAACACAAGACTACCCAGATTCATAAAACNAATAC +>EAS219_1:7:50:1339:1154 +CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC +>EAS219_1:7:50:1339:1154 +GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA +>EAS219_1:7:62:1076:540 +CCCCCACTTAAGAGATATAGATTGGCAGAACAGAT +>EAS219_1:7:62:1076:540 +TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC +>EAS219_1:7:94:1655:1921 +AAAAGCATACAGTCATCTATAAAGGAAATCCCATC +>EAS219_1:7:94:1655:1921 +TTTGGAAAAACTATTTGAGGAAGTAATTGGGGAAA +>EAS219_FC30151:1:18:1418:237 +CCTTGAGAACCCCAGGGAATTTGTCAATGTCAGGG +>EAS219_FC30151:1:18:1418:237 +CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC +>EAS219_FC30151:1:53:140:421 +AACCAAATGAGAGAAGGAGTAGCTATACTTATATC +>EAS219_FC30151:1:53:140:421 +GATTCATAAAACAAATACTACTAGACCTAAGAGGG +>EAS219_FC30151:1:54:436:1452 +AAGACAAGTCTCTTATGAATTAACCCAGTCAGACA +>EAS219_FC30151:1:54:436:1452 +AGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCT +>EAS219_FC30151:1:55:8:1412 +ATATAATTGTGTCCATGTACACACGCTGTCCTATG +>EAS219_FC30151:1:55:8:1412 +GCCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCAT +>EAS219_FC30151:1:76:34:691 +ATATATCAATATTAACTTTGAATAAAAAGGGATTA +>EAS219_FC30151:1:88:1454:418 +CCAGGAAGATACATTGCAAGACAGACTTCATCAAG +>EAS219_FC30151:1:88:1454:418 +GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG +>EAS219_FC30151:3:13:674:1717 +AGAAAAGCATGCAGTCATCTATAAAGGAAATCCCA +>EAS219_FC30151:3:13:674:1717 +TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG +>EAS219_FC30151:3:40:1128:1940 +CCCCTTACAACAACCTTGAGAACCCCAGGGAATTT +>EAS219_FC30151:3:40:1128:1940 +CCGAGTCACGGGGTTGCCAGCACAGGGGCTTAACC +>EAS219_FC30151:3:55:74:1040 +CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA +>EAS219_FC30151:3:55:74:1040 +GGAAATGCTTTACTGTCATAACTATGAAGAGACTA +>EAS219_FC30151:3:73:1458:1337 +AAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGAC +>EAS219_FC30151:3:73:1458:1337 +AGGTAAAAAATTAACATTACAACAGGAACAAAACC +>EAS219_FC30151:3:81:1723:1820 +ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT +>EAS219_FC30151:3:81:1723:1820 +CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG +>EAS219_FC30151:3:90:1906:1528 +CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA +>EAS219_FC30151:3:90:1906:1528 +TTACAAAATATAGTTGAAAGCTCTAACAATAGACT +>EAS219_FC30151:3:9:1595:1826 +ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAG +>EAS219_FC30151:3:9:1595:1826 +ATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTC +>EAS219_FC30151:5:29:817:854 +AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG +>EAS219_FC30151:5:29:817:854 +GTTCTCAAGGTTGTTGCAAGGGGGTTTATGTGAAC +>EAS219_FC30151:5:54:1351:910 +ACTAAAAGCCCATACTTTACTGCTACTCAATATAT +>EAS219_FC30151:5:54:1351:910 +ACTCTCAAATATTGCTAGTGGGAGTATAAATTGTT +>EAS219_FC30151:5:63:424:1643 +GACCCTACACGAATGCGTCTCTACCACAGGGGGCT +>EAS219_FC30151:5:63:424:1643 +GGTCTTTCAAAAGGTGATGTGTGTTCTCATCAACC +>EAS219_FC30151:5:6:1243:981 +ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAA +>EAS219_FC30151:5:6:1243:981 +TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT +>EAS219_FC30151:5:70:348:972 +GAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTC +>EAS219_FC30151:5:70:348:972 +TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT +>EAS219_FC30151:5:72:1426:1883 +ACATAATCCCACGCTTCCTATGGAAAGGTTGTTGG +>EAS219_FC30151:5:72:1426:1883 +CATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGC +>EAS219_FC30151:7:11:1261:1200 +AAAAAAAACCTGTCAAACACGAATGTTATGCCCTG +>EAS219_FC30151:7:11:1261:1200 +TTGCAAGACAGACTTCATCAAGTTATGTAGTCATC +>EAS219_FC30151:7:51:1429:1043 +TATTTGTAATGAAAACTATATTTATGCTATTCAGT +>EAS219_FC30151:7:87:1289:83 +ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA +>EAS219_FC30151:7:87:1289:83 +ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG +>EAS219_FC30151:7:94:1440:2016 +AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC +>EAS219_FC30151:7:94:1440:2016 +CACAAAAGTACAAAACTCACAGGTTTTATAAAACA +>EAS220_1:2:11:1274:1230 +TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT +>EAS220_1:2:11:1274:1230 +TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT +>EAS220_1:2:43:656:1866 +TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT +>EAS220_1:2:47:591:698 +CAAATCTGCGCTTGTACTTCTAAATCTATAACAAA +>EAS220_1:2:47:591:698 +TCCTACTAAATACATATGCACCTAACACAAGACTA +>EAS220_1:2:50:513:882 +AAAACAAATACTACTAGACCTAAGAGGGATGAGAA +>EAS220_1:2:50:513:882 +GGAGTAGCTATACTTATATCAGATAAAGCACACTT +>EAS220_1:2:52:1779:1664 +CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG +>EAS220_1:2:52:1779:1664 +TGTTAAAATGTCTATTTTTGTCTTGACACCCAACT +>EAS220_1:2:54:91:1232 +AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG +>EAS220_1:2:54:91:1232 +AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA +>EAS220_1:2:62:1109:804 +TAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCTA +>EAS220_1:2:62:1109:804 +TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT +>EAS220_1:2:63:267:545 +ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT +>EAS220_1:2:63:267:545 +CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTTG +>EAS220_1:2:72:1809:1398 +AATACATGAGATTATTAGGAAATGCTTTACTGTCA +>EAS220_1:2:72:1809:1398 +CTATCTTCTTCTTAGGGAAGAACAGCTTAGGTATC +>EAS220_1:4:100:20:1199 +AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA +>EAS220_1:4:100:20:1199 +CAGTCATCTATAAAGGAAATCCCATCAGAATAACA +>EAS220_1:4:14:1665:1772 +GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC +>EAS220_1:4:14:1665:1772 +TATAATGGTGTCCATGTACACACGCTGTCCTATGT +>EAS220_1:4:46:1566:668 +CTACTAAATACATATGCACCTAACACAAGACTACC +>EAS220_1:4:46:1566:668 +TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA +>EAS220_1:4:69:88:1154 +ATAACTATGAAGAGACTATTGCCAGATGAACCACA +>EAS220_1:4:69:88:1154 +CACGAATGCGTCTCTACCACAGGCGGCTGCGCGGT +>EAS220_1:4:6:1178:1105 +GATAATTCATCATCACTAAACCAGTCCTATAAGAA +>EAS220_1:4:6:1178:1105 +GGAACAAAACCTCATATATCAATATTAACTTTGAA +>EAS220_1:4:70:766:2016 +AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC +>EAS220_1:4:70:766:2016 +ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG +>EAS220_1:6:24:105:1046 +AGATTCATAAAACAAATACTACTAGACCTAAGAGG +>EAS220_1:6:24:105:1046 +CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA +>EAS220_1:6:7:1547:1933 +AATATTTGACTGAGCAAAACAGTCTAGATGAGAGA +>EAS220_1:6:7:1547:1933 +CTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTG +>EAS220_1:8:18:1757:95 +ATGAGTCGCAGGTATTCCTGAGGAAAAAGAAAAAG +>EAS220_1:8:18:1757:95 +CTTCATCAAGATATGTAGTCATCAGACTATCTAAA +>EAS220_1:8:33:672:473 +ATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAAT +>EAS220_1:8:33:672:473 +TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT +>EAS220_1:8:38:1576:1923 +CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC +>EAS220_1:8:38:1576:1923 +CTGTCATAACTATGAAGAGACTATTGCCAGATGAA +>EAS220_1:8:45:178:1321 +AGGTTTTATAAAACAATTAATTGAGACTACAGAGC +>EAS220_1:8:45:178:1321 +CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT +>EAS220_1:8:46:1528:799 +ATGATAAAAAGATCAATTCAGCAAGAAGATATAAC +>EAS220_1:8:46:1528:799 +CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA +>EAS220_1:8:46:485:482 +AGAGATTCTGCAGCCCAGATCCAGATTGCTTGTGG +>EAS220_1:8:46:485:482 +ATTACCAGAGGGATGAAGGGAAGAGGGACGCTGAA +>EAS220_1:8:5:996:2000 +AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA +>EAS220_1:8:5:996:2000 +CACGAATGTTATGCCCTGCTAAACTAAGCATCATA +>EAS220_1:8:66:1046:167 +ACAATGTACAATATTCTGATGATGGTTACACTAAA +>EAS220_1:8:66:1046:167 +ACACTTTAAATCAACAACAGTAAAATAAAACAAAG +>EAS220_1:8:83:1456:1854 +AAGATCAATTCAGCAAGAAGATATAACCATCCTAC +>EAS220_1:8:83:1456:1854 +AAGCCCATACTTTACTGCTACTCAATATATCCATG +>EAS221_1:2:23:127:880 +CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA +>EAS221_1:2:23:127:880 +TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT +>EAS221_1:2:24:1037:84 +TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC +>EAS221_1:2:24:1037:84 +TTCAGTTCTAAATATAGAAATTGAAACAGCTGTGT +>EAS221_1:2:29:1486:672 +AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA +>EAS221_1:2:3:542:428 +AAGACATGAGTTCAGGTACAGGGGTGGAAAAAGAT +>EAS221_1:2:3:542:428 +AGAGCAACTAGGTAAAAAATTAACATTACAACAGG +>EAS221_1:2:3:945:2005 +AACCAAGCAGAAGAAAGAGGCTCAGAACTTGAAGA +>EAS221_1:2:3:945:2005 +GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCT +>EAS221_1:2:52:1144:509 +AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG +>EAS221_1:2:52:1144:509 +TGTAAAAGTCAAAATTAAAGTTCAATACTCACCAT +>EAS221_1:2:73:955:728 +AATTCATCATCACTAAACCAGTCCTATAAGAAATG +>EAS221_1:2:73:955:728 +TACAACAGGAACAAAACCTCATATATCAATATTAA +>EAS221_1:2:8:327:522 +AACAGGAACAAAACCTCATATATCAATATTAACTT +>EAS221_1:2:8:327:522 +TTCTACGCAAACAGAAACCAAATGAGAGAAGGAGT +>EAS221_1:2:90:986:1224 +CTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAAC +>EAS221_1:2:91:856:504 +CTAGATGAGAGAGAACTTCCCTGGAGGTCTGATGG +>EAS221_1:2:91:856:504 +GTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTT +>EAS221_1:4:36:1402:1709 +AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC +>EAS221_1:4:36:1402:1709 +TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT +>EAS221_1:4:3:248:1491 +TTAAAATTTAACAAAAGTAAATAAAACACATAGCT +>EAS221_1:4:41:519:609 +AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG +>EAS221_1:4:41:519:609 +TACCTAATTGGTACAATGGACAATATTCTGATGAT +>EAS221_1:4:4:1732:88 +GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC +>EAS221_1:4:4:1732:88 +TGTACACACGCTGTCCTATGTACTTATCATGACTC +>EAS221_1:4:68:64:783 +AAGACATAATCCCACGCTTCCTATGGAAAGGTTGT +>EAS221_1:4:68:64:783 +TCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT +>EAS221_1:4:87:1375:1303 +AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA +>EAS221_1:4:87:1375:1303 +GAGAGATTCTGCAGCCCAGATCCAGATTGCTTGTG +>EAS221_1:6:38:1071:155 +ATGCCCCTTGGCCATCACCCAGTCCCTGCCCCATC +>EAS221_1:6:38:1071:155 +TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT +>EAS221_1:6:4:1131:104 +ACTTTGGAAAACAATTTGGTAATTTCGTTTTTTTT +>EAS221_1:6:4:1131:104 +ATGTAACAAATCTGCGCTTGTACTTCTAAATCTAT +>EAS221_1:6:57:1342:1166 +AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA +>EAS221_1:6:57:1342:1166 +CAGAGCAACTAGGTAAAAAATTAACATTACAACAG +>EAS221_1:6:60:1037:1146 +AAAAGCATACAGTCATCTATAAAGGAAATCCCATC +>EAS221_1:6:60:1037:1146 +GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT +>EAS221_1:6:69:735:1915 +AATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAG +>EAS221_1:6:69:735:1915 +ACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCATTT +>EAS221_1:6:89:1164:573 +AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT +>EAS221_1:6:89:1164:573 +AGACTTCATCAAGAGATGTAGTCATCAGACTATCT +>EAS221_1:6:92:1807:1185 +AGCATGGTTGTACTGGGCAATACATGAGATTATTA +>EAS221_1:6:92:1807:1185 +CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT +>EAS221_1:6:96:491:1891 +AGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGG +>EAS221_1:6:96:491:1891 +GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA +>EAS221_1:8:15:881:1932 +CACTTAAGAGATATAGATTGGCAGAACAGATTTAA +>EAS221_1:8:15:881:1932 +CACTTTAAATCAACAACAGTAAAATAAAACAAAGG +>EAS221_1:8:4:679:110 +AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA +>EAS221_1:8:4:679:110 +TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT +>EAS221_1:8:58:369:244 +CTGTAATGATGCCCCTTGGCCATCACCCAGTCCCT +>EAS221_1:8:58:369:244 +TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT +>EAS221_1:8:60:1020:1259 +CTATGAAGAGACTATTGCCAGATGAACCACACATT +>EAS221_1:8:60:1020:1259 +TAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTC +>EAS221_1:8:65:1928:1125 +CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA +>EAS221_1:8:65:1928:1125 +GGCATTTGCCTTCAGACCCTACACGAATACGTCTC +>EAS221_1:8:67:1797:1931 +GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG +>EAS221_1:8:67:1797:1931 +TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT +>EAS221_1:8:70:1349:1788 +ATTATATCAGATAAAGCACACTTTAAATCAACAAC +>EAS221_1:8:70:1349:1788 +TACTAGACCTAAGAGGGATGAGAAATTACCTAATT +>EAS221_1:8:73:108:1621 +GAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTC +>EAS221_1:8:73:108:1621 +GTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACA +>EAS221_1:8:77:781:676 +TCATGAAGCACTGAACTTCCACGTATCATCTAGGG +>EAS221_1:8:77:781:676 +TTGCCAGATGAACCACACATTAATACTATGTTTCT +>EAS221_1:8:78:1478:1446 +GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT +>EAS221_1:8:78:1478:1446 +TGTGGTCTGACAGGCTGCAACTGTGAGCCATCACA +>EAS221_1:8:84:1013:1074 +GCAAGGGGGTCTATGTGAACAAAGGCACTAAACAC +>EAS221_1:8:84:1013:1074 +TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA +>EAS221_1:8:8:1351:1986 +CCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATG +>EAS221_1:8:8:1351:1986 +TCTTACTTCCAGATCCCCAGAGGGAAAGCTTTCAA +>EAS221_3:2:100:1147:124 +AAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAG +>EAS221_3:2:100:1147:124 +AATGCCAGGAAGATACATTGCAAGACAGACTTCAT +>EAS221_3:2:22:1623:709 +GAAGACAAGTCTCTTATGAATTAACCCAGTCAGAC +>EAS221_3:2:22:1623:709 +GGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC +>EAS221_3:2:2:491:1886 +CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT +>EAS221_3:2:59:1576:946 +AACTGTGAGCCATCACAATGAACAACAGGAAGAAA +>EAS221_3:2:59:1576:946 +CAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT +>EAS221_3:2:60:590:1760 +AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG +>EAS221_3:2:60:590:1760 +TCATCAAGATATGTAGTCATCAGACTATCTAAAGT +>EAS221_3:2:67:1467:1447 +AAAGTTCAATACTCACCATCATAAATACACACAAA +>EAS221_3:2:67:1467:1447 +ATAGATTGGCAGAACAGATTTAAAAACATGAACTA +>EAS221_3:2:67:1864:477 +AATGATGCCCCTTGGCCATCACCCAGTCCCTGCCC +>EAS221_3:2:67:1864:477 +TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT +>EAS221_3:2:76:1729:813 +TAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTT +>EAS221_3:2:76:1729:813 +TCTGCGCTTGTACTTCTAAATCTATAAAAAAATTA +>EAS221_3:4:12:276:1797 +ACTATTGCCAGATGAACCACACATTAATACTATGT +>EAS221_3:4:12:276:1797 +TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC +>EAS221_3:4:21:132:1423 +GCCAGATGAACCACACATTAATACTATGTTTCTTA +>EAS221_3:4:21:132:1423 +TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC +>EAS221_3:4:29:1061:574 +ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG +>EAS221_3:4:29:1061:574 +GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG +>EAS221_3:4:30:1452:1563 +ATGAATTAACCAAGTCAGACAAAAATAAAGAAAAA +>EAS221_3:4:30:1452:1563 +GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT +>EAS221_3:4:41:1308:619 +CATTGCAAGACAGACTTCATCAAGATATGTAGTCA +>EAS221_3:4:41:1308:619 +GAAGTATGAGATTATGTAAAGTAACTGAACCTATG +>EAS221_3:4:57:1675:720 +TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA +>EAS221_3:4:57:1675:720 +TCATATATCAATATTAACTTTGAATAAAAAGGGAT +>EAS221_3:4:66:584:407 +GCATTTGCCTTCAGACCCTACACGAATGCGTCTCT +>EAS221_3:4:66:584:407 +GGGCAATACATGAGATTATTAGGAAATGCTTTACT +>EAS221_3:4:78:1314:1275 +AGGAAATCCCATCAGAATAACAATGGGCTTCTCAG +>EAS221_3:4:78:1314:1275 +GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG +>EAS221_3:4:81:687:1379 +CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA +>EAS221_3:4:81:687:1379 +TAAATAAAACACATAGCTAAAACTAAAAAAGCAAA +>EAS221_3:4:90:247:212 +ACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCT +>EAS221_3:4:90:247:212 +TGACAGGCTGCAACTGTGAGCCATCACAATGAACA +>EAS221_3:6:20:492:850 +AGTATGAAAACAATGTTCCCCAGATGCCGTCCCGG +>EAS221_3:6:20:492:850 +CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT +>EAS221_3:6:26:227:1053 +ATTCTTCATCCTGGACCCTGAGAGATTCTGCAGCC +>EAS221_3:6:26:227:1053 +GGTTTAGGGGTATAATACCTCTACATGGCTGATTA +>EAS221_3:6:51:1486:1131 +ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA +>EAS221_3:6:51:1486:1131 +TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT +>EAS221_3:6:70:843:706 +AATGATTCCTCAATGTTAAAATGTCTATTTTTGTC +>EAS221_3:6:70:843:706 +ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC +>EAS221_3:8:33:1240:846 +ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT +>EAS221_3:8:33:1240:846 +ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA +>EAS221_3:8:34:956:1309 +AACTATGAAGAGACTATTGCCAGATGAACCACACA +>EAS221_3:8:34:956:1309 +AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC +>EAS221_3:8:50:1203:1094 +AAATATAGTTGAAAGCTCTAACAATAGACTAAACC +>EAS221_3:8:50:1203:1094 +ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG +>EAS221_3:8:55:932:613 +TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA +>EAS221_3:8:55:932:613 +TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG +>EAS221_3:8:63:1265:820 +CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC +>EAS221_3:8:63:1265:820 +TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA +>EAS221_3:8:65:463:703 +GAAACCTTACAAGCCAGAAGAGATTGGATCTAATT +>EAS221_3:8:65:463:703 +TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT +>EAS221_3:8:74:770:1712 +ACATTACTACCCTGCAATTAATATAATTGTGTCCA +>EAS221_3:8:74:770:1712 +GAGCCGTCCGTGTCCTCCCATCTGGCCTCGTCCAC +>EAS221_3:8:7:1864:1569 +AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA +>EAS221_3:8:7:1864:1569 +AGATATGTAGTCATCAGACTATCTAAAGTCAACAT +>EAS51_62:1:38:250:647 +AATAATAAAATGATAAAAAGATCAATTCAGCAAGA +>EAS51_62:1:38:250:647 +ACTATATGCTGTTTACAAGAAACTCATTAATAAAT +>EAS51_62:2:133:8:379 +ATAAGATAATTCATCATCACTAAACCAGTCCTATA +>EAS51_62:2:133:8:379 +GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC +>EAS51_62:2:258:266:101 +ACGCTGTCCTATGTACTTATCATGACTCTATCCCA +>EAS51_62:2:258:266:101 +CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT +>EAS51_62:2:260:147:818 +AAAATTTGGTAATTTAGTTTTTTTTTTTTTCTTTT +>EAS51_62:2:260:147:818 +ATCCATGTAACAAATCTGCGCTTTTACTTCTAAAT +>EAS51_62:3:103:443:166 +ACCTGTCAAACACGAATGTTATGCCCTGCTAAACT +>EAS51_62:3:103:443:166 +TACACACAAAAGTACAAAACTCACAGGTTTTATAA +>EAS51_62:3:169:292:652 +ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC +>EAS51_62:3:169:292:652 +GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA +>EAS51_62:3:200:263:280 +AGTAAAATAAAACAAAGGAGGTCATCATACAATGA +>EAS51_62:3:200:263:280 +TTGGTACAATGTACAATATTCTGATGATGGTTACA +>EAS51_62:3:263:74:407 +AAGCTTTCAACGCTTCTAGCCATTTCTTTTGGCAT +>EAS51_62:3:263:74:407 +CTGCAACTGTGAGCCATCACAATGAACAACAGGAA +>EAS51_62:3:314:386:190 +AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA +>EAS51_62:3:314:386:190 +CACTCCAGCTCCCTGTCACCCAATGGACCTGTGAT +>EAS51_62:3:50:312:219 +ACTGCTACTCAATATATCCATGTAACAAATCTGCG +>EAS51_62:3:50:312:219 +TCCTACTAAATACATATGCACCTAACACAAGACTA +>EAS51_62:3:55:340:837 +TCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAAT +>EAS51_62:3:55:340:837 +TTAATATAATTGTGTCCATGTACACACGCTGTCCT +>EAS51_62:3:68:996:104 +AGAGGGATGAGAAATTACCTAATTGGTACAATGTA +>EAS51_62:3:68:996:104 +TACTTATATCAGATAAAGCACACTTTAAATCAACA +>EAS51_62:4:156:857:494 +CTCATACACACACATGGTTTAGGGGTATAATACCT +>EAS51_62:4:156:857:494 +GTTTCCCATCATGAAGCACTGAACTTCCACGTCTC +>EAS51_62:4:187:907:145 +TTTCTTCTCTCTCTTTTTTTTTTTTTTTATTGCAT +>EAS51_62:4:282:962:46 +GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG +>EAS51_62:4:282:962:46 +TACTTTACTGCTACTCAATATATCCATGTAACAAA +>EAS51_62:4:308:614:911 +AAAAACAATTTGGTAATTTAGTTTTTTTTTTTTTC +>EAS51_62:4:308:614:911 +TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA +>EAS51_62:5:119:38:945 +ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT +>EAS51_62:5:119:38:945 +TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA +>EAS51_62:5:131:779:345 +GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA +>EAS51_62:5:131:779:345 +TGGAAGACATAATCCCACGCTTCCTATGGAAAGGT +>EAS51_62:5:154:669:853 +GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA +>EAS51_62:5:154:669:853 +TGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGA +>EAS51_62:5:192:716:235 +ATACACACACATGGTTTAGGGGTATAATACCTCTA +>EAS51_62:5:192:716:235 +GACCCTACACGAATGCGTCTCTACCACAGGGGGCT +>EAS51_62:5:236:498:526 +ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT +>EAS51_62:5:236:498:526 +CAGCACATTACTACCCTGCAATTAATATAATTGTG +>EAS51_62:5:290:319:736 +CGAGTCACGGGGTTGCCAGCACAGGGGCTTAACCT +>EAS51_62:5:290:319:736 +GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC +>EAS51_62:5:295:882:282 +AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG +>EAS51_62:5:295:882:282 +CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA +>EAS51_62:5:86:697:941 +AAAAAAATCCCGGAAGATACATTGCAAGACAGACT +>EAS51_62:5:86:697:941 +GTATGAGATTATGTAAAGTAACTGAACCTATGAGT +>EAS51_62:6:12:484:836 +AAACACATAGCTAAAACTAAAAAAGCAAAAACAAA +>EAS51_62:6:12:484:836 +AAATACTACTAGACCTAAGAGGGATGAGAAATTAC +>EAS51_62:6:148:170:895 +AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT +>EAS51_62:6:148:170:895 +AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA +>EAS51_62:6:50:542:881 +CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA +>EAS51_62:6:50:542:881 +TCCCAATTACGTCCTATCTTCTTCTTAGGTAAGAA +>EAS51_62:7:144:28:475 +AGGAAATGCTTTACTGTCATAACTATGAAGAGACT +>EAS51_62:7:144:28:475 +CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT +>EAS51_62:7:157:784:936 +GCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTCT +>EAS51_62:7:157:784:936 +TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTGTT +>EAS51_62:7:162:195:761 +AACATGAACTAACTATATGCTGTTTACAAGAAACT +>EAS51_62:7:162:195:761 +TCACAGGTTTTATAAAACAATTAATTGAGACTACA +>EAS51_62:7:178:286:414 +CACGCCCAAGCCCTTCTCACAGTTTCTGCCCCCAG +>EAS51_62:7:178:286:414 +TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG +>EAS51_62:7:196:511:896 +ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT +>EAS51_62:7:196:511:896 +GAAAAGCATACAGTCATCTATAAAGGAAATCCCAT +>EAS51_62:7:248:17:435 +ATAACCATCCTACTAAATACATATGCACCTAACAC +>EAS51_62:7:248:17:435 +CATGAGTTCAGGAAAAGGGGTGGAAAAAGATGTTC +>EAS51_62:7:312:236:655 +GAGAAATTACCTAATTGGTACAATGTACAATATTC +>EAS51_62:7:312:236:655 +TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA +>EAS51_62:7:96:836:737 +ATCAACCTCATACACACACATGGTTTAGGGGTATA +>EAS51_62:7:96:836:737 +TCCCATCATGAAGCACTGAACTTCCACGTCTCATC +>EAS51_62:8:52:967:804 +AACTAAGCATCATAAATGAAGGGGAAATAAAGTCA +>EAS51_62:8:52:967:804 +TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT +>EAS51_64:2:326:153:231 +ATTGTTTTCAACTTTGGAAAACAATTTGGTAATTT +>EAS51_64:2:326:153:231 +TGCTACTCAATATATCCATGTAACAAATCTGCGCT +>EAS51_64:3:143:310:958 +CTGCACATTACTACCCTGCAATTAATATAATTGTG +>EAS51_64:3:143:310:958 +GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC +>EAS51_64:3:190:727:308 +ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG +>EAS51_64:3:190:727:308 +GGTGCAGAGCCGAGTCACGGGGTTGCCAGCACAGG +>EAS51_64:3:255:45:399 +AAAAACTATGCTAAGTATTGGTAAAGATGTGGGGA +>EAS51_64:3:255:45:399 +GGTACAATGTACAATATTCTGATGATGGTTACACT +>EAS51_64:3:285:417:147 +AGTCAAAATTAAAGTTCAATACTCACCATCATAAA +>EAS51_64:3:285:417:147 +TTGGATCTAATTTTTGGACTTCTTAAAGAAAAAAA +>EAS51_64:3:309:303:278 +CTATGAAGAGACTATTGCCAGATGAACCACACATT +>EAS51_64:3:309:303:278 +TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC +>EAS51_64:3:67:782:132 +ATATTTGTCTGAGCAAAACAGTCTAGATGAGAGAG +>EAS51_64:3:67:782:132 +TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT +>EAS51_64:3:7:268:263 +TCGTACAGAAGTTTAATGGAGCCTTGGGACCTTAC +>EAS51_64:3:7:268:263 +TTGCGTTATTTGAGTTGGTGGAAGACATAATCCCA +>EAS51_64:3:80:885:513 +GAAATTCTTCATCCTGGACCCTGAGAGATTCTGCA +>EAS51_64:3:80:885:513 +GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG +>EAS51_64:3:90:435:691 +GGGAATTTGTCAATGTCAGGGAAGGAGCATTTTGT +>EAS51_64:3:90:435:691 +TCTGGTGACTGCCAGAGCTGCTGGCAAGCTAGAGT +>EAS51_64:4:102:467:897 +AGCATGGTTGTACAGGGCAATACATGAGATTATTA +>EAS51_64:4:102:467:897 +GCTTTCAACGCTTCTAGCCATTTCTTTTGTCTTTT +>EAS51_64:4:116:738:142 +AAAGTTCAATACTCACCATCATAAATACACACAAA +>EAS51_64:4:116:738:142 +TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG +>EAS51_64:4:163:31:455 +CTTACTTCCAGCTCCCCAGAGGGACAGCTNNCAAC +>EAS51_64:4:163:31:455 +GGGAGGTGCACTAATGCGCTCCACGCCCAAGCCCT +>EAS51_64:4:179:389:585 +TGGCCACTTTTTATCGCATTTCCCTTTAGAACCTA +>EAS51_64:4:179:389:585 +TGTGAAATGAATGAGATTATTAGGAAATGCTTTAC +>EAS51_64:4:181:476:394 +AACAATATTAACTTTGAATAAAAAGGGATTAAATT +>EAS51_64:4:181:476:394 +TCATCACTAAACCAGTCCTATAAGAAATGCTCAAA +>EAS51_64:4:189:467:475 +CTACATGGCTGATTATGAAAACAATGTTCCCCAGA +>EAS51_64:4:189:467:475 +TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC +>EAS51_64:4:189:571:366 +AACAAATACTACTAGACCTAAGAGGGATGAGAAAT +>EAS51_64:4:189:571:366 +TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA +>EAS51_64:4:318:345:156 +GGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT +>EAS51_64:4:318:345:156 +TTATGAAAACAATGTTCCCCAGATACCATCCCTGT +>EAS51_64:4:57:786:414 +CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC +>EAS51_64:4:57:786:414 +TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA +>EAS51_64:5:177:24:389 +AGCTTTCAAGAAGTATGAGATTATGTAAAGTAACT +>EAS51_64:5:177:24:389 +CAAGACAGACTTCATCAAGATATGTAGTCATCAGA +>EAS51_64:5:202:39:380 +CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT +>EAS51_64:5:202:39:380 +CTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG +>EAS51_64:5:290:247:509 +AGCCCATACTTTACTGCTACTCAATATATCCATGT +>EAS51_64:5:290:247:509 +TCTCAAATATTGCTAGTGGGAGTATAAATTGTTTT +>EAS51_64:6:118:41:489 +ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA +>EAS51_64:6:118:41:489 +CCCTGCTAAACTAAGCATCATAAATGAAGGGGAAA +>EAS51_64:6:124:128:489 +CTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTT +>EAS51_64:6:124:128:489 +GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT +>EAS51_64:6:143:763:480 +AAACGCGTAACTGCGCTCTCATTCACTCCAGCTCC +>EAS51_64:6:143:763:480 +CTGAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA +>EAS51_64:6:195:348:703 +CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA +>EAS51_64:6:195:348:703 +TAATGAAAACTATATTTATGCTATTCAGTTCTAAA +>EAS51_64:6:206:994:556 +ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC +>EAS51_64:6:206:994:556 +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +>EAS51_64:6:210:809:735 +AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT +>EAS51_64:6:210:809:735 +GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT +>EAS51_64:6:213:54:878 +CTCTGTCTTGATTTACTTGTTGTTGGTTTTTTGTT +>EAS51_64:6:300:622:86 +GGTTACACTAAAAGCCCATACTTTACTGCTACTCA +>EAS51_64:6:300:622:86 +TCATACAATGATAAAAAGATCAATTCAGCAAGAAG +>EAS51_64:6:54:695:952 +ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT +>EAS51_64:6:54:695:952 +GGTTACACTAAAAGCCCATACTTTACTGCTACTCA +>EAS51_64:7:104:965:517 +AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA +>EAS51_64:7:104:965:517 +NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN +>EAS51_64:7:140:752:822 +CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA +>EAS51_64:7:140:752:822 +GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT +>EAS51_64:7:152:918:824 +TACTATGTTTCTTATCTGCACATTACTACCCTGCA +>EAS51_64:7:152:918:824 +TTTCCCATCATGAAGCACTGAACTTCCACGTCTCA +>EAS51_64:7:92:493:891 +AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG +>EAS51_64:7:92:493:891 +AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA +>EAS51_66:1:282:274:50 +ATTACCAGAGGGATGGAGGGAAGAGGGACGCTGAA +>EAS51_66:1:282:274:50 +CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT +>EAS51_66:1:289:207:323 +CCATACTTTACTGCTACTCAATATATCCATGTAAC +>EAS51_66:1:289:207:323 +CTAGTGGGAGTATAAATTGATTTCCACTTTGGAAA +>EAS51_66:1:64:182:741 +AAAAAAACAAATTAAACTCTAACAAAAGTAAATAA +>EAS51_66:3:102:511:946 +ATGTAAAAGTGACTGTTATTGTCTTGACACCCAAC +>EAS51_66:3:102:511:946 +CCCAGTCCCTGCCCCATCTCGGGTAATCTCTCTCC +>EAS51_66:3:155:375:623 +AAGGAGTAGCTATACTTATATCAGATAAAGCACAC +>EAS51_66:3:155:375:623 +CAATATTAACTTTGAATAAAAAGGGATTAAATTCC +>EAS51_66:3:166:532:438 +AACAAATACTACTAGACCTAAGAGGGATGAGAAAT +>EAS51_66:3:166:532:438 +AACTAAAAAAGCAAAAACAAAAACTATGCTAAGTA +>EAS51_66:3:233:191:520 +TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT +>EAS51_66:3:246:711:981 +AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC +>EAS51_66:3:246:711:981 +AGACTTCATCAAGATATGTAGTCATCAGACTATCT +>EAS51_66:3:263:689:572 +AAAGAAAAAAAAACCTGTCAAACACGAATGTTATG +>EAS51_66:3:263:689:572 +AAGATATGTAGTCATCAGACTATCTAAAGTCAACA +>EAS51_66:3:29:381:169 +ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT +>EAS51_66:3:29:381:169 +CATCAACCTCATACACACACATGGTTTAGGGGTAT +>EAS51_66:3:39:59:738 +GAGATTATTAGGAAATGCTTTACTGTCATAATTAT +>EAS51_66:3:39:59:738 +GTCCTATGTTCTTCTTAGGGAAGAACAGCTTAGGT +>EAS51_66:4:188:460:1000 +GTGTCCATGTACACACGCTGTCCTATGTACTTATC +>EAS51_66:4:188:460:1000 +TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC +>EAS51_66:4:191:40:536 +ATAAAAAAAGACTACCCAGATTCATAAAACAAATA +>EAS51_66:4:191:40:536 +CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA +>EAS51_66:4:209:92:210 +GAGATTATTAGGAAATGCTTTACTGTCATAACTAT +>EAS51_66:4:209:92:210 +TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT +>EAS51_66:4:240:264:231 +CAACAGATCAAGAAGGAGGGGCAATGGACGAGTTA +>EAS51_66:4:240:264:231 +TGTAATGAAAACTATATTTATGCTATTCAGTTCTA +>EAS51_66:4:277:482:316 +CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG +>EAS51_66:4:277:482:316 +TGTCCTATGTACTTATCATGACTCTATCCCAAATT +>EAS51_66:4:310:287:420 +AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT +>EAS51_66:4:310:287:420 +TACAGAGCAACTAGGTAAAAAATTAACATTACAAC +>EAS51_66:4:322:350:374 +ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA +>EAS51_66:4:322:350:374 +CATTGCAAGACAGACTTCATCAAGATATGTAGTCA +>EAS51_66:5:210:674:911 +TCATAAATACACACAAAAGTACAAAACTCACAGGT +>EAS51_66:5:210:674:911 +TGGCAGAACAGATTTAAAAACATGAACTAACTATA +>EAS51_66:5:269:280:716 +TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA +>EAS51_66:5:269:280:716 +TTTGTCAATGTCAGGGAAGGAGCATTTTTTCAGTT +>EAS51_66:5:273:545:1001 +AACAAAGGAGGTCATCATACAATGATAAAAAGATC +>EAS51_66:5:273:545:1001 +AGATTTAAAAACATGAACTAACTATATGCTGTTTA +>EAS51_66:5:285:395:450 +GTCATCTATAAAGGAAATCCCATCAGAATAACAAT +>EAS51_66:5:285:395:450 +TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT +>EAS51_66:5:308:400:602 +ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG +>EAS51_66:5:308:400:602 +CCTGTCACCCAATGGACCTGTGATATCTGGATTCT +>EAS51_66:6:284:442:747 +AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC +>EAS51_66:6:310:747:415 +TGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGT +>EAS51_66:6:310:747:415 +TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG +>EAS51_66:7:174:987:334 +ACACCCAAGCCCTTCTCACAGTTTCTGCCCCCAGC +>EAS51_66:7:174:987:334 +GTCCATGTACACACGCTGTCCTATGTACTTATCAT +>EAS51_66:7:4:234:610 +AAAAAACCTGTCAAACACGAATGTTATGCCCTCCT +>EAS51_66:7:4:234:610 +AAAAATCAACATCACAAATACACACAAAAGTACAA +>EAS51_66:7:84:411:336 +GCTTGTACTTCTAAATCTATAAAAAAATTAAAATT +>EAS51_66:8:36:688:722 +ATGTCTATTTTTGTCTTGACACCCAACTAATATTT +>EAS51_66:8:36:688:722 +GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT +>EAS51_66:8:43:972:506 +AGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT +>EAS51_66:8:43:972:506 +TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT +>EAS51_66:8:66:655:769 +TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT +>EAS51_66:8:66:655:769 +TTTGTCAGTTACCAAATGTGTTTATTACCAGAGGG +>EAS51_66:8:9:80:353 +AATTAATATAATTGTGTCCATGTACACACGCTGTC +>EAS51_66:8:9:80:353 +CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT +>EAS51_78:7:113:43:634 +ATTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAA +>EAS51_78:7:113:43:634 +CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTTTT +>EAS51_78:7:147:64:416 +AAACAATGTCCCCCAGATACCATCCCTGTCTTACT +>EAS51_78:7:147:64:416 +CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC +>EAS51_78:7:164:727:977 +GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA +>EAS51_78:7:164:727:977 +TACAAGCCAGAAGAGATTGGATCTAATTTTTCGAC +>EAS51_78:7:186:199:927 +CTACGCGAATGCGTCTCTACCACAGGGGGCTGCGC +>EAS51_78:7:186:199:927 +TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT +>EAS51_78:7:215:516:299 +AAGCTATGCTAAGTATTGGTAAAGATGTGGGGAAA +>EAS51_78:7:215:516:299 +AATTACCTAATTGGTACAATGTACAATATTCTGAT +>EAS51_78:7:270:448:491 +GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC +>EAS51_78:7:270:448:491 +TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC +>EAS51_78:7:303:402:142 +AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA +>EAS51_78:7:303:402:142 +TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT +>EAS51_78:7:316:961:576 +TGTGATATCTGGATTCTGGGAAATTCTTCATCCCG +>EAS51_78:7:316:961:576 +TTACGGGTGTAATCTCTCTACATGGCTAATTATGA +>EAS54_61:1:115:868:887 +CATACACACACATGGTTTAGGGGTATAATACCTCT +>EAS54_61:1:115:868:887 +TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC +>EAS54_61:2:168:61:867 +GATGTTCTACGCAAACAGAAACCAAATGAGAGAAG +>EAS54_61:2:168:61:867 +TCATAAAACAAATACTACTAGACCTAAGAGGGATG +>EAS54_61:2:66:757:918 +CCATCCTACTAAATACATATGCACCTAACACAAGA +>EAS54_61:2:66:757:918 +GGGGTGGAAAAAGATGTTCTACGCAAACAGAAACC +>EAS54_61:3:150:933:810 +AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT +>EAS54_61:3:150:933:810 +CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG +>EAS54_61:3:155:758:710 +ATCAGATAAAGCACACTTTAAATCAACAACAGTAA +>EAS54_61:3:155:758:710 +TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG +>EAS54_61:3:20:762:748 +CACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA +>EAS54_61:3:20:762:748 +TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT +>EAS54_61:4:143:69:578 +ATTGGGAGCCCCTCTAAGCCGTTCTATTTGTAATG +>EAS54_61:4:83:452:970 +AATGAAAACTATATTTATGCTATTCAGTTCTAAAT +>EAS54_61:4:83:452:970 +AGGGATGGAGGGAAGAGGGACGCTGAAGAACTTTG +>EAS54_61:4:86:660:932 +AATACATATGCACCTAACACAAGACTACCCAGATT +>EAS54_61:4:86:660:932 +ATATAAAAAAATTAAAATTTAACAAAAGTAAATAA +>EAS54_61:6:126:541:194 +AGTACGACCAGCTCCCCAGAGGGAAAGCTTTCAAC +>EAS54_61:6:126:541:194 +CAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGC +>EAS54_61:6:25:949:33 +AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG +>EAS54_61:6:25:949:33 +GATATGTAGTCATCAGACTATCTAAAGTCAACATG +>EAS54_61:7:114:506:971 +ACTAAATACATATGCACCTAACACAAGACTACCCA +>EAS54_61:7:114:506:971 +GGGTGGAAAAAGATGTTCTACGCAAACAGAAACCA +>EAS54_61:7:64:37:257 +CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT +>EAS54_61:7:64:37:257 +TTTGATTTGGTGGAAGACATAATCCCACGCTTCCT +>EAS54_61:8:165:441:708 +CCATCATAAATACACACAAAAGTACAAAACTCACA +>EAS54_61:8:165:441:708 +CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT +>EAS54_61:8:4:173:814 +CTGCTACTCAATATATCCATGTAACAAATCTGCGC +>EAS54_61:8:4:173:814 +GATAAAAAGATCAATTCAGCAAGAAGATATAACCA +>EAS54_65:2:127:288:655 +ACTAGGTAAAAAATTAACATTACAACAGGAACAAA +>EAS54_65:2:127:288:655 +TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA +>EAS54_65:2:182:924:833 +TTTTTTTTTTTTTATTTGCGCTTTTTTTTTTTTTT +>EAS54_65:2:264:157:150 +GGAAAAATGGACAAGATTCTGATGAGGGTTACACT +>EAS54_65:2:264:157:150 +TAAAGCACACTTTAAATCAACAACAGTAAAATAAA +>EAS54_65:2:94:356:809 +AAATCTATAACAAAATTAAAATTTAACAAAAGTAA +>EAS54_65:2:94:356:809 +CTAAATACATATGCACCTAACACAAGACTACCCAG +>EAS54_65:3:102:884:63 +GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA +>EAS54_65:3:102:884:63 +TGTCTTCCTCTGTCTTGATTTCCTTGTTGTTGGTT +>EAS54_65:3:155:541:234 +CTAAATACATATGCACCTAACACAAGACTACCCAG +>EAS54_65:3:155:541:234 +TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA +>EAS54_65:3:214:946:229 +AAATGAACAGAGCTTTCAAGAAGTATGATATTATG +>EAS54_65:3:214:946:229 +ACAAAGAATGCCAGGAAGATACATTGCAAGACAGA +>EAS54_65:3:273:901:459 +CCAGCATGGTTGTACTGGGCAATACATGAGATTAT +>EAS54_65:3:273:901:459 +TGTCCTATGTACTTATCATGACTCTATCCCAAATT +>EAS54_65:3:290:558:349 +ACCATCCCTGTCTTACTTCCAGCTCCCCAGCGGGA +>EAS54_65:3:290:558:349 +TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG +>EAS54_65:3:320:20:250 +AAATAAAACACATAGCTAAAACTAAAAAAGCAAAA +>EAS54_65:3:320:20:250 +TTTTTTTTTTTTTTTTTTTTTTTGCATGCCAGAAA +>EAS54_65:3:321:311:983 +ATTTATGCTATTCAGTTCTAAATATAGAAATTGAA +>EAS54_65:3:326:652:890 +TTCTGTAATTGAAAAATTCATTTAAGAAATTACAA +>EAS54_65:4:137:319:642 +CTTGTTGTTGGTTTTCTGTTTCTTTTTTTGATTTT +>EAS54_65:4:174:753:617 +ATATATCCATGTAACAAATCTGCGCTTGTACTTCT +>EAS54_65:4:174:753:617 +GATATAACCATCCTACTAAATACATATGCACCTAA +>EAS54_65:4:192:714:341 +AAATTAAAATTTAACAAAAGTAAATAAAACACATA +>EAS54_65:4:192:714:341 +ACACAAGACTACCCAGATTCATAAAACAAATACTA +>EAS54_65:4:193:38:987 +AGGGAAGAACAGCTTAGGTATCAATTTTGTGTTCT +>EAS54_65:4:193:38:987 +TGAGATTATTAGGAAATGCTTTACTGTCATAACTA +>EAS54_65:4:246:313:499 +ACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG +>EAS54_65:4:246:313:499 +CTTTAAACGCTTCTAGCCATTTCTTTTGGCATTTG +>EAS54_65:4:325:795:213 +AGACTACAGAGCAACTAGGTAAAAAATTAACATTA +>EAS54_65:4:325:795:213 +GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG +>EAS54_65:4:61:346:384 +CAACTAAGAAGAAACCTTACAAGCCAGAAGAGATT +>EAS54_65:4:61:346:384 +CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT +>EAS54_65:4:91:267:655 +CAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGT +>EAS54_65:4:91:267:655 +TGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGT +>EAS54_65:6:115:538:276 +CAAATGTGTTTATTACCAGAGGGATGGAGGGAAGA +>EAS54_65:6:115:538:276 +TATTTGTAATGAAAACTATATTTATGCTATTCAGT +>EAS54_65:6:164:797:930 +AGCTAGAGACCCATTTGGAGCCCCTCTAAGCCGTT +>EAS54_65:6:164:797:930 +GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGT +>EAS54_65:6:18:376:416 +GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA +>EAS54_65:6:18:376:416 +TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGTTT +>EAS54_65:6:277:590:364 +CTCTACATGGCTGATTATGAAAACAATGTTCCCCA +>EAS54_65:6:277:590:364 +CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC +>EAS54_65:6:326:71:741 +TCTCGTTTTTTTTTCTTTCTTTTCTCTTTTTTTTT +>EAS54_65:6:49:183:435 +CCATCATGAAGCACTGAACTTCCACGTCTCATCTA +>EAS54_65:6:49:183:435 +GACTATTGCCAGATGAACCACACATTAATACTATG +>EAS54_65:6:67:56:806 +TATAAAGGAAATCCCATCAGAATAACAATGGGCTT +>EAS54_65:6:67:56:806 +TCCTGACAAGCAAATGCTAAGATAATTCATCATCA +>EAS54_65:7:117:452:744 +AATATTAACTTTGAATAAAAAGGGATTAAATTCCC +>EAS54_65:7:117:452:744 +ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA +>EAS54_65:7:155:629:357 +AGAAGAGATTGGATCTAATTTTTGGACTTCTTAAA +>EAS54_65:7:155:629:357 +AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA +>EAS54_65:7:159:253:353 +ATAAAACAATTAATTGAGACTACAGAGCAACTAGG +>EAS54_65:7:159:253:353 +GAAGGGGAAATAAAGTCAAGTCTTTCCTGACAGGC +>EAS54_65:7:56:57:985 +TTCTGTCTTCTCTCCTGTCTTCTTTTCTCTTCTTT +>EAS54_65:7:56:57:985 +TTTTTTCTCTTTTCTCTTTTTTTTTTTTTTTTTTT +>EAS54_65:7:68:825:405 +AAAACCTCATATATCAATATTAACTTTGAATAAAA +>EAS54_65:7:68:825:405 +AAACCAAATGAGAGAAGGAGTAGCTATACTTATAT +>EAS54_65:8:10:975:766 +AATAACACAAGACTACCCAGATTCATAAAACAAAT +>EAS54_65:8:10:975:766 +TTAATAAAGACATGAGTTCAGGTAAAGGGGTGAAA +>EAS54_65:8:140:924:923 +GAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGAT +>EAS54_65:8:140:924:923 +TTTTAGCCATTTCTTTTGGCATTTGCCTTCAGACC +>EAS54_65:8:147:687:428 +ATATGCACCTAACACAAGACTACCCAGATTCATAA +>EAS54_65:8:147:687:428 +ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG +>EAS54_65:8:178:187:610 +AAATACACACAAAAGTACAAAACTCACAGGTTTTA +>EAS54_65:8:178:187:610 +TTGGCAGAACAGATTTAAAAACATGAACTAACTAT +>EAS54_65:8:240:719:799 +AGATTGGCAGAACAGATTTAAAAACATGAACTAAC +>EAS54_65:8:240:719:799 +TTAAAGTTCAATACTCACCATCATAAATACACACA +>EAS54_65:8:305:819:245 +AAATTCATTTAAGAAATTACAAAATATAGTTGAAA +>EAS54_65:8:76:493:708 +TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA +>EAS54_67:1:138:186:274 +GGCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGG +>EAS54_67:1:138:186:274 +TAATTGTGTCCATGTACACACGCTGTCCTATGTAC +>EAS54_67:1:159:222:274 +GAACCACACATTAATACTATGTTTCTTATCTGCAC +>EAS54_67:1:159:222:274 +GTCTGGGGAAAGTCTCAGGGAGCCGTCCGTGTCCT +>EAS54_67:1:15:381:715 +GACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTT +>EAS54_67:1:15:381:715 +GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT +>EAS54_67:1:88:54:900 +ATCAACAACAGAAAAATAAAACAAAGGAGGTCATC +>EAS54_67:1:88:54:900 +TGATGATGGTTACACTAAAAGCCCATACTTCACTG +>EAS54_67:2:22:471:500 +GTAAATAAAACACATAGCTAAAACTAAAAAAGCAA +>EAS54_67:2:22:471:500 +TACTACTAGACCTAAGAGGGATGAGAAATTACCTA +>EAS54_67:3:114:736:433 +AACAAAACCTCATATATCAATATTAACTTTGAATA +>EAS54_67:3:114:736:433 +ATGTTCTACGCAAACAGAAACCAAGTGAGAGAAGG +>EAS54_67:3:172:196:746 +AAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCT +>EAS54_67:3:172:196:746 +GCATACAGTCATCTATAAAGGAAATCCCATCAGAA +>EAS54_67:3:175:730:949 +TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC +>EAS54_67:3:197:261:624 +GACTATCTAAAGTCAACATGAAGGAAAAAAATTCT +>EAS54_67:3:197:261:624 +GCCCTGCTAAACTAAGCATCATAAATGAAGGGGAA +>EAS54_67:3:47:471:858 +ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT +>EAS54_67:3:47:471:858 +CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG +>EAS54_67:4:142:943:582 +TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA +>EAS54_67:4:145:607:216 +AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC +>EAS54_67:4:145:607:216 +TGAAAAACAGGAAGAAAAGGTCTTTCAAAAGGTGA +>EAS54_67:4:7:526:343 +TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT +>EAS54_67:4:7:526:343 +TGAAAACAGTGTTCCCCAGATACCATCCCTGTCTT +>EAS54_67:5:117:33:262 +AATTAACATTACAACAGGAACAAAACCTCATATAT +>EAS54_67:5:117:33:262 +ACAAGCAAATGCTAAGATAATTCATCATCACTAAA +>EAS54_67:5:124:241:608 +CTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG +>EAS54_67:5:124:241:608 +GGGTATAATACCTCTACATGGCTGATTATGAAAAC +>EAS54_67:5:127:828:697 +ATGCCAGGAAGATACATTGCAAGACAGACTTCATC +>EAS54_67:5:127:828:697 +TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT +>EAS54_67:5:149:639:910 +CAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGA +>EAS54_67:5:149:639:910 +TCACTAAACCAGTCCTATAAGAAATGCTCAAAAGA +>EAS54_67:5:71:408:741 +AGTCATCTATAAAGGAAATCCCATCAGAATAACAA +>EAS54_67:5:71:408:741 +TCCTGACAAGCAAATGCTAAGATAATTCATCATCA +>EAS54_67:6:107:395:312 +CAAAATATAGTTGAAAGCTCTAACAATAGACTAAA +>EAS54_67:6:107:395:312 +CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT +>EAS54_67:6:109:953:668 +CAATATATCCATGTAACAAATCTGCGCTTGTACTT +>EAS54_67:6:109:953:668 +CCACTTTGGAAAACAATTTGGTAATTTCGTTTTTT +>EAS54_67:6:198:503:669 +CAATGATAAAAAGATCAATTCAGCAAGAAGATATA +>EAS54_67:6:198:503:669 +CAGATTTAAAAACATGAACTAACTATATGCTGTTT +>EAS54_67:6:43:859:229 +TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA +>EAS54_67:6:46:285:790 +AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC +>EAS54_67:6:46:285:790 +TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG +>EAS54_67:7:101:752:996 +AACCTTACAAGCCAGAAGAGATTGGATCTAATTTT +>EAS54_67:7:101:752:996 +AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT +>EAS54_67:7:197:399:319 +CAAAAAACAAATACTACTAGACCTAAGAGGGATGA +>EAS54_67:7:197:399:319 +TAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA +>EAS54_67:8:19:855:491 +TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT +>EAS54_67:8:19:855:491 +TGTGTGTTCTCATCAACCTCATACACACACATGGT +>EAS54_67:8:46:900:610 +GATATCTGGATTCTGGGAAATTCTTCATCCTGGAC +>EAS54_67:8:46:900:610 +TACATGGCTGATTATGAAAACAATGTTCCCCAGAT +>EAS54_71:2:125:628:79 +GCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA +>EAS54_71:2:125:628:79 +TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA +>EAS54_71:2:204:264:413 +CAATGAACAACAGAAAGAAAAGTTCTTTCAAAAGG +>EAS54_71:2:204:264:413 +TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTG +>EAS54_71:2:85:686:696 +AATCAGCAAGAGAAAAGCATACAGTCATCTATAAA +>EAS54_71:2:85:686:696 +TAAACTAAGCATCATAAATGAAGTGGAAATAAAG +>EAS54_71:3:186:989:869 +ACACACATGGTTTAGGGGTATAATACCTCTACATG +>EAS54_71:3:186:989:869 +GGGAAATTCTTCATCCTGGACCCTGAGAGATTCT +>EAS54_71:3:254:32:275 +GATGGAGGGAAGAGGGACGCTGAAGAACTTTGAT +>EAS54_71:3:254:32:275 +TGCAACTGTGAGCCATCACAATGAACAACAGGAAG +>EAS54_71:3:257:288:731 +AAGAAGATATAACCATCCTACTAAATACATATGCA +>EAS54_71:3:257:288:731 +TGCTGTTTACAAGAAACTCATTAATAAAGACATG +>EAS54_71:3:267:821:860 +GCATACAGTCATCTATAAAGGAAATCCCATCAGA +>EAS54_71:3:267:821:860 +TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG +>EAS54_71:3:78:855:352 +AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT +>EAS54_71:3:78:855:352 +AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC +>EAS54_71:4:127:725:381 +AATTACAAAATATAGTTGAAAGCTCTAACAATAGA +>EAS54_71:4:127:725:381 +TGAACCTATGAGTCACAGGTATTCCTGAGGAAAA +>EAS54_71:4:13:981:659 +CGGGACAATGGACGAGGTAAACCGCACATTGACAA +>EAS54_71:4:13:981:659 +TGTAGCCCCTCTAAGGCGTTCTATTTGTAATGAA +>EAS54_71:4:14:88:306 +AAAGAATGCCAGGAAGATACATTGCAAGACAGAC +>EAS54_71:4:14:88:306 +AGAAGAGATTAGATCTAATTTTTGGACTTCTTAAA +>EAS54_71:4:165:397:25 +GCAACTGTGAGCCATCACAATGAACAACAGGAAGA +>EAS54_71:4:165:397:25 +TTCAACGCTTCTAGCCATTTCTTTTGGCATTTGC +>EAS54_71:4:169:256:888 +AGGTTCAGAACTTGAAGACAAGTCTCTTATGAATT +>EAS54_71:4:169:256:888 +ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT +>EAS54_71:4:169:862:829 +AAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA +>EAS54_71:4:169:862:829 +GCCATTTCTTTTGGCATTTGCCTTCAGACCCTAC +>EAS54_71:4:206:741:810 +ACTAACTATATGCTGTTTACAAGAAACTCATTAA +>EAS54_71:4:206:741:810 +CAAAAGTACAAAACTCACAGGTTTTATAAAACAAT +>EAS54_71:4:209:159:130 +CTTATCATGACTCTATCCCAAATTCCCAATTACGT +>EAS54_71:4:209:159:130 +GCCCCCAGCATGGTTGTACTGGGCAATACATGAG +>EAS54_71:4:233:97:262 +ACCACACATTAATACTATGTTTCTTATCTGCCCA +>EAS54_71:4:233:97:262 +GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA +>EAS54_71:4:252:428:683 +TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCT +>EAS54_71:4:284:269:882 +TTTCTTTTCTCTTTTTTTTTTTTTTGTTTTTGCA +>EAS54_71:4:328:669:662 +GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT +>EAS54_71:4:328:669:662 +TCTTCATCCTGTACCCTGAGAGATTCTGCAGCCCA +>EAS54_71:4:72:63:435 +CCTTGCAACAACCTTGAGAACCCCAGGGAATTTG +>EAS54_71:4:72:63:435 +TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA +>EAS54_71:4:73:182:444 +AACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCG +>EAS54_71:4:73:182:444 +CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTT +>EAS54_71:5:153:543:671 +GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTG +>EAS54_71:5:153:543:671 +TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT +>EAS54_71:5:16:434:204 +AGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC +>EAS54_71:5:16:434:204 +CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT +>EAS54_71:5:81:685:141 +ACTGAACCTATGAGTCACAGGTATTCCTGAGGAA +>EAS54_71:5:81:685:141 +AGATATGTAGTCATCAGACTATCTAAAGTCAACAT +>EAS54_71:6:172:896:83 +AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGT +>EAS54_71:6:172:896:83 +CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA +>EAS54_71:6:215:133:909 +TGTGTGTTCTCATCAACCTCATACACACACATGG +>EAS54_71:6:215:133:909 +TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA +>EAS54_71:6:224:932:942 +CTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGG +>EAS54_71:6:224:932:942 +GTCCATGTACACACGCTGTCCTATGTACTTATCA +>EAS54_71:6:228:354:203 +AATGGACCTGTGATATCTGGATTCTGGGAAATTC +>EAS54_71:6:228:354:203 +TCAACCTCATACACACACATGGTTTAGGGGTATAA +>EAS54_71:6:264:705:89 +AAACATATGCACCTAACACAAGACTACCCAGATTC +>EAS54_71:6:264:705:89 +AAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA +>EAS54_71:6:324:515:230 +AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAG +>EAS54_71:6:324:515:230 +CCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGG +>EAS54_71:6:82:932:400 +GACACCCAACTAATATTTGTCTGAGCAAAACAGTC +>EAS54_71:6:82:932:400 +GTAATCTCTCTCCTCTTCGCTGCATCCCTGTCTT +>EAS54_71:7:130:260:553 +AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA +>EAS54_71:7:130:260:553 +GTGAGAAGTTTGGAAAAACTATTTGAGGAAGCAC +>EAS54_71:7:194:867:616 +ATCCATGTAACAAATCTGCGCTTGTACTTCTATT +>EAS54_71:7:194:867:616 +TTTTCCACTTTGGAAAACAATTTGGTAATTTCGTT +>EAS54_71:7:212:329:348 +AACCACACATTAATACTATGTTTCTTATCTGCAC +>EAS54_71:7:212:329:348 +CCCATCATGAAGCACTGAACTTCCACGTCTCATCT +>EAS54_71:7:250:698:842 +AAAAAGTACAAAACTCACAGGTTTTATAAAACAA +>EAS54_71:7:250:698:842 +AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC +>EAS54_71:7:80:760:490 +CATGGCTGATTATGAAAACAATGTTCCCCAGATAC +>EAS54_71:7:80:760:490 +CTGGACCCTGAGAGATTCTGCAGCCCAGCTCCAG +>EAS54_71:7:97:743:602 +AAGCAAATGCTAAGATAATTCATCATCACTAAACC +>EAS54_71:7:97:743:602 +ATTACAACAGGAACAAAACCTCATATATCAATAT +>EAS54_71:8:105:854:975 +ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC +>EAS54_71:8:105:854:975 +TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTG +>EAS54_71:8:113:856:319 +AAATCAACAACAGTAAAATAAAACAAAGGAGGT +>EAS54_71:8:113:856:319 +CCCACTTAAGAGATATAGATTGGCAGAACAGATTT +>EAS54_71:8:215:830:609 +AAGACATCTAAATGAAAGAGGCTCAAAGAATGC +>EAS54_71:8:234:21:950 +TTTTTTTTTTTTCTCCTCTCTTTTTTTTTTTTT +>EAS54_71:8:321:642:388 +TACCAAATGTGTTTATTACCAGAGGGATGGAGG +>EAS54_71:8:321:642:388 +TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT +>EAS54_71:8:38:856:336 +AATGGACCTGTGATATCTGGATTCTGGGAAATT +>EAS54_71:8:38:856:336 +CACACATGGTTTAGGGGTATAATACCTCTACATGG +>EAS54_73:3:203:419:243 +GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT +>EAS54_73:3:203:419:243 +TTGAAAGCTCTAACAATAGACTAAACCAAGCAGAA +>EAS54_73:3:239:796:221 +ATAACTATGAAGAGACTATTGCCAGCTGACCCCCC +>EAS54_73:3:239:796:221 +GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT +>EAS54_73:3:23:502:103 +AGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTT +>EAS54_73:3:23:502:103 +GACACCCAACTAATATTTGTCTGAGCAAAACAGTC +>EAS54_73:3:29:833:612 +AAGCTCTAACAATAGACTAAACCAAGCAGAAGAAA +>EAS54_73:3:29:833:612 +CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT +>EAS54_73:3:313:827:992 +AAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG +>EAS54_73:3:313:827:992 +TGTTTCTTTGTTTGATTTGGTGGAAGACATAATCC +>EAS54_73:3:37:761:635 +CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT +>EAS54_73:3:37:761:635 +TGTGAGCCATCACAATGAACAACAGGAAGAAAAGG +>EAS54_73:3:4:854:140 +CCTGACAAGCAAATGCTAAGATAATTCATCATCAC +>EAS54_73:3:4:854:140 +GTCATCTATAAAGGAAATCCCATCAGAATAACAAT +>EAS54_73:3:88:24:744 +GTCCTGTGATATCTGGATTCTGGGAAATTCTTCAT +>EAS54_73:3:88:24:744 +TGTCAATGTCAGGGAAGGAGCATTTTTGAAGTTTA +>EAS54_73:5:145:635:390 +TAAACCAGTCCTATAAGAAATGCTCAAAAGAATTG +>EAS54_73:5:145:635:390 +TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA +>EAS54_73:5:169:714:644 +CCTAATTGGTACAATGTACAATATTCTGATGATGG +>EAS54_73:5:169:714:644 +GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG +>EAS54_73:5:220:733:736 +CCATCCTACTAAATACATATGCACCTAACACAAGA +>EAS54_73:5:220:733:736 +TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA +>EAS54_73:5:231:339:551 +CTGAGAGATTCTGCAGCCCAGATCCAGATTGCTTG +>EAS54_73:5:231:339:551 +TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT +>EAS54_73:5:255:796:239 +AAGGGATTAAATTCCCCCACTTAAGAGATAGAGAT +>EAS54_73:5:255:796:239 +ATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGT +>EAS54_73:5:263:557:988 +AATGATAAAAAGATCAATTCAGCAAGAAGATATAA +>EAS54_73:5:263:557:988 +CTGCTACTCAATATATCCATGTAACAAATCTGCGC +>EAS54_73:5:271:874:367 +AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT +>EAS54_73:5:271:874:367 +ATATGTAGTCATCAGACTATCTAAAGTCAACATTA +>EAS54_73:5:3:233:911 +GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC +>EAS54_73:5:3:233:911 +TGGCTGATTATGAAAACAATGTTCCCCAGATACCA +>EAS54_73:5:44:498:945 +ATAGGGATGGAGGGAAGAGGGCCGCTGAAGAACTT +>EAS54_73:5:44:498:945 +CCTATAAGCCGTTCTATTTGTAATGAAAACTATAT +>EAS54_73:5:53:61:31 +AAGAAACTCATTAATAAAGACATGAGTTCAGATAA +>EAS54_73:5:53:61:31 +CAATTCAGCAAGAAGATATAACCATCCTACTAAAT +>EAS54_73:7:134:243:630 +ACATTACTACCCTGCAATTAATATAATTGTGTCCA +>EAS54_73:7:134:243:630 +TCATCTAGGGGAACAGGGAGGCGCACTAATGAGCT +>EAS54_73:7:200:65:291 +CAATACTCACCATCATAAATACACACAAAAGTACA +>EAS54_73:7:200:65:291 +CTAACTATATGCTGTTTACAAGAAACTCATTAATA +>EAS54_73:7:223:440:667 +AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT +>EAS54_73:7:223:440:667 +TTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC +>EAS54_73:7:254:572:431 +AAGAGATATAGATTGGCAGAACAGATTTAAAAACA +>EAS54_73:7:254:572:431 +ATCAGATAAAGCACACTTTAAATCAACAACAGTAA +>EAS54_73:7:63:854:610 +AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT +>EAS54_73:7:63:854:610 +GACTATTGCCAGATGAACCACACATTAATACTATG +>EAS54_73:7:97:892:419 +AATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTA +>EAS54_73:7:97:892:419 +GCAACTAGGTAAAAAATTAACATTACAACAGGAAC +>EAS54_81:2:128:394:455 +GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC +>EAS54_81:2:128:394:455 +TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT +>EAS54_81:2:27:856:401 +ACCTCTACATGGCTGATTATGAAAACAATGTTCCC +>EAS54_81:2:27:856:401 +TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCT +>EAS54_81:2:280:512:316 +GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG +>EAS54_81:2:280:512:316 +TTACTGTCATAACTATGAAGAGACTATTGCCAGCT +>EAS54_81:2:285:367:932 +ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG +>EAS54_81:2:285:367:932 +GCGTAACTGCGCTCTCATTCACTCCAGCTCCCTGT +>EAS54_81:2:317:72:221 +AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC +>EAS54_81:2:317:72:221 +ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC +>EAS54_81:2:31:98:804 +CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGC +>EAS54_81:2:31:98:804 +CTTTACTGTCATAACTATGAAGAGACTATTGCCAG +>EAS54_81:2:49:330:699 +AAAGTTCAATACTCACCATCATAAATACACACAAA +>EAS54_81:2:49:330:699 +TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAA +>EAS54_81:2:5:491:391 +CCCTGCTCACAGTTTCTGCCCCCAGCATGGTTGTA +>EAS54_81:2:5:491:391 +TTGGCATTTGCCTTCAGACCCTACACGAATGCGTC +>EAS54_81:6:11:801:386 +AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA +>EAS54_81:6:11:801:386 +CACTATAAATCAACAACAGTAAAATAAAACAAAGG +>EAS54_81:6:122:589:134 +AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA +>EAS54_81:6:122:589:134 +ACAGACTTCATCAAGATATGTAGTCATCAGACTAT +>EAS54_81:6:199:511:426 +AATTCTTCATCCTGGACCCTGAGAGATTCTGCAGC +>EAS54_81:6:199:511:426 +GGGGTATAATACCTCTACATGGCTGATTATGAAAA +>EAS54_81:6:204:779:181 +AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG +>EAS54_81:6:204:779:181 +CTTTTGGCATTTGCCTTCAGACCCTACACGAATGC +>EAS54_81:6:265:251:147 +AAAAGTACAAAACTCACAGGTTTTATAAAACAATT +>EAS54_81:6:265:251:147 +TGTTATGCCCTGCTAAACTAAGCATCATAAATGAA +>EAS54_81:6:273:424:207 +AAGAGATATAGATTGGCAGAACAGATTTAAAAACA +>EAS54_81:6:273:424:207 +TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC +>EAS54_81:6:35:186:412 +ATAACCATCCTACTAAATACATATGCACCTAACAC +>EAS54_81:6:35:186:412 +CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA +>EAS54_81:6:75:917:886 +ACTGGGCAATACATGAGATTATTAGGAAATGCTTT +>EAS54_81:6:75:917:886 +TTATCATGACTCTATCCCAAATTCCCAATTACGTC +>EAS54_81:7:124:253:889 +CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG +>EAS54_81:7:124:253:889 +TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG +>EAS54_81:7:166:979:531 +ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT +>EAS54_81:7:166:979:531 +TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCC +>EAS54_81:7:226:869:36 +ATATATAAAGGAAATCCCATCAGAATAACAATGGG +>EAS54_81:7:226:869:36 +TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG +>EAS54_81:7:246:205:734 +CTCCAGGGAAGTTATCTCTCATCTAGANNNNNTTG +>EAS54_81:7:246:205:734 +CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT +>EAS54_81:7:293:355:321 +GCTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTC +>EAS54_81:7:293:355:321 +TTACCAAATGTGTTTATTACCAGAGGGATGGAGGG +>EAS54_81:7:324:472:791 +AAAGCCAATACTTTACTGCTACTCAATATATCCAT +>EAS54_81:7:324:472:791 +TGATAAAAAGATCAATTCAGCAAGAAGATATAACC +>EAS54_81:7:325:150:465 +AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG +>EAS54_81:7:325:150:465 +TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC +>EAS54_81:7:74:596:137 +CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT +>EAS54_81:7:74:596:137 +GGTCCCTGCCCCATCGCTTGTAATCTCTCGCCTTT +>EAS54_81:8:130:912:658 +TACACACACATGGTTTAGGGGTATAATACCTCTAC +>EAS54_81:8:130:912:658 +TCCCATCATGAAGCACTGAACTTCCACGTCTCATC +>EAS54_81:8:142:858:903 +ATGGTTGTACTGGGCAATACATGAGATTATTAGGA +>EAS54_81:8:142:858:903 +CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC +>EAS54_81:8:14:360:580 +ACCCTACACGAATGCGTCTCTACCACAGGGGGCGG +>EAS54_81:8:14:360:580 +ATGAGATTATTAGGAAATGCTTTACTGTCATAACT +>EAS54_81:8:159:71:155 +AAAGGTTGTTGGGAGATTTTTAATGATTCCTCGAT +>EAS54_81:8:159:71:155 +GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA +>EAS54_81:8:177:800:714 +CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT +>EAS54_81:8:177:800:714 +TTCTCAGCAGAAACCTTACAAGCCAGAAGAGATTG +>EAS54_81:8:271:180:509 +AATACTCACCATCATAAATACACACAAAAGTACAA +>EAS54_81:8:271:180:509 +ATATAGATTGGCAGAACAGATTTAAAAACATGAAC +>EAS54_81:8:40:925:442 +GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT +>EAS54_81:8:40:925:442 +TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT +>EAS54_81:8:41:530:663 +AGAACAGATTTAAAAACATGAACTAACTATATGCT +>EAS54_81:8:41:530:663 +ATACTCACCATCATAAATACACACAAAATTACAAA +>EAS54_81:8:63:930:152 +ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATTC +>EAS54_81:8:63:930:152 +ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT +>EAS54_81:8:78:735:536 +TTTTTTTTTTTTTCATTTCTCTTTTTTTTTTTTTT +>EAS56_53:1:124:243:35 +GCATATCCAGATTGCTGGTGGTCTGACAGGCAGCA +>EAS56_53:1:124:243:35 +TGTGTTTATTACCAGAGGGATGGAGGGAAGAGCGA +>EAS56_53:1:154:118:488 +AAAAGCATACAGTCATCTATAAAGGAAATCCCATC +>EAS56_53:1:154:118:488 +AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA +>EAS56_53:1:23:403:981 +TACTGTCATAACTATGAAGAGACTATTGCCAGATG +>EAS56_53:1:23:403:981 +TCTTCATAGGGAAGAACAGCTTAGGTATCAATTTG +>EAS56_53:1:47:303:887 +ACATTACTACCCTGCCATTAATATACTTGTGTCCA +>EAS56_53:1:47:303:887 +CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA +>EAS56_53:1:92:875:345 +AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA +>EAS56_53:1:92:875:345 +CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA +>EAS56_53:2:170:265:818 +GAGGGGAAGCTTTCAACGCTTCTAGCACTTTCTTT +>EAS56_53:2:170:265:818 +TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG +>EAS56_53:2:59:286:290 +AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC +>EAS56_53:2:59:286:290 +TCAAGTCTTTCCTGACAAGCAAATGCTAAGATAAT +>EAS56_53:3:101:809:776 +GTACTTCTAAATCTATAAAAAAATTAAAATTTAAC +>EAS56_53:3:101:809:776 +TATGCACCTAACACAAGACTACCCAGATTCATAAA +>EAS56_53:3:107:738:484 +GGTCATCATACAATGATAAAAAGATCAATTCAGCA +>EAS56_53:3:107:738:484 +TGAACTAACTATATGCTGTTTACAAGAAACTCATT +>EAS56_53:3:126:558:408 +TTCTATTTGTAATGAAAACTATATTTATGCTATTC +>EAS56_53:3:126:558:408 +TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT +>EAS56_53:3:134:126:465 +AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA +>EAS56_53:3:134:126:465 +AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA +>EAS56_53:4:130:568:978 +TAAATATAGAAATTGAAACAGCTGTGTTTAGTGAC +>EAS56_53:4:130:568:978 +TGAAACGCGAAACTGCACTCTCATTCACTCCAGCT +>EAS56_53:4:153:977:200 +TCATCAACCTCATACACACACATGGTTTAGGGGTA +>EAS56_53:4:153:977:200 +TGTCACCCAATGGACCTGTGATATCTGGATTCTGG +>EAS56_53:4:154:762:630 +AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT +>EAS56_53:4:154:762:630 +CCTTCAGACCCTACACGAATGCGTCTCTACCACAG +>EAS56_53:4:168:528:288 +CAGGCTGCAACTGTGAGCCATCACAATGAACAACA +>EAS56_53:4:168:528:288 +GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCC +>EAS56_53:4:45:707:147 +AAAAATTCTAAAATCAGCAAGAGAAAAGCATACAG +>EAS56_53:4:45:707:147 +ATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAG +>EAS56_53:6:180:695:621 +ATACAGTCATCTATAAAGGAAATCCCATCAGAATA +>EAS56_53:6:180:695:621 +TACTGAAAAGCAAATGCTAAGATAATTCATCATCA +>EAS56_53:7:22:22:934 +ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA +>EAS56_53:7:22:22:934 +CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG +>EAS56_53:8:122:430:882 +CCTACTAAATACATATGCACCTAACACAAGACTAC +>EAS56_53:8:122:430:882 +CTATAAAAAAATTAAAATTTAACAAAAGTAAATAA +>EAS56_53:8:179:549:753 +TACTACCCTGCAATTAATATAATTGTGTCCATGTA +>EAS56_53:8:179:549:753 +TGTCCTCCCATCTGGCCTCGTCCACACTGGTTCTC +>EAS56_53:8:28:701:724 +TGGACCCTGAGAGATTCTGCAGCCCAGCTCCAGAT +>EAS56_53:8:28:701:724 +TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG +>EAS56_57:1:122:38:103 +ATAAAACAATTAATTGAGACTACAGAGCAACTAGG +>EAS56_57:1:122:38:103 +GAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTAC +>EAS56_57:1:125:884:276 +TTGCAAGACAGACTTCATCAAGATATGTAGTCATC +>EAS56_57:1:125:884:276 +TTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC +>EAS56_57:1:189:130:136 +ATTTAGACATCTAAATGAAAGAGGCTCAAAGAATG +>EAS56_57:1:189:130:136 +GGCTTCTCAGCAGAAACCTTACAAGCCAGAAGAGA +>EAS56_57:1:189:503:110 +ATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGA +>EAS56_57:1:189:503:110 +CTAACAATAGACTAAACCAAGCAGAAGAAAGAGTT +>EAS56_57:1:228:182:717 +GGTCTGACAGGCTGCAACTGTGAGCCATCCCCATG +>EAS56_57:1:228:182:717 +TCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAA +>EAS56_57:1:278:440:902 +AAGCACTGAACTTCCACGTCTCATCTAGGGGAACA +>EAS56_57:1:278:440:902 +ATACTATGTTTCTTATCTGCACATTACTACCCTGC +>EAS56_57:1:288:384:444 +TAACTTTGAATAAAAAGGGATTAAATTCCCCCACT +>EAS56_57:1:288:384:444 +TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA +>EAS56_57:2:158:909:321 +ATACAGTCATCTATAAAGGAAATCCCATCAGAATA +>EAS56_57:2:158:909:321 +TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT +>EAS56_57:2:178:192:499 +GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT +>EAS56_57:2:178:192:499 +TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC +>EAS56_57:2:206:873:186 +ACAATAGACTAAACCAAGCAGAAGAAAGAGGTTCA +>EAS56_57:2:206:873:186 +GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG +>EAS56_57:2:236:841:20 +AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC +>EAS56_57:2:236:841:20 +GCTAAGATAATTCATCATCACTAAACCAGTCCTAT +>EAS56_57:2:237:855:581 +CTAAACGCCCATACTTTACTGCTACTCAATATATC +>EAS56_57:2:237:855:581 +TACAATGATAAAAAGATCAATTCAGCAAGAAGATA +>EAS56_57:2:23:268:529 +TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT +>EAS56_57:2:259:42:969 +GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC +>EAS56_57:2:259:42:969 +GGAAAGGTTGTTGGGAGATTTTTAATGATTCCTCA +>EAS56_57:2:262:297:601 +TGGACCTGTGATATCTGGATTCTGGGAAATTCTTC +>EAS56_57:2:262:297:601 +TGTTCTCATCAACCTCATACACACACATGGTTTAG +>EAS56_57:2:284:597:682 +AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT +>EAS56_57:2:284:597:682 +TTCATCAAGATATGTAGTCATCAGACTATCTAAAG +>EAS56_57:2:44:153:969 +AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA +>EAS56_57:2:44:153:969 +AAAAGCATACAGTCATCTATAAAGGAAATCCCATC +>EAS56_57:3:112:729:591 +ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT +>EAS56_57:3:112:729:591 +GAAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCT +>EAS56_57:3:119:761:239 +CGTCTCTACCACAGGGGGCTGCGCGGTTTCCCATC +>EAS56_57:3:119:761:239 +TGAAGAGACTATTGCCAGATGAACCACACATTAAT +>EAS56_57:3:285:489:327 +AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA +>EAS56_57:3:285:489:327 +CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA +>EAS56_57:3:319:174:811 +CACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATG +>EAS56_57:3:319:174:811 +TTATCTGCACATTTCTACCCTGCAATTAATATAAT +>EAS56_57:3:41:739:907 +CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA +>EAS56_57:3:41:739:907 +GAATGCCAGGAAGATACATTGCAAGACAGACTTCA +>EAS56_57:3:81:786:340 +TACTATGTTTCTTATCTGCACATTACTACCCTGCA +>EAS56_57:3:81:786:340 +TCCACGTCTCATCTAGGGGAACAGAGAGGTGCACT +>EAS56_57:4:233:478:792 +GCCTTCAGACCCTACACGAATGCGTCTCTACCACA +>EAS56_57:4:233:478:792 +GTGTTCTCATCAACCTCATACACACACATGGTTTA +>EAS56_57:4:262:965:756 +AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC +>EAS56_57:4:262:965:756 +TTAATATAATTGTGTCCATGTACACACGCTGTCCT +>EAS56_57:4:71:707:568 +CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG +>EAS56_57:4:71:707:568 +GTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGAT +>EAS56_57:4:98:862:154 +AAAGATCAATTCAGCAAGAAGATATAACCATCCTA +>EAS56_57:4:98:862:154 +TGCTACTCAATATATCCATGTAACAAATCTGCGCT +>EAS56_57:5:105:521:563 +TATGTACTTATCATGACTCTATCCCAAATTCCCAA +>EAS56_57:5:105:521:563 +TGTAATGCTGCCCCTTGGCCATCCCCCGGTCCCTG +>EAS56_57:5:136:389:320 +TCCTATGTACTTATCATGACTCTATCCCAAATTCC +>EAS56_57:5:136:389:320 +TTCTGCCCCCAGCATGGTTGTACTGGGCAATACAT +>EAS56_57:5:145:383:182 +AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT +>EAS56_57:5:145:383:182 +TTGAAGACAAGTCTCTTATGAATTAACCCAGTCAG +>EAS56_57:5:207:926:427 +GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG +>EAS56_57:5:207:926:427 +TAGGAAATGCTTTACTGTCATAACTATGAAGAGAC +>EAS56_57:5:214:644:390 +AAAAACATGAACTAACTATATGCTGTTTACAAGAA +>EAS56_57:5:214:644:390 +AAATAAAACAAAGGAGGTCATGATACAATGATAAA +>EAS56_57:5:24:284:360 +AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA +>EAS56_57:5:24:284:360 +CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA +>EAS56_57:5:266:133:789 +AAAAAATTAACATTACAACAGGAACAAAACCTCAT +>EAS56_57:5:266:133:789 +GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA +>EAS56_57:5:303:542:924 +AATAAAACAAAGGAGGTCATCATACAATGATAAAA +>EAS56_57:5:303:542:924 +CAATGTACAATATTCTGATGATGGTTACACTAAAA +>EAS56_57:5:309:109:987 +AACAAATACTACTAGACCTAAGAGGGATGAGAAAT +>EAS56_57:5:309:109:987 +GAGAGAAGGAGTAGCTATACTTATATCAGATAAAG +>EAS56_57:5:30:788:376 +ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT +>EAS56_57:5:30:788:376 +TGTTTCTTATCTGCACATTACTACCCTGCAATTAA +>EAS56_57:5:324:728:956 +ATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAGT +>EAS56_57:5:324:728:956 +TGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCT +>EAS56_57:5:53:544:889 +AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA +>EAS56_57:5:53:544:889 +GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT +>EAS56_57:5:71:994:576 +AAGATAATTCATCATCACTAAACCAGTCCTATAAG +>EAS56_57:5:71:994:576 +TAGGTAAAAAATTAACATTACAACAGGAACAAAAC +>EAS56_57:6:145:144:796 +ATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTC +>EAS56_57:6:145:144:796 +GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC +>EAS56_57:6:157:643:175 +GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA +>EAS56_57:6:157:643:175 +TTCTATTTGTAATGAAAACTATATTTATGCTATTC +>EAS56_57:6:175:289:351 +CATCCTACTAAATACATATGCACCTAACACAAGAC +>EAS56_57:6:175:289:351 +TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA +>EAS56_57:6:190:289:82 +AGGGGTGCAGAGCCGAGTCACGGGGTTGCCAGCAC +>EAS56_57:6:190:289:82 +CTCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA +>EAS56_57:6:21:553:57 +AAATACTACTAGACCTAAGAGGGATGAGAAATTAC +>EAS56_57:6:21:553:57 +AACAAAAGTAAATAAAACACATAGCTAAAACTAAA +>EAS56_57:6:234:787:12 +AAGCTTGGGCTGTAATGATGCCCCTTGGCCATCAC +>EAS56_57:6:234:787:12 +ACACGCTGGCCTATGTACTTATAATGACTCTATCC +>EAS56_57:6:325:759:288 +GCTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCT +>EAS56_57:6:325:759:288 +GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC +>EAS56_57:6:44:280:641 +AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA +>EAS56_57:6:44:280:641 +TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT +>EAS56_57:6:4:223:776 +AGTAACTGAACCTATGAGTCACAGGTATTCCTGAG +>EAS56_57:6:4:223:776 +TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG +>EAS56_57:7:159:125:297 +GCAAGCTAGAGTCCCATTTGGAGCCACTCTAAGAC +>EAS56_57:7:159:125:297 +GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA +>EAS56_57:7:247:522:670 +CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC +>EAS56_57:7:247:522:670 +TACATGAGATTATTAGGAAATGCTTTACTGTCATA +>EAS56_57:7:273:562:954 +AAAGTTCAATACTCACCATCATAAATACACACAAA +>EAS56_57:7:273:562:954 +TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA +>EAS56_57:7:287:258:321 +TAATACTATGTTTCTTATCTGCACATTACTACCCT +>EAS56_57:7:287:258:321 +TGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCAT +>EAS56_57:7:33:954:724 +CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA +>EAS56_57:7:33:954:724 +TCAGATAAAGCACACTTTAAATCAACAACAGTAAA +>EAS56_57:7:57:826:977 +ATTGGATCTAATTTTTGGACTTCTTAAAGAAAAAA +>EAS56_57:7:57:826:977 +TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT +>EAS56_57:7:76:786:458 +GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC +>EAS56_57:7:76:786:458 +TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT +>EAS56_57:8:72:44:435 +AAAAGCAAAAACAAAAACTATGCTAAGTATTGGTA +>EAS56_57:8:72:44:435 +ATTGGTACAATGTACAATATTCTGATGATGGTTAA +>EAS56_59:1:126:526:276 +GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT +>EAS56_59:1:128:584:952 +ATCATACAATGATAAAAAGATCAATTCAGCAAGAA +>EAS56_59:1:128:584:952 +GCCCATACTTTACTGCTACTCAATATATCCATGTA +>EAS56_59:1:219:294:861 +CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC +>EAS56_59:1:219:294:861 +TATAATTGTGTCCATGTACACACGCTGTCCTCTGT +>EAS56_59:1:248:122:558 +AATGTACAATATTCTGATGATGGTTACACTAAAAG +>EAS56_59:1:248:122:558 +GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA +>EAS56_59:1:278:906:933 +AATATAATTGTGTCCATGTACACACGCTGTCCTAT +>EAS56_59:1:278:906:933 +TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG +>EAS56_59:1:82:670:302 +AGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACG +>EAS56_59:1:82:670:302 +TCCTACTAAATACATATGCACCTAACACAAGACTA +>EAS56_59:1:93:490:901 +AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA +>EAS56_59:1:93:490:901 +GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA +>EAS56_59:2:104:402:732 +AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA +>EAS56_59:2:104:402:732 +AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA +>EAS56_59:2:162:272:415 +ACATGAACTAACTATATGCTGTTTACAAGAAACTC +>EAS56_59:2:162:272:415 +ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT +>EAS56_59:2:177:266:842 +ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT +>EAS56_59:2:177:266:842 +GGCATTTGCCTTCAGACCCTACACGAATGCGTCTC +>EAS56_59:2:177:552:234 +ACGCTGTCCTATGTACTTATCATGACTCTATCCCA +>EAS56_59:2:177:552:234 +GCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC +>EAS56_59:2:201:768:529 +AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT +>EAS56_59:2:201:768:529 +CAGACTATCTAAAGTCAACATGAAGGAAAAAAATT +>EAS56_59:2:239:1001:406 +AGCATACAGTCATCTATAAAGGAAATCCCATCAGA +>EAS56_59:2:239:1001:406 +CTTTCCTGACAAGCAAATGCTAAGATAATTCATCA +>EAS56_59:2:60:677:921 +CATCAGACTATCTAAAGTCAACATGAAGGAAAAAA +>EAS56_59:2:60:677:921 +GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT +>EAS56_59:3:149:953:349 +AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG +>EAS56_59:3:149:953:349 +TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT +>EAS56_59:3:166:626:836 +AGTACAAAACTCACAGGTTTTATAAAACAATTAAT +>EAS56_59:3:166:626:836 +CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA +>EAS56_59:3:182:1002:639 +AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG +>EAS56_59:3:182:1002:639 +AACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGA +>EAS56_59:3:316:25:230 +GATGCCCCTTGGCCATCACCCGGTCCCTGCCCCAT +>EAS56_59:3:316:25:230 +TGTCCTATGTACTTATCATGACTCTATCCCAAATT +>EAS56_59:4:119:651:88 +GATTGGATCTAATTTTTGGACTTCTTAAAGAAAAA +>EAS56_59:4:119:651:88 +GCTCAAAGAATGCCAGGAAGATACATTGCAAGACA +>EAS56_59:4:262:928:237 +TGAGTTCAGGTAAAGGTGTGGAAAAAGATGTTCTA +>EAS56_59:4:262:928:237 +TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA +>EAS56_59:4:267:394:437 +AAACATCATAAATACACACAAAAGTACAAAACTCA +>EAS56_59:4:267:394:437 +GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACG +>EAS56_59:4:278:524:521 +CACATTAATACTATGTTTCTTATCTGCACATTACT +>EAS56_59:4:278:524:521 +CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA +>EAS56_59:4:329:577:757 +AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC +>EAS56_59:4:329:577:757 +TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG +>EAS56_59:5:113:694:725 +CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT +>EAS56_59:5:113:694:725 +GTACACACGCTGTCCTATGTACTTATCATGACTCT +>EAS56_59:5:125:137:58 +AACTATATGCTGTTTACAAGAAACTCATTAATAAA +>EAS56_59:5:125:137:58 +GGTTTTATAAAACAATTAATTGAGACTACAGAGCA +>EAS56_59:5:181:713:140 +AGGGGAAATAAAGTCAAGTATTTCCTGACAAGCAA +>EAS56_59:5:181:713:140 +CTACAGAGCAACAAGGTAAAAAATTAACATTACAA +>EAS56_59:5:198:929:684 +AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA +>EAS56_59:5:198:929:684 +GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA +>EAS56_59:5:232:336:46 +ATTTTTTTTTTTTCTTTTCTCTTGTTTCTTTTTTT +>EAS56_59:5:325:544:349 +AAAATTAAAGTTCAATACTCACCATCATAAATACA +>EAS56_59:5:325:544:349 +CAAGCCAGAAGAGATTGGATCTAATTTTTGGACTT +>EAS56_59:5:90:629:652 +AGCCCATACTTTACTGCTACTCAATATATCCATGT +>EAS56_59:5:90:629:652 +ATATTGCTAGTGGGAGTATAAATTGTTTTCCACTT +>EAS56_59:6:187:925:547 +GGCTGATTATGAAAACAATGTTCCCAAGATACCAT +>EAS56_59:6:187:925:547 +TGAACTTCCACGTCTCATCTAGGGGAACAGGGAGG +>EAS56_59:6:199:327:965 +ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT +>EAS56_59:6:199:327:965 +NCAACAACCTTGAGAACCCCAGGGAATTTGTCAAT +>EAS56_59:6:227:657:95 +GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA +>EAS56_59:6:227:657:95 +GTCATCTATAAAGGAAATCCCATCAGAATAACAAT +>EAS56_59:6:286:753:854 +TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC +>EAS56_59:6:286:753:854 +TTATCATGACTCTATCCCAAATTCCCAATTACGTC +>EAS56_59:6:312:837:406 +AGGTGCACTAATGCGCTCCACGCCCAAGCCCTTCT +>EAS56_59:6:312:837:406 +CTGCACATTACTACCCTGCAATTAATATAATTGTG +>EAS56_59:6:3:186:68 +AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT +>EAS56_59:6:3:186:68 +TTACAAGCCAGAAGAGATTGGATCTAATTTTTGTA +>EAS56_59:6:89:457:591 +ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG +>EAS56_59:6:89:457:591 +CAGGTTTTATAAAACAATTAATTGAGACTACATAG +>EAS56_59:7:260:985:520 +TCCCTGTCACCCAATGGACCTGTGATATCTGGATT +>EAS56_59:7:260:985:520 +TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA +>EAS56_59:7:318:679:883 +GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT +>EAS56_59:7:319:246:304 +CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA +>EAS56_59:7:319:246:304 +TGTCACCCAATGGACCTGTGATATCTGGATTCTGG +>EAS56_59:7:82:902:868 +CTGTCACCCAATGGACCTGTGATATCTGGATTCTG +>EAS56_59:7:82:902:868 +TTGCAACAACCTTGAGAACCCCAGGGAATTTGTCA +>EAS56_59:8:49:182:192 +ACACAAAAGTACAAAACTCACAGGTTTTATAAAAC +>EAS56_59:8:49:182:192 +GTTATGCCCTGCTAAACTGAGCATCATAAATGAAG +>EAS56_59:8:80:542:549 +AGTAAACTCTCAAATATTGCTAGTGGGAGTATAAA +>EAS56_59:8:80:542:549 +CTAAAAGCCCATACTTTACTGCTACTCAATATATC +>EAS56_61:1:119:880:781 +ACAAATCTGCGCTTGTACTTCTAAATCTATAACAA +>EAS56_61:1:119:880:781 +ACATATGCACCTAACACAAGACTACCCAGATTCAT +>EAS56_61:1:210:880:606 +GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAT +>EAS56_61:1:210:880:606 +TCCTGGACCCTGAGAGATTCTGCAGCCCAGCTCCA +>EAS56_61:1:303:184:14 +CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA +>EAS56_61:1:303:184:14 +CAATGGACCTGTGATATCTGGATTCTGGGAAATTC +>EAS56_61:2:152:860:286 +AGACTATTGCCAGATGAACCACACATTAATACTAT +>EAS56_61:2:152:860:286 +TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCA +>EAS56_61:3:140:522:212 +CGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA +>EAS56_61:3:140:522:212 +GACAGGCTGCAACTGTGAGCCATCACAATGAACAA +>EAS56_61:3:165:665:220 +ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA +>EAS56_61:3:165:665:220 +GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG +>EAS56_61:3:208:118:673 +AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA +>EAS56_61:3:208:118:673 +GAACAGAGCTTTCAAGAAGTATGAGATTATGTAAA +>EAS56_61:3:260:827:289 +AAACCTCATATATCAATATTAACTTTGAATAAAAA +>EAS56_61:3:260:827:289 +TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA +>EAS56_61:3:45:758:616 +ATAAATTGTTTTCCACTTTGGAAAACAATTTGGTA +>EAS56_61:3:45:758:616 +CATACTTTACTGCTACTCAATATATCCATGTAACA +>EAS56_61:3:5:45:441 +TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT +>EAS56_61:4:262:456:74 +TACCAAATGTGTTTATTACCAGAGGGATGGAGGGA +>EAS56_61:4:262:456:74 +TGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT +>EAS56_61:5:194:470:416 +AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT +>EAS56_61:5:194:470:416 +TCAGAACTTGAAGACAAGTCTCTTATGAATTAACC +>EAS56_61:5:209:824:866 +ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA +>EAS56_61:5:209:824:866 +CAGCAACAAAACCTCATATATCAATATTAACTTTG +>EAS56_61:5:263:314:696 +AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG +>EAS56_61:5:263:314:696 +AAGATCAATTCAGCAAGAAGATATAACCATCCTAC +>EAS56_61:5:272:240:950 +CAGCAGAGCTTGGATCTAATTTTTGGACTTCTTCA +>EAS56_61:5:272:240:950 +TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA +>EAS56_61:6:10:106:737 +ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT +>EAS56_61:6:10:106:737 +ACAATGATAAAAAGATCAATTCAGCAAGAAGATAT +>EAS56_61:6:160:272:398 +AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA +>EAS56_61:6:160:272:398 +GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA +>EAS56_61:6:226:370:91 +AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA +>EAS56_61:6:226:370:91 +AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA +>EAS56_61:6:227:259:597 +AATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT +>EAS56_61:6:256:67:461 +TCATGTTTGTGTCTTTCTATGCATTTTTTTTTTTT +>EAS56_61:6:256:67:461 +TTGTTTTTTCTTCTTTTCTCTTTTTTTTTTTTTTT +>EAS56_61:6:283:963:234 +AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG +>EAS56_61:6:283:963:234 +ACATATGCACCTAACACAAGACTACCCAGATTCAT +>EAS56_61:6:307:208:477 +AAAGTCAAAATTAAAGTTCAATACTCACCATCATA +>EAS56_61:6:307:208:477 +ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA +>EAS56_61:7:280:133:495 +AGATGAACCACACATTAATACTATGTTTCTTATCT +>EAS56_61:7:280:133:495 +CCATCATGAAGCACTGAACTTCCACGTCTCATCTA +>EAS56_61:7:41:745:603 +CATTGCAAGACAGACTTCATCAAGATATGTAGTCA +>EAS56_61:7:41:745:603 +TAATTTTTGGACTTCTTAAAGAAAAAAAAACCTGT +>EAS56_61:7:7:682:201 +CATACAGTCATCTATAAAGGAAATCCCATCAGAAT +>EAS56_61:7:7:682:201 +GGAAAACCTCTTTAGTCTTGCTAGAGATTTAGACA +>EAS56_61:8:60:358:494 +GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACA +>EAS56_61:8:60:358:494 +TACCCAGATTCATAAAACAAATACTACTAGACCTA +>EAS56_61:8:7:171:402 +GTGATATCTGGATTCTGGGAAATTCTTCATCCTGG +>EAS56_61:8:7:171:402 +TCTACATGGCTGATTATGAAAACAATGTTCCCCAG +>EAS56_63:1:119:446:185 +TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT +>EAS56_63:1:119:446:185 +TTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAG +>EAS56_63:1:145:71:26 +CTAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC +>EAS56_63:1:145:71:26 +TTTCTTATCTGCACATTACTACCCTGCAATTAATA +>EAS56_63:2:119:161:322 +ATCAGAATAACAATGGGCTTCTCAGCAGAAACCTT +>EAS56_63:2:119:161:322 +CTTTAGTCTTGCTAGAGATTTAGACATCTAAATGA +>EAS56_63:2:33:357:858 +AAAATTAAAGTTCAATACTCACCATCATAAATACA +>EAS56_63:2:33:357:858 +AGGGATTAAATTCCCCCACTTAAGAGATATAGATT +>EAS56_63:2:74:656:272 +AACAAAGGAGGTCATCATACAATGATAAAAAGATC +>EAS56_63:2:74:656:272 +TGTACAATATTCTGATGATGGTTACACTAAAAGCC +>EAS56_63:3:40:594:752 +ATACACACACATGGTTTAGGGGTATAATACCTCTA +>EAS56_63:3:40:594:752 +CTGCGCGGTTTCCCATCATGAAGCACTGAACTTCC +>EAS56_63:3:41:468:459 +AAATTTAACAAAAGTAAATAAAACACATAGCTAAA +>EAS56_63:3:41:468:459 +TTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTT +>EAS56_63:3:93:1002:845 +AATTCCCAATTACGTCCTATCTTCTTCTTAGGGAA +>EAS56_63:3:93:1002:845 +GGGCAATACATGAGATTATTAGGAAATGCTTTACT +>EAS56_63:4:141:9:811 +TTTCTTTTCTCCTTTTTTTTTTTTTTTTTCTACAT +>EAS56_63:4:184:659:377 +AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG +>EAS56_63:4:184:659:377 +CAAAACTACCCAGATTCATAAAACAAATACTACTA +>EAS56_63:4:38:28:122 +AAATATAGTTGAAAGCTCTAACAATAGACTAAACC +>EAS56_63:4:38:28:122 +GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG +>EAS56_63:5:117:570:971 +ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG +>EAS56_63:5:117:570:971 +ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA +>EAS56_63:5:123:998:248 +ATCACAATGAACAACAGGAAGAAAAGGTCTTTCAA +>EAS56_63:5:123:998:248 +TTTCTTTTGGCATTTGCCTTCAGACCCTACACGAA +>EAS56_63:5:36:678:316 +ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA +>EAS56_63:5:36:678:316 +TTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTTA +>EAS56_63:5:96:788:614 +TAGGGGTATAATACCTCTACATGGCTGATTATGAA +>EAS56_63:5:96:788:614 +TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC +>EAS56_63:6:102:816:260 +AAATTACCTAATTGGTACAATGTACAATATTCTGA +>EAS56_63:6:102:816:260 +TCAGATAAAGCACACTTTAAATCAACAACAGTAAA +>EAS56_63:6:42:920:522 +AATTAATATAATTGTGTCCATGTACACACGCTGTT +>EAS56_63:6:42:920:522 +CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC +>EAS56_63:6:91:360:585 +AAGATGAAACGCGTAACTGCGCTCTCATTCACTCC +>EAS56_63:6:91:360:585 +GACATCACAATGAACAACAGGAAGAAAAGGTCTTT +>EAS56_63:7:109:22:383 +ATGTACAATATTCTGATGATGGTTACACTAAAAGC +>EAS56_63:7:109:22:383 +CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT +>EAS56_63:7:137:139:248 +GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC +>EAS56_63:7:137:139:248 +TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA +>EAS56_63:7:166:42:147 +AATGCGCTCCACGCCCAAGCCCTTCTAACAGTTTC +>EAS56_63:7:166:42:147 +CTGCACATTACTACCCTGCAATTAATATAATTGTG +>EAS56_63:7:185:213:330 +CAATGTCAGGGAAGGAGCATTTTGTCAGTTACCAA +>EAS56_63:7:185:213:330 +TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT +>EAS56_63:7:190:95:706 +TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG +>EAS56_63:7:190:95:706 +TTGTGTCCATGTACACACGCTGTCCTATGTACTTA +>EAS56_63:7:34:334:825 +CATTTAAGAAATTACAAAATATAGTTGAAAGCTCT +>EAS56_63:8:138:186:459 +CATTGCAAGACAGACTTCATCAAGATATGTAGTCA +>EAS56_63:8:138:186:459 +GCCAGAAGAGATTGGAGCTAATTTTTGGACTTCTT +>EAS56_63:8:150:508:757 +ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT +>EAS56_63:8:150:508:757 +CTTGACACCCAACTAATATTTGTCTGAGCAAAACA +>EAS56_63:8:4:571:820 +AAGAGATATAGATTGGCAGAACAGATTTAAAAACA +>EAS56_63:8:4:571:820 +CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT +>EAS56_63:8:62:125:888 +CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA +>EAS56_63:8:62:125:888 +TGCCAGGAAGATACATTGCAAGACAGACTTCATCA +>EAS56_65:1:163:846:223 +CCAGCTCCCTGTCACCCAATGGACCTGTGATATCT +>EAS56_65:1:163:846:223 +GCCTTTGTTCACATAGACCCCCTTGCAACAACCTT +>EAS56_65:1:178:305:843 +ATGTTTCTTATCTGCACATTACTACCCTGCAATTA +>EAS56_65:1:178:305:843 +CCACGTCTCATCTAGGGGAACAGGGAGGTGCACTA +>EAS56_65:1:23:536:229 +AAAGCATACAGTCATCTATAAAGGAAATCCCATCA +>EAS56_65:1:23:536:229 +AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA +>EAS56_65:1:53:272:944 +CAACCCCCTTGCAACAACCTTGCGAACCCCAGGGA +>EAS56_65:1:53:272:944 +TGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAA +>EAS56_65:2:224:579:433 +ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC +>EAS56_65:2:224:579:433 +TTCATCATCACTAAACCAGTCCTATAAGAAATGCT +>EAS56_65:2:56:155:49 +ATCCTACTAAATACATATGCACCTAACACAAGACT +>EAS56_65:2:56:155:49 +ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT +>EAS56_65:3:168:741:680 +AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC +>EAS56_65:3:168:741:680 +TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT +>EAS56_65:3:47:64:359 +TTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTTT +>EAS56_65:4:124:367:72 +AGACTACCCAGATTCATAAAACAAATACTACTAGA +>EAS56_65:4:124:367:72 +CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA +>EAS56_65:4:126:966:514 +AGAAGAAGTAGCTATACTTATATCAGATAAAGCAC +>EAS56_65:4:126:966:514 +TAAAAAGGGATTAAATTCCCCCACTTAAGAGATAT +>EAS56_65:4:150:94:843 +AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA +>EAS56_65:4:150:94:843 +CAGATACATCCCACTTTAAATCAACCACAGTAAAA +>EAS56_65:4:296:78:421 +TCTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTT +>EAS56_65:4:296:78:421 +TGTTGGTGTTCGTTTTTTCTCCTGTTTCTTTTTCT +>EAS56_65:5:121:380:656 +AATGTGTTTATTACCAGAGGGATGGAGGGAAGAGG +>EAS56_65:5:121:380:656 +GCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTG +>EAS56_65:5:131:742:561 +TCAAAAGGTGATGTGTGTTCTCATCAACCTCATAC +>EAS56_65:5:131:742:561 +TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC +>EAS56_65:5:211:84:84 +CTATTTGAGGAAGTAATTGGGGAAAACCTCTTTAG +>EAS56_65:5:211:84:84 +GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA +>EAS56_65:5:262:53:888 +AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT +>EAS56_65:5:262:53:888 +TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA +>EAS56_65:5:278:848:765 +GTACACACGCTGTCCTATGTACTTATCATGACTCT +>EAS56_65:5:278:848:765 +TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG +>EAS56_65:5:299:336:613 +ATCCTACTAAATACATATGCACCTAACACAAGACT +>EAS56_65:5:299:336:613 +TACTCAATATATCCATGTAACAAATCTGCGCTTGT +>EAS56_65:5:30:92:753 +TATAATACCTCTACATGGCTGATTATGAAAACAAT +>EAS56_65:5:30:92:753 +TGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG +>EAS56_65:5:312:985:871 +ATAAAACACATAGCTAAAACTAAAAAAGCAAAAAC +>EAS56_65:5:312:985:871 +TAAGAGGGATGAGAAATTACCTAATTGGTACAATG +>EAS56_65:5:37:611:267 +AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA +>EAS56_65:5:37:611:267 +TATAAAGGAAATCCCATAAGAATAACAATGGGCTT +>EAS56_65:5:75:637:650 +CTGATTATGAAAACAATGTTCCCCAGATACCATCC +>EAS56_65:5:75:637:650 +GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC +>EAS56_65:6:197:759:975 +AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA +>EAS56_65:6:197:759:975 +AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC +>EAS56_65:6:37:610:260 +CAAGCCCTTCTCACAGTTTCTGCCCCCAGCATGGT +>EAS56_65:6:37:610:260 +CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC +>EAS56_65:6:46:173:214 +AACAATGGGCTTCTCAGCAGAAACCTTACAAGCCA +>EAS56_65:6:46:173:214 +CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA +>EAS56_65:6:66:257:524 +ATACATGAGATTATTAGGAAATGCTTTACTGTCAT +>EAS56_65:6:66:257:524 +GCCTTCAGACCCTACACGAATGCGTCTCTACCACC +>EAS56_65:6:67:800:450 +TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA +>EAS56_65:6:67:800:450 +TTACAAAATATAGTTGAAAGCTCTAACAATAGACT +>EAS56_65:6:82:822:767 +AACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA +>EAS56_65:6:82:822:767 +TTAGGAAATGCTTTACTGTCATAACTATGAAGAGA +>EAS56_65:7:118:775:467 +AACAGTAAAATAAAACAAAGGAGGTCATCATACAA +>EAS56_65:7:118:775:467 +TGTACAATATTCTGATGATGGTTACACTAAAAGCC +>EAS56_65:7:122:398:994 +GGGATTAAATTCCCCCACTTAAGAGATATAGATTG +>EAS56_65:7:122:398:994 +TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA +>EAS56_65:7:219:40:833 +CCCATACTTTACTGCTACTCAATATATCCATGTAA +>EAS56_65:7:219:40:833 +GGAGGTCATCATACAATGATAAAAAGATCAATTCA +>EAS56_65:7:288:552:440 +AGAGGGAACGCTTTCAACTCTTCTAGCCATTTCTT +>EAS56_65:7:288:552:440 +TGTGGTCTGACAGGCTGCAACTGTGAGCCTTCCAT +>EAS56_65:7:67:692:110 +ATTGCCAGATGAACCACACATTAATACTATGTTTC +>EAS56_65:7:67:692:110 +GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA +>EAS56_65:8:117:156:84 +GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA +>EAS56_65:8:117:156:84 +TGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAG +>EAS56_65:8:206:563:262 +ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT +>EAS56_65:8:206:563:262 +ATTAGGAAATGCTTTACTGTCATAACTATGAAGAG +>EAS56_65:8:218:173:667 +CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC +>EAS56_65:8:218:173:667 +TAATGATTCCTCAATGTTAAAATGTCTATTTTTGT +>EAS56_65:8:24:415:944 +GTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC +>EAS56_65:8:24:415:944 +TAGGTAAAAAATTAACATTACAACAGGAACAAAAC +>EAS56_65:8:275:851:240 +CCCCAGAGGGAAAGCTTTCAACGTTTCTAGCCATT +>EAS56_65:8:275:851:240 +GTGGTCTGACAGGCTGCAACTGTGAGCCATCACAA +>EAS56_65:8:317:83:500 +TTTTTTTTTTTTCTTTTCTCCTTTTTTTTTTGTTT +>EAS56_65:8:64:507:478 +TAATTGAAAAATTCATTTAAGAAATTACAAAATAT diff --git a/tests/pysam_data/faidx_ex1.fq b/tests/pysam_data/faidx_ex1.fq new file mode 100644 index 0000000..92801c3 --- /dev/null +++ b/tests/pysam_data/faidx_ex1.fq @@ -0,0 +1,13080 @@ +@B7_589:1:101:825:28 +GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC ++ +<<86<<;<78<<<)<;4<67<;<;<74-7;,;8,; +@B7_589:1:101:825:28 +TGTGTCCATGTACACACGCTGTCCTATGTACTTAT ++ +0;0'0;<<<<<<8<;<<<<;;3<<;;<<<8<<<<< +@B7_589:1:110:543:934 +AAGAATTGTAAAAGTCAAAATTAAAGTTCAATACT ++ +<<<<<5<<;<<<<<<;<<<<<<<<<<<;<<<<<<< +@B7_589:1:110:543:934 +ACAAGCCAGAAGAGATTGGATCTAATTTTTGGACT ++ +<<<<<<<<<<<<;<<<<<;;<<<;;<<<<<,,;<< +@B7_589:1:122:337:968 +ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT ++ +<<<<<;<<<<<<<<<<<<<<<<<<<;<<;;<;;;; +@B7_589:1:122:337:968 +GCTTTACTGTCTAAACTATGAAGAGACTATTGCCA ++ +%454<75!7<+!990<9<6<<<<6<<<< +@B7_597:6:29:249:878 +TCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGG ++ +<<<<<<<<<<<<<<<<<<<<<<:<:<<=<<:<<6& +@B7_597:6:73:420:812 +CTAAGTATTGGTAAAGATGTGGGGAAAAAAGTAAA ++ +5'<<<,<&,<<,<<<<<7<<<<<<<<<<<<<<<<< +@B7_597:6:73:420:812 +CTAATTGGTACAATGTACAATATTCTGATGATGGT ++ +<<<<<1<<<<::1<7<:<96<9<:<<:4<70:11< +@B7_597:7:103:731:697 +AATTAACCCAGTCAGACAAAAATAAAGAAAAAAGA ++ +<<<<<<<<<<<<<<<<<<:<:<<6<<<<<<<:<;: +@B7_597:7:103:731:697 +CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC ++ +:::;3:<<<<<<<:<<<<<<:<<<<<<<<<<<<<< +@B7_597:7:113:408:211 +AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG ++ +<:;:;:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@B7_597:7:113:408:211 +GAGACTACAGAGCAACTAGGTAAAAAATTAACATT ++ +<<<<<<<<<<<<<<<:&<<<&:<<<<<<<<<<;:/ +@B7_597:7:31:948:254 +CCTCTACATGGCTGATTATGAAAACAATGTTCCCC ++ +<<<<<<<<<<<<<<<<<<<;<<<<<:<<8<;;;;< +@B7_597:7:31:948:254 +TGAAGCACTGAACTTCCACGTCTCATCTAGGGGAA ++ +7;;;98<<7<<<<<<<<<<<<<<<<<<8<<<<<<< +@B7_597:7:41:34:211 +CACCTAACACAAGACTACCCAGATTCATAAAACAA ++ +7<<<<<<<<<<<<<<<< +@B7_610:5:136:260:254 +GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA ++ +;:;;<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<< +@B7_610:5:147:68:353 +AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT ++ +<;<;<<7<<<<<<<7<<;;<7<4<8<<<8.;4;;; +@B7_610:5:147:68:353 +CCTTTGATATCTGGATTCTGGGAAATTCTTCATCC ++ +<<;;<<<<<<<<+;<<;<<0;<<<<;<<<<<<<<< +@B7_610:5:51:904:391 +ACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA ++ +<<<<<<<<<<<<<<<<<;<<<<<;:;<2<6;;;;; +@B7_610:5:51:904:391 +TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA ++ +;<96<<<<<<7<<7<<<<<<<<<<<<<<;<<<<<< +@B7_610:5:7:761:623 +CCGGCATGGTTGTACTGGGCAATACATGAGATTAT ++ +::';-8);<<<<;<1<<<<:<<<<<<<<<<<<<<< +@B7_610:5:7:761:623 +CTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTG ++ +<<<<<<<<<<<<<8<<<<;;<0<<<<<;;<;<;;& +@B7_610:6:107:252:533 +AGAGAAGGAGTAGCTATACTTATATCAGATAAAGC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9 +@B7_610:6:107:252:533 +CAAGACTACCCAGATTCATAAAACAAATACTACTA ++ +3<<<<+<<96<<<<<<;<<<<<<;<<<<<<<<<<< +@B7_610:6:111:379:700 +ACACTAAAAGCCCATACTTTACTGCTACTCAATAT ++ +7<<:<<<<02<<6&<==>=>=>=>>>==>>>=>>> +@EAS114_26:2:130:609:467 +CAATACTCACCATCATAAATACACACAAAAGTACA ++ +==8=====;==8==;=4=;;8=====;6=177.== +@EAS114_26:2:214:950:32 +ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT ++ +>>=>>>>==>=>>>==>=>=:=====;=:=6:::6 +@EAS114_26:2:214:950:32 +AGAAGATATAACCATCCTACTAAATACATATGCAC ++ +=&==4======:;==6<==:=============== +@EAS114_26:2:237:497:165 +GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC ++ +9=:=======2=27======<>&<=,==4>4=>>= +@EAS114_26:2:237:497:165 +TACAGTCATCTATAAAGGAAATCCCATCAGAATAA ++ +8===<8===========37=<===7=;7=8===== +@EAS114_26:2:315:219:7 +GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG ++ +7==::<2=8<<<=====>888<=2=>==>,>,>>8 +@EAS114_26:2:329:458:365 +GTGTTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGT ++ +==========================9======== +@EAS114_26:2:329:458:365 +TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG ++ +====:==9========>==7>==9>=7=>=>>=>> +@EAS114_26:2:73:513:102 +GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC ++ +==::===8=>=====>=>=>>>=>>==>=>>>>>> +@EAS114_26:2:73:513:102 +TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT ++ +===========================;======= +@EAS114_26:3:117:284:589 +ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA ++ +==================================0 +@EAS114_26:3:117:284:589 +GAACCTATGAGTCACAGGTATTCCTGAGGAAAAAG ++ +==8==;==================;========== +@EAS114_26:3:284:261:124 +ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ++ +===27===.====&===========;;======== +@EAS114_26:3:287:665:495 +GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA ++ +===,9=;;====7=====5===;==1========= +@EAS114_26:3:287:665:495 +TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA ++ +==========================98====8=8 +@EAS114_26:4:100:238:596 +ATGAGAAATTACCTAATTGGTACAATGTACAATAT ++ +======9=====;=======5===;====/=;=== +@EAS114_26:4:100:238:596 +CAAAAACTATTCTAAGTATTGGTAAAGATGTGGGG ++ +4<<<<;<3<3&<3<1<5<31<<3<<<<<<2<<;<, +@EAS114_26:4:110:840:431 +CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA ++ +77<;7<<<<<<<<<4<<<<<<<:<<<<<<<<<<<< +@EAS114_26:4:110:840:431 +GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA ++ +=====================5:======54=+3+ +@EAS114_26:4:123:1001:580 +AGGTTTTATAAAACAATTAATTGAGACTACAGAGC ++ +<.00..3<6<<<<<<<3;<<08<<<<<6<<<<<<< +@EAS114_26:4:123:1001:580 +GGGAANTAAAGTCAAGTCTTTCCTGACAAGCAAAT ++ +=====!=====================1.8131*= +@EAS114_26:4:253:285:104 +CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA ++ +======================:========7==; +@EAS114_26:4:253:285:104 +GTGATGTGTGTTCTCATCAACCTCATACACACACA ++ +2<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS114_26:4:306:388:342 +CCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT ++ +================5====:=====;==1=4== +@EAS114_26:4:306:388:342 +GGGGAAGACATAATCCCACGCTTCCTATGGAAAGG ++ +9/<9;<<<;<;<<7<<<7<<<<<<<<<<<<<<<<< +@EAS114_26:4:40:352:151 +ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT ++ +<<<<<<<<<<<<<<<;<<9<<<<:<<<<;<99<3< +@EAS114_26:4:40:352:151 +TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ++ +;=;;5=:-=9=====;;================== +@EAS114_26:5:139:331:63 +GACACCCAACTAATATTTGTCTGAGCAAAACAGTC ++ +7===================:=:============ +@EAS114_26:5:139:331:63 +TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ++ +====================<<============= +@EAS114_26:5:228:189:826 +AAGCCCTTCTCACAGTTTCTGCCCCCCGCATGGTT ++ +;9=========;=1======9=====1;=<3=:6; +@EAS114_26:5:228:189:826 +ATCATGACTCTATCCCAAATTCCCAATTACGTCCT ++ +:74=:.==1========================== +@EAS114_26:5:238:31:968 +ACACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG ++ +=(.7=5%===9:7==+==77=============== +@EAS114_26:5:238:31:968 +ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTG ++ +9======8====*=====,=1=======<=7:::, +@EAS114_26:5:43:114:617 +AATCATAAATACACACAAAAGTACAAAACTCACAG ++ ++=22=6=================9=========== +@EAS114_26:5:43:114:617 +AATGTTATGCCCTGCTAAACTAAGCATCATAAATG ++ +=============;=========;=========== +@EAS114_26:6:129:694:359 +CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT ++ +7777<7<7;77+<3<<;<<;<<<<;<<<<<<<<<< +@EAS114_26:6:129:694:359 +TGTCAGTTACCAAATGTGTTTATTACCCGAGGGAT ++ +============+7=======:==;;;'=;==7;= +@EAS114_26:6:140:253:322 +AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC ++ +<<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;<<; +@EAS114_26:6:140:253:322 +GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA ++ +=;===;54:====================>>===> +@EAS114_26:6:183:697:555 +AAAGAATGCCAGGAAGATACATTGCCAGACAGACT ++ +=====================:===&==:;==5;; +@EAS114_26:6:183:697:555 +AGAAATCTTAGAAGCCAGAAGAGATTGGATCTAAT ++ +<<<;&,.;);&96<84<<81<<&<<<9<<8<8<<1 +@EAS114_26:6:46:13:880 +AAAACCTCTTTAGTCTTGCTAGAGATTTAGACATC ++ +<<<<<<<<<<<<<<<<<<<<;<7<3<<<9<+;;<9 +@EAS114_26:6:46:13:880 +AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA ++ +=&====8==========0================= +@EAS114_26:7:13:172:720 +AATTCATTTAAGAAATTACAAAATATAGTTGAAAG ++ +============:3<==:====<=9=3===;==83 +@EAS114_26:7:157:876:302 +AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA ++ +===:=8=;==:892=,28==88==28====8=;;8 +@EAS114_26:7:157:876:302 +CAACTAGGTAAAAAATTAACATTACAACACGAACA ++ +2<<;<<<22<<<<<<77<<<<22<7<<<<%-<<1< +@EAS114_26:7:218:858:445 +AAAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT ++ +;===5=;=======;==3======9;,79==;=== +@EAS114_26:7:218:858:445 +GAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATA ++ +;<<<<<<<8;:<<<<<<;<<:<<<<<<<<<<<<;< +@EAS114_26:7:245:323:744 +ACCTCTACATGGCTGATTATGAAAACAATGTTCCC ++ +/.848299;&;9;9;=2.=7========;;===== +@EAS114_26:7:245:323:744 +GATTCTGGGAAATTCTTCATCCTGGACCCTGAGAG ++ +<;<<<<<<<<<<<<<<<<<<<<<;<+<<<<<<<4< +@EAS114_26:7:37:79:581 +TTAAAATTTAAAAAAAGTAAATAAAACACATAGCT ++ +<>4<>>>>;>>&>->9>9;4>->>>>,4>9>,<1> +@EAS114_26:7:37:79:581 +TTTTTTTTTTTTTTTTTTTTTTTCATGCCAGAAAA ++ +3,,,===6===<===<;=====-============ +@EAS114_26:7:86:308:648 +GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG ++ +<7<<<;<<<<+;<<<2<5<<<77;<<2<;;<<<<< +@EAS114_26:7:86:308:648 +TATTAGGAAATGCTTTACTGTCATAACTATGAAGA ++ +=8=====;=8======;=======35==;=;.;25 +@EAS114_28:1:144:242:602 +ATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG ++ +========================;=====<;;<<; +@EAS114_28:1:144:242:602 +ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS114_28:1:168:389:889 +GAAATTACAAAATATAGTTGAAAGCTCTAACAATAG ++ +<<<<<<<<<<<<<<<<<<<<;<<<<<<<;9;;<<<< +@EAS114_28:1:168:389:889 +TAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA ++ +;<<;;56;==================8========8 +@EAS114_28:1:168:609:646 +GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG ++ +;;<<<<=======;;:;======;==<========= +@EAS114_28:1:168:609:646 +GGTTACACTAAAAGCCCATACTTTACTGCTACTCAA ++ +<<<<<<<<<<<;<<<<<:<8<<<<;<<<<<4<<<9< +@EAS114_28:1:220:801:282 +AACCTCATATATCAATATTAACTTTGAATAAAAAGG ++ +;7;87;===;==;====:===<==7=========== +@EAS114_28:1:220:801:282 +AATTCATCATCACTAAACCAGTCCTATAAGAAATGC ++ +<<<<<<<<<<<<<<<<<<<<<;<+<;<<<<<::<<: +@EAS114_28:1:232:351:909 +ACATGGCTGATTATGAAATCAATGTTCCCCAGATGC ++ +<<<<<99<<<<<<99<7<'<9<<<6<<+<;7;<<&; +@EAS114_28:1:232:351:909 +CCATCATGAAGCGCTGAACTTCCACGTCTCATCTAG ++ +:8%3<8====130=8==+===;=3=8===48==;3* +@EAS114_28:1:28:708:463 +CCCAATGGACCTGTGATATCTGGATTCTGGGAAATT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;<:<< +@EAS114_28:1:28:708:463 +GTATAATACCTCTACATGGCTGATTATGAAAACAAT ++ +;;<;<<====3=====5=================== +@EAS114_28:2:114:938:216 +CTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4; +@EAS114_28:2:114:938:216 +GAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGA ++ +<<<<7<6<<<<<<<6<<<<<<<<<<<<<<<<<<<<< +@EAS114_28:2:141:7:963 +CACTTTAAATCAACAACAGTAAAATAAAACAAAGGA ++ +<<<<<<<<<<<<;<:<<<<<<1<<&<;<;<<;,<;5 +@EAS114_28:2:141:7:963 +TACAATGTACAATATTCTGATGATGGTTACACTAAA ++ +95+<<9<<5<;;<<;<<;'<<<<<;<<<7<9<<<<< +@EAS114_28:2:149:650:44 +CGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC ++ +;8<<7><>;>+>>/;>>=>=>=:>><>=<<==;)<=8; +@EAS114_28:4:149:572:877 +GAGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA ++ +6<94693<;<<<<;;<<<<<<<<<<;9<<<<<<<<< +@EAS114_28:4:215:246:640 +AAAAGCATACAGTCATCTATAAAGGAAATCCCATCA ++ +<<<<<<<<<<9<;<<<<<<<<<<9;<<<<<<3;<;3 +@EAS114_28:4:215:246:640 +AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ++ +;<<,<<<96<<:<:<9<6<97<<<<<9<<<<9<<9< +@EAS114_28:4:305:707:258 +AAAAAGATGTTCTACGCAAGCAGAAACCAAATGAGA ++ +3<<7<,;<<<<0<66<6+<%<<<.<<<<<<<<<9<< +@EAS114_28:4:305:707:258 +GAACAAAACCTCATATATCAATATTAACTTTGAATA ++ +9<<<<<<<<<<<<;<<-<<;;<;<<9<<;<<+99;7 +@EAS114_28:4:322:631:245 +CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC ++ +<<<<<<<<<<<<<<<<<0<<<<<<<<<<<<<<<<5; +@EAS114_28:4:322:631:245 +TATTTTTGTCTTGACACCCAACTAATATTTGTCTGA ++ +<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<< +@EAS114_28:4:9:55:730 +ATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGC ++ +<:<;;<6<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS114_28:4:9:55:730 +CAGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT ++ +>>=>>+==>>==<==<=8=><:;8/;7<<<<<<<<<<<<<< +@EAS114_45:6:37:156:134 +GGAAAAACTATTTGAGGAAGTAATTGGGGAAAACC ++ +;;;;;;;;;;9;;;;;;;;;;;;;;;9;;;77679 +@EAS114_45:6:39:956:676 +TAAAACAAATACTACTAGACCTAAGAGGGATGAGA ++ +899985;;<;:9;;:9<;:9:5;<;;;<;<;<<<< +@EAS114_45:6:39:956:676 +TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA ++ +;;;;;;;;;;;;9;;;;;;;;;;;;;;;9957777 +@EAS114_45:6:44:77:1255 +CTCATTAATAAAGACATGAGTTCAGGTAAAGGGGT ++ +;;;;;;;8;;;7;8;;;;;;;;;;886;;;76777 +@EAS114_45:6:44:77:1255 +TAAAAAGATCAATTCAGCAAGAAGATATAACCATC ++ +79998;;;9:;<696<;.<;;<<;<;<;<;;;<8; +@EAS114_45:6:45:1769:1130 +ACCCAATGGACCTGTGATATCTGGATTCTGGGAAA ++ +;;;;;;;;;;;;9;;;;;;19;;;9;;;;176777 +@EAS114_45:6:45:1769:1130 +TGTTCTCATCAACCTCATACACACACATGGTTTAG ++ +88989;<;97;9<<;<;;;;9<98<<<<<<<;<<< +@EAS114_45:6:47:1791:444 +AAGAGGGATGAGAAATTACCTAATTGGTACAATGT ++ +978879;:;;<:;;<<;:<9<<<<;6;;;;<<<<; +@EAS114_45:6:47:1791:444 +TACTTATATCAGATAAAGCACACTTTAAATCAACA ++ +;3;;;;;;;;;;;;;;;;;;;;;;;;;;;877977 +@EAS114_45:6:59:1548:1096 +CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG ++ +88888;;88;;;;8;;9;;;<<<<<<<<<<<<<<; +@EAS114_45:6:59:1548:1096 +GTCCTATGTACTTATCATGACTCTATCCCAAATTC ++ +;.;;;;;;;;6;;;;;;;;;;;;;;;73;;77777 +@EAS114_45:6:5:730:1436 +GAAGAACTTTGATGCCCTCTTCTTCCAAAGATGAA ++ +7977979;;;;;;;;;7;3<;2<;26;<;<<;;<< +@EAS114_45:6:5:730:1436 +TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ++ +;;;;;;;;;;;;;;;;;;8;;;;;8;;;;;67777 +@EAS114_45:6:86:693:234 +AAGTAACTGAACCTATGAGTCACAGGTATTCCTGA ++ +;;;;;;;;;;;;;;;;9;;;;;;;;99;;&70777 +@EAS114_45:6:86:693:234 +GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA ++ +83997;<;;;;98;;3*6<<;<:8;;;;;<;;<<< +@EAS114_45:6:86:859:1779 +TTTTTTTCATTTCTCTTTTTTTTTTTTTTTTTTTT ++ +;;;;;;;;;;;;;;;;;;;;;;;;;;;8;;)7699 +@EAS114_45:6:90:561:850 +ACAGGAACAAAACCTCATATATCAATATTAACTTT ++ +;;;;;;;;;;;;;;;;;;;;;;;;9;9;6;77777 +@EAS114_45:6:90:561:850 +TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC ++ +78376<;;9<;<<;:9<<<6;<;<;;8;;<;/;;; +@EAS114_45:6:93:1475:542 +TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCAT ++ +98987:9:<:;:;;;;;<<;<;<;;;;<<<;;;<< +@EAS114_45:6:93:1475:542 +TTATCATGACTCTATCCCAAATTCCCAATTACGTC ++ +;;;;;;;;;;;;;;;;;;;;;;9;;;9;;;77777 +@EAS114_45:7:14:1256:204 +AAATGTCTATTTTTGTCTTGACACCCAACTAATAT ++ +66777:;;37;;:;;0;:;;;;):;;:7;;;;;;; +@EAS114_45:7:14:1256:204 +TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC ++ +<<<<<;;;;;;<;;;;;;;<;<;;;;<:-;79697 +@EAS114_45:7:14:978:1296 +ATACAATGATAAAAAGATCAATTCAGCAAGAAGAT ++ +;6;;;;;;;;;;;:;;;;;;;6;;;;;;;;77777 +@EAS114_45:7:14:978:1296 +CAATATTCTGATGATGGTTACACTAAAAGCCCATA ++ +77177;9;2:;;:;;(;;9;<;;;;:;;;:7;<<; +@EAS114_45:7:24:1374:211 +AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG ++ +;;:<<;<;:;;;;;;;;;;<::;;;6;;2+74917 +@EAS114_45:7:24:1374:211 +TGCAATTAATATAATTGTGTCCATGTACACACGCT ++ +77661;;;5;;:;;:;:;;;;;;8:;;;:;;;;;: +@EAS114_45:7:2:168:1878 +AAAAAACCTGGCAAACACGAATGTTATGACATGTN ++ +;<:;;<:<;<;<;;;;:;<;:::&9:&:68&6&*! +@EAS114_45:7:2:168:1878 +TAAATACACACAAAAGTAGAAAACGCACCAGTTTT ++ +*3/6)9.;;;;;;;;5;;);;;3;(;;;+(;7.)3 +@EAS114_45:7:33:1566:588 +ACAGCTTAGGCATCAATTTGGTGTTCTGTGTAAAG ++ +-6246;;97;77;;97;;;;;;9;7;79;)&;37; +@EAS114_45:7:33:1566:588 +TACTGTCATAACTATGAAGAGCCTATTGCCAGATG ++ +<;.;;;;6;;;;6;;29;;;<+9;;;.3;;73797 +@EAS114_45:7:35:538:1882 +TATGCACCTAACACAAGACTACCCAGATTCATAAA ++ +;);43.50;3;93;;4;3;;;9-7.;*;;966*75 +@EAS114_45:7:35:538:1882 +TCTATAACAAAATTAAAATTTAACAAAAGTAAATA ++ +73797;;3<;;<6;;<<<;8:;:;<;:<:;<<;;; +@EAS114_45:7:37:763:1437 +AAAGATGTTCTACGCAAACAGAAACCAAATGAGAG ++ +;;;;;6;;;;;;;;;:;6;5;5;;;;;76;767/7 +@EAS114_45:7:37:763:1437 +TAAAACAAATACTACTAGACCTAAGAGGGATGAGA ++ +79979;<;<;;;<;;;;;;6:;<:;<:8;<<<<;< +@EAS114_45:7:45:1339:1807 +GACATCTAAATGAAAGAGGCTCAAAGAATGCCAGG ++ +77797;;:;::&:;;0:;8;;4;;:;;6;;;;;;; +@EAS114_45:7:69:1130:832 +ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC ++ +;;2<;<;;<;9;<;;;;;;;7;8;;7;;;;77437 +@EAS114_45:7:69:1130:832 +TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA ++ +6)377;3;;;;;;;;;1;;;;;;;;;;;;;;;;;; +@EAS114_45:7:6:758:988 +AAACAAAGGAGGTCATCATACAATGATAAAAAGAT ++ +3+;0;0;;;0;;;;;;5;;;9;;;;90;;;57560 +@EAS114_45:7:6:758:988 +ATTCTGATGATGGTTACACTAAAAGCCCATACTTT ++ +3-7*73;;399:9;9;7<-(<;;<;;:;9::;;7; +@EAS114_45:7:88:451:1773 +ATAAATACACACAAAAGTACAAAACTCACAGGTTT ++ +;;:::<:;:<<;:6::;:;;:::;;<;;;367177 +@EAS114_45:7:88:451:1773 +ATTGGCAGAACAGATTTAAAAACATGAACTAACTA ++ +973776;;;;;;;;;::;;;;;;;;;;;;;;3;;; +@EAS114_45:7:97:1584:777 +CCAGATGAACCACACATTAATACTATGTTTCTTAT ++ +<<;<;;;;<;<;<<;;;;;;;;;;;;;;:;79979 +@EAS114_45:7:97:1584:777 +GTCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCC ++ +66746,9::9;;;;:;;;;;;;;;;;;;;;:;;;; +@EAS114_45:7:9:512:826 +AACTTCCACGTCTCATCTAGGGGAACAGGGAGGTG ++ +67<<<;;;<;;<<;;<;<:;9;;;9;;;;<59777 +@EAS114_45:7:9:512:826 +ACCACACATTAATACTATGTTTCTTATCTGCACAT ++ +76777:;;;;;;;;;;;;;;;;;;;;;;;;;:;;; +@EAS139_11:1:35:631:594 +ATCATGACTCTATCCCAAATTCCCAATTACGTCCT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS139_11:1:35:631:594 +ATGATGCCCCTTGGCCATCACCCGGTCCCTGCCCC ++ +<<<<4<<<<<.<<<<<<<<<<<<<<<<<<<<<<<< +@EAS139_11:1:59:742:549 +ACAAGCAAATGCTAAGATAATTCATCATCACTAAA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8< +@EAS139_11:1:59:742:549 +TTAACATTACAACAGGAACAAAACCTCATATATCA ++ +-<<<3<<<<6<<6<<<<<6<<<<6<<<<<<<<<<< +@EAS139_11:1:81:1019:558 +ACAAAACTCACAGGTTTTATAAAACAATTAATTGA ++ +<<<<<<<<<<<6<<<<<<<<<<<<<<<<<<<<<7< +@EAS139_11:1:81:1019:558 +TGAACTAACTATATGCTGTTTACAAGAAACTCATT ++ +<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS139_11:1:84:92:1246 +GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG ++ +<<<<<<<<<<<<<<<8<<<<<<5<<<<<<<<<<<< +@EAS139_11:1:84:92:1246 +GTTACACTAAAAGCCCATACTTTACTGCTACTCAA ++ +<<<<<<<<<<<<<<<<5<:<<5<<<<<<<<<<<<< +@EAS139_11:2:31:628:1820 +AACCAGTCCTATAAGAAATGCTCAAAAGAATTGTA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<< +@EAS139_11:2:31:628:1820 +CAGGAACAAAACCTCATATATCAATATTAACTTTG ++ +<<<<<<:<<<<:6<<<<<<<<<<<<<<<<<<<<<< +@EAS139_11:2:42:333:516 +AGACAAGTCTCTTATGAATTAACCCAGTCAGACAA ++ +<<<<<5<*<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<< +@EAS192_3:7:149:354:667 +GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC ++ +;<;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS192_3:7:298:644:697 +CTATGTTTCTTATCTGCACATTACTACCCTGCAAT ++ +8:<8;<;:7;<<;4;:+<7<<<<;<<<<<<<<<<< +@EAS192_3:7:298:644:697 +TCCACGTCTCATCTAGGGGAACAGGGAGGTGCACT ++ +<<<<<<<<<<<<<<<::;;;6<8:;;9;98;668; +@EAS192_3:7:66:891:294 +AGCACACTTTAAATCAACAACAGTAAAATAAAACA ++ +<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<< +@EAS192_3:7:66:891:294 +TAATTGGTACAATGTACAATATTCTGATGATGGTT ++ +:<<5;;<<<4<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS192_3:7:78:692:671 +AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA ++ +<<);<<;;<<<<<;<<<<<<<<<<<<<6<<<<<<< +@EAS192_3:7:78:692:671 +CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA ++ +<<<<<<<<<<<<<;<<<<<<<:<<:<<<:8<<0;; +@EAS192_3:7:93:945:176 +CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC ++ +6;;;8<<3<<8.<;6)<<<<<9<<<<<<<<<<<<< +@EAS192_3:7:93:945:176 +GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT ++ +<<<<<<<<<<<<<<<<<<<<<;<<<<;;<;:7;<3 +@EAS192_3:8:6:104:118 +AAGAATTTTAAAAATGAACAGAGCTTTCAAGAAGT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<<<<<< +@EAS192_3:8:6:104:118 +TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA ++ +;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS192_3:8:6:237:885 +AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA ++ +<<<<1:<;:<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS192_3:8:6:237:885 +TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT ++ +<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<;;;<; +@EAS1_103:1:151:159:43 +AACCTCATACACACACATGGTTTAGGGGTATAATA ++ +;;4;6<<;<<<<7<77<6;<6<<<<<;;<<<<<<< +@EAS1_103:1:151:159:43 +TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC ++ +<<<<<<<;<<<8<<<;<;8<<<<7<77;;79<09+ +@EAS1_103:1:228:736:747 +AAGATATGTAGTCATCAGACTATCTAAAGTCAACA ++ +<<<<<<<<<;<<<<<<<;;<<;<<<<;::<;;7;7 +@EAS1_103:1:228:736:747 +TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA ++ +<07<<&<;+<<<<<<<<<<<<<<<<;<<<<<<<<< +@EAS1_103:1:274:176:479 +CCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTAT ++ +7)<<7<626<<7<<<<<<<<<<<<<<<<<<<3<<< +@EAS1_103:1:274:176:479 +GAAATGCTTTACTGTCATAACTATGAAGAGACTAT ++ +<<<<<<<<<<<<<;<<<<<<<<<<;<<9<59<<<< +@EAS1_103:1:2:831:692 +GTGTTCTCATCAACCTCATACACACACATGGTTTA ++ +2749'979<9<<<6;<<<0<;<<<<<3<<<<<<<< +@EAS1_103:1:2:831:692 +TCCAGCTCCCTGTCACCCAATGGACCTGTGATATC ++ +<<<<<<<<;<<<<<<<<<<9<<:9<<<;;96<796 +@EAS1_103:2:184:980:396 +AAGGAGGTCATCATACAATGATAAAAAGATCAATT ++ +<<;;<77;;<<;<<<<<<<<<<<<<<<<<<<<<<< +@EAS1_103:2:184:980:396 +ACATGAACTAACTATATGCTGTTTACAAGAAACTC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< +@EAS1_103:2:226:302:758 +GGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGG ++ +;<<<<9;<<<<<<<<<<7<<<<<<<<<<<<<<<<< +@EAS1_103:2:226:302:758 +TGCTTGTGGTCTGACAGGCTGCAACTTTGAGCGNT ++ +<<<<<<<;;;,<;<92;66<;))42<&2&(/1!!! +@EAS1_103:2:234:167:381 +AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ++ +<<;<;<<<<;<<<<7<<<<<<<<<<<<<<<<<<<< +@EAS1_103:2:234:167:381 +AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;;7<;; +@EAS1_103:2:235:805:373 +TATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCA ++ +<<;<<<<<<9<9<<<<<<<<<<<<<<<<<<<<<<< +@EAS1_103:2:235:805:373 +TTTACTGTCATAACTATGAAGAGACTATTTCCAGA ++ +<<<<<<<<<<<<<<<<<<<<;<;<<<<<<;;<99; +@EAS1_103:2:307:252:632 +ACCATCCTGCTAAATACATATGCACCTAACACAAG ++ +<77<;,5<,9<<<<<<;<<<<<7<;<<<<<<<<<< +@EAS1_103:2:307:252:632 +ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<;; +@EAS1_103:3:253:175:31 +CAAACAGAAACCAAATGAGAGAAGGAGTAGCTATA ++ +<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<:<;;; +@EAS1_103:3:253:175:31 +TTCATAAAACAAATACTACTAGACCTAAGAGGGAT ++ +;+;<;<<<<<<<<9<<9<<<<<;<<<<<<<<<<<< +@EAS1_103:3:277:921:474 +AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC ++ +<<<<<<<<<<<<<<<:<<<<<<<<<<<5<<;;;;; +@EAS1_103:3:277:921:474 +AAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS1_103:3:320:505:814 +ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT ++ +<2<;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS1_103:3:320:505:814 +CTGTCTTGATTTACTTGTTGTTGGTTTTCTTTTTC ++ +<<<<<<<<<<<<<<<<;<<8<<76<<<<;<&<<<7 +@EAS1_103:3:323:196:855 +ACAAGCAAATGCTAAGATAATTCATCATCACTAAA ++ +<<<<<<<7<<<<<<:<<<<<<<<<<<<<<<<<;7: +@EAS1_103:3:323:196:855 +TAAAAAATTAACATTACAACAGGAACAAAACCTCA ++ +&<<<<<<09<<7<7;<;<<0<<<<<;<<<<<<<<< +@EAS1_103:3:41:474:283 +TGAACCACACATTAATACTATGTTTCTTATCTGCA ++ +<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<+<< +@EAS1_103:3:41:474:283 +TTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTCC ++ +6/;;;88;;<:;48<<<<<;<;<<<<<<<<<<;<< +@EAS1_103:4:143:560:194 +GTTGTACTGGGCAATACATGAGATTATTAGGAAAT ++ +9:<;7<:::<:<;<<<<<<<<<<:<<<<<<<<<<< +@EAS1_103:4:143:560:194 +TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC ++ +<<<<;;<<<<<<<<<<<6<;<<<<;;<<;9<999< +@EAS1_103:4:164:79:134 +ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7< +@EAS1_103:4:164:79:134 +AGATAATTCATCATCACTAAACCAGTCCTATAAGA ++ +<;<;<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<< +@EAS1_103:4:231:815:626 +GATCAATACAGCAAGAAGATATAACCATCCTACTA ++ +'<4%<<<22<<,<<;<<4;<<<<<<<<<<<<<<7< +@EAS1_103:4:231:815:626 +GCTGTTTACAAGAAACTCATTAATAAAGACATGAG ++ +<;<<<<9<<<<<<<<<<<<<<<<<;<<;5<<<;:; +@EAS1_103:4:235:899:847 +AGAAACTCATTAATAAAGACATGAGTTCAGGTAAA ++ +<<3<;<<<<<<<<<;;<<<<<<<+<<<+6<8<3/< +@EAS1_103:4:235:899:847 +ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT ++ +<7<<<<<<<<:<<<<:<<<<<1>><<<< +@EAS1_108:2:102:543:160 +CAACAGGAACAAAACCTCATATATCAATATTAACT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<:< +@EAS1_108:2:102:543:160 +CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA ++ +9==9=====;=====================<=== +@EAS1_108:2:116:966:193 +ATTAACATTACAACAGGAACAAAACCTCATATATC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< +@EAS1_108:2:116:966:193 +GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT ++ +=================================== +@EAS1_108:2:170:326:433 +CTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGTC ++ +:44<<<<<<<<<<:6<<<<<<<:<<<<<<<<<<<< +@EAS1_108:2:170:326:433 +TTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGG ++ +=====<=9===:=<:==2=======2:===9==/5 +@EAS1_108:2:176:653:957 +AAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA ++ +===::=============<==<====<======== +@EAS1_108:2:176:653:957 +ACATTACAACAGGAACAAAACCTCATATATCAATA ++ +????????????<=>>>==>>===>==> +@EAS1_108:6:159:493:275 +ACAAAACTCACAGGTTTTATAAAACAATTAATTGA ++ +=====3============================= +@EAS1_108:6:159:493:275 +TGCTGTTTACAAGAAACTCATTAATAAAGACATGA ++ +4949;<<<<<<<<<<<6<;<<<<;<<<<<*<<<<< +@EAS1_108:6:165:464:123 +CATACACACACATGGTTTAGGGGTATAATACCTCT ++ +===============7==============8==== +@EAS1_108:6:165:464:123 +GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCA ++ +9;<)<<%<<9<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS1_108:6:222:579:961 +AGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAG ++ +=58====;==8=======;================ +@EAS1_108:6:222:579:961 +CAGAAACCTTACAAGCCAGAAGAGATTGGATCTAA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<7<<:7;;;68 +@EAS1_108:6:71:187:824 +AGACAGACTTCATCAAGATATGTAGTCATCAGACT ++ +;===;======3==;==========4=;=7;;3;6 +@EAS1_108:6:71:187:824 +TCTAATTTTTGGACTTCTTAAAGAAAAAAAAACCT ++ +0040;<7<<<<0<7<<<;<7*<<<<<7<<771<<< +@EAS1_108:6:73:735:329 +AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA ++ +================;==;====;=;=======; +@EAS1_108:6:73:735:329 +TAGCTATACTTATATCAGATAAAGCACACTTTAAA ++ +;;;9;<<7<<<<<<<<<<<<<<<<<<<2<<<<<<< +@EAS1_108:6:77:48:860 +CTCTGTCTTGATTTACTTGTTGTTTGTTTTCTGTT ++ +=========;===========9==*;5=;=;=,7= +@EAS1_108:6:77:48:860 +TAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC ++ +;8;8;<9<9<<<<<<<<<4<<<<<<<<<<<<<<<< +@EAS1_108:6:94:294:387 +ACCATCATAAATACACACAAAAGTACAAAACTCAC ++ +779=53=9===;=:=;=========;========= +@EAS1_108:6:94:294:387 +GAATGTTATGCCCTGCTAAACTAAGCATCATAAAT ++ +<<<<<<<;<<<<<<<<<:<<<<<<<<<<<<;)7;; +@EAS1_108:6:95:235:746 +CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG ++ +==&=;===7=3===8======;=;8===8=====; +@EAS1_108:6:95:235:746 +TCTAAAATCAGCAAGAGAAAAGCATACAGACATCT ++ +<<<<;<<<<<<<<79<<<<<<<<<<<<<<*;;;<9 +@EAS1_108:7:108:440:208 +CCCATCCTACTAAATACATATGCACCTAACACAAG ++ ++35:486<<4<<<<<<<<<<<-<<<<<7<<)<<<- +@EAS1_108:7:108:440:208 +TTCAGGTAAAGGGGAGGAAAAAGATGTTCTACGCA ++ +<<<;<<<<<<<<<<<8<<<<<><<<<<><<<<<<<<<<<<<<< +@EAS1_95:7:280:607:113 +ATCCATGTAACAAATCTGCGCTTGTACTTCTAAAT ++ +===================;===;=====<=7=9: +@EAS1_95:7:280:607:113 +GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT ++ +18<-<<<<<<<<<<<<<8<<<<<<<<<<<<<<<<< +@EAS1_95:7:282:817:710 +TGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCC ++ +366=6;======8====:========;======== +@EAS1_95:7:282:817:710 +TTTGTAATGAAAACTATATTTATGCTATTCAGTTC ++ +<<<<<<<<<<<<<<<<<<<<<<<;:<<<<:8,<<8 +@EAS1_95:7:310:800:761 +AAAGCACACTTTAAATCAACAACAGTAAAATAAAA ++ +===========================+======= +@EAS1_95:7:310:800:761 +CAATATTCTGATGATGGTTACACTAAAAGCCCATA ++ +1<<:<:<:<<<<:<<<<<<<<<;<<<<<<<<<<<< +@EAS1_95:7:46:522:426 +AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA ++ +<<<<<:<<<<<<1/<<<<<<<<<<<<<<<<<<<<< +@EAS1_95:7:46:522:426 +GGTAAAAAATTAACATTACAACAGGAACAAAACCT ++ +=======================:==;<===78== +@EAS1_95:7:55:506:125 +CTTTACTGTCATAACTATGAAGAGACTACTGCCAG ++ +118%67;1;8,4:187<4>::1:818;;&::<>.; +@EAS1_95:7:55:506:125 +TCTACCACAGGGGGCTGCGCGGTTTCCCATCATGA ++ +<<<<<<<<<;<9<;<<;558<<<<5(5*<<<<<51 +@EAS1_95:7:61:702:720 +ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA ++ +<<<4<4+0;<<:<<<<<<<<-<<<<<<<<<<<<<< +@EAS1_95:7:61:702:720 +CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC ++ +==============;=======&=========3:= +@EAS1_95:7:74:866:49 +CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC ++ +====================9==91==<=6==;:= +@EAS1_95:7:74:866:49 +CCAACCTACTAAATACATATGCACCTAACACAAGA ++ +:8<&<<<<7<<<<:<<<<<<8<5<<<<<<<<<<<< +@EAS1_97:2:128:629:484 +AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA ++ +:(::<<<<<<<<<7<<<<<<<<=<<<<<<<<<<<<<< +@EAS1_99:8:27:228:31 +AAATAAAACAAAGGAGGTCATCATACAATGATAAA ++ +<<<<<<<<<<<<<<<<<;9<:;<<<<<<75<<<<< +@EAS1_99:8:27:228:31 +GGTTACACTAAAAGCCCATACTTTACTGCTACTCA ++ +99;;;<<<<<<:<<;<;<<;<<<<;<<;<<<<<<< +@EAS1_99:8:99:756:130 +GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT ++ +;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<;< +@EAS1_99:8:99:756:130 +GACCCTACACGAATGCGTCTCTACCACAGGGGGCT ++ +;;<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:2:10:686:1024 +ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT ++ +<:<<<<:<<<<<<<<<<:<:<<<<<<<<<<<5<<< +@EAS218_1:2:10:686:1024 +CATACAATGATAAAAAGATCAATTCAGCAAGAAGA ++ +&<<<3<<<<<<<<<<<<<<7<<<<<<<<<<7<<<< +@EAS218_1:2:15:1763:1143 +AAACAAATACTACTAGACCTAAGAGGGATGAGAAA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:2:15:1763:1143 +TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:2:18:1498:1475 +CTTGGGCTGTAATGATGCCCCTTGGCCATCACCCG ++ +<<<<<7<<<<<<+<<-3<<3<:<2<1<<:<<<<<+ +@EAS218_1:2:18:1498:1475 +GAAAGGTTGTTGGGAGATTTTTAATGATTCCTCAA ++ +:<4<*7<<<<<<<:<<:<<<<<<<<<<<<<<<<<< +@EAS218_1:2:19:752:816 +CGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG ++ +<<<<<<<<<<<<<<<<<<<8<7;<;<<767277;6 +@EAS218_1:2:19:752:816 +TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA ++ ++<<+<--/<<<<4<2<<<<45<<<:<<<<<<+<<< +@EAS218_1:2:26:211:481 +ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA ++ +<<<<<<<<<<<<<<<<<<<<<<<7<<<<<:<7<<< +@EAS218_1:2:26:211:481 +CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA ++ +:<:<<<<<<9:5<<<<<<<<<<<<<<:<:<<<<<< +@EAS218_1:2:40:1291:1045 +CTAACACAAGACTACCCAGATTCATAAAACAAATA ++ +*<<<9<<<<<<:0<9<<<<<<<;<<<<<<<<<<<< +@EAS218_1:2:40:1291:1045 +GTAAAGGGGTGGAAAAAGATGTTCTACGCAACAAG ++ +<<<<<<<<<5<<5<<<<7<<<<<<<<<5<9<&%73 +@EAS218_1:2:64:1318:1711 +GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:2:64:1318:1711 +TGAAAACTATATTTATGCTATTCAGTTCTAAATAT ++ +<<<<<<<<<<<<<<<<7<<<<<<<:<<<<<2<<<< +@EAS218_1:4:14:1872:1521 +TCAAAGAATGCCAGGAAGATACATTGCAAGTCAGA ++ +7<<<<77<<<3<3<7.'<<<<<7<67<+.0%4*<4 +@EAS218_1:4:14:1872:1521 +TCATCAAAAACCTTACAAGCCAGAAGAGATTGGAT ++ +/1<%73&7<1<3577,<<<7/733<<<<<<<<1<< +@EAS218_1:4:15:856:340 +CACGCTGTCCTATGTACTTATCATGACTCTATCCC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:4:15:856:340 +CCCCAGCATGGTTGCACTGGGCAATACATGAGATT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<77<< +@EAS218_1:4:28:315:310 +AAACTGTTCTCTTGAAAGCTTGGGCTGTAATGATG ++ ++%,768<<:<:<2<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:4:28:315:310 +CATGTACACACGCTGTCCTATGTACTTATCATGAC ++ +<<<<<<<<<<<<<<<<<<<<<:<+.<<.<+7<*17 +@EAS218_1:4:37:1626:862 +ACCCAACTAATATTTGTCTGAGCAAAACAGTCTAG ++ +:663<<3<<<<<<<<<<:<<<<7<<<<<<<<<<<< +@EAS218_1:4:37:1626:862 +TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:4:61:1369:440 +AAAGACATGATTTCAGGTAAAGGGGTGGAAAAAGA ++ +<<<<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:4:61:1369:440 +CAGGTTTTATAAAACAATTAATTGAGACTACAGAG ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<8 +@EAS218_1:4:62:561:531 +AGCTATACTTATATCAGATAAAGCACACTTTAAAT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:4:62:561:531 +TACTAGACCTAAGAGGGATGAGAAATTACCTAATT ++ +<<7<<<<:<8<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:4:71:832:743 +ACCCAGTCCCTGCCCCATCTCTTGTAATCTCTCTC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:4:71:832:743 +CTATGTACTTATCATGACTCTATCCCAAATTCCCA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<*<<<<<<< +@EAS218_1:4:73:42:1038 +AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:4:73:42:1038 +TCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTTT ++ +<<<<<<<<<<<<<<<<<<<<<<<:<<<<<.<<<<< +@EAS218_1:4:75:555:1591 +TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<< +@EAS218_1:6:49:905:27 +CCACAGGGGGCTGCGCGGTTTCCCATCCTGAAGCA ++ +<<;<.89<9.<2<9<:91+447.9,04&000(,+( +@EAS218_1:6:49:905:27 +GAAGAGACTATTGCCAGTTGAACCACACATTAATA ++ +99515<<&<<6595-56%;86&<;<<<6<<<<6;< +@EAS218_1:6:66:1282:1215 +GTGATGTGTGTTCTCATCAACCTCATACACACACA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;; +@EAS218_1:6:66:1282:1215 +TTCAGACCCTACACGAATGCGTCTCTACCACAGGG ++ +::;<;<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:6:77:1529:522 +AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA ++ +<<;<<<<<<<<<<<4<<4<;;:;2:7<<<2*<;;8 +@EAS218_1:6:77:1529:522 +AAAGTTCAATACTCACCATCATAAATACACACAAA ++ +<<<;7;,<<<<<<.<,6<<6<<<<<<<;<<<<<<< +@EAS218_1:6:88:1413:14 +AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA ++ +<<<<<<<<<<<;;;<<<<<<;<;;<<<<<<<<<<< +@EAS218_1:8:13:1729:1844 +ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA ++ +<<<;;<;7<<<<4<<<<762;6<<<<<<<;6;618 +@EAS218_1:8:16:1081:1894 +AAGGTGATGTGTGTTCTCATCAACCTCATACACAC ++ +;5;;&<;<<<<<<<<;<;<<;<<<;<<<<<<<<<< +@EAS218_1:8:16:1081:1894 +AGATGAAACGCGTAACTGGGCTCTCATTCACTCCA ++ +<<<<<<<<<<<<<<<<<<8<<<<;<<;<<<<<<<+ +@EAS218_1:8:26:785:882 +CAGTTTCTGCCCCAAGCATGGTTGTACTGGGCAAT ++ +<<<0<<<<<<<<<6,<<)<<<<<<<&<<0<<,<'< +@EAS218_1:8:26:785:882 +TACTTATCATGACTCTATCCCAAATTCCCAATTAC ++ +<<&5&<<<<5.;5<'<<;.76<<<<<7<7<<<<<< +@EAS218_1:8:61:1797:113 +CAGATAGCTTGTGGTCTGACAGGCTGCAACTGTGA ++ +<<0<<&<<<<;<<4;;3<;<:<<<<<<<<<<<<<< +@EAS218_1:8:61:1797:113 +GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA ++ +<<<<<<;<<<<;:<3<<<<;;<<<8<<;:<<;3<. +@EAS218_1:8:70:445:1289 +CTAATTTTTGGACTTCTTAAAGAAAAAAAAACCTG ++ +<<<<<<<<<<2<<<<<<<<<<:<<<<<<<;;;;<: +@EAS218_1:8:70:445:1289 +GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA ++ +<<<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<< +@EAS218_1:8:82:1540:77 +ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC ++ +<48;<;<<<<< +@EAS221_1:6:96:491:1891 +AGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGG ++ +<:<<<<<::<<<<<<<<<<<<<<<<:<<::7<<:7 +@EAS221_1:6:96:491:1891 +GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA ++ +:;5<<7<;:<<;<<<<<<<<<<;<<<<<<<<<<<< +@EAS221_1:8:15:881:1932 +CACTTAAGAGATATAGATTGGCAGAACAGATTTAA ++ +<<<<<<<<<<<<<<<;<<<<:<<<2<26<8<<;;. +@EAS221_1:8:15:881:1932 +CACTTTAAATCAACAACAGTAAAATAAAACAAAGG ++ +)<4<<<<<<<4<<4<<4<<<<<<<<<<<<<<<<<< +@EAS221_1:8:4:679:110 +AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_1:8:4:679:110 +TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT ++ +<<<<<<<<<<<<<<<<<<<;<<<<<<<<::<;;:7 +@EAS221_1:8:58:369:244 +CTGTAATGATGCCCCTTGGCCATCACCCAGTCCCT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_1:8:58:369:244 +TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT ++ +<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<<<<< +@EAS221_1:8:60:1020:1259 +CTATGAAGAGACTATTGCCAGATGAACCACACATT ++ +<;<<<<;<<<<<<<<<;<<<<<<<8<<<<<:<:<< +@EAS221_1:8:60:1020:1259 +TAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_1:8:65:1928:1125 +CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA ++ +<<;<<<7<<7<;<7<<<<<<<7<<<<;<.-;<+88 +@EAS221_1:8:65:1928:1125 +GGCATTTGCCTTCAGACCCTACACGAATACGTCTC ++ +<+<<<2<4<<<0<<4<<<<<6<<<6<<<'<<<<0< +@EAS221_1:8:67:1797:1931 +GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_1:8:67:1797:1931 +TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<< +@EAS221_1:8:70:1349:1788 +ATTATATCAGATAAAGCACACTTTAAATCAACAAC ++ +&<8<<<85:580;<:0-><;>588>9<>7:<0<9; +@EAS221_1:8:70:1349:1788 +TACTAGACCTAAGAGGGATGAGAAATTACCTAATT ++ +<7;<<8<74;;<1<<71<;7<;;<;<7<<<<<<<< +@EAS221_1:8:73:108:1621 +GAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTC ++ +<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_1:8:73:108:1621 +GTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACA ++ +<<<<<<<<71<<<<<<<<<+<<<<70:0<9<<61< +@EAS221_1:8:77:781:676 +TCATGAAGCACTGAACTTCCACGTATCATCTAGGG ++ +<<<<<<<5<<5<<<<<<<<<<<<13<<2<<<<<,< +@EAS221_1:8:77:781:676 +TTGCCAGATGAACCACACATTAATACTATGTTTCT ++ +:<;<2<<<<<<26<<<<6<;<<<<<<<<<<<<<<< +@EAS221_1:8:78:1478:1446 +GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT ++ +<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<:<<<; +@EAS221_1:8:78:1478:1446 +TGTGGTCTGACAGGCTGCAACTGTGAGCCATCACA ++ +<8,8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_1:8:84:1013:1074 +GCAAGGGGGTCTATGTGAACAAAGGCACTAAACAC ++ +<7<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_1:8:84:1013:1074 +TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA ++ +8;;<;8744<7<<4<<47<<<<<<7<<<<<<<<<< +@EAS221_1:8:8:1351:1986 +CCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATG ++ +<8;<<<<<<<<<<<;<<;<<<<<<<<<<<<<<<<< +@EAS221_1:8:8:1351:1986 +TCTTACTTCCAGATCCCCAGAGGGAAAGCTTTCAA ++ +<<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<< +@EAS221_3:2:100:1147:124 +AAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAG ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<< +@EAS221_3:2:100:1147:124 +AATGCCAGGAAGATACATTGCAAGACAGACTTCAT ++ +<<<<96<<<<<<<<<<<<<<<<<<<<<<:<<<<<< +@EAS221_3:2:22:1623:709 +GAAGACAAGTCTCTTATGAATTAACCCAGTCAGAC ++ +<<<<<<<<<7<<<<<<<:<<<<<<<<:85:<:2<< +@EAS221_3:2:22:1623:709 +GGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC ++ +<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_3:2:2:491:1886 +CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT ++ +<<:<8:<<<:<<<<<<<<<<<9<<<<<<<<<<<<: +@EAS221_3:2:59:1576:946 +AACTGTGAGCCATCACAATGAACAACAGGAAGAAA ++ +<:<<<<<<<<<<<<:<:<<<<<<<8<<::1<<<<< +@EAS221_3:2:59:1576:946 +CAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT ++ +9<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_3:2:60:590:1760 +AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG ++ +<:<<<<<2<<<<:<::<<<::<<<<<6<<<<<<<6 +@EAS221_3:2:60:590:1760 +TCATCAAGATATGTAGTCATCAGACTATCTAAAGT ++ +<8<-<<<<<<<82<<<4<<<<<<<<<<<<<8<<<< +@EAS221_3:2:67:1467:1447 +AAAGTTCAATACTCACCATCATAAATACACACAAA ++ +<<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<<< +@EAS221_3:2:67:1467:1447 +ATAGATTGGCAGAACAGATTTAAAAACATGAACTA ++ +<<<<<::<<:<<<<:<<<<<<<<<<<<<<<<<<<< +@EAS221_3:2:67:1864:477 +AATGATGCCCCTTGGCCATCACCCAGTCCCTGCCC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_3:2:67:1864:477 +TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_3:2:76:1729:813 +TAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTT ++ +<+6<<<&1<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_3:2:76:1729:813 +TCTGCGCTTGTACTTCTAAATCTATAAAAAAATTA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS221_3:4:12:276:1797 +ACTATTGCCAGATGAACCACACATTAATACTATGT ++ +<<<<<<<<<<<<:>>>>>>>>>>>>>;<>>>>><<>>>;<+<<<+<<<<:<<<<2<;<<<;<<<<<<<<<<< +@EAS54_67:3:172:196:746 +GCATACAGTCATCTATAAAGGAAATCCCATCAGAA ++ +<<<<<<<<9<<<<9<<<<<<<<<;<<<<6<<<<;< +@EAS54_67:3:175:730:949 +TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC ++ +<<<<;+<<<<7<;<<;<<<<<<<<<<<<<<<<<<< +@EAS54_67:3:197:261:624 +GACTATCTAAAGTCAACATGAAGGAAAAAAATTCT ++ +<<<<<<<<<<<;<<<<<<<;<<;<<<<<<;<<<9< +@EAS54_67:3:197:261:624 +GCCCTGCTAAACTAAGCATCATAAATGAAGGGGAA ++ +866;2:/;<<<;:<<<;<;;<<<<<<<<<<<<<<< +@EAS54_67:3:47:471:858 +ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT ++ +/;9<<63<<<<3<;<<<<<<<<<<<<<<<<<<<9< +@EAS54_67:3:47:471:858 +CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG ++ +<<;<<<<<<<<9<<<4;;<<<<;<<<<<.<<4;<4 +@EAS54_67:4:142:943:582 +TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA ++ +<<<<<<;<<<<<<:<<;<<<<;<<<;<<<:;<<<5 +@EAS54_67:4:145:607:216 +AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ++ +<<<<<<<<8<<<<<<<<<<4<<<7<:<<1<<;;99 +@EAS54_67:4:145:607:216 +TGAAAAACAGGAAGAAAAGGTCTTTCAAAAGGTGA ++ +/;<<&<<8<<<<<<<<<<<<<;872<<<<<<<<<< +@EAS54_67:4:7:526:343 +TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT ++ +<<<<<<<<<<<<<<<:<<<5<<<<<<5;<<<+8<; +@EAS54_67:4:7:526:343 +TGAAAACAGTGTTCCCCAGATACCATCCCTGTCTT ++ +(7:;;;<<;;;<1<1<<<<<<<<<<<<<<<<<<<< +@EAS54_67:5:117:33:262 +AATTAACATTACAACAGGAACAAAACCTCATATAT ++ +<<;;<<;<:8<7<<;<<<<<<<<<<<<<<<<<<<< +@EAS54_67:5:117:33:262 +ACAAGCAAATGCTAAGATAATTCATCATCACTAAA ++ +<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; +@EAS54_67:5:124:241:608 +CTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG ++ +9;;<<;<<<;<<<;<:<<<<;<<<<<<<<<<<<<< +@EAS54_67:5:124:241:608 +GGGTATAATACCTCTACATGGCTGATTATGAAAAC ++ +<<<<<<<<<;<<<<<<<<<;;<<<;<<<<;;8;;: +@EAS54_67:5:127:828:697 +ATGCCAGGAAGATACATTGCAAGACAGACTTCATC ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<; +@EAS54_67:5:127:828:697 +TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT ++ +;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS54_67:5:149:639:910 +CAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGA ++ +<<<<<<<<<<<<<<<<<<<<<<<<7<;;<<;<<;< +@EAS54_67:5:149:639:910 +TCACTAAACCAGTCCTATAAGAAATGCTCAAAAGA ++ +<;49;<<;;<<<<8;<<<<<<<<<<<<<<<<<<;< +@EAS54_67:5:71:408:741 +AGTCATCTATAAAGGAAATCCCATCAGAATAACAA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< +@EAS54_67:5:71:408:741 +TCCTGACAAGCAAATGCTAAGATAATTCATCATCA ++ +;7;<;<0<<<<<<<<:;<<<<<<<<<<<<<<<<<< +@EAS54_67:6:107:395:312 +CAAAATATAGTTGAAAGCTCTAACAATAGACTAAA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<;<;;<:<<<< +@EAS54_67:6:107:395:312 +CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT ++ +;<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS54_67:6:109:953:668 +CAATATATCCATGTAACAAATCTGCGCTTGTACTT ++ +;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<8<;<< +@EAS54_67:6:109:953:668 +CCACTTTGGAAAACAATTTGGTAATTTCGTTTTTT ++ +<:)9<<<<<<<<8:<<<<<<<<<<<<<<<<<<<<< +@EAS54_67:6:198:503:669 +CAATGATAAAAAGATCAATTCAGCAAGAAGATATA ++ +5<<:<<;<<<<<<<;;<<9<<<<<<<<;<<<<;<< +@EAS54_67:6:198:503:669 +CAGATTTAAAAACATGAACTAACTATATGCTGTTT ++ +<<<<<<<<<<;8<<<<<;<<<<<<;<;<8<<8<<< +@EAS54_67:6:43:859:229 +TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA ++ ++37<=<.;<<7.;77<5<<0<<<;<<<27<<<<<< +@EAS54_67:6:46:285:790 +AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ++ +;;<8<;<<<<88<8<<;;<;<<;<<<<<<<<;<<< +@EAS54_67:6:46:285:790 +TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG ++ +!!<<3<<<;;<<<<<<<<<;<;7<<7<<<<<<;<< +@EAS54_67:7:101:752:996 +AACCTTACAAGCCAGAAGAGATTGGATCTAATTTT ++ +<<<<<<<<<<<<<<<;<<<<<9<<<<<<;<<;;;; +@EAS54_67:7:101:752:996 +AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT ++ +<<<<<<<<7<7<<<<<<<<<<<<<<<<<;<<<<<< +@EAS54_67:7:197:399:319 +CAAAAAACAAATACTACTAGACCTAAGAGGGATGA ++ +&<+==<<5<<<8<89;;<<<<<<8<<<<<<<<<<< +@EAS54_67:7:197:399:319 +TAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA ++ ++<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;;<<; +@EAS54_67:8:19:855:491 +TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT ++ +8<<<<;:<<<<:<<<<<:<;;<<<<<<<;<<<;<; +@EAS54_67:8:19:855:491 +TGTGTGTTCTCATCAACCTCATACACACACATGGT ++ +<<<<<<<<<<<;<<.:<<<<;;;<4<:<:<7<;;; +@EAS54_67:8:46:900:610 +GATATCTGGATTCTGGGAAATTCTTCATCCTGGAC ++ +<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<;;4;< +@EAS54_67:8:46:900:610 +TACATGGCTGATTATGAAAACAATGTTCCCCAGAT ++ +<;5<;<<<;<<<<<<;<<<<<<<<<<8<<<<<8<< +@EAS54_71:2:125:628:79 +GCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA ++ +95&<<<<<<<63<<<6<<<<8<;<<8<<<<<<<< +@EAS54_71:2:125:628:79 +TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA ++ +==================<6<====<<:<==7;:: +@EAS54_71:2:204:264:413 +CAATGAACAACAGAAAGAAAAGTTCTTTCAAAAGG ++ +1==(4=::;/7::&===;====/=;===;;===== +@EAS54_71:2:204:264:413 +TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTG ++ +<<<<<<<<<<<<<;:59<+<<:<<<9<<;:62<) +@EAS54_71:2:85:686:696 +AATCAGCAAGAGAAAAGCATACAGTCATCTATAAA ++ +==================<=====:==<=<;=:== +@EAS54_71:2:85:686:696 +TAAACTAAGCATCATAAATGAAGTGGAAATAAAG ++ +:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS54_71:3:186:989:869 +ACACACATGGTTTAGGGGTATAATACCTCTACATG ++ +;<<;:<<<7:<<<<<<:<<<<<<<<<<<<<<<<<< +@EAS54_71:3:186:989:869 +GGGAAATTCTTCATCCTGGACCCTGAGAGATTCT ++ +<<<<<<<<<<<<<<<<<<<<7;:<<<<<<<<<$< +@EAS54_71:3:254:32:275 +GATGGAGGGAAGAGGGACGCTGAAGAACTTTGAT ++ +<<<<<<<<<<<<<<<<<<<<<<;;<:<::<:2*< +@EAS54_71:3:254:32:275 +TGCAACTGTGAGCCATCACAATGAACAACAGGAAG ++ +(6+<;+6:9<<:7:<95<<<<<<<<<<<<<<<<<< +@EAS54_71:3:257:288:731 +AAGAAGATATAACCATCCTACTAAATACATATGCA ++ +<<:<<7<<<<<;<5<<<<<<<<<<<<<<<<<<<<< +@EAS54_71:3:257:288:731 +TGCTGTTTACAAGAAACTCATTAATAAAGACATG ++ +<<<<<<<<8<8<<;<;<<<;<<<5<;;88.8<6< +@EAS54_71:3:267:821:860 +GCATACAGTCATCTATAAAGGAAATCCCATCAGA ++ +$&<<<.<:;6<<;<<<<<<<<<<<<<<<<<<<<< +@EAS54_71:3:267:821:860 +TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG ++ +;<<<<<8<<<<<8<<;<8<<<<<5<;<<<<<2;<5 +@EAS54_71:3:78:855:352 +AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT ++ +2<<<<<<<9<<4<<<<<<<<<<<<<<<<<<<<<< +@EAS54_71:3:78:855:352 +AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC ++ +<<<<<<<<;<<<<<<<<<;<<<<<<<<;<;<<:<: +@EAS54_71:4:127:725:381 +AATTACAAAATATAGTTGAAAGCTCTAACAATAGA ++ +<<<<<<<<<<<<<<<<<<<<<;<<<<;;;;;<<8: +@EAS54_71:4:127:725:381 +TGAACCTATGAGTCACAGGTATTCCTGAGGAAAA ++ ++<<.<<;<;<<<3;<;<<<<<<6<8;<<<<<<<1 +@EAS54_71:4:13:981:659 +CGGGACAATGGACGAGGTAAACCGCACATTGACAA ++ ++)---3&&3&--+0)&+3:7777).333:<06<<< +@EAS54_71:4:13:981:659 +TGTAGCCCCTCTAAGGCGTTCTATTTGTAATGAA ++ +()&)06636;;<664*6;<<<<<<<<<<<<<<<1 +@EAS54_71:4:14:88:306 +AAAGAATGCCAGGAAGATACATTGCAAGACAGAC ++ +<<<<<<8<<<<<<;<<<3<<<8<<;<;;<15<:6 +@EAS54_71:4:14:88:306 +AGAAGAGATTAGATCTAATTTTTGGACTTCTTAAA ++ +<1;<;<;<4<&<<<:<<<:<<<<;<<<<<<<<<<< +@EAS54_71:4:165:397:25 +GCAACTGTGAGCCATCACAATGAACAACAGGAAGA ++ +<<7<<<<<<)97<6<:3:60:3+37-37+<:33:3 +@EAS54_71:4:165:397:25 +TTCAACGCTTCTAGCCATTTCTTTTGGCATTTGC ++ +&(33'60;-'+'<7;<<*3-<;;183<<<;<;<< +@EAS54_71:4:169:256:888 +AGGTTCAGAACTTGAAGACAAGTCTCTTATGAATT ++ +<<<<<<<<<<<<<<<<<<<<<<;;<;<<;<<:;;< +@EAS54_71:4:169:256:888 +ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT ++ +&<<:<;<<;;<8<;<<<<<<<<<<<<<<<<<<<< +@EAS54_71:4:169:862:829 +AAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA ++ +<<<<<<<<<<<<<<<<<;<<<;<;<<<<:<;;<78 +@EAS54_71:4:169:862:829 +GCCATTTCTTTTGGCATTTGCCTTCAGACCCTAC ++ +,1<6<<<<<7<<<<<<<<<<<<<<<<<7<<<<<< +@EAS54_71:4:206:741:810 +ACTAACTATATGCTGTTTACAAGAAACTCATTAA ++ +<3<<;5<<<<<;:<<<<<<<<<<<<<<<<<<<<< +@EAS54_71:4:206:741:810 +CAAAAGTACAAAACTCACAGGTTTTATAAAACAAT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:-;<< +@EAS54_71:4:209:159:130 +CTTATCATGACTCTATCCCAAATTCCCAATTACGT ++ +;:6<:<8::;<<<;<-<<<<<<<<<<<<<<<<<<< +@EAS54_71:4:209:159:130 +GCCCCCAGCATGGTTGTACTGGGCAATACATGAG ++ +<<<<<<8<<<<<<&<<+7<<4<<<22<;<<<<3< +@EAS54_71:4:233:97:262 +ACCACACATTAATACTATGTTTCTTATCTGCCCA ++ +<<<<<<<<<<<;<;<<:<<<<<<<<<<<<.<&77 +@EAS54_71:4:233:97:262 +GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA ++ +--;;7<;<;;:;<;<<<<<<<<<<<<<<<<<<<<< +@EAS54_71:4:252:428:683 +TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCT ++ +<<<<<<;<<<<<<<<7<<7<<&+<<<<:<&<<<4< +@EAS54_71:4:284:269:882 +TTTCTTTTCTCTTTTTTTTTTTTTTGTTTTTGCA ++ +<;<<<<<8<7<8;<<<;<7<<<<<;272;73&&) +@EAS54_71:4:328:669:662 +GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT ++ +<<<<<<<<<<<<<<<<<<<<<<<<+9;<;;.<<< +@EAS54_71:4:328:669:662 +TCTTCATCCTGTACCCTGAGAGATTCTGCAGCCCA ++ +4<<;<<8<.<88.<<;4<<<<<<<4<.<<<<7<<< +@EAS54_71:4:72:63:435 +CCTTGCAACAACCTTGAGAACCCCAGGGAATTTG ++ +<<<<<<<<<<<<<<<<<<<<;<<<;<;;39:7:7 +@EAS54_71:4:72:63:435 +TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA ++ +::<;<<<<;;;<<<<<<<<<<<<<<<<<<<<<<<< +@EAS54_71:4:73:182:444 +AACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCG ++ +:1<4;;::<<;<<<<;<<<<<<<<<<<;<<<<<<< +@EAS54_71:4:73:182:444 +CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTT ++ +<<<<;;<<<<<<<<<<<<;<;<<<<<:<<<<<7< +@EAS54_71:5:153:543:671 +GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTG ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<<7 +@EAS54_71:5:153:543:671 +TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT ++ +;;;;;=;==================;========= +@EAS54_71:5:16:434:204 +AGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC ++ +<:7:<<<<<<<<<<<9<<<+<<<<<<<<<<<<<< +@EAS54_71:5:16:434:204 +CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT ++ +=================;)===8===:==7;<+%; +@EAS54_71:5:81:685:141 +ACTGAACCTATGAGTCACAGGTATTCCTGAGGAA ++ +<<<<<<<<<<<<<<<<<<<<<;;<<;<<<',7,7 +@EAS54_71:5:81:685:141 +AGATATGTAGTCATCAGACTATCTAAAGTCAACAT ++ +;+;(;)..=3.1=.7=;=8;==<4====;====== +@EAS54_71:6:172:896:83 +AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGT ++ +<<<<<<<<<<<<<<<<<:;;+;<<<<<<<<9;;; +@EAS54_71:6:172:896:83 +CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA ++ +;<.5.;;<+;<<<<<<<4<<<<<<<;<<<<<;<<< +@EAS54_71:6:215:133:909 +TGTGTGTTCTCATCAACCTCATACACACACATGG ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<996( +@EAS54_71:6:215:133:909 +TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA ++ +7758;<;<;8<<<<;<;<<<<<:;<<<<<<<<<<< +@EAS54_71:6:224:932:942 +CTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGG ++ +<;<<;;<<<;<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS54_71:6:224:932:942 +GTCCATGTACACACGCTGTCCTATGTACTTATCA ++ +<<<<<<<<<<<<<<<<<<<<<<;<<<<7<<(;3, +@EAS54_71:6:228:354:203 +AATGGACCTGTGATATCTGGATTCTGGGAAATTC ++ +88<<<8<<<<<<<<<8<<<<<<<<<4<<<4/9/; +@EAS54_71:6:228:354:203 +TCAACCTCATACACACACATGGTTTAGGGGTATAA ++ +%1<851<5<<<982<<<<<<<<::<<<<7<<<<3< +@EAS54_71:6:264:705:89 +AAACATATGCACCTAACACAAGACTACCCAGATTC ++ +<(<2<&<)<<<7<8<<<<<<<<<<.<<<<<<<<<< +@EAS54_71:6:264:705:89 +AAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA ++ +<<<<<<<<<<;8<<<<<<<<<<<<<<<&<<,;;( +@EAS54_71:6:324:515:230 +AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAG ++ +7<<1<<<7<+<<<;<<<<<<<<<<<<<<<<<<<< +@EAS54_71:6:324:515:230 +CCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGG ++ +<<;<<<<<<<<<<<<<<<:<<<<8<<<4<<4<<34 +@EAS54_71:6:82:932:400 +GACACCCAACTAATATTTGTCTGAGCAAAACAGTC ++ +<<;<<72<<7<<<<<<<<<<;<<<+7<<<<<<<<< +@EAS54_71:6:82:932:400 +GTAATCTCTCTCCTCTTCGCTGCATCCCTGTCTT ++ +<<<<<<8<1<<<<8+<<&<<<8<<<<<<<+(,/8 +@EAS54_71:7:130:260:553 +AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA ++ +<*;<<7<);<<;9;<5<*<9<;<<;;<7<<<<<1< +@EAS54_71:7:130:260:553 +GTGAGAAGTTTGGAAAAACTATTTGAGGAAGCAC ++ +<<<<<1<<<<<<<<<<6<<81============= +@EAS56_59:2:60:677:921 +GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:3:149:953:349 +AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG ++ +2;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:3:149:953:349 +TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT ++ +<<<<<<<<;<<<<<<<<<<<;7:<:<<:<:;;::; +@EAS56_59:3:166:626:836 +AGTACAAAACTCACAGGTTTTATAAAACAATTAAT ++ +<;;7<<<<<<;<7;<<<<<<<<<<<<7<<<<<<<+ +@EAS56_59:3:166:626:836 +CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA ++ +<<<<<<<<<<<<<<<<<<<<9<<<<<<<<;<;;;9 +@EAS56_59:3:182:1002:639 +AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG ++ +<<;;9;9<<<<<<;<7;<;<<<<;;<<<;<<7;<< +@EAS56_59:3:182:1002:639 +AACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGA ++ +<<<<<<<<<<<<<<<<<<<<<9-<<<<4<;<;;<; +@EAS56_59:3:316:25:230 +GATGCCCCTTGGCCATCACCCGGTCCCTGCCCCAT ++ +8;8;<<;<;;<<<<<;<<<<<<<<<<<<<<<<<<< +@EAS56_59:3:316:25:230 +TGTCCTATGTACTTATCATGACTCTATCCCAAATT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<);2;; +@EAS56_59:4:119:651:88 +GATTGGATCTAATTTTTGGACTTCTTAAAGAAAAA ++ +<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:4:119:651:88 +GCTCAAAGAATGCCAGGAAGATACATTGCAAGACA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;< +@EAS56_59:4:262:928:237 +TGAGTTCAGGTAAAGGTGTGGAAAAAGATGTTCTA ++ +;<<<<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<< +@EAS56_59:4:262:928:237 +TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<< +@EAS56_59:4:267:394:437 +AAACATCATAAATACACACAAAAGTACAAAACTCA ++ +&<&,<8.<;<<<;<8<8<7<<<<<<<<<<<<<<<< +@EAS56_59:4:267:394:437 +GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACG ++ +<<<<<<<<<<;<;<<<<<;;<<<<<;<<:;8<;<8 +@EAS56_59:4:278:524:521 +CACATTAATACTATGTTTCTTATCTGCACATTACT ++ +<<<;<<;<<<<<<<;<<<<<<<<<<7;5;<<<;;< +@EAS56_59:4:278:524:521 +CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA ++ +7777,<;<<7<<<<;;<<;;<<<<<<<<<<<<<<< +@EAS56_59:4:329:577:757 +AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ++ +;;;888;<<<<<<6<<<2;<<<<<<;<<<<<<<<< +@EAS56_59:4:329:577:757 +TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG ++ +!!<<<<9;<:<<;<<<<<<<<;<<<<<<<<<<<<< +@EAS56_59:5:113:694:725 +CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT ++ +;::<<:<:<<<<<<<<<<:<:<<<<<<;<<<<<<< +@EAS56_59:5:113:694:725 +GTACACACGCTGTCCTATGTACTTATCATGACTCT ++ +<<<<<<<<<<<<9<<<<<:<<<<<<<<<<:;;<;; +@EAS56_59:5:125:137:58 +AACTATATGCTGTTTACAAGAAACTCATTAATAAA ++ +<<9;<<<<<;<;<<<<;<<<<<<;<<<<<<<<<<< +@EAS56_59:5:125:137:58 +GGTTTTATAAAACAATTAATTGAGACTACAGAGCA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;< +@EAS56_59:5:181:713:140 +AGGGGAAATAAAGTCAAGTATTTCCTGACAAGCAA ++ +<7<<<<<<<<<<<<7<7<6+<<<5;<;<2<;;+;; +@EAS56_59:5:181:713:140 +CTACAGAGCAACAAGGTAAAAAATTAACATTACAA ++ +78<+<7<-7;;;&<5<7<<<<7<<<<<<<<<<<7< +@EAS56_59:5:198:929:684 +AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA ++ +<<;<<<<<:<<<<<<<<<<<<<<<<<;<<<<<<<< +@EAS56_59:5:198:929:684 +GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA ++ +<7<<<<;<<<<<<<<<<<<;<<<<<:<<<<::<:7 +@EAS56_59:5:232:336:46 +ATTTTTTTTTTTTCTTTTCTCTTGTTTCTTTTTTT ++ ++<<<<<<<<<<<<6<<<<;<6<<&&<,3<<<<3,, +@EAS56_59:5:325:544:349 +AAAATTAAAGTTCAATACTCACCATCATAAATACA ++ +<<<<57<<<7<;6<<<<;<7<7;<<7<<<<<<<<< +@EAS56_59:5:325:544:349 +CAAGCCAGAAGAGATTGGATCTAATTTTTGGACTT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;;;<< +@EAS56_59:5:90:629:652 +AGCCCATACTTTACTGCTACTCAATATATCCATGT ++ +<<<<<<<<<<<<<<<<<<<<<<<:<;<<<<<<<<< +@EAS56_59:5:90:629:652 +ATATTGCTAGTGGGAGTATAAATTGTTTTCCACTT ++ +<:<7::<:<<<<<8<<<<<<<<<<<<<<<<<<<7< +@EAS56_59:6:187:925:547 +GGCTGATTATGAAAACAATGTTCCCAAGATACCAT ++ +43<<<:9<;;;:7<<<<6<:<8<-4-/,81<(48: +@EAS56_59:6:187:925:547 +TGAACTTCCACGTCTCATCTAGGGGAACAGGGAGG ++ +((988+&8<<;<09<;<<9<<4<<-<99<<;<9<; +@EAS56_59:6:199:327:965 +ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT ++ +<5<:<<<58<:<<<<<<8<<<<<<<<<;<<<<<<< +@EAS56_59:6:199:327:965 +NCAACAACCTTGAGAACCCCAGGGAATTTGTCAAT ++ +!,+*+++++++++++*+++++++**)+*+**+(** +@EAS56_59:6:227:657:95 +GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<85 +@EAS56_59:6:227:657:95 +GTCATCTATAAAGGAAATCCCATCAGAATAACAAT ++ +;3;<);<<<<<<<<<<<<18<<<<<<<<<<<<<<< +@EAS56_59:6:286:753:854 +TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC ++ +;<2<<<,57:<<9<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:6:286:753:854 +TTATCATGACTCTATCCCAAATTCCCAATTACGTC ++ +<<<<<<<<<<<<<<<<<<3<<<<<<9999<;<<9; +@EAS56_59:6:312:837:406 +AGGTGCACTAATGCGCTCCACGCCCAAGCCCTTCT ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:6:312:837:406 +CTGCACATTACTACCCTGCAATTAATATAATTGTG ++ +;<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:6:3:186:68 +AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT ++ +<<;<<<<<&:,<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:6:3:186:68 +TTACAAGCCAGAAGAGATTGGATCTAATTTTTGTA ++ +<<<<<<<<<<<<;<<<<<<<<<<<<;;<<<<<&%8 +@EAS56_59:6:89:457:591 +ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG ++ +<<<<<<<<<<<4<<<<<<<<<<<<8<7/4<<<<4+ +@EAS56_59:6:89:457:591 +CAGGTTTTATAAAACAATTAATTGAGACTACATAG ++ +797<<9<<<<<<<3<7<<<<<<<<<<)<<<<<07< +@EAS56_59:7:260:985:520 +TCCCTGTCACCCAATGGACCTGTGATATCTGGATT ++ +;9;7<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<< +@EAS56_59:7:260:985:520 +TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA ++ +<<<<<<<<<<<<<<<<<;:;<<;<:<<<,:1;)<; +@EAS56_59:7:318:679:883 +GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT ++ +<<;4<<;<:<<7<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:7:319:246:304 +CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;: +@EAS56_59:7:319:246:304 +TGTCACCCAATGGACCTGTGATATCTGGATTCTGG ++ +;;<;;;<<<<8;<<<<;<<<<<<<<<<<<<<<;<< +@EAS56_59:7:82:902:868 +CTGTCACCCAATGGACCTGTGATATCTGGATTCTG ++ +<<;;<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:7:82:902:868 +TTGCAACAACCTTGAGAACCCCAGGGAATTTGTCA ++ +<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_59:8:49:182:192 +ACACAAAAGTACAAAACTCACAGGTTTTATAAAAC ++ +<5<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<< +@EAS56_59:8:49:182:192 +GTTATGCCCTGCTAAACTGAGCATCATAAATGAAG ++ +=====================;============< +@EAS56_59:8:80:542:549 +AGTAAACTCTCAAATATTGCTAGTGGGAGTATAAA ++ +=9====7=;=======;;==;========<===== +@EAS56_59:8:80:542:549 +CTAAAAGCCCATACTTTACTGCTACTCAATATATC ++ +<<<<<<<<;<<<<<<<<:<<<<-<;;<;7<;3;9; +@EAS56_61:1:119:880:781 +ACAAATCTGCGCTTGTACTTCTAAATCTATAACAA ++ +;8<<;<<<<:<84<<<<:<<<<<<<<<<<<<5<<< +@EAS56_61:1:119:880:781 +ACATATGCACCTAACACAAGACTACCCAGATTCAT ++ +<<<<<<<<<<<<<<<<<<<<<<<<+<<<<7<<<<< +@EAS56_61:1:210:880:606 +GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAT ++ +<<<<<<<<<<<<<<<<<<;<<<<<<:<<<<3<<8& +@EAS56_61:1:210:880:606 +TCCTGGACCCTGAGAGATTCTGCAGCCCAGCTCCA ++ +.<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_61:1:303:184:14 +CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA ++ +<<<<<<8<0<<<<-<-98<<--<<<6;076;75+& +@EAS56_61:1:303:184:14 +CAATGGACCTGTGATATCTGGATTCTGGGAAATTC ++ +:<<.<;;7<:<<<<<<7<<<<<<<<<<<<<<<<<< +@EAS56_61:2:152:860:286 +AGACTATTGCCAGATGAACCACACATTAATACTAT ++ +<;<<<;<<0:<3<:<<2<<<<<7+<7+47<9(999 +@EAS56_61:2:152:860:286 +TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCA ++ +2;5;8<<;5<<<;<2<8<<<<<<;8<;<<<<;<<< +@EAS56_61:3:140:522:212 +CGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA ++ +<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<;95; +@EAS56_61:3:140:522:212 +GACAGGCTGCAACTGTGAGCCATCACAATGAACAA ++ +:;8;:::<<:<<<<<<<<<7<<<<<<<<<<<<<<< +@EAS56_61:3:165:665:220 +ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA ++ +<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_61:3:165:665:220 +GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG ++ +<<<<<<<<<<<<<<<<<<<<<;<;;<<<;;<;<<; +@EAS56_61:3:208:118:673 +AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA ++ +<<<<<;;<;<<<<<<<<<:<<<<<<<<<<<<<<<< +@EAS56_61:3:208:118:673 +GAACAGAGCTTTCAAGAAGTATGAGATTATGTAAA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;; +@EAS56_61:3:260:827:289 +AAACCTCATATATCAATATTAACTTTGAATAAAAA ++ +<<<<2<<<<;<<<<;<<<<<<:<<<&-<8<<88<3 +@EAS56_61:3:260:827:289 +TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA ++ +6;99+<<<<<<<<<<<<<<6<<<<<7<<<<<<<<< +@EAS56_61:3:45:758:616 +ATAAATTGTTTTCCACTTTGGAAAACAATTTGGTA ++ +<<;<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< +@EAS56_61:3:45:758:616 +CATACTTTACTGCTACTCAATATATCCATGTAACA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<;;< +@EAS56_61:3:5:45:441 +TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT ++ +;;58:<:<(:<<11<&<1<<;<<<<><<<<<<<<< +@EAS56_61:4:262:456:74 +TACCAAATGTGTTTATTACCAGAGGGATGGAGGGA ++ +<<<<<<<<<<<<<<<<<<<<:;;:;7:<::7<7:3 +@EAS56_61:4:262:456:74 +TGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT ++ +862;<<<:;<;<<<;;;<<<<;;<<<<<<<<<<<< +@EAS56_61:5:194:470:416 +AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT ++ +<<<7<<;<<<<<<<<<:<<<<<<<<<<<<<<<<<< +@EAS56_61:5:194:470:416 +TCAGAACTTGAAGACAAGTCTCTTATGAATTAACC ++ +<<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<< +@EAS56_61:5:209:824:866 +ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; +@EAS56_61:5:209:824:866 +CAGCAACAAAACCTCATATATCAATATTAACTTTG ++ +;<:&<<:<<<<;<<;<<<<<<<<<<<<<<<<<<<< +@EAS56_61:5:263:314:696 +AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG ++ +<<<<<<<<<<<<<<;<<<<<<<<<<<<:<<;<775 +@EAS56_61:5:263:314:696 +AAGATCAATTCAGCAAGAAGATATAACCATCCTAC ++ +<<;<;:<<<<7<<:<<<<<<<<<<<<<<<<<<<<< +@EAS56_61:5:272:240:950 +CAGCAGAGCTTGGATCTAATTTTTGGACTTCTTCA ++ +6<<&:<<<&<::;&7<<<3<;<<;<:;:<8:<<(< +@EAS56_61:5:272:240:950 +TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA ++ +37<<<<<<<<<<<<<<<<<<<<<<;;<;<<<<<<; +@EAS56_61:6:10:106:737 +ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT ++ +<<<;<1<;<<<<<<9<<<<;;<<<<<99<<94008 +@EAS56_61:6:10:106:737 +ACAATGATAAAAAGATCAATTCAGCAAGAAGATAT ++ +<-<<;<<<<<<<<<<<;<<<<;<<;<<<<<<<<<< +@EAS56_61:6:160:272:398 +AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA ++ +9<<<3<<<<<<<<<<<9<<;8<<<<;<+.;;89.. +@EAS56_61:6:160:272:398 +GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA ++ +3:,<,;;<<;<<1<<<<<<<;<;<<<<<<<<<<<< +@EAS56_61:6:226:370:91 +AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA ++ +<':<6<;<<<;2<;<-7;;;<<<<<<<;;;<<7;< +@EAS56_61:6:226:370:91 +AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA ++ +8<<<;<8<8<;<<<8<<;7<7;8784<<,;864<& +@EAS56_61:6:227:259:597 +AATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT ++ +<8<;2;9;<;;-92<;;;<;<<<<<<<<<<<<<<< +@EAS56_61:6:256:67:461 +TCATGTTTGTGTCTTTCTATGCATTTTTTTTTTTT ++ +!!7181!63:6-:!-163(-1%-18<<4<<<<<<< +@EAS56_61:6:256:67:461 +TTGTTTTTTCTTCTTTTCTCTTTTTTTTTTTTTTT ++ +*.%53.:)1+9;3397;1795507+335;.&51)5 +@EAS56_61:6:283:963:234 +AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG ++ +<<<<<<<<<<<<<<<;<<<<<<<<<<<;<<;<<;< +@EAS56_61:6:283:963:234 +ACATATGCACCTAACACAAGACTACCCAGATTCAT ++ +<5<;<;97;;:;<<7<;<<<<<<<<<<<<<<<<<< +@EAS56_61:6:307:208:477 +AAAGTCAAAATTAAAGTTCAATACTCACCATCATA ++ +<<<<<.<<<<<<<<<<<<;<;<<<<<<<<<<<<<< +@EAS56_61:6:307:208:477 +ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA ++ +<<<<<<<;<<;<<<<<<<<<<<<<<<<;:<<<88; +@EAS56_61:7:280:133:495 +AGATGAACCACACATTAATACTATGTTTCTTATCT ++ +<:<9:<<7:<6<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_61:7:280:133:495 +CCATCATGAAGCACTGAACTTCCACGTCTCATCTA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; +@EAS56_61:7:41:745:603 +CATTGCAAGACAGACTTCATCAAGATATGTAGTCA ++ +<<<<<<<<<<<<:<<<<<<<<<<<<<<<6<:8<<: +@EAS56_61:7:41:745:603 +TAATTTTTGGACTTCTTAAAGAAAAAAAAACCTGT ++ +;<<;;<;<8<<<<<<<<<<<;<<;<<<<<<<<<;< +@EAS56_61:7:7:682:201 +CATACAGTCATCTATAAAGGAAATCCCATCAGAAT ++ +0:8;5<8<1:78<<<<<<<<<<<<:8<<2<<<<:< +@EAS56_61:7:7:682:201 +GGAAAACCTCTTTAGTCTTGCTAGAGATTTAGACA ++ +<<<<<<<7<<7<<<<77&;-9<97<76<;<<993< +@EAS56_61:8:60:358:494 +GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACA ++ +<<<<<<<<<<<<<<<<<<<<<<<<<<:<:<<;;4; +@EAS56_61:8:60:358:494 +TACCCAGATTCATAAAACAAATACTACTAGACCTA ++ +7<77;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_61:8:7:171:402 +GTGATATCTGGATTCTGGGAAATTCTTCATCCTGG ++ +<<<<<<<<<<<<<<<;/<<<<;<<<<<;<<1<<<4 +@EAS56_61:8:7:171:402 +TCTACATGGCTGATTATGAAAACAATGTTCCCCAG ++ +:086::::847:<7<<7<<<<<<;7<<;<<<<7<< +@EAS56_63:1:119:446:185 +TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT ++ ++70730;<0<77;;<<<<<9<<<<<<9<<<<<<<< +@EAS56_63:1:119:446:185 +TTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAG ++ +<<<<<<<7<<<4<<<<9<<54<:<7<5:<::7-5; +@EAS56_63:1:145:71:26 +CTAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC ++ +<<<<<<<<<<<<<<<<<;<;;<<;<;<9<9;;99; +@EAS56_63:1:145:71:26 +TTTCTTATCTGCACATTACTACCCTGCAATTAATA ++ +882;8;<;;887<<<;;<<<<;<<<<<<<<<<<<< +@EAS56_63:2:119:161:322 +ATCAGAATAACAATGGGCTTCTCAGCAGAAACCTT ++ +<83<;<<;<;<<<<<<<<<<<<<<<<<<<<<<<<< +@EAS56_63:2:119:161:322 +CTTTAGTCTTGCTAGAGATTTAGACATCTAAATGA ++ +<<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<<<<<1>><<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_66:4:240:264:231 121 chr1 213 66 35M = 213 0 TGTAATGAAAACTATATTTATGCTATTCAGTTCTA 9;,;;62<9<)29<<<;96<<<;<<7<<<<<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_66:4:240:264:231 181 chr1 213 0 * = 213 0 CAACAGATCAAGAAGGAGGGGCAATGGACGAGTTA %15+5022))0&<<)0)+7:4+&<0<<:0<<<7<< MF:i:192 +EAS1_93:7:14:426:613 99 chr1 214 99 35M = 379 200 GTAATGAAAACTATATTTATGCTATTCAGTTCTAA ======;=;==========;;==3=;==-=<;<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:2:173:995:93 163 chr1 215 99 35M = 382 202 TAATGAAAACTATATTTATGCTATTCAGTTCTAAA <<<<<<<<<<<<<<<<<<<7:<<<<;:<:<<<<:7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_64:6:195:348:703 163 chr1 215 99 35M = 353 173 TAATGAAAACTATATTTATGCTATTCAGTTCTAAA <<<<<<<;<<<<<;:<<<<<<<<<<<<:<1:<:7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_108:2:62:879:264 163 chr1 216 99 35M = 396 215 AATGAAAACTATATTTATGCTATTCAGTTCTAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_61:4:83:452:970 99 chr1 216 99 35M = 379 198 AATGAAAACTATATTTATGCTATTCAGTTCTAAAT ==========================;======== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_1:2:64:1318:1711 99 chr1 218 99 35M = 389 206 TGAAAACTATATTTATGCTATTCAGTTCTAAATAT <<<<<<<<<<<<<<<<7<<<<<<<:<<<<<2<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_589:8:113:968:19 83 chr1 219 99 35M = 50 -204 GAAAACTATATTTATGCTATTCAGTTCTAAATATA 8;<;8;9<<<<<<<9<:<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:4:160:896:275 163 chr1 220 99 35M = 387 202 AAAACTATATTTATGCTATTCAGTTCTAAATATAG ============<====<==<====<==<==;=:6 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_591:6:181:191:418 163 chr1 221 99 36M = 387 202 AAACTATATTTATGCTATTCAGTTCTAAATATAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<988 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:7:242:354:637 99 chr1 222 99 36M = 417 231 AACTATATTTATGCTATTCAGTTCTAAATATAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<6<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_589:1:122:77:789 163 chr1 223 99 35M = 396 208 ACTATATTTATGCTATTCAGTTCTAAATATAGAAA <<<:<4<<9<:7<<<:<<<7<<<<<<<<<<9<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_591:5:42:540:501 147 chr1 224 99 36M = 60 -200 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_591:6:155:12:674 83 chr1 224 99 36M = 52 -208 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT ;<<<<<<<<<<;<<<<;<<<<8<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_593:4:106:316:452 147 chr1 224 99 36M = 49 -211 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT :<<<<<;<<<<:<<:<<<<<<7<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:5:89:525:113 163 chr1 227 78 40M = 397 210 TATTTATGCTATTCAGTTATAAATATAGAAATTGAAACAG <1<7<6;+0;7;7'<70;-<7<:<:<<5<<:9<5:7:%:7 MF:i:18 Aq:i:39 NM:i:1 UQ:i:12 H0:i:0 H1:i:1 +EAS54_65:3:321:311:983 147 chr1 228 99 35M = 51 -212 ATTTATGCTATTCAGTTCTAAATATAGAAATTGAA ;;4;;<7<<<<<<77<<<<<<<<<<17<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_65:8:76:493:708 147 chr1 229 44 35M = 73 -191 TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA 5/)63.&1517(544(055(0454&7706566679 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_71:2:125:628:79 163 chr1 229 99 35M = 400 205 TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA ==================<6<====<<:<==7;:: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_32:5:78:583:499 83 chr1 229 74 35M = 37 -227 TTTACGCTATTCAGTACTAAATATAGAAATTGAAA &6&9774&<;67<44&-4<;<9<7<<<<<;<<<<< MF:i:18 Aq:i:37 NM:i:2 UQ:i:27 H0:i:0 H1:i:1 +EAS54_67:3:175:730:949 83 chr1 230 99 35M = 70 -195 TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC <<<<;+<<<<7<;<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:1:84:275:1572 163 chr1 230 99 35M = 394 199 TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC /6;;;4;;;;;;;;7;;4;.4;;;;;6;;;77077 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_108:4:248:753:731 99 chr1 231 99 35M = 402 206 TATGCTATTCAGTTCTAAATATAGAAATTGAAACA <<<<<<<<<<<8<<<<<<<<<<<<:<<<<&<:<.: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:1:9:1289:215 99 chr1 231 99 35M = 394 198 TATGCTATTCAGTTCTAAATATAGAAATTGAAACA ;;;;;;9;;;67;;;;;99;9;;;;;;;;977747 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_595:7:188:802:71 163 chr1 232 99 35M = 415 218 ATGCTATTCAGTTCTAAATATAGAAATTGAAACAG <<<<<<<<<;<<<<<9<<<:<<<:<<<<<<:<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:7:252:171:323 83 chr1 234 99 35M = 43 -226 GCTATTCAGTTCTAAATATAGAAATTGAAACAGCT ;8<;<=3=6==:====;;======;========== MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS192_3:5:223:142:410 147 chr1 235 99 35M = 60 -210 CTATTCAGTTCTAAATATAGAAATTGAAACAGCTG 8;<<<;<<<<;<<<<<<;<;<<<<<<<<<<<<;<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_30:1:243:10:911 83 chr1 236 99 35M = 63 -208 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ;<;;;<4;9:<<<;<<;<<<<<;;<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:6:5:730:1436 163 chr1 236 99 35M = 403 202 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ;;;;;;;;;;;;;;;;;;8;;;;;8;;;;;67777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:2:57:1672:1890 121 chr1 236 75 40M = 236 0 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGTGTTTA :;;;9<8;;*<<<<<<:<<<<<<<<1:<<<<<<<<<<<7< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:2:57:1672:1890 181 chr1 236 0 * = 236 0 CCCCCCCCCCCCCCCCCAGCCACTGCGGCCCCCCCAGCCA -+)%)'-'+,,<066,))090+:&486083:5&&:<<5<0 MF:i:192 +EAS1_105:2:299:360:220 99 chr1 237 99 35M = 403 201 ATTCAGTTCTAAATATAGAAATTGAAACAGCTGTG <<<<<<<9<9<<<<<<<<<<<<<<<<<5<;<0<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:2:24:1037:84 163 chr1 238 99 35M = 415 212 TTCAGTTCTAAATATAGAAATTGAAACAGCTGTGT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<;:<57< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_105:3:86:823:683 163 chr1 240 99 35M = 408 203 CAGTTCTAAATATAGAAATTGAAACAGCTGTGTTT <<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;9<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_53:4:130:568:978 99 chr1 246 88 35M = 434 223 TAAATATAGAAATTGAAACAGCTGTGTTTAGTGAC 7<<;<<;<7<:;<7<<<<<<<<);4;+<7+3+%;< MF:i:18 Aq:i:24 NM:i:1 UQ:i:26 H0:i:1 H1:i:0 +EAS114_45:4:73:1208:495 163 chr1 246 99 35M = 431 220 TAAATATAGAAATTGAAACAGCTGTGTTTAGTGCC ;;;;;;;;;;;;;;;;;;;;;;;;5;;;;;37377 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_97:7:264:642:506 99 chr1 247 99 35M = 420 208 AAATATAGAAATTGAAACAGCTGTGTTTATTGTAT <<;<<<<<<;<<<;:;;:;;<<;<<<<;*+;*&.4 MF:i:18 Aq:i:56 NM:i:3 UQ:i:28 H0:i:1 H1:i:0 +EAS114_28:5:104:350:749 163 chr1 247 99 36M = 415 204 AAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT <<8<<<<<<<<<<<;<<<<<<<<0;<<<9;<85;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_61:6:227:259:597 147 chr1 248 99 35M = 61 -222 AATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT <8<;2;9;<;;-92<;;;<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_32:7:113:809:364 99 chr1 250 99 35M = 413 198 TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<7<;<;<<<4 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:2:218:877:489 83 chr1 250 86 35M = 80 -205 TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG 9<<<8<<<;<9<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_97:7:20:979:96 83 chr1 254 99 35M = 79 -210 GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA '9996;(:;-<;1<<<<=<<<<=<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:2:259:219:114 99 chr1 254 99 35M = 411 192 GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA <<<<<<<<<<<<<<<;<<<<<<7<7<<<<<0<<9< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_39:6:13:1034:1144 99 chr1 256 99 35M = 429 208 AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA <<<<<<<<<<<<<<<<<<<<<<<<3<<<;<<;<++ MF:i:18 Aq:i:69 NM:i:2 UQ:i:48 H0:i:1 H1:i:0 +EAS221_1:2:29:1486:672 147 chr1 256 99 35M = 79 -212 AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA <<:<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<++ MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0 +EAS139_11:7:46:695:738 163 chr1 259 74 35M = 428 204 TGAAACAGCTGAGTTTAGCGCCTGTGTTCACATAG <;<<<<;<<),&4<3<<7&7<0;)).3;79;7<;0 MF:i:130 Aq:i:74 NM:i:3 UQ:i:18 H0:i:0 H1:i:0 +EAS139_11:8:26:1221:222 163 chr1 261 99 35M = 446 220 AAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_64:3:190:727:308 147 chr1 263 99 35M = 103 -195 ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_26:3:284:261:124 83 chr1 263 99 35M = 79 -219 ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ===27===.====&===========;;======== MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_34:7:141:80:875 147 chr1 265 99 35M = 110 -190 AGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCA 6/<;84<;<;<<<<<<5<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:3:24:1135:563 163 chr1 266 99 40M = 446 220 GCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAACC <<<<:<<<<:1:<<<<<<.<<<<<<<<;<;;;43+:30:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:2:90:986:1224 83 chr1 267 99 35M = 67 -235 CTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAAC <7*37;;;;;;;9<<;<7<<<<<<<<<<<;;<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:7:287:492:169 99 chr1 269 99 36M = 449 216 GTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAAC <<<7<<<<<<<<<<<<<<<<<<<<<<<8;;<;6<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_4:1:48:9:409 99 chr1 271 75 18M5I12M = 464 228 GTTTAGTGCCTTTGTTCACATAGACCCCCTTGCAA <<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 +EAS139_19:1:87:1222:878 163 chr1 272 10 40M = 435 203 TATAGGGCCTTTGTTCAAACCCCTTGCAACAACCTTGAGA &+6<6&<:<<9<1112<<;)9227>>>>>>>>>>>>>;<>>>>><<>>>;<+<>=>>+==>>==<==<=8=><:;8/;7<<<<<<<<;<:<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_591:2:240:603:890 83 chr1 740 99 36M = 590 -186 GCTCCCAAGAGGGAAAGCTTTCAACGCTTCTAGCCA ;+&+//&<<<<<<<<<<9<<<8<<<<9<<<<<<<<< MF:i:18 Aq:i:66 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +B7_591:7:129:956:115 163 chr1 740 99 36M = 927 223 GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;877- MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_53:4:168:528:288 83 chr1 740 99 35M = 570 -205 GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCC 8<%<31;<<;<;<<<<<<<;<<<<<<<<<<;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_65:8:275:851:240 147 chr1 743 99 35M = 561 -217 CCCCAGAGGGAAAGCTTTCAACGTTTCTAGCCATT 66614/&3616630666&66666&66666868666 MF:i:18 Aq:i:31 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 +EAS188_7:6:205:873:464 147 chr1 743 99 35M = 552 -226 CCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATT <-((+:+;289<--;<;-;<:;;<<<;;<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_65:6:37:610:260 163 chr1 745 99 35M = 913 203 CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC <<<;<;<<7<<<<<<<<<<<<<<;6<963;;;3;1 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS192_3:7:93:945:176 147 chr1 745 99 35M = 582 -198 CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC 6;;;8<<3<<8.<;6)<<<<<9<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_593:6:61:628:681 83 chr1 746 99 36M = 586 -196 CAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCTT 95<<<<<<<<;<<<<;<<<:<<;;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_65:7:288:552:440 83 chr1 747 87 35M = 560 -222 AGAGGGAACGCTTTCAACTCTTCTAGCCATTTCTT 9<<%'%<<.2<<<<<<<<5:<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:2 UQ:i:33 H0:i:0 H1:i:0 +EAS56_53:2:170:265:818 163 chr1 748 10 35M = 920 207 GAGGGGAAGCTTTCAACGCTTCTAGCACTTTCTTT <<<<<(5/959<8.<9<8<<<2<&59&&:22:8+( MF:i:18 Aq:i:10 NM:i:3 UQ:i:17 H0:i:0 H1:i:0 +B7_595:2:251:121:479 83 chr1 750 99 35M = 572 -213 GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG <<<<<6'..663;&<<;<<9<<<9<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:8:67:1797:1931 147 chr1 750 99 35M = 562 -223 GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_103:2:226:302:758 83 chr1 751 99 35M = 556 -230 GGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGG ;<<<<9;<<<<<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:33 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_32:2:163:618:570 83 chr1 751 99 35M = 571 -215 GGAAAGCTGTCAACGCTTCTAGCCATTTCTTTTGG <9774<88&:8<:8<8:8<8<<<<<;88<88<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 +EAS1_97:3:73:292:429 99 chr1 752 99 35M = 920 203 GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTTGC <<<<<<<<<<7<<;<<<<<<<2<<<5<<<<<:%)< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 +EAS1_108:3:82:356:253 99 chr1 752 99 35M = 927 210 GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC ===================<========;===39= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_30:6:62:386:959 147 chr1 752 99 35M = 594 -193 AAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC %;71131((<<6<92(+<1<<;<-3<8<<;<;;<< MF:i:18 Aq:i:57 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 +EAS51_62:3:263:74:407 83 chr1 754 99 35M = 574 -215 AAGCTTTCAACGCTTCTAGCCATTTCTTTTGGCAT ;;88<::+;<)<5<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_597:3:67:620:344 99 chr1 755 99 35M = 905 185 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT <<<<2<:2<<<<<<7<<<<:<<*<<<<<<***3<< MF:i:18 Aq:i:33 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_610:6:148:776:486 83 chr1 755 99 35M = 578 -212 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT ;:<<<;<<;<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_61:3:150:933:810 83 chr1 755 99 35M = 593 -197 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT :89===:=:=;;==;==================== MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_64:4:102:467:897 99 chr1 756 97 35M = 940 219 GCTTTCAACGCTTCTAGCCATTTCTTTTGTCTTTT <<<<9<<<<9<2<<<&,/=====>=>=>>>=>>==>=>>>>>> MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_595:3:297:637:86 83 chr1 869 99 35M = 704 -200 TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG <:75<;<;;<<<<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:1 UQ:i:26 H0:i:1 H1:i:0 +EAS54_65:3:290:558:349 147 chr1 869 99 35M = 719 -185 TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG 2;2;;'5&;<<5<<;5/<<<<<7<<;+;<<+1<8< MF:i:18 Aq:i:59 NM:i:1 UQ:i:6 H0:i:1 H1:i:0 +EAS1_95:3:308:956:873 99 chr1 870 99 35M = 1068 233 CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC <<<<<<<<<<<<<;<;<;1<<<<<.<9<;<<<<+; MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_78:7:147:64:416 147 chr1 870 99 35M = 701 -204 CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC /;49;:6<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_593:4:30:812:345 163 chr1 871 99 36M = 1036 201 TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCTC <<<<<<<7<;<<7<;77;3<&0-;<5<;6<1'13<: MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_73:7:134:243:630 163 chr1 871 99 35M = 1052 216 TCATCTAGGGGAACAGGGAGGCGCACTAATGAGCT <<<:<<<<::1:818;;&::<>.; MF:i:18 Aq:i:35 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 +EAS54_81:2:31:98:804 147 chr1 982 99 35M = 805 -212 CTTTACTGTCATAACTATGAAGAGACTATTGCCAG ====;========7===================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_103:2:235:805:373 163 chr1 983 99 35M = 1146 198 TTTACTGTCATAACTATGAAGAGACTATTTCCAGA <<<<<<<<<<<<<<<<<<<<;<;<<<<<<;;<99; MF:i:18 Aq:i:74 NM:i:1 UQ:i:26 H0:i:1 H1:i:0 +EAS114_28:5:11:868:62 99 chr1 983 99 36M = 1154 207 TTTACTGTCATAACTATGAAGAGACTATTGCCAGAT <<<<<<<<<<<<<<<<<<<<:<<<;<<<<(7:7039 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_81:2:280:512:316 163 chr1 984 99 35M = 1159 210 TTACTGTCATAACTATGAAGAGACTATTGCCAGCT ==<========6==4==6;;==:===;=2/:+8%6 MF:i:18 Aq:i:68 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 +EAS1_93:5:292:122:666 99 chr1 985 99 35M = 1159 209 TACTGTCATAACTATGAAGAGACTATTGTCAGATG <<<<<<6<<<<<<<<8;<<<<<<<<<<3&9+;;(; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +EAS56_53:1:23:403:981 99 chr1 985 99 35M = 1151 201 TACTGTCATAACTATGAAGAGACTATTGCCAGATG <8<<<;<<<<<<;<<<<<<8;<<<9<9,3;,6(91 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:7:33:1566:588 99 chr1 985 76 35M = 1166 216 TACTGTCATAACTATGAAGAGCCTATTGCCAGATG <;.;;;;6;;;;6;;29;;;<+9;;;.3;;73797 MF:i:18 Aq:i:37 NM:i:1 UQ:i:10 H0:i:0 H1:i:1 +EAS139_11:7:92:367:1495 83 chr1 987 99 35M = 820 -202 CTGTCATAACTATGAAGAGACTATTGCCAGATGAA <8<88<<<<7<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS220_1:8:38:1576:1923 83 chr1 987 99 35M = 822 -200 CTGTCATAACTATGAAGAGACTATTGCCAGATGAA 8;<98<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_595:7:190:481:295 163 chr1 990 99 35M = 1161 206 TCATAACTATGAAGAGACTATTGCCAGATGAACCA <<<<<<<<<<<<<<<<<<<<<<9<<<<<9<7<2:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_32:7:168:117:441 99 chr1 990 99 35M = 1151 196 TCATAACTATGAAGAGACTATTGCCAGATGAACCA <<3<<<<<<<<<<<<<<<<<<<+<<17;<;:<995 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_73:3:239:796:221 163 chr1 992 99 35M = 1160 203 ATAACTATGAAGAGACTATTGCCAGCTGACCCCCC <<<7<<7<<7<<7<;<<<<<,;;,+'<+/+99%:' MF:i:18 Aq:i:37 NM:i:4 UQ:i:26 H0:i:0 H1:i:1 +EAS220_1:4:69:88:1154 147 chr1 992 99 35M = 805 -222 ATAACTATGAAGAGACTATTGCCAGATGAACCACA <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_3:8:34:956:1309 99 chr1 994 99 35M = 1168 209 AACTATGAAGAGACTATTGCCAGATGAACCACACA <<<<<<7<<<<<<<<<<<6<<<<<<<<<<<:<8<8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_108:5:229:717:121 99 chr1 995 99 35M = 1150 190 ACTATGAAGAGACTATTGCCAGATGAACCACACAC =================<)=<4<0=.<<<71;41& MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +EAS219_1:1:67:191:668 99 chr1 995 99 35M = 1134 174 ACTATGAAGAGACTATTGCCAGATGAACCACACCT <<<<<<<<<<<<<<<<<6<<;<;<;<<<<<<6;%2 MF:i:18 Aq:i:74 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 +EAS51_64:3:309:303:278 163 chr1 996 99 35M = 1178 217 CTATGAAGAGACTATTGCCAGATGAACCACACATT <<<<<<<<<<<<<<<<+<<+<<7<<<<<5<<<;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:8:60:1020:1259 99 chr1 996 99 35M = 1157 196 CTATGAAGAGACTATTGCCAGATGAACCACACATT <;<<<<;<<<<<<<<<;<<<<<<<8<<<<<:<:<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_4:7:89:1487:520 83 chr1 997 99 35M = 805 -227 TATGAAGAGACTATTGCCAGATGAACCACACATTA 4;;/<<<<<:<;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_610:4:15:805:420 163 chr1 998 35 35M = 1164 201 ATGAAGAGACTATTCACATGTGAACCACACATTTA ;73;;;;67.;1<<+*.;*&<4947<&474&*9*( MF:i:130 Aq:i:35 NM:i:4 UQ:i:33 H0:i:0 H1:i:0 +EAS56_57:3:119:761:239 147 chr1 999 99 35M = 813 -221 TGAAGAGACTATTGCCAGATGAACCACACATTAAT ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_34:7:142:457:584 99 chr1 999 99 35M = 1160 196 TGAAGAGACTATTTCCAGATGAACCACACATTAAT <<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_63:7:190:95:706 147 chr1 1078 99 35M = 920 -193 TTGTGTCCATGTACACACGCTGTCCTATGTACTTA 9;97437;<;;<<;<;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_589:1:101:825:28 83 chr1 1079 99 35M = 879 -235 TGTGTCCATGTACACACGCTGTCCTATGTACTTAT 0;0'0;<<<<<<8<;<<<<;;3<<;;<<<8<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_66:4:188:460:1000 99 chr1 1080 99 35M = 1251 206 GTGTCCATGTACACACGCTGTCCTATGTACTTATC <<<<<<<<<<<<<<<<7<<;:4;44<;;:8;;9;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_95:3:268:523:511 99 chr1 1081 99 35M = 1241 195 TGTCCATGTACACACGCTGTCCTATGTACTTATCA <<<<<<<<<<<<<<<<<<<<;<<<<6<:9<<3<44 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:6:54:263:585 99 chr1 1081 99 36M = 1254 209 TGTCCATGTACACACGCTGTCCTATGTACTTATCAT <<<<<<<<<<<<<<<<<<<:;<<;<:;::<<;;:;4 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_66:7:174:987:334 83 chr1 1082 99 35M = 908 -209 GTCCATGTACACACGCTGTCCTATGTACTTATCAT ,;<;;<<<&<<<1<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_71:6:224:932:942 99 chr1 1082 99 34M = 1250 203 GTCCATGTACACACGCTGTCCTATGTACTTATCA <<<<<<<<<<<<<<<<<<<<<<;<<<<7<<(;3, MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:1:12:1296:358 99 chr1 1082 96 35M = 1252 205 GTCCATGTACACACGCTGTCCTATGTACTTATCAT ;;;6;7;7;;;;;7;9;;-*1;9;699/99/7477 MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_32:2:306:119:56 147 chr1 1083 99 35M = 919 -199 TCCATGTACACACGCTGTCCTATGTACTTATCATG ;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_95:4:66:179:118 163 chr1 1084 99 35M = 1262 213 CCATGTACACACGCTGTCCTATGTACTTATCATGA <<<<<<<<<<<<<<<<<<<<<<<<<<:<<;<<6<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_105:2:110:584:649 99 chr1 1084 99 35M = 1266 217 CCATGTACACACGCTGTCCTATGTACTTATCATGA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<::<38 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_1:4:28:315:310 163 chr1 1085 99 35M = 1242 192 CATGTACACACGCTGTCCTATGTACTTATCATGAC <<<<<<<<<<<<<<<<<<<<<:<+.<<.<+7<*17 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_595:7:242:4:593 147 chr1 1086 99 35M = 905 -216 ATATACACACGCTGTCCTATGTACTTATCATGACT 1.%55877+8+88808887+7;7;18:8;;;.&;8 MF:i:18 Aq:i:53 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 +EAS1_93:1:131:946:353 163 chr1 1087 99 35M = 1249 197 TGTACACACGCTGTCCTATGTACTTATCATGACTC <<<<<<<<<<<<<;<<<<;;<<<<<<<;<:52;<2 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:4:4:1732:88 99 chr1 1087 99 35M = 1265 213 TGTACACACGCTGTCCTATGTACTTATCATGACTC <<<<<<<<<<<<<<<<<2<8;8<;<8;<2;2:<:< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_595:4:58:703:72 83 chr1 1088 99 35M = 905 -218 GTACACACGCTGTCCTATGTACTTATCATGACTCT 5&<<7;+95;7'6<<<<<.<<<<<;<<9<7<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_59:5:113:694:725 163 chr1 1088 99 35M = 1266 213 GTACACACGCTGTCCTATGTACTTATCATGACTCT <<<<<<<<<<<<9<<<<<:<<<<<<<<<<:;;<;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_65:5:278:848:765 147 chr1 1088 99 35M = 920 -203 GTACACACGCTGTCCTATGTACTTATCATGACTCT 7;;<;5<55<<;;<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:6:234:787:12 163 chr1 1092 97 35M = 1257 200 ACACGCTGGCCTATGTACTTATAATGACTCTATCC <;<<<9<<&+9;3;<993;<9<+94;9&41;08%9 MF:i:18 Aq:i:24 NM:i:2 UQ:i:15 H0:i:0 H1:i:0 +EAS218_1:4:15:856:340 147 chr1 1093 99 35M = 936 -192 CACGCTGTCCTATGTACTTATCATGACTCTATCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_62:2:258:266:101 163 chr1 1094 99 35M = 1285 226 ACGCTGTCCTATGTACTTATCATGACTCTATCCCA <<<<<<<<<<<<<<<<<<5<;,<-2<<<<;68<<6 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_59:2:177:552:234 147 chr1 1094 99 35M = 903 -226 ACGCTGTCCTATGTACTTATCATGACTCTATCCCA ::;:=;=99=====;;====;==========<=== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_30:1:134:379:893 147 chr1 1095 99 35M = 927 -203 CGCTGTCCTATGTACTTATCATGACTCTATCCCAA 7137::;<<<<<<<;<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_105:8:256:404:584 147 chr1 1096 99 35M = 928 -203 ACTGTCCTATGTACTTATCATGACTCTATCCCAAA &&326+23<3<<<+:<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_595:3:57:735:151 99 chr1 1121 94 35M = 1314 228 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC <<<<<<<<8<<8<:<<*<:<<<4<<<;,<<<<:<: MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_81:8:142:858:903 147 chr1 1121 99 35M = 943 -213 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC <<<<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:7:247:522:670 83 chr1 1121 99 35M = 960 -196 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC ;;;9;:<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:3:75:732:442 99 chr1 1121 99 40M = 1293 212 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG <<<<<;<<<<<9<<<;<<;<<<5<<;8<<<<<<<<;:9%% MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_99:7:183:645:699 99 chr1 1122 86 35M = 1281 194 TATCCCAAATTCCCAATTACGTCCTATCTTCTTCT <<9<9<<<<<<<<<;<<;<<*175;173<;;;<-/ MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS192_3:6:175:437:950 163 chr1 1126 99 35M = 1298 207 CCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:59 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_63:3:93:1002:845 83 chr1 1129 99 35M = 954 -210 AATTCCCAATTACGTCCTATCTTCTTCTTAGGGAA <<::;;;<<<<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_62:6:50:542:881 163 chr1 1132 99 35M = 1324 227 TCCCAATTACGTCCTATCTTCTTCTTAGGTAAGAA <<<<<4<09<<9<<2<<<<<<<<<<<2/.&2<%<7 MF:i:18 Aq:i:63 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +EAS1_99:3:118:851:285 83 chr1 1133 99 35M = 953 -215 CCCAATTACGTCCTATCTTCTTCTTAGGGAAGAAC 3+7<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS219_1:1:67:191:668 147 chr1 1134 99 35M = 995 -174 CCAATTACGTCCTATCTTCTTCTTAGGGAAGAACA <<<<<7<<7<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_595:7:166:203:416 83 chr1 1136 99 35M = 963 -208 AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC <<<<<<<<::<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:2:15:1497:1530 99 chr1 1136 99 35M = 1314 213 AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC 0<;;;9;;86<;;;<<&<<.<<;)3;7;654-471 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_65:8:206:563:262 83 chr1 1137 99 35M = 971 -201 ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT <<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_26:4:40:352:151 99 chr1 1137 99 35M = 1327 225 ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT <<<<<<<<<<<<<<<;<<9<<<<:<<<<;<99<3< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_593:7:67:302:762 99 chr1 1138 99 36M = 1313 211 TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<;;65;<-<;<:8<<<3 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_97:5:84:927:843 147 chr1 1138 99 35M = 938 -235 TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTT 588;<:<<<<<<<6<<<<;<<<:/<<3<:;<*<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_99:5:147:479:41 163 chr1 1139 99 35M = 1322 218 TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<::6<<;<<<;;9;;6 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_105:3:329:177:267 83 chr1 1139 99 35M = 962 -212 TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_589:7:72:916:763 163 chr1 1142 99 35M = 1340 233 GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT ==7>==9>=7=>=>>=>> MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_65:4:91:267:655 147 chr1 1365 99 35M = 1204 -196 TGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGT ;,:;5:<6:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:2:91:856:504 99 chr1 1366 99 35M = 1520 189 GTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTT <<<<<<<<<<<<<<7<<<<<<<7<<<&;<<<&&<& MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +EAS1_108:2:170:326:433 99 chr1 1367 99 35M = 1535 203 TTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGG =====<=9===:=<:==2=======2:===9==/5 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:6:132:717:233 99 chr1 1368 99 35M = 1529 196 TGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGA <<<<<<<<<<<<;<<<<<<<<<<<7<<<<&-<4<1 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:1:14:420:712 99 chr1 1368 99 40M = 1525 197 TGTTGGTTTTCTGTTTCTTTGTTTGATTTTTTTGAAGACA <<<<<<<<<<<<;<<<<<<<;<<<-;<<<&,<&*8111:6 MF:i:18 Aq:i:66 NM:i:3 UQ:i:21 H0:i:1 H1:i:0 +EAS114_39:4:43:1047:1626 163 chr1 1369 99 35M = 1523 189 GTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAA <<<<<<<<<<<<<<<<<<<:<<<:<<<<:+;-4:( MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:2:20:413:1334 147 chr1 1370 99 35M = 1215 -190 TTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAG 88878777;:;:1:;9;;;6;;;6;9;;;;;296; MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_62:5:154:669:853 83 chr1 1371 99 35M = 1193 -213 TGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGA <::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_610:7:117:857:942 99 chr1 1372 99 35M = 1527 190 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC <<<<<<<<<<<<<<<<<<<<<<<<<:6<;;7;9<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:6:145:144:796 147 chr1 1372 99 35M = 1181 -226 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC ;<<<;<<<<<<<<<;<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_32:6:88:162:587 147 chr1 1372 99 35M = 1189 -218 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC 386;;388-<8;<;68<<;;<;<6<<<8<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:8:73:108:1621 99 chr1 1373 99 35M = 1532 194 GTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACA <<<<<<<<71<<<<<<<<<+<<<<70:0<9<<61< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_34:6:127:153:861 147 chr1 1374 99 35M = 1202 -207 TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT :;:6;9<<1;<<95<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:2:152:765:744 163 chr1 1374 99 35M = 1534 195 TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT <<<<<<<<<<<<<<<<<<:<<<<<<<<&<7293<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_73:3:313:827:992 147 chr1 1379 99 35M = 1197 -217 TGTTTCTTTGTTTGATTTGGTGGAAGACATAATCC '187:1'<75<.*<<:5<..<<*<<917<<7<<17 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_64:3:7:268:263 121 chr1 1381 22 35M = 1381 0 TTGCGTTATTTGAGTTGGTGGAAGACATAATCCCA ',)*&2<$7+<<<'<-<7<<<<<<<7<<7><>;>+>>/;>>=>=>=:>><>=<<==;)<=8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_4:7:85:923:726 147 chr2 199 99 35M = 43 -191 GTAAAGTAACTGAACCTATGAGTCACAGGTATTCC <:<<<%3<<1<<86<<-<<<<<<<<<<<<6<<1<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_103:5:285:241:560 83 chr2 200 99 35M = 37 -198 TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT :<<<<;<<,<<<<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_30:6:41:461:436 163 chr2 200 74 35M = 389 224 TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT <<<<<<<<<<<<<<<<<<<:<<<<<<<<;<;;;:; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_61:6:25:949:33 99 chr2 201 99 35M = 383 217 AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG =;===/8========*==&;6=&=&:=6&:=::67 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_3:2:60:590:1760 99 chr2 201 99 35M = 376 210 AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG <:<<<<<2<<<<:<::<<<::<<<<<6<<<<<<<6 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:6:86:693:234 163 chr2 202 82 35M = 388 221 AAGTAACTGAACCTATGAGTCACAGGTATTCCTGA ;;;;;;;;;;;;;;;;9;;;;;;;;99;;&70777 MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:6:4:223:776 163 chr2 203 93 35M = 387 219 AGTAACTGAACCTATGAGTCACAGGTATTCCTGAG <<<<<<<<<<<<<<<<<<<<<<<<<9<<<:;<;2< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_39:3:88:84:1558 99 chr2 203 95 35M = 394 226 AGTAACTGAACCTATGAGTCACAGGTATTCCTGTG <<;<<<<<<<<<<<<;;<<<<<<<::<<<<<<7&< MF:i:18 Aq:i:22 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +B7_597:2:168:829:88 163 chr2 205 99 35M = 369 199 TAACTGAACCTATGAGTCACAGGTATTCCTGAGGA <<<<<<<<<<<<<<<<<<<<<<<6<<<<<<9;4;2 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:1:168:389:889 147 chr2 205 99 36M = 37 -204 TAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA ;<<;;56;==================8========8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_71:5:81:685:141 99 chr2 207 85 34M = 382 210 ACTGAACCTATGAGTCACAGGTATTCCTGAGGAA <<<<<<<<<<<<<<<<<<<<<;;<<;<<<',7,7 MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:4:26:1312:1400 99 chr2 207 99 40M = 385 218 ACTGAACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA <<<<;<<<:<<:<;<:<<<;:;<<<<<<:<8<1;;:::88 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_71:4:127:725:381 83 chr2 209 99 34M = 39 -204 TGAACCTATGAGTCACAGGTATTCCTGAGGAAAA +<<.<<;<;<<<3;<;<<<<<<6<8;<<<<<<<1 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:2:19:736:559 99 chr2 209 99 35M = 370 196 TGAACCTATGAGTCACAGGTATTCCTGAGGAAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_26:3:117:284:589 83 chr2 210 99 35M = 43 -202 GAACCTATGAGTCACAGGTATTCCTGAGGAAAAAG ==8==;==================;========== MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_610:5:120:596:847 163 chr2 211 83 35M = 410 234 AACCTATGAGTCACAGGTATTCCTGAGGAAAAAGA <<<<<<<<<<<<<;<<<9<<<<<<<;:<62;58;2 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1 +B7_610:5:51:904:391 163 chr2 212 97 35M = 401 224 ACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA <<<<<<<<<<<<<<<<<;<<<<<;:;<2<6;;;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_11:8:96:1314:1448 163 chr2 213 93 35M = 388 210 CCTATGAGTCACAGGTATTCCTGAGGAAAAATAAA <<<<<<<<<<<<<<<<<<<<<<<<5<4<<<<-<<< MF:i:18 Aq:i:18 NM:i:1 UQ:i:12 H0:i:1 H1:i:0 +EAS139_19:3:73:1158:535 163 chr2 213 99 40M = 377 204 CCTATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTG <<<<<<<<<<<<<<<<<<<<<<8<;;<<<<<9<<9::8:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_591:2:223:583:968 147 chr2 215 88 36M = 47 -204 TATGAGGCACAGGTATTCCTGAGGAAAAAGAAAAAG 1<';<<&%-:<<<<<:66%<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +EAS1_97:3:160:173:889 163 chr2 215 99 35M = 379 199 TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA <<<<<<<<<<<<<<<<<<<<;0<7<<;<<<;7<09 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_39:1:28:350:895 83 chr2 215 95 35M = 48 -202 TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA :<;<<<:;<-<<<<<4;77<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_53:4:45:707:147 163 chr2 216 99 35M = 424 243 ATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAG <<<<<<<<<<<<&<<<<:<<9<<<9<<<<75;;;< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS220_1:8:18:1757:95 99 chr2 216 45 35M = 374 193 ATGAGTCGCAGGTATTCCTGAGGAAAAAGAAAAAG <<<<<<<<<<<<<<<<<<<1<:<<<<<<:<<<;:< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 +EAS51_66:6:310:747:415 163 chr2 217 99 35M = 387 205 TGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGT <<<<<<<<<<<<<<<<<<:<<<<<;<<<<<;<;<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:2:114:938:216 147 chr2 218 99 36M = 63 -191 GAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGA <<<<7<6<<<<<<<6<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:1:179:629:513 163 chr2 220 99 35M = 409 224 GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG <<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_45:4:88:55:1187 99 chr2 220 66 35M = 391 206 GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG ;;<;;;<<99<<;;<;;;;;:;49;:;;;;87898 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_62:5:119:38:945 99 chr2 221 99 35M = 428 242 TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA <<<<<<<<<<<<<<<8<<<<<8<<<8<;<<7<:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_65:6:67:800:450 147 chr2 221 99 35M = 41 -215 TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA 9-<9<;<<<<9;5<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_610:5:102:915:87 147 chr2 222 99 35M = 65 -192 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA ;<8<;;<<<<7;<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_26:1:113:367:659 163 chr2 222 72 35M = 390 203 CACAGGTATTCCTGAGGAAAAAGAAAAAGCGAGAA =9====8==========:=:=====9=:=&====5 MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +EAS218_1:2:26:211:481 147 chr2 222 99 35M = 43 -214 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA :<:<<<<<<9:5<<<<<<<<<<<<<<:<:<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS219_FC30151:3:90:1906:1528 83 chr2 222 99 35M = 41 -216 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA :<<<<<<<<<3:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_591:2:13:100:876 163 chr2 223 73 36M = 397 210 ACAGGGATTCCTGAGGAAAAAGAAAAAGTGAGAAGT <8<<<*<2<7<<<6<<<<<<6<<8<<<<5<<<<4<9 MF:i:18 Aq:i:30 NM:i:1 UQ:i:9 H0:i:0 H1:i:1 +EAS56_63:5:117:570:971 163 chr2 223 99 35M = 413 225 ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG <<<<<<<<<<<<<;;;<<<<6<7;9;<:;<;<;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_3:8:50:1203:1094 83 chr2 223 99 35M = 46 -212 ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG <7<<<<<5:+63<<<<<<<<<<<<<<<<2<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_67:6:107:395:312 83 chr2 224 99 35M = 44 -215 CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT ;<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_73:3:29:833:612 83 chr2 224 99 35M = 58 -201 CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT <<;<<<;<::<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_610:7:158:943:467 83 chr2 225 99 35M = 57 -203 AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT <:<<;;<:5<<<<<<<<<<<<<<<<<<;<<<;<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_59:2:201:768:529 163 chr2 225 99 35M = 396 206 AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT ==========================1=======; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:6:11:994:584 99 chr2 226 97 35M = 417 226 GGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTT <<<<<<<<<<<7<<<<<<<<<<<<<6<<<<<<3<6 MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:2:206:873:186 83 chr2 227 99 35M = 66 -196 GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG ;<<;--7<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_63:4:38:28:122 83 chr2 227 99 35M = 46 -216 GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG ;9;9;-1<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:5:66:372:343 83 chr2 228 99 35M = 40 -223 TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG ;<1;89<<<<<;<9<<<<9<<<;8<9<;<<<<<;8 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_97:3:277:144:848 83 chr2 228 99 35M = 64 -199 TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG <<<)63<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:6:21:1601:1666 83 chr2 228 99 40M = 56 -212 TATTACTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA -;;3&1<<<<<<<<<<<<1<<<<<<<<<<<7<<<<<<<<=<<<<<<<<<<<<<< MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:2:23:268:529 153 chr2 329 71 35M * 0 0 TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT 7;<<<<<<57;-<<<<<<:<77<<<<<<<;<;<<< MF:i:32 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_26:2:315:219:7 153 chr2 330 69 35M * 0 0 GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG 7==::<2=8<<<=====>888<=2=>==>,>,>>8 MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS192_3:4:63:5:870 83 chr2 330 75 35M = 148 -217 GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG :<;<;<<<4:;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_591:5:243:557:560 163 chr2 331 75 36M = 499 204 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<<<9<<<<<<<<<<<<<<<<<<;<<89<<9<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_593:2:270:430:269 163 chr2 331 99 36M = 519 224 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;7;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_66:6:284:442:747 89 chr2 331 75 35M * 0 0 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC <;<<<<<:<;<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_4:7:71:31:1973 89 chr2 331 76 35M * 0 0 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC <<<<<7<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:2:30:466:652 147 chr2 332 98 35M = 163 -204 AAGAGGCTAAAAGAATGCCAGGAAGATACATTGCA <<<<<;3;&<<<<<<<============= MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:4 H1:i:13 +EAS114_39:3:88:84:1558 147 chr2 394 95 35M = 203 -226 ATCAGACTATCTAAAGTCAACATGAAGGAAAAAAA ;;<<;<<;<<5<<<<<<;<<:<<<;<<<<<<;<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:2 H1:i:3 +EAS56_59:2:201:768:529 83 chr2 396 99 35M = 225 -206 CAGACTATCTAAAGTCAACATGAAGGAAAAAAATT 3<:<9<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_591:2:13:100:876 83 chr2 397 73 36M = 223 -210 AGAATATATAAAGTCAACATGAAGGAAAAAAATTCT ;9<$<<<$<<<<<<<<75<<<<<<<9<9<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:6 H0:i:1 H1:i:1 +EAS139_11:4:26:137:1382 99 chr2 397 99 35M = 579 217 AGACTATCTAAAGTCAACATGAAGGAAAAAAATTC <<<<<<7<<<77<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_59:1:93:490:901 83 chr2 445 99 35M = 280 -200 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA <<<<<<<;<<<;<<<;<<;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_34:7:96:489:453 99 chr2 445 99 35M = 625 215 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_26:6:46:13:880 147 chr2 445 99 35M = 290 -190 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA =&====8==========0================= MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:2:167:905:852 163 chr2 445 99 36M = 647 238 AGAAAAGCATACAGTCATCTATAAAGAAAATCCCAT <<<7<<<<<<<<<<<<<<:<:<<:::&.<:<66:3< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 +EAS219_FC30151:3:13:674:1717 163 chr2 445 99 35M = 623 213 AGAAAAGCATGCAGTCATCTATAAAGGAAATCCCA <<<<<<<<<<%<<<<<<<<<<<<<<<<<<<;:;;; MF:i:18 Aq:i:45 NM:i:1 UQ:i:4 H0:i:0 H1:i:1 +EAS51_62:7:196:511:896 83 chr2 446 99 35M = 283 -198 GAAAAGCATACAGTCATCTATAAAGGAAATCCCAT 8<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_53:1:154:118:488 163 chr2 447 99 35M = 624 212 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<<<<<<<<<<<<<<<<<<<:7<<<<7<:;;:: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:2:44:153:969 83 chr2 447 95 35M = 245 -237 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<5<:7<72<51<7<*79<<<<<5<<<<<<<<<2< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:4:215:246:640 99 chr2 447 99 36M = 624 213 AAAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<9<;<<<<<<<<<<9;<<<<<<3;<;3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS219_1:7:94:1655:1921 147 chr2 447 85 35M = 258 -224 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<;:===<==;<==<;================; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:6:60:1037:1146 147 chr2 447 99 35M = 250 -232 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_65:1:23:536:229 99 chr2 448 99 35M = 614 201 AAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<<<<<<<<:<8<:<<;<<<<<<7<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_34:6:130:865:838 163 chr2 448 99 35M = 649 236 AAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:<;3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_59:2:239:1001:406 99 chr2 450 99 35M = 634 219 AGCATACAGTCATCTATAAAGGAAATCCCATCAGA <<<<<<7<<<<<<<<8<;<<<7<<<<36<<3<:33 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_97:3:147:423:584 147 chr2 451 99 35M = 277 -209 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA 27<;<3<<<+<<;<<<;;-4<<<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_99:1:187:715:521 83 chr2 451 99 35M = 291 -195 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA <7<:<9<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_67:3:172:196:746 99 chr2 451 99 35M = 620 204 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA <<<<<<<<9<<<<9<<<<<<<<<;<<<<6<<<<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_71:3:267:821:860 83 chr2 451 99 34M = 296 -189 GCATACAGTCATCTATAAAGGAAATCCCATCAGA $&<<<.<:;6<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3 +EAS56_61:7:7:682:201 83 chr2 452 99 35M = 288 -199 CATACAGTCATCTATAAAGGAAATCCCATCAGAAT 0:8;5<8<1:78<<<<<<<<<<<<:8<<2<<<<:< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_589:3:82:13:897 163 chr2 453 99 35M = 606 188 ATACAGTCATCTATAAAGGAAATCCCAGCAGAATA <<<<;<<<<<<;<;<;5<51;<1<<<<%<<<<,58 MF:i:18 Aq:i:41 NM:i:1 UQ:i:4 H0:i:0 H1:i:1 +EAS56_53:6:180:695:621 99 chr2 453 99 35M = 637 219 ATACAGTCATCTATAAAGGAAATCCCATCAGAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:2:158:909:321 83 chr2 453 99 35M = 271 -217 ATACAGTCATCTATAAAGGAAATCCCATCAGAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_26:2:237:497:165 99 chr2 454 99 35M = 619 200 TACAGTCATCTATAAAGGAAATCCCATCAGAATAA 8===<8===========37=<===7=;7=8===== MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_99:2:152:355:962 83 chr2 456 99 35M = 269 -222 CAGTCATCTATAAAGGAAATCCCATCAGAATAACA &<.9.<;+;<;<<<<<<<<<<::<<:<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2 +EAS192_3:4:255:549:422 83 chr2 456 99 35M = 295 -196 AAGTCATCTATAAAGGAAATCCCATCAGAATAACA &<;;+<;4;<<<<<<<<<<<;<;<<;<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:2 +EAS220_1:4:100:20:1199 163 chr2 456 99 35M = 614 193 CAGTCATCTATAAAGGAAATCCCATCAGAATAACA 7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_67:5:71:408:741 163 chr2 457 99 35M = 637 215 AGTCATCTATAAAGGAAATCCCATCAGAATAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_66:5:285:395:450 147 chr2 458 99 35M = 269 -224 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT 8)3<8+;<)<<<<<<<<97:7<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_73:3:4:854:140 99 chr2 458 72 35M = 638 215 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT <<<6<<<:<6<<<:36:<<<<3<<8:.6<38::4< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_59:6:227:657:95 147 chr2 458 99 35M = 280 -213 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT ;3;<);<<<<<<<<<<<<18<<<<<<<<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:7:57:324:546 83 chr2 458 99 36M = 281 -213 GTCATCTATAAAGGAAATCCCATCAGAATAACAATG ;;5<;,<<<;;<<<<<<<97<<<<<<<<<<9<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:4:26:274:1078 83 chr2 458 99 40M = 282 -216 GTCATCTATAAAGGAAATCCCATCAGAATAACAATGGGCT 9:*:64<<;<<<<<<<<<;8;<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:6:107:636:642 163 chr2 458 99 35M = 630 207 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_81:7:226:869:36 147 chr2 461 99 35M = 273 -223 ATATATAAAGGAAATCCCATCAGAATAACAATGGG <0/)&<=,==4>4=>>= MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_1:8:82:1540:77 163 chr2 619 99 35M = 786 202 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_67:3:172:196:746 147 chr2 620 99 35M = 451 -204 AAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCT <<<;><<+<<<<:<<<<2<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_73:7:97:892:419 163 chr2 621 99 35M = 800 214 AATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS192_3:4:312:915:751 147 chr2 621 99 35M = 461 -195 AATAAAGTCAAGTCTTTCCTGACAAGCAAAAGCTA <:-<<<99:::);:7<4;8<<<<<<<;<2<+8<;< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1 +EAS1_93:4:325:352:67 163 chr2 622 99 35M = 794 207 ATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAA ==================<========<=<;-=== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_97:4:83:731:540 99 chr2 623 99 35M = 804 216 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<;<<<<<<<<<<<<<:<7<*;&;<;;9 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:5:74:329:459 163 chr2 623 99 35M = 795 207 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9;599 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS219_FC30151:3:13:674:1717 83 chr2 623 99 35M = 445 -213 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_105:1:141:415:738 69 chr2 624 0 * = 624 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT <<<<<<<<<<<<<<<<<<<<<<<;<<<<<;<8<<< MF:i:192 +EAS1_105:1:141:415:738 137 chr2 624 76 35M = 624 0 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<<<<<<<<<<<<<<<<<<<<<:<<;<<;<<<<6: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_53:1:154:118:488 83 chr2 624 99 35M = 447 -212 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<<;58<<95:<<;<;<<<;<<<;;<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_59:5:198:929:684 83 chr2 624 99 35M = 471 -188 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<;<<<<<:<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:4:215:246:640 147 chr2 624 99 36M = 447 -213 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ;<<,<<<96<<:<:<9<6<97<<<<<9<<<<9<<9< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_103:2:234:167:381 83 chr2 625 99 35M = 443 -217 AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT <<;<;<<<<;<<<<7<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_34:7:96:489:453 147 chr2 625 99 35M = 445 -215 AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ;<;;;<<<<5:<<:<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:3:79:879:15 99 chr2 626 99 35M = 790 199 AGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<2<;<<1< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_53:2:59:286:290 147 chr2 628 99 35M = 467 -196 TCAAGTCTTTCCTGACAAGCAAATGCTAAGATAAT 77<<<<7<<<97<<,7<<<;<<<;<9<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_95:5:263:511:936 99 chr2 629 99 35M = 801 207 CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT <<<<<<<<<<<<<<<<<;<<<<<;<<:<:<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_30:3:181:582:435 147 chr2 629 99 35M = 471 -193 CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT <<<<<<<<;<<<<<;<<4<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:6:107:636:642 83 chr2 630 99 35M = 458 -207 AAGTCTTTCCTGACAAGCAAATGCTAAGATAATTC <<<<<<<;<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_34:4:12:273:89 83 chr2 631 99 35M = 477 -189 AGTCTTTCCTGACAAGCAAATGCTAAGATAATTCA <:737<288<<<7<<<<<<<<<:9<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_59:2:239:1001:406 147 chr2 634 99 35M = 450 -219 CTTTCCTGACAAGCAAATGCTAAGATAATTCATCA 0':.71;;:9==9=;====;=;============= MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_4:7:96:899:106 147 chr2 636 99 35M = 462 -209 TTCCTGACAAGCAAATGCTAAGATAATTCATCATC ;;;;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_65:6:67:56:806 147 chr2 637 99 35M = 464 -208 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA 844:8;7<88;8<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_67:5:71:408:741 83 chr2 637 99 35M = 457 -215 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA ;7;<;<0<<<<<<<<:;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_53:6:180:695:621 147 chr2 637 99 35M = 453 -219 TACTGAAAAGCAAATGCTAAGATAATTCATCATCA ;&377<&<<;7<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:2 UQ:i:10 H0:i:1 H1:i:0 +EAS114_30:6:49:656:507 147 chr2 637 99 35M = 468 -204 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA %44;;<:<<;<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_73:3:4:854:140 147 chr2 638 72 35M = 458 -215 CCTGACAAGCAAATGCTAAGATAATTCATCATCAC :9':<;<<<;<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:1:85:1521:58 99 chr2 639 99 40M = 813 214 CTGACAAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<9<<<<<<<<<<<<<7<<<<<<<<<<<<;;:7: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_39:2:57:1064:925 137 chr2 640 76 35M * 0 0 TGACAAGCAAATGCTAAGATAATTCATCATCACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_103:3:323:196:855 163 chr2 642 99 35M = 809 202 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<<<<<7<<<<<<:<<<<<<<<<<<<<<<<<;7: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_67:5:117:33:262 163 chr2 642 99 35M = 814 207 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_11:1:59:742:549 99 chr2 642 99 35M = 816 209 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:2:55:562:403 163 chr2 643 99 36M = 825 218 CAAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<;<;: MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_71:7:97:743:602 163 chr2 644 99 35M = 821 211 AAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<: MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:2:167:905:852 83 chr2 647 99 36M = 445 -238 CAAATGCTAAGATAATTCATCATCACTAAACCAGTC +<<<9;7;<<+<<<<<39<;9<;9<<7<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS112_34:6:130:865:838 83 chr2 649 99 35M = 448 -236 AATGCTAAGATAATTCATCATCACTAAACCAGTCC ;<:84<<<4<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS219_1:1:60:1420:660 163 chr2 649 99 35M = 808 194 AATGCTAAGATAATTCATCATCACTAAACCAGTCC <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_593:3:180:89:582 99 chr2 650 99 36M = 809 195 ATGCTAAGATAATTCATCATCACTAAACCAGTCCTA <<<<<<<<<7<<<<<<<<<7<<<:<<<:<<::77:< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_99:1:86:871:319 147 chr2 651 71 35M = 494 -192 TGCTAAGATAATTCATCATCACTAAACCAGTCCTA 7;+1;<:<<<<<<<<;<<;<<9<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:2:236:841:20 83 chr2 652 99 35M = 467 -220 GCTAAGATAATTCATCATCACTAAACCAGTCCTAT 7;<<<;<<<<;;<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_62:2:133:8:379 83 chr2 653 99 35M = 470 -218 ATAAGATAATTCATCATCACTAAACCAGTCCTATA &=========='==7==0=2====28===00==== MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 +EAS1_105:8:96:720:940 83 chr2 654 99 35M = 467 -222 TAAGATAATTCATCATCACTAAACCAGTCCTATAA *<<<<;<<<9<<;,<;0<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:5:71:994:576 99 chr2 655 99 35M = 805 185 AAGATAATTCATCATCACTAAACCAGTCCTATAAG <<<<<<<<<<<<<<<<<<<<<<<;<<5<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_103:4:164:79:134 147 chr2 656 99 35M = 488 -203 AGATAATTCATCATCACTAAACCAGTCCTATAAGA <;<;<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:6:78:1029:512 83 chr2 656 99 40M = 500 -196 AGATAATTCATCATCACTAAACCAGTCCTATAAGAAATGC ;;;;;<;;<<<.<<6;<<;<;8<<<<::<<<<<<<<;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_93:1:214:784:690 147 chr2 657 99 35M = 472 -220 GATAATTCATCATCACTAAACCAGTCCTATAAGAA -<7<<7<:<<2<<<<;<<<<<;<<<<3<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1 +EAS220_1:4:6:1178:1105 99 chr2 657 93 35M = 830 208 GATAATTCATCATCACTAAACCAGTCCTATAAGAA <<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_99:7:171:196:287 83 chr2 658 99 35M = 485 -208 ATAATTCATCATCACTAAACCAGTCCTATAAGAAA <;;;98;<;&<;;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_28:1:220:801:282 99 chr2 660 99 36M = 837 213 AATTCATCATCACTAAACCAGTCCTATAAGAAATGC <<<<<<<<<<<<<<<<<<<<<;<+<;<<<<<::<<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2 +EAS221_1:2:73:955:728 163 chr2 660 44 35M = 823 198 AATTCATCATCACTAAACCAGTCCTATAAGAAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:1 H1:i:2 +EAS1_105:1:3:903:957 147 chr2 661 99 35M = 516 -180 ATTCATCATCACTAAACCAGTCCTATAAGAAATGC <%12<&<<<;<:<<<<<<<<<7<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1 +EAS56_65:2:224:579:433 83 chr2 662 99 35M = 485 -212 TTCATCATCACTAAACCAGTCCTATAAGAAATGCT '<08/8<+<>===> MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_105:2:146:374:692 99 chr2 690 99 35M = 874 219 AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA <<<<<<<<<<<<<<<=>>>==>>===>==> MF:i:130 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 +EAS1_108:6:159:493:275 99 chr2 760 72 35M = 939 214 ACAAAACTCACAGGTTTTATAAAACAATTAATTGA =====3============================= MF:i:130 Aq:i:72 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 +EAS139_11:1:81:1019:558 163 chr2 760 77 35M = 926 201 ACAAAACTCACAGGTTTTATAAAACAATTAATTGA <<<<<<<<<<<6<<<<<<<<<<<<<<<<<<<<<7< MF:i:130 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 +EAS51_62:7:162:195:761 163 chr2 767 30 18M4I13M = 922 190 TCACAGGTTTTATAAAACAATTAATTGAGACTACA <<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;; MF:i:130 Aq:i:30 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 +B7_597:3:115:646:430 147 chr2 768 45 17M4I14M = 582 -217 CACAGGTTTTATAAAACAATTAATTGAGACTACAG 5;5<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:45 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 +EAS114_30:6:243:209:110 163 chr2 768 48 17M4I14M = 920 187 CACAGGTTTTATAAAACAATTAATTGAGACTACAG <<<<<;<;<<<;<<<<<<<<<<<;<:;<<:;;+85 MF:i:130 Aq:i:48 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 +EAS1_108:2:266:994:429 147 chr2 769 76 16M4I15M = 612 -188 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA <<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:1:85:1521:58 147 chr2 813 99 40M = 639 -214 AAATTAACATTACAACAGGAACAAAACCTCATATATCAAT :::86<<:<<8<<<<;<<8<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS188_7:4:164:719:947 99 chr2 813 99 35M = 1005 227 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS219_1:1:50:257:341 163 chr2 813 99 35M = 971 193 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7<6<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_67:5:117:33:262 83 chr2 814 99 35M = 642 -207 AATTAACATTACAACAGGAACAAAACCTCATATAT <<;;<<;<:8<7<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_1:8:90:706:1276 163 chr2 814 99 35M = 980 201 AATTAACATTACAACAGGAACAAAACCTCATATAT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_108:2:116:966:193 163 chr2 815 99 35M = 967 187 ATTAACATTACAACAGGAACAAAACCTCATATATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_11:1:59:742:549 147 chr2 816 99 35M = 642 -209 TTAACATTACAACAGGAACAAAACCTCATATATCA -<<<3<<<<6<<6<<<<<6<<<<6<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_11:7:74:213:877 99 chr2 816 99 35M = 996 215 TTAACATTACAACAGGAACAAAACCTCATATATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2 +B7_610:3:85:219:371 163 chr2 817 99 35M = 967 185 TAACATTACAACAGGAACAAAACCTCATATATCAA <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_108:2:176:653:957 163 chr2 819 82 35M = 982 198 ACATTACAACAGGAACAAAACCTCATATATCAATA ????????????<==>=>=>=>>>==>>>=>>> MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_19:5:57:366:844 83 chr2 877 99 40M = 708 -209 AAATTCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT ;;;7:8&555<,;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_32:3:236:475:254 163 chr2 880 99 35M = 1051 206 TTCCCCCACTTAAGAGATATAGATTGGCAGAACAG <<<<<<<<<<<<<<<<<<<<<<<<<:::<:;>=>>>>==>=>>>==>=>=:=====;=:=6:::6 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS218_1:2:10:686:1024 163 chr2 947 99 35M = 1103 191 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT <:<<<<:<<<<<<<<<<:<:<<<<<<<<<<<5<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_73:5:53:61:31 163 chr2 949 99 35M = 1122 208 AAGAAACTCATTAATAAAGACATGAGTTCAGATAA <<<7;<7<<<;7<;;<7<7<7<;5<73<<<;>588>9<>7:<0<9; MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 +B7_589:2:30:644:942 99 chr2 1045 83 35M = 1229 219 TATATCAGATAAAGCACACTTTAAATCAACAACAG <<<<<<<<<<<<<<<<<<<<<<<9<<<<<<9;<9< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:3 +B7_591:2:123:924:645 83 chr2 1045 84 36M = 861 -220 TATATCAGATAAAGCACACTTTAAATCAACAACAGT ;<<<<*<<<<<<<<8<<<<<><<<<<><<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 +EAS51_62:4:308:614:911 99 chr2 1319 90 35M = 1493 209 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<8< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 +EAS54_65:3:155:541:234 83 chr2 1319 99 35M = 1151 -203 TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA 78;<7<<<<<<<<<<<<<<;<<<<<<<<<<;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:6:175:289:351 147 chr2 1319 99 35M = 1144 -210 TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA 9;;:+<<<<<;<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_593:7:283:186:707 83 chr2 1321 99 36M = 1154 -203 CGCTTGTACTTCTAAATCTATAACAAAATTAAAATT 889;<7;<7<<7<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 +EAS1_105:3:308:66:538 147 chr2 1321 99 35M = 1138 -218 CGCTTGTACTTCTAAATCTATAACAAAATTAAAAT 996999;<9;<:<<<<<:<<7<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 +EAS1_108:5:11:555:330 163 chr2 1321 99 35M = 1492 206 CGCTTGTACTTCTAAATCTATAAAAAAATTAAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<4<;< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS51_66:7:84:411:336 73 chr2 1322 75 35M * 0 0 GCTTGTACTTCTAAATCTATAAAAAAATTAAAATT <<<;<<<;<<<<<<<<<<<<:<<;<<<<<<;8<;< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS139_11:5:52:1278:1478 163 chr2 1322 47 35M = 1513 226 GCTTGTACTTCTAAATCTATAACAAAATTAAAATT <<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<9<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 +EAS56_53:3:101:809:776 147 chr2 1326 99 35M = 1160 -201 GTACTTCTAAATCTATAAAAAAATTAAAATTTAAC <<<-<;7;<<<<:;<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS192_3:3:221:881:916 147 chr2 1327 96 35M = 1168 -194 TAATTCTAAATCTAGAACAAAATTAAAATTTAACA 44%-4(5<;9/,:<68:1<:8<:<<84;<<<<<;< MF:i:18 Aq:i:24 NM:i:3 UQ:i:41 H0:i:0 H1:i:0 +EAS1_105:1:28:745:352 147 chr2 1329 99 35M = 1159 -205 CTTCTAAATCTATAACAAAATTAAAATTTAACAAA 4;;*;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 +EAS114_45:2:23:1754:796 99 chr2 1329 99 35M = 1488 194 CTTCTAAATCTATAAAAAAATTAAAATTTAACAAA ;<<;<;<;<;<;<<;;;;;<<<<;;<<<<<97999 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_97:2:96:419:327 147 chr2 1331 99 35M = 1149 -217 TCTAAATCTATAACAAAATTAAAATTTAACAAAAG ;1<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 +EAS1_97:4:274:287:423 163 chr2 1332 75 35M = 1515 218 CTAAATCTATAAAAAAATTAAAATTTAACAAAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS219_1:7:35:392:2042 83 chr2 1332 99 35M = 1168 -199 ATAAATCTATAAAAAAATTAAAATTTAACAAAAGT +<<<<4<>>>>;>>&>->9>9;4>->>>>,4>9>,<1> MF:i:18 Aq:i:27 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 +EAS139_19:2:82:154:1333 99 chr2 1349 77 40M = 1511 202 TTAAAATTTAACAAAAGTAAATAAAACACACAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;:;: MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:1 H1:i:0 +EAS188_7:1:290:286:763 99 chr2 1349 75 35M = 1515 201 TTAAAATTTAACAAAAGTAAATAAAACACATAGCT <<<<<<<<<<<<<<<<7<<<<<<<<<<<<<<<8<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS221_1:4:3:248:1491 73 chr2 1349 99 35M * 0 0 TTAAAATTTAACAAAAGTAAATAAAACACATAGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:8:< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS114_39:3:6:1064:1805 99 chr2 1350 99 35M = 1502 187 TAAAATTTAACAAAAGTAAATAAAACACATAGCTA <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_595:6:137:811:130 83 chr2 1351 99 35M = 1175 -211 AAAATTTAACAAAAGTAAATAAAACACATAGCTAA <<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_108:1:155:809:543 83 chr2 1352 99 35M = 1156 -231 AAATTTAACAAAAGTAAATAAAACACATAGCTAAA <<<+0<<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_63:3:41:468:459 99 chr2 1352 75 35M = 1513 196 AAATTTAACAAAAGTAAATAAAACACATAGCTAAA <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<;;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_108:4:31:622:216 73 chr2 1354 99 35M * 0 0 ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<96<7 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS54_71:8:105:854:975 163 chr2 1354 71 35M = 1523 202 ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<7:<;;;;5 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +B7_610:7:26:749:174 147 chr2 1357 78 35M = 1183 -209 TAACAAAAGTAAATAAAACACATAGCTAAAACTAA (<<)<<<<6<<<<<<<<<<&:<3<<<6<<<)<:<< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS56_57:6:21:553:57 147 chr2 1358 99 35M = 1197 -196 AACAAAAGTAAATAAAACACATAGCTAAAACTAAA <<+<<<<<<<<<;<<<<8<<<<<<8<<<<<;<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 +EAS1_97:2:128:629:484 83 chr2 1359 96 35M = 1185 -209 AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA :(::<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:82 H1:i:85 +B7_589:6:33:356:636 73 chr2 1520 0 35M * 0 0 TTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTT <<<<<<<8;<<<<<<<<<<<<<7<<<<<<<;;3&3 MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:14 H1:i:85 +EAS114_45:6:86:859:1779 137 chr2 1520 0 35M * 0 0 TTTTTTTCATTTCTCTTTTTTTTTTTTTTTTTTTT ;;;;;;;;;;;;;;;;;;;;;;;;;;;8;;)7699 MF:i:32 Aq:i:0 NM:i:1 UQ:i:26 H0:i:0 H1:i:15 +EAS54_71:8:105:854:975 83 chr2 1523 71 33M = 1354 -202 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTG <<<<;<:<<;<&<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85 +EAS51_62:4:187:907:145 153 chr2 1524 28 35M * 0 0 TTTCTTCTCTCTCTTTTTTTTTTTTTTTATTGCAT <<<+;;,6<<<<6<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:28 NM:i:3 UQ:i:59 H0:i:0 H1:i:0 +EAS54_71:4:284:269:882 73 chr2 1524 0 34M * 0 0 TTTCTTTTCTCTTTTTTTTTTTTTTGTTTTTGCA <;<<<<<8<7<8;<<<;<7<<<<<;272;73&&) MF:i:32 Aq:i:0 NM:i:1 UQ:i:17 H0:i:0 H1:i:85 +EAS56_63:4:141:9:811 137 chr2 1524 10 35M * 0 0 TTTCTTTTCTCCTTTTTTTTTTTTTTTTTCTACAT <<<;<<<<<<<;<;<:<<<;<<<<<<<<..));;. MF:i:32 Aq:i:0 NM:i:3 UQ:i:47 H0:i:2 H1:i:27 +EAS114_30:6:277:397:932 73 chr2 1524 0 35M * 0 0 TTTCTTTTCACTTTTTTTTTTTTTTTTTTTTACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<:8(,0%( MF:i:32 Aq:i:0 NM:i:3 UQ:i:42 H0:i:2 H1:i:85 +EAS139_11:7:50:1229:1313 83 chr2 1528 77 35M = 1376 -187 TTTTTTCTTTTTTTTTTTTTTTTTTTTGCATGCCA <<<<,<&<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:11 H0:i:3 H1:i:7 +EAS54_65:3:320:20:250 147 chr2 1532 77 35M = 1367 -200 TTTTTTTTTTTTTTTTTTTTTTTGCATGCCAGAAA +'''/<<<<7:;+<;::<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:6 NM:i:2 UQ:i:24 H0:i:1 H1:i:2 +EAS114_26:7:37:79:581 83 chr2 1533 68 35M = 1349 -219 TTTTTTTTTTTTTTTTTTTTTTTCATGCCAGAAAA 3,,,===6===<===<;=====-============ MF:i:18 Aq:i:27 NM:i:2 UQ:i:23 H0:i:0 H1:i:1 diff --git a/tests/pysam_data/softclip.sam b/tests/pysam_data/softclip.sam new file mode 100644 index 0000000..b285471 --- /dev/null +++ b/tests/pysam_data/softclip.sam @@ -0,0 +1,6 @@ +@HD VN:1.5 SO:coordinate +@SQ SN:ref LN:45 +r001 0 ref 9 30 3S6M1P1I4M * 0 0 AAAAGATAAGGATA * +r002 0 ref 9 30 5S6M * 0 0 GCCTAAGCTAA 01234567890 +r003 0 ref 9 30 6M5S * 0 0 GCCTAAGCTAA 01234567890 +r004 2064 ref 29 17 6H5M * 0 0 TAGGC 01234 diff --git a/tests/pysam_data/tag_bug.sam b/tests/pysam_data/tag_bug.sam new file mode 100644 index 0000000..9c0b1cc --- /dev/null +++ b/tests/pysam_data/tag_bug.sam @@ -0,0 +1,16 @@ +@SQ SN:2L LN:23011544 +@SQ SN:2LHet LN:368872 +@SQ SN:2R LN:21146708 +@SQ SN:2RHet LN:3288761 +@SQ SN:3L LN:24543557 +@SQ SN:3LHet LN:2555491 +@SQ SN:3R LN:27905053 +@SQ SN:3RHet LN:2517507 +@SQ SN:4 LN:1351857 +@SQ SN:U LN:10049037 +@SQ SN:Uextra LN:29004656 +@SQ SN:X LN:22422827 +@SQ SN:XHet LN:204112 +@SQ SN:YHet LN:347038 +@SQ SN:dmel_mitochondrion_genome LN:19517 +HWI-EAS241:138:4:17:7389-21153#0 256 2L 8878 3 36M * 0 0 CGCTGGACTCGCAAAGTGGACTTGTTCAGCAAGGAC FEAAEDBEEFEDGDGGG@88GBEED:BB|P% zTG-EDq87Gd=V5_P&_~SU<$LnXgJY*pRkPPd2l}%y0Vco^ToA~D$Kc-Hq1!I%DvX}9 z?F+bzNQ#7_RoJ(s>2_^>?9U1BLjq?=OxgrjwJ@i{hi=0N?Tew9DGxe~vh*!`0zi;I zD_!nB*k`o5%V)G019u@2(z}+tYbloGLW1O7%l@iun_kzZ*fmvc_LEqVlF9}KFQHsb*jRT9s&(e-89yT$a~$9C-R^*`FVIw67sxFA^UeL}d;3Au#Qt)UAO@&z_S J$a?Vx004wXnCt)m literal 0 HcmV?d00001 diff --git a/tests/pysam_data/test_mapped_unmapped.sam b/tests/pysam_data/test_mapped_unmapped.sam new file mode 100644 index 0000000..f5ca805 --- /dev/null +++ b/tests/pysam_data/test_mapped_unmapped.sam @@ -0,0 +1,28 @@ +@HD VN:1.0 +@SQ SN:chr1 LN:100 +@SQ SN:chr2 LN:100 +@CO Test counting of mapped/unmapped reads +read1_mapped 0 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +read2_unmapped 4 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +read3_unmapped 20 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +pair1a_mapped 67 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +pair1b_mapped 131 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +pair2a_unmapped 71 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +pair2b_mapped 139 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +pair3a_unmapped 77 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +pair3b_unmapped 141 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +noseq2b_mapped 139 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bread1_mapped 0 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bread2_unmapped 4 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bread3_unmapped 20 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bpair1a_mapped 67 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bpair1b_mapped 131 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bpair2a_unmapped 71 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bpair2b_mapped 139 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bpair3a_unmapped 77 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bpair3b_unmapped 141 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +bnoseq2b_mapped 139 chr2 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +noseq1_unmapped 4 * 0 20 * = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +noseq2a_unmapped 71 * 0 20 * = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +pair3a_unmapped 77 * 0 20 * = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +pair3b_unmapped 141 * 0 20 * = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 diff --git a/tests/pysam_data/test_query_position.sam b/tests/pysam_data/test_query_position.sam new file mode 100644 index 0000000..5e8d2d1 --- /dev/null +++ b/tests/pysam_data/test_query_position.sam @@ -0,0 +1,9 @@ +@HD VN:1.0 +@SQ SN:chr1 LN:100 +@SQ SN:chr2 LN:100 +@SQ SN:chr3 LN:100 +@SQ SN:chr4 LN:100 +read1 0 chr1 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +read2 0 chr2 21 30 10M2D25M = 500 412 ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA <<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<< MF:i:18 +read1 16 chr3 21 20 10M1D25M = 200 167 AGCTTAGCTAGCTACCTATATCTTGGTCTTGGCCG <<<<<<<<<<<<<<<<<<<<<:<9/,&,22;;<<< NM:i:1 +read2 16 chr4 21 30 10M2D25M = 500 412 ACCTATATCTTGGCCTTGGCCGATGCGGCCTTGCA <<<<<;<<<<7;:<<<6;<<<<<<<<<<<<7<<<< MF:i:18 diff --git a/tests/pysam_data/test_unaligned.sam b/tests/pysam_data/test_unaligned.sam new file mode 100644 index 0000000..3cbb20a --- /dev/null +++ b/tests/pysam_data/test_unaligned.sam @@ -0,0 +1,6 @@ +@HD VN:1.0 SO:queryname +@RG ID:myid PL:illumina PU:P123456 LB:L123456 DT:2013-03-20T21:00:00-0700 SM:S123456 CN:MYCN +B123456:6:1101:10000:137074 77 * 0 0 * * 0 0 CATGTGTATCACCCAGTACAATGCCTGACACACAGCAGTCACTTAAAGAGTGCTATTGCTATTATACAGTCATACT HHHHHHHHHHHHHHHHFHHHHHHHHHHGHHHHHHHBHHEFFHHHHHHHHHDHHHFHFHHHHHFHHEHFB@CDCCDE RG:Z:myid AM:i:0 SM:i:0 +B123456:6:1101:10000:137074 141 * 0 0 * * 0 0 CAAGGAACTTTACAGTTCAGGGGAGTTTTCCAGTGGCAGAAAGTGGGAAGATGATGCTCCCAAGGAAGAAGTAGAT HHHHHHHHHHHGHHHHHHHHHHHHHHHHHHHHHFHGHFHDFEF?EFEDEFFHHHFHDFHHHFHHHEFBBHD@D=C# RG:Z:myid AM:i:0 SM:i:0 +B123456:6:1101:10000:171579 589 * 0 0 * * 0 0 GAAGCATAGGACATGTCAATGATGGCCAGGTGTGTGAGGAAGAAGTACATGGGGGTGTGAAGCTTAGAGTCCAGGC ############################################################################ RG:Z:myid AM:i:0 SM:i:0 +B123456:6:1101:10000:171579 653 * 0 0 * * 0 0 ACCCTGCTGGGGAATGGGGTCATCTTTGGGATTATCTGCCTGGACTCTAAGCTTCACACACCCATGTACTTCTTCC 8BBBB>6><937964@?:@@B;A@8>=<>CB=CD########################## RG:Z:myid AM:i:0 SM:i:23 diff --git a/tests/refactoring.pl b/tests/refactoring.pl new file mode 100644 index 0000000..3300111 --- /dev/null +++ b/tests/refactoring.pl @@ -0,0 +1,60 @@ +while () { + # Samfile refactoring + s/Samfile/AlignmentFile/g; + + # AlignedRead refactoring + s/AlignedRead/AlignedSegment/g; + + # Do these patterns first as they match + # the new names + s/\.query/\.query_alignment_sequence/g; + s/\.positions/\.getReferencePositions()/g; + + # Tabixfile, etc + s/Tabixfile/TabixFile/g; + s/Fastafile/FastaFile/g; + s/Fastqfile/FastqFile/g; + + # basic attributes + s/\.qname/\.query_name/g; + s/\.tid/\.reference_id/g; + s/\.pos/\.reference_start/g; + s/\.mapq/\.mapping_quality/g; + s/\.rnext/\.next_reference_id/g; + s/\.pnext/\.next_reference_start/g; + s/\.tlen/\.query_length/g; + s/\.seq/\.query_sequence/g; + if (/\.qual =/) { + s/([[\].0-9a-zA-Z]*)\.qual = (\S*)/$1.query_qualities = pysam.fromQualityString($2)/g; + } else { + s/([[\].0-9a-zA-Z]*)\.qual/pysam.toQualityString($1\.query_qualities)/g; + } + s/\.alen/\.reference_length/g; + s/\.aend/\.reference_end/g; + s/\.rlen/\.query_alignment_length/g; + s/([[\].0-9a-zA-Z]*)\.qqual/pysam.toQualityString($1\.query_alignment_qualities)/g; + s/\.qstart/\.query_alignment_start/g; + s/\.qend/\.query_alignment_end/g; + s/\.qlen/\.query_alignment_length/g; + s/\.mrnm/\.next_reference_id/g; + s/\.rnext/\.next_reference_id/g; + s/\.mpos/\.next_reference_start/g; + s/\.rname/\.reference_id/g; + s/\.isize/\.query_length/g; + s/\.cigar/\.cigartuples/g unless (/\.cigarstring/); + + s/\.blocks/\.getBlocks()/g; + s/\.aligned_pairs/\.getAlignedPairs()/g; + s/\.inferred_length/\.getInferredQueryLength()/g; + + s/\.overlap()/\.getOverlap()/g; + + # PileupProxy + s/\.n([^a-zA-Z])/\.nsegments$1/g; + + # if (/\.mrnm/ || /\.rnext/ || /\.mpos/ || /\.rname/) + # { + # warn "Deprecated tag $& at line $.\n"; + # } + print; +} diff --git a/tests/refactoring.txt b/tests/refactoring.txt new file mode 100644 index 0000000..bc7d086 --- /dev/null +++ b/tests/refactoring.txt @@ -0,0 +1,198 @@ +;; This buffer is for notes you don't want to save, and for Lisp evaluation. +;; If you want to create a file, visit that file with C-x C-f, +;; then enter the text in that file's own buffer. + +Samfile -> AlignmentFile +AlignedRead -> AlignedSegment +Tabixfile -> TabixFile +Fastafile -> FastaFile +Fastqfile -> FastqFile + +Changes to the AlignedSegment.API: + +Basic attributes +================ + +qname -> query_name +tid -> reference_id +pos -> reference_start +mapq -> mapping_quality +rnext -> next_reference_id +pnext -> next_reference_start +cigar = alignment (now returns CigarAlignment object) +cigarstring = cigarstring +tlen -> query_length +seq -> query_sequence +qual -> query_qualities, now returns array +tags = tags (now returns Tags object) + + +Derived simple attributes +========================= + +alen -> reference_length, reference is always "alignment", so removed +aend -> reference_end +rlen -> query_length +query -> query_alignment_sequence +qqual -> query_alignment_qualities, now returns array +qstart -> query_alignment_start +qend -> query_alignment_end +qlen -> query_alignment_length, kept, because can be computed without fetching the sequence +mrnm -> next_reference_id +mpos -> next_reference_start +rname -> reference_id +isize -> query_length + + +Complex attributes - functions +=============================== + +blocks -> getBlocks() +aligned_pairs -> getAlignedPairs() +inferred_length -> inferQueryLength() +positions -> getReferencePositions() +overlap() -> getOverlap() + + +Backwards incompatible changes: +================================ + +1. Empty cigarstring now returns None (instead of '') + +2. Empty cigar now returns None (instead of []) + +3. When using the extension classes in cython modules, AlignedRead + needs to be substituted with AlignedSegment. Automatic casting + of the base class to the derived class seems not to work? + +4. fancy_str() has been removed + + +===================================================== + +Kevin's suggestions: + + +* smarter file opener +* CRAM support +* CSI index support (create and use) +* better attribute and property names +* remove deprecated names +* add object oriented CIGAR and tag handling +* fetch query that recruits mate pairs that overlap query region +* other commonly re-invented functionality + + qname -> template_name + pos -> reference_start + aend -> reference_stop + alen -> reference_length + tid -> ref_id + qname -> template_name (not a high priority, but would be clearer) + qstart -> query_start (really segment_align_start) + qend -> query_stop (really segment_align_stop) + qlen -> query_length (really segment_align_length) + qqual -> query_qual (really segment_align_qual) + rlen -> drop in favor of len(align.seq) + inferred_length -> inferred_query_length + is_* -> replace with flag object that is a subclass of int + cigarstring -> str(align.cigar) + tags -> opts object with a mapping-like interface + Non-backward compatible: + rname, mrnm, mpos, isize -> remove + cigar -> CigarSequence object (or something similar) + All coordinate and length queries return None when a value is not available (currently some return None, some 0) + Store qualities as an array or bytes type + + +Marcel's suggestions: + + I recently sent in a pull request (which was merged) that improves the pysam doc a bit. While preparing that, I also wrote down some ways in which the API itself could be improved. I think the API is ok, but for someone like me who uses pysam not every day, some of the details are hard to remember and every time I do very basic things I end up looking them up again in the docs. I can recommend this article, written for C++, but many points still apply: + http://qt-project.org/wiki/API_Design_Principles . + + Originally, I wanted to convert at least some of these suggestions to pull requests, but I'm not sure I have the time for that in the near future. So before I forget about this completely, I thought it's best to at least send this to the list. I'm concentrating on issues I found in Samfile and AlignedRead here. + + - The terminology is inconsistent - often two words are used + to describe the same thing: opt vs. tag, query vs. read, + reference vs. target. My suggestion is to consistently use + the same terms as in the SAM spec: tag, query, + reference. This applies both to documentation and + function/property names. + + - In line with the document linked to above (see the + section "The Art of Naming"): Do not abbreviate function + and property names. For example, tlen -> template_length, + pos -> position, mapq -> mapping_quality etc. + + - Be consistent with multiword function and variable names. I + suggest to use the PEP8 convention. This isn't so visible + to the user in Samfile and AlignedRead, it seems, but there + are things like convertBinaryTagToList which could be + renamed to convert_binary_tag_to_list. + + - Don't make functions that are not setters or getters a + property. This applies to + AlignedRead.positions/.inferred_length/.aligned_pairs/.blocks + and currently also Samfile.references, for example. Making + these a property implies to the user that access requires + constant time. This is important in code like this: + + for i in range(n): + do_something_with(read.positions[i]) + + This looks inconspicuous, but is possibly inefficient since + .positions actually builds up the result it returns each time + it's accessed. + + - Update the examples in the docs to use context manager + syntax. + + Particular to Samfile: + + - Deprecate Samfile.nreferences: propose to use + len(samfile.references) instead. Cache Samfile.references + so it's not re-created every time. + + - Move Samfile.mapped/.unmapped/.nocoordinate into a .stats + attribute (Samfile.stats.mapped/.unmapped/.noocordinate). + + Particular to AlignedRead: + + - When read is an AlignedRead, print(read) should print out a + properly formatted SAM line. + + - Force assignment to .qual/.seq to go through a function + that sets both at the same time. This avoids the problem + that they must be set in a particular order, which is easy + to forget and only 'enforced' through documentation. + + - Deprecate rlen, use len(read.seq) instead. + + - Handling of tags is a little awkward. Would be cool if this + worked: + + read.tags['XK'] = 'hello' # add a new tag if it doesn't exist + read.tags['AS'] += 17 # update the value of a tag + del read.tags['AS'] + if 'AS' in read.tags: ... + + - Add a property AlignedRead.qualities that behaves like a + Py3-bytes object in both Py2 and Py3. That is, accessing + read.qualities[0] gives you an int value that represents + the quality. The fact that qualities are encoded as + ASCII(q+33) is an implementation detail that can be hidden. + + Done + + - And finally: Add a Cigar class. I guess this is already + what 'improved CIGAR string handling' refers to in the + roadmap. AlignedRead.cigar would then return a Cigar object + that can be printed, compared and concatenated to others, + whose length can be measured etc. The .unclipped and + .inferred length properties can also be moved here. Or + perhaps: Make this an Alignment class that even knows about + the two strings it is aligning. One could then also iterate + over all columns of the alignment. But I guess this goes + too far since that's what the AlignedRead itself should be. + + Regards, + Marcel diff --git a/tests/samtools_test.py b/tests/samtools_test.py new file mode 100644 index 0000000..7c40237 --- /dev/null +++ b/tests/samtools_test.py @@ -0,0 +1,425 @@ +#!/usr/bin/env python +'''unit testing code for pysam. + +Execute in the :file:`tests` directory as it requires the Makefile +and data files located there. +''' + +import warnings +import unittest +import os +import re +import glob +import sys +import subprocess +import shutil +import pysam +import pysam.samtools +import pysam.bcftools +from TestUtils import checkBinaryEqual, check_lines_equal, \ + check_samtools_view_equal, get_temp_filename, force_bytes, WORKDIR, \ + make_data_files, BAM_DATADIR + + +IS_PYTHON3 = sys.version_info[0] >= 3 + + +def setUpModule(): + make_data_files(BAM_DATADIR) + + +def run_command(cmd): + '''run a samtools command''' + try: + retcode = subprocess.call(cmd, shell=True, + stderr=subprocess.PIPE) + if retcode < 0: + print("Child was terminated by signal", -retcode) + except OSError as e: + print("Execution failed:", e) + + +def get_version(executable): + '''return samtools/bcftools version''' + + with subprocess.Popen(executable, shell=True, + stderr=subprocess.PIPE).stderr as pipe: + lines = b"".join(pipe.readlines()) + + if IS_PYTHON3: + lines = lines.decode('ascii') + try: + x = re.search(r"Version:\s+(\S+)", lines).groups()[0] + except AttributeError: + raise ValueError("could not get version from %s" % lines) + return x + + +class SamtoolsTest(unittest.TestCase): + + '''test samtools command line commands and compare + against pysam commands. + + Tests fail, if the output is not binary identical. + ''' + + requisites = [ + "ex1.fa", "ex1.fa.fai", + "ex1.sam.gz", + "ex1.bam", "ex1.bam.bai", + "ex1.sam", + "ex1.sam", + "ex2.bam", + "ex2.sam", + "ex1.bed"] + + # a list of statements to test + # should contain at least one %(out)s component indicating + # an output file. + statements = [ + "view ex1.bam > %(out)s_ex1.view", + "view -c ex1.bam > %(out)s_ex1.count", + # ("view -bT ex1.fa -o %(out)s_ex1.view2 ex1.sam", + "sort ex1.bam -o %(out)s_ex1.sort.bam", + "mpileup ex1.bam > %(out)s_ex1.pileup", + "depth ex1.bam > %(out)s_ex1.depth", + # TODO: issues with file naming + # "faidx ex1.fa; %(out)s_ex1.fa.fai", + "index ex1.bam %(out)s_ex1.bam.fai", + "index -@2 ex1.bam %(out)s_ex1.bam.fai", + "idxstats ex1.bam > %(out)s_ex1.idxstats", + "fixmate ex1.bam %(out)s_ex1.fixmate.bam", + "flagstat ex1.bam > %(out)s_ex1.flagstat", + # Fails python 3.3 on linux, passes on OsX and when + # run locally + "calmd ex1.bam ex1.fa > %(out)s_ex1.calmd.bam", + # use -s option, otherwise the following error in samtools 1.2: + # Samtools-htslib-API: bam_get_library() not yet implemented + # causes downstream problems + # TODO: The following cause subsequent commands to fail + # unknown option + # "rmdup -s ex1.bam %(out)s_ex1.rmdup.bam", + # "merge -f %(out)s_ex1.merge.bam ex1.bam ex1.bam", + "reheader ex2.sam ex1.bam > %(out)s_ex1.reheader.bam", + "cat -o %(out)s_ex1.cat.bam ex1.bam ex1.bam", + "targetcut ex1.bam > %(out)s_ex1.targetcut", + "phase ex1.bam > %(out)s_ex1.phase", + "view -bt ex1.fa.fai ex1.sam.gz > %(out)s_ex1.bam", + "bam2fq ex1.bam > %(out)s_ex1.bam2fq", + # TODO: not the same + # "pad2unpad -T ex1.fa ex2.bam > %(out)s_ex2.unpad", + # TODO: command line option problem + # "bamshuf ex1.bam -O --output-fmt SAM > %(out)s_ex1.bamshuf.sam", + # "collate ex1.bam %(out)s_ex1.collate", + "bedcov ex1.bed ex1.bam > %(out)s_ex1.bedcov", + "stats ex1.bam > %(out)s_ex1.stats", + "dict ex1.bam > %(out)s_ex1.dict", + # TODO: not the same + # ("addreplacerg -r 'RG\tID:ga\tSM:hs' ex1.bam > %(out)s_ex1.addreplacerg", + ] + + map_command = { + } + + executable = "samtools" + + module = pysam.samtools + + def check_version(self): + + samtools_version = get_version(self.executable) + + def _r(s): + # patch - remove any of the alpha/beta suffixes, i.e., 0.1.12a -> + # 0.1.12 + if s.count('-') > 0: + s = s[0:s.find('-')] + return re.sub("[^0-9.]", "", s) + + if _r(samtools_version) != _r(pysam.__samtools_version__): + warnings.warn( + "versions of pysam.%s and %s differ: %s != %s" % + (self.executable, + self.executable, + pysam.__samtools_version__, + samtools_version)) + + def setUp(self): + '''setup tests. + + For setup, all commands will be run before the first test is + executed. Individual tests will then just compare the output + files. + + ''' + self.check_version() + + self.workdir = os.path.join(WORKDIR, "samtools_test") + + if not os.path.exists(self.workdir): + os.makedirs(self.workdir) + + for f in self.requisites: + shutil.copy(os.path.join(BAM_DATADIR, f), + os.path.join(self.workdir, f)) + + self.savedir = os.getcwd() + os.chdir(self.workdir) + + return + + def get_command(self, statement, map_to_internal=True): + """return samtools command from statement""" + parts = statement.split(" ") + command = parts[0] + if map_to_internal: + return self.map_command.get(command, command) + else: + return command + + def check_statement(self, statement): + + parts = statement.split(" ") + r_samtools = {"out": self.executable} + r_pysam = {"out": "pysam"} + + command = self.get_command(statement) + + # self.assertTrue(command in pysam.SAMTOOLS_DISPATCH) + + targets = [x for x in parts if "%(out)s" in x] + samtools_targets = [x % r_samtools for x in targets] + pysam_targets = [x % r_pysam for x in targets] + + pysam_method = getattr(self.module, command) + + # run samtools + full_statement = re.sub(r"%\(out\)s", self.executable, statement) + run_command(" ".join((self.executable, full_statement))) + # sys.stdout.write("%s %s ok" % (command, self.executable)) + + # run pysam + if ">" in statement: + assert parts[-2] == ">" + parts = parts[:-2] + + # avoid interpolation to preserve string quoting, tab chars, etc. + pysam_parts = [re.sub(r"%\(out\)s", "pysam", x) for x in parts[1:]] + output = pysam_method(*pysam_parts, + raw=True, + catch_stdout=True) + # sys.stdout.write(" pysam ok\n") + if ">" in statement: + with open(pysam_targets[-1], "wb") as outfile: + if output is not None: + outfile.write(force_bytes(output)) + for samtools_target, pysam_target in zip(samtools_targets, + pysam_targets): + if os.path.isdir(samtools_target): + samtools_files = glob.glob(os.path.join( + samtools_target, "*")) + pysam_files = glob.glob(os.path.join(pysam_target, "*")) + self.assertEqual(len(samtools_files), len(pysam_files)) + # need to be able to exclude files like README, etc. + continue + else: + samtools_files = [samtools_target] + pysam_files = [pysam_target] + + for s, p in zip(samtools_files, pysam_files): + binary_equal = checkBinaryEqual(s, p) + error_msg = "%s failed: files %s and %s are not the same" % ( + command, s, p) + if binary_equal: + continue + elif s.endswith(".bam"): + self.assertTrue( + check_samtools_view_equal( + s, p, without_header=True), + error_msg) + else: + check_lines_equal( + self, s, p, + filter_f=lambda x: x.startswith("#"), + msg=error_msg) + + def testStatements(self): + for statement in self.statements: + command = self.get_command(statement, map_to_internal=False) + # bam2fq differs between version 1.5 and 1.6 - re-enable if + # bioconda samtools will be available. + # flagstat differs between version <=1.12 and >=1.13 + if command in ("bedcov", "stats", "dict", "bam2fq", "flagstat"): + continue + + if (command == "calmd" and + list(sys.version_info[:2]) == [3, 3]): + # skip calmd test, fails only on python 3.3.5 + # in linux (empty output). Works in OsX and passes + # for 3.4 and 3.5, see issue #293 + continue + self.check_statement(statement) + + @unittest.skipIf(sys.platform == "darwin", "not supported, pattern does not match") + @unittest.skipIf(not sys.stdin.isatty(), "skipping usage tests, stdin is not a tty") + def testUsage(self): + if self.executable == "bcftools": + # bcftools usage messages end with exit(1) + return + + for statement in self.statements: + command = self.get_command(statement, map_to_internal=False) + # ignore commands that exit or cause other failures + # TODO: check - if reheader or phase is run in testStatements, sort fails + # here + if command in ("view", "sort", "bam2fq", "flagstat", "reheader", + "stats", "idxstats"): + continue + mapped_command = self.get_command(statement, map_to_internal=True) + pysam_method = getattr(self.module, mapped_command) + usage_msg = pysam_method.usage() + expected = r"Usage:\s+{} {}".format(self.executable, command) + self.assertTrue(re.search(expected, usage_msg) is not None) + + def tearDown(self): + if os.path.exists(self.workdir): + shutil.rmtree(self.workdir) + os.chdir(self.savedir) + + +class EmptyIndexTest(unittest.TestCase): + + def testEmptyIndex(self): + self.assertRaises(IOError, pysam.samtools.index, + "exdoesntexist.bam") + + def testEmptyIndexWithExtraFlag(self): + self.assertRaises(IOError, pysam.samtools.index, + "-c", + "exdoesntexist.bam") + + def testEmptyIndexWithExtraArg(self): + self.assertRaises(IOError, pysam.samtools.index, + "-c", + "-m", + "14", + "exdoesntexist.bam") + + +if sys.platform != "darwin": + # fails with segfault with htslib 1.5 on Osx, an issue with flockfile + # issue seems to be with repeated calls to interface + + class TestReturnType(unittest.TestCase): + + def testReturnValueString(self): + retval = pysam.idxstats(os.path.join(BAM_DATADIR, "ex1.bam")) + if IS_PYTHON3: + self.assertFalse(isinstance(retval, bytes)) + self.assertTrue(isinstance(retval, str)) + else: + self.assertTrue(isinstance(retval, bytes)) + self.assertTrue(isinstance(retval, basestring)) + + def testReturnValueData(self): + args = "-O BAM {}".format(os.path.join(BAM_DATADIR, + "ex1.bam")).split(" ") + retval = pysam.view(*args) + + if IS_PYTHON3: + self.assertTrue(isinstance(retval, bytes)) + self.assertFalse(isinstance(retval, str)) + else: + self.assertTrue(isinstance(retval, bytes)) + self.assertTrue(isinstance(retval, basestring)) + + class StdoutTest(unittest.TestCase): + '''test if stdout can be redirected.''' + + def testWithRedirectedStdout(self): + r = pysam.samtools.flagstat( + os.path.join(BAM_DATADIR, "ex1.bam")) + self.assertTrue(len(r) > 0) + + def testWithoutRedirectedStdout(self): + r = pysam.samtools.flagstat( + os.path.join(BAM_DATADIR, "ex1.bam"), + catch_stdout=False) + self.assertEqual(r, None) + + def testDoubleCalling(self): + # The following would fail if there is an + # issue with stdout being improperly caught. + retvals = pysam.idxstats( + os.path.join(BAM_DATADIR, "ex1.bam")) + retvals = pysam.idxstats( + os.path.join(BAM_DATADIR, "ex1.bam")) + + def testSaveStdout(self): + outfile = get_temp_filename(suffix=".tsv") + r = pysam.samtools.flagstat( + os.path.join(BAM_DATADIR, "ex1.bam"), + save_stdout=outfile) + self.assertEqual(r, None) + with open(outfile) as inf: + r = inf.read() + self.assertTrue(len(r) > 0) + + class PysamTest(SamtoolsTest): + """check access to samtools command in the pysam + main package. + + This is for backwards capability. + """ + + module = pysam + +# class BcftoolsTest(SamtoolsTest): + +# requisites = [ +# "ex1.fa", +# "ex1.vcf.gz", +# "ex1.vcf.gz.tbi", +# ] +# # a list of statements to test +# # should contain at least one %(out)s component indicating +# # an output file. +# statements = [ +# # "index -n ex1.vcf.gz > %(out)s_ex1.index", + +# "annotate -x ID ex1.vcf.gz > %(out)s_ex1.annotate", +# "concat -a ex1.vcf.gz ex1.vcf.gz > %(out)s_ex1.concat", +# "isec -p %(out)s_ex1.isec ex1.vcf.gz ex1.vcf.gz", +# "merge --force-samples ex1.vcf.gz ex1.vcf.gz > %(out)s_ex1.norm", +# "norm -m +both ex1.vcf.gz > %(out)s_ex1.norm", + +# # "plugin", +# # "query -f '%CHROM\n' ex1.vcf.gz > %(out)s_ex1.query", +# # "reheader -s A > %(out)s_ex1.reheader", +# # "view ex1.vcf.gz > %(out)s_ex1.view", +# # "call -m ex1.vcf.gz > %(out)s_ex1.call", +# # bad file descriptor +# # "consensus -f ex1.fa ex1.vcf.gz > %(out)s_ex1.consensus" +# # need appropriate VCF file +# # "cnv", +# # segfault +# # "filter -s A ex1.vcf.gz > %(out)s_ex1.filter", +# # exit +# # "gtcheck -s A ex1.vcf.gz > %(out)s_ex1.gtcheck", +# # segfault, used to work with bcftools 1.3 +# # "roh -s A ex1.vcf.gz > %(out)s_ex1.roh", +# "stats ex1.vcf.gz > %(out)s_ex1.stats", +# ] + +# map_command = { +# } + +# executable = "bcftools" + +# module = pysam.bcftools + + +if __name__ == "__main__": + print("starting tests") + unittest.main() + print("completed tests") diff --git a/tests/tabix_bench.py b/tests/tabix_bench.py new file mode 100644 index 0000000..ce7077d --- /dev/null +++ b/tests/tabix_bench.py @@ -0,0 +1,180 @@ +import gzip +import os +import pysam + +from TestUtils import TABIX_DATADIR + +FN_COMPRESSED = "example.bed.gz" +FN_UNCOMPRESSED = "example.bed" +FN_LARGE_COMPRESSED = "example_large.bed.gz" +FN_LARGE_UNCOMPRESSED = "example_large.bed" + + +def read_python_compressed(fn): + '''iterate through with python.''' + with gzip.open(fn, mode="r") as f: + return len([x.split(b"\t") for x in f]) + + +def read_python_uncompressed(fn): + with open(fn) as f: + return len([x.split("\t") for x in f]) + + +def fetch_plain(fn): + with pysam.Tabixfile(fn) as f: + return len(list(f.fetch())) + + +def fetch_parsed(fn): + with pysam.Tabixfile(fn) as f: + return len(list(f.fetch(parser=pysam.asBed()))) + + +def iterate_generic_compressed(fn): + with gzip.open(fn) as f: + return len(list(pysam.tabix_generic_iterator(f, parser=pysam.asBed()))) + + +def iterate_generic_uncompressed(fn): + with open(fn) as f: + return len(list(pysam.tabix_generic_iterator(f, parser=pysam.asBed()))) + + +def iterate_parsed_compressed(fn): + with gzip.open(fn) as f: + return len(list(pysam.tabix_iterator(f, parser=pysam.asBed()))) + + +def iterate_parsed_uncompressed(fn): + with open(fn) as f: + return len(list(pysam.tabix_iterator(f, parser=pysam.asBed()))) + + +def iterate_file_compressed(fn): + with gzip.open(fn) as f: + return len(list(pysam.tabix_file_iterator(f, parser=pysam.asBed()))) + + +def iterate_file_uncompressed(fn): + with open(fn) as f: + return len(list(pysam.tabix_file_iterator(f, parser=pysam.asBed()))) + + +def test_read_python_compressed(benchmark): + result = benchmark(read_python_compressed, + os.path.join(TABIX_DATADIR, FN_COMPRESSED)) + assert result == 164 + + +def test_read_python_uncompressed(benchmark): + result = benchmark(read_python_uncompressed, + os.path.join(TABIX_DATADIR, FN_UNCOMPRESSED)) + assert result == 164 + + +def test_fetch_plain(benchmark): + result = benchmark(fetch_plain, os.path.join(TABIX_DATADIR, FN_COMPRESSED)) + assert result == 164 + + +def test_fetch_parsed(benchmark): + result = benchmark(fetch_parsed, os.path.join( + TABIX_DATADIR, FN_COMPRESSED)) + assert result == 164 + + +def test_iterate_generic_compressed(benchmark): + result = benchmark(iterate_generic_compressed, + os.path.join(TABIX_DATADIR, FN_COMPRESSED)) + assert result == 164 + + +def test_iterate_generic_uncompressed(benchmark): + result = benchmark(iterate_generic_uncompressed, + os.path.join(TABIX_DATADIR, FN_UNCOMPRESSED)) + assert result == 164 + + +def test_iterate_parsed_compressed(benchmark): + result = benchmark(iterate_parsed_compressed, + os.path.join(TABIX_DATADIR, FN_COMPRESSED)) + assert result == 164 + + +def test_iterate_parsed_uncompressed(benchmark): + result = benchmark(iterate_parsed_uncompressed, + os.path.join(TABIX_DATADIR, FN_UNCOMPRESSED)) + assert result == 164 + + +def test_iterate_file_compressed(benchmark): + result = benchmark(iterate_file_compressed, + os.path.join(TABIX_DATADIR, FN_COMPRESSED)) + assert result == 164 + + +def test_iterate_file_uncompressed(benchmark): + result = benchmark(iterate_file_uncompressed, + os.path.join(TABIX_DATADIR, FN_UNCOMPRESSED)) + assert result == 164 + + +def test_read_python_large_compressed(benchmark): + result = benchmark(read_python_compressed, os.path.join( + TABIX_DATADIR, FN_LARGE_COMPRESSED)) + assert result == 100000 + + +def test_read_python_large_uncompressed(benchmark): + result = benchmark(read_python_uncompressed, os.path.join( + TABIX_DATADIR, FN_LARGE_UNCOMPRESSED)) + assert result == 100000 + + +def test_fetch_plain(benchmark): + result = benchmark(fetch_plain, os.path.join( + TABIX_DATADIR, FN_LARGE_COMPRESSED)) + assert result == 100000 + + +def test_fetch_parsed(benchmark): + result = benchmark(fetch_parsed, os.path.join( + TABIX_DATADIR, FN_LARGE_COMPRESSED)) + assert result == 100000 + + +def test_iterate_generic_large_compressed(benchmark): + result = benchmark(iterate_generic_compressed, os.path.join( + TABIX_DATADIR, FN_LARGE_COMPRESSED)) + assert result == 100000 + + +def test_iterate_generic_large_uncompressed(benchmark): + result = benchmark(iterate_generic_uncompressed, os.path.join( + TABIX_DATADIR, FN_LARGE_UNCOMPRESSED)) + assert result == 100000 + + +def test_iterate_parsed_large_compressed(benchmark): + result = benchmark(iterate_parsed_compressed, os.path.join( + TABIX_DATADIR, FN_LARGE_COMPRESSED)) + assert result == 100000 + + +def test_iterate_parsed_large_uncompressed(benchmark): + result = benchmark(iterate_parsed_uncompressed, os.path.join( + TABIX_DATADIR, FN_LARGE_UNCOMPRESSED)) + assert result == 100000 + + +def test_iterate_file_large_compressed(benchmark): + result = benchmark(iterate_file_compressed, os.path.join( + TABIX_DATADIR, FN_LARGE_COMPRESSED)) + assert result == 100000 + + +def test_iterate_file_large_uncompressed(benchmark): + result = benchmark(iterate_file_uncompressed, os.path.join( + TABIX_DATADIR, FN_LARGE_UNCOMPRESSED)) + assert result == 100000 diff --git a/tests/tabix_data/Makefile b/tests/tabix_data/Makefile new file mode 100644 index 0000000..19812df --- /dev/null +++ b/tests/tabix_data/Makefile @@ -0,0 +1,40 @@ +all: all.stamp + +DERIVED_FILES = \ + empty.bed.gz.tbi \ + example.bed.gz example.bed.gz.tbi \ + example.gff2.gz.tbi \ + example.gff3.gz.tbi \ + example.sam.gz.tbi \ + example.vcf.gz.tbi \ + example_badcomments.bed.gz.tbi \ + example_badcomments.gtf.gz.tbi \ + example_badcomments.sam.gz.tbi \ + example_badcomments.vcf.gz.tbi \ + example_comments.bed.gz.tbi \ + example_comments.gtf.gz.tbi \ + example_comments.sam.gz.tbi \ + example_comments.vcf.gz.tbi \ + example_large.bed.gz.tbi \ + fivecolumns.bed.gz fivecolumns.bed.gz.tbi + +all.stamp: $(DERIVED_FILES) + touch $@ + +%.gz: % + bgzip -c $< > $@ + +%.gff2.gz.tbi: %.gff2.gz + tabix -p gff $< + +%.gff3.gz.tbi: %.gff3.gz + tabix -p gff $< + +%.gtf.gz.tbi: %.gtf.gz + tabix -p gff $< + +%.gz.tbi: %.gz + tabix -p $(subst .,,$(suffix $*)) $< + +clean: + -rm -f all.stamp $(DERIVED_FILES) diff --git a/tests/tabix_data/empty.bed.gz b/tests/tabix_data/empty.bed.gz new file mode 100644 index 0000000000000000000000000000000000000000..a776e8d995dc9c98882e0db160c0453d340e7fe8 GIT binary patch literal 28 bcmb2|=3rp}f&Xj_PR>jW(hSUCE{FgCFhK%g literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example.bed b/tests/tabix_data/example.bed new file mode 100644 index 0000000..544e42d --- /dev/null +++ b/tests/tabix_data/example.bed @@ -0,0 +1,164 @@ +chr1 1737 2090 +chr1 1737 4275 +chr1 1873 1920 +chr1 1873 3533 +chr1 2042 2090 +chr1 2476 2560 +chr1 2476 2584 +chr1 2838 2915 +chr1 3084 3237 +chr1 3084 4021 +chr1 3084 4275 +chr1 3316 3533 +chr1 4022 4024 +chr1 4022 4249 +chr1 4226 4561 +chr1 4226 4692 +chr1 4226 19233 +chr1 4226 19433 +chr1 4250 4252 +chr1 4250 4275 +chr1 4267 4364 +chr1 4267 19433 +chr1 4559 4561 +chr1 4562 4692 +chr1 4833 4901 +chr1 4868 4901 +chr1 5659 5764 +chr1 5659 5810 +chr1 5767 5810 +chr1 6470 6628 +chr1 6717 6918 +chr1 6721 6918 +chr1 7096 7141 +chr1 7096 7227 +chr1 7096 7231 +chr1 7139 7141 +chr1 7142 7231 +chr1 7414 7416 +chr1 7414 7605 +chr1 7414 19206 +chr1 7417 7605 +chr1 7465 7605 +chr1 7469 7605 +chr1 7778 7924 +chr1 8131 8226 +chr1 8131 8229 +chr1 8227 8229 +chr1 8776 8868 +chr1 8776 8938 +chr1 8866 8868 +chr1 8869 8938 +chr1 14601 14706 +chr1 14601 14754 +chr1 14704 14706 +chr1 14707 14754 +chr1 19184 19206 +chr1 19184 19233 +chr1 19397 19433 +chr1 19417 19902 +chr1 19417 20960 +chr1 19417 20972 +chr1 20130 20530 +chr1 20130 20972 +chr1 20229 20366 +chr1 20427 20530 +chr1 20839 20960 +chr1 20839 20972 +chr1 24417 25003 +chr1 24417 25037 +chr1 24417 25944 +chr1 25001 25003 +chr1 25004 25037 +chr1 25108 25344 +chr1 25108 25936 +chr1 25140 25344 +chr1 25584 25599 +chr1 25584 25936 +chr1 25584 25944 +chr1 25597 25599 +chr1 25600 25944 +chr1 42912 42930 +chr1 42912 44799 +chr1 44693 44796 +chr1 44693 44799 +chr1 44797 44799 +chr1 52811 53750 +chr1 58918 58953 +chr1 58918 59971 +chr1 58954 58956 +chr1 58954 59868 +chr1 59869 59871 +chr1 59869 59971 +chr1 79158 81492 +chr1 79158 110795 +chr1 79158 123429 +chr1 79414 79913 +chr1 79414 80968 +chr1 80150 80968 +chr1 81954 82103 +chr1 82093 82103 +chr1 82093 119080 +chr1 100816 101220 +chr1 100816 119036 +chr1 102563 102667 +chr1 110584 110795 +chr1 110638 110795 +chr1 118918 119036 +chr1 118918 119080 +chr1 118944 119086 +chr1 118944 123429 +chr1 120967 123786 +chr1 123237 123429 +chr1 125110 125869 +chr1 125110 127902 +chr1 125110 129483 +chr1 127146 127148 +chr1 127146 127938 +chr1 127146 129483 +chr1 127149 127938 +chr1 127432 127902 +chr1 129119 129483 +chr1 129481 129483 +chr1 129653 129710 +chr1 129653 130202 +chr1 129938 130202 +chr1 131337 132874 +chr1 131337 139570 +chr1 132671 132874 +chr1 132671 136694 +chr1 136249 136372 +chr1 136249 139570 +chr1 136505 136694 +chr1 147647 147749 +chr1 147647 147750 +chr1 150309 150553 +chr1 150309 151388 +chr1 151177 151388 +chr1 154268 154654 +chr1 154268 163727 +chr1 155747 155805 +chr1 155752 155805 +chr1 155752 158630 +chr1 157963 158028 +chr1 158473 158630 +chr1 158912 159127 +chr1 162420 162551 +chr1 163616 163727 +chr2 28814 31610 +chr2 28814 31627 +chr2 28814 36385 +chr2 28814 36870 +chr2 31220 31627 +chr2 31220 32952 +chr2 31221 31627 +chr2 31221 36870 +chr2 31608 31610 +chr2 31611 31627 +chr2 32809 32952 +chr2 35440 36385 +chr2 36383 36385 +chr2 36807 36870 +chr2 187569 189901 +chr2 187569 192605 +chr2 190164 192605 diff --git a/tests/tabix_data/example.gff2.gz b/tests/tabix_data/example.gff2.gz new file mode 100644 index 0000000000000000000000000000000000000000..4084a744555d0da52c679778938d60bfd3aa2cd2 GIT binary patch literal 238 zcmb2|=3rp}f&Xj_PR>jW7a3aneYp=A@U)%(7+xXn{c9)hO-GkKynzDiuZEgm(8^{1 zS7UA8W^l!!g43qbX`8|JdvnUwZ)AkO4v5z=aNL=&$(w2Mjpn!FCayPA`D3kuCq3Bm zbxG?KuaMc9iv(I+oQx%yn-_1aTc5jchWP87TMoEi>?!{FFly%Niwk4VYb-mTqM5MA zW5KG^dva=K@Mz0#;r_|py?JBmzo!4USzebMl(mwst$vZ;x`4w+sXN|Q^>Xm$eP2yv aem>x1tnY59W@KQHNAr<112fozAOZkz&|jed literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example.gff3.gz b/tests/tabix_data/example.gff3.gz new file mode 100644 index 0000000000000000000000000000000000000000..b42b41baf835c0ebb1dce9d0485e315af4503a90 GIT binary patch literal 3067 zcmVdXvqf~1QCI(5$}QWQy1_wma$e)#y|<@x8Ie)#2&>+{RQ z_20j|T_1jbeY`&Z@%ABds$KrfsmfowlmCAF$NfKl41tJ4x%}|k^TX?n{?o(D)BTs% zhr5^O>s@W7-^I)0m+RM;d-*e7Ucdf%eSEtAc=`PF@b>5R>HhDYdwG3(xW3(wr?<<~ z@1O1`g3IgU*X#J-U&r74bbojGd>s$`c=_(}fAB~l)hd6MkmRp@{}+!?Q%yHKRNr{S z6zGl+9^>g{@|XxbkMI9~9K{G&CorY2b4{#^v*^wU~GB_ML!!mHnHY-%Vz2un@k-fBahFE%z%K9 zpe5A*f7LqK0hiO#Q?EM zy_PUPIr!jAwWN*B&|Pp24PztE&t@CNfNYqNxN{kwEu^w9n^;=C^)%JpvMJEkug}+Y zV;F#SlS&P>m-)%vtsD93Qg4I6)HgPzL@1=`^No#S0Bj@ha^N^WV|EFR1kBCTRNrlr zBeZVx`I-e72EaDrJ0vT4esYexZ6pJv+bE#=&ZagfLhJK23K#|?sgeDnrL3Rb#k8?b zvRgO#ST|6Drq9<@z%T%8TB~(L==tf_&4|d!MQ9(>n4p-Z&sW6KH9^D`HhbH<*+=4eyjLt5=n5YXpq5HJi#VlxUz zj!lK;tF$P~V&gOQy-FiapP>CyA*g*83@BF%BxY_Z5V=Hptd{InPd-);mU}7!V`L~G zM&iF+Hk=`FNY3e`MvJ%msOlRdZW+u!CjzSt3e%iwws8>6A`j5=dprwCSWO;JE?sn!yWQf>;9k;~$m z%i@|}M;)_~BCul4P#`uE`|wDzrx3HN=R!?|_O@Xmzae#O9Vvp>RTSIniOGZ5^rZY*e8A$PgrBq$m&@5!Fhm ztB^uCYrE`fJ6}KK2xZ)cz-(kF5F3%0nIsFELOQxUlD2JLH}&1?BG%5eq;!=<+D&AHWD`6#yT28PuXWdT#Abf<%kR&s$UHP zFG>>zWTY-zBnK5@<}=t;N69C4+&*KB27=m+k)lA1l)F^gxu}riH(J`&CExW(zM;0M zAuzWy6o`$AB=6(URE1U#8&$U<9Stps4G<$mpas%Gf!Ij0_nIoHkjt@evwXs;-s;}jORtw9A&zCap{XSc=rHuvawK?f=WLFsm)q9_nX6j~i+`4Bh+ zAH5}%Zj7ex4pkZy84Q6Y4GRV0b@GpF0!fA3z1NlAw=H(+uF()MMv6dV-9mxbC|4<~ zdsjhztMlM%JIkNCvk^AD%6<;xpT?nmXSaEqJo)75txY#1>$s^ zo9t=9gx1e4F}sw3kCXwk(R?sjU@#OAqau5ZL^u_^(@7vmbq@^bIBjj%*|8$9<5oj~ zcwGxk;(t^jk+V^(VXu#-?gB%BI{Ah`dqE2YV51zkWLfPh@x)btFm%<}9tY{F@J0->{zAT$`tc6tI=(eK~3EYSrA0u)J zs>%(4rgaMiu#R#{HP_r!;8;#Z-7)G1BPak7SN4 z3}Q49G-ISFAg^mla!)d$xnhDON2q(3*catvx&>o25iGA$6bPd{Y7igj7)c3RU3YusFNJdCOAVX)=sa4J@ z@X=CjVwPK{oBA=K0k!K4f>AOUh>b{+#4fq_5Q-T8q!b+`9~lC6YN-e;_g*M4MmdZV zu_@?SyYD$;X-Ymq;Dn8*Du#B; z39^$Iy7qaCXb8=9<}c-w7= z$2J=x7#tKrdZ#pCAe3sQmUB>{9J!Ee;$aUC$@jP-b}Xg{lIB7S1>$y1l3q!CRjAS5 z`lzXI&F`tZT&QBfP7!ELu}}auVkt|wrl@}MXA)1yXq1pAno%S?HGv!$G;7OEvk1M z*qbCum7hPG6ytH-h4)FJsqd>Qw}(gYodpxb`wJx$2u4dvI3AaHrqsxLU}E0yVDoW{ zhr+Mm>tqZ?Tf7traN}2uqbF4%mEh;kX38c z$fQ)iabTPG4wz3YBrSni4Gi&})x?2#U!q7> z@7%%4kcA;ER*C~+CCgH3wYa2XaJQ%JRduTSmmz?`LNP2>h67~PQ?11$&dvkFn6ls7 z6#i%f&>0tNYFDc2fB#RU&N}fbM1uCNn!_<#oo)7Yny#4wJi??T=-hTY$ z!{YPR^je?EG8yjiVpAMd|EZ5mt^ z4Y-huYTKar*{A<~UmhKQe|&ga-mk82AMWl~UpC)cKixe2SRWn#=j{B?v&|P*H{a|J zTwVa2Fn$5-4K#n3r^8x{cDJ=}?RI`biTeeAE&pErb;N!?`g-&C&Fbdb{a22T&#$iD zfBsm$Z~Mnc+w@I2hUoW#zR)`*oMyWtgq{eUE4iRTBJ_!&*Q3=6y5<-? z#7C-f_*`KGM-iwRTX_ehtPAr;}(0)$R&kH#MhtJ?(NTyas~WBdEELyxK%% zfeQ>R!VwhKet6AQU-iYB3KSm(s@34df{Ko4cSW^+dicJHN~s|3K{3Kgh_DJ~n0h9p zo}5ax;7sxi+od&dHQA6HCFy*&VLWMg#w47~1QO2OWxxXXU?Ygc`-pehQX$MX^Xj&x zhw7gjS-lO}wsA5=PCicB4qk2uASW-U!XGy{VIJX6P!ZJrK+SdJHKIB#buK52F?wSR z=M03j!G%y&0FA+gckDJn;n?+g&61M_g3cgDPzb8e8H~XRok5&4P&T=LMva+)f9y6u zp)>HMnvyHBkdkT?RM2TQIiWA`4m^cXv)fEmvKPM@&IUPi(-vEU5Uoa`C zxm&35K+V)dHKL0VIAL@V64Jm=M7<(Z#^Dv>j&1V!;b02;qqMG~o8xz$`2Vmnitx-r}@|bj9 zyNfnB#vDIzjU{$*-T_giiV6?X-V3R@MjYM44@I>fRC85TBaSu9;Gx75 z#<5MDP9*rys?BR7*YNP8 z>9c*uLCqFySPxVwvi7oWL|xYGP-CA=N+(_At}jkZDUcJ}QkS%K`?r;%iu7RT}xG@hy!3a8eU) z=YDQ92C2rN!4#u`5qy@=&Swb|*g%O$6J=U5MVmUJO>L4z129fHu&oYtCP1Mf7z=GN zB_$*wsMc(x^^H@U8ldi3tqXL^l#!xP#mkg};k$FGX-uCdIXjm}vaoKuZk2O&-R#-| z(k-&X08&h_RY15Z3|TUeR)ZH0#0#UAUFw(EY2_aJAmnGf2;lz zf;=Eb!~}Va7LjdF@o(YPGf}r1On^EUZxUMHY%U6NAA&3{8`ti#F8dVBOB$52ZZ$xf zQ3*PC8Q0SIU34lk#|jp`wh2God^tM))kaYEi?_FTYxic{KN%6l28Qq_z#~6_&Y7Qz zw=oKk_q4oAdz;6*)!>Elj<+5>U~^HK`%-3ozS5aqUOc5Y7Deo%V0S5Vh1--zU?J{F zRsNiCIo`%SE8Bw9C!<~jbro(j<@*WhlmVd^8f?Z9SRm1am{7VRC1+%ZcUEDv@t_~A zFxn)PpIgc@l5!w5ELj5(Wde7DAnf6=i@3SMOc@Uy*6PRHYVfKsCn4^#2F2}m#z3fo z-xwa;CSin7GM(Jn`5$jTc*yZQa+|LGuag=FqU%Fu>abclHlaV*ZL=l$pzyg)bFxlcUnOE?YI9?Sijj?Ias{ ztHD&rM*y7!*=q_=qI;BRWfhpEjn;R1>nm&?;$B?IP-u6r4({%CtBJXrVJKMNO z=G_jHTXMhs6$w@Ml&h#S;1yvVRri6C+h_QyJPRJ-PYu6ve-(Dab@-4)5B64riLno_ zlWTPzkGtcB7OH^D@+GvC-6vHh%8L?S1+#=pNV>Sy3Sf8f`Oc+4e2pEwTX4b4coAIp zj`?SNLrvWQ;w$bocHB%|cD_Rpky|sIRGd+aX!a1%H05dlOnsQ6dx>-}ZE$EG`@@>r zU91iqpzzY|q>+NT7X_gu6Jv-BaWhPr-NW^=Dnomwmhz`JQf8K@Rac~~Y;&$sy^=E{ zH0Y1KoLdcE73UGO?sPw~#%PHbMn_oS$^7!3!eYU*}T%hIqzm6E)!MJt$}Ui;Am1(+ zVusk?e_E{xWmyTN+q-od%C2}zX^{6syenl(>gKYTWGWC@AnEZ)qqUygT1!C$T90Wo z-JBxhN^<316c1DgaH4cDF_F8d*Q?93)9Ya+FuIF!M~8#7tox5=&c@Pe@G7u)k<=YK z>ZNBGiGXjQRMPM<`lKwPYGa9D@wxM!%*{`yyz$R6dT>eT4}Y=NZZM$Qvu5XQ?mXeg6+CNcltn0096WiwFb&00000{{{d;LjnLP z1MS+;ZrU&u2H@-LDNt^wR`#)dY^zs@b*r?NN-OOyQ3O$o)CB}twY~l9kkAkaBu#>b zWYjh)J$1s@(;wSP{Cm~&zYp(!4*jcMybPk%WI0>J<0$wQ_Wb@Wf@DNrQn&y@P04Hc z7QXi2s`nDS1yL}54kJ@{KN{UU-hCtM2M7@Urs93jtZtOnNs8LP`ZRf2Qtzh!)F1Xe zJDf)aG3PV~%9Qdhz0c;;{$MhHsnB}+s`nQpzZ?Hum!BXNyfsq-^DO}B=B=8+|)Qab5V zNOM4C4=A`%zSu9#G(&Yr8c_&YUwU}|bbVVQEt^4SLzhF#I?h~?O3sAI{rS6gMkYai z#JNy#R?fAI%hR`^pzG9Qoth?sklbdkP((QAPMrlbch*!RoS}2&IayU_YMsi{Bh^;O zh|}&uJMC(zky&Q~%B4q#>Cuj}>*r(rthi(@H%{QJsm*8e)y?iY%nbw%#2$p8&bdQp zh7{durG00}oF7L&JWz^qk5Q!M;Y@9U(*wv1B;xL-W*p9<@nk-oMb8yBh`#pkC?$gu z+wHOHYzw91UXX3lIC$>)gTa>v^WOqDMfoqTKZ$;Mq~uH=Ujrcm%7n^y|#%yTyt7&U-RQ-P!T;GH@( z-KKxXz=58xX0@ zXqTPcD7QI5<$Y%BEM+BUzT=#117*${Fu7Z!wsWE2tek5Zmn{Pu3%X7{)~V}6FhPLa sIk)Wm50iKxG}SKv03VA81ONa4009360763o02=@U000000000001%faGynhq literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example.gtf.gz.tbi b/tests/tabix_data/example.gtf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..aa5009d670651dcf2d21e9c62982396099705b52 GIT binary patch literal 196 zcmb2|=3rp}f&Xj_PR>jW%Ne)}Kc%E3H88j-q%kIiDTK9k6*3kUxlL5;Fkm`eW#kxg z=)l$O0#*SWN_>wu|7*G67*Hr-AGM`T+NIhzDIvkhh+VC&n^CktaihJL7Rb zajf0R>-0U}ed+%<4yDRxc+YtJYq%-BmUW@?f_JSSB_*bPRNO7TOioR&=UJRwit)lN glUY{DPPt^jz%WNYZs9&g1_pUFcSjWg^YVA`e!#g2pm2Cc=?N!%P+j^`F~wxi*y$E#bp<#Tsl2T z%2Cl!QSjH--K*791YYRAI%kz%`J*`QhgIYGDUX?r54~aDG)4TXT;eK~+gs0@yfQs+ zbf}UiU)audhHizLidTw3?YlTd?+Pi!O1mbH%FTDC{MnwT9hY*&1KHpX1y<%ye>e0gZ){exQw~vzl7nay7aWP$W zob_Rr@|om+cYTB3zxuzgNbciN!E>oA1Z}6N&9rZr#vLm)k6n#1jJt;|T>xUPJ6QLA&% mlCp63)YQInU8-eepSS#D=-ct;yazJ_gFIS@OEUlkp#T8fc(8u} literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example.vcf.gz b/tests/tabix_data/example.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..277bd7bce7ff60ded736f4df4ccf77a1bef6f210 GIT binary patch literal 328 zcmb2|=3rp}f&Xj_PR>jW+Kj0a_vRfo;Au&J7Rl0XzbNJMhXvPGY~JD_u;1arO6Ne6 zmowV+mACU=;%TZlUAyP8u>kj`l#GOL;>J0r>-hD5JN_!Pp73QUkFn2YUu)^@+io(> zyJ!++=Bt=Eb>r3yFGtRT-f1T)TqQNU+$`n^Wu=@oaAbVE1ur9ao>4QUp6B~TJc20YKFmFXkTJok8okrsg!8b3g;N{tqCcHIb zrB0yi$A90d{#eNFI}t1QS0r&(_y2t#d?(&zHTyf!h9Oj2{)UFMe(OT_Uu;jJ7sq{L RWMGg-3oB^`W^mAf2mq^5hqC|x literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example.vcf40 b/tests/tabix_data/example.vcf40 new file mode 100644 index 0000000..07e0746 --- /dev/null +++ b/tests/tabix_data/example.vcf40 @@ -0,0 +1,23 @@ +##fileformat=VCFv4.0 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=1000GenomesPilot-NCBI36 +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 +M 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2 +17 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,. +20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3 +20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4 +20 1234567 microsat1 GTCT G,GTACT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3 diff --git a/tests/tabix_data/example_0v23.bed.gz b/tests/tabix_data/example_0v23.bed.gz new file mode 100644 index 0000000000000000000000000000000000000000..b67da76bc82bb554a4ded832c9fb696b351205a0 GIT binary patch literal 819 zcmV-31I+v%iwFb&00000{{{d;LjnL618tT&0yQTHh3m;`b|NQ+AJYZxGju?Oa*^<#@NjG{Ra5PCm^hz9z%@^79LD5q>FX`kD2CSZGI6s7B zP4YnKa!-Q@w2hl~I1BC)IhI7!hee@F4Qw+1X!rGM{k?2E< zVjtRx9*$A1uHK|*`ifQ8uXI?8nGM#YvW-U-eMtj*G+;}FCT)a11`J&y+99c0fub8j zZgFd6;8|#wI;6>YTE1pGnpI92U7Go0QJd;OS>)!Na_w=}tV_$I=DD6-29gVoT87i!R~{9!^#+Rfr`}v!4=wR42Mfr`EU^!8T~?^%L{^Z10JVErjA)g zoS?ZZ&|Jb!7agNpa3-LcE27q80k(4CJeBkVdV_6YIZ6Y94q1{(1*_-w&r;|B5e6Fw z|4KbT>{B|cG0W|;!0y8`mwE;USAKZ`z_5^mAaO;C#V=$dfI9Fz5EUK+GUasub83!I zyX$#c=)V9UhS%90!!u>W0K^NWRc#=Q+#s4C)pbyE_H$GFPh?%mFZ5f`qpuI`NhD%^ zk)Ein2+UxxiELZpyqGR4$qCF)?!txai{V0%xxP@QP<=msqb~^+x*X%SV!~_0$p5<> zvko^>q4}}8K?>2p)>q7h?udZqN)Wp7g+i?QqPz#;vRX(rHd35FL`sGi>V2sUIUVyM z!M}WKb;mbUL6@hNM$C^?*lh&lwS>7rW*5q9+~-GkK3{0gv<{|-%@H%_)QvTf;Qu36 z+Vjd(LK6+#BRU&hRz4FENR~BXt__a)5rIOaGlurO^7-YN0iJvxy&K!WWsxx?CvaOX zG^4b;EP(MogI)l)1)P0oCiFIsSv_4algiPlaHjk=v00@PcwV$^lzf0nX2Fc&^=|r5 x;Cf0V%0}fv{{lVu=?3Qt001A02m}BC000301^_}s0stET0{{R300000000jW*BQ7AKc%E3F)+F*q$DtGoY@#LlaXmhgN5bd69O(0h6T)( z^L%&`rphnS%DSPjWx0Th3|q`h#Vz6?GRNwVGcDY^@R7kjW9^o2ja`R->|U@%A1EH) zbn7*{X#2<51zYSxYC8m>3x3(flRNzzp^#hyVc409dgA literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_0v23.vcf.gz b/tests/tabix_data/example_0v23.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..277bd7bce7ff60ded736f4df4ccf77a1bef6f210 GIT binary patch literal 328 zcmb2|=3rp}f&Xj_PR>jW+Kj0a_vRfo;Au&J7Rl0XzbNJMhXvPGY~JD_u;1arO6Ne6 zmowV+mACU=;%TZlUAyP8u>kj`l#GOL;>J0r>-hD5JN_!Pp73QUkFn2YUu)^@+io(> zyJ!++=Bt=Eb>r3yFGtRT-f1T)TqQNU+$`n^Wu=@oaAbVE1ur9ao>4QUp6B~TJc20YKFmFXkTJok8okrsg!8b3g;N{tqCcHIb zrB0yi$A90d{#eNFI}t1QS0r&(_y2t#d?(&zHTyf!h9Oj2{)UFMe(OT_Uu;jJ7sq{L RWMGg-3oB^`W^mAf2mq^5hqC|x literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_0v23.vcf.gz.tbi b/tests/tabix_data/example_0v23.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..27cdb5eb921ae89aa5309316e25e0ad0c93103e2 GIT binary patch literal 155 zcmb2|=3rp}f&Xj_PR>jWbqw5vpHfoN5)u-alH4?SnN9`FV(zGwb|NQ+AJYZxGju?Oa*^<#@NjG{Ra5PCm^hz9z%@^79LD5q>FX`kD2CSZGI6s7B zP4YnKa!-Q@w2hl~I1BC)IhI7!hee@F4Qw+1X!rGM{k?2E< zVjtRx9*$A1uHK|*`ifQ8uXI?8nGM#YvW-U-eMtj*G+;}FCT)a11`J&y+99c0fub8j zZgFd6;8|#wI;6>YTE1pGnpI92U7Go0QJd;OS>)!Na_w=}tV_$I=DD6-29gVoT87i!R~{9!^#+Rfr`}v!4=wR42Mfr`EU^!8T~?^%L{^Z10JVErjA)g zoS?ZZ&|Jb!7agNpa3-LcE27q80k(4CJeBkVdV_6YIZ6Y94q1{(1*_-w&r;|B5e6Fw z|4KbT>{B|cG0W|;!0y8`mwE;USAKZ`z_5^mAaO;C#V=$dfI9Fz5EUK+GUasub83!I zyX$#c=)V9UhS%90!!u>W0K^NWRc#=Q+#s4C)pbyE_H$GFPh?%mFZ5f`qpuI`NhD%^ zk)Ein2+UxxiELZpyqGR4$qCF)?!txai{V0%xxP@QP<=msqb~^+x*X%SV!~_0$p5<> zvko^>q4}}8K?>2p)>q7h?udZqN)Wp7g+i?QqPz#;vRX(rHd35FL`sGi>V2sUIUVyM z!M}WKb;mbUL6@hNM$C^?*lh&lwS>7rW*5q9+~-GkK3{0gv<{|-%@H%_)QvTf;Qu36 z+Vjd(LK6+#BRU&hRz4FENR~BXt__a)5rIOaGlurO^7-YN0iJvxy&K!WWsxx?CvaOX zG^4b;EP(MogI)l)1)P0oCiFIsSv_4algiPlaHjk=v00@PcwV$^lzf0nX2Fc&^=|r5 x;Cf0V%0}fv{{lVu=?3Qt001A02m}BC000301^_}s0stET0{{R300000000jW*BQ7AKc%E3F)+F*q$DtGoY@#LlaXmhgN5bd69O(0h6T)( z^L%&`rphnS%DSPjWx0Th3|q`h#Vz6?GRNwVGcDY^@R7kjW9^o2ja`R->|U@%A1EH) zbn7*{X#2<51zYSxYC8m>3x3(flRNzzp^#hyVc409dgA literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_0v26.vcf.gz b/tests/tabix_data/example_0v26.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..277bd7bce7ff60ded736f4df4ccf77a1bef6f210 GIT binary patch literal 328 zcmb2|=3rp}f&Xj_PR>jW+Kj0a_vRfo;Au&J7Rl0XzbNJMhXvPGY~JD_u;1arO6Ne6 zmowV+mACU=;%TZlUAyP8u>kj`l#GOL;>J0r>-hD5JN_!Pp73QUkFn2YUu)^@+io(> zyJ!++=Bt=Eb>r3yFGtRT-f1T)TqQNU+$`n^Wu=@oaAbVE1ur9ao>4QUp6B~TJc20YKFmFXkTJok8okrsg!8b3g;N{tqCcHIb zrB0yi$A90d{#eNFI}t1QS0r&(_y2t#d?(&zHTyf!h9Oj2{)UFMe(OT_Uu;jJ7sq{L RWMGg-3oB^`W^mAf2mq^5hqC|x literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_0v26.vcf.gz.tbi b/tests/tabix_data/example_0v26.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..27cdb5eb921ae89aa5309316e25e0ad0c93103e2 GIT binary patch literal 155 zcmb2|=3rp}f&Xj_PR>jWbqw5vpHfoN5)u-alH4?SnN9`FV(zGw_rV4Ru;KOg_UrTWum7OoysUPTY^-QhvK}c34H-swZG>AaUxM7E*;3|>*l8Ab+C{(GA zMaCb^zD~_gEo~II$eakH#`2JIk=0qm>(HWDhwelNd&}0Yy-3mU70a$q+2LBuXs{xc ztsSb^FKJ+hI!uXBq&3&WfT2o6TO?&GkXK`fEiSDLJPLhzo#*Mt*X{oO)@-qeJy`yHf;=(cnIb1q7*61vAs@!DxI~o~7l9U8LFnmn0wW*-(gwnt!a=A9D&G;>)95@)2CKSI_WsDd5`BEzFWq{0edOsym2?)Eq> z^e+JL*7NMP)+3ce1H=u5Rc;`(*dQ7o)$5?d?8m0opNP6r-_T=0m%g58P9hNViF8F} zMPLMj4P?^_$Az_7NlajTViz`K&lpbRaR(%d)T-yF@93F?5^avYTQT7_qR0Pjj!}ml zsnGaX-YkizVd=}qLRUmUV$*`LUsOJ*K2AORruJ=AZI`jF3#!T~Iir5%2a!%e@0}1{gb)`A4 zNF_8-!#QGSqs^+1Ll$ZG1!^5$TAbIj?w@^~eB6yqnIAEnu^V7?KrqyIg2Q zX?3{(`uRLM0qhpA_Mwr`%REMPb-_p~OQ*t-^2@|Vl~&N>qAjDu!&D**MigJ~sV8#0 zo)UqgQ903TeG!ir%*WUJ%U|8CM#Coy001A02m}BC000301^_}s0stET0{{R300000 F002)Un&JQe literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_badcomments.gtf.gz b/tests/tabix_data/example_badcomments.gtf.gz new file mode 100644 index 0000000000000000000000000000000000000000..9d6b241aa52e76ef3fbe5110c356de06a1935ff3 GIT binary patch literal 3825 zcmV**}C( zEy>BR^Y!!Xa&`Co@O`~$a9uQDTu`D+gW|pG|9xM~Prg4ttrri=o4cp`hvk>e-LjwQ#$w{ndWwrv%ww@NMz;;@h15 zI{$k6_wDlb#{N_0Cl}Y(?>~PmKezd#g=yMkw)pSU5}+kQ+x1&?@@}zOE$(l=uNFV#7-1jG1;%#)X_*zPtFP{3&;!*N3-7PdTN4{vhZJy%WSpwmSmoiO`u8 zGr|Qx9~pW*TCJcf2GK)&vO323=s_0 zA>O2x&>)LVF{zYd0ja?OM|UyfXSo>oW`Gm>C}RKwg6$aPzy1EHVn&z-W>L(nH(`W` znfcV#o1A(Exg<2mj4F;;CbPfJKE3CcgVQRzHJoTPC$9XQgeDoB2<0MoN^fjV@p{_l zRCo;lbwE&4A9=Nj$^sYGqzFeqScl;?RejYLYbsEzA1J56iv<-O(e8_CwSM}(iAo7a z_CX-RN{FxuW{`R&q@IijIb&3?4BMp?W^%M4IY`pEwP7r2c*Z20R0k5y{bj%ccyA*J z#Jh;M*;3B+F7s-)rN`=@8(F;x*>-U<0Zu+n$_!qn5e80PPK7^iaDqI-pP&M$!-1OW z$ZJG(N~l~;5My-47}gnZVS)=Ts{k5;3-8!%f`YN@^O_|mg%LP|7(oH3E@vVTl8I`Zn##Sokzx`>J{ zgv4?tG**ymc8uKyC>Xn5uPF)6<#Zg*06@h#g8?{!Gl<%pAdwa`i5aXJ_{Xkwnk6U0 z0-R>p#x+5K)9eC8VdRCK!4RCl8Ke}tNKEz4C-k#*Q&nceCtyZ)$^=fn{6I3y>_gAch{D1)t_cd9!MLC%I`ZnyU7{w)18&Vu*F%Cj% z;$cF0%g-RFrat@zL^bvCHzcZw4#37OTZ52-sYDXoLkua66_nV; zc?Uq1Dk?Z&`yiyI8gaA_KM>VnP)$`;jW||Q4Tlwv7{@kY+bVUeH7d`1Z-vb$Q#=G) zQp)$wFR%FQ-W7rT?1LbZBK<~q1lrbV3iRDCXgJkQ@H!4WLxH<^3)Teb&>f|~x<6~% z-Hx*CrD&(YtD>Alxb50vOp$qVnxjvliPEo)T*Jc;rcd|ogPJYauE}$^}30-ng|Me zn2Eq?@Y)bGhTJh~!M&GWW*c}2K)eA+McIVk5au0deEo|ExvTZ`!56C=w}Y74C*94V-xdOkCHXzXn_KoWNT-!SWAg(_Of*~7|6zwwMBgvCaalC3`p}`5XVTFC(SYd0yB|2 z!yaau8#3+4#z&>mWNE;_R(v%LtV#plG`^)Vzzo%d+q$0{j6td~XfTCnU;v-RmGxO% z2R2Xw(nOh-Ou?oOXj7YH!2k@C4(zH!tqG7|2!=viOi6Kp5U4d9X?^1qBN`L?tkwnE zWlB*|sN!Wxux9&nscB5Nlbo%~BUxB?T|4DmZ8yF;K-xui96*W*wh9Q7g&|7@;xu^i zK)f(&NnR$BNok}oB1~vn@Fm;5{zy(%$Crb{f1;-tpFh z1#B)T^H9pH&sSR0%ZjJ)#-f0I5bQQ(u5jz}2rR%os>-(sm*uVPv$8EfeKhJtP*>pw zQ+}ABPHN26OktC81QtjXLOPVL2*D`Y!X7h@>1y4NKM-BdG&- zg8=OQu#334!b~U&9oFi{>@;{)n3E8@;{)l#>Yi?PwN1P-&M+%kzm5<_IW{ zO&QyyP7xg3GX)_*?~tIROpvD8l%s+$NSR;i1_873s zqj(TfSeO?~NET;I*uXo755k!a&p8lsY-k%*2P=w!c5m91stFg=z6cT8@Cptw&mj)Q z8T5P@J%cyw@P-)KZ3)?PYrwgav!F1CIlg_y#gaC}8)Mt&9cRc^MztHtZow%y=jfT! zUeihcIOl}vq*%`Gp^WuxrJ~(?2?S_&(JobOkL{9{vs8go;;1bK4RJQ#l5+Q%daFG{ zQ={%-bS~bmde3gW7^mBHi$ejjbAs+yA5@fF_0Er$@qLo#k zhBjE=@vSd6d5C?nB}1Xzy(+l7*RCe!ZiczKG^(TQ5>xMXnB0>4-LFWfx+hFVodGWq zZK=8sl-zFN%knIEfIl|;%KcT?HB;e37CqRV1|wtdUnl2u9*?`_h87|*6Xi>2DZ5Lm zl$RGJyb5Lsmyon^s};cRyeiH~jQw*InFK+p zT}s_p1RH7s=dn3cOzp%nB}xX4Gh|qa;9S09iVwWA38T?Lqa@NY>LL?Ex^)ZLmbB(F z;N$$Hodz$6ba$Og@f+ePd#!ISLr`nCS}VIigv9xFK_lJA{{GWyO(@GsAnoqfX(+qm zErbT%Bk``3Er^}VqJqjmWC5gyBMsJibZad*;$S_-(R6c)j7h`eXtAN5G7h5!Ho03VA81ONa4009360763o06GKh+FftjFcb#h>-1Md+2z#AKK@p( z5bIWHEtOi@U7{#NEm9j0$*S$&&khM6fj~kMG$f;z2rxE0J$++aN&e14*PG3!K^Vv3 zc$CcjC=TY6S>j#0s|TYv@sr=N>-`)&{2FY&6!{;zi{2dvL6Ew_a0v+OChy^A`0m2B z`{sZ8kw1D3Bi-&{IJ|wn|A7`aV8Fa(i&dw2yJ6N&V6MFDi{NdJo!j0^Z_sm0cMfJq zkEsusNa4)5s8GA*}Q%q$zM|4xCY~e7ReiD8l7FY0eoF^`!?7 zFE@83(xMr3-gP;&sN+l}s^pA_*qy%%XHEo&W1I^O&dRx#ae4YS6ttCks8X{;V1k-Q3Ek|zGE>-GEJp7fJJ zFpkX^G7t3{nXYXJZIhclHNc0-3FsRtkf)`+G~ZL$*1R?IwM9%O&xtHwFk1Q6bin(BJS8|=2>rXpR^3$b8C$`*ATkc#UVW)uY zP5~GD%u+C}^g$_v%deCJf%slqB7|z`O1VA~O80iv*@be;0V?k^8)qRZInyoYbQ>sl zR>0G%HEKH-8l07LE#tCfU}HgBsfQ|ckq9~nIJM3#JAZM5>BmPHC9a>i$y?}#(fHyY n%;kR26)*q*ABzYC000000RIL6LPG)o8vp|U0000000000i;_dq literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_badcomments.sam.gz b/tests/tabix_data/example_badcomments.sam.gz new file mode 100644 index 0000000000000000000000000000000000000000..9d7cb5f31df05bc9716d1ac6185329acf10eb82a GIT binary patch literal 398 zcmb2|=3rp}f&Xj_PR>jWg^YVA`e!#g2pm2Cc=?N!%P+j^`F~wxi*y$E#bp<#Tsl2T z%2Cl!QSjH--K*791YYRAI%kz%`J*`QhgIYGDUX?r54~aDG)4TXT;eK~+gs0@yfQs+ zbf}UiU)audhHizLidTw3?YlTd?+Pi!O1mbH%FTDC{MnwT9hY*&1KHpX1y<%ye>e0gZ){exQw~vzl7nay7aWP$W zob_Rr@|om+cYTB3zxuzgNbciN!E>oA1Z}6N&9rZr#vLm)k6n#1jJt;|T>xUPJ6QLA&% mlCp63)YQInU8-eepSS#D=-ct;yazJ_gFIS@OEUlkp#T8fc(8u} literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_badcomments.vcf.gz b/tests/tabix_data/example_badcomments.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..d323cdf1876af21f80c9be62b57b1c85cf9b96bf GIT binary patch literal 753 zcmVY>GCzI`=!{~r>jfz-J{ z9XyVRrS{}oUdFpuC+CHXd7@TEQ-9|C7ic@I0Exu?ie&(2Gs$B#tTec_2WTw9Px1^ zoe4mgKum04fJi;24MKOh1kpRe(eebb9#8*xVjgDy4OuMJ) z17ap&lo`6w!4M#u5LoAM0RieletDqA1FD*?_&uf=U7c1*Q1#9%s*^g0spd5qA!zli zI*ADhrOF}DBVc`X3)eod@gaoh(6B7KZk`Hu;fg*m!-!c76CK+CD_6`QLtPyM{D2vu z%&c88F{!dh zjwVTnZi$1j`68QMD7s7MM>_e10Z-2~oG(JMCV3!qxu!t`+Qv;goCSA@9FIiQi$$SJ z4Qw+1X!Uh#erp-Cz)jXf7&VuNl$-3%BGHEy#XhtXT^yrYUA;-s^cAbFZ|U$XW;R%p z$~G=l^hX-lr2$JKG-)IBGGOQu(Kbod3KZQKa*JCl1J6Rc)FDmI)ADY%tyyK4(WRMR z7PYAkltpgNE}uQlnssS;)I8U-%b=33TdU`|?^a+Pv$UG^0>TAs@NQwlHj7;A?avpe zlL0}o9hI!Y1TnCKjHZg81q>_PfJT-=V+YM5mn2J4eMhM6E>6)$Szz_SuVG~jIzYv0 zf#3@5G=|M3tGu}gjEsJvx62KJbO9c_MW&8fM(m)uJfOLR?Jhb-x8O`bGgm~d#{<~P zh4WO>3+M@!h22s&g*CKarn+doU84MZ3$Ap9zI1F=r&ti~*t%L7&)mbuh3Fu3x| z4FHCPYy^obQY>B}8v)dT=Ygp37?3Hi1DI2DgxX!t(?Wj(fEZq9cMQ*z4FeDllvcHY zFmi)vepH`>lCz(i+J7SJN`9c%f^L1i(V9de<{Rmb+KRvo2Ajy170!$4u#%j>{Nyei z$lftrC^FX<$`q>i$4~T5LWK^;IIWoQ7%}qy4#%v+iBxEQtZtA(G_ds*bD=vTpt%x+ zZhW8+tG+1jK{%`)q#6q;&L1Kr!vpocREF%1`H*noQ%fV}M=I*1Yoh<(UDld>`E#+rVLwF(f;1dt7KnX?J-5#{CSs0h|`F_o124+dO7< zcfm|5Tc^UA^4r8_m3H8H(Y8_Y0V4lnT^iwFb&00000{{{d;LjnMb3+Qt*D+dCJaqT438G zNYk0eAV`chz{Ck+cd+~Imy~2%qD6`nB~K!s0+rE(Vd|g%JQwni{CR%&^!T_~uIIPw z`D%Upvi|Ar`wO1EKmYRn^S?gLzFuF=u%vQEkVdn2vwxVs-xkZo&BOit#5DSV>>om? zmgMA@`TFH{xw?CKcwTQBTo(-(7nCT|p!nJK|DG4~ljoPG_2OZ9bN6)ru>7|9p7}ql zf2`&w|2e<-<9zeQDNG7H+q-Z|!$}N|5~pe=h!7{5hw; z%)j6Mb-TR1vHz9%$;I{c$FHBu_ig@YVVX9XE<o1ZauSc72!V7?B*%1<`#x`~B?v ztiY4U%xUl@m~DBHR9@xqRFclHCRxK1QN%~)^>vPlYx@txgW2W7caUmy{A1?k`ew91W>%-fkr<_tie-QMA-U(tP+Z_S)MCeS4 z8Q}t;j|{yYtya(#gXkeXS_Nq7Ap}uW&4|WXVJeL7G?Pk^(I_P**aheZGpPl1h6o1h z5N}dTXpqIGm{dx!fYjiCqq~^#vs?^(Gr);`lraDT!FG)DU;q83Vn&z-W>L(nH(`W` znR(aNo1A(Exg<2mj4F;;CbK`zzI^1DgVQRzHJoTPC$9XQgeDoB2<0MoN^fjV@p{_l zRCo;lbwE&4A9=Nj$^sYGqzFeqScl;?RejYLYbsEzA1J56s|6Ju(e8_CwSIcuM5Tly z`ydcuB}7;SGe|uXQcp&NoG~g`hV4=cGdbFj93<)7+Ax+hJYy10ssjn<{xVcCr@|jMI6)raPf!8W;XqAw zWLBZJddCiiO!U&u}jGzEimopfG6F7r7 zXCO^-zeNq1fq(2aK!G#xrJ90CG!ud-5LD1trX?B64F!I9AU>cg*rt7oV&aa^TmC_o9sL04W-yIxCN_Rt;}haGmEVY$;43_w38!LvCX zMX28Z1vybbP3Y4fC67IDyXSjsNq0O)I>F+ivc)6bP*L@C`|E8*^U3;HA7x=!%0IF7PfIs zP~Z&41vSx;S9b(Xcn zgcY&yZ4hbDRkxwSOdxEY66M7AQ=h~rE|c1j;xLPG5KoGlHeXR2of|1`KS) zSJS|%H1JL1TN(q*P))e4`?94F|p5TU7%g26cvRkUZw~1pQ_j_Pv#SH7U1Y}rq?ll-3&k+^DG7VkEIt?E6 zI^8Z77gy{9#^crgR{bXgc^GLP6Xa1+M7ABpzlB%NMC~*f0d+3kB(%QSToB|T1X)}* zuIy!9=E9+Z*8BIZ2{_|Q7?kJ3OAVY!vu9wW3FZjn~Wo{K%x-R zp>#zEM$sPctiovRK|fewv`#2LHEzBYet-YTLyqN<+jQ+G#}c+l7SpF!Y^PCsR*!JDF-MA&afv-p8ZyHr}9PmC}}KzVG+*d}#~;NYGq2nl+J1SMsH zG|i?grDU&*a<`Us!htc-l!bDS;;C8Zk~PK}DFm>`fL$KNgOI|)ykJ7IIAg*F-Z^{_ z&UARrfskWE+o(ENQ4F+u)2>uaxS;k$h|q>taEN&haVXB9=fmh3ykUno#K>+-$evpR z&YheEg*nXe?K3Wxv?1OY+dl6&L$)%i-B5N5PQf`x&z$y}PWsz9Crl^Ba&`}8tY<3~ z?cPfuK)Z`}scL&{m$aOv3Y-#0Z82zwv-y;iyU)~H?HQUHbq}L+@pjdFcH_l3g)iZ8 zlcPf0E}fcBx8SQ-JIO}wG#Cr{0HBi~drbjI^nenrtO7N(!TOGGeYwd)?29cK3hnMy z!QH)fH8FQH%+;k)9c7o8dbh*mmfY`tMMBj*VKV9rc!_9B)qSAkb_-vYXTbyfvEf(l zufndG3LmoQ!R|B|8GHXaIj8e@+$}e>5Q&*6UqVaST~ejIyeQ#KFiW_Eq>Wpx0Cpdr z?_3JN*Vxg!0~frE7r?denBU^-YwC^=UvaOo<)-Vh^BsZ++?wH}WRyTebAX7ZDOZiL zt`Bo?FOlxW1qb%AJFKbQ#cIJ}5MH{S)Phs{B5`QRL~A5M+%%PX|8Tvm%FvFfrTpoQ zl$j-B)D>wfUCvdiS8}F^1pSehv(w;BaZY0FpQFem2ukfz>c%42P!l+h&6#3qCzdHu zGH{$B!%76_@)c8j;GInvjSds*T85Kq}_ zeRCOtTD#R+*##mb&bJF1=|1-N?^bI|7QVR0bjo zAUzyuu-2nnYrzo*>oJa|n^R;=3MTD~WPu6+hNKE6CSo7;YI${jcGIr}Mzv9H>9CiU zRrm4C*;t$gZvu-KN!_u7UOI*m5BLT`1PLFbkIEt{7fS?-udVlFZhkuDjeix+!_OMRPf{U1!cCl3Gs0RSJ1 z2m}BC000301^_}s0strj?b=;$+AtIb;Op#HpxjQa>|^`bR<982R%tDjR@z;n2%;9L z3kb4m`}ea$!bc#GkOU3MsBKhm?eK8=#s0-Q!?z_x$jUEFU01_^TG{ zPP2A{w4J1={hLptw>kChx-Z>+*R$PuR1hHlL2d#UdPUoL1H%uaP{tX0;|5VE>-|MBJazCc>mgU-4xhL%;F zxgw>U36uNtcj=5wf;`1J*WjX@D;XE3Z%sj0smCfcO#~si&0e91aL%nd3#jj`sYbX! z=hAbsvd+{x6{kn4t&kC?-G+8r)lws~&IFW8j~3IT8E03|$Ld*e$y{!n!C6zA&*rC_ z-L;q-2pot#2tl25i_Q!wy46ba&X74j4}N%{6y+YHNQ=Xn+61QukQqqC-A&CnoJ7OX zbUcY(OKcE*?LJUSdIh%IeO1{OO8dPc+oW;u+VOk6FHh#l(P+G|Z^-^?*2sKgLui-W z?x_JiPR_tQNRB)y?Ung~!gl73nQts&Qh8*mc){r88FEjTeE0b-;_1x3@uYr{sEs)=akGLpX9Z?}1bZ_wz>&AU>|mgXb{D{AFMvrg z3(m>Ls>0>R8Hzb)?pAWGnwzto$Jyo5pfgwQ=Ph?sM7k+pvs1w3KC_YnwK-@_Xz`tL zAPF9{Wm4*f?v(2hsZDR!t=%ZM8ldz(vvroTlr!IPPPTzEXAPL#tx?%I*WjX@D;XCp z18WPqNjWg^YVA`e!#g2pm2Cc=?N!%P+j^`F~wxi*y$E#bp<#Tsl2T z%2Cl!QSjH--K*791YYRAI%kz%`J*`QhgIYGDUX?r54~aDG)4TXT;eK~+gs0@yfQs+ zbf}UiU)audhHizLidTw3?YlTd?+Pi!O1mbH%FTDC{MnwT9hY*&1KHpX1y<%ye>e0gZ){exQw~vzl7nay7aWP$W zob_Rr@|om+cYTB3zxuzgNbciN!E>oA1Z}6N&9rZr#vLm)k6n#1jJt;|T>xUPJ6QLA&% mlCp63)YQInU8-eepSS#D=-ct;yazJ_gFIS@OEUlkp#T8fc(8u} literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_comments.vcf.gz b/tests/tabix_data/example_comments.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..d323cdf1876af21f80c9be62b57b1c85cf9b96bf GIT binary patch literal 753 zcmVY>GCzI`=!{~r>jfz-J{ z9XyVRrS{}oUdFpuC+CHXd7@TEQ-9|C7ic@I0Exu?ie&(2Gs$B#tTec_2WTw9Px1^ zoe4mgKum04fJi;24MKOh1kpRe(eebb9#8*xVjgDy4OuMJ) z17ap&lo`6w!4M#u5LoAM0RieletDqA1FD*?_&uf=U7c1*Q1#9%s*^g0spd5qA!zli zI*ADhrOF}DBVc`X3)eod@gaoh(6B7KZk`Hu;fg*m!-!c76CK+CD_6`QLtPyM{D2vu z%&c88F{!dh zmbF&cVlB0()T*`0O1vO)B~@xEQbo~}BZQGdIg^nq1DPcA|Gv2Z_V&{m^}{&3fRz6JDWv^G84J7eBt>yxVxi>5QhLhWX) z3=iS^>aM|cHzC9nw_(O7^uzleR3%PorNl3vt5JB~-|}Qt#SGu!(W~PNWUS%KI?6Qe zAMC4|`Er5&%eu3>eWUn!uWuLA)Q19>EjuxVcE-z6{g=eq4*2rnuWSC}a;ZI?^8ax& zP31PSo7G!BUB^>spV`y0j!gLI3M=L1nnKob^(5ttno8EGf*Ip3b)-{=S6?cSu^+fO zqvqTUmhLWl9;s359=~p?{>tb}>9;2$`1CqW!c2P0dANvv3Ejy5$C)){FV~Da@)5q0^O-&T^0K~*5b}|Eqm5g?MccM|KG3cF6}^B9sOLv3@`o7 zpbU!$D8tzp^hLV<#w~kV&;wCf_ju~l)y6H{(;{*ENxiduMom6zyFh#Vp&pXWtl7NA zSkUeIN8z-#t;sW5JM7=+@7?XeWjWU&H~fc;#h+j-ezd;$v*`;tGveq&!=bXa@d=+t zQ4W@ws^+XQXT$Y35Yd{I?NEa4e?)(`n5vg;DvPP2c@@TL@H9TNW9vFzo#!9b<9}Xv z$y4iEHKRt?Ts82qzMjOU2kUE0`#kg5d|y)m3?<#SPK#O~wd8}2{PWGh zJ8yV;<+FEuC0^jcpBAEBD^yEXcjVt_4!(MW`0v$?9r(luI{HKQiVr4C{rmmmN2trc%v`Yh0p2*}ya}x* zY9({de;@3&AQ64A|7`S`mxsOi$e$j|^?k|PCF<};7k@e85)pWR;ur6@l_fne{i(yg zXI>q)YW7>$>KMr4p6_cb#*R7u_>8u*K9fIqaqawP8xMHAckbj5aia>p^F8zTVQ-$* z-73(9JfgqVKlQgdqQ6y;{#F8XtBDO2OZB&sp{0* zoI9fU^F6BTUl|@dMVB^lKBT>td)#HDG-t__>ro5co)E?~%>R)XJs}udT`{6Pv^ZwA zqT<4sTbYnXmUC#z-&Xv7_nG5g)GsQW^VuS|Z?a+%gV8O9M+x*9W$QC4eqj28hacX2 z=41WChd-iw_}H=fGC!+-_`CWmPoOK~f?xiy?QG<;x;*?6^T>NY66bthigyVbF6)R1D+f5%j^=?TTtssYwBiA zRjh;F#;Pgw_0+#>Fuf!6?^MMjcfZW5KZJ#q)u6}4iOv+D=ehCMB%ufTK2YVWe28Et{Z8({(&++Mg!i&ZZ>TmO{rNM-KXrs(6W{}&thiRO#dn{hH0Q8(p?lz4M{G<+FlqsRi31 zpV0cJ?|4({b}9F8i^b)5S>954TX}R%5c#ljjb`h%_Mbnwqr5#;R89{$`WZj{q1$a0 ztR6E~`8AEqa>+p~6QAV%px#Ra%;pi8=^9Jab6+H)fn*Mow>}%{x@!y`r|1{rC zKS+B@4!{3BkIWY3xb&*TGVSE3%?VQW%~;Mls-dh2i{S6~7G2Tc!5JmFe0F^-Co(xs z9VS%$hqHl7mNm&D`03svnOqQ+OJ-_@5$&G}#g(o&G<8;0NV)c#sLcgZc55tW6O~-v z6w2Y3c#Gu6u<|C1qsun>jqm+UT!Uw6t{42In$etpRPNWc0-74{c=NpWjXzMAb?pVe ztbuODxoWa%xEa4r54}ZYb!jwXo%dRaz5Tpd)Y>h9pA_dxS))H=KYYYR*L7eqT4ND45O~ATP)n!wfZb(OJH4bZV~JI?d+=>YKH5{dCIuQZe{+& zsc${-if&x+gAZdos66#lb@*Oo#|__cw=!>$k)<^W)Pj$AH)H<(B!7uM1#+ zDT~z)nw{QVN)FjXchW6p1~O)#8Bji8W~3Xx#J=Qjd_p`ksB7J#)smSHfS)XJ*Q&e3 z8n)C;?)G4=;A68otm$`}r`gij{ze)<-c_8Zj5}EsT%vt%gLa^j$M49(QVT8sJz@A+p4a`P-Ep&{;3f3jZ%OX=zPP&%f)v z{Ur7LTXx-;GxeFjDChA$m^bspn`RFQLjxFk0sKy(oOTXcw?CivEp_?gv%_z8uc;oV zweFq9l&$U!-m(bx9Bo^&EAx6>Rdmk}jO|CMTU#WRc`FY1R+g;boq2y|=*76;?KR0A z_pfaFWE$&3k9{X@#{BR6JHM&FPThFv8@JPA1K+2Jc`F;M_!H9LdNscw1om6%Us5;T z{KhR~Y+z{1qN2+5mAqT;&y2np7q)$wprc}CQ|mN&%eET9@+22sJ7WLp=goaS-;dh; zGR#}3jr;yBwxpde#XY^)jl=r#xqWkg=xM;i%Auma#o}#Mcqwk%VmCL|Utiewha+8Y ziGEnk{o%ahmWsu0Y*yBb`^r0rroF~(Nx`javu5gMkIk`%l^y!^`LgI0Nn(BP->3iZ zqX|ng^+zzRe!cBex>G;0HU{cP)>FP+W)753bSo>jB%K$+4e(=-ljn8{WLdih7{iu0_Q$#>$4R2g;UiL4_(;zg9y_YkVtoX;l2$ zFQmWxbOKgz{Vce}>W^ACzLufvn6mE+Ma;q6cM3IMw{CnZ!|lrnfpf_Ng;np>@!s7u z(?b^LA6IjT`nay?r}eBC_EPE_G2iFDb2YVq-Bi{}PuO$GS6$n>c|(TkKZg%fO?6G` z^{l`7?E6+R=ZD-EuW9~Y+s4n}8M^izN_DE+0}nhyWNVXp`6q@wN$o7?!?9=n67|!V z^wCAta~JGfxh7%3_RQ*(Gk=acKQjIIYq7%XP2vO5bYq@~srGV)xQ?NIhTK z?zI;hvMO{LujIWf`L6=+?d0B$t;?Ezeo@@~YDD%=4s;>OUdLmXO6#S!o7pn3u<5r(`)$RRIQF{}IL{XO(m#3UYYLk;u1sf# zOdveS?fF#~Z}1|cvogy(J>!H4RNIXv?OO4VGs{0v1b@9QiLV~rvT=L5vSU*DBE`7f zxrx7OCbw)%NM|pdzATKd?iywo%PiqFQc4KDld_%)tupHjS`a90HAULJ~B z3iNtP;g4SW%^&J_uwA#wdWmnCYEUGGUTf?==nZ-J*{`wDl5)>)fxw=2L5K+CF#QuxYT> zE`6wEh^yN8+k~7o?Qt)i3|{}?O}{NZOQ#esO8d9RDc4oI5lRgZsrwfB*$x0rUE`L%9hp2Glb)_L&*&X zgbmgtdJL|eenomlxUKx>?10wkitz7*YdDW(@8BlZhL=fS=TwzX+%(?eB=RwE2ksjj zPg40=d6)wJ%r28o*~Cp32Dd8Las;*V8|7hFr1{y|-w6|}Pw0*A7}cuWz#(eo^78U4 zQfYSf0ilq~ox|af%GmO9h1@keTPB5snN}ynzJohbuXEf;<+gHPh5WH>tV}v-6Lm%y z*s5H^Nvf4smHS?i=4L~}IO`L7p*wO~m6060R^Cu9x*{#g#tsMtTxvFlO)7Vkixl$l z*_ccU2{Wuqm>9Wj@$U-PjF|sxSc&w6=Zp&fSS;^h_S#1Ox7yUTPu}cTlJL*= z_>-PTZn-ll;p9!HP?kSbK9SAL0t{wr)WkjfebtwZXN1gZ)4{9~JLvM}R!?=u6yK}* zWkQHFVSRginrGcD_i%P$g@38&U{1nm%rC}sITb&OU8r<-6&;lOzp~knNeMqIZ-gvw z`#O6zhnWQ!#MY?p$lX!*vb(p!gIR4lh*e?_UEbX4iPj$dW&NIik2w{r+#vUlXpdjX zUYnD!fQlb4sxD0^yX9Uas{Yh7UFq(%IWN^Sy}~~Q%NxmF%fzHpU}uF_R@O}ZjSpUV>+EMGQ@G=)_=njqDBT|uEpGIm zxH+#l;qUG7Cp>rGa$m%Lp~C-X(c*InpJREScs|acgzsEQL|N9y5SUni!EBA086O#z z3HH(0gIQPiU@W};YZ5(t_m@Ao-*?~r_qpB1*z=zjR2uNv-dEQRt7xi`{BUwI{ae+x z+;aNI^-&+;e;o7loIm~UNF=f4Eky@O;Cu~9t2t__AWxG(^YEQ`L&43Ok>M`V%hQX) z!nepJ%9B`WSX!VocX}$e>K*CgkkX0L!nESFwDW1H;b{lLPq~K2$X9r;3YKbQTJ>A& z15%RY_{|#421=?9OZ8bbOPVwN^vJYe=?C1@>{Ur=3G%DT69M6F(reR8zDmnWJMEEn zEc`@xc%uAY(p7V$3o}bcNhM!J)Fh>?_paYiyWyJrvit|>e(5~nEa8EOn20&DQL@+! z*9_N4Z_5&dz+FOq2)XQW&7*c~{n+)7L_U(SHDj3UHQB!-_D8%b{D<&c3%<^TJ7m^x zsM{cs7s`)H4@rZB{=(#lgot3-R9Q+!XhvvcriBUKfjbHl6O_1%&@X7FrqgZCQN8kqAHGKZOTFj)oL^NIdGks{d-ef26-9 zU%w4k9|^f~?Ao!~`StVHPl=q8u`6SYY_9CHh(i%?2;UZdXTjGi;p)_kX|nfa-$WdX z2oTN}ejkz?a`l+xSlw^+zpY;xxzdua=Lx@;{vf>^el5Iqdj0hE<0Hps?8q1?n=Sh^ z;y}bK;XL7f3%(A4tB+-P$g179CVZK7@K$_$!XLukZjL|aKR4{{jedFlBRrpp_N#Dr z_k1Snpk;}0w~z6aYc;Fr=`2DRQswU9xjgIO4fh=hr?U<=#ebFXQdnVg{LlXHhZS!0 z%lCi6b9uDi5Kc5pb_?>X4(EkM<}fACwykV659{q1lt!w~!XvgMe4e%VR{R$UkA}U_9Dmk-cGwFW^M3Jv$n){&yzA~yc|M-CxY~UP zCwdr0q$gKR@i`#=HyuV?E!C&Z~5v;`v_I;v4SU6aJUAxG8>D!m~p+(e!I0QJ!I` z9OT86JlnXkiQFT^v~-@(&x>JgXXAQcV)wnh3Oc0f8ZvQrN?sc+T*WI7^qMXXM!QJm z@sVg3i8hm-(!=s4)M>Pfgw13?+M)219^u==SB9(#kuLQvoi4qyp*STiXG7{CX_0@i zI!r9>-0_LR&fO%BdRVvf)9oGq0sBYGws?JP5I0CXYHhglLwm==uy?fG&JXP!{dF&k zws?JP5D&rr(XuUG9~;EqVE<_07O#&D;sMw{TDHaOV}qCm`^S*T5Zw-NzU-@r(|ThnIMU@zUf zw+iW?3Z6>p4B%XM|Fh@ASx;BHf1L11*3-A*|C{iCVWXSlfAoJXZ1hIIU;H2Nd^p-~ z=q9Qr#$hR|U@Du)dHPq+Eu(b?GHWETPkX_jL9v#o% zV%V%Da8?9bRz>WLU}9_9tQzd4d-ql$Jl14hXFS%$GrBoGCShiDUXK61tm+E)z_8|9 z@sm8GH|Fh3n3+|b=RYB=x!Rop$+G_8g|e%i&JtuWxEMBTi4IM;Y4yyMHndsc?WI%q zUm+cuUz$1txb9)`&GA3^za198(eHx)XivXrze@LKJpHnszTv(t;b7L&P4QnQJUw(1 zy#QNaKVtxwA$hiKW#@U0+icwQGOzt?TNjM%!riMtOt0^9`e}3QgY8fhX5DE7EScvT zPd}~2Ynb(2C75DQLm1^XfFd#g!)CM6Rg;3k&e+p*Mj?gngj(!|9qQt0cYb10 zFo68-{GK5YsDWf$?6yT*RIQRt1R&@TMtKdSh(jO4X1mhiPj@+pWfW5AcBlnFoDlMM zml1i}!}rX9Kn*10YTh1|5qUd=QCL-0=o?q)&c{2ar%~LmNSuqEOw-Qg%q6{E{O;K(Uw|(kH*A?mANSwWrZ4Oa(11S?ocy+GFH0_DkaR#I<}HOaABD_BXrK-Ojh<;ikZ zQg4toNqDVAn6y3-ZLvUmvWi^S`_HFDemQ^kx67j`9T3MfJV!E<-fRjDPt?Q%~LM3=MhP5B>2VfYIj|A#=d)WC|IzH@4nDi+}(+ z5MvO|0(}AoaB>H$8W>AbHnT#+^j|SpJsDJg7|IaqfkIREPhgo`FtSXTL3Hb(7z=F0 z)$7pwQ4K)}VgvA9?SmFLn6;J8SZ1A99xS#D98e`Q31U5QY5W1u4zxEt2b38+x1Ne& zGpZgQ_m1g6$1YfbgIZfmq)9@B;5S)3)-(05bVUYDFaAF5Y@Y%`2ulHw3ZGSiv>20u ztqB=4asaZgU9k&CKs2@&^nvBbnfai{+8g@7a>3POpvT$^`oMDJ%yiIW?G1fkx!`It z=&@R>r*j8(VZ*iXI@>7(>p%?2a6)XohHpx(`&N*%@1EfZ} zgDXaN(@5C{>s0vOfHh~BhDu)rGhh5g%qkZbRj5GPnyFecwy6h3%jtAh0WMgImL>+7 zXGXD_dq7~k17PznjbQU0zGntqdmtHCYrk%XfP9oU$UF~WM*2XC=tuw}9;=ey8Sr5` z(Rr?u=~WVdDEErzAIXeAX^rNq>4xcK>G1p*TV(T4NN zIYRM8A_&=ZA-68D=|XN@`O4+o5?^G~h1|M!hA&TCn1YVlg+tm)gkuP z+WANx!oYH7Iwtxt7?qzJkN#g^q8FKIt!X9LyP8~d3)Gdw(t`k@W%`c85gTxEH(o|_ zVl^le8pzcl47a~p^}~2%GiLBYu?I6Ji%rxJ7RRW^&R|bAC-@!w^uRE(hI}jroV-{e zU{iZ|d?KEl78Cw2Zt~aJd=&%{tF7@c!!0=-KJxJV4Zuqxm=w)Wr*-jyC2I!SzV3Q!h9mw+j<5 z9X=kdEuS&yqCF&cbTP3Hb&+#oW~iLKuTW^~(FQMzX8_jKnDG1D$gymV}xPa)D8 zY~)xnmt$iyJ2isubn;??1Kj|rW=kl^V!Az@In8WOPF`B==z^LH z^8qH{u+orfthRl@&W5N&C&GP*+s>H<^5@aDU5-CTc$$xEaQA#B>tMC}kOIYzf!*zw z#@+4PjtEE5DF_*kKMyio?9?F}u=|kGDF~U)KUZckTV!xOoPQP?&p(GEV0rNKgbO@P z=buc+g5~=^0cxj?N>xCpu{?rvsPn9c@c{SzPJlb>A=9pu=~ys_WGHk;jfwq4ozPpR z!%a{?c#08vYtk4z=|DP}9h#ThjL=()kw?1{obF#ksS5ase66-f=e1Yx)x`p;?&q82 zQTf90r4!Qjhab-_eMp)tUqYSEUX_#<7ruf5DWANw(*bFR!cT;UZx3H7T{TC#)Vp+) zRI;HsC2c*m>ET4YA&OgTJCPSBe8_6}kk;k(&z@Y<6WuBu*;WyED3D%;aS?NqlXjb~lNWINgy%Ulj9IHRL8OrPHt0 z$kbU)aVdy}ln6cL8iJKU_du{R=pFzoL)~K`7pO;Fys{+9lcC`WacFMG=s&Lb~;M{ zOG_)9vY77>#S;gZ{18Ta`bGOOU4qH}C6@Zq9}>GYA$2qZ*YceITt@pN9fDEmZrt#F zndN}t{0_|xrBR4^=$$qV#S^e0ohLQ#pXyG#5~c@__rhW0Y2#rd9BVjUIKP_A*BaIC zUP323j#mZDK9K89;ODW{qQ#KG-e3z5i5D}NKvuDd&0K)gABm`P0Q zEYt;qBzu_L@dnCZU)+rV{ep=DPPm13YQ;+J$7Y7luggQAx_AK9Il7UM&OwJ@6(Utb zok`!Qu(j3hPIlQ0`|-~D#oy4T9h$LStZze+1JBg3wKv=u?<<64piKvr3v6Y|!(0js zncL|OcHTcFtGW`1Jq|$SaIlh!#k)kE!6&Ap4Ze4x4Z661Inf55Os@j<#E#C`(}Xa) z@x?-_v^$Na3t;}wT@g3)$T5y(arJp>30VDlMMtv6%A;b zQ=-mFiU92(9S)>dn2-+7Fah*xbCfzD1K=4DkOA-v{z5^*@s4bs@KxbIgx}f#)FAPw z{R&LF{3HEs0BV>E`{F}j()G6RyO1LxSB_b3@zwQe$+6nsz@%$sZ{Xu#;+;WSrE?3Lp4)8KV{;5CNCzCEzuny%DYD1Jy8W?oh2HkTk z!vg?3=w%s*=ZgG@^nmo89$`SACaASF-_p(FOrd-4;uxC z91`r3M+ixyv9#ZHcSqCqV0QO?Eo}5{etS;%kf&eP({=<=al(hf;_ZkD?}QK87skj5 zAKK`b=g)LfzX{Uhgb&#lz{Uw5VmP1Q2_K5LFI+Kz6stP)bV(rcQ~mYxoz=%uPk)^>xq&3U(1S%diCEbSqI{7NeBgBM7M}(l5U~| zH`iczgEpLAceQPeCW7z9!drm86=#wQpAKG9N5W5LgGP84+TU`j_%^w4e-r&_E>NK6 z%09DEa4Z=@Ym#GiUBg=t91G@TZ)&MO7R(9DZmYkTEDXzzZu>3SOHjV4?WQC|P@c7^ zL6Ue|qBxZ3O0tWP z_{i}YJ2FPfX3IY9E1EVRzD|zt7X}FrNsmeg#xv7KQkvlfr0R@Lq?!=ws9+}QrGXJ9 zNXtW!Qr~b->0$Yz5YTY%g?i~t|I1%^AR@+w)?QnIo3}M%nCvxB+8UUp7rOeN5Y;^z zQs^P^s2g}(HWMPdnGgot0AxS;QRyLRkkDV49FbtDaoDFDzC3;4a%}vDKa@662|p8P zSh&d!x^C_Kd|qMfYu@9Hl9>*)hbNCX}i!4Muk77-wv?=|Ff zqD)K5L10xhQ**9&4y}+Xu*+J`;CX%)fO)<`$BQBz-2Gq^{N-3!?+#5vK59^58~_xZ z2zRDeK^_rT*f~C>OoxTP2IKP!>nj-a&FKu!Bb%`LMJ=@NwbGLso?#Q|Rf^E65Z&XG1EO zLVL(WVdrj=D%pe#SMYK6uHRq-^`5bCm$CI@ZR865Hf%tTMEF@PgcINOYB_8|2eM`C zVbd8Xn`%=CiL!QnJ$lVwKP7TX#;%Mp0}Qde4*?q89#HswNOH*49zrY@d>wx6Se*qC zle-sC86Vb6f$0});aAbqSvW^%KQyMdK(ZAWNc_Ykq!Hq@gzC^#X-u=3{c!M{4Xg9| z0((0{n~M41`sJoa(rGq4!f>sn*I^U`m`WFvyA|JyHJE*)%f$S@Zx+NgL{YU)=`1?{ z5~{VI(Xa^B8ADU@uaJ%vgY}#8{^5miafVseF_pOJDkU^1E zrjjeWgmLVL_Ud(Qq$g034O8h9&vg579JGpmuGUJmuuvkDR|1@z=H~eA33f_&Cj?L8 z4OKd6JrN#ZKisk`n0l-8kO(Fl1cRLXNu6j=l}hHDk>_tmELnSHLPjIUX3n<;h%5>>dW<%O;xZ7YjiCJ^Ij8CSE zWs2!{_7?0q29Voc#0TvIThg1fA}U=6<#s=T%OY3BU``xR|e{>_@(yuU0ZpbUBM zFWcE0(QWbk2S5G5<8V(5t*wZm6~D-D_3QI?F9^u>da-EM))z?6{|-Ade$65B*XvMi=S}mZpNoq1ZHl<~qW|ekdlS^>;gVM{>PmBzIOnNO1 zETSHf7N(u>2p=!~ZNu^K@Zr)c8&0@}kCRH2A7qwJ02bFc@QFIFTtR_to9`+~_~m2p z0y!XCy{^E$u7IK7aM-m+|i`vLgPU1 zwBcQCnM3EjtZnxs!BTP2m9}M+Ozp$ZJe2jc&U8x$T|hD_pCo{_5yL*pd)+JA@0`CV zQ9KFG3q~`w7=8n9go3zjctfo!(=~Dn1KZIC6~M&qYhJNCHvdFt$EL8P#7&|@daT-g znCCOmerJ)p7&>+M1ERMw?IU*>t|P*l;g<-`?U`GQfj7ct?HNtjoFZKQ!+0jPtF?BArl z{V{STW7tQ#VWFJ&qj90k*kU|B@J4VMr#8;FaK`eWCmg2yh|I}!R&(gs#rY8s`X6Ot zP1FPzb(wF0xVpWf$=rNG=%M?R0A$YK~aJ! zU$E)I zZko8kcd!DP4?6#`>pE!mYeumV!wD}C1avF`JNaibJ-RX}ISo9P9zqUR!=3-=>!2X_ zh-pHf8J)K!!TFDU*TH5lx~XIKj;2XvHEMdLz}J%{pGlRcyAV66TfXUm#CEDxbjFiN zq?$$P93qBN^3J#s2~-m=olUrq4Vnt=Mt(Z0oUIU$aa4n*syvz>dj1sQO0CA(Ax(|k znsRIlmNTH&PPl$2b`|4~{P`5ImrDjH0|xZ+fa^V!9;7Dqi2_lSLMAL0mJR4t0@s%a zWn|HMRCQ7KQhdXJUJK#+h4>nrP3bEz2Ft|;@=Ac~6R;wTzvCBO1%@g^$$`9l8Z#B# zV)6_jaF14IuOmb;SR6G$>7)N}Azo$82MKVGFlDxaTKU#Kj3~<_mf#Jd1Wcg&kXu4# zSo6UmxJMk8L}^RET!wp-3aXe)Cl=u~x(|JonB^Z#V{4XN$2QY4{<5TTts|+R%Yt*f zF|EnR*~2uG8-rgJj~L)bZEGf$1HXNJ3-=+i$(35ez6-TJ@azswZ?MmN6_D?j<&wB2N*VnsewyvB znJf?X6VIiB3I&C{U9HK?`)GILO7UEk1PZi}&ER4Tyb;Y+f#1q?36 zz#BoOo^c-AoXaaqV1Aw?3@D^x*Js2hng`FrO_ z7S%)nkxUP(iTXoFPb{n_o)0RX5x>~)xa+(p-VMl14-idw?%Nam2Q=){pB;Sr#*($W zM<08#QVqsf1+<3WR6xH%S1;AHaIcBuSR|iTa$8xVQyd~uvk`C1r51|IU8pu*35!V3 zv}iR#I*AqOsVL>2BGzb|_G+56$6W{)2=^4Ti7lEo?a4sGlWO%XNg!KcgIr6Mkyl{X ze1KSo&p|t9Q32)#TWVjGFNvW9+6Ib6KZS>;|3Mk*GNIlOGPvVdAbXB{Rwa=EGrq)#iv5^A|+ z?hXXvrtSyl#98bK!aroyx=ZgWnQ)872{h+k|R~0QV*ecl&C`VD!v;3mUD(< z$=6|UhcGg`HCw^0V%#3UMvf_tZp) zb?p?@iTv>O_(4tv$C9tVf~)hf?V=l^H}JLicbs(26$nn%hA2W>JxCALSJYTbzRrZJ zWx_hCLfRTmhO5%3>6jEt6v;&a5TW{>lgYVi!Pl{HHN>$*RiarC+uBc@AudOiMb&yM zyjxvKS5+)E%95`$;A&Y^U8W+l6@po+6ly92xDrGSB7Zy*KSX2@h5E0zqxIsglD{1zJX`k2VHx9sEQpUP^sf8Lfapw_mga{Z=-i=@9*L{){Ha zcK98A0!@`w=vP$@v!tbo+K5mtx=vg|D10!>uQxv@uau30oJwG{>)u$OW%D0tlNz$! z~+(0L~dMwW=k%os>ZjFw~|k= zNAjjAlg|o%=1pst6bl{_KS4=`aH4Zq6XaR56wlGUVOHjCQtNolOxgBKbzIuf`csu);W<^tSD%*pXs!TpF_>Gs^ zE-4j^9lD9eD^Q;6y{HMgH_XbsO=?}`JG?fmEY(vrq}$0RMP+tZHLD8PUNY0RuOhgB z*LEv;nRrvX`hLC4Etpi;L)syeJeCLZKmu38Bys#Dq|2 zXeSn()R<3wh?kF}l%kS2@**$GP1&G1&PLHC6lAKKB35yfnJf9V`ZwG_>!UZO_|IyH z0a+fd=_T01m3h_LCVFFv|Ez}?kmcc;UV=R#5DT&*T+>UiM-H(d%fmIj1be(87Gy=Z zrk7w(1H^*5g=_kW=JfeBRTfp(U$C;@Xl9oLY<2ylclgA44WWeQ|w*$a>$88>ITO-9xDv2e@mBM71jiv2|^iTif?M$H*JCAep;{&V=bLM)eRv)cuHn zd+mU)djMhft|Mrj8W4ORBcR zVG7xWu<{vC#$|pG>Yt#G7&nr3(Y}LFMa=H-x(Xr44^2@auOE<@%0(w}y`efh-0x6Zw}bl+Br{rh#=b=sCBFs7kf_$@5D zP1DNfZ;oq^BVsbiv%c9b$~r_yfD>&*NPrVFw@w34RDLsUhIW`Mwd)6p@a4io@&pbMv>%PC~fq>KI&cms9AN^E@(hqXlj z+`j``-{)y;@5p>0j6`15tTvp*Xwf3n%Ek!9+v7+ZusVz|fjZ!XIKm-5w@g^KQmlfb zFp9xw%Km;z8~}i~Qe4XCwPF8jgW+_Fh7)~0rA^c*%7+7gtN1XPC(1&ks}meVy22X) zs{?910OfH3r5>PLi5rv1IL$`7I1X{J0L0^i-3X>(JSt7ps9;_jKzRVcV;%P9DiE!# zBQo`Xj1iW3)mceo>H!%e1(uX`M5Z2)G2|J}RTEUnYN}edI}`!g&0;cHw>jl@IvQYO z3i~4R^*^WFfv%|nI-qU%TxiabMb-8`YZ&-kX3ja4!AT*tJR@%W!Mkw6j}8cmjVA@R z1r>a@o{f+R5Expmd&2~Xf?4OjW+#%6k+aF1Pzumd%tC6IT|!3UP^>InJ;|T1$#yfw zIvIL2Xgp?-5W!l6+&d^3(kGe5><-2eEH0jv;if2c16GFvo{-wxX(3)SLFQthLvrpW zM|v<$RtkXydD2LS?C(6yE)SUSq<3U4QF0fcgfsob*CE@lyG8*)eb_lTt=0+{A}1|Z zVQ{7y2d8b-5Qazz`;%e7`7w%^Ol1rxZw~H}@4Y`n8)6a;gU~@FB(_r#W7NSJ2pME( zLGpJ3Arg2ZdP1bl2romcjFwP)YF;v~c5O`pVs4!bd6ti*ycv}!rQQ@ky1Vdgx;*Qa?QVnwXA2ArLq9o$YlA60oH;KbA&dmE2$>?nh88Gis87liL!A> zPE5bDhBrf4SIitNmKCaLZP=*Gn$<dI3O@tE-LX3)ATyhSSt6Zm1ljc-f- z)Pv5q74RUVQg|$=g|XN;?X93XEX6Yy{bcF5&NkMZ4?bG!nTojQ~%@l zFuiOws_@uGas-`q9yjg>hqQo+mB5jHLqH~A8~G(Mw-Yv!$n)B0x>!iYA)I+GGWS4^BgF!; z)ra0_k^W<)wL)BNI|bq>CHQizWR8%RZRbG=+3-)YG6lN=hMvq6HnVMgFndB&`HpKa z4Z)$VlhYr%Gz(U{hm5P;p)L8-Us0@td#ZR7GR8&8w*%6L;ehACKoB!T4$9be5;EP7 ztTb#JJ?@f)&|tu0k@t}#l8s8B2L-?z$3uxq0MTO@oA=HkYOtEuE;TgE=K@r4umKiC#_Tsc)-2pK2lu(IsVR5AM5n-syg!N_L8MC+tW~HdgYlA9dg*7 zu0Xc7Nc{lbFwgeSR1|Cd3dtGs3~^m24rj=lJoeq%O14<#JC=gLZX>-HixXq?UeN0? zDUQXU0~R;%ONT?fNmMg3VTY3yHWKQ=xafcd+_pF-F|t5}!#Rb6E`|+JB?53*x3R@J z2+!Egg8h3iaJSwd{dSm9I;U^|2I;rKjC=tsRn*q@|FYpy!HtqCW zY;3J%5vwj20xhPMp!IfM`e&l3jm>UmE2lAws>7xaRcZHKF>C+_#Y64hmCVVC?exWK z!vvjCo4d=L98{|yG?-1QiT2K!>)&BXrG3(9!NpL2CTAOhJ5@hsT5T8sKiLNV^}C^? zH<-qJYaj&c;J$g9SKzmKB^x-BPTxGnR{@VcCBaRumJ=E5vxR^aJbG;du{WCvb6gp@ zHqFfSo{G|Opw-26#Fv#Ysksa?hclvqdILle>vo!e2qEo3C4v!R#)3SKHh{iuiBaE{ z(M7Sg4GNYU$EM>Ur26f=_4Ehz{QH-yg>5}?BmVk)kkmUi)Nl1e3q#%?IVHI{b;693 zsr*@mb)&w``R29C;lI54Xd=n`QB4)lDuUj|r`LpC606CUmua$n9gF4>O$AZP3hcNT zs1BXl<=7_rPL=bn=yNKQrup^z%2Mg2c$K;ZCYN4_U}nUqLRBf0f`ij^c*j13j9-e+ z!uU&BQJ|)NOMBdf*rI9k1#NZY7y;Vqe2C%Z`eq~fb+DKK`E_J50kC*4stLj3L2vyq z(NW`r#X+=n0&w_z6x>>F8F{&z2Dp*rXLf?|aF_9l@iwwV5J04L$V-sdfdsiDNX$op zXM^6)1GyeD#_SMdMMVaJ(lhH6v0t=<;n;^!U^H3EYkQHJ0C4tH%~7OYX>;?uA+3|B z64lhf&uJhm(Vt*A9?MD))4hP&3|5!Gll)~nL9eo)k^2L|bO_Hm2+y8iYkt+4+BhtP zXHt}WCs0hB5FW-?0YG@FfnfrZO?_s&q*O3g%veLCQay49)&Ss=!tA10+XlqC?-Y5V z6qrP;uq(elYwIJG?ZHb`CZ8Al#yCKaTmVu!iJM_ns}!FinuG+=SOffMH$d@NzC&%@ z#nxQnA@2;d$wPm@{MGZ85Wqg@NoMRBbHF<)2duY1YDaew_Y7wMN%l3}VBQC=W!|txPize! z1FRGl3W2LV0M7FjH5N?KbQydDUyFZdrLvG*^agIA{~IzVZ4C$he;@JyeSGb$khZ## zt~&JqL*{1TYd{vK57nGLzHSiB!XxoRNL0s=IWxl{Jp@z6iB)BUhrqx&P=7B(?sts_(59PMhndq zuc@cX4{+CliSlkxuFGzh3@Y@kUzkv&JlIA8`kw+5tH>B*?H`5KKZ412St}Jx<=yqW zQN%yV>J+Td30AY`rY6(hH7%O&m1e;pFw!4^W%EAcvU!uk@YZ`RDM{?-t}XHfiLy<| zy1{8vP(N^GjG@=7sIr5mnK?i`nbBA-jXEiYPc+KBYFCQqGQ2ES>W)bYCLIbqyl*#v4^NEfk_rZ}}Qb~b~3+L*VfCR??4q=yZ zezg|Y)=fRBU!d0z!=AKZaYa7qE0X}wK4u8CWgog!Osm;@F)&0)nHiJ7dOE3u{0Gi- zL(~}9$%cznus_$qh9vD43I;JBpn~Bo>jM>~lK{@nbm*6(0lik-DNsce95O|NqizA# zW+a2%w-6AaSisXqgPC0vE73kUd7mK~?0~jo)2yttp^7W3Z}{G{Q0YeNRLQ>2pD4&&M8{!+EHpom}zy$&$r_+--{p*6}9SG0*Kv{g2o0 z>sKtj^i)|#V5_%~?x+!KDZbW=?kFJRXmtzsSC+^tiipu{Vl@^~z(Qav3n-G%(gOHc z4hl;D;cs5%rgMwv!kb`~kE5zI3vs}&$gxx6axZT0zyz*LSZ6-UBhnn4$Qnr02RNY$ zzzODmovH9{4J8p(qX%q4R9&XRB4k4WmM}n2%56SMVi7J3!V{?^jUG7!;ytqN{vDpm zTqfDB?(4H=0616)7{SvB8C;+V8^?2@l91SJ@@5Kl z)oDT^V7{G+%D1S#+~@YXhr4-5Upt%G;a~}&u~<{slR0#7q$0P(9)&~ zj<3`~+!R=r`nc&3!1mu0LP6(4F?vDY8F&JNf&X*^G+${LeaCD?mc*Ass70c~*+OSJk z4O1$mklOLYz!uKPQuOb>I*oDJb@2>t0-2;^)qQ){=FaKRv+eLP1f;Hn_P4 zkw2h-&}*QgPMvqC3{DEEH9--E9-#$bm(Gt{xud74>7Vs|g&IEcz%3Lf)bldXMwzP~Qpk-Ju zJ=zl~1ygYA27+O~!}6Ep;KaHUCUhQ^s55!4Kq|4rsaD@E>>Ca;2f=~h0p=hsR2wn} z$=7ZYHwsALd1z1a%de8^s;-)^i1B~)R`Ou6_P4_9x5PO6IV7E3gvTf@hEm@P2D6$S z(m`pk`fMMS*@i_Fns9jI8E#qOs7vQsSfJE!eGaduDBHh zbx>)=*G!|+^X_XBn~7nyI2jV=3R0e0U#q{iUU)%EHy(7FmEvjJOVGh9(RV2Z4e@wwv& z#3%&Rlw9D^Im0o4C3|TNTU`&@kb1Yu-WaBD!2}09V7*`gBp-$T8t%B>V0gjf#tF_^ zleONedMHza9V~A+`MxX>9HW8LWH*jr7D{{#eKgiq&15sp+6dy$hCyoycJE#w%*-!S zf7naAy_3!n%*dUb$lIk%W-xf`1@PINYvfKkB!H_;6Lr*pkabYw6??K;!IHLjB4qEe z;mCkdJx+{}6C*U>PSgizC+O~a@;EUT+Gx*Sm(;>a9cHnIrN zX3_;oSF_Ko1QDIwj@&446v*)fM}ZuZ(*T>;iRi+fKoJ3IWgQ0GjY&Y^Si%Mh#|`WRAFL^A zG>hq^6YGM$W?4-*Q?14P9d2Ak@=q3 z3)ThyZ-^3Xbl8&40r7wIvd#dYmy-iIkcZ_!Lg`|(U>1etyuh>)SaGL`6%*Gv7&{?j zoKfPAdBD)_$V9}GHVMc&rtwzIeX{MD$~OQC!1TtnQb>x~K<94#85wUG=d-EEwu-@0 zO4A|c3V>O?UY%`Ji5Mo#)TY_@19wf42+XeESFex< zE~AM?u3AnJjZvibxC&ouQ@O%DVG5W+|ctC7VNGZ!vMLOM`N`oY80K@&pmH^rn07ZJiI%Xq_tQ04! zr}#$=TSF%thw-9ln0Q=6n9)*TEAiygMbi2YOd`89LYR+b~RN%hnUNZTUGEU zU|hj$OR!e?=E7VyX| z1tE3jYU$pwQSWD70%*yk(UL?AkA?$LIwrmV#QC5QAOIzGRs8EOP5;>cYsVwiK9REjh31cvj`;P;eJeDRXmy>orKW(dA!#*7+W|%p z|LbVsw$^G38o8gN+IIsw!$LmL83beuA~CRm#L&hoVG&3!Uz17KG+f4X)Q36hroDH_ zE|uTuP0$r-bDPQ!v}$L|8a0&Ss0jlAffZpcn1BlFUX23+_Gg0hPo^TXH58reaByugaI~1(sicxmlDzE2jb`rI5&K0 z4zY)FJxR!@6N(%Sq0_JvGF|zi4&VY(BV0f#c!J>$M^^aC5V{Q?3xpS@@g&ORpY4wR zYyKes^Upy<;>6C0lfg$Ax~R7wOq@R(Cr(E@!q7*)-#TDe)H;tb#7wUOOdK3(TGTR` zR74Y{ReC0wqWr3tY#b78)+5^;Tf$k#mLk?=DRM%o{Q#N04wYoz{3%yT;+SI9L`{lm z4NO)B7x5ySlI_57ClQ>!LX8RrPKdRHoDoP?q-ZYNOZ(bE7afEmko4PRg_hKUFKm4# z!`Y7$vJZ1B2s=qm z8J+qV2I{vh_FZ>3j6bQ~w=C7o34jl_TL3)47ORTS!9-i6#Y@QcOak1wWF|??1TqgP z2+1+f(M;5A#2a-e6$Dnv(QZO;20*DGunM455Ll&didY5aU@P5Pcd<3z2tzYK%#YKH ztJRfs1*@)6mRNNmJ)W-qXamFcAdfZypo45{$Q30cZKJ-bLkRf-O2}r|o>~eN<5YRq zaMSX0JTu`He}N#-2;;u7%NqxD#Q_PtD*&KF=PAQ@W2{6PIiz~aPy`o=3Q{v%NHGcf zsej;1N7Z}}*z@H^*5z`>gG3H#CO0LYX1iP9)FeupWdtHHy)jD#qru=Q2(_q#0-kgN zLB_aE2x9$@5Hps?e-z?2M~!xv@P_H2C(Eh(5)wOVIPA0w83xO1fZ08``_RMq;~GqX zoAEY6)zI=_diYPeLTGi1xDwB$$R;seKx_C-IIV5TOybkYz#7yhVsR~TL}Q%ETS2?Y zO~+^1#4kCF_Njr$TY*Dt$GB*px|CJ!0u+j30hzCj4%B%?SAgTRv*6qX*m6@+C7zTX{yZ@mk(6g;f0u`OVhjx13KZV%{nz-C_2gjj?Z1aul5 zAf|}PJ6%AYg)j>A-UJM|S^3mrHaLSQMYj{O#6Z+SofsGncT*1MD4bO|_~cjfl2N(R ziI8PFNElW!K_)SQaP?7nFf#=r>XCX6nv{%+cz~33M1U+Hdh{ZAN12XxcEWqxFqtI# z3@y_gC=M47eKC)|^dBArxXunuJ>V8}Z&us_XQ10%^O#-2Mg5>YRlYTK2IZ`W7~Yuu z71h2QQdc@0_csYqMlszs1}VrICr)@X7Fh!!?GMK>#v#^yWSBUe9zcw@L28QxOH9MO zX-7aDG)kR7922YxV@(2$LZ=dCeMPYS0&!SkmG5sVkfLk^@q;)qMkjWa@M*w~Bh`>P z&5|VWl5O@y52_KL>+yRKZIK!u) zU$PeejssR*J;|H&5nXkLPpuT*X_wTD?F^pU536MoK#ZLHtXLBpi=aL?S{gX{Sxjaj zc3Rgdlee&MW1`{W|Eahp(MX1yK}m>UZT6`s{9A!$@~vdcos{fAu?a8wv%&M(0U?F< zh9az|$_|)JpTq3OVkZY&4NTguPRgK4yT`bfbYKgm6g#(0Qt_t#W(o{F#&AgD<8Y30 z$atV)1-{fu@w&h>=(VZDGs|Bc(NoQC3o8*f^{65Gc4=E6F(jP+h2W_-@H#n@U;RULo|!&FFMLQ z2r+(u#;b_zbfMy+b`y>m5MU7jXMQX&@K|IbJy0B)=I>Qp45c_qpGp>95<{N#&2~}N zVJAI_ofw#Z#DNFM#y}jA#la9Fsw}Fu56_4wSyZj9>=+aX5`Rc>QA6moeJFI!Ih<@w+Ejr+B=8Y= zkt_2P!w#Sq1JxpuklFK1 zt4XKP7Sk15>M8D<%Hhmzz7_GuVT=MIBYOfWwI8ESy@)Rzb**pC&8GTDk|!pWJk#7t!X+fLfo4!Yn5#YTGO zL)T{ujI6%1v6+<=46USCqHXldiAel=c=_WEAl_btdD;L2n?!}#)Xa*!5>`IkHilV8HCkNUa)Ig_lW5*#f#}O8W7n5XbJBW0s3`1jLB!PyaZg0 zeuD^a`Ucnx6w_e_tfehc!w1c*ifvT{~=E$C{UZX52g$q0$Q6y@8D}&2=UDZzG#l-DxUzu`91v2%lKKW z#vCfgH|w?^I9#W1U&02(GVl#_1N*=xOwLsc;pe>!=xo5Z zXDhgMT(Fz7kz2zV;*dFn3G>END7gEjP*ZI*o@!u3)&Lx^0CU5VDBl79iimI#O(#io zNQ4)`hM9ViO7ClOzCrt ztPHjn;l=TQu?wXn1&v%->2^YrG+Z5gC#j@BC$r-y%8JwkfnlwifiO*>_M;kVFJLoe z^1xwL6c%g>0Wto-UoX4^>v`lc!e|Yl-ehO`JMJd9`;aco_X3RrT9a8@X;ugv-IdPO zrr{qkt$`V@3IcN~$V2F(M=Koi(3>=&aZ-^{nFIQh*%4B}h{jop&%*4_o$FUo3{`2r zhD`q4q0NbxSSCK#z7ob!4!AriK$Xr0sI`AW&KY*tFIEUpV%pO503C#; zZ4L#JLvwm^zVA`uX#IzFx0E5tu-wP~RD&frJ9o zLUp}1C1^vVDTYF7)~7Z;IZo%rJ&;14vA z-q|MSkHMd}1+E3GAqs$CH2^^aj1_%n97og<1rhr7= zc4r_VfbKIQWhfzC=`6*;#O+x+essfg(H2iV7pz^%kUs{gL;R$Y z)v4EADh;OJCN#&u&B824Yr`c(g5#|5+#`8;Ip7a=5d)EgGj_t2M`m-E-lI)8y~`5ji6O)k&Mzq zBg9HJ%`;J=HQxex$4RvVxI%bJVD zj>+HeFL+kso`-?}_9mTr2`osvOApA$t8)?!8KQNwe6q+K)D%hIE}Wadm6h(*MWR`4 z7&bqGqg1%%-H#vqG>}f>o`-W_SWeOIp;54d~ciV(H-lX$t&ru4&{S4-S%%E zzWeic{>A#cmcpC2s(A*;MbOvK zB_sYbxVtz)Zt`bPY9N3L34)L=2xKED?*n8&TagSX4P-!<$;L|dFbRssHlkdVIU+$2 z=z>N(w+fXtR#L8`p8Cd(=1~r`|W7gtcrdlM2x z^q7e)j}L&4kSies&F8&?yAi^F!=t%Kd^8tPlaP5wVr6HM#y7+$Sll~vL;#sb2g9L8 zmF!{J=h<`dlIi26cR&K{eGzXdFN1qMz`*$z-@y42<^fH3TgOPk5D}KO{&6!3Gqf0G zAr`>Hne?pdb0DORzY)jN`03+c~UH%9(X)%KQwBv`YoRCVIO#2K-hB;yY&U zHI0D+AD(&=e0aKu{R*(D*nqZZZoqdmODVmx58V-Io#>qn-U0yVE$%jAkiC~M-(Cwl zH?Xl1opS-b7GRxzKWzZ-18FTZ6xGb`fjCg0y_c5Ci}UUCuLj$i@x2{@1{#8Y$ZD|j z2_p_Q9^5@V`CJRce6IMxIf{`Pt7yX$G_b%2_fTH%);LZypxL`ETlCJS5{Fbu2vFy7 zXK8=Zj<&vJ+2RW&!QMy9YoFE6M{5k$7*Z4@2-ER9`{6w910B|xiNg+fMbWaOa7_-v ze!^b}xr-WB3SrnmjJrLwjx9Zbu^mYBTF_FF25DY*V&0j{sD$?@qK$`ZCIY(-+m;_O z@sqrf4#X>@YzfCMZiA$k7Y24_v^meefuy`tI;vE}kiihI zw~u!NDM3ws@^|<)kdh`p*!vtgc*80G2GT?-iX@pB!a0zG-X~&8Z46!43TmX79aq-v z7kvXKe*QjA;T4IQ9h0U5fX(EG$1$yfo>qGRtOh4NIYSynGczK zdiD?_5o+KpLx?!JE+9p4sV!?$MHm-_z6LfAk)hA4ZbTq_H~OHd{eyrU?)`G6{T`uv zM<|&_n5cj#^01^|j6CFEASxh6B-9gI6GDOkDHakXS@`{3%wPbc1IT&g{u;&lXu=tF zWSX8#VP%}AoawG)s3yklmqOKZugN{3GN2zhsy+z%5q=*MRDotn12I}U77TaX2Q;lR zX9vHCYHi3>I}}d+iqxxPVevL};zm+2R3(_}gaNz^!o!Gfp9b@sF0i&)PwyE5599l3 zWlLpy2H4O{hP;}0Apa?H6Px}&T?l7DmPbS9ru=8HK&DI$B=d+Wu%SnB86nI|Qbp87 zy`6(E{Xj3Ds6w+?T%B}*~#l^idlgNUJt)9)E^+~R# zqY4|wg|(cTG~~?Tt@0>I+4Dv}hGywLZ88`xp=iW(Mm3 zulfUCB$kK37wSi^A-KjjsZII_l;Yk52(A$)wVBs~ik{x#ZD(>ry8OnLc4il>J?q3F zG|Y>4d!x8eab*Xr*!qiPF#6;H1ZkwPTYO^U=R<|rsflwKsnge_#2=3iv>1noxojZj z5+xlkLBHXyIrsodo(@Ja@ES>);i?y}(O zgCIg+2{ny!Nbu_5!DtpaF9Sq~Si-B2)l|gWn{SUrJD%w7=Na^Yz=R^eui9ZdSd=vb$PsN#BJnRz22T4FV2~h<5z;@Y_Nf5q`L;TP} zF4A~0tED0pme4mRW}H#5TLZ^nBjngqAUgJRmkzse$FQP1=pk#?`5b#j95PXt3*X2+ zw0}$>MZ!#!)=;*1cK(co^CyjcP?)yji8ZgSaDQQ-o4|)v_o(E#?h59jtC2huUc zadbcqWfTPOI(nysTrDDVyfk4x?F7W?2?OG$u_E!j-}!>;)es#2-~F zQP3+gjND9YMAJ%u&S6?PFtos-hWTU~2bl(P6!ePnUfWe}&}oD{MHzGsgAN$$`H})( zMZ#7~|j{HyNr|(2&3oRp?f%;guu)$13gmJ_;FdR~8NZ94glnr0*M$>;1y(461>zfL z5ozkUF<(TcIwB_DmK!Y*v$*X~9*kI2o$6SRK0ZINW?t?b6utWU+a!p%fld2N(`bq+Bge`Uki;(siL2=SX#310+EI3_~OQr*zI(t6q1h zbP@G9#`F@RWQks-@O-AW$0_&Q?z`jG8Q)pI^KWl{KI1!8&o;h!^TaXwXU{yjaN?Mk zzt{QXukLs=?|TCdI?h`E*;3@i?XEIUoqKZG#AjaqUe}YqxnpV@Xwfd?VeAOEoUX2v$l$E!*XWQ@1JxW44`;xFwlR=v76?>kZ9sN59c&K{D;@(yngF*@4b99<=_70rmttc`3Re~>e`x? zpO-yVTXyn7p6R`*PW}alQ6_v_*mzKr>ApgNcH$hZ>9x|VyH43pYiZ^dQmqWdT2q-y zNM|@o*7d;qbsT6VWSzB0qj@`bHLFR^Y=vA0h)pH^i_Z&$(2 zqJ)m*Yd~nY2E>{JHfy6(f^wikkuV_xX)o4$z9ev(MD{HC^+q}9YDW~h-1PW&=T{(rJNSYVeugE$r z`PGf$W{qJU3Y;Us6bJO{!of7i*{dTB8i?Xs;)|x!v9)SL2_vUog)}YA#T!;?8veHs z)0G){%u_JVMm(W3xptKLu*V;EfVw%_b)DcEUrt+8k;5s9YG!w!HJy0E$kunDg8v|( z5}xnKMcv#U`J%6jEDS^fi6=Y_E42vh3fdr#EPx+@+wmY;NJYBlL%sw7k{QLei^N4o z-fPRh!#|y5u`)>x2}|4sX{!Jqc#-eNhiHe)=Kn>t+MLzC0$13E6qc?{vo}v9y5fy3 z89+zvm&YwdGx#SZ=oRbIL{ovkL9pB)d2%t0ZXi@{p=c`LXHR03%(w&wU6QjfBt5HU zqOxlXC^m5K%*KQ_?lQ54+3Y!=u}*gHw65IW$anM8@btf048rAYqHq~rBwjk4jZ^N0 zDFF$&mCs<_nb_Wi(p@+KZan^hGk#3zUx&vORM_6IpQKVZm!@a2=gNo^@u}F28@;`= zbV!dN3+_GQK#P6OB|O17;y?>8aCZv3&SxnsmoVhsvqkTGD(S36O~c+?%*JVQ{Lf}m zw;Vh%!)4A>Aw{>^v%A`im$I8=y2W*CfjpBlVG!#w1dTS{iu>r5%p|R^ndr;wQs8c^ zRtpyEpNSSf*aq(o<-%$932~goy)(OVac8xM(visF5F9K|`8kB!sQ}c;e)(8rJr{}N zT%+!`Q8^Q;`vmR~Bx=;9@D<#Um@U-WSZqtgYFdYuY)pmx1gCqS0@tWqtO{cTsrf!Mq1+!QJAbP`W}e zMrU%7DIiX-P(UbNOeNc#RBuC(Xvu4es0nE66w#&UROO}81M=~x?uTi)4~62P+64p4 zLwGSJ4k}k+)hhcAVwjJ81Lt1cI}_WxP_hem@C*LxpVUr?ACo?mE4xS}Z0qnhlN{nl zfH0Dz7bWI?qJ!T8Bwe)DAH0XV5WWPKlPkq1Sn_Bq$|Gcp>1vvB8FXfII>=fQz2rBn z78)btjKNs<+K=*#8!CM^Rd;E;B<*B_@m86*RL$c|o`0Rol>$QLt)MhTfG<*+4r(udHtLGG#NiN)Y*rR}Z6IU7MM`_gUWhXGqqlZFyjd^~;h=v2HUo6y!L ze94+g#t$zVQ!HWdMX_)+9`nIMLkfe$?1_}8MiHV!I z`wbOAN#_%Bp8N^cI8B9odNhfNF7>=qzF>u@em>#gt0>!fB-)8L>&U_iazL)vfIzQ8 z_OKg*zA7Q_OGS6;*rRSp^OAWWp+z!q&TK<;PyxSjp1j9ImD72gpAdSGaw$>tbClFj z1F@Nm%mQd27S!*jD_hdr=iBFBoz6~oMdsTR$N{JjVz>&qDXuAOrbH=br|qhX5&HFn z$N3i{hsQ-lD~;HS@P3i%mTs!6|!-UiJt0XdZ%HXYJ~TlD2e?H?_O%^!}sn- z79SWpd#L3-?6Fp2E7<2?{3(Wl(-3rlSRTRHYz8AHYgm~&Ccn^M9+{6hSK~5P{u2Xs zdM;0_SMK6bi;4kRnNWKNeL9ft;a?xlIi2y&YfrE8ghBjwf$(bPi{Hx^Za%Vo(U0Dn z&{p+K?Z&;2q#PGkx3%_IwHjXzgjTpF2%Rn~`=^t0dO)Db*Ii*(EApBPE zq&rpbYc?&_cw!(R4I%|>M_X4;u3g=Ka_Qf}6A{|H@SwId=64Cz*Z^2UPEeKtX&^|Uu z;ByE0fsJd~<$us7U<}A2G;tcll1vlTCBtFu zf)?A0VT48g$16r{fDO*SY8ymRa{>awcmv)yqO~-W<5x9TA}UEz{PyA#cC1gjU$H&GA&-)GW@_Ltd<)RumrcM$o!K|`EG^>Ochp!7@ zNd#LE8#e_7MIcw`moV>4Z0|zpE}XDHW`>3Z-1AvFjv!WeN|O+4pDiVA{fTdfC<(E~ zE5r(^O|*Fmy@k{AR5{aK$pB1a@ux6r3~2iu_TAC;JGc~0MJddc>|xTNaJCWUsffTq zwnX6D171Zc*OxkXF>h~9l@L+62N0Eez_w>BJ63|-S{>~7N{grz*;W3!!yc$RG(cIk z9|6?AED^@r_3+cuR4q^{w53u)x~GmPlBjA?<*8ao2F}bNv>f`%a%F-2PeAA=LYJW} za^m%!{_WH_(lw(s;>hTlUk3gMVwt?wl#@BrA@r{p%TRNvjp9D*IQ6>DWd0Yf8EzqO zEf;Bqs8YeMDQ9+)xMOwS97e1zghA5y*vZ)Q(udl0ynN z8FqngBqCMyWd|bcHbX5Vem)dPwWAehb1E?ttmc|2rg~}!AF5e51BFN>)!Jg8_NRSt zXJj7%2;mtKLKs$h@l*MIG077<_{YSNHp$51oJr}ygqi%U_QO645!@Nsy{qKC;3(&H z8|br^8wPU32EGP4eLO;}xDFC?KlBw-rlE#-Q@)K4P7{qDLY%y&aJq${a{D4SarfOS z7*^k{epXfvjR)QnA-?6kv0?LMVlx-`k~B>Sm6Dv0lHALzUz?g@khmJvYjUaWeS1fn zA!`SWA$mG;g*yyOD*i2yFv9RqPD^Il`%mw?Z+?&C7t?yDeoj2`$)~*+(yn%;6@Fvp z^oxyS7Cv?PA5VVp2(2j*I7oyL-uOEtL6`-%Owjc5mnll+wq|fwvzoReEI!TIg|PTg z5ecjU^cCtNuW~~0DJN7ztiaR~DH3tAkK0te0@O~O&Kjv|C5lpYO=Xlxwdnsb_aHFS7bL$3X5 zI%lbnNn{{{606cZU+EH2I(vZ72{HSNaPC;GI9Un7TGDv%dctVNWPqlovDX84~1bl|k&5nb=NtkaOsDp+e*ae_P&b z%fF*Yw_&GLxJm#I*8fS-g3Fu+R-;W!(R`t`Nv}9=R_9=D;}xxK3B&GG<(tWvv?WP` z1QFV?5wdg$A{8vc5_%SKkJMfnBU}ld46DQnQPD9n1`x&Kue2CSbfaxKVY1E?L-25i zG=>>VSY7g2#-sLA>r1{UZnmGQdf{~OB;|7b3vF{(Dwnr>+%@;@j0(%gBYqG=&+6MS zI$T_4X+JmDY+t*&WQDS(s-Yqyucf`Yc!qs#*W8K9n)M}HGV=5d7#x<~;<;SUhS7*# zywCyr?kS_v*Tr_w9K+=G zJwGR;^I33BM}&A45aL0M z)%(3&1U^97Y_=-^1eB|GAg__4VDAUw&(A}8z#964Kv7%1i;E;a;56iXtpou4GjRAH zfC2d~?sTyC1H}uN0W=yIhb2-!VrQIWYXA=q7M>*@?LWW>=~_bS&v?21-M6j;QZGz; zIHx6}?6tZB_b=>m{^FwUn}yw2<*Eddo@78-|w|@Rx{Ufs9IgCONB`}&R zTH)g!tNV(UB4_tnyV%f+IH1wCPiO%H61 z)vaz!Wl{i9Ux@N6z(-4M0GBLemQ|wYZOcpwEa*K7y`mw|-5&(8lQumAMZm3wKTw1I z6$|?S9Yjhj@L05rM-WH?vL81h5XgTgOZ4BtT}b{j=-iWP2XOJ87u&AoH0$mJpMac% ziO@j)JE`{O6j0dU-kGs#yfA`b3Zp8t*T#!0z}k^=1^6;X@dOjw@gjS+j89;GVi-Ii zMyt17Sra?_11Ih(?YS^sHj4vivpNB_@q}sW5De_pG)1fIu_Uo*vlFz0C)ML|e4imuAM)sD;+&_*-*emfGYjgnrB zpxf5@R-&VM84*kThD$3K2lsb?k3h(j(91r+J$}4YUk773@DBA_*x8a!qA0toK<}I- z=S+unNl(@|wUwo*?KLT^&);Ww>)aK?p0d>dVG0#u;9iA%I_79Z6bJ&%-XuP>xOXPj z@p6&`dx7T&zX|K%6gOVBIH9e{aM-hTZkV z!DoHQtum`2QFi1%{0O&o{Qo+FUeUMBgS#!q9(XpFiO=RT>KV*kQ=;&?Ahol^VkhpM znP`C5jlFGR4YU2l&gqy3PUMJ*9>`!X$61QGXG%_!ZVVNf*@%r>x7RmtCeuSG+?#;V zZs{91aR*CEVBlOS4xA(GZ-RcWTlT-^I{r^kX~Z91o4xAR=iYmH>?4n~RZf}qZnfrD z|9G(K|LFgC*ZT2)T2!My_R6Ky%GOUb?jEa5=%9qD?w&$HSbRZ7&E9PnWZV>An1fdg zL3xxnf`!r?r2kRILs8e7N;e_Jz$N#-6lOE;$nvNptjOYC11f{MEWGmM+d#c>l}Y>`XCD&ce{Hva?Pf^#|I1rrbxT!FdGj{m0ZqSOvf^()xg zxelxmv$)*g1=7!4rycF@42Y~ug(z1*ZOq(4$`97KJ)SxeZSaIJ+^HotN4W2!vZPH|InOstCczVE^c_LUdN@}2Ckm1brMsWEw8jZSfBNfOMOs-bk z0nU>9Mdl{hQNz#@p71W3z1y-??|d308u632mK0+R5b)8~mn>VkWER(GAa%olc`+To z6U!aA2dgImi_>?i!?4v&6tB30uo#af(|>K{GK<>DMQMne`xPzQ!=f2JzCwu0?X z0;f2{`+Y!ai(muZCoLICoCPQv$$#Bjv4yXjL1^+R{6PT;8yFPbhrl7pKk{{uw=I8? zZ=stwww^aq-*Mt>YU9Ygsx>}c^90O^?`aTUFingvh>ZHa9`nhO1bi3310HsR5a0;k zbIwK>j~E5xL>jxr(KPYE{o&}s(e%qSvFmc#fB5XwS0cU!W0y-X(PK1BCsa&UP|Gp@ zEK$-fCWd-h5CJ}nyE4j;Kf*xP@c%l7-7SI$8kajQwftsNAZf&ohjJ_ruetZDvA3RW z%zFE#Z{4=}$`4m}a<_j?)t9}x^t-3#yg2>0^=ZFb-l~=HRwHF&zU$6%^IE~3rcw7; ztvfWEmiE<2-5cb{h=5RO`p1=Q(0EJ=-jH=_*+PD!(5Pd%a-n213Yju?Uir0*ELVn| zA`*;d2a-Jsg+vem#UHu*iO3Za^C3fIIy>FWoF#$EBOi1k`LuLVAgLe{L0{5D zmGJFc`yN%kU=WUFr8x2sFyluK@WVw`g0=&2BBt|-m;J%`qeROpSpoThzf5~{d=mM= zya~DrqwGYhJY9sc`AakpWUr4v6a~(uE^3ZAH7o%(~E58pV zZFTUAyu{Dsl*IV3e62$+sLweR)dY7U`adPM**L?7Q4lwovO2-OgV5%Gx zH@MD3tz}!uW=4{q6(m7OOy>#}uNB=;HW`Mq$>7rS4mVDMk;@2UpA?~0eVkMt2t%ck zIChs7&cE2&qG70V<1FG9YS_(Q#t&!l_xB*YdXu+ha8JPYN{oDz^CSw8BFl}n9-Ez8 z)x+8XTITyT>B_DmC{iSPjeS_#c|@QRlNAu2B97se&Nn_%;2uncTvk7o6HB$ozcC@b zbh0!l?X4{p3cvvpD{3q*YZ6+mYAwtrS-Q!(lf+%+`V1(qzEnGki76iK^4?3Oqq(0v zWbt!O1oy5SrWP9hdZ2U{Ze(-(D^w~`iMb% zol-I=Xzv*5`992;y{q?LohsigGU|PSd4XqOD^{Svh0jUeUJR&RxxF+Rh#!52iWmxK}j? zW#IB$OBxhTGq*%zpgQZgdiB9nr;%HTJig6bof`I0dTmRch83w-$FgH3AcY#h_a_LY zx(6uL1{g-ef4j0Jy*&t}8U-m-2%M{Qgixkkb@8<4>$F6qkPZ^R21QjPIv@jp*P%K0 z^#5rsutr)g%asLe4>6cCd{_tQ;VgQ)UJ_F1TyARRaYMDxs)6dg>$c%VScV;~_z&3J z8N-a$7qZJAuxp|_JU8K#UE8G{n-=*Slu;nugTG;B|)iixZjYbWw-NJ z-1}3RRIVGfSS<``Oi!Ka`t-r5IZ*UhUe&@LPxpMKCsQdSOQnobs)7Ez;2f7YRO_86 z{@}Yv78qH9D80D4d`(*XvUmZzA!qy2iwEu+T_Sczj$Cm?WfU zrTfye6m1X)hqIm@={G(T?XaXHD5N`+k1Q(U?ajl|*2LToeHZ}F-I&CVJoX%fptJes zwDIFhXn_$FcpY^)F;+zGc&EVJrP6q@=(__}syoCOy-dzji~bcq>_f!e#O)~YjlUaxv_O0o z#}mAll^=tHh+a5K7P!W#1AtwNs7bxcV>{!e@Q0_b+D|JW-WC@BuAn{Z{P>nPx>>e_|=pJF~&~68Fx;+Gk1v0?BpM z?I5N(-5s1o&=@;az3ug#O4hwE1=TsT8cWziS%!Je^C+Nw3!y>*?ZE6Hbf@0^2Fh@U z0w=0-7VsM((o5xXJ01j+VrM~c;~P2kD)LIDMHjX~*_T?d&#{uHjzw5P&mvMrJN8OC2`Sp$8MXYZ z!4<0mB)n|?9QHyPaRPRDE|m_0YMT}QN8IK)lN<5X?UzqRqViD>MU(FCaF)iS8k|vm z;@{@E2boIU94j7Ik(*8Z7WQeUiIq-x@hkA{nwC(xRwg$8r|6GDgE@)g;7=qa5uv!^ zh?0oVGhF;crX&#|c@zm9vFaj~M1Fa-KFa-dA;|FQ6}&*ff4Ftf z;j*&7KFNc|ZM7iBQ4tLXOfKp9b)9NnIKGdF2`%vrYaNo|bpANOX6ULTK|IMKe$U#^~?`CS4lS+#+ zyltGkU>ibQi?W?-VNbBt%!iWXBCraYVfWe(i!=eiWYDu``Gu*Vfb1alAwTqXe(??B zm{g{S-vE23+(N1~4Xn}+Xj&WC-nLAMMS=H#WF%PXM-`-gv_zyL(Sdh+f6bq?c|SJ6 z%i+0@+y=aJq=M#X>jujfz4Ix^=^7TyFNQqH@CHW1Aq{O@b*XA~vfPge&@fmH+(8^` zFjTFOgNbai+>d<|kjxy*7LMj&j&n+hs^vJlJD`e*AB@G?ZljN3h^*|*+#Bi5}K*D1uYe6keDz~{CIeX5%RA7MI>Ef9F=#HG(%sbo%<}qpg40yVT{R*_;q``Fu7M#e?0U#bQE7(C^ zF4ZjcpgZ0d>{ZcafQ{OxU@YWSNn_xH03fsHEA6_4XTadZ{wvdv2V_HDRrDJ#MFX~N z27!SP;S+)t8u0dMh{0URu5^iEUEx7L!M1JM$n4m3*w_vUU+AkZqbn?no)9}Xhjr>l z9P9$obRdor43I#pQ50xlgq|QrS?P%*nz`GznPWPn8$bdnQe5`7gRr0QuO!pd>$-B|Lk;cKKl4jyB=krs zYYAcAx-@(9M2H=UkN(9rXP{X(W7wWDLNl?$KWWC@+$rhQMaT=pffi+l-lyK?Ed4vU zmnEQS8U7Yz4&JiMU+SEIdBoy0P&Q8!mCe!_fDP-Jd>Nkz=>X_FXJ}q&#${`L!zu33 zr~b^ySOp%#GEN)PLH&`R)7NmyAG^^#%Z5Dkxf}!OrgfzK?_H;8kg0|xx1BiGh5GJ;nxV81dZ zj}h0hs^-zRv+dkJ$W7Xo?aUU=Nvx(xg}sm|;@Y@c-oc-ByWDGJB-K*L6mSlH6-CPJ zT4p;aTLvizTPOM3gj+P|pDs8*b;Y^l5`O+3(N5Dj#iC<@c? zBUtTU^aEKl7*213tQxYO&ATSlltGct7kTI zSBX_xa-O}OJwo)5RSJ3{+r?dQUn8q!q^w0wr`mN)8r#Oz^Vif>ayo_W;Lf{y)YTdi z1!q}1xjgpA^eXx<3Q%_BsvY@G-mZ!=MXShuPhuc4b?~6ofz{BUcYW9gz+Hb)n#Y2z zVRn0LdRBu~PkrWC|FHp_Xb>ZP?p(to7J- z(B(!nOT@^w;VHc*>WgWz7I5csBMYUv-kBszQ+$H0Ra#PkNyXTJWek^dW=QRTQRiRZ zf!AL+Ei5%LeGh06<~9~C_k$XZ)f=dspp`Ph{lqTl&>9(tu#y!+?3*AW-FCWz^Y+QD?kxp;t&Tl+-e*L3bFYUj>m5vWYCmAj0} z1Znou>`{Zjy%yq!IxK6Ovd#MTfM-`(H!?3fk2zYaJBvFE`Ar#SmGywKj6JrPd6_A$ zZ>?_4*lx%-C}#}uK)0IBBn(P&spnR`@$?zzHdtpNiq|wfV9q#y;Ds{f zmy1g_xwCR%^1e=U@!a)qyv)2?KexK|f$ha>3@^+Gafa&;WID}E=XRyDL+Px~;2as; z`C{Hx%wImH=8vi0SW2mvQU}ZBRJpvhNk=!Og*?1TY3A$)m@?L~n9gJL^`yR4xt&lN zm>HaXBc128I7oe`zJpLE4;tJ~y-Bh4-c4u&xj%BHrrnWZKF`cy;+_hpN_6|O@<%LW# zX8GIv@+AF&a}yYa84msu&+=^Nm083@Dhk>nhAc>mU@ztqGzaVPn&c!F_TuRXbwSfI66*SZY-n;%`uWDQd>$qgv}bchp;(JaEP!;XY1Ibe7A=?Tcsg1 z)v2`HUdPt*E=1U*u|~wRWfJFeWw4s7Nr{rC8R)>;PX3r)OYc(DC{Bi=%EEg)hK+z# zEtT!67WR1bRzjHwrs;o%4zghI#Hv9ft@QM<0muUD4pk^HCvT?-4)|Ltdz~5uQ03_#Z?qX^h z=Diw6*y>>8G8VxOfC=?2SPc{HZY2>u%+M}VpwC6V?BTayH# z)qqH~bk2glM^e3Z5QSz#^$I$fiW3ji14$|S9?dX?`eCX0N8_Nk;E7xzKAJ12Q4Te! z2;2EUy0#*jH)_(AT}9+5{BG$!MenJo99CETIaIGyur|^AliiUG9b?Q}`#sap0*pLc|+pi1~ zsNBIHK*`HSuHOB|Jb8~vv&55eC7sjDTVR6p7I;X7u$YSA?X_Uq6CUjo%z>)kPfv$T zaa7uKg109_v{iJjHG#@1>*$@*q=M`1dT_HsUs5?*c}gw$ zVA~UgZ4`GgNY2%{Twe5bR33rkjc3H*qVIXP@jo@pQJ!(9b5m^d zhnC9Xx8)fvF2}{!e?lppV7FQ!Pf&NKBq9WeSlp0dNkk}iGi0tO67~)ba3v8TT)D6S znN&$cD5%-Ss7LGYDs~3|1$3v<^L=oDYj_bMM-eak`?-plfm9LhhjLneT=rVsJNKVm zZCXC1eeTri9e=)B#mX+)?ppS@N8f(=?uLl(Wd()3>l$~H?4z1A33cXsPNa)cq z3W3!z-xj(JRVx2Jej9N>)|%=xbG7b`nx^gScH#|rr)7j|~)mDs9opF|ap$o!uCXF5C5;p;3-fchZTQz2& zST&5()cy>{9?Ls@nT_xw0Ue^)%pbAm%7_zY^`n?~X2NCq?U#>LUk{+WYTDx_7cScq z2j@fY5)!i{fY9+}9Vc_)a`A2gp~uATKf<1KFBKHdOt+Iqat1X2+&7Qe%6Dfqr7|g8 z2bzXbo%LKjc`yy2n^%Q{n$FW)9ch61CsCe?=AW`ov&!|Q&V5v^?AlD81qU2oQq{mr zxAVEe5;{z*W^ir>g0YbLGAyH=ux6nTQZCqc9%xGwbiP`{?DRx9g_7L*t}$G3?i#>K z)&P}LtvC@RbPj+g&;hLqd5m}p7EZ%fGarTwIfFDY==~OU@FUTw6ngZfXsEPQwx712 zz8YZ3C3Z`wW5iQrz$peX=-DRc5$ZfS9JnY9S@q>oO*wNmjQBV()XBfYA2*DB86Smh zh;hSl;;&-k-uP>V3RZ3v@>|v8ouz*Z8N$V|cU!jTolnWJFJZ^N*Ug}vu`iq+3vrN* zThO<4f_)X=lC0w2d(u#~LY_>i>Mq6Kfrn%=YbLT32a~gpnE1gQr@~|UxM=u+Z^%YS zaWsRtq)VOGH_YM=*FdBm_yPKW1iXy_ zqlC5y`j)jmAOZKzypf$rIDAM~uBqF<3J5wsqD2mvFfT$&HZ&CClVe|YlY zyq1hV+*kL9`xkE9_~^dv`ksw%-M!H{?`qc%pZ)!*3pd{{+kE`XzkZoga@?wYU*qnv z3Rg8#j%lX2I|Mf+XerJ6XR~VjVh0rB09g)Nh;(>Ea9hl>R_bgSFjiB}r9z~ypY=~; zwjxc$Y3^0JHJ$4wn*ik>1Vvv7r1}7zg9y|FVRAyfy_(*`R58b;QAuRlGp^nc>=l%t zsse&)H9ds64PO2-|-K&&6yjbza6i$6~icD_uX6$Z`zyQM(yge=%(G#Bu`su0_V%;Y8?U!;%uDr9c%!Au=w7 z(Jte47{NdhJ2>`mtITR(^d`mU=MTHwF?W%2Qp>W=xtlZIwk%s!vOi<2edhX-L&aa% zXI3>d7T>0vq;EJAYX`a1vQtErC&OT~Yf4LdWAQlq+RnMRD<5B9vN>b2zTr^uJC^n{ zbL;GDSCuSMK3>(ZKVx$2A9j_KE#M91N_v+L!>fx~+5N`UbQuHxItw&}$6U z$QwL6Ls<7~#4R(}9b90{o~(J@cB%T~Hh7hlzOJ|WenqH2W<^l8bAq2bQA8nrvZLFDy4 z%o8cRYraU}@(D_)oB{$Dygy2m8in}PcmG9KZ0RH}*N zWUnw$a6&T|)<~X#HnaD-*r)<|n5Re{7US*KN~s;3>Q^->2qjud*V3eLOszy55uzMk zlY{r=WfCkdfpYL$40Wp;`Ej*t{XI zKm?qDum?@`%5r6~L?j2Kkyoq#s}DrDw0mFLt>kx{yZ^TRbMiaao^RZKvwRHq{Fylm zSq_#PC6|jD&0Uf(V#@ln{OJls*mhk!NFiK(AcovwVBD7L4h}4t5spfr{$3R5^ zNJZIb+nl9;*Tv$mBekl&^&#$d0MCG`>r0QS3!c(#iAc$~)Wz_(wjvco)nllk;3+wA z6u%Q2-V8R)D>mvI?|kFxia-*IJ0H$z&V2oo`Zd#^<34`0Dl9ks z>w&ee)LMGEvct`$Q%Q_m(o&y?#kE_IRw<0VENuKy0+0g=#;KQkmfUqiPch^dXJi zD4Qyo?&E6@tOJfrERhT02TB3#L44ty+gxzy|tEKDovVc z;N1ico;qdl(z3G%+zFO@{4kE^#qy}!G_ZCj}NlS(@m`39I@b=~WryFii-n(XePTcUvw+l|uN2&?GGN zgn$_#r`WwO1)O{?Wr3m3X5QgGFpo*&t|I4=BPax{i`cI~Wr$tE?VmK`4#?gOlSD5d>v<6gjj=6OA<4+VO&2*%9B9ww#v3mhSySK- zNZUBW)Ba-TbmTyXF*;qt2qcO4_Kck7 z#}54ePal~4T+Ks&Ub~{@=oh!#HuJ)~-p_yY;vv(nC$fKV6FoJ?gkA5;?nmuo0e)0$~tSg+N^^q&UO^O0nrgi>;TabNbJxghq4@$ z>ogDnVC3r52Q_^aI>91?LY0(SWvHA~dA=lyj>uyt4?&6DzZ}#-atfL;?zSKGI=b69 z^rt!1d6r+8+Il-wG8;=!C37AMDN!(62o>F_V~-;Fhztsy5LqIF$dWdGpPVV+H^#nH zBvC92fdKqw=oDnW8k93IImM^qC0l zUF#I~=5$b+;NF>0gptJ;cqlkZwR6zJ*(nqgg%lwa4`GCp_n4@1I*%J9h-uKIrv3-i zf`dd5i=8NFo*Ix_rl=Hh%?Wl@eh|ez2*U+0EqBvn7nEssqv{0Me5INY7-L!v!IJg1ub>(PNT$@#MiDc!cd# zdn}e`5lL(Zu|AV~ZH>BdaX~PB>0y>!N8R*?mWdR=MX)G>o#42Evto*tih(=Fr7ko1 zpXOVrF)>{GBf}kq z*NNjkG_5s*|IC5L6N& zCeK?^Ot`!}9=Z3NhK(d~C2B$*Ay|82BwQa}51x>kT-YJku;6g>EWJgZ$C(c6%6RMp zPhLm6B*__Z{GNQpev|hWWK6Q~Z0XphdOaK4? literal 0 HcmV?d00001 diff --git a/tests/tabix_data/example_unicode.vcf b/tests/tabix_data/example_unicode.vcf new file mode 100644 index 0000000..4512a8f --- /dev/null +++ b/tests/tabix_data/example_unicode.vcf @@ -0,0 +1,23 @@ +##fileformat=VCFv4.0 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=1000GenomesPilot-NCBI36 +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT Reneé Grün Señor +M 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2 +17 14370 Reneé G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,. +20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3 +20 1110696 Grün A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4 +20 1234567 Señor GTCT G,GTACT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3 diff --git a/tests/tabix_data/fivecolumns.bed b/tests/tabix_data/fivecolumns.bed new file mode 100644 index 0000000..2ba7294 --- /dev/null +++ b/tests/tabix_data/fivecolumns.bed @@ -0,0 +1,4 @@ +chr1 100 200 one apple +chr1 300 400 two banana +chr2 100 600 three carrot +chr2 700 800 four durian diff --git a/tests/tabix_data/gtf_toofew_fields.gtf.gz b/tests/tabix_data/gtf_toofew_fields.gtf.gz new file mode 100644 index 0000000000000000000000000000000000000000..42b924d544c3880238198054da2c6d396f3f4cbc GIT binary patch literal 400 zcmb2|=3rp}f&Xj_PR>jW#f)#Kd1p5}2sFI^E82WL>BjW+&!#weEa>H2nc1(jOT}qd zSO0~7zt>4cXTLn$Cc?G*LF)6_H@_Y}$XPDgwzAqhHs=1JW6{jpRIa<~;}&es*c z)31C%#l-olQj3+?#bW^}jVBK4_;rhY$ZC*OQ{Be$>dqs}rwf)w27QS5ktlRD>GrWt zN*bqRwn&%%e6Ve{QpFU`*P_R)Qnh{DfBcP{FY-p<@20sIjz6+;yvkTz_n>+~@(tE@ z2bQ{0(F@b&ncvr$^?llDL)9w5vbi6ZyJ%!GFWq}J?}}lPq}Sc)ubxf*-D$ltzh>5E zxexkt_Wn|Gt~Gs|87;EG*)PlAWny7k{L%@k&hwtze7ZbmdSH<1|68;BE*KQ+Ud%kN z{9M*B$yjZt%ZU?N+xBFY_0Ic}R~`OprQ^z=|LU(^zn`n%=J!ul^Ck0AT>f(~wD_=f*etFfTZ)>-Rvj{IaEY8coAdeR2(hSVtC;$-v`+m2g literal 0 HcmV?d00001 diff --git a/tests/tabix_data/gtf_toomany_fields.gtf.gz b/tests/tabix_data/gtf_toomany_fields.gtf.gz new file mode 100644 index 0000000000000000000000000000000000000000..901dc1e92ca2ae444a7b6bebee06b77cc4850413 GIT binary patch literal 400 zcmb2|=3rp}f&Xj_PR>jW#f)#Kd1p5}2sE6(JpbWViEmF=TP_t4%1Cy~y0y4NuXDn> zN6K6N?^}KBTGX!%imiwADsKKvEBjkea45Dd@zp(F@$1_+e7x46o5kqJ*CZHoD*ZI; z_s1M2oM!{JaxCm~-C`&bsqo35`|={zJyHp6o}IdlR@*E5EHg5viP(tM&2ZUxW820( z99>52Z;!>=?RdM4LoW4DRqIB-n_QO#>*}wmvs%0C&r$!fafe?(>4ACjKjdCWlpRzQ zXpE0#-LmxgS@Z5^d!H8hbjG#BrvK3t^t$DcnZH%Kv?ro1==;)LKcCb+@_Qvc|JfS$ zKiui-_nioc_pQDq#`@Z7ThkID1YDIq8Ke_N((awf*RjW#f)#Kd1p5}2sE6(JpbWViEmF=TP_t4%1Cy~y0y4NuXDn> zN6K6N?^}KBTGX!%imiwADsKKvEBjkea45Dd@zp(F@$1_+e7x46o5kqJ*CZHoD*ZI; z_s1M2oM!{JaxCm~-C`&bsqo35`|={zJyHp6o}IdlR@*E5EHg5viP(tM&2ZUxW820( z99>52Z;!>=?RdM4LoW4DRqIB-n_QO#>*}wmvs%0C&r$!fafe?(>4ACjKjdCWlpRzQ zXpE0#-LmxgS@Z5^d!H8hbjG#BrvK3t^t$DcnZH%Kv?ro1==;)LKcCb+@_Qvc|JfS$ zKiui-_nioc_pQDq#`@Z7ThkID1YDIq8Ke_N((awf*R +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##ValidationMetrics_HardyWeinbergViolations="25 (8%)" +##ValidationMetrics_HomVarViolations="0 (0%)" +##ValidationMetrics_NoCallViolations="13 (4%)" +##ValidationMetrics_PolymorphicPassingRecords="195 (75%)" +##ValidationMetrics_RecordsPassingFilters="258 (87%)" +##ValidationMetrics_RecordsProcessed=296 +##ValidationMetrics_SamplesAssayed=383 +##VariantValidationAssessor="analysis_type=VariantValidationAssessor input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[rawData/plink.renamed.sorted.fixed.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub maxHardy=20.0 maxNoCall=0.05 maxHomVar=1.1" +##source=PLINK +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00127 HG00128 HG00136 HG00137 HG00138 HG00139 HG00152 HG00156 HG00234 HG00235 HG00237 HG00242 HG00244 HG00262 HG01055 HG01079 NA19138 NA18974 NA18523 NA12717 NA19209 NA18577 NA18973 NA18943 NA12873 NA18623 NA18622 NA18948 NA19171 NA19204 NA06994 NA18563 NA18547 NA18861 NA18608 NA18995 NA10851 NA18976 NA18603 NA19200 HG01204 HG01191 HG01101 HG00146 HG00306 NA18985 HG00160 HG00635 HG00372 HG00357 HG00634 NA18541 NA18950 NA19759 HG00351 HG00257 HG00118 HG00336 HG00448 HG01354 NA18609 HG00428 HG00326 NA11894 NA18956 HG00173 HG00117 NA11893 HG01251 HG01441 HG01437 HG00182 HG00330 HG01060 HG00329 NA18960 NA18856 NA07346 NA18871 NA19057 NA18868 NA18636 NA12830 NA19007 NA18910 NA18874 NA19056 NA19064 NA19066 NA18487 NA18642 NA19236 NA07056 NA18637 NA19235 NA19309 NA19311 NA19334 NA19346 NA19347 NA19372 NA19376 NA19383 NA19384 NA19394 NA19428 NA19430 NA19451 NA19466 NA19313 NA19321 NA19324 NA19332 NA19390 NA19436 NA19439 NA19440 NA19463 NA19470 NA19471 NA19472 NA19676 NA19660 NA19661 NA19663 NA19722 NA19725 NA19728 NA19729 NA19731 NA19749 NA19755 NA19756 NA19758 NA19770 NA19773 NA19777 NA19780 NA19783 NA20525 NA20589 NA20765 NA20802 NA20804 NA18544 NA18602 NA18546 NA18610 NA18957 NA18615 NA18616 NA19010 NA18638 NA18639 NA18627 NA19072 NA18630 NA19074 NA19080 NA19081 NA19083 NA19085 NA19088 NA20287 NA19835 NA20276 NA19818 NA20278 NA20282 NA20342 NA20296 NA20314 NA20346 NA19712 NA19198 NA19108 NA18934 NA18916 NA18907 NA18917 NA06989 NA12058 NA12341 NA12546 NA12489 HG01197 NA18983 NA11843 NA11892 NA12749 NA12282 NA12751 NA18959 NA19331 NA19453 NA20537 NA12046 NA20515 NA20516 NA20521 NA20524 NA20528 NA20759 NA20768 NA20769 NA20774 NA20775 NA20783 NA20787 NA20790 NA20800 NA20819 NA20812 NA20505 NA20530 NA20540 NA20538 NA20581 NA20815 NA20544 NA20810 NA20807 NA20816 NA20504 NA20753 NA20502 NA12342 NA19150 NA19468 NA20336 NA19395 NA19257 NA19360 NA19700 NA18867 NA20317 NA18968 NA19107 HG00111 HG00108 NA19077 NA19684 NA18511 NA12044 NA19382 NA19457 NA18933 NA18923 NA18965 HG00141 NA20341 NA18740 HG00537 HG00346 HG01173 HG00702 HG00313 HG00150 NA18612 HG00339 NA12273 HG00250 NA18593 NA18621 HG00478 HG00251 HG01070 NA19160 HG00479 HG00608 NA18573 HG00375 NA19248 NA19093 HG01170 HG00534 HG01171 HG01522 NA18624 HG00683 HG01521 NA19005 NA20412 NA18971 HG00446 NA12748 HG00530 HG00690 HG01356 HG01516 NA20532 HG00344 HG00328 NA18542 HG00254 HG00321 HG00577 HG00656 HG00342 HG00524 HG00650 HG00557 HG00319 HG00457 HG00125 HG00578 HG00543 HG00638 HG00171 HG00699 HG00595 HG00187 HG00704 HG00533 HG00596 HG00268 HG01083 HG00651 HG01133 HG00671 HG00327 HG01148 HG00246 HG00672 HG00556 HG00436 HG00554 NA18633 NA20344 NA11993 NA07037 NA11930 HG01366 HG01389 HG00620 NA19740 HG00190 HG00419 NA18535 HG01495 NA18592 HG01497 HG00174 HG01140 NA12287 HG00689 HG01550 HG00334 HG01375 HG00637 NA18507 HG01113 NA18550 NA19129 HG01551 HG01462 HG00331 NA12413 HG01456 HG01360 HG00708 HG01350 HG00684 NA19099 HG00284 NA12399 NA12286 NA12777 HG00277 HG00266 NA19985 HG00353 HG01102 NA07347 NA07051 NA19900 NA18984 NA07048 HG00640 HG01066 NA12812 HG01174 HG01188 +20 676148 . A AC . PASS AC=0;AN=758;HW=0.00;HetPct=0.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1342549 . A AAGAT . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1366475 . CT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1550416 . C CT . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 3700705 . CTTTGGG C . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5724449 . T TC . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7942727 . A AC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9231138 . AT A . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10090376 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12094344 . TCAGGAGGC T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12634463 . TGA T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12837095 . G GA . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12928028 . TG T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13365589 . T TG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13926445 . TA T . PASS AC=0;AN=756;HW=0.00;HetPct=0.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14287634 . AGT A . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14983337 . AGCC A . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15037520 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15141272 . T TC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16192114 . AT A . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16259934 . C CAA . PASS AC=0;AN=758;HW=0.00;HetPct=0.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17250858 . T TC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17753474 . C CA . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18520672 . A ATT . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19188693 . T TC . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19437778 . GGCCTGGGATGTAAA G . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20434198 . TA T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20990240 . TC T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24710482 . GT G . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25905250 . GT G . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29589873 . CCTT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29628180 . C CCACAAGAAG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29804699 . A AC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30567910 . T TG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31760870 . CG C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32456076 . GT G . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32968409 . GTC G . PASS AC=0;AN=754;HW=0.00;HetPct=0.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34313574 . A AT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35329008 . ATC A . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37954797 . A AGT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39607037 . C CA . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39868369 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40006262 . TGAG T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40110981 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40742257 . TG T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41964672 . A AT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42145613 . TG T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42930748 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43606638 . T TC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43826992 . GC G . PASS AC=0;AN=748;HW=0.00;HetPct=0.0;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=2.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44470843 . GAGTGTCGT G . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45300827 . CT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46353646 . A AG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47428163 . C CA . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49451656 . T TG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49561273 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49765611 . A AC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50772065 . T TC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53538294 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54262948 . A AC . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55658161 . GT G . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59186675 . TATTA T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61531765 . AG A . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 diff --git a/tests/tabix_data/vcf/11.vcf b/tests/tabix_data/vcf/11.vcf new file mode 100644 index 0000000..fe190df --- /dev/null +++ b/tests/tabix_data/vcf/11.vcf @@ -0,0 +1,216 @@ +##fileformat=VCFv4.0 +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##ValidationMetrics_HardyWeinbergViolations="25 (8%)" +##ValidationMetrics_HomVarViolations="0 (0%)" +##ValidationMetrics_NoCallViolations="13 (4%)" +##ValidationMetrics_PolymorphicPassingRecords="195 (75%)" +##ValidationMetrics_RecordsPassingFilters="258 (87%)" +##ValidationMetrics_RecordsProcessed=296 +##ValidationMetrics_SamplesAssayed=383 +##VariantValidationAssessor="analysis_type=VariantValidationAssessor input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[rawData/plink.renamed.sorted.fixed.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub maxHardy=20.0 maxNoCall=0.05 maxHomVar=1.1" +##source=PLINK +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00127 HG00128 HG00136 HG00137 HG00138 HG00139 HG00152 HG00156 HG00234 HG00235 HG00237 HG00242 HG00244 HG00262 HG01055 HG01079 NA19138 NA18974 NA18523 NA12717 NA19209 NA18577 NA18973 NA18943 NA12873 NA18623 NA18622 NA18948 NA19171 NA19204 NA06994 NA18563 NA18547 NA18861 NA18608 NA18995 NA10851 NA18976 NA18603 NA19200 HG01204 HG01191 HG01101 HG00146 HG00306 NA18985 HG00160 HG00635 HG00372 HG00357 HG00634 NA18541 NA18950 NA19759 HG00351 HG00257 HG00118 HG00336 HG00448 HG01354 NA18609 HG00428 HG00326 NA11894 NA18956 HG00173 HG00117 NA11893 HG01251 HG01441 HG01437 HG00182 HG00330 HG01060 HG00329 NA18960 NA18856 NA07346 NA18871 NA19057 NA18868 NA18636 NA12830 NA19007 NA18910 NA18874 NA19056 NA19064 NA19066 NA18487 NA18642 NA19236 NA07056 NA18637 NA19235 NA19309 NA19311 NA19334 NA19346 NA19347 NA19372 NA19376 NA19383 NA19384 NA19394 NA19428 NA19430 NA19451 NA19466 NA19313 NA19321 NA19324 NA19332 NA19390 NA19436 NA19439 NA19440 NA19463 NA19470 NA19471 NA19472 NA19676 NA19660 NA19661 NA19663 NA19722 NA19725 NA19728 NA19729 NA19731 NA19749 NA19755 NA19756 NA19758 NA19770 NA19773 NA19777 NA19780 NA19783 NA20525 NA20589 NA20765 NA20802 NA20804 NA18544 NA18602 NA18546 NA18610 NA18957 NA18615 NA18616 NA19010 NA18638 NA18639 NA18627 NA19072 NA18630 NA19074 NA19080 NA19081 NA19083 NA19085 NA19088 NA20287 NA19835 NA20276 NA19818 NA20278 NA20282 NA20342 NA20296 NA20314 NA20346 NA19712 NA19198 NA19108 NA18934 NA18916 NA18907 NA18917 NA06989 NA12058 NA12341 NA12546 NA12489 HG01197 NA18983 NA11843 NA11892 NA12749 NA12282 NA12751 NA18959 NA19331 NA19453 NA20537 NA12046 NA20515 NA20516 NA20521 NA20524 NA20528 NA20759 NA20768 NA20769 NA20774 NA20775 NA20783 NA20787 NA20790 NA20800 NA20819 NA20812 NA20505 NA20530 NA20540 NA20538 NA20581 NA20815 NA20544 NA20810 NA20807 NA20816 NA20504 NA20753 NA20502 NA12342 NA19150 NA19468 NA20336 NA19395 NA19257 NA19360 NA19700 NA18867 NA20317 NA18968 NA19107 HG00111 HG00108 NA19077 NA19684 NA18511 NA12044 NA19382 NA19457 NA18933 NA18923 NA18965 HG00141 NA20341 NA18740 HG00537 HG00346 HG01173 HG00702 HG00313 HG00150 NA18612 HG00339 NA12273 HG00250 NA18593 NA18621 HG00478 HG00251 HG01070 NA19160 HG00479 HG00608 NA18573 HG00375 NA19248 NA19093 HG01170 HG00534 HG01171 HG01522 NA18624 HG00683 HG01521 NA19005 NA20412 NA18971 HG00446 NA12748 HG00530 HG00690 HG01356 HG01516 NA20532 HG00344 HG00328 NA18542 HG00254 HG00321 HG00577 HG00656 HG00342 HG00524 HG00650 HG00557 HG00319 HG00457 HG00125 HG00578 HG00543 HG00638 HG00171 HG00699 HG00595 HG00187 HG00704 HG00533 HG00596 HG00268 HG01083 HG00651 HG01133 HG00671 HG00327 HG01148 HG00246 HG00672 HG00556 HG00436 HG00554 NA18633 NA20344 NA11993 NA07037 NA11930 HG01366 HG01389 HG00620 NA19740 HG00190 HG00419 NA18535 HG01495 NA18592 HG01497 HG00174 HG01140 NA12287 HG00689 HG01550 HG00334 HG01375 HG00637 NA18507 HG01113 NA18550 NA19129 HG01551 HG01462 HG00331 NA12413 HG01456 HG01360 HG00708 HG01350 HG00684 NA19099 HG00284 NA12399 NA12286 NA12777 HG00277 HG00266 NA19985 HG00353 HG01102 NA07347 NA07051 NA19900 NA18984 NA07048 HG00640 HG01066 NA12812 HG01174 HG01188 +20 669442 . TG T . PASS AC=54;AN=766;HW=6.74;HetPct=12.0;HomRefPct=86.9;HomVarPct=1.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 719486 . C CT . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 890696 . C CAT . PASS AC=6;AN=766;HW=0.00;HetPct=1.6;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1102516 . CT C . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1149576 . CT C . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1195706 . AAG A . PASS AC=334;AN=764;HW=9.47;HetPct=44.9;HomRefPct=33.7;HomVarPct=21.1;NoCallPct=0.3 GT 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 . 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 1/1 +20 1655540 . AT A . PASS AC=4;AN=764;HW=0.00;HetPct=1.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 2889034 . AAAAT A . PASS AC=6;AN=762;HW=0.00;HetPct=1.6;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 3203741 . CT C . PASS AC=4;AN=762;HW=0.00;HetPct=1.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4037626 . TC T . PASS AC=194;AN=764;HW=14.70;HetPct=33.4;HomRefPct=57.7;HomVarPct=8.6;NoCallPct=0.3 GT 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 . 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 +20 4210074 . G GA . PASS AC=197;AN=762;HW=14.95;HetPct=33.7;HomRefPct=56.9;HomVarPct=8.9;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 . 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 +20 4363519 . CATT C . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4366806 . CAAAT C . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4641550 . CCTTGA C . PASS AC=3;AN=766;HW=0.00;HetPct=0.8;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5105482 . C CATTTTAGG . PASS AC=101;AN=762;HW=14.11;HetPct=20.1;HomRefPct=76.2;HomVarPct=3.1;NoCallPct=0.5 GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 5289619 . GA G . PASS AC=377;AN=764;HW=5.70;HetPct=53.0;HomRefPct=24.0;HomVarPct=22.7;NoCallPct=0.3 GT 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/0 1/1 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 . 0/0 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/1 0/0 +20 5416109 . CA C . PASS AC=2;AN=752;HW=0.00;HetPct=0.5;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=1.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5432262 . AGT A . PASS AC=4;AN=752;HW=0.00;HetPct=1.0;HomRefPct=97.1;HomVarPct=0.0;NoCallPct=1.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 6877907 . CA C . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 6969412 . CAAAGAAT C . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7229260 . T TA . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7239075 . AG A . PASS AC=5;AN=766;HW=0.00;HetPct=1.3;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7950562 . C CT . PASS AC=4;AN=760;HW=18.01;HetPct=0.5;HomRefPct=98.4;HomVarPct=0.3;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8195466 . C CT . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8233352 . TACTC T . PASS AC=56;AN=764;HW=1.84;HetPct=13.1;HomRefPct=85.9;HomVarPct=0.8;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 8504000 . TAG T . PASS AC=5;AN=762;HW=0.00;HetPct=1.3;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9921724 . AAAGT A . PASS AC=11;AN=758;HW=0.00;HetPct=2.9;HomRefPct=96.1;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9925738 . T TG . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11229169 . T TA . PASS AC=3;AN=756;HW=0.00;HetPct=0.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11511920 . AC A . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11893900 . ATTAG A . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12021825 . A AG . PASS AC=5;AN=756;HW=0.00;HetPct=1.3;HomRefPct=97.4;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12063752 . CTT C . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12114989 . CTA C . PASS AC=4;AN=764;HW=0.00;HetPct=1.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12371546 . GACA G . PASS AC=10;AN=762;HW=0.00;HetPct=2.6;HomRefPct=96.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12512723 . G GTT . PASS AC=6;AN=762;HW=0.00;HetPct=1.6;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12692743 . TTATC T . PASS AC=8;AN=762;HW=0.00;HetPct=2.1;HomRefPct=97.4;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13003323 . GGGA G . PASS AC=3;AN=762;HW=0.00;HetPct=0.8;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13128894 . CT C . PASS AC=10;AN=764;HW=0.00;HetPct=2.6;HomRefPct=97.1;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 +20 13287841 . CAT C . PASS AC=134;AN=760;HW=0.21;HetPct=29.2;HomRefPct=67.1;HomVarPct=2.9;NoCallPct=0.8 GT 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 1/1 0/1 0/1 . 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 +20 13566260 . AAATTG A . PASS AC=374;AN=764;HW=3.95;HetPct=47.5;HomRefPct=27.2;HomVarPct=25.1;NoCallPct=0.3 GT 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/0 0/1 . 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/1 1/1 1/1 +20 13685184 . AT A . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13716193 . GAGAA G . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13960028 . TC T . PASS AC=188;AN=750;HW=2.44;HetPct=35.5;HomRefPct=55.6;HomVarPct=6.8;NoCallPct=2.1 GT 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 . 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . . 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 +20 14159734 . T TA . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14383135 . TA T . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14669226 . G GA . PASS AC=121;AN=766;HW=1.68;HetPct=25.8;HomRefPct=71.3;HomVarPct=2.9;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 +20 14697473 . TTC T . PASS AC=9;AN=764;HW=10.31;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15189597 . GA G . PASS AC=311;AN=760;HW=2.80;HetPct=46.2;HomRefPct=35.5;HomVarPct=17.5;NoCallPct=0.8 GT 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 . 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 . 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 . 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 +20 15265098 . TG T . PASS AC=125;AN=766;HW=6.76;HetPct=25.3;HomRefPct=71.0;HomVarPct=3.7;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 +20 15410763 . TGA T . PASS AC=29;AN=764;HW=0.00;HetPct=7.6;HomRefPct=92.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15543319 . AG A . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 15550845 . TG T . PASS AC=34;AN=756;HW=0.00;HetPct=8.4;HomRefPct=90.1;HomVarPct=0.3;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15703503 . TG T . PASS AC=87;AN=750;HW=3.63;HetPct=19.1;HomRefPct=77.0;HomVarPct=1.8;NoCallPct=2.1 GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/1 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 . 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15871330 . AG A . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16016504 . TA T . PASS AC=186;AN=764;HW=15.27;HetPct=32.4;HomRefPct=59.3;HomVarPct=8.1;NoCallPct=0.3 GT 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +20 16312599 . CTA C . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16723642 . GGTT G . PASS AC=6;AN=760;HW=0.00;HetPct=1.6;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16747221 . CA C . PASS AC=291;AN=764;HW=3.13;HetPct=45.2;HomRefPct=39.2;HomVarPct=15.4;NoCallPct=0.3 GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 . 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 +20 16813850 . C CA . PASS AC=7;AN=758;HW=0.00;HetPct=1.8;HomRefPct=97.1;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17331332 . TA T . PASS AC=80;AN=762;HW=15.60;HetPct=16.2;HomRefPct=80.9;HomVarPct=2.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 17473782 . TGC T . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17607627 . A AGT . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 18417481 . AC A . PASS AC=17;AN=766;HW=0.00;HetPct=4.4;HomRefPct=95.6;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 18445795 . AAG A . PASS AC=5;AN=760;HW=0.00;HetPct=1.3;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18522725 . ATTAAC A . PASS AC=1;AN=758;HW=0.00;HetPct=0.3;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18915562 . TAA T . PASS AC=3;AN=762;HW=0.00;HetPct=0.8;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19111235 . C CT . PASS AC=4;AN=764;HW=0.00;HetPct=1.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19805154 . CCTT C . PASS AC=3;AN=766;HW=0.00;HetPct=0.8;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20030869 . CT C . PASS AC=362;AN=766;HW=6.74;HetPct=46.5;HomRefPct=29.5;HomVarPct=24.0;NoCallPct=0.0 GT 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 +20 20286529 . A AC . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20404656 . ATTACAGACT A . PASS AC=7;AN=766;HW=0.00;HetPct=1.8;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20716329 . CA C . PASS AC=4;AN=760;HW=0.00;HetPct=1.0;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20760474 . TG T . PASS AC=15;AN=764;HW=5.83;HetPct=3.4;HomRefPct=96.1;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 20952825 . T TC . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21406859 . ACTT A . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21480245 . AG A . PASS AC=1;AN=766;HW=0.00;HetPct=0.3;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21852048 . CA C . PASS AC=330;AN=762;HW=4.15;HetPct=46.5;HomRefPct=33.2;HomVarPct=19.8;NoCallPct=0.5 GT 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 . 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 . 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 +20 21968507 . AC A . PASS AC=7;AN=762;HW=12.61;HetPct=1.3;HomRefPct=97.9;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 22434333 . C CA . PASS AC=8;AN=766;HW=0.00;HetPct=2.1;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 22637424 . C CAGCCA . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 22655862 . TATC T . PASS AC=6;AN=766;HW=0.00;HetPct=1.6;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23200197 . ATT A . PASS AC=1;AN=766;HW=0.00;HetPct=0.3;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23293728 . CA C . PASS AC=8;AN=754;HW=11.33;HetPct=1.6;HomRefPct=96.6;HomVarPct=0.3;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23813095 . CT C . PASS AC=26;AN=762;HW=1.46;HetPct=6.3;HomRefPct=93.0;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 23815381 . CT C . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23889003 . GA G . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24855121 . CT C . PASS AC=6;AN=760;HW=0.00;HetPct=1.6;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25503211 . CATA C . PASS AC=1;AN=758;HW=0.00;HetPct=0.3;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29913425 . TATATC T . PASS AC=15;AN=762;HW=5.82;HetPct=3.4;HomRefPct=95.8;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30390854 . TTATACTA T . PASS AC=3;AN=766;HW=0.00;HetPct=0.8;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30534847 . ACAAT A . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31412616 . CT C . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32015223 . CT C . PASS AC=5;AN=764;HW=0.00;HetPct=1.3;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32158330 . CAG C . PASS AC=4;AN=760;HW=0.00;HetPct=1.0;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32509752 . A AG . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32700247 . GGCGTCTGA G . PASS AC=3;AN=754;HW=0.00;HetPct=0.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 33541746 . A AAG . PASS AC=4;AN=766;HW=0.00;HetPct=1.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34251969 . C CA . PASS AC=3;AN=762;HW=0.00;HetPct=0.8;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34633573 . TAA T . PASS AC=1;AN=754;HW=0.00;HetPct=0.3;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34831930 . CT C . PASS AC=7;AN=766;HW=0.00;HetPct=1.8;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 35357903 . GA G . PASS AC=5;AN=764;HW=0.00;HetPct=1.3;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35847597 . CTT C . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36658020 . TG T . PASS AC=6;AN=764;HW=0.00;HetPct=1.6;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36704724 . TC T . PASS AC=8;AN=756;HW=0.00;HetPct=2.1;HomRefPct=96.6;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36711544 . TAAAG T . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36947086 . ATAC A . PASS AC=33;AN=766;HW=0.12;HetPct=8.6;HomRefPct=91.4;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37139725 . CAG C . PASS AC=5;AN=760;HW=15.80;HetPct=0.8;HomRefPct=98.2;HomVarPct=0.3;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37278654 . CAG C . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37391272 . TG T . PASS AC=4;AN=764;HW=0.00;HetPct=1.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37608002 . CAT C . PASS AC=7;AN=762;HW=0.00;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37678954 . C CTGG . PASS AC=7;AN=762;HW=0.00;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37712193 . AAG A . PASS AC=29;AN=762;HW=0.00;HetPct=7.6;HomRefPct=91.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37836124 . AAAT A . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37962643 . T TAA . PASS AC=178;AN=764;HW=12.74;HetPct=31.9;HomRefPct=60.6;HomVarPct=7.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 1/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 +20 38336199 . TA T . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38495835 . T TA . PASS AC=14;AN=762;HW=0.00;HetPct=3.7;HomRefPct=95.8;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38696054 . GAAGA G . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38784318 . CCTT C . PASS AC=7;AN=762;HW=0.00;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39042026 . T TG . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39420665 . AG A . PASS AC=72;AN=760;HW=3.25;HetPct=16.2;HomRefPct=81.7;HomVarPct=1.3;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +20 40445967 . TG T . PASS AC=3;AN=762;HW=0.00;HetPct=0.8;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41000677 . T TG . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41149621 . T TATCA . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41364251 . A AAG . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41543685 . CTAAGGAGGGAAAAAGATATAAT C . PASS AC=12;AN=764;HW=0.00;HetPct=3.1;HomRefPct=96.6;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41851636 . TA T . PASS AC=83;AN=764;HW=18.52;HetPct=16.4;HomRefPct=80.7;HomVarPct=2.6;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 +20 42159695 . GC G . PASS AC=87;AN=762;HW=7.05;HetPct=18.5;HomRefPct=78.9;HomVarPct=2.1;NoCallPct=0.5 GT 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 . 0/0 . 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +20 42261635 . C CATTT . PASS AC=24;AN=764;HW=2.06;HetPct=5.7;HomRefPct=93.7;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42470352 . CACTT C . PASS AC=19;AN=764;HW=3.87;HetPct=4.4;HomRefPct=95.0;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 42585924 . T TA . PASS AC=1;AN=754;HW=0.00;HetPct=0.3;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42856201 . CT C . PASS AC=3;AN=766;HW=0.00;HetPct=0.8;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42909154 . T TGGGTC . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42918721 . AG A . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43245783 . AG A . PASS AC=8;AN=766;HW=11.40;HetPct=1.6;HomRefPct=98.2;HomVarPct=0.3;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43371647 . GGGCTGTAA G . PASS AC=80;AN=760;HW=6.79;HetPct=17.2;HomRefPct=80.2;HomVarPct=1.8;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 43434234 . AG A . PASS AC=4;AN=766;HW=0.00;HetPct=1.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43539258 . T TAG . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43993933 . CA C . PASS AC=199;AN=764;HW=8.74;HetPct=35.2;HomRefPct=56.1;HomVarPct=8.4;NoCallPct=0.3 GT 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 1/1 1/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 +20 44071585 . C CT . PASS AC=132;AN=764;HW=8.50;HetPct=26.1;HomRefPct=69.5;HomVarPct=4.2;NoCallPct=0.3 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 +20 44220528 . T TC . PASS AC=59;AN=766;HW=1.90;HetPct=14.9;HomRefPct=84.9;HomVarPct=0.3;NoCallPct=0.0 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 44340276 . AACAG A . PASS AC=37;AN=758;HW=17.93;HetPct=7.6;HomRefPct=90.3;HomVarPct=1.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44464600 . T TA . PASS AC=19;AN=762;HW=3.86;HetPct=4.4;HomRefPct=94.8;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44572563 . GA G . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44889286 . G GC . PASS AC=13;AN=766;HW=0.00;HetPct=3.4;HomRefPct=96.6;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 45092013 . GT G . PASS AC=4;AN=760;HW=0.00;HetPct=1.0;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45406096 . T TTC . PASS AC=4;AN=760;HW=0.00;HetPct=1.0;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45668403 . CTG C . PASS AC=86;AN=762;HW=16.06;HetPct=17.2;HomRefPct=79.6;HomVarPct=2.6;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 46051811 . T TAAGC . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46413551 . TC T . PASS AC=2;AN=760;HW=0.00;HetPct=0.5;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46569465 . CTG C . PASS AC=10;AN=762;HW=0.00;HetPct=2.6;HomRefPct=96.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46720983 . ATACTTGG A . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47032179 . GC G . PASS AC=2;AN=760;HW=0.00;HetPct=0.5;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47136092 . A AGTC . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47335386 . GC G . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47988904 . CA C . PASS AC=187;AN=760;HW=17.08;HetPct=32.1;HomRefPct=58.7;HomVarPct=8.4;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 . 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 +20 48262933 . CCTA C . PASS AC=7;AN=766;HW=0.00;HetPct=1.8;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49438742 . G GT . PASS AC=8;AN=762;HW=11.37;HetPct=1.6;HomRefPct=97.7;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49537420 . AG A . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50136971 . TTTTC T . PASS AC=8;AN=764;HW=0.00;HetPct=2.1;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50373155 . A AT . PASS AC=7;AN=762;HW=0.00;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50806976 . G GAA . PASS AC=128;AN=760;HW=0.17;HetPct=28.2;HomRefPct=68.4;HomVarPct=2.6;NoCallPct=0.8 GT 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 . 0/0 . 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 +20 50961401 . G GT . PASS AC=4;AN=762;HW=0.00;HetPct=1.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51547787 . AC A . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51838824 . GA G . PASS AC=4;AN=756;HW=17.99;HetPct=0.5;HomRefPct=97.9;HomVarPct=0.3;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51961394 . ATTTG A . PASS AC=8;AN=760;HW=0.00;HetPct=2.1;HomRefPct=97.1;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53081927 . CATGA C . PASS AC=5;AN=764;HW=0.00;HetPct=1.3;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53602394 . T TA . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54124185 . T TC . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54150907 . CAG C . PASS AC=3;AN=754;HW=0.00;HetPct=0.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54166824 . AC A . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54230743 . CAT C . PASS AC=2;AN=758;HW=0.00;HetPct=0.5;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54309727 . TGAGC T . PASS AC=7;AN=762;HW=12.61;HetPct=1.3;HomRefPct=97.9;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54379666 . GT G . PASS AC=172;AN=766;HW=14.43;HetPct=30.8;HomRefPct=62.1;HomVarPct=7.0;NoCallPct=0.0 GT 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 +20 55264363 . AG A . PASS AC=232;AN=762;HW=15.89;HetPct=37.1;HomRefPct=50.7;HomVarPct=11.7;NoCallPct=0.5 GT 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 +20 55608811 . CT C . PASS AC=35;AN=762;HW=19.90;HetPct=7.0;HomRefPct=91.4;HomVarPct=1.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 55611547 . CAA C . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55989765 . CA C . PASS AC=208;AN=764;HW=5.71;HetPct=37.1;HomRefPct=54.0;HomVarPct=8.6;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 +20 56249865 . T TGAGG . PASS AC=4;AN=756;HW=0.00;HetPct=1.0;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56344957 . GT G . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56419021 . T TG . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56915853 . TG T . PASS AC=17;AN=764;HW=4.78;HetPct=3.9;HomRefPct=95.6;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57676578 . CCTTT C . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 58288793 . TC T . PASS AC=44;AN=766;HW=12.53;HetPct=9.4;HomRefPct=89.6;HomVarPct=1.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59153061 . CTG C . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59349754 . CCT C . PASS AC=168;AN=762;HW=8.71;HetPct=31.3;HomRefPct=61.9;HomVarPct=6.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 . 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 59365768 . TG T . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59769242 . C CT . PASS AC=4;AN=762;HW=0.00;HetPct=1.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60337932 . AC A . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60925525 . GC G . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61000018 . GC G . PASS AC=203;AN=762;HW=0.38;HetPct=39.4;HomRefPct=53.3;HomVarPct=6.8;NoCallPct=0.5 GT 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 . 0/1 . 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 +20 61983510 . TCTGC T . PASS AC=75;AN=766;HW=0.03;HetPct=18.0;HomRefPct=81.2;HomVarPct=0.8;NoCallPct=0.0 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 62154368 . G GA . PASS AC=2;AN=760;HW=0.00;HetPct=0.5;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62310426 . CTT C . PASS AC=1;AN=756;HW=0.00;HetPct=0.3;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62871860 . C CCCGCA . PASS AC=27;AN=764;HW=17.87;HetPct=5.5;HomRefPct=93.5;HomVarPct=0.8;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 diff --git a/tests/tabix_data/vcf/12.vcf b/tests/tabix_data/vcf/12.vcf new file mode 100644 index 0000000..e0d112c --- /dev/null +++ b/tests/tabix_data/vcf/12.vcf @@ -0,0 +1,1000 @@ +##fileformat=VCFv4.0 +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT DNA_pool_A +chr1 1281168 . A G 14 . DP=37;AF1=0.6243;CI95=0.5,1;DP4=4,0,6,0;MQ=15;PV4=1,0.027,1,1 PL:GT:GQ 43,0,4:0/1:6 +chr1 1281205 . T C 26 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 58,9,0:1/1:63 +chr1 1281206 . G C 25 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 57,9,0:1/1:63 +chr1 1922737 . G C 13.2 . DP=21;AF1=1;CI95=1,1;DP4=0,0,0,21;MQ=22 PL:GT:GQ 46,63,0:1/1:99 +chr1 21197513 . A G 55.1 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=41 PL:GT:GQ 88,21,0:1/1:84 +chr1 21343209 . T C 5.45 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=14 PL:GT:GQ 37,51,0:1/1:99 +chr1 22097362 . T C 4.75 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 35,9,0:1/1:63 +chr1 22254012 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 22650927 . G A 48.1 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=24 PL:GT:GQ 81,21,0:1/1:84 +chr1 23535401 . C T 40.4 . DP=25;AF1=1;CI95=0.5,1;DP4=0,16,0,5;MQ=19;PV4=1,0.2,1,1 PL:GT:GQ 73,13,0:1/1:65 +chr1 23543855 . T C 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=44 PL:GT:GQ 82,18,0:1/1:90 +chr1 24245107 . C G 32 . DP=4;AF1=0.5001;CI95=0.5,0.5;DP4=0,2,0,2;MQ=36;PV4=1,1,1,1 PL:GT:GQ 62,0,35:0/1:38 +chr1 24274412 . G C 39.5 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=32 PL:GT:GQ 72,12,0:1/1:72 +chr1 36529832 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr1 37788090 . A G 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr1 43120440 . C T 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=49;PV4=1,1,1,1 PL:GT:GQ 64,0,31:0/1:34 +chr1 43980466 . C T 43 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=19 PL:GT:GQ 76,45,0:1/1:99 +chr1 46047795 . T C 29.1 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=31 PL:GT:GQ 62,18,0:1/1:90 +chr1 48860309 . C T 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=46 PL:GT:GQ 141,18,0:1/1:90 +chr1 49415599 . T C 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 34,6,0:1/1:49 +chr1 51601816 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 51955459 . G C 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr1 68479569 . T G 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 43,6,0:1/1:49 +chr1 69032455 . A G 15.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 47,9,0:1/1:63 +chr1 71888225 . G T 9.31 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr1 72381528 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr1 82004013 . A G 37.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 70,12,0:1/1:72 +chr1 86289622 . C T 18 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 50,9,0:1/1:63 +chr1 90267663 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=45 PL:GT:GQ 54,9,0:1/1:63 +chr1 92699542 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr1 94867317 . G A 26.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 58,6,0:1/1:49 +chr1 96428713 . C G 3.98 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=27 PL:GT:GQ 33,6,0:1/1:49 +chr1 100466329 . G C 4.85 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=22 PL:GT:GQ 36,18,0:1/1:90 +chr1 101909281 . G A 70 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=4,0,5,0;MQ=46;PV4=1,1,0.096,1 PL:GT:GQ 100,0,88:0/1:91 +chr1 106216572 . T A 22 . DP=18;AF1=1;CI95=1,1;DP4=0,0,16,0;MQ=21 PL:GT:GQ 55,48,0:1/1:99 +chr1 107901770 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 40,6,0:1/1:49 +chr1 108431179 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=41 PL:GT:GQ 155,24,0:1/1:96 +chr1 112005344 . C T 99 . DP=52;AF1=1;CI95=1,1;DP4=7,0,27,0;MQ=44;PV4=1,1,1,1 PL:GT:GQ 196,25,0:1/1:99 +chr1 116625452 . C T 36 . DP=44;AF1=0.5;CI95=0.5,0.5;DP4=0,23,0,20;MQ=49;PV4=1,2.3e-69,0.42,1 PL:GT:GQ 66,0,179:0/1:69 +chr1 118060710 . G T 6.98 . DP=8;AF1=0.4999;CI95=0.5,0.5;DP4=4,0,3,0;MQ=47;PV4=1,0.0071,1,1 PL:GT:GQ 36,0,73:0/1:39 +chr1 118198177 . A G 15.9 . DP=23;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 47,6,0:1/1:49 +chr1 118586346 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr1 120809555 . G A 20 . DP=8;AF1=0.5;CI95=0.5,0.5;DP4=6,0,2,0;MQ=46;PV4=1,1,1,1 PL:GT:GQ 50,0,106:0/1:53 +chr1 130723110 . C A 20.7 . DP=8;AF1=0.5939;CI95=0.5,1;DP4=0,6,0,2;MQ=26;PV4=1,1,1,1 PL:GT:GQ 50,0,5:0/1:7 +chr1 133979895 . T C 14.9 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 46,6,0:1/1:49 +chr1 134977940 . C T 30 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=38;PV4=1,1,0.26,1 PL:GT:GQ 60,0,31:0/1:34 +chr1 141768589 . G A 18.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=4,0,4,0;MQ=51;PV4=1,2.7e-05,1,1 PL:GT:GQ 48,0,100:0/1:51 +chr1 141768590 . G A 22 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=2,0,4,0;MQ=50;PV4=1,0.0033,1,1 PL:GT:GQ 52,0,40:0/1:43 +chr1 146506051 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=43 PL:GT:GQ 76,9,0:1/1:63 +chr1 150997009 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr1 162915612 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 168455400 . A G 4.12 . DP=28;AF1=1;CI95=1,1;DP4=0,0,0,27;MQ=10 PL:GT:GQ 35,81,0:1/1:99 +chr1 172784744 . T C 17.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 49,6,0:1/1:49 +chr1 183627307 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 185789457 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr1 187081827 . T C 4.77 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=17 PL:GT:GQ 36,30,0:1/1:99 +chr1 188468339 . C T 33 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=24 PL:GT:GQ 66,39,0:1/1:99 +chr1 188595435 . C T 41.8 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr1 188670561 . G C 3.55 . DP=22;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=18 PL:GT:GQ 34,27,0:1/1:99 +chr1 188924877 . G A 6.2 . DP=10;AF1=0.9999;CI95=0.5,1;DP4=2,0,3,0;MQ=21;PV4=1,1,1,0.3 PL:GT:GQ 35,3,0:1/1:41 +chr1 190536295 . G A 68 . DP=38;AF1=1;CI95=1,1;DP4=0,0,36,0;MQ=18 PL:GT:GQ 101,108,0:1/1:99 +chr1 191129408 . T A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr1 195937816 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr1 198857619 . T C 89 . DP=61;AF1=0.5;CI95=0.5,0.5;DP4=0,38,0,17;MQ=30;PV4=1,0.032,1,1 PL:GT:GQ 119,0,139:0/1:99 +chr1 199057483 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 44,6,0:1/1:49 +chr1 200133619 . G C 5.83 . DP=49;AF1=1;CI95=0.5,1;DP4=2,0,8,0;MQ=17;PV4=1,0.059,1,0.2 PL:GT:GQ 37,12,0:1/1:72 +chr1 200729661 . A T 36 . DP=15;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=27 PL:GT:GQ 69,42,0:1/1:99 +chr1 201374519 . T C 69.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=39 PL:GT:GQ 102,12,0:1/1:72 +chr1 202811668 . G A 20.2 . DP=4;AF1=0.5163;CI95=0.5,1;DP4=0,1,0,3;MQ=24;PV4=1,1,1,1 PL:GT:GQ 50,0,12:0/1:15 +chr1 202960650 . C T 16.6 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=27 PL:GT:GQ 49,12,0:1/1:72 +chr1 205686638 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr1 205949857 . A G 3.14 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=21 PL:GT:GQ 33,15,0:1/1:75 +chr1 209806643 . A G 13.2 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=21 PL:GT:GQ 46,24,0:1/1:96 +chr1 209871501 . C T 25 . DP=12;AF1=0.5;CI95=0.5,0.5;DP4=5,0,4,0;MQ=41;PV4=1,7.7e-06,1,1 PL:GT:GQ 55,0,84:0/1:58 +chr1 211051323 . G A 99 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=49 PL:GT:GQ 176,24,0:1/1:96 +chr1 211389716 . C T 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 43,6,0:1/1:49 +chr1 211868415 . G A 3.54 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=14 PL:GT:GQ 34,33,0:1/1:99 +chr1 211914531 . C T 84.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,1,0,4;MQ=46;PV4=1,1,1,1 PL:GT:GQ 116,7,0:1/1:57 +chr1 214691313 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr1 215184650 . C T 40.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 72,6,0:1/1:49 +chr1 215995258 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr1 217031394 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 217986960 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 76,9,0:1/1:63 +chr1 218086681 . A G 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=34 PL:GT:GQ 142,27,0:1/1:99 +chr1 218546019 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 218632417 . G T 17.1 . DP=19;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=26 PL:GT:GQ 50,21,0:1/1:84 +chr1 218833355 . C G 23 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=5,0,2,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 53,0,63:0/1:56 +chr1 219303186 . T C 7.79 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,25;MQ=12 PL:GT:GQ 40,75,0:1/1:99 +chr1 219517634 . G A 26.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=42 PL:GT:GQ 59,12,0:1/1:72 +chr1 219590158 . T C 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 33,12,0:1/1:72 +chr1 219709853 . A T 99 . DP=124;AF1=0.5;CI95=0.5,0.5;DP4=80,0,41,0;MQ=44;PV4=1,0.26,1,1 PL:GT:GQ 143,0,156:0/1:99 +chr1 222457988 . A G 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=23 PL:GT:GQ 42,6,0:1/1:49 +chr1 222477914 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr1 223010233 . A G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr1 223796360 . G A 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=21 PL:GT:GQ 37,6,0:1/1:49 +chr1 224273784 . A T 14.2 . DP=18;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=15 PL:GT:GQ 47,30,0:1/1:99 +chr1 224454685 . C T 46.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=32 PL:GT:GQ 79,15,0:1/1:75 +chr1 224514706 . G C 21 . DP=38;AF1=1;CI95=1,1;DP4=0,0,38,0;MQ=19 PL:GT:GQ 54,114,0:1/1:99 +chr1 224515793 . C T 99 . DP=26;AF1=1;CI95=1,1;DP4=0,0,26,0;MQ=45 PL:GT:GQ 211,78,0:1/1:99 +chr1 224692969 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 40,6,0:1/1:49 +chr1 225607249 . A G 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=45;PV4=1,1,0,1 PL:GT:GQ 64,0,31:0/1:34 +chr1 226923918 . C A 29.1 . DP=52;AF1=1;CI95=0.5,1;DP4=0,2,0,10;MQ=27;PV4=1,1,1,1 PL:GT:GQ 62,18,0:1/1:90 +chr1 227125189 . T C 56.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=41 PL:GT:GQ 89,12,0:1/1:72 +chr1 227133712 . A T 20.1 . DP=26;AF1=0.5;CI95=0.5,0.5;DP4=11,0,10,0;MQ=23;PV4=1,1,0.48,1 PL:GT:GQ 50,0,39:0/1:42 +chr1 227943954 . G C 47 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=37 PL:GT:GQ 79,9,0:1/1:63 +chr1 227943974 . G A 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=34 PL:GT:GQ 66,12,0:1/1:72 +chr1 228067480 . A G 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=45 PL:GT:GQ 75,15,0:1/1:75 +chr1 228067510 . A G 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=45 PL:GT:GQ 140,15,0:1/1:75 +chr1 228088778 . C T 6.79 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=23 PL:GT:GQ 37,6,0:1/1:49 +chr1 228117888 . A C 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 45,6,0:1/1:49 +chr1 228139641 . T C 44.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 77,12,0:1/1:72 +chr1 228577146 . T C 26 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,14;MQ=22;PV4=1,1,1,0.027 PL:GT:GQ 56,0,77:0/1:59 +chr1 229001369 . C A 45 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 77,9,0:1/1:63 +chr1 229001386 . C T 8.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 39,6,0:1/1:49 +chr1 229348080 . T C 18.1 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=40;PV4=1,0.33,0.17,0.33 PL:GT:GQ 48,0,31:0/1:34 +chr1 229439710 . C T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=32 PL:GT:GQ 66,12,0:1/1:72 +chr1 229655149 . T C 30 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=30 PL:GT:GQ 63,24,0:1/1:96 +chr1 229660873 . C G 81 . DP=28;AF1=0.5;CI95=0.5,0.5;DP4=0,20,0,7;MQ=36;PV4=1,1,1,1 PL:GT:GQ 111,0,120:0/1:99 +chr2a 3661005 . C G 24 . DP=13;AF1=0.5001;CI95=0.5,0.5;DP4=7,0,4,0;MQ=27;PV4=1,1.1e-05,1,1 PL:GT:GQ 54,0,34:0/1:37 +chr2a 4140063 . G A 81 . DP=26;AF1=0.6671;CI95=0.5,1;DP4=18,0,8,0;MQ=24;PV4=1,8.3e-09,1,1 PL:GT:GQ 110,0,3:0/1:5 +chr2a 4248440 . T C 20 . DP=28;AF1=0.5;CI95=0.5,0.5;DP4=11,0,7,0;MQ=25;PV4=1,1,0.47,1 PL:GT:GQ 50,0,92:0/1:53 +chr2a 4707656 . A G 63 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 95,9,0:1/1:63 +chr2a 5194801 . G A 7.59 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=24 PL:GT:GQ 38,6,0:1/1:49 +chr2a 14111103 . A G 7.84 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=20 PL:GT:GQ 40,21,0:1/1:84 +chr2a 17799746 . A G 11.3 . DP=5;AF1=0.5001;CI95=0.5,0.5;DP4=0,3,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 41,0,35:0/1:37 +chr2a 24728910 . G A 45.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=28 PL:GT:GQ 78,15,0:1/1:75 +chr2a 29627939 . G T 5.44 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=27 PL:GT:GQ 36,9,0:1/1:63 +chr2a 31373164 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr2a 33935228 . T C 41.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr2a 36311856 . G A 99 . DP=30;AF1=1;CI95=1,1;DP4=0,0,0,29;MQ=44 PL:GT:GQ 213,87,0:1/1:99 +chr2a 39281204 . T C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr2a 41087565 . C T 74.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=38 PL:GT:GQ 107,12,0:1/1:72 +chr2a 45574768 . C A 11.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=18 PL:GT:GQ 43,9,0:1/1:63 +chr2a 55464464 . T C 26.1 . DP=7;AF1=0.9966;CI95=0.5,1;DP4=5,0,2,0;MQ=26;PV4=1,1,1,1 PL:GT:GQ 55,1,0:1/1:23 +chr2a 63107673 . T A 70.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=34 PL:GT:GQ 103,12,0:1/1:72 +chr2a 63141732 . A T 22.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 54,6,0:1/1:49 +chr2a 63141910 . G A 3.41 . DP=16;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr2a 63141911 . C T 9.55 . DP=16;AF1=0.5031;CI95=0.5,0.5;DP4=0,2,0,3;MQ=33;PV4=1,0.43,1,1 PL:GT:GQ 39,0,19:0/1:22 +chr2a 63143543 . C T 28 . DP=18;AF1=1;CI95=1,1;DP4=0,1,0,17;MQ=16;PV4=1,1,1,1 PL:GT:GQ 61,42,0:1/1:99 +chr2a 66419805 . G A 3.69 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 34,15,0:1/1:75 +chr2a 66563922 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr2a 67719136 . C T 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 71,6,0:1/1:49 +chr2a 72781453 . A C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr2a 76733211 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr2a 78190502 . A C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr2a 85021209 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr2a 88554861 . A T 39 . DP=74;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,4;MQ=46;PV4=1,1,1,1 PL:GT:GQ 69,0,92:0/1:72 +chr2a 88554877 . A G 92 . DP=90;AF1=0.5;CI95=0.5,0.5;DP4=0,23,0,13;MQ=41;PV4=1,0.3,1,1 PL:GT:GQ 122,0,128:0/1:99 +chr2a 88824857 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr2a 93546675 . C T 26 . DP=6;AF1=0.5;CI95=0.5,0.5;DP4=4,0,2,0;MQ=46;PV4=1,1,1,1 PL:GT:GQ 56,0,87:0/1:59 +chr2a 94788853 . A G 34.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 67,15,0:1/1:75 +chr2a 96738146 . T C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr2a 102737384 . A G 12.3 . DP=18;AF1=1;CI95=1,1;DP4=0,0,18,0;MQ=11 PL:GT:GQ 45,54,0:1/1:99 +chr2a 103407172 . A G 35 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=19 PL:GT:GQ 68,24,0:1/1:96 +chr2a 105774580 . T G 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=30 PL:GT:GQ 135,39,0:1/1:99 +chr2a 106376301 . C G 24.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=19 PL:GT:GQ 57,18,0:1/1:90 +chr2a 106376315 . C T 8.75 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=19 PL:GT:GQ 41,18,0:1/1:90 +chr2a 112422267 . C T 30 . DP=20;AF1=0.5;CI95=0.5,0.5;DP4=14,0,5,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 60,0,131:0/1:63 +chr2b 3049384 . A C 14.9 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 3049385 . G C 14.9 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 3049406 . C G 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=36 PL:GT:GQ 135,18,0:1/1:90 +chr2b 4213802 . T C 89.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr2b 5022895 . G A 66 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=49 PL:GT:GQ 99,30,0:1/1:99 +chr2b 6037666 . G T 56 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=17 PL:GT:GQ 89,39,0:1/1:99 +chr2b 13656952 . G A 19.2 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=21 PL:GT:GQ 52,18,0:1/1:90 +chr2b 15026944 . A G 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 37,6,0:1/1:49 +chr2b 23362613 . A G 5.64 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 37,15,0:1/1:75 +chr2b 45947861 . C G 68 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=50 PL:GT:GQ 101,33,0:1/1:99 +chr2b 46597824 . T C 65.6 . DP=39;AF1=0.5939;CI95=0.5,1;DP4=23,0,10,0;MQ=22;PV4=1,0.014,1,1 PL:GT:GQ 95,0,5:0/1:7 +chr2b 49665191 . G T 34.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=37 PL:GT:GQ 67,21,0:1/1:84 +chr2b 61001546 . A G 48 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=26 PL:GT:GQ 81,24,0:1/1:96 +chr2b 88502851 . T C 4.77 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,2;MQ=37;PV4=1,1,0.46,1 PL:GT:GQ 33,0,34:0/1:33 +chr2b 91675431 . C T 30 . DP=14;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=27 PL:GT:GQ 63,24,0:1/1:96 +chr2b 91870148 . T G 67 . DP=14;AF1=1;CI95=1,1;DP4=0,1,0,13;MQ=47;PV4=1,1,1,1 PL:GT:GQ 100,31,0:1/1:99 +chr2b 97066826 . G A 20.1 . DP=9;AF1=0.5001;CI95=0.5,0.5;DP4=0,6,0,2;MQ=31;PV4=1,1,1,1 PL:GT:GQ 50,0,35:0/1:38 +chr2b 97670822 . G A 4.85 . DP=6;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=18 PL:GT:GQ 36,18,0:1/1:90 +chr2b 102773175 . A G 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 49,9,0:1/1:63 +chr2b 109805532 . T C 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=45 PL:GT:GQ 176,24,0:1/1:96 +chr2b 110841448 . A G 11.1 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 42,6,0:1/1:49 +chr2b 123217025 . T C 31.5 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=37 PL:GT:GQ 64,12,0:1/1:72 +chr2b 123263214 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 43,9,0:1/1:63 +chr2b 127747292 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=52 PL:GT:GQ 100,9,0:1/1:63 +chr2b 130121958 . A G 89.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 122,15,0:1/1:75 +chr2b 130253633 . A G 14.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 130692761 . C T 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=51 PL:GT:GQ 82,18,0:1/1:90 +chr2b 130743365 . A G 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=42 PL:GT:GQ 140,15,0:1/1:75 +chr2b 131553874 . A C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=37 PL:GT:GQ 43,9,0:1/1:63 +chr2b 131716894 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=40 PL:GT:GQ 137,24,0:1/1:96 +chr2b 131716936 . G A 99 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=36 PL:GT:GQ 173,36,0:1/1:99 +chr2b 131716952 . A G 99 . DP=22;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,14;MQ=36;PV4=1,1,1,1 PL:GT:GQ 152,0,43:0/1:46 +chr2b 133360184 . C T 99 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,20;MQ=32 PL:GT:GQ 163,60,0:1/1:99 +chr2b 133644741 . T A 16.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=27 PL:GT:GQ 49,15,0:1/1:75 +chr2b 133720595 . T C 41 . DP=15;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=29 PL:GT:GQ 74,36,0:1/1:99 +chr2b 133727192 . C T 19.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 52,15,0:1/1:75 +chr2b 133727260 . G A 3.56 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=18 PL:GT:GQ 34,24,0:1/1:95 +chr2b 133800294 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=23 PL:GT:GQ 40,6,0:1/1:49 +chr2b 134582754 . A C 56.1 . DP=37;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=36 PL:GT:GQ 89,21,0:1/1:84 +chr2b 134582763 . G C 78 . DP=37;AF1=1;CI95=1,1;DP4=0,0,0,36;MQ=34 PL:GT:GQ 111,108,0:1/1:99 +chr2b 134809668 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr3 527814 . C G 46 . DP=9;AF1=0.5;CI95=0.5,0.5;DP4=6,0,3,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 76,0,106:0/1:79 +chr3 559510 . G A 38 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=10,0,17,0;MQ=28;PV4=1,1,0.014,1 PL:GT:GQ 68,0,111:0/1:71 +chr3 879433 . T G 32 . DP=4;AF1=0.5001;CI95=0.5,0.5;DP4=2,0,2,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 62,0,34:0/1:37 +chr3 1809645 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr3 3235812 . C T 7.59 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 38,6,0:1/1:49 +chr3 3250176 . A G 83 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=32 PL:GT:GQ 116,24,0:1/1:96 +chr3 5049073 . T A 99 . DP=25;AF1=0.5;CI95=0.5,0.5;DP4=16,0,9,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 136,0,129:0/1:99 +chr3 5142874 . G A 99 . DP=38;AF1=1;CI95=1,1;DP4=0,0,38,0;MQ=28 PL:GT:GQ 179,114,0:1/1:99 +chr3 5554864 . T C 3.54 . DP=7;AF1=0.4999;CI95=0.5,0.5;DP4=0,4,0,3;MQ=27;PV4=1,1,1,1 PL:GT:GQ 31,0,35:0/1:33 +chr3 5749648 . G A 21.2 . DP=26;AF1=0.7303;CI95=0.5,1;DP4=0,7,0,7;MQ=26;PV4=1,0.16,1,0.17 PL:GT:GQ 50,0,2:0/1:3 +chr3 16451708 . A T 71.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=38 PL:GT:GQ 104,15,0:1/1:75 +chr3 23410276 . G A 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 140,15,0:1/1:75 +chr3 51368824 . A G 28 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 60,9,0:1/1:63 +chr3 53000453 . A G 54 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=19 PL:GT:GQ 87,30,0:1/1:99 +chr3 53000463 . A G 54 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=19 PL:GT:GQ 87,30,0:1/1:99 +chr3 59077423 . C T 77.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=33 PL:GT:GQ 110,15,0:1/1:75 +chr3 60040501 . T C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 43,9,0:1/1:63 +chr3 64203481 . A G 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 66,12,0:1/1:72 +chr3 67947441 . C T 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr3 76372631 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 76,9,0:1/1:63 +chr3 80611316 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr3 81554381 . G T 17.6 . DP=24;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=26 PL:GT:GQ 50,12,0:1/1:72 +chr3 87614647 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr3 93900455 . A T 11.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=13 PL:GT:GQ 44,15,0:1/1:75 +chr3 96174457 . A G 4.11 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=24 PL:GT:GQ 34,9,0:1/1:63 +chr3 96215569 . A C 3.41 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr3 96587998 . A C 7.08 . DP=9;AF1=1;CI95=1,1;DP4=0,0,6,0;MQ=17 PL:GT:GQ 39,18,0:1/1:90 +chr3 99711220 . A C 12.8 . DP=11;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 42,2,0:1/1:37 +chr3 99789741 . C G 99 . DP=18;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=47 PL:GT:GQ 210,51,0:1/1:99 +chr3 103667651 . A C 3.98 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 33,6,0:1/1:49 +chr3 104604896 . G C 55 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 87,9,0:1/1:63 +chr3 104997217 . G A 33.1 . DP=18;AF1=1;CI95=1,1;DP4=1,0,16,0;MQ=34;PV4=1,3e-10,0.17,0.36 PL:GT:GQ 66,19,0:1/1:76 +chr3 106097816 . A G 28 . DP=15;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=26 PL:GT:GQ 61,45,0:1/1:99 +chr3 106822259 . G C 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=50 PL:GT:GQ 140,15,0:1/1:75 +chr3 109946413 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 44,6,0:1/1:49 +chr3 121238963 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr3 126248567 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 45,6,0:1/1:49 +chr3 129733836 . A G 6.2 . DP=4;AF1=0.5003;CI95=0.5,0.5;DP4=1,0,3,0;MQ=43;PV4=1,0.02,0.31,1 PL:GT:GQ 35,0,28:0/1:30 +chr3 131372785 . C T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=34 PL:GT:GQ 76,9,0:1/1:63 +chr3 132290987 . C T 22 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=45 PL:GT:GQ 54,9,0:1/1:63 +chr3 136054421 . C T 73 . DP=82;AF1=1;CI95=1,1;DP4=0,0,78,0;MQ=28 PL:GT:GQ 106,235,0:1/1:99 +chr3 141075246 . G A 30.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=41 PL:GT:GQ 62,6,0:1/1:49 +chr3 141075262 . T G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=41 PL:GT:GQ 73,6,0:1/1:49 +chr3 141430649 . G T 81.8 . DP=6;AF1=1;CI95=0.5,1;DP4=0,1,0,4;MQ=41;PV4=1,0.34,1,0.25 PL:GT:GQ 113,6,0:1/1:49 +chr3 143617747 . G T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 54,9,0:1/1:63 +chr3 163576128 . C T 5.6 . DP=4;AF1=0.7302;CI95=0.5,1;DP4=2,0,2,0;MQ=23;PV4=1,1,1,1 PL:GT:GQ 33,0,2:0/1:3 +chr3 163839828 . A G 4.45 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=26 PL:GT:GQ 35,12,0:1/1:72 +chr3 175839340 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr3 190193258 . G T 3.98 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 33,6,0:1/1:49 +chr3 190777007 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr3 190970350 . A G 61 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=37 PL:GT:GQ 94,30,0:1/1:99 +chr3 198686408 . G A 36.6 . DP=17;AF1=1;CI95=0.5,1;DP4=0,1,0,16;MQ=25;PV4=1,1,0.026,1 PL:GT:GQ 69,11,0:1/1:66 +chr3 199277478 . T C 3.61 . DP=6;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=21 PL:GT:GQ 34,18,0:1/1:90 +chr3 199780181 . G T 77 . DP=45;AF1=0.5;CI95=0.5,0.5;DP4=0,35,0,10;MQ=33;PV4=1,1,1,1 PL:GT:GQ 107,0,114:0/1:99 +chr3 199889335 . A C 9.54 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=18 PL:GT:GQ 42,24,0:1/1:96 +chr3 200018161 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr4 195475 . A G 13 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 44,6,0:1/1:49 +chr4 639141 . C A 14.9 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr4 639152 . C T 15.2 . DP=17;AF1=0.5016;CI95=0.5,0.5;DP4=0,2,0,2;MQ=33;PV4=1,1,1,1 PL:GT:GQ 45,0,22:0/1:25 +chr4 986497 . G T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=33 PL:GT:GQ 163,30,0:1/1:99 +chr4 986516 . C T 55.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=37 PL:GT:GQ 88,21,0:1/1:84 +chr4 1207485 . A C 14.9 . DP=22;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 46,6,0:1/1:49 +chr4 1323502 . G A 13.2 . DP=13;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=22 PL:GT:GQ 46,33,0:1/1:99 +chr4 1613521 . G A 89 . DP=16;AF1=1;CI95=1,1;DP4=0,0,16,0;MQ=32 PL:GT:GQ 122,48,0:1/1:99 +chr4 1748790 . C T 38 . DP=21;AF1=0.5005;CI95=0.5,0.5;DP4=6,0,8,0;MQ=40;PV4=1,0.09,1,1 PL:GT:GQ 68,0,27:0/1:30 +chr4 2255732 . T C 99 . DP=29;AF1=1;CI95=1,1;DP4=0,0,28,0;MQ=31 PL:GT:GQ 186,84,0:1/1:99 +chr4 3010159 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr4 3545023 . A G 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=38 PL:GT:GQ 145,27,0:1/1:99 +chr4 3586344 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr4 3879337 . A G 16.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 49,12,0:1/1:72 +chr4 3940733 . A G 47.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 80,15,0:1/1:75 +chr4 4410338 . T C 13.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=31 PL:GT:GQ 46,15,0:1/1:75 +chr4 4796408 . T C 41 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=17 PL:GT:GQ 74,48,0:1/1:99 +chr4 4796414 . A G 11.3 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=17 PL:GT:GQ 44,45,0:1/1:99 +chr4 6436959 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr4 9494256 . T C 3.41 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=37 PL:GT:GQ 32,6,0:1/1:49 +chr4 24881479 . G A 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 46,9,0:1/1:63 +chr4 26128644 . A G 23 . DP=18;AF1=0.5006;CI95=0.5,0.5;DP4=8,0,10,0;MQ=22;PV4=1,1,1,1 PL:GT:GQ 53,0,26:0/1:29 +chr4 42109100 . G A 17.1 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 49,9,0:1/1:63 +chr4 42309652 . C T 68 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr4 46913966 . C T 9.08 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=16 PL:GT:GQ 41,12,0:1/1:72 +chr4 50335142 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr4 51658550 . C A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr4 58258023 . T C 26 . DP=5;AF1=0.5002;CI95=0.5,0.5;DP4=0,3,0,2;MQ=34;PV4=1,1,1,0.05 PL:GT:GQ 56,0,32:0/1:35 +chr4 59219112 . C A 42.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=50 PL:GT:GQ 75,12,0:1/1:72 +chr4 62746067 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr4 67404338 . G T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=39 PL:GT:GQ 66,12,0:1/1:72 +chr4 73353380 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr4 73946294 . G C 4.77 . DP=51;AF1=0.4999;CI95=0.5,0.5;DP4=0,5,0,3;MQ=40;PV4=1,0.19,0.37,0.11 PL:GT:GQ 33,0,64:0/1:36 +chr4 79607484 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr4 82337365 . G C 90 . DP=54;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=28 PL:GT:GQ 123,48,0:1/1:99 +chr4 82653801 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 34,9,0:1/1:63 +chr4 87130164 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 43,9,0:1/1:63 +chr4 87130176 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 43,9,0:1/1:63 +chr4 91459729 . C A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr4 96130778 . G C 99 . DP=19;AF1=1;CI95=1,1;DP4=0,0,0,19;MQ=45 PL:GT:GQ 211,57,0:1/1:99 +chr4 100709417 . A G 45.1 . DP=16;AF1=0.505;CI95=0.5,0.5;DP4=12,0,4,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 75,0,17:0/1:20 +chr4 107276770 . C T 70 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,6;MQ=31;PV4=1,1,1,1 PL:GT:GQ 100,0,97:0/1:98 +chr4 115327550 . G C 42 . DP=67;AF1=1;CI95=1,1;DP4=0,1,0,66;MQ=35;PV4=1,3.2e-24,0.13,1 PL:GT:GQ 75,162,0:1/1:99 +chr4 136558502 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr4 159572459 . G A 15.1 . DP=126;AF1=0.5;CI95=0.5,0.5;DP4=0,69,0,57;MQ=39;PV4=1,4.1e-96,0.077,1 PL:GT:GQ 45,0,175:0/1:48 +chr4 174968484 . G C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 40,6,0:1/1:49 +chr4 175030633 . T C 14.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=29 PL:GT:GQ 47,18,0:1/1:90 +chr4 183410027 . G T 6.2 . DP=31;AF1=0.5003;CI95=0.5,0.5;DP4=2,0,2,0;MQ=45;PV4=1,0.035,1,0.21 PL:GT:GQ 35,0,28:0/1:30 +chr4 190907368 . T C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=50 PL:GT:GQ 66,12,0:1/1:72 +chr4 192175690 . A G 76.8 . DP=7;AF1=0.95;CI95=0.5,1;DP4=0,3,0,4;MQ=35;PV4=1,1,1,1 PL:GT:GQ 105,0,0:1/1:10 +chr4 192673268 . G A 14.2 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=22 PL:GT:GQ 47,27,0:1/1:99 +chr4 192943966 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr4 195460104 . C G 23.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=19 PL:GT:GQ 56,24,0:1/1:96 +chr4 198277830 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr5 170098 . A G 13 . DP=12;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 44,6,0:1/1:49 +chr5 395814 . T C 4.77 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,2;MQ=36;PV4=1,1,0.48,1 PL:GT:GQ 33,0,33:0/1:33 +chr5 414024 . T A 10.4 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=20 PL:GT:GQ 42,9,0:1/1:63 +chr5 496767 . T C 13.9 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr5 805676 . C G 45 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=32 PL:GT:GQ 78,51,0:1/1:99 +chr5 1252896 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr5 1418370 . G A 3.65 . DP=8;AF1=0.7301;CI95=0.5,1;DP4=4,0,4,0;MQ=13;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr5 1494911 . G C 62 . DP=9;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=46 PL:GT:GQ 95,24,0:1/1:96 +chr5 1494932 . C T 6.98 . DP=8;AF1=0.5001;CI95=0.5,0.5;DP4=1,0,2,0;MQ=46;PV4=1,0.1,0.077,1 PL:GT:GQ 36,0,31:0/1:33 +chr5 1506037 . T C 24.1 . DP=24;AF1=1;CI95=0.5,1;DP4=11,0,13,0;MQ=16;PV4=1,1,1,1 PL:GT:GQ 55,5,0:1/1:46 +chr5 1509406 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 73,6,0:1/1:49 +chr5 1733649 . A G 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,25;MQ=47 PL:GT:GQ 212,75,0:1/1:99 +chr5 1747304 . A G 12.3 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=19 PL:GT:GQ 45,36,0:1/1:99 +chr5 1747308 . C A 44 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=19 PL:GT:GQ 77,36,0:1/1:99 +chr5 3519783 . C T 21.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=18 PL:GT:GQ 54,24,0:1/1:96 +chr5 4101593 . A G 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=43 PL:GT:GQ 102,12,0:1/1:72 +chr5 7204332 . T A 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=24 PL:GT:GQ 34,6,0:1/1:49 +chr5 11510398 . A C 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=51;PV4=1,1,0,1 PL:GT:GQ 64,0,31:0/1:34 +chr5 15406720 . T C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 36,6,0:1/1:49 +chr5 25152417 . C A 10.9 . DP=28;AF1=0.5718;CI95=0.5,1;DP4=0,2,0,6;MQ=25;PV4=1,1,0.21,1 PL:GT:GQ 40,0,6:0/1:8 +chr5 39072637 . A G 35.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=50 PL:GT:GQ 68,15,0:1/1:75 +chr5 46022699 . G A 44 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 76,9,0:1/1:63 +chr5 55664181 . C G 10.4 . DP=8;AF1=0.9999;CI95=0.5,1;DP4=3,0,5,0;MQ=18;PV4=1,1,1,1 PL:GT:GQ 40,3,0:1/1:41 +chr5 56253386 . T C 50.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=36 PL:GT:GQ 83,21,0:1/1:84 +chr5 56253447 . C T 42.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=45 PL:GT:GQ 75,12,0:1/1:72 +chr5 71950166 . G T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr5 72703090 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 40,6,0:1/1:49 +chr5 73570280 . G T 5.45 . DP=41;AF1=1;CI95=1,1;DP4=0,0,41,0;MQ=15 PL:GT:GQ 37,123,0:1/1:99 +chr5 73701762 . G T 40.8 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 72,6,0:1/1:49 +chr5 76956867 . T C 10.2 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 41,6,0:1/1:49 +chr5 79097961 . C G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 54,9,0:1/1:63 +chr5 87026167 . T C 22 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr5 97680525 . T C 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=23 PL:GT:GQ 33,12,0:1/1:72 +chr5 100674737 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr5 105389966 . T C 3.52 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=15 PL:GT:GQ 33,9,0:1/1:63 +chr5 109998341 . A C 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr5 120629105 . C T 6.79 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 37,6,0:1/1:49 +chr5 128383954 . C T 23 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=0,5,0,5;MQ=48;PV4=1,3.3e-07,1,1 PL:GT:GQ 53,0,98:0/1:56 +chr5 133925142 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr5 135375404 . T C 11.8 . DP=6;AF1=1;CI95=0.5,1;DP4=1,0,3,0;MQ=31;PV4=1,0.03,1,1 PL:GT:GQ 42,4,0:1/1:45 +chr5 136498281 . T G 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr5 136717285 . A G 82.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 115,12,0:1/1:72 +chr5 136910734 . G A 62 . DP=19;AF1=1;CI95=1,1;DP4=0,1,0,13;MQ=23;PV4=1,1,1,1 PL:GT:GQ 95,31,0:1/1:99 +chr5 141208149 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr5 148056348 . C A 37.1 . DP=4;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=38;PV4=1,1,1,1 PL:GT:GQ 66,1,0:1/1:23 +chr5 151941534 . G T 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=34 PL:GT:GQ 79,12,0:1/1:72 +chr5 159967229 . G C 22.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 55,12,0:1/1:72 +chr5 174024541 . T G 29.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 59,2,0:1/1:37 +chr5 175525290 . A G 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=20 PL:GT:GQ 33,12,0:1/1:72 +chr5 175988954 . A C 14.2 . DP=23;AF1=0.5;CI95=0.5,0.5;DP4=0,6,0,4;MQ=47;PV4=1,1,0.2,1 PL:GT:GQ 44,0,76:0/1:47 +chr5 176782226 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr5 179132834 . C G 99 . DP=28;AF1=1;CI95=1,1;DP4=0,0,0,28;MQ=41 PL:GT:GQ 207,84,0:1/1:99 +chr5 180155809 . G C 3.01 . DP=36;AF1=0.4997;CI95=0.5,0.5;DP4=25,0,9,0;MQ=35;PV4=1,1e-15,1,1 PL:GT:GQ 30,0,121:0/1:33 +chr5 181282819 . T G 38.3 . DP=11;AF1=1;CI95=0.5,1;DP4=0,2,0,9;MQ=23;PV4=1,1,1,1 PL:GT:GQ 71,14,0:1/1:70 +chr5 182426125 . G C 29 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=26 PL:GT:GQ 61,9,0:1/1:63 +chr5 182443682 . G A 3.69 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=21 PL:GT:GQ 34,15,0:1/1:75 +chr5 183008993 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr5 183312016 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr6_cox_hap1 519146 . G A 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=30 PL:GT:GQ 49,9,0:1/1:63 +chr6_cox_hap1 687497 . A G 33 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=2,0,4,0;MQ=35;PV4=1,0.0016,1,1 PL:GT:GQ 63,3,0:1/1:41 +chr6_qbl_hap2 120066 . T C 99 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 139,27,0:1/1:99 +chr6 277954 . C T 53 . DP=41;AF1=1;CI95=1,1;DP4=4,0,37,0;MQ=19;PV4=1,1,0.3,1 PL:GT:GQ 86,49,0:1/1:99 +chr6 593158 . A G 4.61 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 34,6,0:1/1:49 +chr6 2865562 . T G 25 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=23 PL:GT:GQ 58,27,0:1/1:99 +chr6 3751403 . G A 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=32 PL:GT:GQ 75,15,0:1/1:75 +chr6 3884989 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr6 4127278 . A T 13.9 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr6 5887783 . C G 99 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=34 PL:GT:GQ 142,21,0:1/1:84 +chr6 5887811 . C T 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=34 PL:GT:GQ 88,21,0:1/1:84 +chr6 6937170 . G C 99 . DP=47;AF1=1;CI95=1,1;DP4=0,0,0,47;MQ=28 PL:GT:GQ 157,141,0:1/1:99 +chr6 7262317 . C T 13.2 . DP=50;AF1=0.5;CI95=0.5,0.5;DP4=21,0,9,0;MQ=36;PV4=1,4e-05,0.17,0.26 PL:GT:GQ 43,0,158:0/1:46 +chr6 7533214 . A G 10.4 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 42,9,0:1/1:63 +chr6 20979907 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=38 PL:GT:GQ 76,9,0:1/1:63 +chr6 22321632 . A G 41 . DP=5;AF1=0.5004;CI95=0.5,0.5;DP4=1,0,3,0;MQ=46;PV4=1,0.24,0.19,0.33 PL:GT:GQ 71,0,28:0/1:31 +chr6 25352296 . G A 7.8 . DP=4;AF1=0.5003;CI95=0.5,0.5;DP4=0,1,0,3;MQ=38;PV4=1,1,0.16,1 PL:GT:GQ 37,0,28:0/1:30 +chr6 26298040 . T A 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=48;PV4=1,1,0.21,0.33 PL:GT:GQ 64,0,31:0/1:34 +chr6 33428755 . G A 70 . DP=14;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=32 PL:GT:GQ 103,27,0:1/1:99 +chr6 39512099 . G A 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=50 PL:GT:GQ 88,21,0:1/1:84 +chr6 39961094 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr6 40452120 . A G 40.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 72,6,0:1/1:49 +chr6 43204766 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=51 PL:GT:GQ 176,24,0:1/1:96 +chr6 52696512 . C T 70 . DP=76;AF1=0.5;CI95=0.5,0.5;DP4=0,34,0,42;MQ=18;PV4=1,0.11,1,1 PL:GT:GQ 100,0,51:0/1:54 +chr6 53785550 . A G 99 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=46 PL:GT:GQ 190,30,0:1/1:99 +chr6 53897484 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr6 57038290 . C T 10.2 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 41,6,0:1/1:49 +chr6 62925087 . G C 35 . DP=5;AF1=0.5008;CI95=0.5,0.5;DP4=1,0,4,0;MQ=36;PV4=1,1,0.2,1 PL:GT:GQ 65,0,25:0/1:28 +chr6 62925094 . T C 25.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=36 PL:GT:GQ 58,15,0:1/1:75 +chr6 70834405 . G A 72.1 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=29 PL:GT:GQ 105,21,0:1/1:84 +chr6 71026058 . C T 48.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=42 PL:GT:GQ 81,18,0:1/1:90 +chr6 74420752 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 76,9,0:1/1:63 +chr6 77498624 . T C 16.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 48,6,0:1/1:49 +chr6 80416836 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr6 113611590 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=46 PL:GT:GQ 100,9,0:1/1:63 +chr6 119308431 . T C 38.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=40 PL:GT:GQ 71,12,0:1/1:72 +chr6 151758592 . T C 3.07 . DP=17;AF1=0.9966;CI95=0.5,1;DP4=0,8,0,9;MQ=13;PV4=1,1,1,1 PL:GT:GQ 29,1,0:1/1:23 +chr6 151759358 . A G 99 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=12,0,15,0;MQ=44;PV4=1,1,1,0.19 PL:GT:GQ 171,0,128:0/1:99 +chr6 154741755 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr6 161061053 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=52 PL:GT:GQ 40,6,0:1/1:49 +chr6 161474189 . C T 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 36,6,0:1/1:49 +chr6 164304657 . C T 10.4 . DP=63;AF1=0.5;CI95=0.5,0.5;DP4=0,29,0,19;MQ=22;PV4=1,7.7e-11,1,0.049 PL:GT:GQ 40,0,37:0/1:38 +chr6 164703105 . T C 99 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=40 PL:GT:GQ 165,30,0:1/1:99 +chr6 167518328 . A G 78 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=27,0,14,0;MQ=33;PV4=1,0.026,0.43,0.056 PL:GT:GQ 108,0,149:0/1:99 +chr6 169906323 . G A 41.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr6 171893912 . G A 69.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=33 PL:GT:GQ 102,15,0:1/1:75 +chr6 173631604 . A G 6.98 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=4,0,3,0;MQ=37;PV4=1,0.069,1,1 PL:GT:GQ 36,0,34:0/1:35 +chr7 835856 . C T 27.5 . DP=13;AF1=0.9998;CI95=0.5,1;DP4=4,0,6,0;MQ=23;PV4=1,0.46,1,1 PL:GT:GQ 57,2,0:1/1:37 +chr7 1046005 . C T 11.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 43,9,0:1/1:63 +chr7 1564339 . C T 71 . DP=66;AF1=0.5;CI95=0.5,0.5;DP4=36,0,24,0;MQ=29;PV4=1,1,0.35,1 PL:GT:GQ 101,0,134:0/1:99 +chr7 1806266 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr7 1936013 . G T 7.77 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=17 PL:GT:GQ 39,9,0:1/1:63 +chr7 2319532 . C A 4.11 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=14 PL:GT:GQ 34,9,0:1/1:63 +chr7 2682121 . C T 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr7 3248116 . T C 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=37;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr7 3624766 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 40,6,0:1/1:49 +chr7 5291140 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr7 5314457 . C A 3.56 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=18 PL:GT:GQ 34,24,0:1/1:95 +chr7 5595072 . T A 79 . DP=13;AF1=0.5;CI95=0.5,0.5;DP4=8,0,5,0;MQ=31;PV4=1,1,1,1 PL:GT:GQ 109,0,57:0/1:60 +chr7 5646060 . G C 7.79 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=10 PL:GT:GQ 40,30,0:1/1:99 +chr7 6056816 . C G 7.08 . DP=6;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=23;PV4=1,1,1,1 PL:GT:GQ 35,1,0:1/1:23 +chr7 6412641 . C T 40 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=33 PL:GT:GQ 73,33,0:1/1:99 +chr7 6766874 . A G 34.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=43 PL:GT:GQ 67,15,0:1/1:75 +chr7 8482729 . C T 5.08 . DP=16;AF1=0.8276;CI95=0.5,1;DP4=3,0,3,0;MQ=22;PV4=1,1,1,0.19 PL:GT:GQ 32,0,1:1/1:5 +chr7 9238362 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr7 9687781 . G A 33 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=0,16,0,12;MQ=48;PV4=1,6.5e-38,1,1 PL:GT:GQ 63,0,170:0/1:66 +chr7 9752803 . A T 14.2 . DP=17;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=18 PL:GT:GQ 47,27,0:1/1:99 +chr7 10240910 . T C 45.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 78,12,0:1/1:72 +chr7 11046187 . C T 86.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=47 PL:GT:GQ 119,12,0:1/1:72 +chr7 11548207 . C G 14.6 . DP=13;AF1=1;CI95=0.5,1;DP4=6,1,0,5;MQ=18;PV4=0.015,1,1,1 PL:GT:GQ 46,7,0:1/1:57 +chr7 11580317 . C T 42 . DP=12;AF1=1;CI95=1,1;DP4=0,1,0,10;MQ=22;PV4=1,1,1,1 PL:GT:GQ 75,23,0:1/1:92 +chr7 11585384 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr7 13498356 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 73,6,0:1/1:49 +chr7 13500887 . G A 15.1 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=22 PL:GT:GQ 48,30,0:1/1:99 +chr7 13827079 . C T 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 36,6,0:1/1:49 +chr7 14403976 . T G 59 . DP=30;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=39 PL:GT:GQ 92,24,0:1/1:96 +chr7 14756588 . A G 44 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=5,0,10,0;MQ=44;PV4=1,5.3e-18,1,1 PL:GT:GQ 74,0,70:0/1:72 +chr7 14756619 . T G 44 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=5,0,10,0;MQ=44;PV4=1,6.4e-10,1,1 PL:GT:GQ 74,0,70:0/1:72 +chr7 36734598 . A C 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 42,6,0:1/1:49 +chr7 36734599 . A T 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 42,6,0:1/1:49 +chr7 36734603 . G C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 40,6,0:1/1:49 +chr7 40634921 . A C 55 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=39 PL:GT:GQ 88,39,0:1/1:99 +chr7 48271285 . A T 73 . DP=15;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=25 PL:GT:GQ 106,30,0:1/1:99 +chr7 56264700 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr7 62326003 . C A 26.1 . DP=35;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=28 PL:GT:GQ 59,18,0:1/1:90 +chr7 109468934 . T G 5.13 . DP=10;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=39;PV4=1,0.031,1,1 PL:GT:GQ 33,2,0:1/1:37 +chr7 110208327 . C G 16.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 48,6,0:1/1:49 +chr7 125654934 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=27 PL:GT:GQ 34,9,0:1/1:63 +chr7 125770209 . A C 32 . DP=31;AF1=0.5;CI95=0.5,0.5;DP4=11,0,13,0;MQ=34;PV4=1,0.00017,0.16,0.22 PL:GT:GQ 62,0,105:0/1:65 +chr7 125770265 . G C 36 . DP=16;AF1=0.5;CI95=0.5,0.5;DP4=0,5,0,5;MQ=48;PV4=1,0.0047,0.016,0.035 PL:GT:GQ 66,0,110:0/1:69 +chr7 126687042 . A G 21.1 . DP=36;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=22 PL:GT:GQ 54,21,0:1/1:84 +chr7 132292897 . G T 99 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=43 PL:GT:GQ 167,21,0:1/1:84 +chr7 132334562 . A C 23 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=23 PL:GT:GQ 56,30,0:1/1:99 +chr7 132431838 . C T 13.3 . DP=5;AF1=1;CI95=0.5,1;DP4=1,0,4,0;MQ=23;PV4=1,1,1,1 PL:GT:GQ 44,5,0:1/1:46 +chr7 136324945 . T C 13.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 46,12,0:1/1:72 +chr7 136957634 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr7 141746871 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 40,6,0:1/1:49 +chr7 146831870 . C T 4.77 . DP=14;AF1=0.5003;CI95=0.5,0.5;DP4=1,0,3,0;MQ=37;PV4=1,0.0029,0.28,1 PL:GT:GQ 33,0,28:0/1:30 +chr7 147142770 . T C 45 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=31 PL:GT:GQ 77,9,0:1/1:63 +chr7 147713906 . C T 4.77 . DP=8;AF1=0.5002;CI95=0.5,0.5;DP4=2,0,4,0;MQ=35;PV4=1,8.9e-06,0.48,0.27 PL:GT:GQ 33,0,29:0/1:31 +chr7 148742642 . G A 68 . DP=14;AF1=0.5032;CI95=0.5,0.5;DP4=4,0,10,0;MQ=28;PV4=1,1,1,1 PL:GT:GQ 98,0,19:0/1:22 +chr7 148879148 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr7 149484407 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr7 152444478 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 44,6,0:1/1:49 +chr7 154106613 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=51 PL:GT:GQ 100,9,0:1/1:63 +chr7 154776891 . G T 14.4 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 47,15,0:1/1:75 +chr7 155882061 . A C 29 . DP=24;AF1=0.502;CI95=0.5,0.5;DP4=0,1,0,4;MQ=46;PV4=1,0.018,0.15,0.29 PL:GT:GQ 59,0,21:0/1:24 +chr7 155956844 . G C 23 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,4;MQ=38;PV4=1,1,0.38,1 PL:GT:GQ 53,0,103:0/1:56 +chr7 156277694 . G A 62 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=46 PL:GT:GQ 95,24,0:1/1:96 +chr7 156720588 . T C 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr7 156807649 . T C 3.01 . DP=30;AF1=0.4997;CI95=0.5,0.5;DP4=0,4,0,3;MQ=43;PV4=1,0.16,0.15,1 PL:GT:GQ 30,0,72:0/1:33 +chr7 157331292 . G T 43.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=34 PL:GT:GQ 76,21,0:1/1:84 +chr7 157382957 . T C 33.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 66,12,0:1/1:72 +chr8 556382 . A G 37.1 . DP=5;AF1=0.9966;CI95=0.5,1;DP4=2,0,3,0;MQ=31;PV4=1,1,1,1 PL:GT:GQ 66,1,0:1/1:23 +chr8 1661673 . T C 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr8 7379751 . C A 6.24 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=19 PL:GT:GQ 38,21,0:1/1:84 +chr8 8160505 . A T 68.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 101,12,0:1/1:72 +chr8 8160508 . C T 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 57,12,0:1/1:72 +chr8 16781011 . A G 55.5 . DP=9;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=34 PL:GT:GQ 88,12,0:1/1:72 +chr8 18716499 . A T 20 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=0,4,0,2;MQ=29;PV4=1,1,1,1 PL:GT:GQ 50,0,52:0/1:51 +chr8 23326483 . A G 60 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=47 PL:GT:GQ 92,9,0:1/1:63 +chr8 25842819 . T A 12 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 43,6,0:1/1:49 +chr8 26300279 . T C 34 . DP=44;AF1=1;CI95=1,1;DP4=0,0,41,0;MQ=21 PL:GT:GQ 67,123,0:1/1:99 +chr8 29673470 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 73,6,0:1/1:49 +chr8 29673473 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 40,6,0:1/1:49 +chr8 31685466 . C T 34 . DP=17;AF1=0.5;CI95=0.5,0.5;DP4=10,0,5,0;MQ=28;PV4=1,0.072,1,0.36 PL:GT:GQ 64,0,50:0/1:53 +chr8 37378739 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr8 51325952 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr8 59221963 . G A 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr8 62764995 . T G 20 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=32 PL:GT:GQ 52,9,0:1/1:63 +chr8 63157426 . C G 41.6 . DP=22;AF1=1;CI95=0.5,1;DP4=0,7,0,15;MQ=19;PV4=1,1,1,0.25 PL:GT:GQ 74,11,0:1/1:66 +chr8 68710444 . G A 30 . DP=5;AF1=0.6671;CI95=0.5,1;DP4=3,0,2,0;MQ=32;PV4=1,1,1,1 PL:GT:GQ 59,0,3:0/1:5 +chr8 76416560 . G A 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=46 PL:GT:GQ 122,12,0:1/1:72 +chr8 81425275 . T G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr8 89842286 . G C 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=30 PL:GT:GQ 34,6,0:1/1:49 +chr8 100926281 . G A 38 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 70,9,0:1/1:63 +chr8 102746002 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr8 107850176 . C T 43.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=45 PL:GT:GQ 76,18,0:1/1:90 +chr8 109966441 . T C 27.3 . DP=9;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=38 PL:GT:GQ 60,15,0:1/1:75 +chr8 118811716 . G T 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=50 PL:GT:GQ 155,18,0:1/1:90 +chr8 119440254 . A T 58.5 . DP=5;AF1=0.8277;CI95=0.5,1;DP4=2,0,3,0;MQ=34;PV4=1,1,1,0.14 PL:GT:GQ 87,0,1:1/1:5 +chr8 121236024 . G A 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 71,6,0:1/1:49 +chr8 125489079 . C T 13 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr8 128502549 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr8 128502551 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr8 130951113 . G A 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=19 PL:GT:GQ 34,6,0:1/1:49 +chr8 135307123 . G A 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 36,6,0:1/1:49 +chr8 138814155 . C T 57.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 90,18,0:1/1:90 +chr8 140566111 . A G 18.1 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=15 PL:GT:GQ 51,36,0:1/1:99 +chr8 141586480 . T G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr8 143376712 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr8 150662729 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr8 150741294 . A G 25.1 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=34 PL:GT:GQ 58,18,0:1/1:90 +chr8 150975618 . A G 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr8 151580103 . T C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=20 PL:GT:GQ 36,6,0:1/1:49 +chr8 151634410 . G T 48 . DP=17;AF1=0.5;CI95=0.5,0.5;DP4=0,12,0,5;MQ=39;PV4=1,0.072,1,1 PL:GT:GQ 78,0,125:0/1:81 +chr8 151709267 . G A 91.1 . DP=8;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,7;MQ=40;PV4=1,1,0.28,0.37 PL:GT:GQ 121,0,16:0/1:19 +chr8 152636420 . G A 8.75 . DP=3;AF1=0.9966;CI95=0.5,1;DP4=0,1,0,2;MQ=30;PV4=1,1,1,1 PL:GT:GQ 37,1,0:1/1:23 +chr8 152706967 . G A 3.01 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=16 PL:GT:GQ 33,30,0:1/1:99 +chr8 152786522 . T C 80.1 . DP=16;AF1=0.5102;CI95=0.5,0.5;DP4=0,4,0,12;MQ=31;PV4=1,0.25,1,1 PL:GT:GQ 110,0,14:0/1:17 +chr8 152863132 . T G 5.44 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=30 PL:GT:GQ 36,9,0:1/1:63 +chr9 23235268 . C T 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 43,6,0:1/1:49 +chr9 26391176 . T C 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 47,6,0:1/1:49 +chr9 26868232 . C G 63 . DP=20;AF1=0.5025;CI95=0.5,0.5;DP4=7,0,13,0;MQ=22;PV4=1,0.2,1,0.44 PL:GT:GQ 93,0,20:0/1:23 +chr9 34223668 . C T 22 . DP=16;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,7;MQ=27;PV4=1,0.14,0.34,1 PL:GT:GQ 52,0,79:0/1:55 +chr9 39696645 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr9 40654130 . T G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr9 41145321 . T G 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 79,12,0:1/1:72 +chr9 42273483 . G A 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr9 55633192 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 58705807 . T C 70 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=24 PL:GT:GQ 103,30,0:1/1:99 +chr9 61697149 . C G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 63152790 . A C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr9 63703913 . C G 90.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=38 PL:GT:GQ 123,21,0:1/1:84 +chr9 65116068 . T C 70 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=49 PL:GT:GQ 103,39,0:1/1:99 +chr9 71266598 . C A 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 33,6,0:1/1:49 +chr9 73188677 . G T 52 . DP=294;AF1=1;CI95=1,1;DP4=44,0,245,0;MQ=33;PV4=1,0.28,0.0092,1 PL:GT:GQ 85,147,0:1/1:99 +chr9 78854179 . G T 22 . DP=97;AF1=0.5;CI95=0.5,0.5;DP4=21,0,12,0;MQ=44;PV4=1,0.02,0.032,0.0033 PL:GT:GQ 52,0,158:0/1:55 +chr9 82964679 . A C 13.2 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=36 PL:GT:GQ 45,9,0:1/1:63 +chr9 84124545 . G T 57 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=2,0,3,0;MQ=49;PV4=1,1,0.024,1 PL:GT:GQ 87,0,59:0/1:62 +chr9 86552862 . C T 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=26 PL:GT:GQ 47,15,0:1/1:75 +chr9 87548941 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr9 89021101 . G A 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr9 90447825 . G A 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 40,6,0:1/1:49 +chr9 92462035 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 40,6,0:1/1:49 +chr9 93077294 . T G 5.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=31 PL:GT:GQ 36,9,0:1/1:63 +chr9 93998137 . G A 68 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=46 PL:GT:GQ 100,9,0:1/1:63 +chr9 93998148 . C T 21.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=36 PL:GT:GQ 54,15,0:1/1:75 +chr9 95028964 . C A 99 . DP=83;AF1=0.5;CI95=0.5,0.5;DP4=0,57,0,26;MQ=32;PV4=1,9.3e-08,1,0.092 PL:GT:GQ 134,0,120:0/1:99 +chr9 103829155 . A G 33 . DP=96;AF1=1;CI95=1,1;DP4=0,0,96,0;MQ=16 PL:GT:GQ 66,255,0:1/1:99 +chr9 104981331 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 73,6,0:1/1:49 +chr9 111070656 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 117395657 . T C 16.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 49,15,0:1/1:75 +chr9 117718907 . A G 46.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=29 PL:GT:GQ 79,18,0:1/1:90 +chr9 119149161 . T C 3.14 . DP=65;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 33,15,0:1/1:75 +chr9 124528802 . G A 78 . DP=23;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=25 PL:GT:GQ 111,39,0:1/1:99 +chr9 126707903 . G A 26 . DP=37;AF1=0.5;CI95=0.5,0.5;DP4=0,21,0,8;MQ=46;PV4=1,2.6e-07,0.21,0.42 PL:GT:GQ 56,0,175:0/1:59 +chr9 128700686 . C G 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 66,12,0:1/1:72 +chr9 129084077 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr9 129116900 . A T 20 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 52,9,0:1/1:63 +chr9 130290720 . C G 21.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 53,6,0:1/1:49 +chr9 130306057 . C G 71 . DP=14;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=28 PL:GT:GQ 104,42,0:1/1:99 +chr9 130528990 . G A 99 . DP=31;AF1=1;CI95=1,1;DP4=0,0,31,0;MQ=27 PL:GT:GQ 174,93,0:1/1:99 +chr9 130529002 . A T 7.79 . DP=30;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=15 PL:GT:GQ 40,33,0:1/1:99 +chr9 130639996 . A G 8.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 39,6,0:1/1:49 +chr9 130704890 . A G 3.27 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=26 PL:GT:GQ 33,12,0:1/1:72 +chr9 130708345 . G A 13.3 . DP=11;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=38;PV4=1,0.096,1,1 PL:GT:GQ 42,1,0:1/1:23 +chr9 131001601 . T A 3.98 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 33,6,0:1/1:49 +chr9 131058539 . T A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 44,6,0:1/1:49 +chr9 131808965 . C T 42 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 75,27,0:1/1:99 +chr9 132551867 . C T 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 49,9,0:1/1:63 +chr9 132685120 . A G 4.75 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 35,9,0:1/1:63 +chr9 133175050 . A G 18.1 . DP=30;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=20 PL:GT:GQ 51,51,0:1/1:99 +chr9 133584978 . A G 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,25,0;MQ=45 PL:GT:GQ 212,75,0:1/1:99 +chr9 133661895 . A G 99 . DP=17;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=31 PL:GT:GQ 138,42,0:1/1:99 +chr9 133670376 . T C 68 . DP=19;AF1=1;CI95=1,1;DP4=0,1,0,16;MQ=39;PV4=1,1.4e-20,1,1 PL:GT:GQ 101,39,0:1/1:99 +chr9 133843777 . T C 99 . DP=9;AF1=0.5129;CI95=0.5,0.5;DP4=1,0,8,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 154,0,13:0/1:16 +chr9 134017265 . G C 3.27 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=13 PL:GT:GQ 33,12,0:1/1:72 +chr9 134105563 . T C 34.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=39 PL:GT:GQ 67,18,0:1/1:90 +chr9 134608906 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr9 134861929 . T A 9.49 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 41,9,0:1/1:63 +chr10 796662 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 54,9,0:1/1:63 +chr10 1216716 . T A 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr10 1220781 . G A 21 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=18 PL:GT:GQ 54,27,0:1/1:99 +chr10 1225208 . T C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=47 PL:GT:GQ 100,9,0:1/1:63 +chr10 1727946 . T C 14.2 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=27 PL:GT:GQ 47,21,0:1/1:84 +chr10 5986542 . T C 83 . DP=93;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=39 PL:GT:GQ 116,30,0:1/1:99 +chr10 6436277 . G A 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 36,6,0:1/1:49 +chr10 7704114 . C A 35 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=0,2,0,4;MQ=29;PV4=1,0.27,1,0.27 PL:GT:GQ 65,3,0:1/1:41 +chr10 10881734 . A G 9.52 . DP=9;AF1=0.5;CI95=0.5,0.5;DP4=4,0,5,0;MQ=42;PV4=1,0.0026,0.14,1 PL:GT:GQ 39,0,91:0/1:42 +chr10 13099383 . G A 27.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 60,12,0:1/1:72 +chr10 15764077 . G C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr10 18091502 . T C 47 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 79,9,0:1/1:63 +chr10 19645913 . A T 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 47,6,0:1/1:49 +chr10 22845062 . C T 18.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=18 PL:GT:GQ 51,21,0:1/1:84 +chr10 28282802 . T C 69 . DP=12;AF1=1;CI95=1,1;DP4=0,0,12,0;MQ=42 PL:GT:GQ 102,36,0:1/1:99 +chr10 28496872 . T G 8.44 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 39,6,0:1/1:49 +chr10 32746793 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr10 41437604 . T G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr10 43051239 . C T 6.98 . DP=3;AF1=0.5001;CI95=0.5,0.5;DP4=1,0,2,0;MQ=40;PV4=1,0.33,0.33,1 PL:GT:GQ 36,0,31:0/1:33 +chr10 44455192 . C T 4.41 . DP=6;AF1=0.8276;CI95=0.5,1;DP4=0,3,0,3;MQ=21;PV4=1,1,1,1 PL:GT:GQ 31,0,1:1/1:5 +chr10 48387336 . A G 13 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr10 51561705 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr10 51561712 . C G 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 71,6,0:1/1:49 +chr10 55617954 . G A 8.44 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 39,6,0:1/1:49 +chr10 55718281 . T A 3.41 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr10 55888771 . T C 23.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 56,12,0:1/1:72 +chr10 56025569 . C G 34.1 . DP=3;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,2;MQ=39;PV4=1,1,1,1 PL:GT:GQ 64,0,16:0/1:19 +chr10 57384943 . G T 84 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=16,0,13,0;MQ=26;PV4=1,0.015,1,1 PL:GT:GQ 114,0,110:0/1:99 +chr10 59873077 . T G 49 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=42 PL:GT:GQ 82,24,0:1/1:96 +chr10 61329572 . C T 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 47,6,0:1/1:49 +chr10 63790636 . T G 32.1 . DP=19;AF1=1;CI95=1,1;DP4=1,0,10,0;MQ=28;PV4=1,0.14,1,1 PL:GT:GQ 65,22,0:1/1:88 +chr10 64466048 . C G 18.2 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=28 PL:GT:GQ 51,18,0:1/1:90 +chr10 65053440 . G T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=39 PL:GT:GQ 153,30,0:1/1:99 +chr10 65407358 . C G 84.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 117,15,0:1/1:75 +chr10 65605291 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr10 66104447 . T C 99 . DP=47;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,21;MQ=34;PV4=1,1,0.15,1 PL:GT:GQ 136,0,162:0/1:99 +chr10 82160859 . G C 99 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=36 PL:GT:GQ 153,39,0:1/1:99 +chr10 82198579 . C T 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr10 87086290 . A G 4.13 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=17 PL:GT:GQ 35,27,0:1/1:99 +chr10 89550621 . T G 74 . DP=47;AF1=1;CI95=1,1;DP4=0,0,0,45;MQ=45 PL:GT:GQ 107,135,0:1/1:99 +chr10 92325046 . G A 42.3 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 75,15,0:1/1:75 +chr10 94488050 . A G 5.46 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=2,0,2,0;MQ=43;PV4=1,0.16,1,1 PL:GT:GQ 34,0,34:0/1:34 +chr10 95024815 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr10 95466306 . G A 53 . DP=7;AF1=0.6671;CI95=0.5,1;DP4=0,4,0,3;MQ=33;PV4=1,1,1,1 PL:GT:GQ 82,0,3:0/1:5 +chr10 100256777 . T G 3.83 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=23 PL:GT:GQ 34,12,0:1/1:72 +chr10 101510485 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr10 101530760 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr10 101879744 . T C 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=44 PL:GT:GQ 54,9,0:1/1:63 +chr10 102147276 . G C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=33 PL:GT:GQ 43,9,0:1/1:63 +chr10 102642248 . T G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr10 107666616 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr10 108319945 . C G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 43,9,0:1/1:63 +chr10 109734371 . G A 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr10 112870604 . C T 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=36 PL:GT:GQ 79,12,0:1/1:72 +chr10 115304673 . T C 11.3 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr10 119380588 . G A 14.2 . DP=4;AF1=0.502;CI95=0.5,0.5;DP4=1,0,3,0;MQ=43;PV4=1,0.18,0.32,1 PL:GT:GQ 44,0,21:0/1:24 +chr10 123063756 . C T 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=23 PL:GT:GQ 46,9,0:1/1:63 +chr10 128424770 . T G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 45,6,0:1/1:49 +chr10 131229204 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr10 132420570 . G C 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr10 132528066 . C T 99 . DP=19;AF1=1;CI95=1,1;DP4=0,0,19,0;MQ=42 PL:GT:GQ 213,57,0:1/1:99 +chr10 132644619 . G A 19.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=23 PL:GT:GQ 52,15,0:1/1:75 +chr10 132707581 . G C 9.11 . DP=51;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=25;PV4=1,1,1,1 PL:GT:GQ 38,2,0:1/1:37 +chr10 133026892 . T C 55.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=44 PL:GT:GQ 88,18,0:1/1:90 +chr11 768033 . T C 33.5 . DP=4;AF1=0.8277;CI95=0.5,1;DP4=0,2,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 62,0,1:1/1:5 +chr11 768042 . T C 33.5 . DP=6;AF1=0.8277;CI95=0.5,1;DP4=0,2,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 62,0,1:1/1:5 +chr11 874568 . G C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 66,12,0:1/1:72 +chr11 1009210 . T C 4 . DP=70;AF1=0.6241;CI95=0.5,1;DP4=0,3,0,8;MQ=24;PV4=1,1,0.5,1 PL:GT:GQ 31,0,4:0/1:6 +chr11 1016692 . C T 27 . DP=39;AF1=1;CI95=1,1;DP4=0,0,0,38;MQ=22 PL:GT:GQ 60,114,0:1/1:99 +chr11 1034477 . A G 66 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 98,9,0:1/1:63 +chr11 1074037 . G A 4.13 . DP=9;AF1=0.5001;CI95=0.5,0.5;DP4=4,0,5,0;MQ=24;PV4=1,1,0.43,1 PL:GT:GQ 32,0,30:0/1:31 +chr11 1556298 . G A 11.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 44,12,0:1/1:72 +chr11 1824777 . T C 27 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=28 PL:GT:GQ 60,30,0:1/1:99 +chr11 3395801 . C T 22 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr11 3411901 . G A 4.75 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 35,9,0:1/1:63 +chr11 3731606 . A C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr11 3783855 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr11 3967636 . A G 4.29 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=24 PL:GT:GQ 35,15,0:1/1:75 +chr11 4385618 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr11 4424365 . T A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr11 5295586 . C T 3.01 . DP=52;AF1=0.4997;CI95=0.5,0.5;DP4=33,0,10,0;MQ=29;PV4=1,0.0045,0.3,0.17 PL:GT:GQ 30,0,131:0/1:33 +chr11 6157144 . C G 45.1 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=35 PL:GT:GQ 78,21,0:1/1:84 +chr11 6352044 . C T 18 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=31 PL:GT:GQ 50,9,0:1/1:63 +chr11 6767356 . T C 9.63 . DP=3;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=29;PV4=1,1,1,1 PL:GT:GQ 38,1,0:1/1:23 +chr11 6999404 . G C 21 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=37 PL:GT:GQ 53,9,0:1/1:63 +chr11 9120930 . C G 17.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr11 9373125 . T C 19.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 51,6,0:1/1:49 +chr11 9585101 . C T 67 . DP=16;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=45 PL:GT:GQ 100,42,0:1/1:99 +chr11 10266192 . A C 14.3 . DP=22;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=27 PL:GT:GQ 47,18,0:1/1:90 +chr11 10303263 . T C 8.64 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,17;MQ=18 PL:GT:GQ 41,51,0:1/1:99 +chr11 10420170 . T C 35 . DP=17;AF1=1;CI95=1,1;DP4=0,1,0,15;MQ=28;PV4=1,0.12,1,0.4 PL:GT:GQ 68,36,0:1/1:99 +chr11 10912169 . G A 99 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=49 PL:GT:GQ 155,18,0:1/1:90 +chr11 11315826 . T G 6.29 . DP=27;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=19 PL:GT:GQ 38,18,0:1/1:90 +chr11 11603859 . A C 22 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,6;MQ=34;PV4=1,9.5e-13,0.22,1 PL:GT:GQ 52,0,115:0/1:55 +chr11 11700034 . C T 33 . DP=11;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=30 PL:GT:GQ 66,27,0:1/1:99 +chr11 11822758 . G A 15.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,3;MQ=38;PV4=1,0.18,1,1 PL:GT:GQ 45,0,88:0/1:48 +chr11 11976636 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=24 PL:GT:GQ 54,9,0:1/1:63 +chr11 14380517 . C G 16.1 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=5,0,5,0;MQ=48;PV4=1,2.1e-05,0.13,1 PL:GT:GQ 46,0,113:0/1:49 +chr11 14419212 . A G 91.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=38 PL:GT:GQ 124,18,0:1/1:90 +chr11 14846792 . A G 55 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=19 PL:GT:GQ 88,33,0:1/1:99 +chr11 15494556 . C T 99 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=22,0,14,0;MQ=34;PV4=1,0.0071,1,1 PL:GT:GQ 146,0,159:0/1:99 +chr11 16262879 . A C 16.1 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=0,1,0,3;MQ=43;PV4=1,0.061,0.24,0.33 PL:GT:GQ 46,0,28:0/1:31 +chr11 21514947 . T C 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=41 PL:GT:GQ 57,12,0:1/1:72 +chr11 22532576 . C G 28 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,17;MQ=17 PL:GT:GQ 61,51,0:1/1:99 +chr11 23529238 . G T 4.29 . DP=13;AF1=0.5334;CI95=0.5,1;DP4=1,0,3,0;MQ=37;PV4=1,1,0.34,0.21 PL:GT:GQ 32,0,9:0/1:12 +chr11 24249554 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr11 24853167 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr11 33353903 . T C 24.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=36 PL:GT:GQ 57,15,0:1/1:75 +chr11 35126569 . T C 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 57,12,0:1/1:72 +chr11 35132248 . C T 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr11 35155482 . T C 68 . DP=22;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=46 PL:GT:GQ 101,66,0:1/1:99 +chr11 52494088 . T C 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 140,27,0:1/1:99 +chr11 57899943 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr11 62261460 . G T 19.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,5;MQ=27;PV4=1,1.1e-06,1,1 PL:GT:GQ 49,0,58:0/1:51 +chr11 67456049 . C T 39.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=19 PL:GT:GQ 72,18,0:1/1:90 +chr11 68509708 . C G 3.65 . DP=9;AF1=0.7301;CI95=0.5,1;DP4=0,5,0,4;MQ=17;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr11 70115115 . T A 99 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=49 PL:GT:GQ 140,15,0:1/1:75 +chr11 72643951 . T C 70 . DP=23;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=39 PL:GT:GQ 103,66,0:1/1:99 +chr11 72647930 . G A 36 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=0,1,0,3;MQ=41;PV4=1,1,0.3,1 PL:GT:GQ 66,0,28:0/1:31 +chr11 73330148 . C T 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr11 81720893 . A G 5.83 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=19 PL:GT:GQ 37,12,0:1/1:72 +chr11 83813797 . A G 23.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 56,12,0:1/1:72 +chr11 85949488 . C A 54 . DP=17;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=37 PL:GT:GQ 87,42,0:1/1:99 +chr11 87634829 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr11 90913093 . A T 35.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 67,6,0:1/1:49 +chr11 93793348 . G A 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=31 PL:GT:GQ 139,24,0:1/1:96 +chr11 100802294 . T C 16.6 . DP=21;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 49,12,0:1/1:72 +chr11 107455449 . C T 8.44 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=26 PL:GT:GQ 39,6,0:1/1:49 +chr11 111344355 . A G 69.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=43 PL:GT:GQ 102,12,0:1/1:72 +chr11 111611115 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr11 113050466 . G C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 36,6,0:1/1:49 +chr11 114332544 . T C 3.54 . DP=17;AF1=0.4999;CI95=0.5,0.5;DP4=0,4,0,5;MQ=37;PV4=1,0.32,0.13,1 PL:GT:GQ 31,0,37:0/1:33 +chr11 114332549 . G A 3.54 . DP=17;AF1=0.4998;CI95=0.5,0.5;DP4=0,9,0,8;MQ=36;PV4=1,3.1e-10,0.088,1 PL:GT:GQ 31,0,127:0/1:34 +chr11 114843578 . G C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr11 115580279 . A G 99 . DP=15;AF1=1;CI95=1,1;DP4=0,0,15,0;MQ=48 PL:GT:GQ 190,45,0:1/1:99 +chr11 116434328 . G A 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr11 125914161 . A G 20.8 . DP=7;AF1=0.95;CI95=0.5,1;DP4=3,0,4,0;MQ=38;PV4=1,0.074,1,1 PL:GT:GQ 49,0,0:1/1:10 +chr11 125917089 . C T 12.3 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=0,28,0,12;MQ=44;PV4=1,4.7e-25,1,1 PL:GT:GQ 42,0,167:0/1:45 +chr11 127194100 . A G 60 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=49 PL:GT:GQ 93,24,0:1/1:96 +chr12 70856 . G A 27.5 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 60,12,0:1/1:72 +chr12 153693 . T C 52.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=38 PL:GT:GQ 85,15,0:1/1:75 +chr12 924547 . C G 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 69,6,0:1/1:49 +chr12 1555916 . G A 7.18 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 39,15,0:1/1:75 +chr12 1919860 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr12 2283756 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr12 2805983 . G C 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr12 6088203 . T C 72.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=37 PL:GT:GQ 105,15,0:1/1:75 +chr12 7099460 . G C 10.8 . DP=6;AF1=0.8277;CI95=0.5,1;DP4=3,0,3,0;MQ=26;PV4=1,0.027,1,1 PL:GT:GQ 39,0,1:1/1:5 +chr12 7099464 . G A 13.3 . DP=6;AF1=0.9966;CI95=0.5,1;DP4=2,0,3,0;MQ=28;PV4=1,0.16,1,1 PL:GT:GQ 42,1,0:1/1:23 +chr12 7198516 . T G 4.61 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 34,6,0:1/1:49 +chr12 23331895 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr12 28209020 . T G 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 47,15,0:1/1:75 +chr12 30074073 . C T 32.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 64,6,0:1/1:49 +chr12 30563452 . T C 25 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 57,9,0:1/1:63 +chr12 30563453 . A G 25 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 57,9,0:1/1:63 +chr12 30563464 . C A 78.8 . DP=8;AF1=1;CI95=0.5,1;DP4=0,2,0,5;MQ=34;PV4=1,0.29,1,1 PL:GT:GQ 110,6,0:1/1:49 +chr12 31505085 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr12 34041336 . G A 5.46 . DP=5;AF1=0.5;CI95=0.5,0.5;DP4=2,0,2,0;MQ=36;PV4=1,1,0.48,0.21 PL:GT:GQ 34,0,34:0/1:34 +chr12 49003648 . C G 42 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=39 PL:GT:GQ 75,24,0:1/1:96 +chr12 51280690 . G A 69 . DP=98;AF1=0.5;CI95=0.5,0.5;DP4=13,0,18,0;MQ=45;PV4=1,1,0.051,1 PL:GT:GQ 99,0,84:0/1:87 +chr12 69206633 . T C 17.1 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=17 PL:GT:GQ 50,33,0:1/1:99 +chr12 80417253 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr12 86633033 . C T 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=43;PV4=1,1,0.33,1 PL:GT:GQ 64,0,31:0/1:34 +chr12 98097274 . C T 47.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=31 PL:GT:GQ 80,15,0:1/1:75 +chr12 105269319 . C T 19 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=26 PL:GT:GQ 51,9,0:1/1:63 +chr12 109053425 . G A 9.53 . DP=8;AF1=0.5012;CI95=0.5,0.5;DP4=2,0,6,0;MQ=25;PV4=1,1,0.19,1 PL:GT:GQ 39,0,23:0/1:26 +chr12 111904540 . A G 3.41 . DP=65;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 32,6,0:1/1:49 +chr12 115038686 . T C 15.2 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=27 PL:GT:GQ 48,21,0:1/1:84 +chr12 115039419 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 34,9,0:1/1:63 +chr12 115103890 . G A 66 . DP=39;AF1=1;CI95=1,1;DP4=0,0,0,38;MQ=49 PL:GT:GQ 99,114,0:1/1:99 +chr12 115833830 . G A 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr12 116361873 . T G 6.34 . DP=5;AF1=0.7302;CI95=0.5,1;DP4=0,2,0,2;MQ=23;PV4=1,1,1,1 PL:GT:GQ 34,0,2:0/1:3 +chr12 123583527 . G A 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 46,9,0:1/1:63 +chr12 124115330 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 76,9,0:1/1:63 +chr12 125062296 . G A 41.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr12 126718106 . A G 8.76 . DP=50;AF1=0.5163;CI95=0.5,1;DP4=2,0,6,0;MQ=26;PV4=1,0.33,0.37,1 PL:GT:GQ 38,0,12:0/1:15 +chr12 133348311 . G A 24 . DP=18;AF1=0.5;CI95=0.5,0.5;DP4=14,0,3,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 54,0,118:0/1:57 +chr12 134494475 . C T 28 . DP=18;AF1=0.6671;CI95=0.5,1;DP4=8,0,10,0;MQ=18;PV4=1,1,1,1 PL:GT:GQ 57,0,3:0/1:5 +chr12 134831761 . C T 41.3 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=27 PL:GT:GQ 74,15,0:1/1:75 +chr12 134992770 . A C,T 84 . DP=47;AF1=1;CI95=1,1;DP4=0,0,26,0;MQ=29 PL:GT:GQ 117,72,114,0,44,114:1/1:99 +chr12 135261117 . G A 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 82,18,0:1/1:90 +chr12 135261144 . A G 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 155,18,0:1/1:90 +chr12 135460302 . G A 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,23,0;MQ=40 PL:GT:GQ 198,69,0:1/1:99 +chr12 135463758 . A G 83 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=26 PL:GT:GQ 116,48,0:1/1:99 +chr12 135523325 . G A 99 . DP=23;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=26 PL:GT:GQ 136,66,0:1/1:99 +chr12 135782401 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr12 135795472 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr13 18040027 . G C 42 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=33 PL:GT:GQ 74,9,0:1/1:63 +chr13 19494625 . G T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr13 20121126 . A G 15.1 . DP=36;AF1=0.5;CI95=0.5,0.5;DP4=25,0,9,0;MQ=36;PV4=1,1,0.13,1 PL:GT:GQ 45,0,153:0/1:48 +chr13 21536703 . A G 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr13 23160035 . G T 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 33,6,0:1/1:49 +chr13 23476554 . C A 6.79 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=52 PL:GT:GQ 37,6,0:1/1:49 +chr13 26632967 . C G 32 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=34 PL:GT:GQ 65,27,0:1/1:99 +chr13 26790010 . T C 89.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=35 PL:GT:GQ 122,15,0:1/1:75 +chr13 36083571 . T C 43 . DP=84;AF1=1;CI95=1,1;DP4=1,0,37,0;MQ=16;PV4=1,1,1,0.3 PL:GT:GQ 76,99,0:1/1:99 +chr13 44432419 . C T 3.58 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=19 PL:GT:GQ 34,21,0:1/1:84 +chr13 46592359 . T C 16.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 48,6,0:1/1:49 +chr13 52764657 . A T 3.14 . DP=32;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 33,15,0:1/1:75 +chr13 53084193 . C T 9.11 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=29;PV4=1,1,1,1 PL:GT:GQ 38,2,0:1/1:37 +chr13 57763228 . C T 45 . DP=555;AF1=1;CI95=1,1;DP4=2,0,21,0;MQ=23;PV4=1,0.00021,1,0.3 PL:GT:GQ 78,45,0:1/1:99 +chr13 73857921 . G C 31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 63,9,0:1/1:63 +chr13 76718001 . G A 59 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=1,0,3,0;MQ=45;PV4=1,1,0.12,1 PL:GT:GQ 89,0,28:0/1:31 +chr13 100912695 . A T 23 . DP=22;AF1=0.5;CI95=0.5,0.5;DP4=0,16,0,6;MQ=31;PV4=1,0.029,1,0.35 PL:GT:GQ 53,0,103:0/1:56 +chr13 101332001 . G C 21 . DP=23;AF1=1;CI95=1,1;DP4=0,0,23,0;MQ=21 PL:GT:GQ 54,69,0:1/1:99 +chr13 102637334 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr13 102895627 . C T 63 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=48 PL:GT:GQ 96,27,0:1/1:99 +chr13 103830322 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr13 112842448 . G A 39 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=27 PL:GT:GQ 72,27,0:1/1:99 +chr13 113310291 . C T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 66,12,0:1/1:72 +chr13 114775162 . A G 80 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=21 PL:GT:GQ 113,51,0:1/1:99 +chr13 115267482 . A G 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr13 116068676 . C T 3.83 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=27 PL:GT:GQ 34,12,0:1/1:72 +chr13 116455918 . A G 33 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=13,0,15,0;MQ=42;PV4=1,1.8e-20,0.3,1 PL:GT:GQ 63,0,146:0/1:66 +chr13 116765012 . G A 30.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 62,6,0:1/1:49 +chr13 116779773 . C T 17.1 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=27,0,11,0;MQ=24;PV4=1,4.5e-35,1,1 PL:GT:GQ 47,0,106:0/1:50 +chr13 116779791 . C T 57 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=24,0,14,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 87,0,103:0/1:90 +chr14 20159250 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr14 23510676 . T C 52 . DP=22;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=32 PL:GT:GQ 85,66,0:1/1:99 +chr14 24735256 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr14 29525577 . G A 21 . DP=10;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=16 PL:GT:GQ 54,27,0:1/1:99 +chr14 36186389 . C T 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=20 PL:GT:GQ 37,6,0:1/1:49 +chr14 36186394 . A G 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=20 PL:GT:GQ 37,6,0:1/1:49 +chr14 37440609 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr14 40432807 . A G 18.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=23 PL:GT:GQ 51,12,0:1/1:72 +chr14 59466268 . T C 15.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=25 PL:GT:GQ 47,9,0:1/1:63 +chr14 61368162 . G T 7.18 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=17 PL:GT:GQ 39,15,0:1/1:75 +chr14 65152922 . G A 92 . DP=33;AF1=0.5;CI95=0.5,0.5;DP4=0,18,0,15;MQ=36;PV4=1,0.059,0.35,1 PL:GT:GQ 122,0,144:0/1:99 +chr14 69749148 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=25 PL:GT:GQ 40,6,0:1/1:49 +chr14 74877658 . C T 45 . DP=48;AF1=1;CI95=1,1;DP4=0,1,0,12;MQ=36;PV4=1,0.02,1,0.39 PL:GT:GQ 78,28,0:1/1:99 +chr14 75546678 . C T 19.2 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=17 PL:GT:GQ 52,18,0:1/1:90 +chr14 76439185 . T C 67.1 . DP=7;AF1=0.505;CI95=0.5,0.5;DP4=0,1,0,6;MQ=33;PV4=1,1,0.056,0.29 PL:GT:GQ 97,0,17:0/1:20 +chr14 77313295 . T A 99 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=48 PL:GT:GQ 191,30,0:1/1:99 +chr14 77673422 . G A 11.5 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=24 PL:GT:GQ 44,18,0:1/1:90 +chr14 78646125 . T C 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=40 PL:GT:GQ 153,24,0:1/1:96 +chr14 91702449 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr14 91769842 . G A 63 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=47 PL:GT:GQ 95,9,0:1/1:63 +chr14 91775899 . C G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr14 91775924 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr14 93482918 . A C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr14 93665819 . C T 75 . DP=7;AF1=0.5002;CI95=0.5,0.5;DP4=0,3,0,4;MQ=42;PV4=1,1,1,1 PL:GT:GQ 105,0,31:0/1:34 +chr14 95422276 . A G 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=45 PL:GT:GQ 88,21,0:1/1:84 +chr14 95731986 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr14 96045464 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr14 97172020 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=51 PL:GT:GQ 100,9,0:1/1:63 +chr14 100515480 . A G 6.98 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=45;PV4=1,0.14,0.085,0.33 PL:GT:GQ 36,0,30:0/1:32 +chr14 100770214 . A T 8.69 . DP=20;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=16 PL:GT:GQ 41,21,0:1/1:84 +chr14 101258303 . G A 82 . DP=15;AF1=1;CI95=1,1;DP4=0,0,15,0;MQ=26 PL:GT:GQ 115,45,0:1/1:99 +chr14 101701492 . C G 66 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=49 PL:GT:GQ 99,30,0:1/1:99 +chr14 102113772 . T C 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=30 PL:GT:GQ 33,6,0:1/1:49 +chr14 102751431 . A C 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr14 103708033 . A G 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=27 PL:GT:GQ 141,36,0:1/1:99 +chr14 104744582 . G A 3.52 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 33,9,0:1/1:63 +chr14 105989100 . C T 3.14 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 33,15,0:1/1:75 +chr14 105989162 . C T 3.65 . DP=12;AF1=0.7301;CI95=0.5,1;DP4=0,6,0,6;MQ=15;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr14 106234810 . G A 25.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=39 PL:GT:GQ 58,15,0:1/1:75 +chr14 106995572 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr14 107283057 . T C 5.5 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=20 PL:GT:GQ 37,21,0:1/1:84 +chr14 107285319 . T C 33 . DP=36;AF1=1;CI95=1,1;DP4=0,0,0,35;MQ=22 PL:GT:GQ 66,105,0:1/1:99 +chr14 107640449 . A G 11.8 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=36 PL:GT:GQ 44,12,0:1/1:72 +chr15 20082092 . T G 18.3 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=24 PL:GT:GQ 51,15,0:1/1:75 +chr15 22955884 . T C 67 . DP=12;AF1=1;CI95=1,1;DP4=0,0,12,0;MQ=48 PL:GT:GQ 100,36,0:1/1:99 +chr15 22971987 . A G 5.29 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=22 PL:GT:GQ 35,6,0:1/1:49 +chr15 23233324 . C A 47 . DP=16;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=31 PL:GT:GQ 80,42,0:1/1:99 +chr15 25175286 . C T 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=42;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr15 25385709 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr15 27372396 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr15 35998093 . C T 9.53 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=17 PL:GT:GQ 42,27,0:1/1:99 +chr15 36716538 . C G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr15 36793360 . G T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 76,9,0:1/1:63 +chr15 53783097 . A G 10.5 . DP=31;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=16 PL:GT:GQ 43,21,0:1/1:84 +chr15 54180175 . C T 10.4 . DP=7;AF1=0.5001;CI95=0.5,0.5;DP4=4,0,3,0;MQ=27;PV4=1,1.2e-05,1,1 PL:GT:GQ 40,0,32:0/1:34 +chr15 54939306 . C T 99 . DP=34;AF1=0.5;CI95=0.5,0.5;DP4=0,18,0,16;MQ=49;PV4=1,1,0.18,1 PL:GT:GQ 172,0,181:0/1:99 +chr15 59377916 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr15 59685961 . G C 68 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=36 PL:GT:GQ 101,33,0:1/1:99 +chr15 60306384 . A G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr15 60345642 . G C 14.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 46,6,0:1/1:49 +chr15 60367387 . G A 13.2 . DP=6;AF1=0.5001;CI95=0.5,0.5;DP4=3,0,3,0;MQ=34;PV4=1,0.098,0.24,1 PL:GT:GQ 43,0,35:0/1:37 +chr15 60367446 . C T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr15 61763755 . G A 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=45 PL:GT:GQ 100,9,0:1/1:63 +chr15 61831362 . C G 11.3 . DP=5;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,3;MQ=30;PV4=1,0.00077,0.47,1 PL:GT:GQ 41,0,42:0/1:41 +chr15 63978880 . G C 60 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=2,0,4,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 90,3,0:1/1:41 +chr15 64342445 . A G 12.2 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=18 PL:GT:GQ 44,9,0:1/1:63 +chr15 65424859 . T C 11.3 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=21 PL:GT:GQ 44,30,0:1/1:99 +chr15 65603698 . C T 60 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 92,9,0:1/1:63 +chr15 67005078 . G A 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr15 71133512 . G C 22.3 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=25 PL:GT:GQ 55,15,0:1/1:75 +chr15 72619009 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr15 73272688 . C T 70.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=39 PL:GT:GQ 103,15,0:1/1:75 +chr15 73699335 . T A 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=45 PL:GT:GQ 175,27,0:1/1:99 +chr15 74513352 . C T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=37 PL:GT:GQ 139,30,0:1/1:99 +chr15 75540536 . G A 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr15 75822537 . C A 17.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=23 PL:GT:GQ 50,15,0:1/1:75 +chr15 78554005 . T C 12 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 43,6,0:1/1:49 +chr15 80089369 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=28 PL:GT:GQ 40,6,0:1/1:49 +chr15 83089149 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 40,6,0:1/1:49 +chr15 86839307 . T C 90.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 123,15,0:1/1:75 +chr15 89836258 . T C 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=39 PL:GT:GQ 141,24,0:1/1:96 +chr15 89837706 . G A 4.13 . DP=8;AF1=0.4998;CI95=0.5,0.5;DP4=0,4,0,4;MQ=30;PV4=1,1,0.25,1 PL:GT:GQ 32,0,59:0/1:35 +chr15 89857648 . T C 99 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=8,0,8,0;MQ=40;PV4=1,1,0.3,1 PL:GT:GQ 133,0,130:0/1:99 +chr15 89864228 . A C 32 . DP=4;AF1=0.5002;CI95=0.5,0.5;DP4=2,0,2,0;MQ=42;PV4=1,1,1,1 PL:GT:GQ 62,0,31:0/1:34 +chr15 91261235 . G A 7.8 . DP=4;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=44;PV4=1,1,0.32,1 PL:GT:GQ 37,0,30:0/1:32 +chr16 256990 . A C 10.4 . DP=16;AF1=0.5008;CI95=0.5,0.5;DP4=4,0,3,0;MQ=23;PV4=1,0.34,1,1 PL:GT:GQ 40,0,25:0/1:28 +chr16 260794 . T C 3.01 . DP=19;AF1=0.4999;CI95=0.5,0.5;DP4=13,0,2,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 30,0,32:0/1:31 +chr16 419905 . A G 7.9 . DP=5;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=22;PV4=1,1,1,1 PL:GT:GQ 36,1,0:1/1:23 +chr16 824086 . T C 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr16 1085063 . C T 52 . DP=12;AF1=0.5;CI95=0.5,0.5;DP4=6,0,6,0;MQ=42;PV4=1,1,0.014,1 PL:GT:GQ 82,0,128:0/1:85 +chr16 1221305 . T C 54 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=0,3,0,3;MQ=40;PV4=1,1,1,1 PL:GT:GQ 84,0,60:0/1:63 +chr16 1411728 . A G 32.3 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=35 PL:GT:GQ 65,15,0:1/1:75 +chr16 1443197 . C G 64 . DP=26;AF1=1;CI95=1,1;DP4=0,0,25,0;MQ=36 PL:GT:GQ 97,75,0:1/1:99 +chr16 1478746 . A T 32 . DP=20;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=28 PL:GT:GQ 65,24,0:1/1:96 +chr16 1514438 . A C 45 . DP=49;AF1=1;CI95=1,1;DP4=0,0,48,0;MQ=26 PL:GT:GQ 78,144,0:1/1:99 +chr16 1601989 . T C 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=29 PL:GT:GQ 133,39,0:1/1:99 +chr16 2043883 . C T 30 . DP=33;AF1=1;CI95=1,1;DP4=0,0,0,33;MQ=14 PL:GT:GQ 63,99,0:1/1:99 +chr16 2137470 . A C 39 . DP=38;AF1=0.5016;CI95=0.5,0.5;DP4=4,0,6,0;MQ=34;PV4=1,0.02,1,1 PL:GT:GQ 69,0,22:0/1:25 +chr16 2537260 . A G 99 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=40 PL:GT:GQ 177,33,0:1/1:99 +chr16 2564737 . T C 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,22;MQ=41 PL:GT:GQ 199,66,0:1/1:99 +chr16 2612605 . A T 62.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=28 PL:GT:GQ 95,15,0:1/1:75 +chr16 2704518 . G A 41 . DP=48;AF1=0.5;CI95=0.5,0.5;DP4=0,17,0,12;MQ=48;PV4=1,1.9e-23,0.24,0.034 PL:GT:GQ 71,0,175:0/1:74 +chr16 3274307 . G T 68 . DP=39;AF1=0.5;CI95=0.5,0.5;DP4=0,30,0,8;MQ=37;PV4=1,1,1,1 PL:GT:GQ 98,0,138:0/1:99 +chr16 5467292 . G C 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 69,6,0:1/1:49 +chr16 10079145 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr16 11483702 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr16 12038227 . A T 23 . DP=47;AF1=0.5;CI95=0.5,0.5;DP4=0,22,0,23;MQ=32;PV4=1,4.4e-66,0.47,0.028 PL:GT:GQ 53,0,135:0/1:56 +chr16 21336880 . G C 55 . DP=35;AF1=0.5;CI95=0.5,0.5;DP4=0,12,0,19;MQ=47;PV4=1,5.6e-21,1,1 PL:GT:GQ 85,0,121:0/1:88 +chr16 21980241 . C T 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr16 23275383 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 44,6,0:1/1:49 +chr16 27546495 . G T 25 . DP=35;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=43 PL:GT:GQ 57,9,0:1/1:63 +chr16 27700399 . A T 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=17 PL:GT:GQ 50,12,0:1/1:72 +chr16 28021935 . A G 18.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 51,15,0:1/1:75 +chr16 29070016 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr16 29478618 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr16 29718140 . C T 46.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 79,15,0:1/1:75 +chr16 30700759 . T C 17.1 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,14;MQ=14 PL:GT:GQ 50,42,0:1/1:99 +chr16 35139103 . A G 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=37 PL:GT:GQ 79,12,0:1/1:72 +chr16 35473348 . G A 3.83 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 34,12,0:1/1:72 +chr16 36213667 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr16 36705528 . G A 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=32 PL:GT:GQ 47,15,0:1/1:75 +chr16 43831353 . C T 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=42 PL:GT:GQ 102,12,0:1/1:72 +chr16 44715166 . A C 25 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=32 PL:GT:GQ 58,24,0:1/1:96 +chr16 44957661 . T C 7.03 . DP=23;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=18 PL:GT:GQ 39,21,0:1/1:84 +chr16 44958698 . C T 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=49 PL:GT:GQ 75,15,0:1/1:75 +chr16 44959163 . T C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 66,12,0:1/1:72 +chr16 45167959 . C T 4.45 . DP=16;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=24 PL:GT:GQ 35,12,0:1/1:72 +chr16 50254956 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr16 52383122 . A C 46.5 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=42 PL:GT:GQ 79,12,0:1/1:72 +chr16 55978159 . C T 10.7 . DP=20;AF1=0.5336;CI95=0.5,1;DP4=2,0,5,0;MQ=35;PV4=1,0.038,1,0.059 PL:GT:GQ 40,0,9:0/1:12 +chr16 61358878 . T A 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 47,6,0:1/1:49 +chr16 61392487 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 44,6,0:1/1:49 +chr16 61621603 . G T 6.59 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=22 PL:GT:GQ 38,12,0:1/1:72 +chr16 69120890 . G C 51.3 . DP=36;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=42 PL:GT:GQ 84,15,0:1/1:75 +chr16 70778219 . A G 21.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=39 PL:GT:GQ 53,6,0:1/1:49 +chr16 71899519 . T C 40 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=33 PL:GT:GQ 73,33,0:1/1:99 +chr16 72079251 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr16 72093003 . G C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr16 72672428 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr16 72864515 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr16 72890560 . G A 47.1 . DP=10;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,7;MQ=49;PV4=1,0.0019,0.0033,1 PL:GT:GQ 77,0,16:0/1:19 +chr16 73048929 . A G 6.29 . DP=4;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=27;PV4=1,1,1,0.33 PL:GT:GQ 34,1,0:1/1:23 +chr16 73177179 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr16 73191468 . C T 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=40 PL:GT:GQ 102,12,0:1/1:72 +chr16 73367439 . A C 7.41 . DP=36;AF1=1;CI95=0.5,1;DP4=0,2,0,13;MQ=26;PV4=1,1,0.027,1 PL:GT:GQ 37,4,0:1/1:45 +chr16 74259316 . C T 89.5 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr16 75271450 . C G 6.99 . DP=15;AF1=0.5015;CI95=0.5,0.5;DP4=0,1,0,3;MQ=44;PV4=1,0.065,0.31,1 PL:GT:GQ 36,0,22:0/1:25 +chr16 76199870 . G A 26 . DP=14;AF1=0.5;CI95=0.5,0.5;DP4=8,0,6,0;MQ=47;PV4=1,1.2e-06,0.32,1 PL:GT:GQ 56,0,141:0/1:59 +chr16 77723692 . A G 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 122,12,0:1/1:72 +chr17 165875 . G A 40.8 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 72,6,0:1/1:49 +chr17 1443809 . C G 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr17 1618253 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=39 PL:GT:GQ 54,9,0:1/1:63 +chr17 2815309 . T G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr17 3537486 . T G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr17 3734367 . C A 23.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=36 PL:GT:GQ 56,12,0:1/1:72 +chr17 5634764 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr17 6408090 . C G 3.54 . DP=5;AF1=0.4998;CI95=0.5,0.5;DP4=3,0,2,0;MQ=40;PV4=1,1,0.36,1 PL:GT:GQ 31,0,66:0/1:34 +chr17 7089723 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr17 8731503 . G C 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 42,6,0:1/1:49 +chr17 9282935 . T C,G 24.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=40 PL:GT:GQ 57,12,61,0,3,61:1/1:72 +chr17 17284831 . T C 29 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 61,9,0:1/1:63 +chr17 18439515 . G A 4.11 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=25 PL:GT:GQ 34,9,0:1/1:63 +chr17 18602146 . C T 4.76 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=16 PL:GT:GQ 36,33,0:1/1:99 +chr17 19427888 . C T 57 . DP=104;AF1=0.5;CI95=0.5,0.5;DP4=45,0,29,0;MQ=39;PV4=1,2.2e-12,1,1 PL:GT:GQ 87,0,131:0/1:90 +chr17 19604159 . T C 9.31 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr17 19610366 . C T 13 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr17 20484706 . C G 51 . DP=35;AF1=0.5001;CI95=0.5,0.5;DP4=0,11,0,21;MQ=21;PV4=1,0.39,0.49,1 PL:GT:GQ 81,0,36:0/1:39 +chr17 20555720 . A G 26.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=28 PL:GT:GQ 59,15,0:1/1:75 +chr17 24328984 . A C 15.4 . DP=34;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=25 PL:GT:GQ 48,15,0:1/1:75 +chr17 26237090 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr17 28394766 . C A 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr17 31218277 . A G 3.62 . DP=38;AF1=0.5161;CI95=0.5,0.5;DP4=0,1,0,2;MQ=38;PV4=1,0.26,1,1 PL:GT:GQ 31,0,12:0/1:15 +chr17 31254021 . C T 15.1 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=35 PL:GT:GQ 47,9,0:1/1:63 +chr17 32516798 . G A 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 69,6,0:1/1:49 +chr17 32600253 . A G 16.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 49,12,0:1/1:72 +chr17 34255214 . G C 19.2 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=21 PL:GT:GQ 52,18,0:1/1:90 +chr17 34365900 . T C 93.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=38 PL:GT:GQ 126,18,0:1/1:90 +chr17 35380386 . A T 6.79 . DP=44;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 37,6,0:1/1:49 +chr17 41993344 . C T 64 . DP=41;AF1=1;CI95=1,1;DP4=0,0,0,41;MQ=16 PL:GT:GQ 97,123,0:1/1:99 +chr17 42128201 . A G 4.13 . DP=5;AF1=0.4998;CI95=0.5,0.5;DP4=0,2,0,2;MQ=52;PV4=1,0.0041,1,1 PL:GT:GQ 32,0,62:0/1:35 +chr17 42984490 . C A 56 . DP=33;AF1=0.5001;CI95=0.5,0.5;DP4=6,0,12,0;MQ=42;PV4=1,0.004,1,1 PL:GT:GQ 86,0,34:0/1:37 +chr17 43419457 . G A 99 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,14;MQ=45 PL:GT:GQ 185,42,0:1/1:99 +chr17 43421225 . A G 65.1 . DP=31;AF1=1;CI95=0.5,1;DP4=0,6,0,17;MQ=43;PV4=1,0.004,1,1 PL:GT:GQ 98,18,0:1/1:90 +chr17 45206897 . G A 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=47 PL:GT:GQ 54,9,0:1/1:63 +chr17 45381302 . T C 18.6 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr17 45530812 . C A 3.54 . DP=6;AF1=0.4998;CI95=0.5,0.5;DP4=0,3,0,2;MQ=40;PV4=1,1,0.37,1 PL:GT:GQ 31,0,58:0/1:34 +chr17 50242633 . G A 44 . DP=42;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,13;MQ=32;PV4=1,0.084,0.14,1 PL:GT:GQ 74,0,154:0/1:77 +chr17 51275317 . G A 14.9 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 46,6,0:1/1:49 +chr17 52325530 . C T 29 . DP=19;AF1=1;CI95=1,1;DP4=0,0,0,18;MQ=24 PL:GT:GQ 62,54,0:1/1:99 +chr17 52411748 . T G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr17 53190746 . C G 62.1 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=40 PL:GT:GQ 95,18,0:1/1:90 +chr17 58289916 . T C 18.2 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=22 PL:GT:GQ 51,18,0:1/1:90 +chr17 59796875 . C T 42 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=35 PL:GT:GQ 74,9,0:1/1:63 diff --git a/tests/tabix_data/vcf/13.vcf b/tests/tabix_data/vcf/13.vcf new file mode 100644 index 0000000..08b54e0 --- /dev/null +++ b/tests/tabix_data/vcf/13.vcf @@ -0,0 +1,220 @@ +##fileformat=VCFv4.0 +##fileDate=2011-10-11 +##source=Platypus_Version_0.1.5 +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT WTCHG_27173_05.bam WTCHG_27173_04.bam +chr1 1451489 . T C 103 PASS ABPV=1.00e+00;FPV=7.56e-01;FR=0.2501;HP=7;MMLQ=30;NF=2;NR=18;PP=103;RMP=57.54;RPV=1.00e-00;SC=CCGGTGTGGGTGGGGAGGCCG;TC=42;TCF=7;TCR=35;TR=20;func=intronic;gene=ATAD3A;segdup=0.91;1000g=0.36;dbsnp=rs76717221 GT:GL:GQ:NR 0/0:-43.28,-51.0,-125.34:35:18 1/0:-135.58,-103.29,-138.87:100:24 +chr1 1451490 . G A 73 PASS ABPV=1.00e+00;FPV=9.29e-01;FR=0.2501;HP=3;MMLQ=30;NF=3;NR=16;PP=73;RMP=58.79;RPV=9.98e-01;SC=CGGTGTGGGTGGGGAGGCCGG;TC=42;TCF=7;TCR=35;TR=19;func=intronic;gene=ATAD3A;segdup=0.91;1000g=0.33;dbsnp=rs9439460 GT:GL:GQ:NR 0/0:-43.28,-50.99,-127.79:35:18 0/1:-135.58,-110.35,-146.87:100:24 +chr1 12939904 . A C 109 PASS ABPV=1.00e+00;FPV=7.66e-01;FR=0.2500;HP=1;MMLQ=37;NF=22;NR=1;PP=109;RMP=45.66;RPV=4.46e-06;SC=ATTGTGAGGAACTTTAACGAG;TC=132;TCF=79;TCR=53;TR=23 GT:GL:GQ:NR 0/0:-40.31,-50.48,-301.89:45:53 0/1:-121.0,-87.39,-396.61:100:79 +chr1 16902943 . T C 50 PASS ABPV=1.00e+00;FPV=2.90e-01;FR=0.2506;HP=2;MMLQ=34;NF=30;NR=18;PP=50;RMP=46.42;RPV=8.84e-01;SC=GGGTCAGCTCTCGTTCCTGAG;TC=191;TCF=133;TCR=58;TR=48 GT:GL:GQ:NR 0/0:-337.26,-342.92,-618.53:26:93 0/1:-428.71,-408.75,-668.15:84:98 +chr1 16902982 . G T 41 PASS ABPV=1.00e+00;FPV=5.26e-02;FR=0.2500;HP=1;MMLQ=36;NF=29;NR=10;PP=41;RMP=55.68;RPV=1.90e-02;SC=ATTGCCTAAGGTGAGACGGTA;TC=223;TCF=152;TCR=71;TR=39 GT:GL:GQ:NR 0/0:-282.16,-293.75,-760.18:52:108 0/1:-308.83,-290.99,-786.16:75:115 +chr1 16918180 . C T 200 PASS ABPV=1.00e+00;FPV=7.60e-05;FR=0.2500;HP=1;MMLQ=37;NF=8;NR=11;PP=200;RMP=57.84;RPV=6.15e-01;SC=TACTTTGGTACCTCTGTCTTC;TC=134;TCF=91;TCR=43;TR=19 GT:GL:GQ:NR 0/0:-48.3,-68.7,-289.28:90:47 0/1:-194.28,-132.13,-452.09:100:87 +chr1 17083652 . C T 200 PASS ABPV=3.06e-02;FPV=6.38e-13;FR=0.2500;HP=2;MMLQ=36;NF=29;NR=3;PP=200;RMP=38.16;RPV=2.05e-02;SC=AAATCTCAACCTTGAGTACAA;TC=350;TCF=317;TCR=33;TR=32;func=ncRNA;gene=MST1P9;cons46=632 Name=lod=492;segdup=0.99;1000g=0.37;dbsnp=rs113710576 GT:GL:GQ:NR 0/0:-547.14,-559.85,-1017.76:56:159 0/1:-723.35,-656.42,-1167.76:100:191 +chr1 17083776 . C A 79 PASS ABPV=1.08e-01;FPV=7.38e-01;FR=0.2500;HP=1;MMLQ=35;NF=1;NR=22;PP=79;RMP=76.99;RPV=1.13e-09;SC=CACAGAGACACGCGTGAAGAC;TC=238;TCF=4;TCR=234;TR=23;func=ncRNA;gene=MST1P9;cons46=632 Name=lod=492;segdup=0.99;1000g=0.20;dbsnp=rs56318124 GT:GL:GQ:NR 0/0:-442.45,-455.85,-790.66:59:121 0/1:-451.84,-425.21,-717.41:100:117 +chr1 17575714 . G A 59 PASS ABPV=2.52e-01;FPV=3.10e-02;FR=0.2500;HP=1;MMLQ=31;NF=1;NR=4;PP=59;RMP=43.35;RPV=1.94e-02;SC=GACCCTCGTGGACATTTATGG;TC=58;TCF=19;TCR=39;TR=5 GT:GL:GQ:NR 0/0:-14.49,-33.87,-234.95:85:32 0/1:-39.36,-17.32,-168.9:93:26 +chr1 21751228 . T TCGCGCCCGGC 66 PASS ABPV=3.86e-06;FPV=8.03e-37;FR=0.2500;HP=4;NF=1;NR=1;PP=66;RMP=15.56;RPV=1.98e-06;SC=CTCAAATGAGTAAAAGGCACT;TC=133;TCF=77;TCR=56;TR=2 GT:GL:GQ:NR 0/0:-178.34,-190.57,-398.5:54:72 0/1:-308.3,-271.14,-540.05:100:98 +chr1 21755539 . C A 27 PASS ABPV=1.00e+00;FPV=9.84e-01;FR=0.2503;HP=1;MMLQ=31;NF=2;NR=1;PP=27;RMP=65.83;RPV=4.98e-02;SC=GGCCAACAACCGCCAGGTGCG;TC=20;TCF=3;TCR=17;TR=3;func=intergenic;gene=ECE1(dist=83505) NBPF3(dist=11092);cons46=807 Name=lod=2532;segdup=0.99;1000g=0.80;dbsnp=rs3855556 GT:GL:GQ:NR 0/0:0.0,-6.22,-62.68:28:10 1/0:-21.51,-6.92,-52.98:61:10 +chr1 40798730 . A AT 59 PASS ABPV=1.00e+00;FPV=6.06e-01;FR=0.2504;HP=10;NF=7;NR=1;PP=59;RMP=50.29;RPV=7.38e-01;SC=GAAGTCTTCTATTTTTTTTTA;TC=28;TCF=24;TCR=4;TR=8;func=intergenic;gene=COL9A2(dist=15791) SMAP2(dist=40648);dbsnp=rs34372767 GT:GL:GQ:NR 0/0:0.0,-6.13,-39.37:28:12 0/1:-35.97,-10.49,-31.53:98:16 +chr1 142803580 . TA T 145 PASS ABPV=1.00e+00;FPV=6.35e-02;FR=0.2500;HP=6;NF=1;NR=11;PP=145;RMP=65.89;RPV=8.29e-02;SC=TTCATAGATTTAAAAAATTAT;TC=81;TCF=16;TCR=65;TR=12 GT:GL:GQ:NR 0/0:-39.18,-49.93,-242.54:48:33 1/0:-80.12,-35.74,-249.72:100:48 +chr1 144854799 . C T 50 PASS ABPV=1.00e+00;FPV=9.37e-01;FR=0.2504;HP=1;MMLQ=34;NF=1;NR=19;PP=50;RMP=60.89;RPV=9.86e-01;SC=GCCTCGGATACCTCCAGCTGA;TC=52;TCF=2;TCR=50;TR=20;func=intronic;gene=PDE4DIP;segdup=0.96;dbsnp=rs5004097 GT:GL:GQ:NR 0/0:-89.24,-95.22,-205.12:27:25 0/1:-177.25,-157.18,-246.67:85:27 +chr1 145116027 . T C 127 PASS ABPV=1.00e+00;FPV=1.00e+00;FR=0.2501;HP=2;MMLQ=34;NF=0;NR=7;PP=127;RMP=54.07;RPV=5.14e-01;SC=AAAAGAGATGTCCTGAAAATG;TC=30;TCF=0;TCR=30;TR=7;func=UTR3;gene=SEC22B;cons46=340 Name=lod=32;1000g=0.45;dbsnp=rs7550440 GT:GL:GQ:NR 0/0:0.0,-7.61,-92.94:34:11 0/1:-56.84,-19.14,-106.99:100:19 +chr1 146554532 . C T 57 PASS ABPV=1.00e+00;FPV=5.18e-01;FR=0.2501;HP=12;MMLQ=31;NF=4;NR=5;PP=57;RMP=66.19;RPV=4.68e-01;SC=CTTCTTCTTTCTTTTTTTTTA;TC=41;TCF=18;TCR=23;TR=9;func=intergenic;gene=LOC728989(dist=39933) PRKAB2(dist=72153);segdup=0.93;dbsnp=rs9662613 GT:GL:GQ:NR 0/0:-13.82,-21.42,-95.53:34:13 0/1:-131.76,-110.18,-223.87:91:28 +chr1 148344564 . T C 34 PASS ABPV=3.69e-01;FPV=1.16e-03;FR=0.2500;HP=2;MMLQ=36;NF=24;NR=1;PP=34;RMP=22.65;RPV=1.98e-06;SC=TTCGTTCTTATTTCTCCCCGC;TC=218;TCF=162;TCR=56;TR=25 GT:GL:GQ:NR 0/0:-210.1,-224.84,-651.44:65:104 0/1:-232.74,-216.41,-586.14:69:114 +chr1 148853862 . G T 37 PASS ABPV=3.79e-01;FPV=1.94e-02;FR=0.2500;HP=3;MMLQ=31;NF=6;NR=2;PP=37;RMP=50.34;RPV=2.58e-02;SC=CGCTCCTGGAGCCCAGCCCGG;TC=76;TCF=50;TCR=26;TR=8 GT:GL:GQ:NR 0/0:-247.75,-257.0,-317.61:41:35 1/0:-179.5,-162.62,-280.47:71:41 +chr1 148854004 . C T 32 PASS ABPV=1.83e-01;FPV=3.17e-02;FR=0.2500;HP=1;MMLQ=34;NF=0;NR=3;PP=32;RMP=93.74;RPV=2.52e-02;SC=GCCCGCACTGCTGCAGCGCCC;TC=44;TCF=12;TCR=32;TR=3 GT:GL:GQ:NR 0/0:-75.02,-87.66,-197.34:56:26 1/0:-55.07,-39.25,-94.0:66:18 +chr1 152187606 . G A 200 PASS ABPV=3.64e-01;FPV=4.08e-07;FR=0.2500;HP=2;MMLQ=32;NF=7;NR=16;PP=200;RMP=30.4;RPV=4.89e-02;SC=GAAGACTGACGGGAGCCAGAC;TC=202;TCF=109;TCR=93;TR=23;func=exonic;gene=HRNR;exon_func=nonsynonymous SNV;AAchange=NM_001009931:c.C6499T:p.R2167C;segdup=0.98;1000g=0.05;sift=0.2;pp2=0.269490;phylop=0.009549;mutT=0.062064;LRT=0.589002 GT:GL:GQ:NR 0/0:-190.82,-206.2,-650.62:68:98 0/1:-306.73,-239.37,-605.74:100:104 +chr1 152281007 . A G 38 PASS ABPV=1.00e+00;FPV=2.01e-01;FR=0.2500;HP=1;MMLQ=31;NF=37;NR=62;PP=38;RMP=56.83;RPV=9.75e-01;SC=GCCTGATCATAATGGGATCCT;TC=370;TCF=169;TCR=201;TR=99 GT:GL:GQ:NR 0/0:-830.31,-842.03,-1695.93:52:178 0/1:-1104.87,-1087.65,-1851.72:72:192 +chr1 152281008 . A G 56 PASS ABPV=1.00e+00;FPV=2.26e-01;FR=0.2500;HP=1;MMLQ=31;NF=37;NR=62;PP=56;RMP=57.69;RPV=9.75e-01;SC=CCTGATCATAATGGGATCCTT;TC=368;TCF=167;TCR=201;TR=99 GT:GL:GQ:NR 0/0:-836.29,-850.28,-1704.3:62:178 1/0:-1097.96,-1076.67,-1811.19:90:190 +chr1 152281466 . C T 200 PASS ABPV=1.00e+00;FPV=3.99e-04;FR=0.2500;HP=2;MMLQ=33;NF=26;NR=66;PP=200;RMP=66.62;RPV=7.23e-01;SC=TGCCCGTGACCGGCTCTGTCT;TC=430;TCF=180;TCR=250;TR=92 GT:GL:GQ:NR 0/0:-912.94,-966.99,-1954.85:100:223 1/0:-939.3,-872.22,-1720.42:100:207 +chr1 168549565 . T C 28 PASS ABPV=1.00e+00;FPV=1.00e+00;FR=0.2504;HP=2;MMLQ=37;NF=0;NR=8;PP=28;RMP=72.28;RPV=1.34e-01;SC=TCCTTATCAATCATGTCTTTC;TC=47;TCF=0;TCR=47;TR=8 GT:GL:GQ:NR 0/0:-27.57,-33.72,-167.32:28:21 1/0:-34.62,-19.62,-182.0:63:26 +chr1 236647542 . G T 46 PASS ABPV=1.00e+00;FPV=9.99e-01;FR=0.2500;HP=3;MMLQ=34;NF=16;NR=40;PP=46;RMP=62.31;RPV=1.00e-00;SC=GTGCAAGCTGGCCCAGGCCAA;TC=104;TCF=32;TCR=72;TR=56 GT:GL:GQ:NR 0/0:-318.17,-328.23,-521.3:45:54 1/0:-498.22,-479.17,-572.27:80:50 +chr1 236647562 . T C 73 PASS ABPV=1.00e+00;FPV=9.95e-01;FR=0.2503;HP=2;MMLQ=37;NF=11;NR=36;PP=73;RMP=64.25;RPV=1.00e-00;SC=ATGGTTGGTGTGTCATGGTGC;TC=85;TCF=23;TCR=62;TR=47 GT:GL:GQ:NR 0/0:-240.39,-246.81,-405.51:29:42 0/1:-421.95,-396.59,-483.66:100:43 +chr1 236700807 . T A 130 PASS ABPV=1.00e+00;FPV=5.12e-01;FR=0.2502;HP=2;MMLQ=33;NF=8;NR=7;PP=130;RMP=47.87;RPV=8.70e-01;SC=GTAATCCCGTTTGTTGGCACC;TC=55;TCF=34;TCR=21;TR=15;func=exonic;gene=LGALS8;exon_func=nonsynonymous SNV;AAchange=NM_201544:c.T56A:p.F19Y;cons46=463 Name=lod=102;1000g=0.62;dbsnp=rs2737713;pp2=0.0;phylop=0.983932;mutT=4.6E-5;LRT=0.999982 GT:GL:GQ:NR 0/0:-41.35,-48.14,-183.02:31:21 0/1:-204.57,-166.19,-295.14:100:34 +chr1 236700823 . T C 200 PASS ABPV=1.00e+00;FPV=6.24e-01;FR=0.2504;HP=2;MMLQ=32;NF=9;NR=8;PP=200;RMP=58.62;RPV=8.49e-01;SC=GCACCATTCCTGATCAGCTGG;TC=60;TCF=35;TCR=25;TR=17;func=exonic;gene=LGALS8;exon_func=synonymous SNV;AAchange=NM_201544:c.T72C:p.P24P;cons46=463 Name=lod=102;1000g=0.61;dbsnp=rs1041934 GT:GL:GQ:NR 0/0:-41.35,-47.43,-173.43:28:22 1/0:-232.08,-183.12,-325.41:100:38 +chr1 241663902 . TGA T 37 PASS ABPV=2.57e-03;FPV=3.07e-05;FR=0.2507;HP=2;NF=0;NR=3;PP=37;RMP=44.45;RPV=2.39e-06;SC=TTTGAGTGAGTGAGAGAGAGA;TC=90;TCF=18;TCR=72;TR=3;func=intronic;gene=FH GT:GL:GQ:NR 0/0:-115.58,-120.99,-206.17:25:29 1/0:-208.1,-188.38,-347.52:83:62 +chr10 52420020 . G A 135 PASS ABPV=1.00e+00;FPV=2.24e-01;FR=0.2502;HP=2;MMLQ=35;NF=3;NR=3;PP=135;RMP=58.04;RPV=7.75e-01;SC=GAGAACTTCCGGCTGCAGTAC;TC=30;TCF=20;TCR=10;TR=6 GT:GL:GQ:NR 0/0:-65.01,-71.52,-138.01:30:16 0/1:-83.86,-44.38,-74.93:100:14 +chr10 118380701 . G A 77 PASS ABPV=1.00e+00;FPV=5.15e-01;FR=0.2503;HP=3;MMLQ=32;NF=5;NR=0;PP=77;RMP=22.32;RPV=5.62e-01;SC=CCGGGTTGCGGGGCGTCTGTT;TC=24;TCF=22;TCR=2;TR=5 GT:GL:GQ:NR 0/0:-4.14,-10.38,-77.71:28:10 0/1:-51.41,-25.11,-83.53:100:14 +chr11 1651169 . T C 84 PASS ABPV=1.00e+00;FPV=9.98e-01;FR=0.2502;HP=2;MMLQ=33;NF=8;NR=26;PP=84;RMP=71.99;RPV=1.00e-00;SC=GCTGTGGCTCTGGCTGTGGGG;TC=71;TCF=14;TCR=57;TR=34;func=exonic;gene=KRTAP5-5;exon_func=synonymous SNV;AAchange=NM_001001480:c.T99C:p.S33S;1000g=0.29;dbsnp=rs71454095 GT:GL:GQ:NR 0/0:-199.38,-206.33,-365.55:31:38 0/1:-226.68,-198.86,-282.14:100:33 +chr11 3431576 . G A 33 PASS ABPV=4.46e-01;FPV=4.99e-05;FR=0.2500;HP=1;MMLQ=30;NF=13;NR=10;PP=33;RMP=62.67;RPV=1.90e-02;SC=TCGTGTGTGAGTCCTACAGTG;TC=194;TCF=123;TCR=71;TR=23 GT:GL:GQ:NR 0/0:-71.93,-106.62,-693.75:100:102 1/0:-110.6,-94.58,-543.82:67:92 +chr11 43918703 . C CTTTTCATATTAT 36 PASS ABPV=4.61e-02;FPV=1.12e-04;FR=0.2500;HP=3;NF=2;NR=0;PP=36;RMP=5.0;RPV=1.00e+00;SC=CTGACAGTGGCTTTATATATA;TC=49;TCF=49;TCR=0;TR=2 GT:GL:GQ:NR 0/0:-14.5,-34.6,-394.96:89:42 1/0:-47.66,-15.24,-223.69:100:36 +chr11 48366812 . A C 48 PASS ABPV=1.00e+00;FPV=9.80e-01;FR=0.2502;HP=1;MMLQ=35;NF=16;NR=2;PP=48;RMP=45.69;RPV=1.00e+00;SC=AGATAATTGAATGTCCCAAGT;TC=44;TCF=42;TCR=2;TR=18 GT:GL:GQ:NR 0/0:-92.79,-99.69,-183.18:31:18 0/1:-133.87,-114.4,-228.26:82:26 +chr11 48387506 . A G 48 PASS ABPV=1.00e+00;FPV=6.15e-01;FR=0.2500;HP=3;MMLQ=34;NF=28;NR=52;PP=48;RMP=59.69;RPV=1.00e-00;SC=AAATCCCCCGACCCATGCCAT;TC=227;TCF=109;TCR=118;TR=80;func=intergenic;gene=OR4C45(dist=13507) OR4A47(dist=122839);dbsnp=rs72898882;sift=0.42 GT:GL:GQ:NR 0/0:-665.75,-691.04,-1124.95:100:117 0/1:-697.01,-677.56,-1037.3:82:110 +chr11 56143357 . G A 91 PASS ABPV=1.00e+00;FPV=9.70e-04;FR=0.2500;HP=3;MMLQ=36;NF=7;NR=60;PP=91;RMP=66.63;RPV=1.00e-00;SC=GGAATTTCTTGTACAAACAAA;TC=221;TCF=72;TCR=149;TR=67;func=exonic;gene=OR8U1 OR8U8;exon_func=synonymous SNV;AAchange=NM_001005204:c.G258A:p.L86L;dbsnp=rs76949582 GT:GL:GQ:NR 0/0:-538.52,-560.54,-1080.28:97:104 1/0:-924.01,-894.57,-1497.61:100:131 +chr11 56468493 . A G 86 PASS ABPV=1.00e+00;FPV=1.31e-03;FR=0.2500;HP=1;MMLQ=30;NF=23;NR=16;PP=86;RMP=49.16;RPV=3.74e-01;SC=TCTGCCCCGCAGTGCTCATCC;TC=227;TCF=156;TCR=71;TR=39 GT:GL:GQ:NR 0/0:-212.22,-234.78,-819.52:99:105 0/1:-472.13,-443.86,-1063.46:100:122 +chr11 92592540 . T G 22 PASS ABPV=9.72e-03;FPV=5.62e-02;FR=0.2501;HP=3;MMLQ=35;NF=0;NR=3;PP=22;RMP=99.66;RPV=8.62e-06;SC=GTTAGTGTTTTGGCTCTTGGA;TC=77;TCF=10;TCR=67;TR=3 GT:GL:GQ:NR 0/0:-302.47,-309.64,-322.1:32:36 0/1:-338.7,-325.07,-335.6:52:41 +chr11 123504959 . C G 200 PASS ABPV=1.00e+00;FPV=4.20e-01;FR=0.2508;HP=2;MMLQ=40;NF=0;NR=7;PP=200;RMP=63.62;RPV=9.72e-01;SC=CAGTGCCCAGCGTGGGAACAC;TC=19;TCF=3;TCR=16;TR=7;func=intronic;gene=SCN3B;1000g=0.72;dbsnp=rs1148110 GT:GL:GQ:NR 0/0:-1.61,-6.93,-61.43:24:8 1/0:-66.0,-7.62,-36.11:100:11 +chr12 92675 . C T 152 PASS ABPV=1.00e+00;FPV=7.38e-01;FR=0.2500;HP=1;MMLQ=37;NF=1;NR=7;PP=152;RMP=66.0;RPV=3.57e-01;SC=GGACTGTTTCCTGCTTGTAGC;TC=38;TCF=4;TCR=34;TR=8 GT:GL:GQ:NR 0/0:-41.61,-49.75,-120.62:37:14 1/0:-68.65,-25.34,-113.9:100:24 +chr12 11183642 . A G 154 PASS ABPV=1.00e+00;FPV=8.37e-01;FR=0.2500;HP=1;MMLQ=34;NF=47;NR=62;PP=154;RMP=57.25;RPV=1.00e-00;SC=GCTAGTAGCAAGCCAGTTGCT;TC=311;TCF=168;TCR=143;TR=109;func=exonic;gene=TAS2R31;exon_func=nonsynonymous SNV;AAchange=NM_176885:c.T293C:p.L98P;segdup=0.93;dbsnp=rs73049067 GT:GL:GQ:NR 0/0:-561.52,-579.71,-1246.3:80:152 0/1:-826.02,-782.04,-1401.37:100:159 +chr12 29908580 . A ATTGTT 200 PASS ABPV=1.00e+00;FPV=9.78e-01;FR=0.2507;HP=3;NF=10;NR=0;PP=200;RMP=36.19;RPV=1.00e+00;SC=TTTGGAAACTATTAAGTAATT;TC=24;TCF=24;TCR=0;TR=10;func=intronic;gene=TMTC1;dbsnp=rs3830194 GT:GL:GQ:NR 0/0:0.0,-5.55,-96.69:25:9 1/0:-151.5,-15.23,-76.28:100:17 +chr12 31282765 . A T 21 PASS ABPV=1.00e+00;FPV=8.68e-01;FR=0.2502;HP=2;MMLQ=35;NF=12;NR=5;PP=21;RMP=46.72;RPV=8.51e-01;SC=AATGAATACAAATTTTTTCAT;TC=53;TCF=38;TCR=15;TR=17 GT:GL:GQ:NR 0/0:-83.08,-89.72,-221.87:30:27 1/0:-63.64,-50.39,-170.59:55:26 +chr12 52843779 . T C 52 PASS ABPV=1.00e+00;FPV=1.21e-05;FR=0.2500;HP=4;MMLQ=20;NF=8;NR=16;PP=52;RMP=64.54;RPV=6.52e-01;SC=TTTGAACCCCTGGCTTCATCT;TC=161;TCF=100;TCR=61;TR=24;func=intronic;gene=KRT6B;segdup=0.93;dbsnp=rs380379 GT:GL:GQ:NR 0/0:-109.82,-139.81,-567.08:100:82 0/1:-186.27,-165.75,-481.84:87:79 +chr12 65471467 . A G 200 PASS ABPV=1.00e+00;FPV=6.42e-01;FR=0.2501;HP=2;MMLQ=36;NF=7;NR=0;PP=200;RMP=38.97;RPV=4.22e-01;SC=TGCATCTTAAATATTCTTATC;TC=30;TCF=27;TCR=3;TR=7;func=intronic;gene=WIF1;1000g=0.27;dbsnp=rs2289936 GT:GL:GQ:NR 0/0:0.0,-7.62,-98.02:34:12 1/0:-69.82,-23.48,-105.09:100:18 +chr12 99175091 . AAC A 86 PASS ABPV=3.61e-01;FPV=7.09e-04;FR=0.2503;HP=1;NF=4;NR=0;PP=86;RMP=34.87;RPV=9.95e-03;SC=AAACAACAACAACACACACAC;TC=43;TCF=27;TCR=16;TR=4;func=intronic;gene=ANKS1B GT:GL:GQ:NR 0/0:-4.37,-10.61,-100.0:28:17 0/1:-72.08,-41.09,-136.47:100:27 +chr12 104378526 . G GACACAGAAACT 200 PASS ABPV=2.37e-01;FPV=8.53e-03;FR=0.2500;HP=1;NF=5;NR=0;PP=200;RMP=8.25;RPV=5.63e-02;SC=TGTGATTCTAGCTCTGCTATG;TC=59;TCF=49;TCR=10;TR=5 GT:GL:GQ:NR 0/0:0.0,-15.25,-297.25:67:32 1/0:-137.95,-64.82,-429.82:100:44 +chr13 25169091 . A G 41 PASS ABPV=1.00e+00;FPV=1.23e-02;FR=0.2501;HP=3;MMLQ=35;NF=18;NR=1;PP=41;RMP=17.52;RPV=3.10e-02;SC=AATAACCAAAACAGTTTTTTA;TC=133;TCF=114;TCR=19;TR=19 GT:GL:GQ:NR 0/0:-140.13,-147.81,-405.22:35:57 0/1:-204.4,-186.51,-512.07:75:76 +chr13 37795039 . G T 20 PASS ABPV=5.69e-01;FPV=5.25e-01;FR=0.2502;HP=1;MMLQ=40;NF=2;NR=0;PP=20;RMP=33.0;RPV=7.49e-02;SC=TCCTTGGCCTGAGCTTCTTTG;TC=19;TCF=10;TCR=9;TR=2 GT:GL:GQ:NR 0/0:0.0,-6.93,-89.94:31:11 1/0:-22.03,-9.0,-57.23:54:8 +chr13 100517209 . G A 21 PASS ABPV=2.00e-01;FPV=2.14e-03;FR=0.2500;HP=2;MMLQ=35;NF=6;NR=7;PP=21;RMP=94.07;RPV=9.71e-04;SC=GTGTGTGTGTGTATATGTGTG;TC=134;TCF=62;TCR=72;TR=13 GT:GL:GQ:NR 0/0:-265.23,-279.13,-623.6:62:70 1/0:-308.0,-294.6,-524.58:56:64 +chr13 114540947 . C CTCTGCTCTT 45 PASS ABPV=1.42e-01;FPV=3.34e-03;FR=0.2500;HP=2;NF=2;NR=0;PP=45;RMP=1.0;RPV=5.62e-01;SC=CCACAGGAACCCAGCCAGCAG;TC=37;TCF=35;TCR=2;TR=2 GT:GL:GQ:NR 0/0:0.0,-11.09,-214.96:49:19 1/0:-74.37,-43.34,-288.0:100:27 +chr14 19118192 . A G 200 PASS ABPV=1.00e+00;FPV=1.32e-05;FR=0.2507;HP=2;MMLQ=32;NF=68;NR=76;PP=200;RMP=53.85;RPV=5.74e-02;SC=TGCTTGCCATATGTCATGGAT;TC=771;TCF=415;TCR=356;TR=144;func=intergenic;gene=NONE(dist=NONE) OR11H12(dist=259402);segdup=0.96;dbsnp=rs77434589 GT:GL:GQ:NR 0/0:-730.61,-736.03,-2441.78:25:349 1/0:-997.51,-891.65,-2847.93:100:422 +chr14 19500081 . A G 22 PASS ABPV=1.00e+00;FPV=1.61e-01;FR=0.2505;HP=3;MMLQ=22;NF=3;NR=0;PP=22;RMP=47.77;RPV=1.00e+00;SC=GGTGCACACCACTGTGGACGT;TC=22;TCF=22;TCR=0;TR=3 GT:GL:GQ:NR 0/0:-15.46,-21.36,-64.18:27:10 0/1:-27.84,-14.25,-57.82:57:12 +chr14 20137380 . C T 33 PASS ABPV=1.24e-02;FPV=1.12e-09;FR=0.2500;HP=1;MMLQ=31;NF=8;NR=17;PP=33;RMP=61.98;RPV=3.46e-06;SC=TCACTGCCCTCGCCGCATGCA;TC=303;TCF=142;TCR=161;TR=25 GT:GL:GQ:NR 0/0:-373.48,-389.86,-1035.03:72:144 0/1:-475.48,-459.41,-1121.57:68:159 +chr14 64496872 . G C 96 PASS ABPV=1.00e+00;FPV=1.00e+00;FR=0.2503;HP=1;MMLQ=37;NF=0;NR=4;PP=96;RMP=55.12;RPV=5.17e-01;SC=AGAAATTCCAGTGGTATTCAG;TC=18;TCF=0;TCR=18;TR=4;func=intronic;gene=SYNE2;1000g=0.90;dbsnp=rs3866737 GT:GL:GQ:NR 0/0:0.0,-6.24,-83.73:28:9 0/1:-36.8,-6.24,-45.77:100:9 +chr14 106881425 . A G 71 PASS ABPV=1.00e+00;FPV=1.15e-01;FR=0.2500;HP=1;MMLQ=32;NF=4;NR=10;PP=71;RMP=49.71;RPV=2.88e-01;SC=CCATCCACTCAAGCCCTTGTC;TC=78;TCF=29;TCR=49;TR=14 GT:GL:GQ:NR 0/0:-39.35,-48.57,-258.02:41:30 1/0:-231.62,-206.72,-399.17:100:48 +chr14 106881452 . T C 66 PASS ABPV=1.00e+00;FPV=3.03e-01;FR=0.2509;HP=1;MMLQ=27;NF=3;NR=10;PP=66;RMP=65.33;RPV=1.89e-01;SC=CTGGTCACACTGAATTCATAC;TC=71;TCF=18;TCR=53;TR=13 GT:GL:GQ:NR 0/0:-57.13,-62.37,-258.3:24:30 0/1:-168.08,-144.38,-338.93:100:41 +chr14 107034967 . T C 105 PASS ABPV=1.00e+00;FPV=6.54e-01;FR=0.2500;HP=1;MMLQ=34;NF=6;NR=9;PP=105;RMP=58.51;RPV=6.64e-01;SC=ACAGGAGATCTTCAGAGACTC;TC=57;TCF=23;TCR=34;TR=15 GT:GL:GQ:NR 0/0:-163.23,-172.19,-255.57:40:20 1/0:-379.46,-346.84,-445.34:100:39 +chr15 20083754 . G A 54 PASS ABPV=1.00e+00;FPV=5.67e-01;FR=0.2500;HP=2;MMLQ=36;NF=33;NR=5;PP=54;RMP=47.07;RPV=4.22e-01;SC=AAATCATTATGTGCTTTGAGA;TC=155;TCF=131;TCR=24;TR=38 GT:GL:GQ:NR 0/0:-122.79,-137.29,-483.11:64:64 1/0:-176.25,-155.43,-655.46:88:91 +chr15 20446256 . G C 57 PASS ABPV=1.00e+00;FPV=1.00e+00;FR=0.2500;HP=2;MMLQ=34;NF=1;NR=7;PP=57;RMP=71.88;RPV=4.32e-01;SC=CATGCAAGAAGCTGGAAAGCC;TC=33;TCF=1;TCR=32;TR=8;func=intergenic;gene=NONE(dist=NONE) LOC646096(dist=41741);segdup=0.97;dbsnp=rs3907011 GT:GL:GQ:NR 0/0:-13.82,-23.14,-131.81:42:16 0/1:-45.04,-23.56,-104.26:91:17 +chr15 20875055 . C G 154 PASS ABPV=1.00e+00;FPV=7.50e-01;FR=0.2504;HP=3;MMLQ=37;NF=0;NR=12;PP=154;RMP=60.19;RPV=1.71e-01;SC=AATTTAAACGCAAATTAGTAA;TC=64;TCF=1;TCR=63;TR=12;func=ncRNA;gene=NBEAP1;segdup=0.93;1000g=0.26;dbsnp=rs7496378 GT:GL:GQ:NR 0/0:-9.2,-15.25,-188.16:27:22 0/1:-137.96,-94.13,-342.43:100:42 +chr15 20875100 . A G 21 PASS ABPV=1.00e+00;FPV=7.50e-01;FR=0.2502;HP=4;MMLQ=35;NF=0;NR=6;PP=21;RMP=81.39;RPV=2.77e-01;SC=AGAGGTTAAAAATAACTTTCT;TC=33;TCF=1;TCR=32;TR=6;func=ncRNA;gene=NBEAP1;cons46=243 Name=lod=13;segdup=0.93;1000g=0.28;dbsnp=rs7497715 GT:GL:GQ:NR 0/0:-7.83,-14.75,-92.12:31:10 1/0:-92.65,-79.35,-211.07:56:23 +chr15 21140945 . C T 26 PASS ABPV=1.00e+00;FPV=1.00e-01;FR=0.2506;HP=2;MMLQ=33;NF=1;NR=3;PP=26;RMP=65.04;RPV=7.12e-01;SC=ACATGTACAGCGCCACACTTC;TC=25;TCF=14;TCR=11;TR=4;func=intergenic;gene=NF1P2(dist=6320) LOC348120(dist=4822);cons46=679 Name=lod=765;segdup=1.00;1000g=0.24;dbsnp=rs12324229 GT:GL:GQ:NR 0/0:-16.95,-22.6,-60.18:26:13 0/1:-36.66,-22.19,-44.85:61:12 +chr15 28900400 . G T 133 PASS ABPV=1.00e+00;FPV=6.31e-01;FR=0.2502;HP=3;MMLQ=34;NF=14;NR=0;PP=133;RMP=36.99;RPV=4.21e-01;SC=GCTTGTCATTGTAAATTTTCT;TC=57;TCF=54;TCR=3;TR=14 GT:GL:GQ:NR 0/0:-26.38,-32.94,-192.24:30:27 1/0:-71.34,-32.36,-180.89:100:30 +chr15 75656200 . G A 75 PASS ABPV=1.00e+00;FPV=6.28e-01;FR=0.2507;HP=6;MMLQ=37;NF=4;NR=0;PP=75;RMP=47.43;RPV=1.00e+00;SC=CCAGCCCCCCGGCCCCGTTTT;TC=16;TCF=16;TCR=0;TR=4 GT:GL:GQ:NR 0/0:-7.14,-12.68,-76.44:25:8 0/1:-34.75,-8.99,-31.71:100:8 +chr15 76075732 . A C 29 PASS ABPV=1.00e+00;FPV=9.97e-01;FR=0.2501;HP=2;MMLQ=34;NF=11;NR=15;PP=29;RMP=61.41;RPV=9.58e-01;SC=ATCCCTATCTATCCAGGCCTT;TC=64;TCF=22;TCR=42;TR=26 GT:GL:GQ:NR 0/0:-89.15,-96.33,-237.9:32:31 1/0:-134.14,-119.09,-238.26:63:33 +chr15 100340178 . C G 52 PASS ABPV=1.00e+00;FPV=1.76e-01;FR=0.2500;HP=1;MMLQ=31;NF=5;NR=5;PP=52;RMP=87.78;RPV=1.32e-01;SC=AGTGTCTTCTCGTTCCCACGC;TC=64;TCF=31;TCR=33;TR=10;func=ncRNA;gene=DNM1P46;cons46=699 Name=lod=923;segdup=0.97;sift=0.27 GT:GL:GQ:NR 0/0:-139.12,-149.96,-310.47:37:36 1/0:-206.67,-186.19,-317.68:87:38 +chr15 102303399 . C T 65 PASS ABPV=1.00e+00;FPV=4.32e-02;FR=0.2500;HP=2;MMLQ=34;NF=5;NR=30;PP=65;RMP=65.58;RPV=1.00e-00;SC=AGAGCTGCTGCCCAACCTGCA;TC=90;TCF=40;TCR=50;TR=35;func=intergenic;gene=TARSL2(dist=38754) OR4F6(dist=42524);cons46=920 Name=lod=7327;segdup=0.98;1000g=0.50;dbsnp=rs71416239 GT:GL:GQ:NR 0/0:-129.26,-138.34,-250.21:41:46 0/1:-118.78,-95.27,-224.48:100:44 +chr15 102506389 . C T 50 PASS ABPV=6.29e-01;FPV=1.27e-01;FR=0.2500;HP=1;MMLQ=34;NF=1;NR=3;PP=50;RMP=67.19;RPV=2.63e-01;SC=GGATGCCCTGCAGTACCTGCA;TC=32;TCF=13;TCR=19;TR=4 GT:GL:GQ:NR 0/0:-3.9,-15.65,-133.88:52:17 0/1:-31.25,-11.29,-72.06:84:15 +chr16 9250260 . T G 22 PASS ABPV=1.00e+00;FPV=1.00e-02;FR=0.2500;HP=2;MMLQ=29;NF=0;NR=4;PP=22;RMP=37.36;RPV=8.85e-01;SC=CACCTATTATTCCATGAATTC;TC=27;TCF=16;TCR=11;TR=4;func=intergenic;gene=C16orf72(dist=36705) MIR548X(dist=78514);cons46=749 Name=lod=1471;1000g=0.73;dbsnp=rs12929693 GT:GL:GQ:NR 0/0:-1.84,-10.83,-100.69:40:14 0/1:-25.85,-12.37,-70.66:56:13 +chr16 21747662 . G A 36 PASS ABPV=1.00e+00;FPV=2.01e-01;FR=0.2500;HP=1;MMLQ=34;NF=16;NR=6;PP=36;RMP=40.34;RPV=5.40e-05;SC=CTGTCTTTCAGTCTGTTCGGA;TC=159;TCF=79;TCR=80;TR=22 GT:GL:GQ:NR 0/0:-69.29,-88.69,-470.14:85:75 1/0:-171.53,-154.82,-534.35:70:84 +chr16 28618446 . T C 36 PASS ABPV=1.00e+00;FPV=8.61e-01;FR=0.2500;HP=3;MMLQ=32;NF=6;NR=14;PP=36;RMP=63.74;RPV=5.40e-01;SC=ACACAGCCTGTCCCAGGCCAG;TC=75;TCF=18;TCR=57;TR=20 GT:GL:GQ:NR 0/0:-33.24,-41.67,-205.86:38:27 0/1:-113.92,-97.17,-312.83:70:48 +chr16 33390329 . G C 24 PASS ABPV=6.16e-01;FPV=4.32e-02;FR=0.2500;HP=2;MMLQ=34;NF=5;NR=0;PP=24;RMP=54.47;RPV=1.00e+00;SC=TTAGAAACAGGTTCACAATTG;TC=40;TCF=40;TCR=0;TR=5;func=intergenic;gene=LOC390705(dist=91627) LINC00273(dist=570723);segdup=0.97;1000g=0.32;dbsnp=rs12232434 GT:GL:GQ:NR 0/0:-6.09,-14.55,-170.95:38:21 0/1:-47.14,-33.16,-147.34:58:19 +chr16 33401967 . G A 116 PASS ABPV=1.00e+00;FPV=1.64e-02;FR=0.2500;HP=2;MMLQ=34;NF=16;NR=15;PP=116;RMP=51.2;RPV=2.96e-01;SC=GAGGTCTGCCGACAGCTGCAC;TC=172;TCF=102;TCR=70;TR=31;func=intergenic;gene=LOC390705(dist=103265) LINC00273(dist=559085);cons46=611 Name=lod=406;segdup=0.97;dbsnp=rs8047578 GT:GL:GQ:NR 0/0:-133.55,-144.14,-490.22:47:76 1/0:-209.17,-173.99,-648.51:100:96 +chr16 33407954 . C G 34 PASS ABPV=1.00e+00;FPV=4.21e-01;FR=0.2507;HP=3;MMLQ=34;NF=0;NR=3;PP=34;RMP=61.08;RPV=5.19e-01;SC=GAAATTGTCTCGGGCCTGAAG;TC=17;TCF=3;TCR=14;TR=3 GT:GL:GQ:NR 0/0:-10.82,-16.36,-77.44:25:9 1/0:-63.55,-47.37,-59.15:58:8 +chr16 46405120 . C G 37 PASS ABPV=3.94e-02;FPV=4.07e-03;FR=0.2510;HP=2;MMLQ=40;NF=2;NR=1;PP=37;RMP=51.27;RPV=3.18e-03;SC=CGATTCCATTCGATAATGATT;TC=62;TCF=34;TCR=28;TR=3 GT:GL:GQ:NR 0/0:-129.24,-134.38,-161.33:24:28 0/1:-205.7,-188.69,-196.8:42:34 +chr16 58148083 . C CACACGCAGGTACA 31 PASS ABPV=1.69e-01;FPV=1.00e+00;FR=0.2500;HP=2;NF=0;NR=2;PP=31;RMP=88.0;RPV=3.34e-03;SC=CAGGGAAGCACCCACCCTTGT;TC=35;TCF=0;TCR=35;TR=2 GT:GL:GQ:NR 0/0:-11.28,-21.68,-223.8:46:16 0/1:-62.86,-30.44,-243.59:100:20 +chr17 5036281 . G C 48 PASS ABPV=1.00e+00;FPV=8.00e-01;FR=0.2500;HP=1;MMLQ=32;NF=14;NR=49;PP=48;RMP=47.67;RPV=9.22e-01;SC=AAGCACAGTAGCAAAGTAATG;TC=214;TCF=48;TCR=166;TR=63 GT:GL:GQ:NR 0/0:-506.02,-514.23,-1090.2:37:117 0/1:-460.03,-440.62,-871.14:82:97 +chr17 6328747 . T G 200 PASS ABPV=1.00e+00;FPV=8.77e-01;FR=0.2507;HP=4;MMLQ=32;NF=8;NR=5;PP=200;RMP=59.22;RPV=9.45e-01;SC=GGCCACTTGCTCCCTGCCTGG;TC=36;TCF=24;TCR=12;TR=13 GT:GL:GQ:NR 0/0:-4.84,-10.37,-69.24:25:8 0/1:-116.1,-23.7,-86.84:100:28 +chr17 14140191 . G A 125 PASS ABPV=1.00e+00;FPV=3.98e-02;FR=0.2500;HP=1;MMLQ=34;NF=2;NR=11;PP=125;RMP=71.76;RPV=3.84e-02;SC=AGCTGTTTACGGCGCTGACTC;TC=95;TCF=24;TCR=71;TR=13;func=upstream;gene=CDRT15;segdup=0.99;1000g=0.17;dbsnp=rs28533558 GT:GL:GQ:NR 0/0:-146.51,-156.3,-338.05:44:40 0/1:-162.79,-125.58,-384.62:100:55 +chr17 21904955 . G A 29 PASS ABPV=1.46e-01;FPV=3.00e-01;FR=0.2500;HP=2;MMLQ=33;NF=1;NR=7;PP=29;RMP=77.08;RPV=5.90e-05;SC=GTGGCACGGCGCTGTATCCTG;TC=95;TCF=9;TCR=86;TR=8 GT:GL:GQ:NR 0/0:-95.23,-110.26,-302.39:67:42 0/1:-104.15,-88.94,-334.7:64:53 +chr17_gl000205_random 114392 . G GC 200 PASS ABPV=1.00e+00;FPV=1.00e+00;FR=0.2503;HP=1;NF=1;NR=9;PP=200;RMP=62.13;RPV=8.86e-01;SC=GAGCTTCTATGAGGCGTGGGG;TC=28;TCF=1;TCR=27;TR=10;func=intergenic;gene=NONE(dist=NONE) MGC70870(dist=2231) GT:GL:GQ:NR 0/0:0.0,-6.24,-93.01:28:9 0/1:-137.06,-63.68,-124.76:100:19 +chr17_gl000205_random 118186 . TCGC T 157 PASS ABPV=1.00e+00;FPV=4.85e-02;FR=0.2506;HP=1;NF=4;NR=5;PP=157;RMP=51.77;RPV=1.51e-01;SC=CCATCATAAGTCGCATCCCGG;TC=55;TCF=23;TCR=32;TR=9;func=ncRNA;gene=MGC70870;cons46=824 Name=lod=2972;segdup=0.90 GT:GL:GQ:NR 0/0:-80.93,-86.51,-246.22:26:23 0/1:-151.92,-104.34,-309.99:100:34 +chr17_gl000205_random 118289 . G A 30 PASS ABPV=1.00e+00;FPV=2.43e-02;FR=0.2500;HP=1;MMLQ=38;NF=1;NR=4;PP=30;RMP=51.3;RPV=5.18e-01;SC=TGAGCTCAGTGGTGCTACCTA;TC=38;TCF=20;TCR=18;TR=5 GT:GL:GQ:NR 0/0:-92.27,-100.53,-170.2:37:15 0/1:-193.59,-178.31,-262.43:64:23 +chr17_gl000205_random 122791 . T C 124 PASS ABPV=1.00e+00;FPV=6.72e-01;FR=0.2504;HP=1;MMLQ=34;NF=8;NR=0;PP=124;RMP=54.5;RPV=1.00e+00;SC=GATATAAACTTCTAAAATTCA;TC=30;TCF=30;TCR=0;TR=8;func=intergenic;gene=MGC70870(dist=3059) NONE(dist=NONE) GT:GL:GQ:NR 0/0:-33.82,-39.98,-100.64:28:10 1/0:-177.82,-140.79,-190.46:100:20 +chr18 14183747 . T C 115 PASS ABPV=1.00e+00;FPV=9.72e-01;FR=0.2500;HP=5;MMLQ=36;NF=49;NR=88;PP=115;RMP=54.47;RPV=9.86e-01;SC=ACAAAGAAAATAGAACGCCTT;TC=444;TCF=156;TCR=288;TR=137 GT:GL:GQ:NR 0/0:-919.95,-948.86,-1765.89:100:211 0/1:-1189.4,-1154.37,-1918.79:100:233 +chr19 3611146 . A G 30 PASS ABPV=1.00e+00;FPV=5.15e-01;FR=0.2501;HP=1;MMLQ=24;NF=6;NR=1;PP=30;RMP=42.3;RPV=2.44e-01;SC=CCCTGTGCTCAGAGGTGGGGG;TC=36;TCF=26;TCR=10;TR=7;func=ncRNA;gene=C19orf29-AS1;1000g=0.56;dbsnp=rs2074786 GT:GL:GQ:NR 0/0:-27.63,-35.13,-121.04:34:15 0/1:-69.97,-54.53,-137.67:65:21 +chr19 12543121 . C G 200 PASS ABPV=1.00e+00;FPV=7.14e-01;FR=0.2502;HP=7;MMLQ=40;NF=11;NR=0;PP=200;RMP=33.87;RPV=7.50e-01;SC=TTCTTTGCTTCTTTTTAAATT;TC=41;TCF=40;TCR=1;TR=11;func=intronic;gene=ZNF443;segdup=0.96;dbsnp=rs74181652 GT:GL:GQ:NR 0/0:-8.47,-15.46,-153.74:32:20 0/1:-71.21,-15.46,-97.4:100:21 +chr19 15014189 . T C 90 PASS ABPV=1.00e+00;FPV=1.97e-01;FR=0.2500;HP=4;MMLQ=100;NF=2;NR=5;PP=90;RMP=90.56;RPV=4.68e-01;SC=GAGTGAGTTGTGGGTTGCAGC;TC=39;TCF=16;TCR=23;TR=7 GT:GL:GQ:NR 0/0:-190.71,-200.49,-255.11:44:24 1/0:-174.95,-145.84,-178.61:100:15 +chr19 41515263 . A G 88 PASS ABPV=3.76e-01;FPV=1.82e-01;FR=0.2500;HP=2;MMLQ=33;NF=7;NR=3;PP=88;RMP=64.16;RPV=2.48e-04;SC=AGCGCCCCCAAGGACCTCATC;TC=93;TCF=40;TCR=53;TR=10;func=exonic;gene=CYP2B6;exon_func=nonsynonymous SNV;AAchange=NM_000767:c.A785G:p.K262R;segdup=0.92;1000g=0.20;dbsnp=rs2279343;pp2=0.0;phylop=0.086093;mutT=1.0E-6;LRT=0.999974 GT:GL:GQ:NR 0/0:-4.81,-28.32,-273.38:100:41 0/1:-65.82,-37.11,-263.4:100:52 +chr19 42188037 . C T 114 PASS ABPV=1.00e+00;FPV=6.06e-02;FR=0.2500;HP=4;MMLQ=34;NF=2;NR=8;PP=114;RMP=98.9;RPV=1.54e-02;SC=GTGTGGCCCCCTTGGTTCCCC;TC=73;TCF=11;TCR=62;TR=10 GT:GL:GQ:NR 0/0:-205.49,-214.25,-251.15:29:29 0/1:-379.34,-343.91,-357.8:15:44 +chr19 50474708 . T G 61 PASS ABPV=1.00e+00;FPV=7.17e-01;FR=0.2501;HP=2;MMLQ=30;NF=5;NR=1;PP=61;RMP=67.96;RPV=3.09e-02;SC=CTGGGCTCAGTGTCCCAGAGC;TC=37;TCF=18;TCR=19;TR=6 GT:GL:GQ:NR 0/0:-86.34,-93.74,-137.77:33:15 0/1:-129.81,-107.4,-147.05:95:22 +chr19 52977823 . A G 102 PASS ABPV=1.00e+00;FPV=3.15e-01;FR=0.2507;HP=2;MMLQ=35;NF=0;NR=4;PP=102;RMP=41.58;RPV=8.84e-01;SC=GTTTCTCTCCAGTATGAATTC;TC=15;TCF=4;TCR=11;TR=4;func=intronic;gene=ZNF578;cons46=395 Name=lod=54;1000g=0.94;dbsnp=rs1673901 GT:GL:GQ:NR 0/0:0.0,-5.54,-65.87:25:9 1/0:-36.12,-4.16,-18.86:71:6 +chr19 54726711 . G T 43 PASS ABPV=1.00e+00;FPV=1.00e-00;FR=0.2504;HP=3;MMLQ=31;NF=22;NR=2;PP=43;RMP=52.84;RPV=6.78e-01;SC=GTCCCCGCCCGGGTGCCTCCT;TC=53;TCF=45;TCR=8;TR=24 GT:GL:GQ:NR 0/0:-47.88,-54.03,-95.64:28:18 1/0:-164.89,-146.64,-206.88:77:35 +chr2 905553 . G C 76 PASS ABPV=1.62e-02;FPV=5.75e-08;FR=0.2500;HP=2;MMLQ=31;NF=1;NR=7;PP=76;RMP=95.73;RPV=1.04e-02;SC=GCCTGCACTGGGTCTGGTGTT;TC=128;TCF=69;TCR=59;TR=8 GT:GL:GQ:NR 0/0:-314.19,-325.21,-450.94:49:57 0/1:-390.34,-364.48,-513.78:100:71 +chr2 905595 . G C 24 PASS ABPV=1.21e-01;FPV=1.79e-02;FR=0.2500;HP=2;MMLQ=35;NF=5;NR=1;PP=24;RMP=13.0;RPV=6.96e-04;SC=GCCTGCACTGGGTCTGGTGTT;TC=79;TCF=45;TCR=34;TR=6 GT:GL:GQ:NR 0/0:-210.22,-219.58,-290.19:42:42 1/0:-197.49,-183.47,-250.46:59:38 +chr2 91885842 . G A 37 PASS ABPV=1.00e+00;FPV=2.46e-01;FR=0.2502;HP=1;MMLQ=36;NF=4;NR=0;PP=37;RMP=71.85;RPV=4.22e-01;SC=CCAACATTACGGAATTTGGAT;TC=27;TCF=24;TCR=3;TR=4 GT:GL:GQ:NR 0/0:-11.45,-18.39,-83.47:31:11 0/1:-59.01,-41.99,-86.53:72:16 +chr2 96525556 . C T 37 PASS ABPV=1.00e+00;FPV=1.00e-00;FR=0.2503;HP=1;MMLQ=37;NF=60;NR=2;PP=37;RMP=45.25;RPV=9.49e-01;SC=TCTCCTTATACGTCTTTAATA;TC=91;TCF=87;TCR=4;TR=62 GT:GL:GQ:NR 0/0:-304.4,-310.82,-406.42:29:43 0/1:-411.62,-394.62,-459.09:72:48 +chr2 107042620 . C T 45 PASS ABPV=1.00e+00;FPV=7.50e-01;FR=0.2500;HP=4;MMLQ=33;NF=0;NR=10;PP=45;RMP=77.64;RPV=2.94e-02;SC=GCAAGAGCTACAAATACAAAA;TC=69;TCF=1;TCR=68;TR=10;func=intronic;gene=RGPD3;cons46=333 Name=lod=30;segdup=0.99;dbsnp=rs2433787 GT:GL:GQ:NR 0/0:-9.17,-23.45,-154.19:63:21 1/0:-107.84,-88.96,-294.09:80:48 +chr2 132860931 . G A 113 PASS ABPV=1.00e+00;FPV=5.61e-01;FR=0.2507;HP=1;MMLQ=38;NF=0;NR=8;PP=113;RMP=69.43;RPV=9.58e-01;SC=GAAGAATGTGGTAAAGCCTTT;TC=22;TCF=2;TCR=20;TR=8 GT:GL:GQ:NR 0/0:-12.66,-18.1,-56.72:25:9 1/0:-57.64,-23.24,-50.67:100:13 +chr2 133020074 . G A 33 PASS ABPV=1.00e+00;FPV=9.94e-01;FR=0.2501;HP=2;MMLQ=36;NF=45;NR=12;PP=33;RMP=47.59;RPV=9.08e-01;SC=ATTTCAGAAGGGAAAATATCC;TC=167;TCF=131;TCR=36;TR=57;func=intergenic;gene=ANKRD30BL(dist=4532) GPR39(dist=154073);cons46=762 Name=lod=1662;segdup=0.91;dbsnp=rs111959326 GT:GL:GQ:NR 0/0:-698.84,-706.52,-798.38:35:80 1/0:-786.87,-770.7,-903.5:68:87 +chr2 133020186 . T C 66 PASS ABPV=1.00e+00;FPV=1.55e-01;FR=0.2500;HP=1;MMLQ=34;NF=52;NR=51;PP=66;RMP=46.69;RPV=9.65e-01;SC=TAGCTTTGTGTTCATACCACT;TC=402;TCF=237;TCR=165;TR=103;func=intergenic;gene=ANKRD30BL(dist=4644) GPR39(dist=153961);cons46=762 Name=lod=1662;segdup=0.91;dbsnp=rs112259198 GT:GL:GQ:NR 0/0:-1712.52,-1737.48,-1975.72:100:192 1/0:-1974.59,-1950.96,-2276.74:100:211 +chr2 133020542 . G A 50 PASS ABPV=1.00e+00;FPV=1.14e-01;FR=0.2503;HP=1;MMLQ=32;NF=3;NR=6;PP=50;RMP=53.94;RPV=7.08e-02;SC=CTATCCAAGTGGATCCAAATT;TC=66;TCF=24;TCR=42;TR=9;func=intergenic;gene=ANKRD30BL(dist=5000) GPR39(dist=153605);cons46=762 Name=lod=1662;segdup=0.93;dbsnp=rs2257591 GT:GL:GQ:NR 0/0:-181.04,-187.42,-271.44:29:29 1/0:-243.98,-224.07,-313.1:84:37 +chr2 166801924 . C G 78 PASS ABPV=1.00e+00;FPV=5.71e-01;FR=0.2507;HP=3;MMLQ=34;NF=4;NR=0;PP=78;RMP=67.75;RPV=7.49e-01;SC=TATTTACAAACTGGCAATAGA;TC=18;TCF=17;TCR=1;TR=4;func=ncRNA;gene=LOC100506134;1000g=0.64;dbsnp=rs6432853 GT:GL:GQ:NR 0/0:-34.05,-39.57,-91.24:25:8 1/0:-42.79,-16.34,-58.89:100:10 +chr2 204055943 . T C 59 PASS ABPV=2.58e-01;FPV=8.29e-02;FR=0.2500;HP=2;MMLQ=33;NF=11;NR=2;PP=59;RMP=61.13;RPV=3.22e-06;SC=ATGGCCGCCATCCTCATGACA;TC=128;TCF=65;TCR=63;TR=13;func=intronic;gene=NBEAL1;cons46=702 Name=lod=950;dbsnp=rs4561645 GT:GL:GQ:NR 0/0:-41.52,-53.03,-440.53:51:70 1/0:-89.56,-67.55,-350.54:93:58 +chr2 210594540 . A G 200 PASS ABPV=1.00e+00;FPV=9.70e-01;FR=0.2507;HP=1;MMLQ=30;NF=10;NR=1;PP=200;RMP=52.61;RPV=9.37e-01;SC=CGAATGCAAGATATAGTTAAA;TC=27;TCF=25;TCR=2;TR=11;func=intronic;gene=MAP2;1000g=0.88;dbsnp=rs4673486 GT:GL:GQ:NR 0/0:0.0,-5.54,-62.54:25:8 0/1:-93.19,-14.77,-63.29:100:19 +chr2 211444533 . GGT G 32 PASS ABPV=1.78e-01;FPV=1.96e-01;FR=0.2503;HP=2;NF=1;NR=3;PP=32;RMP=50.82;RPV=2.40e-03;SC=TGTTTCTTCGGGTGTGTGTGT;TC=54;TCF=11;TCR=43;TR=4 GT:GL:GQ:NR 0/0:-4.14,-10.38,-103.02:28:17 1/0:-41.6,-23.06,-172.26:78:37 +chr2 227659818 . T TCAAGTGAGGA 93 PASS ABPV=3.68e-02;FPV=2.37e-01;FR=0.2500;HP=1;NF=0;NR=3;PP=93;RMP=91.0;RPV=7.64e-05;SC=CTCTCACCGCTGCCCAGGGGT;TC=63;TCF=5;TCR=58;TR=3 GT:GL:GQ:NR 0/0:-17.96,-35.28,-330.9:77:30 0/1:-94.07,-50.73,-458.79:100:41 +chr2 227954599 . G A 200 PASS ABPV=1.00e+00;FPV=9.19e-01;FR=0.2507;HP=2;MMLQ=31;NF=6;NR=4;PP=200;RMP=46.35;RPV=9.51e-01;SC=TCTCCTTTTGGGCCTCTTCCT;TC=25;TCF=16;TCR=9;TR=10;func=exonic;gene=COL4A4;exon_func=nonsynonymous SNV;AAchange=NM_000092:c.C1444T:p.P482S;1000g=0.55;dbsnp=rs2229814;sift=0.44;pp2=0.0;phylop=0.897442;mutT=9.0E-5;LRT=0.824593 GT:GL:GQ:NR 0/0:0.0,-5.54,-68.56:25:9 0/1:-80.77,-11.53,-34.97:100:16 +chr2 233273018 . G A 32 PASS ABPV=1.00e+00;FPV=3.62e-01;FR=0.2500;HP=3;MMLQ=34;NF=13;NR=4;PP=32;RMP=56.47;RPV=8.89e-03;SC=TTCCCATGGGGACCCCAGACC;TC=102;TCF=59;TCR=43;TR=17 GT:GL:GQ:NR 0/0:-50.24,-59.48,-309.03:41:45 0/1:-159.89,-144.07,-409.74:66:57 +chr20 29633938 . A G 28 PASS ABPV=1.00e+00;FPV=1.27e-01;FR=0.2500;HP=2;MMLQ=34;NF=16;NR=24;PP=28;RMP=56.91;RPV=2.94e-01;SC=AAATGACTGGAATTTTTGTTT;TC=192;TCF=84;TCR=108;TR=40;func=ncRNA;gene=FRG1B;cons46=514 Name=lod=163;segdup=0.96;dbsnp=rs4006818 GT:GL:GQ:NR 0/0:-963.63,-978.07,-1139.59:64:101 1/0:-1046.34,-1031.41,-1112.07:63:91 +chr20 33356511 . C T 44 PASS ABPV=1.00e+00;FPV=7.49e-01;FR=0.2507;HP=1;MMLQ=37;NF=0;NR=4;PP=44;RMP=57.46;RPV=6.28e-01;SC=AGTTTACCACCAGAAAAATGG;TC=17;TCF=1;TCR=16;TR=4;func=intronic;gene=NCOA6;cons46=243 Name=lod=13;1000g=0.36;dbsnp=rs2295353 GT:GL:GQ:NR 0/0:0.0,-5.54,-70.65:25:8 0/1:-49.75,-31.07,-63.51:79:9 +chr21 14424170 . C G 200 PASS ABPV=1.00e+00;FPV=7.37e-05;FR=0.2502;HP=1;MMLQ=31;NF=51;NR=68;PP=200;RMP=55.06;RPV=7.01e-02;SC=GGAAAGAACACCTGACACGGC;TC=637;TCF=318;TCR=319;TR=119 GT:GL:GQ:NR 0/0:-1068.97,-1075.78,-2090.04:31:272 1/0:-1608.82,-1559.51,-2814.14:100:365 +chr22 16256578 . G T 200 PASS ABPV=2.18e-01;FPV=6.87e-08;FR=0.2502;HP=4;MMLQ=34;NF=19;NR=8;PP=200;RMP=40.16;RPV=2.46e-02;SC=TGGCTCTGATGTTTCATTATG;TC=253;TCF=194;TCR=59;TR=27 GT:GL:GQ:NR 0/0:-139.12,-145.98,-745.94:31:118 0/1:-324.53,-220.54,-788.14:100:135 +chr22 24640438 . TCA T 58 PASS ABPV=5.57e-01;FPV=3.19e-02;FR=0.2503;HP=2;NF=2;NR=1;PP=58;RMP=48.68;RPV=9.37e-01;SC=ATACATTCACTCACACACACA;TC=27;TCF=25;TCR=2;TR=3 GT:GL:GQ:NR 0/0:-4.37,-10.61,-107.94:28:12 0/1:-47.48,-22.82,-120.6:100:15 +chr22 42524924 . A G 32 PASS ABPV=1.00e+00;FPV=1.78e-02;FR=0.2500;HP=2;MMLQ=35;NF=0;NR=4;PP=32;RMP=71.83;RPV=5.74e-01;SC=TGTCCAAGAGACCGTTGGGGC;TC=31;TCF=14;TCR=17;TR=4 GT:GL:GQ:NR 0/0:-1.84,-12.87,-112.28:49:17 1/0:-35.2,-19.47,-73.62:66:14 +chr3 6522043 . G A 62 PASS ABPV=1.00e+00;FPV=5.16e-01;FR=0.2507;HP=3;MMLQ=37;NF=4;NR=0;PP=62;RMP=44.82;RPV=7.49e-01;SC=TAACTGCAAAGTAGGAACACG;TC=19;TCF=18;TCR=1;TR=4 GT:GL:GQ:NR 0/0:0.0,-5.54,-65.36:25:9 1/0:-46.21,-23.49,-68.33:96:10 +chr3 135742089 . GAAAATA G 56 PASS ABPV=2.53e-02;FPV=5.62e-01;FR=0.2500;HP=4;NF=0;NR=2;PP=56;RMP=97.0;RPV=4.10e-05;SC=GTTTTGTTTTGAAAATATTTT;TC=55;TCF=2;TCR=53;TR=2 GT:GL:GQ:NR 0/0:-171.19,-180.69,-401.53:43:27 1/0:-163.7,-138.73,-368.83:100:28 +chr3 195453014 . G A 73 PASS ABPV=1.00e+00;FPV=9.99e-01;FR=0.2500;HP=3;MMLQ=31;NF=44;NR=44;PP=73;RMP=52.04;RPV=1.00e-00;SC=GACAGCACCCGGGGCCACGAC;TC=210;TCF=115;TCR=95;TR=88 GT:GL:GQ:NR 0/0:-596.82,-608.68,-929.74:53:99 0/1:-825.59,-800.41,-1040.36:100:111 +chr3 195453412 . C T 21 PASS ABPV=1.00e+00;FPV=1.25e-02;FR=0.2502;HP=2;MMLQ=25;NF=13;NR=52;PP=21;RMP=62.2;RPV=1.00e-00;SC=CCACGACTGCCCGGACGAGGC;TC=219;TCF=89;TCR=130;TR=65 GT:GL:GQ:NR 0/0:-275.62,-282.43,-681.47:31:103 0/1:-362.65,-349.41,-719.87:55:117 +chr3 195506775 . G A 87 PASS ABPV=1.00e+00;FPV=8.81e-01;FR=0.2500;HP=1;MMLQ=34;NF=11;NR=4;PP=87;RMP=30.23;RPV=4.10e-02;SC=AGGAAGTGTCGGTGACAGGAA;TC=69;TCF=34;TCR=35;TR=15;func=exonic;gene=MUC4;exon_func=synonymous SNV;AAchange=NM_018406:c.C11676T:p.H3892H;cons46=381 Name=lod=47;segdup=0.92;1000g=0.48;dbsnp=rs79609066 GT:GL:GQ:NR 0/0:-215.78,-225.62,-329.97:44:31 0/1:-253.55,-225.09,-324.19:100:38 +chr3 195507372 . C A 72 PASS ABPV=1.00e+00;FPV=9.50e-01;FR=0.2510;HP=1;MMLQ=31;NF=12;NR=10;PP=72;RMP=82.02;RPV=4.71e-01;SC=GAGGGGTGGCCTGACCTGTGG;TC=76;TCF=33;TCR=43;TR=22 GT:GL:GQ:NR 0/0:-85.59,-90.71,-175.03:23:27 0/1:-302.0,-277.02,-435.24:100:49 +chr3 195509974 . A G 107 PASS ABPV=1.00e+00;FPV=4.52e-02;FR=0.2501;HP=1;MMLQ=33;NF=7;NR=15;PP=107;RMP=66.83;RPV=1.62e-01;SC=ATGACCTGTGAACACTGAGGA;TC=127;TCF=50;TCR=77;TR=22 GT:GL:GQ:NR 0/0:-281.04,-289.1,-469.31:36:51 0/1:-474.46,-441.44,-679.46:100:76 +chr4 3589510 . G A 82 PASS ABPV=1.00e+00;FPV=1.00e-00;FR=0.2500;HP=1;MMLQ=35;NF=28;NR=15;PP=82;RMP=39.79;RPV=1.00e-00;SC=ACTTCCAGATGAGACTTCCTG;TC=89;TCF=62;TCR=27;TR=43;func=ncRNA;gene=FLJ35424 GT:GL:GQ:NR 0/0:-202.17,-216.0,-372.38:61:36 0/1:-618.94,-591.66,-690.1:100:53 +chr4 5747131 . C A 40 PASS ABPV=1.00e+00;FPV=6.32e-01;FR=0.2502;HP=2;MMLQ=33;NF=1;NR=19;PP=40;RMP=63.27;RPV=9.99e-01;SC=AAATTGGCTACATTAGAGAGA;TC=45;TCF=5;TCR=40;TR=20 GT:GL:GQ:NR 0/0:-175.23,-182.17,-227.63:31:19 1/0:-264.71,-246.95,-301.81:75:26 +chr4 70261725 . G A 25 PASS ABPV=1.00e+00;FPV=8.43e-01;FR=0.2503;HP=3;MMLQ=36;NF=1;NR=5;PP=25;RMP=77.58;RPV=8.09e-01;SC=TGTGGCCCTGGGGTAGTTACT;TC=19;TCF=3;TCR=16;TR=6 GT:GL:GQ:NR 0/0:-25.09,-31.31,-100.1:28:11 1/0:-62.48,-48.33,-68.8:59:8 +chr5 837488 . C A 84 PASS ABPV=3.03e-01;FPV=2.26e-02;FR=0.2502;HP=2;MMLQ=35;NF=22;NR=3;PP=84;RMP=67.65;RPV=4.45e-09;SC=ACCTGGAGAACTCCTTTGTCC;TC=225;TCF=128;TCR=97;TR=25 GT:GL:GQ:NR 0/0:-71.02,-77.56,-596.34:30:92 0/1:-157.13,-129.33,-794.35:100:133 +chr5 34192944 . A G 136 PASS ABPV=3.53e-01;FPV=1.29e-04;FR=0.2500;HP=1;MMLQ=31;NF=17;NR=13;PP=136;RMP=51.73;RPV=7.15e-05;SC=GCAGTGGATGAAGGCCCCTCA;TC=261;TCF=140;TCR=121;TR=30 GT:GL:GQ:NR 0/0:-120.41,-138.2,-806.35:79:120 0/1:-199.6,-159.91,-913.41:100:141 +chr5 36200413 . G A 33 PASS ABPV=1.25e-02;FPV=1.03e-02;FR=0.2511;HP=3;MMLQ=34;NF=2;NR=4;PP=33;RMP=98.68;RPV=2.69e-06;SC=GAAAATGTATGTTATAAATAT;TC=109;TCF=30;TCR=79;TR=6 GT:GL:GQ:NR 0/0:-295.77,-300.82,-490.03:23:53 1/0:-290.08,-274.08,-469.93:67:56 +chr5 41909830 . C T 27 PASS ABPV=5.28e-01;FPV=2.35e-03;FR=0.2504;HP=18;MMLQ=0;NF=0;NR=3;PP=27;RMP=14.14;RPV=9.29e-01;SC=AGATATCTTTCTTTTTTTTTT;TC=28;TCF=21;TCR=7;TR=3 GT:GL:GQ:NR 0/0:-4.61,-10.58,-40.73:26:11 0/1:-41.44,-26.72,-53.62:62:17 +chr5 54329850 . C CTGCTTTACTTA 68 PASS ABPV=5.01e-01;FPV=1.00e+00;FR=0.2503;HP=1;NF=0;NR=2;PP=68;RMP=90.0;RPV=7.41e-02;SC=CATATGGGGTCCATTTTTGCA;TC=21;TCF=0;TCR=21;TR=2 GT:GL:GQ:NR 0/0:0.0,-6.24,-122.94:28:9 1/0:-45.59,-6.93,-110.5:100:12 +chr5 58121059 . G A 112 PASS ABPV=1.00e+00;FPV=4.22e-01;FR=0.2501;HP=2;MMLQ=35;NF=0;NR=5;PP=112;RMP=75.51;RPV=4.68e-01;SC=TACAGAGTCCGAGCTAATTGT;TC=26;TCF=3;TCR=23;TR=5 GT:GL:GQ:NR 0/0:-31.77,-39.38,-124.25:34:12 0/1:-43.94,-9.7,-79.61:100:15 +chr5 169535734 . C A 20 PASS ABPV=1.00e+00;FPV=1.00e+00;FR=0.2507;HP=1;MMLQ=34;NF=0;NR=2;PP=20;RMP=68.72;RPV=3.31e-01;SC=CAGGAGCCTCCGAGGAATCCA;TC=13;TCF=0;TCR=13;TR=2;func=UTR3;gene=FOXI1;1000g=0.35;dbsnp=rs6873124 GT:GL:GQ:NR 0/0:-5.3,-10.84,-76.27:25:8 1/0:-15.88,-2.77,-16.56:54:5 +chr5 175467765 . A C 34 PASS ABPV=1.00e+00;FPV=6.86e-01;FR=0.2503;HP=3;MMLQ=37;NF=4;NR=7;PP=34;RMP=58.23;RPV=9.60e-01;SC=AGGAAAGCAGATTTGTACATC;TC=32;TCF=15;TCR=17;TR=11 GT:GL:GQ:NR 0/0:-48.25,-54.62,-116.89:29:16 0/1:-64.43,-48.26,-102.15:68:18 +chr5 180047739 . CGT C 40 PASS ABPV=3.01e-01;FPV=4.20e-02;FR=0.2503;HP=3;NF=0;NR=2;PP=40;RMP=66.37;RPV=1.63e-01;SC=AAGGGGCCGGCGTGTGTGTGT;TC=28;TCF=11;TCR=17;TR=2 GT:GL:GQ:NR 0/0:-15.43,-21.66,-115.16:28:17 0/1:-35.79,-15.44,-86.67:86:11 +chr6 26370657 . A G 26 PASS ABPV=1.00e+00;FPV=9.98e-01;FR=0.2500;HP=1;MMLQ=34;NF=25;NR=18;PP=26;RMP=46.67;RPV=9.65e-01;SC=ACAGTGGAGCAACGCCAAGGG;TC=112;TCF=61;TCR=51;TR=43 GT:GL:GQ:NR 0/0:-408.78,-416.97,-671.27:37:70 1/0:-270.25,-255.76,-422.39:61:42 +chr6 26370659 . C T 32 PASS ABPV=1.00e+00;FPV=9.98e-01;FR=0.2500;HP=2;MMLQ=34;NF=25;NR=17;PP=32;RMP=48.69;RPV=9.08e-01;SC=AGTGGAGCAACGCCAAGGGAG;TC=114;TCF=61;TCR=53;TR=42 GT:GL:GQ:NR 0/0:-408.78,-419.23,-664.68:47:70 1/0:-278.07,-262.18,-440.62:67:44 +chr6 35838820 . A ATTCTTACTTGG 44 PASS ABPV=1.42e-01;FPV=7.50e-01;FR=0.2500;HP=1;NF=0;NR=2;PP=44;RMP=90.0;RPV=2.64e-03;SC=CTCTACCAGAATGAAAAGTCT;TC=37;TCF=1;TCR=36;TR=2 GT:GL:GQ:NR 0/0:-22.8,-33.89,-243.84:49:19 1/0:-50.19,-17.08,-221.97:100:21 +chr6 58777098 . A T 42 PASS ABPV=1.00e+00;FPV=2.57e-03;FR=0.2500;HP=2;MMLQ=34;NF=14;NR=25;PP=42;RMP=50.5;RPV=1.85e-01;SC=GTAACTCTAGATTGAAGAATT;TC=224;TCF=105;TCR=119;TR=39;func=intergenic;gene=GUSBP4(dist=489374) NONE(dist=NONE);dbsnp=rs4330557 GT:GL:GQ:NR 0/0:-1161.42,-1180.18,-1411.53:83:106 0/1:-1283.78,-1265.72,-1460.11:76:119 +chr6 116774635 . C G 38 PASS ABPV=1.00e+00;FPV=3.66e-01;FR=0.2504;HP=1;MMLQ=36;NF=4;NR=12;PP=38;RMP=76.7;RPV=4.76e-01;SC=CTTTTTCCACCACAAATTCTT;TC=72;TCF=21;TCR=51;TR=16 GT:GL:GQ:NR 0/0:-45.72,-51.81,-228.46:28:30 0/1:-179.58,-162.43,-353.98:72:42 +chr6 136599000 . T TCATCTGTGA 73 PASS ABPV=2.21e-05;FPV=2.55e-09;FR=0.2505;HP=4;NF=2;NR=0;PP=73;RMP=1.41;RPV=3.11e-04;SC=TTTTAGTTTTTACCTTTTTAA;TC=118;TCF=90;TCR=28;TR=2;func=intronic;gene=BCLAF1;cons46=573 Name=lod=284;segdup=0.97 GT:GL:GQ:NR 0/0:-44.16,-49.89,-603.4:26:61 1/0:-105.25,-67.59,-750.95:100:79 +chr6 155757781 . T A 106 PASS ABPV=1.00e+00;FPV=3.16e-01;FR=0.2504;HP=2;MMLQ=36;NF=0;NR=5;PP=106;RMP=66.42;RPV=6.16e-01;SC=TACAGTGAGCTCTGAAATATC;TC=24;TCF=4;TCR=20;TR=5;func=intronic;gene=NOX3;1000g=0.22;dbsnp=rs231961 GT:GL:GQ:NR 0/0:0.0,-6.09,-69.03:28:9 0/1:-48.54,-15.69,-84.63:100:15 +chr7 65159983 . A G 128 PASS ABPV=1.00e+00;FPV=5.13e-01;FR=0.2500;HP=2;MMLQ=33;NF=9;NR=0;PP=128;RMP=42.05;RPV=1.33e-01;SC=TTGCTTAGTTACCAGGTAGAA;TC=45;TCF=38;TCR=7;TR=9;func=ncRNA;gene=INTS4L2 LOC441242;cons46=439 Name=lod=81;segdup=0.99;1000g=0.26;dbsnp=rs2949280 GT:GL:GQ:NR 0/0:0.0,-9.67,-99.87:43:16 0/1:-63.32,-25.43,-98.84:100:29 +chr7 100552044 . T G 46 PASS ABPV=1.00e+00;FPV=1.00e-00;FR=0.2500;HP=1;MMLQ=33;NF=133;NR=185;PP=46;RMP=54.24;RPV=1.00e-00;SC=CTGTTCCTTCTTCACCATACA;TC=776;TCF=387;TCR=389;TR=318 GT:GL:GQ:NR 0/0:-2768.08,-2799.9,-3980.82:100:373 0/1:-3148.55,-3129.5,-4372.1:80:403 +chr7 102319079 . G A 34 PASS ABPV=4.40e-01;FPV=1.00e+00;FR=0.2500;HP=1;MMLQ=38;NF=0;NR=6;PP=34;RMP=53.53;RPV=6.65e-03;SC=TGTGAGATGCGTGTGAAAATG;TC=56;TCF=0;TCR=56;TR=6;func=intergenic;gene=POLR2J2(dist=6903) FAM185A(dist=70320);segdup=1.00;1000g=0.17;dbsnp=rs62458736 GT:GL:GQ:NR 0/0:-9.39,-20.95,-166.2:51:26 0/1:-46.26,-30.07,-176.58:68:30 +chr7 106272259 . C T 200 PASS ABPV=1.00e+00;FPV=1.51e-04;FR=0.2501;HP=2;MMLQ=31;NF=27;NR=25;PP=200;RMP=18.87;RPV=1.08e-05;SC=CTCATTCCAACCTCTGCTTCC;TC=391;TCF=192;TCR=199;TR=52 GT:GL:GQ:NR 0/0:-1599.11,-1606.25,-1841.06:32:195 0/1:-1703.84,-1621.18,-1787.33:100:196 +chr7 128492558 . G A 32 PASS ABPV=1.00e+00;FPV=9.80e-01;FR=0.2501;HP=6;MMLQ=35;NF=15;NR=1;PP=32;RMP=45.11;RPV=5.34e-01;SC=TGAGTCCAGGGGGGGCTGCTC;TC=45;TCF=39;TCR=6;TR=16 GT:GL:GQ:NR 0/0:-82.82,-89.89,-214.44:32:24 0/1:-137.27,-121.35,-194.99:67:21 +chr7 142223942 . A G 200 PASS ABPV=1.00e+00;FPV=1.00e-00;FR=0.2500;HP=1;MMLQ=33;NF=86;NR=42;PP=200;RMP=48.5;RPV=9.93e-01;SC=ACTGTGAATCATCTACTACAC;TC=282;TCF=160;TCR=122;TR=128 GT:GL:GQ:NR 0/0:-840.21,-856.54,-1228.56:72:124 1/0:-1069.18,-1023.08,-1489.98:100:158 +chr7 142498735 . A C 51 PASS ABPV=1.00e+00;FPV=9.39e-01;FR=0.2500;HP=4;MMLQ=34;NF=23;NR=20;PP=51;RMP=54.1;RPV=9.74e-01;SC=AGGACCTGAAAAACGTGTTCC;TC=127;TCF=71;TCR=56;TR=43;func=intergenic;gene=TRY6(dist=16336) EPHB6(dist=54057);sift=0.35 GT:GL:GQ:NR 0/0:-407.53,-415.97,-666.18:38:67 0/1:-407.94,-387.73,-626.55:86:62 +chr7 143295456 . A C 200 PASS ABPV=1.00e+00;FPV=7.75e-01;FR=0.2500;HP=1;MMLQ=26;NF=24;NR=7;PP=200;RMP=70.65;RPV=6.11e-02;SC=GCCTCCTCGCAGTGGGGGGCA;TC=135;TCF=87;TCR=48;TR=31 GT:GL:GQ:NR 0/0:-28.78,-39.63,-253.37:48:66 0/1:-158.76,-57.73,-187.94:100:69 +chr7 143453710 . T A 66 PASS ABPV=1.00e+00;FPV=5.62e-01;FR=0.2501;HP=3;MMLQ=36;NF=0;NR=15;PP=66;RMP=54.55;RPV=5.68e-01;SC=TCTTCCTTTGTTTTGTCCACT;TC=62;TCF=2;TCR=60;TR=15 GT:GL:GQ:NR 0/0:-65.41,-73.41,-216.2:36:31 0/1:-102.8,-79.18,-187.97:100:31 +chr7 143956461 . T C 37 PASS ABPV=1.00e+00;FPV=8.34e-02;FR=0.2500;HP=2;MMLQ=31;NF=5;NR=0;PP=37;RMP=48.38;RPV=1.00e+00;SC=TGGGCTTGGCTGGATGCAGGA;TC=36;TCF=36;TCR=0;TR=5 GT:GL:GQ:NR 0/0:-6.63,-15.42,-125.53:39:20 1/0:-33.93,-16.96,-77.4:71:16 +chr7 157367205 . TGA T 52 PASS ABPV=3.26e-01;FPV=5.62e-01;FR=0.2503;HP=2;NF=0;NR=2;PP=52;RMP=55.44;RPV=3.19e-02;SC=AGAGTAATAATGAGAGAGAGA;TC=27;TCF=2;TCR=25;TR=2;func=intronic;gene=PTPRN2 GT:GL:GQ:NR 0/0:-10.36,-16.59,-113.87:28:16 1/0:-39.42,-16.12,-59.64:99:12 +chr8 8095880 . C T 131 PASS ABPV=1.00e+00;FPV=2.37e-01;FR=0.2500;HP=3;MMLQ=37;NF=0;NR=10;PP=131;RMP=64.63;RPV=8.71e-01;SC=GCCACATGGCCCCAGGCCCAA;TC=36;TCF=5;TCR=31;TR=10;func=ncRNA;gene=FLJ10661;segdup=0.98 GT:GL:GQ:NR 0/0:-78.8,-87.2,-171.27:38:18 0/1:-81.81,-43.3,-81.08:100:18 +chr8 12236123 . T G 111 PASS ABPV=1.00e+00;FPV=1.38e-39;FR=0.2500;HP=2;MMLQ=30;NF=16;NR=9;PP=111;RMP=18.14;RPV=9.45e-01;SC=GTATTTGTGTTTGTGTGTGTG;TC=103;TCF=79;TCR=24;TR=25 GT:GL:GQ:NR 0/0:-265.16,-270.76,-457.35:100:49 1/0:-317.4,-305.02,-585.97:25:76 +chr8 12428634 . C T 69 PASS ABPV=1.00e+00;FPV=7.50e-01;FR=0.2500;HP=1;MMLQ=36;NF=0;NR=5;PP=69;RMP=63.98;RPV=2.03e-01;SC=TCTTAACAACCGCCATGGTGC;TC=31;TCF=1;TCR=30;TR=5 GT:GL:GQ:NR 0/0:-10.77,-21.63,-134.62:48:17 1/0:-41.03,-16.59,-80.89:100:14 +chr8 35608374 . T C 24 PASS ABPV=1.00e+00;FPV=6.32e-01;FR=0.2502;HP=2;MMLQ=34;NF=1;NR=34;PP=24;RMP=69.53;RPV=1.00e-00;SC=TGAAAGTGTGTGTTTTCCAAA;TC=62;TCF=5;TCR=57;TR=35 GT:GL:GQ:NR 0/0:-248.65,-255.21,-376.27:30:35 1/0:-265.91,-251.92,-307.04:58:27 +chr8 121500323 . A AGTGGGATTGC 40 PASS ABPV=2.19e-01;FPV=8.43e-03;FR=0.2500;HP=2;NF=2;NR=0;PP=40;RMP=1.0;RPV=7.50e-01;SC=ATTATATCCTATGGATCAAAT;TC=32;TCF=31;TCR=1;TR=2 GT:GL:GQ:NR 0/0:-2.07,-11.08,-162.96:40:13 1/0:-47.66,-16.63,-264.67:100:25 +chr9 14510 . CTGT C 200 PASS ABPV=2.20e-01;FPV=4.66e-14;FR=0.2500;HP=1;NF=12;NR=0;PP=200;RMP=43.31;RPV=1.00e-02;SC=TAAAAGCACACTGTTGGTTTC;TC=123;TCF=107;TCR=16;TR=12 GT:GL:GQ:NR 0/0:-22.04,-38.67,-350.71:73:53 0/1:-133.83,-67.48,-425.73:100:75 +chr9 34724786 . G A 54 PASS ABPV=1.00e+00;FPV=5.46e-01;FR=0.2503;HP=2;MMLQ=31;NF=10;NR=18;PP=54;RMP=64.11;RPV=9.71e-01;SC=GGATTTCCACGGGACTAGGCT;TC=91;TCF=41;TCR=50;TR=28 GT:GL:GQ:NR 0/0:-77.92,-84.2,-224.15:29:46 1/0:-101.32,-80.48,-207.58:88:45 +chr9 44118498 . G C 200 PASS ABPV=1.00e+00;FPV=9.49e-01;FR=0.2503;HP=2;MMLQ=34;NF=2;NR=7;PP=200;RMP=65.44;RPV=6.41e-01;SC=GAGGGCAGCTGCCTGTCACCT;TC=31;TCF=4;TCR=27;TR=9;func=intergenic;gene=CNTNAP3B(dist=196025) FAM27C(dist=871738);segdup=0.98;1000g=0.77;dbsnp=rs28610048 GT:GL:GQ:NR 0/0:-11.97,-18.32,-91.33:29:13 0/1:-73.63,-27.61,-81.59:100:18 +chr9 67281836 . T G 200 PASS ABPV=1.00e+00;FPV=3.12e-01;FR=0.2500;HP=2;MMLQ=34;NF=6;NR=21;PP=200;RMP=63.02;RPV=5.58e-01;SC=GTGGACCTGATACAGTGGCCC;TC=115;TCF=31;TCR=84;TR=27;func=ncRNA;gene=AQP7P1;segdup=0.99;1000g=0.26;dbsnp=rs75812522 GT:GL:GQ:NR 0/0:-227.43,-240.42,-365.47:58:50 0/1:-353.09,-303.78,-464.7:100:65 +chr9 67293649 . T G 200 PASS ABPV=1.00e+00;FPV=2.40e-02;FR=0.2509;HP=2;MMLQ=32;NF=8;NR=20;PP=200;RMP=65.85;RPV=6.29e-01;SC=GTGTGCCAAGTGACTTCATCT;TC=136;TCF=59;TCR=77;TR=28 GT:GL:GQ:NR 0/0:-52.46,-57.7,-399.51:24:62 0/1:-141.44,-82.05,-400.07:100:74 +chr9 68358140 . T C 101 PASS ABPV=1.00e+00;FPV=4.09e-01;FR=0.2501;HP=2;MMLQ=31;NF=10;NR=13;PP=101;RMP=52.55;RPV=9.14e-01;SC=CCGCTTCAGATAGTGAAGAAG;TC=84;TCF=45;TCR=39;TR=23;func=intergenic;gene=ANKRD20A3(dist=387847) LOC642236(dist=69643);cons46=780 Name=lod=1967;segdup=0.98;dbsnp=rs62544188 GT:GL:GQ:NR 0/0:-99.49,-107.4,-306.63:36:46 0/1:-122.69,-91.06,-221.21:100:38 +chr9 92995102 . C T 25 PASS ABPV=1.74e-02;FPV=2.34e-06;FR=0.2500;HP=3;MMLQ=33;NF=11;NR=10;PP=25;RMP=36.17;RPV=2.75e-07;SC=ATAAAATTGTCCCCTCCATTC;TC=258;TCF=127;TCR=131;TR=21;func=intergenic;gene=LOC286370(dist=191321) LOC340515(dist=229612);segdup=0.96 GT:GL:GQ:NR 0/0:-127.8,-170.89,-839.43:100:127 1/0:-164.37,-150.07,-829.28:60:131 +chr9 139572068 . C G 44 PASS ABPV=1.00e+00;FPV=4.21e-01;FR=0.2507;HP=2;MMLQ=29;NF=0;NR=3;PP=44;RMP=57.58;RPV=7.11e-01;SC=GGCTGGGGCGCGAAGGCCTGG;TC=14;TCF=3;TCR=11;TR=3;func=intronic;gene=AGPAT2;1000g=0.57;dbsnp=rs2236514 GT:GL:GQ:NR 0/0:0.0,-5.54,-62.14:25:9 1/0:-29.67,-11.06,-23.48:61:5 +chr9 140777194 . A AGAGCGGCT 200 PASS ABPV=7.76e-05;FPV=4.77e-24;FR=0.2500;HP=2;NF=2;NR=1;PP=200;RMP=4.36;RPV=2.92e-05;SC=CGCTTCTCCTAGGACGACACG;TC=123;TCF=77;TCR=46;TR=3;func=splicing;gene=CACNA1B(NM_000718:c.390-2->CATGTCCGAGCGGCT NM_001243812:c.390-2->CATGTCCGAGCGGCT);cons46=573 Name=lod=285 GT:GL:GQ:NR 0/0:-260.4,-275.23,-819.04:71:85 0/1:-510.15,-408.95,-886.86:3:93 +chrUn_gl000214 53458 . T A 82 PASS ABPV=4.34e-01;FPV=7.36e-06;FR=0.2500;HP=4;MMLQ=34;NF=22;NR=0;PP=82;RMP=47.4;RPV=5.62e-01;SC=AAACACTATATAAATATAATT;TC=187;TCF=185;TCR=2;TR=22;func=intergenic;gene=NONE(dist=NONE) NONE(dist=NONE);segdup=0.98 GT:GL:GQ:NR 0/0:-154.3,-180.61,-694.01:100:88 1/0:-304.62,-277.18,-752.95:100:99 +chrUn_gl000214 61035 . A G 25 PASS ABPV=2.68e-01;FPV=1.27e-06;FR=0.2500;HP=2;MMLQ=34;NF=20;NR=0;PP=25;RMP=60.63;RPV=4.22e-01;SC=ATGTTTACCTATATAACAAAC;TC=187;TCF=184;TCR=3;TR=20 GT:GL:GQ:NR 0/0:-517.15,-538.58,-910.78:94:80 0/1:-812.82,-798.54,-1242.08:60:107 +chrUn_gl000214 74804 . T C 45 PASS ABPV=5.69e-01;FPV=4.33e-02;FR=0.2500;HP=2;MMLQ=35;NF=5;NR=0;PP=45;RMP=36.66;RPV=5.62e-01;SC=ATCACTTGAATGCAGTAGGCA;TC=42;TCF=40;TCR=2;TR=5 GT:GL:GQ:NR 0/0:-65.35,-75.06,-177.61:43:16 0/1:-180.67,-161.94,-279.38:79:26 +chrUn_gl000220 121703 . T C 75 PASS ABPV=9.31e-02;FPV=1.94e-05;FR=0.2500;HP=2;MMLQ=31;NF=5;NR=8;PP=75;RMP=52.13;RPV=2.81e-03;SC=GTGGGCACGGTACGCTCTGGT;TC=150;TCF=78;TCR=72;TR=13 GT:GL:GQ:NR 0/0:-64.92,-78.18,-505.13:59:80 1/0:-102.59,-76.78,-453.86:100:70 +chrUn_gl000220 128026 . C T 73 PASS ABPV=1.00e+00;FPV=1.39e-05;FR=0.2500;HP=1;MMLQ=37;NF=12;NR=5;PP=73;RMP=48.23;RPV=2.65e-03;SC=TCTCTGTCTCCGTCTCTGTCT;TC=117;TCF=62;TCR=55;TR=17 GT:GL:GQ:NR 0/0:-175.58,-193.94,-521.81:81:62 1/0:-151.61,-126.36,-397.61:100:57 +chrUn_gl000220 132074 . G A 200 PASS ABPV=1.00e+00;FPV=2.39e-03;FR=0.2500;HP=2;MMLQ=34;NF=10;NR=11;PP=200;RMP=61.51;RPV=6.72e-03;SC=CTCTCTGTCCGTCTCTGTCTT;TC=167;TCF=84;TCR=83;TR=21;func=intergenic;gene=LOC100507412(dist=5378) RN5-8S1(dist=23923);segdup=0.95 GT:GL:GQ:NR 0/0:-248.2,-257.69,-615.12:42:77 0/1:-290.71,-234.79,-658.31:100:90 +chrUn_gl000220 145002 . C T 28 PASS ABPV=3.17e-02;FPV=7.56e-08;FR=0.2500;HP=4;MMLQ=31;NF=1;NR=3;PP=28;RMP=65.86;RPV=4.70e-03;SC=ACTAGCCGGGCGCGGTGGCAC;TC=76;TCF=36;TCR=40;TR=4 GT:GL:GQ:NR 0/0:-17.73,-43.17,-320.69:100:46 1/0:-67.96,-52.99,-236.43:63:37 +chrUn_gl000220 145368 . T C 30 PASS ABPV=1.09e-01;FPV=1.31e-02;FR=0.2500;HP=1;MMLQ=29;NF=8;NR=2;PP=30;RMP=72.81;RPV=1.92e-05;SC=AGCCGGGCGCTGTGCTGTGCT;TC=119;TCF=63;TCR=56;TR=10;func=intergenic;gene=LOC100507412(dist=18672) RN5-8S1(dist=10629);dbsnp=rs3878955 GT:GL:GQ:NR 0/0:-48.56,-59.69,-409.13:50:53 0/1:-66.74,-51.46,-448.03:64:66 +chrUn_gl000225 30398 . C T 29 PASS ABPV=1.13e-01;FPV=3.15e-04;FR=0.2502;HP=1;MMLQ=33;NF=1;NR=5;PP=29;RMP=58.12;RPV=2.55e-02;SC=CCTGCTCCTCCGAGCCTTTGA;TC=80;TCF=37;TCR=43;TR=6 GT:GL:GQ:NR 0/0:-195.73,-202.53,-342.72:31:35 1/0:-230.45,-215.31,-371.74:63:45 +chrUn_gl000225 43193 . C T 46 PASS ABPV=1.00e+00;FPV=7.84e-02;FR=0.2507;HP=3;MMLQ=31;NF=8;NR=12;PP=46;RMP=44.42;RPV=4.19e-02;SC=GCCAGAGAGACGGGCCTCCCG;TC=126;TCF=51;TCR=75;TR=20 GT:GL:GQ:NR 0/0:-577.5,-583.01,-743.98:25:63 1/0:-604.31,-585.16,-703.98:81:63 +chrX 106390898 . G A 65 PASS ABPV=4.78e-01;FPV=1.49e-02;FR=0.2500;HP=1;MMLQ=39;NF=5;NR=0;PP=65;RMP=43.16;RPV=1.00e+00;SC=GTTTGGTCATGGAGCATACAA;TC=46;TCF=46;TCR=0;TR=5 GT:GL:GQ:NR 0/0:0.0,-11.78,-148.84:52:17 1/0:-49.23,-25.85,-211.17:99:29 diff --git a/tests/tabix_data/vcf/15.vcf b/tests/tabix_data/vcf/15.vcf new file mode 100644 index 0000000..9df9a1e --- /dev/null +++ b/tests/tabix_data/vcf/15.vcf @@ -0,0 +1,317 @@ +##fileformat=VCFv4.0 +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##ValidationMetrics_HardyWeinbergViolations="25 (8%)" +##ValidationMetrics_HomVarViolations="0 (0%)" +##ValidationMetrics_NoCallViolations="13 (4%)" +##ValidationMetrics_PolymorphicPassingRecords="195 (75%)" +##ValidationMetrics_RecordsPassingFilters="258 (87%)" +##ValidationMetrics_RecordsProcessed=296 +##ValidationMetrics_SamplesAssayed=383 +##VariantValidationAssessor="analysis_type=VariantValidationAssessor input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[rawData/plink.renamed.sorted.fixed.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub maxHardy=20.0 maxNoCall=0.05 maxHomVar=1.1" +##source=PLINK +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00127 HG00128 HG00136 HG00137 HG00138 HG00139 HG00152 HG00156 HG00234 HG00235 HG00237 HG00242 HG00244 HG00262 HG01055 HG01079 NA19138 NA18974 NA18523 NA12717 NA19209 NA18577 NA18973 NA18943 NA12873 NA18623 NA18622 NA18948 NA19171 NA19204 NA06994 NA18563 NA18547 NA18861 NA18608 NA18995 NA10851 NA18976 NA18603 NA19200 HG01204 HG01191 HG01101 HG00146 HG00306 NA18985 HG00160 HG00635 HG00372 HG00357 HG00634 NA18541 NA18950 NA19759 HG00351 HG00257 HG00118 HG00336 HG00448 HG01354 NA18609 HG00428 HG00326 NA11894 NA18956 HG00173 HG00117 NA11893 HG01251 HG01441 HG01437 HG00182 HG00330 HG01060 HG00329 NA18960 NA18856 NA07346 NA18871 NA19057 NA18868 NA18636 NA12830 NA19007 NA18910 NA18874 NA19056 NA19064 NA19066 NA18487 NA18642 NA19236 NA07056 NA18637 NA19235 NA19309 NA19311 NA19334 NA19346 NA19347 NA19372 NA19376 NA19383 NA19384 NA19394 NA19428 NA19430 NA19451 NA19466 NA19313 NA19321 NA19324 NA19332 NA19390 NA19436 NA19439 NA19440 NA19463 NA19470 NA19471 NA19472 NA19676 NA19660 NA19661 NA19663 NA19722 NA19725 NA19728 NA19729 NA19731 NA19749 NA19755 NA19756 NA19758 NA19770 NA19773 NA19777 NA19780 NA19783 NA20525 NA20589 NA20765 NA20802 NA20804 NA18544 NA18602 NA18546 NA18610 NA18957 NA18615 NA18616 NA19010 NA18638 NA18639 NA18627 NA19072 NA18630 NA19074 NA19080 NA19081 NA19083 NA19085 NA19088 NA20287 NA19835 NA20276 NA19818 NA20278 NA20282 NA20342 NA20296 NA20314 NA20346 NA19712 NA19198 NA19108 NA18934 NA18916 NA18907 NA18917 NA06989 NA12058 NA12341 NA12546 NA12489 HG01197 NA18983 NA11843 NA11892 NA12749 NA12282 NA12751 NA18959 NA19331 NA19453 NA20537 NA12046 NA20515 NA20516 NA20521 NA20524 NA20528 NA20759 NA20768 NA20769 NA20774 NA20775 NA20783 NA20787 NA20790 NA20800 NA20819 NA20812 NA20505 NA20530 NA20540 NA20538 NA20581 NA20815 NA20544 NA20810 NA20807 NA20816 NA20504 NA20753 NA20502 NA12342 NA19150 NA19468 NA20336 NA19395 NA19257 NA19360 NA19700 NA18867 NA20317 NA18968 NA19107 HG00111 HG00108 NA19077 NA19684 NA18511 NA12044 NA19382 NA19457 NA18933 NA18923 NA18965 HG00141 NA20341 NA18740 HG00537 HG00346 HG01173 HG00702 HG00313 HG00150 NA18612 HG00339 NA12273 HG00250 NA18593 NA18621 HG00478 HG00251 HG01070 NA19160 HG00479 HG00608 NA18573 HG00375 NA19248 NA19093 HG01170 HG00534 HG01171 HG01522 NA18624 HG00683 HG01521 NA19005 NA20412 NA18971 HG00446 NA12748 HG00530 HG00690 HG01356 HG01516 NA20532 HG00344 HG00328 NA18542 HG00254 HG00321 HG00577 HG00656 HG00342 HG00524 HG00650 HG00557 HG00319 HG00457 HG00125 HG00578 HG00543 HG00638 HG00171 HG00699 HG00595 HG00187 HG00704 HG00533 HG00596 HG00268 HG01083 HG00651 HG01133 HG00671 HG00327 HG01148 HG00246 HG00672 HG00556 HG00436 HG00554 NA18633 NA20344 NA11993 NA07037 NA11930 HG01366 HG01389 HG00620 NA19740 HG00190 HG00419 NA18535 HG01495 NA18592 HG01497 HG00174 HG01140 NA12287 HG00689 HG01550 HG00334 HG01375 HG00637 NA18507 HG01113 NA18550 NA19129 HG01551 HG01462 HG00331 NA12413 HG01456 HG01360 HG00708 HG01350 HG00684 NA19099 HG00284 NA12399 NA12286 NA12777 HG00277 HG00266 NA19985 HG00353 HG01102 NA07347 NA07051 NA19900 NA18984 NA07048 HG00640 HG01066 NA12812 HG01174 HG01188 +20 439104 . AG A . HighNoCallRate AC=0;AN=158;HW=0.00;HetPct=0.0;HomRefPct=20.6;HomVarPct=0.0;NoCallPct=79.4 GT . 0/0 . . . . 0/0 . 0/0 . 0/0 0/0 . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 . . . . . . . . . . . . 0/0 0/0 . . . . . . . . . . . . . . . . . . . 0/0 0/0 . . 0/0 . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 . . 0/0 0/0 . . . . . . . . . . . 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 . . . . . . 0/0 . . . . . 0/0 0/0 0/0 0/0 . . . . . . . . . . 0/0 . . . . 0/0 . . 0/0 . . 0/0 0/0 0/0 . . 0/0 . . . . 0/0 . . . . . . . . . . . . . . . . 0/0 . . . . . 0/0 0/0 . 0/0 0/0 . . . . . . . . . 0/0 . 0/0 . . . . . 0/0 0/0 . 0/0 . . . . 0/0 . . . . 0/0 . . . . . . . . . . . . 0/0 . 0/0 . . . 0/0 . . . . 0/0 0/0 . 0/0 . . . . . 0/0 . . 0/0 . 0/0 . . . . . . 0/0 . . . 0/0 . 0/0 . . 0/0 . 0/0 . . 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 . . . . . . +20 669442 . TG T . PASS AC=54;AN=766;HW=6.74;HetPct=12.0;HomRefPct=86.9;HomVarPct=1.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 676148 . A AC . PASS AC=0;AN=758;HW=0.00;HetPct=0.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 719486 . C CT . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 890696 . C CAT . PASS AC=6;AN=766;HW=0.00;HetPct=1.6;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1102516 . CT C . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1149576 . CT C . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1195706 . AAG A . PASS AC=334;AN=764;HW=9.47;HetPct=44.9;HomRefPct=33.7;HomVarPct=21.1;NoCallPct=0.3 GT 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 . 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 1/1 +20 1342549 . A AAGAT . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1366475 . CT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1390810 . T TTC . HighNoCallRate AC=0;AN=566;HW=0.00;HetPct=0.0;HomRefPct=73.9;HomVarPct=0.0;NoCallPct=26.1 GT 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 . 0/0 . . . . . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 . . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . . . 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 . . 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 . . . 0/0 0/0 . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . 0/0 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 +20 1550416 . C CT . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1655540 . AT A . PASS AC=4;AN=764;HW=0.00;HetPct=1.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 2133769 . GA G . HardyWeinbergViolation AC=379;AN=766;HW=85.69;HetPct=34.7;HomRefPct=33.2;HomVarPct=32.1;NoCallPct=0.0 GT 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 1/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 +20 2217137 . CT C . HighNoCallRate AC=0;AN=704;HW=0.00;HetPct=0.0;HomRefPct=91.9;HomVarPct=0.0;NoCallPct=8.1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 +20 2263095 . TG T . HardyWeinbergViolation AC=358;AN=766;HW=812.29;HetPct=93.5;HomRefPct=6.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 +20 2426886 . G GAATT . HighNoCallRate AC=11;AN=680;HW=0.00;HetPct=2.9;HomRefPct=85.9;HomVarPct=0.0;NoCallPct=11.2 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/1 . 0/1 . 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . . . 0/0 0/0 . 0/0 0/0 0/0 0/0 . . . 0/1 . . 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 +20 2889034 . AAAAT A . PASS AC=6;AN=762;HW=0.00;HetPct=1.6;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 3203741 . CT C . PASS AC=4;AN=762;HW=0.00;HetPct=1.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 3327993 . CAA C . HardyWeinbergViolation AC=3;AN=766;HW=21.06;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.3;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 3700705 . CTTTGGG C . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4037626 . TC T . PASS AC=194;AN=764;HW=14.70;HetPct=33.4;HomRefPct=57.7;HomVarPct=8.6;NoCallPct=0.3 GT 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 . 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 +20 4210074 . G GA . PASS AC=197;AN=762;HW=14.95;HetPct=33.7;HomRefPct=56.9;HomVarPct=8.9;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 . 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 +20 4363519 . CATT C . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4366806 . CAAAT C . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4641550 . CCTTGA C . PASS AC=3;AN=766;HW=0.00;HetPct=0.8;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5105482 . C CATTTTAGG . PASS AC=101;AN=762;HW=14.11;HetPct=20.1;HomRefPct=76.2;HomVarPct=3.1;NoCallPct=0.5 GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 5289619 . GA G . PASS AC=377;AN=764;HW=5.70;HetPct=53.0;HomRefPct=24.0;HomVarPct=22.7;NoCallPct=0.3 GT 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/0 1/1 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 . 0/0 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/1 0/0 +20 5416109 . CA C . PASS AC=2;AN=752;HW=0.00;HetPct=0.5;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=1.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5432262 . AGT A . PASS AC=4;AN=752;HW=0.00;HetPct=1.0;HomRefPct=97.1;HomVarPct=0.0;NoCallPct=1.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5724449 . T TC . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5928403 . T TA . HardyWeinbergViolation AC=196;AN=762;HW=47.13;HetPct=29.2;HomRefPct=59.3;HomVarPct=11.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 1/1 0/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 6877907 . CA C . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 6969412 . CAAAGAAT C . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7035110 . CT C . HardyWeinbergViolation AC=340;AN=758;HW=1038.45;HetPct=1.0;HomRefPct=54.0;HomVarPct=43.9;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 1/1 1/1 0/0 0/0 1/1 0/0 1/1 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 1/1 0/0 1/1 1/1 1/1 0/0 0/0 1/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 1/1 0/0 0/0 1/1 1/1 1/1 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/1 0/0 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 1/1 1/1 1/1 1/1 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 1/1 1/1 0/0 0/0 1/1 0/0 1/1 1/1 0/0 0/0 0/0 1/1 0/0 0/0 1/1 1/1 0/0 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 0/0 0/0 1/1 1/1 1/1 1/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 1/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 1/1 . 0/0 . 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 1/1 1/1 0/0 1/1 1/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 1/1 0/0 0/0 1/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 1/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/0 0/0 1/1 . 1/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 1/1 0/0 1/1 0/0 0/0 1/1 1/1 1/1 0/0 0/1 1/1 0/0 0/0 0/0 1/1 0/0 1/1 0/0 1/1 1/1 1/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 1/1 0/0 1/1 +20 7229260 . T TA . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7239075 . AG A . PASS AC=5;AN=766;HW=0.00;HetPct=1.3;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7942727 . A AC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7950562 . C CT . PASS AC=4;AN=760;HW=18.01;HetPct=0.5;HomRefPct=98.4;HomVarPct=0.3;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8195466 . C CT . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8233352 . TACTC T . PASS AC=56;AN=764;HW=1.84;HetPct=13.1;HomRefPct=85.9;HomVarPct=0.8;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 8504000 . TAG T . PASS AC=5;AN=762;HW=0.00;HetPct=1.3;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8779672 . TG T . HighNoCallRate AC=0;AN=86;HW=0.00;HetPct=0.0;HomRefPct=11.2;HomVarPct=0.0;NoCallPct=88.8 GT . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . 0/0 . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 . . . 0/0 . 0/0 . . . 0/0 . . . . . . . 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . 0/0 0/0 0/0 0/0 . . . 0/0 . . . . . 0/0 0/0 . . . . 0/0 . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . 0/0 . . . . 0/0 . . . . . . . . . 0/0 . 0/0 . 0/0 0/0 . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . 0/0 . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . 0/0 0/0 . 0/0 . . 0/0 . . . 0/0 . . . . . . . . . . . 0/0 . . . . . . . . . . . +20 8794142 . AG A . HardyWeinbergViolation AC=52;AN=756;HW=57.86;HetPct=8.4;HomRefPct=87.7;HomVarPct=2.6;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 9231138 . AT A . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9900218 . C CT . HardyWeinbergViolation AC=3;AN=766;HW=21.06;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.3;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9921724 . AAAGT A . PASS AC=11;AN=758;HW=0.00;HetPct=2.9;HomRefPct=96.1;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9925738 . T TG . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10090376 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10377174 . ATAAAAC A . HighNoCallRate AC=107;AN=514;HW=4.54;HetPct=20.6;HomRefPct=42.8;HomVarPct=3.7;NoCallPct=32.9 GT . . 0/0 0/0 . 0/0 . 0/1 . 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . . . . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 . 0/1 0/0 . . 0/0 . 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 . . 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 . . . . . . 0/0 . 1/1 . 0/0 . 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 . . . . 0/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 . . 0/0 . . . . . 0/0 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/1 . . . . . 0/0 . 0/1 0/1 . . 0/0 0/0 0/0 . 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/1 0/1 . 0/1 0/1 0/0 . 0/1 0/0 . . 0/0 . . . . . 0/0 0/1 0/1 0/0 0/1 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 . . . 0/0 0/0 0/0 0/1 . . 0/1 . . . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 . . 0/1 . . . . . . . . . . . 0/1 0/0 . 0/0 . 0/1 0/1 . . . . . . . . . . 0/0 0/1 . . 0/0 . 0/0 . . . 0/1 . . . 0/1 . . 0/1 . . . . 0/0 . 0/1 0/0 . 0/1 . 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 . . . 1/1 0/1 . . 0/0 . 0/0 0/0 0/0 0/0 0/1 . 0/1 0/1 . . 0/0 0/0 0/0 0/0 0/1 0/0 +20 11229169 . T TA . PASS AC=3;AN=756;HW=0.00;HetPct=0.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11511920 . AC A . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11893900 . ATTAG A . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12021825 . A AG . PASS AC=5;AN=756;HW=0.00;HetPct=1.3;HomRefPct=97.4;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12063752 . CTT C . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12094344 . TCAGGAGGC T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12114989 . CTA C . PASS AC=4;AN=764;HW=0.00;HetPct=1.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12371546 . GACA G . PASS AC=10;AN=762;HW=0.00;HetPct=2.6;HomRefPct=96.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12512723 . G GTT . PASS AC=6;AN=762;HW=0.00;HetPct=1.6;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12634463 . TGA T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12692743 . TTATC T . PASS AC=8;AN=762;HW=0.00;HetPct=2.1;HomRefPct=97.4;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12837095 . G GA . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12928028 . TG T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13003323 . GGGA G . PASS AC=3;AN=762;HW=0.00;HetPct=0.8;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13128894 . CT C . PASS AC=10;AN=764;HW=0.00;HetPct=2.6;HomRefPct=97.1;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 +20 13287841 . CAT C . PASS AC=134;AN=760;HW=0.21;HetPct=29.2;HomRefPct=67.1;HomVarPct=2.9;NoCallPct=0.8 GT 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 1/1 0/1 0/1 . 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 +20 13365589 . T TG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13566260 . AAATTG A . PASS AC=374;AN=764;HW=3.95;HetPct=47.5;HomRefPct=27.2;HomVarPct=25.1;NoCallPct=0.3 GT 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/0 0/1 . 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/1 1/1 1/1 +20 13685184 . AT A . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13716193 . GAGAA G . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13926445 . TA T . PASS AC=0;AN=756;HW=0.00;HetPct=0.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13960028 . TC T . PASS AC=188;AN=750;HW=2.44;HetPct=35.5;HomRefPct=55.6;HomVarPct=6.8;NoCallPct=2.1 GT 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 . 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . . 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 +20 14159734 . T TA . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14287634 . AGT A . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14383135 . TA T . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14420574 . GA G . HardyWeinbergViolation AC=3;AN=766;HW=21.06;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.3;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14669226 . G GA . PASS AC=121;AN=766;HW=1.68;HetPct=25.8;HomRefPct=71.3;HomVarPct=2.9;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 +20 14697473 . TTC T . PASS AC=9;AN=764;HW=10.31;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14983337 . AGCC A . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15037520 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15141272 . T TC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15189597 . GA G . PASS AC=311;AN=760;HW=2.80;HetPct=46.2;HomRefPct=35.5;HomVarPct=17.5;NoCallPct=0.8 GT 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 . 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 . 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 . 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 +20 15265098 . TG T . PASS AC=125;AN=766;HW=6.76;HetPct=25.3;HomRefPct=71.0;HomVarPct=3.7;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 +20 15410763 . TGA T . PASS AC=29;AN=764;HW=0.00;HetPct=7.6;HomRefPct=92.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15543319 . AG A . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 15550845 . TG T . PASS AC=34;AN=756;HW=0.00;HetPct=8.4;HomRefPct=90.1;HomVarPct=0.3;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15703503 . TG T . PASS AC=87;AN=750;HW=3.63;HetPct=19.1;HomRefPct=77.0;HomVarPct=1.8;NoCallPct=2.1 GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/1 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 . 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15871330 . AG A . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16016504 . TA T . PASS AC=186;AN=764;HW=15.27;HetPct=32.4;HomRefPct=59.3;HomVarPct=8.1;NoCallPct=0.3 GT 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +20 16172883 . G GTAGC . HardyWeinbergViolation AC=79;AN=762;HW=42.59;HetPct=13.8;HomRefPct=82.2;HomVarPct=3.4;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16192114 . AT A . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16259934 . C CAA . PASS AC=0;AN=758;HW=0.00;HetPct=0.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16312599 . CTA C . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16723642 . GGTT G . PASS AC=6;AN=760;HW=0.00;HetPct=1.6;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16747221 . CA C . PASS AC=291;AN=764;HW=3.13;HetPct=45.2;HomRefPct=39.2;HomVarPct=15.4;NoCallPct=0.3 GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 . 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 +20 16769262 . TTTC T . HighNoCallRate AC=8;AN=600;HW=0.00;HetPct=2.1;HomRefPct=76.2;HomVarPct=0.0;NoCallPct=21.7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . . 0/1 . . 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/0 0/1 . 0/1 . . 0/1 0/0 0/0 . . . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/1 . . 0/0 0/0 . 0/0 0/0 . 0/0 . . . . . 0/0 . . . 0/0 0/0 0/0 . . 0/0 . . . 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 . . 0/0 . . 0/0 0/0 0/0 0/0 . 0/0 . . . 0/0 0/0 . 0/0 0/0 0/0 0/0 . . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16813850 . C CA . PASS AC=7;AN=758;HW=0.00;HetPct=1.8;HomRefPct=97.1;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17250858 . T TC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17331332 . TA T . PASS AC=80;AN=762;HW=15.60;HetPct=16.2;HomRefPct=80.9;HomVarPct=2.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 17473782 . TGC T . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17607627 . A AGT . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 17753474 . C CA . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18417481 . AC A . PASS AC=17;AN=766;HW=0.00;HetPct=4.4;HomRefPct=95.6;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 18445795 . AAG A . PASS AC=5;AN=760;HW=0.00;HetPct=1.3;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18520672 . A ATT . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18522725 . ATTAAC A . PASS AC=1;AN=758;HW=0.00;HetPct=0.3;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18915562 . TAA T . PASS AC=3;AN=762;HW=0.00;HetPct=0.8;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19111235 . C CT . PASS AC=4;AN=764;HW=0.00;HetPct=1.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19157532 . T TC . HardyWeinbergViolation AC=3;AN=760;HW=21.02;HetPct=0.3;HomRefPct=98.7;HomVarPct=0.3;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19188693 . T TC . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19437778 . GGCCTGGGATGTAAA G . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19805154 . CCTT C . PASS AC=3;AN=766;HW=0.00;HetPct=0.8;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20030869 . CT C . PASS AC=362;AN=766;HW=6.74;HetPct=46.5;HomRefPct=29.5;HomVarPct=24.0;NoCallPct=0.0 GT 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 +20 20286529 . A AC . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20404656 . ATTACAGACT A . PASS AC=7;AN=766;HW=0.00;HetPct=1.8;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20434198 . TA T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20716329 . CA C . PASS AC=4;AN=760;HW=0.00;HetPct=1.0;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20760474 . TG T . PASS AC=15;AN=764;HW=5.83;HetPct=3.4;HomRefPct=96.1;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 20952825 . T TC . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20990240 . TC T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21406859 . ACTT A . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21480245 . AG A . PASS AC=1;AN=766;HW=0.00;HetPct=0.3;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21852048 . CA C . PASS AC=330;AN=762;HW=4.15;HetPct=46.5;HomRefPct=33.2;HomVarPct=19.8;NoCallPct=0.5 GT 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 . 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 . 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 +20 21968507 . AC A . PASS AC=7;AN=762;HW=12.61;HetPct=1.3;HomRefPct=97.9;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 22411326 . CA C . HardyWeinbergViolation AC=321;AN=762;HW=136.49;HetPct=29.5;HomRefPct=42.8;HomVarPct=27.2;NoCallPct=0.5 GT 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 . 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/0 0/0 1/1 1/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/1 +20 22434333 . C CA . PASS AC=8;AN=766;HW=0.00;HetPct=2.1;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 22637424 . C CAGCCA . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 22655862 . TATC T . PASS AC=6;AN=766;HW=0.00;HetPct=1.6;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23169038 . TGTC T . HardyWeinbergViolation AC=380;AN=766;HW=1034.24;HetPct=98.7;HomRefPct=1.0;HomVarPct=0.3;NoCallPct=0.0 GT 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 +20 23200197 . ATT A . PASS AC=1;AN=766;HW=0.00;HetPct=0.3;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23293728 . CA C . PASS AC=8;AN=754;HW=11.33;HetPct=1.6;HomRefPct=96.6;HomVarPct=0.3;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23319459 . CAT C . HardyWeinbergViolation AC=10;AN=766;HW=26.72;HetPct=1.6;HomRefPct=97.9;HomVarPct=0.5;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23813095 . CT C . PASS AC=26;AN=762;HW=1.46;HetPct=6.3;HomRefPct=93.0;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 23815381 . CT C . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23889003 . GA G . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24541328 . TA T . HighNoCallRate AC=0;AN=430;HW=0.00;HetPct=0.0;HomRefPct=56.1;HomVarPct=0.0;NoCallPct=43.9 GT . 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . . . . 0/0 0/0 . . . 0/0 . . . . 0/0 0/0 . . . . 0/0 0/0 0/0 . . . 0/0 . . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . . 0/0 . . . 0/0 0/0 . . 0/0 0/0 . 0/0 . . 0/0 . 0/0 0/0 . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 . 0/0 . . . . . . 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . . . . . . 0/0 . 0/0 0/0 0/0 0/0 . . . 0/0 . . . . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 . . . . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . . . 0/0 . . . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 0/0 . . 0/0 . . 0/0 . 0/0 . 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 . 0/0 . . 0/0 . . . . . . 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . . . 0/0 . . 0/0 0/0 . . 0/0 . . . 0/0 . 0/0 0/0 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . 0/0 . 0/0 0/0 0/0 . . . 0/0 0/0 0/0 . 0/0 . 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 . 0/0 0/0 . 0/0 +20 24710482 . GT G . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24855121 . CT C . PASS AC=6;AN=760;HW=0.00;HetPct=1.6;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25283938 . A AG . HardyWeinbergViolation AC=326;AN=762;HW=30.59;HetPct=40.2;HomRefPct=36.8;HomVarPct=22.5;NoCallPct=0.5 GT 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 1/1 1/1 1/1 . 0/1 . 0/0 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 1/1 +20 25503211 . CATA C . PASS AC=1;AN=758;HW=0.00;HetPct=0.3;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25905250 . GT G . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29589873 . CCTT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29628180 . C CCACAAGAAG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29804699 . A AC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29913425 . TATATC T . PASS AC=15;AN=762;HW=5.82;HetPct=3.4;HomRefPct=95.8;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30390854 . TTATACTA T . PASS AC=3;AN=766;HW=0.00;HetPct=0.8;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30534847 . ACAAT A . PASS AC=2;AN=764;HW=0.00;HetPct=0.5;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30567910 . T TG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31412616 . CT C . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31760870 . CG C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31881479 . AG A . HardyWeinbergViolation AC=40;AN=764;HW=34.05;HetPct=7.3;HomRefPct=90.9;HomVarPct=1.6;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32015223 . CT C . PASS AC=5;AN=764;HW=0.00;HetPct=1.3;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32158330 . CAG C . PASS AC=4;AN=760;HW=0.00;HetPct=1.0;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32456076 . GT G . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32477286 . CA C . HardyWeinbergViolation AC=14;AN=766;HW=20.05;HetPct=2.6;HomRefPct=96.9;HomVarPct=0.5;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32509752 . A AG . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32700247 . GGCGTCTGA G . PASS AC=3;AN=754;HW=0.00;HetPct=0.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32968409 . GTC G . PASS AC=0;AN=754;HW=0.00;HetPct=0.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 33541746 . A AAG . PASS AC=4;AN=766;HW=0.00;HetPct=1.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34251969 . C CA . PASS AC=3;AN=762;HW=0.00;HetPct=0.8;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34313574 . A AT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34633573 . TAA T . PASS AC=1;AN=754;HW=0.00;HetPct=0.3;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34831930 . CT C . PASS AC=7;AN=766;HW=0.00;HetPct=1.8;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 35329008 . ATC A . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35357903 . GA G . PASS AC=5;AN=764;HW=0.00;HetPct=1.3;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35847597 . CTT C . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36250348 . CG C . HighNoCallRate AC=0;AN=414;HW=0.00;HetPct=0.0;HomRefPct=54.0;HomVarPct=0.0;NoCallPct=46.0 GT 0/0 . 0/0 . . 0/0 0/0 . 0/0 0/0 . . 0/0 . 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 . . 0/0 . . 0/0 . 0/0 . . . 0/0 . 0/0 . . . 0/0 0/0 0/0 . . 0/0 . . 0/0 . . . 0/0 0/0 . . . 0/0 0/0 . . 0/0 . . . 0/0 . 0/0 . 0/0 . 0/0 . 0/0 0/0 . 0/0 . 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . . . . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . . . . . 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 . 0/0 . . . 0/0 0/0 . . 0/0 . . 0/0 0/0 . 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 . 0/0 0/0 . . . 0/0 . 0/0 . 0/0 . 0/0 . 0/0 . . . 0/0 0/0 . 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 . 0/0 0/0 . . 0/0 0/0 . 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . . 0/0 . . 0/0 . 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 . . . . 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 . . . 0/0 . 0/0 . 0/0 . . 0/0 . . . . +20 36658020 . TG T . PASS AC=6;AN=764;HW=0.00;HetPct=1.6;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36704724 . TC T . PASS AC=8;AN=756;HW=0.00;HetPct=2.1;HomRefPct=96.6;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36711544 . TAAAG T . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36947086 . ATAC A . PASS AC=33;AN=766;HW=0.12;HetPct=8.6;HomRefPct=91.4;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37139725 . CAG C . PASS AC=5;AN=760;HW=15.80;HetPct=0.8;HomRefPct=98.2;HomVarPct=0.3;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37278654 . CAG C . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37391272 . TG T . PASS AC=4;AN=764;HW=0.00;HetPct=1.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37608002 . CAT C . PASS AC=7;AN=762;HW=0.00;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37678954 . C CTGG . PASS AC=7;AN=762;HW=0.00;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37712193 . AAG A . PASS AC=29;AN=762;HW=0.00;HetPct=7.6;HomRefPct=91.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37836124 . AAAT A . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37954797 . A AGT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37962643 . T TAA . PASS AC=178;AN=764;HW=12.74;HetPct=31.9;HomRefPct=60.6;HomVarPct=7.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 1/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 +20 38336199 . TA T . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38495835 . T TA . PASS AC=14;AN=762;HW=0.00;HetPct=3.7;HomRefPct=95.8;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38696054 . GAAGA G . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38784318 . CCTT C . PASS AC=7;AN=762;HW=0.00;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39042026 . T TG . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39420665 . AG A . PASS AC=72;AN=760;HW=3.25;HetPct=16.2;HomRefPct=81.7;HomVarPct=1.3;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +20 39607037 . C CA . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39868369 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40006262 . TGAG T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40110981 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40445967 . TG T . PASS AC=3;AN=762;HW=0.00;HetPct=0.8;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40742257 . TG T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41000677 . T TG . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41149621 . T TATCA . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41364251 . A AAG . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41543685 . CTAAGGAGGGAAAAAGATATAAT C . PASS AC=12;AN=764;HW=0.00;HetPct=3.1;HomRefPct=96.6;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41851636 . TA T . PASS AC=83;AN=764;HW=18.52;HetPct=16.4;HomRefPct=80.7;HomVarPct=2.6;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 +20 41918747 . TATC T . HighNoCallRate AC=3;AN=650;HW=0.00;HetPct=0.8;HomRefPct=84.1;HomVarPct=0.0;NoCallPct=15.1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/0 . 0/0 0/0 . . 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/0 0/0 0/0 . . . . 0/0 . . . . . 0/0 . 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41964672 . A AT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42145613 . TG T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42159695 . GC G . PASS AC=87;AN=762;HW=7.05;HetPct=18.5;HomRefPct=78.9;HomVarPct=2.1;NoCallPct=0.5 GT 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 . 0/0 . 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +20 42261635 . C CATTT . PASS AC=24;AN=764;HW=2.06;HetPct=5.7;HomRefPct=93.7;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42470352 . CACTT C . PASS AC=19;AN=764;HW=3.87;HetPct=4.4;HomRefPct=95.0;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 42585924 . T TA . PASS AC=1;AN=754;HW=0.00;HetPct=0.3;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42856201 . CT C . PASS AC=3;AN=766;HW=0.00;HetPct=0.8;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42909154 . T TGGGTC . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42918721 . AG A . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42930748 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43245783 . AG A . PASS AC=8;AN=766;HW=11.40;HetPct=1.6;HomRefPct=98.2;HomVarPct=0.3;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43371647 . GGGCTGTAA G . PASS AC=80;AN=760;HW=6.79;HetPct=17.2;HomRefPct=80.2;HomVarPct=1.8;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 43434234 . AG A . PASS AC=4;AN=766;HW=0.00;HetPct=1.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43539258 . T TAG . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43606638 . T TC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43826992 . GC G . PASS AC=0;AN=748;HW=0.00;HetPct=0.0;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=2.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43993933 . CA C . PASS AC=199;AN=764;HW=8.74;HetPct=35.2;HomRefPct=56.1;HomVarPct=8.4;NoCallPct=0.3 GT 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 1/1 1/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 +20 44071585 . C CT . PASS AC=132;AN=764;HW=8.50;HetPct=26.1;HomRefPct=69.5;HomVarPct=4.2;NoCallPct=0.3 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 +20 44220528 . T TC . PASS AC=59;AN=766;HW=1.90;HetPct=14.9;HomRefPct=84.9;HomVarPct=0.3;NoCallPct=0.0 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 44340276 . AACAG A . PASS AC=37;AN=758;HW=17.93;HetPct=7.6;HomRefPct=90.3;HomVarPct=1.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44464600 . T TA . PASS AC=19;AN=762;HW=3.86;HetPct=4.4;HomRefPct=94.8;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44470843 . GAGTGTCGT G . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44572563 . GA G . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44889286 . G GC . PASS AC=13;AN=766;HW=0.00;HetPct=3.4;HomRefPct=96.6;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 45092013 . GT G . PASS AC=4;AN=760;HW=0.00;HetPct=1.0;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45300827 . CT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45406096 . T TTC . PASS AC=4;AN=760;HW=0.00;HetPct=1.0;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45668403 . CTG C . PASS AC=86;AN=762;HW=16.06;HetPct=17.2;HomRefPct=79.6;HomVarPct=2.6;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 46011017 . GAT G . HighNoCallRate AC=4;AN=706;HW=0.00;HetPct=1.0;HomRefPct=91.1;HomVarPct=0.0;NoCallPct=7.8 GT . . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46051811 . T TAAGC . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46353646 . A AG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46413551 . TC T . PASS AC=2;AN=760;HW=0.00;HetPct=0.5;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46569465 . CTG C . PASS AC=10;AN=762;HW=0.00;HetPct=2.6;HomRefPct=96.9;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46720983 . ATACTTGG A . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47032179 . GC G . PASS AC=2;AN=760;HW=0.00;HetPct=0.5;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47136092 . A AGTC . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47239432 . T TA . HardyWeinbergViolation AC=3;AN=762;HW=21.03;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47335386 . GC G . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47428163 . C CA . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47988904 . CA C . PASS AC=187;AN=760;HW=17.08;HetPct=32.1;HomRefPct=58.7;HomVarPct=8.4;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 . 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 +20 48262933 . CCTA C . PASS AC=7;AN=766;HW=0.00;HetPct=1.8;HomRefPct=98.2;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49438742 . G GT . PASS AC=8;AN=762;HW=11.37;HetPct=1.6;HomRefPct=97.7;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49451656 . T TG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49537420 . AG A . PASS AC=3;AN=760;HW=0.00;HetPct=0.8;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49561273 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49765611 . A AC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49823863 . ACTTTT A . HardyWeinbergViolation AC=14;AN=764;HW=20.03;HetPct=2.6;HomRefPct=96.6;HomVarPct=0.5;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 50136971 . TTTTC T . PASS AC=8;AN=764;HW=0.00;HetPct=2.1;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50373155 . A AT . PASS AC=7;AN=762;HW=0.00;HetPct=1.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50772065 . T TC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50806976 . G GAA . PASS AC=128;AN=760;HW=0.17;HetPct=28.2;HomRefPct=68.4;HomVarPct=2.6;NoCallPct=0.8 GT 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 . 0/0 . 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 +20 50961401 . G GT . PASS AC=4;AN=762;HW=0.00;HetPct=1.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51547787 . AC A . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51758677 . A ATT . HardyWeinbergViolation AC=87;AN=762;HW=72.50;HetPct=13.3;HomRefPct=81.5;HomVarPct=4.7;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 1/1 1/1 1/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +20 51838824 . GA G . PASS AC=4;AN=756;HW=17.99;HetPct=0.5;HomRefPct=97.9;HomVarPct=0.3;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51961394 . ATTTG A . PASS AC=8;AN=760;HW=0.00;HetPct=2.1;HomRefPct=97.1;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53081927 . CATGA C . PASS AC=5;AN=764;HW=0.00;HetPct=1.3;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53538294 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53602394 . T TA . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54124185 . T TC . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54150907 . CAG C . PASS AC=3;AN=754;HW=0.00;HetPct=0.8;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54166824 . AC A . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54230743 . CAT C . PASS AC=2;AN=758;HW=0.00;HetPct=0.5;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54262948 . A AC . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54309727 . TGAGC T . PASS AC=7;AN=762;HW=12.61;HetPct=1.3;HomRefPct=97.9;HomVarPct=0.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54379666 . GT G . PASS AC=172;AN=766;HW=14.43;HetPct=30.8;HomRefPct=62.1;HomVarPct=7.0;NoCallPct=0.0 GT 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 +20 55264363 . AG A . PASS AC=232;AN=762;HW=15.89;HetPct=37.1;HomRefPct=50.7;HomVarPct=11.7;NoCallPct=0.5 GT 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 +20 55286852 . AAAC A . HardyWeinbergViolation AC=10;AN=764;HW=26.69;HetPct=1.6;HomRefPct=97.7;HomVarPct=0.5;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55608811 . CT C . PASS AC=35;AN=762;HW=19.90;HetPct=7.0;HomRefPct=91.4;HomVarPct=1.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 55611547 . CAA C . PASS AC=1;AN=760;HW=0.00;HetPct=0.3;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55658161 . GT G . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55989765 . CA C . PASS AC=208;AN=764;HW=5.71;HetPct=37.1;HomRefPct=54.0;HomVarPct=8.6;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 +20 56249865 . T TGAGG . PASS AC=4;AN=756;HW=0.00;HetPct=1.0;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56344957 . GT G . PASS AC=1;AN=762;HW=0.00;HetPct=0.3;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56419021 . T TG . PASS AC=2;AN=766;HW=0.00;HetPct=0.5;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56915853 . TG T . PASS AC=17;AN=764;HW=4.78;HetPct=3.9;HomRefPct=95.6;HomVarPct=0.3;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57125853 . GA G . HardyWeinbergViolation AC=137;AN=764;HW=48.09;HetPct=22.2;HomRefPct=70.8;HomVarPct=6.8;NoCallPct=0.3 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 +20 57676578 . CCTTT C . PASS AC=7;AN=764;HW=0.00;HetPct=1.8;HomRefPct=97.9;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57693627 . AG A . HighNoCallRate AC=12;AN=292;HW=71.95;HetPct=0.5;HomRefPct=36.3;HomVarPct=1.3;NoCallPct=61.9 GT . . 0/0 . . . 0/0 . . . . 0/0 . 1/1 . . 0/0 . 0/0 . 0/0 . . . . . . . 0/0 0/0 . . . 0/0 . . . . . 0/0 . 0/0 . . 0/0 0/0 . . . . . . . . 0/0 . . . . 0/0 . . . 0/0 . 0/0 0/0 0/0 . . 0/0 . . 0/0 0/0 . 0/0 . . . 0/0 . . . . . . . . 0/0 . 0/0 . . 0/0 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 1/1 . . . . . . . 0/0 . . . 0/0 . . . . . . 0/0 1/1 . . . 0/0 . . . . . . . . 0/0 . 0/0 . . . 0/0 . . . . 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 . 0/0 . . . . 0/0 . . 0/0 . . 1/1 . 0/0 0/0 . 0/0 0/0 0/1 . . 0/0 . 0/0 1/1 . . . . . . . 0/0 0/0 . . . . . . . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 . 0/0 0/0 . . . 0/0 . 0/0 . 0/0 0/0 . . . . . 0/0 . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . . . . . . . 0/0 . . 0/0 . . 0/0 . 0/0 0/0 . . 0/0 . . . 0/0 0/0 . . . . 0/0 . . . 0/0 . . . 0/0 . . . 0/0 . . 0/0 . 0/0 . . . . . . 0/0 . . . . . . . 0/0 . . 0/1 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 . . 0/0 . . 0/0 . . 0/0 . . . . 0/0 . . . . . 0/0 . 0/0 . . 0/0 . 0/0 . . . 0/0 +20 57781799 . TGGG T . HardyWeinbergViolation AC=43;AN=764;HW=30.12;HetPct=8.1;HomRefPct=90.1;HomVarPct=1.6;NoCallPct=0.3 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 +20 58288793 . TC T . PASS AC=44;AN=766;HW=12.53;HetPct=9.4;HomRefPct=89.6;HomVarPct=1.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 58790761 . TG T . HardyWeinbergViolation AC=232;AN=762;HW=35.81;HetPct=33.9;HomRefPct=52.2;HomVarPct=13.3;NoCallPct=0.5 GT 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 1/1 . 0/1 . 1/1 0/0 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 +20 59072457 . AAGG A . HardyWeinbergViolation AC=12;AN=756;HW=41.94;HetPct=1.6;HomRefPct=96.3;HomVarPct=0.8;NoCallPct=1.3 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59153061 . CTG C . PASS AC=1;AN=764;HW=0.00;HetPct=0.3;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59186675 . TATTA T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59349754 . CCT C . PASS AC=168;AN=762;HW=8.71;HetPct=31.3;HomRefPct=61.9;HomVarPct=6.3;NoCallPct=0.5 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 . 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 59365768 . TG T . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59769242 . C CT . PASS AC=4;AN=762;HW=0.00;HetPct=1.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59955821 . TG T . HighNoCallRate AC=0;AN=712;HW=0.00;HetPct=0.0;HomRefPct=93.0;HomVarPct=0.0;NoCallPct=7.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60337932 . AC A . PASS AC=3;AN=764;HW=0.00;HetPct=0.8;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60925525 . GC G . PASS AC=2;AN=762;HW=0.00;HetPct=0.5;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60961768 . GA G . HardyWeinbergViolation AC=365;AN=766;HW=84.86;HetPct=34.7;HomRefPct=35.0;HomVarPct=30.3;NoCallPct=0.0 GT 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 1/1 1/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 1/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 1/1 1/1 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 +20 61000018 . GC G . PASS AC=203;AN=762;HW=0.38;HetPct=39.4;HomRefPct=53.3;HomVarPct=6.8;NoCallPct=0.5 GT 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 . 0/1 . 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 +20 61531765 . AG A . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61983510 . TCTGC T . PASS AC=75;AN=766;HW=0.03;HetPct=18.0;HomRefPct=81.2;HomVarPct=0.8;NoCallPct=0.0 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 62154368 . G GA . PASS AC=2;AN=760;HW=0.00;HetPct=0.5;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62310426 . CTT C . PASS AC=1;AN=756;HW=0.00;HetPct=0.3;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62871860 . C CCCGCA . PASS AC=27;AN=764;HW=17.87;HetPct=5.5;HomRefPct=93.5;HomVarPct=0.8;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 diff --git a/tests/tabix_data/vcf/16.vcf b/tests/tabix_data/vcf/16.vcf new file mode 100644 index 0000000..d36970e --- /dev/null +++ b/tests/tabix_data/vcf/16.vcf @@ -0,0 +1,369 @@ +##fileformat=VCFv4.0 +##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/combined.phase1.chr20.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false recal_file=/humgen/gsa-scr1/delangel/VQSRIndels/data/trainMills75_truthMills75_p15_12_12_pctb0.05_std12.0_mG8_QD_FS_HS_RP_IC.recal tranches_file=/humgen/gsa-scr1/delangel/VQSRIndels/data/trainMills75_truthMills75_p15_12_12_pctb0.05_std12.0_mG8_QD_FS_HS_RP_IC.tranches out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub ts_filter_level=93.0 ignore_filter=null mode=INDEL" +##CombineVariants="analysis_type=CombineVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20:41000001-42000000] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AFR/AFR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/ASN/ASN.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AMR/AMR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/EUR/EUR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AFR.admix/AFR.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/ASN.admix/ASN.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AMR.admix/AMR.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/EUR.admix/EUR.admix.phase1.chr20.42.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub genotypemergeoption=PRIORITIZE filteredrecordsmergetype=KEEP_IF_ANY_UNFILTERED rod_priority_list=AFR.admix,AMR.admix,EUR.admix,ASN.admix,AFR,AMR,EUR,ASN printComplexMerges=false filteredAreUncalled=false minimalVCF=false setKey=set assumeIdenticalSamples=false minimumN=1 masterMerge=false mergeInfoWithMaxAC=true" +##FILTER= +##FILTER== 4 && (MQ0 / (1.0 * DP)) > 0.1"> +##FILTER=10)"> +##FILTER=20.0"> +##FILTER= 7500"> +##FILTER==15"> +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER==-1.0"> +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##LeftAlignVariants="analysis_type=LeftAlignVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta rodBind=[/humgen/gsa-scr1/ebanks/ALL.chr20.Oxford.20110407.indels.genotypes.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub" +##SelectVariants="analysis_type=SelectVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta rodBind=[/humgen/gsa-scr1/delangel/officialCalls/20110201_chr20_phase1_indels/dindel/20110208.chr20.dindel2.ALL.sites.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sample=null select_expressions=[] excludeNonVariants=false excludeFiltered=false discordance= concordance= family_structure= mendelianViolation=false mendelianViolationQualThreshold=0.0 select_random_number=0 select_random_fraction=0.0 selectSNPs=false selectIndels=true" +##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/broad/shptmp/delangel/calls/chr20/CHB.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/CHS.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/CLM.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/JPT.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/MXL.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/PUR.phase1.chr20.42.cleaned.bam] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20:41000001-42000000] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-scr1/delangel/otherIndelCallerAnalysis/ALL.indels.combined.chr20.vcf, /humgen/gsa-hpprojects/GATK/data/dbsnp_132_b37.leftAligned.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=50 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=8 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false genotype_likelihoods_model=INDEL p_nonref_model=EXACT heterozygosity=0.0010 pcr_error_rate=1.0E-4 genotyping_mode=GENOTYPE_GIVEN_ALLELES output_mode=EMIT_ALL_SITES standard_min_confidence_threshold_for_calling=4.0 standard_min_confidence_threshold_for_emitting=4.0 noSLOD=false assume_single_sample_reads=null abort_at_too_much_coverage=-1 min_base_quality_score=17 min_mapping_quality_score=20 max_deletion_fraction=0.05 min_indel_count_for_genotyping=5 indel_heterozygosity=1.25E-4 indelGapContinuationPenalty=10.0 indelGapOpenPenalty=45.0 indelHaplotypeSize=80 doContextDependentGapPenalties=true getGapPenaltiesFromData=false indel_recal_file=indel.recal_data.csv indelDebug=false dovit=false GSA_PRODUCTION_ONLY=false exactCalculation=LINEAR_EXPERIMENTAL ignoreSNPAlleles=true output_all_callable_bases=false genotype=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub debug_file=null metrics_file=null annotation=[MappingQualityZeroFraction]" +##VariantFiltration="analysis_type=VariantFiltration input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[/humgen/1kg/processing/pipeline_test_bams/chr22_chunked.hg19.intervals] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/broad/shptmp/rpoplin/ALL.phase1.chr22.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false enable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null quiet_output_mode=false debug_mode=false help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub filterExpression=[MQ0 >= 4 && (MQ0 / (1.0 * DP)) > 0.1, QUAL<30.0, SB>=-1.0, QD<1.0, HRun>=15, HaplotypeScore>20.0] filterName=[HARD_TO_VALIDATE, LowQual, StrandBias, QualByDepth, HomopolymerRun, HaplotypeScore] genotypeFilterExpression=[] genotypeFilterName=[] clusterSize=3 clusterWindowSize=0 maskName=Mask missingValuesInExpressionsShouldEvaluateAsFailing=false" +##commandline="/share/software/freebayes/bin/freebayes --stdin --min-alternate-count 2 --genotype-combo-step-max 20 --genotype-variant-threshold 4 --no-marginals --pvar 0.0001 --indels --mnps --no-filters --binomial-obs-priors --allele-balance-priors --region 20:0..100000 --vcf /d1/data/1000G/20101123/populations/finalised.phase1/integrated/including454/wg/ALL/Pipeline/none//freebayes/freebayes.20:0-100000.baq.20110328.vcf --fasta-reference /d2/data/references/build_37/human_reference_v37.fa" +##fileDate=2011-03-28 +##filedate=2011-02-08 +##filter="( SNP | MNP ) & ( MQM > 65 | QUAL > 1 ) & ABP < 30 & AB < 0.9 | ( INS | DEL ) & QUAL > 500" +##phasing=none +##platypusOptions={'bamFiles': ['/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06984', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06985', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06986', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06989', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06994', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07000', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07037', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07048', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07051', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07056', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07346', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07347', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07357', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA10847', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA10851', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11829', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11830', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11831', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11832', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11843', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11881', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11892', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11893', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11894', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11918', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11919', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11920', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11930', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11931', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11932', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11933', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11992', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11993', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11994', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11995', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12003', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12004', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12005', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12006', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12043', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12044', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12045', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12046', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12058', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12144', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12154', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12155', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12156', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12234', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12249', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12272', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12273', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12275', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12282', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12283', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12286', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12287', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12340', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12341', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12342', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12347', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12348', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12383', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12399', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12400', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12413', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12414', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12489', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12546', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12716', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12717', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12718', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12748', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12749', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12750', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12751', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12761', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12763', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12775', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12776', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12777', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12778', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12813', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12827', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12828', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12829', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12830', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12842', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12843', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12889', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12890', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18486', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18487', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18488', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18489', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18498', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18499', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18501', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18502', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18504', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18505', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18507', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18508', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18510', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18511', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18516', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18517', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18519', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18520', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18522', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18523', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18526', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18530', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18532', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18533', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18534', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18535', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18536', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18537', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18538', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18539', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18541', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18542', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18543', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18544', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18545', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18546', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18547', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18548', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18549', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18550', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18552', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18553', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18555', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18557', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18558', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18559', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18560', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18561', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18562', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18563', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18564', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18565', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18566', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18567', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18570', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18571', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18572', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18573', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18574', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18576', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18577', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18579', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18582', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18592', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18593', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18595', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18596', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18597', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18599', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18602', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18603', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18605', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18606', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18608', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18609', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18610', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18611', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18612', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18613', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18614', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18615', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18616', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18617', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18618', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18619', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18620', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18621', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18622', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18623', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18624', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18625', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18626', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18627', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18628', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18630', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18631', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18632', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18633', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18634', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18635', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18636', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18637', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18638', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18853', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18856', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18858', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18861', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18867', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18868', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18870', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18871', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18873', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18874', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18907', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18908', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18909', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18910', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18912', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18916', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18917', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18923', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18924', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18933', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18934', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18940', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18941', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18942', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18943', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18944', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18945', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18947', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18948', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18949', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18950', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18951', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18952', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18953', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18956', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18959', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18960', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18961', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18963', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18964', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18965', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18967', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18968', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18971', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18972', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18973', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18974', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18975', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18976', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18977', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18980', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18981', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18982', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18983', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18984', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18985', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18986', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18987', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18988', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18989', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18990', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18991', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18999', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19000', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19002', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19003', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19004', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19005', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19007', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19009', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19010', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19012', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19054', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19055', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19056', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19057', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19058', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19059', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19060', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19062', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19063', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19064', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19065', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19066', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19067', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19068', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19070', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19072', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19074', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19075', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19076', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19077', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19078', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19079', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19080', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19081', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19082', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19083', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19084', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19085', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19087', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19088', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19092', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19093', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19098', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19099', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19102', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19107', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19108', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19114', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19116', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19119', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19129', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19130', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19131', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19137', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19138', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19144', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19147', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19152', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19153', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19159', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19160', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19171', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19172', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19189', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19190', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19197', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19198', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19200', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19201', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19204', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19207', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19209', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19210', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19213', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19223', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19225', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19235', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19236', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19247', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19248', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19256', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19257', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19311', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19312', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19313', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19315', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19316', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19317', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19318', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19319', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19321', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19324', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19327', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19328', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19331', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19332', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19334', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19338', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19346', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19347', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19350', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19355', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19359', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19360', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19371', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19372', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19373', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19374', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19375', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19376', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19377', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19379', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19380', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19381', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19382', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19383', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19384', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19385', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19390', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19391', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19393', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19394', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19395', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19396', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19397', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19398', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19399', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19401', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19403', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19404', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19428', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19429', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19430', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19431', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19434', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19435', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19436', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19437', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19438', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19439', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19440', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19443', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19444', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19445', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19446', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19448', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19449', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19451', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19452', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19453', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19455', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19456', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19457', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19461', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19462', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19463', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19466', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19467', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19468', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19469', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19470', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19471', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19472', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19473', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19474', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19625', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19648', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19649', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19651', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19652', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19654', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19655', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19657', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19658', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19660', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19661', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19663', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19664', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19670', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19675', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19676', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19678', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19679', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19681', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19682', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19684', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19685', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19700', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19701', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19703', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19704', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19707', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19711', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19712', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19713', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19716', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19717', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19719', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19720', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19722', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19723', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19725', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19726', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19728', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19729', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19731', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19732', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19746', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19747', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19749', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19750', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19755', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19756', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19758', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19759', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19761', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19762', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19770', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19771', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19773', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19774', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19776', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19777', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19779', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19780', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19782', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19783', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19785', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19786', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19788', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19789', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19818', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19819', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19834', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19835', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19900', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19901', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19904', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19908', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19909', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19914', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19916', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19917', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19920', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19921', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19982', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19985', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20126', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20127', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20276', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20278', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20281', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20282', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20287', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20289', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20291', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20294', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20296', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20299', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20314', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20317', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20322', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20332', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20334', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20336', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20340', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20341', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20342', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20344', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20346', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20348', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20356', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20502', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20503', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20504', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20505', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20506', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20507', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20508', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20509', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20510', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20512', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20513', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20514', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20515', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20516', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20517', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20518', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20519', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20520', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20521', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20522', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20524', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20525', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20526', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20527', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20528', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20529', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20530', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20531', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20532', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20533', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20534', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20535', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20536', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20537', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20538', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20539', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20540', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20541', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20542', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20543', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20544', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20581', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20582', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20585', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20586', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20588', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20589', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20752', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20753', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20754', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20755', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20756', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20757', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20758', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20759', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20760', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20761', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20765', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20766', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20768', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20769', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20770', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20771', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20772', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20773', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20774', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20775', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20778', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20783', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20785', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20786', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20787', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20790', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20792', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20795', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20796', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20797', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20798', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20799', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20800', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20801', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20802', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20803', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20804', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20805', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20806', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20807', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20808', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20809', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20810', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20811', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20812', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20813', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20814', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20815', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20816', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20818', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20819', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20826', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20828', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00096', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00098', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00100', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00103', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00106', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00108', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00111', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00112', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00114', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00115', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00116', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00117', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00118', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00119', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00120', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00122', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00123', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00124', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00125', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00126', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00127', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00131', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00133', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00136', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00137', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00138', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00139', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00140', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00141', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00142', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00143', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00144', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00145', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00146', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00147', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00148', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00149', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00150', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00151', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00152', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00153', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00154', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00155', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00156', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00157', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00158', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00159', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00160', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00171', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00173', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00174', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00176', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00177', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00178', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00179', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00180', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00181', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00182', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00183', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00185', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00186', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00187', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00188', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00189', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00190', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00231', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00232', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00233', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00236', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00237', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00239', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00242', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00243', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00244', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00245', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00246', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00247', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00249', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00250', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00251', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00252', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00253', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00254', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00256', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00257', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00258', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00259', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00260', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00261', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00262', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00263', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00264', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00265', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00266', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00267', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00268', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00269', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00270', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00271', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00272', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00273', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00274', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00275', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00276', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00277', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00278', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00280', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00281', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00282', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00284', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00285', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00306', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00308', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00309', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00310', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00311', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00312', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00313', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00315', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00318', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00319', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00320', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00321', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00323', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00324', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00325', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00326', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00327', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00328', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00329', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00330', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00331', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00334', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00335', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00336', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00337', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00338', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00339', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00342', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00343', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00344', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00345', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00346', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00353', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00357', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00361', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00366', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00367', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00368', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00369', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00372', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00373', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00375', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00377', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00380', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00403', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00404', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00418', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00419', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00421', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00422', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00427', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00428', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00436', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00437', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00442', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00443', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00448', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00449', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00463', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00464', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00472', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00473', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00475', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00476', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00478', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00479', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00500', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00501', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00512', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00513', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00524', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00525', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00530', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00531', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00533', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00534', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00536', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00537', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00542', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00543', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00551', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00553', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00554', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00556', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00557', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00559', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00560', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00565', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00566', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00577', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00578', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00580', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00581', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00583', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00584', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00589', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00590', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00592', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00593', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00595', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00596', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00607', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00608', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00610', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00611', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00613', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00614', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00619', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00620', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00625', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00626', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00628', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00629', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00634', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00635', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00637', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00638', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00640', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00641', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00650', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00651', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00653', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00654', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00656', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00657', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00662', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00663', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00671', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00672', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00683', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00684', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00689', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00690', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00692', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00693', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00698', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00699', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00701', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00702', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00704', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00705', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00707', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00708', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00731', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00732', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00734', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00736', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00737', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00739', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00740', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01047', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01048', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01051', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01052', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01055', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01060', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01061', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01066', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01067', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01069', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01070', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01072', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01073', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01075', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01079', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01080', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01082', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01083', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01094', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01095', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01097', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01098', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01101', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01102', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01107', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01108', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01110', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01111', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01112', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01113', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01124', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01125', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01133', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01134', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01136', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01137', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01140', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01148', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01149', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01167', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01168', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01170', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01171', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01173', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01174', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01176', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01177', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01182', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01183', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01187', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01188', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01190', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01191', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01197', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01198', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01204', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01250', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01251', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01253', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01254', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01334', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01342', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01350', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01351', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01353', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01354', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01356', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01357', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01359', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01360', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01365', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01366', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01374', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01375', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01377', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01378', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01383', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01384', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01389', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01390', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01437', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01440', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01441', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01455', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01456', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01461', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01462', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01464', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01465', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01488', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01489', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01491', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01492', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01494', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01495', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01497', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01498', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01515', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01516', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01518', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01519', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01521', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01522', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01550', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01551'], 'minReads': 2, 'refFile': '/scratch/rimmer/Genomes/human_g1k_v37_ebv.fa', 'maxHaplotypes': 64, 'maxSize': 100, 'ploidy': 2, 'maxRegionSize': 10000, 'nCPU': 1, 'minFlank': 3, 'logFileName': 'LogsAllPhaseOne/ThousandGenomesPhaseOneCalls_20:1-100001.log', 'regions': ['20:1-100001'], 'maxVariants': 6, 'genIndels': 1, 'labels': None, 'dataType': 'population', 'minMapQual': 20, 'rlen': 100, 'nInd': 994, 'getVariantsFromBAMs': 1, 'genSNPs': 1, 'minReadQual': 20, 'maxCoverage': 1000000.0, 'verbosity': 2, 'sourceFile': None, 'callOnlyIndels': 1, 'output': 'VariantCallsAllPhaseOne/ThousandGenomesPhaseOneCalls_20:1-100001.vcf'} +##reference=/lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta +##source=Dindel2 +##source=SelectVariants +##source_20110031.1=/nfs/users/nfs_p/pd3/cvs/vcftools/perl/vcf-annotate -d /nfs/users/nfs_p/pd3/sandbox/hapmap/dbSNP-b132/non-1kg-vld.desc -a /nfs/users/nfs_p/pd3/sandbox/hapmap/dbSNP-b132/non-1kg-vld.tab.gz -c CHROM,FROM,INFO/VLD,INFO/KGPilot123,INFO/dbSNP +##vcfCTools=filter +##vcfCtools=merge freebayes.20:0-100000.baq.20110328.vcf, freebayes.20:100000-200000.baq.20110328.vcf, freebayes.20:200000-300000.baq.20110328.vcf, freebayes.20:300000-400000.baq.20110328.vcf, freebayes.20:400000-500000.baq.20110328.vcf, freebayes.20:500000-600000.baq.20110328.vcf, freebayes.20:600000-700000.baq.20110328.vcf, freebayes.20:700000-800000.baq.20110328.vcf, freebayes.20:800000-900000.baq.20110328.vcf, freebayes.20:900000-1000000.baq.20110328.vcf, freebayes.20:1000000-1100000.baq.20110328.vcf, freebayes.20:1100000-1200000.baq.20110328.vcf, freebayes.20:1200000-1300000.baq.20110328.vcf, freebayes.20:1300000-1400000.baq.20110328.vcf, freebayes.20:1400000-1500000.baq.20110328.vcf, freebayes.20:1500000-1600000.baq.20110328.vcf, freebayes.20:1600000-1700000.baq.20110328.vcf, freebayes.20:1700000-1800000.baq.20110328.vcf, freebayes.20:1800000-1900000.baq.20110328.vcf, freebayes.20:1900000-2000000.baq.20110328.vcf, freebayes.20:2000000-2100000.baq.20110328.vcf, freebayes.20:2100000-2200000.baq.20110328.vcf, freebayes.20:2200000-2300000.baq.20110328.vcf, freebayes.20:2300000-2400000.baq.20110328.vcf, freebayes.20:2400000-2500000.baq.20110328.vcf, freebayes.20:2500000-2600000.baq.20110328.vcf, freebayes.20:2600000-2700000.baq.20110328.vcf, freebayes.20:2700000-2800000.baq.20110328.vcf, freebayes.20:2800000-2900000.baq.20110328.vcf, freebayes.20:2900000-3000000.baq.20110328.vcf, freebayes.20:3000000-3100000.baq.20110328.vcf, freebayes.20:3100000-3200000.baq.20110328.vcf, freebayes.20:3200000-3300000.baq.20110328.vcf, freebayes.20:3300000-3400000.baq.20110328.vcf, freebayes.20:3400000-3500000.baq.20110328.vcf, freebayes.20:3500000-3600000.baq.20110328.vcf, freebayes.20:3600000-3700000.baq.20110328.vcf, freebayes.20:3700000-3800000.baq.20110328.vcf, freebayes.20:3800000-3900000.baq.20110328.vcf, freebayes.20:3900000-4000000.baq.20110328.vcf, freebayes.20:4000000-4100000.baq.20110328.vcf, freebayes.20:4100000-4200000.baq.20110328.vcf, freebayes.20:4200000-4300000.baq.20110328.vcf, freebayes.20:4300000-4400000.baq.20110328.vcf, freebayes.20:4400000-4500000.baq.20110328.vcf, freebayes.20:4500000-4600000.baq.20110328.vcf, freebayes.20:4600000-4700000.baq.20110328.vcf, freebayes.20:4700000-4800000.baq.20110328.vcf, freebayes.20:4800000-4900000.baq.20110328.vcf, freebayes.20:4900000-5000000.baq.20110328.vcf, freebayes.20:5000000-5100000.baq.20110328.vcf, freebayes.20:5100000-5200000.baq.20110328.vcf, freebayes.20:5200000-5300000.baq.20110328.vcf, freebayes.20:5300000-5400000.baq.20110328.vcf, freebayes.20:5400000-5500000.baq.20110328.vcf, freebayes.20:5500000-5600000.baq.20110328.vcf, freebayes.20:5600000-5700000.baq.20110328.vcf, freebayes.20:5700000-5800000.baq.20110328.vcf, freebayes.20:5800000-5900000.baq.20110328.vcf, freebayes.20:5900000-6000000.baq.20110328.vcf, freebayes.20:6000000-6100000.baq.20110328.vcf, freebayes.20:6100000-6200000.baq.20110328.vcf, freebayes.20:6200000-6300000.baq.20110328.vcf, freebayes.20:6300000-6400000.baq.20110328.vcf, freebayes.20:6400000-6500000.baq.20110328.vcf, freebayes.20:6500000-6600000.baq.20110328.vcf, freebayes.20:6600000-6700000.baq.20110328.vcf, freebayes.20:6700000-6800000.baq.20110328.vcf, freebayes.20:6800000-6900000.baq.20110328.vcf, freebayes.20:6900000-7000000.baq.20110328.vcf, freebayes.20:7000000-7100000.baq.20110328.vcf, freebayes.20:7100000-7200000.baq.20110328.vcf, freebayes.20:7200000-7300000.baq.20110328.vcf, freebayes.20:7300000-7400000.baq.20110328.vcf, freebayes.20:7400000-7500000.baq.20110328.vcf, freebayes.20:7500000-7600000.baq.20110328.vcf, freebayes.20:7600000-7700000.baq.20110328.vcf, freebayes.20:7700000-7800000.baq.20110328.vcf, freebayes.20:7800000-7900000.baq.20110328.vcf, freebayes.20:7900000-8000000.baq.20110328.vcf, freebayes.20:8000000-8100000.baq.20110328.vcf, freebayes.20:8100000-8200000.baq.20110328.vcf, freebayes.20:8200000-8300000.baq.20110328.vcf, freebayes.20:8300000-8400000.baq.20110328.vcf, freebayes.20:8400000-8500000.baq.20110328.vcf, freebayes.20:8500000-8600000.baq.20110328.vcf, freebayes.20:8600000-8700000.baq.20110328.vcf, freebayes.20:8700000-8800000.baq.20110328.vcf, freebayes.20:8800000-8900000.baq.20110328.vcf, freebayes.20:8900000-9000000.baq.20110328.vcf, freebayes.20:9000000-9100000.baq.20110328.vcf, freebayes.20:9100000-9200000.baq.20110328.vcf, freebayes.20:9200000-9300000.baq.20110328.vcf, freebayes.20:9300000-9400000.baq.20110328.vcf, freebayes.20:9400000-9500000.baq.20110328.vcf, freebayes.20:9500000-9600000.baq.20110328.vcf, freebayes.20:9600000-9700000.baq.20110328.vcf, freebayes.20:9700000-9800000.baq.20110328.vcf, freebayes.20:9800000-9900000.baq.20110328.vcf, freebayes.20:9900000-10000000.baq.20110328.vcf, freebayes.20:10000000-10100000.baq.20110328.vcf, freebayes.20:10100000-10200000.baq.20110328.vcf, freebayes.20:10200000-10300000.baq.20110328.vcf, freebayes.20:10300000-10400000.baq.20110328.vcf, freebayes.20:10400000-10500000.baq.20110328.vcf, freebayes.20:10500000-10600000.baq.20110328.vcf, freebayes.20:10600000-10700000.baq.20110328.vcf, freebayes.20:10700000-10800000.baq.20110328.vcf, freebayes.20:10800000-10900000.baq.20110328.vcf, freebayes.20:10900000-11000000.baq.20110328.vcf, freebayes.20:11000000-11100000.baq.20110328.vcf, freebayes.20:11100000-11200000.baq.20110328.vcf, freebayes.20:11200000-11300000.baq.20110328.vcf, freebayes.20:11300000-11400000.baq.20110328.vcf, freebayes.20:11400000-11500000.baq.20110328.vcf, freebayes.20:11500000-11600000.baq.20110328.vcf, freebayes.20:11600000-11700000.baq.20110328.vcf, freebayes.20:11700000-11800000.baq.20110328.vcf, freebayes.20:11800000-11900000.baq.20110328.vcf, freebayes.20:11900000-12000000.baq.20110328.vcf, freebayes.20:12000000-12100000.baq.20110328.vcf, freebayes.20:12100000-12200000.baq.20110328.vcf, freebayes.20:12200000-12300000.baq.20110328.vcf, freebayes.20:12300000-12400000.baq.20110328.vcf, freebayes.20:12400000-12500000.baq.20110328.vcf, freebayes.20:12500000-12600000.baq.20110328.vcf, freebayes.20:12600000-12700000.baq.20110328.vcf, freebayes.20:12700000-12800000.baq.20110328.vcf, freebayes.20:12800000-12900000.baq.20110328.vcf, freebayes.20:12900000-13000000.baq.20110328.vcf, freebayes.20:13000000-13100000.baq.20110328.vcf, freebayes.20:13100000-13200000.baq.20110328.vcf, freebayes.20:13200000-13300000.baq.20110328.vcf, freebayes.20:13300000-13400000.baq.20110328.vcf, freebayes.20:13400000-13500000.baq.20110328.vcf, freebayes.20:13500000-13600000.baq.20110328.vcf, freebayes.20:13600000-13700000.baq.20110328.vcf, freebayes.20:13700000-13800000.baq.20110328.vcf, freebayes.20:13800000-13900000.baq.20110328.vcf, freebayes.20:13900000-14000000.baq.20110328.vcf, freebayes.20:14000000-14100000.baq.20110328.vcf, freebayes.20:14100000-14200000.baq.20110328.vcf, freebayes.20:14200000-14300000.baq.20110328.vcf, freebayes.20:14300000-14400000.baq.20110328.vcf, freebayes.20:14400000-14500000.baq.20110328.vcf, freebayes.20:14500000-14600000.baq.20110328.vcf, freebayes.20:14600000-14700000.baq.20110328.vcf, freebayes.20:14700000-14800000.baq.20110328.vcf, freebayes.20:14800000-14900000.baq.20110328.vcf, freebayes.20:14900000-15000000.baq.20110328.vcf, freebayes.20:15000000-15100000.baq.20110328.vcf, freebayes.20:15100000-15200000.baq.20110328.vcf, freebayes.20:15200000-15300000.baq.20110328.vcf, freebayes.20:15300000-15400000.baq.20110328.vcf, freebayes.20:15400000-15500000.baq.20110328.vcf, freebayes.20:15500000-15600000.baq.20110328.vcf, freebayes.20:15600000-15700000.baq.20110328.vcf, freebayes.20:15700000-15800000.baq.20110328.vcf, freebayes.20:15800000-15900000.baq.20110328.vcf, freebayes.20:15900000-16000000.baq.20110328.vcf, freebayes.20:16000000-16100000.baq.20110328.vcf, freebayes.20:16100000-16200000.baq.20110328.vcf, freebayes.20:16200000-16300000.baq.20110328.vcf, freebayes.20:16300000-16400000.baq.20110328.vcf, freebayes.20:16400000-16500000.baq.20110328.vcf, freebayes.20:16500000-16600000.baq.20110328.vcf, freebayes.20:16600000-16700000.baq.20110328.vcf, freebayes.20:16700000-16800000.baq.20110328.vcf, freebayes.20:16800000-16900000.baq.20110328.vcf, freebayes.20:16900000-17000000.baq.20110328.vcf, freebayes.20:17000000-17100000.baq.20110328.vcf, freebayes.20:17100000-17200000.baq.20110328.vcf, freebayes.20:17200000-17300000.baq.20110328.vcf, freebayes.20:17300000-17400000.baq.20110328.vcf, freebayes.20:17400000-17500000.baq.20110328.vcf, freebayes.20:17500000-17600000.baq.20110328.vcf, freebayes.20:17600000-17700000.baq.20110328.vcf, freebayes.20:17700000-17800000.baq.20110328.vcf, freebayes.20:17800000-17900000.baq.20110328.vcf, freebayes.20:17900000-18000000.baq.20110328.vcf, freebayes.20:18000000-18100000.baq.20110328.vcf, freebayes.20:18100000-18200000.baq.20110328.vcf, freebayes.20:18200000-18300000.baq.20110328.vcf, freebayes.20:18300000-18400000.baq.20110328.vcf, freebayes.20:18400000-18500000.baq.20110328.vcf, freebayes.20:18500000-18600000.baq.20110328.vcf, freebayes.20:18600000-18700000.baq.20110328.vcf, freebayes.20:18700000-18800000.baq.20110328.vcf, freebayes.20:18800000-18900000.baq.20110328.vcf, freebayes.20:18900000-19000000.baq.20110328.vcf, freebayes.20:19000000-19100000.baq.20110328.vcf, freebayes.20:19100000-19200000.baq.20110328.vcf, freebayes.20:19200000-19300000.baq.20110328.vcf, freebayes.20:19300000-19400000.baq.20110328.vcf, freebayes.20:19400000-19500000.baq.20110328.vcf, freebayes.20:19500000-19600000.baq.20110328.vcf, freebayes.20:19600000-19700000.baq.20110328.vcf, freebayes.20:19700000-19800000.baq.20110328.vcf, freebayes.20:19800000-19900000.baq.20110328.vcf, freebayes.20:19900000-20000000.baq.20110328.vcf, freebayes.20:20000000-20100000.baq.20110328.vcf, freebayes.20:20100000-20200000.baq.20110328.vcf, freebayes.20:20200000-20300000.baq.20110328.vcf, freebayes.20:20300000-20400000.baq.20110328.vcf, freebayes.20:20400000-20500000.baq.20110328.vcf, freebayes.20:20500000-20600000.baq.20110328.vcf, freebayes.20:20600000-20700000.baq.20110328.vcf, freebayes.20:20700000-20800000.baq.20110328.vcf, freebayes.20:20800000-20900000.baq.20110328.vcf, freebayes.20:20900000-21000000.baq.20110328.vcf, freebayes.20:21000000-21100000.baq.20110328.vcf, freebayes.20:21100000-21200000.baq.20110328.vcf, freebayes.20:21200000-21300000.baq.20110328.vcf, freebayes.20:21300000-21400000.baq.20110328.vcf, freebayes.20:21400000-21500000.baq.20110328.vcf, freebayes.20:21500000-21600000.baq.20110328.vcf, freebayes.20:21600000-21700000.baq.20110328.vcf, freebayes.20:21700000-21800000.baq.20110328.vcf, freebayes.20:21800000-21900000.baq.20110328.vcf, freebayes.20:21900000-22000000.baq.20110328.vcf, freebayes.20:22000000-22100000.baq.20110328.vcf, freebayes.20:22100000-22200000.baq.20110328.vcf, freebayes.20:22200000-22300000.baq.20110328.vcf, freebayes.20:22300000-22400000.baq.20110328.vcf, freebayes.20:22400000-22500000.baq.20110328.vcf, freebayes.20:22500000-22600000.baq.20110328.vcf, freebayes.20:22600000-22700000.baq.20110328.vcf, freebayes.20:22700000-22800000.baq.20110328.vcf, freebayes.20:22800000-22900000.baq.20110328.vcf, freebayes.20:22900000-23000000.baq.20110328.vcf, freebayes.20:23000000-23100000.baq.20110328.vcf, freebayes.20:23100000-23200000.baq.20110328.vcf, freebayes.20:23200000-23300000.baq.20110328.vcf, freebayes.20:23300000-23400000.baq.20110328.vcf, freebayes.20:23400000-23500000.baq.20110328.vcf, freebayes.20:23500000-23600000.baq.20110328.vcf, freebayes.20:23600000-23700000.baq.20110328.vcf, freebayes.20:23700000-23800000.baq.20110328.vcf, freebayes.20:23800000-23900000.baq.20110328.vcf, freebayes.20:23900000-24000000.baq.20110328.vcf, freebayes.20:24000000-24100000.baq.20110328.vcf, freebayes.20:24100000-24200000.baq.20110328.vcf, freebayes.20:24200000-24300000.baq.20110328.vcf, freebayes.20:24300000-24400000.baq.20110328.vcf, freebayes.20:24400000-24500000.baq.20110328.vcf, freebayes.20:24500000-24600000.baq.20110328.vcf, freebayes.20:24600000-24700000.baq.20110328.vcf, freebayes.20:24700000-24800000.baq.20110328.vcf, freebayes.20:24800000-24900000.baq.20110328.vcf, freebayes.20:24900000-25000000.baq.20110328.vcf, freebayes.20:25000000-25100000.baq.20110328.vcf, freebayes.20:25100000-25200000.baq.20110328.vcf, freebayes.20:25200000-25300000.baq.20110328.vcf, freebayes.20:25300000-25400000.baq.20110328.vcf, freebayes.20:25400000-25500000.baq.20110328.vcf, freebayes.20:25500000-25600000.baq.20110328.vcf, freebayes.20:25600000-25700000.baq.20110328.vcf, freebayes.20:25700000-25800000.baq.20110328.vcf, freebayes.20:25800000-25900000.baq.20110328.vcf, freebayes.20:25900000-26000000.baq.20110328.vcf, freebayes.20:26000000-26100000.baq.20110328.vcf, freebayes.20:26100000-26200000.baq.20110328.vcf, freebayes.20:26200000-26300000.baq.20110328.vcf, freebayes.20:26300000-26400000.baq.20110328.vcf, freebayes.20:26400000-26500000.baq.20110328.vcf, freebayes.20:26500000-26600000.baq.20110328.vcf, freebayes.20:26600000-26700000.baq.20110328.vcf, freebayes.20:26700000-26800000.baq.20110328.vcf, freebayes.20:26800000-26900000.baq.20110328.vcf, freebayes.20:26900000-27000000.baq.20110328.vcf, freebayes.20:27000000-27100000.baq.20110328.vcf, freebayes.20:27100000-27200000.baq.20110328.vcf, freebayes.20:27200000-27300000.baq.20110328.vcf, freebayes.20:27300000-27400000.baq.20110328.vcf, freebayes.20:27400000-27500000.baq.20110328.vcf, freebayes.20:27500000-27600000.baq.20110328.vcf, freebayes.20:27600000-27700000.baq.20110328.vcf, freebayes.20:27700000-27800000.baq.20110328.vcf, freebayes.20:27800000-27900000.baq.20110328.vcf, freebayes.20:27900000-28000000.baq.20110328.vcf, freebayes.20:28000000-28100000.baq.20110328.vcf, freebayes.20:28100000-28200000.baq.20110328.vcf, freebayes.20:28200000-28300000.baq.20110328.vcf, freebayes.20:28300000-28400000.baq.20110328.vcf, freebayes.20:28400000-28500000.baq.20110328.vcf, freebayes.20:28500000-28600000.baq.20110328.vcf, freebayes.20:28600000-28700000.baq.20110328.vcf, freebayes.20:28700000-28800000.baq.20110328.vcf, freebayes.20:28800000-28900000.baq.20110328.vcf, freebayes.20:28900000-29000000.baq.20110328.vcf, freebayes.20:29000000-29100000.baq.20110328.vcf, freebayes.20:29100000-29200000.baq.20110328.vcf, freebayes.20:29200000-29300000.baq.20110328.vcf, freebayes.20:29300000-29400000.baq.20110328.vcf, freebayes.20:29400000-29500000.baq.20110328.vcf, freebayes.20:29500000-29600000.baq.20110328.vcf, freebayes.20:29600000-29700000.baq.20110328.vcf, freebayes.20:29700000-29800000.baq.20110328.vcf, freebayes.20:29800000-29900000.baq.20110328.vcf, freebayes.20:29900000-30000000.baq.20110328.vcf, freebayes.20:30000000-30100000.baq.20110328.vcf, freebayes.20:30100000-30200000.baq.20110328.vcf, freebayes.20:30200000-30300000.baq.20110328.vcf, freebayes.20:30300000-30400000.baq.20110328.vcf, freebayes.20:30400000-30500000.baq.20110328.vcf, freebayes.20:30500000-30600000.baq.20110328.vcf, freebayes.20:30600000-30700000.baq.20110328.vcf, freebayes.20:30700000-30800000.baq.20110328.vcf, freebayes.20:30800000-30900000.baq.20110328.vcf, freebayes.20:30900000-31000000.baq.20110328.vcf, freebayes.20:31000000-31100000.baq.20110328.vcf, freebayes.20:31100000-31200000.baq.20110328.vcf, freebayes.20:31200000-31300000.baq.20110328.vcf, freebayes.20:31300000-31400000.baq.20110328.vcf, freebayes.20:31400000-31500000.baq.20110328.vcf, freebayes.20:31500000-31600000.baq.20110328.vcf, freebayes.20:31600000-31700000.baq.20110328.vcf, freebayes.20:31700000-31800000.baq.20110328.vcf, freebayes.20:31800000-31900000.baq.20110328.vcf, freebayes.20:31900000-32000000.baq.20110328.vcf, freebayes.20:32000000-32100000.baq.20110328.vcf, freebayes.20:32100000-32200000.baq.20110328.vcf, freebayes.20:32200000-32300000.baq.20110328.vcf, freebayes.20:32300000-32400000.baq.20110328.vcf, freebayes.20:32400000-32500000.baq.20110328.vcf, freebayes.20:32500000-32600000.baq.20110328.vcf, freebayes.20:32600000-32700000.baq.20110328.vcf, freebayes.20:32700000-32800000.baq.20110328.vcf, freebayes.20:32800000-32900000.baq.20110328.vcf, freebayes.20:32900000-33000000.baq.20110328.vcf, freebayes.20:33000000-33100000.baq.20110328.vcf, freebayes.20:33100000-33200000.baq.20110328.vcf, freebayes.20:33200000-33300000.baq.20110328.vcf, freebayes.20:33300000-33400000.baq.20110328.vcf, freebayes.20:33400000-33500000.baq.20110328.vcf, freebayes.20:33500000-33600000.baq.20110328.vcf, freebayes.20:33600000-33700000.baq.20110328.vcf, freebayes.20:33700000-33800000.baq.20110328.vcf, freebayes.20:33800000-33900000.baq.20110328.vcf, freebayes.20:33900000-34000000.baq.20110328.vcf, freebayes.20:34000000-34100000.baq.20110328.vcf, freebayes.20:34100000-34200000.baq.20110328.vcf, freebayes.20:34200000-34300000.baq.20110328.vcf, freebayes.20:34300000-34400000.baq.20110328.vcf, freebayes.20:34400000-34500000.baq.20110328.vcf, freebayes.20:34500000-34600000.baq.20110328.vcf, freebayes.20:34600000-34700000.baq.20110328.vcf, freebayes.20:34700000-34800000.baq.20110328.vcf, freebayes.20:34800000-34900000.baq.20110328.vcf, freebayes.20:34900000-35000000.baq.20110328.vcf, freebayes.20:35000000-35100000.baq.20110328.vcf, freebayes.20:35100000-35200000.baq.20110328.vcf, freebayes.20:35200000-35300000.baq.20110328.vcf, freebayes.20:35300000-35400000.baq.20110328.vcf, freebayes.20:35400000-35500000.baq.20110328.vcf, freebayes.20:35500000-35600000.baq.20110328.vcf, freebayes.20:35600000-35700000.baq.20110328.vcf, freebayes.20:35700000-35800000.baq.20110328.vcf, freebayes.20:35800000-35900000.baq.20110328.vcf, freebayes.20:35900000-36000000.baq.20110328.vcf, freebayes.20:36000000-36100000.baq.20110328.vcf, freebayes.20:36100000-36200000.baq.20110328.vcf, freebayes.20:36200000-36300000.baq.20110328.vcf, freebayes.20:36300000-36400000.baq.20110328.vcf, freebayes.20:36400000-36500000.baq.20110328.vcf, freebayes.20:36500000-36600000.baq.20110328.vcf, freebayes.20:36600000-36700000.baq.20110328.vcf, freebayes.20:36700000-36800000.baq.20110328.vcf, freebayes.20:36800000-36900000.baq.20110328.vcf, freebayes.20:36900000-37000000.baq.20110328.vcf, freebayes.20:37000000-37100000.baq.20110328.vcf, freebayes.20:37100000-37200000.baq.20110328.vcf, freebayes.20:37200000-37300000.baq.20110328.vcf, freebayes.20:37300000-37400000.baq.20110328.vcf, freebayes.20:37400000-37500000.baq.20110328.vcf, freebayes.20:37500000-37600000.baq.20110328.vcf, freebayes.20:37600000-37700000.baq.20110328.vcf, freebayes.20:37700000-37800000.baq.20110328.vcf, freebayes.20:37800000-37900000.baq.20110328.vcf, freebayes.20:37900000-38000000.baq.20110328.vcf, freebayes.20:38000000-38100000.baq.20110328.vcf, freebayes.20:38100000-38200000.baq.20110328.vcf, freebayes.20:38200000-38300000.baq.20110328.vcf, freebayes.20:38300000-38400000.baq.20110328.vcf, freebayes.20:38400000-38500000.baq.20110328.vcf, freebayes.20:38500000-38600000.baq.20110328.vcf, freebayes.20:38600000-38700000.baq.20110328.vcf, freebayes.20:38700000-38800000.baq.20110328.vcf, freebayes.20:38800000-38900000.baq.20110328.vcf, freebayes.20:38900000-39000000.baq.20110328.vcf, freebayes.20:39000000-39100000.baq.20110328.vcf, freebayes.20:39100000-39200000.baq.20110328.vcf, freebayes.20:39200000-39300000.baq.20110328.vcf, freebayes.20:39300000-39400000.baq.20110328.vcf, freebayes.20:39400000-39500000.baq.20110328.vcf, freebayes.20:39500000-39600000.baq.20110328.vcf, freebayes.20:39600000-39700000.baq.20110328.vcf, freebayes.20:39700000-39800000.baq.20110328.vcf, freebayes.20:39800000-39900000.baq.20110328.vcf, freebayes.20:39900000-40000000.baq.20110328.vcf, freebayes.20:40000000-40100000.baq.20110328.vcf, freebayes.20:40100000-40200000.baq.20110328.vcf, freebayes.20:40200000-40300000.baq.20110328.vcf, freebayes.20:40300000-40400000.baq.20110328.vcf, freebayes.20:40400000-40500000.baq.20110328.vcf, freebayes.20:40500000-40600000.baq.20110328.vcf, freebayes.20:40600000-40700000.baq.20110328.vcf, freebayes.20:40700000-40800000.baq.20110328.vcf, freebayes.20:40800000-40900000.baq.20110328.vcf, freebayes.20:40900000-41000000.baq.20110328.vcf, freebayes.20:41000000-41100000.baq.20110328.vcf, freebayes.20:41100000-41200000.baq.20110328.vcf, freebayes.20:41200000-41300000.baq.20110328.vcf, freebayes.20:41300000-41400000.baq.20110328.vcf, freebayes.20:41400000-41500000.baq.20110328.vcf, freebayes.20:41500000-41600000.baq.20110328.vcf, freebayes.20:41600000-41700000.baq.20110328.vcf, freebayes.20:41700000-41800000.baq.20110328.vcf, freebayes.20:41800000-41900000.baq.20110328.vcf, freebayes.20:41900000-42000000.baq.20110328.vcf, freebayes.20:42000000-42100000.baq.20110328.vcf, freebayes.20:42100000-42200000.baq.20110328.vcf, freebayes.20:42200000-42300000.baq.20110328.vcf, freebayes.20:42300000-42400000.baq.20110328.vcf, freebayes.20:42400000-42500000.baq.20110328.vcf, freebayes.20:42500000-42600000.baq.20110328.vcf, freebayes.20:42600000-42700000.baq.20110328.vcf, freebayes.20:42700000-42800000.baq.20110328.vcf, freebayes.20:42800000-42900000.baq.20110328.vcf, freebayes.20:42900000-43000000.baq.20110328.vcf, freebayes.20:43000000-43100000.baq.20110328.vcf, freebayes.20:43100000-43200000.baq.20110328.vcf, freebayes.20:43200000-43300000.baq.20110328.vcf, freebayes.20:43300000-43400000.baq.20110328.vcf, freebayes.20:43400000-43500000.baq.20110328.vcf, freebayes.20:43500000-43600000.baq.20110328.vcf, freebayes.20:43600000-43700000.baq.20110328.vcf, freebayes.20:43700000-43800000.baq.20110328.vcf, freebayes.20:43800000-43900000.baq.20110328.vcf, freebayes.20:43900000-44000000.baq.20110328.vcf, freebayes.20:44000000-44100000.baq.20110328.vcf, freebayes.20:44100000-44200000.baq.20110328.vcf, freebayes.20:44200000-44300000.baq.20110328.vcf, freebayes.20:44300000-44400000.baq.20110328.vcf, freebayes.20:44400000-44500000.baq.20110328.vcf, freebayes.20:44500000-44600000.baq.20110328.vcf, freebayes.20:44600000-44700000.baq.20110328.vcf, freebayes.20:44700000-44800000.baq.20110328.vcf, freebayes.20:44800000-44900000.baq.20110328.vcf, freebayes.20:44900000-45000000.baq.20110328.vcf, freebayes.20:45000000-45100000.baq.20110328.vcf, freebayes.20:45100000-45200000.baq.20110328.vcf, freebayes.20:45200000-45300000.baq.20110328.vcf, freebayes.20:45300000-45400000.baq.20110328.vcf, freebayes.20:45400000-45500000.baq.20110328.vcf, freebayes.20:45500000-45600000.baq.20110328.vcf, freebayes.20:45600000-45700000.baq.20110328.vcf, freebayes.20:45700000-45800000.baq.20110328.vcf, freebayes.20:45800000-45900000.baq.20110328.vcf, freebayes.20:45900000-46000000.baq.20110328.vcf, freebayes.20:46000000-46100000.baq.20110328.vcf, freebayes.20:46100000-46200000.baq.20110328.vcf, freebayes.20:46200000-46300000.baq.20110328.vcf, freebayes.20:46300000-46400000.baq.20110328.vcf, freebayes.20:46400000-46500000.baq.20110328.vcf, freebayes.20:46500000-46600000.baq.20110328.vcf, freebayes.20:46600000-46700000.baq.20110328.vcf, freebayes.20:46700000-46800000.baq.20110328.vcf, freebayes.20:46800000-46900000.baq.20110328.vcf, freebayes.20:46900000-47000000.baq.20110328.vcf, freebayes.20:47000000-47100000.baq.20110328.vcf, freebayes.20:47100000-47200000.baq.20110328.vcf, freebayes.20:47200000-47300000.baq.20110328.vcf, freebayes.20:47300000-47400000.baq.20110328.vcf, freebayes.20:47400000-47500000.baq.20110328.vcf, freebayes.20:47500000-47600000.baq.20110328.vcf, freebayes.20:47600000-47700000.baq.20110328.vcf, freebayes.20:47700000-47800000.baq.20110328.vcf, freebayes.20:47800000-47900000.baq.20110328.vcf, freebayes.20:47900000-48000000.baq.20110328.vcf, freebayes.20:48000000-48100000.baq.20110328.vcf, freebayes.20:48100000-48200000.baq.20110328.vcf, freebayes.20:48200000-48300000.baq.20110328.vcf, freebayes.20:48300000-48400000.baq.20110328.vcf, freebayes.20:48400000-48500000.baq.20110328.vcf, freebayes.20:48500000-48600000.baq.20110328.vcf, freebayes.20:48600000-48700000.baq.20110328.vcf, freebayes.20:48700000-48800000.baq.20110328.vcf, freebayes.20:48800000-48900000.baq.20110328.vcf, freebayes.20:48900000-49000000.baq.20110328.vcf, freebayes.20:49000000-49100000.baq.20110328.vcf, freebayes.20:49100000-49200000.baq.20110328.vcf, freebayes.20:49200000-49300000.baq.20110328.vcf, freebayes.20:49300000-49400000.baq.20110328.vcf, freebayes.20:49400000-49500000.baq.20110328.vcf, freebayes.20:49500000-49600000.baq.20110328.vcf, freebayes.20:49600000-49700000.baq.20110328.vcf, freebayes.20:49700000-49800000.baq.20110328.vcf, freebayes.20:49800000-49900000.baq.20110328.vcf, freebayes.20:49900000-50000000.baq.20110328.vcf, freebayes.20:50000000-50100000.baq.20110328.vcf, freebayes.20:50100000-50200000.baq.20110328.vcf, freebayes.20:50200000-50300000.baq.20110328.vcf, freebayes.20:50300000-50400000.baq.20110328.vcf, freebayes.20:50400000-50500000.baq.20110328.vcf, freebayes.20:50500000-50600000.baq.20110328.vcf, freebayes.20:50600000-50700000.baq.20110328.vcf, freebayes.20:50700000-50800000.baq.20110328.vcf, freebayes.20:50800000-50900000.baq.20110328.vcf, freebayes.20:50900000-51000000.baq.20110328.vcf, freebayes.20:51000000-51100000.baq.20110328.vcf, freebayes.20:51100000-51200000.baq.20110328.vcf, freebayes.20:51200000-51300000.baq.20110328.vcf, freebayes.20:51300000-51400000.baq.20110328.vcf, freebayes.20:51400000-51500000.baq.20110328.vcf, freebayes.20:51500000-51600000.baq.20110328.vcf, freebayes.20:51600000-51700000.baq.20110328.vcf, freebayes.20:51700000-51800000.baq.20110328.vcf, freebayes.20:51800000-51900000.baq.20110328.vcf, freebayes.20:51900000-52000000.baq.20110328.vcf, freebayes.20:52000000-52100000.baq.20110328.vcf, freebayes.20:52100000-52200000.baq.20110328.vcf, freebayes.20:52200000-52300000.baq.20110328.vcf, freebayes.20:52300000-52400000.baq.20110328.vcf, freebayes.20:52400000-52500000.baq.20110328.vcf, freebayes.20:52500000-52600000.baq.20110328.vcf, freebayes.20:52600000-52700000.baq.20110328.vcf, freebayes.20:52700000-52800000.baq.20110328.vcf, freebayes.20:52800000-52900000.baq.20110328.vcf, freebayes.20:52900000-53000000.baq.20110328.vcf, freebayes.20:53000000-53100000.baq.20110328.vcf, freebayes.20:53100000-53200000.baq.20110328.vcf, freebayes.20:53200000-53300000.baq.20110328.vcf, freebayes.20:53300000-53400000.baq.20110328.vcf, freebayes.20:53400000-53500000.baq.20110328.vcf, freebayes.20:53500000-53600000.baq.20110328.vcf, freebayes.20:53600000-53700000.baq.20110328.vcf, freebayes.20:53700000-53800000.baq.20110328.vcf, freebayes.20:53800000-53900000.baq.20110328.vcf, freebayes.20:53900000-54000000.baq.20110328.vcf, freebayes.20:54000000-54100000.baq.20110328.vcf, freebayes.20:54100000-54200000.baq.20110328.vcf, freebayes.20:54200000-54300000.baq.20110328.vcf, freebayes.20:54300000-54400000.baq.20110328.vcf, freebayes.20:54400000-54500000.baq.20110328.vcf, freebayes.20:54500000-54600000.baq.20110328.vcf, freebayes.20:54600000-54700000.baq.20110328.vcf, freebayes.20:54700000-54800000.baq.20110328.vcf, freebayes.20:54800000-54900000.baq.20110328.vcf, freebayes.20:54900000-55000000.baq.20110328.vcf, freebayes.20:55000000-55100000.baq.20110328.vcf, freebayes.20:55100000-55200000.baq.20110328.vcf, freebayes.20:55200000-55300000.baq.20110328.vcf, freebayes.20:55300000-55400000.baq.20110328.vcf, freebayes.20:55400000-55500000.baq.20110328.vcf, freebayes.20:55500000-55600000.baq.20110328.vcf, freebayes.20:55600000-55700000.baq.20110328.vcf, freebayes.20:55700000-55800000.baq.20110328.vcf, freebayes.20:55800000-55900000.baq.20110328.vcf, freebayes.20:55900000-56000000.baq.20110328.vcf, freebayes.20:56000000-56100000.baq.20110328.vcf, freebayes.20:56100000-56200000.baq.20110328.vcf, freebayes.20:56200000-56300000.baq.20110328.vcf, freebayes.20:56300000-56400000.baq.20110328.vcf, freebayes.20:56400000-56500000.baq.20110328.vcf, freebayes.20:56500000-56600000.baq.20110328.vcf, freebayes.20:56600000-56700000.baq.20110328.vcf, freebayes.20:56700000-56800000.baq.20110328.vcf, freebayes.20:56800000-56900000.baq.20110328.vcf, freebayes.20:56900000-57000000.baq.20110328.vcf, freebayes.20:57000000-57100000.baq.20110328.vcf, freebayes.20:57100000-57200000.baq.20110328.vcf, freebayes.20:57200000-57300000.baq.20110328.vcf, freebayes.20:57300000-57400000.baq.20110328.vcf, freebayes.20:57400000-57500000.baq.20110328.vcf, freebayes.20:57500000-57600000.baq.20110328.vcf, freebayes.20:57600000-57700000.baq.20110328.vcf, freebayes.20:57700000-57800000.baq.20110328.vcf, freebayes.20:57800000-57900000.baq.20110328.vcf, freebayes.20:57900000-58000000.baq.20110328.vcf, freebayes.20:58000000-58100000.baq.20110328.vcf, freebayes.20:58100000-58200000.baq.20110328.vcf, freebayes.20:58200000-58300000.baq.20110328.vcf, freebayes.20:58300000-58400000.baq.20110328.vcf, freebayes.20:58400000-58500000.baq.20110328.vcf, freebayes.20:58500000-58600000.baq.20110328.vcf, freebayes.20:58600000-58700000.baq.20110328.vcf, freebayes.20:58700000-58800000.baq.20110328.vcf, freebayes.20:58800000-58900000.baq.20110328.vcf, freebayes.20:58900000-59000000.baq.20110328.vcf, freebayes.20:59000000-59100000.baq.20110328.vcf, freebayes.20:59100000-59200000.baq.20110328.vcf, freebayes.20:59200000-59300000.baq.20110328.vcf, freebayes.20:59300000-59400000.baq.20110328.vcf, freebayes.20:59400000-59500000.baq.20110328.vcf, freebayes.20:59500000-59600000.baq.20110328.vcf, freebayes.20:59600000-59700000.baq.20110328.vcf, freebayes.20:59700000-59800000.baq.20110328.vcf, freebayes.20:59800000-59900000.baq.20110328.vcf, freebayes.20:59900000-60000000.baq.20110328.vcf, freebayes.20:60000000-60100000.baq.20110328.vcf, freebayes.20:60100000-60200000.baq.20110328.vcf, freebayes.20:60200000-60300000.baq.20110328.vcf, freebayes.20:60300000-60400000.baq.20110328.vcf, freebayes.20:60400000-60500000.baq.20110328.vcf, freebayes.20:60500000-60600000.baq.20110328.vcf, freebayes.20:60600000-60700000.baq.20110328.vcf, freebayes.20:60700000-60800000.baq.20110328.vcf, freebayes.20:60800000-60900000.baq.20110328.vcf, freebayes.20:60900000-61000000.baq.20110328.vcf, freebayes.20:61000000-61100000.baq.20110328.vcf, freebayes.20:61100000-61200000.baq.20110328.vcf, freebayes.20:61200000-61300000.baq.20110328.vcf, freebayes.20:61300000-61400000.baq.20110328.vcf, freebayes.20:61400000-61500000.baq.20110328.vcf, freebayes.20:61500000-61600000.baq.20110328.vcf, freebayes.20:61600000-61700000.baq.20110328.vcf, freebayes.20:61700000-61800000.baq.20110328.vcf, freebayes.20:61800000-61900000.baq.20110328.vcf, freebayes.20:61900000-62000000.baq.20110328.vcf, freebayes.20:62000000-62100000.baq.20110328.vcf, freebayes.20:62100000-62200000.baq.20110328.vcf, freebayes.20:62200000-62300000.baq.20110328.vcf, freebayes.20:62300000-62400000.baq.20110328.vcf, freebayes.20:62400000-62500000.baq.20110328.vcf, freebayes.20:62500000-62600000.baq.20110328.vcf, freebayes.20:62600000-62700000.baq.20110328.vcf, freebayes.20:62700000-62800000.baq.20110328.vcf, freebayes.20:62800000-62900000.baq.20110328.vcf, freebayes.20:62900000-63000000.baq.20110328.vcf, freebayes.20:63000000-63025520.baq.20110328.vcf +#CHROM POS ID REF ALT QUAL FILTER INFO +20 458502 . G GA 4567.01 PASS AA=20;AB=0.61111;ABA=14;ABP=6.8707;ABR=22;AC=38;AF=0.0544;AN=698;BL=374;BR=1129;BVAR;BaseQRankSum=13.364;DP=15979;DP4=1882,2188,45,37;Dels=0.00;EL=5;EPP=13.868;ER=15;FR;FS=6.503;HETAR=11;HOMA=2;HOMR=985;HP=1;HPLen=2;HR=2;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.0157;LEN=1;LRB=0.50233;LRBP=826.56;MQ=66.16;MQ0Fraction=0.0110;MQM=70.5;MQRankSum=-3.158;NF;NR;NS=998;PP;PV4=0.15,1,0.42,0.15;RA=3173;RL=1;RPP=38.188;RR=19;RUN=1;ReadPosRankSum=-2.346;SAB=0.7;SAF=14;SAP=9.959;SAR=6;SC=GGGCGTGGTGGTGCATGTAAT;SRB=0.50047;SRF=1588;SRP=3.0165;SRR=1585;TC;TR=9;TU=GGT;VQSLOD=10.0079;set=Intersection;sumGLbyD=23.94 +20 539571 . TG T 18546 PASS AA=71;AB=0.92482;ABA=63;ABP=1316.6;ABR=775;AC=42;AF=0.03512;AN=1196;BL=3915;BR=252;BVAR;BaseQRankSum=0.556;DEL;DP=10073;Dels=0.01;EL=47;EPP=19.189;ER=24;FS=2.124;HETAR=290;HOMA=156;HOMR=570;HRun=1;InbreedingCoeff=0.0620;LEN=1;LRB=0.87905;LRBP=6995.1;MQ0=0;MQ0Fraction=0.0000;MQM=127.99;MQRankSum=0.410;NS=1016;RA=3090;RL=71;RPP=157.18;RR=0;RUN=1;ReadPosRankSum=-11.038;SAB=0.66197;SAF=47;SAP=19.189;SAR=24;SRB=0.55016;SRF=1700;SRP=70.544;SRR=1390;VQSLOD=2.6772;set=filterInVQSR-2of5;sumGLbyD=4.71 +20 573764 . TA T 591.51 PASS AC=91;AF=0.1987;AN=458;BaseQRankSum=0.137;DP=519;FS=3.153;HRun=1;HaplotypeScore=14.0744;InbreedingCoeff=0.1460;MQ=48.16;MQ0=26;MQ0Fraction=0.0501;MQRankSum=-1.636;QD=3.63;ReadPosRankSum=-4.140;SB=-408.14;VQSLOD=5.2458;set=VQSR +20 766143 . C A,CATCTGGTA 5521.70 PASS AA=24;AB=0.5;ABA=18;ABP=3.0103;ABR=18;AC=14;AF=0.0289;AF1=0.02038;AN=484;BL=655;BR=1542;BVAR;BaseQRankSum=3.801;CI95=0.01549,0.02655;DP=11749;DP4=2222,1998,14,8;Dels=0.00;EL=9;EPP=6.2675;ER=15;FQ=999;FR;FS=2.941;HETAR=9;HOMA=4;HOMR=901;HP=2;HPLen=2;HR=1;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.0515;LEN=8;LRB=0.40373;LRBP=780.64;MQ=56.81;MQ0Fraction=0.0253;MQM=22.167;MQRankSum=-4.809;NF;NR;NS=914;PP;PV4=0.39,1,5.8e-07,1;RA=3093;RL=6;RPP=16.039;RR=18;RUN=1;ReadPosRankSum=-2.827;SAB=0.625;SAF=15;SAP=6.2675;SAR=9;SC=GCTTTAAATTCATCTGGTACT;SRB=0.61623;SRF=1906;SRP=365.95;SRR=1187;TC;TR=1;TU=A;VQSLOD=7.0268;set=Intersection;sumGLbyD=50.23 +20 997076 rs11467490 CTG C 15379.78 PASS AA=195;AB=0.59878;ABA=132;ABP=30.896;ABR=197;AC=173;AF=0.14562;AN=1188;BL=7664;BR=7309;BVAR;BaseQRankSum=21.853;DB;DEL;DP=27127;DP4=1801,2002,241,282;Dels=0.13;EL=100;EPP=3.2887;ER=95;FQ=999;FR;FS=6.591;HETAR=77;HOMA=42;HOMR=815;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1284;LEN=2;LRB=0.023709;LRBP=21.287;MQ=61.18;MQ0Fraction=0.0214;MQM=43.041;MQRankSum=6.886;NF;NR;NS=934;PP;PV4=0.61,1.5e-78,1,1;RA=2800;RL=120;RPP=25.56;RR=75;RUN=1;ReadPosRankSum=4.504;SAB=0.62051;SAF=121;SAP=27.609;SAR=74;SC=CAGCTAATTACTGTATTTTTA;SRB=0.49821;SRF=1395;SRP=3.0879;SRR=1405;TC;TR=1;TU=T;VQSLOD=8.9396;set=Intersection;sumGLbyD=16.76 +20 1042261 rs10597473 CCCTG C 168658.05 PASS AA=4481;AB=0.29043;ABA=2128;ABP=1147.1;ABR=871;AC=1172;AF=0.97830;AN=1198;BL=169975;BR=194027;BVAR;BaseQRankSum=4.599;DB;DEL;DP=29418;DP4=29,47,1441,2403;Dels=0.84;EL=2358;EPP=29.772;ER=2123;FR;FS=9.122;HETAR=482;HOMA=559;HOMR=30;HP=2;HPLen=3;HR=3;HRun=0;HU=C;INDEL;InbreedingCoeff=0.0470;LEN=4;LRB=0.066077;LRBP=3454.1;MQ=104.58;MQ0=4;MQ0Fraction=0.0014;MQM=58.257;MQRankSum=-3.368;NF;NR;NS=1071;PP;PV4=0.91,6.8e-09,2.8e-05,1;RA=1039;RL=2088;RPP=48.09;RR=2393;RUN=1;ReadPosRankSum=5.288;SAB=0.41442;SAF=1857;SAP=288.09;SAR=2624;SC=CCAAACCCAACCCTGCCTGGC;SRB=0.48893;SRF=508;SRP=4.1159;SRR=531;TC;TR=8;TU=CCTG;VQSLOD=8.5148;dbSNP=120;set=Intersection;sumGLbyD=59.79 +20 1046297 rs33956316 C CT,CTT,CTTT 17698 PASS ABR=408;AC=432,79,230;AF=0.39779,0.07274,0.21179;BVAR;BaseQRankSum=-8.413;DB;DP=15649;DP4=147,199,534,436;FR;FS=11.580;HOMA=97;HOMR=457;HP=20;HR=16;HU=T;HaplotypeScore=16.0590;INDEL;INS;InbreedingCoeff=0.6018;KGPilot123;MQ0=19;MQ0Fraction=0.0093;MQRankSum=7.992;NF;NR;NS=767;PP;PV4=6e-05,1,1,1;QD=8.18;RA=1183;RUN=1;ReadPosRankSum=2.684;SB=-6384.08;SC=GGAAAATTTTCTTTTTTTTTT;SRB=0.40913;SRF=484;SRP=87.859;SRR=699;TC;TR=16;TU=T;VQSLOD=8.4941;dbSNP=132;set=Intersection +20 1405740 . T TA 257.28 PASS AF=0.0188;BaseQRankSum=-0.745;DP=3769;Dels=0.00;FS=0.742;HPLen=9;HRun=9;InbreedingCoeff=0.0462;MQ0Fraction=0.0151;MQRankSum=-0.090;ReadPosRankSum=-1.582;VQSLOD=5.6502;set=Intersection;sumGLbyD=6.94 +20 1690501 . TC T 27928 PASS AA=108;AB=0.91372;ABA=100;ABP=1726.1;ABR=1059;AC=35;AF=0.02966;AN=1180;BL=593;BR=6973;BVAR;BaseQRankSum=7.567;DEL;DP=10612;Dels=0.01;EL=50;EPP=4.2971;ER=58;FS=0.000;HETAR=378;HOMA=184;HOMR=477;HRun=1;InbreedingCoeff=0.0495;LEN=1;LRB=0.84325;LRBP=11685;MQ0=0;MQ0Fraction=0.0000;MQM=87.361;MQRankSum=4.088;NS=1045;RA=3125;RL=3;RPP=212.2;RR=105;RUN=1;ReadPosRankSum=-13.096;SAB=0.56481;SAF=61;SAP=6.9511;SAR=47;SRB=0.51776;SRF=1618;SRP=11.572;SRR=1507;VQSLOD=3.9824;set=filterInVQSR-2of5;sumGLbyD=4.07 +20 1948787 . GTC G,GTCTC 78.70 PASS AC=18,18;AF=0.01466,0.01466;AN=1228;BaseQRankSum=3.894;DP=19030;DP4=1874,1916,21,20;FR;FS=0.767;HP=2;HPLen=1;HR=1;HU=T;HaplotypeScore=16.5619;INDEL;InbreedingCoeff=0.2332;MQ0=0;MQ0Fraction=0.0000;MQRankSum=2.080;NF;NR;PP;PV4=0.88,1,0.094,0.47;QD=0.28;ReadPosRankSum=0.822;SB=-172.46;SC=CTCGACCCCTGTCTCTCTCTC;TC;TR=13;TU=CT;VQSLOD=3.7405;set=filterInVQSR-2of5 +20 1991285 rs113891396 TAA T,TA,TAAA,TAAAAA,TAAAAAA,TAAAAAAA,TAAAAAAAA 39235.36 PASS AC=5,251,20,39,188,52,79;AF=0.0056,0.2789,0.0222,0.0433,0.2089,0.0578,0.0878;AN=900;BVAR;BaseQRankSum=1.124;DB;DEL;DP=54393;DP4=906,772,824,579;Dels=0.21;FR;FS=37.525;HP=12;HR=12;HRun=12;HU=A;INDEL;INS;InbreedingCoeff=0.6891;MQ=76.81;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-6.593;NF;NR;PP;PV4=0.0087,1,6.3e-19,1;RUN=1;ReadPosRankSum=-2.184;SC=ATCTGCCACTTAAAAAAAAAA;TC;TR=12;TU=A;VQSLOD=9.0007;dbSNP=132;set=Intersection;sumGLbyD=11.45 +20 2355911 . TA T 11723 PASS AA=79;AB=0.9393;ABA=57;ABP=1577;ABR=882;AC=38;AF=0.0411;AN=924;BL=644;BR=5536;BVAR;BaseQRankSum=2.434;DEL;DP=9687;Dels=0.00;EL=45;EPP=6.3362;ER=34;FS=3.043;HETAR=321;HOMA=182;HOMR=555;HRun=5;InbreedingCoeff=0.0412;LEN=1;LRB=0.79159;LRBP=8411.9;MQ0=0;MQ0Fraction=0.0000;MQM=70.848;MQRankSum=0.137;NS=1058;RA=3415;RL=3;RPP=149.49;RR=76;RUN=1;ReadPosRankSum=-12.116;SAB=0.44304;SAF=35;SAP=5.2367;SAR=44;SRB=0.43572;SRF=1488;SRP=125.55;SRR=1927;VQSLOD=3.8910;set=filterInVQSR-2of5;sumGLbyD=4.88 +20 2512346 . A AC 11046.11 PASS AC=673;AF=0.57034;AN=1180;BaseQRankSum=19.890;DP=2717;FS=26.809;HRun=0;HaplotypeScore=19.0575;InbreedingCoeff=0.3068;MQ=61.07;MQ0=25;MQ0Fraction=0.0092;MQRankSum=2.745;QD=5.80;ReadPosRankSum=3.139;SB=-4564.39;VQSLOD=4.3252;set=VQSR +20 2597210 rs71329387 TAAAG T 32206.62 PASS AA=689;AB=0.5805;ABA=542;ABP=75.724;ABR=750;AC=253;AF=0.20738;BL=29921;BR=30215;BVAR;BaseQRankSum=20.638;DB;DEL;DP=29293;DP4=1750,1070,405,274;Dels=0.18;EL=345;EPP=3.0135;ER=344;FQ=999;FR;FS=1.827;HETAR=225;HOMA=55;HOMR=783;HP=7;HPLen=4;HR=3;HRun=0;HU=A;INDEL;InbreedingCoeff=0.1419;LEN=4;LRB=0.0048889;LRBP=6.1314;MQ=66.96;MQ0=0;MQ0Fraction=0.0000;MQM=42.925;MQRankSum=-7.105;NF;NR;NS=1063;PP;PV4=0.25,1,9e-20,1;RA=4619;RL=345;RPP=3.0135;RR=344;RUN=1;ReadPosRankSum=2.719;SAB=0.53556;SAF=369;SAP=10.577;SAR=320;SC=GAAAGGAAAATAAAGAAGGAG;SRB=0.52414;SRF=2421;SRP=26.389;SRR=2198;TC;TR=3;TU=A;VQSLOD=9.7974;dbSNP=130;set=Intersection;sumGLbyD=33.30 +20 2771621 rs11479849 GT G,GTT 1605.60 PASS AA=80;AB=0.79825;ABA=69;ABP=267.24;ABR=273;AC=79,91;AF=0.06551,0.07546;AN=1206;BL=2593;BR=3805;BVAR;BaseQRankSum=7.825;DB;DP=9790;Dels=0.04;EL=37;EPP=3.9875;ER=43;FR;FS=4.751;HETAR=62;HOMA=5;HOMR=958;HP=11;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.2646;LEN=1;LRB=0.18943;LRBP=501.57;MQ0=0;MQ0Fraction=0.0000;MQM=52.45;MQRankSum=-0.560;NF;NR;NS=1025;PP;RA=3949;RL=29;RPP=16.148;RR=51;RUN=1;ReadPosRankSum=-2.397;SAB=0.525;SAF=42;SAP=3.4446;SAR=38;SC=TCATTTTAACGTTTTTTTTTT;SRB=0.54368;SRF=2147;SRP=68.46;SRR=1802;TC;TR=11;TU=T;VQSLOD=3.5989;set=filterInVQSR-2of5;sumGLbyD=3.92 +20 2891235 . G GT,GTTT 2869.87 PASS AC=236,246;AF=0.2803,0.2922;AN=842;BaseQRankSum=8.979;DP=1067;FS=3.911;HaplotypeScore=20.3595;InbreedingCoeff=0.6511;MQ=44.86;MQ0=114;MQ0Fraction=0.1068;MQRankSum=-2.273;QD=4.00;ReadPosRankSum=-6.601;SB=-991.85;VQSLOD=5.4379;set=VQSR +20 3033550 . TGAG T 2005.90 PASS AA=34;AB=0.51429;ABA=34;ABP=3.1344;ABR=36;AC=22;AF=0.0332;AN=662;BL=1374;BR=1649;BVAR;BaseQRankSum=5.192;DEL;DP=14639;DP4=2271,1492,12,21;Dels=0.02;EL=19;EPP=4.0322;ER=15;FR;FS=16.657;HETAR=17;HOMA=0;HOMR=914;HP=1;HPLen=1;HR=1;HRun=0;HU=G;INDEL;InbreedingCoeff=-0.0454;LEN=3;LRB=0.090969;LRBP=57.333;MQ=53.99;MQ0Fraction=0.0304;MQM=46.735;MQRankSum=1.938;NF;NR;NS=931;PP;PV4=0.0068,9.4e-05,1,1;RA=2985;RL=11;RPP=12.207;RR=23;RUN=1;ReadPosRankSum=-0.466;SAB=0.41176;SAF=14;SAP=5.3095;SAR=20;SC=CTTGGGAGGCTGAGGTGGGAG;SRB=0.62781;SRF=1874;SRP=426.52;SRR=1111;TC;TR=1;TU=G;VQSLOD=8.9194;set=Intersection;sumGLbyD=24.41 +20 3635363 . T TG 999 PASS AA=16;AB=0.61905;ABA=16;ABP=8.1805;ABR=26;AF=0.0141;AF1=0.01726;AN=708;BL=614;BR=523;BVAR;BaseQRankSum=2.337;CI95=0.01106,0.02434;DP=14594;DP4=2128,2038,6,10;Dels=0.00;EL=7;EPP=3.5532;ER=9;FQ=999;FR;FS=5.579;HETAR=8;HOMA=0;HOMR=1055;HP=3;HPLen=3;HR=3;HRun=3;HU=G;INDEL;INS;InbreedingCoeff=0.0633;LEN=1;LRB=0.080035;LRBP=18.826;MQ=100.74;MQ0=0;MQ0Fraction=0.0000;MQM=51.312;MQRankSum=2.569;NF;NR;NS=1063;PP;PV4=0.32,1,1,1;RA=5628;RL=9;RPP=3.5532;RR=7;RUN=1;ReadPosRankSum=-1.941;SAB=0.375;SAF=6;SAP=5.1818;SAR=10;SC=AAGGTTCGCTTGGGTGTGGAG;SRB=0.4984;SRF=2805;SRP=3.1353;SRR=2823;TC;TR=3;TU=G;VQSLOD=9.3275;set=Intersection;sumGLbyD=11.68 +20 3873327 rs61519218 A AAG 683.85 PASS AC=25;AF=0.0313;AN=800;BaseQRankSum=4.839;DB;DP=1718;FS=4.265;HRun=0;HaplotypeScore=20.5789;InbreedingCoeff=0.1055;MQ=53.70;MQ0=37;MQ0Fraction=0.0215;MQRankSum=2.468;QD=6.30;ReadPosRankSum=4.254;SB=-403.21;VQSLOD=6.1858;set=VQSR +20 4028835 . GC G 2511.30 PASS AA=66;AB=0.56954;ABA=65;ABP=9.3521;ABR=86;AC=22;AF=0.01836;AN=1198;BL=2303;BR=2463;BVAR;BaseQRankSum=7.621;DEL;DP=22795;DP4=1714,2774,22,37;Dels=0.02;EL=34;EPP=3.1419;ER=32;FQ=999;FR;FS=2.095;HETAR=21;HOMA=0;HOMR=1050;HP=2;HPLen=2;HR=2;HRun=2;HU=C;INDEL;InbreedingCoeff=0.0125;LEN=1;LRB=0.033571;LRBP=14.674;MQ=108.09;MQ0=0;MQ0Fraction=0.0000;MQM=53.318;MQRankSum=5.257;NF;NR;NS=1071;PP;PV4=1,5.4e-13,1,0.075;RA=6185;RL=36;RPP=4.1947;RR=30;RUN=1;ReadPosRankSum=-1.059;SAB=0.45455;SAF=30;SAP=4.1947;SAR=36;SC=TGCTGTCACTGCCTTCTCCTA;SRB=0.42118;SRF=2605;SRP=336.76;SRR=3580;TC;TR=2;TU=C;VQSLOD=10.2409;set=Intersection;sumGLbyD=12.71 +20 4039609 rs67812039 G GA 43457 PASS AA=909;AB=0.54639;ABA=572;ABP=26.583;ABR=689;AC=302;AF=0.3455;AN=874;BL=37070;BR=38211;BVAR;BaseQRankSum=20.147;DB;DP=25595;DP4=1483,1374,528,542;Dels=0.00;EL=467;EPP=4.5033;ER=442;FQ=999;FR;FS=5.441;HETAR=243;HOMA=127;HOMR=608;HP=4;HPLen=3;HR=3;HRun=3;HU=A;INDEL;INS;InbreedingCoeff=0.1388;LEN=1;LRB=0.015157;LRBP=40.563;MQ=119.50;MQ0=0;MQ0Fraction=0.0000;MQM=83.197;MQRankSum=1.080;NF;NR;NS=978;PP;PV4=0.16,1,3.6e-12,1;RA=3033;RL=443;RPP=4.274;RR=466;RUN=1;ReadPosRankSum=-1.000;SAB=0.32233;SAF=293;SAP=252.24;SAR=616;SC=TATGTTGGGAGAAATATCAGT;SRB=0.38378;SRF=1164;SRP=358.85;SRR=1869;TC;TR=4;TU=AG;VQSLOD=9.9146;dbSNP=130;set=Intersection;sumGLbyD=16.79 +20 4390056 . TC T 49312 PASS AA=91;AB=0.94353;ABA=86;ABP=2605.4;ABR=1437;AC=39;AF=0.03160;AN=1234;BL=6823;BR=731;BVAR;BaseQRankSum=2.727;DEL;DP=13149;Dels=0.00;EL=41;EPP=4.9431;ER=50;FS=4.002;HETAR=465;HOMA=313;HOMR=292;HRun=3;InbreedingCoeff=0.0326;LEN=1;LRB=0.80646;LRBP=10671;MQ0=0;MQ0Fraction=0.0000;MQM=69.824;MQRankSum=-0.903;NS=1073;RA=3078;RL=89;RPP=183.62;RR=2;RUN=1;ReadPosRankSum=-12.526;SAB=0.45055;SAF=41;SAP=4.9431;SAR=50;SRB=0.52567;SRF=1618;SRP=20.622;SRR=1460;VQSLOD=4.3235;set=Intersection;sumGLbyD=3.53 +20 4474622 . TA AA,T,TAA,TAAA,TAAAA 94522.28 PASS ABR=114;AC=38,68,16,900;AF=0.03333,0.05965,0.01404,0.78947;AN=1140;BVAR;BaseQRankSum=9.741;DB;DP=16656;Dels=0.00;FR;FS=2.355;HOMA=3;HOMR=936;HP=10;HPLen=10;HR=10;HRun=10;HU=A;INS;InbreedingCoeff=0.4516;MQ0=2;MQ0Fraction=0.0008;MQRankSum=-4.096;NF;NR;NS=980;PP;RA=3766;RUN=1;ReadPosRankSum=2.380;SC=AGAAAAAAATTAAAAAAAAAA;SRB=0.49734;SRF=1873;SRP=3.2409;SRR=1893;TC;TR=10;TU=A;VQSLOD=8.8186;set=Intersection;sumGLbyD=38.79 +20 4824911 . AC A 41998.70 PASS AC=1172;AF=0.97342;AN=1204;BaseQRankSum=8.604;DP=3615;FS=9.934;HRun=1;HaplotypeScore=39.6843;InbreedingCoeff=0.0980;MQ=129.80;MQ0=1;MQ0Fraction=0.0003;MQRankSum=3.378;QD=11.62;ReadPosRankSum=6.967;SB=-16955.28;VQSLOD=4.2689;set=VQSR +20 4839897 rs35881880 TAA T,TA,TAAA,TAAAAA 3906.80 PASS AC=12,95,137,189;AF=0.01024,0.08106,0.11689,0.16126;AN=1172;BVAR;BaseQRankSum=15.271;DB;DEL;DP=15105;Dels=0.04;FR;FS=43.567;HP=19;HR=13;HRun=13;HU=A;INS;InbreedingCoeff=0.5716;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.569;NF;NR;PP;RUN=1;ReadPosRankSum=-13.794;SC=TGTTAAAAAATAAAAAAAAAA;TC;TR=13;TU=A;VQSLOD=8.1773;set=Intersection;sumGLbyD=3.77 +20 5071386 . AT A 45200.27 PASS AC=685;AF=0.7495;AN=914;BaseQRankSum=11.006;DP=2725;FS=8.133;HRun=3;HaplotypeScore=50.5496;InbreedingCoeff=0.2364;MQ=81.40;MQ0=0;MQ0Fraction=0.0000;MQRankSum=2.411;QD=18.51;ReadPosRankSum=3.429;SB=-22405.85;VQSLOD=4.2872;set=VQSR +20 5507414 . G GCC 439.08 PASS AC=23;AF=0.01876;AN=1226;BaseQRankSum=3.051;DP=3023;FS=3.636;HRun=1;HaplotypeScore=30.3104;InbreedingCoeff=0.0204;MQ=112.09;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.065;QD=2.85;ReadPosRankSum=-2.709;SB=-302.22;VQSLOD=4.4311;set=VQSR +20 5609676 . GA G,GAA 799.89 PASS AA=42;AB=0.79096;ABA=37;ABP=133.16;ABR=140;AC=43,65;AF=0.03607,0.05453;AF1=0.02826;AN=1192;BL=1360;BR=2334;BVAR;BaseQRankSum=5.069;CI95=0.01242,0.04037;DP=15610;DP4=1548,2441,21,30;Dels=0.02;EL=18;EPP=4.8716;ER=24;FQ=12.1;FR;FS=0.000;HETAR=36;HOMA=1;HOMR=991;HP=13;HPLen=10;HR=10;HRun=10;HU=A;INDEL;INS;InbreedingCoeff=0.2001;LEN=1;LRB=0.26367;LRBP=560.68;MQ=63.29;MQ0Fraction=0.0003;MQM=44.143;MQRankSum=1.755;NF;NR;NS=1028;PP;PV4=0.77,1,0.0087,0.0053;RA=4114;RL=15;RPP=10.455;RR=27;RUN=1;ReadPosRankSum=-2.978;SAB=0.5;SAF=21;SAP=3.0103;SAR=21;SC=AAAAAAGAAAGAAAAAAAAAA;SRB=0.39742;SRF=1635;SRP=379;SRR=2479;TC;TR=11;TU=AAAG;VQSLOD=4.1229;set=filterInVQSR-2of5;sumGLbyD=7.95 +20 5736211 rs35303106 CT C,CTT 4384.40 PASS AA=117;AB=0.71499;ABA=116;ABP=166.4;ABR=291;AC=32,145;AF=0.02712,0.12288;AN=1180;BL=5556;BR=4901;BVAR;BaseQRankSum=2.708;DB;DP=9157;Dels=0.01;EL=54;EPP=4.5136;ER=63;FR;FS=2.802;HETAR=79;HOMA=1;HOMR=837;HP=16;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.1903;LEN=1;LRB=0.062637;LRBP=92.1;MQ0Fraction=0.0273;MQM=48.932;MQRankSum=3.654;NF;NR;NS=917;PP;RA=2785;RL=79;RPP=34.209;RR=38;RUN=1;ReadPosRankSum=0.795;SAB=0.5641;SAF=66;SAP=7.1862;SAR=51;SC=TTTTCTTTTTCTTTTTTTTTT;SRB=0.41795;SRF=1164;SRP=165.85;SRR=1621;TC;TR=11;TU=T;VQSLOD=5.0895;set=Intersection;sumGLbyD=4.66 +20 5898626 rs34483659 CAAA C,CA,CAA,CAAAAA 1140.16 PASS ABR=34;AC=19,98,56,199;AF=0.0227,0.1172,0.0670,0.2380;AF1=0.08519;BVAR;BaseQRankSum=5.049;CI95=0.03727,0.1273;DB;DEL;DP=5091;DP4=539,408,121,123;FQ=4.43;FR;FS=5.701;HOMA=64;HOMR=156;HP=19;HR=18;HU=A;HaplotypeScore=11.5333;INDEL;InbreedingCoeff=0.7405;MQ0=117;MQ0Fraction=0.0986;MQRankSum=6.290;NF;NR;NS=240;PP;PV4=0.043,1,1,0.0087;QD=1.22;RA=204;RUN=1;ReadPosRankSum=-2.684;SB=-1015.09;SC=ACTAAAAATACAAAAAAAAAA;SRB=0.35294;SRF=72;SRP=41.33;SRR=132;TC;TR=18;TU=A;VQSLOD=4.1696;set=filterInVQSR-2of5 +20 5975126 rs10541892 C CAG 504.78 PASS AC=79;AF=0.07004;AN=1128;BaseQRankSum=10.498;DB;DP=2050;FS=38.228;HRun=0;HaplotypeScore=14.1426;InbreedingCoeff=-0.0053;MQ=60.40;MQ0=80;MQ0Fraction=0.0390;MQRankSum=5.098;QD=1.63;ReadPosRankSum=-4.851;SB=-590.69;VQSLOD=4.8517;set=VQSR +20 5992611 . G GT 799.56 PASS AA=39;AB=0.8301;ABA=35;ABP=197.98;ABR=171;AC=13;AF=0.0183;AN=712;BL=1164;BR=1566;BVAR;BaseQRankSum=1.914;DP=9561;Dels=0.01;EL=16;EPP=5.7386;ER=23;FS=0.739;HETAR=32;HOMA=0;HOMR=1024;HRun=9;INS;InbreedingCoeff=0.0339;LEN=1;LRB=0.14725;LRBP=131.55;MQ0=0;MQ0Fraction=0.0000;MQM=97.231;MQRankSum=0.764;NS=1056;RA=5204;RL=16;RPP=5.7386;RR=23;RUN=1;ReadPosRankSum=-1.169;SAB=0.69231;SAF=27;SAP=15.538;SAR=12;SRB=0.56399;SRF=2935;SRP=188.09;SRR=2269;VQSLOD=4.6516;set=Intersection;sumGLbyD=5.96 +20 6040983 rs11087710 A AAAAAAGAG,AAAAAGAG,AAAAGAG,AAAAGAGAG,AAAGAG,AAAGAGAG,AAGAG,AAGAGAG,AG,AGAG,AGAGAG 66894.55 PASS ABR=468;AC=80,9,20,136,31,91,33,29,9,3,5;AF=0.0980,0.0110,0.0245,0.1667,0.0380,0.1115,0.0404,0.0355,0.0110,0.0037,0.0061;AN=816;BVAR;BaseQRankSum=-12.470;DB;DP=38726;DP4=426,611,310,472;Dels=0.00;FQ=999;FR;FS=6.635;HOMA=110;HOMR=506;HP=14;HR=15;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.8291;KGPilot123;MQ=54.22;MQ0Fraction=0.0168;MQRankSum=-5.329;NF;NR;NS=861;PP;PV4=0.56,1,6.9e-09,0.31;RA=1828;RUN=1;ReadPosRankSum=-7.857;SC=AAAAAAAAAAAAGAGAGAGAG;SRB=0.62418;SRF=1141;SRP=247.85;SRR=687;TC;TR=15;TU=A;VQSLOD=9.0574;dbSNP=131;set=Intersection;sumGLbyD=36.72 +20 6903392 . TC CC,T 999 PASS AF=0.0000;AF1=0.01192;CI95=0.008547,0.01709;DP=10440;DP4=2544,2062,9,11;Dels=0.01;FQ=999;FR;HP=2;HPLen=3;HR=3;HRun=2;HU=T;INDEL;InbreedingCoeff=0.0324;MQ=62.78;MQ0=2;MQ0Fraction=0.0009;NF;NR;PP;PV4=0.38,0.0069,0.36,0.41;QD=8.05;SB=-320.13;SC=TTATTTTCTTTCCAATTTTTA;TC;TR=8;TU=CTTT;set=filterInVQSR-2of5;sumGLbyD=13.22 +20 7024548 . G GAT 5041.27 PASS AC=123;AF=0.10336;AN=1190;BaseQRankSum=23.097;DP=3045;FS=7.979;HRun=0;HaplotypeScore=15.6967;InbreedingCoeff=0.1062;MQ=119.29;MQ0=2;MQ0Fraction=0.0007;MQRankSum=-3.725;QD=8.97;ReadPosRankSum=-1.636;SB=-2257.45;VQSLOD=5.9332;set=VQSR +20 7484554 . A AT 5.09 PASS AC=0;AF=0.0000;AN=710;BaseQRankSum=-0.696;DP=1862;FS=2.835;HRun=9;HaplotypeScore=13.5425;InbreedingCoeff=0.0567;MQ=76.92;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.932;ReadPosRankSum=-1.701;VQSLOD=4.3156;set=VQSR +20 7632194 rs77286341 GAA AAA,G 5324 PASS AC=0;AF=0.0000;AN=700;BaseQRankSum=-1.741;DB;DP=1772;FR;HP=4;HPLen=3;HR=3;HRun=0;HU=A;HaplotypeScore=60.1795;InbreedingCoeff=0.0017;MQ=70.69;MQ0=13;MQ0Fraction=0.0073;MQRankSum=-1.315;NF;NR;PP;ReadPosRankSum=-3.650;SC=GAGAGAGAGAGAAAGGTGTAA;TC;TR=13;TU=AG;set=filterInVQSR-2of5 +20 7767508 rs71329674 G GA 17914 PASS AA=415;AB=0.61617;ABA=337;ABP=105.94;ABR=541;AC=141;AF=0.11614;AN=1214;BL=15187;BR=20323;BVAR;BaseQRankSum=-13.946;DB;DP=28222;Dels=0.00;EL=184;EPP=14.569;ER=231;FQ=999;FR;FS=13.296;HETAR=178;HOMA=35;HOMR=822;HP=14;HPLen=9;HR=9;HRun=9;HU=A;INDEL;INS;InbreedingCoeff=0.0714;LEN=1;LRB=0.14464;LRBP=1616.1;MQ=89.69;MQ0=1;MQ0Fraction=0.0003;MQM=51.667;MQRankSum=0.664;NF;NR;NS=1035;PP;RA=3707;RL=171;RPP=30.894;RR=244;RUN=1;ReadPosRankSum=-1.120;SAB=0.45301;SAF=188;SAP=10.969;SAR=227;SC=ATTCTAAAAAGAAAAAAAAAT;SRB=0.38495;SRF=1427;SRP=429.23;SRR=2280;TC;TR=9;TU=A;VQSLOD=9.0748;set=Intersection;sumGLbyD=11.09 +20 7920261 . TA T,TAA 802.15 PASS AA=28;AB=0.8;ABA=28;ABP=112.45;ABR=112;AC=22,39;AF=0.01836,0.03255;AN=1198;BL=943;BR=1487;BVAR;BaseQRankSum=2.233;DP=10645;Dels=0.01;EL=11;EPP=5.8022;ER=17;FR;FS=1.691;HETAR=20;HOMA=0;HOMR=1007;HP=10;HPLen=9;HR=9;HRun=9;HU=A;INS;InbreedingCoeff=0.2256;LEN=1;LRB=0.22387;LRBP=267.46;MQ0=0;MQ0Fraction=0.0000;MQM=57.571;MQRankSum=0.940;NF;NR;NS=1027;PP;RA=4776;RL=8;RPP=14.178;RR=20;RUN=1;ReadPosRankSum=-1.567;SAB=0.53571;SAF=15;SAP=3.3205;SAR=13;SC=GTAACTGCTATAAAAAAAAAC;SRB=0.48576;SRF=2320;SRP=11.42;SRR=2456;TC;TR=9;TU=A;VQSLOD=4.0815;set=filterInVQSR-2of5;sumGLbyD=5.37 +20 8012465 rs10595338 TATGA T 2104.41 PASS AF=0.03339;BaseQRankSum=10.662;DB;DP=11772;DS;Dels=0.01;FR;FS=7.678;HP=1;HPLen=1;HR=1;HRun=0;HU=A;InbreedingCoeff=0.0266;MQ0Fraction=0.0731;MQRankSum=0.603;NF;NR;PP;ReadPosRankSum=1.276;SC=TGTATGTATGTATGATGTATG;TC;TR=19;TU=ATGT;VQSLOD=4.1376;set=filterInVQSR-2of5;sumGLbyD=6.53 +20 8573999 . CGTGT C,CGT,CGTGTGT,TGTGT 45865.96 PASS AC=458,0,731;AF=0.37727,0.00000,0.60214;AN=1214;BVAR;BaseQRankSum=-6.703;DEL;DP=37714;Dels=0.03;FR;FS=11.079;HP=2;HPLen=1;HR=1;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.7632;LEN=2;MQ0Fraction=0.0026;MQRankSum=-1.394;NF;NR;PP;RUN=1;ReadPosRankSum=-2.102;SC=TGTGTGTGCGCGTGTGTGTGT;TC;TR=18;TU=GT;VQSLOD=6.1435;set=Intersection;sumGLbyD=3.53 +20 8610455 rs10571111 TTTTC T 11763.51 PASS AC=190;AF=0.17056;AN=1114;BaseQRankSum=-14.397;DB;DP=2323;FS=2.321;HRun=0;HaplotypeScore=39.8020;InbreedingCoeff=0.2502;MQ=53.39;MQ0=104;MQ0Fraction=0.0448;MQRankSum=3.519;QD=19.07;ReadPosRankSum=4.150;SB=-4067.02;VQSLOD=5.0554;set=VQSR +20 9139079 . ATT A,AT,ATTT,ATTTT,ATTTTT 8777.90 PASS AC=23,140,114,69,113;AF=0.01993,0.12132,0.09879,0.05979,0.09792;AN=1154;BVAR;BaseQRankSum=-0.022;DEL;DP=25109;DP4=502,657,278,313;FR;FS=11.929;HP=16;HR=16;HU=T;HaplotypeScore=20.2361;INDEL;INS;InbreedingCoeff=0.5704;MQ0=16;MQ0Fraction=0.0067;MQRankSum=2.624;NF;NR;PP;PV4=0.14,1,1,1;QD=1.48;RUN=1;ReadPosRankSum=-0.480;SB=-2354.28;SC=CACCTGGCTAATTTTTTTTTT;TC;TR=16;TU=T;VQSLOD=6.9180;set=Intersection +20 9862448 . CT C 49312 PASS AA=60;AB=0.96003;ABA=53;ABP=2440.4;ABR=1273;AC=18;AF=0.01461;AN=1232;BL=3516;BR=140;BVAR;BaseQRankSum=-2.056;DEL;DP=11893;Dels=0.01;EL=35;EPP=6.6294;ER=25;FS=1.787;HETAR=396;HOMA=344;HOMR=334;HRun=1;InbreedingCoeff=0.0379;LEN=1;LRB=0.92341;LRBP=6772.5;MQ0Fraction=0.0006;MQM=54.267;MQRankSum=-0.907;NS=1074;RA=2990;RL=60;RPP=133.3;RR=0;RUN=1;ReadPosRankSum=-10.579;SAB=0.58333;SAF=35;SAP=6.6294;SAR=25;SRB=0.47826;SRF=1430;SRP=15.284;SRR=1560;VQSLOD=3.0237;set=filterInVQSR-2of5;sumGLbyD=2.84 +20 9863736 rs73618103 G GT 50570.21 PASS AA=2247;AB=0.48878;ABA=1412;ABP=6.0324;ABR=1350;AC=546;AF=0.44463;AN=1228;BL=86886;BR=95862;BVAR;BaseQRankSum=-23.978;DB;DP=32517;DP4=1125,1133,1017,1048;Dels=0.00;EL=1089;EPP=7.6113;ER=1158;FQ=999;FR;FS=2.529;HETAR=445;HOMA=201;HOMR=393;HP=4;HPLen=4;HR=4;HRun=4;HU=T;INDEL;INS;InbreedingCoeff=0.1393;KGPilot123;LEN=1;LRB=0.049117;LRBP=960.35;MQ=68.10;MQ0=2;MQ0Fraction=0.0006;MQM=50.931;MQRankSum=-1.580;NF;NR;NS=1039;PP;PV4=0.71,1,0.11,1;RA=3139;RL=1089;RPP=7.6113;RR=1158;RUN=1;ReadPosRankSum=0.846;SAB=0.54161;SAF=1217;SAP=36.804;SAR=1030;SC=TGATTGTATGGTTTTGTCCTT;SRB=0.53425;SRF=1677;SRP=34.987;SRR=1462;TC;TR=4;TU=T;VLD;VQSLOD=10.1800;dbSNP=131;set=Intersection;sumGLbyD=18.20 +20 10640876 . TA T 42819 PASS AA=86;AB=0.92316;ABA=75;ABP=1521;ABR=901;AC=40;AF=0.0447;AN=894;BL=6265;BR=415;BVAR;BaseQRankSum=-0.850;DEL;DP=8223;Dels=0.00;EL=41;EPP=3.4143;ER=45;FS=3.190;HETAR=336;HOMA=384;HOMR=290;HRun=1;InbreedingCoeff=0.0173;LEN=1;LRB=0.87575;LRBP=11128;MQ0=0;MQ0Fraction=0.0000;MQM=76.163;MQRankSum=1.314;NS=1034;RA=2046;RL=83;RPP=164.61;RR=3;RUN=1;ReadPosRankSum=-12.060;SAB=0.46512;SAF=40;SAP=3.9193;SAR=46;SRB=0.5523;SRF=1130;SRP=51.615;SRR=916;VQSLOD=3.9183;set=filterInVQSR-2of5;sumGLbyD=4.00 +20 10926959 . AG A 12239 PASS AA=65;AB=0.92801;ABA=64;ABP=1417.6;ABR=825;AC=24;AF=0.0264;AN=908;BL=616;BR=3782;BVAR;BaseQRankSum=9.990;DEL;DP=10708;Dels=0.01;EL=37;EPP=5.7163;ER=28;FS=1.652;HETAR=275;HOMA=70;HOMR=724;HRun=1;InbreedingCoeff=0.0102;LEN=1;LRB=0.71987;LRBP=4952;MQ0=1;MQ0Fraction=0.0004;MQM=118.82;MQRankSum=1.018;NS=1069;RA=4746;RL=5;RPP=104.07;RR=60;RUN=1;ReadPosRankSum=-12.039;SAB=0.41538;SAF=27;SAP=7.0526;SAR=38;SRB=0.4764;SRF=2261;SRP=25.968;SRR=2485;VQSLOD=2.9713;set=filterInVQSR-2of5;sumGLbyD=4.10 +20 11299648 . TG T 49315 PASS AA=62;AB=0.95292;ABA=54;ABP=2046.7;ABR=1093;AC=28;AF=0.0373;AN=750;BL=3126;BR=528;BVAR;BaseQRankSum=-4.929;DEL;DP=10764;Dels=0.01;EL=26;EPP=6.5127;ER=36;FS=3.851;HETAR=366;HOMA=383;HOMR=304;HRun=1;InbreedingCoeff=0.0267;LEN=1;LRB=0.711;LRBP=4014.1;MQ0=1;MQ0Fraction=0.0005;MQM=76.468;MQRankSum=1.327;NS=1070;RA=2588;RL=54;RPP=77.121;RR=8;RUN=1;ReadPosRankSum=-12.507;SAB=0.48387;SAF=30;SAP=3.1504;SAR=32;SRB=0.47643;SRF=1233;SRP=15.499;SRR=1355;VQSLOD=3.8673;set=filterInVQSR-2of5;sumGLbyD=3.00 +20 11561096 . CTA C 999 PASS AC=2;AF=0.0029;AF1=0.005602;BaseQRankSum=3.190;CI95=0.004425,0.01106;DP=7521;DP4=1998,1794,2,4;Dels=0.00;FQ=999;FR;FS=5.422;HP=3;HPLen=2;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0056;MQ=113.88;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.297;NF;NR;PP;PV4=0.43,0.024,1,1;ReadPosRankSum=1.406;SC=CAATAGTATTCTATGTCAGTC;TC;TR=1;TU=T;VQSLOD=8.6243;set=Intersection;sumGLbyD=21.89 +20 11723671 . C CA 1096.60 PASS AA=35;AB=0.69565;ABA=35;ABP=41.247;ABR=80;AC=10;AF=0.0141;AN=710;BL=2005;BR=1702;BVAR;BaseQRankSum=-3.427;DP=9819;Dels=0.00;EL=20;EPP=4.5614;ER=15;FR;FS=3.814;HETAR=20;HOMA=0;HOMR=1034;HP=8;HPLen=7;HR=7;HRun=7;HU=A;INS;InbreedingCoeff=0.0323;LEN=1;LRB=0.081737;LRBP=56.79;MQ0=0;MQ0Fraction=0.0000;MQM=81.057;MQRankSum=0.050;NF;NR;NS=1054;PP;RA=5562;RL=22;RPP=8.0357;RR=13;RUN=1;ReadPosRankSum=-2.012;SAB=0.71429;SAF=25;SAP=16.97;SAR=10;SC=ATATTGAAGACAAAAAAACAG;SRB=0.49371;SRF=2746;SRP=4.9233;SRR=2816;TC;TR=7;TU=A;VQSLOD=7.4342;set=Intersection;sumGLbyD=8.30 +20 11767787 . CA C 1382.10 PASS AA=24;AB=0.56667;ABA=13;ABP=4.1684;ABR=17;AC=10;AF=0.00810;AN=1234;BL=967;BR=819;BVAR;BaseQRankSum=1.629;DEL;DP=22318;DP4=2190,2491,8,14;Dels=0.01;EL=16;EPP=8.8009;ER=8;FQ=999;FR;FS=2.536;HETAR=6;HOMA=3;HOMR=1051;HP=2;HPLen=1;HR=1;HRun=1;HU=A;INDEL;InbreedingCoeff=0.0823;LEN=1;LRB=0.082867;LRBP=29.642;MQ=65.44;MQ0Fraction=0.0032;MQM=50.583;MQRankSum=0.931;NF;NR;NS=1060;PP;PV4=0.39,0.018,1,0.37;RA=5568;RL=11;RPP=3.3722;RR=13;RUN=1;ReadPosRankSum=-0.694;SAB=0.375;SAF=9;SAP=6.2675;SAR=15;SC=TGAACATGTACAGACTTGGTT;SRB=0.44325;SRF=2468;SRP=158.78;SRR=3100;TC;TR=1;TU=A;VQSLOD=9.9622;set=Intersection;sumGLbyD=15.42 +20 12021825 . A AG 1063.30 PASS AA=26;AB=0.53704;ABA=25;ABP=3.6537;ABR=29;AC=12;AF=0.0214;AN=562;BL=1077;BR=815;BVAR;BaseQRankSum=-3.787;DP=22049;DP4=2650,2464,13,12;Dels=0.00;EL=18;EPP=11.362;ER=8;FR;FS=0.735;HETAR=12;HOMA=1;HOMR=1064;HP=1;HR=1;HRun=1;HU=G;INDEL;INS;InbreedingCoeff=0.0876;LEN=1;LRB=0.13848;LRBP=81.794;MQ=102.78;MQ0=0;MQ0Fraction=0.0000;MQM=85.538;MQRankSum=-0.126;NF;NR;NS=1077;PP;PV4=1,1,0.19,0.2;RA=6457;RL=17;RPP=8.3555;RR=9;RUN=1;ReadPosRankSum=-1.941;SAB=0.57692;SAF=15;SAP=4.3466;SAR=11;SC=GTAGTTTAACAGTTTATCAGG;SRB=0.5182;SRF=3346;SRP=21.582;SRR=3111;TC;TR=1;TU=G;VQSLOD=8.0483;set=Intersection;sumGLbyD=13.94 +20 12238835 rs113904674 CTCTTCATGGTCT C 1813.44 PASS AA=7;AB=0.73077;ABA=7;ABP=15.037;ABR=19;AC=4;AF=0.0056;AN=712;BL=360;BR=368;BVAR;BaseQRankSum=3.891;DB;DEL;DP=10309;Dels=0.00;EL=4;EPP=3.3205;ER=3;FR;FS=0.000;HETAR=3;HOMA=0;HOMR=1076;HP=1;HPLen=2;HR=2;HRun=0;HU=C;InbreedingCoeff=-0.0381;LEN=12;LRB=0.010989;LRBP=3.2012;MQ0=0;MQ0Fraction=0.0000;MQM=37;MQRankSum=-3.793;NF;NR;NS=1079;PP;RA=6085;RL=4;RPP=3.3205;RR=3;RUN=1;ReadPosRankSum=1.319;SAB=0.42857;SAF=3;SAP=3.3205;SAR=4;SC=CTTAATGCTCCTCTTCATGGT;SRB=0.51257;SRF=3119;SRP=11.364;SRR=2966;TC;TR=6;TU=CCT;VQSLOD=5.7551;set=Intersection;sumGLbyD=69.48 +20 12602812 . AT A 12344 PASS AA=47;AB=0.94372;ABA=43;ABP=1309.5;ABR=721;AC=14;AF=0.0196;AN=716;BL=2714;BR=217;BVAR;BaseQRankSum=1.424;DEL;DP=10743;Dels=0.00;EL=24;EPP=3.0565;ER=23;FS=0.629;HETAR=228;HOMA=65;HOMR=769;HRun=1;InbreedingCoeff=0.0233;LEN=1;LRB=0.85193;LRBP=4622.3;MQ0Fraction=0.0000;MQM=99.574;MQRankSum=1.901;NS=1080;RA=4839;RL=46;RPP=96.568;RR=1;RUN=1;ReadPosRankSum=-9.906;SAB=0.53191;SAF=25;SAP=3.4261;SAR=22;SRB=0.51106;SRF=2473;SRP=8.148;SRR=2366;VQSLOD=2.8161;set=filterInVQSR-2of5;sumGLbyD=3.67 +20 13600884 . CTG C,CTGTG 1278.10 PASS AA=85;AB=0.77994;ABA=79;ABP=247.38;ABR=280;AC=71,22;AF=0.05907,0.01830;AN=1202;BL=3279;BR=3205;BVAR;BaseQRankSum=8.852;DEL;DP=24185;DP4=1317,931,52,49;Dels=0.03;EL=45;EPP=3.649;ER=40;FQ=999;FR;FS=31.826;HETAR=75;HOMA=4;HOMR=926;HP=2;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1566;LEN=2;LRB=0.011413;LRBP=4.8442;MQ=65.06;MQ0Fraction=0.0012;MQM=48.671;MQRankSum=-0.511;NF;NR;NS=1005;PP;PV4=0.18,1,0.39,0.27;RA=3342;RL=35;RPP=8.7583;RR=50;RUN=1;ReadPosRankSum=-2.329;SAB=0.43529;SAF=37;SAP=6.1015;SAR=48;SC=TCCCTTTACTCTGTGTGTGTG;SRB=0.59066;SRF=1974;SRP=241.62;SRR=1368;TC;TR=15;TU=GT;VQSLOD=3.8635;set=filterInVQSR-2of5;sumGLbyD=4.23 +20 13666265 . T TATAG 556.88 PASS AC=21;AF=0.01959;AN=1072;BaseQRankSum=24.958;DP=2706;FS=2.581;HRun=0;HaplotypeScore=25.9952;InbreedingCoeff=0.1419;MQ=72.43;MQ0=0;MQ0Fraction=0.0000;MQRankSum=2.888;QD=4.38;ReadPosRankSum=2.552;SB=-417.04;VQSLOD=7.3380;set=VQSR +20 13861245 rs72422273 C CTCA 2685.46 PASS AC=140;AF=0.11589;AN=1208;BaseQRankSum=24.355;DB;DP=2910;FS=6.808;HRun=0;HaplotypeScore=19.3095;InbreedingCoeff=-0.0991;MQ=78.25;MQ0=22;MQ0Fraction=0.0076;MQRankSum=3.225;QD=3.64;ReadPosRankSum=2.607;SB=-1861.38;VQSLOD=4.1974;set=VQSR +20 13865746 . T TA,TAA 1416.23 PASS AA=63;AB=0.80417;ABA=47;ABP=195.87;ABR=193;AC=122,21;AF=0.10133,0.01744;AN=1204;BL=3673;BR=1145;BVAR;BaseQRankSum=-3.336;DP=10513;Dels=0.00;EL=62;EPP=131.27;ER=1;FR;FS=716.583;HETAR=45;HOMA=1;HOMR=998;HP=2;HR=1;HRun=1;HU=A;INS;InbreedingCoeff=0.0814;LEN=1;LRB=0.5247;LRBP=2883.3;MQ0=0;MQ0Fraction=0.0000;MQM=56.143;MQRankSum=-1.197;NF;NR;NS=1044;PP;RA=4529;RL=62;RPP=131.27;RR=1;RUN=1;ReadPosRankSum=-12.295;SAB=1;SAF=63;SAP=139.81;SAR=0;SC=GGAACATGGATACCCCCCTGC;SRB=0.52462;SRF=2376;SRP=26.853;SRR=2153;TC;TR=1;TU=A;VQSLOD=-4.2308;set=filterInVQSR-2of5;sumGLbyD=4.77 +20 13881703 . CTT C 152.85 PASS AC=8;AF=0.0093;AN=862;BaseQRankSum=3.941;DP=2063;FS=0.962;HRun=5;HaplotypeScore=24.0313;InbreedingCoeff=0.0790;MQ=55.05;MQ0=49;MQ0Fraction=0.0238;MQRankSum=-1.418;QD=3.47;ReadPosRankSum=-0.605;SB=-93.04;VQSLOD=5.3874;set=VQSR +20 14033345 . A AT 2718.30 PASS AA=91;AB=0.80899;ABA=85;ABP=372.04;ABR=360;AC=43;AF=0.03895;AN=1104;BL=3916;BR=4753;BVAR;BaseQRankSum=-6.609;DP=8350;Dels=0.02;EL=46;EPP=3.0342;ER=45;FR;FS=0.498;HETAR=70;HOMA=1;HOMR=871;HP=11;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.0952;LEN=1;LRB=0.096551;LRBP=178.49;MQ0=0;MQ0Fraction=0.0000;MQM=54.879;MQRankSum=2.164;NF;NR;NS=942;PP;RA=3717;RL=37;RPP=9.9065;RR=54;RUN=1;ReadPosRankSum=-1.447;SAB=0.48352;SAF=44;SAP=3.2251;SAR=47;SC=TTGCAAACAGATTTTTTTTTT;SRB=0.45252;SRF=1682;SRP=75.807;SRR=2035;TC;TR=11;TU=T;VQSLOD=3.8299;set=filterInVQSR-2of5;sumGLbyD=3.88 +20 14260090 rs73619828 A AT 27935 PASS AA=596;AB=0.59484;ABA=487;ABP=96.922;ABR=715;AC=204;AF=0.17000;AN=1200;BL=21718;BR=28458;BVAR;BaseQRankSum=0.756;DB;DP=23629;DP4=1385,1492,287,328;Dels=0.00;EL=299;EPP=3.0249;ER=297;FQ=999;FR;FS=6.187;HETAR=218;HOMA=38;HOMR=788;HP=9;HPLen=9;HR=9;HRun=9;HU=T;INDEL;INS;InbreedingCoeff=0.0797;LEN=1;LRB=0.13433;LRBP=1969;MQ=100.81;MQ0=0;MQ0Fraction=0.0000;MQM=57.084;MQRankSum=2.224;NF;NR;NS=1044;PP;PV4=0.53,1,1.2e-11,1;RA=4143;RL=238;RPP=55.475;RR=358;RUN=1;ReadPosRankSum=0.198;SAB=0.46812;SAF=279;SAP=8.2714;SAR=317;SC=CCTTAAGTTGATTTTTTTTTC;SRB=0.50374;SRF=2087;SRP=3.514;SRR=2056;TC;TR=9;TU=T;VQSLOD=9.0018;set=Intersection;sumGLbyD=10.82 +20 14260558 . AC A 238 PASS AC=1;AF=0.0014;AF1=0.003368;BaseQRankSum=2.868;CI95=0.003106,0.006211;DP=9724;DP4=2075,2329,1,7;Dels=0.00;FQ=106;FR;FS=10.678;HP=1;HPLen=2;HR=2;HRun=1;HU=A;INDEL;InbreedingCoeff=-0.0406;MQ=114.37;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.862;NF;NR;PP;PV4=0.074,0.0096,0.017,1;ReadPosRankSum=-0.042;SC=ATCAGGAATAACTGTGTGACC;TC;TR=2;TU=A;VQSLOD=8.1618;set=Intersection;sumGLbyD=18.65 +20 14425481 . GTA G,GTATA 148.85 PASS AC=43,23;AF=0.03473,0.01858;AN=1238;BaseQRankSum=6.289;DP=25167;DP4=1800,2021,38,49;FR;FS=9.416;HP=2;HPLen=1;HR=1;HU=T;HaplotypeScore=17.7453;INDEL;InbreedingCoeff=0.0995;MQ0=21;MQ0Fraction=0.0058;MQRankSum=-0.200;NF;NR;PP;PV4=0.59,1,0.04,0.023;QD=0.35;ReadPosRankSum=-1.689;SB=-367.50;SC=CTGTGTGTGTGTATATATATA;TC;TR=13;TU=AT;VQSLOD=3.5796;set=filterInVQSR-2of5 +20 14943522 rs11478299 GA AA,G 1761.24 PASS AA=117;AB=0.68142;ABA=108;ABP=99.919;ABR=231;AC=0;AF=0.0000;AF1=0.04204;AN=712;BL=4931;BR=5802;BVAR;BaseQRankSum=9.118;CI95=0.02876,0.05752;DB;DEL;DP=13717;DP4=1908,1684,59,58;Dels=0.05;EL=60;EPP=3.1773;ER=57;FQ=81.9;FR;HETAR=56;HOMA=1;HOMR=1011;HP=8;HPLen=8;HR=8;HU=A;INDEL;InbreedingCoeff=0.1264;LEN=1;LRB=0.081152;LRBP=156.5;MQ=106.93;MQ0=0;MQ0Fraction=0.0000;MQM=96.855;MQRankSum=1.619;NF;NR;NS=1068;PP;PV4=0.57,1,0.0003,1;QD=7.40;RA=5080;RL=56;RPP=3.4743;RR=61;RUN=1;ReadPosRankSum=0.814;SAB=0.52137;SAF=61;SAP=3.4743;SAR=56;SB=-1122.51;SC=GTTGTTTGGGGAAAAAAAACT;SRB=0.51083;SRF=2595;SRP=8.1825;SRR=2485;TC;TR=8;TU=A;set=filterInVQSR-2of5;sumGLbyD=9.81 +20 14974486 . A AG 4101.40 PASS AA=57;AB=0.57143;ABA=51;ABP=8.2839;ABR=68;AC=22;AF=0.01846;AN=1192;BL=2286;BR=2834;BVAR;BaseQRankSum=8.711;DP=20538;DP4=2172,2100,19,13;Dels=0.00;EL=32;EPP=4.877;ER=25;FS=0.517;HETAR=20;HOMA=4;HOMR=1027;HRun=1;INDEL;INS;InbreedingCoeff=0.0677;LEN=1;LRB=0.10703;LRBP=130.37;MQ=126.07;MQ0=0;MQ0Fraction=0.0000;MQM=56.088;MQRankSum=-10.756;NS=1051;PV4=0.38,3.5e-51,7.9e-34,1;RA=5203;RL=26;RPP=3.9627;RR=31;RUN=1;ReadPosRankSum=1.283;SAB=0.54386;SAF=31;SAP=3.9627;SAR=26;SRB=0.51816;SRF=2696;SRP=17.918;SRR=2507;VQSLOD=8.0072;set=Intersection;sumGLbyD=25.60 +20 15111137 . GA G 13533 PASS AA=98;AB=0.84864;ABA=89;ABP=623.8;ABR=499;AC=47;AF=0.03796;AN=1238;BL=5324;BR=856;BVAR;BaseQRankSum=-11.577;DEL;DP=13384;Dels=0.01;EL=53;EPP=4.4284;ER=45;FS=6.099;HETAR=219;HOMA=845;HOMR=18;HRun=1;InbreedingCoeff=-0.0056;LEN=1;LRB=0.72298;LRBP=7017.4;MQ0Fraction=0.0003;MQM=90.449;MQRankSum=1.408;NS=1083;RA=590;RL=87;RPP=130.99;RR=11;RUN=1;ReadPosRankSum=-18.074;SAB=0.55102;SAF=54;SAP=5.2261;SAR=44;SRB=0.52373;SRF=309;SRP=5.8958;SRR=281;VQSLOD=4.1054;set=filterInVQSR-2of5;sumGLbyD=3.06 +20 15283028 . A AC,ACACACACACACAC 140844.83 PASS AA=180;AB=0.61442;ABA=123;ABP=39.285;ABR=196;AC=13,817;AF=0.01111,0.69829;AN=1170;BL=4453;BR=11407;BVAR;BaseQRankSum=24.686;DP=6365;Dels=0.00;EL=124;EPP=58.793;ER=56;FR;FS=10.912;HETAR=87;HOMA=48;HOMR=683;HP=1;HR=1;HRun=1;HU=T;INS;InbreedingCoeff=0.2074;LEN=1;LRB=0.43846;LRBP=6624;MQ0Fraction=0.0558;MQM=38.211;MQRankSum=-21.111;NF;NR;NS=818;PP;RA=1732;RL=0;RPP=393.88;RR=180;RUN=1;ReadPosRankSum=-7.620;SAB=0.31111;SAF=56;SAP=58.793;SAR=124;SC=ACACACACACATACACACATA;SRB=0.54042;SRF=936;SRP=27.584;SRR=796;TC;TR=21;TU=AC;VQSLOD=4.7569;set=Intersection;sumGLbyD=18.36 +20 15361056 . ATAACT A 4892.81 PASS AA=59;AB=0.63576;ABA=55;ABP=27.184;ABR=96;AC=34;AF=0.0487;AN=698;BL=3164;BR=1999;BVAR;BaseQRankSum=3.391;DEL;DP=7080;Dels=0.03;EL=27;EPP=3.9304;ER=32;FR;FS=4.816;HETAR=35;HOMA=6;HOMR=966;HP=2;HPLen=3;HR=3;HRun=0;HU=A;InbreedingCoeff=0.0785;LEN=5;LRB=0.22564;LRBP=573.84;MQ0=0;MQ0Fraction=0.0000;MQM=70.034;MQRankSum=-8.732;NF;NR;NS=1008;PP;RA=3915;RL=42;RPP=26.013;RR=17;RUN=1;ReadPosRankSum=-0.735;SAB=0.44068;SAF=26;SAP=4.8137;SAR=33;SC=AGATTAGGAAATAACTTAGGG;SRB=0.42682;SRF=1671;SRP=185.12;SRR=2244;TC;TR=3;TU=A;VQSLOD=7.0900;set=Intersection;sumGLbyD=43.38 +20 15579507 . AATTAGTC A,TATTAGTC 1936.38 PASS AA=16;AB=0.58974;ABA=16;ABP=5.7386;ABR=23;AC=64;AF=0.05229;AN=1224;BL=699;BR=775;BVAR;BaseQRankSum=-21.390;DEL;DP=21920;DP4=2099,2403,6,6;Dels=0.00;EL=8;EPP=3.0103;ER=8;FR;FS=2.920;HETAR=5;HOMA=0;HOMR=1063;HP=3;HPLen=4;HR=4;HU=A;INDEL;InbreedingCoeff=-0.0143;LEN=7;LRB=0.05156;LRBP=11.519;MQ=129.49;MQ0=0;MQ0Fraction=0.0000;MQM=51.938;MQRankSum=3.331;NF;NR;NS=1068;PP;PV4=1,0.019,1.3e-07,1;RA=5334;RL=5;RPP=7.8961;RR=11;RUN=1;ReadPosRankSum=-16.901;SAB=0.4375;SAF=7;SAP=3.5532;SAR=9;SC=CATACTACAAAATTAGTCATT;SRB=0.41695;SRF=2224;SRP=322.58;SRR=3110;TC;TR=4;TU=A;VQSLOD=3.2237;set=filterInVQSR-2of5;sumGLbyD=43.57 +20 15752535 . CT C,GT 3775.20 PASS AA=92;AB=0.78636;ABA=47;ABP=159.71;ABR=173;AC=0;AF=0.0000;AN=608;BL=4955;BR=2380;BVAR;BaseQRankSum=2.910;DEL;DP=3429;Dels=0.04;EL=13;EPP=105.82;ER=79;FR;HETAR=92;HOMA=95;HOMR=544;HP=2;HPLen=2;HR=2;HU=T;InbreedingCoeff=0.0483;LEN=1;LRB=0.35106;LRBP=1966;MQ0Fraction=0.0232;MQM=35.293;MQRankSum=-2.199;NF;NR;NS=732;PP;QD=4.91;RA=1272;RL=81;RPP=118.66;RR=11;RUN=1;ReadPosRankSum=-1.077;SAB=0.021739;SAF=2;SAP=185.79;SAR=90;SB=-59.51;SC=CAAGACCATCCTTGGCTAACA;SRB=0.14623;SRF=186;SRP=1385.8;SRR=1086;TC;TR=2;TU=T;set=filterInVQSR-2of5;sumGLbyD=9.70 +20 15883060 rs73619850 A AT 1325.60 PASS AA=38;AB=0.59302;ABA=35;ABP=9.4742;ABR=51;AC=14;AF=0.0156;AN=896;BL=1078;BR=1638;BVAR;BaseQRankSum=-4.526;DB;DP=19854;DP4=1632,1800,15,20;Dels=0.00;EL=18;EPP=3.2389;ER=20;FR;FS=0.000;HETAR=14;HOMA=1;HOMR=1014;HP=1;HPLen=1;HR=1;HRun=1;HU=T;INDEL;INS;InbreedingCoeff=-0.0131;LEN=1;LRB=0.20619;LRBP=253.74;MQ=118.40;MQ0=0;MQ0Fraction=0.0000;MQM=56.526;MQRankSum=0.892;NF;NR;NS=1029;PP;PV4=0.61,1,0.25,0.14;RA=4439;RL=14;RPP=8.7247;RR=24;RUN=1;ReadPosRankSum=-2.061;SAB=0.42105;SAF=16;SAP=5.0675;SAR=22;SC=GGATTGGCAGATAAAAAATGG;SRB=0.46429;SRF=2061;SRP=52.168;SRR=2378;TC;TR=1;TU=T;VQSLOD=9.7576;set=Intersection;sumGLbyD=15.69 +20 16073315 rs111824749 GA G,GAA,GAAA 6400.63 PASS AC=138,47,20;AF=0.11577,0.03943,0.01678;AN=1192;BVAR;BaseQRankSum=11.377;DB;DEL;DP=35284;DP4=1695,1547,60,56;Dels=0.08;FR;FS=9.576;HP=11;HPLen=10;HR=10;HRun=10;HU=A;INDEL;INS;InbreedingCoeff=0.2137;MQ=106.87;MQ0=1;MQ0Fraction=0.0003;MQRankSum=0.773;NF;NR;PP;PV4=0.92,1,0.024,0.45;RUN=1;ReadPosRankSum=-2.224;SC=TATTTGAGGAGAAAAAAAAAA;TC;TR=10;TU=A;VQSLOD=9.3264;set=Intersection;sumGLbyD=8.64 +20 16122099 . GA G 12914 PASS AA=85;AB=0.85915;ABA=80;ABP=639.4;ABR=488;AC=19;AF=0.01542;AN=1232;BL=805;BR=5457;BVAR;BaseQRankSum=-6.084;DEL;DP=13592;Dels=0.00;EL=45;EPP=3.649;ER=40;FS=0.935;HETAR=218;HOMA=841;HOMR=14;HRun=2;InbreedingCoeff=0.0250;LEN=1;LRB=0.74289;LRBP=7507.5;MQ0=0;MQ0Fraction=0.0000;MQM=103.01;MQRankSum=2.843;NS=1075;RA=541;RL=2;RPP=170.62;RR=83;RUN=1;ReadPosRankSum=-16.222;SAB=0.49412;SAF=42;SAP=3.0358;SAR=43;SRB=0.44917;SRF=243;SRP=15.152;SRR=298;VQSLOD=3.9745;set=filterInVQSR-2of5;sumGLbyD=2.97 +20 16828509 . G GT 843.62 PASS AA=30;AB=0.70103;ABA=29;ABP=37.06;ABR=68;AC=10;AF=0.0140;AN=714;BL=1368;BR=1786;BVAR;BaseQRankSum=-4.061;DP=8682;Dels=0.01;EL=14;EPP=3.2998;ER=16;FR;FS=2.681;HETAR=22;HOMA=1;HOMR=1020;HP=8;HPLen=8;HR=8;HRun=8;HU=T;INS;InbreedingCoeff=0.1389;LEN=1;LRB=0.13253;LRBP=123.3;MQ0=0;MQ0Fraction=0.0000;MQM=62.8;MQRankSum=-1.491;NF;NR;NS=1043;PP;RA=4416;RL=11;RPP=7.6428;RR=19;RUN=1;ReadPosRankSum=-1.718;SAB=0.76667;SAF=23;SAP=21.54;SAR=7;SC=CCTTCAAAAGGTTTTTTTTGG;SRB=0.5745;SRF=2537;SRP=215.91;SRR=1879;TC;TR=8;TU=T;VQSLOD=7.6258;set=Intersection;sumGLbyD=10.77 +20 17470034 . GC G 46975 PASS AA=57;AB=0.96043;ABA=52;ABP=2422.5;ABR=1262;AC=34;AF=0.02773;AN=1226;BL=418;BR=3446;BVAR;BaseQRankSum=-6.250;DEL;DP=12035;Dels=0.00;EL=22;EPP=9.4485;ER=35;FS=1.350;HETAR=416;HOMA=409;HOMR=244;HRun=1;InbreedingCoeff=0.0083;LEN=1;LRB=0.78364;LRBP=5155.6;MQ0=0;MQ0Fraction=0.0000;MQM=99.509;MQRankSum=2.192;NS=1076;RA=2396;RL=5;RPP=87.164;RR=52;RUN=1;ReadPosRankSum=-15.199;SAB=0.5614;SAF=32;SAP=4.877;SAR=25;SRB=0.52963;SRF=1269;SRP=21.285;SRR=1127;VQSLOD=3.8440;set=filterInVQSR-2of5;sumGLbyD=3.06 +20 17471374 . AGCGGC A 850.03 PASS AC=6;AF=0.0085;AF1=0.01301;AN=704;BaseQRankSum=6.259;CI95=0.00885,0.01991;DP=8180;DP4=2215,1878,4,5;Dels=0.01;FQ=131;FS=0.000;HRun=0;INDEL;InbreedingCoeff=0.0009;MQ=104.41;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-5.521;PV4=0.74,0.37,0.0005,1;ReadPosRankSum=2.468;VQSLOD=6.8773;set=Intersection;sumGLbyD=30.85 +20 18433202 rs35582929 G GA 2506.90 PASS AA=55;AB=0.5812;ABA=49;ABP=9.7103;ABR=68;AC=20;AF=0.0218;AN=918;BL=2263;BR=2175;BVAR;BaseQRankSum=-6.639;DB;DP=19467;DP4=1845,2365,27,26;Dels=0.00;EL=21;EPP=9.6826;ER=34;FQ=999;FR;FS=5.633;HETAR=16;HOMA=3;HOMR=1045;HP=2;HPLen=3;HR=3;HRun=1;HU=G;INDEL;INS;InbreedingCoeff=0.0700;LEN=1;LRB=0.019829;LRBP=6.7994;MQ=114.03;MQ0=0;MQ0Fraction=0.0000;MQM=83.345;MQRankSum=1.610;NF;NR;NS=1064;PP;PV4=0.33,1,1,1;RA=5380;RL=28;RPP=3.0498;RR=27;RUN=1;ReadPosRankSum=0.873;SAB=0.47273;SAF=26;SAP=3.3656;SAR=29;SC=TATTTCATGGGAGCATTAAAA;SRB=0.42862;SRF=2306;SRP=241.07;SRR=3074;TC;TR=3;TU=G;VQSLOD=10.0372;dbSNP=126;set=Intersection;sumGLbyD=13.10 +20 18551314 rs10659122 CA C,CAA,CAAA,CAAAA,CAAAAA 18810.74 PASS ABR=243;AC=19,169,216,164,188;AF=0.01816,0.16157,0.20650,0.15679,0.17973;BVAR;BaseQRankSum=-5.742;DB;DP=17637;DP4=136,77,560,237;FR;FS=2.693;HOMA=177;HOMR=299;HP=17;HR=17;HU=A;HaplotypeScore=15.5048;INDEL;INS;InbreedingCoeff=0.8901;MQ0=11;MQ0Fraction=0.0069;MQRankSum=1.845;NF;NR;NS=658;PP;PV4=0.08,1,1,1;QD=12.66;RA=673;RUN=1;ReadPosRankSum=0.283;SB=-3514.45;SC=GATTCCATCTCAAAAAAAAAA;SRB=0.63596;SRF=428;SRP=111.06;SRR=245;TC;TR=17;TU=A;VQSLOD=10.6964;dbSNP=130;set=Intersection +20 18785519 . G GTC 415.55 PASS AC=28;AF=0.0400;AN=700;BaseQRankSum=10.889;DP=1929;FS=8.778;HRun=0;HaplotypeScore=27.6448;InbreedingCoeff=0.0510;MQ=61.99;MQ0=36;MQ0Fraction=0.0187;MQRankSum=4.508;QD=3.08;ReadPosRankSum=8.080;SB=-437.03;VQSLOD=4.9313;set=VQSR +20 19149501 . A AG 17.85 PASS AC=1;AF=0.0015;AN=670;BaseQRankSum=0.769;DP=1635;FS=9.858;HRun=0;HaplotypeScore=12.1949;InbreedingCoeff=-0.0381;MQ=102.63;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.200;QD=3.23;ReadPosRankSum=0.292;SB=-7.06;VQSLOD=4.4695;set=VQSR +20 19540281 . AC A 19710 PASS AA=145;AB=0.81843;ABA=134;ABP=652.98;ABR=604;AC=115;AF=0.09583;AN=1200;BL=9637;BR=817;BVAR;BaseQRankSum=-13.669;DEL;DP=10963;Dels=0.01;EL=66;EPP=5.5412;ER=79;FS=1.252;HETAR=305;HOMA=681;HOMR=59;HRun=1;InbreedingCoeff=0.0298;LEN=1;LRB=0.8437;LRBP=16162;MQ0=0;MQ0Fraction=0.0000;MQM=118.51;MQRankSum=-2.194;NS=1046;RA=823;RL=141;RPP=284.09;RR=4;RUN=1;ReadPosRankSum=-20.775;SAB=0.45517;SAF=66;SAP=5.5412;SAR=79;SRB=0.452;SRF=372;SRP=19.477;SRR=451;VQSLOD=3.9584;set=filterInVQSR-2of5;sumGLbyD=3.29 +20 20015051 . TGAGGGTGG T 1820.73 PASS AF=0.0112;AF1=0.01638;AN=714;BaseQRankSum=6.652;CI95=0.01106,0.02212;DP=9910;DP4=2812,1912,6,11;Dels=0.01;FQ=999;FR;FS=6.147;HP=1;HPLen=2;HR=2;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0077;MQ=129.13;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-3.195;NF;NR;PP;PV4=0.049,1,5.5e-05,0.006;ReadPosRankSum=-1.989;SC=TTGGTGGAGTTGAGGGTGGGA;TC;TR=2;TU=T;VQSLOD=6.5963;set=Intersection;sumGLbyD=33.49 +20 20301041 rs35451634 ATATG A 200.42 PASS AC=21;AF=0.0449;AN=468;BaseQRankSum=5.251;DB;DP=579;FS=24.013;HRun=0;HaplotypeScore=27.8977;InbreedingCoeff=0.0113;MQ=78.47;MQ0=26;MQ0Fraction=0.0449;MQRankSum=-5.284;QD=3.06;ReadPosRankSum=1.793;SB=-55.76;VQSLOD=5.0981;set=VQSR +20 20378174 . TC T 245.55 PASS AC=23;AF=0.01879;AN=1224;BaseQRankSum=0.990;DP=3225;FS=10.413;HRun=1;HaplotypeScore=22.6109;InbreedingCoeff=0.0244;MQ=93.70;MQ0=3;MQ0Fraction=0.0009;MQRankSum=-3.349;QD=1.86;ReadPosRankSum=-7.227;SB=-188.62;VQSLOD=4.2553;set=VQSR +20 20809160 rs10571503 TAA AAA,T 3496 PASS AC=0;AF=0.0000;AN=612;BaseQRankSum=1.968;DB;DP=1092;FR;HP=4;HPLen=3;HR=3;HRun=0;HU=A;HaplotypeScore=26.1253;InbreedingCoeff=0.0603;MQ=68.98;MQ0=1;MQ0Fraction=0.0009;MQRankSum=1.520;NF;NR;PP;ReadPosRankSum=-4.042;SC=TATATATATATAAATTTAAAT;TC;TR=13;TU=AT;set=filterInVQSR-2of5 +20 22508765 . CT C 53877.84 PASS AA=187;AB=0.78077;ABA=171;ABP=537.09;ABR=609;AC=1017;AF=0.91787;AN=1108;BL=12690;BR=1718;BVAR;BaseQRankSum=13.773;DEL;DP=7430;Dels=0.02;EL=73;EPP=22.53;ER=114;FR;FS=16.352;HETAR=152;HOMA=9;HOMR=786;HP=8;HR=4;HRun=4;HU=T;InbreedingCoeff=0.3885;LEN=1;LRB=0.76152;LRBP=18147;MQ0=0;MQ0Fraction=0.0000;MQM=46.086;MQRankSum=0.971;NF;NR;NS=947;PP;RA=2868;RL=177;RPP=326.86;RR=10;RUN=1;ReadPosRankSum=9.951;SAB=0.34759;SAF=65;SAP=40.738;SAR=122;SC=AAAAAATTTTCTTTTGAACTG;SRB=0.46269;SRF=1327;SRP=37.684;SRR=1541;TC;TR=4;TU=T;VQSLOD=5.1182;set=Intersection;sumGLbyD=25.15 +20 22555082 rs11477526 AT A 11503 PASS AA=530;AB=0.50816;ABA=422;ABP=3.5063;ABR=436;AF=0.1614;AN=700;BL=21453;BR=23313;BVAR;BaseQRankSum=17.562;DB;DEL;DP=25587;DP4=1869,1600,283,201;Dels=0.14;EL=259;EPP=3.6003;ER=271;FQ=999;FR;FS=14.595;HETAR=159;HOMA=41;HOMR=846;HP=3;HPLen=3;HR=3;HRun=3;HU=T;INDEL;InbreedingCoeff=0.0995;LEN=1;LRB=0.041549;LRBP=170.83;MQ=95.89;MQ0=0;MQ0Fraction=0.0000;MQM=72.162;MQRankSum=2.564;NF;NR;NS=1046;PP;PV4=0.058,6.6e-129,0.04,1;RA=4303;RL=264;RPP=3.0267;RR=266;RUN=1;ReadPosRankSum=0.176;SAB=0.58679;SAF=311;SAP=37.688;SAR=219;SC=GGGAAAGCTGATTTACTGATT;SRB=0.54892;SRF=2362;SRP=92.453;SRR=1941;TC;TR=3;TU=T;VQSLOD=8.7746;dbSNP=120;set=Intersection;sumGLbyD=15.27 +20 22590907 . A AC 4204.88 PASS AA=67;AB=0.592;ABA=51;ABP=12.2;ABR=74;AF=0.0554;AF1=0.0468;AN=560;BL=2277;BR=2389;BVAR;BaseQRankSum=10.968;CI95=0.03759,0.05639;DP=14380;DP4=2514,2018,33,33;Dels=0.00;EL=22;EPP=20.155;ER=45;FQ=999;FR;FS=3.846;HETAR=25;HOMA=4;HOMR=1049;HP=4;HPLen=5;HR=5;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.0719;LEN=1;LRB=0.024003;LRBP=8.8481;MQ=110.68;MQ0=0;MQ0Fraction=0.0000;MQM=96.149;MQRankSum=2.668;NF;NR;NS=1078;PP;PV4=0.39,1,0.46,0.36;RA=5468;RL=33;RPP=3.0427;RR=34;RUN=1;ReadPosRankSum=-1.097;SAB=0.50746;SAF=34;SAP=3.0427;SAR=33;SC=TCATATCAAAAACATTACGTT;SRB=0.54389;SRF=2974;SRP=94.508;SRR=2494;TC;TR=5;TU=A;VQSLOD=10.0712;set=Intersection;sumGLbyD=27.69 +20 22806326 rs11468890 ATTCCATCAC A 105320.99 PASS AC=567;AF=0.48795;AN=1162;BVAR;BaseQRankSum=32.858;DB;DEL;DP=26278;DP4=727,796,554,587;Dels=0.30;FQ=999;FR;FS=1.923;HP=3;HPLen=3;HR=2;HRun=0;HU=T;INDEL;InbreedingCoeff=0.2548;LEN=9;MQ=89.42;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-23.545;NF;NR;PP;PV4=0.7,1,1.3e-167,1;RUN=1;ReadPosRankSum=4.384;SC=GGCTGCTCCCATTCCATCACT;TC;TR=2;TU=T;VQSLOD=8.2594;set=Intersection;sumGLbyD=69.81 +20 22999898 rs55966257 CAGGA C 8019.97 PASS AA=23;AB=0.57778;ABA=19;ABP=5.3748;ABR=26;AC=214;AF=0.18838;AN=1136;BL=1143;BR=1040;BVAR;BaseQRankSum=29.294;DB;DEL;DP=8216;Dels=0.02;EL=11;EPP=3.1047;ER=12;FS=14.938;HETAR=14;HOMA=2;HOMR=948;HRun=0;InbreedingCoeff=0.0797;LEN=4;LRB=0.047183;LRBP=13.563;MQ0=0;MQ0Fraction=0.0000;MQM=34.783;MQRankSum=-20.301;NS=964;RA=3637;RL=13;RPP=3.86;RR=10;RUN=1;ReadPosRankSum=-24.607;SAB=0.47826;SAF=11;SAP=3.1047;SAR=12;SRB=0.49024;SRF=1783;SRP=6.02;SRR=1854;VQSLOD=7.9163;set=Intersection;sumGLbyD=9.43 +20 23385964 rs57723772 GAA G 8170.95 PASS AC=257;AF=0.20928;AN=1228;BaseQRankSum=32.220;DB;DP=3291;FS=1.688;HRun=3;HaplotypeScore=22.6739;InbreedingCoeff=0.0171;MQ=58.44;MQ0=32;MQ0Fraction=0.0097;MQRankSum=-4.893;QD=6.55;ReadPosRankSum=-35.524;SB=-3631.67;VQSLOD=5.6549;set=VQSR +20 23534530 . TA T 3542.10 PASS AA=45;AB=0.75658;ABA=37;ABP=89.926;ABR=115;AC=35;AF=0.02991;AN=1170;BL=3090;BR=270;BVAR;BaseQRankSum=-6.892;DEL;DP=8108;Dels=0.00;EL=19;EPP=5.3748;ER=26;FS=1.026;HETAR=76;HOMA=896;HOMR=18;HRun=1;InbreedingCoeff=0.0551;LEN=1;LRB=0.83929;LRBP=5142.4;MQ0Fraction=0.0017;MQM=41.578;MQRankSum=0.818;NS=991;RA=203;RL=43;RPP=84.127;RR=2;RUN=1;ReadPosRankSum=-12.923;SAB=0.37778;SAF=17;SAP=8.8491;SAR=28;SRB=0.5665;SRF=115;SRP=10.808;SRR=88;VQSLOD=4.2093;set=Intersection;sumGLbyD=3.49 +20 23976810 rs5841018 A ATATTAAT 1782.38 PASS AF=0.1387;AF1=0.01507;BaseQRankSum=3.717;CI95=0.00188,0.03947;DB;DP=1712;DP4=357,376,7,2;Dels=0.00;FQ=31.1;FS=14.489;HPLen=2;HRun=0;INDEL;InbreedingCoeff=0.1123;MQ=49.53;MQ0=2;MQ0Fraction=0.0055;MQRankSum=-4.928;PV4=0.1,1,0.00085,0.016;ReadPosRankSum=-4.456;VQSLOD=5.3140;dbSNP=116;set=Intersection;sumGLbyD=19.98 +20 24222100 . CTTTTA C 4219.36 PASS AA=57;AB=0.59434;ABA=43;ABP=11.205;ABR=63;AF=0.01803;AF1=0.01547;AN=1220;BL=2073;BR=2345;BVAR;BaseQRankSum=7.990;CI95=0.0114,0.02137;DEL;DP=17536;DP4=2140,2346,7,12;Dels=0.01;EL=32;EPP=4.877;ER=25;FQ=104;FS=0.614;HETAR=21;HOMA=4;HOMR=1042;HRun=0;INDEL;InbreedingCoeff=0.1941;LEN=5;LRB=0.061566;LRBP=39.374;MQ=73.32;MQ0Fraction=0.0021;MQM=39.614;MQRankSum=-5.728;NS=1067;PV4=0.37,1.1e-39,3.5e-09,1;RA=5527;RL=28;RPP=3.0484;RR=29;RUN=1;ReadPosRankSum=0.214;SAB=0.54386;SAF=31;SAP=3.9627;SAR=26;SRB=0.49267;SRF=2723;SRP=5.588;SRR=2804;VQSLOD=7.5428;set=Intersection;sumGLbyD=38.08 +20 24395018 . AT A 49310 PASS AA=146;AB=0.91198;ABA=130;ABP=2180.5;ABR=1347;AC=50;AF=0.04045;AN=1236;BL=587;BR=9625;BVAR;BaseQRankSum=-4.610;DEL;DP=12793;Dels=0.01;EL=54;EPP=24.487;ER=92;FS=22.108;HETAR=485;HOMA=384;HOMR=210;HRun=2;InbreedingCoeff=0.0374;LEN=1;LRB=0.88504;LRBP=17373;MQ0=0;MQ0Fraction=0.0000;MQM=102.26;MQRankSum=2.256;NS=1080;RA=2377;RL=1;RPP=311.42;RR=145;RUN=1;ReadPosRankSum=-16.347;SAB=0.63699;SAF=93;SAP=26.807;SAR=53;SRB=0.52167;SRF=1240;SRP=12.702;SRR=1137;VQSLOD=3.2421;set=filterInVQSR-2of5;sumGLbyD=3.80 +20 24411517 . C CA 246.18 PASS AF=0.01546;AF1=0.01095;BaseQRankSum=7.832;CI95=0.005698,0.01709;DP=7981;DP4=983,2037,7,7;Dels=0.00;FQ=27.9;FS=18.815;HPLen=3;HRun=3;INDEL;InbreedingCoeff=0.0175;MQ=60.28;MQ0Fraction=0.0137;MQRankSum=-7.243;PV4=0.25,1,2.7e-05,1;ReadPosRankSum=-0.143;VQSLOD=4.3701;set=Intersection;sumGLbyD=6.56 +20 24421169 . AG A 27480 PASS AA=182;AB=0.8303;ABA=149;ABP=835;ABR=729;AC=89;AF=0.07224;AN=1232;BL=11276;BR=2214;BVAR;BaseQRankSum=-5.447;DEL;DP=11717;Dels=0.01;EL=103;EPP=9.8827;ER=79;FR;FS=15.492;HETAR=343;HOMA=607;HOMR=114;HP=4;HR=1;HRun=1;HU=G;InbreedingCoeff=0.0353;LEN=1;LRB=0.67176;LRBP=13222;MQ0=0;MQ0Fraction=0.0000;MQM=88.324;MQRankSum=2.221;NF;NR;NS=1071;PP;RA=1226;RL=169;RPP=293.37;RR=13;RUN=1;ReadPosRankSum=-19.711;SAB=0.54945;SAF=100;SAP=6.876;SAR=82;SC=CCTTAGCCCCAGAAAACATCT;SRB=0.44535;SRF=546;SRP=34.814;SRR=680;TC;TR=1;TU=G;VQSLOD=4.2669;set=Intersection;sumGLbyD=3.91 +20 24765537 rs71841337 ATTT A,AT,ATT,ATTTT,ATTTTT 37852 PASS AC=13,120,527,51,92;AF=0.01102,0.10169,0.44661,0.04322,0.07797;AN=1180;BVAR;BaseQRankSum=8.172;DB;DEL;DP=39116;DP4=200,331,851,1169;FR;FS=2.394;HP=15;HR=15;HU=T;HaplotypeScore=20.8091;INDEL;INS;InbreedingCoeff=0.4815;MQ0=1;MQ0Fraction=0.0003;MQRankSum=4.344;NF;NR;PP;PV4=0.067,1,1,0.1;QD=7.90;RUN=1;ReadPosRankSum=1.798;SB=-8371.96;SC=CTCTGCAACAATTTTTTTTTT;TC;TR=15;TU=T;VQSLOD=9.9679;dbSNP=120;set=Intersection +20 25500689 . A AATTT 84980.72 PASS AC=1005;AF=0.89096;AN=1128;BaseQRankSum=17.400;DP=2324;FS=6.721;HRun=0;HaplotypeScore=25.3376;InbreedingCoeff=0.2148;MQ=75.19;MQ0=1;MQ0Fraction=0.0004;MQRankSum=-8.221;QD=38.28;ReadPosRankSum=4.504;SB=-34833.07;VQSLOD=4.6038;set=VQSR +20 25550373 . GA G 11251.31 PASS AA=246;AB=0.42963;ABA=154;ABP=14.624;ABR=116;AC=566;AF=0.6521;AN=868;BL=5230;BR=11845;BVAR;BaseQRankSum=7.418;DEL;DP=8885;Dels=0.02;EL=99;EPP=23.348;ER=147;FR;FS=50.357;HETAR=150;HOMA=849;HOMR=14;HP=1;HR=2;HRun=1;HU=G;InbreedingCoeff=0.1365;LEN=1;LRB=0.38741;LRBP=5567.9;MQ0=0;MQ0Fraction=0.0000;MQM=97.561;MQRankSum=0.050;NF;NR;NS=1013;PP;RA=269;RL=75;RPP=84.361;RR=171;RUN=1;ReadPosRankSum=-7.128;SAB=0.52846;SAF=130;SAP=4.7404;SAR=116;SC=CACGGAGGCGGAGGAAGCAGC;SRB=0.42379;SRF=114;SRP=16.58;SRR=155;TC;TR=6;TU=AGG;VQSLOD=4.0103;set=filterInVQSR-2of5;sumGLbyD=4.58 +20 25903865 . TTC T 7459.23 PASS AC=277;AF=0.23316;AN=1188;BaseQRankSum=31.479;DP=2969;FS=137.723;HRun=0;HaplotypeScore=37.3300;InbreedingCoeff=-0.1755;MQ=53.49;MQ0=50;MQ0Fraction=0.0168;MQRankSum=-25.506;QD=4.70;ReadPosRankSum=-5.913;SB=-1747.98;VQSLOD=5.4731;set=VQSR +20 25934237 . C CCACTT 771.36 PASS AC=37;AF=0.0426;AN=868;BaseQRankSum=16.331;DP=2253;FS=4.545;HRun=0;HaplotypeScore=29.9764;InbreedingCoeff=-0.0685;MQ=48.12;MQ0=87;MQ0Fraction=0.0386;MQRankSum=-12.497;QD=3.37;ReadPosRankSum=-8.428;SB=-297.70;VQSLOD=4.2324;set=VQSR +20 26054751 rs112967123 TATC T 33244 PASS AA=1863;AB=0.79012;ABA=1788;ABP=6231;ABR=6731;AC=227;AF=0.18218;AN=1246;BL=74924;BR=72452;BVAR;BaseQRankSum=32.258;DB;DEL;DP=36404;DS;Dels=0.05;EL=931;EPP=3.0115;ER=932;FR;FS=265.752;HETAR=527;HOMA=2;HOMR=565;HP=1;HR=2;HRun=0;HU=T;InbreedingCoeff=-0.2137;LEN=3;LRB=0.016773;LRBP=93.048;MQ0Fraction=0.0127;MQM=28.797;MQRankSum=-5.329;NF;NR;NS=1094;PP;RA=14604;RL=1014;RPP=34.743;RR=849;RUN=1;ReadPosRankSum=8.394;SAB=0.65486;SAF=1220;SAP=391.07;SAR=643;SC=TCACCATCATTATCATCATTA;SRB=0.56717;SRF=8283;SRP=575.39;SRR=6321;TC;TR=8;TU=ATC;VQSLOD=1.0486;set=filterInVQSR-2of5;sumGLbyD=6.54 +20 26075169 . CTTCATT C 34603 PASS AA=311;AB=0.88905;ABA=298;ABP=3534.4;ABR=2388;AC=235;AF=0.18921;AN=1242;BL=17537;BR=5525;BVAR;BaseQRankSum=33.761;DEL;DP=20706;DS;Dels=0.01;EL=206;EPP=74.236;ER=105;FR;FS=94.549;HETAR=596;HOMA=99;HOMR=336;HP=3;HR=2;HRun=0;HU=T;InbreedingCoeff=-0.2083;LEN=6;LRB=0.52086;LRBP=13589;MQ0Fraction=0.0426;MQM=14.524;MQRankSum=-37.199;NF;NR;NS=1038;PP;RA=3600;RL=311;RPP=678.34;RR=0;RUN=1;ReadPosRankSum=-27.333;SAB=0.66238;SAF=206;SAP=74.236;SAR=105;SC=TCACCATCATCTTCATTATCA;SRB=0.55833;SRF=2010;SRP=109.41;SRR=1590;TC;TR=7;TU=ATC;VQSLOD=1.4394;set=filterInVQSR-2of5;sumGLbyD=4.96 +20 26120452 . CAG C 7863.19 PASS AA=163;AB=0.70489;ABA=157;ABP=196.99;ABR=375;AC=171;AF=0.1908;AN=896;BL=3455;BR=4877;BVAR;BaseQRankSum=25.536;DEL;DP=7014;Dels=0.10;EL=58;EPP=32.438;ER=105;FS=231.723;HETAR=90;HOMA=5;HOMR=387;HRun=0;InbreedingCoeff=-0.1966;LEN=2;LRB=0.17067;LRBP=530;MQ0Fraction=0.0470;MQM=21.951;MQRankSum=-23.449;NS=482;RA=1117;RL=62;RPP=23.273;RR=101;RUN=1;ReadPosRankSum=1.904;SAB=0.37423;SAF=61;SAP=25.404;SAR=102;SRB=0.41719;SRF=466;SRP=69.544;SRR=651;VQSLOD=-0.9395;set=filterInVQSR-2of5;sumGLbyD=5.06 +20 26136208 . A AT 17172.04 PASS AA=252;AB=0.73593;ABA=183;ABP=338.07;ABR=510;AC=381;AF=0.30775;AN=1238;BL=8304;BR=14158;BVAR;BaseQRankSum=41.520;DP=40036;DP4=2448,2564,317,366;Dels=0.00;EL=163;EPP=50.197;ER=89;FQ=999;FS=6.531;HETAR=149;HOMA=52;HOMR=708;HRun=1;INDEL;INS;InbreedingCoeff=-0.3996;LEN=1;LRB=0.26062;LRBP=3315.9;MQ=64.20;MQ0=22;MQ0Fraction=0.0048;MQM=25.706;MQRankSum=-29.318;NS=909;PV4=0.24,1.1e-119,3.2e-281,1;RA=2939;RL=58;RPP=162.39;RR=194;RUN=1;ReadPosRankSum=0.592;SAB=0.24206;SAF=61;SAP=148.64;SAR=191;SRB=0.4852;SRF=1426;SRP=8.6026;SRR=1513;VQSLOD=0.5981;set=filterInVQSR-2of5;sumGLbyD=5.77 +20 26185812 . AG A 322.58 PASS AF=0.0342;BaseQRankSum=3.668;DP=3014;Dels=0.01;FR;FS=10.238;HP=8;HPLen=6;HR=6;HRun=6;HU=G;InbreedingCoeff=0.1504;MQ0Fraction=0.0473;MQRankSum=-5.464;NF;NR;PP;ReadPosRankSum=0.536;SC=GGGTGGGTGGAGGGGGGAGGG;TC;TR=6;TU=G;VQSLOD=5.0767;set=Intersection;sumGLbyD=8.46 +20 30963468 . AGTTT A 2041.12 PASS AA=38;AB=0.75694;ABA=35;ABP=85.587;ABR=109;AC=34;AF=0.0377;AN=902;BL=1974;BR=668;BVAR;BaseQRankSum=3.060;DEL;DP=22806;DP4=1997,1747,28,36;Dels=0.02;EL=17;EPP=3.9246;ER=21;FR;FS=16.034;HETAR=29;HOMA=1;HOMR=1009;HP=1;HPLen=1;HR=1;HRun=0;HU=G;INDEL;InbreedingCoeff=0.0752;LEN=4;LRB=0.49432;LRBP=1404.9;MQ=87.17;MQ0Fraction=0.0013;MQM=98.079;MQRankSum=6.021;NF;NR;NS=1039;PP;PV4=0.13,1.5e-07,1,0.051;RA=4052;RL=36;RPP=69.069;RR=2;RUN=1;ReadPosRankSum=-1.847;SAB=0.5;SAF=19;SAP=3.0103;SAR=19;SC=AGAAGTAAGTAGTTTGTTTTT;SRB=0.53776;SRF=2179;SRP=53.19;SRR=1873;TC;TR=9;TU=AAGT;VQSLOD=7.3578;set=Intersection;sumGLbyD=14.03 +20 31963212 . AAAAAAAAAAAAG A 727.15 PASS AC=5;AF=0.0080;AN=622;BaseQRankSum=4.037;DP=1480;FS=0.000;HRun=0;HaplotypeScore=43.3793;InbreedingCoeff=0.0350;MQ=51.77;MQ0=59;MQ0Fraction=0.0399;MQRankSum=-1.799;QD=22.72;ReadPosRankSum=3.591;SB=-364.04;VQSLOD=5.3166;set=VQSR +20 31997272 . CT C,CTT,CTTT 1837.10 PASS AA=63;AB=0.77559;ABA=57;ABP=170.57;ABR=197;AC=79,49,30;AF=0.06594,0.04090,0.02504;AN=1198;BL=2372;BR=2640;BVAR;BaseQRankSum=3.277;DP=9050;Dels=0.03;EL=24;EPP=10.766;ER=39;FR;FS=0.303;HETAR=45;HOMA=1;HOMR=981;HP=10;HPLen=10;HR=10;HRun=10;HU=T;INS;InbreedingCoeff=0.2796;LEN=1;LRB=0.053472;LRBP=34.128;MQ0Fraction=0.0000;MQM=50.889;MQRankSum=0.610;NF;NR;NS=1027;PP;RA=3776;RL=30;RPP=3.3205;RR=33;RUN=1;ReadPosRankSum=-0.800;SAB=0.39683;SAF=25;SAP=8.8354;SAR=38;SC=ACCCAACTTCCTTTTTTTTTT;SRB=0.46213;SRF=1745;SRP=50.049;SRR=2031;TC;TR=10;TU=T;VQSLOD=4.1189;set=filterInVQSR-2of5;sumGLbyD=3.66 +20 33446974 rs113250263 TAA T,TA,TAAA 17130.16 PASS AC=65,417,184;AF=0.05941,0.38117,0.16819;AN=1094;BVAR;BaseQRankSum=3.400;DB;DEL;DP=22362;DP4=221,247,418,524;Dels=0.33;FR;FS=15.409;HP=15;HR=14;HRun=14;HU=A;INDEL;INS;InbreedingCoeff=0.5215;MQ=61.32;MQ0Fraction=0.0021;MQRankSum=0.481;NF;NR;PP;PV4=0.33,1,1,1;RUN=1;ReadPosRankSum=-0.056;SC=CTCCGTCTCATAAAAAAAAAA;TC;TR=14;TU=A;VQSLOD=8.0974;dbSNP=132;set=Intersection;sumGLbyD=12.78 +20 33877149 . C CT 1784.40 PASS AA=58;AB=0.73096;ABA=53;ABP=94.289;ABR=144;AC=65;AF=0.05682;AN=1144;BL=3298;BR=1935;BVAR;BaseQRankSum=-2.066;DP=8074;Dels=0.02;EL=22;EPP=10.348;ER=36;FR;FS=11.452;HETAR=47;HOMA=3;HOMR=754;HP=16;HR=12;HRun=12;HU=T;INS;InbreedingCoeff=0.1178;LEN=1;LRB=0.26046;LRBP=773.91;MQ0Fraction=0.0165;MQM=52.259;MQRankSum=0.734;NF;NR;NS=804;PP;RA=2141;RL=43;RPP=32.363;RR=15;RUN=1;ReadPosRankSum=-1.273;SAB=0.46552;SAF=27;SAP=3.6093;SAR=31;SC=ATTTTCTTTTCTTTTTTTTTT;SRB=0.37553;SRF=804;SRP=291.14;SRR=1337;TC;TR=12;TU=T;VQSLOD=3.1540;set=filterInVQSR-2of5;sumGLbyD=2.84 +20 34358698 . A AAAAAAT 583.61 PASS AC=27;AF=0.02542;AN=1062;BaseQRankSum=5.228;DP=1997;FS=3.765;HRun=0;HaplotypeScore=27.7123;InbreedingCoeff=0.0566;MQ=55.50;MQ0=14;MQ0Fraction=0.0070;MQRankSum=-3.961;QD=5.21;ReadPosRankSum=0.862;SB=-399.69;VQSLOD=4.3826;set=VQSR +20 34387589 rs112431805 CT C,CTT 4039.10 PASS AA=121;AB=0.75368;ABA=117;ABP=268.53;ABR=358;AC=84,139;AF=0.07047,0.11661;AN=1192;BL=5557;BR=3901;BVAR;BaseQRankSum=2.693;DB;DP=10157;Dels=0.03;EL=47;EPP=16.093;ER=74;FR;FS=7.639;HETAR=89;HOMA=2;HOMR=913;HP=13;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.2097;LEN=1;LRB=0.17509;LRBP=632.63;MQ0Fraction=0.0000;MQM=49.802;MQRankSum=-0.801;NF;NR;NS=1004;PP;RA=3789;RL=77;RPP=22.554;RR=44;RUN=1;ReadPosRankSum=-2.691;SAB=0.3719;SAF=45;SAP=20.256;SAR=76;SC=AAGAAGTGTTCTTTTTTTTTT;SRB=0.40987;SRF=1553;SRP=270.35;SRR=2236;TC;TR=11;TU=T;VQSLOD=4.0473;set=filterInVQSR-2of5;sumGLbyD=4.64 +20 34493409 rs73621682 C CAG 62288.93 PASS AA=1069;AB=0.54863;ABA=826;ABP=40.606;ABR=1004;AC=257;AF=0.3640;AN=706;BL=41524;BR=47039;BVAR;BaseQRankSum=-24.248;DB;DP=30195;DP4=1743,1636,614,487;Dels=0.00;EL=582;EPP=21.343;ER=487;FQ=999;FR;FS=5.080;HETAR=298;HOMA=63;HOMR=712;HP=1;HPLen=1;HR=1;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.1437;LEN=2;LRB=0.062272;LRBP=748.76;MQ=77.99;MQ0=3;MQ0Fraction=0.0015;MQM=54.446;MQRankSum=0.160;NF;NR;NS=1073;PP;PV4=0.016,1,0.01,1;RA=4461;RL=526;RPP=3.5973;RR=543;RUN=1;ReadPosRankSum=-1.716;SAB=0.57343;SAF=613;SAP=53.08;SAR=456;SC=AGGAAGAGATCAGAGCTCCCC;SRB=0.52634;SRF=2348;SRP=29.892;SRR=2113;TC;TR=4;TU=AG;VQSLOD=8.7047;dbSNP=130;set=Intersection;sumGLbyD=49.82 +20 35086229 rs112534255 G GAT 6109.24 PASS AA=14;AB=0.71795;ABA=11;ABP=19.101;ABR=28;AC=35;AF=0.0509;AN=688;BL=846;BR=517;BVAR;BaseQRankSum=-7.153;DB;DP=15775;DP4=2064,2212,31,22;Dels=0.00;EL=7;EPP=3.0103;ER=7;FR;FS=0.000;HETAR=10;HOMA=2;HOMR=914;HP=3;HPLen=4;HR=4;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.1170;LEN=2;LRB=0.24138;LRBP=175.46;MQ=54.65;MQ0Fraction=0.0118;MQM=45.643;MQRankSum=1.614;NF;NR;NS=926;PP;PV4=0.17,1,1,1;RA=2867;RL=11;RPP=12.937;RR=3;RUN=1;ReadPosRankSum=-0.520;SAB=0.71429;SAF=10;SAP=8.5941;SAR=4;SC=TTTTAGTAAAGGGGATTTCAC;SRB=0.58249;SRF=1670;SRP=172.46;SRR=1197;TC;TR=4;TU=G;VQSLOD=10.3126;set=Intersection;sumGLbyD=42.13 +20 35575895 rs67189278 AGTGT A,AGT,AGTGTGT,TGTGT 43809.26 PASS AC=593,3,481;AF=0.53327,0.00270,0.43255;AN=1112;BVAR;BaseQRankSum=-8.327;DB;DEL;DP=8989;Dels=0.04;FR;FS=9.400;HP=2;HPLen=1;HR=1;HRun=0;HU=G;INS;InbreedingCoeff=0.7735;LEN=2;MQ0Fraction=0.0400;MQRankSum=-2.719;NF;NR;PP;RUN=1;ReadPosRankSum=-9.301;SC=TGTGTGTGTGAGTGTGTGTGT;TC;TR=22;TU=GT;VQSLOD=8.6440;set=Intersection;sumGLbyD=6.01 +20 35957317 . CTGACT C,CGACT 4370.96 PASS ABR=81;AC=22,1;AF=0.0321,0.0015;AF1=0.04523;AN=686;BVAR;BaseQRankSum=7.969;CI95=0.0354,0.05752;DEL;DP=16632;DP4=1942,1815,17,21;Dels=0.03;FQ=999;FR;FS=0.531;HOMA=1;HOMR=998;HP=2;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0587;MQ=83.38;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-7.201;NF;NR;NS=1020;PP;PV4=0.42,0.00017,4.5e-12,1;RA=4620;RUN=1;ReadPosRankSum=-1.007;SC=CCTCTCAGCTCTGACTGAGTC;SRB=0.50043;SRF=2312;SRP=3.0178;SRR=2308;TC;TR=8;TU=ACTG;VQSLOD=9.9778;dbSNP=130;set=Intersection;sumGLbyD=36.45 +20 36136198 . GTGTC G 2078.76 PASS AA=35;AB=0.54167;ABA=33;ABP=4.096;ABR=39;AC=17;AF=0.01384;AN=1228;BL=1212;BR=1523;BVAR;BaseQRankSum=6.900;DEL;DP=22483;DP4=1696,2291,9,16;Dels=0.01;EL=9;EPP=20.94;ER=26;FQ=999;FR;FS=3.023;HETAR=13;HOMA=1;HOMR=1061;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1113;LEN=4;LRB=0.11371;LRBP=79.803;MQ=93.98;MQ0=1;MQ0Fraction=0.0003;MQM=83.686;MQRankSum=-1.683;NF;NR;NS=1075;PP;PV4=0.55,1,0.0083,1;RA=5771;RL=19;RPP=3.5687;RR=16;RUN=1;ReadPosRankSum=0.618;SAB=0.37143;SAF=13;SAP=8.0357;SAR=22;SC=TATCATTTTAGTGTCTGTCTG;SRB=0.44966;SRF=2595;SRP=130.03;SRR=3176;TC;TR=11;TU=CTGT;VQSLOD=10.1935;set=Intersection;sumGLbyD=31.66 +20 36250522 . CA C 37933 PASS AA=51;AB=0.95582;ABA=44;ABP=1800.5;ABR=952;AC=23;AF=0.01885;AN=1220;BL=691;BR=3464;BVAR;BaseQRankSum=-2.418;DEL;DP=11998;Dels=0.00;EL=18;EPP=12.59;ER=33;FS=2.307;HETAR=348;HOMA=534;HOMR=164;HRun=1;InbreedingCoeff=0.0763;LEN=1;LRB=0.66739;LRBP=4021.7;MQ0=2;MQ0Fraction=0.0006;MQM=53.647;MQRankSum=1.083;NS=1047;RA=1663;RL=2;RPP=97.065;RR=49;RUN=1;ReadPosRankSum=-12.726;SAB=0.68627;SAF=35;SAP=18.381;SAR=16;SRB=0.59651;SRF=992;SRP=137.56;SRR=671;VQSLOD=4.1346;set=filterInVQSR-2of5;sumGLbyD=3.29 +20 36285033 rs34715186 AT A 39417 PASS AA=530;AB=0.5406;ABA=447;ABP=16.939;ABR=526;AC=88;AF=0.0950;AN=926;BL=20722;BR=20406;BVAR;BaseQRankSum=15.611;DB;DEL;DP=36713;DP4=2551,2475,236,218;Dels=0.09;EL=241;EPP=12.45;ER=289;FQ=999;FR;FS=1.290;HETAR=141;HOMA=16;HOMR=926;HP=2;HPLen=3;HR=3;HRun=1;HU=A;INDEL;InbreedingCoeff=0.0742;LEN=1;LRB=0.0076833;LRBP=8.2825;MQ=104.81;MQ0=0;MQ0Fraction=0.0000;MQM=84.285;MQRankSum=-0.702;NF;NR;NS=1083;PP;PV4=0.62,1,1,1;RA=6562;RL=263;RPP=3.0759;RR=267;RUN=1;ReadPosRankSum=0.090;SAB=0.55849;SAF=296;SAP=18.76;SAR=234;SC=AAAAACACAAATCAGATCGTG;SRB=0.51707;SRF=3393;SRP=19.614;SRR=3169;TC;TR=3;TU=A;VQSLOD=10.5533;dbSNP=126;set=Intersection;sumGLbyD=14.15 +20 36384872 . CTG C 43532.41 PASS AC=1213;AF=0.99589;AN=1218;BaseQRankSum=0.802;DP=3208;FS=9.727;HRun=0;HaplotypeScore=46.6153;InbreedingCoeff=0.1085;MQ=58.37;MQ0=50;MQ0Fraction=0.0156;MQRankSum=-1.672;QD=13.57;ReadPosRankSum=2.063;SB=-18894.12;VQSLOD=4.7353;set=VQSR +20 36542802 . GTA G 31310.15 PASS AA=1481;AB=0.67546;ABA=1378;ABP=1138.4;ABR=2868;AC=437;AF=0.35938;AN=1216;BL=25719;BR=95500;BVAR;BaseQRankSum=9.478;DEL;DP=18068;DS;Dels=0.10;EL=889;EPP=132.34;ER=592;FS=320.726;HETAR=591;HOMA=44;HOMR=378;HRun=0;InbreedingCoeff=-0.4197;LEN=2;LRB=0.57566;LRBP=87231;MQ0Fraction=0.0091;MQM=29.319;MQRankSum=-3.409;NS=1013;RA=4037;RL=3;RPP=3193;RR=1478;RUN=1;ReadPosRankSum=-6.687;SAB=0.40041;SAF=593;SAP=130.61;SAR=888;SRB=0.39014;SRF=1575;SRP=426.21;SRR=2462;VQSLOD=-1.6586;set=filterInVQSR-2of5;sumGLbyD=5.49 +20 36985025 . CCA C 4.57 PASS AC=0;AF=0.0000;AN=682;BaseQRankSum=4.199;DP=1504;FS=1.036;HRun=0;HaplotypeScore=18.5241;InbreedingCoeff=0.0460;MQ=57.04;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.774;ReadPosRankSum=-2.105;VQSLOD=6.7455;set=VQSR +20 37139725 . CAG C 250.77 PASS AF=0.0084;AF1=0.0139;BaseQRankSum=4.131;CI95=0.00885,0.01991;DP=7973;DP4=1808,1990,2,7;Dels=0.01;FQ=104;FR;FS=11.160;HP=3;HPLen=2;HR=1;HRun=0;HU=A;INDEL;InbreedingCoeff=-0.0001;MQ=103.71;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-3.378;NF;NR;PP;PV4=0.18,0.0011,0.041,1;ReadPosRankSum=0.605;SC=AGATGGGGAACAGAGAGCAAG;TC;TR=6;TU=AG;VQSLOD=7.0630;set=Intersection;sumGLbyD=12.13 +20 37213224 . G GTA 3230.05 PASS AA=32;AB=0.50769;ABA=32;ABP=3.0437;ABR=33;AC=12;AF=0.0168;AF1=0.02635;AN=714;BL=1271;BR=1743;BVAR;BaseQRankSum=-7.288;CI95=0.02212,0.03319;DP=14304;DP4=2180,2256,13,21;Dels=0.00;EL=20;EPP=7.3532;ER=12;FQ=999;FR;FS=7.863;HETAR=9;HOMA=0;HOMR=1043;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0410;LEN=2;LRB=0.1566;LRBP=163.52;MQ=95.56;MQ0=1;MQ0Fraction=0.0005;MQM=51.562;MQRankSum=0.420;NF;NR;NS=1052;PP;PV4=0.23,1,0.03,0.33;RA=5138;RL=11;RPP=9.7962;RR=21;RUN=1;ReadPosRankSum=-1.122;SAB=0.28125;SAF=9;SAP=16.311;SAR=23;SC=TTTGCATCCAGTAGCACCACT;SRB=0.42293;SRF=2173;SRP=268.11;SRR=2965;TC;TR=1;TU=T;VQSLOD=9.7315;set=Intersection;sumGLbyD=36.69 +20 37282014 . ATGG A 2518.52 PASS AF=0.03519;BaseQRankSum=11.994;DP=24592;DP4=415,3804,8,49;DS;Dels=0.01;FQ=999;FR;FS=2.049;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1028;MQ=51.01;MQ0Fraction=0.0139;MQRankSum=-5.912;NF;NR;PP;PV4=0.27,1,0.22,0.015;ReadPosRankSum=1.781;SC=GGTGGTGATGATGGTGGTGGT;TC;TR=17;TU=GGT;VQSLOD=2.1183;set=filterInVQSR-2of5;sumGLbyD=9.05 +20 37532218 . GTCCGTCCA ATCCGTCCA,G 76120.88 PASS AC=998;AF=0.92924;AN=1074;BaseQRankSum=-2.877;DP=3087;FR;FS=9.889;HP=2;HPLen=2;HR=1;HRun=0;HU=T;HaplotypeScore=71.6244;InbreedingCoeff=-0.0027;MQ=52.68;MQ0=543;MQ0Fraction=0.1759;MQRankSum=-1.750;NF;NR;PP;QD=24.98;ReadPosRankSum=-0.850;SB=-36635.43;SC=CCGTCCGTCCGTCCGTCCATC;TC;TR=19;TU=CCGT;VQSLOD=5.3068;set=Intersection +20 37712193 . AAG A 2670.33 PASS AA=106;AB=0.62821;ABA=87;ABP=36.418;ABR=147;AC=53;AF=0.0759;AN=698;BL=4672;BR=4303;BVAR;BaseQRankSum=13.696;DEL;DP=15155;DP4=1340,1852,32,52;Dels=0.06;EL=57;EPP=4.3214;ER=49;FR;FS=0.824;HETAR=43;HOMA=7;HOMR=982;HP=1;HPLen=2;HR=2;HRun=0;HU=A;INDEL;InbreedingCoeff=0.0861;LEN=2;LRB=0.041114;LRBP=35.954;MQ=86.12;MQ0=0;MQ0Fraction=0.0000;MQM=54.236;MQRankSum=-5.745;NF;NR;NS=1034;PP;PV4=0.5,7.3e-26,1.1e-10,1;RA=4423;RL=58;RPP=5.0589;RR=48;RUN=1;ReadPosRankSum=2.617;SAB=0.38679;SAF=41;SAP=14.81;SAR=65;SC=GAAAATTCTGAAGAGAGTCAG;SRB=0.43093;SRF=1906;SRP=186.29;SRR=2517;TC;TR=6;TU=AG;VQSLOD=9.8131;set=Intersection;sumGLbyD=14.20 +20 37739002 . T TCA 1395.38 PASS AA=16;AB=0.48387;ABA=16;ABP=3.0803;ABR=15;AC=11;AF=0.00950;AN=1158;BL=504;BR=630;BVAR;BaseQRankSum=-3.257;DP=13617;DP4=1660,883,7,5;Dels=0.00;EL=7;EPP=3.5532;ER=9;FR;FS=1.114;HETAR=9;HOMA=0;HOMR=991;HP=1;HPLen=2;HR=2;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0527;LEN=2;LRB=0.11111;LRBP=33.411;MQ=88.41;MQ0=0;MQ0Fraction=0.0000;MQM=83.75;MQRankSum=1.713;NF;NR;NS=1000;PP;PV4=0.76,1,1,0.5;RA=3257;RL=6;RPP=5.1818;RR=10;RUN=1;ReadPosRankSum=1.190;SAB=0.6875;SAF=11;SAP=7.8961;SAR=5;SC=CCTTTTTTGTTCATTTCTGCA;SRB=0.68806;SRF=2241;SRP=1003.5;SRR=1016;TC;TR=2;TU=T;VQSLOD=10.2220;set=Intersection;sumGLbyD=41.32 +20 38122459 . T TG,TGG 1346.40 PASS ABR=339;AC=37,26;AF=0.02989,0.02100;BVAR;BaseQRankSum=10.222;DP=16425;FS=601.551;HOMA=0;HOMR=1008;HaplotypeScore=20.6522;INS;InbreedingCoeff=0.0829;MQ=105.78;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-4.295;NS=1079;QD=0.40;RA=6208;RUN=1;ReadPosRankSum=-14.427;SAB=1;SAR=0;SB=-368.88;SRB=0.34907;SRF=2167;SRP=1231.4;SRR=4041;VQSLOD=-3.3455;set=filterInVQSR-2of5 +20 38395256 . TTGAG T 633.19 PASS AF=0.0028;BaseQRankSum=5.667;DP=3839;Dels=0.00;FR;FS=10.238;HP=2;HPLen=3;HR=3;HRun=0;HU=T;InbreedingCoeff=-0.0097;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.276;NF;NR;PP;ReadPosRankSum=-1.016;SC=ATGTGTTTGTTTGAGTATGTT;TC;TR=10;TU=GTTT;VQSLOD=6.4906;set=Intersection;sumGLbyD=10.83 +20 38882632 rs72004513 AGTGTGTGTGT A,AGT,AGTGT,AGTGTGT,AGTGTGTGT,AGTGTGTGTGTGT 12304.47 PASS AC=57,24,51,78,89,186;AF=0.04664,0.01964,0.04173,0.06383,0.07283,0.15221;AN=1222;BVAR;BaseQRankSum=3.183;DB;DEL;DP=49261;DP4=144,106,104,101;Dels=0.05;FQ=999;FR;FS=5.209;HP=1;HPLen=2;HR=2;HRun=0;HU=A;INDEL;InbreedingCoeff=0.9090;MQ=87.48;MQ0Fraction=0.0071;MQRankSum=-0.897;NF;NR;PP;PV4=0.16,1,0.19,1;RUN=1;ReadPosRankSum=3.551;SC=TAACTCCTCAAGTGTGTGTGT;TC;TR=47;TU=GT;VQSLOD=9.9069;set=Intersection;sumGLbyD=5.30 +20 39345038 . CTGAACCATAATGTG C,CCCATAATGTG 60744.52 PASS AA=23;AB=0.67143;ABA=23;ABP=20.878;ABR=47;AC=232,2;AF=0.19366,0.00167;AN=1198;BL=1607;BR=1843;BVAR;BaseQRankSum=30.955;DEL;DP=31490;DP4=1729,2100,265,278;Dels=0.13;EL=6;EPP=14.434;ER=17;FQ=999;FR;FS=1.767;HETAR=18;HOMA=0;HOMR=1015;HP=1;HPLen=2;HR=2;HRun=0;HU=C;INDEL;InbreedingCoeff=0.1991;LEN=14;LRB=0.068406;LRBP=38.066;MQ=104.60;MQ0=0;MQ0Fraction=0.0000;MQM=189.83;MQRankSum=-16.579;NF;NR;NS=1033;PP;PV4=0.12,1,5.5e-137,1;RA=5286;RL=14;RPP=5.3706;RR=9;RUN=1;ReadPosRankSum=4.323;SAB=0.56522;SAF=13;SAP=3.86;SAR=10;SC=TGGGCTGGACCTGAACCATAA;SRB=0.46311;SRF=2448;SRP=65.493;SRR=2838;TC;TR=2;TU=C;VQSLOD=6.2643;dbSNP=130;set=Intersection;sumGLbyD=65.43 +20 39418008 . AG A 46796 PASS AA=113;AB=0.9511;ABA=80;ABP=2894.6;ABR=1556;AC=30;AF=0.02412;AN=1244;BL=638;BR=6936;BVAR;BaseQRankSum=7.280;DEL;DP=14307;Dels=0.00;EL=50;EPP=6.2579;ER=63;FR;FS=5.707;HETAR=473;HOMA=361;HOMR=246;HP=3;HR=3;HRun=3;HU=G;InbreedingCoeff=0.0272;LEN=1;LRB=0.83153;LRBP=11375;MQ0=0;MQ0Fraction=0.0000;MQM=62.398;MQRankSum=3.530;NF;NR;NS=1089;PP;RA=3000;RL=3;RPP=223.02;RR=110;RUN=1;ReadPosRankSum=-18.601;SAB=0.58407;SAF=66;SAP=9.9475;SAR=47;SC=ACTGGGGGAAAGGGATTCTAG;SRB=0.494;SRF=1482;SRP=3.9484;SRR=1518;TC;TR=3;TU=G;VQSLOD=4.5834;set=Intersection;sumGLbyD=3.06 +20 39876961 . GT G,GTT,GTTT 2302.10 PASS ABR=496;AC=45,51,45;AF=0.03664,0.04153,0.03664;AN=1228;BVAR;BaseQRankSum=4.462;DP=37649;DP4=1457,1975,57,59;Dels=0.02;FR;FS=9.938;HOMA=0;HOMR=978;HP=10;HPLen=10;HR=10;HRun=10;HU=T;INDEL;INS;InbreedingCoeff=0.2583;MQ=97.28;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.246;NF;NR;NS=1063;PP;PV4=0.15,1,1.9e-09,0.016;RA=5185;RUN=1;ReadPosRankSum=-4.954;SC=AGTTTCTCCGGTTTTTTTTTT;SRB=0.47464;SRF=2461;SRP=31.978;SRR=2724;TC;TR=10;TU=T;VQSLOD=4.9752;set=Intersection;sumGLbyD=4.39 +20 41013333 . TC T 20681 PASS AA=137;AB=0.89211;ABA=134;ABP=1661.6;ABR=1108;AC=68;AF=0.05601;AN=1214;BL=1091;BR=8981;BVAR;BaseQRankSum=1.354;DEL;DP=12998;Dels=0.01;EL=57;EPP=11.395;ER=80;FS=0.758;HETAR=359;HOMA=100;HOMR=610;HRun=1;InbreedingCoeff=0.0104;LEN=1;LRB=0.78336;LRBP=13424;MQ0=1;MQ0Fraction=0.0003;MQM=67.745;MQRankSum=2.563;NS=1072;RA=4447;RL=5;RPP=258.66;RR=132;RUN=1;ReadPosRankSum=-14.092;SAB=0.59124;SAF=81;SAP=12.917;SAR=56;SRB=0.54194;SRF=2410;SRP=70.947;SRR=2037;VQSLOD=3.7531;set=filterInVQSR-2of5;sumGLbyD=4.14 +20 41453533 rs112736557 T TA 1734.60 PASS AA=44;AB=0.58025;ABA=34;ABP=7.5409;ABR=47;AC=23;AF=0.0345;AN=666;BL=2061;BR=2408;BVAR;BaseQRankSum=5.768;DB;DP=7437;Dels=0.00;EL=25;EPP=4.787;ER=19;FR;FS=3.680;HETAR=17;HOMA=5;HOMR=975;HP=7;HPLen=6;HR=6;HRun=6;HU=A;INS;InbreedingCoeff=0.1712;LEN=1;LRB=0.077646;LRBP=61.517;MQ0=0;MQ0Fraction=0.0000;MQM=75.614;MQRankSum=-4.976;NF;NR;NS=997;PP;RA=4229;RL=21;RPP=3.2077;RR=23;RUN=1;ReadPosRankSum=-0.039;SAB=0.5;SAF=22;SAP=3.0103;SAR=22;SC=CCTTTCTCCATAAAAAAGCTT;SRB=0.46299;SRF=1958;SRP=53.315;SRR=2271;TC;TR=6;TU=A;VQSLOD=7.8972;set=Intersection;sumGLbyD=13.16 +20 41659532 . GC G 40544 PASS AA=42;AB=0.97149;ABA=39;ABP=2644.5;ABR=1329;AC=15;AF=0.0209;AN=716;BL=2531;BR=135;BVAR;BaseQRankSum=-2.537;DEL;DP=12219;Dels=0.00;EL=25;EPP=6.3192;ER=17;FS=2.656;HETAR=374;HOMA=155;HOMR=551;HRun=1;InbreedingCoeff=-0.0270;LEN=1;LRB=0.89872;LRBP=4678.9;MQ0=0;MQ0Fraction=0.0000;MQM=103.31;MQRankSum=2.828;NS=1088;RA=4736;RL=41;RPP=85.733;RR=1;RUN=1;ReadPosRankSum=-9.702;SAB=0.57143;SAF=24;SAP=4.8716;SAR=18;SRB=0.5625;SRF=2664;SRP=163.7;SRR=2072;VQSLOD=4.3267;set=Intersection;sumGLbyD=3.22 +20 41687456 . A AT 19682 PASS AA=446;AB=0.61202;ABA=426;ABP=122.69;ABR=672;AC=162;AF=0.13214;AN=1226;BL=15293;BR=20484;BVAR;BaseQRankSum=2.364;DP=29324;DP4=1993,1785,261,252;Dels=0.01;EL=214;EPP=4.5878;ER=232;FQ=999;FR;FS=1.923;HETAR=170;HOMA=7;HOMR=897;HP=11;HPLen=9;HR=9;HRun=9;HU=T;INDEL;INS;InbreedingCoeff=0.0769;LEN=1;LRB=0.14509;LRBP=1638.5;MQ=91.55;MQ0=0;MQ0Fraction=0.0000;MQM=57.168;MQRankSum=-0.764;NF;NR;NS=1074;PP;PV4=0.45,1,3.5e-08,1;RA=5437;RL=179;RPP=40.714;RR=267;RUN=1;ReadPosRankSum=0.356;SAB=0.51794;SAF=231;SAP=4.2567;SAR=215;SC=AGAAAACCTTATTTTTTTTTC;SRB=0.51094;SRF=2778;SRP=8.666;SRR=2659;TC;TR=9;TU=T;VQSLOD=9.6786;set=Intersection;sumGLbyD=10.93 +20 41845580 . GA G 49310 PASS AA=83;AB=0.95258;ABA=69;ABP=2591.6;ABR=1386;AC=46;AF=0.03740;AN=1230;BL=1320;BR=5150;BVAR;BaseQRankSum=-1.121;DEL;DP=13336;Dels=0.00;EL=36;EPP=6.1759;ER=47;FR;FS=0.372;HETAR=442;HOMA=341;HOMR=295;HP=2;HR=3;HRun=1;HU=G;InbreedingCoeff=0.0238;LEN=1;LRB=0.59196;LRBP=4926.2;MQ0=0;MQ0Fraction=0.0000;MQM=89.048;MQRankSum=0.897;NF;NR;NS=1080;PP;RA=3006;RL=5;RPP=142.43;RR=78;RUN=1;ReadPosRankSum=-15.412;SAB=0.55422;SAF=46;SAP=5.1294;SAR=37;SC=CCAGCTGTGGGAGAGAAACAT;SRB=0.47971;SRF=1442;SRP=13.762;SRR=1564;TC;TR=6;TU=AG;VQSLOD=4.4669;set=Intersection;sumGLbyD=3.65 +20 42209428 . GC G 13163 PASS AA=89;AB=0.86677;ABA=83;ABP=730.96;ABR=540;AC=39;AF=0.03218;AN=1212;BL=950;BR=5334;BVAR;BaseQRankSum=-10.119;DEL;DP=10692;Dels=0.01;EL=48;EPP=4.2058;ER=41;FS=0.000;HETAR=259;HOMA=727;HOMR=54;HRun=1;InbreedingCoeff=0.0448;LEN=1;LRB=0.69764;LRBP=6644.4;MQ0=0;MQ0Fraction=0.0000;MQM=126.55;MQRankSum=4.223;NS=1040;RA=723;RL=12;RPP=106.09;RR=77;RUN=1;ReadPosRankSum=-17.362;SAB=0.39326;SAF=35;SAP=11.818;SAR=54;SRB=0.37898;SRF=274;SRP=94.99;SRR=449;VQSLOD=3.7157;set=filterInVQSR-2of5;sumGLbyD=3.48 +20 42281109 . T TAG 2321.12 PASS AC=181;AF=0.3740;AN=484;BaseQRankSum=8.977;DP=435;FS=17.001;HRun=0;HaplotypeScore=14.6734;InbreedingCoeff=0.2340;MQ=53.88;MQ0=47;MQ0Fraction=0.1080;MQRankSum=0.762;QD=12.41;ReadPosRankSum=3.399;SB=-1299.73;VQSLOD=4.8926;set=VQSR +20 42436117 . TC T 38933 PASS AA=18;AB=0.98435;ABA=17;ABP=2215.9;ABR=1069;AC=15;AF=0.01223;AN=1226;BL=498;BR=428;BVAR;BaseQRankSum=-7.224;DEL;DP=12436;Dels=0.00;EL=1;EPP=33.893;ER=17;FS=2.469;HETAR=303;HOMA=614;HOMR=123;HRun=1;InbreedingCoeff=0.0439;LEN=1;LRB=0.075594;LRBP=14.501;MQ0=0;MQ0Fraction=0.0000;MQM=98.611;MQRankSum=1.086;NS=1075;RA=1656;RL=10;RPP=3.4928;RR=8;RUN=1;ReadPosRankSum=-17.765;SAB=0.5;SAF=9;SAP=3.0103;SAR=9;SRB=0.49879;SRF=826;SRP=3.0313;SRR=830;VQSLOD=4.0821;set=filterInVQSR-2of5;sumGLbyD=3.04 +20 42682214 . C A,CAT 3904.51 PASS AA=24;AB=0.6383;ABA=17;ABP=10.818;ABR=30;AC=0;AF=0.0000;AN=636;BL=1119;BR=949;BVAR;BaseQRankSum=1.426;DP=6509;Dels=0.00;EL=9;EPP=6.2675;ER=15;FR;HETAR=12;HOMA=3;HOMR=876;HP=2;HPLen=1;HR=1;HRun=0;HU=A;INS;InbreedingCoeff=0.0006;LEN=2;LRB=0.082205;LRBP=33.356;MQ0Fraction=0.0046;MQM=40.792;MQRankSum=-0.296;NF;NR;NS=891;PP;QD=32.81;RA=2679;RL=15;RPP=6.2675;RR=9;RUN=1;ReadPosRankSum=-1.806;SAB=0.75;SAF=18;SAP=16.039;SAR=6;SB=-924.23;SC=TATACACACACATATATATAC;SRB=0.66293;SRF=1776;SRP=620.76;SRR=903;TC;TR=9;TU=AC;set=filterInVQSR-2of5;sumGLbyD=32.75 +20 42973456 . CA C,CAA,CAAA 2675 PASS AA=90;AB=0.79177;ABA=86;ABP=308.39;ABR=327;AC=77,61,39;AF=0.06492,0.05143,0.03288;AN=1186;BL=2983;BR=4446;BVAR;BaseQRankSum=2.422;DP=9416;Dels=0.03;EL=39;EPP=6.4847;ER=51;FR;FS=31.555;HETAR=75;HOMA=1;HOMR=888;HP=11;HR=11;HRun=11;HU=A;INS;InbreedingCoeff=0.2696;LEN=1;LRB=0.19693;LRBP=628.63;MQ0=0;MQ0Fraction=0.0000;MQM=55.567;MQRankSum=1.777;NF;NR;NS=964;PP;RA=3601;RL=37;RPP=9.1869;RR=53;RUN=1;ReadPosRankSum=-4.991;SAB=0.55556;SAF=50;SAP=5.423;SAR=40;SC=TAGTGACTGTCAAAAAAAAAA;SRB=0.60622;SRF=2183;SRP=355.91;SRR=1418;TC;TR=11;TU=A;VQSLOD=1.0763;set=filterInVQSR-2of5;sumGLbyD=4.05 +20 43091870 . TC T 2455.60 PASS AA=120;AB=0.10619;ABA=101;ABP=155.22;ABR=12;AC=42;AF=0.03825;AN=1098;BL=573;BR=8744;BVAR;BaseQRankSum=-13.513;DEL;DP=9139;Dels=0.00;EL=64;EPP=4.1684;ER=56;FS=9.856;HETAR=118;HOMA=820;HOMR=0;HRun=1;InbreedingCoeff=0.0833;LEN=1;LRB=0.877;LRBP=15564;MQ0Fraction=0.0017;MQM=45.1;MQRankSum=2.266;NS=938;RA=24;RL=1;RPP=254.97;RR=119;RUN=1;ReadPosRankSum=-15.803;SAB=0.475;SAF=57;SAP=3.6617;SAR=63;SRB=0.54167;SRF=13;SRP=3.3722;SRR=11;VQSLOD=3.9930;set=filterInVQSR-2of5;sumGLbyD=3.09 +20 43233648 rs74585029 GA G,GAA 1504.40 PASS AA=113;AB=0.78652;ABA=95;ABP=320.31;ABR=350;AC=41,65;AF=0.03394,0.05381;AF1=0.0115;AN=1208;BL=4677;BR=5548;BVAR;BaseQRankSum=6.744;CI95=0.004274,0.01852;DB;DEL;DP=13996;DP4=1736,1549,15,17;Dels=0.03;EL=69;EPP=15.021;ER=44;FQ=14;FR;FS=12.174;HETAR=119;HOMA=15;HOMR=892;HP=11;HPLen=10;HR=10;HRun=10;HU=A;INDEL;InbreedingCoeff=0.2359;LEN=1;LRB=0.085183;LRBP=164.12;MQ=89.12;MQ0Fraction=0.0000;MQM=69.867;MQRankSum=2.513;NF;NR;NS=1027;PP;PV4=0.59,1,0.065,0.33;RA=3845;RL=46;RPP=11.485;RR=67;RUN=1;ReadPosRankSum=-4.957;SAB=0.33628;SAF=38;SAP=29.318;SAR=75;SC=AAAACAGCCAGAAAAAAAAAA;SRB=0.43667;SRF=1679;SRP=136.95;SRR=2166;TC;TR=10;TU=A;VQSLOD=4.5121;set=Intersection;sumGLbyD=8.22 +20 43246548 . AC A,CC 41579.13 PASS AA=382;AB=0.72402;ABA=316;ABP=502.11;ABR=829;AC=1197;AF=0.99254;AN=1206;BL=9889;BR=14293;BVAR;BaseQRankSum=1.373;DEL;DP=10477;DS;Dels=0.05;EL=243;EPP=64.494;ER=139;FS=29.162;HETAR=291;HOMA=85;HOMR=624;HPLen=10;InbreedingCoeff=0.1392;LEN=1;LRB=0.18212;LRBP=1744.6;MQ0Fraction=0.0024;MQM=48.471;MQRankSum=5.726;NS=1001;RA=3138;RL=174;RPP=9.5816;RR=208;RUN=1;ReadPosRankSum=5.755;SAB=0.79843;SAF=305;SAP=298.51;SAR=77;SRB=0.70363;SRF=2208;SRP=1133.2;SRR=930;VQSLOD=5.6318;set=Intersection;sumGLbyD=5.22 +20 43258646 . T TT 1107.17 PASS AC=97;AF=0.08420;AN=1152;BaseQRankSum=4.525;DP=2345;FS=19.308;HRun=9;HaplotypeScore=13.6276;InbreedingCoeff=0.1299;MQ=76.70;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.395;QD=2.67;ReadPosRankSum=-4.696;SB=-899.41;VQSLOD=5.4523;set=VQSR +20 43718299 . ATTACT A 5497.06 PASS AA=56;AB=0.51818;ABA=53;ABP=3.3262;ABR=57;AC=18;AF=0.0251;AF1=0.03729;AN=718;BL=2321;BR=2591;BVAR;BaseQRankSum=11.142;CI95=0.03319,0.04425;DEL;DP=17576;DP4=2460,2692,31,22;Dels=0.02;EL=28;EPP=3.0103;ER=28;FQ=999;FR;FS=9.689;HETAR=15;HOMA=1;HOMR=1068;HP=2;HPLen=2;HR=2;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0448;LEN=5;LRB=0.054967;LRBP=35.238;MQ=96.55;MQ0=0;MQ0Fraction=0.0000;MQM=50.286;MQRankSum=-5.149;NF;NR;NS=1084;PP;PV4=0.13,1,1.2e-12,1;RA=6745;RL=28;RPP=3.0103;RR=28;RUN=1;ReadPosRankSum=0.828;SAB=0.5;SAF=28;SAP=3.0103;SAR=28;SC=ATGACAGTGGATTACTTTAGT;SRB=0.46835;SRF=3159;SRP=61.709;SRR=3586;TC;TR=2;TU=T;VQSLOD=7.8832;set=Intersection;sumGLbyD=46.60 +20 43981749 . A AAAAAAC,AC 20899.71 PASS ABR=192;AC=91,0;AF=0.1285,0.0000;AN=708;BVAR;BaseQRankSum=7.858;DP=23372;DP4=1554,1457,55,42;Dels=0.00;FR;FS=0.000;HOMA=4;HOMR=995;HP=6;HPLen=7;HR=7;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.2109;MQ=95.59;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-12.081;NF;NR;NS=1051;PP;PV4=0.35,1,8.9e-73,1;RA=5027;RUN=1;ReadPosRankSum=-1.359;SC=TACACTAGCAAAAAAACAAAA;SRB=0.48518;SRF=2439;SRP=12.6;SRR=2588;TC;TR=7;TU=A;VQSLOD=8.0916;set=Intersection;sumGLbyD=54.33 +20 43999274 . TCAAA T 2948.85 PASS AA=59;AB=0.59441;ABA=58;ABP=14.08;ABR=85;AC=20;AF=0.0290;AF1=0.04249;AN=690;BL=2277;BR=2436;BVAR;BaseQRankSum=9.320;CI95=0.0354,0.05088;DEL;DP=14599;DP4=2052,2303,21,22;Dels=0.03;EL=32;EPP=3.9304;ER=27;FQ=999;FR;FS=0.000;HETAR=21;HOMA=0;HOMR=1043;HP=2;HPLen=1;HR=1;HRun=0;HU=C;INDEL;InbreedingCoeff=-0.0037;LEN=4;LRB=0.033736;LRBP=14.658;MQ=90.05;MQ0=0;MQ0Fraction=0.0000;MQM=75.339;MQRankSum=-1.294;NF;NR;NS=1064;PP;PV4=0.88,1,0.0026,1;RA=5732;RL=27;RPP=3.9304;RR=32;RUN=1;ReadPosRankSum=-0.915;SAB=0.47458;SAF=28;SAP=3.3415;SAR=31;SC=GGTACACAGCTCAAACAGTCT;SRB=0.4836;SRF=2772;SRP=16.4;SRR=2960;TC;TR=1;TU=C;VQSLOD=9.8086;set=Intersection;sumGLbyD=27.09 +20 44098622 . C CG 1092.40 PASS AA=129;AB=0.77301;ABA=74;ABP=214.06;ABR=252;AC=45;AF=0.0455;AN=988;BL=6586;BR=3029;BVAR;BaseQRankSum=2.802;DP=5177;Dels=0.00;EL=122;EPP=225.63;ER=7;FR;FS=355.273;HETAR=66;HOMA=11;HOMR=734;HP=6;HR=4;HRun=4;HU=G;INS;InbreedingCoeff=0.1759;LEN=1;LRB=0.36994;LRBP=2860.4;MQ0=0;MQ0Fraction=0.0000;MQM=52.395;MQRankSum=1.946;NF;NR;NS=811;PP;RA=1981;RL=121;RPP=217.95;RR=8;RUN=1;ReadPosRankSum=-6.413;SAB=0.99225;SAF=128;SAP=274.51;SAR=1;SC=GCGGAAGTGGCGGGGACCCTT;SRB=0.41242;SRF=817;SRP=135;SRR=1164;TC;TR=4;TU=G;VQSLOD=-2.2690;set=filterInVQSR-2of5;sumGLbyD=4.04 +20 44327637 . A AG,AGGGGGG 14351.23 PASS AC=9,211;AF=0.0103,0.2409;AN=876;BaseQRankSum=15.517;DP=1704;FS=6.768;HaplotypeScore=31.5906;InbreedingCoeff=0.1538;MQ=54.64;MQ0=4;MQ0Fraction=0.0023;MQRankSum=-12.691;QD=20.83;ReadPosRankSum=-3.583;SB=-6278.99;VQSLOD=5.1556;set=VQSR +20 45202636 . GA G 13269 PASS AA=25;AB=0.96162;ABA=18;ABP=871.09;ABR=451;AC=24;AF=0.02013;AN=1192;BL=567;BR=1728;BVAR;BaseQRankSum=-5.361;DEL;DP=10873;Dels=0.00;EL=10;EPP=5.1818;ER=15;FS=0.928;HETAR=169;HOMA=831;HOMR=45;HRun=1;InbreedingCoeff=0.0999;LEN=1;LRB=0.50588;LRBP=1278.4;MQ0=0;MQ0Fraction=0.0000;MQM=170.56;MQRankSum=0.161;NS=1049;RA=632;RL=2;RPP=41.315;RR=23;RUN=1;ReadPosRankSum=-14.760;SAB=0.68;SAF=17;SAP=10.046;SAR=8;SRB=0.51424;SRF=325;SRP=4.1235;SRR=307;VQSLOD=3.9290;set=filterInVQSR-2of5;sumGLbyD=3.90 +20 45417828 . TGAGC T,TGC 4672.90 PASS ABR=317;AC=69,104;AF=0.05712,0.08609;BVAR;BaseQRankSum=18.527;DEL;DP=11835;DS;FS=184.873;HOMA=48;HOMR=575;HaplotypeScore=65.5875;InbreedingCoeff=0.0599;MQ=29.78;MQ0=2988;MQ0Fraction=0.3629;MQRankSum=5.052;NS=713;QD=1.11;RA=1581;RUN=1;ReadPosRankSum=6.574;SB=-2116.87;SRB=0.47502;SRF=751;SRP=11.582;SRR=830;VQSLOD=0.0651;set=filterInVQSR-2of5 +20 45525657 rs66759083 TA AA,T 49315 PASS AA=2361;AB=0.45241;ABA=1398;ABP=53.235;ABR=1155;AC=20;AF=0.01701;AN=1176;BL=94913;BR=100886;BVAR;BaseQRankSum=0.740;DB;DEL;DP=30636;DP4=1258,881,1206,999;Dels=0.48;EL=1133;EPP=11.311;ER=1228;FQ=999;FR;FS=7.072;HETAR=503;HOMA=310;HOMR=218;HP=6;HPLen=7;HR=7;HU=T;INDEL;InbreedingCoeff=0.2271;LEN=1;LRB=0.030506;LRBP=398.68;MQ=102.24;MQ0=0;MQ0Fraction=0.0000;MQM=75.359;MQRankSum=0.148;NF;NR;NS=1031;PP;PV4=0.0064,0,4.6e-23,0.47;RA=2042;RL=1183;RPP=3.0333;RR=1178;RUN=1;ReadPosRankSum=-2.999;SAB=0.52139;SAF=1231;SAP=12.392;SAR=1130;SC=AGGATTTTTTTAAAAAGTTTT;SRB=0.55093;SRF=1125;SRP=49.017;SRR=917;TC;TR=7;TU=T;VQSLOD=7.1651;dbSNP=114;set=Intersection;sumGLbyD=18.51 +20 45783456 . T TG 2355.68 PASS AA=64;AB=0.78521;ABA=61;ABP=203.67;ABR=223;AC=15;AF=0.0165;AN=910;BL=815;BR=5486;BVAR;BaseQRankSum=8.593;DP=10348;Dels=0.00;EL=48;EPP=37.754;ER=16;FS=77.861;HETAR=56;HOMA=1;HOMR=970;HRun=1;INS;InbreedingCoeff=-0.0549;LEN=1;LRB=0.74131;LRBP=7522.1;MQ0Fraction=0.0122;MQM=44.562;MQRankSum=-1.258;NS=1027;RA=4750;RL=0;RPP=141.98;RR=64;RUN=1;ReadPosRankSum=-7.047;SAB=0.25;SAF=16;SAP=37.754;SAR=48;SRB=0.6;SRF=2850;SRP=415.59;SRR=1900;VQSLOD=1.3146;set=filterInVQSR-2of5;sumGLbyD=6.03 +20 46384744 . CT C 17791 PASS AA=51;AB=0.94826;ABA=49;ABP=1655.8;ABR=898;AC=23;AF=0.01867;AN=1232;BL=120;BR=3678;BVAR;BaseQRankSum=-0.185;DEL;DP=13879;Dels=0.00;EL=23;EPP=4.0747;ER=28;FS=2.864;HETAR=262;HOMA=78;HOMR=722;HRun=2;InbreedingCoeff=0.0193;LEN=1;LRB=0.93681;LRBP=7240.9;MQ0=0;MQ0Fraction=0.0000;MQM=66.667;MQRankSum=1.031;NS=1079;RA=5295;RL=0;RPP=113.76;RR=51;RUN=1;ReadPosRankSum=-12.934;SAB=0.54902;SAF=28;SAP=4.0747;SAR=23;SRB=0.54674;SRF=2895;SRP=103.49;SRR=2400;VQSLOD=3.0419;set=filterInVQSR-2of5;sumGLbyD=3.47 +20 46517110 . C CT 868.55 PASS AC=15;AF=0.0218;AN=688;BaseQRankSum=8.522;DP=1752;FS=6.570;HRun=0;HaplotypeScore=14.9548;InbreedingCoeff=0.0452;MQ=77.73;MQ0=0;MQ0Fraction=0.0000;MQRankSum=3.874;QD=10.98;ReadPosRankSum=-0.733;SB=-396.78;VQSLOD=6.7740;set=VQSR +20 46629361 . TTTCTTTC T,TTTTC 13000.91 PASS AC=188,107;AF=0.2212,0.1259;AN=850;BaseQRankSum=7.214;DP=1846;FS=14.502;HaplotypeScore=40.8481;InbreedingCoeff=0.3210;MQ=50.74;MQ0=79;MQ0Fraction=0.0428;MQRankSum=-6.348;QD=13.59;ReadPosRankSum=3.943;SB=-3581.20;VQSLOD=5.9412;set=VQSR +20 46951099 . G GT 1662.30 PASS AA=55;AB=0.7713;ABA=51;ABP=145.58;ABR=172;AC=47;AF=0.03923;AN=1198;BL=3288;BR=2434;BVAR;BaseQRankSum=-4.014;DP=27423;DP4=1483,1590,58,42;Dels=0.01;EL=21;EPP=9.6826;ER=34;FR;FS=9.565;HETAR=48;HOMA=0;HOMR=913;HP=16;HPLen=10;HR=10;HRun=10;HU=T;INDEL;INS;InbreedingCoeff=0.0952;LEN=1;LRB=0.14925;LRBP=279.78;MQ=70.36;MQ0Fraction=0.0124;MQM=52.545;MQRankSum=0.717;NF;NR;NS=961;PP;PV4=0.067,1,1,0.17;RA=3035;RL=38;RPP=20.422;RR=17;RUN=1;ReadPosRankSum=-3.014;SAB=0.47273;SAF=26;SAP=3.3656;SAR=29;SC=TTTGTTTTTTGTTTTTTTTTT;SRB=0.36013;SRF=1093;SRP=518.73;SRR=1942;TC;TR=10;TU=T;VQSLOD=5.4779;set=Intersection;sumGLbyD=3.49 +20 47201076 rs58052846 C CT 982.16 PASS AC=50;AF=0.0551;AN=908;BaseQRankSum=12.598;DB;DP=2449;FS=35.648;HRun=0;HaplotypeScore=29.4602;InbreedingCoeff=-0.0542;MQ=63.54;MQ0=0;MQ0Fraction=0.0000;MQRankSum=2.196;QD=3.16;ReadPosRankSum=-13.833;SB=-488.19;VQSLOD=6.0429;set=VQSR +20 47965974 rs60011158 G GA 999 PASS AA=21;AB=0.57143;ABA=21;ABP=5.1818;ABR=28;AC=7;AF=0.0101;AF1=0.02061;AN=690;BL=1043;BR=577;BVAR;BaseQRankSum=-3.087;CI95=0.01549,0.02655;DB;DP=14578;DP4=1554,3055,6,17;Dels=0.00;EL=11;EPP=3.1137;ER=10;FQ=999;FR;FS=5.982;HETAR=7;HOMA=0;HOMR=1041;HP=2;HPLen=1;HR=1;HRun=1;HU=A;INDEL;INS;InbreedingCoeff=0.0356;LEN=1;LRB=0.28765;LRBP=294.09;MQ=80.17;MQ0=0;MQ0Fraction=0.0000;MQM=64.19;MQRankSum=2.137;NF;NR;NS=1048;PP;PV4=0.51,1,1,1;RA=5224;RL=16;RPP=15.522;RR=5;RUN=1;ReadPosRankSum=0.236;SAB=0.38095;SAF=8;SAP=5.5954;SAR=13;SC=TTCATGTACAGAGCTGCTGTG;SRB=0.31183;SRF=1629;SRP=1609.6;SRR=3595;TC;TR=4;TU=AG;VQSLOD=9.5466;dbSNP=129;set=Intersection;sumGLbyD=13.83 +20 48402974 rs57331436 GA G 27741 PASS AA=401;AB=0.5372;ABA=311;ABP=11.089;ABR=361;AC=84;AF=0.1186;AN=708;BL=16591;BR=14776;BVAR;BaseQRankSum=14.621;DB;DEL;DP=30607;DP4=1928,2310,195,225;Dels=0.11;EL=189;EPP=5.8749;ER=212;FQ=999;FR;FS=15.568;HETAR=110;HOMA=30;HOMR=923;HP=4;HPLen=3;HR=1;HRun=3;HU=A;INDEL;InbreedingCoeff=0.1263;KGPilot123;LEN=1;LRB=0.057863;LRBP=231.06;MQ=106.68;MQ0=0;MQ0Fraction=0.0000;MQM=63.005;MQRankSum=-2.010;NF;NR;NS=1063;PP;PV4=0.72,1,0.001,1;RA=5258;RL=223;RPP=13.976;RR=178;RUN=1;ReadPosRankSum=1.337;SAB=0.37656;SAF=151;SAP=56.084;SAR=250;SC=TGCCCTCAAAGAGAAAAAGGA;SRB=0.38075;SRF=2002;SRP=652.44;SRR=3256;TC;TR=5;TU=AG;VQSLOD=8.7259;dbSNP=132;set=Intersection;sumGLbyD=15.86 +20 48519434 rs56747320 TA T,TAA 26754 PASS AC=91,355;AF=0.07738,0.30187;AN=1176;BVAR;BaseQRankSum=-5.499;DB;DEL;DP=24872;DP4=726,883,443,502;Dels=0.04;FR;FS=1.430;HP=12;HR=12;HRun=12;HU=A;INDEL;INS;InbreedingCoeff=0.2576;LEN=1;MQ=71.86;MQ0=1;MQ0Fraction=0.0004;MQRankSum=-0.526;NF;NR;PP;PV4=0.41,1,0.00077,1;RUN=1;ReadPosRankSum=-4.130;SC=CGTCTTAAACTAAAAAAAAAA;TC;TR=12;TU=A;VQSLOD=7.3200;set=Intersection;sumGLbyD=10.43 +20 49086519 rs111404890 CA C,CAA 1379.10 PASS AA=43;AB=0.672;ABA=41;ABP=35.131;ABR=84;AC=7,14;AF=0.0100,0.0201;AN=698;BL=1097;BR=2286;BVAR;BaseQRankSum=-2.656;DB;DP=9319;Dels=0.00;EL=22;EPP=3.0608;ER=21;FR;FS=1.147;HETAR=20;HOMA=0;HOMR=1029;HP=11;HPLen=8;HR=8;HRun=8;HU=A;INS;InbreedingCoeff=0.0760;LEN=1;LRB=0.35146;LRBP=910.45;MQ0=0;MQ0Fraction=0.0000;MQM=47.674;MQRankSum=2.682;NF;NR;NS=1049;PP;RA=5237;RL=10;RPP=29.724;RR=33;RUN=1;ReadPosRankSum=-2.367;SAB=0.48837;SAF=21;SAP=3.0608;SAR=22;SC=GTAAAACAAACAAAAAAAATG;SRB=0.48635;SRF=2547;SRP=11.489;SRR=2690;TC;TR=11;TU=AAAC;VQSLOD=7.3084;set=Intersection;sumGLbyD=9.84 +20 49101936 . C CT 404.46 PASS AC=40;AF=0.03559;AN=1124;BaseQRankSum=0.750;DP=2162;FS=14.291;HRun=2;HaplotypeScore=30.9513;InbreedingCoeff=-0.0082;MQ=49.78;MQ0=113;MQ0Fraction=0.0523;MQRankSum=-1.289;QD=1.94;ReadPosRankSum=-2.041;SB=-385.48;VQSLOD=4.6365;set=VQSR +20 49681276 . TC T 40042 PASS AA=72;AB=0.93908;ABA=70;ABP=1927.1;ABR=1079;AC=18;AF=0.0196;AN=918;BL=514;BR=4340;BVAR;BaseQRankSum=0.869;DEL;DP=10368;Dels=0.00;EL=33;EPP=4.096;ER=39;FS=17.302;HETAR=389;HOMA=269;HOMR=405;HRun=1;InbreedingCoeff=0.0626;LEN=1;LRB=0.78822;LRBP=6551.6;MQ0=0;MQ0Fraction=0.0000;MQM=123.06;MQRankSum=-1.047;NS=1064;RA=3095;RL=3;RPP=134.38;RR=69;RUN=1;ReadPosRankSum=-10.928;SAB=0.58333;SAF=42;SAP=7.3532;SAR=30;SRB=0.57738;SRF=1787;SRP=163.99;SRR=1308;VQSLOD=2.8517;set=filterInVQSR-2of5;sumGLbyD=3.69 +20 49690436 . GT G 473.74 PASS AF=0.0263;AF1=0.02287;BaseQRankSum=3.830;CI95=0.01327,0.03319;DP=7473;DP4=2241,1740,14,12;Dels=0.01;FQ=129;FR;FS=0.000;HP=4;HPLen=4;HR=4;HRun=4;HU=T;INDEL;InbreedingCoeff=0.1310;MQ=51.71;MQ0Fraction=0.0407;MQRankSum=1.792;NF;NR;PP;PV4=0.84,5.7e-10,0.22,1;ReadPosRankSum=0.973;SC=GTAGGACGGGGTTTTACCATG;TC;TR=4;TU=T;VQSLOD=7.4809;set=Intersection;sumGLbyD=10.96 +20 49731218 . ATTTTATTTTTTATT A,ATTTTATT 8398.93 PASS AF=0.0656,0.0156;AF1=0.0996;BaseQRankSum=13.996;CI95=0.07743,0.1239;DP=6308;DP4=951,1311,23,35;Dels=0.05;FQ=999;FR;FS=12.503;HP=7;HPLen=4;HR=4;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1892;MQ=57.61;MQ0Fraction=0.0145;MQRankSum=-5.208;NF;NR;PP;PV4=0.79,1,6.3e-06,0.16;ReadPosRankSum=-2.239;SC=TATTTTATTTATTTTATTTTT;TC;TR=11;TU=ATTT;VQSLOD=4.3191;set=Intersection;sumGLbyD=42.27 +20 49894989 . TA T 172.25 PASS AF=0.0140;BaseQRankSum=7.220;DP=3882;Dels=0.00;FS=17.217;HPLen=2;HRun=1;InbreedingCoeff=0.0531;MQ0Fraction=0.0214;MQRankSum=-0.661;ReadPosRankSum=-0.592;VQSLOD=3.0905;set=filterInVQSR-2of5;sumGLbyD=6.60 +20 50010923 rs66516522 C CT,CTGG 35851 PASS ABR=555;AC=310,11;AF=0.26451,0.00939;BVAR;BaseQRankSum=10.662;DB;DP=8188;FR;FS=34.411;HOMA=261;HOMR=399;HP=5;HR=6;HU=C;HaplotypeScore=45.1715;INS;InbreedingCoeff=0.2090;MQ=72.80;MQ0=0;MQ0Fraction=0.0000;MQRankSum=9.015;NF;NR;NS=831;PP;QD=9.69;RA=1986;RUN=1;ReadPosRankSum=-24.284;SB=-6038.55;SC=TGTCTGTCCCCCCTCAGCACT;SRB=0.45972;SRF=913;SRP=31.001;SRR=1073;TC;TR=6;TU=C;VQSLOD=6.1824;set=Intersection +20 50059710 . C CCA 4175.86 PASS AA=28;AB=0.62963;ABA=20;ABP=10.892;ABR=34;AC=36;AF=0.0738;AN=488;BL=1050;BR=1273;BVAR;BaseQRankSum=3.198;DP=9138;Dels=0.00;EL=10;EPP=7.9737;ER=18;FR;FS=19.190;HETAR=10;HOMA=2;HOMR=1053;HP=6;HPLen=7;HR=7;HRun=0;HU=C;INS;InbreedingCoeff=0.1390;LEN=2;LRB=0.095997;LRBP=49.496;MQ0=0;MQ0Fraction=0.0000;MQM=57.464;MQRankSum=-1.875;NF;NR;NS=1065;PP;RA=5745;RL=12;RPP=4.2511;RR=16;RUN=1;ReadPosRankSum=-2.894;SAB=0.5;SAF=14;SAP=3.0103;SAR=14;SC=GGAGACCCCCCCTTCATCCTA;SRB=0.48129;SRF=2765;SRP=20.482;SRR=2980;TC;TR=7;TU=C;VQSLOD=5.1567;set=Intersection;sumGLbyD=11.49 +20 50228709 rs71192536 TG T 20517 PASS AA=924;AB=0.50203;ABA=735;ABP=3.0633;ABR=741;AC=200;AF=0.16502;AN=1212;BL=35460;BR=34197;BVAR;BaseQRankSum=13.810;DB;DEL;DP=32402;DP4=1760,2065,395,449;Dels=0.16;EL=439;EPP=7.9831;ER=485;FQ=999;FR;FS=0.558;HETAR=242;HOMA=63;HOMR=764;HP=5;HPLen=3;HR=3;HRun=3;HU=G;INDEL;InbreedingCoeff=0.1050;LEN=1;LRB=0.018132;LRBP=52.738;MQ=105.83;MQ0=0;MQ0Fraction=0.0000;MQM=75.87;MQRankSum=3.895;NF;NR;NS=1069;PP;PV4=0.7,1.5e-173,1,1;RA=4708;RL=486;RPP=8.4249;RR=438;RUN=1;ReadPosRankSum=1.586;SAB=0.43615;SAF=403;SAP=35.733;SAR=521;SC=GTTTTCCAGGTGGGAAGACCG;SRB=0.44074;SRF=2075;SRP=146.62;SRR=2633;TC;TR=3;TU=G;VQSLOD=10.4820;dbSNP=120;set=Intersection;sumGLbyD=15.35 +20 50236115 . AGG A,ACGGG,AG,AGGG 7429.57 PASS AC=192,13,221,183;AF=0.2115,0.0143,0.2434,0.2015;AN=908;BaseQRankSum=1.045;DP=1177;FS=13.479;HaplotypeScore=11.8294;InbreedingCoeff=0.7959;MQ=52.98;MQ0=6;MQ0Fraction=0.0051;MQRankSum=-1.482;QD=7.28;ReadPosRankSum=-2.380;SB=-1229.31;VQSLOD=8.3762;set=VQSR +20 51589568 . TAAAC AAAAC,T 12477.52 PASS AF=0.27949;BaseQRankSum=-28.122;DP=3777;Dels=0.00;FR;FS=31.799;HP=7;HPLen=4;HR=3;HRun=0;HU=A;InbreedingCoeff=-0.1429;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.196;NF;NR;PP;ReadPosRankSum=-16.483;SC=AAATTCAAAATAAACAAACAA;TC;TR=18;TU=AAAC;VQSLOD=3.9201;set=filterInVQSR-2of5;sumGLbyD=52.43 +20 51617742 . TGC T,TGCGC 1374.91 PASS AF=0.06000,0.02000;BaseQRankSum=12.051;DP=6231;Dels=0.00;FS=189.609;HPLen=1;HRun=0;InbreedingCoeff=0.0862;MQ0Fraction=0.0180;MQRankSum=-2.959;ReadPosRankSum=-5.090;VQSLOD=-2.8715;set=filterInVQSR-2of5;sumGLbyD=3.97 +20 51770354 . AG A 1010.90 PASS AA=26;AB=0.52727;ABA=26;ABP=3.3656;ABR=29;AC=7;AF=0.0097;AF1=0.01637;AN=718;BL=1034;BR=964;BVAR;BaseQRankSum=5.588;CI95=0.01327,0.02212;DEL;DP=16259;DP4=2785,2239,15,10;Dels=0.01;EL=11;EPP=4.3466;ER=15;FQ=999;FR;FS=3.367;HETAR=8;HOMA=0;HOMR=1064;HP=2;HPLen=2;HR=2;HRun=2;HU=G;INDEL;InbreedingCoeff=0.0557;LEN=1;LRB=0.035035;LRBP=8.3357;MQ=90.48;MQ0=0;MQ0Fraction=0.0000;MQM=61.346;MQRankSum=-0.019;NF;NR;NS=1072;PP;PV4=0.69,2.1e-08,0.078,1;RA=6173;RL=13;RPP=3.0103;RR=13;RUN=1;ReadPosRankSum=-0.460;SAB=0.61538;SAF=16;SAP=6.017;SAR=10;SC=GTGGTCCTGCAGGTCAATAAT;SRB=0.56342;SRF=3478;SRP=218.68;SRR=2695;TC;TR=2;TU=G;VQSLOD=10.1601;set=Intersection;sumGLbyD=14.60 +20 51848430 . AT A,ATT 999 PASS AA=39;AB=0.83408;ABA=37;ABP=219.19;ABR=186;AC=14,33;AF=0.0153,0.0359;AF1=0.03062;AN=918;BL=1676;BR=1732;BVAR;BaseQRankSum=3.338;CI95=0.02212,0.03982;DP=14886;DP4=1970,1762,22,31;Dels=0.01;EL=18;EPP=3.5114;ER=21;FQ=999;FR;FS=3.004;HETAR=31;HOMA=0;HOMR=1040;HP=10;HPLen=9;HR=9;HRun=9;HU=T;INDEL;INS;InbreedingCoeff=0.1629;LEN=1;LRB=0.016432;LRBP=5.0085;MQ=80.05;MQ0=0;MQ0Fraction=0.0000;MQM=56.667;MQRankSum=0.325;NF;NR;NS=1071;PP;PV4=0.13,1,0.0095,0.064;RA=5318;RL=21;RPP=3.5114;RR=18;RUN=1;ReadPosRankSum=-0.493;SAB=0.46154;SAF=18;SAP=3.5114;SAR=21;SC=ACAAAACAATATTTTTTTTTC;SRB=0.4968;SRF=2642;SRP=3.4823;SRR=2676;TC;TR=9;TU=T;VQSLOD=5.7417;set=Intersection;sumGLbyD=7.57 +20 51897203 . T TG 8427.20 PASS AA=237;AB=0.69846;ABA=215;ABP=246.92;ABR=498;AC=117;AF=0.1662;AN=704;BL=14961;BR=5990;BVAR;BaseQRankSum=22.203;DP=9710;Dels=0.00;EL=83;EPP=49.198;ER=154;FR;FS=9.450;HETAR=123;HOMA=9;HOMR=895;HP=5;HPLen=6;HR=6;HRun=0;HU=T;INS;InbreedingCoeff=-0.0513;LEN=1;LRB=0.42819;LRBP=8344.3;MQ0Fraction=0.0291;MQM=45.861;MQRankSum=-10.426;NF;NR;NS=1027;PP;RA=4919;RL=210;RPP=309.85;RR=27;RUN=1;ReadPosRankSum=-1.843;SAB=0.29536;SAF=70;SAP=89.219;SAR=167;SC=TTTGTTTGTTTTTTGTTGTTG;SRB=0.47794;SRF=2351;SRP=23.798;SRR=2568;TC;TR=23;TU=GTTT;VQSLOD=6.2670;set=Intersection;sumGLbyD=8.99 +20 52274070 . AAG A 1400.37 PASS AA=30;AB=0.74227;ABA=25;ABP=52.462;ABR=72;AC=21;AF=0.01756;AN=1196;BL=412;BR=1966;BVAR;BaseQRankSum=6.660;DEL;DP=9362;Dels=0.01;EL=16;EPP=3.2998;ER=14;FS=1.485;HETAR=18;HOMA=2;HOMR=1004;HRun=0;InbreedingCoeff=0.0317;LEN=2;LRB=0.65349;LRBP=2208.2;MQ0Fraction=0.0022;MQM=46.133;MQRankSum=-4.743;NS=1024;RA=3931;RL=2;RPP=51.941;RR=28;RUN=1;ReadPosRankSum=-4.152;SAB=0.4;SAF=12;SAP=5.6161;SAR=18;SRB=0.49784;SRF=1957;SRP=3.1699;SRR=1974;VQSLOD=5.6452;set=Intersection;sumGLbyD=11.11 +20 52351501 . TAC T 199.59 PASS AC=22;AF=0.0238;AN=926;BaseQRankSum=7.874;DP=22911;DP4=2146,1691,26,22;FR;FS=2.898;HP=4;HPLen=3;HR=1;HRun=0;HU=A;HaplotypeScore=18.6111;INDEL;InbreedingCoeff=-0.0326;MQ0=2;MQ0Fraction=0.0007;MQRankSum=1.011;NF;NR;PP;PV4=0.88,0.14,0.16,0.24;QD=1.10;ReadPosRankSum=-1.053;SB=-306.09;SC=GACACACAAATACACACACAC;TC;TR=13;TU=AC;VQSLOD=4.0486;set=filterInVQSR-2of5 +20 52447173 . CA C 503.89 PASS AC=23;AF=0.01891;AN=1216;BaseQRankSum=0.801;DP=3266;FS=2.606;HRun=2;HaplotypeScore=22.1543;InbreedingCoeff=-0.0097;MQ=118.02;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.309;QD=2.65;ReadPosRankSum=-7.872;SB=-279.27;VQSLOD=4.1900;set=VQSR +20 52498650 . GT G 24069 PASS AA=74;AB=0.90594;ABA=57;ABP=870.4;ABR=549;AC=28;AF=0.02333;AN=1200;BL=505;BR=4514;BVAR;BaseQRankSum=-3.837;DEL;DP=9798;Dels=0.01;EL=41;EPP=4.8883;ER=33;FS=4.085;HETAR=209;HOMA=663;HOMR=121;HRun=1;InbreedingCoeff=0.0334;LEN=1;LRB=0.79876;LRBP=6956.6;MQ0=2;MQ0Fraction=0.0007;MQM=57.784;MQRankSum=-2.951;NS=995;RA=957;RL=8;RPP=101.72;RR=66;RUN=1;ReadPosRankSum=-14.806;SAB=0.39189;SAF=29;SAP=10.522;SAR=45;SRB=0.39916;SRF=382;SRP=87.53;SRR=575;VQSLOD=3.8710;set=filterInVQSR-2of5;sumGLbyD=2.90 +20 52823602 rs11469056 CAAA C,CA,CAA,CAAAA,CAAAAA,CAAAAAA,CAAAAAAA,CAAAAAAAA,CAAAAAAAAA,CAAAAAAAAAA 14515.17 PASS AC=24,83,246,109,83,19,10,16,22,59;AF=0.02128,0.07358,0.21809,0.09663,0.07358,0.01684,0.00887,0.01418,0.01950,0.05230;AN=1128;BVAR;BaseQRankSum=4.150;DB;DEL;DP=28279;FR;FS=2.021;HP=17;HR=17;HU=A;HaplotypeScore=27.8032;INS;InbreedingCoeff=0.7740;MQ=69.00;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.418;NF;NR;PP;QD=7.90;RUN=1;ReadPosRankSum=-3.864;SB=-3244.40;SC=GGTCCTAAGGCAAAAAAAAAA;TC;TR=17;TU=A;VQSLOD=14.1033;set=Intersection +20 53308906 . CT C,CTT 2276 PASS AA=92;AB=0.84453;ABA=81;ABP=540.17;ABR=440;AC=53,81;AF=0.04351,0.06650;AN=1218;BL=3561;BR=4796;BVAR;BaseQRankSum=3.000;DP=11804;Dels=0.02;EL=48;EPP=3.3879;ER=44;FR;FS=13.197;HETAR=69;HOMA=3;HOMR=993;HP=11;HR=10;HRun=10;HU=T;INS;InbreedingCoeff=0.2297;LEN=1;LRB=0.14778;LRBP=399.32;MQ0=1;MQ0Fraction=0.0003;MQM=56.348;MQRankSum=3.154;NF;NR;NS=1065;PP;RA=5520;RL=39;RPP=7.6365;RR=53;RUN=1;ReadPosRankSum=-2.140;SAB=0.57609;SAF=53;SAP=7.6365;SAR=39;SC=AATCCAAAGTCTTTTTTTTTT;SRB=0.51576;SRF=2847;SRP=14.92;SRR=2673;TC;TR=10;TU=T;VQSLOD=2.4753;set=filterInVQSR-2of5;sumGLbyD=4.42 +20 53334602 . T TG,TGG 905.13 PASS ABR=325;AC=44,22;AF=0.03624,0.01812;BVAR;BaseQRankSum=-4.608;DP=15015;FR;FS=494.901;HOMA=0;HOMR=1004;HP=1;HR=1;HU=G;HaplotypeScore=20.5023;INS;InbreedingCoeff=0.0799;MQ=116.70;MQ0=0;MQ0Fraction=0.0000;MQRankSum=8.022;NF;NR;NS=1064;PP;QD=0.35;RA=5690;RUN=1;ReadPosRankSum=-14.522;SB=-311.57;SC=AGCCATTGGCTGTTTCACTGA;SRB=0.40738;SRF=2318;SRP=426.97;SRR=3372;TC;TR=1;TU=G;VQSLOD=-2.3042;set=filterInVQSR-2of5 +20 53729115 . T TG 15.48 PASS AC=1;AF=0.0015;AN=668;BaseQRankSum=-1.001;DP=1711;FS=9.048;HRun=2;HaplotypeScore=12.4681;InbreedingCoeff=-0.0320;MQ=131.36;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.193;QD=4.57;ReadPosRankSum=0.407;SB=-5.35;VQSLOD=4.8071;set=VQSR +20 53960980 . GC G 588.40 PASS AA=32;AB=0.78632;ABA=25;ABP=86.324;ABR=92;AF=0.0275;AF1=0.01689;AN=690;BL=1047;BR=1108;BVAR;BaseQRankSum=3.049;CI95=0.006637,0.02876;DEL;DP=11389;DP4=1514,1481,16,12;Dels=0.02;EL=27;EPP=35.854;ER=5;FQ=17.6;FS=0.652;HETAR=27;HOMA=3;HOMR=1006;HRun=1;INDEL;InbreedingCoeff=0.0473;LEN=1;LRB=0.028306;LRBP=6.7597;MQ=106.54;MQ0=0;MQ0Fraction=0.0000;MQM=115.53;MQRankSum=1.395;NS=1036;PV4=0.57,0.0057,0.46,0.22;RA=4207;RL=14;RPP=4.096;RR=18;RUN=1;ReadPosRankSum=-5.581;SAB=0.40625;SAF=13;SAP=5.4532;SAR=19;SRB=0.48586;SRF=2044;SRP=10.32;SRR=2163;VQSLOD=6.0155;set=Intersection;sumGLbyD=7.94 +20 54033830 . GTATTTTAAAATCA G 2220.86 PASS AF=0.0113;BaseQRankSum=5.506;DP=2577;Dels=0.01;FR;FS=6.533;HP=5;HPLen=4;HR=1;HRun=0;HU=T;InbreedingCoeff=0.0032;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.969;NF;NR;PP;ReadPosRankSum=1.322;SC=TCAATATTTTGTATTTTAAAA;TC;TR=1;TU=T;VQSLOD=5.5145;set=Intersection;sumGLbyD=95.65 +20 54375236 . GT G 626.13 PASS AA=40;AB=0.63551;ABA=39;ABP=20.078;ABR=68;AC=18;AF=0.0256;AN=702;BL=1331;BR=1743;BVAR;BaseQRankSum=9.346;DEL;DP=8568;Dels=0.02;EL=26;EPP=10.828;ER=14;FS=0.610;HETAR=21;HOMA=1;HOMR=1035;HRun=1;InbreedingCoeff=-0.0056;LEN=1;LRB=0.13403;LRBP=122.92;MQ0=0;MQ0Fraction=0.0000;MQM=67.125;MQRankSum=-2.537;NS=1058;RA=4870;RL=17;RPP=4.9646;RR=23;RUN=1;ReadPosRankSum=-1.229;SAB=0.525;SAF=21;SAP=3.2274;SAR=19;SRB=0.5271;SRF=2567;SRP=34.087;SRR=2303;VQSLOD=7.9228;set=Intersection;sumGLbyD=10.77 +20 54457331 . G GA 1793.40 PASS AA=77;AB=0.66667;ABA=74;ABP=56.573;ABR=148;AC=33;AF=0.02687;AN=1228;BL=3834;BR=1154;BVAR;BaseQRankSum=10.572;DP=10230;Dels=0.00;EL=77;EPP=170.21;ER=0;FS=139.433;HETAR=44;HOMA=1;HOMR=1001;HRun=1;INS;InbreedingCoeff=0.0023;LEN=1;LRB=0.53729;LRBP=3129.8;MQ0Fraction=0.0095;MQM=4.7013;MQRankSum=-8.116;NS=1046;RA=4009;RL=77;RPP=170.21;RR=0;RUN=1;ReadPosRankSum=-6.026;SAB=1;SAF=77;SAP=170.21;SAR=0;SRB=0.57022;SRF=2286;SRP=174.7;SRR=1723;VQSLOD=1.1887;set=filterInVQSR-2of5;sumGLbyD=5.90 +20 54469810 . CA C 1697.62 PASS AA=93;AB=0.63855;ABA=90;ABP=44.53;ABR=159;AC=34;AF=0.0374;AF1=0.01719;AN=908;BL=3242;BR=5839;BVAR;BaseQRankSum=10.425;CI95=0.009317,0.02795;DEL;DP=15197;DP4=2134,1896,56,46;Dels=0.03;EL=34;EPP=17.604;ER=59;FQ=16;FR;FS=9.985;HETAR=41;HOMA=1;HOMR=1011;HP=9;HPLen=8;HR=8;HRun=8;HU=A;INDEL;InbreedingCoeff=-0.0472;LEN=1;LRB=0.28598;LRBP=1615.8;MQ=83.37;MQ0=1;MQ0Fraction=0.0004;MQM=64.075;MQRankSum=3.036;NF;NR;NS=1053;PP;PV4=0.76,1,0.31,0.22;RA=5150;RL=28;RPP=34.975;RR=65;RUN=1;ReadPosRankSum=-0.252;SAB=0.5914;SAF=55;SAP=9.7582;SAR=38;SC=ATTGCTAAGACAAAAAAAAGA;SRB=0.50621;SRF=2607;SRP=4.7374;SRR=2543;TC;TR=8;TU=A;VQSLOD=8.3677;set=Intersection;sumGLbyD=9.90 +20 54542453 . GTATA G,GTA 5109.66 PASS ABR=112;AC=66,56;AF=0.0682,0.0579;AN=968;BVAR;BaseQRankSum=17.089;DB;DEL;DP=5519;DS;Dels=0.06;FS=99.502;HOMA=15;HOMR=409;HRun=0;InbreedingCoeff=0.1584;MQ0Fraction=0.0178;MQRankSum=-6.854;NS=460;RA=864;RUN=1;ReadPosRankSum=0.855;SRB=0.79282;SRF=685;SRP=646.5;SRR=179;VQSLOD=0.6375;set=filterInVQSR-2of5;sumGLbyD=8.53 +20 54629773 . CA C 1799.50 PASS AA=49;AB=0.82707;ABA=46;ABP=250.17;ABR=220;AC=9;AF=0.00746;AN=1206;BL=173;BR=2277;BVAR;BaseQRankSum=5.240;DEL;DP=8557;Dels=0.01;EL=49;EPP=109.41;ER=0;FS=32.359;HETAR=35;HOMA=1;HOMR=325;HRun=1;InbreedingCoeff=0.0892;LEN=1;LRB=0.85878;LRBP=3926.6;MQ0Fraction=0.0602;MQM=32.163;MQRankSum=-3.926;NS=361;RA=1091;RL=0;RPP=109.41;RR=49;RUN=1;ReadPosRankSum=-4.512;SAB=0;SAF=0;SAP=109.41;SAR=49;SRB=0.49404;SRF=539;SRP=3.3467;SRR=552;VQSLOD=1.1233;set=filterInVQSR-2of5;sumGLbyD=3.54 +20 54710245 . TA T 999 PASS AF=0.0084;AF1=0.0148;BaseQRankSum=3.954;CI95=0.00885,0.02212;DP=8043;DP4=2000,1849,10,7;Dels=0.01;FQ=999;FR;FS=0.000;HP=9;HPLen=6;HR=3;HRun=6;HU=A;INDEL;InbreedingCoeff=0.1181;MQ=78.51;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.095;NF;NR;PP;PV4=0.63,0.00056,1,1;ReadPosRankSum=-0.448;SC=CAACAAAAAATAAATAAATAA;TC;TR=15;TU=AAAT;VQSLOD=7.8129;set=Intersection;sumGLbyD=19.02 +20 54968173 . A AAT,AATAT,AT,ATAT 89535.82 PASS ABR=994;AC=561,278,2,3;AF=0.50179,0.24866,0.00179,0.00268;AN=1118;BVAR;BaseQRankSum=-2.699;DB;DP=27837;DP4=168,177,1045,866;Dels=0.00;FQ=999;FR;FS=12.472;HOMA=71;HOMR=455;HP=3;HPLen=4;HR=4;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.6391;KGPilot123;MQ=80.36;MQ0Fraction=0.0055;MQRankSum=-1.512;NF;NR;NS=913;PP;PV4=0.046,1,1,1;RA=2015;RUN=1;ReadPosRankSum=1.015;SC=GGCCACTTAAAATATATATAT;SRB=0.44864;SRF=904;SRP=49.187;SRR=1111;TC;TR=15;TU=AT;VQSLOD=9.0092;dbSNP=132;set=Intersection;sumGLbyD=42.33 +20 55176688 . TA T 421.84 PASS AF=0.01322;AF1=0.01845;BaseQRankSum=5.383;CI95=0.01282,0.02564;DP=10531;DP4=1975,2017,16,14;Dels=0.01;FQ=91.2;FR;FS=7.401;HP=6;HPLen=5;HR=5;HRun=5;HU=A;INDEL;InbreedingCoeff=0.0829;MQ=75.80;MQ0=1;MQ0Fraction=0.0003;MQRankSum=-0.471;NF;NR;PP;PV4=0.72,1,1,1;ReadPosRankSum=0.223;SC=CTGCAAAATATAAAAATTAGG;TC;TR=5;TU=A;VQSLOD=6.6000;set=Intersection;sumGLbyD=12.15 +20 55664086 . GTT ATT,G,GT,GTTT 5622.44 PASS AC=6,71,136;AF=0.00498,0.05887,0.11277;AN=1206;BVAR;BaseQRankSum=3.173;DB;DEL;DP=40384;DP4=1567,1317,54,29;Dels=0.05;FR;FS=1.949;HP=14;HR=11;HRun=11;HU=T;INDEL;INS;InbreedingCoeff=0.3490;MQ=77.90;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.052;NF;NR;PP;PV4=0.057,1,0.2,1.2e-05;RUN=1;ReadPosRankSum=-13.646;SC=AATTTTATTTGTTTTTTTTTT;TC;TR=11;TU=T;VQSLOD=11.7964;set=Intersection;sumGLbyD=8.09 +20 56045006 . TG T 342.15 PASS AC=72;AF=0.0940;AN=766;BaseQRankSum=4.992;DP=1238;FS=1.460;HRun=7;HaplotypeScore=20.2784;InbreedingCoeff=0.1795;MQ=66.42;MQ0=1;MQ0Fraction=0.0008;MQRankSum=-0.937;QD=1.84;ReadPosRankSum=-4.385;SB=-320.83;VQSLOD=5.2383;set=VQSR +20 56158711 . AG A 922.47 PASS AA=18;AB=0.575;ABA=17;ABP=4.9646;ABR=23;AC=2;AF=0.0028;AN=714;BL=953;BR=808;BVAR;BaseQRankSum=3.129;DEL;DP=10462;Dels=0.01;EL=9;EPP=3.0103;ER=9;FR;FS=8.724;HETAR=4;HOMA=0;HOMR=1058;HP=1;HPLen=2;HR=2;HRun=1;HU=A;InbreedingCoeff=0.0262;LEN=1;LRB=0.08234;LRBP=28.936;MQ0=0;MQ0Fraction=0.0000;MQM=55.889;MQRankSum=2.052;NF;NR;NS=1062;PP;RA=6300;RL=9;RPP=3.0103;RR=9;RUN=1;ReadPosRankSum=-0.317;SAB=0.66667;SAF=12;SAP=7.3532;SAR=6;SC=TGGCCTAGCAAGCATCGTGAC;SRB=0.48143;SRF=3033;SRP=21.883;SRR=3267;TC;TR=8;TU=AAGC;VQSLOD=8.3252;set=Intersection;sumGLbyD=13.22 +20 56258618 rs113670927 T C,TGC,TGTGC,TGTGTGC 37834.99 PASS ABR=441;AC=11,100,43;AF=0.0123,0.1119,0.0481;AN=894;BVAR;BaseQRankSum=19.514;DB;DP=23173;DP4=541,920,413,579;Dels=0.00;FQ=999;FR;FS=1.238;HOMA=28;HOMR=808;HP=2;HPLen=1;HR=1;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.2154;MQ=57.25;MQ0Fraction=0.0275;MQRankSum=-6.684;NF;NR;NS=976;PP;PV4=0.023,1,1,1;RA=3294;RUN=1;ReadPosRankSum=11.873;SC=TGCGTGTGTGTGTGTGTGTGT;SRB=0.42441;SRF=1398;SRP=166.5;SRR=1896;TC;TR=30;TU=GT;VQSLOD=6.7457;dbSNP=114;set=Intersection;sumGLbyD=21.27 +20 56395857 . T TAGGCAG 6614.22 PASS AA=30;AB=0.63415;ABA=30;ABP=15.827;ABR=52;AC=14;AF=0.0197;AF1=0.03154;AN=710;BL=991;BR=1813;BVAR;BaseQRankSum=-4.589;CI95=0.02434,0.04204;DP=13879;DP4=1543,1833,12,14;Dels=0.00;EL=14;EPP=3.2998;ER=16;FQ=999;FR;FS=1.482;HETAR=11;HOMA=0;HOMR=1051;HP=1;HPLen=2;HR=2;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0774;LEN=6;LRB=0.29315;LRBP=526.27;MQ=90.42;MQ0=0;MQ0Fraction=0.0000;MQM=39.433;MQRankSum=-7.011;NF;NR;NS=1062;PP;PV4=1,1,3.7e-09,1;RA=5322;RL=9;RPP=13.433;RR=21;RUN=1;ReadPosRankSum=0.679;SAB=0.43333;SAF=13;SAP=4.1684;SAR=17;SC=AAGAGCATCTTAGGCAGAGGC;SRB=0.47294;SRF=2517;SRP=36.853;SRR=2805;TC;TR=2;TU=T;VQSLOD=8.3045;set=Intersection;sumGLbyD=68.22 +20 56969289 . GTTTGT G 600.69 PASS AF=0.0056;AF1=0.007726;BaseQRankSum=2.907;CI95=0.004425,0.01327;DP=9643;DP4=1892,1749,6,3;Dels=0.00;FQ=117;FR;FS=16.601;HP=5;HPLen=3;HR=3;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0236;MQ=92.59;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.134;NF;NR;PP;PV4=0.51,1,0.07,0.3;ReadPosRankSum=0.236;SC=TAAGGACGTTGTTTGTTTTGT;TC;TR=10;TU=GTTT;VQSLOD=5.8458;set=Intersection;sumGLbyD=39.51 +20 57187557 . AG A,AGG 1486.69 PASS AA=130;AB=0.55446;ABA=90;ABP=8.2132;ABR=112;AC=56,26;AF=0.0574,0.0266;AN=976;BL=3817;BR=5968;BVAR;BaseQRankSum=5.517;DEL;DP=14174;DP4=925,721,59,48;Dels=0.05;EL=52;EPP=14.302;ER=78;FR;FS=0.917;HETAR=44;HOMA=17;HOMR=864;HP=4;HPLen=4;HR=4;HRun=4;HU=G;INDEL;InbreedingCoeff=0.2856;LEN=1;LRB=0.21983;LRBP=1029.8;MQ=91.56;MQ0=0;MQ0Fraction=0.0000;MQM=63.631;MQRankSum=1.900;NF;NR;NS=925;PP;PV4=0.84,1,1,0.39;RA=2746;RL=44;RPP=32.476;RR=86;RUN=1;ReadPosRankSum=-0.639;SAB=0.44615;SAF=58;SAP=6.2842;SAR=72;SC=TCAGGCCCGCAGGGGTCAGGG;SRB=0.5772;SRF=1585;SRP=145.17;SRR=1161;TC;TR=4;TU=G;VQSLOD=7.7167;set=Intersection;sumGLbyD=14.85 +20 57282771 . T TG 506.43 PASS AA=34;AB=0.70312;ABA=19;ABP=25.946;ABR=45;AC=34;AF=0.0373;AN=912;BL=886;BR=1938;BVAR;BaseQRankSum=3.744;DP=4276;Dels=0.00;EL=18;EPP=3.2658;ER=16;FR;FS=0.639;HETAR=17;HOMA=9;HOMR=737;HP=9;HR=8;HRun=8;HU=G;INS;InbreedingCoeff=0.2149;LEN=1;LRB=0.37252;LRBP=853.99;MQ0=0;MQ0Fraction=0.0000;MQM=49.706;MQRankSum=-0.051;NF;NR;NS=763;PP;RA=1822;RL=9;RPP=19.36;RR=25;RUN=1;ReadPosRankSum=-2.111;SAB=0.55882;SAF=19;SAP=4.0322;SAR=15;SC=TCGGGGGGCGTGGGGGGGGTG;SRB=0.51098;SRF=931;SRP=4.9172;SRR=891;TC;TR=8;TU=G;VQSLOD=5.7772;set=Intersection;sumGLbyD=7.95 +20 57419740 rs11481507 A AT 82613.57 PASS AA=3850;AB=0.41404;ABA=1786;ABP=198.63;ABR=1262;AC=919;AF=0.75328;AN=1220;BL=140665;BR=151383;BVAR;BaseQRankSum=-27.490;DB;DP=31794;DP4=588,585,1571,1721;Dels=0.00;EL=1924;EPP=3.0126;ER=1926;FQ=999;FR;FS=2.191;HETAR=482;HOMA=454;HOMR=135;HP=3;HPLen=3;HR=3;HRun=3;HU=T;INDEL;INS;InbreedingCoeff=0.0861;LEN=1;LRB=0.036699;LRBP=857.15;MQ=123.92;MQ0=0;MQ0Fraction=0.0000;MQM=91.654;MQRankSum=3.016;NF;NR;NS=1071;PP;PV4=0.16,1,0.12,1;RA=1850;RL=1874;RPP=8.8784;RR=1976;RUN=1;ReadPosRankSum=-0.685;SAB=0.47636;SAF=1834;SAP=21.693;SAR=2016;SC=TACACTAGTGATTTAACCCTA;SRB=0.49027;SRF=907;SRP=4.5315;SRR=943;TC;TR=3;TU=T;VQSLOD=9.2768;dbSNP=126;set=Intersection;sumGLbyD=22.78 +20 57529209 . TA AA,T 1285.20 PASS AA=52;AB=0.89572;ABA=39;ABP=511.72;ABR=335;AC=0;AF=0.0000;AN=694;BL=1317;BR=3667;BVAR;BaseQRankSum=1.788;DEL;DP=8008;Dels=0.00;EL=30;EPP=5.6829;ER=22;FR;HETAR=151;HOMA=83;HOMR=752;HP=7;HR=7;HU=A;InbreedingCoeff=0.1368;LEN=1;LRB=0.47151;LRBP=2409.1;MQ0=0;MQ0Fraction=0.0000;MQM=58.288;MQRankSum=-0.490;NF;NR;NS=987;PP;QD=2.29;RA=2909;RL=4;RPP=83.856;RR=48;RUN=1;ReadPosRankSum=0.513;SAB=0.46154;SAF=24;SAP=3.6784;SAR=28;SB=-361.38;SC=CATAATTTTTTAAAAAAATAG;SRB=0.46855;SRF=1363;SRP=28.009;SRR=1546;TC;TR=7;TU=A;set=filterInVQSR-2of5;sumGLbyD=5.59 +20 57558194 . CT C,CTT,CTTT 6470.30 PASS ABR=451;AC=104,161,177;AF=0.08919,0.13808,0.15180;BVAR;BaseQRankSum=1.172;DP=7985;FR;FS=2.202;HOMA=19;HOMR=778;HP=22;HR=15;HU=T;HaplotypeScore=16.1921;INS;InbreedingCoeff=0.6440;MQ=69.24;MQ0=27;MQ0Fraction=0.0109;MQRankSum=-0.003;NF;NR;NS=943;PP;QD=2.22;RA=2531;RUN=1;ReadPosRankSum=-0.104;SB=-2096.85;SC=GCCTTTTTTTCTTTTTTTTTT;SRB=0.34848;SRF=882;SRP=507.73;SRR=1649;TC;TR=15;TU=T;VQSLOD=6.5151;set=Intersection +20 57693627 . AG A 1991.90 PASS AA=52;AB=0.49462;ABA=47;ABP=3.0336;ABR=46;AC=15;AF=0.01227;AN=1222;BL=1902;BR=1478;BVAR;BaseQRankSum=-6.121;DEL;DP=26459;DP4=2647,2873,16,20;Dels=0.01;EL=25;EPP=3.1773;ER=27;FR;FS=3.135;HETAR=15;HOMA=1;HOMR=1064;HP=2;HPLen=3;HR=3;HRun=2;HU=A;INDEL;InbreedingCoeff=0.0866;LEN=1;LRB=0.12544;LRBP=118.51;MQ=116.26;MQ0=0;MQ0Fraction=0.0000;MQM=114.65;MQRankSum=1.942;NF;NR;NS=1080;PP;PV4=0.74,6.9e-08,1,0.38;RA=6781;RL=33;RPP=11.195;RR=19;RUN=1;ReadPosRankSum=-1.795;SAB=0.5;SAF=26;SAP=3.0103;SAR=26;SC=ATTGGAGGAAAGGCTTTTTCA;SRB=0.46247;SRF=3136;SRP=85.976;SRR=3645;TC;TR=3;TU=A;VQSLOD=8.6672;set=Intersection;sumGLbyD=13.55 +20 57716287 . A AT 66.47 PASS AC=6;AF=0.00506;AN=1186;BaseQRankSum=1.369;DP=2744;FS=3.834;HRun=8;HaplotypeScore=11.2046;InbreedingCoeff=0.1196;MQ=73.00;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-0.086;QD=2.14;ReadPosRankSum=-2.588;SB=-53.80;VQSLOD=4.2080;set=VQSR +20 58121928 rs73625057 T TGG 6649.17 PASS AA=132;AB=0.57854;ABA=110;ABP=16.996;ABR=151;AC=57;AF=0.0617;AN=924;BL=4530;BR=4790;BVAR;BaseQRankSum=-13.456;DB;DP=30353;DP4=2107,2168,61,66;Dels=0.00;EL=67;EPP=3.0761;ER=65;FR;FS=0.708;HETAR=46;HOMA=8;HOMR=1023;HP=3;HPLen=2;HR=2;HRun=2;HU=G;INDEL;INS;InbreedingCoeff=0.1241;LEN=2;LRB=0.027897;LRBP=18.76;MQ=109.61;MQ0=1;MQ0Fraction=0.0004;MQM=79.833;MQRankSum=-0.699;NF;NR;NS=1077;PP;PV4=0.79,1,0.49,0.036;RA=5754;RL=61;RPP=4.6554;RR=71;RUN=1;ReadPosRankSum=-3.309;SAB=0.45455;SAF=60;SAP=5.3792;SAR=72;SC=GATTAGAATGTGGATATCTTT;SRB=0.48836;SRF=2810;SRP=9.7866;SRR=2944;TC;TR=4;TU=GT;VQSLOD=8.5770;set=Intersection;sumGLbyD=27.19 +20 58287008 . T TC 23.57 PASS AC=1;AF=0.0015;AN=678;BaseQRankSum=1.500;DP=1783;FS=0.000;HRun=1;HaplotypeScore=13.0585;InbreedingCoeff=0.0243;MQ=98.37;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.259;QD=5.43;ReadPosRankSum=1.115;SB=-40.33;VQSLOD=4.9523;set=VQSR +20 58418087 . TAC T 1908.26 PASS AA=64;AB=0.58667;ABA=62;ABP=12.796;ABR=88;AC=24;AF=0.0337;AN=712;BL=2841;BR=2706;BVAR;BaseQRankSum=12.276;DEL;DP=21427;DP4=2243,2398,22,31;Dels=0.03;EL=29;EPP=4.2318;ER=35;FQ=999;FR;FS=0.961;HETAR=21;HOMA=1;HOMR=1050;HP=2;HPLen=1;HR=1;HRun=0;HU=A;INDEL;InbreedingCoeff=0.0008;LEN=2;LRB=0.024337;LRBP=10.145;MQ=93.02;MQ0=0;MQ0Fraction=0.0000;MQM=51.109;MQRankSum=-3.746;NF;NR;NS=1072;PP;PV4=0.34,1.8e-11,2.3e-08,1;RA=6247;RL=37;RPP=6.4032;RR=27;RUN=1;ReadPosRankSum=0.418;SAB=0.4375;SAF=28;SAP=5.1818;SAR=36;SC=AGCCATAGGATACACAAAATC;SRB=0.47911;SRF=2993;SRP=26.689;SRR=3254;TC;TR=5;TU=AC;VQSLOD=10.5463;set=Intersection;sumGLbyD=12.25 +20 58468826 . ACAAG A 999 PASS AF=0.0014;AF1=0.003429;BaseQRankSum=4.082;CI95=0.003106,0.006211;DP=8461;DP4=2500,1817,8,2;Dels=0.01;FQ=999;FR;FS=5.034;HP=2;HPLen=1;HR=1;HRun=0;HU=C;INDEL;InbreedingCoeff=-0.0183;MQ=120.69;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.141;NF;NR;PP;PV4=0.21,1,0.054,1;ReadPosRankSum=2.096;SC=ATCCTGAAACACAAGAAGAAA;TC;TR=5;TU=AC;VQSLOD=7.4928;set=Intersection;sumGLbyD=29.17 +20 58731262 . TC T 999 PASS AA=21;AB=0.48649;ABA=19;ABP=3.069;ABR=18;AC=7;AF=0.0101;AF1=0.01493;AN=694;BL=939;BR=848;BVAR;BaseQRankSum=4.205;CI95=0.01106,0.02212;DEL;DP=12598;DP4=1766,1428,11,15;Dels=0.01;EL=13;EPP=5.5954;ER=8;FQ=999;FR;FS=1.796;HETAR=8;HOMA=1;HOMR=1031;HP=7;HPLen=8;HR=8;HRun=2;HU=T;INDEL;InbreedingCoeff=-0.0030;LEN=1;LRB=0.050923;LRBP=13.073;MQ=124.57;MQ0=0;MQ0Fraction=0.0000;MQM=67.905;MQRankSum=1.103;NF;NR;NS=1040;PP;PV4=0.23,1,1,1;RA=4884;RL=10;RPP=3.1137;RR=11;RUN=1;ReadPosRankSum=-0.091;SAB=0.47619;SAF=10;SAP=3.1137;SAR=11;SC=TCATTTTTTTTCCTTGAAACT;SRB=0.58006;SRF=2833;SRP=274.9;SRR=2051;TC;TR=8;TU=T;VQSLOD=10.8783;set=Intersection;sumGLbyD=15.11 +20 59181229 rs11476579 CTT C,CT,CTTT,CTTTT 7787.17 PASS AC=19,195,104,91;AF=0.01599,0.16414,0.08754,0.07660;AF1=0.2124;AN=1188;BVAR;BaseQRankSum=6.347;CI95=0.146,0.2743;DB;DEL;DP=26140;DP4=932,880,352,375;Dels=0.13;FQ=85.6;FR;FS=11.914;HP=14;HR=14;HRun=14;HU=T;INDEL;INS;InbreedingCoeff=0.4183;MQ=86.88;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.469;NF;NR;PP;PV4=0.17,1,1,1;RUN=1;ReadPosRankSum=-1.055;SC=GGTGAGAAAGCTTTTTTTTTT;TC;TR=14;TU=T;VQSLOD=7.4340;dbSNP=120;set=Intersection;sumGLbyD=7.02 +20 59213979 rs112141381 G GC 9068 PASS AA=131;AB=0.47115;ABA=110;ABP=4.5136;ABR=98;AF=0.0586;AN=700;BL=5395;BR=5816;BVAR;BaseQRankSum=15.453;DB;DP=23381;DP4=2191,2184,71,49;Dels=0.00;EL=66;EPP=3.0269;ER=65;FR;FS=7.907;HETAR=35;HOMA=5;HOMR=1019;HP=2;HPLen=3;HR=3;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.0283;LEN=1;LRB=0.037552;LRBP=37.34;MQ=72.13;MQ0=0;MQ0Fraction=0.0000;MQM=54.496;MQRankSum=0.897;NF;NR;NS=1059;PP;PV4=0.052,1,0.066,1;RA=4976;RL=59;RPP=5.8117;RR=72;RUN=1;ReadPosRankSum=-0.811;SAB=0.58015;SAF=76;SAP=10.32;SAR=55;SC=GATGGACTGGGACAGTGACTC;SRB=0.49457;SRF=2461;SRP=4.2828;SRR=2515;TC;TR=3;TU=G;VQSLOD=9.3917;set=Intersection;sumGLbyD=28.58 +20 59252945 . CT C,CTT 557.18 PASS AA=24;AB=0.84868;ABA=23;ABP=163.53;ABR=129;AC=21,29;AF=0.01759,0.02429;BL=1217;BR=1336;BVAR;BaseQRankSum=5.135;DP=9970;Dels=0.01;EL=13;EPP=3.3722;ER=11;FS=2.302;HETAR=21;HOMA=1;HOMR=1012;HRun=9;INS;InbreedingCoeff=0.1549;LEN=1;LRB=0.046612;LRBP=15.055;MQ0=0;MQ0Fraction=0.0000;MQM=67.208;MQRankSum=0.086;NS=1034;RA=4421;RL=11;RPP=3.3722;RR=13;RUN=1;ReadPosRankSum=-1.826;SAB=0.41667;SAF=10;SAP=4.4579;SAR=14;SRB=0.49649;SRF=2195;SRP=3.4823;SRR=2226;VQSLOD=2.8923;set=filterInVQSR-2of5;sumGLbyD=5.47 +20 60016966 . CT C 42650 PASS AA=37;AB=0.97834;ABA=31;ABP=2847;ABR=1400;AC=15;AF=0.0163;AN=920;BL=2596;BR=778;BVAR;BaseQRankSum=-0.632;DEL;DP=10967;Dels=0.00;EL=14;EPP=7.7641;ER=23;FS=4.094;HETAR=421;HOMA=256;HOMR=385;HRun=1;InbreedingCoeff=-0.0051;LEN=1;LRB=0.53883;LRBP=2130.2;MQ0=0;MQ0Fraction=0.0000;MQM=120.3;MQRankSum=-0.911;NS=1072;RA=3413;RL=31;RPP=39.691;RR=6;RUN=1;ReadPosRankSum=-12.062;SAB=0.48649;SAF=18;SAP=3.069;SAR=19;SRB=0.47407;SRF=1618;SRP=22.943;SRR=1795;VQSLOD=3.3758;set=filterInVQSR-2of5;sumGLbyD=3.27 +20 60188651 . AG A 17624.52 PASS AA=462;AB=0.76548;ABA=409;ABP=1070.7;ABR=1335;AC=403;AF=0.34444;AN=1170;BL=13877;BR=25909;BVAR;BaseQRankSum=6.180;DEL;DP=9900;Dels=0.08;EL=353;EPP=282.84;ER=109;FR;FS=2699.057;HETAR=346;HOMA=26;HOMR=633;HP=3;HR=4;HRun=1;HU=A;InbreedingCoeff=-0.2900;LEN=1;LRB=0.30242;LRBP=7904.3;MQ0Fraction=0.0004;MQM=56.119;MQRankSum=1.644;NF;NR;NS=1005;PP;RA=3521;RL=112;RPP=269.25;RR=350;RUN=1;ReadPosRankSum=2.490;SAB=0.0064935;SAF=3;SAP=980.34;SAR=459;SC=AGGCTTCAAAAGAAAAAAAAA;SRB=0.55978;SRF=1971;SRP=112.32;SRR=1550;TC;TR=4;TU=A;VQSLOD=-34.0667;set=filterInVQSR-2of5;sumGLbyD=7.81 +20 60195570 . GTACATACATACA ATACATACATACA,G,GTACATACA 20140 PASS ABR=102;AC=105,2;AF=0.08794,0.00168;AN=1194;BVAR;BaseQRankSum=-28.899;DB;DEL;DP=14347;Dels=0.02;FR;FS=52.125;HOMA=1;HOMR=1006;HP=1;HPLen=1;HR=1;HRun=0;HU=T;InbreedingCoeff=0.0695;MQ0Fraction=0.0007;MQRankSum=1.957;NF;NR;NS=1035;PP;RA=4759;RUN=1;ReadPosRankSum=-22.252;SAB=0.5;SAP=3.0103;SC=TGATAGATTCGTACATACATA;SRB=0.47615;SRF=2266;SRP=26.522;SRR=2493;TC;TR=21;TU=ACAT;VQSLOD=2.7673;set=filterInVQSR-2of5;sumGLbyD=19.14 +20 60670601 rs72127450 AT A,ATT 6401.59 PASS AC=177,79;AF=0.16239,0.07248;AF1=0.1602;AN=1090;BVAR;BaseQRankSum=8.618;CI95=0.1106,0.2058;DB;DEL;DP=17508;DP4=1285,1094,313,259;Dels=0.10;FQ=94.1;FR;FS=0.000;HP=12;HR=12;HRun=12;HU=T;INDEL;INS;InbreedingCoeff=0.1076;LEN=1;MQ=64.73;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.620;NF;NR;PP;PV4=0.78,1,0.012,1;RUN=1;ReadPosRankSum=-1.294;SC=AGCCAGGCACATTTTTTTTTT;TC;TR=12;TU=T;VQSLOD=6.1650;dbSNP=130;set=Intersection;sumGLbyD=5.80 +20 60685780 . TC T 1123.58 PASS AC=79;AF=0.07655;AN=1032;BaseQRankSum=14.949;DP=2084;FS=23.521;HRun=1;HaplotypeScore=19.7117;InbreedingCoeff=0.1356;MQ=53.57;MQ0=61;MQ0Fraction=0.0293;MQRankSum=-7.958;QD=4.35;ReadPosRankSum=-13.757;SB=-791.28;VQSLOD=6.3549;set=VQSR +20 60744906 rs113528167 CG C 422.53 PASS AC=48;AF=0.0732;AN=656;BaseQRankSum=17.669;DB;DP=1189;FS=0.356;HRun=1;HaplotypeScore=15.1808;InbreedingCoeff=0.2111;MQ=82.83;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-10.455;QD=2.71;ReadPosRankSum=-16.887;SB=-326.46;VQSLOD=7.1707;set=VQSR +20 60848742 . CGT C,CGTGT 999 PASS AF=0.00980,0.01225;BaseQRankSum=5.597;DP=17065;DP4=1928,2188,17,13;Dels=0.01;FR;HP=1;HPLen=2;HR=2;HRun=0;HU=C;INDEL;InbreedingCoeff=0.2094;MQ=115.78;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.281;NF;NR;PP;PV4=0.36,0.4,0.12,0.12;ReadPosRankSum=-1.465;SB=-157.35;SC=TAGACGCTTCCGTGTGTGTGT;TC;TR=11;TU=GT;VQSLOD=1.7100;set=filterInVQSR-2of5;sumGLbyD=16.39 +20 61023668 rs57452309 G GAGC 6896.67 PASS AC=115;AF=0.1445;AN=796;BaseQRankSum=12.146;DB;DP=1423;FS=5.070;HRun=0;HaplotypeScore=29.8897;InbreedingCoeff=0.0740;MQ=77.02;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-9.005;QD=19.16;ReadPosRankSum=-17.440;SB=-3045.82;VQSLOD=4.5788;set=VQSR +20 61180519 . C CA,CT 1774.30 PASS ABR=135;AC=27,15;AF=0.02538,0.01410;BVAR;BaseQRankSum=-2.189;DP=8393;FR;FS=27.692;HOMA=2;HOMR=825;HP=6;HPLen=3;HR=3;HU=T;HaplotypeScore=19.5313;INS;InbreedingCoeff=0.0868;LEN=1;MQ=56.11;MQ0=172;MQ0Fraction=0.0667;MQRankSum=2.605;NF;NR;NS=854;PP;QD=1.99;RA=2868;RUN=1;ReadPosRankSum=-7.324;SB=-385.54;SC=TTCTTTCTTTCTTTCTTTCTT;SRB=0.32741;SRF=939;SRP=745.08;SRR=1929;TC;TR=69;TU=CTTT;VQSLOD=3.4398;set=filterInVQSR-2of5 +20 61184281 . AC A 9798.10 PASS AA=24;AB=0.96507;ABA=16;ABP=863.43;ABR=442;AC=4;AF=0.00341;AN=1174;BL=349;BR=1039;BVAR;BaseQRankSum=2.048;DEL;DP=10073;Dels=0.00;EL=11;EPP=3.3722;ER=13;FS=2.097;HETAR=141;HOMA=69;HOMR=829;HRun=1;InbreedingCoeff=0.0697;LEN=1;LRB=0.49712;LRBP=747.85;MQ0=0;MQ0Fraction=0.0000;MQM=98.042;MQRankSum=1.881;NS=1042;RA=3625;RL=5;RPP=20.744;RR=19;RUN=1;ReadPosRankSum=-8.009;SAB=0.75;SAF=18;SAP=16.039;SAR=6;SRB=0.52662;SRF=1909;SRP=25.323;SRR=1716;VQSLOD=1.8117;set=filterInVQSR-2of5;sumGLbyD=5.55 +20 62067246 . T TCGA 60869.60 PASS AC=1024;AF=0.88889;AN=1152;BaseQRankSum=17.328;DP=2144;FS=2.378;HRun=0;HaplotypeScore=22.0069;InbreedingCoeff=0.1400;MQ=86.75;MQ0=6;MQ0Fraction=0.0028;MQRankSum=-5.536;QD=29.45;ReadPosRankSum=1.266;SB=-24220.18;VQSLOD=6.4647;set=VQSR +20 62074219 . C CTAT,CTGT 2328 PASS ABR=99;AC=20,6;AF=0.01754,0.00526;BVAR;BaseQRankSum=11.221;DP=9498;DS;FS=4.510;HOMA=15;HOMR=645;HaplotypeScore=82.8868;INS;InbreedingCoeff=0.0880;LEN=3;MQ=29.88;MQ0=1378;MQ0Fraction=0.2286;MQRankSum=-5.309;NS=689;QD=0.77;RA=1679;RUN=1;ReadPosRankSum=-3.510;SAR=1;SB=-93.21;SRB=0.70697;SRF=1187;SRP=627.71;SRR=492;VQSLOD=1.8325;set=filterInVQSR-2of5 +20 62304449 . CA C,CAA 6680.17 PASS AC=141,69;AF=0.12567,0.06150;AF1=0.08178;AN=1122;BVAR;BaseQRankSum=9.754;CI95=0.05088,0.1128;DEL;DP=15867;DP4=1252,1289,232,208;Dels=0.10;FQ=52.6;FR;FS=6.576;HP=11;HR=11;HRun=11;HU=A;INDEL;INS;InbreedingCoeff=0.1950;LEN=1;MQ=60.48;MQ0Fraction=0.0004;MQRankSum=-0.049;NF;NR;PP;PV4=0.2,1,1,1;RUN=1;ReadPosRankSum=-2.137;SC=GATTCTGTGTCAAAAAAAAAA;TC;TR=11;TU=A;VQSLOD=7.4714;set=Intersection;sumGLbyD=8.36 +20 62804895 rs57769591 CCTT C 1148 PASS AC=8;AF=0.0085;AF1=0.002839;AN=938;BaseQRankSum=4.952;CI95=0.002212,0.006637;DB;DP=8889;DP4=2574,1668,4,8;FQ=12.3;FS=2.289;HPLen=3;HRun=0;HaplotypeScore=29.4184;INDEL;InbreedingCoeff=-0.0270;MQ0=876;MQ0Fraction=0.2674;MQRankSum=-0.641;PV4=0.074,1,1,1;QD=1.03;ReadPosRankSum=0.118;SB=-65.30;VQSLOD=6.4881;dbSNP=126;set=Intersection +20 62907688 . AAT A 6629.57 PASS AC=164;AF=0.13735;AN=1194;BaseQRankSum=27.368;DP=2746;FS=5.985;HRun=0;HaplotypeScore=14.7748;InbreedingCoeff=0.1433;MQ=96.65;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-3.318;QD=10.81;ReadPosRankSum=0.789;SB=-2662.16;VQSLOD=6.1473;set=VQSR +20 62952465 . G GT 9149.70 PASS AA=156;AB=0.66667;ABA=110;ABP=82.631;ABR=220;AC=8;AF=0.00768;AN=1042;BL=6618;BR=3296;BVAR;BaseQRankSum=-0.466;DP=6244;Dels=0.00;EL=70;EPP=6.5737;ER=86;FS=2.927;HETAR=88;HOMA=34;HOMR=664;HRun=0;INS;InbreedingCoeff=0.0711;LEN=1;LRB=0.33508;LRBP=2420.2;MQ0Fraction=0.0431;MQM=29.506;MQRankSum=-3.251;NS=786;RA=1722;RL=146;RPP=260.47;RR=10;RUN=1;ReadPosRankSum=-2.554;SAB=0.47436;SAF=74;SAP=3.9012;SAR=82;SRB=0.50523;SRF=870;SRP=3.4189;SRR=852;VQSLOD=6.1217;set=Intersection;sumGLbyD=16.58 diff --git a/tests/tabix_data/vcf/18.vcf b/tests/tabix_data/vcf/18.vcf new file mode 100644 index 0000000..e0d112c --- /dev/null +++ b/tests/tabix_data/vcf/18.vcf @@ -0,0 +1,1000 @@ +##fileformat=VCFv4.0 +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT DNA_pool_A +chr1 1281168 . A G 14 . DP=37;AF1=0.6243;CI95=0.5,1;DP4=4,0,6,0;MQ=15;PV4=1,0.027,1,1 PL:GT:GQ 43,0,4:0/1:6 +chr1 1281205 . T C 26 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 58,9,0:1/1:63 +chr1 1281206 . G C 25 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 57,9,0:1/1:63 +chr1 1922737 . G C 13.2 . DP=21;AF1=1;CI95=1,1;DP4=0,0,0,21;MQ=22 PL:GT:GQ 46,63,0:1/1:99 +chr1 21197513 . A G 55.1 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=41 PL:GT:GQ 88,21,0:1/1:84 +chr1 21343209 . T C 5.45 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=14 PL:GT:GQ 37,51,0:1/1:99 +chr1 22097362 . T C 4.75 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 35,9,0:1/1:63 +chr1 22254012 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 22650927 . G A 48.1 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=24 PL:GT:GQ 81,21,0:1/1:84 +chr1 23535401 . C T 40.4 . DP=25;AF1=1;CI95=0.5,1;DP4=0,16,0,5;MQ=19;PV4=1,0.2,1,1 PL:GT:GQ 73,13,0:1/1:65 +chr1 23543855 . T C 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=44 PL:GT:GQ 82,18,0:1/1:90 +chr1 24245107 . C G 32 . DP=4;AF1=0.5001;CI95=0.5,0.5;DP4=0,2,0,2;MQ=36;PV4=1,1,1,1 PL:GT:GQ 62,0,35:0/1:38 +chr1 24274412 . G C 39.5 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=32 PL:GT:GQ 72,12,0:1/1:72 +chr1 36529832 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr1 37788090 . A G 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr1 43120440 . C T 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=49;PV4=1,1,1,1 PL:GT:GQ 64,0,31:0/1:34 +chr1 43980466 . C T 43 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=19 PL:GT:GQ 76,45,0:1/1:99 +chr1 46047795 . T C 29.1 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=31 PL:GT:GQ 62,18,0:1/1:90 +chr1 48860309 . C T 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=46 PL:GT:GQ 141,18,0:1/1:90 +chr1 49415599 . T C 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 34,6,0:1/1:49 +chr1 51601816 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 51955459 . G C 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr1 68479569 . T G 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 43,6,0:1/1:49 +chr1 69032455 . A G 15.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 47,9,0:1/1:63 +chr1 71888225 . G T 9.31 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr1 72381528 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr1 82004013 . A G 37.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 70,12,0:1/1:72 +chr1 86289622 . C T 18 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 50,9,0:1/1:63 +chr1 90267663 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=45 PL:GT:GQ 54,9,0:1/1:63 +chr1 92699542 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr1 94867317 . G A 26.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 58,6,0:1/1:49 +chr1 96428713 . C G 3.98 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=27 PL:GT:GQ 33,6,0:1/1:49 +chr1 100466329 . G C 4.85 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=22 PL:GT:GQ 36,18,0:1/1:90 +chr1 101909281 . G A 70 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=4,0,5,0;MQ=46;PV4=1,1,0.096,1 PL:GT:GQ 100,0,88:0/1:91 +chr1 106216572 . T A 22 . DP=18;AF1=1;CI95=1,1;DP4=0,0,16,0;MQ=21 PL:GT:GQ 55,48,0:1/1:99 +chr1 107901770 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 40,6,0:1/1:49 +chr1 108431179 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=41 PL:GT:GQ 155,24,0:1/1:96 +chr1 112005344 . C T 99 . DP=52;AF1=1;CI95=1,1;DP4=7,0,27,0;MQ=44;PV4=1,1,1,1 PL:GT:GQ 196,25,0:1/1:99 +chr1 116625452 . C T 36 . DP=44;AF1=0.5;CI95=0.5,0.5;DP4=0,23,0,20;MQ=49;PV4=1,2.3e-69,0.42,1 PL:GT:GQ 66,0,179:0/1:69 +chr1 118060710 . G T 6.98 . DP=8;AF1=0.4999;CI95=0.5,0.5;DP4=4,0,3,0;MQ=47;PV4=1,0.0071,1,1 PL:GT:GQ 36,0,73:0/1:39 +chr1 118198177 . A G 15.9 . DP=23;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 47,6,0:1/1:49 +chr1 118586346 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr1 120809555 . G A 20 . DP=8;AF1=0.5;CI95=0.5,0.5;DP4=6,0,2,0;MQ=46;PV4=1,1,1,1 PL:GT:GQ 50,0,106:0/1:53 +chr1 130723110 . C A 20.7 . DP=8;AF1=0.5939;CI95=0.5,1;DP4=0,6,0,2;MQ=26;PV4=1,1,1,1 PL:GT:GQ 50,0,5:0/1:7 +chr1 133979895 . T C 14.9 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 46,6,0:1/1:49 +chr1 134977940 . C T 30 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=38;PV4=1,1,0.26,1 PL:GT:GQ 60,0,31:0/1:34 +chr1 141768589 . G A 18.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=4,0,4,0;MQ=51;PV4=1,2.7e-05,1,1 PL:GT:GQ 48,0,100:0/1:51 +chr1 141768590 . G A 22 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=2,0,4,0;MQ=50;PV4=1,0.0033,1,1 PL:GT:GQ 52,0,40:0/1:43 +chr1 146506051 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=43 PL:GT:GQ 76,9,0:1/1:63 +chr1 150997009 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr1 162915612 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 168455400 . A G 4.12 . DP=28;AF1=1;CI95=1,1;DP4=0,0,0,27;MQ=10 PL:GT:GQ 35,81,0:1/1:99 +chr1 172784744 . T C 17.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 49,6,0:1/1:49 +chr1 183627307 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 185789457 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr1 187081827 . T C 4.77 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=17 PL:GT:GQ 36,30,0:1/1:99 +chr1 188468339 . C T 33 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=24 PL:GT:GQ 66,39,0:1/1:99 +chr1 188595435 . C T 41.8 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr1 188670561 . G C 3.55 . DP=22;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=18 PL:GT:GQ 34,27,0:1/1:99 +chr1 188924877 . G A 6.2 . DP=10;AF1=0.9999;CI95=0.5,1;DP4=2,0,3,0;MQ=21;PV4=1,1,1,0.3 PL:GT:GQ 35,3,0:1/1:41 +chr1 190536295 . G A 68 . DP=38;AF1=1;CI95=1,1;DP4=0,0,36,0;MQ=18 PL:GT:GQ 101,108,0:1/1:99 +chr1 191129408 . T A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr1 195937816 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr1 198857619 . T C 89 . DP=61;AF1=0.5;CI95=0.5,0.5;DP4=0,38,0,17;MQ=30;PV4=1,0.032,1,1 PL:GT:GQ 119,0,139:0/1:99 +chr1 199057483 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 44,6,0:1/1:49 +chr1 200133619 . G C 5.83 . DP=49;AF1=1;CI95=0.5,1;DP4=2,0,8,0;MQ=17;PV4=1,0.059,1,0.2 PL:GT:GQ 37,12,0:1/1:72 +chr1 200729661 . A T 36 . DP=15;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=27 PL:GT:GQ 69,42,0:1/1:99 +chr1 201374519 . T C 69.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=39 PL:GT:GQ 102,12,0:1/1:72 +chr1 202811668 . G A 20.2 . DP=4;AF1=0.5163;CI95=0.5,1;DP4=0,1,0,3;MQ=24;PV4=1,1,1,1 PL:GT:GQ 50,0,12:0/1:15 +chr1 202960650 . C T 16.6 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=27 PL:GT:GQ 49,12,0:1/1:72 +chr1 205686638 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr1 205949857 . A G 3.14 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=21 PL:GT:GQ 33,15,0:1/1:75 +chr1 209806643 . A G 13.2 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=21 PL:GT:GQ 46,24,0:1/1:96 +chr1 209871501 . C T 25 . DP=12;AF1=0.5;CI95=0.5,0.5;DP4=5,0,4,0;MQ=41;PV4=1,7.7e-06,1,1 PL:GT:GQ 55,0,84:0/1:58 +chr1 211051323 . G A 99 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=49 PL:GT:GQ 176,24,0:1/1:96 +chr1 211389716 . C T 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 43,6,0:1/1:49 +chr1 211868415 . G A 3.54 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=14 PL:GT:GQ 34,33,0:1/1:99 +chr1 211914531 . C T 84.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,1,0,4;MQ=46;PV4=1,1,1,1 PL:GT:GQ 116,7,0:1/1:57 +chr1 214691313 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr1 215184650 . C T 40.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 72,6,0:1/1:49 +chr1 215995258 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr1 217031394 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 217986960 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 76,9,0:1/1:63 +chr1 218086681 . A G 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=34 PL:GT:GQ 142,27,0:1/1:99 +chr1 218546019 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 218632417 . G T 17.1 . DP=19;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=26 PL:GT:GQ 50,21,0:1/1:84 +chr1 218833355 . C G 23 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=5,0,2,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 53,0,63:0/1:56 +chr1 219303186 . T C 7.79 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,25;MQ=12 PL:GT:GQ 40,75,0:1/1:99 +chr1 219517634 . G A 26.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=42 PL:GT:GQ 59,12,0:1/1:72 +chr1 219590158 . T C 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 33,12,0:1/1:72 +chr1 219709853 . A T 99 . DP=124;AF1=0.5;CI95=0.5,0.5;DP4=80,0,41,0;MQ=44;PV4=1,0.26,1,1 PL:GT:GQ 143,0,156:0/1:99 +chr1 222457988 . A G 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=23 PL:GT:GQ 42,6,0:1/1:49 +chr1 222477914 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr1 223010233 . A G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr1 223796360 . G A 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=21 PL:GT:GQ 37,6,0:1/1:49 +chr1 224273784 . A T 14.2 . DP=18;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=15 PL:GT:GQ 47,30,0:1/1:99 +chr1 224454685 . C T 46.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=32 PL:GT:GQ 79,15,0:1/1:75 +chr1 224514706 . G C 21 . DP=38;AF1=1;CI95=1,1;DP4=0,0,38,0;MQ=19 PL:GT:GQ 54,114,0:1/1:99 +chr1 224515793 . C T 99 . DP=26;AF1=1;CI95=1,1;DP4=0,0,26,0;MQ=45 PL:GT:GQ 211,78,0:1/1:99 +chr1 224692969 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 40,6,0:1/1:49 +chr1 225607249 . A G 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=45;PV4=1,1,0,1 PL:GT:GQ 64,0,31:0/1:34 +chr1 226923918 . C A 29.1 . DP=52;AF1=1;CI95=0.5,1;DP4=0,2,0,10;MQ=27;PV4=1,1,1,1 PL:GT:GQ 62,18,0:1/1:90 +chr1 227125189 . T C 56.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=41 PL:GT:GQ 89,12,0:1/1:72 +chr1 227133712 . A T 20.1 . DP=26;AF1=0.5;CI95=0.5,0.5;DP4=11,0,10,0;MQ=23;PV4=1,1,0.48,1 PL:GT:GQ 50,0,39:0/1:42 +chr1 227943954 . G C 47 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=37 PL:GT:GQ 79,9,0:1/1:63 +chr1 227943974 . G A 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=34 PL:GT:GQ 66,12,0:1/1:72 +chr1 228067480 . A G 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=45 PL:GT:GQ 75,15,0:1/1:75 +chr1 228067510 . A G 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=45 PL:GT:GQ 140,15,0:1/1:75 +chr1 228088778 . C T 6.79 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=23 PL:GT:GQ 37,6,0:1/1:49 +chr1 228117888 . A C 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 45,6,0:1/1:49 +chr1 228139641 . T C 44.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 77,12,0:1/1:72 +chr1 228577146 . T C 26 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,14;MQ=22;PV4=1,1,1,0.027 PL:GT:GQ 56,0,77:0/1:59 +chr1 229001369 . C A 45 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 77,9,0:1/1:63 +chr1 229001386 . C T 8.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 39,6,0:1/1:49 +chr1 229348080 . T C 18.1 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=40;PV4=1,0.33,0.17,0.33 PL:GT:GQ 48,0,31:0/1:34 +chr1 229439710 . C T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=32 PL:GT:GQ 66,12,0:1/1:72 +chr1 229655149 . T C 30 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=30 PL:GT:GQ 63,24,0:1/1:96 +chr1 229660873 . C G 81 . DP=28;AF1=0.5;CI95=0.5,0.5;DP4=0,20,0,7;MQ=36;PV4=1,1,1,1 PL:GT:GQ 111,0,120:0/1:99 +chr2a 3661005 . C G 24 . DP=13;AF1=0.5001;CI95=0.5,0.5;DP4=7,0,4,0;MQ=27;PV4=1,1.1e-05,1,1 PL:GT:GQ 54,0,34:0/1:37 +chr2a 4140063 . G A 81 . DP=26;AF1=0.6671;CI95=0.5,1;DP4=18,0,8,0;MQ=24;PV4=1,8.3e-09,1,1 PL:GT:GQ 110,0,3:0/1:5 +chr2a 4248440 . T C 20 . DP=28;AF1=0.5;CI95=0.5,0.5;DP4=11,0,7,0;MQ=25;PV4=1,1,0.47,1 PL:GT:GQ 50,0,92:0/1:53 +chr2a 4707656 . A G 63 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 95,9,0:1/1:63 +chr2a 5194801 . G A 7.59 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=24 PL:GT:GQ 38,6,0:1/1:49 +chr2a 14111103 . A G 7.84 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=20 PL:GT:GQ 40,21,0:1/1:84 +chr2a 17799746 . A G 11.3 . DP=5;AF1=0.5001;CI95=0.5,0.5;DP4=0,3,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 41,0,35:0/1:37 +chr2a 24728910 . G A 45.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=28 PL:GT:GQ 78,15,0:1/1:75 +chr2a 29627939 . G T 5.44 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=27 PL:GT:GQ 36,9,0:1/1:63 +chr2a 31373164 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr2a 33935228 . T C 41.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr2a 36311856 . G A 99 . DP=30;AF1=1;CI95=1,1;DP4=0,0,0,29;MQ=44 PL:GT:GQ 213,87,0:1/1:99 +chr2a 39281204 . T C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr2a 41087565 . C T 74.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=38 PL:GT:GQ 107,12,0:1/1:72 +chr2a 45574768 . C A 11.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=18 PL:GT:GQ 43,9,0:1/1:63 +chr2a 55464464 . T C 26.1 . DP=7;AF1=0.9966;CI95=0.5,1;DP4=5,0,2,0;MQ=26;PV4=1,1,1,1 PL:GT:GQ 55,1,0:1/1:23 +chr2a 63107673 . T A 70.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=34 PL:GT:GQ 103,12,0:1/1:72 +chr2a 63141732 . A T 22.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 54,6,0:1/1:49 +chr2a 63141910 . G A 3.41 . DP=16;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr2a 63141911 . C T 9.55 . DP=16;AF1=0.5031;CI95=0.5,0.5;DP4=0,2,0,3;MQ=33;PV4=1,0.43,1,1 PL:GT:GQ 39,0,19:0/1:22 +chr2a 63143543 . C T 28 . DP=18;AF1=1;CI95=1,1;DP4=0,1,0,17;MQ=16;PV4=1,1,1,1 PL:GT:GQ 61,42,0:1/1:99 +chr2a 66419805 . G A 3.69 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 34,15,0:1/1:75 +chr2a 66563922 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr2a 67719136 . C T 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 71,6,0:1/1:49 +chr2a 72781453 . A C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr2a 76733211 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr2a 78190502 . A C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr2a 85021209 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr2a 88554861 . A T 39 . DP=74;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,4;MQ=46;PV4=1,1,1,1 PL:GT:GQ 69,0,92:0/1:72 +chr2a 88554877 . A G 92 . DP=90;AF1=0.5;CI95=0.5,0.5;DP4=0,23,0,13;MQ=41;PV4=1,0.3,1,1 PL:GT:GQ 122,0,128:0/1:99 +chr2a 88824857 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr2a 93546675 . C T 26 . DP=6;AF1=0.5;CI95=0.5,0.5;DP4=4,0,2,0;MQ=46;PV4=1,1,1,1 PL:GT:GQ 56,0,87:0/1:59 +chr2a 94788853 . A G 34.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 67,15,0:1/1:75 +chr2a 96738146 . T C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr2a 102737384 . A G 12.3 . DP=18;AF1=1;CI95=1,1;DP4=0,0,18,0;MQ=11 PL:GT:GQ 45,54,0:1/1:99 +chr2a 103407172 . A G 35 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=19 PL:GT:GQ 68,24,0:1/1:96 +chr2a 105774580 . T G 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=30 PL:GT:GQ 135,39,0:1/1:99 +chr2a 106376301 . C G 24.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=19 PL:GT:GQ 57,18,0:1/1:90 +chr2a 106376315 . C T 8.75 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=19 PL:GT:GQ 41,18,0:1/1:90 +chr2a 112422267 . C T 30 . DP=20;AF1=0.5;CI95=0.5,0.5;DP4=14,0,5,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 60,0,131:0/1:63 +chr2b 3049384 . A C 14.9 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 3049385 . G C 14.9 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 3049406 . C G 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=36 PL:GT:GQ 135,18,0:1/1:90 +chr2b 4213802 . T C 89.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr2b 5022895 . G A 66 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=49 PL:GT:GQ 99,30,0:1/1:99 +chr2b 6037666 . G T 56 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=17 PL:GT:GQ 89,39,0:1/1:99 +chr2b 13656952 . G A 19.2 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=21 PL:GT:GQ 52,18,0:1/1:90 +chr2b 15026944 . A G 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 37,6,0:1/1:49 +chr2b 23362613 . A G 5.64 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 37,15,0:1/1:75 +chr2b 45947861 . C G 68 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=50 PL:GT:GQ 101,33,0:1/1:99 +chr2b 46597824 . T C 65.6 . DP=39;AF1=0.5939;CI95=0.5,1;DP4=23,0,10,0;MQ=22;PV4=1,0.014,1,1 PL:GT:GQ 95,0,5:0/1:7 +chr2b 49665191 . G T 34.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=37 PL:GT:GQ 67,21,0:1/1:84 +chr2b 61001546 . A G 48 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=26 PL:GT:GQ 81,24,0:1/1:96 +chr2b 88502851 . T C 4.77 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,2;MQ=37;PV4=1,1,0.46,1 PL:GT:GQ 33,0,34:0/1:33 +chr2b 91675431 . C T 30 . DP=14;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=27 PL:GT:GQ 63,24,0:1/1:96 +chr2b 91870148 . T G 67 . DP=14;AF1=1;CI95=1,1;DP4=0,1,0,13;MQ=47;PV4=1,1,1,1 PL:GT:GQ 100,31,0:1/1:99 +chr2b 97066826 . G A 20.1 . DP=9;AF1=0.5001;CI95=0.5,0.5;DP4=0,6,0,2;MQ=31;PV4=1,1,1,1 PL:GT:GQ 50,0,35:0/1:38 +chr2b 97670822 . G A 4.85 . DP=6;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=18 PL:GT:GQ 36,18,0:1/1:90 +chr2b 102773175 . A G 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 49,9,0:1/1:63 +chr2b 109805532 . T C 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=45 PL:GT:GQ 176,24,0:1/1:96 +chr2b 110841448 . A G 11.1 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 42,6,0:1/1:49 +chr2b 123217025 . T C 31.5 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=37 PL:GT:GQ 64,12,0:1/1:72 +chr2b 123263214 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 43,9,0:1/1:63 +chr2b 127747292 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=52 PL:GT:GQ 100,9,0:1/1:63 +chr2b 130121958 . A G 89.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 122,15,0:1/1:75 +chr2b 130253633 . A G 14.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 130692761 . C T 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=51 PL:GT:GQ 82,18,0:1/1:90 +chr2b 130743365 . A G 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=42 PL:GT:GQ 140,15,0:1/1:75 +chr2b 131553874 . A C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=37 PL:GT:GQ 43,9,0:1/1:63 +chr2b 131716894 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=40 PL:GT:GQ 137,24,0:1/1:96 +chr2b 131716936 . G A 99 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=36 PL:GT:GQ 173,36,0:1/1:99 +chr2b 131716952 . A G 99 . DP=22;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,14;MQ=36;PV4=1,1,1,1 PL:GT:GQ 152,0,43:0/1:46 +chr2b 133360184 . C T 99 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,20;MQ=32 PL:GT:GQ 163,60,0:1/1:99 +chr2b 133644741 . T A 16.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=27 PL:GT:GQ 49,15,0:1/1:75 +chr2b 133720595 . T C 41 . DP=15;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=29 PL:GT:GQ 74,36,0:1/1:99 +chr2b 133727192 . C T 19.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 52,15,0:1/1:75 +chr2b 133727260 . G A 3.56 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=18 PL:GT:GQ 34,24,0:1/1:95 +chr2b 133800294 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=23 PL:GT:GQ 40,6,0:1/1:49 +chr2b 134582754 . A C 56.1 . DP=37;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=36 PL:GT:GQ 89,21,0:1/1:84 +chr2b 134582763 . G C 78 . DP=37;AF1=1;CI95=1,1;DP4=0,0,0,36;MQ=34 PL:GT:GQ 111,108,0:1/1:99 +chr2b 134809668 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr3 527814 . C G 46 . DP=9;AF1=0.5;CI95=0.5,0.5;DP4=6,0,3,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 76,0,106:0/1:79 +chr3 559510 . G A 38 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=10,0,17,0;MQ=28;PV4=1,1,0.014,1 PL:GT:GQ 68,0,111:0/1:71 +chr3 879433 . T G 32 . DP=4;AF1=0.5001;CI95=0.5,0.5;DP4=2,0,2,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 62,0,34:0/1:37 +chr3 1809645 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr3 3235812 . C T 7.59 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 38,6,0:1/1:49 +chr3 3250176 . A G 83 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=32 PL:GT:GQ 116,24,0:1/1:96 +chr3 5049073 . T A 99 . DP=25;AF1=0.5;CI95=0.5,0.5;DP4=16,0,9,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 136,0,129:0/1:99 +chr3 5142874 . G A 99 . DP=38;AF1=1;CI95=1,1;DP4=0,0,38,0;MQ=28 PL:GT:GQ 179,114,0:1/1:99 +chr3 5554864 . T C 3.54 . DP=7;AF1=0.4999;CI95=0.5,0.5;DP4=0,4,0,3;MQ=27;PV4=1,1,1,1 PL:GT:GQ 31,0,35:0/1:33 +chr3 5749648 . G A 21.2 . DP=26;AF1=0.7303;CI95=0.5,1;DP4=0,7,0,7;MQ=26;PV4=1,0.16,1,0.17 PL:GT:GQ 50,0,2:0/1:3 +chr3 16451708 . A T 71.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=38 PL:GT:GQ 104,15,0:1/1:75 +chr3 23410276 . G A 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 140,15,0:1/1:75 +chr3 51368824 . A G 28 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 60,9,0:1/1:63 +chr3 53000453 . A G 54 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=19 PL:GT:GQ 87,30,0:1/1:99 +chr3 53000463 . A G 54 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=19 PL:GT:GQ 87,30,0:1/1:99 +chr3 59077423 . C T 77.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=33 PL:GT:GQ 110,15,0:1/1:75 +chr3 60040501 . T C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 43,9,0:1/1:63 +chr3 64203481 . A G 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 66,12,0:1/1:72 +chr3 67947441 . C T 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr3 76372631 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 76,9,0:1/1:63 +chr3 80611316 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr3 81554381 . G T 17.6 . DP=24;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=26 PL:GT:GQ 50,12,0:1/1:72 +chr3 87614647 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr3 93900455 . A T 11.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=13 PL:GT:GQ 44,15,0:1/1:75 +chr3 96174457 . A G 4.11 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=24 PL:GT:GQ 34,9,0:1/1:63 +chr3 96215569 . A C 3.41 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr3 96587998 . A C 7.08 . DP=9;AF1=1;CI95=1,1;DP4=0,0,6,0;MQ=17 PL:GT:GQ 39,18,0:1/1:90 +chr3 99711220 . A C 12.8 . DP=11;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 42,2,0:1/1:37 +chr3 99789741 . C G 99 . DP=18;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=47 PL:GT:GQ 210,51,0:1/1:99 +chr3 103667651 . A C 3.98 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 33,6,0:1/1:49 +chr3 104604896 . G C 55 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 87,9,0:1/1:63 +chr3 104997217 . G A 33.1 . DP=18;AF1=1;CI95=1,1;DP4=1,0,16,0;MQ=34;PV4=1,3e-10,0.17,0.36 PL:GT:GQ 66,19,0:1/1:76 +chr3 106097816 . A G 28 . DP=15;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=26 PL:GT:GQ 61,45,0:1/1:99 +chr3 106822259 . G C 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=50 PL:GT:GQ 140,15,0:1/1:75 +chr3 109946413 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 44,6,0:1/1:49 +chr3 121238963 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr3 126248567 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 45,6,0:1/1:49 +chr3 129733836 . A G 6.2 . DP=4;AF1=0.5003;CI95=0.5,0.5;DP4=1,0,3,0;MQ=43;PV4=1,0.02,0.31,1 PL:GT:GQ 35,0,28:0/1:30 +chr3 131372785 . C T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=34 PL:GT:GQ 76,9,0:1/1:63 +chr3 132290987 . C T 22 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=45 PL:GT:GQ 54,9,0:1/1:63 +chr3 136054421 . C T 73 . DP=82;AF1=1;CI95=1,1;DP4=0,0,78,0;MQ=28 PL:GT:GQ 106,235,0:1/1:99 +chr3 141075246 . G A 30.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=41 PL:GT:GQ 62,6,0:1/1:49 +chr3 141075262 . T G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=41 PL:GT:GQ 73,6,0:1/1:49 +chr3 141430649 . G T 81.8 . DP=6;AF1=1;CI95=0.5,1;DP4=0,1,0,4;MQ=41;PV4=1,0.34,1,0.25 PL:GT:GQ 113,6,0:1/1:49 +chr3 143617747 . G T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 54,9,0:1/1:63 +chr3 163576128 . C T 5.6 . DP=4;AF1=0.7302;CI95=0.5,1;DP4=2,0,2,0;MQ=23;PV4=1,1,1,1 PL:GT:GQ 33,0,2:0/1:3 +chr3 163839828 . A G 4.45 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=26 PL:GT:GQ 35,12,0:1/1:72 +chr3 175839340 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr3 190193258 . G T 3.98 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 33,6,0:1/1:49 +chr3 190777007 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr3 190970350 . A G 61 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=37 PL:GT:GQ 94,30,0:1/1:99 +chr3 198686408 . G A 36.6 . DP=17;AF1=1;CI95=0.5,1;DP4=0,1,0,16;MQ=25;PV4=1,1,0.026,1 PL:GT:GQ 69,11,0:1/1:66 +chr3 199277478 . T C 3.61 . DP=6;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=21 PL:GT:GQ 34,18,0:1/1:90 +chr3 199780181 . G T 77 . DP=45;AF1=0.5;CI95=0.5,0.5;DP4=0,35,0,10;MQ=33;PV4=1,1,1,1 PL:GT:GQ 107,0,114:0/1:99 +chr3 199889335 . A C 9.54 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=18 PL:GT:GQ 42,24,0:1/1:96 +chr3 200018161 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr4 195475 . A G 13 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 44,6,0:1/1:49 +chr4 639141 . C A 14.9 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr4 639152 . C T 15.2 . DP=17;AF1=0.5016;CI95=0.5,0.5;DP4=0,2,0,2;MQ=33;PV4=1,1,1,1 PL:GT:GQ 45,0,22:0/1:25 +chr4 986497 . G T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=33 PL:GT:GQ 163,30,0:1/1:99 +chr4 986516 . C T 55.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=37 PL:GT:GQ 88,21,0:1/1:84 +chr4 1207485 . A C 14.9 . DP=22;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 46,6,0:1/1:49 +chr4 1323502 . G A 13.2 . DP=13;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=22 PL:GT:GQ 46,33,0:1/1:99 +chr4 1613521 . G A 89 . DP=16;AF1=1;CI95=1,1;DP4=0,0,16,0;MQ=32 PL:GT:GQ 122,48,0:1/1:99 +chr4 1748790 . C T 38 . DP=21;AF1=0.5005;CI95=0.5,0.5;DP4=6,0,8,0;MQ=40;PV4=1,0.09,1,1 PL:GT:GQ 68,0,27:0/1:30 +chr4 2255732 . T C 99 . DP=29;AF1=1;CI95=1,1;DP4=0,0,28,0;MQ=31 PL:GT:GQ 186,84,0:1/1:99 +chr4 3010159 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr4 3545023 . A G 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=38 PL:GT:GQ 145,27,0:1/1:99 +chr4 3586344 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr4 3879337 . A G 16.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 49,12,0:1/1:72 +chr4 3940733 . A G 47.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 80,15,0:1/1:75 +chr4 4410338 . T C 13.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=31 PL:GT:GQ 46,15,0:1/1:75 +chr4 4796408 . T C 41 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=17 PL:GT:GQ 74,48,0:1/1:99 +chr4 4796414 . A G 11.3 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=17 PL:GT:GQ 44,45,0:1/1:99 +chr4 6436959 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr4 9494256 . T C 3.41 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=37 PL:GT:GQ 32,6,0:1/1:49 +chr4 24881479 . G A 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 46,9,0:1/1:63 +chr4 26128644 . A G 23 . DP=18;AF1=0.5006;CI95=0.5,0.5;DP4=8,0,10,0;MQ=22;PV4=1,1,1,1 PL:GT:GQ 53,0,26:0/1:29 +chr4 42109100 . G A 17.1 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 49,9,0:1/1:63 +chr4 42309652 . C T 68 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr4 46913966 . C T 9.08 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=16 PL:GT:GQ 41,12,0:1/1:72 +chr4 50335142 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr4 51658550 . C A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr4 58258023 . T C 26 . DP=5;AF1=0.5002;CI95=0.5,0.5;DP4=0,3,0,2;MQ=34;PV4=1,1,1,0.05 PL:GT:GQ 56,0,32:0/1:35 +chr4 59219112 . C A 42.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=50 PL:GT:GQ 75,12,0:1/1:72 +chr4 62746067 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr4 67404338 . G T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=39 PL:GT:GQ 66,12,0:1/1:72 +chr4 73353380 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr4 73946294 . G C 4.77 . DP=51;AF1=0.4999;CI95=0.5,0.5;DP4=0,5,0,3;MQ=40;PV4=1,0.19,0.37,0.11 PL:GT:GQ 33,0,64:0/1:36 +chr4 79607484 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr4 82337365 . G C 90 . DP=54;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=28 PL:GT:GQ 123,48,0:1/1:99 +chr4 82653801 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 34,9,0:1/1:63 +chr4 87130164 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 43,9,0:1/1:63 +chr4 87130176 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 43,9,0:1/1:63 +chr4 91459729 . C A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr4 96130778 . G C 99 . DP=19;AF1=1;CI95=1,1;DP4=0,0,0,19;MQ=45 PL:GT:GQ 211,57,0:1/1:99 +chr4 100709417 . A G 45.1 . DP=16;AF1=0.505;CI95=0.5,0.5;DP4=12,0,4,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 75,0,17:0/1:20 +chr4 107276770 . C T 70 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,6;MQ=31;PV4=1,1,1,1 PL:GT:GQ 100,0,97:0/1:98 +chr4 115327550 . G C 42 . DP=67;AF1=1;CI95=1,1;DP4=0,1,0,66;MQ=35;PV4=1,3.2e-24,0.13,1 PL:GT:GQ 75,162,0:1/1:99 +chr4 136558502 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr4 159572459 . G A 15.1 . DP=126;AF1=0.5;CI95=0.5,0.5;DP4=0,69,0,57;MQ=39;PV4=1,4.1e-96,0.077,1 PL:GT:GQ 45,0,175:0/1:48 +chr4 174968484 . G C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 40,6,0:1/1:49 +chr4 175030633 . T C 14.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=29 PL:GT:GQ 47,18,0:1/1:90 +chr4 183410027 . G T 6.2 . DP=31;AF1=0.5003;CI95=0.5,0.5;DP4=2,0,2,0;MQ=45;PV4=1,0.035,1,0.21 PL:GT:GQ 35,0,28:0/1:30 +chr4 190907368 . T C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=50 PL:GT:GQ 66,12,0:1/1:72 +chr4 192175690 . A G 76.8 . DP=7;AF1=0.95;CI95=0.5,1;DP4=0,3,0,4;MQ=35;PV4=1,1,1,1 PL:GT:GQ 105,0,0:1/1:10 +chr4 192673268 . G A 14.2 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=22 PL:GT:GQ 47,27,0:1/1:99 +chr4 192943966 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr4 195460104 . C G 23.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=19 PL:GT:GQ 56,24,0:1/1:96 +chr4 198277830 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr5 170098 . A G 13 . DP=12;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 44,6,0:1/1:49 +chr5 395814 . T C 4.77 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,2;MQ=36;PV4=1,1,0.48,1 PL:GT:GQ 33,0,33:0/1:33 +chr5 414024 . T A 10.4 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=20 PL:GT:GQ 42,9,0:1/1:63 +chr5 496767 . T C 13.9 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr5 805676 . C G 45 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=32 PL:GT:GQ 78,51,0:1/1:99 +chr5 1252896 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr5 1418370 . G A 3.65 . DP=8;AF1=0.7301;CI95=0.5,1;DP4=4,0,4,0;MQ=13;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr5 1494911 . G C 62 . DP=9;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=46 PL:GT:GQ 95,24,0:1/1:96 +chr5 1494932 . C T 6.98 . DP=8;AF1=0.5001;CI95=0.5,0.5;DP4=1,0,2,0;MQ=46;PV4=1,0.1,0.077,1 PL:GT:GQ 36,0,31:0/1:33 +chr5 1506037 . T C 24.1 . DP=24;AF1=1;CI95=0.5,1;DP4=11,0,13,0;MQ=16;PV4=1,1,1,1 PL:GT:GQ 55,5,0:1/1:46 +chr5 1509406 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 73,6,0:1/1:49 +chr5 1733649 . A G 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,25;MQ=47 PL:GT:GQ 212,75,0:1/1:99 +chr5 1747304 . A G 12.3 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=19 PL:GT:GQ 45,36,0:1/1:99 +chr5 1747308 . C A 44 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=19 PL:GT:GQ 77,36,0:1/1:99 +chr5 3519783 . C T 21.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=18 PL:GT:GQ 54,24,0:1/1:96 +chr5 4101593 . A G 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=43 PL:GT:GQ 102,12,0:1/1:72 +chr5 7204332 . T A 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=24 PL:GT:GQ 34,6,0:1/1:49 +chr5 11510398 . A C 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=51;PV4=1,1,0,1 PL:GT:GQ 64,0,31:0/1:34 +chr5 15406720 . T C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 36,6,0:1/1:49 +chr5 25152417 . C A 10.9 . DP=28;AF1=0.5718;CI95=0.5,1;DP4=0,2,0,6;MQ=25;PV4=1,1,0.21,1 PL:GT:GQ 40,0,6:0/1:8 +chr5 39072637 . A G 35.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=50 PL:GT:GQ 68,15,0:1/1:75 +chr5 46022699 . G A 44 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 76,9,0:1/1:63 +chr5 55664181 . C G 10.4 . DP=8;AF1=0.9999;CI95=0.5,1;DP4=3,0,5,0;MQ=18;PV4=1,1,1,1 PL:GT:GQ 40,3,0:1/1:41 +chr5 56253386 . T C 50.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=36 PL:GT:GQ 83,21,0:1/1:84 +chr5 56253447 . C T 42.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=45 PL:GT:GQ 75,12,0:1/1:72 +chr5 71950166 . G T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr5 72703090 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 40,6,0:1/1:49 +chr5 73570280 . G T 5.45 . DP=41;AF1=1;CI95=1,1;DP4=0,0,41,0;MQ=15 PL:GT:GQ 37,123,0:1/1:99 +chr5 73701762 . G T 40.8 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 72,6,0:1/1:49 +chr5 76956867 . T C 10.2 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 41,6,0:1/1:49 +chr5 79097961 . C G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 54,9,0:1/1:63 +chr5 87026167 . T C 22 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr5 97680525 . T C 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=23 PL:GT:GQ 33,12,0:1/1:72 +chr5 100674737 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr5 105389966 . T C 3.52 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=15 PL:GT:GQ 33,9,0:1/1:63 +chr5 109998341 . A C 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr5 120629105 . C T 6.79 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 37,6,0:1/1:49 +chr5 128383954 . C T 23 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=0,5,0,5;MQ=48;PV4=1,3.3e-07,1,1 PL:GT:GQ 53,0,98:0/1:56 +chr5 133925142 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr5 135375404 . T C 11.8 . DP=6;AF1=1;CI95=0.5,1;DP4=1,0,3,0;MQ=31;PV4=1,0.03,1,1 PL:GT:GQ 42,4,0:1/1:45 +chr5 136498281 . T G 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr5 136717285 . A G 82.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 115,12,0:1/1:72 +chr5 136910734 . G A 62 . DP=19;AF1=1;CI95=1,1;DP4=0,1,0,13;MQ=23;PV4=1,1,1,1 PL:GT:GQ 95,31,0:1/1:99 +chr5 141208149 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr5 148056348 . C A 37.1 . DP=4;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=38;PV4=1,1,1,1 PL:GT:GQ 66,1,0:1/1:23 +chr5 151941534 . G T 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=34 PL:GT:GQ 79,12,0:1/1:72 +chr5 159967229 . G C 22.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 55,12,0:1/1:72 +chr5 174024541 . T G 29.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 59,2,0:1/1:37 +chr5 175525290 . A G 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=20 PL:GT:GQ 33,12,0:1/1:72 +chr5 175988954 . A C 14.2 . DP=23;AF1=0.5;CI95=0.5,0.5;DP4=0,6,0,4;MQ=47;PV4=1,1,0.2,1 PL:GT:GQ 44,0,76:0/1:47 +chr5 176782226 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr5 179132834 . C G 99 . DP=28;AF1=1;CI95=1,1;DP4=0,0,0,28;MQ=41 PL:GT:GQ 207,84,0:1/1:99 +chr5 180155809 . G C 3.01 . DP=36;AF1=0.4997;CI95=0.5,0.5;DP4=25,0,9,0;MQ=35;PV4=1,1e-15,1,1 PL:GT:GQ 30,0,121:0/1:33 +chr5 181282819 . T G 38.3 . DP=11;AF1=1;CI95=0.5,1;DP4=0,2,0,9;MQ=23;PV4=1,1,1,1 PL:GT:GQ 71,14,0:1/1:70 +chr5 182426125 . G C 29 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=26 PL:GT:GQ 61,9,0:1/1:63 +chr5 182443682 . G A 3.69 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=21 PL:GT:GQ 34,15,0:1/1:75 +chr5 183008993 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr5 183312016 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr6_cox_hap1 519146 . G A 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=30 PL:GT:GQ 49,9,0:1/1:63 +chr6_cox_hap1 687497 . A G 33 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=2,0,4,0;MQ=35;PV4=1,0.0016,1,1 PL:GT:GQ 63,3,0:1/1:41 +chr6_qbl_hap2 120066 . T C 99 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 139,27,0:1/1:99 +chr6 277954 . C T 53 . DP=41;AF1=1;CI95=1,1;DP4=4,0,37,0;MQ=19;PV4=1,1,0.3,1 PL:GT:GQ 86,49,0:1/1:99 +chr6 593158 . A G 4.61 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 34,6,0:1/1:49 +chr6 2865562 . T G 25 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=23 PL:GT:GQ 58,27,0:1/1:99 +chr6 3751403 . G A 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=32 PL:GT:GQ 75,15,0:1/1:75 +chr6 3884989 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr6 4127278 . A T 13.9 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr6 5887783 . C G 99 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=34 PL:GT:GQ 142,21,0:1/1:84 +chr6 5887811 . C T 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=34 PL:GT:GQ 88,21,0:1/1:84 +chr6 6937170 . G C 99 . DP=47;AF1=1;CI95=1,1;DP4=0,0,0,47;MQ=28 PL:GT:GQ 157,141,0:1/1:99 +chr6 7262317 . C T 13.2 . DP=50;AF1=0.5;CI95=0.5,0.5;DP4=21,0,9,0;MQ=36;PV4=1,4e-05,0.17,0.26 PL:GT:GQ 43,0,158:0/1:46 +chr6 7533214 . A G 10.4 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 42,9,0:1/1:63 +chr6 20979907 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=38 PL:GT:GQ 76,9,0:1/1:63 +chr6 22321632 . A G 41 . DP=5;AF1=0.5004;CI95=0.5,0.5;DP4=1,0,3,0;MQ=46;PV4=1,0.24,0.19,0.33 PL:GT:GQ 71,0,28:0/1:31 +chr6 25352296 . G A 7.8 . DP=4;AF1=0.5003;CI95=0.5,0.5;DP4=0,1,0,3;MQ=38;PV4=1,1,0.16,1 PL:GT:GQ 37,0,28:0/1:30 +chr6 26298040 . T A 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=48;PV4=1,1,0.21,0.33 PL:GT:GQ 64,0,31:0/1:34 +chr6 33428755 . G A 70 . DP=14;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=32 PL:GT:GQ 103,27,0:1/1:99 +chr6 39512099 . G A 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=50 PL:GT:GQ 88,21,0:1/1:84 +chr6 39961094 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr6 40452120 . A G 40.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 72,6,0:1/1:49 +chr6 43204766 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=51 PL:GT:GQ 176,24,0:1/1:96 +chr6 52696512 . C T 70 . DP=76;AF1=0.5;CI95=0.5,0.5;DP4=0,34,0,42;MQ=18;PV4=1,0.11,1,1 PL:GT:GQ 100,0,51:0/1:54 +chr6 53785550 . A G 99 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=46 PL:GT:GQ 190,30,0:1/1:99 +chr6 53897484 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr6 57038290 . C T 10.2 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 41,6,0:1/1:49 +chr6 62925087 . G C 35 . DP=5;AF1=0.5008;CI95=0.5,0.5;DP4=1,0,4,0;MQ=36;PV4=1,1,0.2,1 PL:GT:GQ 65,0,25:0/1:28 +chr6 62925094 . T C 25.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=36 PL:GT:GQ 58,15,0:1/1:75 +chr6 70834405 . G A 72.1 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=29 PL:GT:GQ 105,21,0:1/1:84 +chr6 71026058 . C T 48.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=42 PL:GT:GQ 81,18,0:1/1:90 +chr6 74420752 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 76,9,0:1/1:63 +chr6 77498624 . T C 16.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 48,6,0:1/1:49 +chr6 80416836 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr6 113611590 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=46 PL:GT:GQ 100,9,0:1/1:63 +chr6 119308431 . T C 38.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=40 PL:GT:GQ 71,12,0:1/1:72 +chr6 151758592 . T C 3.07 . DP=17;AF1=0.9966;CI95=0.5,1;DP4=0,8,0,9;MQ=13;PV4=1,1,1,1 PL:GT:GQ 29,1,0:1/1:23 +chr6 151759358 . A G 99 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=12,0,15,0;MQ=44;PV4=1,1,1,0.19 PL:GT:GQ 171,0,128:0/1:99 +chr6 154741755 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr6 161061053 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=52 PL:GT:GQ 40,6,0:1/1:49 +chr6 161474189 . C T 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 36,6,0:1/1:49 +chr6 164304657 . C T 10.4 . DP=63;AF1=0.5;CI95=0.5,0.5;DP4=0,29,0,19;MQ=22;PV4=1,7.7e-11,1,0.049 PL:GT:GQ 40,0,37:0/1:38 +chr6 164703105 . T C 99 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=40 PL:GT:GQ 165,30,0:1/1:99 +chr6 167518328 . A G 78 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=27,0,14,0;MQ=33;PV4=1,0.026,0.43,0.056 PL:GT:GQ 108,0,149:0/1:99 +chr6 169906323 . G A 41.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr6 171893912 . G A 69.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=33 PL:GT:GQ 102,15,0:1/1:75 +chr6 173631604 . A G 6.98 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=4,0,3,0;MQ=37;PV4=1,0.069,1,1 PL:GT:GQ 36,0,34:0/1:35 +chr7 835856 . C T 27.5 . DP=13;AF1=0.9998;CI95=0.5,1;DP4=4,0,6,0;MQ=23;PV4=1,0.46,1,1 PL:GT:GQ 57,2,0:1/1:37 +chr7 1046005 . C T 11.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 43,9,0:1/1:63 +chr7 1564339 . C T 71 . DP=66;AF1=0.5;CI95=0.5,0.5;DP4=36,0,24,0;MQ=29;PV4=1,1,0.35,1 PL:GT:GQ 101,0,134:0/1:99 +chr7 1806266 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr7 1936013 . G T 7.77 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=17 PL:GT:GQ 39,9,0:1/1:63 +chr7 2319532 . C A 4.11 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=14 PL:GT:GQ 34,9,0:1/1:63 +chr7 2682121 . C T 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr7 3248116 . T C 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=37;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr7 3624766 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 40,6,0:1/1:49 +chr7 5291140 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr7 5314457 . C A 3.56 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=18 PL:GT:GQ 34,24,0:1/1:95 +chr7 5595072 . T A 79 . DP=13;AF1=0.5;CI95=0.5,0.5;DP4=8,0,5,0;MQ=31;PV4=1,1,1,1 PL:GT:GQ 109,0,57:0/1:60 +chr7 5646060 . G C 7.79 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=10 PL:GT:GQ 40,30,0:1/1:99 +chr7 6056816 . C G 7.08 . DP=6;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=23;PV4=1,1,1,1 PL:GT:GQ 35,1,0:1/1:23 +chr7 6412641 . C T 40 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=33 PL:GT:GQ 73,33,0:1/1:99 +chr7 6766874 . A G 34.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=43 PL:GT:GQ 67,15,0:1/1:75 +chr7 8482729 . C T 5.08 . DP=16;AF1=0.8276;CI95=0.5,1;DP4=3,0,3,0;MQ=22;PV4=1,1,1,0.19 PL:GT:GQ 32,0,1:1/1:5 +chr7 9238362 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr7 9687781 . G A 33 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=0,16,0,12;MQ=48;PV4=1,6.5e-38,1,1 PL:GT:GQ 63,0,170:0/1:66 +chr7 9752803 . A T 14.2 . DP=17;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=18 PL:GT:GQ 47,27,0:1/1:99 +chr7 10240910 . T C 45.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 78,12,0:1/1:72 +chr7 11046187 . C T 86.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=47 PL:GT:GQ 119,12,0:1/1:72 +chr7 11548207 . C G 14.6 . DP=13;AF1=1;CI95=0.5,1;DP4=6,1,0,5;MQ=18;PV4=0.015,1,1,1 PL:GT:GQ 46,7,0:1/1:57 +chr7 11580317 . C T 42 . DP=12;AF1=1;CI95=1,1;DP4=0,1,0,10;MQ=22;PV4=1,1,1,1 PL:GT:GQ 75,23,0:1/1:92 +chr7 11585384 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr7 13498356 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 73,6,0:1/1:49 +chr7 13500887 . G A 15.1 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=22 PL:GT:GQ 48,30,0:1/1:99 +chr7 13827079 . C T 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 36,6,0:1/1:49 +chr7 14403976 . T G 59 . DP=30;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=39 PL:GT:GQ 92,24,0:1/1:96 +chr7 14756588 . A G 44 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=5,0,10,0;MQ=44;PV4=1,5.3e-18,1,1 PL:GT:GQ 74,0,70:0/1:72 +chr7 14756619 . T G 44 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=5,0,10,0;MQ=44;PV4=1,6.4e-10,1,1 PL:GT:GQ 74,0,70:0/1:72 +chr7 36734598 . A C 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 42,6,0:1/1:49 +chr7 36734599 . A T 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 42,6,0:1/1:49 +chr7 36734603 . G C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 40,6,0:1/1:49 +chr7 40634921 . A C 55 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=39 PL:GT:GQ 88,39,0:1/1:99 +chr7 48271285 . A T 73 . DP=15;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=25 PL:GT:GQ 106,30,0:1/1:99 +chr7 56264700 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr7 62326003 . C A 26.1 . DP=35;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=28 PL:GT:GQ 59,18,0:1/1:90 +chr7 109468934 . T G 5.13 . DP=10;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=39;PV4=1,0.031,1,1 PL:GT:GQ 33,2,0:1/1:37 +chr7 110208327 . C G 16.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 48,6,0:1/1:49 +chr7 125654934 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=27 PL:GT:GQ 34,9,0:1/1:63 +chr7 125770209 . A C 32 . DP=31;AF1=0.5;CI95=0.5,0.5;DP4=11,0,13,0;MQ=34;PV4=1,0.00017,0.16,0.22 PL:GT:GQ 62,0,105:0/1:65 +chr7 125770265 . G C 36 . DP=16;AF1=0.5;CI95=0.5,0.5;DP4=0,5,0,5;MQ=48;PV4=1,0.0047,0.016,0.035 PL:GT:GQ 66,0,110:0/1:69 +chr7 126687042 . A G 21.1 . DP=36;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=22 PL:GT:GQ 54,21,0:1/1:84 +chr7 132292897 . G T 99 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=43 PL:GT:GQ 167,21,0:1/1:84 +chr7 132334562 . A C 23 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=23 PL:GT:GQ 56,30,0:1/1:99 +chr7 132431838 . C T 13.3 . DP=5;AF1=1;CI95=0.5,1;DP4=1,0,4,0;MQ=23;PV4=1,1,1,1 PL:GT:GQ 44,5,0:1/1:46 +chr7 136324945 . T C 13.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 46,12,0:1/1:72 +chr7 136957634 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr7 141746871 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 40,6,0:1/1:49 +chr7 146831870 . C T 4.77 . DP=14;AF1=0.5003;CI95=0.5,0.5;DP4=1,0,3,0;MQ=37;PV4=1,0.0029,0.28,1 PL:GT:GQ 33,0,28:0/1:30 +chr7 147142770 . T C 45 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=31 PL:GT:GQ 77,9,0:1/1:63 +chr7 147713906 . C T 4.77 . DP=8;AF1=0.5002;CI95=0.5,0.5;DP4=2,0,4,0;MQ=35;PV4=1,8.9e-06,0.48,0.27 PL:GT:GQ 33,0,29:0/1:31 +chr7 148742642 . G A 68 . DP=14;AF1=0.5032;CI95=0.5,0.5;DP4=4,0,10,0;MQ=28;PV4=1,1,1,1 PL:GT:GQ 98,0,19:0/1:22 +chr7 148879148 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr7 149484407 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr7 152444478 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 44,6,0:1/1:49 +chr7 154106613 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=51 PL:GT:GQ 100,9,0:1/1:63 +chr7 154776891 . G T 14.4 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 47,15,0:1/1:75 +chr7 155882061 . A C 29 . DP=24;AF1=0.502;CI95=0.5,0.5;DP4=0,1,0,4;MQ=46;PV4=1,0.018,0.15,0.29 PL:GT:GQ 59,0,21:0/1:24 +chr7 155956844 . G C 23 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,4;MQ=38;PV4=1,1,0.38,1 PL:GT:GQ 53,0,103:0/1:56 +chr7 156277694 . G A 62 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=46 PL:GT:GQ 95,24,0:1/1:96 +chr7 156720588 . T C 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr7 156807649 . T C 3.01 . DP=30;AF1=0.4997;CI95=0.5,0.5;DP4=0,4,0,3;MQ=43;PV4=1,0.16,0.15,1 PL:GT:GQ 30,0,72:0/1:33 +chr7 157331292 . G T 43.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=34 PL:GT:GQ 76,21,0:1/1:84 +chr7 157382957 . T C 33.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 66,12,0:1/1:72 +chr8 556382 . A G 37.1 . DP=5;AF1=0.9966;CI95=0.5,1;DP4=2,0,3,0;MQ=31;PV4=1,1,1,1 PL:GT:GQ 66,1,0:1/1:23 +chr8 1661673 . T C 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr8 7379751 . C A 6.24 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=19 PL:GT:GQ 38,21,0:1/1:84 +chr8 8160505 . A T 68.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 101,12,0:1/1:72 +chr8 8160508 . C T 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 57,12,0:1/1:72 +chr8 16781011 . A G 55.5 . DP=9;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=34 PL:GT:GQ 88,12,0:1/1:72 +chr8 18716499 . A T 20 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=0,4,0,2;MQ=29;PV4=1,1,1,1 PL:GT:GQ 50,0,52:0/1:51 +chr8 23326483 . A G 60 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=47 PL:GT:GQ 92,9,0:1/1:63 +chr8 25842819 . T A 12 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 43,6,0:1/1:49 +chr8 26300279 . T C 34 . DP=44;AF1=1;CI95=1,1;DP4=0,0,41,0;MQ=21 PL:GT:GQ 67,123,0:1/1:99 +chr8 29673470 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 73,6,0:1/1:49 +chr8 29673473 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 40,6,0:1/1:49 +chr8 31685466 . C T 34 . DP=17;AF1=0.5;CI95=0.5,0.5;DP4=10,0,5,0;MQ=28;PV4=1,0.072,1,0.36 PL:GT:GQ 64,0,50:0/1:53 +chr8 37378739 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr8 51325952 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr8 59221963 . G A 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr8 62764995 . T G 20 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=32 PL:GT:GQ 52,9,0:1/1:63 +chr8 63157426 . C G 41.6 . DP=22;AF1=1;CI95=0.5,1;DP4=0,7,0,15;MQ=19;PV4=1,1,1,0.25 PL:GT:GQ 74,11,0:1/1:66 +chr8 68710444 . G A 30 . DP=5;AF1=0.6671;CI95=0.5,1;DP4=3,0,2,0;MQ=32;PV4=1,1,1,1 PL:GT:GQ 59,0,3:0/1:5 +chr8 76416560 . G A 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=46 PL:GT:GQ 122,12,0:1/1:72 +chr8 81425275 . T G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr8 89842286 . G C 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=30 PL:GT:GQ 34,6,0:1/1:49 +chr8 100926281 . G A 38 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 70,9,0:1/1:63 +chr8 102746002 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr8 107850176 . C T 43.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=45 PL:GT:GQ 76,18,0:1/1:90 +chr8 109966441 . T C 27.3 . DP=9;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=38 PL:GT:GQ 60,15,0:1/1:75 +chr8 118811716 . G T 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=50 PL:GT:GQ 155,18,0:1/1:90 +chr8 119440254 . A T 58.5 . DP=5;AF1=0.8277;CI95=0.5,1;DP4=2,0,3,0;MQ=34;PV4=1,1,1,0.14 PL:GT:GQ 87,0,1:1/1:5 +chr8 121236024 . G A 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 71,6,0:1/1:49 +chr8 125489079 . C T 13 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr8 128502549 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr8 128502551 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr8 130951113 . G A 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=19 PL:GT:GQ 34,6,0:1/1:49 +chr8 135307123 . G A 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 36,6,0:1/1:49 +chr8 138814155 . C T 57.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 90,18,0:1/1:90 +chr8 140566111 . A G 18.1 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=15 PL:GT:GQ 51,36,0:1/1:99 +chr8 141586480 . T G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr8 143376712 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr8 150662729 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr8 150741294 . A G 25.1 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=34 PL:GT:GQ 58,18,0:1/1:90 +chr8 150975618 . A G 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr8 151580103 . T C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=20 PL:GT:GQ 36,6,0:1/1:49 +chr8 151634410 . G T 48 . DP=17;AF1=0.5;CI95=0.5,0.5;DP4=0,12,0,5;MQ=39;PV4=1,0.072,1,1 PL:GT:GQ 78,0,125:0/1:81 +chr8 151709267 . G A 91.1 . DP=8;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,7;MQ=40;PV4=1,1,0.28,0.37 PL:GT:GQ 121,0,16:0/1:19 +chr8 152636420 . G A 8.75 . DP=3;AF1=0.9966;CI95=0.5,1;DP4=0,1,0,2;MQ=30;PV4=1,1,1,1 PL:GT:GQ 37,1,0:1/1:23 +chr8 152706967 . G A 3.01 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=16 PL:GT:GQ 33,30,0:1/1:99 +chr8 152786522 . T C 80.1 . DP=16;AF1=0.5102;CI95=0.5,0.5;DP4=0,4,0,12;MQ=31;PV4=1,0.25,1,1 PL:GT:GQ 110,0,14:0/1:17 +chr8 152863132 . T G 5.44 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=30 PL:GT:GQ 36,9,0:1/1:63 +chr9 23235268 . C T 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 43,6,0:1/1:49 +chr9 26391176 . T C 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 47,6,0:1/1:49 +chr9 26868232 . C G 63 . DP=20;AF1=0.5025;CI95=0.5,0.5;DP4=7,0,13,0;MQ=22;PV4=1,0.2,1,0.44 PL:GT:GQ 93,0,20:0/1:23 +chr9 34223668 . C T 22 . DP=16;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,7;MQ=27;PV4=1,0.14,0.34,1 PL:GT:GQ 52,0,79:0/1:55 +chr9 39696645 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr9 40654130 . T G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr9 41145321 . T G 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 79,12,0:1/1:72 +chr9 42273483 . G A 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr9 55633192 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 58705807 . T C 70 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=24 PL:GT:GQ 103,30,0:1/1:99 +chr9 61697149 . C G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 63152790 . A C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr9 63703913 . C G 90.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=38 PL:GT:GQ 123,21,0:1/1:84 +chr9 65116068 . T C 70 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=49 PL:GT:GQ 103,39,0:1/1:99 +chr9 71266598 . C A 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 33,6,0:1/1:49 +chr9 73188677 . G T 52 . DP=294;AF1=1;CI95=1,1;DP4=44,0,245,0;MQ=33;PV4=1,0.28,0.0092,1 PL:GT:GQ 85,147,0:1/1:99 +chr9 78854179 . G T 22 . DP=97;AF1=0.5;CI95=0.5,0.5;DP4=21,0,12,0;MQ=44;PV4=1,0.02,0.032,0.0033 PL:GT:GQ 52,0,158:0/1:55 +chr9 82964679 . A C 13.2 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=36 PL:GT:GQ 45,9,0:1/1:63 +chr9 84124545 . G T 57 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=2,0,3,0;MQ=49;PV4=1,1,0.024,1 PL:GT:GQ 87,0,59:0/1:62 +chr9 86552862 . C T 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=26 PL:GT:GQ 47,15,0:1/1:75 +chr9 87548941 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr9 89021101 . G A 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr9 90447825 . G A 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 40,6,0:1/1:49 +chr9 92462035 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 40,6,0:1/1:49 +chr9 93077294 . T G 5.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=31 PL:GT:GQ 36,9,0:1/1:63 +chr9 93998137 . G A 68 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=46 PL:GT:GQ 100,9,0:1/1:63 +chr9 93998148 . C T 21.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=36 PL:GT:GQ 54,15,0:1/1:75 +chr9 95028964 . C A 99 . DP=83;AF1=0.5;CI95=0.5,0.5;DP4=0,57,0,26;MQ=32;PV4=1,9.3e-08,1,0.092 PL:GT:GQ 134,0,120:0/1:99 +chr9 103829155 . A G 33 . DP=96;AF1=1;CI95=1,1;DP4=0,0,96,0;MQ=16 PL:GT:GQ 66,255,0:1/1:99 +chr9 104981331 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 73,6,0:1/1:49 +chr9 111070656 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 117395657 . T C 16.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 49,15,0:1/1:75 +chr9 117718907 . A G 46.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=29 PL:GT:GQ 79,18,0:1/1:90 +chr9 119149161 . T C 3.14 . DP=65;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 33,15,0:1/1:75 +chr9 124528802 . G A 78 . DP=23;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=25 PL:GT:GQ 111,39,0:1/1:99 +chr9 126707903 . G A 26 . DP=37;AF1=0.5;CI95=0.5,0.5;DP4=0,21,0,8;MQ=46;PV4=1,2.6e-07,0.21,0.42 PL:GT:GQ 56,0,175:0/1:59 +chr9 128700686 . C G 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 66,12,0:1/1:72 +chr9 129084077 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr9 129116900 . A T 20 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 52,9,0:1/1:63 +chr9 130290720 . C G 21.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 53,6,0:1/1:49 +chr9 130306057 . C G 71 . DP=14;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=28 PL:GT:GQ 104,42,0:1/1:99 +chr9 130528990 . G A 99 . DP=31;AF1=1;CI95=1,1;DP4=0,0,31,0;MQ=27 PL:GT:GQ 174,93,0:1/1:99 +chr9 130529002 . A T 7.79 . DP=30;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=15 PL:GT:GQ 40,33,0:1/1:99 +chr9 130639996 . A G 8.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 39,6,0:1/1:49 +chr9 130704890 . A G 3.27 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=26 PL:GT:GQ 33,12,0:1/1:72 +chr9 130708345 . G A 13.3 . DP=11;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=38;PV4=1,0.096,1,1 PL:GT:GQ 42,1,0:1/1:23 +chr9 131001601 . T A 3.98 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 33,6,0:1/1:49 +chr9 131058539 . T A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 44,6,0:1/1:49 +chr9 131808965 . C T 42 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 75,27,0:1/1:99 +chr9 132551867 . C T 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 49,9,0:1/1:63 +chr9 132685120 . A G 4.75 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 35,9,0:1/1:63 +chr9 133175050 . A G 18.1 . DP=30;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=20 PL:GT:GQ 51,51,0:1/1:99 +chr9 133584978 . A G 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,25,0;MQ=45 PL:GT:GQ 212,75,0:1/1:99 +chr9 133661895 . A G 99 . DP=17;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=31 PL:GT:GQ 138,42,0:1/1:99 +chr9 133670376 . T C 68 . DP=19;AF1=1;CI95=1,1;DP4=0,1,0,16;MQ=39;PV4=1,1.4e-20,1,1 PL:GT:GQ 101,39,0:1/1:99 +chr9 133843777 . T C 99 . DP=9;AF1=0.5129;CI95=0.5,0.5;DP4=1,0,8,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 154,0,13:0/1:16 +chr9 134017265 . G C 3.27 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=13 PL:GT:GQ 33,12,0:1/1:72 +chr9 134105563 . T C 34.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=39 PL:GT:GQ 67,18,0:1/1:90 +chr9 134608906 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr9 134861929 . T A 9.49 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 41,9,0:1/1:63 +chr10 796662 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 54,9,0:1/1:63 +chr10 1216716 . T A 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr10 1220781 . G A 21 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=18 PL:GT:GQ 54,27,0:1/1:99 +chr10 1225208 . T C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=47 PL:GT:GQ 100,9,0:1/1:63 +chr10 1727946 . T C 14.2 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=27 PL:GT:GQ 47,21,0:1/1:84 +chr10 5986542 . T C 83 . DP=93;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=39 PL:GT:GQ 116,30,0:1/1:99 +chr10 6436277 . G A 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 36,6,0:1/1:49 +chr10 7704114 . C A 35 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=0,2,0,4;MQ=29;PV4=1,0.27,1,0.27 PL:GT:GQ 65,3,0:1/1:41 +chr10 10881734 . A G 9.52 . DP=9;AF1=0.5;CI95=0.5,0.5;DP4=4,0,5,0;MQ=42;PV4=1,0.0026,0.14,1 PL:GT:GQ 39,0,91:0/1:42 +chr10 13099383 . G A 27.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 60,12,0:1/1:72 +chr10 15764077 . G C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr10 18091502 . T C 47 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 79,9,0:1/1:63 +chr10 19645913 . A T 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 47,6,0:1/1:49 +chr10 22845062 . C T 18.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=18 PL:GT:GQ 51,21,0:1/1:84 +chr10 28282802 . T C 69 . DP=12;AF1=1;CI95=1,1;DP4=0,0,12,0;MQ=42 PL:GT:GQ 102,36,0:1/1:99 +chr10 28496872 . T G 8.44 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 39,6,0:1/1:49 +chr10 32746793 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr10 41437604 . T G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr10 43051239 . C T 6.98 . DP=3;AF1=0.5001;CI95=0.5,0.5;DP4=1,0,2,0;MQ=40;PV4=1,0.33,0.33,1 PL:GT:GQ 36,0,31:0/1:33 +chr10 44455192 . C T 4.41 . DP=6;AF1=0.8276;CI95=0.5,1;DP4=0,3,0,3;MQ=21;PV4=1,1,1,1 PL:GT:GQ 31,0,1:1/1:5 +chr10 48387336 . A G 13 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr10 51561705 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr10 51561712 . C G 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 71,6,0:1/1:49 +chr10 55617954 . G A 8.44 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 39,6,0:1/1:49 +chr10 55718281 . T A 3.41 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr10 55888771 . T C 23.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 56,12,0:1/1:72 +chr10 56025569 . C G 34.1 . DP=3;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,2;MQ=39;PV4=1,1,1,1 PL:GT:GQ 64,0,16:0/1:19 +chr10 57384943 . G T 84 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=16,0,13,0;MQ=26;PV4=1,0.015,1,1 PL:GT:GQ 114,0,110:0/1:99 +chr10 59873077 . T G 49 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=42 PL:GT:GQ 82,24,0:1/1:96 +chr10 61329572 . C T 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 47,6,0:1/1:49 +chr10 63790636 . T G 32.1 . DP=19;AF1=1;CI95=1,1;DP4=1,0,10,0;MQ=28;PV4=1,0.14,1,1 PL:GT:GQ 65,22,0:1/1:88 +chr10 64466048 . C G 18.2 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=28 PL:GT:GQ 51,18,0:1/1:90 +chr10 65053440 . G T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=39 PL:GT:GQ 153,30,0:1/1:99 +chr10 65407358 . C G 84.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 117,15,0:1/1:75 +chr10 65605291 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr10 66104447 . T C 99 . DP=47;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,21;MQ=34;PV4=1,1,0.15,1 PL:GT:GQ 136,0,162:0/1:99 +chr10 82160859 . G C 99 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=36 PL:GT:GQ 153,39,0:1/1:99 +chr10 82198579 . C T 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr10 87086290 . A G 4.13 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=17 PL:GT:GQ 35,27,0:1/1:99 +chr10 89550621 . T G 74 . DP=47;AF1=1;CI95=1,1;DP4=0,0,0,45;MQ=45 PL:GT:GQ 107,135,0:1/1:99 +chr10 92325046 . G A 42.3 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 75,15,0:1/1:75 +chr10 94488050 . A G 5.46 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=2,0,2,0;MQ=43;PV4=1,0.16,1,1 PL:GT:GQ 34,0,34:0/1:34 +chr10 95024815 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr10 95466306 . G A 53 . DP=7;AF1=0.6671;CI95=0.5,1;DP4=0,4,0,3;MQ=33;PV4=1,1,1,1 PL:GT:GQ 82,0,3:0/1:5 +chr10 100256777 . T G 3.83 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=23 PL:GT:GQ 34,12,0:1/1:72 +chr10 101510485 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr10 101530760 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr10 101879744 . T C 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=44 PL:GT:GQ 54,9,0:1/1:63 +chr10 102147276 . G C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=33 PL:GT:GQ 43,9,0:1/1:63 +chr10 102642248 . T G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr10 107666616 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr10 108319945 . C G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 43,9,0:1/1:63 +chr10 109734371 . G A 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr10 112870604 . C T 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=36 PL:GT:GQ 79,12,0:1/1:72 +chr10 115304673 . T C 11.3 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr10 119380588 . G A 14.2 . DP=4;AF1=0.502;CI95=0.5,0.5;DP4=1,0,3,0;MQ=43;PV4=1,0.18,0.32,1 PL:GT:GQ 44,0,21:0/1:24 +chr10 123063756 . C T 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=23 PL:GT:GQ 46,9,0:1/1:63 +chr10 128424770 . T G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 45,6,0:1/1:49 +chr10 131229204 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr10 132420570 . G C 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr10 132528066 . C T 99 . DP=19;AF1=1;CI95=1,1;DP4=0,0,19,0;MQ=42 PL:GT:GQ 213,57,0:1/1:99 +chr10 132644619 . G A 19.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=23 PL:GT:GQ 52,15,0:1/1:75 +chr10 132707581 . G C 9.11 . DP=51;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=25;PV4=1,1,1,1 PL:GT:GQ 38,2,0:1/1:37 +chr10 133026892 . T C 55.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=44 PL:GT:GQ 88,18,0:1/1:90 +chr11 768033 . T C 33.5 . DP=4;AF1=0.8277;CI95=0.5,1;DP4=0,2,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 62,0,1:1/1:5 +chr11 768042 . T C 33.5 . DP=6;AF1=0.8277;CI95=0.5,1;DP4=0,2,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 62,0,1:1/1:5 +chr11 874568 . G C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 66,12,0:1/1:72 +chr11 1009210 . T C 4 . DP=70;AF1=0.6241;CI95=0.5,1;DP4=0,3,0,8;MQ=24;PV4=1,1,0.5,1 PL:GT:GQ 31,0,4:0/1:6 +chr11 1016692 . C T 27 . DP=39;AF1=1;CI95=1,1;DP4=0,0,0,38;MQ=22 PL:GT:GQ 60,114,0:1/1:99 +chr11 1034477 . A G 66 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 98,9,0:1/1:63 +chr11 1074037 . G A 4.13 . DP=9;AF1=0.5001;CI95=0.5,0.5;DP4=4,0,5,0;MQ=24;PV4=1,1,0.43,1 PL:GT:GQ 32,0,30:0/1:31 +chr11 1556298 . G A 11.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 44,12,0:1/1:72 +chr11 1824777 . T C 27 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=28 PL:GT:GQ 60,30,0:1/1:99 +chr11 3395801 . C T 22 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr11 3411901 . G A 4.75 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 35,9,0:1/1:63 +chr11 3731606 . A C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr11 3783855 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr11 3967636 . A G 4.29 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=24 PL:GT:GQ 35,15,0:1/1:75 +chr11 4385618 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr11 4424365 . T A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr11 5295586 . C T 3.01 . DP=52;AF1=0.4997;CI95=0.5,0.5;DP4=33,0,10,0;MQ=29;PV4=1,0.0045,0.3,0.17 PL:GT:GQ 30,0,131:0/1:33 +chr11 6157144 . C G 45.1 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=35 PL:GT:GQ 78,21,0:1/1:84 +chr11 6352044 . C T 18 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=31 PL:GT:GQ 50,9,0:1/1:63 +chr11 6767356 . T C 9.63 . DP=3;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=29;PV4=1,1,1,1 PL:GT:GQ 38,1,0:1/1:23 +chr11 6999404 . G C 21 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=37 PL:GT:GQ 53,9,0:1/1:63 +chr11 9120930 . C G 17.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr11 9373125 . T C 19.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 51,6,0:1/1:49 +chr11 9585101 . C T 67 . DP=16;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=45 PL:GT:GQ 100,42,0:1/1:99 +chr11 10266192 . A C 14.3 . DP=22;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=27 PL:GT:GQ 47,18,0:1/1:90 +chr11 10303263 . T C 8.64 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,17;MQ=18 PL:GT:GQ 41,51,0:1/1:99 +chr11 10420170 . T C 35 . DP=17;AF1=1;CI95=1,1;DP4=0,1,0,15;MQ=28;PV4=1,0.12,1,0.4 PL:GT:GQ 68,36,0:1/1:99 +chr11 10912169 . G A 99 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=49 PL:GT:GQ 155,18,0:1/1:90 +chr11 11315826 . T G 6.29 . DP=27;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=19 PL:GT:GQ 38,18,0:1/1:90 +chr11 11603859 . A C 22 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,6;MQ=34;PV4=1,9.5e-13,0.22,1 PL:GT:GQ 52,0,115:0/1:55 +chr11 11700034 . C T 33 . DP=11;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=30 PL:GT:GQ 66,27,0:1/1:99 +chr11 11822758 . G A 15.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,3;MQ=38;PV4=1,0.18,1,1 PL:GT:GQ 45,0,88:0/1:48 +chr11 11976636 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=24 PL:GT:GQ 54,9,0:1/1:63 +chr11 14380517 . C G 16.1 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=5,0,5,0;MQ=48;PV4=1,2.1e-05,0.13,1 PL:GT:GQ 46,0,113:0/1:49 +chr11 14419212 . A G 91.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=38 PL:GT:GQ 124,18,0:1/1:90 +chr11 14846792 . A G 55 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=19 PL:GT:GQ 88,33,0:1/1:99 +chr11 15494556 . C T 99 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=22,0,14,0;MQ=34;PV4=1,0.0071,1,1 PL:GT:GQ 146,0,159:0/1:99 +chr11 16262879 . A C 16.1 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=0,1,0,3;MQ=43;PV4=1,0.061,0.24,0.33 PL:GT:GQ 46,0,28:0/1:31 +chr11 21514947 . T C 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=41 PL:GT:GQ 57,12,0:1/1:72 +chr11 22532576 . C G 28 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,17;MQ=17 PL:GT:GQ 61,51,0:1/1:99 +chr11 23529238 . G T 4.29 . DP=13;AF1=0.5334;CI95=0.5,1;DP4=1,0,3,0;MQ=37;PV4=1,1,0.34,0.21 PL:GT:GQ 32,0,9:0/1:12 +chr11 24249554 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr11 24853167 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr11 33353903 . T C 24.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=36 PL:GT:GQ 57,15,0:1/1:75 +chr11 35126569 . T C 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 57,12,0:1/1:72 +chr11 35132248 . C T 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr11 35155482 . T C 68 . DP=22;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=46 PL:GT:GQ 101,66,0:1/1:99 +chr11 52494088 . T C 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 140,27,0:1/1:99 +chr11 57899943 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr11 62261460 . G T 19.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,5;MQ=27;PV4=1,1.1e-06,1,1 PL:GT:GQ 49,0,58:0/1:51 +chr11 67456049 . C T 39.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=19 PL:GT:GQ 72,18,0:1/1:90 +chr11 68509708 . C G 3.65 . DP=9;AF1=0.7301;CI95=0.5,1;DP4=0,5,0,4;MQ=17;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr11 70115115 . T A 99 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=49 PL:GT:GQ 140,15,0:1/1:75 +chr11 72643951 . T C 70 . DP=23;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=39 PL:GT:GQ 103,66,0:1/1:99 +chr11 72647930 . G A 36 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=0,1,0,3;MQ=41;PV4=1,1,0.3,1 PL:GT:GQ 66,0,28:0/1:31 +chr11 73330148 . C T 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr11 81720893 . A G 5.83 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=19 PL:GT:GQ 37,12,0:1/1:72 +chr11 83813797 . A G 23.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 56,12,0:1/1:72 +chr11 85949488 . C A 54 . DP=17;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=37 PL:GT:GQ 87,42,0:1/1:99 +chr11 87634829 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr11 90913093 . A T 35.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 67,6,0:1/1:49 +chr11 93793348 . G A 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=31 PL:GT:GQ 139,24,0:1/1:96 +chr11 100802294 . T C 16.6 . DP=21;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 49,12,0:1/1:72 +chr11 107455449 . C T 8.44 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=26 PL:GT:GQ 39,6,0:1/1:49 +chr11 111344355 . A G 69.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=43 PL:GT:GQ 102,12,0:1/1:72 +chr11 111611115 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr11 113050466 . G C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 36,6,0:1/1:49 +chr11 114332544 . T C 3.54 . DP=17;AF1=0.4999;CI95=0.5,0.5;DP4=0,4,0,5;MQ=37;PV4=1,0.32,0.13,1 PL:GT:GQ 31,0,37:0/1:33 +chr11 114332549 . G A 3.54 . DP=17;AF1=0.4998;CI95=0.5,0.5;DP4=0,9,0,8;MQ=36;PV4=1,3.1e-10,0.088,1 PL:GT:GQ 31,0,127:0/1:34 +chr11 114843578 . G C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr11 115580279 . A G 99 . DP=15;AF1=1;CI95=1,1;DP4=0,0,15,0;MQ=48 PL:GT:GQ 190,45,0:1/1:99 +chr11 116434328 . G A 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr11 125914161 . A G 20.8 . DP=7;AF1=0.95;CI95=0.5,1;DP4=3,0,4,0;MQ=38;PV4=1,0.074,1,1 PL:GT:GQ 49,0,0:1/1:10 +chr11 125917089 . C T 12.3 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=0,28,0,12;MQ=44;PV4=1,4.7e-25,1,1 PL:GT:GQ 42,0,167:0/1:45 +chr11 127194100 . A G 60 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=49 PL:GT:GQ 93,24,0:1/1:96 +chr12 70856 . G A 27.5 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 60,12,0:1/1:72 +chr12 153693 . T C 52.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=38 PL:GT:GQ 85,15,0:1/1:75 +chr12 924547 . C G 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 69,6,0:1/1:49 +chr12 1555916 . G A 7.18 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 39,15,0:1/1:75 +chr12 1919860 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr12 2283756 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr12 2805983 . G C 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr12 6088203 . T C 72.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=37 PL:GT:GQ 105,15,0:1/1:75 +chr12 7099460 . G C 10.8 . DP=6;AF1=0.8277;CI95=0.5,1;DP4=3,0,3,0;MQ=26;PV4=1,0.027,1,1 PL:GT:GQ 39,0,1:1/1:5 +chr12 7099464 . G A 13.3 . DP=6;AF1=0.9966;CI95=0.5,1;DP4=2,0,3,0;MQ=28;PV4=1,0.16,1,1 PL:GT:GQ 42,1,0:1/1:23 +chr12 7198516 . T G 4.61 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 34,6,0:1/1:49 +chr12 23331895 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr12 28209020 . T G 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 47,15,0:1/1:75 +chr12 30074073 . C T 32.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 64,6,0:1/1:49 +chr12 30563452 . T C 25 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 57,9,0:1/1:63 +chr12 30563453 . A G 25 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 57,9,0:1/1:63 +chr12 30563464 . C A 78.8 . DP=8;AF1=1;CI95=0.5,1;DP4=0,2,0,5;MQ=34;PV4=1,0.29,1,1 PL:GT:GQ 110,6,0:1/1:49 +chr12 31505085 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr12 34041336 . G A 5.46 . DP=5;AF1=0.5;CI95=0.5,0.5;DP4=2,0,2,0;MQ=36;PV4=1,1,0.48,0.21 PL:GT:GQ 34,0,34:0/1:34 +chr12 49003648 . C G 42 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=39 PL:GT:GQ 75,24,0:1/1:96 +chr12 51280690 . G A 69 . DP=98;AF1=0.5;CI95=0.5,0.5;DP4=13,0,18,0;MQ=45;PV4=1,1,0.051,1 PL:GT:GQ 99,0,84:0/1:87 +chr12 69206633 . T C 17.1 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=17 PL:GT:GQ 50,33,0:1/1:99 +chr12 80417253 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr12 86633033 . C T 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=43;PV4=1,1,0.33,1 PL:GT:GQ 64,0,31:0/1:34 +chr12 98097274 . C T 47.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=31 PL:GT:GQ 80,15,0:1/1:75 +chr12 105269319 . C T 19 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=26 PL:GT:GQ 51,9,0:1/1:63 +chr12 109053425 . G A 9.53 . DP=8;AF1=0.5012;CI95=0.5,0.5;DP4=2,0,6,0;MQ=25;PV4=1,1,0.19,1 PL:GT:GQ 39,0,23:0/1:26 +chr12 111904540 . A G 3.41 . DP=65;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 32,6,0:1/1:49 +chr12 115038686 . T C 15.2 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=27 PL:GT:GQ 48,21,0:1/1:84 +chr12 115039419 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 34,9,0:1/1:63 +chr12 115103890 . G A 66 . DP=39;AF1=1;CI95=1,1;DP4=0,0,0,38;MQ=49 PL:GT:GQ 99,114,0:1/1:99 +chr12 115833830 . G A 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr12 116361873 . T G 6.34 . DP=5;AF1=0.7302;CI95=0.5,1;DP4=0,2,0,2;MQ=23;PV4=1,1,1,1 PL:GT:GQ 34,0,2:0/1:3 +chr12 123583527 . G A 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 46,9,0:1/1:63 +chr12 124115330 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 76,9,0:1/1:63 +chr12 125062296 . G A 41.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr12 126718106 . A G 8.76 . DP=50;AF1=0.5163;CI95=0.5,1;DP4=2,0,6,0;MQ=26;PV4=1,0.33,0.37,1 PL:GT:GQ 38,0,12:0/1:15 +chr12 133348311 . G A 24 . DP=18;AF1=0.5;CI95=0.5,0.5;DP4=14,0,3,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 54,0,118:0/1:57 +chr12 134494475 . C T 28 . DP=18;AF1=0.6671;CI95=0.5,1;DP4=8,0,10,0;MQ=18;PV4=1,1,1,1 PL:GT:GQ 57,0,3:0/1:5 +chr12 134831761 . C T 41.3 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=27 PL:GT:GQ 74,15,0:1/1:75 +chr12 134992770 . A C,T 84 . DP=47;AF1=1;CI95=1,1;DP4=0,0,26,0;MQ=29 PL:GT:GQ 117,72,114,0,44,114:1/1:99 +chr12 135261117 . G A 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 82,18,0:1/1:90 +chr12 135261144 . A G 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 155,18,0:1/1:90 +chr12 135460302 . G A 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,23,0;MQ=40 PL:GT:GQ 198,69,0:1/1:99 +chr12 135463758 . A G 83 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=26 PL:GT:GQ 116,48,0:1/1:99 +chr12 135523325 . G A 99 . DP=23;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=26 PL:GT:GQ 136,66,0:1/1:99 +chr12 135782401 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr12 135795472 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr13 18040027 . G C 42 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=33 PL:GT:GQ 74,9,0:1/1:63 +chr13 19494625 . G T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr13 20121126 . A G 15.1 . DP=36;AF1=0.5;CI95=0.5,0.5;DP4=25,0,9,0;MQ=36;PV4=1,1,0.13,1 PL:GT:GQ 45,0,153:0/1:48 +chr13 21536703 . A G 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr13 23160035 . G T 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 33,6,0:1/1:49 +chr13 23476554 . C A 6.79 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=52 PL:GT:GQ 37,6,0:1/1:49 +chr13 26632967 . C G 32 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=34 PL:GT:GQ 65,27,0:1/1:99 +chr13 26790010 . T C 89.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=35 PL:GT:GQ 122,15,0:1/1:75 +chr13 36083571 . T C 43 . DP=84;AF1=1;CI95=1,1;DP4=1,0,37,0;MQ=16;PV4=1,1,1,0.3 PL:GT:GQ 76,99,0:1/1:99 +chr13 44432419 . C T 3.58 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=19 PL:GT:GQ 34,21,0:1/1:84 +chr13 46592359 . T C 16.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 48,6,0:1/1:49 +chr13 52764657 . A T 3.14 . DP=32;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 33,15,0:1/1:75 +chr13 53084193 . C T 9.11 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=29;PV4=1,1,1,1 PL:GT:GQ 38,2,0:1/1:37 +chr13 57763228 . C T 45 . DP=555;AF1=1;CI95=1,1;DP4=2,0,21,0;MQ=23;PV4=1,0.00021,1,0.3 PL:GT:GQ 78,45,0:1/1:99 +chr13 73857921 . G C 31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 63,9,0:1/1:63 +chr13 76718001 . G A 59 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=1,0,3,0;MQ=45;PV4=1,1,0.12,1 PL:GT:GQ 89,0,28:0/1:31 +chr13 100912695 . A T 23 . DP=22;AF1=0.5;CI95=0.5,0.5;DP4=0,16,0,6;MQ=31;PV4=1,0.029,1,0.35 PL:GT:GQ 53,0,103:0/1:56 +chr13 101332001 . G C 21 . DP=23;AF1=1;CI95=1,1;DP4=0,0,23,0;MQ=21 PL:GT:GQ 54,69,0:1/1:99 +chr13 102637334 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr13 102895627 . C T 63 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=48 PL:GT:GQ 96,27,0:1/1:99 +chr13 103830322 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr13 112842448 . G A 39 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=27 PL:GT:GQ 72,27,0:1/1:99 +chr13 113310291 . C T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 66,12,0:1/1:72 +chr13 114775162 . A G 80 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=21 PL:GT:GQ 113,51,0:1/1:99 +chr13 115267482 . A G 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr13 116068676 . C T 3.83 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=27 PL:GT:GQ 34,12,0:1/1:72 +chr13 116455918 . A G 33 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=13,0,15,0;MQ=42;PV4=1,1.8e-20,0.3,1 PL:GT:GQ 63,0,146:0/1:66 +chr13 116765012 . G A 30.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 62,6,0:1/1:49 +chr13 116779773 . C T 17.1 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=27,0,11,0;MQ=24;PV4=1,4.5e-35,1,1 PL:GT:GQ 47,0,106:0/1:50 +chr13 116779791 . C T 57 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=24,0,14,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 87,0,103:0/1:90 +chr14 20159250 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr14 23510676 . T C 52 . DP=22;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=32 PL:GT:GQ 85,66,0:1/1:99 +chr14 24735256 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr14 29525577 . G A 21 . DP=10;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=16 PL:GT:GQ 54,27,0:1/1:99 +chr14 36186389 . C T 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=20 PL:GT:GQ 37,6,0:1/1:49 +chr14 36186394 . A G 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=20 PL:GT:GQ 37,6,0:1/1:49 +chr14 37440609 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr14 40432807 . A G 18.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=23 PL:GT:GQ 51,12,0:1/1:72 +chr14 59466268 . T C 15.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=25 PL:GT:GQ 47,9,0:1/1:63 +chr14 61368162 . G T 7.18 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=17 PL:GT:GQ 39,15,0:1/1:75 +chr14 65152922 . G A 92 . DP=33;AF1=0.5;CI95=0.5,0.5;DP4=0,18,0,15;MQ=36;PV4=1,0.059,0.35,1 PL:GT:GQ 122,0,144:0/1:99 +chr14 69749148 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=25 PL:GT:GQ 40,6,0:1/1:49 +chr14 74877658 . C T 45 . DP=48;AF1=1;CI95=1,1;DP4=0,1,0,12;MQ=36;PV4=1,0.02,1,0.39 PL:GT:GQ 78,28,0:1/1:99 +chr14 75546678 . C T 19.2 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=17 PL:GT:GQ 52,18,0:1/1:90 +chr14 76439185 . T C 67.1 . DP=7;AF1=0.505;CI95=0.5,0.5;DP4=0,1,0,6;MQ=33;PV4=1,1,0.056,0.29 PL:GT:GQ 97,0,17:0/1:20 +chr14 77313295 . T A 99 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=48 PL:GT:GQ 191,30,0:1/1:99 +chr14 77673422 . G A 11.5 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=24 PL:GT:GQ 44,18,0:1/1:90 +chr14 78646125 . T C 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=40 PL:GT:GQ 153,24,0:1/1:96 +chr14 91702449 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr14 91769842 . G A 63 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=47 PL:GT:GQ 95,9,0:1/1:63 +chr14 91775899 . C G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr14 91775924 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr14 93482918 . A C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr14 93665819 . C T 75 . DP=7;AF1=0.5002;CI95=0.5,0.5;DP4=0,3,0,4;MQ=42;PV4=1,1,1,1 PL:GT:GQ 105,0,31:0/1:34 +chr14 95422276 . A G 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=45 PL:GT:GQ 88,21,0:1/1:84 +chr14 95731986 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr14 96045464 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr14 97172020 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=51 PL:GT:GQ 100,9,0:1/1:63 +chr14 100515480 . A G 6.98 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=45;PV4=1,0.14,0.085,0.33 PL:GT:GQ 36,0,30:0/1:32 +chr14 100770214 . A T 8.69 . DP=20;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=16 PL:GT:GQ 41,21,0:1/1:84 +chr14 101258303 . G A 82 . DP=15;AF1=1;CI95=1,1;DP4=0,0,15,0;MQ=26 PL:GT:GQ 115,45,0:1/1:99 +chr14 101701492 . C G 66 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=49 PL:GT:GQ 99,30,0:1/1:99 +chr14 102113772 . T C 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=30 PL:GT:GQ 33,6,0:1/1:49 +chr14 102751431 . A C 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr14 103708033 . A G 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=27 PL:GT:GQ 141,36,0:1/1:99 +chr14 104744582 . G A 3.52 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 33,9,0:1/1:63 +chr14 105989100 . C T 3.14 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 33,15,0:1/1:75 +chr14 105989162 . C T 3.65 . DP=12;AF1=0.7301;CI95=0.5,1;DP4=0,6,0,6;MQ=15;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr14 106234810 . G A 25.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=39 PL:GT:GQ 58,15,0:1/1:75 +chr14 106995572 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr14 107283057 . T C 5.5 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=20 PL:GT:GQ 37,21,0:1/1:84 +chr14 107285319 . T C 33 . DP=36;AF1=1;CI95=1,1;DP4=0,0,0,35;MQ=22 PL:GT:GQ 66,105,0:1/1:99 +chr14 107640449 . A G 11.8 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=36 PL:GT:GQ 44,12,0:1/1:72 +chr15 20082092 . T G 18.3 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=24 PL:GT:GQ 51,15,0:1/1:75 +chr15 22955884 . T C 67 . DP=12;AF1=1;CI95=1,1;DP4=0,0,12,0;MQ=48 PL:GT:GQ 100,36,0:1/1:99 +chr15 22971987 . A G 5.29 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=22 PL:GT:GQ 35,6,0:1/1:49 +chr15 23233324 . C A 47 . DP=16;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=31 PL:GT:GQ 80,42,0:1/1:99 +chr15 25175286 . C T 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=42;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr15 25385709 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr15 27372396 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr15 35998093 . C T 9.53 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=17 PL:GT:GQ 42,27,0:1/1:99 +chr15 36716538 . C G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr15 36793360 . G T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 76,9,0:1/1:63 +chr15 53783097 . A G 10.5 . DP=31;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=16 PL:GT:GQ 43,21,0:1/1:84 +chr15 54180175 . C T 10.4 . DP=7;AF1=0.5001;CI95=0.5,0.5;DP4=4,0,3,0;MQ=27;PV4=1,1.2e-05,1,1 PL:GT:GQ 40,0,32:0/1:34 +chr15 54939306 . C T 99 . DP=34;AF1=0.5;CI95=0.5,0.5;DP4=0,18,0,16;MQ=49;PV4=1,1,0.18,1 PL:GT:GQ 172,0,181:0/1:99 +chr15 59377916 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr15 59685961 . G C 68 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=36 PL:GT:GQ 101,33,0:1/1:99 +chr15 60306384 . A G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr15 60345642 . G C 14.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 46,6,0:1/1:49 +chr15 60367387 . G A 13.2 . DP=6;AF1=0.5001;CI95=0.5,0.5;DP4=3,0,3,0;MQ=34;PV4=1,0.098,0.24,1 PL:GT:GQ 43,0,35:0/1:37 +chr15 60367446 . C T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr15 61763755 . G A 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=45 PL:GT:GQ 100,9,0:1/1:63 +chr15 61831362 . C G 11.3 . DP=5;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,3;MQ=30;PV4=1,0.00077,0.47,1 PL:GT:GQ 41,0,42:0/1:41 +chr15 63978880 . G C 60 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=2,0,4,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 90,3,0:1/1:41 +chr15 64342445 . A G 12.2 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=18 PL:GT:GQ 44,9,0:1/1:63 +chr15 65424859 . T C 11.3 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=21 PL:GT:GQ 44,30,0:1/1:99 +chr15 65603698 . C T 60 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 92,9,0:1/1:63 +chr15 67005078 . G A 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr15 71133512 . G C 22.3 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=25 PL:GT:GQ 55,15,0:1/1:75 +chr15 72619009 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr15 73272688 . C T 70.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=39 PL:GT:GQ 103,15,0:1/1:75 +chr15 73699335 . T A 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=45 PL:GT:GQ 175,27,0:1/1:99 +chr15 74513352 . C T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=37 PL:GT:GQ 139,30,0:1/1:99 +chr15 75540536 . G A 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr15 75822537 . C A 17.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=23 PL:GT:GQ 50,15,0:1/1:75 +chr15 78554005 . T C 12 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 43,6,0:1/1:49 +chr15 80089369 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=28 PL:GT:GQ 40,6,0:1/1:49 +chr15 83089149 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 40,6,0:1/1:49 +chr15 86839307 . T C 90.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 123,15,0:1/1:75 +chr15 89836258 . T C 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=39 PL:GT:GQ 141,24,0:1/1:96 +chr15 89837706 . G A 4.13 . DP=8;AF1=0.4998;CI95=0.5,0.5;DP4=0,4,0,4;MQ=30;PV4=1,1,0.25,1 PL:GT:GQ 32,0,59:0/1:35 +chr15 89857648 . T C 99 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=8,0,8,0;MQ=40;PV4=1,1,0.3,1 PL:GT:GQ 133,0,130:0/1:99 +chr15 89864228 . A C 32 . DP=4;AF1=0.5002;CI95=0.5,0.5;DP4=2,0,2,0;MQ=42;PV4=1,1,1,1 PL:GT:GQ 62,0,31:0/1:34 +chr15 91261235 . G A 7.8 . DP=4;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=44;PV4=1,1,0.32,1 PL:GT:GQ 37,0,30:0/1:32 +chr16 256990 . A C 10.4 . DP=16;AF1=0.5008;CI95=0.5,0.5;DP4=4,0,3,0;MQ=23;PV4=1,0.34,1,1 PL:GT:GQ 40,0,25:0/1:28 +chr16 260794 . T C 3.01 . DP=19;AF1=0.4999;CI95=0.5,0.5;DP4=13,0,2,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 30,0,32:0/1:31 +chr16 419905 . A G 7.9 . DP=5;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=22;PV4=1,1,1,1 PL:GT:GQ 36,1,0:1/1:23 +chr16 824086 . T C 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr16 1085063 . C T 52 . DP=12;AF1=0.5;CI95=0.5,0.5;DP4=6,0,6,0;MQ=42;PV4=1,1,0.014,1 PL:GT:GQ 82,0,128:0/1:85 +chr16 1221305 . T C 54 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=0,3,0,3;MQ=40;PV4=1,1,1,1 PL:GT:GQ 84,0,60:0/1:63 +chr16 1411728 . A G 32.3 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=35 PL:GT:GQ 65,15,0:1/1:75 +chr16 1443197 . C G 64 . DP=26;AF1=1;CI95=1,1;DP4=0,0,25,0;MQ=36 PL:GT:GQ 97,75,0:1/1:99 +chr16 1478746 . A T 32 . DP=20;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=28 PL:GT:GQ 65,24,0:1/1:96 +chr16 1514438 . A C 45 . DP=49;AF1=1;CI95=1,1;DP4=0,0,48,0;MQ=26 PL:GT:GQ 78,144,0:1/1:99 +chr16 1601989 . T C 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=29 PL:GT:GQ 133,39,0:1/1:99 +chr16 2043883 . C T 30 . DP=33;AF1=1;CI95=1,1;DP4=0,0,0,33;MQ=14 PL:GT:GQ 63,99,0:1/1:99 +chr16 2137470 . A C 39 . DP=38;AF1=0.5016;CI95=0.5,0.5;DP4=4,0,6,0;MQ=34;PV4=1,0.02,1,1 PL:GT:GQ 69,0,22:0/1:25 +chr16 2537260 . A G 99 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=40 PL:GT:GQ 177,33,0:1/1:99 +chr16 2564737 . T C 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,22;MQ=41 PL:GT:GQ 199,66,0:1/1:99 +chr16 2612605 . A T 62.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=28 PL:GT:GQ 95,15,0:1/1:75 +chr16 2704518 . G A 41 . DP=48;AF1=0.5;CI95=0.5,0.5;DP4=0,17,0,12;MQ=48;PV4=1,1.9e-23,0.24,0.034 PL:GT:GQ 71,0,175:0/1:74 +chr16 3274307 . G T 68 . DP=39;AF1=0.5;CI95=0.5,0.5;DP4=0,30,0,8;MQ=37;PV4=1,1,1,1 PL:GT:GQ 98,0,138:0/1:99 +chr16 5467292 . G C 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 69,6,0:1/1:49 +chr16 10079145 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr16 11483702 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr16 12038227 . A T 23 . DP=47;AF1=0.5;CI95=0.5,0.5;DP4=0,22,0,23;MQ=32;PV4=1,4.4e-66,0.47,0.028 PL:GT:GQ 53,0,135:0/1:56 +chr16 21336880 . G C 55 . DP=35;AF1=0.5;CI95=0.5,0.5;DP4=0,12,0,19;MQ=47;PV4=1,5.6e-21,1,1 PL:GT:GQ 85,0,121:0/1:88 +chr16 21980241 . C T 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr16 23275383 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 44,6,0:1/1:49 +chr16 27546495 . G T 25 . DP=35;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=43 PL:GT:GQ 57,9,0:1/1:63 +chr16 27700399 . A T 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=17 PL:GT:GQ 50,12,0:1/1:72 +chr16 28021935 . A G 18.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 51,15,0:1/1:75 +chr16 29070016 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr16 29478618 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr16 29718140 . C T 46.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 79,15,0:1/1:75 +chr16 30700759 . T C 17.1 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,14;MQ=14 PL:GT:GQ 50,42,0:1/1:99 +chr16 35139103 . A G 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=37 PL:GT:GQ 79,12,0:1/1:72 +chr16 35473348 . G A 3.83 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 34,12,0:1/1:72 +chr16 36213667 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr16 36705528 . G A 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=32 PL:GT:GQ 47,15,0:1/1:75 +chr16 43831353 . C T 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=42 PL:GT:GQ 102,12,0:1/1:72 +chr16 44715166 . A C 25 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=32 PL:GT:GQ 58,24,0:1/1:96 +chr16 44957661 . T C 7.03 . DP=23;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=18 PL:GT:GQ 39,21,0:1/1:84 +chr16 44958698 . C T 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=49 PL:GT:GQ 75,15,0:1/1:75 +chr16 44959163 . T C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 66,12,0:1/1:72 +chr16 45167959 . C T 4.45 . DP=16;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=24 PL:GT:GQ 35,12,0:1/1:72 +chr16 50254956 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr16 52383122 . A C 46.5 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=42 PL:GT:GQ 79,12,0:1/1:72 +chr16 55978159 . C T 10.7 . DP=20;AF1=0.5336;CI95=0.5,1;DP4=2,0,5,0;MQ=35;PV4=1,0.038,1,0.059 PL:GT:GQ 40,0,9:0/1:12 +chr16 61358878 . T A 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 47,6,0:1/1:49 +chr16 61392487 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 44,6,0:1/1:49 +chr16 61621603 . G T 6.59 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=22 PL:GT:GQ 38,12,0:1/1:72 +chr16 69120890 . G C 51.3 . DP=36;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=42 PL:GT:GQ 84,15,0:1/1:75 +chr16 70778219 . A G 21.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=39 PL:GT:GQ 53,6,0:1/1:49 +chr16 71899519 . T C 40 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=33 PL:GT:GQ 73,33,0:1/1:99 +chr16 72079251 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr16 72093003 . G C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr16 72672428 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr16 72864515 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr16 72890560 . G A 47.1 . DP=10;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,7;MQ=49;PV4=1,0.0019,0.0033,1 PL:GT:GQ 77,0,16:0/1:19 +chr16 73048929 . A G 6.29 . DP=4;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=27;PV4=1,1,1,0.33 PL:GT:GQ 34,1,0:1/1:23 +chr16 73177179 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr16 73191468 . C T 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=40 PL:GT:GQ 102,12,0:1/1:72 +chr16 73367439 . A C 7.41 . DP=36;AF1=1;CI95=0.5,1;DP4=0,2,0,13;MQ=26;PV4=1,1,0.027,1 PL:GT:GQ 37,4,0:1/1:45 +chr16 74259316 . C T 89.5 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr16 75271450 . C G 6.99 . DP=15;AF1=0.5015;CI95=0.5,0.5;DP4=0,1,0,3;MQ=44;PV4=1,0.065,0.31,1 PL:GT:GQ 36,0,22:0/1:25 +chr16 76199870 . G A 26 . DP=14;AF1=0.5;CI95=0.5,0.5;DP4=8,0,6,0;MQ=47;PV4=1,1.2e-06,0.32,1 PL:GT:GQ 56,0,141:0/1:59 +chr16 77723692 . A G 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 122,12,0:1/1:72 +chr17 165875 . G A 40.8 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 72,6,0:1/1:49 +chr17 1443809 . C G 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr17 1618253 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=39 PL:GT:GQ 54,9,0:1/1:63 +chr17 2815309 . T G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr17 3537486 . T G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr17 3734367 . C A 23.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=36 PL:GT:GQ 56,12,0:1/1:72 +chr17 5634764 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr17 6408090 . C G 3.54 . DP=5;AF1=0.4998;CI95=0.5,0.5;DP4=3,0,2,0;MQ=40;PV4=1,1,0.36,1 PL:GT:GQ 31,0,66:0/1:34 +chr17 7089723 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr17 8731503 . G C 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 42,6,0:1/1:49 +chr17 9282935 . T C,G 24.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=40 PL:GT:GQ 57,12,61,0,3,61:1/1:72 +chr17 17284831 . T C 29 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 61,9,0:1/1:63 +chr17 18439515 . G A 4.11 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=25 PL:GT:GQ 34,9,0:1/1:63 +chr17 18602146 . C T 4.76 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=16 PL:GT:GQ 36,33,0:1/1:99 +chr17 19427888 . C T 57 . DP=104;AF1=0.5;CI95=0.5,0.5;DP4=45,0,29,0;MQ=39;PV4=1,2.2e-12,1,1 PL:GT:GQ 87,0,131:0/1:90 +chr17 19604159 . T C 9.31 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr17 19610366 . C T 13 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr17 20484706 . C G 51 . DP=35;AF1=0.5001;CI95=0.5,0.5;DP4=0,11,0,21;MQ=21;PV4=1,0.39,0.49,1 PL:GT:GQ 81,0,36:0/1:39 +chr17 20555720 . A G 26.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=28 PL:GT:GQ 59,15,0:1/1:75 +chr17 24328984 . A C 15.4 . DP=34;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=25 PL:GT:GQ 48,15,0:1/1:75 +chr17 26237090 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr17 28394766 . C A 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr17 31218277 . A G 3.62 . DP=38;AF1=0.5161;CI95=0.5,0.5;DP4=0,1,0,2;MQ=38;PV4=1,0.26,1,1 PL:GT:GQ 31,0,12:0/1:15 +chr17 31254021 . C T 15.1 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=35 PL:GT:GQ 47,9,0:1/1:63 +chr17 32516798 . G A 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 69,6,0:1/1:49 +chr17 32600253 . A G 16.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 49,12,0:1/1:72 +chr17 34255214 . G C 19.2 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=21 PL:GT:GQ 52,18,0:1/1:90 +chr17 34365900 . T C 93.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=38 PL:GT:GQ 126,18,0:1/1:90 +chr17 35380386 . A T 6.79 . DP=44;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 37,6,0:1/1:49 +chr17 41993344 . C T 64 . DP=41;AF1=1;CI95=1,1;DP4=0,0,0,41;MQ=16 PL:GT:GQ 97,123,0:1/1:99 +chr17 42128201 . A G 4.13 . DP=5;AF1=0.4998;CI95=0.5,0.5;DP4=0,2,0,2;MQ=52;PV4=1,0.0041,1,1 PL:GT:GQ 32,0,62:0/1:35 +chr17 42984490 . C A 56 . DP=33;AF1=0.5001;CI95=0.5,0.5;DP4=6,0,12,0;MQ=42;PV4=1,0.004,1,1 PL:GT:GQ 86,0,34:0/1:37 +chr17 43419457 . G A 99 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,14;MQ=45 PL:GT:GQ 185,42,0:1/1:99 +chr17 43421225 . A G 65.1 . DP=31;AF1=1;CI95=0.5,1;DP4=0,6,0,17;MQ=43;PV4=1,0.004,1,1 PL:GT:GQ 98,18,0:1/1:90 +chr17 45206897 . G A 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=47 PL:GT:GQ 54,9,0:1/1:63 +chr17 45381302 . T C 18.6 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr17 45530812 . C A 3.54 . DP=6;AF1=0.4998;CI95=0.5,0.5;DP4=0,3,0,2;MQ=40;PV4=1,1,0.37,1 PL:GT:GQ 31,0,58:0/1:34 +chr17 50242633 . G A 44 . DP=42;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,13;MQ=32;PV4=1,0.084,0.14,1 PL:GT:GQ 74,0,154:0/1:77 +chr17 51275317 . G A 14.9 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 46,6,0:1/1:49 +chr17 52325530 . C T 29 . DP=19;AF1=1;CI95=1,1;DP4=0,0,0,18;MQ=24 PL:GT:GQ 62,54,0:1/1:99 +chr17 52411748 . T G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr17 53190746 . C G 62.1 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=40 PL:GT:GQ 95,18,0:1/1:90 +chr17 58289916 . T C 18.2 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=22 PL:GT:GQ 51,18,0:1/1:90 +chr17 59796875 . C T 42 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=35 PL:GT:GQ 74,9,0:1/1:63 diff --git a/tests/tabix_data/vcf/2.vcf b/tests/tabix_data/vcf/2.vcf new file mode 100644 index 0000000..1b338fc --- /dev/null +++ b/tests/tabix_data/vcf/2.vcf @@ -0,0 +1,334 @@ +##fileformat=VCFv4.0 +##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/combined.phase1.chr20.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false recal_file=/humgen/gsa-scr1/delangel/VQSRIndels/data/trainMills75_truthMills75_p15_12_12_pctb0.05_std12.0_mG8_QD_FS_HS_RP_IC.recal tranches_file=/humgen/gsa-scr1/delangel/VQSRIndels/data/trainMills75_truthMills75_p15_12_12_pctb0.05_std12.0_mG8_QD_FS_HS_RP_IC.tranches out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub ts_filter_level=93.0 ignore_filter=null mode=INDEL" +##CombineVariants="analysis_type=CombineVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20:41000001-42000000] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AFR/AFR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/ASN/ASN.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AMR/AMR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/EUR/EUR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AFR.admix/AFR.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/ASN.admix/ASN.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AMR.admix/AMR.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/EUR.admix/EUR.admix.phase1.chr20.42.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub genotypemergeoption=PRIORITIZE filteredrecordsmergetype=KEEP_IF_ANY_UNFILTERED rod_priority_list=AFR.admix,AMR.admix,EUR.admix,ASN.admix,AFR,AMR,EUR,ASN printComplexMerges=false filteredAreUncalled=false minimalVCF=false setKey=set assumeIdenticalSamples=false minimumN=1 masterMerge=false mergeInfoWithMaxAC=true" +##FILTER= +##FILTER== 4 && (MQ0 / (1.0 * DP)) > 0.1"> +##FILTER=10)"> +##FILTER=20.0"> +##FILTER= 7500"> +##FILTER==15"> +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER==-1.0"> +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##LeftAlignVariants="analysis_type=LeftAlignVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta rodBind=[/humgen/gsa-scr1/ebanks/ALL.chr20.Oxford.20110407.indels.genotypes.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub" +##SelectVariants="analysis_type=SelectVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta rodBind=[/humgen/gsa-scr1/delangel/officialCalls/20110201_chr20_phase1_indels/dindel/20110208.chr20.dindel2.ALL.sites.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sample=null select_expressions=[] excludeNonVariants=false excludeFiltered=false discordance= concordance= family_structure= mendelianViolation=false mendelianViolationQualThreshold=0.0 select_random_number=0 select_random_fraction=0.0 selectSNPs=false selectIndels=true" +##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/broad/shptmp/delangel/calls/chr20/CHB.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/CHS.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/CLM.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/JPT.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/MXL.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/PUR.phase1.chr20.42.cleaned.bam] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20:41000001-42000000] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-scr1/delangel/otherIndelCallerAnalysis/ALL.indels.combined.chr20.vcf, /humgen/gsa-hpprojects/GATK/data/dbsnp_132_b37.leftAligned.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=50 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=8 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false genotype_likelihoods_model=INDEL p_nonref_model=EXACT heterozygosity=0.0010 pcr_error_rate=1.0E-4 genotyping_mode=GENOTYPE_GIVEN_ALLELES output_mode=EMIT_ALL_SITES standard_min_confidence_threshold_for_calling=4.0 standard_min_confidence_threshold_for_emitting=4.0 noSLOD=false assume_single_sample_reads=null abort_at_too_much_coverage=-1 min_base_quality_score=17 min_mapping_quality_score=20 max_deletion_fraction=0.05 min_indel_count_for_genotyping=5 indel_heterozygosity=1.25E-4 indelGapContinuationPenalty=10.0 indelGapOpenPenalty=45.0 indelHaplotypeSize=80 doContextDependentGapPenalties=true getGapPenaltiesFromData=false indel_recal_file=indel.recal_data.csv indelDebug=false dovit=false GSA_PRODUCTION_ONLY=false exactCalculation=LINEAR_EXPERIMENTAL ignoreSNPAlleles=true output_all_callable_bases=false genotype=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub debug_file=null metrics_file=null annotation=[MappingQualityZeroFraction]" +##VariantAnnotator="analysis_type=VariantAnnotator input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[./ALL.chr20.vqsr_2of5_union_sites_for_validation_boosted.vcf] rodToIntervalTrackName=variant BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sampleName=null annotation=[IndelType] group=[] expression=[] useAllAnnotations=false list=false assume_single_sample_reads=null vcfContainsOnlyIndels=false" +##VariantFiltration="analysis_type=VariantFiltration input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[/humgen/1kg/processing/pipeline_test_bams/chr22_chunked.hg19.intervals] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/broad/shptmp/rpoplin/ALL.phase1.chr22.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false enable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null quiet_output_mode=false debug_mode=false help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub filterExpression=[MQ0 >= 4 && (MQ0 / (1.0 * DP)) > 0.1, QUAL<30.0, SB>=-1.0, QD<1.0, HRun>=15, HaplotypeScore>20.0] filterName=[HARD_TO_VALIDATE, LowQual, StrandBias, QualByDepth, HomopolymerRun, HaplotypeScore] genotypeFilterExpression=[] genotypeFilterName=[] clusterSize=3 clusterWindowSize=0 maskName=Mask missingValuesInExpressionsShouldEvaluateAsFailing=false" +##commandline="/share/software/freebayes/bin/freebayes --stdin --min-alternate-count 2 --genotype-combo-step-max 20 --genotype-variant-threshold 4 --no-marginals --pvar 0.0001 --indels --mnps --no-filters --binomial-obs-priors --allele-balance-priors --region 20:0..100000 --vcf /d1/data/1000G/20101123/populations/finalised.phase1/integrated/including454/wg/ALL/Pipeline/none//freebayes/freebayes.20:0-100000.baq.20110328.vcf --fasta-reference /d2/data/references/build_37/human_reference_v37.fa" +##fileDate=2011-03-28 +##filedate=2011-02-08 +##filter="( SNP | MNP ) & ( MQM > 65 | QUAL > 1 ) & ABP < 30 & AB < 0.9 | ( INS | DEL ) & QUAL > 500" +##phasing=none +##platypusOptions={'bamFiles': ['/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06984', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06985', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06986', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06989', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA06994', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07000', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07037', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07048', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07051', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07056', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07346', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07347', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA07357', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA10847', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA10851', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11829', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11830', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11831', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11832', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11843', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11881', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11892', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11893', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11894', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11918', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11919', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11920', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11930', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11931', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11932', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11933', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11992', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11993', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11994', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA11995', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12003', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12004', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12005', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12006', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12043', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12044', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12045', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12046', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12058', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12144', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12154', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12155', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12156', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12234', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12249', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12272', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12273', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12275', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12282', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12283', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12286', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12287', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12340', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12341', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12342', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12347', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12348', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12383', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12399', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12400', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12413', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12414', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12489', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12546', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12716', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12717', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12718', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12748', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12749', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12750', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12751', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12761', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12763', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12775', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12776', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12777', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12778', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12813', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12827', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12828', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12829', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12830', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12842', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12843', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12889', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA12890', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18486', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18487', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18488', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18489', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18498', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18499', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18501', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18502', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18504', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18505', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18507', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18508', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18510', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18511', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18516', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18517', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18519', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18520', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18522', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18523', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18526', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18530', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18532', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18533', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18534', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18535', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18536', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18537', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18538', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18539', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18541', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18542', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18543', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18544', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18545', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18546', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18547', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18548', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18549', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18550', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18552', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18553', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18555', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18557', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18558', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18559', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18560', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18561', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18562', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18563', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18564', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18565', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18566', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18567', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18570', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18571', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18572', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18573', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18574', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18576', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18577', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18579', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18582', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18592', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18593', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18595', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18596', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18597', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18599', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18602', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18603', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18605', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18606', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18608', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18609', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18610', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18611', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18612', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18613', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18614', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18615', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18616', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18617', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18618', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18619', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18620', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18621', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18622', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18623', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18624', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18625', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18626', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18627', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18628', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18630', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18631', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18632', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18633', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18634', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18635', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18636', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18637', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18638', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18853', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18856', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18858', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18861', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18867', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18868', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18870', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18871', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18873', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18874', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18907', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18908', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18909', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18910', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18912', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18916', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18917', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18923', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18924', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18933', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18934', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18940', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18941', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18942', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18943', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18944', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18945', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18947', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18948', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18949', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18950', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18951', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18952', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18953', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18956', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18959', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18960', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18961', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18963', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18964', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18965', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18967', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18968', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18971', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18972', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18973', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18974', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18975', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18976', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18977', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18980', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18981', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18982', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18983', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18984', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18985', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18986', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18987', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18988', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18989', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18990', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18991', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA18999', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19000', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19002', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19003', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19004', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19005', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19007', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19009', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19010', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19012', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19054', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19055', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19056', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19057', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19058', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19059', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19060', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19062', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19063', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19064', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19065', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19066', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19067', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19068', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19070', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19072', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19074', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19075', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19076', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19077', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19078', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19079', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19080', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19081', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19082', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19083', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19084', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19085', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19087', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19088', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19092', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19093', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19098', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19099', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19102', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19107', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19108', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19114', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19116', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19119', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19129', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19130', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19131', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19137', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19138', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19144', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19147', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19152', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19153', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19159', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19160', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19171', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19172', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19189', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19190', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19197', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19198', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19200', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19201', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19204', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19207', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19209', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19210', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19213', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19223', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19225', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19235', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19236', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19247', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19248', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19256', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19257', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19311', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19312', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19313', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19315', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19316', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19317', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19318', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19319', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19321', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19324', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19327', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19328', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19331', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19332', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19334', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19338', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19346', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19347', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19350', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19355', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19359', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19360', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19371', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19372', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19373', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19374', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19375', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19376', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19377', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19379', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19380', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19381', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19382', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19383', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19384', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19385', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19390', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19391', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19393', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19394', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19395', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19396', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19397', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19398', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19399', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19401', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19403', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19404', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19428', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19429', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19430', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19431', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19434', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19435', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19436', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19437', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19438', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19439', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19440', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19443', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19444', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19445', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19446', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19448', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19449', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19451', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19452', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19453', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19455', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19456', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19457', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19461', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19462', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19463', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19466', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19467', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19468', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19469', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19470', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19471', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19472', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19473', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19474', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19625', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19648', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19649', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19651', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19652', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19654', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19655', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19657', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19658', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19660', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19661', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19663', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19664', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19670', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19675', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19676', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19678', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19679', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19681', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19682', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19684', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19685', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19700', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19701', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19703', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19704', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19707', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19711', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19712', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19713', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19716', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19717', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19719', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19720', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19722', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19723', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19725', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19726', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19728', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19729', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19731', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19732', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19746', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19747', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19749', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19750', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19755', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19756', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19758', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19759', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19761', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19762', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19770', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19771', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19773', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19774', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19776', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19777', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19779', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19780', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19782', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19783', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19785', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19786', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19788', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19789', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19818', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19819', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19834', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19835', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19900', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19901', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19904', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19908', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19909', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19914', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19916', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19917', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19920', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19921', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19982', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA19985', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20126', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20127', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20276', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20278', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20281', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20282', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20287', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20289', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20291', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20294', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20296', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20299', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20314', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20317', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20322', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20332', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20334', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20336', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20340', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20341', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20342', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20344', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20346', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20348', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20356', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20502', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20503', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20504', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20505', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20506', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20507', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20508', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20509', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20510', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20512', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20513', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20514', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20515', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20516', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20517', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20518', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20519', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20520', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20521', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20522', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20524', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20525', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20526', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20527', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20528', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20529', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20530', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20531', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20532', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20533', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20534', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20535', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20536', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20537', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20538', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20539', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20540', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20541', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20542', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20543', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20544', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20581', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20582', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20585', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20586', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20588', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20589', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20752', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20753', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20754', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20755', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20756', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20757', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20758', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20759', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20760', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20761', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20765', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20766', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20768', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20769', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20770', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20771', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20772', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20773', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20774', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20775', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20778', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20783', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20785', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20786', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20787', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20790', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20792', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20795', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20796', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20797', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20798', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20799', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20800', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20801', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20802', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20803', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20804', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20805', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20806', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20807', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20808', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20809', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20810', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20811', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20812', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20813', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20814', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20815', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20816', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20818', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20819', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20826', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/NA20828', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00096', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00098', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00100', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00103', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00106', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00108', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00111', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00112', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00114', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00115', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00116', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00117', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00118', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00119', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00120', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00122', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00123', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00124', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00125', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00126', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00127', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00131', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00133', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00136', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00137', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00138', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00139', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00140', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00141', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00142', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00143', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00144', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00145', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00146', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00147', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00148', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00149', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00150', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00151', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00152', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00153', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00154', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00155', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00156', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00157', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00158', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00159', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00160', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00171', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00173', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00174', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00176', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00177', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00178', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00179', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00180', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00181', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00182', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00183', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00185', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00186', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00187', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00188', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00189', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00190', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00231', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00232', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00233', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00236', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00237', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00239', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00242', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00243', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00244', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00245', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00246', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00247', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00249', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00250', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00251', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00252', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00253', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00254', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00256', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00257', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00258', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00259', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00260', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00261', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00262', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00263', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00264', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00265', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00266', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00267', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00268', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00269', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00270', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00271', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00272', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00273', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00274', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00275', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00276', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00277', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00278', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00280', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00281', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00282', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00284', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00285', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00306', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00308', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00309', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00310', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00311', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00312', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00313', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00315', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00318', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00319', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00320', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00321', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00323', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00324', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00325', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00326', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00327', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00328', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00329', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00330', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00331', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00334', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00335', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00336', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00337', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00338', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00339', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00342', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00343', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00344', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00345', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00346', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00353', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00357', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00361', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00366', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00367', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00368', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00369', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00372', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00373', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00375', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00377', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00380', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00403', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00404', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00418', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00419', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00421', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00422', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00427', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00428', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00436', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00437', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00442', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00443', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00448', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00449', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00463', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00464', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00472', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00473', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00475', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00476', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00478', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00479', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00500', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00501', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00512', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00513', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00524', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00525', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00530', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00531', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00533', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00534', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00536', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00537', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00542', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00543', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00551', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00553', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00554', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00556', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00557', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00559', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00560', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00565', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00566', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00577', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00578', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00580', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00581', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00583', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00584', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00589', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00590', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00592', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00593', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00595', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00596', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00607', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00608', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00610', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00611', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00613', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00614', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00619', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00620', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00625', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00626', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00628', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00629', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00634', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00635', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00637', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00638', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00640', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00641', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00650', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00651', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00653', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00654', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00656', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00657', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00662', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00663', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00671', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00672', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00683', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00684', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00689', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00690', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00692', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00693', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00698', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00699', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00701', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00702', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00704', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00705', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00707', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00708', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00731', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00732', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00734', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00736', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00737', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00739', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG00740', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01047', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01048', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01051', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01052', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01055', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01060', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01061', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01066', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01067', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01069', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01070', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01072', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01073', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01075', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01079', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01080', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01082', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01083', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01094', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01095', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01097', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01098', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01101', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01102', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01107', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01108', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01110', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01111', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01112', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01113', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01124', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01125', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01133', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01134', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01136', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01137', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01140', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01148', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01149', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01167', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01168', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01170', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01171', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01173', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01174', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01176', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01177', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01182', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01183', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01187', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01188', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01190', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01191', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01197', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01198', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01204', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01250', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01251', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01253', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01254', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01334', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01342', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01350', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01351', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01353', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01354', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01356', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01357', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01359', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01360', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01365', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01366', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01374', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01375', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01377', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01378', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01383', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01384', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01389', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01390', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01437', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01440', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01441', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01455', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01456', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01461', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01462', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01464', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01465', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01488', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01489', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01491', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01492', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01494', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01495', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01497', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01498', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01515', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01516', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01518', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01519', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01521', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01522', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01550', '/scratch/rimmer/ThousandGenomes/PhaseOneBAMs/HG01551'], 'minReads': 2, 'refFile': '/scratch/rimmer/Genomes/human_g1k_v37_ebv.fa', 'maxHaplotypes': 64, 'maxSize': 100, 'ploidy': 2, 'maxRegionSize': 10000, 'nCPU': 1, 'minFlank': 3, 'logFileName': 'LogsAllPhaseOne/ThousandGenomesPhaseOneCalls_20:1-100001.log', 'regions': ['20:1-100001'], 'maxVariants': 6, 'genIndels': 1, 'labels': None, 'dataType': 'population', 'minMapQual': 20, 'rlen': 100, 'nInd': 994, 'getVariantsFromBAMs': 1, 'genSNPs': 1, 'minReadQual': 20, 'maxCoverage': 1000000.0, 'verbosity': 2, 'sourceFile': None, 'callOnlyIndels': 1, 'output': 'VariantCallsAllPhaseOne/ThousandGenomesPhaseOneCalls_20:1-100001.vcf'} +##reference=/lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta +##source=Dindel2 +##source=SelectVariants +##source_20110031.1=/nfs/users/nfs_p/pd3/cvs/vcftools/perl/vcf-annotate -d /nfs/users/nfs_p/pd3/sandbox/hapmap/dbSNP-b132/non-1kg-vld.desc -a /nfs/users/nfs_p/pd3/sandbox/hapmap/dbSNP-b132/non-1kg-vld.tab.gz -c CHROM,FROM,INFO/VLD,INFO/KGPilot123,INFO/dbSNP +##vcfCTools=filter +##vcfCtools=merge freebayes.20:0-100000.baq.20110328.vcf, freebayes.20:100000-200000.baq.20110328.vcf, freebayes.20:200000-300000.baq.20110328.vcf, freebayes.20:300000-400000.baq.20110328.vcf, freebayes.20:400000-500000.baq.20110328.vcf, freebayes.20:500000-600000.baq.20110328.vcf, freebayes.20:600000-700000.baq.20110328.vcf, freebayes.20:700000-800000.baq.20110328.vcf, freebayes.20:800000-900000.baq.20110328.vcf, freebayes.20:900000-1000000.baq.20110328.vcf, freebayes.20:1000000-1100000.baq.20110328.vcf, freebayes.20:1100000-1200000.baq.20110328.vcf, freebayes.20:1200000-1300000.baq.20110328.vcf, freebayes.20:1300000-1400000.baq.20110328.vcf, freebayes.20:1400000-1500000.baq.20110328.vcf, freebayes.20:1500000-1600000.baq.20110328.vcf, freebayes.20:1600000-1700000.baq.20110328.vcf, freebayes.20:1700000-1800000.baq.20110328.vcf, freebayes.20:1800000-1900000.baq.20110328.vcf, freebayes.20:1900000-2000000.baq.20110328.vcf, freebayes.20:2000000-2100000.baq.20110328.vcf, freebayes.20:2100000-2200000.baq.20110328.vcf, freebayes.20:2200000-2300000.baq.20110328.vcf, freebayes.20:2300000-2400000.baq.20110328.vcf, freebayes.20:2400000-2500000.baq.20110328.vcf, freebayes.20:2500000-2600000.baq.20110328.vcf, freebayes.20:2600000-2700000.baq.20110328.vcf, freebayes.20:2700000-2800000.baq.20110328.vcf, freebayes.20:2800000-2900000.baq.20110328.vcf, freebayes.20:2900000-3000000.baq.20110328.vcf, freebayes.20:3000000-3100000.baq.20110328.vcf, freebayes.20:3100000-3200000.baq.20110328.vcf, freebayes.20:3200000-3300000.baq.20110328.vcf, freebayes.20:3300000-3400000.baq.20110328.vcf, freebayes.20:3400000-3500000.baq.20110328.vcf, freebayes.20:3500000-3600000.baq.20110328.vcf, freebayes.20:3600000-3700000.baq.20110328.vcf, freebayes.20:3700000-3800000.baq.20110328.vcf, freebayes.20:3800000-3900000.baq.20110328.vcf, freebayes.20:3900000-4000000.baq.20110328.vcf, freebayes.20:4000000-4100000.baq.20110328.vcf, freebayes.20:4100000-4200000.baq.20110328.vcf, freebayes.20:4200000-4300000.baq.20110328.vcf, freebayes.20:4300000-4400000.baq.20110328.vcf, freebayes.20:4400000-4500000.baq.20110328.vcf, freebayes.20:4500000-4600000.baq.20110328.vcf, freebayes.20:4600000-4700000.baq.20110328.vcf, freebayes.20:4700000-4800000.baq.20110328.vcf, freebayes.20:4800000-4900000.baq.20110328.vcf, freebayes.20:4900000-5000000.baq.20110328.vcf, freebayes.20:5000000-5100000.baq.20110328.vcf, freebayes.20:5100000-5200000.baq.20110328.vcf, freebayes.20:5200000-5300000.baq.20110328.vcf, freebayes.20:5300000-5400000.baq.20110328.vcf, freebayes.20:5400000-5500000.baq.20110328.vcf, freebayes.20:5500000-5600000.baq.20110328.vcf, freebayes.20:5600000-5700000.baq.20110328.vcf, freebayes.20:5700000-5800000.baq.20110328.vcf, freebayes.20:5800000-5900000.baq.20110328.vcf, freebayes.20:5900000-6000000.baq.20110328.vcf, freebayes.20:6000000-6100000.baq.20110328.vcf, freebayes.20:6100000-6200000.baq.20110328.vcf, freebayes.20:6200000-6300000.baq.20110328.vcf, freebayes.20:6300000-6400000.baq.20110328.vcf, freebayes.20:6400000-6500000.baq.20110328.vcf, freebayes.20:6500000-6600000.baq.20110328.vcf, freebayes.20:6600000-6700000.baq.20110328.vcf, freebayes.20:6700000-6800000.baq.20110328.vcf, freebayes.20:6800000-6900000.baq.20110328.vcf, freebayes.20:6900000-7000000.baq.20110328.vcf, freebayes.20:7000000-7100000.baq.20110328.vcf, freebayes.20:7100000-7200000.baq.20110328.vcf, freebayes.20:7200000-7300000.baq.20110328.vcf, freebayes.20:7300000-7400000.baq.20110328.vcf, freebayes.20:7400000-7500000.baq.20110328.vcf, freebayes.20:7500000-7600000.baq.20110328.vcf, freebayes.20:7600000-7700000.baq.20110328.vcf, freebayes.20:7700000-7800000.baq.20110328.vcf, freebayes.20:7800000-7900000.baq.20110328.vcf, freebayes.20:7900000-8000000.baq.20110328.vcf, freebayes.20:8000000-8100000.baq.20110328.vcf, freebayes.20:8100000-8200000.baq.20110328.vcf, freebayes.20:8200000-8300000.baq.20110328.vcf, freebayes.20:8300000-8400000.baq.20110328.vcf, freebayes.20:8400000-8500000.baq.20110328.vcf, freebayes.20:8500000-8600000.baq.20110328.vcf, freebayes.20:8600000-8700000.baq.20110328.vcf, freebayes.20:8700000-8800000.baq.20110328.vcf, freebayes.20:8800000-8900000.baq.20110328.vcf, freebayes.20:8900000-9000000.baq.20110328.vcf, freebayes.20:9000000-9100000.baq.20110328.vcf, freebayes.20:9100000-9200000.baq.20110328.vcf, freebayes.20:9200000-9300000.baq.20110328.vcf, freebayes.20:9300000-9400000.baq.20110328.vcf, freebayes.20:9400000-9500000.baq.20110328.vcf, freebayes.20:9500000-9600000.baq.20110328.vcf, freebayes.20:9600000-9700000.baq.20110328.vcf, freebayes.20:9700000-9800000.baq.20110328.vcf, freebayes.20:9800000-9900000.baq.20110328.vcf, freebayes.20:9900000-10000000.baq.20110328.vcf, freebayes.20:10000000-10100000.baq.20110328.vcf, freebayes.20:10100000-10200000.baq.20110328.vcf, freebayes.20:10200000-10300000.baq.20110328.vcf, freebayes.20:10300000-10400000.baq.20110328.vcf, freebayes.20:10400000-10500000.baq.20110328.vcf, freebayes.20:10500000-10600000.baq.20110328.vcf, freebayes.20:10600000-10700000.baq.20110328.vcf, freebayes.20:10700000-10800000.baq.20110328.vcf, freebayes.20:10800000-10900000.baq.20110328.vcf, freebayes.20:10900000-11000000.baq.20110328.vcf, freebayes.20:11000000-11100000.baq.20110328.vcf, freebayes.20:11100000-11200000.baq.20110328.vcf, freebayes.20:11200000-11300000.baq.20110328.vcf, freebayes.20:11300000-11400000.baq.20110328.vcf, freebayes.20:11400000-11500000.baq.20110328.vcf, freebayes.20:11500000-11600000.baq.20110328.vcf, freebayes.20:11600000-11700000.baq.20110328.vcf, freebayes.20:11700000-11800000.baq.20110328.vcf, freebayes.20:11800000-11900000.baq.20110328.vcf, freebayes.20:11900000-12000000.baq.20110328.vcf, freebayes.20:12000000-12100000.baq.20110328.vcf, freebayes.20:12100000-12200000.baq.20110328.vcf, freebayes.20:12200000-12300000.baq.20110328.vcf, freebayes.20:12300000-12400000.baq.20110328.vcf, freebayes.20:12400000-12500000.baq.20110328.vcf, freebayes.20:12500000-12600000.baq.20110328.vcf, freebayes.20:12600000-12700000.baq.20110328.vcf, freebayes.20:12700000-12800000.baq.20110328.vcf, freebayes.20:12800000-12900000.baq.20110328.vcf, freebayes.20:12900000-13000000.baq.20110328.vcf, freebayes.20:13000000-13100000.baq.20110328.vcf, freebayes.20:13100000-13200000.baq.20110328.vcf, freebayes.20:13200000-13300000.baq.20110328.vcf, freebayes.20:13300000-13400000.baq.20110328.vcf, freebayes.20:13400000-13500000.baq.20110328.vcf, freebayes.20:13500000-13600000.baq.20110328.vcf, freebayes.20:13600000-13700000.baq.20110328.vcf, freebayes.20:13700000-13800000.baq.20110328.vcf, freebayes.20:13800000-13900000.baq.20110328.vcf, freebayes.20:13900000-14000000.baq.20110328.vcf, freebayes.20:14000000-14100000.baq.20110328.vcf, freebayes.20:14100000-14200000.baq.20110328.vcf, freebayes.20:14200000-14300000.baq.20110328.vcf, freebayes.20:14300000-14400000.baq.20110328.vcf, freebayes.20:14400000-14500000.baq.20110328.vcf, freebayes.20:14500000-14600000.baq.20110328.vcf, freebayes.20:14600000-14700000.baq.20110328.vcf, freebayes.20:14700000-14800000.baq.20110328.vcf, freebayes.20:14800000-14900000.baq.20110328.vcf, freebayes.20:14900000-15000000.baq.20110328.vcf, freebayes.20:15000000-15100000.baq.20110328.vcf, freebayes.20:15100000-15200000.baq.20110328.vcf, freebayes.20:15200000-15300000.baq.20110328.vcf, freebayes.20:15300000-15400000.baq.20110328.vcf, freebayes.20:15400000-15500000.baq.20110328.vcf, freebayes.20:15500000-15600000.baq.20110328.vcf, freebayes.20:15600000-15700000.baq.20110328.vcf, freebayes.20:15700000-15800000.baq.20110328.vcf, freebayes.20:15800000-15900000.baq.20110328.vcf, freebayes.20:15900000-16000000.baq.20110328.vcf, freebayes.20:16000000-16100000.baq.20110328.vcf, freebayes.20:16100000-16200000.baq.20110328.vcf, freebayes.20:16200000-16300000.baq.20110328.vcf, freebayes.20:16300000-16400000.baq.20110328.vcf, freebayes.20:16400000-16500000.baq.20110328.vcf, freebayes.20:16500000-16600000.baq.20110328.vcf, freebayes.20:16600000-16700000.baq.20110328.vcf, freebayes.20:16700000-16800000.baq.20110328.vcf, freebayes.20:16800000-16900000.baq.20110328.vcf, freebayes.20:16900000-17000000.baq.20110328.vcf, freebayes.20:17000000-17100000.baq.20110328.vcf, freebayes.20:17100000-17200000.baq.20110328.vcf, freebayes.20:17200000-17300000.baq.20110328.vcf, freebayes.20:17300000-17400000.baq.20110328.vcf, freebayes.20:17400000-17500000.baq.20110328.vcf, freebayes.20:17500000-17600000.baq.20110328.vcf, freebayes.20:17600000-17700000.baq.20110328.vcf, freebayes.20:17700000-17800000.baq.20110328.vcf, freebayes.20:17800000-17900000.baq.20110328.vcf, freebayes.20:17900000-18000000.baq.20110328.vcf, freebayes.20:18000000-18100000.baq.20110328.vcf, freebayes.20:18100000-18200000.baq.20110328.vcf, freebayes.20:18200000-18300000.baq.20110328.vcf, freebayes.20:18300000-18400000.baq.20110328.vcf, freebayes.20:18400000-18500000.baq.20110328.vcf, freebayes.20:18500000-18600000.baq.20110328.vcf, freebayes.20:18600000-18700000.baq.20110328.vcf, freebayes.20:18700000-18800000.baq.20110328.vcf, freebayes.20:18800000-18900000.baq.20110328.vcf, freebayes.20:18900000-19000000.baq.20110328.vcf, freebayes.20:19000000-19100000.baq.20110328.vcf, freebayes.20:19100000-19200000.baq.20110328.vcf, freebayes.20:19200000-19300000.baq.20110328.vcf, freebayes.20:19300000-19400000.baq.20110328.vcf, freebayes.20:19400000-19500000.baq.20110328.vcf, freebayes.20:19500000-19600000.baq.20110328.vcf, freebayes.20:19600000-19700000.baq.20110328.vcf, freebayes.20:19700000-19800000.baq.20110328.vcf, freebayes.20:19800000-19900000.baq.20110328.vcf, freebayes.20:19900000-20000000.baq.20110328.vcf, freebayes.20:20000000-20100000.baq.20110328.vcf, freebayes.20:20100000-20200000.baq.20110328.vcf, freebayes.20:20200000-20300000.baq.20110328.vcf, freebayes.20:20300000-20400000.baq.20110328.vcf, freebayes.20:20400000-20500000.baq.20110328.vcf, freebayes.20:20500000-20600000.baq.20110328.vcf, freebayes.20:20600000-20700000.baq.20110328.vcf, freebayes.20:20700000-20800000.baq.20110328.vcf, freebayes.20:20800000-20900000.baq.20110328.vcf, freebayes.20:20900000-21000000.baq.20110328.vcf, freebayes.20:21000000-21100000.baq.20110328.vcf, freebayes.20:21100000-21200000.baq.20110328.vcf, freebayes.20:21200000-21300000.baq.20110328.vcf, freebayes.20:21300000-21400000.baq.20110328.vcf, freebayes.20:21400000-21500000.baq.20110328.vcf, freebayes.20:21500000-21600000.baq.20110328.vcf, freebayes.20:21600000-21700000.baq.20110328.vcf, freebayes.20:21700000-21800000.baq.20110328.vcf, freebayes.20:21800000-21900000.baq.20110328.vcf, freebayes.20:21900000-22000000.baq.20110328.vcf, freebayes.20:22000000-22100000.baq.20110328.vcf, freebayes.20:22100000-22200000.baq.20110328.vcf, freebayes.20:22200000-22300000.baq.20110328.vcf, freebayes.20:22300000-22400000.baq.20110328.vcf, freebayes.20:22400000-22500000.baq.20110328.vcf, freebayes.20:22500000-22600000.baq.20110328.vcf, freebayes.20:22600000-22700000.baq.20110328.vcf, freebayes.20:22700000-22800000.baq.20110328.vcf, freebayes.20:22800000-22900000.baq.20110328.vcf, freebayes.20:22900000-23000000.baq.20110328.vcf, freebayes.20:23000000-23100000.baq.20110328.vcf, freebayes.20:23100000-23200000.baq.20110328.vcf, freebayes.20:23200000-23300000.baq.20110328.vcf, freebayes.20:23300000-23400000.baq.20110328.vcf, freebayes.20:23400000-23500000.baq.20110328.vcf, freebayes.20:23500000-23600000.baq.20110328.vcf, freebayes.20:23600000-23700000.baq.20110328.vcf, freebayes.20:23700000-23800000.baq.20110328.vcf, freebayes.20:23800000-23900000.baq.20110328.vcf, freebayes.20:23900000-24000000.baq.20110328.vcf, freebayes.20:24000000-24100000.baq.20110328.vcf, freebayes.20:24100000-24200000.baq.20110328.vcf, freebayes.20:24200000-24300000.baq.20110328.vcf, freebayes.20:24300000-24400000.baq.20110328.vcf, freebayes.20:24400000-24500000.baq.20110328.vcf, freebayes.20:24500000-24600000.baq.20110328.vcf, freebayes.20:24600000-24700000.baq.20110328.vcf, freebayes.20:24700000-24800000.baq.20110328.vcf, freebayes.20:24800000-24900000.baq.20110328.vcf, freebayes.20:24900000-25000000.baq.20110328.vcf, freebayes.20:25000000-25100000.baq.20110328.vcf, freebayes.20:25100000-25200000.baq.20110328.vcf, freebayes.20:25200000-25300000.baq.20110328.vcf, freebayes.20:25300000-25400000.baq.20110328.vcf, freebayes.20:25400000-25500000.baq.20110328.vcf, freebayes.20:25500000-25600000.baq.20110328.vcf, freebayes.20:25600000-25700000.baq.20110328.vcf, freebayes.20:25700000-25800000.baq.20110328.vcf, freebayes.20:25800000-25900000.baq.20110328.vcf, freebayes.20:25900000-26000000.baq.20110328.vcf, freebayes.20:26000000-26100000.baq.20110328.vcf, freebayes.20:26100000-26200000.baq.20110328.vcf, freebayes.20:26200000-26300000.baq.20110328.vcf, freebayes.20:26300000-26400000.baq.20110328.vcf, freebayes.20:26400000-26500000.baq.20110328.vcf, freebayes.20:26500000-26600000.baq.20110328.vcf, freebayes.20:26600000-26700000.baq.20110328.vcf, freebayes.20:26700000-26800000.baq.20110328.vcf, freebayes.20:26800000-26900000.baq.20110328.vcf, freebayes.20:26900000-27000000.baq.20110328.vcf, freebayes.20:27000000-27100000.baq.20110328.vcf, freebayes.20:27100000-27200000.baq.20110328.vcf, freebayes.20:27200000-27300000.baq.20110328.vcf, freebayes.20:27300000-27400000.baq.20110328.vcf, freebayes.20:27400000-27500000.baq.20110328.vcf, freebayes.20:27500000-27600000.baq.20110328.vcf, freebayes.20:27600000-27700000.baq.20110328.vcf, freebayes.20:27700000-27800000.baq.20110328.vcf, freebayes.20:27800000-27900000.baq.20110328.vcf, freebayes.20:27900000-28000000.baq.20110328.vcf, freebayes.20:28000000-28100000.baq.20110328.vcf, freebayes.20:28100000-28200000.baq.20110328.vcf, freebayes.20:28200000-28300000.baq.20110328.vcf, freebayes.20:28300000-28400000.baq.20110328.vcf, freebayes.20:28400000-28500000.baq.20110328.vcf, freebayes.20:28500000-28600000.baq.20110328.vcf, freebayes.20:28600000-28700000.baq.20110328.vcf, freebayes.20:28700000-28800000.baq.20110328.vcf, freebayes.20:28800000-28900000.baq.20110328.vcf, freebayes.20:28900000-29000000.baq.20110328.vcf, freebayes.20:29000000-29100000.baq.20110328.vcf, freebayes.20:29100000-29200000.baq.20110328.vcf, freebayes.20:29200000-29300000.baq.20110328.vcf, freebayes.20:29300000-29400000.baq.20110328.vcf, freebayes.20:29400000-29500000.baq.20110328.vcf, freebayes.20:29500000-29600000.baq.20110328.vcf, freebayes.20:29600000-29700000.baq.20110328.vcf, freebayes.20:29700000-29800000.baq.20110328.vcf, freebayes.20:29800000-29900000.baq.20110328.vcf, freebayes.20:29900000-30000000.baq.20110328.vcf, freebayes.20:30000000-30100000.baq.20110328.vcf, freebayes.20:30100000-30200000.baq.20110328.vcf, freebayes.20:30200000-30300000.baq.20110328.vcf, freebayes.20:30300000-30400000.baq.20110328.vcf, freebayes.20:30400000-30500000.baq.20110328.vcf, freebayes.20:30500000-30600000.baq.20110328.vcf, freebayes.20:30600000-30700000.baq.20110328.vcf, freebayes.20:30700000-30800000.baq.20110328.vcf, freebayes.20:30800000-30900000.baq.20110328.vcf, freebayes.20:30900000-31000000.baq.20110328.vcf, freebayes.20:31000000-31100000.baq.20110328.vcf, freebayes.20:31100000-31200000.baq.20110328.vcf, freebayes.20:31200000-31300000.baq.20110328.vcf, freebayes.20:31300000-31400000.baq.20110328.vcf, freebayes.20:31400000-31500000.baq.20110328.vcf, freebayes.20:31500000-31600000.baq.20110328.vcf, freebayes.20:31600000-31700000.baq.20110328.vcf, freebayes.20:31700000-31800000.baq.20110328.vcf, freebayes.20:31800000-31900000.baq.20110328.vcf, freebayes.20:31900000-32000000.baq.20110328.vcf, freebayes.20:32000000-32100000.baq.20110328.vcf, freebayes.20:32100000-32200000.baq.20110328.vcf, freebayes.20:32200000-32300000.baq.20110328.vcf, freebayes.20:32300000-32400000.baq.20110328.vcf, freebayes.20:32400000-32500000.baq.20110328.vcf, freebayes.20:32500000-32600000.baq.20110328.vcf, freebayes.20:32600000-32700000.baq.20110328.vcf, freebayes.20:32700000-32800000.baq.20110328.vcf, freebayes.20:32800000-32900000.baq.20110328.vcf, freebayes.20:32900000-33000000.baq.20110328.vcf, freebayes.20:33000000-33100000.baq.20110328.vcf, freebayes.20:33100000-33200000.baq.20110328.vcf, freebayes.20:33200000-33300000.baq.20110328.vcf, freebayes.20:33300000-33400000.baq.20110328.vcf, freebayes.20:33400000-33500000.baq.20110328.vcf, freebayes.20:33500000-33600000.baq.20110328.vcf, freebayes.20:33600000-33700000.baq.20110328.vcf, freebayes.20:33700000-33800000.baq.20110328.vcf, freebayes.20:33800000-33900000.baq.20110328.vcf, freebayes.20:33900000-34000000.baq.20110328.vcf, freebayes.20:34000000-34100000.baq.20110328.vcf, freebayes.20:34100000-34200000.baq.20110328.vcf, freebayes.20:34200000-34300000.baq.20110328.vcf, freebayes.20:34300000-34400000.baq.20110328.vcf, freebayes.20:34400000-34500000.baq.20110328.vcf, freebayes.20:34500000-34600000.baq.20110328.vcf, freebayes.20:34600000-34700000.baq.20110328.vcf, freebayes.20:34700000-34800000.baq.20110328.vcf, freebayes.20:34800000-34900000.baq.20110328.vcf, freebayes.20:34900000-35000000.baq.20110328.vcf, freebayes.20:35000000-35100000.baq.20110328.vcf, freebayes.20:35100000-35200000.baq.20110328.vcf, freebayes.20:35200000-35300000.baq.20110328.vcf, freebayes.20:35300000-35400000.baq.20110328.vcf, freebayes.20:35400000-35500000.baq.20110328.vcf, freebayes.20:35500000-35600000.baq.20110328.vcf, freebayes.20:35600000-35700000.baq.20110328.vcf, freebayes.20:35700000-35800000.baq.20110328.vcf, freebayes.20:35800000-35900000.baq.20110328.vcf, freebayes.20:35900000-36000000.baq.20110328.vcf, freebayes.20:36000000-36100000.baq.20110328.vcf, freebayes.20:36100000-36200000.baq.20110328.vcf, freebayes.20:36200000-36300000.baq.20110328.vcf, freebayes.20:36300000-36400000.baq.20110328.vcf, freebayes.20:36400000-36500000.baq.20110328.vcf, freebayes.20:36500000-36600000.baq.20110328.vcf, freebayes.20:36600000-36700000.baq.20110328.vcf, freebayes.20:36700000-36800000.baq.20110328.vcf, freebayes.20:36800000-36900000.baq.20110328.vcf, freebayes.20:36900000-37000000.baq.20110328.vcf, freebayes.20:37000000-37100000.baq.20110328.vcf, freebayes.20:37100000-37200000.baq.20110328.vcf, freebayes.20:37200000-37300000.baq.20110328.vcf, freebayes.20:37300000-37400000.baq.20110328.vcf, freebayes.20:37400000-37500000.baq.20110328.vcf, freebayes.20:37500000-37600000.baq.20110328.vcf, freebayes.20:37600000-37700000.baq.20110328.vcf, freebayes.20:37700000-37800000.baq.20110328.vcf, freebayes.20:37800000-37900000.baq.20110328.vcf, freebayes.20:37900000-38000000.baq.20110328.vcf, freebayes.20:38000000-38100000.baq.20110328.vcf, freebayes.20:38100000-38200000.baq.20110328.vcf, freebayes.20:38200000-38300000.baq.20110328.vcf, freebayes.20:38300000-38400000.baq.20110328.vcf, freebayes.20:38400000-38500000.baq.20110328.vcf, freebayes.20:38500000-38600000.baq.20110328.vcf, freebayes.20:38600000-38700000.baq.20110328.vcf, freebayes.20:38700000-38800000.baq.20110328.vcf, freebayes.20:38800000-38900000.baq.20110328.vcf, freebayes.20:38900000-39000000.baq.20110328.vcf, freebayes.20:39000000-39100000.baq.20110328.vcf, freebayes.20:39100000-39200000.baq.20110328.vcf, freebayes.20:39200000-39300000.baq.20110328.vcf, freebayes.20:39300000-39400000.baq.20110328.vcf, freebayes.20:39400000-39500000.baq.20110328.vcf, freebayes.20:39500000-39600000.baq.20110328.vcf, freebayes.20:39600000-39700000.baq.20110328.vcf, freebayes.20:39700000-39800000.baq.20110328.vcf, freebayes.20:39800000-39900000.baq.20110328.vcf, freebayes.20:39900000-40000000.baq.20110328.vcf, freebayes.20:40000000-40100000.baq.20110328.vcf, freebayes.20:40100000-40200000.baq.20110328.vcf, freebayes.20:40200000-40300000.baq.20110328.vcf, freebayes.20:40300000-40400000.baq.20110328.vcf, freebayes.20:40400000-40500000.baq.20110328.vcf, freebayes.20:40500000-40600000.baq.20110328.vcf, freebayes.20:40600000-40700000.baq.20110328.vcf, freebayes.20:40700000-40800000.baq.20110328.vcf, freebayes.20:40800000-40900000.baq.20110328.vcf, freebayes.20:40900000-41000000.baq.20110328.vcf, freebayes.20:41000000-41100000.baq.20110328.vcf, freebayes.20:41100000-41200000.baq.20110328.vcf, freebayes.20:41200000-41300000.baq.20110328.vcf, freebayes.20:41300000-41400000.baq.20110328.vcf, freebayes.20:41400000-41500000.baq.20110328.vcf, freebayes.20:41500000-41600000.baq.20110328.vcf, freebayes.20:41600000-41700000.baq.20110328.vcf, freebayes.20:41700000-41800000.baq.20110328.vcf, freebayes.20:41800000-41900000.baq.20110328.vcf, freebayes.20:41900000-42000000.baq.20110328.vcf, freebayes.20:42000000-42100000.baq.20110328.vcf, freebayes.20:42100000-42200000.baq.20110328.vcf, freebayes.20:42200000-42300000.baq.20110328.vcf, freebayes.20:42300000-42400000.baq.20110328.vcf, freebayes.20:42400000-42500000.baq.20110328.vcf, freebayes.20:42500000-42600000.baq.20110328.vcf, freebayes.20:42600000-42700000.baq.20110328.vcf, freebayes.20:42700000-42800000.baq.20110328.vcf, freebayes.20:42800000-42900000.baq.20110328.vcf, freebayes.20:42900000-43000000.baq.20110328.vcf, freebayes.20:43000000-43100000.baq.20110328.vcf, freebayes.20:43100000-43200000.baq.20110328.vcf, freebayes.20:43200000-43300000.baq.20110328.vcf, freebayes.20:43300000-43400000.baq.20110328.vcf, freebayes.20:43400000-43500000.baq.20110328.vcf, freebayes.20:43500000-43600000.baq.20110328.vcf, freebayes.20:43600000-43700000.baq.20110328.vcf, freebayes.20:43700000-43800000.baq.20110328.vcf, freebayes.20:43800000-43900000.baq.20110328.vcf, freebayes.20:43900000-44000000.baq.20110328.vcf, freebayes.20:44000000-44100000.baq.20110328.vcf, freebayes.20:44100000-44200000.baq.20110328.vcf, freebayes.20:44200000-44300000.baq.20110328.vcf, freebayes.20:44300000-44400000.baq.20110328.vcf, freebayes.20:44400000-44500000.baq.20110328.vcf, freebayes.20:44500000-44600000.baq.20110328.vcf, freebayes.20:44600000-44700000.baq.20110328.vcf, freebayes.20:44700000-44800000.baq.20110328.vcf, freebayes.20:44800000-44900000.baq.20110328.vcf, freebayes.20:44900000-45000000.baq.20110328.vcf, freebayes.20:45000000-45100000.baq.20110328.vcf, freebayes.20:45100000-45200000.baq.20110328.vcf, freebayes.20:45200000-45300000.baq.20110328.vcf, freebayes.20:45300000-45400000.baq.20110328.vcf, freebayes.20:45400000-45500000.baq.20110328.vcf, freebayes.20:45500000-45600000.baq.20110328.vcf, freebayes.20:45600000-45700000.baq.20110328.vcf, freebayes.20:45700000-45800000.baq.20110328.vcf, freebayes.20:45800000-45900000.baq.20110328.vcf, freebayes.20:45900000-46000000.baq.20110328.vcf, freebayes.20:46000000-46100000.baq.20110328.vcf, freebayes.20:46100000-46200000.baq.20110328.vcf, freebayes.20:46200000-46300000.baq.20110328.vcf, freebayes.20:46300000-46400000.baq.20110328.vcf, freebayes.20:46400000-46500000.baq.20110328.vcf, freebayes.20:46500000-46600000.baq.20110328.vcf, freebayes.20:46600000-46700000.baq.20110328.vcf, freebayes.20:46700000-46800000.baq.20110328.vcf, freebayes.20:46800000-46900000.baq.20110328.vcf, freebayes.20:46900000-47000000.baq.20110328.vcf, freebayes.20:47000000-47100000.baq.20110328.vcf, freebayes.20:47100000-47200000.baq.20110328.vcf, freebayes.20:47200000-47300000.baq.20110328.vcf, freebayes.20:47300000-47400000.baq.20110328.vcf, freebayes.20:47400000-47500000.baq.20110328.vcf, freebayes.20:47500000-47600000.baq.20110328.vcf, freebayes.20:47600000-47700000.baq.20110328.vcf, freebayes.20:47700000-47800000.baq.20110328.vcf, freebayes.20:47800000-47900000.baq.20110328.vcf, freebayes.20:47900000-48000000.baq.20110328.vcf, freebayes.20:48000000-48100000.baq.20110328.vcf, freebayes.20:48100000-48200000.baq.20110328.vcf, freebayes.20:48200000-48300000.baq.20110328.vcf, freebayes.20:48300000-48400000.baq.20110328.vcf, freebayes.20:48400000-48500000.baq.20110328.vcf, freebayes.20:48500000-48600000.baq.20110328.vcf, freebayes.20:48600000-48700000.baq.20110328.vcf, freebayes.20:48700000-48800000.baq.20110328.vcf, freebayes.20:48800000-48900000.baq.20110328.vcf, freebayes.20:48900000-49000000.baq.20110328.vcf, freebayes.20:49000000-49100000.baq.20110328.vcf, freebayes.20:49100000-49200000.baq.20110328.vcf, freebayes.20:49200000-49300000.baq.20110328.vcf, freebayes.20:49300000-49400000.baq.20110328.vcf, freebayes.20:49400000-49500000.baq.20110328.vcf, freebayes.20:49500000-49600000.baq.20110328.vcf, freebayes.20:49600000-49700000.baq.20110328.vcf, freebayes.20:49700000-49800000.baq.20110328.vcf, freebayes.20:49800000-49900000.baq.20110328.vcf, freebayes.20:49900000-50000000.baq.20110328.vcf, freebayes.20:50000000-50100000.baq.20110328.vcf, freebayes.20:50100000-50200000.baq.20110328.vcf, freebayes.20:50200000-50300000.baq.20110328.vcf, freebayes.20:50300000-50400000.baq.20110328.vcf, freebayes.20:50400000-50500000.baq.20110328.vcf, freebayes.20:50500000-50600000.baq.20110328.vcf, freebayes.20:50600000-50700000.baq.20110328.vcf, freebayes.20:50700000-50800000.baq.20110328.vcf, freebayes.20:50800000-50900000.baq.20110328.vcf, freebayes.20:50900000-51000000.baq.20110328.vcf, freebayes.20:51000000-51100000.baq.20110328.vcf, freebayes.20:51100000-51200000.baq.20110328.vcf, freebayes.20:51200000-51300000.baq.20110328.vcf, freebayes.20:51300000-51400000.baq.20110328.vcf, freebayes.20:51400000-51500000.baq.20110328.vcf, freebayes.20:51500000-51600000.baq.20110328.vcf, freebayes.20:51600000-51700000.baq.20110328.vcf, freebayes.20:51700000-51800000.baq.20110328.vcf, freebayes.20:51800000-51900000.baq.20110328.vcf, freebayes.20:51900000-52000000.baq.20110328.vcf, freebayes.20:52000000-52100000.baq.20110328.vcf, freebayes.20:52100000-52200000.baq.20110328.vcf, freebayes.20:52200000-52300000.baq.20110328.vcf, freebayes.20:52300000-52400000.baq.20110328.vcf, freebayes.20:52400000-52500000.baq.20110328.vcf, freebayes.20:52500000-52600000.baq.20110328.vcf, freebayes.20:52600000-52700000.baq.20110328.vcf, freebayes.20:52700000-52800000.baq.20110328.vcf, freebayes.20:52800000-52900000.baq.20110328.vcf, freebayes.20:52900000-53000000.baq.20110328.vcf, freebayes.20:53000000-53100000.baq.20110328.vcf, freebayes.20:53100000-53200000.baq.20110328.vcf, freebayes.20:53200000-53300000.baq.20110328.vcf, freebayes.20:53300000-53400000.baq.20110328.vcf, freebayes.20:53400000-53500000.baq.20110328.vcf, freebayes.20:53500000-53600000.baq.20110328.vcf, freebayes.20:53600000-53700000.baq.20110328.vcf, freebayes.20:53700000-53800000.baq.20110328.vcf, freebayes.20:53800000-53900000.baq.20110328.vcf, freebayes.20:53900000-54000000.baq.20110328.vcf, freebayes.20:54000000-54100000.baq.20110328.vcf, freebayes.20:54100000-54200000.baq.20110328.vcf, freebayes.20:54200000-54300000.baq.20110328.vcf, freebayes.20:54300000-54400000.baq.20110328.vcf, freebayes.20:54400000-54500000.baq.20110328.vcf, freebayes.20:54500000-54600000.baq.20110328.vcf, freebayes.20:54600000-54700000.baq.20110328.vcf, freebayes.20:54700000-54800000.baq.20110328.vcf, freebayes.20:54800000-54900000.baq.20110328.vcf, freebayes.20:54900000-55000000.baq.20110328.vcf, freebayes.20:55000000-55100000.baq.20110328.vcf, freebayes.20:55100000-55200000.baq.20110328.vcf, freebayes.20:55200000-55300000.baq.20110328.vcf, freebayes.20:55300000-55400000.baq.20110328.vcf, freebayes.20:55400000-55500000.baq.20110328.vcf, freebayes.20:55500000-55600000.baq.20110328.vcf, freebayes.20:55600000-55700000.baq.20110328.vcf, freebayes.20:55700000-55800000.baq.20110328.vcf, freebayes.20:55800000-55900000.baq.20110328.vcf, freebayes.20:55900000-56000000.baq.20110328.vcf, freebayes.20:56000000-56100000.baq.20110328.vcf, freebayes.20:56100000-56200000.baq.20110328.vcf, freebayes.20:56200000-56300000.baq.20110328.vcf, freebayes.20:56300000-56400000.baq.20110328.vcf, freebayes.20:56400000-56500000.baq.20110328.vcf, freebayes.20:56500000-56600000.baq.20110328.vcf, freebayes.20:56600000-56700000.baq.20110328.vcf, freebayes.20:56700000-56800000.baq.20110328.vcf, freebayes.20:56800000-56900000.baq.20110328.vcf, freebayes.20:56900000-57000000.baq.20110328.vcf, freebayes.20:57000000-57100000.baq.20110328.vcf, freebayes.20:57100000-57200000.baq.20110328.vcf, freebayes.20:57200000-57300000.baq.20110328.vcf, freebayes.20:57300000-57400000.baq.20110328.vcf, freebayes.20:57400000-57500000.baq.20110328.vcf, freebayes.20:57500000-57600000.baq.20110328.vcf, freebayes.20:57600000-57700000.baq.20110328.vcf, freebayes.20:57700000-57800000.baq.20110328.vcf, freebayes.20:57800000-57900000.baq.20110328.vcf, freebayes.20:57900000-58000000.baq.20110328.vcf, freebayes.20:58000000-58100000.baq.20110328.vcf, freebayes.20:58100000-58200000.baq.20110328.vcf, freebayes.20:58200000-58300000.baq.20110328.vcf, freebayes.20:58300000-58400000.baq.20110328.vcf, freebayes.20:58400000-58500000.baq.20110328.vcf, freebayes.20:58500000-58600000.baq.20110328.vcf, freebayes.20:58600000-58700000.baq.20110328.vcf, freebayes.20:58700000-58800000.baq.20110328.vcf, freebayes.20:58800000-58900000.baq.20110328.vcf, freebayes.20:58900000-59000000.baq.20110328.vcf, freebayes.20:59000000-59100000.baq.20110328.vcf, freebayes.20:59100000-59200000.baq.20110328.vcf, freebayes.20:59200000-59300000.baq.20110328.vcf, freebayes.20:59300000-59400000.baq.20110328.vcf, freebayes.20:59400000-59500000.baq.20110328.vcf, freebayes.20:59500000-59600000.baq.20110328.vcf, freebayes.20:59600000-59700000.baq.20110328.vcf, freebayes.20:59700000-59800000.baq.20110328.vcf, freebayes.20:59800000-59900000.baq.20110328.vcf, freebayes.20:59900000-60000000.baq.20110328.vcf, freebayes.20:60000000-60100000.baq.20110328.vcf, freebayes.20:60100000-60200000.baq.20110328.vcf, freebayes.20:60200000-60300000.baq.20110328.vcf, freebayes.20:60300000-60400000.baq.20110328.vcf, freebayes.20:60400000-60500000.baq.20110328.vcf, freebayes.20:60500000-60600000.baq.20110328.vcf, freebayes.20:60600000-60700000.baq.20110328.vcf, freebayes.20:60700000-60800000.baq.20110328.vcf, freebayes.20:60800000-60900000.baq.20110328.vcf, freebayes.20:60900000-61000000.baq.20110328.vcf, freebayes.20:61000000-61100000.baq.20110328.vcf, freebayes.20:61100000-61200000.baq.20110328.vcf, freebayes.20:61200000-61300000.baq.20110328.vcf, freebayes.20:61300000-61400000.baq.20110328.vcf, freebayes.20:61400000-61500000.baq.20110328.vcf, freebayes.20:61500000-61600000.baq.20110328.vcf, freebayes.20:61600000-61700000.baq.20110328.vcf, freebayes.20:61700000-61800000.baq.20110328.vcf, freebayes.20:61800000-61900000.baq.20110328.vcf, freebayes.20:61900000-62000000.baq.20110328.vcf, freebayes.20:62000000-62100000.baq.20110328.vcf, freebayes.20:62100000-62200000.baq.20110328.vcf, freebayes.20:62200000-62300000.baq.20110328.vcf, freebayes.20:62300000-62400000.baq.20110328.vcf, freebayes.20:62400000-62500000.baq.20110328.vcf, freebayes.20:62500000-62600000.baq.20110328.vcf, freebayes.20:62600000-62700000.baq.20110328.vcf, freebayes.20:62700000-62800000.baq.20110328.vcf, freebayes.20:62800000-62900000.baq.20110328.vcf, freebayes.20:62900000-63000000.baq.20110328.vcf, freebayes.20:63000000-63025520.baq.20110328.vcf +#CHROM POS ID REF ALT QUAL FILTER INFO +20 458502 . G GA 4567.01 PASS AA=20;AB=0.61111;ABA=14;ABP=6.8707;ABR=22;AC=38;AF=0.0544;AN=698;BL=374;BR=1129;BVAR;BaseQRankSum=13.364;DP=15979;DP4=1882,2188,45,37;Dels=0.00;EL=5;EPP=13.868;ER=15;FR;FS=6.503;HETAR=11;HOMA=2;HOMR=985;HP=1;HPLen=2;HR=2;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.0157;IndelType=INS.NOVEL_1.Novel_A.;LEN=1;LRB=0.50233;LRBP=826.56;MQ=66.16;MQ0Fraction=0.0110;MQM=70.5;MQRankSum=-3.158;NF;NR;NS=998;PP;PV4=0.15,1,0.42,0.15;RA=3173;RL=1;RPP=38.188;RR=19;RUN=1;ReadPosRankSum=-2.346;SAB=0.7;SAF=14;SAP=9.959;SAR=6;SC=GGGCGTGGTGGTGCATGTAAT;SRB=0.50047;SRF=1588;SRP=3.0165;SRR=1585;TC;TR=9;TU=GGT;VQSLOD=10.0079;set=Intersection;sumGLbyD=23.94 +20 573764 . TA T 591.51 PASS AC=91;AF=0.1987;AN=458;BaseQRankSum=0.137;DP=519;FS=3.153;HRun=1;HaplotypeScore=14.0744;InbreedingCoeff=0.1460;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;MQ=48.16;MQ0=26;MQ0Fraction=0.0501;MQRankSum=-1.636;QD=3.63;ReadPosRankSum=-4.140;SB=-408.14;VQSLOD=5.2458;set=VQSR +20 766143 . C CATCTGGTA 5521.70 PASS AA=24;AB=0.5;ABA=18;ABP=3.0103;ABR=18;AC=14;AF=0.0289;AF1=0.02038;AN=484;BL=655;BR=1542;BVAR;BaseQRankSum=3.801;CI95=0.01549,0.02655;DP=11749;DP4=2222,1998,14,8;Dels=0.00;EL=9;EPP=6.2675;ER=15;FQ=999;FR;FS=2.941;HETAR=9;HOMA=4;HOMR=901;HP=2;HPLen=2;HR=1;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.0515;IndelType=INS.NumRepetitions_1.EventLength_8.;LEN=8;LRB=0.40373;LRBP=780.64;MQ=56.81;MQ0Fraction=0.0253;MQM=22.167;MQRankSum=-4.809;NF;NR;NS=914;PP;PV4=0.39,1,5.8e-07,1;RA=3093;RL=6;RPP=16.039;RR=18;RUN=1;ReadPosRankSum=-2.827;SAB=0.625;SAF=15;SAP=6.2675;SAR=9;SC=GCTTTAAATTCATCTGGTACT;SRB=0.61623;SRF=1906;SRP=365.95;SRR=1187;TC;TR=1;TU=A;VQSLOD=7.0268;set=Intersection;sumGLbyD=50.23 +20 997076 rs11467490 CTG C 15379.78 PASS AA=195;AB=0.59878;ABA=132;ABP=30.896;ABR=197;AC=173;AF=0.14562;AN=1188;BL=7664;BR=7309;BVAR;BaseQRankSum=21.853;DB;DEL;DP=27127;DP4=1801,2002,241,282;Dels=0.13;EL=100;EPP=3.2887;ER=95;FQ=999;FR;FS=6.591;HETAR=77;HOMA=42;HOMR=815;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1284;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_TG.;LEN=2;LRB=0.023709;LRBP=21.287;MQ=61.18;MQ0Fraction=0.0214;MQM=43.041;MQRankSum=6.886;NF;NR;NS=934;PP;PV4=0.61,1.5e-78,1,1;RA=2800;RL=120;RPP=25.56;RR=75;RUN=1;ReadPosRankSum=4.504;SAB=0.62051;SAF=121;SAP=27.609;SAR=74;SC=CAGCTAATTACTGTATTTTTA;SRB=0.49821;SRF=1395;SRP=3.0879;SRR=1405;TC;TR=1;TU=T;VQSLOD=8.9396;set=Intersection;sumGLbyD=16.76 +20 1042261 rs10597473 CCCTG C 168658.05 PASS AA=4481;AB=0.29043;ABA=2128;ABP=1147.1;ABR=871;AC=1172;AF=0.97830;AN=1198;BL=169975;BR=194027;BVAR;BaseQRankSum=4.599;DB;DEL;DP=29418;DP4=29,47,1441,2403;Dels=0.84;EL=2358;EPP=29.772;ER=2123;FR;FS=9.122;HETAR=482;HOMA=559;HOMR=30;HP=2;HPLen=3;HR=3;HRun=0;HU=C;INDEL;InbreedingCoeff=0.0470;IndelType=DEL.NumRepetitions_2.EventLength_4.;LEN=4;LRB=0.066077;LRBP=3454.1;MQ=104.58;MQ0=4;MQ0Fraction=0.0014;MQM=58.257;MQRankSum=-3.368;NF;NR;NS=1071;PP;PV4=0.91,6.8e-09,2.8e-05,1;RA=1039;RL=2088;RPP=48.09;RR=2393;RUN=1;ReadPosRankSum=5.288;SAB=0.41442;SAF=1857;SAP=288.09;SAR=2624;SC=CCAAACCCAACCCTGCCTGGC;SRB=0.48893;SRF=508;SRP=4.1159;SRR=531;TC;TR=8;TU=CCTG;VQSLOD=8.5148;dbSNP=120;set=Intersection;sumGLbyD=59.79 +20 1046297 rs33956316 C CT,CTT,CTTT 17698 PASS ABR=408;AC=432,79,230;AF=0.39779,0.07274,0.21179;BVAR;BaseQRankSum=-8.413;DB;DP=15649;DP4=147,199,534,436;FR;FS=11.580;HOMA=97;HOMR=457;HP=20;HR=16;HU=T;HaplotypeScore=16.0590;INDEL;INS;InbreedingCoeff=0.6018;IndelType=MULTIALLELIC_INDEL;KGPilot123;MQ0=19;MQ0Fraction=0.0093;MQRankSum=7.992;NF;NR;NS=767;PP;PV4=6e-05,1,1,1;QD=8.18;RA=1183;RUN=1;ReadPosRankSum=2.684;SB=-6384.08;SC=GGAAAATTTTCTTTTTTTTTT;SRB=0.40913;SRF=484;SRP=87.859;SRR=699;TC;TR=16;TU=T;VQSLOD=8.4941;dbSNP=132;set=Intersection +20 1405740 . T TA 257.28 PASS AF=0.0188;BaseQRankSum=-0.745;DP=3769;Dels=0.00;FS=0.742;HPLen=9;HRun=9;InbreedingCoeff=0.0462;IndelType=INS.NumRepetitions_9.EventLength_1.RepeatExpansion_A.;MQ0Fraction=0.0151;MQRankSum=-0.090;ReadPosRankSum=-1.582;VQSLOD=5.6502;set=Intersection;sumGLbyD=6.94 +20 1690501 . TC T 27928 PASS AA=108;AB=0.91372;ABA=100;ABP=1726.1;ABR=1059;AC=35;AF=0.02966;AN=1180;BL=593;BR=6973;BVAR;BaseQRankSum=7.567;DEL;DP=10612;Dels=0.01;EL=50;EPP=4.2971;ER=58;FS=0.000;HETAR=378;HOMA=184;HOMR=477;HRun=1;InbreedingCoeff=0.0495;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.84325;LRBP=11685;MQ0=0;MQ0Fraction=0.0000;MQM=87.361;MQRankSum=4.088;NS=1045;RA=3125;RL=3;RPP=212.2;RR=105;RUN=1;ReadPosRankSum=-13.096;SAB=0.56481;SAF=61;SAP=6.9511;SAR=47;SRB=0.51776;SRF=1618;SRP=11.572;SRR=1507;VQSLOD=3.9824;set=filterInVQSR-2of5;sumGLbyD=4.07 +20 1991285 rs113891396 TAA T,TA,TAAA,TAAAAA,TAAAAAA,TAAAAAAA,TAAAAAAAA 39235.36 PASS AC=5,251,20,39,188,52,79;AF=0.0056,0.2789,0.0222,0.0433,0.2089,0.0578,0.0878;AN=900;BVAR;BaseQRankSum=1.124;DB;DEL;DP=54393;DP4=906,772,824,579;Dels=0.21;FR;FS=37.525;HP=12;HR=12;HRun=12;HU=A;INDEL;INS;InbreedingCoeff=0.6891;IndelType=MULTIALLELIC_INDEL;MQ=76.81;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-6.593;NF;NR;PP;PV4=0.0087,1,6.3e-19,1;RUN=1;ReadPosRankSum=-2.184;SC=ATCTGCCACTTAAAAAAAAAA;TC;TR=12;TU=A;VQSLOD=9.0007;dbSNP=132;set=Intersection;sumGLbyD=11.45 +20 2355911 . TA T 11723 PASS AA=79;AB=0.9393;ABA=57;ABP=1577;ABR=882;AC=38;AF=0.0411;AN=924;BL=644;BR=5536;BVAR;BaseQRankSum=2.434;DEL;DP=9687;Dels=0.00;EL=45;EPP=6.3362;ER=34;FS=3.043;HETAR=321;HOMA=182;HOMR=555;HRun=5;InbreedingCoeff=0.0412;IndelType=DEL.NumRepetitions_5.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.79159;LRBP=8411.9;MQ0=0;MQ0Fraction=0.0000;MQM=70.848;MQRankSum=0.137;NS=1058;RA=3415;RL=3;RPP=149.49;RR=76;RUN=1;ReadPosRankSum=-12.116;SAB=0.44304;SAF=35;SAP=5.2367;SAR=44;SRB=0.43572;SRF=1488;SRP=125.55;SRR=1927;VQSLOD=3.8910;set=filterInVQSR-2of5;sumGLbyD=4.88 +20 2771621 rs11479849 GT G,GTT 1605.60 PASS AA=80;AB=0.79825;ABA=69;ABP=267.24;ABR=273;AC=79,91;AF=0.06551,0.07546;AN=1206;BL=2593;BR=3805;BVAR;BaseQRankSum=7.825;DB;DP=9790;Dels=0.04;EL=37;EPP=3.9875;ER=43;FR;FS=4.751;HETAR=62;HOMA=5;HOMR=958;HP=11;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.2646;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.18943;LRBP=501.57;MQ0=0;MQ0Fraction=0.0000;MQM=52.45;MQRankSum=-0.560;NF;NR;NS=1025;PP;RA=3949;RL=29;RPP=16.148;RR=51;RUN=1;ReadPosRankSum=-2.397;SAB=0.525;SAF=42;SAP=3.4446;SAR=38;SC=TCATTTTAACGTTTTTTTTTT;SRB=0.54368;SRF=2147;SRP=68.46;SRR=1802;TC;TR=11;TU=T;VQSLOD=3.5989;set=filterInVQSR-2of5;sumGLbyD=3.92 +20 2891235 . G GT,GTTT 2869.87 PASS AC=236,246;AF=0.2803,0.2922;AN=842;BaseQRankSum=8.979;DP=1067;FS=3.911;HaplotypeScore=20.3595;InbreedingCoeff=0.6511;IndelType=MULTIALLELIC_INDEL;MQ=44.86;MQ0=114;MQ0Fraction=0.1068;MQRankSum=-2.273;QD=4.00;ReadPosRankSum=-6.601;SB=-991.85;VQSLOD=5.4379;set=VQSR +20 3033550 . TGAG T 2005.90 PASS AA=34;AB=0.51429;ABA=34;ABP=3.1344;ABR=36;AC=22;AF=0.0332;AN=662;BL=1374;BR=1649;BVAR;BaseQRankSum=5.192;DEL;DP=14639;DP4=2271,1492,12,21;Dels=0.02;EL=19;EPP=4.0322;ER=15;FR;FS=16.657;HETAR=17;HOMA=0;HOMR=914;HP=1;HPLen=1;HR=1;HRun=0;HU=G;INDEL;InbreedingCoeff=-0.0454;IndelType=DEL.NumRepetitions_1.EventLength_3.;LEN=3;LRB=0.090969;LRBP=57.333;MQ=53.99;MQ0Fraction=0.0304;MQM=46.735;MQRankSum=1.938;NF;NR;NS=931;PP;PV4=0.0068,9.4e-05,1,1;RA=2985;RL=11;RPP=12.207;RR=23;RUN=1;ReadPosRankSum=-0.466;SAB=0.41176;SAF=14;SAP=5.3095;SAR=20;SC=CTTGGGAGGCTGAGGTGGGAG;SRB=0.62781;SRF=1874;SRP=426.52;SRR=1111;TC;TR=1;TU=G;VQSLOD=8.9194;set=Intersection;sumGLbyD=24.41 +20 3873327 rs61519218 A AAG 683.85 PASS AC=25;AF=0.0313;AN=800;BaseQRankSum=4.839;DB;DP=1718;FS=4.265;HRun=0;HaplotypeScore=20.5789;InbreedingCoeff=0.1055;IndelType=INS.NOVEL_2.;MQ=53.70;MQ0=37;MQ0Fraction=0.0215;MQRankSum=2.468;QD=6.30;ReadPosRankSum=4.254;SB=-403.21;VQSLOD=6.1858;set=VQSR +20 4028835 . GC G 2511.30 PASS AA=66;AB=0.56954;ABA=65;ABP=9.3521;ABR=86;AC=22;AF=0.01836;AN=1198;BL=2303;BR=2463;BVAR;BaseQRankSum=7.621;DEL;DP=22795;DP4=1714,2774,22,37;Dels=0.02;EL=34;EPP=3.1419;ER=32;FQ=999;FR;FS=2.095;HETAR=21;HOMA=0;HOMR=1050;HP=2;HPLen=2;HR=2;HRun=2;HU=C;INDEL;InbreedingCoeff=0.0125;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.033571;LRBP=14.674;MQ=108.09;MQ0=0;MQ0Fraction=0.0000;MQM=53.318;MQRankSum=5.257;NF;NR;NS=1071;PP;PV4=1,5.4e-13,1,0.075;RA=6185;RL=36;RPP=4.1947;RR=30;RUN=1;ReadPosRankSum=-1.059;SAB=0.45455;SAF=30;SAP=4.1947;SAR=36;SC=TGCTGTCACTGCCTTCTCCTA;SRB=0.42118;SRF=2605;SRP=336.76;SRR=3580;TC;TR=2;TU=C;VQSLOD=10.2409;set=Intersection;sumGLbyD=12.71 +20 4039609 rs67812039 G GA 43457 PASS AA=909;AB=0.54639;ABA=572;ABP=26.583;ABR=689;AC=302;AF=0.3455;AN=874;BL=37070;BR=38211;BVAR;BaseQRankSum=20.147;DB;DP=25595;DP4=1483,1374,528,542;Dels=0.00;EL=467;EPP=4.5033;ER=442;FQ=999;FR;FS=5.441;HETAR=243;HOMA=127;HOMR=608;HP=4;HPLen=3;HR=3;HRun=3;HU=A;INDEL;INS;InbreedingCoeff=0.1388;IndelType=INS.NumRepetitions_3.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.015157;LRBP=40.563;MQ=119.50;MQ0=0;MQ0Fraction=0.0000;MQM=83.197;MQRankSum=1.080;NF;NR;NS=978;PP;PV4=0.16,1,3.6e-12,1;RA=3033;RL=443;RPP=4.274;RR=466;RUN=1;ReadPosRankSum=-1.000;SAB=0.32233;SAF=293;SAP=252.24;SAR=616;SC=TATGTTGGGAGAAATATCAGT;SRB=0.38378;SRF=1164;SRP=358.85;SRR=1869;TC;TR=4;TU=AG;VQSLOD=9.9146;dbSNP=130;set=Intersection;sumGLbyD=16.79 +20 4390056 . TC T 49312 PASS AA=91;AB=0.94353;ABA=86;ABP=2605.4;ABR=1437;AC=39;AF=0.03160;AN=1234;BL=6823;BR=731;BVAR;BaseQRankSum=2.727;DEL;DP=13149;Dels=0.00;EL=41;EPP=4.9431;ER=50;FS=4.002;HETAR=465;HOMA=313;HOMR=292;HRun=3;InbreedingCoeff=0.0326;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.80646;LRBP=10671;MQ0=0;MQ0Fraction=0.0000;MQM=69.824;MQRankSum=-0.903;NS=1073;RA=3078;RL=89;RPP=183.62;RR=2;RUN=1;ReadPosRankSum=-12.526;SAB=0.45055;SAF=41;SAP=4.9431;SAR=50;SRB=0.52567;SRF=1618;SRP=20.622;SRR=1460;VQSLOD=4.3235;set=Intersection;sumGLbyD=3.53 +20 4474622 . TA T,TAA,TAAA,TAAAA 94522.28 PASS ABR=114;AC=38,68,16,900;AF=0.03333,0.05965,0.01404,0.78947;AN=1140;BVAR;BaseQRankSum=9.741;DB;DP=16656;Dels=0.00;FR;FS=2.355;HOMA=3;HOMR=936;HP=10;HPLen=10;HR=10;HRun=10;HU=A;INS;InbreedingCoeff=0.4516;IndelType=MULTIALLELIC_INDEL;MQ0=2;MQ0Fraction=0.0008;MQRankSum=-4.096;NF;NR;NS=980;PP;RA=3766;RUN=1;ReadPosRankSum=2.380;SC=AGAAAAAAATTAAAAAAAAAA;SRB=0.49734;SRF=1873;SRP=3.2409;SRR=1893;TC;TR=10;TU=A;VQSLOD=8.8186;set=Intersection;sumGLbyD=38.79 +20 4824911 . AC A 41998.70 PASS AC=1172;AF=0.97342;AN=1204;BaseQRankSum=8.604;DP=3615;FS=9.934;HRun=1;HaplotypeScore=39.6843;InbreedingCoeff=0.0980;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=129.80;MQ0=1;MQ0Fraction=0.0003;MQRankSum=3.378;QD=11.62;ReadPosRankSum=6.967;SB=-16955.28;VQSLOD=4.2689;set=VQSR +20 4839897 rs35881880 TAA T,TA,TAAA,TAAAAA 3906.80 PASS AC=12,95,137,189;AF=0.01024,0.08106,0.11689,0.16126;AN=1172;BVAR;BaseQRankSum=15.271;DB;DEL;DP=15105;Dels=0.04;FR;FS=43.567;HP=19;HR=13;HRun=13;HU=A;INS;InbreedingCoeff=0.5716;IndelType=MULTIALLELIC_INDEL;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.569;NF;NR;PP;RUN=1;ReadPosRankSum=-13.794;SC=TGTTAAAAAATAAAAAAAAAA;TC;TR=13;TU=A;VQSLOD=8.1773;set=Intersection;sumGLbyD=3.77 +20 5507414 . G GCC 439.08 PASS AC=23;AF=0.01876;AN=1226;BaseQRankSum=3.051;DP=3023;FS=3.636;HRun=1;HaplotypeScore=30.3104;InbreedingCoeff=0.0204;IndelType=INS.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=112.09;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.065;QD=2.85;ReadPosRankSum=-2.709;SB=-302.22;VQSLOD=4.4311;set=VQSR +20 5609676 . GA G,GAA 799.89 PASS AA=42;AB=0.79096;ABA=37;ABP=133.16;ABR=140;AC=43,65;AF=0.03607,0.05453;AF1=0.02826;AN=1192;BL=1360;BR=2334;BVAR;BaseQRankSum=5.069;CI95=0.01242,0.04037;DP=15610;DP4=1548,2441,21,30;Dels=0.02;EL=18;EPP=4.8716;ER=24;FQ=12.1;FR;FS=0.000;HETAR=36;HOMA=1;HOMR=991;HP=13;HPLen=10;HR=10;HRun=10;HU=A;INDEL;INS;InbreedingCoeff=0.2001;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.26367;LRBP=560.68;MQ=63.29;MQ0Fraction=0.0003;MQM=44.143;MQRankSum=1.755;NF;NR;NS=1028;PP;PV4=0.77,1,0.0087,0.0053;RA=4114;RL=15;RPP=10.455;RR=27;RUN=1;ReadPosRankSum=-2.978;SAB=0.5;SAF=21;SAP=3.0103;SAR=21;SC=AAAAAAGAAAGAAAAAAAAAA;SRB=0.39742;SRF=1635;SRP=379;SRR=2479;TC;TR=11;TU=AAAG;VQSLOD=4.1229;set=filterInVQSR-2of5;sumGLbyD=7.95 +20 5736211 rs35303106 CT C,CTT 4384.40 PASS AA=117;AB=0.71499;ABA=116;ABP=166.4;ABR=291;AC=32,145;AF=0.02712,0.12288;AN=1180;BL=5556;BR=4901;BVAR;BaseQRankSum=2.708;DB;DP=9157;Dels=0.01;EL=54;EPP=4.5136;ER=63;FR;FS=2.802;HETAR=79;HOMA=1;HOMR=837;HP=16;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.1903;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.062637;LRBP=92.1;MQ0Fraction=0.0273;MQM=48.932;MQRankSum=3.654;NF;NR;NS=917;PP;RA=2785;RL=79;RPP=34.209;RR=38;RUN=1;ReadPosRankSum=0.795;SAB=0.5641;SAF=66;SAP=7.1862;SAR=51;SC=TTTTCTTTTTCTTTTTTTTTT;SRB=0.41795;SRF=1164;SRP=165.85;SRR=1621;TC;TR=11;TU=T;VQSLOD=5.0895;set=Intersection;sumGLbyD=4.66 +20 5898626 rs34483659 CAAA C,CA,CAA,CAAAAA 1140.16 PASS ABR=34;AC=19,98,56,199;AF=0.0227,0.1172,0.0670,0.2380;AF1=0.08519;BVAR;BaseQRankSum=5.049;CI95=0.03727,0.1273;DB;DEL;DP=5091;DP4=539,408,121,123;FQ=4.43;FR;FS=5.701;HOMA=64;HOMR=156;HP=19;HR=18;HU=A;HaplotypeScore=11.5333;INDEL;InbreedingCoeff=0.7405;IndelType=MULTIALLELIC_INDEL;MQ0=117;MQ0Fraction=0.0986;MQRankSum=6.290;NF;NR;NS=240;PP;PV4=0.043,1,1,0.0087;QD=1.22;RA=204;RUN=1;ReadPosRankSum=-2.684;SB=-1015.09;SC=ACTAAAAATACAAAAAAAAAA;SRB=0.35294;SRF=72;SRP=41.33;SRR=132;TC;TR=18;TU=A;VQSLOD=4.1696;set=filterInVQSR-2of5 +20 5975126 rs10541892 C CAG 504.78 PASS AC=79;AF=0.07004;AN=1128;BaseQRankSum=10.498;DB;DP=2050;FS=38.228;HRun=0;HaplotypeScore=14.1426;InbreedingCoeff=-0.0053;IndelType=INS.NOVEL_2.;MQ=60.40;MQ0=80;MQ0Fraction=0.0390;MQRankSum=5.098;QD=1.63;ReadPosRankSum=-4.851;SB=-590.69;VQSLOD=4.8517;set=VQSR +20 6040983 rs11087710 A AAAAAAGAG,AAAAAGAG,AAAAGAG,AAAAGAGAG,AAAGAG,AAAGAGAG,AAGAG,AAGAGAG,AG,AGAG,AGAGAG 66894.55 PASS ABR=468;AC=80,9,20,136,31,91,33,29,9,3,5;AF=0.0980,0.0110,0.0245,0.1667,0.0380,0.1115,0.0404,0.0355,0.0110,0.0037,0.0061;AN=816;BVAR;BaseQRankSum=-12.470;DB;DP=38726;DP4=426,611,310,472;Dels=0.00;FQ=999;FR;FS=6.635;HOMA=110;HOMR=506;HP=14;HR=15;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.8291;IndelType=MULTIALLELIC_INDEL;KGPilot123;MQ=54.22;MQ0Fraction=0.0168;MQRankSum=-5.329;NF;NR;NS=861;PP;PV4=0.56,1,6.9e-09,0.31;RA=1828;RUN=1;ReadPosRankSum=-7.857;SC=AAAAAAAAAAAAGAGAGAGAG;SRB=0.62418;SRF=1141;SRP=247.85;SRR=687;TC;TR=15;TU=A;VQSLOD=9.0574;dbSNP=131;set=Intersection;sumGLbyD=36.72 +20 7024548 . G GAT 5041.27 PASS AC=123;AF=0.10336;AN=1190;BaseQRankSum=23.097;DP=3045;FS=7.979;HRun=0;HaplotypeScore=15.6967;InbreedingCoeff=0.1062;IndelType=INS.NumRepetitions_5.EventLength_2.RepeatExpansion_AT.;MQ=119.29;MQ0=2;MQ0Fraction=0.0007;MQRankSum=-3.725;QD=8.97;ReadPosRankSum=-1.636;SB=-2257.45;VQSLOD=5.9332;set=VQSR +20 7484554 . A AT 5.09 PASS AC=0;AF=0.0000;AN=710;BaseQRankSum=-0.696;DP=1862;FS=2.835;HRun=9;HaplotypeScore=13.5425;InbreedingCoeff=0.0567;IndelType=INS.NumRepetitions_9.EventLength_1.RepeatExpansion_T.;MQ=76.92;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.932;ReadPosRankSum=-1.701;VQSLOD=4.3156;set=VQSR +20 7632194 rs77286341 GAA AAA,G 5324 PASS AC=0;AF=0.0000;AN=700;BaseQRankSum=-1.741;DB;DP=1772;FR;HP=4;HPLen=3;HR=3;HRun=0;HU=A;HaplotypeScore=60.1795;InbreedingCoeff=0.0017;IndelType=MIXED;MQ=70.69;MQ0=13;MQ0Fraction=0.0073;MQRankSum=-1.315;NF;NR;PP;ReadPosRankSum=-3.650;SC=GAGAGAGAGAGAAAGGTGTAA;TC;TR=13;TU=AG;set=filterInVQSR-2of5 +20 7767508 rs71329674 G GA 17914 PASS AA=415;AB=0.61617;ABA=337;ABP=105.94;ABR=541;AC=141;AF=0.11614;AN=1214;BL=15187;BR=20323;BVAR;BaseQRankSum=-13.946;DB;DP=28222;Dels=0.00;EL=184;EPP=14.569;ER=231;FQ=999;FR;FS=13.296;HETAR=178;HOMA=35;HOMR=822;HP=14;HPLen=9;HR=9;HRun=9;HU=A;INDEL;INS;InbreedingCoeff=0.0714;IndelType=INS.NumRepetitions_9.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.14464;LRBP=1616.1;MQ=89.69;MQ0=1;MQ0Fraction=0.0003;MQM=51.667;MQRankSum=0.664;NF;NR;NS=1035;PP;RA=3707;RL=171;RPP=30.894;RR=244;RUN=1;ReadPosRankSum=-1.120;SAB=0.45301;SAF=188;SAP=10.969;SAR=227;SC=ATTCTAAAAAGAAAAAAAAAT;SRB=0.38495;SRF=1427;SRP=429.23;SRR=2280;TC;TR=9;TU=A;VQSLOD=9.0748;set=Intersection;sumGLbyD=11.09 +20 7920261 . TA T,TAA 802.15 PASS AA=28;AB=0.8;ABA=28;ABP=112.45;ABR=112;AC=22,39;AF=0.01836,0.03255;AN=1198;BL=943;BR=1487;BVAR;BaseQRankSum=2.233;DP=10645;Dels=0.01;EL=11;EPP=5.8022;ER=17;FR;FS=1.691;HETAR=20;HOMA=0;HOMR=1007;HP=10;HPLen=9;HR=9;HRun=9;HU=A;INS;InbreedingCoeff=0.2256;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.22387;LRBP=267.46;MQ0=0;MQ0Fraction=0.0000;MQM=57.571;MQRankSum=0.940;NF;NR;NS=1027;PP;RA=4776;RL=8;RPP=14.178;RR=20;RUN=1;ReadPosRankSum=-1.567;SAB=0.53571;SAF=15;SAP=3.3205;SAR=13;SC=GTAACTGCTATAAAAAAAAAC;SRB=0.48576;SRF=2320;SRP=11.42;SRR=2456;TC;TR=9;TU=A;VQSLOD=4.0815;set=filterInVQSR-2of5;sumGLbyD=5.37 +20 8012465 rs10595338 TATGA T 2104.41 PASS AF=0.03339;BaseQRankSum=10.662;DB;DP=11772;DS;Dels=0.01;FR;FS=7.678;HP=1;HPLen=1;HR=1;HRun=0;HU=A;InbreedingCoeff=0.0266;IndelType=DEL.NumRepetitions_1.EventLength_4.;MQ0Fraction=0.0731;MQRankSum=0.603;NF;NR;PP;ReadPosRankSum=1.276;SC=TGTATGTATGTATGATGTATG;TC;TR=19;TU=ATGT;VQSLOD=4.1376;set=filterInVQSR-2of5;sumGLbyD=6.53 +20 8573999 . CGTGT C,CGT,CGTGTGT,TGTGT 45865.96 PASS AC=458,0,731;AF=0.37727,0.00000,0.60214;AN=1214;BVAR;BaseQRankSum=-6.703;DEL;DP=37714;Dels=0.03;FR;FS=11.079;HP=2;HPLen=1;HR=1;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.7632;IndelType=MIXED;LEN=2;MQ0Fraction=0.0026;MQRankSum=-1.394;NF;NR;PP;RUN=1;ReadPosRankSum=-2.102;SC=TGTGTGTGCGCGTGTGTGTGT;TC;TR=18;TU=GT;VQSLOD=6.1435;set=Intersection;sumGLbyD=3.53 +20 8610455 rs10571111 TTTTC T 11763.51 PASS AC=190;AF=0.17056;AN=1114;BaseQRankSum=-14.397;DB;DP=2323;FS=2.321;HRun=0;HaplotypeScore=39.8020;InbreedingCoeff=0.2502;IndelType=DEL.NumRepetitions_2.EventLength_4.;MQ=53.39;MQ0=104;MQ0Fraction=0.0448;MQRankSum=3.519;QD=19.07;ReadPosRankSum=4.150;SB=-4067.02;VQSLOD=5.0554;set=VQSR +20 9139079 . ATT A,AT,ATTT,ATTTT,ATTTTT 8777.90 PASS AC=23,140,114,69,113;AF=0.01993,0.12132,0.09879,0.05979,0.09792;AN=1154;BVAR;BaseQRankSum=-0.022;DEL;DP=25109;DP4=502,657,278,313;FR;FS=11.929;HP=16;HR=16;HU=T;HaplotypeScore=20.2361;INDEL;INS;InbreedingCoeff=0.5704;IndelType=MULTIALLELIC_INDEL;MQ0=16;MQ0Fraction=0.0067;MQRankSum=2.624;NF;NR;PP;PV4=0.14,1,1,1;QD=1.48;RUN=1;ReadPosRankSum=-0.480;SB=-2354.28;SC=CACCTGGCTAATTTTTTTTTT;TC;TR=16;TU=T;VQSLOD=6.9180;set=Intersection +20 9862448 . CT C 49312 PASS AA=60;AB=0.96003;ABA=53;ABP=2440.4;ABR=1273;AC=18;AF=0.01461;AN=1232;BL=3516;BR=140;BVAR;BaseQRankSum=-2.056;DEL;DP=11893;Dels=0.01;EL=35;EPP=6.6294;ER=25;FS=1.787;HETAR=396;HOMA=344;HOMR=334;HRun=1;InbreedingCoeff=0.0379;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.92341;LRBP=6772.5;MQ0Fraction=0.0006;MQM=54.267;MQRankSum=-0.907;NS=1074;RA=2990;RL=60;RPP=133.3;RR=0;RUN=1;ReadPosRankSum=-10.579;SAB=0.58333;SAF=35;SAP=6.6294;SAR=25;SRB=0.47826;SRF=1430;SRP=15.284;SRR=1560;VQSLOD=3.0237;set=filterInVQSR-2of5;sumGLbyD=2.84 +20 9863736 rs73618103 G GT 50570.21 PASS AA=2247;AB=0.48878;ABA=1412;ABP=6.0324;ABR=1350;AC=546;AF=0.44463;AN=1228;BL=86886;BR=95862;BVAR;BaseQRankSum=-23.978;DB;DP=32517;DP4=1125,1133,1017,1048;Dels=0.00;EL=1089;EPP=7.6113;ER=1158;FQ=999;FR;FS=2.529;HETAR=445;HOMA=201;HOMR=393;HP=4;HPLen=4;HR=4;HRun=4;HU=T;INDEL;INS;InbreedingCoeff=0.1393;IndelType=INS.NumRepetitions_4.EventLength_1.RepeatExpansion_T.;KGPilot123;LEN=1;LRB=0.049117;LRBP=960.35;MQ=68.10;MQ0=2;MQ0Fraction=0.0006;MQM=50.931;MQRankSum=-1.580;NF;NR;NS=1039;PP;PV4=0.71,1,0.11,1;RA=3139;RL=1089;RPP=7.6113;RR=1158;RUN=1;ReadPosRankSum=0.846;SAB=0.54161;SAF=1217;SAP=36.804;SAR=1030;SC=TGATTGTATGGTTTTGTCCTT;SRB=0.53425;SRF=1677;SRP=34.987;SRR=1462;TC;TR=4;TU=T;VLD;VQSLOD=10.1800;dbSNP=131;set=Intersection;sumGLbyD=18.20 +20 10926959 . AG A 12239 PASS AA=65;AB=0.92801;ABA=64;ABP=1417.6;ABR=825;AC=24;AF=0.0264;AN=908;BL=616;BR=3782;BVAR;BaseQRankSum=9.990;DEL;DP=10708;Dels=0.01;EL=37;EPP=5.7163;ER=28;FS=1.652;HETAR=275;HOMA=70;HOMR=724;HRun=1;InbreedingCoeff=0.0102;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.71987;LRBP=4952;MQ0=1;MQ0Fraction=0.0004;MQM=118.82;MQRankSum=1.018;NS=1069;RA=4746;RL=5;RPP=104.07;RR=60;RUN=1;ReadPosRankSum=-12.039;SAB=0.41538;SAF=27;SAP=7.0526;SAR=38;SRB=0.4764;SRF=2261;SRP=25.968;SRR=2485;VQSLOD=2.9713;set=filterInVQSR-2of5;sumGLbyD=4.10 +20 11299648 . TG T 49315 PASS AA=62;AB=0.95292;ABA=54;ABP=2046.7;ABR=1093;AC=28;AF=0.0373;AN=750;BL=3126;BR=528;BVAR;BaseQRankSum=-4.929;DEL;DP=10764;Dels=0.01;EL=26;EPP=6.5127;ER=36;FS=3.851;HETAR=366;HOMA=383;HOMR=304;HRun=1;InbreedingCoeff=0.0267;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.711;LRBP=4014.1;MQ0=1;MQ0Fraction=0.0005;MQM=76.468;MQRankSum=1.327;NS=1070;RA=2588;RL=54;RPP=77.121;RR=8;RUN=1;ReadPosRankSum=-12.507;SAB=0.48387;SAF=30;SAP=3.1504;SAR=32;SRB=0.47643;SRF=1233;SRP=15.499;SRR=1355;VQSLOD=3.8673;set=filterInVQSR-2of5;sumGLbyD=3.00 +20 11561096 . CTA C 999 PASS AC=2;AF=0.0029;AF1=0.005602;BaseQRankSum=3.190;CI95=0.004425,0.01106;DP=7521;DP4=1998,1794,2,4;Dels=0.00;FQ=999;FR;FS=5.422;HP=3;HPLen=2;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0056;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_TA.;MQ=113.88;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.297;NF;NR;PP;PV4=0.43,0.024,1,1;ReadPosRankSum=1.406;SC=CAATAGTATTCTATGTCAGTC;TC;TR=1;TU=T;VQSLOD=8.6243;set=Intersection;sumGLbyD=21.89 +20 11723671 . C CA 1096.60 PASS AA=35;AB=0.69565;ABA=35;ABP=41.247;ABR=80;AC=10;AF=0.0141;AN=710;BL=2005;BR=1702;BVAR;BaseQRankSum=-3.427;DP=9819;Dels=0.00;EL=20;EPP=4.5614;ER=15;FR;FS=3.814;HETAR=20;HOMA=0;HOMR=1034;HP=8;HPLen=7;HR=7;HRun=7;HU=A;INS;InbreedingCoeff=0.0323;IndelType=INS.NumRepetitions_7.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.081737;LRBP=56.79;MQ0=0;MQ0Fraction=0.0000;MQM=81.057;MQRankSum=0.050;NF;NR;NS=1054;PP;RA=5562;RL=22;RPP=8.0357;RR=13;RUN=1;ReadPosRankSum=-2.012;SAB=0.71429;SAF=25;SAP=16.97;SAR=10;SC=ATATTGAAGACAAAAAAACAG;SRB=0.49371;SRF=2746;SRP=4.9233;SRR=2816;TC;TR=7;TU=A;VQSLOD=7.4342;set=Intersection;sumGLbyD=8.30 +20 12238835 rs113904674 CTCTTCATGGTCT C 1813.44 PASS AA=7;AB=0.73077;ABA=7;ABP=15.037;ABR=19;AC=4;AF=0.0056;AN=712;BL=360;BR=368;BVAR;BaseQRankSum=3.891;DB;DEL;DP=10309;Dels=0.00;EL=4;EPP=3.3205;ER=3;FR;FS=0.000;HETAR=3;HOMA=0;HOMR=1076;HP=1;HPLen=2;HR=2;HRun=0;HU=C;InbreedingCoeff=-0.0381;IndelType=DEL.NumRepetitions_1.EventLength_10orMore.;LEN=12;LRB=0.010989;LRBP=3.2012;MQ0=0;MQ0Fraction=0.0000;MQM=37;MQRankSum=-3.793;NF;NR;NS=1079;PP;RA=6085;RL=4;RPP=3.3205;RR=3;RUN=1;ReadPosRankSum=1.319;SAB=0.42857;SAF=3;SAP=3.3205;SAR=4;SC=CTTAATGCTCCTCTTCATGGT;SRB=0.51257;SRF=3119;SRP=11.364;SRR=2966;TC;TR=6;TU=CCT;VQSLOD=5.7551;set=Intersection;sumGLbyD=69.48 +20 12602812 . AT A 12344 PASS AA=47;AB=0.94372;ABA=43;ABP=1309.5;ABR=721;AC=14;AF=0.0196;AN=716;BL=2714;BR=217;BVAR;BaseQRankSum=1.424;DEL;DP=10743;Dels=0.00;EL=24;EPP=3.0565;ER=23;FS=0.629;HETAR=228;HOMA=65;HOMR=769;HRun=1;InbreedingCoeff=0.0233;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.85193;LRBP=4622.3;MQ0Fraction=0.0000;MQM=99.574;MQRankSum=1.901;NS=1080;RA=4839;RL=46;RPP=96.568;RR=1;RUN=1;ReadPosRankSum=-9.906;SAB=0.53191;SAF=25;SAP=3.4261;SAR=22;SRB=0.51106;SRF=2473;SRP=8.148;SRR=2366;VQSLOD=2.8161;set=filterInVQSR-2of5;sumGLbyD=3.67 +20 13600884 . CTG C,CTGTG 1278.10 PASS AA=85;AB=0.77994;ABA=79;ABP=247.38;ABR=280;AC=71,22;AF=0.05907,0.01830;AN=1202;BL=3279;BR=3205;BVAR;BaseQRankSum=8.852;DEL;DP=24185;DP4=1317,931,52,49;Dels=0.03;EL=45;EPP=3.649;ER=40;FQ=999;FR;FS=31.826;HETAR=75;HOMA=4;HOMR=926;HP=2;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1566;IndelType=MULTIALLELIC_INDEL;LEN=2;LRB=0.011413;LRBP=4.8442;MQ=65.06;MQ0Fraction=0.0012;MQM=48.671;MQRankSum=-0.511;NF;NR;NS=1005;PP;PV4=0.18,1,0.39,0.27;RA=3342;RL=35;RPP=8.7583;RR=50;RUN=1;ReadPosRankSum=-2.329;SAB=0.43529;SAF=37;SAP=6.1015;SAR=48;SC=TCCCTTTACTCTGTGTGTGTG;SRB=0.59066;SRF=1974;SRP=241.62;SRR=1368;TC;TR=15;TU=GT;VQSLOD=3.8635;set=filterInVQSR-2of5;sumGLbyD=4.23 +20 13666265 . T TATAG 556.88 PASS AC=21;AF=0.01959;AN=1072;BaseQRankSum=24.958;DP=2706;FS=2.581;HRun=0;HaplotypeScore=25.9952;InbreedingCoeff=0.1419;IndelType=INS.NOVEL_4.;MQ=72.43;MQ0=0;MQ0Fraction=0.0000;MQRankSum=2.888;QD=4.38;ReadPosRankSum=2.552;SB=-417.04;VQSLOD=7.3380;set=VQSR +20 13861245 rs72422273 C CTCA 2685.46 PASS AC=140;AF=0.11589;AN=1208;BaseQRankSum=24.355;DB;DP=2910;FS=6.808;HRun=0;HaplotypeScore=19.3095;InbreedingCoeff=-0.0991;IndelType=INS.NumRepetitions_1.EventLength_3.;MQ=78.25;MQ0=22;MQ0Fraction=0.0076;MQRankSum=3.225;QD=3.64;ReadPosRankSum=2.607;SB=-1861.38;VQSLOD=4.1974;set=VQSR +20 13865746 . T TA,TAA 1416.23 PASS AA=63;AB=0.80417;ABA=47;ABP=195.87;ABR=193;AC=122,21;AF=0.10133,0.01744;AN=1204;BL=3673;BR=1145;BVAR;BaseQRankSum=-3.336;DP=10513;Dels=0.00;EL=62;EPP=131.27;ER=1;FR;FS=716.583;HETAR=45;HOMA=1;HOMR=998;HP=2;HR=1;HRun=1;HU=A;INS;InbreedingCoeff=0.0814;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.5247;LRBP=2883.3;MQ0=0;MQ0Fraction=0.0000;MQM=56.143;MQRankSum=-1.197;NF;NR;NS=1044;PP;RA=4529;RL=62;RPP=131.27;RR=1;RUN=1;ReadPosRankSum=-12.295;SAB=1;SAF=63;SAP=139.81;SAR=0;SC=GGAACATGGATACCCCCCTGC;SRB=0.52462;SRF=2376;SRP=26.853;SRR=2153;TC;TR=1;TU=A;VQSLOD=-4.2308;set=filterInVQSR-2of5;sumGLbyD=4.77 +20 13881703 . CTT C 152.85 PASS AC=8;AF=0.0093;AN=862;BaseQRankSum=3.941;DP=2063;FS=0.962;HRun=5;HaplotypeScore=24.0313;InbreedingCoeff=0.0790;IndelType=DEL.NumRepetitions_5.EventLength_1.RepeatExpansion_T.;MQ=55.05;MQ0=49;MQ0Fraction=0.0238;MQRankSum=-1.418;QD=3.47;ReadPosRankSum=-0.605;SB=-93.04;VQSLOD=5.3874;set=VQSR +20 14260090 rs73619828 A AT 27935 PASS AA=596;AB=0.59484;ABA=487;ABP=96.922;ABR=715;AC=204;AF=0.17000;AN=1200;BL=21718;BR=28458;BVAR;BaseQRankSum=0.756;DB;DP=23629;DP4=1385,1492,287,328;Dels=0.00;EL=299;EPP=3.0249;ER=297;FQ=999;FR;FS=6.187;HETAR=218;HOMA=38;HOMR=788;HP=9;HPLen=9;HR=9;HRun=9;HU=T;INDEL;INS;InbreedingCoeff=0.0797;IndelType=INS.NumRepetitions_9.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.13433;LRBP=1969;MQ=100.81;MQ0=0;MQ0Fraction=0.0000;MQM=57.084;MQRankSum=2.224;NF;NR;NS=1044;PP;PV4=0.53,1,1.2e-11,1;RA=4143;RL=238;RPP=55.475;RR=358;RUN=1;ReadPosRankSum=0.198;SAB=0.46812;SAF=279;SAP=8.2714;SAR=317;SC=CCTTAAGTTGATTTTTTTTTC;SRB=0.50374;SRF=2087;SRP=3.514;SRR=2056;TC;TR=9;TU=T;VQSLOD=9.0018;set=Intersection;sumGLbyD=10.82 +20 14260558 . AC A 238 PASS AC=1;AF=0.0014;AF1=0.003368;BaseQRankSum=2.868;CI95=0.003106,0.006211;DP=9724;DP4=2075,2329,1,7;Dels=0.00;FQ=106;FR;FS=10.678;HP=1;HPLen=2;HR=2;HRun=1;HU=A;INDEL;InbreedingCoeff=-0.0406;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=114.37;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.862;NF;NR;PP;PV4=0.074,0.0096,0.017,1;ReadPosRankSum=-0.042;SC=ATCAGGAATAACTGTGTGACC;TC;TR=2;TU=A;VQSLOD=8.1618;set=Intersection;sumGLbyD=18.65 +20 14425481 . GTA G,GTATA 148.85 PASS AC=43,23;AF=0.03473,0.01858;AN=1238;BaseQRankSum=6.289;DP=25167;DP4=1800,2021,38,49;FR;FS=9.416;HP=2;HPLen=1;HR=1;HU=T;HaplotypeScore=17.7453;INDEL;InbreedingCoeff=0.0995;IndelType=MULTIALLELIC_INDEL;MQ0=21;MQ0Fraction=0.0058;MQRankSum=-0.200;NF;NR;PP;PV4=0.59,1,0.04,0.023;QD=0.35;ReadPosRankSum=-1.689;SB=-367.50;SC=CTGTGTGTGTGTATATATATA;TC;TR=13;TU=AT;VQSLOD=3.5796;set=filterInVQSR-2of5 +20 14943522 rs11478299 GA AA,G 1761.24 PASS AA=117;AB=0.68142;ABA=108;ABP=99.919;ABR=231;AC=0;AF=0.0000;AF1=0.04204;AN=712;BL=4931;BR=5802;BVAR;BaseQRankSum=9.118;CI95=0.02876,0.05752;DB;DEL;DP=13717;DP4=1908,1684,59,58;Dels=0.05;EL=60;EPP=3.1773;ER=57;FQ=81.9;FR;HETAR=56;HOMA=1;HOMR=1011;HP=8;HPLen=8;HR=8;HU=A;INDEL;InbreedingCoeff=0.1264;IndelType=MIXED;LEN=1;LRB=0.081152;LRBP=156.5;MQ=106.93;MQ0=0;MQ0Fraction=0.0000;MQM=96.855;MQRankSum=1.619;NF;NR;NS=1068;PP;PV4=0.57,1,0.0003,1;QD=7.40;RA=5080;RL=56;RPP=3.4743;RR=61;RUN=1;ReadPosRankSum=0.814;SAB=0.52137;SAF=61;SAP=3.4743;SAR=56;SB=-1122.51;SC=GTTGTTTGGGGAAAAAAAACT;SRB=0.51083;SRF=2595;SRP=8.1825;SRR=2485;TC;TR=8;TU=A;set=filterInVQSR-2of5;sumGLbyD=9.81 +20 14974486 . A AG 4101.40 PASS AA=57;AB=0.57143;ABA=51;ABP=8.2839;ABR=68;AC=22;AF=0.01846;AN=1192;BL=2286;BR=2834;BVAR;BaseQRankSum=8.711;DP=20538;DP4=2172,2100,19,13;Dels=0.00;EL=32;EPP=4.877;ER=25;FS=0.517;HETAR=20;HOMA=4;HOMR=1027;HRun=1;INDEL;INS;InbreedingCoeff=0.0677;IndelType=INS.NOVEL_1.Novel_G.;LEN=1;LRB=0.10703;LRBP=130.37;MQ=126.07;MQ0=0;MQ0Fraction=0.0000;MQM=56.088;MQRankSum=-10.756;NS=1051;PV4=0.38,3.5e-51,7.9e-34,1;RA=5203;RL=26;RPP=3.9627;RR=31;RUN=1;ReadPosRankSum=1.283;SAB=0.54386;SAF=31;SAP=3.9627;SAR=26;SRB=0.51816;SRF=2696;SRP=17.918;SRR=2507;VQSLOD=8.0072;set=Intersection;sumGLbyD=25.60 +20 15111137 . GA G 13533 PASS AA=98;AB=0.84864;ABA=89;ABP=623.8;ABR=499;AC=47;AF=0.03796;AN=1238;BL=5324;BR=856;BVAR;BaseQRankSum=-11.577;DEL;DP=13384;Dels=0.01;EL=53;EPP=4.4284;ER=45;FS=6.099;HETAR=219;HOMA=845;HOMR=18;HRun=1;InbreedingCoeff=-0.0056;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.72298;LRBP=7017.4;MQ0Fraction=0.0003;MQM=90.449;MQRankSum=1.408;NS=1083;RA=590;RL=87;RPP=130.99;RR=11;RUN=1;ReadPosRankSum=-18.074;SAB=0.55102;SAF=54;SAP=5.2261;SAR=44;SRB=0.52373;SRF=309;SRP=5.8958;SRR=281;VQSLOD=4.1054;set=filterInVQSR-2of5;sumGLbyD=3.06 +20 15283028 . A AC,ACACACACACACAC 140844.83 PASS AA=180;AB=0.61442;ABA=123;ABP=39.285;ABR=196;AC=13,817;AF=0.01111,0.69829;AN=1170;BL=4453;BR=11407;BVAR;BaseQRankSum=24.686;DP=6365;Dels=0.00;EL=124;EPP=58.793;ER=56;FR;FS=10.912;HETAR=87;HOMA=48;HOMR=683;HP=1;HR=1;HRun=1;HU=T;INS;InbreedingCoeff=0.2074;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.43846;LRBP=6624;MQ0Fraction=0.0558;MQM=38.211;MQRankSum=-21.111;NF;NR;NS=818;PP;RA=1732;RL=0;RPP=393.88;RR=180;RUN=1;ReadPosRankSum=-7.620;SAB=0.31111;SAF=56;SAP=58.793;SAR=124;SC=ACACACACACATACACACATA;SRB=0.54042;SRF=936;SRP=27.584;SRR=796;TC;TR=21;TU=AC;VQSLOD=4.7569;set=Intersection;sumGLbyD=18.36 +20 15361056 . ATAACT A 4892.81 PASS AA=59;AB=0.63576;ABA=55;ABP=27.184;ABR=96;AC=34;AF=0.0487;AN=698;BL=3164;BR=1999;BVAR;BaseQRankSum=3.391;DEL;DP=7080;Dels=0.03;EL=27;EPP=3.9304;ER=32;FR;FS=4.816;HETAR=35;HOMA=6;HOMR=966;HP=2;HPLen=3;HR=3;HRun=0;HU=A;InbreedingCoeff=0.0785;IndelType=DEL.NumRepetitions_1.EventLength_5.;LEN=5;LRB=0.22564;LRBP=573.84;MQ0=0;MQ0Fraction=0.0000;MQM=70.034;MQRankSum=-8.732;NF;NR;NS=1008;PP;RA=3915;RL=42;RPP=26.013;RR=17;RUN=1;ReadPosRankSum=-0.735;SAB=0.44068;SAF=26;SAP=4.8137;SAR=33;SC=AGATTAGGAAATAACTTAGGG;SRB=0.42682;SRF=1671;SRP=185.12;SRR=2244;TC;TR=3;TU=A;VQSLOD=7.0900;set=Intersection;sumGLbyD=43.38 +20 15579507 . AATTAGTC A,TATTAGTC 1936.38 PASS AA=16;AB=0.58974;ABA=16;ABP=5.7386;ABR=23;AC=64;AF=0.05229;AN=1224;BL=699;BR=775;BVAR;BaseQRankSum=-21.390;DEL;DP=21920;DP4=2099,2403,6,6;Dels=0.00;EL=8;EPP=3.0103;ER=8;FR;FS=2.920;HETAR=5;HOMA=0;HOMR=1063;HP=3;HPLen=4;HR=4;HU=A;INDEL;InbreedingCoeff=-0.0143;IndelType=MIXED;LEN=7;LRB=0.05156;LRBP=11.519;MQ=129.49;MQ0=0;MQ0Fraction=0.0000;MQM=51.938;MQRankSum=3.331;NF;NR;NS=1068;PP;PV4=1,0.019,1.3e-07,1;RA=5334;RL=5;RPP=7.8961;RR=11;RUN=1;ReadPosRankSum=-16.901;SAB=0.4375;SAF=7;SAP=3.5532;SAR=9;SC=CATACTACAAAATTAGTCATT;SRB=0.41695;SRF=2224;SRP=322.58;SRR=3110;TC;TR=4;TU=A;VQSLOD=3.2237;set=filterInVQSR-2of5;sumGLbyD=43.57 +20 15752535 . CT C,GT 3775.20 PASS AA=92;AB=0.78636;ABA=47;ABP=159.71;ABR=173;AC=0;AF=0.0000;AN=608;BL=4955;BR=2380;BVAR;BaseQRankSum=2.910;DEL;DP=3429;Dels=0.04;EL=13;EPP=105.82;ER=79;FR;HETAR=92;HOMA=95;HOMR=544;HP=2;HPLen=2;HR=2;HU=T;InbreedingCoeff=0.0483;IndelType=MIXED;LEN=1;LRB=0.35106;LRBP=1966;MQ0Fraction=0.0232;MQM=35.293;MQRankSum=-2.199;NF;NR;NS=732;PP;QD=4.91;RA=1272;RL=81;RPP=118.66;RR=11;RUN=1;ReadPosRankSum=-1.077;SAB=0.021739;SAF=2;SAP=185.79;SAR=90;SB=-59.51;SC=CAAGACCATCCTTGGCTAACA;SRB=0.14623;SRF=186;SRP=1385.8;SRR=1086;TC;TR=2;TU=T;set=filterInVQSR-2of5;sumGLbyD=9.70 +20 15883060 rs73619850 A AT 1325.60 PASS AA=38;AB=0.59302;ABA=35;ABP=9.4742;ABR=51;AC=14;AF=0.0156;AN=896;BL=1078;BR=1638;BVAR;BaseQRankSum=-4.526;DB;DP=19854;DP4=1632,1800,15,20;Dels=0.00;EL=18;EPP=3.2389;ER=20;FR;FS=0.000;HETAR=14;HOMA=1;HOMR=1014;HP=1;HPLen=1;HR=1;HRun=1;HU=T;INDEL;INS;InbreedingCoeff=-0.0131;IndelType=INS.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.20619;LRBP=253.74;MQ=118.40;MQ0=0;MQ0Fraction=0.0000;MQM=56.526;MQRankSum=0.892;NF;NR;NS=1029;PP;PV4=0.61,1,0.25,0.14;RA=4439;RL=14;RPP=8.7247;RR=24;RUN=1;ReadPosRankSum=-2.061;SAB=0.42105;SAF=16;SAP=5.0675;SAR=22;SC=GGATTGGCAGATAAAAAATGG;SRB=0.46429;SRF=2061;SRP=52.168;SRR=2378;TC;TR=1;TU=T;VQSLOD=9.7576;set=Intersection;sumGLbyD=15.69 +20 16122099 . GA G 12914 PASS AA=85;AB=0.85915;ABA=80;ABP=639.4;ABR=488;AC=19;AF=0.01542;AN=1232;BL=805;BR=5457;BVAR;BaseQRankSum=-6.084;DEL;DP=13592;Dels=0.00;EL=45;EPP=3.649;ER=40;FS=0.935;HETAR=218;HOMA=841;HOMR=14;HRun=2;InbreedingCoeff=0.0250;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.74289;LRBP=7507.5;MQ0=0;MQ0Fraction=0.0000;MQM=103.01;MQRankSum=2.843;NS=1075;RA=541;RL=2;RPP=170.62;RR=83;RUN=1;ReadPosRankSum=-16.222;SAB=0.49412;SAF=42;SAP=3.0358;SAR=43;SRB=0.44917;SRF=243;SRP=15.152;SRR=298;VQSLOD=3.9745;set=filterInVQSR-2of5;sumGLbyD=2.97 +20 16828509 . G GT 843.62 PASS AA=30;AB=0.70103;ABA=29;ABP=37.06;ABR=68;AC=10;AF=0.0140;AN=714;BL=1368;BR=1786;BVAR;BaseQRankSum=-4.061;DP=8682;Dels=0.01;EL=14;EPP=3.2998;ER=16;FR;FS=2.681;HETAR=22;HOMA=1;HOMR=1020;HP=8;HPLen=8;HR=8;HRun=8;HU=T;INS;InbreedingCoeff=0.1389;IndelType=INS.NumRepetitions_8.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.13253;LRBP=123.3;MQ0=0;MQ0Fraction=0.0000;MQM=62.8;MQRankSum=-1.491;NF;NR;NS=1043;PP;RA=4416;RL=11;RPP=7.6428;RR=19;RUN=1;ReadPosRankSum=-1.718;SAB=0.76667;SAF=23;SAP=21.54;SAR=7;SC=CCTTCAAAAGGTTTTTTTTGG;SRB=0.5745;SRF=2537;SRP=215.91;SRR=1879;TC;TR=8;TU=T;VQSLOD=7.6258;set=Intersection;sumGLbyD=10.77 +20 17470034 . GC G 46975 PASS AA=57;AB=0.96043;ABA=52;ABP=2422.5;ABR=1262;AC=34;AF=0.02773;AN=1226;BL=418;BR=3446;BVAR;BaseQRankSum=-6.250;DEL;DP=12035;Dels=0.00;EL=22;EPP=9.4485;ER=35;FS=1.350;HETAR=416;HOMA=409;HOMR=244;HRun=1;InbreedingCoeff=0.0083;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.78364;LRBP=5155.6;MQ0=0;MQ0Fraction=0.0000;MQM=99.509;MQRankSum=2.192;NS=1076;RA=2396;RL=5;RPP=87.164;RR=52;RUN=1;ReadPosRankSum=-15.199;SAB=0.5614;SAF=32;SAP=4.877;SAR=25;SRB=0.52963;SRF=1269;SRP=21.285;SRR=1127;VQSLOD=3.8440;set=filterInVQSR-2of5;sumGLbyD=3.06 +20 17471374 . AGCGGC A 850.03 PASS AC=6;AF=0.0085;AF1=0.01301;AN=704;BaseQRankSum=6.259;CI95=0.00885,0.01991;DP=8180;DP4=2215,1878,4,5;Dels=0.01;FQ=131;FS=0.000;HRun=0;INDEL;InbreedingCoeff=0.0009;IndelType=DEL.NumRepetitions_1.EventLength_5.;MQ=104.41;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-5.521;PV4=0.74,0.37,0.0005,1;ReadPosRankSum=2.468;VQSLOD=6.8773;set=Intersection;sumGLbyD=30.85 +20 18433202 rs35582929 G GA 2506.90 PASS AA=55;AB=0.5812;ABA=49;ABP=9.7103;ABR=68;AC=20;AF=0.0218;AN=918;BL=2263;BR=2175;BVAR;BaseQRankSum=-6.639;DB;DP=19467;DP4=1845,2365,27,26;Dels=0.00;EL=21;EPP=9.6826;ER=34;FQ=999;FR;FS=5.633;HETAR=16;HOMA=3;HOMR=1045;HP=2;HPLen=3;HR=3;HRun=1;HU=G;INDEL;INS;InbreedingCoeff=0.0700;IndelType=INS.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.019829;LRBP=6.7994;MQ=114.03;MQ0=0;MQ0Fraction=0.0000;MQM=83.345;MQRankSum=1.610;NF;NR;NS=1064;PP;PV4=0.33,1,1,1;RA=5380;RL=28;RPP=3.0498;RR=27;RUN=1;ReadPosRankSum=0.873;SAB=0.47273;SAF=26;SAP=3.3656;SAR=29;SC=TATTTCATGGGAGCATTAAAA;SRB=0.42862;SRF=2306;SRP=241.07;SRR=3074;TC;TR=3;TU=G;VQSLOD=10.0372;dbSNP=126;set=Intersection;sumGLbyD=13.10 +20 18551314 rs10659122 CA C,CAA,CAAA,CAAAA,CAAAAA 18810.74 PASS ABR=243;AC=19,169,216,164,188;AF=0.01816,0.16157,0.20650,0.15679,0.17973;BVAR;BaseQRankSum=-5.742;DB;DP=17637;DP4=136,77,560,237;FR;FS=2.693;HOMA=177;HOMR=299;HP=17;HR=17;HU=A;HaplotypeScore=15.5048;INDEL;INS;InbreedingCoeff=0.8901;IndelType=MULTIALLELIC_INDEL;MQ0=11;MQ0Fraction=0.0069;MQRankSum=1.845;NF;NR;NS=658;PP;PV4=0.08,1,1,1;QD=12.66;RA=673;RUN=1;ReadPosRankSum=0.283;SB=-3514.45;SC=GATTCCATCTCAAAAAAAAAA;SRB=0.63596;SRF=428;SRP=111.06;SRR=245;TC;TR=17;TU=A;VQSLOD=10.6964;dbSNP=130;set=Intersection +20 18785519 . G GTC 415.55 PASS AC=28;AF=0.0400;AN=700;BaseQRankSum=10.889;DP=1929;FS=8.778;HRun=0;HaplotypeScore=27.6448;InbreedingCoeff=0.0510;IndelType=INS.NOVEL_2.;MQ=61.99;MQ0=36;MQ0Fraction=0.0187;MQRankSum=4.508;QD=3.08;ReadPosRankSum=8.080;SB=-437.03;VQSLOD=4.9313;set=VQSR +20 20301041 rs35451634 ATATG A 200.42 PASS AC=21;AF=0.0449;AN=468;BaseQRankSum=5.251;DB;DP=579;FS=24.013;HRun=0;HaplotypeScore=27.8977;InbreedingCoeff=0.0113;IndelType=DEL.NumRepetitions_1.EventLength_4.;MQ=78.47;MQ0=26;MQ0Fraction=0.0449;MQRankSum=-5.284;QD=3.06;ReadPosRankSum=1.793;SB=-55.76;VQSLOD=5.0981;set=VQSR +20 20378174 . TC T 245.55 PASS AC=23;AF=0.01879;AN=1224;BaseQRankSum=0.990;DP=3225;FS=10.413;HRun=1;HaplotypeScore=22.6109;InbreedingCoeff=0.0244;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=93.70;MQ0=3;MQ0Fraction=0.0009;MQRankSum=-3.349;QD=1.86;ReadPosRankSum=-7.227;SB=-188.62;VQSLOD=4.2553;set=VQSR +20 20809160 rs10571503 TAA AAA,T 3496 PASS AC=0;AF=0.0000;AN=612;BaseQRankSum=1.968;DB;DP=1092;FR;HP=4;HPLen=3;HR=3;HRun=0;HU=A;HaplotypeScore=26.1253;InbreedingCoeff=0.0603;IndelType=MIXED;MQ=68.98;MQ0=1;MQ0Fraction=0.0009;MQRankSum=1.520;NF;NR;PP;ReadPosRankSum=-4.042;SC=TATATATATATAAATTTAAAT;TC;TR=13;TU=AT;set=filterInVQSR-2of5 +20 22508765 . CT C 53877.84 PASS AA=187;AB=0.78077;ABA=171;ABP=537.09;ABR=609;AC=1017;AF=0.91787;AN=1108;BL=12690;BR=1718;BVAR;BaseQRankSum=13.773;DEL;DP=7430;Dels=0.02;EL=73;EPP=22.53;ER=114;FR;FS=16.352;HETAR=152;HOMA=9;HOMR=786;HP=8;HR=4;HRun=4;HU=T;InbreedingCoeff=0.3885;IndelType=DEL.NumRepetitions_4.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.76152;LRBP=18147;MQ0=0;MQ0Fraction=0.0000;MQM=46.086;MQRankSum=0.971;NF;NR;NS=947;PP;RA=2868;RL=177;RPP=326.86;RR=10;RUN=1;ReadPosRankSum=9.951;SAB=0.34759;SAF=65;SAP=40.738;SAR=122;SC=AAAAAATTTTCTTTTGAACTG;SRB=0.46269;SRF=1327;SRP=37.684;SRR=1541;TC;TR=4;TU=T;VQSLOD=5.1182;set=Intersection;sumGLbyD=25.15 +20 22555082 rs11477526 AT A 11503 PASS AA=530;AB=0.50816;ABA=422;ABP=3.5063;ABR=436;AF=0.1614;AN=700;BL=21453;BR=23313;BVAR;BaseQRankSum=17.562;DB;DEL;DP=25587;DP4=1869,1600,283,201;Dels=0.14;EL=259;EPP=3.6003;ER=271;FQ=999;FR;FS=14.595;HETAR=159;HOMA=41;HOMR=846;HP=3;HPLen=3;HR=3;HRun=3;HU=T;INDEL;InbreedingCoeff=0.0995;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.041549;LRBP=170.83;MQ=95.89;MQ0=0;MQ0Fraction=0.0000;MQM=72.162;MQRankSum=2.564;NF;NR;NS=1046;PP;PV4=0.058,6.6e-129,0.04,1;RA=4303;RL=264;RPP=3.0267;RR=266;RUN=1;ReadPosRankSum=0.176;SAB=0.58679;SAF=311;SAP=37.688;SAR=219;SC=GGGAAAGCTGATTTACTGATT;SRB=0.54892;SRF=2362;SRP=92.453;SRR=1941;TC;TR=3;TU=T;VQSLOD=8.7746;dbSNP=120;set=Intersection;sumGLbyD=15.27 +20 22590907 . A AC 4204.88 PASS AA=67;AB=0.592;ABA=51;ABP=12.2;ABR=74;AF=0.0554;AF1=0.0468;AN=560;BL=2277;BR=2389;BVAR;BaseQRankSum=10.968;CI95=0.03759,0.05639;DP=14380;DP4=2514,2018,33,33;Dels=0.00;EL=22;EPP=20.155;ER=45;FQ=999;FR;FS=3.846;HETAR=25;HOMA=4;HOMR=1049;HP=4;HPLen=5;HR=5;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.0719;IndelType=INS.NOVEL_1.Novel_C.;LEN=1;LRB=0.024003;LRBP=8.8481;MQ=110.68;MQ0=0;MQ0Fraction=0.0000;MQM=96.149;MQRankSum=2.668;NF;NR;NS=1078;PP;PV4=0.39,1,0.46,0.36;RA=5468;RL=33;RPP=3.0427;RR=34;RUN=1;ReadPosRankSum=-1.097;SAB=0.50746;SAF=34;SAP=3.0427;SAR=33;SC=TCATATCAAAAACATTACGTT;SRB=0.54389;SRF=2974;SRP=94.508;SRR=2494;TC;TR=5;TU=A;VQSLOD=10.0712;set=Intersection;sumGLbyD=27.69 +20 22806326 rs11468890 ATTCCATCAC A 105320.99 PASS AC=567;AF=0.48795;AN=1162;BVAR;BaseQRankSum=32.858;DB;DEL;DP=26278;DP4=727,796,554,587;Dels=0.30;FQ=999;FR;FS=1.923;HP=3;HPLen=3;HR=2;HRun=0;HU=T;INDEL;InbreedingCoeff=0.2548;IndelType=DEL.NumRepetitions_2.EventLength_9.;LEN=9;MQ=89.42;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-23.545;NF;NR;PP;PV4=0.7,1,1.3e-167,1;RUN=1;ReadPosRankSum=4.384;SC=GGCTGCTCCCATTCCATCACT;TC;TR=2;TU=T;VQSLOD=8.2594;set=Intersection;sumGLbyD=69.81 +20 22999898 rs55966257 CAGGA C 8019.97 PASS AA=23;AB=0.57778;ABA=19;ABP=5.3748;ABR=26;AC=214;AF=0.18838;AN=1136;BL=1143;BR=1040;BVAR;BaseQRankSum=29.294;DB;DEL;DP=8216;Dels=0.02;EL=11;EPP=3.1047;ER=12;FS=14.938;HETAR=14;HOMA=2;HOMR=948;HRun=0;InbreedingCoeff=0.0797;IndelType=DEL.NumRepetitions_1.EventLength_4.;LEN=4;LRB=0.047183;LRBP=13.563;MQ0=0;MQ0Fraction=0.0000;MQM=34.783;MQRankSum=-20.301;NS=964;RA=3637;RL=13;RPP=3.86;RR=10;RUN=1;ReadPosRankSum=-24.607;SAB=0.47826;SAF=11;SAP=3.1047;SAR=12;SRB=0.49024;SRF=1783;SRP=6.02;SRR=1854;VQSLOD=7.9163;set=Intersection;sumGLbyD=9.43 +20 23385964 rs57723772 GAA G 8170.95 PASS AC=257;AF=0.20928;AN=1228;BaseQRankSum=32.220;DB;DP=3291;FS=1.688;HRun=3;HaplotypeScore=22.6739;InbreedingCoeff=0.0171;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_A.;MQ=58.44;MQ0=32;MQ0Fraction=0.0097;MQRankSum=-4.893;QD=6.55;ReadPosRankSum=-35.524;SB=-3631.67;VQSLOD=5.6549;set=VQSR +20 23534530 . TA T 3542.10 PASS AA=45;AB=0.75658;ABA=37;ABP=89.926;ABR=115;AC=35;AF=0.02991;AN=1170;BL=3090;BR=270;BVAR;BaseQRankSum=-6.892;DEL;DP=8108;Dels=0.00;EL=19;EPP=5.3748;ER=26;FS=1.026;HETAR=76;HOMA=896;HOMR=18;HRun=1;InbreedingCoeff=0.0551;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.83929;LRBP=5142.4;MQ0Fraction=0.0017;MQM=41.578;MQRankSum=0.818;NS=991;RA=203;RL=43;RPP=84.127;RR=2;RUN=1;ReadPosRankSum=-12.923;SAB=0.37778;SAF=17;SAP=8.8491;SAR=28;SRB=0.5665;SRF=115;SRP=10.808;SRR=88;VQSLOD=4.2093;set=Intersection;sumGLbyD=3.49 +20 23976810 rs5841018 A ATATTAAT 1782.38 PASS AF=0.1387;AF1=0.01507;BaseQRankSum=3.717;CI95=0.00188,0.03947;DB;DP=1712;DP4=357,376,7,2;Dels=0.00;FQ=31.1;FS=14.489;HPLen=2;HRun=0;INDEL;InbreedingCoeff=0.1123;IndelType=INS.NumRepetitions_1.EventLength_7.;MQ=49.53;MQ0=2;MQ0Fraction=0.0055;MQRankSum=-4.928;PV4=0.1,1,0.00085,0.016;ReadPosRankSum=-4.456;VQSLOD=5.3140;dbSNP=116;set=Intersection;sumGLbyD=19.98 +20 24222100 . CTTTTA C 4219.36 PASS AA=57;AB=0.59434;ABA=43;ABP=11.205;ABR=63;AF=0.01803;AF1=0.01547;AN=1220;BL=2073;BR=2345;BVAR;BaseQRankSum=7.990;CI95=0.0114,0.02137;DEL;DP=17536;DP4=2140,2346,7,12;Dels=0.01;EL=32;EPP=4.877;ER=25;FQ=104;FS=0.614;HETAR=21;HOMA=4;HOMR=1042;HRun=0;INDEL;InbreedingCoeff=0.1941;IndelType=DEL.NumRepetitions_2.EventLength_5.;LEN=5;LRB=0.061566;LRBP=39.374;MQ=73.32;MQ0Fraction=0.0021;MQM=39.614;MQRankSum=-5.728;NS=1067;PV4=0.37,1.1e-39,3.5e-09,1;RA=5527;RL=28;RPP=3.0484;RR=29;RUN=1;ReadPosRankSum=0.214;SAB=0.54386;SAF=31;SAP=3.9627;SAR=26;SRB=0.49267;SRF=2723;SRP=5.588;SRR=2804;VQSLOD=7.5428;set=Intersection;sumGLbyD=38.08 +20 24395018 . AT A 49310 PASS AA=146;AB=0.91198;ABA=130;ABP=2180.5;ABR=1347;AC=50;AF=0.04045;AN=1236;BL=587;BR=9625;BVAR;BaseQRankSum=-4.610;DEL;DP=12793;Dels=0.01;EL=54;EPP=24.487;ER=92;FS=22.108;HETAR=485;HOMA=384;HOMR=210;HRun=2;InbreedingCoeff=0.0374;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.88504;LRBP=17373;MQ0=0;MQ0Fraction=0.0000;MQM=102.26;MQRankSum=2.256;NS=1080;RA=2377;RL=1;RPP=311.42;RR=145;RUN=1;ReadPosRankSum=-16.347;SAB=0.63699;SAF=93;SAP=26.807;SAR=53;SRB=0.52167;SRF=1240;SRP=12.702;SRR=1137;VQSLOD=3.2421;set=filterInVQSR-2of5;sumGLbyD=3.80 +20 24411517 . C CA 246.18 PASS AF=0.01546;AF1=0.01095;BaseQRankSum=7.832;CI95=0.005698,0.01709;DP=7981;DP4=983,2037,7,7;Dels=0.00;FQ=27.9;FS=18.815;HPLen=3;HRun=3;INDEL;InbreedingCoeff=0.0175;IndelType=INS.NumRepetitions_3.EventLength_1.RepeatExpansion_A.;MQ=60.28;MQ0Fraction=0.0137;MQRankSum=-7.243;PV4=0.25,1,2.7e-05,1;ReadPosRankSum=-0.143;VQSLOD=4.3701;set=Intersection;sumGLbyD=6.56 +20 24421169 . AG A 27480 PASS AA=182;AB=0.8303;ABA=149;ABP=835;ABR=729;AC=89;AF=0.07224;AN=1232;BL=11276;BR=2214;BVAR;BaseQRankSum=-5.447;DEL;DP=11717;Dels=0.01;EL=103;EPP=9.8827;ER=79;FR;FS=15.492;HETAR=343;HOMA=607;HOMR=114;HP=4;HR=1;HRun=1;HU=G;InbreedingCoeff=0.0353;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.67176;LRBP=13222;MQ0=0;MQ0Fraction=0.0000;MQM=88.324;MQRankSum=2.221;NF;NR;NS=1071;PP;RA=1226;RL=169;RPP=293.37;RR=13;RUN=1;ReadPosRankSum=-19.711;SAB=0.54945;SAF=100;SAP=6.876;SAR=82;SC=CCTTAGCCCCAGAAAACATCT;SRB=0.44535;SRF=546;SRP=34.814;SRR=680;TC;TR=1;TU=G;VQSLOD=4.2669;set=Intersection;sumGLbyD=3.91 +20 24765537 rs71841337 ATTT A,AT,ATT,ATTTT,ATTTTT 37852 PASS AC=13,120,527,51,92;AF=0.01102,0.10169,0.44661,0.04322,0.07797;AN=1180;BVAR;BaseQRankSum=8.172;DB;DEL;DP=39116;DP4=200,331,851,1169;FR;FS=2.394;HP=15;HR=15;HU=T;HaplotypeScore=20.8091;INDEL;INS;InbreedingCoeff=0.4815;IndelType=MULTIALLELIC_INDEL;MQ0=1;MQ0Fraction=0.0003;MQRankSum=4.344;NF;NR;PP;PV4=0.067,1,1,0.1;QD=7.90;RUN=1;ReadPosRankSum=1.798;SB=-8371.96;SC=CTCTGCAACAATTTTTTTTTT;TC;TR=15;TU=T;VQSLOD=9.9679;dbSNP=120;set=Intersection +20 25500689 . A AATTT 84980.72 PASS AC=1005;AF=0.89096;AN=1128;BaseQRankSum=17.400;DP=2324;FS=6.721;HRun=0;HaplotypeScore=25.3376;InbreedingCoeff=0.2148;IndelType=INS.NumRepetitions_1.EventLength_4.;MQ=75.19;MQ0=1;MQ0Fraction=0.0004;MQRankSum=-8.221;QD=38.28;ReadPosRankSum=4.504;SB=-34833.07;VQSLOD=4.6038;set=VQSR +20 25550373 . GA G 11251.31 PASS AA=246;AB=0.42963;ABA=154;ABP=14.624;ABR=116;AC=566;AF=0.6521;AN=868;BL=5230;BR=11845;BVAR;BaseQRankSum=7.418;DEL;DP=8885;Dels=0.02;EL=99;EPP=23.348;ER=147;FR;FS=50.357;HETAR=150;HOMA=849;HOMR=14;HP=1;HR=2;HRun=1;HU=G;InbreedingCoeff=0.1365;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.38741;LRBP=5567.9;MQ0=0;MQ0Fraction=0.0000;MQM=97.561;MQRankSum=0.050;NF;NR;NS=1013;PP;RA=269;RL=75;RPP=84.361;RR=171;RUN=1;ReadPosRankSum=-7.128;SAB=0.52846;SAF=130;SAP=4.7404;SAR=116;SC=CACGGAGGCGGAGGAAGCAGC;SRB=0.42379;SRF=114;SRP=16.58;SRR=155;TC;TR=6;TU=AGG;VQSLOD=4.0103;set=filterInVQSR-2of5;sumGLbyD=4.58 +20 25903865 . TTC T 7459.23 PASS AC=277;AF=0.23316;AN=1188;BaseQRankSum=31.479;DP=2969;FS=137.723;HRun=0;HaplotypeScore=37.3300;InbreedingCoeff=-0.1755;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_TC.;MQ=53.49;MQ0=50;MQ0Fraction=0.0168;MQRankSum=-25.506;QD=4.70;ReadPosRankSum=-5.913;SB=-1747.98;VQSLOD=5.4731;set=VQSR +20 25934237 . C CCACTT 771.36 PASS AC=37;AF=0.0426;AN=868;BaseQRankSum=16.331;DP=2253;FS=4.545;HRun=0;HaplotypeScore=29.9764;InbreedingCoeff=-0.0685;IndelType=INS.NOVEL_5.;MQ=48.12;MQ0=87;MQ0Fraction=0.0386;MQRankSum=-12.497;QD=3.37;ReadPosRankSum=-8.428;SB=-297.70;VQSLOD=4.2324;set=VQSR +20 26054751 rs112967123 TATC T 33244 PASS AA=1863;AB=0.79012;ABA=1788;ABP=6231;ABR=6731;AC=227;AF=0.18218;AN=1246;BL=74924;BR=72452;BVAR;BaseQRankSum=32.258;DB;DEL;DP=36404;DS;Dels=0.05;EL=931;EPP=3.0115;ER=932;FR;FS=265.752;HETAR=527;HOMA=2;HOMR=565;HP=1;HR=2;HRun=0;HU=T;InbreedingCoeff=-0.2137;IndelType=DEL.NumRepetitions_2.EventLength_3.;LEN=3;LRB=0.016773;LRBP=93.048;MQ0Fraction=0.0127;MQM=28.797;MQRankSum=-5.329;NF;NR;NS=1094;PP;RA=14604;RL=1014;RPP=34.743;RR=849;RUN=1;ReadPosRankSum=8.394;SAB=0.65486;SAF=1220;SAP=391.07;SAR=643;SC=TCACCATCATTATCATCATTA;SRB=0.56717;SRF=8283;SRP=575.39;SRR=6321;TC;TR=8;TU=ATC;VQSLOD=1.0486;set=filterInVQSR-2of5;sumGLbyD=6.54 +20 26120452 . CAG C 7863.19 PASS AA=163;AB=0.70489;ABA=157;ABP=196.99;ABR=375;AC=171;AF=0.1908;AN=896;BL=3455;BR=4877;BVAR;BaseQRankSum=25.536;DEL;DP=7014;Dels=0.10;EL=58;EPP=32.438;ER=105;FS=231.723;HETAR=90;HOMA=5;HOMR=387;HRun=0;InbreedingCoeff=-0.1966;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_AG.;LEN=2;LRB=0.17067;LRBP=530;MQ0Fraction=0.0470;MQM=21.951;MQRankSum=-23.449;NS=482;RA=1117;RL=62;RPP=23.273;RR=101;RUN=1;ReadPosRankSum=1.904;SAB=0.37423;SAF=61;SAP=25.404;SAR=102;SRB=0.41719;SRF=466;SRP=69.544;SRR=651;VQSLOD=-0.9395;set=filterInVQSR-2of5;sumGLbyD=5.06 +20 26185812 . AG A 322.58 PASS AF=0.0342;BaseQRankSum=3.668;DP=3014;Dels=0.01;FR;FS=10.238;HP=8;HPLen=6;HR=6;HRun=6;HU=G;InbreedingCoeff=0.1504;IndelType=DEL.NumRepetitions_6.EventLength_1.RepeatExpansion_G.;MQ0Fraction=0.0473;MQRankSum=-5.464;NF;NR;PP;ReadPosRankSum=0.536;SC=GGGTGGGTGGAGGGGGGAGGG;TC;TR=6;TU=G;VQSLOD=5.0767;set=Intersection;sumGLbyD=8.46 +20 30963468 . AGTTT A 2041.12 PASS AA=38;AB=0.75694;ABA=35;ABP=85.587;ABR=109;AC=34;AF=0.0377;AN=902;BL=1974;BR=668;BVAR;BaseQRankSum=3.060;DEL;DP=22806;DP4=1997,1747,28,36;Dels=0.02;EL=17;EPP=3.9246;ER=21;FR;FS=16.034;HETAR=29;HOMA=1;HOMR=1009;HP=1;HPLen=1;HR=1;HRun=0;HU=G;INDEL;InbreedingCoeff=0.0752;IndelType=DEL.NumRepetitions_2.EventLength_4.;LEN=4;LRB=0.49432;LRBP=1404.9;MQ=87.17;MQ0Fraction=0.0013;MQM=98.079;MQRankSum=6.021;NF;NR;NS=1039;PP;PV4=0.13,1.5e-07,1,0.051;RA=4052;RL=36;RPP=69.069;RR=2;RUN=1;ReadPosRankSum=-1.847;SAB=0.5;SAF=19;SAP=3.0103;SAR=19;SC=AGAAGTAAGTAGTTTGTTTTT;SRB=0.53776;SRF=2179;SRP=53.19;SRR=1873;TC;TR=9;TU=AAGT;VQSLOD=7.3578;set=Intersection;sumGLbyD=14.03 +20 31963212 . AAAAAAAAAAAAG A 727.15 PASS AC=5;AF=0.0080;AN=622;BaseQRankSum=4.037;DP=1480;FS=0.000;HRun=0;HaplotypeScore=43.3793;InbreedingCoeff=0.0350;IndelType=DEL.NumRepetitions_1.EventLength_10orMore.;MQ=51.77;MQ0=59;MQ0Fraction=0.0399;MQRankSum=-1.799;QD=22.72;ReadPosRankSum=3.591;SB=-364.04;VQSLOD=5.3166;set=VQSR +20 31997272 . CT C,CTT,CTTT 1837.10 PASS AA=63;AB=0.77559;ABA=57;ABP=170.57;ABR=197;AC=79,49,30;AF=0.06594,0.04090,0.02504;AN=1198;BL=2372;BR=2640;BVAR;BaseQRankSum=3.277;DP=9050;Dels=0.03;EL=24;EPP=10.766;ER=39;FR;FS=0.303;HETAR=45;HOMA=1;HOMR=981;HP=10;HPLen=10;HR=10;HRun=10;HU=T;INS;InbreedingCoeff=0.2796;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.053472;LRBP=34.128;MQ0Fraction=0.0000;MQM=50.889;MQRankSum=0.610;NF;NR;NS=1027;PP;RA=3776;RL=30;RPP=3.3205;RR=33;RUN=1;ReadPosRankSum=-0.800;SAB=0.39683;SAF=25;SAP=8.8354;SAR=38;SC=ACCCAACTTCCTTTTTTTTTT;SRB=0.46213;SRF=1745;SRP=50.049;SRR=2031;TC;TR=10;TU=T;VQSLOD=4.1189;set=filterInVQSR-2of5;sumGLbyD=3.66 +20 33446974 rs113250263 TAA T,TA,TAAA 17130.16 PASS AC=65,417,184;AF=0.05941,0.38117,0.16819;AN=1094;BVAR;BaseQRankSum=3.400;DB;DEL;DP=22362;DP4=221,247,418,524;Dels=0.33;FR;FS=15.409;HP=15;HR=14;HRun=14;HU=A;INDEL;INS;InbreedingCoeff=0.5215;IndelType=MULTIALLELIC_INDEL;MQ=61.32;MQ0Fraction=0.0021;MQRankSum=0.481;NF;NR;PP;PV4=0.33,1,1,1;RUN=1;ReadPosRankSum=-0.056;SC=CTCCGTCTCATAAAAAAAAAA;TC;TR=14;TU=A;VQSLOD=8.0974;dbSNP=132;set=Intersection;sumGLbyD=12.78 +20 33877149 . C CT 1784.40 PASS AA=58;AB=0.73096;ABA=53;ABP=94.289;ABR=144;AC=65;AF=0.05682;AN=1144;BL=3298;BR=1935;BVAR;BaseQRankSum=-2.066;DP=8074;Dels=0.02;EL=22;EPP=10.348;ER=36;FR;FS=11.452;HETAR=47;HOMA=3;HOMR=754;HP=16;HR=12;HRun=12;HU=T;INS;InbreedingCoeff=0.1178;IndelType=INS.NumRepetitions_10orMore.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.26046;LRBP=773.91;MQ0Fraction=0.0165;MQM=52.259;MQRankSum=0.734;NF;NR;NS=804;PP;RA=2141;RL=43;RPP=32.363;RR=15;RUN=1;ReadPosRankSum=-1.273;SAB=0.46552;SAF=27;SAP=3.6093;SAR=31;SC=ATTTTCTTTTCTTTTTTTTTT;SRB=0.37553;SRF=804;SRP=291.14;SRR=1337;TC;TR=12;TU=T;VQSLOD=3.1540;set=filterInVQSR-2of5;sumGLbyD=2.84 +20 34387589 rs112431805 CT C,CTT 4039.10 PASS AA=121;AB=0.75368;ABA=117;ABP=268.53;ABR=358;AC=84,139;AF=0.07047,0.11661;AN=1192;BL=5557;BR=3901;BVAR;BaseQRankSum=2.693;DB;DP=10157;Dels=0.03;EL=47;EPP=16.093;ER=74;FR;FS=7.639;HETAR=89;HOMA=2;HOMR=913;HP=13;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.2097;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.17509;LRBP=632.63;MQ0Fraction=0.0000;MQM=49.802;MQRankSum=-0.801;NF;NR;NS=1004;PP;RA=3789;RL=77;RPP=22.554;RR=44;RUN=1;ReadPosRankSum=-2.691;SAB=0.3719;SAF=45;SAP=20.256;SAR=76;SC=AAGAAGTGTTCTTTTTTTTTT;SRB=0.40987;SRF=1553;SRP=270.35;SRR=2236;TC;TR=11;TU=T;VQSLOD=4.0473;set=filterInVQSR-2of5;sumGLbyD=4.64 +20 34493409 rs73621682 C CAG 62288.93 PASS AA=1069;AB=0.54863;ABA=826;ABP=40.606;ABR=1004;AC=257;AF=0.3640;AN=706;BL=41524;BR=47039;BVAR;BaseQRankSum=-24.248;DB;DP=30195;DP4=1743,1636,614,487;Dels=0.00;EL=582;EPP=21.343;ER=487;FQ=999;FR;FS=5.080;HETAR=298;HOMA=63;HOMR=712;HP=1;HPLen=1;HR=1;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.1437;IndelType=INS.NumRepetitions_2.EventLength_2.RepeatExpansion_AG.;LEN=2;LRB=0.062272;LRBP=748.76;MQ=77.99;MQ0=3;MQ0Fraction=0.0015;MQM=54.446;MQRankSum=0.160;NF;NR;NS=1073;PP;PV4=0.016,1,0.01,1;RA=4461;RL=526;RPP=3.5973;RR=543;RUN=1;ReadPosRankSum=-1.716;SAB=0.57343;SAF=613;SAP=53.08;SAR=456;SC=AGGAAGAGATCAGAGCTCCCC;SRB=0.52634;SRF=2348;SRP=29.892;SRR=2113;TC;TR=4;TU=AG;VQSLOD=8.7047;dbSNP=130;set=Intersection;sumGLbyD=49.82 +20 35957317 . CTGACT C,CGACT 4370.96 PASS ABR=81;AC=22,1;AF=0.0321,0.0015;AF1=0.04523;AN=686;BVAR;BaseQRankSum=7.969;CI95=0.0354,0.05752;DEL;DP=16632;DP4=1942,1815,17,21;Dels=0.03;FQ=999;FR;FS=0.531;HOMA=1;HOMR=998;HP=2;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0587;IndelType=MULTIALLELIC_INDEL;MQ=83.38;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-7.201;NF;NR;NS=1020;PP;PV4=0.42,0.00017,4.5e-12,1;RA=4620;RUN=1;ReadPosRankSum=-1.007;SC=CCTCTCAGCTCTGACTGAGTC;SRB=0.50043;SRF=2312;SRP=3.0178;SRR=2308;TC;TR=8;TU=ACTG;VQSLOD=9.9778;dbSNP=130;set=Intersection;sumGLbyD=36.45 +20 36136198 . GTGTC G 2078.76 PASS AA=35;AB=0.54167;ABA=33;ABP=4.096;ABR=39;AC=17;AF=0.01384;AN=1228;BL=1212;BR=1523;BVAR;BaseQRankSum=6.900;DEL;DP=22483;DP4=1696,2291,9,16;Dels=0.01;EL=9;EPP=20.94;ER=26;FQ=999;FR;FS=3.023;HETAR=13;HOMA=1;HOMR=1061;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1113;IndelType=DEL.NumRepetitions_2.EventLength_4.;LEN=4;LRB=0.11371;LRBP=79.803;MQ=93.98;MQ0=1;MQ0Fraction=0.0003;MQM=83.686;MQRankSum=-1.683;NF;NR;NS=1075;PP;PV4=0.55,1,0.0083,1;RA=5771;RL=19;RPP=3.5687;RR=16;RUN=1;ReadPosRankSum=0.618;SAB=0.37143;SAF=13;SAP=8.0357;SAR=22;SC=TATCATTTTAGTGTCTGTCTG;SRB=0.44966;SRF=2595;SRP=130.03;SRR=3176;TC;TR=11;TU=CTGT;VQSLOD=10.1935;set=Intersection;sumGLbyD=31.66 +20 36250522 . CA C 37933 PASS AA=51;AB=0.95582;ABA=44;ABP=1800.5;ABR=952;AC=23;AF=0.01885;AN=1220;BL=691;BR=3464;BVAR;BaseQRankSum=-2.418;DEL;DP=11998;Dels=0.00;EL=18;EPP=12.59;ER=33;FS=2.307;HETAR=348;HOMA=534;HOMR=164;HRun=1;InbreedingCoeff=0.0763;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.66739;LRBP=4021.7;MQ0=2;MQ0Fraction=0.0006;MQM=53.647;MQRankSum=1.083;NS=1047;RA=1663;RL=2;RPP=97.065;RR=49;RUN=1;ReadPosRankSum=-12.726;SAB=0.68627;SAF=35;SAP=18.381;SAR=16;SRB=0.59651;SRF=992;SRP=137.56;SRR=671;VQSLOD=4.1346;set=filterInVQSR-2of5;sumGLbyD=3.29 +20 36285033 rs34715186 AT A 39417 PASS AA=530;AB=0.5406;ABA=447;ABP=16.939;ABR=526;AC=88;AF=0.0950;AN=926;BL=20722;BR=20406;BVAR;BaseQRankSum=15.611;DB;DEL;DP=36713;DP4=2551,2475,236,218;Dels=0.09;EL=241;EPP=12.45;ER=289;FQ=999;FR;FS=1.290;HETAR=141;HOMA=16;HOMR=926;HP=2;HPLen=3;HR=3;HRun=1;HU=A;INDEL;InbreedingCoeff=0.0742;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.0076833;LRBP=8.2825;MQ=104.81;MQ0=0;MQ0Fraction=0.0000;MQM=84.285;MQRankSum=-0.702;NF;NR;NS=1083;PP;PV4=0.62,1,1,1;RA=6562;RL=263;RPP=3.0759;RR=267;RUN=1;ReadPosRankSum=0.090;SAB=0.55849;SAF=296;SAP=18.76;SAR=234;SC=AAAAACACAAATCAGATCGTG;SRB=0.51707;SRF=3393;SRP=19.614;SRR=3169;TC;TR=3;TU=A;VQSLOD=10.5533;dbSNP=126;set=Intersection;sumGLbyD=14.15 +20 36384872 . CTG C 43532.41 PASS AC=1213;AF=0.99589;AN=1218;BaseQRankSum=0.802;DP=3208;FS=9.727;HRun=0;HaplotypeScore=46.6153;InbreedingCoeff=0.1085;IndelType=DEL.NumRepetitions_7.EventLength_2.RepeatExpansion_TG.;MQ=58.37;MQ0=50;MQ0Fraction=0.0156;MQRankSum=-1.672;QD=13.57;ReadPosRankSum=2.063;SB=-18894.12;VQSLOD=4.7353;set=VQSR +20 36542802 . GTA G 31310.15 PASS AA=1481;AB=0.67546;ABA=1378;ABP=1138.4;ABR=2868;AC=437;AF=0.35938;AN=1216;BL=25719;BR=95500;BVAR;BaseQRankSum=9.478;DEL;DP=18068;DS;Dels=0.10;EL=889;EPP=132.34;ER=592;FS=320.726;HETAR=591;HOMA=44;HOMR=378;HRun=0;InbreedingCoeff=-0.4197;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_TA.;LEN=2;LRB=0.57566;LRBP=87231;MQ0Fraction=0.0091;MQM=29.319;MQRankSum=-3.409;NS=1013;RA=4037;RL=3;RPP=3193;RR=1478;RUN=1;ReadPosRankSum=-6.687;SAB=0.40041;SAF=593;SAP=130.61;SAR=888;SRB=0.39014;SRF=1575;SRP=426.21;SRR=2462;VQSLOD=-1.6586;set=filterInVQSR-2of5;sumGLbyD=5.49 +20 36985025 . CCA C 4.57 PASS AC=0;AF=0.0000;AN=682;BaseQRankSum=4.199;DP=1504;FS=1.036;HRun=0;HaplotypeScore=18.5241;InbreedingCoeff=0.0460;IndelType=DEL.NumRepetitions_6.EventLength_2.RepeatExpansion_CA.;MQ=57.04;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.774;ReadPosRankSum=-2.105;VQSLOD=6.7455;set=VQSR +20 37139725 . CAG C 250.77 PASS AF=0.0084;AF1=0.0139;BaseQRankSum=4.131;CI95=0.00885,0.01991;DP=7973;DP4=1808,1990,2,7;Dels=0.01;FQ=104;FR;FS=11.160;HP=3;HPLen=2;HR=1;HRun=0;HU=A;INDEL;InbreedingCoeff=-0.0001;IndelType=DEL.NumRepetitions_3.EventLength_2.RepeatExpansion_AG.;MQ=103.71;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-3.378;NF;NR;PP;PV4=0.18,0.0011,0.041,1;ReadPosRankSum=0.605;SC=AGATGGGGAACAGAGAGCAAG;TC;TR=6;TU=AG;VQSLOD=7.0630;set=Intersection;sumGLbyD=12.13 +20 37213224 . G GTA 3230.05 PASS AA=32;AB=0.50769;ABA=32;ABP=3.0437;ABR=33;AC=12;AF=0.0168;AF1=0.02635;AN=714;BL=1271;BR=1743;BVAR;BaseQRankSum=-7.288;CI95=0.02212,0.03319;DP=14304;DP4=2180,2256,13,21;Dels=0.00;EL=20;EPP=7.3532;ER=12;FQ=999;FR;FS=7.863;HETAR=9;HOMA=0;HOMR=1043;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0410;IndelType=INS.NumRepetitions_1.EventLength_2.RepeatExpansion_TA.;LEN=2;LRB=0.1566;LRBP=163.52;MQ=95.56;MQ0=1;MQ0Fraction=0.0005;MQM=51.562;MQRankSum=0.420;NF;NR;NS=1052;PP;PV4=0.23,1,0.03,0.33;RA=5138;RL=11;RPP=9.7962;RR=21;RUN=1;ReadPosRankSum=-1.122;SAB=0.28125;SAF=9;SAP=16.311;SAR=23;SC=TTTGCATCCAGTAGCACCACT;SRB=0.42293;SRF=2173;SRP=268.11;SRR=2965;TC;TR=1;TU=T;VQSLOD=9.7315;set=Intersection;sumGLbyD=36.69 +20 37282014 . ATGG A 2518.52 PASS AF=0.03519;BaseQRankSum=11.994;DP=24592;DP4=415,3804,8,49;DS;Dels=0.01;FQ=999;FR;FS=2.049;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1028;IndelType=DEL.NumRepetitions_5.EventLength_3.;MQ=51.01;MQ0Fraction=0.0139;MQRankSum=-5.912;NF;NR;PP;PV4=0.27,1,0.22,0.015;ReadPosRankSum=1.781;SC=GGTGGTGATGATGGTGGTGGT;TC;TR=17;TU=GGT;VQSLOD=2.1183;set=filterInVQSR-2of5;sumGLbyD=9.05 +20 37532218 . GTCCGTCCA ATCCGTCCA,G 76120.88 PASS AC=998;AF=0.92924;AN=1074;BaseQRankSum=-2.877;DP=3087;FR;FS=9.889;HP=2;HPLen=2;HR=1;HRun=0;HU=T;HaplotypeScore=71.6244;InbreedingCoeff=-0.0027;IndelType=MIXED;MQ=52.68;MQ0=543;MQ0Fraction=0.1759;MQRankSum=-1.750;NF;NR;PP;QD=24.98;ReadPosRankSum=-0.850;SB=-36635.43;SC=CCGTCCGTCCGTCCGTCCATC;TC;TR=19;TU=CCGT;VQSLOD=5.3068;set=Intersection +20 37712193 . AAG A 2670.33 PASS AA=106;AB=0.62821;ABA=87;ABP=36.418;ABR=147;AC=53;AF=0.0759;AN=698;BL=4672;BR=4303;BVAR;BaseQRankSum=13.696;DEL;DP=15155;DP4=1340,1852,32,52;Dels=0.06;EL=57;EPP=4.3214;ER=49;FR;FS=0.824;HETAR=43;HOMA=7;HOMR=982;HP=1;HPLen=2;HR=2;HRun=0;HU=A;INDEL;InbreedingCoeff=0.0861;IndelType=DEL.NumRepetitions_3.EventLength_2.RepeatExpansion_AG.;LEN=2;LRB=0.041114;LRBP=35.954;MQ=86.12;MQ0=0;MQ0Fraction=0.0000;MQM=54.236;MQRankSum=-5.745;NF;NR;NS=1034;PP;PV4=0.5,7.3e-26,1.1e-10,1;RA=4423;RL=58;RPP=5.0589;RR=48;RUN=1;ReadPosRankSum=2.617;SAB=0.38679;SAF=41;SAP=14.81;SAR=65;SC=GAAAATTCTGAAGAGAGTCAG;SRB=0.43093;SRF=1906;SRP=186.29;SRR=2517;TC;TR=6;TU=AG;VQSLOD=9.8131;set=Intersection;sumGLbyD=14.20 +20 37739002 . T TCA 1395.38 PASS AA=16;AB=0.48387;ABA=16;ABP=3.0803;ABR=15;AC=11;AF=0.00950;AN=1158;BL=504;BR=630;BVAR;BaseQRankSum=-3.257;DP=13617;DP4=1660,883,7,5;Dels=0.00;EL=7;EPP=3.5532;ER=9;FR;FS=1.114;HETAR=9;HOMA=0;HOMR=991;HP=1;HPLen=2;HR=2;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0527;IndelType=INS.NumRepetitions_1.EventLength_2.RepeatExpansion_CA.;LEN=2;LRB=0.11111;LRBP=33.411;MQ=88.41;MQ0=0;MQ0Fraction=0.0000;MQM=83.75;MQRankSum=1.713;NF;NR;NS=1000;PP;PV4=0.76,1,1,0.5;RA=3257;RL=6;RPP=5.1818;RR=10;RUN=1;ReadPosRankSum=1.190;SAB=0.6875;SAF=11;SAP=7.8961;SAR=5;SC=CCTTTTTTGTTCATTTCTGCA;SRB=0.68806;SRF=2241;SRP=1003.5;SRR=1016;TC;TR=2;TU=T;VQSLOD=10.2220;set=Intersection;sumGLbyD=41.32 +20 38395256 . TTGAG T 633.19 PASS AF=0.0028;BaseQRankSum=5.667;DP=3839;Dels=0.00;FR;FS=10.238;HP=2;HPLen=3;HR=3;HRun=0;HU=T;InbreedingCoeff=-0.0097;IndelType=DEL.NumRepetitions_1.EventLength_4.;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.276;NF;NR;PP;ReadPosRankSum=-1.016;SC=ATGTGTTTGTTTGAGTATGTT;TC;TR=10;TU=GTTT;VQSLOD=6.4906;set=Intersection;sumGLbyD=10.83 +20 39345038 . CTGAACCATAATGTG C,CCCATAATGTG 60744.52 PASS AA=23;AB=0.67143;ABA=23;ABP=20.878;ABR=47;AC=232,2;AF=0.19366,0.00167;AN=1198;BL=1607;BR=1843;BVAR;BaseQRankSum=30.955;DEL;DP=31490;DP4=1729,2100,265,278;Dels=0.13;EL=6;EPP=14.434;ER=17;FQ=999;FR;FS=1.767;HETAR=18;HOMA=0;HOMR=1015;HP=1;HPLen=2;HR=2;HRun=0;HU=C;INDEL;InbreedingCoeff=0.1991;IndelType=MULTIALLELIC_INDEL;LEN=14;LRB=0.068406;LRBP=38.066;MQ=104.60;MQ0=0;MQ0Fraction=0.0000;MQM=189.83;MQRankSum=-16.579;NF;NR;NS=1033;PP;PV4=0.12,1,5.5e-137,1;RA=5286;RL=14;RPP=5.3706;RR=9;RUN=1;ReadPosRankSum=4.323;SAB=0.56522;SAF=13;SAP=3.86;SAR=10;SC=TGGGCTGGACCTGAACCATAA;SRB=0.46311;SRF=2448;SRP=65.493;SRR=2838;TC;TR=2;TU=C;VQSLOD=6.2643;dbSNP=130;set=Intersection;sumGLbyD=65.43 +20 39418008 . AG A 46796 PASS AA=113;AB=0.9511;ABA=80;ABP=2894.6;ABR=1556;AC=30;AF=0.02412;AN=1244;BL=638;BR=6936;BVAR;BaseQRankSum=7.280;DEL;DP=14307;Dels=0.00;EL=50;EPP=6.2579;ER=63;FR;FS=5.707;HETAR=473;HOMA=361;HOMR=246;HP=3;HR=3;HRun=3;HU=G;InbreedingCoeff=0.0272;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.83153;LRBP=11375;MQ0=0;MQ0Fraction=0.0000;MQM=62.398;MQRankSum=3.530;NF;NR;NS=1089;PP;RA=3000;RL=3;RPP=223.02;RR=110;RUN=1;ReadPosRankSum=-18.601;SAB=0.58407;SAF=66;SAP=9.9475;SAR=47;SC=ACTGGGGGAAAGGGATTCTAG;SRB=0.494;SRF=1482;SRP=3.9484;SRR=1518;TC;TR=3;TU=G;VQSLOD=4.5834;set=Intersection;sumGLbyD=3.06 +20 39876961 . GT G,GTT,GTTT 2302.10 PASS ABR=496;AC=45,51,45;AF=0.03664,0.04153,0.03664;AN=1228;BVAR;BaseQRankSum=4.462;DP=37649;DP4=1457,1975,57,59;Dels=0.02;FR;FS=9.938;HOMA=0;HOMR=978;HP=10;HPLen=10;HR=10;HRun=10;HU=T;INDEL;INS;InbreedingCoeff=0.2583;IndelType=MULTIALLELIC_INDEL;MQ=97.28;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.246;NF;NR;NS=1063;PP;PV4=0.15,1,1.9e-09,0.016;RA=5185;RUN=1;ReadPosRankSum=-4.954;SC=AGTTTCTCCGGTTTTTTTTTT;SRB=0.47464;SRF=2461;SRP=31.978;SRR=2724;TC;TR=10;TU=T;VQSLOD=4.9752;set=Intersection;sumGLbyD=4.39 +20 41013333 . TC T 20681 PASS AA=137;AB=0.89211;ABA=134;ABP=1661.6;ABR=1108;AC=68;AF=0.05601;AN=1214;BL=1091;BR=8981;BVAR;BaseQRankSum=1.354;DEL;DP=12998;Dels=0.01;EL=57;EPP=11.395;ER=80;FS=0.758;HETAR=359;HOMA=100;HOMR=610;HRun=1;InbreedingCoeff=0.0104;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.78336;LRBP=13424;MQ0=1;MQ0Fraction=0.0003;MQM=67.745;MQRankSum=2.563;NS=1072;RA=4447;RL=5;RPP=258.66;RR=132;RUN=1;ReadPosRankSum=-14.092;SAB=0.59124;SAF=81;SAP=12.917;SAR=56;SRB=0.54194;SRF=2410;SRP=70.947;SRR=2037;VQSLOD=3.7531;set=filterInVQSR-2of5;sumGLbyD=4.14 +20 41659532 . GC G 40544 PASS AA=42;AB=0.97149;ABA=39;ABP=2644.5;ABR=1329;AC=15;AF=0.0209;AN=716;BL=2531;BR=135;BVAR;BaseQRankSum=-2.537;DEL;DP=12219;Dels=0.00;EL=25;EPP=6.3192;ER=17;FS=2.656;HETAR=374;HOMA=155;HOMR=551;HRun=1;InbreedingCoeff=-0.0270;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.89872;LRBP=4678.9;MQ0=0;MQ0Fraction=0.0000;MQM=103.31;MQRankSum=2.828;NS=1088;RA=4736;RL=41;RPP=85.733;RR=1;RUN=1;ReadPosRankSum=-9.702;SAB=0.57143;SAF=24;SAP=4.8716;SAR=18;SRB=0.5625;SRF=2664;SRP=163.7;SRR=2072;VQSLOD=4.3267;set=Intersection;sumGLbyD=3.22 +20 41845580 . GA G 49310 PASS AA=83;AB=0.95258;ABA=69;ABP=2591.6;ABR=1386;AC=46;AF=0.03740;AN=1230;BL=1320;BR=5150;BVAR;BaseQRankSum=-1.121;DEL;DP=13336;Dels=0.00;EL=36;EPP=6.1759;ER=47;FR;FS=0.372;HETAR=442;HOMA=341;HOMR=295;HP=2;HR=3;HRun=1;HU=G;InbreedingCoeff=0.0238;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.59196;LRBP=4926.2;MQ0=0;MQ0Fraction=0.0000;MQM=89.048;MQRankSum=0.897;NF;NR;NS=1080;PP;RA=3006;RL=5;RPP=142.43;RR=78;RUN=1;ReadPosRankSum=-15.412;SAB=0.55422;SAF=46;SAP=5.1294;SAR=37;SC=CCAGCTGTGGGAGAGAAACAT;SRB=0.47971;SRF=1442;SRP=13.762;SRR=1564;TC;TR=6;TU=AG;VQSLOD=4.4669;set=Intersection;sumGLbyD=3.65 +20 42209428 . GC G 13163 PASS AA=89;AB=0.86677;ABA=83;ABP=730.96;ABR=540;AC=39;AF=0.03218;AN=1212;BL=950;BR=5334;BVAR;BaseQRankSum=-10.119;DEL;DP=10692;Dels=0.01;EL=48;EPP=4.2058;ER=41;FS=0.000;HETAR=259;HOMA=727;HOMR=54;HRun=1;InbreedingCoeff=0.0448;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.69764;LRBP=6644.4;MQ0=0;MQ0Fraction=0.0000;MQM=126.55;MQRankSum=4.223;NS=1040;RA=723;RL=12;RPP=106.09;RR=77;RUN=1;ReadPosRankSum=-17.362;SAB=0.39326;SAF=35;SAP=11.818;SAR=54;SRB=0.37898;SRF=274;SRP=94.99;SRR=449;VQSLOD=3.7157;set=filterInVQSR-2of5;sumGLbyD=3.48 +20 42281109 . T TAG 2321.12 PASS AC=181;AF=0.3740;AN=484;BaseQRankSum=8.977;DP=435;FS=17.001;HRun=0;HaplotypeScore=14.6734;InbreedingCoeff=0.2340;IndelType=INS.NOVEL_2.;MQ=53.88;MQ0=47;MQ0Fraction=0.1080;MQRankSum=0.762;QD=12.41;ReadPosRankSum=3.399;SB=-1299.73;VQSLOD=4.8926;set=VQSR +20 42436117 . TC T 38933 PASS AA=18;AB=0.98435;ABA=17;ABP=2215.9;ABR=1069;AC=15;AF=0.01223;AN=1226;BL=498;BR=428;BVAR;BaseQRankSum=-7.224;DEL;DP=12436;Dels=0.00;EL=1;EPP=33.893;ER=17;FS=2.469;HETAR=303;HOMA=614;HOMR=123;HRun=1;InbreedingCoeff=0.0439;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.075594;LRBP=14.501;MQ0=0;MQ0Fraction=0.0000;MQM=98.611;MQRankSum=1.086;NS=1075;RA=1656;RL=10;RPP=3.4928;RR=8;RUN=1;ReadPosRankSum=-17.765;SAB=0.5;SAF=9;SAP=3.0103;SAR=9;SRB=0.49879;SRF=826;SRP=3.0313;SRR=830;VQSLOD=4.0821;set=filterInVQSR-2of5;sumGLbyD=3.04 +20 42682214 . C A,CAT 3904.51 PASS AA=24;AB=0.6383;ABA=17;ABP=10.818;ABR=30;AC=0;AF=0.0000;AN=636;BL=1119;BR=949;BVAR;BaseQRankSum=1.426;DP=6509;Dels=0.00;EL=9;EPP=6.2675;ER=15;FR;HETAR=12;HOMA=3;HOMR=876;HP=2;HPLen=1;HR=1;HRun=0;HU=A;INS;InbreedingCoeff=0.0006;IndelType=MIXED;LEN=2;LRB=0.082205;LRBP=33.356;MQ0Fraction=0.0046;MQM=40.792;MQRankSum=-0.296;NF;NR;NS=891;PP;QD=32.81;RA=2679;RL=15;RPP=6.2675;RR=9;RUN=1;ReadPosRankSum=-1.806;SAB=0.75;SAF=18;SAP=16.039;SAR=6;SB=-924.23;SC=TATACACACACATATATATAC;SRB=0.66293;SRF=1776;SRP=620.76;SRR=903;TC;TR=9;TU=AC;set=filterInVQSR-2of5;sumGLbyD=32.75 +20 42973456 . CA C,CAA,CAAA 2675 PASS AA=90;AB=0.79177;ABA=86;ABP=308.39;ABR=327;AC=77,61,39;AF=0.06492,0.05143,0.03288;AN=1186;BL=2983;BR=4446;BVAR;BaseQRankSum=2.422;DP=9416;Dels=0.03;EL=39;EPP=6.4847;ER=51;FR;FS=31.555;HETAR=75;HOMA=1;HOMR=888;HP=11;HR=11;HRun=11;HU=A;INS;InbreedingCoeff=0.2696;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.19693;LRBP=628.63;MQ0=0;MQ0Fraction=0.0000;MQM=55.567;MQRankSum=1.777;NF;NR;NS=964;PP;RA=3601;RL=37;RPP=9.1869;RR=53;RUN=1;ReadPosRankSum=-4.991;SAB=0.55556;SAF=50;SAP=5.423;SAR=40;SC=TAGTGACTGTCAAAAAAAAAA;SRB=0.60622;SRF=2183;SRP=355.91;SRR=1418;TC;TR=11;TU=A;VQSLOD=1.0763;set=filterInVQSR-2of5;sumGLbyD=4.05 +20 43091870 . TC T 2455.60 PASS AA=120;AB=0.10619;ABA=101;ABP=155.22;ABR=12;AC=42;AF=0.03825;AN=1098;BL=573;BR=8744;BVAR;BaseQRankSum=-13.513;DEL;DP=9139;Dels=0.00;EL=64;EPP=4.1684;ER=56;FS=9.856;HETAR=118;HOMA=820;HOMR=0;HRun=1;InbreedingCoeff=0.0833;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.877;LRBP=15564;MQ0Fraction=0.0017;MQM=45.1;MQRankSum=2.266;NS=938;RA=24;RL=1;RPP=254.97;RR=119;RUN=1;ReadPosRankSum=-15.803;SAB=0.475;SAF=57;SAP=3.6617;SAR=63;SRB=0.54167;SRF=13;SRP=3.3722;SRR=11;VQSLOD=3.9930;set=filterInVQSR-2of5;sumGLbyD=3.09 +20 43233648 rs74585029 GA G,GAA 1504.40 PASS AA=113;AB=0.78652;ABA=95;ABP=320.31;ABR=350;AC=41,65;AF=0.03394,0.05381;AF1=0.0115;AN=1208;BL=4677;BR=5548;BVAR;BaseQRankSum=6.744;CI95=0.004274,0.01852;DB;DEL;DP=13996;DP4=1736,1549,15,17;Dels=0.03;EL=69;EPP=15.021;ER=44;FQ=14;FR;FS=12.174;HETAR=119;HOMA=15;HOMR=892;HP=11;HPLen=10;HR=10;HRun=10;HU=A;INDEL;InbreedingCoeff=0.2359;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.085183;LRBP=164.12;MQ=89.12;MQ0Fraction=0.0000;MQM=69.867;MQRankSum=2.513;NF;NR;NS=1027;PP;PV4=0.59,1,0.065,0.33;RA=3845;RL=46;RPP=11.485;RR=67;RUN=1;ReadPosRankSum=-4.957;SAB=0.33628;SAF=38;SAP=29.318;SAR=75;SC=AAAACAGCCAGAAAAAAAAAA;SRB=0.43667;SRF=1679;SRP=136.95;SRR=2166;TC;TR=10;TU=A;VQSLOD=4.5121;set=Intersection;sumGLbyD=8.22 +20 43246548 . AC A,CC 41579.13 PASS AA=382;AB=0.72402;ABA=316;ABP=502.11;ABR=829;AC=1197;AF=0.99254;AN=1206;BL=9889;BR=14293;BVAR;BaseQRankSum=1.373;DEL;DP=10477;DS;Dels=0.05;EL=243;EPP=64.494;ER=139;FS=29.162;HETAR=291;HOMA=85;HOMR=624;HPLen=10;InbreedingCoeff=0.1392;IndelType=MIXED;LEN=1;LRB=0.18212;LRBP=1744.6;MQ0Fraction=0.0024;MQM=48.471;MQRankSum=5.726;NS=1001;RA=3138;RL=174;RPP=9.5816;RR=208;RUN=1;ReadPosRankSum=5.755;SAB=0.79843;SAF=305;SAP=298.51;SAR=77;SRB=0.70363;SRF=2208;SRP=1133.2;SRR=930;VQSLOD=5.6318;set=Intersection;sumGLbyD=5.22 +20 43258646 . T TT 1107.17 PASS AC=97;AF=0.08420;AN=1152;BaseQRankSum=4.525;DP=2345;FS=19.308;HRun=9;HaplotypeScore=13.6276;InbreedingCoeff=0.1299;IndelType=INS.NumRepetitions_10orMore.EventLength_1.RepeatExpansion_T.;MQ=76.70;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.395;QD=2.67;ReadPosRankSum=-4.696;SB=-899.41;VQSLOD=5.4523;set=VQSR +20 43718299 . ATTACT A 5497.06 PASS AA=56;AB=0.51818;ABA=53;ABP=3.3262;ABR=57;AC=18;AF=0.0251;AF1=0.03729;AN=718;BL=2321;BR=2591;BVAR;BaseQRankSum=11.142;CI95=0.03319,0.04425;DEL;DP=17576;DP4=2460,2692,31,22;Dels=0.02;EL=28;EPP=3.0103;ER=28;FQ=999;FR;FS=9.689;HETAR=15;HOMA=1;HOMR=1068;HP=2;HPLen=2;HR=2;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0448;IndelType=DEL.NumRepetitions_1.EventLength_5.;LEN=5;LRB=0.054967;LRBP=35.238;MQ=96.55;MQ0=0;MQ0Fraction=0.0000;MQM=50.286;MQRankSum=-5.149;NF;NR;NS=1084;PP;PV4=0.13,1,1.2e-12,1;RA=6745;RL=28;RPP=3.0103;RR=28;RUN=1;ReadPosRankSum=0.828;SAB=0.5;SAF=28;SAP=3.0103;SAR=28;SC=ATGACAGTGGATTACTTTAGT;SRB=0.46835;SRF=3159;SRP=61.709;SRR=3586;TC;TR=2;TU=T;VQSLOD=7.8832;set=Intersection;sumGLbyD=46.60 +20 43981749 . A AAAAAAC,AC 20899.71 PASS ABR=192;AC=91,0;AF=0.1285,0.0000;AN=708;BVAR;BaseQRankSum=7.858;DP=23372;DP4=1554,1457,55,42;Dels=0.00;FR;FS=0.000;HOMA=4;HOMR=995;HP=6;HPLen=7;HR=7;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.2109;IndelType=MULTIALLELIC_INDEL;MQ=95.59;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-12.081;NF;NR;NS=1051;PP;PV4=0.35,1,8.9e-73,1;RA=5027;RUN=1;ReadPosRankSum=-1.359;SC=TACACTAGCAAAAAAACAAAA;SRB=0.48518;SRF=2439;SRP=12.6;SRR=2588;TC;TR=7;TU=A;VQSLOD=8.0916;set=Intersection;sumGLbyD=54.33 +20 43999274 . TCAAA T 2948.85 PASS AA=59;AB=0.59441;ABA=58;ABP=14.08;ABR=85;AC=20;AF=0.0290;AF1=0.04249;AN=690;BL=2277;BR=2436;BVAR;BaseQRankSum=9.320;CI95=0.0354,0.05088;DEL;DP=14599;DP4=2052,2303,21,22;Dels=0.03;EL=32;EPP=3.9304;ER=27;FQ=999;FR;FS=0.000;HETAR=21;HOMA=0;HOMR=1043;HP=2;HPLen=1;HR=1;HRun=0;HU=C;INDEL;InbreedingCoeff=-0.0037;IndelType=DEL.NumRepetitions_1.EventLength_4.;LEN=4;LRB=0.033736;LRBP=14.658;MQ=90.05;MQ0=0;MQ0Fraction=0.0000;MQM=75.339;MQRankSum=-1.294;NF;NR;NS=1064;PP;PV4=0.88,1,0.0026,1;RA=5732;RL=27;RPP=3.9304;RR=32;RUN=1;ReadPosRankSum=-0.915;SAB=0.47458;SAF=28;SAP=3.3415;SAR=31;SC=GGTACACAGCTCAAACAGTCT;SRB=0.4836;SRF=2772;SRP=16.4;SRR=2960;TC;TR=1;TU=C;VQSLOD=9.8086;set=Intersection;sumGLbyD=27.09 +20 44098622 . C CG 1092.40 PASS AA=129;AB=0.77301;ABA=74;ABP=214.06;ABR=252;AC=45;AF=0.0455;AN=988;BL=6586;BR=3029;BVAR;BaseQRankSum=2.802;DP=5177;Dels=0.00;EL=122;EPP=225.63;ER=7;FR;FS=355.273;HETAR=66;HOMA=11;HOMR=734;HP=6;HR=4;HRun=4;HU=G;INS;InbreedingCoeff=0.1759;IndelType=INS.NumRepetitions_4.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.36994;LRBP=2860.4;MQ0=0;MQ0Fraction=0.0000;MQM=52.395;MQRankSum=1.946;NF;NR;NS=811;PP;RA=1981;RL=121;RPP=217.95;RR=8;RUN=1;ReadPosRankSum=-6.413;SAB=0.99225;SAF=128;SAP=274.51;SAR=1;SC=GCGGAAGTGGCGGGGACCCTT;SRB=0.41242;SRF=817;SRP=135;SRR=1164;TC;TR=4;TU=G;VQSLOD=-2.2690;set=filterInVQSR-2of5;sumGLbyD=4.04 +20 44327637 . A AG,AGGGGGG 14351.23 PASS AC=9,211;AF=0.0103,0.2409;AN=876;BaseQRankSum=15.517;DP=1704;FS=6.768;HaplotypeScore=31.5906;InbreedingCoeff=0.1538;IndelType=MULTIALLELIC_INDEL;MQ=54.64;MQ0=4;MQ0Fraction=0.0023;MQRankSum=-12.691;QD=20.83;ReadPosRankSum=-3.583;SB=-6278.99;VQSLOD=5.1556;set=VQSR +20 45202636 . GA G 13269 PASS AA=25;AB=0.96162;ABA=18;ABP=871.09;ABR=451;AC=24;AF=0.02013;AN=1192;BL=567;BR=1728;BVAR;BaseQRankSum=-5.361;DEL;DP=10873;Dels=0.00;EL=10;EPP=5.1818;ER=15;FS=0.928;HETAR=169;HOMA=831;HOMR=45;HRun=1;InbreedingCoeff=0.0999;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.50588;LRBP=1278.4;MQ0=0;MQ0Fraction=0.0000;MQM=170.56;MQRankSum=0.161;NS=1049;RA=632;RL=2;RPP=41.315;RR=23;RUN=1;ReadPosRankSum=-14.760;SAB=0.68;SAF=17;SAP=10.046;SAR=8;SRB=0.51424;SRF=325;SRP=4.1235;SRR=307;VQSLOD=3.9290;set=filterInVQSR-2of5;sumGLbyD=3.90 +20 45417828 . TGAGC T,TGC 4672.90 PASS ABR=317;AC=69,104;AF=0.05712,0.08609;BVAR;BaseQRankSum=18.527;DEL;DP=11835;DS;FS=184.873;HOMA=48;HOMR=575;HaplotypeScore=65.5875;InbreedingCoeff=0.0599;IndelType=MULTIALLELIC_INDEL;MQ=29.78;MQ0=2988;MQ0Fraction=0.3629;MQRankSum=5.052;NS=713;QD=1.11;RA=1581;RUN=1;ReadPosRankSum=6.574;SB=-2116.87;SRB=0.47502;SRF=751;SRP=11.582;SRR=830;VQSLOD=0.0651;set=filterInVQSR-2of5 +20 45525657 rs66759083 TA AA,T 49315 PASS AA=2361;AB=0.45241;ABA=1398;ABP=53.235;ABR=1155;AC=20;AF=0.01701;AN=1176;BL=94913;BR=100886;BVAR;BaseQRankSum=0.740;DB;DEL;DP=30636;DP4=1258,881,1206,999;Dels=0.48;EL=1133;EPP=11.311;ER=1228;FQ=999;FR;FS=7.072;HETAR=503;HOMA=310;HOMR=218;HP=6;HPLen=7;HR=7;HU=T;INDEL;InbreedingCoeff=0.2271;IndelType=MIXED;LEN=1;LRB=0.030506;LRBP=398.68;MQ=102.24;MQ0=0;MQ0Fraction=0.0000;MQM=75.359;MQRankSum=0.148;NF;NR;NS=1031;PP;PV4=0.0064,0,4.6e-23,0.47;RA=2042;RL=1183;RPP=3.0333;RR=1178;RUN=1;ReadPosRankSum=-2.999;SAB=0.52139;SAF=1231;SAP=12.392;SAR=1130;SC=AGGATTTTTTTAAAAAGTTTT;SRB=0.55093;SRF=1125;SRP=49.017;SRR=917;TC;TR=7;TU=T;VQSLOD=7.1651;dbSNP=114;set=Intersection;sumGLbyD=18.51 +20 45783456 . T TG 2355.68 PASS AA=64;AB=0.78521;ABA=61;ABP=203.67;ABR=223;AC=15;AF=0.0165;AN=910;BL=815;BR=5486;BVAR;BaseQRankSum=8.593;DP=10348;Dels=0.00;EL=48;EPP=37.754;ER=16;FS=77.861;HETAR=56;HOMA=1;HOMR=970;HRun=1;INS;InbreedingCoeff=-0.0549;IndelType=INS.NOVEL_1.Novel_G.;LEN=1;LRB=0.74131;LRBP=7522.1;MQ0Fraction=0.0122;MQM=44.562;MQRankSum=-1.258;NS=1027;RA=4750;RL=0;RPP=141.98;RR=64;RUN=1;ReadPosRankSum=-7.047;SAB=0.25;SAF=16;SAP=37.754;SAR=48;SRB=0.6;SRF=2850;SRP=415.59;SRR=1900;VQSLOD=1.3146;set=filterInVQSR-2of5;sumGLbyD=6.03 +20 46517110 . C CT 868.55 PASS AC=15;AF=0.0218;AN=688;BaseQRankSum=8.522;DP=1752;FS=6.570;HRun=0;HaplotypeScore=14.9548;InbreedingCoeff=0.0452;IndelType=INS.NOVEL_1.Novel_T.;MQ=77.73;MQ0=0;MQ0Fraction=0.0000;MQRankSum=3.874;QD=10.98;ReadPosRankSum=-0.733;SB=-396.78;VQSLOD=6.7740;set=VQSR +20 46629361 . TTTCTTTC T,TTTTC 13000.91 PASS AC=188,107;AF=0.2212,0.1259;AN=850;BaseQRankSum=7.214;DP=1846;FS=14.502;HaplotypeScore=40.8481;InbreedingCoeff=0.3210;IndelType=MULTIALLELIC_INDEL;MQ=50.74;MQ0=79;MQ0Fraction=0.0428;MQRankSum=-6.348;QD=13.59;ReadPosRankSum=3.943;SB=-3581.20;VQSLOD=5.9412;set=VQSR +20 46951099 . G GT 1662.30 PASS AA=55;AB=0.7713;ABA=51;ABP=145.58;ABR=172;AC=47;AF=0.03923;AN=1198;BL=3288;BR=2434;BVAR;BaseQRankSum=-4.014;DP=27423;DP4=1483,1590,58,42;Dels=0.01;EL=21;EPP=9.6826;ER=34;FR;FS=9.565;HETAR=48;HOMA=0;HOMR=913;HP=16;HPLen=10;HR=10;HRun=10;HU=T;INDEL;INS;InbreedingCoeff=0.0952;IndelType=INS.NumRepetitions_10orMore.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.14925;LRBP=279.78;MQ=70.36;MQ0Fraction=0.0124;MQM=52.545;MQRankSum=0.717;NF;NR;NS=961;PP;PV4=0.067,1,1,0.17;RA=3035;RL=38;RPP=20.422;RR=17;RUN=1;ReadPosRankSum=-3.014;SAB=0.47273;SAF=26;SAP=3.3656;SAR=29;SC=TTTGTTTTTTGTTTTTTTTTT;SRB=0.36013;SRF=1093;SRP=518.73;SRR=1942;TC;TR=10;TU=T;VQSLOD=5.4779;set=Intersection;sumGLbyD=3.49 +20 47201076 rs58052846 C CT 982.16 PASS AC=50;AF=0.0551;AN=908;BaseQRankSum=12.598;DB;DP=2449;FS=35.648;HRun=0;HaplotypeScore=29.4602;InbreedingCoeff=-0.0542;IndelType=INS.NOVEL_1.Novel_T.;MQ=63.54;MQ0=0;MQ0Fraction=0.0000;MQRankSum=2.196;QD=3.16;ReadPosRankSum=-13.833;SB=-488.19;VQSLOD=6.0429;set=VQSR +20 47965974 rs60011158 G GA 999 PASS AA=21;AB=0.57143;ABA=21;ABP=5.1818;ABR=28;AC=7;AF=0.0101;AF1=0.02061;AN=690;BL=1043;BR=577;BVAR;BaseQRankSum=-3.087;CI95=0.01549,0.02655;DB;DP=14578;DP4=1554,3055,6,17;Dels=0.00;EL=11;EPP=3.1137;ER=10;FQ=999;FR;FS=5.982;HETAR=7;HOMA=0;HOMR=1041;HP=2;HPLen=1;HR=1;HRun=1;HU=A;INDEL;INS;InbreedingCoeff=0.0356;IndelType=INS.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.28765;LRBP=294.09;MQ=80.17;MQ0=0;MQ0Fraction=0.0000;MQM=64.19;MQRankSum=2.137;NF;NR;NS=1048;PP;PV4=0.51,1,1,1;RA=5224;RL=16;RPP=15.522;RR=5;RUN=1;ReadPosRankSum=0.236;SAB=0.38095;SAF=8;SAP=5.5954;SAR=13;SC=TTCATGTACAGAGCTGCTGTG;SRB=0.31183;SRF=1629;SRP=1609.6;SRR=3595;TC;TR=4;TU=AG;VQSLOD=9.5466;dbSNP=129;set=Intersection;sumGLbyD=13.83 +20 48402974 rs57331436 GA G 27741 PASS AA=401;AB=0.5372;ABA=311;ABP=11.089;ABR=361;AC=84;AF=0.1186;AN=708;BL=16591;BR=14776;BVAR;BaseQRankSum=14.621;DB;DEL;DP=30607;DP4=1928,2310,195,225;Dels=0.11;EL=189;EPP=5.8749;ER=212;FQ=999;FR;FS=15.568;HETAR=110;HOMA=30;HOMR=923;HP=4;HPLen=3;HR=1;HRun=3;HU=A;INDEL;InbreedingCoeff=0.1263;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;KGPilot123;LEN=1;LRB=0.057863;LRBP=231.06;MQ=106.68;MQ0=0;MQ0Fraction=0.0000;MQM=63.005;MQRankSum=-2.010;NF;NR;NS=1063;PP;PV4=0.72,1,0.001,1;RA=5258;RL=223;RPP=13.976;RR=178;RUN=1;ReadPosRankSum=1.337;SAB=0.37656;SAF=151;SAP=56.084;SAR=250;SC=TGCCCTCAAAGAGAAAAAGGA;SRB=0.38075;SRF=2002;SRP=652.44;SRR=3256;TC;TR=5;TU=AG;VQSLOD=8.7259;dbSNP=132;set=Intersection;sumGLbyD=15.86 +20 49101936 . C CT 404.46 PASS AC=40;AF=0.03559;AN=1124;BaseQRankSum=0.750;DP=2162;FS=14.291;HRun=2;HaplotypeScore=30.9513;InbreedingCoeff=-0.0082;IndelType=INS.NumRepetitions_2.EventLength_1.RepeatExpansion_T.;MQ=49.78;MQ0=113;MQ0Fraction=0.0523;MQRankSum=-1.289;QD=1.94;ReadPosRankSum=-2.041;SB=-385.48;VQSLOD=4.6365;set=VQSR +20 49731218 . ATTTTATTTTTTATT A,ATTTTATT 8398.93 PASS AF=0.0656,0.0156;AF1=0.0996;BaseQRankSum=13.996;CI95=0.07743,0.1239;DP=6308;DP4=951,1311,23,35;Dels=0.05;FQ=999;FR;FS=12.503;HP=7;HPLen=4;HR=4;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1892;IndelType=MULTIALLELIC_INDEL;MQ=57.61;MQ0Fraction=0.0145;MQRankSum=-5.208;NF;NR;PP;PV4=0.79,1,6.3e-06,0.16;ReadPosRankSum=-2.239;SC=TATTTTATTTATTTTATTTTT;TC;TR=11;TU=ATTT;VQSLOD=4.3191;set=Intersection;sumGLbyD=42.27 +20 49894989 . TA T 172.25 PASS AF=0.0140;BaseQRankSum=7.220;DP=3882;Dels=0.00;FS=17.217;HPLen=2;HRun=1;InbreedingCoeff=0.0531;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;MQ0Fraction=0.0214;MQRankSum=-0.661;ReadPosRankSum=-0.592;VQSLOD=3.0905;set=filterInVQSR-2of5;sumGLbyD=6.60 +20 50010923 rs66516522 C CT,CTGG 35851 PASS ABR=555;AC=310,11;AF=0.26451,0.00939;BVAR;BaseQRankSum=10.662;DB;DP=8188;FR;FS=34.411;HOMA=261;HOMR=399;HP=5;HR=6;HU=C;HaplotypeScore=45.1715;INS;InbreedingCoeff=0.2090;IndelType=MULTIALLELIC_INDEL;MQ=72.80;MQ0=0;MQ0Fraction=0.0000;MQRankSum=9.015;NF;NR;NS=831;PP;QD=9.69;RA=1986;RUN=1;ReadPosRankSum=-24.284;SB=-6038.55;SC=TGTCTGTCCCCCCTCAGCACT;SRB=0.45972;SRF=913;SRP=31.001;SRR=1073;TC;TR=6;TU=C;VQSLOD=6.1824;set=Intersection +20 50228709 rs71192536 TG T 20517 PASS AA=924;AB=0.50203;ABA=735;ABP=3.0633;ABR=741;AC=200;AF=0.16502;AN=1212;BL=35460;BR=34197;BVAR;BaseQRankSum=13.810;DB;DEL;DP=32402;DP4=1760,2065,395,449;Dels=0.16;EL=439;EPP=7.9831;ER=485;FQ=999;FR;FS=0.558;HETAR=242;HOMA=63;HOMR=764;HP=5;HPLen=3;HR=3;HRun=3;HU=G;INDEL;InbreedingCoeff=0.1050;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.018132;LRBP=52.738;MQ=105.83;MQ0=0;MQ0Fraction=0.0000;MQM=75.87;MQRankSum=3.895;NF;NR;NS=1069;PP;PV4=0.7,1.5e-173,1,1;RA=4708;RL=486;RPP=8.4249;RR=438;RUN=1;ReadPosRankSum=1.586;SAB=0.43615;SAF=403;SAP=35.733;SAR=521;SC=GTTTTCCAGGTGGGAAGACCG;SRB=0.44074;SRF=2075;SRP=146.62;SRR=2633;TC;TR=3;TU=G;VQSLOD=10.4820;dbSNP=120;set=Intersection;sumGLbyD=15.35 +20 50236115 . AGG A,ACGGG,AG,AGGG 7429.57 PASS AC=192,13,221,183;AF=0.2115,0.0143,0.2434,0.2015;AN=908;BaseQRankSum=1.045;DP=1177;FS=13.479;HaplotypeScore=11.8294;InbreedingCoeff=0.7959;IndelType=MULTIALLELIC_INDEL;MQ=52.98;MQ0=6;MQ0Fraction=0.0051;MQRankSum=-1.482;QD=7.28;ReadPosRankSum=-2.380;SB=-1229.31;VQSLOD=8.3762;set=VQSR +20 51589568 . TAAAC AAAAC,T 12477.52 PASS AF=0.27949;BaseQRankSum=-28.122;DP=3777;Dels=0.00;FR;FS=31.799;HP=7;HPLen=4;HR=3;HRun=0;HU=A;InbreedingCoeff=-0.1429;IndelType=MIXED;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.196;NF;NR;PP;ReadPosRankSum=-16.483;SC=AAATTCAAAATAAACAAACAA;TC;TR=18;TU=AAAC;VQSLOD=3.9201;set=filterInVQSR-2of5;sumGLbyD=52.43 +20 51617742 . TGC T,TGCGC 1374.91 PASS AF=0.06000,0.02000;BaseQRankSum=12.051;DP=6231;Dels=0.00;FS=189.609;HPLen=1;HRun=0;InbreedingCoeff=0.0862;IndelType=MULTIALLELIC_INDEL;MQ0Fraction=0.0180;MQRankSum=-2.959;ReadPosRankSum=-5.090;VQSLOD=-2.8715;set=filterInVQSR-2of5;sumGLbyD=3.97 +20 51770354 . AG A 1010.90 PASS AA=26;AB=0.52727;ABA=26;ABP=3.3656;ABR=29;AC=7;AF=0.0097;AF1=0.01637;AN=718;BL=1034;BR=964;BVAR;BaseQRankSum=5.588;CI95=0.01327,0.02212;DEL;DP=16259;DP4=2785,2239,15,10;Dels=0.01;EL=11;EPP=4.3466;ER=15;FQ=999;FR;FS=3.367;HETAR=8;HOMA=0;HOMR=1064;HP=2;HPLen=2;HR=2;HRun=2;HU=G;INDEL;InbreedingCoeff=0.0557;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.035035;LRBP=8.3357;MQ=90.48;MQ0=0;MQ0Fraction=0.0000;MQM=61.346;MQRankSum=-0.019;NF;NR;NS=1072;PP;PV4=0.69,2.1e-08,0.078,1;RA=6173;RL=13;RPP=3.0103;RR=13;RUN=1;ReadPosRankSum=-0.460;SAB=0.61538;SAF=16;SAP=6.017;SAR=10;SC=GTGGTCCTGCAGGTCAATAAT;SRB=0.56342;SRF=3478;SRP=218.68;SRR=2695;TC;TR=2;TU=G;VQSLOD=10.1601;set=Intersection;sumGLbyD=14.60 +20 51848430 . AT A,ATT 999 PASS AA=39;AB=0.83408;ABA=37;ABP=219.19;ABR=186;AC=14,33;AF=0.0153,0.0359;AF1=0.03062;AN=918;BL=1676;BR=1732;BVAR;BaseQRankSum=3.338;CI95=0.02212,0.03982;DP=14886;DP4=1970,1762,22,31;Dels=0.01;EL=18;EPP=3.5114;ER=21;FQ=999;FR;FS=3.004;HETAR=31;HOMA=0;HOMR=1040;HP=10;HPLen=9;HR=9;HRun=9;HU=T;INDEL;INS;InbreedingCoeff=0.1629;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.016432;LRBP=5.0085;MQ=80.05;MQ0=0;MQ0Fraction=0.0000;MQM=56.667;MQRankSum=0.325;NF;NR;NS=1071;PP;PV4=0.13,1,0.0095,0.064;RA=5318;RL=21;RPP=3.5114;RR=18;RUN=1;ReadPosRankSum=-0.493;SAB=0.46154;SAF=18;SAP=3.5114;SAR=21;SC=ACAAAACAATATTTTTTTTTC;SRB=0.4968;SRF=2642;SRP=3.4823;SRR=2676;TC;TR=9;TU=T;VQSLOD=5.7417;set=Intersection;sumGLbyD=7.57 +20 51897203 . T TG 8427.20 PASS AA=237;AB=0.69846;ABA=215;ABP=246.92;ABR=498;AC=117;AF=0.1662;AN=704;BL=14961;BR=5990;BVAR;BaseQRankSum=22.203;DP=9710;Dels=0.00;EL=83;EPP=49.198;ER=154;FR;FS=9.450;HETAR=123;HOMA=9;HOMR=895;HP=5;HPLen=6;HR=6;HRun=0;HU=T;INS;InbreedingCoeff=-0.0513;IndelType=INS.NOVEL_1.Novel_G.;LEN=1;LRB=0.42819;LRBP=8344.3;MQ0Fraction=0.0291;MQM=45.861;MQRankSum=-10.426;NF;NR;NS=1027;PP;RA=4919;RL=210;RPP=309.85;RR=27;RUN=1;ReadPosRankSum=-1.843;SAB=0.29536;SAF=70;SAP=89.219;SAR=167;SC=TTTGTTTGTTTTTTGTTGTTG;SRB=0.47794;SRF=2351;SRP=23.798;SRR=2568;TC;TR=23;TU=GTTT;VQSLOD=6.2670;set=Intersection;sumGLbyD=8.99 +20 52274070 . AAG A 1400.37 PASS AA=30;AB=0.74227;ABA=25;ABP=52.462;ABR=72;AC=21;AF=0.01756;AN=1196;BL=412;BR=1966;BVAR;BaseQRankSum=6.660;DEL;DP=9362;Dels=0.01;EL=16;EPP=3.2998;ER=14;FS=1.485;HETAR=18;HOMA=2;HOMR=1004;HRun=0;InbreedingCoeff=0.0317;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_AG.;LEN=2;LRB=0.65349;LRBP=2208.2;MQ0Fraction=0.0022;MQM=46.133;MQRankSum=-4.743;NS=1024;RA=3931;RL=2;RPP=51.941;RR=28;RUN=1;ReadPosRankSum=-4.152;SAB=0.4;SAF=12;SAP=5.6161;SAR=18;SRB=0.49784;SRF=1957;SRP=3.1699;SRR=1974;VQSLOD=5.6452;set=Intersection;sumGLbyD=11.11 +20 52351501 . TAC T 199.59 PASS AC=22;AF=0.0238;AN=926;BaseQRankSum=7.874;DP=22911;DP4=2146,1691,26,22;FR;FS=2.898;HP=4;HPLen=3;HR=1;HRun=0;HU=A;HaplotypeScore=18.6111;INDEL;InbreedingCoeff=-0.0326;IndelType=DEL.NumRepetitions_6.EventLength_2.RepeatExpansion_AC.;MQ0=2;MQ0Fraction=0.0007;MQRankSum=1.011;NF;NR;PP;PV4=0.88,0.14,0.16,0.24;QD=1.10;ReadPosRankSum=-1.053;SB=-306.09;SC=GACACACAAATACACACACAC;TC;TR=13;TU=AC;VQSLOD=4.0486;set=filterInVQSR-2of5 +20 52447173 . CA C 503.89 PASS AC=23;AF=0.01891;AN=1216;BaseQRankSum=0.801;DP=3266;FS=2.606;HRun=2;HaplotypeScore=22.1543;InbreedingCoeff=-0.0097;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_A.;MQ=118.02;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.309;QD=2.65;ReadPosRankSum=-7.872;SB=-279.27;VQSLOD=4.1900;set=VQSR +20 52498650 . GT G 24069 PASS AA=74;AB=0.90594;ABA=57;ABP=870.4;ABR=549;AC=28;AF=0.02333;AN=1200;BL=505;BR=4514;BVAR;BaseQRankSum=-3.837;DEL;DP=9798;Dels=0.01;EL=41;EPP=4.8883;ER=33;FS=4.085;HETAR=209;HOMA=663;HOMR=121;HRun=1;InbreedingCoeff=0.0334;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.79876;LRBP=6956.6;MQ0=2;MQ0Fraction=0.0007;MQM=57.784;MQRankSum=-2.951;NS=995;RA=957;RL=8;RPP=101.72;RR=66;RUN=1;ReadPosRankSum=-14.806;SAB=0.39189;SAF=29;SAP=10.522;SAR=45;SRB=0.39916;SRF=382;SRP=87.53;SRR=575;VQSLOD=3.8710;set=filterInVQSR-2of5;sumGLbyD=2.90 +20 52823602 rs11469056 CAAA C,CA,CAA,CAAAA,CAAAAA,CAAAAAA,CAAAAAAA,CAAAAAAAA,CAAAAAAAAA,CAAAAAAAAAA 14515.17 PASS AC=24,83,246,109,83,19,10,16,22,59;AF=0.02128,0.07358,0.21809,0.09663,0.07358,0.01684,0.00887,0.01418,0.01950,0.05230;AN=1128;BVAR;BaseQRankSum=4.150;DB;DEL;DP=28279;FR;FS=2.021;HP=17;HR=17;HU=A;HaplotypeScore=27.8032;INS;InbreedingCoeff=0.7740;IndelType=MULTIALLELIC_INDEL;MQ=69.00;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.418;NF;NR;PP;QD=7.90;RUN=1;ReadPosRankSum=-3.864;SB=-3244.40;SC=GGTCCTAAGGCAAAAAAAAAA;TC;TR=17;TU=A;VQSLOD=14.1033;set=Intersection +20 53308906 . CT C,CTT 2276 PASS AA=92;AB=0.84453;ABA=81;ABP=540.17;ABR=440;AC=53,81;AF=0.04351,0.06650;AN=1218;BL=3561;BR=4796;BVAR;BaseQRankSum=3.000;DP=11804;Dels=0.02;EL=48;EPP=3.3879;ER=44;FR;FS=13.197;HETAR=69;HOMA=3;HOMR=993;HP=11;HR=10;HRun=10;HU=T;INS;InbreedingCoeff=0.2297;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.14778;LRBP=399.32;MQ0=1;MQ0Fraction=0.0003;MQM=56.348;MQRankSum=3.154;NF;NR;NS=1065;PP;RA=5520;RL=39;RPP=7.6365;RR=53;RUN=1;ReadPosRankSum=-2.140;SAB=0.57609;SAF=53;SAP=7.6365;SAR=39;SC=AATCCAAAGTCTTTTTTTTTT;SRB=0.51576;SRF=2847;SRP=14.92;SRR=2673;TC;TR=10;TU=T;VQSLOD=2.4753;set=filterInVQSR-2of5;sumGLbyD=4.42 +20 53334602 . T TG,TGG 905.13 PASS ABR=325;AC=44,22;AF=0.03624,0.01812;BVAR;BaseQRankSum=-4.608;DP=15015;FR;FS=494.901;HOMA=0;HOMR=1004;HP=1;HR=1;HU=G;HaplotypeScore=20.5023;INS;InbreedingCoeff=0.0799;IndelType=MULTIALLELIC_INDEL;MQ=116.70;MQ0=0;MQ0Fraction=0.0000;MQRankSum=8.022;NF;NR;NS=1064;PP;QD=0.35;RA=5690;RUN=1;ReadPosRankSum=-14.522;SB=-311.57;SC=AGCCATTGGCTGTTTCACTGA;SRB=0.40738;SRF=2318;SRP=426.97;SRR=3372;TC;TR=1;TU=G;VQSLOD=-2.3042;set=filterInVQSR-2of5 +20 53729115 . T TG 15.48 PASS AC=1;AF=0.0015;AN=668;BaseQRankSum=-1.001;DP=1711;FS=9.048;HRun=2;HaplotypeScore=12.4681;InbreedingCoeff=-0.0320;IndelType=INS.NumRepetitions_2.EventLength_1.RepeatExpansion_G.;MQ=131.36;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.193;QD=4.57;ReadPosRankSum=0.407;SB=-5.35;VQSLOD=4.8071;set=VQSR +20 54033830 . GTATTTTAAAATCA G 2220.86 PASS AF=0.0113;BaseQRankSum=5.506;DP=2577;Dels=0.01;FR;FS=6.533;HP=5;HPLen=4;HR=1;HRun=0;HU=T;InbreedingCoeff=0.0032;IndelType=DEL.NumRepetitions_1.EventLength_10orMore.;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.969;NF;NR;PP;ReadPosRankSum=1.322;SC=TCAATATTTTGTATTTTAAAA;TC;TR=1;TU=T;VQSLOD=5.5145;set=Intersection;sumGLbyD=95.65 +20 54375236 . GT G 626.13 PASS AA=40;AB=0.63551;ABA=39;ABP=20.078;ABR=68;AC=18;AF=0.0256;AN=702;BL=1331;BR=1743;BVAR;BaseQRankSum=9.346;DEL;DP=8568;Dels=0.02;EL=26;EPP=10.828;ER=14;FS=0.610;HETAR=21;HOMA=1;HOMR=1035;HRun=1;InbreedingCoeff=-0.0056;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.13403;LRBP=122.92;MQ0=0;MQ0Fraction=0.0000;MQM=67.125;MQRankSum=-2.537;NS=1058;RA=4870;RL=17;RPP=4.9646;RR=23;RUN=1;ReadPosRankSum=-1.229;SAB=0.525;SAF=21;SAP=3.2274;SAR=19;SRB=0.5271;SRF=2567;SRP=34.087;SRR=2303;VQSLOD=7.9228;set=Intersection;sumGLbyD=10.77 +20 54457331 . G GA 1793.40 PASS AA=77;AB=0.66667;ABA=74;ABP=56.573;ABR=148;AC=33;AF=0.02687;AN=1228;BL=3834;BR=1154;BVAR;BaseQRankSum=10.572;DP=10230;Dels=0.00;EL=77;EPP=170.21;ER=0;FS=139.433;HETAR=44;HOMA=1;HOMR=1001;HRun=1;INS;InbreedingCoeff=0.0023;IndelType=INS.NOVEL_1.Novel_A.;LEN=1;LRB=0.53729;LRBP=3129.8;MQ0Fraction=0.0095;MQM=4.7013;MQRankSum=-8.116;NS=1046;RA=4009;RL=77;RPP=170.21;RR=0;RUN=1;ReadPosRankSum=-6.026;SAB=1;SAF=77;SAP=170.21;SAR=0;SRB=0.57022;SRF=2286;SRP=174.7;SRR=1723;VQSLOD=1.1887;set=filterInVQSR-2of5;sumGLbyD=5.90 +20 54469810 . CA C 1697.62 PASS AA=93;AB=0.63855;ABA=90;ABP=44.53;ABR=159;AC=34;AF=0.0374;AF1=0.01719;AN=908;BL=3242;BR=5839;BVAR;BaseQRankSum=10.425;CI95=0.009317,0.02795;DEL;DP=15197;DP4=2134,1896,56,46;Dels=0.03;EL=34;EPP=17.604;ER=59;FQ=16;FR;FS=9.985;HETAR=41;HOMA=1;HOMR=1011;HP=9;HPLen=8;HR=8;HRun=8;HU=A;INDEL;InbreedingCoeff=-0.0472;IndelType=DEL.NumRepetitions_8.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.28598;LRBP=1615.8;MQ=83.37;MQ0=1;MQ0Fraction=0.0004;MQM=64.075;MQRankSum=3.036;NF;NR;NS=1053;PP;PV4=0.76,1,0.31,0.22;RA=5150;RL=28;RPP=34.975;RR=65;RUN=1;ReadPosRankSum=-0.252;SAB=0.5914;SAF=55;SAP=9.7582;SAR=38;SC=ATTGCTAAGACAAAAAAAAGA;SRB=0.50621;SRF=2607;SRP=4.7374;SRR=2543;TC;TR=8;TU=A;VQSLOD=8.3677;set=Intersection;sumGLbyD=9.90 +20 54542453 . GTATA G,GTA 5109.66 PASS ABR=112;AC=66,56;AF=0.0682,0.0579;AN=968;BVAR;BaseQRankSum=17.089;DB;DEL;DP=5519;DS;Dels=0.06;FS=99.502;HOMA=15;HOMR=409;HRun=0;InbreedingCoeff=0.1584;IndelType=MULTIALLELIC_INDEL;MQ0Fraction=0.0178;MQRankSum=-6.854;NS=460;RA=864;RUN=1;ReadPosRankSum=0.855;SRB=0.79282;SRF=685;SRP=646.5;SRR=179;VQSLOD=0.6375;set=filterInVQSR-2of5;sumGLbyD=8.53 +20 54629773 . CA C 1799.50 PASS AA=49;AB=0.82707;ABA=46;ABP=250.17;ABR=220;AC=9;AF=0.00746;AN=1206;BL=173;BR=2277;BVAR;BaseQRankSum=5.240;DEL;DP=8557;Dels=0.01;EL=49;EPP=109.41;ER=0;FS=32.359;HETAR=35;HOMA=1;HOMR=325;HRun=1;InbreedingCoeff=0.0892;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.85878;LRBP=3926.6;MQ0Fraction=0.0602;MQM=32.163;MQRankSum=-3.926;NS=361;RA=1091;RL=0;RPP=109.41;RR=49;RUN=1;ReadPosRankSum=-4.512;SAB=0;SAF=0;SAP=109.41;SAR=49;SRB=0.49404;SRF=539;SRP=3.3467;SRR=552;VQSLOD=1.1233;set=filterInVQSR-2of5;sumGLbyD=3.54 +20 54710245 . TA T 999 PASS AF=0.0084;AF1=0.0148;BaseQRankSum=3.954;CI95=0.00885,0.02212;DP=8043;DP4=2000,1849,10,7;Dels=0.01;FQ=999;FR;FS=0.000;HP=9;HPLen=6;HR=3;HRun=6;HU=A;INDEL;InbreedingCoeff=0.1181;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_A.;MQ=78.51;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.095;NF;NR;PP;PV4=0.63,0.00056,1,1;ReadPosRankSum=-0.448;SC=CAACAAAAAATAAATAAATAA;TC;TR=15;TU=AAAT;VQSLOD=7.8129;set=Intersection;sumGLbyD=19.02 +20 54968173 . A AAT,AATAT,AT,ATAT 89535.82 PASS ABR=994;AC=561,278,2,3;AF=0.50179,0.24866,0.00179,0.00268;AN=1118;BVAR;BaseQRankSum=-2.699;DB;DP=27837;DP4=168,177,1045,866;Dels=0.00;FQ=999;FR;FS=12.472;HOMA=71;HOMR=455;HP=3;HPLen=4;HR=4;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.6391;IndelType=MULTIALLELIC_INDEL;KGPilot123;MQ=80.36;MQ0Fraction=0.0055;MQRankSum=-1.512;NF;NR;NS=913;PP;PV4=0.046,1,1,1;RA=2015;RUN=1;ReadPosRankSum=1.015;SC=GGCCACTTAAAATATATATAT;SRB=0.44864;SRF=904;SRP=49.187;SRR=1111;TC;TR=15;TU=AT;VQSLOD=9.0092;dbSNP=132;set=Intersection;sumGLbyD=42.33 +20 55176688 . TA T 421.84 PASS AF=0.01322;AF1=0.01845;BaseQRankSum=5.383;CI95=0.01282,0.02564;DP=10531;DP4=1975,2017,16,14;Dels=0.01;FQ=91.2;FR;FS=7.401;HP=6;HPLen=5;HR=5;HRun=5;HU=A;INDEL;InbreedingCoeff=0.0829;IndelType=DEL.NumRepetitions_5.EventLength_1.RepeatExpansion_A.;MQ=75.80;MQ0=1;MQ0Fraction=0.0003;MQRankSum=-0.471;NF;NR;PP;PV4=0.72,1,1,1;ReadPosRankSum=0.223;SC=CTGCAAAATATAAAAATTAGG;TC;TR=5;TU=A;VQSLOD=6.6000;set=Intersection;sumGLbyD=12.15 +20 55664086 . GTT ATT,G,GT,GTTT 5622.44 PASS AC=6,71,136;AF=0.00498,0.05887,0.11277;AN=1206;BVAR;BaseQRankSum=3.173;DB;DEL;DP=40384;DP4=1567,1317,54,29;Dels=0.05;FR;FS=1.949;HP=14;HR=11;HRun=11;HU=T;INDEL;INS;InbreedingCoeff=0.3490;IndelType=MIXED;MQ=77.90;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.052;NF;NR;PP;PV4=0.057,1,0.2,1.2e-05;RUN=1;ReadPosRankSum=-13.646;SC=AATTTTATTTGTTTTTTTTTT;TC;TR=11;TU=T;VQSLOD=11.7964;set=Intersection;sumGLbyD=8.09 +20 56045006 . TG T 342.15 PASS AC=72;AF=0.0940;AN=766;BaseQRankSum=4.992;DP=1238;FS=1.460;HRun=7;HaplotypeScore=20.2784;InbreedingCoeff=0.1795;IndelType=DEL.NumRepetitions_7.EventLength_1.RepeatExpansion_G.;MQ=66.42;MQ0=1;MQ0Fraction=0.0008;MQRankSum=-0.937;QD=1.84;ReadPosRankSum=-4.385;SB=-320.83;VQSLOD=5.2383;set=VQSR +20 56158711 . AG A 922.47 PASS AA=18;AB=0.575;ABA=17;ABP=4.9646;ABR=23;AC=2;AF=0.0028;AN=714;BL=953;BR=808;BVAR;BaseQRankSum=3.129;DEL;DP=10462;Dels=0.01;EL=9;EPP=3.0103;ER=9;FR;FS=8.724;HETAR=4;HOMA=0;HOMR=1058;HP=1;HPLen=2;HR=2;HRun=1;HU=A;InbreedingCoeff=0.0262;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.08234;LRBP=28.936;MQ0=0;MQ0Fraction=0.0000;MQM=55.889;MQRankSum=2.052;NF;NR;NS=1062;PP;RA=6300;RL=9;RPP=3.0103;RR=9;RUN=1;ReadPosRankSum=-0.317;SAB=0.66667;SAF=12;SAP=7.3532;SAR=6;SC=TGGCCTAGCAAGCATCGTGAC;SRB=0.48143;SRF=3033;SRP=21.883;SRR=3267;TC;TR=8;TU=AAGC;VQSLOD=8.3252;set=Intersection;sumGLbyD=13.22 +20 56258618 rs113670927 T C,TGC,TGTGC,TGTGTGC 37834.99 PASS ABR=441;AC=11,100,43;AF=0.0123,0.1119,0.0481;AN=894;BVAR;BaseQRankSum=19.514;DB;DP=23173;DP4=541,920,413,579;Dels=0.00;FQ=999;FR;FS=1.238;HOMA=28;HOMR=808;HP=2;HPLen=1;HR=1;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.2154;IndelType=MIXED;MQ=57.25;MQ0Fraction=0.0275;MQRankSum=-6.684;NF;NR;NS=976;PP;PV4=0.023,1,1,1;RA=3294;RUN=1;ReadPosRankSum=11.873;SC=TGCGTGTGTGTGTGTGTGTGT;SRB=0.42441;SRF=1398;SRP=166.5;SRR=1896;TC;TR=30;TU=GT;VQSLOD=6.7457;dbSNP=114;set=Intersection;sumGLbyD=21.27 +20 56395857 . T TAGGCAG 6614.22 PASS AA=30;AB=0.63415;ABA=30;ABP=15.827;ABR=52;AC=14;AF=0.0197;AF1=0.03154;AN=710;BL=991;BR=1813;BVAR;BaseQRankSum=-4.589;CI95=0.02434,0.04204;DP=13879;DP4=1543,1833,12,14;Dels=0.00;EL=14;EPP=3.2998;ER=16;FQ=999;FR;FS=1.482;HETAR=11;HOMA=0;HOMR=1051;HP=1;HPLen=2;HR=2;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0774;IndelType=INS.NumRepetitions_2.EventLength_6.;LEN=6;LRB=0.29315;LRBP=526.27;MQ=90.42;MQ0=0;MQ0Fraction=0.0000;MQM=39.433;MQRankSum=-7.011;NF;NR;NS=1062;PP;PV4=1,1,3.7e-09,1;RA=5322;RL=9;RPP=13.433;RR=21;RUN=1;ReadPosRankSum=0.679;SAB=0.43333;SAF=13;SAP=4.1684;SAR=17;SC=AAGAGCATCTTAGGCAGAGGC;SRB=0.47294;SRF=2517;SRP=36.853;SRR=2805;TC;TR=2;TU=T;VQSLOD=8.3045;set=Intersection;sumGLbyD=68.22 +20 56969289 . GTTTGT G 600.69 PASS AF=0.0056;AF1=0.007726;BaseQRankSum=2.907;CI95=0.004425,0.01327;DP=9643;DP4=1892,1749,6,3;Dels=0.00;FQ=117;FR;FS=16.601;HP=5;HPLen=3;HR=3;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0236;IndelType=DEL.NumRepetitions_3.EventLength_5.;MQ=92.59;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.134;NF;NR;PP;PV4=0.51,1,0.07,0.3;ReadPosRankSum=0.236;SC=TAAGGACGTTGTTTGTTTTGT;TC;TR=10;TU=GTTT;VQSLOD=5.8458;set=Intersection;sumGLbyD=39.51 +20 57187557 . AG A,AGG 1486.69 PASS AA=130;AB=0.55446;ABA=90;ABP=8.2132;ABR=112;AC=56,26;AF=0.0574,0.0266;AN=976;BL=3817;BR=5968;BVAR;BaseQRankSum=5.517;DEL;DP=14174;DP4=925,721,59,48;Dels=0.05;EL=52;EPP=14.302;ER=78;FR;FS=0.917;HETAR=44;HOMA=17;HOMR=864;HP=4;HPLen=4;HR=4;HRun=4;HU=G;INDEL;InbreedingCoeff=0.2856;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.21983;LRBP=1029.8;MQ=91.56;MQ0=0;MQ0Fraction=0.0000;MQM=63.631;MQRankSum=1.900;NF;NR;NS=925;PP;PV4=0.84,1,1,0.39;RA=2746;RL=44;RPP=32.476;RR=86;RUN=1;ReadPosRankSum=-0.639;SAB=0.44615;SAF=58;SAP=6.2842;SAR=72;SC=TCAGGCCCGCAGGGGTCAGGG;SRB=0.5772;SRF=1585;SRP=145.17;SRR=1161;TC;TR=4;TU=G;VQSLOD=7.7167;set=Intersection;sumGLbyD=14.85 +20 57282771 . T TG 506.43 PASS AA=34;AB=0.70312;ABA=19;ABP=25.946;ABR=45;AC=34;AF=0.0373;AN=912;BL=886;BR=1938;BVAR;BaseQRankSum=3.744;DP=4276;Dels=0.00;EL=18;EPP=3.2658;ER=16;FR;FS=0.639;HETAR=17;HOMA=9;HOMR=737;HP=9;HR=8;HRun=8;HU=G;INS;InbreedingCoeff=0.2149;IndelType=INS.NumRepetitions_8.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.37252;LRBP=853.99;MQ0=0;MQ0Fraction=0.0000;MQM=49.706;MQRankSum=-0.051;NF;NR;NS=763;PP;RA=1822;RL=9;RPP=19.36;RR=25;RUN=1;ReadPosRankSum=-2.111;SAB=0.55882;SAF=19;SAP=4.0322;SAR=15;SC=TCGGGGGGCGTGGGGGGGGTG;SRB=0.51098;SRF=931;SRP=4.9172;SRR=891;TC;TR=8;TU=G;VQSLOD=5.7772;set=Intersection;sumGLbyD=7.95 +20 57419740 rs11481507 A AT 82613.57 PASS AA=3850;AB=0.41404;ABA=1786;ABP=198.63;ABR=1262;AC=919;AF=0.75328;AN=1220;BL=140665;BR=151383;BVAR;BaseQRankSum=-27.490;DB;DP=31794;DP4=588,585,1571,1721;Dels=0.00;EL=1924;EPP=3.0126;ER=1926;FQ=999;FR;FS=2.191;HETAR=482;HOMA=454;HOMR=135;HP=3;HPLen=3;HR=3;HRun=3;HU=T;INDEL;INS;InbreedingCoeff=0.0861;IndelType=INS.NumRepetitions_3.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.036699;LRBP=857.15;MQ=123.92;MQ0=0;MQ0Fraction=0.0000;MQM=91.654;MQRankSum=3.016;NF;NR;NS=1071;PP;PV4=0.16,1,0.12,1;RA=1850;RL=1874;RPP=8.8784;RR=1976;RUN=1;ReadPosRankSum=-0.685;SAB=0.47636;SAF=1834;SAP=21.693;SAR=2016;SC=TACACTAGTGATTTAACCCTA;SRB=0.49027;SRF=907;SRP=4.5315;SRR=943;TC;TR=3;TU=T;VQSLOD=9.2768;dbSNP=126;set=Intersection;sumGLbyD=22.78 +20 57558194 . CT C,CTT,CTTT 6470.30 PASS ABR=451;AC=104,161,177;AF=0.08919,0.13808,0.15180;BVAR;BaseQRankSum=1.172;DP=7985;FR;FS=2.202;HOMA=19;HOMR=778;HP=22;HR=15;HU=T;HaplotypeScore=16.1921;INS;InbreedingCoeff=0.6440;IndelType=MULTIALLELIC_INDEL;MQ=69.24;MQ0=27;MQ0Fraction=0.0109;MQRankSum=-0.003;NF;NR;NS=943;PP;QD=2.22;RA=2531;RUN=1;ReadPosRankSum=-0.104;SB=-2096.85;SC=GCCTTTTTTTCTTTTTTTTTT;SRB=0.34848;SRF=882;SRP=507.73;SRR=1649;TC;TR=15;TU=T;VQSLOD=6.5151;set=Intersection +20 57693627 . AG A 1991.90 PASS AA=52;AB=0.49462;ABA=47;ABP=3.0336;ABR=46;AC=15;AF=0.01227;AN=1222;BL=1902;BR=1478;BVAR;BaseQRankSum=-6.121;DEL;DP=26459;DP4=2647,2873,16,20;Dels=0.01;EL=25;EPP=3.1773;ER=27;FR;FS=3.135;HETAR=15;HOMA=1;HOMR=1064;HP=2;HPLen=3;HR=3;HRun=2;HU=A;INDEL;InbreedingCoeff=0.0866;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.12544;LRBP=118.51;MQ=116.26;MQ0=0;MQ0Fraction=0.0000;MQM=114.65;MQRankSum=1.942;NF;NR;NS=1080;PP;PV4=0.74,6.9e-08,1,0.38;RA=6781;RL=33;RPP=11.195;RR=19;RUN=1;ReadPosRankSum=-1.795;SAB=0.5;SAF=26;SAP=3.0103;SAR=26;SC=ATTGGAGGAAAGGCTTTTTCA;SRB=0.46247;SRF=3136;SRP=85.976;SRR=3645;TC;TR=3;TU=A;VQSLOD=8.6672;set=Intersection;sumGLbyD=13.55 +20 57716287 . A AT 66.47 PASS AC=6;AF=0.00506;AN=1186;BaseQRankSum=1.369;DP=2744;FS=3.834;HRun=8;HaplotypeScore=11.2046;InbreedingCoeff=0.1196;IndelType=INS.NumRepetitions_8.EventLength_1.RepeatExpansion_T.;MQ=73.00;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-0.086;QD=2.14;ReadPosRankSum=-2.588;SB=-53.80;VQSLOD=4.2080;set=VQSR +20 58121928 rs73625057 T TGG 6649.17 PASS AA=132;AB=0.57854;ABA=110;ABP=16.996;ABR=151;AC=57;AF=0.0617;AN=924;BL=4530;BR=4790;BVAR;BaseQRankSum=-13.456;DB;DP=30353;DP4=2107,2168,61,66;Dels=0.00;EL=67;EPP=3.0761;ER=65;FR;FS=0.708;HETAR=46;HOMA=8;HOMR=1023;HP=3;HPLen=2;HR=2;HRun=2;HU=G;INDEL;INS;InbreedingCoeff=0.1241;IndelType=INS.NumRepetitions_2.EventLength_1.RepeatExpansion_G.;LEN=2;LRB=0.027897;LRBP=18.76;MQ=109.61;MQ0=1;MQ0Fraction=0.0004;MQM=79.833;MQRankSum=-0.699;NF;NR;NS=1077;PP;PV4=0.79,1,0.49,0.036;RA=5754;RL=61;RPP=4.6554;RR=71;RUN=1;ReadPosRankSum=-3.309;SAB=0.45455;SAF=60;SAP=5.3792;SAR=72;SC=GATTAGAATGTGGATATCTTT;SRB=0.48836;SRF=2810;SRP=9.7866;SRR=2944;TC;TR=4;TU=GT;VQSLOD=8.5770;set=Intersection;sumGLbyD=27.19 +20 58468826 . ACAAG A 999 PASS AF=0.0014;AF1=0.003429;BaseQRankSum=4.082;CI95=0.003106,0.006211;DP=8461;DP4=2500,1817,8,2;Dels=0.01;FQ=999;FR;FS=5.034;HP=2;HPLen=1;HR=1;HRun=0;HU=C;INDEL;InbreedingCoeff=-0.0183;IndelType=DEL.NumRepetitions_1.EventLength_4.;MQ=120.69;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.141;NF;NR;PP;PV4=0.21,1,0.054,1;ReadPosRankSum=2.096;SC=ATCCTGAAACACAAGAAGAAA;TC;TR=5;TU=AC;VQSLOD=7.4928;set=Intersection;sumGLbyD=29.17 +20 58731262 . TC T 999 PASS AA=21;AB=0.48649;ABA=19;ABP=3.069;ABR=18;AC=7;AF=0.0101;AF1=0.01493;AN=694;BL=939;BR=848;BVAR;BaseQRankSum=4.205;CI95=0.01106,0.02212;DEL;DP=12598;DP4=1766,1428,11,15;Dels=0.01;EL=13;EPP=5.5954;ER=8;FQ=999;FR;FS=1.796;HETAR=8;HOMA=1;HOMR=1031;HP=7;HPLen=8;HR=8;HRun=2;HU=T;INDEL;InbreedingCoeff=-0.0030;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.050923;LRBP=13.073;MQ=124.57;MQ0=0;MQ0Fraction=0.0000;MQM=67.905;MQRankSum=1.103;NF;NR;NS=1040;PP;PV4=0.23,1,1,1;RA=4884;RL=10;RPP=3.1137;RR=11;RUN=1;ReadPosRankSum=-0.091;SAB=0.47619;SAF=10;SAP=3.1137;SAR=11;SC=TCATTTTTTTTCCTTGAAACT;SRB=0.58006;SRF=2833;SRP=274.9;SRR=2051;TC;TR=8;TU=T;VQSLOD=10.8783;set=Intersection;sumGLbyD=15.11 +20 59181229 rs11476579 CTT C,CT,CTTT,CTTTT 7787.17 PASS AC=19,195,104,91;AF=0.01599,0.16414,0.08754,0.07660;AF1=0.2124;AN=1188;BVAR;BaseQRankSum=6.347;CI95=0.146,0.2743;DB;DEL;DP=26140;DP4=932,880,352,375;Dels=0.13;FQ=85.6;FR;FS=11.914;HP=14;HR=14;HRun=14;HU=T;INDEL;INS;InbreedingCoeff=0.4183;IndelType=MULTIALLELIC_INDEL;MQ=86.88;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.469;NF;NR;PP;PV4=0.17,1,1,1;RUN=1;ReadPosRankSum=-1.055;SC=GGTGAGAAAGCTTTTTTTTTT;TC;TR=14;TU=T;VQSLOD=7.4340;dbSNP=120;set=Intersection;sumGLbyD=7.02 +20 59213979 rs112141381 G GC 9068 PASS AA=131;AB=0.47115;ABA=110;ABP=4.5136;ABR=98;AF=0.0586;AN=700;BL=5395;BR=5816;BVAR;BaseQRankSum=15.453;DB;DP=23381;DP4=2191,2184,71,49;Dels=0.00;EL=66;EPP=3.0269;ER=65;FR;FS=7.907;HETAR=35;HOMA=5;HOMR=1019;HP=2;HPLen=3;HR=3;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.0283;IndelType=INS.NOVEL_1.Novel_C.;LEN=1;LRB=0.037552;LRBP=37.34;MQ=72.13;MQ0=0;MQ0Fraction=0.0000;MQM=54.496;MQRankSum=0.897;NF;NR;NS=1059;PP;PV4=0.052,1,0.066,1;RA=4976;RL=59;RPP=5.8117;RR=72;RUN=1;ReadPosRankSum=-0.811;SAB=0.58015;SAF=76;SAP=10.32;SAR=55;SC=GATGGACTGGGACAGTGACTC;SRB=0.49457;SRF=2461;SRP=4.2828;SRR=2515;TC;TR=3;TU=G;VQSLOD=9.3917;set=Intersection;sumGLbyD=28.58 +20 59252945 . CT C,CTT 557.18 PASS AA=24;AB=0.84868;ABA=23;ABP=163.53;ABR=129;AC=21,29;AF=0.01759,0.02429;BL=1217;BR=1336;BVAR;BaseQRankSum=5.135;DP=9970;Dels=0.01;EL=13;EPP=3.3722;ER=11;FS=2.302;HETAR=21;HOMA=1;HOMR=1012;HRun=9;INS;InbreedingCoeff=0.1549;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.046612;LRBP=15.055;MQ0=0;MQ0Fraction=0.0000;MQM=67.208;MQRankSum=0.086;NS=1034;RA=4421;RL=11;RPP=3.3722;RR=13;RUN=1;ReadPosRankSum=-1.826;SAB=0.41667;SAF=10;SAP=4.4579;SAR=14;SRB=0.49649;SRF=2195;SRP=3.4823;SRR=2226;VQSLOD=2.8923;set=filterInVQSR-2of5;sumGLbyD=5.47 +20 60016966 . CT C 42650 PASS AA=37;AB=0.97834;ABA=31;ABP=2847;ABR=1400;AC=15;AF=0.0163;AN=920;BL=2596;BR=778;BVAR;BaseQRankSum=-0.632;DEL;DP=10967;Dels=0.00;EL=14;EPP=7.7641;ER=23;FS=4.094;HETAR=421;HOMA=256;HOMR=385;HRun=1;InbreedingCoeff=-0.0051;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.53883;LRBP=2130.2;MQ0=0;MQ0Fraction=0.0000;MQM=120.3;MQRankSum=-0.911;NS=1072;RA=3413;RL=31;RPP=39.691;RR=6;RUN=1;ReadPosRankSum=-12.062;SAB=0.48649;SAF=18;SAP=3.069;SAR=19;SRB=0.47407;SRF=1618;SRP=22.943;SRR=1795;VQSLOD=3.3758;set=filterInVQSR-2of5;sumGLbyD=3.27 +20 60188651 . AG A 17624.52 PASS AA=462;AB=0.76548;ABA=409;ABP=1070.7;ABR=1335;AC=403;AF=0.34444;AN=1170;BL=13877;BR=25909;BVAR;BaseQRankSum=6.180;DEL;DP=9900;Dels=0.08;EL=353;EPP=282.84;ER=109;FR;FS=2699.057;HETAR=346;HOMA=26;HOMR=633;HP=3;HR=4;HRun=1;HU=A;InbreedingCoeff=-0.2900;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.30242;LRBP=7904.3;MQ0Fraction=0.0004;MQM=56.119;MQRankSum=1.644;NF;NR;NS=1005;PP;RA=3521;RL=112;RPP=269.25;RR=350;RUN=1;ReadPosRankSum=2.490;SAB=0.0064935;SAF=3;SAP=980.34;SAR=459;SC=AGGCTTCAAAAGAAAAAAAAA;SRB=0.55978;SRF=1971;SRP=112.32;SRR=1550;TC;TR=4;TU=A;VQSLOD=-34.0667;set=filterInVQSR-2of5;sumGLbyD=7.81 +20 60195570 . GTACATACATACA ATACATACATACA,G,GTACATACA 20140 PASS ABR=102;AC=105,2;AF=0.08794,0.00168;AN=1194;BVAR;BaseQRankSum=-28.899;DB;DEL;DP=14347;Dels=0.02;FR;FS=52.125;HOMA=1;HOMR=1006;HP=1;HPLen=1;HR=1;HRun=0;HU=T;InbreedingCoeff=0.0695;IndelType=MIXED;MQ0Fraction=0.0007;MQRankSum=1.957;NF;NR;NS=1035;PP;RA=4759;RUN=1;ReadPosRankSum=-22.252;SAB=0.5;SAP=3.0103;SC=TGATAGATTCGTACATACATA;SRB=0.47615;SRF=2266;SRP=26.522;SRR=2493;TC;TR=21;TU=ACAT;VQSLOD=2.7673;set=filterInVQSR-2of5;sumGLbyD=19.14 +20 60670601 rs72127450 AT A,ATT 6401.59 PASS AC=177,79;AF=0.16239,0.07248;AF1=0.1602;AN=1090;BVAR;BaseQRankSum=8.618;CI95=0.1106,0.2058;DB;DEL;DP=17508;DP4=1285,1094,313,259;Dels=0.10;FQ=94.1;FR;FS=0.000;HP=12;HR=12;HRun=12;HU=T;INDEL;INS;InbreedingCoeff=0.1076;IndelType=MULTIALLELIC_INDEL;LEN=1;MQ=64.73;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.620;NF;NR;PP;PV4=0.78,1,0.012,1;RUN=1;ReadPosRankSum=-1.294;SC=AGCCAGGCACATTTTTTTTTT;TC;TR=12;TU=T;VQSLOD=6.1650;dbSNP=130;set=Intersection;sumGLbyD=5.80 +20 60685780 . TC T 1123.58 PASS AC=79;AF=0.07655;AN=1032;BaseQRankSum=14.949;DP=2084;FS=23.521;HRun=1;HaplotypeScore=19.7117;InbreedingCoeff=0.1356;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=53.57;MQ0=61;MQ0Fraction=0.0293;MQRankSum=-7.958;QD=4.35;ReadPosRankSum=-13.757;SB=-791.28;VQSLOD=6.3549;set=VQSR +20 60744906 rs113528167 CG C 422.53 PASS AC=48;AF=0.0732;AN=656;BaseQRankSum=17.669;DB;DP=1189;FS=0.356;HRun=1;HaplotypeScore=15.1808;InbreedingCoeff=0.2111;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;MQ=82.83;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-10.455;QD=2.71;ReadPosRankSum=-16.887;SB=-326.46;VQSLOD=7.1707;set=VQSR +20 60848742 . CGT C,CGTGT 999 PASS AF=0.00980,0.01225;BaseQRankSum=5.597;DP=17065;DP4=1928,2188,17,13;Dels=0.01;FR;HP=1;HPLen=2;HR=2;HRun=0;HU=C;INDEL;InbreedingCoeff=0.2094;IndelType=MULTIALLELIC_INDEL;MQ=115.78;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.281;NF;NR;PP;PV4=0.36,0.4,0.12,0.12;ReadPosRankSum=-1.465;SB=-157.35;SC=TAGACGCTTCCGTGTGTGTGT;TC;TR=11;TU=GT;VQSLOD=1.7100;set=filterInVQSR-2of5;sumGLbyD=16.39 +20 61023668 rs57452309 G GAGC 6896.67 PASS AC=115;AF=0.1445;AN=796;BaseQRankSum=12.146;DB;DP=1423;FS=5.070;HRun=0;HaplotypeScore=29.8897;InbreedingCoeff=0.0740;IndelType=INS.NOVEL_3.;MQ=77.02;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-9.005;QD=19.16;ReadPosRankSum=-17.440;SB=-3045.82;VQSLOD=4.5788;set=VQSR +20 61180519 . C CA,CT 1774.30 PASS ABR=135;AC=27,15;AF=0.02538,0.01410;BVAR;BaseQRankSum=-2.189;DP=8393;FR;FS=27.692;HOMA=2;HOMR=825;HP=6;HPLen=3;HR=3;HU=T;HaplotypeScore=19.5313;INS;InbreedingCoeff=0.0868;IndelType=MULTIALLELIC_INDEL;LEN=1;MQ=56.11;MQ0=172;MQ0Fraction=0.0667;MQRankSum=2.605;NF;NR;NS=854;PP;QD=1.99;RA=2868;RUN=1;ReadPosRankSum=-7.324;SB=-385.54;SC=TTCTTTCTTTCTTTCTTTCTT;SRB=0.32741;SRF=939;SRP=745.08;SRR=1929;TC;TR=69;TU=CTTT;VQSLOD=3.4398;set=filterInVQSR-2of5 +20 61184281 . AC A 9798.10 PASS AA=24;AB=0.96507;ABA=16;ABP=863.43;ABR=442;AC=4;AF=0.00341;AN=1174;BL=349;BR=1039;BVAR;BaseQRankSum=2.048;DEL;DP=10073;Dels=0.00;EL=11;EPP=3.3722;ER=13;FS=2.097;HETAR=141;HOMA=69;HOMR=829;HRun=1;InbreedingCoeff=0.0697;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.49712;LRBP=747.85;MQ0=0;MQ0Fraction=0.0000;MQM=98.042;MQRankSum=1.881;NS=1042;RA=3625;RL=5;RPP=20.744;RR=19;RUN=1;ReadPosRankSum=-8.009;SAB=0.75;SAF=18;SAP=16.039;SAR=6;SRB=0.52662;SRF=1909;SRP=25.323;SRR=1716;VQSLOD=1.8117;set=filterInVQSR-2of5;sumGLbyD=5.55 +20 62074219 . C CTAT,CTGT 2328 PASS ABR=99;AC=20,6;AF=0.01754,0.00526;BVAR;BaseQRankSum=11.221;DP=9498;DS;FS=4.510;HOMA=15;HOMR=645;HaplotypeScore=82.8868;INS;InbreedingCoeff=0.0880;IndelType=MULTIALLELIC_INDEL;LEN=3;MQ=29.88;MQ0=1378;MQ0Fraction=0.2286;MQRankSum=-5.309;NS=689;QD=0.77;RA=1679;RUN=1;ReadPosRankSum=-3.510;SAR=1;SB=-93.21;SRB=0.70697;SRF=1187;SRP=627.71;SRR=492;VQSLOD=1.8325;set=filterInVQSR-2of5 +20 62304449 . CA C,CAA 6680.17 PASS AC=141,69;AF=0.12567,0.06150;AF1=0.08178;AN=1122;BVAR;BaseQRankSum=9.754;CI95=0.05088,0.1128;DEL;DP=15867;DP4=1252,1289,232,208;Dels=0.10;FQ=52.6;FR;FS=6.576;HP=11;HR=11;HRun=11;HU=A;INDEL;INS;InbreedingCoeff=0.1950;IndelType=MULTIALLELIC_INDEL;LEN=1;MQ=60.48;MQ0Fraction=0.0004;MQRankSum=-0.049;NF;NR;PP;PV4=0.2,1,1,1;RUN=1;ReadPosRankSum=-2.137;SC=GATTCTGTGTCAAAAAAAAAA;TC;TR=11;TU=A;VQSLOD=7.4714;set=Intersection;sumGLbyD=8.36 +20 62804895 rs57769591 CCTT C 1148 PASS AC=8;AF=0.0085;AF1=0.002839;AN=938;BaseQRankSum=4.952;CI95=0.002212,0.006637;DB;DP=8889;DP4=2574,1668,4,8;FQ=12.3;FS=2.289;HPLen=3;HRun=0;HaplotypeScore=29.4184;INDEL;InbreedingCoeff=-0.0270;IndelType=DEL.NumRepetitions_1.EventLength_3.;MQ0=876;MQ0Fraction=0.2674;MQRankSum=-0.641;PV4=0.074,1,1,1;QD=1.03;ReadPosRankSum=0.118;SB=-65.30;VQSLOD=6.4881;dbSNP=126;set=Intersection +20 62907688 . AAT A 6629.57 PASS AC=164;AF=0.13735;AN=1194;BaseQRankSum=27.368;DP=2746;FS=5.985;HRun=0;HaplotypeScore=14.7748;InbreedingCoeff=0.1433;IndelType=DEL.NumRepetitions_2.EventLength_2.RepeatExpansion_AT.;MQ=96.65;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-3.318;QD=10.81;ReadPosRankSum=0.789;SB=-2662.16;VQSLOD=6.1473;set=VQSR diff --git a/tests/tabix_data/vcf/20.vcf b/tests/tabix_data/vcf/20.vcf new file mode 100644 index 0000000..5e33de1 --- /dev/null +++ b/tests/tabix_data/vcf/20.vcf @@ -0,0 +1,307 @@ +##fileformat=VCFv4.1 +##INFO= +##INFO= +##INFO= +##INFO= +##reference=file:///humgen/1kg/reference/human_g1k_v37.fasta +#CHROM POS ID REF ALT QUAL FILTER INFO +20 207414 . G A . . PacBio=NoCall;Sqnm=NoCall +20 792106 . C G . . PacBio=Poly;Sqnm=NoCall +20 894031 . G A . . PacBio=Poly;Sqnm=Poly +20 1508892 . A G . . PacBio=Poly;Sqnm=Poly +20 1686745 . G A . . PacBio=Poly;Sqnm=NoCall +20 1818886 . C T . . PacBio=Poly;Sqnm=Poly +20 2062981 . A G . . PacBio=Poly;Sqnm=Poly +20 2773229 . A G . . PacBio=Poly;Sqnm=Poly +20 2817761 . T C . . PacBio=Poly;Sqnm=Poly +20 2994966 . G T . . PacBio=Poly;Sqnm=Poly +20 3126723 . C T . . PacBio=Poly;Sqnm=Poly +20 3523369 . G A . . PacBio=Poly;Sqnm=Poly +20 3635082 . A G . . PacBio=Poly;Sqnm=Poly +20 3714080 . C G . . PacBio=Poly;Sqnm=Poly +20 3905791 . G A . . PacBio=Poly;Sqnm=NoCall +20 3907250 . A G . . PacBio=Poly;Sqnm=Poly +20 4171994 . C T . . PacBio=Poly;Sqnm=Poly +20 4246375 . T C . . PacBio=Poly;Sqnm=NoCall +20 4375206 . C T . . PacBio=Poly;Sqnm=Poly +20 4434727 . A T . . PacBio=NoCall;Sqnm=Mono;Sanger=Mono +20 4495199 . G C . . PacBio=Poly;Sqnm=Poly +20 4835415 . C T . . PacBio=Poly;Sqnm=Poly +20 4915769 . T C . . PacBio=Poly;Sqnm=NoCall +20 4983198 . T C . . PacBio=Poly;Sqnm=Poly +20 5441171 . C T . . PacBio=Poly;Sqnm=NoCall +20 5978029 . T C . . PacBio=Poly;Sqnm=Poly +20 6061317 . C A . . PacBio=Poly;Sqnm=Poly +20 6328925 . C A . . PacBio=Poly;Sqnm=Poly +20 6675461 . C T . . PacBio=Poly;Sqnm=NoCall +20 6976115 . C T . . PacBio=Poly;Sqnm=Poly +20 7013349 . G A . . PacBio=NoCall;Sqnm=NoCall +20 7039302 . C T . . PacBio=Poly;Sqnm=Poly +20 7638704 . C A . . PacBio=Poly;Sqnm=Poly +20 7688381 . G A . . PacBio=Poly;Sqnm=Poly +20 7726350 . G T . . PacBio=Poly;Sqnm=Poly +20 7733957 . C T . . PacBio=Poly;Sqnm=Poly +20 7850516 . T C . . PacBio=Poly;Sqnm=Poly +20 8095059 . G A . . PacBio=NoCall;Sqnm=NoCall +20 8232012 . T A . . PacBio=Poly;Sqnm=Poly +20 8415290 . A C . . PacBio=Poly;Sqnm=Poly +20 8438535 . T C . . PacBio=Poly;Sqnm=NoCall +20 8815233 . G A . . PacBio=Mono;Sqnm=NoCall +20 8953629 . C G . . PacBio=Poly;Sqnm=Poly +20 9237267 . T A . . PacBio=Poly;Sqnm=Poly +20 9744549 . T C . . PacBio=Poly;Sqnm=Poly +20 9780416 . C A . . PacBio=Poly;Sqnm=Poly +20 10252552 . T C . . PacBio=Poly;Sqnm=Poly +20 10314038 . C G . . PacBio=Poly;Sqnm=Poly +20 10757416 . T C . . PacBio=Poly;Sqnm=Poly +20 11087688 . A G . . PacBio=Poly;Sqnm=Poly +20 11094107 . G A . . PacBio=NoCall;Sqnm=NoCall +20 11098680 . G A . . PacBio=Poly;Sqnm=Poly +20 11353163 . G C . . PacBio=Poly;Sqnm=Poly +20 11510559 . A G . . PacBio=Poly;Sqnm=Poly +20 11787224 . C T . . PacBio=Poly;Sqnm=Poly +20 11821024 . T C . . PacBio=Poly;Sqnm=Poly +20 11932295 . A G . . PacBio=Poly;Sqnm=Poly +20 11965311 . G T . . PacBio=Poly;Sqnm=Poly +20 12023599 . C T . . PacBio=Poly;Sqnm=Poly +20 12505523 . G T . . PacBio=Poly;Sqnm=Poly +20 12570054 . A C . . PacBio=NoCall;Sqnm=Poly +20 12667452 . A G . . PacBio=Poly;Sqnm=Poly +20 12678271 . G A . . PacBio=Poly;Sqnm=Mono +20 12704885 . T C . . PacBio=Poly;Sqnm=Poly +20 12733996 . C T . . PacBio=Poly;Sqnm=NoCall +20 12737269 . C T . . PacBio=NoCall;Sqnm=NoCall +20 12788981 . G A . . PacBio=Poly;Sqnm=Poly +20 12828594 . T C . . PacBio=Poly;Sqnm=Poly +20 12999157 . T C . . PacBio=Poly;Sqnm=Poly +20 13083804 . C G . . PacBio=Poly;Sqnm=Poly +20 13197077 . G T . . PacBio=Poly;Sqnm=NoCall +20 13217896 . A G . . PacBio=NoCall;Sqnm=Poly +20 13276778 . G A . . PacBio=Poly;Sqnm=Poly +20 13375116 . G A . . PacBio=Mono;Sqnm=NoCall;NotCalledInValidationSamples +20 13648056 . T C . . PacBio=Poly;Sqnm=Poly +20 13672895 . C T . . PacBio=Poly;Sqnm=Poly +20 14160159 . C G . . PacBio=Poly;Sqnm=Poly +20 14266815 . T A . . PacBio=Poly;Sqnm=Poly +20 14865143 . C T . . PacBio=Poly;Sqnm=Poly +20 14882868 . T G . . PacBio=Poly;Sqnm=Poly +20 15244725 . C A . . PacBio=Poly;Sqnm=Poly +20 15277072 . G A . . PacBio=Poly;Sqnm=Poly +20 15390867 . C T . . PacBio=Poly;Sqnm=Poly +20 15785205 . T C . . PacBio=Poly;Sqnm=Poly +20 15833020 . A G . . PacBio=Poly;Sqnm=Poly +20 15847620 . C T . . PacBio=Poly;Sqnm=Poly +20 15953253 . G A . . PacBio=Poly;Sqnm=NoCall +20 15964434 . G C . . PacBio=NoCall;Sqnm=NoCall +20 16183922 . G A . . PacBio=Poly;Sqnm=Poly +20 16190824 . A G . . PacBio=Poly;Sqnm=Poly +20 16557779 . A G . . PacBio=Poly;Sqnm=Poly +20 16730061 . C T . . PacBio=Poly;Sqnm=Poly +20 16794015 . T C . . PacBio=Poly;Sqnm=Poly +20 17048741 . G A . . PacBio=Poly;Sqnm=Poly +20 17299827 . G A . . PacBio=Poly;Sqnm=Poly +20 17299845 . C T . . PacBio=Poly;Sqnm=Poly +20 17390323 . G A . . PacBio=Poly;Sqnm=Poly +20 17624973 . C G . . PacBio=Poly;Sqnm=Poly +20 17666040 . G A . . PacBio=Poly;Sqnm=Poly +20 17735813 . T C . . PacBio=Poly;Sqnm=Poly +20 17794990 . A G . . PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples +20 17809418 . G A . . PacBio=Poly;Sqnm=Poly +20 17860794 . C T . . PacBio=Mono;Sqnm=NoCall +20 17881936 . A G . . PacBio=Poly;Sqnm=Poly +20 17893097 . C G . . PacBio=NoCall;Sqnm=NoCall +20 18188883 . A G . . PacBio=Poly;Sqnm=Poly +20 18199319 . G A . . PacBio=Poly;Sqnm=Poly +20 18233699 . C T . . PacBio=Poly;Sqnm=Poly +20 18536869 . G A . . PacBio=Poly;Sqnm=Poly +20 18637785 . T C . . PacBio=NoCall;Sqnm=Mono;Sanger=Mono;NotCalledInValidationSamples +20 18763166 . G A . . PacBio=Poly;Sqnm=Poly +20 19102715 . A G . . PacBio=NoCall;Sqnm=NoCall +20 19244609 . C T . . PacBio=Poly;Sqnm=Poly +20 19573719 . C T . . PacBio=Poly;Sqnm=Poly +20 19815613 . A G . . PacBio=NoCall;Sqnm=Poly +20 20511479 . C T . . PacBio=Poly;Sqnm=Poly;Sanger=Poly +20 20639358 . T C . . PacBio=Poly;Sqnm=Poly +20 21278490 . T C . . PacBio=Poly;Sqnm=Poly +20 21297718 . C G . . PacBio=Poly;Sqnm=Poly +20 21418269 . A T . . PacBio=Poly;Sqnm=Poly +20 21560553 . A T . . PacBio=Poly;Sqnm=Poly +20 21618451 . G A . . PacBio=NoCall;Sqnm=NoCall +20 21705723 . C A . . PacBio=Poly;Sqnm=Poly +20 22076189 . A G . . PacBio=Poly;Sqnm=Poly +20 22118677 . T A . . PacBio=Poly;Sqnm=Poly +20 22320721 . C T . . PacBio=Poly;Sqnm=Poly +20 22368918 . C A . . PacBio=Poly;Sqnm=Poly +20 23020003 . A G . . PacBio=Poly;Sqnm=Poly +20 23214163 . G A . . PacBio=Poly;Sqnm=Poly +20 23273877 . T C . . PacBio=Poly;Sqnm=Poly +20 23335790 . C T . . PacBio=Poly;Sqnm=NoCall +20 23790659 . C T . . PacBio=Poly;Sqnm=Poly +20 23830388 . T C . . PacBio=Poly;Sqnm=NoCall +20 23837678 . C G . . PacBio=Poly;Sqnm=Poly +20 23901081 . A C . . PacBio=Poly;Sqnm=Poly +20 23946361 . C T . . PacBio=Poly;Sqnm=Poly +20 23949242 . A G . . PacBio=Poly;Sqnm=Poly +20 24539119 . A G . . PacBio=Poly;Sqnm=Poly +20 24986457 . C T . . PacBio=Poly;Sqnm=Poly +20 25183729 . G A . . PacBio=NoCall;Sqnm=NoCall +20 25277133 . C T . . PacBio=Poly;Sqnm=Poly +20 25292464 . C T . . PacBio=Poly;Sqnm=NoCall +20 25528915 . G C . . PacBio=Poly;Sqnm=Poly +20 25851836 . A G . . PacBio=NoCall;Sqnm=NoCall +20 25970163 . C T . . PacBio=Poly;Sqnm=Poly +20 29920798 . C T . . PacBio=NoCall;Sqnm=NoCall +20 30007713 . T C . . PacBio=Poly;Sqnm=Poly +20 30051768 . T C . . PacBio=Poly;Sqnm=Poly +20 30183598 . T C . . PacBio=Poly;Sqnm=Poly +20 30604408 . G A . . PacBio=NoCall;Sqnm=NoCall +20 30759940 . G T . . PacBio=Poly;Sqnm=Poly +20 30881454 . G T . . PacBio=Poly;Sqnm=Poly +20 31356560 . C T . . PacBio=Poly;Sqnm=Poly +20 31450036 . A G . . PacBio=NoCall;Sqnm=Mono +20 31589920 . A T . . PacBio=Poly;Sqnm=Poly +20 31922121 . C T . . PacBio=NoCall;Sqnm=NoCall +20 32801430 . G C . . PacBio=Poly;Sqnm=Poly +20 32943975 . G T . . PacBio=Mono;Sqnm=Mono +20 33155812 . C A . . PacBio=Poly;Sqnm=Poly +20 34090682 . C T . . PacBio=Poly;Sqnm=Poly +20 34254080 . C T . . PacBio=Mono;Sqnm=NoCall;NotCalledInValidationSamples +20 34312126 . C T . . PacBio=Poly;Sqnm=NoCall +20 34481504 . G A . . PacBio=Poly;Sqnm=Poly +20 34694577 . G A . . PacBio=Poly;Sqnm=Poly +20 35026572 . T C . . PacBio=Poly;Sqnm=Poly +20 35472344 . T G . . PacBio=Poly;Sqnm=Poly +20 35882698 . G A . . PacBio=Poly;Sqnm=NoCall +20 36044719 . G A . . PacBio=Poly;Sqnm=NoCall +20 36047623 . C A . . PacBio=NoCall;Sqnm=NoCall +20 36204890 . C T . . PacBio=Poly;Sqnm=NoCall +20 36469514 . G C . . PacBio=NoCall;Sqnm=Poly +20 36840217 . T C . . PacBio=Poly;Sqnm=Poly +20 37460945 . C T . . PacBio=Mono;Sqnm=Poly +20 37665246 . G A . . PacBio=Poly;Sqnm=NoCall +20 37732397 . A G . . PacBio=Poly;Sqnm=Poly +20 37874645 . G T . . PacBio=Poly;Sqnm=Poly +20 37958191 . T C . . PacBio=Poly;Sqnm=Poly +20 37996273 . C T . . PacBio=Mono;Sqnm=NoCall;NotCalledInValidationSamples +20 38016547 . C T . . PacBio=Poly;Sqnm=Poly +20 38435682 . A G . . PacBio=Poly;Sqnm=Poly +20 38505534 . A T . . PacBio=Poly;Sqnm=Poly +20 38803278 . A G . . PacBio=Poly;Sqnm=Poly +20 38963803 . G C . . PacBio=Poly;Sqnm=Poly +20 38971986 . A G . . PacBio=Poly;Sqnm=Poly +20 39269586 . G A . . PacBio=Poly;Sqnm=Poly +20 39289390 . C A . . PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples +20 39318956 . T A . . PacBio=Poly;Sqnm=Poly +20 39736197 . A G . . PacBio=Poly;Sqnm=Poly +20 40241339 . T C . . PacBio=Poly;Sqnm=Poly +20 41473555 . G A . . PacBio=Poly;Sqnm=Poly +20 41878576 . T G . . PacBio=Poly;Sqnm=Poly +20 42022716 . A G . . PacBio=Poly;Sqnm=Poly +20 42033671 . A C . . PacBio=NoCall;Sqnm=NoCall +20 42270334 . C T . . PacBio=NoCall;Sqnm=NoCall +20 42449590 . C T . . PacBio=Poly;Sqnm=NoCall +20 42521157 . T G . . PacBio=Poly;Sqnm=Poly +20 42624300 . C A . . PacBio=Poly;Sqnm=Poly +20 42984548 . G A . . PacBio=Poly;Sqnm=Poly +20 43200148 . G C . . PacBio=Poly;Sqnm=Poly +20 43425384 . T G . . PacBio=Poly;Sqnm=Poly +20 43521990 . C G . . PacBio=Poly;Sqnm=Poly +20 43565804 . G A . . PacBio=Poly;Sqnm=Poly +20 43591237 . T C . . PacBio=Poly;Sqnm=Poly +20 43805929 . C T . . PacBio=Poly;Sqnm=Poly +20 43866692 . A G . . PacBio=Poly;Sqnm=Poly +20 43902088 . C T . . PacBio=Poly;Sqnm=Poly +20 44478507 . C A . . PacBio=Poly;Sqnm=Poly +20 44768810 . C T . . PacBio=Poly;Sqnm=Poly +20 45151582 . G A . . PacBio=Poly;Sqnm=Poly +20 45414003 . G A . . PacBio=Poly;Sqnm=Poly +20 45776825 . G C . . PacBio=Poly;Sqnm=Poly +20 46454905 . G A . . PacBio=Poly;Sqnm=NoCall +20 46823642 . C T . . PacBio=Poly;Sqnm=Poly +20 47001376 . C T . . PacBio=Poly;Sqnm=Poly +20 47079360 . G C . . PacBio=Poly;Sqnm=NoCall +20 47248953 . G A . . PacBio=Poly;Sqnm=Poly +20 47480655 . C T . . PacBio=Poly;Sqnm=Poly +20 47529099 . T C . . PacBio=Poly;Sqnm=Poly +20 47703355 . A C . . PacBio=Poly;Sqnm=Poly +20 47919541 . A G . . PacBio=Poly;Sqnm=Poly +20 48126120 . A C . . PacBio=Poly;Sqnm=Poly +20 48157380 . G A . . PacBio=Poly;Sqnm=Poly +20 48233077 . C T . . PacBio=Poly;Sqnm=Poly +20 48488571 . G A . . PacBio=Poly;Sqnm=Poly +20 48534468 . G A . . PacBio=Poly;Sqnm=NoCall +20 48631385 . G C . . PacBio=Poly;Sqnm=Poly +20 48654970 . G A . . PacBio=Poly;Sqnm=NoCall +20 48708007 . C T . . PacBio=Poly;Sqnm=Poly +20 48979827 . C A . . PacBio=Poly;Sqnm=Poly +20 49100106 . G A . . PacBio=Poly;Sqnm=Poly +20 49509102 . G A . . PacBio=Poly;Sqnm=Poly +20 49631170 . G A . . PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples +20 50210361 . C T . . PacBio=Poly;Sqnm=Poly +20 50309600 . C A . . PacBio=Poly;Sqnm=Poly +20 50681296 . T C . . PacBio=Poly;Sqnm=Poly +20 50750138 . A G . . PacBio=Poly;Sqnm=Poly +20 51639257 . G A . . PacBio=Mono;Sqnm=Poly +20 51814664 . T C . . PacBio=Poly;Sqnm=Poly +20 51891088 . C T . . PacBio=Poly;Sqnm=Poly +20 52299250 . A G . . PacBio=Poly;Sqnm=Poly +20 52363435 . G A . . PacBio=Poly;Sqnm=NoCall +20 52583941 . C T . . PacBio=Poly;Sqnm=Poly +20 52787584 . C T . . PacBio=Poly;Sqnm=Poly +20 53256945 . G A . . PacBio=Poly;Sqnm=Poly +20 54155398 . A G . . PacBio=Poly;Sqnm=Poly +20 54172374 . G T . . PacBio=Poly;Sqnm=Poly +20 54209446 . A G . . PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;Sanger=Poly +20 54317862 . C T . . PacBio=Poly;Sqnm=Poly +20 54852735 . C T . . PacBio=Poly;Sqnm=NoCall +20 54889864 . G A . . PacBio=Poly;Sqnm=Poly +20 55208711 . G A . . PacBio=Poly;Sqnm=Poly +20 55220477 . G T . . PacBio=Poly;Sqnm=Poly +20 55224856 . G T . . PacBio=NoCall;Sqnm=NoCall +20 55441530 . C T . . PacBio=Poly;Sqnm=NoCall +20 55585710 . C T . . PacBio=Poly;Sqnm=Poly +20 55630163 . C T . . PacBio=Poly;Sqnm=Poly +20 56031994 . A G . . PacBio=Poly;Sqnm=Poly +20 56316071 . T G . . PacBio=Poly;Sqnm=Poly +20 56366198 . C T . . PacBio=Poly;Sqnm=Poly +20 56703987 . G A . . PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;Sanger=Poly +20 56794829 . G C . . PacBio=Poly;Sqnm=Poly +20 56797026 . G A . . PacBio=Poly;Sqnm=Poly +20 56922427 . A G . . PacBio=Poly;Sqnm=Poly +20 57025102 . A T . . PacBio=Poly;Sqnm=Poly +20 57104529 . G A . . PacBio=Poly;Sqnm=Poly +20 57360225 . C T . . PacBio=Poly;Sqnm=Poly +20 57630386 . T A . . PacBio=NoCall;Sqnm=NoCall +20 57754033 . G A . . PacBio=Poly;Sqnm=Poly +20 57956631 . C T . . PacBio=Poly;Sqnm=Poly +20 57997801 . C T . . PacBio=Poly;Sqnm=NoCall +20 58046279 . C G . . PacBio=NoCall;Sqnm=NoCall +20 58186723 . A G . . PacBio=Poly;Sqnm=Poly +20 58214460 . C T . . PacBio=Poly;Sqnm=Poly +20 58317759 . A G . . PacBio=Poly;Sqnm=Poly +20 58491642 . A C . . PacBio=Poly;Sqnm=Poly +20 58560045 . C T . . PacBio=Poly;Sqnm=Poly +20 58629232 . C T . . PacBio=Poly;Sqnm=Poly +20 58805192 . G T . . PacBio=Poly;Sqnm=Poly +20 58869523 . A G . . PacBio=Poly;Sqnm=Poly +20 59337535 . T C . . PacBio=Poly;Sqnm=Poly +20 59441596 . G A . . PacBio=Poly;Sqnm=Poly +20 59445223 . G A . . PacBio=NoCall;Sqnm=NoCall +20 59605846 . C T . . PacBio=Poly;Sqnm=Poly +20 59864395 . G C . . PacBio=Poly;Sqnm=Poly +20 60099821 . G T . . PacBio=Poly;Sqnm=Poly +20 60290551 . A G . . PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;Sanger=Poly +20 60362527 . G C . . PacBio=Poly;Sqnm=Poly +20 60516358 . C T . . PacBio=Poly;Sqnm=Poly +20 60559594 . C T . . PacBio=NoCall;Sqnm=Poly +20 60745115 . G A . . PacBio=Poly;Sqnm=Poly +20 60831300 . G A . . PacBio=Poly;Sqnm=Poly +20 60907675 . G A . . PacBio=Poly;Sqnm=Poly +20 61458191 . G A . . PacBio=Poly;Sqnm=Poly +20 61717607 . C T . . PacBio=Mono;Sqnm=Poly +20 61771154 . G A . . PacBio=Poly;Sqnm=Poly +20 61950497 . G A . . PacBio=Poly;Sqnm=Poly +20 62000091 . C T . . PacBio=Poly;Sqnm=Poly +20 62550780 . C T . . PacBio=NoCall;Sqnm=NoCall +20 62558259 . T C . . PacBio=Poly;Sqnm=Poly +20 62727205 . C T . . PacBio=Poly;Sqnm=Poly diff --git a/tests/tabix_data/vcf/21.vcf b/tests/tabix_data/vcf/21.vcf new file mode 100644 index 0000000..db6cec6 --- /dev/null +++ b/tests/tabix_data/vcf/21.vcf @@ -0,0 +1,310 @@ +##fileformat=VCFv4.1 +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##reference=file:///humgen/1kg/reference/human_g1k_v37.fasta +#CHROM POS ID REF ALT QUAL FILTER INFO +20 207414 . G A 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 792106 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 894031 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 1508892 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 1686745 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 1818886 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 2062981 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 2773229 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 2817761 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 2994966 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 3126723 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 3523369 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 3635082 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 3714080 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 3905791 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 3907250 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 4171994 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 4246375 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 4375206 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 4434727 . A T 0 . Consensus=Mono;PacBio=Mono;Sqnm=Mono;Sanger=Mono;pcr454_ss=NoCall;pcr454_ps=Poly +20 4495199 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 4835415 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 4915769 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=NoCall;pcr454_ps=NoCall +20 4983198 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 5441171 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 5978029 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 6061317 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Mono;pcr454_ps=Poly +20 6328925 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 6675461 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 6976115 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 7013349 . G A 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 7039302 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 7638704 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 7688381 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 7726350 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 7733957 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 7850516 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 8095059 . G A 0 . Consensus=Mono;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=NoCall;pcr454_ps=NoCall +20 8232012 . T A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 8415290 . A C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 8438535 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 8815233 . G A 0 . Consensus=Poly;PacBio=Mono;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 8953629 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Mono;pcr454_ps=Poly +20 9237267 . T A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 9744549 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 9780416 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 10252552 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 10314038 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 10757416 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 11087688 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 11094107 . G A 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 11098680 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 11353163 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 11510559 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 11787224 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 11821024 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 11932295 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 11965311 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 12023599 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 12505523 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 12570054 . A C 0 . Consensus=Poly;PacBio=NoCall;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 12667452 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 12678271 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Mono;pcr454_ss=Poly;pcr454_ps=Poly +20 12704885 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 12733996 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 12737269 . C T 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 12788981 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 12828594 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 12999157 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 13083804 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 13197077 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 13217896 . A G 0 . Consensus=Poly;PacBio=NoCall;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 13276778 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 13375116 . G A 0 . Consensus=Mono;PacBio=Mono;Sqnm=NoCall;NotCalledInValidationSamples;pcr454_ss=Mono;pcr454_ps=Mono +20 13648056 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 13672895 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 14160159 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 14266815 . T A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 14865143 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 14882868 . T G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 15244725 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 15277072 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 15390867 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 15785205 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 15833020 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 15847620 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 15953253 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 15964434 . G C 0 . Consensus=NoCall;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=NoCall;pcr454_ps=NoCall +20 16183922 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 16190824 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 16557779 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 16730061 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 16794015 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 17048741 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 17299827 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 17299845 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 17390323 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 17624973 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 17666040 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 17735813 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 17794990 . A G 0 . Consensus=Mono;PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;pcr454_ss=NoCall;pcr454_ps=NoCall +20 17809418 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 17860794 . C T 0 . Consensus=Poly;PacBio=Mono;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 17881936 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 17893097 . C G 0 . Consensus=Mono;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Mono;pcr454_ps=Mono +20 18188883 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 18199319 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 18233699 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 18536869 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 18637785 . T C 0 . Consensus=Mono;PacBio=NoCall;Sqnm=Mono;Sanger=Mono;NotCalledInValidationSamples;pcr454_ss=Mono;pcr454_ps=Mono +20 18763166 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 19102715 . A G 0 . Consensus=Mono;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Mono;pcr454_ps=Mono +20 19244609 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 19573719 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 19815613 . A G 0 . Consensus=Poly;PacBio=NoCall;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 20511479 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;Sanger=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 20639358 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 21278490 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 21297718 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 21418269 . A T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 21560553 . A T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 21618451 . G A 0 . Consensus=NoCall;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=NoCall;pcr454_ps=NoCall +20 21705723 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 22076189 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 22118677 . T A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 22320721 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 22368918 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 23020003 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 23214163 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 23273877 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 23335790 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Mono +20 23790659 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 23830388 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 23837678 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 23901081 . A C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 23946361 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 23949242 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 24539119 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 24986457 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 25183729 . G A 0 . Consensus=Mono;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Mono;pcr454_ps=Mono +20 25277133 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 25292464 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 25528915 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 25851836 . A G 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 25970163 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 29920798 . C T 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 30007713 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 30051768 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 30183598 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 30604408 . G A 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 30759940 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 30881454 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=Poly +20 31356560 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 31450036 . A G 0 . Consensus=Poly;PacBio=NoCall;Sqnm=Mono;pcr454_ss=Poly;pcr454_ps=Poly +20 31589920 . A T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 31922121 . C T 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 32801430 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 32943975 . G T 0 . Consensus=Mono;PacBio=Mono;Sqnm=Mono;pcr454_ss=NoCall;pcr454_ps=NoCall +20 33155812 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 34090682 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 34254080 . C T 0 . Consensus=Mono;PacBio=Mono;Sqnm=NoCall;NotCalledInValidationSamples;pcr454_ss=Mono;pcr454_ps=Mono +20 34312126 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 34481504 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 34694577 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 35026572 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 35472344 . T G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 35882698 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 36044719 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 36047623 . C A 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 36204890 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 36469514 . G C 0 . Consensus=Poly;PacBio=NoCall;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 36840217 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 37460945 . C T 0 . Consensus=Poly;PacBio=Mono;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 37665246 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 37732397 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 37874645 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 37958191 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 37996273 . C T 0 . Consensus=Mono;PacBio=Mono;Sqnm=NoCall;NotCalledInValidationSamples;pcr454_ss=Mono;pcr454_ps=Mono +20 38016547 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 38435682 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 38505534 . A T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 38803278 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 38963803 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 38971986 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 39269586 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 39289390 . C A 0 . Consensus=Mono;PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;pcr454_ss=NoCall;pcr454_ps=NoCall +20 39318956 . T A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=Poly +20 39736197 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 40241339 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 41473555 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 41878576 . T G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 42022716 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 42033671 . A C 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 42270334 . C T 0 . Consensus=NoCall;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=NoCall;pcr454_ps=NoCall +20 42449590 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 42521157 . T G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 42624300 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 42984548 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 43200148 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 43425384 . T G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 43521990 . C G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 43565804 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 43591237 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 43805929 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 43866692 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 43902088 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 44478507 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 44768810 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 45151582 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 45414003 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Mono;pcr454_ps=Mono +20 45776825 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 46454905 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 46823642 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 47001376 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 47079360 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 47248953 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 47480655 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 47529099 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 47703355 . A C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 47919541 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 48126120 . A C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 48157380 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 48233077 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 48488571 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 48534468 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 48631385 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 48654970 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 48708007 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 48979827 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 49100106 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 49509102 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 49631170 . G A 0 . Consensus=Mono;PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;pcr454_ss=Mono;pcr454_ps=Mono +20 50210361 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 50309600 . C A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 50681296 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 50750138 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 51639257 . G A 0 . Consensus=Poly;PacBio=Mono;Sqnm=Poly;pcr454_ss=Mono;pcr454_ps=Mono +20 51814664 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 51891088 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 52299250 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 52363435 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 52583941 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 52787584 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 53256945 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 54155398 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 54172374 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=Poly +20 54209446 . A G 0 . Consensus=Poly;PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;Sanger=Poly;pcr454_ss=Mono;pcr454_ps=Mono +20 54317862 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 54852735 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 54889864 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 55208711 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 55220477 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 55224856 . G T 0 . Consensus=NoCall;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=NoCall;pcr454_ps=NoCall +20 55441530 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 55585710 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 55630163 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 56031994 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 56316071 . T G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 56366198 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 56703987 . G A 0 . Consensus=Poly;PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;Sanger=Poly;pcr454_ss=Mono;pcr454_ps=Mono +20 56794829 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 56797026 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 56922427 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 57025102 . A T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 57104529 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 57360225 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 57630386 . T A 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 57754033 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 57956631 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 57997801 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 58046279 . C G 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 58186723 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 58214460 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 58317759 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 58491642 . A C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 58560045 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 58629232 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 58805192 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 58869523 . A G 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 59337535 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 59441596 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 59445223 . G A 0 . Consensus=Poly;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=Poly;pcr454_ps=Poly +20 59605846 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 59864395 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=NoCall;pcr454_ps=NoCall +20 60099821 . G T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 60290551 . A G 0 . Consensus=Poly;PacBio=Mono;Sqnm=Mono;NotCalledInValidationSamples;Sanger=Poly;pcr454_ss=Mono;pcr454_ps=Mono +20 60362527 . G C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 60516358 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 60559594 . C T 0 . Consensus=Poly;PacBio=NoCall;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 60745115 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 60831300 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 60907675 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 61458191 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 61717607 . C T 0 . Consensus=Poly;PacBio=Mono;Sqnm=Poly;pcr454_ss=Mono;pcr454_ps=Mono +20 61771154 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 61950497 . G A 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 62000091 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 62550780 . C T 0 . Consensus=NoCall;PacBio=NoCall;Sqnm=NoCall;pcr454_ss=NoCall;pcr454_ps=NoCall +20 62558259 . T C 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly +20 62727205 . C T 0 . Consensus=Poly;PacBio=Poly;Sqnm=Poly;pcr454_ss=Poly;pcr454_ps=Poly diff --git a/tests/tabix_data/vcf/22.vcf b/tests/tabix_data/vcf/22.vcf new file mode 100644 index 0000000..ffb2fce --- /dev/null +++ b/tests/tabix_data/vcf/22.vcf @@ -0,0 +1,1000 @@ +##fileformat=VCFv4.0 +##FORMAT= +##FilterLiftedVariants="analysis_type=FilterLiftedVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null reference_sequence=/local/sequence/reference/BWA_ref/hg19/hg19.fasta rodBind=[/local/scratch/xyliu/0.915136538286792.sorted.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false enable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null quiet_output_mode=false debug_mode=false help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub" +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA15029 NA15036 NA15038 NA15056b NA15072 NA15144C NA15213_006 NA15215A NA15216_A2 NA15221b NA15223_6v2 NA15224_4 NA15226A NA15227b NA15236_6 NA15242_005 NA15245v2 NA15268 NA15324_A1 NA15385b NA15386A NA15510_A1 NA15590_4 NA15594_005 NA18500b NA18501 NA18502 NA18503 NA18504 NA18505 NA18506 NA18507 NA18508 NA18515 NA18516 NA18517 NA18521 NA18522 NA18523 NA18524_B1 NA18526_B2 NA18529_B1 NA18532_B1 NA18537_B1 NA18540_B1 NA18542_B1 NA18545_5 NA18547_B1 NA18550_B1 NA18555_A2 NA18561_A3 NA18562_B1 NA18563 NA18564_4 NA18566_3 NA18570_3 NA18571_3 NA18572_3 NA18573_B3 NA18576_4 NA18577_B1 NA18579_B1 NA18582_B1 NA18592_2 NA18593_B1 NA18594_B1 NA18603_B1 NA18605_B1 NA18608_B1 NA18609_B1 NA18611_B1 NA18612_B1 NA18620_3 NA18621_B1 NA18622_B1 NA18623_B1 NA18624 NA18632_3 NA18635_A1 NA18637_2 NA18852 NA18853 NA18854 NA18855 NA18856 NA18857 NA18858 NA18859 NA18860 NA18861 NA18862 NA18863 NA18870 NA18871 NA18872 NA18912 NA18913 NA18914 NA18940_3 NA19092 NA19093 NA19094 NA19098 NA19099 NA19100 NA19101 NA19102 NA19103 NA19116 NA19119b NA19120 NA19127 NA19128 NA19129 NA19130b NA19131 NA19132b NA19137 NA19138 NA19139 NA19140b NA19141 NA19142 NA19143 NA19144 NA19145 NA19152 NA19153 NA19154 NA19159 NA19160 NA19161 NA19171 NA19172 NA19173 NA19192 NA19193 NA19194 NA19200 NA19201 NA19202 NA19203 NA19204 NA19205 NA19206 NA19207 NA19208v2 NA19209 NA19210 NA19211 NA19221 NA19222 NA19223 NA19238 NA19239 NA19240 NA_pos103a NS12911_1 +chr1 5911136 . T TGCCATTCCAAAGAGGCACTCA . PASS VC=INDEL;AC=28;AF=0.09;AN=316 GT 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 17054990 . G GA . PASS VC=INDEL;AC=25;AF=0.12;AN=200 GT ./. ./. 0/1 ./. 0/0 ./. ./. ./. ./. 0/0 0/1 ./. ./. 0/0 ./. ./. 0/1 ./. ./. ./. ./. 0/0 0/1 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 ./. ./. ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 ./. ./. ./. ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/1 ./. 0/1 ./. 0/0 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/1 ./. ./. ./. 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 ./. ./. ./. 0/1 ./. ./. 0/0 ./. ./. ./. ./. ./. ./. ./. 0/1 0/1 ./. +chr1 17390953 . CT C . PASS VC=INDEL;AC=118;AF=0.37;AN=316 GT 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 +chr1 17754916 . CCT C . PASS VC=INDEL;AC=66;AF=0.21;AN=316;refseq.name=NM_018715;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 +chr1 18293100 . C CCTC . PASS VC=INDEL;AC=263;AF=0.84;AN=314 GT 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 18823397 . T TTAAT . PASS VC=INDEL;AC=87;AF=0.28;AN=316 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 19215209 . G GAG . PASS VC=INDEL;AC=2;AF=0.01;AN=316;refseq.name=NM_003748;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 19943821 . CACAG C . PASS VC=INDEL;AC=12;AF=0.04;AN=308;refseq.name=NM_001032363;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 20092486 . GAAG G . PASS VC=INDEL;AC=7;AF=0.02;AN=314;refseq.name=NM_181719;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 20977854 . A ATTC . PASS VC=INDEL;AC=152;AF=0.52;AN=292;refseq.name=NM_032409;refseq.positionType=exon GT 0/1 1/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 ./. 0/1 0/1 1/1 0/1 0/1 ./. 0/0 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 ./. 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 ./. ./. 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 ./. 0/0 ./. 0/0 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 ./. 0/1 1/1 1/1 0/0 0/1 0/1 1/1 ./. ./. 0/1 0/0 0/0 0/0 ./. 1/1 0/1 1/1 0/0 ./. 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 +chr1 21275058 . CTTTG C . PASS VC=INDEL;AC=30;AF=0.1;AN=296;refseq.name=NM_003760;refseq.positionType=intron GT ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 +chr1 22642904 . A AAC . PASS VC=INDEL;AC=255;AF=0.85;AN=300 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 ./. 0/1 0/1 0/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 +chr1 22844297 . ATCT A . PASS VC=INDEL;AC=162;AF=0.51;AN=316;refseq.name=NM_001083621;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 +chr1 22844299 . CTTC C . PASS VC=INDEL;AC=160;AF=0.51;AN=314;refseq.name=NM_001083621;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 ./. 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 +chr1 23162393 . AA A . PASS VC=INDEL;AC=44;AF=0.14;AN=316;refseq.name=NM_004442;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 +chr1 23882634 . T TAGGTG . PASS VC=INDEL;AC=24;AF=0.08;AN=284 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/1 0/1 ./. 0/1 0/0 0/0 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 +chr1 25799681 . CTCTG C . PASS VC=INDEL;AC=49;AF=0.21;AN=230;refseq.name=NM_018202;refseq.positionType=intron GT 0/1 ./. 1/1 ./. 0/1 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 1/1 0/1 ./. ./. 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 1/1 ./. 1/1 0/0 0/1 1/1 ./. 0/1 ./. 0/1 ./. 0/1 0/1 0/0 1/1 0/1 ./. ./. 0/1 ./. 1/1 0/1 ./. 0/1 1/1 ./. ./. 0/1 ./. 0/1 ./. ./. 1/1 ./. 0/1 ./. 1/1 ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. ./. 0/0 ./. ./. ./. ./. ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 26081170 . CA C . PASS VC=INDEL;AC=17;AF=0.06;AN=308;refseq.name=NM_020379;refseq.positionType=intron GT 0/0 ./. 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 26240086 . GAT G . PASS VC=INDEL;AC=31;AF=0.1;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 26725650 . A ATGAAG . PASS VC=INDEL;AC=300;AF=0.95;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 +chr1 26725655 . G GTGAAG . PASS VC=INDEL;AC=300;AF=0.95;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 +chr1 27425097 . CTGG C . PASS VC=INDEL;AC=40;AF=0.16;AN=248;refseq.name=NM_003047;refseq.positionType=terminator GT 1/1 0/1 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/0 0/0 ./. ./. ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. ./. ./. 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 ./. 0/1 ./. 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/1 0/1 ./. ./. 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 +chr1 27737240 . A AT . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_006990;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 27744410 . GATCCATG G . PASS VC=INDEL;AC=166;AF=0.56;AN=296;refseq.name=NM_006990;refseq.positionType=intron GT 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 1/1 ./. 0/1 0/0 ./. 0/0 ./. 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 ./. 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 ./. 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 ./. 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 ./. 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 ./. ./. +chr1 28156589 . G GGATG . PASS VC=INDEL;AC=127;AF=0.4;AN=314;refseq.name=NM_002713;refseq.positionType=promoter GT 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 ./. 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 +chr1 28721777 . TA T . PASS VC=INDEL;AC=287;AF=0.91;AN=316;refseq.name=NM_001048183;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 +chr1 28721778 . AA A . PASS VC=INDEL;AC=287;AF=0.91;AN=316;refseq.name=NM_001048183;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 +chr1 28907201 . GT G . PASS VC=INDEL;AC=3;AF=0.01;AN=224 GT 0/0 ./. 0/0 0/0 ./. ./. 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 ./. ./. 0/0 ./. ./. 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/1 ./. ./. 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/1 ./. ./. ./. ./. +chr1 29223339 . G GTGAG . PASS VC=INDEL;AC=203;AF=0.7;AN=292;refseq.name=NM_004437;refseq.positionType=intron GT 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 ./. 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 ./. 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 ./. 1/1 1/1 0/1 1/1 0/1 ./. 1/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 ./. ./. 0/1 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 ./. 0/0 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 1/1 ./. 1/1 0/1 +chr1 29223342 . A AGCAA . PASS VC=INDEL;AC=71;AF=0.29;AN=242;refseq.name=NM_004437;refseq.positionType=intron GT 0/1 0/1 1/1 ./. 0/1 0/1 0/1 0/0 ./. 0/0 0/1 ./. 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 ./. 1/1 0/1 ./. ./. 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 ./. 0/1 ./. 0/1 ./. 0/1 0/1 ./. 0/1 0/1 ./. ./. 0/1 ./. ./. ./. ./. 0/1 ./. 0/0 ./. ./. ./. 0/1 0/1 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/0 0/0 ./. 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/1 ./. ./. 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 ./. 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 ./. 0/1 ./. ./. 0/0 +chr1 29865521 . G GCTCCGT . PASS VC=INDEL;AC=115;AF=0.36;AN=316 GT 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 +chr1 31128790 . C CT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 31135886 . A AG . PASS VC=INDEL;AC=246;AF=0.92;AN=268 GT ./. 1/1 0/1 1/1 0/1 ./. 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. ./. ./. 1/1 ./. 1/1 0/1 0/1 0/1 ./. 1/1 1/1 ./. ./. 0/1 1/1 1/1 ./. 1/1 1/1 ./. 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 ./. 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. +chr1 31503645 . AAAAGA A . PASS VC=INDEL;AC=5;AF=0.02;AN=314;refseq.name=NM_001020658;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 31504005 . C CAT . PASS VC=INDEL;AC=84;AF=0.27;AN=316;refseq.name=NM_001020658;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 +chr1 31731414 . CCTCT C . PASS VC=INDEL;AC=40;AF=0.13;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 31775152 . A ACTA . PASS VC=INDEL;AC=47;AF=0.15;AN=308;refseq.name=NM_016505;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 31882582 . G GGCCTCA . PASS VC=INDEL;AC=163;AF=0.59;AN=274 GT 1/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 ./. 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 ./. 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 ./. 0/1 1/1 0/1 0/1 1/1 0/1 ./. 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 ./. 1/1 0/1 1/1 1/1 0/1 ./. ./. ./. 1/1 ./. 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/0 ./. 0/0 1/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 ./. 0/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 ./. 1/1 0/1 ./. 0/1 0/1 0/1 ./. 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/1 0/1 0/1 ./. ./. 0/1 0/1 ./. 0/0 0/1 ./. 0/1 ./. 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 +chr1 32010706 . GG G . PASS VC=INDEL;AC=312;AF=1;AN=312 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 32078865 . G GT . PASS VC=INDEL;AC=78;AF=0.25;AN=316 GT 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 +chr1 33422344 . G GAA . PASS VC=INDEL;AC=123;AF=0.39;AN=316;refseq.name=NM_153341;refseq.positionType=intron GT 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 +chr1 33634618 . TC T . PASS VC=INDEL;AC=238;AF=0.75;AN=316;refseq.name=NM_018207;refseq.positionType=intron GT 0/0 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 +chr1 33965999 . CCCAGTTC C . PASS VC=INDEL;AC=203;AF=0.65;AN=314 GT 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 ./. 0/1 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 +chr1 34176371 . GAAACATAAG G . PASS VC=INDEL;AC=252;AF=0.95;AN=266;refseq.name=NM_052896;refseq.positionType=intron GT 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 0/1 1/1 ./. ./. ./. 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 ./. 0/1 1/1 ./. 0/1 0/1 1/1 ./. ./. 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 +chr1 34931817 . AT A . PASS VC=INDEL;AC=38;AF=0.12;AN=316 GT 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 +chr1 35879227 . CAT C . PASS VC=INDEL;AC=31;AF=0.1;AN=316;refseq.name=NM_005095;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 +chr1 36429590 . A AG . PASS VC=INDEL;AC=181;AF=0.57;AN=316;refseq.name=NM_024852;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 +chr1 36558240 . C CAC . PASS VC=INDEL;AC=11;AF=0.03;AN=316;refseq.name=NM_017825;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 37034721 . ATACT A . PASS VC=INDEL;AC=44;AF=0.16;AN=282 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 ./. ./. ./. 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 +chr1 37142202 . AATA A . PASS VC=INDEL;AC=24;AF=0.08;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 37169424 . TA T . PASS VC=INDEL;AC=176;AF=0.56;AN=316 GT 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 +chr1 37169427 . AA A . PASS VC=INDEL;AC=173;AF=0.56;AN=308 GT 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 ./. 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 +chr1 37638341 . T TAT . PASS VC=INDEL;AC=11;AF=0.05;AN=222 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/1 ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 ./. ./. ./. 0/0 0/1 ./. ./. ./. ./. ./. ./. ./. ./. ./. 0/0 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/0 0/0 0/1 0/0 ./. 0/1 ./. ./. 0/0 ./. ./. ./. ./. 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. ./. ./. 0/0 +chr1 38077349 . CTTATCCCCATACTAGTTATTATCGAAACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTA C . PASS VC=INDEL;AC=209;AF=0.77;AN=272;refseq.name=NM_001038633;refseq.positionType=intron GT 0/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 1/1 ./. 1/1 ./. 0/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. ./. 1/1 1/1 ./. 0/1 ./. 1/1 1/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 0/1 1/1 ./. ./. ./. 1/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 ./. 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 ./. 1/1 0/0 0/1 0/0 1/1 1/1 1/1 ./. ./. 0/1 1/1 1/1 1/1 0/0 0/0 0/0 ./. 1/1 0/1 1/1 0/1 +chr1 38392549 . AT A . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_005540;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 38664242 . TA T . PASS VC=INDEL;AC=93;AF=0.29;AN=316 GT 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 +chr1 38739177 . GTG G . PASS VC=INDEL;AC=32;AF=0.1;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 39288395 . CTTC C . PASS VC=INDEL;AC=36;AF=0.12;AN=306 GT 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 +chr1 39615407 . C CGATAT . PASS VC=INDEL;AC=192;AF=0.63;AN=306;refseq.name=NM_012090;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 ./. 0/1 1/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 ./. 0/1 1/1 0/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 0/1 0/1 ./. 0/1 0/0 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 ./. 0/0 1/1 0/1 1/1 1/1 +chr1 39615412 . T TGATAT . PASS VC=INDEL;AC=200;AF=0.63;AN=316;refseq.name=NM_012090;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 +chr1 39736467 . T TATAT . PASS VC=INDEL;AC=27;AF=0.09;AN=316;refseq.name=NM_012090;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 39936801 . GTG G . PASS VC=INDEL;AC=23;AF=0.07;AN=314;refseq.name=NM_012090;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 40525320 . AACACAAGAAC A . PASS VC=INDEL;AC=21;AF=0.11;AN=196;refseq.name=NM_006367;refseq.positionType=intron GT ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/0 0/1 1/1 1/1 0/1 ./. 1/1 ./. 0/0 1/1 0/0 1/1 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. ./. 0/1 ./. 0/0 ./. ./. ./. 0/0 0/0 ./. ./. 0/0 ./. ./. ./. ./. ./. ./. ./. 0/0 0/0 ./. ./. ./. 0/1 0/1 0/0 ./. ./. ./. ./. ./. 0/0 ./. ./. ./. ./. ./. ./. 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 ./. ./. ./. 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 ./. +chr1 40728529 . TA T . PASS VC=INDEL;AC=216;AF=0.68;AN=316;refseq.name=NM_005857;refseq.positionType=intron GT 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 +chr1 41281719 . CT C . PASS VC=INDEL;AC=142;AF=0.45;AN=316;refseq.name=NM_004700;refseq.positionType=intron GT 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 +chr1 41808814 . CT C . PASS VC=INDEL;AC=32;AF=0.1;AN=308 GT 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 41991662 . CCA C . PASS VC=INDEL;AC=17;AF=0.06;AN=304;refseq.name=NM_024503;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 ./. +chr1 42083551 . C CT . PASS VC=INDEL;AC=139;AF=0.44;AN=316;refseq.name=NM_024503;refseq.positionType=intron GT 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 +chr1 42531504 . G GATAG . PASS VC=INDEL;AC=199;AF=0.66;AN=302 GT 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 ./. 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 ./. 1/1 1/1 1/1 ./. 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 ./. 0/1 0/1 0/1 0/0 ./. 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 +chr1 42835720 . C CTTG . PASS VC=INDEL;AC=297;AF=0.94;AN=316 GT 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 42835723 . G GTTG . PASS VC=INDEL;AC=297;AF=0.94;AN=316 GT 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 42880843 . A ACA . PASS VC=INDEL;AC=179;AF=0.57;AN=316;refseq.name=NM_173642;refseq.positionType=exon GT 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/0 0/0 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/1 +chr1 44114854 . C CGC . PASS VC=INDEL;AC=107;AF=0.45;AN=238;refseq.name=NM_014663;refseq.positionType=promoter GT 0/0 1/1 1/1 ./. 0/0 ./. ./. 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 ./. 0/1 1/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 ./. ./. 0/0 0/0 ./. 0/1 0/0 0/1 1/1 ./. 1/1 0/1 0/1 0/1 ./. 0/1 0/0 0/1 ./. 0/1 0/1 ./. 0/0 0/0 0/1 0/0 0/0 1/1 ./. 0/0 0/0 0/1 0/1 ./. ./. ./. 0/0 0/0 0/1 0/1 ./. 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 ./. 0/1 ./. 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/0 1/1 ./. 0/1 0/1 0/1 ./. ./. ./. 0/1 ./. 0/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 ./. ./. ./. 1/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 ./. ./. 0/1 1/1 0/1 ./. 0/0 0/1 1/1 0/1 0/1 ./. ./. 1/1 0/1 1/1 0/1 0/1 ./. ./. ./. 0/1 ./. 0/0 0/1 +chr1 44231607 . CA C . PASS VC=INDEL;AC=216;AF=0.69;AN=314;refseq.name=NM_006279;refseq.positionType=intron GT 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 1/1 ./. 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 +chr1 44231608 . AA A . PASS VC=INDEL;AC=215;AF=0.68;AN=314;refseq.name=NM_006279;refseq.positionType=intron GT 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 ./. 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 +chr1 44327106 . GCTGTCAGGACTTGTATAGA G . PASS VC=INDEL;AC=193;AF=0.66;AN=294;refseq.name=NM_006279;refseq.positionType=intron GT 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 ./. 0/0 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 0/1 ./. 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 ./. 1/1 ./. 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 0/1 ./. 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 ./. 0/0 1/1 0/1 0/1 0/1 0/1 ./. 0/1 ./. 1/1 1/1 +chr1 44730823 . G GGAGA . PASS VC=INDEL;AC=295;AF=0.96;AN=306;refseq.name=NM_024066;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 ./. 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 44881687 . GCAT G . PASS VC=INDEL;AC=29;AF=0.09;AN=314;refseq.name=NM_018150;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 45223909 . GATTAGCTG G . PASS VC=INDEL;AC=167;AF=0.55;AN=306;refseq.name=NM_006845;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 ./. 0/1 ./. 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 ./. ./. 0/1 1/1 1/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 46900444 . T TGTGGGAATGC . PASS VC=INDEL;AC=2;AF=0.01;AN=296 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 +chr1 46900720 . C CTT . PASS VC=INDEL;AC=244;AF=0.79;AN=308 GT 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 ./. 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 46900721 . T TTT . PASS VC=INDEL;AC=241;AF=0.79;AN=304 GT 1/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 ./. 1/1 ./. 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 47052336 . TGAAA T . PASS VC=INDEL;AC=76;AF=0.24;AN=316;refseq.name=NM_003684;refseq.positionType=intron GT 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 +chr1 47167062 . TT T . PASS VC=INDEL;AC=174;AF=0.64;AN=272;refseq.name=NM_014774;refseq.positionType=intron GT ./. 0/1 0/1 0/1 ./. 0/0 0/0 1/1 1/1 0/1 1/1 0/1 ./. ./. 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 1/1 0/1 0/1 0/1 ./. 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 ./. 0/1 1/1 0/1 1/1 1/1 0/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 0/0 0/1 ./. 1/1 1/1 1/1 ./. ./. 0/0 ./. 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 ./. 0/1 1/1 ./. 0/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 ./. 1/1 ./. 1/1 0/1 0/1 1/1 0/1 0/1 0/0 ./. 0/1 ./. 0/1 1/1 0/1 1/1 ./. 1/1 ./. 0/0 +chr1 47324578 . CTACTACAAA C . PASS VC=INDEL;AC=150;AF=0.65;AN=232 GT 1/1 ./. ./. ./. ./. 0/1 0/0 0/1 0/0 ./. ./. 1/1 0/1 1/1 0/0 0/1 ./. 0/1 0/1 0/0 0/1 ./. 0/1 0/0 ./. 0/0 1/1 1/1 ./. 0/1 1/1 1/1 ./. 0/1 0/0 0/1 1/1 1/1 ./. 0/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 ./. ./. 0/1 0/1 0/1 ./. 1/1 0/1 0/0 0/1 ./. 0/1 1/1 0/1 ./. 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 ./. 1/1 ./. 0/0 0/1 0/0 ./. 1/1 1/1 1/1 ./. ./. 1/1 ./. ./. 0/0 ./. 0/1 0/1 ./. ./. 1/1 1/1 1/1 0/1 0/1 0/1 1/1 ./. ./. ./. 0/1 ./. 0/1 0/1 0/1 ./. 0/1 +chr1 47325281 . CA C . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 47891688 . AT A . PASS VC=INDEL;AC=84;AF=0.29;AN=294 GT 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 ./. 0/0 ./. 0/0 ./. 0/0 1/1 1/1 0/1 0/1 0/1 ./. 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 ./. 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 47931769 . TTCTC T . PASS VC=INDEL;AC=2;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 48000154 . G GTTT . PASS VC=INDEL;AC=11;AF=0.05;AN=232 GT ./. 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/1 ./. 0/0 0/0 ./. ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 ./. ./. ./. 0/0 ./. ./. 0/0 0/0 0/1 0/0 0/1 ./. 0/1 0/1 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 ./. ./. 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. ./. ./. 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 +chr1 48146050 . CCTGA C . PASS VC=INDEL;AC=28;AF=0.09;AN=316 GT 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 48520865 . CAGGGTGAGTAGGCCTGGGCAG C . PASS VC=INDEL;AC=4;AF=0.01;AN=316 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 48520886 . GAG G . PASS VC=INDEL;AC=31;AF=0.14;AN=216 GT ./. 0/0 0/1 0/0 0/0 ./. ./. 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/1 0/0 ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. ./. ./. ./. ./. 0/0 ./. 0/1 0/1 ./. 0/1 0/0 0/1 0/1 0/1 ./. 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 ./. ./. 0/0 ./. ./. ./. 0/0 1/1 0/0 0/1 ./. ./. 0/0 ./. 0/0 0/0 0/1 ./. 0/1 0/1 0/0 ./. ./. ./. +chr1 48544917 . G GTGTT . PASS VC=INDEL;AC=43;AF=0.14;AN=314 GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 49109456 . AGAGC A . PASS VC=INDEL;AC=31;AF=0.14;AN=226;refseq.name=NM_032785;refseq.positionType=intron GT 0/0 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 ./. ./. 0/0 0/0 0/1 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/1 0/0 ./. 0/0 0/0 ./. 0/0 0/1 ./. ./. 0/0 0/1 ./. ./. ./. ./. 0/1 0/0 ./. 0/0 ./. 0/0 0/0 0/0 ./. ./. ./. 0/0 ./. 0/0 ./. ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. ./. 0/0 0/0 0/1 ./. ./. ./. 0/1 0/1 0/1 +chr1 49124365 . C CGAG . PASS VC=INDEL;AC=93;AF=0.29;AN=316;refseq.name=NM_032785;refseq.positionType=intron GT 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 +chr1 49124368 . G GGAG . PASS VC=INDEL;AC=93;AF=0.29;AN=316;refseq.name=NM_032785;refseq.positionType=intron GT 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 +chr1 49126514 . C CTG . PASS VC=INDEL;AC=89;AF=0.3;AN=296;refseq.name=NM_032785;refseq.positionType=intron GT 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/1 ./. 0/0 0/0 0/0 1/1 0/1 ./. 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 ./. 0/0 ./. 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/1 ./. 0/0 ./. 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 +chr1 50107735 . G GA . PASS VC=INDEL;AC=68;AF=0.22;AN=312 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 ./. 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 50539498 . T TCT . PASS VC=INDEL;AC=312;AF=0.99;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 50652516 . A AGAA . PASS VC=INDEL;AC=247;AF=0.78;AN=316;refseq.name=NM_021952;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 +chr1 51315116 . ACTG A . PASS VC=INDEL;AC=13;AF=0.04;AN=316;refseq.name=NM_007051;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 52336500 . TAATACA T . PASS VC=INDEL;AC=17;AF=0.07;AN=230;refseq.name=NM_002525;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 ./. 0/1 ./. ./. ./. 0/0 ./. ./. 0/0 ./. ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 ./. ./. ./. 0/1 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/1 0/1 0/1 ./. 0/0 0/0 0/0 ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 ./. 0/0 ./. ./. ./. 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 ./. ./. 0/0 ./. 0/0 0/0 ./. ./. ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. +chr1 52798171 . A AT . PASS VC=INDEL;AC=307;AF=0.97;AN=316;refseq.name=NM_004799;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 53554533 . A AT . PASS VC=INDEL;AC=33;AF=0.11;AN=294;refseq.name=NM_006671;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/0 ./. 0/1 ./. 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 ./. ./. 0/1 +chr1 53986946 . TG T . PASS VC=INDEL;AC=188;AF=0.59;AN=316;refseq.name=NM_147193;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 +chr1 54168427 . C CTCTG . PASS VC=INDEL;AC=109;AF=0.35;AN=308;refseq.name=NM_147193;refseq.positionType=intron GT 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 1/1 ./. 1/1 0/0 0/0 ./. 1/1 0/1 0/1 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 +chr1 54558546 . T TAGAC . PASS VC=INDEL;AC=66;AF=0.21;AN=316;refseq.name=NM_153035;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 54558548 . G GACAG . PASS VC=INDEL;AC=66;AF=0.21;AN=316;refseq.name=NM_153035;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 54619996 . AC A . PASS VC=INDEL;AC=193;AF=0.64;AN=302;refseq.name=NM_201546;refseq.positionType=promoter GT 1/1 0/0 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 ./. 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 ./. 1/1 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 ./. 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 ./. ./. 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 ./. 0/1 0/0 0/1 ./. 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 +chr1 54757161 . C CCA . PASS VC=INDEL;AC=186;AF=0.59;AN=314;refseq.name=NM_001009955;refseq.positionType=intron GT 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 ./. 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 +chr1 54757166 . C CAC . PASS VC=INDEL;AC=185;AF=0.59;AN=312;refseq.name=NM_001009955;refseq.positionType=intron GT 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 ./. 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 +chr1 55566411 . TTAGTC T . PASS VC=INDEL;AC=207;AF=0.66;AN=316;refseq.name=NM_015306;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 +chr1 55743440 . C CCT . PASS VC=INDEL;AC=261;AF=0.84;AN=312 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 ./. 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 +chr1 55888273 . T TC . PASS VC=INDEL;AC=265;AF=0.88;AN=302 GT 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 0/1 ./. 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 1/1 ./. 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 +chr1 55888274 . C CC . PASS VC=INDEL;AC=271;AF=0.89;AN=306 GT 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 ./. 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 +chr1 55892282 . T TAGAAAA . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 55998244 . CGCACGCTC C . PASS VC=INDEL;AC=265;AF=0.84;AN=314 GT 1/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 ./. 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 +chr1 56495367 . CTGAG C . PASS VC=INDEL;AC=76;AF=0.24;AN=316 GT 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 57353886 . C CTA . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_000562;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 57854490 . AAT A . PASS VC=INDEL;AC=24;AF=0.08;AN=312;refseq.name=NM_021080;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 58391942 . G GAAA . PASS VC=INDEL;AC=10;AF=0.03;AN=314;refseq.name=NM_021080;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 +chr1 58413348 . A AG . PASS VC=INDEL;AC=50;AF=0.22;AN=226;refseq.name=NM_021080;refseq.positionType=intron GT 0/0 ./. ./. 0/1 0/0 ./. 0/1 0/1 0/1 1/1 0/0 ./. ./. 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/0 ./. ./. 0/1 ./. ./. 0/1 0/0 0/0 0/0 ./. ./. ./. 1/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 ./. 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. ./. ./. ./. 0/1 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. ./. 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/1 ./. ./. ./. ./. ./. ./. 0/1 0/1 ./. 0/1 0/0 1/1 0/0 0/1 0/0 0/0 ./. ./. 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/1 1/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 ./. 0/0 0/0 ./. 0/1 ./. 0/1 ./. 1/1 ./. 1/1 +chr1 58550673 . CT C . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_021080;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 58629900 . CAGA C . PASS VC=INDEL;AC=15;AF=0.05;AN=316;refseq.name=NM_021080;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 58999156 . AT A . PASS VC=INDEL;AC=151;AF=0.53;AN=286;refseq.name=NM_145243;refseq.positionType=intron GT ./. 1/1 1/1 0/1 0/1 0/0 1/1 ./. 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 0/0 1/1 ./. 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/1 0/1 ./. 1/1 0/0 0/0 0/0 0/1 1/1 ./. 1/1 0/1 0/0 0/0 ./. 0/0 0/0 0/1 1/1 0/1 ./. 0/0 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/1 ./. 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 +chr1 59009401 . T TT . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_145243;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 59104181 . GA G . PASS VC=INDEL;AC=271;AF=0.89;AN=304 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 +chr1 59319761 . AG A . PASS VC=INDEL;AC=195;AF=0.67;AN=290 GT 0/0 0/1 0/0 0/0 ./. 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 ./. 0/0 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 ./. 1/1 0/1 1/1 1/1 1/1 0/1 ./. 0/1 1/1 0/1 ./. 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 ./. 1/1 1/1 ./. 1/1 0/0 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 ./. ./. 1/1 1/1 1/1 1/1 0/1 0/1 0/0 ./. 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 1/1 1/1 1/1 0/1 +chr1 59319762 . GG G . PASS VC=INDEL;AC=200;AF=0.68;AN=296 GT 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 ./. 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 ./. 1/1 0/1 0/1 0/1 1/1 ./. 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 0/1 ./. 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 ./. 1/1 ./. 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 1/1 1/1 1/1 0/1 +chr1 59630873 . CT C . PASS VC=INDEL;AC=155;AF=0.49;AN=316 GT 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 +chr1 59635600 . TAT T . PASS VC=INDEL;AC=287;AF=0.91;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +chr1 60128716 . G GC . PASS VC=INDEL;AC=309;AF=0.98;AN=316;refseq.name=NM_018291;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 60128717 . C CC . PASS VC=INDEL;AC=309;AF=0.98;AN=316;refseq.name=NM_018291;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 60228311 . T TCT . PASS VC=INDEL;AC=250;AF=0.8;AN=314;refseq.name=NM_018291;refseq.positionType=exon GT 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 +chr1 60460874 . A ACTA . PASS VC=INDEL;AC=316;AF=1;AN=316;refseq.name=NM_152377;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 61786308 . ATCTTA A . PASS VC=INDEL;AC=126;AF=0.4;AN=316;refseq.name=NM_005595;refseq.positionType=intron GT 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 +chr1 62087979 . T TGACCTACTGTGCT . PASS VC=INDEL;AC=194;AF=0.63;AN=310 GT 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 ./. 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 ./. 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 ./. 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 +chr1 62128942 . CTTGCACA C . PASS VC=INDEL;AC=123;AF=0.39;AN=316 GT 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 +chr1 62940266 . T TG . PASS VC=INDEL;AC=133;AF=0.43;AN=312;refseq.name=NM_033407;refseq.positionType=intron GT 0/0 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 +chr1 63331690 . TA T . PASS VC=INDEL;AC=234;AF=0.74;AN=316 GT 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 +chr1 63331691 . AA A . PASS VC=INDEL;AC=232;AF=0.74;AN=314 GT 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 ./. 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 +chr1 63423181 . T TCAT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 63907866 . A AATGTTT . PASS VC=INDEL;AC=229;AF=0.76;AN=300;refseq.name=NM_014288;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 ./. 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 ./. 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 0/1 0/1 ./. 1/1 ./. 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 ./. 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 63907868 . T TGTTTAT . PASS VC=INDEL;AC=229;AF=0.77;AN=298;refseq.name=NM_014288;refseq.positionType=intron GT ./. 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 ./. ./. 0/1 0/0 1/1 0/1 0/0 0/1 0/0 ./. 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 ./. 1/1 1/1 1/1 0/1 ./. 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 ./. 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 63985884 . ATCAT A . PASS VC=INDEL;AC=91;AF=0.31;AN=298;refseq.name=NM_014288;refseq.positionType=intron GT ./. 0/0 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/1 1/1 ./. 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 ./. 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 ./. 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 ./. 0/1 0/1 ./. 0/0 0/0 ./. 0/1 +chr1 63987096 . ATG A . PASS VC=INDEL;AC=37;AF=0.18;AN=202;refseq.name=NM_014288;refseq.positionType=intron GT ./. 0/0 0/1 ./. ./. ./. 0/0 0/1 ./. ./. ./. 0/0 ./. 0/1 0/0 0/1 0/0 ./. 0/0 ./. ./. 0/1 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 ./. 0/0 ./. 0/1 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/1 ./. 0/0 0/0 ./. ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/0 ./. 0/1 ./. ./. ./. ./. 0/0 ./. ./. ./. 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. 0/1 0/0 0/1 ./. ./. 0/1 0/0 0/1 ./. ./. 0/1 0/0 0/1 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/1 ./. 0/1 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/1 ./. ./. ./. 0/0 ./. 0/0 0/1 ./. 0/0 0/1 0/0 0/1 ./. ./. 0/0 0/1 ./. 0/1 0/0 0/1 0/1 0/1 0/1 +chr1 64264921 . TTGTGTCAT T . PASS VC=INDEL;AC=136;AF=0.46;AN=298;refseq.name=NM_005012;refseq.positionType=intron GT 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 ./. 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 ./. 0/1 ./. 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 ./. ./. 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 +chr1 64463351 . GT G . PASS VC=INDEL;AC=244;AF=0.77;AN=316;refseq.name=NM_005012;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 +chr1 64627261 . A AAA . PASS VC=INDEL;AC=79;AF=0.25;AN=316;refseq.name=NM_005012;refseq.positionType=intron GT 0/0 1/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 65237568 . G GGTTA . PASS VC=INDEL;AC=237;AF=0.75;AN=316;refseq.name=NM_018211;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 +chr1 65299673 . T TTAAG . PASS VC=INDEL;AC=10;AF=0.03;AN=314;refseq.name=NM_002227;refseq.positionType=exon GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 65545194 . A AT . PASS VC=INDEL;AC=316;AF=1;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 65545195 . T TT . PASS VC=INDEL;AC=316;AF=1;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 66063617 . ATGT A . PASS VC=INDEL;AC=212;AF=0.67;AN=316;refseq.name=NM_002303;refseq.positionType=intron GT 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 +chr1 66198019 . A ACCATCCA . PASS VC=INDEL;AC=76;AF=0.26;AN=296 GT 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 ./. 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 ./. ./. 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 ./. 0/0 ./. ./. 1/1 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 +chr1 66460193 . T TC . PASS VC=INDEL;AC=301;AF=0.95;AN=316;refseq.name=NM_001037341;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 66801086 . TGT T . PASS VC=INDEL;AC=19;AF=0.06;AN=316;refseq.name=NM_001037341;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 66952677 . A ATC . PASS VC=INDEL;AC=158;AF=0.65;AN=244 GT 0/1 1/1 1/1 0/0 1/1 ./. ./. 0/1 0/0 0/1 ./. 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 ./. 0/1 1/1 0/1 0/1 0/1 0/1 1/1 ./. 1/1 0/1 0/1 0/1 1/1 ./. 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 ./. 1/1 1/1 ./. 1/1 1/1 0/1 0/1 1/1 0/1 ./. 0/0 0/0 1/1 0/1 1/1 ./. 0/1 0/1 0/1 ./. 0/1 ./. 0/1 ./. ./. 1/1 0/1 ./. ./. 0/1 0/1 0/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 ./. 0/1 0/1 1/1 ./. ./. 0/1 0/1 0/1 1/1 1/1 ./. 0/1 0/0 ./. 0/1 ./. 0/1 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/1 ./. 1/1 0/1 0/1 ./. ./. 0/1 ./. 0/1 ./. 0/1 1/1 1/1 0/1 ./. 0/1 0/1 ./. 0/1 1/1 +chr1 67152254 . ATAATTTCACGA A . PASS VC=INDEL;AC=9;AF=0.03;AN=316;refseq.name=NM_032291;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 67206037 . AATTG A . PASS VC=INDEL;AC=50;AF=0.19;AN=268;refseq.name=NM_032291;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/1 ./. 0/0 0/0 0/1 0/1 ./. 0/0 0/1 0/0 0/0 0/1 ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 ./. ./. 0/0 0/1 ./. ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 ./. 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 ./. ./. 0/1 0/0 ./. ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/1 ./. ./. 0/1 0/1 0/1 ./. 0/0 0/1 0/0 ./. 0/1 1/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/1 +chr1 67459726 . T TT . PASS VC=INDEL;AC=54;AF=0.18;AN=300 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/1 0/1 0/0 0/1 ./. ./. 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 ./. +chr1 68038796 . ACA A . PASS VC=INDEL;AC=21;AF=0.08;AN=264 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/1 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 +chr1 68291788 . GC G . PASS VC=INDEL;AC=19;AF=0.06;AN=316;refseq.name=NM_018841;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 68570194 . CCCT C . PASS VC=INDEL;AC=110;AF=0.35;AN=310;refseq.name=NM_001002292;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 69008683 . C CA . PASS VC=INDEL;AC=68;AF=0.3;AN=230 GT 0/0 ./. 0/0 ./. 0/0 ./. 0/1 0/0 ./. ./. 0/0 1/1 ./. 1/1 0/0 0/0 0/0 0/1 0/1 ./. 0/1 1/1 ./. ./. 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/1 0/1 0/0 ./. ./. ./. 1/1 0/1 1/1 0/0 ./. 1/1 0/1 ./. 0/1 0/0 ./. 0/0 0/1 ./. 0/1 0/0 0/0 ./. 0/1 0/0 ./. ./. 1/1 ./. ./. 0/0 0/0 0/1 0/1 0/1 1/1 ./. 1/1 1/1 ./. 0/1 0/0 1/1 ./. ./. ./. 0/0 ./. 1/1 ./. ./. 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/1 ./. ./. ./. 0/1 0/1 ./. 0/1 0/0 0/0 0/0 0/1 ./. +chr1 69398928 . CAAC C . PASS VC=INDEL;AC=66;AF=0.21;AN=316 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 69424885 . AG A . PASS VC=INDEL;AC=257;AF=0.81;AN=316 GT 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 +chr1 69424886 . GG G . PASS VC=INDEL;AC=257;AF=0.81;AN=316 GT 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 +chr1 69702172 . T TT . PASS VC=INDEL;AC=186;AF=0.59;AN=316 GT 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 +chr1 69947085 . T TT . PASS VC=INDEL;AC=199;AF=0.87;AN=230 GT ./. 1/1 1/1 0/1 0/1 0/0 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 0/1 1/1 0/0 1/1 0/1 ./. ./. ./. 0/0 ./. 1/1 1/1 1/1 1/1 ./. ./. 1/1 ./. 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 0/1 0/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 ./. ./. 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 0/1 ./. 0/0 ./. ./. 1/1 ./. 1/1 ./. ./. 1/1 0/1 ./. 0/1 ./. 1/1 1/1 ./. 1/1 ./. 0/1 0/0 1/1 ./. 1/1 1/1 0/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 ./. ./. ./. ./. ./. ./. 1/1 1/1 1/1 0/1 1/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. ./. 1/1 1/1 +chr1 70116412 . T TAAT . PASS VC=INDEL;AC=236;AF=0.77;AN=308 GT 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 ./. 1/1 1/1 0/1 0/1 +chr1 70794740 . AAAAC A . PASS VC=INDEL;AC=49;AF=0.17;AN=288;refseq.name=NM_030816;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 ./. ./. 0/1 ./. 0/0 0/1 0/1 0/0 0/1 ./. ./. ./. 0/0 0/1 ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 ./. 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 70796576 . TTACTT T . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_030816;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 71101845 . TG T . PASS VC=INDEL;AC=38;AF=0.12;AN=310 GT 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 71353307 . AT A . PASS VC=INDEL;AC=88;AF=0.28;AN=310;refseq.name=NM_000957;refseq.positionType=intron GT 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/1 ./. 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 ./. 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 ./. 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 +chr1 71366228 . AA A . PASS VC=INDEL;AC=123;AF=0.39;AN=314;refseq.name=NM_000957;refseq.positionType=intron GT 1/1 1/1 0/0 1/1 1/1 0/0 1/1 ./. 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 +chr1 71366595 . A AAGTG . PASS VC=INDEL;AC=108;AF=0.34;AN=316;refseq.name=NM_000957;refseq.positionType=intron GT 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 +chr1 71366598 . T TGAGT . PASS VC=INDEL;AC=109;AF=0.34;AN=316;refseq.name=NM_000957;refseq.positionType=intron GT 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 +chr1 71693491 . TGAG T . PASS VC=INDEL;AC=32;AF=0.1;AN=312 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 71693493 . AGGA A . PASS VC=INDEL;AC=34;AF=0.11;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 72053145 . AG A . PASS VC=INDEL;AC=229;AF=0.72;AN=316;refseq.name=NM_173808;refseq.positionType=intron GT 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 +chr1 72321086 . AA A . PASS VC=INDEL;AC=54;AF=0.17;AN=314;refseq.name=NM_173808;refseq.positionType=intron GT 0/1 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 +chr1 73854019 . T TTTTA . PASS VC=INDEL;AC=181;AF=0.59;AN=308 GT 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 ./. 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 ./. 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 +chr1 74227801 . AG A . PASS VC=INDEL;AC=2;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 74404505 . TTT T . PASS VC=INDEL;AC=23;AF=0.07;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 74892891 . AG A . PASS VC=INDEL;AC=75;AF=0.24;AN=316;refseq.name=NM_001112808;refseq.positionType=intron GT 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 74896404 . ACTCAA A . PASS VC=INDEL;AC=26;AF=0.08;AN=316;refseq.name=NM_001112808;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 75049490 . C CT . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_001002912;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 75156563 . GCTT G . PASS VC=INDEL;AC=259;AF=0.82;AN=316 GT 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 +chr1 75661521 . TTCTT T . PASS VC=INDEL;AC=7;AF=0.02;AN=312 GT 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 76005746 . A AC . PASS VC=INDEL;AC=184;AF=0.58;AN=316;refseq.name=NM_152697;refseq.positionType=intron GT 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 +chr1 76054645 . AT A . PASS VC=INDEL;AC=14;AF=0.05;AN=290;refseq.name=NM_152697;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 +chr1 76110056 . ATCAT A . PASS VC=INDEL;AC=202;AF=0.7;AN=290 GT 0/0 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 ./. 1/1 ./. 0/1 0/0 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 0/0 1/1 0/1 1/1 1/1 ./. 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 ./. 0/0 0/0 0/0 0/1 0/1 ./. 0/1 0/1 1/1 ./. 1/1 1/1 0/0 0/1 0/0 1/1 0/1 ./. 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 ./. 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 ./. 1/1 +chr1 76110059 . ATTCA A . PASS VC=INDEL;AC=198;AF=0.68;AN=290 GT ./. 1/1 1/1 0/1 1/1 0/1 0/0 1/1 ./. 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 ./. 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 ./. 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 0/1 0/0 0/0 ./. 0/1 0/1 ./. 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 ./. 0/0 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 ./. 1/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 ./. 1/1 1/1 0/1 0/1 0/1 0/0 1/1 +chr1 76603385 . A AA . PASS VC=INDEL;AC=45;AF=0.14;AN=316;refseq.name=NM_152996;refseq.positionType=intron GT 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 76647177 . T TA . PASS VC=INDEL;AC=44;AF=0.15;AN=292;refseq.name=NM_152996;refseq.positionType=intron GT 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/1 0/1 0/0 0/1 ./. ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 ./. 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 +chr1 76772246 . TAG T . PASS VC=INDEL;AC=71;AF=0.22;AN=316;refseq.name=NM_152996;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 +chr1 77019040 . G GA . PASS VC=INDEL;AC=123;AF=0.39;AN=316;refseq.name=NM_152996;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 +chr1 77019568 . TTCTG T . PASS VC=INDEL;AC=72;AF=0.23;AN=316;refseq.name=NM_152996;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 +chr1 77147457 . T TG . PASS VC=INDEL;AC=307;AF=0.97;AN=316 GT 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 77154589 . T TA . PASS VC=INDEL;AC=300;AF=0.95;AN=316 GT 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 77350958 . GT G . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_030965;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 77412672 . T TCAAA . PASS VC=INDEL;AC=183;AF=0.58;AN=316;refseq.name=NM_030965;refseq.positionType=intron GT 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 +chr1 77412677 . C CAAAC . PASS VC=INDEL;AC=183;AF=0.58;AN=316;refseq.name=NM_030965;refseq.positionType=intron GT 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 +chr1 77761353 . ATTCT A . PASS VC=INDEL;AC=87;AF=0.28;AN=310;refseq.name=NM_174858;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 +chr1 78436001 . T TCT . PASS VC=INDEL;AC=139;AF=0.45;AN=308;refseq.name=NM_003902;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 ./. 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 ./. 1/1 1/1 ./. 1/1 ./. 0/1 0/0 0/0 0/0 +chr1 78477804 . T TAAGAC . PASS VC=INDEL;AC=294;AF=0.93;AN=316;refseq.name=NM_007034;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 78533885 . CAG C . PASS VC=INDEL;AC=126;AF=0.4;AN=316;refseq.name=NM_017655;refseq.positionType=intron GT 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 1/1 +chr1 78533886 . AGA A . PASS VC=INDEL;AC=126;AF=0.4;AN=316;refseq.name=NM_017655;refseq.positionType=intron GT 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 1/1 +chr1 78752617 . TC T . PASS VC=INDEL;AC=160;AF=0.51;AN=314 GT 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 ./. 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 +chr1 79595269 . T TC . PASS VC=INDEL;AC=37;AF=0.12;AN=312 GT 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 +chr1 79694557 . CTTGT C . PASS VC=INDEL;AC=173;AF=0.68;AN=254 GT 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 ./. ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 ./. 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 ./. ./. ./. ./. 0/0 0/1 0/1 ./. 0/1 0/1 ./. 0/0 0/1 ./. ./. 0/1 1/1 0/1 0/1 ./. 0/1 0/1 ./. ./. 0/1 ./. 1/1 ./. 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. ./. 1/1 ./. 1/1 1/1 1/1 0/1 1/1 ./. 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 ./. 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 ./. ./. 1/1 0/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 0/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 +chr1 80133716 . CA C . PASS VC=INDEL;AC=74;AF=0.27;AN=276 GT 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 ./. 0/0 ./. 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 ./. ./. 0/0 0/0 ./. 0/1 0/0 0/1 1/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/0 0/1 0/1 0/0 0/1 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 ./. 0/1 0/0 0/1 0/1 1/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. ./. 0/1 ./. 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 ./. 0/1 0/1 0/0 1/1 0/1 0/0 0/0 +chr1 80193527 . CA C . PASS VC=INDEL;AC=0;AF=0;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 80279810 . T TT . PASS VC=INDEL;AC=69;AF=0.22;AN=314 GT 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 +chr1 80415715 . C CATGTCTATTAT . PASS VC=INDEL;AC=197;AF=0.62;AN=316 GT 0/1 0/0 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 +chr1 80415717 . T TGTCTATTATAT . PASS VC=INDEL;AC=197;AF=0.62;AN=316 GT 0/1 0/0 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 +chr1 80606020 . GTAGGC G . PASS VC=INDEL;AC=282;AF=0.89;AN=316 GT 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 +chr1 80684057 . A AA . PASS VC=INDEL;AC=217;AF=0.69;AN=316 GT 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 1/1 1/1 +chr1 80857688 . AAATA A . PASS VC=INDEL;AC=97;AF=0.31;AN=316 GT 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 +chr1 81007659 . A AC . PASS VC=INDEL;AC=185;AF=0.59;AN=312 GT 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 ./. 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/0 0/0 +chr1 81007660 . C CC . PASS VC=INDEL;AC=185;AF=0.59;AN=314 GT 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/0 0/0 +chr1 81912884 . C CT . PASS VC=INDEL;AC=15;AF=0.05;AN=298 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 ./. 0/0 0/0 +chr1 82042397 . TCTT T . PASS VC=INDEL;AC=5;AF=0.02;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 82264610 . TG T . PASS VC=INDEL;AC=167;AF=0.54;AN=312;refseq.name=NM_012302;refseq.positionType=promoter GT 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 ./. 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 ./. 0/1 0/1 0/0 +chr1 82264994 . G GGTAG . PASS VC=INDEL;AC=49;AF=0.16;AN=316;refseq.name=NM_012302;refseq.positionType=promoter GT 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 +chr1 82280496 . ATGT A . PASS VC=INDEL;AC=84;AF=0.27;AN=316;refseq.name=NM_012302;refseq.positionType=intron GT 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 82315714 . G GAGTG . PASS VC=INDEL;AC=38;AF=0.12;AN=306;refseq.name=NM_012302;refseq.positionType=intron GT 0/1 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 +chr1 82316526 . TT T . PASS VC=INDEL;AC=209;AF=0.67;AN=312;refseq.name=NM_012302;refseq.positionType=intron GT 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 ./. 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 ./. 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 +chr1 82329993 . CATAT C . PASS VC=INDEL;AC=305;AF=0.97;AN=316;refseq.name=NM_012302;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 +chr1 82710650 . AA A . PASS VC=INDEL;AC=297;AF=0.96;AN=310 GT 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 83144930 . TC T . PASS VC=INDEL;AC=153;AF=0.55;AN=278 GT 1/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 1/1 0/1 0/0 0/1 ./. 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 ./. ./. 0/1 1/1 0/0 0/1 0/1 0/1 0/1 ./. 1/1 0/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 ./. 0/1 0/1 1/1 1/1 0/1 0/0 0/1 ./. 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 ./. 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 ./. 1/1 0/0 ./. 0/1 0/1 0/0 0/1 ./. 0/0 0/1 1/1 0/1 1/1 ./. 0/0 0/0 ./. 0/1 0/0 ./. 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 0/0 ./. 0/0 1/1 ./. ./. 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 ./. 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 +chr1 83208212 . C CAGAT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 83208213 . A AGATA . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 83581070 . C CCAGA . PASS VC=INDEL;AC=188;AF=0.74;AN=254 GT ./. ./. 1/1 0/1 ./. 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 0/1 ./. ./. ./. 1/1 1/1 ./. 0/0 0/1 0/1 1/1 ./. 0/1 1/1 0/1 0/1 ./. 0/0 1/1 0/1 0/1 ./. ./. 0/1 1/1 ./. 1/1 0/1 0/1 ./. ./. 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 ./. 0/1 0/0 0/1 ./. 0/1 1/1 1/1 1/1 0/1 ./. 1/1 0/1 0/1 ./. ./. ./. 0/1 1/1 ./. 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 0/1 0/1 ./. 1/1 0/1 1/1 ./. ./. 0/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 ./. 1/1 +chr1 84127066 . TCT T . PASS VC=INDEL;AC=71;AF=0.22;AN=316 GT 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +chr1 84822658 . TCAATTAAAACTCACAG T . PASS VC=INDEL;AC=45;AF=0.16;AN=286 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 ./. 0/1 1/1 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 ./. 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 ./. 0/1 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 ./. 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 +chr1 85570521 . GTTC G . PASS VC=INDEL;AC=166;AF=0.53;AN=316;refseq.name=NM_145172;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 +chr1 86565855 . T TCT . PASS VC=INDEL;AC=20;AF=0.06;AN=316;refseq.name=NM_152890;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr1 86714492 . T TA . PASS VC=INDEL;AC=263;AF=0.88;AN=300 GT 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 ./. 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 ./. 1/1 1/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 +chr1 86786541 . CAG C . PASS VC=INDEL;AC=7;AF=0.02;AN=316 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 86839425 . TACTT T . PASS VC=INDEL;AC=15;AF=0.05;AN=280;refseq.name=NM_001007022;refseq.positionType=intron GT 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 +chr1 87558067 . CACATAC C . PASS VC=INDEL;AC=285;AF=0.97;AN=294;refseq.name=NM_012262;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 0/1 1/1 1/1 +chr1 88184554 . T TCA . PASS VC=INDEL;AC=40;AF=0.14;AN=276 GT 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 1/1 ./. 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/1 ./. 0/0 ./. ./. 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/1 0/1 +chr1 88351056 . A AGT . PASS VC=INDEL;AC=222;AF=0.7;AN=316 GT 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 +chr1 88391828 . C CCTT . PASS VC=INDEL;AC=216;AF=0.7;AN=310 GT 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 ./. 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 +chr1 88391834 . T TCTT . PASS VC=INDEL;AC=219;AF=0.69;AN=316 GT 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 +chr1 88423056 . T TA . PASS VC=INDEL;AC=210;AF=0.8;AN=262 GT 1/1 0/0 1/1 ./. 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 ./. ./. ./. 1/1 1/1 ./. 0/1 0/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 0/1 1/1 0/1 0/1 ./. ./. 0/1 0/1 1/1 0/1 0/1 0/1 0/1 ./. ./. ./. 1/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 ./. 1/1 ./. 0/0 0/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/0 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 ./. 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 88878932 . TGAAG T . PASS VC=INDEL;AC=222;AF=0.71;AN=314 GT 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 ./. 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 88934449 . T TA . PASS VC=INDEL;AC=215;AF=0.71;AN=304 GT 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 ./. 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/0 ./. 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 +chr1 89147233 . C CTG . PASS VC=INDEL;AC=270;AF=0.94;AN=288;refseq.name=NM_006256;refseq.positionType=promoter GT 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 ./. ./. 1/1 1/1 0/1 0/1 ./. 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 ./. 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 89147234 . T TGT . PASS VC=INDEL;AC=193;AF=0.91;AN=212;refseq.name=NM_006256;refseq.positionType=promoter GT ./. 1/1 1/1 1/1 ./. ./. 1/1 1/1 ./. 1/1 ./. ./. 1/1 1/1 ./. 1/1 ./. ./. ./. ./. ./. 1/1 1/1 ./. 0/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 ./. ./. ./. 1/1 1/1 ./. 0/1 ./. 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 ./. ./. ./. ./. ./. ./. ./. 1/1 ./. 1/1 ./. ./. ./. 0/1 ./. 1/1 ./. ./. 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. ./. 1/1 1/1 ./. 1/1 0/1 0/1 ./. 0/0 0/1 ./. ./. ./. ./. 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. ./. 1/1 ./. ./. ./. 1/1 +chr1 90055475 . TT T . PASS VC=INDEL;AC=35;AF=0.11;AN=316;refseq.name=NM_015350;refseq.positionType=intron GT 0/1 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 90055577 . TATG T . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_015350;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 90305331 . G GA . PASS VC=INDEL;AC=301;AF=0.95;AN=316;refseq.name=NM_018103;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 91238816 . G GT . PASS VC=INDEL;AC=86;AF=0.29;AN=296 GT 0/0 0/0 ./. 1/1 0/0 0/0 0/1 ./. 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 ./. 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 ./. 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 1/1 ./. 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 ./. 0/0 0/0 1/1 0/1 1/1 1/1 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/0 ./. 0/1 +chr1 91308113 . GC G . PASS VC=INDEL;AC=8;AF=0.03;AN=282 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/1 0/1 ./. 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 +chr1 91354296 . TT T . PASS VC=INDEL;AC=252;AF=0.83;AN=304 GT 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 ./. 1/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. ./. 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 ./. 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 +chr1 91544957 . ACT A . PASS VC=INDEL;AC=99;AF=0.32;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 +chr1 91566585 . GTTA G . PASS VC=INDEL;AC=139;AF=0.45;AN=312 GT 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 +chr1 92219769 . C CTCCTCAA . PASS VC=INDEL;AC=54;AF=0.17;AN=314;refseq.name=NM_003243;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 93167519 . C CTG . PASS VC=INDEL;AC=276;AF=1;AN=276;refseq.name=NM_005665;refseq.positionType=intron GT 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 ./. 1/1 ./. 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. ./. 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 93628710 . TACTC T . PASS VC=INDEL;AC=94;AF=0.31;AN=304;refseq.name=NM_016040;refseq.positionType=intron GT 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 ./. 0/0 0/1 1/1 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 ./. 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/1 +chr1 93704043 . T TCTAGAAAAATC . PASS VC=INDEL;AC=7;AF=0.02;AN=306;refseq.name=NM_206886;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 94443843 . G GAGAG . PASS VC=INDEL;AC=88;AF=0.3;AN=292 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 ./. 0/0 0/0 0/1 ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 ./. 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 ./. 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 ./. 0/0 +chr1 94634727 . TGAGT T . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_004815;refseq.positionType=exon GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 95103314 . AGCATCCTAAA A . PASS VC=INDEL;AC=6;AF=0.03;AN=240 GT ./. ./. 0/0 0/0 0/0 ./. ./. 0/1 0/0 ./. 0/0 ./. 0/0 0/0 ./. ./. ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 95167241 . TTAAC T . PASS VC=INDEL;AC=115;AF=0.36;AN=316 GT 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 +chr1 95167244 . ACTAA A . PASS VC=INDEL;AC=116;AF=0.37;AN=316 GT 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 +chr1 95266356 . A AAAATAAGAATCCA . PASS VC=INDEL;AC=212;AF=0.83;AN=256 GT 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 ./. ./. ./. 0/0 1/1 0/0 0/1 ./. 0/1 0/1 1/1 1/1 1/1 ./. 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 0/1 1/1 0/1 0/0 0/1 1/1 1/1 ./. 1/1 ./. 1/1 0/1 1/1 0/1 1/1 ./. ./. 0/1 ./. 0/1 1/1 0/1 0/1 0/1 ./. 0/1 ./. 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 ./. 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 ./. ./. ./. 0/1 0/1 1/1 ./. 0/1 1/1 0/1 0/1 0/1 1/1 1/1 ./. 0/1 ./. 1/1 ./. ./. ./. +chr1 95349846 . G GG . PASS VC=INDEL;AC=195;AF=0.65;AN=302;refseq.name=NM_001114106;refseq.positionType=intron GT 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 ./. 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 ./. 1/1 0/1 ./. 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 ./. 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 ./. 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 ./. 0/1 0/1 0/1 1/1 1/1 +chr1 95638470 . GTAG G . PASS VC=INDEL;AC=9;AF=0.03;AN=306;refseq.name=NM_152487;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 96578762 . CAG C . PASS VC=INDEL;AC=78;AF=0.25;AN=314 GT 1/1 0/0 0/0 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 +chr1 97069290 . G GT . PASS VC=INDEL;AC=57;AF=0.18;AN=316 GT 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 97352585 . A AGA . PASS VC=INDEL;AC=167;AF=0.53;AN=316 GT 0/0 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 +chr1 97471673 . T TTA . PASS VC=INDEL;AC=39;AF=0.16;AN=238 GT 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/1 0/0 1/1 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 1/1 ./. 0/1 ./. 1/1 0/1 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 ./. ./. 0/1 0/0 0/0 0/1 ./. 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 ./. ./. 0/0 ./. ./. ./. 0/0 0/0 0/0 ./. 0/1 ./. 0/0 ./. 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 ./. ./. ./. ./. 0/0 0/1 ./. ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/1 0/0 0/1 0/0 ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/1 +chr1 97654513 . GTTAT G . PASS VC=INDEL;AC=17;AF=0.06;AN=302;refseq.name=NM_000110;refseq.positionType=intron GT ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 97728316 . AATA A . PASS VC=INDEL;AC=15;AF=0.05;AN=316;refseq.name=NM_000110;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 +chr1 97862494 . TCCT T . PASS VC=INDEL;AC=47;AF=0.18;AN=256;refseq.name=NM_000110;refseq.positionType=intron GT 0/0 0/1 ./. 0/1 0/0 0/1 ./. 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 ./. 0/1 1/1 0/0 0/0 ./. ./. 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/1 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 ./. 0/1 0/1 ./. ./. 0/1 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 1/1 ./. 0/1 0/1 0/1 ./. 0/1 0/1 0/1 0/0 ./. 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 ./. +chr1 97940369 . TAACT T . PASS VC=INDEL;AC=37;AF=0.12;AN=306;refseq.name=NM_000110;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/0 0/1 0/0 ./. ./. 0/1 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr1 98400957 . C CGATAT . PASS VC=INDEL;AC=290;AF=0.92;AN=316 GT 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 99032443 . T TTC . PASS VC=INDEL;AC=230;AF=0.79;AN=292 GT 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 ./. ./. ./. ./. 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 ./. 0/1 1/1 1/1 1/1 ./. 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 ./. 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 ./. 0/0 1/1 +chr1 99032444 . T TCT . PASS VC=INDEL;AC=236;AF=0.8;AN=296 GT 0/1 0/1 0/1 1/1 1/1 ./. 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. ./. 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 ./. 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 ./. 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 1/1 0/1 1/1 0/0 1/1 +chr1 99662955 . A AAGA . PASS VC=INDEL;AC=146;AF=0.46;AN=316 GT 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 +chr1 99714941 . GTTACAG G . PASS VC=INDEL;AC=6;AF=0.02;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 99848725 . AT A . PASS VC=INDEL;AC=50;AF=0.16;AN=316 GT 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 100194878 . C CCT . PASS VC=INDEL;AC=248;AF=0.78;AN=316;refseq.name=NM_001013660;refseq.positionType=intron GT 1/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 1/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +chr1 100194903 . C CT . PASS VC=INDEL;AC=7;AF=0.02;AN=316;refseq.name=NM_001013660;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 100567908 . C CT . PASS VC=INDEL;AC=43;AF=0.14;AN=300;refseq.name=NM_194292;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. ./. 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 ./. 0/0 0/1 0/1 0/1 0/0 0/0 +chr1 100793875 . CACTC C . PASS VC=INDEL;AC=105;AF=0.38;AN=274 GT 0/0 0/1 0/1 ./. 0/1 1/1 0/0 ./. 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/1 0/1 1/1 ./. 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 ./. 0/1 0/1 0/0 ./. 0/1 ./. 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/1 0/1 0/1 ./. ./. 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 ./. 0/1 0/1 ./. 0/1 0/1 0/0 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 1/1 ./. 0/1 1/1 0/1 0/0 0/0 ./. 0/0 0/1 ./. 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 ./. 1/1 0/1 ./. ./. 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/1 0/0 +chr1 100808351 . TT T . PASS VC=INDEL;AC=27;AF=0.09;AN=294 GT ./. 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 ./. 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 ./. 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 100856872 . T TT . PASS VC=INDEL;AC=79;AF=0.25;AN=316;refseq.name=NM_003672;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 +chr1 101093845 . TTCTGTAGTCAC T . PASS VC=INDEL;AC=24;AF=0.08;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 101295925 . CTA C . PASS VC=INDEL;AC=82;AF=0.26;AN=314 GT 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 ./. 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 +chr1 101442572 . T TT . PASS VC=INDEL;AC=99;AF=0.31;AN=316;refseq.name=NM_133496;refseq.positionType=exon GT 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 +chr1 101482924 . CTGTG C . PASS VC=INDEL;AC=32;AF=0.1;AN=316;refseq.name=NM_001077394;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 101859015 . G GA . PASS VC=INDEL;AC=107;AF=0.34;AN=316 GT 1/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 +chr1 102315705 . A ATCTC . PASS VC=INDEL;AC=185;AF=0.59;AN=316;refseq.name=NM_058170;refseq.positionType=intron GT 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 +chr1 102315708 . T TCTCT . PASS VC=INDEL;AC=185;AF=0.59;AN=316;refseq.name=NM_058170;refseq.positionType=intron GT 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 +chr1 103391817 . TTA T . PASS VC=INDEL;AC=0;AF=0;AN=244;refseq.name=NM_001854;refseq.positionType=intron GT 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. ./. ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. ./. 0/0 0/0 +chr1 103722297 . TGT T . PASS VC=INDEL;AC=32;AF=0.1;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +chr1 104533187 . A AGTT . PASS VC=INDEL;AC=148;AF=0.47;AN=316 GT 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 +chr1 104896267 . GAG G . PASS VC=INDEL;AC=48;AF=0.15;AN=312 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr1 104896390 . ATATT A . PASS VC=INDEL;AC=38;AF=0.14;AN=268 GT 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 ./. ./. 0/0 1/1 0/0 ./. 0/1 1/1 ./. 1/1 0/0 0/0 0/0 ./. 0/0 0/1 ./. 0/0 ./. 0/1 0/0 0/0 1/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/1 0/0 1/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 1/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/1 0/0 +chr1 105259435 . CACTAAACGTGCC C . PASS VC=INDEL;AC=6;AF=0.02;AN=250 GT ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. ./. 0/0 ./. ./. 0/0 0/0 ./. ./. 0/1 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 ./. 0/0 +chr1 105451424 . A ATCTAGT . PASS VC=INDEL;AC=98;AF=0.31;AN=316 GT 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 +chr1 105504523 . C CTTT . PASS VC=INDEL;AC=82;AF=0.29;AN=282 GT ./. 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/1 0/0 ./. 0/1 0/1 0/1 ./. 1/1 0/0 0/1 0/0 ./. 1/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 ./. 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 ./. ./. 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/1 0/1 0/1 0/0 0/1 ./. 0/0 1/1 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/1 ./. 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 1/1 +chr1 105837170 . T TAA . PASS VC=INDEL;AC=67;AF=0.24;AN=280 GT 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 ./. 0/0 0/1 1/1 1/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/0 0/1 ./. ./. 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 ./. 0/1 1/1 0/1 1/1 ./. ./. ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/1 ./. 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. ./. 0/0 +chr1 105868766 . ATACTT A . PASS VC=INDEL;AC=92;AF=0.34;AN=274 GT ./. 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 ./. 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 ./. 0/0 1/1 0/1 0/0 ./. 1/1 ./. 1/1 0/1 1/1 0/0 ./. ./. ./. 0/0 0/1 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/1 ./. ./. ./. 0/0 0/0 0/0 1/1 0/1 0/1 0/0 ./. 1/1 0/1 ./. 0/1 ./. 1/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 +chr1 106762526 . AACT A . PASS VC=INDEL;AC=87;AF=0.28;AN=316 GT 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 +chr1 106908645 . AC A . PASS VC=INDEL;AC=25;AF=0.08;AN=316 GT 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 +chr1 107217236 . A AGGATCA . PASS VC=INDEL;AC=240;AF=0.79;AN=302 GT 1/1 1/1 ./. 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/0 1/1 ./. 1/1 1/1 ./. 1/1 0/0 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 ./. 0/0 0/0 0/0 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 ./. 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 107979567 . TT T . PASS VC=INDEL;AC=150;AF=0.55;AN=274;refseq.name=NM_001113226;refseq.positionType=intron GT 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 ./. 1/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 ./. ./. 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 ./. 0/1 0/0 1/1 ./. ./. 0/1 1/1 1/1 1/1 0/0 1/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/0 1/1 ./. 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 ./. 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 1/1 ./. 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 ./. 0/1 0/1 0/0 0/1 ./. 1/1 ./. 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 ./. 0/0 1/1 0/1 ./. 0/1 1/1 0/0 1/1 0/1 0/1 1/1 ./. 0/1 0/1 0/1 ./. 1/1 1/1 0/1 1/1 +chr1 108737087 . GG G . PASS VC=INDEL;AC=99;AF=0.32;AN=308;refseq.name=NM_013386;refseq.positionType=intron GT 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 ./. 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 +chr1 109186604 . A ATA . PASS VC=INDEL;AC=3;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 109295950 . TA T . PASS VC=INDEL;AC=54;AF=0.17;AN=312;refseq.name=NM_007269;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +chr1 109295955 . TTA T . PASS VC=INDEL;AC=57;AF=0.18;AN=310;refseq.name=NM_007269;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +chr1 109303951 . GTATAG G . PASS VC=INDEL;AC=89;AF=0.28;AN=316;refseq.name=NM_007269;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 +chr1 109429108 . G GGAGAAAT . PASS VC=INDEL;AC=33;AF=0.14;AN=234;refseq.name=NM_013296;refseq.positionType=intron GT 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 ./. 0/1 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/1 ./. ./. 0/1 ./. 0/1 0/1 ./. ./. ./. 0/1 ./. 0/1 ./. 0/1 0/1 ./. ./. 0/1 ./. 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. ./. ./. 0/1 ./. 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/1 +chr1 109565068 . C CTC . PASS VC=INDEL;AC=304;AF=0.96;AN=316;refseq.name=NM_014969;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 +chr1 110418161 . CTTAG C . PASS VC=INDEL;AC=56;AF=0.18;AN=316 GT 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 +chr1 110911466 . AT A . PASS VC=INDEL;AC=67;AF=0.22;AN=310;refseq.name=NM_004696;refseq.positionType=intron GT 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 +chr1 111820993 . TTAAG T . PASS VC=INDEL;AC=46;AF=0.2;AN=232 GT 0/1 ./. 1/1 ./. 0/0 ./. 0/1 0/1 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/0 0/0 0/1 1/1 ./. 0/1 0/0 0/1 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/0 0/0 0/1 ./. ./. ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 ./. 0/0 0/1 ./. ./. 0/0 0/1 0/1 0/1 0/1 0/0 0/0 ./. ./. 0/1 ./. ./. 0/0 0/1 ./. 0/0 ./. 0/1 ./. 0/0 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/1 ./. 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 ./. ./. ./. 0/0 0/0 0/1 0/0 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/1 ./. ./. ./. +chr1 111894729 . C CATG . PASS VC=INDEL;AC=32;AF=0.11;AN=302;refseq.name=NM_181643;refseq.positionType=exon GT 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/1 0/0 +chr1 112384059 . G GG . PASS VC=INDEL;AC=111;AF=0.35;AN=314;refseq.name=NM_004980;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 1/1 +chr1 112440856 . A ACTTA . PASS VC=INDEL;AC=138;AF=0.44;AN=312;refseq.name=NM_004980;refseq.positionType=intron GT 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/1 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 +chr1 112896532 . CTAAC C . PASS VC=INDEL;AC=1;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 112896636 . CA C . PASS VC=INDEL;AC=199;AF=0.64;AN=312 GT 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 ./. 1/1 0/0 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 ./. 1/1 +chr1 112896637 . AA A . PASS VC=INDEL;AC=199;AF=0.63;AN=316 GT 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 +chr1 113322895 . TTCTA T . PASS VC=INDEL;AC=73;AF=0.3;AN=246 GT 0/0 ./. 0/1 0/0 ./. 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 ./. 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 1/1 0/1 0/0 0/0 0/0 ./. ./. ./. 1/1 0/0 1/1 1/1 0/1 0/1 1/1 ./. ./. ./. 0/0 0/1 1/1 0/0 0/1 ./. ./. 0/0 ./. 0/1 1/1 0/1 0/0 0/1 0/1 ./. 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 ./. 0/0 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 0/1 ./. ./. ./. ./. ./. 0/0 0/1 1/1 ./. 0/0 0/0 0/0 ./. 0/0 0/1 ./. 0/1 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 ./. 0/0 0/0 1/1 0/0 0/1 0/0 0/0 ./. ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 ./. 0/0 ./. 0/0 0/0 +chr1 113467083 . CC C . PASS VC=INDEL;AC=1;AF=0;AN=316;refseq.name=NM_003051;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 113635187 . C CTTTG . PASS VC=INDEL;AC=261;AF=0.83;AN=316;refseq.name=NM_014813;refseq.positionType=intron GT 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 +chr1 113635190 . T TGTTT . PASS VC=INDEL;AC=261;AF=0.83;AN=316;refseq.name=NM_014813;refseq.positionType=intron GT 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 +chr1 113640553 . GA G . PASS VC=INDEL;AC=111;AF=0.35;AN=314;refseq.name=NM_014813;refseq.positionType=intron GT 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 ./. 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 +chr1 113640556 . AA A . PASS VC=INDEL;AC=112;AF=0.35;AN=316;refseq.name=NM_014813;refseq.positionType=intron GT 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 +chr1 113689905 . GAG G . PASS VC=INDEL;AC=41;AF=0.13;AN=316 GT 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 114240320 . A AA . PASS VC=INDEL;AC=229;AF=0.72;AN=316;refseq.name=NM_006608;refseq.positionType=exon GT 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 114339956 . C CTAAA . PASS VC=INDEL;AC=210;AF=0.78;AN=270;refseq.name=NM_018364;refseq.positionType=intron GT 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. ./. 1/1 0/1 0/0 0/1 1/1 0/0 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/1 ./. 1/1 ./. ./. 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 ./. ./. ./. 0/0 0/1 0/1 ./. ./. 0/0 0/1 0/0 0/1 ./. 0/0 ./. 0/1 0/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 114565357 . CGGAGG C . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 116298599 . A ACTT . PASS VC=INDEL;AC=54;AF=0.17;AN=316;refseq.name=NM_001232;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 +chr1 116435014 . ATAACCGA A . PASS VC=INDEL;AC=66;AF=0.26;AN=250 GT 1/1 1/1 ./. 1/1 0/1 0/1 0/1 ./. 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 ./. 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/1 ./. 0/0 0/0 0/1 0/0 1/1 0/0 ./. ./. 0/1 0/0 0/0 0/0 0/1 ./. 1/1 ./. 0/0 0/1 0/1 0/0 0/0 0/1 ./. 1/1 1/1 0/1 0/1 ./. 0/0 1/1 ./. 0/0 1/1 0/1 1/1 ./. 1/1 0/0 ./. 1/1 0/1 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. ./. ./. 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/1 0/0 0/0 ./. 0/1 0/1 +chr1 116551982 . T TTAAAGC . PASS VC=INDEL;AC=31;AF=0.1;AN=304;refseq.name=NM_018420;refseq.positionType=intron GT 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 116662025 . T TGA . PASS VC=INDEL;AC=55;AF=0.17;AN=316;refseq.name=NM_152367;refseq.positionType=intron GT 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 +chr1 116662028 . G GAG . PASS VC=INDEL;AC=55;AF=0.17;AN=316;refseq.name=NM_152367;refseq.positionType=intron GT 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 +chr1 117459931 . AAC A . PASS VC=INDEL;AC=90;AF=0.28;AN=316;refseq.name=NM_020440;refseq.positionType=intron GT 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 117459932 . ACA A . PASS VC=INDEL;AC=90;AF=0.28;AN=316;refseq.name=NM_020440;refseq.positionType=intron GT 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 117592136 . TTG T . PASS VC=INDEL;AC=24;AF=0.08;AN=300 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. +chr1 117722836 . C CA . PASS VC=INDEL;AC=36;AF=0.11;AN=316;refseq.name=NM_024626;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 +chr1 120034138 . TCTAT T . PASS VC=INDEL;AC=99;AF=0.35;AN=284 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/1 0/0 ./. 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/0 ./. 0/1 0/1 0/1 ./. 0/1 0/1 0/1 ./. 0/1 0/1 0/0 1/1 0/1 1/1 ./. 0/1 0/1 0/1 0/1 0/1 1/1 1/1 ./. 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 ./. ./. 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/0 ./. 0/1 0/0 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/0 ./. 0/1 0/0 0/0 0/1 ./. 1/1 1/1 0/0 0/0 +chr1 120185496 . G GGATT . PASS VC=INDEL;AC=264;AF=0.84;AN=314;refseq.name=NM_001080470;refseq.positionType=intron GT 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 120280730 . TAA T . PASS VC=INDEL;AC=73;AF=0.23;AN=314;refseq.name=NM_006623;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 +chr1 144995277 . AG A . PASS VC=INDEL;AC=41;AF=0.16;AN=258;refseq.name=NM_014644;refseq.positionType=promoter GT 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/1 0/0 ./. 0/1 ./. ./. 0/0 ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 ./. 0/1 0/1 0/1 0/0 ./. ./. ./. 0/0 ./. ./. 0/0 0/1 0/1 ./. 0/1 0/1 0/0 0/0 ./. ./. ./. 0/1 0/0 ./. 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 ./. 0/1 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 +chr1 145060382 . A AG . PASS VC=INDEL;AC=316;AF=1;AN=316;refseq.name=NM_022359;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 146556039 . CCAAC C . PASS VC=INDEL;AC=64;AF=0.21;AN=310 GT 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 ./. ./. 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 +chr1 146768690 . TC T . PASS VC=INDEL;AC=289;AF=0.91;AN=316 GT 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 +chr1 146979526 . CCT C . PASS VC=INDEL;AC=63;AF=0.2;AN=316 GT 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 +chr1 147047674 . AA A . PASS VC=INDEL;AC=101;AF=0.32;AN=314;refseq.name=NM_004326;refseq.positionType=intron GT 0/1 0/1 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 +chr1 147108091 . A AC . PASS VC=INDEL;AC=227;AF=0.72;AN=314 GT 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 ./. 1/1 +chr1 147392223 . CATGGCTC C . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 147393527 . A AAGAA . PASS VC=INDEL;AC=10;AF=0.05;AN=218 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 ./. ./. 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/1 0/0 ./. 0/0 0/0 ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. ./. 0/0 0/0 ./. 0/0 ./. ./. ./. ./. 0/0 0/1 ./. ./. ./. ./. 0/0 0/0 0/0 0/1 ./. 0/1 ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 +chr1 147823728 . A AC . PASS VC=INDEL;AC=2;AF=0.01;AN=266 GT 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 ./. ./. ./. ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 +chr1 151094921 . T TA . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 151094936 . CCTTA C . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 151743871 . AA A . PASS VC=INDEL;AC=98;AF=0.32;AN=308;refseq.name=NM_016178;refseq.positionType=terminator GT 1/1 0/1 ./. 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 ./. 0/1 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 ./. 0/0 0/1 1/1 1/1 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 1/1 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 +chr1 152348228 . TTAT T . PASS VC=INDEL;AC=9;AF=0.03;AN=316 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 152442163 . AAACA A . PASS VC=INDEL;AC=212;AF=0.68;AN=310 GT 0/1 ./. 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 ./. 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 +chr1 152572426 . G GT . PASS VC=INDEL;AC=70;AF=0.25;AN=280;refseq.name=NM_178434;refseq.positionType=promoter GT 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 1/1 0/0 0/1 ./. 0/0 ./. 0/1 0/0 0/0 0/0 ./. ./. 0/1 0/1 0/1 0/1 ./. 0/0 0/0 0/0 0/1 0/1 ./. 0/1 ./. 0/0 ./. ./. 0/1 0/1 ./. 1/1 ./. 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/0 ./. 0/1 0/0 0/0 1/1 ./. 1/1 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. 1/1 0/1 0/0 +chr1 152797773 . C CC . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_178348;refseq.positionType=promoter GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 153703019 . TGTGTCTCTGCTT T . PASS VC=INDEL;AC=1;AF=0;AN=316;refseq.name=NM_023015;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 154741714 . TAT T . PASS VC=INDEL;AC=1;AF=0;AN=316;refseq.name=NM_002249;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 155303581 . AT A . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 155559888 . C CTTAT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 156565049 . A AAC . PASS VC=INDEL;AC=314;AF=0.99;AN=316;refseq.name=NM_015590;refseq.positionType=exon GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 156572952 . T TGAA . PASS VC=INDEL;AC=39;AF=0.12;AN=312;refseq.name=NM_015590;refseq.positionType=promoter GT 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 156859572 . C CCT . PASS VC=INDEL;AC=219;AF=0.73;AN=300 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 ./. 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 ./. 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 ./. 0/0 ./. 0/1 0/0 0/0 0/0 ./. ./. 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 +chr1 156910892 . GCTCGTCTT G . PASS VC=INDEL;AC=39;AF=0.14;AN=270;refseq.name=NM_014784;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/1 0/0 ./. ./. 0/0 0/1 ./. ./. 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. ./. ./. 0/0 0/1 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 ./. ./. 0/0 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/1 ./. ./. 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 +chr1 157531425 . CA C . PASS VC=INDEL;AC=16;AF=0.06;AN=260 GT 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 ./. 0/0 ./. 0/0 0/0 ./. ./. 0/1 ./. ./. 0/1 ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/1 ./. 0/0 0/1 ./. 0/1 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 +chr1 157807166 . TGTTA T . PASS VC=INDEL;AC=250;AF=0.81;AN=310;refseq.name=NM_005894;refseq.positionType=intron GT 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 +chr1 157818429 . AC A . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 157924621 . ATAAG A . PASS VC=INDEL;AC=24;AF=0.08;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 157932325 . T TT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 158154060 . CT C . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_001766;refseq.positionType=exon GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 158684734 . CA C . PASS VC=INDEL;AC=90;AF=0.28;AN=316 GT 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 +chr1 158886780 . A AAGAT . PASS VC=INDEL;AC=241;AF=0.76;AN=316 GT 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 +chr1 158886783 . A ATAGA . PASS VC=INDEL;AC=240;AF=0.76;AN=314 GT 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 ./. 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 +chr1 158984187 . G GAGGC . PASS VC=INDEL;AC=26;AF=0.13;AN=198;refseq.name=NM_005531;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 1/1 1/1 ./. ./. 0/0 0/0 0/0 1/1 0/0 1/1 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 ./. ./. ./. 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 1/1 ./. ./. 0/0 ./. 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 ./. ./. 0/0 ./. ./. ./. 0/0 ./. ./. ./. 1/1 1/1 1/1 ./. 1/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 1/1 1/1 ./. 0/0 ./. 0/0 ./. ./. 0/0 ./. ./. ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. ./. ./. ./. 1/1 1/1 +chr1 158984259 . AATT A . PASS VC=INDEL;AC=130;AF=0.49;AN=266;refseq.name=NM_005531;refseq.positionType=intron GT ./. 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 ./. 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 ./. 1/1 1/1 0/1 ./. 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/0 ./. 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 ./. 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 ./. 0/1 ./. 1/1 0/0 0/1 0/1 1/1 0/1 ./. ./. 0/0 0/0 ./. 0/1 1/1 0/1 0/1 1/1 ./. ./. 0/0 0/1 0/0 0/1 1/1 ./. 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 ./. 0/0 0/1 0/0 ./. 0/0 0/1 0/1 ./. 0/1 0/1 ./. ./. ./. ./. ./. 0/1 0/1 1/1 0/1 0/1 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 +chr1 159500234 . CT C . PASS VC=INDEL;AC=19;AF=0.06;AN=316 GT 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 159741079 . TGT T . PASS VC=INDEL;AC=163;AF=0.52;AN=314 GT 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 ./. 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 +chr1 160004099 . GATGTAGATAG G . PASS VC=INDEL;AC=3;AF=0.01;AN=314;refseq.name=NM_145167;refseq.positionType=promoter GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 160081222 . TGAAAAG T . PASS VC=INDEL;AC=5;AF=0.02;AN=312 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 160430789 . C CAG . PASS VC=INDEL;AC=51;AF=0.16;AN=314 GT 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 +chr1 160464965 . AGTGAATTTTAGA A . PASS VC=INDEL;AC=12;AF=0.06;AN=214;refseq.name=NM_052931;refseq.positionType=intron GT ./. 0/0 0/0 ./. ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 ./. ./. 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/1 ./. 0/0 0/0 ./. 0/1 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 ./. ./. 0/0 ./. ./. 0/0 0/0 ./. ./. ./. ./. 0/1 0/1 0/1 ./. ./. 0/1 ./. 0/0 0/0 ./. ./. ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/1 ./. 0/1 ./. 0/1 +chr1 160578541 . C CA . PASS VC=INDEL;AC=277;AF=0.88;AN=316 GT 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 161765879 . T TCTT . PASS VC=INDEL;AC=77;AF=0.25;AN=310;refseq.name=NM_007348;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 ./. 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 ./. 0/1 0/1 1/1 0/1 0/0 0/0 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 +chr1 161826110 . TT T . PASS VC=INDEL;AC=0;AF=0;AN=308;refseq.name=NM_007348;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 162354200 . AACAC A . PASS VC=INDEL;AC=32;AF=0.12;AN=262;refseq.name=NM_001085375;refseq.positionType=exon GT 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 1/1 0/0 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 ./. 0/0 0/0 ./. 0/1 ./. 0/0 ./. ./. 0/0 0/1 ./. ./. ./. ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 1/1 +chr1 162629796 . C CGTT . PASS VC=INDEL;AC=238;AF=0.75;AN=316;refseq.name=NM_001014796;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 163132415 . TCCTGAACA T . PASS VC=INDEL;AC=7;AF=0.02;AN=314;refseq.name=NM_003617;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 163135904 . C CAGA . PASS VC=INDEL;AC=217;AF=0.84;AN=258;refseq.name=NM_003617;refseq.positionType=intron GT 1/1 1/1 1/1 ./. 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 ./. 0/1 0/0 ./. 0/1 0/0 ./. 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 ./. 1/1 0/1 ./. 0/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. ./. ./. 1/1 1/1 0/1 1/1 0/1 1/1 ./. ./. 0/1 ./. 0/1 ./. 0/1 ./. 1/1 1/1 1/1 0/1 ./. ./. 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 ./. 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 ./. 1/1 +chr1 163136054 . T TTC . PASS VC=INDEL;AC=266;AF=0.84;AN=316;refseq.name=NM_003617;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 +chr1 163136055 . T TCT . PASS VC=INDEL;AC=265;AF=0.84;AN=314;refseq.name=NM_003617;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 +chr1 164351168 . ATTG A . PASS VC=INDEL;AC=261;AF=0.83;AN=316 GT 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 +chr1 164448310 . AAAC A . PASS VC=INDEL;AC=236;AF=0.75;AN=316 GT 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 164548574 . TT T . PASS VC=INDEL;AC=11;AF=0.04;AN=308;refseq.name=NM_002585;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 +chr1 164790567 . C CT . PASS VC=INDEL;AC=164;AF=0.52;AN=314;refseq.name=NM_002585;refseq.positionType=intron GT 1/1 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/0 +chr1 165207456 . TAGA T . PASS VC=INDEL;AC=17;AF=0.05;AN=316;refseq.name=NM_177398;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 165218477 . AGAGATTACTCTG A . PASS VC=INDEL;AC=79;AF=0.28;AN=280;refseq.name=NM_177398;refseq.positionType=intron GT 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 ./. 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 1/1 0/1 0/0 0/0 1/1 ./. 1/1 1/1 0/0 0/1 ./. ./. 1/1 0/0 1/1 0/1 0/1 ./. 0/1 1/1 1/1 ./. 0/1 0/1 1/1 ./. 0/0 0/1 ./. 0/1 1/1 0/1 1/1 1/1 ./. 1/1 ./. 0/1 1/1 0/1 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/1 0/1 0/1 0/1 +chr1 165261980 . TA T . PASS VC=INDEL;AC=129;AF=0.42;AN=308;refseq.name=NM_177398;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 ./. 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 ./. 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 ./. 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 ./. 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 +chr1 165286489 . AA A . PASS VC=INDEL;AC=23;AF=0.07;AN=314;refseq.name=NM_177398;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 165349359 . G GT . PASS VC=INDEL;AC=130;AF=0.42;AN=306 GT 0/1 ./. 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 ./. 0/1 0/1 +chr1 165475542 . CT C . PASS VC=INDEL;AC=157;AF=0.5;AN=316 GT 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 +chr1 165627134 . AT A . PASS VC=INDEL;AC=144;AF=0.46;AN=314 GT 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 ./. 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 +chr1 165652540 . GTTAA G . PASS VC=INDEL;AC=202;AF=0.66;AN=304;refseq.name=NM_000696;refseq.positionType=intron GT 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 ./. ./. 1/1 0/1 1/1 0/0 ./. 0/1 0/0 0/1 0/0 0/1 ./. 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/0 0/0 0/0 ./. 1/1 +chr1 165685796 . GGCACAGAT G . PASS VC=INDEL;AC=155;AF=0.49;AN=314 GT 0/0 0/1 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 ./. 0/1 1/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 +chr1 165686450 . TAGG T . PASS VC=INDEL;AC=144;AF=0.46;AN=316 GT 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 +chr1 165686452 . GGAG G . PASS VC=INDEL;AC=145;AF=0.46;AN=316 GT 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 +chr1 166083223 . CCAC C . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_001017961;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 166602705 . TTGT T . PASS VC=INDEL;AC=73;AF=0.23;AN=316 GT 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 +chr1 166639248 . A AAT . PASS VC=INDEL;AC=289;AF=0.91;AN=316 GT 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 +chr1 166708316 . G GTAG . PASS VC=INDEL;AC=102;AF=0.32;AN=316 GT 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 +chr1 167512714 . TTCCAAAACCGA T . PASS VC=INDEL;AC=7;AF=0.02;AN=316;refseq.name=NM_003851;refseq.positionType=intron GT 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 167513042 . CA C . PASS VC=INDEL;AC=7;AF=0.02;AN=316;refseq.name=NM_003851;refseq.positionType=intron GT 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 167516739 . T TAA . PASS VC=INDEL;AC=1;AF=0;AN=316;refseq.name=NM_003851;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 167675717 . T TTC . PASS VC=INDEL;AC=22;AF=0.07;AN=296;refseq.name=NM_052862;refseq.positionType=terminator GT 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 ./. 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 167682039 . CCAAA C . PASS VC=INDEL;AC=68;AF=0.22;AN=316 GT 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 +chr1 167682041 . AAACA A . PASS VC=INDEL;AC=68;AF=0.22;AN=316 GT 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 +chr1 167697899 . GTG G . PASS VC=INDEL;AC=50;AF=0.16;AN=316;refseq.name=NM_003953;refseq.positionType=intron GT 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 +chr1 167985326 . TG T . PASS VC=INDEL;AC=144;AF=0.49;AN=294;refseq.name=NM_001017977;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 ./. 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/0 1/1 1/1 ./. 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 1/1 1/1 1/1 0/0 1/1 0/1 1/1 ./. ./. 1/1 0/1 0/1 1/1 0/1 ./. 0/1 0/1 0/0 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 ./. 1/1 ./. 0/1 1/1 0/1 0/0 ./. 0/1 0/0 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 ./. 0/1 1/1 0/1 +chr1 168053859 . ACTCA A . PASS VC=INDEL;AC=11;AF=0.03;AN=316;refseq.name=NM_153832;refseq.positionType=terminator GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +chr1 168133510 . CCTAAC C . PASS VC=INDEL;AC=96;AF=0.3;AN=316 GT 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 +chr1 168200152 . GT G . PASS VC=INDEL;AC=135;AF=0.43;AN=316;refseq.name=NM_199344;refseq.positionType=intron GT 1/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 +chr1 168423776 . AGC A . PASS VC=INDEL;AC=4;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 169066627 . T TC . PASS VC=INDEL;AC=301;AF=0.95;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 +chr1 169066629 . C CC . PASS VC=INDEL;AC=301;AF=0.95;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 +chr1 169095586 . T TAT . PASS VC=INDEL;AC=165;AF=0.52;AN=316;refseq.name=NM_001001787;refseq.positionType=intron GT 0/0 1/1 1/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 +chr1 169214437 . CA C . PASS VC=INDEL;AC=10;AF=0.03;AN=316;refseq.name=NM_013330;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 169875635 . AG A . PASS VC=INDEL;AC=2;AF=0.01;AN=314 GT 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 170054566 . CAAAT C . PASS VC=INDEL;AC=2;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 170213713 . C CA . PASS VC=INDEL;AC=302;AF=0.96;AN=314 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 +chr1 170231599 . C CA . PASS VC=INDEL;AC=178;AF=0.57;AN=314 GT 0/1 0/1 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/0 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 +chr1 170412385 . A AA . PASS VC=INDEL;AC=247;AF=0.79;AN=312 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 ./. 0/0 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 +chr1 171564547 . T TT . PASS VC=INDEL;AC=141;AF=0.68;AN=206 GT 1/1 1/1 1/1 ./. 0/1 ./. 1/1 0/1 ./. 0/1 ./. ./. ./. 1/1 1/1 ./. 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 ./. 1/1 ./. 1/1 1/1 ./. ./. ./. 0/1 0/1 ./. ./. ./. 0/1 0/1 ./. 1/1 0/1 ./. 0/1 1/1 ./. 1/1 ./. ./. 0/1 ./. 0/1 ./. ./. ./. ./. 0/1 ./. 1/1 ./. 0/1 1/1 0/1 0/1 1/1 1/1 0/0 ./. ./. ./. ./. ./. 0/1 0/1 1/1 0/1 ./. 0/1 1/1 ./. 0/1 0/1 0/1 ./. 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 ./. 0/0 0/1 ./. 0/1 0/1 1/1 ./. 1/1 1/1 ./. 0/1 1/1 0/1 0/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 ./. ./. ./. ./. 1/1 ./. ./. 0/1 1/1 1/1 ./. 0/1 1/1 ./. ./. 0/1 ./. ./. 0/1 ./. 0/1 ./. ./. 1/1 ./. 1/1 1/1 1/1 0/1 +chr1 171668398 . C CATC . PASS VC=INDEL;AC=42;AF=0.13;AN=316 GT 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 171779854 . AAAG A . PASS VC=INDEL;AC=128;AF=0.46;AN=278 GT 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/1 1/1 0/1 ./. 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 ./. 0/1 0/1 ./. ./. ./. 1/1 0/1 ./. 0/1 1/1 0/1 0/1 1/1 0/1 ./. 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 ./. 0/0 0/1 1/1 0/1 1/1 1/1 ./. 1/1 0/1 0/1 1/1 ./. 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 ./. 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/1 ./. 1/1 ./. 0/1 0/1 0/1 0/0 1/1 0/1 ./. 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/1 ./. 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 ./. 0/1 0/1 +chr1 171799766 . A ACT . PASS VC=INDEL;AC=48;AF=0.18;AN=268 GT 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/1 ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 ./. 0/1 0/1 0/1 0/1 0/0 0/1 0/0 ./. 0/1 ./. 0/0 0/1 ./. 0/1 0/1 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/0 0/0 ./. 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 ./. 0/0 0/0 0/0 ./. 0/1 ./. 0/1 0/1 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/1 0/0 0/0 +chr1 171806532 . C CAT . PASS VC=INDEL;AC=14;AF=0.05;AN=308 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 172312482 . AAG A . PASS VC=INDEL;AC=5;AF=0.02;AN=316;refseq.name=NM_015569;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 172415351 . GA G . PASS VC=INDEL;AC=75;AF=0.24;AN=316;refseq.name=NM_139240;refseq.positionType=intron GT 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 +chr1 172620138 . A ACT . PASS VC=INDEL;AC=134;AF=0.42;AN=316 GT 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 +chr1 172620139 . C CTC . PASS VC=INDEL;AC=134;AF=0.43;AN=314 GT 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 ./. 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 +chr1 173063473 . A ATGTC . PASS VC=INDEL;AC=124;AF=0.62;AN=200 GT 0/0 0/1 0/1 ./. 0/1 ./. ./. 1/1 0/1 0/0 0/1 ./. 0/1 1/1 ./. ./. 0/0 0/1 0/1 ./. 1/1 1/1 0/1 1/1 0/0 1/1 0/0 1/1 ./. 1/1 0/0 1/1 1/1 ./. ./. ./. ./. ./. ./. 1/1 ./. 0/1 ./. 1/1 0/1 1/1 ./. 1/1 ./. 0/1 ./. 0/1 1/1 ./. 1/1 0/1 ./. 0/1 0/1 ./. ./. 0/1 0/1 ./. ./. 0/1 ./. 0/1 ./. ./. 0/1 ./. 1/1 0/1 ./. 1/1 ./. ./. 0/1 ./. 1/1 1/1 ./. 1/1 0/1 ./. ./. 0/0 ./. 0/1 1/1 1/1 ./. 1/1 1/1 0/0 ./. ./. 0/1 0/0 ./. ./. 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 0/1 0/1 ./. ./. 0/1 0/1 0/1 0/0 ./. ./. 0/0 1/1 1/1 1/1 0/0 0/0 ./. 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 ./. ./. 1/1 0/0 ./. 0/1 ./. ./. 1/1 0/0 ./. ./. ./. 1/1 0/1 ./. 0/1 1/1 ./. +chr1 173541560 . CAA C . PASS VC=INDEL;AC=233;AF=0.74;AN=316;refseq.name=NM_178527;refseq.positionType=intron GT 0/0 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/0 +chr1 173749093 . T TC . PASS VC=INDEL;AC=316;AF=1;AN=316;refseq.name=NM_014458;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 173755936 . T TGAAG . PASS VC=INDEL;AC=182;AF=0.58;AN=316;refseq.name=NM_014458;refseq.positionType=terminator GT 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 +chr1 173870326 . ACTA A . PASS VC=INDEL;AC=235;AF=0.74;AN=316 GT 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 +chr1 174411392 . T TTGTAT . PASS VC=INDEL;AC=251;AF=0.8;AN=314;refseq.name=NM_014857;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 +chr1 174524160 . T TAT . PASS VC=INDEL;AC=212;AF=0.67;AN=316;refseq.name=NM_014857;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 +chr1 175131961 . GA G . PASS VC=INDEL;AC=85;AF=0.28;AN=306 GT 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 ./. 1/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 ./. 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 ./. 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 ./. 0/1 0/1 1/1 ./. 0/1 0/0 0/1 +chr1 175299777 . CAT C . PASS VC=INDEL;AC=18;AF=0.06;AN=316;refseq.name=NM_003285;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 +chr1 175355790 . GG G . PASS VC=INDEL;AC=199;AF=0.74;AN=270;refseq.name=NM_003285;refseq.positionType=intron GT 1/1 0/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 ./. 0/1 0/1 1/1 0/1 0/1 0/1 ./. ./. 1/1 0/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 0/0 ./. 0/1 0/0 0/0 0/0 ./. ./. 1/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 0/1 1/1 1/1 0/1 ./. 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 ./. 1/1 ./. ./. 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 1/1 1/1 0/1 1/1 ./. ./. 0/0 0/1 ./. 0/1 +chr1 175418807 . A AACA . PASS VC=INDEL;AC=118;AF=0.37;AN=316;refseq.name=NM_003285;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 +chr1 175420618 . A AG . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_003285;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 175443036 . AGGAGA A . PASS VC=INDEL;AC=1;AF=0;AN=316;refseq.name=NM_003285;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 175472120 . C CTAATCAGGATCTTGACATGTGACACAAGATCCTTGAG . PASS VC=INDEL;AC=14;AF=0.04;AN=316;refseq.name=NM_003285;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 175584762 . CT C . PASS VC=INDEL;AC=45;AF=0.14;AN=314;refseq.name=NM_003285;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 +chr1 177236388 . C CG . PASS VC=INDEL;AC=167;AF=0.54;AN=312;refseq.name=NM_021165;refseq.positionType=intron GT 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 ./. 0/1 ./. 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 +chr1 177236389 . G GG . PASS VC=INDEL;AC=166;AF=0.53;AN=316;refseq.name=NM_021165;refseq.positionType=intron GT 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 +chr1 177558539 . G GAGA . PASS VC=INDEL;AC=7;AF=0.02;AN=290 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 177558541 . G GAAG . PASS VC=INDEL;AC=10;AF=0.03;AN=296 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 178521563 . TAAGAC T . PASS VC=INDEL;AC=21;AF=0.09;AN=246 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/1 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 ./. 1/1 1/1 ./. ./. 0/0 ./. 0/0 ./. ./. ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/0 0/1 ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/0 ./. ./. ./. 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 1/1 0/0 1/1 0/1 0/0 0/0 +chr1 179038241 . GT G . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_014864;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 179293907 . CAA C . PASS VC=INDEL;AC=34;AF=0.11;AN=314;refseq.name=NM_003101;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 +chr1 179724329 . G GG . PASS VC=INDEL;AC=307;AF=0.97;AN=316;refseq.name=NM_173509;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 179762445 . GT G . PASS VC=INDEL;AC=85;AF=0.27;AN=316;refseq.name=NM_173509;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 179762446 . TT T . PASS VC=INDEL;AC=85;AF=0.27;AN=316;refseq.name=NM_173509;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 179773170 . CTTGTC C . PASS VC=INDEL;AC=77;AF=0.28;AN=274;refseq.name=NM_173509;refseq.positionType=intron GT 1/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 ./. 0/0 0/0 0/0 ./. 0/0 1/1 0/0 1/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 ./. 0/1 0/0 0/1 0/0 1/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 ./. 1/1 ./. ./. ./. 0/0 0/0 ./. 0/0 0/1 0/1 0/1 ./. 0/1 1/1 1/1 0/0 ./. 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 ./. 0/1 0/1 0/0 0/1 0/1 ./. 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 ./. 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 1/1 0/1 +chr1 180108217 . T TTATC . PASS VC=INDEL;AC=229;AF=0.72;AN=316 GT 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 +chr1 180722815 . TACTC T . PASS VC=INDEL;AC=4;AF=0.01;AN=316;refseq.name=NM_004736;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 180722816 . ACTCA A . PASS VC=INDEL;AC=5;AF=0.02;AN=316;refseq.name=NM_004736;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 180762626 . CAT C . PASS VC=INDEL;AC=12;AF=0.04;AN=296;refseq.name=NM_004736;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 +chr1 180866670 . CCC C . PASS VC=INDEL;AC=73;AF=0.29;AN=256 GT 0/0 0/1 0/1 0/0 ./. 0/0 ./. 0/1 ./. 0/0 ./. 0/1 ./. 0/1 0/0 0/0 0/0 0/1 0/0 0/0 ./. ./. 0/0 ./. 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 1/1 ./. 0/1 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 ./. 0/1 0/1 0/0 0/1 ./. 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/1 ./. 0/1 ./. 0/1 ./. ./. 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/0 ./. ./. ./. 0/1 0/1 0/1 0/1 +chr1 180974402 . A AA . PASS VC=INDEL;AC=0;AF=0;AN=298;refseq.name=NM_005819;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 +chr1 181233905 . AA A . PASS VC=INDEL;AC=1;AF=0;AN=266 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 ./. ./. ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 +chr1 181456872 . CC C . PASS VC=INDEL;AC=2;AF=0.01;AN=300;refseq.name=NM_000721;refseq.positionType=intron GT ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 181610646 . CT C . PASS VC=INDEL;AC=58;AF=0.18;AN=314;refseq.name=NM_000721;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 +chr1 182087446 . G GTCT . PASS VC=INDEL;AC=198;AF=0.68;AN=292 GT 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 ./. 1/1 0/1 0/1 0/1 ./. 0/1 ./. ./. 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 ./. 1/1 0/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 0/1 0/1 ./. 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 ./. 0/1 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/1 0/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 ./. 1/1 0/1 1/1 0/0 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 +chr1 182739634 . TAAGA T . PASS VC=INDEL;AC=65;AF=0.21;AN=316 GT 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 +chr1 182951675 . AGA A . PASS VC=INDEL;AC=78;AF=0.25;AN=316 GT 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/0 +chr1 183032447 . C CTAAG . PASS VC=INDEL;AC=125;AF=0.4;AN=316;refseq.name=NM_002293;refseq.positionType=intron GT 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 183073109 . T TTG . PASS VC=INDEL;AC=125;AF=0.4;AN=316;refseq.name=NM_002293;refseq.positionType=intron GT 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 183073111 . G GTG . PASS VC=INDEL;AC=125;AF=0.4;AN=316;refseq.name=NM_002293;refseq.positionType=intron GT 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 183077296 . A AG . PASS VC=INDEL;AC=126;AF=0.4;AN=316;refseq.name=NM_002293;refseq.positionType=intron GT 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 183097956 . G GTTA . PASS VC=INDEL;AC=127;AF=0.4;AN=314;refseq.name=NM_002293;refseq.positionType=intron GT 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 183145207 . G GTAG . PASS VC=INDEL;AC=35;AF=0.11;AN=312 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 183180446 . GG G . PASS VC=INDEL;AC=54;AF=0.17;AN=316;refseq.name=NM_005562;refseq.positionType=intron GT 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 183330737 . TAA T . PASS VC=INDEL;AC=197;AF=0.63;AN=312;refseq.name=NM_015039;refseq.positionType=intron GT 0/1 1/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 ./. 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 ./. 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 1/1 +chr1 183589923 . A ATCTT . PASS VC=INDEL;AC=117;AF=0.37;AN=314 GT 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 ./. 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 +chr1 183712910 . AC A . PASS VC=INDEL;AC=131;AF=0.42;AN=312;refseq.name=NM_015149;refseq.positionType=intron GT 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 +chr1 183806728 . T TG . PASS VC=INDEL;AC=229;AF=0.85;AN=270;refseq.name=NM_015149;refseq.positionType=intron GT 1/1 ./. 1/1 ./. ./. 0/1 0/1 ./. 1/1 1/1 0/1 1/1 0/1 ./. 1/1 0/1 1/1 1/1 0/1 ./. 0/1 1/1 1/1 0/1 1/1 1/1 ./. ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 ./. 0/1 ./. ./. 0/0 ./. 1/1 1/1 0/0 1/1 ./. 1/1 0/0 1/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 ./. 0/1 1/1 1/1 1/1 0/0 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 ./. 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 183996005 . C CTATTA . PASS VC=INDEL;AC=27;AF=0.09;AN=316;refseq.name=NM_015101;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 184391018 . C CTA . PASS VC=INDEL;AC=68;AF=0.22;AN=312;refseq.name=NM_030806;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 ./. 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 +chr1 184561827 . CAGA C . PASS VC=INDEL;AC=47;AF=0.15;AN=316;refseq.name=NM_030806;refseq.positionType=intron GT 0/0 0/1 1/1 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 184577643 . T TC . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_030806;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 185540897 . T TCCAG . PASS VC=INDEL;AC=136;AF=0.48;AN=286 GT 0/0 0/1 0/0 0/1 0/0 ./. 0/1 0/1 0/1 0/1 0/0 0/1 ./. 1/1 ./. 0/1 0/1 0/1 0/0 0/1 ./. 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 ./. 0/0 0/1 0/0 ./. 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/1 ./. 0/0 0/0 0/1 0/1 1/1 1/1 0/1 ./. 0/1 1/1 1/1 1/1 ./. 0/1 1/1 ./. 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 ./. 0/0 0/0 ./. 0/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 +chr1 185865550 . C CAT . PASS VC=INDEL;AC=53;AF=0.17;AN=310;refseq.name=NM_031935;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 +chr1 186378142 . CAGTT C . PASS VC=INDEL;AC=55;AF=0.21;AN=266;refseq.name=NM_017847;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/1 0/0 ./. 0/1 1/1 0/1 ./. 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/1 ./. 0/0 0/0 0/0 1/1 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/0 1/1 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 ./. ./. 0/0 0/0 0/1 0/1 0/0 1/1 ./. 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 ./. ./. 0/0 0/1 ./. ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 ./. 0/1 0/0 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 +chr1 186769215 . T TA . PASS VC=INDEL;AC=45;AF=0.14;AN=316 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 186933480 . T TTAAT . PASS VC=INDEL;AC=135;AF=0.43;AN=316;refseq.name=NM_024420;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 +chr1 187372829 . AGGCTT A . PASS VC=INDEL;AC=34;AF=0.11;AN=304 GT ./. 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 +chr1 187372830 . GGCTTG G . PASS VC=INDEL;AC=32;AF=0.1;AN=306 GT 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 +chr1 187685847 . CAATT C . PASS VC=INDEL;AC=112;AF=0.36;AN=314 GT 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 ./. 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 +chr1 187781028 . C CT . PASS VC=INDEL;AC=278;AF=0.9;AN=310 GT 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 +chr1 187815820 . A ACAA . PASS VC=INDEL;AC=21;AF=0.07;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr1 187899550 . AAA A . PASS VC=INDEL;AC=65;AF=0.21;AN=314 GT 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 +chr1 188075358 . GTAAG G . PASS VC=INDEL;AC=63;AF=0.2;AN=316 GT 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 +chr1 188110355 . C CT . PASS VC=INDEL;AC=222;AF=0.71;AN=312 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 ./. 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 ./. 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 +chr1 188372559 . CAAG C . PASS VC=INDEL;AC=230;AF=0.73;AN=314 GT 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 ./. 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 188397016 . C CA . PASS VC=INDEL;AC=9;AF=0.03;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr1 188526820 . C CT . PASS VC=INDEL;AC=262;AF=0.91;AN=288 GT 1/1 1/1 1/1 1/1 ./. 0/1 ./. 1/1 0/1 1/1 ./. 1/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 ./. 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 188533586 . G GTTCT . PASS VC=INDEL;AC=290;AF=0.92;AN=316 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 188628449 . CAACT C . PASS VC=INDEL;AC=100;AF=0.32;AN=314 GT 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 +chr1 189027168 . C CTG . PASS VC=INDEL;AC=146;AF=0.69;AN=212 GT 1/1 ./. ./. ./. ./. ./. 0/1 1/1 0/1 0/1 ./. 0/1 ./. 0/1 ./. 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. ./. ./. 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 ./. ./. 1/1 ./. 1/1 1/1 0/0 1/1 0/0 ./. 1/1 1/1 1/1 1/1 0/1 1/1 0/1 ./. 0/1 1/1 1/1 0/1 0/1 0/1 ./. ./. 1/1 1/1 1/1 0/1 0/1 0/0 ./. 0/1 0/1 ./. ./. 0/1 ./. 1/1 ./. ./. ./. 0/1 0/1 0/1 ./. 1/1 0/1 ./. 0/1 0/1 0/0 0/1 ./. 0/1 ./. 1/1 ./. 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 1/1 1/1 0/1 ./. ./. 1/1 ./. ./. 1/1 0/1 0/0 1/1 0/1 0/1 0/1 ./. ./. ./. ./. ./. 1/1 0/1 ./. ./. ./. ./. 1/1 1/1 ./. ./. 1/1 1/1 1/1 ./. ./. 1/1 ./. ./. ./. +chr1 189046798 . C CA . PASS VC=INDEL;AC=86;AF=0.27;AN=316 GT 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 +chr1 189087000 . TTA T . PASS VC=INDEL;AC=159;AF=0.53;AN=302 GT 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 ./. 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 ./. 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 ./. 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 ./. 0/0 0/1 ./. 0/0 0/1 1/1 +chr1 189190273 . AT A . PASS VC=INDEL;AC=2;AF=0.01;AN=316 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 189547870 . A AAT . PASS VC=INDEL;AC=194;AF=0.79;AN=246 GT 0/1 ./. ./. 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 1/1 ./. 0/1 0/1 0/1 1/1 1/1 0/1 ./. ./. 0/1 ./. 0/0 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. ./. 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 ./. ./. ./. 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 ./. 0/1 ./. ./. 0/1 1/1 0/0 ./. 1/1 1/1 ./. ./. ./. 0/0 1/1 ./. ./. 1/1 ./. 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 ./. 0/0 1/1 ./. 0/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 ./. ./. 0/1 ./. 1/1 0/1 1/1 ./. 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 ./. ./. 0/1 1/1 1/1 ./. 0/1 1/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 +chr1 189629285 . A ATAACT . PASS VC=INDEL;AC=158;AF=0.59;AN=266 GT 0/1 1/1 0/0 1/1 ./. 0/1 1/1 0/1 0/0 0/0 1/1 0/1 ./. 1/1 ./. 0/1 ./. 0/1 0/1 1/1 0/1 ./. ./. 0/1 0/0 ./. 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 ./. 0/0 0/0 1/1 0/1 ./. 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 ./. 1/1 0/1 0/1 0/0 0/1 ./. 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 ./. ./. 0/1 1/1 1/1 1/1 0/1 ./. 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/1 ./. 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 ./. ./. 0/0 ./. 0/1 ./. 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/0 0/1 1/1 ./. ./. 1/1 1/1 1/1 ./. 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 ./. 0/1 0/1 1/1 1/1 1/1 0/1 0/1 +chr1 189867802 . G GC . PASS VC=INDEL;AC=23;AF=0.07;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 +chr1 190095126 . CTAACA C . PASS VC=INDEL;AC=143;AF=0.45;AN=316;refseq.name=NM_199051;refseq.positionType=intron GT 0/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 +chr1 190095129 . ACATAA A . PASS VC=INDEL;AC=143;AF=0.45;AN=316;refseq.name=NM_199051;refseq.positionType=intron GT 0/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 +chr1 190636901 . C CTAA . PASS VC=INDEL;AC=131;AF=0.42;AN=314 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 +chr1 190886420 . AA A . PASS VC=INDEL;AC=76;AF=0.26;AN=292 GT 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 ./. 0/0 0/0 0/1 0/1 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 +chr1 191196527 . A AAT . PASS VC=INDEL;AC=191;AF=0.6;AN=316 GT 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 +chr1 191340485 . TTAGA T . PASS VC=INDEL;AC=175;AF=0.59;AN=296 GT 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 ./. 0/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 ./. 0/0 ./. 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 ./. 0/1 ./. ./. 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 ./. 0/1 0/0 0/1 0/1 0/1 ./. 0/1 0/1 0/0 0/1 ./. 0/1 0/1 0/1 0/1 1/1 0/1 +chr1 191464816 . A ATTA . PASS VC=INDEL;AC=213;AF=0.7;AN=306 GT 0/0 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 1/1 0/0 1/1 ./. 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 ./. 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 +chr1 191588586 . C CA . PASS VC=INDEL;AC=190;AF=0.61;AN=310 GT 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 ./. 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/0 ./. 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 +chr1 191588587 . A AA . PASS VC=INDEL;AC=186;AF=0.61;AN=304 GT 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 ./. 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/0 ./. 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 +chr1 191752595 . T TCTTT . PASS VC=INDEL;AC=132;AF=0.42;AN=316 GT 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/0 0/0 +chr1 192047581 . TT T . PASS VC=INDEL;AC=1;AF=0;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 192460381 . T TT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 192612585 . T TCA . PASS VC=INDEL;AC=80;AF=0.25;AN=316;refseq.name=NM_002927;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 +chr1 192726770 . C CT . PASS VC=INDEL;AC=121;AF=0.39;AN=314 GT 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 +chr1 193118950 . AGACT A . PASS VC=INDEL;AC=7;AF=0.02;AN=316;refseq.name=NM_024529;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 193158515 . CTG C . PASS VC=INDEL;AC=7;AF=0.02;AN=316;refseq.name=NM_003783;refseq.positionType=promoter GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 193261423 . AAAGTA A . PASS VC=INDEL;AC=7;AF=0.02;AN=316 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 193421510 . A ATCT . PASS VC=INDEL;AC=102;AF=0.33;AN=310 GT 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 ./. 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 +chr1 193482947 . CAA C . PASS VC=INDEL;AC=71;AF=0.22;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 +chr1 193569090 . C CG . PASS VC=INDEL;AC=85;AF=0.27;AN=312 GT 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 ./. 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 +chr1 193877310 . GG G . PASS VC=INDEL;AC=106;AF=0.34;AN=316 GT 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 193881567 . T TT . PASS VC=INDEL;AC=4;AF=0.01;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 194004698 . TCTT T . PASS VC=INDEL;AC=34;AF=0.11;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 +chr1 194047765 . TAT T . PASS VC=INDEL;AC=48;AF=0.2;AN=238 GT ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 ./. 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 ./. 0/1 0/0 0/1 0/0 0/1 ./. 0/0 0/1 0/1 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/1 0/1 0/0 0/1 ./. ./. 0/0 ./. ./. 0/1 0/1 0/0 0/0 ./. ./. ./. 0/0 0/0 0/1 0/0 ./. 0/1 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. ./. ./. 0/0 ./. 0/0 0/1 0/0 0/1 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 ./. ./. 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 ./. 0/1 ./. 1/1 0/1 ./. 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/1 +chr1 194160203 . TTAGT T . PASS VC=INDEL;AC=25;AF=0.12;AN=206 GT 0/1 0/0 0/1 0/0 ./. 0/1 0/0 ./. ./. ./. 0/1 ./. 0/0 ./. 0/1 ./. 0/0 0/1 0/1 0/1 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 ./. ./. 0/1 0/0 ./. ./. ./. 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 ./. 0/0 0/0 ./. ./. 0/0 ./. 0/0 ./. ./. ./. ./. 0/1 ./. 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/1 ./. 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/1 ./. ./. 0/0 ./. 0/0 0/0 ./. ./. 0/1 ./. ./. 0/1 0/1 ./. 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/1 +chr1 194193740 . A AG . PASS VC=INDEL;AC=316;AF=1;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 194339262 . ATGT A . PASS VC=INDEL;AC=67;AF=0.21;AN=316 GT 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 +chr1 194487871 . C CCTAT . PASS VC=INDEL;AC=302;AF=0.97;AN=312 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 194520551 . GG G . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 194563981 . TAAT T . PASS VC=INDEL;AC=169;AF=0.53;AN=316 GT 1/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 +chr1 194738670 . T TTT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 194763917 . CATG C . PASS VC=INDEL;AC=267;AF=0.84;AN=316 GT 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 +chr1 195047681 . GG G . PASS VC=INDEL;AC=29;AF=0.1;AN=278 GT 0/0 0/0 ./. 0/0 0/0 0/0 1/1 1/1 0/0 ./. 0/0 1/1 0/0 0/0 ./. 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 ./. ./. ./. 0/1 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/1 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 ./. 0/1 0/0 0/1 0/0 1/1 1/1 +chr1 195637390 . TA T . PASS VC=INDEL;AC=90;AF=0.29;AN=314 GT 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 1/1 1/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 +chr1 195637391 . AA A . PASS VC=INDEL;AC=89;AF=0.28;AN=316 GT 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 +chr1 195877296 . T TAA . PASS VC=INDEL;AC=232;AF=0.73;AN=316 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 +chr1 195877297 . A AAA . PASS VC=INDEL;AC=232;AF=0.73;AN=316 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 +chr1 195934123 . CCTAT C . PASS VC=INDEL;AC=185;AF=0.59;AN=312 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 ./. 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 ./. 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 +chr1 195934125 . TATCT T . PASS VC=INDEL;AC=184;AF=0.59;AN=312 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 ./. 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 ./. 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 +chr1 196163677 . TT T . PASS VC=INDEL;AC=284;AF=0.9;AN=316 GT 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 +chr1 196344374 . C CA . PASS VC=INDEL;AC=153;AF=0.53;AN=290;refseq.name=NM_198503;refseq.positionType=intron GT 0/0 0/0 0/0 ./. 0/0 ./. 0/0 1/1 1/1 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 ./. 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 ./. 0/1 0/1 0/1 0/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 ./. ./. 0/0 +chr1 196448625 . ATG A . PASS VC=INDEL;AC=7;AF=0.03;AN=266;refseq.name=NM_198503;refseq.positionType=intron GT ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 +chr1 196448626 . TGTA T . PASS VC=INDEL;AC=8;AF=0.03;AN=302;refseq.name=NM_198503;refseq.positionType=intron GT ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 +chr1 197406760 . GAA G . PASS VC=INDEL;AC=78;AF=0.25;AN=312;refseq.name=NM_201253;refseq.positionType=intron GT 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 ./. 0/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 197613756 . ACCT A . PASS VC=INDEL;AC=25;AF=0.08;AN=316;refseq.name=NM_144977;refseq.positionType=intron GT 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 +chr1 197690664 . T TG . PASS VC=INDEL;AC=291;AF=0.92;AN=316;refseq.name=NM_144977;refseq.positionType=intron GT 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 +chr1 198792990 . T TG . PASS VC=INDEL;AC=131;AF=0.41;AN=316 GT 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 198940301 . C CCTT . PASS VC=INDEL;AC=258;AF=0.82;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/0 1/1 +chr1 198940306 . T TTCT . PASS VC=INDEL;AC=258;AF=0.82;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/0 1/1 +chr1 199277515 . AC A . PASS VC=INDEL;AC=36;AF=0.11;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 +chr1 200575750 . AAATA A . PASS VC=INDEL;AC=97;AF=0.31;AN=314;refseq.name=NM_014875;refseq.positionType=intron GT 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 ./. 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 +chr1 201173407 . AA A . PASS VC=INDEL;AC=56;AF=0.18;AN=314 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/0 +chr1 201288249 . TATC T . PASS VC=INDEL;AC=209;AF=0.66;AN=316;refseq.name=NM_000299;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/0 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 +chr1 201457641 . AA A . PASS VC=INDEL;AC=55;AF=0.18;AN=310;refseq.name=NM_004078;refseq.positionType=intron GT 1/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 1/1 1/1 +chr1 201587178 . CA C . PASS VC=INDEL;AC=145;AF=0.47;AN=310 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 ./. 0/1 1/1 ./. 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 +chr1 201733889 . G GG . PASS VC=INDEL;AC=46;AF=0.15;AN=316;refseq.name=NM_020443;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 +chr1 203792216 . AA A . PASS VC=INDEL;AC=265;AF=0.93;AN=286;refseq.name=NM_014827;refseq.positionType=intron GT 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 0/1 ./. 1/1 ./. ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 1/1 0/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 ./. ./. 1/1 +chr1 203829389 . CTCAAC C . PASS VC=INDEL;AC=195;AF=0.62;AN=316;refseq.name=NM_003094;refseq.positionType=promoter GT 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 +chr1 203848383 . C CTT . PASS VC=INDEL;AC=275;AF=0.87;AN=316 GT 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 +chr1 203848384 . T TTT . PASS VC=INDEL;AC=275;AF=0.87;AN=316 GT 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 +chr1 204049028 . T TG . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_005686;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 204452618 . T TGT . PASS VC=INDEL;AC=141;AF=0.47;AN=300;refseq.name=NM_002646;refseq.positionType=intron GT 1/1 0/0 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 ./. 0/0 0/0 0/1 1/1 0/1 0/1 0/1 ./. 1/1 0/1 0/1 1/1 1/1 ./. 1/1 0/1 0/0 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 ./. 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 ./. 1/1 0/1 0/0 0/1 0/0 1/1 1/1 +chr1 205036040 . T TG . PASS VC=INDEL;AC=69;AF=0.23;AN=302;refseq.name=NM_005076;refseq.positionType=intron GT 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 ./. 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 ./. 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 ./. 0/0 0/0 0/1 0/1 0/1 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 205036041 . G GG . PASS VC=INDEL;AC=71;AF=0.23;AN=310;refseq.name=NM_005076;refseq.positionType=intron GT 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 ./. 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 206303222 . C CAGCCTAGCT . PASS VC=INDEL;AC=105;AF=0.33;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 +chr1 206571046 . G GA . PASS VC=INDEL;AC=2;AF=0.01;AN=290;refseq.name=NM_015326;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 ./. +chr1 206862605 . G GA . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_004759;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 206955760 . TGTAA T . PASS VC=INDEL;AC=95;AF=0.31;AN=310 GT 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 ./. 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 +chr1 207260285 . T TCAATTCACAGGAGTATGTGA . PASS VC=INDEL;AC=197;AF=0.62;AN=316;refseq.name=NM_001017365;refseq.positionType=promoter GT 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +chr1 207277350 . CC C . PASS VC=INDEL;AC=201;AF=0.64;AN=316;refseq.name=NM_000715;refseq.positionType=promoter GT 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 +chr1 207641329 . TTAAG T . PASS VC=INDEL;AC=13;AF=0.06;AN=216;refseq.name=NM_001006658;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. ./. ./. ./. ./. ./. 0/0 ./. 0/0 0/1 0/0 ./. 0/0 ./. ./. ./. ./. 0/0 ./. 0/1 ./. 0/0 0/0 ./. ./. ./. ./. 0/0 0/0 0/1 ./. ./. ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 1/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 ./. +chr1 207824638 . A AATTC . PASS VC=INDEL;AC=153;AF=0.48;AN=316;refseq.name=NM_175710;refseq.positionType=intron GT 0/0 0/1 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 +chr1 208201207 . GT G . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_025179;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 208514674 . GTTAC G . PASS VC=INDEL;AC=165;AF=0.53;AN=314 GT 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 ./. 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 +chr1 208514676 . TACTT T . PASS VC=INDEL;AC=166;AF=0.53;AN=314 GT 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 ./. 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 +chr1 208609280 . GGAAG G . PASS VC=INDEL;AC=55;AF=0.21;AN=256 GT 0/0 ./. 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/1 0/1 1/1 0/1 ./. 0/1 ./. 1/1 0/1 ./. 0/1 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 ./. 1/1 0/0 1/1 0/1 ./. ./. 0/1 1/1 ./. ./. 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 ./. 0/0 0/1 0/0 ./. 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 +chr1 208643013 . CA C . PASS VC=INDEL;AC=36;AF=0.12;AN=310 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 208643015 . AA A . PASS VC=INDEL;AC=39;AF=0.12;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 208763800 . C CA . PASS VC=INDEL;AC=175;AF=0.55;AN=316 GT 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 +chr1 209124169 . T TA . PASS VC=INDEL;AC=226;AF=0.72;AN=316 GT 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 +chr1 209124171 . A AA . PASS VC=INDEL;AC=226;AF=0.72;AN=316 GT 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 +chr1 209639686 . A AG . PASS VC=INDEL;AC=203;AF=0.64;AN=316 GT 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 +chr1 209662878 . T TG . PASS VC=INDEL;AC=205;AF=0.65;AN=316 GT 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 +chr1 209936964 . T TCA . PASS VC=INDEL;AC=184;AF=0.58;AN=316;refseq.name=NM_025228;refseq.positionType=intron GT 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 +chr1 210007940 . TCT T . PASS VC=INDEL;AC=190;AF=0.6;AN=316;refseq.name=NM_014388;refseq.positionType=intron GT 1/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/0 0/0 1/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 210483472 . TG T . PASS VC=INDEL;AC=13;AF=0.04;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 210485101 . A AGGAC . PASS VC=INDEL;AC=232;AF=0.8;AN=290 GT 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 ./. 1/1 0/1 0/1 1/1 1/1 1/1 ./. ./. 0/1 0/1 0/1 0/1 ./. 1/1 0/1 1/1 0/0 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 ./. 0/0 1/1 0/1 0/0 ./. 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 ./. 0/1 ./. 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. +chr1 210713503 . TT T . PASS VC=INDEL;AC=303;AF=0.96;AN=316;refseq.name=NM_018194;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 211710916 . CC C . PASS VC=INDEL;AC=55;AF=0.17;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 211786200 . TA T . PASS VC=INDEL;AC=147;AF=0.56;AN=264 GT ./. 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 ./. 0/0 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 ./. ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 0/0 ./. ./. ./. 0/0 0/0 0/1 0/0 ./. 0/0 0/0 ./. 0/0 ./. 1/1 0/0 0/1 1/1 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. ./. 0/0 ./. 0/1 0/1 ./. ./. 0/0 ./. 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 ./. 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 ./. ./. 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/1 ./. 1/1 0/0 0/0 1/1 ./. 1/1 0/1 +chr1 212767202 . TTT T . PASS VC=INDEL;AC=63;AF=0.2;AN=316;refseq.name=NM_001030287;refseq.positionType=intron GT 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 213150090 . T TGT . PASS VC=INDEL;AC=64;AF=0.21;AN=300;refseq.name=NM_024749;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 ./. 1/1 0/1 0/0 0/1 0/1 0/1 ./. 0/1 0/0 ./. ./. 0/0 +chr1 213160084 . A AG . PASS VC=INDEL;AC=129;AF=0.41;AN=312;refseq.name=NM_024749;refseq.positionType=intron GT 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 ./. 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 +chr1 213160085 . G GG . PASS VC=INDEL;AC=129;AF=0.41;AN=314;refseq.name=NM_024749;refseq.positionType=intron GT 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 ./. 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 +chr1 213393510 . AG A . PASS VC=INDEL;AC=62;AF=0.2;AN=316;refseq.name=NM_012424;refseq.positionType=intron GT 0/1 0/1 0/1 1/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 +chr1 213790399 . C CGA . PASS VC=INDEL;AC=2;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 214136369 . CTTC C . PASS VC=INDEL;AC=93;AF=0.29;AN=316 GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 214365999 . C CTG . PASS VC=INDEL;AC=164;AF=0.59;AN=278 GT 1/1 0/1 1/1 0/0 0/1 ./. 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 ./. 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 ./. 0/0 0/1 1/1 0/0 0/0 0/0 ./. 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 ./. 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 ./. 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 ./. 0/1 0/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 ./. 0/1 0/1 ./. ./. ./. 1/1 ./. ./. 1/1 0/1 ./. 1/1 1/1 1/1 0/1 ./. 0/1 0/0 0/1 0/0 ./. 1/1 1/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 ./. 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 ./. 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 +chr1 214573392 . G GTTC . PASS VC=INDEL;AC=271;AF=0.86;AN=316;refseq.name=NM_005401;refseq.positionType=intron GT 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 215120715 . AA A . PASS VC=INDEL;AC=36;AF=0.12;AN=312 GT 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 216179286 . T TCAAT . PASS VC=INDEL;AC=30;AF=0.09;AN=316;refseq.name=NM_206933;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr1 216298294 . C CAG . PASS VC=INDEL;AC=113;AF=0.36;AN=316;refseq.name=NM_206933;refseq.positionType=intron GT 0/0 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 +chr1 216298296 . G GAG . PASS VC=INDEL;AC=112;AF=0.35;AN=316;refseq.name=NM_206933;refseq.positionType=intron GT 0/0 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 +chr1 216454053 . A AACA . PASS VC=INDEL;AC=224;AF=0.71;AN=316;refseq.name=NM_206933;refseq.positionType=intron GT 0/0 1/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 +chr1 216780749 . C CC . PASS VC=INDEL;AC=10;AF=0.03;AN=316;refseq.name=NM_206594;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 216835074 . A AGTTT . PASS VC=INDEL;AC=89;AF=0.28;AN=316;refseq.name=NM_206594;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 +chr1 217026745 . AA A . PASS VC=INDEL;AC=13;AF=0.04;AN=304;refseq.name=NM_206594;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 217057204 . G GC . PASS VC=INDEL;AC=231;AF=0.73;AN=316;refseq.name=NM_206594;refseq.positionType=intron GT 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 +chr1 217363476 . CTATT C . PASS VC=INDEL;AC=40;AF=0.19;AN=212 GT 0/0 1/1 1/1 0/0 0/1 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 ./. 0/0 ./. 0/0 0/1 0/0 1/1 0/0 1/1 1/1 0/0 ./. 1/1 1/1 ./. ./. ./. 0/0 0/0 ./. 1/1 0/0 ./. 0/1 0/0 0/0 ./. 0/1 0/0 ./. ./. ./. ./. ./. ./. ./. 0/0 0/0 ./. 0/0 0/1 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/1 0/0 ./. ./. ./. 0/0 ./. ./. 0/0 0/0 ./. 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 ./. ./. 0/0 ./. ./. ./. ./. ./. ./. ./. +chr1 218217904 . C CG . PASS VC=INDEL;AC=130;AF=0.43;AN=302 GT 0/1 0/1 0/1 ./. 1/1 0/1 ./. 0/1 0/0 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 ./. 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 ./. 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. +chr1 218473680 . CGAG C . PASS VC=INDEL;AC=16;AF=0.05;AN=316;refseq.name=NM_016052;refseq.positionType=intron GT 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 218574584 . A AT . PASS VC=INDEL;AC=21;AF=0.09;AN=236;refseq.name=NM_003238;refseq.positionType=intron GT 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 ./. ./. 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/1 ./. 0/0 ./. 0/1 0/1 0/1 0/0 ./. 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. ./. ./. 0/1 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 ./. ./. 0/0 0/0 ./. 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/0 ./. 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 218845277 . TTTGT T . PASS VC=INDEL;AC=97;AF=0.31;AN=314 GT 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 ./. 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 219001503 . T TC . PASS VC=INDEL;AC=176;AF=0.56;AN=316 GT 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 +chr1 219293844 . A ACT . PASS VC=INDEL;AC=274;AF=0.89;AN=308 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 ./. 1/1 0/0 1/1 1/1 1/1 1/1 1/1 +chr1 219293846 . T TCT . PASS VC=INDEL;AC=199;AF=0.9;AN=222 GT 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 ./. ./. ./. 1/1 1/1 ./. 1/1 1/1 1/1 ./. 0/1 ./. ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. ./. 1/1 ./. ./. ./. 1/1 1/1 ./. 1/1 ./. 1/1 ./. ./. 0/1 0/0 1/1 ./. 1/1 1/1 ./. ./. 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 0/1 ./. 0/1 ./. 1/1 0/1 0/1 1/1 0/1 0/1 ./. 1/1 1/1 0/1 ./. 1/1 1/1 1/1 ./. 1/1 ./. ./. 1/1 1/1 ./. ./. 0/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. ./. ./. 1/1 ./. 1/1 1/1 1/1 ./. 0/1 1/1 ./. 0/1 ./. 1/1 0/1 ./. 0/0 ./. 1/1 ./. 1/1 ./. +chr1 219467766 . AAC A . PASS VC=INDEL;AC=102;AF=0.32;AN=314 GT 0/0 1/1 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 ./. 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 +chr1 219839015 . C CATGG . PASS VC=INDEL;AC=73;AF=0.24;AN=306 GT 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 ./. 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 1/1 0/1 +chr1 221137225 . T TCTT . PASS VC=INDEL;AC=159;AF=0.61;AN=262 GT 0/0 ./. 0/1 0/1 0/1 ./. 1/1 1/1 ./. 0/1 1/1 1/1 0/1 ./. 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 ./. 0/1 0/1 0/1 0/1 1/1 ./. 0/1 0/1 0/0 0/1 0/1 ./. ./. 0/1 0/0 0/1 0/1 ./. 1/1 0/1 1/1 ./. 0/1 1/1 0/0 0/1 ./. ./. ./. 0/1 ./. 0/1 ./. 0/1 1/1 0/1 0/1 ./. 0/1 0/1 0/0 0/0 ./. 0/1 ./. 0/1 0/1 1/1 0/1 1/1 0/0 1/1 ./. 1/1 1/1 ./. 0/1 0/1 0/0 ./. 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 ./. 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 ./. 1/1 0/1 0/1 0/1 ./. 0/1 0/0 1/1 ./. ./. 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 +chr1 221202698 . GA G . PASS VC=INDEL;AC=82;AF=0.26;AN=310 GT 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 ./. 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 +chr1 221279126 . CC C . PASS VC=INDEL;AC=0;AF=0;AN=312 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 221315912 . TTCT T . PASS VC=INDEL;AC=94;AF=0.3;AN=312 GT 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 1/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 +chr1 222205539 . AATTGACC A . PASS VC=INDEL;AC=90;AF=0.29;AN=310 GT 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 ./. 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 222493300 . T TGA . PASS VC=INDEL;AC=310;AF=0.98;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 222493301 . G GAG . PASS VC=INDEL;AC=310;AF=0.98;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 222990213 . ATTTG A . PASS VC=INDEL;AC=9;AF=0.04;AN=254 GT 0/1 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. ./. ./. ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 ./. ./. ./. ./. 0/0 0/0 0/1 +chr1 223387015 . CTG C . PASS VC=INDEL;AC=6;AF=0.02;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 223657734 . A ATGAG . PASS VC=INDEL;AC=231;AF=0.99;AN=234 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. ./. 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 ./. ./. 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. ./. ./. 1/1 1/1 ./. 1/1 1/1 ./. 1/1 ./. 1/1 1/1 ./. 1/1 ./. ./. 0/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 0/1 ./. 1/1 1/1 1/1 ./. 1/1 ./. ./. 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. ./. 1/1 1/1 1/1 1/1 1/1 +chr1 223984835 . G GAA . PASS VC=INDEL;AC=194;AF=0.63;AN=306;refseq.name=NM_001031685;refseq.positionType=intron GT ./. 1/1 0/1 ./. 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/0 ./. 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 +chr1 224264255 . A AG . PASS VC=INDEL;AC=150;AF=0.66;AN=228 GT 0/1 1/1 0/1 0/1 1/1 ./. 0/1 ./. 1/1 1/1 ./. ./. ./. 1/1 ./. 0/1 0/0 ./. ./. 0/1 1/1 0/1 0/1 0/1 ./. 0/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 ./. 0/1 0/1 0/0 1/1 0/0 1/1 1/1 1/1 ./. 1/1 ./. 0/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 ./. 1/1 1/1 0/1 1/1 1/1 ./. 0/1 1/1 0/1 1/1 ./. 1/1 ./. 0/1 1/1 0/0 ./. 1/1 1/1 ./. ./. 1/1 1/1 0/1 ./. 0/0 0/1 0/1 ./. 0/0 1/1 0/1 0/1 1/1 ./. 1/1 ./. ./. 1/1 0/0 0/1 ./. 1/1 0/0 ./. 0/1 0/0 0/1 ./. ./. 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 ./. 0/0 0/1 0/1 1/1 0/1 ./. 0/0 1/1 ./. ./. ./. ./. 1/1 ./. 1/1 0/1 0/1 1/1 0/1 0/1 1/1 ./. 1/1 ./. ./. 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 ./. 0/1 0/1 0/1 ./. ./. +chr1 224264346 . TGAG T . PASS VC=INDEL;AC=154;AF=0.63;AN=244 GT 0/1 1/1 0/1 0/1 1/1 ./. ./. 1/1 ./. 1/1 0/0 1/1 1/1 ./. 0/1 ./. 0/1 ./. 1/1 0/1 1/1 0/1 0/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 0/1 0/1 0/0 ./. 0/0 1/1 1/1 1/1 0/1 1/1 ./. 0/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 ./. 1/1 1/1 0/1 1/1 1/1 0/1 0/1 ./. ./. ./. 0/1 ./. 1/1 0/1 ./. 0/0 ./. ./. 1/1 0/1 ./. 1/1 ./. 0/1 ./. 0/0 0/1 0/1 ./. 0/0 1/1 0/1 0/1 ./. 1/1 ./. 0/1 0/1 1/1 0/0 0/1 ./. 1/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 0/1 0/0 1/1 0/1 ./. 0/1 0/1 ./. 0/1 0/1 ./. 0/1 0/0 0/0 1/1 ./. 0/1 1/1 0/1 ./. 0/1 1/1 0/1 ./. 1/1 0/1 0/1 ./. 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 ./. 1/1 0/1 +chr1 224833844 . A AAGACGTAAGACAGT . PASS VC=INDEL;AC=215;AF=0.68;AN=314;refseq.name=NM_152495;refseq.positionType=intron GT 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 ./. 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 +chr1 225662220 . CT C . PASS VC=INDEL;AC=203;AF=0.66;AN=306 GT 0/1 1/1 0/1 0/1 1/1 0/1 ./. 0/0 ./. 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 ./. 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 ./. 0/0 0/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 +chr1 225974486 . T TG . PASS VC=INDEL;AC=187;AF=0.6;AN=310;refseq.name=NM_003133;refseq.positionType=intron GT 0/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 ./. 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 ./. 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 +chr1 225974487 . G GG . PASS VC=INDEL;AC=189;AF=0.6;AN=314;refseq.name=NM_003133;refseq.positionType=intron GT 0/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 ./. 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 +chr1 226014266 . ATGG A . PASS VC=INDEL;AC=30;AF=0.1;AN=310;refseq.name=NM_000120;refseq.positionType=intron GT 0/0 0/1 1/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. +chr1 226014267 . TGGT T . PASS VC=INDEL;AC=31;AF=0.1;AN=316;refseq.name=NM_000120;refseq.positionType=intron GT 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 226878226 . ACTC A . PASS VC=INDEL;AC=45;AF=0.15;AN=306;refseq.name=NM_002221;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 1/1 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 1/1 ./. 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 +chr1 226878233 . CTAC C . PASS VC=INDEL;AC=60;AF=0.21;AN=292;refseq.name=NM_002221;refseq.positionType=intron GT 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 ./. ./. 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 ./. 1/1 ./. ./. 0/0 0/0 0/0 1/1 0/0 0/1 0/1 ./. 0/0 ./. 0/0 0/0 0/1 0/1 0/0 ./. 0/0 ./. 0/1 0/0 +chr1 226913049 . GCCA G . PASS VC=INDEL;AC=14;AF=0.05;AN=302;refseq.name=NM_002221;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 226913051 . CACC C . PASS VC=INDEL;AC=6;AF=0.02;AN=280;refseq.name=NM_002221;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 227051261 . G GC . PASS VC=INDEL;AC=21;AF=0.07;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 227252431 . TTTC T . PASS VC=INDEL;AC=21;AF=0.07;AN=316;refseq.name=NM_003607;refseq.positionType=intron GT 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +chr1 227401072 . GC G . PASS VC=INDEL;AC=122;AF=0.39;AN=316;refseq.name=NM_003607;refseq.positionType=intron GT 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 +chr1 227560279 . G GTCATAG . PASS VC=INDEL;AC=316;AF=1;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 228479392 . ATG A . PASS VC=INDEL;AC=12;AF=0.04;AN=316;refseq.name=NM_001098623;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 229074693 . TAGAGG T . PASS VC=INDEL;AC=102;AF=0.32;AN=316 GT 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 +chr1 229075090 . ATAGCCTG A . PASS VC=INDEL;AC=30;AF=0.11;AN=264 GT 1/1 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 ./. 0/0 ./. 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. +chr1 229336842 . CATTT C . PASS VC=INDEL;AC=19;AF=0.06;AN=300 GT ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/1 ./. 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 229631495 . A AC . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_018230;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 229922597 . CCTT C . PASS VC=INDEL;AC=144;AF=0.46;AN=316 GT 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 +chr1 229922599 . TTCT T . PASS VC=INDEL;AC=142;AF=0.45;AN=314 GT 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 +chr1 230272407 . GAG G . PASS VC=INDEL;AC=15;AF=0.05;AN=314;refseq.name=NM_004481;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 230625946 . T TGA . PASS VC=INDEL;AC=302;AF=0.96;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 230626726 . CTTTAAGTCCTGT C . PASS VC=INDEL;AC=59;AF=0.19;AN=314 GT 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 +chr1 230626728 . TTAAGTCCTGTTT T . PASS VC=INDEL;AC=59;AF=0.19;AN=316 GT 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 +chr1 230697057 . ACA A . PASS VC=INDEL;AC=152;AF=0.48;AN=316 GT 0/1 1/1 1/1 0/0 1/1 0/0 1/1 0/0 0/0 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 +chr1 230952100 . GG G . PASS VC=INDEL;AC=34;AF=0.11;AN=316 GT 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 +chr1 232200072 . CGACT C . PASS VC=INDEL;AC=86;AF=0.28;AN=312 GT 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 ./. 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 +chr1 232606995 . GTCTG G . PASS VC=INDEL;AC=54;AF=0.17;AN=316;refseq.name=NM_020808;refseq.positionType=intron GT 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 1/1 +chr1 232883964 . G GTT . PASS VC=INDEL;AC=279;AF=0.88;AN=316 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 232883965 . T TTT . PASS VC=INDEL;AC=279;AF=0.88;AN=316 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 232944224 . AAGAA A . PASS VC=INDEL;AC=17;AF=0.05;AN=316;refseq.name=NM_019090;refseq.positionType=exon GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 233013835 . C CT . PASS VC=INDEL;AC=38;AF=0.18;AN=214 GT 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/1 ./. ./. 0/1 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/1 1/1 ./. ./. ./. 1/1 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 ./. 0/0 0/0 0/0 0/1 1/1 1/1 0/1 ./. ./. 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/1 0/0 ./. ./. ./. 0/1 ./. 0/1 0/1 ./. ./. ./. 0/0 0/1 ./. 0/1 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/1 0/0 ./. ./. 0/0 0/0 ./. 1/1 0/1 ./. 1/1 0/1 0/0 ./. 0/0 1/1 ./. ./. 0/0 1/1 ./. ./. 0/0 ./. 1/1 ./. 1/1 ./. ./. 0/0 ./. ./. +chr1 233013837 . T TT . PASS VC=INDEL;AC=78;AF=0.25;AN=310 GT 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 ./. 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 1/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 +chr1 233458691 . ACAC A . PASS VC=INDEL;AC=18;AF=0.06;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 +chr1 233593090 . TT T . PASS VC=INDEL;AC=257;AF=0.82;AN=312 GT 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/0 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 +chr1 233991847 . T TCA . PASS VC=INDEL;AC=220;AF=0.72;AN=306 GT 1/1 1/1 ./. 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 ./. 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 ./. 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 ./. 0/1 0/1 0/1 1/1 1/1 1/1 1/1 ./. 0/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 +chr1 234635298 . G GT . PASS VC=INDEL;AC=205;AF=0.65;AN=316 GT 0/1 0/0 0/0 0/1 0/0 1/1 0/0 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 +chr1 234704346 . TCT T . PASS VC=INDEL;AC=36;AF=0.12;AN=312 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 +chr1 235770627 . AATTA A . PASS VC=INDEL;AC=56;AF=0.18;AN=316;refseq.name=NM_004485;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 236043714 . ATCCTGTGTTGATTTA A . PASS VC=INDEL;AC=6;AF=0.02;AN=294 GT ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 236043717 . CTGTGTTGATTTATTA C . PASS VC=INDEL;AC=5;AF=0.02;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 236118487 . TT T . PASS VC=INDEL;AC=12;AF=0.04;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr1 236195380 . GTG G . PASS VC=INDEL;AC=163;AF=0.52;AN=316;refseq.name=NM_002508;refseq.positionType=intron GT 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 +chr1 236375505 . T TG . PASS VC=INDEL;AC=130;AF=0.42;AN=310 GT 0/0 ./. 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 +chr1 236555148 . T TA . PASS VC=INDEL;AC=3;AF=0.01;AN=316;refseq.name=NM_145861;refseq.positionType=promoter GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +chr1 236723352 . CGACCTCGCTCAGACTCTGTGAGGTGCTGAATAAGCAACA C . PASS VC=INDEL;AC=72;AF=0.23;AN=314;refseq.name=NM_018072;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 236723354 . ACCTCGCTCAGACTCTGTGAGGTGCTGAATAAGCAACAGA A . PASS VC=INDEL;AC=72;AF=0.23;AN=312;refseq.name=NM_018072;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 236848307 . A AG . PASS VC=INDEL;AC=62;AF=0.21;AN=300;refseq.name=NM_001103;refseq.positionType=promoter GT 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 ./. ./. 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 ./. 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 +chr1 237009685 . TAGC T . PASS VC=INDEL;AC=6;AF=0.02;AN=292;refseq.name=NM_000254;refseq.positionType=intron GT 0/1 0/0 0/0 ./. 0/1 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 237009687 . GCAG G . PASS VC=INDEL;AC=3;AF=0.01;AN=304;refseq.name=NM_000254;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 237055125 . CA C . PASS VC=INDEL;AC=9;AF=0.03;AN=284;refseq.name=NM_000254;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 237277023 . C CA . PASS VC=INDEL;AC=18;AF=0.06;AN=312;refseq.name=NM_001035;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 +chr1 237535965 . AA A . PASS VC=INDEL;AC=0;AF=0;AN=280;refseq.name=NM_001035;refseq.positionType=intron GT 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 +chr1 237539975 . GCTTGA G . PASS VC=INDEL;AC=3;AF=0.01;AN=316;refseq.name=NM_001035;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 +chr1 237649833 . C CTCTT . PASS VC=INDEL;AC=140;AF=0.45;AN=312;refseq.name=NM_001035;refseq.positionType=intron GT 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 ./. 0/0 1/1 0/1 ./. 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 +chr1 237649835 . C CTTTC . PASS VC=INDEL;AC=138;AF=0.44;AN=312;refseq.name=NM_001035;refseq.positionType=intron GT 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/1 ./. 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 ./. 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 +chr1 237995162 . T TTTGA . PASS VC=INDEL;AC=301;AF=0.96;AN=312;refseq.name=NM_001035;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 238017296 . T TCT . PASS VC=INDEL;AC=80;AF=0.25;AN=316 GT 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 +chr1 238125441 . AGA A . PASS VC=INDEL;AC=26;AF=0.08;AN=316 GT 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 238152842 . C CGTAA . PASS VC=INDEL;AC=165;AF=0.52;AN=316 GT 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 +chr1 238152845 . A AAGTA . PASS VC=INDEL;AC=166;AF=0.53;AN=316 GT 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 +chr1 238257585 . TGAT T . PASS VC=INDEL;AC=159;AF=0.61;AN=262 GT 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 ./. 1/1 0/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 1/1 0/1 ./. 0/0 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 ./. 0/1 ./. 1/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 ./. 0/0 0/1 ./. 0/0 0/0 0/1 ./. 0/1 0/1 0/0 0/0 1/1 ./. 0/1 0/1 ./. 0/1 ./. 0/1 ./. 0/1 0/0 ./. 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 ./. 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 ./. 1/1 0/1 1/1 ./. ./. 0/0 1/1 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 0/1 ./. ./. ./. 0/1 0/1 ./. ./. 0/1 1/1 1/1 +chr1 238476744 . A ATCTA . PASS VC=INDEL;AC=283;AF=0.98;AN=290 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 +chr1 238497833 . G GAGAA . PASS VC=INDEL;AC=232;AF=0.76;AN=304 GT 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 1/1 1/1 ./. 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 ./. 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 ./. 1/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 0/0 ./. ./. 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 +chr1 238623394 . C CTTGA . PASS VC=INDEL;AC=178;AF=0.58;AN=308 GT 0/0 1/1 1/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 ./. 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 ./. ./. 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 ./. 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 +chr1 238699979 . T TATCT . PASS VC=INDEL;AC=97;AF=0.31;AN=314 GT 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/0 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 +chr1 238921290 . CATTCAT C . PASS VC=INDEL;AC=188;AF=0.59;AN=316 GT 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 +chr1 238933453 . C CA . PASS VC=INDEL;AC=26;AF=0.08;AN=314 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 238933454 . A AA . PASS VC=INDEL;AC=25;AF=0.08;AN=314 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 239644576 . C CAA . PASS VC=INDEL;AC=46;AF=0.15;AN=300 GT 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 ./. ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 ./. 1/1 0/0 0/1 0/1 0/0 ./. 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 +chr1 240115184 . GAAG G . PASS VC=INDEL;AC=62;AF=0.2;AN=316 GT 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 +chr1 240170484 . ATCA A . PASS VC=INDEL;AC=30;AF=0.1;AN=310 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 +chr1 240469105 . A ACT . PASS VC=INDEL;AC=44;AF=0.14;AN=308;refseq.name=NM_020066;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 +chr1 240556294 . A AG . PASS VC=INDEL;AC=180;AF=0.73;AN=248;refseq.name=NM_020066;refseq.positionType=intron GT ./. 0/1 1/1 ./. 1/1 0/1 1/1 1/1 ./. 0/1 1/1 0/1 1/1 0/1 ./. 0/0 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 ./. ./. ./. 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 ./. 0/1 0/1 0/1 ./. 0/1 1/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 ./. 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 ./. 0/0 0/0 0/1 ./. 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 ./. ./. ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 0/1 1/1 0/1 ./. 1/1 1/1 ./. 1/1 0/1 ./. ./. 0/1 ./. 1/1 1/1 0/0 0/1 1/1 1/1 1/1 ./. ./. 1/1 0/1 1/1 ./. ./. ./. ./. 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 ./. 0/1 0/1 0/0 ./. 0/0 0/1 ./. 0/1 1/1 0/1 +chr1 240750353 . A AT . PASS VC=INDEL;AC=1;AF=0;AN=208;refseq.name=NM_022469;refseq.positionType=intron GT 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. +chr1 241292738 . CGAC C . PASS VC=INDEL;AC=16;AF=0.06;AN=254;refseq.name=NM_002924;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 ./. 0/0 1/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/1 ./. ./. 0/0 ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. ./. 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. ./. ./. 0/0 ./. 0/1 0/1 0/0 0/0 +chr1 241342365 . TTCAA T . PASS VC=INDEL;AC=54;AF=0.18;AN=308;refseq.name=NM_002924;refseq.positionType=intron GT 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 ./. 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 1/1 ./. 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 +chr1 241864983 . A AGTCAAAC . PASS VC=INDEL;AC=235;AF=0.75;AN=314;refseq.name=NM_144625;refseq.positionType=intron GT 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 +chr1 241901460 . ACTG A . PASS VC=INDEL;AC=126;AF=0.4;AN=316;refseq.name=NM_144625;refseq.positionType=intron GT 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 1/1 1/1 1/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 +chr1 241920499 . TGTAG T . PASS VC=INDEL;AC=5;AF=0.02;AN=316;refseq.name=NM_144625;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 +chr1 241920501 . TAGGT T . PASS VC=INDEL;AC=5;AF=0.02;AN=316;refseq.name=NM_144625;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 +chr1 242055743 . C CTG . PASS VC=INDEL;AC=47;AF=0.15;AN=314 GT 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 +chr1 242257290 . TC T . PASS VC=INDEL;AC=59;AF=0.22;AN=270;refseq.name=NM_152666;refseq.positionType=intron GT 0/1 ./. 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 ./. 0/0 0/1 0/0 0/1 0/0 0/1 ./. ./. ./. 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 ./. ./. 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 ./. 0/0 ./. 0/1 0/1 0/0 ./. 0/1 0/0 ./. 0/0 0/0 0/1 0/0 ./. 0/0 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/1 ./. 0/0 1/1 0/1 1/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 ./. 0/1 0/1 0/1 0/0 +chr1 242281287 . T TCT . PASS VC=INDEL;AC=296;AF=0.95;AN=312;refseq.name=NM_152666;refseq.positionType=intron GT 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 +chr1 242328018 . CATTACACTACTTTT C . PASS VC=INDEL;AC=97;AF=0.4;AN=244;refseq.name=NM_152666;refseq.positionType=intron GT 1/1 0/1 0/1 ./. 1/1 0/0 0/1 0/0 1/1 0/1 ./. 0/0 ./. 0/1 0/0 0/1 0/1 ./. 0/1 0/0 1/1 0/0 0/1 ./. 0/0 0/1 1/1 1/1 0/1 ./. 0/0 0/1 1/1 0/1 1/1 0/0 ./. 0/0 ./. 1/1 0/0 0/1 0/1 0/0 0/1 0/1 ./. ./. ./. 0/1 0/1 ./. 0/0 1/1 0/1 0/1 0/1 0/1 ./. 0/1 ./. 1/1 ./. 0/0 0/0 1/1 0/1 0/1 ./. 1/1 0/1 1/1 0/1 ./. ./. 1/1 0/1 0/1 0/1 ./. ./. 0/0 1/1 0/1 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 ./. ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/0 0/1 0/1 0/1 ./. 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/1 ./. ./. 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 ./. ./. ./. 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 ./. 0/0 0/0 +chr1 242602261 . CC C . PASS VC=INDEL;AC=51;AF=0.16;AN=316;refseq.name=NM_152666;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 +chr1 243409926 . AAGTT A . PASS VC=INDEL;AC=99;AF=0.32;AN=312;refseq.name=NM_014812;refseq.positionType=intron GT 1/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 +chr1 243410210 . G GTAT . PASS VC=INDEL;AC=137;AF=0.43;AN=316;refseq.name=NM_014812;refseq.positionType=intron GT 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 +chr1 243435760 . CATT C . PASS VC=INDEL;AC=26;AF=0.1;AN=272;refseq.name=NM_006642;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/1 ./. 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. ./. +chr1 244015225 . GTCTG G . PASS VC=INDEL;AC=70;AF=0.22;AN=316 GT 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 +chr1 244033256 . GTTGA G . PASS VC=INDEL;AC=18;AF=0.06;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 244186794 . T TT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 244216819 . T TA . PASS VC=INDEL;AC=79;AF=0.25;AN=316;refseq.name=NM_006352;refseq.positionType=exon GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 +chr1 244216822 . A AA . PASS VC=INDEL;AC=79;AF=0.25;AN=312;refseq.name=NM_006352;refseq.positionType=exon GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 +chr1 244371962 . CAACTGGTCAAC C . PASS VC=INDEL;AC=2;AF=0.01;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 244372739 . C CTA . PASS VC=INDEL;AC=70;AF=0.22;AN=312 GT 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 +chr1 244517491 . A AG . PASS VC=INDEL;AC=229;AF=0.72;AN=316;refseq.name=NM_001012970;refseq.positionType=intron GT 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 +chr1 244552134 . CATTT C . PASS VC=INDEL;AC=41;AF=0.13;AN=314;refseq.name=NM_001012970;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 244794244 . T TAAC . PASS VC=INDEL;AC=2;AF=0.01;AN=316;refseq.name=NM_173807;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 245242885 . A ATT . PASS VC=INDEL;AC=3;AF=0.01;AN=316;refseq.name=NM_032328;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 245242887 . T TTT . PASS VC=INDEL;AC=3;AF=0.01;AN=316;refseq.name=NM_032328;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr1 245310839 . T TTAAAG . PASS VC=INDEL;AC=156;AF=0.59;AN=266 GT 0/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 ./. 1/1 1/1 1/1 0/0 0/1 0/1 ./. 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 ./. 1/1 0/0 0/0 0/1 ./. 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 ./. ./. 0/0 0/1 0/1 0/0 0/0 ./. 0/1 ./. 0/0 ./. ./. ./. 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 1/1 ./. 1/1 1/1 ./. 0/1 0/1 1/1 1/1 0/0 ./. 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 ./. 1/1 ./. 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 ./. ./. 0/1 ./. 0/1 0/0 0/1 0/0 1/1 0/0 0/1 ./. ./. ./. 0/1 ./. 1/1 1/1 1/1 0/1 0/1 0/1 1/1 ./. 1/1 +chr1 245453003 . G GCCAA . PASS VC=INDEL;AC=80;AF=0.26;AN=308;refseq.name=NM_018012;refseq.positionType=intron GT 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 ./. 0/0 0/1 ./. 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/0 0/1 +chr1 245709104 . A AGTCAAC . PASS VC=INDEL;AC=221;AF=0.7;AN=316;refseq.name=NM_018012;refseq.positionType=intron GT 1/1 0/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 +chr1 245868167 . G GTCTT . PASS VC=INDEL;AC=138;AF=0.44;AN=316 GT 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 +chr1 245868172 . T TCTTT . PASS VC=INDEL;AC=137;AF=0.43;AN=316 GT 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 +chr1 246124841 . A AAACAGAAG . PASS VC=INDEL;AC=316;AF=1;AN=316;refseq.name=NM_022743;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 246124843 . A ACAGAAGAA . PASS VC=INDEL;AC=316;AF=1;AN=316;refseq.name=NM_022743;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr1 246149511 . C CT . PASS VC=INDEL;AC=69;AF=0.32;AN=214;refseq.name=NM_022743;refseq.positionType=intron GT 1/1 ./. 0/1 0/1 1/1 ./. 0/1 1/1 0/0 ./. ./. 1/1 ./. ./. ./. 0/1 ./. 0/0 ./. ./. 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 ./. ./. ./. 0/1 ./. 1/1 0/1 ./. ./. ./. 1/1 0/1 ./. ./. 1/1 ./. 1/1 0/1 1/1 ./. 0/1 0/1 1/1 ./. 0/1 1/1 0/1 ./. 0/1 0/1 0/0 0/0 0/1 ./. 0/1 1/1 ./. ./. 1/1 ./. 1/1 0/1 ./. 0/1 0/1 ./. 0/1 0/1 0/0 ./. 0/1 ./. 0/0 0/1 ./. 0/1 0/1 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/1 ./. 0/1 0/0 0/0 0/0 ./. ./. ./. 0/1 0/0 0/1 0/1 0/1 0/0 0/0 ./. ./. 0/0 ./. ./. 0/1 ./. +chr1 246152615 . GC G . PASS VC=INDEL;AC=164;AF=0.52;AN=316;refseq.name=NM_022743;refseq.positionType=intron GT 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 +chr1 247110970 . T TCA . PASS VC=INDEL;AC=157;AF=0.5;AN=316 GT 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 +chr1 247340579 . TTTCTT T . PASS VC=INDEL;AC=232;AF=0.74;AN=312 GT 1/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 1/1 1/1 ./. 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 1/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 ./. 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr1 247694106 . C CTCCGTGGCCTAAACGGGCAGCCGAGCCCG . PASS VC=INDEL;AC=124;AF=0.62;AN=200;refseq.name=NM_198074;refseq.positionType=exon GT ./. ./. 1/1 1/1 1/1 0/1 ./. 1/1 0/1 ./. 1/1 1/1 0/1 0/1 ./. 0/1 ./. 1/1 ./. 1/1 1/1 ./. 1/1 ./. 0/1 0/1 ./. 0/1 0/1 ./. 0/1 0/1 0/1 ./. 0/1 ./. ./. 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/1 ./. 0/1 0/1 0/1 0/1 ./. 0/1 ./. 0/1 0/1 ./. 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 ./. ./. ./. 0/1 ./. ./. ./. 0/1 0/1 1/1 0/1 ./. 0/1 0/1 0/1 0/1 ./. 0/1 0/1 ./. 1/1 0/1 ./. ./. ./. 1/1 0/1 1/1 ./. ./. 1/1 0/1 1/1 ./. 1/1 1/1 1/1 ./. ./. ./. ./. ./. ./. ./. 0/1 0/1 ./. 0/1 ./. 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/1 ./. 0/1 ./. ./. ./. 0/1 ./. 0/1 ./. ./. 0/1 ./. ./. 1/1 ./. 1/1 1/1 1/1 1/1 ./. +chr1 248807991 . TATGA T . PASS VC=INDEL;AC=85;AF=0.34;AN=252 GT 0/0 ./. 0/1 0/1 ./. 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/0 0/1 0/1 ./. ./. 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/0 ./. 0/0 1/1 0/0 ./. 0/1 0/1 ./. ./. 0/0 0/1 0/0 ./. ./. 0/1 ./. 0/1 ./. 0/1 0/1 0/0 1/1 ./. ./. 1/1 0/1 1/1 0/1 0/0 1/1 ./. 0/1 1/1 0/0 ./. ./. 0/1 ./. 0/0 0/1 0/0 0/0 0/1 ./. 0/1 ./. 0/0 ./. 0/1 0/1 1/1 0/1 ./. ./. 0/0 1/1 0/1 0/0 0/1 ./. 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/1 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 1/1 ./. 1/1 0/1 0/1 ./. 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 +chr1 248809274 . GAACA G . PASS VC=INDEL;AC=79;AF=0.26;AN=304 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. ./. 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 +chr1 248809275 . AACAA A . PASS VC=INDEL;AC=79;AF=0.26;AN=306 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 +chr1 248809277 . C CAATT . PASS VC=INDEL;AC=9;AF=0.03;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr1 249122808 . C CAT . PASS VC=INDEL;AC=176;AF=0.58;AN=304;refseq.name=NM_030645;refseq.positionType=promoter GT 0/1 1/1 0/0 0/1 1/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 ./. 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 ./. 0/0 1/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 ./. 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 0/0 1/1 ./. 0/1 1/1 0/0 0/1 1/1 1/1 ./. 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 +chr1 249129038 . GCCTCTAACTT G . PASS VC=INDEL;AC=2;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 311906 . TA T . PASS VC=INDEL;AC=148;AF=0.48;AN=308 GT 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 ./. 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 ./. 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 +chr2 341060 . TC T . PASS VC=INDEL;AC=52;AF=0.17;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 1/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 +chr2 623863 . GTTC G . PASS VC=INDEL;AC=278;AF=0.9;AN=310 GT 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 +chr2 623869 . CTTC C . PASS VC=INDEL;AC=283;AF=0.9;AN=314 GT 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 +chr2 872231 . G GCC . PASS VC=INDEL;AC=46;AF=0.16;AN=284 GT 1/1 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 ./. 0/1 ./. 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 +chr2 872234 . C CCC . PASS VC=INDEL;AC=53;AF=0.21;AN=248 GT 1/1 0/1 0/0 1/1 0/0 1/1 1/1 0/1 ./. 0/0 0/1 0/1 ./. 0/0 0/0 ./. 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/1 ./. ./. ./. 0/0 0/0 ./. ./. ./. 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/1 ./. 0/0 0/0 ./. 0/0 0/0 0/1 ./. 0/1 0/0 ./. 0/1 0/1 0/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 ./. 0/1 ./. ./. ./. 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 ./. 0/0 ./. 0/0 ./. +chr2 1131016 . TTTAGG T . PASS VC=INDEL;AC=189;AF=0.6;AN=316;refseq.name=NM_018968;refseq.positionType=intron GT 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/1 +chr2 1146399 . T TA . PASS VC=INDEL;AC=280;AF=0.89;AN=316;refseq.name=NM_018968;refseq.positionType=intron GT 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 +chr2 1146400 . A AA . PASS VC=INDEL;AC=280;AF=0.89;AN=316;refseq.name=NM_018968;refseq.positionType=intron GT 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 +chr2 1184342 . CAACTT C . PASS VC=INDEL;AC=94;AF=0.3;AN=316;refseq.name=NM_018968;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 +chr2 1369823 . AGC A . PASS VC=INDEL;AC=243;AF=0.77;AN=316;refseq.name=NM_018968;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 +chr2 1371776 . T TTTAA . PASS VC=INDEL;AC=50;AF=0.16;AN=312;refseq.name=NM_018968;refseq.positionType=terminator GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/0 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 ./. 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr2 1371779 . A AATTA . PASS VC=INDEL;AC=38;AF=0.13;AN=282;refseq.name=NM_018968;refseq.positionType=terminator GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/1 ./. 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 1/1 0/1 0/1 0/0 ./. ./. 0/0 0/1 0/0 0/0 ./. ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 ./. 0/0 0/0 1/1 0/0 0/1 ./. ./. 1/1 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. +chr2 1379755 . A AA . PASS VC=INDEL;AC=5;AF=0.02;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 1789405 . A AT . PASS VC=INDEL;AC=63;AF=0.2;AN=316 GT 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 +chr2 2440845 . A AA . PASS VC=INDEL;AC=87;AF=0.32;AN=272 GT ./. 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/1 0/0 0/0 0/0 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 ./. 0/0 0/0 0/0 0/0 0/1 0/1 ./. 1/1 0/1 1/1 ./. 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 ./. ./. ./. 0/1 ./. 0/1 ./. 0/0 ./. 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 ./. 0/1 0/1 0/0 1/1 0/1 ./. 0/1 ./. 0/1 ./. 1/1 1/1 ./. 0/1 ./. 1/1 0/1 0/1 0/1 ./. 0/0 0/1 +chr2 2656901 . TG T . PASS VC=INDEL;AC=278;AF=0.9;AN=310 GT 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 +chr2 3126017 . G GG . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 3424142 . CGCTGAC C . PASS VC=INDEL;AC=112;AF=0.46;AN=244;refseq.name=NM_016030;refseq.positionType=intron GT 0/1 0/1 ./. 0/0 0/1 ./. 1/1 0/1 0/1 0/0 ./. 1/1 0/0 0/1 ./. ./. 0/1 0/0 0/0 0/1 ./. 0/1 1/1 ./. 0/0 0/1 ./. 1/1 0/1 0/1 0/1 ./. ./. 0/0 0/0 ./. 1/1 1/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 ./. 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 ./. ./. ./. 0/1 0/1 1/1 1/1 ./. 1/1 ./. 0/0 ./. 0/1 0/0 1/1 ./. ./. 1/1 ./. 0/1 0/0 0/1 ./. 0/1 ./. 0/1 1/1 0/1 1/1 0/1 0/1 0/1 ./. 0/1 0/1 0/1 ./. 0/0 0/1 ./. ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 ./. 0/1 1/1 0/1 0/1 ./. 0/0 0/1 ./. ./. 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 1/1 ./. +chr2 3658789 . ACAAA A . PASS VC=INDEL;AC=95;AF=0.33;AN=284;refseq.name=NM_024027;refseq.positionType=intron GT 0/1 0/1 0/0 0/1 0/1 0/1 0/1 ./. 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 ./. 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 ./. 0/1 0/0 ./. 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 ./. 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/1 ./. 0/0 ./. 0/0 ./. 0/1 +chr2 3749151 . GGAA G . PASS VC=INDEL;AC=163;AF=0.53;AN=310;refseq.name=NM_018436;refseq.positionType=exon GT 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 ./. 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 +chr2 3749158 . GAAG G . PASS VC=INDEL;AC=164;AF=0.53;AN=308;refseq.name=NM_018436;refseq.positionType=exon GT 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 1/1 0/1 0/1 ./. 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 ./. 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 +chr2 4140967 . G GA . PASS VC=INDEL;AC=125;AF=0.4;AN=312 GT 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 ./. 1/1 1/1 0/1 +chr2 4184693 . AGAG A . PASS VC=INDEL;AC=60;AF=0.22;AN=274 GT 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 ./. ./. ./. ./. ./. 0/0 0/1 0/1 0/0 0/1 ./. 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 ./. 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 ./. 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/1 1/1 0/0 0/1 0/1 ./. 0/0 0/0 0/1 0/1 0/1 ./. 0/0 +chr2 4296243 . ACCTGGCCTTTT A . PASS VC=INDEL;AC=19;AF=0.06;AN=312 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +chr2 4604536 . ATCTG A . PASS VC=INDEL;AC=82;AF=0.27;AN=308 GT 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 ./. 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 1/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 ./. 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 +chr2 4607815 . TAT T . PASS VC=INDEL;AC=90;AF=0.28;AN=316 GT 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 1/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 +chr2 4874174 . CAT C . PASS VC=INDEL;AC=203;AF=0.64;AN=316 GT 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 +chr2 4933418 . GATC G . PASS VC=INDEL;AC=86;AF=0.28;AN=304 GT 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 ./. 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr2 4987676 . A ACT . PASS VC=INDEL;AC=100;AF=0.32;AN=316 GT 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 +chr2 4994909 . G GT . PASS VC=INDEL;AC=122;AF=0.41;AN=294 GT 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 ./. 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 ./. 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/1 0/1 0/1 0/1 ./. 0/0 0/0 0/1 0/1 ./. 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 ./. 0/0 ./. 0/1 ./. 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 ./. 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 +chr2 5222830 . CTGTT C . PASS VC=INDEL;AC=127;AF=0.4;AN=314 GT 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 ./. 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 +chr2 5418395 . T TAA . PASS VC=INDEL;AC=147;AF=0.47;AN=314 GT 1/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 ./. 0/1 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 +chr2 5821332 . TTCAGTCCCCCTAATGCC T . PASS VC=INDEL;AC=261;AF=0.83;AN=316 GT 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 +chr2 5821334 . CAGTCCCCCTAATGCCTC C . PASS VC=INDEL;AC=261;AF=0.83;AN=316 GT 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 +chr2 7238500 . A ACTT . PASS VC=INDEL;AC=184;AF=0.58;AN=316 GT 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 +chr2 7238505 . T TTCT . PASS VC=INDEL;AC=184;AF=0.58;AN=316 GT 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 +chr2 7616680 . C CA . PASS VC=INDEL;AC=196;AF=0.62;AN=314 GT ./. 1/1 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 +chr2 10714143 . CAA C . PASS VC=INDEL;AC=143;AF=0.47;AN=306;refseq.name=NM_024894;refseq.positionType=intron GT 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 ./. 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 ./. 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 ./. 0/1 +chr2 11163207 . TCA T . PASS VC=INDEL;AC=63;AF=0.2;AN=316 GT 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 1/1 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 11163209 . ACA A . PASS VC=INDEL;AC=63;AF=0.2;AN=316 GT 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 1/1 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 11454443 . TTGTC T . PASS VC=INDEL;AC=85;AF=0.27;AN=310;refseq.name=NM_004850;refseq.positionType=intron GT 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 ./. 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +chr2 11600452 . TT T . PASS VC=INDEL;AC=316;AF=1;AN=316;refseq.name=NM_198256;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 11843046 . C CAACT . PASS VC=INDEL;AC=157;AF=0.5;AN=316 GT 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 +chr2 11843047 . A AACTA . PASS VC=INDEL;AC=157;AF=0.5;AN=316 GT 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 +chr2 12317135 . T TT . PASS VC=INDEL;AC=2;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 12787834 . GT G . PASS VC=INDEL;AC=0;AF=0;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 12877501 . G GA . PASS VC=INDEL;AC=241;AF=0.76;AN=316;refseq.name=NM_021643;refseq.positionType=intron GT 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 +chr2 13123234 . A ACTTA . PASS VC=INDEL;AC=273;AF=0.89;AN=308 GT ./. 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 +chr2 13297277 . GC G . PASS VC=INDEL;AC=23;AF=0.07;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 13446741 . T TCACT . PASS VC=INDEL;AC=105;AF=0.41;AN=256 GT 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 1/1 ./. ./. 0/1 0/1 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 ./. ./. 0/1 0/0 0/0 ./. 0/0 0/1 1/1 0/1 0/0 0/0 0/0 1/1 ./. 0/1 ./. ./. 0/1 ./. 0/1 0/0 0/1 ./. 1/1 1/1 0/0 0/1 0/1 1/1 ./. 0/1 0/1 ./. ./. 0/1 0/1 0/0 0/1 ./. ./. 0/0 0/0 ./. 0/0 0/1 0/1 ./. 0/0 ./. 0/1 0/1 ./. 0/1 0/1 ./. 0/1 ./. 1/1 0/1 1/1 0/1 ./. 0/1 1/1 1/1 ./. 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 ./. ./. 0/0 0/1 1/1 ./. ./. 0/0 +chr2 13637137 . TTGCTG T . PASS VC=INDEL;AC=19;AF=0.06;AN=308 GT 0/0 ./. 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr2 13829513 . T TT . PASS VC=INDEL;AC=91;AF=0.29;AN=314 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 ./. 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 +chr2 13967190 . TAGAT T . PASS VC=INDEL;AC=22;AF=0.07;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +chr2 14096044 . AAA A . PASS VC=INDEL;AC=47;AF=0.16;AN=298 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 ./. 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 ./. 1/1 0/0 0/0 +chr2 14214846 . C CT . PASS VC=INDEL;AC=40;AF=0.13;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 +chr2 14381137 . A ATC . PASS VC=INDEL;AC=0;AF=0;AN=280 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 14428427 . G GC . PASS VC=INDEL;AC=242;AF=0.77;AN=316 GT 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 +chr2 14428428 . C CC . PASS VC=INDEL;AC=241;AF=0.77;AN=314 GT 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 1/1 +chr2 14685393 . C CTTC . PASS VC=INDEL;AC=29;AF=0.09;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 +chr2 15208721 . A AC . PASS VC=INDEL;AC=116;AF=0.38;AN=304 GT 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 1/1 ./. 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 1/1 0/1 ./. 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 0/0 0/0 ./. 1/1 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 ./. 1/1 0/1 +chr2 15263072 . A AAGGA . PASS VC=INDEL;AC=86;AF=0.33;AN=262 GT 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 ./. 0/0 ./. ./. 0/0 0/0 0/0 ./. 1/1 ./. 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 ./. 0/1 0/0 0/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 ./. 0/1 0/1 0/0 0/0 ./. 1/1 0/0 0/0 0/0 ./. ./. 0/1 0/1 0/1 ./. 0/0 ./. 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 ./. 0/0 0/1 0/1 0/1 0/1 0/1 ./. 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 ./. 0/0 1/1 ./. 0/1 0/0 1/1 ./. 0/1 0/1 0/1 ./. 1/1 0/1 1/1 0/1 0/1 ./. ./. 0/1 0/0 0/0 +chr2 15744484 . CT C . PASS VC=INDEL;AC=48;AF=0.15;AN=314;refseq.name=NM_004939;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 +chr2 15907161 . G GACTG . PASS VC=INDEL;AC=60;AF=0.19;AN=314 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 +chr2 16916657 . T TAGAA . PASS VC=INDEL;AC=153;AF=0.51;AN=298 GT 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 +chr2 16916659 . G GAAAG . PASS VC=INDEL;AC=145;AF=0.49;AN=294 GT 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. ./. 0/1 ./. 0/1 1/1 1/1 1/1 ./. 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 ./. 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 ./. ./. ./. 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/0 +chr2 17460258 . C CC . PASS VC=INDEL;AC=54;AF=0.17;AN=316 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 +chr2 18018674 . TAT T . PASS VC=INDEL;AC=71;AF=0.23;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 +chr2 18139969 . T TT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 18291829 . TCT T . PASS VC=INDEL;AC=276;AF=0.87;AN=316 GT 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 +chr2 18382578 . G GC . PASS VC=INDEL;AC=304;AF=0.97;AN=314 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 18386046 . ACAGA A . PASS VC=INDEL;AC=1;AF=0;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 18673070 . CT C . PASS VC=INDEL;AC=0;AF=0;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 18704268 . C CCATGACAAGAACTGCT . PASS VC=INDEL;AC=210;AF=0.66;AN=316 GT 1/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +chr2 18954606 . T TGTA . PASS VC=INDEL;AC=272;AF=0.87;AN=314 GT 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 +chr2 19229223 . A AG . PASS VC=INDEL;AC=230;AF=0.82;AN=280 GT 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 ./. 1/1 1/1 ./. 1/1 1/1 0/1 1/1 0/1 1/1 0/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 0/1 ./. 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 ./. 0/1 ./. 0/1 0/1 ./. 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 ./. 0/1 1/1 0/1 ./. 1/1 0/1 1/1 0/1 0/1 1/1 0/1 ./. 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 ./. ./. 1/1 +chr2 19416083 . CAAT C . PASS VC=INDEL;AC=26;AF=0.08;AN=312 GT 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 ./. 0/1 0/1 1/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 19486700 . C CGT . PASS VC=INDEL;AC=200;AF=0.9;AN=222 GT 0/1 ./. ./. ./. 0/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 0/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 0/1 ./. 1/1 1/1 1/1 1/1 0/1 1/1 ./. ./. ./. 0/1 ./. 1/1 ./. 0/1 ./. 0/1 0/1 0/1 ./. 1/1 ./. ./. ./. ./. 0/1 1/1 ./. ./. 0/1 1/1 1/1 0/1 1/1 ./. 0/1 1/1 0/1 1/1 ./. 0/1 0/1 0/1 0/1 1/1 1/1 1/1 ./. ./. ./. 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 ./. ./. ./. 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 0/1 ./. 1/1 1/1 1/1 1/1 1/1 ./. ./. ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. +chr2 19792293 . AAA A . PASS VC=INDEL;AC=92;AF=0.29;AN=316 GT 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 +chr2 19850365 . ATA A . PASS VC=INDEL;AC=17;AF=0.06;AN=302 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/1 0/1 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr2 20061297 . A AATCA . PASS VC=INDEL;AC=10;AF=0.03;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 20902911 . G GC . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_021925;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 21209314 . GTG G . PASS VC=INDEL;AC=13;AF=0.04;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 21319809 . GACAA G . PASS VC=INDEL;AC=64;AF=0.2;AN=316 GT 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 21692599 . AA A . PASS VC=INDEL;AC=78;AF=0.25;AN=314 GT 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 ./. 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 +chr2 22508039 . GCCT G . PASS VC=INDEL;AC=70;AF=0.23;AN=300 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 ./. 0/1 0/0 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 ./. 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 ./. 0/0 0/1 0/1 0/0 0/0 +chr2 23055890 . CTT C . PASS VC=INDEL;AC=32;AF=0.1;AN=310 GT 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 +chr2 23059421 . CC C . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 23080285 . C CC . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 23252488 . T TGTTT . PASS VC=INDEL;AC=261;AF=0.83;AN=314 GT 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 ./. 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 1/1 0/0 1/1 0/1 1/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 23656105 . CT C . PASS VC=INDEL;AC=78;AF=0.25;AN=314 GT 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 23929327 . T TAACT . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 25136190 . TC T . PASS VC=INDEL;AC=190;AF=0.68;AN=280;refseq.name=NM_004036;refseq.positionType=intron GT 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 1/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 ./. 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/1 ./. 1/1 0/1 1/1 0/1 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/0 0/1 ./. 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 ./. ./. ./. 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 ./. 1/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 0/1 0/1 ./. ./. ./. ./. 0/1 0/1 +chr2 25696290 . CA C . PASS VC=INDEL;AC=7;AF=0.02;AN=314;refseq.name=NM_021907;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +chr2 25971939 . A AGTAAA . PASS VC=INDEL;AC=90;AF=0.28;AN=316;refseq.name=NM_018263;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 +chr2 26471341 . T TTTC . PASS VC=INDEL;AC=10;AF=0.03;AN=316;refseq.name=NM_000183;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 +chr2 26547936 . GAC G . PASS VC=INDEL;AC=69;AF=0.22;AN=308;refseq.name=NM_153835;refseq.positionType=intron GT 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/1 ./. ./. 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 +chr2 26849198 . ACGGTT A . PASS VC=INDEL;AC=85;AF=0.28;AN=308;refseq.name=NM_001029881;refseq.positionType=intron GT 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 1/1 ./. 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 ./. 0/0 0/1 +chr2 26849199 . CGGTTC C . PASS VC=INDEL;AC=83;AF=0.27;AN=302;refseq.name=NM_001029881;refseq.positionType=intron GT 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 1/1 0/0 0/1 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 ./. ./. 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 ./. 0/0 0/1 +chr2 27134249 . ATA A . PASS VC=INDEL;AC=100;AF=0.32;AN=316;refseq.name=NM_020134;refseq.positionType=intron GT 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 +chr2 27787778 . AAATTAAAATTCTAC A . PASS VC=INDEL;AC=10;AF=0.03;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 28368075 . CACAG C . PASS VC=INDEL;AC=0;AF=0;AN=306;refseq.name=NM_199193;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 28792105 . A AATA . PASS VC=INDEL;AC=100;AF=0.32;AN=308;refseq.name=NM_153021;refseq.positionType=intron GT 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 ./. 1/1 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 ./. 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 ./. 1/1 0/1 +chr2 29191749 . GA G . PASS VC=INDEL;AC=87;AF=0.28;AN=316 GT 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 +chr2 29191750 . AA A . PASS VC=INDEL;AC=86;AF=0.27;AN=316 GT 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 1/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 +chr2 29738576 . TA T . PASS VC=INDEL;AC=284;AF=0.9;AN=316;refseq.name=NM_004304;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 29738577 . AA A . PASS VC=INDEL;AC=284;AF=0.9;AN=316;refseq.name=NM_004304;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 30158127 . C CA . PASS VC=INDEL;AC=192;AF=0.61;AN=316 GT 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/0 +chr2 30158129 . A AA . PASS VC=INDEL;AC=192;AF=0.61;AN=316 GT 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/0 +chr2 30645653 . A AAGCTTTTCTAATGAACATCTACAAGACTGTTGTG . PASS VC=INDEL;AC=303;AF=0.96;AN=316 GT 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 +chr2 30727159 . C CAGTCTATATGCC . PASS VC=INDEL;AC=189;AF=0.6;AN=316;refseq.name=NM_182551;refseq.positionType=intron GT 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 +chr2 30727390 . GTTG G . PASS VC=INDEL;AC=31;AF=0.1;AN=314;refseq.name=NM_182551;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr2 30855218 . CCATGGGA C . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_182551;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 30937800 . GATTTT G . PASS VC=INDEL;AC=14;AF=0.06;AN=244 GT 0/0 ./. ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 ./. ./. ./. 0/0 0/1 0/0 ./. 0/1 0/1 0/1 ./. ./. 0/1 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/1 0/0 0/0 0/0 ./. 0/1 ./. ./. 0/1 ./. ./. +chr2 31084461 . AATAAAATACAG A . PASS VC=INDEL;AC=36;AF=0.11;AN=316 GT 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 +chr2 31249797 . ATATC A . PASS VC=INDEL;AC=34;AF=0.11;AN=316;refseq.name=NM_024572;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr2 31249799 . ATCTA A . PASS VC=INDEL;AC=47;AF=0.16;AN=302;refseq.name=NM_024572;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 1/1 0/0 0/0 ./. 0/0 0/0 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 1/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 1/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 +chr2 31374768 . AGTA A . PASS VC=INDEL;AC=13;AF=0.05;AN=278 GT 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/0 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 31499486 . C CC . PASS VC=INDEL;AC=11;AF=0.03;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 32845664 . A AT . PASS VC=INDEL;AC=138;AF=0.44;AN=316 GT 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/0 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 +chr2 32845666 . T TT . PASS VC=INDEL;AC=138;AF=0.44;AN=316 GT 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/0 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 +chr2 33393523 . AGCAA A . PASS VC=INDEL;AC=10;AF=0.03;AN=308;refseq.name=NM_206943;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 33403610 . ATTG A . PASS VC=INDEL;AC=46;AF=0.15;AN=316;refseq.name=NM_206943;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 +chr2 33478311 . TGAGT T . PASS VC=INDEL;AC=2;AF=0.01;AN=314;refseq.name=NM_206943;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 33542959 . TT T . PASS VC=INDEL;AC=258;AF=0.82;AN=316;refseq.name=NM_206943;refseq.positionType=intron GT 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 +chr2 33760624 . C CC . PASS VC=INDEL;AC=5;AF=0.02;AN=216;refseq.name=NM_170672;refseq.positionType=intron GT 0/1 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/0 0/0 0/1 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 ./. ./. ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. ./. ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 +chr2 33899643 . G GGAG . PASS VC=INDEL;AC=261;AF=0.83;AN=316 GT 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 +chr2 34119549 . A AA . PASS VC=INDEL;AC=45;AF=0.14;AN=316 GT 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 +chr2 34427438 . A AT . PASS VC=INDEL;AC=175;AF=0.76;AN=230 GT 0/1 0/1 ./. 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 ./. ./. 0/1 1/1 ./. ./. ./. ./. 0/0 0/1 0/1 ./. ./. ./. 0/1 1/1 0/1 0/1 0/1 1/1 ./. 0/1 1/1 ./. 1/1 ./. 1/1 0/1 ./. ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 1/1 1/1 0/1 0/1 1/1 ./. 1/1 1/1 0/1 0/1 0/1 1/1 ./. 1/1 1/1 ./. 0/1 1/1 ./. 0/1 ./. ./. ./. ./. 1/1 1/1 ./. 1/1 1/1 ./. 1/1 1/1 0/1 ./. 1/1 0/1 0/1 1/1 ./. 0/1 1/1 0/1 ./. 0/1 1/1 1/1 0/1 0/0 0/0 0/1 ./. 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 0/0 0/0 0/1 0/1 1/1 0/0 ./. ./. 1/1 1/1 ./. 1/1 0/1 0/1 ./. 1/1 ./. 0/1 0/1 0/1 1/1 ./. ./. 0/1 0/1 ./. 1/1 0/0 1/1 1/1 0/1 +chr2 34841691 . TGAAT T . PASS VC=INDEL;AC=165;AF=0.79;AN=210 GT ./. ./. ./. 1/1 ./. ./. ./. 0/1 ./. 1/1 0/1 ./. 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 0/1 ./. ./. ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 ./. 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 ./. 1/1 1/1 ./. ./. 1/1 1/1 ./. ./. 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 0/0 ./. ./. ./. ./. 1/1 ./. 0/1 1/1 ./. 0/1 0/1 0/0 1/1 1/1 1/1 ./. 1/1 1/1 1/1 0/1 0/0 ./. ./. ./. 0/1 ./. ./. 1/1 0/1 ./. ./. 0/1 ./. ./. 0/1 0/1 1/1 ./. 0/1 ./. ./. ./. 0/1 ./. 0/1 0/0 1/1 ./. 0/1 ./. 0/1 0/1 ./. 0/1 0/0 0/1 1/1 1/1 ./. 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 ./. ./. 0/1 1/1 0/1 ./. ./. +chr2 35025338 . G GG . PASS VC=INDEL;AC=227;AF=0.72;AN=314 GT 0/1 0/0 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/0 0/0 1/1 1/1 0/1 0/0 1/1 0/1 1/1 ./. 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/0 +chr2 35255151 . TCT T . PASS VC=INDEL;AC=29;AF=0.09;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 35667838 . A AGG . PASS VC=INDEL;AC=54;AF=0.21;AN=252 GT 0/0 ./. ./. ./. 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. ./. 0/0 ./. 0/0 0/0 ./. ./. 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 ./. ./. ./. ./. ./. 0/1 0/0 0/1 ./. 0/1 0/1 0/1 0/0 ./. 0/1 0/1 0/1 ./. 0/1 0/0 0/0 0/1 0/1 0/0 0/1 ./. 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 ./. 0/1 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/1 ./. 0/1 0/1 ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/1 ./. 0/0 ./. ./. 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr2 35668564 . A AG . PASS VC=INDEL;AC=275;AF=0.87;AN=316 GT 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 +chr2 36779604 . C CTT . PASS VC=INDEL;AC=130;AF=0.44;AN=298;refseq.name=NM_001042548;refseq.positionType=exon GT 1/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 ./. 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 ./. 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/1 0/1 ./. 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 ./. 0/0 1/1 1/1 1/1 0/0 0/0 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 ./. 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 +chr2 37233064 . ACT A . PASS VC=INDEL;AC=48;AF=0.16;AN=302;refseq.name=NM_019024;refseq.positionType=intron GT 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 ./. 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 ./. 0/0 +chr2 37865906 . GA G . PASS VC=INDEL;AC=161;AF=0.51;AN=314 GT 0/0 1/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 ./. 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 +chr2 37960289 . A AG . PASS VC=INDEL;AC=1;AF=0;AN=302 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. +chr2 38003881 . T TAGA . PASS VC=INDEL;AC=312;AF=0.99;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 38079466 . CAT C . PASS VC=INDEL;AC=93;AF=0.3;AN=308 GT 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 ./. 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 ./. 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 ./. 0/1 0/0 +chr2 38476518 . T TCA . PASS VC=INDEL;AC=179;AF=0.57;AN=316 GT 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 +chr2 38682923 . T TTTCTCTCT . PASS VC=INDEL;AC=35;AF=0.11;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 +chr2 38990657 . C CACTT . PASS VC=INDEL;AC=241;AF=0.76;AN=316 GT 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 +chr2 39202671 . TCAC T . PASS VC=INDEL;AC=68;AF=0.22;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 ./. 1/1 1/1 0/1 1/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 +chr2 39848964 . GACTA G . PASS VC=INDEL;AC=92;AF=0.3;AN=304 GT 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 ./. 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 ./. 0/1 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 +chr2 40095196 . TCTT T . PASS VC=INDEL;AC=22;AF=0.07;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 40207026 . AA A . PASS VC=INDEL;AC=1;AF=0;AN=314 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 +chr2 40328669 . A ATC . PASS VC=INDEL;AC=182;AF=0.58;AN=316 GT 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 1/1 +chr2 40396501 . G GTCAG . PASS VC=INDEL;AC=13;AF=0.04;AN=310;refseq.name=NM_001112802;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 +chr2 40446174 . T TCTACCTGCAACCCTTGATTGGCCTC . PASS VC=INDEL;AC=196;AF=0.62;AN=314;refseq.name=NM_001112802;refseq.positionType=intron GT 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 ./. 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 +chr2 40527545 . T TGC . PASS VC=INDEL;AC=69;AF=0.22;AN=316;refseq.name=NM_001112802;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 +chr2 40764424 . TATG T . PASS VC=INDEL;AC=6;AF=0.02;AN=314 GT ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 40840587 . A ATTG . PASS VC=INDEL;AC=15;AF=0.06;AN=242 GT ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 ./. 0/1 0/0 ./. ./. ./. ./. 0/0 ./. ./. 0/0 0/1 0/0 0/1 ./. 0/0 ./. 1/1 0/0 ./. 0/1 0/0 0/1 ./. ./. ./. ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 ./. 1/1 0/0 1/1 0/0 0/0 0/1 ./. 0/0 0/1 ./. ./. ./. 0/0 0/0 +chr2 41367520 . A AT . PASS VC=INDEL;AC=187;AF=0.6;AN=314 GT 1/1 1/1 0/0 0/0 0/0 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 +chr2 41554849 . TCAGA T . PASS VC=INDEL;AC=231;AF=0.74;AN=314 GT ./. 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 +chr2 41554851 . AGACA A . PASS VC=INDEL;AC=233;AF=0.74;AN=316 GT 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 +chr2 41628974 . G GA . PASS VC=INDEL;AC=282;AF=0.9;AN=314 GT 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 41628975 . A AA . PASS VC=INDEL;AC=281;AF=0.9;AN=312 GT 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 41838136 . GGC G . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 42604189 . CTTATGGGTTAC C . PASS VC=INDEL;AC=3;AF=0.01;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 42773644 . C CC . PASS VC=INDEL;AC=111;AF=0.35;AN=316 GT 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 +chr2 43140881 . TA T . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 43205232 . A AAG . PASS VC=INDEL;AC=287;AF=0.91;AN=316 GT 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 +chr2 43324908 . C CA . PASS VC=INDEL;AC=316;AF=1;AN=316 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 43570900 . TCT T . PASS VC=INDEL;AC=84;AF=0.27;AN=316;refseq.name=NM_022065;refseq.positionType=intron GT 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 +chr2 44397082 . AAGAGTA A . PASS VC=INDEL;AC=39;AF=0.12;AN=316;refseq.name=NM_177968;refseq.positionType=intron GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +chr2 44735716 . TAAAC T . PASS VC=INDEL;AC=189;AF=0.6;AN=316;refseq.name=NM_024766;refseq.positionType=intron GT 1/1 0/0 0/0 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 +chr2 45472533 . T TATA . PASS VC=INDEL;AC=284;AF=0.92;AN=308 GT 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 ./. 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 +chr2 45472535 . T TAAT . PASS VC=INDEL;AC=291;AF=0.92;AN=316 GT 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 +chr2 47399270 . TCA T . PASS VC=INDEL;AC=140;AF=0.44;AN=316;refseq.name=NM_001743;refseq.positionType=intron GT 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 +chr2 48032874 . ACTAT A . PASS VC=INDEL;AC=254;AF=0.8;AN=316;refseq.name=NM_000179;refseq.positionType=intron GT 0/0 1/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 +chr2 49026643 . A AA . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 49468159 . C CTCTT . PASS VC=INDEL;AC=57;AF=0.18;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +chr2 49514324 . GAAGAA G . PASS VC=INDEL;AC=179;AF=0.58;AN=310 GT 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 ./. 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 ./. 0/0 0/0 0/0 1/1 0/1 ./. 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 +chr2 49982314 . T TT . PASS VC=INDEL;AC=196;AF=0.64;AN=304 GT 1/1 0/1 1/1 1/1 0/0 ./. 0/0 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 ./. ./. 0/1 0/1 0/0 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 +chr2 50152899 . TTTTC T . PASS VC=INDEL;AC=26;AF=0.1;AN=268;refseq.name=NM_004801;refseq.positionType=intron GT ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. ./. 0/0 0/0 ./. 0/1 ./. 0/0 0/1 0/1 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/1 ./. ./. ./. 0/1 0/0 0/1 ./. 0/0 0/1 0/1 0/0 0/1 ./. 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 ./. 0/1 ./. 0/1 0/0 0/0 0/1 0/0 0/0 0/0 +chr2 50693504 . AAC A . PASS VC=INDEL;AC=193;AF=0.63;AN=306;refseq.name=NM_004801;refseq.positionType=intron GT 0/0 1/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/0 1/1 0/0 0/0 0/1 1/1 1/1 1/1 0/1 ./. 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/0 ./. 1/1 0/1 ./. ./. 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/1 1/1 0/1 +chr2 50703696 . C CTG . PASS VC=INDEL;AC=287;AF=0.91;AN=314;refseq.name=NM_004801;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 50703699 . T TGT . PASS VC=INDEL;AC=285;AF=0.9;AN=316;refseq.name=NM_004801;refseq.positionType=intron GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +chr2 51260591 . T TAT . PASS VC=INDEL;AC=0;AF=0;AN=316;refseq.name=NM_004801;refseq.positionType=promoter GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 51281539 . TT T . PASS VC=INDEL;AC=252;AF=0.8;AN=316 GT 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 +chr2 51315220 . A ATT . PASS VC=INDEL;AC=55;AF=0.19;AN=292 GT 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 ./. 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 ./. 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 ./. 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 ./. 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 ./. 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 +chr2 51315221 . T TTT . PASS VC=INDEL;AC=56;AF=0.19;AN=300 GT 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 ./. 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 ./. 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +chr2 51355364 . TTT T . PASS VC=INDEL;AC=30;AF=0.1;AN=304 GT 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 +chr2 52397945 . A ATGCTATTCCAATATCTCAG . PASS VC=INDEL;AC=33;AF=0.15;AN=214 GT 0/1 ./. 0/0 0/0 0/1 0/0 0/0 0/0 ./. ./. ./. 0/1 ./. ./. ./. 0/1 ./. 0/1 0/1 ./. 0/1 0/1 ./. 0/1 ./. 0/0 0/1 0/0 ./. 0/0 ./. ./. 0/0 0/0 ./. 0/0 ./. ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 ./. 0/0 0/0 ./. ./. 0/1 0/0 ./. 0/1 ./. ./. 0/1 0/0 0/1 0/1 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 ./. ./. 0/1 ./. 0/1 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 ./. ./. ./. 0/0 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/1 ./. ./. 0/0 0/0 ./. 0/1 0/0 0/1 0/0 0/1 +chr2 52643648 . G GAG . PASS VC=INDEL;AC=140;AF=0.53;AN=266 GT 0/1 ./. 0/0 0/1 0/1 1/1 0/0 0/0 1/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 ./. 0/0 0/1 0/0 0/0 0/1 0/1 0/0 ./. ./. 0/1 0/0 0/1 0/0 0/1 1/1 ./. 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/0 ./. 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/0 ./. ./. ./. 0/0 ./. 1/1 0/1 0/1 0/0 0/1 ./. 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 ./. 1/1 1/1 0/1 ./. 1/1 1/1 1/1 0/1 0/0 ./. 0/1 0/1 1/1 ./. ./. ./. 0/1 1/1 ./. 1/1 0/1 ./. ./. 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 ./. 0/1 1/1 ./. 0/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 ./. 0/0 1/1 0/0 1/1 0/1 0/0 1/1 +chr2 53056176 . G GAG . PASS VC=INDEL;AC=131;AF=0.49;AN=270 GT 1/1 0/0 0/1 ./. ./. 0/0 ./. 1/1 0/1 0/1 0/1 ./. ./. ./. ./. 0/1 1/1 0/1 ./. 0/1 ./. 0/1 ./. 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 ./. 0/0 ./. 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 ./. 1/1 ./. 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/1 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 ./. 0/1 0/1 0/1 0/1 0/1 0/1 0/0 ./. 0/1 0/0 ./. 0/0 0/1 0/1 ./. 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 ./. 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 ./. 1/1 +chr2 53674036 . AA A . PASS VC=INDEL;AC=106;AF=0.34;AN=310 GT 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 ./. 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 +chr2 53737951 . AGGAT A . PASS VC=INDEL;AC=107;AF=0.35;AN=302 GT 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 ./. 0/0 ./. 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 ./. 1/1 1/1 0/1 0/0 ./. 0/1 0/0 0/0 0/0 0/0 1/1 ./. 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 ./. 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 +chr2 54573230 . AACA A . PASS VC=INDEL;AC=62;AF=0.2;AN=316;refseq.name=NM_001100396;refseq.positionType=intron GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 +chr2 54726113 . G GA . PASS VC=INDEL;AC=269;AF=0.87;AN=308;refseq.name=NM_003128;refseq.positionType=intron GT 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 ./. 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 ./. 0/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr2 54726287 . T TGTTA . PASS VC=INDEL;AC=269;AF=0.85;AN=316;refseq.name=NM_003128;refseq.positionType=intron GT 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr2 54783793 . C CTT . PASS VC=INDEL;AC=270;AF=0.85;AN=316;refseq.name=NM_003128;refseq.positionType=intron GT 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 +chr2 55080611 . GCTTT G . PASS VC=INDEL;AC=3;AF=0.01;AN=310 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 55174675 . AC A . PASS VC=INDEL;AC=6;AF=0.02;AN=306 GT 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. +chr2 55208953 . A ATATGAATCACATACAAGCTAAGAAAC . PASS VC=INDEL;AC=211;AF=0.67;AN=316;refseq.name=NM_020532;refseq.positionType=intron GT 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 +chr2 55208955 . A ATGAATCACATACAAGCTAAGAAACTA . PASS VC=INDEL;AC=211;AF=0.67;AN=316;refseq.name=NM_020532;refseq.positionType=intron GT 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 +chr2 55284481 . AA A . PASS VC=INDEL;AC=90;AF=0.28;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 +chr2 55355370 . CTG C . PASS VC=INDEL;AC=0;AF=0;AN=316 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 55473492 . AA A . PASS VC=INDEL;AC=27;AF=0.11;AN=236;refseq.name=NM_002453;refseq.positionType=exon GT 0/1 ./. 0/0 ./. 0/0 0/1 0/1 0/0 0/0 0/0 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/1 ./. 0/1 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. ./. 0/0 0/0 ./. 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. 0/1 0/1 ./. 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/1 0/0 ./. 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/1 ./. ./. 0/0 0/0 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/0 ./. 0/0 0/1 0/0 ./. ./. 0/0 ./. 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. ./. 0/1 0/0 0/1 ./. 0/0 0/1 0/0 0/0 ./. 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/0 ./. 0/0 0/0 0/0 ./. +chr2 56088199 . TA T . PASS VC=INDEL;AC=21;AF=0.07;AN=316 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +chr2 56603301 . G GT . PASS VC=INDEL;AC=118;AF=0.39;AN=306;refseq.name=NM_001080433;refseq.positionType=intron GT 1/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 ./. 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 ./. 1/1 0/0 0/1 0/1 1/1 ./. 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/0 +chr2 57161556 . CCTT C . PASS VC=INDEL;AC=24;AF=0.1;AN=230 GT 0/1 ./. ./. 0/0 0/0 ./. 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 ./. ./. 0/1 ./. 0/0 0/0 ./. ./. ./. ./. 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 ./. 0/1 ./. 0/0 0/0 0/1 0/0 ./. ./. ./. ./. 0/0 ./. 0/0 0/0 0/0 0/0 0/1 ./. 0/0 ./. ./. ./. 0/0 ./. 0/1 0/1 ./. 0/1 ./. 0/1 0/1 ./. ./. ./. 0/1 0/0 0/0 0/1 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 ./. 0/0 0/0 0/1 ./. 0/0 0/0 ./. 0/0 ./. 0/1 ./. 0/1 0/0 0/0 ./. ./. ./. 0/1 ./. ./. ./. ./. 0/0 +chr2 58167700 . AA A . PASS VC=INDEL;AC=220;AF=0.73;AN=300 GT 0/1 1/1 0/1 0/0 1/1 1/1 0/0 1/1 0/0 1/1 ./. 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 ./. 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 ./. 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 ./. 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 ./. 1/1 1/1 ./. 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 ./. 0/1 1/1 +chr2 58193832 . A ACAA . PASS VC=INDEL;AC=35;AF=0.16;AN=222 GT 0/1 0/1 ./. 0/0 ./. ./. 0/0 0/0 0/0 ./. 0/1 0/0 ./. ./. 0/1 1/1 ./. ./. ./. 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 0/1 ./. 0/1 0/0 0/0 0/0 0/0 1/1 ./. 0/0 0/0 ./. ./. 0/0 ./. 0/0 0/1 1/1 0/0 ./. 0/0 ./. 0/0 ./. 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 0/0 ./. 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 ./. 0/1 ./. ./. 0/0 0/1 ./. 0/0 ./. 0/0 0/0 0/1 0/0 ./. 0/1 ./. ./. 0/0 ./. 0/1 ./. ./. ./. ./. ./. 0/0 0/0 0/0 0/0 0/1 0/0 0/1 ./. 0/0 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/0 ./. 0/0 ./. ./. 1/1 0/0 0/1 0/0 ./. 0/1 ./. 0/1 0/0 0/0 ./. 0/0 0/0 0/0 0/1 ./. 0/0 ./. 0/0 0/0 +chr2 58274884 . C CAGG . PASS VC=INDEL;AC=125;AF=0.4;AN=314;refseq.name=NM_006296;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 ./. 0/0 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 +chr2 58274891 . A AGGA . PASS VC=INDEL;AC=123;AF=0.4;AN=308;refseq.name=NM_006296;refseq.positionType=intron GT 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 ./. 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 ./. 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 ./. 0/1 0/1 1/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 ./. 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 +chr2 58283746 . A ACT . PASS VC=INDEL;AC=268;AF=0.88;AN=304;refseq.name=NM_006296;refseq.positionType=intron GT 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 ./. 1/1 ./. 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 ./. 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 ./. 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +chr2 58283749 . C CTC . PASS VC=INDEL;AC=266;AF=0.86;AN=308;refseq.name=NM_006296;refseq.positionType=intron GT 0/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 ./. 0/1 0/1 ./. 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 ./. 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 ./. 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +chr2 58385305 . T TCTTA . PASS VC=INDEL;AC=79;AF=0.25;AN=316;refseq.name=NM_006296;refseq.positionType=intron GT 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 +chr2 58385307 . T TTACT . PASS VC=INDEL;AC=79;AF=0.25;AN=316;refseq.name=NM_006296;refseq.positionType=intron GT 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 diff --git a/tests/tabix_data/vcf/23.vcf b/tests/tabix_data/vcf/23.vcf new file mode 100644 index 0000000..153bad6 --- /dev/null +++ b/tests/tabix_data/vcf/23.vcf @@ -0,0 +1,419 @@ +##fileformat=VCFv4.1 +##ApplyRecalibration="analysis_type=ApplyRecalibration input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/combined.phase1.chr20.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false recal_file=/humgen/gsa-scr1/delangel/VQSRIndels/data/trainMills75_truthMills75_p15_12_12_pctb0.05_std12.0_mG8_QD_FS_HS_RP_IC.recal tranches_file=/humgen/gsa-scr1/delangel/VQSRIndels/data/trainMills75_truthMills75_p15_12_12_pctb0.05_std12.0_mG8_QD_FS_HS_RP_IC.tranches out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub ts_filter_level=93.0 ignore_filter=null mode=INDEL" +##CombineVariants="analysis_type=CombineVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20:41000001-42000000] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AFR/AFR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/ASN/ASN.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AMR/AMR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/EUR/EUR.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AFR.admix/AFR.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/ASN.admix/ASN.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/AMR.admix/AMR.admix.phase1.chr20.42.raw.indels.vcf, /humgen/gsa-hpprojects/dev/delangel/Phase1Calls/20110608VQSRConsensus/calls/chr20/EUR.admix/EUR.admix.phase1.chr20.42.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub genotypemergeoption=PRIORITIZE filteredrecordsmergetype=KEEP_IF_ANY_UNFILTERED rod_priority_list=AFR.admix,AMR.admix,EUR.admix,ASN.admix,AFR,AMR,EUR,ASN printComplexMerges=false filteredAreUncalled=false minimalVCF=false setKey=set assumeIdenticalSamples=false minimumN=1 masterMerge=false mergeInfoWithMaxAC=true" +##FILTER= +##FILTER== 4 && (MQ0 / (1.0 * DP)) > 0.1"> +##FILTER=10)"> +##FILTER=20.0"> +##FILTER= 7500"> +##FILTER==15"> +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER==-1.0"> +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##LeftAlignVariants="analysis_type=LeftAlignVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta rodBind=[/humgen/gsa-scr1/ebanks/ALL.chr20.Oxford.20110407.indels.genotypes.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub" +##SelectVariants="analysis_type=SelectVariants input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20] excludeIntervals=null reference_sequence=/seq/references/Homo_sapiens_assembly19/v1/Homo_sapiens_assembly19.fasta rodBind=[/humgen/gsa-scr1/delangel/officialCalls/20110201_chr20_phase1_indels/dindel/20110208.chr20.dindel2.ALL.sites.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sample=null select_expressions=[] excludeNonVariants=false excludeFiltered=false discordance= concordance= family_structure= mendelianViolation=false mendelianViolationQualThreshold=0.0 select_random_number=0 select_random_fraction=0.0 selectSNPs=false selectIndels=true" +##UnifiedGenotyper="analysis_type=UnifiedGenotyper input_file=[/broad/shptmp/delangel/calls/chr20/CHB.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/CHS.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/CLM.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/JPT.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/MXL.phase1.chr20.42.cleaned.bam, /broad/shptmp/delangel/calls/chr20/PUR.phase1.chr20.42.cleaned.bam] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[20:41000001-42000000] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/humgen/gsa-scr1/delangel/otherIndelCallerAnalysis/ALL.indels.combined.chr20.vcf, /humgen/gsa-hpprojects/GATK/data/dbsnp_132_b37.leftAligned.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=50 baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=8 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false genotype_likelihoods_model=INDEL p_nonref_model=EXACT heterozygosity=0.0010 pcr_error_rate=1.0E-4 genotyping_mode=GENOTYPE_GIVEN_ALLELES output_mode=EMIT_ALL_SITES standard_min_confidence_threshold_for_calling=4.0 standard_min_confidence_threshold_for_emitting=4.0 noSLOD=false assume_single_sample_reads=null abort_at_too_much_coverage=-1 min_base_quality_score=17 min_mapping_quality_score=20 max_deletion_fraction=0.05 min_indel_count_for_genotyping=5 indel_heterozygosity=1.25E-4 indelGapContinuationPenalty=10.0 indelGapOpenPenalty=45.0 indelHaplotypeSize=80 doContextDependentGapPenalties=true getGapPenaltiesFromData=false indel_recal_file=indel.recal_data.csv indelDebug=false dovit=false GSA_PRODUCTION_ONLY=false exactCalculation=LINEAR_EXPERIMENTAL ignoreSNPAlleles=true output_all_callable_bases=false genotype=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub debug_file=null metrics_file=null annotation=[MappingQualityZeroFraction]" +##VariantAnnotator="analysis_type=VariantAnnotator input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[./ALL.chr20.vqsr_2of5_union_sites_for_validation_boosted.vcf] rodToIntervalTrackName=variant BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sampleName=null annotation=[IndelType] group=[] expression=[] useAllAnnotations=false list=false assume_single_sample_reads=null vcfContainsOnlyIndels=false" +##VariantFiltration="analysis_type=VariantFiltration input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=[/humgen/1kg/processing/pipeline_test_bams/chr22_chunked.hg19.intervals] excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[/broad/shptmp/rpoplin/ALL.phase1.chr22.raw.indels.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false enable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null quiet_output_mode=false debug_mode=false help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub filterExpression=[MQ0 >= 4 && (MQ0 / (1.0 * DP)) > 0.1, QUAL<30.0, SB>=-1.0, QD<1.0, HRun>=15, HaplotypeScore>20.0] filterName=[HARD_TO_VALIDATE, LowQual, StrandBias, QualByDepth, HomopolymerRun, HaplotypeScore] genotypeFilterExpression=[] genotypeFilterName=[] clusterSize=3 clusterWindowSize=0 maskName=Mask missingValuesInExpressionsShouldEvaluateAsFailing=false" +##commandline="/share/software/freebayes/bin/freebayes --stdin --min-alternate-count 2 --genotype-combo-step-max 20 --genotype-variant-threshold 4 --no-marginals --pvar 0.0001 --indels --mnps --no-filters --binomial-obs-priors --allele-balance-priors --region 20:0..100000 --vcf /d1/data/1000G/20101123/populations/finalised.phase1/integrated/including454/wg/ALL/Pipeline/none//freebayes/freebayes.20:0-100000.baq.20110328.vcf --fasta-reference /d2/data/references/build_37/human_reference_v37.fa" +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##contig= +##fileDate=2011-03-28 +##filedate=2011-02-08 +##filter="( SNP | MNP ) & ( MQM > 65 | QUAL > 1 ) & ABP < 30 & AB < 0.9 | ( INS | DEL ) & QUAL > 500" +##phasing=none +##reference=/lustre/scratch105/projects/g1k/ref/main_project/human_g1k_v37.fasta +##reference=file:///humgen/1kg/reference/human_g1k_v37.fasta +##source=Dindel2 +##source=SelectVariants +##source_20110031.1=/nfs/users/nfs_p/pd3/cvs/vcftools/perl/vcf-annotate -d /nfs/users/nfs_p/pd3/sandbox/hapmap/dbSNP-b132/non-1kg-vld.desc -a /nfs/users/nfs_p/pd3/sandbox/hapmap/dbSNP-b132/non-1kg-vld.tab.gz -c CHROM,FROM,INFO/VLD,INFO/KGPilot123,INFO/dbSNP +##vcfCTools=filter +#CHROM POS ID REF ALT QUAL FILTER INFO +20 458502 . G GA 4567.01 PASS AA=20;AB=0.61111;ABA=14;ABP=6.8707;ABR=22;AC=38;AF=0.0544;AN=698;BL=374;BR=1129;BVAR;BaseQRankSum=13.364;DP=15979;DP4=1882,2188,45,37;Dels=0.00;EL=5;EPP=13.868;ER=15;FR;FS=6.503;HETAR=11;HOMA=2;HOMR=985;HP=1;HPLen=2;HR=2;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.0157;IndelType=INS.NOVEL_1.Novel_A.;LEN=1;LRB=0.50233;LRBP=826.56;MQ=66.16;MQ0Fraction=0.0110;MQM=70.5;MQRankSum=-3.158;NF;NR;NS=998;PP;PV4=0.15,1,0.42,0.15;RA=3173;RL=1;RPP=38.188;RR=19;RUN=1;ReadPosRankSum=-2.346;SAB=0.7;SAF=14;SAP=9.959;SAR=6;SC=GGGCGTGGTGGTGCATGTAAT;SET_INTEGRATION;SET_WGVQSR;SRB=0.50047;SRF=1588;SRP=3.0165;SRR=1585;TC;TR=9;TU=GGT;VQSLOD=10.0079;set=Intersection;sumGLbyD=23.94 +20 573764 . TA T 591.51 PASS AC=91;AF=0.1987;AN=458;BaseQRankSum=0.137;DP=519;FS=3.153;HRun=1;HaplotypeScore=14.0744;InbreedingCoeff=0.1460;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;MQ=48.16;MQ0=26;MQ0Fraction=0.0501;MQRankSum=-1.636;QD=3.63;ReadPosRankSum=-4.140;SB=-408.14;SET_INTEGRATION;SET_WGVQSR;VQSLOD=5.2458;set=VQSR +20 766143 . C CATCTGGTA 5521.70 PASS AA=24;AB=0.5;ABA=18;ABP=3.0103;ABR=18;AC=14;AF=0.0289;AF1=0.02038;AN=484;BL=655;BR=1542;BVAR;BaseQRankSum=3.801;CI95=0.01549,0.02655;DP=11749;DP4=2222,1998,14,8;Dels=0.00;EL=9;EPP=6.2675;ER=15;FQ=999;FR;FS=2.941;HETAR=9;HOMA=4;HOMR=901;HP=2;HPLen=2;HR=1;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.0515;IndelType=INS.NumRepetitions_1.EventLength_8.;LEN=8;LRB=0.40373;LRBP=780.64;MQ=56.81;MQ0Fraction=0.0253;MQM=22.167;MQRankSum=-4.809;NF;NR;NS=914;PP;PV4=0.39,1,5.8e-07,1;RA=3093;RL=6;RPP=16.039;RR=18;RUN=1;ReadPosRankSum=-2.827;SAB=0.625;SAF=15;SAP=6.2675;SAR=9;SC=GCTTTAAATTCATCTGGTACT;SET_INTEGRATION;SET_WGVQSR;SRB=0.61623;SRF=1906;SRP=365.95;SRR=1187;TC;TR=1;TU=A;VQSLOD=7.0268;set=Intersection;sumGLbyD=50.23 +20 997076 rs11467490 CTG C 15379.78 PASS AA=195;AB=0.59878;ABA=132;ABP=30.896;ABR=197;AC=173;AF=0.14562;AN=1188;BL=7664;BR=7309;BVAR;BaseQRankSum=21.853;DB;DEL;DP=27127;DP4=1801,2002,241,282;Dels=0.13;EL=100;EPP=3.2887;ER=95;FQ=999;FR;FS=6.591;HETAR=77;HOMA=42;HOMR=815;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1284;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_TG.;LEN=2;LRB=0.023709;LRBP=21.287;MQ=61.18;MQ0Fraction=0.0214;MQM=43.041;MQRankSum=6.886;NF;NR;NS=934;PP;PV4=0.61,1.5e-78,1,1;RA=2800;RL=120;RPP=25.56;RR=75;RUN=1;ReadPosRankSum=4.504;SAB=0.62051;SAF=121;SAP=27.609;SAR=74;SC=CAGCTAATTACTGTATTTTTA;SET_INTEGRATION;SET_WGVQSR;SRB=0.49821;SRF=1395;SRP=3.0879;SRR=1405;TC;TR=1;TU=T;VQSLOD=8.9396;set=Intersection;sumGLbyD=16.76 +20 1042261 rs10597473 CCCTG C 168658.05 PASS AA=4481;AB=0.29043;ABA=2128;ABP=1147.1;ABR=871;AC=1172;AF=0.97830;AN=1198;BL=169975;BR=194027;BVAR;BaseQRankSum=4.599;DB;DEL;DP=29418;DP4=29,47,1441,2403;Dels=0.84;EL=2358;EPP=29.772;ER=2123;FR;FS=9.122;HETAR=482;HOMA=559;HOMR=30;HP=2;HPLen=3;HR=3;HRun=0;HU=C;INDEL;InbreedingCoeff=0.0470;IndelType=DEL.NumRepetitions_2.EventLength_4.;LEN=4;LRB=0.066077;LRBP=3454.1;MQ=104.58;MQ0=4;MQ0Fraction=0.0014;MQM=58.257;MQRankSum=-3.368;NF;NR;NS=1071;PP;PV4=0.91,6.8e-09,2.8e-05,1;RA=1039;RL=2088;RPP=48.09;RR=2393;RUN=1;ReadPosRankSum=5.288;SAB=0.41442;SAF=1857;SAP=288.09;SAR=2624;SC=CCAAACCCAACCCTGCCTGGC;SET_INTEGRATION;SET_WGVQSR;SRB=0.48893;SRF=508;SRP=4.1159;SRR=531;TC;TR=8;TU=CCTG;VQSLOD=8.5148;dbSNP=120;set=Intersection;sumGLbyD=59.79 +20 1046297 rs33956316 C CT,CTT,CTTT 17698 PASS ABR=408;AC=432,79,230;AF=0.39779,0.07274,0.21179;BVAR;BaseQRankSum=-8.413;DB;DP=15649;DP4=147,199,534,436;FR;FS=11.580;HOMA=97;HOMR=457;HP=20;HR=16;HU=T;HaplotypeScore=16.0590;INDEL;INS;InbreedingCoeff=0.6018;IndelType=MULTIALLELIC_INDEL;KGPilot123;MQ0=19;MQ0Fraction=0.0093;MQRankSum=7.992;NF;NR;NS=767;PP;PV4=6e-05,1,1,1;QD=8.18;RA=1183;RUN=1;ReadPosRankSum=2.684;SB=-6384.08;SC=GGAAAATTTTCTTTTTTTTTT;SET_WGVQSR;SRB=0.40913;SRF=484;SRP=87.859;SRR=699;TC;TR=16;TU=T;VQSLOD=8.4941;dbSNP=132;set=Intersection +20 1405740 . T TA 257.28 PASS AF=0.0188;BaseQRankSum=-0.745;DP=3769;Dels=0.00;FS=0.742;HPLen=9;HRun=9;InbreedingCoeff=0.0462;IndelType=INS.NumRepetitions_9.EventLength_1.RepeatExpansion_A.;MQ0Fraction=0.0151;MQRankSum=-0.090;ReadPosRankSum=-1.582;SET_INTEGRATION;SET_WGVQSR;VQSLOD=5.6502;set=Intersection;sumGLbyD=6.94 +20 1690501 . TC T 27928 PASS AA=108;AB=0.91372;ABA=100;ABP=1726.1;ABR=1059;AC=35;AF=0.02966;AN=1180;BL=593;BR=6973;BVAR;BaseQRankSum=7.567;DEL;DP=10612;Dels=0.01;EL=50;EPP=4.2971;ER=58;FS=0.000;HETAR=378;HOMA=184;HOMR=477;HRun=1;InbreedingCoeff=0.0495;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.84325;LRBP=11685;MQ0=0;MQ0Fraction=0.0000;MQM=87.361;MQRankSum=4.088;NS=1045;RA=3125;RL=3;RPP=212.2;RR=105;RUN=1;ReadPosRankSum=-13.096;SAB=0.56481;SAF=61;SAP=6.9511;SAR=47;SRB=0.51776;SRF=1618;SRP=11.572;SRR=1507;VQSLOD=3.9824;set=filterInVQSR-2of5;sumGLbyD=4.07 +20 1991285 rs113891396 TAA T,TA,TAAA,TAAAAA,TAAAAAA,TAAAAAAA,TAAAAAAAA 39235.36 PASS AC=5,251,20,39,188,52,79;AF=0.0056,0.2789,0.0222,0.0433,0.2089,0.0578,0.0878;AN=900;BVAR;BaseQRankSum=1.124;DB;DEL;DP=54393;DP4=906,772,824,579;Dels=0.21;FR;FS=37.525;HP=12;HR=12;HRun=12;HU=A;INDEL;INS;InbreedingCoeff=0.6891;IndelType=MULTIALLELIC_INDEL;MQ=76.81;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-6.593;NF;NR;PP;PV4=0.0087,1,6.3e-19,1;RUN=1;ReadPosRankSum=-2.184;SC=ATCTGCCACTTAAAAAAAAAA;SET_WGVQSR;TC;TR=12;TU=A;VQSLOD=9.0007;dbSNP=132;set=Intersection;sumGLbyD=11.45 +20 2355911 . TA T 11723 PASS AA=79;AB=0.9393;ABA=57;ABP=1577;ABR=882;AC=38;AF=0.0411;AN=924;BL=644;BR=5536;BVAR;BaseQRankSum=2.434;DEL;DP=9687;Dels=0.00;EL=45;EPP=6.3362;ER=34;FS=3.043;HETAR=321;HOMA=182;HOMR=555;HRun=5;InbreedingCoeff=0.0412;IndelType=DEL.NumRepetitions_5.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.79159;LRBP=8411.9;MQ0=0;MQ0Fraction=0.0000;MQM=70.848;MQRankSum=0.137;NS=1058;RA=3415;RL=3;RPP=149.49;RR=76;RUN=1;ReadPosRankSum=-12.116;SAB=0.44304;SAF=35;SAP=5.2367;SAR=44;SRB=0.43572;SRF=1488;SRP=125.55;SRR=1927;VQSLOD=3.8910;set=filterInVQSR-2of5;sumGLbyD=4.88 +20 2771621 rs11479849 GT G,GTT 1605.60 PASS AA=80;AB=0.79825;ABA=69;ABP=267.24;ABR=273;AC=79,91;AF=0.06551,0.07546;AN=1206;BL=2593;BR=3805;BVAR;BaseQRankSum=7.825;DB;DP=9790;Dels=0.04;EL=37;EPP=3.9875;ER=43;FR;FS=4.751;HETAR=62;HOMA=5;HOMR=958;HP=11;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.2646;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.18943;LRBP=501.57;MQ0=0;MQ0Fraction=0.0000;MQM=52.45;MQRankSum=-0.560;NF;NR;NS=1025;PP;RA=3949;RL=29;RPP=16.148;RR=51;RUN=1;ReadPosRankSum=-2.397;SAB=0.525;SAF=42;SAP=3.4446;SAR=38;SC=TCATTTTAACGTTTTTTTTTT;SET_WGVQSR;SRB=0.54368;SRF=2147;SRP=68.46;SRR=1802;TC;TR=11;TU=T;VQSLOD=3.5989;set=filterInVQSR-2of5;sumGLbyD=3.92 +20 2891235 . G GT,GTTT 2869.87 PASS AC=236,246;AF=0.2803,0.2922;AN=842;BaseQRankSum=8.979;DP=1067;FS=3.911;HaplotypeScore=20.3595;InbreedingCoeff=0.6511;IndelType=MULTIALLELIC_INDEL;MQ=44.86;MQ0=114;MQ0Fraction=0.1068;MQRankSum=-2.273;QD=4.00;ReadPosRankSum=-6.601;SB=-991.85;SET_INTEGRATION;SET_WGVQSR;VQSLOD=5.4379;set=VQSR +20 3033550 . TGAG T 2005.90 PASS AA=34;AB=0.51429;ABA=34;ABP=3.1344;ABR=36;AC=22;AF=0.0332;AN=662;BL=1374;BR=1649;BVAR;BaseQRankSum=5.192;DEL;DP=14639;DP4=2271,1492,12,21;Dels=0.02;EL=19;EPP=4.0322;ER=15;FR;FS=16.657;HETAR=17;HOMA=0;HOMR=914;HP=1;HPLen=1;HR=1;HRun=0;HU=G;INDEL;InbreedingCoeff=-0.0454;IndelType=DEL.NumRepetitions_1.EventLength_3.;LEN=3;LRB=0.090969;LRBP=57.333;MQ=53.99;MQ0Fraction=0.0304;MQM=46.735;MQRankSum=1.938;NF;NR;NS=931;PP;PV4=0.0068,9.4e-05,1,1;RA=2985;RL=11;RPP=12.207;RR=23;RUN=1;ReadPosRankSum=-0.466;SAB=0.41176;SAF=14;SAP=5.3095;SAR=20;SC=CTTGGGAGGCTGAGGTGGGAG;SET_INTEGRATION;SET_WGVQSR;SRB=0.62781;SRF=1874;SRP=426.52;SRR=1111;TC;TR=1;TU=G;VQSLOD=8.9194;set=Intersection;sumGLbyD=24.41 +20 3873327 rs61519218 A AAG 683.85 PASS AC=25;AF=0.0313;AN=800;BaseQRankSum=4.839;DB;DP=1718;FS=4.265;HRun=0;HaplotypeScore=20.5789;InbreedingCoeff=0.1055;IndelType=INS.NOVEL_2.;MQ=53.70;MQ0=37;MQ0Fraction=0.0215;MQRankSum=2.468;QD=6.30;ReadPosRankSum=4.254;SB=-403.21;SET_INTEGRATION;SET_WGVQSR;VQSLOD=6.1858;set=VQSR +20 4028835 . GC G 2511.30 PASS AA=66;AB=0.56954;ABA=65;ABP=9.3521;ABR=86;AC=22;AF=0.01836;AN=1198;BL=2303;BR=2463;BVAR;BaseQRankSum=7.621;DEL;DP=22795;DP4=1714,2774,22,37;Dels=0.02;EL=34;EPP=3.1419;ER=32;FQ=999;FR;FS=2.095;HETAR=21;HOMA=0;HOMR=1050;HP=2;HPLen=2;HR=2;HRun=2;HU=C;INDEL;InbreedingCoeff=0.0125;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.033571;LRBP=14.674;MQ=108.09;MQ0=0;MQ0Fraction=0.0000;MQM=53.318;MQRankSum=5.257;NF;NR;NS=1071;PP;PV4=1,5.4e-13,1,0.075;RA=6185;RL=36;RPP=4.1947;RR=30;RUN=1;ReadPosRankSum=-1.059;SAB=0.45455;SAF=30;SAP=4.1947;SAR=36;SC=TGCTGTCACTGCCTTCTCCTA;SET_INTEGRATION;SET_WGVQSR;SRB=0.42118;SRF=2605;SRP=336.76;SRR=3580;TC;TR=2;TU=C;VQSLOD=10.2409;set=Intersection;sumGLbyD=12.71 +20 4039609 rs67812039 G GA 43457 PASS AA=909;AB=0.54639;ABA=572;ABP=26.583;ABR=689;AC=302;AF=0.3455;AN=874;BL=37070;BR=38211;BVAR;BaseQRankSum=20.147;DB;DP=25595;DP4=1483,1374,528,542;Dels=0.00;EL=467;EPP=4.5033;ER=442;FQ=999;FR;FS=5.441;HETAR=243;HOMA=127;HOMR=608;HP=4;HPLen=3;HR=3;HRun=3;HU=A;INDEL;INS;InbreedingCoeff=0.1388;IndelType=INS.NumRepetitions_3.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.015157;LRBP=40.563;MQ=119.50;MQ0=0;MQ0Fraction=0.0000;MQM=83.197;MQRankSum=1.080;NF;NR;NS=978;PP;PV4=0.16,1,3.6e-12,1;RA=3033;RL=443;RPP=4.274;RR=466;RUN=1;ReadPosRankSum=-1.000;SAB=0.32233;SAF=293;SAP=252.24;SAR=616;SC=TATGTTGGGAGAAATATCAGT;SET_INTEGRATION;SET_WGVQSR;SRB=0.38378;SRF=1164;SRP=358.85;SRR=1869;TC;TR=4;TU=AG;VQSLOD=9.9146;dbSNP=130;set=Intersection;sumGLbyD=16.79 +20 4390056 . TC T 49312 PASS AA=91;AB=0.94353;ABA=86;ABP=2605.4;ABR=1437;AC=39;AF=0.03160;AN=1234;BL=6823;BR=731;BVAR;BaseQRankSum=2.727;DEL;DP=13149;Dels=0.00;EL=41;EPP=4.9431;ER=50;FS=4.002;HETAR=465;HOMA=313;HOMR=292;HRun=3;InbreedingCoeff=0.0326;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.80646;LRBP=10671;MQ0=0;MQ0Fraction=0.0000;MQM=69.824;MQRankSum=-0.903;NS=1073;RA=3078;RL=89;RPP=183.62;RR=2;RUN=1;ReadPosRankSum=-12.526;SAB=0.45055;SAF=41;SAP=4.9431;SAR=50;SRB=0.52567;SRF=1618;SRP=20.622;SRR=1460;VQSLOD=4.3235;set=Intersection;sumGLbyD=3.53 +20 4474622 . TA T,TAA,TAAA,TAAAA 94522.28 PASS ABR=114;AC=38,68,16,900;AF=0.03333,0.05965,0.01404,0.78947;AN=1140;BVAR;BaseQRankSum=9.741;DB;DP=16656;Dels=0.00;FR;FS=2.355;HOMA=3;HOMR=936;HP=10;HPLen=10;HR=10;HRun=10;HU=A;INS;InbreedingCoeff=0.4516;IndelType=MULTIALLELIC_INDEL;MQ0=2;MQ0Fraction=0.0008;MQRankSum=-4.096;NF;NR;NS=980;PP;RA=3766;RUN=1;ReadPosRankSum=2.380;SC=AGAAAAAAATTAAAAAAAAAA;SET_WGVQSR;SRB=0.49734;SRF=1873;SRP=3.2409;SRR=1893;TC;TR=10;TU=A;VQSLOD=8.8186;set=Intersection;sumGLbyD=38.79 +20 4824911 . AC A 41998.70 PASS AC=1172;AF=0.97342;AN=1204;BaseQRankSum=8.604;DP=3615;FS=9.934;HRun=1;HaplotypeScore=39.6843;InbreedingCoeff=0.0980;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=129.80;MQ0=1;MQ0Fraction=0.0003;MQRankSum=3.378;QD=11.62;ReadPosRankSum=6.967;SB=-16955.28;VQSLOD=4.2689;set=VQSR +20 4839897 rs35881880 TAA T,TA,TAAA,TAAAAA 3906.80 PASS AC=12,95,137,189;AF=0.01024,0.08106,0.11689,0.16126;AN=1172;BVAR;BaseQRankSum=15.271;DB;DEL;DP=15105;Dels=0.04;FR;FS=43.567;HP=19;HR=13;HRun=13;HU=A;INS;InbreedingCoeff=0.5716;IndelType=MULTIALLELIC_INDEL;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.569;NF;NR;PP;RUN=1;ReadPosRankSum=-13.794;SC=TGTTAAAAAATAAAAAAAAAA;TC;TR=13;TU=A;VQSLOD=8.1773;set=Intersection;sumGLbyD=3.77 +20 5507414 . G GCC 439.08 PASS AC=23;AF=0.01876;AN=1226;BaseQRankSum=3.051;DP=3023;FS=3.636;HRun=1;HaplotypeScore=30.3104;InbreedingCoeff=0.0204;IndelType=INS.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=112.09;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.065;QD=2.85;ReadPosRankSum=-2.709;SB=-302.22;VQSLOD=4.4311;set=VQSR +20 5609676 . GA G,GAA 799.89 PASS AA=42;AB=0.79096;ABA=37;ABP=133.16;ABR=140;AC=43,65;AF=0.03607,0.05453;AF1=0.02826;AN=1192;BL=1360;BR=2334;BVAR;BaseQRankSum=5.069;CI95=0.01242,0.04037;DP=15610;DP4=1548,2441,21,30;Dels=0.02;EL=18;EPP=4.8716;ER=24;FQ=12.1;FR;FS=0.000;HETAR=36;HOMA=1;HOMR=991;HP=13;HPLen=10;HR=10;HRun=10;HU=A;INDEL;INS;InbreedingCoeff=0.2001;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.26367;LRBP=560.68;MQ=63.29;MQ0Fraction=0.0003;MQM=44.143;MQRankSum=1.755;NF;NR;NS=1028;PP;PV4=0.77,1,0.0087,0.0053;RA=4114;RL=15;RPP=10.455;RR=27;RUN=1;ReadPosRankSum=-2.978;SAB=0.5;SAF=21;SAP=3.0103;SAR=21;SC=AAAAAAGAAAGAAAAAAAAAA;SET_WGVQSR;SRB=0.39742;SRF=1635;SRP=379;SRR=2479;TC;TR=11;TU=AAAG;VQSLOD=4.1229;set=filterInVQSR-2of5;sumGLbyD=7.95 +20 5736211 rs35303106 CT C,CTT 4384.40 PASS AA=117;AB=0.71499;ABA=116;ABP=166.4;ABR=291;AC=32,145;AF=0.02712,0.12288;AN=1180;BL=5556;BR=4901;BVAR;BaseQRankSum=2.708;DB;DP=9157;Dels=0.01;EL=54;EPP=4.5136;ER=63;FR;FS=2.802;HETAR=79;HOMA=1;HOMR=837;HP=16;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.1903;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.062637;LRBP=92.1;MQ0Fraction=0.0273;MQM=48.932;MQRankSum=3.654;NF;NR;NS=917;PP;RA=2785;RL=79;RPP=34.209;RR=38;RUN=1;ReadPosRankSum=0.795;SAB=0.5641;SAF=66;SAP=7.1862;SAR=51;SC=TTTTCTTTTTCTTTTTTTTTT;SET_INTEGRATION;SET_WGVQSR;SRB=0.41795;SRF=1164;SRP=165.85;SRR=1621;TC;TR=11;TU=T;VQSLOD=5.0895;set=Intersection;sumGLbyD=4.66 +20 5898626 rs34483659 CAAA C,CA,CAA,CAAAAA 1140.16 PASS ABR=34;AC=19,98,56,199;AF=0.0227,0.1172,0.0670,0.2380;AF1=0.08519;BVAR;BaseQRankSum=5.049;CI95=0.03727,0.1273;DB;DEL;DP=5091;DP4=539,408,121,123;FQ=4.43;FR;FS=5.701;HOMA=64;HOMR=156;HP=19;HR=18;HU=A;HaplotypeScore=11.5333;INDEL;InbreedingCoeff=0.7405;IndelType=MULTIALLELIC_INDEL;MQ0=117;MQ0Fraction=0.0986;MQRankSum=6.290;NF;NR;NS=240;PP;PV4=0.043,1,1,0.0087;QD=1.22;RA=204;RUN=1;ReadPosRankSum=-2.684;SB=-1015.09;SC=ACTAAAAATACAAAAAAAAAA;SET_WGVQSR;SRB=0.35294;SRF=72;SRP=41.33;SRR=132;TC;TR=18;TU=A;VQSLOD=4.1696;set=filterInVQSR-2of5 +20 5975126 rs10541892 C CAG 504.78 PASS AC=79;AF=0.07004;AN=1128;BaseQRankSum=10.498;DB;DP=2050;FS=38.228;HRun=0;HaplotypeScore=14.1426;InbreedingCoeff=-0.0053;IndelType=INS.NOVEL_2.;MQ=60.40;MQ0=80;MQ0Fraction=0.0390;MQRankSum=5.098;QD=1.63;ReadPosRankSum=-4.851;SB=-590.69;VQSLOD=4.8517;set=VQSR +20 6040983 rs11087710 A AAAAAAGAG,AAAAAGAG,AAAAGAG,AAAAGAGAG,AAAGAG,AAAGAGAG,AAGAG,AAGAGAG,AG,AGAG,AGAGAG 66894.55 PASS ABR=468;AC=80,9,20,136,31,91,33,29,9,3,5;AF=0.0980,0.0110,0.0245,0.1667,0.0380,0.1115,0.0404,0.0355,0.0110,0.0037,0.0061;AN=816;BVAR;BaseQRankSum=-12.470;DB;DP=38726;DP4=426,611,310,472;Dels=0.00;FQ=999;FR;FS=6.635;HOMA=110;HOMR=506;HP=14;HR=15;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.8291;IndelType=MULTIALLELIC_INDEL;KGPilot123;MQ=54.22;MQ0Fraction=0.0168;MQRankSum=-5.329;NF;NR;NS=861;PP;PV4=0.56,1,6.9e-09,0.31;RA=1828;RUN=1;ReadPosRankSum=-7.857;SC=AAAAAAAAAAAAGAGAGAGAG;SET_WGVQSR;SRB=0.62418;SRF=1141;SRP=247.85;SRR=687;TC;TR=15;TU=A;VQSLOD=9.0574;dbSNP=131;set=Intersection;sumGLbyD=36.72 +20 7024548 . G GAT 5041.27 PASS AC=123;AF=0.10336;AN=1190;BaseQRankSum=23.097;DP=3045;FS=7.979;HRun=0;HaplotypeScore=15.6967;InbreedingCoeff=0.1062;IndelType=INS.NumRepetitions_5.EventLength_2.RepeatExpansion_AT.;MQ=119.29;MQ0=2;MQ0Fraction=0.0007;MQRankSum=-3.725;QD=8.97;ReadPosRankSum=-1.636;SB=-2257.45;SET_INTEGRATION;SET_WGVQSR;VQSLOD=5.9332;set=VQSR +20 7484554 . A AT 5.09 PASS AC=0;AF=0.0000;AN=710;BaseQRankSum=-0.696;DP=1862;FS=2.835;HRun=9;HaplotypeScore=13.5425;InbreedingCoeff=0.0567;IndelType=INS.NumRepetitions_9.EventLength_1.RepeatExpansion_T.;MQ=76.92;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.932;ReadPosRankSum=-1.701;VQSLOD=4.3156;set=VQSR +20 7632194 rs77286341 GAA AAA,G 5324 PASS AC=0;AF=0.0000;AN=700;BaseQRankSum=-1.741;DB;DP=1772;FR;HP=4;HPLen=3;HR=3;HRun=0;HU=A;HaplotypeScore=60.1795;InbreedingCoeff=0.0017;IndelType=MIXED;MQ=70.69;MQ0=13;MQ0Fraction=0.0073;MQRankSum=-1.315;NF;NR;PP;ReadPosRankSum=-3.650;SC=GAGAGAGAGAGAAAGGTGTAA;TC;TR=13;TU=AG;set=filterInVQSR-2of5 +20 7767508 rs71329674 G GA 17914 PASS AA=415;AB=0.61617;ABA=337;ABP=105.94;ABR=541;AC=141;AF=0.11614;AN=1214;BL=15187;BR=20323;BVAR;BaseQRankSum=-13.946;DB;DP=28222;Dels=0.00;EL=184;EPP=14.569;ER=231;FQ=999;FR;FS=13.296;HETAR=178;HOMA=35;HOMR=822;HP=14;HPLen=9;HR=9;HRun=9;HU=A;INDEL;INS;InbreedingCoeff=0.0714;IndelType=INS.NumRepetitions_9.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.14464;LRBP=1616.1;MQ=89.69;MQ0=1;MQ0Fraction=0.0003;MQM=51.667;MQRankSum=0.664;NF;NR;NS=1035;PP;RA=3707;RL=171;RPP=30.894;RR=244;RUN=1;ReadPosRankSum=-1.120;SAB=0.45301;SAF=188;SAP=10.969;SAR=227;SC=ATTCTAAAAAGAAAAAAAAAT;SET_INTEGRATION;SET_WGVQSR;SRB=0.38495;SRF=1427;SRP=429.23;SRR=2280;TC;TR=9;TU=A;VQSLOD=9.0748;set=Intersection;sumGLbyD=11.09 +20 7920261 . TA T,TAA 802.15 PASS AA=28;AB=0.8;ABA=28;ABP=112.45;ABR=112;AC=22,39;AF=0.01836,0.03255;AN=1198;BL=943;BR=1487;BVAR;BaseQRankSum=2.233;DP=10645;Dels=0.01;EL=11;EPP=5.8022;ER=17;FR;FS=1.691;HETAR=20;HOMA=0;HOMR=1007;HP=10;HPLen=9;HR=9;HRun=9;HU=A;INS;InbreedingCoeff=0.2256;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.22387;LRBP=267.46;MQ0=0;MQ0Fraction=0.0000;MQM=57.571;MQRankSum=0.940;NF;NR;NS=1027;PP;RA=4776;RL=8;RPP=14.178;RR=20;RUN=1;ReadPosRankSum=-1.567;SAB=0.53571;SAF=15;SAP=3.3205;SAR=13;SC=GTAACTGCTATAAAAAAAAAC;SET_WGVQSR;SRB=0.48576;SRF=2320;SRP=11.42;SRR=2456;TC;TR=9;TU=A;VQSLOD=4.0815;set=filterInVQSR-2of5;sumGLbyD=5.37 +20 8012465 rs10595338 TATGA T 2104.41 PASS AF=0.03339;BaseQRankSum=10.662;DB;DP=11772;DS;Dels=0.01;FR;FS=7.678;HP=1;HPLen=1;HR=1;HRun=0;HU=A;InbreedingCoeff=0.0266;IndelType=DEL.NumRepetitions_1.EventLength_4.;MQ0Fraction=0.0731;MQRankSum=0.603;NF;NR;PP;ReadPosRankSum=1.276;SC=TGTATGTATGTATGATGTATG;TC;TR=19;TU=ATGT;VQSLOD=4.1376;set=filterInVQSR-2of5;sumGLbyD=6.53 +20 8573999 . CGTGT C,CGT,CGTGTGT,TGTGT 45865.96 PASS AC=458,0,731;AF=0.37727,0.00000,0.60214;AN=1214;BVAR;BaseQRankSum=-6.703;DEL;DP=37714;Dels=0.03;FR;FS=11.079;HP=2;HPLen=1;HR=1;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.7632;IndelType=MIXED;LEN=2;MQ0Fraction=0.0026;MQRankSum=-1.394;NF;NR;PP;RUN=1;ReadPosRankSum=-2.102;SC=TGTGTGTGCGCGTGTGTGTGT;SET_INTEGRATION;SET_WGVQSR;TC;TR=18;TU=GT;VQSLOD=6.1435;set=Intersection;sumGLbyD=3.53 +20 8610455 rs10571111 TTTTC T 11763.51 PASS AC=190;AF=0.17056;AN=1114;BaseQRankSum=-14.397;DB;DP=2323;FS=2.321;HRun=0;HaplotypeScore=39.8020;InbreedingCoeff=0.2502;IndelType=DEL.NumRepetitions_2.EventLength_4.;MQ=53.39;MQ0=104;MQ0Fraction=0.0448;MQRankSum=3.519;QD=19.07;ReadPosRankSum=4.150;SB=-4067.02;SET_INTEGRATION;SET_WGVQSR;VQSLOD=5.0554;set=VQSR +20 9139079 . ATT A,AT,ATTT,ATTTT,ATTTTT 8777.90 PASS AC=23,140,114,69,113;AF=0.01993,0.12132,0.09879,0.05979,0.09792;AN=1154;BVAR;BaseQRankSum=-0.022;DEL;DP=25109;DP4=502,657,278,313;FR;FS=11.929;HP=16;HR=16;HU=T;HaplotypeScore=20.2361;INDEL;INS;InbreedingCoeff=0.5704;IndelType=MULTIALLELIC_INDEL;MQ0=16;MQ0Fraction=0.0067;MQRankSum=2.624;NF;NR;PP;PV4=0.14,1,1,1;QD=1.48;RUN=1;ReadPosRankSum=-0.480;SB=-2354.28;SC=CACCTGGCTAATTTTTTTTTT;SET_WGVQSR;TC;TR=16;TU=T;VQSLOD=6.9180;set=Intersection +20 9862448 . CT C 49312 PASS AA=60;AB=0.96003;ABA=53;ABP=2440.4;ABR=1273;AC=18;AF=0.01461;AN=1232;BL=3516;BR=140;BVAR;BaseQRankSum=-2.056;DEL;DP=11893;Dels=0.01;EL=35;EPP=6.6294;ER=25;FS=1.787;HETAR=396;HOMA=344;HOMR=334;HRun=1;InbreedingCoeff=0.0379;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.92341;LRBP=6772.5;MQ0Fraction=0.0006;MQM=54.267;MQRankSum=-0.907;NS=1074;RA=2990;RL=60;RPP=133.3;RR=0;RUN=1;ReadPosRankSum=-10.579;SAB=0.58333;SAF=35;SAP=6.6294;SAR=25;SRB=0.47826;SRF=1430;SRP=15.284;SRR=1560;VQSLOD=3.0237;set=filterInVQSR-2of5;sumGLbyD=2.84 +20 9863736 rs73618103 G GT 50570.21 PASS AA=2247;AB=0.48878;ABA=1412;ABP=6.0324;ABR=1350;AC=546;AF=0.44463;AN=1228;BL=86886;BR=95862;BVAR;BaseQRankSum=-23.978;DB;DP=32517;DP4=1125,1133,1017,1048;Dels=0.00;EL=1089;EPP=7.6113;ER=1158;FQ=999;FR;FS=2.529;HETAR=445;HOMA=201;HOMR=393;HP=4;HPLen=4;HR=4;HRun=4;HU=T;INDEL;INS;InbreedingCoeff=0.1393;IndelType=INS.NumRepetitions_4.EventLength_1.RepeatExpansion_T.;KGPilot123;LEN=1;LRB=0.049117;LRBP=960.35;MQ=68.10;MQ0=2;MQ0Fraction=0.0006;MQM=50.931;MQRankSum=-1.580;NF;NR;NS=1039;PP;PV4=0.71,1,0.11,1;RA=3139;RL=1089;RPP=7.6113;RR=1158;RUN=1;ReadPosRankSum=0.846;SAB=0.54161;SAF=1217;SAP=36.804;SAR=1030;SC=TGATTGTATGGTTTTGTCCTT;SET_INTEGRATION;SET_WGVQSR;SRB=0.53425;SRF=1677;SRP=34.987;SRR=1462;TC;TR=4;TU=T;VLD;VQSLOD=10.1800;dbSNP=131;set=Intersection;sumGLbyD=18.20 +20 10926959 . AG A 12239 PASS AA=65;AB=0.92801;ABA=64;ABP=1417.6;ABR=825;AC=24;AF=0.0264;AN=908;BL=616;BR=3782;BVAR;BaseQRankSum=9.990;DEL;DP=10708;Dels=0.01;EL=37;EPP=5.7163;ER=28;FS=1.652;HETAR=275;HOMA=70;HOMR=724;HRun=1;InbreedingCoeff=0.0102;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.71987;LRBP=4952;MQ0=1;MQ0Fraction=0.0004;MQM=118.82;MQRankSum=1.018;NS=1069;RA=4746;RL=5;RPP=104.07;RR=60;RUN=1;ReadPosRankSum=-12.039;SAB=0.41538;SAF=27;SAP=7.0526;SAR=38;SRB=0.4764;SRF=2261;SRP=25.968;SRR=2485;VQSLOD=2.9713;set=filterInVQSR-2of5;sumGLbyD=4.10 +20 11299648 . TG T 49315 PASS AA=62;AB=0.95292;ABA=54;ABP=2046.7;ABR=1093;AC=28;AF=0.0373;AN=750;BL=3126;BR=528;BVAR;BaseQRankSum=-4.929;DEL;DP=10764;Dels=0.01;EL=26;EPP=6.5127;ER=36;FS=3.851;HETAR=366;HOMA=383;HOMR=304;HRun=1;InbreedingCoeff=0.0267;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.711;LRBP=4014.1;MQ0=1;MQ0Fraction=0.0005;MQM=76.468;MQRankSum=1.327;NS=1070;RA=2588;RL=54;RPP=77.121;RR=8;RUN=1;ReadPosRankSum=-12.507;SAB=0.48387;SAF=30;SAP=3.1504;SAR=32;SRB=0.47643;SRF=1233;SRP=15.499;SRR=1355;VQSLOD=3.8673;set=filterInVQSR-2of5;sumGLbyD=3.00 +20 11561096 . CTA C 999 PASS AC=2;AF=0.0029;AF1=0.005602;BaseQRankSum=3.190;CI95=0.004425,0.01106;DP=7521;DP4=1998,1794,2,4;Dels=0.00;FQ=999;FR;FS=5.422;HP=3;HPLen=2;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0056;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_TA.;MQ=113.88;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.297;NF;NR;PP;PV4=0.43,0.024,1,1;ReadPosRankSum=1.406;SC=CAATAGTATTCTATGTCAGTC;SET_INTEGRATION;SET_WGVQSR;TC;TR=1;TU=T;VQSLOD=8.6243;set=Intersection;sumGLbyD=21.89 +20 11723671 . C CA 1096.60 PASS AA=35;AB=0.69565;ABA=35;ABP=41.247;ABR=80;AC=10;AF=0.0141;AN=710;BL=2005;BR=1702;BVAR;BaseQRankSum=-3.427;DP=9819;Dels=0.00;EL=20;EPP=4.5614;ER=15;FR;FS=3.814;HETAR=20;HOMA=0;HOMR=1034;HP=8;HPLen=7;HR=7;HRun=7;HU=A;INS;InbreedingCoeff=0.0323;IndelType=INS.NumRepetitions_7.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.081737;LRBP=56.79;MQ0=0;MQ0Fraction=0.0000;MQM=81.057;MQRankSum=0.050;NF;NR;NS=1054;PP;RA=5562;RL=22;RPP=8.0357;RR=13;RUN=1;ReadPosRankSum=-2.012;SAB=0.71429;SAF=25;SAP=16.97;SAR=10;SC=ATATTGAAGACAAAAAAACAG;SET_INTEGRATION;SET_WGVQSR;SRB=0.49371;SRF=2746;SRP=4.9233;SRR=2816;TC;TR=7;TU=A;VQSLOD=7.4342;set=Intersection;sumGLbyD=8.30 +20 12238835 rs113904674 CTCTTCATGGTCT C 1813.44 PASS AA=7;AB=0.73077;ABA=7;ABP=15.037;ABR=19;AC=4;AF=0.0056;AN=712;BL=360;BR=368;BVAR;BaseQRankSum=3.891;DB;DEL;DP=10309;Dels=0.00;EL=4;EPP=3.3205;ER=3;FR;FS=0.000;HETAR=3;HOMA=0;HOMR=1076;HP=1;HPLen=2;HR=2;HRun=0;HU=C;InbreedingCoeff=-0.0381;IndelType=DEL.NumRepetitions_1.EventLength_10orMore.;LEN=12;LRB=0.010989;LRBP=3.2012;MQ0=0;MQ0Fraction=0.0000;MQM=37;MQRankSum=-3.793;NF;NR;NS=1079;PP;RA=6085;RL=4;RPP=3.3205;RR=3;RUN=1;ReadPosRankSum=1.319;SAB=0.42857;SAF=3;SAP=3.3205;SAR=4;SC=CTTAATGCTCCTCTTCATGGT;SET_INTEGRATION;SET_WGVQSR;SRB=0.51257;SRF=3119;SRP=11.364;SRR=2966;TC;TR=6;TU=CCT;VQSLOD=5.7551;set=Intersection;sumGLbyD=69.48 +20 12602812 . AT A 12344 PASS AA=47;AB=0.94372;ABA=43;ABP=1309.5;ABR=721;AC=14;AF=0.0196;AN=716;BL=2714;BR=217;BVAR;BaseQRankSum=1.424;DEL;DP=10743;Dels=0.00;EL=24;EPP=3.0565;ER=23;FS=0.629;HETAR=228;HOMA=65;HOMR=769;HRun=1;InbreedingCoeff=0.0233;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.85193;LRBP=4622.3;MQ0Fraction=0.0000;MQM=99.574;MQRankSum=1.901;NS=1080;RA=4839;RL=46;RPP=96.568;RR=1;RUN=1;ReadPosRankSum=-9.906;SAB=0.53191;SAF=25;SAP=3.4261;SAR=22;SRB=0.51106;SRF=2473;SRP=8.148;SRR=2366;VQSLOD=2.8161;set=filterInVQSR-2of5;sumGLbyD=3.67 +20 13600884 . CTG C,CTGTG 1278.10 PASS AA=85;AB=0.77994;ABA=79;ABP=247.38;ABR=280;AC=71,22;AF=0.05907,0.01830;AN=1202;BL=3279;BR=3205;BVAR;BaseQRankSum=8.852;DEL;DP=24185;DP4=1317,931,52,49;Dels=0.03;EL=45;EPP=3.649;ER=40;FQ=999;FR;FS=31.826;HETAR=75;HOMA=4;HOMR=926;HP=2;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1566;IndelType=MULTIALLELIC_INDEL;LEN=2;LRB=0.011413;LRBP=4.8442;MQ=65.06;MQ0Fraction=0.0012;MQM=48.671;MQRankSum=-0.511;NF;NR;NS=1005;PP;PV4=0.18,1,0.39,0.27;RA=3342;RL=35;RPP=8.7583;RR=50;RUN=1;ReadPosRankSum=-2.329;SAB=0.43529;SAF=37;SAP=6.1015;SAR=48;SC=TCCCTTTACTCTGTGTGTGTG;SET_INTEGRATION;SET_WGVQSR;SRB=0.59066;SRF=1974;SRP=241.62;SRR=1368;TC;TR=15;TU=GT;VQSLOD=3.8635;set=filterInVQSR-2of5;sumGLbyD=4.23 +20 13666265 . T TATAG 556.88 PASS AC=21;AF=0.01959;AN=1072;BaseQRankSum=24.958;DP=2706;FS=2.581;HRun=0;HaplotypeScore=25.9952;InbreedingCoeff=0.1419;IndelType=INS.NOVEL_4.;MQ=72.43;MQ0=0;MQ0Fraction=0.0000;MQRankSum=2.888;QD=4.38;ReadPosRankSum=2.552;SB=-417.04;SET_INTEGRATION;SET_WGVQSR;VQSLOD=7.3380;set=VQSR +20 13861245 rs72422273 C CTCA 2685.46 PASS AC=140;AF=0.11589;AN=1208;BaseQRankSum=24.355;DB;DP=2910;FS=6.808;HRun=0;HaplotypeScore=19.3095;InbreedingCoeff=-0.0991;IndelType=INS.NumRepetitions_1.EventLength_3.;MQ=78.25;MQ0=22;MQ0Fraction=0.0076;MQRankSum=3.225;QD=3.64;ReadPosRankSum=2.607;SB=-1861.38;VQSLOD=4.1974;set=VQSR +20 13865746 . T TA,TAA 1416.23 PASS AA=63;AB=0.80417;ABA=47;ABP=195.87;ABR=193;AC=122,21;AF=0.10133,0.01744;AN=1204;BL=3673;BR=1145;BVAR;BaseQRankSum=-3.336;DP=10513;Dels=0.00;EL=62;EPP=131.27;ER=1;FR;FS=716.583;HETAR=45;HOMA=1;HOMR=998;HP=2;HR=1;HRun=1;HU=A;INS;InbreedingCoeff=0.0814;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.5247;LRBP=2883.3;MQ0=0;MQ0Fraction=0.0000;MQM=56.143;MQRankSum=-1.197;NF;NR;NS=1044;PP;RA=4529;RL=62;RPP=131.27;RR=1;RUN=1;ReadPosRankSum=-12.295;SAB=1;SAF=63;SAP=139.81;SAR=0;SC=GGAACATGGATACCCCCCTGC;SRB=0.52462;SRF=2376;SRP=26.853;SRR=2153;TC;TR=1;TU=A;VQSLOD=-4.2308;set=filterInVQSR-2of5;sumGLbyD=4.77 +20 13881703 . CTT C 152.85 PASS AC=8;AF=0.0093;AN=862;BaseQRankSum=3.941;DP=2063;FS=0.962;HRun=5;HaplotypeScore=24.0313;InbreedingCoeff=0.0790;IndelType=DEL.NumRepetitions_5.EventLength_1.RepeatExpansion_T.;MQ=55.05;MQ0=49;MQ0Fraction=0.0238;MQRankSum=-1.418;QD=3.47;ReadPosRankSum=-0.605;SB=-93.04;SET_INTEGRATION;SET_WGVQSR;VQSLOD=5.3874;set=VQSR +20 14260090 rs73619828 A AT 27935 PASS AA=596;AB=0.59484;ABA=487;ABP=96.922;ABR=715;AC=204;AF=0.17000;AN=1200;BL=21718;BR=28458;BVAR;BaseQRankSum=0.756;DB;DP=23629;DP4=1385,1492,287,328;Dels=0.00;EL=299;EPP=3.0249;ER=297;FQ=999;FR;FS=6.187;HETAR=218;HOMA=38;HOMR=788;HP=9;HPLen=9;HR=9;HRun=9;HU=T;INDEL;INS;InbreedingCoeff=0.0797;IndelType=INS.NumRepetitions_9.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.13433;LRBP=1969;MQ=100.81;MQ0=0;MQ0Fraction=0.0000;MQM=57.084;MQRankSum=2.224;NF;NR;NS=1044;PP;PV4=0.53,1,1.2e-11,1;RA=4143;RL=238;RPP=55.475;RR=358;RUN=1;ReadPosRankSum=0.198;SAB=0.46812;SAF=279;SAP=8.2714;SAR=317;SC=CCTTAAGTTGATTTTTTTTTC;SET_INTEGRATION;SET_WGVQSR;SRB=0.50374;SRF=2087;SRP=3.514;SRR=2056;TC;TR=9;TU=T;VQSLOD=9.0018;set=Intersection;sumGLbyD=10.82 +20 14260558 . AC A 238 PASS AC=1;AF=0.0014;AF1=0.003368;BaseQRankSum=2.868;CI95=0.003106,0.006211;DP=9724;DP4=2075,2329,1,7;Dels=0.00;FQ=106;FR;FS=10.678;HP=1;HPLen=2;HR=2;HRun=1;HU=A;INDEL;InbreedingCoeff=-0.0406;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=114.37;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.862;NF;NR;PP;PV4=0.074,0.0096,0.017,1;ReadPosRankSum=-0.042;SC=ATCAGGAATAACTGTGTGACC;SET_INTEGRATION;SET_WGVQSR;TC;TR=2;TU=A;VQSLOD=8.1618;set=Intersection;sumGLbyD=18.65 +20 14425481 . GTA G,GTATA 148.85 PASS AC=43,23;AF=0.03473,0.01858;AN=1238;BaseQRankSum=6.289;DP=25167;DP4=1800,2021,38,49;FR;FS=9.416;HP=2;HPLen=1;HR=1;HU=T;HaplotypeScore=17.7453;INDEL;InbreedingCoeff=0.0995;IndelType=MULTIALLELIC_INDEL;MQ0=21;MQ0Fraction=0.0058;MQRankSum=-0.200;NF;NR;PP;PV4=0.59,1,0.04,0.023;QD=0.35;ReadPosRankSum=-1.689;SB=-367.50;SC=CTGTGTGTGTGTATATATATA;SET_WGVQSR;TC;TR=13;TU=AT;VQSLOD=3.5796;set=filterInVQSR-2of5 +20 14943522 rs11478299 GA AA,G 1761.24 PASS AA=117;AB=0.68142;ABA=108;ABP=99.919;ABR=231;AC=0;AF=0.0000;AF1=0.04204;AN=712;BL=4931;BR=5802;BVAR;BaseQRankSum=9.118;CI95=0.02876,0.05752;DB;DEL;DP=13717;DP4=1908,1684,59,58;Dels=0.05;EL=60;EPP=3.1773;ER=57;FQ=81.9;FR;HETAR=56;HOMA=1;HOMR=1011;HP=8;HPLen=8;HR=8;HU=A;INDEL;InbreedingCoeff=0.1264;IndelType=MIXED;LEN=1;LRB=0.081152;LRBP=156.5;MQ=106.93;MQ0=0;MQ0Fraction=0.0000;MQM=96.855;MQRankSum=1.619;NF;NR;NS=1068;PP;PV4=0.57,1,0.0003,1;QD=7.40;RA=5080;RL=56;RPP=3.4743;RR=61;RUN=1;ReadPosRankSum=0.814;SAB=0.52137;SAF=61;SAP=3.4743;SAR=56;SB=-1122.51;SC=GTTGTTTGGGGAAAAAAAACT;SET_WGVQSR;SRB=0.51083;SRF=2595;SRP=8.1825;SRR=2485;TC;TR=8;TU=A;set=filterInVQSR-2of5;sumGLbyD=9.81 +20 14974486 . A AG 4101.40 PASS AA=57;AB=0.57143;ABA=51;ABP=8.2839;ABR=68;AC=22;AF=0.01846;AN=1192;BL=2286;BR=2834;BVAR;BaseQRankSum=8.711;DP=20538;DP4=2172,2100,19,13;Dels=0.00;EL=32;EPP=4.877;ER=25;FS=0.517;HETAR=20;HOMA=4;HOMR=1027;HRun=1;INDEL;INS;InbreedingCoeff=0.0677;IndelType=INS.NOVEL_1.Novel_G.;LEN=1;LRB=0.10703;LRBP=130.37;MQ=126.07;MQ0=0;MQ0Fraction=0.0000;MQM=56.088;MQRankSum=-10.756;NS=1051;PV4=0.38,3.5e-51,7.9e-34,1;RA=5203;RL=26;RPP=3.9627;RR=31;RUN=1;ReadPosRankSum=1.283;SAB=0.54386;SAF=31;SAP=3.9627;SAR=26;SET_INTEGRATION;SET_WGVQSR;SRB=0.51816;SRF=2696;SRP=17.918;SRR=2507;VQSLOD=8.0072;set=Intersection;sumGLbyD=25.60 +20 15111137 . GA G 13533 PASS AA=98;AB=0.84864;ABA=89;ABP=623.8;ABR=499;AC=47;AF=0.03796;AN=1238;BL=5324;BR=856;BVAR;BaseQRankSum=-11.577;DEL;DP=13384;Dels=0.01;EL=53;EPP=4.4284;ER=45;FS=6.099;HETAR=219;HOMA=845;HOMR=18;HRun=1;InbreedingCoeff=-0.0056;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.72298;LRBP=7017.4;MQ0Fraction=0.0003;MQM=90.449;MQRankSum=1.408;NS=1083;RA=590;RL=87;RPP=130.99;RR=11;RUN=1;ReadPosRankSum=-18.074;SAB=0.55102;SAF=54;SAP=5.2261;SAR=44;SRB=0.52373;SRF=309;SRP=5.8958;SRR=281;VQSLOD=4.1054;set=filterInVQSR-2of5;sumGLbyD=3.06 +20 15283028 . A AC,ACACACACACACAC 140844.83 PASS AA=180;AB=0.61442;ABA=123;ABP=39.285;ABR=196;AC=13,817;AF=0.01111,0.69829;AN=1170;BL=4453;BR=11407;BVAR;BaseQRankSum=24.686;DP=6365;Dels=0.00;EL=124;EPP=58.793;ER=56;FR;FS=10.912;HETAR=87;HOMA=48;HOMR=683;HP=1;HR=1;HRun=1;HU=T;INS;InbreedingCoeff=0.2074;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.43846;LRBP=6624;MQ0Fraction=0.0558;MQM=38.211;MQRankSum=-21.111;NF;NR;NS=818;PP;RA=1732;RL=0;RPP=393.88;RR=180;RUN=1;ReadPosRankSum=-7.620;SAB=0.31111;SAF=56;SAP=58.793;SAR=124;SC=ACACACACACATACACACATA;SRB=0.54042;SRF=936;SRP=27.584;SRR=796;TC;TR=21;TU=AC;VQSLOD=4.7569;set=Intersection;sumGLbyD=18.36 +20 15361056 . ATAACT A 4892.81 PASS AA=59;AB=0.63576;ABA=55;ABP=27.184;ABR=96;AC=34;AF=0.0487;AN=698;BL=3164;BR=1999;BVAR;BaseQRankSum=3.391;DEL;DP=7080;Dels=0.03;EL=27;EPP=3.9304;ER=32;FR;FS=4.816;HETAR=35;HOMA=6;HOMR=966;HP=2;HPLen=3;HR=3;HRun=0;HU=A;InbreedingCoeff=0.0785;IndelType=DEL.NumRepetitions_1.EventLength_5.;LEN=5;LRB=0.22564;LRBP=573.84;MQ0=0;MQ0Fraction=0.0000;MQM=70.034;MQRankSum=-8.732;NF;NR;NS=1008;PP;RA=3915;RL=42;RPP=26.013;RR=17;RUN=1;ReadPosRankSum=-0.735;SAB=0.44068;SAF=26;SAP=4.8137;SAR=33;SC=AGATTAGGAAATAACTTAGGG;SET_INTEGRATION;SET_WGVQSR;SRB=0.42682;SRF=1671;SRP=185.12;SRR=2244;TC;TR=3;TU=A;VQSLOD=7.0900;set=Intersection;sumGLbyD=43.38 +20 15579507 . AATTAGTC A,TATTAGTC 1936.38 PASS AA=16;AB=0.58974;ABA=16;ABP=5.7386;ABR=23;AC=64;AF=0.05229;AN=1224;BL=699;BR=775;BVAR;BaseQRankSum=-21.390;DEL;DP=21920;DP4=2099,2403,6,6;Dels=0.00;EL=8;EPP=3.0103;ER=8;FR;FS=2.920;HETAR=5;HOMA=0;HOMR=1063;HP=3;HPLen=4;HR=4;HU=A;INDEL;InbreedingCoeff=-0.0143;IndelType=MIXED;LEN=7;LRB=0.05156;LRBP=11.519;MQ=129.49;MQ0=0;MQ0Fraction=0.0000;MQM=51.938;MQRankSum=3.331;NF;NR;NS=1068;PP;PV4=1,0.019,1.3e-07,1;RA=5334;RL=5;RPP=7.8961;RR=11;RUN=1;ReadPosRankSum=-16.901;SAB=0.4375;SAF=7;SAP=3.5532;SAR=9;SC=CATACTACAAAATTAGTCATT;SET_INTEGRATION;SET_WGVQSR;SRB=0.41695;SRF=2224;SRP=322.58;SRR=3110;TC;TR=4;TU=A;VQSLOD=3.2237;set=filterInVQSR-2of5;sumGLbyD=43.57 +20 15752535 . CT C,GT 3775.20 PASS AA=92;AB=0.78636;ABA=47;ABP=159.71;ABR=173;AC=0;AF=0.0000;AN=608;BL=4955;BR=2380;BVAR;BaseQRankSum=2.910;DEL;DP=3429;Dels=0.04;EL=13;EPP=105.82;ER=79;FR;HETAR=92;HOMA=95;HOMR=544;HP=2;HPLen=2;HR=2;HU=T;InbreedingCoeff=0.0483;IndelType=MIXED;LEN=1;LRB=0.35106;LRBP=1966;MQ0Fraction=0.0232;MQM=35.293;MQRankSum=-2.199;NF;NR;NS=732;PP;QD=4.91;RA=1272;RL=81;RPP=118.66;RR=11;RUN=1;ReadPosRankSum=-1.077;SAB=0.021739;SAF=2;SAP=185.79;SAR=90;SB=-59.51;SC=CAAGACCATCCTTGGCTAACA;SET_INTEGRATION;SET_WGVQSR;SRB=0.14623;SRF=186;SRP=1385.8;SRR=1086;TC;TR=2;TU=T;set=filterInVQSR-2of5;sumGLbyD=9.70 +20 15883060 rs73619850 A AT 1325.60 PASS AA=38;AB=0.59302;ABA=35;ABP=9.4742;ABR=51;AC=14;AF=0.0156;AN=896;BL=1078;BR=1638;BVAR;BaseQRankSum=-4.526;DB;DP=19854;DP4=1632,1800,15,20;Dels=0.00;EL=18;EPP=3.2389;ER=20;FR;FS=0.000;HETAR=14;HOMA=1;HOMR=1014;HP=1;HPLen=1;HR=1;HRun=1;HU=T;INDEL;INS;InbreedingCoeff=-0.0131;IndelType=INS.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.20619;LRBP=253.74;MQ=118.40;MQ0=0;MQ0Fraction=0.0000;MQM=56.526;MQRankSum=0.892;NF;NR;NS=1029;PP;PV4=0.61,1,0.25,0.14;RA=4439;RL=14;RPP=8.7247;RR=24;RUN=1;ReadPosRankSum=-2.061;SAB=0.42105;SAF=16;SAP=5.0675;SAR=22;SC=GGATTGGCAGATAAAAAATGG;SET_INTEGRATION;SET_WGVQSR;SRB=0.46429;SRF=2061;SRP=52.168;SRR=2378;TC;TR=1;TU=T;VQSLOD=9.7576;set=Intersection;sumGLbyD=15.69 +20 16122099 . GA G 12914 PASS AA=85;AB=0.85915;ABA=80;ABP=639.4;ABR=488;AC=19;AF=0.01542;AN=1232;BL=805;BR=5457;BVAR;BaseQRankSum=-6.084;DEL;DP=13592;Dels=0.00;EL=45;EPP=3.649;ER=40;FS=0.935;HETAR=218;HOMA=841;HOMR=14;HRun=2;InbreedingCoeff=0.0250;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.74289;LRBP=7507.5;MQ0=0;MQ0Fraction=0.0000;MQM=103.01;MQRankSum=2.843;NS=1075;RA=541;RL=2;RPP=170.62;RR=83;RUN=1;ReadPosRankSum=-16.222;SAB=0.49412;SAF=42;SAP=3.0358;SAR=43;SRB=0.44917;SRF=243;SRP=15.152;SRR=298;VQSLOD=3.9745;set=filterInVQSR-2of5;sumGLbyD=2.97 +20 16828509 . G GT 843.62 PASS AA=30;AB=0.70103;ABA=29;ABP=37.06;ABR=68;AC=10;AF=0.0140;AN=714;BL=1368;BR=1786;BVAR;BaseQRankSum=-4.061;DP=8682;Dels=0.01;EL=14;EPP=3.2998;ER=16;FR;FS=2.681;HETAR=22;HOMA=1;HOMR=1020;HP=8;HPLen=8;HR=8;HRun=8;HU=T;INS;InbreedingCoeff=0.1389;IndelType=INS.NumRepetitions_8.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.13253;LRBP=123.3;MQ0=0;MQ0Fraction=0.0000;MQM=62.8;MQRankSum=-1.491;NF;NR;NS=1043;PP;RA=4416;RL=11;RPP=7.6428;RR=19;RUN=1;ReadPosRankSum=-1.718;SAB=0.76667;SAF=23;SAP=21.54;SAR=7;SC=CCTTCAAAAGGTTTTTTTTGG;SET_INTEGRATION;SET_WGVQSR;SRB=0.5745;SRF=2537;SRP=215.91;SRR=1879;TC;TR=8;TU=T;VQSLOD=7.6258;set=Intersection;sumGLbyD=10.77 +20 17470034 . GC G 46975 PASS AA=57;AB=0.96043;ABA=52;ABP=2422.5;ABR=1262;AC=34;AF=0.02773;AN=1226;BL=418;BR=3446;BVAR;BaseQRankSum=-6.250;DEL;DP=12035;Dels=0.00;EL=22;EPP=9.4485;ER=35;FS=1.350;HETAR=416;HOMA=409;HOMR=244;HRun=1;InbreedingCoeff=0.0083;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.78364;LRBP=5155.6;MQ0=0;MQ0Fraction=0.0000;MQM=99.509;MQRankSum=2.192;NS=1076;RA=2396;RL=5;RPP=87.164;RR=52;RUN=1;ReadPosRankSum=-15.199;SAB=0.5614;SAF=32;SAP=4.877;SAR=25;SRB=0.52963;SRF=1269;SRP=21.285;SRR=1127;VQSLOD=3.8440;set=filterInVQSR-2of5;sumGLbyD=3.06 +20 17471374 . AGCGGC A 850.03 PASS AC=6;AF=0.0085;AF1=0.01301;AN=704;BaseQRankSum=6.259;CI95=0.00885,0.01991;DP=8180;DP4=2215,1878,4,5;Dels=0.01;FQ=131;FS=0.000;HRun=0;INDEL;InbreedingCoeff=0.0009;IndelType=DEL.NumRepetitions_1.EventLength_5.;MQ=104.41;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-5.521;PV4=0.74,0.37,0.0005,1;ReadPosRankSum=2.468;SET_INTEGRATION;SET_WGVQSR;VQSLOD=6.8773;set=Intersection;sumGLbyD=30.85 +20 18433202 rs35582929 G GA 2506.90 PASS AA=55;AB=0.5812;ABA=49;ABP=9.7103;ABR=68;AC=20;AF=0.0218;AN=918;BL=2263;BR=2175;BVAR;BaseQRankSum=-6.639;DB;DP=19467;DP4=1845,2365,27,26;Dels=0.00;EL=21;EPP=9.6826;ER=34;FQ=999;FR;FS=5.633;HETAR=16;HOMA=3;HOMR=1045;HP=2;HPLen=3;HR=3;HRun=1;HU=G;INDEL;INS;InbreedingCoeff=0.0700;IndelType=INS.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.019829;LRBP=6.7994;MQ=114.03;MQ0=0;MQ0Fraction=0.0000;MQM=83.345;MQRankSum=1.610;NF;NR;NS=1064;PP;PV4=0.33,1,1,1;RA=5380;RL=28;RPP=3.0498;RR=27;RUN=1;ReadPosRankSum=0.873;SAB=0.47273;SAF=26;SAP=3.3656;SAR=29;SC=TATTTCATGGGAGCATTAAAA;SET_INTEGRATION;SET_WGVQSR;SRB=0.42862;SRF=2306;SRP=241.07;SRR=3074;TC;TR=3;TU=G;VQSLOD=10.0372;dbSNP=126;set=Intersection;sumGLbyD=13.10 +20 18551314 rs10659122 CA C,CAA,CAAA,CAAAA,CAAAAA 18810.74 PASS ABR=243;AC=19,169,216,164,188;AF=0.01816,0.16157,0.20650,0.15679,0.17973;BVAR;BaseQRankSum=-5.742;DB;DP=17637;DP4=136,77,560,237;FR;FS=2.693;HOMA=177;HOMR=299;HP=17;HR=17;HU=A;HaplotypeScore=15.5048;INDEL;INS;InbreedingCoeff=0.8901;IndelType=MULTIALLELIC_INDEL;MQ0=11;MQ0Fraction=0.0069;MQRankSum=1.845;NF;NR;NS=658;PP;PV4=0.08,1,1,1;QD=12.66;RA=673;RUN=1;ReadPosRankSum=0.283;SB=-3514.45;SC=GATTCCATCTCAAAAAAAAAA;SET_WGVQSR;SRB=0.63596;SRF=428;SRP=111.06;SRR=245;TC;TR=17;TU=A;VQSLOD=10.6964;dbSNP=130;set=Intersection +20 18785519 . G GTC 415.55 PASS AC=28;AF=0.0400;AN=700;BaseQRankSum=10.889;DP=1929;FS=8.778;HRun=0;HaplotypeScore=27.6448;InbreedingCoeff=0.0510;IndelType=INS.NOVEL_2.;MQ=61.99;MQ0=36;MQ0Fraction=0.0187;MQRankSum=4.508;QD=3.08;ReadPosRankSum=8.080;SB=-437.03;SET_INTEGRATION;SET_WGVQSR;VQSLOD=4.9313;set=VQSR +20 20301041 rs35451634 ATATG A 200.42 PASS AC=21;AF=0.0449;AN=468;BaseQRankSum=5.251;DB;DP=579;FS=24.013;HRun=0;HaplotypeScore=27.8977;InbreedingCoeff=0.0113;IndelType=DEL.NumRepetitions_1.EventLength_4.;MQ=78.47;MQ0=26;MQ0Fraction=0.0449;MQRankSum=-5.284;QD=3.06;ReadPosRankSum=1.793;SB=-55.76;SET_INTEGRATION;SET_WGVQSR;VQSLOD=5.0981;set=VQSR +20 20378174 . TC T 245.55 PASS AC=23;AF=0.01879;AN=1224;BaseQRankSum=0.990;DP=3225;FS=10.413;HRun=1;HaplotypeScore=22.6109;InbreedingCoeff=0.0244;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=93.70;MQ0=3;MQ0Fraction=0.0009;MQRankSum=-3.349;QD=1.86;ReadPosRankSum=-7.227;SB=-188.62;VQSLOD=4.2553;set=VQSR +20 20809160 rs10571503 TAA AAA,T 3496 PASS AC=0;AF=0.0000;AN=612;BaseQRankSum=1.968;DB;DP=1092;FR;HP=4;HPLen=3;HR=3;HRun=0;HU=A;HaplotypeScore=26.1253;InbreedingCoeff=0.0603;IndelType=MIXED;MQ=68.98;MQ0=1;MQ0Fraction=0.0009;MQRankSum=1.520;NF;NR;PP;ReadPosRankSum=-4.042;SC=TATATATATATAAATTTAAAT;TC;TR=13;TU=AT;set=filterInVQSR-2of5 +20 22508765 . CT C 53877.84 PASS AA=187;AB=0.78077;ABA=171;ABP=537.09;ABR=609;AC=1017;AF=0.91787;AN=1108;BL=12690;BR=1718;BVAR;BaseQRankSum=13.773;DEL;DP=7430;Dels=0.02;EL=73;EPP=22.53;ER=114;FR;FS=16.352;HETAR=152;HOMA=9;HOMR=786;HP=8;HR=4;HRun=4;HU=T;InbreedingCoeff=0.3885;IndelType=DEL.NumRepetitions_4.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.76152;LRBP=18147;MQ0=0;MQ0Fraction=0.0000;MQM=46.086;MQRankSum=0.971;NF;NR;NS=947;PP;RA=2868;RL=177;RPP=326.86;RR=10;RUN=1;ReadPosRankSum=9.951;SAB=0.34759;SAF=65;SAP=40.738;SAR=122;SC=AAAAAATTTTCTTTTGAACTG;SET_INTEGRATION;SET_WGVQSR;SRB=0.46269;SRF=1327;SRP=37.684;SRR=1541;TC;TR=4;TU=T;VQSLOD=5.1182;set=Intersection;sumGLbyD=25.15 +20 22555082 rs11477526 AT A 11503 PASS AA=530;AB=0.50816;ABA=422;ABP=3.5063;ABR=436;AF=0.1614;AN=700;BL=21453;BR=23313;BVAR;BaseQRankSum=17.562;DB;DEL;DP=25587;DP4=1869,1600,283,201;Dels=0.14;EL=259;EPP=3.6003;ER=271;FQ=999;FR;FS=14.595;HETAR=159;HOMA=41;HOMR=846;HP=3;HPLen=3;HR=3;HRun=3;HU=T;INDEL;InbreedingCoeff=0.0995;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.041549;LRBP=170.83;MQ=95.89;MQ0=0;MQ0Fraction=0.0000;MQM=72.162;MQRankSum=2.564;NF;NR;NS=1046;PP;PV4=0.058,6.6e-129,0.04,1;RA=4303;RL=264;RPP=3.0267;RR=266;RUN=1;ReadPosRankSum=0.176;SAB=0.58679;SAF=311;SAP=37.688;SAR=219;SC=GGGAAAGCTGATTTACTGATT;SET_INTEGRATION;SET_WGVQSR;SRB=0.54892;SRF=2362;SRP=92.453;SRR=1941;TC;TR=3;TU=T;VQSLOD=8.7746;dbSNP=120;set=Intersection;sumGLbyD=15.27 +20 22590907 . A AC 4204.88 PASS AA=67;AB=0.592;ABA=51;ABP=12.2;ABR=74;AF=0.0554;AF1=0.0468;AN=560;BL=2277;BR=2389;BVAR;BaseQRankSum=10.968;CI95=0.03759,0.05639;DP=14380;DP4=2514,2018,33,33;Dels=0.00;EL=22;EPP=20.155;ER=45;FQ=999;FR;FS=3.846;HETAR=25;HOMA=4;HOMR=1049;HP=4;HPLen=5;HR=5;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.0719;IndelType=INS.NOVEL_1.Novel_C.;LEN=1;LRB=0.024003;LRBP=8.8481;MQ=110.68;MQ0=0;MQ0Fraction=0.0000;MQM=96.149;MQRankSum=2.668;NF;NR;NS=1078;PP;PV4=0.39,1,0.46,0.36;RA=5468;RL=33;RPP=3.0427;RR=34;RUN=1;ReadPosRankSum=-1.097;SAB=0.50746;SAF=34;SAP=3.0427;SAR=33;SC=TCATATCAAAAACATTACGTT;SET_INTEGRATION;SET_WGVQSR;SRB=0.54389;SRF=2974;SRP=94.508;SRR=2494;TC;TR=5;TU=A;VQSLOD=10.0712;set=Intersection;sumGLbyD=27.69 +20 22806326 rs11468890 ATTCCATCAC A 105320.99 PASS AC=567;AF=0.48795;AN=1162;BVAR;BaseQRankSum=32.858;DB;DEL;DP=26278;DP4=727,796,554,587;Dels=0.30;FQ=999;FR;FS=1.923;HP=3;HPLen=3;HR=2;HRun=0;HU=T;INDEL;InbreedingCoeff=0.2548;IndelType=DEL.NumRepetitions_2.EventLength_9.;LEN=9;MQ=89.42;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-23.545;NF;NR;PP;PV4=0.7,1,1.3e-167,1;RUN=1;ReadPosRankSum=4.384;SC=GGCTGCTCCCATTCCATCACT;SET_INTEGRATION;SET_WGVQSR;TC;TR=2;TU=T;VQSLOD=8.2594;set=Intersection;sumGLbyD=69.81 +20 22999898 rs55966257 CAGGA C 8019.97 PASS AA=23;AB=0.57778;ABA=19;ABP=5.3748;ABR=26;AC=214;AF=0.18838;AN=1136;BL=1143;BR=1040;BVAR;BaseQRankSum=29.294;DB;DEL;DP=8216;Dels=0.02;EL=11;EPP=3.1047;ER=12;FS=14.938;HETAR=14;HOMA=2;HOMR=948;HRun=0;InbreedingCoeff=0.0797;IndelType=DEL.NumRepetitions_1.EventLength_4.;LEN=4;LRB=0.047183;LRBP=13.563;MQ0=0;MQ0Fraction=0.0000;MQM=34.783;MQRankSum=-20.301;NS=964;RA=3637;RL=13;RPP=3.86;RR=10;RUN=1;ReadPosRankSum=-24.607;SAB=0.47826;SAF=11;SAP=3.1047;SAR=12;SRB=0.49024;SRF=1783;SRP=6.02;SRR=1854;VQSLOD=7.9163;set=Intersection;sumGLbyD=9.43 +20 23385964 rs57723772 GAA G 8170.95 PASS AC=257;AF=0.20928;AN=1228;BaseQRankSum=32.220;DB;DP=3291;FS=1.688;HRun=3;HaplotypeScore=22.6739;InbreedingCoeff=0.0171;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_A.;MQ=58.44;MQ0=32;MQ0Fraction=0.0097;MQRankSum=-4.893;QD=6.55;ReadPosRankSum=-35.524;SB=-3631.67;VQSLOD=5.6549;set=VQSR +20 23534530 . TA T 3542.10 PASS AA=45;AB=0.75658;ABA=37;ABP=89.926;ABR=115;AC=35;AF=0.02991;AN=1170;BL=3090;BR=270;BVAR;BaseQRankSum=-6.892;DEL;DP=8108;Dels=0.00;EL=19;EPP=5.3748;ER=26;FS=1.026;HETAR=76;HOMA=896;HOMR=18;HRun=1;InbreedingCoeff=0.0551;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.83929;LRBP=5142.4;MQ0Fraction=0.0017;MQM=41.578;MQRankSum=0.818;NS=991;RA=203;RL=43;RPP=84.127;RR=2;RUN=1;ReadPosRankSum=-12.923;SAB=0.37778;SAF=17;SAP=8.8491;SAR=28;SRB=0.5665;SRF=115;SRP=10.808;SRR=88;VQSLOD=4.2093;set=Intersection;sumGLbyD=3.49 +20 23976810 rs5841018 A ATATTAAT 1782.38 PASS AF=0.1387;AF1=0.01507;BaseQRankSum=3.717;CI95=0.00188,0.03947;DB;DP=1712;DP4=357,376,7,2;Dels=0.00;FQ=31.1;FS=14.489;HPLen=2;HRun=0;INDEL;InbreedingCoeff=0.1123;IndelType=INS.NumRepetitions_1.EventLength_7.;MQ=49.53;MQ0=2;MQ0Fraction=0.0055;MQRankSum=-4.928;PV4=0.1,1,0.00085,0.016;ReadPosRankSum=-4.456;VQSLOD=5.3140;dbSNP=116;set=Intersection;sumGLbyD=19.98 +20 24222100 . CTTTTA C 4219.36 PASS AA=57;AB=0.59434;ABA=43;ABP=11.205;ABR=63;AF=0.01803;AF1=0.01547;AN=1220;BL=2073;BR=2345;BVAR;BaseQRankSum=7.990;CI95=0.0114,0.02137;DEL;DP=17536;DP4=2140,2346,7,12;Dels=0.01;EL=32;EPP=4.877;ER=25;FQ=104;FS=0.614;HETAR=21;HOMA=4;HOMR=1042;HRun=0;INDEL;InbreedingCoeff=0.1941;IndelType=DEL.NumRepetitions_2.EventLength_5.;LEN=5;LRB=0.061566;LRBP=39.374;MQ=73.32;MQ0Fraction=0.0021;MQM=39.614;MQRankSum=-5.728;NS=1067;PV4=0.37,1.1e-39,3.5e-09,1;RA=5527;RL=28;RPP=3.0484;RR=29;RUN=1;ReadPosRankSum=0.214;SAB=0.54386;SAF=31;SAP=3.9627;SAR=26;SET_INTEGRATION;SET_WGVQSR;SRB=0.49267;SRF=2723;SRP=5.588;SRR=2804;VQSLOD=7.5428;set=Intersection;sumGLbyD=38.08 +20 24395018 . AT A 49310 PASS AA=146;AB=0.91198;ABA=130;ABP=2180.5;ABR=1347;AC=50;AF=0.04045;AN=1236;BL=587;BR=9625;BVAR;BaseQRankSum=-4.610;DEL;DP=12793;Dels=0.01;EL=54;EPP=24.487;ER=92;FS=22.108;HETAR=485;HOMA=384;HOMR=210;HRun=2;InbreedingCoeff=0.0374;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.88504;LRBP=17373;MQ0=0;MQ0Fraction=0.0000;MQM=102.26;MQRankSum=2.256;NS=1080;RA=2377;RL=1;RPP=311.42;RR=145;RUN=1;ReadPosRankSum=-16.347;SAB=0.63699;SAF=93;SAP=26.807;SAR=53;SRB=0.52167;SRF=1240;SRP=12.702;SRR=1137;VQSLOD=3.2421;set=filterInVQSR-2of5;sumGLbyD=3.80 +20 24411517 . C CA 246.18 PASS AF=0.01546;AF1=0.01095;BaseQRankSum=7.832;CI95=0.005698,0.01709;DP=7981;DP4=983,2037,7,7;Dels=0.00;FQ=27.9;FS=18.815;HPLen=3;HRun=3;INDEL;InbreedingCoeff=0.0175;IndelType=INS.NumRepetitions_3.EventLength_1.RepeatExpansion_A.;MQ=60.28;MQ0Fraction=0.0137;MQRankSum=-7.243;PV4=0.25,1,2.7e-05,1;ReadPosRankSum=-0.143;VQSLOD=4.3701;set=Intersection;sumGLbyD=6.56 +20 24421169 . AG A 27480 PASS AA=182;AB=0.8303;ABA=149;ABP=835;ABR=729;AC=89;AF=0.07224;AN=1232;BL=11276;BR=2214;BVAR;BaseQRankSum=-5.447;DEL;DP=11717;Dels=0.01;EL=103;EPP=9.8827;ER=79;FR;FS=15.492;HETAR=343;HOMA=607;HOMR=114;HP=4;HR=1;HRun=1;HU=G;InbreedingCoeff=0.0353;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.67176;LRBP=13222;MQ0=0;MQ0Fraction=0.0000;MQM=88.324;MQRankSum=2.221;NF;NR;NS=1071;PP;RA=1226;RL=169;RPP=293.37;RR=13;RUN=1;ReadPosRankSum=-19.711;SAB=0.54945;SAF=100;SAP=6.876;SAR=82;SC=CCTTAGCCCCAGAAAACATCT;SRB=0.44535;SRF=546;SRP=34.814;SRR=680;TC;TR=1;TU=G;VQSLOD=4.2669;set=Intersection;sumGLbyD=3.91 +20 24765537 rs71841337 ATTT A,AT,ATT,ATTTT,ATTTTT 37852 PASS AC=13,120,527,51,92;AF=0.01102,0.10169,0.44661,0.04322,0.07797;AN=1180;BVAR;BaseQRankSum=8.172;DB;DEL;DP=39116;DP4=200,331,851,1169;FR;FS=2.394;HP=15;HR=15;HU=T;HaplotypeScore=20.8091;INDEL;INS;InbreedingCoeff=0.4815;IndelType=MULTIALLELIC_INDEL;MQ0=1;MQ0Fraction=0.0003;MQRankSum=4.344;NF;NR;PP;PV4=0.067,1,1,0.1;QD=7.90;RUN=1;ReadPosRankSum=1.798;SB=-8371.96;SC=CTCTGCAACAATTTTTTTTTT;SET_WGVQSR;TC;TR=15;TU=T;VQSLOD=9.9679;dbSNP=120;set=Intersection +20 25500689 . A AATTT 84980.72 PASS AC=1005;AF=0.89096;AN=1128;BaseQRankSum=17.400;DP=2324;FS=6.721;HRun=0;HaplotypeScore=25.3376;InbreedingCoeff=0.2148;IndelType=INS.NumRepetitions_1.EventLength_4.;MQ=75.19;MQ0=1;MQ0Fraction=0.0004;MQRankSum=-8.221;QD=38.28;ReadPosRankSum=4.504;SB=-34833.07;SET_INTEGRATION;SET_WGVQSR;VQSLOD=4.6038;set=VQSR +20 25550373 . GA G 11251.31 PASS AA=246;AB=0.42963;ABA=154;ABP=14.624;ABR=116;AC=566;AF=0.6521;AN=868;BL=5230;BR=11845;BVAR;BaseQRankSum=7.418;DEL;DP=8885;Dels=0.02;EL=99;EPP=23.348;ER=147;FR;FS=50.357;HETAR=150;HOMA=849;HOMR=14;HP=1;HR=2;HRun=1;HU=G;InbreedingCoeff=0.1365;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.38741;LRBP=5567.9;MQ0=0;MQ0Fraction=0.0000;MQM=97.561;MQRankSum=0.050;NF;NR;NS=1013;PP;RA=269;RL=75;RPP=84.361;RR=171;RUN=1;ReadPosRankSum=-7.128;SAB=0.52846;SAF=130;SAP=4.7404;SAR=116;SC=CACGGAGGCGGAGGAAGCAGC;SRB=0.42379;SRF=114;SRP=16.58;SRR=155;TC;TR=6;TU=AGG;VQSLOD=4.0103;set=filterInVQSR-2of5;sumGLbyD=4.58 +20 25903865 . TTC T 7459.23 PASS AC=277;AF=0.23316;AN=1188;BaseQRankSum=31.479;DP=2969;FS=137.723;HRun=0;HaplotypeScore=37.3300;InbreedingCoeff=-0.1755;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_TC.;MQ=53.49;MQ0=50;MQ0Fraction=0.0168;MQRankSum=-25.506;QD=4.70;ReadPosRankSum=-5.913;SB=-1747.98;VQSLOD=5.4731;set=VQSR +20 25934237 . C CCACTT 771.36 PASS AC=37;AF=0.0426;AN=868;BaseQRankSum=16.331;DP=2253;FS=4.545;HRun=0;HaplotypeScore=29.9764;InbreedingCoeff=-0.0685;IndelType=INS.NOVEL_5.;MQ=48.12;MQ0=87;MQ0Fraction=0.0386;MQRankSum=-12.497;QD=3.37;ReadPosRankSum=-8.428;SB=-297.70;VQSLOD=4.2324;set=VQSR +20 26054751 rs112967123 TATC T 33244 PASS AA=1863;AB=0.79012;ABA=1788;ABP=6231;ABR=6731;AC=227;AF=0.18218;AN=1246;BL=74924;BR=72452;BVAR;BaseQRankSum=32.258;DB;DEL;DP=36404;DS;Dels=0.05;EL=931;EPP=3.0115;ER=932;FR;FS=265.752;HETAR=527;HOMA=2;HOMR=565;HP=1;HR=2;HRun=0;HU=T;InbreedingCoeff=-0.2137;IndelType=DEL.NumRepetitions_2.EventLength_3.;LEN=3;LRB=0.016773;LRBP=93.048;MQ0Fraction=0.0127;MQM=28.797;MQRankSum=-5.329;NF;NR;NS=1094;PP;RA=14604;RL=1014;RPP=34.743;RR=849;RUN=1;ReadPosRankSum=8.394;SAB=0.65486;SAF=1220;SAP=391.07;SAR=643;SC=TCACCATCATTATCATCATTA;SRB=0.56717;SRF=8283;SRP=575.39;SRR=6321;TC;TR=8;TU=ATC;VQSLOD=1.0486;set=filterInVQSR-2of5;sumGLbyD=6.54 +20 26120452 . CAG C 7863.19 PASS AA=163;AB=0.70489;ABA=157;ABP=196.99;ABR=375;AC=171;AF=0.1908;AN=896;BL=3455;BR=4877;BVAR;BaseQRankSum=25.536;DEL;DP=7014;Dels=0.10;EL=58;EPP=32.438;ER=105;FS=231.723;HETAR=90;HOMA=5;HOMR=387;HRun=0;InbreedingCoeff=-0.1966;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_AG.;LEN=2;LRB=0.17067;LRBP=530;MQ0Fraction=0.0470;MQM=21.951;MQRankSum=-23.449;NS=482;RA=1117;RL=62;RPP=23.273;RR=101;RUN=1;ReadPosRankSum=1.904;SAB=0.37423;SAF=61;SAP=25.404;SAR=102;SRB=0.41719;SRF=466;SRP=69.544;SRR=651;VQSLOD=-0.9395;set=filterInVQSR-2of5;sumGLbyD=5.06 +20 26185812 . AG A 322.58 PASS AF=0.0342;BaseQRankSum=3.668;DP=3014;Dels=0.01;FR;FS=10.238;HP=8;HPLen=6;HR=6;HRun=6;HU=G;InbreedingCoeff=0.1504;IndelType=DEL.NumRepetitions_6.EventLength_1.RepeatExpansion_G.;MQ0Fraction=0.0473;MQRankSum=-5.464;NF;NR;PP;ReadPosRankSum=0.536;SC=GGGTGGGTGGAGGGGGGAGGG;SET_WGVQSR;TC;TR=6;TU=G;VQSLOD=5.0767;set=Intersection;sumGLbyD=8.46 +20 30963468 . AGTTT A 2041.12 PASS AA=38;AB=0.75694;ABA=35;ABP=85.587;ABR=109;AC=34;AF=0.0377;AN=902;BL=1974;BR=668;BVAR;BaseQRankSum=3.060;DEL;DP=22806;DP4=1997,1747,28,36;Dels=0.02;EL=17;EPP=3.9246;ER=21;FR;FS=16.034;HETAR=29;HOMA=1;HOMR=1009;HP=1;HPLen=1;HR=1;HRun=0;HU=G;INDEL;InbreedingCoeff=0.0752;IndelType=DEL.NumRepetitions_2.EventLength_4.;LEN=4;LRB=0.49432;LRBP=1404.9;MQ=87.17;MQ0Fraction=0.0013;MQM=98.079;MQRankSum=6.021;NF;NR;NS=1039;PP;PV4=0.13,1.5e-07,1,0.051;RA=4052;RL=36;RPP=69.069;RR=2;RUN=1;ReadPosRankSum=-1.847;SAB=0.5;SAF=19;SAP=3.0103;SAR=19;SC=AGAAGTAAGTAGTTTGTTTTT;SET_INTEGRATION;SET_WGVQSR;SRB=0.53776;SRF=2179;SRP=53.19;SRR=1873;TC;TR=9;TU=AAGT;VQSLOD=7.3578;set=Intersection;sumGLbyD=14.03 +20 31963212 . AAAAAAAAAAAAG A 727.15 PASS AC=5;AF=0.0080;AN=622;BaseQRankSum=4.037;DP=1480;FS=0.000;HRun=0;HaplotypeScore=43.3793;InbreedingCoeff=0.0350;IndelType=DEL.NumRepetitions_1.EventLength_10orMore.;MQ=51.77;MQ0=59;MQ0Fraction=0.0399;MQRankSum=-1.799;QD=22.72;ReadPosRankSum=3.591;SB=-364.04;VQSLOD=5.3166;set=VQSR +20 31997272 . CT C,CTT,CTTT 1837.10 PASS AA=63;AB=0.77559;ABA=57;ABP=170.57;ABR=197;AC=79,49,30;AF=0.06594,0.04090,0.02504;AN=1198;BL=2372;BR=2640;BVAR;BaseQRankSum=3.277;DP=9050;Dels=0.03;EL=24;EPP=10.766;ER=39;FR;FS=0.303;HETAR=45;HOMA=1;HOMR=981;HP=10;HPLen=10;HR=10;HRun=10;HU=T;INS;InbreedingCoeff=0.2796;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.053472;LRBP=34.128;MQ0Fraction=0.0000;MQM=50.889;MQRankSum=0.610;NF;NR;NS=1027;PP;RA=3776;RL=30;RPP=3.3205;RR=33;RUN=1;ReadPosRankSum=-0.800;SAB=0.39683;SAF=25;SAP=8.8354;SAR=38;SC=ACCCAACTTCCTTTTTTTTTT;SET_WGVQSR;SRB=0.46213;SRF=1745;SRP=50.049;SRR=2031;TC;TR=10;TU=T;VQSLOD=4.1189;set=filterInVQSR-2of5;sumGLbyD=3.66 +20 33446974 rs113250263 TAA T,TA,TAAA 17130.16 PASS AC=65,417,184;AF=0.05941,0.38117,0.16819;AN=1094;BVAR;BaseQRankSum=3.400;DB;DEL;DP=22362;DP4=221,247,418,524;Dels=0.33;FR;FS=15.409;HP=15;HR=14;HRun=14;HU=A;INDEL;INS;InbreedingCoeff=0.5215;IndelType=MULTIALLELIC_INDEL;MQ=61.32;MQ0Fraction=0.0021;MQRankSum=0.481;NF;NR;PP;PV4=0.33,1,1,1;RUN=1;ReadPosRankSum=-0.056;SC=CTCCGTCTCATAAAAAAAAAA;SET_WGVQSR;TC;TR=14;TU=A;VQSLOD=8.0974;dbSNP=132;set=Intersection;sumGLbyD=12.78 +20 33877149 . C CT 1784.40 PASS AA=58;AB=0.73096;ABA=53;ABP=94.289;ABR=144;AC=65;AF=0.05682;AN=1144;BL=3298;BR=1935;BVAR;BaseQRankSum=-2.066;DP=8074;Dels=0.02;EL=22;EPP=10.348;ER=36;FR;FS=11.452;HETAR=47;HOMA=3;HOMR=754;HP=16;HR=12;HRun=12;HU=T;INS;InbreedingCoeff=0.1178;IndelType=INS.NumRepetitions_10orMore.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.26046;LRBP=773.91;MQ0Fraction=0.0165;MQM=52.259;MQRankSum=0.734;NF;NR;NS=804;PP;RA=2141;RL=43;RPP=32.363;RR=15;RUN=1;ReadPosRankSum=-1.273;SAB=0.46552;SAF=27;SAP=3.6093;SAR=31;SC=ATTTTCTTTTCTTTTTTTTTT;SET_INTEGRATION;SET_WGVQSR;SRB=0.37553;SRF=804;SRP=291.14;SRR=1337;TC;TR=12;TU=T;VQSLOD=3.1540;set=filterInVQSR-2of5;sumGLbyD=2.84 +20 34387589 rs112431805 CT C,CTT 4039.10 PASS AA=121;AB=0.75368;ABA=117;ABP=268.53;ABR=358;AC=84,139;AF=0.07047,0.11661;AN=1192;BL=5557;BR=3901;BVAR;BaseQRankSum=2.693;DB;DP=10157;Dels=0.03;EL=47;EPP=16.093;ER=74;FR;FS=7.639;HETAR=89;HOMA=2;HOMR=913;HP=13;HR=11;HRun=11;HU=T;INS;InbreedingCoeff=0.2097;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.17509;LRBP=632.63;MQ0Fraction=0.0000;MQM=49.802;MQRankSum=-0.801;NF;NR;NS=1004;PP;RA=3789;RL=77;RPP=22.554;RR=44;RUN=1;ReadPosRankSum=-2.691;SAB=0.3719;SAF=45;SAP=20.256;SAR=76;SC=AAGAAGTGTTCTTTTTTTTTT;SET_WGVQSR;SRB=0.40987;SRF=1553;SRP=270.35;SRR=2236;TC;TR=11;TU=T;VQSLOD=4.0473;set=filterInVQSR-2of5;sumGLbyD=4.64 +20 34493409 rs73621682 C CAG 62288.93 PASS AA=1069;AB=0.54863;ABA=826;ABP=40.606;ABR=1004;AC=257;AF=0.3640;AN=706;BL=41524;BR=47039;BVAR;BaseQRankSum=-24.248;DB;DP=30195;DP4=1743,1636,614,487;Dels=0.00;EL=582;EPP=21.343;ER=487;FQ=999;FR;FS=5.080;HETAR=298;HOMA=63;HOMR=712;HP=1;HPLen=1;HR=1;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.1437;IndelType=INS.NumRepetitions_2.EventLength_2.RepeatExpansion_AG.;LEN=2;LRB=0.062272;LRBP=748.76;MQ=77.99;MQ0=3;MQ0Fraction=0.0015;MQM=54.446;MQRankSum=0.160;NF;NR;NS=1073;PP;PV4=0.016,1,0.01,1;RA=4461;RL=526;RPP=3.5973;RR=543;RUN=1;ReadPosRankSum=-1.716;SAB=0.57343;SAF=613;SAP=53.08;SAR=456;SC=AGGAAGAGATCAGAGCTCCCC;SET_INTEGRATION;SET_WGVQSR;SRB=0.52634;SRF=2348;SRP=29.892;SRR=2113;TC;TR=4;TU=AG;VQSLOD=8.7047;dbSNP=130;set=Intersection;sumGLbyD=49.82 +20 35957317 . CTGACT C,CGACT 4370.96 PASS ABR=81;AC=22,1;AF=0.0321,0.0015;AF1=0.04523;AN=686;BVAR;BaseQRankSum=7.969;CI95=0.0354,0.05752;DEL;DP=16632;DP4=1942,1815,17,21;Dels=0.03;FQ=999;FR;FS=0.531;HOMA=1;HOMR=998;HP=2;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0587;IndelType=MULTIALLELIC_INDEL;MQ=83.38;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-7.201;NF;NR;NS=1020;PP;PV4=0.42,0.00017,4.5e-12,1;RA=4620;RUN=1;ReadPosRankSum=-1.007;SC=CCTCTCAGCTCTGACTGAGTC;SET_WGVQSR;SRB=0.50043;SRF=2312;SRP=3.0178;SRR=2308;TC;TR=8;TU=ACTG;VQSLOD=9.9778;dbSNP=130;set=Intersection;sumGLbyD=36.45 +20 36136198 . GTGTC G 2078.76 PASS AA=35;AB=0.54167;ABA=33;ABP=4.096;ABR=39;AC=17;AF=0.01384;AN=1228;BL=1212;BR=1523;BVAR;BaseQRankSum=6.900;DEL;DP=22483;DP4=1696,2291,9,16;Dels=0.01;EL=9;EPP=20.94;ER=26;FQ=999;FR;FS=3.023;HETAR=13;HOMA=1;HOMR=1061;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1113;IndelType=DEL.NumRepetitions_2.EventLength_4.;LEN=4;LRB=0.11371;LRBP=79.803;MQ=93.98;MQ0=1;MQ0Fraction=0.0003;MQM=83.686;MQRankSum=-1.683;NF;NR;NS=1075;PP;PV4=0.55,1,0.0083,1;RA=5771;RL=19;RPP=3.5687;RR=16;RUN=1;ReadPosRankSum=0.618;SAB=0.37143;SAF=13;SAP=8.0357;SAR=22;SC=TATCATTTTAGTGTCTGTCTG;SET_INTEGRATION;SET_WGVQSR;SRB=0.44966;SRF=2595;SRP=130.03;SRR=3176;TC;TR=11;TU=CTGT;VQSLOD=10.1935;set=Intersection;sumGLbyD=31.66 +20 36250522 . CA C 37933 PASS AA=51;AB=0.95582;ABA=44;ABP=1800.5;ABR=952;AC=23;AF=0.01885;AN=1220;BL=691;BR=3464;BVAR;BaseQRankSum=-2.418;DEL;DP=11998;Dels=0.00;EL=18;EPP=12.59;ER=33;FS=2.307;HETAR=348;HOMA=534;HOMR=164;HRun=1;InbreedingCoeff=0.0763;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.66739;LRBP=4021.7;MQ0=2;MQ0Fraction=0.0006;MQM=53.647;MQRankSum=1.083;NS=1047;RA=1663;RL=2;RPP=97.065;RR=49;RUN=1;ReadPosRankSum=-12.726;SAB=0.68627;SAF=35;SAP=18.381;SAR=16;SRB=0.59651;SRF=992;SRP=137.56;SRR=671;VQSLOD=4.1346;set=filterInVQSR-2of5;sumGLbyD=3.29 +20 36285033 rs34715186 AT A 39417 PASS AA=530;AB=0.5406;ABA=447;ABP=16.939;ABR=526;AC=88;AF=0.0950;AN=926;BL=20722;BR=20406;BVAR;BaseQRankSum=15.611;DB;DEL;DP=36713;DP4=2551,2475,236,218;Dels=0.09;EL=241;EPP=12.45;ER=289;FQ=999;FR;FS=1.290;HETAR=141;HOMA=16;HOMR=926;HP=2;HPLen=3;HR=3;HRun=1;HU=A;INDEL;InbreedingCoeff=0.0742;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.0076833;LRBP=8.2825;MQ=104.81;MQ0=0;MQ0Fraction=0.0000;MQM=84.285;MQRankSum=-0.702;NF;NR;NS=1083;PP;PV4=0.62,1,1,1;RA=6562;RL=263;RPP=3.0759;RR=267;RUN=1;ReadPosRankSum=0.090;SAB=0.55849;SAF=296;SAP=18.76;SAR=234;SC=AAAAACACAAATCAGATCGTG;SET_INTEGRATION;SET_WGVQSR;SRB=0.51707;SRF=3393;SRP=19.614;SRR=3169;TC;TR=3;TU=A;VQSLOD=10.5533;dbSNP=126;set=Intersection;sumGLbyD=14.15 +20 36384872 . CTG C 43532.41 PASS AC=1213;AF=0.99589;AN=1218;BaseQRankSum=0.802;DP=3208;FS=9.727;HRun=0;HaplotypeScore=46.6153;InbreedingCoeff=0.1085;IndelType=DEL.NumRepetitions_7.EventLength_2.RepeatExpansion_TG.;MQ=58.37;MQ0=50;MQ0Fraction=0.0156;MQRankSum=-1.672;QD=13.57;ReadPosRankSum=2.063;SB=-18894.12;VQSLOD=4.7353;set=VQSR +20 36542802 . GTA G 31310.15 PASS AA=1481;AB=0.67546;ABA=1378;ABP=1138.4;ABR=2868;AC=437;AF=0.35938;AN=1216;BL=25719;BR=95500;BVAR;BaseQRankSum=9.478;DEL;DP=18068;DS;Dels=0.10;EL=889;EPP=132.34;ER=592;FS=320.726;HETAR=591;HOMA=44;HOMR=378;HRun=0;InbreedingCoeff=-0.4197;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_TA.;LEN=2;LRB=0.57566;LRBP=87231;MQ0Fraction=0.0091;MQM=29.319;MQRankSum=-3.409;NS=1013;RA=4037;RL=3;RPP=3193;RR=1478;RUN=1;ReadPosRankSum=-6.687;SAB=0.40041;SAF=593;SAP=130.61;SAR=888;SRB=0.39014;SRF=1575;SRP=426.21;SRR=2462;VQSLOD=-1.6586;set=filterInVQSR-2of5;sumGLbyD=5.49 +20 36985025 . CCA C 4.57 PASS AC=0;AF=0.0000;AN=682;BaseQRankSum=4.199;DP=1504;FS=1.036;HRun=0;HaplotypeScore=18.5241;InbreedingCoeff=0.0460;IndelType=DEL.NumRepetitions_6.EventLength_2.RepeatExpansion_CA.;MQ=57.04;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.774;ReadPosRankSum=-2.105;VQSLOD=6.7455;set=VQSR +20 37139725 . CAG C 250.77 PASS AF=0.0084;AF1=0.0139;BaseQRankSum=4.131;CI95=0.00885,0.01991;DP=7973;DP4=1808,1990,2,7;Dels=0.01;FQ=104;FR;FS=11.160;HP=3;HPLen=2;HR=1;HRun=0;HU=A;INDEL;InbreedingCoeff=-0.0001;IndelType=DEL.NumRepetitions_3.EventLength_2.RepeatExpansion_AG.;MQ=103.71;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-3.378;NF;NR;PP;PV4=0.18,0.0011,0.041,1;ReadPosRankSum=0.605;SC=AGATGGGGAACAGAGAGCAAG;SET_INTEGRATION;SET_WGVQSR;TC;TR=6;TU=AG;VQSLOD=7.0630;set=Intersection;sumGLbyD=12.13 +20 37213224 . G GTA 3230.05 PASS AA=32;AB=0.50769;ABA=32;ABP=3.0437;ABR=33;AC=12;AF=0.0168;AF1=0.02635;AN=714;BL=1271;BR=1743;BVAR;BaseQRankSum=-7.288;CI95=0.02212,0.03319;DP=14304;DP4=2180,2256,13,21;Dels=0.00;EL=20;EPP=7.3532;ER=12;FQ=999;FR;FS=7.863;HETAR=9;HOMA=0;HOMR=1043;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0410;IndelType=INS.NumRepetitions_1.EventLength_2.RepeatExpansion_TA.;LEN=2;LRB=0.1566;LRBP=163.52;MQ=95.56;MQ0=1;MQ0Fraction=0.0005;MQM=51.562;MQRankSum=0.420;NF;NR;NS=1052;PP;PV4=0.23,1,0.03,0.33;RA=5138;RL=11;RPP=9.7962;RR=21;RUN=1;ReadPosRankSum=-1.122;SAB=0.28125;SAF=9;SAP=16.311;SAR=23;SC=TTTGCATCCAGTAGCACCACT;SET_INTEGRATION;SET_WGVQSR;SRB=0.42293;SRF=2173;SRP=268.11;SRR=2965;TC;TR=1;TU=T;VQSLOD=9.7315;set=Intersection;sumGLbyD=36.69 +20 37282014 . ATGG A 2518.52 PASS AF=0.03519;BaseQRankSum=11.994;DP=24592;DP4=415,3804,8,49;DS;Dels=0.01;FQ=999;FR;FS=2.049;HP=1;HPLen=1;HR=1;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1028;IndelType=DEL.NumRepetitions_5.EventLength_3.;MQ=51.01;MQ0Fraction=0.0139;MQRankSum=-5.912;NF;NR;PP;PV4=0.27,1,0.22,0.015;ReadPosRankSum=1.781;SC=GGTGGTGATGATGGTGGTGGT;TC;TR=17;TU=GGT;VQSLOD=2.1183;set=filterInVQSR-2of5;sumGLbyD=9.05 +20 37532218 . GTCCGTCCA ATCCGTCCA,G 76120.88 PASS AC=998;AF=0.92924;AN=1074;BaseQRankSum=-2.877;DP=3087;FR;FS=9.889;HP=2;HPLen=2;HR=1;HRun=0;HU=T;HaplotypeScore=71.6244;InbreedingCoeff=-0.0027;IndelType=MIXED;MQ=52.68;MQ0=543;MQ0Fraction=0.1759;MQRankSum=-1.750;NF;NR;PP;QD=24.98;ReadPosRankSum=-0.850;SB=-36635.43;SC=CCGTCCGTCCGTCCGTCCATC;TC;TR=19;TU=CCGT;VQSLOD=5.3068;set=Intersection +20 37712193 . AAG A 2670.33 PASS AA=106;AB=0.62821;ABA=87;ABP=36.418;ABR=147;AC=53;AF=0.0759;AN=698;BL=4672;BR=4303;BVAR;BaseQRankSum=13.696;DEL;DP=15155;DP4=1340,1852,32,52;Dels=0.06;EL=57;EPP=4.3214;ER=49;FR;FS=0.824;HETAR=43;HOMA=7;HOMR=982;HP=1;HPLen=2;HR=2;HRun=0;HU=A;INDEL;InbreedingCoeff=0.0861;IndelType=DEL.NumRepetitions_3.EventLength_2.RepeatExpansion_AG.;LEN=2;LRB=0.041114;LRBP=35.954;MQ=86.12;MQ0=0;MQ0Fraction=0.0000;MQM=54.236;MQRankSum=-5.745;NF;NR;NS=1034;PP;PV4=0.5,7.3e-26,1.1e-10,1;RA=4423;RL=58;RPP=5.0589;RR=48;RUN=1;ReadPosRankSum=2.617;SAB=0.38679;SAF=41;SAP=14.81;SAR=65;SC=GAAAATTCTGAAGAGAGTCAG;SET_INTEGRATION;SET_WGVQSR;SRB=0.43093;SRF=1906;SRP=186.29;SRR=2517;TC;TR=6;TU=AG;VQSLOD=9.8131;set=Intersection;sumGLbyD=14.20 +20 37739002 . T TCA 1395.38 PASS AA=16;AB=0.48387;ABA=16;ABP=3.0803;ABR=15;AC=11;AF=0.00950;AN=1158;BL=504;BR=630;BVAR;BaseQRankSum=-3.257;DP=13617;DP4=1660,883,7,5;Dels=0.00;EL=7;EPP=3.5532;ER=9;FR;FS=1.114;HETAR=9;HOMA=0;HOMR=991;HP=1;HPLen=2;HR=2;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0527;IndelType=INS.NumRepetitions_1.EventLength_2.RepeatExpansion_CA.;LEN=2;LRB=0.11111;LRBP=33.411;MQ=88.41;MQ0=0;MQ0Fraction=0.0000;MQM=83.75;MQRankSum=1.713;NF;NR;NS=1000;PP;PV4=0.76,1,1,0.5;RA=3257;RL=6;RPP=5.1818;RR=10;RUN=1;ReadPosRankSum=1.190;SAB=0.6875;SAF=11;SAP=7.8961;SAR=5;SC=CCTTTTTTGTTCATTTCTGCA;SET_INTEGRATION;SET_WGVQSR;SRB=0.68806;SRF=2241;SRP=1003.5;SRR=1016;TC;TR=2;TU=T;VQSLOD=10.2220;set=Intersection;sumGLbyD=41.32 +20 38395256 . TTGAG T 633.19 PASS AF=0.0028;BaseQRankSum=5.667;DP=3839;Dels=0.00;FR;FS=10.238;HP=2;HPLen=3;HR=3;HRun=0;HU=T;InbreedingCoeff=-0.0097;IndelType=DEL.NumRepetitions_1.EventLength_4.;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.276;NF;NR;PP;ReadPosRankSum=-1.016;SC=ATGTGTTTGTTTGAGTATGTT;SET_INTEGRATION;SET_WGVQSR;TC;TR=10;TU=GTTT;VQSLOD=6.4906;set=Intersection;sumGLbyD=10.83 +20 39345038 . CTGAACCATAATGTG C,CCCATAATGTG 60744.52 PASS AA=23;AB=0.67143;ABA=23;ABP=20.878;ABR=47;AC=232,2;AF=0.19366,0.00167;AN=1198;BL=1607;BR=1843;BVAR;BaseQRankSum=30.955;DEL;DP=31490;DP4=1729,2100,265,278;Dels=0.13;EL=6;EPP=14.434;ER=17;FQ=999;FR;FS=1.767;HETAR=18;HOMA=0;HOMR=1015;HP=1;HPLen=2;HR=2;HRun=0;HU=C;INDEL;InbreedingCoeff=0.1991;IndelType=MULTIALLELIC_INDEL;LEN=14;LRB=0.068406;LRBP=38.066;MQ=104.60;MQ0=0;MQ0Fraction=0.0000;MQM=189.83;MQRankSum=-16.579;NF;NR;NS=1033;PP;PV4=0.12,1,5.5e-137,1;RA=5286;RL=14;RPP=5.3706;RR=9;RUN=1;ReadPosRankSum=4.323;SAB=0.56522;SAF=13;SAP=3.86;SAR=10;SC=TGGGCTGGACCTGAACCATAA;SET_WGVQSR;SRB=0.46311;SRF=2448;SRP=65.493;SRR=2838;TC;TR=2;TU=C;VQSLOD=6.2643;dbSNP=130;set=Intersection;sumGLbyD=65.43 +20 39418008 . AG A 46796 PASS AA=113;AB=0.9511;ABA=80;ABP=2894.6;ABR=1556;AC=30;AF=0.02412;AN=1244;BL=638;BR=6936;BVAR;BaseQRankSum=7.280;DEL;DP=14307;Dels=0.00;EL=50;EPP=6.2579;ER=63;FR;FS=5.707;HETAR=473;HOMA=361;HOMR=246;HP=3;HR=3;HRun=3;HU=G;InbreedingCoeff=0.0272;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.83153;LRBP=11375;MQ0=0;MQ0Fraction=0.0000;MQM=62.398;MQRankSum=3.530;NF;NR;NS=1089;PP;RA=3000;RL=3;RPP=223.02;RR=110;RUN=1;ReadPosRankSum=-18.601;SAB=0.58407;SAF=66;SAP=9.9475;SAR=47;SC=ACTGGGGGAAAGGGATTCTAG;SRB=0.494;SRF=1482;SRP=3.9484;SRR=1518;TC;TR=3;TU=G;VQSLOD=4.5834;set=Intersection;sumGLbyD=3.06 +20 39876961 . GT G,GTT,GTTT 2302.10 PASS ABR=496;AC=45,51,45;AF=0.03664,0.04153,0.03664;AN=1228;BVAR;BaseQRankSum=4.462;DP=37649;DP4=1457,1975,57,59;Dels=0.02;FR;FS=9.938;HOMA=0;HOMR=978;HP=10;HPLen=10;HR=10;HRun=10;HU=T;INDEL;INS;InbreedingCoeff=0.2583;IndelType=MULTIALLELIC_INDEL;MQ=97.28;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.246;NF;NR;NS=1063;PP;PV4=0.15,1,1.9e-09,0.016;RA=5185;RUN=1;ReadPosRankSum=-4.954;SC=AGTTTCTCCGGTTTTTTTTTT;SET_WGVQSR;SRB=0.47464;SRF=2461;SRP=31.978;SRR=2724;TC;TR=10;TU=T;VQSLOD=4.9752;set=Intersection;sumGLbyD=4.39 +20 41013333 . TC T 20681 PASS AA=137;AB=0.89211;ABA=134;ABP=1661.6;ABR=1108;AC=68;AF=0.05601;AN=1214;BL=1091;BR=8981;BVAR;BaseQRankSum=1.354;DEL;DP=12998;Dels=0.01;EL=57;EPP=11.395;ER=80;FS=0.758;HETAR=359;HOMA=100;HOMR=610;HRun=1;InbreedingCoeff=0.0104;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.78336;LRBP=13424;MQ0=1;MQ0Fraction=0.0003;MQM=67.745;MQRankSum=2.563;NS=1072;RA=4447;RL=5;RPP=258.66;RR=132;RUN=1;ReadPosRankSum=-14.092;SAB=0.59124;SAF=81;SAP=12.917;SAR=56;SRB=0.54194;SRF=2410;SRP=70.947;SRR=2037;VQSLOD=3.7531;set=filterInVQSR-2of5;sumGLbyD=4.14 +20 41659532 . GC G 40544 PASS AA=42;AB=0.97149;ABA=39;ABP=2644.5;ABR=1329;AC=15;AF=0.0209;AN=716;BL=2531;BR=135;BVAR;BaseQRankSum=-2.537;DEL;DP=12219;Dels=0.00;EL=25;EPP=6.3192;ER=17;FS=2.656;HETAR=374;HOMA=155;HOMR=551;HRun=1;InbreedingCoeff=-0.0270;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.89872;LRBP=4678.9;MQ0=0;MQ0Fraction=0.0000;MQM=103.31;MQRankSum=2.828;NS=1088;RA=4736;RL=41;RPP=85.733;RR=1;RUN=1;ReadPosRankSum=-9.702;SAB=0.57143;SAF=24;SAP=4.8716;SAR=18;SRB=0.5625;SRF=2664;SRP=163.7;SRR=2072;VQSLOD=4.3267;set=Intersection;sumGLbyD=3.22 +20 41845580 . GA G 49310 PASS AA=83;AB=0.95258;ABA=69;ABP=2591.6;ABR=1386;AC=46;AF=0.03740;AN=1230;BL=1320;BR=5150;BVAR;BaseQRankSum=-1.121;DEL;DP=13336;Dels=0.00;EL=36;EPP=6.1759;ER=47;FR;FS=0.372;HETAR=442;HOMA=341;HOMR=295;HP=2;HR=3;HRun=1;HU=G;InbreedingCoeff=0.0238;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.59196;LRBP=4926.2;MQ0=0;MQ0Fraction=0.0000;MQM=89.048;MQRankSum=0.897;NF;NR;NS=1080;PP;RA=3006;RL=5;RPP=142.43;RR=78;RUN=1;ReadPosRankSum=-15.412;SAB=0.55422;SAF=46;SAP=5.1294;SAR=37;SC=CCAGCTGTGGGAGAGAAACAT;SRB=0.47971;SRF=1442;SRP=13.762;SRR=1564;TC;TR=6;TU=AG;VQSLOD=4.4669;set=Intersection;sumGLbyD=3.65 +20 42209428 . GC G 13163 PASS AA=89;AB=0.86677;ABA=83;ABP=730.96;ABR=540;AC=39;AF=0.03218;AN=1212;BL=950;BR=5334;BVAR;BaseQRankSum=-10.119;DEL;DP=10692;Dels=0.01;EL=48;EPP=4.2058;ER=41;FS=0.000;HETAR=259;HOMA=727;HOMR=54;HRun=1;InbreedingCoeff=0.0448;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.69764;LRBP=6644.4;MQ0=0;MQ0Fraction=0.0000;MQM=126.55;MQRankSum=4.223;NS=1040;RA=723;RL=12;RPP=106.09;RR=77;RUN=1;ReadPosRankSum=-17.362;SAB=0.39326;SAF=35;SAP=11.818;SAR=54;SRB=0.37898;SRF=274;SRP=94.99;SRR=449;VQSLOD=3.7157;set=filterInVQSR-2of5;sumGLbyD=3.48 +20 42281109 . T TAG 2321.12 PASS AC=181;AF=0.3740;AN=484;BaseQRankSum=8.977;DP=435;FS=17.001;HRun=0;HaplotypeScore=14.6734;InbreedingCoeff=0.2340;IndelType=INS.NOVEL_2.;MQ=53.88;MQ0=47;MQ0Fraction=0.1080;MQRankSum=0.762;QD=12.41;ReadPosRankSum=3.399;SB=-1299.73;SET_INTEGRATION;VQSLOD=4.8926;set=VQSR +20 42436117 . TC T 38933 PASS AA=18;AB=0.98435;ABA=17;ABP=2215.9;ABR=1069;AC=15;AF=0.01223;AN=1226;BL=498;BR=428;BVAR;BaseQRankSum=-7.224;DEL;DP=12436;Dels=0.00;EL=1;EPP=33.893;ER=17;FS=2.469;HETAR=303;HOMA=614;HOMR=123;HRun=1;InbreedingCoeff=0.0439;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.075594;LRBP=14.501;MQ0=0;MQ0Fraction=0.0000;MQM=98.611;MQRankSum=1.086;NS=1075;RA=1656;RL=10;RPP=3.4928;RR=8;RUN=1;ReadPosRankSum=-17.765;SAB=0.5;SAF=9;SAP=3.0103;SAR=9;SRB=0.49879;SRF=826;SRP=3.0313;SRR=830;VQSLOD=4.0821;set=filterInVQSR-2of5;sumGLbyD=3.04 +20 42682214 . C A,CAT 3904.51 PASS AA=24;AB=0.6383;ABA=17;ABP=10.818;ABR=30;AC=0;AF=0.0000;AN=636;BL=1119;BR=949;BVAR;BaseQRankSum=1.426;DP=6509;Dels=0.00;EL=9;EPP=6.2675;ER=15;FR;HETAR=12;HOMA=3;HOMR=876;HP=2;HPLen=1;HR=1;HRun=0;HU=A;INS;InbreedingCoeff=0.0006;IndelType=MIXED;LEN=2;LRB=0.082205;LRBP=33.356;MQ0Fraction=0.0046;MQM=40.792;MQRankSum=-0.296;NF;NR;NS=891;PP;QD=32.81;RA=2679;RL=15;RPP=6.2675;RR=9;RUN=1;ReadPosRankSum=-1.806;SAB=0.75;SAF=18;SAP=16.039;SAR=6;SB=-924.23;SC=TATACACACACATATATATAC;SET_INTEGRATION;SET_WGVQSR;SRB=0.66293;SRF=1776;SRP=620.76;SRR=903;TC;TR=9;TU=AC;set=filterInVQSR-2of5;sumGLbyD=32.75 +20 42973456 . CA C,CAA,CAAA 2675 PASS AA=90;AB=0.79177;ABA=86;ABP=308.39;ABR=327;AC=77,61,39;AF=0.06492,0.05143,0.03288;AN=1186;BL=2983;BR=4446;BVAR;BaseQRankSum=2.422;DP=9416;Dels=0.03;EL=39;EPP=6.4847;ER=51;FR;FS=31.555;HETAR=75;HOMA=1;HOMR=888;HP=11;HR=11;HRun=11;HU=A;INS;InbreedingCoeff=0.2696;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.19693;LRBP=628.63;MQ0=0;MQ0Fraction=0.0000;MQM=55.567;MQRankSum=1.777;NF;NR;NS=964;PP;RA=3601;RL=37;RPP=9.1869;RR=53;RUN=1;ReadPosRankSum=-4.991;SAB=0.55556;SAF=50;SAP=5.423;SAR=40;SC=TAGTGACTGTCAAAAAAAAAA;SET_WGVQSR;SRB=0.60622;SRF=2183;SRP=355.91;SRR=1418;TC;TR=11;TU=A;VQSLOD=1.0763;set=filterInVQSR-2of5;sumGLbyD=4.05 +20 43091870 . TC T 2455.60 PASS AA=120;AB=0.10619;ABA=101;ABP=155.22;ABR=12;AC=42;AF=0.03825;AN=1098;BL=573;BR=8744;BVAR;BaseQRankSum=-13.513;DEL;DP=9139;Dels=0.00;EL=64;EPP=4.1684;ER=56;FS=9.856;HETAR=118;HOMA=820;HOMR=0;HRun=1;InbreedingCoeff=0.0833;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.877;LRBP=15564;MQ0Fraction=0.0017;MQM=45.1;MQRankSum=2.266;NS=938;RA=24;RL=1;RPP=254.97;RR=119;RUN=1;ReadPosRankSum=-15.803;SAB=0.475;SAF=57;SAP=3.6617;SAR=63;SRB=0.54167;SRF=13;SRP=3.3722;SRR=11;VQSLOD=3.9930;set=filterInVQSR-2of5;sumGLbyD=3.09 +20 43233648 rs74585029 GA G,GAA 1504.40 PASS AA=113;AB=0.78652;ABA=95;ABP=320.31;ABR=350;AC=41,65;AF=0.03394,0.05381;AF1=0.0115;AN=1208;BL=4677;BR=5548;BVAR;BaseQRankSum=6.744;CI95=0.004274,0.01852;DB;DEL;DP=13996;DP4=1736,1549,15,17;Dels=0.03;EL=69;EPP=15.021;ER=44;FQ=14;FR;FS=12.174;HETAR=119;HOMA=15;HOMR=892;HP=11;HPLen=10;HR=10;HRun=10;HU=A;INDEL;InbreedingCoeff=0.2359;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.085183;LRBP=164.12;MQ=89.12;MQ0Fraction=0.0000;MQM=69.867;MQRankSum=2.513;NF;NR;NS=1027;PP;PV4=0.59,1,0.065,0.33;RA=3845;RL=46;RPP=11.485;RR=67;RUN=1;ReadPosRankSum=-4.957;SAB=0.33628;SAF=38;SAP=29.318;SAR=75;SC=AAAACAGCCAGAAAAAAAAAA;SET_INTEGRATION;SET_WGVQSR;SRB=0.43667;SRF=1679;SRP=136.95;SRR=2166;TC;TR=10;TU=A;VQSLOD=4.5121;set=Intersection;sumGLbyD=8.22 +20 43246548 . AC A,CC 41579.13 PASS AA=382;AB=0.72402;ABA=316;ABP=502.11;ABR=829;AC=1197;AF=0.99254;AN=1206;BL=9889;BR=14293;BVAR;BaseQRankSum=1.373;DEL;DP=10477;DS;Dels=0.05;EL=243;EPP=64.494;ER=139;FS=29.162;HETAR=291;HOMA=85;HOMR=624;HPLen=10;InbreedingCoeff=0.1392;IndelType=MIXED;LEN=1;LRB=0.18212;LRBP=1744.6;MQ0Fraction=0.0024;MQM=48.471;MQRankSum=5.726;NS=1001;RA=3138;RL=174;RPP=9.5816;RR=208;RUN=1;ReadPosRankSum=5.755;SAB=0.79843;SAF=305;SAP=298.51;SAR=77;SET_INTEGRATION;SET_WGVQSR;SRB=0.70363;SRF=2208;SRP=1133.2;SRR=930;VQSLOD=5.6318;set=Intersection;sumGLbyD=5.22 +20 43258646 . T TT 1107.17 PASS AC=97;AF=0.08420;AN=1152;BaseQRankSum=4.525;DP=2345;FS=19.308;HRun=9;HaplotypeScore=13.6276;InbreedingCoeff=0.1299;IndelType=INS.NumRepetitions_10orMore.EventLength_1.RepeatExpansion_T.;MQ=76.70;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.395;QD=2.67;ReadPosRankSum=-4.696;SB=-899.41;VQSLOD=5.4523;set=VQSR +20 43718299 . ATTACT A 5497.06 PASS AA=56;AB=0.51818;ABA=53;ABP=3.3262;ABR=57;AC=18;AF=0.0251;AF1=0.03729;AN=718;BL=2321;BR=2591;BVAR;BaseQRankSum=11.142;CI95=0.03319,0.04425;DEL;DP=17576;DP4=2460,2692,31,22;Dels=0.02;EL=28;EPP=3.0103;ER=28;FQ=999;FR;FS=9.689;HETAR=15;HOMA=1;HOMR=1068;HP=2;HPLen=2;HR=2;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0448;IndelType=DEL.NumRepetitions_1.EventLength_5.;LEN=5;LRB=0.054967;LRBP=35.238;MQ=96.55;MQ0=0;MQ0Fraction=0.0000;MQM=50.286;MQRankSum=-5.149;NF;NR;NS=1084;PP;PV4=0.13,1,1.2e-12,1;RA=6745;RL=28;RPP=3.0103;RR=28;RUN=1;ReadPosRankSum=0.828;SAB=0.5;SAF=28;SAP=3.0103;SAR=28;SC=ATGACAGTGGATTACTTTAGT;SET_INTEGRATION;SET_WGVQSR;SRB=0.46835;SRF=3159;SRP=61.709;SRR=3586;TC;TR=2;TU=T;VQSLOD=7.8832;set=Intersection;sumGLbyD=46.60 +20 43981749 . A AAAAAAC,AC 20899.71 PASS ABR=192;AC=91,0;AF=0.1285,0.0000;AN=708;BVAR;BaseQRankSum=7.858;DP=23372;DP4=1554,1457,55,42;Dels=0.00;FR;FS=0.000;HOMA=4;HOMR=995;HP=6;HPLen=7;HR=7;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.2109;IndelType=MULTIALLELIC_INDEL;MQ=95.59;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-12.081;NF;NR;NS=1051;PP;PV4=0.35,1,8.9e-73,1;RA=5027;RUN=1;ReadPosRankSum=-1.359;SC=TACACTAGCAAAAAAACAAAA;SET_WGVQSR;SRB=0.48518;SRF=2439;SRP=12.6;SRR=2588;TC;TR=7;TU=A;VQSLOD=8.0916;set=Intersection;sumGLbyD=54.33 +20 43999274 . TCAAA T 2948.85 PASS AA=59;AB=0.59441;ABA=58;ABP=14.08;ABR=85;AC=20;AF=0.0290;AF1=0.04249;AN=690;BL=2277;BR=2436;BVAR;BaseQRankSum=9.320;CI95=0.0354,0.05088;DEL;DP=14599;DP4=2052,2303,21,22;Dels=0.03;EL=32;EPP=3.9304;ER=27;FQ=999;FR;FS=0.000;HETAR=21;HOMA=0;HOMR=1043;HP=2;HPLen=1;HR=1;HRun=0;HU=C;INDEL;InbreedingCoeff=-0.0037;IndelType=DEL.NumRepetitions_1.EventLength_4.;LEN=4;LRB=0.033736;LRBP=14.658;MQ=90.05;MQ0=0;MQ0Fraction=0.0000;MQM=75.339;MQRankSum=-1.294;NF;NR;NS=1064;PP;PV4=0.88,1,0.0026,1;RA=5732;RL=27;RPP=3.9304;RR=32;RUN=1;ReadPosRankSum=-0.915;SAB=0.47458;SAF=28;SAP=3.3415;SAR=31;SC=GGTACACAGCTCAAACAGTCT;SET_INTEGRATION;SET_WGVQSR;SRB=0.4836;SRF=2772;SRP=16.4;SRR=2960;TC;TR=1;TU=C;VQSLOD=9.8086;set=Intersection;sumGLbyD=27.09 +20 44098622 . C CG 1092.40 PASS AA=129;AB=0.77301;ABA=74;ABP=214.06;ABR=252;AC=45;AF=0.0455;AN=988;BL=6586;BR=3029;BVAR;BaseQRankSum=2.802;DP=5177;Dels=0.00;EL=122;EPP=225.63;ER=7;FR;FS=355.273;HETAR=66;HOMA=11;HOMR=734;HP=6;HR=4;HRun=4;HU=G;INS;InbreedingCoeff=0.1759;IndelType=INS.NumRepetitions_4.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.36994;LRBP=2860.4;MQ0=0;MQ0Fraction=0.0000;MQM=52.395;MQRankSum=1.946;NF;NR;NS=811;PP;RA=1981;RL=121;RPP=217.95;RR=8;RUN=1;ReadPosRankSum=-6.413;SAB=0.99225;SAF=128;SAP=274.51;SAR=1;SC=GCGGAAGTGGCGGGGACCCTT;SRB=0.41242;SRF=817;SRP=135;SRR=1164;TC;TR=4;TU=G;VQSLOD=-2.2690;set=filterInVQSR-2of5;sumGLbyD=4.04 +20 44327637 . A AG,AGGGGGG 14351.23 PASS AC=9,211;AF=0.0103,0.2409;AN=876;BaseQRankSum=15.517;DP=1704;FS=6.768;HaplotypeScore=31.5906;InbreedingCoeff=0.1538;IndelType=MULTIALLELIC_INDEL;MQ=54.64;MQ0=4;MQ0Fraction=0.0023;MQRankSum=-12.691;QD=20.83;ReadPosRankSum=-3.583;SB=-6278.99;VQSLOD=5.1556;set=VQSR +20 45202636 . GA G 13269 PASS AA=25;AB=0.96162;ABA=18;ABP=871.09;ABR=451;AC=24;AF=0.02013;AN=1192;BL=567;BR=1728;BVAR;BaseQRankSum=-5.361;DEL;DP=10873;Dels=0.00;EL=10;EPP=5.1818;ER=15;FS=0.928;HETAR=169;HOMA=831;HOMR=45;HRun=1;InbreedingCoeff=0.0999;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.50588;LRBP=1278.4;MQ0=0;MQ0Fraction=0.0000;MQM=170.56;MQRankSum=0.161;NS=1049;RA=632;RL=2;RPP=41.315;RR=23;RUN=1;ReadPosRankSum=-14.760;SAB=0.68;SAF=17;SAP=10.046;SAR=8;SRB=0.51424;SRF=325;SRP=4.1235;SRR=307;VQSLOD=3.9290;set=filterInVQSR-2of5;sumGLbyD=3.90 +20 45417828 . TGAGC T,TGC 4672.90 PASS ABR=317;AC=69,104;AF=0.05712,0.08609;BVAR;BaseQRankSum=18.527;DEL;DP=11835;DS;FS=184.873;HOMA=48;HOMR=575;HaplotypeScore=65.5875;InbreedingCoeff=0.0599;IndelType=MULTIALLELIC_INDEL;MQ=29.78;MQ0=2988;MQ0Fraction=0.3629;MQRankSum=5.052;NS=713;QD=1.11;RA=1581;RUN=1;ReadPosRankSum=6.574;SB=-2116.87;SRB=0.47502;SRF=751;SRP=11.582;SRR=830;VQSLOD=0.0651;set=filterInVQSR-2of5 +20 45525657 rs66759083 TA AA,T 49315 PASS AA=2361;AB=0.45241;ABA=1398;ABP=53.235;ABR=1155;AC=20;AF=0.01701;AN=1176;BL=94913;BR=100886;BVAR;BaseQRankSum=0.740;DB;DEL;DP=30636;DP4=1258,881,1206,999;Dels=0.48;EL=1133;EPP=11.311;ER=1228;FQ=999;FR;FS=7.072;HETAR=503;HOMA=310;HOMR=218;HP=6;HPLen=7;HR=7;HU=T;INDEL;InbreedingCoeff=0.2271;IndelType=MIXED;LEN=1;LRB=0.030506;LRBP=398.68;MQ=102.24;MQ0=0;MQ0Fraction=0.0000;MQM=75.359;MQRankSum=0.148;NF;NR;NS=1031;PP;PV4=0.0064,0,4.6e-23,0.47;RA=2042;RL=1183;RPP=3.0333;RR=1178;RUN=1;ReadPosRankSum=-2.999;SAB=0.52139;SAF=1231;SAP=12.392;SAR=1130;SC=AGGATTTTTTTAAAAAGTTTT;SET_INTEGRATION;SET_WGVQSR;SRB=0.55093;SRF=1125;SRP=49.017;SRR=917;TC;TR=7;TU=T;VQSLOD=7.1651;dbSNP=114;set=Intersection;sumGLbyD=18.51 +20 45783456 . T TG 2355.68 PASS AA=64;AB=0.78521;ABA=61;ABP=203.67;ABR=223;AC=15;AF=0.0165;AN=910;BL=815;BR=5486;BVAR;BaseQRankSum=8.593;DP=10348;Dels=0.00;EL=48;EPP=37.754;ER=16;FS=77.861;HETAR=56;HOMA=1;HOMR=970;HRun=1;INS;InbreedingCoeff=-0.0549;IndelType=INS.NOVEL_1.Novel_G.;LEN=1;LRB=0.74131;LRBP=7522.1;MQ0Fraction=0.0122;MQM=44.562;MQRankSum=-1.258;NS=1027;RA=4750;RL=0;RPP=141.98;RR=64;RUN=1;ReadPosRankSum=-7.047;SAB=0.25;SAF=16;SAP=37.754;SAR=48;SRB=0.6;SRF=2850;SRP=415.59;SRR=1900;VQSLOD=1.3146;set=filterInVQSR-2of5;sumGLbyD=6.03 +20 46517110 . C CT 868.55 PASS AC=15;AF=0.0218;AN=688;BaseQRankSum=8.522;DP=1752;FS=6.570;HRun=0;HaplotypeScore=14.9548;InbreedingCoeff=0.0452;IndelType=INS.NOVEL_1.Novel_T.;MQ=77.73;MQ0=0;MQ0Fraction=0.0000;MQRankSum=3.874;QD=10.98;ReadPosRankSum=-0.733;SB=-396.78;SET_INTEGRATION;SET_WGVQSR;VQSLOD=6.7740;set=VQSR +20 46629361 . TTTCTTTC T,TTTTC 13000.91 PASS AC=188,107;AF=0.2212,0.1259;AN=850;BaseQRankSum=7.214;DP=1846;FS=14.502;HaplotypeScore=40.8481;InbreedingCoeff=0.3210;IndelType=MULTIALLELIC_INDEL;MQ=50.74;MQ0=79;MQ0Fraction=0.0428;MQRankSum=-6.348;QD=13.59;ReadPosRankSum=3.943;SB=-3581.20;VQSLOD=5.9412;set=VQSR +20 46951099 . G GT 1662.30 PASS AA=55;AB=0.7713;ABA=51;ABP=145.58;ABR=172;AC=47;AF=0.03923;AN=1198;BL=3288;BR=2434;BVAR;BaseQRankSum=-4.014;DP=27423;DP4=1483,1590,58,42;Dels=0.01;EL=21;EPP=9.6826;ER=34;FR;FS=9.565;HETAR=48;HOMA=0;HOMR=913;HP=16;HPLen=10;HR=10;HRun=10;HU=T;INDEL;INS;InbreedingCoeff=0.0952;IndelType=INS.NumRepetitions_10orMore.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.14925;LRBP=279.78;MQ=70.36;MQ0Fraction=0.0124;MQM=52.545;MQRankSum=0.717;NF;NR;NS=961;PP;PV4=0.067,1,1,0.17;RA=3035;RL=38;RPP=20.422;RR=17;RUN=1;ReadPosRankSum=-3.014;SAB=0.47273;SAF=26;SAP=3.3656;SAR=29;SC=TTTGTTTTTTGTTTTTTTTTT;SET_INTEGRATION;SET_WGVQSR;SRB=0.36013;SRF=1093;SRP=518.73;SRR=1942;TC;TR=10;TU=T;VQSLOD=5.4779;set=Intersection;sumGLbyD=3.49 +20 47201076 rs58052846 C CT 982.16 PASS AC=50;AF=0.0551;AN=908;BaseQRankSum=12.598;DB;DP=2449;FS=35.648;HRun=0;HaplotypeScore=29.4602;InbreedingCoeff=-0.0542;IndelType=INS.NOVEL_1.Novel_T.;MQ=63.54;MQ0=0;MQ0Fraction=0.0000;MQRankSum=2.196;QD=3.16;ReadPosRankSum=-13.833;SB=-488.19;VQSLOD=6.0429;set=VQSR +20 47965974 rs60011158 G GA 999 PASS AA=21;AB=0.57143;ABA=21;ABP=5.1818;ABR=28;AC=7;AF=0.0101;AF1=0.02061;AN=690;BL=1043;BR=577;BVAR;BaseQRankSum=-3.087;CI95=0.01549,0.02655;DB;DP=14578;DP4=1554,3055,6,17;Dels=0.00;EL=11;EPP=3.1137;ER=10;FQ=999;FR;FS=5.982;HETAR=7;HOMA=0;HOMR=1041;HP=2;HPLen=1;HR=1;HRun=1;HU=A;INDEL;INS;InbreedingCoeff=0.0356;IndelType=INS.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.28765;LRBP=294.09;MQ=80.17;MQ0=0;MQ0Fraction=0.0000;MQM=64.19;MQRankSum=2.137;NF;NR;NS=1048;PP;PV4=0.51,1,1,1;RA=5224;RL=16;RPP=15.522;RR=5;RUN=1;ReadPosRankSum=0.236;SAB=0.38095;SAF=8;SAP=5.5954;SAR=13;SC=TTCATGTACAGAGCTGCTGTG;SET_INTEGRATION;SET_WGVQSR;SRB=0.31183;SRF=1629;SRP=1609.6;SRR=3595;TC;TR=4;TU=AG;VQSLOD=9.5466;dbSNP=129;set=Intersection;sumGLbyD=13.83 +20 48402974 rs57331436 GA G 27741 PASS AA=401;AB=0.5372;ABA=311;ABP=11.089;ABR=361;AC=84;AF=0.1186;AN=708;BL=16591;BR=14776;BVAR;BaseQRankSum=14.621;DB;DEL;DP=30607;DP4=1928,2310,195,225;Dels=0.11;EL=189;EPP=5.8749;ER=212;FQ=999;FR;FS=15.568;HETAR=110;HOMA=30;HOMR=923;HP=4;HPLen=3;HR=1;HRun=3;HU=A;INDEL;InbreedingCoeff=0.1263;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;KGPilot123;LEN=1;LRB=0.057863;LRBP=231.06;MQ=106.68;MQ0=0;MQ0Fraction=0.0000;MQM=63.005;MQRankSum=-2.010;NF;NR;NS=1063;PP;PV4=0.72,1,0.001,1;RA=5258;RL=223;RPP=13.976;RR=178;RUN=1;ReadPosRankSum=1.337;SAB=0.37656;SAF=151;SAP=56.084;SAR=250;SC=TGCCCTCAAAGAGAAAAAGGA;SET_INTEGRATION;SET_WGVQSR;SRB=0.38075;SRF=2002;SRP=652.44;SRR=3256;TC;TR=5;TU=AG;VQSLOD=8.7259;dbSNP=132;set=Intersection;sumGLbyD=15.86 +20 49101936 . C CT 404.46 PASS AC=40;AF=0.03559;AN=1124;BaseQRankSum=0.750;DP=2162;FS=14.291;HRun=2;HaplotypeScore=30.9513;InbreedingCoeff=-0.0082;IndelType=INS.NumRepetitions_2.EventLength_1.RepeatExpansion_T.;MQ=49.78;MQ0=113;MQ0Fraction=0.0523;MQRankSum=-1.289;QD=1.94;ReadPosRankSum=-2.041;SB=-385.48;VQSLOD=4.6365;set=VQSR +20 49731218 . ATTTTATTTTTTATT A,ATTTTATT 8398.93 PASS AF=0.0656,0.0156;AF1=0.0996;BaseQRankSum=13.996;CI95=0.07743,0.1239;DP=6308;DP4=951,1311,23,35;Dels=0.05;FQ=999;FR;FS=12.503;HP=7;HPLen=4;HR=4;HRun=0;HU=T;INDEL;InbreedingCoeff=0.1892;IndelType=MULTIALLELIC_INDEL;MQ=57.61;MQ0Fraction=0.0145;MQRankSum=-5.208;NF;NR;PP;PV4=0.79,1,6.3e-06,0.16;ReadPosRankSum=-2.239;SC=TATTTTATTTATTTTATTTTT;TC;TR=11;TU=ATTT;VQSLOD=4.3191;set=Intersection;sumGLbyD=42.27 +20 49894989 . TA T 172.25 PASS AF=0.0140;BaseQRankSum=7.220;DP=3882;Dels=0.00;FS=17.217;HPLen=2;HRun=1;InbreedingCoeff=0.0531;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;MQ0Fraction=0.0214;MQRankSum=-0.661;ReadPosRankSum=-0.592;SET_INTEGRATION;SET_WGVQSR;VQSLOD=3.0905;set=filterInVQSR-2of5;sumGLbyD=6.60 +20 50010923 rs66516522 C CT,CTGG 35851 PASS ABR=555;AC=310,11;AF=0.26451,0.00939;BVAR;BaseQRankSum=10.662;DB;DP=8188;FR;FS=34.411;HOMA=261;HOMR=399;HP=5;HR=6;HU=C;HaplotypeScore=45.1715;INS;InbreedingCoeff=0.2090;IndelType=MULTIALLELIC_INDEL;MQ=72.80;MQ0=0;MQ0Fraction=0.0000;MQRankSum=9.015;NF;NR;NS=831;PP;QD=9.69;RA=1986;RUN=1;ReadPosRankSum=-24.284;SB=-6038.55;SC=TGTCTGTCCCCCCTCAGCACT;SRB=0.45972;SRF=913;SRP=31.001;SRR=1073;TC;TR=6;TU=C;VQSLOD=6.1824;set=Intersection +20 50228709 rs71192536 TG T 20517 PASS AA=924;AB=0.50203;ABA=735;ABP=3.0633;ABR=741;AC=200;AF=0.16502;AN=1212;BL=35460;BR=34197;BVAR;BaseQRankSum=13.810;DB;DEL;DP=32402;DP4=1760,2065,395,449;Dels=0.16;EL=439;EPP=7.9831;ER=485;FQ=999;FR;FS=0.558;HETAR=242;HOMA=63;HOMR=764;HP=5;HPLen=3;HR=3;HRun=3;HU=G;INDEL;InbreedingCoeff=0.1050;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.018132;LRBP=52.738;MQ=105.83;MQ0=0;MQ0Fraction=0.0000;MQM=75.87;MQRankSum=3.895;NF;NR;NS=1069;PP;PV4=0.7,1.5e-173,1,1;RA=4708;RL=486;RPP=8.4249;RR=438;RUN=1;ReadPosRankSum=1.586;SAB=0.43615;SAF=403;SAP=35.733;SAR=521;SC=GTTTTCCAGGTGGGAAGACCG;SET_INTEGRATION;SET_WGVQSR;SRB=0.44074;SRF=2075;SRP=146.62;SRR=2633;TC;TR=3;TU=G;VQSLOD=10.4820;dbSNP=120;set=Intersection;sumGLbyD=15.35 +20 50236115 . AGG A,ACGGG,AG,AGGG 7429.57 PASS AC=192,13,221,183;AF=0.2115,0.0143,0.2434,0.2015;AN=908;BaseQRankSum=1.045;DP=1177;FS=13.479;HaplotypeScore=11.8294;InbreedingCoeff=0.7959;IndelType=MULTIALLELIC_INDEL;MQ=52.98;MQ0=6;MQ0Fraction=0.0051;MQRankSum=-1.482;QD=7.28;ReadPosRankSum=-2.380;SB=-1229.31;SET_WGVQSR;VQSLOD=8.3762;set=VQSR +20 51589568 . TAAAC AAAAC,T 12477.52 PASS AF=0.27949;BaseQRankSum=-28.122;DP=3777;Dels=0.00;FR;FS=31.799;HP=7;HPLen=4;HR=3;HRun=0;HU=A;InbreedingCoeff=-0.1429;IndelType=MIXED;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.196;NF;NR;PP;ReadPosRankSum=-16.483;SC=AAATTCAAAATAAACAAACAA;SET_INTEGRATION;SET_WGVQSR;TC;TR=18;TU=AAAC;VQSLOD=3.9201;set=filterInVQSR-2of5;sumGLbyD=52.43 +20 51617742 . TGC T,TGCGC 1374.91 PASS AF=0.06000,0.02000;BaseQRankSum=12.051;DP=6231;Dels=0.00;FS=189.609;HPLen=1;HRun=0;InbreedingCoeff=0.0862;IndelType=MULTIALLELIC_INDEL;MQ0Fraction=0.0180;MQRankSum=-2.959;ReadPosRankSum=-5.090;VQSLOD=-2.8715;set=filterInVQSR-2of5;sumGLbyD=3.97 +20 51770354 . AG A 1010.90 PASS AA=26;AB=0.52727;ABA=26;ABP=3.3656;ABR=29;AC=7;AF=0.0097;AF1=0.01637;AN=718;BL=1034;BR=964;BVAR;BaseQRankSum=5.588;CI95=0.01327,0.02212;DEL;DP=16259;DP4=2785,2239,15,10;Dels=0.01;EL=11;EPP=4.3466;ER=15;FQ=999;FR;FS=3.367;HETAR=8;HOMA=0;HOMR=1064;HP=2;HPLen=2;HR=2;HRun=2;HU=G;INDEL;InbreedingCoeff=0.0557;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.035035;LRBP=8.3357;MQ=90.48;MQ0=0;MQ0Fraction=0.0000;MQM=61.346;MQRankSum=-0.019;NF;NR;NS=1072;PP;PV4=0.69,2.1e-08,0.078,1;RA=6173;RL=13;RPP=3.0103;RR=13;RUN=1;ReadPosRankSum=-0.460;SAB=0.61538;SAF=16;SAP=6.017;SAR=10;SC=GTGGTCCTGCAGGTCAATAAT;SET_INTEGRATION;SET_WGVQSR;SRB=0.56342;SRF=3478;SRP=218.68;SRR=2695;TC;TR=2;TU=G;VQSLOD=10.1601;set=Intersection;sumGLbyD=14.60 +20 51848430 . AT A,ATT 999 PASS AA=39;AB=0.83408;ABA=37;ABP=219.19;ABR=186;AC=14,33;AF=0.0153,0.0359;AF1=0.03062;AN=918;BL=1676;BR=1732;BVAR;BaseQRankSum=3.338;CI95=0.02212,0.03982;DP=14886;DP4=1970,1762,22,31;Dels=0.01;EL=18;EPP=3.5114;ER=21;FQ=999;FR;FS=3.004;HETAR=31;HOMA=0;HOMR=1040;HP=10;HPLen=9;HR=9;HRun=9;HU=T;INDEL;INS;InbreedingCoeff=0.1629;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.016432;LRBP=5.0085;MQ=80.05;MQ0=0;MQ0Fraction=0.0000;MQM=56.667;MQRankSum=0.325;NF;NR;NS=1071;PP;PV4=0.13,1,0.0095,0.064;RA=5318;RL=21;RPP=3.5114;RR=18;RUN=1;ReadPosRankSum=-0.493;SAB=0.46154;SAF=18;SAP=3.5114;SAR=21;SC=ACAAAACAATATTTTTTTTTC;SET_WGVQSR;SRB=0.4968;SRF=2642;SRP=3.4823;SRR=2676;TC;TR=9;TU=T;VQSLOD=5.7417;set=Intersection;sumGLbyD=7.57 +20 51897203 . T TG 8427.20 PASS AA=237;AB=0.69846;ABA=215;ABP=246.92;ABR=498;AC=117;AF=0.1662;AN=704;BL=14961;BR=5990;BVAR;BaseQRankSum=22.203;DP=9710;Dels=0.00;EL=83;EPP=49.198;ER=154;FR;FS=9.450;HETAR=123;HOMA=9;HOMR=895;HP=5;HPLen=6;HR=6;HRun=0;HU=T;INS;InbreedingCoeff=-0.0513;IndelType=INS.NOVEL_1.Novel_G.;LEN=1;LRB=0.42819;LRBP=8344.3;MQ0Fraction=0.0291;MQM=45.861;MQRankSum=-10.426;NF;NR;NS=1027;PP;RA=4919;RL=210;RPP=309.85;RR=27;RUN=1;ReadPosRankSum=-1.843;SAB=0.29536;SAF=70;SAP=89.219;SAR=167;SC=TTTGTTTGTTTTTTGTTGTTG;SET_INTEGRATION;SET_WGVQSR;SRB=0.47794;SRF=2351;SRP=23.798;SRR=2568;TC;TR=23;TU=GTTT;VQSLOD=6.2670;set=Intersection;sumGLbyD=8.99 +20 52274070 . AAG A 1400.37 PASS AA=30;AB=0.74227;ABA=25;ABP=52.462;ABR=72;AC=21;AF=0.01756;AN=1196;BL=412;BR=1966;BVAR;BaseQRankSum=6.660;DEL;DP=9362;Dels=0.01;EL=16;EPP=3.2998;ER=14;FS=1.485;HETAR=18;HOMA=2;HOMR=1004;HRun=0;InbreedingCoeff=0.0317;IndelType=DEL.NumRepetitions_1.EventLength_2.RepeatExpansion_AG.;LEN=2;LRB=0.65349;LRBP=2208.2;MQ0Fraction=0.0022;MQM=46.133;MQRankSum=-4.743;NS=1024;RA=3931;RL=2;RPP=51.941;RR=28;RUN=1;ReadPosRankSum=-4.152;SAB=0.4;SAF=12;SAP=5.6161;SAR=18;SET_INTEGRATION;SET_WGVQSR;SRB=0.49784;SRF=1957;SRP=3.1699;SRR=1974;VQSLOD=5.6452;set=Intersection;sumGLbyD=11.11 +20 52351501 . TAC T 199.59 PASS AC=22;AF=0.0238;AN=926;BaseQRankSum=7.874;DP=22911;DP4=2146,1691,26,22;FR;FS=2.898;HP=4;HPLen=3;HR=1;HRun=0;HU=A;HaplotypeScore=18.6111;INDEL;InbreedingCoeff=-0.0326;IndelType=DEL.NumRepetitions_6.EventLength_2.RepeatExpansion_AC.;MQ0=2;MQ0Fraction=0.0007;MQRankSum=1.011;NF;NR;PP;PV4=0.88,0.14,0.16,0.24;QD=1.10;ReadPosRankSum=-1.053;SB=-306.09;SC=GACACACAAATACACACACAC;SET_INTEGRATION;SET_WGVQSR;TC;TR=13;TU=AC;VQSLOD=4.0486;set=filterInVQSR-2of5 +20 52447173 . CA C 503.89 PASS AC=23;AF=0.01891;AN=1216;BaseQRankSum=0.801;DP=3266;FS=2.606;HRun=2;HaplotypeScore=22.1543;InbreedingCoeff=-0.0097;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_A.;MQ=118.02;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-1.309;QD=2.65;ReadPosRankSum=-7.872;SB=-279.27;VQSLOD=4.1900;set=VQSR +20 52498650 . GT G 24069 PASS AA=74;AB=0.90594;ABA=57;ABP=870.4;ABR=549;AC=28;AF=0.02333;AN=1200;BL=505;BR=4514;BVAR;BaseQRankSum=-3.837;DEL;DP=9798;Dels=0.01;EL=41;EPP=4.8883;ER=33;FS=4.085;HETAR=209;HOMA=663;HOMR=121;HRun=1;InbreedingCoeff=0.0334;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.79876;LRBP=6956.6;MQ0=2;MQ0Fraction=0.0007;MQM=57.784;MQRankSum=-2.951;NS=995;RA=957;RL=8;RPP=101.72;RR=66;RUN=1;ReadPosRankSum=-14.806;SAB=0.39189;SAF=29;SAP=10.522;SAR=45;SRB=0.39916;SRF=382;SRP=87.53;SRR=575;VQSLOD=3.8710;set=filterInVQSR-2of5;sumGLbyD=2.90 +20 52823602 rs11469056 CAAA C,CA,CAA,CAAAA,CAAAAA,CAAAAAA,CAAAAAAA,CAAAAAAAA,CAAAAAAAAA,CAAAAAAAAAA 14515.17 PASS AC=24,83,246,109,83,19,10,16,22,59;AF=0.02128,0.07358,0.21809,0.09663,0.07358,0.01684,0.00887,0.01418,0.01950,0.05230;AN=1128;BVAR;BaseQRankSum=4.150;DB;DEL;DP=28279;FR;FS=2.021;HP=17;HR=17;HU=A;HaplotypeScore=27.8032;INS;InbreedingCoeff=0.7740;IndelType=MULTIALLELIC_INDEL;MQ=69.00;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.418;NF;NR;PP;QD=7.90;RUN=1;ReadPosRankSum=-3.864;SB=-3244.40;SC=GGTCCTAAGGCAAAAAAAAAA;SET_WGVQSR;TC;TR=17;TU=A;VQSLOD=14.1033;set=Intersection +20 53308906 . CT C,CTT 2276 PASS AA=92;AB=0.84453;ABA=81;ABP=540.17;ABR=440;AC=53,81;AF=0.04351,0.06650;AN=1218;BL=3561;BR=4796;BVAR;BaseQRankSum=3.000;DP=11804;Dels=0.02;EL=48;EPP=3.3879;ER=44;FR;FS=13.197;HETAR=69;HOMA=3;HOMR=993;HP=11;HR=10;HRun=10;HU=T;INS;InbreedingCoeff=0.2297;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.14778;LRBP=399.32;MQ0=1;MQ0Fraction=0.0003;MQM=56.348;MQRankSum=3.154;NF;NR;NS=1065;PP;RA=5520;RL=39;RPP=7.6365;RR=53;RUN=1;ReadPosRankSum=-2.140;SAB=0.57609;SAF=53;SAP=7.6365;SAR=39;SC=AATCCAAAGTCTTTTTTTTTT;SET_WGVQSR;SRB=0.51576;SRF=2847;SRP=14.92;SRR=2673;TC;TR=10;TU=T;VQSLOD=2.4753;set=filterInVQSR-2of5;sumGLbyD=4.42 +20 53334602 . T TG,TGG 905.13 PASS ABR=325;AC=44,22;AF=0.03624,0.01812;BVAR;BaseQRankSum=-4.608;DP=15015;FR;FS=494.901;HOMA=0;HOMR=1004;HP=1;HR=1;HU=G;HaplotypeScore=20.5023;INS;InbreedingCoeff=0.0799;IndelType=MULTIALLELIC_INDEL;MQ=116.70;MQ0=0;MQ0Fraction=0.0000;MQRankSum=8.022;NF;NR;NS=1064;PP;QD=0.35;RA=5690;RUN=1;ReadPosRankSum=-14.522;SB=-311.57;SC=AGCCATTGGCTGTTTCACTGA;SRB=0.40738;SRF=2318;SRP=426.97;SRR=3372;TC;TR=1;TU=G;VQSLOD=-2.3042;set=filterInVQSR-2of5 +20 53729115 . T TG 15.48 PASS AC=1;AF=0.0015;AN=668;BaseQRankSum=-1.001;DP=1711;FS=9.048;HRun=2;HaplotypeScore=12.4681;InbreedingCoeff=-0.0320;IndelType=INS.NumRepetitions_2.EventLength_1.RepeatExpansion_G.;MQ=131.36;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.193;QD=4.57;ReadPosRankSum=0.407;SB=-5.35;SET_INTEGRATION;SET_WGVQSR;VQSLOD=4.8071;set=VQSR +20 54033830 . GTATTTTAAAATCA G 2220.86 PASS AF=0.0113;BaseQRankSum=5.506;DP=2577;Dels=0.01;FR;FS=6.533;HP=5;HPLen=4;HR=1;HRun=0;HU=T;InbreedingCoeff=0.0032;IndelType=DEL.NumRepetitions_1.EventLength_10orMore.;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.969;NF;NR;PP;ReadPosRankSum=1.322;SC=TCAATATTTTGTATTTTAAAA;SET_INTEGRATION;SET_WGVQSR;TC;TR=1;TU=T;VQSLOD=5.5145;set=Intersection;sumGLbyD=95.65 +20 54375236 . GT G 626.13 PASS AA=40;AB=0.63551;ABA=39;ABP=20.078;ABR=68;AC=18;AF=0.0256;AN=702;BL=1331;BR=1743;BVAR;BaseQRankSum=9.346;DEL;DP=8568;Dels=0.02;EL=26;EPP=10.828;ER=14;FS=0.610;HETAR=21;HOMA=1;HOMR=1035;HRun=1;InbreedingCoeff=-0.0056;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.13403;LRBP=122.92;MQ0=0;MQ0Fraction=0.0000;MQM=67.125;MQRankSum=-2.537;NS=1058;RA=4870;RL=17;RPP=4.9646;RR=23;RUN=1;ReadPosRankSum=-1.229;SAB=0.525;SAF=21;SAP=3.2274;SAR=19;SET_INTEGRATION;SET_WGVQSR;SRB=0.5271;SRF=2567;SRP=34.087;SRR=2303;VQSLOD=7.9228;set=Intersection;sumGLbyD=10.77 +20 54457331 . G GA 1793.40 PASS AA=77;AB=0.66667;ABA=74;ABP=56.573;ABR=148;AC=33;AF=0.02687;AN=1228;BL=3834;BR=1154;BVAR;BaseQRankSum=10.572;DP=10230;Dels=0.00;EL=77;EPP=170.21;ER=0;FS=139.433;HETAR=44;HOMA=1;HOMR=1001;HRun=1;INS;InbreedingCoeff=0.0023;IndelType=INS.NOVEL_1.Novel_A.;LEN=1;LRB=0.53729;LRBP=3129.8;MQ0Fraction=0.0095;MQM=4.7013;MQRankSum=-8.116;NS=1046;RA=4009;RL=77;RPP=170.21;RR=0;RUN=1;ReadPosRankSum=-6.026;SAB=1;SAF=77;SAP=170.21;SAR=0;SRB=0.57022;SRF=2286;SRP=174.7;SRR=1723;VQSLOD=1.1887;set=filterInVQSR-2of5;sumGLbyD=5.90 +20 54469810 . CA C 1697.62 PASS AA=93;AB=0.63855;ABA=90;ABP=44.53;ABR=159;AC=34;AF=0.0374;AF1=0.01719;AN=908;BL=3242;BR=5839;BVAR;BaseQRankSum=10.425;CI95=0.009317,0.02795;DEL;DP=15197;DP4=2134,1896,56,46;Dels=0.03;EL=34;EPP=17.604;ER=59;FQ=16;FR;FS=9.985;HETAR=41;HOMA=1;HOMR=1011;HP=9;HPLen=8;HR=8;HRun=8;HU=A;INDEL;InbreedingCoeff=-0.0472;IndelType=DEL.NumRepetitions_8.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.28598;LRBP=1615.8;MQ=83.37;MQ0=1;MQ0Fraction=0.0004;MQM=64.075;MQRankSum=3.036;NF;NR;NS=1053;PP;PV4=0.76,1,0.31,0.22;RA=5150;RL=28;RPP=34.975;RR=65;RUN=1;ReadPosRankSum=-0.252;SAB=0.5914;SAF=55;SAP=9.7582;SAR=38;SC=ATTGCTAAGACAAAAAAAAGA;SET_INTEGRATION;SET_WGVQSR;SRB=0.50621;SRF=2607;SRP=4.7374;SRR=2543;TC;TR=8;TU=A;VQSLOD=8.3677;set=Intersection;sumGLbyD=9.90 +20 54542453 . GTATA G,GTA 5109.66 PASS ABR=112;AC=66,56;AF=0.0682,0.0579;AN=968;BVAR;BaseQRankSum=17.089;DB;DEL;DP=5519;DS;Dels=0.06;FS=99.502;HOMA=15;HOMR=409;HRun=0;InbreedingCoeff=0.1584;IndelType=MULTIALLELIC_INDEL;MQ0Fraction=0.0178;MQRankSum=-6.854;NS=460;RA=864;RUN=1;ReadPosRankSum=0.855;SRB=0.79282;SRF=685;SRP=646.5;SRR=179;VQSLOD=0.6375;set=filterInVQSR-2of5;sumGLbyD=8.53 +20 54629773 . CA C 1799.50 PASS AA=49;AB=0.82707;ABA=46;ABP=250.17;ABR=220;AC=9;AF=0.00746;AN=1206;BL=173;BR=2277;BVAR;BaseQRankSum=5.240;DEL;DP=8557;Dels=0.01;EL=49;EPP=109.41;ER=0;FS=32.359;HETAR=35;HOMA=1;HOMR=325;HRun=1;InbreedingCoeff=0.0892;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_A.;LEN=1;LRB=0.85878;LRBP=3926.6;MQ0Fraction=0.0602;MQM=32.163;MQRankSum=-3.926;NS=361;RA=1091;RL=0;RPP=109.41;RR=49;RUN=1;ReadPosRankSum=-4.512;SAB=0;SAF=0;SAP=109.41;SAR=49;SRB=0.49404;SRF=539;SRP=3.3467;SRR=552;VQSLOD=1.1233;set=filterInVQSR-2of5;sumGLbyD=3.54 +20 54710245 . TA T 999 PASS AF=0.0084;AF1=0.0148;BaseQRankSum=3.954;CI95=0.00885,0.02212;DP=8043;DP4=2000,1849,10,7;Dels=0.01;FQ=999;FR;FS=0.000;HP=9;HPLen=6;HR=3;HRun=6;HU=A;INDEL;InbreedingCoeff=0.1181;IndelType=DEL.NumRepetitions_3.EventLength_1.RepeatExpansion_A.;MQ=78.51;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.095;NF;NR;PP;PV4=0.63,0.00056,1,1;ReadPosRankSum=-0.448;SC=CAACAAAAAATAAATAAATAA;SET_INTEGRATION;SET_WGVQSR;TC;TR=15;TU=AAAT;VQSLOD=7.8129;set=Intersection;sumGLbyD=19.02 +20 54968173 . A AAT,AATAT,AT,ATAT 89535.82 PASS ABR=994;AC=561,278,2,3;AF=0.50179,0.24866,0.00179,0.00268;AN=1118;BVAR;BaseQRankSum=-2.699;DB;DP=27837;DP4=168,177,1045,866;Dels=0.00;FQ=999;FR;FS=12.472;HOMA=71;HOMR=455;HP=3;HPLen=4;HR=4;HRun=0;HU=A;INDEL;INS;InbreedingCoeff=0.6391;IndelType=MULTIALLELIC_INDEL;KGPilot123;MQ=80.36;MQ0Fraction=0.0055;MQRankSum=-1.512;NF;NR;NS=913;PP;PV4=0.046,1,1,1;RA=2015;RUN=1;ReadPosRankSum=1.015;SC=GGCCACTTAAAATATATATAT;SET_WGVQSR;SRB=0.44864;SRF=904;SRP=49.187;SRR=1111;TC;TR=15;TU=AT;VQSLOD=9.0092;dbSNP=132;set=Intersection;sumGLbyD=42.33 +20 55176688 . TA T 421.84 PASS AF=0.01322;AF1=0.01845;BaseQRankSum=5.383;CI95=0.01282,0.02564;DP=10531;DP4=1975,2017,16,14;Dels=0.01;FQ=91.2;FR;FS=7.401;HP=6;HPLen=5;HR=5;HRun=5;HU=A;INDEL;InbreedingCoeff=0.0829;IndelType=DEL.NumRepetitions_5.EventLength_1.RepeatExpansion_A.;MQ=75.80;MQ0=1;MQ0Fraction=0.0003;MQRankSum=-0.471;NF;NR;PP;PV4=0.72,1,1,1;ReadPosRankSum=0.223;SC=CTGCAAAATATAAAAATTAGG;SET_INTEGRATION;SET_WGVQSR;TC;TR=5;TU=A;VQSLOD=6.6000;set=Intersection;sumGLbyD=12.15 +20 55664086 . GTT ATT,G,GT,GTTT 5622.44 PASS AC=6,71,136;AF=0.00498,0.05887,0.11277;AN=1206;BVAR;BaseQRankSum=3.173;DB;DEL;DP=40384;DP4=1567,1317,54,29;Dels=0.05;FR;FS=1.949;HP=14;HR=11;HRun=11;HU=T;INDEL;INS;InbreedingCoeff=0.3490;IndelType=MIXED;MQ=77.90;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.052;NF;NR;PP;PV4=0.057,1,0.2,1.2e-05;RUN=1;ReadPosRankSum=-13.646;SC=AATTTTATTTGTTTTTTTTTT;SET_INTEGRATION;SET_WGVQSR;TC;TR=11;TU=T;VQSLOD=11.7964;set=Intersection;sumGLbyD=8.09 +20 56045006 . TG T 342.15 PASS AC=72;AF=0.0940;AN=766;BaseQRankSum=4.992;DP=1238;FS=1.460;HRun=7;HaplotypeScore=20.2784;InbreedingCoeff=0.1795;IndelType=DEL.NumRepetitions_7.EventLength_1.RepeatExpansion_G.;MQ=66.42;MQ0=1;MQ0Fraction=0.0008;MQRankSum=-0.937;QD=1.84;ReadPosRankSum=-4.385;SB=-320.83;VQSLOD=5.2383;set=VQSR +20 56158711 . AG A 922.47 PASS AA=18;AB=0.575;ABA=17;ABP=4.9646;ABR=23;AC=2;AF=0.0028;AN=714;BL=953;BR=808;BVAR;BaseQRankSum=3.129;DEL;DP=10462;Dels=0.01;EL=9;EPP=3.0103;ER=9;FR;FS=8.724;HETAR=4;HOMA=0;HOMR=1058;HP=1;HPLen=2;HR=2;HRun=1;HU=A;InbreedingCoeff=0.0262;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.08234;LRBP=28.936;MQ0=0;MQ0Fraction=0.0000;MQM=55.889;MQRankSum=2.052;NF;NR;NS=1062;PP;RA=6300;RL=9;RPP=3.0103;RR=9;RUN=1;ReadPosRankSum=-0.317;SAB=0.66667;SAF=12;SAP=7.3532;SAR=6;SC=TGGCCTAGCAAGCATCGTGAC;SET_INTEGRATION;SET_WGVQSR;SRB=0.48143;SRF=3033;SRP=21.883;SRR=3267;TC;TR=8;TU=AAGC;VQSLOD=8.3252;set=Intersection;sumGLbyD=13.22 +20 56258618 rs113670927 T C,TGC,TGTGC,TGTGTGC 37834.99 PASS ABR=441;AC=11,100,43;AF=0.0123,0.1119,0.0481;AN=894;BVAR;BaseQRankSum=19.514;DB;DP=23173;DP4=541,920,413,579;Dels=0.00;FQ=999;FR;FS=1.238;HOMA=28;HOMR=808;HP=2;HPLen=1;HR=1;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.2154;IndelType=MIXED;MQ=57.25;MQ0Fraction=0.0275;MQRankSum=-6.684;NF;NR;NS=976;PP;PV4=0.023,1,1,1;RA=3294;RUN=1;ReadPosRankSum=11.873;SC=TGCGTGTGTGTGTGTGTGTGT;SRB=0.42441;SRF=1398;SRP=166.5;SRR=1896;TC;TR=30;TU=GT;VQSLOD=6.7457;dbSNP=114;set=Intersection;sumGLbyD=21.27 +20 56395857 . T TAGGCAG 6614.22 PASS AA=30;AB=0.63415;ABA=30;ABP=15.827;ABR=52;AC=14;AF=0.0197;AF1=0.03154;AN=710;BL=991;BR=1813;BVAR;BaseQRankSum=-4.589;CI95=0.02434,0.04204;DP=13879;DP4=1543,1833,12,14;Dels=0.00;EL=14;EPP=3.2998;ER=16;FQ=999;FR;FS=1.482;HETAR=11;HOMA=0;HOMR=1051;HP=1;HPLen=2;HR=2;HRun=0;HU=T;INDEL;INS;InbreedingCoeff=0.0774;IndelType=INS.NumRepetitions_2.EventLength_6.;LEN=6;LRB=0.29315;LRBP=526.27;MQ=90.42;MQ0=0;MQ0Fraction=0.0000;MQM=39.433;MQRankSum=-7.011;NF;NR;NS=1062;PP;PV4=1,1,3.7e-09,1;RA=5322;RL=9;RPP=13.433;RR=21;RUN=1;ReadPosRankSum=0.679;SAB=0.43333;SAF=13;SAP=4.1684;SAR=17;SC=AAGAGCATCTTAGGCAGAGGC;SET_INTEGRATION;SET_WGVQSR;SRB=0.47294;SRF=2517;SRP=36.853;SRR=2805;TC;TR=2;TU=T;VQSLOD=8.3045;set=Intersection;sumGLbyD=68.22 +20 56969289 . GTTTGT G 600.69 PASS AF=0.0056;AF1=0.007726;BaseQRankSum=2.907;CI95=0.004425,0.01327;DP=9643;DP4=1892,1749,6,3;Dels=0.00;FQ=117;FR;FS=16.601;HP=5;HPLen=3;HR=3;HRun=0;HU=T;INDEL;InbreedingCoeff=0.0236;IndelType=DEL.NumRepetitions_3.EventLength_5.;MQ=92.59;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-2.134;NF;NR;PP;PV4=0.51,1,0.07,0.3;ReadPosRankSum=0.236;SC=TAAGGACGTTGTTTGTTTTGT;SET_INTEGRATION;SET_WGVQSR;TC;TR=10;TU=GTTT;VQSLOD=5.8458;set=Intersection;sumGLbyD=39.51 +20 57187557 . AG A,AGG 1486.69 PASS AA=130;AB=0.55446;ABA=90;ABP=8.2132;ABR=112;AC=56,26;AF=0.0574,0.0266;AN=976;BL=3817;BR=5968;BVAR;BaseQRankSum=5.517;DEL;DP=14174;DP4=925,721,59,48;Dels=0.05;EL=52;EPP=14.302;ER=78;FR;FS=0.917;HETAR=44;HOMA=17;HOMR=864;HP=4;HPLen=4;HR=4;HRun=4;HU=G;INDEL;InbreedingCoeff=0.2856;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.21983;LRBP=1029.8;MQ=91.56;MQ0=0;MQ0Fraction=0.0000;MQM=63.631;MQRankSum=1.900;NF;NR;NS=925;PP;PV4=0.84,1,1,0.39;RA=2746;RL=44;RPP=32.476;RR=86;RUN=1;ReadPosRankSum=-0.639;SAB=0.44615;SAF=58;SAP=6.2842;SAR=72;SC=TCAGGCCCGCAGGGGTCAGGG;SET_INTEGRATION;SET_WGVQSR;SRB=0.5772;SRF=1585;SRP=145.17;SRR=1161;TC;TR=4;TU=G;VQSLOD=7.7167;set=Intersection;sumGLbyD=14.85 +20 57282771 . T TG 506.43 PASS AA=34;AB=0.70312;ABA=19;ABP=25.946;ABR=45;AC=34;AF=0.0373;AN=912;BL=886;BR=1938;BVAR;BaseQRankSum=3.744;DP=4276;Dels=0.00;EL=18;EPP=3.2658;ER=16;FR;FS=0.639;HETAR=17;HOMA=9;HOMR=737;HP=9;HR=8;HRun=8;HU=G;INS;InbreedingCoeff=0.2149;IndelType=INS.NumRepetitions_8.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.37252;LRBP=853.99;MQ0=0;MQ0Fraction=0.0000;MQM=49.706;MQRankSum=-0.051;NF;NR;NS=763;PP;RA=1822;RL=9;RPP=19.36;RR=25;RUN=1;ReadPosRankSum=-2.111;SAB=0.55882;SAF=19;SAP=4.0322;SAR=15;SC=TCGGGGGGCGTGGGGGGGGTG;SET_INTEGRATION;SET_WGVQSR;SRB=0.51098;SRF=931;SRP=4.9172;SRR=891;TC;TR=8;TU=G;VQSLOD=5.7772;set=Intersection;sumGLbyD=7.95 +20 57419740 rs11481507 A AT 82613.57 PASS AA=3850;AB=0.41404;ABA=1786;ABP=198.63;ABR=1262;AC=919;AF=0.75328;AN=1220;BL=140665;BR=151383;BVAR;BaseQRankSum=-27.490;DB;DP=31794;DP4=588,585,1571,1721;Dels=0.00;EL=1924;EPP=3.0126;ER=1926;FQ=999;FR;FS=2.191;HETAR=482;HOMA=454;HOMR=135;HP=3;HPLen=3;HR=3;HRun=3;HU=T;INDEL;INS;InbreedingCoeff=0.0861;IndelType=INS.NumRepetitions_3.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.036699;LRBP=857.15;MQ=123.92;MQ0=0;MQ0Fraction=0.0000;MQM=91.654;MQRankSum=3.016;NF;NR;NS=1071;PP;PV4=0.16,1,0.12,1;RA=1850;RL=1874;RPP=8.8784;RR=1976;RUN=1;ReadPosRankSum=-0.685;SAB=0.47636;SAF=1834;SAP=21.693;SAR=2016;SC=TACACTAGTGATTTAACCCTA;SET_INTEGRATION;SET_WGVQSR;SRB=0.49027;SRF=907;SRP=4.5315;SRR=943;TC;TR=3;TU=T;VQSLOD=9.2768;dbSNP=126;set=Intersection;sumGLbyD=22.78 +20 57558194 . CT C,CTT,CTTT 6470.30 PASS ABR=451;AC=104,161,177;AF=0.08919,0.13808,0.15180;BVAR;BaseQRankSum=1.172;DP=7985;FR;FS=2.202;HOMA=19;HOMR=778;HP=22;HR=15;HU=T;HaplotypeScore=16.1921;INS;InbreedingCoeff=0.6440;IndelType=MULTIALLELIC_INDEL;MQ=69.24;MQ0=27;MQ0Fraction=0.0109;MQRankSum=-0.003;NF;NR;NS=943;PP;QD=2.22;RA=2531;RUN=1;ReadPosRankSum=-0.104;SB=-2096.85;SC=GCCTTTTTTTCTTTTTTTTTT;SET_WGVQSR;SRB=0.34848;SRF=882;SRP=507.73;SRR=1649;TC;TR=15;TU=T;VQSLOD=6.5151;set=Intersection +20 57693627 . AG A 1991.90 PASS AA=52;AB=0.49462;ABA=47;ABP=3.0336;ABR=46;AC=15;AF=0.01227;AN=1222;BL=1902;BR=1478;BVAR;BaseQRankSum=-6.121;DEL;DP=26459;DP4=2647,2873,16,20;Dels=0.01;EL=25;EPP=3.1773;ER=27;FR;FS=3.135;HETAR=15;HOMA=1;HOMR=1064;HP=2;HPLen=3;HR=3;HRun=2;HU=A;INDEL;InbreedingCoeff=0.0866;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.12544;LRBP=118.51;MQ=116.26;MQ0=0;MQ0Fraction=0.0000;MQM=114.65;MQRankSum=1.942;NF;NR;NS=1080;PP;PV4=0.74,6.9e-08,1,0.38;RA=6781;RL=33;RPP=11.195;RR=19;RUN=1;ReadPosRankSum=-1.795;SAB=0.5;SAF=26;SAP=3.0103;SAR=26;SC=ATTGGAGGAAAGGCTTTTTCA;SET_INTEGRATION;SET_WGVQSR;SRB=0.46247;SRF=3136;SRP=85.976;SRR=3645;TC;TR=3;TU=A;VQSLOD=8.6672;set=Intersection;sumGLbyD=13.55 +20 57716287 . A AT 66.47 PASS AC=6;AF=0.00506;AN=1186;BaseQRankSum=1.369;DP=2744;FS=3.834;HRun=8;HaplotypeScore=11.2046;InbreedingCoeff=0.1196;IndelType=INS.NumRepetitions_8.EventLength_1.RepeatExpansion_T.;MQ=73.00;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-0.086;QD=2.14;ReadPosRankSum=-2.588;SB=-53.80;SET_INTEGRATION;SET_WGVQSR;VQSLOD=4.2080;set=VQSR +20 58121928 rs73625057 T TGG 6649.17 PASS AA=132;AB=0.57854;ABA=110;ABP=16.996;ABR=151;AC=57;AF=0.0617;AN=924;BL=4530;BR=4790;BVAR;BaseQRankSum=-13.456;DB;DP=30353;DP4=2107,2168,61,66;Dels=0.00;EL=67;EPP=3.0761;ER=65;FR;FS=0.708;HETAR=46;HOMA=8;HOMR=1023;HP=3;HPLen=2;HR=2;HRun=2;HU=G;INDEL;INS;InbreedingCoeff=0.1241;IndelType=INS.NumRepetitions_2.EventLength_1.RepeatExpansion_G.;LEN=2;LRB=0.027897;LRBP=18.76;MQ=109.61;MQ0=1;MQ0Fraction=0.0004;MQM=79.833;MQRankSum=-0.699;NF;NR;NS=1077;PP;PV4=0.79,1,0.49,0.036;RA=5754;RL=61;RPP=4.6554;RR=71;RUN=1;ReadPosRankSum=-3.309;SAB=0.45455;SAF=60;SAP=5.3792;SAR=72;SC=GATTAGAATGTGGATATCTTT;SET_INTEGRATION;SET_WGVQSR;SRB=0.48836;SRF=2810;SRP=9.7866;SRR=2944;TC;TR=4;TU=GT;VQSLOD=8.5770;set=Intersection;sumGLbyD=27.19 +20 58468826 . ACAAG A 999 PASS AF=0.0014;AF1=0.003429;BaseQRankSum=4.082;CI95=0.003106,0.006211;DP=8461;DP4=2500,1817,8,2;Dels=0.01;FQ=999;FR;FS=5.034;HP=2;HPLen=1;HR=1;HRun=0;HU=C;INDEL;InbreedingCoeff=-0.0183;IndelType=DEL.NumRepetitions_1.EventLength_4.;MQ=120.69;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.141;NF;NR;PP;PV4=0.21,1,0.054,1;ReadPosRankSum=2.096;SC=ATCCTGAAACACAAGAAGAAA;SET_INTEGRATION;SET_WGVQSR;TC;TR=5;TU=AC;VQSLOD=7.4928;set=Intersection;sumGLbyD=29.17 +20 58731262 . TC T 999 PASS AA=21;AB=0.48649;ABA=19;ABP=3.069;ABR=18;AC=7;AF=0.0101;AF1=0.01493;AN=694;BL=939;BR=848;BVAR;BaseQRankSum=4.205;CI95=0.01106,0.02212;DEL;DP=12598;DP4=1766,1428,11,15;Dels=0.01;EL=13;EPP=5.5954;ER=8;FQ=999;FR;FS=1.796;HETAR=8;HOMA=1;HOMR=1031;HP=7;HPLen=8;HR=8;HRun=2;HU=T;INDEL;InbreedingCoeff=-0.0030;IndelType=DEL.NumRepetitions_2.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.050923;LRBP=13.073;MQ=124.57;MQ0=0;MQ0Fraction=0.0000;MQM=67.905;MQRankSum=1.103;NF;NR;NS=1040;PP;PV4=0.23,1,1,1;RA=4884;RL=10;RPP=3.1137;RR=11;RUN=1;ReadPosRankSum=-0.091;SAB=0.47619;SAF=10;SAP=3.1137;SAR=11;SC=TCATTTTTTTTCCTTGAAACT;SET_INTEGRATION;SET_WGVQSR;SRB=0.58006;SRF=2833;SRP=274.9;SRR=2051;TC;TR=8;TU=T;VQSLOD=10.8783;set=Intersection;sumGLbyD=15.11 +20 59181229 rs11476579 CTT C,CT,CTTT,CTTTT 7787.17 PASS AC=19,195,104,91;AF=0.01599,0.16414,0.08754,0.07660;AF1=0.2124;AN=1188;BVAR;BaseQRankSum=6.347;CI95=0.146,0.2743;DB;DEL;DP=26140;DP4=932,880,352,375;Dels=0.13;FQ=85.6;FR;FS=11.914;HP=14;HR=14;HRun=14;HU=T;INDEL;INS;InbreedingCoeff=0.4183;IndelType=MULTIALLELIC_INDEL;MQ=86.88;MQ0=0;MQ0Fraction=0.0000;MQRankSum=1.469;NF;NR;PP;PV4=0.17,1,1,1;RUN=1;ReadPosRankSum=-1.055;SC=GGTGAGAAAGCTTTTTTTTTT;SET_WGVQSR;TC;TR=14;TU=T;VQSLOD=7.4340;dbSNP=120;set=Intersection;sumGLbyD=7.02 +20 59213979 rs112141381 G GC 9068 PASS AA=131;AB=0.47115;ABA=110;ABP=4.5136;ABR=98;AF=0.0586;AN=700;BL=5395;BR=5816;BVAR;BaseQRankSum=15.453;DB;DP=23381;DP4=2191,2184,71,49;Dels=0.00;EL=66;EPP=3.0269;ER=65;FR;FS=7.907;HETAR=35;HOMA=5;HOMR=1019;HP=2;HPLen=3;HR=3;HRun=0;HU=G;INDEL;INS;InbreedingCoeff=0.0283;IndelType=INS.NOVEL_1.Novel_C.;LEN=1;LRB=0.037552;LRBP=37.34;MQ=72.13;MQ0=0;MQ0Fraction=0.0000;MQM=54.496;MQRankSum=0.897;NF;NR;NS=1059;PP;PV4=0.052,1,0.066,1;RA=4976;RL=59;RPP=5.8117;RR=72;RUN=1;ReadPosRankSum=-0.811;SAB=0.58015;SAF=76;SAP=10.32;SAR=55;SC=GATGGACTGGGACAGTGACTC;SET_INTEGRATION;SET_WGVQSR;SRB=0.49457;SRF=2461;SRP=4.2828;SRR=2515;TC;TR=3;TU=G;VQSLOD=9.3917;set=Intersection;sumGLbyD=28.58 +20 59252945 . CT C,CTT 557.18 PASS AA=24;AB=0.84868;ABA=23;ABP=163.53;ABR=129;AC=21,29;AF=0.01759,0.02429;BL=1217;BR=1336;BVAR;BaseQRankSum=5.135;DP=9970;Dels=0.01;EL=13;EPP=3.3722;ER=11;FS=2.302;HETAR=21;HOMA=1;HOMR=1012;HRun=9;INS;InbreedingCoeff=0.1549;IndelType=MULTIALLELIC_INDEL;LEN=1;LRB=0.046612;LRBP=15.055;MQ0=0;MQ0Fraction=0.0000;MQM=67.208;MQRankSum=0.086;NS=1034;RA=4421;RL=11;RPP=3.3722;RR=13;RUN=1;ReadPosRankSum=-1.826;SAB=0.41667;SAF=10;SAP=4.4579;SAR=14;SET_WGVQSR;SRB=0.49649;SRF=2195;SRP=3.4823;SRR=2226;VQSLOD=2.8923;set=filterInVQSR-2of5;sumGLbyD=5.47 +20 60016966 . CT C 42650 PASS AA=37;AB=0.97834;ABA=31;ABP=2847;ABR=1400;AC=15;AF=0.0163;AN=920;BL=2596;BR=778;BVAR;BaseQRankSum=-0.632;DEL;DP=10967;Dels=0.00;EL=14;EPP=7.7641;ER=23;FS=4.094;HETAR=421;HOMA=256;HOMR=385;HRun=1;InbreedingCoeff=-0.0051;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_T.;LEN=1;LRB=0.53883;LRBP=2130.2;MQ0=0;MQ0Fraction=0.0000;MQM=120.3;MQRankSum=-0.911;NS=1072;RA=3413;RL=31;RPP=39.691;RR=6;RUN=1;ReadPosRankSum=-12.062;SAB=0.48649;SAF=18;SAP=3.069;SAR=19;SRB=0.47407;SRF=1618;SRP=22.943;SRR=1795;VQSLOD=3.3758;set=filterInVQSR-2of5;sumGLbyD=3.27 +20 60188651 . AG A 17624.52 PASS AA=462;AB=0.76548;ABA=409;ABP=1070.7;ABR=1335;AC=403;AF=0.34444;AN=1170;BL=13877;BR=25909;BVAR;BaseQRankSum=6.180;DEL;DP=9900;Dels=0.08;EL=353;EPP=282.84;ER=109;FR;FS=2699.057;HETAR=346;HOMA=26;HOMR=633;HP=3;HR=4;HRun=1;HU=A;InbreedingCoeff=-0.2900;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;LEN=1;LRB=0.30242;LRBP=7904.3;MQ0Fraction=0.0004;MQM=56.119;MQRankSum=1.644;NF;NR;NS=1005;PP;RA=3521;RL=112;RPP=269.25;RR=350;RUN=1;ReadPosRankSum=2.490;SAB=0.0064935;SAF=3;SAP=980.34;SAR=459;SC=AGGCTTCAAAAGAAAAAAAAA;SRB=0.55978;SRF=1971;SRP=112.32;SRR=1550;TC;TR=4;TU=A;VQSLOD=-34.0667;set=filterInVQSR-2of5;sumGLbyD=7.81 +20 60195570 . GTACATACATACA ATACATACATACA,G,GTACATACA 20140 PASS ABR=102;AC=105,2;AF=0.08794,0.00168;AN=1194;BVAR;BaseQRankSum=-28.899;DB;DEL;DP=14347;Dels=0.02;FR;FS=52.125;HOMA=1;HOMR=1006;HP=1;HPLen=1;HR=1;HRun=0;HU=T;InbreedingCoeff=0.0695;IndelType=MIXED;MQ0Fraction=0.0007;MQRankSum=1.957;NF;NR;NS=1035;PP;RA=4759;RUN=1;ReadPosRankSum=-22.252;SAB=0.5;SAP=3.0103;SC=TGATAGATTCGTACATACATA;SET_INTEGRATION;SRB=0.47615;SRF=2266;SRP=26.522;SRR=2493;TC;TR=21;TU=ACAT;VQSLOD=2.7673;set=filterInVQSR-2of5;sumGLbyD=19.14 +20 60670601 rs72127450 AT A,ATT 6401.59 PASS AC=177,79;AF=0.16239,0.07248;AF1=0.1602;AN=1090;BVAR;BaseQRankSum=8.618;CI95=0.1106,0.2058;DB;DEL;DP=17508;DP4=1285,1094,313,259;Dels=0.10;FQ=94.1;FR;FS=0.000;HP=12;HR=12;HRun=12;HU=T;INDEL;INS;InbreedingCoeff=0.1076;IndelType=MULTIALLELIC_INDEL;LEN=1;MQ=64.73;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.620;NF;NR;PP;PV4=0.78,1,0.012,1;RUN=1;ReadPosRankSum=-1.294;SC=AGCCAGGCACATTTTTTTTTT;SET_WGVQSR;TC;TR=12;TU=T;VQSLOD=6.1650;dbSNP=130;set=Intersection;sumGLbyD=5.80 +20 60685780 . TC T 1123.58 PASS AC=79;AF=0.07655;AN=1032;BaseQRankSum=14.949;DP=2084;FS=23.521;HRun=1;HaplotypeScore=19.7117;InbreedingCoeff=0.1356;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;MQ=53.57;MQ0=61;MQ0Fraction=0.0293;MQRankSum=-7.958;QD=4.35;ReadPosRankSum=-13.757;SB=-791.28;VQSLOD=6.3549;set=VQSR +20 60744906 rs113528167 CG C 422.53 PASS AC=48;AF=0.0732;AN=656;BaseQRankSum=17.669;DB;DP=1189;FS=0.356;HRun=1;HaplotypeScore=15.1808;InbreedingCoeff=0.2111;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_G.;MQ=82.83;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-10.455;QD=2.71;ReadPosRankSum=-16.887;SB=-326.46;VQSLOD=7.1707;set=VQSR +20 60848742 . CGT C,CGTGT 999 PASS AF=0.00980,0.01225;BaseQRankSum=5.597;DP=17065;DP4=1928,2188,17,13;Dels=0.01;FR;HP=1;HPLen=2;HR=2;HRun=0;HU=C;INDEL;InbreedingCoeff=0.2094;IndelType=MULTIALLELIC_INDEL;MQ=115.78;MQ0=0;MQ0Fraction=0.0000;MQRankSum=0.281;NF;NR;PP;PV4=0.36,0.4,0.12,0.12;ReadPosRankSum=-1.465;SB=-157.35;SC=TAGACGCTTCCGTGTGTGTGT;SET_INTEGRATION;SET_WGVQSR;TC;TR=11;TU=GT;VQSLOD=1.7100;set=filterInVQSR-2of5;sumGLbyD=16.39 +20 61023668 rs57452309 G GAGC 6896.67 PASS AC=115;AF=0.1445;AN=796;BaseQRankSum=12.146;DB;DP=1423;FS=5.070;HRun=0;HaplotypeScore=29.8897;InbreedingCoeff=0.0740;IndelType=INS.NOVEL_3.;MQ=77.02;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-9.005;QD=19.16;ReadPosRankSum=-17.440;SB=-3045.82;VQSLOD=4.5788;set=VQSR +20 61180519 . C CA,CT 1774.30 PASS ABR=135;AC=27,15;AF=0.02538,0.01410;BVAR;BaseQRankSum=-2.189;DP=8393;FR;FS=27.692;HOMA=2;HOMR=825;HP=6;HPLen=3;HR=3;HU=T;HaplotypeScore=19.5313;INS;InbreedingCoeff=0.0868;IndelType=MULTIALLELIC_INDEL;LEN=1;MQ=56.11;MQ0=172;MQ0Fraction=0.0667;MQRankSum=2.605;NF;NR;NS=854;PP;QD=1.99;RA=2868;RUN=1;ReadPosRankSum=-7.324;SB=-385.54;SC=TTCTTTCTTTCTTTCTTTCTT;SRB=0.32741;SRF=939;SRP=745.08;SRR=1929;TC;TR=69;TU=CTTT;VQSLOD=3.4398;set=filterInVQSR-2of5 +20 61184281 . AC A 9798.10 PASS AA=24;AB=0.96507;ABA=16;ABP=863.43;ABR=442;AC=4;AF=0.00341;AN=1174;BL=349;BR=1039;BVAR;BaseQRankSum=2.048;DEL;DP=10073;Dels=0.00;EL=11;EPP=3.3722;ER=13;FS=2.097;HETAR=141;HOMA=69;HOMR=829;HRun=1;InbreedingCoeff=0.0697;IndelType=DEL.NumRepetitions_1.EventLength_1.RepeatExpansion_C.;LEN=1;LRB=0.49712;LRBP=747.85;MQ0=0;MQ0Fraction=0.0000;MQM=98.042;MQRankSum=1.881;NS=1042;RA=3625;RL=5;RPP=20.744;RR=19;RUN=1;ReadPosRankSum=-8.009;SAB=0.75;SAF=18;SAP=16.039;SAR=6;SRB=0.52662;SRF=1909;SRP=25.323;SRR=1716;VQSLOD=1.8117;set=filterInVQSR-2of5;sumGLbyD=5.55 +20 62074219 . C CTAT,CTGT 2328 PASS ABR=99;AC=20,6;AF=0.01754,0.00526;BVAR;BaseQRankSum=11.221;DP=9498;DS;FS=4.510;HOMA=15;HOMR=645;HaplotypeScore=82.8868;INS;InbreedingCoeff=0.0880;IndelType=MULTIALLELIC_INDEL;LEN=3;MQ=29.88;MQ0=1378;MQ0Fraction=0.2286;MQRankSum=-5.309;NS=689;QD=0.77;RA=1679;RUN=1;ReadPosRankSum=-3.510;SAR=1;SB=-93.21;SRB=0.70697;SRF=1187;SRP=627.71;SRR=492;VQSLOD=1.8325;set=filterInVQSR-2of5 +20 62304449 . CA C,CAA 6680.17 PASS AC=141,69;AF=0.12567,0.06150;AF1=0.08178;AN=1122;BVAR;BaseQRankSum=9.754;CI95=0.05088,0.1128;DEL;DP=15867;DP4=1252,1289,232,208;Dels=0.10;FQ=52.6;FR;FS=6.576;HP=11;HR=11;HRun=11;HU=A;INDEL;INS;InbreedingCoeff=0.1950;IndelType=MULTIALLELIC_INDEL;LEN=1;MQ=60.48;MQ0Fraction=0.0004;MQRankSum=-0.049;NF;NR;PP;PV4=0.2,1,1,1;RUN=1;ReadPosRankSum=-2.137;SC=GATTCTGTGTCAAAAAAAAAA;SET_WGVQSR;TC;TR=11;TU=A;VQSLOD=7.4714;set=Intersection;sumGLbyD=8.36 +20 62804895 rs57769591 CCTT C 1148 PASS AC=8;AF=0.0085;AF1=0.002839;AN=938;BaseQRankSum=4.952;CI95=0.002212,0.006637;DB;DP=8889;DP4=2574,1668,4,8;FQ=12.3;FS=2.289;HPLen=3;HRun=0;HaplotypeScore=29.4184;INDEL;InbreedingCoeff=-0.0270;IndelType=DEL.NumRepetitions_1.EventLength_3.;MQ0=876;MQ0Fraction=0.2674;MQRankSum=-0.641;PV4=0.074,1,1,1;QD=1.03;ReadPosRankSum=0.118;SB=-65.30;SET_INTEGRATION;SET_WGVQSR;VQSLOD=6.4881;dbSNP=126;set=Intersection +20 62907688 . AAT A 6629.57 PASS AC=164;AF=0.13735;AN=1194;BaseQRankSum=27.368;DP=2746;FS=5.985;HRun=0;HaplotypeScore=14.7748;InbreedingCoeff=0.1433;IndelType=DEL.NumRepetitions_2.EventLength_2.RepeatExpansion_AT.;MQ=96.65;MQ0=0;MQ0Fraction=0.0000;MQRankSum=-3.318;QD=10.81;ReadPosRankSum=0.789;SB=-2662.16;SET_INTEGRATION;SET_WGVQSR;VQSLOD=6.1473;set=VQSR diff --git a/tests/tabix_data/vcf/24.vcf b/tests/tabix_data/vcf/24.vcf new file mode 100644 index 0000000..a62e424 --- /dev/null +++ b/tests/tabix_data/vcf/24.vcf @@ -0,0 +1,724 @@ +##fileformat=VCFv4.1 +##INFO= +##INFO= +##INFO= +##INFO= +##reference=file:///humgen/1kg/reference/human_g1k_v37.fasta +#CHROM POS ID REF ALT QUAL FILTER INFO +20 256726 . T A . . Sample=HG00097;GT=0/1;PCR_454_AR=739;PCR_454_RR=885 +20 256726 . T A . . Sample=HG00099;GT=0/1;PCR_454_AR=723;PCR_454_RR=714 +20 256726 . T A . . Sample=HG00106;GT=0/1;PCR_454_AR=1092;PCR_454_RR=1102 +20 256726 . T A . . Sample=HG00112;GT=0/1;PCR_454_AR=947;PCR_454_RR=1005 +20 256726 . T A . . Sample=HG00104;GT=1/1;PCR_454_AR=1970;PCR_454_RR=52 +20 257977 . G C . . Sample=NA19438;GT=0/1;PCR_454_AR=1312;PCR_454_RR=1123 +20 330407 . C G . . Sample=HG00134;GT=0/1;PCR_454_AR=1034;PCR_454_RR=1037 +20 330407 . C G . . Sample=HG00148;GT=0/1;PCR_454_AR=840;PCR_454_RR=820 +20 330407 . C G . . Sample=HG00151;GT=0/1;PCR_454_AR=952;PCR_454_RR=982 +20 330407 . C G . . Sample=HG00358;GT=0/1;PCR_454_AR=880;PCR_454_RR=957 +20 330407 . C G . . Sample=HG01277;GT=0/1;PCR_454_AR=914;PCR_454_RR=984 +20 368826 . G A . . Sample=NA20346;GT=0/1;PCR_454_AR=632;PCR_454_RR=591 +20 371957 . G A . . Sample=HG00150;GT=0/1;PCR_454_AR=403;PCR_454_RR=424 +20 371957 . G A . . Sample=NA12287;GT=0/1;PCR_454_AR=401;PCR_454_RR=435 +20 467031 . T A . . Sample=NA20510;GT=0/0;PCR_454_AR=5;PCR_454_RR=1763 +20 741858 . G A . . Sample=NA18634;GT=0/1;PCR_454_AR=1273;PCR_454_RR=1301 +20 947853 . C T . . Sample=HG00578;GT=0/0;PCR_454_AR=0;PCR_454_RR=197 +20 947853 . C T . . Sample=NA18861;GT=0/1;PCR_454_AR=40;PCR_454_RR=39 +20 947853 . C T . . Sample=NA18868;GT=0/1;PCR_454_AR=88;PCR_454_RR=80 +20 947853 . C T . . Sample=NA18870;GT=0/1;PCR_454_AR=66;PCR_454_RR=99 +20 947853 . C T . . Sample=NA18917;GT=0/1;PCR_454_AR=96;PCR_454_RR=111 +20 947908 . C T . . Sample=NA11993;GT=0/1;PCR_454_AR=598;PCR_454_RR=2114 +20 947908 . C T . . Sample=NA18501;GT=0/1;PCR_454_AR=392;PCR_454_RR=1687 +20 947908 . C T . . Sample=NA18504;GT=0/1;PCR_454_AR=635;PCR_454_RR=2218 +20 947908 . C T . . Sample=NA18505;GT=0/1;PCR_454_AR=1312;PCR_454_RR=1429 +20 947908 . C T . . Sample=NA18507;GT=0/1;PCR_454_AR=598;PCR_454_RR=2127 +20 948715 . T G . . Sample=NA06989;GT=0/0;PCR_454_AR=4;PCR_454_RR=1252 +20 1144999 . C T . . Sample=NA18510;GT=0/1;PCR_454_AR=450;PCR_454_RR=447 +20 1144999 . C T . . Sample=NA19172;GT=0/1;PCR_454_AR=541;PCR_454_RR=531 +20 1285858 . A C . . Sample=NA19311;GT=0/1;PCR_454_AR=1210;PCR_454_RR=1315 +20 1285932 . G A . . Sample=HG00097;GT=0/1;PCR_454_AR=868;PCR_454_RR=867 +20 1285932 . G A . . Sample=HG00106;GT=0/1;PCR_454_AR=745;PCR_454_RR=680 +20 1285932 . G A . . Sample=HG00126;GT=0/1;PCR_454_AR=780;PCR_454_RR=838 +20 1285932 . G A . . Sample=HG00134;GT=0/1;PCR_454_AR=978;PCR_454_RR=944 +20 1285932 . G A . . Sample=HG00128;GT=1/1;PCR_454_AR=1499;PCR_454_RR=14 +20 1286090 . A G . . Sample=HG00235;GT=0/1;PCR_454_AR=1223;PCR_454_RR=1352 +20 1286090 . A G . . Sample=HG00351;GT=0/1;PCR_454_AR=799;PCR_454_RR=823 +20 1286090 . A G . . Sample=HG01125;GT=0/1;PCR_454_AR=1167;PCR_454_RR=1149 +20 1286090 . A G . . Sample=NA19773;GT=0/1;PCR_454_AR=1070;PCR_454_RR=1130 +20 1546804 . G A . . Sample=HG00141;GT=0/1;PCR_454_AR=1174;PCR_454_RR=1231 +20 1546804 . G A . . Sample=HG00149;GT=0/1;PCR_454_AR=1029;PCR_454_RR=1050 +20 1546804 . G A . . Sample=HG00151;GT=0/1;PCR_454_AR=1135;PCR_454_RR=1034 +20 1546804 . G A . . Sample=HG00177;GT=0/1;PCR_454_AR=1063;PCR_454_RR=1118 +20 1546804 . G A . . Sample=HG00179;GT=0/1;PCR_454_AR=1118;PCR_454_RR=954 +20 1551579 . T G . . Sample=NA20515;GT=0/0;PCR_454_AR=5;PCR_454_RR=1812 +20 1551579 . T G . . Sample=NA19466;GT=0/1;PCR_454_AR=1011;PCR_454_RR=1042 +20 1559334 . C T . . Sample=NA18941;GT=0/0;PCR_454_AR=1;PCR_454_RR=1193 +20 1615980 . G A . . Sample=NA19914;GT=0/1;PCR_454_AR=441;PCR_454_RR=492 +20 1616047 . C G . . Sample=NA07048;GT=0/1;PCR_454_AR=508;PCR_454_RR=813 +20 1629751 . T C . . Sample=HG00156;GT=0/1;PCR_454_AR=285;PCR_454_RR=282 +20 1896011 . C T . . Sample=NA18639;GT=0/0;PCR_454_AR=0;PCR_454_RR=29 +20 1896011 . C T . . Sample=NA19314;GT=0/0;PCR_454_AR=0;PCR_454_RR=47 +20 2291684 . T C . . Sample=NA19036;GT=0/1;PCR_454_AR=873;PCR_454_RR=1025 +20 2291684 . T C . . Sample=NA19347;GT=0/1;PCR_454_AR=1116;PCR_454_RR=1217 +20 2375127 . G A . . Sample=NA18615;GT=0/1;PCR_454_AR=1016;PCR_454_RR=1016 +20 2777844 . T C . . Sample=NA20819;GT=0/1;PCR_454_AR=908;PCR_454_RR=970 +20 2844678 . G A . . Sample=HG00360;GT=0/1;PCR_454_AR=1081;PCR_454_RR=1071 +20 2944927 . A T . . Sample=NA12347;GT=0/1;PCR_454_AR=704;PCR_454_RR=752 +20 2969014 . C G . . Sample=HG00151;GT=0/1;PCR_454_AR=684;PCR_454_RR=809 +20 2969014 . C G . . Sample=NA18511;GT=0/1;PCR_454_AR=666;PCR_454_RR=704 +20 2969014 . C G . . Sample=NA18523;GT=0/1;PCR_454_AR=767;PCR_454_RR=802 +20 2969014 . C G . . Sample=NA18549;GT=0/1;PCR_454_AR=772;PCR_454_RR=838 +20 2969014 . C G . . Sample=NA18858;GT=1/1;PCR_454_AR=1313;PCR_454_RR=8 +20 3026344 . A C . . Sample=NA18640;GT=0/1;PCR_454_AR=1652;PCR_454_RR=1336 +20 3128885 . G A . . Sample=NA19473;GT=0/1;PCR_454_AR=620;PCR_454_RR=669 +20 3128950 . G A . . Sample=NA18624;GT=0/1;PCR_454_AR=570;PCR_454_RR=517 +20 3128950 . G A . . Sample=NA18953;GT=0/1;PCR_454_AR=685;PCR_454_RR=700 +20 3128950 . G A . . Sample=NA18998;GT=0/1;PCR_454_AR=606;PCR_454_RR=638 +20 3128950 . G A . . Sample=NA19076;GT=0/1;PCR_454_AR=663;PCR_454_RR=643 +20 3128950 . G A . . Sample=NA19088;GT=0/1;PCR_454_AR=492;PCR_454_RR=472 +20 3171356 . T C . . Sample=NA12003;GT=0/0;PCR_454_AR=6;PCR_454_RR=1919 +20 3171356 . T C . . Sample=NA12872;GT=0/0;PCR_454_AR=6;PCR_454_RR=2324 +20 3193990 . G T . . Sample=NA12815;GT=0/0;PCR_454_AR=0;PCR_454_RR=1570 +20 3193990 . G T . . Sample=NA18505;GT=0/0;PCR_454_AR=0;PCR_454_RR=1586 +20 3204083 . G A . . Sample=HG00104;GT=0/1;PCR_454_AR=1059;PCR_454_RR=982 +20 3204083 . G A . . Sample=HG00118;GT=0/1;PCR_454_AR=1190;PCR_454_RR=1178 +20 3204083 . G A . . Sample=HG00122;GT=0/1;PCR_454_AR=1156;PCR_454_RR=1277 +20 3204083 . G A . . Sample=HG00099;GT=1/1;PCR_454_AR=2171;PCR_454_RR=12 +20 3204083 . G A . . Sample=HG00106;GT=1/1;PCR_454_AR=2027;PCR_454_RR=19 +20 3214580 . C T . . Sample=HG00097;GT=0/1;PCR_454_AR=852;PCR_454_RR=784 +20 3214580 . C T . . Sample=HG00099;GT=0/1;PCR_454_AR=628;PCR_454_RR=682 +20 3214580 . C T . . Sample=HG00129;GT=0/1;PCR_454_AR=869;PCR_454_RR=844 +20 3214580 . C T . . Sample=HG00130;GT=0/1;PCR_454_AR=651;PCR_454_RR=767 +20 3214580 . C T . . Sample=HG00128;GT=1/1;PCR_454_AR=1378;PCR_454_RR=3 +20 3214802 . T C . . Sample=NA18526;GT=0/1;PCR_454_AR=969;PCR_454_RR=1018 +20 3235915 . T C . . Sample=HG00560;GT=0/1;PCR_454_AR=795;PCR_454_RR=798 +20 3235915 . T C . . Sample=HG00566;GT=0/1;PCR_454_AR=688;PCR_454_RR=650 +20 3235915 . T C . . Sample=HG00596;GT=0/1;PCR_454_AR=863;PCR_454_RR=935 +20 3235915 . T C . . Sample=HG01124;GT=0/1;PCR_454_AR=802;PCR_454_RR=836 +20 3235915 . T C . . Sample=NA18487;GT=0/1;PCR_454_AR=942;PCR_454_RR=968 +20 3274851 . C T . . Sample=NA19704;GT=0/1;PCR_454_AR=486;PCR_454_RR=479 +20 3274851 . C T . . Sample=NA20334;GT=0/1;PCR_454_AR=512;PCR_454_RR=512 +20 3274851 . C T . . Sample=NA20336;GT=0/1;PCR_454_AR=510;PCR_454_RR=440 +20 3324372 . G C . . Sample=NA19003;GT=0/1;PCR_454_AR=1902;PCR_454_RR=1898 +20 3362102 . T G . . Sample=NA06994;GT=0/0;PCR_454_AR=0;PCR_454_RR=526 +20 3362102 . T G . . Sample=NA12249;GT=0/0;PCR_454_AR=0;PCR_454_RR=465 +20 3515923 . G A . . Sample=HG00122;GT=0/1;PCR_454_AR=237;PCR_454_RR=261 +20 3515923 . G A . . Sample=HG00126;GT=0/1;PCR_454_AR=299;PCR_454_RR=293 +20 3515923 . G A . . Sample=HG00130;GT=0/1;PCR_454_AR=307;PCR_454_RR=279 +20 3515923 . G A . . Sample=HG00128;GT=1/1;PCR_454_AR=633;PCR_454_RR=4 +20 3515923 . G A . . Sample=HG00129;GT=1/1;PCR_454_AR=580;PCR_454_RR=2 +20 3641233 . G T . . Sample=NA20773;GT=0/0;PCR_454_AR=3;PCR_454_RR=1477 +20 3650204 . G A . . Sample=HG00118;GT=0/1;PCR_454_AR=737;PCR_454_RR=771 +20 3650204 . G A . . Sample=HG00126;GT=0/1;PCR_454_AR=518;PCR_454_RR=552 +20 3650204 . G A . . Sample=HG00141;GT=0/1;PCR_454_AR=643;PCR_454_RR=668 +20 3650204 . G A . . Sample=HG00143;GT=0/1;PCR_454_AR=549;PCR_454_RR=613 +20 3650204 . G A . . Sample=HG00148;GT=0/1;PCR_454_AR=708;PCR_454_RR=830 +20 3652397 . G A . . Sample=NA18635;GT=0/1;PCR_454_AR=1604;PCR_454_RR=1658 +20 3672827 . A T . . Sample=HG00130;GT=0/0;PCR_454_AR=0;PCR_454_RR=941 +20 3672827 . A T . . Sample=HG00349;GT=0/0;PCR_454_AR=2;PCR_454_RR=943 +20 3675119 . G T . . Sample=NA20544;GT=0/1;PCR_454_AR=577;PCR_454_RR=657 +20 3687329 . T C . . Sample=NA18532;GT=0/1;PCR_454_AR=702;PCR_454_RR=746 +20 3842125 . C G . . Sample=NA12155;GT=0/1;PCR_454_AR=1193;PCR_454_RR=1178 +20 4680289 . G A . . Sample=NA18856;GT=0/1;PCR_454_AR=1335;PCR_454_RR=1278 +20 4680289 . G A . . Sample=NA19130;GT=0/1;PCR_454_AR=1273;PCR_454_RR=1286 +20 4680289 . G A . . Sample=NA19213;GT=0/1;PCR_454_AR=1305;PCR_454_RR=1241 +20 4680289 . G A . . Sample=NA19311;GT=0/1;PCR_454_AR=1332;PCR_454_RR=1400 +20 4680289 . G A . . Sample=NA19332;GT=0/1;PCR_454_AR=1272;PCR_454_RR=1275 +20 4848511 . G A . . Sample=NA19440;GT=0/0;PCR_454_AR=8;PCR_454_RR=2951 +20 4848511 . G A . . Sample=NA19448;GT=0/1;PCR_454_AR=1278;PCR_454_RR=1434 +20 4848511 . G A . . Sample=NA19461;GT=0/1;PCR_454_AR=1412;PCR_454_RR=1478 +20 5099300 . A G . . Sample=NA19138;GT=0/1;PCR_454_AR=511;PCR_454_RR=496 +20 5903387 . A C . . Sample=HG00566;GT=0/1;PCR_454_AR=1400;PCR_454_RR=1384 +20 5903387 . A C . . Sample=HG01124;GT=0/1;PCR_454_AR=856;PCR_454_RR=1007 +20 5903387 . A C . . Sample=HG01125;GT=0/1;PCR_454_AR=891;PCR_454_RR=816 +20 5903387 . A C . . Sample=HG01149;GT=0/1;PCR_454_AR=1011;PCR_454_RR=959 +20 5903387 . A C . . Sample=HG01278;GT=0/1;PCR_454_AR=1077;PCR_454_RR=1049 +20 5923222 . C T . . Sample=HG00592;GT=0/1;PCR_454_AR=968;PCR_454_RR=950 +20 5923222 . C T . . Sample=NA18567;GT=0/1;PCR_454_AR=678;PCR_454_RR=728 +20 5923222 . C T . . Sample=NA18602;GT=0/1;PCR_454_AR=926;PCR_454_RR=988 +20 5923222 . C T . . Sample=NA18624;GT=0/1;PCR_454_AR=991;PCR_454_RR=963 +20 5923222 . C T . . Sample=NA18632;GT=0/1;PCR_454_AR=892;PCR_454_RR=906 +20 5943955 . G C . . Sample=HG00565;GT=0/1;PCR_454_AR=259;PCR_454_RR=227 +20 5943955 . G C . . Sample=HG00566;GT=0/1;PCR_454_AR=245;PCR_454_RR=235 +20 5943955 . G C . . Sample=HG00577;GT=0/1;PCR_454_AR=264;PCR_454_RR=305 +20 5943955 . G C . . Sample=HG00578;GT=0/1;PCR_454_AR=210;PCR_454_RR=261 +20 5943955 . G C . . Sample=HG00593;GT=0/1;PCR_454_AR=261;PCR_454_RR=238 +20 6015109 . G A . . Sample=NA20796;GT=0/1;PCR_454_AR=440;PCR_454_RR=500 +20 6060150 . C T . . Sample=NA18961;GT=0/1;PCR_454_AR=384;PCR_454_RR=464 +20 7967973 . G A . . Sample=NA19371;GT=0/1;PCR_454_AR=281;PCR_454_RR=506 +20 7967973 . G A . . Sample=NA19390;GT=0/1;PCR_454_AR=410;PCR_454_RR=538 +20 8665657 . G A . . Sample=NA19740;GT=0/1;PCR_454_AR=724;PCR_454_RR=703 +20 9453955 . C A . . Sample=NA20314;GT=0/1;PCR_454_AR=1048;PCR_454_RR=1147 +20 9520132 . G A . . Sample=HG00143;GT=0/1;PCR_454_AR=472;PCR_454_RR=583 +20 9520132 . G A . . Sample=HG01624;GT=0/1;PCR_454_AR=589;PCR_454_RR=589 +20 9520132 . G A . . Sample=NA12046;GT=0/1;PCR_454_AR=688;PCR_454_RR=708 +20 9520132 . G A . . Sample=NA18517;GT=0/1;PCR_454_AR=566;PCR_454_RR=585 +20 9520132 . G A . . Sample=NA18858;GT=0/1;PCR_454_AR=550;PCR_454_RR=561 +20 9543621 . C T . . Sample=HG00097;GT=0/1;PCR_454_AR=499;PCR_454_RR=480 +20 9543621 . C T . . Sample=HG00104;GT=0/1;PCR_454_AR=524;PCR_454_RR=480 +20 9543621 . C T . . Sample=HG00112;GT=0/1;PCR_454_AR=467;PCR_454_RR=406 +20 9543621 . C T . . Sample=HG00099;GT=1/1;PCR_454_AR=1321;PCR_454_RR=9 +20 9543621 . C T . . Sample=HG00106;GT=1/1;PCR_454_AR=802;PCR_454_RR=6 +20 9547022 . G A . . Sample=NA18924;GT=0/1;PCR_454_AR=853;PCR_454_RR=944 +20 9560813 . T C . . Sample=NA12761;GT=0/1;PCR_454_AR=692;PCR_454_RR=734 +20 10030206 . C T . . Sample=NA19175;GT=0/1;PCR_454_AR=784;PCR_454_RR=759 +20 10030206 . C T . . Sample=NA19380;GT=0/1;PCR_454_AR=781;PCR_454_RR=739 +20 10030206 . C T . . Sample=NA19446;GT=0/1;PCR_454_AR=533;PCR_454_RR=540 +20 13098183 . A C . . Sample=NA19453;GT=0/1;PCR_454_AR=857;PCR_454_RR=1146 +20 16253907 . C A . . Sample=NA19087;GT=0/1;PCR_454_AR=868;PCR_454_RR=854 +20 16254032 . G A . . Sample=NA19651;GT=0/1;PCR_454_AR=299;PCR_454_RR=263 +20 16485159 . T G . . Sample=NA18625;GT=0/1;PCR_454_AR=160;PCR_454_RR=1004 +20 17474781 . G A . . Sample=NA18870;GT=0/1;PCR_454_AR=496;PCR_454_RR=536 +20 17585255 . C G . . Sample=NA18528;GT=0/1;PCR_454_AR=370;PCR_454_RR=390 +20 17923814 . C T . . Sample=HG00104;GT=0/0;PCR_454_AR=1;PCR_454_RR=1854 +20 17923814 . C T . . Sample=HG00126;GT=0/0;PCR_454_AR=1;PCR_454_RR=1724 +20 17928182 . T G . . Sample=NA18522;GT=0/1;PCR_454_AR=222;PCR_454_RR=1564 +20 17931030 . C G . . Sample=NA20508;GT=0/1;PCR_454_AR=495;PCR_454_RR=446 +20 17933265 . G A . . Sample=NA19137;GT=0/1;PCR_454_AR=300;PCR_454_RR=315 +20 17968811 . C G . . Sample=NA19222;GT=0/1;PCR_454_AR=150;PCR_454_RR=189 +20 18123396 . A G . . Sample=NA20507;GT=0/0;PCR_454_AR=5;PCR_454_RR=2239 +20 18125941 . T C . . Sample=NA12006;GT=0/0;PCR_454_AR=2;PCR_454_RR=2354 +20 18125941 . T C . . Sample=NA12762;GT=0/0;PCR_454_AR=4;PCR_454_RR=1116 +20 18374912 . T A . . Sample=NA19189;GT=0/1;PCR_454_AR=896;PCR_454_RR=888 +20 18440904 . G C . . Sample=NA19058;GT=0/1;PCR_454_AR=685;PCR_454_RR=881 +20 19698200 . C T . . Sample=NA18574;GT=0/1;PCR_454_AR=1012;PCR_454_RR=1086 +20 20020489 . T C . . Sample=NA19000;GT=0/1;PCR_454_AR=459;PCR_454_RR=436 +20 20028425 . C T . . Sample=NA20787;GT=0/1;PCR_454_AR=687;PCR_454_RR=739 +20 20033171 . G A . . Sample=NA19468;GT=0/0;PCR_454_AR=109;PCR_454_RR=1866 +20 20051634 . A G . . Sample=NA19711;GT=0/1;PCR_454_AR=659;PCR_454_RR=2324 +20 20051634 . A G . . Sample=NA20126;GT=0/1;PCR_454_AR=687;PCR_454_RR=2379 +20 20177371 . T C . . Sample=NA19713;GT=0/1;PCR_454_AR=882;PCR_454_RR=785 +20 21346240 . C T . . Sample=HG01125;GT=0/1;PCR_454_AR=707;PCR_454_RR=711 +20 21346240 . C T . . Sample=NA18489;GT=0/1;PCR_454_AR=670;PCR_454_RR=648 +20 21346240 . C T . . Sample=NA18498;GT=0/1;PCR_454_AR=706;PCR_454_RR=667 +20 21346240 . C T . . Sample=NA18502;GT=0/1;PCR_454_AR=698;PCR_454_RR=678 +20 21346240 . C T . . Sample=NA18505;GT=1/1;PCR_454_AR=1096;PCR_454_RR=2 +20 21494183 . C T . . Sample=HG00128;GT=0/1;PCR_454_AR=556;PCR_454_RR=605 +20 21494183 . C T . . Sample=HG00151;GT=0/1;PCR_454_AR=465;PCR_454_RR=425 +20 21494183 . C T . . Sample=HG00234;GT=0/1;PCR_454_AR=583;PCR_454_RR=487 +20 21494183 . C T . . Sample=HG00355;GT=0/1;PCR_454_AR=608;PCR_454_RR=521 +20 21494183 . C T . . Sample=HG00362;GT=0/1;PCR_454_AR=518;PCR_454_RR=577 +20 21687304 . C T . . Sample=NA19657;GT=0/1;PCR_454_AR=804;PCR_454_RR=862 +20 23028428 . C T . . Sample=NA18970;GT=0/1;PCR_454_AR=360;PCR_454_RR=418 +20 23028637 . C G . . Sample=NA18517;GT=0/1;PCR_454_AR=358;PCR_454_RR=374 +20 23028637 . C G . . Sample=NA19118;GT=0/1;PCR_454_AR=502;PCR_454_RR=432 +20 23420987 . G T . . Sample=NA19076;GT=0/0;PCR_454_AR=20;PCR_454_RR=1732 +20 23420993 . C G . . Sample=NA19076;GT=0/0;PCR_454_AR=40;PCR_454_RR=3495 +20 23424637 . C T . . Sample=HG00126;GT=0/1;PCR_454_AR=766;PCR_454_RR=721 +20 23424637 . C T . . Sample=HG00150;GT=0/1;PCR_454_AR=444;PCR_454_RR=435 +20 23424637 . C T . . Sample=HG00247;GT=0/1;PCR_454_AR=510;PCR_454_RR=486 +20 23424637 . C T . . Sample=HG00565;GT=0/1;PCR_454_AR=684;PCR_454_RR=609 +20 23424637 . C T . . Sample=HG00593;GT=0/1;PCR_454_AR=640;PCR_454_RR=676 +20 23545657 . A C . . Sample=NA18924;GT=0/1;PCR_454_AR=767;PCR_454_RR=780 +20 23548918 . T C . . Sample=NA18501;GT=0/1;PCR_454_AR=1397;PCR_454_RR=1168 +20 23548918 . T C . . Sample=NA18502;GT=0/1;PCR_454_AR=1373;PCR_454_RR=1383 +20 23548918 . T C . . Sample=NA18856;GT=0/1;PCR_454_AR=1376;PCR_454_RR=1446 +20 23548918 . T C . . Sample=NA18907;GT=0/1;PCR_454_AR=1522;PCR_454_RR=1533 +20 23548918 . T C . . Sample=NA19036;GT=0/1;PCR_454_AR=1549;PCR_454_RR=1624 +20 23667793 . G T . . Sample=NA11994;GT=0/0;PCR_454_AR=135;PCR_454_RR=1637 +20 23667793 . G T . . Sample=NA12400;GT=0/1;PCR_454_AR=651;PCR_454_RR=619 +20 23667793 . G T . . Sample=NA18527;GT=0/1;PCR_454_AR=816;PCR_454_RR=732 +20 23667793 . G T . . Sample=NA18566;GT=0/1;PCR_454_AR=928;PCR_454_RR=2446 +20 23667793 . G T . . Sample=NA19064;GT=0/1;PCR_454_AR=892;PCR_454_RR=2346 +20 23667834 . A C . . Sample=NA18510;GT=0/0;PCR_454_AR=27;PCR_454_RR=622 +20 23667834 . A C . . Sample=NA18858;GT=0/0;PCR_454_AR=32;PCR_454_RR=615 +20 23731469 . G T . . Sample=NA20544;GT=0/1;PCR_454_AR=292;PCR_454_RR=376 +20 23804690 . A C . . Sample=NA19749;GT=0/1;PCR_454_AR=1141;PCR_454_RR=1145 +20 23807156 . G C . . Sample=HG00129;GT=0/0;PCR_454_AR=0;PCR_454_RR=1447 +20 23807156 . G C . . Sample=HG00130;GT=0/0;PCR_454_AR=0;PCR_454_RR=1603 +20 23860201 . C T . . Sample=NA18553;GT=0/1;PCR_454_AR=722;PCR_454_RR=657 +20 23965921 . G A . . Sample=NA18549;GT=0/0;PCR_454_AR=21;PCR_454_RR=582 +20 23965921 . G A . . Sample=NA19000;GT=0/0;PCR_454_AR=19;PCR_454_RR=337 +20 24523782 . G A . . Sample=NA19921;GT=0/1;PCR_454_AR=933;PCR_454_RR=1005 +20 24523986 . C A . . Sample=HG00104;GT=0/1;PCR_454_AR=1056;PCR_454_RR=1346 +20 24954343 . G A . . Sample=NA19146;GT=0/1;PCR_454_AR=1208;PCR_454_RR=1132 +20 25058490 . T G . . Sample=NA11830;GT=0/0;PCR_454_AR=5;PCR_454_RR=1757 +20 25187224 . A G . . Sample=NA19137;GT=0/1;PCR_454_AR=69;PCR_454_RR=566 +20 25203611 . T C . . Sample=NA12006;GT=0/1;PCR_454_AR=1326;PCR_454_RR=1209 +20 25252066 . A G . . Sample=NA18637;GT=0/1;PCR_454_AR=1208;PCR_454_RR=1230 +20 25262768 . G A . . Sample=HG00099;GT=0/1;PCR_454_AR=920;PCR_454_RR=727 +20 25262768 . G A . . Sample=HG00106;GT=0/1;PCR_454_AR=733;PCR_454_RR=613 +20 25262768 . G A . . Sample=HG00112;GT=0/1;PCR_454_AR=756;PCR_454_RR=723 +20 25262768 . G A . . Sample=HG00130;GT=0/1;PCR_454_AR=854;PCR_454_RR=827 +20 25262768 . G A . . Sample=HG00152;GT=0/1;PCR_454_AR=798;PCR_454_RR=764 +20 25277132 . C T . . Sample=NA18861;GT=0/1;PCR_454_AR=415;PCR_454_RR=446 +20 25434162 . C T . . Sample=NA19346;GT=0/1;PCR_454_AR=566;PCR_454_RR=613 +20 25434162 . C T . . Sample=NA19395;GT=0/1;PCR_454_AR=504;PCR_454_RR=531 +20 25439088 . C T . . Sample=NA19095;GT=0/0;PCR_454_AR=1;PCR_454_RR=1220 +20 25439088 . C T . . Sample=NA19923;GT=0/1;PCR_454_AR=575;PCR_454_RR=834 +20 25457145 . G A . . Sample=NA12842;GT=0/1;PCR_454_AR=333;PCR_454_RR=438 +20 25457559 . G A . . Sample=NA19159;GT=0/1;PCR_454_AR=1225;PCR_454_RR=1285 +20 25457665 . C T . . Sample=NA20341;GT=0/1;PCR_454_AR=627;PCR_454_RR=1348 +20 25459659 . T C . . Sample=NA18647;GT=0/0;PCR_454_AR=5;PCR_454_RR=2809 +20 25459659 . T C . . Sample=NA18748;GT=0/0;PCR_454_AR=5;PCR_454_RR=2184 +20 25459659 . T C . . Sample=HG01274;GT=0/1;PCR_454_AR=1246;PCR_454_RR=1375 +20 25459659 . T C . . Sample=NA12275;GT=0/1;PCR_454_AR=1183;PCR_454_RR=1148 +20 25459659 . T C . . Sample=NA12718;GT=0/1;PCR_454_AR=1017;PCR_454_RR=1225 +20 25478961 . G A . . Sample=HG00104;GT=0/0;PCR_454_AR=1;PCR_454_RR=1933 +20 25478961 . G A . . Sample=HG00234;GT=0/0;PCR_454_AR=0;PCR_454_RR=1964 +20 25478961 . G A . . Sample=HG00364;GT=0/0;PCR_454_AR=2;PCR_454_RR=1909 +20 25478961 . G A . . Sample=HG00593;GT=0/0;PCR_454_AR=2;PCR_454_RR=2173 +20 25478961 . G A . . Sample=HG01271;GT=0/0;PCR_454_AR=0;PCR_454_RR=2082 +20 30407977 . A G . . Sample=NA12287;GT=0/1;PCR_454_AR=1313;PCR_454_RR=1488 +20 30432438 . C T . . Sample=NA19352;GT=0/1;PCR_454_AR=1043;PCR_454_RR=964 +20 30432438 . C T . . Sample=NA19654;GT=0/1;PCR_454_AR=937;PCR_454_RR=1465 +20 30432570 . T C . . Sample=NA18510;GT=0/1;PCR_454_AR=1224;PCR_454_RR=1413 +20 30432570 . T C . . Sample=NA18858;GT=0/1;PCR_454_AR=1050;PCR_454_RR=1052 +20 30432570 . T C . . Sample=NA18868;GT=0/1;PCR_454_AR=1087;PCR_454_RR=966 +20 30432570 . T C . . Sample=NA18871;GT=0/1;PCR_454_AR=1178;PCR_454_RR=1344 +20 30432570 . T C . . Sample=NA18522;GT=1/1;PCR_454_AR=1873;PCR_454_RR=7 +20 30602754 . C T . . Sample=NA19749;GT=0/1;PCR_454_AR=63;PCR_454_RR=409 +20 30729618 . G A . . Sample=NA11994;GT=0/0;PCR_454_AR=0;PCR_454_RR=1866 +20 30729618 . G A . . Sample=NA07037;GT=0/1;PCR_454_AR=1373;PCR_454_RR=1435 +20 30729618 . G A . . Sample=NA12058;GT=0/1;PCR_454_AR=963;PCR_454_RR=990 +20 30729618 . G A . . Sample=NA12144;GT=0/1;PCR_454_AR=1419;PCR_454_RR=1136 +20 30729618 . G A . . Sample=NA12282;GT=0/1;PCR_454_AR=1353;PCR_454_RR=1148 +20 30789767 . G A . . Sample=HG00350;GT=0/0;PCR_454_AR=36;PCR_454_RR=553 +20 30897726 . G A . . Sample=NA20507;GT=0/0;PCR_454_AR=239;PCR_454_RR=2404 +20 30918043 . C T . . Sample=NA19707;GT=0/1;PCR_454_AR=1147;PCR_454_RR=1123 +20 30918043 . C T . . Sample=NA20775;GT=0/1;PCR_454_AR=1234;PCR_454_RR=1140 +20 31021429 . G C . . Sample=NA18870;GT=0/1;PCR_454_AR=747;PCR_454_RR=929 +20 31021429 . G C . . Sample=NA19319;GT=0/1;PCR_454_AR=585;PCR_454_RR=657 +20 31021429 . G C . . Sample=NA19445;GT=0/1;PCR_454_AR=531;PCR_454_RR=553 +20 31021429 . G C . . Sample=NA20127;GT=0/1;PCR_454_AR=661;PCR_454_RR=679 +20 31021429 . G C . . Sample=NA20317;GT=0/1;PCR_454_AR=874;PCR_454_RR=917 +20 31022764 . C T . . Sample=NA18498;GT=0/1;PCR_454_AR=1455;PCR_454_RR=1259 +20 31022764 . C T . . Sample=NA18507;GT=0/1;PCR_454_AR=1020;PCR_454_RR=972 +20 31022764 . C T . . Sample=NA18511;GT=0/1;PCR_454_AR=1339;PCR_454_RR=1297 +20 31022764 . C T . . Sample=NA18856;GT=0/1;PCR_454_AR=1582;PCR_454_RR=1572 +20 31022764 . C T . . Sample=NA18870;GT=0/1;PCR_454_AR=1642;PCR_454_RR=1613 +20 31024033 . G A . . Sample=HG01356;GT=0/1;PCR_454_AR=1045;PCR_454_RR=1002 +20 31024033 . G A . . Sample=NA18537;GT=0/1;PCR_454_AR=794;PCR_454_RR=788 +20 31024033 . G A . . Sample=NA18557;GT=0/1;PCR_454_AR=830;PCR_454_RR=795 +20 31024033 . G A . . Sample=NA18558;GT=0/1;PCR_454_AR=833;PCR_454_RR=878 +20 31024033 . G A . . Sample=NA18637;GT=1/1;PCR_454_AR=1528;PCR_454_RR=6 +20 31040782 . G A . . Sample=HG00097;GT=0/1;PCR_454_AR=978;PCR_454_RR=1231 +20 31040782 . G A . . Sample=HG00179;GT=0/1;PCR_454_AR=1054;PCR_454_RR=993 +20 31040782 . G A . . Sample=HG01620;GT=0/1;PCR_454_AR=1091;PCR_454_RR=1111 +20 31040782 . G A . . Sample=NA12273;GT=0/1;PCR_454_AR=1073;PCR_454_RR=1182 +20 31040782 . G A . . Sample=NA12341;GT=0/1;PCR_454_AR=1102;PCR_454_RR=1318 +20 31375167 . G A . . Sample=NA18486;GT=0/1;PCR_454_AR=563;PCR_454_RR=523 +20 31375167 . G A . . Sample=NA19113;GT=0/1;PCR_454_AR=628;PCR_454_RR=620 +20 31388076 . C T . . Sample=NA18504;GT=0/1;PCR_454_AR=809;PCR_454_RR=773 +20 31388076 . C T . . Sample=NA18519;GT=0/1;PCR_454_AR=683;PCR_454_RR=752 +20 31388076 . C T . . Sample=NA18856;GT=0/1;PCR_454_AR=1012;PCR_454_RR=1073 +20 31388076 . C T . . Sample=NA18917;GT=0/1;PCR_454_AR=888;PCR_454_RR=931 +20 31388076 . C T . . Sample=NA18522;GT=1/1;PCR_454_AR=1422;PCR_454_RR=2 +20 31424592 . C T . . Sample=NA19146;GT=0/1;PCR_454_AR=237;PCR_454_RR=257 +20 31434427 . A G . . Sample=NA11995;GT=0/1;PCR_454_AR=325;PCR_454_RR=325 +20 31604884 . A G . . Sample=NA12748;GT=0/1;PCR_454_AR=1098;PCR_454_RR=1153 +20 31606483 . G C . . Sample=NA18740;GT=0/1;PCR_454_AR=595;PCR_454_RR=964 +20 31606907 . G A . . Sample=NA19753;GT=0/0;PCR_454_AR=0;PCR_454_RR=1627 +20 31606907 . G A . . Sample=NA19747;GT=0/1;PCR_454_AR=952;PCR_454_RR=884 +20 31622899 . A G . . Sample=NA19038;GT=0/1;PCR_454_AR=196;PCR_454_RR=111 +20 31626754 . G A . . Sample=NA18579;GT=0/1;PCR_454_AR=941;PCR_454_RR=902 +20 31643241 . A C . . Sample=NA18622;GT=0/1;PCR_454_AR=832;PCR_454_RR=877 +20 31659074 . G A . . Sample=NA19449;GT=0/1;PCR_454_AR=915;PCR_454_RR=863 +20 31672711 . A G . . Sample=NA20754;GT=0/1;PCR_454_AR=762;PCR_454_RR=820 +20 31680333 . C T . . Sample=HG00156;GT=0/1;PCR_454_AR=446;PCR_454_RR=438 +20 31680333 . C T . . Sample=HG00235;GT=0/1;PCR_454_AR=525;PCR_454_RR=435 +20 31680333 . C T . . Sample=HG01125;GT=0/1;PCR_454_AR=433;PCR_454_RR=415 +20 31680333 . C T . . Sample=NA12043;GT=0/1;PCR_454_AR=559;PCR_454_RR=477 +20 31680333 . C T . . Sample=NA12046;GT=0/1;PCR_454_AR=364;PCR_454_RR=330 +20 31695565 . C T . . Sample=NA19054;GT=0/1;PCR_454_AR=988;PCR_454_RR=944 +20 31889182 . T C . . Sample=HG01277;GT=0/1;PCR_454_AR=594;PCR_454_RR=639 +20 31889182 . T C . . Sample=HG01278;GT=0/1;PCR_454_AR=533;PCR_454_RR=540 +20 31889182 . T C . . Sample=HG01623;GT=0/1;PCR_454_AR=703;PCR_454_RR=668 +20 31889182 . T C . . Sample=NA18487;GT=0/1;PCR_454_AR=644;PCR_454_RR=647 +20 31889182 . T C . . Sample=NA18486;GT=1/1;PCR_454_AR=1419;PCR_454_RR=15 +20 31890796 . G A . . Sample=NA18595;GT=0/1;PCR_454_AR=36;PCR_454_RR=49 +20 31967485 . T C . . Sample=NA18757;GT=0/0;PCR_454_AR=4;PCR_454_RR=1506 +20 32162066 . G C . . Sample=HG00099;GT=0/1;PCR_454_AR=98;PCR_454_RR=92 +20 32162066 . G C . . Sample=NA12282;GT=0/1;PCR_454_AR=72;PCR_454_RR=74 +20 32162066 . G C . . Sample=NA12342;GT=0/1;PCR_454_AR=105;PCR_454_RR=134 +20 32162066 . G C . . Sample=NA12778;GT=0/1;PCR_454_AR=94;PCR_454_RR=122 +20 32162066 . G C . . Sample=NA19773;GT=0/1;PCR_454_AR=84;PCR_454_RR=115 +20 32295637 . A G . . Sample=NA19204;GT=0/1;PCR_454_AR=1263;PCR_454_RR=1230 +20 32298533 . G A . . Sample=HG01125;GT=0/1;PCR_454_AR=1577;PCR_454_RR=1574 +20 32298533 . G A . . Sample=NA18510;GT=0/1;PCR_454_AR=1537;PCR_454_RR=1597 +20 32298533 . G A . . Sample=NA18520;GT=0/1;PCR_454_AR=1689;PCR_454_RR=1754 +20 32298533 . G A . . Sample=NA19099;GT=0/1;PCR_454_AR=1900;PCR_454_RR=1940 +20 32298533 . G A . . Sample=NA19129;GT=0/1;PCR_454_AR=1900;PCR_454_RR=1840 +20 32336754 . G A . . Sample=HG00358;GT=0/1;PCR_454_AR=1185;PCR_454_RR=1161 +20 32336754 . G A . . Sample=HG00565;GT=0/1;PCR_454_AR=1018;PCR_454_RR=958 +20 32336754 . G A . . Sample=HG00595;GT=0/1;PCR_454_AR=1201;PCR_454_RR=1222 +20 32336754 . G A . . Sample=NA18532;GT=0/1;PCR_454_AR=1204;PCR_454_RR=1235 +20 32336754 . G A . . Sample=NA18542;GT=1/1;PCR_454_AR=2997;PCR_454_RR=11 +20 32358043 . A T . . Sample=NA18955;GT=0/1;PCR_454_AR=1050;PCR_454_RR=1022 +20 32881901 . T C . . Sample=NA19257;GT=0/1;PCR_454_AR=1007;PCR_454_RR=966 +20 33328321 . C T . . Sample=NA18487;GT=0/1;PCR_454_AR=637;PCR_454_RR=629 +20 33328321 . C T . . Sample=NA18516;GT=0/1;PCR_454_AR=613;PCR_454_RR=605 +20 33328321 . C T . . Sample=NA19044;GT=0/1;PCR_454_AR=629;PCR_454_RR=661 +20 33328321 . C T . . Sample=NA19102;GT=0/1;PCR_454_AR=680;PCR_454_RR=625 +20 33328321 . C T . . Sample=NA19175;GT=0/1;PCR_454_AR=652;PCR_454_RR=703 +20 33330691 . C G . . Sample=NA19189;GT=0/1;PCR_454_AR=604;PCR_454_RR=575 +20 33433247 . G A . . Sample=NA11919;GT=0/1;PCR_454_AR=196;PCR_454_RR=195 +20 33447313 . C T . . Sample=HG01125;GT=0/1;PCR_454_AR=260;PCR_454_RR=285 +20 33447313 . C T . . Sample=NA18504;GT=0/1;PCR_454_AR=231;PCR_454_RR=217 +20 33447313 . C T . . Sample=NA18517;GT=0/1;PCR_454_AR=298;PCR_454_RR=311 +20 33447313 . C T . . Sample=NA18520;GT=0/1;PCR_454_AR=254;PCR_454_RR=256 +20 33447313 . C T . . Sample=NA18522;GT=0/1;PCR_454_AR=286;PCR_454_RR=277 +20 33517251 . C T . . Sample=HG00126;GT=0/1;PCR_454_AR=685;PCR_454_RR=676 +20 33517301 . G A . . Sample=NA20282;GT=0/1;PCR_454_AR=1082;PCR_454_RR=1076 +20 33523396 . A C . . Sample=NA18910;GT=0/1;PCR_454_AR=879;PCR_454_RR=933 +20 33572880 . C T . . Sample=NA20516;GT=0/1;PCR_454_AR=935;PCR_454_RR=847 +20 33575007 . C T . . Sample=NA19118;GT=0/1;PCR_454_AR=793;PCR_454_RR=659 +20 33575043 . C T . . Sample=NA19036;GT=0/1;PCR_454_AR=972;PCR_454_RR=919 +20 33575043 . C T . . Sample=NA19308;GT=0/1;PCR_454_AR=801;PCR_454_RR=728 +20 33575043 . C T . . Sample=NA19434;GT=0/1;PCR_454_AR=825;PCR_454_RR=915 +20 33575043 . C T . . Sample=NA19439;GT=0/1;PCR_454_AR=1001;PCR_454_RR=1073 +20 33575043 . C T . . Sample=NA19466;GT=0/1;PCR_454_AR=936;PCR_454_RR=931 +20 33583330 . A G . . Sample=HG00097;GT=1/1;PCR_454_AR=651;PCR_454_RR=5 +20 33583330 . A G . . Sample=HG00099;GT=1/1;PCR_454_AR=326;PCR_454_RR=0 +20 33583330 . A G . . Sample=HG00104;GT=1/1;PCR_454_AR=430;PCR_454_RR=2 +20 33583330 . A G . . Sample=HG00106;GT=1/1;PCR_454_AR=613;PCR_454_RR=3 +20 33583330 . A G . . Sample=HG00112;GT=1/1;PCR_454_AR=632;PCR_454_RR=6 +20 33584196 . C T . . Sample=NA12286;GT=0/1;PCR_454_AR=989;PCR_454_RR=1638 +20 33584196 . C T . . Sample=NA12750;GT=0/1;PCR_454_AR=886;PCR_454_RR=1206 +20 33584196 . C T . . Sample=NA19750;GT=0/1;PCR_454_AR=1179;PCR_454_RR=1155 +20 33584196 . C T . . Sample=NA20807;GT=0/1;PCR_454_AR=1089;PCR_454_RR=1724 +20 33584196 . C T . . Sample=NA20826;GT=0/1;PCR_454_AR=1373;PCR_454_RR=1259 +20 33587399 . G A . . Sample=NA19328;GT=0/1;PCR_454_AR=893;PCR_454_RR=754 +20 33711732 . T A . . Sample=NA19347;GT=0/1;PCR_454_AR=887;PCR_454_RR=946 +20 33874473 . C A . . Sample=NA18626;GT=0/1;PCR_454_AR=1001;PCR_454_RR=1012 +20 33874719 . C T . . Sample=HG00099;GT=0/1;PCR_454_AR=585;PCR_454_RR=542 +20 33874719 . C T . . Sample=HG00141;GT=0/1;PCR_454_AR=499;PCR_454_RR=508 +20 33874719 . C T . . Sample=HG00142;GT=0/1;PCR_454_AR=541;PCR_454_RR=540 +20 33874719 . C T . . Sample=HG00143;GT=0/1;PCR_454_AR=699;PCR_454_RR=604 +20 33874719 . C T . . Sample=HG00156;GT=0/1;PCR_454_AR=722;PCR_454_RR=617 +20 34092317 . C A . . Sample=HG00128;GT=0/0;PCR_454_AR=0;PCR_454_RR=1205 +20 34092317 . C A . . Sample=HG00266;GT=0/0;PCR_454_AR=3;PCR_454_RR=3354 +20 34218898 . A G . . Sample=NA12763;GT=0/1;PCR_454_AR=295;PCR_454_RR=291 +20 34292440 . T C . . Sample=NA18639;GT=0/1;PCR_454_AR=481;PCR_454_RR=572 +20 34317286 . G A . . Sample=NA19204;GT=0/1;PCR_454_AR=665;PCR_454_RR=705 +20 34611604 . C T . . Sample=NA11893;GT=0/1;PCR_454_AR=1180;PCR_454_RR=1243 +20 35060852 . G A . . Sample=NA12283;GT=0/1;PCR_454_AR=433;PCR_454_RR=444 +20 35060852 . G A . . Sample=NA19676;GT=0/1;PCR_454_AR=368;PCR_454_RR=421 +20 35068262 . A C . . Sample=NA20759;GT=0/1;PCR_454_AR=1272;PCR_454_RR=1190 +20 35075140 . C T . . Sample=NA19444;GT=0/1;PCR_454_AR=1174;PCR_454_RR=605 +20 35075140 . C T . . Sample=NA19448;GT=0/1;PCR_454_AR=1574;PCR_454_RR=932 +20 35075309 . G A . . Sample=NA18549;GT=0/1;PCR_454_AR=923;PCR_454_RR=1559 +20 35075309 . G A . . Sample=NA19391;GT=0/1;PCR_454_AR=1114;PCR_454_RR=1064 +20 35075309 . G A . . Sample=NA19397;GT=0/1;PCR_454_AR=1198;PCR_454_RR=1233 +20 35176551 . A G . . Sample=NA20289;GT=0/1;PCR_454_AR=532;PCR_454_RR=1682 +20 35207263 . G A . . Sample=HG00234;GT=0/1;PCR_454_AR=235;PCR_454_RR=221 +20 35219406 . G C . . Sample=HG00105;GT=0/0;PCR_454_AR=57;PCR_454_RR=585 +20 35219406 . G C . . Sample=HG00130;GT=0/0;PCR_454_AR=58;PCR_454_RR=574 +20 35438474 . G A . . Sample=NA18642;GT=0/1;PCR_454_AR=1030;PCR_454_RR=1093 +20 35507540 . G A . . Sample=NA19740;GT=0/1;PCR_454_AR=466;PCR_454_RR=584 +20 35539699 . T C . . Sample=NA12717;GT=0/1;PCR_454_AR=336;PCR_454_RR=421 +20 35812756 . C T . . Sample=NA19726;GT=0/1;PCR_454_AR=1085;PCR_454_RR=1070 +20 35944759 . A C . . Sample=NA11831;GT=0/0;PCR_454_AR=1;PCR_454_RR=1726 +20 35944759 . A C . . Sample=NA11832;GT=0/0;PCR_454_AR=3;PCR_454_RR=1809 +20 36024598 . C T . . Sample=NA19682;GT=0/1;PCR_454_AR=677;PCR_454_RR=797 +20 36024598 . C T . . Sample=NA20528;GT=0/1;PCR_454_AR=691;PCR_454_RR=703 +20 36030944 . T C . . Sample=NA18618;GT=0/0;PCR_454_AR=0;PCR_454_RR=985 +20 36030944 . T C . . Sample=NA18626;GT=0/0;PCR_454_AR=2;PCR_454_RR=778 +20 36030944 . T C . . Sample=NA18916;GT=0/1;PCR_454_AR=454;PCR_454_RR=444 +20 36030944 . T C . . Sample=NA19150;GT=0/1;PCR_454_AR=471;PCR_454_RR=509 +20 36488331 . A G . . Sample=NA20340;GT=0/1;PCR_454_AR=1388;PCR_454_RR=1472 +20 36640610 . C G . . Sample=NA18508;GT=0/1;PCR_454_AR=985;PCR_454_RR=1026 +20 36641870 . G A . . Sample=HG00106;GT=0/1;PCR_454_AR=1062;PCR_454_RR=1095 +20 36641870 . G A . . Sample=NA11893;GT=0/1;PCR_454_AR=976;PCR_454_RR=1033 +20 36641870 . G A . . Sample=NA12399;GT=0/1;PCR_454_AR=971;PCR_454_RR=973 +20 36641870 . G A . . Sample=NA12489;GT=0/1;PCR_454_AR=1107;PCR_454_RR=1037 +20 36641870 . G A . . Sample=NA12749;GT=0/1;PCR_454_AR=947;PCR_454_RR=885 +20 36775155 . A G . . Sample=NA19067;GT=0/1;PCR_454_AR=771;PCR_454_RR=772 +20 36775233 . G A . . Sample=NA19352;GT=0/1;PCR_454_AR=732;PCR_454_RR=723 +20 36784261 . G A . . Sample=NA19171;GT=0/1;PCR_454_AR=1197;PCR_454_RR=1200 +20 36841848 . C T . . Sample=NA19449;GT=0/1;PCR_454_AR=402;PCR_454_RR=394 +20 36869075 . G A . . Sample=NA19185;GT=0/1;PCR_454_AR=1430;PCR_454_RR=1382 +20 36869206 . C T . . Sample=NA20287;GT=0/1;PCR_454_AR=584;PCR_454_RR=626 +20 36979308 . T A . . Sample=NA11894;GT=0/1;PCR_454_AR=973;PCR_454_RR=1087 +20 37001736 . C T . . Sample=NA18987;GT=0/1;PCR_454_AR=122;PCR_454_RR=88 +20 39798902 . C T . . Sample=NA18994;GT=0/1;PCR_454_AR=1212;PCR_454_RR=1202 +20 39981307 . G T . . Sample=NA18595;GT=0/1;PCR_454_AR=1273;PCR_454_RR=1102 +20 39981307 . G T . . Sample=NA18622;GT=0/1;PCR_454_AR=635;PCR_454_RR=623 +20 39981307 . G T . . Sample=NA18977;GT=0/1;PCR_454_AR=1251;PCR_454_RR=1141 +20 39981307 . G T . . Sample=NA18978;GT=0/1;PCR_454_AR=1286;PCR_454_RR=1331 +20 39981307 . G T . . Sample=NA18998;GT=0/1;PCR_454_AR=1174;PCR_454_RR=1225 +20 39986913 . G A . . Sample=NA20317;GT=0/1;PCR_454_AR=627;PCR_454_RR=535 +20 39987386 . G A . . Sample=NA19437;GT=0/1;PCR_454_AR=989;PCR_454_RR=971 +20 39992390 . G A . . Sample=NA18636;GT=0/1;PCR_454_AR=925;PCR_454_RR=969 +20 39993723 . C T . . Sample=NA18489;GT=0/1;PCR_454_AR=677;PCR_454_RR=819 +20 39993723 . C T . . Sample=NA18505;GT=0/1;PCR_454_AR=603;PCR_454_RR=578 +20 39993723 . C T . . Sample=NA18517;GT=0/1;PCR_454_AR=791;PCR_454_RR=747 +20 39993723 . C T . . Sample=NA19380;GT=0/1;PCR_454_AR=869;PCR_454_RR=972 +20 39993790 . G A . . Sample=NA18871;GT=0/1;PCR_454_AR=2297;PCR_454_RR=2512 +20 40033848 . A G . . Sample=HG00559;GT=0/0;PCR_454_AR=6;PCR_454_RR=2130 +20 40050233 . T G . . Sample=HG01133;GT=0/0;PCR_454_AR=2;PCR_454_RR=1613 +20 40050233 . T G . . Sample=NA18502;GT=0/0;PCR_454_AR=4;PCR_454_RR=1967 +20 40162202 . T C . . Sample=NA12874;GT=0/1;PCR_454_AR=171;PCR_454_RR=157 +20 42143783 . A G . . Sample=NA20334;GT=0/1;PCR_454_AR=1011;PCR_454_RR=632 +20 42143783 . A G . . Sample=NA20336;GT=0/1;PCR_454_AR=1556;PCR_454_RR=492 +20 42196587 . G A . . Sample=NA19312;GT=0/1;PCR_454_AR=522;PCR_454_RR=486 +20 42196587 . G A . . Sample=NA19383;GT=0/1;PCR_454_AR=693;PCR_454_RR=821 +20 42333997 . C T . . Sample=NA19058;GT=0/1;PCR_454_AR=994;PCR_454_RR=994 +20 42680115 . G A . . Sample=NA18611;GT=0/1;PCR_454_AR=1042;PCR_454_RR=1086 +20 42747246 . C T . . Sample=HG00097;GT=0/1;PCR_454_AR=1132;PCR_454_RR=1174 +20 42747246 . C T . . Sample=HG00106;GT=0/1;PCR_454_AR=899;PCR_454_RR=983 +20 42747246 . C T . . Sample=HG00112;GT=0/1;PCR_454_AR=901;PCR_454_RR=960 +20 42747246 . C T . . Sample=HG00135;GT=0/1;PCR_454_AR=677;PCR_454_RR=680 +20 42747246 . C T . . Sample=HG00142;GT=0/1;PCR_454_AR=928;PCR_454_RR=956 +20 42939738 . C T . . Sample=NA18611;GT=0/1;PCR_454_AR=1131;PCR_454_RR=984 +20 43243299 . G C . . Sample=NA18633;GT=0/1;PCR_454_AR=1194;PCR_454_RR=1277 +20 43255152 . G A . . Sample=HG00130;GT=0/0;PCR_454_AR=0;PCR_454_RR=2287 +20 43255152 . G A . . Sample=HG00234;GT=0/0;PCR_454_AR=1;PCR_454_RR=2172 +20 43255152 . G A . . Sample=NA18618;GT=0/0;PCR_454_AR=2;PCR_454_RR=2266 +20 43255152 . G A . . Sample=NA18956;GT=0/0;PCR_454_AR=0;PCR_454_RR=2152 +20 43255152 . G A . . Sample=NA19083;GT=0/1;PCR_454_AR=986;PCR_454_RR=974 +20 43723672 . G A . . Sample=NA18530;GT=0/1;PCR_454_AR=356;PCR_454_RR=401 +20 43723672 . G A . . Sample=NA18622;GT=0/1;PCR_454_AR=449;PCR_454_RR=391 +20 43739354 . G A . . Sample=NA18504;GT=0/1;PCR_454_AR=455;PCR_454_RR=1477 +20 43934213 . G T . . Sample=HG01345;GT=0/1;PCR_454_AR=1327;PCR_454_RR=1169 +20 44190750 . T G . . Sample=HG00143;GT=0/1;PCR_454_AR=898;PCR_454_RR=938 +20 44190750 . T G . . Sample=NA12340;GT=0/1;PCR_454_AR=882;PCR_454_RR=872 +20 44424037 . G A . . Sample=HG00152;GT=0/1;PCR_454_AR=603;PCR_454_RR=593 +20 44469565 . C T . . Sample=NA18549;GT=0/1;PCR_454_AR=999;PCR_454_RR=246 +20 44485866 . T A . . Sample=NA12890;GT=0/1;PCR_454_AR=536;PCR_454_RR=596 +20 44506417 . G A . . Sample=HG00099;GT=0/1;PCR_454_AR=1320;PCR_454_RR=1305 +20 44506417 . G A . . Sample=HG00118;GT=0/1;PCR_454_AR=1559;PCR_454_RR=1533 +20 44506417 . G A . . Sample=HG00097;GT=1/1;PCR_454_AR=3211;PCR_454_RR=20 +20 44506417 . G A . . Sample=HG00112;GT=1/1;PCR_454_AR=2632;PCR_454_RR=20 +20 44506417 . G A . . Sample=HG00122;GT=1/1;PCR_454_AR=2875;PCR_454_RR=6 +20 44506987 . G C . . Sample=NA19117;GT=0/1;PCR_454_AR=1387;PCR_454_RR=1532 +20 44511253 . C T . . Sample=NA20799;GT=0/1;PCR_454_AR=1286;PCR_454_RR=1280 +20 44519372 . G A . . Sample=NA19437;GT=0/0;PCR_454_AR=0;PCR_454_RR=2075 +20 44519372 . G A . . Sample=NA19917;GT=0/1;PCR_454_AR=1243;PCR_454_RR=1234 +20 44576246 . G A . . Sample=NA18912;GT=0/1;PCR_454_AR=458;PCR_454_RR=2154 +20 44576246 . G A . . Sample=NA18924;GT=0/1;PCR_454_AR=1131;PCR_454_RR=1078 +20 44576246 . G A . . Sample=NA20276;GT=0/1;PCR_454_AR=860;PCR_454_RR=852 +20 44576246 . G A . . Sample=NA20289;GT=0/1;PCR_454_AR=492;PCR_454_RR=2174 +20 44580998 . T C . . Sample=NA18566;GT=0/1;PCR_454_AR=877;PCR_454_RR=925 +20 44680318 . C G . . Sample=HG00592;GT=0/0;PCR_454_AR=0;PCR_454_RR=3602 +20 44680318 . C G . . Sample=HG01139;GT=0/0;PCR_454_AR=1;PCR_454_RR=3510 +20 44856207 . G A . . Sample=NA11995;GT=0/1;PCR_454_AR=127;PCR_454_RR=17 +20 44980779 . G A . . Sample=NA18553;GT=0/1;PCR_454_AR=993;PCR_454_RR=1022 +20 45919012 . C T . . Sample=NA19445;GT=0/1;PCR_454_AR=265;PCR_454_RR=525 +20 46271051 . C G . . Sample=NA18486;GT=0/1;PCR_454_AR=754;PCR_454_RR=749 +20 47262594 . C A . . Sample=NA20291;GT=0/1;PCR_454_AR=1210;PCR_454_RR=1153 +20 47558430 . C T . . Sample=NA20296;GT=0/1;PCR_454_AR=699;PCR_454_RR=682 +20 47733688 . T C . . Sample=NA18630;GT=0/0;PCR_454_AR=0;PCR_454_RR=806 +20 47739668 . G A . . Sample=NA19036;GT=0/0;PCR_454_AR=1;PCR_454_RR=2292 +20 47886859 . C T . . Sample=NA18956;GT=0/0;PCR_454_AR=1;PCR_454_RR=2153 +20 47990798 . C G . . Sample=HG00105;GT=0/0;PCR_454_AR=0;PCR_454_RR=387 +20 47990798 . C G . . Sample=HG00122;GT=0/0;PCR_454_AR=0;PCR_454_RR=534 +20 48124475 . C T . . Sample=NA19257;GT=0/1;PCR_454_AR=628;PCR_454_RR=644 +20 48273201 . A C . . Sample=NA19914;GT=0/1;PCR_454_AR=338;PCR_454_RR=323 +20 48713355 . T C . . Sample=NA12155;GT=0/0;PCR_454_AR=8;PCR_454_RR=1686 +20 48713355 . T C . . Sample=NA12815;GT=0/0;PCR_454_AR=10;PCR_454_RR=1607 +20 49218698 . C T . . Sample=NA19338;GT=0/1;PCR_454_AR=776;PCR_454_RR=682 +20 49218698 . C T . . Sample=NA19457;GT=0/1;PCR_454_AR=803;PCR_454_RR=759 +20 49219065 . C T . . Sample=NA18599;GT=0/1;PCR_454_AR=1018;PCR_454_RR=1080 +20 49354597 . A G . . Sample=HG00177;GT=0/1;PCR_454_AR=580;PCR_454_RR=617 +20 49354597 . A G . . Sample=NA11829;GT=0/1;PCR_454_AR=778;PCR_454_RR=869 +20 49354597 . A G . . Sample=NA20510;GT=0/1;PCR_454_AR=518;PCR_454_RR=631 +20 49354597 . A G . . Sample=NA20512;GT=0/1;PCR_454_AR=238;PCR_454_RR=333 +20 49354597 . A G . . Sample=NA20586;GT=0/1;PCR_454_AR=562;PCR_454_RR=642 +20 50048925 . G C . . Sample=NA20507;GT=0/1;PCR_454_AR=774;PCR_454_RR=809 +20 50051804 . C T . . Sample=NA19102;GT=0/1;PCR_454_AR=136;PCR_454_RR=155 +20 50071136 . C T . . Sample=NA18637;GT=0/1;PCR_454_AR=334;PCR_454_RR=349 +20 50140178 . G A . . Sample=NA18924;GT=0/1;PCR_454_AR=540;PCR_454_RR=481 +20 50140178 . G A . . Sample=NA19321;GT=0/1;PCR_454_AR=481;PCR_454_RR=652 +20 50235576 . G A . . Sample=HG00106;GT=0/1;PCR_454_AR=982;PCR_454_RR=886 +20 50235576 . G A . . Sample=HG00122;GT=0/1;PCR_454_AR=838;PCR_454_RR=717 +20 50235576 . G A . . Sample=HG00126;GT=0/1;PCR_454_AR=795;PCR_454_RR=769 +20 50235576 . G A . . Sample=HG00135;GT=0/1;PCR_454_AR=972;PCR_454_RR=930 +20 50235576 . G A . . Sample=HG00148;GT=0/1;PCR_454_AR=933;PCR_454_RR=931 +20 50310567 . C T . . Sample=NA19152;GT=0/1;PCR_454_AR=689;PCR_454_RR=773 +20 50310567 . C T . . Sample=NA19377;GT=0/1;PCR_454_AR=736;PCR_454_RR=683 +20 50406859 . G A . . Sample=NA19921;GT=0/1;PCR_454_AR=1045;PCR_454_RR=930 +20 50407501 . A C . . Sample=HG00118;GT=0/1;PCR_454_AR=569;PCR_454_RR=608 +20 50407508 . C T . . Sample=NA20534;GT=0/1;PCR_454_AR=753;PCR_454_RR=2120 +20 50408613 . A G . . Sample=NA18487;GT=0/1;PCR_454_AR=637;PCR_454_RR=634 +20 50408613 . A G . . Sample=NA18502;GT=0/1;PCR_454_AR=561;PCR_454_RR=553 +20 50408613 . A G . . Sample=NA18519;GT=0/1;PCR_454_AR=571;PCR_454_RR=554 +20 50408613 . A G . . Sample=NA18908;GT=0/1;PCR_454_AR=731;PCR_454_RR=791 +20 50408613 . A G . . Sample=NA18909;GT=0/1;PCR_454_AR=683;PCR_454_RR=634 +20 50803476 . G A . . Sample=NA19046;GT=0/1;PCR_454_AR=692;PCR_454_RR=685 +20 50803476 . G A . . Sample=NA19375;GT=0/1;PCR_454_AR=735;PCR_454_RR=803 +20 50803476 . G A . . Sample=NA19376;GT=0/1;PCR_454_AR=892;PCR_454_RR=831 +20 51872037 . G A . . Sample=NA18502;GT=0/1;PCR_454_AR=602;PCR_454_RR=654 +20 51872037 . G A . . Sample=NA18504;GT=0/1;PCR_454_AR=717;PCR_454_RR=760 +20 51872037 . G A . . Sample=NA18507;GT=0/1;PCR_454_AR=790;PCR_454_RR=822 +20 51872037 . G A . . Sample=NA18508;GT=0/1;PCR_454_AR=868;PCR_454_RR=914 +20 51872037 . G A . . Sample=NA18501;GT=1/1;PCR_454_AR=1687;PCR_454_RR=5 +20 52192483 . T C . . Sample=HG00266;GT=0/1;PCR_454_AR=1044;PCR_454_RR=1029 +20 52198279 . G A . . Sample=NA19065;GT=0/1;PCR_454_AR=1001;PCR_454_RR=1070 +20 52561468 . A G . . Sample=HG00118;GT=0/1;PCR_454_AR=398;PCR_454_RR=501 +20 52561468 . A G . . Sample=HG00126;GT=0/1;PCR_454_AR=228;PCR_454_RR=250 +20 52561468 . A G . . Sample=HG00130;GT=0/1;PCR_454_AR=472;PCR_454_RR=535 +20 52561468 . A G . . Sample=HG00134;GT=0/1;PCR_454_AR=462;PCR_454_RR=543 +20 52561468 . A G . . Sample=HG00143;GT=0/1;PCR_454_AR=355;PCR_454_RR=404 +20 52779394 . G T . . Sample=NA20540;GT=0/1;PCR_454_AR=470;PCR_454_RR=557 +20 53205268 . T C . . Sample=NA19038;GT=0/1;PCR_454_AR=447;PCR_454_RR=421 +20 53226967 . G A . . Sample=NA19462;GT=0/1;PCR_454_AR=770;PCR_454_RR=792 +20 54961540 . A T . . Sample=HG00106;GT=0/1;PCR_454_AR=457;PCR_454_RR=411 +20 54961540 . A T . . Sample=HG00112;GT=0/1;PCR_454_AR=466;PCR_454_RR=483 +20 54961540 . A T . . Sample=HG00134;GT=0/1;PCR_454_AR=480;PCR_454_RR=467 +20 54961540 . A T . . Sample=HG00143;GT=0/1;PCR_454_AR=522;PCR_454_RR=458 +20 54961540 . A T . . Sample=HG00097;GT=1/1;PCR_454_AR=937;PCR_454_RR=4 +20 54970682 . C T . . Sample=NA18912;GT=0/1;PCR_454_AR=683;PCR_454_RR=745 +20 54970682 . C T . . Sample=NA19171;GT=0/1;PCR_454_AR=819;PCR_454_RR=792 +20 55021021 . G A . . Sample=NA19087;GT=0/1;PCR_454_AR=1018;PCR_454_RR=1144 +20 55108414 . G A . . Sample=NA20756;GT=1/1;PCR_454_AR=1220;PCR_454_RR=3 +20 55206884 . C T . . Sample=NA19726;GT=0/1;PCR_454_AR=806;PCR_454_RR=864 +20 55206884 . C T . . Sample=NA19738;GT=0/1;PCR_454_AR=988;PCR_454_RR=1033 +20 56087684 . C T . . Sample=NA18599;GT=0/1;PCR_454_AR=1158;PCR_454_RR=1234 +20 56089789 . C T . . Sample=HG01277;GT=0/1;PCR_454_AR=737;PCR_454_RR=779 +20 56137833 . A G . . Sample=HG00099;GT=0/1;PCR_454_AR=794;PCR_454_RR=777 +20 56137833 . A G . . Sample=HG00106;GT=0/1;PCR_454_AR=1272;PCR_454_RR=1196 +20 56137833 . A G . . Sample=HG00097;GT=1/1;PCR_454_AR=1763;PCR_454_RR=4 +20 56137833 . A G . . Sample=HG00104;GT=1/1;PCR_454_AR=1726;PCR_454_RR=5 +20 56137833 . A G . . Sample=HG00112;GT=1/1;PCR_454_AR=1821;PCR_454_RR=3 +20 57036354 . C T . . Sample=NA19080;GT=0/1;PCR_454_AR=1722;PCR_454_RR=1581 +20 57036538 . C T . . Sample=NA19248;GT=0/1;PCR_454_AR=1224;PCR_454_RR=902 +20 57415535 . C T . . Sample=NA19722;GT=0/1;PCR_454_AR=291;PCR_454_RR=1503 +20 57415601 . G A . . Sample=NA20296;GT=0/1;PCR_454_AR=1262;PCR_454_RR=350 +20 57428947 . G T . . Sample=NA19311;GT=0/1;PCR_454_AR=1304;PCR_454_RR=553 +20 57572729 . C T . . Sample=NA19707;GT=0/1;PCR_454_AR=840;PCR_454_RR=1015 +20 57576684 . T G . . Sample=NA18747;GT=0/0;PCR_454_AR=3;PCR_454_RR=1578 +20 57597952 . C T . . Sample=NA20529;GT=0/1;PCR_454_AR=816;PCR_454_RR=883 +20 57768304 . G A . . Sample=NA20818;GT=0/1;PCR_454_AR=710;PCR_454_RR=535 +20 57769546 . C T . . Sample=NA18917;GT=0/0;PCR_454_AR=61;PCR_454_RR=810 +20 57769738 . A G . . Sample=NA18527;GT=0/1;PCR_454_AR=799;PCR_454_RR=792 +20 57769738 . A G . . Sample=NA18530;GT=0/1;PCR_454_AR=558;PCR_454_RR=527 +20 57769738 . A G . . Sample=NA18532;GT=0/1;PCR_454_AR=734;PCR_454_RR=719 +20 57769738 . A G . . Sample=NA18545;GT=0/1;PCR_454_AR=524;PCR_454_RR=502 +20 57769738 . A G . . Sample=NA18593;GT=0/1;PCR_454_AR=809;PCR_454_RR=835 +20 58444902 . C T . . Sample=NA19095;GT=0/1;PCR_454_AR=164;PCR_454_RR=144 +20 58467100 . C T . . Sample=NA19324;GT=0/1;PCR_454_AR=312;PCR_454_RR=301 +20 58560056 . C T . . Sample=HG00593;GT=0/1;PCR_454_AR=1491;PCR_454_RR=1378 +20 58560056 . C T . . Sample=NA18553;GT=0/1;PCR_454_AR=1226;PCR_454_RR=1216 +20 58564005 . G A . . Sample=NA19355;GT=0/0;PCR_454_AR=0;PCR_454_RR=2602 +20 58567458 . A C . . Sample=HG00143;GT=0/0;PCR_454_AR=1;PCR_454_RR=878 +20 58567458 . A C . . Sample=HG00149;GT=0/0;PCR_454_AR=0;PCR_454_RR=883 +20 58571705 . C T . . Sample=NA19319;GT=0/1;PCR_454_AR=342;PCR_454_RR=265 +20 60504808 . C T . . Sample=NA18639;GT=0/1;PCR_454_AR=1079;PCR_454_RR=1027 +20 60504808 . C T . . Sample=NA19921;GT=0/1;PCR_454_AR=914;PCR_454_RR=890 +20 60701482 . T A . . Sample=NA19651;GT=0/1;PCR_454_AR=540;PCR_454_RR=612 +20 60708462 . T C . . Sample=NA18962;GT=0/1;PCR_454_AR=891;PCR_454_RR=784 +20 60738559 . G A . . Sample=NA18965;GT=0/1;PCR_454_AR=1072;PCR_454_RR=896 +20 60838713 . C T . . Sample=NA20506;GT=0/1;PCR_454_AR=618;PCR_454_RR=642 +20 60866830 . A C . . Sample=NA18923;GT=0/0;PCR_454_AR=0;PCR_454_RR=211 +20 60868936 . C T . . Sample=NA19119;GT=0/1;PCR_454_AR=1424;PCR_454_RR=1554 +20 60878814 . G A . . Sample=NA18638;GT=0/1;PCR_454_AR=223;PCR_454_RR=1299 +20 60884465 . G A . . Sample=NA19681;GT=0/1;PCR_454_AR=928;PCR_454_RR=1002 +20 60885810 . C T . . Sample=HG00134;GT=0/0;PCR_454_AR=2;PCR_454_RR=2017 +20 60885810 . C T . . Sample=HG00350;GT=0/0;PCR_454_AR=4;PCR_454_RR=1963 +20 60886712 . T C . . Sample=NA19438;GT=0/1;PCR_454_AR=929;PCR_454_RR=721 +20 60891010 . C T . . Sample=NA19700;GT=0/1;PCR_454_AR=334;PCR_454_RR=389 +20 60893610 . C T . . Sample=HG00359;GT=0/0;PCR_454_AR=2;PCR_454_RR=2041 +20 60893610 . C T . . Sample=NA19758;GT=0/1;PCR_454_AR=1173;PCR_454_RR=1158 +20 60893636 . C T . . Sample=NA20520;GT=0/1;PCR_454_AR=847;PCR_454_RR=1197 +20 60893636 . C T . . Sample=NA20540;GT=0/1;PCR_454_AR=776;PCR_454_RR=1355 +20 60893960 . C T . . Sample=NA19236;GT=0/1;PCR_454_AR=1310;PCR_454_RR=1388 +20 60897486 . C T . . Sample=HG00099;GT=0/1;PCR_454_AR=454;PCR_454_RR=403 +20 60897486 . C T . . Sample=HG00122;GT=0/1;PCR_454_AR=465;PCR_454_RR=352 +20 60897486 . C T . . Sample=HG00097;GT=1/1;PCR_454_AR=849;PCR_454_RR=3 +20 60897486 . C T . . Sample=HG00104;GT=1/1;PCR_454_AR=925;PCR_454_RR=4 +20 60897486 . C T . . Sample=HG00118;GT=1/1;PCR_454_AR=799;PCR_454_RR=7 +20 60907674 . G A . . Sample=HG00104;GT=0/1;PCR_454_AR=279;PCR_454_RR=228 +20 60907674 . G A . . Sample=HG00106;GT=0/1;PCR_454_AR=334;PCR_454_RR=295 +20 60907674 . G A . . Sample=HG00097;GT=1/1;PCR_454_AR=739;PCR_454_RR=4 +20 60907674 . G A . . Sample=HG00099;GT=1/1;PCR_454_AR=395;PCR_454_RR=3 +20 60907674 . G A . . Sample=HG00112;GT=1/1;PCR_454_AR=980;PCR_454_RR=6 +20 60911433 . A C . . Sample=NA11920;GT=0/1;PCR_454_AR=341;PCR_454_RR=380 +20 60911433 . A C . . Sample=NA20278;GT=0/1;PCR_454_AR=398;PCR_454_RR=444 +20 60913173 . C T . . Sample=NA18522;GT=0/1;PCR_454_AR=1062;PCR_454_RR=1032 +20 60920914 . T C . . Sample=NA18530;GT=0/1;PCR_454_AR=937;PCR_454_RR=877 +20 60920914 . T C . . Sample=NA18873;GT=0/1;PCR_454_AR=791;PCR_454_RR=836 +20 60920914 . T C . . Sample=NA19038;GT=0/1;PCR_454_AR=895;PCR_454_RR=857 +20 60920914 . T C . . Sample=NA19099;GT=0/1;PCR_454_AR=1115;PCR_454_RR=1150 +20 60920914 . T C . . Sample=NA19317;GT=0/1;PCR_454_AR=1165;PCR_454_RR=1206 +20 60927411 . G A . . Sample=HG00099;GT=0/1;PCR_454_AR=330;PCR_454_RR=345 +20 60927411 . G A . . Sample=HG00112;GT=0/1;PCR_454_AR=389;PCR_454_RR=468 +20 60927411 . G A . . Sample=HG00118;GT=0/1;PCR_454_AR=1434;PCR_454_RR=538 +20 60927411 . G A . . Sample=HG00097;GT=1/1;PCR_454_AR=993;PCR_454_RR=7 +20 60927411 . G A . . Sample=HG00104;GT=1/1;PCR_454_AR=837;PCR_454_RR=8 +20 60937543 . A G . . Sample=HG00115;GT=0/0;PCR_454_AR=2;PCR_454_RR=3444 +20 60963387 . C T . . Sample=NA18992;GT=0/1;PCR_454_AR=689;PCR_454_RR=728 +20 60986026 . T C . . Sample=NA18511;GT=0/1;PCR_454_AR=510;PCR_454_RR=522 +20 60986026 . T C . . Sample=NA18520;GT=0/1;PCR_454_AR=384;PCR_454_RR=403 +20 60986026 . T C . . Sample=NA18861;GT=0/1;PCR_454_AR=372;PCR_454_RR=432 +20 60986026 . T C . . Sample=NA18908;GT=0/1;PCR_454_AR=428;PCR_454_RR=386 +20 60989186 . G T . . Sample=HG00351;GT=0/0;PCR_454_AR=0;PCR_454_RR=299 +20 60989186 . G T . . Sample=HG00099;GT=0/1;PCR_454_AR=1182;PCR_454_RR=966 +20 60989186 . G T . . Sample=HG01344;GT=0/1;PCR_454_AR=654;PCR_454_RR=302 +20 60989186 . G T . . Sample=NA12045;GT=0/1;PCR_454_AR=504;PCR_454_RR=534 +20 60989186 . G T . . Sample=HG00130;GT=1/1;PCR_454_AR=76;PCR_454_RR=2 +20 60992370 . C T . . Sample=NA18917;GT=0/1;PCR_454_AR=598;PCR_454_RR=363 +20 60992370 . C T . . Sample=NA19453;GT=0/1;PCR_454_AR=541;PCR_454_RR=677 +20 61288592 . G A . . Sample=HG01625;GT=0/1;PCR_454_AR=852;PCR_454_RR=871 +20 61288592 . G A . . Sample=NA12383;GT=0/1;PCR_454_AR=794;PCR_454_RR=737 +20 61288592 . G A . . Sample=NA19780;GT=0/1;PCR_454_AR=1012;PCR_454_RR=880 +20 61288592 . G A . . Sample=NA20508;GT=0/1;PCR_454_AR=913;PCR_454_RR=773 +20 61512157 . C T . . Sample=NA18933;GT=0/1;PCR_454_AR=1227;PCR_454_RR=1206 +20 61512157 . C T . . Sample=NA18934;GT=0/1;PCR_454_AR=1110;PCR_454_RR=1182 +20 61512157 . C T . . Sample=NA19771;GT=0/1;PCR_454_AR=1250;PCR_454_RR=1148 +20 61512982 . T A . . Sample=NA18559;GT=0/1;PCR_454_AR=1255;PCR_454_RR=1117 +20 61513433 . T C . . Sample=NA20810;GT=0/0;PCR_454_AR=1;PCR_454_RR=550 +20 61525226 . G A . . Sample=NA19428;GT=0/1;PCR_454_AR=719;PCR_454_RR=719 +20 61542496 . G C . . Sample=NA19648;GT=0/1;PCR_454_AR=237;PCR_454_RR=1305 +20 61574860 . C T . . Sample=NA19762;GT=0/1;PCR_454_AR=703;PCR_454_RR=488 +20 61591950 . T G . . Sample=HG00106;GT=0/0;PCR_454_AR=2;PCR_454_RR=1219 +20 61591950 . T G . . Sample=HG00122;GT=0/0;PCR_454_AR=0;PCR_454_RR=1227 +20 61833992 . G A . . Sample=NA18489;GT=0/1;PCR_454_AR=738;PCR_454_RR=786 +20 61833992 . G A . . Sample=NA19093;GT=0/1;PCR_454_AR=839;PCR_454_RR=739 +20 61834856 . G A . . Sample=NA19041;GT=0/1;PCR_454_AR=389;PCR_454_RR=374 +20 61834856 . G A . . Sample=NA19095;GT=0/1;PCR_454_AR=383;PCR_454_RR=364 +20 61834856 . G A . . Sample=NA19113;GT=0/1;PCR_454_AR=322;PCR_454_RR=325 +20 61834856 . G A . . Sample=NA19318;GT=0/1;PCR_454_AR=434;PCR_454_RR=399 +20 61834856 . G A . . Sample=NA19334;GT=0/1;PCR_454_AR=380;PCR_454_RR=343 +20 61943307 . G C . . Sample=NA19201;GT=0/1;PCR_454_AR=920;PCR_454_RR=890 +20 61943346 . G A . . Sample=NA19758;GT=0/1;PCR_454_AR=683;PCR_454_RR=705 +20 62187372 . C G . . Sample=NA19117;GT=0/0;PCR_454_AR=0;PCR_454_RR=963 +20 62187668 . C T . . Sample=NA12154;GT=0/1;PCR_454_AR=905;PCR_454_RR=664 +20 62194106 . C T . . Sample=NA18910;GT=0/1;PCR_454_AR=1083;PCR_454_RR=1040 +20 62194106 . C T . . Sample=NA19338;GT=0/1;PCR_454_AR=784;PCR_454_RR=854 +20 62194106 . C T . . Sample=NA19346;GT=0/1;PCR_454_AR=757;PCR_454_RR=817 +20 62194106 . C T . . Sample=NA19376;GT=0/1;PCR_454_AR=1152;PCR_454_RR=962 +20 62194106 . C T . . Sample=NA19439;GT=0/1;PCR_454_AR=1387;PCR_454_RR=1456 +20 62194211 . C A . . Sample=HG00156;GT=0/1;PCR_454_AR=1116;PCR_454_RR=536 +20 62194211 . C A . . Sample=NA07051;GT=0/1;PCR_454_AR=2089;PCR_454_RR=259 +20 62194211 . C A . . Sample=NA12003;GT=0/1;PCR_454_AR=1330;PCR_454_RR=796 +20 62194290 . C T . . Sample=NA19346;GT=0/1;PCR_454_AR=1000;PCR_454_RR=751 +20 62194290 . C T . . Sample=NA19351;GT=0/1;PCR_454_AR=901;PCR_454_RR=771 +20 62198552 . G C . . Sample=NA20542;GT=0/1;PCR_454_AR=1527;PCR_454_RR=1010 +20 62198883 . C T . . Sample=NA19346;GT=0/1;PCR_454_AR=1447;PCR_454_RR=1455 +20 62198883 . C T . . Sample=NA19351;GT=0/1;PCR_454_AR=903;PCR_454_RR=1401 +20 62198883 . C T . . Sample=NA20340;GT=0/1;PCR_454_AR=843;PCR_454_RR=892 +20 62198960 . G A . . Sample=NA20534;GT=0/1;PCR_454_AR=1223;PCR_454_RR=864 +20 62200240 . G A . . Sample=NA18910;GT=0/1;PCR_454_AR=1221;PCR_454_RR=1347 +20 62226984 . G C . . Sample=HG00559;GT=0/0;PCR_454_AR=2;PCR_454_RR=1774 +20 62226984 . G C . . Sample=NA12003;GT=0/0;PCR_454_AR=1;PCR_454_RR=1871 +20 62250734 . C T . . Sample=NA19473;GT=0/1;PCR_454_AR=607;PCR_454_RR=722 +20 62297382 . A T . . Sample=NA11993;GT=0/0;PCR_454_AR=3;PCR_454_RR=2573 +20 62297382 . A T . . Sample=NA19117;GT=0/0;PCR_454_AR=5;PCR_454_RR=1753 +20 62305427 . G A . . Sample=HG00104;GT=0/0;PCR_454_AR=10;PCR_454_RR=803 +20 62305427 . G A . . Sample=HG00122;GT=0/0;PCR_454_AR=28;PCR_454_RR=1300 +20 62319912 . G T . . Sample=HG00128;GT=0/0;PCR_454_AR=1;PCR_454_RR=1911 +20 62319912 . G T . . Sample=HG00560;GT=0/0;PCR_454_AR=0;PCR_454_RR=2111 +20 62324258 . C G . . Sample=NA18562;GT=0/1;PCR_454_AR=1126;PCR_454_RR=1126 +20 62324622 . C G . . Sample=NA18574;GT=0/1;PCR_454_AR=1153;PCR_454_RR=1158 +20 62325731 . G A . . Sample=NA18548;GT=0/1;PCR_454_AR=779;PCR_454_RR=2199 +20 62325821 . G A . . Sample=NA20278;GT=0/1;PCR_454_AR=819;PCR_454_RR=764 +20 62325821 . G A . . Sample=NA20507;GT=0/1;PCR_454_AR=1163;PCR_454_RR=1060 +20 62326150 . G A . . Sample=NA18870;GT=0/1;PCR_454_AR=1080;PCR_454_RR=892 +20 62326234 . C T . . Sample=HG00128;GT=0/0;PCR_454_AR=0;PCR_454_RR=761 +20 62326234 . C T . . Sample=HG00179;GT=0/0;PCR_454_AR=1;PCR_454_RR=1158 +20 62326811 . G T . . Sample=HG00149;GT=0/0;PCR_454_AR=0;PCR_454_RR=1467 +20 62326811 . G T . . Sample=HG00151;GT=0/0;PCR_454_AR=1;PCR_454_RR=1492 +20 62407154 . C T . . Sample=NA18987;GT=0/0;PCR_454_AR=181;PCR_454_RR=2041 +20 62421536 . C T . . Sample=NA20521;GT=0/1;PCR_454_AR=856;PCR_454_RR=910 +20 62421536 . C T . . Sample=NA20543;GT=0/1;PCR_454_AR=865;PCR_454_RR=854 +20 62593676 . C T . . Sample=NA20291;GT=0/1;PCR_454_AR=1038;PCR_454_RR=995 +20 62594479 . C T . . Sample=NA19746;GT=0/1;PCR_454_AR=349;PCR_454_RR=347 +20 62595981 . C T . . Sample=NA19172;GT=0/1;PCR_454_AR=440;PCR_454_RR=415 +20 62630426 . C T . . Sample=NA19428;GT=0/1;PCR_454_AR=1246;PCR_454_RR=1277 +20 62632542 . C T . . Sample=NA18501;GT=0/1;PCR_454_AR=1203;PCR_454_RR=1150 +20 62657404 . C T . . Sample=NA18612;GT=0/1;PCR_454_AR=1480;PCR_454_RR=1071 +20 62700725 . G A . . Sample=NA19020;GT=0/1;PCR_454_AR=832;PCR_454_RR=815 +20 62700725 . G A . . Sample=NA19036;GT=0/1;PCR_454_AR=1024;PCR_454_RR=966 +20 62729481 . C T . . Sample=NA20276;GT=0/1;PCR_454_AR=401;PCR_454_RR=408 +20 62899302 . T C . . Sample=HG00104;GT=0/0;PCR_454_AR=10;PCR_454_RR=871 +20 62899302 . T C . . Sample=HG00128;GT=0/0;PCR_454_AR=2;PCR_454_RR=950 diff --git a/tests/tabix_data/vcf/3.vcf b/tests/tabix_data/vcf/3.vcf new file mode 100644 index 0000000..a3f2e0f --- /dev/null +++ b/tests/tabix_data/vcf/3.vcf @@ -0,0 +1,1000 @@ +##fileformat=VCFv4.0 +##filedate=2010-06-21 +##reference=NCBI36 +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +#CHROM POS ID REF ALT QUAL FILTER INFO +1 1000153 . TCACAC TC 100 PASS AF=0.115095;HP=1;NF=16;NR=13;NS=52;CA=0;DP=615 +1 1000906 . CAG CG 48 PASS AF=0.0772696;HP=1;NF=2;NR=9;NS=51;CA=0;DP=281 +1 1000950 rs60561655;-/G CGG CG 100 PASS AF=0.447771;HP=5;DB;NF=10;NR=20;NS=50;CA=M;DP=291 +1 1010786 rs36095298;-/G,mills,venter AC AGC 100 PASS AF=0.774334;HP=1;DB;NF=21;NR=27;NS=51;CA=0;DP=306 +1 1026158 . TG TGGGGGG 100 PASS AF=0.115637;HP=1;NF=5;NR=2;NS=52;CA=0;DP=591 +1 1028860 mills,venter ACTCC AC 10 PASS AF=0.0107751;HP=1;NF=5;NR=4;NS=52;CA=0;DP=522 +1 1040517 . CA CAA 100 PASS AF=0.0577672;HP=1;NF=7;NR=4;NS=52;CA=0;DP=426 +1 1043690 rs5772037;-/G,venter TG TGG 100 PASS AF=0.065857;HP=3;DB;NF=5;NR=8;NS=51;CA=0;DP=427 +1 1049375 . TA TACACACCTGAGCACACACACCTGTGCA 100 PASS AF=0.0808078;HP=1;NF=1;NR=1;NS=51;CA=M;DP=643 +1 1055459 venter ACC AC 100 PASS AF=0.936429;HP=2;NF=13;NR=24;NS=51;CA=M;DP=342 +1 1056251 rs34287831;-/A,venter CT CTT 100 PASS AF=0.725164;HP=1;DB;NF=31;NR=20;NS=52;CA=0;DP=375 +1 1057459 rs55853944;-/AG,venter CAGG CG 100 PASS AF=0.525146;HP=1;DB;NF=16;NR=18;NS=51;CA=0;DP=331 +1 1057537 rs35574593;-/CC,watson TG TGGG 100 PASS AF=0.591248;HP=1;DB;NF=30;NR=12;NS=50;CA=0;DP=341 +1 1058532 rs34990026;-/A GTT GT 100 PASS AF=0.702381;HP=4;DB;NF=29;NR=32;NS=52;CA=0;DP=405 +1 1058695 rs56086046;-/GCCTGCCTGCCCGGCC,watson CGCCGCCTGCCTGCCCGG CG 100 PASS AF=0.601284;HP=1;DB;NF=24;NR=23;NS=51;CA=0;DP=365 +1 1073880 . AC ACC 13 PASS AF=0.0555821;HP=2;NF=1;NR=6;NS=52;CA=0;DP=457 +1 1087270 mills,venter,watson CCCCAC CC 100 PASS AF=0.990156;HP=4;NF=32;NR=27;NS=50;CA=0;DP=339 +1 1088683 rs5772039;-/C,venter TCC TC 100 PASS AF=0.957928;HP=9;DB;NF=31;NR=26;NS=49;CA=0;DP=336 +1 1093553 . TC TCAC 100 PASS AF=0.962343;HP=5;NF=44;NR=17;NS=51;CA=0;DP=324 +1 1111698 rs57346441;-/TG,watson CA CTGA 100 PASS AF=0.0986662;HP=1;DB;NF=8;NR=5;NS=52;CA=0;DP=528 +1 1117471 . GT GTT 48 PASS AF=0.04843;HP=6;NF=20;NR=8;NS=52;CA=0;DP=510 +1 1118641 . CT CTTAT 38 PASS AF=0.0574453;HP=1;NF=5;NR=1;NS=51;CA=0;DP=424 +1 1119225 rs60117456;-/C AC ACC 50 PASS AF=0.0255886;HP=4;DB;NF=8;NR=5;NS=52;CA=0;DP=522 +1 1121774 . GCTGTTCAGACCTG GG 100 PASS AF=0.0749767;HP=1;NF=6;NR=6;NS=51;CA=0;DP=508 +1 1123178 . AACA AA 14 PASS AF=0.0195065;HP=3;NF=2;NR=3;NS=49;CA=0;DP=329 +1 1134362 . GGAG GG 100 PASS AF=0.142028;HP=2;NF=12;NR=17;NS=51;CA=0;DP=407 +1 1140087 . TCA TA 19 PASS AF=0.0635822;HP=1;NF=2;NR=5;NS=51;CA=0;DP=446 +1 1141951 . CTG CG 100 PASS AF=0.100135;HP=1;NF=7;NR=7;NS=52;CA=0;DP=463 +1 1148304 rs34808371;-/GT,venter GCAC GC 100 PASS AF=0.0786699;HP=1;DB;NF=11;NR=18;NS=52;CA=0;DP=687 +1 1148425 rs57524763;-/AC AACA AA 100 PASS AF=0.0744913;HP=2;DB;NF=17;NR=8;NS=51;CA=0;DP=647 +1 1149524 . GTTTTAT GT 100 PASS AF=0.0475567;HP=4;NF=19;NR=14;NS=50;CA=0;DP=395 +1 1150963 . CGCCACAGACACGGGCCACACACTCCACATG CG 100 PASS AF=0.111384;HP=1;NF=46;NR=28;NS=50;CA=0;DP=510 +1 1151863 . GT GCT 100 PASS AF=0.126132;HP=1;NF=8;NR=7;NS=52;CA=0;DP=416 +1 1153674 rs3831195;-/ACAG GG GGACAG 18 PASS AF=0.0388728;HP=2;DB;NF=3;NR=2;NS=51;CA=0;DP=418 +1 1154612 . GT GCT 100 PASS AF=0.0630518;HP=1;NF=7;NR=4;NS=52;CA=0;DP=531 +1 1155143 . GCAC GC 100 PASS AF=0.0991605;HP=1;NF=25;NR=23;NS=52;CA=0;DP=540 +1 1155183 . CATG CG 100 PASS AF=0.0714383;HP=1;NF=5;NR=8;NS=52;CA=0;DP=527 +1 1156953 rs57672822;-/ACCCCGGGA CCCCCGGGAAC CC 59 PASS AF=0.0847102;HP=5;DB;NF=5;NR=8;NS=50;CA=0;DP=312 +1 1164370 . AA AACATGCATCCA 100 PASS AF=0.0550752;HP=2;NF=2;NR=1;NS=51;CA=0;DP=481 +1 1166826 . AC ACC 11 PASS AF=0.0735648;HP=1;NF=1;NR=10;NS=52;CA=0;DP=379 +1 1167781 rs3835300;-/T CTG CG 100 PASS AF=0.0719128;HP=1;DB;NF=3;NR=3;NS=50;CA=0;DP=360 +1 1180776 rs35025185;-/T,mills CTT CT 15 PASS AF=0.0182173;HP=3;DB;NF=5;NR=1;NS=52;CA=0;DP=526 +1 1184391 . GC GCAC 16 PASS AF=0.0187867;HP=1;NF=2;NR=6;NS=51;CA=M;DP=521 +1 1204971 . TGG TG 100 PASS AF=0.0564084;HP=6;NF=11;NR=6;NS=50;CA=0;DP=419 +1 1207801 rs35647244;-/GT,watson CC CCAC 100 PASS AF=0.034013;HP=2;DB;NF=9;NR=4;NS=52;CA=0;DP=624 +1 1213486 . GTCT GT 100 PASS AF=0.504039;HP=1;NF=9;NR=5;NS=50;CA=M;DP=372 +1 1217527 rs3831920;-/CTCA,watson TTGAGT TT 100 PASS AF=0.098042;HP=2;DB;NF=11;NR=14;NS=51;CA=0;DP=444 +1 1224625 . AGG AG 40 PASS AF=0.0395551;HP=5;NF=4;NR=4;NS=51;CA=0;DP=406 +1 1228918 rs35156558;-/GGA,venter CC CCCTC 100 PASS AF=0.999996;HP=5;DB;NF=24;NR=30;NS=49;CA=0;DP=268 +1 1232491 . CTACCTGACCTTC CC 13 PASS AF=0.0510512;HP=1;NF=5;NR=5;NS=52;CA=0;DP=510 +1 1236119 . CGGCTCTGGGTCACAGGTG CG 17 PASS AF=0.0581287;HP=2;NF=6;NR=8;NS=49;CA=M;DP=277 +1 1245266 rs5772041;-/G,venter TGG TG 100 PASS AF=0.928175;HP=4;DB;NF=39;NR=39;NS=52;CA=0;DP=431 +1 1286232 venter,watson GACA GA 100 PASS AF=0.878082;HP=1;NF=31;NR=15;NS=50;CA=0;DP=249 +1 1292184 watson TG TGTGTGCAG 100 PASS AF=0.92351;HP=1;NF=36;NR=17;NS=51;CA=0;DP=633 +1 1475307 rs35008066;-/G,venter GCC GC 59 PASS AF=0.0854422;HP=2;DB;NF=2;NR=3;NS=52;CA=0;DP=372 +1 1476800 rs3835461;-/C AG AGG 100 PASS AF=0.239098;HP=1;DB;NF=13;NR=18;NS=52;CA=0;DP=491 +1 1482738 rs34962853;-/AT,watson CATA CA 100 PASS AF=0.1747;HP=1;DB;NF=28;NR=14;NS=51;CA=0;DP=441 +1 1483969 rs3835460;-/T,mills CG CAG 100 PASS AF=0.180671;HP=5;DB;NF=6;NR=13;NS=52;CA=0;DP=512 +1 1484993 rs35384209;-/CT CA CAGA 100 PASS AF=0.182804;HP=1;DB;NF=9;NR=15;NS=52;CA=0;DP=441 +1 1485720 . TC TCGTAC 39 PASS AF=0.0207216;HP=1;NF=1;NR=3;NS=51;CA=0;DP=498 +1 1487504 rs35885836;-/AGAA,venter,watson TTTTCT TT 100 PASS AF=0.210263;HP=4;DB;NF=16;NR=20;NS=52;CA=0;DP=574 +1 1490348 rs3835459;-/CATGATCCGCCTGCCTT CAAGGCAGGCGGATCATGA CA 59 PASS AF=0.230233;HP=2;DB;NF=5;NR=66;NS=51;CA=M;DP=377 +1 1490873 . GT GGGCCCGACGGTGCT 100 PASS AF=0.133846;HP=1;NF=8;NR=3;NS=52;CA=0;DP=572 +1 1495811 venter ACC AC 100 PASS AF=0.232263;HP=8;NF=12;NR=29;NS=52;CA=0;DP=481 +1 1502734 rs35576478;-/G,venter AC ACC 100 PASS AF=0.221604;HP=4;DB;NF=16;NR=9;NS=51;CA=0;DP=388 +1 1507556 . AC ACC 42 PASS AF=0.0176775;HP=1;NF=1;NR=4;NS=51;CA=0;DP=511 +1 1508235 . CT CTT 100 PASS AF=0.2555;HP=1;NF=18;NR=15;NS=51;CA=0;DP=535 +1 1508689 . CG CGG 100 PASS AF=0.0922424;HP=5;NF=19;NR=17;NS=51;CA=0;DP=568 +1 1510533 . TTTTGT TT 100 PASS AF=0.423696;HP=7;NF=37;NR=39;NS=52;CA=0;DP=387 +1 1511216 . TA TAATAATAATAAAA 39 PASS AF=0.542394;HP=2;NF=7;NR=3;NS=51;CA=0;DP=331 +1 1512041 . CAAAAGTAAA CA 33 PASS AF=0.0333379;HP=4;NF=12;NR=13;NS=52;CA=0;DP=440 +1 1514403 . TTTTAT TT 100 PASS AF=0.771875;HP=5;NF=24;NR=58;NS=50;CA=0;DP=243 +1 1520133 rs34595829;-/GT,venter GA GACA 100 PASS AF=0.432871;HP=1;DB;NF=24;NR=19;NS=52;CA=0;DP=966 +1 1520238 venter,watson TG TGAGACAG 100 PASS AF=0.606404;HP=1;NF=52;NR=36;NS=52;CA=M;DP=847 +1 1520271 . CA CAGA 100 PASS AF=0.169509;HP=1;NF=48;NR=39;NS=52;CA=M;DP=736 +1 1520357 . CAGAGAGA CA 100 PASS AF=0.218715;HP=1;NF=44;NR=30;NS=52;CA=M;DP=708 +1 1520549 . CAGA CA 100 PASS AF=0.257166;HP=1;NF=41;NR=40;NS=52;CA=0;DP=790 +1 1520595 . CAGA CA 100 PASS AF=0.107822;HP=1;NF=52;NR=44;NS=52;CA=M;DP=804 +1 1520983 . GA GAGAGAGACA 34 PASS AF=0.0372679;HP=1;NF=2;NR=3;NS=52;CA=0;DP=610 +1 1521139 . GA GAGACA 100 PASS AF=0.667375;HP=1;NF=10;NR=7;NS=52;CA=M;DP=537 +1 1521387 . GAGACA GA 100 PASS AF=0.361313;HP=1;NF=13;NR=34;NS=52;CA=M;DP=598 +1 1521833 . GACA GA 100 PASS AF=0.193306;HP=1;NF=23;NR=17;NS=52;CA=0;DP=737 +1 1522371 . CC CCCTCAGCTGGACTC 100 PASS AF=0.480499;HP=3;NF=11;NR=12;NS=51;CA=0;DP=535 +1 1530305 . AG AGG 15 PASS AF=0.0737746;HP=3;NF=13;NR=4;NS=51;CA=0;DP=569 +1 1536491 rs36101309;-/GA ATCT AT 100 PASS AF=0.128408;HP=1;DB;NF=22;NR=14;NS=51;CA=0;DP=621 +1 1537805 venter TT TCT 100 PASS AF=0.350404;HP=8;NF=3;NR=18;NS=52;CA=M;DP=419 +1 1539301 . CAAAAGA CA 56 PASS AF=0.0156055;HP=4;NF=9;NR=2;NS=51;CA=0;DP=577 +1 1549566 venter ATT AT 100 PASS AF=0.505899;HP=3;NF=25;NR=27;NS=52;CA=0;DP=451 +1 1554815 . TGG TG 100 PASS AF=0.158582;HP=6;NF=12;NR=6;NS=48;CA=0;DP=271 +1 1575329 . GCAAC GC 12 PASS AF=0.0174116;HP=1;NF=27;NR=21;NS=52;CA=0;DP=554 +1 1575977 rs35072492;-/A TCC TC 100 PASS AF=0.626664;HP=3;DB;NF=23;NR=50;NS=51;CA=0;DP=361 +1 1577203 venter,watson AA AAAACA 100 PASS AF=0.979791;HP=4;NF=59;NR=37;NS=52;CA=0;DP=498 +1 1584062 rs5772057;-/T,venter CT CTT 100 PASS AF=0.992883;HP=1;DB;NF=34;NR=22;NS=46;CA=0;DP=291 +1 1589954 . TTGT TT 100 PASS AF=0.0452889;HP=8;NF=5;NR=13;NS=51;CA=0;DP=424 +1 1611607 venter ATA AA 100 PASS AF=0.528232;HP=1;NF=7;NR=10;NS=50;CA=M;DP=243 +1 1615408 venter AC ACGC 100 PASS AF=0.553544;HP=9;NF=16;NR=20;NS=51;CA=M;DP=247 +1 1618248 . CTGA CA 100 PASS AF=0.0412633;HP=1;NF=5;NR=2;NS=51;CA=0;DP=789 +1 1637509 venter CG CTG 100 PASS AF=0.956642;HP=1;NF=57;NR=41;NS=52;CA=M;DP=533 +1 1637828 rs34259364;-/AT,mills CG CATG 100 PASS AF=0.24683;HP=1;DB;NF=5;NR=57;NS=52;CA=0;DP=744 +1 1638199 . GA GATGTTAA 100 PASS AF=0.962724;HP=1;NF=22;NR=22;NS=52;CA=0;DP=480 +1 1638366 venter AT ATT 100 PASS AF=0.471703;HP=4;NF=50;NR=16;NS=52;CA=0;DP=738 +1 1638469 rs34392519;-/AGC,mills GA GAGCA 100 PASS AF=0.428728;HP=1;DB;NF=34;NR=23;NS=52;CA=0;DP=804 +1 1639339 rs36127854;-/CT,venter TA TAGA 100 PASS AF=0.27562;HP=1;DB;NF=10;NR=15;NS=52;CA=0;DP=961 +1 1639610 . ATTCTC AC 59 PASS AF=0.0697107;HP=2;NF=31;NR=24;NS=52;CA=M;DP=817 +1 1640937 venter CG CTCGCTCTGTCACCCAGGCTG 100 PASS AF=0.639983;HP=2;NF=4;NR=3;NS=52;CA=M;DP=638 +1 1641995 rs34986248;-/ATT,venter,watson CT CTTAT 100 PASS AF=0.924551;HP=2;DB;NF=33;NR=29;NS=52;CA=0;DP=414 +1 1654133 rs34171153;-/ATCG TA TATCGA 100 PASS AF=0.2409;HP=1;DB;NF=10;NR=13;NS=52;CA=0;DP=463 +1 1656307 rs35516110;-/GTTT,venter GT GGTTTT 100 PASS AF=0.686901;HP=6;DB;NF=22;NR=20;NS=51;CA=0;DP=293 +1 1674207 venter CC CCCTC 100 PASS AF=0.303909;HP=3;NF=26;GC;NR=29;NS=52;CA=0;DP=534 +1 1675781 . TCCCTGGGACCGAAGTCGCCCCAC TC 100 PASS AF=0.270579;HP=3;NF=25;NR=24;NS=52;CA=0;DP=473 +1 1679986 rs35357728;-/TG,mills,venter,watson AA AACA 100 PASS AF=0.956895;HP=4;DB;NF=60;NR=58;NS=52;CA=0;DP=520 +1 1684058 . AAATGA AA 100 PASS AF=0.508762;HP=4;NF=48;NR=55;NS=52;CA=0;DP=471 +1 1684177 . TG TGGGGGGGG 100 PASS AF=0.126497;HP=1;NF=5;NR=3;NS=51;CA=0;DP=449 +1 1691268 rs35459537;-/AAAAACAAAAAC,mills,venter CAAAACAAAAACAA CA 100 PASS AF=0.305762;HP=4;DB;NF=54;NR=62;NS=51;CA=0;DP=443 +1 1697760 mills,venter GAAACA GA 100 PASS AF=0.276545;HP=3;NF=21;NR=43;NS=52;CA=0;DP=564 +1 1700966 rs34974144;-/AT,venter TT TTGT 100 PASS AF=0.37365;HP=3;DB;NF=34;NR=30;NS=52;CA=0;DP=445 +1 1715347 . TG TGGGGGG 24 PASS AF=0.0415083;HP=1;NF=4;NR=5;NS=52;CA=0;DP=519 +1 1717050 rs56070879;-/ACAAAAAA,venter TC TCAAAAAAAC 100 PASS AF=0.90619;HP=1;DB;NF=11;NR=7;NS=52;CA=0;DP=442 +1 1729683 . ACT AT 100 PASS AF=0.104273;HP=1;NF=9;NR=11;NS=52;CA=0;DP=587 +1 1729941 rs55730045;-/TTTG,watson TTTTGT TT 100 PASS AF=0.270089;HP=5;DB;NF=25;NR=44;NS=52;CA=M;DP=458 +1 1733706 rs4012956;-/GT,mills,venter TA TACA 100 PASS AF=0.737658;HP=1;DB;NF=58;NR=26;NS=52;CA=M;DP=547 +1 1750193 rs34820549;-/TG,venter TA TACA 100 PASS AF=0.417596;HP=1;DB;NF=42;NR=29;NS=52;CA=0;DP=495 +1 1761838 . GCAC GC 17 PASS AF=0.0186129;HP=1;NF=23;NR=23;NS=52;CA=0;DP=566 +1 1767123 . TACACACACACACACACACACACACACACACA TA 100 PASS AF=0.205885;HP=1;NF=32;NR=32;NS=52;CA=0;DP=560 +1 1767308 . AG ATG 12 PASS AF=0.363076;HP=2;NF=25;NR=12;NS=52;CA=0;DP=611 +1 1768358 . ACA AA 11 NoQCALL AF=0.0311546;HP=1;NF=1;NR=4;NS=52;CA=0;DP=502 +1 1768592 . AC ACAACAAAATCCCTTTTTC 100 PASS AF=0.0974177;HP=1;NF=2;NR=5;NS=52;CA=0;DP=597 +1 1769336 rs34011234;-/TA,venter,watson CT CTAT 100 PASS AF=0.385782;HP=1;DB;NF=21;NR=42;NS=52;CA=0;DP=534 +1 1769673 rs56979938;-/A,venter AGA AA 21 PASS AF=0.232442;HP=1;DB;NF=9;NR=3;NS=52;CA=0;DP=465 +1 1771291 . TG TGG 100 PASS AF=0.18937;HP=2;NF=5;NR=15;NS=52;CA=0;DP=590 +1 1778545 . TA TAAA 100 PASS AF=0.155668;HP=3;NF=5;NR=12;NS=52;CA=0;DP=621 +1 1778604 rs34483468;-/AGCC,venter GG GGGCTG 100 PASS AF=0.135521;HP=4;DB;NF=22;NR=28;NS=52;CA=0;DP=629 +1 1786587 watson ACCA AA 26 PASS AF=0.0677562;HP=2;NF=15;NR=22;NS=52;CA=M;DP=404 +1 1797136 rs59528461;-/C,venter TCC TC 100 PASS AF=0.94689;HP=10;DB;NF=58;NR=57;NS=52;CA=0;DP=531 +1 1797791 rs35226472;-/CT,venter CG CGAG 100 PASS AF=0.383219;HP=1;DB;NF=64;NR=38;NS=52;CA=0;DP=673 +1 1802225 rs34339560;-/A,mills,venter CAA CA 100 PASS AF=0.973419;HP=2;DB;NF=64;NR=71;NS=52;CA=0;DP=635 +1 1802305 . GGAG GG 100 PASS AF=0.273326;HP=2;NF=41;NR=34;NS=52;CA=0;DP=695 +1 1806743 . TTAGAT TT 100 PASS AF=0.179706;HP=2;NF=9;NR=6;NS=52;CA=0;DP=377 +1 1809681 . AG AGG 21 PASS AF=0.133833;HP=2;NF=7;NR=3;NS=52;CA=0;DP=482 +1 1810283 . AC ACC 30 PASS AF=0.0430128;HP=2;NF=4;NR=11;NS=52;CA=0;DP=523 +1 1810555 . CTTAAT CT 100 PASS AF=0.0498379;HP=2;NF=9;NR=7;NS=52;CA=0;DP=521 +1 1812953 rs34135959;-/TCTC CA CAGAGA 100 PASS AF=0.311555;HP=1;DB;NF=6;NR=8;NS=42;CA=0;DP=242 +1 1819911 . CATG CG 100 PASS AF=0.0319085;HP=1;NF=3;NR=6;NS=52;CA=0;DP=765 +1 1819947 rs60517384;-/AAGTTGGATATACACACAT CACACACATAAGTTGGATATA CA 100 PASS AF=0.0935091;HP=1;DB;NF=59;NR=69;NS=52;CA=0;DP=854 +1 1825723 venter AA AAAATAAATAAATA 100 PASS AF=0.348026;HP=4;NF=9;NR=10;NS=52;CA=0;DP=373 +1 1835530 . GTGAGAGTTGTTG GG 100 PASS AF=0.15298;HP=1;NF=12;NR=1;NS=51;CA=0;DP=528 +1 1838692 rs5772055;-/AC,mills AA AACA 100 PASS AF=0.0441449;HP=3;DB;NF=2;NR=3;NS=51;CA=0;DP=360 +1 1843475 rs3039777;-/ACTG,venter,watson TC TCTGAC 100 PASS AF=0.999998;HP=1;DB;NF=38;NR=39;NS=50;CA=0;DP=422 +1 1850674 . AGG AG 100 PASS AF=0.474687;HP=3;NF=7;NR=1;NS=49;CA=0;DP=271 +1 1855740 watson GT GTGTAT 100 PASS AF=0.646893;HP=1;NF=42;NR=28;NS=51;CA=0;DP=653 +1 1856762 . CACAGG CG 14 PASS AF=0.0324715;HP=1;NF=1;NR=2;NS=50;CA=M;DP=379 +1 1857166 . TACA TA 100 PASS AF=0.0531955;HP=1;NF=39;NR=29;NS=52;CA=0;DP=634 +1 1859140 mills ACACCAGGTCCACCTCTGGACACAGGTCCACCC AC 100 PASS AF=0.180806;HP=1;NF=26;NR=15;NS=52;CA=0;DP=672 +1 1859353 rs35385292;-/TC,venter ACTC AC 100 PASS AF=0.493919;HP=1;DB;NF=26;NR=38;NS=52;CA=M;DP=641 +1 1859424 rs34242289;-/CA,venter TCAG TG 100 PASS AF=0.3962;HP=1;DB;NF=40;NR=32;NS=52;CA=M;DP=695 +1 1859520 . TCAC TC 100 PASS AF=0.234548;HP=1;NF=26;NR=23;NS=52;CA=0;DP=729 +1 1859631 rs35205487;-/GA,venter AC ACTC 100 PASS AF=0.347295;HP=1;DB;NF=15;NR=28;NS=52;CA=0;DP=710 +1 1859792 rs34050188;-/AT,watson CG CATG 100 PASS AF=0.715253;HP=1;DB;NF=35;NR=44;NS=52;CA=0;DP=590 +1 1864576 . CG CGG 13 PASS AF=0.0158703;HP=1;NF=3;NR=2;NS=51;CA=0;DP=556 +1 1867274 rs34832935;-/C TGG TG 100 PASS AF=0.304336;HP=8;DB;NF=38;NR=23;NS=51;CA=0;DP=538 +1 1869711 rs56005703;-/ATAT,watson AA AATATA 100 PASS AF=0.652198;HP=3;DB;NF=16;NR=16;NS=51;CA=0;DP=349 +1 1870233 . TC TCCCTCCCTTCTTTCCTTCCCTTTCCCTCC 100 PASS AF=0.408049;HP=2;NF=11;NR=9;NS=52;CA=0;DP=814 +1 1870305 . CC CCTTTCCCTCCCTTACTCCTTCCTTCCTTC 100 PASS AF=0.121733;HP=4;NF=1;NR=5;NS=52;CA=0;DP=680 +1 1870363 . CT CTT 100 PASS AF=0.11398;HP=2;NF=4;NR=6;NS=52;CA=0;DP=680 +1 1870863 rs35875775;-/C,venter TT TGT 100 PASS AF=0.744276;HP=2;DB;NF=43;NR=22;NS=52;CA=0;DP=455 +1 1873164 . GT GTT 100 PASS AF=0.387355;HP=3;NF=20;NR=18;NS=52;CA=0;DP=523 +1 1873889 rs58267869;-/AAGA AA AAAAGA 100 PASS AF=0.252999;HP=5;DB;NF=57;NR=31;NS=52;CA=0;DP=536 +1 1874122 rs35595511;-/T TAA TA 100 PASS AF=0.338059;HP=9;DB;NF=38;NR=38;NS=51;CA=0;DP=519 +1 1876064 watson AG AGAGTG 100 PASS AF=0.0829624;HP=1;NF=6;NR=5;NS=52;CA=0;DP=465 +1 1876204 . AC ACAGC 100 PASS AF=0.256855;HP=1;NF=14;NR=10;NS=52;CA=0;DP=483 +1 1876616 . GC GCTGGTGCGCGTC 100 PASS AF=0.0656988;HP=1;NF=5;NR=2;NS=51;CA=0;DP=420 +1 1876971 rs3838975;-/G GCC GC 21 PASS AF=0.201137;HP=2;DB;NF=15;NR=6;NS=52;CA=0;DP=439 +1 1877704 . CCTGC CC 19 PASS AF=0.0183173;HP=2;NF=7;NR=13;NS=52;CA=0;DP=436 +1 1884832 rs34937714;-/T CA CAA 100 PASS AF=0.254902;HP=3;DB;NF=27;NR=6;NS=52;CA=0;DP=449 +1 1886549 rs3838974;-/T GG GAG 100 PASS AF=0.153123;HP=4;DB;NF=11;NR=10;NS=52;CA=0;DP=456 +1 1889260 rs55954278;-/ATGA GT GTGAAT 100 PASS AF=0.630203;HP=1;DB;NF=12;NR=17;NS=52;CA=0;DP=656 +1 1889311 . GTGAAT GT 100 PASS AF=0.167491;HP=1;NF=33;NR=18;NS=52;CA=0;DP=606 +1 1889402 rs34520694;-/GTGA AT ATGAGT 100 PASS AF=0.306146;HP=1;DB;NF=24;NR=32;NS=52;CA=0;DP=916 +1 1889884 rs56985589;-/G TGC TC 100 PASS AF=0.347999;HP=1;DB;NF=20;NR=28;NS=51;CA=0;DP=537 +1 1889966 rs61233860;-/CCT,watson TC TCTCC 100 PASS AF=0.211403;HP=1;DB;NF=12;NR=14;NS=52;CA=0;DP=554 +1 1892548 . ACTC AC 21 PASS AF=0.0207771;HP=1;NF=4;NR=3;NS=52;CA=0;DP=750 +1 1900826 . AACA AA 100 PASS AF=0.122368;HP=2;NF=13;NR=6;NS=52;CA=M;DP=435 +1 1908846 venter CT CTT 100 PASS AF=0.30139;HP=10;NF=11;NR=28;NS=51;CA=0;DP=350 +1 1910458 . TGAG TG 15 PASS AF=0.0208928;HP=1;NF=23;NR=12;NS=52;CA=0;DP=514 +1 1927207 rs61162553;-/GTTCTCTCTCTCTCTCTCTC,venter CTCTCTCTCTCTCTCTCTCGTT CT 100 PASS AF=0.399955;HP=1;DB;NF=34;NR=47;NS=51;CA=0;DP=427 +1 1929307 rs36066718;-/T CAA CA 30 PASS AF=0.114706;HP=10;DB;NF=24;NR=15;NS=52;CA=0;DP=520 +1 1933578 . CA CAAAATAAAATA 100 PASS AF=0.562689;HP=4;NF=21;NR=28;NS=52;CA=0;DP=359 +1 1947079 rs3831907;-/C CGG CG 100 PASS AF=0.131218;HP=3;DB;NF=4;NR=10;NS=52;CA=0;DP=316 +1 1949721 rs35354651;-/G GC GCC 100 PASS AF=0.218024;HP=1;DB;NF=11;NR=5;NS=51;CA=0;DP=306 +1 1965555 rs56225932;-/CA,venter TACA TA 100 PASS AF=0.743144;HP=1;DB;NF=50;NR=67;NS=52;CA=0;DP=679 +1 1966402 venter,watson GC GCCGCC 100 PASS AF=0.988372;HP=2;NF=36;NR=16;NS=46;CA=0;DP=232 +1 1989567 . AC ACC 12 PASS AF=0.0334278;HP=6;NF=10;NR=9;NS=52;CA=0;DP=367 +1 1992350 . CA CACCTGGGCGTGTGA 56 PASS AF=0.19029;HP=1;NF=6;NR=3;NS=52;CA=0;DP=412 +1 1993852 rs34106910;-/G,venter GCC GC 100 PASS AF=0.178292;HP=2;DB;NF=15;NR=7;NS=51;CA=0;DP=388 +1 1996153 . GT GTT 59 PASS AF=0.126167;HP=8;NF=7;NR=14;NS=51;CA=0;DP=436 +1 2010531 rs35300904;-/C,venter CA CGA 100 PASS AF=0.2131;HP=1;DB;NF=18;NR=7;NS=52;CA=0;DP=418 +1 2019409 rs55716481;-/AGTGACTAAGGTGACCAGG,venter CA CAGGTGACCAGGAGTGACTAA 100 PASS AF=0.901172;HP=1;DB;NF=17;NR=16;NS=52;CA=0;DP=600 +1 2019867 rs58602729;-/CT CCTC CC 100 PASS AF=0.15521;HP=3;DB;NF=6;NR=12;NS=52;CA=0;DP=542 +1 2019961 mills CGTTTTGTTTTG CG 100 PASS AF=0.239816;HP=1;NF=44;NR=59;NS=52;CA=0;DP=513 +1 2027926 . CT CTT 100 PASS AF=0.591615;HP=1;NF=7;NR=4;NS=51;CA=M;DP=262 +1 2028042 . CT CTT 100 PASS AF=0.242884;HP=1;NF=28;NR=12;NS=51;CA=M;DP=738 +1 2031773 . GA GGGTA 100 PASS AF=0.197429;HP=1;NF=15;NR=7;NS=51;CA=0;DP=405 +1 2036771 . AC ACCCC 100 PASS AF=0.173415;HP=3;NF=1;NR=5;NS=52;CA=0;DP=532 +1 2040362 venter CT CTT 100 PASS AF=0.61548;HP=3;NF=31;NR=33;NS=52;CA=0;DP=522 +1 2042747 . CG CGGGGG 100 PASS AF=0.132985;HP=2;NF=11;NR=6;NS=51;CA=0;DP=880 +1 2042976 . GT GTTATT 100 PASS AF=0.225391;HP=2;NF=13;NR=25;NS=51;CA=M;DP=882 +1 2045297 . GT GTAGTTATT 36 PASS AF=0.513037;HP=2;NF=5;NR=16;NS=46;CA=M;DP=269 +1 2048642 rs56348719;-/A CAG CG 100 PASS AF=0.626672;HP=1;DB;NF=15;NR=37;NS=51;CA=0;DP=337 +1 2055895 watson AT AATT 100 PASS AF=0.183323;HP=1;NF=10;NR=14;NS=52;CA=0;DP=511 +1 2058884 watson GCCTC GC 100 PASS AF=0.258368;HP=2;NF=23;NR=18;NS=51;CA=0;DP=533 +1 2068674 . CTCTAT CT 100 PASS AF=0.0693035;HP=1;NF=7;NR=5;NS=52;CA=0;DP=600 +1 2076576 . GTGAT GT 100 PASS AF=0.0691863;HP=1;NF=32;NR=24;NS=52;CA=0;DP=918 +1 2076741 . GTGAT GT 49 PASS AF=0.200249;HP=1;NF=13;NR=21;NS=51;CA=0;DP=758 +1 2076895 . GTGAT GT 100 PASS AF=0.134423;HP=1;NF=21;NR=19;NS=51;CA=0;DP=658 +1 2076954 rs60433546;-/ATG AA AATGA 100 PASS AF=0.310432;HP=2;DB;NF=12;NR=27;NS=52;CA=0;DP=664 +1 2079377 rs3835418;-/T CT CTT 100 PASS AF=0.201153;HP=1;DB;NF=13;NR=15;NS=52;CA=0;DP=451 +1 2081537 rs56068331;-/GTGT CGTGTG CG 13 PASS AF=0.276967;HP=1;DB;NF=58;NR=66;NS=52;CA=0;DP=516 +1 2085600 rs3835419;-/CTGGGCCAACCC GA GACCCCTGGGCCAA 100 PASS AF=0.243746;HP=1;DB;NF=11;NR=6;NS=52;CA=0;DP=535 +1 2087974 . GCC GC 15 PASS AF=0.0623565;HP=8;NF=7;NR=14;NS=52;CA=0;DP=325 +1 2089182 rs34571180;-/CTC,mills,venter GCCTC GC 100 PASS AF=0.116512;HP=2;DB;NF=9;NR=4;NS=51;CA=0;DP=440 +1 2089950 . CG CGGGG 100 PASS AF=0.178382;HP=2;NF=20;NR=7;NS=51;CA=0;DP=444 +1 2091793 rs56317708;-/GATA,venter,watson AA AAGATA 100 PASS AF=0.896718;HP=2;DB;NF=37;NR=55;NS=52;CA=0;DP=525 +1 2094394 watson TCCACC TC 100 PASS AF=0.191274;HP=2;NF=15;NR=11;NS=52;CA=0;DP=554 +1 2099298 . TG TGG 100 PASS AF=0.234547;HP=1;NF=15;NR=4;NS=51;CA=0;DP=434 +1 2101678 . AGACG AG 100 PASS AF=0.0220699;HP=1;NF=10;NR=4;NS=51;CA=0;DP=533 +1 2104518 rs55672189;-/CGTCTC,venter AG AGTCTCCG 32 PASS AF=0.0318159;HP=1;DB;NF=1;NR=2;NS=51;CA=0;DP=303 +1 2110593 rs34825103;-/C TG TGG 100 PASS AF=0.0674605;HP=1;DB;NF=1;NR=4;NS=52;CA=M;DP=336 +1 2114205 . TT TTTGT 14 PASS AF=0.0440601;HP=4;NF=24;NR=27;NS=52;CA=0;DP=414 +1 2118677 rs35613376;-/T,venter GA GAA 100 PASS AF=0.110597;HP=1;DB;NF=4;NR=6;NS=51;CA=0;DP=395 +1 2129208 venter CGTGTGTGTGTGTGTGTGTGTG CG 100 PASS AF=0.312577;HP=1;NF=50;NR=42;NS=51;CA=0;DP=395 +1 2136104 rs34745034;-/AC,venter,watson CTGT CT 100 PASS AF=0.148774;HP=1;DB;NF=9;NR=15;NS=51;CA=0;DP=394 +1 2147798 . CGG CG 100 PASS AF=0.069257;HP=5;NF=3;NR=7;NS=51;CA=0;DP=433 +1 2156467 rs34646035;-/A,venter GG GTG 100 PASS AF=0.0650203;HP=2;DB;NF=3;NR=2;NS=51;CA=0;DP=299 +1 2163248 rs34969427;-/CA,venter,watson CT CTGT 59 PASS AF=0.323344;HP=1;DB;NF=36;NR=42;NS=52;CA=0;DP=622 +1 2168152 rs34184068;-/C TG TGG 100 PASS AF=0.267631;HP=8;DB;NF=12;NR=25;NS=52;CA=0;DP=462 +1 2173905 rs59705675;-/C,venter GCC GC 100 PASS AF=0.519185;HP=4;DB;NF=28;NR=31;NS=52;CA=0;DP=472 +1 2178426 . ATCTCT AT 59 PASS AF=0.0153899;HP=1;NF=1;NR=2;NS=52;CA=0;DP=558 +1 2180516 . TG TGGG 15 PASS AF=0.10873;HP=1;NF=7;NR=3;NS=52;CA=0;DP=495 +1 2193017 rs35691128;-/C,venter TG TGG 100 PASS AF=0.296206;HP=9;DB;NF=9;NR=11;NS=52;CA=0;DP=367 +1 2204648 . AGGGG AG 100 PASS AF=0.0847086;HP=8;NF=9;NR=7;NS=52;CA=0;DP=441 +1 2211603 . TG TGGGGGGGGGG 100 PASS AF=0.176;HP=1;NF=5;NR=9;NS=52;CA=0;DP=507 +1 2211835 rs35471620;-/C,venter CG CGG 100 PASS AF=0.403922;HP=3;DB;NF=20;NR=20;NS=51;CA=0;DP=363 +1 2213004 rs35841716;-/G,mills,venter TGG TG 100 PASS AF=0.938006;HP=7;DB;NF=35;NR=9;NS=52;CA=0;DP=297 +1 2214726 . GC GCC 100 PASS AF=0.415474;HP=9;NF=18;NR=19;NS=51;CA=0;DP=416 +1 2220552 rs35472917;-/C,venter AGG AG 100 PASS AF=0.609848;HP=9;DB;NF=24;NR=22;NS=51;CA=0;DP=385 +1 2221276 . GC GCC 23 PASS AF=0.0895016;HP=2;NF=1;NR=11;NS=50;CA=0;DP=396 +1 2222657 . AC ACC 16 PASS AF=0.0530452;HP=2;NF=1;NR=3;NS=51;CA=0;DP=404 +1 2223900 . CAGGA CA 100 PASS AF=0.105506;HP=1;NF=9;NR=6;NS=52;CA=0;DP=517 +1 2232109 . CAGG CG 100 PASS AF=0.220422;HP=1;NF=14;NR=13;NS=51;CA=0;DP=430 +1 2233476 rs34394327;-/CGTTT,mills,venter,watson CC CCGTTTC 100 PASS AF=0.982218;HP=3;DB;NF=18;NR=31;NS=52;CA=0;DP=378 +1 2238242 rs56200665;-/C,mills GG GCG 100 PASS AF=0.745403;HP=4;DB;NF=37;NR=40;NS=51;CA=0;DP=419 +1 2242260 rs34121936;-/C AGG AG 100 PASS AF=0.107749;HP=4;DB;NF=7;NR=6;NS=51;CA=0;DP=427 +1 2246276 rs61120130;-/TGC,venter GG GGCTG 100 PASS AF=0.447977;HP=3;DB;NF=13;NR=17;NS=51;CA=0;DP=403 +1 2246469 . TT TTCCCTCCCTTCCTTCCTTCCCTCCCT 100 PASS AF=0.0710328;HP=3;NF=8;NR=6;NS=51;CA=B;DP=731 +1 2246586 rs59175712;-/CT CC CCTC 100 PASS AF=0.378253;HP=2;DB;NF=33;NR=29;NS=50;CA=0;DP=515 +1 2248450 rs61135926;-/CACA AA AACACA 100 PASS AF=0.367115;HP=3;DB;NF=24;NR=19;NS=51;CA=0;DP=445 +1 2248486 . CAGA CA 100 PASS AF=0.108968;HP=1;NF=14;NR=11;NS=51;CA=M;DP=382 +1 2248806 rs59142249;-/A CA CAA 100 PASS AF=0.0756571;HP=1;DB;NF=4;NR=12;NS=51;CA=0;DP=728 +1 2255198 . TGCTGGAAAGAACAG TG 100 PASS AF=0.115149;HP=1;NF=9;NR=12;NS=51;CA=0;DP=470 +1 2267148 . ACACACAGA AA 100 PASS AF=0.128331;HP=1;NF=4;NR=6;NS=51;CA=0;DP=681 +1 2268675 . TG TGG 10 PASS AF=0.0406249;HP=1;NF=7;NR=3;NS=52;CA=0;DP=508 +1 2269958 . GCACGCACACGCAC GC 40 PASS AF=0.0297002;HP=1;NF=6;NR=7;NS=50;CA=0;DP=288 +1 2270248 . CCTG CG 100 PASS AF=0.21901;HP=4;NF=14;NR=17;NS=52;CA=0;DP=478 +1 2272049 . AGGGGTGGCACGG AG 100 PASS AF=0.0657391;HP=4;NF=20;NR=19;NS=52;CA=0;DP=465 +1 2272576 rs35424701;-/T TA TAA 100 PASS AF=0.0794139;HP=1;DB;NF=5;NR=5;NS=51;CA=0;DP=426 +1 2273487 . TAA TA 10 PASS AF=0.0158231;HP=10;NF=25;NR=9;NS=51;CA=0;DP=564 +1 2282631 rs59328016;-/G AG AGG 100 PASS AF=0.230902;HP=1;DB;NF=1;NR=6;NS=52;CA=M;DP=310 +1 2282847 rs34534255;-/AG AC ACTC 100 PASS AF=0.108076;HP=1;DB;NF=5;NR=4;NS=50;CA=0;DP=293 +1 2284162 . CA CAA 12 PASS AF=0.0508845;HP=10;NF=7;NR=7;NS=52;CA=0;DP=406 +1 2285124 . TAAAAA TA 100 PASS AF=0.226133;HP=8;NF=14;NR=5;NS=52;CA=0;DP=315 +1 2288255 rs56670882;-/TACATAGAAAAA,venter,watson CAAAATACATAGAA CA 100 PASS AF=0.154865;HP=4;DB;NF=46;NR=50;NS=51;CA=0;DP=466 +1 2291012 venter ATAATT AT 100 PASS AF=0.140631;HP=1;NF=7;NR=9;NS=51;CA=0;DP=365 +1 2292525 rs60502597;-/CACAACAAC,venter CA CACAACCACAA 100 PASS AF=0.411828;HP=1;DB;NF=18;NR=3;NS=52;CA=0;DP=515 +1 2305015 rs35699260;-/T,venter CAG CG 100 PASS AF=0.283002;HP=1;DB;NF=14;NR=17;NS=51;CA=0;DP=451 +1 2310430 . AA AAAGA 100 PASS AF=0.382413;HP=6;NF=20;NR=11;NS=52;CA=0;DP=408 +1 2314333 venter CG CGGACGCCAGGCAGAGGACTTCATCCCAGGCTTCAGTGCTCCTG 100 PASS AF=0.736856;HP=2;NF=1;NR=2;NS=52;CA=0;DP=679 +1 2319273 rs57204595;-/C ACC AC 100 PASS AF=0.125223;HP=2;DB;NF=7;NR=13;NS=52;CA=0;DP=523 +1 2322519 . TCCT TT 100 PASS AF=0.200476;HP=2;NF=2;NR=10;NS=50;CA=0;DP=413 +1 2322562 . TCCACCCTCC TC 100 PASS AF=0.3747;HP=2;NF=8;NR=15;NS=51;CA=0;DP=325 +1 2322680 . CT CTT 100 PASS AF=0.284453;HP=1;NF=26;NR=24;NS=52;CA=M;DP=388 +1 2323804 venter TC TCC 100 PASS AF=0.865363;HP=3;NF=38;NR=47;NS=50;CA=0;DP=438 +1 2325452 . CG CGG 39 PASS AF=0.0242463;HP=3;NF=5;NR=8;NS=51;CA=0;DP=547 +1 2332518 . GA GAA 100 PASS AF=0.0862532;HP=1;NF=5;NR=13;NS=51;CA=0;DP=414 +1 2337697 rs55744642;-/CGACA,venter,watson GG GGGACAG 100 PASS AF=0.867582;HP=3;DB;NF=16;NR=23;NS=51;CA=0;DP=383 +1 2338712 rs34210450;-/AGCTTCCC,mills,venter GC GCCCAGCTTC 100 PASS AF=0.431742;HP=3;DB;NF=24;NR=15;NS=52;CA=0;DP=504 +1 2341261 . TCC TC 20 PASS AF=0.13716;HP=9;NF=4;NR=20;NS=51;CA=0;DP=258 +1 2343280 rs60532031;-/AAAAG,watson GA GAAGAAA 100 PASS AF=0.0544808;HP=2;DB;NF=2;NR=10;NS=49;CA=0;DP=348 +1 2343570 venter AA AAAACA 100 PASS AF=0.0882931;HP=6;NF=28;NR=18;NS=52;CA=0;DP=434 +1 2344468 . TTTTGT TT 100 PASS AF=0.233529;HP=7;NF=49;NR=55;NS=52;CA=0;DP=493 +1 2345597 rs35560781;-/T,venter TAA TA 100 PASS AF=0.501718;HP=6;DB;NF=36;NR=26;NS=52;CA=0;DP=532 +1 2352446 . CGTG CG 16 PASS AF=0.0185013;HP=1;NF=10;NR=25;NS=52;CA=0;DP=432 +1 2352629 rs35263617;-/CA,venter CG CGTG 100 PASS AF=0.4693;HP=1;DB;NF=44;NR=38;NS=51;CA=0;DP=539 +1 2355283 rs35314501;-/G TC TCC 100 PASS AF=0.408524;HP=4;DB;NF=21;NR=18;NS=52;CA=0;DP=436 +1 2356275 rs34090130;-/G,mills AGG AG 100 PASS AF=0.172214;HP=6;DB;NF=16;NR=9;NS=51;CA=0;DP=415 +1 2356753 rs58056215;-/TGGAGGC TGGCTGGAG TG 100 PASS AF=0.178356;HP=2;DB;NF=43;NR=59;NS=51;CA=0;DP=429 +1 2357119 . TGG TG 100 PASS AF=0.179635;HP=6;NF=12;NR=18;NS=52;CA=0;DP=495 +1 2357323 . TCCCT TT 100 PASS AF=0.0931072;HP=3;NF=8;NR=9;NS=52;CA=0;DP=484 +1 2357636 . CTCCACCTTT CT 100 PASS AF=0.252701;HP=1;NF=11;NR=9;NS=47;CA=M;DP=266 +1 2358758 . CAA CA 26 PASS AF=0.0241071;HP=3;NF=1;NR=3;NS=51;CA=0;DP=486 +1 2360543 rs34299371;-/G,venter GCC GC 100 PASS AF=0.460241;HP=7;DB;NF=18;NR=28;NS=51;CA=0;DP=403 +1 2365835 rs35499456;-/A GT GTT 100 PASS AF=0.299753;HP=3;DB;NF=19;NR=20;NS=52;CA=0;DP=431 +1 2370798 . AAACCA AA 100 PASS AF=0.315002;HP=4;NF=56;NR=52;NS=52;CA=0;DP=505 +1 2379981 rs35697743;-/C,venter TGC TC 100 PASS AF=0.0396508;HP=1;DB;NF=1;NR=5;NS=50;CA=0;DP=425 +1 2383170 rs35931789;-/T,venter CC CAC 100 PASS AF=0.441832;HP=7;DB;NF=24;NR=21;NS=52;CA=0;DP=453 +1 2383775 . ACC AC 19 PASS AF=0.0298335;HP=5;NF=6;NR=2;NS=52;CA=0;DP=442 +1 2388741 watson GCCTTCCTCAC GC 100 PASS AF=0.134128;HP=2;NF=6;NR=9;NS=47;CA=0;DP=257 +1 2394261 rs34886292;-/T,venter CA CAA 100 PASS AF=0.640008;HP=1;DB;NF=28;NR=33;NS=51;CA=0;DP=459 +1 2395694 venter AGG AG 100 PASS AF=0.518622;HP=3;NF=29;NR=23;NS=50;CA=0;DP=387 +1 2406522 rs35886782;-/CTCTGGACGCT,venter,watson TG TGCTCTCTGGACG 100 PASS AF=0.531691;HP=1;DB;NF=12;NR=19;NS=51;CA=0;DP=452 +1 2429911 rs3831090;-/AT,mills TT TTAT 100 PASS AF=0.138967;HP=3;DB;NF=24;NR=13;NS=52;CA=0;DP=328 +1 2458287 . CGTG CG 100 PASS AF=0.0696687;HP=1;NF=38;NR=32;NS=52;CA=0;DP=613 +1 2458465 . AGTG AG 31 PASS AF=0.0212179;HP=1;NF=18;NR=32;NS=51;CA=0;DP=600 +1 2460527 . TG TGCGGCCCATCTCAG 51 PASS AF=0.164756;HP=1;NF=1;NR=4;NS=51;CA=0;DP=496 +1 2477778 . AC ACCC 100 PASS AF=0.157812;HP=2;NF=2;NR=11;NS=51;CA=0;DP=389 +1 2501833 rs34000217;-/ATT AA AAATA 100 PASS AF=0.437274;HP=5;DB;NF=19;NR=23;NS=51;CA=0;DP=337 +1 2503512 rs59345997;-/CAAA AAAACA AA 100 PASS AF=0.46764;HP=4;DB;NF=44;NR=29;NS=52;CA=0;DP=456 +1 2506681 . TG TGGG 46 PASS AF=0.310909;HP=9;NF=14;NR=8;NS=51;CA=0;DP=273 +1 2513520 rs5772070;-/G,mills CGG CG 100 PASS AF=0.652792;HP=8;DB;NF=8;NR=34;NS=51;CA=0;DP=275 +1 2517761 . TGC TC 100 PASS AF=0.0839269;HP=1;NF=3;NR=6;NS=50;CA=0;DP=359 +1 2520201 rs34705971;-/C,venter AG AGG 100 PASS AF=0.612406;HP=1;DB;NF=42;NR=46;NS=52;CA=0;DP=518 +1 2521983 . TCAAACAAACAAAC TC 100 PASS AF=0.365407;HP=1;NF=35;NR=29;NS=52;CA=0;DP=501 +1 2522019 . CT CTGTT 100 PASS AF=0.523695;HP=1;NF=28;NR=12;NS=52;CA=0;DP=410 +1 2522313 rs34791736;-/A,venter CT CTT 100 PASS AF=0.621139;HP=1;DB;NF=47;NR=24;NS=52;CA=0;DP=472 +1 2524952 rs35090174;-/CT ACTC AC 100 PASS AF=0.224915;HP=1;DB;NF=19;NR=15;NS=51;CA=0;DP=517 +1 2529806 . CATA CA 100 PASS AF=0.236462;HP=1;NF=22;NR=13;NS=51;CA=0;DP=625 +1 2529841 . CACATA CA 100 PASS AF=0.190786;HP=1;NF=20;NR=19;NS=51;CA=0;DP=663 +1 2530205 rs61132608;-/CATATA,watson CA CACATATA 100 PASS AF=0.547698;HP=1;DB;NF=20;NR=28;NS=52;CA=0;DP=660 +1 2543402 rs5772073;-/GAG,mills TAGGA TA 100 PASS AF=0.24689;HP=1;DB;NF=12;NR=31;NS=52;CA=0;DP=543 +1 2547236 rs58240187;-/AGA,venter,watson GG GGAAG 100 PASS AF=0.531939;HP=2;DB;NF=25;NR=25;NS=52;CA=0;DP=444 +1 2551119 rs35955733;-/CCC,venter,watson GCCCC GC 100 PASS AF=0.606107;HP=9;DB;NF=24;NR=35;NS=52;CA=0;DP=492 +1 2551885 rs36036408;-/AC,venter CGTG CG 100 PASS AF=0.356574;HP=1;DB;NF=39;NR=38;NS=52;CA=0;DP=803 +1 2552076 . CGTG CG 100 PASS AF=0.066645;HP=1;NF=25;NR=15;NS=51;CA=0;DP=782 +1 2552384 . CTGT CT 12 PASS AF=0.0121638;HP=1;NF=13;NR=25;NS=52;CA=0;DP=612 +1 2556252 . ACACTC AC 59 PASS AF=0.143579;HP=1;NF=12;NR=9;NS=49;CA=0;DP=331 +1 2578474 . CCACACCCCCAG CG 100 PASS AF=0.930867;HP=3;NF=16;NR=12;NS=51;CA=M;DP=281 +1 2688911 rs34425096;-/TC,venter TTCT TT 100 PASS AF=0.26327;HP=5;DB;NF=17;NR=12;NS=52;CA=0;DP=451 +1 2691366 rs36213670;-/CTCTGGGCCA,mills,venter GCTCTGGGCCAC GC 39 PASS AF=0.191253;HP=1;DB;NF=21;NR=36;NS=52;CA=0;DP=344 +1 2691723 rs57511628;-/ACCCCAGGAGATCCCTGC TA TACCCCAGGAGATCCCTGCA 100 PASS AF=0.332823;HP=1;DB;NF=6;NR=7;NS=52;CA=0;DP=453 +1 2703254 . CA CAA 100 PASS AF=0.111948;HP=3;NF=8;NR=13;NS=51;CA=0;DP=502 +1 2703885 . AC ACC 100 PASS AF=0.0959517;HP=6;NF=24;NR=11;NS=51;CA=0;DP=531 +1 2725125 rs34936518;-/C,venter GCT GT 100 PASS AF=0.375093;HP=1;DB;NF=33;NR=32;NS=52;CA=0;DP=621 +1 2725735 . AACACA AA 24 PASS AF=0.0139746;HP=2;NF=16;NR=4;NS=51;CA=0;DP=639 +1 2726135 rs34620269;-/CA GCAC GC 100 PASS AF=0.0410325;HP=1;DB;NF=28;NR=22;NS=52;CA=0;DP=626 +1 2726213 . GC GCAC 13 PASS AF=0.0257105;HP=1;NF=8;NR=9;NS=52;CA=0;DP=552 +1 2746483 . AC ACC 40 PASS AF=0.0544668;HP=1;NF=4;NR=12;NS=51;CA=0;DP=544 +1 2747281 . TG TGAGAG 100 PASS AF=0.152256;HP=1;NF=11;NR=8;NS=52;CA=0;DP=855 +1 2754002 rs36202379;-/CTGCTTGT,mills,watson ATTGTCTGCT AT 100 PASS AF=0.260861;HP=2;DB;NF=32;NR=35;NS=52;CA=0;DP=496 +1 2755160 rs34916159;-/A TA TAA 100 PASS AF=0.532865;HP=7;DB;NF=10;NR=34;NS=52;CA=0;DP=533 +1 2755983 . GCC GC 100 PASS AF=0.106339;HP=3;NF=18;NR=26;NS=52;CA=M;DP=700 +1 2765711 . AA AAGGAAGGA 100 PASS AF=0.686149;HP=2;NF=11;NR=8;NS=50;CA=0;DP=364 +1 2765863 . AG AGG 100 PASS AF=0.999885;HP=1;NF=14;NR=36;NS=49;CA=0;DP=364 +1 2765952 . AG AGG 100 PASS AF=0.0789769;HP=1;NF=29;NR=29;NS=51;CA=B;DP=851 +1 2779479 . TTTTCTTCTCTTTCT TT 100 PASS AF=0.712577;HP=4;NF=29;NR=22;NS=50;CA=0;DP=322 +1 2794338 rs34131736;-/T CTG CG 100 PASS AF=0.089184;HP=1;DB;NF=7;NR=4;NS=51;CA=0;DP=440 +1 2801123 . TCCTCCCCACCCTGAC TC 48 PASS AF=0.0412327;HP=2;NF=13;NR=18;NS=51;CA=0;DP=343 +1 2803308 watson CATG CG 100 PASS AF=0.160766;HP=1;NF=23;NR=20;NS=52;CA=0;DP=816 +1 2805468 rs56260225;-/ACAA AAAACA AA 100 PASS AF=0.859977;HP=4;DB;NF=62;NR=35;NS=51;CA=0;DP=433 +1 2806441 rs34966309;-/G CG CGG 100 PASS AF=0.211987;HP=4;DB;NF=20;NR=11;NS=52;CA=0;DP=441 +1 2810388 . GCC GC 100 PASS AF=0.11183;HP=2;NF=8;NR=5;NS=51;CA=0;DP=431 +1 2822166 . TACATGCACACA TA 100 PASS AF=0.150719;HP=1;NF=43;NR=52;NS=52;CA=0;DP=844 +1 2822270 rs59677991;-/GC GGCG GG 18 NoQCALL AF=0.0194725;HP=2;DB;NF=15;NR=5;NS=52;CA=0;DP=806 +1 2822473 . CACACAC CC 100 PASS AF=0.138944;HP=1;NF=6;NR=7;NS=52;CA=0;DP=951 +1 2827616 . CAAGC CC 52 PASS AF=0.132317;HP=2;NF=8;NR=4;NS=51;CA=0;DP=300 +1 2828576 . CG CTG 100 PASS AF=0.168378;HP=1;NF=8;NR=2;NS=52;CA=0;DP=325 +1 2829365 rs35758696;-/A TAA TA 100 PASS AF=0.216995;HP=6;DB;NF=20;NR=20;NS=51;CA=0;DP=531 +1 2833106 . TG TGTTGGG 100 PASS AF=0.237115;HP=1;NF=11;NR=4;NS=52;CA=0;DP=336 +1 2834384 . AC ACC 32 PASS AF=0.0617917;HP=1;NF=3;NR=5;NS=52;CA=0;DP=592 +1 2835704 rs35824541;-/G AGG AG 100 PASS AF=0.188967;HP=3;DB;NF=15;NR=11;NS=52;CA=0;DP=691 +1 2836635 rs56691957;-/AT CATG CG 100 PASS AF=0.126742;HP=1;DB;NF=8;NR=13;NS=52;CA=0;DP=611 +1 2851063 . ATGTGTGTCT AT 100 PASS AF=0.224053;HP=1;NF=34;NR=32;NS=52;CA=0;DP=798 +1 2859183 rs34869376;-/CT ACTC AC 100 PASS AF=0.228335;HP=1;DB;NF=11;NR=14;NS=52;CA=0;DP=446 +1 2859269 rs34009406;-/C AC ACC 100 PASS AF=0.168197;HP=2;DB;NF=8;NR=14;NS=52;CA=0;DP=460 +1 2862455 rs34488344;-/T GT GTT 100 PASS AF=0.140555;HP=10;DB;NF=25;NR=16;NS=52;CA=0;DP=484 +1 2866073 . AC ACC 56 PASS AF=0.0758065;HP=1;NF=2;NR=11;NS=51;CA=0;DP=513 +1 2871504 . TA TACTAA 100 PASS AF=0.128765;HP=1;NF=11;NR=12;NS=52;CA=0;DP=676 +1 2871601 rs60410855;-/TCCA CC CCCATC 100 PASS AF=0.11635;HP=3;DB;NF=19;NR=14;NS=52;CA=0;DP=682 +1 2874709 . GT GTT 100 PASS AF=0.138394;HP=9;NF=8;NR=12;NS=51;CA=0;DP=534 +1 2876814 rs5772089;-/A,mills,venter GG GAG 100 PASS AF=0.999994;HP=10;DB;NF=39;NR=42;NS=50;CA=0;DP=343 +1 2877421 rs35085736;-/C,venter GC GCC 100 PASS AF=0.582204;HP=6;DB;NF=29;NR=37;NS=50;CA=0;DP=426 +1 2881114 . GG GTG 100 PASS AF=0.586283;HP=5;NF=16;NR=5;NS=47;CA=M;DP=256 +1 2883970 . GG GCG 16 PASS AF=0.516075;HP=4;NF=6;NR=2;NS=51;CA=M;DP=332 +1 2885504 . TCC TC 29 PASS AF=0.140908;HP=9;NF=12;NR=8;NS=51;CA=0;DP=353 +1 2886983 . AG AGG 50 PASS AF=0.0436199;HP=3;NF=7;NR=2;NS=50;CA=0;DP=401 +1 2887864 rs57379840;-/T,venter CG CTG 100 PASS AF=0.770236;HP=2;DB;NF=41;NR=25;NS=51;CA=0;DP=375 +1 2892284 . CAT CT 100 PASS AF=0.0885935;HP=1;NF=23;NR=17;NS=52;CA=0;DP=685 +1 2892433 venter AT ATCCATCCTCCATCCT 100 PASS AF=0.814532;HP=1;NF=13;NR=12;NS=52;CA=0;DP=620 +1 2892472 . CCCATC CC 100 PASS AF=0.181828;HP=3;NF=50;NR=61;NS=52;CA=0;DP=633 +1 2899352 . CTA CA 100 PASS AF=0.0433393;HP=1;NF=5;NR=2;NS=51;CA=0;DP=512 +1 2902379 . TAGA TA 40 PASS AF=0.0165292;HP=1;NF=3;NR=2;NS=51;CA=0;DP=476 +1 2903930 rs36097640;-/A TAA TA 12 PASS AF=0.0522384;HP=8;DB;NF=13;NR=15;NS=51;CA=0;DP=535 +1 2907194 rs35693840;-/G AG AGG 100 PASS AF=0.136995;HP=5;DB;NF=14;NR=8;NS=52;CA=0;DP=516 +1 2916313 . AC ACC 40 PASS AF=0.0606632;HP=1;NF=1;NR=13;NS=52;CA=0;DP=529 +1 2923107 . GA GGGGGGAA 35 PASS AF=0.311458;HP=1;NF=1;NR=2;NS=50;CA=0;DP=285 +1 2923994 . AAGGA AA 100 PASS AF=0.136914;HP=3;NF=4;NR=16;NS=52;CA=0;DP=475 +1 2926544 rs58065168;-/G TG TGG 100 PASS AF=0.231871;HP=7;DB;NF=23;NR=13;NS=51;CA=0;DP=445 +1 2927774 . GTCT GT 100 PASS AF=0.039848;HP=1;NF=24;NR=39;NS=52;CA=0;DP=466 +1 2928267 rs4013154;-/TCT CAGAA CA 100 PASS AF=0.176094;HP=1;DB;NF=10;GC;NR=20;NS=52;CA=0;DP=390 +1 2931584 . GTGGTGTTTTCATT GT 100 PASS AF=0.171247;HP=1;NF=23;NR=10;NS=52;CA=0;DP=486 +1 2932462 . GT GTGAT 56 PASS AF=0.766604;HP=1;NF=33;NR=13;NS=52;CA=M;DP=790 +1 2932531 . GT GTGGTGAT 56 PASS AF=0.365205;HP=1;NF=19;NR=4;NS=52;CA=M;DP=738 +1 2938240 rs57953122;-/AAGCC AC ACCAAGC 100 PASS AF=0.229942;HP=2;DB;NF=5;NR=7;NS=52;CA=0;DP=387 +1 2939820 rs35035410;-/C,venter GCC GC 100 PASS AF=0.270114;HP=6;DB;NF=15;NR=21;NS=52;CA=0;DP=477 +1 2940602 . GA GAA 100 PASS AF=0.245189;HP=10;NF=31;NR=30;NS=52;CA=0;DP=516 +1 2941986 . ACCC AC 100 PASS AF=0.242307;HP=10;NF=20;NR=20;NS=52;CA=0;DP=471 +1 2943041 rs34450334;-/G,mills CGG CG 100 PASS AF=0.212427;HP=8;DB;NF=13;NR=12;NS=52;CA=0;DP=523 +1 2943605 rs5772091;-/C,mills GC GCC 100 PASS AF=0.155328;HP=1;DB;NF=7;NR=7;NS=52;CA=0;DP=349 +1 2946559 . TT TTGT 100 PASS AF=0.174249;HP=3;NF=13;NR=14;NS=52;CA=0;DP=596 +1 2948391 . TT TTTTTCT 100 PASS AF=0.137955;HP=5;NF=19;NR=16;NS=52;CA=0;DP=557 +1 2949076 rs33910396;-/G,mills CG CGG 100 PASS AF=0.102902;HP=1;DB;NF=3;NR=8;NS=52;CA=0;DP=413 +1 2950056 . TC TCAAACAAAC 100 PASS AF=0.133966;HP=1;NF=9;NR=9;NS=51;CA=0;DP=587 +1 2950689 rs60031908;-/A CAA CA 100 PASS AF=0.200188;HP=8;DB;NF=20;NR=25;NS=51;CA=0;DP=517 +1 2958314 . CC CCCATC 100 PASS AF=0.190271;HP=3;NF=39;NR=18;NS=52;CA=M;DP=454 +1 2961502 rs60708459;-/T AT ATT 100 PASS AF=0.219472;HP=3;DB;NF=14;NR=16;NS=52;CA=0;DP=460 +1 2968615 . AG AGG 100 PASS AF=0.288912;HP=2;NF=11;NR=13;NS=51;CA=0;DP=324 +1 2982005 . GT GGGTT 100 PASS AF=0.189932;HP=5;NF=6;NR=5;NS=52;CA=0;DP=460 +1 2984462 rs34471979;-/C,venter TCC TC 100 PASS AF=0.423837;HP=2;DB;NF=20;NR=27;NS=51;CA=0;DP=459 +1 2985828 rs5772093;-/TTCGGGG,mills,venter,watson CT CTTCGGGGT 100 PASS AF=0.888966;HP=1;DB;NF=22;NR=15;NS=49;CA=0;DP=372 +1 2987353 . AGTG AG 39 PASS AF=0.0534166;HP=1;NF=13;NR=12;NS=51;CA=0;DP=341 +1 2990018 . TC TGC 51 PASS AF=0.347647;HP=1;NF=9;NR=5;NS=52;CA=0;DP=328 +1 2992552 rs55740340;-/TTGT,mills,venter,watson CT CTGTTT 100 PASS AF=0.633228;HP=1;DB;NF=31;NR=31;NS=52;CA=0;DP=471 +1 2994869 . TT TTTAT 48 PASS AF=0.246512;HP=4;NF=8;NR=15;NS=49;CA=0;DP=238 +1 2996339 rs60239912;-/TCATTCAT CT CTCATTCATT 100 PASS AF=0.288255;HP=1;DB;NF=27;NR=24;NS=52;CA=0;DP=550 +1 2996940 . TG TGGG 52 PASS AF=0.252534;HP=1;NF=5;NR=3;NS=51;CA=0;DP=485 +1 2997430 rs58914207;-/TC TTCT TT 17 PASS AF=0.0239916;HP=3;DB;NF=1;NR=3;NS=51;CA=0;DP=533 +1 2998548 rs3067411;-/GC,mills,watson TT TGCT 100 PASS AF=0.513959;HP=2;DB;NF=16;NR=33;NS=51;CA=0;DP=457 +1 2998746 rs33948447;-/CTGAGGGTAT,mills,watson CCTGAGGGTATC CC 100 PASS AF=0.567187;HP=2;DB;NF=32;NR=26;NS=51;CA=0;DP=446 +1 2998922 rs3067390;-/CA,mills,watson CTGT CT 100 PASS AF=0.344398;HP=1;DB;NF=25;NR=25;NS=52;CA=0;DP=544 +1 3001309 . TCTTCC TC 100 PASS AF=0.122521;HP=1;NF=13;NR=16;NS=51;CA=0;DP=463 +1 3003643 rs34727240;-/A CA CAA 100 PASS AF=0.30407;HP=4;DB;NF=23;NR=14;NS=51;CA=0;DP=462 +1 3003980 . ATTCT AT 100 PASS AF=0.0770408;HP=2;NF=12;NR=8;NS=51;CA=0;DP=436 +1 3015507 rs36215320;-/AATAAT,mills AAATAATA AA 100 PASS AF=0.341849;HP=4;DB;NF=19;NR=21;NS=52;CA=M;DP=287 +1 3020627 . GC GCGCGCAC 45 PASS AF=0.0864166;HP=1;NF=3;NR=4;NS=52;CA=0;DP=675 +1 3020729 . GCAC GC 100 PASS AF=0.270815;HP=1;NF=26;NR=22;NS=52;CA=0;DP=511 +1 3020780 . GCAC GC 100 PASS AF=0.0529136;HP=1;NF=14;NR=13;NS=52;CA=0;DP=580 +1 3020851 rs36140038;-/G,venter CC CGC 100 PASS AF=0.0570603;HP=2;DB;NF=7;NR=8;NS=52;CA=0;DP=580 +1 3020930 . GCAC GC 100 PASS AF=0.0608239;HP=1;NF=21;NR=20;NS=52;CA=0;DP=662 +1 3020996 . ACT AT 100 PASS AF=0.0376658;HP=1;NF=4;NR=2;NS=52;CA=0;DP=646 +1 3021049 rs58793198;-/CA AA AACA 100 PASS AF=0.0822964;HP=2;DB;NF=19;NR=18;NS=52;CA=0;DP=756 +1 3024532 . TGTGTGCG TG 100 PASS AF=0.0453628;HP=1;NF=12;NR=35;NS=51;CA=0;DP=585 +1 3035092 venter,watson CTCCCACCATGCTACTGGAGACCAT CT 100 PASS AF=0.175148;HP=1;NF=41;NR=54;NS=51;CA=0;DP=464 +1 3035605 rs56967751;-/TG,venter,watson AG AGTG 100 PASS AF=0.387697;HP=1;DB;NF=30;NR=25;NS=51;CA=0;DP=671 +1 3035812 . CGTG CG 100 PASS AF=0.051827;HP=1;NF=28;NR=20;NS=51;CA=0;DP=643 +1 3035887 . ATGT AT 50 PASS AF=0.0421027;HP=1;NF=24;NR=34;NS=52;CA=0;DP=556 +1 3036291 rs36033160;-/CCG CT CCCGT 100 PASS AF=0.0605711;HP=1;DB;NF=3;NR=5;NS=51;CA=0;DP=428 +1 3037949 rs34840011;-/A,venter TA TAA 100 PASS AF=0.096326;HP=8;DB;NF=5;NR=6;NS=52;CA=0;DP=462 +1 3046082 rs35271327;-/T AT ATT 19 PASS AF=0.0473995;HP=7;DB;NF=9;NR=8;NS=52;CA=0;DP=430 +1 3049499 . ACC AC 27 PASS AF=0.0269129;HP=3;NF=3;NR=1;NS=51;CA=0;DP=373 +1 3053337 . TGG TG 100 PASS AF=0.205181;HP=7;NF=15;NR=19;NS=52;CA=0;DP=424 +1 3058772 . TCATCC TC 100 PASS AF=0.716787;HP=1;NF=61;NR=51;NS=52;CA=0;DP=435 +1 3069377 . CATGGT CT 100 PASS AF=0.42044;HP=1;NF=3;NR=14;NS=48;CA=M;DP=257 +1 3076481 rs35945121;-/T,mills ATT AT 100 PASS AF=0.33892;HP=10;DB;NF=9;NR=38;NS=52;CA=0;DP=438 +1 3079028 . TA TCA 100 PASS AF=0.0528803;HP=1;NF=5;NR=3;NS=51;CA=0;DP=475 +1 3084256 watson AGTTTAGATACTG AG 100 PASS AF=0.123981;HP=1;NF=18;NR=14;NS=52;CA=0;DP=554 +1 3087172 rs34468831;-/A GAA GA 100 PASS AF=0.0618762;HP=3;DB;NF=2;NR=5;NS=50;CA=0;DP=475 +1 3087517 . CACACGCAGTCTTA CA 100 PASS AF=0.637316;HP=1;NF=41;NR=37;NS=52;CA=0;DP=973 +1 3087777 . TA TACA 100 PASS AF=0.377666;HP=1;NF=43;NR=55;NS=52;CA=M;DP=966 +1 3087871 . CACGGTCTTA CA 100 PASS AF=0.589214;HP=1;NF=16;NR=14;NS=51;CA=0;DP=710 +1 3087938 . AG AGTCTTACACAAGCGG 100 PASS AF=0.469462;HP=1;NF=28;NR=29;NS=52;CA=M;DP=816 +1 3088154 . GG GCAG 100 PASS AF=0.0511127;HP=2;NF=11;NR=10;NS=52;CA=M;DP=894 +1 3088232 rs35125658;-/TT GG GCAG 100 PASS AF=0.0967781;HP=2;DB;NF=3;NR=24;NS=51;CA=M;DP=938 +1 3088301 . CT CTTGCACACGCAGTTT 47 PASS AF=0.0188781;HP=2;NF=5;NR=2;NS=51;CA=M;DP=684 +1 3105704 rs35372326;-/G,mills CGG CG 100 PASS AF=0.0956114;HP=2;DB;NF=6;NR=4;NS=52;CA=0;DP=378 +1 3107408 rs5772098;-/G,mills AG AGG 100 PASS AF=0.107417;HP=5;DB;NF=19;NR=15;NS=52;CA=0;DP=504 +1 3107714 rs34461209;-/G,venter TG TGG 100 PASS AF=0.61875;HP=3;DB;NF=21;NR=28;NS=52;CA=0;DP=454 +1 3108534 rs59512254;-/GA GGAG GG 100 PASS AF=0.184609;HP=2;DB;NF=17;NR=11;NS=52;CA=0;DP=510 +1 3121064 . TG TGAG 59 PASS AF=0.0221492;HP=1;NF=7;NR=3;NS=52;CA=0;DP=555 +1 3131583 rs57750843;-/A GAA GA 100 PASS AF=0.166149;HP=9;DB;NF=21;NR=20;NS=52;CA=0;DP=490 +1 3131742 . GT GGGGGGGGGTT 27 PASS AF=0.243052;HP=3;NF=2;NR=1;NS=49;CA=0;DP=394 +1 3135855 rs34340862;-/TAA,mills CT CTAAT 100 PASS AF=0.183257;HP=1;DB;NF=11;NR=9;NS=51;CA=0;DP=520 +1 3146366 . GGAG GG 100 PASS AF=0.040688;HP=4;NF=13;NR=14;NS=51;CA=0;DP=434 +1 3152159 . AT ATT 100 PASS AF=0.0396994;HP=4;NF=8;NR=9;NS=52;CA=0;DP=489 +1 3157729 venter,watson AG AGGGGTGAGGTG 100 PASS AF=0.830079;HP=4;NF=30;NR=23;NS=51;CA=0;DP=548 +1 3158807 . AGG AG 100 PASS AF=0.705976;HP=6;NF=35;NR=30;NS=52;CA=0;DP=371 +1 3158885 . CATG CG 100 PASS AF=0.09216;HP=1;NF=6;NR=6;NS=51;CA=0;DP=375 +1 3163280 . CAAAATA CA 100 PASS AF=0.148526;HP=4;NF=13;NR=1;NS=49;CA=M;DP=326 +1 3164018 rs5772100;-/A,mills,venter TAA TA 100 PASS AF=0.999998;HP=3;DB;NF=67;NR=69;NS=52;CA=0;DP=511 +1 3174387 . CAGG CG 17 PASS AF=0.0141709;HP=1;NF=1;NR=2;NS=51;CA=0;DP=428 +1 3176024 . GACAGTCCCAGAGGAGCA GA 44 PASS AF=0.0444872;HP=1;NF=3;NR=10;NS=52;CA=M;DP=480 +1 3177102 . AG AGAGGAGGACAGTCGGGGAGGACAGTCCCGG 100 PASS AF=0.346135;HP=1;NF=8;NR=13;NS=52;CA=0;DP=550 +1 3179862 rs35987870;-/GTGG ATGTGT AT 100 PASS AF=0.0762534;HP=1;DB;NF=17;NR=17;NS=51;CA=0;DP=618 +1 3183094 rs33953525;-/GGTGCCGTGAACAGAGCCAGCGAGG,mills AG AGGTGCCGTGAACAGAGCCAGCGAGGG 100 PASS AF=0.665581;HP=2;DB;NF=15;NR=15;NS=52;CA=0;DP=424 +1 3183166 rs35451643;-/C,venter TCC TC 100 PASS AF=0.123295;HP=4;DB;NF=12;NR=6;NS=52;CA=0;DP=460 +1 3184208 rs59663829;-/GCACACACAA TA TGCACACACAAA 100 PASS AF=0.152939;HP=1;DB;NF=4;NR=4;NS=52;CA=0;DP=733 +1 3186299 . ACC AC 100 PASS AF=0.951135;HP=8;NF=16;NR=14;NS=51;CA=0;DP=311 +1 3202609 . TG TGGGGGGG 11 PASS AF=0.122471;HP=1;NF=3;NR=3;NS=52;CA=0;DP=479 +1 3292566 . TC TCGGGGTGCCC 12 PASS AF=0.209628;HP=1;NF=22;NR=17;NS=51;CA=0;DP=462 +1 3292669 . AAGA AA 100 PASS AF=0.312194;HP=8;NF=13;NR=14;NS=51;CA=0;DP=483 +1 3293018 rs35846516;-/A,venter GAA GA 100 PASS AF=0.791047;HP=9;DB;NF=59;NR=44;NS=51;CA=0;DP=507 +1 3293422 rs34150215;-/A,mills,venter TA TAA 100 PASS AF=0.418316;HP=7;DB;NF=27;NR=18;NS=52;CA=0;DP=481 +1 3307979 rs35082175;-/A,venter CAT CT 100 PASS AF=0.379363;HP=1;DB;NF=36;NR=25;NS=52;CA=0;DP=659 +1 3308056 . CATA CA 100 PASS AF=0.0313721;HP=1;NF=4;NR=5;NS=52;CA=0;DP=699 +1 3308306 rs34659426;-/AA CAAA CA 100 PASS AF=0.238591;HP=3;DB;NF=23;NR=22;NS=52;CA=0;DP=732 +1 3308692 . GC GCC 100 PASS AF=0.610676;HP=6;NF=23;NR=26;NS=52;CA=0;DP=447 +1 3309461 . ACCCTCCTCTGAGTCTTCCTCCCCTTCCCGTGC AC 100 PASS AF=0.218197;HP=3;NF=28;NR=41;NS=51;CA=0;DP=430 +1 3313004 . ATT AT 18 PASS AF=0.117282;HP=10;NF=22;NR=12;NS=51;CA=0;DP=407 +1 3315219 rs35154920;-/GT CG CGTG 100 PASS AF=0.407055;HP=1;DB;NF=23;NR=17;NS=52;CA=0;DP=498 +1 3315279 rs34306698;-/AT CG CATG 100 PASS AF=0.27165;HP=1;DB;NF=18;NR=10;NS=51;CA=0;DP=460 +1 3315552 rs61650876;-/ATGT CATGTG CG 100 PASS AF=0.074251;HP=1;DB;NF=10;NR=7;NS=52;CA=0;DP=612 +1 3315608 . CGTG CG 44 PASS AF=0.0200264;HP=1;NF=15;NR=25;NS=52;CA=0;DP=622 +1 3316180 rs34769314;-/GTGA TGTGAG TG 100 PASS AF=0.13026;HP=1;DB;NF=29;NR=21;NS=52;CA=0;DP=930 +1 3316258 rs57503175;-/TGTATGTGCGTGTGTGTGGTGTG GG GGTGTGTGGTGTGTGTATGTGCGTG 100 PASS AF=0.277124;HP=3;DB;NF=3;NR=11;NS=52;CA=0;DP=898 +1 3316338 rs34133894;-/GT GGTG GG 100 PASS AF=0.121606;HP=2;DB;NF=18;NR=27;NS=52;CA=0;DP=901 +1 3316408 . TGG TG 100 PASS AF=0.153074;HP=7;NF=23;NR=10;NS=52;CA=0;DP=898 +1 3316476 rs60842130;-/GTG TGTGG TG 43 PASS AF=0.0151943;HP=1;DB;NF=4;NR=1;NS=52;CA=0;DP=732 +1 3317481 rs34240659;-/AT CATA CA 100 PASS AF=0.127605;HP=1;DB;NF=14;NR=8;NS=52;CA=0;DP=538 +1 3319964 . ACC AC 100 PASS AF=0.0511239;HP=5;NF=12;NR=4;NS=52;CA=0;DP=505 +1 3327173 rs56093721;-/A,venter TAA TA 100 PASS AF=0.89527;HP=9;DB;NF=37;NR=68;NS=52;CA=0;DP=540 +1 3328302 . AG AGGGGGG 53 PASS AF=0.124625;HP=2;NF=13;NR=2;NS=52;CA=0;DP=585 +1 3335208 . CGG CG 100 PASS AF=0.0438559;HP=2;NF=3;NR=3;NS=52;CA=0;DP=448 +1 3335551 rs34869178;-/T CTC CC 100 PASS AF=0.0947355;HP=1;DB;NF=4;NR=8;NS=52;CA=0;DP=487 +1 3342021 rs34485545;-/A TA TAA 100 PASS AF=0.154806;HP=9;DB;NF=25;NR=23;NS=52;CA=0;DP=444 +1 3347098 venter CG CAG 100 PASS AF=0.931731;HP=1;NF=49;NR=54;NS=52;CA=0;DP=497 +1 3348129 rs55866341;-/G,venter CG CGG 100 PASS AF=0.883294;HP=1;DB;NF=55;NR=55;NS=52;CA=0;DP=521 +1 3352897 . AA ACA 46 PASS AF=0.0385898;HP=6;NF=2;NR=6;NS=51;CA=0;DP=407 +1 3353821 rs34792713;-/T AT ATT 36 PASS AF=0.0290672;HP=1;DB;NF=3;NR=3;NS=52;CA=0;DP=428 +1 3356271 . TTCCT TT 15 PASS AF=0.00990969;HP=3;NF=1;NR=1;NS=52;CA=0;DP=537 +1 3356391 rs4018597;-/TA TT TTAT 100 PASS AF=0.0517593;HP=2;DB;NF=13;NR=11;NS=52;CA=0;DP=475 +1 3356436 rs5772104;-/GT CGTG CG 100 PASS AF=0.82813;HP=1;DB;NF=59;NR=53;NS=51;CA=0;DP=449 +1 3356871 . CATG CG 26 PASS AF=0.0193592;HP=1;NF=1;NR=3;NS=51;CA=0;DP=430 +1 3359412 rs34037774;-/G,venter TGG TG 59 PASS AF=0.0301496;HP=2;DB;NF=4;NR=5;NS=52;CA=0;DP=451 +1 3370575 rs35597752;-/TG,venter,watson CTGT CT 100 PASS AF=0.760154;HP=1;DB;NF=43;NR=36;NS=52;CA=0;DP=405 +1 3372018 rs34109718;-/G,venter CGG CG 100 PASS AF=0.891318;HP=3;DB;NF=46;NR=36;NS=51;CA=0;DP=349 +1 3383745 rs57207202;-/C AC ACC 100 PASS AF=0.182529;HP=4;DB;NF=9;NR=7;NS=47;CA=D;DP=229 +1 3384084 rs5772105;-/G,mills,venter CG CGG 100 PASS AF=0.937697;HP=2;DB;NF=49;NR=47;NS=50;CA=0;DP=457 +1 3385833 rs5772106;-/CC,mills,venter,watson ACCC AC 100 PASS AF=0.778535;HP=5;DB;NF=33;NR=14;NS=51;CA=0;DP=418 +1 3387275 rs56102150;-/TC,venter CC CCTC 100 PASS AF=0.999995;HP=4;DB;NF=16;NR=36;NS=50;CA=0;DP=364 +1 3388739 rs58188396;-/GGGGGGCGGGTAGCC GG GGGGGGGCGGGTAGCCG 40 PASS AF=0.263678;HP=7;DB;NF=3;NR=2;NS=48;CA=0;DP=326 +1 3393157 . AAAAAATA AA 100 PASS AF=0.0549314;HP=6;NF=23;NR=18;NS=51;CA=0;DP=468 +1 3393524 . GGTGTG GG 23 PASS AF=0.017751;HP=2;NF=1;NR=19;NS=49;CA=0;DP=266 +1 3409800 . AAGA AA 100 PASS AF=0.0431791;HP=3;NF=1;NR=8;NS=51;CA=0;DP=643 +1 3410131 rs58666986;-/GTGT ATGTGT AT 100 PASS AF=0.0433727;HP=1;DB;NF=7;NR=13;NS=52;CA=0;DP=603 +1 3411485 rs60864742;-/ACACCGGTAGCAAGGCA,mills ACACCGGTAGCAAGGCACC AC 100 PASS AF=0.0858716;HP=1;DB;NF=8;NR=17;NS=52;CA=0;DP=523 +1 3417374 . GCACACGCCCCCACCC GC 20 PASS AF=0.0294079;HP=1;NF=4;NR=3;NS=50;CA=0;DP=447 +1 3429498 rs56204236;-/G CG CGG 100 PASS AF=0.596026;HP=10;DB;NF=6;NR=7;NS=51;CA=0;DP=322 +1 3435396 . CACAGA CA 100 PASS AF=0.0433621;HP=1;NF=2;NR=6;NS=52;CA=0;DP=457 +1 3442767 rs36106109;-/G CG CGG 100 PASS AF=0.112939;HP=5;DB;NF=5;NR=6;NS=50;CA=0;DP=369 +1 3451064 rs36030995;-/C GC GCC 100 PASS AF=0.385449;HP=5;DB;NF=22;NR=12;NS=50;CA=0;DP=388 +1 3456931 rs35289361;-/G AG AGG 100 PASS AF=0.0676076;HP=4;DB;NF=11;NR=9;NS=52;CA=0;DP=554 +1 3467274 watson GGGCTG GG 100 PASS AF=0.132596;HP=3;NF=16;NR=12;NS=51;CA=0;DP=428 +1 3475422 rs61428836;-/G TG TGG 100 PASS AF=0.0480433;HP=3;DB;NF=6;NR=10;NS=52;CA=0;DP=468 +1 3482055 . CA CGTCTTATA 100 PASS AF=0.593516;HP=1;NF=10;NR=11;NS=49;CA=M;DP=256 +1 3482413 mills,watson TCTCC TC 100 PASS AF=0.414589;HP=1;NF=24;NR=32;NS=51;CA=0;DP=496 +1 3485140 venter,watson CCAAC CC 100 PASS AF=0.714294;HP=2;NF=21;NR=32;NS=52;CA=0;DP=460 +1 3486991 rs35452084;-/G,venter AGG AG 100 PASS AF=0.744909;HP=4;DB;NF=15;NR=35;NS=50;CA=0;DP=363 +1 3492812 . CGTG CG 14 PASS AF=0.0148914;HP=1;NF=22;NR=26;NS=51;CA=0;DP=585 +1 3494290 . AC ACAGGACCGGCC 100 PASS AF=0.117184;HP=1;NF=2;NR=22;NS=52;CA=0;DP=464 +1 3496820 rs34860893;-/C,mills,venter ACC AC 100 PASS AF=0.924032;HP=7;DB;NF=33;NR=48;NS=52;CA=0;DP=386 +1 3504928 rs36094767;-/C,venter TC TCC 100 PASS AF=0.786142;HP=4;DB;NF=23;NR=43;NS=51;CA=0;DP=405 +1 3511572 rs3072238;-/TCAC,venter ACACTC AC 100 PASS AF=0.160871;HP=1;DB;NF=22;NR=22;NS=52;CA=0;DP=824 +1 3511789 rs59801836;-/CTCA,watson ACACTC AC 100 PASS AF=0.620819;HP=1;DB;NF=54;NR=52;NS=52;CA=0;DP=740 +1 3511919 . TACA TA 100 PASS AF=0.049568;HP=1;NF=20;NR=22;NS=52;CA=0;DP=729 +1 3511980 rs57128321;-/ACTC,venter,watson AC ACACTC 100 PASS AF=0.937206;HP=1;DB;NF=63;NR=38;NS=52;CA=0;DP=712 +1 3512089 rs61705210;-/TCACAC,venter,watson AACTCACA AA 100 PASS AF=0.658764;HP=3;DB;NF=65;NR=52;NS=52;CA=0;DP=808 +1 3516936 rs60239345;-/CA,venter CG CCAG 100 PASS AF=0.999997;HP=1;DB;NF=52;NR=26;NS=52;CA=0;DP=391 +1 3519155 rs35740208;-/G,venter AGG AG 100 PASS AF=0.108418;HP=3;DB;NF=7;NR=11;NS=51;CA=0;DP=505 +1 3523781 rs56339243;-/GGCTCC,venter,watson AC ACCGGCTC 100 PASS AF=0.603986;HP=3;DB;NF=20;NR=23;NS=52;CA=0;DP=449 +1 3526023 . GGCACTTCCCGCCCCCGTCACCCCTGCCGCCATG GG 100 PASS AF=0.227609;HP=2;NF=10;NR=15;NS=52;CA=0;DP=454 +1 3526486 rs35020651;-/C,venter TC TCC 100 PASS AF=0.389171;HP=3;DB;NF=32;NR=20;NS=52;CA=0;DP=470 +1 3530060 . TGG TG 100 PASS AF=0.033793;HP=3;NF=6;NR=1;NS=52;CA=0;DP=540 +1 3531966 rs3838971;-/C TG TGG 100 PASS AF=0.155382;HP=6;DB;NF=14;NR=11;NS=49;CA=0;DP=292 +1 3534095 rs35816205;-/A,mills,venter TAA TA 100 PASS AF=0.160054;HP=3;DB;NF=9;NR=10;NS=52;CA=0;DP=455 +1 3535035 rs58849058;-/TCTGGGAGCTCCTCCCCCT,venter,watson GTTCTGGGAGCTCCTCCCCCT GT 100 PASS AF=0.609724;HP=2;DB;NF=50;NR=48;NS=52;CA=0;DP=487 +1 3535985 . CCAAAC CC 100 PASS AF=0.116123;HP=2;NF=10;NR=13;NS=51;CA=0;DP=553 +1 3536124 rs55905548;-/GGCG,venter,watson CCGGGC CC 100 PASS AF=0.45742;HP=3;DB;NF=28;NR=31;NS=51;CA=0;DP=499 +1 3543853 . TC TCC 100 PASS AF=0.156605;HP=6;NF=12;NR=13;NS=52;CA=0;DP=527 +1 3549495 . AC ACCCCC 34 PASS AF=0.0959154;HP=1;NF=1;NR=3;NS=52;CA=0;DP=496 +1 3553372 rs34514629;-/C,venter GCA GA 100 PASS AF=0.652107;HP=1;DB;NF=45;NR=47;NS=52;CA=0;DP=551 +1 3556485 rs3831025;-/CAGCCTGC,venter,watson AGCAGGCTGC AC 100 PASS AF=0.38103;HP=1;DB;NF=13;NR=9;NS=49;CA=0;DP=292 +1 3556883 . CA CATA 14 PASS AF=0.0221011;HP=1;NF=9;NR=13;NS=50;CA=0;DP=436 +1 3563429 . CG CGGGGG 56 PASS AF=0.17049;HP=2;NF=3;NR=7;NS=52;CA=0;DP=586 +1 3564334 rs3034639;-/GT,mills GA GACA 100 PASS AF=0.227635;HP=1;DB;NF=10;NR=13;NS=50;CA=0;DP=364 +1 3564964 rs5772113;-/G TGG TG 100 PASS AF=0.220888;HP=2;DB;NF=11;NR=18;NS=50;CA=0;DP=408 +1 3565238 venter GGTCTCCTACAGTCATATTTTGGGGTGACGTATTCTAG GG 100 PASS AF=0.145422;HP=2;NF=1;NR=10;NS=52;CA=M;DP=323 +1 3566253 rs57149403;-/GTCCAGC AC ACGTCCAGC 100 PASS AF=0.0476733;HP=1;DB;NF=3;NR=3;NS=52;CA=0;DP=363 +1 3567114 . ATG AG 100 PASS AF=0.0358982;HP=1;NF=3;NR=5;NS=52;CA=0;DP=555 +1 3568146 rs3034606;-/TA GTAT GT 100 PASS AF=0.533957;HP=1;DB;NF=12;NR=29;NS=51;CA=0;DP=247 +1 3570893 rs34305694;-/C TCC TC 100 PASS AF=0.0467251;HP=2;DB;NF=5;NR=3;NS=52;CA=0;DP=443 +1 3574939 . CG CGTGTGTG 23 PASS AF=0.401022;HP=1;NF=46;NR=32;NS=52;CA=0;DP=481 +1 3586002 . ACTC AC 100 PASS AF=0.157197;HP=1;NF=17;NR=24;NS=52;CA=0;DP=691 +1 3586231 rs61542341;-/GTCTCT CTCTCTGT CT 12 PASS AF=0.0310208;HP=1;DB;NF=1;NR=11;NS=52;CA=M;DP=400 +1 3586281 . CTTT CT 21 PASS AF=0.115475;HP=3;NF=1;NR=3;NS=51;CA=M;DP=469 +1 3589610 rs57492244;-/G TGG TG 100 PASS AF=0.0691843;HP=7;DB;NF=11;NR=8;NS=51;CA=0;DP=527 +1 3593995 rs57765962;-/AT,watson AATG AG 100 PASS AF=0.127015;HP=2;DB;NF=10;NR=8;NS=52;CA=0;DP=423 +1 3603570 . GCGGGGCCCACCTCGCACCCGCGGCCCACGTCGCACCC GC 100 PASS AF=0.0758905;HP=1;NF=8;NR=12;NS=51;CA=0;DP=414 +1 3606881 rs5772119;-/A,venter TAG TG 100 PASS AF=0.333638;HP=1;DB;NF=12;NR=36;NS=51;CA=0;DP=522 +1 3618309 rs3841787;-/TG,watson CATG CG 100 PASS AF=0.219932;HP=1;DB;NF=14;NR=14;NS=50;CA=0;DP=449 +1 3619353 venter GCCCCTGCC GC 100 PASS AF=0.290838;HP=4;NF=18;NR=8;NS=51;CA=0;DP=322 +1 3629994 rs35939665;-/CTGC,mills,venter,watson TCTGCC TC 100 PASS AF=0.953969;HP=1;DB;NF=43;NR=31;NS=51;CA=0;DP=364 +1 3630547 rs35380007;-/A,venter TA TAA 100 PASS AF=0.373122;HP=2;DB;NF=20;NR=12;NS=51;CA=0;DP=293 +1 3632819 rs61728692;-/CGGA GT GCGGAT 100 PASS AF=0.63605;HP=1;DB;NF=18;NR=3;NS=48;CA=0;DP=238 +1 3632891 . GGATTG GG 46 PASS AF=0.024415;HP=2;NF=4;NR=2;NS=49;CA=0;DP=381 +1 3633325 . CG CGATGGATGGGTGG 100 PASS AF=0.870192;HP=1;NF=3;NR=4;NS=52;CA=0;DP=751 +1 3635416 rs3034587;-/CTCTCT,mills,venter AA AAGAGAGA 100 PASS AF=0.707697;HP=3;DB;NF=37;NR=27;NS=52;CA=0;DP=538 +1 3643833 . AC ACCC 25 PASS AF=0.0664372;HP=1;NF=3;NR=3;NS=51;CA=0;DP=511 +1 3648954 rs3216059;-/G AG AGG 100 PASS AF=0.42719;HP=4;DB;NF=35;NR=35;NS=51;CA=0;DP=551 +1 3660684 . GA GCA 100 PASS AF=0.136632;HP=1;NF=2;NR=10;NS=49;CA=0;DP=480 +1 3663009 rs35440871;-/AA CAAG CG 100 PASS AF=0.2595;HP=2;DB;NF=19;NR=14;NS=51;CA=0;DP=498 +1 3665663 rs60798590;-/TATTTAAAAAT,watson CA CAATTATTTAAAA 33 PASS AF=0.0338921;HP=2;DB;NF=8;NR=3;NS=51;CA=0;DP=388 +1 3665995 . TTTGAAACT TT 33 PASS AF=0.00986571;HP=4;NF=1;NR=3;NS=52;CA=0;DP=507 +1 3668078 . AGG AG 100 PASS AF=0.341281;HP=8;NF=21;NR=29;NS=52;CA=0;DP=467 +1 3677245 rs36002367;-/AG AAGA AA 100 PASS AF=0.137474;HP=3;DB;NF=6;NR=10;NS=52;CA=0;DP=521 +1 3680208 . TG TGG 10 PASS AF=0.0239017;HP=1;NF=7;NR=5;NS=51;CA=0;DP=448 +1 3681294 venter CC CGCAC 100 PASS AF=0.200075;HP=8;NF=7;NR=2;NS=50;CA=0;DP=245 +1 3682989 rs35616712;-/C TCC TC 100 PASS AF=0.0813904;HP=3;DB;NF=9;NR=3;NS=51;CA=0;DP=447 +1 3684305 venter CG CGG 100 PASS AF=0.0596707;HP=3;NF=4;NR=6;NS=51;CA=0;DP=416 +1 3686623 rs35661250;-/AG CA CAGA 100 PASS AF=0.0609898;HP=1;DB;NF=5;NR=6;NS=52;CA=0;DP=626 +1 3691009 rs35756038;-/A,venter CAA CA 100 PASS AF=0.444393;HP=2;DB;NF=24;NR=32;NS=52;CA=0;DP=562 +1 3696676 . CCTG CG 100 PASS AF=0.102585;HP=4;NF=7;NR=6;NS=52;CA=0;DP=502 +1 3697316 rs34679063;-/C,venter GC GCC 100 PASS AF=0.8246;HP=1;DB;NF=51;NR=32;NS=52;CA=0;DP=438 +1 3704105 . TT TTAATTTTTATATTAACCGTGTTAATAT 100 PASS AF=0.377269;HP=2;NF=17;NR=26;NS=52;CA=0;DP=476 +1 3708451 watson TG TGGAGG 43 PASS AF=0.0406373;HP=2;NF=3;NR=4;NS=52;CA=0;DP=587 +1 3710853 rs35447451;-/G,venter AG AGG 100 PASS AF=0.272856;HP=4;DB;NF=25;NR=31;NS=52;CA=0;DP=507 +1 3711553 rs36007194;-/T AT ATT 100 PASS AF=0.093968;HP=10;DB;NF=11;NR=13;NS=52;CA=0;DP=515 +1 3712668 rs35364504;-/GA,venter GGAG GG 100 PASS AF=0.369523;HP=5;DB;NF=18;NR=34;NS=51;CA=0;DP=320 +1 3713867 venter TTTTATTTAT TT 100 PASS AF=0.301438;HP=5;NF=21;NR=36;NS=49;CA=0;DP=294 +1 3714365 rs58666367;-/CTCAT,venter,watson GA GATCTCA 100 PASS AF=0.431722;HP=1;DB;NF=24;NR=17;NS=52;CA=0;DP=484 +1 3721514 rs3838969;-/A,venter CG CTG 100 PASS AF=0.472733;HP=2;DB;NF=27;NR=26;NS=52;CA=0;DP=461 +1 3726918 rs34085838;-/G CG CGG 100 PASS AF=0.242958;HP=1;DB;NF=17;NR=14;NS=52;CA=0;DP=479 +1 3728638 rs61301856;-/GA,venter,watson TGAG TG 100 PASS AF=0.446341;HP=1;DB;NF=54;NR=33;NS=52;CA=0;DP=666 +1 3729131 rs56900717;-/A TT TAT 100 PASS AF=0.489357;HP=2;DB;NF=33;NR=22;NS=52;CA=0;DP=466 +1 3733293 rs5772126;-/G,venter TG TGG 100 PASS AF=0.701257;HP=2;DB;NF=17;NR=26;NS=51;CA=0;DP=451 +1 3733413 . CA CAA 100 PASS AF=0.107016;HP=5;NF=12;NR=16;NS=52;CA=0;DP=523 +1 3735276 venter TA TAAA 100 PASS AF=0.491527;HP=1;NF=29;NR=33;NS=52;CA=0;DP=477 +1 3737219 rs61056063;-/A AGA AA 11 PASS AF=0.205567;HP=1;DB;NF=13;NR=6;NS=51;CA=0;DP=431 +1 3740075 rs35801288;-/C ACA AA 100 PASS AF=0.438207;HP=1;DB;NF=35;NR=12;NS=52;CA=0;DP=395 +1 3741588 rs34966926;-/T,venter GT GTT 100 PASS AF=0.212825;HP=10;DB;NF=21;NR=22;NS=51;CA=0;DP=541 +1 3748510 mills TTTTTTAT TT 53 PASS AF=0.0323102;HP=7;NF=21;NR=15;NS=51;CA=0;DP=420 +1 3759325 . CG CGGCCAAGGAG 100 PASS AF=0.391954;HP=2;NF=19;NR=18;NS=52;CA=0;DP=465 +1 3759824 . CG CGGG 22 PASS AF=0.0355289;HP=5;NF=4;NR=8;NS=52;CA=0;DP=591 +1 3760224 rs61309375;-/A,venter CAG CG 100 PASS AF=0.303624;HP=1;DB;NF=27;NR=13;NS=51;CA=0;DP=447 +1 3773150 . CTT CT 12 NoQCALL AF=0.0786801;HP=2;NF=1;NR=9;NS=52;CA=0;DP=540 +1 3774838 . GT GTT 11 PASS AF=0.0109686;HP=1;NF=2;NR=1;NS=52;CA=0;DP=492 +1 3774974 venter CG CTG 100 PASS AF=0.552417;HP=1;NF=26;NR=38;NS=52;CA=0;DP=559 +1 3776839 . TGG TG 100 PASS AF=0.0926011;HP=3;NF=5;NR=5;NS=52;CA=0;DP=441 +1 3780438 venter CT CTTT 100 PASS AF=0.113197;HP=2;NF=10;NR=13;NS=52;CA=0;DP=654 +1 3780687 rs34664006;-/G TGT TT 50 PASS AF=0.0614825;HP=1;DB;NF=4;NR=8;NS=50;CA=M;DP=299 +1 3784253 venter ACTGTGCCGGCTTTCTATTC AC 100 PASS AF=0.0567473;HP=1;NF=81;NR=75;NS=52;CA=0;DP=627 +1 3786092 . TACTCA TA 100 PASS AF=0.0330531;HP=1;NF=1;NR=6;NS=52;CA=0;DP=497 +1 3788460 rs35600694;-/ATA,watson CA CAATA 100 PASS AF=0.42686;HP=1;DB;NF=20;NR=17;NS=51;CA=0;DP=533 +1 3788666 rs34172576;-/T,venter GT GTT 100 PASS AF=0.481873;HP=1;DB;NF=26;NR=12;NS=52;CA=0;DP=409 +1 3804956 rs60302317;-/CAACA AACAACA AA 46 PASS AF=0.0866272;HP=2;DB;NF=6;NR=2;NS=52;CA=M;DP=556 +1 3805210 rs58663935;-/AAAG CA CAAAGA 100 PASS AF=0.0920558;HP=3;DB;NF=9;NR=2;NS=52;CA=0;DP=523 +1 3805480 . GAA GA 55 PASS AF=0.0675729;HP=8;NF=13;NR=11;NS=52;CA=0;DP=539 +1 3805914 . CCAGACACTGGCACCCCCCTTC CC 100 PASS AF=0.0288464;HP=2;NF=5;NR=4;NS=52;CA=0;DP=613 +1 3806447 rs35704040;-/C,mills GCC GC 100 PASS AF=0.0700176;HP=6;DB;NF=4;NR=8;NS=52;CA=0;DP=350 +1 3807398 rs35759189;-/G,venter AGG AG 100 PASS AF=0.324114;HP=3;DB;NF=21;NR=8;NS=50;CA=0;DP=355 +1 3808303 venter GT GTTCTTTTCTTT 100 PASS AF=0.475205;HP=2;NF=19;NR=9;NS=52;CA=0;DP=264 +1 3809301 . TACA TA 100 PASS AF=0.028676;HP=1;NF=26;NR=22;NS=52;CA=0;DP=553 +1 3813066 rs34938659;-/T ATT AT 100 PASS AF=0.131264;HP=2;DB;NF=8;NR=6;NS=52;CA=0;DP=521 +1 3814885 . TCACACACACACACACAC TC 34 PASS AF=0.149965;HP=1;NF=6;NR=2;NS=52;CA=M;DP=644 +1 3818483 . AC ACC 29 PASS AF=0.0676027;HP=3;NF=1;NR=7;NS=50;CA=0;DP=412 +1 3820456 . TGG TG 12 PASS AF=0.0215117;HP=4;NF=5;NR=1;NS=51;CA=0;DP=417 +1 3824944 . GCTC GC 100 PASS AF=0.174164;HP=1;NF=9;NR=17;NS=50;CA=0;DP=277 +1 3825911 . CG CGGGGGG 100 PASS AF=0.29134;HP=2;NF=24;NR=12;NS=52;CA=0;DP=514 +1 3827024 . TTCCCT TT 16 PASS AF=0.0318298;HP=2;NF=34;NR=70;NS=51;CA=M;DP=394 +1 3827604 . TG TGG 40 PASS AF=0.0159039;HP=1;NF=2;NR=5;NS=52;CA=0;DP=571 +1 3833062 watson TC TCCACC 100 PASS AF=0.312659;HP=2;NF=17;NR=16;NS=52;CA=0;DP=463 +1 3833266 venter,watson AT ATCAGT 100 PASS AF=0.497122;HP=1;NF=10;NR=19;NS=51;CA=0;DP=412 +1 3833395 . CTATCTT CT 24 PASS AF=0.0218407;HP=1;NF=7;NR=3;NS=50;CA=0;DP=400 +1 3833485 . GTCTAT GT 100 PASS AF=0.417779;HP=1;NF=11;NR=12;NS=50;CA=0;DP=323 +1 3833578 watson TTATCT TT 100 PASS AF=0.329625;HP=2;NF=27;NR=26;NS=51;CA=0;DP=388 +1 3833880 watson CA CATCTA 100 PASS AF=0.347946;HP=1;NF=11;NR=13;NS=52;CA=0;DP=458 +1 3906706 . TGG TG 100 PASS AF=0.149111;HP=3;NF=11;NR=9;NS=52;CA=0;DP=498 +1 3907565 rs34088401;-/C,mills TCC TC 100 PASS AF=0.191109;HP=6;DB;NF=11;NR=14;NS=51;CA=0;DP=478 +1 3909253 . AC ACC 100 PASS AF=0.0974891;HP=2;NF=10;NR=9;NS=52;CA=0;DP=591 +1 3909917 rs35302885;-/T,venter CTT CT 100 PASS AF=0.766256;HP=7;DB;NF=45;NR=61;NS=52;CA=0;DP=605 +1 3916501 rs55698528;-/A,venter GA GAA 100 PASS AF=0.624637;HP=1;DB;NF=37;NR=28;NS=52;CA=0;DP=488 +1 3920626 rs59758170;-/TAAATAAATA AATAAATAAATA AA 100 PASS AF=0.276985;HP=3;DB;NF=6;NR=6;NS=50;CA=M;DP=308 +1 3923069 . TCG TG 100 PASS AF=0.224119;HP=1;NF=23;NR=7;NS=52;CA=0;DP=488 +1 3925431 rs34400281;-/T,venter CTT CT 100 PASS AF=0.372459;HP=2;DB;NF=14;NR=10;NS=51;CA=0;DP=500 +1 3933527 . ATTCCCCACAGTGTCTATGGGGACTCTAGCACGGTCAGGGACCCT AT 100 PASS AF=0.0367516;HP=2;NF=29;NR=33;NS=51;CA=0;DP=622 +1 3934862 venter GCAC GC 100 PASS AF=0.565308;HP=1;NF=47;NR=42;NS=51;CA=0;DP=648 +1 3935044 . TCAC TC 40 PASS AF=0.0156518;HP=1;NF=25;NR=8;NS=52;CA=0;DP=717 +1 3937578 rs56700097;-/A,venter TG TAG 100 PASS AF=0.540707;HP=1;DB;NF=40;NR=17;NS=52;CA=0;DP=392 +1 3938627 rs58820377;-/ATAG TTAGAT TT 100 PASS AF=0.0846429;HP=2;DB;NF=10;NR=11;NS=52;CA=0;DP=489 +1 3945777 . CAGA CA 100 PASS AF=0.442957;HP=1;NF=49;NR=35;NS=52;CA=M;DP=511 +1 3967107 venter GAGAA GA 100 PASS AF=0.226936;HP=1;NF=10;NR=15;NS=52;CA=0;DP=543 +1 3971955 rs56102422;-/T AT ATT 100 PASS AF=0.275646;HP=10;DB;NF=12;NR=15;NS=52;CA=0;DP=477 +1 3973109 rs56883229;-/T,venter ATT AT 100 PASS AF=0.374332;HP=8;DB;NF=7;NR=38;NS=52;CA=0;DP=398 +1 3974590 . ATT AT 100 PASS AF=0.373956;HP=8;NF=19;NR=19;NS=51;CA=0;DP=352 +1 3976220 . TTCCAGCTGTTGGACTGGCAAACAGT TT 100 PASS AF=0.155908;HP=3;NF=51;NR=67;NS=52;CA=0;DP=702 +1 3983232 . GC GCC 100 PASS AF=0.153929;HP=3;NF=2;NR=12;NS=51;CA=0;DP=479 +1 3989673 rs34117538;-/T CTT CT 100 PASS AF=0.138005;HP=7;DB;NF=10;NR=16;NS=52;CA=0;DP=480 +1 3991472 . GT GTT 41 PASS AF=0.0921994;HP=10;NF=23;NR=19;NS=52;CA=0;DP=490 +1 3995340 . GAATA GA 100 PASS AF=0.126804;HP=2;NF=18;NR=25;NS=51;CA=0;DP=456 +1 3995701 rs35842317;-/A GA GAA 100 PASS AF=0.287765;HP=3;DB;NF=16;NR=28;NS=52;CA=0;DP=515 +1 3998289 rs34690250;-/C AT ATT 31 PASS AF=0.0505667;HP=1;DB;NF=5;NR=6;NS=50;CA=0;DP=373 +1 3998556 rs35439065;-/C,venter AC ACC 100 PASS AF=0.152989;HP=1;DB;NF=17;NR=4;NS=52;CA=0;DP=565 +1 4003805 . CCCTTC CC 100 PASS AF=0.497734;HP=3;NF=13;NR=9;NS=52;CA=M;DP=357 +1 4004467 . TA TAA 100 PASS AF=0.178845;HP=10;NF=39;NR=12;NS=52;CA=0;DP=482 +1 4005161 . AAGA AA 10 PASS AF=0.109604;HP=8;NF=5;NR=3;NS=52;CA=0;DP=418 +1 4009724 . GGAGAGGGAGAAG GG 100 PASS AF=0.0443217;HP=4;NF=7;NR=9;NS=51;CA=0;DP=347 +1 4010638 rs59300943;-/T CT CTT 100 PASS AF=0.238748;HP=5;DB;NF=17;NR=13;NS=52;CA=0;DP=424 +1 4018608 . GGGAG GG 14 PASS AF=0.0210215;HP=3;NF=11;NR=22;NS=52;CA=0;DP=439 +1 4020045 rs60135555;-/AAA,venter TA TAAAA 55 PASS AF=0.669408;HP=9;DB;NF=19;NR=3;NS=52;CA=0;DP=315 +1 4021381 . CTGGGAAC CC 26 PASS AF=0.0682584;HP=1;NF=1;NR=7;NS=52;CA=0;DP=500 +1 4022270 . TG TCG 59 PASS AF=0.0269606;HP=6;NF=2;NR=3;NS=52;CA=0;DP=522 +1 4022431 rs58149124;-/CC,watson TC TCCC 100 PASS AF=0.833755;HP=1;DB;NF=29;NR=41;NS=52;CA=0;DP=574 +1 4024133 rs56013829;-/GTCA,venter ACAGTC AC 100 PASS AF=0.444062;HP=1;DB;NF=29;NR=25;NS=52;CA=0;DP=599 +1 4024168 rs56372495;-/AC,venter TCAC TC 100 PASS AF=0.370935;HP=1;DB;NF=14;NR=39;NS=52;CA=0;DP=645 +1 4024408 rs55816119;-/TT,watson TC TCAC 100 PASS AF=0.479654;HP=1;DB;NF=17;NR=29;NS=52;CA=0;DP=726 +1 4024524 . ACTC AC 100 PASS AF=0.220192;HP=1;NF=11;NR=5;NS=52;CA=0;DP=721 +1 4024673 . TT TTCACT 100 PASS AF=0.173855;HP=2;NF=11;NR=13;NS=52;CA=0;DP=887 +1 4024704 . TCAG TG 100 PASS AF=0.0291681;HP=1;NF=6;NR=1;NS=52;CA=0;DP=750 +1 4024735 venter TC TCAC 100 PASS AF=0.247468;HP=1;NF=19;NR=5;NS=52;CA=0;DP=775 +1 4024928 . CTCAGT CT 100 PASS AF=0.0974879;HP=1;NF=11;NR=7;NS=52;CA=0;DP=919 +1 4025065 . TCAC TC 100 PASS AF=0.273013;HP=1;NF=7;NR=12;NS=52;CA=0;DP=714 +1 4025127 . ACTC AC 100 PASS AF=0.380734;HP=1;NF=17;NR=20;NS=52;CA=M;DP=574 +1 4025165 . TC TCACTCAC 100 PASS AF=0.0820414;HP=1;NF=1;NR=9;NS=52;CA=M;DP=574 +1 4025232 watson TC TCAC 100 PASS AF=0.631924;HP=1;NF=15;NR=11;NS=52;CA=M;DP=459 +1 4025339 . TTCACT TT 53 PASS AF=0.159738;HP=2;NF=17;NR=14;NS=51;CA=0;DP=609 +1 4025399 . CA CATA 100 PASS AF=0.0862676;HP=1;NF=4;NR=7;NS=52;CA=0;DP=506 +1 4025472 . CA CATTTA 39 PASS AF=0.0270865;HP=1;NF=2;NR=1;NS=52;CA=0;DP=538 +1 4025543 venter,watson TC TCAC 100 PASS AF=0.26036;HP=1;NF=9;NR=12;NS=52;CA=0;DP=482 +1 4025589 . AC ACTC 53 PASS AF=0.0696821;HP=1;NF=1;NR=1;NS=52;CA=0;DP=575 +1 4025678 watson TACTCA TA 100 PASS AF=0.299176;HP=1;NF=14;NR=7;NS=52;CA=0;DP=549 +1 4025718 . CATT CT 100 PASS AF=0.0815807;HP=1;NF=8;NR=6;NS=52;CA=0;DP=570 +1 4025810 watson TC TCAC 100 PASS AF=0.240222;HP=1;NF=8;NR=8;NS=52;CA=0;DP=442 +1 4025920 . ACTCACACTC AC 15 PASS AF=0.0440807;HP=1;NF=5;NR=6;NS=52;CA=0;DP=439 +1 4025988 . ATCACT AT 100 PASS AF=0.115745;HP=1;NF=7;NR=3;NS=52;CA=M;DP=409 +1 4026021 . ATTCGC AC 19 PASS AF=0.0230633;HP=2;NF=4;NR=4;NS=52;CA=0;DP=408 +1 4026091 . ACAGTC AC 100 PASS AF=0.239672;HP=1;NF=10;NR=12;NS=52;CA=0;DP=418 +1 4026188 . GTCACTCGTT GT 100 PASS AF=0.0942528;HP=1;NF=17;NR=15;NS=51;CA=M;DP=704 +1 4026243 . AC ACTCACTC 100 PASS AF=0.0701669;HP=1;NF=8;NR=2;NS=52;CA=0;DP=852 +1 4026341 . AC ACTC 100 PASS AF=0.180464;HP=1;NF=7;NR=12;NS=52;CA=0;DP=797 +1 4026433 . AC ACTCACAGTC 100 PASS AF=0.0755971;HP=1;NF=10;NR=4;NS=52;CA=0;DP=727 +1 4026489 . CCACTC CC 100 PASS AF=0.152175;HP=2;NF=20;NR=14;NS=52;CA=0;DP=896 +1 4026521 . AT ACT 18 PASS AF=0.0348752;HP=1;NF=8;NR=8;NS=52;CA=0;DP=896 +1 4026676 . ACACTC AC 100 PASS AF=0.345964;HP=1;NF=25;NR=27;NS=52;CA=0;DP=805 +1 4026745 . ACTC AC 100 PASS AF=0.277096;HP=1;NF=6;NR=11;NS=52;CA=0;DP=625 +1 4026831 . AC ACTC 100 PASS AF=0.158736;HP=1;NF=13;NR=9;NS=52;CA=0;DP=585 +1 4026904 . TACTCA TA 59 PASS AF=0.094457;HP=1;NF=7;NR=4;NS=52;CA=0;DP=594 +1 4026996 . TT TTCACT 100 PASS AF=0.0816069;HP=2;NF=19;NR=16;NS=52;CA=0;DP=668 +1 4027100 watson GT GTCACT 100 PASS AF=0.51624;HP=1;NF=22;NR=20;NS=52;CA=0;DP=958 +1 4027153 . AC ACTCACACTC 100 PASS AF=0.221157;HP=1;NF=11;NR=7;NS=52;CA=0;DP=694 +1 4027249 . ACACTCGCTCAGTC AC 100 PASS AF=0.191741;HP=1;NF=20;NR=16;NS=52;CA=0;DP=528 +1 4027301 . TCAC TC 100 PASS AF=0.21653;HP=1;NF=6;NR=9;NS=52;CA=0;DP=511 +1 4027378 . TT TTCACT 100 PASS AF=0.23813;HP=2;NF=19;NR=16;NS=52;CA=0;DP=565 +1 4027440 . TT TTCACT 100 PASS AF=0.351897;HP=2;NF=28;NR=13;NS=52;CA=0;DP=736 +1 4031776 venter,watson GC GCTGCTCC 100 PASS AF=0.57914;HP=1;NF=17;NR=13;NS=52;CA=0;DP=475 +1 4046995 rs60127181;-/ATG,watson GC GGATC 100 PASS AF=0.863384;HP=1;DB;NF=37;NR=32;NS=51;CA=0;DP=427 +1 4053051 . AC AACC 10 PASS AF=0.0731381;HP=1;NF=2;NR=3;NS=52;CA=0;DP=453 +1 4056743 rs57501900;-/T,venter ATT AT 100 PASS AF=0.863012;HP=6;DB;NF=63;NR=45;NS=52;CA=0;DP=485 +1 4078234 venter,watson CTGCCTGTGTGAGCAAGAT CT 100 PASS AF=0.308447;HP=1;NF=26;NR=18;NS=52;CA=0;DP=484 +1 4080449 rs35774756;-/T GTT GT 100 PASS AF=0.285891;HP=2;DB;NF=20;NR=24;NS=51;CA=0;DP=526 +1 4082493 rs35701497;-/G CGG CG 100 PASS AF=0.277913;HP=4;DB;NF=14;NR=16;NS=52;CA=0;DP=416 +1 4086137 . CA CTA 100 PASS AF=0.0260425;HP=1;NF=4;NR=2;NS=52;CA=0;DP=569 +1 4088196 . TTCT TT 100 PASS AF=0.0658972;HP=3;NF=67;NR=77;NS=51;CA=B;DP=647 +1 4091673 rs56198003;-/TTA GTTAT GT 100 PASS AF=0.0274099;HP=2;DB;NF=4;NR=7;NS=52;CA=0;DP=489 +1 4093407 rs35442233;-/G,venter TGG TG 100 PASS AF=0.056726;HP=4;DB;NF=4;NR=5;NS=51;CA=0;DP=432 +1 4097902 rs5772141;-/ATT,mills,venter,watson CA CATTA 100 PASS AF=0.999995;HP=1;DB;NF=38;NR=34;NS=52;CA=0;DP=432 +1 4106716 . AC ACACACACACACGC 100 PASS AF=0.316911;HP=1;NF=1;NR=1;NS=52;CA=0;DP=601 +1 4114274 rs60603556;-/CAT,watson AATCA AA 100 PASS AF=0.135224;HP=3;DB;NF=17;NR=9;NS=51;CA=0;DP=587 +1 4114592 rs56285575;-/ACA,venter AAACA AA 100 PASS AF=0.254759;HP=3;DB;NF=21;NR=18;NS=52;CA=0;DP=554 +1 4114812 . TTAT TT 33 PASS AF=0.14738;HP=3;NF=5;NR=4;NS=52;CA=0;DP=411 +1 4114996 . AA AATTATTA 11 PASS AF=0.228122;HP=2;NF=26;NR=29;NS=49;CA=0;DP=276 +1 4120825 . GAA GA 43 PASS AF=0.147904;HP=2;NF=11;NR=17;NS=51;CA=0;DP=328 +1 4121802 . ATGT AT 11 PASS AF=0.0113836;HP=1;NF=24;NR=16;NS=52;CA=0;DP=570 +1 4131826 . ATTGTTT AT 100 PASS AF=0.999996;HP=2;NF=38;NR=35;NS=52;CA=0;DP=456 +1 4134659 rs35271731;-/G TG TGG 100 PASS AF=0.417516;HP=5;DB;NF=21;NR=19;NS=52;CA=0;DP=429 +1 4139315 rs35859581;-/T,venter GT GTT 100 PASS AF=0.371694;HP=2;DB;NF=12;NR=16;NS=52;CA=0;DP=444 +1 4144542 . CAA CA 100 PASS AF=0.0915309;HP=2;NF=7;NR=8;NS=52;CA=M;DP=461 +1 4149378 rs35644791;-/CCT,venter,watson AC ACCTC 100 PASS AF=0.955034;HP=2;DB;NF=35;NR=24;NS=52;CA=0;DP=461 +1 4150078 . ATC AC 100 PASS AF=0.0248618;HP=1;NF=3;NR=1;NS=52;CA=0;DP=489 +1 4158176 rs61115653;-/A CA CAA 100 PASS AF=0.109858;HP=9;DB;NF=9;NR=8;NS=52;CA=0;DP=480 +1 4158371 rs35550030;-/G AGA AA 100 PASS AF=0.282272;HP=1;DB;NF=22;NR=13;NS=52;CA=0;DP=508 +1 4160853 . AG AGTG 100 PASS AF=0.883963;HP=1;NF=52;NR=40;NS=52;CA=0;DP=475 +1 4163479 rs35439066;-/T,venter ATT AT 100 PASS AF=0.421487;HP=7;DB;NF=35;NR=40;NS=52;CA=0;DP=580 +1 4165518 rs5772143;-/A,mills CAT CT 100 PASS AF=0.0997002;HP=1;DB;NF=8;NR=9;NS=52;CA=0;DP=569 +1 4168412 . TG TGG 100 PASS AF=0.0597927;HP=5;NF=7;NR=5;NS=50;CA=0;DP=411 +1 4174019 . CCTTTC CC 100 PASS AF=0.223832;HP=2;NF=5;NR=11;NS=51;CA=M;DP=369 +1 4176371 rs5772145;-/GGGCT,mills,venter,watson GG GGGGCTG 100 PASS AF=0.965127;HP=4;DB;NF=37;NR=39;NS=51;CA=0;DP=577 +1 4180359 rs35134459;-/T,venter CG CTG 100 PASS AF=0.994644;HP=2;DB;NF=70;NR=40;NS=52;CA=0;DP=510 +1 4198168 . GCCATTTACATCCCACC GC 100 PASS AF=0.0947023;HP=2;NF=47;NR=53;NS=52;CA=0;DP=625 +1 4203370 . TCAC TC 22 PASS AF=0.151126;HP=1;NF=40;NR=22;NS=51;CA=0;DP=481 +1 4224147 . ATGT AT 100 PASS AF=0.459042;HP=1;NF=45;NR=57;NS=52;CA=0;DP=508 +1 4236168 venter,watson GT GTCCTGTT 100 PASS AF=0.465028;HP=1;NF=21;NR=21;NS=51;CA=0;DP=473 +1 4238553 . TAG TG 100 PASS AF=0.0884036;HP=1;NF=3;NR=3;NS=52;CA=0;DP=313 +1 4243904 . TG TGGGGG 28 PASS AF=0.177328;HP=1;NF=6;NR=9;NS=52;CA=0;DP=598 +1 4252300 . AATTTA AA 27 PASS AF=0.0160294;HP=2;NF=16;NR=12;NS=52;CA=0;DP=550 +1 4256051 . CC CCTCAC 100 PASS AF=0.423907;HP=2;NF=10;NR=6;NS=52;CA=M;DP=450 +1 4256251 rs56817136;-/AATCCATC TC TCATCAATCC 27 PASS AF=0.483921;HP=1;DB;NF=24;NR=28;NS=52;CA=M;DP=501 +1 4256338 rs59859709;-/CCAT CCCATC CC 100 PASS AF=0.420087;HP=3;DB;NF=47;NR=73;NS=52;CA=0;DP=510 +1 4258560 rs35749795;-/G,venter TGG TG 100 PASS AF=0.563751;HP=3;DB;NF=30;NR=43;NS=52;CA=0;DP=533 +1 4270968 rs5772150;-/A,mills,venter TAA TA 100 PASS AF=0.863858;HP=2;DB;NF=66;NR=65;NS=52;CA=0;DP=554 +1 4272781 rs34523387;-/CA,venter,watson TCAC TC 100 PASS AF=0.221206;HP=1;DB;NF=55;NR=32;NS=52;CA=0;DP=555 +1 4276688 rs56762609;-/A CA CAA 25 PASS AF=0.0168189;HP=4;DB;NF=5;NR=7;NS=52;CA=0;DP=567 +1 4278344 rs33957131;-/A,mills TAT TT 100 PASS AF=0.260307;HP=1;DB;NF=13;NR=14;NS=52;CA=M;DP=390 +1 4280264 rs35972891;-/G,venter TG TGG 100 PASS AF=0.36321;HP=6;DB;NF=16;NR=21;NS=52;CA=0;DP=487 +1 4280920 rs3058085;-/AGA,mills,venter,watson AT ATCTT 100 PASS AF=0.75024;HP=1;DB;NF=34;NR=50;NS=52;CA=0;DP=518 +1 4281851 rs59086076;-/TTGT CTGTTT CT 100 PASS AF=0.15371;HP=1;DB;NF=12;NR=13;NS=52;CA=0;DP=454 +1 4287207 rs3986843;-/CCT CA CAGGA 100 PASS AF=0.100002;HP=1;DB;NF=8;NR=1;NS=52;CA=0;DP=451 +1 4289708 . GTGTTAG GG 37 PASS AF=0.0904846;HP=1;NF=3;NR=9;NS=52;CA=0;DP=447 +1 4291813 . CGC CC 41 PASS AF=0.05598;HP=1;NF=1;NR=9;NS=52;CA=0;DP=504 +1 4291856 rs33950418;-/C,mills ACA AA 53 PASS AF=0.0424203;HP=1;DB;NF=2;NR=10;NS=52;CA=M;DP=504 +1 4292024 rs33982329;-/CA,mills CG CATG 100 PASS AF=0.0974178;HP=1;DB;NF=14;NR=14;NS=52;CA=0;DP=697 +1 4296830 . CTT CT 100 PASS AF=0.101792;HP=2;NF=15;NR=4;NS=52;CA=0;DP=805 +1 4298115 rs34054009;-/G,venter AG AGG 100 PASS AF=0.314255;HP=2;DB;NF=25;NR=10;NS=52;CA=0;DP=565 +1 4310246 rs35999105;-/A TA TAA 100 PASS AF=0.229765;HP=5;DB;NF=23;NR=13;NS=52;CA=0;DP=488 +1 4310305 venter GA GAA 39 PASS AF=0.078696;HP=9;NF=15;NR=5;NS=52;CA=0;DP=455 +1 4312461 . GAAAGAAA GA 24 PASS AF=0.0372797;HP=3;NF=23;NR=6;NS=52;CA=M;DP=401 +1 4313453 . GG GTG 23 PASS AF=0.026167;HP=2;NF=2;NR=5;NS=52;CA=0;DP=614 +1 4315016 rs34078493;-/T,venter CT CTT 100 PASS AF=0.459017;HP=1;DB;NF=25;NR=37;NS=52;CA=0;DP=493 +1 4316236 rs35864764;-/TC ATCT AT 100 PASS AF=0.164629;HP=1;DB;NF=18;NR=15;NS=52;CA=0;DP=434 +1 4317119 rs35907112;-/AG AAGA AA 100 PASS AF=0.210583;HP=3;DB;NF=19;NR=13;NS=52;CA=0;DP=652 +1 4319781 rs34098980;-/AAAAA,mills,venter CC CAAAAAC 100 PASS AF=0.451406;HP=2;DB;NF=9;NR=1;NS=52;CA=0;DP=605 +1 4323411 . GT GTT 41 PASS AF=0.0448346;HP=6;NF=4;NR=5;NS=52;CA=0;DP=498 +1 4326343 . CG CGGGGGGGGGGG 100 PASS AF=0.212625;HP=2;NF=5;NR=11;NS=52;CA=0;DP=475 +1 4329138 . GTGAT GT 47 PASS AF=0.0168095;HP=1;NF=35;NR=37;NS=52;CA=0;DP=675 +1 4329500 venter ATGGTGATGGT AT 100 PASS AF=0.0491;HP=1;NF=35;NR=49;NS=52;CA=0;DP=718 +1 4333035 . CCACTC CC 100 PASS AF=0.0536691;HP=2;NF=18;NR=17;NS=52;CA=0;DP=614 +1 4333090 . CCCATC CC 100 PASS AF=0.896174;HP=3;NF=52;NR=56;NS=52;CA=0;DP=564 +1 4333868 rs34013096;-/CCAT AC ACCATC 100 PASS AF=0.411752;HP=2;DB;NF=63;NR=59;NS=52;CA=0;DP=556 +1 4352929 . TAA TA 100 PASS AF=0.0606075;HP=5;NF=10;NR=5;NS=51;CA=0;DP=422 +1 4360308 . CAA CA 100 PASS AF=0.160821;HP=3;NF=12;NR=13;NS=52;CA=0;DP=502 +1 4360675 rs55750624;-/A GAA GA 100 PASS AF=0.209252;HP=2;DB;NF=18;NR=10;NS=52;CA=0;DP=456 +1 4362123 rs57250327;-/AAATT TA TAATTAA 100 PASS AF=0.202867;HP=2;DB;NF=23;NR=24;NS=52;CA=0;DP=404 +1 4372014 rs34773421;-/A,venter TAA TA 100 PASS AF=0.507594;HP=2;DB;NF=43;NR=31;NS=52;CA=0;DP=496 +1 4373092 . CATTTA CA 100 PASS AF=0.155807;HP=1;NF=19;NR=10;NS=52;CA=0;DP=440 +1 4375952 . TCT TT 100 PASS AF=0.0215948;HP=1;NF=3;NR=2;NS=52;CA=0;DP=530 +1 4376164 rs57973702;-/TG,venter CG CGTG 100 PASS AF=0.555727;HP=1;DB;NF=33;NR=60;NS=52;CA=0;DP=552 +1 4382255 . GT GTT 100 PASS AF=0.134524;HP=8;NF=12;NR=14;NS=52;CA=0;DP=445 +1 4382929 . CG CGCCGTGCCCTGCTCAG 100 PASS AF=0.293977;HP=1;NF=3;NR=1;NS=52;CA=0;DP=423 +1 4386769 rs34696074;-/G TGG TG 100 PASS AF=0.524405;HP=3;DB;NF=43;NR=31;NS=51;CA=0;DP=586 +1 4386900 rs35831569;-/GTGA,watson TG TGTGAG 100 PASS AF=0.786341;HP=1;DB;NF=49;NR=47;NS=52;CA=0;DP=728 +1 4387089 rs35106948;-/GA,venter,watson TGAG TG 100 PASS AF=0.76407;HP=1;DB;NF=42;NR=48;NS=52;CA=0;DP=730 +1 4398343 rs56075652;-/AGCTAG,mills,venter,watson GGAGCTAG GG 100 PASS AF=0.850798;HP=2;DB;NF=51;NR=52;NS=52;CA=0;DP=535 +1 4403445 . ATC AC 100 PASS AF=0.0257077;HP=1;NF=3;NR=3;NS=52;CA=0;DP=579 +1 4413424 . GGAAG GG 100 PASS AF=0.0911622;HP=2;NF=13;NR=11;NS=52;CA=0;DP=539 +1 4415363 rs35655214;-/A,mills,venter CAA CA 100 PASS AF=0.279808;HP=10;DB;NF=16;NR=13;NS=52;CA=0;DP=623 +1 4419729 rs34301403;-/T,venter CT CTT 100 PASS AF=0.276688;HP=3;DB;NF=23;NR=17;NS=52;CA=0;DP=491 +1 4429935 . ACC AC 100 PASS AF=0.121066;HP=2;NF=8;NR=7;NS=52;CA=0;DP=509 +1 4432975 rs35185885;-/TTAT,venter TT TTTTAT 100 PASS AF=0.370788;HP=4;DB;NF=7;NR=50;NS=51;CA=0;DP=329 +1 4433724 . AC ACC 100 PASS AF=0.191535;HP=2;NF=16;NR=17;NS=52;CA=0;DP=609 +1 4434361 . GA GATGATATTGAAA 100 PASS AF=0.175787;HP=1;NF=8;NR=5;NS=52;CA=0;DP=496 +1 4439328 rs55695069;-/TGTG,watson TGTGAG TG 100 PASS AF=0.115075;HP=1;DB;NF=13;NR=10;NS=51;CA=0;DP=510 +1 4444447 . GC GCC 100 PASS AF=0.126735;HP=1;NF=8;NR=6;NS=52;CA=0;DP=442 +1 4444562 watson TTCG TG 100 PASS AF=0.167206;HP=3;NF=13;NR=9;NS=52;CA=0;DP=477 +1 4448379 rs55971665;-/A,venter GAA GA 100 PASS AF=0.999997;HP=5;DB;NF=29;NR=34;NS=51;CA=0;DP=398 +1 4456774 rs34368344;-/CTCA,watson TCTCAC TC 100 PASS AF=0.4985;HP=1;DB;NF=46;NR=35;NS=52;CA=0;DP=679 +1 4456823 . TT TTTTCTCTCT 100 PASS AF=0.281015;HP=3;NF=18;NR=7;NS=52;CA=0;DP=566 +1 4460399 . CAGA CA 17 PASS AF=0.0162627;HP=1;NF=4;NR=1;NS=52;CA=0;DP=437 +1 4461064 . TG TGGG 100 PASS AF=0.136493;HP=8;NF=11;NR=12;NS=52;CA=0;DP=516 +1 4461120 . GAGTCA GA 100 PASS AF=0.106497;HP=1;NF=4;NR=10;NS=52;CA=0;DP=513 +1 4462914 rs35786528;-/T,venter GTT GT 100 PASS AF=0.636288;HP=9;DB;NF=46;NR=44;NS=52;CA=0;DP=457 +1 4464201 rs35933446;-/G AGC AC 100 PASS AF=0.0422945;HP=1;DB;NF=3;NR=5;NS=52;CA=0;DP=559 +1 4465553 rs33984734;-/C,mills,venter GCC GC 100 PASS AF=0.832437;HP=3;DB;NF=43;NR=36;NS=52;CA=0;DP=507 +1 4465878 rs55781312;-/GAACA,watson TACAGAA TA 100 PASS AF=0.547352;HP=1;DB;NF=48;NR=55;NS=52;CA=0;DP=612 +1 4466414 rs34356738;-/T,venter AT ATT 100 PASS AF=0.0343632;HP=4;DB;NF=5;NR=2;NS=52;CA=0;DP=523 +1 4468803 . CT CTTTTCTTTTCTTT 100 PASS AF=0.185641;HP=2;NF=2;NR=1;NS=51;CA=0;DP=271 +1 4469024 . TT TTGTGT 26 PASS AF=0.65093;HP=2;NF=51;NR=54;NS=51;CA=0;DP=465 +1 4470162 rs34280110;-/T,venter CT CTT 100 PASS AF=0.19103;HP=3;DB;NF=13;NR=16;NS=52;CA=0;DP=581 +1 4472390 rs35540877;-/AAG TAAGA TA 100 PASS AF=0.0513799;HP=2;DB;NF=4;NR=3;NS=52;CA=0;DP=531 +1 4481812 rs34806922;-/A,venter GAA GA 100 PASS AF=0.0356083;HP=3;DB;NF=4;NR=4;NS=52;CA=0;DP=576 +1 4482705 . CA CATCTA 100 PASS AF=0.203301;HP=1;NF=34;NR=52;NS=50;CA=M;DP=382 +1 4482808 . CTA CA 16 PASS AF=0.0550307;HP=1;NF=1;NR=1;NS=51;CA=M;DP=356 +1 4482848 rs5772166;-/TCTCTCTC,mills ATCTCTCTCT AT 100 PASS AF=0.561639;HP=1;DB;NF=52;NR=17;NS=51;CA=M;DP=311 +1 4484471 rs3059158;-/CT,mills,watson AG ACTG 100 PASS AF=0.497825;HP=1;DB;NF=31;NR=34;NS=52;CA=0;DP=538 +1 4486660 rs34976033;-/CCCT,mills,venter,watson GCTCCC GC 100 PASS AF=0.593551;HP=1;DB;NF=42;NR=55;NS=52;CA=0;DP=566 +1 4486840 rs35808993;-/A,venter GAT GT 100 PASS AF=0.0446408;HP=1;DB;NF=4;NR=4;NS=52;CA=0;DP=539 +1 4495865 watson TGACCT TT 100 PASS AF=0.477912;HP=1;NF=15;NR=22;NS=52;CA=0;DP=386 +1 4498895 . TAAACTCA TA 100 PASS AF=0.365307;HP=3;NF=30;NR=28;NS=52;CA=0;DP=561 +1 4499763 . TT TTTTAGTTTAGTTTAGTTTAGTTTAGT 15 PASS AF=0.437504;HP=4;NF=5;NR=8;NS=51;CA=0;DP=440 +1 4500994 rs57293099;-/A,venter GG GAG 19 PASS AF=0.533167;HP=5;DB;NF=26;NR=15;NS=51;CA=0;DP=466 +1 4501978 rs34937816;-/T,mills,venter GT GTT 100 PASS AF=0.677682;HP=1;DB;NF=47;NR=42;NS=52;CA=0;DP=475 +1 4504724 venter,watson TAGACA TA 100 PASS AF=0.381777;HP=1;NF=34;NR=33;NS=52;CA=0;DP=728 +1 4504861 venter TACAGAGAGAGACAGAGAGA TA 100 PASS AF=0.208225;HP=1;NF=42;NR=31;NS=52;CA=0;DP=820 +1 4506249 rs56013880;-/T,mills,venter GC GTC 100 PASS AF=0.652109;HP=2;DB;NF=41;NR=48;NS=52;CA=0;DP=522 +1 4506287 venter TAG TG 100 PASS AF=0.348604;HP=1;NF=23;NR=27;NS=52;CA=0;DP=534 +1 4510123 rs35963445;-/C,venter TC TCC 100 PASS AF=0.750939;HP=6;DB;NF=32;NR=50;NS=52;CA=0;DP=488 +1 4511427 rs34235356;-/T,venter AT ATT 100 PASS AF=0.559297;HP=8;DB;NF=40;NR=27;NS=52;CA=0;DP=549 +1 4512561 rs57315980;-/GAG TGGAG TG 100 PASS AF=0.0276885;HP=2;DB;NF=7;NR=4;NS=52;CA=0;DP=581 +1 4512788 rs56318426;-/GGATAGTGTG TC TGTGTGGGATAC 100 PASS AF=0.145759;HP=1;DB;NF=7;NR=6;NS=52;CA=0;DP=570 +1 4513234 rs5772168;-/ATCA,venter,watson TA TATCAA 100 PASS AF=0.761132;HP=1;DB;NF=45;NR=38;NS=52;CA=0;DP=478 +1 4513552 rs34248962;-/G,venter CTC CC 100 PASS AF=0.397344;HP=1;DB;NF=19;NR=21;NS=52;CA=0;DP=502 +1 4518079 . CTTTATGTCAAC CC 31 PASS AF=0.0537494;HP=3;NF=13;NR=6;NS=52;CA=0;DP=567 +1 4519870 . CATAA CA 100 PASS AF=0.156873;HP=1;NF=25;NR=19;NS=52;CA=0;DP=518 +1 4520552 venter,watson ATATT AT 100 PASS AF=0.0454741;HP=1;NF=13;NR=21;NS=52;CA=0;DP=523 +1 4524683 rs60936673;-/A,venter GAC GC 100 PASS AF=0.0433734;HP=1;DB;NF=5;NR=1;NS=51;CA=0;DP=407 +1 4531795 . CG CGAGCAGATAG 100 PASS AF=0.0529244;HP=1;NF=2;NR=3;NS=52;CA=0;DP=598 +1 4533811 rs61232512;-/TCCCTCCTGGACAGCCAGG,watson TCCTCCTGGACAGCCAGGTCC TC 100 PASS AF=0.455665;HP=2;DB;NF=9;NR=12;NS=52;CA=0;DP=455 +1 4535415 rs34971058;-/C,mills,venter GC GCC 100 PASS AF=0.872856;HP=1;DB;NF=71;NR=50;NS=52;CA=0;DP=585 +1 4540778 rs5772169;-/T,mills CTG CG 100 PASS AF=0.129616;HP=1;DB;NF=9;NR=6;NS=52;CA=0;DP=518 +1 4541031 . TT TTTTCT 100 PASS AF=0.0665496;HP=6;NF=18;NR=24;NS=51;CA=0;DP=371 +1 4541492 rs5772170;-/G,mills,venter TG TGG 100 PASS AF=0.912727;HP=3;DB;NF=57;NR=39;NS=52;CA=0;DP=454 +1 4542962 . CC CCTCTCTCTCTC 100 PASS AF=0.767807;HP=2;NF=57;NR=35;NS=52;CA=0;DP=481 +1 4544333 rs3059964;-/CT,venter ACTC AC 100 PASS AF=0.941425;HP=1;DB;NF=54;NR=73;NS=52;CA=0;DP=591 +1 4547027 rs34146010;-/C ACC AC 100 PASS AF=0.974502;HP=2;DB;NF=55;NR=74;NS=52;CA=0;DP=535 +1 4547927 rs34056554;-/T,venter ATT AT 100 PASS AF=0.867021;HP=3;DB;NF=7;NR=12;NS=51;CA=0;DP=398 +1 4551259 rs34018288;-/TG,venter,watson CT CTGT 100 PASS AF=0.964821;HP=1;DB;NF=25;NR=27;NS=52;CA=0;DP=445 +1 4552887 . GT GTCT 100 PASS AF=0.155774;HP=1;NF=6;NR=7;NS=52;CA=0;DP=507 +1 4556585 rs3833958;-/GGGCT,venter GA GAGCCCA 100 PASS AF=0.248571;HP=1;DB;NF=9;NR=9;NS=52;CA=0;DP=416 +1 4558195 rs58248788;-/T,venter ATT AT 100 PASS AF=0.949748;HP=4;DB;NF=38;NR=18;NS=51;CA=0;DP=446 +1 4558625 . AGA AA 100 PASS AF=0.105248;HP=1;NF=12;NR=4;NS=52;CA=0;DP=526 +1 4570630 . GT GGGTTT 14 PASS AF=0.0570941;HP=1;NF=4;NR=2;NS=52;CA=0;DP=480 +1 4574298 . GC GAC 41 PASS AF=0.0333335;HP=2;NF=1;NR=4;NS=52;CA=0;DP=497 +1 4574507 . TT TTCCTCTAATGCT 100 PASS AF=0.406213;HP=2;NF=13;NR=8;NS=52;CA=0;DP=437 +1 4577694 rs33988719;-/G,mills,venter TG TGG 100 PASS AF=0.999997;HP=1;DB;NF=52;NR=28;NS=52;CA=0;DP=381 +1 4578235 . TAT TT 26 PASS AF=0.292482;HP=1;NF=8;NR=14;NS=51;CA=0;DP=330 +1 4580634 . ATAAAATA AA 100 PASS AF=0.328083;HP=1;NF=11;NR=4;NS=51;CA=M;DP=372 +1 4581760 . CTT CT 100 PASS AF=0.0551414;HP=2;NF=4;NR=7;NS=52;CA=0;DP=578 +1 4583153 rs35427335;-/CA,venter,watson GCAC GC 100 PASS AF=0.0310016;HP=1;DB;NF=3;NR=4;NS=52;CA=0;DP=483 +1 4586257 rs34899280;-/T GTC GC 100 PASS AF=0.311452;HP=1;DB;NF=16;NR=8;NS=51;CA=0;DP=441 +1 4589959 venter,watson GG GGGCCTG 100 PASS AF=0.0494854;HP=3;NF=3;NR=4;NS=52;CA=0;DP=469 +1 4590830 rs34057361;-/GCAAAGC,mills,venter,watson TGCAAAGCG TG 100 PASS AF=0.739178;HP=1;DB;NF=42;NR=52;NS=50;CA=0;DP=465 +1 4595540 rs56784481;-/T TCT TT 53 PASS AF=0.154234;HP=1;DB;NF=7;NR=21;NS=52;CA=0;DP=439 +1 4596270 . AC ACGCTGAGGCTGCAGCACCCCTCGTGGAGC 100 PASS AF=0.171201;HP=1;NF=6;NR=1;NS=52;CA=0;DP=498 +1 4600396 rs36042545;-/AT,venter CATA CA 100 PASS AF=0.185579;HP=1;DB;NF=24;NR=23;NS=52;CA=0;DP=357 +1 4603645 rs60786353;-/C,venter AC ACC 100 PASS AF=0.999998;HP=1;DB;NF=76;NR=57;NS=52;CA=0;DP=571 +1 4607282 . GTGAT GT 100 PASS AF=0.287968;HP=1;NF=38;NR=26;NS=52;CA=0;DP=810 +1 4607435 . GTGAT GT 100 PASS AF=0.347474;HP=1;NF=39;NR=53;NS=52;CA=0;DP=674 +1 4611309 . CGTGTG CG 100 PASS AF=0.311775;HP=1;NF=38;NR=31;NS=52;CA=0;DP=486 +1 4621966 rs35610947;-/GT TTGT TT 100 PASS AF=0.252136;HP=3;DB;NF=41;NR=42;NS=52;CA=0;DP=612 +1 4623256 rs59174221;-/CTCCAGAAAGCAC GGAAAGCACCTCCAG GG 100 PASS AF=0.248792;HP=2;DB;NF=24;NR=28;NS=52;CA=0;DP=458 +1 4623618 rs60584333;-/GTGTCGGGAGCAGAGACTG,venter GC GCTGGTGTCGGGAGCAGAGAC 100 PASS AF=0.624955;HP=1;DB;NF=8;NR=16;NS=51;CA=0;DP=518 +1 4628242 rs56871532;-/TG,venter,watson CTGT CT 100 PASS AF=0.630417;HP=1;DB;NF=46;NR=41;NS=52;CA=0;DP=605 +1 4631325 watson GAGGACATA GA 100 PASS AF=0.0694082;HP=1;NF=14;NR=10;NS=51;CA=0;DP=388 +1 4633949 . TCC TC 100 PASS AF=0.223776;HP=7;NF=13;NR=4;NS=51;CA=0;DP=492 +1 4637510 . TAAA TA 18 PASS AF=0.0428857;HP=9;NF=13;NR=6;NS=52;CA=0;DP=456 +1 4639728 . GGTGTGTGTGTGTGTG GG 56 PASS AF=0.223403;HP=3;NF=39;NR=66;NS=51;CA=0;DP=466 +1 4645583 rs59275910;-/G,venter AG AGG 100 PASS AF=0.999998;HP=1;DB;NF=41;NR=59;NS=51;CA=0;DP=416 +1 4649824 . CTT CT 100 PASS AF=0.0615007;HP=2;NF=3;NR=3;NS=52;CA=0;DP=371 +1 4653490 . GAG GG 19 PASS AF=0.016501;HP=1;NF=1;NR=2;NS=52;CA=0;DP=448 +1 4654099 rs3086606;-/GTCTGCA,mills CC CCAGTCTGC 100 PASS AF=0.299705;HP=2;DB;NF=11;NR=10;NS=52;CA=0;DP=440 +1 4655877 rs58828516;-/G TG TGG 100 PASS AF=0.083803;HP=6;DB;NF=13;NR=14;NS=52;CA=0;DP=553 +1 4656096 rs34592768;-/G,mills TGG TG 100 PASS AF=0.0586852;HP=2;DB;NF=6;NR=4;NS=52;CA=0;DP=486 +1 4656943 . GGTGTG GG 53 PASS AF=0.0156574;HP=2;NF=15;NR=18;NS=52;CA=0;DP=804 +1 4668803 . CTT CT 39 PASS AF=0.0748695;HP=8;NF=8;NR=6;NS=52;CA=0;DP=401 +1 4670089 rs34058244;-/AC,venter GA GACA 100 PASS AF=0.471432;HP=1;DB;NF=47;NR=39;NS=52;CA=0;DP=789 +1 4670383 rs35737766;-/TCAC,watson ACACTC AC 100 PASS AF=0.331554;HP=1;DB;NF=20;NR=35;NS=52;CA=0;DP=609 +1 4676654 . AGATG AG 10 PASS AF=0.011049;HP=1;NF=15;NR=18;NS=52;CA=0;DP=617 +1 4684590 . TCCTGCACCTGCTGTGCCCCTGGCTCCCAGCACC TC 100 PASS AF=0.0368566;HP=2;NF=13;NR=7;NS=52;CA=0;DP=543 +1 4689505 . TC TCTGTCCTCTCTCCTAGCTCTGGTGCCCTGAGATGC 100 PASS AF=0.355136;HP=1;NF=2;NR=3;NS=52;CA=0;DP=597 +1 4693342 rs3835539;-/TTCA CC CCATTC 100 PASS AF=0.307703;HP=2;DB;NF=60;NR=61;NS=52;CA=0;DP=594 +1 4695582 venter TGTGAGG TG 100 PASS AF=0.630317;HP=1;NF=17;NR=29;NS=52;CA=0;DP=408 +1 4700273 . GCCT GT 51 PASS AF=0.154012;HP=2;NF=3;NR=3;NS=52;CA=0;DP=402 +1 4700727 rs34897087;-/A,venter CG CGG 13 PASS AF=0.0702045;HP=8;DB;NF=22;NR=6;NS=51;CA=M;DP=305 +1 4702014 rs34592315;-/AA,venter TAAA TA 100 PASS AF=0.183045;HP=3;DB;NF=9;NR=20;NS=52;CA=0;DP=551 +1 4702135 . GCC GC 100 PASS AF=0.132917;HP=5;NF=18;NR=10;NS=52;CA=0;DP=561 +1 4702842 rs3835540;-/GAC TGACG TG 100 PASS AF=0.333162;HP=1;DB;NF=25;NR=19;NS=52;CA=0;DP=517 +1 4703849 rs35422518;-/TCTCCAGGC,mills,venter,watson AGCTCTCCAGG AG 100 PASS AF=0.461699;HP=1;DB;NF=52;NR=39;NS=52;CA=0;DP=558 +1 4704242 . ATT AT 100 PASS AF=0.124811;HP=6;NF=16;NR=12;NS=52;CA=0;DP=518 +1 4704545 . GCACAC GC 43 PASS AF=0.374122;HP=1;NF=68;NR=46;NS=52;CA=0;DP=586 +1 4709952 rs55677440;-/GT TT TTGT 100 PASS AF=0.111566;HP=3;DB;NF=37;NR=55;NS=52;CA=0;DP=757 +1 4712998 rs35177072;-/CTC,mills,venter,watson TCTCC TC 100 PASS AF=0.409205;HP=1;DB;NF=23;NR=30;NS=52;CA=0;DP=527 +1 4714785 rs3835541;-/A,venter CAA CA 100 PASS AF=0.207747;HP=2;DB;NF=12;NR=9;NS=52;CA=0;DP=525 +1 4715739 . GT GTT 100 PASS AF=0.0593871;HP=1;NF=4;NR=4;NS=52;CA=0;DP=486 +1 4717874 rs33969697;-/C,mills,venter TCA TA 100 PASS AF=0.644689;HP=1;DB;NF=37;NR=47;NS=52;CA=0;DP=521 +1 4720164 rs5772181;-/GA,mills,venter,watson TG TGAG 100 PASS AF=0.660601;HP=1;DB;NF=60;NR=61;NS=52;CA=0;DP=723 +1 4725394 venter AG AGAGAGACATGAGTGAAGAAGG 100 PASS AF=0.486541;HP=1;NF=34;NR=40;NS=52;CA=0;DP=600 +1 4726136 rs35816653;-/T,venter CT CTT 100 PASS AF=0.325542;HP=7;DB;NF=25;NR=33;NS=52;CA=0;DP=561 +1 4728249 rs35594902;-/TGTT CT CTGTTT 100 PASS AF=0.236832;HP=1;DB;NF=16;NR=16;NS=52;CA=0;DP=595 +1 4730619 rs56688128;-/AAGGC,venter,watson ACAAGGC AC 100 PASS AF=0.197783;HP=1;DB;NF=14;NR=10;NS=52;CA=0;DP=450 +1 4738491 . ATCTCTCTCTCTCTCTCTCTCT AT 100 PASS AF=0.109332;HP=1;NF=34;NR=36;NS=52;CA=0;DP=556 +1 4743143 rs34960969;-/T,venter ATT AT 100 PASS AF=0.443382;HP=2;DB;NF=27;NR=29;NS=51;CA=0;DP=521 +1 4750482 . AC ACC 44 PASS AF=0.0773717;HP=1;NF=1;NR=10;NS=52;CA=0;DP=532 +1 4751808 . CC CTC 100 PASS AF=0.287743;HP=6;NF=22;NR=19;NS=52;CA=0;DP=549 +1 4753639 rs56735073;-/G AG AGG 100 PASS AF=0.354197;HP=6;DB;NF=26;NR=25;NS=52;CA=0;DP=499 +1 4756338 . TGG TG 100 PASS AF=0.145276;HP=6;NF=12;NR=22;NS=52;CA=0;DP=505 +1 4756654 . CTGT CT 100 PASS AF=0.0253358;HP=1;NF=2;NR=3;NS=52;CA=0;DP=502 +1 4768227 rs34482713;-/A,venter CAC CC 100 PASS AF=0.624286;HP=1;DB;NF=16;NR=29;NS=52;CA=0;DP=382 +1 4769408 rs3030792;-/CA,venter TC TCAC 100 PASS AF=0.564397;HP=1;DB;NF=37;NR=45;NS=51;CA=0;DP=550 +1 4771107 rs59952959;-/TTATCGGTGGTTT ATTATCGGTGGTTTC AC 100 PASS AF=0.43732;HP=2;DB;NF=24;NR=26;NS=52;CA=0;DP=437 +1 4771150 . AGGCAGAGGATTTAGGGGGCAGTGAAACTA AA 100 PASS AF=0.365014;HP=2;NF=25;NR=17;NS=51;CA=0;DP=446 +1 4773228 . AACA AA 100 PASS AF=0.358433;HP=4;NF=49;NR=37;NS=51;CA=0;DP=403 +1 4779293 rs35799766;-/A,venter GAA GA 100 PASS AF=0.620558;HP=4;DB;NF=40;NR=44;NS=52;CA=0;DP=539 +1 4783405 . TACGTATATACATATACA TA 100 PASS AF=0.346752;HP=1;NF=20;NR=40;NS=52;CA=0;DP=331 +1 4784171 . TA TAAGA 100 PASS AF=0.058761;HP=2;NF=4;NR=4;NS=52;CA=0;DP=522 +1 4787548 rs35350740;-/CA,mills AACA AA 100 PASS AF=0.294238;HP=3;DB;NF=43;NR=40;NS=52;CA=0;DP=565 +1 4790642 rs5772184;-/T,venter ATT AT 100 PASS AF=0.360239;HP=10;DB;NF=23;NR=25;NS=52;CA=0;DP=544 +1 4794867 . AATA AA 59 PASS AF=0.0541594;HP=2;NF=6;NR=24;NS=52;CA=0;DP=316 +1 4794934 . CT CTCTCTTT 21 PASS AF=0.322809;HP=1;NF=7;NR=9;NS=50;CA=M;DP=241 +1 4800829 rs35005833;-/C,venter TC TCC 100 PASS AF=0.404199;HP=5;DB;NF=48;NR=15;NS=52;CA=0;DP=479 +1 4806476 . GC GCC 100 PASS AF=0.0973173;HP=6;NF=8;NR=8;NS=52;CA=M;DP=398 +1 4808450 rs34573971;-/A,venter GAA GA 100 PASS AF=0.332411;HP=9;DB;NF=26;NR=22;NS=52;CA=0;DP=474 +1 4809140 rs60726929;-/TCCA,venter,watson TC TCATCC 100 PASS AF=0.348085;HP=1;DB;NF=49;NR=32;NS=52;CA=0;DP=579 +1 4810276 rs3030822;-/TAGT,watson ATAGTT AT 100 PASS AF=0.242205;HP=1;DB;NF=27;NR=13;NS=52;CA=0;DP=582 +1 4831434 . TA TACCACACACACA 100 PASS AF=0.49717;HP=1;NF=18;NR=17;NS=52;CA=0;DP=675 +1 4831567 rs34042090;-/CA CCAC CC 100 PASS AF=0.535527;HP=4;DB;NF=52;NR=45;NS=52;CA=0;DP=738 +1 4833596 rs35226825;-/T AT ATT 100 PASS AF=0.237481;HP=5;DB;NF=19;NR=19;NS=52;CA=0;DP=498 +1 4839967 . TCCTGCCAGCCGGGGGC TC 100 PASS AF=0.0394386;HP=2;NF=5;NR=2;NS=52;CA=0;DP=565 +1 4840948 rs59349393;-/AAACCACATCCCTTGAACT GACTAAACCACATCCCTTGAA GA 100 PASS AF=0.144437;HP=1;DB;NF=16;NR=17;NS=52;CA=0;DP=578 +1 4846284 rs36118323;-/T,venter CT CTT 100 PASS AF=0.130437;HP=7;DB;NF=12;NR=15;NS=52;CA=0;DP=415 +1 4855247 venter GA GACACA 100 PASS AF=0.301971;HP=1;NF=19;NR=3;NS=52;CA=0;DP=635 +1 4864897 venter AT ATT 100 PASS AF=0.215684;HP=6;NF=17;NR=20;NS=52;CA=0;DP=450 +1 4865373 rs34273857;-/A,venter CA CAA 100 PASS AF=0.169967;HP=6;DB;NF=17;NR=15;NS=52;CA=0;DP=533 diff --git a/tests/tabix_data/vcf/4.vcf b/tests/tabix_data/vcf/4.vcf new file mode 100644 index 0000000..65ed14e --- /dev/null +++ b/tests/tabix_data/vcf/4.vcf @@ -0,0 +1,318 @@ +##fileformat=VCFv4.1 +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##fileDate=20110524 +##reference=ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/human_g1k_v37.fasta.gz +##source=EricBanksValidationQC;fromGoncaloAbecasisValidationSelection +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00127 HG00128 HG00136 HG00137 HG00138 HG00139 HG00152 HG00156 HG00234 HG00235 HG00237 HG00242 HG00244 HG00262 HG01055 HG01079 NA19138 NA18974 NA18523 NA12717 NA19209 NA18577 NA18973 NA18943 NA12873 NA18623 NA18622 NA18948 NA19171 NA19204 NA06994 NA18563 NA18547 NA18861 NA18608 NA12282 NA12751 NA18959 NA19331 NA19453 NA20537 NA12046 NA20515 NA20516 NA20521 NA20524 NA20528 NA20759 NA20768 NA20769 NA20774 NA20775 NA20783 NA20787 NA20790 NA20800 NA20819 NA20812 NA20505 NA20530 NA20540 NA20538 NA20581 NA20815 NA20544 NA20810 NA20807 NA20816 NA20504 NA20753 NA20502 NA12342 NA19150 NA19468 NA20336 NA19395 NA19257 NA19360 NA19700 NA18867 NA20317 NA18968 NA19107 HG00111 HG00108 NA19077 NA19684 NA18511 NA12044 NA19382 NA19457 NA18933 NA18923 NA18965 HG00141 NA20341 NA18740 HG00537 HG00346 HG01173 HG00702 HG00313 HG00150 NA18612 HG00339 NA12273 HG00250 NA18593 NA18621 HG00478 HG00251 HG01070 NA19160 NA18995 NA10851 NA18976 NA18603 NA19200 HG01204 HG01191 HG01101 HG00146 HG00306 NA18985 HG00160 HG00635 HG00372 HG00357 HG00634 NA18541 NA18950 NA19759 HG00351 HG00257 HG00118 HG00336 HG00448 HG01354 NA18609 HG00428 HG00326 NA11894 NA18956 HG00173 HG00117 NA11893 HG01251 HG01441 HG01437 HG00182 HG00330 HG01060 HG00329 NA18960 NA18856 NA07346 NA18871 NA19057 NA18868 NA18636 NA12830 NA19007 NA18910 NA18874 NA19056 NA19064 NA19066 NA18487 NA18642 NA19236 NA07056 NA18637 NA19235 NA19309 NA19311 NA19334 NA19346 NA19347 NA19372 NA19376 NA19383 NA19384 NA19394 NA19428 NA19430 NA19451 NA19466 NA19313 NA19321 NA19324 NA19332 HG00479 HG00608 NA18573 HG00375 NA19248 NA19093 HG01170 HG00534 HG01171 HG01522 NA18624 HG00683 HG01521 NA19005 NA20412 NA18971 HG00446 NA12748 HG00530 HG00690 HG01356 HG01516 NA20532 HG00344 HG00328 NA18542 HG00254 HG00321 HG00577 HG00656 HG00342 HG00524 HG00650 HG00557 HG00319 HG00457 HG00125 HG00578 HG00543 HG00638 HG00171 HG00699 HG00595 HG00187 HG00704 HG00533 HG00596 HG00268 HG01083 HG00651 HG01133 HG00671 HG00327 HG01148 HG00246 HG00672 HG00556 HG00436 HG00554 NA18633 NA20344 NA11993 NA07037 NA11930 HG01366 HG01389 HG00620 NA19740 HG00190 HG00419 NA18535 HG01495 NA18592 HG01497 HG00174 HG01140 NA12287 HG00689 HG01550 HG00334 HG01375 HG00637 NA18507 HG01113 NA18550 NA19129 HG01551 HG01462 HG00331 NA12413 HG01456 HG01360 HG00708 HG01350 HG00684 NA19099 HG00284 NA12399 NA12286 NA12777 HG00277 HG00266 NA19985 HG00353 HG01102 NA07347 NA07051 NA19900 NA18984 NA07048 HG00640 HG01066 NA12812 HG01174 HG01188 NA19390 NA19436 NA19439 NA19440 NA19463 NA19470 NA19471 NA19472 NA19676 NA19660 NA19661 NA19663 NA19722 NA19725 NA19728 NA19729 NA19731 NA19749 NA19755 NA19756 NA19758 NA19770 NA19773 NA19777 NA19780 NA19783 NA20525 NA20589 NA20765 NA20802 NA20804 NA18544 NA18602 NA18546 NA18610 NA18957 NA18615 NA18616 NA19010 NA18638 NA18639 NA18627 NA19072 NA18630 NA19074 NA19080 NA19081 NA19083 NA19085 NA19088 NA20287 NA19835 NA20276 NA19818 NA20278 NA20282 NA20342 NA20296 NA20314 NA20346 NA19712 NA19198 NA19108 NA18934 NA18916 NA18907 NA18917 NA06989 NA12058 NA12341 NA12546 NA12489 HG01197 NA18983 NA11843 NA11892 NA12749 +20 82176 rs11906362 T C 318 NOT_TYPED;PQ10 BCM.AC=16;DB;SRC=VQSR+2-OF-7;PQ=0 +20 249843 rs112456910 C T 1304 PASS BCM.AC=14;DB;SEQUENOM.AC=12;SRC=VQSR+INTERSECTION;PQ=29 GT 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 . . . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 0/1 . . 0/0 0/0 . 0/0 . . . 0/0 . 0/0 0/0 0/1 0/0 . . . 0/0 . 0/0 . . . . . . . . . 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 . . . . . 0/0 0/0 . . 0/0 . . 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 . 0/0 . . . . . 0/0 0/0 . . 0/1 . . 0/0 . 0/1 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . . . . . 0/0 . . . . . 0/0 . 0/1 . . . . 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 . . . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 . . . 0/0 0/1 0/0 . . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/0 . 0/0 0/0 0/0 . . . . . . . 0/0 . 0/0 . . . . . . . . . . 0/0 . 0/0 . . 0/0 0/0 . . . . . 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 . . 0/0 . 0/0 0/0 . 0/0 . 0/0 . 0/0 0/0 . 0/0 0/0 . 0/1 0/1 0/0 . . 0/0 0/0 . . 0/0 0/1 . . 0/1 . . . 0/0 0/0 0/0 . . . . . 0/0 . +20 688672 rs116071340 C T 56 PASS BCM.AC=1;DB;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=52 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 987773 rs6077519 T G 474 PASS DB;SEQUENOM.AC=73;SRC=VQSR-ONLY;PQ=42 GT . 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 +20 1166164 . G T 26 NOT_DESIGNED BCM.AC=20;SRC=VQSR+2-OF-7 +20 1333317 . A G 4 PASS SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=32 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1372898 rs112426678 C A 833 PASS BCM.AC=7;DB;SEQUENOM.AC=6;SRC=VQSR+INTERSECTION;PQ=46 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1526045 rs11908182 A G 847 PQ10 BCM.AC=6;DB;SEQUENOM.AC=6;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1565049 . C T 100 PASS SEQUENOM.AC=3;SRC=2-OF-7-ONLY;PQ=19 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1577285 . G A 4 HIGH_NO_CALL_RATE SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=57 GT . . . 0/0 0/0 . 0/0 . . . 0/0 0/0 . 0/0 . . 0/0 0/0 . . . 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 . 0/0 . 0/0 0/0 . . 0/0 . . . 0/0 . 0/0 . . . 0/0 . . . . . . 0/0 . 0/0 . 0/0 0/0 . 0/0 . . . 0/0 . . . . . 0/0 0/0 . . . . 0/0 0/0 . 0/0 . . 0/0 0/0 . . . . . 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 . . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . 0/0 0/0 . . . 0/0 . . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . . . . . 0/0 . 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 . . . . 0/0 . . . . . . . . 0/0 . . . 0/0 . . . . . . . . . . . . 0/0 . . 0/0 0/0 . 0/0 . . 0/0 . 0/0 . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . . . 0/0 . . . 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 . . . 0/0 . 0/0 . . . 0/0 . 0/0 0/0 . . 0/0 . 0/0 0/0 . . 0/0 . . . . . . 0/0 . 0/0 0/0 . 0/0 . . . 0/0 . . . 0/0 . 0/0 0/0 . . . . 0/0 0/0 0/0 . . . . 0/0 0/0 . . . . . . 0/0 0/0 . . . . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . . . . 0/0 0/0 0/0 . 0/0 . 0/0 . 0/0 0/0 . 0/0 . 0/0 . 0/0 . 0/0 . . . . . 0/0 0/0 0/0 . . 0/0 0/0 +20 1577845 . G A 267 HIGH_NO_CALL_RATE BCM.AC=42;SEQUENOM.AC=5;SRC=VQSR+2-OF-7;PQ=37 GT 0/0 . . 0/0 . . . . . . 0/0 . . 0/0 . . 0/0 0/0 . . . . 0/0 0/0 . 0/0 . 0/0 . . 0/0 0/0 . 1/1 0/0 0/0 . 0/0 . 0/0 0/0 . . 0/0 . . . . . 0/0 . 0/0 . 0/0 . . . . . . 0/0 . 0/0 . 0/0 . . 0/0 . . . 0/0 . . . . . . . . . . . 0/0 0/0 . 0/0 . . 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . 0/0 . . 0/0 . . 0/0 . . 0/0 0/0 . . 0/0 . . . 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 0/0 . . . 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . . . . . . 0/0 . 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 . . . . 0/0 . . 0/0 . . . . . 0/0 . . . . 0/0 . . . . . . . . . . . 0/0 . . 0/0 0/0 . 0/0 . . 0/0 . 0/0 . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 . . . 0/0 0/0 . . 0/0 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 . . . 0/0 . 0/0 . . . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . . 0/0 . 0/0 . . . . . . 0/0 0/0 . 0/0 . . . 0/0 . . 0/0 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . . . . 0/0 . 0/0 0/0 . . . . 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . . . 0/0 0/0 0/0 . . . . 0/0 0/0 0/1 . 0/0 . . . 0/0 . 1/1 . . 0/0 . 0/0 0/0 . 0/0 . . 0/0 0/0 +20 1590306 . A G 16 AMBIGUOUS_SEQUENOM_CALLS SEQUENOM.AC=177;SRC=VQSR-ONLY;PQ=15 GT 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 . 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 . 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 . 0/0 . 0/1 0/1 0/1 . 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 . 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 . 0/0 0/0 . . . 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 . 0/1 0/1 0/1 0/1 . 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 . 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 . . 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 . 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 . 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 . 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 . 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 . 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 +20 1643825 . G T 24 PQ10 BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1746733 . G A 9 NOT_DESIGNED SRC=VQSR-ONLY +20 1896670 . G C 16 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1934851 rs6045641 T C 53 NOT_DESIGNED BCM.AC=29;DB;SRC=VQSR-ONLY +20 2083617 . G A 9 NOT_DESIGNED BCM.AC=4;SRC=VQSR+2-OF-7 +20 2280790 rs214779 T A 57436 NOT_DESIGNED BCM.AC=758;DB;SRC=VQSR+2-OF-7 +20 2843004 rs118020362 T C 131 PASS BCM.AC=4;DB;SEQUENOM.AC=4;SRC=VQSR+INTERSECTION;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 2854191 . C T 78 POSSIBLE_PROBE_FAILURE BCM.AC=25;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 2999522 . G A 5 NOT_DESIGNED SRC=VQSR-ONLY +20 3935503 . G A 95 NOT_TYPED;PQ10 BCM.AC=1;SRC=VQSR+2-OF-7;PQ=9 +20 4015187 . G C 93 NOT_TYPED;PQ10 BCM.AC=14;SRC=VQSR+2-OF-7;PQ=0 +20 4260976 rs75912589 A G 8109 PASS BCM.AC=94;DB;SEQUENOM.AC=95;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +20 4557512 . C A 8 NOT_TYPED SRC=VQSR-ONLY;PQ=48 +20 4603711 . C T 20 PQ10 SEQUENOM.AC=1;SRC=VQSR-ONLY;PQ=9 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5021712 rs115278430 C A 76 NOT_TYPED BCM.AC=2;DB;SRC=VQSR+2-OF-7;PQ=15 +20 5137904 . C T 70 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5500990 rs116723001 C A 1701 PASS BCM.AC=14;DB;SEQUENOM.AC=13;SRC=VQSR+INTERSECTION;PQ=31 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5524677 . C T 21 PASS BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5601529 rs6085225 G A 1415 PQ10 BCM.AC=33;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5773125 . G A 165 NOT_TYPED BCM.AC=3;SRC=VQSR+INTERSECTION;PQ=13 +20 5986950 rs6085343 G A 1226 PASS BCM.AC=68;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 6242013 . G A 10 NOT_TYPED;PQ10 SRC=2-OF-7-ONLY;PQ=0 +20 6320495 . C A 16 NOT_TYPED BCM.AC=2;SRC=VQSR+2-OF-7;PQ=29 +20 6575066 . T C 9.19 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7228334 . A G 108 PQ10 BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7274968 . C T 39 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=46 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7321986 . C G 5 PQ10 SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7377337 . C T 180 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7400995 rs114967944 C T 426 PASS BCM.AC=8;DB;SEQUENOM.AC=6;SRC=VQSR+INTERSECTION;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7466093 . C G 4.11 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=36 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7575759 rs28491496 A G 308 POSSIBLE_PROBE_FAILURE;PQ10 BCM.AC=17;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7678819 rs11699779 A G 12976 PASS BCM.AC=95;DB;SEQUENOM.AC=93;SRC=VQSR+INTERSECTION;PQ=37 GT . 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 . 0/1 . . 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 +20 7924363 . G A 301 PASS BCM.AC=2;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8165430 rs61262870 T C 1699 NOT_DESIGNED DB;SRC=VQSR+2-OF-7 +20 8642873 . A G 19 NOT_DESIGNED BCM.AC=58;SRC=VQSR+2-OF-7 +20 8700342 . T G 102 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=53 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8799615 . C T 38 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=29 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9149281 . C T 11 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9214590 . T C 99 PASS BCM.AC=3;SEQUENOM.AC=3;SRC=VQSR+2-OF-7;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9276871 . C T 695 NOT_TYPED;PQ10 BCM.AC=11;SRC=VQSR+2-OF-7;PQ=9 +20 10226915 rs74843547 G A 120 PASS BCM.AC=1;DB;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10259160 . T A 10 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=57 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10482699 . G A 101 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10625431 . T C 17 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11506447 . G C 100 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=55 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11565628 . G A 22 PASS BCM.AC=1;SEQUENOM.AC=3;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11625368 rs111669054 A G 138 PASS BCM.AC=2;DB;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION;PQ=38 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11798908 . A G 14 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12006592 . A G 57 PASS SEQUENOM.AC=6;SRC=VQSR+2-OF-7;PQ=29 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12025988 . C T 34 NOT_DESIGNED BCM.AC=43;SRC=VQSR+2-OF-7 +20 12142653 . T A 12 PASS BCM.AC=2;SEQUENOM.AC=3;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12171235 . A G 60 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=52 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12326082 . C T 118 NOT_TYPED;PQ10 SRC=VQSR+2-OF-7;PQ=0 +20 12364163 . A G 8 PASS SEQUENOM.AC=2;SRC=2-OF-7-ONLY;PQ=53 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12718574 rs112953117 G C 656 PASS BCM.AC=3;DB;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION;PQ=40 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13241902 . A C 52 PQ10 BCM.AC=2;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13339930 rs6042043 A G 839 NOT_TYPED;PQ10 BCM.AC=143;DB;SRC=VQSR+2-OF-7;PQ=0 +20 13410135 rs77634879 T A 50 PASS BCM.AC=39;DB;SEQUENOM.AC=37;SRC=VQSR-ONLY;PQ=60 GT 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13764237 . C T 51 NOT_TYPED BCM.AC=1;SRC=VQSR+2-OF-7;PQ=37 +20 14283363 rs111719158 G A 197 NOT_TYPED;PQ10 BCM.AC=6;DB;SRC=VQSR+INTERSECTION;PQ=0 +20 14589314 rs2209596 G T 30806 INCORRECT_SEQUENOM_CALLS BCM.AC=253;DB;SEQUENOM.AC=315;SRC=VQSR+INTERSECTION;PQ=60 GT . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 . 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 . 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 +20 14843271 . A G 78 NOT_DESIGNED BCM.AC=343;SRC=VQSR+2-OF-7 +20 15193914 . C T 48 PASS BCM.AC=2;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15581882 . C G 51 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15699667 . C T 59 PASS BCM.AC=2;SEQUENOM.AC=3;SRC=VQSR+2-OF-7;PQ=52 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15913614 . G T 9 PASS SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16397068 . C G 1.16 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=20 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16475471 rs73597775 C T 234 HIGH_NO_CALL_RATE DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=60 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16487648 rs12479901 G A 1025 PASS BCM.AC=14;DB;SEQUENOM.AC=15;SRC=VQSR+INTERSECTION;PQ=23 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 16936995 . C A 102 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17430784 . T C 18 PQ10 BCM.AC=7;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17828256 . C T 77 PASS BCM.AC=2;SEQUENOM.AC=4;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17938631 . T C 218 PASS BCM.AC=8;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17980474 . G A 34 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=23 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17991241 . C T 49 NOT_DESIGNED SRC=VQSR-ONLY +20 18180100 . A G 100 NOT_TYPED;PQ10 SRC=2-OF-7-ONLY;PQ=0 +20 18198917 . C T 15 PASS SEQUENOM.AC=3;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18232143 rs77523268 C T 952 PASS BCM.AC=8;DB;SEQUENOM.AC=8;SRC=VQSR+INTERSECTION;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18584068 . C A 81 NOT_TYPED;PQ10 SRC=VQSR-ONLY;PQ=0 +20 19212550 . C A 11 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR-ONLY;PQ=46 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19966683 rs199601 G A 56556 PASS BCM.AC=562;DB;SEQUENOM.AC=560;SRC=VQSR+INTERSECTION;PQ=60 GT 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 . 1/1 . 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 +20 20157470 rs74569344 G T 159 NOT_TYPED;PQ10 DB;SRC=VQSR-ONLY;PQ=0 +20 20850592 . G A 11.30 NOT_TYPED;PQ10 BCM.AC=1;SRC=2-OF-7-ONLY;PQ=0 +20 20987147 . T C 58 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21056309 . T C 12.30 PASS SEQUENOM.AC=2;SRC=2-OF-7-ONLY;PQ=33 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21195714 . A C 12 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 21477015 . G A 140 NOT_TYPED;PQ10 BCM.AC=2;SRC=VQSR+2-OF-7;PQ=9 +20 21491513 . C T 11 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 21530607 rs4627653 G A 3116 PASS BCM.AC=21;DB;SEQUENOM.AC=21;SRC=VQSR+2-OF-7;PQ=46 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21569638 . G C 35 PASS BCM.AC=0;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=29 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21579389 . C T 169 NOT_DESIGNED SRC=VQSR-ONLY +20 21624143 . T C 63 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=43 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21734208 . A G 5.74 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=55 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21754065 . G A 16 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21764267 . G A 164 PASS BCM.AC=3;SEQUENOM.AC=4;SRC=VQSR+INTERSECTION;PQ=41 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21863337 . T C 174 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21910648 . C A 145 PQ10 BCM.AC=5;SEQUENOM.AC=4;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 22016989 . G A 7 NOT_TYPED;PQ10 SRC=VQSR-ONLY;PQ=0 +20 22168952 . G T 107 PQ10 BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23102548 . G C 15 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23470735 . A T 12 NOT_DESIGNED SRC=VQSR-ONLY +20 23665595 . C T 205 PASS BCM.AC=4;SEQUENOM.AC=3;SRC=VQSR+2-OF-7;PQ=43 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 . . 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 . . . . . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . . . . . 0/0 . . 0/0 0/0 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 . 0/0 . 0/0 . . . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . . . . 0/0 . . 0/0 0/0 . . . 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . +20 23758844 rs117686838 A T 1.18 NOT_DESIGNED DB;SRC=2-OF-7-ONLY +20 23785676 . G A 90 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=23 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24126594 . C T 16 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24247752 . C T 6107 NOT_DESIGNED BCM.AC=42;SRC=VQSR+2-OF-7 +20 24432806 . T C 21 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR-ONLY;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24450030 . G A 8 NOT_TYPED SRC=VQSR-ONLY;PQ=60 +20 24792588 . C T 17 NOT_DESIGNED SRC=VQSR+2-OF-7 +20 24875997 rs6106960 T C 35367 PASS BCM.AC=238;DB;SEQUENOM.AC=233;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 . 0/0 . 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 . 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 . 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +20 25133654 . G A 13.40 PQ10 SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25388911 . G T 28 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=53 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25574143 . G A 77 PQ10 SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25659422 . A G 11 NOT_TYPED;PQ10 BCM.AC=1;SRC=VQSR+2-OF-7;PQ=0 +20 25700728 rs6037216 C G 1553 POSSIBLE_PROBE_FAILURE;PQ10 BCM.AC=7;DB;SEQUENOM.AC=0;SRC=VQSR+INTERSECTION;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25741857 rs73347142 G T 41907 PQ10 DB;SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=9 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25750038 . T G 86 NOT_TYPED;PQ10 BCM.AC=493;SRC=VQSR-ONLY;PQ=0 +20 25751184 . G C 100 NOT_TYPED;PQ10 BCM.AC=180;SRC=2-OF-7-ONLY;PQ=0 +20 25766473 . T A 124 NOT_TYPED;PQ10 SRC=VQSR+2-OF-7;PQ=0 +20 25789517 . A T 40 NOT_TYPED;PQ10 BCM.AC=319;SRC=VQSR+2-OF-7;PQ=0 +20 25794555 . G A 18 NOT_TYPED;PQ10 BCM.AC=181;SRC=VQSR-ONLY;PQ=0 +20 25922316 . T C 26 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=18 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25999667 . C G 32 INCORRECT_SEQUENOM_CALLS;PQ10 BCM.AC=61;SEQUENOM.AC=1;SRC=VQSR-ONLY;PQ=0 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26046637 . G A 26 NOT_TYPED;PQ10 BCM.AC=354;SRC=VQSR-ONLY;PQ=0 +20 26057903 . G A 100 NOT_TYPED;PQ10 SRC=2-OF-7-ONLY;PQ=0 +20 26071009 . T C 9 AMBIGUOUS_SEQUENOM_CALLS;PQ10 BCM.AC=586;SEQUENOM.AC=59;SRC=VQSR-ONLY;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +20 26126724 . G C 23737 PASS SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=18 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26217247 . C A 374 PQ10 BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26246019 rs79506355 C A 999 NOT_TYPED DB;SRC=2-OF-7-ONLY;PQ=11 +20 26258231 rs79859288 C T 527 NOT_TYPED DB;SRC=VQSR+2-OF-7;PQ=13 +20 26265474 . G T 460.59 PQ10 SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=9 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26272553 . C G 100 PQ10 SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=0 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26275939 . A G 81 NOT_TYPED SRC=2-OF-7-ONLY;PQ=12 +20 26293152 . T C 100 PASS BCM.AC=14;SEQUENOM.AC=17;SRC=2-OF-7-ONLY;PQ=10 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 +20 26301426 . A G 63 AMBIGUOUS_SEQUENOM_CALLS SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=11 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26301793 . C G 8 PASS SEQUENOM.AC=1;SRC=VQSR-ONLY;PQ=47 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26304696 rs6051307 G A 100 PQ10 DB;SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29494622 rs78775502 C T 935 PQ10 DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29514290 rs6087354 T A 19181 AMBIGUOUS_SEQUENOM_CALLS;PQ10 DB;SEQUENOM.AC=278;SRC=VQSR+2-OF-7;PQ=0 GT 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 . 1/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 +20 29518801 rs113500384 G A 702.91 PQ10 DB;SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=0 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29574811 rs73620522 G A 16281 HIGH_NO_CALL_RATE DB;SEQUENOM.AC=24;SRC=VQSR-ONLY;PQ=15 GT 0/1 1/1 1/1 . 1/1 1/1 0/1 1/1 1/1 . 1/1 1/1 . . 0/0 . . 1/1 . 1/1 1/1 . 1/1 1/1 0/1 1/1 . . 1/1 0/0 . 1/1 1/1 1/1 1/1 1/1 . 1/1 1/1 . 1/1 . . 1/1 . . . . 1/1 1/1 . . . . . . . . . . . 1/1 1/1 1/1 1/1 1/1 . 1/1 1/1 . . . . . 1/1 . 1/1 . 0/1 . . . 0/1 . 1/1 . 1/1 . 1/1 1/1 0/1 1/1 . . 1/1 . 1/1 . . . 1/1 1/1 . . 1/1 . . . 1/1 1/1 1/1 . 1/1 1/1 . 1/1 1/1 . 1/1 1/1 . 1/1 1/1 . 1/1 . 0/1 1/1 1/1 . 1/1 . . 1/1 1/1 . 1/1 1/1 1/1 1/1 1/1 . 1/1 1/1 . . 1/1 . 1/1 1/1 . . . . . 1/1 . 1/1 1/1 . 1/1 1/1 . 1/1 1/1 . 1/1 1/1 . 1/1 . . 1/1 1/1 . 1/1 . . 1/1 . . . 0/0 . 1/1 1/1 . . . . 1/1 1/1 . 1/1 1/1 . 1/1 . . . 1/1 . 1/1 1/1 . 1/1 . . . 1/1 1/1 1/1 1/1 . 1/1 . 1/1 . . . . . . . 1/1 . . . . . . . . . . 1/1 1/1 1/1 1/1 1/1 1/1 . . . . . 1/1 1/1 1/1 . 1/1 . . . . . . . 1/1 1/1 1/1 1/1 1/1 . 1/1 . . . . . . 1/1 1/1 1/1 . 1/1 0/0 . . . . . 1/1 1/1 1/1 1/1 1/1 . . 1/1 . 1/1 . 0/1 1/1 1/1 . 1/1 1/1 1/1 . . . . 1/1 . . . . . . . . . . . 1/1 1/1 . . 1/1 1/1 . 1/1 . 0/0 . . . . . . . 0/0 . . . . 1/1 . 1/1 1/1 1/1 1/1 1/1 1/1 . 1/1 . . . . 1/1 1/1 1/1 1/1 0/0 . . . 1/1 . . 1/1 . 1/1 1/1 1/1 1/1 1/1 . 1/1 1/1 . 1/1 . 1/1 . . 1/1 1/1 1/1 0/0 +20 29598472 rs73612735 T G 10639 NOT_TYPED;PQ10 DB;SRC=VQSR-ONLY;PQ=0 +20 29632410 . T C 5.11 NOT_TYPED;PQ10 SRC=2-OF-7-ONLY;PQ=0 +20 29642272 rs77298479 T A 100 NOT_TYPED;PQ10 DB;SRC=2-OF-7-ONLY;PQ=9 +20 29827087 rs62641496 G C 100 NOT_DESIGNED DB;SRC=2-OF-7-ONLY +20 30120025 . C G 1113 POSSIBLE_PROBE_FAILURE;PQ10 BCM.AC=9;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30595334 rs62206358 C A 62 PASS BCM.AC=3;DB;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=20 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30616314 . G A 176 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+INTERSECTION;PQ=52 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30696393 rs76882848 T C 150 PASS BCM.AC=3;DB;SEQUENOM.AC=3;SRC=VQSR+2-OF-7;PQ=60 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30884360 . C A 6 PQ10 BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=9 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30910907 . A T 24 NOT_DESIGNED SRC=VQSR-ONLY +20 31107862 . T C 46 PQ10 BCM.AC=6;SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31316775 . T G 47 PASS BCM.AC=2;SEQUENOM.AC=1;SRC=VQSR-ONLY;PQ=37 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31576854 . C T 66 PQ10 BCM.AC=8;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32840139 . G A 1158 PQ10 BCM.AC=11;SEQUENOM.AC=0;SRC=VQSR+INTERSECTION;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 33588848 . C T 17 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR-ONLY;PQ=34 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 33974818 . G A 959 NOT_TYPED BCM.AC=12;SRC=VQSR+INTERSECTION;PQ=16 +20 34147834 rs368386 G A 105 NOT_DESIGNED BCM.AC=3;DB;SRC=VQSR+2-OF-7 +20 34155930 . T C 1200 NOT_DESIGNED BCM.AC=23;SRC=VQSR+2-OF-7 +20 34589611 . C T 39 PQ10 SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34595073 . T G 518 POSSIBLE_PROBE_FAILURE;PQ10 BCM.AC=4;SEQUENOM.AC=0;SRC=VQSR+INTERSECTION;PQ=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35255604 . C T 367 POSSIBLE_PROBE_FAILURE BCM.AC=5;SEQUENOM.AC=0;SRC=VQSR+INTERSECTION;PQ=46 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35644471 rs8115057 C T 10677 PQ10 BCM.AC=174;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36480073 . T C 428 PASS BCM.AC=6;SEQUENOM.AC=6;SRC=VQSR+INTERSECTION;PQ=25 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36563396 . G A 2.68 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36645837 rs79088417 T C 342 NOT_DESIGNED DB;SRC=VQSR+2-OF-7 +20 36667909 . C T 659 NOT_TYPED;PQ10 BCM.AC=6;SRC=VQSR+INTERSECTION;PQ=0 +20 36932648 rs5743498 C T 107 PASS BCM.AC=3;DB;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION;PQ=53 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37398143 . T A 31 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37790289 . G A 26 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=46 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37817201 . A G 222 PASS BCM.AC=2;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=37 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37873327 . A T 445 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=60 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37980382 . A G 78 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION;PQ=20 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38302429 rs73906408 C T 5149 PASS BCM.AC=24;DB;SEQUENOM.AC=24;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38369195 . C T 43 NOT_TYPED;PQ10 BCM.AC=56;SRC=VQSR+2-OF-7;PQ=0 +20 38901146 . C T 2046 NOT_TYPED;PQ10 BCM.AC=60;SRC=VQSR+2-OF-7;PQ=0 +20 39110108 . C T 4.13 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39624865 . G A 584 NOT_TYPED BCM.AC=9;SRC=VQSR+2-OF-7;PQ=29 +20 40505598 . A G 16 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=41 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40927704 . T C 12 PASS BCM.AC=0;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=60 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41093733 . T C 5 NOT_DESIGNED SRC=VQSR-ONLY +20 41137712 rs230167 C T 24 NOT_DESIGNED DB;SRC=VQSR+2-OF-7 +20 41311175 . C T 75 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41642529 . T G 72 PQ10 BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=9 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41756929 . C T 32 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41818162 rs117637352 G A 391 PASS BCM.AC=30;DB;SEQUENOM.AC=29;SRC=VQSR+2-OF-7;PQ=60 GT 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42153349 . C T 25 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42171267 . A G 88.70 PASS SEQUENOM.AC=13;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42330199 . G A 590 PASS BCM.AC=5;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION;PQ=60 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42474396 . G A 100 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=23 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42483892 . T C 112 NOT_TYPED BCM.AC=1;SRC=VQSR+2-OF-7;PQ=29 +20 42500754 rs6513891 C A 619 PQ10 DB;SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42575810 . T C 3.60 PASS SEQUENOM.AC=2;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42762553 rs5014517 C T 759.47 NOT_DESIGNED BCM.AC=366;DB;SRC=2-OF-7-ONLY +20 42908494 . T C 42 PASS BCM.AC=3;SEQUENOM.AC=3;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42927494 . C G 17 PQ10 BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43033625 . G A 100 NOT_DESIGNED SRC=2-OF-7-ONLY +20 43066015 rs6093982 C T 290 PASS BCM.AC=2;DB;SEQUENOM.AC=5;SRC=VQSR+2-OF-7;PQ=31 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43506182 . T C 28 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43582424 rs79775916 C T 9 PASS BCM.AC=1;DB;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=43 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43744100 . G C 4.80 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=43 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43899736 . G A 35 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=46 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44373763 . C T 730 PASS BCM.AC=6;SEQUENOM.AC=6;SRC=VQSR+INTERSECTION;PQ=43 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45097507 rs454429 C T 25449 PASS BCM.AC=302;DB;SEQUENOM.AC=300;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/1 0/1 0/0 0/0 . 0/0 0/0 0/0 0/1 . 0/0 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 . 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 . 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 . 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 . 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 +20 45919615 . T C 46 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=29 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46997402 rs34772061 C G 19 NOT_TYPED;PQ10 DB;SRC=VQSR+2-OF-7;PQ=0 +20 47502684 . G A 66 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=55 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 48045398 . A G 20 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=37 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 48124745 . C T 10.30 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=39 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 48422538 rs73269151 A G 13012 NOT_TYPED;PQ10 BCM.AC=282;DB;SRC=VQSR+INTERSECTION;PQ=0 +20 48669886 rs73276465 G C 106 NOT_TYPED BCM.AC=8;DB;SRC=VQSR+2-OF-7;PQ=60 +20 48691248 . A G 95 PASS BCM.AC=2;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=23 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 48917711 rs116072324 T C 129 NOT_DESIGNED BCM.AC=1;DB;SRC=VQSR+2-OF-7 +20 49098380 . A T 115 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49206794 rs116083969 G A 19 PASS BCM.AC=1;DB;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49360238 . G A 50 PQ10 BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49712636 rs113933231 T A 93 PASS BCM.AC=3;DB;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION;PQ=52 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50309600 . C A 46 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=46 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50599968 rs6096700 T C 10667 NOT_TYPED;PQ10 BCM.AC=426;DB;SRC=VQSR+2-OF-7;PQ=0 +20 50601297 . A T 7 PASS BCM.AC=0;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50603254 rs6021599 A G 13052 NOT_TYPED;PQ10 BCM.AC=520;DB;SRC=VQSR+2-OF-7;PQ=0 +20 50810123 rs28420712 A T 2671 NOT_DESIGNED BCM.AC=228;DB;SRC=VQSR+2-OF-7 +20 50892806 . A G 37 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 51511870 . C T 116 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=43 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51818730 . C T 130 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+INTERSECTION;PQ=54 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51958269 . G C 48 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=23 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 52285202 rs113200595 T G 11071 NOT_DESIGNED BCM.AC=198;DB;SRC=VQSR+2-OF-7 +20 52308503 . T C 651 PASS BCM.AC=5;SEQUENOM.AC=5;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 52470222 rs28606974 A G 72 NOT_DESIGNED BCM.AC=22;DB;SRC=VQSR-ONLY +20 52485230 . G T 74 NOT_DESIGNED BCM.AC=21;SRC=VQSR-ONLY +20 53017837 rs112388078 T C 1190 PASS BCM.AC=8;DB;SEQUENOM.AC=8;SRC=VQSR+2-OF-7;PQ=37 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53031638 . T G 4 PASS SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53272023 rs4362623 G A 70728 PASS BCM.AC=692;DB;SEQUENOM.AC=690;SRC=VQSR+INTERSECTION;PQ=57 GT 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 . 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +20 53423667 . T A 214 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION;PQ=55 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53580904 . T C 32 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53599478 . C T 34 NOT_TYPED;PQ10 BCM.AC=1;SRC=VQSR+2-OF-7;PQ=9 +20 54004274 rs114966870 A G 602 PASS BCM.AC=40;DB;SEQUENOM.AC=9;SRC=VQSR-ONLY;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54096380 . G A 46 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54146938 . G A 27 POLYMORPHIC_SAMPLES_FAILED BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=53 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54163701 . A G 130 PASS BCM.AC=3;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . +20 54199759 . T C 198 NOT_DESIGNED BCM.AC=9;SRC=VQSR+2-OF-7 +20 54313664 rs112885916 A T 98 PASS BCM.AC=10;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=57 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54424603 . T C 116 PQ10 BCM.AC=8;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54542220 . C T 33 NOT_DESIGNED SRC=VQSR-ONLY +20 54628591 . G A 87 POLYMORPHIC_SAMPLES_FAILED;PQ10 BCM.AC=2;SEQUENOM.AC=4;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54793377 . C T 8 HIGH_NO_CALL_RATE BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=60 GT . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 0/0 . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +20 55067830 . G A 6 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55113534 . T G 21 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=16 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55195413 . A G 20 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55483325 . C T 17 NOT_TYPED;PQ10 BCM.AC=1;SRC=VQSR-ONLY;PQ=0 +20 55598554 . T C 22.30 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=48 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55790632 . G T 39 HIGH_NO_CALL_RATE BCM.AC=2;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 . . 0/0 . . . . 0/0 0/0 . . 0/0 . . 0/0 . . . . . . . 0/0 0/0 0/0 . . . 0/0 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . 0/0 0/0 0/0 . . . . . . . . . 0/0 0/0 0/0 0/0 . . . . . . . . 0/0 0/0 0/0 0/0 . 0/0 . . . . . . 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . . 0/0 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 0/0 . . . . . 0/0 . 0/0 . 0/0 0/0 0/0 . . . . . . . 0/0 0/0 0/0 0/0 0/0 . . . . . . . 0/0 . . . 0/0 . . . . . . . . . . 0/0 0/0 . . . . 0/0 . . . . . . 0/0 0/0 . . . . . . 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 0/0 . . 0/0 0/0 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . +20 55870101 . C T 129 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56029723 rs74833660 G A 21 PASS BCM.AC=1;DB;SEQUENOM.AC=3;SRC=VQSR+2-OF-7;PQ=29 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56309506 . C G 6.38 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56335703 . G C 33 PASS BCM.AC=2;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=35 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56549982 rs6099866 T C 999 PASS DB;SEQUENOM.AC=9;SRC=2-OF-7-ONLY;PQ=32 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56792927 . C T 207 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57266953 . C A 46 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=60 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57566637 rs149265 C T 58555 PASS BCM.AC=513;DB;SEQUENOM.AC=505;SRC=VQSR+INTERSECTION;PQ=60 GT 1/1 1/1 0/1 0/1 0/1 1/1 . 1/1 1/1 1/1 1/1 . 0/1 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 . 1/1 . 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 . 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 . 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 . 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 +20 57653509 rs6026678 C T 489 PASS BCM.AC=4;DB;SEQUENOM.AC=4;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57728647 . C T 13 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 58308048 . A G 35 PASS BCM.AC=2;SEQUENOM.AC=4;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 58335635 . C T 7 PQ10 BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59211281 . A G 4.33 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=43 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59286435 . T C 5.69 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60262734 rs73915327 C A 576 PASS BCM.AC=10;DB;SEQUENOM.AC=10;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60291372 . A G 100 NOT_DESIGNED BCM.AC=21;SRC=2-OF-7-ONLY +20 60520698 . T C 428 NOT_DESIGNED SRC=VQSR-ONLY +20 60547414 . G T 10 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60560062 . C T 25 NOT_TYPED BCM.AC=343;SRC=VQSR-ONLY;PQ=50 +20 60578895 . G T 34 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7;PQ=52 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60641243 . G A 16 NOT_DESIGNED BCM.AC=150;SRC=VQSR+2-OF-7 +20 60641369 . G A 16 PASS BCM.AC=159;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=43 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60730826 . G A 11 AMBIGUOUS_SEQUENOM_CALLS BCM.AC=0;SEQUENOM.AC=0;SRC=VQSR-ONLY;PQ=60 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61206227 . C T 4.25 NOT_TYPED SRC=2-OF-7-ONLY;PQ=37 +20 61286252 rs13433258 C T 123 PASS BCM.AC=3;DB;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61497927 . A C 47 PQ10 BCM.AC=3;SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=9 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61766484 . G T 58 NOT_DESIGNED BCM.AC=157;SRC=VQSR+2-OF-7 +20 61788338 . C G 7 NOT_DESIGNED SRC=VQSR-ONLY +20 61830486 . G A 48 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62191452 rs113748232 C T 143 PASS BCM.AC=7;DB;SEQUENOM.AC=7;SRC=VQSR+INTERSECTION;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62462285 . G A 66 NOT_DESIGNED BCM.AC=304;SRC=VQSR+2-OF-7 +20 62480353 . T A 100 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY;PQ=11 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62724959 . G T 10 NOT_DESIGNED SRC=VQSR-ONLY +20 62888718 . T C 57 POLYMORPHIC_SAMPLES_FAILED BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=60 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62918298 . G A 33 NOT_DESIGNED SRC=VQSR+2-OF-7 +20 62961477 . T C 17 AMBIGUOUS_SEQUENOM_CALLS;PQ10 SEQUENOM.AC=0;SRC=VQSR+2-OF-7;PQ=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 diff --git a/tests/tabix_data/vcf/5.vcf b/tests/tabix_data/vcf/5.vcf new file mode 100644 index 0000000..a23ed89 --- /dev/null +++ b/tests/tabix_data/vcf/5.vcf @@ -0,0 +1,1000 @@ +##fileformat=VCFv4.0 +##fileDate=2011-07-18 +##source=Platypus_Version_0.1 +##platypusOptions={'bamFiles': ['/data/lindah/illumina_projects/rimmer_indels/AllData.bam'], 'labels': None, 'refFile': '/ib/groups/bsg/scratch/rimmer/Genomes/human_g1k_v37_ebv.fa', 'maxHaplotypes': 256, 'maxSize': 250, 'parseNCBI': 0, 'ploidy': 2, 'bufferSize': 1000000, 'nCPU': 1, 'minFlank': 3, 'minPosterior': 5, 'logFileName': 'log.txt', 'regions': ['20'], 'processRegionSize': 30000000, 'maxVariants': 8, 'maxReads': 5000000, 'genIndels': 1, 'minReads': 2, 'dataType': 'population', 'minMapQual': 20, 'rlen': 150, 'nInd': 1, 'getVariantsFromBAMs': 1, 'genSNPs': 1, 'strandFilter': 0, 'verbosity': 2, 'sourceFile': None, 'callOnlyIndels': 0, 'output': 'test.vcf', 'minBaseQual': 20} +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT AllData.bam +20 67500 . T TTGGTATCTAG . PASS FR=0.5;HP=2;NF=6;NR=2;PP=100.0;SC=CCTGATTTCCTTGGTATTAAA;TC=20;TR=8 GT:GL:GQ 0/1:-198.02,-21.47,-166.02:100 +20 69506 . G GAC,GACACAC . PASS FR=0.5,0.5;HP=1;NF=1,3;NR=1,0;PP=44.0,72.0;SC=TGGACACGTGGACACACACAC;TC=20;TR=2,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 70484 . CTCTT C . PASS FR=0.5;HP=2;NF=13;NR=3;PP=100.0;SC=GTCTATGTCTCTCTTTCTCTT;TC=31;TR=16 GT:GL:GQ 0/1:-189.04,-24.53,-147.47:100 +20 72104 . TA T . PASS FR=0.5;HP=4;NF=9;NR=10;PP=100.0;SC=TTTAAGTCTGTAAAACCATAC;TC=39;TR=19 GT:GL:GQ 0/1:-173.69,-34.04,-169.85:100 +20 74729 . G GT . PASS FR=0.5;HP=9;NF=4;NR=4;PP=100.0;SC=AAGTTTTTTGGTTTTTTTTTA;TC=29;TR=8 GT:GL:GQ 0/1:-83.86,-25.71,-59.16:100 +20 117309 . G GCAGGATTTCAT . PASS FR=0.5;HP=1;NF=4;NR=4;PP=100.0;SC=CAGGATTTCTGCAGGATTTCA;TC=25;TR=8 GT:GL:GQ 0/1:-259.57,-46.67,-146.18:100 +20 119645 . G GT . PASS FR=1.0;HP=5;NF=6;NR=5;PP=100.0;SC=TTGTTTGTTTGTTGTTGTTGT;TC=16;TR=11 GT:GL:GQ 1/1:-157.48,-18.84,-7.1:77 +20 120122 . A AAG . PASS FR=1.0;HP=6;NF=10;NR=8;PP=100.0;SC=ATAAAGAAAAAAATTTTAAAA;TC=27;TR=18 GT:GL:GQ 1/1:-266.98,-24.1,-5.49:100 +20 120750 . C CAATT . PASS FR=1.0;HP=6;NF=10;NR=10;PP=100.0;SC=TTTTATAAAACAATTGAGACT;TC=21;TR=20 GT:GL:GQ 1/1:-319.22,-18.71,-2.07:100 +20 122806 . T TTA . PASS FR=0.5;HP=2;NF=8;NR=7;PP=100.0;SC=CAGAAAAGAATTATATATATA;TC=29;TR=15 GT:GL:GQ 0/1:-181.3,-19.86,-96.14:100 +20 126155 . GCAAA G . PASS FR=0.5;HP=1;NF=5;NR=5;PP=100.0;SC=GCAATGTGCGGCAAACAAAGG;TC=32;TR=10 GT:GL:GQ 0/1:-122.73,-27.0,-209.16:100 +20 126310 . ACC A . PASS FR=0.5;HP=5;NF=3;NR=8;PP=100.0;SC=GATGGCTCCTACCCCCGTTTC;TC=26;TR=11 GT:GL:GQ 0/1:-153.97,-42.91,-110.82:100 +20 131505 . CTCT C . PASS FR=1.0;HP=2;NF=11;NR=11;PP=100.0;SC=TACTTGTGATCTCTTGTCTTT;TC=24;TR=22 GT:GL:GQ 1/1:-487.46,-251.24,-235.3:100 +20 131948 . C CCA . PASS FR=1.0;HP=1;NF=2;NR=11;PP=100.0;SC=TTATCTTACACCACACACACA;TC=27;TR=13 GT:GL:GQ 1/1:-201.6,-36.32,-23.94:100 +20 135116 . T TTTGCATTCACAGGAAGACTATAAATA . PASS FR=1.0;HP=2;NF=2;NR=1;PP=100.0;SC=TCTAGAGAAGTGCTCTCCAAT;TC=15;TR=3 GT:GL:GQ 1/1:-603.73,-461.77,-448.12:100 +20 135119 . TC T . PASS FR=1.0;HP=2;NF=2;NR=2;PP=100.0;SC=AGAGAAGTGCTCTCCAATAGA;TC=21;TR=4 GT:GL:GQ 1/1:-603.73,-576.89,-572.06:100 +20 137518 . GTA G . PASS FR=0.5005;HP=2;NF=5;NR=5;PP=100.0;SC=GTGTGTGTGTGTATATATATA;TC=21;TR=10 GT:GL:GQ 1/0:-210.61,-46.97,-32.7:29 +20 138178 . GC G . PASS FR=1.0;HP=3;NF=21;NR=5;PP=100.0;SC=CTTCTGGAAAGCCTGGCCATG;TC=29;TR=26 GT:GL:GQ 1/1:-267.55,-29.21,-9.21:100 +20 138570 . ATATGTGTGTG ATG,A . PASS FR=0.5,0.5;HP=2;NF=6,2;NR=9,2;PP=100.0,10.0;SC=TCAAATATATATATGTGTGTG;TC=28;TR=15,4 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:65 +20 140396 . TTTG T . PASS FR=1.0;HP=2;NF=15;NR=4;PP=100.0;SC=AGGTTTTTGCTTTGTTGTTGT;TC=34;TR=19 GT:GL:GQ 1/1:-246.82,-30.67,-15.42:100 +20 144832 . C CT . PASS FR=1.0;HP=3;NF=12;NR=22;PP=100.0;SC=TCCTAAAACTCTTGTAATATC;TC=35;TR=34 GT:GL:GQ 1/1:-541.89,-322.78,-299.72:100 +20 144884 . CCTT C . PASS FR=1.0;HP=1;NF=9;NR=16;PP=100.0;SC=TGTAATGACACCTTCTTTTTC;TC=29;TR=25 GT:GL:GQ 1/1:-590.4,-430.25,-411.02:100 +20 145257 . G GC . PASS FR=1.0;HP=2;NF=11;NR=8;PP=100.0;SC=ATGGTGGCAGGGCCTGTAATC;TC=21;TR=19 GT:GL:GQ 1/1:-258.74,-106.61,-91.83:100 +20 153298 . T TTC . PASS FR=1.0;HP=2;NF=13;NR=17;PP=100.0;SC=CAGGATTTCTTTGTTTTAAGA;TC=34;TR=30 GT:GL:GQ 1/1:-447.58,-228.67,-205.19:100 +20 160111 . A AT . PASS FR=1.0;HP=10;NF=8;NR=9;PP=100.0;SC=GAGCTCTTGAATTTTTTTTTT;TC=25;TR=17 GT:GL:GQ 1/1:-115.49,-38.32,-28.08:85 +20 163607 . A AAT . PASS FR=1.0;HP=2;NF=12;NR=14;PP=100.0;SC=ACATTAAATGATTCAAATGAT;TC=31;TR=26 GT:GL:GQ 1/1:-308.34,-35.98,-14.5:100 +20 163741 . T TACACAC . PASS FR=0.5243;HP=1;NF=13;NR=6;PP=100.0;SC=GAACCCTCTGTACACACACAC;TC=28;TR=19 GT:GL:GQ 0/1:-416.01,-75.48,-55.48:13 +20 164279 . G GAAAAC . PASS FR=0.5;HP=8;NF=1;NR=1;PP=100.0;SC=GAAAAGAAAAGAAAAGAAAAC;TC=34;TR=2 GT:GL:GQ 0/1:-492.01,-428.61,-448.28:100 +20 164284 . G GAAAAC,C . PASS FR=0.5,0.5;HP=8;NF=5,10;NR=11,9;PP=100.0,100.0;SC=GAAAAGAAAAGAAAACTCATC;TC=33;TR=16,19 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 176386 . CGTGTGT C . PASS FR=1.0;HP=2;NF=3;NR=2;PP=100.0;SC=TAATCCCATTCGTGTGTGTGT;TC=25;TR=5 GT:GL:GQ 1/1:-176.18,-68.1,-61.92:77 +20 179735 . TTAAAA T . PASS FR=0.5;HP=1;NF=4;NR=4;PP=100.0;SC=ACCTTTGATCTTAAAATAAAA;TC=27;TR=8 GT:GL:GQ 0/1:-142.0,-61.37,-164.64:100 +20 218255 . A AG . PASS FR=0.5;HP=1;NF=5;NR=3;PP=100.0;SC=TGCTCACTGCAATAAAAAGAA;TC=17;TR=8 GT:GL:GQ 0/1:-99.61,-20.66,-85.67:100 +20 222539 . C CA . PASS FR=0.5;HP=2;NF=1;NR=9;PP=100.0;SC=TACCCAGCTACTTCTCTTAAG;TC=31;TR=10 GT:GL:GQ 0/1:-113.51,-40.72,-197.06:100 +20 230058 . CAT C . PASS FR=0.5;HP=1;NF=6;NR=2;PP=100.0;SC=GACTCCATCTCATAAAAAAAA;TC=33;TR=8 GT:GL:GQ 0/1:-215.64,-148.07,-177.0:100 +20 236459 . G GAT . PASS FR=0.5001;HP=2;NF=1;NR=1;PP=100.0;SC=TTGGAATACAGATATATATAT;TC=14;TR=2 GT:GL:GQ 0/1:-82.0,-46.74,-54.25:35 +20 237649 . CAGAT C . PASS FR=0.5;HP=2;NF=1;NR=1;PP=79.0;SC=AGATAGATGACAGATAGATAG;TC=23;TR=2 GT:GL:GQ 0/1:-209.52,-180.44,-254.54:100 +20 237816 . A AT . PASS FR=0.5;HP=4;NF=4;NR=7;PP=100.0;SC=CATTTTCATCATTTTAATAAC;TC=32;TR=11 GT:GL:GQ 0/1:-124.3,-28.61,-145.84:100 +20 243223 . C CT . PASS FR=0.5;HP=1;NF=12;NR=4;PP=100.0;SC=ATCTGTGTGACTGTGATCAAA;TC=33;TR=16 GT:GL:GQ 0/1:-191.55,-34.68,-144.05:100 +20 246483 . T TTAAA . PASS FR=0.5;HP=1;NF=3;NR=4;PP=100.0;SC=AGACTCCATCTTAAATAAATA;TC=25;TR=7 GT:GL:GQ 0/1:-110.34,-17.05,-40.1:100 +20 251373 . ACTT A . PASS FR=0.5;HP=2;NF=1;NR=4;PP=100.0;SC=TTGCTCCAGCACTTCTTCTGG;TC=19;TR=5 GT:GL:GQ 0/1:-99.2,-52.91,-150.48:100 +20 271135 . G GC . PASS FR=1.0;HP=2;NF=3;NR=4;PP=100.0;SC=AAGACCGAGGGCGACCTCGAG;TC=16;TR=7 GT:GL:GQ 1/1:-163.65,-94.48,-85.08:78 +20 286648 . TAAATA T . PASS FR=0.5;HP=6;NF=5;NR=5;PP=100.0;SC=TCTAAATAAATAAATAAAAGG;TC=22;TR=10 GT:GL:GQ 0/1:-240.51,-100.72,-176.05:100 +20 299585 . AC A . PASS FR=1.0;HP=2;NF=4;NR=7;PP=21.0;SC=ACAGGGAGAGACCTTGTCGAA;TC=14;TR=11 GT:GL:GQ 1/1:-152.36,-140.91,-138.05:46 +20 334317 . TC T . PASS FR=1.0;HP=6;NF=9;NR=8;PP=100.0;SC=CCTGGATCCTTCCCCCCTTCT;TC=24;TR=17 GT:GL:GQ 1/1:-177.37,-48.79,-33.34:100 +20 337392 . ACC A . PASS FR=0.5;HP=6;NF=5;NR=1;PP=100.0;SC=CCTTGTTACCACCCCTCCCTG;TC=19;TR=6 GT:GL:GQ 0/1:-91.61,-45.67,-115.7:100 +20 340044 . GCAC G . PASS FR=0.5;HP=1;NF=2;NR=5;PP=100.0;SC=ATGAAGGCTGGCACCACCAGT;TC=22;TR=7 GT:GL:GQ 0/1:-122.54,-28.81,-115.11:100 +20 343323 . A ATG . PASS FR=0.5;HP=2;NF=8;NR=4;PP=100.0;SC=GATAAACAGGATGTCCACCAG;TC=23;TR=12 GT:GL:GQ 0/1:-150.99,-48.03,-125.5:100 +20 346702 . AGCCTCCCAAAGGAG A . PASS FR=0.5;HP=1;NF=4;NR=3;PP=100.0;SC=CACCCACCTCAGCCTCCCAAA;TC=17;TR=7 GT:GL:GQ 0/1:-191.1,-120.01,-173.49:100 +20 347858 . A AAAACAAAC . PASS FR=0.5;HP=4;NF=2;NR=1;PP=100.0;SC=TCCGTCTCCAAAAACAAACAA;TC=22;TR=3 GT:GL:GQ 0/1:-270.04,-201.07,-226.88:100 +20 347878 . A AAAAC . PASS FR=0.5;HP=3;NF=2;NR=1;PP=100.0;SC=AAAAAACAAAACAAACAAACA;TC=22;TR=3 GT:GL:GQ 0/1:-258.23,-262.98,-327.72:100 +20 348365 . G GT . PASS FR=0.5;HP=2;NF=5;NR=4;PP=100.0;SC=ACGGCCCATGGGATCGAATAG;TC=19;TR=9 GT:GL:GQ 0/1:-127.12,-35.07,-72.46:100 +20 349321 . ACT A . PASS FR=0.5;HP=3;NF=10;NR=3;PP=100.0;SC=CCAGGCCTCCACTCTCTGCTG;TC=20;TR=13 GT:GL:GQ 0/1:-183.61,-95.19,-129.48:100 +20 355549 . A AC . PASS FR=1.0;HP=10;NF=12;NR=9;PP=100.0;SC=AACAACAACAAAAAAAAAAAC;TC=24;TR=21 GT:GL:GQ 1/1:-171.74,-97.15,-84.12:100 +20 356670 . T TCAAA . PASS FR=0.5;HP=3;NF=4;NR=2;PP=100.0;SC=AGACACTGCCTCAAAAAAACA;TC=16;TR=6 GT:GL:GQ 0/1:-204.44,-131.78,-155.8:100 +20 356675 . A AAAAC . PASS FR=1.0;HP=6;NF=2;NR=3;PP=100.0;SC=CTGCCTCAAAAAAACAAACAA;TC=17;TR=5 GT:GL:GQ 1/1:-201.68,-85.68,-76.1:85 +20 358147 . CA C . PASS FR=1.0;HP=4;NF=10;NR=5;PP=100.0;SC=TGGGATTTGACAAACCCAGCT;TC=18;TR=15 GT:GL:GQ 1/1:-150.87,-32.16,-20.25:100 +20 360927 . TAA T . PASS FR=1.0;HP=7;NF=4;NR=7;PP=100.0;SC=ATGTGCTTTATAAAAAAGGGG;TC=18;TR=11 GT:GL:GQ 1/1:-185.94,-114.38,-104.3:84 +20 380790 . C CT . PASS FR=1.0;HP=3;NF=16;NR=12;PP=100.0;SC=CACCACACCCCGACCCTAATT;TC=32;TR=28 GT:GL:GQ 1/1:-323.67,-24.71,-1.84:100 +20 385989 . T TA . PASS FR=0.5;HP=7;NF=7;NR=4;PP=100.0;SC=AGATTTTTTTTAAAAAACTCT;TC=29;TR=11 GT:GL:GQ 0/1:-131.67,-23.75,-80.28:100 +20 386575 . GTTCT G . PASS FR=0.5;HP=3;NF=2;NR=3;PP=100.0;SC=TGATAAGAATGTTCTTTCTTT;TC=24;TR=5 GT:GL:GQ 0/1:-109.28,-29.71,-86.14:100 +20 387657 . G GA . PASS FR=1.0;HP=8;NF=13;NR=19;PP=100.0;SC=ATGCTGAGAAGAAAAAATGAA;TC=38;TR=32 GT:GL:GQ 1/1:-284.64,-52.81,-28.53:100 +20 396023 . A AAAAC . PASS FR=1.0;HP=4;NF=9;NR=9;PP=100.0;SC=AAAAAAAACAAAAACAAACAA;TC=25;TR=18 GT:GL:GQ 1/1:-279.26,-33.44,-17.73:100 +20 403158 . GA G . PASS FR=0.5;HP=2;NF=4;NR=7;PP=89.0;SC=ATCTATGAAGGAAGGACAGCA;TC=20;TR=11 GT:GL:GQ 0/1:-137.87,-107.23,-160.58:100 +20 405057 . A AC . PASS FR=0.5;HP=2;NF=5;NR=4;PP=100.0;SC=AAACACATACACAGACCTCCT;TC=25;TR=9 GT:GL:GQ 0/1:-136.78,-33.82,-124.47:100 +20 421805 . T TCCA . PASS FR=0.5;HP=2;NF=2;NR=4;PP=100.0;SC=AGAACACATTTCCAACTAAAC;TC=29;TR=6 GT:GL:GQ 0/1:-108.14,-30.52,-185.93:100 +20 425206 . GTTTT G . PASS FR=0.5;HP=7;NF=2;NR=7;PP=100.0;SC=TTGTTTGTTTGTTTTGTTTTT;TC=25;TR=9 GT:GL:GQ 0/1:-158.57,-21.01,-100.22:100 +20 430158 . GA G . PASS FR=0.5;HP=3;NF=2;NR=4;PP=100.0;SC=AGAGTCGCTTGAAACCCAGGA;TC=16;TR=6 GT:GL:GQ 0/1:-74.97,-35.93,-74.51:100 +20 434939 . G GA . PASS FR=0.5;HP=10;NF=6;NR=2;PP=100.0;SC=AAGAAAAAAGGAAAAAAAAAA;TC=22;TR=8 GT:GL:GQ 0/1:-99.4,-65.02,-85.64:92 +20 436981 . TTTCATCCA T . PASS FR=0.5;HP=2;NF=1;NR=2;PP=100.0;SC=AGGTGTGTCCTTTCATCCATT;TC=27;TR=3 GT:GL:GQ 0/1:-88.19,-26.08,-154.96:100 +20 525046 . G GT . PASS FR=0.5;HP=10;NF=5;NR=8;PP=100.0;SC=AAAATACAGTGTTTTTTTTTC;TC=33;TR=13 GT:GL:GQ 0/1:-160.44,-103.25,-141.37:100 +20 538639 . C CA . PASS FR=1.0;HP=9;NF=14;NR=9;PP=100.0;SC=ACCACCACAACAAAAAAACCC;TC=36;TR=23 GT:GL:GQ 1/1:-261.69,-66.02,-42.16:100 +20 539756 . G GT . PASS FR=0.5;HP=1;NF=6;NR=2;PP=100.0;SC=AATGTGAGCAGTCTAGGTAAA;TC=24;TR=8 GT:GL:GQ 0/1:-130.62,-70.51,-165.77:100 +20 540198 . T TG . PASS FR=1.0;HP=1;NF=9;NR=16;PP=100.0;SC=AGAGTCGCTGTTATTAAAACC;TC=26;TR=25 GT:GL:GQ 1/1:-262.05,-37.69,-19.11:100 +20 545849 . A AT . PASS FR=1.0;HP=9;NF=6;NR=13;PP=100.0;SC=CTCTGGACTGATTTTTTTTTA;TC=24;TR=19 GT:GL:GQ 1/1:-225.47,-140.74,-126.39:100 +20 555243 . C CT . PASS FR=0.5;HP=1;NF=3;NR=4;PP=100.0;SC=TTGGGGCCTCCTGGGTCCCAG;TC=23;TR=7 GT:GL:GQ 0/1:-124.01,-59.66,-144.99:100 +20 559298 . TACAC T . PASS FR=0.5081;HP=1;NF=1;NR=1;PP=100.0;SC=GGCACACATGTACACACACAC;TC=20;TR=2 GT:GL:GQ 0/1:-95.31,-59.31,-62.75:17 +20 570945 . A AACAC . PASS FR=1.0;HP=1;NF=7;NR=2;PP=100.0;SC=AGAAGGCAATAACACACACAC;TC=28;TR=9 GT:GL:GQ 1/1:-281.44,-73.27,-58.53:100 +20 576287 . T TTTA . PASS FR=1.0;HP=3;NF=2;NR=9;PP=100.0;SC=CTGGAAAAGTTTTATTATTAT;TC=26;TR=11 GT:GL:GQ 1/1:-188.46,-27.21,-14.74:100 +20 593205 . AG A . PASS FR=0.5;HP=6;NF=2;NR=2;PP=100.0;SC=GGGAGTGCGGAGGGGACTCCT;TC=14;TR=4 GT:GL:GQ 0/1:-90.79,-21.16,-46.9:100 +20 635817 . C CAGAAAAAAA . PASS FR=1.0;HP=1;NF=6;NR=7;PP=100.0;SC=GAGACTCTCTCAGAAAAAAAA;TC=23;TR=13 GT:GL:GQ 1/1:-318.1,-28.61,-13.35:100 +20 666340 . AAATAATAATAAT AAATAAT,A . PASS FR=0.5,0.5;HP=2;NF=1,2;NR=3,3;PP=100.0,100.0;SC=ATACAAATACAAATAATAATA;TC=16;TR=4,5 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 671463 . AGTGT A . PASS FR=1.0;HP=1;NF=6;NR=2;PP=100.0;SC=CATGCATGCAAGTGTGTGTGT;TC=25;TR=8 GT:GL:GQ 1/1:-248.41,-147.67,-140.04:63 +20 675799 . G GTA . PASS FR=0.5;HP=2;NF=7;NR=3;PP=100.0;SC=TAATGAACATGTATATATACA;TC=20;TR=10 GT:GL:GQ 0/1:-154.12,-35.67,-66.33:100 +20 704073 . CTCT C . PASS FR=0.5;HP=3;NF=3;NR=3;PP=100.0;SC=CTTCATTCTTCTCTTTTCTTT;TC=20;TR=6 GT:GL:GQ 0/1:-159.89,-91.96,-171.96:100 +20 704111 . C CTTTCT . PASS FR=0.5;HP=4;NF=2;NR=3;PP=100.0;SC=TTCCTCCTCTCTTTGTCTAGT;TC=20;TR=5 GT:GL:GQ 0/1:-189.74,-115.92,-237.08:100 +20 714136 . TA T . PASS FR=1.0;HP=2;NF=12;NR=13;PP=100.0;SC=CTGTGGTTGTTAACTGTAGTC;TC=30;TR=25 GT:GL:GQ 1/1:-253.68,-26.24,-6.67:100 +20 715254 . G GGT,GGTGTGT . PASS FR=0.5,0.5;HP=1;NF=3,4;NR=0,1;PP=57.0,100.0;SC=ATAGTTTATAGGTGTGTGTGT;TC=23;TR=3,5 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 715847 . C CA . PASS FR=1.0;HP=7;NF=10;NR=6;PP=100.0;SC=GGCTCCGTCTCAAAAAAATAA;TC=26;TR=16 GT:GL:GQ 1/1:-157.25,-40.0,-26.17:100 +20 718268 . A AAATAAT . PASS FR=0.5;HP=3;NF=1;NR=1;PP=81.0;SC=AAAAAATACAAAATAATAATA;TC=15;TR=2 GT:GL:GQ 0/1:-64.86,-29.69,-87.73:100 +20 724447 . A AG . PASS FR=0.5;HP=2;NF=12;NR=9;PP=100.0;SC=GGGTGTTGTGAGACTGATTGA;TC=42;TR=21 GT:GL:GQ 0/1:-229.53,-40.83,-188.06:100 +20 726275 . CAGA C . PASS FR=0.5;HP=3;NF=10;NR=10;PP=100.0;SC=ACATATATAACAGAAGGAGAG;TC=41;TR=20 GT:GL:GQ 0/1:-286.26,-52.94,-197.08:100 +20 728851 . CT C . PASS FR=0.5;HP=1;NF=5;NR=1;PP=21.0;SC=GATCACACCACTGCAGTCCAG;TC=22;TR=6 GT:GL:GQ 0/1:-200.76,-185.85,-212.48:67 +20 732117 . CTTTATTTTAT C . PASS FR=0.9998;HP=4;NF=1;NR=1;PP=80.0;SC=TCAGGTATGTCTTTATTTTAT;TC=14;TR=2 GT:GL:GQ 1/1:-96.6,-68.07,-66.69:34 +20 739616 . CGTGTGTGT C . PASS FR=1.0;HP=1;NF=4;NR=4;PP=100.0;SC=TAAAAGTGCTCGTGTGTGTGT;TC=20;TR=8 GT:GL:GQ 1/1:-222.59,-24.43,-16.81:63 +20 744662 . A ACAGGTCAAT . PASS FR=0.5;HP=1;NF=3;NR=4;PP=100.0;SC=AAAGGACAAGACAGATCCCTG;TC=16;TR=7 GT:GL:GQ 0/1:-105.45,-32.23,-150.03:100 +20 746855 . A AG . PASS FR=1.0;HP=1;NF=9;NR=5;PP=100.0;SC=CTGGGATTACAGTGTGAGCCA;TC=22;TR=14 GT:GL:GQ 1/1:-242.45,-177.27,-167.62:80 +20 747680 . A ATAG . PASS FR=0.5;HP=1;NF=3;NR=3;PP=100.0;SC=CTTGTTGGTAATAGCAAGTTA;TC=17;TR=6 GT:GL:GQ 0/1:-177.8,-96.72,-120.09:100 +20 755106 . C CA . PASS FR=1.0;HP=3;NF=7;NR=15;PP=100.0;SC=GCTGAGAGGTCAAACCACAAA;TC=27;TR=22 GT:GL:GQ 1/1:-255.81,-41.84,-23.33:100 +20 757564 . T TG . PASS FR=0.5;HP=3;NF=3;NR=1;PP=78.0;SC=GGTGGAGCCATGGGTGTCAAA;TC=10;TR=4 GT:GL:GQ 0/1:-67.44,-38.36,-58.29:89 +20 757919 . A AC . PASS FR=0.5;HP=9;NF=3;NR=9;PP=100.0;SC=AAAAAACAAAAAAAAAACACC;TC=27;TR=12 GT:GL:GQ 0/1:-172.2,-112.42,-144.61:100 +20 762893 . G GA . PASS FR=1.0;HP=6;NF=8;NR=9;PP=100.0;SC=TCTTGGGGGGGAAAAAATGGG;TC=24;TR=17 GT:GL:GQ 1/1:-215.19,-64.36,-48.0:100 +20 782496 . CAAATAAAT C . PASS FR=0.5;HP=3;NF=2;NR=1;PP=100.0;SC=GACTCTGCCTCAAATAAATAA;TC=17;TR=3 GT:GL:GQ 0/1:-87.5,-27.65,-92.5:100 +20 786252 . AAG A . PASS FR=1.0;HP=5;NF=4;NR=13;PP=100.0;SC=TTAATTAAAAAAGATATTGCA;TC=19;TR=17 GT:GL:GQ 1/1:-216.25,-31.31,-17.45:100 +20 786764 . T TA . PASS FR=1.0;HP=3;NF=17;NR=12;PP=100.0;SC=ACTATATATATAATATATTTT;TC=33;TR=29 GT:GL:GQ 1/1:-388.27,-147.23,-125.36:100 +20 787870 . T TTTTATTTATTTATTTATTTA . PASS FR=1.0;HP=3;NF=2;NR=1;PP=100.0;SC=ATATCAAGCATTTTATTTATT;TC=19;TR=3 GT:GL:GQ 1/1:-317.88,-65.36,-53.59:99 +20 787893 . T TATTTATTTA . PASS FR=0.5;HP=4;NF=1;NR=1;PP=100.0;SC=TTTATTTATTTTTGAGATGGA;TC=20;TR=2 GT:GL:GQ 0/1:-356.98,-227.18,-263.76:5 +20 789767 . T TA . PASS FR=1.0;HP=10;NF=8;NR=5;PP=100.0;SC=CAAAGCCAATTAAAAAAAAAA;TC=29;TR=13 GT:GL:GQ 1/1:-124.57,-44.47,-30.25:100 +20 795148 . T TTTTA . PASS FR=1.0;HP=4;NF=9;NR=1;PP=100.0;SC=ATAAGTTTATTTTTATTTATT;TC=16;TR=10 GT:GL:GQ 1/1:-136.44,-12.46,-4.83:63 +20 797336 . GA G . PASS FR=1.0;HP=10;NF=18;NR=11;PP=100.0;SC=CCATTTATGTGAAAAAAAAAA;TC=35;TR=29 GT:GL:GQ 1/1:-156.82,-42.02,-20.72:100 +20 801157 . T TTTC . PASS FR=1.0;HP=6;NF=1;NR=6;PP=100.0;SC=CTTCTCTTTCTTTTTTTCTTT;TC=13;TR=7 GT:GL:GQ 1/1:-142.57,-41.24,-32.92:92 +20 825082 . TGCCCAGGTC T . PASS FR=0.5;HP=1;NF=5;NR=1;PP=100.0;SC=CTGCTCAGGTTGCCCAGGTCG;TC=8;TR=6 GT:GL:GQ 1/0:-180.72,-60.67,-71.61:61 +20 833239 . ACT A . PASS FR=0.5;HP=1;NF=3;NR=5;PP=100.0;SC=GGAGAAATAGACTCTCTCTCT;TC=21;TR=8 GT:GL:GQ 0/1:-96.13,-31.34,-89.12:100 +20 835500 . TTGTG T . PASS FR=1.0;HP=2;NF=8;NR=2;PP=100.0;SC=GTGTTTGTGTTTGTGTGTGTG;TC=29;TR=10 GT:GL:GQ 1/1:-258.26,-62.01,-52.79:77 +20 855678 . TC T . PASS FR=0.5;HP=2;NF=3;NR=5;PP=100.0;SC=TCTTTTTCTTTCTTTTTTTTC;TC=28;TR=8 GT:GL:GQ 0/1:-124.38,-62.93,-124.85:100 +20 860945 . A AG . PASS FR=0.5;HP=6;NF=2;NR=6;PP=100.0;SC=GTATATTAAGAGGGGGTGAAA;TC=23;TR=8 GT:GL:GQ 0/1:-96.52,-33.16,-85.46:100 +20 863148 . C CTAT . PASS FR=0.5;HP=2;NF=3;NR=12;PP=100.0;SC=CCAGAGAAGGCTATTGCTCTC;TC=37;TR=15 GT:GL:GQ 0/1:-223.19,-48.7,-208.9:100 +20 899789 . CTCTT C . PASS FR=0.5;HP=3;NF=1;NR=3;PP=100.0;SC=TTTCCTTCTTCTCTTTCTTTC;TC=21;TR=4 GT:GL:GQ 0/1:-62.34,-23.94,-85.48:100 +20 900698 . T TC . PASS FR=1.0;HP=4;NF=11;NR=5;PP=100.0;SC=AGGAAGGCAGTCCCCTTTCCT;TC=29;TR=16 GT:GL:GQ 1/1:-292.54,-113.13,-95.49:100 +20 902060 . T TG,G . PASS FR=0.5,0.5;HP=5;NF=2,7;NR=2,4;PP=100.0,100.0;SC=TTGACTGCCCTCCTCCACTTT;TC=19;TR=4,11 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 909945 . TTATGG TTGG,T . PASS FR=0.5,0.5;HP=2;NF=10,8;NR=5,5;PP=100.0,100.0;SC=TTAGTTTAGTTTATGGTATCC;TC=32;TR=15,13 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 913303 . A AT . PASS FR=1.0;HP=10;NF=9;NR=4;PP=100.0;SC=AGATTTAAAGATTTTTTTTTT;TC=21;TR=13 GT:GL:GQ 1/1:-227.97,-180.37,-171.35:75 +20 922916 . A AT . PASS FR=1.0;HP=6;NF=2;NR=1;PP=27.0;SC=TTATTTATTTATTTATTTTTT;TC=7;TR=3 GT:GL:GQ 1/1:-68.71,-54.63,-52.11:41 +20 933970 . GTTAT G . PASS FR=1.0;HP=4;NF=5;NR=5;PP=100.0;SC=CAGGCTAATTGTTATTTATTT;TC=24;TR=10 GT:GL:GQ 1/1:-169.08,-10.86,-0.46:87 +20 934153 . A AT . PASS FR=1.0;HP=7;NF=4;NR=5;PP=100.0;SC=ATTTTTTTGTATTTTTTAATA;TC=11;TR=9 GT:GL:GQ 1/1:-123.08,-66.05,-59.03:57 +20 945474 . CAT C . PASS FR=1.0;HP=2;NF=2;NR=6;PP=100.0;SC=CACACACACACATATATATAT;TC=31;TR=8 GT:GL:GQ 1/1:-229.9,-58.37,-41.73:100 +20 954102 . A ATTGT . PASS FR=0.5;HP=6;NF=4;NR=1;PP=100.0;SC=TGTTTGTTTTATTGTTTGTTT;TC=30;TR=5 GT:GL:GQ 0/1:-77.28,-28.19,-134.91:100 +20 972071 . A AT . PASS FR=0.5;HP=8;NF=7;NR=5;PP=100.0;SC=ATTAAAAAAGATTTTTTTTGT;TC=27;TR=12 GT:GL:GQ 0/1:-76.99,-19.47,-57.49:100 +20 995685 . CAAAT C . PASS FR=1.0;HP=3;NF=3;NR=2;PP=100.0;SC=AACTCTATCTCAAATAAATAA;TC=15;TR=5 GT:GL:GQ 1/1:-96.06,-12.82,-6.68:77 +20 1000562 . TTTCA T . PASS FR=0.5;HP=2;NF=10;NR=1;PP=100.0;SC=TCACCCTTTCTTTCATTCACT;TC=23;TR=11 GT:GL:GQ 0/1:-127.76,-31.92,-110.25:100 +20 1005659 . CTCAG C . PASS FR=1.0;HP=3;NF=15;NR=6;PP=100.0;SC=AACAAACAAACTCAGTCTGTC;TC=34;TR=21 GT:GL:GQ 1/1:-379.32,-49.71,-26.34:100 +20 1018266 . CAAT C . PASS FR=1.0;HP=4;NF=10;NR=7;PP=100.0;SC=GAAGTAACAACAATAATAATA;TC=26;TR=17 GT:GL:GQ 1/1:-307.78,-61.51,-42.82:100 +20 1023817 . C CCCT . PASS FR=1.0;HP=3;NF=7;NR=3;PP=100.0;SC=CAGTGCCCACCCCTCCTCTCC;TC=22;TR=10 GT:GL:GQ 1/1:-230.45,-50.55,-37.14:100 +20 1024121 . A AT . PASS FR=1.0;HP=6;NF=5;NR=3;PP=100.0;SC=CGGGTCAGGCATTTTTTATCA;TC=16;TR=8 GT:GL:GQ 1/1:-95.55,-28.09,-20.26:65 +20 1042261 . CCCTG C . PASS FR=1.0;HP=2;NF=10;NR=10;PP=100.0;SC=CCAAACCCAACCCTGCCTGGC;TC=25;TR=20 GT:GL:GQ 1/1:-365.29,-133.94,-117.57:100 +20 1050585 . AT A . PASS FR=1.0;HP=10;NF=9;NR=15;PP=100.0;SC=TTCTAATTCCATTTTTTTTTT;TC=33;TR=24 GT:GL:GQ 1/1:-288.37,-205.98,-189.27:100 +20 1059991 . G GAATT . PASS FR=1.0;HP=2;NF=10;NR=6;PP=100.0;SC=AACATTTGTTGAATTAATTAA;TC=25;TR=16 GT:GL:GQ 1/1:-290.89,-32.75,-16.81:100 +20 1072882 . CAG C . PASS FR=0.5;HP=6;NF=5;NR=6;PP=100.0;SC=ATCAGAAAAACAGAGACCACA;TC=23;TR=11 GT:GL:GQ 0/1:-124.42,-26.5,-135.46:100 +20 1084744 . TG T . PASS FR=1.0;HP=5;NF=9;NR=12;PP=100.0;SC=ACCATAAATGTGGGGCTACTG;TC=23;TR=21 GT:GL:GQ 1/1:-326.86,-192.89,-179.07:100 +20 1100621 . TAG T . PASS FR=0.5;HP=4;NF=6;NR=3;PP=100.0;SC=GCTTCTCAAATAGAGTCTTAA;TC=23;TR=9 GT:GL:GQ 0/1:-166.5,-71.13,-124.84:100 +20 1105206 . C CAT . PASS FR=1.0;HP=1;NF=15;NR=11;PP=100.0;SC=AATTTATCCACGTGTACCAGA;TC=32;TR=26 GT:GL:GQ 1/1:-427.57,-192.92,-171.28:100 +20 1114638 . C CTCTT . PASS FR=1.0;HP=4;NF=9;NR=17;PP=100.0;SC=TGTGTCCTCTCTTTGTATTTG;TC=34;TR=26 GT:GL:GQ 1/1:-420.88,-72.2,-49.92:100 +20 1118278 . GAA G . PASS FR=1.0;HP=5;NF=13;NR=8;PP=100.0;SC=AGAAAAGGGAGAAAAGGAGGC;TC=24;TR=21 GT:GL:GQ 1/1:-206.9,-16.17,-0.92:100 +20 1127807 . TCATCATCATCATCAC T . PASS FR=0.5;HP=1;NF=2;NR=3;PP=100.0;SC=ATCATCATCATCATCATCATC;TC=18;TR=5 GT:GL:GQ 1/0:-246.11,-143.41,-171.3:100 +20 1133620 . GC G . PASS FR=1.0;HP=3;NF=17;NR=8;PP=100.0;SC=TAAGGACCAAGCCCTGTTTAT;TC=28;TR=25 GT:GL:GQ 1/1:-266.52,-52.99,-34.3:100 +20 1162839 . AG A . PASS FR=0.5;HP=10;NF=1;NR=6;PP=100.0;SC=GGGGTGGGGGAGGGGGTAGAA;TC=27;TR=7 GT:GL:GQ 0/1:-154.34,-117.72,-158.43:100 +20 1165265 . TACAC T . PASS FR=1.0;HP=1;NF=2;NR=1;PP=100.0;SC=CACACGCGCGTACACACACAC;TC=13;TR=3 GT:GL:GQ 1/1:-65.7,-24.93,-20.64:52 +20 1168799 . T TAC . PASS FR=0.5;HP=3;NF=1;NR=3;PP=100.0;SC=ATATATATAATACACACACAC;TC=33;TR=4 GT:GL:GQ 0/1:-146.28,-74.63,-149.77:100 +20 1194678 . A AT . PASS FR=1.0;HP=8;NF=13;NR=12;PP=100.0;SC=TACAAGATTAATTTTTTTTGT;TC=37;TR=25 GT:GL:GQ 1/1:-428.37,-300.25,-279.55:89 +20 1195705 . AAAG A . PASS FR=1.0;HP=2;NF=10;NR=12;PP=100.0;SC=AGAGATGGCCAAAGAAGACAT;TC=27;TR=22 GT:GL:GQ 1/1:-481.8,-237.54,-219.64:100 +20 1200593 . GA G . PASS FR=0.5;HP=5;NF=7;NR=5;PP=100.0;SC=TTTTTTAAAAGATCAACAAAA;TC=31;TR=12 GT:GL:GQ 0/1:-291.7,-258.36,-302.47:100 +20 1202056 . C CT . PASS FR=0.5;HP=6;NF=2;NR=1;PP=73.0;SC=TTCTTTCTTTCTTTCTTTCTT;TC=17;TR=3 GT:GL:GQ 0/1:-78.02,-50.24,-96.3:100 +20 1217230 . C CT . PASS FR=0.5;HP=3;NF=6;NR=7;PP=100.0;SC=TGAATCTGAACTTTCTCTATT;TC=29;TR=13 GT:GL:GQ 0/1:-136.34,-37.11,-139.78:100 +20 1238533 . TATC T . PASS FR=0.5;HP=1;NF=6;NR=8;PP=100.0;SC=ATTCCCTTATTATCCTTTTAA;TC=32;TR=14 GT:GL:GQ 0/1:-203.0,-27.66,-145.09:100 +20 1258183 . GTGTC G . PASS FR=0.5;HP=2;NF=9;NR=7;PP=100.0;SC=CTGTGCATGTGTGTCTGTGTG;TC=40;TR=16 GT:GL:GQ 0/1:-393.66,-270.04,-334.02:100 +20 1258199 . C CTG . PASS FR=1.0;HP=2;NF=10;NR=8;PP=100.0;SC=GTGTGTGTATCTGTGTGTGTG;TC=39;TR=18 GT:GL:GQ 1/1:-443.43,-273.82,-255.93:100 +20 1258268 . C CTG . PASS FR=1.0;HP=1;NF=14;NR=7;PP=100.0;SC=GTATGTGTGCCTGTGTGTGTG;TC=36;TR=21 GT:GL:GQ 1/1:-385.28,-210.98,-205.13:73 +20 1258437 . GTGTGCCTGTGTGTGTC G . PASS FR=0.5;HP=2;NF=3;NR=4;PP=100.0;SC=GCCTGTGTATGTGTGCCTGTG;TC=40;TR=7 GT:GL:GQ 0/1:-300.85,-170.75,-363.46:100 +20 1258704 . C CTGTT . PASS FR=0.5;HP=2;NF=6;NR=3;PP=100.0;SC=GTGTGTGTGTCTGTGTGTGTA;TC=34;TR=9 GT:GL:GQ 0/1:-182.12,-58.28,-233.67:100 +20 1270442 . CA C . PASS FR=1.0;HP=2;NF=5;NR=12;PP=100.0;SC=CACTGCACTCCAAGCCTAGGT;TC=17;TR=17 GT:GL:GQ 1/1:-162.61,-26.2,-14.46:98 +20 1272295 . CTCTGT C . PASS FR=1.0;HP=1;NF=13;NR=7;PP=100.0;SC=CCAAGTTCTGCTCTGTTGATT;TC=25;TR=20 GT:GL:GQ 1/1:-389.78,-103.27,-85.17:100 +20 1272815 . C CATAG . PASS FR=1.0;HP=2;NF=11;NR=10;PP=100.0;SC=TAGTCTAAGGCATAGCATCCT;TC=27;TR=21 GT:GL:GQ 1/1:-368.78,-50.48,-32.46:100 +20 1291149 . GCAA G . PASS FR=0.5;HP=1;NF=2;NR=3;PP=100.0;SC=CCTGGATACAGCAACAACAGT;TC=25;TR=5 GT:GL:GQ 0/1:-151.35,-93.7,-185.23:100 +20 1292033 . C CTTGT . PASS FR=0.5;HP=2;NF=7;NR=5;PP=100.0;SC=CTTACATTTGCTTGTTTGATA;TC=29;TR=12 GT:GL:GQ 0/1:-444.32,-314.49,-337.3:100 +20 1292718 . GT G . PASS FR=1.0;HP=8;NF=9;NR=3;PP=100.0;SC=TAATTTTTTAGTTTTTTTTGT;TC=17;TR=12 GT:GL:GQ 1/1:-140.26,-85.11,-76.3:73 +20 1292776 . T TA . PASS FR=1.0;HP=1;NF=14;NR=10;PP=100.0;SC=CTCCTGGACTTAGTGATCCTC;TC=25;TR=24 GT:GL:GQ 1/1:-310.19,-119.02,-102.21:100 +20 1303648 . A AG . PASS FR=0.5;HP=4;NF=6;NR=2;PP=100.0;SC=GGCAACACTCACCCGGCTGAG;TC=19;TR=8 GT:GL:GQ 0/1:-115.57,-32.83,-76.0:100 +20 1312294 . A AT . PASS FR=1.0;HP=7;NF=5;NR=6;PP=100.0;SC=CACCTGGCTAATTTTTTTATT;TC=17;TR=11 GT:GL:GQ 1/1:-196.82,-109.27,-98.21:93 +20 1318554 . TCCCACAGAGAAGTCC T . PASS FR=1.0;HP=3;NF=5;NR=4;PP=100.0;SC=ACCTAAGCATTCCCACAGAGA;TC=12;TR=9 GT:GL:GQ 1/1:-228.16,-15.45,-7.14:62 +20 1322791 . G GCACACA,GCACACACA . PASS FR=0.5,0.5;HP=1;NF=3,3;NR=0,4;PP=43.0,100.0;SC=GAGAACAAATGCACACACACA;TC=18;TR=3,7 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 1333430 . C CT . PASS FR=1.0;HP=2;NF=18;NR=9;PP=100.0;SC=ATGAAGGTGACTTCTCAGGTG;TC=32;TR=27 GT:GL:GQ 1/1:-276.34,-27.55,-7.09:100 +20 1342649 . AT A . PASS FR=1.0;HP=6;NF=17;NR=10;PP=100.0;SC=AGTGTATGAGATTTTTTGTTA;TC=29;TR=27 GT:GL:GQ 1/1:-209.72,-24.22,-4.14:100 +20 1349439 . C CCCT . PASS FR=0.5;HP=4;NF=2;NR=6;PP=100.0;SC=CCCACATTCCCCCTCCTCTGA;TC=22;TR=8 GT:GL:GQ 0/1:-157.47,-56.31,-133.86:100 +20 1358694 . C CAGTTTGGGCACTAACACCTACTT . PASS FR=0.5;HP=1;NF=4;NR=1;PP=100.0;SC=CTATACGGGTCAGTTTGGGCA;TC=19;TR=5 GT:GL:GQ 0/1:-272.45,-105.91,-212.24:100 +20 1364390 . G GA . PASS FR=1.0;HP=2;NF=9;NR=6;PP=100.0;SC=GATCAAGTGGGAGATCACTTG;TC=25;TR=15 GT:GL:GQ 1/1:-334.68,-154.31,-139.66:100 +20 1369478 . CG C . PASS FR=0.5;HP=2;NF=7;NR=4;PP=100.0;SC=TAAAAACCAACGAGGCTCCAC;TC=23;TR=11 GT:GL:GQ 0/1:-184.87,-113.86,-180.77:100 +20 1372404 . GA G . PASS FR=1.0;HP=7;NF=8;NR=5;PP=100.0;SC=GAGGGAGTGGGAAAAAAAGAG;TC=17;TR=13 GT:GL:GQ 1/1:-147.21,-77.38,-68.31:75 +20 1379453 . C CTG . PASS FR=1.0;HP=2;NF=4;NR=11;PP=100.0;SC=TGCCAGGACTCTCCTCGCTGT;TC=19;TR=15 GT:GL:GQ 1/1:-192.19,-47.83,-35.2:100 +20 1381135 . AG A . PASS FR=0.5;HP=2;NF=3;NR=5;PP=100.0;SC=CTTGAGGACAAGGCATTATAG;TC=26;TR=8 GT:GL:GQ 0/1:-99.07,-46.56,-212.4:100 +20 1386382 . AGAG A . PASS FR=0.5;HP=3;NF=7;NR=1;PP=100.0;SC=ACTAATTAAAAGAGAACCCTG;TC=26;TR=8 GT:GL:GQ 0/1:-184.22,-117.09,-276.56:100 +20 1389225 . CGTGTGT C . PASS FR=1.0;HP=1;NF=1;NR=1;PP=100.0;SC=TATGAAGACTCGTGTGTGTGT;TC=12;TR=2 GT:GL:GQ 1/1:-80.8,-37.12,-33.18:48 +20 1392633 . AT A . PASS FR=0.5;HP=9;NF=8;NR=5;PP=100.0;SC=AAGCCAACACATTTTTTTTTC;TC=29;TR=13 GT:GL:GQ 0/1:-142.17,-103.31,-156.4:100 +20 1399660 . A AAAAAC . PASS FR=0.5;HP=2;NF=1;NR=7;PP=100.0;SC=TGTTTATGTTAGAAACAAAAC;TC=28;TR=8 GT:GL:GQ 0/1:-237.24,-123.87,-245.2:100 +20 1401887 . T TC . PASS FR=0.5;HP=6;NF=3;NR=5;PP=100.0;SC=TGACTTTTTTTCTCCCTGAGA;TC=26;TR=8 GT:GL:GQ 0/1:-140.81,-26.64,-103.7:100 +20 1403888 . G GT . PASS FR=0.5;HP=1;NF=3;NR=5;PP=100.0;SC=CAGAGAGGGCGTAAGATTGGA;TC=18;TR=8 GT:GL:GQ 0/1:-134.33,-94.6,-144.84:100 +20 1411174 . G GT . PASS FR=1.0;HP=1;NF=14;NR=18;PP=100.0;SC=TTCCAACAGTGACAAGGGTTT;TC=34;TR=32 GT:GL:GQ 1/1:-370.91,-42.86,-18.85:100 +20 1411544 . TG T . PASS FR=0.5;HP=4;NF=7;NR=2;PP=36.0;SC=ATTTATAAAATGTTTTTGTTG;TC=28;TR=9 GT:GL:GQ 0/1:-275.92,-257.59,-310.84:82 +20 1420200 . CT C . PASS FR=1.0;HP=2;NF=13;NR=7;PP=100.0;SC=AAGATGGAACCTTAAGTTCAA;TC=24;TR=20 GT:GL:GQ 1/1:-229.24,-45.08,-29.19:100 +20 1421627 . GC G . PASS FR=1.0;HP=4;NF=12;NR=6;PP=100.0;SC=GGAGCCCAACGCCCATTTAAA;TC=24;TR=18 GT:GL:GQ 1/1:-219.35,-32.03,-15.65:100 +20 1428402 . A ATCTAT . PASS FR=0.5;HP=2;NF=6;NR=3;PP=100.0;SC=AATAGCTGATATCAGTTAAGG;TC=30;TR=9 GT:GL:GQ 0/1:-414.87,-348.43,-419.1:100 +20 1428454 . TC T . PASS FR=0.5;HP=2;NF=11;NR=7;PP=100.0;SC=TTACACCGACTCTGTGCAGGT;TC=37;TR=18 GT:GL:GQ 0/1:-456.05,-415.06,-465.1:100 +20 1448428 . AC A . PASS FR=1.0;HP=2;NF=12;NR=6;PP=100.0;SC=ACGGTAAACAACCTTCCCGCG;TC=21;TR=18 GT:GL:GQ 1/1:-289.43,-190.83,-179.1:98 +20 1450561 . A AAATAAT . PASS FR=1.0;HP=8;NF=6;NR=4;PP=100.0;SC=CTGTCTCAAAAAAAAATAATA;TC=23;TR=10 GT:GL:GQ 1/1:-324.02,-170.06,-160.02:94 +20 1454025 . GCACACACGCA G . PASS FR=1.0;HP=1;NF=5;NR=3;PP=100.0;SC=ACGCACACATGCACACACGCA;TC=23;TR=8 GT:GL:GQ 1/1:-298.98,-49.31,-43.52:72 +20 1455718 . AC A . PASS FR=0.5;HP=8;NF=5;NR=3;PP=100.0;SC=TGGTGGTAGCACCCCCCCAGG;TC=26;TR=8 GT:GL:GQ 0/1:-122.23,-68.33,-113.23:100 +20 1466298 . C CCA . PASS FR=0.5;HP=1;NF=3;NR=2;PP=100.0;SC=CACACACACACCACACACACA;TC=25;TR=5 GT:GL:GQ 0/1:-174.97,-31.68,-40.82:42 +20 1470727 . TG T . PASS FR=1.0;HP=4;NF=9;NR=10;PP=100.0;SC=CAACAATCATTGGGGAATATT;TC=24;TR=19 GT:GL:GQ 1/1:-243.08,-66.7,-50.7:100 +20 1473489 . ATAATT A . PASS FR=0.5;HP=2;NF=13;NR=9;PP=100.0;SC=TTACTTACAAATAATTTTATT;TC=35;TR=22 GT:GL:GQ 0/1:-297.03,-26.79,-121.41:100 +20 1475430 . C CTCT . PASS FR=0.5;HP=3;NF=5;NR=7;PP=100.0;SC=CTCATTTCTTCTCTTTTCATT;TC=31;TR=12 GT:GL:GQ 0/1:-179.5,-26.21,-143.42:100 +20 1477952 . AGTCTACACGT A . PASS FR=0.5;HP=1;NF=1;NR=2;PP=100.0;SC=TTGTCTTTTCAGTCTACACGT;TC=26;TR=3 GT:GL:GQ 0/1:-132.31,-83.49,-272.8:100 +20 1485444 . TGAGAGAGA T . PASS FR=0.5;HP=2;NF=1;NR=2;PP=100.0;SC=TGTGTGTGTGTGAGAGAGAGA;TC=17;TR=3 GT:GL:GQ 1/0:-294.27,-239.82,-244.87:100 +20 1498426 . G GA . PASS FR=1.0;HP=6;NF=18;NR=13;PP=100.0;SC=TACAACGGAAGAAAAGCCTAA;TC=33;TR=31 GT:GL:GQ 1/1:-335.62,-79.86,-57.15:100 +20 1499276 . TGAGA T . PASS FR=0.5;HP=2;NF=4;NR=2;PP=100.0;SC=TCAAAGTGAATGAGAGAGAGG;TC=23;TR=6 GT:GL:GQ 0/1:-190.39,-128.87,-245.46:100 +20 1500650 . A AG . PASS FR=1.0;HP=1;NF=9;NR=8;PP=100.0;SC=AAGGAGCAGCAGTTCTGAGAG;TC=19;TR=17 GT:GL:GQ 1/1:-187.24,-32.97,-19.25:100 +20 1510246 . CA C . PASS FR=1.0;HP=10;NF=15;NR=6;PP=100.0;SC=AACTCTGTCTCAAAAAAAAAA;TC=29;TR=21 GT:GL:GQ 1/1:-113.89,-25.37,-8.27:100 +20 1510966 . C CTA . PASS FR=1.0;HP=2;NF=10;NR=3;PP=100.0;SC=TTTTATCTCTCTGTGTCATTT;TC=21;TR=13 GT:GL:GQ 1/1:-215.34,-14.55,0.0:100 +20 1512623 . TTGTC T . PASS FR=0.5;HP=1;NF=2;NR=7;PP=100.0;SC=ACTCCATAGATTGTCTGGGTA;TC=27;TR=9 GT:GL:GQ 0/1:-204.17,-64.36,-220.46:100 +20 1516154 . A AAG . PASS FR=0.5;HP=1;NF=9;NR=1;PP=100.0;SC=GTTTTATAAGAAGAGAGAGAG;TC=28;TR=10 GT:GL:GQ 0/1:-197.81,-103.51,-159.44:100 +20 1524117 . G GTGA . PASS FR=1.0;HP=2;NF=12;NR=14;PP=100.0;SC=TGGGATCAGGGTATTCCCTTC;TC=27;TR=26 GT:GL:GQ 1/1:-368.49,-35.51,-15.43:100 +20 1525024 . CT C . PASS FR=0.5;HP=7;NF=3;NR=3;PP=96.0;SC=CCTTCTTTGTCTTTTTTGATC;TC=18;TR=6 GT:GL:GQ 0/1:-53.12,-20.94,-98.55:100 +20 1525853 . G GT . PASS FR=0.5;HP=5;NF=7;NR=4;PP=100.0;SC=CCTGAAGTGTGTTTTCCAACT;TC=29;TR=11 GT:GL:GQ 0/1:-133.05,-52.13,-148.67:100 +20 1597255 . TG T . PASS FR=0.5;HP=2;NF=13;NR=3;PP=100.0;SC=GTAAAAGTACTGGAAGAAAAG;TC=39;TR=16 GT:GL:GQ 0/1:-269.31,-182.14,-334.79:100 +20 1627288 . ATTTGT A . PASS FR=0.5;HP=3;NF=4;NR=2;PP=100.0;SC=ACTTTTTTTCATTTGTTTTGT;TC=20;TR=6 GT:GL:GQ 0/1:-133.15,-70.66,-175.26:100 +20 1629280 . T TAATAAAATAA . PASS FR=0.5;HP=3;NF=1;NR=4;PP=100.0;SC=ACTTAAAGTATAATAAAATAA;TC=18;TR=5 GT:GL:GQ 0/1:-155.63,-27.66,-95.67:100 +20 1648829 . CTTTCTTTTTCTTTTCT C . PASS FR=0.5;HP=6;NF=1;NR=1;PP=74.0;SC=TTCTTTCTTTCTTTCTTTTTC;TC=20;TR=2 GT:GL:GQ 0/1:-191.4,-160.88,-232.59:100 +20 1653387 . T TTTG . PASS FR=0.5;HP=2;NF=2;NR=7;PP=100.0;SC=CGGCCAATCATTTGTTGTTGT;TC=25;TR=9 GT:GL:GQ 0/1:-189.9,-54.75,-106.65:100 +20 1656519 . GT G . PASS FR=0.5;HP=9;NF=4;NR=5;PP=100.0;SC=GAGCTGCACTGTTTTTTTTCT;TC=20;TR=9 GT:GL:GQ 0/1:-62.34,-19.97,-47.7:100 +20 1658890 . ACT A . PASS FR=0.5;HP=2;NF=6;NR=2;PP=100.0;SC=CATGTGATACACTGTGGGCCC;TC=27;TR=8 GT:GL:GQ 0/1:-198.65,-163.08,-324.51:100 +20 1660493 . AT A . PASS FR=0.5;HP=1;NF=6;NR=5;PP=100.0;SC=CATTTGGGAGATGCTATTACC;TC=31;TR=11 GT:GL:GQ 0/1:-160.86,-59.8,-177.36:100 +20 1661355 . TG T . PASS FR=0.5;HP=1;NF=6;NR=7;PP=100.0;SC=GAAAAACACATGATTATCCAT;TC=34;TR=13 GT:GL:GQ 0/1:-171.31,-99.84,-269.81:100 +20 1661478 . G GT . PASS FR=0.5;HP=9;NF=7;NR=5;PP=100.0;SC=ATACTTTCTTGTTTTTTTGGC;TC=35;TR=12 GT:GL:GQ 0/1:-150.06,-61.16,-108.32:100 +20 1661816 . C CA . PASS FR=0.5;HP=1;NF=1;NR=6;PP=100.0;SC=AATTTGCAATCATACAGAAAG;TC=24;TR=7 GT:GL:GQ 0/1:-96.53,-29.07,-136.56:100 +20 1662592 . GATATAACTA G . PASS FR=0.5;HP=1;NF=4;NR=5;PP=100.0;SC=TATGGATATGGATATAACTAA;TC=23;TR=9 GT:GL:GQ 0/1:-238.09,-62.84,-220.35:100 +20 1665050 . A ATG . PASS FR=0.5;HP=2;NF=6;NR=6;PP=100.0;SC=ATACACACATATATATATGTA;TC=34;TR=12 GT:GL:GQ 0/1:-151.91,-67.61,-244.28:100 +20 1667770 . TG T . PASS FR=0.5;HP=6;NF=5;NR=5;PP=100.0;SC=AGGGTTATGATGGGGGGAGAA;TC=29;TR=10 GT:GL:GQ 0/1:-75.51,-17.52,-115.09:100 +20 1674714 . A AT . PASS FR=1.0;HP=6;NF=12;NR=9;PP=100.0;SC=AAGGAGAATCATTTTTTCTTA;TC=26;TR=21 GT:GL:GQ 1/1:-198.16,-29.36,-11.98:100 +20 1679689 . TACACAC TACACACACAC,T . PASS FR=0.5,0.5;HP=3;NF=2,1;NR=0,1;PP=100.0,100.0;SC=TTAGATGCCCTACACACACAC;TC=23;TR=2,2 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 1680048 . G GA . PASS FR=0.5;HP=9;NF=4;NR=9;PP=100.0;SC=GAAAACAACAGAAAAAAAACT;TC=30;TR=13 GT:GL:GQ 0/1:-157.3,-90.19,-130.66:100 +20 1680109 . GA G . PASS FR=0.5;HP=4;NF=9;NR=8;PP=100.0;SC=AACAGCAAGAGAAATTATAAA;TC=32;TR=17 GT:GL:GQ 0/1:-210.03,-97.05,-217.17:100 +20 1682621 . A AT . PASS FR=1.0;HP=3;NF=18;NR=11;PP=100.0;SC=AATATATCATATTACACAGTG;TC=31;TR=29 GT:GL:GQ 1/1:-304.45,-32.07,-10.59:100 +20 1683112 . T TC . PASS FR=1.0;HP=2;NF=6;NR=11;PP=100.0;SC=CAAACCCTCTTCCTATACCAC;TC=23;TR=17 GT:GL:GQ 1/1:-265.19,-181.47,-172.55:74 +20 1683153 . CA C . PASS FR=0.5;HP=2;NF=5;NR=7;PP=100.0;SC=GCAGCAGCTGCAAGAAGTCTC;TC=22;TR=12 GT:GL:GQ 0/1:-291.99,-237.27,-279.09:100 +20 1683250 . ATAGCTCTACCAGT A . PASS FR=0.5;HP=1;NF=5;NR=4;PP=100.0;SC=AGTTCGAATCATAGCTCTACC;TC=22;TR=9 GT:GL:GQ 0/1:-267.9,-88.45,-154.18:100 +20 1683813 . C CT . PASS FR=0.5;HP=6;NF=12;NR=13;PP=100.0;SC=AAGAGAATGTCTTTTTAAAAT;TC=53;TR=25 GT:GL:GQ 0/1:-327.36,-122.23,-224.07:100 +20 1683959 . C CA . PASS FR=0.5;HP=8;NF=4;NR=9;PP=100.0;SC=TCAACAATGACAAAAAAAGCA;TC=24;TR=13 GT:GL:GQ 0/1:-130.55,-27.62,-42.34:66 +20 1684576 . A AATGTATAATAC . PASS FR=0.5;HP=2;NF=5;NR=4;PP=96.0;SC=ATACTGTTTAAATATTTCCTG;TC=24;TR=9 GT:GL:GQ 0/1:-370.23,-353.25,-494.05:100 +20 1688002 . AAAAC A . PASS FR=1.0;HP=3;NF=4;NR=6;PP=100.0;SC=ACTCCCTCTCAAAACAAACAA;TC=22;TR=10 GT:GL:GQ 1/1:-132.2,-18.69,-9.78:74 +20 1690549 . CCT C . PASS FR=0.5;HP=3;NF=6;NR=6;PP=100.0;SC=GAAATCTTCCCCTGTCTGTGA;TC=32;TR=12 GT:GL:GQ 0/1:-184.81,-148.16,-332.53:100 +20 1694183 . CT C . PASS FR=0.5;HP=3;NF=8;NR=5;PP=100.0;SC=TATACAAAGACTTTATAACCA;TC=29;TR=13 GT:GL:GQ 0/1:-144.04,-44.56,-141.78:100 +20 1699510 . T TCCCA . PASS FR=0.5;HP=3;NF=10;NR=2;PP=100.0;SC=AATGTCTCATTCCCACATCCT;TC=19;TR=12 GT:GL:GQ 0/1:-164.23,-17.54,-74.37:100 +20 1701571 . TTAAAATAAAA T . PASS FR=0.5;HP=4;NF=5;NR=2;PP=100.0;SC=CATCTCAAAATTAAAATAAAA;TC=21;TR=7 GT:GL:GQ 0/1:-177.13,-95.66,-194.53:100 +20 1716144 . A AGTGT . PASS FR=0.5;HP=8;NF=3;NR=4;PP=100.0;SC=GGTTTTTTTTAGTGTGTGTGT;TC=23;TR=7 GT:GL:GQ 0/1:-151.21,-52.44,-109.8:100 +20 1719870 . TG T . PASS FR=0.5;HP=1;NF=3;NR=11;PP=100.0;SC=ATCAAACCTCTGTGGGAGAGA;TC=27;TR=14 GT:GL:GQ 0/1:-146.54,-22.92,-111.48:100 +20 1721789 . GT G . PASS FR=0.5;HP=9;NF=6;NR=4;PP=100.0;SC=GCACTTGGGAGTTTTTTTTTC;TC=23;TR=10 GT:GL:GQ 0/1:-60.27,-22.43,-60.17:100 +20 1722316 . CCTTT C . PASS FR=1.0;HP=2;NF=2;NR=1;PP=100.0;SC=TTTCTCTCTTCCTTTCTTTCT;TC=7;TR=3 GT:GL:GQ 1/1:-85.7,-30.24,-25.46:57 +20 1727042 . T TA . PASS FR=1.0;HP=2;NF=10;NR=8;PP=100.0;SC=AATTAAATTATATAGAGGAAG;TC=20;TR=18 GT:GL:GQ 1/1:-223.19,-104.73,-92.26:100 +20 1728298 . G GT . PASS FR=1.0;HP=4;NF=11;NR=14;PP=100.0;SC=AAGAACAGAGGTTTTAAGCAT;TC=28;TR=25 GT:GL:GQ 1/1:-297.24,-94.99,-75.97:100 +20 1730788 . T TGATA . PASS FR=1.0;HP=3;NF=3;NR=6;PP=100.0;SC=AGATGATAAATGATAGATAGA;TC=36;TR=9 GT:GL:GQ 1/1:-190.89,-23.51,-13.12:87 +20 1731625 . CA C . PASS FR=1.0;HP=9;NF=5;NR=8;PP=100.0;SC=GACTCCATCTCAAAAAAAAAG;TC=23;TR=13 GT:GL:GQ 1/1:-93.68,-29.69,-18.4:95 +20 1734082 . AAAAAT A . PASS FR=0.5;HP=4;NF=6;NR=3;PP=100.0;SC=CAATAGCTATAAAAATAAAAT;TC=38;TR=9 GT:GL:GQ 0/1:-124.98,-23.78,-220.83:100 +20 1738324 . T TC . PASS FR=1.0;HP=3;NF=7;NR=10;PP=100.0;SC=ACACTCCTTTTCCTTCATGAT;TC=22;TR=17 GT:GL:GQ 1/1:-213.69,-47.59,-33.85:100 +20 1738519 . A AG . PASS FR=1.0;HP=1;NF=13;NR=11;PP=100.0;SC=CTGTCAAACTAGCCTCTGGCT;TC=29;TR=24 GT:GL:GQ 1/1:-269.52,-42.45,-23.17:100 +20 1741051 . T TAA . PASS FR=1.0;HP=1;NF=12;NR=12;PP=100.0;SC=TAAATATATATGACTATTTTT;TC=35;TR=24 GT:GL:GQ 1/1:-395.96,-52.09,-26.1:100 +20 1745352 . A ACAATAATCACATCAAAGAT . PASS FR=1.0;HP=2;NF=4;NR=8;PP=100.0;SC=CAAGACCATTACACTAATCAC;TC=17;TR=12 GT:GL:GQ 1/1:-425.27,-43.37,-23.58:100 +20 1746606 . GTA G . PASS FR=1.0;HP=2;NF=1;NR=4;PP=100.0;SC=ATATATATGTGTATATATATA;TC=9;TR=5 GT:GL:GQ 1/1:-98.72,-49.48,-45.34:50 +20 1768362 . G GAA . PASS FR=1.0;HP=2;NF=7;NR=14;PP=100.0;SC=TAGAGTGATGGAAGAGACTGG;TC=27;TR=21 GT:GL:GQ 1/1:-269.69,-41.32,-23.11:100 +20 1778684 . A AGTGCTT . PASS FR=0.5;HP=2;NF=1;NR=1;PP=83.0;SC=ATTGCCCTCCATTGGAGGCTG;TC=14;TR=2 GT:GL:GQ 1/0:-256.33,-220.54,-244.27:69 +20 1833292 . TA T . PASS FR=0.5;HP=3;NF=5;NR=5;PP=100.0;SC=ATATTATGTATAATCTCAATT;TC=25;TR=10 GT:GL:GQ 0/1:-147.42,-89.75,-210.06:100 +20 1848829 . CTTTTCT C . PASS FR=1.0;HP=8;NF=6;NR=15;PP=100.0;SC=CTTTTCTTTTCTTTTCTTTTC;TC=25;TR=21 GT:GL:GQ 1/1:-409.42,-172.01,-156.56:100 +20 1848853 . CTT C . PASS FR=0.5;HP=4;NF=3;NR=4;PP=100.0;SC=CTTTCTTTCTCTTTCTTTCTT;TC=26;TR=7 GT:GL:GQ 0/1:-469.4,-397.68,-416.1:83 +20 1848877 . C CTT . PASS FR=0.9999;HP=4;NF=2;NR=1;PP=100.0;SC=TTCTTTCTTTCTCTTTCTTTC;TC=26;TR=3 GT:GL:GQ 1/1:-373.17,-284.63,-280.27:37 +20 1852149 . CCA C . PASS FR=0.5;HP=1;NF=4;NR=1;PP=100.0;SC=CACCCCCTCTCCACACACACA;TC=23;TR=5 GT:GL:GQ 0/1:-139.51,-90.17,-161.53:100 +20 1855569 . AACACAC A . PASS FR=1.0;HP=1;NF=7;NR=3;PP=100.0;SC=GTCACTCTACAACACACACAC;TC=14;TR=10 GT:GL:GQ 1/1:-159.46,-18.21,-11.49:84 +20 1857852 . TC T . PASS FR=1.0;HP=6;NF=4;NR=19;PP=100.0;SC=CCCGTGTCCATCCCCCCTGTA;TC=58;TR=23 GT:GL:GQ 1/1:-667.45,-637.23,-632.11:63 +20 1857976 . G GT . PASS FR=1.0;HP=5;NF=12;NR=1;PP=100.0;SC=GCTTTGTTTTGTCAGTTGTTT;TC=22;TR=13 GT:GL:GQ 1/1:-196.6,-28.45,-14.03:100 +20 1872437 . AT A . PASS FR=0.5;HP=2;NF=2;NR=4;PP=100.0;SC=TCCCTGGCTAATTCCCCCCAC;TC=23;TR=6 GT:GL:GQ 0/1:-111.11,-55.77,-134.66:100 +20 1890990 . CTT C . PASS FR=1.0;HP=5;NF=11;NR=12;PP=100.0;SC=TGTTTCATTACTTTTTAACTT;TC=24;TR=23 GT:GL:GQ 1/1:-245.45,-38.39,-20.54:100 +20 1895466 . T TATAG . PASS FR=1.0;HP=1;NF=11;NR=5;PP=100.0;SC=AGATTAGAATTAGCCCAGCTC;TC=24;TR=16 GT:GL:GQ 1/1:-500.31,-454.72,-448.18:79 +20 1895484 . ACT A . PASS FR=1.0;HP=1;NF=14;NR=4;PP=52.0;SC=CTCAGATGTGACTCTTCCAGA;TC=23;TR=18 GT:GL:GQ 1/1:-454.69,-436.37,-433.13:53 +20 1912065 . AC A . PASS FR=0.5;HP=2;NF=7;NR=8;PP=100.0;SC=TGCCTTCATCACTGTTCCCAT;TC=25;TR=15 GT:GL:GQ 0/1:-166.95,-40.53,-113.76:100 +20 1930288 . TAAG T . PASS FR=0.5;HP=2;NF=9;NR=4;PP=100.0;SC=TATAAGTTGTTAAGAAGAAAA;TC=31;TR=13 GT:GL:GQ 0/1:-196.67,-58.02,-140.92:100 +20 1940722 . GTT G . PASS FR=0.5;HP=2;NF=6;NR=7;PP=100.0;SC=AAAAACCCAGGTTATATATAC;TC=25;TR=13 GT:GL:GQ 0/1:-178.3,-32.72,-93.72:100 +20 1940980 . G GA . PASS FR=0.5;HP=3;NF=5;NR=3;PP=100.0;SC=AACTACTCAGGGGCTGAGATG;TC=20;TR=8 GT:GL:GQ 0/1:-91.81,-43.36,-126.02:100 +20 1941170 . A AC . PASS FR=0.5;HP=1;NF=10;NR=2;PP=100.0;SC=ATACCTGTATAGAAAAAAAGT;TC=31;TR=12 GT:GL:GQ 0/1:-250.35,-208.27,-291.77:100 +20 1943171 . T TG . PASS FR=0.5;HP=7;NF=1;NR=1;PP=56.0;SC=AGGGGAAGCCTGGGGGGGTTG;TC=19;TR=2 GT:GL:GQ 0/1:-65.38,-41.58,-85.08:100 +20 1949783 . C CT . PASS FR=0.5;HP=10;NF=3;NR=4;PP=100.0;SC=GTGCTGAGCCCTTTTTTTTTT;TC=26;TR=7 GT:GL:GQ 0/1:-82.34,-46.95,-63.27:73 +20 1959266 . A ATG . PASS FR=0.5;HP=2;NF=3;NR=4;PP=100.0;SC=CAACCTGAATATGTGTGTGTG;TC=24;TR=7 GT:GL:GQ 0/1:-140.42,-42.47,-66.02:100 +20 1967894 . GATGA G . PASS FR=0.5;HP=2;NF=2;NR=4;PP=100.0;SC=TTGAGTGATTGATGAATGAAT;TC=24;TR=6 GT:GL:GQ 0/1:-113.7,-41.87,-83.28:100 +20 1977448 . A ACACACACACG . PASS FR=0.5;HP=1;NF=1;NR=1;PP=100.0;SC=ACACACACACATAGAAGGCCA;TC=32;TR=2 GT:GL:GQ 0/1:-253.96,-71.96,-163.76:100 +20 1996777 . CT C . PASS FR=0.5;HP=2;NF=4;NR=7;PP=100.0;SC=GTGTTTTAGGCTGTTATTTCA;TC=21;TR=11 GT:GL:GQ 0/1:-127.06,-33.79,-125.68:100 +20 1997708 . CAT C . PASS FR=0.5;HP=2;NF=5;NR=4;PP=100.0;SC=CACACACACACATACAAAATA;TC=31;TR=9 GT:GL:GQ 0/1:-145.15,-85.85,-245.36:100 +20 2004765 . T TG . PASS FR=0.5;HP=1;NF=2;NR=2;PP=76.0;SC=AGGATTTTTCTATCAGTCCAC;TC=12;TR=4 GT:GL:GQ 0/1:-54.31,-25.7,-84.4:100 +20 2034931 . G GTTC . PASS FR=0.5;HP=2;NF=6;NR=4;PP=100.0;SC=AGATAGGTAAGTTCTTCCCCA;TC=24;TR=10 GT:GL:GQ 0/1:-162.21,-52.77,-146.87:100 +20 2035677 . AACACAC AAC,A . PASS FR=0.5,0.5;HP=2;NF=2,3;NR=0,2;PP=39.0,100.0;SC=TTTTATAATAAACACACACAC;TC=29;TR=2,5 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:88 +20 2050099 . AATTG A . PASS FR=0.5;HP=2;NF=10;NR=5;PP=100.0;SC=TCTTATTCTTAATTGATCTAA;TC=35;TR=15 GT:GL:GQ 0/1:-259.54,-91.86,-224.89:100 +20 2052246 . AC A . PASS FR=0.5;HP=1;NF=3;NR=6;PP=100.0;SC=GGTCCCAGCTACTCAGGAGGC;TC=19;TR=9 GT:GL:GQ 0/1:-113.96,-44.77,-115.57:100 +20 2053863 . C CA . PASS FR=0.5;HP=9;NF=3;NR=4;PP=96.0;SC=ACTAAAAATACAAAAAAAATA;TC=16;TR=7 GT:GL:GQ 0/1:-46.07,-13.04,-34.97:98 +20 2054845 . AAAGAGGAAAAAG A . PASS FR=0.5;HP=4;NF=7;NR=1;PP=100.0;SC=AAAAGAGGAAAAAGAGGAAAA;TC=27;TR=8 GT:GL:GQ 0/1:-251.05,-86.54,-294.87:100 +20 2055452 . AAAGG A . PASS FR=0.5;HP=4;NF=4;NR=4;PP=100.0;SC=AAGAAAAGAAAAAGGAAGGAA;TC=27;TR=8 GT:GL:GQ 0/1:-227.92,-152.39,-281.38:100 +20 2077127 . AAC A . PASS FR=0.5;HP=3;NF=1;NR=3;PP=97.0;SC=TCTCTACTAAAACACACACAC;TC=17;TR=4 GT:GL:GQ 0/1:-57.31,-24.65,-94.33:100 +20 2078747 . CCT C . PASS FR=0.5;HP=3;NF=3;NR=2;PP=100.0;SC=AGAAAATTCCCCTGTGGCCCT;TC=15;TR=5 GT:GL:GQ 0/1:-78.54,-32.73,-103.05:100 +20 2120509 . AAAGGT A . PASS FR=0.5;HP=2;NF=8;NR=1;PP=100.0;SC=CTGAAATGAGAAAGGTAAGGA;TC=19;TR=9 GT:GL:GQ 0/1:-189.27,-90.48,-174.84:100 +20 2122413 . CT C . PASS FR=0.5;HP=4;NF=3;NR=8;PP=100.0;SC=GTAACCTACCCTTTTCCACCT;TC=23;TR=11 GT:GL:GQ 0/1:-132.75,-34.8,-69.03:100 +20 2126052 . T TCTATGTGA . PASS FR=0.5;HP=2;NF=3;NR=1;PP=100.0;SC=CATTTCCGTTTCTATGTGACC;TC=22;TR=4 GT:GL:GQ 0/1:-179.74,-76.1,-178.95:100 +20 2131707 . T TGG . PASS FR=0.5;HP=2;NF=7;NR=1;PP=100.0;SC=CCCTGTTGCCTGACCTGAGCC;TC=20;TR=8 GT:GL:GQ 0/1:-145.56,-92.76,-163.87:100 +20 2153043 . C CTTTATTTA . PASS FR=0.5;HP=3;NF=1;NR=2;PP=100.0;SC=GGTGACATCACTTTATTTATT;TC=21;TR=3 GT:GL:GQ 0/1:-97.11,-28.78,-48.32:87 +20 2155932 . C CAT . PASS FR=0.5;HP=7;NF=4;NR=3;PP=100.0;SC=AATTAAAAAACATATATATAT;TC=32;TR=7 GT:GL:GQ 0/1:-176.17,-66.01,-150.43:100 +20 2160585 . AT A . PASS FR=0.5;HP=7;NF=9;NR=11;PP=100.0;SC=GTTTTTAAATATTTTTTAATT;TC=41;TR=20 GT:GL:GQ 0/1:-237.9,-137.73,-264.06:100 +20 2162113 . A ATT . PASS FR=0.5;HP=1;NF=2;NR=4;PP=100.0;SC=TATCAGGAATAATTTTTTTTT;TC=25;TR=6 GT:GL:GQ 0/1:-145.37,-128.61,-213.61:100 +20 2165761 . GTTAT G . PASS FR=0.5;HP=3;NF=4;NR=1;PP=100.0;SC=CTAATAACCTGTTATTTATTT;TC=28;TR=5 GT:GL:GQ 0/1:-79.63,-28.99,-73.78:100 +20 2171122 . CAAACA C . PASS FR=0.5;HP=4;NF=4;NR=1;PP=100.0;SC=AACAAACAGACAAACAAAACA;TC=18;TR=5 GT:GL:GQ 0/1:-113.12,-57.95,-91.54:100 +20 2171346 . TA T . PASS FR=0.5;HP=8;NF=4;NR=5;PP=100.0;SC=AATTTTTTTTTAAAATCCTTA;TC=20;TR=9 GT:GL:GQ 0/1:-174.43,-122.88,-194.49:100 +20 2171402 . T TA . PASS FR=0.5;HP=2;NF=3;NR=1;PP=92.0;SC=TGATTGATCCTAACTTAATGA;TC=23;TR=4 GT:GL:GQ 0/1:-112.12,-79.99,-224.63:100 +20 2198337 . AAG A . PASS FR=0.5;HP=2;NF=17;NR=3;PP=100.0;SC=CAACCAAAGAAAGAATGGGAG;TC=38;TR=20 GT:GL:GQ 0/1:-234.35,-51.22,-161.95:100 +20 2199055 . G GCCACACACTTCTAAA . PASS FR=0.5;HP=2;NF=2;NR=5;PP=100.0;SC=AGGGGGAAGTGCCATCAGATG;TC=20;TR=7 GT:GL:GQ 0/1:-318.25,-129.11,-238.35:100 +20 2199168 . T TG . PASS FR=0.5;HP=9;NF=3;NR=6;PP=100.0;SC=TGAGATTTGGTGGGGGGGACA;TC=37;TR=9 GT:GL:GQ 0/1:-144.44,-70.03,-129.92:100 +20 2209336 . A AGTG . PASS FR=0.5;HP=1;NF=4;NR=1;PP=100.0;SC=GCTGGAGTGCAGTGGTACAAT;TC=18;TR=5 GT:GL:GQ 0/1:-105.48,-46.83,-99.81:100 +20 2215492 . T TA . PASS FR=1.0;HP=1;NF=17;NR=16;PP=100.0;SC=TGGATGAACGTATTTATTTAA;TC=37;TR=33 GT:GL:GQ 1/1:-589.49,-315.53,-293.02:100 +20 2215506 . G GT . PASS FR=1.0;HP=3;NF=18;NR=13;PP=100.0;SC=TATTTAACCAGTTTCTCTTGA;TC=36;TR=31 GT:GL:GQ 1/1:-602.79,-346.63,-325.98:100 +20 2216792 . CAG C . PASS FR=0.5;HP=1;NF=6;NR=7;PP=100.0;SC=TGCGTTCATGCAGTTTATGGG;TC=25;TR=13 GT:GL:GQ 0/1:-181.42,-37.01,-108.03:100 +20 2217535 . CCT C . PASS FR=0.5;HP=1;NF=6;NR=6;PP=100.0;SC=CATTGCATCACCTGCCTCTGA;TC=32;TR=12 GT:GL:GQ 0/1:-224.94,-75.19,-157.78:100 +20 2218702 . CA C . PASS FR=0.5;HP=1;NF=3;NR=5;PP=100.0;SC=AATCACGACTCATTGTAGCCT;TC=18;TR=8 GT:GL:GQ 0/1:-111.7,-55.95,-90.25:100 +20 2221607 . TTTTCTTTCTTTCTTTTTCC T . PASS FR=0.5;HP=4;NF=4;NR=2;PP=100.0;SC=AAAGTTTTCTTTTTCTTTCTT;TC=29;TR=6 GT:GL:GQ 0/1:-196.61,-29.28,-142.76:100 +20 2241427 . AAAAC A . PASS FR=1.0;HP=4;NF=4;NR=3;PP=100.0;SC=CTTGTCTCTAAAAACAAACAA;TC=19;TR=7 GT:GL:GQ 1/1:-166.73,-37.97,-27.83:84 +20 2263098 . TG T . PASS FR=1.0;HP=4;NF=5;NR=5;PP=100.0;SC=TGACGGATGGTGGAGTGAGAA;TC=12;TR=10 GT:GL:GQ 1/1:-115.83,-17.15,-8.29:71 +20 2278675 . A ATGAATGGCACT . PASS FR=1.0;HP=4;NF=8;NR=9;PP=100.0;SC=ACTCTGAAAAATGGTCACAGA;TC=18;TR=17 GT:GL:GQ 1/1:-567.99,-218.0,-199.44:100 +20 2280081 . C CT . PASS FR=1.0;HP=3;NF=15;NR=9;PP=100.0;SC=TAACTTCATGCGGCTCCACCC;TC=30;TR=24 GT:GL:GQ 1/1:-287.69,-60.5,-41.43:100 +20 2280751 . TA T . PASS FR=1.0;HP=10;NF=11;NR=3;PP=100.0;SC=AGACTCCATTTAAAAAAAAAA;TC=22;TR=14 GT:GL:GQ 1/1:-139.24,-88.42,-77.92:88 +20 2280882 . A AAAAG . PASS FR=1.0;HP=6;NF=2;NR=2;PP=100.0;SC=AAGAAAGAAAAAAAGAAAGAA;TC=21;TR=4 GT:GL:GQ 1/1:-160.24,-78.2,-70.5:63 +20 2285898 . AGTCACTG A . PASS FR=1.0;HP=1;NF=9;NR=3;PP=100.0;SC=CCAAGTCTCTAGTCACTGGTT;TC=19;TR=12 GT:GL:GQ 1/1:-272.68,-30.42,-16.26:99 +20 2287002 . TAAG T . PASS FR=1.0;HP=2;NF=12;NR=8;PP=100.0;SC=GAAAAATCTCTAAGAAGGCTC;TC=24;TR=20 GT:GL:GQ 1/1:-245.61,-20.38,-4.14:100 +20 2294297 . A ACT . PASS FR=1.0;HP=2;NF=5;NR=3;PP=100.0;SC=AATCACACACACTCTCTCTCT;TC=24;TR=8 GT:GL:GQ 1/1:-199.54,-41.84,-28.04:100 +20 2297084 . AT A . PASS FR=1.0;HP=2;NF=10;NR=7;PP=100.0;SC=GGTGGCACGCATTAACACCAG;TC=18;TR=17 GT:GL:GQ 1/1:-184.14,-27.34,-14.78:100 +20 2297605 . CT C . PASS FR=0.5;HP=3;NF=4;NR=6;PP=100.0;SC=CAATCATGGCCTTTGGCTTCC;TC=24;TR=10 GT:GL:GQ 0/1:-137.24,-29.13,-84.17:100 +20 2298589 . C CAT,T . PASS FR=0.5,0.5;HP=1;NF=5,2;NR=2,3;PP=100.0,100.0;SC=ATATATATATCATATATATAT;TC=23;TR=7,5 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 2316853 . G GC . PASS FR=1.0;HP=4;NF=3;NR=6;PP=100.0;SC=TCACCCTGTAGCCCCTGTGCC;TC=15;TR=9 GT:GL:GQ 1/1:-147.72,-38.92,-28.94:83 +20 2318317 . GATCACACC G . PASS FR=1.0;HP=2;NF=8;NR=8;PP=100.0;SC=AGTGAGCCGAGATCACACCAC;TC=22;TR=16 GT:GL:GQ 1/1:-356.42,-104.52,-90.96:100 +20 2318716 . AG A . PASS FR=1.0;HP=3;NF=13;NR=4;PP=100.0;SC=CACTCAGAGCAGGGCACCGAT;TC=26;TR=17 GT:GL:GQ 1/1:-256.21,-181.8,-170.54:94 +20 2323655 . A AT . PASS FR=1.0;HP=8;NF=11;NR=9;PP=100.0;SC=AGGAAAAAAAAACACTGATGT;TC=31;TR=20 GT:GL:GQ 1/1:-290.56,-28.0,-5.91:100 +20 2326944 . G GA . PASS FR=1.0;HP=5;NF=6;NR=12;PP=100.0;SC=AGATACAGAGGAAAAATGAAG;TC=25;TR=18 GT:GL:GQ 1/1:-204.47,-32.24,-15.14:100 +20 2329825 . T TC . PASS FR=1.0;HP=1;NF=16;NR=4;PP=100.0;SC=ATATGGGTTGTCTTTGAGACT;TC=22;TR=20 GT:GL:GQ 1/1:-212.37,-32.28,-17.55:100 +20 2334719 . CTAT C . PASS FR=1.0;HP=3;NF=14;NR=16;PP=100.0;SC=TTCCCAGGTTCTATTATGTAG;TC=36;TR=30 GT:GL:GQ 1/1:-368.57,-33.34,-9.9:100 +20 2335944 . C CTG . PASS FR=1.0;HP=4;NF=10;NR=19;PP=100.0;SC=GCTGAGAAAACTATATCCAAA;TC=34;TR=29 GT:GL:GQ 1/1:-370.96,-31.85,-8.29:100 +20 2340299 . TTGTC T . PASS FR=1.0;HP=2;NF=10;NR=15;PP=100.0;SC=ATCCTGTAGGTTGTCTGTTTA;TC=27;TR=25 GT:GL:GQ 1/1:-327.39,-42.17,-22.8:100 +20 2342117 . T TG . PASS FR=1.0;HP=5;NF=14;NR=14;PP=100.0;SC=TGCTTATTTTTTCCACTTAAT;TC=32;TR=28 GT:GL:GQ 1/1:-450.6,-326.69,-308.08:100 +20 2344369 . TAAG T . PASS FR=1.0;HP=2;NF=13;NR=10;PP=100.0;SC=TGAGAGGTGGTAAGAAGAAGA;TC=36;TR=23 GT:GL:GQ 1/1:-351.7,-76.99,-56.29:100 +20 2344451 . G GAGGA . PASS FR=1.0;HP=2;NF=12;NR=3;PP=100.0;SC=ACACCCAACAGAGGAAGGTTA;TC=20;TR=15 GT:GL:GQ 1/1:-372.02,-158.89,-145.61:100 +20 2344539 . T TTTTGTTTG . PASS FR=1.0;HP=3;NF=8;NR=4;PP=100.0;SC=ACTACCCCAGTTTTGTTTGTT;TC=23;TR=12 GT:GL:GQ 1/1:-243.77,-36.7,-24.92:99 +20 2345269 . TCCTGGC T . PASS FR=1.0;HP=2;NF=7;NR=13;PP=100.0;SC=ATCGAGACCATCCTGGCTAAC;TC=21;TR=20 GT:GL:GQ 1/1:-260.12,-24.22,-9.67:100 +20 2346660 . T TAATAAATAAATAAATA . PASS FR=1.0;HP=3;NF=3;NR=4;PP=100.0;SC=CAATTCCTTATAATAAATAAA;TC=13;TR=7 GT:GL:GQ 1/1:-305.93,-18.69,-7.6:93 +20 2352930 . AC A . PASS FR=1.0;HP=2;NF=10;NR=8;PP=100.0;SC=TTTCAGGCCTACCTCTCAAGC;TC=21;TR=18 GT:GL:GQ 1/1:-216.23,-90.38,-78.46:100 +20 2362643 . C CTG . PASS FR=1.0;HP=3;NF=11;NR=8;PP=100.0;SC=AAGAACTTGTCTTAGATGCTG;TC=21;TR=19 GT:GL:GQ 1/1:-259.19,-87.0,-72.75:100 +20 2379170 . TC T . PASS FR=0.5;HP=4;NF=1;NR=3;PP=99.0;SC=AGCTTGGGCTTCCCCACAATA;TC=23;TR=4 GT:GL:GQ 0/1:-84.89,-51.93,-137.5:100 +20 2401510 . ATGT A . PASS FR=0.5;HP=2;NF=2;NR=4;PP=100.0;SC=CATTATATGGATGTACACAGT;TC=23;TR=6 GT:GL:GQ 0/1:-138.83,-80.65,-217.86:100 +20 2406090 . AACT A . PASS FR=0.5;HP=3;NF=8;NR=7;PP=100.0;SC=GTTGCCACAAAACTTCAATTT;TC=36;TR=15 GT:GL:GQ 0/1:-277.31,-158.31,-369.27:100 +20 2407722 . A AT . PASS FR=0.5;HP=9;NF=4;NR=11;PP=100.0;SC=AATTGCTATAATTTTTTTTTC;TC=38;TR=15 GT:GL:GQ 0/1:-112.13,-34.3,-69.71:100 +20 2409340 . C CAATA . PASS FR=0.5;HP=2;NF=4;NR=3;PP=100.0;SC=CATAATAAATCAATCAATAAA;TC=22;TR=7 GT:GL:GQ 0/1:-189.45,-43.56,-132.72:100 +20 2409613 . G GCA . PASS FR=0.5;HP=1;NF=6;NR=4;PP=57.0;SC=GGGATTATAGGCACAACACCA;TC=25;TR=10 GT:GL:GQ 0/1:-231.71,-206.44,-319.84:100 +20 2411731 . CAG C . PASS FR=0.5;HP=1;NF=1;NR=2;PP=36.0;SC=GTGGATGAGCCAGAGAGAAGT;TC=13;TR=3 GT:GL:GQ 0/1:-55.56,-36.89,-120.4:84 +20 2414786 . G GA . PASS FR=1.0;HP=8;NF=8;NR=10;PP=100.0;SC=GAAGCTTTCAGAAAAAAACCC;TC=23;TR=18 GT:GL:GQ 1/1:-173.45,-78.53,-65.46:100 +20 2418166 . GTGTT G . PASS FR=0.5;HP=1;NF=1;NR=4;PP=100.0;SC=CACCTGGCTAGTGTTTGTTTG;TC=21;TR=5 GT:GL:GQ 0/1:-134.79,-72.62,-117.78:100 +20 2425523 . A ATTTATTTTATTTTAT . PASS FR=0.5;HP=7;NF=3;NR=2;PP=100.0;SC=ATTTTATTTTATTTATTTTAT;TC=23;TR=5 GT:GL:GQ 0/1:-149.61,-12.23,-46.02:100 +20 2425934 . T TA . PASS FR=0.5;HP=8;NF=8;NR=4;PP=67.0;SC=TTAATCAATTTAAAAAAAATG;TC=25;TR=12 GT:GL:GQ 0/1:-160.28,-133.72,-162.95:100 +20 2430943 . ATGTG A . PASS FR=0.5;HP=1;NF=1;NR=1;PP=100.0;SC=GTGCGTGTGCATGTGTGTGTG;TC=29;TR=2 GT:GL:GQ 0/1:-164.1,-78.49,-99.2:92 +20 2433931 . TC T . PASS FR=0.5;HP=5;NF=1;NR=1;PP=26.0;SC=CCCTGGAAGCTCCCCTTTGTG;TC=10;TR=2 GT:GL:GQ 0/1:-34.79,-18.58,-53.81:73 +20 2436455 . A AAAAAAG,AAAAAG . PASS FR=0.5,0.5;HP=9;NF=3,3;NR=1,4;PP=50.0,100.0;SC=CTACCAAAAAAAAAAGAAAAG;TC=25;TR=4,7 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 2436835 . A AC . PASS FR=0.5;HP=1;NF=7;NR=8;PP=100.0;SC=ACAATGATGTACATTTTTCAG;TC=37;TR=15 GT:GL:GQ 0/1:-177.52,-36.56,-198.23:100 +20 2448573 . CCT C . PASS FR=0.5;HP=2;NF=6;NR=5;PP=100.0;SC=CCCATGCCACCCTGTTTTAGC;TC=34;TR=11 GT:GL:GQ 0/1:-159.22,-114.6,-320.68:100 +20 2450954 . CA C . PASS FR=0.5;HP=2;NF=1;NR=4;PP=100.0;SC=CAAACTTCCGCAAGTCTGAGC;TC=22;TR=5 GT:GL:GQ 0/1:-106.22,-51.15,-126.38:100 +20 2452700 . TAAAAAAGAA T . PASS FR=0.5;HP=6;NF=4;NR=5;PP=100.0;SC=TTTCTTGGATTAAAAAAGAAA;TC=32;TR=9 GT:GL:GQ 0/1:-216.2,-29.76,-153.35:100 +20 2458350 . G GA . PASS FR=0.5;HP=3;NF=4;NR=6;PP=100.0;SC=CAAGGTGGGAGAATTGCTTGA;TC=27;TR=10 GT:GL:GQ 0/1:-156.97,-38.22,-122.55:100 +20 2477736 . A AT . PASS FR=0.5;HP=10;NF=4;NR=3;PP=100.0;SC=AAAAAAAAAAATTTTACCATC;TC=23;TR=7 GT:GL:GQ 0/1:-89.51,-39.15,-127.81:100 +20 2498012 . GTA G . PASS FR=0.5;HP=2;NF=3;NR=6;PP=100.0;SC=GTATATGTGTGTATATATATA;TC=22;TR=9 GT:GL:GQ 0/1:-140.02,-17.32,-103.73:100 +20 2516178 . GA G . PASS FR=0.5;HP=8;NF=3;NR=5;PP=100.0;SC=GTTTAATTGGGAAAAAAAATA;TC=17;TR=8 GT:GL:GQ 0/1:-52.67,-14.95,-45.28:100 +20 2520604 . T TAGCA . PASS FR=0.5;HP=4;NF=4;NR=3;PP=100.0;SC=CTCCCGCAAATAGCACACAAG;TC=20;TR=7 GT:GL:GQ 0/1:-194.0,-75.16,-105.67:100 +20 2522684 . G GA . PASS FR=0.5;HP=7;NF=5;NR=6;PP=83.0;SC=TTTCTTATTTGAAAAAAACTT;TC=31;TR=11 GT:GL:GQ 0/1:-153.71,-123.52,-187.08:100 +20 2523586 . T TA . PASS FR=1.0;HP=4;NF=11;NR=6;PP=100.0;SC=TTTTTCTTTTTAAAACAAAAT;TC=23;TR=17 GT:GL:GQ 1/1:-179.22,-18.0,-3.45:100 +20 2526468 . GAAGA G . PASS FR=0.5001;HP=2;NF=2;NR=4;PP=100.0;SC=AGAGGAAGAGGAAGAAAGAAA;TC=25;TR=6 GT:GL:GQ 0/1:-210.76,-128.72,-136.62:37 +20 2526552 . A AAG . PASS FR=0.5;HP=6;NF=5;NR=8;PP=100.0;SC=GAAAGAAAGAAAAAAAGAAAG;TC=30;TR=13 GT:GL:GQ 0/1:-215.19,-78.8,-144.35:100 +20 2527129 . G GTTGGGCATAAGCTGTAGATC . PASS FR=0.5;HP=2;NF=3;NR=1;PP=100.0;SC=AACCTGCAGAGTTGGGCATAA;TC=18;TR=4 GT:GL:GQ 0/1:-243.57,-136.91,-199.82:100 +20 2534184 . T TGTTTTGTGTGAC . PASS FR=0.5;HP=1;NF=5;NR=9;PP=100.0;SC=GATACAGGTCTGTTTTTGTCT;TC=31;TR=14 GT:GL:GQ 0/1:-444.44,-61.75,-181.17:100 +20 2546156 . TGG T . PASS FR=0.5;HP=3;NF=4;NR=12;PP=100.0;SC=CCCAAAGTGCTGGGATTACAG;TC=31;TR=16 GT:GL:GQ 0/1:-172.01,-63.37,-146.93:100 +20 2568176 . G GT . PASS FR=1.0;HP=10;NF=12;NR=9;PP=100.0;SC=ATTTGGGAATGTTTTTTTTTA;TC=27;TR=21 GT:GL:GQ 1/1:-116.08,-18.72,-6.68:100 +20 2577356 . A AAT . PASS FR=0.5;HP=6;NF=1;NR=2;PP=100.0;SC=ATCAGAAAAAAATATATATGT;TC=26;TR=3 GT:GL:GQ 0/1:-199.48,-88.19,-98.9:49 +20 2579040 . C CTTTATTTA . PASS FR=0.5;HP=3;NF=1;NR=2;PP=100.0;SC=CTTGCCTCTACTTTATTTATT;TC=16;TR=3 GT:GL:GQ 0/1:-103.59,-10.59,-52.57:100 +20 2586119 . GGA G . PASS FR=0.5;HP=1;NF=2;NR=1;PP=30.0;SC=GCATGTGCATGGAGAGAGAGA;TC=23;TR=3 GT:GL:GQ 0/1:-35.49,-18.23,-170.44:77 +20 2594696 . A AT . PASS FR=0.5;HP=8;NF=2;NR=7;PP=100.0;SC=TTTCTGTCACATTTTTTTTCG;TC=24;TR=9 GT:GL:GQ 0/1:-70.9,-30.05,-77.99:100 +20 2597210 . TAAAG T . PASS FR=0.5;HP=7;NF=2;NR=2;PP=100.0;SC=GAAAGGAAAATAAAGAAGGAG;TC=20;TR=4 GT:GL:GQ 0/1:-85.33,-27.89,-144.98:100 +20 2611781 . A ATATCT . PASS FR=0.5;HP=1;NF=8;NR=8;PP=100.0;SC=ATTATAATTAATATAACAAAC;TC=31;TR=16 GT:GL:GQ 0/1:-408.96,-183.07,-309.58:100 +20 2613623 . T TTTG . PASS FR=0.5;HP=3;NF=2;NR=2;PP=100.0;SC=CTTCCATGGGTTTGTTGTTGT;TC=18;TR=4 GT:GL:GQ 0/1:-165.53,-112.66,-139.53:100 +20 2613971 . TA T . PASS FR=0.5;HP=4;NF=4;NR=7;PP=100.0;SC=CTTGGACACATAAACAGCCCT;TC=27;TR=11 GT:GL:GQ 0/1:-121.36,-29.89,-140.29:100 +20 2614405 . T TGGGTAGG . PASS FR=0.5;HP=3;NF=2;NR=2;PP=52.0;SC=ACTACAGAACTGGGTAGGGGA;TC=30;TR=4 GT:GL:GQ 0/1:-185.89,-156.26,-363.71:100 +20 2616002 . C CT . PASS FR=0.5;HP=4;NF=5;NR=5;PP=100.0;SC=ACCTCCACCTCCCCCTCTCAG;TC=22;TR=10 GT:GL:GQ 0/1:-182.46,-117.29,-171.16:100 +20 2617861 . C CCT . PASS FR=0.5;HP=2;NF=2;NR=5;PP=100.0;SC=ATGGTGAACCCGTCTCTACTA;TC=17;TR=7 GT:GL:GQ 0/1:-111.22,-36.32,-97.76:100 +20 2625967 . TGAG T . PASS FR=0.5;HP=1;NF=2;NR=3;PP=100.0;SC=CTGAGTAGGCTGAGGAGGAGG;TC=15;TR=5 GT:GL:GQ 0/1:-133.1,-85.47,-137.74:100 +20 2627766 . TTTTATTTA T . PASS FR=0.5;HP=3;NF=1;NR=1;PP=86.0;SC=ACTGAATTTATTTTATTTATT;TC=19;TR=2 GT:GL:GQ 0/1:-102.46,-70.95,-132.69:100 +20 2630436 . T TACC . PASS FR=0.5;HP=2;NF=6;NR=5;PP=100.0;SC=ACATGCCAGGTACACCATTGT;TC=23;TR=11 GT:GL:GQ 0/1:-159.47,-31.83,-143.4:100 +20 2634285 . CTG C . PASS FR=0.5;HP=1;NF=3;NR=15;PP=100.0;SC=CTTGTGGGCACTGTAGTGACA;TC=29;TR=18 GT:GL:GQ 0/1:-229.42,-26.07,-86.72:100 +20 2641823 . C CTG . PASS FR=0.5;HP=5;NF=2;NR=2;PP=100.0;SC=ATTGCATTTTCTGTGTGTGTG;TC=21;TR=4 GT:GL:GQ 0/1:-96.78,-48.19,-99.13:100 +20 2643833 . G GAAATGCAAT . PASS FR=0.5;HP=4;NF=9;NR=2;PP=100.0;SC=TGGTATTCCAGAAATGCAATG;TC=31;TR=11 GT:GL:GQ 0/1:-379.88,-109.48,-180.95:100 +20 2650007 . T TACACACACACACACACAC . PASS FR=1.0;HP=1;NF=3;NR=1;PP=100.0;SC=ACCCTTTTCTTACACACACAC;TC=19;TR=4 GT:GL:GQ 1/1:-231.82,-84.82,-75.66:76 +20 2650235 . C CT . PASS FR=1.0;HP=9;NF=12;NR=9;PP=100.0;SC=TTTATTGGGCCTTTTTTTTTG;TC=28;TR=21 GT:GL:GQ 1/1:-325.44,-296.08,-289.77:79 +20 2656886 . AT A . PASS FR=1.0;HP=6;NF=17;NR=6;PP=100.0;SC=ATAAATAATAATTTTTTAAAA;TC=29;TR=23 GT:GL:GQ 1/1:-339.94,-246.4,-231.12:100 +20 2663020 . G GGAA . PASS FR=1.0;HP=1;NF=8;NR=7;PP=100.0;SC=AAGAGGAAGAGGAAGAAGACA;TC=28;TR=15 GT:GL:GQ 1/1:-408.26,-206.61,-189.41:100 +20 2665268 . TA T . PASS FR=1.0;HP=8;NF=2;NR=1;PP=43.0;SC=TATGCAGCCATAAAAAAATGA;TC=4;TR=3 GT:GL:GQ 1/1:-20.74,-4.04,-1.38:43 +20 2665956 . AG A . PASS FR=1.0;HP=1;NF=9;NR=5;PP=100.0;SC=CCCAGGCTATAGTGCAGTGGC;TC=16;TR=14 GT:GL:GQ 1/1:-156.94,-33.67,-23.62:84 +20 2666401 . TA T . PASS FR=0.5;HP=2;NF=8;NR=7;PP=100.0;SC=ACTTTTCTATTAAGAAACGCA;TC=38;TR=15 GT:GL:GQ 0/1:-158.74,-28.32,-160.06:100 +20 2668149 . A ATG . PASS FR=0.5;HP=2;NF=1;NR=2;PP=100.0;SC=ATATATATATATGTGTGTGTG;TC=17;TR=3 GT:GL:GQ 0/1:-54.4,-18.57,-68.0:100 +20 2671350 . GTA G . PASS FR=1.0;HP=2;NF=8;NR=5;PP=100.0;SC=ATATATATGTGTATATATATA;TC=23;TR=13 GT:GL:GQ 1/1:-348.62,-348.37,-348.16:60 +20 2676135 . C CAG . PASS FR=0.5;HP=1;NF=6;NR=2;PP=100.0;SC=TGCTGGGATGCAGAGGGCTTC;TC=17;TR=8 GT:GL:GQ 0/1:-189.45,-108.27,-131.01:100 +20 2678198 . A AAAAG . PASS FR=1.0;HP=10;NF=1;NR=2;PP=100.0;SC=CTCAAAAAAAAAAAGAAAGAA;TC=16;TR=3 GT:GL:GQ 1/1:-113.89,-62.27,-58.08:51 +20 2691794 . AAAT A . PASS FR=1.0;HP=3;NF=2;NR=4;PP=100.0;SC=ACCCTGTCTAAAATAATAATA;TC=12;TR=6 GT:GL:GQ 1/1:-83.97,-10.76,-5.22:69 +20 2713483 . C CAG . PASS FR=0.5;HP=2;NF=7;NR=1;PP=100.0;SC=TTTTTTGAGACGGAATTATAA;TC=28;TR=8 GT:GL:GQ 0/1:-114.91,-36.16,-205.08:100 +20 2717474 . A ACAAAGGTCTC . PASS FR=1.0;HP=2;NF=9;NR=5;PP=100.0;SC=AGTCATAAGGACAAAGGACCC;TC=17;TR=14 GT:GL:GQ 1/1:-343.26,-32.05,-17.5:94 +20 2724519 . AG A . PASS FR=0.5;HP=3;NF=6;NR=7;PP=100.0;SC=CCAGATATTTAGGGTGTCCAT;TC=28;TR=13 GT:GL:GQ 0/1:-149.48,-35.03,-149.61:100 +20 2734607 . C CCCCCTTGGTTTTGAAACTTT . PASS FR=1.0;HP=4;NF=2;NR=4;PP=100.0;SC=TCTGTGGGCACCCCCTTGGGC;TC=12;TR=6 GT:GL:GQ 1/1:-301.3,-108.37,-98.31:100 +20 2742852 . C CCAGCAATCCTCAGT . PASS FR=0.5;HP=1;NF=1;NR=5;PP=100.0;SC=CTCAATAGCACCTGAGGATGA;TC=16;TR=6 GT:GL:GQ 0/1:-233.59,-35.77,-130.91:100 +20 2766949 . C CT . PASS FR=1.0;HP=10;NF=5;NR=10;PP=100.0;SC=ACTTCATTCCCTTTTTTTTTT;TC=28;TR=15 GT:GL:GQ 1/1:-134.68,-37.76,-21.4:100 +20 2782855 . AC A . PASS FR=1.0;HP=4;NF=3;NR=8;PP=100.0;SC=AATCACTTGTACCCCGGGGGC;TC=25;TR=11 GT:GL:GQ 1/1:-262.64,-187.36,-174.92:100 +20 2789088 . AC A . PASS FR=1.0;HP=9;NF=1;NR=4;PP=100.0;SC=CAAAAAAAAAACCAAAAAACA;TC=13;TR=5 GT:GL:GQ 1/1:-119.81,-36.46,-27.82:89 +20 2796485 . C CCTTTT . PASS FR=0.5;HP=4;NF=1;NR=4;PP=100.0;SC=CATCAGGCCCCCTTTTCTCCT;TC=18;TR=5 GT:GL:GQ 0/1:-128.25,-42.55,-123.81:100 +20 2797764 . AG A . PASS FR=1.0;HP=3;NF=1;NR=4;PP=100.0;SC=CTGCCTTGGCAGGGCCCAGAC;TC=14;TR=5 GT:GL:GQ 1/1:-134.46,-67.08,-59.42:63 +20 2834884 . T TAC . PASS FR=0.5;HP=1;NF=2;NR=1;PP=100.0;SC=ACCCCGTCTCTACACACACAC;TC=22;TR=3 GT:GL:GQ 0/1:-64.62,-28.32,-80.82:100 +20 2849974 . AT A . PASS FR=0.5;HP=10;NF=4;NR=6;PP=99.0;SC=TTGGTTTGCAATTTTTTTTTT;TC=36;TR=10 GT:GL:GQ 0/1:-66.95,-34.01,-107.66:100 +20 2850721 . ACT A . PASS FR=0.5;HP=1;NF=4;NR=4;PP=100.0;SC=CCAGTGAAAGACTCTTGGGGT;TC=17;TR=8 GT:GL:GQ 0/1:-88.06,-17.99,-74.67:100 +20 2858849 . GT G . PASS FR=0.5;HP=8;NF=1;NR=5;PP=52.0;SC=GACAGCTGTAGTTTTTTTTAA;TC=15;TR=6 GT:GL:GQ 0/1:-33.96,-11.94,-50.39:98 +20 2867547 . AT A . PASS FR=0.5;HP=6;NF=5;NR=6;PP=100.0;SC=AAATAAAAAAATGTAGTATCT;TC=32;TR=11 GT:GL:GQ 0/1:-115.49,-28.1,-161.94:100 +20 2880787 . C CCT . PASS FR=0.5;HP=1;NF=4;NR=5;PP=100.0;SC=GAAAAATCTGCCTCCTTTTTT;TC=27;TR=9 GT:GL:GQ 0/1:-140.77,-68.5,-172.28:100 +20 2890657 . C CAT . PASS FR=0.5003;HP=1;NF=2;NR=1;PP=100.0;SC=TATCATATATCATATATAATC;TC=5;TR=3 GT:GL:GQ 0/1:-44.82,-3.47,-10.33:32 +20 2890805 . CAT C . PASS FR=0.5017;HP=1;NF=1;NR=6;PP=100.0;SC=TACTATACGTCATATATAATA;TC=9;TR=7 GT:GL:GQ 0/1:-87.98,-14.06,-19.03:24 +20 2894312 . CTTATT C . PASS FR=0.5;HP=4;NF=3;NR=5;PP=100.0;SC=GTGCTGTGTTCTTATTTTATC;TC=22;TR=8 GT:GL:GQ 0/1:-141.94,-29.98,-159.98:100 +20 2896142 . T TTATC . PASS FR=1.0;HP=2;NF=9;NR=10;PP=100.0;SC=TAAGAGTTCTTTATTCTGATA;TC=30;TR=19 GT:GL:GQ 1/1:-399.17,-94.52,-74.73:100 +20 2912364 . T TTG . PASS FR=0.5004;HP=1;NF=1;NR=1;PP=75.0;SC=GGGTCTTGGCTTGTGTGTGTG;TC=20;TR=2 GT:GL:GQ 0/1:-121.99,-92.59,-99.11:31 +20 2926228 . GGTGTGTGT G . PASS FR=0.5;HP=1;NF=1;NR=9;PP=100.0;SC=ATAATTGGCAGGTGTGTGTGT;TC=27;TR=10 GT:GL:GQ 0/1:-233.62,-33.54,-77.33:100 +20 2937307 . AAAATAAAT A . PASS FR=0.5;HP=4;NF=3;NR=3;PP=100.0;SC=TCAGTAAATAAAAATAAATAA;TC=17;TR=6 GT:GL:GQ 0/1:-165.86,-12.93,-101.78:100 +20 2950624 . T TAATA,TAATAAATAAATA . PASS FR=0.5,0.5;HP=5;NF=5,2;NR=2,2;PP=100.0,100.0;SC=TCTAAATAAATAATAAATAAA;TC=24;TR=7,4 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 2966530 . CTTGTTTGT CTTGT,C . PASS FR=0.5,0.5;HP=2;NF=1,1;NR=2,1;PP=100.0,27.0;SC=CAGCTGTCTCCTTGTTTGTTT;TC=22;TR=3,2 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:80 +20 2973326 . T TTTAGGGTTTTTC . PASS FR=0.5;HP=4;NF=1;NR=5;PP=100.0;SC=CATATCCAAATATTACGATTC;TC=15;TR=6 GT:GL:GQ 0/0:-275.74,-159.4,-213.4:3 +20 2977781 . CATAT C . PASS FR=0.5;HP=5;NF=3;NR=6;PP=100.0;SC=TGTGAGAAAACATATGTGGGA;TC=26;TR=9 GT:GL:GQ 0/1:-131.98,-30.22,-206.04:100 +20 2979576 . T TTATTA . PASS FR=0.5;HP=2;NF=2;NR=5;PP=100.0;SC=TATTTATAATTTATTATATAT;TC=21;TR=7 GT:GL:GQ 0/1:-148.89,-17.32,-97.42:100 +20 2982245 . CT C . PASS FR=0.5;HP=3;NF=8;NR=4;PP=100.0;SC=CTGTGGAAATCTTATGTGAAG;TC=27;TR=12 GT:GL:GQ 0/1:-126.56,-21.8,-132.46:100 +20 2982823 . CA C . PASS FR=1.0;HP=7;NF=10;NR=9;PP=100.0;SC=TTCCATCTGACAAAAAATTGG;TC=21;TR=19 GT:GL:GQ 1/1:-196.74,-95.2,-82.42:100 +20 2989926 . AT A . PASS FR=0.5;HP=10;NF=2;NR=5;PP=29.0;SC=GAGTTGTGTGATTTTTTTTTT;TC=36;TR=7 GT:GL:GQ 0/1:-66.0,-49.11,-118.97:76 +20 3005541 . TC T . PASS FR=0.5;HP=5;NF=7;NR=7;PP=100.0;SC=AGCAGTTTTTTCTGTAAGAGC;TC=32;TR=14 GT:GL:GQ 0/1:-167.85,-53.03,-186.47:100 +20 3007694 . A AGGT . PASS FR=0.5;HP=3;NF=4;NR=5;PP=100.0;SC=CCAGGGCCTGAGGTGGGAGCA;TC=22;TR=9 GT:GL:GQ 0/1:-162.22,-42.91,-117.4:100 +20 3012419 . C CTGTT . PASS FR=0.5;HP=2;NF=5;NR=3;PP=100.0;SC=CCTCCTTACTCTGTGTGTTTT;TC=26;TR=8 GT:GL:GQ 0/1:-154.4,-24.26,-143.38:100 +20 3022136 . GAATT G . PASS FR=0.5;HP=7;NF=8;NR=1;PP=100.0;SC=AAAAGAAAAAGAATTAATTAA;TC=20;TR=9 GT:GL:GQ 1/0:-190.17,-78.0,-90.9:100 +20 3039218 . GT G . PASS FR=1.0;HP=5;NF=12;NR=13;PP=100.0;SC=TGTTGTTGTTGTTTGTTTGTT;TC=29;TR=25 GT:GL:GQ 1/1:-226.7,-48.88,-31.11:100 +20 3042034 . T TA . PASS FR=1.0;HP=10;NF=5;NR=14;PP=100.0;SC=AAGACACTGATAAAAAAAAAT;TC=25;TR=19 GT:GL:GQ 1/1:-125.74,-31.3,-15.65:100 +20 3047853 . A ATTCCCCCATT . PASS FR=0.5;HP=2;NF=6;NR=1;PP=100.0;SC=ACTCCCTCTCATTCCCCCATT;TC=20;TR=7 GT:GL:GQ 0/1:-258.31,-36.83,-99.91:100 +20 3050529 . A AT . PASS FR=0.5;HP=10;NF=4;NR=1;PP=23.0;SC=GCAAAAAAAAAAATTTTTATT;TC=22;TR=5 GT:GL:GQ 0/1:-257.11,-262.46,-292.84:73 +20 3050531 . A ATTT,T . PASS FR=0.5,0.5;HP=10;NF=3,13;NR=0,6;PP=97.0,100.0;SC=AAAAAAAAAAATTTTTATTTT;TC=22;TR=3,19 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 3051123 . A AT . PASS FR=0.5;HP=6;NF=2;NR=1;PP=69.0;SC=TCAAGAAAAAAATATATATAT;TC=17;TR=3 GT:GL:GQ 0/1:-107.95,-81.12,-160.4:100 +20 3058938 . C CTT . PASS FR=1.0;HP=2;NF=19;NR=9;PP=100.0;SC=ACTGGATACTCTGAACTCCTA;TC=30;TR=28 GT:GL:GQ 1/1:-404.4,-115.7,-94.26:100 +20 3060201 . C CAAT . PASS FR=0.5;HP=4;NF=13;NR=9;PP=100.0;SC=ACAAAGTCAACAATAATTCAT;TC=44;TR=22 GT:GL:GQ 0/1:-325.42,-43.13,-189.79:100 +20 3062903 . T TC . PASS FR=0.5;HP=3;NF=1;NR=5;PP=94.0;SC=TCCAGGCCTTTCCCTCTCTGC;TC=19;TR=6 GT:GL:GQ 0/1:-95.35,-62.58,-147.62:100 +20 3072606 . A AAGG . PASS FR=1.0;HP=5;NF=4;NR=4;PP=100.0;SC=CCAAGTAAAAAAGGGCGGGGG;TC=22;TR=8 GT:GL:GQ 1/1:-220.94,-78.12,-65.62:100 +20 3126086 . CCT TCT,C . PASS FR=0.5,0.5;HP=7;NF=1,1;NR=3,1;PP=8.0,36.0;SC=GCCTTTTTTTCCTTTTTTTTT;TC=19;TR=4,2 GT:GL:GQ 2/1:-1.0,-1.0,-1.0:42 +20 3159346 . C CA . PASS FR=1.0;HP=2;NF=3;NR=12;PP=100.0;SC=GCTGGGACTACGGCATTTACT;TC=15;TR=15 GT:GL:GQ 1/1:-149.15,-11.32,-0.92:87 +20 3161722 . C CAGAT,CAGATAGAT . PASS FR=0.5,0.5;HP=2;NF=2,1;NR=2,2;PP=35.0,42.0;SC=GATAGATAGACAGATAGATAG;TC=18;TR=4,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:99 +20 3161783 . CTA C . PASS FR=1.0;HP=2;NF=9;NR=7;PP=100.0;SC=TTTTATATATCTATATATATA;TC=25;TR=16 GT:GL:GQ 1/1:-263.89,-139.12,-127.54:97 +20 3162560 . CAT C . PASS FR=0.5369;HP=2;NF=1;NR=3;PP=100.0;SC=CACACACACACATGGTCCATG;TC=6;TR=4 GT:GL:GQ 0/1:-84.99,-50.52,-52.5:11 +20 3169476 . T TTTG . PASS FR=0.5;HP=3;NF=5;NR=9;PP=100.0;SC=AATGTTTACTTTTAATAAACT;TC=35;TR=14 GT:GL:GQ 0/1:-273.66,-64.07,-202.46:100 +20 3169541 . A AT . PASS FR=0.5;HP=7;NF=5;NR=9;PP=100.0;SC=AGGATCATAGATTTTTTTCCT;TC=23;TR=14 GT:GL:GQ 0/1:-204.2,-123.3,-145.94:100 +20 3172618 . GACAC G . PASS FR=0.7893;HP=1;NF=3;NR=1;PP=100.0;SC=TTGCTCCCCTGACACACACAC;TC=16;TR=4 GT:GL:GQ 1/1:-154.29,-100.95,-101.25:3 +20 3172771 . C CAT . PASS FR=1.0;HP=1;NF=13;NR=6;PP=100.0;SC=CCGAGACACACGAGTGGTAAT;TC=24;TR=19 GT:GL:GQ 1/1:-267.07,-44.87,-28.98:100 +20 3177159 . T TA . PASS FR=1.0;HP=5;NF=6;NR=3;PP=87.0;SC=CTGTCTCCACTAAAAATACAA;TC=15;TR=9 GT:GL:GQ 1/1:-169.92,-142.98,-139.57:56 +20 3177517 . C CAT . PASS FR=1.0;HP=2;NF=15;NR=10;PP=100.0;SC=TAATAAATAACGTTACTGGAT;TC=26;TR=25 GT:GL:GQ 1/1:-294.64,-37.59,-18.88:100 +20 3188342 . A AAACAACAACAACAAC . PASS FR=0.5;HP=3;NF=2;NR=2;PP=100.0;SC=CTCCATCTCAAAACAACAACA;TC=17;TR=4 GT:GL:GQ 0/1:-131.35,-46.51,-82.74:100 +20 3192138 . T TTTTGTTTGTTTG . PASS FR=0.5;HP=3;NF=3;NR=1;PP=99.0;SC=TTTTGTTTTGTTTTGTTTGTT;TC=17;TR=4 GT:GL:GQ 0/1:-79.23,-33.31,-124.52:100 +20 3192798 . C CAG . PASS FR=0.5;HP=2;NF=2;NR=6;PP=100.0;SC=GCCTGGGTGACAGAGAGAGAG;TC=20;TR=8 GT:GL:GQ 0/1:-108.84,-41.85,-123.5:100 +20 3198551 . G GTT . PASS FR=0.5;HP=2;NF=1;NR=2;PP=63.0;SC=AGTTTTTGTGGGTTTTTTTTT;TC=22;TR=3 GT:GL:GQ 0/1:-111.88,-112.41,-193.71:91 +20 3202220 . GTGGC G . PASS FR=0.5;HP=2;NF=2;NR=5;PP=100.0;SC=TGTCCCGGGTGTGGCTGGCGA;TC=19;TR=7 GT:GL:GQ 0/1:-150.53,-63.82,-136.14:100 +20 3276659 . CT C . PASS FR=1.0;HP=3;NF=5;NR=6;PP=100.0;SC=ACATCGGGAACTTTCGGTTTC;TC=16;TR=11 GT:GL:GQ 1/1:-135.26,-24.21,-14.73:79 +20 3290980 . A AAAAG . PASS FR=0.9998;HP=4;NF=1;NR=1;PP=30.0;SC=AAGAGAAAGAAAAAGAAAGAA;TC=7;TR=2 GT:GL:GQ 1/1:-37.89,-18.65,-17.26:34 +20 3313547 . G GGTGT . PASS FR=1.0;HP=1;NF=1;NR=3;PP=100.0;SC=GTGTGCGTGTGGTGTGTGTGT;TC=20;TR=4 GT:GL:GQ 1/1:-194.22,-148.74,-144.19:56 +20 3314333 . G GT . PASS FR=1.0;HP=10;NF=9;NR=9;PP=100.0;SC=CTTATTAAAGGTTTTTTTTTT;TC=34;TR=18 GT:GL:GQ 1/1:-126.24,-28.85,-19.8:75 +20 3317061 . G GT . PASS FR=1.0;HP=10;NF=5;NR=7;PP=100.0;SC=GTTTTGTTCAGTTTTTTTTTT;TC=20;TR=12 GT:GL:GQ 1/1:-81.13,-22.72,-13.12:80 +20 3318622 . TATAAAATATATAATAC T . PASS FR=0.5;HP=2;NF=3;NR=5;PP=100.0;SC=ATATATAATATATAAAATATA;TC=21;TR=8 GT:GL:GQ 1/0:-309.41,-50.93,-55.49:45 +20 3320964 . AGTTT A . PASS FR=1.0;HP=1;NF=6;NR=12;PP=100.0;SC=AATCATACCTAGTTTGTACTA;TC=22;TR=18 GT:GL:GQ 1/1:-403.07,-167.86,-153.33:100 +20 3320971 . A AC . PASS FR=1.0;HP=1;NF=6;NR=13;PP=100.0;SC=CCTAGTTTGTACTATAAAAAA;TC=19;TR=19 GT:GL:GQ 1/1:-403.07,-261.66,-248.63:100 +20 3323678 . AT A . PASS FR=1.0;HP=5;NF=3;NR=1;PP=100.0;SC=TCTGATGATTATTTCTATTGC;TC=28;TR=4 GT:GL:GQ 1/1:-575.25,-570.95,-570.67:100 +20 3323683 . T TAAA . PASS FR=1.0;HP=1;NF=13;NR=11;PP=100.0;SC=TGATTATTTCTATTGCTGTGC;TC=29;TR=24 GT:GL:GQ 1/1:-597.36,-560.99,-550.34:86 +20 3323709 . T TA . PASS FR=1.0;HP=2;NF=16;NR=21;PP=100.0;SC=CATGTTCATTTGTTAGGTCCC;TC=38;TR=37 GT:GL:GQ 1/1:-694.83,-570.91,-558.14:100 +20 3325237 . TACACACAC T . PASS FR=1.0;HP=2;NF=4;NR=2;PP=100.0;SC=TACACACACATACACACACAC;TC=33;TR=6 GT:GL:GQ 1/1:-276.44,-185.04,-177.42:63 +20 3332481 . TTTTA T . PASS FR=1.0;HP=3;NF=7;NR=10;PP=100.0;SC=GTTTGTGTTATTTTATTTATT;TC=28;TR=17 GT:GL:GQ 1/1:-276.75,-43.8,-27.83:100 +20 3333166 . TCA T . PASS FR=1.0;HP=1;NF=9;NR=10;PP=100.0;SC=TGGCTGTCATTCACATTCCAG;TC=22;TR=19 GT:GL:GQ 1/1:-222.99,-23.7,-9.78:100 +20 3333493 . T TTA . PASS FR=1.0;HP=2;NF=6;NR=7;PP=100.0;SC=TTCAAAATATTTATATATATA;TC=27;TR=13 GT:GL:GQ 1/1:-272.96,-96.81,-86.7:65 +20 3336192 . G GC . PASS FR=1.0;HP=2;NF=5;NR=10;PP=100.0;SC=CTGCACTCCAGCCTGGGTGAC;TC=18;TR=15 GT:GL:GQ 1/1:-163.64,-31.05,-19.12:100 +20 3338276 . G GCTTAT . PASS FR=1.0;HP=1;NF=8;NR=10;PP=100.0;SC=CACCCATCCAGCTTTATCTTT;TC=23;TR=18 GT:GL:GQ 1/1:-329.33,-26.75,-8.74:100 +20 3345587 . C CT . PASS FR=1.0;HP=6;NF=1;NR=10;PP=100.0;SC=CCTTCTTTTCCTTTTTTCTTT;TC=27;TR=11 GT:GL:GQ 1/1:-267.74,-155.91,-141.96:100 +20 3346020 . TTTTATTTA T . PASS FR=1.0;HP=3;NF=7;NR=6;PP=100.0;SC=TTTGATAACATTTTATTTATT;TC=29;TR=13 GT:GL:GQ 1/1:-347.46,-36.68,-23.65:100 +20 3349612 . T TA . PASS FR=1.0;HP=2;NF=8;NR=3;PP=100.0;SC=ACCCCATTTCTCTAAAAATAC;TC=11;TR=11 GT:GL:GQ 1/1:-135.85,-60.43,-52.97:61 +20 3377965 . G GTTTTGTT . PASS FR=1.0;HP=8;NF=3;NR=2;PP=100.0;SC=TTTTTGTTTTGTTTTGTTTTT;TC=16;TR=5 GT:GL:GQ 1/1:-157.49,-62.9,-56.59:79 +20 3378366 . TG T . PASS FR=1.0;HP=10;NF=6;NR=4;PP=100.0;SC=AGATTTTTTTTGGGGGGGGGG;TC=22;TR=10 GT:GL:GQ 1/1:-84.99,-30.32,-19.67:66 +20 3382249 . T TA . PASS FR=1.0;HP=2;NF=7;NR=9;PP=100.0;SC=AATTATTATCTTTCATTCAAT;TC=19;TR=16 GT:GL:GQ 1/1:-178.1,-44.13,-31.76:100 +20 3382515 . TC T . PASS FR=1.0;HP=6;NF=2;NR=10;PP=100.0;SC=TGGGGAGGGCTCCCCCGCCCC;TC=19;TR=12 GT:GL:GQ 1/1:-132.42,-42.62,-32.12:88 +20 3398847 . T TAC . PASS FR=0.5;HP=2;NF=2;NR=1;PP=82.0;SC=AATAACAACATACACACACAC;TC=26;TR=3 GT:GL:GQ 0/1:-87.09,-56.01,-103.69:100 +20 3418279 . TACACACACAC T . PASS FR=0.5;HP=3;NF=2;NR=1;PP=100.0;SC=CACACGAGGGTACACACACAC;TC=17;TR=3 GT:GL:GQ 0/1:-117.7,-66.19,-77.13:50 +20 3419562 . TACAC T . PASS FR=0.5;HP=2;NF=2;NR=2;PP=100.0;SC=TCAAAATACATACACACACAC;TC=29;TR=4 GT:GL:GQ 0/1:-141.17,-79.46,-166.16:100 +20 3426771 . T TC . PASS FR=1.0;HP=1;NF=13;NR=10;PP=100.0;SC=TTGCAGAAACTGACAAAATAG;TC=25;TR=23 GT:GL:GQ 1/1:-297.92,-207.29,-192.68:100 +20 3439128 . AT A . PASS FR=1.0;HP=4;NF=4;NR=3;PP=100.0;SC=TGTCTCAAAAATATATATATA;TC=13;TR=7 GT:GL:GQ 1/1:-127.06,-48.08,-43.43:57 +20 3439712 . CATTTATTTATTT CATTTATTT,C . PASS FR=0.5,0.5;HP=1;NF=2,5;NR=1,1;PP=100.0,100.0;SC=AACATAAAATCATTTATTTAT;TC=23;TR=3,6 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 3441674 . G GA . PASS FR=0.5;HP=7;NF=13;NR=3;PP=100.0;SC=TTCTTATTAGGAAAAAAACCA;TC=23;TR=16 GT:GL:GQ 0/1:-122.74,-20.86,-35.93:68 +20 3456629 . CA C . PASS FR=0.5;HP=8;NF=3;NR=5;PP=100.0;SC=TCCTCACTACCAAAAAAAAGA;TC=22;TR=8 GT:GL:GQ 0/1:-62.73,-25.03,-67.91:100 +20 3462307 . A ATTC . PASS FR=0.5;HP=2;NF=7;NR=2;PP=100.0;SC=TAAATTTTTAATTAAGTTTTC;TC=17;TR=9 GT:GL:GQ 0/1:-213.54,-117.72,-169.88:100 +20 3465413 . G GTTA . PASS FR=0.5;HP=3;NF=4;NR=7;PP=100.0;SC=TATATTTCCAGTTTAGGTCTC;TC=32;TR=11 GT:GL:GQ 0/1:-171.48,-39.39,-198.21:100 +20 3465556 . AATT A . PASS FR=0.5;HP=3;NF=3;NR=3;PP=100.0;SC=TGGATTTTAAAATTATTATTA;TC=23;TR=6 GT:GL:GQ 0/1:-128.2,-26.49,-64.94:100 +20 3467027 . TTTTCC T . PASS FR=0.5;HP=3;NF=3;NR=10;PP=100.0;SC=GTTGTTTTTCTTTTCCTTTTT;TC=35;TR=13 GT:GL:GQ 0/1:-205.57,-36.22,-212.27:100 +20 3468732 . AT A . PASS FR=0.5;HP=1;NF=7;NR=3;PP=100.0;SC=GTTGGCTAACATGTTCCCTGC;TC=24;TR=10 GT:GL:GQ 0/1:-129.57,-23.07,-107.21:100 +20 3472426 . T TA . PASS FR=0.5;HP=1;NF=4;NR=5;PP=100.0;SC=CCCCAAAACTTATCTAAGTAT;TC=30;TR=9 GT:GL:GQ 0/1:-164.9,-36.91,-163.8:100 +20 3473769 . TTGTGTGTGTG TTGTGTGTG,T . PASS FR=0.5,0.5;HP=2;NF=3,2;NR=1,0;PP=100.0,100.0;SC=GTACGTTTGTTTGTGTGTGTG;TC=10;TR=4,2 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 3489906 . C CAG . PASS FR=0.5;HP=3;NF=7;NR=5;PP=100.0;SC=TGTAATGAGTCAAATATTGAA;TC=30;TR=12 GT:GL:GQ 0/1:-218.47,-143.39,-285.84:100 +20 3495915 . T TG . PASS FR=0.5;HP=1;NF=8;NR=2;PP=100.0;SC=GTGTTACCATTCTAGAGATGA;TC=24;TR=10 GT:GL:GQ 0/1:-170.31,-150.44,-250.52:100 +20 3509359 . CTAAAA C . PASS FR=0.5;HP=1;NF=7;NR=9;PP=100.0;SC=CCCCTTGAACCTAAAATAAAA;TC=36;TR=16 GT:GL:GQ 0/1:-259.32,-75.45,-201.38:100 +20 3516100 . GA G . PASS FR=0.5;HP=2;NF=4;NR=5;PP=100.0;SC=AACATTACTTGATAACCTTTC;TC=24;TR=9 GT:GL:GQ 0/1:-89.87,-17.09,-134.48:100 +20 3517232 . T TA . PASS FR=0.5;HP=4;NF=5;NR=10;PP=100.0;SC=TTTATTCATTTAAAAGCAACA;TC=33;TR=15 GT:GL:GQ 0/1:-148.46,-23.56,-134.17:100 +20 3518135 . TTG T . PASS FR=0.5;HP=1;NF=2;NR=7;PP=100.0;SC=TATTTTTTTCTTGTTTTTTTT;TC=24;TR=9 GT:GL:GQ 0/1:-164.48,-76.63,-118.93:100 +20 3520111 . TGAGAAACAGAAA T . PASS FR=0.5;HP=1;NF=6;NR=4;PP=100.0;SC=GTCAAATACTTGAGAAACAGA;TC=30;TR=10 GT:GL:GQ 0/1:-291.42,-56.72,-205.51:100 +20 3533082 . C CTA . PASS FR=0.5;HP=6;NF=5;NR=7;PP=100.0;SC=CCAGATGTCCCCCCCAGTTAA;TC=28;TR=12 GT:GL:GQ 0/1:-172.54,-164.36,-281.23:100 +20 3536203 . CA C . PASS FR=0.5;HP=5;NF=5;NR=1;PP=100.0;SC=TGGTAGACCACAAAACAAAAT;TC=20;TR=6 GT:GL:GQ 0/1:-93.07,-22.5,-78.34:100 +20 3549166 . A AT . PASS FR=0.5;HP=7;NF=6;NR=5;PP=100.0;SC=ACTCAAAAAAAATATATTTCA;TC=27;TR=11 GT:GL:GQ 0/1:-132.66,-26.81,-119.92:100 +20 3550790 . AT A . PASS FR=0.5;HP=10;NF=9;NR=3;PP=100.0;SC=AATTGTCTCAATTTTTTTTTT;TC=36;TR=12 GT:GL:GQ 0/1:-95.8,-54.46,-109.39:100 +20 3554405 . TTTTA T . PASS FR=0.5;HP=3;NF=5;NR=3;PP=100.0;SC=TTTTATTTTATTTTATTTATT;TC=28;TR=8 GT:GL:GQ 0/1:-169.52,-76.02,-126.65:100 +20 3557342 . G GTCTATCTATCTATCTATCTA,GTCTGTCTGTCTATCTA . PASS FR=0.5,0.5;HP=2;NF=0,1;NR=2,1;PP=100.0,100.0;SC=CTGTCTGTCTGTCTATCTATC;TC=14;TR=2,2 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 3577359 . AACTTT A . PASS FR=0.5;HP=3;NF=8;NR=4;PP=100.0;SC=GTTCTCTTAAAACTTTACTTT;TC=28;TR=12 GT:GL:GQ 0/1:-187.21,-26.31,-190.0:100 +20 3587084 . A ACT . PASS FR=0.5;HP=2;NF=5;NR=2;PP=100.0;SC=TTCTCTCTTCACTGTTTCCTG;TC=27;TR=7 GT:GL:GQ 0/1:-175.39,-93.87,-225.08:100 +20 3587106 . TGTG T . PASS FR=0.5;HP=1;NF=4;NR=3;PP=100.0;SC=ATGTGGGACTTGTGGTGCCAC;TC=26;TR=7 GT:GL:GQ 0/1:-197.29,-142.58,-281.02:100 +20 3597598 . AT A . PASS FR=0.5;HP=5;NF=5;NR=7;PP=29.0;SC=CAAGGATCGCATTTTTATCCC;TC=39;TR=12 GT:GL:GQ 0/1:-225.54,-208.64,-370.51:76 +20 3599489 . G GGTT . PASS FR=0.5;HP=1;NF=6;NR=4;PP=100.0;SC=TGGTGGTGGTGGTTTTGTTTC;TC=28;TR=10 GT:GL:GQ 0/1:-173.69,-38.78,-110.57:100 +20 3601166 . T TAC . PASS FR=0.5;HP=1;NF=1;NR=5;PP=100.0;SC=GTACTGGGATTAGGCGTGAGC;TC=23;TR=6 GT:GL:GQ 0/1:-99.56,-38.65,-114.14:100 +20 3607044 . TAAAAA T . PASS FR=0.5;HP=5;NF=6;NR=1;PP=100.0;SC=TTTTCTCTCTTAAAAAGAAAA;TC=23;TR=7 GT:GL:GQ 0/1:-96.17,-24.47,-167.72:100 +20 3608928 . A AAG . PASS FR=0.5;HP=2;NF=6;NR=2;PP=100.0;SC=GAAAACTAGAAAGAAACTTCT;TC=32;TR=8 GT:GL:GQ 0/1:-96.19,-24.02,-201.47:100 +20 3610589 . G GT . PASS FR=0.5;HP=7;NF=7;NR=8;PP=100.0;SC=ATCATTCTGAGTTTTTTTATT;TC=36;TR=15 GT:GL:GQ 0/1:-148.28,-61.67,-123.51:100 +20 3612124 . A AC . PASS FR=0.5;HP=1;NF=5;NR=1;PP=100.0;SC=GTCTGTTGAGACTGTGTCCTA;TC=17;TR=6 GT:GL:GQ 0/1:-86.01,-27.19,-97.39:100 +20 3627840 . C CA . PASS FR=0.5;HP=6;NF=4;NR=7;PP=100.0;SC=CTCAACTGTGCAAAAAACAAA;TC=27;TR=11 GT:GL:GQ 0/1:-99.01,-25.59,-91.79:100 +20 3627925 . A ATTAAC . PASS FR=0.5;HP=2;NF=2;NR=9;PP=100.0;SC=AGTCAGATGAATTGTTTTCAT;TC=29;TR=11 GT:GL:GQ 0/1:-210.42,-38.37,-176.36:100 +20 3635158 . A AT . PASS FR=0.5;HP=2;NF=8;NR=5;PP=100.0;SC=CAAGAAAGCCATAGACCGGAA;TC=23;TR=13 GT:GL:GQ 0/1:-191.76,-111.36,-148.51:100 +20 3642221 . TTC T . PASS FR=1.0;HP=2;NF=12;NR=3;PP=100.0;SC=TCGCCACCATTTCTCCAGAAC;TC=20;TR=15 GT:GL:GQ 1/1:-312.08,-172.82,-161.67:43 +20 3643129 . TC T . PASS FR=1.0;HP=9;NF=4;NR=4;PP=100.0;SC=CGGGGTGGTATCCCCCCCCCA;TC=20;TR=8 GT:GL:GQ 1/1:-89.01,-45.99,-37.4:71 +20 3645120 . AAAAC A . PASS FR=1.0;HP=5;NF=1;NR=4;PP=100.0;SC=TTTTTTTTAAAAAACAAACAA;TC=18;TR=5 GT:GL:GQ 1/1:-88.2,-13.8,-7.58:77 +20 3650540 . A ACACCACC . PASS FR=1.0;HP=1;NF=3;NR=4;PP=100.0;SC=CCAGGCTCTGACAGCAGCCTG;TC=12;TR=7 GT:GL:GQ 1/1:-183.63,-21.64,-13.12:68 +20 3664603 . AG A . PASS FR=1.0;HP=6;NF=3;NR=9;PP=100.0;SC=TTCTGTAGACAGGGGGGTCTC;TC=16;TR=12 GT:GL:GQ 1/1:-110.02,-26.49,-16.31:85 +20 3667748 . C CG . PASS FR=1.0;HP=2;NF=12;NR=5;PP=100.0;SC=AAAGTTCACCCGCCCCCAACT;TC=24;TR=17 GT:GL:GQ 1/1:-221.42,-44.79,-28.21:100 +20 3677095 . T TGCTG . PASS FR=1.0;HP=1;NF=4;NR=13;PP=100.0;SC=GGAGGCCTTCTGCTGGCTGGA;TC=22;TR=17 GT:GL:GQ 1/1:-297.16,-58.83,-44.05:100 +20 3685444 . A AT . PASS FR=1.0;HP=7;NF=6;NR=4;PP=100.0;SC=TTGTTTTTTAATTTTTTTGTA;TC=15;TR=10 GT:GL:GQ 1/1:-93.4,-15.67,-6.68:75 +20 3699376 . AAAAT A . PASS FR=1.0;HP=5;NF=4;NR=2;PP=100.0;SC=CAAAAAATAAAAAATAAATAA;TC=21;TR=6 GT:GL:GQ 1/1:-124.16,-19.34,-11.28:66 +20 3700024 . TTTAC T . PASS FR=0.5;HP=2;NF=3;NR=4;PP=100.0;SC=TATTTATTTATTTACTTACTT;TC=22;TR=7 GT:GL:GQ 0/1:-142.54,-24.82,-34.29:44 +20 3702676 . C CT . PASS FR=1.0;HP=9;NF=9;NR=6;PP=100.0;SC=ATATGTTGAACTTTTTTTTTA;TC=20;TR=15 GT:GL:GQ 1/1:-102.25,-23.87,-11.51:100 +20 3703373 . GAATA G . PASS FR=1.0;HP=3;NF=3;NR=4;PP=100.0;SC=TATACATGGAGAATAAATAAA;TC=24;TR=7 GT:GL:GQ 1/1:-129.84,-26.73,-19.11:63 +20 3705235 . G GGAAA . PASS FR=1.0;HP=3;NF=3;NR=2;PP=100.0;SC=AAGAAAGAAAGGAAAGAAATA;TC=24;TR=5 GT:GL:GQ 1/1:-319.51,-157.83,-145.36:98 +20 3717704 . AAAATAAATAAATAAAT AAAATAAATAAAT,A . PASS FR=0.5,0.5;HP=4;NF=1,0;NR=1,2;PP=100.0,55.0;SC=CTCTGCCTCAAAAATAAATAA;TC=12;TR=2,2 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 3719488 . AGT A . PASS FR=0.5;HP=2;NF=4;NR=6;PP=100.0;SC=TCTGTGAGTGAGTGTGTGTGT;TC=28;TR=10 GT:GL:GQ 0/1:-149.53,-25.54,-102.21:100 +20 3736407 . CCCCCAGCCCAGTGG C . PASS FR=0.5;HP=4;NF=3;NR=1;PP=100.0;SC=AGCTGATCGACCCCCAGCCCA;TC=22;TR=4 GT:GL:GQ 0/1:-177.03,-114.74,-207.47:100 +20 3740620 . GCA G . PASS FR=1.0;HP=1;NF=4;NR=6;PP=100.0;SC=ACTCACACATGCACACACACA;TC=17;TR=10 GT:GL:GQ 1/1:-154.32,-36.11,-25.75:86 +20 3751453 . G GT . PASS FR=1.0;HP=6;NF=1;NR=1;PP=100.0;SC=CAAACACACGGTTTTTTGTTT;TC=25;TR=2 GT:GL:GQ 1/1:-234.3,-199.49,-191.92:62 +20 3752464 . A AACAC,AACACAC . PASS FR=0.5,0.5;HP=3;NF=4,3;NR=3,3;PP=100.0,100.0;SC=AAAAAGAGAAAACACACACAC;TC=29;TR=7,6 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 3755004 . G GACA . PASS FR=1.0;HP=2;NF=1;NR=7;PP=100.0;SC=GACAGAGTGAGACATCTCATA;TC=13;TR=8 GT:GL:GQ 1/1:-134.63,-25.28,-17.61:63 +20 3768789 . A AAAAG . PASS FR=0.5;HP=8;NF=4;NR=3;PP=100.0;SC=ATCTCAAAAAAAAAGAAAGAA;TC=28;TR=7 GT:GL:GQ 0/1:-141.47,-38.74,-119.72:100 +20 3770324 . T TAATAATA . PASS FR=0.5;HP=8;NF=1;NR=2;PP=29.0;SC=GGCCAAAAAATAATAATAAAT;TC=11;TR=3 GT:GL:GQ 0/1:-67.44,-43.02,-52.14:42 +20 3774219 . AATTTT A . PASS FR=0.5;HP=1;NF=2;NR=3;PP=100.0;SC=GGTTTTAGAGAATTTTATTTT;TC=20;TR=5 GT:GL:GQ 0/1:-126.4,-91.22,-154.58:100 +20 3775162 . GTT G . PASS FR=0.5;HP=10;NF=3;NR=6;PP=100.0;SC=TCTCGGGGCAGTTTTTTTTTT;TC=26;TR=9 GT:GL:GQ 0/1:-103.9,-68.26,-117.09:100 +20 3776005 . C CA . PASS FR=0.5;HP=8;NF=1;NR=4;PP=23.0;SC=GACTCCATCCCAAAAAAAACA;TC=14;TR=5 GT:GL:GQ 0/1:-145.51,-129.15,-148.62:73 +20 3776021 . AAAC A . PASS FR=0.5;HP=3;NF=3;NR=1;PP=100.0;SC=AAACAAAACAAAACAAAAAGA;TC=21;TR=4 GT:GL:GQ 0/1:-163.41,-119.44,-232.96:100 +20 3780857 . T TGGACTGGAGACCTGGTGCTAG . PASS FR=0.5;HP=6;NF=4;NR=1;PP=100.0;SC=TACTCCCCCCTGGACTGGGGG;TC=10;TR=5 GT:GL:GQ 0/1:-153.98,-19.16,-34.72:70 +20 3786892 . C CT . PASS FR=1.0;HP=4;NF=10;NR=2;PP=100.0;SC=CTTGTCCCTTCTTCTCCCAAT;TC=16;TR=12 GT:GL:GQ 1/1:-171.33,-64.44,-53.38:92 +20 3787614 . CAT C . PASS FR=1.0;HP=2;NF=11;NR=13;PP=100.0;SC=AGTGCACACACATGTCAGGCA;TC=30;TR=24 GT:GL:GQ 1/1:-451.43,-312.17,-297.5:100 +20 3789927 . C CCCG . PASS FR=1.0;HP=2;NF=2;NR=10;PP=100.0;SC=AGTTACCACGCGCTCTCTTTC;TC=17;TR=12 GT:GL:GQ 1/1:-241.99,-120.76,-110.7:78 +20 3790246 . ATATAT A . PASS FR=1.0;HP=8;NF=5;NR=2;PP=92.0;SC=TCAAAAAAAAATATATATATA;TC=14;TR=7 GT:GL:GQ 1/1:-198.37,-176.0,-172.1:52 +20 3795480 . AGGCGTGAGCCACCGCGCCC A . PASS FR=0.5;HP=2;NF=2;NR=2;PP=100.0;SC=CTGGGATTACAGGCGTGAGCC;TC=12;TR=4 GT:GL:GQ 0/1:-109.14,-46.17,-99.46:100 +20 3824585 . TTTTAC T . PASS FR=1.0;HP=3;NF=18;NR=4;PP=100.0;SC=AGATGATTTATTTTACTTTAT;TC=28;TR=22 GT:GL:GQ 1/1:-337.35,-36.39,-16.32:100 +20 3843259 . A AT . PASS FR=0.5;HP=10;NF=3;NR=7;PP=100.0;SC=AGTTTTCCAAATTTTTTTTTT;TC=31;TR=10 GT:GL:GQ 0/1:-80.23,-37.02,-73.45:100 +20 3859483 . TCACACACACA TCA,T . PASS FR=0.5,0.5;HP=1;NF=1,2;NR=1,1;PP=100.0,85.0;SC=TGAGACTCTGTCACACACACA;TC=21;TR=2,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 3860757 . AAAAC A . PASS FR=0.5;HP=4;NF=5;NR=2;PP=100.0;SC=GTCTCTACTAAAAACAAACAA;TC=18;TR=7 GT:GL:GQ 0/1:-108.81,-21.22,-75.5:100 +20 3860858 . GC G . PASS FR=0.5;HP=1;NF=5;NR=1;PP=100.0;SC=AACCCAGGAGGCGGAGCTTGT;TC=16;TR=6 GT:GL:GQ 0/1:-84.65,-31.03,-99.29:100 +20 3865910 . A AGGC . PASS FR=0.5;HP=3;NF=8;NR=4;PP=100.0;SC=TCTGTCACCCAGGCTCAAGTT;TC=27;TR=12 GT:GL:GQ 0/1:-249.42,-106.14,-180.19:100 +20 3873092 . TTTTA T . PASS FR=1.0;HP=5;NF=6;NR=8;PP=100.0;SC=ACTAAATCTTTTTTATTTATT;TC=25;TR=14 GT:GL:GQ 1/1:-225.87,-50.85,-37.99:100 +20 3879882 . AGT A . PASS FR=1.0;HP=1;NF=4;NR=4;PP=100.0;SC=GCAGTGATGTAGTGTAGGCTC;TC=17;TR=8 GT:GL:GQ 1/1:-213.63,-128.83,-121.45:61 +20 3882311 . TTTTG T . PASS FR=1.0;HP=3;NF=15;NR=11;PP=100.0;SC=AAGTCAGTACTTTTGTTTATT;TC=29;TR=26 GT:GL:GQ 1/1:-341.87,-21.25,-0.46:100 +20 3883619 . GACACACACACACACAC G . PASS FR=0.5013;HP=2;NF=4;NR=1;PP=100.0;SC=GATGTGTATAGACACACACAC;TC=14;TR=5 GT:GL:GQ 0/1:-204.43,-28.1,-33.39:25 +20 3885810 . GACTGCACC G . PASS FR=1.0;HP=1;NF=4;NR=7;PP=100.0;SC=CATCGCTTGTGACTGCACCAC;TC=19;TR=11 GT:GL:GQ 1/1:-301.58,-43.69,-32.0:95 +20 3899973 . T TTGA . PASS FR=1.0;HP=3;NF=18;NR=6;PP=100.0;SC=AGAAAAACCCTTGAACATTCC;TC=30;TR=24 GT:GL:GQ 1/1:-376.13,-29.44,-7.6:100 +20 3900864 . T TA . PASS FR=1.0;HP=10;NF=11;NR=11;PP=100.0;SC=AAGTTAACCTTAAAAAAAAAA;TC=30;TR=22 GT:GL:GQ 1/1:-160.94,-53.86,-35.6:100 +20 3929292 . G GA . PASS FR=1.0;HP=1;NF=16;NR=6;PP=100.0;SC=TACATACCAGGATAACTGTTG;TC=29;TR=22 GT:GL:GQ 1/1:-330.17,-190.24,-173.09:100 +20 3930806 . T TGACTGG . PASS FR=1.0;HP=2;NF=7;NR=14;PP=100.0;SC=CCTTGTATAGTGATGAATGTG;TC=26;TR=21 GT:GL:GQ 1/1:-450.24,-61.65,-40.95:100 +20 3945171 . A AT . PASS FR=1.0;HP=10;NF=7;NR=12;PP=100.0;SC=TTTTCAAGTAATTTTTTTTTT;TC=29;TR=19 GT:GL:GQ 1/1:-126.38,-32.45,-22.97:79 +20 3956227 . C CA . PASS FR=1.0;HP=5;NF=12;NR=13;PP=100.0;SC=ATTGTGTTCTCAAAAAGATAT;TC=28;TR=25 GT:GL:GQ 1/1:-249.31,-33.1,-13.35:100 +20 3965697 . AACC A . PASS FR=1.0;HP=1;NF=9;NR=9;PP=100.0;SC=GAACAACAACAACCACAACAA;TC=26;TR=18 GT:GL:GQ 1/1:-461.94,-340.35,-326.48:100 +20 3971557 . G GTTCCATGATAACAT . PASS FR=1.0;HP=2;NF=12;NR=8;PP=100.0;SC=ATTTGGCACAGTTCCATGATA;TC=27;TR=20 GT:GL:GQ 1/1:-553.38,-41.98,-23.08:100 +20 3990695 . CACAAACAA C . PASS FR=1.0;HP=1;NF=6;NR=4;PP=100.0;SC=GAGACCCTGTCACAAACAAAC;TC=23;TR=10 GT:GL:GQ 1/1:-176.37,-39.86,-31.94:65 +20 3995386 . GCACACA G . PASS FR=1.0;HP=2;NF=1;NR=1;PP=100.0;SC=ACTTGAATGCGCACACACACA;TC=18;TR=2 GT:GL:GQ 1/1:-95.82,-46.66,-41.67:61 +20 4008931 . C CTCTT . PASS FR=1.0;HP=2;NF=1;NR=4;PP=100.0;SC=TCTCATCTCTCTGTCTTTCTC;TC=9;TR=5 GT:GL:GQ 1/1:-127.43,-46.42,-40.22:77 +20 4021562 . C CGA . PASS FR=1.0;HP=2;NF=8;NR=2;PP=100.0;SC=GAAGAGAAAGCGAGAGAGAGA;TC=21;TR=10 GT:GL:GQ 1/1:-216.37,-85.41,-73.73:98 +20 4025709 . TGA T . PASS FR=1.0;HP=2;NF=12;NR=9;PP=100.0;SC=AAATACATAATGAGAGAGAGA;TC=26;TR=21 GT:GL:GQ 1/1:-247.4,-21.57,-4.6:100 +20 4035810 . T TGTTTGTATTACA . PASS FR=1.0;HP=2;NF=10;NR=4;PP=100.0;SC=TAGCTGGGCATGGTGGCGGGT;TC=15;TR=14 GT:GL:GQ 1/1:-361.94,-174.62,-163.57:92 +20 4042278 . A AT . PASS FR=1.0;HP=2;NF=7;NR=15;PP=100.0;SC=AAACACATAAATCTCTCTCTC;TC=29;TR=22 GT:GL:GQ 1/1:-269.48,-66.17,-47.18:100 +20 4044153 . C CA . PASS FR=1.0;HP=6;NF=8;NR=10;PP=100.0;SC=GCCCCAGGGACGGGGGGCTGG;TC=21;TR=18 GT:GL:GQ 1/1:-167.11,-27.75,-13.35:100 +20 4048870 . AGAGTTATCTTGCCTGAG A . PASS FR=0.5;HP=4;NF=9;NR=5;PP=100.0;SC=CACGTGCCCCAGAGTTATCTT;TC=24;TR=14 GT:GL:GQ 1/0:-626.63,-331.02,-449.96:74 +20 4050067 . A AT . PASS FR=1.0;HP=8;NF=14;NR=11;PP=100.0;SC=TAAGTTTTAAATTTTTTTTGT;TC=36;TR=25 GT:GL:GQ 1/1:-400.71,-316.84,-301.94:100 +20 4052527 . A AT . PASS FR=1.0;HP=1;NF=15;NR=9;PP=100.0;SC=CTAAGCATGAAGTGGTCTCAG;TC=27;TR=24 GT:GL:GQ 1/1:-335.51,-240.21,-229.69:88 +20 4057207 . G GT . PASS FR=1.0;HP=3;NF=17;NR=11;PP=100.0;SC=TAGATTATTTGGTTTTTTTTT;TC=40;TR=28 GT:GL:GQ 1/1:-398.27,-278.49,-261.61:100 +20 4057861 . T TTTCC . PASS FR=1.0;HP=4;NF=8;NR=13;PP=100.0;SC=CTGATGATTTTTATGTTTTCT;TC=33;TR=21 GT:GL:GQ 1/1:-430.04,-131.81,-113.85:100 +20 4058335 . T TATTA . PASS FR=1.0;HP=2;NF=14;NR=5;PP=100.0;SC=TTAATATGTTTATTATACATA;TC=19;TR=19 GT:GL:GQ 1/1:-424.99,-369.88,-364.34:69 +20 4060198 . CTCTT C . PASS FR=0.5;HP=3;NF=8;NR=6;PP=100.0;SC=TTCTATTGTTCTCTTTGTTTT;TC=37;TR=14 GT:GL:GQ 0/1:-273.47,-128.98,-306.0:100 +20 4060592 . C CTTTA . PASS FR=0.5;HP=3;NF=4;NR=8;PP=100.0;SC=ATAATTTTTGCTTTATTTATT;TC=31;TR=12 GT:GL:GQ 0/1:-163.9,-38.86,-129.26:100 +20 4070170 . GTA G . PASS FR=0.5;HP=2;NF=3;NR=2;PP=100.0;SC=GTGTGTGTGTGTATATATATA;TC=25;TR=5 GT:GL:GQ 0/1:-276.88,-237.9,-267.79:100 +20 4070252 . A ATGTATATATG . PASS FR=1.0;HP=2;NF=3;NR=1;PP=100.0;SC=GTGTGTATATATGTATATATG;TC=16;TR=4 GT:GL:GQ 1/1:-231.61,-30.38,-18.61:81 +20 4070382 . ATATGTGTGTGTG A . PASS FR=1.0;HP=2;NF=1;NR=2;PP=100.0;SC=ATGTGTATATATATGTGTGTG;TC=25;TR=3 GT:GL:GQ 1/1:-347.8,-231.66,-223.35:51 +20 4070396 . GTGTGTGTGTGTGTATATATATATATA G . PASS FR=0.5;HP=2;NF=4;NR=4;PP=100.0;SC=GTGTGTGTGTGTGTGTGTGTG;TC=18;TR=8 GT:GL:GQ 1/0:-384.34,-235.32,-225.8:62 +20 4071341 . CA C . PASS FR=0.5026;HP=9;NF=5;NR=5;PP=100.0;SC=CTGATTATGGCAAAAAAAAAC;TC=20;TR=10 GT:GL:GQ 0/1:-155.5,-119.13,-123.71:22 +20 4071895 . G GT . PASS FR=0.5;HP=8;NF=3;NR=3;PP=72.0;SC=TGGGACCTTTGTTTTTGCAAA;TC=22;TR=6 GT:GL:GQ 0/1:-127.95,-100.32,-170.75:100 +20 4074739 . G GA . PASS FR=0.5;HP=9;NF=2;NR=4;PP=75.0;SC=ACTACATCTCGAAAAAAAAAG;TC=16;TR=6 GT:GL:GQ 0/1:-104.75,-76.46,-99.49:100 +20 4077346 . ATATTAT A . PASS FR=0.5;HP=1;NF=2;NR=2;PP=100.0;SC=TATGAGGACAATATTATTATT;TC=23;TR=4 GT:GL:GQ 0/1:-62.56,-10.62,-98.18:100 +20 4092195 . G GTCAGCCAGAGAGGCTC . PASS FR=1.0;HP=1;NF=7;NR=5;PP=100.0;SC=AGGTAAGACAGTCAGCCAGAG;TC=21;TR=12 GT:GL:GQ 1/1:-408.88,-45.59,-29.88:100 +20 4092421 . A AT . PASS FR=0.5;HP=4;NF=5;NR=6;PP=100.0;SC=CTGGCAGCAGATTTTCCCTTA;TC=31;TR=11 GT:GL:GQ 0/1:-137.54,-52.61,-154.29:100 +20 4095639 . T TATAC . PASS FR=0.5;HP=2;NF=3;NR=6;PP=100.0;SC=TATATATATATACACACACAT;TC=30;TR=9 GT:GL:GQ 0/1:-239.61,-67.33,-166.02:100 +20 4096614 . T TG . PASS FR=0.5;HP=1;NF=3;NR=8;PP=100.0;SC=TTTGATGGCTTGTGAAGCCCA;TC=42;TR=11 GT:GL:GQ 0/1:-166.13,-48.49,-243.23:100 +20 4099234 . C CTCT . PASS FR=1.0;HP=1;NF=2;NR=7;PP=100.0;SC=CTTCTTCTTCCTCTTCTTCCT;TC=17;TR=9 GT:GL:GQ 1/1:-213.81,-121.18,-113.85:91 +20 4106279 . C CA . PASS FR=1.0;HP=4;NF=9;NR=14;PP=100.0;SC=ATGATCCACCCCCTTGGCCTC;TC=27;TR=23 GT:GL:GQ 1/1:-261.7,-33.57,-14.72:100 +20 4106498 . AC A . PASS FR=0.5;HP=3;NF=4;NR=6;PP=100.0;SC=ACCCGCCACCACGTCAAGCTA;TC=17;TR=10 GT:GL:GQ 0/1:-151.03,-63.2,-86.55:100 +20 4107003 . T TCTAA . PASS FR=0.5;HP=2;NF=4;NR=9;PP=100.0;SC=TGGAGGTAACTCTAGGACATA;TC=28;TR=13 GT:GL:GQ 0/1:-216.14,-60.6,-196.15:100 +20 4108348 . A AC . PASS FR=1.0;HP=3;NF=9;NR=6;PP=100.0;SC=TTCTATGGAAAAGAGCAGTCA;TC=22;TR=15 GT:GL:GQ 1/1:-263.65,-164.58,-152.76:96 +20 4111438 . CA C . PASS FR=1.0;HP=2;NF=13;NR=9;PP=100.0;SC=GGTGATCACACAGGGGCATGG;TC=27;TR=22 GT:GL:GQ 1/1:-393.14,-310.63,-301.96:68 +20 4111530 . T TG . PASS FR=1.0;HP=1;NF=13;NR=14;PP=100.0;SC=CATCAAAACTTGCAGAAGTAT;TC=30;TR=27 GT:GL:GQ 1/1:-576.34,-531.28,-526.81:55 +20 4112367 . TA T . PASS FR=0.5;HP=2;NF=7;NR=2;PP=100.0;SC=AGACTTTAGTTAATAATAATA;TC=25;TR=9 GT:GL:GQ 0/1:-105.53,-48.17,-185.05:100 +20 4124037 . TACAC TAC,T . PASS FR=0.5,0.5;HP=2;NF=0,1;NR=6,6;PP=100.0,100.0;SC=TGTATGTGTATACACACACAC;TC=29;TR=6,7 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 4165244 . C CAG . PASS FR=0.5;HP=3;NF=9;NR=7;PP=100.0;SC=TAAAACTCAACAGTTATATTT;TC=28;TR=16 GT:GL:GQ 0/1:-164.36,-34.34,-133.84:100 +20 4189405 . A AGTGTTCT . PASS FR=1.0;HP=1;NF=8;NR=19;PP=100.0;SC=TGATCACAGAAGTGTTGAATG;TC=31;TR=27 GT:GL:GQ 1/1:-510.65,-52.94,-31.94:100 +20 4193006 . T TA . PASS FR=1.0;HP=9;NF=5;NR=11;PP=100.0;SC=TGTGTTTGATTAAAAAAAAAT;TC=25;TR=16 GT:GL:GQ 1/1:-189.06,-113.86,-103.2:89 +20 4204545 . CAACAGGTTT C . PASS FR=0.5;HP=3;NF=5;NR=5;PP=100.0;SC=TTTCAATTTACAACAGGTTTA;TC=29;TR=10 GT:GL:GQ 0/1:-264.93,-66.16,-208.86:100 +20 4210072 . T TA . PASS FR=0.5;HP=5;NF=7;NR=3;PP=100.0;SC=GGAAGGAAGATGGGGGCGAGT;TC=33;TR=10 GT:GL:GQ 0/1:-169.78,-122.55,-232.56:100 +20 4211685 . T TTTTCTTTC . PASS FR=1.0;HP=4;NF=3;NR=1;PP=100.0;SC=CTTTCTTTCTTTTTCTTTCTT;TC=17;TR=4 GT:GL:GQ 1/1:-163.69,-62.85,-59.76:50 +20 4222606 . TG T,AG . PASS FR=0.5,0.5;HP=2;NF=14,3;NR=8,0;PP=72.0,7.0;SC=CAGCACAGCCTGATGGCTCTG;TC=29;TR=22,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:41 +20 4223993 . CG C . PASS FR=1.0;HP=4;NF=10;NR=1;PP=100.0;SC=CTGGGCTCCTCGGGGCATCCG;TC=14;TR=11 GT:GL:GQ 1/1:-180.73,-119.68,-111.91:64 +20 4255571 . TGAAA T . PASS FR=1.0;HP=1;NF=5;NR=4;PP=100.0;SC=AGGTATGCTCTGAAAGGAAGA;TC=15;TR=9 GT:GL:GQ 1/1:-155.75,-66.2,-58.38:79 +20 4260218 . C CA . PASS FR=0.5;HP=3;NF=1;NR=9;PP=100.0;SC=CTGGTCTCCCCAGCATCTAGT;TC=27;TR=10 GT:GL:GQ 0/1:-138.73,-38.26,-150.01:100 +20 4280077 . G GTGA . PASS FR=0.5;HP=1;NF=2;NR=4;PP=100.0;SC=GATGTCTTTGGTGATGATGAT;TC=23;TR=6 GT:GL:GQ 0/1:-118.58,-26.45,-67.22:100 +20 4300671 . G GT . PASS FR=1.0;HP=9;NF=9;NR=7;PP=100.0;SC=TATTTTTTAAGTTTTTTTTTC;TC=22;TR=16 GT:GL:GQ 1/1:-112.49,-30.96,-17.5:100 +20 4305010 . C CCTGT . PASS FR=1.0;HP=1;NF=9;NR=14;PP=100.0;SC=AGGTTTGGCTCCTGTCTGACA;TC=27;TR=23 GT:GL:GQ 1/1:-478.98,-124.12,-105.32:100 +20 4306264 . GT G . PASS FR=0.5;HP=3;NF=7;NR=4;PP=100.0;SC=ACAATATAAGGTTTACTTCAA;TC=24;TR=11 GT:GL:GQ 0/1:-115.0,-27.63,-111.62:100 +20 4310291 . T TC . PASS FR=1.0;HP=1;NF=20;NR=9;PP=100.0;SC=CTCCTACGTGTCATGCCAGCT;TC=32;TR=29 GT:GL:GQ 1/1:-333.81,-66.33,-44.4:100 +20 4310977 . GC G . PASS FR=0.5;HP=1;NF=14;NR=6;PP=100.0;SC=CCTGAAACTGGCGTAATTTAT;TC=41;TR=20 GT:GL:GQ 0/1:-231.9,-39.91,-159.66:100 +20 4321071 . A AG . PASS FR=0.5;HP=5;NF=3;NR=2;PP=100.0;SC=AAGTCAAATCAGGGGGAGGAA;TC=19;TR=5 GT:GL:GQ 0/1:-50.11,-15.88,-71.26:100 +20 4322091 . CA C . PASS FR=0.5;HP=1;NF=11;NR=7;PP=100.0;SC=GCCGTGTGTCCAGCCAAAACT;TC=33;TR=18 GT:GL:GQ 0/1:-210.17,-46.06,-156.61:100 +20 4329185 . TC T . PASS FR=0.5;HP=1;NF=8;NR=2;PP=100.0;SC=AATTCTAGGTTCTTTCTCTCA;TC=28;TR=10 GT:GL:GQ 0/1:-148.46,-71.81,-182.2:100 +20 4330761 . GGTGTGTGT G . PASS FR=1.0;HP=3;NF=1;NR=3;PP=100.0;SC=TAATTCATGGGGTGTGTGTGT;TC=30;TR=4 GT:GL:GQ 1/1:-224.07,-44.24,-35.58:72 +20 4332044 . TG T . PASS FR=1.0;HP=6;NF=5;NR=2;PP=57.0;SC=TTTGTTTTTTTGTTTTTTTTT;TC=24;TR=7 GT:GL:GQ 1/1:-226.96,-113.86,-100.61:42 +20 4343821 . TA T . PASS FR=0.5;HP=8;NF=5;NR=8;PP=100.0;SC=CATTTTTTTTTAAAATTTTTG;TC=35;TR=13 GT:GL:GQ 1/0:-274.8,-111.87,-90.41:100 +20 4349378 . A AT . PASS FR=0.5;HP=3;NF=11;NR=7;PP=100.0;SC=TTTTGAAGGCATTTCCAGGGT;TC=27;TR=18 GT:GL:GQ 0/1:-181.47,-28.52,-69.89:100 +20 4366637 . AAAAC A . PASS FR=1.0;HP=3;NF=8;NR=10;PP=100.0;SC=AAAACAAAACAAAACAAACAA;TC=29;TR=18 GT:GL:GQ 1/1:-255.42,-38.69,-23.59:100 +20 4378952 . A AAAC . PASS FR=1.0;HP=2;NF=5;NR=8;PP=100.0;SC=CAAAACAAACAAACAACAACA;TC=26;TR=13 GT:GL:GQ 1/1:-242.03,-34.58,-19.38:100 +20 4380979 . CACAT C . PASS FR=1.0;HP=2;NF=6;NR=6;PP=100.0;SC=CACACACACACACATACAAGC;TC=29;TR=12 GT:GL:GQ 1/1:-310.99,-41.83,-21.18:100 +20 4381267 . T TGTGTATTGTGGA . PASS FR=1.0;HP=2;NF=4;NR=9;PP=100.0;SC=GACAGCCTCCTTCAACAAAAA;TC=23;TR=13 GT:GL:GQ 1/1:-573.3,-462.6,-447.82:96 +20 4381268 . TC T . PASS FR=1.0;HP=1;NF=4;NR=9;PP=100.0;SC=ACAGCCTCCTTCAACAAAAAA;TC=27;TR=13 GT:GL:GQ 1/1:-573.3,-567.48,-566.42:96 +20 4384878 . TAGAC T . PASS FR=0.5;HP=4;NF=7;NR=6;PP=100.0;SC=ATGGAAGAAATAGACAGAGAG;TC=32;TR=13 GT:GL:GQ 0/1:-215.18,-58.15,-186.03:100 +20 4390996 . ACT A . PASS FR=0.5;HP=1;NF=5;NR=4;PP=100.0;SC=AACACTCGAGACTCTCCAGCT;TC=25;TR=9 GT:GL:GQ 0/1:-160.6,-43.63,-115.25:100 +20 4392384 . T TTG . PASS FR=0.5;HP=1;NF=2;NR=1;PP=100.0;SC=GGGAATATAGTTGTGTGTGTG;TC=26;TR=3 GT:GL:GQ 0/1:-141.31,-92.22,-156.97:100 +20 4403198 . CGT CGTGT,C . PASS FR=0.5,0.5;HP=2;NF=3,3;NR=2,0;PP=100.0,91.0;SC=TGTGTGTGTGCGTGTGTGTGT;TC=16;TR=5,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 4418283 . TCC T . PASS FR=1.0;HP=5;NF=9;NR=17;PP=100.0;SC=TGAAAAATGCTCCCCAGGTTT;TC=26;TR=26 GT:GL:GQ 1/1:-235.22,-17.92,0.0:100 +20 4422138 . A AAGAGGCAAGGCTTCCCCACATGCTCAGAATGG,G . PASS FR=0.5,0.5;HP=1;NF=2,3;NR=0,5;PP=100.0,87.0;SC=CTACAGAAAGATGATGGAGGT;TC=14;TR=2,8 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:23 +20 4422142 . T TG . PASS FR=1.0;HP=2;NF=8;NR=6;PP=100.0;SC=AGAAAGATGATGGAGGTACTA;TC=19;TR=14 GT:GL:GQ 1/1:-319.37,-289.62,-286.77:23 +20 4427312 . A AGCTTCTAT . PASS FR=0.5;HP=2;NF=1;NR=1;PP=100.0;SC=TGTATAATAGAGTCCAGAGTC;TC=11;TR=2 GT:GL:GQ 1/0:-513.43,-441.06,-437.62:42 +20 4431651 . TA T . PASS FR=0.5;HP=5;NF=9;NR=13;PP=100.0;SC=TCTAGACCCTTAAAAATAACA;TC=34;TR=22 GT:GL:GQ 0/1:-196.04,-30.01,-107.67:100 +20 4438168 . T TTACACAAATGTAACCTATGTAACAA . PASS FR=0.5;HP=1;NF=2;NR=3;PP=100.0;SC=CCTGCACATGTACCCTTGAAC;TC=16;TR=5 GT:GL:GQ 0/1:-418.07,-256.53,-367.22:100 +20 4439599 . GT G . PASS FR=0.5;HP=2;NF=11;NR=12;PP=100.0;SC=TGTGGGGAGAGTTAGCAAGAG;TC=36;TR=23 GT:GL:GQ 0/1:-329.81,-228.22,-300.4:100 +20 4442338 . CTTTATTTTATTTTAT CTTTATTTTAT,C . PASS FR=0.5,0.5;HP=3;NF=2,1;NR=0,3;PP=100.0,100.0;SC=AAGTATCTAACTTTATTTTAT;TC=21;TR=2,4 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 4445547 . T TAA . PASS FR=1.0;HP=1;NF=18;NR=22;PP=100.0;SC=TGTTTCCAGTTGTTATACTTT;TC=39;TR=40 GT:GL:GQ 1/1:-459.22,-244.89,-221.84:100 +20 4452980 . TACAC T . PASS FR=1.0;HP=2;NF=1;NR=2;PP=100.0;SC=TTAATTCTTATACACACACAC;TC=21;TR=3 GT:GL:GQ 1/1:-75.87,-32.41,-30.31:43 +20 4460649 . G GA . PASS FR=0.5;HP=9;NF=5;NR=8;PP=100.0;SC=TTTCCTCGGAGAAAAAAAACA;TC=39;TR=13 GT:GL:GQ 0/1:-191.57,-119.31,-159.65:100 +20 4462152 . GGTCAATGTTATAAACTTTGC G . PASS FR=0.5;HP=2;NF=6;NR=5;PP=100.0;SC=CTACTTCTTGGGTCAATGTTA;TC=18;TR=11 GT:GL:GQ 1/0:-501.72,-174.1,-171.31:67 +20 4462516 . T TTC . PASS FR=0.5;HP=1;NF=16;NR=1;PP=100.0;SC=GGGTTTAAAGTTCTCTAATGA;TC=41;TR=17 GT:GL:GQ 0/1:-181.56,-38.08,-223.18:100 +20 4462799 . C CTT . PASS FR=0.5;HP=1;NF=1;NR=1;PP=100.0;SC=TCTTCTTCGTCCTTTTTTTTT;TC=36;TR=2 GT:GL:GQ 0/1:-520.7,-504.74,-499.84:81 +20 4465737 . TG T . PASS FR=1.0;HP=2;NF=9;NR=18;PP=100.0;SC=CTCCTTGACATGGACTGAGAA;TC=27;TR=27 GT:GL:GQ 1/1:-258.03,-34.15,-15.14:100 +20 4468340 . TA T . PASS FR=0.5;HP=10;NF=5;NR=2;PP=57.0;SC=ATATATATATTAAAAAAAAAA;TC=21;TR=7 GT:GL:GQ 0/1:-41.89,-18.73,-52.45:100 +20 4469569 . C CT . PASS FR=0.5;HP=4;NF=3;NR=6;PP=100.0;SC=CAAGTAAAGACTTTTGATTGT;TC=23;TR=9 GT:GL:GQ 0/1:-113.7,-24.95,-84.55:100 +20 4474613 . GA G . PASS FR=0.5;HP=8;NF=4;NR=6;PP=100.0;SC=ATTAGGAACAGAAAAAAATTA;TC=37;TR=10 GT:GL:GQ 0/1:-311.99,-245.02,-353.92:100 +20 4474629 . A AAAT . PASS FR=0.5;HP=9;NF=11;NR=5;PP=100.0;SC=AATTAAAAAAAAAATATACAC;TC=32;TR=16 GT:GL:GQ 0/1:-322.36,-111.27,-187.62:100 +20 4475883 . AT A . PASS FR=0.5;HP=5;NF=1;NR=3;PP=100.0;SC=AAATATATATATTTTAATATA;TC=14;TR=4 GT:GL:GQ 0/1:-74.26,-40.07,-92.44:100 +20 4481373 . A AG . PASS FR=1.0;HP=1;NF=5;NR=6;PP=100.0;SC=TCTTTTTTCAAGTTTTTAGCT;TC=13;TR=11 GT:GL:GQ 1/1:-84.43,-9.42,-0.46:74 +20 4484587 . T TA . PASS FR=0.5;HP=9;NF=4;NR=9;PP=100.0;SC=TCTCTGATTTTAAAAAAAAAG;TC=46;TR=13 GT:GL:GQ 0/1:-163.36,-92.55,-141.98:100 +20 4487527 . TG T . PASS FR=0.5006;HP=5;NF=8;NR=7;PP=100.0;SC=TACTAGGGGCTGGGGGCAGGG;TC=34;TR=15 GT:GL:GQ 0/1:-421.09,-350.88,-356.92:29 +20 4492336 . C CA . PASS FR=1.0;HP=1;NF=11;NR=14;PP=100.0;SC=ACATTCTTGCCACCTTTGGTA;TC=27;TR=25 GT:GL:GQ 1/1:-281.59,-90.33,-72.03:100 +20 4493592 . C CG . PASS FR=1.0;HP=2;NF=20;NR=17;PP=100.0;SC=GCATTTTGGACATCTCACCCT;TC=39;TR=37 GT:GL:GQ 1/1:-454.89,-182.56,-157.87:100 +20 4497462 . TTA T . PASS FR=0.5;HP=2;NF=2;NR=2;PP=88.0;SC=TAAATCAACTTTATATATATA;TC=14;TR=4 GT:GL:GQ 1/0:-149.41,-117.69,-112.45:46 +20 4500613 . G GC . PASS FR=1.0;HP=2;NF=12;NR=13;PP=100.0;SC=ATGCCCAAGGGTGTCCCAGAG;TC=29;TR=25 GT:GL:GQ 1/1:-293.02,-49.83,-29.64:100 +20 4502874 . CT C . PASS FR=1.0;HP=4;NF=11;NR=7;PP=100.0;SC=TACAGCCCTTCTTGGGAGCCC;TC=24;TR=18 GT:GL:GQ 1/1:-204.97,-36.44,-20.43:100 +20 4512447 . AAAACAAAC AAAAC,A . PASS FR=0.5,0.5;HP=3;NF=3,4;NR=0,1;PP=100.0,100.0;SC=ACTCCATCTCAAAACAAACAA;TC=20;TR=3,5 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 4519983 . GA G . PASS FR=0.5;HP=3;NF=7;NR=13;PP=100.0;SC=TCCAAACTAAGACAGGTATTA;TC=36;TR=20 GT:GL:GQ 0/1:-201.76,-27.24,-148.43:100 +20 4524299 . AGTGTGT A . PASS FR=0.5;HP=3;NF=2;NR=1;PP=100.0;SC=TCTGTGCTTTAGTGTGTGTGT;TC=28;TR=3 GT:GL:GQ 0/1:-144.55,-75.64,-138.78:100 +20 4530940 . CTT C . PASS FR=0.5002;HP=6;NF=2;NR=9;PP=80.0;SC=TTCTTTCTTTCTTTCTCTCTC;TC=25;TR=11 GT:GL:GQ 0/1:-323.77,-294.9,-301.87:33 +20 4541935 . A AGAG . PASS FR=0.5;HP=2;NF=8;NR=4;PP=100.0;SC=GTGGCAGATTAGAGGAGACAT;TC=32;TR=12 GT:GL:GQ 0/1:-211.5,-48.19,-198.54:100 +20 4547067 . G GA . PASS FR=0.5116;HP=10;NF=5;NR=1;PP=100.0;SC=TATAGAGAGAGAAAAAAAAAC;TC=18;TR=6 GT:GL:GQ 0/1:-156.12,-119.31,-122.4:16 +20 4553580 . GT G . PASS FR=0.5;HP=10;NF=1;NR=1;PP=71.0;SC=TTTTGTTTTTGTTTTTGTTTT;TC=17;TR=2 GT:GL:GQ 1/0:-197.42,-152.57,-154.01:100 +20 4553925 . T TC . PASS FR=1.0;HP=1;NF=7;NR=5;PP=100.0;SC=CGGCCCCTCTTCACTTTTAAG;TC=16;TR=12 GT:GL:GQ 1/1:-135.25,-18.29,-7.82:87 +20 4560578 . C CCTTA . PASS FR=1.0;HP=1;NF=11;NR=12;PP=100.0;SC=ATGTTATATACCTTTTAGAGA;TC=32;TR=23 GT:GL:GQ 1/1:-416.23,-42.65,-19.11:100 +20 4566007 . G GC . PASS FR=0.5;HP=1;NF=9;NR=3;PP=100.0;SC=AGCTGGGGCTGACTCATCTGA;TC=27;TR=12 GT:GL:GQ 0/1:-150.18,-87.47,-213.89:100 +20 4572622 . T TA . PASS FR=0.5;HP=1;NF=5;NR=4;PP=100.0;SC=AAAGGGGTGCTAGGAATTCCA;TC=21;TR=9 GT:GL:GQ 0/1:-105.47,-33.77,-107.56:100 +20 4580659 . ATTG A . PASS FR=0.5;HP=3;NF=9;NR=11;PP=100.0;SC=AATAATTTATATTGTTATTAT;TC=41;TR=20 GT:GL:GQ 0/1:-343.69,-136.17,-313.1:100 +20 4580822 . AAC A . PASS FR=0.5;HP=1;NF=7;NR=7;PP=100.0;SC=TATCTTACATAACAGTGTATC;TC=27;TR=14 GT:GL:GQ 0/1:-159.59,-31.47,-183.78:100 +20 4589159 . TAC T . PASS FR=0.5;HP=1;NF=5;NR=5;PP=100.0;SC=CACACACACGTACACACACAC;TC=25;TR=10 GT:GL:GQ 0/1:-134.67,-33.29,-88.29:100 +20 4590266 . T TCTGGCC . PASS FR=0.5;HP=3;NF=3;NR=4;PP=100.0;SC=GCTGGCAGCCTCTGGCCCTGG;TC=20;TR=7 GT:GL:GQ 0/1:-180.62,-56.12,-103.3:100 +20 4613873 . T TATA . PASS FR=0.5;HP=3;NF=6;NR=2;PP=100.0;SC=CTCTTTCTTTTATAATAATAA;TC=26;TR=8 GT:GL:GQ 0/1:-121.23,-16.51,-65.45:100 +20 4616453 . G GAGTAGA . PASS FR=0.5;HP=3;NF=5;NR=7;PP=100.0;SC=CACAGAGTAGGGGTTCAATAA;TC=22;TR=12 GT:GL:GQ 0/1:-211.56,-25.38,-113.94:100 +20 4617264 . G GAGAA . PASS FR=0.5;HP=2;NF=3;NR=1;PP=100.0;SC=GAAAGCAAGAGAGAAAGAAGA;TC=22;TR=4 GT:GL:GQ 0/1:-126.22,-46.88,-138.67:100 +20 4617272 . AG A . PASS FR=0.5;HP=1;NF=1;NR=3;PP=20.0;SC=GAGAGAAAGAAGAGAAGAGAA;TC=22;TR=4 GT:GL:GQ 0/1:-134.04,-119.35,-223.11:66 +20 4617303 . G GAGGA . PASS FR=0.5;HP=2;NF=2;NR=3;PP=100.0;SC=GGGAGGGAGAGAGGAAGGAAG;TC=19;TR=5 GT:GL:GQ 0/1:-154.78,-90.63,-135.29:100 +20 4655424 . G GA . PASS FR=0.5;HP=8;NF=13;NR=4;PP=100.0;SC=GTTCTTTAGAGAAAAAAAGAT;TC=30;TR=17 GT:GL:GQ 0/1:-186.33,-114.25,-152.75:100 +20 4668235 . AT A . PASS FR=0.5;HP=10;NF=12;NR=5;PP=100.0;SC=TAGGAAATAGATTTTTTTTTT;TC=33;TR=17 GT:GL:GQ 0/1:-91.71,-31.87,-60.05:100 +20 4673330 . C CTTT . PASS FR=0.5;HP=5;NF=6;NR=8;PP=100.0;SC=TGAAGAAAATCTTTTCTTCCT;TC=24;TR=14 GT:GL:GQ 0/1:-183.35,-23.94,-71.42:100 +20 4684173 . TG T . PASS FR=0.5;HP=1;NF=5;NR=1;PP=100.0;SC=CAGGCACAGTTGCTCACGCCT;TC=17;TR=6 GT:GL:GQ 0/1:-81.87,-25.35,-94.89:100 +20 4691383 . CA C . PASS FR=1.0;HP=2;NF=14;NR=12;PP=100.0;SC=TGGGGTCATCCAAGCATGGCT;TC=29;TR=26 GT:GL:GQ 1/1:-259.65,-39.57,-19.54:100 +20 4692075 . C CA . PASS FR=0.5;HP=9;NF=5;NR=3;PP=95.0;SC=AGTAATTGGACAAAAAAAACA;TC=26;TR=8 GT:GL:GQ 0/1:-67.83,-34.9,-96.78:100 +20 4704696 . A ATG . PASS FR=0.5;HP=2;NF=5;NR=3;PP=100.0;SC=ATATGTATATATGTGTGTGTA;TC=30;TR=8 GT:GL:GQ 0/1:-168.25,-105.64,-257.19:100 +20 4706654 . GTGCCATCA G . PASS FR=1.0;HP=2;NF=7;NR=4;PP=100.0;SC=TTACAGGTGTGTGCCATCATG;TC=17;TR=11 GT:GL:GQ 1/1:-236.92,-30.58,-21.39:67 +20 4727159 . C CATTTTATTTT . PASS FR=1.0;HP=1;NF=2;NR=4;PP=100.0;SC=ATAGCATTTGCATTTTATTTT;TC=27;TR=6 GT:GL:GQ 1/1:-510.26,-402.24,-397.15:63 +20 4735780 . T TTTCTTTCTTTCTTTCTTTCTTTCTTTC,C . PASS FR=0.5,0.5;HP=3;NF=0,5;NR=3,16;PP=100.0,100.0;SC=CCTTTCTTTCTTTTCTTTCTT;TC=27;TR=3,21 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 4737530 . T TA . PASS FR=1.0;HP=1;NF=11;NR=14;PP=100.0;SC=TTAAATGTATTGAGGCTCATT;TC=26;TR=25 GT:GL:GQ 1/1:-245.38,-21.97,-3.97:100 +20 4737701 . T TTGA . PASS FR=1.0;HP=1;NF=12;NR=7;PP=100.0;SC=ACTTTCTGTCTTGACCTGTCT;TC=19;TR=19 GT:GL:GQ 1/1:-227.02,-18.69,-5.52:100 +20 4741155 . G GGA . PASS FR=1.0;HP=1;NF=5;NR=11;PP=100.0;SC=AACACACCAGGTGTGTCAAAA;TC=22;TR=16 GT:GL:GQ 1/1:-218.41,-31.08,-15.98:100 +20 4743693 . G GTTAA . PASS FR=1.0;HP=2;NF=6;NR=7;PP=100.0;SC=AGCCCAGGAGGTTAAGTCTGC;TC=16;TR=13 GT:GL:GQ 1/1:-225.23,-59.89,-50.88:75 +20 4743774 . A AAAATAAAT . PASS FR=1.0;HP=5;NF=4;NR=3;PP=100.0;SC=AAAAGGAGAAAAAATAAATAA;TC=16;TR=7 GT:GL:GQ 1/1:-319.93,-209.77,-203.54:78 +20 4748739 . A ACTAT . PASS FR=1.0;HP=1;NF=12;NR=7;PP=100.0;SC=TCTTTCACCAACTATTTTCAC;TC=23;TR=19 GT:GL:GQ 1/1:-501.66,-334.66,-319.16:100 +20 4761877 . T TG . PASS FR=0.5;HP=8;NF=1;NR=4;PP=100.0;SC=ACAGATATTTTGGGGGGGGCA;TC=23;TR=5 GT:GL:GQ 0/1:-97.23,-58.4,-90.76:100 +20 4768475 . A AAGGGACT . PASS FR=1.0;HP=2;NF=7;NR=8;PP=100.0;SC=CAGGGGTCCAAAGGCACCTTA;TC=23;TR=15 GT:GL:GQ 1/1:-372.13,-36.56,-17.94:100 +20 4783543 . CATAT C . PASS FR=0.5;HP=2;NF=1;NR=2;PP=100.0;SC=TATATATATACATATATATAT;TC=23;TR=3 GT:GL:GQ 0/1:-115.71,-29.18,-62.14:100 +20 4794428 . CGT C . PASS FR=0.5;HP=3;NF=3;NR=2;PP=100.0;SC=CAGTGTGTGGCGTGTGTGTGT;TC=28;TR=5 GT:GL:GQ 0/1:-119.46,-68.74,-106.78:100 +20 4796034 . TACC T . PASS FR=0.5;HP=1;NF=7;NR=5;PP=100.0;SC=TATCTGAGGCTACCACCACCC;TC=27;TR=12 GT:GL:GQ 0/1:-222.6,-98.55,-189.77:100 +20 4802486 . G GCC . PASS FR=0.5;HP=2;NF=5;NR=4;PP=100.0;SC=GACTGCCACAGCCTAGGCATC;TC=24;TR=9 GT:GL:GQ 0/1:-135.36,-38.11,-126.44:100 +20 4803072 . CT C . PASS FR=0.5;HP=1;NF=1;NR=5;PP=100.0;SC=GTGCACGCAGCTGTTGAGAGG;TC=15;TR=6 GT:GL:GQ 0/1:-82.81,-37.85,-91.55:100 +20 4823348 . AT A . PASS FR=1.0;HP=8;NF=17;NR=7;PP=100.0;SC=AATATTTTCCATTTTTTTTGA;TC=32;TR=24 GT:GL:GQ 1/1:-298.64,-180.3,-160.97:100 +20 4850186 . GAC G . PASS FR=0.5;HP=1;NF=3;NR=2;PP=49.0;SC=ATCTCCAAATGACACACACAC;TC=34;TR=5 GT:GL:GQ 0/1:-186.75,-165.14,-349.63:96 +20 4880132 . AGCTCAATGCCTTCTGC A . PASS FR=1.0;HP=1;NF=3;NR=4;PP=100.0;SC=CAAACGGCGCAGCTCAATGCC;TC=17;TR=7 GT:GL:GQ 1/1:-255.52,-55.88,-53.61:44 +20 4883735 . G GGA . PASS FR=1.0;HP=1;NF=13;NR=18;PP=100.0;SC=GGTGAAAAGAGTAATTCTAAA;TC=34;TR=31 GT:GL:GQ 1/1:-361.9,-346.05,-342.67:97 +20 4886527 . GA G . PASS FR=0.5;HP=3;NF=5;NR=6;PP=100.0;SC=ACTCTACTGAGAAGAACAGAT;TC=19;TR=11 GT:GL:GQ 0/1:-166.67,-86.72,-123.24:100 +20 4892485 . AATTT A . PASS FR=0.5;HP=1;NF=2;NR=7;PP=100.0;SC=TTTATTTATGAATTTATTTAT;TC=34;TR=9 GT:GL:GQ 0/1:-148.07,-23.75,-121.86:100 +20 4922648 . CTAAACTAACT C . PASS FR=0.5;HP=5;NF=1;NR=10;PP=100.0;SC=TCTATATTTTCTAAACTAACT;TC=33;TR=11 GT:GL:GQ 0/1:-284.06,-37.14,-228.78:100 +20 4942899 . C CA . PASS FR=0.5;HP=7;NF=4;NR=3;PP=100.0;SC=ACCCCCGCCCCAAAAAAACAG;TC=28;TR=7 GT:GL:GQ 0/1:-99.42,-46.78,-95.55:100 +20 4947451 . G GTTTGA . PASS FR=0.5;HP=4;NF=4;NR=4;PP=100.0;SC=ACTTTTGATAGTTTTACACAC;TC=18;TR=8 GT:GL:GQ 0/1:-283.81,-185.62,-217.52:100 +20 4947582 . TG T . PASS FR=0.5;HP=4;NF=9;NR=4;PP=100.0;SC=GATTACATGATGGGGAGCAGG;TC=22;TR=13 GT:GL:GQ 0/1:-139.84,-55.72,-119.49:100 +20 4947775 . T TA . PASS FR=0.5;HP=6;NF=8;NR=4;PP=100.0;SC=GAAATCTAAATAAACACAGGG;TC=24;TR=12 GT:GL:GQ 0/1:-128.76,-21.0,-91.02:100 +20 4949766 . CTT C . PASS FR=0.5;HP=3;NF=8;NR=4;PP=100.0;SC=GAGTTTCCCTCTTGTTACCCA;TC=25;TR=12 GT:GL:GQ 0/1:-147.72,-32.95,-112.56:100 +20 4954109 . G GGACTT . PASS FR=0.5;HP=2;NF=4;NR=8;PP=100.0;SC=ATGGCTGGAAGGACTTAACTA;TC=30;TR=12 GT:GL:GQ 0/1:-203.74,-23.32,-169.48:100 +20 4965192 . C CT . PASS FR=0.5;HP=2;NF=5;NR=3;PP=100.0;SC=GAGCAAGACTCTGTCTCAAAA;TC=26;TR=8 GT:GL:GQ 0/1:-134.47,-59.87,-111.38:100 +20 4969015 . AG A . PASS FR=1.0;HP=8;NF=4;NR=5;PP=100.0;SC=TGGGAAACCGAGGGGGGGCCA;TC=12;TR=9 GT:GL:GQ 1/1:-67.79,-12.99,-5.52:61 +20 4970270 . C CTTAATAT . PASS FR=0.5;HP=1;NF=4;NR=1;PP=100.0;SC=TGCAGTGAGCCATGATCTTGC;TC=22;TR=5 GT:GL:GQ 0/1:-247.44,-164.56,-281.24:100 +20 4972366 . TCA TCACACA,T . PASS FR=0.5,0.5;HP=2;NF=1,0;NR=1,2;PP=100.0,49.0;SC=AGACTCCGTTTCACACACACA;TC=15;TR=2,2 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:97 +20 4979252 . ATGAGG A . PASS FR=0.5;HP=1;NF=5;NR=2;PP=100.0;SC=AAATGAATTAATGAGGTGAGG;TC=24;TR=7 GT:GL:GQ 0/1:-146.48,-63.04,-172.38:100 +20 4985646 . A AAAAT . PASS FR=0.5;HP=4;NF=2;NR=1;PP=100.0;SC=CTCCGTCTCAAAAATAAATAA;TC=22;TR=3 GT:GL:GQ 0/1:-69.57,-20.73,-73.7:100 +20 4987193 . T TTTTA . PASS FR=1.0;HP=3;NF=5;NR=7;PP=100.0;SC=GTAAAAGCCATTTTATTTATT;TC=33;TR=12 GT:GL:GQ 1/1:-198.93,-19.38,-8.29:93 +20 5003823 . C CA . PASS FR=1.0;HP=2;NF=2;NR=1;PP=69.0;SC=CTCAGCCTCCCAGTAGCTGGG;TC=5;TR=3 GT:GL:GQ 1/1:-35.46,-12.52,-9.15:55 +20 5006924 . GTATATATATGTGTA G . PASS FR=0.5;HP=2;NF=3;NR=1;PP=100.0;SC=ATGTATATATGTATATATATG;TC=17;TR=4 GT:GL:GQ 0/1:-102.23,-17.74,-69.04:100 +20 5019857 . C CT . PASS FR=1.0;HP=1;NF=5;NR=1;PP=100.0;SC=CACCCCTGCACTCCAGCCTGG;TC=10;TR=6 GT:GL:GQ 1/1:-78.84,-38.79,-34.59:51 +20 5021323 . T TC . PASS FR=1.0;HP=10;NF=8;NR=5;PP=100.0;SC=CTTTTTTTTTTTCAATGGCAA;TC=18;TR=13 GT:GL:GQ 1/1:-164.3,-19.64,-6.44:82 +20 5021471 . G GA . PASS FR=1.0;HP=1;NF=11;NR=14;PP=100.0;SC=ACATAATGCTGGTTAAAGAGG;TC=33;TR=25 GT:GL:GQ 1/1:-406.51,-306.39,-293.23:100 +20 5033824 . G GTATA . PASS FR=1.0;HP=8;NF=6;NR=6;PP=100.0;SC=CCAAAAAAAAGTATATATATA;TC=19;TR=12 GT:GL:GQ 1/1:-293.31,-92.78,-80.65:100 +20 5034013 . GGCAT G . PASS FR=1.0;HP=1;NF=8;NR=10;PP=100.0;SC=ATGACAGCCAGGCATGGGGGC;TC=24;TR=18 GT:GL:GQ 1/1:-275.61,-34.13,-17.26:100 +20 5044461 . A AAATTTTTAT . PASS FR=1.0;HP=4;NF=13;NR=12;PP=100.0;SC=GTTAACTTGGAAAAATTTCTA;TC=29;TR=25 GT:GL:GQ 1/1:-660.59,-158.53,-137.22:100 +20 5058110 . G GGGGGCT . PASS FR=1.0;HP=2;NF=6;NR=6;PP=100.0;SC=CAACATTTTGGGAGGTGGGTG;TC=14;TR=12 GT:GL:GQ 1/1:-206.1,-87.92,-82.33:69 +20 5062840 . AAAG A . PASS FR=1.0;HP=4;NF=12;NR=4;PP=100.0;SC=AATTTTTTAAAAAGAAGAAGA;TC=21;TR=16 GT:GL:GQ 1/1:-217.23,-55.74,-43.97:99 +20 5079870 . AAATAAATAAATCAATC A . PASS FR=0.5;HP=2;NF=4;NR=6;PP=100.0;SC=ATAAATAAATAAATAAATAAA;TC=24;TR=10 GT:GL:GQ 1/0:-419.18,-202.82,-208.38:27 +20 5094493 . T TA . PASS FR=1.0;HP=1;NF=7;NR=16;PP=100.0;SC=AAAATGAACTTACTACTGGAC;TC=26;TR=23 GT:GL:GQ 1/1:-300.98,-148.38,-131.87:100 +20 5097837 . AC A . PASS FR=1.0;HP=1;NF=15;NR=5;PP=100.0;SC=TAAAGGTTATACGCCTAACTT;TC=25;TR=20 GT:GL:GQ 1/1:-243.65,-32.97,-15.65:100 +20 5100990 . AAG A . PASS FR=1.0;HP=1;NF=10;NR=6;PP=100.0;SC=TTGCAGCCTGAAGAGAGTACA;TC=18;TR=16 GT:GL:GQ 1/1:-198.64,-18.46,-5.29:100 +20 5105482 . C CATTTTAGG . PASS FR=1.0;HP=2;NF=6;NR=11;PP=100.0;SC=GTTCAGACCACATGTTATCCA;TC=22;TR=17 GT:GL:GQ 1/1:-471.45,-181.5,-164.38:100 +20 5118209 . A AT . PASS FR=0.5;HP=8;NF=3;NR=2;PP=100.0;SC=TTTAAGTCTTATTTTTTCAAA;TC=16;TR=5 GT:GL:GQ 0/1:-55.51,-21.15,-68.35:100 +20 5145860 . A AC . PASS FR=0.5;HP=5;NF=6;NR=2;PP=100.0;SC=TTTTTTGGAAACCCCCGTATT;TC=29;TR=8 GT:GL:GQ 0/1:-81.29,-28.9,-130.37:100 +20 5150896 . G GC . PASS FR=0.5;HP=3;NF=2;NR=5;PP=100.0;SC=ACCTCGCTGTGCCCAGAGGAG;TC=17;TR=7 GT:GL:GQ 0/1:-79.22,-17.13,-53.13:100 +20 5156258 . CCT C . PASS FR=0.5093;HP=2;NF=6;NR=6;PP=100.0;SC=ATGGTGAAACCCTGTCTCTAC;TC=16;TR=12 GT:GL:GQ 0/1:-101.9,-26.13,-29.44:17 +20 5156432 . AAAAC A . PASS FR=0.5;HP=3;NF=5;NR=3;PP=100.0;SC=ACTCCATCTCAAAACAAACAA;TC=23;TR=8 GT:GL:GQ 0/1:-98.71,-15.69,-97.38:100 +20 5173014 . C CA . PASS FR=1.0;HP=2;NF=8;NR=13;PP=100.0;SC=GAAGGGGGGTCTAGGAAGCCG;TC=22;TR=21 GT:GL:GQ 1/1:-250.84,-61.97,-47.15:100 +20 5178081 . C CCT . PASS FR=0.5;HP=1;NF=5;NR=6;PP=100.0;SC=AGAGGTCAGCCGTGTCTGCCC;TC=22;TR=11 GT:GL:GQ 0/1:-193.35,-72.27,-102.13:100 +20 5181165 . C CA . PASS FR=0.5;HP=8;NF=1;NR=6;PP=91.0;SC=TTAGACACAACAAAAAAGAGA;TC=22;TR=7 GT:GL:GQ 0/1:-61.45,-29.38,-90.08:100 +20 5187401 . A AC . PASS FR=0.5;HP=6;NF=4;NR=3;PP=100.0;SC=TTTTCATGTCACCCCCGAGGT;TC=17;TR=7 GT:GL:GQ 0/1:-139.03,-104.99,-121.15:73 +20 5187831 . G GAATC . PASS FR=0.5;HP=5;NF=5;NR=3;PP=100.0;SC=TGAAAGGAAAGAAGCATGTTT;TC=22;TR=8 GT:GL:GQ 0/1:-144.73,-26.29,-132.63:100 +20 5192127 . A AATT . PASS FR=0.5;HP=3;NF=2;NR=7;PP=100.0;SC=AATGTGTTAAAATTATATAAG;TC=32;TR=9 GT:GL:GQ 0/1:-228.5,-119.37,-283.27:100 +20 5212592 . TA T . PASS FR=1.0;HP=9;NF=20;NR=10;PP=100.0;SC=CCTGCCATATTAAAAAAAAAC;TC=39;TR=30 GT:GL:GQ 1/1:-191.03,-64.37,-41.93:100 +20 5223122 . TA T . PASS FR=0.5;HP=2;NF=2;NR=4;PP=100.0;SC=GAATAAGACCTAGTATTTGCT;TC=11;TR=6 GT:GL:GQ 0/1:-63.8,-25.4,-69.29:100 +20 5234499 . AAC A . PASS FR=0.5;HP=1;NF=1;NR=1;PP=25.0;SC=GTGCCTTCACAACACACACAC;TC=26;TR=2 GT:GL:GQ 0/1:-75.14,-59.09,-216.84:72 +20 5236854 . A AATTAT . PASS FR=1.0;HP=1;NF=17;NR=9;PP=100.0;SC=AAAAGACATGAATTATCATTA;TC=29;TR=26 GT:GL:GQ 1/1:-427.74,-26.55,-5.07:100 +20 5240296 . CT C . PASS FR=0.5;HP=1;NF=7;NR=6;PP=100.0;SC=AATTGATACACTACAATGGCC;TC=39;TR=13 GT:GL:GQ 0/1:-220.75,-129.27,-297.86:100 +20 5242946 . A AC . PASS FR=0.5;HP=3;NF=6;NR=5;PP=100.0;SC=AGCTGGAACCACTGTTGTGGA;TC=22;TR=11 GT:GL:GQ 0/1:-141.29,-37.29,-109.65:100 +20 5246342 . GC G . PASS FR=0.5;HP=7;NF=6;NR=8;PP=100.0;SC=AACCGAGACAGCCCCCCCTTT;TC=21;TR=14 GT:GL:GQ 0/1:-107.74,-25.34,-35.96:49 +20 5247531 . T TTGCAGTAGAGAAACTCCC . PASS FR=0.5;HP=1;NF=3;NR=5;PP=100.0;SC=TTGCAGGTTATTGCAGTAGAG;TC=31;TR=8 GT:GL:GQ 0/1:-296.8,-101.13,-189.63:100 +20 5251109 . ACTCTCTCTCTCTCTCTCT A . PASS FR=0.5;HP=1;NF=3;NR=2;PP=37.0;SC=CATCCAGTGTACTCTCTCTCT;TC=27;TR=5 GT:GL:GQ 0/1:-322.05,-299.54,-356.33:100 +20 5251154 . G GTGTA . PASS FR=0.5;HP=2;NF=1;NR=4;PP=100.0;SC=CTCTGTGTGTGTGTATGTGTG;TC=19;TR=5 GT:GL:GQ 0/1:-297.98,-257.24,-280.47:100 +20 5256228 . GAAAAAC G . PASS FR=0.5;HP=5;NF=8;NR=3;PP=100.0;SC=CAAATGTTTTGAAAAACAAAA;TC=29;TR=11 GT:GL:GQ 0/1:-159.47,-21.9,-134.38:100 +20 5256836 . CT C . PASS FR=0.5;HP=10;NF=4;NR=7;PP=58.0;SC=TCTCAACTCACTTTTTTTTTT;TC=23;TR=11 GT:GL:GQ 0/1:-145.3,-121.72,-154.45:100 +20 5260631 . G GA . PASS FR=0.5;HP=9;NF=6;NR=2;PP=100.0;SC=TTTAATGAAGGAAAAAAAAAT;TC=25;TR=8 GT:GL:GQ 0/1:-133.97,-86.93,-109.55:100 +20 5261161 . ACT A . PASS FR=0.5;HP=2;NF=9;NR=8;PP=100.0;SC=CTTGAATGAAACTTATCTAAC;TC=33;TR=17 GT:GL:GQ 0/1:-246.04,-189.54,-319.81:100 +20 5275657 . CAAAATAACTATTACAAATAACA C . PASS FR=0.5;HP=6;NF=2;NR=1;PP=100.0;SC=TCAAACATAACAAAATAACTA;TC=27;TR=3 GT:GL:GQ 0/1:-135.83,-52.75,-276.31:100 +20 5277471 . C CCTT . PASS FR=0.5;HP=1;NF=11;NR=5;PP=100.0;SC=GTATCCATGTCCTAGGGTACA;TC=27;TR=16 GT:GL:GQ 0/1:-278.16,-87.4,-130.16:100 +20 5278336 . TA T . PASS FR=0.5;HP=4;NF=3;NR=6;PP=100.0;SC=TTGAACTCTTTAAAAGTTTGA;TC=24;TR=9 GT:GL:GQ 0/1:-132.29,-83.79,-178.99:100 +20 5280465 . TTG T . PASS FR=0.5;HP=4;NF=6;NR=8;PP=100.0;SC=GATGGGGTTTTTGGCCATGTT;TC=30;TR=14 GT:GL:GQ 0/1:-161.14,-49.68,-168.09:100 +20 5280839 . T TATA . PASS FR=0.5;HP=1;NF=9;NR=3;PP=100.0;SC=ACCACAAATGTATAATACAAA;TC=30;TR=12 GT:GL:GQ 0/1:-228.47,-89.38,-201.59:100 +20 5285786 . T TG . PASS FR=0.5;HP=1;NF=3;NR=2;PP=21.0;SC=GGCTAATCAGTTCACTCTAAG;TC=24;TR=5 GT:GL:GQ 0/1:-80.46,-64.62,-184.45:71 +20 5289619 . GA G . PASS FR=0.5;HP=1;NF=9;NR=5;PP=100.0;SC=GAAGATCTAGGATGAAGCTGG;TC=22;TR=14 GT:GL:GQ 0/1:-219.59,-148.82,-190.02:100 +20 5291220 . TGATCA T . PASS FR=0.5;HP=2;NF=6;NR=6;PP=100.0;SC=GTTTAGAACCTGATCAGAGAA;TC=27;TR=12 GT:GL:GQ 0/1:-284.71,-179.16,-294.64:100 +20 5291304 . G GACTTATGGGGAGCTGGGGTATAAATACCCCAGCTCCCTCCT . PASS FR=0.5;HP=1;NF=1;NR=1;PP=100.0;SC=CCTCATCAATGACCTCCCACC;TC=8;TR=2 GT:GL:GQ 0/1:-488.84,-441.13,-506.41:71 +20 5293792 . ATG A . PASS FR=0.5;HP=3;NF=6;NR=12;PP=100.0;SC=TACAATTATTATGTGTCAATT;TC=42;TR=18 GT:GL:GQ 0/1:-201.09,-30.39,-231.82:100 +20 5303337 . CAGCT C . PASS FR=0.5;HP=2;NF=7;NR=7;PP=100.0;SC=AAATGTCACACAGCTAGCTGG;TC=32;TR=14 GT:GL:GQ 0/1:-273.85,-111.21,-258.62:100 +20 5313928 . TA T . PASS FR=0.5;HP=10;NF=9;NR=8;PP=100.0;SC=ATACAGTTGATAAAAAAAAAC;TC=39;TR=17 GT:GL:GQ 0/1:-100.8,-36.94,-107.23:100 +20 5316589 . GT G . PASS FR=1.0;HP=2;NF=7;NR=11;PP=100.0;SC=GAATATCTGGGTAAAATTTAA;TC=22;TR=18 GT:GL:GQ 1/1:-227.4,-66.98,-52.55:100 +20 5320851 . AT A . PASS FR=0.5;HP=6;NF=5;NR=10;PP=100.0;SC=ATCTCAATAGATTTTTTAAAA;TC=39;TR=15 GT:GL:GQ 0/1:-177.77,-103.88,-250.39:100 +20 5323468 . GA G . PASS FR=0.5;HP=10;NF=2;NR=4;PP=85.0;SC=GGCAACAAAAGAAAAAATAGA;TC=23;TR=6 GT:GL:GQ 0/1:-61.27,-31.53,-121.44:100 +20 5326511 . G GT . PASS FR=0.5;HP=9;NF=11;NR=2;PP=100.0;SC=TTGATTCAAAGTTTTTTTTTA;TC=29;TR=13 GT:GL:GQ 0/1:-178.07,-139.61,-153.82:64 +20 5326660 . T TA . PASS FR=0.5;HP=8;NF=4;NR=6;PP=100.0;SC=CTTTATCCTTTAAAAAAAATC;TC=26;TR=10 GT:GL:GQ 0/1:-181.43,-128.15,-159.02:100 +20 5328799 . CA C . PASS FR=1.0;HP=4;NF=10;NR=6;PP=100.0;SC=AACCACCTTCCAAAATGTGGA;TC=20;TR=16 GT:GL:GQ 1/1:-179.33,-21.23,-7.37:100 +20 5351875 . T TACACACAC . PASS FR=0.5;HP=6;NF=1;NR=1;PP=38.0;SC=ATCTTAAAAATACACACACAC;TC=12;TR=2 GT:GL:GQ 0/1:-48.31,-20.86,-63.23:100 +20 5354510 . G GGC . PASS FR=0.5;HP=1;NF=5;NR=5;PP=100.0;SC=CCTCCTCCCTGCAGAGCTCCT;TC=28;TR=10 GT:GL:GQ 0/1:-148.18,-38.3,-173.54:100 +20 5373349 . A AATTT . PASS FR=0.5;HP=6;NF=1;NR=2;PP=96.0;SC=CTAATTTTTTAATTTTTTTTT;TC=20;TR=3 GT:GL:GQ 0/1:-100.6,-64.12,-96.6:100 +20 5390447 . C CA . PASS FR=0.5;HP=6;NF=4;NR=5;PP=100.0;SC=CATTAGCATACAAAAACCATC;TC=26;TR=9 GT:GL:GQ 0/1:-88.65,-28.46,-120.44:100 +20 5408475 . AAAAC A . PASS FR=0.5;HP=4;NF=4;NR=5;PP=100.0;SC=CTCTGTCTCAAAAACAAACAA;TC=29;TR=9 GT:GL:GQ 0/1:-128.94,-29.02,-144.52:100 +20 5410361 . G GA . PASS FR=1.0;HP=9;NF=6;NR=7;PP=100.0;SC=CTGGGTTGGGGAAAAAAAAAG;TC=25;TR=13 GT:GL:GQ 1/1:-119.78,-34.18,-19.33:100 +20 5419440 . CTCCCTGTG C . PASS FR=0.5;HP=3;NF=1;NR=4;PP=100.0;SC=TGTTGTTCCCCTCCCTGTGTC;TC=19;TR=5 GT:GL:GQ 0/1:-128.97,-30.52,-125.82:100 +20 5432204 . A AG . PASS FR=0.5;HP=8;NF=2;NR=3;PP=100.0;SC=AAAGAAAGAGAAAAAAAAAGG;TC=19;TR=5 GT:GL:GQ 0/1:-83.51,-76.05,-116.49:100 +20 5432394 . G GT . PASS FR=1.0;HP=5;NF=9;NR=14;PP=100.0;SC=TTCCTCAATTGAAAAATCTTA;TC=26;TR=23 GT:GL:GQ 1/1:-328.05,-211.91,-196.14:100 +20 5435136 . GAGAAAA G . PASS FR=0.5;HP=3;NF=3;NR=6;PP=44.0;SC=AAAAAAAGGGGAGAAAAAGAA;TC=24;TR=9 GT:GL:GQ 0/1:-190.59,-169.15,-271.82:96 +20 5435153 . A ATTT . PASS FR=0.5;HP=8;NF=4;NR=10;PP=100.0;SC=AGAAAAAAAAATTTTAATGTT;TC=22;TR=14 GT:GL:GQ 0/1:-325.96,-275.2,-333.88:100 +20 5435908 . G GTTAAT . PASS FR=0.5;HP=2;NF=5;NR=2;PP=100.0;SC=ACCAGGCCCAGTTATTTTTTG;TC=16;TR=7 GT:GL:GQ 0/1:-176.12,-112.78,-176.63:100 +20 5443418 . A ACAGGGGCAC . PASS FR=0.5;HP=4;NF=3;NR=1;PP=100.0;SC=GCTTTGTCCCACAGCCTGATG;TC=15;TR=4 GT:GL:GQ 0/1:-94.87,-42.4,-160.11:100 +20 5443724 . C CT . PASS FR=0.5;HP=3;NF=6;NR=4;PP=38.0;SC=GTTACCTTTCCCCTGAGATGC;TC=20;TR=10 GT:GL:GQ 0/1:-163.73,-143.91,-199.73:89 +20 5452897 . G GA . PASS FR=0.5;HP=10;NF=2;NR=2;PP=26.0;SC=TCAGTCAGAAGAAAAAAAATT;TC=15;TR=4 GT:GL:GQ 0/1:-34.37,-17.3,-53.75:77 +20 5460271 . C CA . PASS FR=0.5;HP=10;NF=2;NR=2;PP=67.0;SC=ACCCCTGTCTCAAAAAAAAAA;TC=21;TR=4 GT:GL:GQ 0/1:-56.83,-30.33,-56.83:100 +20 5473577 . A AGT . PASS FR=0.5;HP=2;NF=2;NR=8;PP=100.0;SC=AACTGAGCAGAGTTCCTTTTT;TC=29;TR=10 GT:GL:GQ 0/1:-165.26,-86.94,-217.65:100 +20 5475853 . CTTATTTAT CTTATTTATTTAT,C . PASS FR=0.5,0.5;HP=4;NF=1,1;NR=2,2;PP=100.0,100.0;SC=GAAGGCTCTTCTTATTTATTT;TC=18;TR=3,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 5485434 . C CT . PASS FR=0.5001;HP=10;NF=4;NR=1;PP=63.0;SC=TTTTTATCTTCTTTTTTTTCC;TC=9;TR=5 GT:GL:GQ 0/1:-37.99,-12.58,-20.26:36 +20 5518456 . C CG . PASS FR=0.5;HP=7;NF=7;NR=6;PP=100.0;SC=GTGACAAATGCGGGGGGTCTT;TC=27;TR=13 GT:GL:GQ 0/1:-115.32,-28.55,-76.08:100 +20 5546352 . A AAG . PASS FR=1.0;HP=1;NF=13;NR=12;PP=100.0;SC=AAGTAGTCACAAGCTGTGATT;TC=26;TR=25 GT:GL:GQ 1/1:-322.1,-20.79,0.0:100 +20 5596481 . TTATG T . PASS FR=1.0;HP=2;NF=4;NR=4;PP=100.0;SC=TGCTACTGGTTTATGTATGTA;TC=20;TR=8 GT:GL:GQ 1/1:-167.17,-32.77,-22.47:86 +20 5596891 . ATGTGTGTG A . PASS FR=1.0;HP=2;NF=3;NR=4;PP=100.0;SC=AATTTGGGGTATGTGTGTGTG;TC=23;TR=7 GT:GL:GQ 1/1:-241.36,-45.12,-34.38:90 +20 5600458 . A AG . PASS FR=1.0;HP=2;NF=3;NR=3;PP=100.0;SC=TCTTGACCTGAGTGATACACC;TC=16;TR=6 GT:GL:GQ 1/1:-146.08,-65.05,-55.59:79 +20 5613790 . GA G . PASS FR=1.0;HP=4;NF=11;NR=9;PP=100.0;SC=CATGATTTCTGAAAACAAGCT;TC=26;TR=20 GT:GL:GQ 1/1:-222.44,-43.9,-26.57:100 +20 5624959 . C CCTCCTTACCCT . PASS FR=0.5;HP=1;NF=1;NR=1;PP=100.0;SC=AACTTGTCCACCTCCATTACC;TC=28;TR=2 GT:GL:GQ 0/1:-225.26,-176.16,-303.27:100 +20 5627592 . AT A . PASS FR=0.5;HP=6;NF=4;NR=3;PP=100.0;SC=TCTCAAAAAAATAATAAAGTT;TC=19;TR=7 GT:GL:GQ 0/1:-112.89,-28.55,-78.51:100 +20 5629324 . T TTAC . PASS FR=0.5;HP=1;NF=3;NR=3;PP=100.0;SC=ATTATTACTATTATTATTATT;TC=26;TR=6 GT:GL:GQ 1/0:-227.05,-75.82,-72.8:100 +20 5635153 . TGGAATATGAAAGAG T . PASS FR=1.0;HP=2;NF=7;NR=11;PP=100.0;SC=CAAGCCTGTTTGGAATATGAA;TC=27;TR=18 GT:GL:GQ 1/1:-490.0,-56.65,-38.89:100 +20 5635246 . T TTGTGTG,TTGTGTGTG . PASS FR=0.5,0.5;HP=1;NF=2,0;NR=2,3;PP=100.0,100.0;SC=AAAATGAATATTGTGTGTGTG;TC=22;TR=4,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 5644716 . GTCTCTCTCTCTC G . PASS FR=1.0;HP=1;NF=1;NR=6;PP=100.0;SC=ATGAGACCTCGTCTCTCTCTC;TC=22;TR=7 GT:GL:GQ 1/1:-261.18,-61.24,-58.02:52 +20 5654462 . C CGTGTGTGTGTGTGT . PASS FR=0.5;HP=1;NF=3;NR=1;PP=100.0;SC=TATACATATACGTGTGTGTGT;TC=16;TR=4 GT:GL:GQ 0/1:-129.11,-28.26,-136.2:100 +20 5654661 . AAAAAAATTTTTTTTGCTT A . PASS FR=0.5;HP=6;NF=7;NR=3;PP=100.0;SC=ATTTTTTGCCAAAAAAATTTT;TC=21;TR=10 GT:GL:GQ 0/1:-264.68,-158.41,-268.38:100 +20 5655925 . ACG A . PASS FR=0.5047;HP=2;NF=4;NR=3;PP=100.0;SC=TTGCATGCGCACGCGCGCACA;TC=34;TR=7 GT:GL:GQ 0/1:-234.34,-106.46,-110.43:20 +20 5674501 . T TTTTG . PASS FR=0.5;HP=4;NF=2;NR=2;PP=100.0;SC=AGATTTAGATTTTTGTTTGTT;TC=22;TR=4 GT:GL:GQ 0/1:-64.3,-21.33,-64.69:100 +20 5691054 . A AC . PASS FR=0.5;HP=6;NF=4;NR=5;PP=100.0;SC=GTATAGTGAGACCCCCCATCT;TC=18;TR=9 GT:GL:GQ 0/1:-137.75,-89.82,-120.86:100 +20 5696589 . AAAG A . PASS FR=0.5;HP=2;NF=3;NR=9;PP=100.0;SC=AGAAAACCATAAAGAAGAGAA;TC=35;TR=12 GT:GL:GQ 0/1:-142.07,-32.31,-238.04:100 +20 5706639 . T TA . PASS FR=0.5;HP=9;NF=5;NR=2;PP=98.0;SC=TTGTCTCAATTAAAAAAAAAT;TC=31;TR=7 GT:GL:GQ 0/1:-60.75,-27.2,-75.24:100 +20 5707109 . A ATTTTTCCC . PASS FR=0.5;HP=7;NF=2;NR=2;PP=100.0;SC=TGCCCAGCTGATTTTTTTAAA;TC=15;TR=4 GT:GL:GQ 0/1:-95.63,-40.43,-104.52:100 +20 5740635 . T TAC,TACAC . PASS FR=0.5,0.5;HP=2;NF=3,1;NR=7,4;PP=100.0,100.0;SC=TGTATTTTTATACACACACAC;TC=23;TR=10,5 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 5747768 . ATTTTC ATTTTCTTTTC,A . PASS FR=0.5,0.5;HP=4;NF=1,4;NR=1,1;PP=100.0,100.0;SC=CTCCATTCACATTTTCTTTTC;TC=17;TR=2,5 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 5754003 . A AT . PASS FR=0.5;HP=9;NF=6;NR=4;PP=100.0;SC=AGAGAGTGGAATTTTTTTTTG;TC=33;TR=10 GT:GL:GQ 0/1:-69.42,-30.04,-87.94:100 +20 5762289 . A AT . PASS FR=0.5;HP=8;NF=2;NR=3;PP=95.0;SC=CTGCCCAGCTATTTTTTTGTA;TC=13;TR=5 GT:GL:GQ 0/1:-43.82,-10.94,-28.53:79 +20 5767540 . AGATCATTT A . PASS FR=1.0;HP=2;NF=5;NR=6;PP=100.0;SC=TTCTCAAGCCAGATCATTTGA;TC=16;TR=11 GT:GL:GQ 1/1:-333.85,-224.08,-215.75:69 +20 5768941 . AGTT A . PASS FR=0.5;HP=1;NF=4;NR=9;PP=100.0;SC=TATATTCAGTAGTTGTTGTTT;TC=21;TR=13 GT:GL:GQ 0/1:-159.07,-13.83,-29.97:73 +20 5771896 . CAAATAAATA C . PASS FR=1.0;HP=3;NF=11;NR=5;PP=100.0;SC=AAAATCTTAGCAAATAAATAA;TC=26;TR=16 GT:GL:GQ 1/1:-433.86,-58.29,-43.98:62 +20 5778212 . AAAG A . PASS FR=1.0;HP=5;NF=6;NR=12;PP=100.0;SC=CCATCTCAAAAAAGAAGAAGA;TC=23;TR=18 GT:GL:GQ 1/1:-251.53,-37.12,-21.87:100 +20 5781503 . GCGTA G . PASS FR=1.0;HP=1;NF=9;NR=6;PP=100.0;SC=GTGTGTGTGTGCGTATGTCTA;TC=23;TR=15 GT:GL:GQ 1/1:-450.31,-256.77,-243.2:93 +20 5788895 . C CAGCCTGGGTGACAG . PASS FR=1.0;HP=1;NF=3;NR=6;PP=100.0;SC=CACTGCACTCCAGCAAGACTC;TC=11;TR=9 GT:GL:GQ 1/1:-304.26,-23.03,-12.43:73 +20 5798352 . CTGGCATTA C . PASS FR=0.5;HP=1;NF=1;NR=3;PP=100.0;SC=CTGGCTGTGCCTGGCATTATG;TC=29;TR=4 GT:GL:GQ 1/0:-390.33,-302.72,-305.99:100 +20 5798359 . T TGC . PASS FR=0.5;HP=1;NF=6;NR=6;PP=100.0;SC=TGCCTGGCATTATGACTTAGT;TC=26;TR=12 GT:GL:GQ 0/1:-390.33,-366.98,-362.46:100 +20 5807781 . T TG . PASS FR=1.0;HP=3;NF=7;NR=3;PP=100.0;SC=TGAGTGGGCGTGGCACCCACA;TC=10;TR=10 GT:GL:GQ 1/1:-98.15,-11.06,-4.14:57 +20 5808542 . C CT . PASS FR=1.0;HP=3;NF=16;NR=16;PP=100.0;SC=ATCATTCACTCTTGTGGGTAG;TC=33;TR=32 GT:GL:GQ 1/1:-408.08,-203.57,-182.32:100 +20 5808967 . T TGTGTAGTAG . PASS FR=1.0;HP=2;NF=7;NR=18;PP=100.0;SC=CTTAGAACAGTGTGATAGGTC;TC=28;TR=25 GT:GL:GQ 1/1:-678.96,-93.79,-70.92:100 +20 5809144 . TTGA T . PASS FR=1.0;HP=1;NF=10;NR=16;PP=100.0;SC=GAGTCATTTCTTGATGACTCC;TC=34;TR=26 GT:GL:GQ 1/1:-408.43,-70.02,-46.73:100 +20 5809747 . CCTGGGCTCA C . PASS FR=1.0;HP=1;NF=13;NR=15;PP=100.0;SC=GGTCTCAACTCCTGGGCTCAA;TC=33;TR=28 GT:GL:GQ 1/1:-583.71,-71.8,-56.82:48 +20 5810527 . G GA . PASS FR=1.0;HP=9;NF=9;NR=9;PP=100.0;SC=TCTTCTTTAGGAAAAAAAAAC;TC=26;TR=18 GT:GL:GQ 1/1:-296.92,-216.99,-203.12:100 +20 5820132 . A AAGATAGAT,AAGATAGATAGAT . PASS FR=0.5,0.5;HP=2;NF=4,2;NR=2,6;PP=100.0,100.0;SC=ATTAGATAGAAAGATAGATAG;TC=36;TR=6,8 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 5822610 . A AAAG . PASS FR=0.5;HP=2;NF=4;NR=6;PP=100.0;SC=GACTATGGAGAAAGAGAACAT;TC=30;TR=10 GT:GL:GQ 0/1:-160.25,-33.5,-176.54:100 +20 5830758 . C CAATAATAAT . PASS FR=1.0;HP=2;NF=2;NR=2;PP=100.0;SC=GACCCCGTCTCAATAATAATA;TC=8;TR=4 GT:GL:GQ 1/1:-112.77,-19.78,-14.93:60 +20 5848219 . C CAAAAT . PASS FR=1.0;HP=7;NF=10;NR=13;PP=100.0;SC=ATTAAACACTCAAAAAAATAA;TC=29;TR=23 GT:GL:GQ 1/1:-431.75,-125.0,-103.09:100 +20 5848530 . A AAT . PASS FR=1.0;HP=1;NF=13;NR=10;PP=100.0;SC=ATATATATAGAATATATATAT;TC=33;TR=23 GT:GL:GQ 1/1:-409.72,-328.74,-317.3:96 +20 5850230 . A AT . PASS FR=1.0;HP=6;NF=1;NR=1;PP=100.0;SC=TAATTTTTGCATTTTTTGTTT;TC=22;TR=2 GT:GL:GQ 1/1:-134.01,-105.23,-98.33:86 +20 5854908 . A AATTTTATTTT . PASS FR=1.0;HP=3;NF=3;NR=7;PP=100.0;SC=CATATACTTTAATTTTATTTT;TC=28;TR=10 GT:GL:GQ 1/1:-352.01,-27.1,-12.2:100 +20 5856355 . CTAAA C . PASS FR=1.0;HP=4;NF=2;NR=2;PP=100.0;SC=GACCCTATTTCTAAATAAATA;TC=15;TR=4 GT:GL:GQ 1/1:-57.0,-6.23,-2.76:42 +20 5860647 . TGAG T . PASS FR=1.0;HP=4;NF=8;NR=6;PP=100.0;SC=AGAAAGAAAATGAGGAGCGAA;TC=18;TR=14 GT:GL:GQ 1/1:-182.28,-15.91,-4.13:99 +20 5879792 . CAA C . PASS FR=1.0;HP=10;NF=14;NR=15;PP=100.0;SC=ACAATAACATCAAAAAAAAAA;TC=39;TR=29 GT:GL:GQ 1/1:-170.66,-28.34,-5.76:100 +20 5898748 . GAA G . PASS FR=1.0;HP=2;NF=5;NR=5;PP=100.0;SC=AGCCAAGATTGAACTCCATTG;TC=13;TR=10 GT:GL:GQ 1/1:-132.95,-97.25,-91.93:66 +20 5900669 . G GC . PASS FR=0.5;HP=1;NF=4;NR=2;PP=100.0;SC=CATGACAGATGCATTTCCCTG;TC=15;TR=6 GT:GL:GQ 0/1:-72.42,-12.46,-72.17:100 +20 5911588 . TCA T . PASS FR=0.5;HP=2;NF=6;NR=1;PP=100.0;SC=CTGGCAAATCTCACACACACA;TC=19;TR=7 GT:GL:GQ 0/1:-115.11,-26.04,-76.51:100 +20 5923828 . CAGAGAGAATACATGCTTA C . PASS FR=0.5;HP=1;NF=3;NR=5;PP=100.0;SC=TGTATTCTTCCAGAGAGAATA;TC=22;TR=8 GT:GL:GQ 0/1:-297.99,-115.43,-361.46:100 +20 5928403 . T TA . PASS FR=0.5;HP=2;NF=3;NR=2;PP=100.0;SC=ACCTAGGTGCTTTGAAACACT;TC=18;TR=5 GT:GL:GQ 0/1:-52.7,-18.59,-121.61:100 +20 5930573 . A AG . PASS FR=0.5;HP=3;NF=4;NR=4;PP=100.0;SC=ACAGGTGATTAGGGTGTGGAG;TC=26;TR=8 GT:GL:GQ 0/1:-121.38,-46.04,-144.61:100 +20 5932104 . C CT . PASS FR=0.5;HP=2;NF=5;NR=6;PP=100.0;SC=TCTTTATTTACTTGTATACTT;TC=20;TR=11 GT:GL:GQ 0/1:-138.34,-48.83,-107.16:100 +20 5934084 . GGTGT GGT,G . PASS FR=0.5,0.5;HP=3;NF=1,2;NR=3,2;PP=100.0,100.0;SC=TCTCATGAGGGGTGTGTGTGT;TC=32;TR=4,4 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 5938650 . A AT . PASS FR=0.5;HP=3;NF=3;NR=6;PP=100.0;SC=TTTTCCTTAAATTTCTTTTTT;TC=36;TR=9 GT:GL:GQ 0/1:-182.01,-137.8,-289.15:100 +20 5939638 . G GT . PASS FR=0.5;HP=7;NF=8;NR=7;PP=100.0;SC=ATTAGTGTCTGTTTTTTACCT;TC=37;TR=15 GT:GL:GQ 0/1:-244.24,-166.31,-240.23:100 +20 5946414 . TTTTACTTCTTAGAGTATGC T . PASS FR=0.5;HP=3;NF=2;NR=4;PP=100.0;SC=TAAGTGCTGGTTTTACTTCTT;TC=34;TR=6 GT:GL:GQ 0/1:-213.07,-102.23,-466.92:100 +20 5948421 . CATT C . PASS FR=0.5;HP=1;NF=6;NR=8;PP=100.0;SC=CTAGTTGAGTCATTGTAGGGA;TC=25;TR=14 GT:GL:GQ 0/1:-180.5,-26.28,-114.93:100 +20 5958367 . TATA T . PASS FR=0.5;HP=2;NF=1;NR=12;PP=100.0;SC=TAAATCAGGATATAATAATAC;TC=28;TR=13 GT:GL:GQ 0/1:-168.03,-21.02,-138.69:100 +20 5958971 . AT A . PASS FR=0.5;HP=8;NF=7;NR=10;PP=100.0;SC=ATTTGTGATCATTTTTTTTAA;TC=36;TR=17 GT:GL:GQ 0/1:-190.15,-122.85,-187.1:100 +20 5972522 . TC T . PASS FR=0.5;HP=2;NF=3;NR=8;PP=100.0;SC=AGTTTTCATCTCTTCAGCTTC;TC=35;TR=11 GT:GL:GQ 0/1:-138.05,-67.95,-261.75:100 +20 5974701 . T TTTTG . PASS FR=0.5;HP=6;NF=12;NR=8;PP=100.0;SC=TTAGCTTGATTTTTTTCAGCT;TC=40;TR=20 GT:GL:GQ 0/1:-282.01,-46.13,-199.33:100 +20 5979818 . CTA C . PASS FR=0.5;HP=1;NF=4;NR=2;PP=100.0;SC=CACACACACACTATATAGAGT;TC=23;TR=6 GT:GL:GQ 0/1:-148.54,-97.12,-217.3:100 +20 5979861 . T TAG . PASS FR=0.5;HP=1;NF=1;NR=6;PP=100.0;SC=GTATATATACTAGTGTGTATA;TC=23;TR=7 GT:GL:GQ 0/1:-206.33,-148.87,-246.11:100 +20 5979921 . ATATATATTATATATAC A . PASS FR=0.5;HP=2;NF=2;NR=3;PP=100.0;SC=TCTATAAAGTATATATATTAT;TC=15;TR=5 GT:GL:GQ 0/1:-143.6,-52.22,-114.36:100 +20 5980041 . CTATA C . PASS FR=0.5;HP=1;NF=6;NR=4;PP=100.0;SC=TATATATACACTATATATAGT;TC=35;TR=10 GT:GL:GQ 0/1:-130.29,-26.74,-240.87:100 +20 5982833 . CTT C . PASS FR=0.5;HP=5;NF=2;NR=5;PP=100.0;SC=GCAATGCACTCTTTTGCTTAC;TC=22;TR=7 GT:GL:GQ 0/1:-154.07,-87.47,-142.2:100 +20 5984269 . CTT C . PASS FR=0.5;HP=5;NF=6;NR=7;PP=100.0;SC=AATCCTTTCTCTTTTCACGTT;TC=31;TR=13 GT:GL:GQ 0/1:-161.92,-47.17,-162.99:100 +20 5986173 . A ATAATT . PASS FR=0.5;HP=3;NF=9;NR=5;PP=100.0;SC=AAAATTTAAAATAAAAACTAT;TC=31;TR=14 GT:GL:GQ 0/1:-275.95,-89.41,-205.85:100 +20 5997120 . T TGTGTGA . PASS FR=0.5;HP=2;NF=2;NR=2;PP=100.0;SC=TGTGTGTGTGTGAGTTTTCTT;TC=20;TR=4 GT:GL:GQ 0/1:-128.89,-41.21,-139.69:100 +20 5999929 . G GTTA . PASS FR=0.5;HP=5;NF=7;NR=6;PP=100.0;SC=CTTTTGACCAGTTTTTAAGTT;TC=34;TR=13 GT:GL:GQ 0/1:-145.72,-26.46,-192.55:100 +20 6013970 . C CG . PASS FR=0.5;HP=4;NF=4;NR=1;PP=100.0;SC=TTAGTAGAGACGGGGTTTCAC;TC=18;TR=5 GT:GL:GQ 0/1:-76.07,-30.4,-70.18:100 +20 6019907 . TTGTGTGTGTGTGTGTG T . PASS FR=0.5;HP=2;NF=1;NR=1;PP=100.0;SC=GCAGTTTTGTTTGTGTGTGTG;TC=27;TR=2 GT:GL:GQ 0/1:-146.39,-89.3,-170.65:100 +20 6052252 . CT C . PASS FR=1.0;HP=2;NF=5;NR=9;PP=100.0;SC=ATCCCCAGCCCTTCCTGGCTT;TC=21;TR=14 GT:GL:GQ 1/1:-166.42,-15.59,-2.3:100 +20 6054897 . T TG . PASS FR=1.0;HP=3;NF=4;NR=7;PP=100.0;SC=TGGGCAAGGCTGGGAAGGAAG;TC=16;TR=11 GT:GL:GQ 1/1:-170.6,-33.42,-22.33:90 +20 6056042 . T TA . PASS FR=1.0;HP=2;NF=8;NR=17;PP=100.0;SC=ACATCAAGTATATACGGTACA;TC=29;TR=25 GT:GL:GQ 1/1:-301.61,-48.56,-28.73:100 +20 6163149 . CATTT C . PASS FR=1.0;HP=1;NF=11;NR=10;PP=100.0;SC=AACCTCTGAGCATTTATTTCA;TC=24;TR=21 GT:GL:GQ 1/1:-265.47,-16.86,-0.92:100 +20 6169158 . C CT . PASS FR=1.0;HP=1;NF=11;NR=21;PP=100.0;SC=AATTGCAAGACCTTAAGAACC;TC=38;TR=32 GT:GL:GQ 1/1:-377.27,-55.22,-28.98:100 +20 6186522 . G GC . PASS FR=1.0;HP=6;NF=10;NR=10;PP=100.0;SC=TAAAAAATGTGTTTTTAATCA;TC=21;TR=20 GT:GL:GQ 1/1:-309.42,-177.87,-163.8:100 +20 6186628 . C CA . PASS FR=0.5;HP=3;NF=5;NR=12;PP=100.0;SC=TTCATCACCTCAAACATTTAT;TC=33;TR=17 GT:GL:GQ 0/1:-173.72,-30.0,-131.16:100 +20 6189872 . C CCTT . PASS FR=0.5;HP=1;NF=1;NR=10;PP=100.0;SC=CTTCCTCCCTCCTTTCCCTCT;TC=26;TR=11 GT:GL:GQ 0/1:-217.8,-111.28,-184.18:100 +20 6190124 . C CTT . PASS FR=0.5;HP=2;NF=2;NR=4;PP=92.0;SC=TCCTGCCTCTCTCTTTCCTCC;TC=16;TR=6 GT:GL:GQ 0/1:-129.79,-96.5,-151.55:100 +20 6190921 . A AT . PASS FR=0.5;HP=2;NF=5;NR=4;PP=100.0;SC=CCATAAGTACATTAAAAAAAA;TC=24;TR=9 GT:GL:GQ 0/1:-121.19,-85.53,-104.7:86 +20 6202427 . C CT . PASS FR=1.0;HP=6;NF=6;NR=13;PP=100.0;SC=GAAATCCTTTCTTTCCCCCTA;TC=20;TR=19 GT:GL:GQ 1/1:-165.74,-14.09,-0.92:100 +20 6211244 . GT G . PASS FR=0.5;HP=10;NF=5;NR=6;PP=100.0;SC=TTGATTTCCAGTTTTTTTTTT;TC=33;TR=11 GT:GL:GQ 0/1:-97.67,-63.78,-117.4:100 +20 6217057 . T TA . PASS FR=0.5;HP=2;NF=4;NR=7;PP=100.0;SC=TCTCTACAACTAACCATCAAC;TC=33;TR=11 GT:GL:GQ 0/1:-151.16,-56.84,-189.09:100 +20 6227811 . TTTTTCTTTTC T . PASS FR=0.5;HP=6;NF=3;NR=2;PP=100.0;SC=TATACTGCTTTTTTTCTTTTC;TC=28;TR=5 GT:GL:GQ 0/1:-171.28,-80.47,-279.48:100 +20 6228139 . TA T . PASS FR=0.5;HP=8;NF=6;NR=7;PP=100.0;SC=ACTGGTTGTTTAAAAAAAACA;TC=27;TR=13 GT:GL:GQ 0/1:-101.53,-37.68,-71.46:100 +20 6229361 . G GTA . PASS FR=0.5;HP=2;NF=7;NR=5;PP=100.0;SC=TGCTTTTGAAGTATACCTTTA;TC=28;TR=12 GT:GL:GQ 0/1:-168.24,-128.05,-263.48:100 +20 6232719 . T TA . PASS FR=1.0;HP=4;NF=10;NR=14;PP=100.0;SC=CGTACCTCAATAAGTACTGTT;TC=26;TR=24 GT:GL:GQ 1/1:-246.13,-19.86,-1.84:100 +20 6235756 . T TA . PASS FR=0.5;HP=10;NF=4;NR=2;PP=51.0;SC=ATATAAAAGTTAAAAAAAAAA;TC=22;TR=6 GT:GL:GQ 0/1:-59.89,-37.16,-67.02:100 +20 6242610 . GCAGACC G . PASS FR=0.5;HP=1;NF=7;NR=3;PP=100.0;SC=ACTGGGAGAGGCAGACCCACC;TC=27;TR=10 GT:GL:GQ 0/1:-180.6,-46.65,-174.85:100 +20 6245977 . A AT . PASS FR=0.5;HP=6;NF=7;NR=5;PP=100.0;SC=CTTAGTTTTCATTTTTTAGCA;TC=29;TR=12 GT:GL:GQ 0/1:-149.75,-66.4,-136.45:100 +20 6258987 . CT C . PASS FR=0.5;HP=6;NF=4;NR=10;PP=100.0;SC=GTATGTTCTTCTTTTGTCCCC;TC=34;TR=14 GT:GL:GQ 0/1:-185.84,-121.45,-268.81:100 +20 6272029 . T TA . PASS FR=0.5;HP=3;NF=4;NR=9;PP=100.0;SC=TAATAGCTGGTAAACCCAACC;TC=39;TR=13 GT:GL:GQ 0/1:-151.49,-56.11,-226.05:100 +20 6293812 . G GA . PASS FR=1.0;HP=7;NF=15;NR=12;PP=100.0;SC=GGAAAAGAAAGAAAAGAAAAA;TC=35;TR=27 GT:GL:GQ 1/1:-393.29,-260.24,-242.04:100 +20 6296458 . T TA . PASS FR=1.0;HP=8;NF=5;NR=17;PP=100.0;SC=GAAAGCACAATTTTTTTTTCT;TC=39;TR=22 GT:GL:GQ 1/1:-284.36,-128.48,-104.71:100 +20 6304002 . A ATG . PASS FR=1.0;HP=2;NF=6;NR=5;PP=100.0;SC=ATATATATATATATGTGTGTG;TC=30;TR=11 GT:GL:GQ 1/1:-328.64,-256.07,-245.8:100 +20 6307745 . GTA G . PASS FR=1.0;HP=3;NF=4;NR=7;PP=100.0;SC=TATATATGTTGTATATATATA;TC=16;TR=11 GT:GL:GQ 1/1:-114.94,-15.25,-6.19:75 +20 6307849 . TATATATATGGTATATATATC T . PASS FR=0.5034;HP=1;NF=2;NR=2;PP=100.0;SC=ATATATGGTGTATATATATGG;TC=11;TR=4 GT:GL:GQ 0/1:-108.24,-70.67,-74.96:21 +20 6307908 . TG T . PASS FR=0.5;HP=2;NF=3;NR=4;PP=100.0;SC=ATATCATATATGGTGTATATA;TC=21;TR=7 GT:GL:GQ 0/1:-127.13,-92.55,-148.07:100 +20 6308166 . G GTA,GTATA . PASS FR=0.5,0.5;HP=2;NF=2,1;NR=0,3;PP=86.0,100.0;SC=GTGTGTGTGTGTATATATATA;TC=16;TR=2,4 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 6308279 . G GTA . PASS FR=1.0;HP=2;NF=5;NR=4;PP=100.0;SC=TATATATGGTGTATATATATA;TC=12;TR=9 GT:GL:GQ 1/1:-129.24,-92.18,-87.75:54 +20 6308322 . GTGTGTGTATATATATATATATATA G . PASS FR=1.0;HP=2;NF=1;NR=2;PP=88.0;SC=ATGTATGTGTGTGTGTGTATA;TC=16;TR=3 GT:GL:GQ 1/1:-227.62,-141.11,-132.99:40 +20 6319701 . G GGT . PASS FR=0.5;HP=1;NF=1;NR=5;PP=100.0;SC=GAGTCTATGTGGTGTGTGTGT;TC=19;TR=6 GT:GL:GQ 0/1:-99.44,-38.84,-115.36:100 +20 6345189 . G GT . PASS FR=0.5;HP=8;NF=8;NR=3;PP=100.0;SC=ATTGTTTTCAGTTTTTTTTCT;TC=31;TR=11 GT:GL:GQ 0/1:-92.31,-34.03,-73.88:100 +20 6346428 . C CTCTGTATG . PASS FR=0.5;HP=4;NF=5;NR=1;PP=45.0;SC=TATTCTCTATCTTTAATTTAA;TC=31;TR=6 GT:GL:GQ 0/1:-234.84,-191.03,-405.18:86 +20 6349738 . TAC T . PASS FR=0.5;HP=1;NF=2;NR=1;PP=86.0;SC=GACACATACGTACACACACAC;TC=15;TR=3 GT:GL:GQ 0/1:-95.85,-65.71,-99.67:100 +20 6364214 . ACTCTT A . PASS FR=0.5;HP=3;NF=5;NR=10;PP=100.0;SC=TCTTTACAAAACTCTTCTAGA;TC=36;TR=15 GT:GL:GQ 0/1:-210.3,-34.68,-236.21:100 +20 6373382 . TCTACCTAC T . PASS FR=1.0;HP=1;NF=9;NR=8;PP=100.0;SC=ATTTCCTCTATCTACCTACCT;TC=38;TR=17 GT:GL:GQ 1/1:-510.97,-41.39,-20.72:100 +20 6384835 . TACACACAC TAC,T . PASS FR=0.5,0.5;HP=2;NF=2,2;NR=7,1;PP=100.0,51.0;SC=GGATGACACATACACACACAC;TC=32;TR=9,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 6390974 . TAA T . PASS FR=1.0;HP=3;NF=19;NR=16;PP=100.0;SC=CTGCCTACCTTAAACACATAA;TC=42;TR=35 GT:GL:GQ 1/1:-376.88,-34.87,-5.52:100 +20 6401100 . A AT . PASS FR=1.0;HP=9;NF=15;NR=9;PP=100.0;SC=TTCAAAAAGCATTTTTTTTTG;TC=34;TR=24 GT:GL:GQ 1/1:-148.27,-28.49,-8.51:100 +20 6406758 . C CT . PASS FR=1.0;HP=7;NF=4;NR=16;PP=100.0;SC=TCTCTCCCCTCTTTTTTCTCC;TC=31;TR=20 GT:GL:GQ 1/1:-235.73,-83.65,-66.42:100 +20 6410888 . CAGGGCTTGGCCCTGGAGT C . PASS FR=0.5;HP=1;NF=2;NR=4;PP=100.0;SC=TTCTCCACTCCAGGGCTTGGC;TC=24;TR=6 GT:GL:GQ 0/1:-188.53,-25.15,-199.92:100 +20 6426272 . T TCTC,TTTC . PASS FR=0.5,0.5;HP=1;NF=11,6;NR=5,5;PP=100.0,100.0;SC=TTAAAAATTATCTCATTTCCT;TC=28;TR=16,11 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 6428681 . CA C . PASS FR=0.5009;HP=2;NF=4;NR=5;PP=100.0;SC=GGTGGGCCACCAACAGTGTCT;TC=20;TR=9 GT:GL:GQ 0/1:-312.7,-243.18,-248.77:27 +20 6430456 . A AT . PASS FR=0.5;HP=10;NF=10;NR=6;PP=100.0;SC=TAATATTTAAATTTTTTTTTT;TC=35;TR=16 GT:GL:GQ 0/1:-143.54,-83.39,-119.6:100 +20 6438083 . TA T . PASS FR=0.5;HP=7;NF=2;NR=8;PP=100.0;SC=AACAGATATATAAAAAATGCT;TC=21;TR=10 GT:GL:GQ 0/1:-86.86,-14.54,-78.87:100 +20 6441903 . C CT . PASS FR=0.5;HP=9;NF=10;NR=11;PP=100.0;SC=AAATTAAATACTTTTTTTTTA;TC=43;TR=21 GT:GL:GQ 0/1:-221.48,-121.14,-137.31:73 +20 6443155 . TTA T . PASS FR=0.5005;HP=5;NF=2;NR=2;PP=100.0;SC=AAACAGTTTTTTATATATATA;TC=14;TR=4 GT:GL:GQ 0/1:-162.1,-119.94,-126.23:30 +20 6443546 . G GTA . PASS FR=0.5;HP=2;NF=1;NR=2;PP=100.0;SC=ATATATATGTGTATATATATA;TC=14;TR=3 GT:GL:GQ 0/1:-156.72,-103.24,-116.61:61 +20 6447485 . C CA . PASS FR=0.5;HP=3;NF=4;NR=13;PP=100.0;SC=TTTTGAATTTCAAATATTTTC;TC=38;TR=17 GT:GL:GQ 0/1:-255.09,-105.01,-200.26:100 +20 6448179 . TAATAA T . PASS FR=0.5;HP=5;NF=3;NR=4;PP=100.0;SC=TATCTCGAAATAATAAAATAA;TC=36;TR=7 GT:GL:GQ 0/1:-185.97,-96.1,-256.82:100 +20 6456952 . ATT AT,A . PASS FR=0.5,0.5;HP=10;NF=7,8;NR=4,5;PP=100.0,100.0;SC=CAATGATGTCATTTTTTTTTT;TC=27;TR=11,13 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 6458185 . GA G . PASS FR=0.5;HP=10;NF=11;NR=4;PP=100.0;SC=AAATAAAAATGAAAAAAAAAA;TC=48;TR=15 GT:GL:GQ 0/1:-255.96,-202.85,-273.91:100 +20 6459292 . G GA . PASS FR=0.5;HP=10;NF=2;NR=6;PP=49.0;SC=TATCCTATCAGAAAAAAAAAC;TC=30;TR=8 GT:GL:GQ 0/1:-83.74,-61.52,-111.1:99 +20 6473904 . TAGGTGAAATTTTCTTTTCTGTTTTTTTAA T . PASS FR=0.5;HP=1;NF=2;NR=1;PP=100.0;SC=TCCCTAATTCTAGGTGAAATT;TC=25;TR=3 GT:GL:GQ 0/1:-202.85,-99.33,-502.66:100 +20 6481086 . T TTGTC . PASS FR=1.0;HP=2;NF=7;NR=5;PP=100.0;SC=TTGTTCCTCTTTGTCAGAGCA;TC=21;TR=12 GT:GL:GQ 1/1:-268.34,-19.84,-4.6:100 +20 6488178 . CTTG C . PASS FR=1.0;HP=2;NF=13;NR=13;PP=100.0;SC=AAGCTACTTGCTTGTTGTTGA;TC=32;TR=26 GT:GL:GQ 1/1:-335.98,-26.27,-4.81:100 +20 6520175 . C CTT . PASS FR=1.0;HP=3;NF=12;NR=17;PP=100.0;SC=TTACTTAAGACTTTCTATTGA;TC=35;TR=29 GT:GL:GQ 1/1:-362.42,-32.47,-7.59:100 +20 6524976 . GACTAC G . PASS FR=1.0;HP=2;NF=12;NR=13;PP=100.0;SC=CTATGAAATTGACTACACTAC;TC=32;TR=25 GT:GL:GQ 1/1:-403.49,-65.81,-45.47:100 +20 6531643 . GT G . PASS FR=1.0;HP=4;NF=17;NR=11;PP=100.0;SC=CAGATAAAGTGTTTAATTCAT;TC=31;TR=28 GT:GL:GQ 1/1:-281.56,-58.08,-38.11:100 +20 6544912 . CAGAT CAGATAGATAGATAGAT,C . PASS FR=0.5,0.5;HP=1;NF=1,1;NR=4,1;PP=100.0,100.0;SC=TATTCACTGCCAGATAGATAG;TC=24;TR=5,2 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 6548435 . A AAGAG . PASS FR=1.0;HP=2;NF=5;NR=8;PP=100.0;SC=GAGAAACAGAAAGAGAGAGAG;TC=33;TR=13 GT:GL:GQ 1/1:-316.58,-47.12,-29.98:100 +20 6549783 . C CTT . PASS FR=1.0;HP=9;NF=3;NR=10;PP=100.0;SC=TGGTCCAGGCCTTTTTTTTTG;TC=24;TR=13 GT:GL:GQ 1/1:-145.52,-61.65,-53.62:66 +20 6553955 . TTATA T . PASS FR=1.0;HP=3;NF=12;NR=6;PP=100.0;SC=ATTTTACATTTTATATATATA;TC=30;TR=18 GT:GL:GQ 1/1:-272.92,-35.6,-20.34:100 +20 6563467 . CTAGGTAGGTAGG C . PASS FR=1.0;HP=1;NF=3;NR=6;PP=100.0;SC=ACATGCATTCCTAGGTAGGTA;TC=22;TR=9 GT:GL:GQ 1/1:-367.98,-150.14,-139.95:85 +20 6565618 . CGTGT C . PASS FR=1.0;HP=2;NF=4;NR=3;PP=100.0;SC=TGTGTGTGTTCGTGTGTGTGT;TC=19;TR=7 GT:GL:GQ 1/1:-220.73,-126.68,-119.85:85 +20 6565651 . G GTA . PASS FR=0.5286;HP=2;NF=3;NR=2;PP=100.0;SC=GTGTATATGTGTATATATATA;TC=16;TR=5 GT:GL:GQ 0/1:-258.66,-193.34,-195.57:12 +20 6585232 . C CT . PASS FR=1.0;HP=2;NF=15;NR=16;PP=100.0;SC=ACAAACCCATCTCCTAAAATC;TC=33;TR=31 GT:GL:GQ 1/1:-314.24,-29.76,-6.91:100 +20 6590623 . C CCTGCTT . PASS FR=1.0;HP=1;NF=17;NR=14;PP=100.0;SC=AGAGTTATCTCCTGCTGTCAT;TC=32;TR=31 GT:GL:GQ 1/1:-527.33,-38.07,-14.51:100 +20 6603635 . C CA . PASS FR=1.0;HP=4;NF=12;NR=8;PP=100.0;SC=TTAGTCAAGCCAAAATCACAT;TC=27;TR=20 GT:GL:GQ 1/1:-325.58,-214.53,-199.34:100 +20 6609608 . CTT C . PASS FR=1.0;HP=3;NF=10;NR=9;PP=100.0;SC=TGTTTTGATGCTTTCTGGCTT;TC=27;TR=19 GT:GL:GQ 1/1:-576.75,-576.47,-576.51:100 +20 6609611 . T TGGAGGAGGA . PASS FR=1.0;HP=2;NF=9;NR=9;PP=100.0;SC=TTTGATGCTTTCTGGCTTGGA;TC=23;TR=18 GT:GL:GQ 1/1:-576.75,-311.9,-294.35:100 +20 6644452 . C CTGTAG . PASS FR=1.0;HP=1;NF=14;NR=16;PP=100.0;SC=ATAAAAGGCACTGTAGCATAG;TC=35;TR=30 GT:GL:GQ 1/1:-563.91,-35.77,-9.44:100 +20 6647434 . A ATC . PASS FR=1.0;HP=2;NF=4;NR=14;PP=100.0;SC=GGATACTGAGATTCTAAGTAG;TC=21;TR=18 GT:GL:GQ 1/1:-241.28,-23.07,-7.83:100 +20 6655343 . T TG . PASS FR=1.0;HP=6;NF=6;NR=9;PP=100.0;SC=AGTCTAAAGATTTTTTTCTGG;TC=18;TR=15 GT:GL:GQ 1/1:-141.83,-27.31,-14.91:95 +20 6655876 . GTATATA GTA,G . PASS FR=0.5,0.5;HP=1;NF=8,2;NR=11,1;PP=100.0,58.0;SC=TACATATATAGTATATATATA;TC=31;TR=19,3 GT:GL:GQ 1/2:-1.0,-1.0,-1.0:100 +20 6664331 . C CTG . PASS FR=1.0;HP=5;NF=5;NR=10;PP=100.0;SC=GGTTTAAAAACTGTGTGTGTG;TC=30;TR=15 GT:GL:GQ 1/1:-232.49,-35.13,-29.16:74 +20 6668238 . CT C . PASS FR=1.0;HP=10;NF=7;NR=15;PP=100.0;SC=ACTGGAGAAACTTTTTTTTTT;TC=30;TR=22 GT:GL:GQ 1/1:-332.94,-279.88,-269.29:89 +20 6677392 . CTGTGTG C . PASS FR=0.5;HP=2;NF=1;NR=6;PP=100.0;SC=GTGTGTGGCCCTGTGTGTGTG;TC=24;TR=7 GT:GL:GQ 0/1:-156.67,-56.12,-128.5:100 +20 6687137 . CAT C . PASS FR=1.0;HP=2;NF=12;NR=13;PP=100.0;SC=ATAAGATCCACATGAGACAAT;TC=26;TR=25 GT:GL:GQ 1/1:-279.85,-22.16,-4.14:100 +20 6690400 . T TG . PASS FR=1.0;HP=2;NF=22;NR=8;PP=100.0;SC=TTAATACATTTGTATGCCCTG;TC=31;TR=30 GT:GL:GQ 1/1:-315.1,-40.57,-19.1:100 +20 6694813 . GAA G . PASS FR=1.0;HP=6;NF=5;NR=4;PP=100.0;SC=AAGAAAGAAAGAAAGAGAAAG;TC=13;TR=9 GT:GL:GQ 1/1:-119.78,-18.28,-9.43:64 +20 6717401 . G GA . PASS FR=1.0;HP=10;NF=14;NR=6;PP=100.0;SC=CTCTCTTAAGGAAAAAAAAAA;TC=27;TR=20 GT:GL:GQ 1/1:-134.21,-33.86,-20.0:100 +20 6723994 . A AAC . PASS FR=1.0;HP=4;NF=10;NR=3;PP=100.0;SC=CACATACAAAAACACACACAC;TC=23;TR=13 GT:GL:GQ 1/1:-174.48,-22.71,-13.76:74 +20 6746236 . C CTTAT . PASS FR=0.5;HP=2;NF=2;NR=4;PP=100.0;SC=CTGGAGACTACTTATTTATTT;TC=23;TR=6 GT:GL:GQ 0/1:-115.46,-26.87,-109.86:100 +20 6759758 . A AAT . PASS FR=0.5;HP=2;NF=2;NR=3;PP=100.0;SC=TAAATACATAAATATATATAT;TC=21;TR=5 GT:GL:GQ 0/1:-98.2,-23.97,-51.3:100 +20 6765134 . A AACAC . PASS FR=0.5;HP=1;NF=2;NR=5;PP=100.0;SC=TTGAGAATCTAACACACACAC;TC=25;TR=7 GT:GL:GQ 0/1:-145.56,-56.64,-151.12:100 diff --git a/tests/tabix_data/vcf/6.vcf b/tests/tabix_data/vcf/6.vcf new file mode 100644 index 0000000..fa039b1 --- /dev/null +++ b/tests/tabix_data/vcf/6.vcf @@ -0,0 +1,278 @@ +##fileformat=VCFv4.1 +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##fileDate=20110531 +##reference=ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/human_g1k_v37.fasta.gz +##source=EricBanksValidationQC;fromGertonLunterValidationSelection +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00127 HG00128 HG00136 HG00137 HG00138 HG00139 HG00152 HG00156 HG00234 HG00235 HG00237 HG00242 HG00244 HG00262 HG01055 HG01079 NA19138 NA18974 NA18523 NA12717 NA19209 NA18577 NA18973 NA18943 NA12873 NA18623 NA18622 NA18948 NA19171 NA19204 NA06994 NA18563 NA18547 NA18861 NA18608 NA18995 NA10851 NA18976 NA18603 NA19200 HG01204 HG01191 HG01101 HG00146 HG00306 NA18985 HG00160 HG00635 HG00372 HG00357 HG00634 NA18541 NA18950 NA19759 HG00351 HG00257 HG00118 HG00336 HG00448 HG01354 NA18609 HG00428 HG00326 NA11894 NA18956 HG00173 HG00117 NA11893 HG01251 HG01441 HG01437 HG00182 HG00330 HG01060 HG00329 NA18960 NA18856 NA07346 NA18871 NA19057 NA18868 NA18636 NA12830 NA19007 NA18910 NA18874 NA19056 NA19064 NA19066 NA18487 NA18642 NA19236 NA07056 NA18637 NA19235 NA19309 NA19311 NA19334 NA19346 NA19347 NA19372 NA19376 NA19383 NA19384 NA19394 NA19428 NA19430 NA19451 NA19466 NA19313 NA19321 NA19324 NA19332 NA19390 NA19436 NA19439 NA19440 NA19463 NA19470 NA19471 NA19472 NA19676 NA19660 NA19661 NA19663 NA19722 NA19725 NA19728 NA19729 NA19731 NA19749 NA19755 NA19756 NA19758 NA19770 NA19773 NA19777 NA19780 NA19783 NA20525 NA20589 NA20765 NA20802 NA20804 NA18544 NA18602 NA18546 NA18610 NA18957 NA18615 NA18616 NA19010 NA18638 NA18639 NA18627 NA19072 NA18630 NA19074 NA19080 NA19081 NA19083 NA19085 NA19088 NA20287 NA19835 NA20276 NA19818 NA20278 NA20282 NA20342 NA20296 NA20314 NA20346 NA19712 NA19198 NA19108 NA18934 NA18916 NA18907 NA18917 NA06989 NA12058 NA12341 NA12546 NA12489 HG01197 NA18983 NA11843 NA11892 NA12749 NA12282 NA12751 NA18959 NA19331 NA19453 NA20537 NA12046 NA20515 NA20516 NA20521 NA20524 NA20528 NA20759 NA20768 NA20769 NA20774 NA20775 NA20783 NA20787 NA20790 NA20800 NA20819 NA20812 NA20505 NA20530 NA20540 NA20538 NA20581 NA20815 NA20544 NA20810 NA20807 NA20816 NA20504 NA20753 NA20502 NA12342 NA19150 NA19468 NA20336 NA19395 NA19257 NA19360 NA19700 NA18867 NA20317 NA18968 NA19107 HG00111 HG00108 NA19077 NA19684 NA18511 NA12044 NA19382 NA19457 NA18933 NA18923 NA18965 HG00141 NA20341 NA18740 HG00537 HG00346 HG01173 HG00702 HG00313 HG00150 NA18612 HG00339 NA12273 HG00250 NA18593 NA18621 HG00478 HG00251 HG01070 NA19160 HG00479 HG00608 NA18573 HG00375 NA19248 NA19093 HG01170 HG00534 HG01171 HG01522 NA18624 HG00683 HG01521 NA19005 NA20412 NA18971 HG00446 NA12748 HG00530 HG00690 HG01356 HG01516 NA20532 HG00344 HG00328 NA18542 HG00254 HG00321 HG00577 HG00656 HG00342 HG00524 HG00650 HG00557 HG00319 HG00457 HG00125 HG00578 HG00543 HG00638 HG00171 HG00699 HG00595 HG00187 HG00704 HG00533 HG00596 HG00268 HG01083 HG00651 HG01133 HG00671 HG00327 HG01148 HG00246 HG00672 HG00556 HG00436 HG00554 NA18633 NA20344 NA11993 NA07037 NA11930 HG01366 HG01389 HG00620 NA19740 HG00190 HG00419 NA18535 HG01495 NA18592 HG01497 HG00174 HG01140 NA12287 HG00689 HG01550 HG00334 HG01375 HG00637 NA18507 HG01113 NA18550 NA19129 HG01551 HG01462 HG00331 NA12413 HG01456 HG01360 HG00708 HG01350 HG00684 NA19099 HG00284 NA12399 NA12286 NA12777 HG00277 HG00266 NA19985 HG00353 HG01102 NA07347 NA07051 NA19900 NA18984 NA07048 HG00640 HG01066 NA12812 HG01174 HG01188 +20 669442 . TG T 99 PASS SEQUENCING.AC=101;CallSetAC=116,128,155,72,71;CallSetAC2=2,2,2,2,2;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=7;HU=G;IH=1;TR=7;TU=G;Set=SAMTOOLS;SEQUENOM.AC=54 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 676148 . A AC 99 PASS SEQUENCING.AC=3;CallSetAC=0,0,3,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=3;HU=A;IH=0;TR=6;TU=AAG;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 719486 . C CT 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,2,1,2;CallSetAC2=0,0,1,1,1;Groups=DINDEL,OX,SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 890696 . C CAT 99 PASS SEQUENCING.AC=6;CallSetAC=8,7,0,6,9;CallSetAC2=1,2,0,2,2;Groups=BC,BI,OX,SAMTOOLS;HR=3;HU=C;IH=0;TR=3;TU=C;Set=OX;SEQUENOM.AC=6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1102516 . CT C 99 PASS SEQUENCING.AC=6;CallSetAC=0,7,11,4,7;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=T;IH=0;TR=3;TU=T;Set=SAMTOOLS;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1149576 . CT C 99 PASS SEQUENCING.AC=2;CallSetAC=0,3,2,2,0;CallSetAC2=0,1,1,1,0;Groups=BI,DINDEL,OX;HR=5;HU=T;IH=0;TR=5;TU=T;Set=DINDEL;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1195706 . AAG A 99 PASS SEQUENCING.AC=273;CallSetAC=0,569,0,0,4;CallSetAC2=0,8,0,0,0;Groups=BI,SAMTOOLS;HR=3;HU=A;IH=0;TR=7;TU=AAG;Set=SAMTOOLS;SEQUENOM.AC=334 GT 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 1/1 1/1 0/1 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 . 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 1/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 1/1 +20 1342549 . A AAGAT 99 PASS SEQUENCING.AC=7;CallSetAC=8,6,12,8,7;CallSetAC2=0,0,2,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=2;TU=A;Set=OX;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1366475 . CT C 99 PASS SEQUENCING.AC=12;CallSetAC=0,0,12,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=2;HU=T;IH=0;TR=2;TU=T;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1550416 . C CT 99 PASS SEQUENCING.AC=28;CallSetAC=32,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1655540 . AT A 99 PASS SEQUENCING.AC=4;CallSetAC=7,5,4,4,4;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=DINDEL;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 2889034 . AAAAT A 99 PASS SEQUENCING.AC=8;CallSetAC=10,9,10,7,8;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=5;HU=A;IH=0;TR=5;TU=A;Set=BC;SEQUENOM.AC=6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 3203741 . CT C 99 PASS SEQUENCING.AC=5;CallSetAC=12,5,9,6,6;CallSetAC2=2,1,0,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=7;HU=C;IH=1;TR=7;TU=C;Set=SAMTOOLS;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 3700705 . CTTTGGG C 99 PASS SEQUENCING.AC=3;CallSetAC=4,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=3;HU=T;IH=0;TR=7;TU=CTT;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4037626 . TC T 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=1;CallSetAC=2,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=3;HU=C;IH=0;TR=3;TU=C;Set=BC;SEQUENOM.AC=194 GT 0/1 0/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 . 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 +20 4210074 . G GA 99 PASS SEQUENCING.AC=1124;CallSetAC=159,1498,819,1501,0;CallSetAC2=0,11,5,8,0;Groups=BC,BI,DINDEL,OX;HR=5;HU=G;IH=0;TR=5;TU=G;Set=BC;SEQUENOM.AC=565 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 . 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 . 1/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 +20 4363519 . CATT C 99 PASS SEQUENCING.AC=15;CallSetAC=18,20,15,14,16;CallSetAC2=0,1,0,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=SAMTOOLS;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4366806 . CAAAT C 99 PASS SEQUENCING.AC=2;CallSetAC=0,1,44,1,4;CallSetAC2=0,0,1,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 4641550 . CCTTGA C 99 PASS SEQUENCING.AC=3;CallSetAC=0,0,13,4,3;CallSetAC2=0,0,2,1,1;Groups=DINDEL,OX,SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=SAMTOOLS;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5105482 . C CATTTTAGG 99 PASS SEQUENCING.AC=150;CallSetAC=165,256,230,156,127;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=4;TU=AC;Set=OX;SEQUENOM.AC=101 GT 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 5289619 . GA G 99 PASS SEQUENCING.AC=968;CallSetAC=1106,1033,956,1020,1090;CallSetAC2=9,10,9,9,9;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=DINDEL;SEQUENOM.AC=377 GT 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/0 1/1 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 . 0/0 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/1 0/0 +20 5416109 . CA C 99 PASS SEQUENCING.AC=5;CallSetAC=0,7,6,5,6;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5432262 . AGT A 99 PASS SEQUENCING.AC=8;CallSetAC=9,10,9,8,9;CallSetAC2=1,1,2,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=7;TU=GT;Set=DINDEL;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5724449 . T TC 99 PASS SEQUENCING.AC=15;CallSetAC=0,0,15,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=4;HU=T;IH=0;TR=4;TU=T;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 6877907 . CA C 99 PASS SEQUENCING.AC=2;CallSetAC=0,2,3,2,4;CallSetAC2=0,1,2,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=2;TU=A;Set=OX;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 6969412 . CAAAGAAT C 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,4,1,1;CallSetAC2=0,0,1,0,0;Groups=DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=OX;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7229260 . T TA 99 PASS SEQUENCING.AC=4;CallSetAC=0,3,0,5,5;CallSetAC2=0,1,0,1,1;Groups=BI,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7239075 . AG A 99 PASS SEQUENCING.AC=6;CallSetAC=0,6,8,7,6;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=G;IH=0;TR=3;TU=G;Set=OX;SEQUENOM.AC=5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7942727 . A AC 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,1;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7950562 . C CT 99 PASS SEQUENCING.AC=5;CallSetAC=0,6,7,4,5;CallSetAC2=0,1,2,0,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=4;TU=AC;Set=BI;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8195466 . C CT 99 PASS SEQUENCING.AC=6;CallSetAC=14,3,9,6,7;CallSetAC2=1,0,0,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=6;HU=T;IH=1;TR=6;TU=T;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8233352 . TACTC T 99 PASS SEQUENCING.AC=146;CallSetAC=167,156,155,119,140;CallSetAC2=1,1,0,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=SAMTOOLS;SEQUENOM.AC=56 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 8504000 . TAG T 99 PASS SEQUENCING.AC=11;CallSetAC=16,10,39,10,13;CallSetAC2=1,1,0,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=4;TU=AG;Set=BI;SEQUENOM.AC=5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9231138 . AT A 99 PASS SEQUENCING.AC=11;CallSetAC=0,0,11,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=4;HU=T;IH=0;TR=7;TU=AT;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9921724 . AAAGT A 99 PASS SEQUENCING.AC=10;CallSetAC=12,15,22,11,12;CallSetAC2=0,1,0,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=DINDEL;SEQUENOM.AC=11 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9925738 . T TG 99 PASS SEQUENCING.AC=2;CallSetAC=3,3,3,3,3;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10090376 . T TG 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,2;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=3;HU=T;IH=0;TR=3;TU=T;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11229169 . T TA 99 PASS SEQUENCING.AC=4;CallSetAC=0,5,0,4,0;CallSetAC2=0,1,0,1,0;Groups=BI,OX;HR=6;HU=A;IH=1;TR=6;TU=A;Set=OX;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11511920 . AC A 99 PASS SEQUENCING.AC=3;CallSetAC=0,4,4,4,3;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=C;IH=0;TR=3;TU=C;Set=SAMTOOLS;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11893900 . ATTAG A 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,4,1,1;CallSetAC2=0,0,2,0,0;Groups=DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=7;TU=ATT;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12021825 . A AG 99 PASS SEQUENCING.AC=11;CallSetAC=14,10,15,11,13;CallSetAC2=1,0,0,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=1;TU=G;Set=BI;SEQUENOM.AC=5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12063752 . CTT C 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,5,2,2;CallSetAC2=0,0,1,1,1;Groups=DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=6;TU=CT;Set=DINDEL;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12094344 . TCAGGAGGC T 99 PASS SEQUENCING.AC=29;CallSetAC=37,59,27,15,33;CallSetAC2=1,2,1,1,2;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=T;IH=0;TR=3;TU=T;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12114989 . CTA C 99 PASS SEQUENCING.AC=3;CallSetAC=0,4,4,3,4;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=BI;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12371546 . GACA G 99 PASS SEQUENCING.AC=20;CallSetAC=27,23,20,17,22;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=7;TU=AAC;Set=SAMTOOLS;SEQUENOM.AC=10 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12512723 . G GTT 99 PASS SEQUENCING.AC=13;CallSetAC=15,16,27,14,13;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=T;IH=0;TR=3;TU=T;Set=SAMTOOLS;SEQUENOM.AC=6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12634463 . TGA T 99 PASS SEQUENCING.AC=182;CallSetAC=208,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12692743 . TTATC T 99 PASS SEQUENCING.AC=10;CallSetAC=0,12,61,10,10;CallSetAC2=0,0,1,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=T;IH=0;TR=3;TU=T;Set=SAMTOOLS;SEQUENOM.AC=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12837095 . G GA 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,1;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12928028 . TG T 99 PASS SEQUENCING.AC=22;CallSetAC=0,32,0,15,0;CallSetAC2=0,1,0,1,0;Groups=BI,OX;HR=6;HU=T;IH=1;TR=6;TU=T;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13003323 . GGGA G 99 PASS SEQUENCING.AC=2;CallSetAC=0,3,5,3,3;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=4;HU=G;IH=0;TR=7;TU=AGG;Set=DINDEL;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13128894 . CT C 99 PASS SEQUENCING.AC=27;CallSetAC=31,29,29,26,27;CallSetAC2=0,1,0,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=C;IH=0;TR=4;TU=C;Set=OX;SEQUENOM.AC=10 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 +20 13287841 . CAT C 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=36;CallSetAC=0,64,0,38,18;CallSetAC2=0,1,0,0,0;Groups=BI,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=BI;SEQUENOM.AC=626 GT 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/0 0/1 0/1 . 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 1/1 0/1 . 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 . 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 +20 13365589 . T TG 99 PASS SEQUENCING.AC=9;CallSetAC=11,9,9,8,11;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=G;IH=0;TR=3;TU=G;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13566260 rs78090544 AAATTG A 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=6;CallSetAC=0,161,6,5,0;CallSetAC2=0,2,0,0,0;Groups=BI,DINDEL,OX;HR=3;HU=A;IH=0;TR=3;TU=A;Set=OX;SEQUENOM.AC=390 GT 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/1 . 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 1/1 0/0 0/0 0/1 1/1 0/1 0/0 0/0 +20 13685184 . AT A 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,10,2,2;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13716193 . GAGAA G 99 PASS SEQUENCING.AC=2;CallSetAC=0,3,0,0,3;CallSetAC2=0,1,0,0,1;Groups=BI,SAMTOOLS;HR=1;HU=A;IH=0;TR=6;TU=AG;Set=SAMTOOLS;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13926445 . TA T 99 PASS SEQUENCING.AC=7;CallSetAC=0,0,7,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=2;HU=A;IH=0;TR=2;TU=A;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13960028 . TC T 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=8;CallSetAC=10,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=3;HU=T;IH=0;TR=3;TU=T;Set=BC;SEQUENOM.AC=188 GT 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 . 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . . 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 +20 14159734 . T TA 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,1,3,1;CallSetAC2=0,0,0,1,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=DINDEL;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14287634 . AGT A 99 PASS SEQUENCING.AC=2;CallSetAC=0,0,0,0,3;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=3;HU=A;IH=0;TR=5;TU=GT;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14383135 . TA T 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,15,1,1;CallSetAC2=0,0,1,0,0;Groups=DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=6;TU=ATC;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14669226 . G GA 99 AMBIGUOUS_SEQUENOM_CALLS SEQUENCING.AC=268;CallSetAC=306,304,274,234,282;CallSetAC2=0,1,2,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=OX;SEQUENOM.AC=121 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 +20 14697473 . TTC T 99 PASS SEQUENCING.AC=17;CallSetAC=20,22,17,15,16;CallSetAC2=0,1,0,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BC;SEQUENOM.AC=9 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14983337 . AGCC A 99 PASS SEQUENCING.AC=3;CallSetAC=0,4,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BI;HR=6;HU=A;IH=1;TR=6;TU=A;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15037520 . A AG 99 PASS SEQUENCING.AC=6;CallSetAC=0,0,6,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=1;HU=G;IH=0;TR=1;TU=G;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15141272 . T TC 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,1;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15189597 . GA G 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=5;CallSetAC=6,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=1;HU=A;IH=0;TR=1;TU=A;Set=BC;SEQUENOM.AC=311 GT 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 . 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 . 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 1/1 . 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 +20 15265098 . TG T 99 PASS SEQUENCING.AC=31;CallSetAC=27,79,0,41,4;CallSetAC2=1,1,0,1,0;Groups=BC,BI,OX,SAMTOOLS;HR=6;HU=T;IH=1;TR=6;TU=T;Set=BC;SEQUENOM.AC=125 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 +20 15410763 . TGA T 99 PASS SEQUENCING.AC=54;CallSetAC=55,68,57,57,56;CallSetAC2=1,2,0,1,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=1;TU=G;Set=SAMTOOLS;SEQUENOM.AC=29 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15543319 . AG A 99 PASS SEQUENCING.AC=11;CallSetAC=13,12,10,12,14;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=G;IH=0;TR=3;TU=G;Set=BC;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 15550845 . TG T 99 PASS SEQUENCING.AC=50;CallSetAC=58,58,56,47,53;CallSetAC2=2,2,2,1,2;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=7;TU=GTT;Set=BC;SEQUENOM.AC=34 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15703503 . TG T 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=9;CallSetAC=11,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=4;HU=T;IH=0;TR=4;TU=T;Set=BC;SEQUENOM.AC=87 GT 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/1 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 . 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15871330 . AG A 99 PASS SEQUENCING.AC=1;CallSetAC=2,2,2,2,2;CallSetAC2=0,0,1,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=BC;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16016504 . TA T 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=17;CallSetAC=4,36,0,18,0;CallSetAC2=0,1,0,0,0;Groups=BC,BI,OX;HR=1;HU=A;IH=0;TR=1;TU=A;Set=OX;SEQUENOM.AC=578 GT 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 . 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 +20 16192114 . AT A 99 INCORRECT_SEQUENOM_CALLS SEQUENCING.AC=45;CallSetAC=52,49,48,42,48;CallSetAC2=3,2,3,2,3;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=4;TU=CT;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16259934 . C CAA 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,0,0,2;CallSetAC2=0,1,0,0,1;Groups=BI,SAMTOOLS;HR=1;HU=T;IH=0;TR=4;TU=CT;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16312599 . CTA C 99 PASS SEQUENCING.AC=5;CallSetAC=0,6,5,3,6;CallSetAC2=0,1,0,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16723642 . GGTT G 99 PASS SEQUENCING.AC=9;CallSetAC=11,11,9,9,11;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=BI;SEQUENOM.AC=6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16747221 . CA C 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=1;CallSetAC=1,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=1;HU=A;IH=0;TR=1;TU=A;Set=BC;SEQUENOM.AC=473 GT 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/0 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/0 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 . 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/0 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 +20 16813850 . C CA 99 PASS SEQUENCING.AC=10;CallSetAC=12,12,11,7,8;CallSetAC2=1,1,3,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=5;HU=A;IH=0;TR=5;TU=A;Set=SAMTOOLS;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17250858 . T TC 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,1;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=1;HU=C;IH=0;TR=4;TU=CT;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17331332 . TA T 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=18;CallSetAC=0,0,0,19,0;CallSetAC2=0,0,0,1,0;Groups=OX;HR=2;HU=T;IH=0;TR=2;TU=T;Set=OX;SEQUENOM.AC=682 GT 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 . 0/1 . 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 +20 17473782 . TGC T 99 PASS SEQUENCING.AC=2;CallSetAC=0,3,4,2,3;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BI;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17607627 . A AGT 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,2,2,2;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=4;TU=AG;Set=SAMTOOLS;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 17753474 . C CA 99 PASS SEQUENCING.AC=3;CallSetAC=0,0,3,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=1;HU=A;IH=0;TR=4;TU=AC;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18417481 . AC A 99 PASS SEQUENCING.AC=8;CallSetAC=9,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=6;HU=A;IH=1;TR=6;TU=A;Set=BC;SEQUENOM.AC=17 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 18445795 . AAG A 99 PASS SEQUENCING.AC=15;CallSetAC=20,20,15,14,16;CallSetAC2=1,1,0,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=4;TU=AG;Set=DINDEL;SEQUENOM.AC=5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18520672 . A ATT 99 PASS SEQUENCING.AC=85;CallSetAC=98,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=4;HU=A;IH=0;TR=4;TU=A;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18522725 . ATTAAC A 99 PASS SEQUENCING.AC=4;CallSetAC=0,5,5,4,5;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BI;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18915562 . TAA T 99 PASS SEQUENCING.AC=6;CallSetAC=0,8,6,5,8;CallSetAC2=0,2,1,1,2;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=6;TU=AAT;Set=BI;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19111235 . C CT 99 PASS SEQUENCING.AC=7;CallSetAC=8,7,9,7,8;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=OX;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19188693 . T TC 99 PASS SEQUENCING.AC=15;CallSetAC=0,0,15,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=1;HU=G;IH=0;TR=1;TU=G;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19437778 . GGCCTGGGATGTAAA G 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,2,1,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL,OX;HR=2;HU=G;IH=0;TR=4;TU=GT;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19805154 . CCTT C 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,1,1,1;CallSetAC2=0,0,1,1,1;Groups=DINDEL,OX,SAMTOOLS;HR=3;HU=C;IH=0;TR=6;TU=CTT;Set=SAMTOOLS;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20030869 . CT C 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=5;CallSetAC=1,11,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BC,BI;HR=1;HU=T;IH=0;TR=1;TU=T;Set=BI;SEQUENOM.AC=404 GT 0/1 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/0 1/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/0 1/1 0/1 1/1 0/0 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 +20 20286529 . A AC 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,1,0,1;CallSetAC2=0,1,1,0,1;Groups=BI,DINDEL,SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20404656 . ATTACAGACT A 99 PASS SEQUENCING.AC=11;CallSetAC=12,19,14,11,13;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=OX;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20434198 . TA T 99 PASS SEQUENCING.AC=17;CallSetAC=0,0,0,18,0;CallSetAC2=0,0,0,1,0;Groups=OX;HR=3;HU=T;IH=0;TR=3;TU=T;Set=OX;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20716329 . CA C 99 PASS SEQUENCING.AC=4;CallSetAC=0,5,6,4,5;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=BI;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20760474 . TG T 99 PASS SEQUENCING.AC=21;CallSetAC=28,23,21,19,24;CallSetAC2=2,1,2,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=1;TU=G;Set=DINDEL;SEQUENOM.AC=15 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 20952825 . T TC 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,2,1,1;CallSetAC2=0,1,2,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=C;IH=0;TR=4;TU=CT;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20990240 . TC T 99 PASS SEQUENCING.AC=16;CallSetAC=0,0,16,0,0;CallSetAC2=0,0,2,0,0;Groups=DINDEL;HR=2;HU=C;IH=0;TR=2;TU=C;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21406859 . ACTT A 99 PASS SEQUENCING.AC=3;CallSetAC=4,4,4,4,4;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=A;IH=0;TR=6;TU=CTT;Set=BI;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21480245 . AG A 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,3,1,1;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21852048 . CA C 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=13;CallSetAC=12,49,0,14,0;CallSetAC2=1,0,0,0,0;Groups=BC,BI,OX;HR=2;HU=C;IH=0;TR=2;TU=C;Set=OX;SEQUENOM.AC=432 GT 0/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/0 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 0/0 1/1 0/1 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 . 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 0/0 1/1 . 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/1 1/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 +20 21968507 . AC A 99 PASS SEQUENCING.AC=10;CallSetAC=0,12,10,12,7;CallSetAC2=0,1,0,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=5;HU=C;IH=0;TR=5;TU=C;Set=DINDEL;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 22434333 . C CA 99 PASS SEQUENCING.AC=26;CallSetAC=30,32,31,23,26;CallSetAC2=0,1,0,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=C;IH=0;TR=4;TU=C;Set=SAMTOOLS;SEQUENOM.AC=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 22637424 . C CAGCCA 99 PASS SEQUENCING.AC=4;CallSetAC=0,5,4,4,6;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=OX;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 22655862 . TATC T 99 PASS SEQUENCING.AC=12;CallSetAC=14,15,18,11,14;CallSetAC2=1,1,0,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=4;TU=AT;Set=OX;SEQUENOM.AC=6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23200197 . ATT A 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,1;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=4;HU=T;IH=0;TR=4;TU=T;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23293728 . CA C 99 PASS SEQUENCING.AC=11;CallSetAC=15,12,15,9,13;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=BI;SEQUENOM.AC=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23813095 . CT C 99 PASS SEQUENCING.AC=18;CallSetAC=0,27,17,0,21;CallSetAC2=0,1,0,0,0;Groups=BI,DINDEL,SAMTOOLS;HR=4;HU=C;IH=0;TR=4;TU=C;Set=DINDEL;SEQUENOM.AC=26 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 23815381 . CT C 99 PASS SEQUENCING.AC=2;CallSetAC=0,4,3,2,2;CallSetAC2=0,1,2,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=6;TU=CTT;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23889003 . GA G 99 PASS SEQUENCING.AC=1;CallSetAC=2,1,1,2,3;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=6;TU=ATG;Set=DINDEL;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24710482 . GT G 99 PASS SEQUENCING.AC=9;CallSetAC=0,0,9,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=5;HU=T;IH=0;TR=5;TU=T;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24855121 . CT C 99 PASS SEQUENCING.AC=11;CallSetAC=14,13,10,12,12;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=5;HU=C;IH=0;TR=5;TU=C;Set=DINDEL;SEQUENOM.AC=6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25503211 . CATA C 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,2,1,1;CallSetAC2=0,1,2,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=7;TU=AAT;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25905250 . GT G 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=56;CallSetAC=0,58,57,0,0;CallSetAC2=0,1,1,0,0;Groups=BI,DINDEL;HR=6;HU=T;IH=1;TR=6;TU=T;Set=DINDEL;SEQUENOM.AC=764 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 . 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +20 29589873 . CCTT C 99 PASS SEQUENCING.AC=239;CallSetAC=333,196,0,0,0;CallSetAC2=1,1,0,0,0;Groups=BC,BI;HR=2;HU=C;IH=0;TR=6;TU=CTT;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29628180 . C CCACAAGAAG 99 PASS SEQUENCING.AC=7;CallSetAC=0,8,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BI;HR=2;HU=C;IH=0;TR=6;TU=CTT;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29804699 . A AC 99 PASS SEQUENCING.AC=23;CallSetAC=27,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=2;HU=A;IH=0;TR=2;TU=A;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29913425 . TATATC T 99 PASS SEQUENCING.AC=24;CallSetAC=30,25,82,25,26;CallSetAC2=0,0,1,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=5;TU=AT;Set=SAMTOOLS;SEQUENOM.AC=15 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30390854 . TTATACTA T 99 PASS SEQUENCING.AC=4;CallSetAC=0,6,5,4,4;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=4;TU=AT;Set=SAMTOOLS;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30534847 . ACAAT A 99 PASS SEQUENCING.AC=3;CallSetAC=0,3,5,2,4;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=SAMTOOLS;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30567910 . T TG 99 PASS SEQUENCING.AC=45;CallSetAC=52,7,0,48,0;CallSetAC2=1,0,0,1,0;Groups=BC,BI,OX;HR=3;HU=G;IH=0;TR=3;TU=G;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31412616 . CT C 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,2;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=3;HU=T;IH=0;TR=3;TU=T;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31760870 . CG C 99 PASS SEQUENCING.AC=1;CallSetAC=2,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=2;HU=G;IH=0;TR=4;TU=AC;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32015223 . CT C 99 PASS SEQUENCING.AC=9;CallSetAC=11,11,11,9,9;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BC;SEQUENOM.AC=5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32158330 . CAG C 99 PASS SEQUENCING.AC=18;CallSetAC=23,24,16,15,21;CallSetAC2=0,1,0,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=4;TU=AG;Set=OX;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32456076 . GT G 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,6,1,1;CallSetAC2=0,0,1,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=G;IH=0;TR=4;TU=GT;Set=OX;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32509752 . A AG 99 PASS SEQUENCING.AC=2;CallSetAC=0,0,0,3,3;CallSetAC2=0,0,0,1,1;Groups=OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32700247 . GGCGTCTGA G 99 PASS SEQUENCING.AC=3;CallSetAC=0,4,7,4,4;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=6;TU=CGG;Set=DINDEL;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32968409 . GTC G 99 PASS SEQUENCING.AC=121;CallSetAC=0,127,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BI;HR=1;HU=T;IH=0;TR=6;TU=ATG;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 33541746 . A AAG 99 PASS SEQUENCING.AC=8;CallSetAC=9,11,9,9,10;CallSetAC2=0,1,1,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=A;IH=0;TR=5;TU=AG;Set=BC;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34251969 . C CA 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,0,0,2;CallSetAC2=0,1,0,0,1;Groups=BI,SAMTOOLS;HR=1;HU=A;IH=0;TR=4;TU=AG;Set=SAMTOOLS;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34313574 . A AT 99 PASS SEQUENCING.AC=8;CallSetAC=0,9,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BI;HR=4;HU=T;IH=0;TR=4;TU=T;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34633573 . TAA T 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,3,2,2;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=6;HU=T;IH=1;TR=6;TU=T;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34831930 . CT C 99 PASS SEQUENCING.AC=13;CallSetAC=22,14,20,14,14;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=T;IH=0;TR=4;TU=T;Set=OX;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 35329008 . ATC A 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,3,1,1;CallSetAC2=0,0,2,0,0;Groups=DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=6;TU=ATC;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35357903 . GA G 99 PASS SEQUENCING.AC=11;CallSetAC=12,12,12,12,11;CallSetAC2=2,2,2,2,2;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=2;TU=A;Set=BC;SEQUENOM.AC=5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35847597 . CTT C 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,7,1,2;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=5;HU=T;IH=0;TR=5;TU=T;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36658020 . TG T 99 PASS SEQUENCING.AC=11;CallSetAC=15,12,12,8,12;CallSetAC2=1,1,1,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=OX;SEQUENOM.AC=6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36704724 . TC T 99 PASS SEQUENCING.AC=12;CallSetAC=15,13,14,10,14;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=DINDEL;SEQUENOM.AC=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36711544 . TAAAG T 99 PASS SEQUENCING.AC=2;CallSetAC=0,0,3,0,1;CallSetAC2=0,0,1,0,1;Groups=DINDEL,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36947086 . ATAC A 99 PASS SEQUENCING.AC=93;CallSetAC=107,109,94,86,100;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=6;TU=ACT;Set=OX;SEQUENOM.AC=33 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37139725 . CAG C 99 PASS SEQUENCING.AC=5;CallSetAC=0,6,6,5,7;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=6;TU=AG;Set=DINDEL;SEQUENOM.AC=5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37278654 . CAG C 99 PASS SEQUENCING.AC=17;CallSetAC=20,18,17,13,17;CallSetAC2=0,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=DINDEL;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37391272 . TG T 99 PASS SEQUENCING.AC=8;CallSetAC=14,9,9,9,10;CallSetAC2=1,0,0,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=DINDEL;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37608002 . CAT C 99 PASS SEQUENCING.AC=8;CallSetAC=8,13,12,9,10;CallSetAC2=0,1,1,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=5;TU=AC;Set=SAMTOOLS;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37678954 . C CTGG 99 PASS SEQUENCING.AC=7;CallSetAC=0,10,22,6,4;CallSetAC2=0,1,1,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=4;TU=CG;Set=SAMTOOLS;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37712193 . AAG A 99 PASS SEQUENCING.AC=44;CallSetAC=52,57,44,21,47;CallSetAC2=1,1,2,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=6;TU=AG;Set=SAMTOOLS;SEQUENOM.AC=29 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37836124 . AAAT A 99 PASS SEQUENCING.AC=3;CallSetAC=4,4,6,3,3;CallSetAC2=1,1,1,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=A;IH=0;TR=4;TU=A;Set=BC;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37954797 . A AGT 99 PASS SEQUENCING.AC=110;CallSetAC=126,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=1;HU=T;IH=0;TR=5;TU=AT;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37962643 . T TAA 99 PASS SEQUENCING.AC=370;CallSetAC=395,424,394,367,423;CallSetAC2=4,4,4,3,3;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=4;TU=AT;Set=DINDEL;SEQUENOM.AC=178 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 1/1 0/1 0/0 1/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 +20 38336199 . TA T 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,4,2,2;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38495835 . T TA 99 AMBIGUOUS_SEQUENOM_CALLS SEQUENCING.AC=147;CallSetAC=0,0,0,153,0;CallSetAC2=0,0,0,1,0;Groups=OX;HR=3;HU=A;IH=0;TR=4;TU=AT;Set=OX;SEQUENOM.AC=14 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38696054 . GAAGA G 99 PASS SEQUENCING.AC=2;CallSetAC=0,3,5,3,3;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=6;TU=AAG;Set=SAMTOOLS;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38784318 . CCTT C 99 PASS SEQUENCING.AC=17;CallSetAC=20,19,19,15,17;CallSetAC2=2,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=C;IH=0;TR=7;TU=CTT;Set=SAMTOOLS;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39042026 . T TG 99 PASS SEQUENCING.AC=11;CallSetAC=0,0,11,0,0;CallSetAC2=0,0,3,0,0;Groups=DINDEL;HR=4;HU=T;IH=0;TR=4;TU=T;Set=DINDEL;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39420665 . AG A 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=24;CallSetAC=3,51,0,25,0;CallSetAC2=0,2,0,1,0;Groups=BC,BI,OX;HR=2;HU=A;IH=0;TR=4;TU=GT;Set=OX;SEQUENOM.AC=688 GT 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 . 1/1 . 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/0 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 . 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +20 39607037 . C CA 99 AMBIGUOUS_SEQUENOM_CALLS SEQUENCING.AC=4;CallSetAC=0,0,4,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=1;HU=T;IH=0;TR=1;TU=T;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39868369 . T TG 99 PASS SEQUENCING.AC=5;CallSetAC=0,6,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BI;HR=2;HU=T;IH=0;TR=4;TU=GT;Set=BI;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40006262 . TGAG T 99 AMBIGUOUS_SEQUENOM_CALLS SEQUENCING.AC=4;CallSetAC=0,4,6,0,0;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL;HR=1;HU=G;IH=0;TR=6;TU=AGG;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40110981 . A AG 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,1;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=1;HU=G;IH=0;TR=4;TU=AG;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40445967 . TG T 99 PASS SEQUENCING.AC=4;CallSetAC=5,5,15,6,5;CallSetAC2=1,1,2,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=4;TU=GT;Set=BI;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40742257 . TG T 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,10,2,2;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41000677 . T TG 99 PASS SEQUENCING.AC=4;CallSetAC=0,5,8,5,0;CallSetAC2=0,1,2,1,0;Groups=BI,DINDEL,OX;HR=6;HU=G;IH=1;TR=6;TU=G;Set=BI;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41149621 . T TATCA 99 PASS SEQUENCING.AC=6;CallSetAC=6,6,10,8,0;CallSetAC2=0,1,1,1,0;Groups=BC,BI,DINDEL,OX;HR=1;HU=A;IH=0;TR=1;TU=A;Set=BC;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41364251 . A AAG 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,1;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=3;HU=A;IH=0;TR=4;TU=AC;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41543685 . CTAAGGAGGGAAAAAGATATAAT C 99 PASS SEQUENCING.AC=29;CallSetAC=0,36,29,22,0;CallSetAC2=0,1,1,1,0;Groups=BI,DINDEL,OX;HR=1;HU=T;IH=0;TR=1;TU=T;Set=OX;SEQUENOM.AC=12 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41851636 . TA T 99 PASS SEQUENCING.AC=208;CallSetAC=234,229,215,195,238;CallSetAC2=3,4,3,2,3;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=OX;SEQUENOM.AC=83 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 +20 41964672 . A AT 99 PASS SEQUENCING.AC=243;CallSetAC=0,0,0,253,0;CallSetAC2=0,0,0,1,0;Groups=OX;HR=2;HU=T;IH=0;TR=2;TU=T;Set=OX;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42145613 . TG T 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=300;CallSetAC=88,565,0,544,14;CallSetAC2=1,8,0,3,0;Groups=BC,BI,OX,SAMTOOLS;HR=5;HU=T;IH=0;TR=5;TU=T;Set=OX;SEQUENOM.AC=762 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 . 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 . 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +20 42159695 . GC G 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=6;CallSetAC=7,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=3;HU=G;IH=0;TR=3;TU=G;Set=BC;SEQUENOM.AC=87 GT 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 . 0/0 . 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +20 42261635 . C CATTT 99 PASS SEQUENCING.AC=54;CallSetAC=62,75,76,57,58;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=5;TU=AC;Set=DINDEL;SEQUENOM.AC=24 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42470352 . CACTT C 99 PASS SEQUENCING.AC=37;CallSetAC=43,44,42,37,41;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=7;TU=AC;Set=DINDEL;SEQUENOM.AC=19 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 42585924 . T TA 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,1,1,1;CallSetAC2=0,0,1,1,1;Groups=DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=2;TU=A;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42856201 . CT C 99 PASS SEQUENCING.AC=4;CallSetAC=0,5,5,3,4;CallSetAC2=0,1,2,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=4;HU=C;IH=0;TR=4;TU=C;Set=OX;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42909154 . T TGGGTC 99 PASS SEQUENCING.AC=5;CallSetAC=5,6,8,7,4;CallSetAC2=0,1,1,1,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=G;IH=0;TR=3;TU=G;Set=OX;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42918721 . AG A 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,1,1,1;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42930748 . A AG 99 PASS SEQUENCING.AC=30;CallSetAC=48,20,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC,BI;HR=2;HU=G;IH=0;TR=2;TU=G;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43245783 . AG A 99 PASS SEQUENCING.AC=2;CallSetAC=3,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=3;HU=A;IH=0;TR=3;TU=A;Set=BC;SEQUENOM.AC=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43371647 . GGGCTGTAA G 99 PASS SEQUENCING.AC=138;CallSetAC=158,179,179,128,155;CallSetAC2=0,2,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=G;IH=0;TR=3;TU=G;Set=SAMTOOLS;SEQUENOM.AC=80 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 43434234 . AG A 99 PASS SEQUENCING.AC=7;CallSetAC=8,8,16,7,6;CallSetAC2=1,1,3,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=BC;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43539258 . T TAG 99 PASS SEQUENCING.AC=2;CallSetAC=0,3,18,3,3;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43606638 . T TC 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,2;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43826992 . GC G 99 PASS SEQUENCING.AC=9;CallSetAC=11,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=3;HU=G;IH=0;TR=3;TU=G;Set=BC;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43993933 . CA C 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=12;CallSetAC=5,22,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BC,BI;HR=2;HU=C;IH=0;TR=2;TU=C;Set=BC;SEQUENOM.AC=565 GT 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/0 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/0 1/1 0/0 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 0/0 1/1 1/1 0/1 0/1 0/1 0/0 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/0 1/1 0/0 0/0 0/0 1/1 1/1 0/0 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 . 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 +20 44071585 . C CT 99 PASS SEQUENCING.AC=293;CallSetAC=310,351,323,302,335;CallSetAC2=0,1,0,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=4;TU=CT;Set=SAMTOOLS;SEQUENOM.AC=132 GT 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 +20 44220528 . T TC 99 PASS SEQUENCING.AC=29;CallSetAC=34,38,0,0,18;CallSetAC2=0,1,0,0,0;Groups=BC,BI,SAMTOOLS;HR=5;HU=T;IH=0;TR=5;TU=T;Set=BI;SEQUENOM.AC=59 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 44340276 . AACAG A 99 PASS SEQUENCING.AC=36;CallSetAC=42,88,46,33,36;CallSetAC2=1,1,0,0,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=BC;SEQUENOM.AC=37 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44464600 . T TA 99 PASS SEQUENCING.AC=57;CallSetAC=66,63,74,53,52;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=T;IH=0;TR=4;TU=T;Set=BC;SEQUENOM.AC=19 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44470843 . GAGTGTCGT G 99 PASS SEQUENCING.AC=8;CallSetAC=0,31,0,9,5;CallSetAC2=0,1,0,0,0;Groups=BI,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=OX;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44572563 . GA G 99 PASS SEQUENCING.AC=3;CallSetAC=6,4,4,4,4;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=BC;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44889286 . G GC 99 PASS SEQUENCING.AC=25;CallSetAC=29,28,39,22,26;CallSetAC2=0,0,1,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=BC;SEQUENOM.AC=13 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 45092013 . GT G 99 PASS SEQUENCING.AC=5;CallSetAC=5,7,6,6,6;CallSetAC2=0,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BI;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45300827 . CT C 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,3,1,1;CallSetAC2=0,0,2,0,0;Groups=DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45406096 . T TTC 99 PASS SEQUENCING.AC=8;CallSetAC=9,13,7,7,9;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=T;IH=0;TR=5;TU=CT;Set=DINDEL;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45668403 . CTG C 99 PASS SEQUENCING.AC=186;CallSetAC=213,221,191,166,197;CallSetAC2=2,3,2,1,2;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=4;TU=GT;Set=SAMTOOLS;SEQUENOM.AC=86 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 46051811 . T TAAGC 99 PASS SEQUENCING.AC=6;CallSetAC=0,4,9,9,3;CallSetAC2=0,0,1,1,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46353646 . A AG 99 PASS SEQUENCING.AC=3;CallSetAC=0,0,3,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=3;HU=A;IH=0;TR=3;TU=A;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46413551 . TC T 99 PASS SEQUENCING.AC=5;CallSetAC=6,6,9,3,4;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=C;IH=0;TR=1;TU=C;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46569465 . CTG C 99 PASS SEQUENCING.AC=14;CallSetAC=15,18,16,15,15;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=BC;SEQUENOM.AC=10 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46720983 . ATACTTGG A 99 PASS SEQUENCING.AC=5;CallSetAC=0,8,5,4,7;CallSetAC2=0,1,0,0,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=2;TU=A;Set=DINDEL;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47032179 . GC G 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,3,2,2;CallSetAC2=0,1,2,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47136092 . A AGTC 99 PASS SEQUENCING.AC=4;CallSetAC=6,5,5,4,5;CallSetAC2=0,0,1,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=BI;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47335386 . GC G 99 PASS SEQUENCING.AC=4;CallSetAC=7,4,4,4,5;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=G;IH=0;TR=3;TU=G;Set=OX;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47428163 . C CA 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=141;CallSetAC=70,232,0,0,0;CallSetAC2=0,2,0,0,0;Groups=BC,BI;HR=7;HU=C;IH=1;TR=7;TU=C;Set=BC;SEQUENOM.AC=766 GT 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 +20 47988904 . CA C 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=2;CallSetAC=3,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=1;HU=A;IH=0;TR=4;TU=CT;Set=BC;SEQUENOM.AC=187 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 1/1 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 . 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 +20 48262933 . CCTA C 99 PASS SEQUENCING.AC=29;CallSetAC=33,32,30,27,31;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=C;IH=0;TR=3;TU=C;Set=OX;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49438742 . G GT 99 PASS SEQUENCING.AC=11;CallSetAC=13,15,16,10,10;CallSetAC2=0,1,0,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=DINDEL;SEQUENOM.AC=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49451656 . T TG 99 PASS SEQUENCING.AC=6;CallSetAC=0,0,6,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=4;HU=T;IH=0;TR=4;TU=T;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49537420 . AG A 99 PASS SEQUENCING.AC=10;CallSetAC=12,11,12,9,11;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=G;IH=0;TR=3;TU=G;Set=BI;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49561273 . A AG 99 PASS SEQUENCING.AC=2;CallSetAC=0,0,4,2,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL,OX;HR=2;HU=G;IH=0;TR=4;TU=AG;Set=OX;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49765611 . A AC 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,1,0,0;CallSetAC2=0,0,1,0,0;Groups=DINDEL;HR=1;HU=C;IH=0;TR=1;TU=C;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50136971 . TTTTC T 99 PASS SEQUENCING.AC=10;CallSetAC=0,20,12,8,9;CallSetAC2=0,1,1,0,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=4;HU=T;IH=0;TR=4;TU=T;Set=DINDEL;SEQUENOM.AC=8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50373155 . A AT 99 PASS SEQUENCING.AC=10;CallSetAC=12,11,13,11,11;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=4;TU=AT;Set=SAMTOOLS;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50772065 . T TC 99 PASS SEQUENCING.AC=7;CallSetAC=0,0,7,0,0;CallSetAC2=0,0,2,0,0;Groups=DINDEL;HR=7;HU=T;IH=1;TR=7;TU=T;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50806976 . G GAA 99 PASS SEQUENCING.AC=309;CallSetAC=357,333,309,296,330;CallSetAC2=0,1,0,1,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=7;TU=AGG;Set=DINDEL;SEQUENOM.AC=128 GT 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 . 0/0 . 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 +20 50961401 . G GT 99 PASS SEQUENCING.AC=10;CallSetAC=12,11,13,10,11;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=SAMTOOLS;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51547787 . AC A 99 PASS SEQUENCING.AC=1;CallSetAC=0,1,14,1,1;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51838824 . GA G 99 PASS SEQUENCING.AC=1;CallSetAC=2,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=3;HU=G;IH=0;TR=4;TU=AC;Set=BC;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51961394 . ATTTG A 99 PASS SEQUENCING.AC=14;CallSetAC=19,15,18,15,14;CallSetAC2=0,0,2,0,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=3;HU=T;IH=0;TR=3;TU=T;Set=OX;SEQUENOM.AC=8 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53081927 . CATGA C 99 PASS SEQUENCING.AC=9;CallSetAC=11,11,10,8,9;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=1;TU=A;Set=SAMTOOLS;SEQUENOM.AC=5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53538294 . T TG 99 PASS SEQUENCING.AC=2;CallSetAC=0,0,2,0,0;CallSetAC2=0,0,2,0,0;Groups=DINDEL;HR=1;HU=G;IH=0;TR=7;TU=GT;Set=DINDEL;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53602394 . T TA 99 PASS SEQUENCING.AC=15;CallSetAC=18,18,15,15,14;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=4;TU=AC;Set=BC;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54124185 . T TC 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,0,0,1;CallSetAC2=0,0,0,0,1;Groups=SAMTOOLS;HR=2;HU=T;IH=0;TR=5;TU=CT;Set=SAMTOOLS;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54150907 . CAG C 99 PASS SEQUENCING.AC=3;CallSetAC=0,4,3,4,4;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=4;TU=AG;Set=SAMTOOLS;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54166824 . AC A 99 PASS SEQUENCING.AC=5;CallSetAC=6,6,8,4,5;CallSetAC2=1,1,2,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=A;IH=0;TR=4;TU=A;Set=OX;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54230743 . CAT C 99 PASS SEQUENCING.AC=6;CallSetAC=8,7,8,6,6;CallSetAC2=2,1,2,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=4;TU=AC;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54262948 . A AC 99 PASS SEQUENCING.AC=684;CallSetAC=0,0,0,710,0;CallSetAC2=0,0,0,3,0;Groups=OX;HR=6;HU=A;IH=1;TR=6;TU=A;Set=OX;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54309727 . TGAGC T 99 PASS SEQUENCING.AC=19;CallSetAC=24,20,0,12,22;CallSetAC2=1,1,0,1,1;Groups=BC,BI,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=1;TU=G;Set=BC;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54379666 . GT G 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=8;CallSetAC=4,15,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BC,BI;HR=1;HU=T;IH=0;TR=1;TU=T;Set=BC;SEQUENOM.AC=172 GT 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/1 1/1 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 +20 55264363 . AG A 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=12;CallSetAC=7,0,0,19,0;CallSetAC2=1,0,0,0,0;Groups=BC,OX;HR=1;HU=G;IH=0;TR=5;TU=AG;Set=OX;SEQUENOM.AC=530 GT 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/0 0/0 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 0/1 1/1 0/0 1/1 0/0 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 1/1 0/0 1/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 0/0 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 . 1/1 . 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 +20 55608811 . CT C 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=1;CallSetAC=2,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=2;HU=C;IH=0;TR=4;TU=CT;Set=BC;SEQUENOM.AC=35 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 +20 55611547 . CAA C 99 PASS SEQUENCING.AC=2;CallSetAC=0,3,6,3,3;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=A;IH=0;TR=3;TU=A;Set=SAMTOOLS;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55658161 . GT G 99 PASS SEQUENCING.AC=129;CallSetAC=0,136,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BI;HR=1;HU=T;IH=0;TR=5;TU=GT;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55989765 . CA C 99 TOO_MANY_ALT_ALLELES SEQUENCING.AC=15;CallSetAC=17,0,0,0,0;CallSetAC2=1,0,0,0,0;Groups=BC;HR=1;HU=A;IH=0;TR=1;TU=A;Set=BC;SEQUENOM.AC=208 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/1 0/0 1/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 +20 56249865 . T TGAGG 99 PASS SEQUENCING.AC=5;CallSetAC=0,6,5,6,6;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=T;IH=0;TR=2;TU=T;Set=BI;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56344957 . GT G 99 PASS SEQUENCING.AC=3;CallSetAC=0,4,5,4,4;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=3;HU=T;IH=0;TR=3;TU=T;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56419021 . T TG 99 PASS SEQUENCING.AC=10;CallSetAC=0,11,0,0,0;CallSetAC2=0,1,0,0,0;Groups=BI;HR=1;HU=G;IH=0;TR=1;TU=G;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56915853 . TG T 99 PASS SEQUENCING.AC=27;CallSetAC=36,29,37,24,29;CallSetAC2=2,2,2,2,2;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=G;IH=0;TR=6;TU=GGT;Set=BC;SEQUENOM.AC=17 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57676578 . CCTTT C 99 PASS SEQUENCING.AC=10;CallSetAC=14,11,14,8,9;CallSetAC2=1,1,1,1,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=BI;SEQUENOM.AC=7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 58288793 . TC T 99 PASS SEQUENCING.AC=87;CallSetAC=101,106,87,65,66;CallSetAC2=2,3,2,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=C;IH=0;TR=1;TU=C;Set=SAMTOOLS;SEQUENOM.AC=44 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59153061 . CTG C 99 PASS SEQUENCING.AC=2;CallSetAC=0,2,5,3,3;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=DINDEL;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59186675 . TATTA T 99 PASS SEQUENCING.AC=1;CallSetAC=0,0,13,1,1;CallSetAC2=0,0,2,0,0;Groups=DINDEL,OX,SAMTOOLS;HR=1;HU=A;IH=0;TR=7;TU=AT;Set=SAMTOOLS;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59349754 . CCT C 99 PASS SEQUENCING.AC=26;CallSetAC=108,28,0,0,30;CallSetAC2=0,1,0,0,0;Groups=BC,BI,SAMTOOLS;HR=3;HU=C;IH=0;TR=3;TU=C;Set=BI;SEQUENOM.AC=168 GT 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 1/1 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/1 0/1 0/0 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 . 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 59365768 . TG T 99 PASS SEQUENCING.AC=4;CallSetAC=0,5,26,4,5;CallSetAC2=0,0,1,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=G;IH=0;TR=2;TU=G;Set=SAMTOOLS;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59769242 . C CT 99 PASS SEQUENCING.AC=4;CallSetAC=7,4,8,5,5;CallSetAC2=1,1,1,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=T;IH=0;TR=1;TU=T;Set=BC;SEQUENOM.AC=4 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60337932 . AC A 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,6,2,2;CallSetAC2=0,1,1,1,1;Groups=BI,DINDEL,OX,SAMTOOLS;HR=2;HU=A;IH=0;TR=6;TU=AAC;Set=OX;SEQUENOM.AC=3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60925525 . GC G 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,6,0,2;CallSetAC2=0,1,1,0,1;Groups=BI,DINDEL,SAMTOOLS;HR=2;HU=C;IH=0;TR=2;TU=C;Set=SAMTOOLS;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61000018 . GC G 99 PASS SEQUENCING.AC=318;CallSetAC=0,348,0,317,0;CallSetAC2=0,1,0,2,0;Groups=BI,OX;HR=3;HU=G;IH=0;TR=3;TU=G;Set=OX;SEQUENOM.AC=203 GT 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/1 1/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/1 1/1 . 0/1 . 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 1/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 1/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 +20 61531765 . AG A 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,8,2,2;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=1;HU=G;IH=0;TR=4;TU=CG;Set=BI;SEQUENOM.AC=0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61983510 . TCTGC T 99 PASS SEQUENCING.AC=124;CallSetAC=142,187,162,95,108;CallSetAC2=0,0,2,1,0;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=1;HU=C;IH=0;TR=7;TU=CCT;Set=SAMTOOLS;SEQUENOM.AC=75 GT 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 +20 62154368 . G GA 99 PASS SEQUENCING.AC=2;CallSetAC=0,3,0,0,3;CallSetAC2=0,1,0,0,1;Groups=BI,SAMTOOLS;HR=4;HU=G;IH=0;TR=4;TU=G;Set=BI;SEQUENOM.AC=2 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62310426 . CTT C 99 PASS SEQUENCING.AC=1;CallSetAC=0,2,6,2,2;CallSetAC2=0,0,2,0,0;Groups=BI,DINDEL,OX,SAMTOOLS;HR=4;HU=T;IH=0;TR=4;TU=T;Set=OX;SEQUENOM.AC=1 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62871860 . C CCCGCA 99 PASS SEQUENCING.AC=26;CallSetAC=29,49,32,20,30;CallSetAC2=0,1,2,1,1;Groups=BC,BI,DINDEL,OX,SAMTOOLS;HR=4;HU=C;IH=0;TR=4;TU=C;Set=SAMTOOLS;SEQUENOM.AC=27 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 diff --git a/tests/tabix_data/vcf/7.vcf b/tests/tabix_data/vcf/7.vcf new file mode 100644 index 0000000..33e3ca7 --- /dev/null +++ b/tests/tabix_data/vcf/7.vcf @@ -0,0 +1,317 @@ +##fileformat=VCFv4.1 +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##FILTER= +##fileDate=20110524 +##reference=ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/human_g1k_v37.fasta.gz +##source=EricBanksValidationQC;fromGoncaloAbecasisValidationSelection +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00127 HG00128 HG00136 HG00137 HG00138 HG00139 HG00152 HG00156 HG00234 HG00235 HG00237 HG00242 HG00244 HG00262 HG01055 HG01079 NA19138 NA18974 NA18523 NA12717 NA19209 NA18577 NA18973 NA18943 NA12873 NA18623 NA18622 NA18948 NA19171 NA19204 NA06994 NA18563 NA18547 NA18861 NA18608 NA12282 NA12751 NA18959 NA19331 NA19453 NA20537 NA12046 NA20515 NA20516 NA20521 NA20524 NA20528 NA20759 NA20768 NA20769 NA20774 NA20775 NA20783 NA20787 NA20790 NA20800 NA20819 NA20812 NA20505 NA20530 NA20540 NA20538 NA20581 NA20815 NA20544 NA20810 NA20807 NA20816 NA20504 NA20753 NA20502 NA12342 NA19150 NA19468 NA20336 NA19395 NA19257 NA19360 NA19700 NA18867 NA20317 NA18968 NA19107 HG00111 HG00108 NA19077 NA19684 NA18511 NA12044 NA19382 NA19457 NA18933 NA18923 NA18965 HG00141 NA20341 NA18740 HG00537 HG00346 HG01173 HG00702 HG00313 HG00150 NA18612 HG00339 NA12273 HG00250 NA18593 NA18621 HG00478 HG00251 HG01070 NA19160 NA18995 NA10851 NA18976 NA18603 NA19200 HG01204 HG01191 HG01101 HG00146 HG00306 NA18985 HG00160 HG00635 HG00372 HG00357 HG00634 NA18541 NA18950 NA19759 HG00351 HG00257 HG00118 HG00336 HG00448 HG01354 NA18609 HG00428 HG00326 NA11894 NA18956 HG00173 HG00117 NA11893 HG01251 HG01441 HG01437 HG00182 HG00330 HG01060 HG00329 NA18960 NA18856 NA07346 NA18871 NA19057 NA18868 NA18636 NA12830 NA19007 NA18910 NA18874 NA19056 NA19064 NA19066 NA18487 NA18642 NA19236 NA07056 NA18637 NA19235 NA19309 NA19311 NA19334 NA19346 NA19347 NA19372 NA19376 NA19383 NA19384 NA19394 NA19428 NA19430 NA19451 NA19466 NA19313 NA19321 NA19324 NA19332 HG00479 HG00608 NA18573 HG00375 NA19248 NA19093 HG01170 HG00534 HG01171 HG01522 NA18624 HG00683 HG01521 NA19005 NA20412 NA18971 HG00446 NA12748 HG00530 HG00690 HG01356 HG01516 NA20532 HG00344 HG00328 NA18542 HG00254 HG00321 HG00577 HG00656 HG00342 HG00524 HG00650 HG00557 HG00319 HG00457 HG00125 HG00578 HG00543 HG00638 HG00171 HG00699 HG00595 HG00187 HG00704 HG00533 HG00596 HG00268 HG01083 HG00651 HG01133 HG00671 HG00327 HG01148 HG00246 HG00672 HG00556 HG00436 HG00554 NA18633 NA20344 NA11993 NA07037 NA11930 HG01366 HG01389 HG00620 NA19740 HG00190 HG00419 NA18535 HG01495 NA18592 HG01497 HG00174 HG01140 NA12287 HG00689 HG01550 HG00334 HG01375 HG00637 NA18507 HG01113 NA18550 NA19129 HG01551 HG01462 HG00331 NA12413 HG01456 HG01360 HG00708 HG01350 HG00684 NA19099 HG00284 NA12399 NA12286 NA12777 HG00277 HG00266 NA19985 HG00353 HG01102 NA07347 NA07051 NA19900 NA18984 NA07048 HG00640 HG01066 NA12812 HG01174 HG01188 NA19390 NA19436 NA19439 NA19440 NA19463 NA19470 NA19471 NA19472 NA19676 NA19660 NA19661 NA19663 NA19722 NA19725 NA19728 NA19729 NA19731 NA19749 NA19755 NA19756 NA19758 NA19770 NA19773 NA19777 NA19780 NA19783 NA20525 NA20589 NA20765 NA20802 NA20804 NA18544 NA18602 NA18546 NA18610 NA18957 NA18615 NA18616 NA19010 NA18638 NA18639 NA18627 NA19072 NA18630 NA19074 NA19080 NA19081 NA19083 NA19085 NA19088 NA20287 NA19835 NA20276 NA19818 NA20278 NA20282 NA20342 NA20296 NA20314 NA20346 NA19712 NA19198 NA19108 NA18934 NA18916 NA18907 NA18917 NA06989 NA12058 NA12341 NA12546 NA12489 HG01197 NA18983 NA11843 NA11892 NA12749 +20 82176 rs11906362 T C 318 NOT_DESIGNED BCM.AC=16;DB;SRC=VQSR+2-OF-7 +20 249843 rs112456910 C T 1304 PASS BCM.AC=14;DB;SEQUENOM.AC=12;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 . . . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 0/1 . . 0/0 0/0 . 0/0 . . . 0/0 . 0/0 0/0 0/1 0/0 . . . 0/0 . 0/0 . . . . . . . . . 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 . . . . . 0/0 0/0 . . 0/0 . . 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 . 0/0 . . . . . 0/0 0/0 . . 0/1 . . 0/0 . 0/1 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . . . . . 0/0 . . . . . 0/0 . 0/1 . . . . 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 . . . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 . . . 0/0 0/1 0/0 . . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . . 0/0 . 0/0 0/0 0/0 . . . . . . . 0/0 . 0/0 . . . . . . . . . . 0/0 . 0/0 . . 0/0 0/0 . . . . . 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 . . 0/0 . 0/0 0/0 . 0/0 . 0/0 . 0/0 0/0 . 0/0 0/0 . 0/1 0/1 0/0 . . 0/0 0/0 . . 0/0 0/1 . . 0/1 . . . 0/0 0/0 0/0 . . . . . 0/0 . +20 688672 rs116071340 C T 56 PASS BCM.AC=1;DB;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 987773 rs6077519 T G 474 PASS DB;HW_VIOLATION;SEQUENOM.AC=73;SRC=VQSR-ONLY GT . 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 1/1 1/1 0/0 1/1 0/0 0/0 0/0 0/0 1/1 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 +20 1166164 . G T 26 NOT_DESIGNED BCM.AC=20;SRC=VQSR+2-OF-7 +20 1333317 . A G 4 PASS SEQUENOM.AC=0;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1372898 rs112426678 C A 833 PASS BCM.AC=7;DB;SEQUENOM.AC=6;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1526045 rs11908182 A G 847 PASS BCM.AC=6;DB;SEQUENOM.AC=6;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1565049 . C T 100 PASS SEQUENOM.AC=3;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1577285 . G A 4 HIGH_NO_CALL_RATE SEQUENOM.AC=0;SRC=VQSR-ONLY GT . . . 0/0 0/0 . 0/0 . . . 0/0 0/0 . 0/0 . . 0/0 0/0 . . . 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . 0/0 . 0/0 . 0/0 0/0 . . 0/0 . . . 0/0 . 0/0 . . . 0/0 . . . . . . 0/0 . 0/0 . 0/0 0/0 . 0/0 . . . 0/0 . . . . . 0/0 0/0 . . . . 0/0 0/0 . 0/0 . . 0/0 0/0 . . . . . 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 . . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . 0/0 0/0 . . . 0/0 . . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . . . . . 0/0 . 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 . . . . 0/0 . . . . . . . . 0/0 . . . 0/0 . . . . . . . . . . . . 0/0 . . 0/0 0/0 . 0/0 . . 0/0 . 0/0 . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . . . 0/0 . . . 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 . . . 0/0 . 0/0 . . . 0/0 . 0/0 0/0 . . 0/0 . 0/0 0/0 . . 0/0 . . . . . . 0/0 . 0/0 0/0 . 0/0 . . . 0/0 . . . 0/0 . 0/0 0/0 . . . . 0/0 0/0 0/0 . . . . 0/0 0/0 . . . . . . 0/0 0/0 . . . . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . . . . 0/0 0/0 0/0 . 0/0 . 0/0 . 0/0 0/0 . 0/0 . 0/0 . 0/0 . 0/0 . . . . . 0/0 0/0 0/0 . . 0/0 0/0 +20 1577845 . G A 267 HIGH_NO_CALL_RATE BCM.AC=42;SEQUENOM.AC=5;SRC=VQSR+2-OF-7 GT 0/0 . . 0/0 . . . . . . 0/0 . . 0/0 . . 0/0 0/0 . . . . 0/0 0/0 . 0/0 . 0/0 . . 0/0 0/0 . 1/1 0/0 0/0 . 0/0 . 0/0 0/0 . . 0/0 . . . . . 0/0 . 0/0 . 0/0 . . . . . . 0/0 . 0/0 . 0/0 . . 0/0 . . . 0/0 . . . . . . . . . . . 0/0 0/0 . 0/0 . . 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . 0/0 . . 0/0 . . 0/0 . . 0/0 0/0 . . 0/0 . . . 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 . 0/0 0/0 . . . 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . . . . . . 0/0 . 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 . . . . 0/0 . . 0/0 . . . . . 0/0 . . . . 0/0 . . . . . . . . . . . 0/0 . . 0/0 0/0 . 0/0 . . 0/0 . 0/0 . 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 . . . 0/0 0/0 . . 0/0 0/0 . 0/0 0/0 . . 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 . 0/0 . . 0/0 0/0 . . . 0/0 . 0/0 . . . 0/0 . 0/0 0/0 . 0/0 0/0 0/0 . 0/0 . . 0/0 . 0/0 . . . . . . 0/0 0/0 . 0/0 . . . 0/0 . . 0/0 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 . . . . 0/0 . 0/0 0/0 . . . . 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . . . 0/0 0/0 0/0 . . . . 0/0 0/0 0/1 . 0/0 . . . 0/0 . 1/1 . . 0/0 . 0/0 0/0 . 0/0 . . 0/0 0/0 +20 1590306 . A G 16 AMBIGUOUS_SEQUENOM_CALLS SEQUENOM.AC=177;SRC=VQSR-ONLY GT 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 . 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 . 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 . 0/0 . 0/1 0/1 0/1 . 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 . 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 . 0/0 0/0 . . . 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 . 0/1 0/1 0/1 0/1 . 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 . 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 . . 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 . 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 . 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 . 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 . 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/1 . 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 +20 1643825 . G T 24 PASS BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1746733 . G A 9 NOT_DESIGNED SRC=VQSR-ONLY +20 1896670 . G C 16 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1934851 rs6045641 T C 53 NOT_DESIGNED BCM.AC=29;DB;SRC=VQSR-ONLY +20 2083617 . G A 9 NOT_DESIGNED BCM.AC=4;SRC=VQSR+2-OF-7 +20 2280790 rs214779 T A 57436 NOT_DESIGNED BCM.AC=758;DB;SRC=VQSR+2-OF-7 +20 2843004 rs118020362 T C 131 PASS BCM.AC=4;DB;SEQUENOM.AC=4;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 2854191 . C T 78 POSSIBLE_PROBE_FAILURE BCM.AC=25;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 2999522 . G A 5 NOT_DESIGNED SRC=VQSR-ONLY +20 3935503 . G A 95 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 4015187 . G C 93 DUPLICATE_MAPPING BCM.AC=14;SRC=VQSR+2-OF-7 +20 4260976 rs75912589 A G 8109 PASS BCM.AC=94;DB;SEQUENOM.AC=95;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 +20 4557512 . C A 8 NOT_DESIGNED SRC=VQSR-ONLY +20 4603711 . C T 20 PASS SEQUENOM.AC=1;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5021712 rs115278430 C A 76 NOT_DESIGNED BCM.AC=2;DB;SRC=VQSR+2-OF-7 +20 5137904 . C T 70 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5500990 rs116723001 C A 1701 PASS BCM.AC=14;DB;SEQUENOM.AC=13;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5524677 . C T 21 PASS BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5601529 rs6085225 G A 1415 PASS BCM.AC=33;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5773125 . G A 165 NOT_DESIGNED BCM.AC=3;SRC=VQSR+INTERSECTION +20 5986950 rs6085343 G A 1226 PASS BCM.AC=68;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 6242013 . G A 10 DUPLICATE_MAPPING SRC=2-OF-7-ONLY +20 6320495 . C A 16 NOT_DESIGNED BCM.AC=2;SRC=VQSR+2-OF-7 +20 6575066 . T C 9.19 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7228334 . A G 108 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7274968 . C T 39 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7321986 . C G 5 PASS SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7377337 . C T 180 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7400995 rs114967944 C T 426 PASS BCM.AC=8;DB;SEQUENOM.AC=6;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7466093 . C G 4.11 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7575759 rs28491496 A G 308 POSSIBLE_PROBE_FAILURE BCM.AC=17;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7678819 rs11699779 A G 12976 PASS BCM.AC=95;DB;SEQUENOM.AC=93;SRC=VQSR+INTERSECTION GT . 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 . 0/1 . . 0/1 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 . 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 +20 7924363 . G A 301 PASS BCM.AC=2;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8165430 rs61262870 T C 1699 NOT_DESIGNED DB;SRC=VQSR+2-OF-7 +20 8642873 . A G 19 NOT_DESIGNED BCM.AC=58;SRC=VQSR+2-OF-7 +20 8700342 . T G 102 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 8799615 . C T 38 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9149281 . C T 11 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9214590 . T C 99 PASS BCM.AC=3;SEQUENOM.AC=3;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9276871 . C T 695 NOT_DESIGNED BCM.AC=11;SRC=VQSR+2-OF-7 +20 10226915 rs74843547 G A 120 PASS BCM.AC=1;DB;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10259160 . T A 10 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10482699 . G A 101 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10625431 . T C 17 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11506447 . G C 100 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11565628 . G A 22 PASS BCM.AC=1;SEQUENOM.AC=3;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11625368 rs111669054 A G 138 PASS BCM.AC=2;DB;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 11798908 . A G 14 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12006592 . A G 57 PASS SEQUENOM.AC=6;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12025988 . C T 34 NOT_DESIGNED BCM.AC=43;SRC=VQSR+2-OF-7 +20 12142653 . T A 12 PASS BCM.AC=2;SEQUENOM.AC=3;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12171235 . A G 60 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12326082 . C T 118 NOT_DESIGNED SRC=VQSR+2-OF-7 +20 12364163 . A G 8 PASS SEQUENOM.AC=2;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12718574 rs112953117 G C 656 PASS BCM.AC=3;DB;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13241902 . A C 52 PASS BCM.AC=2;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13339930 rs6042043 A G 839 NOT_DESIGNED BCM.AC=143;DB;SRC=VQSR+2-OF-7 +20 13410135 rs77634879 T A 50 PASS BCM.AC=39;DB;SEQUENOM.AC=37;SRC=VQSR-ONLY GT 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13764237 . C T 51 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 14283363 rs111719158 G A 197 NOT_DESIGNED BCM.AC=6;DB;SRC=VQSR+INTERSECTION +20 14589314 rs2209596 G T 30806 INCORRECT_SEQUENOM_CALLS BCM.AC=253;DB;SEQUENOM.AC=315;SRC=VQSR+INTERSECTION GT . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 . 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 . 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 +20 14843271 . A G 78 NOT_DESIGNED BCM.AC=343;SRC=VQSR+2-OF-7 +20 15193914 . C T 48 PASS BCM.AC=2;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15581882 . C G 51 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15699667 . C T 59 PASS BCM.AC=2;SEQUENOM.AC=3;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15913614 . G T 9 PASS SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16397068 . C G 1.16 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16475471 rs73597775 C T 234 HIGH_NO_CALL_RATE DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16487648 rs12479901 G A 1025 PASS BCM.AC=14;DB;SEQUENOM.AC=15;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 +20 16936995 . C A 102 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17430784 . T C 18 PASS BCM.AC=7;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17828256 . C T 77 PASS BCM.AC=2;SEQUENOM.AC=4;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17938631 . T C 218 PASS BCM.AC=8;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17980474 . G A 34 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17991241 . C T 49 NOT_DESIGNED SRC=VQSR-ONLY +20 18180100 . A G 100 NOT_DESIGNED SRC=2-OF-7-ONLY +20 18198917 . C T 15 PASS SEQUENOM.AC=3;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18232143 rs77523268 C T 952 PASS BCM.AC=8;DB;SEQUENOM.AC=8;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18584068 . C A 81 DUPLICATE_MAPPING SRC=VQSR-ONLY +20 19212550 . C A 11 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19966683 rs199601 G A 56556 PASS BCM.AC=562;DB;SEQUENOM.AC=560;SRC=VQSR+INTERSECTION GT 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/1 1/1 1/1 0/1 0/0 0/1 0/1 1/1 0/0 1/1 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 . 1/1 . 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/0 1/1 0/0 1/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/0 0/1 0/1 1/1 1/1 0/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/0 0/1 1/1 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/0 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 0/0 0/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/0 0/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 1/1 +20 20157470 rs74569344 G T 159 NOT_DESIGNED DB;SRC=VQSR-ONLY +20 20850592 . G A 11.30 NOT_DESIGNED BCM.AC=1;SRC=2-OF-7-ONLY +20 20987147 . T C 58 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21056309 . T C 12.30 PASS SEQUENOM.AC=2;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21195714 . A C 12 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 21477015 . G A 140 NOT_DESIGNED BCM.AC=2;SRC=VQSR+2-OF-7 +20 21491513 . C T 11 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 21530607 rs4627653 G A 3116 PASS BCM.AC=21;DB;SEQUENOM.AC=21;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21569638 . G C 35 PASS BCM.AC=0;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21579389 . C T 169 NOT_DESIGNED SRC=VQSR-ONLY +20 21624143 . T C 63 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21734208 . A G 5.74 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21754065 . G A 16 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21764267 . G A 164 PASS BCM.AC=3;SEQUENOM.AC=4;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21863337 . T C 174 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 21910648 . C A 145 PASS BCM.AC=5;SEQUENOM.AC=4;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 22016989 . G A 7 NOT_DESIGNED SRC=VQSR-ONLY +20 22168952 . G T 107 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23102548 . G C 15 PASS BCM.AC=0;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 23470735 . A T 12 NOT_DESIGNED SRC=VQSR-ONLY +20 23665595 . C T 205 PASS BCM.AC=4;SEQUENOM.AC=3;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 . . 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 0/0 . . 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 . . . . . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . . . . . 0/0 . . 0/0 0/0 0/0 0/0 . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 . . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 . 0/0 . 0/0 . . . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . . . . 0/0 . . 0/0 0/0 . . . 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . +20 23758844 rs117686838 A T 1.18 NOT_DESIGNED DB;SRC=2-OF-7-ONLY +20 23785676 . G A 90 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24126594 . C T 16 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24247752 . C T 6107 NOT_DESIGNED BCM.AC=42;SRC=VQSR+2-OF-7 +20 24432806 . T C 21 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24450030 . G A 8 NOT_DESIGNED SRC=VQSR-ONLY +20 24792588 . C T 17 NOT_DESIGNED SRC=VQSR+2-OF-7 +20 24875997 rs6106960 T C 35367 PASS BCM.AC=238;DB;SEQUENOM.AC=233;SRC=VQSR+INTERSECTION GT 0/0 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/0 1/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 1/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 . 0/0 . 1/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/1 1/1 0/0 1/1 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/0 0/1 1/1 0/1 0/0 0/1 0/0 . 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/0 0/1 0/1 0/0 0/1 0/1 0/0 1/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 0/1 1/1 0/0 1/1 1/1 1/1 1/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 1/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 1/1 0/0 0/0 0/0 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/1 0/0 1/1 0/1 1/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 . 0/0 0/0 0/1 1/1 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 +20 25133654 . G A 13.40 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25388911 . G T 28 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25574143 . G A 77 PASS SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25659422 . A G 11 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 25700728 rs6037216 C G 1553 POSSIBLE_PROBE_FAILURE BCM.AC=7;DB;SEQUENOM.AC=0;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25741857 rs73347142 G T 41907 PASS DB;SEQUENOM.AC=0;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25750038 . T G 86 DUPLICATE_MAPPING BCM.AC=493;SRC=VQSR-ONLY +20 25751184 . G C 100 DUPLICATE_MAPPING BCM.AC=180;SRC=2-OF-7-ONLY +20 25766473 . T A 124 DUPLICATE_MAPPING SRC=VQSR+2-OF-7 +20 25789517 . A T 40 DUPLICATE_MAPPING BCM.AC=319;SRC=VQSR+2-OF-7 +20 25794555 . G A 18 DUPLICATE_MAPPING BCM.AC=181;SRC=VQSR-ONLY +20 25922316 . T C 26 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25999667 . C G 32 DUPLICATE_MAPPING;INCORRECT_SEQUENOM_CALLS BCM.AC=61;SEQUENOM.AC=1;SRC=VQSR-ONLY GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 . . 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26046637 . G A 26 DUPLICATE_MAPPING BCM.AC=354;SRC=VQSR-ONLY +20 26057903 . G A 100 NOT_DESIGNED SRC=2-OF-7-ONLY +20 26071009 . T C 9 DUPLICATE_MAPPING;AMBIGUOUS_SEQUENOM_CALLS BCM.AC=586;SEQUENOM.AC=59;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 +20 26126724 . G C 23737 PASS SEQUENOM.AC=0;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26217247 . C A 374 PASS BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26246019 rs79506355 C A 999 NOT_DESIGNED DB;SRC=2-OF-7-ONLY +20 26258231 rs79859288 C T 527 NOT_DESIGNED DB;SRC=VQSR+2-OF-7 +20 26265474 . G T 460.59 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26272553 . C G 100 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26275939 . A G 81 NOT_DESIGNED SRC=2-OF-7-ONLY +20 26293152 . T C 100 PASS BCM.AC=14;SEQUENOM.AC=17;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 +20 26301426 . A G 63 AMBIGUOUS_SEQUENOM_CALLS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26301793 . C G 8 PASS SEQUENOM.AC=1;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 26304696 rs6051307 G A 100 PASS DB;SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29494622 rs78775502 C T 935 PASS DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29514290 rs6087354 T A 19181 AMBIGUOUS_SEQUENOM_CALLS DB;SEQUENOM.AC=278;SRC=VQSR+2-OF-7 GT 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 . 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/0 0/1 0/1 . 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/1 0/1 0/0 +20 29518801 rs113500384 G A 702.91 PASS DB;SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29574811 rs73620522 G A 16281 HIGH_NO_CALL_RATE DB;SEQUENOM.AC=24;SRC=VQSR-ONLY GT 0/1 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 . 0/0 0/0 . . 1/1 . . 0/0 . 0/0 0/0 . 0/0 0/0 0/1 0/0 . . 0/0 1/1 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . . 0/0 . . . . 0/0 0/0 . . . . . . . . . . . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . . . . 0/0 . 0/0 . 0/1 . . . 0/1 . 0/0 . 0/0 . 0/0 0/0 0/1 0/0 . . 0/0 . 0/0 . . . 0/0 0/0 . . 0/0 . . . 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 . 0/1 0/0 0/0 . 0/0 . . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 . 0/0 0/0 . . . . . 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 . . 0/0 0/0 . 0/0 . . 0/0 . . . 1/1 . 0/0 0/0 . . . . 0/0 0/0 . 0/0 0/0 . 0/0 . . . 0/0 . 0/0 0/0 . 0/0 . . . 0/0 0/0 0/0 0/0 . 0/0 . 0/0 . . . . . . . 0/0 . . . . . . . . . . 0/0 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 0/0 0/0 . 0/0 . . . . . . . 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . . . . 0/0 0/0 0/0 . 0/0 1/1 . . . . . 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 . 0/1 0/0 0/0 . 0/0 0/0 0/0 . . . . 0/0 . . . . . . . . . . . 0/0 0/0 . . 0/0 0/0 . 0/0 . 1/1 . . . . . . . 1/1 . . . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . . . . 0/0 0/0 0/0 0/0 1/1 . . . 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 . 0/0 . . 0/0 0/0 0/0 1/1 +20 29598472 rs73612735 T G 10639 NOT_DESIGNED DB;SRC=VQSR-ONLY +20 29632410 . T C 5.11 NOT_DESIGNED SRC=2-OF-7-ONLY +20 29642272 rs77298479 T A 100 NOT_DESIGNED DB;SRC=2-OF-7-ONLY +20 29827087 rs62641496 G C 100 NOT_DESIGNED DB;SRC=2-OF-7-ONLY +20 30120025 . C G 1113 POSSIBLE_PROBE_FAILURE BCM.AC=9;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30595334 rs62206358 C A 62 PASS BCM.AC=3;DB;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30616314 . G A 176 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30696393 rs76882848 T C 150 PASS BCM.AC=3;DB;SEQUENOM.AC=3;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30884360 . C A 6 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30910907 . A T 24 NOT_DESIGNED SRC=VQSR-ONLY +20 31107862 . T C 46 PASS BCM.AC=6;SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31316775 . T G 47 PASS BCM.AC=2;SEQUENOM.AC=1;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31576854 . C T 66 PASS BCM.AC=8;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32840139 . G A 1158 PASS BCM.AC=11;SEQUENOM.AC=0;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 33588848 . C T 17 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 33974818 . G A 959 NOT_DESIGNED BCM.AC=12;SRC=VQSR+INTERSECTION +20 34147834 rs368386 G A 105 NOT_DESIGNED BCM.AC=3;DB;SRC=VQSR+2-OF-7 +20 34155930 . T C 1200 NOT_DESIGNED BCM.AC=23;SRC=VQSR+2-OF-7 +20 34589611 . C T 39 PASS SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34595073 . T G 518 POSSIBLE_PROBE_FAILURE BCM.AC=4;SEQUENOM.AC=0;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35255604 . C T 367 POSSIBLE_PROBE_FAILURE BCM.AC=5;SEQUENOM.AC=0;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35644471 rs8115057 C T 10677 PASS BCM.AC=174;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36480073 . T C 428 PASS BCM.AC=6;SEQUENOM.AC=6;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36563396 . G A 2.68 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 36645837 rs79088417 T C 342 NOT_DESIGNED DB;SRC=VQSR+2-OF-7 +20 36667909 . C T 659 NOT_DESIGNED BCM.AC=6;SRC=VQSR+INTERSECTION +20 36932648 rs5743498 C T 107 PASS BCM.AC=3;DB;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37398143 . T A 31 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37790289 . G A 26 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37817201 . A G 222 PASS BCM.AC=2;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37873327 . A T 445 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37980382 . A G 78 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38302429 rs73906408 C T 5149 PASS BCM.AC=24;DB;SEQUENOM.AC=24;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 38369195 . C T 43 DUPLICATE_MAPPING BCM.AC=56;SRC=VQSR+2-OF-7 +20 38901146 . C T 2046 NOT_DESIGNED BCM.AC=60;SRC=VQSR+2-OF-7 +20 39110108 . C T 4.13 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39624865 . G A 584 NOT_DESIGNED BCM.AC=9;SRC=VQSR+2-OF-7 +20 40505598 . A G 16 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40927704 . T C 12 PASS BCM.AC=0;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41093733 . T C 5 NOT_DESIGNED SRC=VQSR-ONLY +20 41137712 rs230167 C T 24 NOT_DESIGNED DB;SRC=VQSR+2-OF-7 +20 41311175 . C T 75 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41642529 . T G 72 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41756929 . C T 32 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41818162 rs117637352 G A 391 PASS BCM.AC=30;DB;SEQUENOM.AC=29;SRC=VQSR+2-OF-7 GT 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42153349 . C T 25 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42171267 . A G 88.70 PASS SEQUENOM.AC=13;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 0/1 0/0 0/0 0/1 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42330199 . G A 590 PASS BCM.AC=5;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42474396 . G A 100 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42483892 . T C 112 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 42500754 rs6513891 C A 619 PASS DB;SEQUENOM.AC=0;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42575810 . T C 3.60 PASS SEQUENOM.AC=2;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42762553 rs5014517 C T 759.47 NOT_DESIGNED BCM.AC=366;DB;SRC=2-OF-7-ONLY +20 42908494 . T C 42 PASS BCM.AC=3;SEQUENOM.AC=3;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42927494 . C G 17 PASS BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43033625 . G A 100 NOT_DESIGNED SRC=2-OF-7-ONLY +20 43066015 rs6093982 C T 290 PASS BCM.AC=2;DB;SEQUENOM.AC=5;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43506182 . T C 28 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43582424 rs79775916 C T 9 PASS BCM.AC=1;DB;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43744100 . G C 4.80 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43899736 . G A 35 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44373763 . C T 730 PASS BCM.AC=6;SEQUENOM.AC=6;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45097507 rs454429 C T 25449 PASS BCM.AC=302;DB;SEQUENOM.AC=300;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/1 0/1 0/0 0/0 . 0/0 0/0 0/0 0/1 . 0/0 0/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/1 1/1 0/1 0/0 1/1 0/1 0/1 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/0 0/0 0/1 0/0 . 0/1 1/1 0/1 0/0 0/0 0/1 0/0 0/1 1/1 0/0 0/1 0/1 . 0/1 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 1/1 1/1 0/1 0/0 0/0 1/1 0/0 0/1 1/1 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/1 0/1 0/0 0/0 1/1 0/0 0/1 0/0 0/1 1/1 0/0 0/0 0/1 0/1 0/1 0/0 0/0 0/0 0/0 0/0 1/1 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/0 1/1 1/1 1/1 0/0 0/1 0/0 1/1 1/1 0/0 1/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 . 1/1 1/1 1/1 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/1 0/1 0/1 0/0 1/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 0/1 0/1 0/0 1/1 0/0 0/1 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 1/1 0/0 0/0 0/0 0/1 0/1 1/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 1/1 0/1 0/1 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 1/1 0/1 1/1 0/1 0/0 0/0 0/0 0/1 0/0 1/1 1/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/0 0/0 0/1 . 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/1 0/0 0/0 0/1 1/1 1/1 0/0 0/1 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/1 0/0 0/1 0/1 0/1 1/1 0/0 0/1 0/0 0/1 0/1 0/1 0/0 0/0 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/0 1/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 0/0 0/0 0/0 0/0 +20 45919615 . T C 46 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46997402 rs34772061 C G 19 NOT_DESIGNED DB;SRC=VQSR+2-OF-7 +20 47502684 . G A 66 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 48045398 . A G 20 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 48124745 . C T 10.30 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 48422538 rs73269151 A G 13012 NOT_DESIGNED BCM.AC=282;DB;SRC=VQSR+INTERSECTION +20 48669886 rs73276465 G C 106 NOT_DESIGNED BCM.AC=8;DB;SRC=VQSR+2-OF-7 +20 48691248 . A G 95 PASS BCM.AC=2;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 48917711 rs116072324 T C 129 NOT_DESIGNED BCM.AC=1;DB;SRC=VQSR+2-OF-7 +20 49098380 . A T 115 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49206794 rs116083969 G A 19 PASS BCM.AC=1;DB;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49360238 . G A 50 PASS BCM.AC=3;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49712636 rs113933231 T A 93 PASS BCM.AC=3;DB;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50309600 . C A 46 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50599968 rs6096700 T C 10667 NOT_DESIGNED BCM.AC=426;DB;SRC=VQSR+2-OF-7 +20 50601297 . A T 7 PASS BCM.AC=0;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50603254 rs6021599 A G 13052 NOT_DESIGNED BCM.AC=520;DB;SRC=VQSR+2-OF-7 +20 50810123 rs28420712 A T 2671 NOT_DESIGNED BCM.AC=228;DB;SRC=VQSR+2-OF-7 +20 50892806 . A G 37 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 51511870 . C T 116 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51818730 . C T 130 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 51958269 . G C 48 PASS BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 52285202 rs113200595 T G 11071 NOT_DESIGNED BCM.AC=198;DB;SRC=VQSR+2-OF-7 +20 52308503 . T C 651 PASS BCM.AC=5;SEQUENOM.AC=5;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 52470222 rs28606974 A G 72 NOT_DESIGNED BCM.AC=22;DB;SRC=VQSR-ONLY +20 52485230 . G T 74 NOT_DESIGNED BCM.AC=21;SRC=VQSR-ONLY +20 53017837 rs112388078 T C 1190 PASS BCM.AC=8;DB;SEQUENOM.AC=8;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53031638 . T G 4 PASS SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53272023 rs4362623 G A 70728 PASS BCM.AC=692;DB;SEQUENOM.AC=690;SRC=VQSR+INTERSECTION GT 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 0/0 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 0/1 1/1 . 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/0 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 +20 53423667 . T A 214 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53580904 . T C 32 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53599478 . C T 34 NOT_DESIGNED BCM.AC=1;SRC=VQSR+2-OF-7 +20 54004274 rs114966870 A G 602 PASS BCM.AC=40;DB;SEQUENOM.AC=9;SRC=VQSR-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54096380 . G A 46 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54146938 . G A 27 POLYMORPHIC_SAMPLES_FAILED BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54163701 . A G 130 PASS BCM.AC=3;SEQUENOM.AC=3;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . . +20 54199759 . T C 198 NOT_DESIGNED BCM.AC=9;SRC=VQSR+2-OF-7 +20 54313664 rs112885916 A T 98 PASS BCM.AC=10;DB;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54424603 . T C 116 PASS BCM.AC=8;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54542220 . C T 33 NOT_DESIGNED SRC=VQSR-ONLY +20 54628591 . G A 87 POLYMORPHIC_SAMPLES_FAILED BCM.AC=2;SEQUENOM.AC=4;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54793377 . C T 8 HIGH_NO_CALL_RATE BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR-ONLY GT . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 0/0 . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +20 55067830 . G A 6 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55113534 . T G 21 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55195413 . A G 20 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55483325 . C T 17 NOT_DESIGNED BCM.AC=1;SRC=VQSR-ONLY +20 55598554 . T C 22.30 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55790632 . G T 39 HIGH_NO_CALL_RATE BCM.AC=2;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 . . 0/0 . . . . 0/0 0/0 . . 0/0 . . 0/0 . . . . . . . 0/0 0/0 0/0 . . . 0/0 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . 0/0 0/0 0/0 . . . . . . . . . 0/0 0/0 0/0 0/0 . . . . . . . . 0/0 0/0 0/0 0/0 . 0/0 . . . . . . 0/0 0/0 0/0 . 0/0 0/0 . . 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . . 0/0 . . 0/0 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 0/0 0/0 . . . . . 0/0 . 0/0 . 0/0 0/0 0/0 . . . . . . . 0/0 0/0 0/0 0/0 0/0 . . . . . . . 0/0 . . . 0/0 . . . . . . . . . . 0/0 0/0 . . . . 0/0 . . . . . . 0/0 0/0 . . . . . . 0/0 0/0 0/0 0/0 0/0 . . . . . 0/0 0/0 . . 0/0 0/0 0/0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . . . . . . . . . . . . . . . 0/0 . . . . . . . . . +20 55870101 . C T 129 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56029723 rs74833660 G A 21 PASS BCM.AC=1;DB;SEQUENOM.AC=3;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56309506 . C G 6.38 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56335703 . G C 33 PASS BCM.AC=2;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56549982 rs6099866 T C 999 PASS DB;SEQUENOM.AC=9;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 56792927 . C T 207 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57266953 . C A 46 PASS BCM.AC=1;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57566637 rs149265 C T 58555 PASS BCM.AC=513;DB;SEQUENOM.AC=505;SRC=VQSR+INTERSECTION GT 1/1 1/1 0/1 0/1 0/1 1/1 . 1/1 1/1 1/1 1/1 . 0/1 0/0 0/1 0/1 0/0 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 0/0 0/1 . 1/1 . 1/1 0/1 0/1 0/0 0/1 1/1 1/1 0/1 0/1 0/1 . 1/1 1/1 1/1 0/1 0/1 0/1 0/1 1/1 0/0 0/1 0/1 0/1 0/1 0/1 0/0 1/1 0/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 0/0 0/0 0/0 1/1 1/1 0/0 0/0 1/1 0/1 1/1 0/0 0/1 0/1 1/1 0/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 1/1 1/1 0/0 1/1 1/1 1/1 0/0 0/1 1/1 0/1 0/0 0/1 1/1 1/1 0/1 0/0 1/1 0/1 1/1 0/1 0/1 0/1 0/1 1/1 0/1 0/0 1/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/0 0/0 0/0 0/1 . 0/1 0/0 0/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/0 1/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/1 0/0 0/0 1/1 1/1 1/1 0/1 1/1 0/1 0/0 1/1 1/1 0/0 0/1 0/1 0/0 1/1 0/1 0/1 1/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1 . 1/1 1/1 0/1 1/1 1/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 0/1 0/1 0/0 0/1 0/0 1/1 0/0 1/1 0/0 1/1 1/1 0/1 0/1 0/0 0/1 0/1 0/1 0/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 0/0 0/1 0/0 0/1 1/1 0/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 1/1 0/1 0/1 0/1 1/1 1/1 1/1 0/1 1/1 1/1 0/1 0/1 0/0 0/0 1/1 0/1 0/1 0/1 1/1 1/1 0/1 0/1 0/1 1/1 0/1 1/1 0/1 0/1 0/1 1/1 0/1 0/1 1/1 0/1 0/1 0/1 0/1 +20 57653509 rs6026678 C T 489 PASS BCM.AC=4;DB;SEQUENOM.AC=4;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 57728647 . C T 13 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 58308048 . A G 35 PASS BCM.AC=2;SEQUENOM.AC=4;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 1/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 58335635 . C T 7 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59211281 . A G 4.33 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59286435 . T C 5.69 PASS SEQUENOM.AC=1;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60262734 rs73915327 C A 576 PASS BCM.AC=10;DB;SEQUENOM.AC=10;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/1 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60291372 . A G 100 NOT_DESIGNED BCM.AC=21;SRC=2-OF-7-ONLY +20 60520698 . T C 428 NOT_DESIGNED SRC=VQSR-ONLY +20 60547414 . G T 10 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60560062 . C T 25 NOT_DESIGNED BCM.AC=343;SRC=VQSR-ONLY +20 60578895 . G T 34 PASS BCM.AC=2;SEQUENOM.AC=2;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60641243 . G A 16 NOT_DESIGNED BCM.AC=150;SRC=VQSR+2-OF-7 +20 60641369 . G A 16 PASS BCM.AC=159;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 60730826 . G A 11 AMBIGUOUS_SEQUENOM_CALLS BCM.AC=0;SEQUENOM.AC=0;SRC=VQSR-ONLY GT . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61206227 . C T 4.25 NOT_DESIGNED SRC=2-OF-7-ONLY +20 61286252 rs13433258 C T 123 PASS BCM.AC=3;DB;SEQUENOM.AC=2;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61497927 . A C 47 PASS BCM.AC=3;SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61766484 . G T 58 NOT_DESIGNED BCM.AC=157;SRC=VQSR+2-OF-7 +20 61788338 . C G 7 NOT_DESIGNED SRC=VQSR-ONLY +20 61830486 . G A 48 PASS BCM.AC=1;SEQUENOM.AC=1;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62191452 rs113748232 C T 143 PASS BCM.AC=7;DB;SEQUENOM.AC=7;SRC=VQSR+INTERSECTION GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/1 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62462285 . G A 66 NOT_DESIGNED BCM.AC=304;SRC=VQSR+2-OF-7 +20 62480353 . T A 100 PASS SEQUENOM.AC=0;SRC=2-OF-7-ONLY GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62724959 . G T 10 NOT_DESIGNED SRC=VQSR-ONLY +20 62888718 . T C 57 POLYMORPHIC_SAMPLES_FAILED BCM.AC=1;SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 62918298 . G A 33 NOT_DESIGNED SRC=VQSR+2-OF-7 +20 62961477 . T C 17 AMBIGUOUS_SEQUENOM_CALLS SEQUENOM.AC=0;SRC=VQSR+2-OF-7 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 diff --git a/tests/tabix_data/vcf/8.vcf b/tests/tabix_data/vcf/8.vcf new file mode 100644 index 0000000..4ec2daf --- /dev/null +++ b/tests/tabix_data/vcf/8.vcf @@ -0,0 +1,84 @@ +##fileformat=VCFv4.0 +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##ValidationMetrics_HardyWeinbergViolations="25 (8%)" +##ValidationMetrics_HomVarViolations="0 (0%)" +##ValidationMetrics_NoCallViolations="13 (4%)" +##ValidationMetrics_PolymorphicPassingRecords="195 (75%)" +##ValidationMetrics_RecordsPassingFilters="258 (87%)" +##ValidationMetrics_RecordsProcessed=296 +##ValidationMetrics_SamplesAssayed=383 +##VariantValidationAssessor="analysis_type=VariantValidationAssessor input_file=[] sample_metadata=[] read_buffer_size=null phone_home=STANDARD read_filter=[] intervals=null excludeIntervals=null reference_sequence=/humgen/1kg/reference/human_g1k_v37.fasta rodBind=[rawData/plink.renamed.sorted.fixed.vcf] rodToIntervalTrackName=null BTI_merge_rule=UNION nonDeterministicRandomSeed=false DBSNP=null downsampling_type=null downsample_to_fraction=null downsample_to_coverage=null baq=OFF baqGapOpenPenalty=40.0 performanceLog=null useOriginalQualities=false defaultBaseQualities=-1 validation_strictness=SILENT unsafe=null num_threads=1 interval_merging=ALL read_group_black_list=null processingTracker=null restartProcessingTracker=false processingTrackerStatusFile=null processingTrackerID=-1 allow_intervals_with_unindexed_bam=false disable_experimental_low_memory_sharding=false logging_level=INFO log_to_file=null help=false out=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub NO_HEADER=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub sites_only=org.broadinstitute.sting.gatk.io.stubs.VCFWriterStub maxHardy=20.0 maxNoCall=0.05 maxHomVar=1.1" +##source=PLINK +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT HG00127 HG00128 HG00136 HG00137 HG00138 HG00139 HG00152 HG00156 HG00234 HG00235 HG00237 HG00242 HG00244 HG00262 HG01055 HG01079 NA19138 NA18974 NA18523 NA12717 NA19209 NA18577 NA18973 NA18943 NA12873 NA18623 NA18622 NA18948 NA19171 NA19204 NA06994 NA18563 NA18547 NA18861 NA18608 NA18995 NA10851 NA18976 NA18603 NA19200 HG01204 HG01191 HG01101 HG00146 HG00306 NA18985 HG00160 HG00635 HG00372 HG00357 HG00634 NA18541 NA18950 NA19759 HG00351 HG00257 HG00118 HG00336 HG00448 HG01354 NA18609 HG00428 HG00326 NA11894 NA18956 HG00173 HG00117 NA11893 HG01251 HG01441 HG01437 HG00182 HG00330 HG01060 HG00329 NA18960 NA18856 NA07346 NA18871 NA19057 NA18868 NA18636 NA12830 NA19007 NA18910 NA18874 NA19056 NA19064 NA19066 NA18487 NA18642 NA19236 NA07056 NA18637 NA19235 NA19309 NA19311 NA19334 NA19346 NA19347 NA19372 NA19376 NA19383 NA19384 NA19394 NA19428 NA19430 NA19451 NA19466 NA19313 NA19321 NA19324 NA19332 NA19390 NA19436 NA19439 NA19440 NA19463 NA19470 NA19471 NA19472 NA19676 NA19660 NA19661 NA19663 NA19722 NA19725 NA19728 NA19729 NA19731 NA19749 NA19755 NA19756 NA19758 NA19770 NA19773 NA19777 NA19780 NA19783 NA20525 NA20589 NA20765 NA20802 NA20804 NA18544 NA18602 NA18546 NA18610 NA18957 NA18615 NA18616 NA19010 NA18638 NA18639 NA18627 NA19072 NA18630 NA19074 NA19080 NA19081 NA19083 NA19085 NA19088 NA20287 NA19835 NA20276 NA19818 NA20278 NA20282 NA20342 NA20296 NA20314 NA20346 NA19712 NA19198 NA19108 NA18934 NA18916 NA18907 NA18917 NA06989 NA12058 NA12341 NA12546 NA12489 HG01197 NA18983 NA11843 NA11892 NA12749 NA12282 NA12751 NA18959 NA19331 NA19453 NA20537 NA12046 NA20515 NA20516 NA20521 NA20524 NA20528 NA20759 NA20768 NA20769 NA20774 NA20775 NA20783 NA20787 NA20790 NA20800 NA20819 NA20812 NA20505 NA20530 NA20540 NA20538 NA20581 NA20815 NA20544 NA20810 NA20807 NA20816 NA20504 NA20753 NA20502 NA12342 NA19150 NA19468 NA20336 NA19395 NA19257 NA19360 NA19700 NA18867 NA20317 NA18968 NA19107 HG00111 HG00108 NA19077 NA19684 NA18511 NA12044 NA19382 NA19457 NA18933 NA18923 NA18965 HG00141 NA20341 NA18740 HG00537 HG00346 HG01173 HG00702 HG00313 HG00150 NA18612 HG00339 NA12273 HG00250 NA18593 NA18621 HG00478 HG00251 HG01070 NA19160 HG00479 HG00608 NA18573 HG00375 NA19248 NA19093 HG01170 HG00534 HG01171 HG01522 NA18624 HG00683 HG01521 NA19005 NA20412 NA18971 HG00446 NA12748 HG00530 HG00690 HG01356 HG01516 NA20532 HG00344 HG00328 NA18542 HG00254 HG00321 HG00577 HG00656 HG00342 HG00524 HG00650 HG00557 HG00319 HG00457 HG00125 HG00578 HG00543 HG00638 HG00171 HG00699 HG00595 HG00187 HG00704 HG00533 HG00596 HG00268 HG01083 HG00651 HG01133 HG00671 HG00327 HG01148 HG00246 HG00672 HG00556 HG00436 HG00554 NA18633 NA20344 NA11993 NA07037 NA11930 HG01366 HG01389 HG00620 NA19740 HG00190 HG00419 NA18535 HG01495 NA18592 HG01497 HG00174 HG01140 NA12287 HG00689 HG01550 HG00334 HG01375 HG00637 NA18507 HG01113 NA18550 NA19129 HG01551 HG01462 HG00331 NA12413 HG01456 HG01360 HG00708 HG01350 HG00684 NA19099 HG00284 NA12399 NA12286 NA12777 HG00277 HG00266 NA19985 HG00353 HG01102 NA07347 NA07051 NA19900 NA18984 NA07048 HG00640 HG01066 NA12812 HG01174 HG01188 +20 676148 . A AC . PASS AC=0;AN=758;HW=0.00;HetPct=0.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1342549 . A AAGAT . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1366475 . CT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 1550416 . C CT . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 3700705 . CTTTGGG C . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 5724449 . T TC . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 7942727 . A AC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 9231138 . AT A . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 10090376 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12094344 . TCAGGAGGC T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12634463 . TGA T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12837095 . G GA . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 12928028 . TG T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13365589 . T TG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 13926445 . TA T . PASS AC=0;AN=756;HW=0.00;HetPct=0.0;HomRefPct=98.7;HomVarPct=0.0;NoCallPct=1.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14287634 . AGT A . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 14983337 . AGCC A . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15037520 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 15141272 . T TC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16192114 . AT A . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 16259934 . C CAA . PASS AC=0;AN=758;HW=0.00;HetPct=0.0;HomRefPct=99.0;HomVarPct=0.0;NoCallPct=1.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17250858 . T TC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 17753474 . C CA . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 18520672 . A ATT . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19188693 . T TC . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 19437778 . GGCCTGGGATGTAAA G . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20434198 . TA T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 20990240 . TC T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 24710482 . GT G . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 25905250 . GT G . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29589873 . CCTT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29628180 . C CCACAAGAAG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 29804699 . A AC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 30567910 . T TG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 31760870 . CG C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32456076 . GT G . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 32968409 . GTC G . PASS AC=0;AN=754;HW=0.00;HetPct=0.0;HomRefPct=98.4;HomVarPct=0.0;NoCallPct=1.6 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 34313574 . A AT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 35329008 . ATC A . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 37954797 . A AGT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39607037 . C CA . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 39868369 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40006262 . TGAG T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40110981 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 40742257 . TG T . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 41964672 . A AT . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42145613 . TG T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 42930748 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43606638 . T TC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 43826992 . GC G . PASS AC=0;AN=748;HW=0.00;HetPct=0.0;HomRefPct=97.7;HomVarPct=0.0;NoCallPct=2.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 44470843 . GAGTGTCGT G . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 45300827 . CT C . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 46353646 . A AG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 47428163 . C CA . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49451656 . T TG . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49561273 . A AG . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 49765611 . A AC . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 50772065 . T TC . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 53538294 . T TG . PASS AC=0;AN=764;HW=0.00;HetPct=0.0;HomRefPct=99.7;HomVarPct=0.0;NoCallPct=0.3 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 54262948 . A AC . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 55658161 . GT G . PASS AC=0;AN=760;HW=0.00;HetPct=0.0;HomRefPct=99.2;HomVarPct=0.0;NoCallPct=0.8 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 59186675 . TATTA T . PASS AC=0;AN=762;HW=0.00;HetPct=0.0;HomRefPct=99.5;HomVarPct=0.0;NoCallPct=0.5 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 . 0/0 . 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 +20 61531765 . AG A . PASS AC=0;AN=766;HW=0.00;HetPct=0.0;HomRefPct=100.0;HomVarPct=0.0;NoCallPct=0.0 GT 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 0/0 diff --git a/tests/tabix_data/vcf/9.vcf b/tests/tabix_data/vcf/9.vcf new file mode 100644 index 0000000..e0d112c --- /dev/null +++ b/tests/tabix_data/vcf/9.vcf @@ -0,0 +1,1000 @@ +##fileformat=VCFv4.0 +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT DNA_pool_A +chr1 1281168 . A G 14 . DP=37;AF1=0.6243;CI95=0.5,1;DP4=4,0,6,0;MQ=15;PV4=1,0.027,1,1 PL:GT:GQ 43,0,4:0/1:6 +chr1 1281205 . T C 26 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 58,9,0:1/1:63 +chr1 1281206 . G C 25 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 57,9,0:1/1:63 +chr1 1922737 . G C 13.2 . DP=21;AF1=1;CI95=1,1;DP4=0,0,0,21;MQ=22 PL:GT:GQ 46,63,0:1/1:99 +chr1 21197513 . A G 55.1 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=41 PL:GT:GQ 88,21,0:1/1:84 +chr1 21343209 . T C 5.45 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=14 PL:GT:GQ 37,51,0:1/1:99 +chr1 22097362 . T C 4.75 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 35,9,0:1/1:63 +chr1 22254012 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 22650927 . G A 48.1 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=24 PL:GT:GQ 81,21,0:1/1:84 +chr1 23535401 . C T 40.4 . DP=25;AF1=1;CI95=0.5,1;DP4=0,16,0,5;MQ=19;PV4=1,0.2,1,1 PL:GT:GQ 73,13,0:1/1:65 +chr1 23543855 . T C 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=44 PL:GT:GQ 82,18,0:1/1:90 +chr1 24245107 . C G 32 . DP=4;AF1=0.5001;CI95=0.5,0.5;DP4=0,2,0,2;MQ=36;PV4=1,1,1,1 PL:GT:GQ 62,0,35:0/1:38 +chr1 24274412 . G C 39.5 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=32 PL:GT:GQ 72,12,0:1/1:72 +chr1 36529832 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr1 37788090 . A G 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr1 43120440 . C T 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=49;PV4=1,1,1,1 PL:GT:GQ 64,0,31:0/1:34 +chr1 43980466 . C T 43 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=19 PL:GT:GQ 76,45,0:1/1:99 +chr1 46047795 . T C 29.1 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=31 PL:GT:GQ 62,18,0:1/1:90 +chr1 48860309 . C T 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=46 PL:GT:GQ 141,18,0:1/1:90 +chr1 49415599 . T C 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 34,6,0:1/1:49 +chr1 51601816 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 51955459 . G C 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr1 68479569 . T G 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 43,6,0:1/1:49 +chr1 69032455 . A G 15.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 47,9,0:1/1:63 +chr1 71888225 . G T 9.31 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr1 72381528 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr1 82004013 . A G 37.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 70,12,0:1/1:72 +chr1 86289622 . C T 18 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 50,9,0:1/1:63 +chr1 90267663 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=45 PL:GT:GQ 54,9,0:1/1:63 +chr1 92699542 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr1 94867317 . G A 26.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 58,6,0:1/1:49 +chr1 96428713 . C G 3.98 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=27 PL:GT:GQ 33,6,0:1/1:49 +chr1 100466329 . G C 4.85 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=22 PL:GT:GQ 36,18,0:1/1:90 +chr1 101909281 . G A 70 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=4,0,5,0;MQ=46;PV4=1,1,0.096,1 PL:GT:GQ 100,0,88:0/1:91 +chr1 106216572 . T A 22 . DP=18;AF1=1;CI95=1,1;DP4=0,0,16,0;MQ=21 PL:GT:GQ 55,48,0:1/1:99 +chr1 107901770 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 40,6,0:1/1:49 +chr1 108431179 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=41 PL:GT:GQ 155,24,0:1/1:96 +chr1 112005344 . C T 99 . DP=52;AF1=1;CI95=1,1;DP4=7,0,27,0;MQ=44;PV4=1,1,1,1 PL:GT:GQ 196,25,0:1/1:99 +chr1 116625452 . C T 36 . DP=44;AF1=0.5;CI95=0.5,0.5;DP4=0,23,0,20;MQ=49;PV4=1,2.3e-69,0.42,1 PL:GT:GQ 66,0,179:0/1:69 +chr1 118060710 . G T 6.98 . DP=8;AF1=0.4999;CI95=0.5,0.5;DP4=4,0,3,0;MQ=47;PV4=1,0.0071,1,1 PL:GT:GQ 36,0,73:0/1:39 +chr1 118198177 . A G 15.9 . DP=23;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 47,6,0:1/1:49 +chr1 118586346 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr1 120809555 . G A 20 . DP=8;AF1=0.5;CI95=0.5,0.5;DP4=6,0,2,0;MQ=46;PV4=1,1,1,1 PL:GT:GQ 50,0,106:0/1:53 +chr1 130723110 . C A 20.7 . DP=8;AF1=0.5939;CI95=0.5,1;DP4=0,6,0,2;MQ=26;PV4=1,1,1,1 PL:GT:GQ 50,0,5:0/1:7 +chr1 133979895 . T C 14.9 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 46,6,0:1/1:49 +chr1 134977940 . C T 30 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=38;PV4=1,1,0.26,1 PL:GT:GQ 60,0,31:0/1:34 +chr1 141768589 . G A 18.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=4,0,4,0;MQ=51;PV4=1,2.7e-05,1,1 PL:GT:GQ 48,0,100:0/1:51 +chr1 141768590 . G A 22 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=2,0,4,0;MQ=50;PV4=1,0.0033,1,1 PL:GT:GQ 52,0,40:0/1:43 +chr1 146506051 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=43 PL:GT:GQ 76,9,0:1/1:63 +chr1 150997009 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr1 162915612 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 168455400 . A G 4.12 . DP=28;AF1=1;CI95=1,1;DP4=0,0,0,27;MQ=10 PL:GT:GQ 35,81,0:1/1:99 +chr1 172784744 . T C 17.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 49,6,0:1/1:49 +chr1 183627307 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 185789457 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr1 187081827 . T C 4.77 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=17 PL:GT:GQ 36,30,0:1/1:99 +chr1 188468339 . C T 33 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=24 PL:GT:GQ 66,39,0:1/1:99 +chr1 188595435 . C T 41.8 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr1 188670561 . G C 3.55 . DP=22;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=18 PL:GT:GQ 34,27,0:1/1:99 +chr1 188924877 . G A 6.2 . DP=10;AF1=0.9999;CI95=0.5,1;DP4=2,0,3,0;MQ=21;PV4=1,1,1,0.3 PL:GT:GQ 35,3,0:1/1:41 +chr1 190536295 . G A 68 . DP=38;AF1=1;CI95=1,1;DP4=0,0,36,0;MQ=18 PL:GT:GQ 101,108,0:1/1:99 +chr1 191129408 . T A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr1 195937816 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr1 198857619 . T C 89 . DP=61;AF1=0.5;CI95=0.5,0.5;DP4=0,38,0,17;MQ=30;PV4=1,0.032,1,1 PL:GT:GQ 119,0,139:0/1:99 +chr1 199057483 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 44,6,0:1/1:49 +chr1 200133619 . G C 5.83 . DP=49;AF1=1;CI95=0.5,1;DP4=2,0,8,0;MQ=17;PV4=1,0.059,1,0.2 PL:GT:GQ 37,12,0:1/1:72 +chr1 200729661 . A T 36 . DP=15;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=27 PL:GT:GQ 69,42,0:1/1:99 +chr1 201374519 . T C 69.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=39 PL:GT:GQ 102,12,0:1/1:72 +chr1 202811668 . G A 20.2 . DP=4;AF1=0.5163;CI95=0.5,1;DP4=0,1,0,3;MQ=24;PV4=1,1,1,1 PL:GT:GQ 50,0,12:0/1:15 +chr1 202960650 . C T 16.6 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=27 PL:GT:GQ 49,12,0:1/1:72 +chr1 205686638 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr1 205949857 . A G 3.14 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=21 PL:GT:GQ 33,15,0:1/1:75 +chr1 209806643 . A G 13.2 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=21 PL:GT:GQ 46,24,0:1/1:96 +chr1 209871501 . C T 25 . DP=12;AF1=0.5;CI95=0.5,0.5;DP4=5,0,4,0;MQ=41;PV4=1,7.7e-06,1,1 PL:GT:GQ 55,0,84:0/1:58 +chr1 211051323 . G A 99 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=49 PL:GT:GQ 176,24,0:1/1:96 +chr1 211389716 . C T 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 43,6,0:1/1:49 +chr1 211868415 . G A 3.54 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=14 PL:GT:GQ 34,33,0:1/1:99 +chr1 211914531 . C T 84.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,1,0,4;MQ=46;PV4=1,1,1,1 PL:GT:GQ 116,7,0:1/1:57 +chr1 214691313 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr1 215184650 . C T 40.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 72,6,0:1/1:49 +chr1 215995258 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr1 217031394 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr1 217986960 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 76,9,0:1/1:63 +chr1 218086681 . A G 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=34 PL:GT:GQ 142,27,0:1/1:99 +chr1 218546019 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr1 218632417 . G T 17.1 . DP=19;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=26 PL:GT:GQ 50,21,0:1/1:84 +chr1 218833355 . C G 23 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=5,0,2,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 53,0,63:0/1:56 +chr1 219303186 . T C 7.79 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,25;MQ=12 PL:GT:GQ 40,75,0:1/1:99 +chr1 219517634 . G A 26.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=42 PL:GT:GQ 59,12,0:1/1:72 +chr1 219590158 . T C 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 33,12,0:1/1:72 +chr1 219709853 . A T 99 . DP=124;AF1=0.5;CI95=0.5,0.5;DP4=80,0,41,0;MQ=44;PV4=1,0.26,1,1 PL:GT:GQ 143,0,156:0/1:99 +chr1 222457988 . A G 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=23 PL:GT:GQ 42,6,0:1/1:49 +chr1 222477914 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr1 223010233 . A G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr1 223796360 . G A 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=21 PL:GT:GQ 37,6,0:1/1:49 +chr1 224273784 . A T 14.2 . DP=18;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=15 PL:GT:GQ 47,30,0:1/1:99 +chr1 224454685 . C T 46.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=32 PL:GT:GQ 79,15,0:1/1:75 +chr1 224514706 . G C 21 . DP=38;AF1=1;CI95=1,1;DP4=0,0,38,0;MQ=19 PL:GT:GQ 54,114,0:1/1:99 +chr1 224515793 . C T 99 . DP=26;AF1=1;CI95=1,1;DP4=0,0,26,0;MQ=45 PL:GT:GQ 211,78,0:1/1:99 +chr1 224692969 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 40,6,0:1/1:49 +chr1 225607249 . A G 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=45;PV4=1,1,0,1 PL:GT:GQ 64,0,31:0/1:34 +chr1 226923918 . C A 29.1 . DP=52;AF1=1;CI95=0.5,1;DP4=0,2,0,10;MQ=27;PV4=1,1,1,1 PL:GT:GQ 62,18,0:1/1:90 +chr1 227125189 . T C 56.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=41 PL:GT:GQ 89,12,0:1/1:72 +chr1 227133712 . A T 20.1 . DP=26;AF1=0.5;CI95=0.5,0.5;DP4=11,0,10,0;MQ=23;PV4=1,1,0.48,1 PL:GT:GQ 50,0,39:0/1:42 +chr1 227943954 . G C 47 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=37 PL:GT:GQ 79,9,0:1/1:63 +chr1 227943974 . G A 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=34 PL:GT:GQ 66,12,0:1/1:72 +chr1 228067480 . A G 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=45 PL:GT:GQ 75,15,0:1/1:75 +chr1 228067510 . A G 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=45 PL:GT:GQ 140,15,0:1/1:75 +chr1 228088778 . C T 6.79 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=23 PL:GT:GQ 37,6,0:1/1:49 +chr1 228117888 . A C 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 45,6,0:1/1:49 +chr1 228139641 . T C 44.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 77,12,0:1/1:72 +chr1 228577146 . T C 26 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,14;MQ=22;PV4=1,1,1,0.027 PL:GT:GQ 56,0,77:0/1:59 +chr1 229001369 . C A 45 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 77,9,0:1/1:63 +chr1 229001386 . C T 8.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 39,6,0:1/1:49 +chr1 229348080 . T C 18.1 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=40;PV4=1,0.33,0.17,0.33 PL:GT:GQ 48,0,31:0/1:34 +chr1 229439710 . C T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=32 PL:GT:GQ 66,12,0:1/1:72 +chr1 229655149 . T C 30 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=30 PL:GT:GQ 63,24,0:1/1:96 +chr1 229660873 . C G 81 . DP=28;AF1=0.5;CI95=0.5,0.5;DP4=0,20,0,7;MQ=36;PV4=1,1,1,1 PL:GT:GQ 111,0,120:0/1:99 +chr2a 3661005 . C G 24 . DP=13;AF1=0.5001;CI95=0.5,0.5;DP4=7,0,4,0;MQ=27;PV4=1,1.1e-05,1,1 PL:GT:GQ 54,0,34:0/1:37 +chr2a 4140063 . G A 81 . DP=26;AF1=0.6671;CI95=0.5,1;DP4=18,0,8,0;MQ=24;PV4=1,8.3e-09,1,1 PL:GT:GQ 110,0,3:0/1:5 +chr2a 4248440 . T C 20 . DP=28;AF1=0.5;CI95=0.5,0.5;DP4=11,0,7,0;MQ=25;PV4=1,1,0.47,1 PL:GT:GQ 50,0,92:0/1:53 +chr2a 4707656 . A G 63 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 95,9,0:1/1:63 +chr2a 5194801 . G A 7.59 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=24 PL:GT:GQ 38,6,0:1/1:49 +chr2a 14111103 . A G 7.84 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=20 PL:GT:GQ 40,21,0:1/1:84 +chr2a 17799746 . A G 11.3 . DP=5;AF1=0.5001;CI95=0.5,0.5;DP4=0,3,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 41,0,35:0/1:37 +chr2a 24728910 . G A 45.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=28 PL:GT:GQ 78,15,0:1/1:75 +chr2a 29627939 . G T 5.44 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=27 PL:GT:GQ 36,9,0:1/1:63 +chr2a 31373164 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr2a 33935228 . T C 41.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr2a 36311856 . G A 99 . DP=30;AF1=1;CI95=1,1;DP4=0,0,0,29;MQ=44 PL:GT:GQ 213,87,0:1/1:99 +chr2a 39281204 . T C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr2a 41087565 . C T 74.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=38 PL:GT:GQ 107,12,0:1/1:72 +chr2a 45574768 . C A 11.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=18 PL:GT:GQ 43,9,0:1/1:63 +chr2a 55464464 . T C 26.1 . DP=7;AF1=0.9966;CI95=0.5,1;DP4=5,0,2,0;MQ=26;PV4=1,1,1,1 PL:GT:GQ 55,1,0:1/1:23 +chr2a 63107673 . T A 70.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=34 PL:GT:GQ 103,12,0:1/1:72 +chr2a 63141732 . A T 22.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 54,6,0:1/1:49 +chr2a 63141910 . G A 3.41 . DP=16;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr2a 63141911 . C T 9.55 . DP=16;AF1=0.5031;CI95=0.5,0.5;DP4=0,2,0,3;MQ=33;PV4=1,0.43,1,1 PL:GT:GQ 39,0,19:0/1:22 +chr2a 63143543 . C T 28 . DP=18;AF1=1;CI95=1,1;DP4=0,1,0,17;MQ=16;PV4=1,1,1,1 PL:GT:GQ 61,42,0:1/1:99 +chr2a 66419805 . G A 3.69 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 34,15,0:1/1:75 +chr2a 66563922 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr2a 67719136 . C T 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 71,6,0:1/1:49 +chr2a 72781453 . A C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr2a 76733211 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr2a 78190502 . A C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr2a 85021209 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr2a 88554861 . A T 39 . DP=74;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,4;MQ=46;PV4=1,1,1,1 PL:GT:GQ 69,0,92:0/1:72 +chr2a 88554877 . A G 92 . DP=90;AF1=0.5;CI95=0.5,0.5;DP4=0,23,0,13;MQ=41;PV4=1,0.3,1,1 PL:GT:GQ 122,0,128:0/1:99 +chr2a 88824857 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr2a 93546675 . C T 26 . DP=6;AF1=0.5;CI95=0.5,0.5;DP4=4,0,2,0;MQ=46;PV4=1,1,1,1 PL:GT:GQ 56,0,87:0/1:59 +chr2a 94788853 . A G 34.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 67,15,0:1/1:75 +chr2a 96738146 . T C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr2a 102737384 . A G 12.3 . DP=18;AF1=1;CI95=1,1;DP4=0,0,18,0;MQ=11 PL:GT:GQ 45,54,0:1/1:99 +chr2a 103407172 . A G 35 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=19 PL:GT:GQ 68,24,0:1/1:96 +chr2a 105774580 . T G 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=30 PL:GT:GQ 135,39,0:1/1:99 +chr2a 106376301 . C G 24.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=19 PL:GT:GQ 57,18,0:1/1:90 +chr2a 106376315 . C T 8.75 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=19 PL:GT:GQ 41,18,0:1/1:90 +chr2a 112422267 . C T 30 . DP=20;AF1=0.5;CI95=0.5,0.5;DP4=14,0,5,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 60,0,131:0/1:63 +chr2b 3049384 . A C 14.9 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 3049385 . G C 14.9 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 3049406 . C G 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=36 PL:GT:GQ 135,18,0:1/1:90 +chr2b 4213802 . T C 89.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr2b 5022895 . G A 66 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=49 PL:GT:GQ 99,30,0:1/1:99 +chr2b 6037666 . G T 56 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=17 PL:GT:GQ 89,39,0:1/1:99 +chr2b 13656952 . G A 19.2 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=21 PL:GT:GQ 52,18,0:1/1:90 +chr2b 15026944 . A G 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 37,6,0:1/1:49 +chr2b 23362613 . A G 5.64 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 37,15,0:1/1:75 +chr2b 45947861 . C G 68 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=50 PL:GT:GQ 101,33,0:1/1:99 +chr2b 46597824 . T C 65.6 . DP=39;AF1=0.5939;CI95=0.5,1;DP4=23,0,10,0;MQ=22;PV4=1,0.014,1,1 PL:GT:GQ 95,0,5:0/1:7 +chr2b 49665191 . G T 34.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=37 PL:GT:GQ 67,21,0:1/1:84 +chr2b 61001546 . A G 48 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=26 PL:GT:GQ 81,24,0:1/1:96 +chr2b 88502851 . T C 4.77 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,2;MQ=37;PV4=1,1,0.46,1 PL:GT:GQ 33,0,34:0/1:33 +chr2b 91675431 . C T 30 . DP=14;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=27 PL:GT:GQ 63,24,0:1/1:96 +chr2b 91870148 . T G 67 . DP=14;AF1=1;CI95=1,1;DP4=0,1,0,13;MQ=47;PV4=1,1,1,1 PL:GT:GQ 100,31,0:1/1:99 +chr2b 97066826 . G A 20.1 . DP=9;AF1=0.5001;CI95=0.5,0.5;DP4=0,6,0,2;MQ=31;PV4=1,1,1,1 PL:GT:GQ 50,0,35:0/1:38 +chr2b 97670822 . G A 4.85 . DP=6;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=18 PL:GT:GQ 36,18,0:1/1:90 +chr2b 102773175 . A G 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 49,9,0:1/1:63 +chr2b 109805532 . T C 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=45 PL:GT:GQ 176,24,0:1/1:96 +chr2b 110841448 . A G 11.1 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 42,6,0:1/1:49 +chr2b 123217025 . T C 31.5 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=37 PL:GT:GQ 64,12,0:1/1:72 +chr2b 123263214 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 43,9,0:1/1:63 +chr2b 127747292 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=52 PL:GT:GQ 100,9,0:1/1:63 +chr2b 130121958 . A G 89.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 122,15,0:1/1:75 +chr2b 130253633 . A G 14.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr2b 130692761 . C T 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=51 PL:GT:GQ 82,18,0:1/1:90 +chr2b 130743365 . A G 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=42 PL:GT:GQ 140,15,0:1/1:75 +chr2b 131553874 . A C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=37 PL:GT:GQ 43,9,0:1/1:63 +chr2b 131716894 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=40 PL:GT:GQ 137,24,0:1/1:96 +chr2b 131716936 . G A 99 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=36 PL:GT:GQ 173,36,0:1/1:99 +chr2b 131716952 . A G 99 . DP=22;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,14;MQ=36;PV4=1,1,1,1 PL:GT:GQ 152,0,43:0/1:46 +chr2b 133360184 . C T 99 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,20;MQ=32 PL:GT:GQ 163,60,0:1/1:99 +chr2b 133644741 . T A 16.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=27 PL:GT:GQ 49,15,0:1/1:75 +chr2b 133720595 . T C 41 . DP=15;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=29 PL:GT:GQ 74,36,0:1/1:99 +chr2b 133727192 . C T 19.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 52,15,0:1/1:75 +chr2b 133727260 . G A 3.56 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=18 PL:GT:GQ 34,24,0:1/1:95 +chr2b 133800294 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=23 PL:GT:GQ 40,6,0:1/1:49 +chr2b 134582754 . A C 56.1 . DP=37;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=36 PL:GT:GQ 89,21,0:1/1:84 +chr2b 134582763 . G C 78 . DP=37;AF1=1;CI95=1,1;DP4=0,0,0,36;MQ=34 PL:GT:GQ 111,108,0:1/1:99 +chr2b 134809668 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr3 527814 . C G 46 . DP=9;AF1=0.5;CI95=0.5,0.5;DP4=6,0,3,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 76,0,106:0/1:79 +chr3 559510 . G A 38 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=10,0,17,0;MQ=28;PV4=1,1,0.014,1 PL:GT:GQ 68,0,111:0/1:71 +chr3 879433 . T G 32 . DP=4;AF1=0.5001;CI95=0.5,0.5;DP4=2,0,2,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 62,0,34:0/1:37 +chr3 1809645 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr3 3235812 . C T 7.59 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 38,6,0:1/1:49 +chr3 3250176 . A G 83 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=32 PL:GT:GQ 116,24,0:1/1:96 +chr3 5049073 . T A 99 . DP=25;AF1=0.5;CI95=0.5,0.5;DP4=16,0,9,0;MQ=39;PV4=1,1,1,1 PL:GT:GQ 136,0,129:0/1:99 +chr3 5142874 . G A 99 . DP=38;AF1=1;CI95=1,1;DP4=0,0,38,0;MQ=28 PL:GT:GQ 179,114,0:1/1:99 +chr3 5554864 . T C 3.54 . DP=7;AF1=0.4999;CI95=0.5,0.5;DP4=0,4,0,3;MQ=27;PV4=1,1,1,1 PL:GT:GQ 31,0,35:0/1:33 +chr3 5749648 . G A 21.2 . DP=26;AF1=0.7303;CI95=0.5,1;DP4=0,7,0,7;MQ=26;PV4=1,0.16,1,0.17 PL:GT:GQ 50,0,2:0/1:3 +chr3 16451708 . A T 71.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=38 PL:GT:GQ 104,15,0:1/1:75 +chr3 23410276 . G A 99 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 140,15,0:1/1:75 +chr3 51368824 . A G 28 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 60,9,0:1/1:63 +chr3 53000453 . A G 54 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=19 PL:GT:GQ 87,30,0:1/1:99 +chr3 53000463 . A G 54 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=19 PL:GT:GQ 87,30,0:1/1:99 +chr3 59077423 . C T 77.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=33 PL:GT:GQ 110,15,0:1/1:75 +chr3 60040501 . T C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 43,9,0:1/1:63 +chr3 64203481 . A G 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 66,12,0:1/1:72 +chr3 67947441 . C T 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr3 76372631 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 76,9,0:1/1:63 +chr3 80611316 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr3 81554381 . G T 17.6 . DP=24;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=26 PL:GT:GQ 50,12,0:1/1:72 +chr3 87614647 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr3 93900455 . A T 11.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=13 PL:GT:GQ 44,15,0:1/1:75 +chr3 96174457 . A G 4.11 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=24 PL:GT:GQ 34,9,0:1/1:63 +chr3 96215569 . A C 3.41 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr3 96587998 . A C 7.08 . DP=9;AF1=1;CI95=1,1;DP4=0,0,6,0;MQ=17 PL:GT:GQ 39,18,0:1/1:90 +chr3 99711220 . A C 12.8 . DP=11;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 42,2,0:1/1:37 +chr3 99789741 . C G 99 . DP=18;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=47 PL:GT:GQ 210,51,0:1/1:99 +chr3 103667651 . A C 3.98 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 33,6,0:1/1:49 +chr3 104604896 . G C 55 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 87,9,0:1/1:63 +chr3 104997217 . G A 33.1 . DP=18;AF1=1;CI95=1,1;DP4=1,0,16,0;MQ=34;PV4=1,3e-10,0.17,0.36 PL:GT:GQ 66,19,0:1/1:76 +chr3 106097816 . A G 28 . DP=15;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=26 PL:GT:GQ 61,45,0:1/1:99 +chr3 106822259 . G C 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=50 PL:GT:GQ 140,15,0:1/1:75 +chr3 109946413 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 44,6,0:1/1:49 +chr3 121238963 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr3 126248567 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 45,6,0:1/1:49 +chr3 129733836 . A G 6.2 . DP=4;AF1=0.5003;CI95=0.5,0.5;DP4=1,0,3,0;MQ=43;PV4=1,0.02,0.31,1 PL:GT:GQ 35,0,28:0/1:30 +chr3 131372785 . C T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=34 PL:GT:GQ 76,9,0:1/1:63 +chr3 132290987 . C T 22 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=45 PL:GT:GQ 54,9,0:1/1:63 +chr3 136054421 . C T 73 . DP=82;AF1=1;CI95=1,1;DP4=0,0,78,0;MQ=28 PL:GT:GQ 106,235,0:1/1:99 +chr3 141075246 . G A 30.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=41 PL:GT:GQ 62,6,0:1/1:49 +chr3 141075262 . T G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=41 PL:GT:GQ 73,6,0:1/1:49 +chr3 141430649 . G T 81.8 . DP=6;AF1=1;CI95=0.5,1;DP4=0,1,0,4;MQ=41;PV4=1,0.34,1,0.25 PL:GT:GQ 113,6,0:1/1:49 +chr3 143617747 . G T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 54,9,0:1/1:63 +chr3 163576128 . C T 5.6 . DP=4;AF1=0.7302;CI95=0.5,1;DP4=2,0,2,0;MQ=23;PV4=1,1,1,1 PL:GT:GQ 33,0,2:0/1:3 +chr3 163839828 . A G 4.45 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=26 PL:GT:GQ 35,12,0:1/1:72 +chr3 175839340 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr3 190193258 . G T 3.98 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 33,6,0:1/1:49 +chr3 190777007 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr3 190970350 . A G 61 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=37 PL:GT:GQ 94,30,0:1/1:99 +chr3 198686408 . G A 36.6 . DP=17;AF1=1;CI95=0.5,1;DP4=0,1,0,16;MQ=25;PV4=1,1,0.026,1 PL:GT:GQ 69,11,0:1/1:66 +chr3 199277478 . T C 3.61 . DP=6;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=21 PL:GT:GQ 34,18,0:1/1:90 +chr3 199780181 . G T 77 . DP=45;AF1=0.5;CI95=0.5,0.5;DP4=0,35,0,10;MQ=33;PV4=1,1,1,1 PL:GT:GQ 107,0,114:0/1:99 +chr3 199889335 . A C 9.54 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=18 PL:GT:GQ 42,24,0:1/1:96 +chr3 200018161 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr4 195475 . A G 13 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 44,6,0:1/1:49 +chr4 639141 . C A 14.9 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 46,6,0:1/1:49 +chr4 639152 . C T 15.2 . DP=17;AF1=0.5016;CI95=0.5,0.5;DP4=0,2,0,2;MQ=33;PV4=1,1,1,1 PL:GT:GQ 45,0,22:0/1:25 +chr4 986497 . G T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=33 PL:GT:GQ 163,30,0:1/1:99 +chr4 986516 . C T 55.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=37 PL:GT:GQ 88,21,0:1/1:84 +chr4 1207485 . A C 14.9 . DP=22;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 46,6,0:1/1:49 +chr4 1323502 . G A 13.2 . DP=13;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=22 PL:GT:GQ 46,33,0:1/1:99 +chr4 1613521 . G A 89 . DP=16;AF1=1;CI95=1,1;DP4=0,0,16,0;MQ=32 PL:GT:GQ 122,48,0:1/1:99 +chr4 1748790 . C T 38 . DP=21;AF1=0.5005;CI95=0.5,0.5;DP4=6,0,8,0;MQ=40;PV4=1,0.09,1,1 PL:GT:GQ 68,0,27:0/1:30 +chr4 2255732 . T C 99 . DP=29;AF1=1;CI95=1,1;DP4=0,0,28,0;MQ=31 PL:GT:GQ 186,84,0:1/1:99 +chr4 3010159 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr4 3545023 . A G 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=38 PL:GT:GQ 145,27,0:1/1:99 +chr4 3586344 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr4 3879337 . A G 16.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 49,12,0:1/1:72 +chr4 3940733 . A G 47.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 80,15,0:1/1:75 +chr4 4410338 . T C 13.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=31 PL:GT:GQ 46,15,0:1/1:75 +chr4 4796408 . T C 41 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=17 PL:GT:GQ 74,48,0:1/1:99 +chr4 4796414 . A G 11.3 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,15;MQ=17 PL:GT:GQ 44,45,0:1/1:99 +chr4 6436959 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr4 9494256 . T C 3.41 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=37 PL:GT:GQ 32,6,0:1/1:49 +chr4 24881479 . G A 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 46,9,0:1/1:63 +chr4 26128644 . A G 23 . DP=18;AF1=0.5006;CI95=0.5,0.5;DP4=8,0,10,0;MQ=22;PV4=1,1,1,1 PL:GT:GQ 53,0,26:0/1:29 +chr4 42109100 . G A 17.1 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 49,9,0:1/1:63 +chr4 42309652 . C T 68 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr4 46913966 . C T 9.08 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=16 PL:GT:GQ 41,12,0:1/1:72 +chr4 50335142 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr4 51658550 . C A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr4 58258023 . T C 26 . DP=5;AF1=0.5002;CI95=0.5,0.5;DP4=0,3,0,2;MQ=34;PV4=1,1,1,0.05 PL:GT:GQ 56,0,32:0/1:35 +chr4 59219112 . C A 42.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=50 PL:GT:GQ 75,12,0:1/1:72 +chr4 62746067 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr4 67404338 . G T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=39 PL:GT:GQ 66,12,0:1/1:72 +chr4 73353380 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr4 73946294 . G C 4.77 . DP=51;AF1=0.4999;CI95=0.5,0.5;DP4=0,5,0,3;MQ=40;PV4=1,0.19,0.37,0.11 PL:GT:GQ 33,0,64:0/1:36 +chr4 79607484 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr4 82337365 . G C 90 . DP=54;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=28 PL:GT:GQ 123,48,0:1/1:99 +chr4 82653801 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 34,9,0:1/1:63 +chr4 87130164 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 43,9,0:1/1:63 +chr4 87130176 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 43,9,0:1/1:63 +chr4 91459729 . C A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr4 96130778 . G C 99 . DP=19;AF1=1;CI95=1,1;DP4=0,0,0,19;MQ=45 PL:GT:GQ 211,57,0:1/1:99 +chr4 100709417 . A G 45.1 . DP=16;AF1=0.505;CI95=0.5,0.5;DP4=12,0,4,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 75,0,17:0/1:20 +chr4 107276770 . C T 70 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,6;MQ=31;PV4=1,1,1,1 PL:GT:GQ 100,0,97:0/1:98 +chr4 115327550 . G C 42 . DP=67;AF1=1;CI95=1,1;DP4=0,1,0,66;MQ=35;PV4=1,3.2e-24,0.13,1 PL:GT:GQ 75,162,0:1/1:99 +chr4 136558502 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr4 159572459 . G A 15.1 . DP=126;AF1=0.5;CI95=0.5,0.5;DP4=0,69,0,57;MQ=39;PV4=1,4.1e-96,0.077,1 PL:GT:GQ 45,0,175:0/1:48 +chr4 174968484 . G C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 40,6,0:1/1:49 +chr4 175030633 . T C 14.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=29 PL:GT:GQ 47,18,0:1/1:90 +chr4 183410027 . G T 6.2 . DP=31;AF1=0.5003;CI95=0.5,0.5;DP4=2,0,2,0;MQ=45;PV4=1,0.035,1,0.21 PL:GT:GQ 35,0,28:0/1:30 +chr4 190907368 . T C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=50 PL:GT:GQ 66,12,0:1/1:72 +chr4 192175690 . A G 76.8 . DP=7;AF1=0.95;CI95=0.5,1;DP4=0,3,0,4;MQ=35;PV4=1,1,1,1 PL:GT:GQ 105,0,0:1/1:10 +chr4 192673268 . G A 14.2 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=22 PL:GT:GQ 47,27,0:1/1:99 +chr4 192943966 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr4 195460104 . C G 23.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=19 PL:GT:GQ 56,24,0:1/1:96 +chr4 198277830 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr5 170098 . A G 13 . DP=12;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 44,6,0:1/1:49 +chr5 395814 . T C 4.77 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,2;MQ=36;PV4=1,1,0.48,1 PL:GT:GQ 33,0,33:0/1:33 +chr5 414024 . T A 10.4 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=20 PL:GT:GQ 42,9,0:1/1:63 +chr5 496767 . T C 13.9 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr5 805676 . C G 45 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=32 PL:GT:GQ 78,51,0:1/1:99 +chr5 1252896 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr5 1418370 . G A 3.65 . DP=8;AF1=0.7301;CI95=0.5,1;DP4=4,0,4,0;MQ=13;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr5 1494911 . G C 62 . DP=9;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=46 PL:GT:GQ 95,24,0:1/1:96 +chr5 1494932 . C T 6.98 . DP=8;AF1=0.5001;CI95=0.5,0.5;DP4=1,0,2,0;MQ=46;PV4=1,0.1,0.077,1 PL:GT:GQ 36,0,31:0/1:33 +chr5 1506037 . T C 24.1 . DP=24;AF1=1;CI95=0.5,1;DP4=11,0,13,0;MQ=16;PV4=1,1,1,1 PL:GT:GQ 55,5,0:1/1:46 +chr5 1509406 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 73,6,0:1/1:49 +chr5 1733649 . A G 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,25;MQ=47 PL:GT:GQ 212,75,0:1/1:99 +chr5 1747304 . A G 12.3 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=19 PL:GT:GQ 45,36,0:1/1:99 +chr5 1747308 . C A 44 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=19 PL:GT:GQ 77,36,0:1/1:99 +chr5 3519783 . C T 21.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=18 PL:GT:GQ 54,24,0:1/1:96 +chr5 4101593 . A G 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=43 PL:GT:GQ 102,12,0:1/1:72 +chr5 7204332 . T A 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=24 PL:GT:GQ 34,6,0:1/1:49 +chr5 11510398 . A C 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=51;PV4=1,1,0,1 PL:GT:GQ 64,0,31:0/1:34 +chr5 15406720 . T C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 36,6,0:1/1:49 +chr5 25152417 . C A 10.9 . DP=28;AF1=0.5718;CI95=0.5,1;DP4=0,2,0,6;MQ=25;PV4=1,1,0.21,1 PL:GT:GQ 40,0,6:0/1:8 +chr5 39072637 . A G 35.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=50 PL:GT:GQ 68,15,0:1/1:75 +chr5 46022699 . G A 44 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=35 PL:GT:GQ 76,9,0:1/1:63 +chr5 55664181 . C G 10.4 . DP=8;AF1=0.9999;CI95=0.5,1;DP4=3,0,5,0;MQ=18;PV4=1,1,1,1 PL:GT:GQ 40,3,0:1/1:41 +chr5 56253386 . T C 50.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=36 PL:GT:GQ 83,21,0:1/1:84 +chr5 56253447 . C T 42.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=45 PL:GT:GQ 75,12,0:1/1:72 +chr5 71950166 . G T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr5 72703090 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 40,6,0:1/1:49 +chr5 73570280 . G T 5.45 . DP=41;AF1=1;CI95=1,1;DP4=0,0,41,0;MQ=15 PL:GT:GQ 37,123,0:1/1:99 +chr5 73701762 . G T 40.8 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 72,6,0:1/1:49 +chr5 76956867 . T C 10.2 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 41,6,0:1/1:49 +chr5 79097961 . C G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 54,9,0:1/1:63 +chr5 87026167 . T C 22 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr5 97680525 . T C 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=23 PL:GT:GQ 33,12,0:1/1:72 +chr5 100674737 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr5 105389966 . T C 3.52 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=15 PL:GT:GQ 33,9,0:1/1:63 +chr5 109998341 . A C 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr5 120629105 . C T 6.79 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 37,6,0:1/1:49 +chr5 128383954 . C T 23 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=0,5,0,5;MQ=48;PV4=1,3.3e-07,1,1 PL:GT:GQ 53,0,98:0/1:56 +chr5 133925142 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr5 135375404 . T C 11.8 . DP=6;AF1=1;CI95=0.5,1;DP4=1,0,3,0;MQ=31;PV4=1,0.03,1,1 PL:GT:GQ 42,4,0:1/1:45 +chr5 136498281 . T G 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr5 136717285 . A G 82.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 115,12,0:1/1:72 +chr5 136910734 . G A 62 . DP=19;AF1=1;CI95=1,1;DP4=0,1,0,13;MQ=23;PV4=1,1,1,1 PL:GT:GQ 95,31,0:1/1:99 +chr5 141208149 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr5 148056348 . C A 37.1 . DP=4;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=38;PV4=1,1,1,1 PL:GT:GQ 66,1,0:1/1:23 +chr5 151941534 . G T 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=34 PL:GT:GQ 79,12,0:1/1:72 +chr5 159967229 . G C 22.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 55,12,0:1/1:72 +chr5 174024541 . T G 29.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 59,2,0:1/1:37 +chr5 175525290 . A G 3.27 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=20 PL:GT:GQ 33,12,0:1/1:72 +chr5 175988954 . A C 14.2 . DP=23;AF1=0.5;CI95=0.5,0.5;DP4=0,6,0,4;MQ=47;PV4=1,1,0.2,1 PL:GT:GQ 44,0,76:0/1:47 +chr5 176782226 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr5 179132834 . C G 99 . DP=28;AF1=1;CI95=1,1;DP4=0,0,0,28;MQ=41 PL:GT:GQ 207,84,0:1/1:99 +chr5 180155809 . G C 3.01 . DP=36;AF1=0.4997;CI95=0.5,0.5;DP4=25,0,9,0;MQ=35;PV4=1,1e-15,1,1 PL:GT:GQ 30,0,121:0/1:33 +chr5 181282819 . T G 38.3 . DP=11;AF1=1;CI95=0.5,1;DP4=0,2,0,9;MQ=23;PV4=1,1,1,1 PL:GT:GQ 71,14,0:1/1:70 +chr5 182426125 . G C 29 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=26 PL:GT:GQ 61,9,0:1/1:63 +chr5 182443682 . G A 3.69 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=21 PL:GT:GQ 34,15,0:1/1:75 +chr5 183008993 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr5 183312016 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr6_cox_hap1 519146 . G A 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=30 PL:GT:GQ 49,9,0:1/1:63 +chr6_cox_hap1 687497 . A G 33 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=2,0,4,0;MQ=35;PV4=1,0.0016,1,1 PL:GT:GQ 63,3,0:1/1:41 +chr6_qbl_hap2 120066 . T C 99 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 139,27,0:1/1:99 +chr6 277954 . C T 53 . DP=41;AF1=1;CI95=1,1;DP4=4,0,37,0;MQ=19;PV4=1,1,0.3,1 PL:GT:GQ 86,49,0:1/1:99 +chr6 593158 . A G 4.61 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 34,6,0:1/1:49 +chr6 2865562 . T G 25 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=23 PL:GT:GQ 58,27,0:1/1:99 +chr6 3751403 . G A 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=32 PL:GT:GQ 75,15,0:1/1:75 +chr6 3884989 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr6 4127278 . A T 13.9 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr6 5887783 . C G 99 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=34 PL:GT:GQ 142,21,0:1/1:84 +chr6 5887811 . C T 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=34 PL:GT:GQ 88,21,0:1/1:84 +chr6 6937170 . G C 99 . DP=47;AF1=1;CI95=1,1;DP4=0,0,0,47;MQ=28 PL:GT:GQ 157,141,0:1/1:99 +chr6 7262317 . C T 13.2 . DP=50;AF1=0.5;CI95=0.5,0.5;DP4=21,0,9,0;MQ=36;PV4=1,4e-05,0.17,0.26 PL:GT:GQ 43,0,158:0/1:46 +chr6 7533214 . A G 10.4 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=26 PL:GT:GQ 42,9,0:1/1:63 +chr6 20979907 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=38 PL:GT:GQ 76,9,0:1/1:63 +chr6 22321632 . A G 41 . DP=5;AF1=0.5004;CI95=0.5,0.5;DP4=1,0,3,0;MQ=46;PV4=1,0.24,0.19,0.33 PL:GT:GQ 71,0,28:0/1:31 +chr6 25352296 . G A 7.8 . DP=4;AF1=0.5003;CI95=0.5,0.5;DP4=0,1,0,3;MQ=38;PV4=1,1,0.16,1 PL:GT:GQ 37,0,28:0/1:30 +chr6 26298040 . T A 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=48;PV4=1,1,0.21,0.33 PL:GT:GQ 64,0,31:0/1:34 +chr6 33428755 . G A 70 . DP=14;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=32 PL:GT:GQ 103,27,0:1/1:99 +chr6 39512099 . G A 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=50 PL:GT:GQ 88,21,0:1/1:84 +chr6 39961094 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr6 40452120 . A G 40.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 72,6,0:1/1:49 +chr6 43204766 . A G 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=51 PL:GT:GQ 176,24,0:1/1:96 +chr6 52696512 . C T 70 . DP=76;AF1=0.5;CI95=0.5,0.5;DP4=0,34,0,42;MQ=18;PV4=1,0.11,1,1 PL:GT:GQ 100,0,51:0/1:54 +chr6 53785550 . A G 99 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=46 PL:GT:GQ 190,30,0:1/1:99 +chr6 53897484 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr6 57038290 . C T 10.2 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 41,6,0:1/1:49 +chr6 62925087 . G C 35 . DP=5;AF1=0.5008;CI95=0.5,0.5;DP4=1,0,4,0;MQ=36;PV4=1,1,0.2,1 PL:GT:GQ 65,0,25:0/1:28 +chr6 62925094 . T C 25.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=36 PL:GT:GQ 58,15,0:1/1:75 +chr6 70834405 . G A 72.1 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=29 PL:GT:GQ 105,21,0:1/1:84 +chr6 71026058 . C T 48.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=42 PL:GT:GQ 81,18,0:1/1:90 +chr6 74420752 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 76,9,0:1/1:63 +chr6 77498624 . T C 16.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 48,6,0:1/1:49 +chr6 80416836 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr6 113611590 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=46 PL:GT:GQ 100,9,0:1/1:63 +chr6 119308431 . T C 38.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=40 PL:GT:GQ 71,12,0:1/1:72 +chr6 151758592 . T C 3.07 . DP=17;AF1=0.9966;CI95=0.5,1;DP4=0,8,0,9;MQ=13;PV4=1,1,1,1 PL:GT:GQ 29,1,0:1/1:23 +chr6 151759358 . A G 99 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=12,0,15,0;MQ=44;PV4=1,1,1,0.19 PL:GT:GQ 171,0,128:0/1:99 +chr6 154741755 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr6 161061053 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=52 PL:GT:GQ 40,6,0:1/1:49 +chr6 161474189 . C T 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 36,6,0:1/1:49 +chr6 164304657 . C T 10.4 . DP=63;AF1=0.5;CI95=0.5,0.5;DP4=0,29,0,19;MQ=22;PV4=1,7.7e-11,1,0.049 PL:GT:GQ 40,0,37:0/1:38 +chr6 164703105 . T C 99 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=40 PL:GT:GQ 165,30,0:1/1:99 +chr6 167518328 . A G 78 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=27,0,14,0;MQ=33;PV4=1,0.026,0.43,0.056 PL:GT:GQ 108,0,149:0/1:99 +chr6 169906323 . G A 41.8 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr6 171893912 . G A 69.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=33 PL:GT:GQ 102,15,0:1/1:75 +chr6 173631604 . A G 6.98 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=4,0,3,0;MQ=37;PV4=1,0.069,1,1 PL:GT:GQ 36,0,34:0/1:35 +chr7 835856 . C T 27.5 . DP=13;AF1=0.9998;CI95=0.5,1;DP4=4,0,6,0;MQ=23;PV4=1,0.46,1,1 PL:GT:GQ 57,2,0:1/1:37 +chr7 1046005 . C T 11.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=36 PL:GT:GQ 43,9,0:1/1:63 +chr7 1564339 . C T 71 . DP=66;AF1=0.5;CI95=0.5,0.5;DP4=36,0,24,0;MQ=29;PV4=1,1,0.35,1 PL:GT:GQ 101,0,134:0/1:99 +chr7 1806266 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr7 1936013 . G T 7.77 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=17 PL:GT:GQ 39,9,0:1/1:63 +chr7 2319532 . C A 4.11 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=14 PL:GT:GQ 34,9,0:1/1:63 +chr7 2682121 . C T 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr7 3248116 . T C 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=37;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr7 3624766 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 40,6,0:1/1:49 +chr7 5291140 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=37 PL:GT:GQ 45,6,0:1/1:49 +chr7 5314457 . C A 3.56 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=18 PL:GT:GQ 34,24,0:1/1:95 +chr7 5595072 . T A 79 . DP=13;AF1=0.5;CI95=0.5,0.5;DP4=8,0,5,0;MQ=31;PV4=1,1,1,1 PL:GT:GQ 109,0,57:0/1:60 +chr7 5646060 . G C 7.79 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=10 PL:GT:GQ 40,30,0:1/1:99 +chr7 6056816 . C G 7.08 . DP=6;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=23;PV4=1,1,1,1 PL:GT:GQ 35,1,0:1/1:23 +chr7 6412641 . C T 40 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=33 PL:GT:GQ 73,33,0:1/1:99 +chr7 6766874 . A G 34.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=43 PL:GT:GQ 67,15,0:1/1:75 +chr7 8482729 . C T 5.08 . DP=16;AF1=0.8276;CI95=0.5,1;DP4=3,0,3,0;MQ=22;PV4=1,1,1,0.19 PL:GT:GQ 32,0,1:1/1:5 +chr7 9238362 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr7 9687781 . G A 33 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=0,16,0,12;MQ=48;PV4=1,6.5e-38,1,1 PL:GT:GQ 63,0,170:0/1:66 +chr7 9752803 . A T 14.2 . DP=17;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=18 PL:GT:GQ 47,27,0:1/1:99 +chr7 10240910 . T C 45.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 78,12,0:1/1:72 +chr7 11046187 . C T 86.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=47 PL:GT:GQ 119,12,0:1/1:72 +chr7 11548207 . C G 14.6 . DP=13;AF1=1;CI95=0.5,1;DP4=6,1,0,5;MQ=18;PV4=0.015,1,1,1 PL:GT:GQ 46,7,0:1/1:57 +chr7 11580317 . C T 42 . DP=12;AF1=1;CI95=1,1;DP4=0,1,0,10;MQ=22;PV4=1,1,1,1 PL:GT:GQ 75,23,0:1/1:92 +chr7 11585384 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr7 13498356 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 73,6,0:1/1:49 +chr7 13500887 . G A 15.1 . DP=11;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=22 PL:GT:GQ 48,30,0:1/1:99 +chr7 13827079 . C T 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 36,6,0:1/1:49 +chr7 14403976 . T G 59 . DP=30;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=39 PL:GT:GQ 92,24,0:1/1:96 +chr7 14756588 . A G 44 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=5,0,10,0;MQ=44;PV4=1,5.3e-18,1,1 PL:GT:GQ 74,0,70:0/1:72 +chr7 14756619 . T G 44 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=5,0,10,0;MQ=44;PV4=1,6.4e-10,1,1 PL:GT:GQ 74,0,70:0/1:72 +chr7 36734598 . A C 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 42,6,0:1/1:49 +chr7 36734599 . A T 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 42,6,0:1/1:49 +chr7 36734603 . G C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=40 PL:GT:GQ 40,6,0:1/1:49 +chr7 40634921 . A C 55 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=39 PL:GT:GQ 88,39,0:1/1:99 +chr7 48271285 . A T 73 . DP=15;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=25 PL:GT:GQ 106,30,0:1/1:99 +chr7 56264700 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr7 62326003 . C A 26.1 . DP=35;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=28 PL:GT:GQ 59,18,0:1/1:90 +chr7 109468934 . T G 5.13 . DP=10;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=39;PV4=1,0.031,1,1 PL:GT:GQ 33,2,0:1/1:37 +chr7 110208327 . C G 16.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 48,6,0:1/1:49 +chr7 125654934 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=27 PL:GT:GQ 34,9,0:1/1:63 +chr7 125770209 . A C 32 . DP=31;AF1=0.5;CI95=0.5,0.5;DP4=11,0,13,0;MQ=34;PV4=1,0.00017,0.16,0.22 PL:GT:GQ 62,0,105:0/1:65 +chr7 125770265 . G C 36 . DP=16;AF1=0.5;CI95=0.5,0.5;DP4=0,5,0,5;MQ=48;PV4=1,0.0047,0.016,0.035 PL:GT:GQ 66,0,110:0/1:69 +chr7 126687042 . A G 21.1 . DP=36;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=22 PL:GT:GQ 54,21,0:1/1:84 +chr7 132292897 . G T 99 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=43 PL:GT:GQ 167,21,0:1/1:84 +chr7 132334562 . A C 23 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=23 PL:GT:GQ 56,30,0:1/1:99 +chr7 132431838 . C T 13.3 . DP=5;AF1=1;CI95=0.5,1;DP4=1,0,4,0;MQ=23;PV4=1,1,1,1 PL:GT:GQ 44,5,0:1/1:46 +chr7 136324945 . T C 13.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 46,12,0:1/1:72 +chr7 136957634 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr7 141746871 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 40,6,0:1/1:49 +chr7 146831870 . C T 4.77 . DP=14;AF1=0.5003;CI95=0.5,0.5;DP4=1,0,3,0;MQ=37;PV4=1,0.0029,0.28,1 PL:GT:GQ 33,0,28:0/1:30 +chr7 147142770 . T C 45 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=31 PL:GT:GQ 77,9,0:1/1:63 +chr7 147713906 . C T 4.77 . DP=8;AF1=0.5002;CI95=0.5,0.5;DP4=2,0,4,0;MQ=35;PV4=1,8.9e-06,0.48,0.27 PL:GT:GQ 33,0,29:0/1:31 +chr7 148742642 . G A 68 . DP=14;AF1=0.5032;CI95=0.5,0.5;DP4=4,0,10,0;MQ=28;PV4=1,1,1,1 PL:GT:GQ 98,0,19:0/1:22 +chr7 148879148 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr7 149484407 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr7 152444478 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 44,6,0:1/1:49 +chr7 154106613 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=51 PL:GT:GQ 100,9,0:1/1:63 +chr7 154776891 . G T 14.4 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 47,15,0:1/1:75 +chr7 155882061 . A C 29 . DP=24;AF1=0.502;CI95=0.5,0.5;DP4=0,1,0,4;MQ=46;PV4=1,0.018,0.15,0.29 PL:GT:GQ 59,0,21:0/1:24 +chr7 155956844 . G C 23 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,4;MQ=38;PV4=1,1,0.38,1 PL:GT:GQ 53,0,103:0/1:56 +chr7 156277694 . G A 62 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=46 PL:GT:GQ 95,24,0:1/1:96 +chr7 156720588 . T C 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr7 156807649 . T C 3.01 . DP=30;AF1=0.4997;CI95=0.5,0.5;DP4=0,4,0,3;MQ=43;PV4=1,0.16,0.15,1 PL:GT:GQ 30,0,72:0/1:33 +chr7 157331292 . G T 43.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=34 PL:GT:GQ 76,21,0:1/1:84 +chr7 157382957 . T C 33.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 66,12,0:1/1:72 +chr8 556382 . A G 37.1 . DP=5;AF1=0.9966;CI95=0.5,1;DP4=2,0,3,0;MQ=31;PV4=1,1,1,1 PL:GT:GQ 66,1,0:1/1:23 +chr8 1661673 . T C 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr8 7379751 . C A 6.24 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=19 PL:GT:GQ 38,21,0:1/1:84 +chr8 8160505 . A T 68.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 101,12,0:1/1:72 +chr8 8160508 . C T 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 57,12,0:1/1:72 +chr8 16781011 . A G 55.5 . DP=9;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=34 PL:GT:GQ 88,12,0:1/1:72 +chr8 18716499 . A T 20 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=0,4,0,2;MQ=29;PV4=1,1,1,1 PL:GT:GQ 50,0,52:0/1:51 +chr8 23326483 . A G 60 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=47 PL:GT:GQ 92,9,0:1/1:63 +chr8 25842819 . T A 12 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 43,6,0:1/1:49 +chr8 26300279 . T C 34 . DP=44;AF1=1;CI95=1,1;DP4=0,0,41,0;MQ=21 PL:GT:GQ 67,123,0:1/1:99 +chr8 29673470 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 73,6,0:1/1:49 +chr8 29673473 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=41 PL:GT:GQ 40,6,0:1/1:49 +chr8 31685466 . C T 34 . DP=17;AF1=0.5;CI95=0.5,0.5;DP4=10,0,5,0;MQ=28;PV4=1,0.072,1,0.36 PL:GT:GQ 64,0,50:0/1:53 +chr8 37378739 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr8 51325952 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr8 59221963 . G A 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr8 62764995 . T G 20 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=32 PL:GT:GQ 52,9,0:1/1:63 +chr8 63157426 . C G 41.6 . DP=22;AF1=1;CI95=0.5,1;DP4=0,7,0,15;MQ=19;PV4=1,1,1,0.25 PL:GT:GQ 74,11,0:1/1:66 +chr8 68710444 . G A 30 . DP=5;AF1=0.6671;CI95=0.5,1;DP4=3,0,2,0;MQ=32;PV4=1,1,1,1 PL:GT:GQ 59,0,3:0/1:5 +chr8 76416560 . G A 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=46 PL:GT:GQ 122,12,0:1/1:72 +chr8 81425275 . T G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=50 PL:GT:GQ 100,9,0:1/1:63 +chr8 89842286 . G C 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=30 PL:GT:GQ 34,6,0:1/1:49 +chr8 100926281 . G A 38 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 70,9,0:1/1:63 +chr8 102746002 . G C 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr8 107850176 . C T 43.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=45 PL:GT:GQ 76,18,0:1/1:90 +chr8 109966441 . T C 27.3 . DP=9;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=38 PL:GT:GQ 60,15,0:1/1:75 +chr8 118811716 . G T 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=50 PL:GT:GQ 155,18,0:1/1:90 +chr8 119440254 . A T 58.5 . DP=5;AF1=0.8277;CI95=0.5,1;DP4=2,0,3,0;MQ=34;PV4=1,1,1,0.14 PL:GT:GQ 87,0,1:1/1:5 +chr8 121236024 . G A 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 71,6,0:1/1:49 +chr8 125489079 . C T 13 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr8 128502549 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr8 128502551 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr8 130951113 . G A 4.61 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=19 PL:GT:GQ 34,6,0:1/1:49 +chr8 135307123 . G A 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 36,6,0:1/1:49 +chr8 138814155 . C T 57.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 90,18,0:1/1:90 +chr8 140566111 . A G 18.1 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=15 PL:GT:GQ 51,36,0:1/1:99 +chr8 141586480 . T G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr8 143376712 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr8 150662729 . T C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr8 150741294 . A G 25.1 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=34 PL:GT:GQ 58,18,0:1/1:90 +chr8 150975618 . A G 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr8 151580103 . T C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=20 PL:GT:GQ 36,6,0:1/1:49 +chr8 151634410 . G T 48 . DP=17;AF1=0.5;CI95=0.5,0.5;DP4=0,12,0,5;MQ=39;PV4=1,0.072,1,1 PL:GT:GQ 78,0,125:0/1:81 +chr8 151709267 . G A 91.1 . DP=8;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,7;MQ=40;PV4=1,1,0.28,0.37 PL:GT:GQ 121,0,16:0/1:19 +chr8 152636420 . G A 8.75 . DP=3;AF1=0.9966;CI95=0.5,1;DP4=0,1,0,2;MQ=30;PV4=1,1,1,1 PL:GT:GQ 37,1,0:1/1:23 +chr8 152706967 . G A 3.01 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=16 PL:GT:GQ 33,30,0:1/1:99 +chr8 152786522 . T C 80.1 . DP=16;AF1=0.5102;CI95=0.5,0.5;DP4=0,4,0,12;MQ=31;PV4=1,0.25,1,1 PL:GT:GQ 110,0,14:0/1:17 +chr8 152863132 . T G 5.44 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=30 PL:GT:GQ 36,9,0:1/1:63 +chr9 23235268 . C T 12 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 43,6,0:1/1:49 +chr9 26391176 . T C 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 47,6,0:1/1:49 +chr9 26868232 . C G 63 . DP=20;AF1=0.5025;CI95=0.5,0.5;DP4=7,0,13,0;MQ=22;PV4=1,0.2,1,0.44 PL:GT:GQ 93,0,20:0/1:23 +chr9 34223668 . C T 22 . DP=16;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,7;MQ=27;PV4=1,0.14,0.34,1 PL:GT:GQ 52,0,79:0/1:55 +chr9 39696645 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr9 40654130 . T G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr9 41145321 . T G 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 79,12,0:1/1:72 +chr9 42273483 . G A 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr9 55633192 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 58705807 . T C 70 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=24 PL:GT:GQ 103,30,0:1/1:99 +chr9 61697149 . C G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 63152790 . A C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr9 63703913 . C G 90.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=38 PL:GT:GQ 123,21,0:1/1:84 +chr9 65116068 . T C 70 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=49 PL:GT:GQ 103,39,0:1/1:99 +chr9 71266598 . C A 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 33,6,0:1/1:49 +chr9 73188677 . G T 52 . DP=294;AF1=1;CI95=1,1;DP4=44,0,245,0;MQ=33;PV4=1,0.28,0.0092,1 PL:GT:GQ 85,147,0:1/1:99 +chr9 78854179 . G T 22 . DP=97;AF1=0.5;CI95=0.5,0.5;DP4=21,0,12,0;MQ=44;PV4=1,0.02,0.032,0.0033 PL:GT:GQ 52,0,158:0/1:55 +chr9 82964679 . A C 13.2 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=36 PL:GT:GQ 45,9,0:1/1:63 +chr9 84124545 . G T 57 . DP=11;AF1=0.5;CI95=0.5,0.5;DP4=2,0,3,0;MQ=49;PV4=1,1,0.024,1 PL:GT:GQ 87,0,59:0/1:62 +chr9 86552862 . C T 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=26 PL:GT:GQ 47,15,0:1/1:75 +chr9 87548941 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr9 89021101 . G A 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr9 90447825 . G A 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 40,6,0:1/1:49 +chr9 92462035 . C A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 40,6,0:1/1:49 +chr9 93077294 . T G 5.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=31 PL:GT:GQ 36,9,0:1/1:63 +chr9 93998137 . G A 68 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=46 PL:GT:GQ 100,9,0:1/1:63 +chr9 93998148 . C T 21.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=36 PL:GT:GQ 54,15,0:1/1:75 +chr9 95028964 . C A 99 . DP=83;AF1=0.5;CI95=0.5,0.5;DP4=0,57,0,26;MQ=32;PV4=1,9.3e-08,1,0.092 PL:GT:GQ 134,0,120:0/1:99 +chr9 103829155 . A G 33 . DP=96;AF1=1;CI95=1,1;DP4=0,0,96,0;MQ=16 PL:GT:GQ 66,255,0:1/1:99 +chr9 104981331 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 73,6,0:1/1:49 +chr9 111070656 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr9 117395657 . T C 16.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 49,15,0:1/1:75 +chr9 117718907 . A G 46.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=29 PL:GT:GQ 79,18,0:1/1:90 +chr9 119149161 . T C 3.14 . DP=65;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 33,15,0:1/1:75 +chr9 124528802 . G A 78 . DP=23;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=25 PL:GT:GQ 111,39,0:1/1:99 +chr9 126707903 . G A 26 . DP=37;AF1=0.5;CI95=0.5,0.5;DP4=0,21,0,8;MQ=46;PV4=1,2.6e-07,0.21,0.42 PL:GT:GQ 56,0,175:0/1:59 +chr9 128700686 . C G 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 66,12,0:1/1:72 +chr9 129084077 . G A 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr9 129116900 . A T 20 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 52,9,0:1/1:63 +chr9 130290720 . C G 21.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=42 PL:GT:GQ 53,6,0:1/1:49 +chr9 130306057 . C G 71 . DP=14;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=28 PL:GT:GQ 104,42,0:1/1:99 +chr9 130528990 . G A 99 . DP=31;AF1=1;CI95=1,1;DP4=0,0,31,0;MQ=27 PL:GT:GQ 174,93,0:1/1:99 +chr9 130529002 . A T 7.79 . DP=30;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=15 PL:GT:GQ 40,33,0:1/1:99 +chr9 130639996 . A G 8.44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 39,6,0:1/1:49 +chr9 130704890 . A G 3.27 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=26 PL:GT:GQ 33,12,0:1/1:72 +chr9 130708345 . G A 13.3 . DP=11;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=38;PV4=1,0.096,1,1 PL:GT:GQ 42,1,0:1/1:23 +chr9 131001601 . T A 3.98 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 33,6,0:1/1:49 +chr9 131058539 . T A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 44,6,0:1/1:49 +chr9 131808965 . C T 42 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 75,27,0:1/1:99 +chr9 132551867 . C T 17.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 49,9,0:1/1:63 +chr9 132685120 . A G 4.75 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 35,9,0:1/1:63 +chr9 133175050 . A G 18.1 . DP=30;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=20 PL:GT:GQ 51,51,0:1/1:99 +chr9 133584978 . A G 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,25,0;MQ=45 PL:GT:GQ 212,75,0:1/1:99 +chr9 133661895 . A G 99 . DP=17;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=31 PL:GT:GQ 138,42,0:1/1:99 +chr9 133670376 . T C 68 . DP=19;AF1=1;CI95=1,1;DP4=0,1,0,16;MQ=39;PV4=1,1.4e-20,1,1 PL:GT:GQ 101,39,0:1/1:99 +chr9 133843777 . T C 99 . DP=9;AF1=0.5129;CI95=0.5,0.5;DP4=1,0,8,0;MQ=43;PV4=1,1,1,1 PL:GT:GQ 154,0,13:0/1:16 +chr9 134017265 . G C 3.27 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=13 PL:GT:GQ 33,12,0:1/1:72 +chr9 134105563 . T C 34.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=39 PL:GT:GQ 67,18,0:1/1:90 +chr9 134608906 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr9 134861929 . T A 9.49 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 41,9,0:1/1:63 +chr10 796662 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 54,9,0:1/1:63 +chr10 1216716 . T A 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr10 1220781 . G A 21 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=18 PL:GT:GQ 54,27,0:1/1:99 +chr10 1225208 . T C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=47 PL:GT:GQ 100,9,0:1/1:63 +chr10 1727946 . T C 14.2 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=27 PL:GT:GQ 47,21,0:1/1:84 +chr10 5986542 . T C 83 . DP=93;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=39 PL:GT:GQ 116,30,0:1/1:99 +chr10 6436277 . G A 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 36,6,0:1/1:49 +chr10 7704114 . C A 35 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=0,2,0,4;MQ=29;PV4=1,0.27,1,0.27 PL:GT:GQ 65,3,0:1/1:41 +chr10 10881734 . A G 9.52 . DP=9;AF1=0.5;CI95=0.5,0.5;DP4=4,0,5,0;MQ=42;PV4=1,0.0026,0.14,1 PL:GT:GQ 39,0,91:0/1:42 +chr10 13099383 . G A 27.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 60,12,0:1/1:72 +chr10 15764077 . G C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=40 PL:GT:GQ 43,9,0:1/1:63 +chr10 18091502 . T C 47 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 79,9,0:1/1:63 +chr10 19645913 . A T 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 47,6,0:1/1:49 +chr10 22845062 . C T 18.1 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=18 PL:GT:GQ 51,21,0:1/1:84 +chr10 28282802 . T C 69 . DP=12;AF1=1;CI95=1,1;DP4=0,0,12,0;MQ=42 PL:GT:GQ 102,36,0:1/1:99 +chr10 28496872 . T G 8.44 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 39,6,0:1/1:49 +chr10 32746793 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 73,6,0:1/1:49 +chr10 41437604 . T G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr10 43051239 . C T 6.98 . DP=3;AF1=0.5001;CI95=0.5,0.5;DP4=1,0,2,0;MQ=40;PV4=1,0.33,0.33,1 PL:GT:GQ 36,0,31:0/1:33 +chr10 44455192 . C T 4.41 . DP=6;AF1=0.8276;CI95=0.5,1;DP4=0,3,0,3;MQ=21;PV4=1,1,1,1 PL:GT:GQ 31,0,1:1/1:5 +chr10 48387336 . A G 13 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr10 51561705 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr10 51561712 . C G 39.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 71,6,0:1/1:49 +chr10 55617954 . G A 8.44 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 39,6,0:1/1:49 +chr10 55718281 . T A 3.41 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=32 PL:GT:GQ 32,6,0:1/1:49 +chr10 55888771 . T C 23.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 56,12,0:1/1:72 +chr10 56025569 . C G 34.1 . DP=3;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,2;MQ=39;PV4=1,1,1,1 PL:GT:GQ 64,0,16:0/1:19 +chr10 57384943 . G T 84 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=16,0,13,0;MQ=26;PV4=1,0.015,1,1 PL:GT:GQ 114,0,110:0/1:99 +chr10 59873077 . T G 49 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=42 PL:GT:GQ 82,24,0:1/1:96 +chr10 61329572 . C T 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 47,6,0:1/1:49 +chr10 63790636 . T G 32.1 . DP=19;AF1=1;CI95=1,1;DP4=1,0,10,0;MQ=28;PV4=1,0.14,1,1 PL:GT:GQ 65,22,0:1/1:88 +chr10 64466048 . C G 18.2 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=28 PL:GT:GQ 51,18,0:1/1:90 +chr10 65053440 . G T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=39 PL:GT:GQ 153,30,0:1/1:99 +chr10 65407358 . C G 84.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 117,15,0:1/1:75 +chr10 65605291 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr10 66104447 . T C 99 . DP=47;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,21;MQ=34;PV4=1,1,0.15,1 PL:GT:GQ 136,0,162:0/1:99 +chr10 82160859 . G C 99 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,13;MQ=36 PL:GT:GQ 153,39,0:1/1:99 +chr10 82198579 . C T 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr10 87086290 . A G 4.13 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=17 PL:GT:GQ 35,27,0:1/1:99 +chr10 89550621 . T G 74 . DP=47;AF1=1;CI95=1,1;DP4=0,0,0,45;MQ=45 PL:GT:GQ 107,135,0:1/1:99 +chr10 92325046 . G A 42.3 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=45 PL:GT:GQ 75,15,0:1/1:75 +chr10 94488050 . A G 5.46 . DP=4;AF1=0.5;CI95=0.5,0.5;DP4=2,0,2,0;MQ=43;PV4=1,0.16,1,1 PL:GT:GQ 34,0,34:0/1:34 +chr10 95024815 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr10 95466306 . G A 53 . DP=7;AF1=0.6671;CI95=0.5,1;DP4=0,4,0,3;MQ=33;PV4=1,1,1,1 PL:GT:GQ 82,0,3:0/1:5 +chr10 100256777 . T G 3.83 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=23 PL:GT:GQ 34,12,0:1/1:72 +chr10 101510485 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr10 101530760 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr10 101879744 . T C 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=44 PL:GT:GQ 54,9,0:1/1:63 +chr10 102147276 . G C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=33 PL:GT:GQ 43,9,0:1/1:63 +chr10 102642248 . T G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr10 107666616 . T C 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=43 PL:GT:GQ 40,6,0:1/1:49 +chr10 108319945 . C G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 43,9,0:1/1:63 +chr10 109734371 . G A 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr10 112870604 . C T 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=36 PL:GT:GQ 79,12,0:1/1:72 +chr10 115304673 . T C 11.3 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr10 119380588 . G A 14.2 . DP=4;AF1=0.502;CI95=0.5,0.5;DP4=1,0,3,0;MQ=43;PV4=1,0.18,0.32,1 PL:GT:GQ 44,0,21:0/1:24 +chr10 123063756 . C T 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=23 PL:GT:GQ 46,9,0:1/1:63 +chr10 128424770 . T G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 45,6,0:1/1:49 +chr10 131229204 . T C 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr10 132420570 . G C 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr10 132528066 . C T 99 . DP=19;AF1=1;CI95=1,1;DP4=0,0,19,0;MQ=42 PL:GT:GQ 213,57,0:1/1:99 +chr10 132644619 . G A 19.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=23 PL:GT:GQ 52,15,0:1/1:75 +chr10 132707581 . G C 9.11 . DP=51;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=25;PV4=1,1,1,1 PL:GT:GQ 38,2,0:1/1:37 +chr10 133026892 . T C 55.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=44 PL:GT:GQ 88,18,0:1/1:90 +chr11 768033 . T C 33.5 . DP=4;AF1=0.8277;CI95=0.5,1;DP4=0,2,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 62,0,1:1/1:5 +chr11 768042 . T C 33.5 . DP=6;AF1=0.8277;CI95=0.5,1;DP4=0,2,0,2;MQ=32;PV4=1,1,1,1 PL:GT:GQ 62,0,1:1/1:5 +chr11 874568 . G C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 66,12,0:1/1:72 +chr11 1009210 . T C 4 . DP=70;AF1=0.6241;CI95=0.5,1;DP4=0,3,0,8;MQ=24;PV4=1,1,0.5,1 PL:GT:GQ 31,0,4:0/1:6 +chr11 1016692 . C T 27 . DP=39;AF1=1;CI95=1,1;DP4=0,0,0,38;MQ=22 PL:GT:GQ 60,114,0:1/1:99 +chr11 1034477 . A G 66 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 98,9,0:1/1:63 +chr11 1074037 . G A 4.13 . DP=9;AF1=0.5001;CI95=0.5,0.5;DP4=4,0,5,0;MQ=24;PV4=1,1,0.43,1 PL:GT:GQ 32,0,30:0/1:31 +chr11 1556298 . G A 11.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=33 PL:GT:GQ 44,12,0:1/1:72 +chr11 1824777 . T C 27 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=28 PL:GT:GQ 60,30,0:1/1:99 +chr11 3395801 . C T 22 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 54,9,0:1/1:63 +chr11 3411901 . G A 4.75 . DP=17;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=29 PL:GT:GQ 35,9,0:1/1:63 +chr11 3731606 . A C 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr11 3783855 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr11 3967636 . A G 4.29 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=24 PL:GT:GQ 35,15,0:1/1:75 +chr11 4385618 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr11 4424365 . T A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr11 5295586 . C T 3.01 . DP=52;AF1=0.4997;CI95=0.5,0.5;DP4=33,0,10,0;MQ=29;PV4=1,0.0045,0.3,0.17 PL:GT:GQ 30,0,131:0/1:33 +chr11 6157144 . C G 45.1 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=35 PL:GT:GQ 78,21,0:1/1:84 +chr11 6352044 . C T 18 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=31 PL:GT:GQ 50,9,0:1/1:63 +chr11 6767356 . T C 9.63 . DP=3;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=29;PV4=1,1,1,1 PL:GT:GQ 38,1,0:1/1:23 +chr11 6999404 . G C 21 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=37 PL:GT:GQ 53,9,0:1/1:63 +chr11 9120930 . C G 17.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr11 9373125 . T C 19.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 51,6,0:1/1:49 +chr11 9585101 . C T 67 . DP=16;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=45 PL:GT:GQ 100,42,0:1/1:99 +chr11 10266192 . A C 14.3 . DP=22;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=27 PL:GT:GQ 47,18,0:1/1:90 +chr11 10303263 . T C 8.64 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,17;MQ=18 PL:GT:GQ 41,51,0:1/1:99 +chr11 10420170 . T C 35 . DP=17;AF1=1;CI95=1,1;DP4=0,1,0,15;MQ=28;PV4=1,0.12,1,0.4 PL:GT:GQ 68,36,0:1/1:99 +chr11 10912169 . G A 99 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=49 PL:GT:GQ 155,18,0:1/1:90 +chr11 11315826 . T G 6.29 . DP=27;AF1=1;CI95=1,1;DP4=0,0,0,6;MQ=19 PL:GT:GQ 38,18,0:1/1:90 +chr11 11603859 . A C 22 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,9,0,6;MQ=34;PV4=1,9.5e-13,0.22,1 PL:GT:GQ 52,0,115:0/1:55 +chr11 11700034 . C T 33 . DP=11;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=30 PL:GT:GQ 66,27,0:1/1:99 +chr11 11822758 . G A 15.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,3;MQ=38;PV4=1,0.18,1,1 PL:GT:GQ 45,0,88:0/1:48 +chr11 11976636 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=24 PL:GT:GQ 54,9,0:1/1:63 +chr11 14380517 . C G 16.1 . DP=10;AF1=0.5;CI95=0.5,0.5;DP4=5,0,5,0;MQ=48;PV4=1,2.1e-05,0.13,1 PL:GT:GQ 46,0,113:0/1:49 +chr11 14419212 . A G 91.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=38 PL:GT:GQ 124,18,0:1/1:90 +chr11 14846792 . A G 55 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=19 PL:GT:GQ 88,33,0:1/1:99 +chr11 15494556 . C T 99 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=22,0,14,0;MQ=34;PV4=1,0.0071,1,1 PL:GT:GQ 146,0,159:0/1:99 +chr11 16262879 . A C 16.1 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=0,1,0,3;MQ=43;PV4=1,0.061,0.24,0.33 PL:GT:GQ 46,0,28:0/1:31 +chr11 21514947 . T C 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=41 PL:GT:GQ 57,12,0:1/1:72 +chr11 22532576 . C G 28 . DP=17;AF1=1;CI95=1,1;DP4=0,0,0,17;MQ=17 PL:GT:GQ 61,51,0:1/1:99 +chr11 23529238 . G T 4.29 . DP=13;AF1=0.5334;CI95=0.5,1;DP4=1,0,3,0;MQ=37;PV4=1,1,0.34,0.21 PL:GT:GQ 32,0,9:0/1:12 +chr11 24249554 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr11 24853167 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=51 PL:GT:GQ 73,6,0:1/1:49 +chr11 33353903 . T C 24.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=36 PL:GT:GQ 57,15,0:1/1:75 +chr11 35126569 . T C 24.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 57,12,0:1/1:72 +chr11 35132248 . C T 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr11 35155482 . T C 68 . DP=22;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=46 PL:GT:GQ 101,66,0:1/1:99 +chr11 52494088 . T C 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=37 PL:GT:GQ 140,27,0:1/1:99 +chr11 57899943 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr11 62261460 . G T 19.1 . DP=15;AF1=0.5;CI95=0.5,0.5;DP4=0,7,0,5;MQ=27;PV4=1,1.1e-06,1,1 PL:GT:GQ 49,0,58:0/1:51 +chr11 67456049 . C T 39.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=19 PL:GT:GQ 72,18,0:1/1:90 +chr11 68509708 . C G 3.65 . DP=9;AF1=0.7301;CI95=0.5,1;DP4=0,5,0,4;MQ=17;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr11 70115115 . T A 99 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=49 PL:GT:GQ 140,15,0:1/1:75 +chr11 72643951 . T C 70 . DP=23;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=39 PL:GT:GQ 103,66,0:1/1:99 +chr11 72647930 . G A 36 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=0,1,0,3;MQ=41;PV4=1,1,0.3,1 PL:GT:GQ 66,0,28:0/1:31 +chr11 73330148 . C T 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr11 81720893 . A G 5.83 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=19 PL:GT:GQ 37,12,0:1/1:72 +chr11 83813797 . A G 23.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 56,12,0:1/1:72 +chr11 85949488 . C A 54 . DP=17;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=37 PL:GT:GQ 87,42,0:1/1:99 +chr11 87634829 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=51 PL:GT:GQ 40,6,0:1/1:49 +chr11 90913093 . A T 35.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 67,6,0:1/1:49 +chr11 93793348 . G A 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=31 PL:GT:GQ 139,24,0:1/1:96 +chr11 100802294 . T C 16.6 . DP=21;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=35 PL:GT:GQ 49,12,0:1/1:72 +chr11 107455449 . C T 8.44 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=26 PL:GT:GQ 39,6,0:1/1:49 +chr11 111344355 . A G 69.5 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=43 PL:GT:GQ 102,12,0:1/1:72 +chr11 111611115 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr11 113050466 . G C 6.02 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=30 PL:GT:GQ 36,6,0:1/1:49 +chr11 114332544 . T C 3.54 . DP=17;AF1=0.4999;CI95=0.5,0.5;DP4=0,4,0,5;MQ=37;PV4=1,0.32,0.13,1 PL:GT:GQ 31,0,37:0/1:33 +chr11 114332549 . G A 3.54 . DP=17;AF1=0.4998;CI95=0.5,0.5;DP4=0,9,0,8;MQ=36;PV4=1,3.1e-10,0.088,1 PL:GT:GQ 31,0,127:0/1:34 +chr11 114843578 . G C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr11 115580279 . A G 99 . DP=15;AF1=1;CI95=1,1;DP4=0,0,15,0;MQ=48 PL:GT:GQ 190,45,0:1/1:99 +chr11 116434328 . G A 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 50,12,0:1/1:72 +chr11 125914161 . A G 20.8 . DP=7;AF1=0.95;CI95=0.5,1;DP4=3,0,4,0;MQ=38;PV4=1,0.074,1,1 PL:GT:GQ 49,0,0:1/1:10 +chr11 125917089 . C T 12.3 . DP=41;AF1=0.5;CI95=0.5,0.5;DP4=0,28,0,12;MQ=44;PV4=1,4.7e-25,1,1 PL:GT:GQ 42,0,167:0/1:45 +chr11 127194100 . A G 60 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=49 PL:GT:GQ 93,24,0:1/1:96 +chr12 70856 . G A 27.5 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 60,12,0:1/1:72 +chr12 153693 . T C 52.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=38 PL:GT:GQ 85,15,0:1/1:75 +chr12 924547 . C G 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 69,6,0:1/1:49 +chr12 1555916 . G A 7.18 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 39,15,0:1/1:75 +chr12 1919860 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr12 2283756 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=34 PL:GT:GQ 45,6,0:1/1:49 +chr12 2805983 . G C 12.7 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=35 PL:GT:GQ 45,12,0:1/1:72 +chr12 6088203 . T C 72.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=37 PL:GT:GQ 105,15,0:1/1:75 +chr12 7099460 . G C 10.8 . DP=6;AF1=0.8277;CI95=0.5,1;DP4=3,0,3,0;MQ=26;PV4=1,0.027,1,1 PL:GT:GQ 39,0,1:1/1:5 +chr12 7099464 . G A 13.3 . DP=6;AF1=0.9966;CI95=0.5,1;DP4=2,0,3,0;MQ=28;PV4=1,0.16,1,1 PL:GT:GQ 42,1,0:1/1:23 +chr12 7198516 . T G 4.61 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 34,6,0:1/1:49 +chr12 23331895 . C T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr12 28209020 . T G 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 47,15,0:1/1:75 +chr12 30074073 . C T 32.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 64,6,0:1/1:49 +chr12 30563452 . T C 25 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 57,9,0:1/1:63 +chr12 30563453 . A G 25 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=46 PL:GT:GQ 57,9,0:1/1:63 +chr12 30563464 . C A 78.8 . DP=8;AF1=1;CI95=0.5,1;DP4=0,2,0,5;MQ=34;PV4=1,0.29,1,1 PL:GT:GQ 110,6,0:1/1:49 +chr12 31505085 . G A 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr12 34041336 . G A 5.46 . DP=5;AF1=0.5;CI95=0.5,0.5;DP4=2,0,2,0;MQ=36;PV4=1,1,0.48,0.21 PL:GT:GQ 34,0,34:0/1:34 +chr12 49003648 . C G 42 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=39 PL:GT:GQ 75,24,0:1/1:96 +chr12 51280690 . G A 69 . DP=98;AF1=0.5;CI95=0.5,0.5;DP4=13,0,18,0;MQ=45;PV4=1,1,0.051,1 PL:GT:GQ 99,0,84:0/1:87 +chr12 69206633 . T C 17.1 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=17 PL:GT:GQ 50,33,0:1/1:99 +chr12 80417253 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr12 86633033 . C T 34 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=0,1,0,2;MQ=43;PV4=1,1,0.33,1 PL:GT:GQ 64,0,31:0/1:34 +chr12 98097274 . C T 47.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=31 PL:GT:GQ 80,15,0:1/1:75 +chr12 105269319 . C T 19 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=26 PL:GT:GQ 51,9,0:1/1:63 +chr12 109053425 . G A 9.53 . DP=8;AF1=0.5012;CI95=0.5,0.5;DP4=2,0,6,0;MQ=25;PV4=1,1,0.19,1 PL:GT:GQ 39,0,23:0/1:26 +chr12 111904540 . A G 3.41 . DP=65;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 32,6,0:1/1:49 +chr12 115038686 . T C 15.2 . DP=7;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=27 PL:GT:GQ 48,21,0:1/1:84 +chr12 115039419 . A G 4.11 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=30 PL:GT:GQ 34,9,0:1/1:63 +chr12 115103890 . G A 66 . DP=39;AF1=1;CI95=1,1;DP4=0,0,0,38;MQ=49 PL:GT:GQ 99,114,0:1/1:99 +chr12 115833830 . G A 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr12 116361873 . T G 6.34 . DP=5;AF1=0.7302;CI95=0.5,1;DP4=0,2,0,2;MQ=23;PV4=1,1,1,1 PL:GT:GQ 34,0,2:0/1:3 +chr12 123583527 . G A 14.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 46,9,0:1/1:63 +chr12 124115330 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=38 PL:GT:GQ 76,9,0:1/1:63 +chr12 125062296 . G A 41.8 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr12 126718106 . A G 8.76 . DP=50;AF1=0.5163;CI95=0.5,1;DP4=2,0,6,0;MQ=26;PV4=1,0.33,0.37,1 PL:GT:GQ 38,0,12:0/1:15 +chr12 133348311 . G A 24 . DP=18;AF1=0.5;CI95=0.5,0.5;DP4=14,0,3,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 54,0,118:0/1:57 +chr12 134494475 . C T 28 . DP=18;AF1=0.6671;CI95=0.5,1;DP4=8,0,10,0;MQ=18;PV4=1,1,1,1 PL:GT:GQ 57,0,3:0/1:5 +chr12 134831761 . C T 41.3 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=27 PL:GT:GQ 74,15,0:1/1:75 +chr12 134992770 . A C,T 84 . DP=47;AF1=1;CI95=1,1;DP4=0,0,26,0;MQ=29 PL:GT:GQ 117,72,114,0,44,114:1/1:99 +chr12 135261117 . G A 49.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 82,18,0:1/1:90 +chr12 135261144 . A G 99 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=46 PL:GT:GQ 155,18,0:1/1:90 +chr12 135460302 . G A 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,23,0;MQ=40 PL:GT:GQ 198,69,0:1/1:99 +chr12 135463758 . A G 83 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,16;MQ=26 PL:GT:GQ 116,48,0:1/1:99 +chr12 135523325 . G A 99 . DP=23;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=26 PL:GT:GQ 136,66,0:1/1:99 +chr12 135782401 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr12 135795472 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr13 18040027 . G C 42 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=33 PL:GT:GQ 74,9,0:1/1:63 +chr13 19494625 . G T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 73,6,0:1/1:49 +chr13 20121126 . A G 15.1 . DP=36;AF1=0.5;CI95=0.5,0.5;DP4=25,0,9,0;MQ=36;PV4=1,1,0.13,1 PL:GT:GQ 45,0,153:0/1:48 +chr13 21536703 . A G 9.31 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr13 23160035 . G T 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 33,6,0:1/1:49 +chr13 23476554 . C A 6.79 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=52 PL:GT:GQ 37,6,0:1/1:49 +chr13 26632967 . C G 32 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=34 PL:GT:GQ 65,27,0:1/1:99 +chr13 26790010 . T C 89.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=35 PL:GT:GQ 122,15,0:1/1:75 +chr13 36083571 . T C 43 . DP=84;AF1=1;CI95=1,1;DP4=1,0,37,0;MQ=16;PV4=1,1,1,0.3 PL:GT:GQ 76,99,0:1/1:99 +chr13 44432419 . C T 3.58 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=19 PL:GT:GQ 34,21,0:1/1:84 +chr13 46592359 . T C 16.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 48,6,0:1/1:49 +chr13 52764657 . A T 3.14 . DP=32;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=22 PL:GT:GQ 33,15,0:1/1:75 +chr13 53084193 . C T 9.11 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=0,1,0,2;MQ=29;PV4=1,1,1,1 PL:GT:GQ 38,2,0:1/1:37 +chr13 57763228 . C T 45 . DP=555;AF1=1;CI95=1,1;DP4=2,0,21,0;MQ=23;PV4=1,0.00021,1,0.3 PL:GT:GQ 78,45,0:1/1:99 +chr13 73857921 . G C 31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 63,9,0:1/1:63 +chr13 76718001 . G A 59 . DP=4;AF1=0.5004;CI95=0.5,0.5;DP4=1,0,3,0;MQ=45;PV4=1,1,0.12,1 PL:GT:GQ 89,0,28:0/1:31 +chr13 100912695 . A T 23 . DP=22;AF1=0.5;CI95=0.5,0.5;DP4=0,16,0,6;MQ=31;PV4=1,0.029,1,0.35 PL:GT:GQ 53,0,103:0/1:56 +chr13 101332001 . G C 21 . DP=23;AF1=1;CI95=1,1;DP4=0,0,23,0;MQ=21 PL:GT:GQ 54,69,0:1/1:99 +chr13 102637334 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr13 102895627 . C T 63 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=48 PL:GT:GQ 96,27,0:1/1:99 +chr13 103830322 . T C 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr13 112842448 . G A 39 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=27 PL:GT:GQ 72,27,0:1/1:99 +chr13 113310291 . C T 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=43 PL:GT:GQ 66,12,0:1/1:72 +chr13 114775162 . A G 80 . DP=17;AF1=1;CI95=1,1;DP4=0,0,17,0;MQ=21 PL:GT:GQ 113,51,0:1/1:99 +chr13 115267482 . A G 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr13 116068676 . C T 3.83 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=27 PL:GT:GQ 34,12,0:1/1:72 +chr13 116455918 . A G 33 . DP=29;AF1=0.5;CI95=0.5,0.5;DP4=13,0,15,0;MQ=42;PV4=1,1.8e-20,0.3,1 PL:GT:GQ 63,0,146:0/1:66 +chr13 116765012 . G A 30.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 62,6,0:1/1:49 +chr13 116779773 . C T 17.1 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=27,0,11,0;MQ=24;PV4=1,4.5e-35,1,1 PL:GT:GQ 47,0,106:0/1:50 +chr13 116779791 . C T 57 . DP=38;AF1=0.5;CI95=0.5,0.5;DP4=24,0,14,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 87,0,103:0/1:90 +chr14 20159250 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=39 PL:GT:GQ 43,9,0:1/1:63 +chr14 23510676 . T C 52 . DP=22;AF1=1;CI95=1,1;DP4=0,0,22,0;MQ=32 PL:GT:GQ 85,66,0:1/1:99 +chr14 24735256 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr14 29525577 . G A 21 . DP=10;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=16 PL:GT:GQ 54,27,0:1/1:99 +chr14 36186389 . C T 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=20 PL:GT:GQ 37,6,0:1/1:49 +chr14 36186394 . A G 6.79 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=20 PL:GT:GQ 37,6,0:1/1:49 +chr14 37440609 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr14 40432807 . A G 18.6 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=23 PL:GT:GQ 51,12,0:1/1:72 +chr14 59466268 . T C 15.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=25 PL:GT:GQ 47,9,0:1/1:63 +chr14 61368162 . G T 7.18 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=17 PL:GT:GQ 39,15,0:1/1:75 +chr14 65152922 . G A 92 . DP=33;AF1=0.5;CI95=0.5,0.5;DP4=0,18,0,15;MQ=36;PV4=1,0.059,0.35,1 PL:GT:GQ 122,0,144:0/1:99 +chr14 69749148 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=25 PL:GT:GQ 40,6,0:1/1:49 +chr14 74877658 . C T 45 . DP=48;AF1=1;CI95=1,1;DP4=0,1,0,12;MQ=36;PV4=1,0.02,1,0.39 PL:GT:GQ 78,28,0:1/1:99 +chr14 75546678 . C T 19.2 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=17 PL:GT:GQ 52,18,0:1/1:90 +chr14 76439185 . T C 67.1 . DP=7;AF1=0.505;CI95=0.5,0.5;DP4=0,1,0,6;MQ=33;PV4=1,1,0.056,0.29 PL:GT:GQ 97,0,17:0/1:20 +chr14 77313295 . T A 99 . DP=12;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=48 PL:GT:GQ 191,30,0:1/1:99 +chr14 77673422 . G A 11.5 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=24 PL:GT:GQ 44,18,0:1/1:90 +chr14 78646125 . T C 99 . DP=8;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=40 PL:GT:GQ 153,24,0:1/1:96 +chr14 91702449 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr14 91769842 . G A 63 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=47 PL:GT:GQ 95,9,0:1/1:63 +chr14 91775899 . C G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 73,6,0:1/1:49 +chr14 91775924 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr14 93482918 . A C 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr14 93665819 . C T 75 . DP=7;AF1=0.5002;CI95=0.5,0.5;DP4=0,3,0,4;MQ=42;PV4=1,1,1,1 PL:GT:GQ 105,0,31:0/1:34 +chr14 95422276 . A G 55.1 . DP=7;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=45 PL:GT:GQ 88,21,0:1/1:84 +chr14 95731986 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr14 96045464 . A G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=33 PL:GT:GQ 44,6,0:1/1:49 +chr14 97172020 . C T 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=51 PL:GT:GQ 100,9,0:1/1:63 +chr14 100515480 . A G 6.98 . DP=3;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=45;PV4=1,0.14,0.085,0.33 PL:GT:GQ 36,0,30:0/1:32 +chr14 100770214 . A T 8.69 . DP=20;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=16 PL:GT:GQ 41,21,0:1/1:84 +chr14 101258303 . G A 82 . DP=15;AF1=1;CI95=1,1;DP4=0,0,15,0;MQ=26 PL:GT:GQ 115,45,0:1/1:99 +chr14 101701492 . C G 66 . DP=10;AF1=1;CI95=1,1;DP4=0,0,10,0;MQ=49 PL:GT:GQ 99,30,0:1/1:99 +chr14 102113772 . T C 3.98 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=30 PL:GT:GQ 33,6,0:1/1:49 +chr14 102751431 . A C 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr14 103708033 . A G 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,0,12;MQ=27 PL:GT:GQ 141,36,0:1/1:99 +chr14 104744582 . G A 3.52 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 33,9,0:1/1:63 +chr14 105989100 . C T 3.14 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 33,15,0:1/1:75 +chr14 105989162 . C T 3.65 . DP=12;AF1=0.7301;CI95=0.5,1;DP4=0,6,0,6;MQ=15;PV4=1,1,1,1 PL:GT:GQ 30,0,2:0/1:3 +chr14 106234810 . G A 25.3 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=39 PL:GT:GQ 58,15,0:1/1:75 +chr14 106995572 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr14 107283057 . T C 5.5 . DP=8;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=20 PL:GT:GQ 37,21,0:1/1:84 +chr14 107285319 . T C 33 . DP=36;AF1=1;CI95=1,1;DP4=0,0,0,35;MQ=22 PL:GT:GQ 66,105,0:1/1:99 +chr14 107640449 . A G 11.8 . DP=7;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=36 PL:GT:GQ 44,12,0:1/1:72 +chr15 20082092 . T G 18.3 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=24 PL:GT:GQ 51,15,0:1/1:75 +chr15 22955884 . T C 67 . DP=12;AF1=1;CI95=1,1;DP4=0,0,12,0;MQ=48 PL:GT:GQ 100,36,0:1/1:99 +chr15 22971987 . A G 5.29 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=22 PL:GT:GQ 35,6,0:1/1:49 +chr15 23233324 . C A 47 . DP=16;AF1=1;CI95=1,1;DP4=0,0,14,0;MQ=31 PL:GT:GQ 80,42,0:1/1:99 +chr15 25175286 . C T 36.5 . DP=3;AF1=0.9998;CI95=0.5,1;DP4=1,0,2,0;MQ=42;PV4=1,1,1,1 PL:GT:GQ 66,2,0:1/1:37 +chr15 25385709 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=48 PL:GT:GQ 40,6,0:1/1:49 +chr15 27372396 . A G 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=40 PL:GT:GQ 76,9,0:1/1:63 +chr15 35998093 . C T 9.53 . DP=9;AF1=1;CI95=1,1;DP4=0,0,9,0;MQ=17 PL:GT:GQ 42,27,0:1/1:99 +chr15 36716538 . C G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr15 36793360 . G T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=42 PL:GT:GQ 76,9,0:1/1:63 +chr15 53783097 . A G 10.5 . DP=31;AF1=1;CI95=1,1;DP4=0,0,7,0;MQ=16 PL:GT:GQ 43,21,0:1/1:84 +chr15 54180175 . C T 10.4 . DP=7;AF1=0.5001;CI95=0.5,0.5;DP4=4,0,3,0;MQ=27;PV4=1,1.2e-05,1,1 PL:GT:GQ 40,0,32:0/1:34 +chr15 54939306 . C T 99 . DP=34;AF1=0.5;CI95=0.5,0.5;DP4=0,18,0,16;MQ=49;PV4=1,1,0.18,1 PL:GT:GQ 172,0,181:0/1:99 +chr15 59377916 . C T 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr15 59685961 . G C 68 . DP=11;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=36 PL:GT:GQ 101,33,0:1/1:99 +chr15 60306384 . A G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr15 60345642 . G C 14.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 46,6,0:1/1:49 +chr15 60367387 . G A 13.2 . DP=6;AF1=0.5001;CI95=0.5,0.5;DP4=3,0,3,0;MQ=34;PV4=1,0.098,0.24,1 PL:GT:GQ 43,0,35:0/1:37 +chr15 60367446 . C T 44 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 76,9,0:1/1:63 +chr15 61763755 . G A 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=45 PL:GT:GQ 100,9,0:1/1:63 +chr15 61831362 . C G 11.3 . DP=5;AF1=0.5;CI95=0.5,0.5;DP4=0,2,0,3;MQ=30;PV4=1,0.00077,0.47,1 PL:GT:GQ 41,0,42:0/1:41 +chr15 63978880 . G C 60 . DP=6;AF1=0.9999;CI95=0.5,1;DP4=2,0,4,0;MQ=35;PV4=1,1,1,1 PL:GT:GQ 90,3,0:1/1:41 +chr15 64342445 . A G 12.2 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=18 PL:GT:GQ 44,9,0:1/1:63 +chr15 65424859 . T C 11.3 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=21 PL:GT:GQ 44,30,0:1/1:99 +chr15 65603698 . C T 60 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 92,9,0:1/1:63 +chr15 67005078 . G A 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr15 71133512 . G C 22.3 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=25 PL:GT:GQ 55,15,0:1/1:75 +chr15 72619009 . A G 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr15 73272688 . C T 70.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=39 PL:GT:GQ 103,15,0:1/1:75 +chr15 73699335 . T A 99 . DP=9;AF1=1;CI95=1,1;DP4=0,0,0,9;MQ=45 PL:GT:GQ 175,27,0:1/1:99 +chr15 74513352 . C T 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,10;MQ=37 PL:GT:GQ 139,30,0:1/1:99 +chr15 75540536 . G A 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr15 75822537 . C A 17.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=23 PL:GT:GQ 50,15,0:1/1:75 +chr15 78554005 . T C 12 . DP=18;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=46 PL:GT:GQ 43,6,0:1/1:49 +chr15 80089369 . G A 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=28 PL:GT:GQ 40,6,0:1/1:49 +chr15 83089149 . C G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=33 PL:GT:GQ 40,6,0:1/1:49 +chr15 86839307 . T C 90.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=43 PL:GT:GQ 123,15,0:1/1:75 +chr15 89836258 . T C 99 . DP=10;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=39 PL:GT:GQ 141,24,0:1/1:96 +chr15 89837706 . G A 4.13 . DP=8;AF1=0.4998;CI95=0.5,0.5;DP4=0,4,0,4;MQ=30;PV4=1,1,0.25,1 PL:GT:GQ 32,0,59:0/1:35 +chr15 89857648 . T C 99 . DP=27;AF1=0.5;CI95=0.5,0.5;DP4=8,0,8,0;MQ=40;PV4=1,1,0.3,1 PL:GT:GQ 133,0,130:0/1:99 +chr15 89864228 . A C 32 . DP=4;AF1=0.5002;CI95=0.5,0.5;DP4=2,0,2,0;MQ=42;PV4=1,1,1,1 PL:GT:GQ 62,0,31:0/1:34 +chr15 91261235 . G A 7.8 . DP=4;AF1=0.5002;CI95=0.5,0.5;DP4=1,0,2,0;MQ=44;PV4=1,1,0.32,1 PL:GT:GQ 37,0,30:0/1:32 +chr16 256990 . A C 10.4 . DP=16;AF1=0.5008;CI95=0.5,0.5;DP4=4,0,3,0;MQ=23;PV4=1,0.34,1,1 PL:GT:GQ 40,0,25:0/1:28 +chr16 260794 . T C 3.01 . DP=19;AF1=0.4999;CI95=0.5,0.5;DP4=13,0,2,0;MQ=24;PV4=1,1,1,1 PL:GT:GQ 30,0,32:0/1:31 +chr16 419905 . A G 7.9 . DP=5;AF1=0.9966;CI95=0.5,1;DP4=0,2,0,3;MQ=22;PV4=1,1,1,1 PL:GT:GQ 36,1,0:1/1:23 +chr16 824086 . T C 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=48 PL:GT:GQ 54,9,0:1/1:63 +chr16 1085063 . C T 52 . DP=12;AF1=0.5;CI95=0.5,0.5;DP4=6,0,6,0;MQ=42;PV4=1,1,0.014,1 PL:GT:GQ 82,0,128:0/1:85 +chr16 1221305 . T C 54 . DP=7;AF1=0.5;CI95=0.5,0.5;DP4=0,3,0,3;MQ=40;PV4=1,1,1,1 PL:GT:GQ 84,0,60:0/1:63 +chr16 1411728 . A G 32.3 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=35 PL:GT:GQ 65,15,0:1/1:75 +chr16 1443197 . C G 64 . DP=26;AF1=1;CI95=1,1;DP4=0,0,25,0;MQ=36 PL:GT:GQ 97,75,0:1/1:99 +chr16 1478746 . A T 32 . DP=20;AF1=1;CI95=1,1;DP4=0,0,8,0;MQ=28 PL:GT:GQ 65,24,0:1/1:96 +chr16 1514438 . A C 45 . DP=49;AF1=1;CI95=1,1;DP4=0,0,48,0;MQ=26 PL:GT:GQ 78,144,0:1/1:99 +chr16 1601989 . T C 99 . DP=13;AF1=1;CI95=1,1;DP4=0,0,13,0;MQ=29 PL:GT:GQ 133,39,0:1/1:99 +chr16 2043883 . C T 30 . DP=33;AF1=1;CI95=1,1;DP4=0,0,0,33;MQ=14 PL:GT:GQ 63,99,0:1/1:99 +chr16 2137470 . A C 39 . DP=38;AF1=0.5016;CI95=0.5,0.5;DP4=4,0,6,0;MQ=34;PV4=1,0.02,1,1 PL:GT:GQ 69,0,22:0/1:25 +chr16 2537260 . A G 99 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=40 PL:GT:GQ 177,33,0:1/1:99 +chr16 2564737 . T C 99 . DP=25;AF1=1;CI95=1,1;DP4=0,0,0,22;MQ=41 PL:GT:GQ 199,66,0:1/1:99 +chr16 2612605 . A T 62.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=28 PL:GT:GQ 95,15,0:1/1:75 +chr16 2704518 . G A 41 . DP=48;AF1=0.5;CI95=0.5,0.5;DP4=0,17,0,12;MQ=48;PV4=1,1.9e-23,0.24,0.034 PL:GT:GQ 71,0,175:0/1:74 +chr16 3274307 . G T 68 . DP=39;AF1=0.5;CI95=0.5,0.5;DP4=0,30,0,8;MQ=37;PV4=1,1,1,1 PL:GT:GQ 98,0,138:0/1:99 +chr16 5467292 . G C 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 69,6,0:1/1:49 +chr16 10079145 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr16 11483702 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 40,6,0:1/1:49 +chr16 12038227 . A T 23 . DP=47;AF1=0.5;CI95=0.5,0.5;DP4=0,22,0,23;MQ=32;PV4=1,4.4e-66,0.47,0.028 PL:GT:GQ 53,0,135:0/1:56 +chr16 21336880 . G C 55 . DP=35;AF1=0.5;CI95=0.5,0.5;DP4=0,12,0,19;MQ=47;PV4=1,5.6e-21,1,1 PL:GT:GQ 85,0,121:0/1:88 +chr16 21980241 . C T 16.1 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=29 PL:GT:GQ 48,9,0:1/1:63 +chr16 23275383 . C G 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 44,6,0:1/1:49 +chr16 27546495 . G T 25 . DP=35;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=43 PL:GT:GQ 57,9,0:1/1:63 +chr16 27700399 . A T 17.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=17 PL:GT:GQ 50,12,0:1/1:72 +chr16 28021935 . A G 18.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=23 PL:GT:GQ 51,15,0:1/1:75 +chr16 29070016 . G T 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr16 29478618 . C T 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=42 PL:GT:GQ 43,9,0:1/1:63 +chr16 29718140 . C T 46.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=31 PL:GT:GQ 79,15,0:1/1:75 +chr16 30700759 . T C 17.1 . DP=14;AF1=1;CI95=1,1;DP4=0,0,0,14;MQ=14 PL:GT:GQ 50,42,0:1/1:99 +chr16 35139103 . A G 46.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=37 PL:GT:GQ 79,12,0:1/1:72 +chr16 35473348 . G A 3.83 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 34,12,0:1/1:72 +chr16 36213667 . A G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 73,6,0:1/1:49 +chr16 36705528 . G A 14.4 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=32 PL:GT:GQ 47,15,0:1/1:75 +chr16 43831353 . C T 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=42 PL:GT:GQ 102,12,0:1/1:72 +chr16 44715166 . A C 25 . DP=18;AF1=1;CI95=1,1;DP4=0,0,0,8;MQ=32 PL:GT:GQ 58,24,0:1/1:96 +chr16 44957661 . T C 7.03 . DP=23;AF1=1;CI95=1,1;DP4=0,0,0,7;MQ=18 PL:GT:GQ 39,21,0:1/1:84 +chr16 44958698 . C T 42.3 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=49 PL:GT:GQ 75,15,0:1/1:75 +chr16 44959163 . T C 33.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=48 PL:GT:GQ 66,12,0:1/1:72 +chr16 45167959 . C T 4.45 . DP=16;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=24 PL:GT:GQ 35,12,0:1/1:72 +chr16 50254956 . C T 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=36 PL:GT:GQ 45,6,0:1/1:49 +chr16 52383122 . A C 46.5 . DP=19;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=42 PL:GT:GQ 79,12,0:1/1:72 +chr16 55978159 . C T 10.7 . DP=20;AF1=0.5336;CI95=0.5,1;DP4=2,0,5,0;MQ=35;PV4=1,0.038,1,0.059 PL:GT:GQ 40,0,9:0/1:12 +chr16 61358878 . T A 15.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=32 PL:GT:GQ 47,6,0:1/1:49 +chr16 61392487 . G A 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 44,6,0:1/1:49 +chr16 61621603 . G T 6.59 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=22 PL:GT:GQ 38,12,0:1/1:72 +chr16 69120890 . G C 51.3 . DP=36;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=42 PL:GT:GQ 84,15,0:1/1:75 +chr16 70778219 . A G 21.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=39 PL:GT:GQ 53,6,0:1/1:49 +chr16 71899519 . T C 40 . DP=11;AF1=1;CI95=1,1;DP4=0,0,11,0;MQ=33 PL:GT:GQ 73,33,0:1/1:99 +chr16 72079251 . A G 11.3 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=41 PL:GT:GQ 43,9,0:1/1:63 +chr16 72093003 . G C 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr16 72672428 . A G 68 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=49 PL:GT:GQ 100,9,0:1/1:63 +chr16 72864515 . A G 13.9 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=35 PL:GT:GQ 45,6,0:1/1:49 +chr16 72890560 . G A 47.1 . DP=10;AF1=0.5064;CI95=0.5,0.5;DP4=0,1,0,7;MQ=49;PV4=1,0.0019,0.0033,1 PL:GT:GQ 77,0,16:0/1:19 +chr16 73048929 . A G 6.29 . DP=4;AF1=0.9966;CI95=0.5,1;DP4=1,0,2,0;MQ=27;PV4=1,1,1,0.33 PL:GT:GQ 34,1,0:1/1:23 +chr16 73177179 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr16 73191468 . C T 69.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=40 PL:GT:GQ 102,12,0:1/1:72 +chr16 73367439 . A C 7.41 . DP=36;AF1=1;CI95=0.5,1;DP4=0,2,0,13;MQ=26;PV4=1,1,0.027,1 PL:GT:GQ 37,4,0:1/1:45 +chr16 74259316 . C T 89.5 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=49 PL:GT:GQ 122,12,0:1/1:72 +chr16 75271450 . C G 6.99 . DP=15;AF1=0.5015;CI95=0.5,0.5;DP4=0,1,0,3;MQ=44;PV4=1,0.065,0.31,1 PL:GT:GQ 36,0,22:0/1:25 +chr16 76199870 . G A 26 . DP=14;AF1=0.5;CI95=0.5,0.5;DP4=8,0,6,0;MQ=47;PV4=1,1.2e-06,0.32,1 PL:GT:GQ 56,0,141:0/1:59 +chr16 77723692 . A G 89.5 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=50 PL:GT:GQ 122,12,0:1/1:72 +chr17 165875 . G A 40.8 . DP=11;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=42 PL:GT:GQ 72,6,0:1/1:49 +chr17 1443809 . C G 9.31 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=50 PL:GT:GQ 40,6,0:1/1:49 +chr17 1618253 . C T 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=39 PL:GT:GQ 54,9,0:1/1:63 +chr17 2815309 . T G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 40,6,0:1/1:49 +chr17 3537486 . T G 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=50 PL:GT:GQ 73,6,0:1/1:49 +chr17 3734367 . C A 23.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=36 PL:GT:GQ 56,12,0:1/1:72 +chr17 5634764 . T C 13 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=35 PL:GT:GQ 44,6,0:1/1:49 +chr17 6408090 . C G 3.54 . DP=5;AF1=0.4998;CI95=0.5,0.5;DP4=3,0,2,0;MQ=40;PV4=1,1,0.36,1 PL:GT:GQ 31,0,66:0/1:34 +chr17 7089723 . A G 9.31 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=47 PL:GT:GQ 40,6,0:1/1:49 +chr17 8731503 . G C 11.1 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 42,6,0:1/1:49 +chr17 9282935 . T C,G 24.5 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=40 PL:GT:GQ 57,12,61,0,3,61:1/1:72 +chr17 17284831 . T C 29 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,3;MQ=25 PL:GT:GQ 61,9,0:1/1:63 +chr17 18439515 . G A 4.11 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=25 PL:GT:GQ 34,9,0:1/1:63 +chr17 18602146 . C T 4.76 . DP=20;AF1=1;CI95=1,1;DP4=0,0,0,11;MQ=16 PL:GT:GQ 36,33,0:1/1:99 +chr17 19427888 . C T 57 . DP=104;AF1=0.5;CI95=0.5,0.5;DP4=45,0,29,0;MQ=39;PV4=1,2.2e-12,1,1 PL:GT:GQ 87,0,131:0/1:90 +chr17 19604159 . T C 9.31 . DP=5;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=45 PL:GT:GQ 40,6,0:1/1:49 +chr17 19610366 . C T 13 . DP=13;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=48 PL:GT:GQ 44,6,0:1/1:49 +chr17 20484706 . C G 51 . DP=35;AF1=0.5001;CI95=0.5,0.5;DP4=0,11,0,21;MQ=21;PV4=1,0.39,0.49,1 PL:GT:GQ 81,0,36:0/1:39 +chr17 20555720 . A G 26.3 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,5;MQ=28 PL:GT:GQ 59,15,0:1/1:75 +chr17 24328984 . A C 15.4 . DP=34;AF1=1;CI95=0.5,1;DP4=0,0,5,0;MQ=25 PL:GT:GQ 48,15,0:1/1:75 +chr17 26237090 . G A 41.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=44 PL:GT:GQ 73,6,0:1/1:49 +chr17 28394766 . C A 13.9 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=31 PL:GT:GQ 45,6,0:1/1:49 +chr17 31218277 . A G 3.62 . DP=38;AF1=0.5161;CI95=0.5,0.5;DP4=0,1,0,2;MQ=38;PV4=1,0.26,1,1 PL:GT:GQ 31,0,12:0/1:15 +chr17 31254021 . C T 15.1 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=35 PL:GT:GQ 47,9,0:1/1:63 +chr17 32516798 . G A 37.8 . DP=2;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=49 PL:GT:GQ 69,6,0:1/1:49 +chr17 32600253 . A G 16.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 49,12,0:1/1:72 +chr17 34255214 . G C 19.2 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=21 PL:GT:GQ 52,18,0:1/1:90 +chr17 34365900 . T C 93.1 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,6,0;MQ=38 PL:GT:GQ 126,18,0:1/1:90 +chr17 35380386 . A T 6.79 . DP=44;AF1=1;CI95=0.5,1;DP4=0,0,0,2;MQ=46 PL:GT:GQ 37,6,0:1/1:49 +chr17 41993344 . C T 64 . DP=41;AF1=1;CI95=1,1;DP4=0,0,0,41;MQ=16 PL:GT:GQ 97,123,0:1/1:99 +chr17 42128201 . A G 4.13 . DP=5;AF1=0.4998;CI95=0.5,0.5;DP4=0,2,0,2;MQ=52;PV4=1,0.0041,1,1 PL:GT:GQ 32,0,62:0/1:35 +chr17 42984490 . C A 56 . DP=33;AF1=0.5001;CI95=0.5,0.5;DP4=6,0,12,0;MQ=42;PV4=1,0.004,1,1 PL:GT:GQ 86,0,34:0/1:37 +chr17 43419457 . G A 99 . DP=16;AF1=1;CI95=1,1;DP4=0,0,0,14;MQ=45 PL:GT:GQ 185,42,0:1/1:99 +chr17 43421225 . A G 65.1 . DP=31;AF1=1;CI95=0.5,1;DP4=0,6,0,17;MQ=43;PV4=1,0.004,1,1 PL:GT:GQ 98,18,0:1/1:90 +chr17 45206897 . G A 22 . DP=3;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=47 PL:GT:GQ 54,9,0:1/1:63 +chr17 45381302 . T C 18.6 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,0,4;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr17 45530812 . C A 3.54 . DP=6;AF1=0.4998;CI95=0.5,0.5;DP4=0,3,0,2;MQ=40;PV4=1,1,0.37,1 PL:GT:GQ 31,0,58:0/1:34 +chr17 50242633 . G A 44 . DP=42;AF1=0.5;CI95=0.5,0.5;DP4=0,25,0,13;MQ=32;PV4=1,0.084,0.14,1 PL:GT:GQ 74,0,154:0/1:77 +chr17 51275317 . G A 14.9 . DP=10;AF1=1;CI95=0.5,1;DP4=0,0,2,0;MQ=31 PL:GT:GQ 46,6,0:1/1:49 +chr17 52325530 . C T 29 . DP=19;AF1=1;CI95=1,1;DP4=0,0,0,18;MQ=24 PL:GT:GQ 62,54,0:1/1:99 +chr17 52411748 . T G 18.6 . DP=4;AF1=1;CI95=0.5,1;DP4=0,0,4,0;MQ=25 PL:GT:GQ 51,12,0:1/1:72 +chr17 53190746 . C G 62.1 . DP=20;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=40 PL:GT:GQ 95,18,0:1/1:90 +chr17 58289916 . T C 18.2 . DP=8;AF1=1;CI95=0.5,1;DP4=0,0,0,6;MQ=22 PL:GT:GQ 51,18,0:1/1:90 +chr17 59796875 . C T 42 . DP=6;AF1=1;CI95=0.5,1;DP4=0,0,3,0;MQ=35 PL:GT:GQ 74,9,0:1/1:63 diff --git a/tests/tabix_data/vcf/README.txt b/tests/tabix_data/vcf/README.txt new file mode 100644 index 0000000..d6d26ec --- /dev/null +++ b/tests/tabix_data/vcf/README.txt @@ -0,0 +1,11 @@ +Edits that were necessary to parse these files: + +23.vcf: change +##INFO= +to +##INFO= + +similar changes in 16.vcf and 2.vcf + +13.vcf +Flag should not have a value. diff --git a/tests/tabix_data/vcf/issue85.vcf b/tests/tabix_data/vcf/issue85.vcf new file mode 100644 index 0000000..31695cc --- /dev/null +++ b/tests/tabix_data/vcf/issue85.vcf @@ -0,0 +1,26 @@ +##fileformat=VCFv4.1 +##samtoolsVersion=0.1.18 (r982:295) +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= diff --git a/tests/tabix_data/vcf/vcf_v42.vcf b/tests/tabix_data/vcf/vcf_v42.vcf new file mode 100644 index 0000000..11dbc0a --- /dev/null +++ b/tests/tabix_data/vcf/vcf_v42.vcf @@ -0,0 +1,25 @@ +##fileformat=VCFv4.2 +##fileDate=20090805 +##source=myImputationProgramV3.1 +##reference=file:///seq/references/1000GenomesPilot-NCBI36.fasta +##contig= +##phasing=partial +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FILTER= +##FILTER= +##FILTER= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT NA00001 NA00002 NA00003 +20 14370 rs6054257 G A 29 PASS NS=3;DP=14;AF=0.5;DB;H2 GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,. +20 17330 . T A 3 q10 NS=3;DP=11;AF=0.017 GT:GQ:DP:HQ 0|0:49:3:58,50 0|1:3:5:65,3 0/0:41:3 +20 1110696 rs6040355 A G,T 67 PASS NS=2;DP=10;AF=0.333,0.667;AA=T;DB GT:GQ:DP:HQ 1|2:21:6:23,27 2|1:2:0:18,2 2/2:35:4 +20 1230237 . T . 47 PASS NS=3;DP=13;AA=T GT:GQ:DP:HQ 0|0:54:7:56,60 0|0:48:4:51,51 0/0:61:2 +20 1234567 microsat1 GTC G,GTCT 50 PASS NS=3;DP=9;AA=G GT:GQ:DP 0/1:35:4 0/2:17:2 1/1:40:3 diff --git a/tests/tabix_test.py b/tests/tabix_test.py new file mode 100644 index 0000000..12ab4d2 --- /dev/null +++ b/tests/tabix_test.py @@ -0,0 +1,1245 @@ +#!/usr/bin/env python +'''unit testing code for pysam. + +Execute in the :file:`tests` directory as it requires the Makefile +and data files located there. +''' + +import sys +import os +import shutil +import gzip +import pysam +import unittest +import glob +import re +from TestUtils import checkBinaryEqual, checkGZBinaryEqual, check_url, \ + load_and_convert, make_data_files, TABIX_DATADIR, get_temp_filename + +IS_PYTHON3 = sys.version_info[0] >= 3 + + +def setUpModule(): + make_data_files(TABIX_DATADIR) + + +def myzip_open(infile, mode="r"): + '''open compressed file and decode.''' + + def _convert(f): + for l in f: + yield l.decode("ascii") + + if IS_PYTHON3: + if mode == "r": + return _convert(gzip.open(infile, "r")) + else: + return gzip.open(mode) + + +def splitToBytes(s): + '''split string and return list of bytes.''' + return [x.encode("ascii") for x in s.split("\t")] + + +class TestIndexing(unittest.TestCase): + filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + filename_idx = os.path.join(TABIX_DATADIR, "example.gtf.gz.tbi") + + def setUp(self): + + self.tmpfilename = get_temp_filename(suffix="gtf.gz") + shutil.copyfile(self.filename, self.tmpfilename) + + def test_indexing_with_preset_works(self): + '''test indexing via preset.''' + + pysam.tabix_index(self.tmpfilename, preset="gff") + self.assertTrue(checkGZBinaryEqual( + self.tmpfilename + ".tbi", self.filename_idx)) + + def test_indexing_to_custom_location_works(self): + '''test indexing a file with a non-default location.''' + + index_path = get_temp_filename(suffix='custom.tbi') + pysam.tabix_index(self.tmpfilename, preset="gff", + index=index_path, force=True) + self.assertTrue(checkGZBinaryEqual(index_path, self.filename_idx)) + os.unlink(index_path) + + def test_indexing_with_explict_columns_works(self): + '''test indexing via preset.''' + + pysam.tabix_index(self.tmpfilename, + seq_col=0, + start_col=3, + end_col=4, + line_skip=0, + zerobased=False) + self.assertTrue(checkGZBinaryEqual( + self.tmpfilename + ".tbi", self.filename_idx)) + + def test_indexing_with_lineskipping_works(self): + '''test indexing via preset and lineskip.''' + pysam.tabix_index(self.tmpfilename, + seq_col=0, + start_col=3, + end_col=4, + line_skip=1, + zerobased=False) + self.assertFalse(checkGZBinaryEqual( + self.tmpfilename + ".tbi", self.filename_idx)) + + def tearDown(self): + os.unlink(self.tmpfilename) + if os.path.exists(self.tmpfilename + ".tbi"): + os.unlink(self.tmpfilename + ".tbi") + + +class TestCompression(unittest.TestCase): + filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + filename_idx = os.path.join(TABIX_DATADIR, "example.gtf.gz.tbi") + preset = "gff" + + def setUp(self): + self.tmpfilename = get_temp_filename(suffix="gtf") + with gzip.open(self.filename, "rb") as infile, \ + open(self.tmpfilename, "wb") as outfile: + outfile.write(infile.read()) + + def testCompression(self): + '''see also issue 106''' + pysam.tabix_compress(self.tmpfilename, self.tmpfilename + ".gz") + checkBinaryEqual(self.tmpfilename, self.tmpfilename + ".gz") + + def testIndexPresetUncompressed(self): + '''test indexing via preset.''' + + pysam.tabix_index(self.tmpfilename, preset=self.preset) + # check if uncompressed file has been removed + self.assertEqual(os.path.exists(self.tmpfilename), False) + checkBinaryEqual(self.tmpfilename + ".gz", self.filename) + checkBinaryEqual(self.tmpfilename + ".gz.tbi", self.filename_idx) + + def testIndexPresetCompressed(self): + '''test indexing via preset.''' + + pysam.tabix_compress(self.tmpfilename, self.tmpfilename + ".gz") + pysam.tabix_index(self.tmpfilename + ".gz", preset=self.preset) + checkBinaryEqual(self.tmpfilename + ".gz", self.filename) + checkBinaryEqual(self.tmpfilename + ".gz.tbi", self.filename_idx) + + def tearDown(self): + if os.path.exists(self.tmpfilename): + os.unlink(self.tmpfilename) + if os.path.exists(self.tmpfilename + ".gz"): + os.unlink(self.tmpfilename + ".gz") + if os.path.exists(self.tmpfilename + ".gz.tbi"): + os.unlink(self.tmpfilename + ".gz.tbi") + + +class TestCompressionSam(TestCompression): + filename = os.path.join(TABIX_DATADIR, "example.sam.gz") + filename_index = os.path.join(TABIX_DATADIR, "example.sam.gz.tbi") + preset = "sam" + + +class TestCompressionBed(TestCompression): + filename = os.path.join(TABIX_DATADIR, "example.bed.gz") + filename_index = os.path.join(TABIX_DATADIR, "example.bed.gz.tbi") + preset = "bed" + + +class TestCompressionVCF(TestCompression): + filename = os.path.join(TABIX_DATADIR, "example.vcf.gz") + filename_index = os.path.join(TABIX_DATADIR, "example.vcf.gz.tbi") + preset = "vcf" + + +class IterationTest(unittest.TestCase): + + with_comments = False + + def setUp(self): + + lines = [] + with gzip.open(self.filename, "rb") as inf: + for line in inf: + line = line.decode('ascii') + if line.startswith("#"): + if not self.with_comments: + continue + lines.append(line) + + # creates index of contig, start, end, adds content without newline. + self.compare = [ + (x[0][0], int(x[0][3]), int(x[0][4]), x[1]) + for x in [(y.split("\t"), y[:-1]) for y in lines + if not y.startswith("#")]] + + self.comments = [x[:-1] for x in lines if x.startswith("#")] + + def getSubset(self, contig=None, start=None, end=None): + + if contig is None: + # all lines + subset = [x[3] for x in self.compare] + else: + if start is not None and end is None: + # until end of contig + subset = [x[3] + for x in self.compare if x[0] == contig and + x[2] > start] + elif start is None and end is not None: + # from start of contig + subset = [x[3] + for x in self.compare if x[0] == contig and + x[1] <= end] + elif start is None and end is None: + subset = [x[3] for x in self.compare if x[0] == contig] + else: + # all within interval + subset = [x[3] for x in self.compare if x[0] == contig and + min(x[2], end) - max(x[1], start) > 0] + + if self.with_comments: + subset.extend(self.comments) + + return subset + + def checkPairwise(self, result, ref): + '''check pairwise results. + ''' + result.sort() + ref.sort() + a = set(result) + b = set(ref) + + self.assertEqual( + len(result), len(ref), + "unexpected number of results: " + "result=%i, expected ref=%i, differences are %s: %s" + % (len(result), len(ref), + a.difference(b), + b.difference(a))) + + for x, d in enumerate(list(zip(result, ref))): + self.assertEqual( + d[0], d[1], + "unexpected results in pair %i:\n'%s', expected\n'%s'" % + (x, d[0], d[1])) + + +class TestGZFile(IterationTest): + + filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + with_comments = True + + def setUp(self): + + IterationTest.setUp(self) + self.gzfile = pysam.GZIterator(self.filename) + + def testAll(self): + result = list(self.gzfile) + ref = self.getSubset() + self.checkPairwise(result, ref) + + +class TestIterationWithoutComments(IterationTest): + + '''test iterating with TabixFile.fetch() when + there are no comments in the file.''' + + filename = os.path.join(TABIX_DATADIR, + "example.gtf.gz") + + def setUp(self): + IterationTest.setUp(self) + self.tabix = pysam.TabixFile(self.filename) + + def tearDown(self): + self.tabix.close() + + def testRegionStrings(self): + """test if access with various region strings + works""" + + self.assertEqual(218, len(list( + self.tabix.fetch("chr1")))) + self.assertEqual(218, len(list( + self.tabix.fetch("chr1", 1000)))) + self.assertEqual(218, len(list( + self.tabix.fetch("chr1", end=1000000)))) + self.assertEqual(218, len(list( + self.tabix.fetch("chr1", 1000, 1000000)))) + + def testAll(self): + result = list(self.tabix.fetch()) + ref = self.getSubset() + self.checkPairwise(result, ref) + + def testPerContig(self): + for contig in ("chr1", "chr2", "chr1", "chr2"): + result = list(self.tabix.fetch(contig)) + ref = self.getSubset(contig) + self.checkPairwise(result, ref) + + def testPerContigToEnd(self): + + end = None + for contig in ("chr1", "chr2", "chr1", "chr2"): + for start in range(0, 200000, 1000): + result = list(self.tabix.fetch(contig, start, end)) + ref = self.getSubset(contig, start, end) + self.checkPairwise(result, ref) + + def testPerContigFromStart(self): + + start = None + for contig in ("chr1", "chr2", "chr1", "chr2"): + for end in range(0, 200000, 1000): + result = list(self.tabix.fetch(contig, start, end)) + ref = self.getSubset(contig, start, end) + self.checkPairwise(result, ref) + + def testPerContig2(self): + + start, end = None, None + for contig in ("chr1", "chr2", "chr1", "chr2"): + result = list(self.tabix.fetch(contig, start, end)) + ref = self.getSubset(contig, start, end) + self.checkPairwise(result, ref) + + def testPerInterval(self): + + start, end = None, None + for contig in ("chr1", "chr2", "chr1", "chr2"): + for start in range(0, 200000, 2000): + for end in range(start, start + 2000, 500): + result = list(self.tabix.fetch(contig, start, end)) + ref = self.getSubset(contig, start, end) + self.checkPairwise(result, ref) + + def testInvalidIntervals(self): + + # invalid intervals (start > end) + self.assertRaises(ValueError, self.tabix.fetch, "chr1", 0, -10) + self.assertRaises(ValueError, self.tabix.fetch, "chr1", 200, 0) + + # out of range intervals + self.assertRaises(ValueError, self.tabix.fetch, "chr1", -10, 200) + self.assertRaises(ValueError, self.tabix.fetch, "chr1", -10, -20) + + # unknown chromosome + self.assertRaises(ValueError, self.tabix.fetch, "chrUn") + + # out of range access + # to be implemented + # self.assertRaises(IndexError, self.tabix.fetch, "chr1", 1000000, 2000000) + + # raise no error for empty intervals + self.tabix.fetch("chr1", 100, 100) + + def testGetContigs(self): + self.assertEqual(sorted(self.tabix.contigs), ["chr1", "chr2"]) + # check that contigs is read-only + self.assertRaises( + AttributeError, setattr, self.tabix, "contigs", ["chr1", "chr2"]) + + def testHeader(self): + ref = [] + with gzip.open(self.filename) as inf: + for x in inf: + x = x.decode("ascii") + if not x.startswith("#"): + break + ref.append(x[:-1]) + + header = list(self.tabix.header) + self.assertEqual(ref, header) + + def testReopening(self): + '''test repeated opening of the same file.''' + def func1(): + # opens any tabix file + with pysam.TabixFile(self.filename) as inf: + pass + + for i in range(1000): + func1() + + +class TestIterationWithComments(TestIterationWithoutComments): + + '''test iterating with TabixFile.fetch() when + there are comments in the file. + + Tests will create plenty of warnings on stderr. + ''' + + filename = os.path.join(TABIX_DATADIR, "example_comments.gtf.gz") + + def setUp(self): + TestIterationWithoutComments.setUp(self) + + +class TestIterators(unittest.TestCase): + filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + + iterator = pysam.tabix_generic_iterator + parser = pysam.asTuple + is_compressed = False + + def setUp(self): + + self.tabix = pysam.TabixFile(self.filename) + self.compare = load_and_convert(self.filename) + self.tmpfilename_uncompressed = 'tmp_TestIterators' + with gzip.open(self.filename, "rb") as infile, \ + open(self.tmpfilename_uncompressed, "wb") as outfile: + outfile.write(infile.read()) + + def tearDown(self): + self.tabix.close() + os.unlink(self.tmpfilename_uncompressed) + + def open(self): + + if self.is_compressed: + infile = gzip.open(self.filename) + else: + infile = open(self.tmpfilename_uncompressed) + return infile + + def testIteration(self): + + with self.open() as infile: + for x, r in enumerate(self.iterator(infile, self.parser())): + self.assertEqual(self.compare[x], list(r)) + self.assertEqual(len(self.compare[x]), len(r)) + + # test indexing + for c in range(0, len(r)): + self.assertEqual(self.compare[x][c], r[c]) + + # test slicing access + for c in range(0, len(r) - 1): + for cc in range(c + 1, len(r)): + self.assertEqual(self.compare[x][c:cc], + r[c:cc]) + + def testClosedFile(self): + '''test for error when iterating from closed file.''' + infile = self.open() + infile.close() + + # iterating from a closed file should raise a value error + self.assertRaises(ValueError, self.iterator, infile, self.parser()) + + def testClosedFileIteration(self): + '''test for error when iterating from file that has been closed''' + + infile = self.open() + + i = self.iterator(infile, self.parser()) + x = i.next() + infile.close() + # Not implemented + # self.assertRaises(ValueError, i.next) + + +class TestIteratorsGenericCompressed(TestIterators): + is_compressed = True + + +class TestIteratorsFileCompressed(TestIterators): + iterator = pysam.tabix_file_iterator + is_compressed = True + + +class TestIteratorsFileUncompressed(TestIterators): + iterator = pysam.tabix_file_iterator + is_compressed = False + + +class TestIterationMalformattedGTFFiles(unittest.TestCase): + + '''test reading from malformatted gtf files.''' + + iterator = pysam.tabix_generic_iterator + parser = pysam.asGTF + + def testGTFTooManyFields(self): + + with gzip.open(os.path.join( + TABIX_DATADIR, + "gtf_toomany_fields.gtf.gz")) as infile: + iterator = self.iterator( + infile, + parser=self.parser()) + self.assertRaises(ValueError, iterator.next) + + def testGTFTooFewFields(self): + + with gzip.open(os.path.join( + TABIX_DATADIR, + "gtf_toofew_fields.gtf.gz")) as infile: + iterator = self.iterator( + infile, + parser=self.parser()) + self.assertRaises(ValueError, iterator.next) + + +class TestBed(unittest.TestCase): + filename = os.path.join(TABIX_DATADIR, "example.bed.gz") + + def setUp(self): + + self.tabix = pysam.TabixFile(self.filename) + self.compare = load_and_convert(self.filename) + + def tearDown(self): + self.tabix.close() + + def testRead(self): + + for x, r in enumerate(self.tabix.fetch(parser=pysam.asBed())): + c = self.compare[x] + self.assertEqual(len(c), len(r)) + self.assertEqual(c, str(r).split("\t")) + self.assertEqual(c[0], r.contig) + self.assertEqual(int(c[1]), r.start) + self.assertEqual(int(c[2]), r.end) + self.assertEqual(list(c), list(r)) + self.assertEqual("\t".join(map(str, c)), + str(r)) + + def testWrite(self): + + for x, r in enumerate(self.tabix.fetch(parser=pysam.asBed())): + c = self.compare[x] + self.assertEqual(c, str(r).split("\t")) + self.assertEqual(list(c), list(r)) + + r.contig = "test" + self.assertEqual("test", r.contig) + self.assertEqual("test", r[0]) + + r.start += 1 + self.assertEqual(int(c[1]) + 1, r.start) + self.assertEqual(str(int(c[1]) + 1), r[1]) + + r.end += 1 + self.assertEqual(int(c[2]) + 1, r.end) + self.assertEqual(str(int(c[2]) + 1), r[2]) + + +class TestVCF(unittest.TestCase): + + filename = os.path.join(TABIX_DATADIR, "example.vcf40") + + def setUp(self): + self.tmpfilename = get_temp_filename(suffix="vcf") + shutil.copyfile(self.filename, self.tmpfilename) + pysam.tabix_index(self.tmpfilename, preset="vcf") + + def tearDown(self): + os.unlink(self.tmpfilename + ".gz") + if os.path.exists(self.tmpfilename + ".gz.tbi"): + os.unlink(self.tmpfilename + ".gz.tbi") + + +if IS_PYTHON3: + class TestUnicode(unittest.TestCase): + + '''test reading from a file with non-ascii characters.''' + + filename = os.path.join(TABIX_DATADIR, "example_unicode.vcf") + + def setUp(self): + self.tmpfilename = get_temp_filename(suffix="vcf") + shutil.copyfile(self.filename, self.tmpfilename) + pysam.tabix_index(self.tmpfilename, preset="vcf") + + def tearDown(self): + os.unlink(self.tmpfilename + ".gz") + if os.path.exists(self.tmpfilename + ".gz.tbi"): + os.unlink(self.tmpfilename + ".gz.tbi") + + def testFromTabix(self): + + # use ascii encoding - should raise error + with pysam.TabixFile( + self.tmpfilename + ".gz", encoding="ascii") as t: + results = list(t.fetch(parser=pysam.asVCF())) + self.assertRaises(UnicodeDecodeError, + getattr, results[1], "id") + + with pysam.TabixFile( + self.tmpfilename + ".gz", encoding="utf-8") as t: + results = list(t.fetch(parser=pysam.asVCF())) + self.assertEqual(getattr(results[1], "id"), u"Rene\xe9") + + def testFromVCF(self): + self.vcf = pysam.VCF() + self.assertRaises( + UnicodeDecodeError, + self.vcf.connect, + self.tmpfilename + ".gz", + "ascii") + self.vcf.connect(self.tmpfilename + ".gz", encoding="utf-8") + v = self.vcf.getsamples()[0] + + +class TestVCFFromTabix(TestVCF): + + columns = ("contig", "pos", "id", + "ref", "alt", "qual", + "filter", "info", "format") + + def setUp(self): + + TestVCF.setUp(self) + + self.tabix = pysam.TabixFile(self.tmpfilename + ".gz") + self.compare = load_and_convert(self.filename) + + def tearDown(self): + self.tabix.close() + TestVCF.tearDown(self) + + def testRead(self): + + ncolumns = len(self.columns) + + for x, r in enumerate(self.tabix.fetch(parser=pysam.asVCF())): + c = self.compare[x] + for y, field in enumerate(self.columns): + # it is ok to have a missing format column + if y == 8 and y == len(c): + continue + if field == "pos": + self.assertEqual(int(c[y]) - 1, getattr(r, field)) + self.assertEqual(int(c[y]) - 1, r.pos) + else: + self.assertEqual(c[y], getattr(r, field), + "mismatch in field %s: %s != %s" % + (field, c[y], getattr(r, field))) + if len(c) == 8: + self.assertEqual(0, len(r)) + else: + self.assertEqual(len(c), len(r) + ncolumns) + + for y in range(len(c) - ncolumns): + self.assertEqual(c[ncolumns + y], r[y]) + self.assertEqual("\t".join(map(str, c)), + str(r)) + + def testWrite(self): + + ncolumns = len(self.columns) + + for x, r in enumerate(self.tabix.fetch(parser=pysam.asVCF())): + c = self.compare[x] + # check unmodified string + cmp_string = str(r) + ref_string = "\t".join([x for x in c]) + + self.assertEqual(ref_string, cmp_string) + + # set fields and compare field-wise + for y, field in enumerate(self.columns): + # it is ok to have a missing format column + if y == 8 and y == len(c): + continue + if field == "pos": + rpos = getattr(r, field) + self.assertEqual(int(c[y]) - 1, rpos) + self.assertEqual(int(c[y]) - 1, r.pos) + # increment pos by 1 + setattr(r, field, rpos + 1) + self.assertEqual(getattr(r, field), rpos + 1) + c[y] = str(int(c[y]) + 1) + else: + setattr(r, field, "test_%i" % y) + c[y] = "test_%i" % y + self.assertEqual(c[y], getattr(r, field), + "mismatch in field %s: %s != %s" % + (field, c[y], getattr(r, field))) + + if len(c) == 8: + self.assertEqual(0, len(r)) + else: + self.assertEqual(len(c), len(r) + ncolumns) + + for y in range(len(c) - ncolumns): + c[ncolumns + y] = "test_%i" % y + r[y] = "test_%i" % y + self.assertEqual(c[ncolumns + y], r[y]) + + +class TestVCFFromVCF(TestVCF): + + columns = ("chrom", "pos", "id", + "ref", "alt", "qual", + "filter", "info", "format") + + # tests failing while parsing + fail_on_parsing = ( + (5, "Flag fields should not have a value"), + (9, "aouao"), + (12, "Error BAD_NUMBER_OF_PARAMETERS"), + (13, "aoeu"), + (18, "Error BAD_NUMBER_OF_PARAMETERS"), + (24, "Error HEADING_NOT_SEPARATED_BY_TABS")) + + # tests failing on opening + fail_on_opening = ((24, "Error HEADING_NOT_SEPARATED_BY_TABS"), + ) + + fail_on_samples = [] + + check_samples = False + coordinate_offset = 1 + + # value returned for missing values + missing_value = "." + missing_quality = -1 + + def setUp(self): + + TestVCF.setUp(self) + + self.vcf = pysam.VCF() + self.compare = load_and_convert(self.filename, encode=False) + + def tearDown(self): + TestVCF.tearDown(self) + self.vcf.close() + + def open_vcf(self, fn): + return self.vcf.connect(fn) + + def get_failure_stage(self): + + fn = os.path.basename(self.filename) + for x, msg in self.fail_on_opening: + if "{}.vcf".format(x) == fn: + return "opening" + + for x, msg in self.fail_on_parsing: + if "{}.vcf".format(x) == fn: + return "parsing" + + for x, msg in self.fail_on_samples: + if "{}.vcf".format(x) == fn: + return "samples" + + return None + + def testConnecting(self): + + if self.get_failure_stage() == "opening": + self.assertRaises(ValueError, + self.open_vcf, + self.tmpfilename + ".gz") + else: + self.open_vcf(self.tmpfilename + ".gz") + + def get_iterator(self): + + with open(self.filename) as f: + fn = os.path.basename(self.filename) + return list(self.vcf.parse(f)) + + def get_field_value(self, record, field): + return record[field] + + def sample2value(self, r, v): + return r, v + + def alt2value(self, r, v): + if r == ".": + return [], v + else: + return r.split(","), list(v) + + def filter2value(self, r, v): + if r == "PASS": + return [], v + elif r == ".": + return [], v + else: + return r.split(";"), v + + def testParsing(self): + + if self.get_failure_stage() in ("opening", "parsing"): + return + + itr = self.get_iterator() + if itr is None: + return + + fn = os.path.basename(self.filename) + + check_samples = self.check_samples + for vcf_code, msg in self.fail_on_samples: + if "%i.vcf" % vcf_code == fn: + check_samples = False + + for x, r in enumerate(itr): + c = self.compare[x] + for y, field in enumerate(self.columns): + # it is ok to have a missing format column + if y == 8 and y == len(c): + continue + + val = self.get_field_value(r, field) + if field == "pos": + self.assertEqual(int(c[y]) - self.coordinate_offset, + val) + elif field == "alt" or field == "alts": + cc, vv = self.alt2value(c[y], val) + if cc != vv: + # import pdb; pdb.set_trace() + pass + self.assertEqual( + cc, vv, + "mismatch in field %s: expected %s, got %s" % + (field, cc, vv)) + + elif field == "filter": + cc, vv = self.filter2value(c[y], val) + self.assertEqual( + cc, vv, + "mismatch in field %s: expected %s, got %s" % + (field, cc, vv)) + + elif field == "info": + # tests for info field not implemented + pass + + elif field == "qual" and c[y] == ".": + self.assertEqual( + self.missing_quality, val, + "mismatch in field %s: expected %s, got %s" % + (field, c[y], val)) + + elif field == "format": + # format field converted to list + self.assertEqual( + c[y].split(":"), list(val), + "mismatch in field %s: expected %s, got %s" % + (field, c[y], val)) + + elif type(val) in (int, float): + if c[y] == ".": + self.assertEqual( + None, val, + "mismatch in field %s: expected %s, got %s" % + (field, c[y], val)) + else: + self.assertAlmostEqual( + float(c[y]), float(val), 2, + "mismatch in field %s: expected %s, got %s" % + (field, c[y], val)) + else: + if c[y] == ".": + ref_val = self.missing_value + else: + ref_val = c[y] + self.assertEqual( + ref_val, val, + "mismatch in field %s: expected %s(%s), got %s(%s)" % + (field, ref_val, type(ref_val), val, type(val))) + # parse samples + if check_samples: + if len(c) == 8: + for x, s in enumerate(r.samples): + self.assertEqual( + [], r.samples[s].values(), + "mismatch in sample {}: " + "expected [], got {}, src={}, line={}".format( + s, r.samples[s].values(), + r.samples[s].items(), r)) + else: + for x, s in enumerate(r.samples): + ref, comp = self.sample2value( + c[9 + x], + r.samples[s]) + self.compare_samples(ref, comp, s, r) + + def compare_samples(self, ref, comp, s, r): + + if ref != comp: + + # check if GT not at start, not VCF conform and + # not supported by cbcf.pyx + k = r.format.keys() + if "GT" in k and k[0] != "GT": + return + + # perform an element-wise checto work around rounding differences + for a, b in zip(re.split("[:,;]", ref), + re.split("[:,;]", comp)): + is_float = True + try: + a = float(a) + b = float(b) + except ValueError: + is_float = False + + if is_float: + self.assertAlmostEqual( + a, b, 2, + "mismatch in sample {}: " + "expected {}, got {}, src={}, line={}" + .format( + s, ref, comp, + r.samples[s].items(), r)) + else: + self.assertEqual( + a, b, + "mismatch in sample {}: " + "expected {}, got {}, src={}, line={}" + .format( + s, ref, comp, + r.samples[s].items(), r)) + + +############################################################################ +# create a test class for each example vcf file. +# Two samples are created - +# 1. Testing pysam/tabix access +# 2. Testing the VCF class +vcf_files = glob.glob(os.path.join(TABIX_DATADIR, "vcf", "*.vcf")) + +for vcf_file in vcf_files: + n = "VCFFromTabixTest_%s" % os.path.basename(vcf_file[:-4]) + globals()[n] = type(n, (TestVCFFromTabix,), dict(filename=vcf_file,)) + n = "VCFFromVCFTest_%s" % os.path.basename(vcf_file[:-4]) + globals()[n] = type(n, (TestVCFFromVCF,), dict(filename=vcf_file,)) + + +class TestVCFFromVariantFile(TestVCFFromVCF): + + columns = ("chrom", "pos", "id", + "ref", "alts", "qual", + "filter", "info", "format") + + fail_on_parsing = [ + (24, 'Could not parse the "#CHROM.." line'), + ("issue85", "empty VCF"), + ] + fail_on_opening = [ + (24, 'Could not parse the "#CHROM.." line'), + ("issue85", "empty VCF"), + ] + coordinate_offset = 0 + check_samples = True + fail_on_samples = [ + (9, "PL field not defined. Expected to be scalar, but is array"), + (12, "PL field not defined. Expected to be scalar, but is array"), + (18, "PL field not defined. Expected to be scalar, but is array"), + ] + + # value returned for missing values + missing_value = None + missing_quality = None + + vcf = None + + def filter2value(self, r, v): + if r == "PASS": + return ["PASS"], list(v) + elif r == ".": + return [], list(v) + else: + return r.split(";"), list(v) + + def alt2value(self, r, v): + if r == ".": + return None, v + else: + return r.split(","), list(v) + + def sample2value(self, r, smp): + + def convert_field(f): + if f is None: + return "." + elif isinstance(f, tuple): + return ",".join(map(convert_field, f)) + else: + return str(f) + + v = smp.values() + + if 'GT' in smp: + alleles = [ + str(a) if a is not None else '.' for a in smp.allele_indices] + v[0] = '/|'[smp.phased].join(alleles) + + comp = ":".join(map(convert_field, v)) + + if comp.endswith(":."): + comp = comp[:-2] + + return r, comp + + def setUp(self): + TestVCF.setUp(self) + self.compare = load_and_convert(self.filename, encode=False) + + def tearDown(self): + if self.vcf: + self.vcf.close() + self.vcf = None + TestVCF.tearDown(self) + + def get_iterator(self): + self.vcf = pysam.VariantFile(self.filename) + return self.vcf.fetch() + + def get_field_value(self, record, field): + return getattr(record, field) + + def open_vcf(self, fn): + with pysam.VariantFile(fn) as inf: + pass + + +for vcf_file in vcf_files: + p = os.path.basename(vcf_file[:-4]) + n = "TestVCFFromVariantFile_%s" % p + globals()[n] = type(n, (TestVCFFromVariantFile,), dict(filename=vcf_file,)) + + +class TestRemoteFileHTTP(unittest.TestCase): + + url = "http://genserv.anat.ox.ac.uk/downloads/pysam/test/example.gtf.gz" + region = "chr1:1-1000" + local = os.path.join(TABIX_DATADIR, "example.gtf.gz") + + def setUp(self): + if not getattr(pysam.config, "HAVE_LIBCURL", 0) or not check_url(self.url): + self.remote_file = None + else: + self.remote_file = pysam.TabixFile(self.url, "r") + + self.local_file = pysam.TabixFile(self.local, "r") + + def tearDown(self): + if self.remote_file is None: + return + + self.remote_file.close() + self.local_file.close() + + def testFetchAll(self): + if self.remote_file is None: + return + + remote_result = list(self.remote_file.fetch()) + local_result = list(self.local_file.fetch()) + + self.assertEqual(len(remote_result), len(local_result)) + for x, y in zip(remote_result, local_result): + self.assertEqual(x, y) + + def testHeader(self): + if self.remote_file is None: + return + + self.assertEqual(list(self.local_file.header), []) + + +class TestRemoteFileHTTPWithHeader(TestRemoteFileHTTP): + + url = "http://genserv.anat.ox.ac.uk/downloads/pysam/test/example_comments.gtf.gz" + region = "chr1:1-1000" + local = os.path.join(TABIX_DATADIR, "example_comments.gtf.gz") + + def setUp(self): + if not getattr(pysam.config, "HAVE_LIBCURL", 0) or not check_url(self.url): + self.remote_file = None + else: + self.remote_file = pysam.TabixFile(self.url, "r") + self.local_file = pysam.TabixFile(self.local, "r") + + def testHeader(self): + if self.remote_file is None: + return + + self.assertEqual(list(self.local_file.header), ["# comment at start"]) + self.assertEqual(list(self.local_file.header), self.remote_file.header) + + +class TestIndexArgument(unittest.TestCase): + + filename_src = os.path.join(TABIX_DATADIR, "example.vcf.gz") + filename_dst = "tmp_example.vcf.gz" + index_src = os.path.join(TABIX_DATADIR, "example.vcf.gz.tbi") + index_dst = "tmp_index_example.vcf.gz.tbi" + index_dst_dat = "tmp_index_example.vcf.gz.tbi.dat" + preset = "vcf" + + def testFetchAll(self): + shutil.copyfile(self.filename_src, self.filename_dst) + shutil.copyfile(self.index_src, self.index_dst) + + with pysam.TabixFile( + self.filename_src, "r", index=self.index_src) as same_basename_file: + same_basename_results = list(same_basename_file.fetch()) + + with pysam.TabixFile( + self.filename_dst, "r", index=self.index_dst) as diff_index_file: + diff_index_result = list(diff_index_file.fetch()) + + self.assertEqual(len(same_basename_results), len(diff_index_result)) + for x, y in zip(same_basename_results, diff_index_result): + self.assertEqual(x, y) + + os.unlink(self.filename_dst) + os.unlink(self.index_dst) + + def testLoadIndexWithoutTbiExtension(self): + shutil.copyfile(self.filename_src, self.filename_dst) + shutil.copyfile(self.index_src, self.index_dst_dat) + + with pysam.TabixFile( + self.filename_src, "r", index=self.index_src) as same_basename_file: + same_basename_results = list(same_basename_file.fetch()) + + with pysam.TabixFile( + self.filename_dst, "r", index=self.index_dst_dat) as diff_index_file: + diff_index_result = list(diff_index_file.fetch()) + + self.assertEqual(len(same_basename_results), len(diff_index_result)) + for x, y in zip(same_basename_results, diff_index_result): + self.assertEqual(x, y) + + os.unlink(self.filename_dst) + os.unlink(self.index_dst_dat) + + +def _TestMultipleIteratorsHelper(filename, multiple_iterators): + '''open file within scope, return iterator.''' + + tabix = pysam.TabixFile(filename) + iterator = tabix.fetch(parser=pysam.asGTF(), + multiple_iterators=multiple_iterators) + tabix.close() + return iterator + + +class TestBackwardsCompatibility(unittest.TestCase): + """check if error is raised if a tabix file from an + old version is accessed from pysam""" + + def check(self, filename, raises=None): + with pysam.TabixFile(filename) as tf: + ref = load_and_convert(filename) + if raises is None: + self.assertEqual(len(list(tf.fetch())), len(ref)) + else: + self.assertRaises(raises, tf.fetch) + + def testVCF0v23(self): + self.check(os.path.join(TABIX_DATADIR, "example_0v23.vcf.gz"), + ValueError) + + def testBED0v23(self): + self.check(os.path.join(TABIX_DATADIR, "example_0v23.bed.gz"), + ValueError) + + def testVCF0v26(self): + self.check(os.path.join(TABIX_DATADIR, "example_0v26.vcf.gz"), + ValueError) + + def testBED0v26(self): + self.check(os.path.join(TABIX_DATADIR, "example_0v26.bed.gz"), + ValueError) + + def testVCF(self): + self.check(os.path.join(TABIX_DATADIR, "example.vcf.gz")) + + def testBED(self): + self.check(os.path.join(TABIX_DATADIR, "example.bed.gz")) + + def testEmpty(self): + self.check(os.path.join(TABIX_DATADIR, "empty.bed.gz")) + + +class TestMultipleIterators(unittest.TestCase): + + filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + + def testJoinedIterators(self): + + # two iterators working on the same file + with pysam.TabixFile(self.filename) as tabix: + a = tabix.fetch(parser=pysam.asGTF()).next() + b = tabix.fetch(parser=pysam.asGTF()).next() + # the first two lines differ only by the feature field + self.assertEqual(a.feature, "UTR") + self.assertEqual(b.feature, "exon") + self.assertEqual(re.sub("UTR", "", str(a)), + re.sub("exon", "", str(b))) + + def testDisjointIterators(self): + # two iterators working on the same file + with pysam.TabixFile(self.filename) as tabix: + a = tabix.fetch(parser=pysam.asGTF(), + multiple_iterators=True).next() + b = tabix.fetch(parser=pysam.asGTF(), + multiple_iterators=True).next() + # both iterators are at top of file + self.assertEqual(str(a), str(b)) + + def testScope(self): + # technically it does not really test if the scope is correct + i = _TestMultipleIteratorsHelper(self.filename, + multiple_iterators=True) + self.assertTrue(i.next()) + i = _TestMultipleIteratorsHelper(self.filename, + multiple_iterators=False) + self.assertRaises(IOError, i.next) + + def testDoubleFetch(self): + + with pysam.TabixFile(self.filename) as f: + + for a, b in zip(f.fetch(multiple_iterators=True), + f.fetch(multiple_iterators=True)): + self.assertEqual(str(a), str(b)) + + +class TestContextManager(unittest.TestCase): + + filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + + def testManager(self): + + with pysam.TabixFile(self.filename) as tabixfile: + tabixfile.fetch() + self.assertEqual(tabixfile.closed, True) + + +class TestMultithreadTabixFile(unittest.TestCase): + + filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + + def testMultithreadEqualsSinglethread(self): + with pysam.TabixFile(self.filename) as tabixfile: + single = [r for r in tabixfile.fetch()] + with pysam.TabixFile(self.filename, threads=2) as tabixfile: + multi = [r for r in tabixfile.fetch()] + for r1, r2 in zip(single, multi): + assert str(r1) == str(r2) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/tabixproxies_test.py b/tests/tabixproxies_test.py new file mode 100644 index 0000000..09cb210 --- /dev/null +++ b/tests/tabixproxies_test.py @@ -0,0 +1,398 @@ +import unittest +import pysam +import os +import re +import copy +import gzip +from TestUtils import load_and_convert, make_data_files, TABIX_DATADIR, IS_PYTHON3 + + +def setUpModule(): + make_data_files(TABIX_DATADIR) + + +@unittest.skipUnless(IS_PYTHON3, "Requires Python 3 Extended Iterable Unpacking") +class TestBED(unittest.TestCase): + + filename = os.path.join(TABIX_DATADIR, "fivecolumns.bed.gz") + + def setUp(self): + self.tabix = pysam.TabixFile(self.filename) + + def tearDown(self): + self.tabix.close() + + def testAssignmentToTargetList(self): + # TODO When we drop Python 2, remove exec() & my and simplify these + my = {} + for row in self.tabix.fetch(parser=pysam.asTuple()): + my['row'] = row + + # Test that *others gets the right columns... + exec('contig, start, end, *others = row', globals(), my) + self.assertEqual(3 + len(my['others']), len(row)) + + # ...and that a TupleProxy can be assigned from more than once + exec('contig, *others = row', globals(), my) + self.assertEqual(1 + len(my['others']), len(row)) + + +class TestParser(unittest.TestCase): + + filename = os.path.join(TABIX_DATADIR, "example.gtf.gz") + + def setUp(self): + + self.tabix = pysam.TabixFile(self.filename) + self.compare = load_and_convert(self.filename) + + def tearDown(self): + self.tabix.close() + + def testRead(self): + + for x, r in enumerate(self.tabix.fetch(parser=pysam.asTuple())): + c = self.compare[x] + self.assertEqual(c, list(r)) + self.assertEqual(len(c), len(r)) + + # test indexing + for y in range(0, len(r)): + self.assertEqual(c[y], r[y]) + + # test slicing access + for y in range(0, len(r) - 1): + for cc in range(y + 1, len(r)): + self.assertEqual(c[y:cc], + r[y:cc]) + self.assertEqual("\t".join(map(str, c)), + str(r)) + + @unittest.skipUnless(IS_PYTHON3, "Requires Python 3 Extended Iterable Unpacking") + def testAssignmentToTargetList(self): + for x, r in enumerate(self.tabix.fetch(parser=pysam.asTuple())): + my = { 'r': r } + exec('col1, col2, *others, colN = r', globals(), my) + self.assertEqual(2 + len(my['others']) + 1, len(r)) + + def testWrite(self): + + for x, r in enumerate(self.tabix.fetch(parser=pysam.asTuple())): + self.assertEqual(self.compare[x], list(r)) + c = list(r) + for y in range(len(r)): + r[y] = "test_%05i" % y + c[y] = "test_%05i" % y + self.assertEqual([x for x in c], list(r)) + self.assertEqual("\t".join(c), str(r)) + # check second assignment + for y in range(len(r)): + r[y] = "test_%05i" % y + self.assertEqual([x for x in c], list(r)) + self.assertEqual("\t".join(c), str(r)) + + def testUnset(self): + for x, r in enumerate(self.tabix.fetch(parser=pysam.asTuple())): + self.assertEqual(self.compare[x], list(r)) + c = list(r) + e = list(r) + for y in range(len(r)): + r[y] = None + c[y] = None + e[y] = "" + self.assertEqual(c, list(r)) + self.assertEqual("\t".join(e), str(r)) + + def testIteratorCompressed(self): + '''test iteration from compressed file.''' + with gzip.open(self.filename) as infile: + for x, r in enumerate(pysam.tabix_iterator( + infile, pysam.asTuple())): + self.assertEqual(self.compare[x], list(r)) + self.assertEqual(len(self.compare[x]), len(r)) + + # test indexing + for c in range(0, len(r)): + self.assertEqual(self.compare[x][c], r[c]) + + # test slicing access + for c in range(0, len(r) - 1): + for cc in range(c + 1, len(r)): + self.assertEqual(self.compare[x][c:cc], + r[c:cc]) + + def testIteratorUncompressed(self): + '''test iteration from uncompressed file.''' + tmpfilename = 'tmp_testIteratorUncompressed' + with gzip.open(self.filename, "rb") as infile, \ + open(tmpfilename, "wb") as outfile: + outfile.write(infile.read()) + + with open(tmpfilename) as infile: + for x, r in enumerate(pysam.tabix_iterator( + infile, pysam.asTuple())): + self.assertEqual(self.compare[x], list(r)) + self.assertEqual(len(self.compare[x]), len(r)) + + # test indexing + for c in range(0, len(r)): + self.assertEqual(self.compare[x][c], r[c]) + + # test slicing access + for c in range(0, len(r) - 1): + for cc in range(c + 1, len(r)): + self.assertEqual(self.compare[x][c:cc], + r[c:cc]) + + os.unlink(tmpfilename) + + def testCopy(self): + a = self.tabix.fetch(parser=pysam.asTuple()).next() + b = copy.copy(a) + self.assertEqual(a, b) + + a = self.tabix.fetch(parser=pysam.asGTF()).next() + b = copy.copy(a) + self.assertEqual(a, b) + + +class TestGTF(TestParser): + + parser = pysam.asGTF + + def build_attribute_string(self, d): + """build attribute string from dictionary d""" + s = "; ".join(["{} \"{}\"".format(x, y) for (x, y) in d.items()]) + ";" + # remove quotes around numeric values + s = re.sub(r'"(\d+)"', r'\1', s) + return s + + def testRead(self): + + for x, r in enumerate(self.tabix.fetch(parser=self.parser())): + c = self.compare[x] + self.assertEqual(len(c), len(r)) + self.assertEqual(list(c), list(r)) + self.assertEqual(c, str(r).split("\t")) + self.assertTrue(r.gene_id.startswith("ENSG")) + if r.feature != 'gene': + self.assertTrue(r.transcript_id.startswith("ENST")) + self.assertEqual(c[0], r.contig) + self.assertEqual("\t".join(map(str, c)), + str(r)) + + def test_setting_fields(self): + + r = self.tabix.fetch(parser=self.parser()).next() + + r.contig = r.contig + "_test_contig" + r.source = r.source + "_test_source" + r.feature = r.feature + "_test_feature" + r.start += 10 + r.end += 10 + r.score = 20 + r.strand = "+" + r.frame = 0 + r.attributes = 'gene_id "0001";' + r.transcript_id = "0002" + sr = str(r) + self.assertTrue("_test_contig" in sr) + self.assertTrue("_test_source" in sr) + self.assertTrue("_test_feature" in sr) + self.assertTrue("gene_id \"0001\"" in sr) + self.assertTrue("transcript_id \"0002\"" in sr) + + def test_setAttribute_makes_changes(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.setAttribute("transcript_id", "abcd") + sr = str(r) + self.assertEqual(r.transcript_id, "abcd") + self.assertTrue("transcript_id \"abcd\"" in sr) + + def test_added_attribute_is_output(self): + r = self.tabix.fetch(parser=self.parser()).next() + + r.new_int_attribute = 12 + self.assertTrue("new_int_attribute 12" in str(r).split("\t")[8]) + + r.new_float_attribute = 12.0 + self.assertTrue("new_float_attribute 12.0" in str(r).split("\t")[8]) + + r.new_text_attribute = "abc" + self.assertTrue("new_text_attribute \"abc\"" in str(r).split("\t")[8]) + + def test_setting_start_is_one_based(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.start = 1800 + self.assertEqual(r.start, 1800) + self.assertEqual(str(r).split("\t")[3], "1801") + + def test_setting_end_is_one_based(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.end = 2100 + self.assertEqual(r.end, 2100) + self.assertEqual(str(r).split("\t")[4], "2100") + + def test_setting_frame_to_none_produces_dot(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.frame = None + self.assertEqual(str(r).split("\t")[7], ".") + + r.frame = 2 + self.assertEqual(str(r).split("\t")[7], "2") + + r = self.tabix.fetch(parser=self.parser()).next() + r.frame = "." + self.assertEqual(r.frame, None) + self.assertEqual(str(r).split("\t")[7], ".") + + def test_setting_source_to_none_produces_dot(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.source = None + self.assertEqual(str(r).split("\t")[1], ".") + + r.source = "source" + self.assertEqual(str(r).split("\t")[1], "source") + + r = self.tabix.fetch(parser=self.parser()).next() + r.source = "." + self.assertEqual(r.source, None) + self.assertEqual(str(r).split("\t")[1], ".") + + def test_setting_feature_to_none_produces_dot(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.feature = None + self.assertEqual(str(r).split("\t")[2], ".") + + r.feature = "feature" + self.assertEqual(str(r).split("\t")[2], "feature") + + r = self.tabix.fetch(parser=self.parser()).next() + r.feature = "." + self.assertEqual(r.feature, None) + self.assertEqual(str(r).split("\t")[2], ".") + + def test_setting_strand_to_none_produces_dot(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.strand = None + self.assertEqual(str(r).split("\t")[6], ".") + + r.strand = "-" + self.assertEqual(str(r).split("\t")[6], "-") + + r = self.tabix.fetch(parser=self.parser()).next() + r.strand = "." + self.assertEqual(r.strand, None) + self.assertEqual(str(r).split("\t")[6], ".") + + def test_setting_score_to_none_produces_dot(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.score = None + self.assertEqual(str(r).split("\t")[5], ".") + + r.score = 12.0 + self.assertEqual(str(r).split("\t")[5], "12.0") + + r.score = -12.0 + self.assertEqual(str(r).split("\t")[5], "-12.0") + + r = self.tabix.fetch(parser=self.parser()).next() + r.score = "." + self.assertEqual(r.score, None) + self.assertEqual(str(r).split("\t")[5], ".") + + r.score = 12 + self.assertEqual(str(r).split("\t")[5], "12") + + r.score = -12 + self.assertEqual(str(r).split("\t")[5], "-12") + + def test_asdict_contains_attributes(self): + r = self.tabix.fetch(parser=self.parser()).next() + d = r.to_dict() + c = self.compare[0] + s = self.build_attribute_string(d) + self.assertEqual(s, c[8]) + + def test_asdict_can_be_modified(self): + r = self.tabix.fetch(parser=self.parser()).next() + d = r.to_dict() + d["gene_id"] = "new_gene_id" + self.assertTrue("gene_id \"new_gene_id\"", str(r)) + + +class TestGFF3(TestGTF): + + parser = pysam.asGFF3 + filename = os.path.join(TABIX_DATADIR, "example.gff3.gz") + + def build_attribute_string(self, d): + """build attribute string from dictionary d""" + s = ";".join(["{}={}".format(x, y) for (x, y) in d.items()]) + ";" + return s + + def build_attribute_string(self, d): + """build attribute string from dictionary d""" + s = ";".join(["{}={}".format(x, y) for (x, y) in d.items()]) + ";" + return s + + def testRead(self): + for x, r in enumerate(self.tabix.fetch(parser=self.parser())): + c = self.compare[x] + self.assertEqual(len(c), len(r)) + self.assertEqual(list(c), list(r)) + self.assertEqual(c, str(r).split("\t")) + self.assertEqual(c[0], r.contig) + self.assertEqual("\t".join(map(str, c)), + str(r)) + self.assertTrue(r.ID.startswith("MI00")) + + def test_setting_fields(self): + + for r in self.tabix.fetch(parser=self.parser()): + r.contig = r.contig + "_test_contig" + r.source = "test_source" + r.feature = "test_feature" + r.start += 10 + r.end += 10 + r.score = 20 + r.strand = "+" + r.frame = 0 + r.ID = "test" + sr = str(r) + self.assertTrue("test_contig" in sr) + self.assertTrue("test_source" in sr) + self.assertTrue("test_feature" in sr) + self.assertTrue("ID=test" in sr) + + def test_setAttribute_makes_changes(self): + + r = self.tabix.fetch(parser=self.parser()).next() + r.setAttribute("transcript_id", "abcd") + sr = str(r) + self.assertEqual(r.transcript_id, "abcd") + self.assertTrue("transcript_id=abcd" in sr) + + def test_added_attribute_is_output(self): + r = self.tabix.fetch(parser=self.parser()).next() + + r.new_int_attribute = 12 + self.assertTrue("new_int_attribute=12" in str(r).split("\t")[8]) + + r.new_float_attribute = 12.0 + self.assertTrue("new_float_attribute=12.0" in str(r).split("\t")[8]) + + r.new_text_attribute = "abc" + self.assertTrue("new_text_attribute=abc" in str(r).split("\t")[8]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_samtools_python.py b/tests/test_samtools_python.py new file mode 100644 index 0000000..3a9d841 --- /dev/null +++ b/tests/test_samtools_python.py @@ -0,0 +1,50 @@ +import pysam +import os +from TestUtils import make_data_files, BAM_DATADIR + + +def setUpModule(): + make_data_files(BAM_DATADIR) + + +def test_idxstats_parse_split_lines(): + bam_filename = os.path.join(BAM_DATADIR, "ex2.bam") + # Test pysam 0.8.X style output, which returns a list of lines + lines = pysam.idxstats(bam_filename, split_lines=True) + for line in lines: + _seqname, _seqlen, nmapped, _nunmapped = line.split() + + +def test_bedcov_split_lines(): + bam_filename = os.path.join(BAM_DATADIR, "ex1.bam") + bed_filename = os.path.join(BAM_DATADIR, "ex1.bed") + # Test pysam 0.8.X style output, which returns a list of lines + lines = pysam.bedcov(bed_filename, bam_filename, split_lines=True) + for line in lines: + fields = line.split('\t') + assert len(fields) in [4, 5], \ + ("bedcov should give tab delimited output with 4 or 5 fields. " + "Split line (%s) gives %d fields." % (fields, len(fields))) + + +def test_idxstats_parse(): + bam_filename = os.path.join(BAM_DATADIR, "ex2.bam") + # Test pysam 0.9.X style output, which returns a string that needs to be split by \n + idxstats_string = pysam.idxstats(bam_filename, split_lines=False) + lines = idxstats_string.splitlines() + for line in lines: + splt = line.split("\t") + _seqname, _seqlen, nmapped, _nunmapped = splt + + +def test_bedcov(): + bam_filename = os.path.join(BAM_DATADIR, "ex1.bam") + bed_filename = os.path.join(BAM_DATADIR, "ex1.bed") + # Test pysam 0.9.X style output, which returns a string that needs to be split by \n + bedcov_string = pysam.bedcov(bed_filename, bam_filename, split_lines=False) + lines = bedcov_string.splitlines() + for line in lines: + fields = line.split('\t') + assert len(fields) in [4, 5], \ + ("bedcov should give tab delimited output with 4 or 5 fields. " + "Split line (%s) gives %d fields." % (fields, len(fields))) -- 2.30.2